[{"data":1,"prerenderedAt":373669},["ShallowReactive",2],{"article-meta":3,"blog":1683,"content-query-Hnxrnnuecc":373148},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"img":10,"date":11,"tag":12,"body":13,"_type":1677,"_id":1678,"_source":1679,"_file":1680,"_stem":1681,"_extension":1682},"/blog/10_essential_tools_for_effective_saas_integration_solutions","blog",false,"","10 Essential Tools for Effective SaaS Integration Solutions","SaaS integrations are no longer optional infrastructure. They are core to how modern products deliver value.","https://s3.us-east-2.amazonaws.com/unified-article-images/10_essential_tools_for_effective_saas_integration_solutions-icon.png","2026-03-09T19:47:00.000Z","Product",{"type":14,"children":15,"toc":1628},"root",[16,24,28,38,42,55,67,74,79,109,114,144,149,172,177,183,194,199,204,238,245,268,274,279,332,337,355,361,373,378,411,417,435,441,459,465,470,474,497,503,521,526,544,550,555,559,592,598,616,622,640,646,651,655,688,694,717,723,728,732,765,771,800,805,811,816,821,844,848,881,887,892,910,916,921,925,948,954,972,978,983,988,994,999,1003,1026,1031,1049,1055,1060,1078,1083,1101,1107,1112,1116,1139,1144,1149,1167,1173,1178,1206,1211,1216,1227,1233,1238,1243,1271,1276,1299,1304,1310,1315,1368,1374,1379,1402,1408,1413,1418,1423,1428,1446,1451,1455,1473,1478,1484,1489,1494,1499,1522,1527,1550,1556,1561,1566,1589,1594,1605,1617],{"type":17,"tag":18,"props":19,"children":21},"element","h1",{"id":20},"_10-essential-tools-for-effective-saas-integration-solutions",[22],{"type":23,"value":8},"text",{"type":17,"tag":25,"props":26,"children":27},"hr",{},[],{"type":17,"tag":29,"props":30,"children":31},"p",{},[32],{"type":17,"tag":33,"props":34,"children":35},"em",{},[36],{"type":23,"value":37},"March 9, 2026",{"type":17,"tag":29,"props":39,"children":40},{},[41],{"type":23,"value":9},{"type":17,"tag":29,"props":43,"children":44},{},[45,47,53],{"type":23,"value":46},"But most teams approach integrations the wrong way. They think in terms of APIs or connectors instead of thinking in terms of ",{"type":17,"tag":48,"props":49,"children":50},"strong",{},[51],{"type":23,"value":52},"integration architecture",{"type":23,"value":54},".",{"type":17,"tag":29,"props":56,"children":57},{},[58,60,65],{"type":23,"value":59},"This article breaks down the ",{"type":17,"tag":48,"props":61,"children":62},{},[63],{"type":23,"value":64},"essential tools and categories you need to build, scale, and maintain SaaS integrations",{"type":23,"value":66},", and where each approach fits.",{"type":17,"tag":68,"props":69,"children":71},"h2",{"id":70},"the-saas-integration-problem",[72],{"type":23,"value":73},"The SaaS integration problem",{"type":17,"tag":29,"props":75,"children":76},{},[77],{"type":23,"value":78},"The average SaaS product connects to:",{"type":17,"tag":80,"props":81,"children":82},"ul",{},[83,89,94,99,104],{"type":17,"tag":84,"props":85,"children":86},"li",{},[87],{"type":23,"value":88},"CRMs",{"type":17,"tag":84,"props":90,"children":91},{},[92],{"type":23,"value":93},"HR systems",{"type":17,"tag":84,"props":95,"children":96},{},[97],{"type":23,"value":98},"file storage",{"type":17,"tag":84,"props":100,"children":101},{},[102],{"type":23,"value":103},"communication tools",{"type":17,"tag":84,"props":105,"children":106},{},[107],{"type":23,"value":108},"analytics platforms",{"type":17,"tag":29,"props":110,"children":111},{},[112],{"type":23,"value":113},"Each one introduces:",{"type":17,"tag":80,"props":115,"children":116},{},[117,122,127,139],{"type":17,"tag":84,"props":118,"children":119},{},[120],{"type":23,"value":121},"different authentication flows",{"type":17,"tag":84,"props":123,"children":124},{},[125],{"type":23,"value":126},"different data models",{"type":17,"tag":84,"props":128,"children":129},{},[130,132],{"type":23,"value":131},"different ",{"type":17,"tag":133,"props":134,"children":136},"a",{"href":135},"/docs/reference/rate_limits#rate-limits",[137],{"type":23,"value":138},"rate limits",{"type":17,"tag":84,"props":140,"children":141},{},[142],{"type":23,"value":143},"different maintenance cycles",{"type":17,"tag":29,"props":145,"children":146},{},[147],{"type":23,"value":148},"This leads to:",{"type":17,"tag":80,"props":150,"children":151},{},[152,157,162,167],{"type":17,"tag":84,"props":153,"children":154},{},[155],{"type":23,"value":156},"slow development",{"type":17,"tag":84,"props":158,"children":159},{},[160],{"type":23,"value":161},"brittle integrations",{"type":17,"tag":84,"props":163,"children":164},{},[165],{"type":23,"value":166},"constant maintenance",{"type":17,"tag":84,"props":168,"children":169},{},[170],{"type":23,"value":171},"poor data consistency",{"type":17,"tag":29,"props":173,"children":174},{},[175],{"type":23,"value":176},"The solution is not one tool. It's a stack.",{"type":17,"tag":68,"props":178,"children":180},{"id":179},"_1-unified-apis-core-integration-layer",[181],{"type":23,"value":182},"1. Unified APIs (core integration layer)",{"type":17,"tag":29,"props":184,"children":185},{},[186,188,193],{"type":23,"value":187},"Unified APIs are the fastest way to build ",{"type":17,"tag":48,"props":189,"children":190},{},[191],{"type":23,"value":192},"customer-facing integrations at scale",{"type":23,"value":54},{"type":17,"tag":29,"props":195,"children":196},{},[197],{"type":23,"value":198},"Instead of integrating with 10–50 APIs individually, you integrate once and access all of them through a standardized interface.",{"type":17,"tag":29,"props":200,"children":201},{},[202],{"type":23,"value":203},"Platforms include:",{"type":17,"tag":80,"props":205,"children":206},{},[207,218,228],{"type":17,"tag":84,"props":208,"children":209},{},[210],{"type":17,"tag":133,"props":211,"children":215},{"href":212,"rel":213},"https://unified.to/",[214],"nofollow",[216],{"type":23,"value":217},"Unified.to",{"type":17,"tag":84,"props":219,"children":220},{},[221],{"type":17,"tag":133,"props":222,"children":225},{"href":223,"rel":224},"https://merge.dev/",[214],[226],{"type":23,"value":227},"Merge",{"type":17,"tag":84,"props":229,"children":230},{},[231],{"type":17,"tag":133,"props":232,"children":235},{"href":233,"rel":234},"https://apideck.com/",[214],[236],{"type":23,"value":237},"Apideck",{"type":17,"tag":239,"props":240,"children":242},"h3",{"id":241},"why-this-layer-matters",[243],{"type":23,"value":244},"Why this layer matters",{"type":17,"tag":80,"props":246,"children":247},{},[248,253,258,263],{"type":17,"tag":84,"props":249,"children":250},{},[251],{"type":23,"value":252},"single integration → many platforms",{"type":17,"tag":84,"props":254,"children":255},{},[256],{"type":23,"value":257},"normalized data models",{"type":17,"tag":84,"props":259,"children":260},{},[261],{"type":23,"value":262},"consistent authentication",{"type":17,"tag":84,"props":264,"children":265},{},[266],{"type":23,"value":267},"reduced maintenance",{"type":17,"tag":239,"props":269,"children":271},{"id":270},"where-unifiedto-fits",[272],{"type":23,"value":273},"Where Unified.to fits",{"type":17,"tag":29,"props":275,"children":276},{},[277],{"type":23,"value":278},"Unified.to is built differently from most unified APIs.",{"type":17,"tag":80,"props":280,"children":281},{},[282,292,302,310,318],{"type":17,"tag":84,"props":283,"children":284},{},[285,290],{"type":17,"tag":48,"props":286,"children":287},{},[288],{"type":23,"value":289},"real-time, pass-through architecture",{"type":23,"value":291}," (no caching, no stale data)",{"type":17,"tag":84,"props":293,"children":294},{},[295,300],{"type":17,"tag":48,"props":296,"children":297},{},[298],{"type":23,"value":299},"zero-storage design",{"type":23,"value":301}," (no customer data stored at rest)",{"type":17,"tag":84,"props":303,"children":304},{},[305],{"type":17,"tag":48,"props":306,"children":307},{},[308],{"type":23,"value":309},"420+ integrations across 25 categories",{"type":17,"tag":84,"props":311,"children":312},{},[313],{"type":17,"tag":48,"props":314,"children":315},{},[316],{"type":23,"value":317},"read + write support across objects",{"type":17,"tag":84,"props":319,"children":320},{},[321],{"type":17,"tag":48,"props":322,"children":323},{},[324,330],{"type":17,"tag":133,"props":325,"children":327},{"href":326},"/mcp",[328],{"type":23,"value":329},"MCP",{"type":23,"value":331}," support for AI agents",{"type":17,"tag":29,"props":333,"children":334},{},[335],{"type":23,"value":336},"This makes it a strong fit for:",{"type":17,"tag":80,"props":338,"children":339},{},[340,345,350],{"type":17,"tag":84,"props":341,"children":342},{},[343],{"type":23,"value":344},"AI-native SaaS products",{"type":17,"tag":84,"props":346,"children":347},{},[348],{"type":23,"value":349},"real-time analytics and automation",{"type":17,"tag":84,"props":351,"children":352},{},[353],{"type":23,"value":354},"products with strict compliance requirements",{"type":17,"tag":68,"props":356,"children":358},{"id":357},"_2-ipaas-platforms-internal-automation-layer",[359],{"type":23,"value":360},"2. iPaaS platforms (internal automation layer)",{"type":17,"tag":29,"props":362,"children":363},{},[364,366,371],{"type":23,"value":365},"iPaaS tools are designed for ",{"type":17,"tag":48,"props":367,"children":368},{},[369],{"type":23,"value":370},"internal workflows",{"type":23,"value":372},", not product integrations.",{"type":17,"tag":29,"props":374,"children":375},{},[376],{"type":23,"value":377},"Examples:",{"type":17,"tag":80,"props":379,"children":380},{},[381,391,401],{"type":17,"tag":84,"props":382,"children":383},{},[384],{"type":17,"tag":133,"props":385,"children":388},{"href":386,"rel":387},"https://www.workato.com/",[214],[389],{"type":23,"value":390},"Workato",{"type":17,"tag":84,"props":392,"children":393},{},[394],{"type":17,"tag":133,"props":395,"children":398},{"href":396,"rel":397},"https://www.mulesoft.com/",[214],[399],{"type":23,"value":400},"MuleSoft",{"type":17,"tag":84,"props":402,"children":403},{},[404],{"type":17,"tag":133,"props":405,"children":408},{"href":406,"rel":407},"https://boomi.com/",[214],[409],{"type":23,"value":410},"Boomi",{"type":17,"tag":239,"props":412,"children":414},{"id":413},"what-they-do-well",[415],{"type":23,"value":416},"What they do well",{"type":17,"tag":80,"props":418,"children":419},{},[420,425,430],{"type":17,"tag":84,"props":421,"children":422},{},[423],{"type":23,"value":424},"workflow automation",{"type":17,"tag":84,"props":426,"children":427},{},[428],{"type":23,"value":429},"internal system connectivity",{"type":17,"tag":84,"props":431,"children":432},{},[433],{"type":23,"value":434},"ETL and data transformation",{"type":17,"tag":239,"props":436,"children":438},{"id":437},"limitations",[439],{"type":23,"value":440},"Limitations",{"type":17,"tag":80,"props":442,"children":443},{},[444,449,454],{"type":17,"tag":84,"props":445,"children":446},{},[447],{"type":23,"value":448},"not built for embedding into your product",{"type":17,"tag":84,"props":450,"children":451},{},[452],{"type":23,"value":453},"low-code UX slows down developers",{"type":17,"tag":84,"props":455,"children":456},{},[457],{"type":23,"value":458},"harder to scale across many customer integrations",{"type":17,"tag":68,"props":460,"children":462},{"id":461},"_3-automation-tools-quick-workflows",[463],{"type":23,"value":464},"3. Automation tools (quick workflows)",{"type":17,"tag":29,"props":466,"children":467},{},[468],{"type":23,"value":469},"These are lightweight tools for fast automation.",{"type":17,"tag":29,"props":471,"children":472},{},[473],{"type":23,"value":377},{"type":17,"tag":80,"props":475,"children":476},{},[477,487],{"type":17,"tag":84,"props":478,"children":479},{},[480],{"type":17,"tag":133,"props":481,"children":484},{"href":482,"rel":483},"https://zapier.com/",[214],[485],{"type":23,"value":486},"Zapier",{"type":17,"tag":84,"props":488,"children":489},{},[490],{"type":17,"tag":133,"props":491,"children":494},{"href":492,"rel":493},"https://www.make.com/",[214],[495],{"type":23,"value":496},"Make",{"type":17,"tag":239,"props":498,"children":500},{"id":499},"best-for",[501],{"type":23,"value":502},"Best for",{"type":17,"tag":80,"props":504,"children":505},{},[506,511,516],{"type":17,"tag":84,"props":507,"children":508},{},[509],{"type":23,"value":510},"small teams",{"type":17,"tag":84,"props":512,"children":513},{},[514],{"type":23,"value":515},"simple workflows",{"type":17,"tag":84,"props":517,"children":518},{},[519],{"type":23,"value":520},"prototyping",{"type":17,"tag":239,"props":522,"children":524},{"id":523},"limitations-1",[525],{"type":23,"value":440},{"type":17,"tag":80,"props":527,"children":528},{},[529,534,539],{"type":17,"tag":84,"props":530,"children":531},{},[532],{"type":23,"value":533},"not reliable for production SaaS integrations",{"type":17,"tag":84,"props":535,"children":536},{},[537],{"type":23,"value":538},"limited control and observability",{"type":17,"tag":84,"props":540,"children":541},{},[542],{"type":23,"value":543},"difficult to scale",{"type":17,"tag":68,"props":545,"children":547},{"id":546},"_4-embedded-ipaas-customer-facing-workflows",[548],{"type":23,"value":549},"4. Embedded iPaaS (customer-facing workflows)",{"type":17,"tag":29,"props":551,"children":552},{},[553],{"type":23,"value":554},"Embedded iPaaS tools let SaaS companies embed integration workflows into their product.",{"type":17,"tag":29,"props":556,"children":557},{},[558],{"type":23,"value":377},{"type":17,"tag":80,"props":560,"children":561},{},[562,572,582],{"type":17,"tag":84,"props":563,"children":564},{},[565],{"type":17,"tag":133,"props":566,"children":569},{"href":567,"rel":568},"https://tray.io/",[214],[570],{"type":23,"value":571},"Tray.io",{"type":17,"tag":84,"props":573,"children":574},{},[575],{"type":17,"tag":133,"props":576,"children":579},{"href":577,"rel":578},"https://useparagon.com/",[214],[580],{"type":23,"value":581},"Paragon",{"type":17,"tag":84,"props":583,"children":584},{},[585],{"type":17,"tag":133,"props":586,"children":589},{"href":587,"rel":588},"https://prismatic.io/",[214],[590],{"type":23,"value":591},"Prismatic",{"type":17,"tag":239,"props":593,"children":595},{"id":594},"what-they-solve",[596],{"type":23,"value":597},"What they solve",{"type":17,"tag":80,"props":599,"children":600},{},[601,606,611],{"type":17,"tag":84,"props":602,"children":603},{},[604],{"type":23,"value":605},"customer-configurable workflows",{"type":17,"tag":84,"props":607,"children":608},{},[609],{"type":23,"value":610},"UI-based integrations",{"type":17,"tag":84,"props":612,"children":613},{},[614],{"type":23,"value":615},"embedded automation",{"type":17,"tag":239,"props":617,"children":619},{"id":618},"tradeoffs",[620],{"type":23,"value":621},"Tradeoffs",{"type":17,"tag":80,"props":623,"children":624},{},[625,630,635],{"type":17,"tag":84,"props":626,"children":627},{},[628],{"type":23,"value":629},"still require engineering involvement",{"type":17,"tag":84,"props":631,"children":632},{},[633],{"type":23,"value":634},"limited API depth",{"type":17,"tag":84,"props":636,"children":637},{},[638],{"type":23,"value":639},"complexity increases with scale",{"type":17,"tag":68,"props":641,"children":643},{"id":642},"_5-api-gateways-control-and-security-layer",[644],{"type":23,"value":645},"5. API gateways (control and security layer)",{"type":17,"tag":29,"props":647,"children":648},{},[649],{"type":23,"value":650},"API gateways sit between your app and external APIs.",{"type":17,"tag":29,"props":652,"children":653},{},[654],{"type":23,"value":377},{"type":17,"tag":80,"props":656,"children":657},{},[658,668,678],{"type":17,"tag":84,"props":659,"children":660},{},[661],{"type":17,"tag":133,"props":662,"children":665},{"href":663,"rel":664},"https://konghq.com/",[214],[666],{"type":23,"value":667},"Kong",{"type":17,"tag":84,"props":669,"children":670},{},[671],{"type":17,"tag":133,"props":672,"children":675},{"href":673,"rel":674},"https://aws.amazon.com/api-gateway/",[214],[676],{"type":23,"value":677},"AWS API Gateway",{"type":17,"tag":84,"props":679,"children":680},{},[681],{"type":17,"tag":133,"props":682,"children":685},{"href":683,"rel":684},"https://cloud.google.com/endpoints",[214],[686],{"type":23,"value":687},"Google Cloud Endpoints",{"type":17,"tag":239,"props":689,"children":691},{"id":690},"what-they-provide",[692],{"type":23,"value":693},"What they provide",{"type":17,"tag":80,"props":695,"children":696},{},[697,702,707,712],{"type":17,"tag":84,"props":698,"children":699},{},[700],{"type":23,"value":701},"rate limiting",{"type":17,"tag":84,"props":703,"children":704},{},[705],{"type":23,"value":706},"authentication enforcement",{"type":17,"tag":84,"props":708,"children":709},{},[710],{"type":23,"value":711},"request routing",{"type":17,"tag":84,"props":713,"children":714},{},[715],{"type":23,"value":716},"monitoring",{"type":17,"tag":68,"props":718,"children":720},{"id":719},"_6-identity-and-oauth-management",[721],{"type":23,"value":722},"6. Identity and OAuth management",{"type":17,"tag":29,"props":724,"children":725},{},[726],{"type":23,"value":727},"Authentication is one of the hardest parts of integrations.",{"type":17,"tag":29,"props":729,"children":730},{},[731],{"type":23,"value":377},{"type":17,"tag":80,"props":733,"children":734},{},[735,745,755],{"type":17,"tag":84,"props":736,"children":737},{},[738],{"type":17,"tag":133,"props":739,"children":742},{"href":740,"rel":741},"https://auth0.com/",[214],[743],{"type":23,"value":744},"Auth0",{"type":17,"tag":84,"props":746,"children":747},{},[748],{"type":17,"tag":133,"props":749,"children":752},{"href":750,"rel":751},"https://www.okta.com/",[214],[753],{"type":23,"value":754},"Okta",{"type":17,"tag":84,"props":756,"children":757},{},[758],{"type":17,"tag":133,"props":759,"children":762},{"href":760,"rel":761},"https://aws.amazon.com/secrets-manager/",[214],[763],{"type":23,"value":764},"AWS Secrets Manager",{"type":17,"tag":239,"props":766,"children":768},{"id":767},"what-they-handle",[769],{"type":23,"value":770},"What they handle",{"type":17,"tag":80,"props":772,"children":773},{},[774,785,790,795],{"type":17,"tag":84,"props":775,"children":776},{},[777,783],{"type":17,"tag":133,"props":778,"children":780},{"href":779},"/embeddedauth",[781],{"type":23,"value":782},"OAuth",{"type":23,"value":784}," flows",{"type":17,"tag":84,"props":786,"children":787},{},[788],{"type":23,"value":789},"token storage",{"type":17,"tag":84,"props":791,"children":792},{},[793],{"type":23,"value":794},"credential rotation",{"type":17,"tag":84,"props":796,"children":797},{},[798],{"type":23,"value":799},"user identity",{"type":17,"tag":29,"props":801,"children":802},{},[803],{"type":23,"value":804},"Without this layer, integrations become unreliable fast.",{"type":17,"tag":68,"props":806,"children":808},{"id":807},"_7-observability-and-monitoring-tools",[809],{"type":23,"value":810},"7. Observability and monitoring tools",{"type":17,"tag":29,"props":812,"children":813},{},[814],{"type":23,"value":815},"Integrations fail. Constantly.",{"type":17,"tag":29,"props":817,"children":818},{},[819],{"type":23,"value":820},"You need visibility into:",{"type":17,"tag":80,"props":822,"children":823},{},[824,829,834,839],{"type":17,"tag":84,"props":825,"children":826},{},[827],{"type":23,"value":828},"API calls",{"type":17,"tag":84,"props":830,"children":831},{},[832],{"type":23,"value":833},"errors",{"type":17,"tag":84,"props":835,"children":836},{},[837],{"type":23,"value":838},"latency",{"type":17,"tag":84,"props":840,"children":841},{},[842],{"type":23,"value":843},"webhook delivery",{"type":17,"tag":29,"props":845,"children":846},{},[847],{"type":23,"value":377},{"type":17,"tag":80,"props":849,"children":850},{},[851,861,871],{"type":17,"tag":84,"props":852,"children":853},{},[854],{"type":17,"tag":133,"props":855,"children":858},{"href":856,"rel":857},"https://www.datadoghq.com/",[214],[859],{"type":23,"value":860},"Datadog",{"type":17,"tag":84,"props":862,"children":863},{},[864],{"type":17,"tag":133,"props":865,"children":868},{"href":866,"rel":867},"https://grafana.com/",[214],[869],{"type":23,"value":870},"Grafana",{"type":17,"tag":84,"props":872,"children":873},{},[874],{"type":17,"tag":133,"props":875,"children":878},{"href":876,"rel":877},"https://newrelic.com/",[214],[879],{"type":23,"value":880},"New Relic",{"type":17,"tag":239,"props":882,"children":884},{"id":883},"why-this-matters",[885],{"type":23,"value":886},"Why this matters",{"type":17,"tag":29,"props":888,"children":889},{},[890],{"type":23,"value":891},"Without observability:",{"type":17,"tag":80,"props":893,"children":894},{},[895,900,905],{"type":17,"tag":84,"props":896,"children":897},{},[898],{"type":23,"value":899},"debugging is slow",{"type":17,"tag":84,"props":901,"children":902},{},[903],{"type":23,"value":904},"issues go unnoticed",{"type":17,"tag":84,"props":906,"children":907},{},[908],{"type":23,"value":909},"customer trust drops",{"type":17,"tag":68,"props":911,"children":913},{"id":912},"_8-data-pipelines-and-storage-optional-layer",[914],{"type":23,"value":915},"8. Data pipelines and storage (optional layer)",{"type":17,"tag":29,"props":917,"children":918},{},[919],{"type":23,"value":920},"Some teams use ETL tools for analytics or warehousing.",{"type":17,"tag":29,"props":922,"children":923},{},[924],{"type":23,"value":377},{"type":17,"tag":80,"props":926,"children":927},{},[928,938],{"type":17,"tag":84,"props":929,"children":930},{},[931],{"type":17,"tag":133,"props":932,"children":935},{"href":933,"rel":934},"https://www.fivetran.com/",[214],[936],{"type":23,"value":937},"Fivetran",{"type":17,"tag":84,"props":939,"children":940},{},[941],{"type":17,"tag":133,"props":942,"children":945},{"href":943,"rel":944},"https://airbyte.com/",[214],[946],{"type":23,"value":947},"Airbyte",{"type":17,"tag":239,"props":949,"children":951},{"id":950},"use-cases",[952],{"type":23,"value":953},"Use cases",{"type":17,"tag":80,"props":955,"children":956},{},[957,962,967],{"type":17,"tag":84,"props":958,"children":959},{},[960],{"type":23,"value":961},"analytics pipelines",{"type":17,"tag":84,"props":963,"children":964},{},[965],{"type":23,"value":966},"reporting",{"type":17,"tag":84,"props":968,"children":969},{},[970],{"type":23,"value":971},"data warehousing",{"type":17,"tag":239,"props":973,"children":975},{"id":974},"tradeoff",[976],{"type":23,"value":977},"Tradeoff",{"type":17,"tag":29,"props":979,"children":980},{},[981],{"type":23,"value":982},"These introduce latency and storage complexity.",{"type":17,"tag":29,"props":984,"children":985},{},[986],{"type":23,"value":987},"Real-time products often avoid this layer entirely.",{"type":17,"tag":68,"props":989,"children":991},{"id":990},"_9-ai-integration-layers-emerging-category",[992],{"type":23,"value":993},"9. AI integration layers (emerging category)",{"type":17,"tag":29,"props":995,"children":996},{},[997],{"type":23,"value":998},"AI agents require structured access to SaaS APIs.",{"type":17,"tag":29,"props":1000,"children":1001},{},[1002],{"type":23,"value":377},{"type":17,"tag":80,"props":1004,"children":1005},{},[1006,1016],{"type":17,"tag":84,"props":1007,"children":1008},{},[1009],{"type":17,"tag":133,"props":1010,"children":1013},{"href":1011,"rel":1012},"https://composio.dev/",[214],[1014],{"type":23,"value":1015},"Composio",{"type":17,"tag":84,"props":1017,"children":1018},{},[1019],{"type":17,"tag":133,"props":1020,"children":1023},{"href":1021,"rel":1022},"https://www.nango.dev/",[214],[1024],{"type":23,"value":1025},"Nango",{"type":17,"tag":239,"props":1027,"children":1029},{"id":1028},"what-they-provide-1",[1030],{"type":23,"value":693},{"type":17,"tag":80,"props":1032,"children":1033},{},[1034,1039,1044],{"type":17,"tag":84,"props":1035,"children":1036},{},[1037],{"type":23,"value":1038},"tool calling",{"type":17,"tag":84,"props":1040,"children":1041},{},[1042],{"type":23,"value":1043},"API abstraction",{"type":17,"tag":84,"props":1045,"children":1046},{},[1047],{"type":23,"value":1048},"agent execution layers",{"type":17,"tag":239,"props":1050,"children":1052},{"id":1051},"where-unified-fits",[1053],{"type":23,"value":1054},"Where Unified fits",{"type":17,"tag":29,"props":1056,"children":1057},{},[1058],{"type":23,"value":1059},"Unified.to supports this through:",{"type":17,"tag":80,"props":1061,"children":1062},{},[1063,1068,1073],{"type":17,"tag":84,"props":1064,"children":1065},{},[1066],{"type":23,"value":1067},"MCP server",{"type":17,"tag":84,"props":1069,"children":1070},{},[1071],{"type":23,"value":1072},"real-time API access",{"type":17,"tag":84,"props":1074,"children":1075},{},[1076],{"type":23,"value":1077},"structured data models",{"type":17,"tag":29,"props":1079,"children":1080},{},[1081],{"type":23,"value":1082},"This enables agents to:",{"type":17,"tag":80,"props":1084,"children":1085},{},[1086,1091,1096],{"type":17,"tag":84,"props":1087,"children":1088},{},[1089],{"type":23,"value":1090},"read live SaaS data",{"type":17,"tag":84,"props":1092,"children":1093},{},[1094],{"type":23,"value":1095},"take action across systems",{"type":17,"tag":84,"props":1097,"children":1098},{},[1099],{"type":23,"value":1100},"avoid stale data issues",{"type":17,"tag":68,"props":1102,"children":1104},{"id":1103},"_10-developer-tooling-and-sdks",[1105],{"type":23,"value":1106},"10. Developer tooling and SDKs",{"type":17,"tag":29,"props":1108,"children":1109},{},[1110],{"type":23,"value":1111},"Finally, you need tooling to actually build and test integrations.",{"type":17,"tag":29,"props":1113,"children":1114},{},[1115],{"type":23,"value":377},{"type":17,"tag":80,"props":1117,"children":1118},{},[1119,1129],{"type":17,"tag":84,"props":1120,"children":1121},{},[1122],{"type":17,"tag":133,"props":1123,"children":1126},{"href":1124,"rel":1125},"https://www.postman.com/",[214],[1127],{"type":23,"value":1128},"Postman",{"type":17,"tag":84,"props":1130,"children":1131},{},[1132],{"type":17,"tag":133,"props":1133,"children":1136},{"href":1134,"rel":1135},"https://swagger.io/",[214],[1137],{"type":23,"value":1138},"OpenAPI / Swagger",{"type":17,"tag":239,"props":1140,"children":1142},{"id":1141},"why-this-matters-1",[1143],{"type":23,"value":886},{"type":17,"tag":29,"props":1145,"children":1146},{},[1147],{"type":23,"value":1148},"Good tooling:",{"type":17,"tag":80,"props":1150,"children":1151},{},[1152,1157,1162],{"type":17,"tag":84,"props":1153,"children":1154},{},[1155],{"type":23,"value":1156},"reduces development time",{"type":17,"tag":84,"props":1158,"children":1159},{},[1160],{"type":23,"value":1161},"improves reliability",{"type":17,"tag":84,"props":1163,"children":1164},{},[1165],{"type":23,"value":1166},"standardizes implementation",{"type":17,"tag":68,"props":1168,"children":1170},{"id":1169},"how-these-tools-fit-together",[1171],{"type":23,"value":1172},"How these tools fit together",{"type":17,"tag":29,"props":1174,"children":1175},{},[1176],{"type":23,"value":1177},"A modern SaaS integration stack often looks like:",{"type":17,"tag":80,"props":1179,"children":1180},{},[1181,1186,1191,1196,1201],{"type":17,"tag":84,"props":1182,"children":1183},{},[1184],{"type":23,"value":1185},"Unified API → core integration layer",{"type":17,"tag":84,"props":1187,"children":1188},{},[1189],{"type":23,"value":1190},"OAuth / identity → authentication",{"type":17,"tag":84,"props":1192,"children":1193},{},[1194],{"type":23,"value":1195},"API gateway → control + routing",{"type":17,"tag":84,"props":1197,"children":1198},{},[1199],{"type":23,"value":1200},"observability → monitoring",{"type":17,"tag":84,"props":1202,"children":1203},{},[1204],{"type":23,"value":1205},"optional ETL → analytics",{"type":17,"tag":29,"props":1207,"children":1208},{},[1209],{"type":23,"value":1210},"The key insight:",{"type":17,"tag":29,"props":1212,"children":1213},{},[1214],{"type":23,"value":1215},"You don't need every tool.",{"type":17,"tag":29,"props":1217,"children":1218},{},[1219,1221,1226],{"type":23,"value":1220},"You need the ",{"type":17,"tag":48,"props":1222,"children":1223},{},[1224],{"type":23,"value":1225},"right architecture for your use case",{"type":23,"value":54},{"type":17,"tag":68,"props":1228,"children":1230},{"id":1229},"why-teams-consolidate-this-stack-with-unifiedto",[1231],{"type":23,"value":1232},"Why teams consolidate this stack with Unified.to",{"type":17,"tag":29,"props":1234,"children":1235},{},[1236],{"type":23,"value":1237},"Most SaaS companies don't just use one of these tools.",{"type":17,"tag":29,"props":1239,"children":1240},{},[1241],{"type":23,"value":1242},"They end up combining:",{"type":17,"tag":80,"props":1244,"children":1245},{},[1246,1251,1256,1261,1266],{"type":17,"tag":84,"props":1247,"children":1248},{},[1249],{"type":23,"value":1250},"OAuth + token management",{"type":17,"tag":84,"props":1252,"children":1253},{},[1254],{"type":23,"value":1255},"API integrations",{"type":17,"tag":84,"props":1257,"children":1258},{},[1259],{"type":23,"value":1260},"webhook infrastructure",{"type":17,"tag":84,"props":1262,"children":1263},{},[1264],{"type":23,"value":1265},"observability + logging",{"type":17,"tag":84,"props":1267,"children":1268},{},[1269],{"type":23,"value":1270},"data normalization",{"type":17,"tag":29,"props":1272,"children":1273},{},[1274],{"type":23,"value":1275},"That creates:",{"type":17,"tag":80,"props":1277,"children":1278},{},[1279,1284,1289,1294],{"type":17,"tag":84,"props":1280,"children":1281},{},[1282],{"type":23,"value":1283},"multiple vendors",{"type":17,"tag":84,"props":1285,"children":1286},{},[1287],{"type":23,"value":1288},"fragmented architecture",{"type":17,"tag":84,"props":1290,"children":1291},{},[1292],{"type":23,"value":1293},"higher maintenance overhead",{"type":17,"tag":84,"props":1295,"children":1296},{},[1297],{"type":23,"value":1298},"more failure points",{"type":17,"tag":29,"props":1300,"children":1301},{},[1302],{"type":23,"value":1303},"Unified.to consolidates these layers into a single integration infrastructure.",{"type":17,"tag":239,"props":1305,"children":1307},{"id":1306},"what-unifiedto-replaces",[1308],{"type":23,"value":1309},"What Unified.to replaces",{"type":17,"tag":29,"props":1311,"children":1312},{},[1313],{"type":23,"value":1314},"Instead of stitching together multiple tools, Unified provides:",{"type":17,"tag":80,"props":1316,"children":1317},{},[1318,1328,1338,1348,1358],{"type":17,"tag":84,"props":1319,"children":1320},{},[1321,1326],{"type":17,"tag":48,"props":1322,"children":1323},{},[1324],{"type":23,"value":1325},"OAuth + authentication management",{"type":23,"value":1327},"\nUnified handles authorization flows, token refresh, scope mapping, and connection lifecycle across 400+ integrations.",{"type":17,"tag":84,"props":1329,"children":1330},{},[1331,1336],{"type":17,"tag":48,"props":1332,"children":1333},{},[1334],{"type":23,"value":1335},"Unified API layer",{"type":23,"value":1337},"\nOne API across 25 categories with normalized data models and passthrough access when needed.",{"type":17,"tag":84,"props":1339,"children":1340},{},[1341,1346],{"type":17,"tag":48,"props":1342,"children":1343},{},[1344],{"type":23,"value":1345},"Real-time data delivery",{"type":23,"value":1347},"\nNative + virtual webhooks with no polling or sync jobs.",{"type":17,"tag":84,"props":1349,"children":1350},{},[1351,1356],{"type":17,"tag":48,"props":1352,"children":1353},{},[1354],{"type":23,"value":1355},"Observability and debugging",{"type":23,"value":1357},"\nLogs, connection health, webhook delivery tracking, and error visibility across all integrations.",{"type":17,"tag":84,"props":1359,"children":1360},{},[1361,1366],{"type":17,"tag":48,"props":1362,"children":1363},{},[1364],{"type":23,"value":1365},"Security + compliance layer",{"type":23,"value":1367},"\nZero-storage architecture, regional infrastructure, and simplified compliance scope.",{"type":17,"tag":239,"props":1369,"children":1371},{"id":1370},"the-result",[1372],{"type":23,"value":1373},"The result",{"type":17,"tag":29,"props":1375,"children":1376},{},[1377],{"type":23,"value":1378},"Instead of managing 5–8 different tools, teams get:",{"type":17,"tag":80,"props":1380,"children":1381},{},[1382,1387,1392,1397],{"type":17,"tag":84,"props":1383,"children":1384},{},[1385],{"type":23,"value":1386},"faster integration delivery",{"type":17,"tag":84,"props":1388,"children":1389},{},[1390],{"type":23,"value":1391},"lower maintenance overhead",{"type":17,"tag":84,"props":1393,"children":1394},{},[1395],{"type":23,"value":1396},"fewer failure points",{"type":17,"tag":84,"props":1398,"children":1399},{},[1400],{"type":23,"value":1401},"a single system to operate and scale",{"type":17,"tag":68,"props":1403,"children":1405},{"id":1404},"the-shift-from-integrations-to-infrastructure",[1406],{"type":23,"value":1407},"The shift: from integrations to infrastructure",{"type":17,"tag":29,"props":1409,"children":1410},{},[1411],{"type":23,"value":1412},"The biggest change happening right now:",{"type":17,"tag":29,"props":1414,"children":1415},{},[1416],{"type":23,"value":1417},"Integrations are no longer features.",{"type":17,"tag":29,"props":1419,"children":1420},{},[1421],{"type":23,"value":1422},"They are infrastructure.",{"type":17,"tag":29,"props":1424,"children":1425},{},[1426],{"type":23,"value":1427},"Teams that treat integrations as:",{"type":17,"tag":80,"props":1429,"children":1430},{},[1431,1436,1441],{"type":17,"tag":84,"props":1432,"children":1433},{},[1434],{"type":23,"value":1435},"one-off builds",{"type":17,"tag":84,"props":1437,"children":1438},{},[1439],{"type":23,"value":1440},"side projects",{"type":17,"tag":84,"props":1442,"children":1443},{},[1444],{"type":23,"value":1445},"backlog items",{"type":17,"tag":29,"props":1447,"children":1448},{},[1449],{"type":23,"value":1450},"fall behind.",{"type":17,"tag":29,"props":1452,"children":1453},{},[1454],{"type":23,"value":1427},{"type":17,"tag":80,"props":1456,"children":1457},{},[1458,1463,1468],{"type":17,"tag":84,"props":1459,"children":1460},{},[1461],{"type":23,"value":1462},"a core platform layer",{"type":17,"tag":84,"props":1464,"children":1465},{},[1466],{"type":23,"value":1467},"real-time data infrastructure",{"type":17,"tag":84,"props":1469,"children":1470},{},[1471],{"type":23,"value":1472},"AI-ready systems",{"type":17,"tag":29,"props":1474,"children":1475},{},[1476],{"type":23,"value":1477},"move faster and scale better.",{"type":17,"tag":68,"props":1479,"children":1481},{"id":1480},"why-unified-apis-are-becoming-the-default",[1482],{"type":23,"value":1483},"Why Unified APIs are becoming the default",{"type":17,"tag":29,"props":1485,"children":1486},{},[1487],{"type":23,"value":1488},"Most teams eventually converge on the same realization:",{"type":17,"tag":29,"props":1490,"children":1491},{},[1492],{"type":23,"value":1493},"Building integrations individually does not scale.",{"type":17,"tag":29,"props":1495,"children":1496},{},[1497],{"type":23,"value":1498},"Unified APIs solve that by:",{"type":17,"tag":80,"props":1500,"children":1501},{},[1502,1507,1512,1517],{"type":17,"tag":84,"props":1503,"children":1504},{},[1505],{"type":23,"value":1506},"reducing engineering overhead",{"type":17,"tag":84,"props":1508,"children":1509},{},[1510],{"type":23,"value":1511},"standardizing data access",{"type":17,"tag":84,"props":1513,"children":1514},{},[1515],{"type":23,"value":1516},"enabling faster product iteration",{"type":17,"tag":84,"props":1518,"children":1519},{},[1520],{"type":23,"value":1521},"supporting AI and automation use cases",{"type":17,"tag":29,"props":1523,"children":1524},{},[1525],{"type":23,"value":1526},"Unified.to goes further by focusing on:",{"type":17,"tag":80,"props":1528,"children":1529},{},[1530,1535,1540,1545],{"type":17,"tag":84,"props":1531,"children":1532},{},[1533],{"type":23,"value":1534},"real-time data (no sync delays)",{"type":17,"tag":84,"props":1536,"children":1537},{},[1538],{"type":23,"value":1539},"zero storage (simpler compliance)",{"type":17,"tag":84,"props":1541,"children":1542},{},[1543],{"type":23,"value":1544},"full read/write capability",{"type":17,"tag":84,"props":1546,"children":1547},{},[1548],{"type":23,"value":1549},"broad integration coverage",{"type":17,"tag":68,"props":1551,"children":1553},{"id":1552},"final-thoughts",[1554],{"type":23,"value":1555},"Final thoughts",{"type":17,"tag":29,"props":1557,"children":1558},{},[1559],{"type":23,"value":1560},"There is no single tool that solves SaaS integration.",{"type":17,"tag":29,"props":1562,"children":1563},{},[1564],{"type":23,"value":1565},"But there is a clear pattern:",{"type":17,"tag":80,"props":1567,"children":1568},{},[1569,1574,1579,1584],{"type":17,"tag":84,"props":1570,"children":1571},{},[1572],{"type":23,"value":1573},"iPaaS → internal workflows",{"type":17,"tag":84,"props":1575,"children":1576},{},[1577],{"type":23,"value":1578},"automation tools → simple tasks",{"type":17,"tag":84,"props":1580,"children":1581},{},[1582],{"type":23,"value":1583},"unified APIs → product integrations",{"type":17,"tag":84,"props":1585,"children":1586},{},[1587],{"type":23,"value":1588},"API gateways + identity → control layer",{"type":17,"tag":29,"props":1590,"children":1591},{},[1592],{"type":23,"value":1593},"If you are building a SaaS product that depends on integrations, the most important decision is not which connector to build first.",{"type":17,"tag":29,"props":1595,"children":1596},{},[1597,1599,1604],{"type":23,"value":1598},"It is ",{"type":17,"tag":48,"props":1600,"children":1601},{},[1602],{"type":23,"value":1603},"which integration architecture you choose",{"type":23,"value":54},{"type":17,"tag":29,"props":1606,"children":1607},{},[1608,1610],{"type":23,"value":1609},"→ ",{"type":17,"tag":133,"props":1611,"children":1614},{"href":1612,"rel":1613},"https://app.unified.to/login",[214],[1615],{"type":23,"value":1616},"Start your 30-day free trial",{"type":17,"tag":29,"props":1618,"children":1619},{},[1620,1621],{"type":23,"value":1609},{"type":17,"tag":133,"props":1622,"children":1625},{"href":1623,"rel":1624},"https://calendly.com/d/cph9-g8n-jzg/connect-with-unified",[214],[1626],{"type":23,"value":1627},"Book a demo",{"title":7,"searchDepth":1629,"depth":1629,"links":1630},2,[1631,1632,1637,1641,1645,1649,1652,1655,1658,1662,1666,1669,1670,1674,1675,1676],{"id":70,"depth":1629,"text":73},{"id":179,"depth":1629,"text":182,"children":1633},[1634,1636],{"id":241,"depth":1635,"text":244},3,{"id":270,"depth":1635,"text":273},{"id":357,"depth":1629,"text":360,"children":1638},[1639,1640],{"id":413,"depth":1635,"text":416},{"id":437,"depth":1635,"text":440},{"id":461,"depth":1629,"text":464,"children":1642},[1643,1644],{"id":499,"depth":1635,"text":502},{"id":523,"depth":1635,"text":440},{"id":546,"depth":1629,"text":549,"children":1646},[1647,1648],{"id":594,"depth":1635,"text":597},{"id":618,"depth":1635,"text":621},{"id":642,"depth":1629,"text":645,"children":1650},[1651],{"id":690,"depth":1635,"text":693},{"id":719,"depth":1629,"text":722,"children":1653},[1654],{"id":767,"depth":1635,"text":770},{"id":807,"depth":1629,"text":810,"children":1656},[1657],{"id":883,"depth":1635,"text":886},{"id":912,"depth":1629,"text":915,"children":1659},[1660,1661],{"id":950,"depth":1635,"text":953},{"id":974,"depth":1635,"text":977},{"id":990,"depth":1629,"text":993,"children":1663},[1664,1665],{"id":1028,"depth":1635,"text":693},{"id":1051,"depth":1635,"text":1054},{"id":1103,"depth":1629,"text":1106,"children":1667},[1668],{"id":1141,"depth":1635,"text":886},{"id":1169,"depth":1629,"text":1172},{"id":1229,"depth":1629,"text":1232,"children":1671},[1672,1673],{"id":1306,"depth":1635,"text":1309},{"id":1370,"depth":1635,"text":1373},{"id":1404,"depth":1629,"text":1407},{"id":1480,"depth":1629,"text":1483},{"id":1552,"depth":1629,"text":1555},"markdown","content:blog:10_essential_tools_for_effective_saas_integration_solutions.md","content","blog/10_essential_tools_for_effective_saas_integration_solutions.md","blog/10_essential_tools_for_effective_saas_integration_solutions","md",[1684,2379,2997,3652,4388,4948,5498,6003,6335,6818,6994,7745,8934,9576,11060,12512,13631,14826,16066,17330,18373,19349,20572,21843,23007,24311,25509,26650,27713,28869,30319,31896,33030,34357,35735,37393,39242,40330,42026,42590,43173,44531,45738,46768,47077,49442,50974,52254,53372,54355,55619,57142,58494,60104,61532,63378,64457,65539,65983,67213,68213,68752,70068,72202,73703,75152,76250,77396,78544,79595,81002,82379,84159,85335,86671,87874,88995,90466,91631,92948,93590,94370,95954,96898,98715,99945,101185,102647,103433,104716,106355,106766,108043,109528,110733,112089,113216,114397,115706,116895,118206,119563,120714,121702,123073,125251,127055,128539,129684,131137,131920,133051,134302,135405,136257,137067,138104,138849,139772,140641,141720,142543,143888,144740,145455,146581,147893,149237,150542,151530,152577,153555,154431,155051,155921,157244,158401,159276,160214,161633,162869,163654,165302,167112,167852,168889,170687,171469,172823,174221,175176,176009,176968,178474,179785,180964,182008,183335,184311,185281,186480,187462,188795,190022,191057,192219,193359,194585,195838,196861,198153,199440,200781,201932,203282,204567,206383,207288,208157,209145,210094,211095,211991,212789,213726,214672,215354,215946,216956,217345,217823,219164,220482,221974,223306,223933,224619,225758,226506,227672,228613,229745,230372,231315,232159,233890,234738,235525,236083,236999,237716,238631,239367,239594,240613,241316,242194,242866,243690,244526,245782,246812,247723,248094,248974,249614,251098,251412,251826,252514,253105,253718,254104,254554,255117,255400,255772,256535,262289,263026,264566,265464,266203,266735,267327,267922,268514,269011,269446,269992,270452,271027,271468,272103,272842,273578,274187,274816,275221,275993,276560,276952,277173,277607,278044,278259,278333,278984,279437,279940,280537,280999,281469,282262,282336,283305,284041,284726,285429,285782,287196,287489,287896,288230,288981,289972,290413,290819,291297,291679,292022,292887,293981,295172,296229,296947,297516,297873,298587,299196,299638,299952,300464,300887,308297,309026,309569,309927,310397,311202,312079,312819,313436,314325,315105,315989,316741,317611,318127,319113,319433,319851,320002,320730,321689,322165,322728,323998,324660,325185,325714,326073,326680,327147,327861,328447,328832,329344,330324,330719,331466,331977,332239,332606,332979,333342,333612,333819,334329,334522,334903,335569,336090,336370,336688,337230,337404,337517,337701,338184,339259,340320,340897,341241,341423,342292,342457,342990,343400,344433,344799,345543,345894,346045,346638,348222,348618,349031,349514,350165,350548,350997,351820,352277,352994,353366,353771,354075,354148,354811,354978,355136,355376,355867,356613,356734,357278,357762,358406,358893,359411,359842,360183,360832,362155,362887,363456,364236,364481,365047,365371,365885,366689,367020,367304,367871,368118,368496,368961,369407,369620,370031,370173,370564,370717,370924,371380,371848,372055,372567,372789,372992],{"_path":1685,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":1686,"description":1687,"img":1688,"date":1689,"tag":12,"body":1690,"_type":1677,"_id":2376,"_source":1679,"_file":2377,"_stem":2378,"_extension":1682},"/blog/rest_api_integration_challenges_best_practices_and_what_breaks_at_scale","REST API Integration: Challenges, Best Practices, and What Breaks at Scale","REST APIs are the default way software integrates with external systems. Every SaaS product—from CRMs to HR platforms to payment systems—exposes a REST...","https://s3.us-east-2.amazonaws.com/unified-article-images/rest_api_integration_challenges_best_practices_and_what_breaks_at_scale-icon.png","2026-04-07T01:51:00.000Z",{"type":14,"children":1691,"toc":2358},[1692,1697,1700,1708,1713,1718,1723,1728,1734,1739,1762,1767,1772,1778,1783,1789,1794,1816,1821,1827,1832,1850,1862,1868,1873,1891,1896,1902,1907,1925,1930,1936,1941,1946,1964,1969,1975,1980,2003,2008,2014,2019,2037,2042,2048,2053,2076,2081,2087,2092,2097,2102,2129,2134,2140,2145,2150,2155,2178,2183,2188,2194,2199,2222,2227,2232,2238,2243,2251,2262,2270,2275,2283,2288,2296,2301,2309,2314,2320,2325,2330,2335,2340,2349],{"type":17,"tag":18,"props":1693,"children":1695},{"id":1694},"rest-api-integration-challenges-best-practices-and-what-breaks-at-scale",[1696],{"type":23,"value":1686},{"type":17,"tag":25,"props":1698,"children":1699},{},[],{"type":17,"tag":29,"props":1701,"children":1702},{},[1703],{"type":17,"tag":33,"props":1704,"children":1705},{},[1706],{"type":23,"value":1707},"April 7, 2026",{"type":17,"tag":29,"props":1709,"children":1710},{},[1711],{"type":23,"value":1712},"REST APIs are the default way software integrates with external systems. Every SaaS product—from CRMs to HR platforms to payment systems—exposes a REST interface.",{"type":17,"tag":29,"props":1714,"children":1715},{},[1716],{"type":23,"value":1717},"Calling a single REST API is straightforward.",{"type":17,"tag":29,"props":1719,"children":1720},{},[1721],{"type":23,"value":1722},"Supporting dozens of them inside a product is not.",{"type":17,"tag":29,"props":1724,"children":1725},{},[1726],{"type":23,"value":1727},"The complexity isn't in making requests. It's in making those requests reliable, consistent, and scalable across many different systems.",{"type":17,"tag":68,"props":1729,"children":1731},{"id":1730},"why-rest-apis-are-still-the-default",[1732],{"type":23,"value":1733},"Why REST APIs Are Still the Default",{"type":17,"tag":29,"props":1735,"children":1736},{},[1737],{"type":23,"value":1738},"REST remains the standard for a reason.",{"type":17,"tag":80,"props":1740,"children":1741},{},[1742,1747,1752,1757],{"type":17,"tag":84,"props":1743,"children":1744},{},[1745],{"type":23,"value":1746},"predictable, resource-oriented URLs",{"type":17,"tag":84,"props":1748,"children":1749},{},[1750],{"type":23,"value":1751},"standard HTTP methods (GET, POST, PUT, DELETE)",{"type":17,"tag":84,"props":1753,"children":1754},{},[1755],{"type":23,"value":1756},"widely supported across languages and environments",{"type":17,"tag":84,"props":1758,"children":1759},{},[1760],{"type":23,"value":1761},"flexible response formats (typically JSON)",{"type":17,"tag":29,"props":1763,"children":1764},{},[1765],{"type":23,"value":1766},"This makes REST APIs easy to adopt and quick to prototype against. Any engineer can go from documentation to a working request in minutes.",{"type":17,"tag":29,"props":1768,"children":1769},{},[1770],{"type":23,"value":1771},"That simplicity is why nearly every SaaS platform exposes a REST API.",{"type":17,"tag":68,"props":1773,"children":1775},{"id":1774},"where-direct-rest-api-integrations-get-hard",[1776],{"type":23,"value":1777},"Where Direct REST API Integrations Get Hard",{"type":17,"tag":29,"props":1779,"children":1780},{},[1781],{"type":23,"value":1782},"The difficulty shows up when you move from one integration to many.",{"type":17,"tag":239,"props":1784,"children":1786},{"id":1785},"authentication-differences",[1787],{"type":23,"value":1788},"Authentication differences",{"type":17,"tag":29,"props":1790,"children":1791},{},[1792],{"type":23,"value":1793},"Each API handles authentication differently:",{"type":17,"tag":80,"props":1795,"children":1796},{},[1797,1806,1811],{"type":17,"tag":84,"props":1798,"children":1799},{},[1800,1804],{"type":17,"tag":133,"props":1801,"children":1802},{"href":779},[1803],{"type":23,"value":782},{"type":23,"value":1805}," flows with varying scopes",{"type":17,"tag":84,"props":1807,"children":1808},{},[1809],{"type":23,"value":1810},"API keys with different header formats",{"type":17,"tag":84,"props":1812,"children":1813},{},[1814],{"type":23,"value":1815},"token refresh logic that behaves inconsistently",{"type":17,"tag":29,"props":1817,"children":1818},{},[1819],{"type":23,"value":1820},"What works for one integration does not generalize cleanly to another.",{"type":17,"tag":239,"props":1822,"children":1824},{"id":1823},"pagination-differences",[1825],{"type":23,"value":1826},"Pagination differences",{"type":17,"tag":29,"props":1828,"children":1829},{},[1830],{"type":23,"value":1831},"Every API paginates differently:",{"type":17,"tag":80,"props":1833,"children":1834},{},[1835,1840,1845],{"type":17,"tag":84,"props":1836,"children":1837},{},[1838],{"type":23,"value":1839},"offset-based",{"type":17,"tag":84,"props":1841,"children":1842},{},[1843],{"type":23,"value":1844},"cursor-based",{"type":17,"tag":84,"props":1846,"children":1847},{},[1848],{"type":23,"value":1849},"page-based",{"type":17,"tag":29,"props":1851,"children":1852},{},[1853,1855,1861],{"type":23,"value":1854},"Even basic operations like 'get all records' require custom logic per integration. Data consistency becomes harder when records change during ",{"type":17,"tag":133,"props":1856,"children":1858},{"href":1857},"/docs/reference/pagination",[1859],{"type":23,"value":1860},"pagination",{"type":23,"value":54},{"type":17,"tag":239,"props":1863,"children":1865},{"id":1864},"rate-limits-and-throughput-constraints",[1866],{"type":23,"value":1867},"Rate limits and throughput constraints",{"type":17,"tag":29,"props":1869,"children":1870},{},[1871],{"type":23,"value":1872},"Each provider enforces different limits:",{"type":17,"tag":80,"props":1874,"children":1875},{},[1876,1881,1886],{"type":17,"tag":84,"props":1877,"children":1878},{},[1879],{"type":23,"value":1880},"requests per second",{"type":17,"tag":84,"props":1882,"children":1883},{},[1884],{"type":23,"value":1885},"burst vs sustained limits",{"type":17,"tag":84,"props":1887,"children":1888},{},[1889],{"type":23,"value":1890},"per-endpoint restrictions",{"type":17,"tag":29,"props":1892,"children":1893},{},[1894],{"type":23,"value":1895},"Without careful handling, integrations fail unpredictably under load.",{"type":17,"tag":239,"props":1897,"children":1899},{"id":1898},"inconsistent-schemas",[1900],{"type":23,"value":1901},"Inconsistent schemas",{"type":17,"tag":29,"props":1903,"children":1904},{},[1905],{"type":23,"value":1906},"Two APIs representing the same concept—like a customer or employee—often structure data differently:",{"type":17,"tag":80,"props":1908,"children":1909},{},[1910,1915,1920],{"type":17,"tag":84,"props":1911,"children":1912},{},[1913],{"type":23,"value":1914},"different field names",{"type":17,"tag":84,"props":1916,"children":1917},{},[1918],{"type":23,"value":1919},"different nesting",{"type":17,"tag":84,"props":1921,"children":1922},{},[1923],{"type":23,"value":1924},"different required attributes",{"type":17,"tag":29,"props":1926,"children":1927},{},[1928],{"type":23,"value":1929},"This forces teams to build and maintain mapping layers across every integration.",{"type":17,"tag":239,"props":1931,"children":1933},{"id":1932},"missing-or-inconsistent-webhooks",[1934],{"type":23,"value":1935},"Missing or inconsistent webhooks",{"type":17,"tag":29,"props":1937,"children":1938},{},[1939],{"type":23,"value":1940},"Some APIs provide strong event systems. Others don't.",{"type":17,"tag":29,"props":1942,"children":1943},{},[1944],{"type":23,"value":1945},"This leads to workarounds:",{"type":17,"tag":80,"props":1947,"children":1948},{},[1949,1954,1959],{"type":17,"tag":84,"props":1950,"children":1951},{},[1952],{"type":23,"value":1953},"polling systems",{"type":17,"tag":84,"props":1955,"children":1956},{},[1957],{"type":23,"value":1958},"delayed synchronization",{"type":17,"tag":84,"props":1960,"children":1961},{},[1962],{"type":23,"value":1963},"partial data visibility",{"type":17,"tag":29,"props":1965,"children":1966},{},[1967],{"type":23,"value":1968},"Real-time systems become difficult to build reliably.",{"type":17,"tag":239,"props":1970,"children":1972},{"id":1971},"retry-and-failure-handling",[1973],{"type":23,"value":1974},"Retry and failure handling",{"type":17,"tag":29,"props":1976,"children":1977},{},[1978],{"type":23,"value":1979},"Failures are unavoidable:",{"type":17,"tag":80,"props":1981,"children":1982},{},[1983,1988,1993,1998],{"type":17,"tag":84,"props":1984,"children":1985},{},[1986],{"type":23,"value":1987},"expired credentials",{"type":17,"tag":84,"props":1989,"children":1990},{},[1991],{"type":23,"value":1992},"revoked permissions",{"type":17,"tag":84,"props":1994,"children":1995},{},[1996],{"type":23,"value":1997},"provider outages",{"type":17,"tag":84,"props":1999,"children":2000},{},[2001],{"type":23,"value":2002},"malformed requests",{"type":17,"tag":29,"props":2004,"children":2005},{},[2006],{"type":23,"value":2007},"Each API surfaces errors differently, which makes consistent retry logic difficult to implement.",{"type":17,"tag":239,"props":2009,"children":2011},{"id":2010},"versioning-and-field-drift",[2012],{"type":23,"value":2013},"Versioning and field drift",{"type":17,"tag":29,"props":2015,"children":2016},{},[2017],{"type":23,"value":2018},"APIs evolve:",{"type":17,"tag":80,"props":2020,"children":2021},{},[2022,2027,2032],{"type":17,"tag":84,"props":2023,"children":2024},{},[2025],{"type":23,"value":2026},"fields are added or deprecated",{"type":17,"tag":84,"props":2028,"children":2029},{},[2030],{"type":23,"value":2031},"endpoints change behavior",{"type":17,"tag":84,"props":2033,"children":2034},{},[2035],{"type":23,"value":2036},"new versions introduce breaking changes",{"type":17,"tag":29,"props":2038,"children":2039},{},[2040],{"type":23,"value":2041},"Maintaining integrations becomes an ongoing operational burden, not a one-time build.",{"type":17,"tag":68,"props":2043,"children":2045},{"id":2044},"what-this-looks-like-in-real-saas-products",[2046],{"type":23,"value":2047},"What This Looks Like in Real SaaS Products",{"type":17,"tag":29,"props":2049,"children":2050},{},[2051],{"type":23,"value":2052},"These issues compound in real use cases:",{"type":17,"tag":80,"props":2054,"children":2055},{},[2056,2061,2066,2071],{"type":17,"tag":84,"props":2057,"children":2058},{},[2059],{"type":23,"value":2060},"syncing CRM data into analytics systems",{"type":17,"tag":84,"props":2062,"children":2063},{},[2064],{"type":23,"value":2065},"provisioning users from HR platforms",{"type":17,"tag":84,"props":2067,"children":2068},{},[2069],{"type":23,"value":2070},"aggregating files from storage providers",{"type":17,"tag":84,"props":2072,"children":2073},{},[2074],{"type":23,"value":2075},"syncing tickets across support systems",{"type":17,"tag":29,"props":2077,"children":2078},{},[2079],{"type":23,"value":2080},"Each additional integration introduces its own edge cases, and the system becomes harder to reason about over time.",{"type":17,"tag":68,"props":2082,"children":2084},{"id":2083},"rest-is-not-the-hard-part",[2085],{"type":23,"value":2086},"REST Is Not the Hard Part",{"type":17,"tag":29,"props":2088,"children":2089},{},[2090],{"type":23,"value":2091},"REST itself is not the problem.",{"type":17,"tag":29,"props":2093,"children":2094},{},[2095],{"type":23,"value":2096},"The problem is supporting many REST APIs at once.",{"type":17,"tag":29,"props":2098,"children":2099},{},[2100],{"type":23,"value":2101},"Each API follows REST principles, but implements them differently. The result is fragmentation across:",{"type":17,"tag":80,"props":2103,"children":2104},{},[2105,2110,2114,2119,2124],{"type":17,"tag":84,"props":2106,"children":2107},{},[2108],{"type":23,"value":2109},"authentication",{"type":17,"tag":84,"props":2111,"children":2112},{},[2113],{"type":23,"value":1860},{"type":17,"tag":84,"props":2115,"children":2116},{},[2117],{"type":23,"value":2118},"filtering",{"type":17,"tag":84,"props":2120,"children":2121},{},[2122],{"type":23,"value":2123},"error handling",{"type":17,"tag":84,"props":2125,"children":2126},{},[2127],{"type":23,"value":2128},"data models",{"type":17,"tag":29,"props":2130,"children":2131},{},[2132],{"type":23,"value":2133},"At small scale, this is manageable. At product scale, it becomes a systems problem.",{"type":17,"tag":68,"props":2135,"children":2137},{"id":2136},"a-more-scalable-integration-model",[2138],{"type":23,"value":2139},"A More Scalable Integration Model",{"type":17,"tag":29,"props":2141,"children":2142},{},[2143],{"type":23,"value":2144},"To handle this complexity, teams move toward a normalized integration layer.",{"type":17,"tag":29,"props":2146,"children":2147},{},[2148],{"type":23,"value":2149},"Instead of building directly against each API, they introduce a consistent interface that abstracts common patterns.",{"type":17,"tag":29,"props":2151,"children":2152},{},[2153],{"type":23,"value":2154},"This layer standardizes:",{"type":17,"tag":80,"props":2156,"children":2157},{},[2158,2163,2168,2173],{"type":17,"tag":84,"props":2159,"children":2160},{},[2161],{"type":23,"value":2162},"authentication flows",{"type":17,"tag":84,"props":2164,"children":2165},{},[2166],{"type":23,"value":2167},"pagination controls (limit, offset, time-based filters)",{"type":17,"tag":84,"props":2169,"children":2170},{},[2171],{"type":23,"value":2172},"data models across integrations",{"type":17,"tag":84,"props":2174,"children":2175},{},[2176],{"type":23,"value":2177},"retry and error handling behavior",{"type":17,"tag":29,"props":2179,"children":2180},{},[2181],{"type":23,"value":2182},"When provider-specific functionality is needed, systems can still access underlying endpoints directly through a passthrough mechanism.",{"type":17,"tag":29,"props":2184,"children":2185},{},[2186],{"type":23,"value":2187},"This balance—standardization with escape hatches—is what makes integrations scalable.",{"type":17,"tag":68,"props":2189,"children":2191},{"id":2190},"how-this-shows-up-in-practice",[2192],{"type":23,"value":2193},"How This Shows Up in Practice",{"type":17,"tag":29,"props":2195,"children":2196},{},[2197],{"type":23,"value":2198},"In practice, this approach leads to:",{"type":17,"tag":80,"props":2200,"children":2201},{},[2202,2207,2212,2217],{"type":17,"tag":84,"props":2203,"children":2204},{},[2205],{"type":23,"value":2206},"one consistent way to retrieve and write data across integrations",{"type":17,"tag":84,"props":2208,"children":2209},{},[2210],{"type":23,"value":2211},"predictable pagination and filtering behavior",{"type":17,"tag":84,"props":2213,"children":2214},{},[2215],{"type":23,"value":2216},"reduced need for per-integration logic",{"type":17,"tag":84,"props":2218,"children":2219},{},[2220],{"type":23,"value":2221},"faster onboarding of new integrations",{"type":17,"tag":29,"props":2223,"children":2224},{},[2225],{"type":23,"value":2226},"Developers can focus on product logic instead of API differences.",{"type":17,"tag":29,"props":2228,"children":2229},{},[2230],{"type":23,"value":2231},"For cases where providers expose unique functionality, direct access to underlying endpoints ensures nothing is blocked.",{"type":17,"tag":68,"props":2233,"children":2235},{"id":2234},"best-practices-for-rest-api-integration",[2236],{"type":23,"value":2237},"Best Practices for REST API Integration",{"type":17,"tag":29,"props":2239,"children":2240},{},[2241],{"type":23,"value":2242},"Across all approaches, a few principles hold:",{"type":17,"tag":29,"props":2244,"children":2245},{},[2246],{"type":17,"tag":48,"props":2247,"children":2248},{},[2249],{"type":23,"value":2250},"Understand the API before building",{"type":17,"tag":29,"props":2252,"children":2253},{},[2254,2256,2260],{"type":23,"value":2255},"Review authentication, pagination, ",{"type":17,"tag":133,"props":2257,"children":2258},{"href":135},[2259],{"type":23,"value":138},{"type":23,"value":2261},", and error responses upfront.",{"type":17,"tag":29,"props":2263,"children":2264},{},[2265],{"type":17,"tag":48,"props":2266,"children":2267},{},[2268],{"type":23,"value":2269},"Design for failure",{"type":17,"tag":29,"props":2271,"children":2272},{},[2273],{"type":23,"value":2274},"Assume requests will fail and implement retries, backoff strategies, and observability.",{"type":17,"tag":29,"props":2276,"children":2277},{},[2278],{"type":17,"tag":48,"props":2279,"children":2280},{},[2281],{"type":23,"value":2282},"Control data access patterns",{"type":17,"tag":29,"props":2284,"children":2285},{},[2286],{"type":23,"value":2287},"Avoid relying on APIs for complex querying. Use incremental syncs and internal storage where needed.",{"type":17,"tag":29,"props":2289,"children":2290},{},[2291],{"type":17,"tag":48,"props":2292,"children":2293},{},[2294],{"type":23,"value":2295},"Standardize where possible",{"type":17,"tag":29,"props":2297,"children":2298},{},[2299],{"type":23,"value":2300},"Reduce variation across integrations to simplify maintenance and scaling.",{"type":17,"tag":29,"props":2302,"children":2303},{},[2304],{"type":17,"tag":48,"props":2305,"children":2306},{},[2307],{"type":23,"value":2308},"Plan for change",{"type":17,"tag":29,"props":2310,"children":2311},{},[2312],{"type":23,"value":2313},"APIs evolve. Build systems that can adapt without requiring full rewrites.",{"type":17,"tag":68,"props":2315,"children":2317},{"id":2316},"final-takeaway",[2318],{"type":23,"value":2319},"Final Takeaway",{"type":17,"tag":29,"props":2321,"children":2322},{},[2323],{"type":23,"value":2324},"REST APIs make integrations accessible.",{"type":17,"tag":29,"props":2326,"children":2327},{},[2328],{"type":23,"value":2329},"They do not make them scalable by default.",{"type":17,"tag":29,"props":2331,"children":2332},{},[2333],{"type":23,"value":2334},"As soon as your product depends on multiple external systems, the challenge shifts from making requests to managing differences—across authentication, data models, pagination, and reliability.",{"type":17,"tag":29,"props":2336,"children":2337},{},[2338],{"type":23,"value":2339},"At that point, REST is just the transport layer. The real work is building a system that makes many APIs behave like one.",{"type":17,"tag":29,"props":2341,"children":2342},{},[2343,2344],{"type":23,"value":1609},{"type":17,"tag":133,"props":2345,"children":2347},{"href":1612,"rel":2346},[214],[2348],{"type":23,"value":1616},{"type":17,"tag":29,"props":2350,"children":2351},{},[2352,2353],{"type":23,"value":1609},{"type":17,"tag":133,"props":2354,"children":2356},{"href":1623,"rel":2355},[214],[2357],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":2359},[2360,2361,2370,2371,2372,2373,2374,2375],{"id":1730,"depth":1629,"text":1733},{"id":1774,"depth":1629,"text":1777,"children":2362},[2363,2364,2365,2366,2367,2368,2369],{"id":1785,"depth":1635,"text":1788},{"id":1823,"depth":1635,"text":1826},{"id":1864,"depth":1635,"text":1867},{"id":1898,"depth":1635,"text":1901},{"id":1932,"depth":1635,"text":1935},{"id":1971,"depth":1635,"text":1974},{"id":2010,"depth":1635,"text":2013},{"id":2044,"depth":1629,"text":2047},{"id":2083,"depth":1629,"text":2086},{"id":2136,"depth":1629,"text":2139},{"id":2190,"depth":1629,"text":2193},{"id":2234,"depth":1629,"text":2237},{"id":2316,"depth":1629,"text":2319},"content:blog:rest_api_integration_challenges_best_practices_and_what_breaks_at_scale.md","blog/rest_api_integration_challenges_best_practices_and_what_breaks_at_scale.md","blog/rest_api_integration_challenges_best_practices_and_what_breaks_at_scale",{"_path":2380,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2381,"description":2382,"img":2383,"date":2384,"tag":12,"body":2385,"_type":1677,"_id":2994,"_source":1679,"_file":2995,"_stem":2996,"_extension":1682},"/blog/api_pagination_why_it_breaks_multi_integration_systems_and_how_to_fix_it","API Pagination: Why It Breaks Multi-Integration Systems (and How to Fix It)","Pagination is straightforward when you're working with a single API. You request a list of records, receive a subset, and continue fetching until you've...","https://s3.us-east-2.amazonaws.com/unified-article-images/api_pagination_why_it_breaks_multi_integration_systems_and_how_to_fix_it-icon.png","2026-04-07T01:41:00.000Z",{"type":14,"children":2386,"toc":2977},[2387,2392,2395,2402,2412,2417,2422,2428,2433,2438,2461,2466,2472,2477,2483,2488,2506,2511,2517,2522,2527,2545,2551,2556,2561,2583,2588,2594,2599,2617,2622,2628,2633,2651,2656,2662,2667,2690,2695,2701,2706,2729,2734,2752,2757,2763,2768,2773,2778,2806,2811,2817,2822,2827,2845,2850,2868,2873,2877,2882,2887,2910,2915,2920,2938,2943,2949,2954,2959,2968],{"type":17,"tag":18,"props":2388,"children":2390},{"id":2389},"api-pagination-why-it-breaks-multi-integration-systems-and-how-to-fix-it",[2391],{"type":23,"value":2381},{"type":17,"tag":25,"props":2393,"children":2394},{},[],{"type":17,"tag":29,"props":2396,"children":2397},{},[2398],{"type":17,"tag":33,"props":2399,"children":2400},{},[2401],{"type":23,"value":1707},{"type":17,"tag":29,"props":2403,"children":2404},{},[2405,2410],{"type":17,"tag":133,"props":2406,"children":2407},{"href":1857},[2408],{"type":23,"value":2409},"Pagination",{"type":23,"value":2411}," is straightforward when you're working with a single API. You request a list of records, receive a subset, and continue fetching until you've retrieved everything you need.",{"type":17,"tag":29,"props":2413,"children":2414},{},[2415],{"type":23,"value":2416},"That model breaks quickly once your product depends on multiple APIs.",{"type":17,"tag":29,"props":2418,"children":2419},{},[2420],{"type":23,"value":2421},"What starts as a simple loop turns into a system-level problem involving data consistency, retries, ordering, and state management.",{"type":17,"tag":68,"props":2423,"children":2425},{"id":2424},"pagination-works-in-isolation",[2426],{"type":23,"value":2427},"Pagination Works in Isolation",{"type":17,"tag":29,"props":2429,"children":2430},{},[2431],{"type":23,"value":2432},"Most APIs paginate to control response size and performance. Instead of returning thousands of records at once, they return smaller batches.",{"type":17,"tag":29,"props":2434,"children":2435},{},[2436],{"type":23,"value":2437},"The mechanics vary:",{"type":17,"tag":80,"props":2439,"children":2440},{},[2441,2446,2451,2456],{"type":17,"tag":84,"props":2442,"children":2443},{},[2444],{"type":23,"value":2445},"offset-based pagination (skip + limit)",{"type":17,"tag":84,"props":2447,"children":2448},{},[2449],{"type":23,"value":2450},"cursor-based pagination (position marker)",{"type":17,"tag":84,"props":2452,"children":2453},{},[2454],{"type":23,"value":2455},"page-based pagination (page number + size)",{"type":17,"tag":84,"props":2457,"children":2458},{},[2459],{"type":23,"value":2460},"link-based pagination (next URL)",{"type":17,"tag":29,"props":2462,"children":2463},{},[2464],{"type":23,"value":2465},"Each approach works fine on its own. Problems emerge when you need to support many of them at once.",{"type":17,"tag":68,"props":2467,"children":2469},{"id":2468},"where-pagination-breaks-in-real-systems",[2470],{"type":23,"value":2471},"Where Pagination Breaks in Real Systems",{"type":17,"tag":29,"props":2473,"children":2474},{},[2475],{"type":23,"value":2476},"Pagination becomes unreliable when it's part of a larger system rather than a single request flow.",{"type":17,"tag":239,"props":2478,"children":2480},{"id":2479},"data-changes-during-pagination",[2481],{"type":23,"value":2482},"Data changes during pagination",{"type":17,"tag":29,"props":2484,"children":2485},{},[2486],{"type":23,"value":2487},"If records are inserted, updated, or deleted while you're paginating:",{"type":17,"tag":80,"props":2489,"children":2490},{},[2491,2496,2501],{"type":17,"tag":84,"props":2492,"children":2493},{},[2494],{"type":23,"value":2495},"offset-based systems can skip or duplicate records",{"type":17,"tag":84,"props":2497,"children":2498},{},[2499],{"type":23,"value":2500},"cursor-based systems can invalidate positions",{"type":17,"tag":84,"props":2502,"children":2503},{},[2504],{"type":23,"value":2505},"results become non-deterministic",{"type":17,"tag":29,"props":2507,"children":2508},{},[2509],{"type":23,"value":2510},"This leads to silent data inconsistencies that are hard to detect.",{"type":17,"tag":239,"props":2512,"children":2514},{"id":2513},"ordering-is-not-guaranteed",[2515],{"type":23,"value":2516},"Ordering is not guaranteed",{"type":17,"tag":29,"props":2518,"children":2519},{},[2520],{"type":23,"value":2521},"Many APIs don't guarantee stable sorting unless explicitly specified. Even then, sorting fields can behave differently across systems.",{"type":17,"tag":29,"props":2523,"children":2524},{},[2525],{"type":23,"value":2526},"Without deterministic ordering:",{"type":17,"tag":80,"props":2528,"children":2529},{},[2530,2535,2540],{"type":17,"tag":84,"props":2531,"children":2532},{},[2533],{"type":23,"value":2534},"pagination becomes unpredictable",{"type":17,"tag":84,"props":2536,"children":2537},{},[2538],{"type":23,"value":2539},"results shift between requests",{"type":17,"tag":84,"props":2541,"children":2542},{},[2543],{"type":23,"value":2544},"downstream systems receive inconsistent data",{"type":17,"tag":239,"props":2546,"children":2548},{"id":2547},"pagination-interacts-with-rate-limits",[2549],{"type":23,"value":2550},"Pagination interacts with rate limits",{"type":17,"tag":29,"props":2552,"children":2553},{},[2554],{"type":23,"value":2555},"Fetching large datasets requires many sequential requests.",{"type":17,"tag":29,"props":2557,"children":2558},{},[2559],{"type":23,"value":2560},"Across multiple APIs, this introduces:",{"type":17,"tag":80,"props":2562,"children":2563},{},[2564,2573,2578],{"type":17,"tag":84,"props":2565,"children":2566},{},[2567,2569],{"type":23,"value":2568},"partial syncs due to ",{"type":17,"tag":133,"props":2570,"children":2571},{"href":135},[2572],{"type":23,"value":138},{"type":17,"tag":84,"props":2574,"children":2575},{},[2576],{"type":23,"value":2577},"long-running jobs that fail mid-way",{"type":17,"tag":84,"props":2579,"children":2580},{},[2581],{"type":23,"value":2582},"inconsistent completion states",{"type":17,"tag":29,"props":2584,"children":2585},{},[2586],{"type":23,"value":2587},"Pagination is no longer just iteration—it's orchestration.",{"type":17,"tag":239,"props":2589,"children":2591},{"id":2590},"cursor-and-token-fragility",[2592],{"type":23,"value":2593},"Cursor and token fragility",{"type":17,"tag":29,"props":2595,"children":2596},{},[2597],{"type":23,"value":2598},"Cursor-based systems rely on tokens that:",{"type":17,"tag":80,"props":2600,"children":2601},{},[2602,2607,2612],{"type":17,"tag":84,"props":2603,"children":2604},{},[2605],{"type":23,"value":2606},"expire",{"type":17,"tag":84,"props":2608,"children":2609},{},[2610],{"type":23,"value":2611},"depend on timing",{"type":17,"tag":84,"props":2613,"children":2614},{},[2615],{"type":23,"value":2616},"may not be reusable",{"type":17,"tag":29,"props":2618,"children":2619},{},[2620],{"type":23,"value":2621},"If a process fails mid-pagination, resuming is not always straightforward.",{"type":17,"tag":239,"props":2623,"children":2625},{"id":2624},"retry-and-checkpoint-complexity",[2626],{"type":23,"value":2627},"Retry and checkpoint complexity",{"type":17,"tag":29,"props":2629,"children":2630},{},[2631],{"type":23,"value":2632},"In production systems, failures are expected:",{"type":17,"tag":80,"props":2634,"children":2635},{},[2636,2641,2646],{"type":17,"tag":84,"props":2637,"children":2638},{},[2639],{"type":23,"value":2640},"network interruptions",{"type":17,"tag":84,"props":2642,"children":2643},{},[2644],{"type":23,"value":2645},"API outages",{"type":17,"tag":84,"props":2647,"children":2648},{},[2649],{"type":23,"value":2650},"timeout errors",{"type":17,"tag":29,"props":2652,"children":2653},{},[2654],{"type":23,"value":2655},"To recover safely, you need to track where you left off without duplicating or skipping data. Each API handles this differently, which means retry logic becomes integration-specific.",{"type":17,"tag":68,"props":2657,"children":2659},{"id":2658},"why-this-becomes-a-product-problem",[2660],{"type":23,"value":2661},"Why This Becomes a Product Problem",{"type":17,"tag":29,"props":2663,"children":2664},{},[2665],{"type":23,"value":2666},"Pagination issues don't stay confined to backend systems. They surface in the product.",{"type":17,"tag":80,"props":2668,"children":2669},{},[2670,2675,2680,2685],{"type":17,"tag":84,"props":2671,"children":2672},{},[2673],{"type":23,"value":2674},"dashboards show incomplete or incorrect metrics",{"type":17,"tag":84,"props":2676,"children":2677},{},[2678],{"type":23,"value":2679},"workflows trigger on partial datasets",{"type":17,"tag":84,"props":2681,"children":2682},{},[2683],{"type":23,"value":2684},"analytics pipelines produce inconsistent results",{"type":17,"tag":84,"props":2686,"children":2687},{},[2688],{"type":23,"value":2689},"AI systems operate on missing context",{"type":17,"tag":29,"props":2691,"children":2692},{},[2693],{"type":23,"value":2694},"At scale, pagination affects correctness, not just performance.",{"type":17,"tag":68,"props":2696,"children":2698},{"id":2697},"the-hidden-cost-of-supporting-pagination-across-apis",[2699],{"type":23,"value":2700},"The Hidden Cost of Supporting Pagination Across APIs",{"type":17,"tag":29,"props":2702,"children":2703},{},[2704],{"type":23,"value":2705},"Every integration introduces its own rules:",{"type":17,"tag":80,"props":2707,"children":2708},{},[2709,2714,2719,2724],{"type":17,"tag":84,"props":2710,"children":2711},{},[2712],{"type":23,"value":2713},"different pagination models",{"type":17,"tag":84,"props":2715,"children":2716},{},[2717],{"type":23,"value":2718},"different limits and defaults",{"type":17,"tag":84,"props":2720,"children":2721},{},[2722],{"type":23,"value":2723},"different filtering capabilities",{"type":17,"tag":84,"props":2725,"children":2726},{},[2727],{"type":23,"value":2728},"different ordering behavior",{"type":17,"tag":29,"props":2730,"children":2731},{},[2732],{"type":23,"value":2733},"To support them, teams end up building:",{"type":17,"tag":80,"props":2735,"children":2736},{},[2737,2742,2747],{"type":17,"tag":84,"props":2738,"children":2739},{},[2740],{"type":23,"value":2741},"custom iteration logic per API",{"type":17,"tag":84,"props":2743,"children":2744},{},[2745],{"type":23,"value":2746},"custom retry and checkpoint systems",{"type":17,"tag":84,"props":2748,"children":2749},{},[2750],{"type":23,"value":2751},"custom filtering and sorting handling",{"type":17,"tag":29,"props":2753,"children":2754},{},[2755],{"type":23,"value":2756},"This compounds quickly as integrations grow.",{"type":17,"tag":68,"props":2758,"children":2760},{"id":2759},"what-a-scalable-approach-requires",[2761],{"type":23,"value":2762},"What a Scalable Approach Requires",{"type":17,"tag":29,"props":2764,"children":2765},{},[2766],{"type":23,"value":2767},"To make pagination reliable across systems, teams typically introduce a normalized data access layer.",{"type":17,"tag":29,"props":2769,"children":2770},{},[2771],{"type":23,"value":2772},"This layer standardizes how data is retrieved, regardless of how each API behaves underneath.",{"type":17,"tag":29,"props":2774,"children":2775},{},[2776],{"type":23,"value":2777},"In practice, this means exposing a consistent interface for:",{"type":17,"tag":80,"props":2779,"children":2780},{},[2781,2786,2791,2796,2801],{"type":17,"tag":84,"props":2782,"children":2783},{},[2784],{"type":23,"value":2785},"controlling page size (limit)",{"type":17,"tag":84,"props":2787,"children":2788},{},[2789],{"type":23,"value":2790},"defining position (offset or equivalent abstraction)",{"type":17,"tag":84,"props":2792,"children":2793},{},[2794],{"type":23,"value":2795},"filtering by time ranges (e.g. updated_gte)",{"type":17,"tag":84,"props":2797,"children":2798},{},[2799],{"type":23,"value":2800},"lightweight search (query)",{"type":17,"tag":84,"props":2802,"children":2803},{},[2804],{"type":23,"value":2805},"deterministic sorting (sort and order)",{"type":17,"tag":29,"props":2807,"children":2808},{},[2809],{"type":23,"value":2810},"The goal is not to eliminate differences between APIs, but to provide a consistent way to interact with them.",{"type":17,"tag":68,"props":2812,"children":2814},{"id":2813},"a-more-reliable-model-for-data-access",[2815],{"type":23,"value":2816},"A More Reliable Model for Data Access",{"type":17,"tag":29,"props":2818,"children":2819},{},[2820],{"type":23,"value":2821},"In systems that support many integrations, pagination is treated as part of a broader data access pattern.",{"type":17,"tag":29,"props":2823,"children":2824},{},[2825],{"type":23,"value":2826},"Instead of relying on each API for complex querying or filtering, teams typically:",{"type":17,"tag":80,"props":2828,"children":2829},{},[2830,2835,2840],{"type":17,"tag":84,"props":2831,"children":2832},{},[2833],{"type":23,"value":2834},"use pagination to retrieve data incrementally",{"type":17,"tag":84,"props":2836,"children":2837},{},[2838],{"type":23,"value":2839},"synchronize data into their own systems",{"type":17,"tag":84,"props":2841,"children":2842},{},[2843],{"type":23,"value":2844},"perform filtering, querying, and joins internally",{"type":17,"tag":29,"props":2846,"children":2847},{},[2848],{"type":23,"value":2849},"This approach provides:",{"type":17,"tag":80,"props":2851,"children":2852},{},[2853,2858,2863],{"type":17,"tag":84,"props":2854,"children":2855},{},[2856],{"type":23,"value":2857},"consistent query performance",{"type":17,"tag":84,"props":2859,"children":2860},{},[2861],{"type":23,"value":2862},"full control over data access patterns",{"type":17,"tag":84,"props":2864,"children":2865},{},[2866],{"type":23,"value":2867},"independence from integration-specific limitations",{"type":17,"tag":29,"props":2869,"children":2870},{},[2871],{"type":23,"value":2872},"It also reduces reliance on API-specific pagination behavior, which is often inconsistent.",{"type":17,"tag":68,"props":2874,"children":2875},{"id":2190},[2876],{"type":23,"value":2193},{"type":17,"tag":29,"props":2878,"children":2879},{},[2880],{"type":23,"value":2881},"Rather than handling pagination differently for every integration, developers interact with a consistent set of parameters and behaviors.",{"type":17,"tag":29,"props":2883,"children":2884},{},[2885],{"type":23,"value":2886},"The underlying APIs may still use:",{"type":17,"tag":80,"props":2888,"children":2889},{},[2890,2895,2900,2905],{"type":17,"tag":84,"props":2891,"children":2892},{},[2893],{"type":23,"value":2894},"cursors",{"type":17,"tag":84,"props":2896,"children":2897},{},[2898],{"type":23,"value":2899},"offsets",{"type":17,"tag":84,"props":2901,"children":2902},{},[2903],{"type":23,"value":2904},"page numbers",{"type":17,"tag":84,"props":2906,"children":2907},{},[2908],{"type":23,"value":2909},"links",{"type":17,"tag":29,"props":2911,"children":2912},{},[2913],{"type":23,"value":2914},"But the access pattern remains predictable.",{"type":17,"tag":29,"props":2916,"children":2917},{},[2918],{"type":23,"value":2919},"This removes the need to:",{"type":17,"tag":80,"props":2921,"children":2922},{},[2923,2928,2933],{"type":17,"tag":84,"props":2924,"children":2925},{},[2926],{"type":23,"value":2927},"write custom pagination logic per API",{"type":17,"tag":84,"props":2929,"children":2930},{},[2931],{"type":23,"value":2932},"handle different retry strategies",{"type":17,"tag":84,"props":2934,"children":2935},{},[2936],{"type":23,"value":2937},"manage inconsistent filtering capabilities",{"type":17,"tag":29,"props":2939,"children":2940},{},[2941],{"type":23,"value":2942},"Instead, pagination becomes a standardized part of the system rather than a per-integration concern.",{"type":17,"tag":239,"props":2944,"children":2946},{"id":2945},"pagination-is-simple-at-the-api-level",[2947],{"type":23,"value":2948},"Pagination is simple at the API level",{"type":17,"tag":29,"props":2950,"children":2951},{},[2952],{"type":23,"value":2953},"It becomes complex when it sits inside systems that depend on complete, ordered, and reliable data across many integrations.",{"type":17,"tag":29,"props":2955,"children":2956},{},[2957],{"type":23,"value":2958},"At that point, it's no longer just about fetching pages. It's about ensuring consistency, correctness, and control across your entire data layer.",{"type":17,"tag":29,"props":2960,"children":2961},{},[2962,2963],{"type":23,"value":1609},{"type":17,"tag":133,"props":2964,"children":2966},{"href":1612,"rel":2965},[214],[2967],{"type":23,"value":1616},{"type":17,"tag":29,"props":2969,"children":2970},{},[2971,2972],{"type":23,"value":1609},{"type":17,"tag":133,"props":2973,"children":2975},{"href":1623,"rel":2974},[214],[2976],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":2978},[2979,2980,2987,2988,2989,2990,2991],{"id":2424,"depth":1629,"text":2427},{"id":2468,"depth":1629,"text":2471,"children":2981},[2982,2983,2984,2985,2986],{"id":2479,"depth":1635,"text":2482},{"id":2513,"depth":1635,"text":2516},{"id":2547,"depth":1635,"text":2550},{"id":2590,"depth":1635,"text":2593},{"id":2624,"depth":1635,"text":2627},{"id":2658,"depth":1629,"text":2661},{"id":2697,"depth":1629,"text":2700},{"id":2759,"depth":1629,"text":2762},{"id":2813,"depth":1629,"text":2816},{"id":2190,"depth":1629,"text":2193,"children":2992},[2993],{"id":2945,"depth":1635,"text":2948},"content:blog:api_pagination_why_it_breaks_multi_integration_systems_and_how_to_fix_it.md","blog/api_pagination_why_it_breaks_multi_integration_systems_and_how_to_fix_it.md","blog/api_pagination_why_it_breaks_multi_integration_systems_and_how_to_fix_it",{"_path":2998,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2999,"description":3000,"img":3001,"date":3002,"tag":12,"body":3003,"_type":1677,"_id":3649,"_source":1679,"_file":3650,"_stem":3651,"_extension":1682},"/blog/sdks_for_api_integrations_when_they_help_where_they_break_and_how_to_avoid_sdk_sprawl","SDKs for API Integrations: When They Help, Where They Break, and How to Avoid SDK Sprawl","SDKs are one of the first tools developers reach for when building API integrations. They simplify requests, provide typed interfaces, and reduce the need to...","https://s3.us-east-2.amazonaws.com/unified-article-images/sdks_for_api_integrations_when_they_help_where_they_break_and_how_to_avoid_sdk_sprawl-icon.png","2026-04-07T01:33:00.000Z",{"type":14,"children":3004,"toc":3637},[3005,3010,3013,3020,3025,3030,3036,3041,3046,3080,3085,3091,3096,3101,3106,3145,3156,3162,3167,3172,3205,3210,3233,3238,3243,3249,3254,3259,3292,3297,3302,3325,3330,3336,3341,3364,3369,3375,3380,3408,3413,3422,3427,3433,3438,3443,3466,3471,3477,3482,3487,3492,3515,3520,3543,3548,3554,3559,3564,3569,3574,3582,3587,3595,3599,3604,3609,3614,3619,3628],{"type":17,"tag":18,"props":3006,"children":3008},{"id":3007},"sdks-for-api-integrations-when-they-help-where-they-break-and-how-to-avoid-sdk-sprawl",[3009],{"type":23,"value":2999},{"type":17,"tag":25,"props":3011,"children":3012},{},[],{"type":17,"tag":29,"props":3014,"children":3015},{},[3016],{"type":17,"tag":33,"props":3017,"children":3018},{},[3019],{"type":23,"value":1707},{"type":17,"tag":29,"props":3021,"children":3022},{},[3023],{"type":23,"value":3024},"SDKs are one of the first tools developers reach for when building API integrations. They simplify requests, provide typed interfaces, and reduce the need to manually construct HTTP calls. For a single integration, they work well. But as soon as a SaaS product needs to support multiple integrations, SDKs introduce a different kind of complexity—one that most teams underestimate.",{"type":17,"tag":29,"props":3026,"children":3027},{},[3028],{"type":23,"value":3029},"This article explains where SDKs help, where they fall short in multi-integration environments, and how to think about them when building integrations at scale.",{"type":17,"tag":68,"props":3031,"children":3033},{"id":3032},"what-sdks-actually-solve",[3034],{"type":23,"value":3035},"What SDKs Actually Solve",{"type":17,"tag":29,"props":3037,"children":3038},{},[3039],{"type":23,"value":3040},"An SDK is a wrapper around an API that improves developer ergonomics. Instead of constructing raw HTTP requests, developers can use pre-built functions and typed models.",{"type":17,"tag":29,"props":3042,"children":3043},{},[3044],{"type":23,"value":3045},"In practice, SDKs help with:",{"type":17,"tag":80,"props":3047,"children":3048},{},[3049,3054,3059,3070,3075],{"type":17,"tag":84,"props":3050,"children":3051},{},[3052],{"type":23,"value":3053},"Structuring requests and responses",{"type":17,"tag":84,"props":3055,"children":3056},{},[3057],{"type":23,"value":3058},"Handling authentication flows",{"type":17,"tag":84,"props":3060,"children":3061},{},[3062,3064,3068],{"type":23,"value":3063},"Managing ",{"type":17,"tag":133,"props":3065,"children":3066},{"href":1857},[3067],{"type":23,"value":1860},{"type":23,"value":3069}," and retries",{"type":17,"tag":84,"props":3071,"children":3072},{},[3073],{"type":23,"value":3074},"Providing autocomplete and type safety in IDEs",{"type":17,"tag":84,"props":3076,"children":3077},{},[3078],{"type":23,"value":3079},"Reducing errors in request formatting",{"type":17,"tag":29,"props":3081,"children":3082},{},[3083],{"type":23,"value":3084},"For a single API, this is a meaningful improvement. Developers can move faster, write less boilerplate, and avoid common mistakes.",{"type":17,"tag":68,"props":3086,"children":3088},{"id":3087},"where-sdks-start-to-break-down",[3089],{"type":23,"value":3090},"Where SDKs Start to Break Down",{"type":17,"tag":29,"props":3092,"children":3093},{},[3094],{"type":23,"value":3095},"The limitation is not in any single SDK. It's what happens when you use many of them.",{"type":17,"tag":29,"props":3097,"children":3098},{},[3099],{"type":23,"value":3100},"Most SaaS products don't integrate with just one API. They integrate with dozens across categories like CRM, HRIS, ATS, ticketing, file storage, and billing. Each provider introduces its own SDK, its own conventions, and its own edge cases.",{"type":17,"tag":29,"props":3102,"children":3103},{},[3104],{"type":23,"value":3105},"At that point, SDK usage becomes fragmented:",{"type":17,"tag":80,"props":3107,"children":3108},{},[3109,3114,3125,3130,3135,3140],{"type":17,"tag":84,"props":3110,"children":3111},{},[3112],{"type":23,"value":3113},"Different naming conventions across SDKs",{"type":17,"tag":84,"props":3115,"children":3116},{},[3117,3119,3123],{"type":23,"value":3118},"Different authentication models (",{"type":17,"tag":133,"props":3120,"children":3121},{"href":779},[3122],{"type":23,"value":782},{"type":23,"value":3124},", API keys, custom flows)",{"type":17,"tag":84,"props":3126,"children":3127},{},[3128],{"type":23,"value":3129},"Different pagination and filtering logic",{"type":17,"tag":84,"props":3131,"children":3132},{},[3133],{"type":23,"value":3134},"Different data schemas for similar objects",{"type":17,"tag":84,"props":3136,"children":3137},{},[3138],{"type":23,"value":3139},"Inconsistent error handling and retry behavior",{"type":17,"tag":84,"props":3141,"children":3142},{},[3143],{"type":23,"value":3144},"Varying SDK quality, completeness, and maintenance",{"type":17,"tag":29,"props":3146,"children":3147},{},[3148,3150,3155],{"type":23,"value":3149},"SDKs make individual integrations easier. They do not make ",{"type":17,"tag":48,"props":3151,"children":3152},{},[3153],{"type":23,"value":3154},"multiple integrations consistent",{"type":23,"value":54},{"type":17,"tag":68,"props":3157,"children":3159},{"id":3158},"the-hidden-cost-sdk-sprawl",[3160],{"type":23,"value":3161},"The Hidden Cost: SDK Sprawl",{"type":17,"tag":29,"props":3163,"children":3164},{},[3165],{"type":23,"value":3166},"SDK sprawl is what happens when your system depends on many provider-specific SDKs at once.",{"type":17,"tag":29,"props":3168,"children":3169},{},[3170],{"type":23,"value":3171},"If your product integrates with:",{"type":17,"tag":80,"props":3173,"children":3174},{},[3175,3180,3185,3190,3195,3200],{"type":17,"tag":84,"props":3176,"children":3177},{},[3178],{"type":23,"value":3179},"Salesforce",{"type":17,"tag":84,"props":3181,"children":3182},{},[3183],{"type":23,"value":3184},"HubSpot",{"type":17,"tag":84,"props":3186,"children":3187},{},[3188],{"type":23,"value":3189},"Greenhouse",{"type":17,"tag":84,"props":3191,"children":3192},{},[3193],{"type":23,"value":3194},"BambooHR",{"type":17,"tag":84,"props":3196,"children":3197},{},[3198],{"type":23,"value":3199},"QuickBooks",{"type":17,"tag":84,"props":3201,"children":3202},{},[3203],{"type":23,"value":3204},"Slack",{"type":17,"tag":29,"props":3206,"children":3207},{},[3208],{"type":23,"value":3209},"You are not working with 'an SDK.' You are maintaining six different SDKs, each with:",{"type":17,"tag":80,"props":3211,"children":3212},{},[3213,3218,3223,3228],{"type":17,"tag":84,"props":3214,"children":3215},{},[3216],{"type":23,"value":3217},"Its own release cycle",{"type":17,"tag":84,"props":3219,"children":3220},{},[3221],{"type":23,"value":3222},"Its own breaking changes",{"type":17,"tag":84,"props":3224,"children":3225},{},[3226],{"type":23,"value":3227},"Its own documentation gaps",{"type":17,"tag":84,"props":3229,"children":3230},{},[3231],{"type":23,"value":3232},"Its own quirks",{"type":17,"tag":29,"props":3234,"children":3235},{},[3236],{"type":23,"value":3237},"Your engineering effort shifts from building product features to managing integration surface area.",{"type":17,"tag":29,"props":3239,"children":3240},{},[3241],{"type":23,"value":3242},"This is where most integration complexity actually comes from—not from calling APIs, but from reconciling differences between them.",{"type":17,"tag":68,"props":3244,"children":3246},{"id":3245},"why-sdks-dont-solve-cross-system-integration",[3247],{"type":23,"value":3248},"Why SDKs Don't Solve Cross-System Integration",{"type":17,"tag":29,"props":3250,"children":3251},{},[3252],{"type":23,"value":3253},"SDKs operate at the provider level. They improve how you call a specific API, but they do not address differences between APIs.",{"type":17,"tag":29,"props":3255,"children":3256},{},[3257],{"type":23,"value":3258},"For example:",{"type":17,"tag":80,"props":3260,"children":3261},{},[3262,3267,3272,3282,3287],{"type":17,"tag":84,"props":3263,"children":3264},{},[3265],{"type":23,"value":3266},"A 'contact' in one CRM is not structured the same as a 'contact' in another",{"type":17,"tag":84,"props":3268,"children":3269},{},[3270],{"type":23,"value":3271},"Pagination strategies differ (cursor vs offset vs token-based)",{"type":17,"tag":84,"props":3273,"children":3274},{},[3275,3280],{"type":17,"tag":133,"props":3276,"children":3277},{"href":135},[3278],{"type":23,"value":3279},"Rate limits",{"type":23,"value":3281}," behave differently",{"type":17,"tag":84,"props":3283,"children":3284},{},[3285],{"type":23,"value":3286},"Webhook payloads vary in structure and timing",{"type":17,"tag":84,"props":3288,"children":3289},{},[3290],{"type":23,"value":3291},"Field names and required properties are inconsistent",{"type":17,"tag":29,"props":3293,"children":3294},{},[3295],{"type":23,"value":3296},"SDKs expose these differences more cleanly, but they don't remove them.",{"type":17,"tag":29,"props":3298,"children":3299},{},[3300],{"type":23,"value":3301},"As a result, developers still have to:",{"type":17,"tag":80,"props":3303,"children":3304},{},[3305,3310,3315,3320],{"type":17,"tag":84,"props":3306,"children":3307},{},[3308],{"type":23,"value":3309},"Map fields across systems",{"type":17,"tag":84,"props":3311,"children":3312},{},[3313],{"type":23,"value":3314},"Normalize data models",{"type":17,"tag":84,"props":3316,"children":3317},{},[3318],{"type":23,"value":3319},"Handle provider-specific edge cases",{"type":17,"tag":84,"props":3321,"children":3322},{},[3323],{"type":23,"value":3324},"Maintain separate logic paths per integration",{"type":17,"tag":29,"props":3326,"children":3327},{},[3328],{"type":23,"value":3329},"SDKs reduce friction at the call level. They do not reduce complexity at the system level.",{"type":17,"tag":68,"props":3331,"children":3333},{"id":3332},"when-provider-sdks-are-the-right-choice",[3334],{"type":23,"value":3335},"When Provider SDKs Are the Right Choice",{"type":17,"tag":29,"props":3337,"children":3338},{},[3339],{"type":23,"value":3340},"Provider SDKs are still the right tool in certain scenarios:",{"type":17,"tag":80,"props":3342,"children":3343},{},[3344,3349,3354,3359],{"type":17,"tag":84,"props":3345,"children":3346},{},[3347],{"type":23,"value":3348},"You are integrating with one or two APIs",{"type":17,"tag":84,"props":3350,"children":3351},{},[3352],{"type":23,"value":3353},"You need deep, provider-specific functionality",{"type":17,"tag":84,"props":3355,"children":3356},{},[3357],{"type":23,"value":3358},"You are building internal tools or one-off integrations",{"type":17,"tag":84,"props":3360,"children":3361},{},[3362],{"type":23,"value":3363},"The integration surface area is limited",{"type":17,"tag":29,"props":3365,"children":3366},{},[3367],{"type":23,"value":3368},"In these cases, the overhead of managing multiple SDKs is low, and the benefits of direct access are high.",{"type":17,"tag":68,"props":3370,"children":3372},{"id":3371},"when-sdks-become-a-bottleneck",[3373],{"type":23,"value":3374},"When SDKs Become a Bottleneck",{"type":17,"tag":29,"props":3376,"children":3377},{},[3378],{"type":23,"value":3379},"SDKs become a bottleneck when:",{"type":17,"tag":80,"props":3381,"children":3382},{},[3383,3388,3393,3398,3403],{"type":17,"tag":84,"props":3384,"children":3385},{},[3386],{"type":23,"value":3387},"You support many integrations in the same category",{"type":17,"tag":84,"props":3389,"children":3390},{},[3391],{"type":23,"value":3392},"You are building a multi-tenant SaaS product",{"type":17,"tag":84,"props":3394,"children":3395},{},[3396],{"type":23,"value":3397},"You need consistent behavior across providers",{"type":17,"tag":84,"props":3399,"children":3400},{},[3401],{"type":23,"value":3402},"You are shipping integration-powered product features (not just data access)",{"type":17,"tag":84,"props":3404,"children":3405},{},[3406],{"type":23,"value":3407},"You need real-time reads and writes across systems",{"type":17,"tag":29,"props":3409,"children":3410},{},[3411],{"type":23,"value":3412},"At this stage, the problem shifts from 'how do we call this API?' to:",{"type":17,"tag":3414,"props":3415,"children":3416},"blockquote",{},[3417],{"type":17,"tag":29,"props":3418,"children":3419},{},[3420],{"type":23,"value":3421},"'How do we make all of these APIs behave consistently?'",{"type":17,"tag":29,"props":3423,"children":3424},{},[3425],{"type":23,"value":3426},"SDKs alone cannot answer that.",{"type":17,"tag":68,"props":3428,"children":3430},{"id":3429},"a-different-model-one-sdk-on-top-of-many-apis",[3431],{"type":23,"value":3432},"A Different Model: One SDK on Top of Many APIs",{"type":17,"tag":29,"props":3434,"children":3435},{},[3436],{"type":23,"value":3437},"Instead of using one SDK per provider, another approach is to use a single SDK that sits on top of a normalized API layer.",{"type":17,"tag":29,"props":3439,"children":3440},{},[3441],{"type":23,"value":3442},"In this model:",{"type":17,"tag":80,"props":3444,"children":3445},{},[3446,3451,3456,3461],{"type":17,"tag":84,"props":3447,"children":3448},{},[3449],{"type":23,"value":3450},"APIs across providers are normalized into common object models",{"type":17,"tag":84,"props":3452,"children":3453},{},[3454],{"type":23,"value":3455},"Authentication is handled through a consistent interface",{"type":17,"tag":84,"props":3457,"children":3458},{},[3459],{"type":23,"value":3460},"Pagination, filtering, and request patterns are standardized",{"type":17,"tag":84,"props":3462,"children":3463},{},[3464],{"type":23,"value":3465},"Developers interact with one SDK instead of many",{"type":17,"tag":29,"props":3467,"children":3468},{},[3469],{"type":23,"value":3470},"The SDK becomes an access layer—not to one API, but to an entire category of integrations.",{"type":17,"tag":68,"props":3472,"children":3474},{"id":3473},"a-different-model-one-sdk-on-top-of-415-apis",[3475],{"type":23,"value":3476},"A Different Model: One SDK on Top of 415+ APIs",{"type":17,"tag":29,"props":3478,"children":3479},{},[3480],{"type":23,"value":3481},"Unified follows this model.",{"type":17,"tag":29,"props":3483,"children":3484},{},[3485],{"type":23,"value":3486},"Instead of exposing separate SDKs per provider, Unified provides SDKs that sit on top of its unified APIs across categories like CRM, ATS, HRIS, ticketing, file storage, and more.",{"type":17,"tag":29,"props":3488,"children":3489},{},[3490],{"type":23,"value":3491},"Developers can:",{"type":17,"tag":80,"props":3493,"children":3494},{},[3495,3500,3505,3510],{"type":17,"tag":84,"props":3496,"children":3497},{},[3498],{"type":23,"value":3499},"Use a single SDK across multiple integrations",{"type":17,"tag":84,"props":3501,"children":3502},{},[3503],{"type":23,"value":3504},"Work with normalized objects instead of provider-specific schemas",{"type":17,"tag":84,"props":3506,"children":3507},{},[3508],{"type":23,"value":3509},"Avoid rewriting logic for each integration",{"type":17,"tag":84,"props":3511,"children":3512},{},[3513],{"type":23,"value":3514},"Rely on consistent patterns for authentication, pagination, and data access",{"type":17,"tag":29,"props":3516,"children":3517},{},[3518],{"type":23,"value":3519},"Under the hood, Unified handles:",{"type":17,"tag":80,"props":3521,"children":3522},{},[3523,3528,3533,3538],{"type":17,"tag":84,"props":3524,"children":3525},{},[3526],{"type":23,"value":3527},"Provider differences",{"type":17,"tag":84,"props":3529,"children":3530},{},[3531],{"type":23,"value":3532},"Schema normalization",{"type":17,"tag":84,"props":3534,"children":3535},{},[3536],{"type":23,"value":3537},"Authentication flows",{"type":17,"tag":84,"props":3539,"children":3540},{},[3541],{"type":23,"value":3542},"Integration infrastructure",{"type":17,"tag":29,"props":3544,"children":3545},{},[3546],{"type":23,"value":3547},"The SDK is simply the interface developers use to access that system.",{"type":17,"tag":68,"props":3549,"children":3551},{"id":3550},"sdks-are-still-usefulbut-theyre-not-the-solution",[3552],{"type":23,"value":3553},"SDKs Are Still Useful—But They're Not the Solution",{"type":17,"tag":29,"props":3555,"children":3556},{},[3557],{"type":23,"value":3558},"SDKs are valuable tools. They improve developer experience and reduce friction when interacting with APIs.",{"type":17,"tag":29,"props":3560,"children":3561},{},[3562],{"type":23,"value":3563},"But they are not a solution to integration complexity at scale.",{"type":17,"tag":29,"props":3565,"children":3566},{},[3567],{"type":23,"value":3568},"The real challenge is not calling APIs—it's managing the differences between them.",{"type":17,"tag":29,"props":3570,"children":3571},{},[3572],{"type":23,"value":3573},"Once you reach that stage, the question is no longer:",{"type":17,"tag":3414,"props":3575,"children":3576},{},[3577],{"type":17,"tag":29,"props":3578,"children":3579},{},[3580],{"type":23,"value":3581},"'Should we use an SDK?'",{"type":17,"tag":29,"props":3583,"children":3584},{},[3585],{"type":23,"value":3586},"It becomes:",{"type":17,"tag":3414,"props":3588,"children":3589},{},[3590],{"type":17,"tag":29,"props":3591,"children":3592},{},[3593],{"type":23,"value":3594},"'How many SDKs do we want to maintain?'",{"type":17,"tag":68,"props":3596,"children":3597},{"id":2316},[3598],{"type":23,"value":2319},{"type":17,"tag":29,"props":3600,"children":3601},{},[3602],{"type":23,"value":3603},"SDKs help you call APIs faster and more reliably. But in multi-integration systems, they introduce fragmentation rather than removing it.",{"type":17,"tag":29,"props":3605,"children":3606},{},[3607],{"type":23,"value":3608},"For small integration surfaces, provider SDKs are sufficient.",{"type":17,"tag":29,"props":3610,"children":3611},{},[3612],{"type":23,"value":3613},"For products that depend on many integrations, the better approach is to reduce the number of APIs—and SDKs—you have to think about.",{"type":17,"tag":29,"props":3615,"children":3616},{},[3617],{"type":23,"value":3618},"That shift is what turns integrations from an engineering burden into a scalable part of your product.",{"type":17,"tag":29,"props":3620,"children":3621},{},[3622,3623],{"type":23,"value":1609},{"type":17,"tag":133,"props":3624,"children":3626},{"href":1612,"rel":3625},[214],[3627],{"type":23,"value":1616},{"type":17,"tag":29,"props":3629,"children":3630},{},[3631,3632],{"type":23,"value":1609},{"type":17,"tag":133,"props":3633,"children":3635},{"href":1623,"rel":3634},[214],[3636],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":3638},[3639,3640,3641,3642,3643,3644,3645,3646,3647,3648],{"id":3032,"depth":1629,"text":3035},{"id":3087,"depth":1629,"text":3090},{"id":3158,"depth":1629,"text":3161},{"id":3245,"depth":1629,"text":3248},{"id":3332,"depth":1629,"text":3335},{"id":3371,"depth":1629,"text":3374},{"id":3429,"depth":1629,"text":3432},{"id":3473,"depth":1629,"text":3476},{"id":3550,"depth":1629,"text":3553},{"id":2316,"depth":1629,"text":2319},"content:blog:sdks_for_api_integrations_when_they_help_where_they_break_and_how_to_avoid_sdk_sprawl.md","blog/sdks_for_api_integrations_when_they_help_where_they_break_and_how_to_avoid_sdk_sprawl.md","blog/sdks_for_api_integrations_when_they_help_where_they_break_and_how_to_avoid_sdk_sprawl",{"_path":3653,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3654,"description":3655,"img":3656,"date":3657,"tag":12,"body":3658,"_type":1677,"_id":4385,"_source":1679,"_file":4386,"_stem":4387,"_extension":1682},"/blog/why_ai_agents_fail_without_cross_system_identity_resolution","Why AI Agents Fail Without Cross-System Identity Resolution","AI agents rely on being able to retrieve and act on the correct entity. In real SaaS environments, that assumption often breaks. The same person or company...","https://s3.us-east-2.amazonaws.com/unified-article-images/why_ai_agents_fail_without_cross_system_identity_resolution-icon.png","2026-04-07T00:57:00.000Z",{"type":14,"children":3659,"toc":4348},[3660,3665,3668,3675,3680,3686,3691,3714,3719,3724,3752,3757,3763,3768,3774,3779,3797,3802,3808,3813,3819,3824,3829,3834,3839,3845,3850,3856,3861,3867,3896,3902,3907,3912,3917,3922,3927,3932,3938,3943,3949,3954,3960,3965,3988,3994,3999,4004,4010,4015,4033,4039,4044,4050,4055,4061,4066,4072,4077,4083,4088,4094,4099,4105,4110,4116,4121,4139,4144,4149,4155,4160,4166,4171,4176,4182,4187,4192,4198,4211,4216,4222,4227,4232,4238,4243,4248,4253,4258,4263,4281,4286,4291,4295,4300,4305,4310,4315,4320,4325,4330,4339],{"type":17,"tag":18,"props":3661,"children":3663},{"id":3662},"why-ai-agents-fail-without-cross-system-identity-resolution",[3664],{"type":23,"value":3654},{"type":17,"tag":25,"props":3666,"children":3667},{},[],{"type":17,"tag":29,"props":3669,"children":3670},{},[3671],{"type":17,"tag":33,"props":3672,"children":3673},{},[3674],{"type":23,"value":1707},{"type":17,"tag":29,"props":3676,"children":3677},{},[3678],{"type":23,"value":3679},"AI agents rely on being able to retrieve and act on the correct entity. In real SaaS environments, that assumption often breaks. The same person or company exists across CRM, HRIS, ATS, support tools, and internal systems—each with different identifiers, schemas, and lifecycle states. Without a way to resolve identity across those systems, agents operate on fragmented or duplicate records. The result is not just bad data. It is incorrect execution.",{"type":17,"tag":68,"props":3681,"children":3683},{"id":3682},"the-hidden-problem-one-entity-many-representations",[3684],{"type":23,"value":3685},"The Hidden Problem: One Entity, Many Representations",{"type":17,"tag":29,"props":3687,"children":3688},{},[3689],{"type":23,"value":3690},"Every SaaS system models identity differently.",{"type":17,"tag":80,"props":3692,"children":3693},{},[3694,3699,3704,3709],{"type":17,"tag":84,"props":3695,"children":3696},{},[3697],{"type":23,"value":3698},"CRM: leads, contacts, accounts",{"type":17,"tag":84,"props":3700,"children":3701},{},[3702],{"type":23,"value":3703},"HRIS: employees with internal IDs",{"type":17,"tag":84,"props":3705,"children":3706},{},[3707],{"type":23,"value":3708},"ATS: candidates with application records",{"type":17,"tag":84,"props":3710,"children":3711},{},[3712],{"type":23,"value":3713},"Support tools: end-users tied to tickets",{"type":17,"tag":29,"props":3715,"children":3716},{},[3717],{"type":23,"value":3718},"Each system assigns its own identifiers. Some rely on email. Others use internal IDs or composite keys. These identifiers are not designed to align across systems",{"type":17,"tag":29,"props":3720,"children":3721},{},[3722],{"type":23,"value":3723},"A single person may exist as:",{"type":17,"tag":80,"props":3725,"children":3726},{},[3727,3732,3737,3742,3747],{"type":17,"tag":84,"props":3728,"children":3729},{},[3730],{"type":23,"value":3731},"a CRM contact",{"type":17,"tag":84,"props":3733,"children":3734},{},[3735],{"type":23,"value":3736},"an HRIS employee",{"type":17,"tag":84,"props":3738,"children":3739},{},[3740],{"type":23,"value":3741},"an ATS candidate",{"type":17,"tag":84,"props":3743,"children":3744},{},[3745],{"type":23,"value":3746},"a support requester",{"type":17,"tag":84,"props":3748,"children":3749},{},[3750],{"type":23,"value":3751},"a billing account",{"type":17,"tag":29,"props":3753,"children":3754},{},[3755],{"type":23,"value":3756},"There is no built-in guarantee these records are linked.",{"type":17,"tag":68,"props":3758,"children":3760},{"id":3759},"why-identifiers-break-down",[3761],{"type":23,"value":3762},"Why Identifiers Break Down",{"type":17,"tag":29,"props":3764,"children":3765},{},[3766],{"type":23,"value":3767},"At first glance, matching identities seems simple. In practice, identifiers are inconsistent and unstable.",{"type":17,"tag":239,"props":3769,"children":3771},{"id":3770},"email-is-not-a-reliable-key",[3772],{"type":23,"value":3773},"Email is not a reliable key",{"type":17,"tag":29,"props":3775,"children":3776},{},[3777],{"type":23,"value":3778},"Many systems use email as a primary identifier. This breaks when:",{"type":17,"tag":80,"props":3780,"children":3781},{},[3782,3787,3792],{"type":17,"tag":84,"props":3783,"children":3784},{},[3785],{"type":23,"value":3786},"emails change (role changes, rehires)",{"type":17,"tag":84,"props":3788,"children":3789},{},[3790],{"type":23,"value":3791},"different systems use personal vs work emails",{"type":17,"tag":84,"props":3793,"children":3794},{},[3795],{"type":23,"value":3796},"formatting differs (case sensitivity, typos)",{"type":17,"tag":29,"props":3798,"children":3799},{},[3800],{"type":23,"value":3801},"Even small variations create separate records",{"type":17,"tag":239,"props":3803,"children":3805},{"id":3804},"system-generated-ids-do-not-translate",[3806],{"type":23,"value":3807},"System-generated IDs do not translate",{"type":17,"tag":29,"props":3809,"children":3810},{},[3811],{"type":23,"value":3812},"Each platform generates its own internal ID. These IDs are isolated and cannot be used across systems. There is no shared reference key.",{"type":17,"tag":239,"props":3814,"children":3816},{"id":3815},"data-formats-and-fields-differ",[3817],{"type":23,"value":3818},"Data formats and fields differ",{"type":17,"tag":29,"props":3820,"children":3821},{},[3822],{"type":23,"value":3823},"Differences in formatting—phone numbers, addresses, names—create mismatches.",{"type":17,"tag":29,"props":3825,"children":3826},{},[3827],{"type":23,"value":3828},"'John Smith' vs 'Jon Smith'",{"type":17,"tag":29,"props":3830,"children":3831},{},[3832],{"type":23,"value":3833},"'123 Main St' vs '123 Main Street'",{"type":17,"tag":29,"props":3835,"children":3836},{},[3837],{"type":23,"value":3838},"These variations prevent deterministic matching and introduce duplication",{"type":17,"tag":239,"props":3840,"children":3842},{"id":3841},"identities-evolve-over-time",[3843],{"type":23,"value":3844},"Identities evolve over time",{"type":17,"tag":29,"props":3846,"children":3847},{},[3848],{"type":23,"value":3849},"Employees change roles. Customers change emails. Candidates become employees. Records shift across lifecycle stages, creating multiple representations of the same entity.",{"type":17,"tag":68,"props":3851,"children":3853},{"id":3852},"what-happens-without-identity-resolution",[3854],{"type":23,"value":3855},"What Happens Without Identity Resolution",{"type":17,"tag":29,"props":3857,"children":3858},{},[3859],{"type":23,"value":3860},"When systems are not linked, duplication and fragmentation emerge.",{"type":17,"tag":239,"props":3862,"children":3864},{"id":3863},"duplicate-records-inside-systems",[3865],{"type":23,"value":3866},"Duplicate records inside systems",{"type":17,"tag":80,"props":3868,"children":3869},{},[3870,3875,3880,3885],{"type":17,"tag":84,"props":3871,"children":3872},{},[3873],{"type":23,"value":3874},"CRM contacts created multiple times",{"type":17,"tag":84,"props":3876,"children":3877},{},[3878],{"type":23,"value":3879},"ATS candidate duplicates from different sources",{"type":17,"tag":84,"props":3881,"children":3882},{},[3883],{"type":23,"value":3884},"HRIS employee duplicates across onboarding cycles",{"type":17,"tag":84,"props":3886,"children":3887},{},[3888,3890,3894],{"type":23,"value":3889},"Support tickets created across channels",{"type":17,"tag":3891,"props":3892,"children":3893},"br",{},[],{"type":23,"value":3895},"These duplicates lead to inconsistent data and conflicting actions",{"type":17,"tag":239,"props":3897,"children":3899},{"id":3898},"fragmentation-across-systems",[3900],{"type":23,"value":3901},"Fragmentation across systems",{"type":17,"tag":29,"props":3903,"children":3904},{},[3905],{"type":23,"value":3906},"The same entity exists in multiple systems with no linkage.",{"type":17,"tag":29,"props":3908,"children":3909},{},[3910],{"type":23,"value":3911},"One system sees a purchase history.",{"type":17,"tag":29,"props":3913,"children":3914},{},[3915],{"type":23,"value":3916},"Another sees support interactions.",{"type":17,"tag":29,"props":3918,"children":3919},{},[3920],{"type":23,"value":3921},"Another tracks employment status.",{"type":17,"tag":29,"props":3923,"children":3924},{},[3925],{"type":23,"value":3926},"No system has the full picture.",{"type":17,"tag":29,"props":3928,"children":3929},{},[3930],{"type":23,"value":3931},"In a real-world case, a single customer existed across CRM, LMS, commerce, membership, and mobile systems with no unified identity. Teams could not connect behavior across platforms",{"type":17,"tag":68,"props":3933,"children":3935},{"id":3934},"why-this-breaks-ai-agents",[3936],{"type":23,"value":3937},"Why This Breaks AI Agents",{"type":17,"tag":29,"props":3939,"children":3940},{},[3941],{"type":23,"value":3942},"For traditional systems, identity fragmentation is an operational inconvenience. For agents, it is a failure mode.",{"type":17,"tag":239,"props":3944,"children":3946},{"id":3945},"ambiguous-context",[3947],{"type":23,"value":3948},"Ambiguous context",{"type":17,"tag":29,"props":3950,"children":3951},{},[3952],{"type":23,"value":3953},"Agents retrieve data using identifiers. If multiple records exist, the agent may access incomplete or conflicting information.",{"type":17,"tag":239,"props":3955,"children":3957},{"id":3956},"wrong-target-execution",[3958],{"type":23,"value":3959},"Wrong target execution",{"type":17,"tag":29,"props":3961,"children":3962},{},[3963],{"type":23,"value":3964},"Agents do not just read data—they act on it. Without identity resolution, an agent may:",{"type":17,"tag":80,"props":3966,"children":3967},{},[3968,3973,3978,3983],{"type":17,"tag":84,"props":3969,"children":3970},{},[3971],{"type":23,"value":3972},"update the wrong CRM record",{"type":17,"tag":84,"props":3974,"children":3975},{},[3976],{"type":23,"value":3977},"assign tasks to inactive employees",{"type":17,"tag":84,"props":3979,"children":3980},{},[3981],{"type":23,"value":3982},"send messages to outdated contacts",{"type":17,"tag":84,"props":3984,"children":3985},{},[3986],{"type":23,"value":3987},"trigger workflows on duplicate entities",{"type":17,"tag":239,"props":3989,"children":3991},{"id":3990},"error-amplification",[3992],{"type":23,"value":3993},"Error amplification",{"type":17,"tag":29,"props":3995,"children":3996},{},[3997],{"type":23,"value":3998},"Agents can create new records when no match is found. This increases duplication.",{"type":17,"tag":29,"props":4000,"children":4001},{},[4002],{"type":23,"value":4003},"Alternatively, overly flexible matching can merge distinct individuals, creating privacy and compliance risks",{"type":17,"tag":239,"props":4005,"children":4007},{"id":4006},"feedback-loops",[4008],{"type":23,"value":4009},"Feedback loops",{"type":17,"tag":29,"props":4011,"children":4012},{},[4013],{"type":23,"value":4014},"Agents learn from historical data. If identity is fragmented, agents reinforce incorrect patterns:",{"type":17,"tag":80,"props":4016,"children":4017},{},[4018,4023,4028],{"type":17,"tag":84,"props":4019,"children":4020},{},[4021],{"type":23,"value":4022},"duplicate outreach",{"type":17,"tag":84,"props":4024,"children":4025},{},[4026],{"type":23,"value":4027},"repeated recommendations",{"type":17,"tag":84,"props":4029,"children":4030},{},[4031],{"type":23,"value":4032},"inconsistent personalization",{"type":17,"tag":239,"props":4034,"children":4036},{"id":4035},"compliance-and-audit-risk",[4037],{"type":23,"value":4038},"Compliance and audit risk",{"type":17,"tag":29,"props":4040,"children":4041},{},[4042],{"type":23,"value":4043},"Actions must be traceable to the correct entity. Identity ambiguity breaks audit trails and introduces regulatory risk",{"type":17,"tag":68,"props":4045,"children":4047},{"id":4046},"real-failure-scenarios",[4048],{"type":23,"value":4049},"Real Failure Scenarios",{"type":17,"tag":29,"props":4051,"children":4052},{},[4053],{"type":23,"value":4054},"These are not edge cases. They happen in production systems.",{"type":17,"tag":239,"props":4056,"children":4058},{"id":4057},"training-and-compliance-failures",[4059],{"type":23,"value":4060},"Training and compliance failures",{"type":17,"tag":29,"props":4062,"children":4063},{},[4064],{"type":23,"value":4065},"Duplicate employee records split training history across profiles. Agents assign duplicate or missing training, leading to compliance gaps.",{"type":17,"tag":239,"props":4067,"children":4069},{"id":4068},"sales-and-routing-errors",[4070],{"type":23,"value":4071},"Sales and routing errors",{"type":17,"tag":29,"props":4073,"children":4074},{},[4075],{"type":23,"value":4076},"Duplicate CRM contacts distort territory planning. Agents assign overlapping territories or route reps to incorrect locations.",{"type":17,"tag":239,"props":4078,"children":4080},{"id":4079},"payroll-and-hr-mistakes",[4081],{"type":23,"value":4082},"Payroll and HR mistakes",{"type":17,"tag":29,"props":4084,"children":4085},{},[4086],{"type":23,"value":4087},"Duplicate employee identities lead to incorrect payroll processing and benefits tracking. Agents may trigger payments on the wrong record.",{"type":17,"tag":239,"props":4089,"children":4091},{"id":4090},"fragmented-customer-experience",[4092],{"type":23,"value":4093},"Fragmented customer experience",{"type":17,"tag":29,"props":4095,"children":4096},{},[4097],{"type":23,"value":4098},"Agents operate on partial profiles. Marketing messages, support responses, and recommendations become inconsistent or irrelevant.",{"type":17,"tag":239,"props":4100,"children":4102},{"id":4101},"support-system-breakdowns",[4103],{"type":23,"value":4104},"Support system breakdowns",{"type":17,"tag":29,"props":4106,"children":4107},{},[4108],{"type":23,"value":4109},"Duplicate tickets across channels cause multiple responses to the same issue. Agents treat each instance separately, compounding confusion",{"type":17,"tag":68,"props":4111,"children":4113},{"id":4112},"the-core-issue-no-shared-identity-layer",[4114],{"type":23,"value":4115},"The Core Issue: No Shared Identity Layer",{"type":17,"tag":29,"props":4117,"children":4118},{},[4119],{"type":23,"value":4120},"Most integration architectures focus on:",{"type":17,"tag":80,"props":4122,"children":4123},{},[4124,4129,4134],{"type":17,"tag":84,"props":4125,"children":4126},{},[4127],{"type":23,"value":4128},"moving data",{"type":17,"tag":84,"props":4130,"children":4131},{},[4132],{"type":23,"value":4133},"normalizing schemas",{"type":17,"tag":84,"props":4135,"children":4136},{},[4137],{"type":23,"value":4138},"orchestrating workflows",{"type":17,"tag":29,"props":4140,"children":4141},{},[4142],{"type":23,"value":4143},"They do not solve identity. Without a shared identity layer, integrations connect systems, but they do not resolve identity between them.",{"type":17,"tag":29,"props":4145,"children":4146},{},[4147],{"type":23,"value":4148},"Agents depend on entity-level correctness. Without it, actions become unreliable.",{"type":17,"tag":68,"props":4150,"children":4152},{"id":4151},"how-identity-resolution-works-in-practice",[4153],{"type":23,"value":4154},"How Identity Resolution Works in Practice",{"type":17,"tag":29,"props":4156,"children":4157},{},[4158],{"type":23,"value":4159},"Solving this requires more than deduplication. It requires a structured approach.",{"type":17,"tag":239,"props":4161,"children":4163},{"id":4162},"global-identifiers",[4164],{"type":23,"value":4165},"Global identifiers",{"type":17,"tag":29,"props":4167,"children":4168},{},[4169],{"type":23,"value":4170},"Assign a stable identifier that persists across systems. This becomes the reference point for all integrations.",{"type":17,"tag":29,"props":4172,"children":4173},{},[4174],{"type":23,"value":4175},"Relying on email alone is insufficient. External or system-independent IDs provide stability",{"type":17,"tag":239,"props":4177,"children":4179},{"id":4178},"mapping-and-linking",[4180],{"type":23,"value":4181},"Mapping and linking",{"type":17,"tag":29,"props":4183,"children":4184},{},[4185],{"type":23,"value":4186},"Maintain mapping tables that relate system-specific IDs to a unified identity.",{"type":17,"tag":29,"props":4188,"children":4189},{},[4190],{"type":23,"value":4191},"This allows systems to retain their internal models while enabling cross-system linkage.",{"type":17,"tag":239,"props":4193,"children":4195},{"id":4194},"deterministic-and-probabilistic-matching",[4196],{"type":23,"value":4197},"Deterministic and probabilistic matching",{"type":17,"tag":80,"props":4199,"children":4200},{},[4201,4206],{"type":17,"tag":84,"props":4202,"children":4203},{},[4204],{"type":23,"value":4205},"deterministic: exact matches (IDs, normalized emails)",{"type":17,"tag":84,"props":4207,"children":4208},{},[4209],{"type":23,"value":4210},"probabilistic: similarity-based (name, phone, address)",{"type":17,"tag":29,"props":4212,"children":4213},{},[4214],{"type":23,"value":4215},"A hybrid approach balances missing matches and incorrect merges.",{"type":17,"tag":239,"props":4217,"children":4219},{"id":4218},"source-of-truth-and-priority",[4220],{"type":23,"value":4221},"Source of truth and priority",{"type":17,"tag":29,"props":4223,"children":4224},{},[4225],{"type":23,"value":4226},"Define which system is authoritative for identity attributes.",{"type":17,"tag":29,"props":4228,"children":4229},{},[4230],{"type":23,"value":4231},"Without this, conflicting updates create drift and inconsistency.",{"type":17,"tag":239,"props":4233,"children":4235},{"id":4234},"continuous-resolution",[4236],{"type":23,"value":4237},"Continuous resolution",{"type":17,"tag":29,"props":4239,"children":4240},{},[4241],{"type":23,"value":4242},"Identity is not static. Systems must detect changes, resolve duplicates, and update mappings over time.",{"type":17,"tag":68,"props":4244,"children":4245},{"id":1051},[4246],{"type":23,"value":4247},"Where Unified Fits",{"type":17,"tag":29,"props":4249,"children":4250},{},[4251],{"type":23,"value":4252},"Unified operates at the integration layer, not as a standalone identity system.",{"type":17,"tag":29,"props":4254,"children":4255},{},[4256],{"type":23,"value":4257},"It provides normalized access to SaaS data across categories like CRM, HRIS, ATS, and ticketing.",{"type":17,"tag":29,"props":4259,"children":4260},{},[4261],{"type":23,"value":4262},"This enables applications to:",{"type":17,"tag":80,"props":4264,"children":4265},{},[4266,4271,4276],{"type":17,"tag":84,"props":4267,"children":4268},{},[4269],{"type":23,"value":4270},"retrieve normalized object models across systems",{"type":17,"tag":84,"props":4272,"children":4273},{},[4274],{"type":23,"value":4275},"access identifiers and metadata needed for mapping",{"type":17,"tag":84,"props":4277,"children":4278},{},[4279],{"type":23,"value":4280},"execute read and write operations across platforms",{"type":17,"tag":29,"props":4282,"children":4283},{},[4284],{"type":23,"value":4285},"Identity resolution itself remains an application-level or data-layer responsibility.",{"type":17,"tag":29,"props":4287,"children":4288},{},[4289],{"type":23,"value":4290},"Unified provides the structured access layer that identity systems depend on to function across multiple APIs.",{"type":17,"tag":68,"props":4292,"children":4293},{"id":2316},[4294],{"type":23,"value":2319},{"type":17,"tag":29,"props":4296,"children":4297},{},[4298],{"type":23,"value":4299},"AI agents fail quietly when identity is fragmented.",{"type":17,"tag":29,"props":4301,"children":4302},{},[4303],{"type":23,"value":4304},"They retrieve the wrong data.",{"type":17,"tag":29,"props":4306,"children":4307},{},[4308],{"type":23,"value":4309},"They act on the wrong records.",{"type":17,"tag":29,"props":4311,"children":4312},{},[4313],{"type":23,"value":4314},"They create new inconsistencies.",{"type":17,"tag":29,"props":4316,"children":4317},{},[4318],{"type":23,"value":4319},"The more autonomous the system becomes, the more critical identity resolution becomes.",{"type":17,"tag":29,"props":4321,"children":4322},{},[4323],{"type":23,"value":4324},"Integrations that connect systems without resolving identity introduce risk at every step of execution.",{"type":17,"tag":29,"props":4326,"children":4327},{},[4328],{"type":23,"value":4329},"For agent-driven software, identity is not a data problem. It is a prerequisite for correctness.",{"type":17,"tag":29,"props":4331,"children":4332},{},[4333,4334],{"type":23,"value":1609},{"type":17,"tag":133,"props":4335,"children":4337},{"href":1612,"rel":4336},[214],[4338],{"type":23,"value":1616},{"type":17,"tag":29,"props":4340,"children":4341},{},[4342,4343],{"type":23,"value":1609},{"type":17,"tag":133,"props":4344,"children":4346},{"href":1623,"rel":4345},[214],[4347],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":4349},[4350,4351,4357,4361,4368,4375,4376,4383,4384],{"id":3682,"depth":1629,"text":3685},{"id":3759,"depth":1629,"text":3762,"children":4352},[4353,4354,4355,4356],{"id":3770,"depth":1635,"text":3773},{"id":3804,"depth":1635,"text":3807},{"id":3815,"depth":1635,"text":3818},{"id":3841,"depth":1635,"text":3844},{"id":3852,"depth":1629,"text":3855,"children":4358},[4359,4360],{"id":3863,"depth":1635,"text":3866},{"id":3898,"depth":1635,"text":3901},{"id":3934,"depth":1629,"text":3937,"children":4362},[4363,4364,4365,4366,4367],{"id":3945,"depth":1635,"text":3948},{"id":3956,"depth":1635,"text":3959},{"id":3990,"depth":1635,"text":3993},{"id":4006,"depth":1635,"text":4009},{"id":4035,"depth":1635,"text":4038},{"id":4046,"depth":1629,"text":4049,"children":4369},[4370,4371,4372,4373,4374],{"id":4057,"depth":1635,"text":4060},{"id":4068,"depth":1635,"text":4071},{"id":4079,"depth":1635,"text":4082},{"id":4090,"depth":1635,"text":4093},{"id":4101,"depth":1635,"text":4104},{"id":4112,"depth":1629,"text":4115},{"id":4151,"depth":1629,"text":4154,"children":4377},[4378,4379,4380,4381,4382],{"id":4162,"depth":1635,"text":4165},{"id":4178,"depth":1635,"text":4181},{"id":4194,"depth":1635,"text":4197},{"id":4218,"depth":1635,"text":4221},{"id":4234,"depth":1635,"text":4237},{"id":1051,"depth":1629,"text":4247},{"id":2316,"depth":1629,"text":2319},"content:blog:why_ai_agents_fail_without_cross_system_identity_resolution.md","blog/why_ai_agents_fail_without_cross_system_identity_resolution.md","blog/why_ai_agents_fail_without_cross_system_identity_resolution",{"_path":4389,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4390,"description":4391,"img":4392,"date":4393,"tag":12,"body":4394,"_type":1677,"_id":4945,"_source":1679,"_file":4946,"_stem":4947,"_extension":1682},"/blog/why_ai_agents_are_changing_the_integration_paradigm_for_saas_products","Why AI Agents Are Changing the Integration Paradigm for SaaS Products","Software integrations were built for systems that follow instructions. Data moves on schedules, workflows execute predefined steps, and APIs are called in...","https://s3.us-east-2.amazonaws.com/unified-article-images/why_ai_agents_are_changing_the_integration_paradigm_for_saas_products-icon.png","2026-04-07T00:55:00.000Z",{"type":14,"children":4395,"toc":4921},[4396,4401,4404,4411,4416,4422,4427,4432,4455,4461,4466,4472,4477,4482,4488,4493,4498,4526,4532,4537,4542,4575,4581,4592,4597,4603,4608,4613,4641,4647,4652,4658,4663,4669,4674,4680,4685,4691,4696,4701,4759,4765,4770,4776,4781,4787,4792,4798,4803,4809,4814,4818,4823,4828,4833,4861,4865,4870,4875,4898,4903,4912],{"type":17,"tag":18,"props":4397,"children":4399},{"id":4398},"why-ai-agents-are-changing-the-integration-paradigm-for-saas-products",[4400],{"type":23,"value":4390},{"type":17,"tag":25,"props":4402,"children":4403},{},[],{"type":17,"tag":29,"props":4405,"children":4406},{},[4407],{"type":17,"tag":33,"props":4408,"children":4409},{},[4410],{"type":23,"value":1707},{"type":17,"tag":29,"props":4412,"children":4413},{},[4414],{"type":23,"value":4415},"Software integrations were built for systems that follow instructions. Data moves on schedules, workflows execute predefined steps, and APIs are called in fixed sequences. That model worked when applications were deterministic. AI agents break that assumption. Agents decide what to do at runtime. They select tools, evaluate outcomes, and execute actions across systems without predefined paths. This shift is changing what integrations are designed to do—and what they need to support.",{"type":17,"tag":68,"props":4417,"children":4419},{"id":4418},"the-old-model-integrations-as-data-movement",[4420],{"type":23,"value":4421},"The Old Model: Integrations as Data Movement",{"type":17,"tag":29,"props":4423,"children":4424},{},[4425],{"type":23,"value":4426},"Traditional integration architectures were built around moving data between systems. ETL pipelines extract and sync data on schedules. Workflow platforms orchestrate predefined triggers and actions. APIs expose endpoints that developers wire together manually.",{"type":17,"tag":29,"props":4428,"children":4429},{},[4430],{"type":23,"value":4431},"These approaches assume:",{"type":17,"tag":80,"props":4433,"children":4434},{},[4435,4440,4445],{"type":17,"tag":84,"props":4436,"children":4437},{},[4438],{"type":23,"value":4439},"integrations are defined in advance",{"type":17,"tag":84,"props":4441,"children":4442},{},[4443],{"type":23,"value":4444},"data can be slightly delayed",{"type":17,"tag":84,"props":4446,"children":4447},{},[4448,4450,4453],{"type":23,"value":4449},"logic is predictable and fixed",{"type":17,"tag":3891,"props":4451,"children":4452},{},[],{"type":23,"value":4454},"That assumption does not hold for agents. Agents operate on live context, not scheduled snapshots. They do not follow predefined flows. They evaluate, decide, and act in real time",{"type":17,"tag":68,"props":4456,"children":4458},{"id":4457},"what-changes-when-software-becomes-agentic",[4459],{"type":23,"value":4460},"What Changes When Software Becomes Agentic",{"type":17,"tag":29,"props":4462,"children":4463},{},[4464],{"type":23,"value":4465},"AI agents introduce a different execution model. Instead of running workflows, they operate in loops: observe state, decide next action, execute, and repeat. This changes integration requirements at a fundamental level.",{"type":17,"tag":239,"props":4467,"children":4469},{"id":4468},"from-scheduled-data-to-real-time-context",[4470],{"type":23,"value":4471},"From scheduled data to real-time context",{"type":17,"tag":29,"props":4473,"children":4474},{},[4475],{"type":23,"value":4476},"Batch pipelines and sync jobs deliver delayed data. Agents need current system state to act correctly. A support agent cannot wait for a nightly sync to resolve a ticket. A sales agent cannot operate on outdated deal data.",{"type":17,"tag":29,"props":4478,"children":4479},{},[4480],{"type":23,"value":4481},"Agent systems rely on live reads and event-driven updates to maintain accuracy",{"type":17,"tag":239,"props":4483,"children":4485},{"id":4484},"from-predefined-workflows-to-dynamic-tool-selection",[4486],{"type":23,"value":4487},"From predefined workflows to dynamic tool selection",{"type":17,"tag":29,"props":4489,"children":4490},{},[4491],{"type":23,"value":4492},"Workflow systems encode logic upfront. Agents decide which tools to use at runtime.",{"type":17,"tag":29,"props":4494,"children":4495},{},[4496],{"type":23,"value":4497},"Given a request, an agent may:",{"type":17,"tag":80,"props":4499,"children":4500},{},[4501,4506,4511,4516],{"type":17,"tag":84,"props":4502,"children":4503},{},[4504],{"type":23,"value":4505},"query a CRM",{"type":17,"tag":84,"props":4507,"children":4508},{},[4509],{"type":23,"value":4510},"update a record",{"type":17,"tag":84,"props":4512,"children":4513},{},[4514],{"type":23,"value":4515},"send a message",{"type":17,"tag":84,"props":4517,"children":4518},{},[4519,4521,4524],{"type":23,"value":4520},"schedule a meeting",{"type":17,"tag":3891,"props":4522,"children":4523},{},[],{"type":23,"value":4525},"The sequence is not fixed. It is determined dynamically based on context and intermediate results",{"type":17,"tag":239,"props":4527,"children":4529},{"id":4528},"from-data-sync-to-system-execution",[4530],{"type":23,"value":4531},"From data sync to system execution",{"type":17,"tag":29,"props":4533,"children":4534},{},[4535],{"type":23,"value":4536},"Traditional integrations focus on transferring data. Agents perform actions.",{"type":17,"tag":29,"props":4538,"children":4539},{},[4540],{"type":23,"value":4541},"Instead of syncing tickets between systems, an agent can:",{"type":17,"tag":80,"props":4543,"children":4544},{},[4545,4550,4555,4560,4565],{"type":17,"tag":84,"props":4546,"children":4547},{},[4548],{"type":23,"value":4549},"retrieve a ticket",{"type":17,"tag":84,"props":4551,"children":4552},{},[4553],{"type":23,"value":4554},"classify it",{"type":17,"tag":84,"props":4556,"children":4557},{},[4558],{"type":23,"value":4559},"respond to the customer",{"type":17,"tag":84,"props":4561,"children":4562},{},[4563],{"type":23,"value":4564},"update status",{"type":17,"tag":84,"props":4566,"children":4567},{},[4568,4570,4573],{"type":23,"value":4569},"notify a team",{"type":17,"tag":3891,"props":4571,"children":4572},{},[],{"type":23,"value":4574},"This is not data movement. It is coordinated execution across systems",{"type":17,"tag":239,"props":4576,"children":4578},{"id":4577},"from-point-integrations-to-integration-layers",[4579],{"type":23,"value":4580},"From point integrations to integration layers",{"type":17,"tag":29,"props":4582,"children":4583},{},[4584,4586,4590],{"type":23,"value":4585},"Direct API integrations do not scale in an agent environment. Each new system introduces authentication, retries, ",{"type":17,"tag":133,"props":4587,"children":4588},{"href":135},[4589],{"type":23,"value":138},{"type":23,"value":4591},", and schema differences.",{"type":17,"tag":29,"props":4593,"children":4594},{},[4595],{"type":23,"value":4596},"As the number of tools grows, maintaining individual integrations becomes impractical. Agents require a layer that abstracts these differences and provides consistent access across systems",{"type":17,"tag":239,"props":4598,"children":4600},{"id":4599},"from-static-execution-to-continuous-reasoning",[4601],{"type":23,"value":4602},"From static execution to continuous reasoning",{"type":17,"tag":29,"props":4604,"children":4605},{},[4606],{"type":23,"value":4607},"Workflows run once and complete. Agents continuously evaluate state.",{"type":17,"tag":29,"props":4609,"children":4610},{},[4611],{"type":23,"value":4612},"They:",{"type":17,"tag":80,"props":4614,"children":4615},{},[4616,4621,4626,4631],{"type":17,"tag":84,"props":4617,"children":4618},{},[4619],{"type":23,"value":4620},"plan actions",{"type":17,"tag":84,"props":4622,"children":4623},{},[4624],{"type":23,"value":4625},"execute tools",{"type":17,"tag":84,"props":4627,"children":4628},{},[4629],{"type":23,"value":4630},"observe results",{"type":17,"tag":84,"props":4632,"children":4633},{},[4634,4636,4639],{"type":23,"value":4635},"adjust behavior",{"type":17,"tag":3891,"props":4637,"children":4638},{},[],{"type":23,"value":4640},"This loop requires integrations that support repeated, state-aware interactions rather than one-time execution paths",{"type":17,"tag":68,"props":4642,"children":4644},{"id":4643},"why-traditional-integration-architectures-break",[4645],{"type":23,"value":4646},"Why Traditional Integration Architectures Break",{"type":17,"tag":29,"props":4648,"children":4649},{},[4650],{"type":23,"value":4651},"These changes expose limitations in existing approaches.",{"type":17,"tag":239,"props":4653,"children":4655},{"id":4654},"etl-and-batch-pipelines",[4656],{"type":23,"value":4657},"ETL and batch pipelines",{"type":17,"tag":29,"props":4659,"children":4660},{},[4661],{"type":23,"value":4662},"Batch systems deliver stale data. Agents need real-time context. Delayed data leads to incorrect decisions and unreliable automation",{"type":17,"tag":239,"props":4664,"children":4666},{"id":4665},"ipaas-and-workflow-platforms",[4667],{"type":23,"value":4668},"iPaaS and workflow platforms",{"type":17,"tag":29,"props":4670,"children":4671},{},[4672],{"type":23,"value":4673},"Workflow platforms depend on predefined logic. Agents operate on ambiguous inputs and dynamic paths. Fixed workflows cannot adapt to changing context or multi-step reasoning",{"type":17,"tag":239,"props":4675,"children":4677},{"id":4676},"direct-api-integrations",[4678],{"type":23,"value":4679},"Direct API integrations",{"type":17,"tag":29,"props":4681,"children":4682},{},[4683],{"type":23,"value":4684},"Building integrations one API at a time does not scale. Each connection requires custom handling for authentication, errors, and edge cases. As agents interact with dozens or hundreds of systems, this approach becomes a bottleneck",{"type":17,"tag":68,"props":4686,"children":4688},{"id":4687},"the-new-integration-model",[4689],{"type":23,"value":4690},"The New Integration Model",{"type":17,"tag":29,"props":4692,"children":4693},{},[4694],{"type":23,"value":4695},"Agent-driven systems require a different foundation. Integrations are no longer just about accessing data. They are about enabling safe, real-time execution across systems.",{"type":17,"tag":29,"props":4697,"children":4698},{},[4699],{"type":23,"value":4700},"Modern architectures introduce several requirements:",{"type":17,"tag":80,"props":4702,"children":4703},{},[4704,4714,4724,4734,4744],{"type":17,"tag":84,"props":4705,"children":4706},{},[4707,4712],{"type":17,"tag":48,"props":4708,"children":4709},{},[4710],{"type":23,"value":4711},"Real-time data access",{"type":23,"value":4713}," so decisions reflect current state",{"type":17,"tag":84,"props":4715,"children":4716},{},[4717,4722],{"type":17,"tag":48,"props":4718,"children":4719},{},[4720],{"type":23,"value":4721},"Tool abstraction layers",{"type":23,"value":4723}," so agents can access many systems consistently",{"type":17,"tag":84,"props":4725,"children":4726},{},[4727,4732],{"type":17,"tag":48,"props":4728,"children":4729},{},[4730],{"type":23,"value":4731},"Execution-safe APIs",{"type":23,"value":4733}," that support both read and write operations",{"type":17,"tag":84,"props":4735,"children":4736},{},[4737,4742],{"type":17,"tag":48,"props":4738,"children":4739},{},[4740],{"type":23,"value":4741},"Dynamic orchestration",{"type":23,"value":4743}," instead of predefined workflows",{"type":17,"tag":84,"props":4745,"children":4746},{},[4747,4752,4754,4757],{"type":17,"tag":48,"props":4748,"children":4749},{},[4750],{"type":23,"value":4751},"Permission-aware execution",{"type":23,"value":4753}," to enforce access control at runtime",{"type":17,"tag":3891,"props":4755,"children":4756},{},[],{"type":23,"value":4758},"These requirements shift integrations from background infrastructure to a core part of how applications operate.",{"type":17,"tag":68,"props":4760,"children":4762},{"id":4761},"new-constraints-most-teams-miss",[4763],{"type":23,"value":4764},"New Constraints Most Teams Miss",{"type":17,"tag":29,"props":4766,"children":4767},{},[4768],{"type":23,"value":4769},"As teams move toward agent-based systems, new constraints emerge.",{"type":17,"tag":239,"props":4771,"children":4773},{"id":4772},"tool-discovery-and-selection",[4774],{"type":23,"value":4775},"Tool discovery and selection",{"type":17,"tag":29,"props":4777,"children":4778},{},[4779],{"type":23,"value":4780},"Agents cannot load hundreds of integrations into context. They require structured tool registries and selective loading so only relevant tools are available at runtime",{"type":17,"tag":239,"props":4782,"children":4784},{"id":4783},"authentication-outside-the-model",[4785],{"type":23,"value":4786},"Authentication outside the model",{"type":17,"tag":29,"props":4788,"children":4789},{},[4790],{"type":23,"value":4791},"Credentials cannot be exposed to the model. Authentication, token management, and permission enforcement must be handled in the execution layer, not in prompts",{"type":17,"tag":239,"props":4793,"children":4795},{"id":4794},"observability-and-control",[4796],{"type":23,"value":4797},"Observability and control",{"type":17,"tag":29,"props":4799,"children":4800},{},[4801],{"type":23,"value":4802},"Agents take actions across systems. Every action must be logged, monitored, and governed. Without this, systems become difficult to debug and unsafe to operate",{"type":17,"tag":239,"props":4804,"children":4806},{"id":4805},"multi-system-coordination",[4807],{"type":23,"value":4808},"Multi-system coordination",{"type":17,"tag":29,"props":4810,"children":4811},{},[4812],{"type":23,"value":4813},"Agents rarely operate in a single system. They coordinate across CRM, messaging, ticketing, and internal tools. Integration layers must support this multi-system execution reliably",{"type":17,"tag":68,"props":4815,"children":4816},{"id":1051},[4817],{"type":23,"value":4247},{"type":17,"tag":29,"props":4819,"children":4820},{},[4821],{"type":23,"value":4822},"Unified sits in the integration layer that agents depend on.",{"type":17,"tag":29,"props":4824,"children":4825},{},[4826],{"type":23,"value":4827},"It provides a consistent API surface across SaaS categories such as CRM, ticketing, file storage, ATS, and more. Instead of managing individual integrations, applications interact with a single interface for many systems.",{"type":17,"tag":29,"props":4829,"children":4830},{},[4831],{"type":23,"value":4832},"This supports the shift toward agent-driven architectures by:",{"type":17,"tag":80,"props":4834,"children":4835},{},[4836,4841,4846,4851],{"type":17,"tag":84,"props":4837,"children":4838},{},[4839],{"type":23,"value":4840},"enabling real-time access to external systems",{"type":17,"tag":84,"props":4842,"children":4843},{},[4844],{"type":23,"value":4845},"providing normalized object models across providers",{"type":17,"tag":84,"props":4847,"children":4848},{},[4849],{"type":23,"value":4850},"supporting both read and write operations for execution",{"type":17,"tag":84,"props":4852,"children":4853},{},[4854,4856,4859],{"type":23,"value":4855},"reducing the need to build and maintain per-API integrations",{"type":17,"tag":3891,"props":4857,"children":4858},{},[],{"type":23,"value":4860},"Unified does not define agent behavior or orchestration. It provides the access layer that makes those systems possible.",{"type":17,"tag":68,"props":4862,"children":4863},{"id":2316},[4864],{"type":23,"value":2319},{"type":17,"tag":29,"props":4866,"children":4867},{},[4868],{"type":23,"value":4869},"AI agents are not just another layer on top of existing integrations. They change what integrations are for.",{"type":17,"tag":29,"props":4871,"children":4872},{},[4873],{"type":23,"value":4874},"Integrations are moving:",{"type":17,"tag":80,"props":4876,"children":4877},{},[4878,4883,4888],{"type":17,"tag":84,"props":4879,"children":4880},{},[4881],{"type":23,"value":4882},"from data transfer to execution",{"type":17,"tag":84,"props":4884,"children":4885},{},[4886],{"type":23,"value":4887},"from predefined workflows to dynamic decisions",{"type":17,"tag":84,"props":4889,"children":4890},{},[4891,4893,4896],{"type":23,"value":4892},"from individual connectors to shared infrastructure",{"type":17,"tag":3891,"props":4894,"children":4895},{},[],{"type":23,"value":4897},"Systems designed for batch data movement cannot support real-time, decision-driven execution.",{"type":17,"tag":29,"props":4899,"children":4900},{},[4901],{"type":23,"value":4902},"As software becomes agent-driven, integration architecture becomes a core part of product design—not just a backend concern.",{"type":17,"tag":29,"props":4904,"children":4905},{},[4906,4907],{"type":23,"value":1609},{"type":17,"tag":133,"props":4908,"children":4910},{"href":1612,"rel":4909},[214],[4911],{"type":23,"value":1616},{"type":17,"tag":29,"props":4913,"children":4914},{},[4915,4916],{"type":23,"value":1609},{"type":17,"tag":133,"props":4917,"children":4919},{"href":1623,"rel":4918},[214],[4920],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":4922},[4923,4924,4931,4936,4937,4943,4944],{"id":4418,"depth":1629,"text":4421},{"id":4457,"depth":1629,"text":4460,"children":4925},[4926,4927,4928,4929,4930],{"id":4468,"depth":1635,"text":4471},{"id":4484,"depth":1635,"text":4487},{"id":4528,"depth":1635,"text":4531},{"id":4577,"depth":1635,"text":4580},{"id":4599,"depth":1635,"text":4602},{"id":4643,"depth":1629,"text":4646,"children":4932},[4933,4934,4935],{"id":4654,"depth":1635,"text":4657},{"id":4665,"depth":1635,"text":4668},{"id":4676,"depth":1635,"text":4679},{"id":4687,"depth":1629,"text":4690},{"id":4761,"depth":1629,"text":4764,"children":4938},[4939,4940,4941,4942],{"id":4772,"depth":1635,"text":4775},{"id":4783,"depth":1635,"text":4786},{"id":4794,"depth":1635,"text":4797},{"id":4805,"depth":1635,"text":4808},{"id":1051,"depth":1629,"text":4247},{"id":2316,"depth":1629,"text":2319},"content:blog:why_ai_agents_are_changing_the_integration_paradigm_for_saas_products.md","blog/why_ai_agents_are_changing_the_integration_paradigm_for_saas_products.md","blog/why_ai_agents_are_changing_the_integration_paradigm_for_saas_products",{"_path":4949,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4950,"description":4951,"img":4952,"date":4953,"tag":12,"body":4954,"_type":1677,"_id":5495,"_source":1679,"_file":5496,"_stem":5497,"_extension":1682},"/blog/apis_for_ai_agents_the_5_integration_patterns_2026_guide","APIs for AI Agents: The 5 Integration Patterns (2026 Guide)","AI agents do not operate in isolation. They depend on external systems for data, context, and execution. The way an agent connects to those systems determines...","https://s3.us-east-2.amazonaws.com/unified-article-images/apis_for_ai_agents_the_5_integration_patterns_2026_guide-icon.png","2026-04-07T00:48:00.000Z",{"type":14,"children":4955,"toc":5475},[4956,4961,4964,4971,4976,4981,4987,4992,5005,5016,5021,5039,5045,5050,5055,5060,5065,5083,5089,5094,5100,5105,5110,5115,5121,5126,5131,5136,5141,5179,5185,5190,5196,5207,5212,5218,5223,5228,5233,5238,5266,5272,5277,5282,5287,5292,5298,5303,5308,5314,5319,5324,5329,5347,5353,5358,5363,5396,5400,5405,5410,5438,5442,5447,5452,5457,5466],{"type":17,"tag":18,"props":4957,"children":4959},{"id":4958},"apis-for-ai-agents-the-5-integration-patterns-2026-guide",[4960],{"type":23,"value":4950},{"type":17,"tag":25,"props":4962,"children":4963},{},[],{"type":17,"tag":29,"props":4965,"children":4966},{},[4967],{"type":17,"tag":33,"props":4968,"children":4969},{},[4970],{"type":23,"value":1707},{"type":17,"tag":29,"props":4972,"children":4973},{},[4974],{"type":23,"value":4975},"AI agents do not operate in isolation. They depend on external systems for data, context, and execution. The way an agent connects to those systems determines latency, reliability, and scalability. Most teams focus on models and prompts.",{"type":17,"tag":29,"props":4977,"children":4978},{},[4979],{"type":23,"value":4980},"In production, the integration pattern is what actually shapes behavior. There are five core patterns that show up repeatedly across real systems. Each solves a different problem. Most production architectures combine them.",{"type":17,"tag":68,"props":4982,"children":4984},{"id":4983},"_1-pull-based-polling",[4985],{"type":23,"value":4986},"1. Pull-Based Polling",{"type":17,"tag":29,"props":4988,"children":4989},{},[4990],{"type":23,"value":4991},"Polling is the simplest pattern. The agent periodically checks an API for new data. It runs on a schedule, retrieves updates, and processes them. There is no event system. The agent asks, waits, and repeats.",{"type":17,"tag":29,"props":4993,"children":4994},{},[4995,4997,5003],{"type":23,"value":4996},"This works when systems do not support ",{"type":17,"tag":133,"props":4998,"children":5000},{"href":4999},"/blog/replacing_polling_with_unified_webhooks_and_virtual_streams",[5001],{"type":23,"value":5002},"webhooks",{"type":23,"value":5004}," or when real-time behavior is not required. It is easy to implement and gives full control over frequency.",{"type":17,"tag":29,"props":5006,"children":5007},{},[5008,5010,5014],{"type":23,"value":5009},"It breaks down quickly. Latency is tied to the polling interval. The agent may process events minutes after they occur. It also wastes compute when no new data exists and can trigger ",{"type":17,"tag":133,"props":5011,"children":5012},{"href":135},[5013],{"type":23,"value":138},{"type":23,"value":5015}," at scale",{"type":17,"tag":29,"props":5017,"children":5018},{},[5019],{"type":23,"value":5020},"Use polling when:",{"type":17,"tag":80,"props":5022,"children":5023},{},[5024,5029,5034],{"type":17,"tag":84,"props":5025,"children":5026},{},[5027],{"type":23,"value":5028},"data changes infrequently",{"type":17,"tag":84,"props":5030,"children":5031},{},[5032],{"type":23,"value":5033},"real-time response is not required",{"type":17,"tag":84,"props":5035,"children":5036},{},[5037],{"type":23,"value":5038},"the external API has no event support",{"type":17,"tag":68,"props":5040,"children":5042},{"id":5041},"_2-webhooks-and-event-driven-systems",[5043],{"type":23,"value":5044},"2. Webhooks and Event-Driven Systems",{"type":17,"tag":29,"props":5046,"children":5047},{},[5048],{"type":23,"value":5049},"Event-driven systems invert polling. Instead of asking for updates, the agent receives them. External systems send events when something changes. The agent reacts immediately.",{"type":17,"tag":29,"props":5051,"children":5052},{},[5053],{"type":23,"value":5054},"This pattern enables near real-time workflows. It reduces unnecessary API calls and improves responsiveness. It is the default for support systems, messaging platforms, and pipeline monitoring.",{"type":17,"tag":29,"props":5056,"children":5057},{},[5058],{"type":23,"value":5059},"It introduces complexity. Events must be delivered reliably. Systems must handle retries, deduplication, and bursts of activity. Debugging distributed event flows is harder than polling",{"type":17,"tag":29,"props":5061,"children":5062},{},[5063],{"type":23,"value":5064},"Use event-driven systems when:",{"type":17,"tag":80,"props":5066,"children":5067},{},[5068,5073,5078],{"type":17,"tag":84,"props":5069,"children":5070},{},[5071],{"type":23,"value":5072},"latency matters",{"type":17,"tag":84,"props":5074,"children":5075},{},[5076],{"type":23,"value":5077},"workflows are reactive (support, alerts, pipelines)",{"type":17,"tag":84,"props":5079,"children":5080},{},[5081],{"type":23,"value":5082},"APIs support webhooks or streaming",{"type":17,"tag":68,"props":5084,"children":5086},{"id":5085},"_3-data-access-pass-through-vs-sync-and-cache",[5087],{"type":23,"value":5088},"3. Data Access: Pass-Through vs Sync-and-Cache",{"type":17,"tag":29,"props":5090,"children":5091},{},[5092],{"type":23,"value":5093},"This is one of the most important architectural decisions. It determines how agents access data.",{"type":17,"tag":239,"props":5095,"children":5097},{"id":5096},"pass-through-real-time-access",[5098],{"type":23,"value":5099},"Pass-Through (Real-Time Access)",{"type":17,"tag":29,"props":5101,"children":5102},{},[5103],{"type":23,"value":5104},"Pass-through systems send requests directly to the source API. Data is retrieved in real time and not stored.",{"type":17,"tag":29,"props":5106,"children":5107},{},[5108],{"type":23,"value":5109},"This ensures freshness, reduces compliance risk, and avoids duplicating customer data into a secondary system. It is the preferred model for sensitive or frequently changing data.",{"type":17,"tag":29,"props":5111,"children":5112},{},[5113],{"type":23,"value":5114},"The tradeoff is dependence on the underlying API. Latency and rate limits directly impact the agent. There is no offline access",{"type":17,"tag":239,"props":5116,"children":5118},{"id":5117},"sync-and-cache-storage-layer",[5119],{"type":23,"value":5120},"Sync-and-Cache (Storage Layer)",{"type":17,"tag":29,"props":5122,"children":5123},{},[5124],{"type":23,"value":5125},"Sync-and-cache systems replicate data into a local database. Agents query the cached copy instead of the source.",{"type":17,"tag":29,"props":5127,"children":5128},{},[5129],{"type":23,"value":5130},"This improves performance and reduces API pressure. It allows faster responses and more control over querying.",{"type":17,"tag":29,"props":5132,"children":5133},{},[5134],{"type":23,"value":5135},"The tradeoffs are staleness, storage cost, and compliance risk. Data may drift from the source system if sync fails or lags",{"type":17,"tag":29,"props":5137,"children":5138},{},[5139],{"type":23,"value":5140},"Use pass-through when:",{"type":17,"tag":80,"props":5142,"children":5143},{},[5144,5149,5154,5164,5169,5174],{"type":17,"tag":84,"props":5145,"children":5146},{},[5147],{"type":23,"value":5148},"real-time accuracy matters",{"type":17,"tag":84,"props":5150,"children":5151},{},[5152],{"type":23,"value":5153},"data is sensitive",{"type":17,"tag":84,"props":5155,"children":5156},{},[5157,5159,5162],{"type":23,"value":5158},"you cannot store customer data",{"type":17,"tag":3891,"props":5160,"children":5161},{},[],{"type":23,"value":5163},"Use sync-and-cache when:",{"type":17,"tag":84,"props":5165,"children":5166},{},[5167],{"type":23,"value":5168},"performance is critical",{"type":17,"tag":84,"props":5170,"children":5171},{},[5172],{"type":23,"value":5173},"data is relatively stable",{"type":17,"tag":84,"props":5175,"children":5176},{},[5177],{"type":23,"value":5178},"you control storage and compliance",{"type":17,"tag":68,"props":5180,"children":5182},{"id":5181},"_4-retrieval-vs-action-rag-vs-agentic-execution",[5183],{"type":23,"value":5184},"4. Retrieval vs Action: RAG vs Agentic Execution",{"type":17,"tag":29,"props":5186,"children":5187},{},[5188],{"type":23,"value":5189},"Agents interact with systems in two fundamentally different ways.",{"type":17,"tag":239,"props":5191,"children":5193},{"id":5192},"retrieval-rag",[5194],{"type":23,"value":5195},"Retrieval (RAG)",{"type":17,"tag":29,"props":5197,"children":5198},{},[5199,5205],{"type":17,"tag":133,"props":5200,"children":5202},{"href":5201},"/guides/retrieval_augmented_generation_rag#retrieval-augmented-generation-rag",[5203],{"type":23,"value":5204},"RAG",{"type":23,"value":5206}," retrieves information and generates responses. It reads from indexes or databases and produces grounded answers.",{"type":17,"tag":29,"props":5208,"children":5209},{},[5210],{"type":23,"value":5211},"It is reliable for knowledge tasks like search, summarization, and support. It does not modify systems.",{"type":17,"tag":239,"props":5213,"children":5215},{"id":5214},"action-agentic-execution",[5216],{"type":23,"value":5217},"Action (Agentic Execution)",{"type":17,"tag":29,"props":5219,"children":5220},{},[5221],{"type":23,"value":5222},"Agentic systems call APIs and perform operations. They create records, send messages, update state, and trigger workflows.",{"type":17,"tag":29,"props":5224,"children":5225},{},[5226],{"type":23,"value":5227},"This introduces more power and more failure modes. Each action depends on correct inputs, permissions, and system state.",{"type":17,"tag":29,"props":5229,"children":5230},{},[5231],{"type":23,"value":5232},"The distinction matters. Retrieval answers questions. Execution changes systems. Most real applications require both",{"type":17,"tag":29,"props":5234,"children":5235},{},[5236],{"type":23,"value":5237},"Use RAG when:",{"type":17,"tag":80,"props":5239,"children":5240},{},[5241,5246,5256,5261],{"type":17,"tag":84,"props":5242,"children":5243},{},[5244],{"type":23,"value":5245},"the task is informational",{"type":17,"tag":84,"props":5247,"children":5248},{},[5249,5251,5254],{"type":23,"value":5250},"no system changes are required",{"type":17,"tag":3891,"props":5252,"children":5253},{},[],{"type":23,"value":5255},"Use agentic execution when:",{"type":17,"tag":84,"props":5257,"children":5258},{},[5259],{"type":23,"value":5260},"workflows must be completed",{"type":17,"tag":84,"props":5262,"children":5263},{},[5264],{"type":23,"value":5265},"systems must be updated",{"type":17,"tag":68,"props":5267,"children":5269},{"id":5268},"_5-tool-calling-and-integration-layers",[5270],{"type":23,"value":5271},"5. Tool Calling and Integration Layers",{"type":17,"tag":29,"props":5273,"children":5274},{},[5275],{"type":23,"value":5276},"Tool calling is how agents interact with APIs. There are three levels of abstraction.",{"type":17,"tag":239,"props":5278,"children":5279},{"id":4676},[5280],{"type":23,"value":5281},"Direct API Integrations",{"type":17,"tag":29,"props":5283,"children":5284},{},[5285],{"type":23,"value":5286},"The agent calls APIs directly. This gives full control and low latency.",{"type":17,"tag":29,"props":5288,"children":5289},{},[5290],{"type":23,"value":5291},"It does not scale. Each integration must be built and maintained separately. Authentication, retries, and schema handling are repeated for every API",{"type":17,"tag":239,"props":5293,"children":5295},{"id":5294},"function-tool-calling",[5296],{"type":23,"value":5297},"Function / Tool Calling",{"type":17,"tag":29,"props":5299,"children":5300},{},[5301],{"type":23,"value":5302},"Developers define tools with schemas. The model selects which tool to call. Backend systems execute the request.",{"type":17,"tag":29,"props":5304,"children":5305},{},[5306],{"type":23,"value":5307},"This improves reliability but still requires building and maintaining each integration. It works well for small tool sets.",{"type":17,"tag":239,"props":5309,"children":5311},{"id":5310},"unified-apis-and-tool-registries",[5312],{"type":23,"value":5313},"Unified APIs and Tool Registries",{"type":17,"tag":29,"props":5315,"children":5316},{},[5317],{"type":23,"value":5318},"Unified APIs and MCP-based systems introduce a central integration layer. Agents can connect to a single interface for many integrations instead of managing each API directly. The layer handles authentication, normalization, and execution.",{"type":17,"tag":29,"props":5320,"children":5321},{},[5322],{"type":23,"value":5323},"This solves the scaling burden. Instead of building N integrations for N tools, agents connect to a single system that abstracts those tools. It also enables dynamic discovery and centralized governance",{"type":17,"tag":29,"props":5325,"children":5326},{},[5327],{"type":23,"value":5328},"Use unified APIs when:",{"type":17,"tag":80,"props":5330,"children":5331},{},[5332,5337,5342],{"type":17,"tag":84,"props":5333,"children":5334},{},[5335],{"type":23,"value":5336},"you have many integrations (10+)",{"type":17,"tag":84,"props":5338,"children":5339},{},[5340],{"type":23,"value":5341},"multiple agents or teams share integrations",{"type":17,"tag":84,"props":5343,"children":5344},{},[5345],{"type":23,"value":5346},"you need consistent schemas and centralized control",{"type":17,"tag":68,"props":5348,"children":5350},{"id":5349},"how-these-patterns-combine-in-production",[5351],{"type":23,"value":5352},"How These Patterns Combine in Production",{"type":17,"tag":29,"props":5354,"children":5355},{},[5356],{"type":23,"value":5357},"No production system uses a single pattern.",{"type":17,"tag":29,"props":5359,"children":5360},{},[5361],{"type":23,"value":5362},"A typical architecture looks like:",{"type":17,"tag":80,"props":5364,"children":5365},{},[5366,5371,5376,5381,5386],{"type":17,"tag":84,"props":5367,"children":5368},{},[5369],{"type":23,"value":5370},"event-driven triggers to detect changes",{"type":17,"tag":84,"props":5372,"children":5373},{},[5374],{"type":23,"value":5375},"pass-through APIs for real-time data",{"type":17,"tag":84,"props":5377,"children":5378},{},[5379],{"type":23,"value":5380},"RAG for knowledge retrieval",{"type":17,"tag":84,"props":5382,"children":5383},{},[5384],{"type":23,"value":5385},"tool calling for execution",{"type":17,"tag":84,"props":5387,"children":5388},{},[5389,5391,5394],{"type":23,"value":5390},"orchestration layers for multi-step workflows",{"type":17,"tag":3891,"props":5392,"children":5393},{},[],{"type":23,"value":5395},"Each layer solves a different problem. Combining them intentionally is what makes systems reliable.",{"type":17,"tag":68,"props":5397,"children":5398},{"id":1051},[5399],{"type":23,"value":4247},{"type":17,"tag":29,"props":5401,"children":5402},{},[5403],{"type":23,"value":5404},"Unified sits in the integration layer. It provides a normalized API across SaaS categories like CRM, ticketing, file storage, ATS, and more.",{"type":17,"tag":29,"props":5406,"children":5407},{},[5408],{"type":23,"value":5409},"Instead of building separate integrations, agents interact with a single interface:",{"type":17,"tag":80,"props":5411,"children":5412},{},[5413,5418,5423,5428],{"type":17,"tag":84,"props":5414,"children":5415},{},[5416],{"type":23,"value":5417},"APIs are normalized across providers",{"type":17,"tag":84,"props":5419,"children":5420},{},[5421],{"type":23,"value":5422},"authentication follows consistent patterns",{"type":17,"tag":84,"props":5424,"children":5425},{},[5426],{"type":23,"value":5427},"object models are standardized where possible",{"type":17,"tag":84,"props":5429,"children":5430},{},[5431,5433,5436],{"type":23,"value":5432},"integrations scale without per-API logic",{"type":17,"tag":3891,"props":5434,"children":5435},{},[],{"type":23,"value":5437},"Unified does not replace polling, events, RAG, or orchestration. It makes them easier to implement across many systems. It reduces the complexity of connecting agents to external tools.",{"type":17,"tag":68,"props":5439,"children":5440},{"id":2316},[5441],{"type":23,"value":2319},{"type":17,"tag":29,"props":5443,"children":5444},{},[5445],{"type":23,"value":5446},"AI agent performance is not determined by the model alone. It is determined by how the agent connects to external systems.",{"type":17,"tag":29,"props":5448,"children":5449},{},[5450],{"type":23,"value":5451},"Polling, events, data access models, retrieval vs execution, and integration layers each define part of that connection.",{"type":17,"tag":29,"props":5453,"children":5454},{},[5455],{"type":23,"value":5456},"Teams that understand these patterns build systems that are faster, more reliable, and easier to scale.",{"type":17,"tag":29,"props":5458,"children":5459},{},[5460,5461],{"type":23,"value":1609},{"type":17,"tag":133,"props":5462,"children":5464},{"href":1612,"rel":5463},[214],[5465],{"type":23,"value":1616},{"type":17,"tag":29,"props":5467,"children":5468},{},[5469,5470],{"type":23,"value":1609},{"type":17,"tag":133,"props":5471,"children":5473},{"href":1623,"rel":5472},[214],[5474],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":5476},[5477,5478,5479,5483,5487,5492,5493,5494],{"id":4983,"depth":1629,"text":4986},{"id":5041,"depth":1629,"text":5044},{"id":5085,"depth":1629,"text":5088,"children":5480},[5481,5482],{"id":5096,"depth":1635,"text":5099},{"id":5117,"depth":1635,"text":5120},{"id":5181,"depth":1629,"text":5184,"children":5484},[5485,5486],{"id":5192,"depth":1635,"text":5195},{"id":5214,"depth":1635,"text":5217},{"id":5268,"depth":1629,"text":5271,"children":5488},[5489,5490,5491],{"id":4676,"depth":1635,"text":5281},{"id":5294,"depth":1635,"text":5297},{"id":5310,"depth":1635,"text":5313},{"id":5349,"depth":1629,"text":5352},{"id":1051,"depth":1629,"text":4247},{"id":2316,"depth":1629,"text":2319},"content:blog:apis_for_ai_agents_the_5_integration_patterns_2026_guide.md","blog/apis_for_ai_agents_the_5_integration_patterns_2026_guide.md","blog/apis_for_ai_agents_the_5_integration_patterns_2026_guide",{"_path":5499,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":5500,"description":5501,"img":5502,"date":5503,"tag":12,"body":5504,"_type":1677,"_id":6000,"_source":1679,"_file":6001,"_stem":6002,"_extension":1682},"/blog/how_to_build_reliable_tool_calls_for_ai_agents","How to Build Reliable Tool Calls for AI Agents","Tool calling is the execution layer of AI agents. It is how models move from generating text to interacting with real systems. Most teams get a demo working...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_reliable_tool_calls_for_ai_agents-icon.png","2026-04-07T00:42:00.000Z",{"type":14,"children":5505,"toc":5974},[5506,5511,5514,5521,5526,5532,5537,5543,5548,5554,5559,5565,5570,5576,5581,5587,5592,5598,5609,5615,5620,5626,5631,5637,5642,5648,5653,5659,5664,5670,5675,5681,5686,5692,5703,5709,5714,5720,5725,5731,5736,5741,5789,5795,5800,5805,5838,5842,5847,5852,5888,5894,5899,5904,5942,5946,5951,5956,5965],{"type":17,"tag":18,"props":5507,"children":5509},{"id":5508},"how-to-build-reliable-tool-calls-for-ai-agents",[5510],{"type":23,"value":5500},{"type":17,"tag":25,"props":5512,"children":5513},{},[],{"type":17,"tag":29,"props":5515,"children":5516},{},[5517],{"type":17,"tag":33,"props":5518,"children":5519},{},[5520],{"type":23,"value":1707},{"type":17,"tag":29,"props":5522,"children":5523},{},[5524],{"type":23,"value":5525},"Tool calling is the execution layer of AI agents. It is how models move from generating text to interacting with real systems. Most teams get a demo working quickly. Reliability breaks as soon as the agent touches production APIs. The problem is not choosing the right framework. It is making tool calls behave predictably across real systems, with validation, authorization, retries, and consistent data models.",{"type":17,"tag":68,"props":5527,"children":5529},{"id":5528},"what-tool-calling-actually-does",[5530],{"type":23,"value":5531},"What Tool Calling Actually Does",{"type":17,"tag":29,"props":5533,"children":5534},{},[5535],{"type":23,"value":5536},"Modern agents follow a simple loop. Tools are defined with structured schemas. The model selects a tool and generates arguments. The application executes the call. The result is returned to the model for the next step. This pattern exists across OpenAI function calling, Anthropic tool use, and frameworks like LangChain and LlamaIndex. The differences are implementation details. The reliability challenges are the same.",{"type":17,"tag":68,"props":5538,"children":5540},{"id":5539},"why-tool-calls-break-in-production",[5541],{"type":23,"value":5542},"Why Tool Calls Break in Production",{"type":17,"tag":29,"props":5544,"children":5545},{},[5546],{"type":23,"value":5547},"Most failures happen after the model chooses a tool. The execution layer is where things fall apart.",{"type":17,"tag":239,"props":5549,"children":5551},{"id":5550},"_1-missing-or-invalid-parameters",[5552],{"type":23,"value":5553},"1. Missing or Invalid Parameters",{"type":17,"tag":29,"props":5555,"children":5556},{},[5557],{"type":23,"value":5558},"Models frequently omit required fields or generate incorrect types. Benchmarks show parameter errors are one of the most common failure modes. A CRM create call without an email or a booking request with an invalid date format will fail immediately.",{"type":17,"tag":239,"props":5560,"children":5562},{"id":5561},"_2-hallucinated-arguments",[5563],{"type":23,"value":5564},"2. Hallucinated Arguments",{"type":17,"tag":29,"props":5566,"children":5567},{},[5568],{"type":23,"value":5569},"When tool definitions are unclear or overlapping, models invent parameters that do not exist. This often happens when multiple tools look similar or descriptions are vague. The result is invalid payloads or incorrect calls.",{"type":17,"tag":239,"props":5571,"children":5573},{"id":5572},"_3-wrong-tool-selection",[5574],{"type":23,"value":5575},"3. Wrong Tool Selection",{"type":17,"tag":29,"props":5577,"children":5578},{},[5579],{"type":23,"value":5580},"Generic naming leads to incorrect tool usage. If tools are poorly defined or too numerous, the model chooses the wrong one. Loading dozens of tools into context increases confusion and error rates.",{"type":17,"tag":239,"props":5582,"children":5584},{"id":5583},"_4-duplicate-or-unsafe-writes",[5585],{"type":23,"value":5586},"4. Duplicate or Unsafe Writes",{"type":17,"tag":29,"props":5588,"children":5589},{},[5590],{"type":23,"value":5591},"Retries without idempotency create duplicate records. An agent that retries a failed request can create multiple tickets, duplicate CRM entries, or repeated transactions.",{"type":17,"tag":239,"props":5593,"children":5595},{"id":5594},"_5-rate-limits-and-latency",[5596],{"type":23,"value":5597},"5. Rate Limits and Latency",{"type":17,"tag":29,"props":5599,"children":5600},{},[5601,5603,5607],{"type":23,"value":5602},"External APIs introduce constraints. ",{"type":17,"tag":133,"props":5604,"children":5605},{"href":135},[5606],{"type":23,"value":3279},{"type":23,"value":5608},", slow responses, and network failures degrade reliability. Without retry strategies, agents fail. With naive retries, they overload systems or create inconsistent state.",{"type":17,"tag":239,"props":5610,"children":5612},{"id":5611},"_6-authentication-and-permission-failures",[5613],{"type":23,"value":5614},"6. Authentication and Permission Failures",{"type":17,"tag":29,"props":5616,"children":5617},{},[5618],{"type":23,"value":5619},"Tool calls require valid credentials and correct permissions. Missing scopes or expired tokens break execution. More importantly, agents must act on behalf of the correct user with proper access controls.",{"type":17,"tag":239,"props":5621,"children":5623},{"id":5622},"_7-context-overload-and-tool-confusion",[5624],{"type":23,"value":5625},"7. Context Overload and Tool Confusion",{"type":17,"tag":29,"props":5627,"children":5628},{},[5629],{"type":23,"value":5630},"Large tool definitions and responses increase token usage and reduce accuracy. Too many tools in context lead to mis-selection and incorrect arguments.",{"type":17,"tag":68,"props":5632,"children":5634},{"id":5633},"the-patterns-behind-reliable-tool-calling",[5635],{"type":23,"value":5636},"The Patterns Behind Reliable Tool Calling",{"type":17,"tag":29,"props":5638,"children":5639},{},[5640],{"type":23,"value":5641},"Reliable systems do not rely on the model alone. They add structure around it.",{"type":17,"tag":239,"props":5643,"children":5645},{"id":5644},"strict-schemas-and-validation",[5646],{"type":23,"value":5647},"Strict Schemas and Validation",{"type":17,"tag":29,"props":5649,"children":5650},{},[5651],{"type":23,"value":5652},"Tools must be defined with explicit schemas. Required fields, types, enums, and constraints reduce ambiguity. JSON Schema with strict validation prevents malformed inputs. After the model generates arguments, the system must validate them again before execution.",{"type":17,"tag":239,"props":5654,"children":5656},{"id":5655},"clear-naming-and-scoped-tool-sets",[5657],{"type":23,"value":5658},"Clear Naming and Scoped Tool Sets",{"type":17,"tag":29,"props":5660,"children":5661},{},[5662],{"type":23,"value":5663},"Tool names and descriptions determine selection accuracy. Specific naming reduces confusion. Dynamic loading or tool search limits the number of tools exposed at once, improving reliability.",{"type":17,"tag":239,"props":5665,"children":5667},{"id":5666},"correction-loops-for-missing-data",[5668],{"type":23,"value":5669},"Correction Loops for Missing Data",{"type":17,"tag":29,"props":5671,"children":5672},{},[5673],{"type":23,"value":5674},"When parameters are missing, systems should not fail silently. They should return structured errors that prompt the model to request the missing information. This creates a feedback loop that resolves incomplete calls.",{"type":17,"tag":239,"props":5676,"children":5678},{"id":5677},"idempotency-and-safe-retries",[5679],{"type":23,"value":5680},"Idempotency and Safe Retries",{"type":17,"tag":29,"props":5682,"children":5683},{},[5684],{"type":23,"value":5685},"Every mutation should be idempotent. Unique request IDs prevent duplicate writes. Retry logic should use exponential backoff and jitter to handle transient failures without overwhelming APIs.",{"type":17,"tag":239,"props":5687,"children":5689},{"id":5688},"authentication-and-authorization-layers",[5690],{"type":23,"value":5691},"Authentication and Authorization Layers",{"type":17,"tag":29,"props":5693,"children":5694},{},[5695,5697,5701],{"type":23,"value":5696},"Tool execution must enforce permissions. API keys, ",{"type":17,"tag":133,"props":5698,"children":5699},{"href":779},[5700],{"type":23,"value":782},{"type":23,"value":5702}," tokens, and role-based access control ensure that agents act within allowed boundaries. Authorization should be checked before execution, not inferred from context.",{"type":17,"tag":239,"props":5704,"children":5706},{"id":5705},"context-and-response-management",[5707],{"type":23,"value":5708},"Context and Response Management",{"type":17,"tag":29,"props":5710,"children":5711},{},[5712],{"type":23,"value":5713},"Large responses should be summarized or stored outside the model context. Tool definitions should be scoped and loaded dynamically. This keeps the model focused and reduces errors.",{"type":17,"tag":239,"props":5715,"children":5717},{"id":5716},"execution-outside-the-model",[5718],{"type":23,"value":5719},"Execution Outside the Model",{"type":17,"tag":29,"props":5721,"children":5722},{},[5723],{"type":23,"value":5724},"Reliable systems move logic out of the model. Loops, conditionals, and multi-step workflows are handled programmatically. The model decides what to do. The system ensures it is done correctly.",{"type":17,"tag":68,"props":5726,"children":5728},{"id":5727},"the-hidden-problem-apis-not-models",[5729],{"type":23,"value":5730},"The Hidden Problem: APIs, Not Models",{"type":17,"tag":29,"props":5732,"children":5733},{},[5734],{"type":23,"value":5735},"Most guidance assumes tools are clean and predictable. In reality, each tool wraps an external API. That is where complexity increases.",{"type":17,"tag":29,"props":5737,"children":5738},{},[5739],{"type":23,"value":5740},"Every SaaS API behaves differently:",{"type":17,"tag":80,"props":5742,"children":5743},{},[5744,5749,5754,5764,5769,5774],{"type":17,"tag":84,"props":5745,"children":5746},{},[5747],{"type":23,"value":5748},"different authentication models",{"type":17,"tag":84,"props":5750,"children":5751},{},[5752],{"type":23,"value":5753},"different object schemas",{"type":17,"tag":84,"props":5755,"children":5756},{},[5757,5758,5762],{"type":23,"value":131},{"type":17,"tag":133,"props":5759,"children":5760},{"href":1857},[5761],{"type":23,"value":1860},{"type":23,"value":5763}," and filtering",{"type":17,"tag":84,"props":5765,"children":5766},{},[5767],{"type":23,"value":5768},"different error formats",{"type":17,"tag":84,"props":5770,"children":5771},{},[5772],{"type":23,"value":5773},"different rate limits",{"type":17,"tag":84,"props":5775,"children":5776},{},[5777,5779,5782,5784,5787],{"type":23,"value":5778},"different retry behavior",{"type":17,"tag":3891,"props":5780,"children":5781},{},[],{"type":23,"value":5783},"Even if tool calling is implemented correctly, the underlying APIs introduce inconsistency. Validation becomes harder. Idempotency becomes unclear. Error handling becomes fragmented.",{"type":17,"tag":3891,"props":5785,"children":5786},{},[],{"type":23,"value":5788},"This is why many agent systems work in demos and fail in production.",{"type":17,"tag":68,"props":5790,"children":5792},{"id":5791},"reliable-tool-calls-require-a-stable-data-layer",[5793],{"type":23,"value":5794},"Reliable Tool Calls Require a Stable Data Layer",{"type":17,"tag":29,"props":5796,"children":5797},{},[5798],{"type":23,"value":5799},"To make tool calling reliable, the underlying APIs must be predictable.",{"type":17,"tag":29,"props":5801,"children":5802},{},[5803],{"type":23,"value":5804},"That means:",{"type":17,"tag":80,"props":5806,"children":5807},{},[5808,5813,5818,5823,5828],{"type":17,"tag":84,"props":5809,"children":5810},{},[5811],{"type":23,"value":5812},"consistent schema structures",{"type":17,"tag":84,"props":5814,"children":5815},{},[5816],{"type":23,"value":5817},"standardized authentication patterns",{"type":17,"tag":84,"props":5819,"children":5820},{},[5821],{"type":23,"value":5822},"unified pagination and filtering patterns",{"type":17,"tag":84,"props":5824,"children":5825},{},[5826],{"type":23,"value":5827},"consistent error handling patterns",{"type":17,"tag":84,"props":5829,"children":5830},{},[5831,5833,5836],{"type":23,"value":5832},"normalized object models",{"type":17,"tag":3891,"props":5834,"children":5835},{},[],{"type":23,"value":5837},"Without this, every tool becomes a custom integration with its own edge cases. The execution layer becomes brittle.",{"type":17,"tag":68,"props":5839,"children":5840},{"id":1051},[5841],{"type":23,"value":4247},{"type":17,"tag":29,"props":5843,"children":5844},{},[5845],{"type":23,"value":5846},"Unified provides a normalized API layer across SaaS systems. Instead of building separate integrations for CRM, ticketing, file storage, ATS, and other categories, teams interact with a consistent interface.",{"type":17,"tag":29,"props":5848,"children":5849},{},[5850],{"type":23,"value":5851},"This changes how tool calling behaves:",{"type":17,"tag":80,"props":5853,"children":5854},{},[5855,5860,5865,5869,5874],{"type":17,"tag":84,"props":5856,"children":5857},{},[5858],{"type":23,"value":5859},"schemas are normalized across providers",{"type":17,"tag":84,"props":5861,"children":5862},{},[5863],{"type":23,"value":5864},"authentication follows a unified pattern",{"type":17,"tag":84,"props":5866,"children":5867},{},[5868],{"type":23,"value":5427},{"type":17,"tag":84,"props":5870,"children":5871},{},[5872],{"type":23,"value":5873},"error handling and pagination follow consistent patterns",{"type":17,"tag":84,"props":5875,"children":5876},{},[5877,5878,5881,5883,5886],{"type":23,"value":5432},{"type":17,"tag":3891,"props":5879,"children":5880},{},[],{"type":23,"value":5882},"In this model, tools are not thin wrappers around dozens of inconsistent APIs. They sit on top of a normalized data layer that abstracts provider differences.",{"type":17,"tag":3891,"props":5884,"children":5885},{},[],{"type":23,"value":5887},"That stability is what enables reliable tool calling at scale.",{"type":17,"tag":68,"props":5889,"children":5891},{"id":5890},"naive-vs-production-systems",[5892],{"type":23,"value":5893},"Naive vs Production Systems",{"type":17,"tag":29,"props":5895,"children":5896},{},[5897],{"type":23,"value":5898},"Naive implementations expose all tools to the model, skip validation, and rely on the model to get everything right. Errors surface directly to users. Duplicate actions occur. Systems break under load.",{"type":17,"tag":29,"props":5900,"children":5901},{},[5902],{"type":23,"value":5903},"Production systems add layers:",{"type":17,"tag":80,"props":5905,"children":5906},{},[5907,5912,5917,5922,5927,5932],{"type":17,"tag":84,"props":5908,"children":5909},{},[5910],{"type":23,"value":5911},"schema enforcement",{"type":17,"tag":84,"props":5913,"children":5914},{},[5915],{"type":23,"value":5916},"validation and correction",{"type":17,"tag":84,"props":5918,"children":5919},{},[5920],{"type":23,"value":5921},"idempotency and retries",{"type":17,"tag":84,"props":5923,"children":5924},{},[5925],{"type":23,"value":5926},"scoped tool exposure",{"type":17,"tag":84,"props":5928,"children":5929},{},[5930],{"type":23,"value":5931},"authorization checks",{"type":17,"tag":84,"props":5933,"children":5934},{},[5935,5937,5940],{"type":23,"value":5936},"execution orchestration",{"type":17,"tag":3891,"props":5938,"children":5939},{},[],{"type":23,"value":5941},"These layers turn probabilistic outputs into reliable system behavior.",{"type":17,"tag":68,"props":5943,"children":5944},{"id":2316},[5945],{"type":23,"value":2319},{"type":17,"tag":29,"props":5947,"children":5948},{},[5949],{"type":23,"value":5950},"Tool calling is not just about letting a model invoke functions. It is about building an execution layer that can safely interact with real systems. Reliability comes from structure: schemas, validation, idempotency, authorization, and controlled execution.",{"type":17,"tag":29,"props":5952,"children":5953},{},[5954],{"type":23,"value":5955},"The model decides what to do. The system guarantees it is done correctly.",{"type":17,"tag":29,"props":5957,"children":5958},{},[5959,5960],{"type":23,"value":1609},{"type":17,"tag":133,"props":5961,"children":5963},{"href":1612,"rel":5962},[214],[5964],{"type":23,"value":1616},{"type":17,"tag":29,"props":5966,"children":5967},{},[5968,5969],{"type":23,"value":1609},{"type":17,"tag":133,"props":5970,"children":5972},{"href":1623,"rel":5971},[214],[5973],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":5975},[5976,5977,5986,5995,5996,5997,5998,5999],{"id":5528,"depth":1629,"text":5531},{"id":5539,"depth":1629,"text":5542,"children":5978},[5979,5980,5981,5982,5983,5984,5985],{"id":5550,"depth":1635,"text":5553},{"id":5561,"depth":1635,"text":5564},{"id":5572,"depth":1635,"text":5575},{"id":5583,"depth":1635,"text":5586},{"id":5594,"depth":1635,"text":5597},{"id":5611,"depth":1635,"text":5614},{"id":5622,"depth":1635,"text":5625},{"id":5633,"depth":1629,"text":5636,"children":5987},[5988,5989,5990,5991,5992,5993,5994],{"id":5644,"depth":1635,"text":5647},{"id":5655,"depth":1635,"text":5658},{"id":5666,"depth":1635,"text":5669},{"id":5677,"depth":1635,"text":5680},{"id":5688,"depth":1635,"text":5691},{"id":5705,"depth":1635,"text":5708},{"id":5716,"depth":1635,"text":5719},{"id":5727,"depth":1629,"text":5730},{"id":5791,"depth":1629,"text":5794},{"id":1051,"depth":1629,"text":4247},{"id":5890,"depth":1629,"text":5893},{"id":2316,"depth":1629,"text":2319},"content:blog:how_to_build_reliable_tool_calls_for_ai_agents.md","blog/how_to_build_reliable_tool_calls_for_ai_agents.md","blog/how_to_build_reliable_tool_calls_for_ai_agents",{"_path":6004,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":6005,"description":6006,"img":6007,"date":6008,"tag":6009,"body":6010,"_type":1677,"_id":6332,"_source":1679,"_file":6333,"_stem":6334,"_extension":1682},"/blog/oracle_hcm_taleo_oauth_credentials_guide","Oracle HCM / Taleo OAuth Credentials Guide","To connect Oracle HCM / Taleo to Unified, you only need to collect these 3 values from Oracle,","https://s3.us-east-2.amazonaws.com/unified-article-images/oracle_hcm_taleo_oauth_credentials_guide-icon.png","2026-04-06T15:35:00.000Z",null,{"type":14,"children":6011,"toc":6326},[6012,6017,6020,6028,6033,6051,6056,6065,6070,6085,6093,6102,6110,6115,6140,6145,6153,6187,6201,6206,6211,6216,6234,6242,6247,6258,6263,6272,6277,6292,6301],{"type":17,"tag":18,"props":6013,"children":6015},{"id":6014},"oracle-hcm-taleo-oauth-credentials-guide",[6016],{"type":23,"value":6005},{"type":17,"tag":25,"props":6018,"children":6019},{},[],{"type":17,"tag":29,"props":6021,"children":6022},{},[6023],{"type":17,"tag":33,"props":6024,"children":6025},{},[6026],{"type":23,"value":6027},"April 6, 2026",{"type":17,"tag":29,"props":6029,"children":6030},{},[6031],{"type":23,"value":6032},"To connect Oracle HCM / Taleo to Unified, you only need to collect these 3 values from Oracle:",{"type":17,"tag":80,"props":6034,"children":6035},{},[6036,6041,6046],{"type":17,"tag":84,"props":6037,"children":6038},{},[6039],{"type":23,"value":6040},"Client ID",{"type":17,"tag":84,"props":6042,"children":6043},{},[6044],{"type":23,"value":6045},"Client Secret",{"type":17,"tag":84,"props":6047,"children":6048},{},[6049],{"type":23,"value":6050},"Servername",{"type":17,"tag":29,"props":6052,"children":6053},{},[6054],{"type":23,"value":6055},"You will enter those directly into Unified.",{"type":17,"tag":68,"props":6057,"children":6059},{"id":6058},"what-to-enter-in-unified",[6060],{"type":17,"tag":48,"props":6061,"children":6062},{},[6063],{"type":23,"value":6064},"What To Enter In Unified",{"type":17,"tag":29,"props":6066,"children":6067},{},[6068],{"type":23,"value":6069},"When creating the Oracle HCM / Taleo connection, fill in:",{"type":17,"tag":80,"props":6071,"children":6072},{},[6073,6077,6081],{"type":17,"tag":84,"props":6074,"children":6075},{},[6076],{"type":23,"value":6040},{"type":17,"tag":84,"props":6078,"children":6079},{},[6080],{"type":23,"value":6045},{"type":17,"tag":84,"props":6082,"children":6083},{},[6084],{"type":23,"value":6050},{"type":17,"tag":29,"props":6086,"children":6087},{},[6088],{"type":17,"tag":48,"props":6089,"children":6090},{},[6091],{"type":23,"value":6092},"Example Servername",{"type":17,"tag":68,"props":6094,"children":6096},{"id":6095},"how-to-get-these-values-from-oracle",[6097],{"type":17,"tag":48,"props":6098,"children":6099},{},[6100],{"type":23,"value":6101},"How To Get These Values From Oracle",{"type":17,"tag":29,"props":6103,"children":6104},{},[6105],{"type":17,"tag":48,"props":6106,"children":6107},{},[6108],{"type":23,"value":6109},"1. Find Your Servername",{"type":17,"tag":29,"props":6111,"children":6112},{},[6113],{"type":23,"value":6114},"Ask your Oracle administrator for your Oracle Fusion HCM host name.",{"type":17,"tag":29,"props":6116,"children":6117},{},[6118,6120,6127,6129],{"type":23,"value":6119},"It usually looks like:\n",{"type":17,"tag":6121,"props":6122,"children":6124},"code",{"className":6123},[],[6125],{"type":23,"value":6126},"\u003Ctenant>.fa.\u003Cregion>.oraclecloud.com",{"type":23,"value":6128},"\nExample:\n",{"type":17,"tag":133,"props":6130,"children":6133},{"href":6131,"rel":6132},"http://example.fa.us2.oraclecloud.com/",[214],[6134],{"type":17,"tag":6121,"props":6135,"children":6137},{"className":6136},[],[6138],{"type":23,"value":6139},"example.fa.us2.oraclecloud.com",{"type":17,"tag":29,"props":6141,"children":6142},{},[6143],{"type":23,"value":6144},"This exact value is what you should enter into Unified as the Servername.",{"type":17,"tag":29,"props":6146,"children":6147},{},[6148],{"type":17,"tag":48,"props":6149,"children":6150},{},[6151],{"type":23,"value":6152},"2. Create A Confidential Application In Oracle",{"type":17,"tag":6154,"props":6155,"children":6156},"ol",{},[6157,6162,6167,6172,6177,6182],{"type":17,"tag":84,"props":6158,"children":6159},{},[6160],{"type":23,"value":6161},"Sign in to Oracle as an administrator",{"type":17,"tag":84,"props":6163,"children":6164},{},[6165],{"type":23,"value":6166},"Open Integrated applications",{"type":17,"tag":84,"props":6168,"children":6169},{},[6170],{"type":23,"value":6171},"Click Add application",{"type":17,"tag":84,"props":6173,"children":6174},{},[6175],{"type":23,"value":6176},"Choose Confidential Application",{"type":17,"tag":84,"props":6178,"children":6179},{},[6180],{"type":23,"value":6181},"Enter a name such as Unified Oracle HCM Integration",{"type":17,"tag":84,"props":6183,"children":6184},{},[6185],{"type":23,"value":6186},"Continue through the setup",{"type":17,"tag":29,"props":6188,"children":6189},{},[6190],{"type":17,"tag":48,"props":6191,"children":6192},{},[6193,6195,6199],{"type":23,"value":6194},"3. Enable ",{"type":17,"tag":133,"props":6196,"children":6197},{"href":779},[6198],{"type":23,"value":782},{"type":23,"value":6200}," Client Access",{"type":17,"tag":29,"props":6202,"children":6203},{},[6204],{"type":23,"value":6205},"During application setup, make sure OAuth client access is enabled for the application.",{"type":17,"tag":29,"props":6207,"children":6208},{},[6209],{"type":23,"value":6210},"For this Unified connection, Oracle should issue credentials for a confidential application that can request access tokens for the HCM / Taleo APIs.",{"type":17,"tag":29,"props":6212,"children":6213},{},[6214],{"type":23,"value":6215},"Your Oracle administrator may need to:",{"type":17,"tag":80,"props":6217,"children":6218},{},[6219,6224,6229],{"type":17,"tag":84,"props":6220,"children":6221},{},[6222],{"type":23,"value":6223},"enable OAuth for the app",{"type":17,"tag":84,"props":6225,"children":6226},{},[6227],{"type":23,"value":6228},"allow the app to access the appropriate Oracle HCM / Taleo resources",{"type":17,"tag":84,"props":6230,"children":6231},{},[6232],{"type":23,"value":6233},"activate the application once setup is complete",{"type":17,"tag":29,"props":6235,"children":6236},{},[6237],{"type":17,"tag":48,"props":6238,"children":6239},{},[6240],{"type":23,"value":6241},"4. Copy The Credentials",{"type":17,"tag":29,"props":6243,"children":6244},{},[6245],{"type":23,"value":6246},"After the confidential application is created and activated, open the application details and copy:",{"type":17,"tag":80,"props":6248,"children":6249},{},[6250,6254],{"type":17,"tag":84,"props":6251,"children":6252},{},[6253],{"type":23,"value":6040},{"type":17,"tag":84,"props":6255,"children":6256},{},[6257],{"type":23,"value":6045},{"type":17,"tag":29,"props":6259,"children":6260},{},[6261],{"type":23,"value":6262},"These are the exact values to enter into Unified.",{"type":17,"tag":68,"props":6264,"children":6266},{"id":6265},"final-checklist",[6267],{"type":17,"tag":48,"props":6268,"children":6269},{},[6270],{"type":23,"value":6271},"Final Checklist",{"type":17,"tag":29,"props":6273,"children":6274},{},[6275],{"type":23,"value":6276},"Before creating the connection in Unified, make sure you have:",{"type":17,"tag":80,"props":6278,"children":6279},{},[6280,6284,6288],{"type":17,"tag":84,"props":6281,"children":6282},{},[6283],{"type":23,"value":6040},{"type":17,"tag":84,"props":6285,"children":6286},{},[6287],{"type":23,"value":6045},{"type":17,"tag":84,"props":6289,"children":6290},{},[6291],{"type":23,"value":6050},{"type":17,"tag":68,"props":6293,"children":6295},{"id":6294},"oraclereferences",[6296],{"type":17,"tag":48,"props":6297,"children":6298},{},[6299],{"type":23,"value":6300},"Oracle References",{"type":17,"tag":80,"props":6302,"children":6303},{},[6304,6315],{"type":17,"tag":84,"props":6305,"children":6306},{},[6307,6309],{"type":23,"value":6308},"OAuth configuration: ",{"type":17,"tag":133,"props":6310,"children":6313},{"href":6311,"rel":6312},"https://docs.oracle.com/en/cloud/saas/applications-common/25d/oaext/configure-oauth.html",[214],[6314],{"type":23,"value":6311},{"type":17,"tag":84,"props":6316,"children":6317},{},[6318,6320],{"type":23,"value":6319},"HCM REST API: ",{"type":17,"tag":133,"props":6321,"children":6324},{"href":6322,"rel":6323},"https://docs.oracle.com/en/cloud/saas/human-resources/farws/index.html",[214],[6325],{"type":23,"value":6322},{"title":7,"searchDepth":1629,"depth":1629,"links":6327},[6328,6329,6330,6331],{"id":6058,"depth":1629,"text":6064},{"id":6095,"depth":1629,"text":6101},{"id":6265,"depth":1629,"text":6271},{"id":6294,"depth":1629,"text":6300},"content:blog:oracle_hcm_taleo_oauth_credentials_guide.md","blog/oracle_hcm_taleo_oauth_credentials_guide.md","blog/oracle_hcm_taleo_oauth_credentials_guide",{"_path":6336,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":6337,"description":6338,"img":6339,"date":6340,"tag":6341,"body":6342,"_type":1677,"_id":6815,"_source":1679,"_file":6816,"_stem":6817,"_extension":1682},"/blog/how_to_create_a_xero_connection_in","How to Create a Xero Connection in","Follow the steps below to create a Xero application and connect it to Unified.to.","https://unified.to/images/logo.svg","2026-04-02T18:29:00.000Z","Guides",{"type":14,"children":6343,"toc":6801},[6344,6349,6352,6360,6364,6370,6375,6384,6389,6395,6406,6411,6434,6443,6450,6456,6467,6472,6481,6489,6493,6511,6516,6527,6530,6533,6540,6546,6558,6563,6574,6582,6589,6595,6600,6609,6614,6625,6636,6643,6649,6654,6691,6696,6702,6708,6721,6733,6739,6767,6773,6778],{"type":17,"tag":18,"props":6345,"children":6347},{"id":6346},"how-to-create-a-xero-connection-in",[6348],{"type":23,"value":6337},{"type":17,"tag":25,"props":6350,"children":6351},{},[],{"type":17,"tag":29,"props":6353,"children":6354},{},[6355],{"type":17,"tag":33,"props":6356,"children":6357},{},[6358],{"type":23,"value":6359},"April 2, 2026",{"type":17,"tag":29,"props":6361,"children":6362},{},[6363],{"type":23,"value":6338},{"type":17,"tag":68,"props":6365,"children":6367},{"id":6366},"_1-sign-in-to-the-xero-developer-portal",[6368],{"type":23,"value":6369},"1. Sign in to the Xero Developer Portal",{"type":17,"tag":29,"props":6371,"children":6372},{},[6373],{"type":23,"value":6374},"Go to the Xero Developer portal:",{"type":17,"tag":29,"props":6376,"children":6377},{},[6378],{"type":17,"tag":133,"props":6379,"children":6382},{"href":6380,"rel":6381},"https://developer.xero.com/app/manage/",[214],[6383],{"type":23,"value":6380},{"type":17,"tag":29,"props":6385,"children":6386},{},[6387],{"type":23,"value":6388},"Sign in with your Xero account.",{"type":17,"tag":68,"props":6390,"children":6392},{"id":6391},"_2-create-a-new-app",[6393],{"type":23,"value":6394},"2. Create a New App",{"type":17,"tag":29,"props":6396,"children":6397},{},[6398,6400,6405],{"type":23,"value":6399},"From the dashboard, click ",{"type":17,"tag":48,"props":6401,"children":6402},{},[6403],{"type":23,"value":6404},"Create New App",{"type":23,"value":54},{"type":17,"tag":29,"props":6407,"children":6408},{},[6409],{"type":23,"value":6410},"Choose the appropriate app type and fill in the required details:",{"type":17,"tag":80,"props":6412,"children":6413},{},[6414,6419,6424,6429],{"type":17,"tag":84,"props":6415,"children":6416},{},[6417],{"type":23,"value":6418},"App name",{"type":17,"tag":84,"props":6420,"children":6421},{},[6422],{"type":23,"value":6423},"Company or organization name",{"type":17,"tag":84,"props":6425,"children":6426},{},[6427],{"type":23,"value":6428},"Privacy policy URL",{"type":17,"tag":84,"props":6430,"children":6431},{},[6432],{"type":23,"value":6433},"Terms and conditions URL (if required)",{"type":17,"tag":29,"props":6435,"children":6436},{},[6437],{"type":17,"tag":6438,"props":6439,"children":6442},"img",{"alt":6440,"src":6441},"image.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-0.png",[],{"type":17,"tag":29,"props":6444,"children":6445},{},[6446],{"type":17,"tag":6438,"props":6447,"children":6449},{"alt":6440,"src":6448},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-1.png",[],{"type":17,"tag":68,"props":6451,"children":6453},{"id":6452},"_3-add-the-redirect-uri",[6454],{"type":23,"value":6455},"3. Add the Redirect URI",{"type":17,"tag":29,"props":6457,"children":6458},{},[6459,6461,6465],{"type":23,"value":6460},"While creating the app, add the ",{"type":17,"tag":133,"props":6462,"children":6463},{"href":779},[6464],{"type":23,"value":782},{"type":23,"value":6466}," 2.0 Redirect URI provided by Unified.to.",{"type":17,"tag":29,"props":6468,"children":6469},{},[6470],{"type":23,"value":6471},"You can find the correct redirect URI here:",{"type":17,"tag":29,"props":6473,"children":6474},{},[6475],{"type":17,"tag":133,"props":6476,"children":6479},{"href":6477,"rel":6478},"https://app.unified.to/integrations/xero?tab=oauth2",[214],[6480],{"type":23,"value":6477},{"type":17,"tag":3414,"props":6482,"children":6483},{},[6484],{"type":17,"tag":29,"props":6485,"children":6486},{},[6487],{"type":23,"value":6488},"Important: The redirect URI may differ depending on your Unified.to region. Make sure you copy the exact value shown in your Unified.to dashboard.",{"type":17,"tag":29,"props":6490,"children":6491},{},[6492],{"type":23,"value":377},{"type":17,"tag":80,"props":6494,"children":6495},{},[6496,6501,6506],{"type":17,"tag":84,"props":6497,"children":6498},{},[6499],{"type":23,"value":6500},"US region",{"type":17,"tag":84,"props":6502,"children":6503},{},[6504],{"type":23,"value":6505},"EU region",{"type":17,"tag":84,"props":6507,"children":6508},{},[6509],{"type":23,"value":6510},"AU region",{"type":17,"tag":29,"props":6512,"children":6513},{},[6514],{"type":23,"value":6515},"If the redirect URI does not match exactly, Xero authentication will fail.",{"type":17,"tag":29,"props":6517,"children":6518},{},[6519,6521,6526],{"type":23,"value":6520},"After adding the redirect URI, click ",{"type":17,"tag":48,"props":6522,"children":6523},{},[6524],{"type":23,"value":6525},"Create App",{"type":23,"value":54},{"type":17,"tag":25,"props":6528,"children":6529},{},[],{"type":17,"tag":68,"props":6531,"children":6532},{"id":7},[],{"type":17,"tag":29,"props":6534,"children":6535},{},[6536],{"type":17,"tag":6438,"props":6537,"children":6539},{"alt":6440,"src":6538},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-2.png",[],{"type":17,"tag":68,"props":6541,"children":6543},{"id":6542},"_4-copy-the-client-id-and-client-secret",[6544],{"type":23,"value":6545},"4. Copy the Client ID and Client Secret",{"type":17,"tag":29,"props":6547,"children":6548},{},[6549,6551,6556],{"type":23,"value":6550},"After the app is created, open the app and go to the ",{"type":17,"tag":48,"props":6552,"children":6553},{},[6554],{"type":23,"value":6555},"Configuration",{"type":23,"value":6557}," tab.",{"type":17,"tag":29,"props":6559,"children":6560},{},[6561],{"type":23,"value":6562},"There you will find:",{"type":17,"tag":80,"props":6564,"children":6565},{},[6566,6570],{"type":17,"tag":84,"props":6567,"children":6568},{},[6569],{"type":23,"value":6040},{"type":17,"tag":84,"props":6571,"children":6572},{},[6573],{"type":23,"value":6045},{"type":17,"tag":3414,"props":6575,"children":6576},{},[6577],{"type":17,"tag":29,"props":6578,"children":6579},{},[6580],{"type":23,"value":6581},"Keep the Client Secret secure. Do not share it publicly or commit it to source control.",{"type":17,"tag":29,"props":6583,"children":6584},{},[6585],{"type":17,"tag":6438,"props":6586,"children":6588},{"alt":6440,"src":6587},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-3.png",[],{"type":17,"tag":68,"props":6590,"children":6592},{"id":6591},"_5-add-credentials-to-unifiedto",[6593],{"type":23,"value":6594},"5. Add Credentials to Unified.to",{"type":17,"tag":29,"props":6596,"children":6597},{},[6598],{"type":23,"value":6599},"Open the Xero integration settings page in Unified.to:",{"type":17,"tag":29,"props":6601,"children":6602},{},[6603],{"type":17,"tag":133,"props":6604,"children":6607},{"href":6605,"rel":6606},"https://app.unified.to/integrations/xero?tab=auth",[214],[6608],{"type":23,"value":6605},{"type":17,"tag":29,"props":6610,"children":6611},{},[6612],{"type":23,"value":6613},"Paste the following values:",{"type":17,"tag":80,"props":6615,"children":6616},{},[6617,6621],{"type":17,"tag":84,"props":6618,"children":6619},{},[6620],{"type":23,"value":6040},{"type":17,"tag":84,"props":6622,"children":6623},{},[6624],{"type":23,"value":6045},{"type":17,"tag":29,"props":6626,"children":6627},{},[6628,6630,6635],{"type":23,"value":6629},"Click ",{"type":17,"tag":48,"props":6631,"children":6632},{},[6633],{"type":23,"value":6634},"Activate",{"type":23,"value":54},{"type":17,"tag":29,"props":6637,"children":6638},{},[6639],{"type":17,"tag":6438,"props":6640,"children":6642},{"alt":6440,"src":6641},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_xero_connection_in-4.png",[],{"type":17,"tag":68,"props":6644,"children":6646},{"id":6645},"_6-create-a-connection-using-embedded-components",[6647],{"type":23,"value":6648},"6. Create a Connection Using Embedded Components",{"type":17,"tag":29,"props":6650,"children":6651},{},[6652],{"type":23,"value":6653},"To create a customer-facing connection flow:",{"type":17,"tag":6154,"props":6655,"children":6656},{},[6657,6669,6681,6686],{"type":17,"tag":84,"props":6658,"children":6659},{},[6660,6662,6667],{"type":23,"value":6661},"Go to ",{"type":17,"tag":48,"props":6663,"children":6664},{},[6665],{"type":23,"value":6666},"Embedded Components",{"type":23,"value":6668}," in Unified.to.",{"type":17,"tag":84,"props":6670,"children":6671},{},[6672,6674,6679],{"type":23,"value":6673},"Select the ",{"type":17,"tag":48,"props":6675,"children":6676},{},[6677],{"type":23,"value":6678},"Xero",{"type":23,"value":6680}," integration.",{"type":17,"tag":84,"props":6682,"children":6683},{},[6684],{"type":23,"value":6685},"Launch the embedded authorization flow.",{"type":17,"tag":84,"props":6687,"children":6688},{},[6689],{"type":23,"value":6690},"Complete the authorization process.",{"type":17,"tag":29,"props":6692,"children":6693},{},[6694],{"type":23,"value":6695},"This allows your end users to connect their Xero account directly from your application.",{"type":17,"tag":68,"props":6697,"children":6699},{"id":6698},"notes",[6700],{"type":23,"value":6701},"Notes",{"type":17,"tag":239,"props":6703,"children":6705},{"id":6704},"journals-endpoint-availability",[6706],{"type":23,"value":6707},"Journals Endpoint Availability",{"type":17,"tag":29,"props":6709,"children":6710},{},[6711,6713,6719],{"type":23,"value":6712},"The ",{"type":17,"tag":6121,"props":6714,"children":6716},{"className":6715},[],[6717],{"type":23,"value":6718},"Journals",{"type":23,"value":6720}," endpoint is a premium Xero feature.",{"type":17,"tag":29,"props":6722,"children":6723},{},[6724,6726,6731],{"type":23,"value":6725},"According to Xero's documentation, the Journals API is only available starting with the ",{"type":17,"tag":48,"props":6727,"children":6728},{},[6729],{"type":23,"value":6730},"Advanced",{"type":23,"value":6732}," pricing tier. Customers using lower Xero plans may receive authorization or access errors when calling this endpoint.",{"type":17,"tag":239,"props":6734,"children":6736},{"id":6735},"common-issues",[6737],{"type":23,"value":6738},"Common Issues",{"type":17,"tag":80,"props":6740,"children":6741},{},[6742,6747,6752,6757,6762],{"type":17,"tag":84,"props":6743,"children":6744},{},[6745],{"type":23,"value":6746},"Ensure the redirect URI in Xero exactly matches the one shown in Unified.to.",{"type":17,"tag":84,"props":6748,"children":6749},{},[6750],{"type":23,"value":6751},"Make sure you are using the correct region-specific Unified.to redirect URI.",{"type":17,"tag":84,"props":6753,"children":6754},{},[6755],{"type":23,"value":6756},"If you regenerate the Client Secret in Xero, you must update it in Unified.to.",{"type":17,"tag":84,"props":6758,"children":6759},{},[6760],{"type":23,"value":6761},"Only users with sufficient permissions in Xero can authorize an organization.",{"type":17,"tag":84,"props":6763,"children":6764},{},[6765],{"type":23,"value":6766},"If you have previously selected an organization for the same Xero app, Xero may automatically reuse that organization during future authorizations.",{"type":17,"tag":239,"props":6768,"children":6770},{"id":6769},"troubleshooting",[6771],{"type":23,"value":6772},"Troubleshooting",{"type":17,"tag":29,"props":6774,"children":6775},{},[6776],{"type":23,"value":6777},"If authentication fails:",{"type":17,"tag":80,"props":6779,"children":6780},{},[6781,6786,6791,6796],{"type":17,"tag":84,"props":6782,"children":6783},{},[6784],{"type":23,"value":6785},"Verify the Client ID and Client Secret are correct.",{"type":17,"tag":84,"props":6787,"children":6788},{},[6789],{"type":23,"value":6790},"Double-check the redirect URI.",{"type":17,"tag":84,"props":6792,"children":6793},{},[6794],{"type":23,"value":6795},"Re-authorize the connection after saving any changes.",{"type":17,"tag":84,"props":6797,"children":6798},{},[6799],{"type":23,"value":6800},"Remove the existing connection and create a new one if necessary.",{"title":7,"searchDepth":1629,"depth":1629,"links":6802},[6803,6804,6805,6806,6807,6808,6809,6810],{"id":6366,"depth":1629,"text":6369},{"id":6391,"depth":1629,"text":6394},{"id":6452,"depth":1629,"text":6455},{"id":7,"depth":1629,"text":7},{"id":6542,"depth":1629,"text":6545},{"id":6591,"depth":1629,"text":6594},{"id":6645,"depth":1629,"text":6648},{"id":6698,"depth":1629,"text":6701,"children":6811},[6812,6813,6814],{"id":6704,"depth":1635,"text":6707},{"id":6735,"depth":1635,"text":6738},{"id":6769,"depth":1635,"text":6772},"content:blog:how_to_create_a_xero_connection_in.md","blog/how_to_create_a_xero_connection_in.md","blog/how_to_create_a_xero_connection_in",{"_path":6819,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":6820,"description":6821,"img":6339,"date":6822,"tag":6341,"body":6823,"_type":1677,"_id":6991,"_source":1679,"_file":6992,"_stem":6993,"_extension":1682},"/blog/how_to_setup_quickbooks_desktop","How to Setup Quickbooks Desktop","1. Download QBWC (Web Connector) from Quickbooks and install the program on the same computer where your Quickbooks Desktop is running.","2026-04-02T14:30:00.000Z",{"type":14,"children":6824,"toc":6989},[6825,6830,6833,6840,6860,6868,6876,6884,6892,6904,6917,6925,6933,6941,6949,6957,6965,6973,6981],{"type":17,"tag":18,"props":6826,"children":6828},{"id":6827},"how-to-setup-quickbooks-desktop",[6829],{"type":23,"value":6820},{"type":17,"tag":25,"props":6831,"children":6832},{},[],{"type":17,"tag":29,"props":6834,"children":6835},{},[6836],{"type":17,"tag":33,"props":6837,"children":6838},{},[6839],{"type":23,"value":6359},{"type":17,"tag":6154,"props":6841,"children":6842},{},[6843,6855],{"type":17,"tag":84,"props":6844,"children":6845},{},[6846,6853],{"type":17,"tag":133,"props":6847,"children":6850},{"href":6848,"rel":6849},"https://quickbooks.intuit.com/learn-support/en-ca/help-article/install-products/set-quickbooks-web-connector/L4Vp7VI44_CA_en_CA",[214],[6851],{"type":23,"value":6852},"Download QBWC",{"type":23,"value":6854}," (Web Connector) from Quickbooks and install the program on the same computer where your Quickbooks Desktop is running.",{"type":17,"tag":84,"props":6856,"children":6857},{},[6858],{"type":23,"value":6859},"Activate Quickbooks Desktop Integration in your workspace",{"type":17,"tag":29,"props":6861,"children":6862},{},[6863],{"type":17,"tag":6438,"props":6864,"children":6867},{"alt":6865,"src":6866},"Screenshot_2026-04-02_at_10.37.30_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-0.png",[],{"type":17,"tag":6154,"props":6869,"children":6870},{},[6871],{"type":17,"tag":84,"props":6872,"children":6873},{},[6874],{"type":23,"value":6875},"Create a Quickbooks Desktop connection within Unified (enter your username and password you will use in the QBWC)",{"type":17,"tag":29,"props":6877,"children":6878},{},[6879],{"type":17,"tag":6438,"props":6880,"children":6883},{"alt":6881,"src":6882},"Screenshot_2026-04-02_at_10.39.37_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-1.png",[],{"type":17,"tag":6154,"props":6885,"children":6886},{},[6887],{"type":17,"tag":84,"props":6888,"children":6889},{},[6890],{"type":23,"value":6891},"Create a .qwc file, it should be in the following format:",{"type":17,"tag":6893,"props":6894,"children":6899},"pre",{"className":6895,"code":6897,"language":6898,"meta":7},[6896],"language-javascript","\u003C?xml version=\"1.0\"?>\n\u003CQBWCXML>\n\u003CAppName>Unified\u003C/AppName>\n\u003CAppID>\u003C/AppID>\n\u003CAppURL>\nhttps://api.unified.to/webhook/workspace/quickbooksdesktop?workspace_id=your_workspace_id&amp;connection_id=\nyour_quickbooks_desktop_connection_id\u003C/AppURL>\n\u003CAppDescription>A short description for WCWebService1\u003C/AppDescription>\n\u003CAppSupport>\nhttps://unified.ngrok.dev/support\n\u003C/AppSupport>\n\u003CUserName>your_username\u003C/UserName>\n\u003COwnerID>{57F3B9B1-86F1-4fcc-B1EE-566DE1813D21}\u003C/OwnerID>\n\u003CFileID>{90A44FB5-33D9-4815-AC85-BC87A7E7D1EZ}\u003C/FileID>\n\u003CQBType>QBFS\u003C/QBType>\n\u003CScheduler>\n\u003CRunEveryNMinutes>number_of_minutes_between_each_sync_or_remove_this_if_you_want_to_sync_manually\u003C/RunEveryNMinutes>\n\u003C/Scheduler>\n\u003C/QBWCXML>\n","javascript",[6900],{"type":17,"tag":6121,"props":6901,"children":6902},{"__ignoreMap":7},[6903],{"type":23,"value":6897},{"type":17,"tag":6154,"props":6905,"children":6906},{},[6907,6912],{"type":17,"tag":84,"props":6908,"children":6909},{},[6910],{"type":23,"value":6911},"Once the QBWC has installed, first open your Quickbooks Desktop with the company you wish to sync",{"type":17,"tag":84,"props":6913,"children":6914},{},[6915],{"type":23,"value":6916},"Then open QBWC and click 'Add an application', QBWC will then prompt you to select a file, select the newly created .qwc file from above.",{"type":17,"tag":29,"props":6918,"children":6919},{},[6920],{"type":17,"tag":6438,"props":6921,"children":6924},{"alt":6922,"src":6923},"Screenshot_2026-04-02_at_10.41.19_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-2.png",[],{"type":17,"tag":6154,"props":6926,"children":6927},{},[6928],{"type":17,"tag":84,"props":6929,"children":6930},{},[6931],{"type":23,"value":6932},"Click 'Ok' to grant access",{"type":17,"tag":29,"props":6934,"children":6935},{},[6936],{"type":17,"tag":6438,"props":6937,"children":6940},{"alt":6938,"src":6939},"Screenshot_2026-04-02_at_10.43.58_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-3.png",[],{"type":17,"tag":6154,"props":6942,"children":6943},{},[6944],{"type":17,"tag":84,"props":6945,"children":6946},{},[6947],{"type":23,"value":6948},"Select 'Yes, whenever my Quickbooks company file is open' and 'Continue'",{"type":17,"tag":29,"props":6950,"children":6951},{},[6952],{"type":17,"tag":6438,"props":6953,"children":6956},{"alt":6954,"src":6955},"aaplication_permission_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-4.png",[],{"type":17,"tag":6154,"props":6958,"children":6959},{},[6960],{"type":17,"tag":84,"props":6961,"children":6962},{},[6963],{"type":23,"value":6964},"'Confirm'",{"type":17,"tag":29,"props":6966,"children":6967},{},[6968],{"type":17,"tag":6438,"props":6969,"children":6972},{"alt":6970,"src":6971},"confirm_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-5.png",[],{"type":17,"tag":6154,"props":6974,"children":6975},{},[6976],{"type":17,"tag":84,"props":6977,"children":6978},{},[6979],{"type":23,"value":6980},"QBWC will normally close after this, you can reopen it and you should now see the app is added. Enter the password and to perform your first sync click 'Update Selected'.",{"type":17,"tag":29,"props":6982,"children":6983},{},[6984],{"type":17,"tag":6438,"props":6985,"children":6988},{"alt":6986,"src":6987},"app_added_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_quickbooks_desktop-6.png",[],{"title":7,"searchDepth":1629,"depth":1629,"links":6990},[],"content:blog:how_to_setup_quickbooks_desktop.md","blog/how_to_setup_quickbooks_desktop.md","blog/how_to_setup_quickbooks_desktop",{"_path":6995,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":6996,"description":6997,"img":6998,"date":6999,"tag":12,"body":7000,"_type":1677,"_id":7742,"_source":1679,"_file":7743,"_stem":7744,"_extension":1682},"/blog/saas_integrations_vs_internal_data_pipelines_what_the_difference","SaaS Integrations vs Internal Data Pipelines: What's the Difference?","SaaS teams run into two different problems when working with integrations.","https://s3.us-east-2.amazonaws.com/unified-article-images/saas_integrations_vs_internal_data_pipelines_what_the_difference-icon.png","2026-03-31T14:34:00.000Z",{"type":14,"children":7001,"toc":7738},[7002,7007,7010,7018,7022,7027,7032,7038,7043,7048,7053,7066,7071,7077,7083,7088,7093,7116,7128,7134,7145,7150,7173,7185,7191,7196,7201,7219,7224,7230,7388,7394,7399,7404,7427,7432,7450,7462,7468,7473,7478,7504,7516,7522,7527,7531,7549,7560,7566,7571,7579,7592,7597,7602,7620,7624,7629,7642,7647,7665,7670,7676,7711,7717,7722,7727],{"type":17,"tag":18,"props":7003,"children":7005},{"id":7004},"saas-integrations-vs-internal-data-pipelines-whats-the-difference",[7006],{"type":23,"value":6996},{"type":17,"tag":25,"props":7008,"children":7009},{},[],{"type":17,"tag":29,"props":7011,"children":7012},{},[7013],{"type":17,"tag":33,"props":7014,"children":7015},{},[7016],{"type":23,"value":7017},"March 31, 2026",{"type":17,"tag":29,"props":7019,"children":7020},{},[7021],{"type":23,"value":6997},{"type":17,"tag":29,"props":7023,"children":7024},{},[7025],{"type":23,"value":7026},"One is building integrations into your product for customers. The other is accessing and moving data across your own company's integrations.",{"type":17,"tag":29,"props":7028,"children":7029},{},[7030],{"type":23,"value":7031},"These require different architectures—and using the wrong one creates unnecessary complexity.",{"type":17,"tag":18,"props":7033,"children":7035},{"id":7034},"why-this-distinction-matters",[7036],{"type":23,"value":7037},"Why this distinction matters",{"type":17,"tag":29,"props":7039,"children":7040},{},[7041],{"type":23,"value":7042},"Many teams assume 'integrations' is a single problem.",{"type":17,"tag":29,"props":7044,"children":7045},{},[7046],{"type":23,"value":7047},"It's not.",{"type":17,"tag":29,"props":7049,"children":7050},{},[7051],{"type":23,"value":7052},"There are two fundamentally different workflows:",{"type":17,"tag":80,"props":7054,"children":7055},{},[7056,7061],{"type":17,"tag":84,"props":7057,"children":7058},{},[7059],{"type":23,"value":7060},"delivering integrations as part of your product",{"type":17,"tag":84,"props":7062,"children":7063},{},[7064],{"type":23,"value":7065},"working with data across your own integrations internally",{"type":17,"tag":29,"props":7067,"children":7068},{},[7069],{"type":23,"value":7070},"Most tools blur this line. That's where confusion—and poor architecture decisions—start.",{"type":17,"tag":18,"props":7072,"children":7074},{"id":7073},"building-integrations-vs-accessing-internal-data",[7075],{"type":23,"value":7076},"Building integrations vs accessing internal data",{"type":17,"tag":68,"props":7078,"children":7080},{"id":7079},"what-are-product-integrations",[7081],{"type":23,"value":7082},"What are product integrations?",{"type":17,"tag":29,"props":7084,"children":7085},{},[7086],{"type":23,"value":7087},"Product integrations are features inside your application.",{"type":17,"tag":29,"props":7089,"children":7090},{},[7091],{"type":23,"value":7092},"Your users connect their integrations (e.g. Salesforce, HubSpot), and your product needs to:",{"type":17,"tag":80,"props":7094,"children":7095},{},[7096,7101,7106,7111],{"type":17,"tag":84,"props":7097,"children":7098},{},[7099],{"type":23,"value":7100},"handle authorization across integrations",{"type":17,"tag":84,"props":7102,"children":7103},{},[7104],{"type":23,"value":7105},"retrieve and update data via API calls",{"type":17,"tag":84,"props":7107,"children":7108},{},[7109],{"type":23,"value":7110},"normalize objects like contacts, deals, or tickets",{"type":17,"tag":84,"props":7112,"children":7113},{},[7114],{"type":23,"value":7115},"support real-time use cases like dashboards, workflows, or AI features",{"type":17,"tag":29,"props":7117,"children":7118},{},[7119,7121,7126],{"type":23,"value":7120},"This is an ",{"type":17,"tag":48,"props":7122,"children":7123},{},[7124],{"type":23,"value":7125},"API and infrastructure problem",{"type":23,"value":7127},", not a data pipeline problem.",{"type":17,"tag":68,"props":7129,"children":7131},{"id":7130},"what-is-internal-data-access",[7132],{"type":23,"value":7133},"What is internal data access?",{"type":17,"tag":29,"props":7135,"children":7136},{},[7137,7143],{"type":17,"tag":133,"props":7138,"children":7140},{"href":7139},"/3346207b838480329500f02e16203fa0",[7141],{"type":23,"value":7142},"Internal data access",{"type":23,"value":7144}," is about working with your own company's integrations.",{"type":17,"tag":29,"props":7146,"children":7147},{},[7148],{"type":23,"value":7149},"Your team needs to:",{"type":17,"tag":80,"props":7151,"children":7152},{},[7153,7158,7163,7168],{"type":17,"tag":84,"props":7154,"children":7155},{},[7156],{"type":23,"value":7157},"connect internal integrations (CRM, support, billing, etc.)",{"type":17,"tag":84,"props":7159,"children":7160},{},[7161],{"type":23,"value":7162},"move data between integrations or into a database",{"type":17,"tag":84,"props":7164,"children":7165},{},[7166],{"type":23,"value":7167},"transform and map fields across different schemas",{"type":17,"tag":84,"props":7169,"children":7170},{},[7171],{"type":23,"value":7172},"optionally allow AI clients to retrieve data across integrations",{"type":17,"tag":29,"props":7174,"children":7175},{},[7176,7178,7183],{"type":23,"value":7177},"This is a ",{"type":17,"tag":48,"props":7179,"children":7180},{},[7181],{"type":23,"value":7182},"data movement and access problem",{"type":23,"value":7184},", not a product integration problem.",{"type":17,"tag":18,"props":7186,"children":7188},{"id":7187},"why-teams-confuse-these-two",[7189],{"type":23,"value":7190},"Why teams confuse these two",{"type":17,"tag":29,"props":7192,"children":7193},{},[7194],{"type":23,"value":7195},"Many platforms try to cover both use cases with the same abstraction.",{"type":17,"tag":29,"props":7197,"children":7198},{},[7199],{"type":23,"value":7200},"That creates issues:",{"type":17,"tag":80,"props":7202,"children":7203},{},[7204,7209,7214],{"type":17,"tag":84,"props":7205,"children":7206},{},[7207],{"type":23,"value":7208},"tools built for data pipelines introduce latency and storage overhead when used for product integrations",{"type":17,"tag":84,"props":7210,"children":7211},{},[7212],{"type":23,"value":7213},"unified APIs don't handle data transformation or scheduled syncs",{"type":17,"tag":84,"props":7215,"children":7216},{},[7217],{"type":23,"value":7218},"iPaaS-style tools require manual configuration and don't map cleanly to product architectures",{"type":17,"tag":29,"props":7220,"children":7221},{},[7222],{"type":23,"value":7223},"The result is teams using the wrong system for the job.",{"type":17,"tag":18,"props":7225,"children":7227},{"id":7226},"key-differences-in-architecture",[7228],{"type":23,"value":7229},"Key differences in architecture",{"type":17,"tag":7231,"props":7232,"children":7233},"table",{},[7234,7258],{"type":17,"tag":7235,"props":7236,"children":7237},"thead",{},[7238],{"type":17,"tag":7239,"props":7240,"children":7241},"tr",{},[7242,7248,7253],{"type":17,"tag":7243,"props":7244,"children":7245},"th",{},[7246],{"type":23,"value":7247},"Category",{"type":17,"tag":7243,"props":7249,"children":7250},{},[7251],{"type":23,"value":7252},"Product Integrations",{"type":17,"tag":7243,"props":7254,"children":7255},{},[7256],{"type":23,"value":7257},"Internal Data Access",{"type":17,"tag":7259,"props":7260,"children":7261},"tbody",{},[7262,7281,7299,7317,7335,7352,7370],{"type":17,"tag":7239,"props":7263,"children":7264},{},[7265,7271,7276],{"type":17,"tag":7266,"props":7267,"children":7268},"td",{},[7269],{"type":23,"value":7270},"Primary user",{"type":17,"tag":7266,"props":7272,"children":7273},{},[7274],{"type":23,"value":7275},"Your customers",{"type":17,"tag":7266,"props":7277,"children":7278},{},[7279],{"type":23,"value":7280},"Your team",{"type":17,"tag":7239,"props":7282,"children":7283},{},[7284,7289,7294],{"type":17,"tag":7266,"props":7285,"children":7286},{},[7287],{"type":23,"value":7288},"Goal",{"type":17,"tag":7266,"props":7290,"children":7291},{},[7292],{"type":23,"value":7293},"Deliver features inside your product",{"type":17,"tag":7266,"props":7295,"children":7296},{},[7297],{"type":23,"value":7298},"Access and move data across integrations",{"type":17,"tag":7239,"props":7300,"children":7301},{},[7302,7307,7312],{"type":17,"tag":7266,"props":7303,"children":7304},{},[7305],{"type":23,"value":7306},"Authorization",{"type":17,"tag":7266,"props":7308,"children":7309},{},[7310],{"type":23,"value":7311},"Customer-level OAuth flows",{"type":17,"tag":7266,"props":7313,"children":7314},{},[7315],{"type":23,"value":7316},"Internal authorization",{"type":17,"tag":7239,"props":7318,"children":7319},{},[7320,7325,7330],{"type":17,"tag":7266,"props":7321,"children":7322},{},[7323],{"type":23,"value":7324},"Data handling",{"type":17,"tag":7266,"props":7326,"children":7327},{},[7328],{"type":23,"value":7329},"Real-time API requests",{"type":17,"tag":7266,"props":7331,"children":7332},{},[7333],{"type":23,"value":7334},"Syncs, storage, and transformations",{"type":17,"tag":7239,"props":7336,"children":7337},{},[7338,7342,7347],{"type":17,"tag":7266,"props":7339,"children":7340},{},[7341],{"type":23,"value":953},{"type":17,"tag":7266,"props":7343,"children":7344},{},[7345],{"type":23,"value":7346},"User-facing features, AI agents, workflows",{"type":17,"tag":7266,"props":7348,"children":7349},{},[7350],{"type":23,"value":7351},"Reporting, operations, internal AI usage",{"type":17,"tag":7239,"props":7353,"children":7354},{},[7355,7360,7365],{"type":17,"tag":7266,"props":7356,"children":7357},{},[7358],{"type":23,"value":7359},"Architecture",{"type":17,"tag":7266,"props":7361,"children":7362},{},[7363],{"type":23,"value":7364},"Unified API (pass-through, no storage)",{"type":17,"tag":7266,"props":7366,"children":7367},{},[7368],{"type":23,"value":7369},"Data pipelines with transformation",{"type":17,"tag":7239,"props":7371,"children":7372},{},[7373,7378,7383],{"type":17,"tag":7266,"props":7374,"children":7375},{},[7376],{"type":23,"value":7377},"Example",{"type":17,"tag":7266,"props":7379,"children":7380},{},[7381],{"type":23,"value":7382},"CRM integration inside your SaaS",{"type":17,"tag":7266,"props":7384,"children":7385},{},[7386],{"type":23,"value":7387},"Sync Salesforce data to a database",{"type":17,"tag":18,"props":7389,"children":7391},{"id":7390},"when-you-need-a-unified-api",[7392],{"type":23,"value":7393},"When you need a unified API",{"type":17,"tag":29,"props":7395,"children":7396},{},[7397],{"type":23,"value":7398},"If you're building integrations into your product, you need infrastructure that behaves like an API layer—not a data pipeline.",{"type":17,"tag":29,"props":7400,"children":7401},{},[7402],{"type":23,"value":7403},"This means:",{"type":17,"tag":80,"props":7405,"children":7406},{},[7407,7412,7417,7422],{"type":17,"tag":84,"props":7408,"children":7409},{},[7410],{"type":23,"value":7411},"requests are executed directly against the source API",{"type":17,"tag":84,"props":7413,"children":7414},{},[7415],{"type":23,"value":7416},"no data is stored or cached",{"type":17,"tag":84,"props":7418,"children":7419},{},[7420],{"type":23,"value":7421},"schemas are consistent across integrations",{"type":17,"tag":84,"props":7423,"children":7424},{},[7425],{"type":23,"value":7426},"authorization is handled once and reused",{"type":17,"tag":29,"props":7428,"children":7429},{},[7430],{"type":23,"value":7431},"This is what allows teams to:",{"type":17,"tag":80,"props":7433,"children":7434},{},[7435,7440,7445],{"type":17,"tag":84,"props":7436,"children":7437},{},[7438],{"type":23,"value":7439},"ship integrations quickly",{"type":17,"tag":84,"props":7441,"children":7442},{},[7443],{"type":23,"value":7444},"avoid per-integration maintenance",{"type":17,"tag":84,"props":7446,"children":7447},{},[7448],{"type":23,"value":7449},"support real-time product features and AI use cases",{"type":17,"tag":29,"props":7451,"children":7452},{},[7453,7455,7460],{"type":23,"value":7454},"This is the problem a ",{"type":17,"tag":133,"props":7456,"children":7457},{"href":7139},[7458],{"type":23,"value":7459},"unified API",{"type":23,"value":7461}," solves.",{"type":17,"tag":18,"props":7463,"children":7465},{"id":7464},"when-you-need-internal-data-access-and-movement",[7466],{"type":23,"value":7467},"When you need internal data access and movement",{"type":17,"tag":29,"props":7469,"children":7470},{},[7471],{"type":23,"value":7472},"If you're not building integrations for customers—and instead working with your own company's data—the problem changes.",{"type":17,"tag":29,"props":7474,"children":7475},{},[7476],{"type":23,"value":7477},"You need to:",{"type":17,"tag":80,"props":7479,"children":7480},{},[7481,7486,7490,7495,7500],{"type":17,"tag":84,"props":7482,"children":7483},{},[7484],{"type":23,"value":7485},"connect internal integrations",{"type":17,"tag":84,"props":7487,"children":7488},{},[7489],{"type":23,"value":7162},{"type":17,"tag":84,"props":7491,"children":7492},{},[7493],{"type":23,"value":7494},"map and transform fields across different schemas",{"type":17,"tag":84,"props":7496,"children":7497},{},[7498],{"type":23,"value":7499},"control how and when data is updated",{"type":17,"tag":84,"props":7501,"children":7502},{},[7503],{"type":23,"value":7172},{"type":17,"tag":29,"props":7505,"children":7506},{},[7507,7509,7514],{"type":23,"value":7508},"This requires a system designed for ",{"type":17,"tag":48,"props":7510,"children":7511},{},[7512],{"type":23,"value":7513},"data access and movement",{"type":23,"value":7515},", not just API abstraction.",{"type":17,"tag":18,"props":7517,"children":7519},{"id":7518},"how-these-patterns-show-up-in-real-teams",[7520],{"type":23,"value":7521},"How these patterns show up in real teams",{"type":17,"tag":29,"props":7523,"children":7524},{},[7525],{"type":23,"value":7526},"In practice, teams often need both.",{"type":17,"tag":29,"props":7528,"children":7529},{},[7530],{"type":23,"value":377},{"type":17,"tag":80,"props":7532,"children":7533},{},[7534,7539,7544],{"type":17,"tag":84,"props":7535,"children":7536},{},[7537],{"type":23,"value":7538},"A product team builds integrations for customers, while ops teams sync data internally",{"type":17,"tag":84,"props":7540,"children":7541},{},[7542],{"type":23,"value":7543},"A company starts by connecting internal integrations, then later builds integration features into their product",{"type":17,"tag":84,"props":7545,"children":7546},{},[7547],{"type":23,"value":7548},"AI use cases begin with internal data access, then expand into customer-facing workflows",{"type":17,"tag":29,"props":7550,"children":7551},{},[7552,7554,7559],{"type":23,"value":7553},"The key is recognizing that these are ",{"type":17,"tag":48,"props":7555,"children":7556},{},[7557],{"type":23,"value":7558},"different problems with different architectures",{"type":23,"value":54},{"type":17,"tag":18,"props":7561,"children":7563},{"id":7562},"choosing-the-right-approach",[7564],{"type":23,"value":7565},"Choosing the right approach",{"type":17,"tag":29,"props":7567,"children":7568},{},[7569],{"type":23,"value":7570},"If you're evaluating how to work with integrations, start with one question:",{"type":17,"tag":29,"props":7572,"children":7573},{},[7574],{"type":17,"tag":48,"props":7575,"children":7576},{},[7577],{"type":23,"value":7578},"Who is the integration for?",{"type":17,"tag":80,"props":7580,"children":7581},{},[7582,7587],{"type":17,"tag":84,"props":7583,"children":7584},{},[7585],{"type":23,"value":7586},"If it's for your customers → you're building product integrations",{"type":17,"tag":84,"props":7588,"children":7589},{},[7590],{"type":23,"value":7591},"If it's for your team → you're working with internal data",{"type":17,"tag":29,"props":7593,"children":7594},{},[7595],{"type":23,"value":7596},"From there, the architecture follows.",{"type":17,"tag":29,"props":7598,"children":7599},{},[7600],{"type":23,"value":7601},"Trying to force one approach to solve both will create:",{"type":17,"tag":80,"props":7603,"children":7604},{},[7605,7610,7615],{"type":17,"tag":84,"props":7606,"children":7607},{},[7608],{"type":23,"value":7609},"unnecessary complexity",{"type":17,"tag":84,"props":7611,"children":7612},{},[7613],{"type":23,"value":7614},"performance issues",{"type":17,"tag":84,"props":7616,"children":7617},{},[7618],{"type":23,"value":7619},"long-term maintenance overhead",{"type":17,"tag":18,"props":7621,"children":7622},{"id":1051},[7623],{"type":23,"value":1054},{"type":17,"tag":29,"props":7625,"children":7626},{},[7627],{"type":23,"value":7628},"Unified is built to support how teams actually work with integrations:",{"type":17,"tag":80,"props":7630,"children":7631},{},[7632,7637],{"type":17,"tag":84,"props":7633,"children":7634},{},[7635],{"type":23,"value":7636},"building integrations into products",{"type":17,"tag":84,"props":7638,"children":7639},{},[7640],{"type":23,"value":7641},"accessing and working with data across integrations internally",{"type":17,"tag":29,"props":7643,"children":7644},{},[7645],{"type":23,"value":7646},"The underlying principle is the same:",{"type":17,"tag":80,"props":7648,"children":7649},{},[7650,7655,7660],{"type":17,"tag":84,"props":7651,"children":7652},{},[7653],{"type":23,"value":7654},"consistent access to integrations",{"type":17,"tag":84,"props":7656,"children":7657},{},[7658],{"type":23,"value":7659},"predictable behavior across APIs",{"type":17,"tag":84,"props":7661,"children":7662},{},[7663],{"type":23,"value":7664},"no unnecessary infrastructure to manage",{"type":17,"tag":29,"props":7666,"children":7667},{},[7668],{"type":23,"value":7669},"The implementation depends on your use case.",{"type":17,"tag":18,"props":7671,"children":7673},{"id":7672},"key-takeaways",[7674],{"type":23,"value":7675},"Key takeaways",{"type":17,"tag":80,"props":7677,"children":7678},{},[7679,7684,7696,7701,7706],{"type":17,"tag":84,"props":7680,"children":7681},{},[7682],{"type":23,"value":7683},"Building integrations and working with internal data are different problems",{"type":17,"tag":84,"props":7685,"children":7686},{},[7687,7689,7694],{"type":23,"value":7688},"Product integrations require a ",{"type":17,"tag":133,"props":7690,"children":7692},{"href":7691},"/technology",[7693],{"type":23,"value":7459},{"type":23,"value":7695}," with real-time access and no storage",{"type":17,"tag":84,"props":7697,"children":7698},{},[7699],{"type":23,"value":7700},"Internal data access requires data movement, transformation, and control over sync behavior",{"type":17,"tag":84,"props":7702,"children":7703},{},[7704],{"type":23,"value":7705},"Most tools blur this distinction, which leads to poor architectural decisions",{"type":17,"tag":84,"props":7707,"children":7708},{},[7709],{"type":23,"value":7710},"Choosing the right approach early reduces long-term complexity",{"type":17,"tag":18,"props":7712,"children":7714},{"id":7713},"not-sure-which-approach-fits",[7715],{"type":23,"value":7716},"Not sure which approach fits?",{"type":17,"tag":29,"props":7718,"children":7719},{},[7720],{"type":23,"value":7721},"If you're building integrations into your product—or working with data across your company's integrations—the architecture decisions matter.",{"type":17,"tag":29,"props":7723,"children":7724},{},[7725],{"type":23,"value":7726},"We can walk through your use case and show what this looks like in practice.",{"type":17,"tag":29,"props":7728,"children":7729},{},[7730],{"type":17,"tag":133,"props":7731,"children":7732},{"href":7139},[7733],{"type":17,"tag":48,"props":7734,"children":7735},{},[7736],{"type":23,"value":7737},"Talk to our team →",{"title":7,"searchDepth":1629,"depth":1629,"links":7739},[7740,7741],{"id":7079,"depth":1629,"text":7082},{"id":7130,"depth":1629,"text":7133},"content:blog:saas_integrations_vs_internal_data_pipelines_what_the_difference.md","blog/saas_integrations_vs_internal_data_pipelines_what_the_difference.md","blog/saas_integrations_vs_internal_data_pipelines_what_the_difference",{"_path":7746,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":7747,"description":7748,"img":7749,"date":7750,"tag":12,"body":7751,"_type":1677,"_id":8931,"_source":1679,"_file":8932,"_stem":8933,"_extension":1682},"/blog/unified_apis_usage_based_vs_per_connection_pricing_for_integrations","Unified APIs: Usage-Based vs Per-Connection Pricing for Integrations","Most teams evaluate unified APIs on coverage, reliability, and time to launch.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apis_usage_based_vs_per_connection_pricing_for_integrations-icon.png","2026-03-30T22:42:00.000Z",{"type":14,"children":7752,"toc":8896},[7753,7758,7761,7769,7773,7778,7783,7793,7799,7809,7815,7820,7828,7833,7838,7843,7849,7854,7861,7866,7871,7876,7882,7887,7894,7899,7904,7909,7915,7920,7927,7932,7937,7942,7948,7953,7961,7979,7987,7998,8006,8022,8030,8038,8046,8068,8073,8079,8084,8090,8095,8118,8123,8129,8134,8139,8152,8157,8200,8212,8218,8223,8227,8276,8288,8294,8299,8304,8312,8317,8354,8359,8364,8370,8375,8381,8399,8404,8410,8434,8439,8445,8463,8468,8474,8492,8497,8503,8508,8514,8532,8537,8543,8556,8561,8567,8572,8590,8595,8600,8606,8611,8616,8628,8633,8663,8668,8686,8691,8696,8702,8707,8712,8718,8731,8737,8745,8751,8759,8765,8773,8778,8784,8789,8802,8807,8820,8825,8830,8835,8840,8863,8868,8873,8878,8887],{"type":17,"tag":18,"props":7754,"children":7756},{"id":7755},"unified-apis-usage-based-vs-per-connection-pricing-for-integrations",[7757],{"type":23,"value":7747},{"type":17,"tag":25,"props":7759,"children":7760},{},[],{"type":17,"tag":29,"props":7762,"children":7763},{},[7764],{"type":17,"tag":33,"props":7765,"children":7766},{},[7767],{"type":23,"value":7768},"March 30, 2026",{"type":17,"tag":29,"props":7770,"children":7771},{},[7772],{"type":23,"value":7748},{"type":17,"tag":29,"props":7774,"children":7775},{},[7776],{"type":23,"value":7777},"The bigger lever is pricing.",{"type":17,"tag":29,"props":7779,"children":7780},{},[7781],{"type":23,"value":7782},"The model you choose determines how integration costs behave as you grow. At small scale, the differences are easy to ignore. By the time you reach 100–500 customers, the gap can be the difference between a manageable infrastructure cost and a six-figure line item sitting in COGS.",{"type":17,"tag":29,"props":7784,"children":7785},{},[7786,7788],{"type":23,"value":7787},"This breakdown focuses on one question: ",{"type":17,"tag":48,"props":7789,"children":7790},{},[7791],{"type":23,"value":7792},"how does each pricing model scale in the real world?",{"type":17,"tag":68,"props":7794,"children":7796},{"id":7795},"the-four-pricing-models-and-how-they-actually-work",[7797],{"type":23,"value":7798},"The four pricing models (and how they actually work)",{"type":17,"tag":29,"props":7800,"children":7801},{},[7802,7807],{"type":17,"tag":133,"props":7803,"children":7804},{"href":7691},[7805],{"type":23,"value":7806},"Unified API",{"type":23,"value":7808}," vendors have converged around four distinct pricing structures. Each ties cost to a different variable.",{"type":17,"tag":239,"props":7810,"children":7812},{"id":7811},"_1-per-connection-linked-account",[7813],{"type":23,"value":7814},"1. Per-connection (linked account)",{"type":17,"tag":29,"props":7816,"children":7817},{},[7818],{"type":23,"value":7819},"You pay for every customer-to-integration connection.",{"type":17,"tag":29,"props":7821,"children":7822},{},[7823],{"type":17,"tag":48,"props":7824,"children":7825},{},[7826],{"type":23,"value":7827},"Cost formula:",{"type":17,"tag":29,"props":7829,"children":7830},{},[7831],{"type":23,"value":7832},"customers × integrations per customer × price per connection",{"type":17,"tag":29,"props":7834,"children":7835},{},[7836],{"type":23,"value":7837},"If one customer connects two systems, that's two billable units. If 100 customers each connect two integrations, that's 200 billable connections.",{"type":17,"tag":29,"props":7839,"children":7840},{},[7841],{"type":23,"value":7842},"This model is used by platforms like Merge.dev and Finch.",{"type":17,"tag":239,"props":7844,"children":7846},{"id":7845},"_2-usage-based-api-calls",[7847],{"type":23,"value":7848},"2. Usage-based (API calls)",{"type":17,"tag":29,"props":7850,"children":7851},{},[7852],{"type":23,"value":7853},"You pay for activity, not connections.",{"type":17,"tag":29,"props":7855,"children":7856},{},[7857],{"type":17,"tag":48,"props":7858,"children":7859},{},[7860],{"type":23,"value":7827},{"type":17,"tag":29,"props":7862,"children":7863},{},[7864],{"type":23,"value":7865},"total API calls (plus any overages)",{"type":17,"tag":29,"props":7867,"children":7868},{},[7869],{"type":23,"value":7870},"Whether a customer connects one integration or five doesn't matter. Cost is driven by how much data flows through the system.",{"type":17,"tag":29,"props":7872,"children":7873},{},[7874],{"type":23,"value":7875},"This model is used by platforms like Unified.to and Nango.",{"type":17,"tag":239,"props":7877,"children":7879},{"id":7878},"_3-per-consumer-end-customer",[7880],{"type":23,"value":7881},"3. Per-consumer (end customer)",{"type":17,"tag":29,"props":7883,"children":7884},{},[7885],{"type":23,"value":7886},"You pay for each customer using integrations, regardless of how many they connect.",{"type":17,"tag":29,"props":7888,"children":7889},{},[7890],{"type":17,"tag":48,"props":7891,"children":7892},{},[7893],{"type":23,"value":7827},{"type":17,"tag":29,"props":7895,"children":7896},{},[7897],{"type":23,"value":7898},"active customers with at least one integration",{"type":17,"tag":29,"props":7900,"children":7901},{},[7902],{"type":23,"value":7903},"One customer connecting five systems still counts as one billable unit.",{"type":17,"tag":29,"props":7905,"children":7906},{},[7907],{"type":23,"value":7908},"This model is used by platforms like Apideck, Paragon, and Hotglue.",{"type":17,"tag":239,"props":7910,"children":7912},{"id":7911},"_4-per-integration-connector",[7913],{"type":23,"value":7914},"4. Per-integration (connector)",{"type":17,"tag":29,"props":7916,"children":7917},{},[7918],{"type":23,"value":7919},"You pay for the integrations you offer, not who uses them.",{"type":17,"tag":29,"props":7921,"children":7922},{},[7923],{"type":17,"tag":48,"props":7924,"children":7925},{},[7926],{"type":23,"value":7827},{"type":17,"tag":29,"props":7928,"children":7929},{},[7930],{"type":23,"value":7931},"number of connectors enabled",{"type":17,"tag":29,"props":7933,"children":7934},{},[7935],{"type":23,"value":7936},"Whether 10 customers or 10,000 customers use an integration, the cost remains the same.",{"type":17,"tag":29,"props":7938,"children":7939},{},[7940],{"type":23,"value":7941},"This model is used by platforms like Truto.",{"type":17,"tag":68,"props":7943,"children":7945},{"id":7944},"where-the-major-platforms-fall",[7946],{"type":23,"value":7947},"Where the major platforms fall",{"type":17,"tag":29,"props":7949,"children":7950},{},[7951],{"type":23,"value":7952},"The market is not ambiguous—each provider sits clearly in one of these models.",{"type":17,"tag":29,"props":7954,"children":7955},{},[7956],{"type":17,"tag":48,"props":7957,"children":7958},{},[7959],{"type":23,"value":7960},"Per-connection",{"type":17,"tag":80,"props":7962,"children":7963},{},[7964,7969,7974],{"type":17,"tag":84,"props":7965,"children":7966},{},[7967],{"type":23,"value":7968},"Merge.dev",{"type":17,"tag":84,"props":7970,"children":7971},{},[7972],{"type":23,"value":7973},"Finch",{"type":17,"tag":84,"props":7975,"children":7976},{},[7977],{"type":23,"value":7978},"Kombo",{"type":17,"tag":29,"props":7980,"children":7981},{},[7982],{"type":17,"tag":48,"props":7983,"children":7984},{},[7985],{"type":23,"value":7986},"Usage-based",{"type":17,"tag":80,"props":7988,"children":7989},{},[7990,7994],{"type":17,"tag":84,"props":7991,"children":7992},{},[7993],{"type":23,"value":217},{"type":17,"tag":84,"props":7995,"children":7996},{},[7997],{"type":23,"value":1025},{"type":17,"tag":29,"props":7999,"children":8000},{},[8001],{"type":17,"tag":48,"props":8002,"children":8003},{},[8004],{"type":23,"value":8005},"Per-consumer",{"type":17,"tag":80,"props":8007,"children":8008},{},[8009,8013,8017],{"type":17,"tag":84,"props":8010,"children":8011},{},[8012],{"type":23,"value":237},{"type":17,"tag":84,"props":8014,"children":8015},{},[8016],{"type":23,"value":581},{"type":17,"tag":84,"props":8018,"children":8019},{},[8020],{"type":23,"value":8021},"Hotglue",{"type":17,"tag":29,"props":8023,"children":8024},{},[8025],{"type":17,"tag":48,"props":8026,"children":8027},{},[8028],{"type":23,"value":8029},"Per-integration",{"type":17,"tag":80,"props":8031,"children":8032},{},[8033],{"type":17,"tag":84,"props":8034,"children":8035},{},[8036],{"type":23,"value":8037},"Truto",{"type":17,"tag":29,"props":8039,"children":8040},{},[8041],{"type":17,"tag":48,"props":8042,"children":8043},{},[8044],{"type":23,"value":8045},"Hybrid or opaque pricing",{"type":17,"tag":80,"props":8047,"children":8048},{},[8049,8054,8059,8064],{"type":17,"tag":84,"props":8050,"children":8051},{},[8052],{"type":23,"value":8053},"Alloy Automation",{"type":17,"tag":84,"props":8055,"children":8056},{},[8057],{"type":23,"value":8058},"Codat",{"type":17,"tag":84,"props":8060,"children":8061},{},[8062],{"type":23,"value":8063},"Rutter",{"type":17,"tag":84,"props":8065,"children":8066},{},[8067],{"type":23,"value":571},{"type":17,"tag":29,"props":8069,"children":8070},{},[8071],{"type":23,"value":8072},"This classification matters because each model creates a different cost curve as your product scales.",{"type":17,"tag":68,"props":8074,"children":8076},{"id":8075},"what-pricing-looks-like-at-real-company-stages",[8077],{"type":23,"value":8078},"What pricing looks like at real company stages",{"type":17,"tag":29,"props":8080,"children":8081},{},[8082],{"type":23,"value":8083},"The differences between models are small early. They compound quickly.",{"type":17,"tag":239,"props":8085,"children":8087},{"id":8086},"seed-stage-10-customers",[8088],{"type":23,"value":8089},"Seed stage (10 customers)",{"type":17,"tag":29,"props":8091,"children":8092},{},[8093],{"type":23,"value":8094},"At this stage, most models feel similar.",{"type":17,"tag":80,"props":8096,"children":8097},{},[8098,8103,8108,8113],{"type":17,"tag":84,"props":8099,"children":8100},{},[8101],{"type":23,"value":8102},"Per-connection: manageable (low connection count)",{"type":17,"tag":84,"props":8104,"children":8105},{},[8106],{"type":23,"value":8107},"Usage-based: fixed base cost",{"type":17,"tag":84,"props":8109,"children":8110},{},[8111],{"type":23,"value":8112},"Per-consumer: low tier pricing",{"type":17,"tag":84,"props":8114,"children":8115},{},[8116],{"type":23,"value":8117},"Per-integration: flat baseline",{"type":17,"tag":29,"props":8119,"children":8120},{},[8121],{"type":23,"value":8122},"No major pressure yet. This is why many teams don't notice the issue early.",{"type":17,"tag":239,"props":8124,"children":8126},{"id":8125},"series-a-100-customers",[8127],{"type":23,"value":8128},"Series A (100 customers)",{"type":17,"tag":29,"props":8130,"children":8131},{},[8132],{"type":23,"value":8133},"This is where divergence starts.",{"type":17,"tag":29,"props":8135,"children":8136},{},[8137],{"type":23,"value":8138},"Assume:",{"type":17,"tag":80,"props":8140,"children":8141},{},[8142,8147],{"type":17,"tag":84,"props":8143,"children":8144},{},[8145],{"type":23,"value":8146},"100 customers",{"type":17,"tag":84,"props":8148,"children":8149},{},[8150],{"type":23,"value":8151},"2 integrations each → 200 connections",{"type":17,"tag":29,"props":8153,"children":8154},{},[8155],{"type":23,"value":8156},"Now compare:",{"type":17,"tag":80,"props":8158,"children":8159},{},[8160,8170,8180,8190],{"type":17,"tag":84,"props":8161,"children":8162},{},[8163,8168],{"type":17,"tag":48,"props":8164,"children":8165},{},[8166],{"type":23,"value":8167},"Per-connection:",{"type":23,"value":8169}," scales directly with 200 units",{"type":17,"tag":84,"props":8171,"children":8172},{},[8173,8178],{"type":17,"tag":48,"props":8174,"children":8175},{},[8176],{"type":23,"value":8177},"Usage-based:",{"type":23,"value":8179}," still tied to API activity, often unchanged",{"type":17,"tag":84,"props":8181,"children":8182},{},[8183,8188],{"type":17,"tag":48,"props":8184,"children":8185},{},[8186],{"type":23,"value":8187},"Per-consumer:",{"type":23,"value":8189}," scales with 100 customers",{"type":17,"tag":84,"props":8191,"children":8192},{},[8193,8198],{"type":17,"tag":48,"props":8194,"children":8195},{},[8196],{"type":23,"value":8197},"Per-integration:",{"type":23,"value":8199}," unchanged",{"type":17,"tag":29,"props":8201,"children":8202},{},[8203,8205,8210],{"type":23,"value":8204},"At this point, per-connection costs can be ",{"type":17,"tag":48,"props":8206,"children":8207},{},[8208],{"type":23,"value":8209},"8–10× higher",{"type":23,"value":8211}," than usage-based or per-consumer models.",{"type":17,"tag":239,"props":8213,"children":8215},{"id":8214},"series-b-500-customers",[8216],{"type":23,"value":8217},"Series B (500+ customers)",{"type":17,"tag":29,"props":8219,"children":8220},{},[8221],{"type":23,"value":8222},"Now the multiplier effect becomes obvious.",{"type":17,"tag":29,"props":8224,"children":8225},{},[8226],{"type":23,"value":8138},{"type":17,"tag":80,"props":8228,"children":8229},{},[8230,8235,8240,8249,8258,8267],{"type":17,"tag":84,"props":8231,"children":8232},{},[8233],{"type":23,"value":8234},"500 customers",{"type":17,"tag":84,"props":8236,"children":8237},{},[8238],{"type":23,"value":8239},"3 integrations each → 1,500 connections",{"type":17,"tag":84,"props":8241,"children":8242},{},[8243,8247],{"type":17,"tag":48,"props":8244,"children":8245},{},[8246],{"type":23,"value":8167},{"type":23,"value":8248}," grows with both customers and integrations",{"type":17,"tag":84,"props":8250,"children":8251},{},[8252,8256],{"type":17,"tag":48,"props":8253,"children":8254},{},[8255],{"type":23,"value":8177},{"type":23,"value":8257}," grows with activity, not structure",{"type":17,"tag":84,"props":8259,"children":8260},{},[8261,8265],{"type":17,"tag":48,"props":8262,"children":8263},{},[8264],{"type":23,"value":8187},{"type":23,"value":8266}," grows linearly with customers",{"type":17,"tag":84,"props":8268,"children":8269},{},[8270,8274],{"type":17,"tag":48,"props":8271,"children":8272},{},[8273],{"type":23,"value":8197},{"type":23,"value":8275}," still flat",{"type":17,"tag":29,"props":8277,"children":8278},{},[8279,8281,8286],{"type":23,"value":8280},"This is where per-connection models can reach ",{"type":17,"tag":48,"props":8282,"children":8283},{},[8284],{"type":23,"value":8285},"six-figure annual costs",{"type":23,"value":8287},", while other models remain an order of magnitude lower.",{"type":17,"tag":68,"props":8289,"children":8291},{"id":8290},"the-integration-depth-multiplier-what-most-teams-miss",[8292],{"type":23,"value":8293},"The integration depth multiplier (what most teams miss)",{"type":17,"tag":29,"props":8295,"children":8296},{},[8297],{"type":23,"value":8298},"The biggest hidden variable is not customer count. It's integration depth.",{"type":17,"tag":29,"props":8300,"children":8301},{},[8302],{"type":23,"value":8303},"If you expand from:",{"type":17,"tag":80,"props":8305,"children":8306},{},[8307],{"type":17,"tag":84,"props":8308,"children":8309},{},[8310],{"type":23,"value":8311},"2 integrations → 5 integrations per customer",{"type":17,"tag":29,"props":8313,"children":8314},{},[8315],{"type":23,"value":8316},"Your costs:",{"type":17,"tag":80,"props":8318,"children":8319},{},[8320,8329,8338,8346],{"type":17,"tag":84,"props":8321,"children":8322},{},[8323,8327],{"type":17,"tag":48,"props":8324,"children":8325},{},[8326],{"type":23,"value":8167},{"type":23,"value":8328}," increase ~2.5× instantly",{"type":17,"tag":84,"props":8330,"children":8331},{},[8332,8336],{"type":17,"tag":48,"props":8333,"children":8334},{},[8335],{"type":23,"value":8177},{"type":23,"value":8337}," unchanged unless activity increases",{"type":17,"tag":84,"props":8339,"children":8340},{},[8341,8345],{"type":17,"tag":48,"props":8342,"children":8343},{},[8344],{"type":23,"value":8187},{"type":23,"value":8199},{"type":17,"tag":84,"props":8347,"children":8348},{},[8349,8353],{"type":17,"tag":48,"props":8350,"children":8351},{},[8352],{"type":23,"value":8197},{"type":23,"value":8199},{"type":17,"tag":29,"props":8355,"children":8356},{},[8357],{"type":23,"value":8358},"This creates a constraint:",{"type":17,"tag":29,"props":8360,"children":8361},{},[8362],{"type":23,"value":8363},"Teams on per-connection pricing often limit how many integrations they offer—not because of engineering complexity, but because of cost.",{"type":17,"tag":68,"props":8365,"children":8367},{"id":8366},"the-core-tradeoff-growth-tax-vs-usage-volatility",[8368],{"type":23,"value":8369},"The core tradeoff: growth tax vs usage volatility",{"type":17,"tag":29,"props":8371,"children":8372},{},[8373],{"type":23,"value":8374},"Each pricing model optimizes for something different. None are neutral.",{"type":17,"tag":239,"props":8376,"children":8378},{"id":8377},"per-connection-predictable-but-compounds-aggressively",[8379],{"type":23,"value":8380},"Per-connection: predictable, but compounds aggressively",{"type":17,"tag":80,"props":8382,"children":8383},{},[8384,8389,8394],{"type":17,"tag":84,"props":8385,"children":8386},{},[8387],{"type":23,"value":8388},"Easy to model",{"type":17,"tag":84,"props":8390,"children":8391},{},[8392],{"type":23,"value":8393},"Costs increase with customer success",{"type":17,"tag":84,"props":8395,"children":8396},{},[8397],{"type":23,"value":8398},"Penalizes multi-integration usage",{"type":17,"tag":29,"props":8400,"children":8401},{},[8402],{"type":23,"value":8403},"This is where the 'growth tax' argument comes from. The more your customers adopt integrations, the more your costs multiply.",{"type":17,"tag":239,"props":8405,"children":8407},{"id":8406},"usage-based-flexible-but-requires-efficiency",[8408],{"type":23,"value":8409},"Usage-based: flexible, but requires efficiency",{"type":17,"tag":80,"props":8411,"children":8412},{},[8413,8418,8423],{"type":17,"tag":84,"props":8414,"children":8415},{},[8416],{"type":23,"value":8417},"Cost tied to real activity",{"type":17,"tag":84,"props":8419,"children":8420},{},[8421],{"type":23,"value":8422},"Scales well with large user bases",{"type":17,"tag":84,"props":8424,"children":8425},{},[8426,8428,8432],{"type":23,"value":8427},"Requires thoughtful API usage (batching, ",{"type":17,"tag":133,"props":8429,"children":8430},{"href":4999},[8431],{"type":23,"value":5002},{"type":23,"value":8433},", caching)",{"type":17,"tag":29,"props":8435,"children":8436},{},[8437],{"type":23,"value":8438},"This model aligns cost with actual usage, but teams need to design systems that avoid unnecessary API calls.",{"type":17,"tag":239,"props":8440,"children":8442},{"id":8441},"per-consumer-smoother-scaling-still-tied-to-growth",[8443],{"type":23,"value":8444},"Per-consumer: smoother scaling, still tied to growth",{"type":17,"tag":80,"props":8446,"children":8447},{},[8448,8453,8458],{"type":17,"tag":84,"props":8449,"children":8450},{},[8451],{"type":23,"value":8452},"Eliminates per-integration penalties",{"type":17,"tag":84,"props":8454,"children":8455},{},[8456],{"type":23,"value":8457},"Predictable monthly costs",{"type":17,"tag":84,"props":8459,"children":8460},{},[8461],{"type":23,"value":8462},"Still increases directly with customer count",{"type":17,"tag":29,"props":8464,"children":8465},{},[8466],{"type":23,"value":8467},"Costs don't multiply with integrations, but they still rise as you acquire customers.",{"type":17,"tag":239,"props":8469,"children":8471},{"id":8470},"per-integration-fixed-cost-high-commitment",[8472],{"type":23,"value":8473},"Per-integration: fixed cost, high commitment",{"type":17,"tag":80,"props":8475,"children":8476},{},[8477,8482,8487],{"type":17,"tag":84,"props":8478,"children":8479},{},[8480],{"type":23,"value":8481},"Fully predictable",{"type":17,"tag":84,"props":8483,"children":8484},{},[8485],{"type":23,"value":8486},"Decoupled from usage and customers",{"type":17,"tag":84,"props":8488,"children":8489},{},[8490],{"type":23,"value":8491},"Requires committing to integrations upfront",{"type":17,"tag":29,"props":8493,"children":8494},{},[8495],{"type":23,"value":8496},"This model works best when your integration set is stable and well-defined.",{"type":17,"tag":68,"props":8498,"children":8500},{"id":8499},"pricing-models-shape-product-decisions",[8501],{"type":23,"value":8502},"Pricing models shape product decisions",{"type":17,"tag":29,"props":8504,"children":8505},{},[8506],{"type":23,"value":8507},"Pricing is not just financial. It changes what gets built.",{"type":17,"tag":239,"props":8509,"children":8511},{"id":8510},"_1-how-many-integrations-you-offer",[8512],{"type":23,"value":8513},"1. How many integrations you offer",{"type":17,"tag":80,"props":8515,"children":8516},{},[8517,8522,8527],{"type":17,"tag":84,"props":8518,"children":8519},{},[8520],{"type":23,"value":8521},"Per-connection → limit integrations",{"type":17,"tag":84,"props":8523,"children":8524},{},[8525],{"type":23,"value":8526},"Usage-based → expand freely",{"type":17,"tag":84,"props":8528,"children":8529},{},[8530],{"type":23,"value":8531},"Per-consumer → bundle aggressively",{"type":17,"tag":29,"props":8533,"children":8534},{},[8535],{"type":23,"value":8536},"When each integration adds cost, product teams become selective.",{"type":17,"tag":239,"props":8538,"children":8540},{"id":8539},"_2-how-frequently-you-sync-data",[8541],{"type":23,"value":8542},"2. How frequently you sync data",{"type":17,"tag":80,"props":8544,"children":8545},{},[8546,8551],{"type":17,"tag":84,"props":8547,"children":8548},{},[8549],{"type":23,"value":8550},"Usage-based → optimize API calls, reduce unnecessary syncs",{"type":17,"tag":84,"props":8552,"children":8553},{},[8554],{"type":23,"value":8555},"Per-connection → less pressure on call volume, more pressure on connection count",{"type":17,"tag":29,"props":8557,"children":8558},{},[8559],{"type":23,"value":8560},"This directly affects data freshness and UX.",{"type":17,"tag":239,"props":8562,"children":8564},{"id":8563},"_3-what-becomes-possible-with-ai-workflows",[8565],{"type":23,"value":8566},"3. What becomes possible with AI workflows",{"type":17,"tag":29,"props":8568,"children":8569},{},[8570],{"type":23,"value":8571},"AI-driven products often:",{"type":17,"tag":80,"props":8573,"children":8574},{},[8575,8580,8585],{"type":17,"tag":84,"props":8576,"children":8577},{},[8578],{"type":23,"value":8579},"query multiple systems per action",{"type":17,"tag":84,"props":8581,"children":8582},{},[8583],{"type":23,"value":8584},"trigger many small API calls",{"type":17,"tag":84,"props":8586,"children":8587},{},[8588],{"type":23,"value":8589},"operate dynamically across integrations",{"type":17,"tag":29,"props":8591,"children":8592},{},[8593],{"type":23,"value":8594},"Per-connection pricing does not map cleanly to this pattern.",{"type":17,"tag":29,"props":8596,"children":8597},{},[8598],{"type":23,"value":8599},"Usage-based models align more naturally with variable workloads.",{"type":17,"tag":68,"props":8601,"children":8603},{"id":8602},"the-gross-margin-impact-why-this-becomes-a-board-level-issue",[8604],{"type":23,"value":8605},"The gross margin impact (why this becomes a board-level issue)",{"type":17,"tag":29,"props":8607,"children":8608},{},[8609],{"type":23,"value":8610},"Unified API costs sit in COGS. They directly reduce gross margin.",{"type":17,"tag":29,"props":8612,"children":8613},{},[8614],{"type":23,"value":8615},"Take a simple example:",{"type":17,"tag":80,"props":8617,"children":8618},{},[8619,8624],{"type":17,"tag":84,"props":8620,"children":8621},{},[8622],{"type":23,"value":8623},"SaaS product at $100/month per customer",{"type":17,"tag":84,"props":8625,"children":8626},{},[8627],{"type":23,"value":8146},{"type":17,"tag":29,"props":8629,"children":8630},{},[8631],{"type":23,"value":8632},"Now compare cost per customer:",{"type":17,"tag":80,"props":8634,"children":8635},{},[8636,8645,8654],{"type":17,"tag":84,"props":8637,"children":8638},{},[8639,8643],{"type":17,"tag":48,"props":8640,"children":8641},{},[8642],{"type":23,"value":8177},{"type":23,"value":8644}," ~$5–$10/month",{"type":17,"tag":84,"props":8646,"children":8647},{},[8648,8652],{"type":17,"tag":48,"props":8649,"children":8650},{},[8651],{"type":23,"value":8187},{"type":23,"value":8653}," ~$10–$15/month",{"type":17,"tag":84,"props":8655,"children":8656},{},[8657,8661],{"type":17,"tag":48,"props":8658,"children":8659},{},[8660],{"type":23,"value":8167},{"type":23,"value":8662}," can exceed $100/month depending on integrations",{"type":17,"tag":29,"props":8664,"children":8665},{},[8666],{"type":23,"value":8667},"At that point:",{"type":17,"tag":80,"props":8669,"children":8670},{},[8671,8676,8681],{"type":17,"tag":84,"props":8672,"children":8673},{},[8674],{"type":23,"value":8675},"5–10% margin impact (usage-based)",{"type":17,"tag":84,"props":8677,"children":8678},{},[8679],{"type":23,"value":8680},"10–15% (per-consumer)",{"type":17,"tag":84,"props":8682,"children":8683},{},[8684],{"type":23,"value":8685},"25%+ or worse (per-connection)",{"type":17,"tag":29,"props":8687,"children":8688},{},[8689],{"type":23,"value":8690},"In extreme cases, integration cost can exceed revenue per customer.",{"type":17,"tag":29,"props":8692,"children":8693},{},[8694],{"type":23,"value":8695},"That drops a SaaS business below standard 70–80% margin benchmarks, which directly affects valuation and capital efficiency.",{"type":17,"tag":68,"props":8697,"children":8699},{"id":8698},"lock-in-and-switching-costs",[8700],{"type":23,"value":8701},"Lock-in and switching costs",{"type":17,"tag":29,"props":8703,"children":8704},{},[8705],{"type":23,"value":8706},"Pricing is only part of total cost. Architecture determines how hard it is to leave.",{"type":17,"tag":29,"props":8708,"children":8709},{},[8710],{"type":23,"value":8711},"Key factors:",{"type":17,"tag":239,"props":8713,"children":8715},{"id":8714},"data-storage-vs-pass-through",[8716],{"type":23,"value":8717},"Data storage vs pass-through",{"type":17,"tag":80,"props":8719,"children":8720},{},[8721,8726],{"type":17,"tag":84,"props":8722,"children":8723},{},[8724],{"type":23,"value":8725},"Sync-and-store platforms hold customer data",{"type":17,"tag":84,"props":8727,"children":8728},{},[8729],{"type":23,"value":8730},"Migration requires rebuilding pipelines and re-syncing",{"type":17,"tag":239,"props":8732,"children":8734},{"id":8733},"oauth-and-credential-ownership",[8735],{"type":23,"value":8736},"OAuth and credential ownership",{"type":17,"tag":80,"props":8738,"children":8739},{},[8740],{"type":17,"tag":84,"props":8741,"children":8742},{},[8743],{"type":23,"value":8744},"Reconnecting every customer can take weeks",{"type":17,"tag":239,"props":8746,"children":8748},{"id":8747},"sdk-and-schema-dependency",[8749],{"type":23,"value":8750},"SDK and schema dependency",{"type":17,"tag":80,"props":8752,"children":8753},{},[8754],{"type":17,"tag":84,"props":8755,"children":8756},{},[8757],{"type":23,"value":8758},"Switching providers means rewriting integration logic",{"type":17,"tag":239,"props":8760,"children":8762},{"id":8761},"contracts",[8763],{"type":23,"value":8764},"Contracts",{"type":17,"tag":80,"props":8766,"children":8767},{},[8768],{"type":17,"tag":84,"props":8769,"children":8770},{},[8771],{"type":23,"value":8772},"Annual commitments and uplift clauses increase exit cost",{"type":17,"tag":29,"props":8774,"children":8775},{},[8776],{"type":23,"value":8777},"Pass-through architectures reduce some of this friction because they avoid storing data at rest. Sync-based models often create deeper dependency.",{"type":17,"tag":68,"props":8779,"children":8781},{"id":8780},"transparency-is-part-of-the-model",[8782],{"type":23,"value":8783},"Transparency is part of the model",{"type":17,"tag":29,"props":8785,"children":8786},{},[8787],{"type":23,"value":8788},"Not all pricing is visible.",{"type":17,"tag":80,"props":8790,"children":8791},{},[8792,8797],{"type":17,"tag":84,"props":8793,"children":8794},{},[8795],{"type":23,"value":8796},"Some providers publish full pricing",{"type":17,"tag":84,"props":8798,"children":8799},{},[8800],{"type":23,"value":8801},"Others require sales conversations",{"type":17,"tag":29,"props":8803,"children":8804},{},[8805],{"type":23,"value":8806},"This typically reflects their go-to-market:",{"type":17,"tag":80,"props":8808,"children":8809},{},[8810,8815],{"type":17,"tag":84,"props":8811,"children":8812},{},[8813],{"type":23,"value":8814},"developer-first → transparent pricing",{"type":17,"tag":84,"props":8816,"children":8817},{},[8818],{"type":23,"value":8819},"enterprise sales → custom contracts",{"type":17,"tag":29,"props":8821,"children":8822},{},[8823],{"type":23,"value":8824},"For buyers, it affects evaluation speed and predictability.",{"type":17,"tag":68,"props":8826,"children":8827},{"id":2316},[8828],{"type":23,"value":8829},"Final takeaway",{"type":17,"tag":29,"props":8831,"children":8832},{},[8833],{"type":23,"value":8834},"Unified APIs are often evaluated as infrastructure.",{"type":17,"tag":29,"props":8836,"children":8837},{},[8838],{"type":23,"value":8839},"In practice, they behave like a pricing decision embedded inside your product.",{"type":17,"tag":80,"props":8841,"children":8842},{},[8843,8848,8853,8858],{"type":17,"tag":84,"props":8844,"children":8845},{},[8846],{"type":23,"value":8847},"Per-connection models tie cost to customer growth and integration depth",{"type":17,"tag":84,"props":8849,"children":8850},{},[8851],{"type":23,"value":8852},"Usage-based models tie cost to actual activity",{"type":17,"tag":84,"props":8854,"children":8855},{},[8856],{"type":23,"value":8857},"Per-consumer models tie cost to adoption",{"type":17,"tag":84,"props":8859,"children":8860},{},[8861],{"type":23,"value":8862},"Per-integration models fix cost upfront",{"type":17,"tag":29,"props":8864,"children":8865},{},[8866],{"type":23,"value":8867},"The right model depends on your product, your customers, and your margins.",{"type":17,"tag":29,"props":8869,"children":8870},{},[8871],{"type":23,"value":8872},"The wrong model turns integrations into a constraint—something you limit, gate, or optimize around.",{"type":17,"tag":29,"props":8874,"children":8875},{},[8876],{"type":23,"value":8877},"The right model lets integrations scale with your product, not against it.",{"type":17,"tag":29,"props":8879,"children":8880},{},[8881,8882],{"type":23,"value":1609},{"type":17,"tag":133,"props":8883,"children":8885},{"href":1612,"rel":8884},[214],[8886],{"type":23,"value":1616},{"type":17,"tag":29,"props":8888,"children":8889},{},[8890,8891],{"type":23,"value":1609},{"type":17,"tag":133,"props":8892,"children":8894},{"href":1623,"rel":8893},[214],[8895],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":8897},[8898,8904,8905,8910,8911,8917,8922,8923,8929,8930],{"id":7795,"depth":1629,"text":7798,"children":8899},[8900,8901,8902,8903],{"id":7811,"depth":1635,"text":7814},{"id":7845,"depth":1635,"text":7848},{"id":7878,"depth":1635,"text":7881},{"id":7911,"depth":1635,"text":7914},{"id":7944,"depth":1629,"text":7947},{"id":8075,"depth":1629,"text":8078,"children":8906},[8907,8908,8909],{"id":8086,"depth":1635,"text":8089},{"id":8125,"depth":1635,"text":8128},{"id":8214,"depth":1635,"text":8217},{"id":8290,"depth":1629,"text":8293},{"id":8366,"depth":1629,"text":8369,"children":8912},[8913,8914,8915,8916],{"id":8377,"depth":1635,"text":8380},{"id":8406,"depth":1635,"text":8409},{"id":8441,"depth":1635,"text":8444},{"id":8470,"depth":1635,"text":8473},{"id":8499,"depth":1629,"text":8502,"children":8918},[8919,8920,8921],{"id":8510,"depth":1635,"text":8513},{"id":8539,"depth":1635,"text":8542},{"id":8563,"depth":1635,"text":8566},{"id":8602,"depth":1629,"text":8605},{"id":8698,"depth":1629,"text":8701,"children":8924},[8925,8926,8927,8928],{"id":8714,"depth":1635,"text":8717},{"id":8733,"depth":1635,"text":8736},{"id":8747,"depth":1635,"text":8750},{"id":8761,"depth":1635,"text":8764},{"id":8780,"depth":1629,"text":8783},{"id":2316,"depth":1629,"text":8829},"content:blog:unified_apis_usage_based_vs_per_connection_pricing_for_integrations.md","blog/unified_apis_usage_based_vs_per_connection_pricing_for_integrations.md","blog/unified_apis_usage_based_vs_per_connection_pricing_for_integrations",{"_path":8935,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8936,"description":8937,"img":8938,"date":7750,"tag":12,"body":8939,"_type":1677,"_id":9573,"_source":1679,"_file":9574,"_stem":9575,"_extension":1682},"/blog/virtual_webhooks_vs_polling_jobs_how_integrations_handle_change_detection","Virtual Webhooks vs Polling Jobs: How Integrations Handle Change Detection","Most teams think they're choosing between webhooks and polling.","https://s3.us-east-2.amazonaws.com/unified-article-images/virtual_webhooks_vs_polling_jobs_how_integrations_handle_change_detection-icon.png",{"type":14,"children":8940,"toc":9556},[8941,8946,8949,8956,8967,8972,8984,8989,9013,9019,9025,9030,9048,9053,9058,9066,9072,9078,9083,9088,9106,9111,9116,9124,9129,9134,9142,9148,9153,9157,9175,9180,9191,9196,9209,9214,9222,9226,9231,9237,9269,9274,9280,9285,9293,9306,9314,9326,9331,9337,9342,9360,9365,9370,9376,9381,9394,9399,9416,9422,9427,9435,9463,9471,9484,9489,9495,9500,9505,9523,9528,9533,9538,9547],{"type":17,"tag":18,"props":8942,"children":8944},{"id":8943},"virtual-webhooks-vs-polling-jobs-how-integrations-handle-change-detection",[8945],{"type":23,"value":8936},{"type":17,"tag":25,"props":8947,"children":8948},{},[],{"type":17,"tag":29,"props":8950,"children":8951},{},[8952],{"type":17,"tag":33,"props":8953,"children":8954},{},[8955],{"type":23,"value":7768},{"type":17,"tag":29,"props":8957,"children":8958},{},[8959,8961,8965],{"type":23,"value":8960},"Most teams think they're choosing between ",{"type":17,"tag":133,"props":8962,"children":8963},{"href":4999},[8964],{"type":23,"value":5002},{"type":23,"value":8966}," and polling.",{"type":17,"tag":29,"props":8968,"children":8969},{},[8970],{"type":23,"value":8971},"They're not.",{"type":17,"tag":29,"props":8973,"children":8974},{},[8975,8977,8982],{"type":23,"value":8976},"They're choosing ",{"type":17,"tag":48,"props":8978,"children":8979},{},[8980],{"type":23,"value":8981},"how change detection works under the hood",{"type":23,"value":8983},"—and that decision determines latency, system complexity, and whether your 'real-time' features actually behave as expected.",{"type":17,"tag":29,"props":8985,"children":8986},{},[8987],{"type":23,"value":8988},"The problem is that 'webhook support' is used to describe very different event delivery models.",{"type":17,"tag":29,"props":8990,"children":8991},{},[8992,8994,8998,9000],{"type":23,"value":8993},"For a full comparison of ",{"type":17,"tag":133,"props":8995,"children":8996},{"href":7691},[8997],{"type":23,"value":7459},{"type":23,"value":8999}," platforms and how they implement these models, see: ",{"type":17,"tag":48,"props":9001,"children":9002},{},[9003,9005,9011],{"type":23,"value":9004},"Which Unified API Platforms Support ",{"type":17,"tag":133,"props":9006,"children":9008},{"href":9007},"/blog/unlock_real_time_data_with_virtual_webhooks",[9009],{"type":23,"value":9010},"Virtual Webhooks",{"type":23,"value":9012}," vs Sync-Based Notifications?",{"type":17,"tag":68,"props":9014,"children":9016},{"id":9015},"how-integrations-handle-missing-webhooks",[9017],{"type":23,"value":9018},"How integrations handle missing webhooks",{"type":17,"tag":239,"props":9020,"children":9022},{"id":9021},"native-webhooks",[9023],{"type":23,"value":9024},"Native webhooks",{"type":17,"tag":29,"props":9026,"children":9027},{},[9028],{"type":23,"value":9029},"This is the simplest model.",{"type":17,"tag":80,"props":9031,"children":9032},{},[9033,9038,9043],{"type":17,"tag":84,"props":9034,"children":9035},{},[9036],{"type":23,"value":9037},"The source API detects a change",{"type":17,"tag":84,"props":9039,"children":9040},{},[9041],{"type":23,"value":9042},"It sends an event immediately",{"type":17,"tag":84,"props":9044,"children":9045},{},[9046],{"type":23,"value":9047},"Your application processes it",{"type":17,"tag":29,"props":9049,"children":9050},{},[9051],{"type":23,"value":9052},"Examples include payments, ecommerce orders, or Git events.",{"type":17,"tag":29,"props":9054,"children":9055},{},[9056],{"type":23,"value":9057},"The limitation is coverage. Many SaaS APIs don't support webhooks consistently, and some don't support them at all.",{"type":17,"tag":29,"props":9059,"children":9060},{},[9061],{"type":17,"tag":6438,"props":9062,"children":9065},{"alt":9063,"src":9064},"native_webhooks.png","https://s3.us-east-2.amazonaws.com/unified-article-images/virtual_webhooks_vs_polling_jobs_how_integrations_handle_change_detection-0.png",[],{"type":17,"tag":68,"props":9067,"children":9069},{"id":9068},"when-native-webhooks-are-not-available",[9070],{"type":23,"value":9071},"When native webhooks are not available",{"type":17,"tag":239,"props":9073,"children":9075},{"id":9074},"virtual-webhooks-detect-changes-deliver-events",[9076],{"type":23,"value":9077},"Virtual webhooks (detect changes → deliver events)",{"type":17,"tag":29,"props":9079,"children":9080},{},[9081],{"type":23,"value":9082},"This is how platforms like Unified handle integrations without native webhook support.",{"type":17,"tag":29,"props":9084,"children":9085},{},[9086],{"type":23,"value":9087},"Under the hood:",{"type":17,"tag":80,"props":9089,"children":9090},{},[9091,9096,9101],{"type":17,"tag":84,"props":9092,"children":9093},{},[9094],{"type":23,"value":9095},"The integration layer polls the source API",{"type":17,"tag":84,"props":9097,"children":9098},{},[9099],{"type":23,"value":9100},"Detects changes using timestamps, cursors, or diffs",{"type":17,"tag":84,"props":9102,"children":9103},{},[9104],{"type":23,"value":9105},"Delivers events to your webhook endpoint",{"type":17,"tag":29,"props":9107,"children":9108},{},[9109],{"type":23,"value":9110},"Your application subscribes once and receives events without running polling jobs.",{"type":17,"tag":29,"props":9112,"children":9113},{},[9114],{"type":23,"value":9115},"The important detail:",{"type":17,"tag":3414,"props":9117,"children":9118},{},[9119],{"type":17,"tag":29,"props":9120,"children":9121},{},[9122],{"type":23,"value":9123},"Polling still exists—it's handled inside the integration layer instead of your application.",{"type":17,"tag":29,"props":9125,"children":9126},{},[9127],{"type":23,"value":9128},"Freshness depends on how frequently changes are detected. That can mean minutes or longer intervals depending on the platform.",{"type":17,"tag":29,"props":9130,"children":9131},{},[9132],{"type":23,"value":9133},"This directly affects whether your product reacts to changes quickly—or with noticeable delay.",{"type":17,"tag":29,"props":9135,"children":9136},{},[9137],{"type":17,"tag":6438,"props":9138,"children":9141},{"alt":9139,"src":9140},"virtual_webhooks.png","https://s3.us-east-2.amazonaws.com/unified-article-images/virtual_webhooks_vs_polling_jobs_how_integrations_handle_change_detection-1.png",[],{"type":17,"tag":68,"props":9143,"children":9145},{"id":9144},"separate-model-sync-based-notification-systems",[9146],{"type":23,"value":9147},"Separate model: sync-based notification systems",{"type":17,"tag":29,"props":9149,"children":9150},{},[9151],{"type":23,"value":9152},"This is where most confusion happens.",{"type":17,"tag":29,"props":9154,"children":9155},{},[9156],{"type":23,"value":3442},{"type":17,"tag":80,"props":9158,"children":9159},{},[9160,9165,9170],{"type":17,"tag":84,"props":9161,"children":9162},{},[9163],{"type":23,"value":9164},"The platform runs a scheduled sync",{"type":17,"tag":84,"props":9166,"children":9167},{},[9168],{"type":23,"value":9169},"Stores records in its own environment",{"type":17,"tag":84,"props":9171,"children":9172},{},[9173],{"type":23,"value":9174},"Sends a webhook after the sync completes",{"type":17,"tag":29,"props":9176,"children":9177},{},[9178],{"type":23,"value":9179},"These are not event-driven change detection systems.",{"type":17,"tag":29,"props":9181,"children":9182},{},[9183,9185,9190],{"type":23,"value":9184},"They are ",{"type":17,"tag":48,"props":9186,"children":9187},{},[9188],{"type":23,"value":9189},"notifications tied to a batch process",{"type":23,"value":54},{"type":17,"tag":29,"props":9192,"children":9193},{},[9194],{"type":23,"value":9195},"In most cases:",{"type":17,"tag":80,"props":9197,"children":9198},{},[9199,9204],{"type":17,"tag":84,"props":9200,"children":9201},{},[9202],{"type":23,"value":9203},"The webhook does not include updated records",{"type":17,"tag":84,"props":9205,"children":9206},{},[9207],{"type":23,"value":9208},"Your application retrieves data separately",{"type":17,"tag":29,"props":9210,"children":9211},{},[9212],{"type":23,"value":9213},"In practice, your application reacts after the sync completes—not when the change actually happens.",{"type":17,"tag":29,"props":9215,"children":9216},{},[9217],{"type":17,"tag":6438,"props":9218,"children":9221},{"alt":9219,"src":9220},"sync_based_webhooks.png","https://s3.us-east-2.amazonaws.com/unified-article-images/virtual_webhooks_vs_polling_jobs_how_integrations_handle_change_detection-2.png",[],{"type":17,"tag":68,"props":9223,"children":9224},{"id":7034},[9225],{"type":23,"value":7037},{"type":17,"tag":29,"props":9227,"children":9228},{},[9229],{"type":23,"value":9230},"At a glance, these approaches can look similar. In production, they behave very differently.",{"type":17,"tag":239,"props":9232,"children":9234},{"id":9233},"freshness",[9235],{"type":23,"value":9236},"Freshness",{"type":17,"tag":80,"props":9238,"children":9239},{},[9240,9249,9259],{"type":17,"tag":84,"props":9241,"children":9242},{},[9243,9247],{"type":17,"tag":48,"props":9244,"children":9245},{},[9246],{"type":23,"value":9024},{"type":23,"value":9248}," → near immediate",{"type":17,"tag":84,"props":9250,"children":9251},{},[9252,9257],{"type":17,"tag":48,"props":9253,"children":9254},{},[9255],{"type":23,"value":9256},"Virtual webhooks",{"type":23,"value":9258}," → depends on detection interval",{"type":17,"tag":84,"props":9260,"children":9261},{},[9262,9267],{"type":17,"tag":48,"props":9263,"children":9264},{},[9265],{"type":23,"value":9266},"Sync-based systems",{"type":23,"value":9268}," → depends on sync cadence",{"type":17,"tag":29,"props":9270,"children":9271},{},[9272],{"type":23,"value":9273},"If your feature depends on timing (alerts, automation, AI workflows), this difference is visible to users.",{"type":17,"tag":239,"props":9275,"children":9277},{"id":9276},"what-your-application-actually-receives",[9278],{"type":23,"value":9279},"What your application actually receives",{"type":17,"tag":29,"props":9281,"children":9282},{},[9283],{"type":23,"value":9284},"There are two common patterns:",{"type":17,"tag":29,"props":9286,"children":9287},{},[9288],{"type":17,"tag":48,"props":9289,"children":9290},{},[9291],{"type":23,"value":9292},"Event with records",{"type":17,"tag":80,"props":9294,"children":9295},{},[9296,9301],{"type":17,"tag":84,"props":9297,"children":9298},{},[9299],{"type":23,"value":9300},"Webhook contains updated data",{"type":17,"tag":84,"props":9302,"children":9303},{},[9304],{"type":23,"value":9305},"No follow-up request required",{"type":17,"tag":29,"props":9307,"children":9308},{},[9309],{"type":17,"tag":48,"props":9310,"children":9311},{},[9312],{"type":23,"value":9313},"Notification only",{"type":17,"tag":80,"props":9315,"children":9316},{},[9317,9322],{"type":17,"tag":84,"props":9318,"children":9319},{},[9320],{"type":23,"value":9321},"Webhook signals that something changed",{"type":17,"tag":84,"props":9323,"children":9324},{},[9325],{"type":23,"value":9208},{"type":17,"tag":29,"props":9327,"children":9328},{},[9329],{"type":23,"value":9330},"If every event requires another API call, your system still needs retrieval logic, pagination handling, and retry logic.",{"type":17,"tag":239,"props":9332,"children":9334},{"id":9333},"where-polling-lives",[9335],{"type":23,"value":9336},"Where polling lives",{"type":17,"tag":29,"props":9338,"children":9339},{},[9340],{"type":23,"value":9341},"Polling does not disappear. It moves.",{"type":17,"tag":80,"props":9343,"children":9344},{},[9345,9350,9355],{"type":17,"tag":84,"props":9346,"children":9347},{},[9348],{"type":23,"value":9349},"In polling jobs → your application owns it",{"type":17,"tag":84,"props":9351,"children":9352},{},[9353],{"type":23,"value":9354},"In virtual webhooks → the integration layer owns it",{"type":17,"tag":84,"props":9356,"children":9357},{},[9358],{"type":23,"value":9359},"In sync systems → it runs as scheduled batch jobs",{"type":17,"tag":29,"props":9361,"children":9362},{},[9363],{"type":23,"value":9364},"The real question is:",{"type":17,"tag":29,"props":9366,"children":9367},{},[9368],{"type":23,"value":9369},"Do you want that logic in your application, or handled by the integration layer?",{"type":17,"tag":239,"props":9371,"children":9373},{"id":9372},"data-handling-and-system-design",[9374],{"type":23,"value":9375},"Data handling and system design",{"type":17,"tag":29,"props":9377,"children":9378},{},[9379],{"type":23,"value":9380},"These models also differ in how data is handled.",{"type":17,"tag":80,"props":9382,"children":9383},{},[9384,9389],{"type":17,"tag":84,"props":9385,"children":9386},{},[9387],{"type":23,"value":9388},"Sync-based platforms maintain stored copies of records",{"type":17,"tag":84,"props":9390,"children":9391},{},[9392],{"type":23,"value":9393},"Platforms like Unified retrieve data directly from the source API when events are generated",{"type":17,"tag":29,"props":9395,"children":9396},{},[9397],{"type":23,"value":9398},"This affects:",{"type":17,"tag":80,"props":9400,"children":9401},{},[9402,9407,9411],{"type":17,"tag":84,"props":9403,"children":9404},{},[9405],{"type":23,"value":9406},"compliance scope",{"type":17,"tag":84,"props":9408,"children":9409},{},[9410],{"type":23,"value":838},{"type":17,"tag":84,"props":9412,"children":9413},{},[9414],{"type":23,"value":9415},"long-term migration risk",{"type":17,"tag":68,"props":9417,"children":9419},{"id":9418},"what-this-looks-like-in-your-application",[9420],{"type":23,"value":9421},"What this looks like in your application",{"type":17,"tag":29,"props":9423,"children":9424},{},[9425],{"type":23,"value":9426},"Two teams building the same feature can end up with very different architectures.",{"type":17,"tag":29,"props":9428,"children":9429},{},[9430],{"type":17,"tag":48,"props":9431,"children":9432},{},[9433],{"type":23,"value":9434},"With sync-based notifications",{"type":17,"tag":80,"props":9436,"children":9437},{},[9438,9443,9448,9453,9458],{"type":17,"tag":84,"props":9439,"children":9440},{},[9441],{"type":23,"value":9442},"Receive notification",{"type":17,"tag":84,"props":9444,"children":9445},{},[9446],{"type":23,"value":9447},"Retrieve updated records",{"type":17,"tag":84,"props":9449,"children":9450},{},[9451],{"type":23,"value":9452},"Handle pagination",{"type":17,"tag":84,"props":9454,"children":9455},{},[9456],{"type":23,"value":9457},"Deduplicate data",{"type":17,"tag":84,"props":9459,"children":9460},{},[9461],{"type":23,"value":9462},"Manage retries",{"type":17,"tag":29,"props":9464,"children":9465},{},[9466],{"type":17,"tag":48,"props":9467,"children":9468},{},[9469],{"type":23,"value":9470},"With virtual webhooks (records included)",{"type":17,"tag":80,"props":9472,"children":9473},{},[9474,9479],{"type":17,"tag":84,"props":9475,"children":9476},{},[9477],{"type":23,"value":9478},"Receive event",{"type":17,"tag":84,"props":9480,"children":9481},{},[9482],{"type":23,"value":9483},"Process data",{"type":17,"tag":29,"props":9485,"children":9486},{},[9487],{"type":23,"value":9488},"That difference compounds across integrations and objects.",{"type":17,"tag":68,"props":9490,"children":9492},{"id":9491},"the-takeaway",[9493],{"type":23,"value":9494},"The takeaway",{"type":17,"tag":29,"props":9496,"children":9497},{},[9498],{"type":23,"value":9499},"'Webhook support' is not enough information.",{"type":17,"tag":29,"props":9501,"children":9502},{},[9503],{"type":23,"value":9504},"What matters is:",{"type":17,"tag":80,"props":9506,"children":9507},{},[9508,9513,9518],{"type":17,"tag":84,"props":9509,"children":9510},{},[9511],{"type":23,"value":9512},"how changes are detected",{"type":17,"tag":84,"props":9514,"children":9515},{},[9516],{"type":23,"value":9517},"when events are delivered",{"type":17,"tag":84,"props":9519,"children":9520},{},[9521],{"type":23,"value":9522},"whether events include usable data",{"type":17,"tag":29,"props":9524,"children":9525},{},[9526],{"type":23,"value":9527},"Virtual webhooks move change detection and delivery into the integration layer.",{"type":17,"tag":29,"props":9529,"children":9530},{},[9531],{"type":23,"value":9532},"Sync-based systems notify your application after data has already been processed elsewhere.",{"type":17,"tag":29,"props":9534,"children":9535},{},[9536],{"type":23,"value":9537},"That distinction determines whether your application is built around events—or around scheduled data retrieval.",{"type":17,"tag":29,"props":9539,"children":9540},{},[9541,9542],{"type":23,"value":1609},{"type":17,"tag":133,"props":9543,"children":9545},{"href":1612,"rel":9544},[214],[9546],{"type":23,"value":1616},{"type":17,"tag":29,"props":9548,"children":9549},{},[9550,9551],{"type":23,"value":1609},{"type":17,"tag":133,"props":9552,"children":9554},{"href":1623,"rel":9553},[214],[9555],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":9557},[9558,9561,9564,9565,9571,9572],{"id":9015,"depth":1629,"text":9018,"children":9559},[9560],{"id":9021,"depth":1635,"text":9024},{"id":9068,"depth":1629,"text":9071,"children":9562},[9563],{"id":9074,"depth":1635,"text":9077},{"id":9144,"depth":1629,"text":9147},{"id":7034,"depth":1629,"text":7037,"children":9566},[9567,9568,9569,9570],{"id":9233,"depth":1635,"text":9236},{"id":9276,"depth":1635,"text":9279},{"id":9333,"depth":1635,"text":9336},{"id":9372,"depth":1635,"text":9375},{"id":9418,"depth":1629,"text":9421},{"id":9491,"depth":1629,"text":9494},"content:blog:virtual_webhooks_vs_polling_jobs_how_integrations_handle_change_detection.md","blog/virtual_webhooks_vs_polling_jobs_how_integrations_handle_change_detection.md","blog/virtual_webhooks_vs_polling_jobs_how_integrations_handle_change_detection",{"_path":9577,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":9578,"description":9579,"img":9580,"date":9581,"tag":12,"body":9582,"_type":1677,"_id":11057,"_source":1679,"_file":11058,"_stem":11059,"_extension":1682},"/blog/pass_through_vs_sync_based_unified_apis_architecture_tradeoffs_explained","Pass-Through vs. Sync-Based Unified APIs: Architecture Tradeoffs Explained","Most unified API platforms look the same on the surface. They all promise a unified API across dozens of integrations, normalized schemas, and faster time to...","https://s3.us-east-2.amazonaws.com/unified-article-images/pass_through_vs_sync_based_unified_apis_architecture_tradeoffs_explained-icon.png","2026-03-30T22:39:00.000Z",{"type":14,"children":9583,"toc":11020},[9584,9589,9592,9599,9610,9615,9634,9639,9643,9656,9661,9684,9689,9695,9700,9705,9738,9743,9749,9777,9782,9790,9796,9801,9806,9834,9839,9872,9877,9885,9891,10113,10119,10125,10130,10135,10140,10145,10150,10155,10173,10178,10195,10200,10218,10224,10229,10234,10252,10257,10263,10268,10286,10291,10309,10314,10320,10325,10330,10335,10348,10353,10359,10364,10369,10387,10392,10397,10415,10421,10426,10432,10447,10453,10472,10478,10489,10494,10500,10505,10510,10548,10552,10565,10570,10579,10584,10589,10602,10607,10625,10631,10636,10641,10654,10659,10664,10682,10688,10693,10711,10717,10722,10740,10745,10751,10756,10773,10778,10783,10801,10807,10813,10840,10846,10869,10875,10888,10894,10899,10932,10937,10955,10960,10964,10997,11002,11011],{"type":17,"tag":18,"props":9585,"children":9587},{"id":9586},"pass-through-vs-sync-based-unified-apis-architecture-tradeoffs-explained",[9588],{"type":23,"value":9578},{"type":17,"tag":25,"props":9590,"children":9591},{},[],{"type":17,"tag":29,"props":9593,"children":9594},{},[9595],{"type":17,"tag":33,"props":9596,"children":9597},{},[9598],{"type":23,"value":7768},{"type":17,"tag":29,"props":9600,"children":9601},{},[9602,9604,9608],{"type":23,"value":9603},"Most ",{"type":17,"tag":133,"props":9605,"children":9606},{"href":7691},[9607],{"type":23,"value":7459},{"type":23,"value":9609}," platforms look the same on the surface. They all promise a unified API across dozens of integrations, normalized schemas, and faster time to market.",{"type":17,"tag":29,"props":9611,"children":9612},{},[9613],{"type":23,"value":9614},"Under the hood, they are built on two very different architectures.",{"type":17,"tag":29,"props":9616,"children":9617},{},[9618,9620,9625,9627,9632],{"type":23,"value":9619},"A ",{"type":17,"tag":48,"props":9621,"children":9622},{},[9623],{"type":23,"value":9624},"pass-through unified API",{"type":23,"value":9626}," executes every request directly against the source system in real time. A ",{"type":17,"tag":48,"props":9628,"children":9629},{},[9630],{"type":23,"value":9631},"sync-based unified API",{"type":23,"value":9633}," copies third-party data into its own database and serves reads from that stored replica.",{"type":17,"tag":29,"props":9635,"children":9636},{},[9637],{"type":23,"value":9638},"Both approaches can provide the same endpoints. They produce very different behavior once your product is in production.",{"type":17,"tag":68,"props":9640,"children":9641},{"id":7034},[9642],{"type":23,"value":7037},{"type":17,"tag":29,"props":9644,"children":9645},{},[9646,9648,9654],{"type":23,"value":9647},"Two platforms can both return data from ",{"type":17,"tag":6121,"props":9649,"children":9651},{"className":9650},[],[9652],{"type":23,"value":9653},"/crm/contacts",{"type":23,"value":9655},". One is returning live data from the source system. The other is returning a cached copy from a background sync.",{"type":17,"tag":29,"props":9657,"children":9658},{},[9659],{"type":23,"value":9660},"That difference affects:",{"type":17,"tag":80,"props":9662,"children":9663},{},[9664,9669,9674,9679],{"type":17,"tag":84,"props":9665,"children":9666},{},[9667],{"type":23,"value":9668},"whether your product reflects current state",{"type":17,"tag":84,"props":9670,"children":9671},{},[9672],{"type":23,"value":9673},"whether workflows execute correctly",{"type":17,"tag":84,"props":9675,"children":9676},{},[9677],{"type":23,"value":9678},"whether users trust what they see",{"type":17,"tag":84,"props":9680,"children":9681},{},[9682],{"type":23,"value":9683},"whether AI systems produce accurate outputs",{"type":17,"tag":29,"props":9685,"children":9686},{},[9687],{"type":23,"value":9688},"This is not an implementation detail. It defines how your product behaves.",{"type":17,"tag":68,"props":9690,"children":9692},{"id":9691},"what-is-a-pass-through-unified-api",[9693],{"type":23,"value":9694},"What is a pass-through unified API?",{"type":17,"tag":29,"props":9696,"children":9697},{},[9698],{"type":23,"value":9699},"A pass-through unified API is a real-time execution layer.",{"type":17,"tag":29,"props":9701,"children":9702},{},[9703],{"type":23,"value":9704},"When your application makes a request:",{"type":17,"tag":6154,"props":9706,"children":9707},{},[9708,9713,9718,9723,9728,9733],{"type":17,"tag":84,"props":9709,"children":9710},{},[9711],{"type":23,"value":9712},"the platform authenticates the request",{"type":17,"tag":84,"props":9714,"children":9715},{},[9716],{"type":23,"value":9717},"retrieves connection credentials",{"type":17,"tag":84,"props":9719,"children":9720},{},[9721],{"type":23,"value":9722},"translates the unified request into the provider's format",{"type":17,"tag":84,"props":9724,"children":9725},{},[9726],{"type":23,"value":9727},"calls the upstream API directly",{"type":17,"tag":84,"props":9729,"children":9730},{},[9731],{"type":23,"value":9732},"normalizes the response in memory",{"type":17,"tag":84,"props":9734,"children":9735},{},[9736],{"type":23,"value":9737},"returns the result immediately",{"type":17,"tag":29,"props":9739,"children":9740},{},[9741],{"type":23,"value":9742},"No customer data is stored as a system of record.",{"type":17,"tag":239,"props":9744,"children":9746},{"id":9745},"what-this-means-in-practice",[9747],{"type":23,"value":9748},"What this means in practice",{"type":17,"tag":80,"props":9750,"children":9751},{},[9752,9757,9762,9767,9772],{"type":17,"tag":84,"props":9753,"children":9754},{},[9755],{"type":23,"value":9756},"reads come directly from the source system",{"type":17,"tag":84,"props":9758,"children":9759},{},[9760],{"type":23,"value":9761},"writes go directly to the source system",{"type":17,"tag":84,"props":9763,"children":9764},{},[9765],{"type":23,"value":9766},"responses reflect current state",{"type":17,"tag":84,"props":9768,"children":9769},{},[9770],{"type":23,"value":9771},"transformations happen at request time",{"type":17,"tag":84,"props":9773,"children":9774},{},[9775],{"type":23,"value":9776},"latency depends on upstream APIs",{"type":17,"tag":29,"props":9778,"children":9779},{},[9780],{"type":23,"value":9781},"This model prioritizes correctness and real-time behavior.",{"type":17,"tag":29,"props":9783,"children":9784},{},[9785],{"type":17,"tag":6438,"props":9786,"children":9789},{"alt":9787,"src":9788},"passthrough.png","https://s3.us-east-2.amazonaws.com/unified-article-images/pass_through_vs_sync_based_unified_apis_architecture_tradeoffs_explained-0.png",[],{"type":17,"tag":68,"props":9791,"children":9793},{"id":9792},"what-is-a-sync-based-unified-api",[9794],{"type":23,"value":9795},"What is a sync-based unified API?",{"type":17,"tag":29,"props":9797,"children":9798},{},[9799],{"type":23,"value":9800},"A sync-based unified API uses a replication model.",{"type":17,"tag":29,"props":9802,"children":9803},{},[9804],{"type":23,"value":9805},"Instead of fetching data on demand, the platform:",{"type":17,"tag":6154,"props":9807,"children":9808},{},[9809,9814,9819,9824,9829],{"type":17,"tag":84,"props":9810,"children":9811},{},[9812],{"type":23,"value":9813},"polls upstream APIs on a schedule",{"type":17,"tag":84,"props":9815,"children":9816},{},[9817],{"type":23,"value":9818},"retrieves data in batches",{"type":17,"tag":84,"props":9820,"children":9821},{},[9822],{"type":23,"value":9823},"normalizes it",{"type":17,"tag":84,"props":9825,"children":9826},{},[9827],{"type":23,"value":9828},"stores it in its own database",{"type":17,"tag":84,"props":9830,"children":9831},{},[9832],{"type":23,"value":9833},"serves API responses from that stored copy",{"type":17,"tag":239,"props":9835,"children":9837},{"id":9836},"what-this-means-in-practice-1",[9838],{"type":23,"value":9748},{"type":17,"tag":80,"props":9840,"children":9841},{},[9842,9847,9852,9857],{"type":17,"tag":84,"props":9843,"children":9844},{},[9845],{"type":23,"value":9846},"reads come from the platform's database",{"type":17,"tag":84,"props":9848,"children":9849},{},[9850],{"type":23,"value":9851},"writes still go to the source system",{"type":17,"tag":84,"props":9853,"children":9854},{},[9855],{"type":23,"value":9856},"data freshness depends on sync frequency",{"type":17,"tag":84,"props":9858,"children":9859},{},[9860,9862,9866,9868],{"type":23,"value":9861},"background jobs manage ",{"type":17,"tag":133,"props":9863,"children":9864},{"href":1857},[9865],{"type":23,"value":1860},{"type":23,"value":9867},", retries, and ",{"type":17,"tag":133,"props":9869,"children":9870},{"href":135},[9871],{"type":23,"value":138},{"type":17,"tag":29,"props":9873,"children":9874},{},[9875],{"type":23,"value":9876},"This model prioritizes speed and availability for reads.",{"type":17,"tag":29,"props":9878,"children":9879},{},[9880],{"type":17,"tag":6438,"props":9881,"children":9884},{"alt":9882,"src":9883},"sync-based.png","https://s3.us-east-2.amazonaws.com/unified-article-images/pass_through_vs_sync_based_unified_apis_architecture_tradeoffs_explained-1.png",[],{"type":17,"tag":68,"props":9886,"children":9888},{"id":9887},"side-by-side-comparison",[9889],{"type":23,"value":9890},"Side-by-side comparison",{"type":17,"tag":7231,"props":9892,"children":9893},{},[9894,9915],{"type":17,"tag":7235,"props":9895,"children":9896},{},[9897],{"type":17,"tag":7239,"props":9898,"children":9899},{},[9900,9905,9910],{"type":17,"tag":7243,"props":9901,"children":9902},{},[9903],{"type":23,"value":9904},"Dimension",{"type":17,"tag":7243,"props":9906,"children":9907},{},[9908],{"type":23,"value":9909},"Pass-through",{"type":17,"tag":7243,"props":9911,"children":9912},{},[9913],{"type":23,"value":9914},"Sync-based",{"type":17,"tag":7259,"props":9916,"children":9917},{},[9918,9936,9953,9971,9989,10007,10025,10042,10060,10078,10096],{"type":17,"tag":7239,"props":9919,"children":9920},{},[9921,9926,9931],{"type":17,"tag":7266,"props":9922,"children":9923},{},[9924],{"type":23,"value":9925},"Read source",{"type":17,"tag":7266,"props":9927,"children":9928},{},[9929],{"type":23,"value":9930},"Live upstream API",{"type":17,"tag":7266,"props":9932,"children":9933},{},[9934],{"type":23,"value":9935},"Internal database",{"type":17,"tag":7239,"props":9937,"children":9938},{},[9939,9944,9949],{"type":17,"tag":7266,"props":9940,"children":9941},{},[9942],{"type":23,"value":9943},"Write path",{"type":17,"tag":7266,"props":9945,"children":9946},{},[9947],{"type":23,"value":9948},"Direct to upstream",{"type":17,"tag":7266,"props":9950,"children":9951},{},[9952],{"type":23,"value":9948},{"type":17,"tag":7239,"props":9954,"children":9955},{},[9956,9961,9966],{"type":17,"tag":7266,"props":9957,"children":9958},{},[9959],{"type":23,"value":9960},"Data freshness",{"type":17,"tag":7266,"props":9962,"children":9963},{},[9964],{"type":23,"value":9965},"Real-time",{"type":17,"tag":7266,"props":9967,"children":9968},{},[9969],{"type":23,"value":9970},"Delayed (minutes to hours)",{"type":17,"tag":7239,"props":9972,"children":9973},{},[9974,9979,9984],{"type":17,"tag":7266,"props":9975,"children":9976},{},[9977],{"type":23,"value":9978},"Latency",{"type":17,"tag":7266,"props":9980,"children":9981},{},[9982],{"type":23,"value":9983},"Network-bound",{"type":17,"tag":7266,"props":9985,"children":9986},{},[9987],{"type":23,"value":9988},"Fast local reads",{"type":17,"tag":7239,"props":9990,"children":9991},{},[9992,9997,10002],{"type":17,"tag":7266,"props":9993,"children":9994},{},[9995],{"type":23,"value":9996},"Read-after-write consistency",{"type":17,"tag":7266,"props":9998,"children":9999},{},[10000],{"type":23,"value":10001},"Strong",{"type":17,"tag":7266,"props":10003,"children":10004},{},[10005],{"type":23,"value":10006},"Often inconsistent",{"type":17,"tag":7239,"props":10008,"children":10009},{},[10010,10015,10020],{"type":17,"tag":7266,"props":10011,"children":10012},{},[10013],{"type":23,"value":10014},"Failure mode",{"type":17,"tag":7266,"props":10016,"children":10017},{},[10018],{"type":23,"value":10019},"Depends on upstream",{"type":17,"tag":7266,"props":10021,"children":10022},{},[10023],{"type":23,"value":10024},"Can serve stale data",{"type":17,"tag":7239,"props":10026,"children":10027},{},[10028,10032,10037],{"type":17,"tag":7266,"props":10029,"children":10030},{},[10031],{"type":23,"value":3279},{"type":17,"tag":7266,"props":10033,"children":10034},{},[10035],{"type":23,"value":10036},"Exposed downstream",{"type":17,"tag":7266,"props":10038,"children":10039},{},[10040],{"type":23,"value":10041},"Managed internally",{"type":17,"tag":7239,"props":10043,"children":10044},{},[10045,10050,10055],{"type":17,"tag":7266,"props":10046,"children":10047},{},[10048],{"type":23,"value":10049},"Event delivery",{"type":17,"tag":7266,"props":10051,"children":10052},{},[10053],{"type":23,"value":10054},"Real-time (native or virtual)",{"type":17,"tag":7266,"props":10056,"children":10057},{},[10058],{"type":23,"value":10059},"Sync-triggered",{"type":17,"tag":7239,"props":10061,"children":10062},{},[10063,10068,10073],{"type":17,"tag":7266,"props":10064,"children":10065},{},[10066],{"type":23,"value":10067},"Compliance scope",{"type":17,"tag":7266,"props":10069,"children":10070},{},[10071],{"type":23,"value":10072},"Minimal",{"type":17,"tag":7266,"props":10074,"children":10075},{},[10076],{"type":23,"value":10077},"Expanded (stores data)",{"type":17,"tag":7239,"props":10079,"children":10080},{},[10081,10086,10091],{"type":17,"tag":7266,"props":10082,"children":10083},{},[10084],{"type":23,"value":10085},"Infrastructure complexity",{"type":17,"tag":7266,"props":10087,"children":10088},{},[10089],{"type":23,"value":10090},"Lower",{"type":17,"tag":7266,"props":10092,"children":10093},{},[10094],{"type":23,"value":10095},"High (sync engines, queues)",{"type":17,"tag":7239,"props":10097,"children":10098},{},[10099,10103,10108],{"type":17,"tag":7266,"props":10100,"children":10101},{},[10102],{"type":23,"value":502},{"type":17,"tag":7266,"props":10104,"children":10105},{},[10106],{"type":23,"value":10107},"Workflows, automation, AI",{"type":17,"tag":7266,"props":10109,"children":10110},{},[10111],{"type":23,"value":10112},"Reporting, analytics",{"type":17,"tag":68,"props":10114,"children":10116},{"id":10115},"the-tradeoffs-that-actually-matter",[10117],{"type":23,"value":10118},"The tradeoffs that actually matter",{"type":17,"tag":239,"props":10120,"children":10122},{"id":10121},"data-freshness-vs-speed",[10123],{"type":23,"value":10124},"Data freshness vs. speed",{"type":17,"tag":29,"props":10126,"children":10127},{},[10128],{"type":23,"value":10129},"Sync-based systems are faster for reads because they query a local database. The tradeoff is that the data may be outdated.",{"type":17,"tag":29,"props":10131,"children":10132},{},[10133],{"type":23,"value":10134},"Pass-through systems are slower because they depend on upstream APIs. The tradeoff is that the data is accurate at the moment of the request.",{"type":17,"tag":29,"props":10136,"children":10137},{},[10138],{"type":23,"value":10139},"The real question is not speed. It is whether your product needs current state.",{"type":17,"tag":239,"props":10141,"children":10143},{"id":10142},"read-after-write-consistency",[10144],{"type":23,"value":9996},{"type":17,"tag":29,"props":10146,"children":10147},{},[10148],{"type":23,"value":10149},"This is where many teams run into problems.",{"type":17,"tag":29,"props":10151,"children":10152},{},[10153],{"type":23,"value":10154},"In a pass-through model:",{"type":17,"tag":80,"props":10156,"children":10157},{},[10158,10163,10168],{"type":17,"tag":84,"props":10159,"children":10160},{},[10161],{"type":23,"value":10162},"you update a record",{"type":17,"tag":84,"props":10164,"children":10165},{},[10166],{"type":23,"value":10167},"you read it immediately",{"type":17,"tag":84,"props":10169,"children":10170},{},[10171],{"type":23,"value":10172},"you see the updated value",{"type":17,"tag":29,"props":10174,"children":10175},{},[10176],{"type":23,"value":10177},"In a sync-based model:",{"type":17,"tag":80,"props":10179,"children":10180},{},[10181,10185,10190],{"type":17,"tag":84,"props":10182,"children":10183},{},[10184],{"type":23,"value":10162},{"type":17,"tag":84,"props":10186,"children":10187},{},[10188],{"type":23,"value":10189},"the sync has not run yet",{"type":17,"tag":84,"props":10191,"children":10192},{},[10193],{"type":23,"value":10194},"you read stale data",{"type":17,"tag":29,"props":10196,"children":10197},{},[10198],{"type":23,"value":10199},"This creates inconsistencies in:",{"type":17,"tag":80,"props":10201,"children":10202},{},[10203,10208,10213],{"type":17,"tag":84,"props":10204,"children":10205},{},[10206],{"type":23,"value":10207},"user interfaces",{"type":17,"tag":84,"props":10209,"children":10210},{},[10211],{"type":23,"value":10212},"approval workflows",{"type":17,"tag":84,"props":10214,"children":10215},{},[10216],{"type":23,"value":10217},"automation logic",{"type":17,"tag":239,"props":10219,"children":10221},{"id":10220},"event-delivery-and-product-behavior",[10222],{"type":23,"value":10223},"Event delivery and product behavior",{"type":17,"tag":29,"props":10225,"children":10226},{},[10227],{"type":23,"value":10228},"Sync-based platforms typically emit events after a sync completes. That introduces delay and often requires follow-up API calls to fetch updated data.",{"type":17,"tag":29,"props":10230,"children":10231},{},[10232],{"type":23,"value":10233},"Pass-through platforms simulate real-time behavior using virtual webhooks:",{"type":17,"tag":80,"props":10235,"children":10236},{},[10237,10242,10247],{"type":17,"tag":84,"props":10238,"children":10239},{},[10240],{"type":23,"value":10241},"changes are detected via polling",{"type":17,"tag":84,"props":10243,"children":10244},{},[10245],{"type":23,"value":10246},"full records are delivered immediately",{"type":17,"tag":84,"props":10248,"children":10249},{},[10250],{"type":23,"value":10251},"no additional fetch required",{"type":17,"tag":29,"props":10253,"children":10254},{},[10255],{"type":23,"value":10256},"This changes how you design product features. It determines whether your system reacts instantly or eventually.",{"type":17,"tag":239,"props":10258,"children":10260},{"id":10259},"compliance-and-data-storage",[10261],{"type":23,"value":10262},"Compliance and data storage",{"type":17,"tag":29,"props":10264,"children":10265},{},[10266],{"type":23,"value":10267},"Sync-based platforms store customer data. That expands:",{"type":17,"tag":80,"props":10269,"children":10270},{},[10271,10276,10281],{"type":17,"tag":84,"props":10272,"children":10273},{},[10274],{"type":23,"value":10275},"audit scope",{"type":17,"tag":84,"props":10277,"children":10278},{},[10279],{"type":23,"value":10280},"data residency requirements",{"type":17,"tag":84,"props":10282,"children":10283},{},[10284],{"type":23,"value":10285},"breach surface area",{"type":17,"tag":29,"props":10287,"children":10288},{},[10289],{"type":23,"value":10290},"Pass-through platforms avoid storing payload data. That reduces:",{"type":17,"tag":80,"props":10292,"children":10293},{},[10294,10299,10304],{"type":17,"tag":84,"props":10295,"children":10296},{},[10297],{"type":23,"value":10298},"compliance overhead",{"type":17,"tag":84,"props":10300,"children":10301},{},[10302],{"type":23,"value":10303},"vendor risk",{"type":17,"tag":84,"props":10305,"children":10306},{},[10307],{"type":23,"value":10308},"duplication of sensitive data",{"type":17,"tag":29,"props":10310,"children":10311},{},[10312],{"type":23,"value":10313},"For enterprise teams, this alone can influence vendor selection.",{"type":17,"tag":239,"props":10315,"children":10317},{"id":10316},"behavior-under-failure",[10318],{"type":23,"value":10319},"Behavior under failure",{"type":17,"tag":29,"props":10321,"children":10322},{},[10323],{"type":23,"value":10324},"Sync-based systems can continue serving stale data if the upstream API is unavailable.",{"type":17,"tag":29,"props":10326,"children":10327},{},[10328],{"type":23,"value":10329},"Pass-through systems reflect upstream availability directly. If the source API is down, requests fail.",{"type":17,"tag":29,"props":10331,"children":10332},{},[10333],{"type":23,"value":10334},"This is a tradeoff between:",{"type":17,"tag":80,"props":10336,"children":10337},{},[10338,10343],{"type":17,"tag":84,"props":10339,"children":10340},{},[10341],{"type":23,"value":10342},"availability",{"type":17,"tag":84,"props":10344,"children":10345},{},[10346],{"type":23,"value":10347},"correctness",{"type":17,"tag":29,"props":10349,"children":10350},{},[10351],{"type":23,"value":10352},"Different products prioritize this differently.",{"type":17,"tag":239,"props":10354,"children":10356},{"id":10355},"ai-and-real-time-systems",[10357],{"type":23,"value":10358},"AI and real-time systems",{"type":17,"tag":29,"props":10360,"children":10361},{},[10362],{"type":23,"value":10363},"AI systems depend on current data.",{"type":17,"tag":29,"props":10365,"children":10366},{},[10367],{"type":23,"value":10368},"If your architecture feeds stale data into:",{"type":17,"tag":80,"props":10370,"children":10371},{},[10372,10377,10382],{"type":17,"tag":84,"props":10373,"children":10374},{},[10375],{"type":23,"value":10376},"copilots",{"type":17,"tag":84,"props":10378,"children":10379},{},[10380],{"type":23,"value":10381},"agents",{"type":17,"tag":84,"props":10383,"children":10384},{},[10385],{"type":23,"value":10386},"retrieval pipelines",{"type":17,"tag":29,"props":10388,"children":10389},{},[10390],{"type":23,"value":10391},"you introduce incorrect outputs and broken workflows.",{"type":17,"tag":29,"props":10393,"children":10394},{},[10395],{"type":23,"value":10396},"Pass-through architectures align better with:",{"type":17,"tag":80,"props":10398,"children":10399},{},[10400,10405,10410],{"type":17,"tag":84,"props":10401,"children":10402},{},[10403],{"type":23,"value":10404},"real-time context",{"type":17,"tag":84,"props":10406,"children":10407},{},[10408],{"type":23,"value":10409},"deterministic behavior",{"type":17,"tag":84,"props":10411,"children":10412},{},[10413],{"type":23,"value":10414},"synchronous read/write loops",{"type":17,"tag":68,"props":10416,"children":10418},{"id":10417},"where-unified-api-vendors-fall",[10419],{"type":23,"value":10420},"Where unified API vendors fall",{"type":17,"tag":29,"props":10422,"children":10423},{},[10424],{"type":23,"value":10425},"Most vendors cluster clearly by architecture.",{"type":17,"tag":239,"props":10427,"children":10429},{"id":10428},"pass-through-real-time-execution",[10430],{"type":23,"value":10431},"Pass-through / real-time execution",{"type":17,"tag":80,"props":10433,"children":10434},{},[10435,10439,10443],{"type":17,"tag":84,"props":10436,"children":10437},{},[10438],{"type":23,"value":217},{"type":17,"tag":84,"props":10440,"children":10441},{},[10442],{"type":23,"value":237},{"type":17,"tag":84,"props":10444,"children":10445},{},[10446],{"type":23,"value":8037},{"type":17,"tag":239,"props":10448,"children":10450},{"id":10449},"sync-and-store",[10451],{"type":23,"value":10452},"Sync-and-store",{"type":17,"tag":80,"props":10454,"children":10455},{},[10456,10460,10464,10468],{"type":17,"tag":84,"props":10457,"children":10458},{},[10459],{"type":23,"value":7968},{"type":17,"tag":84,"props":10461,"children":10462},{},[10463],{"type":23,"value":8063},{"type":17,"tag":84,"props":10465,"children":10466},{},[10467],{"type":23,"value":8058},{"type":17,"tag":84,"props":10469,"children":10470},{},[10471],{"type":23,"value":7973},{"type":17,"tag":239,"props":10473,"children":10475},{"id":10474},"hybrid-infrastructure-oriented",[10476],{"type":23,"value":10477},"Hybrid / infrastructure-oriented",{"type":17,"tag":80,"props":10479,"children":10480},{},[10481,10485],{"type":17,"tag":84,"props":10482,"children":10483},{},[10484],{"type":23,"value":1025},{"type":17,"tag":84,"props":10486,"children":10487},{},[10488],{"type":23,"value":581},{"type":17,"tag":29,"props":10490,"children":10491},{},[10492],{"type":23,"value":10493},"This classification is more useful than feature lists. It tells you how the system behaves.",{"type":17,"tag":68,"props":10495,"children":10497},{"id":10496},"why-vendors-in-the-same-category-are-still-different",[10498],{"type":23,"value":10499},"Why vendors in the same category are still different",{"type":17,"tag":29,"props":10501,"children":10502},{},[10503],{"type":23,"value":10504},"Even within pass-through architectures, platforms are not interchangeable.",{"type":17,"tag":29,"props":10506,"children":10507},{},[10508],{"type":23,"value":10509},"They differ in:",{"type":17,"tag":80,"props":10511,"children":10512},{},[10513,10518,10523,10528,10533,10538,10543],{"type":17,"tag":84,"props":10514,"children":10515},{},[10516],{"type":23,"value":10517},"depth of schema coverage",{"type":17,"tag":84,"props":10519,"children":10520},{},[10521],{"type":23,"value":10522},"event delivery design",{"type":17,"tag":84,"props":10524,"children":10525},{},[10526],{"type":23,"value":10527},"support for custom fields and objects",{"type":17,"tag":84,"props":10529,"children":10530},{},[10531],{"type":23,"value":10532},"passthrough flexibility",{"type":17,"tag":84,"props":10534,"children":10535},{},[10536],{"type":23,"value":10537},"category breadth",{"type":17,"tag":84,"props":10539,"children":10540},{},[10541],{"type":23,"value":10542},"pricing model",{"type":17,"tag":84,"props":10544,"children":10545},{},[10546],{"type":23,"value":10547},"AI and agent support",{"type":17,"tag":29,"props":10549,"children":10550},{},[10551],{"type":23,"value":3258},{"type":17,"tag":80,"props":10553,"children":10554},{},[10555,10560],{"type":17,"tag":84,"props":10556,"children":10557},{},[10558],{"type":23,"value":10559},"Apideck focuses on providing a clean abstraction layer across common integration categories",{"type":17,"tag":84,"props":10561,"children":10562},{},[10563],{"type":23,"value":10564},"Unified.to extends the same architecture into real-time execution, event delivery, and multiple consumption patterns including webhooks and MCP",{"type":17,"tag":29,"props":10566,"children":10567},{},[10568],{"type":23,"value":10569},"The architecture defines the baseline. The product surface defines what you can build.",{"type":17,"tag":68,"props":10571,"children":10573},{"id":10572},"why-some-platforms-introduce-hybrid-models",[10574],{"type":17,"tag":48,"props":10575,"children":10576},{},[10577],{"type":23,"value":10578},"Why some platforms introduce hybrid models",{"type":17,"tag":29,"props":10580,"children":10581},{},[10582],{"type":23,"value":10583},"No single architecture optimizes for both real-time execution and high-volume querying.",{"type":17,"tag":29,"props":10585,"children":10586},{},[10587],{"type":23,"value":10588},"That's why some platforms introduce hybrid approaches that combine:",{"type":17,"tag":80,"props":10590,"children":10591},{},[10592,10597],{"type":17,"tag":84,"props":10593,"children":10594},{},[10595],{"type":23,"value":10596},"real-time API execution",{"type":17,"tag":84,"props":10598,"children":10599},{},[10600],{"type":23,"value":10601},"scheduled data storage",{"type":17,"tag":29,"props":10603,"children":10604},{},[10605],{"type":23,"value":10606},"This is typically done to support:",{"type":17,"tag":80,"props":10608,"children":10609},{},[10610,10615,10620],{"type":17,"tag":84,"props":10611,"children":10612},{},[10613],{"type":23,"value":10614},"analytics use cases",{"type":17,"tag":84,"props":10616,"children":10617},{},[10618],{"type":23,"value":10619},"repeated queries over large datasets",{"type":17,"tag":84,"props":10621,"children":10622},{},[10623],{"type":23,"value":10624},"historical reporting",{"type":17,"tag":239,"props":10626,"children":10628},{"id":10627},"the-tradeoff-hybrid-introduces",[10629],{"type":23,"value":10630},"The tradeoff hybrid introduces",{"type":17,"tag":29,"props":10632,"children":10633},{},[10634],{"type":23,"value":10635},"Hybrid models do not eliminate the tradeoffs. They combine them.",{"type":17,"tag":29,"props":10637,"children":10638},{},[10639],{"type":23,"value":10640},"In practice, this means:",{"type":17,"tag":80,"props":10642,"children":10643},{},[10644,10649],{"type":17,"tag":84,"props":10645,"children":10646},{},[10647],{"type":23,"value":10648},"part of your product runs on live data",{"type":17,"tag":84,"props":10650,"children":10651},{},[10652],{"type":23,"value":10653},"part of your product runs on stored data",{"type":17,"tag":29,"props":10655,"children":10656},{},[10657],{"type":23,"value":10658},"That creates two sources of truth.",{"type":17,"tag":29,"props":10660,"children":10661},{},[10662],{"type":23,"value":10663},"You now need to reason about:",{"type":17,"tag":80,"props":10665,"children":10666},{},[10667,10672,10677],{"type":17,"tag":84,"props":10668,"children":10669},{},[10670],{"type":23,"value":10671},"when data was last synced",{"type":17,"tag":84,"props":10673,"children":10674},{},[10675],{"type":23,"value":10676},"whether a response is live or stored",{"type":17,"tag":84,"props":10678,"children":10679},{},[10680],{"type":23,"value":10681},"how inconsistencies are handled",{"type":17,"tag":239,"props":10683,"children":10685},{"id":10684},"when-hybrid-makes-sense",[10686],{"type":23,"value":10687},"When hybrid makes sense",{"type":17,"tag":29,"props":10689,"children":10690},{},[10691],{"type":23,"value":10692},"Hybrid architectures are useful when:",{"type":17,"tag":80,"props":10694,"children":10695},{},[10696,10701,10706],{"type":17,"tag":84,"props":10697,"children":10698},{},[10699],{"type":23,"value":10700},"you are building reporting or analytics features",{"type":17,"tag":84,"props":10702,"children":10703},{},[10704],{"type":23,"value":10705},"you need to query large datasets repeatedly",{"type":17,"tag":84,"props":10707,"children":10708},{},[10709],{"type":23,"value":10710},"strict real-time behavior is not required across all features",{"type":17,"tag":239,"props":10712,"children":10714},{"id":10713},"when-hybrid-creates-problems",[10715],{"type":23,"value":10716},"When hybrid creates problems",{"type":17,"tag":29,"props":10718,"children":10719},{},[10720],{"type":23,"value":10721},"Hybrid becomes problematic when:",{"type":17,"tag":80,"props":10723,"children":10724},{},[10725,10730,10735],{"type":17,"tag":84,"props":10726,"children":10727},{},[10728],{"type":23,"value":10729},"your product depends on current state",{"type":17,"tag":84,"props":10731,"children":10732},{},[10733],{"type":23,"value":10734},"you are building automation or decision logic",{"type":17,"tag":84,"props":10736,"children":10737},{},[10738],{"type":23,"value":10739},"consistency between reads and writes matters",{"type":17,"tag":29,"props":10741,"children":10742},{},[10743],{"type":23,"value":10744},"In these cases, mixing stored and real-time data introduces edge cases that are difficult to debug.",{"type":17,"tag":239,"props":10746,"children":10748},{"id":10747},"what-most-product-teams-actually-need",[10749],{"type":23,"value":10750},"What most product teams actually need",{"type":17,"tag":29,"props":10752,"children":10753},{},[10754],{"type":23,"value":10755},"Most product-facing features depend on:",{"type":17,"tag":80,"props":10757,"children":10758},{},[10759,10764,10768],{"type":17,"tag":84,"props":10760,"children":10761},{},[10762],{"type":23,"value":10763},"current state",{"type":17,"tag":84,"props":10765,"children":10766},{},[10767],{"type":23,"value":10409},{"type":17,"tag":84,"props":10769,"children":10770},{},[10771],{"type":23,"value":10772},"immediate consistency after writes",{"type":17,"tag":29,"props":10774,"children":10775},{},[10776],{"type":23,"value":10777},"That aligns more directly with real-time execution models.",{"type":17,"tag":29,"props":10779,"children":10780},{},[10781],{"type":23,"value":10782},"Storage can still exist—but it should be:",{"type":17,"tag":80,"props":10784,"children":10785},{},[10786,10791,10796],{"type":17,"tag":84,"props":10787,"children":10788},{},[10789],{"type":23,"value":10790},"intentional",{"type":17,"tag":84,"props":10792,"children":10793},{},[10794],{"type":23,"value":10795},"controlled",{"type":17,"tag":84,"props":10797,"children":10798},{},[10799],{"type":23,"value":10800},"separate from your integration execution layer",{"type":17,"tag":68,"props":10802,"children":10804},{"id":10803},"how-to-choose-the-right-architecture",[10805],{"type":23,"value":10806},"How to choose the right architecture",{"type":17,"tag":239,"props":10808,"children":10810},{"id":10809},"choose-pass-through-if",[10811],{"type":23,"value":10812},"Choose pass-through if:",{"type":17,"tag":80,"props":10814,"children":10815},{},[10816,10820,10825,10830,10835],{"type":17,"tag":84,"props":10817,"children":10818},{},[10819],{"type":23,"value":10729},{"type":17,"tag":84,"props":10821,"children":10822},{},[10823],{"type":23,"value":10824},"you are building workflows or automation",{"type":17,"tag":84,"props":10826,"children":10827},{},[10828],{"type":23,"value":10829},"read-after-write consistency matters",{"type":17,"tag":84,"props":10831,"children":10832},{},[10833],{"type":23,"value":10834},"you are building AI features",{"type":17,"tag":84,"props":10836,"children":10837},{},[10838],{"type":23,"value":10839},"you want to reduce compliance scope",{"type":17,"tag":239,"props":10841,"children":10843},{"id":10842},"choose-sync-based-if",[10844],{"type":23,"value":10845},"Choose sync-based if:",{"type":17,"tag":80,"props":10847,"children":10848},{},[10849,10854,10859,10864],{"type":17,"tag":84,"props":10850,"children":10851},{},[10852],{"type":23,"value":10853},"you need fast repeated reads",{"type":17,"tag":84,"props":10855,"children":10856},{},[10857],{"type":23,"value":10858},"you are building dashboards or reporting",{"type":17,"tag":84,"props":10860,"children":10861},{},[10862],{"type":23,"value":10863},"some data staleness is acceptable",{"type":17,"tag":84,"props":10865,"children":10866},{},[10867],{"type":23,"value":10868},"you want insulation from upstream outages",{"type":17,"tag":239,"props":10870,"children":10872},{"id":10871},"choose-hybrid-if",[10873],{"type":23,"value":10874},"Choose hybrid if:",{"type":17,"tag":80,"props":10876,"children":10877},{},[10878,10883],{"type":17,"tag":84,"props":10879,"children":10880},{},[10881],{"type":23,"value":10882},"you need both real-time accuracy and high-volume querying",{"type":17,"tag":84,"props":10884,"children":10885},{},[10886],{"type":23,"value":10887},"you want execution and storage separated",{"type":17,"tag":68,"props":10889,"children":10891},{"id":10890},"building-with-a-real-time-execution-model",[10892],{"type":23,"value":10893},"Building with a real-time execution model",{"type":17,"tag":29,"props":10895,"children":10896},{},[10897],{"type":23,"value":10898},"Unified.to is built around the pass-through model, with extensions that address the limitations teams typically encounter.",{"type":17,"tag":80,"props":10900,"children":10901},{},[10902,10907,10912,10917,10922,10927],{"type":17,"tag":84,"props":10903,"children":10904},{},[10905],{"type":23,"value":10906},"requests are routed directly to source APIs in real time",{"type":17,"tag":84,"props":10908,"children":10909},{},[10910],{"type":23,"value":10911},"no customer data is stored at rest",{"type":17,"tag":84,"props":10913,"children":10914},{},[10915],{"type":23,"value":10916},"native and virtual webhooks enable event-driven behavior",{"type":17,"tag":84,"props":10918,"children":10919},{},[10920],{"type":23,"value":10921},"custom fields and objects are supported without schema lock-in",{"type":17,"tag":84,"props":10923,"children":10924},{},[10925],{"type":23,"value":10926},"passthrough allows direct access to provider-specific endpoints",{"type":17,"tag":84,"props":10928,"children":10929},{},[10930],{"type":23,"value":10931},"the same models power API, webhooks, database sync, and MCP",{"type":17,"tag":29,"props":10933,"children":10934},{},[10935],{"type":23,"value":10936},"This architecture supports:",{"type":17,"tag":80,"props":10938,"children":10939},{},[10940,10945,10950],{"type":17,"tag":84,"props":10941,"children":10942},{},[10943],{"type":23,"value":10944},"real-time product behavior",{"type":17,"tag":84,"props":10946,"children":10947},{},[10948],{"type":23,"value":10949},"automation workflows",{"type":17,"tag":84,"props":10951,"children":10952},{},[10953],{"type":23,"value":10954},"AI-driven systems",{"type":17,"tag":29,"props":10956,"children":10957},{},[10958],{"type":23,"value":10959},"without introducing a secondary data layer.",{"type":17,"tag":68,"props":10961,"children":10962},{"id":7672},[10963],{"type":23,"value":7675},{"type":17,"tag":80,"props":10965,"children":10966},{},[10967,10972,10977,10982,10987,10992],{"type":17,"tag":84,"props":10968,"children":10969},{},[10970],{"type":23,"value":10971},"Pass-through unified APIs execute requests directly against source systems in real time",{"type":17,"tag":84,"props":10973,"children":10974},{},[10975],{"type":23,"value":10976},"Sync-based unified APIs serve data from stored replicas",{"type":17,"tag":84,"props":10978,"children":10979},{},[10980],{"type":23,"value":10981},"The tradeoff is accuracy versus cached performance",{"type":17,"tag":84,"props":10983,"children":10984},{},[10985],{"type":23,"value":10986},"Pass-through is better for workflows, automation, and AI",{"type":17,"tag":84,"props":10988,"children":10989},{},[10990],{"type":23,"value":10991},"Sync-based is better for analytics and high-volume querying",{"type":17,"tag":84,"props":10993,"children":10994},{},[10995],{"type":23,"value":10996},"Most teams will need elements of both, but should be deliberate about where data is stored and why",{"type":17,"tag":29,"props":10998,"children":10999},{},[11000],{"type":23,"value":11001},"This decision shapes how your product behaves in production. Choose the model that aligns with what your product actually needs to do.",{"type":17,"tag":29,"props":11003,"children":11004},{},[11005,11006],{"type":23,"value":1609},{"type":17,"tag":133,"props":11007,"children":11009},{"href":1612,"rel":11008},[214],[11010],{"type":23,"value":1616},{"type":17,"tag":29,"props":11012,"children":11013},{},[11014,11015],{"type":23,"value":1609},{"type":17,"tag":133,"props":11016,"children":11018},{"href":1623,"rel":11017},[214],[11019],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":11021},[11022,11023,11026,11029,11030,11038,11043,11044,11050,11055,11056],{"id":7034,"depth":1629,"text":7037},{"id":9691,"depth":1629,"text":9694,"children":11024},[11025],{"id":9745,"depth":1635,"text":9748},{"id":9792,"depth":1629,"text":9795,"children":11027},[11028],{"id":9836,"depth":1635,"text":9748},{"id":9887,"depth":1629,"text":9890},{"id":10115,"depth":1629,"text":10118,"children":11031},[11032,11033,11034,11035,11036,11037],{"id":10121,"depth":1635,"text":10124},{"id":10142,"depth":1635,"text":9996},{"id":10220,"depth":1635,"text":10223},{"id":10259,"depth":1635,"text":10262},{"id":10316,"depth":1635,"text":10319},{"id":10355,"depth":1635,"text":10358},{"id":10417,"depth":1629,"text":10420,"children":11039},[11040,11041,11042],{"id":10428,"depth":1635,"text":10431},{"id":10449,"depth":1635,"text":10452},{"id":10474,"depth":1635,"text":10477},{"id":10496,"depth":1629,"text":10499},{"id":10572,"depth":1629,"text":10578,"children":11045},[11046,11047,11048,11049],{"id":10627,"depth":1635,"text":10630},{"id":10684,"depth":1635,"text":10687},{"id":10713,"depth":1635,"text":10716},{"id":10747,"depth":1635,"text":10750},{"id":10803,"depth":1629,"text":10806,"children":11051},[11052,11053,11054],{"id":10809,"depth":1635,"text":10812},{"id":10842,"depth":1635,"text":10845},{"id":10871,"depth":1635,"text":10874},{"id":10890,"depth":1629,"text":10893},{"id":7672,"depth":1629,"text":7675},"content:blog:pass_through_vs_sync_based_unified_apis_architecture_tradeoffs_explained.md","blog/pass_through_vs_sync_based_unified_apis_architecture_tradeoffs_explained.md","blog/pass_through_vs_sync_based_unified_apis_architecture_tradeoffs_explained",{"_path":11061,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":11062,"description":11063,"img":11064,"date":11065,"tag":12,"body":11066,"_type":1677,"_id":12509,"_source":1679,"_file":12510,"_stem":12511,"_extension":1682},"/blog/march_2026_product_update","March 2026 product update","In March, we introduced Commerce support for booking use cases with Availability and Reservation objects, expanded our Advertising API with Target and Promoted...","https://s3.us-east-2.amazonaws.com/unified-article-images/march_2026_product_update-icon.png","2026-03-28T16:06:00.000Z",{"type":14,"children":11067,"toc":12465},[11068,11073,11076,11084,11097,11114,11120,11133,11146,11151,11157,11210,11216,11224,11230,11255,11261,11274,11279,11290,11296,11301,11307,11320,11325,11388,11394,11412,11417,11430,11436,11441,11469,11475,11493,11499,11529,11537,11548,11557,11566,11572,11584,11589,11610,11615,11627,11633,11639,11674,11680,11713,11719,11732,11738,11751,11757,11770,11779,11784,11795,11801,11807,11865,11871,11917,11923,11990,11995,12001,12007,12014,12020,12064,12070,12075,12080,12108,12113,12126,12132,12137,12143,12307,12313,12332,12338,12350,12356,12361,12394,12400,12405,12433,12437,12442,12447,12456],{"type":17,"tag":18,"props":11069,"children":11071},{"id":11070},"march-2026-product-update",[11072],{"type":23,"value":11062},{"type":17,"tag":25,"props":11074,"children":11075},{},[],{"type":17,"tag":29,"props":11077,"children":11078},{},[11079],{"type":17,"tag":33,"props":11080,"children":11081},{},[11082],{"type":23,"value":11083},"March 28, 2026",{"type":17,"tag":29,"props":11085,"children":11086},{},[11087,11089,11095],{"type":23,"value":11088},"In March, we introduced Commerce support for booking use cases with Availability and Reservation objects, expanded our ",{"type":17,"tag":133,"props":11090,"children":11092},{"href":11091},"/ads",[11093],{"type":23,"value":11094},"Advertising API",{"type":23,"value":11096}," with Target and Promoted objects across major ad integrations, launched the Unified CLI, and added a new set of integrations across HR, payments, ATS, and commerce.",{"type":17,"tag":29,"props":11098,"children":11099},{},[11100,11102,11106,11108,11112],{"type":23,"value":11101},"We also continued expanding object coverage, methods, ",{"type":17,"tag":133,"props":11103,"children":11104},{"href":4999},[11105],{"type":23,"value":5002},{"type":23,"value":11107},", writable fields, and ",{"type":17,"tag":133,"props":11109,"children":11110},{"href":1857},[11111],{"type":23,"value":1860},{"type":23,"value":11113}," across CRM, finance, call center, and marketing integrations.",{"type":17,"tag":68,"props":11115,"children":11117},{"id":11116},"commerce-api-booking-with-availability-and-reservation",[11118],{"type":23,"value":11119},"Commerce API: booking with Availability and Reservation",{"type":17,"tag":29,"props":11121,"children":11122},{},[11123,11125,11131],{"type":23,"value":11124},"We introduced new ",{"type":17,"tag":133,"props":11126,"children":11128},{"href":11127},"/3316207b83848062afe5e6b1134f6857",[11129],{"type":23,"value":11130},"Commerce objects",{"type":23,"value":11132}," to support booking and reservation workflows inside SaaS products:",{"type":17,"tag":80,"props":11134,"children":11135},{},[11136,11141],{"type":17,"tag":84,"props":11137,"children":11138},{},[11139],{"type":23,"value":11140},"Availability",{"type":17,"tag":84,"props":11142,"children":11143},{},[11144],{"type":23,"value":11145},"Reservation",{"type":17,"tag":29,"props":11147,"children":11148},{},[11149],{"type":23,"value":11150},"These objects are designed for use cases like restaurant and salon booking, where products need to search locations, retrieve available time slots, and create reservations directly within their UI.",{"type":17,"tag":239,"props":11152,"children":11154},{"id":11153},"new-booking-integrations",[11155],{"type":23,"value":11156},"New booking integrations",{"type":17,"tag":80,"props":11158,"children":11159},{},[11160,11170,11180,11190,11200],{"type":17,"tag":84,"props":11161,"children":11162},{},[11163],{"type":17,"tag":133,"props":11164,"children":11167},{"href":11165,"rel":11166},"https://unified.to/integrations/opentable",[214],[11168],{"type":23,"value":11169},"OpenTable",{"type":17,"tag":84,"props":11171,"children":11172},{},[11173],{"type":17,"tag":133,"props":11174,"children":11177},{"href":11175,"rel":11176},"https://unified.to/integrations/yelp",[214],[11178],{"type":23,"value":11179},"Yelp",{"type":17,"tag":84,"props":11181,"children":11182},{},[11183],{"type":17,"tag":133,"props":11184,"children":11187},{"href":11185,"rel":11186},"https://unified.to/integrations/sevenrooms",[214],[11188],{"type":23,"value":11189},"SevenRooms",{"type":17,"tag":84,"props":11191,"children":11192},{},[11193],{"type":17,"tag":133,"props":11194,"children":11197},{"href":11195,"rel":11196},"https://unified.to/integrations/squareup",[214],[11198],{"type":23,"value":11199},"SquareUp",{"type":17,"tag":84,"props":11201,"children":11202},{},[11203],{"type":17,"tag":133,"props":11204,"children":11207},{"href":11205,"rel":11206},"https://unified.to/integrations/resos",[214],[11208],{"type":23,"value":11209},"resOS",{"type":17,"tag":239,"props":11211,"children":11213},{"id":11212},"expanded-support",[11214],{"type":23,"value":11215},"Expanded support",{"type":17,"tag":80,"props":11217,"children":11218},{},[11219],{"type":17,"tag":84,"props":11220,"children":11221},{},[11222],{"type":23,"value":11223},"Square (existing Commerce integration)",{"type":17,"tag":239,"props":11225,"children":11227},{"id":11226},"method-coverage",[11228],{"type":23,"value":11229},"Method coverage",{"type":17,"tag":80,"props":11231,"children":11232},{},[11233,11244],{"type":17,"tag":84,"props":11234,"children":11235},{},[11236,11238],{"type":23,"value":11237},"Square Availability: ",{"type":17,"tag":6121,"props":11239,"children":11241},{"className":11240},[],[11242],{"type":23,"value":11243},"list",{"type":17,"tag":84,"props":11245,"children":11246},{},[11247,11249],{"type":23,"value":11248},"Square Reservation: ",{"type":17,"tag":6121,"props":11250,"children":11252},{"className":11251},[],[11253],{"type":23,"value":11254},"create",{"type":17,"tag":239,"props":11256,"children":11258},{"id":11257},"related-object-expansion",[11259],{"type":23,"value":11260},"Related object expansion",{"type":17,"tag":80,"props":11262,"children":11263},{},[11264,11269],{"type":17,"tag":84,"props":11265,"children":11266},{},[11267],{"type":23,"value":11268},"Commerce Location expanded for booking use cases",{"type":17,"tag":84,"props":11270,"children":11271},{},[11272],{"type":23,"value":11273},"Commerce Review expanded for booking-related context",{"type":17,"tag":29,"props":11275,"children":11276},{},[11277],{"type":23,"value":11278},"This allows teams to build booking flows across multiple commerce integrations using a consistent set of objects and API calls.",{"type":17,"tag":29,"props":11280,"children":11281},{},[11282,11283],{"type":23,"value":1609},{"type":17,"tag":133,"props":11284,"children":11287},{"href":11285,"rel":11286},"https://unified.to/blog/how_to_build_booking_into_your_product_across_opentable_yelp_sevenrooms_and_resos",[214],[11288],{"type":23,"value":11289},"How to Build Booking Into Your Product Across OpenTable, Yelp, SevenRooms, and resOS",{"type":17,"tag":68,"props":11291,"children":11293},{"id":11292},"advertising-api-targeting-promoted-entities-and-campaign-depth",[11294],{"type":23,"value":11295},"Advertising API: targeting, promoted entities, and campaign depth",{"type":17,"tag":29,"props":11297,"children":11298},{},[11299],{"type":23,"value":11300},"March significantly expanded support for campaign configuration across advertising integrations, with a focus on targeting and promoted entities.",{"type":17,"tag":239,"props":11302,"children":11304},{"id":11303},"new-objects",[11305],{"type":23,"value":11306},"New objects",{"type":17,"tag":80,"props":11308,"children":11309},{},[11310,11315],{"type":17,"tag":84,"props":11311,"children":11312},{},[11313],{"type":23,"value":11314},"Target",{"type":17,"tag":84,"props":11316,"children":11317},{},[11318],{"type":23,"value":11319},"Promoted",{"type":17,"tag":29,"props":11321,"children":11322},{},[11323],{"type":23,"value":11324},"Added across:",{"type":17,"tag":80,"props":11326,"children":11327},{},[11328,11333,11338,11343,11348,11353,11358,11363,11368,11373,11378,11383],{"type":17,"tag":84,"props":11329,"children":11330},{},[11331],{"type":23,"value":11332},"Meta Ads",{"type":17,"tag":84,"props":11334,"children":11335},{},[11336],{"type":23,"value":11337},"Google Ads",{"type":17,"tag":84,"props":11339,"children":11340},{},[11341],{"type":23,"value":11342},"Google Display & Video 360",{"type":17,"tag":84,"props":11344,"children":11345},{},[11346],{"type":23,"value":11347},"Amazon Advertising",{"type":17,"tag":84,"props":11349,"children":11350},{},[11351],{"type":23,"value":11352},"X Ads",{"type":17,"tag":84,"props":11354,"children":11355},{},[11356],{"type":23,"value":11357},"LinkedIn",{"type":17,"tag":84,"props":11359,"children":11360},{},[11361],{"type":23,"value":11362},"TikTok Ads",{"type":17,"tag":84,"props":11364,"children":11365},{},[11366],{"type":23,"value":11367},"Snapchat",{"type":17,"tag":84,"props":11369,"children":11370},{},[11371],{"type":23,"value":11372},"Reddit Ads",{"type":17,"tag":84,"props":11374,"children":11375},{},[11376],{"type":23,"value":11377},"Pinterest Ads",{"type":17,"tag":84,"props":11379,"children":11380},{},[11381],{"type":23,"value":11382},"Microsoft Advertising",{"type":17,"tag":84,"props":11384,"children":11385},{},[11386],{"type":23,"value":11387},"The Trade Desk",{"type":17,"tag":239,"props":11389,"children":11391},{"id":11390},"what-this-enables",[11392],{"type":23,"value":11393},"What this enables",{"type":17,"tag":80,"props":11395,"children":11396},{},[11397,11402,11407],{"type":17,"tag":84,"props":11398,"children":11399},{},[11400],{"type":23,"value":11401},"Lookup and use targeting options (countries, regions, interests, audiences)",{"type":17,"tag":84,"props":11403,"children":11404},{},[11405],{"type":23,"value":11406},"Specify promoted entities (pages, products, tweets, ad group types)",{"type":17,"tag":84,"props":11408,"children":11409},{},[11410],{"type":23,"value":11411},"Build campaign and ad group configurations consistently across integrations",{"type":17,"tag":239,"props":11413,"children":11415},{"id":11414},"method-coverage-1",[11416],{"type":23,"value":11229},{"type":17,"tag":80,"props":11418,"children":11419},{},[11420,11425],{"type":17,"tag":84,"props":11421,"children":11422},{},[11423],{"type":23,"value":11424},"List support across Target and Promoted for most integrations",{"type":17,"tag":84,"props":11426,"children":11427},{},[11428],{"type":23,"value":11429},"Amazon Advertising: list and remove for Target and Promoted",{"type":17,"tag":239,"props":11431,"children":11433},{"id":11432},"field-expansions",[11434],{"type":23,"value":11435},"Field expansions",{"type":17,"tag":29,"props":11437,"children":11438},{},[11439],{"type":23,"value":11440},"We expanded readable and writable fields across campaign, group, ad, and creative objects, including:",{"type":17,"tag":80,"props":11442,"children":11443},{},[11444,11449,11454,11459,11464],{"type":17,"tag":84,"props":11445,"children":11446},{},[11447],{"type":23,"value":11448},"targeting configuration",{"type":17,"tag":84,"props":11450,"children":11451},{},[11452],{"type":23,"value":11453},"promoted entity fields",{"type":17,"tag":84,"props":11455,"children":11456},{},[11457],{"type":23,"value":11458},"campaign category and channel fields",{"type":17,"tag":84,"props":11460,"children":11461},{},[11462],{"type":23,"value":11463},"budget, billing event, and optimization fields",{"type":17,"tag":84,"props":11465,"children":11466},{},[11467],{"type":23,"value":11468},"creative fields (title, link_url, body, CTA, asset URLs)",{"type":17,"tag":239,"props":11470,"children":11472},{"id":11471},"webhooks-and-pagination",[11473],{"type":23,"value":11474},"Webhooks and pagination",{"type":17,"tag":80,"props":11476,"children":11477},{},[11478,11483,11488],{"type":17,"tag":84,"props":11479,"children":11480},{},[11481],{"type":23,"value":11482},"Meta Ads: created/updated virtual webhooks for Target",{"type":17,"tag":84,"props":11484,"children":11485},{},[11486],{"type":23,"value":11487},"Google Display & Video 360: created/updated virtual webhooks for Organization, Campaign, Creative, Group, and Insertionorder",{"type":17,"tag":84,"props":11489,"children":11490},{},[11491],{"type":23,"value":11492},"Expanded filtering and pagination across DV360 objects",{"type":17,"tag":239,"props":11494,"children":11496},{"id":11495},"targeting-callout",[11497],{"type":23,"value":11498},"Targeting callout",{"type":17,"tag":80,"props":11500,"children":11501},{},[11502,11513,11524],{"type":17,"tag":84,"props":11503,"children":11504},{},[11505,11511],{"type":17,"tag":6121,"props":11506,"children":11508},{"className":11507},[],[11509],{"type":23,"value":11510},"ads_target",{"type":23,"value":11512}," supports lookup of valid targeting IDs",{"type":17,"tag":84,"props":11514,"children":11515},{},[11516,11522],{"type":17,"tag":6121,"props":11517,"children":11519},{"className":11518},[],[11520],{"type":23,"value":11521},"promoted",{"type":23,"value":11523}," specifies entities used when creating campaigns, groups, and ads",{"type":17,"tag":84,"props":11525,"children":11526},{},[11527],{"type":23,"value":11528},"Enables consistent campaign creation across ad integrations with different naming and structures",{"type":17,"tag":29,"props":11530,"children":11531},{},[11532],{"type":17,"tag":48,"props":11533,"children":11534},{},[11535],{"type":23,"value":11536},"From the blog",{"type":17,"tag":29,"props":11538,"children":11539},{},[11540,11541],{"type":23,"value":1609},{"type":17,"tag":133,"props":11542,"children":11545},{"href":11543,"rel":11544},"https://unified.to/blog/creating_ads_using_the_unified_ads_api",[214],[11546],{"type":23,"value":11547},"Creating Ads using the Unified Ads API",{"type":17,"tag":29,"props":11549,"children":11550},{},[11551,11552],{"type":23,"value":1609},{"type":17,"tag":133,"props":11553,"children":11554},{"href":11127},[11555],{"type":23,"value":11556},"How to Build an Advertising Dashboard Across Multiple Platforms Using a Unified Advertising API",{"type":17,"tag":29,"props":11558,"children":11559},{},[11560,11561],{"type":23,"value":1609},{"type":17,"tag":133,"props":11562,"children":11563},{"href":11127},[11564],{"type":23,"value":11565},"How to Build Cross-Platform Ad Targeting (Lookup, Mapping, and Campaign Creation)",{"type":17,"tag":68,"props":11567,"children":11569},{"id":11568},"new-unified-cli",[11570],{"type":23,"value":11571},"New: Unified CLI",{"type":17,"tag":29,"props":11573,"children":11574},{},[11575,11577,11582],{"type":23,"value":11576},"We launched the ",{"type":17,"tag":133,"props":11578,"children":11579},{"href":11127},[11580],{"type":23,"value":11581},"Unified CLI",{"type":23,"value":11583},", allowing customers to call Unified directly from a command-line interface.",{"type":17,"tag":29,"props":11585,"children":11586},{},[11587],{"type":23,"value":11588},"This adds another access pattern alongside:",{"type":17,"tag":80,"props":11590,"children":11591},{},[11592,11597,11601,11605],{"type":17,"tag":84,"props":11593,"children":11594},{},[11595],{"type":23,"value":11596},"REST API",{"type":17,"tag":84,"props":11598,"children":11599},{},[11600],{"type":23,"value":5002},{"type":17,"tag":84,"props":11602,"children":11603},{},[11604],{"type":23,"value":329},{"type":17,"tag":84,"props":11606,"children":11607},{},[11608],{"type":23,"value":11609},"CLI",{"type":17,"tag":29,"props":11611,"children":11612},{},[11613],{"type":23,"value":11614},"The CLI is particularly relevant for local AI execution environments like Claude Code and Perplexity Computer, where command-line access can be used instead of MCP depending on the architecture.",{"type":17,"tag":11616,"props":11617,"children":11626},"iframe",{"width":11618,"height":11619,"src":11620,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},560,315,"https://www.youtube.com/embed/LUachJM0N4Q","YouTube video player","0","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share","strict-origin-when-cross-origin",true,[],{"type":17,"tag":68,"props":11628,"children":11630},{"id":11629},"new-integrations",[11631],{"type":23,"value":11632},"New integrations",{"type":17,"tag":239,"props":11634,"children":11636},{"id":11635},"commerce",[11637],{"type":23,"value":11638},"Commerce",{"type":17,"tag":80,"props":11640,"children":11641},{},[11642,11650,11658,11666],{"type":17,"tag":84,"props":11643,"children":11644},{},[11645],{"type":17,"tag":133,"props":11646,"children":11648},{"href":11165,"rel":11647},[214],[11649],{"type":23,"value":11169},{"type":17,"tag":84,"props":11651,"children":11652},{},[11653],{"type":17,"tag":133,"props":11654,"children":11656},{"href":11175,"rel":11655},[214],[11657],{"type":23,"value":11179},{"type":17,"tag":84,"props":11659,"children":11660},{},[11661],{"type":17,"tag":133,"props":11662,"children":11664},{"href":11185,"rel":11663},[214],[11665],{"type":23,"value":11189},{"type":17,"tag":84,"props":11667,"children":11668},{},[11669],{"type":17,"tag":133,"props":11670,"children":11672},{"href":11205,"rel":11671},[214],[11673],{"type":23,"value":11209},{"type":17,"tag":239,"props":11675,"children":11677},{"id":11676},"hr-directory",[11678],{"type":23,"value":11679},"HR & Directory",{"type":17,"tag":80,"props":11681,"children":11682},{},[11683,11693,11703],{"type":17,"tag":84,"props":11684,"children":11685},{},[11686],{"type":17,"tag":133,"props":11687,"children":11690},{"href":11688,"rel":11689},"https://unified.to/integrations/ujet",[214],[11691],{"type":23,"value":11692},"Ujet",{"type":17,"tag":84,"props":11694,"children":11695},{},[11696],{"type":17,"tag":133,"props":11697,"children":11700},{"href":11698,"rel":11699},"https://unified.to/integrations/sapfieldglass",[214],[11701],{"type":23,"value":11702},"SAP Fieldglass",{"type":17,"tag":84,"props":11704,"children":11705},{},[11706],{"type":17,"tag":133,"props":11707,"children":11710},{"href":11708,"rel":11709},"https://unified.to/integrations/shapes",[214],[11711],{"type":23,"value":11712},"Shapes",{"type":17,"tag":239,"props":11714,"children":11716},{"id":11715},"marketing",[11717],{"type":23,"value":11718},"Marketing",{"type":17,"tag":80,"props":11720,"children":11721},{},[11722],{"type":17,"tag":84,"props":11723,"children":11724},{},[11725],{"type":17,"tag":133,"props":11726,"children":11729},{"href":11727,"rel":11728},"https://unified.to/integrations/yotpodeveloper",[214],[11730],{"type":23,"value":11731},"Yotpo",{"type":17,"tag":239,"props":11733,"children":11735},{"id":11734},"payments",[11736],{"type":23,"value":11737},"Payments",{"type":17,"tag":80,"props":11739,"children":11740},{},[11741],{"type":17,"tag":84,"props":11742,"children":11743},{},[11744],{"type":17,"tag":133,"props":11745,"children":11748},{"href":11746,"rel":11747},"https://unified.to/integrations/adyen",[214],[11749],{"type":23,"value":11750},"Adyen",{"type":17,"tag":239,"props":11752,"children":11754},{"id":11753},"ats",[11755],{"type":23,"value":11756},"ATS",{"type":17,"tag":80,"props":11758,"children":11759},{},[11760],{"type":17,"tag":84,"props":11761,"children":11762},{},[11763],{"type":17,"tag":133,"props":11764,"children":11767},{"href":11765,"rel":11766},"https://unified.to/integrations/carerix",[214],[11768],{"type":23,"value":11769},"Carerix",{"type":17,"tag":68,"props":11771,"children":11773},{"id":11772},"how-we-prioritize-what-we-ship-each-month",[11774],{"type":17,"tag":48,"props":11775,"children":11776},{},[11777],{"type":23,"value":11778},"How we prioritize what we ship each month",{"type":17,"tag":29,"props":11780,"children":11781},{},[11782],{"type":23,"value":11783},"Our roadmap balances strategic expansion into new use cases with customer-driven development across existing integrations. We prioritize blockers, customer demand, and high-impact features first, with delivery speed enabled by our architecture.",{"type":17,"tag":29,"props":11785,"children":11786},{},[11787,11788],{"type":23,"value":1609},{"type":17,"tag":133,"props":11789,"children":11792},{"href":11790,"rel":11791},"https://unified.to/blog/how_unified_prioritizes_new_features",[214],[11793],{"type":23,"value":11794},"How Unified Prioritizes New Features",{"type":17,"tag":68,"props":11796,"children":11798},{"id":11797},"crm-and-finance-depth",[11799],{"type":23,"value":11800},"CRM and finance depth",{"type":17,"tag":239,"props":11802,"children":11804},{"id":11803},"zoho-crm-metadata",[11805],{"type":23,"value":11806},"Zoho CRM: Metadata",{"type":17,"tag":80,"props":11808,"children":11809},{},[11810,11815,11855,11860],{"type":17,"tag":84,"props":11811,"children":11812},{},[11813],{"type":23,"value":11814},"Added Metadata object",{"type":17,"tag":84,"props":11816,"children":11817},{},[11818,11820,11825,11827,11833,11834,11839,11840,11846,11847,11853],{"type":23,"value":11819},"Added ",{"type":17,"tag":6121,"props":11821,"children":11823},{"className":11822},[],[11824],{"type":23,"value":11243},{"type":23,"value":11826},", ",{"type":17,"tag":6121,"props":11828,"children":11830},{"className":11829},[],[11831],{"type":23,"value":11832},"get",{"type":23,"value":11826},{"type":17,"tag":6121,"props":11835,"children":11837},{"className":11836},[],[11838],{"type":23,"value":11254},{"type":23,"value":11826},{"type":17,"tag":6121,"props":11841,"children":11843},{"className":11842},[],[11844],{"type":23,"value":11845},"update",{"type":23,"value":11826},{"type":17,"tag":6121,"props":11848,"children":11850},{"className":11849},[],[11851],{"type":23,"value":11852},"remove",{"type":23,"value":11854}," methods",{"type":17,"tag":84,"props":11856,"children":11857},{},[11858],{"type":23,"value":11859},"Expanded metadata readable and writable fields across Lead, Company, Contact, and Deal",{"type":17,"tag":84,"props":11861,"children":11862},{},[11863],{"type":23,"value":11864},"Added slow_fields pagination support",{"type":17,"tag":239,"props":11866,"children":11868},{"id":11867},"pipedrive-metadata",[11869],{"type":23,"value":11870},"Pipedrive: Metadata",{"type":17,"tag":80,"props":11872,"children":11873},{},[11874,11878,11912],{"type":17,"tag":84,"props":11875,"children":11876},{},[11877],{"type":23,"value":11814},{"type":17,"tag":84,"props":11879,"children":11880},{},[11881,11882,11887,11888,11893,11894,11899,11900,11905,11906,11911],{"type":23,"value":11819},{"type":17,"tag":6121,"props":11883,"children":11885},{"className":11884},[],[11886],{"type":23,"value":11243},{"type":23,"value":11826},{"type":17,"tag":6121,"props":11889,"children":11891},{"className":11890},[],[11892],{"type":23,"value":11832},{"type":23,"value":11826},{"type":17,"tag":6121,"props":11895,"children":11897},{"className":11896},[],[11898],{"type":23,"value":11254},{"type":23,"value":11826},{"type":17,"tag":6121,"props":11901,"children":11903},{"className":11902},[],[11904],{"type":23,"value":11845},{"type":23,"value":11826},{"type":17,"tag":6121,"props":11907,"children":11909},{"className":11908},[],[11910],{"type":23,"value":11852},{"type":23,"value":11854},{"type":17,"tag":84,"props":11913,"children":11914},{},[11915],{"type":23,"value":11916},"Added metadata readable and writable fields across Company, Contact, Lead, and Deal",{"type":17,"tag":239,"props":11918,"children":11920},{"id":11919},"zoho-books-transaction-and-accounting-depth",[11921],{"type":23,"value":11922},"Zoho Books: Transaction and accounting depth",{"type":17,"tag":80,"props":11924,"children":11925},{},[11926,11931,11954,11965,11970],{"type":17,"tag":84,"props":11927,"children":11928},{},[11929],{"type":23,"value":11930},"Added Transaction object",{"type":17,"tag":84,"props":11932,"children":11933},{},[11934,11935,11940,11941,11946,11947,11952],{"type":23,"value":11819},{"type":17,"tag":6121,"props":11936,"children":11938},{"className":11937},[],[11939],{"type":23,"value":11243},{"type":23,"value":11826},{"type":17,"tag":6121,"props":11942,"children":11944},{"className":11943},[],[11945],{"type":23,"value":11832},{"type":23,"value":11826},{"type":17,"tag":6121,"props":11948,"children":11950},{"className":11949},[],[11951],{"type":23,"value":11852},{"type":23,"value":11953}," methods for Transaction",{"type":17,"tag":84,"props":11955,"children":11956},{},[11957,11958,11963],{"type":23,"value":11819},{"type":17,"tag":6121,"props":11959,"children":11961},{"className":11960},[],[11962],{"type":23,"value":11254},{"type":23,"value":11964}," for Account",{"type":17,"tag":84,"props":11966,"children":11967},{},[11968],{"type":23,"value":11969},"Expanded writable fields across Account, Contact, Invoice, and Expense",{"type":17,"tag":84,"props":11971,"children":11972},{},[11973,11975,11981,11982,11988],{"type":23,"value":11974},"Added org-aware pagination (",{"type":17,"tag":6121,"props":11976,"children":11978},{"className":11977},[],[11979],{"type":23,"value":11980},"org_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":11983,"children":11985},{"className":11984},[],[11986],{"type":23,"value":11987},"virtual_webhook_org_id",{"type":23,"value":11989},") across many objects",{"type":17,"tag":29,"props":11991,"children":11992},{},[11993],{"type":23,"value":11994},"This improves support for custom fields, provider-specific fields, and multi-organization accounting use cases.",{"type":17,"tag":68,"props":11996,"children":11998},{"id":11997},"call-center-and-voice-integrations",[11999],{"type":23,"value":12000},"Call Center and voice integrations",{"type":17,"tag":239,"props":12002,"children":12004},{"id":12003},"new-integration",[12005],{"type":23,"value":12006},"New integration",{"type":17,"tag":80,"props":12008,"children":12009},{},[12010],{"type":17,"tag":84,"props":12011,"children":12012},{},[12013],{"type":23,"value":11692},{"type":17,"tag":239,"props":12015,"children":12017},{"id":12016},"new-objects-and-methods",[12018],{"type":23,"value":12019},"New objects and methods",{"type":17,"tag":80,"props":12021,"children":12022},{},[12023,12035,12052],{"type":17,"tag":84,"props":12024,"children":12025},{},[12026,12028,12033],{"type":23,"value":12027},"8x8 Contact Center: Employee object (",{"type":17,"tag":6121,"props":12029,"children":12031},{"className":12030},[],[12032],{"type":23,"value":11243},{"type":23,"value":12034},")",{"type":17,"tag":84,"props":12036,"children":12037},{},[12038,12040,12045,12046,12051],{"type":23,"value":12039},"JustCall: Employee and Group objects (",{"type":17,"tag":6121,"props":12041,"children":12043},{"className":12042},[],[12044],{"type":23,"value":11243},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12047,"children":12049},{"className":12048},[],[12050],{"type":23,"value":11832},{"type":23,"value":12034},{"type":17,"tag":84,"props":12053,"children":12054},{},[12055,12057,12062],{"type":23,"value":12056},"JustCall: ",{"type":17,"tag":6121,"props":12058,"children":12060},{"className":12059},[],[12061],{"type":23,"value":11832},{"type":23,"value":12063}," for Call",{"type":17,"tag":239,"props":12065,"children":12067},{"id":12066},"field-expansions-across-call-and-recording-objects",[12068],{"type":23,"value":12069},"Field expansions across call and recording objects",{"type":17,"tag":29,"props":12071,"children":12072},{},[12073],{"type":23,"value":12074},"We expanded call and recording data across integrations including Zoom Phone, Ring Central, Gong, Dialpad, Microsoft Teams, AirCall, Cloudtalk, Salesloft, QUO, 8x8, and JustCall.",{"type":17,"tag":29,"props":12076,"children":12077},{},[12078],{"type":23,"value":12079},"Common fields added:",{"type":17,"tag":80,"props":12081,"children":12082},{},[12083,12088,12093,12098,12103],{"type":17,"tag":84,"props":12084,"children":12085},{},[12086],{"type":23,"value":12087},"user_phone",{"type":17,"tag":84,"props":12089,"children":12090},{},[12091],{"type":23,"value":12092},"user_name",{"type":17,"tag":84,"props":12094,"children":12095},{},[12096],{"type":23,"value":12097},"contact_id / contact_name / contact_phone",{"type":17,"tag":84,"props":12099,"children":12100},{},[12101],{"type":23,"value":12102},"call_id",{"type":17,"tag":84,"props":12104,"children":12105},{},[12106],{"type":23,"value":12107},"web_url",{"type":17,"tag":239,"props":12109,"children":12111},{"id":12110},"webhooks-and-pagination-1",[12112],{"type":23,"value":11474},{"type":17,"tag":80,"props":12114,"children":12115},{},[12116,12121],{"type":17,"tag":84,"props":12117,"children":12118},{},[12119],{"type":23,"value":12120},"JustCall: created/updated virtual webhooks for Employee, Group, Call, and Recording",{"type":17,"tag":84,"props":12122,"children":12123},{},[12124],{"type":23,"value":12125},"Expanded filtering and pagination for JustCall Call and Recording",{"type":17,"tag":68,"props":12127,"children":12129},{"id":12128},"additional-method-coverage-webhooks-pagination-and-field-expansions",[12130],{"type":23,"value":12131},"Additional method coverage, webhooks, pagination, and field expansions",{"type":17,"tag":29,"props":12133,"children":12134},{},[12135],{"type":23,"value":12136},"March included a broad set of depth improvements across integrations.",{"type":17,"tag":239,"props":12138,"children":12140},{"id":12139},"new-objects-and-method-coverage",[12141],{"type":23,"value":12142},"New objects and method coverage",{"type":17,"tag":80,"props":12144,"children":12145},{},[12146,12175,12210,12221,12232,12280,12297,12302],{"type":17,"tag":84,"props":12147,"children":12148},{},[12149,12151,12156,12157,12162,12163,12168,12169,12174],{"type":23,"value":12150},"HighLevel: Event object (",{"type":17,"tag":6121,"props":12152,"children":12154},{"className":12153},[],[12155],{"type":23,"value":11243},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12158,"children":12160},{"className":12159},[],[12161],{"type":23,"value":11832},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12164,"children":12166},{"className":12165},[],[12167],{"type":23,"value":11254},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12170,"children":12172},{"className":12171},[],[12173],{"type":23,"value":11845},{"type":23,"value":12034},{"type":17,"tag":84,"props":12176,"children":12177},{},[12178,12180,12185,12186,12191,12192,12197,12198,12203,12204,12209],{"type":23,"value":12179},"ActiveCampaign: Event object (",{"type":17,"tag":6121,"props":12181,"children":12183},{"className":12182},[],[12184],{"type":23,"value":11243},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12187,"children":12189},{"className":12188},[],[12190],{"type":23,"value":11832},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12193,"children":12195},{"className":12194},[],[12196],{"type":23,"value":11254},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12199,"children":12201},{"className":12200},[],[12202],{"type":23,"value":11845},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12205,"children":12207},{"className":12206},[],[12208],{"type":23,"value":11852},{"type":23,"value":12034},{"type":17,"tag":84,"props":12211,"children":12212},{},[12213,12215,12220],{"type":23,"value":12214},"Recruitee: Activity object (",{"type":17,"tag":6121,"props":12216,"children":12218},{"className":12217},[],[12219],{"type":23,"value":11243},{"type":23,"value":12034},{"type":17,"tag":84,"props":12222,"children":12223},{},[12224,12226,12231],{"type":23,"value":12225},"Toast: Contact object (",{"type":17,"tag":6121,"props":12227,"children":12229},{"className":12228},[],[12230],{"type":23,"value":11243},{"type":23,"value":12034},{"type":17,"tag":84,"props":12233,"children":12234},{},[12235,12237,12242,12243,12248,12249,12254,12255,12260,12261,12266,12268,12273,12274,12279],{"type":23,"value":12236},"Paypal: Link (",{"type":17,"tag":6121,"props":12238,"children":12240},{"className":12239},[],[12241],{"type":23,"value":11243},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12244,"children":12246},{"className":12245},[],[12247],{"type":23,"value":11832},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12250,"children":12252},{"className":12251},[],[12253],{"type":23,"value":11254},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12256,"children":12258},{"className":12257},[],[12259],{"type":23,"value":11845},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12262,"children":12264},{"className":12263},[],[12265],{"type":23,"value":11852},{"type":23,"value":12267},") and Subscription (",{"type":17,"tag":6121,"props":12269,"children":12271},{"className":12270},[],[12272],{"type":23,"value":11243},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12275,"children":12277},{"className":12276},[],[12278],{"type":23,"value":11832},{"type":23,"value":12034},{"type":17,"tag":84,"props":12281,"children":12282},{},[12283,12285,12290,12291,12296],{"type":23,"value":12284},"Adyen: Company object (",{"type":17,"tag":6121,"props":12286,"children":12288},{"className":12287},[],[12289],{"type":23,"value":11243},{"type":23,"value":11826},{"type":17,"tag":6121,"props":12292,"children":12294},{"className":12293},[],[12295],{"type":23,"value":11832},{"type":23,"value":12034},{"type":17,"tag":84,"props":12298,"children":12299},{},[12300],{"type":23,"value":12301},"HiBob / Ceridian Dayforce: Group object",{"type":17,"tag":84,"props":12303,"children":12304},{},[12305],{"type":23,"value":12306},"Workday: Passthrough object",{"type":17,"tag":239,"props":12308,"children":12310},{"id":12309},"ats-write-coverage",[12311],{"type":23,"value":12312},"ATS write coverage",{"type":17,"tag":80,"props":12314,"children":12315},{},[12316,12327],{"type":17,"tag":84,"props":12317,"children":12318},{},[12319,12321,12326],{"type":23,"value":12320},"Jobvite, Clear Company, BambooHR, BreezyHR: Candidate and Application ",{"type":17,"tag":6121,"props":12322,"children":12324},{"className":12323},[],[12325],{"type":23,"value":11254},{"type":23,"value":11854},{"type":17,"tag":84,"props":12328,"children":12329},{},[12330],{"type":23,"value":12331},"Expanded writable fields for Candidate and Application objects",{"type":17,"tag":239,"props":12333,"children":12335},{"id":12334},"remove-method-expansion",[12336],{"type":23,"value":12337},"Remove method expansion",{"type":17,"tag":29,"props":12339,"children":12340},{},[12341,12343,12348],{"type":23,"value":12342},"We added ",{"type":17,"tag":6121,"props":12344,"children":12346},{"className":12345},[],[12347],{"type":23,"value":11852},{"type":23,"value":12349}," method support across a large set of integrations in categories including accounting, ATS, HR, messaging, commerce, calendar, and productivity, enabling full lifecycle operations across more objects.",{"type":17,"tag":239,"props":12351,"children":12353},{"id":12352},"pagination-and-filtering-improvements",[12354],{"type":23,"value":12355},"Pagination and filtering improvements",{"type":17,"tag":29,"props":12357,"children":12358},{},[12359],{"type":23,"value":12360},"Patterns added across integrations include:",{"type":17,"tag":80,"props":12362,"children":12363},{},[12364,12369,12374,12379,12384,12389],{"type":17,"tag":84,"props":12365,"children":12366},{},[12367],{"type":23,"value":12368},"query, updated_gte, and sorting support",{"type":17,"tag":84,"props":12370,"children":12371},{},[12372],{"type":23,"value":12373},"org-aware filtering (Zoho Books)",{"type":17,"tag":84,"props":12375,"children":12376},{},[12377],{"type":23,"value":12378},"webhook-scoped pagination filters",{"type":17,"tag":84,"props":12380,"children":12381},{},[12382],{"type":23,"value":12383},"expanded filtering across Stripe, Xero, DV360, GitLab, and JustCall",{"type":17,"tag":84,"props":12385,"children":12386},{},[12387],{"type":23,"value":12388},"file search and expansion support across Google Drive, OneDrive, SharePoint, GitHub, and Dropbox",{"type":17,"tag":84,"props":12390,"children":12391},{},[12392],{"type":23,"value":12393},"slow_fields support for high-volume objects",{"type":17,"tag":239,"props":12395,"children":12397},{"id":12396},"readable-and-writable-field-expansions",[12398],{"type":23,"value":12399},"Readable and writable field expansions",{"type":17,"tag":29,"props":12401,"children":12402},{},[12403],{"type":23,"value":12404},"We expanded field coverage across multiple categories:",{"type":17,"tag":80,"props":12406,"children":12407},{},[12408,12413,12418,12423,12428],{"type":17,"tag":84,"props":12409,"children":12410},{},[12411],{"type":23,"value":12412},"advertising: targeting, promoted, campaign, and creative fields",{"type":17,"tag":84,"props":12414,"children":12415},{},[12416],{"type":23,"value":12417},"HR: employee profile fields (timezone, language, currency, etc.)",{"type":17,"tag":84,"props":12419,"children":12420},{},[12421],{"type":23,"value":12422},"call center: call and recording enrichment fields",{"type":17,"tag":84,"props":12424,"children":12425},{},[12426],{"type":23,"value":12427},"CRM: metadata and custom field access",{"type":17,"tag":84,"props":12429,"children":12430},{},[12431],{"type":23,"value":12432},"finance: payment, invoice, and account fields",{"type":17,"tag":68,"props":12434,"children":12435},{"id":2316},[12436],{"type":23,"value":8829},{"type":17,"tag":29,"props":12438,"children":12439},{},[12440],{"type":23,"value":12441},"March expanded Unified into booking use cases with Commerce Availability and Reservation, significantly deepened Advertising API support for targeting and promoted entities, and introduced a new CLI access surface.",{"type":17,"tag":29,"props":12443,"children":12444},{},[12445],{"type":23,"value":12446},"Alongside that, we continued expanding object coverage, methods, webhooks, writable fields, and pagination across core integrations so teams can build and maintain integrations without vendor-specific rewrites.",{"type":17,"tag":29,"props":12448,"children":12449},{},[12450,12451],{"type":23,"value":1609},{"type":17,"tag":133,"props":12452,"children":12454},{"href":1612,"rel":12453},[214],[12455],{"type":23,"value":1616},{"type":17,"tag":29,"props":12457,"children":12458},{},[12459,12460],{"type":23,"value":1609},{"type":17,"tag":133,"props":12461,"children":12463},{"href":1623,"rel":12462},[214],[12464],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":12466},[12467,12473,12481,12482,12489,12490,12495,12501,12508],{"id":11116,"depth":1629,"text":11119,"children":12468},[12469,12470,12471,12472],{"id":11153,"depth":1635,"text":11156},{"id":11212,"depth":1635,"text":11215},{"id":11226,"depth":1635,"text":11229},{"id":11257,"depth":1635,"text":11260},{"id":11292,"depth":1629,"text":11295,"children":12474},[12475,12476,12477,12478,12479,12480],{"id":11303,"depth":1635,"text":11306},{"id":11390,"depth":1635,"text":11393},{"id":11414,"depth":1635,"text":11229},{"id":11432,"depth":1635,"text":11435},{"id":11471,"depth":1635,"text":11474},{"id":11495,"depth":1635,"text":11498},{"id":11568,"depth":1629,"text":11571},{"id":11629,"depth":1629,"text":11632,"children":12483},[12484,12485,12486,12487,12488],{"id":11635,"depth":1635,"text":11638},{"id":11676,"depth":1635,"text":11679},{"id":11715,"depth":1635,"text":11718},{"id":11734,"depth":1635,"text":11737},{"id":11753,"depth":1635,"text":11756},{"id":11772,"depth":1629,"text":11778},{"id":11797,"depth":1629,"text":11800,"children":12491},[12492,12493,12494],{"id":11803,"depth":1635,"text":11806},{"id":11867,"depth":1635,"text":11870},{"id":11919,"depth":1635,"text":11922},{"id":11997,"depth":1629,"text":12000,"children":12496},[12497,12498,12499,12500],{"id":12003,"depth":1635,"text":12006},{"id":12016,"depth":1635,"text":12019},{"id":12066,"depth":1635,"text":12069},{"id":12110,"depth":1635,"text":11474},{"id":12128,"depth":1629,"text":12131,"children":12502},[12503,12504,12505,12506,12507],{"id":12139,"depth":1635,"text":12142},{"id":12309,"depth":1635,"text":12312},{"id":12334,"depth":1635,"text":12337},{"id":12352,"depth":1635,"text":12355},{"id":12396,"depth":1635,"text":12399},{"id":2316,"depth":1629,"text":8829},"content:blog:march_2026_product_update.md","blog/march_2026_product_update.md","blog/march_2026_product_update",{"_path":12513,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":12514,"description":12515,"img":12516,"date":12517,"tag":12,"body":12518,"_type":1677,"_id":13628,"_source":1679,"_file":13629,"_stem":13630,"_extension":1682},"/blog/21_task_management_apis_to_integrate_with_asana_jira_clickup_and_unified_productivity_apis","21 Task Management APIs to Integrate With: Asana, Jira, ClickUp and Unified Productivity APIs","Task management tools sit at the core of how modern teams operate.","https://s3.us-east-2.amazonaws.com/unified-article-images/21_task_management_apis_to_integrate_with_asana_jira_clickup_and_unified_productivity_apis-icon.png","2026-03-25T01:05:00.000Z",{"type":14,"children":12519,"toc":13583},[12520,12525,12528,12536,12540,12570,12575,12580,12592,12598,12603,12608,12641,12646,12652,12657,12662,12670,12675,12683,12688,12696,12701,12709,12714,12722,12727,12735,12740,12745,12750,12755,12761,12769,12774,12779,12797,12803,12811,12816,12820,12838,12844,12852,12857,12863,12872,12877,12883,12893,12898,12904,12913,12918,12924,12934,12939,12945,12954,12959,12965,12975,12981,12991,12997,13007,13013,13018,13080,13085,13091,13096,13102,13107,13113,13118,13124,13129,13135,13140,13146,13151,13157,13168,13173,13179,13189,13194,13222,13227,13233,13244,13249,13326,13332,13337,13345,13350,13358,13363,13371,13376,13384,13389,13394,13400,13406,13411,13417,13422,13428,13433,13439,13444,13450,13455,13477,13483,13489,13494,13499,13504,13510,13515,13520,13525,13531,13536,13540,13545,13550,13555,13560,13565,13574],{"type":17,"tag":18,"props":12521,"children":12523},{"id":12522},"_21-task-management-apis-to-integrate-with-asana-jira-clickup-and-unified-productivity-apis",[12524],{"type":23,"value":12514},{"type":17,"tag":25,"props":12526,"children":12527},{},[],{"type":17,"tag":29,"props":12529,"children":12530},{},[12531],{"type":17,"tag":33,"props":12532,"children":12533},{},[12534],{"type":23,"value":12535},"March 25, 2026",{"type":17,"tag":29,"props":12537,"children":12538},{},[12539],{"type":23,"value":12515},{"type":17,"tag":29,"props":12541,"children":12542},{},[12543,12545,12552,12553,12560,12562,12569],{"type":23,"value":12544},"From tracking projects and assigning work to powering AI copilots and analytics, SaaS products increasingly rely on integrations with platforms like ",{"type":17,"tag":133,"props":12546,"children":12549},{"href":12547,"rel":12548},"https://developers.asana.com/",[214],[12550],{"type":23,"value":12551},"Asana",{"type":23,"value":11826},{"type":17,"tag":133,"props":12554,"children":12557},{"href":12555,"rel":12556},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/",[214],[12558],{"type":23,"value":12559},"Jira",{"type":23,"value":12561},", and ",{"type":17,"tag":133,"props":12563,"children":12566},{"href":12564,"rel":12565},"https://clickup.com/api",[214],[12567],{"type":23,"value":12568},"ClickUp",{"type":23,"value":54},{"type":17,"tag":29,"props":12571,"children":12572},{},[12573],{"type":23,"value":12574},"But integrating task management platforms is not straightforward.",{"type":17,"tag":29,"props":12576,"children":12577},{},[12578],{"type":23,"value":12579},"Each system has its own structure for tasks, projects, statuses, comments, and workflows. Supporting multiple platforms quickly becomes a scaling problem.",{"type":17,"tag":29,"props":12581,"children":12582},{},[12583,12585,12590],{"type":23,"value":12584},"In this guide, we'll cover ",{"type":17,"tag":48,"props":12586,"children":12587},{},[12588],{"type":23,"value":12589},"21+ task management APIs developers integrate with",{"type":23,"value":12591},", the challenges of building productivity integrations, and how unified APIs simplify access to project and task data.",{"type":17,"tag":68,"props":12593,"children":12595},{"id":12594},"what-is-a-task-management-api",[12596],{"type":23,"value":12597},"What is a Task Management API?",{"type":17,"tag":29,"props":12599,"children":12600},{},[12601],{"type":23,"value":12602},"A task management API allows applications to access and manipulate project and work data programmatically.",{"type":17,"tag":29,"props":12604,"children":12605},{},[12606],{"type":23,"value":12607},"Typical capabilities include:",{"type":17,"tag":80,"props":12609,"children":12610},{},[12611,12616,12621,12626,12631,12636],{"type":17,"tag":84,"props":12612,"children":12613},{},[12614],{"type":23,"value":12615},"creating and updating tasks",{"type":17,"tag":84,"props":12617,"children":12618},{},[12619],{"type":23,"value":12620},"managing projects and boards",{"type":17,"tag":84,"props":12622,"children":12623},{},[12624],{"type":23,"value":12625},"tracking task status and completion",{"type":17,"tag":84,"props":12627,"children":12628},{},[12629],{"type":23,"value":12630},"retrieving comments and activity logs",{"type":17,"tag":84,"props":12632,"children":12633},{},[12634],{"type":23,"value":12635},"assigning users and managing workflows",{"type":17,"tag":84,"props":12637,"children":12638},{},[12639],{"type":23,"value":12640},"tracking changes over time",{"type":17,"tag":29,"props":12642,"children":12643},{},[12644],{"type":23,"value":12645},"These APIs power project management tools, analytics platforms, workflow automation, and AI assistants.",{"type":17,"tag":68,"props":12647,"children":12649},{"id":12648},"why-saas-products-integrate-with-task-management-apis",[12650],{"type":23,"value":12651},"Why SaaS products integrate with task management APIs",{"type":17,"tag":29,"props":12653,"children":12654},{},[12655],{"type":23,"value":12656},"Task management integrations are essential for many SaaS workflows.",{"type":17,"tag":29,"props":12658,"children":12659},{},[12660],{"type":23,"value":12661},"Common use cases include:",{"type":17,"tag":29,"props":12663,"children":12664},{},[12665],{"type":17,"tag":48,"props":12666,"children":12667},{},[12668],{"type":23,"value":12669},"Project and productivity analytics",{"type":17,"tag":29,"props":12671,"children":12672},{},[12673],{"type":23,"value":12674},"Track team performance, project timelines, and task completion rates.",{"type":17,"tag":29,"props":12676,"children":12677},{},[12678],{"type":17,"tag":48,"props":12679,"children":12680},{},[12681],{"type":23,"value":12682},"Workflow automation",{"type":17,"tag":29,"props":12684,"children":12685},{},[12686],{"type":23,"value":12687},"Trigger actions when tasks are created, updated, or completed.",{"type":17,"tag":29,"props":12689,"children":12690},{},[12691],{"type":17,"tag":48,"props":12692,"children":12693},{},[12694],{"type":23,"value":12695},"Cross-platform task sync",{"type":17,"tag":29,"props":12697,"children":12698},{},[12699],{"type":23,"value":12700},"Sync tasks between tools like Asana, Jira, and Trello.",{"type":17,"tag":29,"props":12702,"children":12703},{},[12704],{"type":17,"tag":48,"props":12705,"children":12706},{},[12707],{"type":23,"value":12708},"AI-powered project assistants",{"type":17,"tag":29,"props":12710,"children":12711},{},[12712],{"type":23,"value":12713},"Analyze task data to identify bottlenecks, predict timelines, and generate insights.",{"type":17,"tag":29,"props":12715,"children":12716},{},[12717],{"type":17,"tag":48,"props":12718,"children":12719},{},[12720],{"type":23,"value":12721},"Time tracking and resource planning",{"type":17,"tag":29,"props":12723,"children":12724},{},[12725],{"type":23,"value":12726},"Connect tasks to time logs, budgets, and resource allocation.",{"type":17,"tag":29,"props":12728,"children":12729},{},[12730],{"type":17,"tag":48,"props":12731,"children":12732},{},[12733],{"type":23,"value":12734},"Customer and product workflows",{"type":17,"tag":29,"props":12736,"children":12737},{},[12738],{"type":23,"value":12739},"Sync tasks with CRM, support, or engineering systems.",{"type":17,"tag":29,"props":12741,"children":12742},{},[12743],{"type":23,"value":12744},"Task data is often the backbone of execution inside companies, which makes integrations critical.",{"type":17,"tag":68,"props":12746,"children":12748},{"id":12747},"_21-task-management-apis-developers-integrate-with",[12749],{"type":23,"value":12589},{"type":17,"tag":29,"props":12751,"children":12752},{},[12753],{"type":23,"value":12754},"Below are some of the most commonly integrated platforms.",{"type":17,"tag":239,"props":12756,"children":12758},{"id":12757},"asana-api",[12759],{"type":23,"value":12760},"Asana API",{"type":17,"tag":29,"props":12762,"children":12763},{},[12764],{"type":17,"tag":133,"props":12765,"children":12767},{"href":12547,"rel":12766},[214],[12768],{"type":23,"value":12760},{"type":17,"tag":29,"props":12770,"children":12771},{},[12772],{"type":23,"value":12773},"Popular project management platform for teams.",{"type":17,"tag":29,"props":12775,"children":12776},{},[12777],{"type":23,"value":12778},"Supports:",{"type":17,"tag":80,"props":12780,"children":12781},{},[12782,12787,12792],{"type":17,"tag":84,"props":12783,"children":12784},{},[12785],{"type":23,"value":12786},"tasks and projects",{"type":17,"tag":84,"props":12788,"children":12789},{},[12790],{"type":23,"value":12791},"assignments and timelines",{"type":17,"tag":84,"props":12793,"children":12794},{},[12795],{"type":23,"value":12796},"comments and collaboration",{"type":17,"tag":239,"props":12798,"children":12800},{"id":12799},"jira-api",[12801],{"type":23,"value":12802},"Jira API",{"type":17,"tag":29,"props":12804,"children":12805},{},[12806],{"type":17,"tag":133,"props":12807,"children":12809},{"href":12555,"rel":12808},[214],[12810],{"type":23,"value":12802},{"type":17,"tag":29,"props":12812,"children":12813},{},[12814],{"type":23,"value":12815},"Widely used in engineering and product teams.",{"type":17,"tag":29,"props":12817,"children":12818},{},[12819],{"type":23,"value":12778},{"type":17,"tag":80,"props":12821,"children":12822},{},[12823,12828,12833],{"type":17,"tag":84,"props":12824,"children":12825},{},[12826],{"type":23,"value":12827},"issues and workflows",{"type":17,"tag":84,"props":12829,"children":12830},{},[12831],{"type":23,"value":12832},"sprints and boards",{"type":17,"tag":84,"props":12834,"children":12835},{},[12836],{"type":23,"value":12837},"advanced project tracking",{"type":17,"tag":239,"props":12839,"children":12841},{"id":12840},"clickup-api",[12842],{"type":23,"value":12843},"ClickUp API",{"type":17,"tag":29,"props":12845,"children":12846},{},[12847],{"type":17,"tag":133,"props":12848,"children":12850},{"href":12564,"rel":12849},[214],[12851],{"type":23,"value":12843},{"type":17,"tag":29,"props":12853,"children":12854},{},[12855],{"type":23,"value":12856},"Flexible task and productivity platform.",{"type":17,"tag":239,"props":12858,"children":12860},{"id":12859},"trello-api",[12861],{"type":23,"value":12862},"Trello API",{"type":17,"tag":29,"props":12864,"children":12865},{},[12866],{"type":17,"tag":133,"props":12867,"children":12870},{"href":12868,"rel":12869},"https://developer.atlassian.com/cloud/trello/rest/",[214],[12871],{"type":23,"value":12862},{"type":17,"tag":29,"props":12873,"children":12874},{},[12875],{"type":23,"value":12876},"Kanban-based task management.",{"type":17,"tag":239,"props":12878,"children":12880},{"id":12879},"mondaycom-api",[12881],{"type":23,"value":12882},"Monday.com API",{"type":17,"tag":29,"props":12884,"children":12885},{},[12886],{"type":17,"tag":133,"props":12887,"children":12890},{"href":12888,"rel":12889},"https://developer.monday.com/",[214],[12891],{"type":23,"value":12892},"Monday API",{"type":17,"tag":29,"props":12894,"children":12895},{},[12896],{"type":23,"value":12897},"Used for project tracking and workflows.",{"type":17,"tag":239,"props":12899,"children":12901},{"id":12900},"linear-api",[12902],{"type":23,"value":12903},"Linear API",{"type":17,"tag":29,"props":12905,"children":12906},{},[12907],{"type":17,"tag":133,"props":12908,"children":12911},{"href":12909,"rel":12910},"https://developers.linear.app/",[214],[12912],{"type":23,"value":12903},{"type":17,"tag":29,"props":12914,"children":12915},{},[12916],{"type":23,"value":12917},"Popular among modern product and engineering teams.",{"type":17,"tag":239,"props":12919,"children":12921},{"id":12920},"github-issues-api",[12922],{"type":23,"value":12923},"GitHub Issues API",{"type":17,"tag":29,"props":12925,"children":12926},{},[12927],{"type":17,"tag":133,"props":12928,"children":12931},{"href":12929,"rel":12930},"https://docs.github.com/en/rest",[214],[12932],{"type":23,"value":12933},"GitHub API",{"type":17,"tag":29,"props":12935,"children":12936},{},[12937],{"type":23,"value":12938},"Used for issues, tasks, and project tracking.",{"type":17,"tag":239,"props":12940,"children":12942},{"id":12941},"gitlab-api",[12943],{"type":23,"value":12944},"GitLab API",{"type":17,"tag":29,"props":12946,"children":12947},{},[12948],{"type":17,"tag":133,"props":12949,"children":12952},{"href":12950,"rel":12951},"https://docs.gitlab.com/ee/api/",[214],[12953],{"type":23,"value":12944},{"type":17,"tag":29,"props":12955,"children":12956},{},[12957],{"type":23,"value":12958},"Supports issue tracking and project workflows.",{"type":17,"tag":239,"props":12960,"children":12962},{"id":12961},"microsoft-planner-api",[12963],{"type":23,"value":12964},"Microsoft Planner API",{"type":17,"tag":29,"props":12966,"children":12967},{},[12968],{"type":17,"tag":133,"props":12969,"children":12972},{"href":12970,"rel":12971},"https://learn.microsoft.com/en-us/graph/api/resources/planner-overview",[214],[12973],{"type":23,"value":12974},"Microsoft Planner",{"type":17,"tag":239,"props":12976,"children":12978},{"id":12977},"motion-api",[12979],{"type":23,"value":12980},"Motion API",{"type":17,"tag":29,"props":12982,"children":12983},{},[12984],{"type":17,"tag":133,"props":12985,"children":12988},{"href":12986,"rel":12987},"https://www.usemotion.com/",[214],[12989],{"type":23,"value":12990},"Motion",{"type":17,"tag":239,"props":12992,"children":12994},{"id":12993},"gainsight-api",[12995],{"type":23,"value":12996},"Gainsight API",{"type":17,"tag":29,"props":12998,"children":12999},{},[13000],{"type":17,"tag":133,"props":13001,"children":13004},{"href":13002,"rel":13003},"https://developers.gainsight.com/",[214],[13005],{"type":23,"value":13006},"Gainsight",{"type":17,"tag":239,"props":13008,"children":13010},{"id":13009},"additional-platforms",[13011],{"type":23,"value":13012},"Additional platforms",{"type":17,"tag":29,"props":13014,"children":13015},{},[13016],{"type":23,"value":13017},"Other commonly integrated tools include:",{"type":17,"tag":80,"props":13019,"children":13020},{},[13021,13031,13041,13051,13061,13071],{"type":17,"tag":84,"props":13022,"children":13023},{},[13024],{"type":17,"tag":133,"props":13025,"children":13028},{"href":13026,"rel":13027},"https://dovetail.com/",[214],[13029],{"type":23,"value":13030},"Dovetail",{"type":17,"tag":84,"props":13032,"children":13033},{},[13034],{"type":17,"tag":133,"props":13035,"children":13038},{"href":13036,"rel":13037},"https://cascade.app/",[214],[13039],{"type":23,"value":13040},"Cascade",{"type":17,"tag":84,"props":13042,"children":13043},{},[13044],{"type":17,"tag":133,"props":13045,"children":13048},{"href":13046,"rel":13047},"https://www.streamtime.net/",[214],[13049],{"type":23,"value":13050},"Streamtime",{"type":17,"tag":84,"props":13052,"children":13053},{},[13054],{"type":17,"tag":133,"props":13055,"children":13058},{"href":13056,"rel":13057},"https://www.trackerrms.com/",[214],[13059],{"type":23,"value":13060},"TrackerRMS",{"type":17,"tag":84,"props":13062,"children":13063},{},[13064],{"type":17,"tag":133,"props":13065,"children":13068},{"href":13066,"rel":13067},"https://www.netsuite.com/",[214],[13069],{"type":23,"value":13070},"NetSuite",{"type":17,"tag":84,"props":13072,"children":13073},{},[13074],{"type":17,"tag":133,"props":13075,"children":13078},{"href":13076,"rel":13077},"https://developer.intuit.com/",[214],[13079],{"type":23,"value":3199},{"type":17,"tag":29,"props":13081,"children":13082},{},[13083],{"type":23,"value":13084},"The task management ecosystem spans project tools, engineering platforms, and business systems, making integration coverage important.",{"type":17,"tag":68,"props":13086,"children":13088},{"id":13087},"challenges-when-integrating-task-management-apis",[13089],{"type":23,"value":13090},"Challenges when integrating task management APIs",{"type":17,"tag":29,"props":13092,"children":13093},{},[13094],{"type":23,"value":13095},"Task management integrations introduce complexity beyond basic CRUD operations.",{"type":17,"tag":239,"props":13097,"children":13099},{"id":13098},"different-data-models",[13100],{"type":23,"value":13101},"Different data models",{"type":17,"tag":29,"props":13103,"children":13104},{},[13105],{"type":23,"value":13106},"Tasks, issues, tickets, and work items vary significantly across platforms.",{"type":17,"tag":239,"props":13108,"children":13110},{"id":13109},"workflow-differences",[13111],{"type":23,"value":13112},"Workflow differences",{"type":17,"tag":29,"props":13114,"children":13115},{},[13116],{"type":23,"value":13117},"Statuses, pipelines, and transitions are platform-specific.",{"type":17,"tag":239,"props":13119,"children":13121},{"id":13120},"hierarchical-structures",[13122],{"type":23,"value":13123},"Hierarchical structures",{"type":17,"tag":29,"props":13125,"children":13126},{},[13127],{"type":23,"value":13128},"Tasks, subtasks, projects, and dependencies are modeled differently.",{"type":17,"tag":239,"props":13130,"children":13132},{"id":13131},"activity-tracking",[13133],{"type":23,"value":13134},"Activity tracking",{"type":17,"tag":29,"props":13136,"children":13137},{},[13138],{"type":23,"value":13139},"Comments, updates, and audit logs vary in structure and behavior.",{"type":17,"tag":239,"props":13141,"children":13143},{"id":13142},"permissions-and-roles",[13144],{"type":23,"value":13145},"Permissions and roles",{"type":17,"tag":29,"props":13147,"children":13148},{},[13149],{"type":23,"value":13150},"Access control differs across platforms.",{"type":17,"tag":239,"props":13152,"children":13154},{"id":13153},"real-time-updates",[13155],{"type":23,"value":13156},"Real-time updates",{"type":17,"tag":29,"props":13158,"children":13159},{},[13160,13162,13166],{"type":23,"value":13161},"Some platforms rely on ",{"type":17,"tag":133,"props":13163,"children":13164},{"href":4999},[13165],{"type":23,"value":5002},{"type":23,"value":13167},", others require polling.",{"type":17,"tag":29,"props":13169,"children":13170},{},[13171],{"type":23,"value":13172},"As you support more tools, these differences increase engineering overhead.",{"type":17,"tag":68,"props":13174,"children":13176},{"id":13175},"the-role-of-unified-task-management-apis",[13177],{"type":23,"value":13178},"The role of unified task management APIs",{"type":17,"tag":29,"props":13180,"children":13181},{},[13182,13183,13187],{"type":23,"value":9619},{"type":17,"tag":133,"props":13184,"children":13185},{"href":7691},[13186],{"type":23,"value":7459},{"type":23,"value":13188}," standardizes project and task data across platforms.",{"type":17,"tag":29,"props":13190,"children":13191},{},[13192],{"type":23,"value":13193},"Instead of building separate integrations for Asana, Jira, ClickUp, and others, you:",{"type":17,"tag":80,"props":13195,"children":13196},{},[13197,13202,13207,13212,13217],{"type":17,"tag":84,"props":13198,"children":13199},{},[13200],{"type":23,"value":13201},"integrate once",{"type":17,"tag":84,"props":13203,"children":13204},{},[13205],{"type":23,"value":13206},"use consistent task and project models",{"type":17,"tag":84,"props":13208,"children":13209},{},[13210],{"type":23,"value":13211},"standardize workflows and updates",{"type":17,"tag":84,"props":13213,"children":13214},{},[13215],{"type":23,"value":13216},"simplify data mapping",{"type":17,"tag":84,"props":13218,"children":13219},{},[13220],{"type":23,"value":13221},"reduce maintenance",{"type":17,"tag":29,"props":13223,"children":13224},{},[13225],{"type":23,"value":13226},"This is especially valuable for products that depend on accurate, real-time task data.",{"type":17,"tag":68,"props":13228,"children":13230},{"id":13229},"build-once-with-the-unified-task-management-api",[13231],{"type":23,"value":13232},"Build once with the Unified Task Management API",{"type":17,"tag":29,"props":13234,"children":13235},{},[13236,13238,13243],{"type":23,"value":13237},"The Unified Task Management API enables access to ",{"type":17,"tag":48,"props":13239,"children":13240},{},[13241],{"type":23,"value":13242},"21+ productivity integrations through a single API",{"type":23,"value":54},{"type":17,"tag":29,"props":13245,"children":13246},{},[13247],{"type":23,"value":13248},"Supported platforms include:",{"type":17,"tag":80,"props":13250,"children":13251},{},[13252,13260,13268,13276,13285,13294,13303,13312,13321],{"type":17,"tag":84,"props":13253,"children":13254},{},[13255],{"type":17,"tag":133,"props":13256,"children":13258},{"href":12547,"rel":13257},[214],[13259],{"type":23,"value":12551},{"type":17,"tag":84,"props":13261,"children":13262},{},[13263],{"type":17,"tag":133,"props":13264,"children":13266},{"href":12555,"rel":13265},[214],[13267],{"type":23,"value":12559},{"type":17,"tag":84,"props":13269,"children":13270},{},[13271],{"type":17,"tag":133,"props":13272,"children":13274},{"href":12564,"rel":13273},[214],[13275],{"type":23,"value":12568},{"type":17,"tag":84,"props":13277,"children":13278},{},[13279],{"type":17,"tag":133,"props":13280,"children":13282},{"href":12868,"rel":13281},[214],[13283],{"type":23,"value":13284},"Trello",{"type":17,"tag":84,"props":13286,"children":13287},{},[13288],{"type":17,"tag":133,"props":13289,"children":13291},{"href":12888,"rel":13290},[214],[13292],{"type":23,"value":13293},"Monday",{"type":17,"tag":84,"props":13295,"children":13296},{},[13297],{"type":17,"tag":133,"props":13298,"children":13300},{"href":12909,"rel":13299},[214],[13301],{"type":23,"value":13302},"Linear",{"type":17,"tag":84,"props":13304,"children":13305},{},[13306],{"type":17,"tag":133,"props":13307,"children":13309},{"href":12929,"rel":13308},[214],[13310],{"type":23,"value":13311},"GitHub",{"type":17,"tag":84,"props":13313,"children":13314},{},[13315],{"type":17,"tag":133,"props":13316,"children":13318},{"href":12950,"rel":13317},[214],[13319],{"type":23,"value":13320},"GitLab",{"type":17,"tag":84,"props":13322,"children":13323},{},[13324],{"type":23,"value":13325},"and many more",{"type":17,"tag":239,"props":13327,"children":13329},{"id":13328},"unified-task-management-objects",[13330],{"type":23,"value":13331},"Unified task management objects",{"type":17,"tag":29,"props":13333,"children":13334},{},[13335],{"type":23,"value":13336},"Unified standardizes productivity data into core objects:",{"type":17,"tag":29,"props":13338,"children":13339},{},[13340],{"type":17,"tag":48,"props":13341,"children":13342},{},[13343],{"type":23,"value":13344},"Project",{"type":17,"tag":29,"props":13346,"children":13347},{},[13348],{"type":23,"value":13349},"Represents projects, boards, or workspaces.",{"type":17,"tag":29,"props":13351,"children":13352},{},[13353],{"type":17,"tag":48,"props":13354,"children":13355},{},[13356],{"type":23,"value":13357},"Task",{"type":17,"tag":29,"props":13359,"children":13360},{},[13361],{"type":23,"value":13362},"Represents tasks, issues, or work items.",{"type":17,"tag":29,"props":13364,"children":13365},{},[13366],{"type":17,"tag":48,"props":13367,"children":13368},{},[13369],{"type":23,"value":13370},"Comment",{"type":17,"tag":29,"props":13372,"children":13373},{},[13374],{"type":23,"value":13375},"Represents discussions and notes on tasks.",{"type":17,"tag":29,"props":13377,"children":13378},{},[13379],{"type":17,"tag":48,"props":13380,"children":13381},{},[13382],{"type":23,"value":13383},"Change",{"type":17,"tag":29,"props":13385,"children":13386},{},[13387],{"type":23,"value":13388},"Represents updates and activity logs.",{"type":17,"tag":29,"props":13390,"children":13391},{},[13392],{"type":23,"value":13393},"Each object supports consistent methods across platforms.",{"type":17,"tag":68,"props":13395,"children":13397},{"id":13396},"why-teams-choose-unifiedto-for-task-integrations",[13398],{"type":23,"value":13399},"Why teams choose Unified.to for task integrations",{"type":17,"tag":239,"props":13401,"children":13403},{"id":13402},"real-time-pass-through-architecture",[13404],{"type":23,"value":13405},"Real-time, pass-through architecture",{"type":17,"tag":29,"props":13407,"children":13408},{},[13409],{"type":23,"value":13410},"Every request hits the source platform live. No stale tasks or delayed updates.",{"type":17,"tag":239,"props":13412,"children":13414},{"id":13413},"zero-storage-by-design",[13415],{"type":23,"value":13416},"Zero-storage by design",{"type":17,"tag":29,"props":13418,"children":13419},{},[13420],{"type":23,"value":13421},"Task data is never stored at rest, reducing risk and compliance scope.",{"type":17,"tag":239,"props":13423,"children":13425},{"id":13424},"unified-data-models",[13426],{"type":23,"value":13427},"Unified data models",{"type":17,"tag":29,"props":13429,"children":13430},{},[13431],{"type":23,"value":13432},"Tasks, projects, comments, and updates follow a consistent structure across platforms.",{"type":17,"tag":239,"props":13434,"children":13436},{"id":13435},"one-api-across-all-productivity-tools",[13437],{"type":23,"value":13438},"One API across all productivity tools",{"type":17,"tag":29,"props":13440,"children":13441},{},[13442],{"type":23,"value":13443},"No need to build and maintain separate integrations for each provider.",{"type":17,"tag":239,"props":13445,"children":13447},{"id":13446},"built-for-ai-workflows",[13448],{"type":23,"value":13449},"Built for AI workflows",{"type":17,"tag":29,"props":13451,"children":13452},{},[13453],{"type":23,"value":13454},"Task data can be used for:",{"type":17,"tag":80,"props":13456,"children":13457},{},[13458,13463,13468,13472],{"type":17,"tag":84,"props":13459,"children":13460},{},[13461],{"type":23,"value":13462},"AI project assistants",{"type":17,"tag":84,"props":13464,"children":13465},{},[13466],{"type":23,"value":13467},"productivity insights",{"type":17,"tag":84,"props":13469,"children":13470},{},[13471],{"type":23,"value":10949},{"type":17,"tag":84,"props":13473,"children":13474},{},[13475],{"type":23,"value":13476},"forecasting and planning",{"type":17,"tag":68,"props":13478,"children":13480},{"id":13479},"common-use-cases-for-a-unified-task-api",[13481],{"type":23,"value":13482},"Common use cases for a unified task API",{"type":17,"tag":239,"props":13484,"children":13486},{"id":13485},"project-analytics",[13487],{"type":23,"value":13488},"Project analytics",{"type":17,"tag":29,"props":13490,"children":13491},{},[13492],{"type":23,"value":13493},"Aggregate task data across platforms to track performance and productivity.",{"type":17,"tag":239,"props":13495,"children":13497},{"id":13496},"workflow-automation",[13498],{"type":23,"value":12682},{"type":17,"tag":29,"props":13500,"children":13501},{},[13502],{"type":23,"value":13503},"Trigger actions based on task updates, completions, or status changes.",{"type":17,"tag":239,"props":13505,"children":13507},{"id":13506},"cross-platform-sync",[13508],{"type":23,"value":13509},"Cross-platform sync",{"type":17,"tag":29,"props":13511,"children":13512},{},[13513],{"type":23,"value":13514},"Keep tasks synchronized across multiple tools.",{"type":17,"tag":239,"props":13516,"children":13518},{"id":13517},"ai-project-assistants",[13519],{"type":23,"value":13462},{"type":17,"tag":29,"props":13521,"children":13522},{},[13523],{"type":23,"value":13524},"Analyze project health, detect risks, and generate recommendations.",{"type":17,"tag":239,"props":13526,"children":13528},{"id":13527},"resource-planning",[13529],{"type":23,"value":13530},"Resource planning",{"type":17,"tag":29,"props":13532,"children":13533},{},[13534],{"type":23,"value":13535},"Optimize workload and team capacity using task data.",{"type":17,"tag":68,"props":13537,"children":13538},{"id":1552},[13539],{"type":23,"value":1555},{"type":17,"tag":29,"props":13541,"children":13542},{},[13543],{"type":23,"value":13544},"Task management integrations are foundational for many SaaS products.",{"type":17,"tag":29,"props":13546,"children":13547},{},[13548],{"type":23,"value":13549},"But differences in data models, workflows, and structures make scaling integrations difficult.",{"type":17,"tag":29,"props":13551,"children":13552},{},[13553],{"type":23,"value":13554},"A unified API removes that complexity by standardizing how task and project data is accessed.",{"type":17,"tag":29,"props":13556,"children":13557},{},[13558],{"type":23,"value":13559},"Instead of managing multiple APIs, you build once and support all major productivity platforms.",{"type":17,"tag":29,"props":13561,"children":13562},{},[13563],{"type":23,"value":13564},"That allows your team to focus on delivering features, not maintaining integrations.",{"type":17,"tag":29,"props":13566,"children":13567},{},[13568,13569],{"type":23,"value":1609},{"type":17,"tag":133,"props":13570,"children":13572},{"href":1612,"rel":13571},[214],[13573],{"type":23,"value":1616},{"type":17,"tag":29,"props":13575,"children":13576},{},[13577,13578],{"type":23,"value":1609},{"type":17,"tag":133,"props":13579,"children":13581},{"href":1623,"rel":13580},[214],[13582],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":13584},[13585,13586,13587,13601,13609,13610,13613,13620,13627],{"id":12594,"depth":1629,"text":12597},{"id":12648,"depth":1629,"text":12651},{"id":12747,"depth":1629,"text":12589,"children":13588},[13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600],{"id":12757,"depth":1635,"text":12760},{"id":12799,"depth":1635,"text":12802},{"id":12840,"depth":1635,"text":12843},{"id":12859,"depth":1635,"text":12862},{"id":12879,"depth":1635,"text":12882},{"id":12900,"depth":1635,"text":12903},{"id":12920,"depth":1635,"text":12923},{"id":12941,"depth":1635,"text":12944},{"id":12961,"depth":1635,"text":12964},{"id":12977,"depth":1635,"text":12980},{"id":12993,"depth":1635,"text":12996},{"id":13009,"depth":1635,"text":13012},{"id":13087,"depth":1629,"text":13090,"children":13602},[13603,13604,13605,13606,13607,13608],{"id":13098,"depth":1635,"text":13101},{"id":13109,"depth":1635,"text":13112},{"id":13120,"depth":1635,"text":13123},{"id":13131,"depth":1635,"text":13134},{"id":13142,"depth":1635,"text":13145},{"id":13153,"depth":1635,"text":13156},{"id":13175,"depth":1629,"text":13178},{"id":13229,"depth":1629,"text":13232,"children":13611},[13612],{"id":13328,"depth":1635,"text":13331},{"id":13396,"depth":1629,"text":13399,"children":13614},[13615,13616,13617,13618,13619],{"id":13402,"depth":1635,"text":13405},{"id":13413,"depth":1635,"text":13416},{"id":13424,"depth":1635,"text":13427},{"id":13435,"depth":1635,"text":13438},{"id":13446,"depth":1635,"text":13449},{"id":13479,"depth":1629,"text":13482,"children":13621},[13622,13623,13624,13625,13626],{"id":13485,"depth":1635,"text":13488},{"id":13496,"depth":1635,"text":12682},{"id":13506,"depth":1635,"text":13509},{"id":13517,"depth":1635,"text":13462},{"id":13527,"depth":1635,"text":13530},{"id":1552,"depth":1629,"text":1555},"content:blog:21_task_management_apis_to_integrate_with_asana_jira_clickup_and_unified_productivity_apis.md","blog/21_task_management_apis_to_integrate_with_asana_jira_clickup_and_unified_productivity_apis.md","blog/21_task_management_apis_to_integrate_with_asana_jira_clickup_and_unified_productivity_apis",{"_path":13632,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":13633,"description":13634,"img":13635,"date":13636,"tag":12,"body":13637,"_type":1677,"_id":14823,"_source":1679,"_file":14824,"_stem":14825,"_extension":1682},"/blog/27_calendar_apis_to_integrate_with_google_calendar_outlook_calendly_and_unified_scheduling_apis","27 Calendar APIs to Integrate With: Google Calendar, Outlook, Calendly and Unified Scheduling APIs","Calendar and scheduling integrations sit at the center of many SaaS products.","https://s3.us-east-2.amazonaws.com/unified-article-images/27_calendar_apis_to_integrate_with_google_calendar_outlook_calendly_and_unified_scheduling_apis-icon.png","2026-03-25T00:57:00.000Z",{"type":14,"children":13638,"toc":14774},[13639,13644,13647,13654,13658,13680,13685,13696,13702,13714,13718,13756,13761,13767,13772,13776,13784,13789,13797,13802,13810,13815,13823,13828,13835,13840,13848,13853,13858,13863,13868,13874,13882,13887,13891,13909,13915,13920,13925,13929,13947,13953,13961,13966,13971,13989,13995,14005,14010,14016,14025,14030,14036,14046,14051,14057,14067,14072,14078,14088,14093,14099,14109,14114,14120,14130,14135,14141,14151,14156,14162,14167,14173,14178,14184,14194,14200,14209,14213,14217,14280,14285,14291,14296,14302,14307,14313,14318,14324,14329,14335,14340,14346,14351,14357,14366,14371,14377,14382,14387,14414,14419,14425,14436,14440,14497,14503,14508,14516,14521,14529,14534,14542,14547,14555,14560,14568,14573,14581,14586,14591,14597,14601,14606,14610,14615,14621,14626,14632,14637,14641,14646,14668,14674,14680,14685,14690,14695,14701,14706,14712,14717,14722,14727,14731,14736,14741,14746,14751,14756,14765],{"type":17,"tag":18,"props":13640,"children":13642},{"id":13641},"_27-calendar-apis-to-integrate-with-google-calendar-outlook-calendly-and-unified-scheduling-apis",[13643],{"type":23,"value":13633},{"type":17,"tag":25,"props":13645,"children":13646},{},[],{"type":17,"tag":29,"props":13648,"children":13649},{},[13650],{"type":17,"tag":33,"props":13651,"children":13652},{},[13653],{"type":23,"value":12535},{"type":17,"tag":29,"props":13655,"children":13656},{},[13657],{"type":23,"value":13634},{"type":17,"tag":29,"props":13659,"children":13660},{},[13661,13663,13670,13672,13679],{"type":23,"value":13662},"From booking meetings and syncing calendars to powering AI meeting assistants and scheduling workflows, products increasingly rely on APIs from platforms like ",{"type":17,"tag":133,"props":13664,"children":13667},{"href":13665,"rel":13666},"https://developers.google.com/calendar/api",[214],[13668],{"type":23,"value":13669},"Google Calendar",{"type":23,"value":13671},", Microsoft Outlook, and tools like ",{"type":17,"tag":133,"props":13673,"children":13676},{"href":13674,"rel":13675},"https://developer.calendly.com/",[214],[13677],{"type":23,"value":13678},"Calendly",{"type":23,"value":54},{"type":17,"tag":29,"props":13681,"children":13682},{},[13683],{"type":23,"value":13684},"The challenge is that every calendar provider handles events, availability, meetings, and scheduling logic differently.",{"type":17,"tag":29,"props":13686,"children":13687},{},[13688,13689,13694],{"type":23,"value":12584},{"type":17,"tag":48,"props":13690,"children":13691},{},[13692],{"type":23,"value":13693},"27+ calendar APIs developers integrate with",{"type":23,"value":13695},", the complexity of building scheduling integrations, and how unified calendar APIs simplify real-time event data access.",{"type":17,"tag":68,"props":13697,"children":13699},{"id":13698},"what-is-a-calendar-api",[13700],{"type":23,"value":13701},"What is a Calendar API?",{"type":17,"tag":29,"props":13703,"children":13704},{},[13705,13706,13712],{"type":23,"value":9619},{"type":17,"tag":133,"props":13707,"children":13709},{"href":13708},"/calendar",[13710],{"type":23,"value":13711},"calendar API",{"type":23,"value":13713}," allows applications to read and write scheduling data across calendar platforms.",{"type":17,"tag":29,"props":13715,"children":13716},{},[13717],{"type":23,"value":12607},{"type":17,"tag":80,"props":13719,"children":13720},{},[13721,13726,13731,13736,13741,13746,13751],{"type":17,"tag":84,"props":13722,"children":13723},{},[13724],{"type":23,"value":13725},"creating and updating events",{"type":17,"tag":84,"props":13727,"children":13728},{},[13729],{"type":23,"value":13730},"retrieving calendar data",{"type":17,"tag":84,"props":13732,"children":13733},{},[13734],{"type":23,"value":13735},"checking availability (free/busy)",{"type":17,"tag":84,"props":13737,"children":13738},{},[13739],{"type":23,"value":13740},"managing attendees",{"type":17,"tag":84,"props":13742,"children":13743},{},[13744],{"type":23,"value":13745},"generating scheduling links",{"type":17,"tag":84,"props":13747,"children":13748},{},[13749],{"type":23,"value":13750},"accessing meeting recordings or transcripts",{"type":17,"tag":84,"props":13752,"children":13753},{},[13754],{"type":23,"value":13755},"handling recurring events",{"type":17,"tag":29,"props":13757,"children":13758},{},[13759],{"type":23,"value":13760},"These APIs power scheduling tools, productivity apps, CRMs, AI assistants, and workflow automation systems.",{"type":17,"tag":68,"props":13762,"children":13764},{"id":13763},"why-saas-products-integrate-with-calendar-apis",[13765],{"type":23,"value":13766},"Why SaaS products integrate with calendar APIs",{"type":17,"tag":29,"props":13768,"children":13769},{},[13770],{"type":23,"value":13771},"Calendar integrations are critical across multiple product categories.",{"type":17,"tag":29,"props":13773,"children":13774},{},[13775],{"type":23,"value":12661},{"type":17,"tag":29,"props":13777,"children":13778},{},[13779],{"type":17,"tag":48,"props":13780,"children":13781},{},[13782],{"type":23,"value":13783},"Scheduling and booking tools",{"type":17,"tag":29,"props":13785,"children":13786},{},[13787],{"type":23,"value":13788},"Find availability and create meetings across Google Calendar, Outlook, and scheduling platforms.",{"type":17,"tag":29,"props":13790,"children":13791},{},[13792],{"type":17,"tag":48,"props":13793,"children":13794},{},[13795],{"type":23,"value":13796},"AI meeting assistants",{"type":17,"tag":29,"props":13798,"children":13799},{},[13800],{"type":23,"value":13801},"Access events, transcripts, and recordings to summarize meetings and extract insights.",{"type":17,"tag":29,"props":13803,"children":13804},{},[13805],{"type":17,"tag":48,"props":13806,"children":13807},{},[13808],{"type":23,"value":13809},"CRM and sales workflows",{"type":17,"tag":29,"props":13811,"children":13812},{},[13813],{"type":23,"value":13814},"Sync meetings with customer records and sales activity.",{"type":17,"tag":29,"props":13816,"children":13817},{},[13818],{"type":17,"tag":48,"props":13819,"children":13820},{},[13821],{"type":23,"value":13822},"Internal productivity tools",{"type":17,"tag":29,"props":13824,"children":13825},{},[13826],{"type":23,"value":13827},"Track meetings, time usage, and availability across teams.",{"type":17,"tag":29,"props":13829,"children":13830},{},[13831],{"type":17,"tag":48,"props":13832,"children":13833},{},[13834],{"type":23,"value":12682},{"type":17,"tag":29,"props":13836,"children":13837},{},[13838],{"type":23,"value":13839},"Trigger actions when meetings are created, updated, or canceled.",{"type":17,"tag":29,"props":13841,"children":13842},{},[13843],{"type":17,"tag":48,"props":13844,"children":13845},{},[13846],{"type":23,"value":13847},"Resource scheduling",{"type":17,"tag":29,"props":13849,"children":13850},{},[13851],{"type":23,"value":13852},"Manage rooms, equipment, or shared resources.",{"type":17,"tag":29,"props":13854,"children":13855},{},[13856],{"type":23,"value":13857},"Because calendar data is real-time and user-facing, accuracy and reliability matter.",{"type":17,"tag":68,"props":13859,"children":13861},{"id":13860},"_27-calendar-apis-developers-integrate-with",[13862],{"type":23,"value":13693},{"type":17,"tag":29,"props":13864,"children":13865},{},[13866],{"type":23,"value":13867},"Below are the most commonly integrated calendar and scheduling platforms.",{"type":17,"tag":239,"props":13869,"children":13871},{"id":13870},"google-calendar-api",[13872],{"type":23,"value":13873},"Google Calendar API",{"type":17,"tag":29,"props":13875,"children":13876},{},[13877],{"type":17,"tag":133,"props":13878,"children":13880},{"href":13665,"rel":13879},[214],[13881],{"type":23,"value":13873},{"type":17,"tag":29,"props":13883,"children":13884},{},[13885],{"type":23,"value":13886},"One of the most widely used calendar systems.",{"type":17,"tag":29,"props":13888,"children":13889},{},[13890],{"type":23,"value":12778},{"type":17,"tag":80,"props":13892,"children":13893},{},[13894,13899,13904],{"type":17,"tag":84,"props":13895,"children":13896},{},[13897],{"type":23,"value":13898},"events and calendars",{"type":17,"tag":84,"props":13900,"children":13901},{},[13902],{"type":23,"value":13903},"free/busy availability",{"type":17,"tag":84,"props":13905,"children":13906},{},[13907],{"type":23,"value":13908},"attendees and meeting metadata",{"type":17,"tag":239,"props":13910,"children":13912},{"id":13911},"microsoft-outlook-office-365-api",[13913],{"type":23,"value":13914},"Microsoft Outlook / Office 365 API",{"type":17,"tag":29,"props":13916,"children":13917},{},[13918],{"type":23,"value":13919},"Microsoft Graph Calendar API",{"type":17,"tag":29,"props":13921,"children":13922},{},[13923],{"type":23,"value":13924},"Used across enterprise environments.",{"type":17,"tag":29,"props":13926,"children":13927},{},[13928],{"type":23,"value":12778},{"type":17,"tag":80,"props":13930,"children":13931},{},[13932,13937,13942],{"type":17,"tag":84,"props":13933,"children":13934},{},[13935],{"type":23,"value":13936},"events and scheduling",{"type":17,"tag":84,"props":13938,"children":13939},{},[13940],{"type":23,"value":13941},"availability data",{"type":17,"tag":84,"props":13943,"children":13944},{},[13945],{"type":23,"value":13946},"meeting coordination",{"type":17,"tag":239,"props":13948,"children":13950},{"id":13949},"calendly-api",[13951],{"type":23,"value":13952},"Calendly API",{"type":17,"tag":29,"props":13954,"children":13955},{},[13956],{"type":17,"tag":133,"props":13957,"children":13959},{"href":13674,"rel":13958},[214],[13960],{"type":23,"value":13952},{"type":17,"tag":29,"props":13962,"children":13963},{},[13964],{"type":23,"value":13965},"Scheduling platform for booking meetings.",{"type":17,"tag":29,"props":13967,"children":13968},{},[13969],{"type":23,"value":13970},"Used for:",{"type":17,"tag":80,"props":13972,"children":13973},{},[13974,13979,13984],{"type":17,"tag":84,"props":13975,"children":13976},{},[13977],{"type":23,"value":13978},"scheduling links",{"type":17,"tag":84,"props":13980,"children":13981},{},[13982],{"type":23,"value":13983},"booking workflows",{"type":17,"tag":84,"props":13985,"children":13986},{},[13987],{"type":23,"value":13988},"availability management",{"type":17,"tag":239,"props":13990,"children":13992},{"id":13991},"calcom-api",[13993],{"type":23,"value":13994},"Cal.com API",{"type":17,"tag":29,"props":13996,"children":13997},{},[13998],{"type":17,"tag":133,"props":13999,"children":14002},{"href":14000,"rel":14001},"https://cal.com/",[214],[14003],{"type":23,"value":14004},"Cal.com",{"type":17,"tag":29,"props":14006,"children":14007},{},[14008],{"type":23,"value":14009},"Open scheduling infrastructure used by many SaaS products.",{"type":17,"tag":239,"props":14011,"children":14013},{"id":14012},"zoom-api",[14014],{"type":23,"value":14015},"Zoom API",{"type":17,"tag":29,"props":14017,"children":14018},{},[14019],{"type":17,"tag":133,"props":14020,"children":14023},{"href":14021,"rel":14022},"https://developers.zoom.us/",[214],[14024],{"type":23,"value":14015},{"type":17,"tag":29,"props":14026,"children":14027},{},[14028],{"type":23,"value":14029},"Used for meetings, webinars, and recordings.",{"type":17,"tag":239,"props":14031,"children":14033},{"id":14032},"google-meet-api",[14034],{"type":23,"value":14035},"Google Meet API",{"type":17,"tag":29,"props":14037,"children":14038},{},[14039],{"type":17,"tag":133,"props":14040,"children":14043},{"href":14041,"rel":14042},"https://developers.google.com/workspace",[214],[14044],{"type":23,"value":14045},"Google Meet",{"type":17,"tag":29,"props":14047,"children":14048},{},[14049],{"type":23,"value":14050},"Used for meeting scheduling and conferencing.",{"type":17,"tag":239,"props":14052,"children":14054},{"id":14053},"microsoft-teams-api",[14055],{"type":23,"value":14056},"Microsoft Teams API",{"type":17,"tag":29,"props":14058,"children":14059},{},[14060],{"type":17,"tag":133,"props":14061,"children":14064},{"href":14062,"rel":14063},"https://learn.microsoft.com/en-us/microsoftteams/platform/",[214],[14065],{"type":23,"value":14066},"Microsoft Teams",{"type":17,"tag":29,"props":14068,"children":14069},{},[14070],{"type":23,"value":14071},"Supports meetings and collaboration workflows.",{"type":17,"tag":239,"props":14073,"children":14075},{"id":14074},"acuity-scheduling-api",[14076],{"type":23,"value":14077},"Acuity Scheduling API",{"type":17,"tag":29,"props":14079,"children":14080},{},[14081],{"type":17,"tag":133,"props":14082,"children":14085},{"href":14083,"rel":14084},"https://developers.acuityscheduling.com/",[214],[14086],{"type":23,"value":14087},"Acuity Scheduling",{"type":17,"tag":29,"props":14089,"children":14090},{},[14091],{"type":23,"value":14092},"Used for appointment booking and scheduling.",{"type":17,"tag":239,"props":14094,"children":14096},{"id":14095},"apple-icloud-calendar-api",[14097],{"type":23,"value":14098},"Apple iCloud Calendar API",{"type":17,"tag":29,"props":14100,"children":14101},{},[14102],{"type":17,"tag":133,"props":14103,"children":14106},{"href":14104,"rel":14105},"https://developer.apple.com/",[214],[14107],{"type":23,"value":14108},"Apple iCloud",{"type":17,"tag":29,"props":14110,"children":14111},{},[14112],{"type":23,"value":14113},"Used for personal calendar integrations.",{"type":17,"tag":239,"props":14115,"children":14117},{"id":14116},"webex-api",[14118],{"type":23,"value":14119},"Webex API",{"type":17,"tag":29,"props":14121,"children":14122},{},[14123],{"type":17,"tag":133,"props":14124,"children":14127},{"href":14125,"rel":14126},"https://developer.webex.com/",[214],[14128],{"type":23,"value":14129},"Webex",{"type":17,"tag":29,"props":14131,"children":14132},{},[14133],{"type":23,"value":14134},"Enterprise meetings and conferencing.",{"type":17,"tag":239,"props":14136,"children":14138},{"id":14137},"ringcentral-api",[14139],{"type":23,"value":14140},"RingCentral API",{"type":17,"tag":29,"props":14142,"children":14143},{},[14144],{"type":17,"tag":133,"props":14145,"children":14148},{"href":14146,"rel":14147},"https://developers.ringcentral.com/",[214],[14149],{"type":23,"value":14150},"RingCentral",{"type":17,"tag":29,"props":14152,"children":14153},{},[14154],{"type":23,"value":14155},"Scheduling and communications platform.",{"type":17,"tag":239,"props":14157,"children":14159},{"id":14158},"zoho-calendar-api",[14160],{"type":23,"value":14161},"Zoho Calendar API",{"type":17,"tag":29,"props":14163,"children":14164},{},[14165],{"type":23,"value":14166},"Zoho Calendar",{"type":17,"tag":239,"props":14168,"children":14170},{"id":14169},"zoho-meeting-api",[14171],{"type":23,"value":14172},"Zoho Meeting API",{"type":17,"tag":29,"props":14174,"children":14175},{},[14176],{"type":23,"value":14177},"Zoho Meeting",{"type":17,"tag":239,"props":14179,"children":14181},{"id":14180},"square-appointments-api",[14182],{"type":23,"value":14183},"Square Appointments API",{"type":17,"tag":29,"props":14185,"children":14186},{},[14187],{"type":17,"tag":133,"props":14188,"children":14191},{"href":14189,"rel":14190},"https://developer.squareup.com/",[214],[14192],{"type":23,"value":14193},"Square",{"type":17,"tag":239,"props":14195,"children":14197},{"id":14196},"salesforce-calendar-api",[14198],{"type":23,"value":14199},"Salesforce Calendar API",{"type":17,"tag":29,"props":14201,"children":14202},{},[14203],{"type":17,"tag":133,"props":14204,"children":14207},{"href":14205,"rel":14206},"https://developer.salesforce.com/",[214],[14208],{"type":23,"value":3179},{"type":17,"tag":239,"props":14210,"children":14211},{"id":13009},[14212],{"type":23,"value":13012},{"type":17,"tag":29,"props":14214,"children":14215},{},[14216],{"type":23,"value":13017},{"type":17,"tag":80,"props":14218,"children":14219},{},[14220,14230,14240,14250,14260,14270],{"type":17,"tag":84,"props":14221,"children":14222},{},[14223],{"type":17,"tag":133,"props":14224,"children":14227},{"href":14225,"rel":14226},"https://savvycal.com/",[214],[14228],{"type":23,"value":14229},"SavvyCal",{"type":17,"tag":84,"props":14231,"children":14232},{},[14233],{"type":17,"tag":133,"props":14234,"children":14237},{"href":14235,"rel":14236},"https://simplemeet.me/",[214],[14238],{"type":23,"value":14239},"SimpleMeet",{"type":17,"tag":84,"props":14241,"children":14242},{},[14243],{"type":17,"tag":133,"props":14244,"children":14247},{"href":14245,"rel":14246},"https://fireflies.ai/",[214],[14248],{"type":23,"value":14249},"Fireflies",{"type":17,"tag":84,"props":14251,"children":14252},{},[14253],{"type":17,"tag":133,"props":14254,"children":14257},{"href":14255,"rel":14256},"https://fathom.video/",[214],[14258],{"type":23,"value":14259},"Fathom",{"type":17,"tag":84,"props":14261,"children":14262},{},[14263],{"type":17,"tag":133,"props":14264,"children":14267},{"href":14265,"rel":14266},"https://developer.goto.com/",[214],[14268],{"type":23,"value":14269},"GoTo",{"type":17,"tag":84,"props":14271,"children":14272},{},[14273],{"type":17,"tag":133,"props":14274,"children":14277},{"href":14275,"rel":14276},"https://developers.hubspot.com/",[214],[14278],{"type":23,"value":14279},"HubSpot Meetings",{"type":17,"tag":29,"props":14281,"children":14282},{},[14283],{"type":23,"value":14284},"The scheduling ecosystem spans calendars, meeting tools, and booking platforms, making coverage important.",{"type":17,"tag":68,"props":14286,"children":14288},{"id":14287},"challenges-when-integrating-calendar-apis",[14289],{"type":23,"value":14290},"Challenges when integrating calendar APIs",{"type":17,"tag":29,"props":14292,"children":14293},{},[14294],{"type":23,"value":14295},"Calendar integrations introduce complexity that most teams underestimate.",{"type":17,"tag":239,"props":14297,"children":14299},{"id":14298},"different-event-models",[14300],{"type":23,"value":14301},"Different event models",{"type":17,"tag":29,"props":14303,"children":14304},{},[14305],{"type":23,"value":14306},"Each platform represents events differently (fields, attendees, recurrence rules).",{"type":17,"tag":239,"props":14308,"children":14310},{"id":14309},"availability-inconsistencies",[14311],{"type":23,"value":14312},"Availability inconsistencies",{"type":17,"tag":29,"props":14314,"children":14315},{},[14316],{"type":23,"value":14317},"Free/busy data varies by provider and can behave differently across edge cases.",{"type":17,"tag":239,"props":14319,"children":14321},{"id":14320},"recurring-events",[14322],{"type":23,"value":14323},"Recurring events",{"type":17,"tag":29,"props":14325,"children":14326},{},[14327],{"type":23,"value":14328},"Handling recurrence rules consistently across platforms is non-trivial.",{"type":17,"tag":239,"props":14330,"children":14332},{"id":14331},"meeting-vs-scheduling-separation",[14333],{"type":23,"value":14334},"Meeting vs scheduling separation",{"type":17,"tag":29,"props":14336,"children":14337},{},[14338],{"type":23,"value":14339},"Some platforms manage events, others manage booking workflows separately.",{"type":17,"tag":239,"props":14341,"children":14343},{"id":14342},"real-time-expectations",[14344],{"type":23,"value":14345},"Real-time expectations",{"type":17,"tag":29,"props":14347,"children":14348},{},[14349],{"type":23,"value":14350},"Calendar data must be accurate in real time. Delayed syncs lead to double-booking and broken workflows.",{"type":17,"tag":239,"props":14352,"children":14354},{"id":14353},"complex-authentication",[14355],{"type":23,"value":14356},"Complex authentication",{"type":17,"tag":29,"props":14358,"children":14359},{},[14360,14364],{"type":17,"tag":133,"props":14361,"children":14362},{"href":779},[14363],{"type":23,"value":782},{"type":23,"value":14365}," flows differ across providers and often require careful scope handling.",{"type":17,"tag":29,"props":14367,"children":14368},{},[14369],{"type":23,"value":14370},"As you support more platforms, these differences become a maintenance burden.",{"type":17,"tag":68,"props":14372,"children":14374},{"id":14373},"the-role-of-unified-calendar-apis",[14375],{"type":23,"value":14376},"The role of unified calendar APIs",{"type":17,"tag":29,"props":14378,"children":14379},{},[14380],{"type":23,"value":14381},"A unified calendar API standardizes how you interact with calendar platforms.",{"type":17,"tag":29,"props":14383,"children":14384},{},[14385],{"type":23,"value":14386},"Instead of building separate integrations for Google Calendar, Outlook, Calendly, and others, you:",{"type":17,"tag":80,"props":14388,"children":14389},{},[14390,14394,14399,14404,14409],{"type":17,"tag":84,"props":14391,"children":14392},{},[14393],{"type":23,"value":13201},{"type":17,"tag":84,"props":14395,"children":14396},{},[14397],{"type":23,"value":14398},"use consistent event models",{"type":17,"tag":84,"props":14400,"children":14401},{},[14402],{"type":23,"value":14403},"handle availability in a unified way",{"type":17,"tag":84,"props":14405,"children":14406},{},[14407],{"type":23,"value":14408},"manage scheduling logic consistently",{"type":17,"tag":84,"props":14410,"children":14411},{},[14412],{"type":23,"value":14413},"reduce integration maintenance",{"type":17,"tag":29,"props":14415,"children":14416},{},[14417],{"type":23,"value":14418},"This is especially important for products that depend on accurate scheduling and availability.",{"type":17,"tag":68,"props":14420,"children":14422},{"id":14421},"build-once-with-the-unified-calendar-api",[14423],{"type":23,"value":14424},"Build once with the Unified Calendar API",{"type":17,"tag":29,"props":14426,"children":14427},{},[14428,14430,14435],{"type":23,"value":14429},"The Unified Calendar API enables access to ",{"type":17,"tag":48,"props":14431,"children":14432},{},[14433],{"type":23,"value":14434},"27+ calendar and scheduling integrations through a single API",{"type":23,"value":54},{"type":17,"tag":29,"props":14437,"children":14438},{},[14439],{"type":23,"value":13248},{"type":17,"tag":80,"props":14441,"children":14442},{},[14443,14451,14456,14464,14473,14481,14489,14493],{"type":17,"tag":84,"props":14444,"children":14445},{},[14446],{"type":17,"tag":133,"props":14447,"children":14449},{"href":13665,"rel":14448},[214],[14450],{"type":23,"value":13669},{"type":17,"tag":84,"props":14452,"children":14453},{},[14454],{"type":23,"value":14455},"Microsoft Outlook",{"type":17,"tag":84,"props":14457,"children":14458},{},[14459],{"type":17,"tag":133,"props":14460,"children":14462},{"href":13674,"rel":14461},[214],[14463],{"type":23,"value":13678},{"type":17,"tag":84,"props":14465,"children":14466},{},[14467],{"type":17,"tag":133,"props":14468,"children":14470},{"href":14021,"rel":14469},[214],[14471],{"type":23,"value":14472},"Zoom",{"type":17,"tag":84,"props":14474,"children":14475},{},[14476],{"type":17,"tag":133,"props":14477,"children":14479},{"href":14062,"rel":14478},[214],[14480],{"type":23,"value":14066},{"type":17,"tag":84,"props":14482,"children":14483},{},[14484],{"type":17,"tag":133,"props":14485,"children":14487},{"href":14125,"rel":14486},[214],[14488],{"type":23,"value":14129},{"type":17,"tag":84,"props":14490,"children":14491},{},[14492],{"type":23,"value":14166},{"type":17,"tag":84,"props":14494,"children":14495},{},[14496],{"type":23,"value":13325},{"type":17,"tag":239,"props":14498,"children":14500},{"id":14499},"unified-calendar-objects",[14501],{"type":23,"value":14502},"Unified calendar objects",{"type":17,"tag":29,"props":14504,"children":14505},{},[14506],{"type":23,"value":14507},"Unified standardizes scheduling data into core objects:",{"type":17,"tag":29,"props":14509,"children":14510},{},[14511],{"type":17,"tag":48,"props":14512,"children":14513},{},[14514],{"type":23,"value":14515},"Calendar",{"type":17,"tag":29,"props":14517,"children":14518},{},[14519],{"type":23,"value":14520},"Represents calendar accounts and configurations.",{"type":17,"tag":29,"props":14522,"children":14523},{},[14524],{"type":17,"tag":48,"props":14525,"children":14526},{},[14527],{"type":23,"value":14528},"Event",{"type":17,"tag":29,"props":14530,"children":14531},{},[14532],{"type":23,"value":14533},"Represents meetings, appointments, and scheduled events.",{"type":17,"tag":29,"props":14535,"children":14536},{},[14537],{"type":17,"tag":48,"props":14538,"children":14539},{},[14540],{"type":23,"value":14541},"Busy",{"type":17,"tag":29,"props":14543,"children":14544},{},[14545],{"type":23,"value":14546},"Represents availability and time blocks.",{"type":17,"tag":29,"props":14548,"children":14549},{},[14550],{"type":17,"tag":48,"props":14551,"children":14552},{},[14553],{"type":23,"value":14554},"Link",{"type":17,"tag":29,"props":14556,"children":14557},{},[14558],{"type":23,"value":14559},"Represents scheduling links and booking pages.",{"type":17,"tag":29,"props":14561,"children":14562},{},[14563],{"type":17,"tag":48,"props":14564,"children":14565},{},[14566],{"type":23,"value":14567},"Recording",{"type":17,"tag":29,"props":14569,"children":14570},{},[14571],{"type":23,"value":14572},"Represents meeting recordings and transcripts.",{"type":17,"tag":29,"props":14574,"children":14575},{},[14576],{"type":17,"tag":48,"props":14577,"children":14578},{},[14579],{"type":23,"value":14580},"Webinar",{"type":17,"tag":29,"props":14582,"children":14583},{},[14584],{"type":23,"value":14585},"Represents webinar events and registrations.",{"type":17,"tag":29,"props":14587,"children":14588},{},[14589],{"type":23,"value":14590},"These objects support consistent methods across all platforms.",{"type":17,"tag":68,"props":14592,"children":14594},{"id":14593},"why-teams-choose-unifiedto-for-calendar-integrations",[14595],{"type":23,"value":14596},"Why teams choose Unified.to for calendar integrations",{"type":17,"tag":239,"props":14598,"children":14599},{"id":13402},[14600],{"type":23,"value":13405},{"type":17,"tag":29,"props":14602,"children":14603},{},[14604],{"type":23,"value":14605},"Every request hits the source platform live. No caching, no stale availability data.",{"type":17,"tag":239,"props":14607,"children":14608},{"id":13413},[14609],{"type":23,"value":13416},{"type":17,"tag":29,"props":14611,"children":14612},{},[14613],{"type":23,"value":14614},"Calendar and meeting data is never stored at rest, reducing risk and compliance overhead.",{"type":17,"tag":239,"props":14616,"children":14618},{"id":14617},"unified-availability-freebusy",[14619],{"type":23,"value":14620},"Unified availability (Free/Busy)",{"type":17,"tag":29,"props":14622,"children":14623},{},[14624],{"type":23,"value":14625},"Check availability across multiple calendar providers using a single API.",{"type":17,"tag":239,"props":14627,"children":14629},{"id":14628},"scheduling-without-building-infrastructure",[14630],{"type":23,"value":14631},"Scheduling without building infrastructure",{"type":17,"tag":29,"props":14633,"children":14634},{},[14635],{"type":23,"value":14636},"Use pre-built components or APIs to handle booking and scheduling flows.",{"type":17,"tag":239,"props":14638,"children":14639},{"id":13446},[14640],{"type":23,"value":13449},{"type":17,"tag":29,"props":14642,"children":14643},{},[14644],{"type":23,"value":14645},"Calendar data can be used for:",{"type":17,"tag":80,"props":14647,"children":14648},{},[14649,14653,14658,14663],{"type":17,"tag":84,"props":14650,"children":14651},{},[14652],{"type":23,"value":13796},{"type":17,"tag":84,"props":14654,"children":14655},{},[14656],{"type":23,"value":14657},"scheduling copilots",{"type":17,"tag":84,"props":14659,"children":14660},{},[14661],{"type":23,"value":14662},"automated workflows",{"type":17,"tag":84,"props":14664,"children":14665},{},[14666],{"type":23,"value":14667},"transcript analysis",{"type":17,"tag":68,"props":14669,"children":14671},{"id":14670},"common-use-cases-for-a-unified-calendar-api",[14672],{"type":23,"value":14673},"Common use cases for a unified calendar API",{"type":17,"tag":239,"props":14675,"children":14677},{"id":14676},"scheduling-tools",[14678],{"type":23,"value":14679},"Scheduling tools",{"type":17,"tag":29,"props":14681,"children":14682},{},[14683],{"type":23,"value":14684},"Build booking systems that work across Google Calendar, Outlook, and scheduling platforms.",{"type":17,"tag":239,"props":14686,"children":14688},{"id":14687},"ai-meeting-assistants",[14689],{"type":23,"value":13796},{"type":17,"tag":29,"props":14691,"children":14692},{},[14693],{"type":23,"value":14694},"Access events, recordings, and transcripts to generate summaries and insights.",{"type":17,"tag":239,"props":14696,"children":14698},{"id":14697},"calendar-sync-tools",[14699],{"type":23,"value":14700},"Calendar sync tools",{"type":17,"tag":29,"props":14702,"children":14703},{},[14704],{"type":23,"value":14705},"Keep multiple calendars in sync across platforms.",{"type":17,"tag":239,"props":14707,"children":14709},{"id":14708},"availability-based-workflows",[14710],{"type":23,"value":14711},"Availability-based workflows",{"type":17,"tag":29,"props":14713,"children":14714},{},[14715],{"type":23,"value":14716},"Trigger actions based on availability or scheduled events.",{"type":17,"tag":239,"props":14718,"children":14720},{"id":14719},"resource-scheduling",[14721],{"type":23,"value":13847},{"type":17,"tag":29,"props":14723,"children":14724},{},[14725],{"type":23,"value":14726},"Manage rooms, equipment, or shared resources across calendars.",{"type":17,"tag":68,"props":14728,"children":14729},{"id":1552},[14730],{"type":23,"value":1555},{"type":17,"tag":29,"props":14732,"children":14733},{},[14734],{"type":23,"value":14735},"Calendar integrations are deceptively complex.",{"type":17,"tag":29,"props":14737,"children":14738},{},[14739],{"type":23,"value":14740},"Even though most platforms deal with events and availability, differences in data models, scheduling logic, and real-time requirements make scaling integrations difficult.",{"type":17,"tag":29,"props":14742,"children":14743},{},[14744],{"type":23,"value":14745},"A unified calendar API simplifies this by providing a consistent interface across all platforms.",{"type":17,"tag":29,"props":14747,"children":14748},{},[14749],{"type":23,"value":14750},"Instead of managing dozens of integrations, you build once and support all major calendar and scheduling systems.",{"type":17,"tag":29,"props":14752,"children":14753},{},[14754],{"type":23,"value":14755},"That allows your team to focus on building scheduling features, not maintaining infrastructure.",{"type":17,"tag":29,"props":14757,"children":14758},{},[14759,14760],{"type":23,"value":1609},{"type":17,"tag":133,"props":14761,"children":14763},{"href":1612,"rel":14762},[214],[14764],{"type":23,"value":1616},{"type":17,"tag":29,"props":14766,"children":14767},{},[14768,14769],{"type":23,"value":1609},{"type":17,"tag":133,"props":14770,"children":14772},{"href":1623,"rel":14771},[214],[14773],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":14775},[14776,14777,14778,14796,14804,14805,14808,14815,14822],{"id":13698,"depth":1629,"text":13701},{"id":13763,"depth":1629,"text":13766},{"id":13860,"depth":1629,"text":13693,"children":14779},[14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795],{"id":13870,"depth":1635,"text":13873},{"id":13911,"depth":1635,"text":13914},{"id":13949,"depth":1635,"text":13952},{"id":13991,"depth":1635,"text":13994},{"id":14012,"depth":1635,"text":14015},{"id":14032,"depth":1635,"text":14035},{"id":14053,"depth":1635,"text":14056},{"id":14074,"depth":1635,"text":14077},{"id":14095,"depth":1635,"text":14098},{"id":14116,"depth":1635,"text":14119},{"id":14137,"depth":1635,"text":14140},{"id":14158,"depth":1635,"text":14161},{"id":14169,"depth":1635,"text":14172},{"id":14180,"depth":1635,"text":14183},{"id":14196,"depth":1635,"text":14199},{"id":13009,"depth":1635,"text":13012},{"id":14287,"depth":1629,"text":14290,"children":14797},[14798,14799,14800,14801,14802,14803],{"id":14298,"depth":1635,"text":14301},{"id":14309,"depth":1635,"text":14312},{"id":14320,"depth":1635,"text":14323},{"id":14331,"depth":1635,"text":14334},{"id":14342,"depth":1635,"text":14345},{"id":14353,"depth":1635,"text":14356},{"id":14373,"depth":1629,"text":14376},{"id":14421,"depth":1629,"text":14424,"children":14806},[14807],{"id":14499,"depth":1635,"text":14502},{"id":14593,"depth":1629,"text":14596,"children":14809},[14810,14811,14812,14813,14814],{"id":13402,"depth":1635,"text":13405},{"id":13413,"depth":1635,"text":13416},{"id":14617,"depth":1635,"text":14620},{"id":14628,"depth":1635,"text":14631},{"id":13446,"depth":1635,"text":13449},{"id":14670,"depth":1629,"text":14673,"children":14816},[14817,14818,14819,14820,14821],{"id":14676,"depth":1635,"text":14679},{"id":14687,"depth":1635,"text":13796},{"id":14697,"depth":1635,"text":14700},{"id":14708,"depth":1635,"text":14711},{"id":14719,"depth":1635,"text":13847},{"id":1552,"depth":1629,"text":1555},"content:blog:27_calendar_apis_to_integrate_with_google_calendar_outlook_calendly_and_unified_scheduling_apis.md","blog/27_calendar_apis_to_integrate_with_google_calendar_outlook_calendly_and_unified_scheduling_apis.md","blog/27_calendar_apis_to_integrate_with_google_calendar_outlook_calendly_and_unified_scheduling_apis",{"_path":14827,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":14828,"description":14829,"img":14830,"date":14831,"tag":12,"body":14832,"_type":1677,"_id":16063,"_source":1679,"_file":16064,"_stem":16065,"_extension":1682},"/blog/17_messaging_apis_to_integrate_with_slack_microsoft_teams_gmail_and_unified_messaging_apis","17 Messaging APIs to Integrate With: Slack, Microsoft Teams, Gmail and Unified Messaging APIs","Messaging platforms are now core infrastructure for SaaS products.","https://s3.us-east-2.amazonaws.com/unified-article-images/17_messaging_apis_to_integrate_with_slack_microsoft_teams_gmail_and_unified_messaging_apis-icon.png","2026-03-25T00:43:00.000Z",{"type":14,"children":14833,"toc":16016},[14834,14839,14842,14849,14853,14880,14885,14890,14901,14907,14919,14923,14956,14961,14967,14972,14976,14984,14989,14997,15002,15010,15015,15023,15028,15036,15041,15049,15054,15059,15064,15069,15075,15084,15089,15094,15117,15121,15130,15135,15139,15157,15163,15171,15176,15180,15203,15209,15219,15224,15228,15246,15252,15261,15266,15270,15288,15294,15303,15308,15312,15330,15336,15345,15350,15354,15362,15367,15371,15379,15384,15390,15399,15404,15410,15420,15425,15431,15441,15446,15452,15462,15467,15471,15475,15517,15522,15528,15533,15539,15544,15550,15561,15567,15572,15578,15583,15587,15592,15598,15603,15608,15614,15619,15624,15651,15656,15662,15673,15677,15769,15775,15780,15788,15793,15801,15806,15813,15818,15823,15829,15833,15838,15842,15847,15853,15866,15872,15877,15883,15888,15910,15916,15922,15927,15933,15938,15942,15947,15953,15958,15964,15969,15973,15978,15983,15988,15993,15998,16007],{"type":17,"tag":18,"props":14835,"children":14837},{"id":14836},"_17-messaging-apis-to-integrate-with-slack-microsoft-teams-gmail-and-unified-messaging-apis",[14838],{"type":23,"value":14828},{"type":17,"tag":25,"props":14840,"children":14841},{},[],{"type":17,"tag":29,"props":14843,"children":14844},{},[14845],{"type":17,"tag":33,"props":14846,"children":14847},{},[14848],{"type":23,"value":12535},{"type":17,"tag":29,"props":14850,"children":14851},{},[14852],{"type":23,"value":14829},{"type":17,"tag":29,"props":14854,"children":14855},{},[14856,14858,14864,14865,14871,14872,14879],{"type":23,"value":14857},"Customer conversations, internal collaboration, support workflows, notifications, and AI agents all depend on access to communication data across tools like ",{"type":17,"tag":133,"props":14859,"children":14862},{"href":14860,"rel":14861},"https://slack.com/",[214],[14863],{"type":23,"value":3204},{"type":23,"value":11826},{"type":17,"tag":133,"props":14866,"children":14869},{"href":14867,"rel":14868},"https://www.microsoft.com/microsoft-teams",[214],[14870],{"type":23,"value":14066},{"type":23,"value":12561},{"type":17,"tag":133,"props":14873,"children":14876},{"href":14874,"rel":14875},"https://developers.google.com/gmail/api",[214],[14877],{"type":23,"value":14878},"Gmail",{"type":23,"value":54},{"type":17,"tag":29,"props":14881,"children":14882},{},[14883],{"type":23,"value":14884},"But integrating messaging platforms is not straightforward.",{"type":17,"tag":29,"props":14886,"children":14887},{},[14888],{"type":23,"value":14889},"Each platform has its own API structure, authentication flow, event model, threading logic, and permissions system. Supporting multiple messaging tools quickly becomes a complex engineering problem.",{"type":17,"tag":29,"props":14891,"children":14892},{},[14893,14894,14899],{"type":23,"value":12584},{"type":17,"tag":48,"props":14895,"children":14896},{},[14897],{"type":23,"value":14898},"17+ messaging APIs developers integrate with",{"type":23,"value":14900},", the challenges of building messaging integrations, and how unified messaging APIs simplify everything.",{"type":17,"tag":68,"props":14902,"children":14904},{"id":14903},"what-is-a-messaging-api",[14905],{"type":23,"value":14906},"What is a Messaging API?",{"type":17,"tag":29,"props":14908,"children":14909},{},[14910,14911,14917],{"type":23,"value":9619},{"type":17,"tag":133,"props":14912,"children":14914},{"href":14913},"/messaging",[14915],{"type":23,"value":14916},"messaging API",{"type":23,"value":14918}," allows your application to access and interact with communication platforms.",{"type":17,"tag":29,"props":14920,"children":14921},{},[14922],{"type":23,"value":12607},{"type":17,"tag":80,"props":14924,"children":14925},{},[14926,14931,14936,14941,14946,14951],{"type":17,"tag":84,"props":14927,"children":14928},{},[14929],{"type":23,"value":14930},"reading messages and threads",{"type":17,"tag":84,"props":14932,"children":14933},{},[14934],{"type":23,"value":14935},"sending messages and replies",{"type":17,"tag":84,"props":14937,"children":14938},{},[14939],{"type":23,"value":14940},"accessing channels or conversations",{"type":17,"tag":84,"props":14942,"children":14943},{},[14944],{"type":23,"value":14945},"tracking reactions and events",{"type":17,"tag":84,"props":14947,"children":14948},{},[14949],{"type":23,"value":14950},"retrieving attachments and metadata",{"type":17,"tag":84,"props":14952,"children":14953},{},[14954],{"type":23,"value":14955},"monitoring activity across users and teams",{"type":17,"tag":29,"props":14957,"children":14958},{},[14959],{"type":23,"value":14960},"These APIs power everything from chatbots to analytics platforms to AI copilots.",{"type":17,"tag":68,"props":14962,"children":14964},{"id":14963},"why-saas-products-integrate-with-messaging-apis",[14965],{"type":23,"value":14966},"Why SaaS products integrate with messaging APIs",{"type":17,"tag":29,"props":14968,"children":14969},{},[14970],{"type":23,"value":14971},"Messaging integrations are increasingly expected across B2B SaaS products.",{"type":17,"tag":29,"props":14973,"children":14974},{},[14975],{"type":23,"value":12661},{"type":17,"tag":29,"props":14977,"children":14978},{},[14979],{"type":17,"tag":48,"props":14980,"children":14981},{},[14982],{"type":23,"value":14983},"Chatbots and AI assistants",{"type":17,"tag":29,"props":14985,"children":14986},{},[14987],{"type":23,"value":14988},"Respond to messages, automate workflows, and provide real-time support inside Slack, Teams, or Discord.",{"type":17,"tag":29,"props":14990,"children":14991},{},[14992],{"type":17,"tag":48,"props":14993,"children":14994},{},[14995],{"type":23,"value":14996},"Customer support and engagement",{"type":17,"tag":29,"props":14998,"children":14999},{},[15000],{"type":23,"value":15001},"Sync conversations from Intercom, Zendesk, or email into a unified view.",{"type":17,"tag":29,"props":15003,"children":15004},{},[15005],{"type":17,"tag":48,"props":15006,"children":15007},{},[15008],{"type":23,"value":15009},"Internal workflow automation",{"type":17,"tag":29,"props":15011,"children":15012},{},[15013],{"type":23,"value":15014},"Trigger actions based on messages (e.g., create tickets, assign tasks, notify teams).",{"type":17,"tag":29,"props":15016,"children":15017},{},[15018],{"type":17,"tag":48,"props":15019,"children":15020},{},[15021],{"type":23,"value":15022},"Communication analytics",{"type":17,"tag":29,"props":15024,"children":15025},{},[15026],{"type":23,"value":15027},"Analyze message volume, sentiment, response time, and engagement patterns.",{"type":17,"tag":29,"props":15029,"children":15030},{},[15031],{"type":17,"tag":48,"props":15032,"children":15033},{},[15034],{"type":23,"value":15035},"Cross-platform messaging",{"type":17,"tag":29,"props":15037,"children":15038},{},[15039],{"type":23,"value":15040},"Bridge communication between platforms (e.g., Slack ↔ Teams).",{"type":17,"tag":29,"props":15042,"children":15043},{},[15044],{"type":17,"tag":48,"props":15045,"children":15046},{},[15047],{"type":23,"value":15048},"AI copilots and agents",{"type":17,"tag":29,"props":15050,"children":15051},{},[15052],{"type":23,"value":15053},"Use messaging data as context for summarization, classification, and automation.",{"type":17,"tag":29,"props":15055,"children":15056},{},[15057],{"type":23,"value":15058},"Messaging platforms are often where work actually happens. That makes them critical integration points.",{"type":17,"tag":68,"props":15060,"children":15062},{"id":15061},"_17-messaging-apis-developers-integrate-with",[15063],{"type":23,"value":14898},{"type":17,"tag":29,"props":15065,"children":15066},{},[15067],{"type":23,"value":15068},"Below are some of the most commonly integrated messaging platforms.",{"type":17,"tag":239,"props":15070,"children":15072},{"id":15071},"slack-api",[15073],{"type":23,"value":15074},"Slack API",{"type":17,"tag":29,"props":15076,"children":15077},{},[15078],{"type":17,"tag":133,"props":15079,"children":15082},{"href":15080,"rel":15081},"https://api.slack.com/",[214],[15083],{"type":23,"value":15074},{"type":17,"tag":29,"props":15085,"children":15086},{},[15087],{"type":23,"value":15088},"One of the most widely used messaging platforms for teams.",{"type":17,"tag":29,"props":15090,"children":15091},{},[15092],{"type":23,"value":15093},"Common use cases:",{"type":17,"tag":80,"props":15095,"children":15096},{},[15097,15102,15107,15112],{"type":17,"tag":84,"props":15098,"children":15099},{},[15100],{"type":23,"value":15101},"bots and automation",{"type":17,"tag":84,"props":15103,"children":15104},{},[15105],{"type":23,"value":15106},"channel and message retrieval",{"type":17,"tag":84,"props":15108,"children":15109},{},[15110],{"type":23,"value":15111},"workflow triggers",{"type":17,"tag":84,"props":15113,"children":15114},{},[15115],{"type":23,"value":15116},"notifications",{"type":17,"tag":239,"props":15118,"children":15119},{"id":14053},[15120],{"type":23,"value":14056},{"type":17,"tag":29,"props":15122,"children":15123},{},[15124],{"type":17,"tag":133,"props":15125,"children":15128},{"href":15126,"rel":15127},"https://learn.microsoft.com/en-us/graph/api/resources/teams-api-overview",[214],[15129],{"type":23,"value":14056},{"type":17,"tag":29,"props":15131,"children":15132},{},[15133],{"type":23,"value":15134},"Used heavily in enterprise environments.",{"type":17,"tag":29,"props":15136,"children":15137},{},[15138],{"type":23,"value":12778},{"type":17,"tag":80,"props":15140,"children":15141},{},[15142,15147,15152],{"type":17,"tag":84,"props":15143,"children":15144},{},[15145],{"type":23,"value":15146},"chats and channels",{"type":17,"tag":84,"props":15148,"children":15149},{},[15150],{"type":23,"value":15151},"meetings and events",{"type":17,"tag":84,"props":15153,"children":15154},{},[15155],{"type":23,"value":15156},"enterprise communication workflows",{"type":17,"tag":239,"props":15158,"children":15160},{"id":15159},"gmail-api",[15161],{"type":23,"value":15162},"Gmail API",{"type":17,"tag":29,"props":15164,"children":15165},{},[15166],{"type":17,"tag":133,"props":15167,"children":15169},{"href":14874,"rel":15168},[214],[15170],{"type":23,"value":15162},{"type":17,"tag":29,"props":15172,"children":15173},{},[15174],{"type":23,"value":15175},"Email is still a core messaging layer.",{"type":17,"tag":29,"props":15177,"children":15178},{},[15179],{"type":23,"value":13970},{"type":17,"tag":80,"props":15181,"children":15182},{},[15183,15188,15193,15198],{"type":17,"tag":84,"props":15184,"children":15185},{},[15186],{"type":23,"value":15187},"reading inbox messages",{"type":17,"tag":84,"props":15189,"children":15190},{},[15191],{"type":23,"value":15192},"sending emails",{"type":17,"tag":84,"props":15194,"children":15195},{},[15196],{"type":23,"value":15197},"thread management",{"type":17,"tag":84,"props":15199,"children":15200},{},[15201],{"type":23,"value":15202},"building AI email assistants",{"type":17,"tag":239,"props":15204,"children":15206},{"id":15205},"microsoft-outlook-api",[15207],{"type":23,"value":15208},"Microsoft Outlook API",{"type":17,"tag":29,"props":15210,"children":15211},{},[15212],{"type":17,"tag":133,"props":15213,"children":15216},{"href":15214,"rel":15215},"https://learn.microsoft.com/en-us/graph/api/resources/mail-api-overview",[214],[15217],{"type":23,"value":15218},"Outlook API",{"type":17,"tag":29,"props":15220,"children":15221},{},[15222],{"type":23,"value":15223},"Part of Microsoft Graph.",{"type":17,"tag":29,"props":15225,"children":15226},{},[15227],{"type":23,"value":13970},{"type":17,"tag":80,"props":15229,"children":15230},{},[15231,15236,15241],{"type":17,"tag":84,"props":15232,"children":15233},{},[15234],{"type":23,"value":15235},"email access",{"type":17,"tag":84,"props":15237,"children":15238},{},[15239],{"type":23,"value":15240},"message threads",{"type":17,"tag":84,"props":15242,"children":15243},{},[15244],{"type":23,"value":15245},"calendar-linked communication",{"type":17,"tag":239,"props":15247,"children":15249},{"id":15248},"discord-api",[15250],{"type":23,"value":15251},"Discord API",{"type":17,"tag":29,"props":15253,"children":15254},{},[15255],{"type":17,"tag":133,"props":15256,"children":15259},{"href":15257,"rel":15258},"https://discord.com/developers/docs/intro",[214],[15260],{"type":23,"value":15251},{"type":17,"tag":29,"props":15262,"children":15263},{},[15264],{"type":23,"value":15265},"Popular in developer and community-driven environments.",{"type":17,"tag":29,"props":15267,"children":15268},{},[15269],{"type":23,"value":13970},{"type":17,"tag":80,"props":15271,"children":15272},{},[15273,15278,15283],{"type":17,"tag":84,"props":15274,"children":15275},{},[15276],{"type":23,"value":15277},"community messaging",{"type":17,"tag":84,"props":15279,"children":15280},{},[15281],{"type":23,"value":15282},"bots",{"type":17,"tag":84,"props":15284,"children":15285},{},[15286],{"type":23,"value":15287},"event-driven workflows",{"type":17,"tag":239,"props":15289,"children":15291},{"id":15290},"intercom-api",[15292],{"type":23,"value":15293},"Intercom API",{"type":17,"tag":29,"props":15295,"children":15296},{},[15297],{"type":17,"tag":133,"props":15298,"children":15301},{"href":15299,"rel":15300},"https://developers.intercom.com/",[214],[15302],{"type":23,"value":15293},{"type":17,"tag":29,"props":15304,"children":15305},{},[15306],{"type":23,"value":15307},"Customer messaging and support platform.",{"type":17,"tag":29,"props":15309,"children":15310},{},[15311],{"type":23,"value":13970},{"type":17,"tag":80,"props":15313,"children":15314},{},[15315,15320,15325],{"type":17,"tag":84,"props":15316,"children":15317},{},[15318],{"type":23,"value":15319},"customer conversations",{"type":17,"tag":84,"props":15321,"children":15322},{},[15323],{"type":23,"value":15324},"support automation",{"type":17,"tag":84,"props":15326,"children":15327},{},[15328],{"type":23,"value":15329},"chat-based workflows",{"type":17,"tag":239,"props":15331,"children":15333},{"id":15332},"zendesk-api",[15334],{"type":23,"value":15335},"Zendesk API",{"type":17,"tag":29,"props":15337,"children":15338},{},[15339],{"type":17,"tag":133,"props":15340,"children":15343},{"href":15341,"rel":15342},"https://developer.zendesk.com/api-reference/",[214],[15344],{"type":23,"value":15335},{"type":17,"tag":29,"props":15346,"children":15347},{},[15348],{"type":23,"value":15349},"Combines ticketing and messaging.",{"type":17,"tag":239,"props":15351,"children":15352},{"id":14137},[15353],{"type":23,"value":14140},{"type":17,"tag":29,"props":15355,"children":15356},{},[15357],{"type":17,"tag":133,"props":15358,"children":15360},{"href":14146,"rel":15359},[214],[15361],{"type":23,"value":14140},{"type":17,"tag":29,"props":15363,"children":15364},{},[15365],{"type":23,"value":15366},"Used for messaging and voice communication.",{"type":17,"tag":239,"props":15368,"children":15369},{"id":14116},[15370],{"type":23,"value":14119},{"type":17,"tag":29,"props":15372,"children":15373},{},[15374],{"type":17,"tag":133,"props":15375,"children":15377},{"href":14125,"rel":15376},[214],[15378],{"type":23,"value":14119},{"type":17,"tag":29,"props":15380,"children":15381},{},[15382],{"type":23,"value":15383},"Enterprise messaging and collaboration.",{"type":17,"tag":239,"props":15385,"children":15387},{"id":15386},"zoho-mail-api",[15388],{"type":23,"value":15389},"Zoho Mail API",{"type":17,"tag":29,"props":15391,"children":15392},{},[15393],{"type":17,"tag":133,"props":15394,"children":15397},{"href":15395,"rel":15396},"https://www.zoho.com/mail/help/api/",[214],[15398],{"type":23,"value":15389},{"type":17,"tag":29,"props":15400,"children":15401},{},[15402],{"type":23,"value":15403},"Email and messaging platform.",{"type":17,"tag":239,"props":15405,"children":15407},{"id":15406},"imap",[15408],{"type":23,"value":15409},"IMAP",{"type":17,"tag":29,"props":15411,"children":15412},{},[15413],{"type":17,"tag":133,"props":15414,"children":15417},{"href":15415,"rel":15416},"https://datatracker.ietf.org/doc/html/rfc3501",[214],[15418],{"type":23,"value":15419},"IMAP Protocol",{"type":17,"tag":29,"props":15421,"children":15422},{},[15423],{"type":23,"value":15424},"Used for accessing email across providers.",{"type":17,"tag":239,"props":15426,"children":15428},{"id":15427},"linkedin-messaging-api",[15429],{"type":23,"value":15430},"LinkedIn Messaging API",{"type":17,"tag":29,"props":15432,"children":15433},{},[15434],{"type":17,"tag":133,"props":15435,"children":15438},{"href":15436,"rel":15437},"https://learn.microsoft.com/en-us/linkedin/",[214],[15439],{"type":23,"value":15440},"LinkedIn API",{"type":17,"tag":29,"props":15442,"children":15443},{},[15444],{"type":23,"value":15445},"Used for professional messaging workflows.",{"type":17,"tag":239,"props":15447,"children":15449},{"id":15448},"circleso-api",[15450],{"type":23,"value":15451},"Circle.so API",{"type":17,"tag":29,"props":15453,"children":15454},{},[15455],{"type":17,"tag":133,"props":15456,"children":15459},{"href":15457,"rel":15458},"https://circle.so/",[214],[15460],{"type":23,"value":15461},"Circle",{"type":17,"tag":29,"props":15463,"children":15464},{},[15465],{"type":23,"value":15466},"Community-based messaging platform.",{"type":17,"tag":239,"props":15468,"children":15469},{"id":13009},[15470],{"type":23,"value":13012},{"type":17,"tag":29,"props":15472,"children":15473},{},[15474],{"type":23,"value":13017},{"type":17,"tag":80,"props":15476,"children":15477},{},[15478,15487,15497,15507],{"type":17,"tag":84,"props":15479,"children":15480},{},[15481],{"type":17,"tag":133,"props":15482,"children":15484},{"href":14041,"rel":15483},[214],[15485],{"type":23,"value":15486},"Google Workspace",{"type":17,"tag":84,"props":15488,"children":15489},{},[15490],{"type":17,"tag":133,"props":15491,"children":15494},{"href":15492,"rel":15493},"https://developers.freshdesk.com/",[214],[15495],{"type":23,"value":15496},"Freshdesk Messaging",{"type":17,"tag":84,"props":15498,"children":15499},{},[15500],{"type":17,"tag":133,"props":15501,"children":15504},{"href":15502,"rel":15503},"https://api.slack.com/bot-users",[214],[15505],{"type":23,"value":15506},"Slack Bots",{"type":17,"tag":84,"props":15508,"children":15509},{},[15510],{"type":17,"tag":133,"props":15511,"children":15514},{"href":15512,"rel":15513},"https://learn.microsoft.com/en-us/microsoftteams/platform/bots/what-are-bots",[214],[15515],{"type":23,"value":15516},"Microsoft Teams Bots",{"type":17,"tag":29,"props":15518,"children":15519},{},[15520],{"type":23,"value":15521},"The messaging ecosystem is fragmented, and most SaaS products need to support multiple platforms simultaneously.",{"type":17,"tag":68,"props":15523,"children":15525},{"id":15524},"challenges-when-integrating-messaging-apis",[15526],{"type":23,"value":15527},"Challenges when integrating messaging APIs",{"type":17,"tag":29,"props":15529,"children":15530},{},[15531],{"type":23,"value":15532},"Messaging integrations introduce complexity beyond simple data access.",{"type":17,"tag":239,"props":15534,"children":15536},{"id":15535},"different-threading-models",[15537],{"type":23,"value":15538},"Different threading models",{"type":17,"tag":29,"props":15540,"children":15541},{},[15542],{"type":23,"value":15543},"Slack threads, email threads, and Teams conversations all behave differently.",{"type":17,"tag":239,"props":15545,"children":15547},{"id":15546},"different-event-systems",[15548],{"type":23,"value":15549},"Different event systems",{"type":17,"tag":29,"props":15551,"children":15552},{},[15553,15555,15559],{"type":23,"value":15554},"Some platforms rely heavily on ",{"type":17,"tag":133,"props":15556,"children":15557},{"href":4999},[15558],{"type":23,"value":5002},{"type":23,"value":15560},", others on polling or hybrid models.",{"type":17,"tag":239,"props":15562,"children":15564},{"id":15563},"different-permission-models",[15565],{"type":23,"value":15566},"Different permission models",{"type":17,"tag":29,"props":15568,"children":15569},{},[15570],{"type":23,"value":15571},"Scopes and access control vary significantly across providers.",{"type":17,"tag":239,"props":15573,"children":15575},{"id":15574},"different-message-formats",[15576],{"type":23,"value":15577},"Different message formats",{"type":17,"tag":29,"props":15579,"children":15580},{},[15581],{"type":23,"value":15582},"Plain text, HTML, markdown, attachments, reactions, and metadata differ across systems.",{"type":17,"tag":239,"props":15584,"children":15585},{"id":14342},[15586],{"type":23,"value":14345},{"type":17,"tag":29,"props":15588,"children":15589},{},[15590],{"type":23,"value":15591},"Messaging integrations often require real-time updates, not delayed syncs.",{"type":17,"tag":239,"props":15593,"children":15595},{"id":15594},"compliance-and-data-sensitivity",[15596],{"type":23,"value":15597},"Compliance and data sensitivity",{"type":17,"tag":29,"props":15599,"children":15600},{},[15601],{"type":23,"value":15602},"Messaging data often contains sensitive information, requiring careful handling.",{"type":17,"tag":29,"props":15604,"children":15605},{},[15606],{"type":23,"value":15607},"As you add more platforms, these differences compound quickly.",{"type":17,"tag":68,"props":15609,"children":15611},{"id":15610},"the-role-of-unified-messaging-apis",[15612],{"type":23,"value":15613},"The role of unified messaging APIs",{"type":17,"tag":29,"props":15615,"children":15616},{},[15617],{"type":23,"value":15618},"A unified messaging API standardizes communication data across platforms.",{"type":17,"tag":29,"props":15620,"children":15621},{},[15622],{"type":23,"value":15623},"Instead of building separate integrations for Slack, Teams, Gmail, and others, you:",{"type":17,"tag":80,"props":15625,"children":15626},{},[15627,15631,15636,15641,15646],{"type":17,"tag":84,"props":15628,"children":15629},{},[15630],{"type":23,"value":13201},{"type":17,"tag":84,"props":15632,"children":15633},{},[15634],{"type":23,"value":15635},"use consistent message and channel models",{"type":17,"tag":84,"props":15637,"children":15638},{},[15639],{"type":23,"value":15640},"handle threads the same way",{"type":17,"tag":84,"props":15642,"children":15643},{},[15644],{"type":23,"value":15645},"receive standardized events",{"type":17,"tag":84,"props":15647,"children":15648},{},[15649],{"type":23,"value":15650},"avoid platform-specific edge cases",{"type":17,"tag":29,"props":15652,"children":15653},{},[15654],{"type":23,"value":15655},"This simplifies both development and long-term maintenance.",{"type":17,"tag":68,"props":15657,"children":15659},{"id":15658},"build-once-with-the-unified-messaging-api",[15660],{"type":23,"value":15661},"Build once with the Unified Messaging API",{"type":17,"tag":29,"props":15663,"children":15664},{},[15665,15667,15672],{"type":23,"value":15666},"The Unified Messaging API enables access to ",{"type":17,"tag":48,"props":15668,"children":15669},{},[15670],{"type":23,"value":15671},"17+ messaging integrations through a single API",{"type":23,"value":54},{"type":17,"tag":29,"props":15674,"children":15675},{},[15676],{"type":23,"value":13248},{"type":17,"tag":80,"props":15678,"children":15679},{},[15680,15688,15696,15704,15712,15721,15730,15739,15747,15755,15764],{"type":17,"tag":84,"props":15681,"children":15682},{},[15683],{"type":17,"tag":133,"props":15684,"children":15686},{"href":14860,"rel":15685},[214],[15687],{"type":23,"value":3204},{"type":17,"tag":84,"props":15689,"children":15690},{},[15691],{"type":17,"tag":133,"props":15692,"children":15694},{"href":14867,"rel":15693},[214],[15695],{"type":23,"value":14066},{"type":17,"tag":84,"props":15697,"children":15698},{},[15699],{"type":17,"tag":133,"props":15700,"children":15702},{"href":14874,"rel":15701},[214],[15703],{"type":23,"value":14878},{"type":17,"tag":84,"props":15705,"children":15706},{},[15707],{"type":17,"tag":133,"props":15708,"children":15710},{"href":15214,"rel":15709},[214],[15711],{"type":23,"value":14455},{"type":17,"tag":84,"props":15713,"children":15714},{},[15715],{"type":17,"tag":133,"props":15716,"children":15718},{"href":15257,"rel":15717},[214],[15719],{"type":23,"value":15720},"Discord",{"type":17,"tag":84,"props":15722,"children":15723},{},[15724],{"type":17,"tag":133,"props":15725,"children":15727},{"href":15299,"rel":15726},[214],[15728],{"type":23,"value":15729},"Intercom",{"type":17,"tag":84,"props":15731,"children":15732},{},[15733],{"type":17,"tag":133,"props":15734,"children":15736},{"href":15341,"rel":15735},[214],[15737],{"type":23,"value":15738},"Zendesk",{"type":17,"tag":84,"props":15740,"children":15741},{},[15742],{"type":17,"tag":133,"props":15743,"children":15745},{"href":14146,"rel":15744},[214],[15746],{"type":23,"value":14150},{"type":17,"tag":84,"props":15748,"children":15749},{},[15750],{"type":17,"tag":133,"props":15751,"children":15753},{"href":14125,"rel":15752},[214],[15754],{"type":23,"value":14129},{"type":17,"tag":84,"props":15756,"children":15757},{},[15758],{"type":17,"tag":133,"props":15759,"children":15761},{"href":15395,"rel":15760},[214],[15762],{"type":23,"value":15763},"Zoho Mail",{"type":17,"tag":84,"props":15765,"children":15766},{},[15767],{"type":23,"value":15768},"and more",{"type":17,"tag":239,"props":15770,"children":15772},{"id":15771},"unified-messaging-objects",[15773],{"type":23,"value":15774},"Unified messaging objects",{"type":17,"tag":29,"props":15776,"children":15777},{},[15778],{"type":23,"value":15779},"Unified standardizes messaging into core objects:",{"type":17,"tag":29,"props":15781,"children":15782},{},[15783],{"type":17,"tag":48,"props":15784,"children":15785},{},[15786],{"type":23,"value":15787},"Channel",{"type":17,"tag":29,"props":15789,"children":15790},{},[15791],{"type":23,"value":15792},"Represents conversations, channels, rooms, or threads.",{"type":17,"tag":29,"props":15794,"children":15795},{},[15796],{"type":17,"tag":48,"props":15797,"children":15798},{},[15799],{"type":23,"value":15800},"Message",{"type":17,"tag":29,"props":15802,"children":15803},{},[15804],{"type":23,"value":15805},"Represents individual messages, including content, attachments, and metadata.",{"type":17,"tag":29,"props":15807,"children":15808},{},[15809],{"type":17,"tag":48,"props":15810,"children":15811},{},[15812],{"type":23,"value":14528},{"type":17,"tag":29,"props":15814,"children":15815},{},[15816],{"type":23,"value":15817},"Represents reactions, updates, and activity across messaging systems.",{"type":17,"tag":29,"props":15819,"children":15820},{},[15821],{"type":23,"value":15822},"These objects support consistent methods across platforms.",{"type":17,"tag":68,"props":15824,"children":15826},{"id":15825},"why-teams-choose-unifiedto-for-messaging-integrations",[15827],{"type":23,"value":15828},"Why teams choose Unified.to for messaging integrations",{"type":17,"tag":239,"props":15830,"children":15831},{"id":13402},[15832],{"type":23,"value":13405},{"type":17,"tag":29,"props":15834,"children":15835},{},[15836],{"type":23,"value":15837},"Every request hits the source platform live. No cached messages, no delayed syncs.",{"type":17,"tag":239,"props":15839,"children":15840},{"id":13413},[15841],{"type":23,"value":13416},{"type":17,"tag":29,"props":15843,"children":15844},{},[15845],{"type":23,"value":15846},"Messaging data is never stored at rest, reducing risk for sensitive communication data.",{"type":17,"tag":239,"props":15848,"children":15850},{"id":15849},"unified-threading-model",[15851],{"type":23,"value":15852},"Unified threading model",{"type":17,"tag":29,"props":15854,"children":15855},{},[15856,15858,15864],{"type":23,"value":15857},"Threading is normalized using ",{"type":17,"tag":6121,"props":15859,"children":15861},{"className":15860},[],[15862],{"type":23,"value":15863},"parent_id",{"type":23,"value":15865},", making it easier to reconstruct conversations across platforms.",{"type":17,"tag":239,"props":15867,"children":15869},{"id":15868},"one-api-across-all-messaging-platforms",[15870],{"type":23,"value":15871},"One API across all messaging platforms",{"type":17,"tag":29,"props":15873,"children":15874},{},[15875],{"type":23,"value":15876},"No need to build separate integrations for Slack, Teams, Gmail, and others.",{"type":17,"tag":239,"props":15878,"children":15880},{"id":15879},"built-for-ai-and-automation",[15881],{"type":23,"value":15882},"Built for AI and automation",{"type":17,"tag":29,"props":15884,"children":15885},{},[15886],{"type":23,"value":15887},"Messaging data can be used directly in:",{"type":17,"tag":80,"props":15889,"children":15890},{},[15891,15896,15901,15906],{"type":17,"tag":84,"props":15892,"children":15893},{},[15894],{"type":23,"value":15895},"AI copilots",{"type":17,"tag":84,"props":15897,"children":15898},{},[15899],{"type":23,"value":15900},"conversation summarization",{"type":17,"tag":84,"props":15902,"children":15903},{},[15904],{"type":23,"value":15905},"sentiment analysis",{"type":17,"tag":84,"props":15907,"children":15908},{},[15909],{"type":23,"value":424},{"type":17,"tag":68,"props":15911,"children":15913},{"id":15912},"common-use-cases-for-a-unified-messaging-api",[15914],{"type":23,"value":15915},"Common use cases for a unified messaging API",{"type":17,"tag":239,"props":15917,"children":15919},{"id":15918},"ai-conversation-analysis",[15920],{"type":23,"value":15921},"AI conversation analysis",{"type":17,"tag":29,"props":15923,"children":15924},{},[15925],{"type":23,"value":15926},"Summarize conversations, detect sentiment, and extract insights across platforms.",{"type":17,"tag":239,"props":15928,"children":15930},{"id":15929},"chatbots-and-assistants",[15931],{"type":23,"value":15932},"Chatbots and assistants",{"type":17,"tag":29,"props":15934,"children":15935},{},[15936],{"type":23,"value":15937},"Build once and deploy across Slack, Teams, Discord, and email.",{"type":17,"tag":239,"props":15939,"children":15940},{"id":13496},[15941],{"type":23,"value":12682},{"type":17,"tag":29,"props":15943,"children":15944},{},[15945],{"type":23,"value":15946},"Trigger actions based on messages, keywords, or events.",{"type":17,"tag":239,"props":15948,"children":15950},{"id":15949},"customer-support-aggregation",[15951],{"type":23,"value":15952},"Customer support aggregation",{"type":17,"tag":29,"props":15954,"children":15955},{},[15956],{"type":23,"value":15957},"Combine support conversations from multiple tools into one system.",{"type":17,"tag":239,"props":15959,"children":15961},{"id":15960},"cross-platform-communication-tools",[15962],{"type":23,"value":15963},"Cross-platform communication tools",{"type":17,"tag":29,"props":15965,"children":15966},{},[15967],{"type":23,"value":15968},"Bridge conversations across different messaging platforms.",{"type":17,"tag":68,"props":15970,"children":15971},{"id":1552},[15972],{"type":23,"value":1555},{"type":17,"tag":29,"props":15974,"children":15975},{},[15976],{"type":23,"value":15977},"Messaging APIs are foundational for modern SaaS products.",{"type":17,"tag":29,"props":15979,"children":15980},{},[15981],{"type":23,"value":15982},"But building and maintaining integrations across multiple communication platforms introduces significant complexity.",{"type":17,"tag":29,"props":15984,"children":15985},{},[15986],{"type":23,"value":15987},"A unified messaging API removes that complexity by standardizing how messaging data is accessed and used.",{"type":17,"tag":29,"props":15989,"children":15990},{},[15991],{"type":23,"value":15992},"Instead of managing multiple APIs, threading models, and event systems, you work with one consistent interface.",{"type":17,"tag":29,"props":15994,"children":15995},{},[15996],{"type":23,"value":15997},"That allows teams to build faster, support more platforms, and focus on product logic instead of integration maintenance.",{"type":17,"tag":29,"props":15999,"children":16000},{},[16001,16002],{"type":23,"value":1609},{"type":17,"tag":133,"props":16003,"children":16005},{"href":1612,"rel":16004},[214],[16006],{"type":23,"value":1616},{"type":17,"tag":29,"props":16008,"children":16009},{},[16010,16011],{"type":23,"value":1609},{"type":17,"tag":133,"props":16012,"children":16014},{"href":1623,"rel":16013},[214],[16015],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":16017},[16018,16019,16020,16036,16044,16045,16048,16055,16062],{"id":14903,"depth":1629,"text":14906},{"id":14963,"depth":1629,"text":14966},{"id":15061,"depth":1629,"text":14898,"children":16021},[16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035],{"id":15071,"depth":1635,"text":15074},{"id":14053,"depth":1635,"text":14056},{"id":15159,"depth":1635,"text":15162},{"id":15205,"depth":1635,"text":15208},{"id":15248,"depth":1635,"text":15251},{"id":15290,"depth":1635,"text":15293},{"id":15332,"depth":1635,"text":15335},{"id":14137,"depth":1635,"text":14140},{"id":14116,"depth":1635,"text":14119},{"id":15386,"depth":1635,"text":15389},{"id":15406,"depth":1635,"text":15409},{"id":15427,"depth":1635,"text":15430},{"id":15448,"depth":1635,"text":15451},{"id":13009,"depth":1635,"text":13012},{"id":15524,"depth":1629,"text":15527,"children":16037},[16038,16039,16040,16041,16042,16043],{"id":15535,"depth":1635,"text":15538},{"id":15546,"depth":1635,"text":15549},{"id":15563,"depth":1635,"text":15566},{"id":15574,"depth":1635,"text":15577},{"id":14342,"depth":1635,"text":14345},{"id":15594,"depth":1635,"text":15597},{"id":15610,"depth":1629,"text":15613},{"id":15658,"depth":1629,"text":15661,"children":16046},[16047],{"id":15771,"depth":1635,"text":15774},{"id":15825,"depth":1629,"text":15828,"children":16049},[16050,16051,16052,16053,16054],{"id":13402,"depth":1635,"text":13405},{"id":13413,"depth":1635,"text":13416},{"id":15849,"depth":1635,"text":15852},{"id":15868,"depth":1635,"text":15871},{"id":15879,"depth":1635,"text":15882},{"id":15912,"depth":1629,"text":15915,"children":16056},[16057,16058,16059,16060,16061],{"id":15918,"depth":1635,"text":15921},{"id":15929,"depth":1635,"text":15932},{"id":13496,"depth":1635,"text":12682},{"id":15949,"depth":1635,"text":15952},{"id":15960,"depth":1635,"text":15963},{"id":1552,"depth":1629,"text":1555},"content:blog:17_messaging_apis_to_integrate_with_slack_microsoft_teams_gmail_and_unified_messaging_apis.md","blog/17_messaging_apis_to_integrate_with_slack_microsoft_teams_gmail_and_unified_messaging_apis.md","blog/17_messaging_apis_to_integrate_with_slack_microsoft_teams_gmail_and_unified_messaging_apis",{"_path":16067,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":16068,"description":16069,"img":16070,"date":16071,"tag":12,"body":16072,"_type":1677,"_id":17327,"_source":1679,"_file":17328,"_stem":17329,"_extension":1682},"/blog/11_generative_ai_apis_to_integrate_with_openai_anthropic_gemini_and_unified_ai_infrastructure","11 Generative AI APIs to Integrate With: OpenAI, Anthropic, Gemini and Unified AI Infrastructure","Generative AI is no longer a single-provider decision.","https://s3.us-east-2.amazonaws.com/unified-article-images/11_generative_ai_apis_to_integrate_with_openai_anthropic_gemini_and_unified_ai_infrastructure-icon.png","2026-03-25T00:34:00.000Z",{"type":14,"children":16073,"toc":17283},[16074,16079,16082,16089,16093,16123,16154,16159,16164,16174,16180,16192,16196,16234,16239,16245,16250,16255,16263,16268,16276,16281,16289,16294,16302,16307,16315,16320,16325,16331,16336,16342,16350,16355,16359,16385,16391,16399,16404,16408,16426,16432,16440,16445,16449,16467,16473,16483,16488,16492,16510,16516,16526,16531,16535,16552,16558,16568,16573,16577,16590,16596,16606,16611,16615,16633,16639,16649,16654,16658,16671,16677,16687,16692,16698,16708,16713,16719,16729,16734,16740,16745,16750,16756,16761,16767,16772,16778,16783,16789,16794,16800,16805,16810,16816,16821,16826,16854,16859,16865,16883,16888,16979,16985,16990,16998,17003,17011,17016,17024,17029,17034,17040,17046,17051,17057,17062,17068,17073,17079,17084,17105,17111,17116,17122,17127,17150,17155,17161,17167,17172,17177,17182,17187,17192,17198,17203,17208,17213,17217,17222,17227,17255,17260,17265,17274],{"type":17,"tag":18,"props":16075,"children":16077},{"id":16076},"_11-generative-ai-apis-to-integrate-with-openai-anthropic-gemini-and-unified-ai-infrastructure",[16078],{"type":23,"value":16068},{"type":17,"tag":25,"props":16080,"children":16081},{},[],{"type":17,"tag":29,"props":16083,"children":16084},{},[16085],{"type":17,"tag":33,"props":16086,"children":16087},{},[16088],{"type":23,"value":12535},{"type":17,"tag":29,"props":16090,"children":16091},{},[16092],{"type":23,"value":16069},{"type":17,"tag":29,"props":16094,"children":16095},{},[16096,16098,16105,16106,16113,16114,16121],{"type":23,"value":16097},"Most AI-native SaaS products now need to support multiple models across providers like ",{"type":17,"tag":133,"props":16099,"children":16102},{"href":16100,"rel":16101},"https://platform.openai.com/",[214],[16103],{"type":23,"value":16104},"OpenAI",{"type":23,"value":11826},{"type":17,"tag":133,"props":16107,"children":16110},{"href":16108,"rel":16109},"https://www.anthropic.com/",[214],[16111],{"type":23,"value":16112},"Anthropic Claude",{"type":23,"value":12561},{"type":17,"tag":133,"props":16115,"children":16118},{"href":16116,"rel":16117},"https://ai.google.dev/",[214],[16119],{"type":23,"value":16120},"Google Gemini",{"type":23,"value":16122},". Teams are building:",{"type":17,"tag":80,"props":16124,"children":16125},{},[16126,16130,16135,16144,16149],{"type":17,"tag":84,"props":16127,"children":16128},{},[16129],{"type":23,"value":15895},{"type":17,"tag":84,"props":16131,"children":16132},{},[16133],{"type":23,"value":16134},"agent workflows",{"type":17,"tag":84,"props":16136,"children":16137},{},[16138,16142],{"type":17,"tag":133,"props":16139,"children":16140},{"href":5201},[16141],{"type":23,"value":5204},{"type":23,"value":16143}," pipelines",{"type":17,"tag":84,"props":16145,"children":16146},{},[16147],{"type":23,"value":16148},"embeddings infrastructure",{"type":17,"tag":84,"props":16150,"children":16151},{},[16152],{"type":23,"value":16153},"multi-model routing systems",{"type":17,"tag":29,"props":16155,"children":16156},{},[16157],{"type":23,"value":16158},"The problem is that every AI provider exposes a different API.",{"type":17,"tag":29,"props":16160,"children":16161},{},[16162],{"type":23,"value":16163},"Different request formats, different token handling, different model naming, different streaming behavior, and different error handling. Supporting multiple models quickly turns into fragmented infrastructure.",{"type":17,"tag":29,"props":16165,"children":16166},{},[16167,16169,16173],{"type":23,"value":16168},"This guide covers the top generative AI APIs developers integrate with, and how to simplify multi-model support using a ",{"type":17,"tag":133,"props":16170,"children":16171},{"href":7691},[16172],{"type":23,"value":7459},{"type":23,"value":54},{"type":17,"tag":68,"props":16175,"children":16177},{"id":16176},"what-is-a-generative-ai-api",[16178],{"type":23,"value":16179},"What is a Generative AI API?",{"type":17,"tag":29,"props":16181,"children":16182},{},[16183,16184,16190],{"type":23,"value":9619},{"type":17,"tag":133,"props":16185,"children":16187},{"href":16186},"/genai",[16188],{"type":23,"value":16189},"generative AI API",{"type":23,"value":16191}," allows your application to send prompts to AI models and receive structured or unstructured outputs.",{"type":17,"tag":29,"props":16193,"children":16194},{},[16195],{"type":23,"value":12607},{"type":17,"tag":80,"props":16197,"children":16198},{},[16199,16204,16209,16214,16219,16224,16229],{"type":17,"tag":84,"props":16200,"children":16201},{},[16202],{"type":23,"value":16203},"text generation",{"type":17,"tag":84,"props":16205,"children":16206},{},[16207],{"type":23,"value":16208},"chat completion",{"type":17,"tag":84,"props":16210,"children":16211},{},[16212],{"type":23,"value":16213},"embeddings",{"type":17,"tag":84,"props":16215,"children":16216},{},[16217],{"type":23,"value":16218},"multi-turn conversations",{"type":17,"tag":84,"props":16220,"children":16221},{},[16222],{"type":23,"value":16223},"tool or function calling",{"type":17,"tag":84,"props":16225,"children":16226},{},[16227],{"type":23,"value":16228},"structured outputs",{"type":17,"tag":84,"props":16230,"children":16231},{},[16232],{"type":23,"value":16233},"streaming responses",{"type":17,"tag":29,"props":16235,"children":16236},{},[16237],{"type":23,"value":16238},"Each provider offers similar capabilities, but the implementation details vary enough to create integration overhead.",{"type":17,"tag":68,"props":16240,"children":16242},{"id":16241},"why-saas-products-integrate-with-multiple-ai-apis",[16243],{"type":23,"value":16244},"Why SaaS products integrate with multiple AI APIs",{"type":17,"tag":29,"props":16246,"children":16247},{},[16248],{"type":23,"value":16249},"Most teams do not stick to one model anymore.",{"type":17,"tag":29,"props":16251,"children":16252},{},[16253],{"type":23,"value":16254},"Common reasons include:",{"type":17,"tag":29,"props":16256,"children":16257},{},[16258],{"type":17,"tag":48,"props":16259,"children":16260},{},[16261],{"type":23,"value":16262},"Model performance differences",{"type":17,"tag":29,"props":16264,"children":16265},{},[16266],{"type":23,"value":16267},"Some models perform better for reasoning, others for speed, others for cost.",{"type":17,"tag":29,"props":16269,"children":16270},{},[16271],{"type":17,"tag":48,"props":16272,"children":16273},{},[16274],{"type":23,"value":16275},"Fallback and reliability",{"type":17,"tag":29,"props":16277,"children":16278},{},[16279],{"type":23,"value":16280},"If one provider fails or rate limits, requests can be routed elsewhere.",{"type":17,"tag":29,"props":16282,"children":16283},{},[16284],{"type":17,"tag":48,"props":16285,"children":16286},{},[16287],{"type":23,"value":16288},"Cost optimization",{"type":17,"tag":29,"props":16290,"children":16291},{},[16292],{"type":23,"value":16293},"Different models have different pricing. Routing intelligently can reduce spend.",{"type":17,"tag":29,"props":16295,"children":16296},{},[16297],{"type":17,"tag":48,"props":16298,"children":16299},{},[16300],{"type":23,"value":16301},"Feature differences",{"type":17,"tag":29,"props":16303,"children":16304},{},[16305],{"type":23,"value":16306},"Some providers support better embeddings, tool calling, or longer context windows.",{"type":17,"tag":29,"props":16308,"children":16309},{},[16310],{"type":17,"tag":48,"props":16311,"children":16312},{},[16313],{"type":23,"value":16314},"Customer requirements",{"type":17,"tag":29,"props":16316,"children":16317},{},[16318],{"type":23,"value":16319},"Enterprise customers often require specific providers for compliance or internal standards.",{"type":17,"tag":29,"props":16321,"children":16322},{},[16323],{"type":23,"value":16324},"This is why multi-model AI architecture is becoming the default.",{"type":17,"tag":68,"props":16326,"children":16328},{"id":16327},"_11-generative-ai-apis-developers-integrate-with",[16329],{"type":23,"value":16330},"11 generative AI APIs developers integrate with",{"type":17,"tag":29,"props":16332,"children":16333},{},[16334],{"type":23,"value":16335},"Below are the most commonly used AI APIs across modern SaaS products.",{"type":17,"tag":239,"props":16337,"children":16339},{"id":16338},"openai-api",[16340],{"type":23,"value":16341},"OpenAI API",{"type":17,"tag":29,"props":16343,"children":16344},{},[16345],{"type":17,"tag":133,"props":16346,"children":16348},{"href":16100,"rel":16347},[214],[16349],{"type":23,"value":16104},{"type":17,"tag":29,"props":16351,"children":16352},{},[16353],{"type":23,"value":16354},"The most widely used generative AI API for chat, completions, embeddings, and tool calling.",{"type":17,"tag":29,"props":16356,"children":16357},{},[16358],{"type":23,"value":15093},{"type":17,"tag":80,"props":16360,"children":16361},{},[16362,16366,16371,16376,16381],{"type":17,"tag":84,"props":16363,"children":16364},{},[16365],{"type":23,"value":15895},{"type":17,"tag":84,"props":16367,"children":16368},{},[16369],{"type":23,"value":16370},"assistants",{"type":17,"tag":84,"props":16372,"children":16373},{},[16374],{"type":23,"value":16375},"chat interfaces",{"type":17,"tag":84,"props":16377,"children":16378},{},[16379],{"type":23,"value":16380},"embeddings for RAG",{"type":17,"tag":84,"props":16382,"children":16383},{},[16384],{"type":23,"value":16228},{"type":17,"tag":239,"props":16386,"children":16388},{"id":16387},"anthropic-claude-api",[16389],{"type":23,"value":16390},"Anthropic Claude API",{"type":17,"tag":29,"props":16392,"children":16393},{},[16394],{"type":17,"tag":133,"props":16395,"children":16397},{"href":16108,"rel":16396},[214],[16398],{"type":23,"value":16112},{"type":17,"tag":29,"props":16400,"children":16401},{},[16402],{"type":23,"value":16403},"Known for strong reasoning, long context windows, and enterprise-safe outputs.",{"type":17,"tag":29,"props":16405,"children":16406},{},[16407],{"type":23,"value":13970},{"type":17,"tag":80,"props":16409,"children":16410},{},[16411,16416,16421],{"type":17,"tag":84,"props":16412,"children":16413},{},[16414],{"type":23,"value":16415},"complex reasoning workflows",{"type":17,"tag":84,"props":16417,"children":16418},{},[16419],{"type":23,"value":16420},"enterprise AI assistants",{"type":17,"tag":84,"props":16422,"children":16423},{},[16424],{"type":23,"value":16425},"long-form analysis",{"type":17,"tag":239,"props":16427,"children":16429},{"id":16428},"google-gemini-api",[16430],{"type":23,"value":16431},"Google Gemini API",{"type":17,"tag":29,"props":16433,"children":16434},{},[16435],{"type":17,"tag":133,"props":16436,"children":16438},{"href":16116,"rel":16437},[214],[16439],{"type":23,"value":16120},{"type":17,"tag":29,"props":16441,"children":16442},{},[16443],{"type":23,"value":16444},"Google's AI platform for multimodal models and enterprise-scale AI infrastructure.",{"type":17,"tag":29,"props":16446,"children":16447},{},[16448],{"type":23,"value":13970},{"type":17,"tag":80,"props":16450,"children":16451},{},[16452,16457,16462],{"type":17,"tag":84,"props":16453,"children":16454},{},[16455],{"type":23,"value":16456},"multimodal inputs",{"type":17,"tag":84,"props":16458,"children":16459},{},[16460],{"type":23,"value":16461},"enterprise AI tooling",{"type":17,"tag":84,"props":16463,"children":16464},{},[16465],{"type":23,"value":16466},"integrations with Google ecosystem",{"type":17,"tag":239,"props":16468,"children":16470},{"id":16469},"azure-openai-api",[16471],{"type":23,"value":16472},"Azure OpenAI API",{"type":17,"tag":29,"props":16474,"children":16475},{},[16476],{"type":17,"tag":133,"props":16477,"children":16480},{"href":16478,"rel":16479},"https://learn.microsoft.com/en-us/azure/ai-services/openai/",[214],[16481],{"type":23,"value":16482},"Azure OpenAI",{"type":17,"tag":29,"props":16484,"children":16485},{},[16486],{"type":23,"value":16487},"Enterprise deployment of OpenAI models with Microsoft infrastructure and compliance controls.",{"type":17,"tag":29,"props":16489,"children":16490},{},[16491],{"type":23,"value":13970},{"type":17,"tag":80,"props":16493,"children":16494},{},[16495,16500,16505],{"type":17,"tag":84,"props":16496,"children":16497},{},[16498],{"type":23,"value":16499},"enterprise AI deployments",{"type":17,"tag":84,"props":16501,"children":16502},{},[16503],{"type":23,"value":16504},"regulated environments",{"type":17,"tag":84,"props":16506,"children":16507},{},[16508],{"type":23,"value":16509},"Azure-native products",{"type":17,"tag":239,"props":16511,"children":16513},{"id":16512},"cohere-api",[16514],{"type":23,"value":16515},"Cohere API",{"type":17,"tag":29,"props":16517,"children":16518},{},[16519],{"type":17,"tag":133,"props":16520,"children":16523},{"href":16521,"rel":16522},"https://cohere.com/",[214],[16524],{"type":23,"value":16525},"Cohere",{"type":17,"tag":29,"props":16527,"children":16528},{},[16529],{"type":23,"value":16530},"Strong focus on embeddings, classification, and enterprise NLP.",{"type":17,"tag":29,"props":16532,"children":16533},{},[16534],{"type":23,"value":13970},{"type":17,"tag":80,"props":16536,"children":16537},{},[16538,16543,16547],{"type":17,"tag":84,"props":16539,"children":16540},{},[16541],{"type":23,"value":16542},"semantic search",{"type":17,"tag":84,"props":16544,"children":16545},{},[16546],{"type":23,"value":16213},{"type":17,"tag":84,"props":16548,"children":16549},{},[16550],{"type":23,"value":16551},"classification tasks",{"type":17,"tag":239,"props":16553,"children":16555},{"id":16554},"mistral-ai-api",[16556],{"type":23,"value":16557},"Mistral AI API",{"type":17,"tag":29,"props":16559,"children":16560},{},[16561],{"type":17,"tag":133,"props":16562,"children":16565},{"href":16563,"rel":16564},"https://mistral.ai/",[214],[16566],{"type":23,"value":16567},"Mistral",{"type":17,"tag":29,"props":16569,"children":16570},{},[16571],{"type":23,"value":16572},"High-performance open-weight models with competitive latency and cost.",{"type":17,"tag":29,"props":16574,"children":16575},{},[16576],{"type":23,"value":13970},{"type":17,"tag":80,"props":16578,"children":16579},{},[16580,16585],{"type":17,"tag":84,"props":16581,"children":16582},{},[16583],{"type":23,"value":16584},"cost-efficient inference",{"type":17,"tag":84,"props":16586,"children":16587},{},[16588],{"type":23,"value":16589},"high-performance applications",{"type":17,"tag":239,"props":16591,"children":16593},{"id":16592},"hugging-face-api",[16594],{"type":23,"value":16595},"Hugging Face API",{"type":17,"tag":29,"props":16597,"children":16598},{},[16599],{"type":17,"tag":133,"props":16600,"children":16603},{"href":16601,"rel":16602},"https://huggingface.co/",[214],[16604],{"type":23,"value":16605},"Hugging Face",{"type":17,"tag":29,"props":16607,"children":16608},{},[16609],{"type":23,"value":16610},"Large ecosystem of open-source models and inference APIs.",{"type":17,"tag":29,"props":16612,"children":16613},{},[16614],{"type":23,"value":13970},{"type":17,"tag":80,"props":16616,"children":16617},{},[16618,16623,16628],{"type":17,"tag":84,"props":16619,"children":16620},{},[16621],{"type":23,"value":16622},"custom model deployment",{"type":17,"tag":84,"props":16624,"children":16625},{},[16626],{"type":23,"value":16627},"experimentation",{"type":17,"tag":84,"props":16629,"children":16630},{},[16631],{"type":23,"value":16632},"open-source AI workflows",{"type":17,"tag":239,"props":16634,"children":16636},{"id":16635},"groq-api",[16637],{"type":23,"value":16638},"Groq API",{"type":17,"tag":29,"props":16640,"children":16641},{},[16642],{"type":17,"tag":133,"props":16643,"children":16646},{"href":16644,"rel":16645},"https://groq.com/",[214],[16647],{"type":23,"value":16648},"Groq",{"type":17,"tag":29,"props":16650,"children":16651},{},[16652],{"type":23,"value":16653},"Known for ultra-fast inference speeds.",{"type":17,"tag":29,"props":16655,"children":16656},{},[16657],{"type":23,"value":13970},{"type":17,"tag":80,"props":16659,"children":16660},{},[16661,16666],{"type":17,"tag":84,"props":16662,"children":16663},{},[16664],{"type":23,"value":16665},"latency-sensitive applications",{"type":17,"tag":84,"props":16667,"children":16668},{},[16669],{"type":23,"value":16670},"real-time AI systems",{"type":17,"tag":239,"props":16672,"children":16674},{"id":16673},"deepseek-api",[16675],{"type":23,"value":16676},"DeepSeek API",{"type":17,"tag":29,"props":16678,"children":16679},{},[16680],{"type":17,"tag":133,"props":16681,"children":16684},{"href":16682,"rel":16683},"https://www.deepseek.com/",[214],[16685],{"type":23,"value":16686},"DeepSeek",{"type":17,"tag":29,"props":16688,"children":16689},{},[16690],{"type":23,"value":16691},"Emerging provider with strong performance in reasoning and coding tasks.",{"type":17,"tag":239,"props":16693,"children":16695},{"id":16694},"anyscale-api",[16696],{"type":23,"value":16697},"AnyScale API",{"type":17,"tag":29,"props":16699,"children":16700},{},[16701],{"type":17,"tag":133,"props":16702,"children":16705},{"href":16703,"rel":16704},"https://www.anyscale.com/",[214],[16706],{"type":23,"value":16707},"AnyScale",{"type":17,"tag":29,"props":16709,"children":16710},{},[16711],{"type":23,"value":16712},"Infrastructure platform for deploying and scaling AI models.",{"type":17,"tag":239,"props":16714,"children":16716},{"id":16715},"xai-grok-api",[16717],{"type":23,"value":16718},"X.ai Grok API",{"type":17,"tag":29,"props":16720,"children":16721},{},[16722],{"type":17,"tag":133,"props":16723,"children":16726},{"href":16724,"rel":16725},"https://x.ai/",[214],[16727],{"type":23,"value":16728},"xAI Grok",{"type":17,"tag":29,"props":16730,"children":16731},{},[16732],{"type":23,"value":16733},"AI models integrated with real-time data and conversational interfaces.",{"type":17,"tag":68,"props":16735,"children":16737},{"id":16736},"challenges-when-integrating-multiple-ai-apis",[16738],{"type":23,"value":16739},"Challenges when integrating multiple AI APIs",{"type":17,"tag":29,"props":16741,"children":16742},{},[16743],{"type":23,"value":16744},"Building against one AI API is straightforward.",{"type":17,"tag":29,"props":16746,"children":16747},{},[16748],{"type":23,"value":16749},"Supporting multiple introduces real complexity.",{"type":17,"tag":239,"props":16751,"children":16753},{"id":16752},"different-request-and-response-formats",[16754],{"type":23,"value":16755},"Different request and response formats",{"type":17,"tag":29,"props":16757,"children":16758},{},[16759],{"type":23,"value":16760},"Each provider structures prompts, messages, and responses differently.",{"type":17,"tag":239,"props":16762,"children":16764},{"id":16763},"model-specific-parameters",[16765],{"type":23,"value":16766},"Model-specific parameters",{"type":17,"tag":29,"props":16768,"children":16769},{},[16770],{"type":23,"value":16771},"Temperature, max tokens, streaming behavior, and tool calling vary by provider.",{"type":17,"tag":239,"props":16773,"children":16775},{"id":16774},"authentication-and-rate-limits",[16776],{"type":23,"value":16777},"Authentication and rate limits",{"type":17,"tag":29,"props":16779,"children":16780},{},[16781],{"type":23,"value":16782},"Each API has its own auth model, limits, and quotas.",{"type":17,"tag":239,"props":16784,"children":16786},{"id":16785},"output-inconsistency",[16787],{"type":23,"value":16788},"Output inconsistency",{"type":17,"tag":29,"props":16790,"children":16791},{},[16792],{"type":23,"value":16793},"Even when prompts are identical, outputs vary significantly across models.",{"type":17,"tag":239,"props":16795,"children":16797},{"id":16796},"maintenance-overhead",[16798],{"type":23,"value":16799},"Maintenance overhead",{"type":17,"tag":29,"props":16801,"children":16802},{},[16803],{"type":23,"value":16804},"Every provider evolves quickly. Keeping up with changes becomes ongoing work.",{"type":17,"tag":29,"props":16806,"children":16807},{},[16808],{"type":23,"value":16809},"For teams building AI features into their product, this becomes a bottleneck.",{"type":17,"tag":68,"props":16811,"children":16813},{"id":16812},"the-role-of-unified-generative-ai-apis",[16814],{"type":23,"value":16815},"The role of unified Generative AI APIs",{"type":17,"tag":29,"props":16817,"children":16818},{},[16819],{"type":23,"value":16820},"A unified Generative AI API standardizes how your application interacts with different models.",{"type":17,"tag":29,"props":16822,"children":16823},{},[16824],{"type":23,"value":16825},"Instead of writing separate integrations for OpenAI, Anthropic, Gemini, and others, you:",{"type":17,"tag":80,"props":16827,"children":16828},{},[16829,16834,16839,16844,16849],{"type":17,"tag":84,"props":16830,"children":16831},{},[16832],{"type":23,"value":16833},"send one request format",{"type":17,"tag":84,"props":16835,"children":16836},{},[16837],{"type":23,"value":16838},"receive one response structure",{"type":17,"tag":84,"props":16840,"children":16841},{},[16842],{"type":23,"value":16843},"switch models without rewriting logic",{"type":17,"tag":84,"props":16845,"children":16846},{},[16847],{"type":23,"value":16848},"route requests dynamically",{"type":17,"tag":84,"props":16850,"children":16851},{},[16852],{"type":23,"value":16853},"compare outputs across providers",{"type":17,"tag":29,"props":16855,"children":16856},{},[16857],{"type":23,"value":16858},"This allows you to build AI features once and evolve your model strategy over time.",{"type":17,"tag":68,"props":16860,"children":16862},{"id":16861},"build-once-with-the-unified-generative-ai-api",[16863],{"type":23,"value":16864},"Build once with the Unified Generative AI API",{"type":17,"tag":29,"props":16866,"children":16867},{},[16868,16869,16875,16877,16882],{"type":23,"value":6712},{"type":17,"tag":133,"props":16870,"children":16872},{"href":212,"rel":16871},[214],[16873],{"type":23,"value":16874},"Unified Generative AI API",{"type":23,"value":16876}," enables access to ",{"type":17,"tag":48,"props":16878,"children":16879},{},[16880],{"type":23,"value":16881},"11+ AI providers through a single API",{"type":23,"value":54},{"type":17,"tag":29,"props":16884,"children":16885},{},[16886],{"type":23,"value":16887},"Supported providers include:",{"type":17,"tag":80,"props":16889,"children":16890},{},[16891,16899,16907,16915,16923,16931,16939,16947,16955,16963,16971],{"type":17,"tag":84,"props":16892,"children":16893},{},[16894],{"type":17,"tag":133,"props":16895,"children":16897},{"href":16100,"rel":16896},[214],[16898],{"type":23,"value":16104},{"type":17,"tag":84,"props":16900,"children":16901},{},[16902],{"type":17,"tag":133,"props":16903,"children":16905},{"href":16108,"rel":16904},[214],[16906],{"type":23,"value":16112},{"type":17,"tag":84,"props":16908,"children":16909},{},[16910],{"type":17,"tag":133,"props":16911,"children":16913},{"href":16116,"rel":16912},[214],[16914],{"type":23,"value":16120},{"type":17,"tag":84,"props":16916,"children":16917},{},[16918],{"type":17,"tag":133,"props":16919,"children":16921},{"href":16478,"rel":16920},[214],[16922],{"type":23,"value":16482},{"type":17,"tag":84,"props":16924,"children":16925},{},[16926],{"type":17,"tag":133,"props":16927,"children":16929},{"href":16521,"rel":16928},[214],[16930],{"type":23,"value":16525},{"type":17,"tag":84,"props":16932,"children":16933},{},[16934],{"type":17,"tag":133,"props":16935,"children":16937},{"href":16563,"rel":16936},[214],[16938],{"type":23,"value":16567},{"type":17,"tag":84,"props":16940,"children":16941},{},[16942],{"type":17,"tag":133,"props":16943,"children":16945},{"href":16601,"rel":16944},[214],[16946],{"type":23,"value":16605},{"type":17,"tag":84,"props":16948,"children":16949},{},[16950],{"type":17,"tag":133,"props":16951,"children":16953},{"href":16644,"rel":16952},[214],[16954],{"type":23,"value":16648},{"type":17,"tag":84,"props":16956,"children":16957},{},[16958],{"type":17,"tag":133,"props":16959,"children":16961},{"href":16682,"rel":16960},[214],[16962],{"type":23,"value":16686},{"type":17,"tag":84,"props":16964,"children":16965},{},[16966],{"type":17,"tag":133,"props":16967,"children":16969},{"href":16703,"rel":16968},[214],[16970],{"type":23,"value":16707},{"type":17,"tag":84,"props":16972,"children":16973},{},[16974],{"type":17,"tag":133,"props":16975,"children":16977},{"href":16724,"rel":16976},[214],[16978],{"type":23,"value":16728},{"type":17,"tag":239,"props":16980,"children":16982},{"id":16981},"unified-ai-objects",[16983],{"type":23,"value":16984},"Unified AI objects",{"type":17,"tag":29,"props":16986,"children":16987},{},[16988],{"type":23,"value":16989},"Unified standardizes AI interactions into three core objects:",{"type":17,"tag":29,"props":16991,"children":16992},{},[16993],{"type":17,"tag":48,"props":16994,"children":16995},{},[16996],{"type":23,"value":16997},"Model",{"type":17,"tag":29,"props":16999,"children":17000},{},[17001],{"type":23,"value":17002},"Represents available AI models across providers.",{"type":17,"tag":29,"props":17004,"children":17005},{},[17006],{"type":17,"tag":48,"props":17007,"children":17008},{},[17009],{"type":23,"value":17010},"Prompt",{"type":17,"tag":29,"props":17012,"children":17013},{},[17014],{"type":23,"value":17015},"Handles prompt execution, messages, responses, and token usage.",{"type":17,"tag":29,"props":17017,"children":17018},{},[17019],{"type":17,"tag":48,"props":17020,"children":17021},{},[17022],{"type":23,"value":17023},"Embedding",{"type":17,"tag":29,"props":17025,"children":17026},{},[17027],{"type":23,"value":17028},"Generates vector embeddings for search, RAG, and semantic applications.",{"type":17,"tag":29,"props":17030,"children":17031},{},[17032],{"type":23,"value":17033},"These objects allow consistent interaction across all providers.",{"type":17,"tag":68,"props":17035,"children":17037},{"id":17036},"why-teams-choose-unifiedto-for-ai-integrations",[17038],{"type":23,"value":17039},"Why teams choose Unified.to for AI integrations",{"type":17,"tag":239,"props":17041,"children":17043},{"id":17042},"one-api-across-all-models",[17044],{"type":23,"value":17045},"One API across all models",{"type":17,"tag":29,"props":17047,"children":17048},{},[17049],{"type":23,"value":17050},"Instead of writing separate integrations, you integrate once and support all major AI providers.",{"type":17,"tag":239,"props":17052,"children":17054},{"id":17053},"real-time-pass-through-execution",[17055],{"type":23,"value":17056},"Real-time, pass-through execution",{"type":17,"tag":29,"props":17058,"children":17059},{},[17060],{"type":23,"value":17061},"Every request hits the model provider directly. No caching, no stale responses, no intermediate storage.",{"type":17,"tag":239,"props":17063,"children":17065},{"id":17064},"zero-storage-architecture",[17066],{"type":23,"value":17067},"Zero-storage architecture",{"type":17,"tag":29,"props":17069,"children":17070},{},[17071],{"type":23,"value":17072},"Unified does not store prompt data or responses at rest, which reduces risk when working with sensitive inputs or proprietary data.",{"type":17,"tag":239,"props":17074,"children":17076},{"id":17075},"multi-model-routing",[17077],{"type":23,"value":17078},"Multi-model routing",{"type":17,"tag":29,"props":17080,"children":17081},{},[17082],{"type":23,"value":17083},"Route requests across providers based on:",{"type":17,"tag":80,"props":17085,"children":17086},{},[17087,17092,17096,17100],{"type":17,"tag":84,"props":17088,"children":17089},{},[17090],{"type":23,"value":17091},"cost",{"type":17,"tag":84,"props":17093,"children":17094},{},[17095],{"type":23,"value":838},{"type":17,"tag":84,"props":17097,"children":17098},{},[17099],{"type":23,"value":10342},{"type":17,"tag":84,"props":17101,"children":17102},{},[17103],{"type":23,"value":17104},"performance",{"type":17,"tag":239,"props":17106,"children":17108},{"id":17107},"model-comparison",[17109],{"type":23,"value":17110},"Model comparison",{"type":17,"tag":29,"props":17112,"children":17113},{},[17114],{"type":23,"value":17115},"Run the same prompt across multiple providers and compare outputs programmatically.",{"type":17,"tag":239,"props":17117,"children":17119},{"id":17118},"built-for-ai-native-products",[17120],{"type":23,"value":17121},"Built for AI-native products",{"type":17,"tag":29,"props":17123,"children":17124},{},[17125],{"type":23,"value":17126},"Unified integrates directly into:",{"type":17,"tag":80,"props":17128,"children":17129},{},[17130,17135,17140,17145],{"type":17,"tag":84,"props":17131,"children":17132},{},[17133],{"type":23,"value":17134},"RAG pipelines",{"type":17,"tag":84,"props":17136,"children":17137},{},[17138],{"type":23,"value":17139},"embeddings workflows",{"type":17,"tag":84,"props":17141,"children":17142},{},[17143],{"type":23,"value":17144},"agent architectures",{"type":17,"tag":84,"props":17146,"children":17147},{},[17148],{"type":23,"value":17149},"MCP-based tool systems",{"type":17,"tag":29,"props":17151,"children":17152},{},[17153],{"type":23,"value":17154},"This is not just API aggregation. It is infrastructure for AI products.",{"type":17,"tag":68,"props":17156,"children":17158},{"id":17157},"common-use-cases-for-a-unified-ai-api",[17159],{"type":23,"value":17160},"Common use cases for a unified AI API",{"type":17,"tag":239,"props":17162,"children":17164},{"id":17163},"multi-model-ai-applications",[17165],{"type":23,"value":17166},"Multi-model AI applications",{"type":17,"tag":29,"props":17168,"children":17169},{},[17170],{"type":23,"value":17171},"Support multiple providers without rewriting integration logic.",{"type":17,"tag":239,"props":17173,"children":17175},{"id":17174},"ai-copilots",[17176],{"type":23,"value":15895},{"type":17,"tag":29,"props":17178,"children":17179},{},[17180],{"type":23,"value":17181},"Access real-time data and generate responses using the best available model.",{"type":17,"tag":239,"props":17183,"children":17185},{"id":17184},"rag-pipelines",[17186],{"type":23,"value":17134},{"type":17,"tag":29,"props":17188,"children":17189},{},[17190],{"type":23,"value":17191},"Combine embeddings and live data retrieval for accurate AI responses.",{"type":17,"tag":239,"props":17193,"children":17195},{"id":17194},"ai-agents",[17196],{"type":23,"value":17197},"AI agents",{"type":17,"tag":29,"props":17199,"children":17200},{},[17201],{"type":23,"value":17202},"Allow agents to interact with external systems using structured, secure tool calls.",{"type":17,"tag":239,"props":17204,"children":17206},{"id":17205},"cost-optimization",[17207],{"type":23,"value":16288},{"type":17,"tag":29,"props":17209,"children":17210},{},[17211],{"type":23,"value":17212},"Route requests to lower-cost models when appropriate.",{"type":17,"tag":68,"props":17214,"children":17215},{"id":1552},[17216],{"type":23,"value":1555},{"type":17,"tag":29,"props":17218,"children":17219},{},[17220],{"type":23,"value":17221},"Generative AI integration is no longer about choosing a single provider.",{"type":17,"tag":29,"props":17223,"children":17224},{},[17225],{"type":23,"value":17226},"It is about building flexible infrastructure that can:",{"type":17,"tag":80,"props":17228,"children":17229},{},[17230,17235,17240,17245,17250],{"type":17,"tag":84,"props":17231,"children":17232},{},[17233],{"type":23,"value":17234},"support multiple models",{"type":17,"tag":84,"props":17236,"children":17237},{},[17238],{"type":23,"value":17239},"adapt quickly as providers evolve",{"type":17,"tag":84,"props":17241,"children":17242},{},[17243],{"type":23,"value":17244},"reduce engineering overhead",{"type":17,"tag":84,"props":17246,"children":17247},{},[17248],{"type":23,"value":17249},"keep data secure",{"type":17,"tag":84,"props":17251,"children":17252},{},[17253],{"type":23,"value":17254},"maintain real-time accuracy",{"type":17,"tag":29,"props":17256,"children":17257},{},[17258],{"type":23,"value":17259},"A unified Generative AI API is the fastest way to get there.",{"type":17,"tag":29,"props":17261,"children":17262},{},[17263],{"type":23,"value":17264},"Instead of rebuilding integrations every time a new model emerges, you build once and evolve your AI stack over time.",{"type":17,"tag":29,"props":17266,"children":17267},{},[17268,17269],{"type":23,"value":1609},{"type":17,"tag":133,"props":17270,"children":17272},{"href":1612,"rel":17271},[214],[17273],{"type":23,"value":1616},{"type":17,"tag":29,"props":17275,"children":17276},{},[17277,17278],{"type":23,"value":1609},{"type":17,"tag":133,"props":17279,"children":17281},{"href":1623,"rel":17280},[214],[17282],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":17284},[17285,17286,17287,17300,17307,17308,17311,17319,17326],{"id":16176,"depth":1629,"text":16179},{"id":16241,"depth":1629,"text":16244},{"id":16327,"depth":1629,"text":16330,"children":17288},[17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299],{"id":16338,"depth":1635,"text":16341},{"id":16387,"depth":1635,"text":16390},{"id":16428,"depth":1635,"text":16431},{"id":16469,"depth":1635,"text":16472},{"id":16512,"depth":1635,"text":16515},{"id":16554,"depth":1635,"text":16557},{"id":16592,"depth":1635,"text":16595},{"id":16635,"depth":1635,"text":16638},{"id":16673,"depth":1635,"text":16676},{"id":16694,"depth":1635,"text":16697},{"id":16715,"depth":1635,"text":16718},{"id":16736,"depth":1629,"text":16739,"children":17301},[17302,17303,17304,17305,17306],{"id":16752,"depth":1635,"text":16755},{"id":16763,"depth":1635,"text":16766},{"id":16774,"depth":1635,"text":16777},{"id":16785,"depth":1635,"text":16788},{"id":16796,"depth":1635,"text":16799},{"id":16812,"depth":1629,"text":16815},{"id":16861,"depth":1629,"text":16864,"children":17309},[17310],{"id":16981,"depth":1635,"text":16984},{"id":17036,"depth":1629,"text":17039,"children":17312},[17313,17314,17315,17316,17317,17318],{"id":17042,"depth":1635,"text":17045},{"id":17053,"depth":1635,"text":17056},{"id":17064,"depth":1635,"text":17067},{"id":17075,"depth":1635,"text":17078},{"id":17107,"depth":1635,"text":17110},{"id":17118,"depth":1635,"text":17121},{"id":17157,"depth":1629,"text":17160,"children":17320},[17321,17322,17323,17324,17325],{"id":17163,"depth":1635,"text":17166},{"id":17174,"depth":1635,"text":15895},{"id":17184,"depth":1635,"text":17134},{"id":17194,"depth":1635,"text":17197},{"id":17205,"depth":1635,"text":16288},{"id":1552,"depth":1629,"text":1555},"content:blog:11_generative_ai_apis_to_integrate_with_openai_anthropic_gemini_and_unified_ai_infrastructure.md","blog/11_generative_ai_apis_to_integrate_with_openai_anthropic_gemini_and_unified_ai_infrastructure.md","blog/11_generative_ai_apis_to_integrate_with_openai_anthropic_gemini_and_unified_ai_infrastructure",{"_path":17331,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":17332,"description":17333,"img":17334,"date":17335,"tag":12,"body":17336,"_type":1677,"_id":18370,"_source":1679,"_file":18371,"_stem":18372,"_extension":1682},"/blog/3_repository_apis_to_integrate_with_github_gitlab_and_bitbucket","3 Repository APIs to Integrate With: GitHub, GitLab, and Bitbucket","Code repository integrations are now part of core product infrastructure for many B2B SaaS teams. Developer tools, engineering analytics platforms, AI coding...","https://s3.us-east-2.amazonaws.com/unified-article-images/3_repository_apis_to_integrate_with_github_gitlab_and_bitbucket-icon.png","2026-03-25T00:31:00.000Z",{"type":14,"children":17337,"toc":18335},[17338,17343,17346,17353,17358,17385,17396,17401,17407,17412,17417,17465,17470,17476,17481,17486,17494,17499,17507,17512,17520,17525,17533,17538,17546,17551,17559,17564,17569,17575,17580,17586,17596,17601,17623,17628,17667,17672,17678,17688,17692,17714,17719,17752,17757,17763,17773,17777,17800,17805,17832,17837,17843,17848,17853,17859,17864,17869,17875,17880,17886,17891,17897,17902,17908,17913,17919,17924,17929,17934,17962,17967,17972,17978,17991,17996,18001,18028,18034,18039,18047,18052,18060,18065,18073,18078,18086,18091,18099,18104,18109,18115,18120,18124,18129,18134,18160,18164,18169,18175,18180,18186,18191,18197,18202,18208,18213,18218,18223,18229,18234,18240,18245,18251,18256,18260,18265,18269,18274,18279,18302,18307,18312,18317,18326],{"type":17,"tag":18,"props":17339,"children":17341},{"id":17340},"_3-repository-apis-to-integrate-with-github-gitlab-and-bitbucket",[17342],{"type":23,"value":17332},{"type":17,"tag":25,"props":17344,"children":17345},{},[],{"type":17,"tag":29,"props":17347,"children":17348},{},[17349],{"type":17,"tag":33,"props":17350,"children":17351},{},[17352],{"type":23,"value":12535},{"type":17,"tag":29,"props":17354,"children":17355},{},[17356],{"type":23,"value":17357},"Code repository integrations are now part of core product infrastructure for many B2B SaaS teams. Developer tools, engineering analytics platforms, AI coding assistants, security products, CI/CD systems, internal tooling, and workflow automation platforms all need reliable access to repository data.",{"type":17,"tag":29,"props":17359,"children":17360},{},[17361,17363,17369,17370,17376,17377,17384],{"type":23,"value":17362},"That usually means integrating with the three platforms that matter most: ",{"type":17,"tag":133,"props":17364,"children":17367},{"href":17365,"rel":17366},"https://github.com/",[214],[17368],{"type":23,"value":13311},{"type":23,"value":11826},{"type":17,"tag":133,"props":17371,"children":17374},{"href":17372,"rel":17373},"https://about.gitlab.com/",[214],[17375],{"type":23,"value":13320},{"type":23,"value":12561},{"type":17,"tag":133,"props":17378,"children":17381},{"href":17379,"rel":17380},"https://bitbucket.org/",[214],[17382],{"type":23,"value":17383},"Bitbucket",{"type":23,"value":54},{"type":17,"tag":29,"props":17386,"children":17387},{},[17388,17390,17394],{"type":23,"value":17389},"The challenge is that each repository platform exposes its own API structure, auth model, object naming, ",{"type":17,"tag":133,"props":17391,"children":17392},{"href":1857},[17393],{"type":23,"value":1860},{"type":23,"value":17395}," behavior, webhook setup, and write semantics. Even though they all revolve around repositories, branches, commits, and pull requests, the implementation details differ enough to create real engineering overhead.",{"type":17,"tag":29,"props":17397,"children":17398},{},[17399],{"type":23,"value":17400},"In this guide, we'll cover the top repository APIs developers integrate with, what makes repository integrations hard to scale, and why more teams are using unified repository APIs instead of building every integration one by one.",{"type":17,"tag":68,"props":17402,"children":17404},{"id":17403},"what-is-a-repository-api",[17405],{"type":23,"value":17406},"What is a repository API?",{"type":17,"tag":29,"props":17408,"children":17409},{},[17410],{"type":23,"value":17411},"A repository API gives your application programmatic access to source code repository platforms.",{"type":17,"tag":29,"props":17413,"children":17414},{},[17415],{"type":23,"value":17416},"That typically includes access to:",{"type":17,"tag":80,"props":17418,"children":17419},{},[17420,17425,17430,17435,17440,17445,17450,17455,17460],{"type":17,"tag":84,"props":17421,"children":17422},{},[17423],{"type":23,"value":17424},"repositories",{"type":17,"tag":84,"props":17426,"children":17427},{},[17428],{"type":23,"value":17429},"organizations or groups",{"type":17,"tag":84,"props":17431,"children":17432},{},[17433],{"type":23,"value":17434},"branches",{"type":17,"tag":84,"props":17436,"children":17437},{},[17438],{"type":23,"value":17439},"commits",{"type":17,"tag":84,"props":17441,"children":17442},{},[17443],{"type":23,"value":17444},"pull requests or merge requests",{"type":17,"tag":84,"props":17446,"children":17447},{},[17448],{"type":23,"value":17449},"contributors and authors",{"type":17,"tag":84,"props":17451,"children":17452},{},[17453],{"type":23,"value":17454},"repository metadata",{"type":17,"tag":84,"props":17456,"children":17457},{},[17458],{"type":23,"value":17459},"comments, labels, and review status",{"type":17,"tag":84,"props":17461,"children":17462},{},[17463],{"type":23,"value":17464},"pipeline or CI/CD triggers in some cases",{"type":17,"tag":29,"props":17466,"children":17467},{},[17468],{"type":23,"value":17469},"Repository APIs are used anywhere products need to read development activity, trigger workflows, sync engineering metadata, or let users take actions directly from another product.",{"type":17,"tag":68,"props":17471,"children":17473},{"id":17472},"why-saas-products-integrate-with-repository-apis",[17474],{"type":23,"value":17475},"Why SaaS products integrate with repository APIs",{"type":17,"tag":29,"props":17477,"children":17478},{},[17479],{"type":23,"value":17480},"Repository APIs are not just for developer tools anymore.",{"type":17,"tag":29,"props":17482,"children":17483},{},[17484],{"type":23,"value":17485},"They now power a wide range of use cases across B2B SaaS, including:",{"type":17,"tag":29,"props":17487,"children":17488},{},[17489],{"type":17,"tag":48,"props":17490,"children":17491},{},[17492],{"type":23,"value":17493},"Engineering analytics",{"type":17,"tag":29,"props":17495,"children":17496},{},[17497],{"type":23,"value":17498},"Track code velocity, merge times, review activity, and contribution patterns across teams.",{"type":17,"tag":29,"props":17500,"children":17501},{},[17502],{"type":17,"tag":48,"props":17503,"children":17504},{},[17505],{"type":23,"value":17506},"AI coding assistants and code intelligence tools",{"type":17,"tag":29,"props":17508,"children":17509},{},[17510],{"type":23,"value":17511},"Access repository structure, commit history, and pull request activity to improve context and automate tasks.",{"type":17,"tag":29,"props":17513,"children":17514},{},[17515],{"type":17,"tag":48,"props":17516,"children":17517},{},[17518],{"type":23,"value":17519},"DevOps and CI/CD workflows",{"type":17,"tag":29,"props":17521,"children":17522},{},[17523],{"type":23,"value":17524},"Trigger pipelines, react to merges, and coordinate deployment workflows across source control systems.",{"type":17,"tag":29,"props":17526,"children":17527},{},[17528],{"type":17,"tag":48,"props":17529,"children":17530},{},[17531],{"type":23,"value":17532},"Security and compliance tooling",{"type":17,"tag":29,"props":17534,"children":17535},{},[17536],{"type":23,"value":17537},"Monitor repository activity, flag risky changes, and track review or approval flows.",{"type":17,"tag":29,"props":17539,"children":17540},{},[17541],{"type":17,"tag":48,"props":17542,"children":17543},{},[17544],{"type":23,"value":17545},"Project and workflow automation",{"type":17,"tag":29,"props":17547,"children":17548},{},[17549],{"type":23,"value":17550},"Connect repository events to ticketing, messaging, documentation, and internal workflow systems.",{"type":17,"tag":29,"props":17552,"children":17553},{},[17554],{"type":17,"tag":48,"props":17555,"children":17556},{},[17557],{"type":23,"value":17558},"Customer-facing integrations",{"type":17,"tag":29,"props":17560,"children":17561},{},[17562],{"type":23,"value":17563},"Allow end users to connect their preferred repository platform without your team building separate integrations for each one.",{"type":17,"tag":29,"props":17565,"children":17566},{},[17567],{"type":23,"value":17568},"As soon as customers ask for both GitHub and GitLab support, and then Bitbucket right after, the maintenance cost becomes obvious.",{"type":17,"tag":68,"props":17570,"children":17572},{"id":17571},"_3-repository-apis-developers-commonly-integrate-with",[17573],{"type":23,"value":17574},"3 repository APIs developers commonly integrate with",{"type":17,"tag":29,"props":17576,"children":17577},{},[17578],{"type":23,"value":17579},"The repository category is more concentrated than categories like CRM or HRIS. In practice, most teams care about three primary platforms.",{"type":17,"tag":239,"props":17581,"children":17583},{"id":17582},"_1-github-api",[17584],{"type":23,"value":17585},"1. GitHub API",{"type":17,"tag":29,"props":17587,"children":17588},{},[17589,17594],{"type":17,"tag":133,"props":17590,"children":17592},{"href":17365,"rel":17591},[214],[17593],{"type":23,"value":13311},{"type":23,"value":17595}," is the default repository platform for many software companies and open-source projects. Its APIs are widely used for repository access, pull request workflows, commit activity, and automation.",{"type":17,"tag":29,"props":17597,"children":17598},{},[17599],{"type":23,"value":17600},"Relevant docs:",{"type":17,"tag":80,"props":17602,"children":17603},{},[17604,17613],{"type":17,"tag":84,"props":17605,"children":17606},{},[17607],{"type":17,"tag":133,"props":17608,"children":17610},{"href":12929,"rel":17609},[214],[17611],{"type":23,"value":17612},"GitHub REST API",{"type":17,"tag":84,"props":17614,"children":17615},{},[17616],{"type":17,"tag":133,"props":17617,"children":17620},{"href":17618,"rel":17619},"https://docs.github.com/en/graphql",[214],[17621],{"type":23,"value":17622},"GitHub GraphQL API",{"type":17,"tag":29,"props":17624,"children":17625},{},[17626],{"type":23,"value":17627},"Common GitHub API use cases include:",{"type":17,"tag":80,"props":17629,"children":17630},{},[17631,17636,17641,17646,17651,17656],{"type":17,"tag":84,"props":17632,"children":17633},{},[17634],{"type":23,"value":17635},"listing repositories and branches",{"type":17,"tag":84,"props":17637,"children":17638},{},[17639],{"type":23,"value":17640},"retrieving commits and authorship data",{"type":17,"tag":84,"props":17642,"children":17643},{},[17644],{"type":23,"value":17645},"reading and updating pull requests",{"type":17,"tag":84,"props":17647,"children":17648},{},[17649],{"type":23,"value":17650},"accessing repository metadata",{"type":17,"tag":84,"props":17652,"children":17653},{},[17654],{"type":23,"value":17655},"managing org-level repository information",{"type":17,"tag":84,"props":17657,"children":17658},{},[17659,17661,17665],{"type":23,"value":17660},"reacting to ",{"type":17,"tag":133,"props":17662,"children":17663},{"href":4999},[17664],{"type":23,"value":5002},{"type":23,"value":17666}," for push, PR, and issue activity",{"type":17,"tag":29,"props":17668,"children":17669},{},[17670],{"type":23,"value":17671},"GitHub is often the first repository integration teams build, but it also creates a trap: once the product is designed around GitHub's object model, adding GitLab and Bitbucket gets much harder.",{"type":17,"tag":239,"props":17673,"children":17675},{"id":17674},"_2-gitlab-api",[17676],{"type":23,"value":17677},"2. GitLab API",{"type":17,"tag":29,"props":17679,"children":17680},{},[17681,17686],{"type":17,"tag":133,"props":17682,"children":17684},{"href":17372,"rel":17683},[214],[17685],{"type":23,"value":13320},{"type":23,"value":17687}," is widely used across self-hosted, enterprise, and DevOps-heavy environments. It covers source control, CI/CD, merge requests, pipelines, and broader software delivery workflows.",{"type":17,"tag":29,"props":17689,"children":17690},{},[17691],{"type":23,"value":17600},{"type":17,"tag":80,"props":17693,"children":17694},{},[17695,17704],{"type":17,"tag":84,"props":17696,"children":17697},{},[17698],{"type":17,"tag":133,"props":17699,"children":17701},{"href":12950,"rel":17700},[214],[17702],{"type":23,"value":17703},"GitLab REST API",{"type":17,"tag":84,"props":17705,"children":17706},{},[17707],{"type":17,"tag":133,"props":17708,"children":17711},{"href":17709,"rel":17710},"https://docs.gitlab.com/ee/api/api_resources.html",[214],[17712],{"type":23,"value":17713},"GitLab API resources",{"type":17,"tag":29,"props":17715,"children":17716},{},[17717],{"type":23,"value":17718},"Common GitLab API use cases include:",{"type":17,"tag":80,"props":17720,"children":17721},{},[17722,17727,17732,17737,17742,17747],{"type":17,"tag":84,"props":17723,"children":17724},{},[17725],{"type":23,"value":17726},"retrieving projects and groups",{"type":17,"tag":84,"props":17728,"children":17729},{},[17730],{"type":23,"value":17731},"reading branches and commits",{"type":17,"tag":84,"props":17733,"children":17734},{},[17735],{"type":23,"value":17736},"accessing merge requests",{"type":17,"tag":84,"props":17738,"children":17739},{},[17740],{"type":23,"value":17741},"triggering pipelines",{"type":17,"tag":84,"props":17743,"children":17744},{},[17745],{"type":23,"value":17746},"tracking commit and review activity",{"type":17,"tag":84,"props":17748,"children":17749},{},[17750],{"type":23,"value":17751},"integrating code changes with delivery workflows",{"type":17,"tag":29,"props":17753,"children":17754},{},[17755],{"type":23,"value":17756},"GitLab is especially important for enterprise buyers and organizations that want tighter control over infrastructure or use GitLab as part of a broader DevOps stack.",{"type":17,"tag":239,"props":17758,"children":17760},{"id":17759},"_3-bitbucket-api",[17761],{"type":23,"value":17762},"3. Bitbucket API",{"type":17,"tag":29,"props":17764,"children":17765},{},[17766,17771],{"type":17,"tag":133,"props":17767,"children":17769},{"href":17379,"rel":17768},[214],[17770],{"type":23,"value":17383},{"type":23,"value":17772}," remains important for teams that are already invested in the Atlassian ecosystem or use Bitbucket alongside Jira and other Atlassian products.",{"type":17,"tag":29,"props":17774,"children":17775},{},[17776],{"type":23,"value":17600},{"type":17,"tag":80,"props":17778,"children":17779},{},[17780,17790],{"type":17,"tag":84,"props":17781,"children":17782},{},[17783],{"type":17,"tag":133,"props":17784,"children":17787},{"href":17785,"rel":17786},"https://developer.atlassian.com/cloud/bitbucket/rest/intro/",[214],[17788],{"type":23,"value":17789},"Bitbucket Cloud REST API",{"type":17,"tag":84,"props":17791,"children":17792},{},[17793],{"type":17,"tag":133,"props":17794,"children":17797},{"href":17795,"rel":17796},"https://developer.atlassian.com/cloud/bitbucket/rest/api-group-repositories/",[214],[17798],{"type":23,"value":17799},"Bitbucket API reference",{"type":17,"tag":29,"props":17801,"children":17802},{},[17803],{"type":23,"value":17804},"Common Bitbucket API use cases include:",{"type":17,"tag":80,"props":17806,"children":17807},{},[17808,17813,17817,17822,17827],{"type":17,"tag":84,"props":17809,"children":17810},{},[17811],{"type":23,"value":17812},"accessing repositories and workspaces",{"type":17,"tag":84,"props":17814,"children":17815},{},[17816],{"type":23,"value":17731},{"type":17,"tag":84,"props":17818,"children":17819},{},[17820],{"type":23,"value":17821},"managing pull requests",{"type":17,"tag":84,"props":17823,"children":17824},{},[17825],{"type":23,"value":17826},"connecting repository activity to project workflows",{"type":17,"tag":84,"props":17828,"children":17829},{},[17830],{"type":23,"value":17831},"supporting development teams already centered on Atlassian tooling",{"type":17,"tag":29,"props":17833,"children":17834},{},[17835],{"type":23,"value":17836},"Bitbucket is not always the first integration requested, but if your product serves engineering teams in larger organizations, support for it often matters.",{"type":17,"tag":68,"props":17838,"children":17840},{"id":17839},"why-repository-integrations-are-harder-than-they-look",[17841],{"type":23,"value":17842},"Why repository integrations are harder than they look",{"type":17,"tag":29,"props":17844,"children":17845},{},[17846],{"type":23,"value":17847},"At first glance, repository APIs seem standardized. All of them have repositories, branches, commits, and pull requests.",{"type":17,"tag":29,"props":17849,"children":17850},{},[17851],{"type":23,"value":17852},"But once you start building, the differences become expensive.",{"type":17,"tag":239,"props":17854,"children":17856},{"id":17855},"different-object-naming-and-semantics",[17857],{"type":23,"value":17858},"Different object naming and semantics",{"type":17,"tag":29,"props":17860,"children":17861},{},[17862],{"type":23,"value":17863},"One platform uses 'organization,' another uses 'group,' another uses 'workspace.' One uses 'pull request,' another uses 'merge request.'",{"type":17,"tag":29,"props":17865,"children":17866},{},[17867],{"type":23,"value":17868},"That sounds minor until your product logic depends on these concepts being consistent.",{"type":17,"tag":239,"props":17870,"children":17872},{"id":17871},"different-auth-flows-and-permission-models",[17873],{"type":23,"value":17874},"Different auth flows and permission models",{"type":17,"tag":29,"props":17876,"children":17877},{},[17878],{"type":23,"value":17879},"Each repository provider handles authentication and scopes differently. Some customers also have specific org-level requirements or enterprise constraints.",{"type":17,"tag":239,"props":17881,"children":17883},{"id":17882},"different-write-behaviors",[17884],{"type":23,"value":17885},"Different write behaviors",{"type":17,"tag":29,"props":17887,"children":17888},{},[17889],{"type":23,"value":17890},"Reading repository data is one thing. Creating a branch, opening a pull request, or updating review state can behave differently across platforms.",{"type":17,"tag":239,"props":17892,"children":17894},{"id":17893},"different-webhook-and-event-models",[17895],{"type":23,"value":17896},"Different webhook and event models",{"type":17,"tag":29,"props":17898,"children":17899},{},[17900],{"type":23,"value":17901},"Some teams want polling. Others need webhooks. Others want a consistent event layer across providers. Supporting all of that cleanly takes work.",{"type":17,"tag":239,"props":17903,"children":17905},{"id":17904},"different-enterprise-deployment-patterns",[17906],{"type":23,"value":17907},"Different enterprise deployment patterns",{"type":17,"tag":29,"props":17909,"children":17910},{},[17911],{"type":23,"value":17912},"GitHub, GitLab, and Bitbucket can show up in different hosted or enterprise configurations, which makes support and maintenance more complex over time.",{"type":17,"tag":68,"props":17914,"children":17916},{"id":17915},"the-role-of-unified-repository-apis",[17917],{"type":23,"value":17918},"The role of unified repository APIs",{"type":17,"tag":29,"props":17920,"children":17921},{},[17922],{"type":23,"value":17923},"A unified repository API solves a different problem than a direct platform SDK.",{"type":17,"tag":29,"props":17925,"children":17926},{},[17927],{"type":23,"value":17928},"Instead of building separately for GitHub, GitLab, and Bitbucket, you integrate once with a single API that normalizes repository data across those systems.",{"type":17,"tag":29,"props":17930,"children":17931},{},[17932],{"type":23,"value":17933},"That means your product can work with unified objects such as:",{"type":17,"tag":80,"props":17935,"children":17936},{},[17937,17942,17947,17952,17957],{"type":17,"tag":84,"props":17938,"children":17939},{},[17940],{"type":23,"value":17941},"organization",{"type":17,"tag":84,"props":17943,"children":17944},{},[17945],{"type":23,"value":17946},"repository",{"type":17,"tag":84,"props":17948,"children":17949},{},[17950],{"type":23,"value":17951},"branch",{"type":17,"tag":84,"props":17953,"children":17954},{},[17955],{"type":23,"value":17956},"commit",{"type":17,"tag":84,"props":17958,"children":17959},{},[17960],{"type":23,"value":17961},"pull request",{"type":17,"tag":29,"props":17963,"children":17964},{},[17965],{"type":23,"value":17966},"Your application logic stays consistent, even when the underlying source platform changes.",{"type":17,"tag":29,"props":17968,"children":17969},{},[17970],{"type":23,"value":17971},"For teams building customer-facing integrations, that is usually the difference between shipping repository integrations this quarter and pushing them down the roadmap again.",{"type":17,"tag":68,"props":17973,"children":17975},{"id":17974},"build-once-with-the-unified-repository-api",[17976],{"type":23,"value":17977},"Build once with the Unified Repository API",{"type":17,"tag":29,"props":17979,"children":17980},{},[17981,17982,17989],{"type":23,"value":6712},{"type":17,"tag":133,"props":17983,"children":17986},{"href":17984,"rel":17985},"https://unified.to/repository",[214],[17987],{"type":23,"value":17988},"Unified Repository API",{"type":23,"value":17990}," gives developers a single way to read and write repository data across supported version control platforms.",{"type":17,"tag":29,"props":17992,"children":17993},{},[17994],{"type":23,"value":17995},"Instead of maintaining separate integrations for GitHub, GitLab, and Bitbucket, you can build once and support all three through one normalized API.",{"type":17,"tag":29,"props":17997,"children":17998},{},[17999],{"type":23,"value":18000},"Unified currently supports repository integrations for:",{"type":17,"tag":80,"props":18002,"children":18003},{},[18004,18012,18020],{"type":17,"tag":84,"props":18005,"children":18006},{},[18007],{"type":17,"tag":133,"props":18008,"children":18010},{"href":17365,"rel":18009},[214],[18011],{"type":23,"value":13311},{"type":17,"tag":84,"props":18013,"children":18014},{},[18015],{"type":17,"tag":133,"props":18016,"children":18018},{"href":17372,"rel":18017},[214],[18019],{"type":23,"value":13320},{"type":17,"tag":84,"props":18021,"children":18022},{},[18023],{"type":17,"tag":133,"props":18024,"children":18026},{"href":17379,"rel":18025},[214],[18027],{"type":23,"value":17383},{"type":17,"tag":239,"props":18029,"children":18031},{"id":18030},"unified-repository-objects",[18032],{"type":23,"value":18033},"Unified repository objects",{"type":17,"tag":29,"props":18035,"children":18036},{},[18037],{"type":23,"value":18038},"Unified normalizes repository data into a clean set of core objects:",{"type":17,"tag":29,"props":18040,"children":18041},{},[18042],{"type":17,"tag":48,"props":18043,"children":18044},{},[18045],{"type":23,"value":18046},"Organization",{"type":17,"tag":29,"props":18048,"children":18049},{},[18050],{"type":23,"value":18051},"Represents organizations, groups, or workspaces across repository platforms.",{"type":17,"tag":29,"props":18053,"children":18054},{},[18055],{"type":17,"tag":48,"props":18056,"children":18057},{},[18058],{"type":23,"value":18059},"Repository",{"type":17,"tag":29,"props":18061,"children":18062},{},[18063],{"type":23,"value":18064},"Represents source code repositories and their metadata.",{"type":17,"tag":29,"props":18066,"children":18067},{},[18068],{"type":17,"tag":48,"props":18069,"children":18070},{},[18071],{"type":23,"value":18072},"Branch",{"type":17,"tag":29,"props":18074,"children":18075},{},[18076],{"type":23,"value":18077},"Represents repository branches.",{"type":17,"tag":29,"props":18079,"children":18080},{},[18081],{"type":17,"tag":48,"props":18082,"children":18083},{},[18084],{"type":23,"value":18085},"Commit",{"type":17,"tag":29,"props":18087,"children":18088},{},[18089],{"type":23,"value":18090},"Represents commit history, authorship, and commit metadata.",{"type":17,"tag":29,"props":18092,"children":18093},{},[18094],{"type":17,"tag":48,"props":18095,"children":18096},{},[18097],{"type":23,"value":18098},"Pull Request",{"type":17,"tag":29,"props":18100,"children":18101},{},[18102],{"type":23,"value":18103},"Represents pull requests or merge requests, including status and related commit references.",{"type":17,"tag":29,"props":18105,"children":18106},{},[18107],{"type":23,"value":18108},"These objects support consistent methods such as create, list, retrieve, update, and remove where available.",{"type":17,"tag":68,"props":18110,"children":18112},{"id":18111},"why-teams-choose-unifiedto-for-repository-integrations",[18113],{"type":23,"value":18114},"Why teams choose Unified.to for repository integrations",{"type":17,"tag":29,"props":18116,"children":18117},{},[18118],{"type":23,"value":18119},"There are a few reasons this matters specifically for repository APIs.",{"type":17,"tag":239,"props":18121,"children":18122},{"id":13402},[18123],{"type":23,"value":13405},{"type":17,"tag":29,"props":18125,"children":18126},{},[18127],{"type":23,"value":18128},"Unified fetches repository data live from the source API. There is no sync job and no stale cached copy sitting in the middle.",{"type":17,"tag":29,"props":18130,"children":18131},{},[18132],{"type":23,"value":18133},"That matters for:",{"type":17,"tag":80,"props":18135,"children":18136},{},[18137,18142,18147,18152,18156],{"type":17,"tag":84,"props":18138,"children":18139},{},[18140],{"type":23,"value":18141},"commit activity",{"type":17,"tag":84,"props":18143,"children":18144},{},[18145],{"type":23,"value":18146},"pull request status",{"type":17,"tag":84,"props":18148,"children":18149},{},[18150],{"type":23,"value":18151},"branch updates",{"type":17,"tag":84,"props":18153,"children":18154},{},[18155],{"type":23,"value":17454},{"type":17,"tag":84,"props":18157,"children":18158},{},[18159],{"type":23,"value":15287},{"type":17,"tag":239,"props":18161,"children":18162},{"id":13413},[18163],{"type":23,"value":13416},{"type":17,"tag":29,"props":18165,"children":18166},{},[18167],{"type":23,"value":18168},"Unified does not store end-customer repository data at rest. Traffic is stateless and regionalized, which reduces compliance exposure and makes the architecture easier to trust for sensitive environments.",{"type":17,"tag":239,"props":18170,"children":18172},{"id":18171},"normalized-models-without-losing-flexibility",[18173],{"type":23,"value":18174},"Normalized models without losing flexibility",{"type":17,"tag":29,"props":18176,"children":18177},{},[18178],{"type":23,"value":18179},"You get a normalized Repository API, but you can still use raw payload access and provider-specific behavior where needed. That is important because repository platforms overlap heavily, but not perfectly.",{"type":17,"tag":239,"props":18181,"children":18183},{"id":18182},"built-in-authorization",[18184],{"type":23,"value":18185},"Built-in authorization",{"type":17,"tag":29,"props":18187,"children":18188},{},[18189],{"type":23,"value":18190},"Unified handles the complexity of integration authorization so teams do not have to build custom auth flows for each repository platform from scratch.",{"type":17,"tag":239,"props":18192,"children":18194},{"id":18193},"better-fit-for-ai-products",[18195],{"type":23,"value":18196},"Better fit for AI products",{"type":17,"tag":29,"props":18198,"children":18199},{},[18200],{"type":23,"value":18201},"Repository data is increasingly used inside AI copilots, developer assistants, engineering analytics, and code context workflows. Unified's real-time approach is a better fit for those products than sync-and-store models that risk stale repository state.",{"type":17,"tag":68,"props":18203,"children":18205},{"id":18204},"common-use-cases-for-a-unified-repository-api",[18206],{"type":23,"value":18207},"Common use cases for a unified repository API",{"type":17,"tag":29,"props":18209,"children":18210},{},[18211],{"type":23,"value":18212},"Here are some of the most common repository integration use cases:",{"type":17,"tag":239,"props":18214,"children":18216},{"id":18215},"engineering-analytics",[18217],{"type":23,"value":17493},{"type":17,"tag":29,"props":18219,"children":18220},{},[18221],{"type":23,"value":18222},"Build dashboards that track repository activity across GitHub, GitLab, and Bitbucket from one model.",{"type":17,"tag":239,"props":18224,"children":18226},{"id":18225},"developer-tools",[18227],{"type":23,"value":18228},"Developer tools",{"type":17,"tag":29,"props":18230,"children":18231},{},[18232],{"type":23,"value":18233},"Pull repository and pull request data into your product without tying the product architecture to one provider.",{"type":17,"tag":239,"props":18235,"children":18237},{"id":18236},"ai-code-workflows",[18238],{"type":23,"value":18239},"AI code workflows",{"type":17,"tag":29,"props":18241,"children":18242},{},[18243],{"type":23,"value":18244},"Give AI tools access to fresh branch, commit, and pull request data without managing separate integrations per platform.",{"type":17,"tag":239,"props":18246,"children":18248},{"id":18247},"cicd-orchestration",[18249],{"type":23,"value":18250},"CI/CD orchestration",{"type":17,"tag":29,"props":18252,"children":18253},{},[18254],{"type":23,"value":18255},"Trigger or react to repository events consistently across customer environments.",{"type":17,"tag":239,"props":18257,"children":18258},{"id":13496},[18259],{"type":23,"value":12682},{"type":17,"tag":29,"props":18261,"children":18262},{},[18263],{"type":23,"value":18264},"Sync repository activity into ticketing, messaging, knowledge, or internal systems.",{"type":17,"tag":68,"props":18266,"children":18267},{"id":1552},[18268],{"type":23,"value":1555},{"type":17,"tag":29,"props":18270,"children":18271},{},[18272],{"type":23,"value":18273},"Repository integrations are a good example of where a category may look small, but still carry meaningful complexity.",{"type":17,"tag":29,"props":18275,"children":18276},{},[18277],{"type":23,"value":18278},"Even with only three major providers, direct integrations still mean:",{"type":17,"tag":80,"props":18280,"children":18281},{},[18282,18287,18292,18297],{"type":17,"tag":84,"props":18283,"children":18284},{},[18285],{"type":23,"value":18286},"three auth models",{"type":17,"tag":84,"props":18288,"children":18289},{},[18290],{"type":23,"value":18291},"three API surfaces",{"type":17,"tag":84,"props":18293,"children":18294},{},[18295],{"type":23,"value":18296},"three sets of object conventions",{"type":17,"tag":84,"props":18298,"children":18299},{},[18300],{"type":23,"value":18301},"three ongoing maintenance tracks",{"type":17,"tag":29,"props":18303,"children":18304},{},[18305],{"type":23,"value":18306},"If your product needs to support GitHub, GitLab, and Bitbucket, a unified repository API is usually the faster and more scalable approach.",{"type":17,"tag":29,"props":18308,"children":18309},{},[18310],{"type":23,"value":18311},"That is especially true if repository access is not your product's core differentiator, but still needs to be reliable, real-time, and production-ready.",{"type":17,"tag":29,"props":18313,"children":18314},{},[18315],{"type":23,"value":18316},"With Unified.to, teams can ship repository integrations faster, keep their product architecture cleaner, and avoid maintaining separate repository integrations over time.",{"type":17,"tag":29,"props":18318,"children":18319},{},[18320,18321],{"type":23,"value":1609},{"type":17,"tag":133,"props":18322,"children":18324},{"href":1612,"rel":18323},[214],[18325],{"type":23,"value":1616},{"type":17,"tag":29,"props":18327,"children":18328},{},[18329,18330],{"type":23,"value":1609},{"type":17,"tag":133,"props":18331,"children":18333},{"href":1623,"rel":18332},[214],[18334],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":18336},[18337,18338,18339,18344,18351,18352,18355,18362,18369],{"id":17403,"depth":1629,"text":17406},{"id":17472,"depth":1629,"text":17475},{"id":17571,"depth":1629,"text":17574,"children":18340},[18341,18342,18343],{"id":17582,"depth":1635,"text":17585},{"id":17674,"depth":1635,"text":17677},{"id":17759,"depth":1635,"text":17762},{"id":17839,"depth":1629,"text":17842,"children":18345},[18346,18347,18348,18349,18350],{"id":17855,"depth":1635,"text":17858},{"id":17871,"depth":1635,"text":17874},{"id":17882,"depth":1635,"text":17885},{"id":17893,"depth":1635,"text":17896},{"id":17904,"depth":1635,"text":17907},{"id":17915,"depth":1629,"text":17918},{"id":17974,"depth":1629,"text":17977,"children":18353},[18354],{"id":18030,"depth":1635,"text":18033},{"id":18111,"depth":1629,"text":18114,"children":18356},[18357,18358,18359,18360,18361],{"id":13402,"depth":1635,"text":13405},{"id":13413,"depth":1635,"text":13416},{"id":18171,"depth":1635,"text":18174},{"id":18182,"depth":1635,"text":18185},{"id":18193,"depth":1635,"text":18196},{"id":18204,"depth":1629,"text":18207,"children":18363},[18364,18365,18366,18367,18368],{"id":18215,"depth":1635,"text":17493},{"id":18225,"depth":1635,"text":18228},{"id":18236,"depth":1635,"text":18239},{"id":18247,"depth":1635,"text":18250},{"id":13496,"depth":1635,"text":12682},{"id":1552,"depth":1629,"text":1555},"content:blog:3_repository_apis_to_integrate_with_github_gitlab_and_bitbucket.md","blog/3_repository_apis_to_integrate_with_github_gitlab_and_bitbucket.md","blog/3_repository_apis_to_integrate_with_github_gitlab_and_bitbucket",{"_path":18374,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":11565,"description":18375,"img":18376,"date":18377,"tag":12,"body":18378,"_type":1677,"_id":19346,"_source":1679,"_file":19347,"_stem":19348,"_extension":1682},"/blog/how_to_build_cross_platform_ad_targeting_lookup_mapping_and_campaign_creation","Cross-platform ad targeting means defining who sees your ads across multiple advertising integrations using a consistent approach.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_cross_platform_ad_targeting_lookup_mapping_and_campaign_creation-icon.png","2026-03-25T00:11:00.000Z",{"type":14,"children":18379,"toc":19318},[18380,18385,18388,18395,18407,18412,18417,18422,18445,18458,18464,18469,18474,18535,18540,18548,18553,18564,18570,18575,18581,18654,18660,18692,18697,18703,18708,18713,18724,18730,18739,18745,18795,18801,18806,18861,18866,18872,18877,18883,18892,18898,18903,18915,18921,18926,18935,18940,18946,18951,18956,18965,18970,18983,18988,19001,19007,19012,19018,19078,19084,19089,19107,19113,19118,19131,19136,19154,19160,19169,19174,19179,19184,19202,19207,19224,19229,19247,19252,19257,19295,19300,19309],{"type":17,"tag":18,"props":18381,"children":18383},{"id":18382},"how-to-build-cross-platform-ad-targeting-lookup-mapping-and-campaign-creation",[18384],{"type":23,"value":11565},{"type":17,"tag":25,"props":18386,"children":18387},{},[],{"type":17,"tag":29,"props":18389,"children":18390},{},[18391],{"type":17,"tag":33,"props":18392,"children":18393},{},[18394],{"type":23,"value":12535},{"type":17,"tag":29,"props":18396,"children":18397},{},[18398,18400,18405],{"type":23,"value":18399},"Cross-platform ad targeting means defining ",{"type":17,"tag":33,"props":18401,"children":18402},{},[18403],{"type":23,"value":18404},"who sees your ads",{"type":23,"value":18406}," across multiple advertising integrations using a consistent approach.",{"type":17,"tag":29,"props":18408,"children":18409},{},[18410],{"type":23,"value":18411},"In practice, this is one of the hardest problems in advertising systems.",{"type":17,"tag":29,"props":18413,"children":18414},{},[18415],{"type":23,"value":18416},"Each integration uses different identifiers, different structures, and different validation rules. You cannot reuse targeting logic across integrations without building custom mapping layers.",{"type":17,"tag":29,"props":18418,"children":18419},{},[18420],{"type":23,"value":18421},"This guide shows how to:",{"type":17,"tag":80,"props":18423,"children":18424},{},[18425,18430,18435,18440],{"type":17,"tag":84,"props":18426,"children":18427},{},[18428],{"type":23,"value":18429},"look up valid targeting identifiers",{"type":17,"tag":84,"props":18431,"children":18432},{},[18433],{"type":23,"value":18434},"map targeting into a consistent structure",{"type":17,"tag":84,"props":18436,"children":18437},{},[18438],{"type":23,"value":18439},"apply targeting when creating campaigns and groups",{"type":17,"tag":84,"props":18441,"children":18442},{},[18443],{"type":23,"value":18444},"handle provider differences safely",{"type":17,"tag":29,"props":18446,"children":18447},{},[18448,18450,18457],{"type":23,"value":18449},"Using the ",{"type":17,"tag":133,"props":18451,"children":18454},{"href":18452,"rel":18453},"https://unified.to/ads",[214],[18455],{"type":23,"value":18456},"Unified Advertising API",{"type":23,"value":54},{"type":17,"tag":68,"props":18459,"children":18461},{"id":18460},"why-ad-targeting-breaks-across-integrations",[18462],{"type":23,"value":18463},"Why Ad Targeting Breaks Across Integrations",{"type":17,"tag":29,"props":18465,"children":18466},{},[18467],{"type":23,"value":18468},"Targeting is not standardized.",{"type":17,"tag":29,"props":18470,"children":18471},{},[18472],{"type":23,"value":18473},"Across integrations:",{"type":17,"tag":80,"props":18475,"children":18476},{},[18477,18503,18519,18527],{"type":17,"tag":84,"props":18478,"children":18479},{},[18480,18485],{"type":17,"tag":48,"props":18481,"children":18482},{},[18483],{"type":23,"value":18484},"Location IDs differ",{"type":17,"tag":80,"props":18486,"children":18487},{},[18488,18493,18498],{"type":17,"tag":84,"props":18489,"children":18490},{},[18491],{"type":23,"value":18492},"Google uses geoTargetConstants",{"type":17,"tag":84,"props":18494,"children":18495},{},[18496],{"type":23,"value":18497},"Meta uses location IDs",{"type":17,"tag":84,"props":18499,"children":18500},{},[18501],{"type":23,"value":18502},"TikTok uses category IDs",{"type":17,"tag":84,"props":18504,"children":18505},{},[18506,18511],{"type":17,"tag":48,"props":18507,"children":18508},{},[18509],{"type":23,"value":18510},"Audience definitions differ",{"type":17,"tag":80,"props":18512,"children":18513},{},[18514],{"type":17,"tag":84,"props":18515,"children":18516},{},[18517],{"type":23,"value":18518},"interests, behaviors, custom audiences all vary",{"type":17,"tag":84,"props":18520,"children":18521},{},[18522],{"type":17,"tag":48,"props":18523,"children":18524},{},[18525],{"type":23,"value":18526},"Supported targeting types vary",{"type":17,"tag":84,"props":18528,"children":18529},{},[18530],{"type":17,"tag":48,"props":18531,"children":18532},{},[18533],{"type":23,"value":18534},"Validation rules vary",{"type":17,"tag":29,"props":18536,"children":18537},{},[18538],{"type":23,"value":18539},"This creates a common failure mode:",{"type":17,"tag":3414,"props":18541,"children":18542},{},[18543],{"type":17,"tag":29,"props":18544,"children":18545},{},[18546],{"type":23,"value":18547},"You can build campaign creation for one integration, but not for many.",{"type":17,"tag":29,"props":18549,"children":18550},{},[18551],{"type":23,"value":18552},"The problem is not campaign creation.",{"type":17,"tag":29,"props":18554,"children":18555},{},[18556,18558,18563],{"type":23,"value":18557},"The problem is ",{"type":17,"tag":48,"props":18559,"children":18560},{},[18561],{"type":23,"value":18562},"identifier lookup and mapping",{"type":23,"value":54},{"type":17,"tag":68,"props":18565,"children":18567},{"id":18566},"how-targeting-works-in-advertising-apis",[18568],{"type":23,"value":18569},"How Targeting Works in Advertising APIs",{"type":17,"tag":29,"props":18571,"children":18572},{},[18573],{"type":23,"value":18574},"Targeting is not applied at the same level everywhere.",{"type":17,"tag":239,"props":18576,"children":18578},{"id":18577},"object-structure",[18579],{"type":23,"value":18580},"Object structure",{"type":17,"tag":7231,"props":18582,"children":18583},{},[18584,18600],{"type":17,"tag":7235,"props":18585,"children":18586},{},[18587],{"type":17,"tag":7239,"props":18588,"children":18589},{},[18590,18595],{"type":17,"tag":7243,"props":18591,"children":18592},{},[18593],{"type":23,"value":18594},"Object",{"type":17,"tag":7243,"props":18596,"children":18597},{},[18598],{"type":23,"value":18599},"Role",{"type":17,"tag":7259,"props":18601,"children":18602},{},[18603,18616,18629,18642],{"type":17,"tag":7239,"props":18604,"children":18605},{},[18606,18611],{"type":17,"tag":7266,"props":18607,"children":18608},{},[18609],{"type":23,"value":18610},"Campaign",{"type":17,"tag":7266,"props":18612,"children":18613},{},[18614],{"type":23,"value":18615},"Budget, schedule, status",{"type":17,"tag":7239,"props":18617,"children":18618},{},[18619,18624],{"type":17,"tag":7266,"props":18620,"children":18621},{},[18622],{"type":23,"value":18623},"Group",{"type":17,"tag":7266,"props":18625,"children":18626},{},[18627],{"type":23,"value":18628},"Targeting and delivery controls",{"type":17,"tag":7239,"props":18630,"children":18631},{},[18632,18637],{"type":17,"tag":7266,"props":18633,"children":18634},{},[18635],{"type":23,"value":18636},"Ad",{"type":17,"tag":7266,"props":18638,"children":18639},{},[18640],{"type":23,"value":18641},"Creative",{"type":17,"tag":7239,"props":18643,"children":18644},{},[18645,18649],{"type":17,"tag":7266,"props":18646,"children":18647},{},[18648],{"type":23,"value":11314},{"type":17,"tag":7266,"props":18650,"children":18651},{},[18652],{"type":23,"value":18653},"Lookup values (IDs)",{"type":17,"tag":239,"props":18655,"children":18657},{"id":18656},"key-rule",[18658],{"type":23,"value":18659},"Key rule",{"type":17,"tag":80,"props":18661,"children":18662},{},[18663,18678,18687],{"type":17,"tag":84,"props":18664,"children":18665},{},[18666,18668],{"type":23,"value":18667},"Targeting is ",{"type":17,"tag":133,"props":18669,"children":18672},{"href":18670,"rel":18671},"https://docs.unified.to/ads/integrations",[214],[18673],{"type":17,"tag":48,"props":18674,"children":18675},{},[18676],{"type":23,"value":18677},"readable on campaigns",{"type":17,"tag":84,"props":18679,"children":18680},{},[18681,18682],{"type":23,"value":18667},{"type":17,"tag":48,"props":18683,"children":18684},{},[18685],{"type":23,"value":18686},"configured primarily at the group level",{"type":17,"tag":84,"props":18688,"children":18689},{},[18690],{"type":23,"value":18691},"Campaign-level targeting is only supported by some integrations",{"type":17,"tag":29,"props":18693,"children":18694},{},[18695],{"type":23,"value":18696},"This distinction matters when building a product.",{"type":17,"tag":68,"props":18698,"children":18700},{"id":18699},"step-1-look-up-targeting-ids",[18701],{"type":23,"value":18702},"Step 1: Look Up Targeting IDs",{"type":17,"tag":29,"props":18704,"children":18705},{},[18706],{"type":23,"value":18707},"Before you can define targeting, you need valid identifiers.",{"type":17,"tag":29,"props":18709,"children":18710},{},[18711],{"type":23,"value":18712},"Unified provides a lookup endpoint:",{"type":17,"tag":6893,"props":18714,"children":18719},{"className":18715,"code":18717,"language":18718,"meta":7},[18716],"language-typescript","const targets = await sdk.ads.listAdsTargets({\n  connectionId,\n  type: 'countries',\n  query: 'united',\n  limit: 50,\n});\n","typescript",[18720],{"type":17,"tag":6121,"props":18721,"children":18722},{"__ignoreMap":7},[18723],{"type":23,"value":18717},{"type":17,"tag":239,"props":18725,"children":18727},{"id":18726},"target-object",[18728],{"type":23,"value":18729},"Target object",{"type":17,"tag":6893,"props":18731,"children":18734},{"className":18732,"code":18733,"language":18718,"meta":7},[18716],"type AdsTarget = {\n  id: string;\n  name?: string;\n  value: string;\n  type?:\n    | 'interests'\n    | 'behaviors'\n    | 'locales'\n    | 'countries'\n    | 'regions'\n    | 'cities'\n    | 'zips'\n    | 'us_dmas'\n    | 'topics'\n    | 'user_lists'\n    | 'age_ranges'\n    | 'genders';\n}\n",[18735],{"type":17,"tag":6121,"props":18736,"children":18737},{"__ignoreMap":7},[18738],{"type":23,"value":18733},{"type":17,"tag":239,"props":18740,"children":18742},{"id":18741},"important",[18743],{"type":23,"value":18744},"Important",{"type":17,"tag":80,"props":18746,"children":18747},{},[18748,18773,18784],{"type":17,"tag":84,"props":18749,"children":18750},{},[18751,18756,18758,18767,18768],{"type":17,"tag":48,"props":18752,"children":18753},{},[18754],{"type":23,"value":18755},"Use",{"type":23,"value":18757}," ",{"type":17,"tag":48,"props":18759,"children":18760},{},[18761],{"type":17,"tag":6121,"props":18762,"children":18764},{"className":18763},[],[18765],{"type":23,"value":18766},"id",{"type":23,"value":18757},{"type":17,"tag":48,"props":18769,"children":18770},{},[18771],{"type":23,"value":18772},"when building targeting payloads",{"type":17,"tag":84,"props":18774,"children":18775},{},[18776,18782],{"type":17,"tag":6121,"props":18777,"children":18779},{"className":18778},[],[18780],{"type":23,"value":18781},"name",{"type":23,"value":18783}," is for readability",{"type":17,"tag":84,"props":18785,"children":18786},{},[18787,18793],{"type":17,"tag":6121,"props":18788,"children":18790},{"className":18789},[],[18791],{"type":23,"value":18792},"value",{"type":23,"value":18794}," reflects the provider-specific identifier",{"type":17,"tag":68,"props":18796,"children":18798},{"id":18797},"supported-targeting-types",[18799],{"type":23,"value":18800},"Supported Targeting Types",{"type":17,"tag":29,"props":18802,"children":18803},{},[18804],{"type":23,"value":18805},"The lookup endpoint supports:",{"type":17,"tag":80,"props":18807,"children":18808},{},[18809,18822,18835,18848],{"type":17,"tag":84,"props":18810,"children":18811},{},[18812,18814],{"type":23,"value":18813},"Geographic\n",{"type":17,"tag":80,"props":18815,"children":18816},{},[18817],{"type":17,"tag":84,"props":18818,"children":18819},{},[18820],{"type":23,"value":18821},"countries, regions, cities, zips, us_dmas",{"type":17,"tag":84,"props":18823,"children":18824},{},[18825,18827],{"type":23,"value":18826},"Demographic\n",{"type":17,"tag":80,"props":18828,"children":18829},{},[18830],{"type":17,"tag":84,"props":18831,"children":18832},{},[18833],{"type":23,"value":18834},"age_ranges, genders",{"type":17,"tag":84,"props":18836,"children":18837},{},[18838,18840],{"type":23,"value":18839},"Audience\n",{"type":17,"tag":80,"props":18841,"children":18842},{},[18843],{"type":17,"tag":84,"props":18844,"children":18845},{},[18846],{"type":23,"value":18847},"interests, behaviors, topics, user_lists",{"type":17,"tag":84,"props":18849,"children":18850},{},[18851,18853],{"type":23,"value":18852},"Language\n",{"type":17,"tag":80,"props":18854,"children":18855},{},[18856],{"type":17,"tag":84,"props":18857,"children":18858},{},[18859],{"type":23,"value":18860},"locales",{"type":17,"tag":29,"props":18862,"children":18863},{},[18864],{"type":23,"value":18865},"Support varies by integration.",{"type":17,"tag":68,"props":18867,"children":18869},{"id":18868},"step-2-map-targeting-into-a-payload",[18870],{"type":23,"value":18871},"Step 2: Map Targeting into a Payload",{"type":17,"tag":29,"props":18873,"children":18874},{},[18875],{"type":23,"value":18876},"Once you have IDs, you construct the targeting object.",{"type":17,"tag":239,"props":18878,"children":18880},{"id":18879},"example-geographic-demographic-audience",[18881],{"type":23,"value":18882},"Example: Geographic + demographic + audience",{"type":17,"tag":6893,"props":18884,"children":18887},{"className":18885,"code":18886,"language":18718,"meta":7},[18716],"const targeting = {\n  geographic: {\n    countries: ['US'],\n    regions: [{ id: '3843', name: 'California' }],\n  },\n  demographic: {\n    ageMin: 25,\n    ageMax: 54,\n    male: true,\n    female: true,\n  },\n  audience: {\n    interests: [\n      { id: '600313926646746', name: 'Technology' }\n    ],\n  },\n};\n",[18888],{"type":17,"tag":6121,"props":18889,"children":18890},{"__ignoreMap":7},[18891],{"type":23,"value":18886},{"type":17,"tag":239,"props":18893,"children":18895},{"id":18894},"key-concept",[18896],{"type":23,"value":18897},"Key concept",{"type":17,"tag":29,"props":18899,"children":18900},{},[18901],{"type":23,"value":18902},"You are not mapping per integration.",{"type":17,"tag":29,"props":18904,"children":18905},{},[18906,18908,18913],{"type":23,"value":18907},"You are using a ",{"type":17,"tag":48,"props":18909,"children":18910},{},[18911],{"type":23,"value":18912},"consistent structure",{"type":23,"value":18914},", and supplying provider-specific IDs.",{"type":17,"tag":68,"props":18916,"children":18918},{"id":18917},"step-3-apply-targeting-at-the-group-level",[18919],{"type":23,"value":18920},"Step 3: Apply Targeting at the Group Level",{"type":17,"tag":29,"props":18922,"children":18923},{},[18924],{"type":23,"value":18925},"For most integrations, targeting is applied to the group (ad set / ad group).",{"type":17,"tag":6893,"props":18927,"children":18930},{"className":18928,"code":18929,"language":18718,"meta":7},[18716],"const group = await sdk.ads.getAdsGroup({\n  connectionId,\n  id: groupId,\n});\n\nawait sdk.ads.updateAdsGroup({\n  connectionId,\n  id: groupId,\n  adsGroup: {\n    ...group,\n    targeting,\n  },\n});\n",[18931],{"type":17,"tag":6121,"props":18932,"children":18933},{"__ignoreMap":7},[18934],{"type":23,"value":18929},{"type":17,"tag":29,"props":18936,"children":18937},{},[18938],{"type":23,"value":18939},"This is the primary targeting workflow.",{"type":17,"tag":68,"props":18941,"children":18943},{"id":18942},"step-4-campaign-creation-with-targeting",[18944],{"type":23,"value":18945},"Step 4: Campaign Creation with Targeting",{"type":17,"tag":29,"props":18947,"children":18948},{},[18949],{"type":23,"value":18950},"Campaign-level targeting is supported only by some integrations.",{"type":17,"tag":29,"props":18952,"children":18953},{},[18954],{"type":23,"value":18955},"You can still include targeting in campaign creation:",{"type":17,"tag":6893,"props":18957,"children":18960},{"className":18958,"code":18959,"language":18718,"meta":7},[18716],"await sdk.ads.createAdsCampaign({\n  connectionId,\n  adsCampaign: {\n    name: 'Spring Campaign',\n    status: 'ACTIVE',\n    budgetAmount: 5000,\n    budgetPeriod: 'DAILY',\n    targeting, // applied where supported\n  },\n});\n",[18961],{"type":17,"tag":6121,"props":18962,"children":18963},{"__ignoreMap":7},[18964],{"type":23,"value":18959},{"type":17,"tag":239,"props":18966,"children":18968},{"id":18967},"important-1",[18969],{"type":23,"value":18744},{"type":17,"tag":80,"props":18971,"children":18972},{},[18973,18978],{"type":17,"tag":84,"props":18974,"children":18975},{},[18976],{"type":23,"value":18977},"Some integrations will apply targeting at campaign level",{"type":17,"tag":84,"props":18979,"children":18980},{},[18981],{"type":23,"value":18982},"Others will ignore it or require group-level configuration",{"type":17,"tag":29,"props":18984,"children":18985},{},[18986],{"type":23,"value":18987},"Your product should:",{"type":17,"tag":80,"props":18989,"children":18990},{},[18991,18996],{"type":17,"tag":84,"props":18992,"children":18993},{},[18994],{"type":23,"value":18995},"support both patterns",{"type":17,"tag":84,"props":18997,"children":18998},{},[18999],{"type":23,"value":19000},"default to group-level targeting",{"type":17,"tag":68,"props":19002,"children":19004},{"id":19003},"step-5-provider-differences",[19005],{"type":23,"value":19006},"Step 5: Provider Differences",{"type":17,"tag":29,"props":19008,"children":19009},{},[19010],{"type":23,"value":19011},"Targeting capabilities vary.",{"type":17,"tag":239,"props":19013,"children":19015},{"id":19014},"examples",[19016],{"type":23,"value":19017},"Examples",{"type":17,"tag":80,"props":19019,"children":19020},{},[19021,19034,19052,19065],{"type":17,"tag":84,"props":19022,"children":19023},{},[19024,19026],{"type":23,"value":19025},"Meta Ads\n",{"type":17,"tag":80,"props":19027,"children":19028},{},[19029],{"type":17,"tag":84,"props":19030,"children":19031},{},[19032],{"type":23,"value":19033},"supports most targeting types",{"type":17,"tag":84,"props":19035,"children":19036},{},[19037,19039],{"type":23,"value":19038},"Google Ads\n",{"type":17,"tag":80,"props":19040,"children":19041},{},[19042,19047],{"type":17,"tag":84,"props":19043,"children":19044},{},[19045],{"type":23,"value":19046},"supports geographic and interest-based targeting",{"type":17,"tag":84,"props":19048,"children":19049},{},[19050],{"type":23,"value":19051},"has different placement and optimization behavior",{"type":17,"tag":84,"props":19053,"children":19054},{},[19055,19057],{"type":23,"value":19056},"TikTok Ads\n",{"type":17,"tag":80,"props":19058,"children":19059},{},[19060],{"type":17,"tag":84,"props":19061,"children":19062},{},[19063],{"type":23,"value":19064},"supports a subset of targeting types",{"type":17,"tag":84,"props":19066,"children":19067},{},[19068,19070],{"type":23,"value":19069},"Amazon Ads / X Ads\n",{"type":17,"tag":80,"props":19071,"children":19072},{},[19073],{"type":17,"tag":84,"props":19074,"children":19075},{},[19076],{"type":23,"value":19077},"may only support countries and locales",{"type":17,"tag":239,"props":19079,"children":19081},{"id":19080},"what-this-means",[19082],{"type":23,"value":19083},"What this means",{"type":17,"tag":29,"props":19085,"children":19086},{},[19087],{"type":23,"value":19088},"You must:",{"type":17,"tag":80,"props":19090,"children":19091},{},[19092,19097,19102],{"type":17,"tag":84,"props":19093,"children":19094},{},[19095],{"type":23,"value":19096},"detect available targeting types",{"type":17,"tag":84,"props":19098,"children":19099},{},[19100],{"type":23,"value":19101},"limit UI options accordingly",{"type":17,"tag":84,"props":19103,"children":19104},{},[19105],{"type":23,"value":19106},"handle unsupported cases",{"type":17,"tag":68,"props":19108,"children":19110},{"id":19109},"step-6-fallback-for-unsupported-targeting",[19111],{"type":23,"value":19112},"Step 6: Fallback for Unsupported Targeting",{"type":17,"tag":29,"props":19114,"children":19115},{},[19116],{"type":23,"value":19117},"If a targeting type is not available through the unified lookup:",{"type":17,"tag":80,"props":19119,"children":19120},{},[19121,19126],{"type":17,"tag":84,"props":19122,"children":19123},{},[19124],{"type":23,"value":19125},"use the Passthrough API",{"type":17,"tag":84,"props":19127,"children":19128},{},[19129],{"type":23,"value":19130},"call the integration's native endpoint",{"type":17,"tag":29,"props":19132,"children":19133},{},[19134],{"type":23,"value":19135},"This gives you access to provider-specific targeting while still using:",{"type":17,"tag":80,"props":19137,"children":19138},{},[19139,19144,19149],{"type":17,"tag":84,"props":19140,"children":19141},{},[19142],{"type":23,"value":19143},"Unified authorization",{"type":17,"tag":84,"props":19145,"children":19146},{},[19147],{"type":23,"value":19148},"connection management",{"type":17,"tag":84,"props":19150,"children":19151},{},[19152],{"type":23,"value":19153},"consistent request structure",{"type":17,"tag":68,"props":19155,"children":19157},{"id":19156},"step-7-end-to-end-targeting-flow",[19158],{"type":23,"value":19159},"Step 7: End-to-End Targeting Flow",{"type":17,"tag":6893,"props":19161,"children":19164},{"className":19162,"code":19163,"language":18718,"meta":7},[18716],"// 1. Lookup targets\nconst countries = await sdk.ads.listAdsTargets({\n  connectionId,\n  type: 'countries',\n  query: 'united',\n});\n\n// 2. Build targeting\nconst targeting = {\n  geographic: {\n    countries: [countries[0].id],\n  },\n};\n\n// 3. Apply to group\nconst group = await sdk.ads.getAdsGroup({ connectionId, id: groupId });\n\nawait sdk.ads.updateAdsGroup({\n  connectionId,\n  id: groupId,\n  adsGroup: {\n    ...group,\n    targeting,\n  },\n});\n",[19165],{"type":17,"tag":6121,"props":19166,"children":19167},{"__ignoreMap":7},[19168],{"type":23,"value":19163},{"type":17,"tag":29,"props":19170,"children":19171},{},[19172],{"type":23,"value":19173},"This is the minimal cross-platform targeting pipeline.",{"type":17,"tag":68,"props":19175,"children":19176},{"id":883},[19177],{"type":23,"value":19178},"Why This Matters",{"type":17,"tag":29,"props":19180,"children":19181},{},[19182],{"type":23,"value":19183},"Without a targeting lookup layer:",{"type":17,"tag":80,"props":19185,"children":19186},{},[19187,19192,19197],{"type":17,"tag":84,"props":19188,"children":19189},{},[19190],{"type":23,"value":19191},"you must map IDs per integration",{"type":17,"tag":84,"props":19193,"children":19194},{},[19195],{"type":23,"value":19196},"you must maintain lookup logic per integration",{"type":17,"tag":84,"props":19198,"children":19199},{},[19200],{"type":23,"value":19201},"you must validate targeting per integration",{"type":17,"tag":29,"props":19203,"children":19204},{},[19205],{"type":23,"value":19206},"That becomes:",{"type":17,"tag":80,"props":19208,"children":19209},{},[19210,19215,19220],{"type":17,"tag":84,"props":19211,"children":19212},{},[19213],{"type":23,"value":19214},"fragile",{"type":17,"tag":84,"props":19216,"children":19217},{},[19218],{"type":23,"value":19219},"expensive",{"type":17,"tag":84,"props":19221,"children":19222},{},[19223],{"type":23,"value":543},{"type":17,"tag":29,"props":19225,"children":19226},{},[19227],{"type":23,"value":19228},"Unified changes this by:",{"type":17,"tag":80,"props":19230,"children":19231},{},[19232,19237,19242],{"type":17,"tag":84,"props":19233,"children":19234},{},[19235],{"type":23,"value":19236},"providing a unified lookup endpoint",{"type":17,"tag":84,"props":19238,"children":19239},{},[19240],{"type":23,"value":19241},"standardizing targeting structure",{"type":17,"tag":84,"props":19243,"children":19244},{},[19245],{"type":23,"value":19246},"allowing reuse across integrations",{"type":17,"tag":29,"props":19248,"children":19249},{},[19250],{"type":23,"value":19251},"This removes per-integration mapping logic and reduces maintenance risk .",{"type":17,"tag":68,"props":19253,"children":19254},{"id":7672},[19255],{"type":23,"value":19256},"Key Takeaways",{"type":17,"tag":80,"props":19258,"children":19259},{},[19260,19265,19270,19275,19280,19285,19290],{"type":17,"tag":84,"props":19261,"children":19262},{},[19263],{"type":23,"value":19264},"Targeting is the hardest part of campaign management",{"type":17,"tag":84,"props":19266,"children":19267},{},[19268],{"type":23,"value":19269},"Each integration uses different identifiers and structures",{"type":17,"tag":84,"props":19271,"children":19272},{},[19273],{"type":23,"value":19274},"Unified provides a lookup endpoint for targeting IDs",{"type":17,"tag":84,"props":19276,"children":19277},{},[19278],{"type":23,"value":19279},"Targeting is primarily applied at the group level",{"type":17,"tag":84,"props":19281,"children":19282},{},[19283],{"type":23,"value":19284},"Campaign-level targeting is integration-dependent",{"type":17,"tag":84,"props":19286,"children":19287},{},[19288],{"type":23,"value":19289},"IDs should always be used for reliability",{"type":17,"tag":84,"props":19291,"children":19292},{},[19293],{"type":23,"value":19294},"Provider differences must be handled explicitly",{"type":17,"tag":29,"props":19296,"children":19297},{},[19298],{"type":23,"value":19299},"If you're building campaign creation, optimization, or automation features, this is the layer that determines whether your product can support multiple integrations without custom logic.",{"type":17,"tag":29,"props":19301,"children":19302},{},[19303,19304],{"type":23,"value":1609},{"type":17,"tag":133,"props":19305,"children":19307},{"href":1612,"rel":19306},[214],[19308],{"type":23,"value":1616},{"type":17,"tag":29,"props":19310,"children":19311},{},[19312,19313],{"type":23,"value":1609},{"type":17,"tag":133,"props":19314,"children":19316},{"href":1623,"rel":19315},[214],[19317],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":19319},[19320,19321,19325,19329,19330,19334,19335,19338,19342,19343,19344,19345],{"id":18460,"depth":1629,"text":18463},{"id":18566,"depth":1629,"text":18569,"children":19322},[19323,19324],{"id":18577,"depth":1635,"text":18580},{"id":18656,"depth":1635,"text":18659},{"id":18699,"depth":1629,"text":18702,"children":19326},[19327,19328],{"id":18726,"depth":1635,"text":18729},{"id":18741,"depth":1635,"text":18744},{"id":18797,"depth":1629,"text":18800},{"id":18868,"depth":1629,"text":18871,"children":19331},[19332,19333],{"id":18879,"depth":1635,"text":18882},{"id":18894,"depth":1635,"text":18897},{"id":18917,"depth":1629,"text":18920},{"id":18942,"depth":1629,"text":18945,"children":19336},[19337],{"id":18967,"depth":1635,"text":18744},{"id":19003,"depth":1629,"text":19006,"children":19339},[19340,19341],{"id":19014,"depth":1635,"text":19017},{"id":19080,"depth":1635,"text":19083},{"id":19109,"depth":1629,"text":19112},{"id":19156,"depth":1629,"text":19159},{"id":883,"depth":1629,"text":19178},{"id":7672,"depth":1629,"text":19256},"content:blog:how_to_build_cross_platform_ad_targeting_lookup_mapping_and_campaign_creation.md","blog/how_to_build_cross_platform_ad_targeting_lookup_mapping_and_campaign_creation.md","blog/how_to_build_cross_platform_ad_targeting_lookup_mapping_and_campaign_creation",{"_path":19350,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":19351,"description":19352,"img":19353,"date":19354,"tag":12,"body":19355,"_type":1677,"_id":20569,"_source":1679,"_file":20570,"_stem":20571,"_extension":1682},"/blog/how_to_build_an_ai_reservation_agent_using_a_unified_commerce_api","How to Build an AI Reservation Agent Using a Unified Commerce API","An AI booking agent translates user intent into API calls that search locations, retrieve availability, and create reservations. Using the Unified Commerce...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_ai_reservation_agent_using_a_unified_commerce_api-icon.png","2026-03-24T23:54:00.000Z",{"type":14,"children":19356,"toc":20535},[19357,19362,19365,19373,19387,19393,19398,19421,19425,19433,19438,19461,19473,19479,19484,19502,19507,19525,19531,19536,19607,19612,19631,19637,19642,19648,19653,19671,19677,19682,19700,19706,19711,19724,19730,19735,19741,19747,19756,19769,19775,19784,19789,19802,19808,19817,19822,19845,19851,19856,19874,19879,19888,19894,19903,19908,19926,19932,19937,19955,19959,19968,19974,19979,19985,19998,20004,20072,20077,20085,20091,20096,20114,20119,20132,20138,20144,20149,20195,20201,20206,20219,20224,20237,20243,20248,20261,20266,20274,20280,20285,20290,20309,20315,20402,20407,20415,20421,20426,20444,20457,20475,20480,20484,20517,20526],{"type":17,"tag":18,"props":19358,"children":19360},{"id":19359},"how-to-build-an-ai-reservation-agent-using-a-unified-commerce-api",[19361],{"type":23,"value":19351},{"type":17,"tag":25,"props":19363,"children":19364},{},[],{"type":17,"tag":29,"props":19366,"children":19367},{},[19368],{"type":17,"tag":33,"props":19369,"children":19370},{},[19371],{"type":23,"value":19372},"March 24, 2026",{"type":17,"tag":29,"props":19374,"children":19375},{},[19376,19378,19385],{"type":23,"value":19377},"An AI booking agent translates user intent into API calls that search locations, retrieve availability, and create reservations. Using the ",{"type":17,"tag":133,"props":19379,"children":19382},{"href":19380,"rel":19381},"https://unified.to/commerce",[214],[19383],{"type":23,"value":19384},"Unified Commerce API",{"type":23,"value":19386},", developers can implement this flow across OpenTable, Yelp, SevenRooms, and resOS with a consistent set of objects and endpoints.",{"type":17,"tag":68,"props":19388,"children":19390},{"id":19389},"what-an-ai-booking-agent-actually-does",[19391],{"type":23,"value":19392},"What an AI booking agent actually does",{"type":17,"tag":29,"props":19394,"children":19395},{},[19396],{"type":23,"value":19397},"An AI booking agent is not a generic chatbot. It is a system that:",{"type":17,"tag":6154,"props":19399,"children":19400},{},[19401,19406,19411,19416],{"type":17,"tag":84,"props":19402,"children":19403},{},[19404],{"type":23,"value":19405},"interprets user intent",{"type":17,"tag":84,"props":19407,"children":19408},{},[19409],{"type":23,"value":19410},"calls structured APIs",{"type":17,"tag":84,"props":19412,"children":19413},{},[19414],{"type":23,"value":19415},"makes decisions based on real data",{"type":17,"tag":84,"props":19417,"children":19418},{},[19419],{"type":23,"value":19420},"executes a booking",{"type":17,"tag":29,"props":19422,"children":19423},{},[19424],{"type":23,"value":3258},{"type":17,"tag":3414,"props":19426,"children":19427},{},[19428],{"type":17,"tag":29,"props":19429,"children":19430},{},[19431],{"type":23,"value":19432},"'Book dinner for 2 near me at 7pm'",{"type":17,"tag":29,"props":19434,"children":19435},{},[19436],{"type":23,"value":19437},"The agent must:",{"type":17,"tag":80,"props":19439,"children":19440},{},[19441,19446,19451,19456],{"type":17,"tag":84,"props":19442,"children":19443},{},[19444],{"type":23,"value":19445},"find relevant locations",{"type":17,"tag":84,"props":19447,"children":19448},{},[19449],{"type":23,"value":19450},"retrieve available time slots",{"type":17,"tag":84,"props":19452,"children":19453},{},[19454],{"type":23,"value":19455},"select a valid option",{"type":17,"tag":84,"props":19457,"children":19458},{},[19459],{"type":23,"value":19460},"create a reservation",{"type":17,"tag":29,"props":19462,"children":19463},{},[19464,19466,19471],{"type":23,"value":19465},"This requires ",{"type":17,"tag":48,"props":19467,"children":19468},{},[19469],{"type":23,"value":19470},"structured API access",{"type":23,"value":19472},", not scraping or static data.",{"type":17,"tag":68,"props":19474,"children":19476},{"id":19475},"why-booking-is-a-strong-ai-use-case",[19477],{"type":23,"value":19478},"Why booking is a strong AI use case",{"type":17,"tag":29,"props":19480,"children":19481},{},[19482],{"type":23,"value":19483},"Booking is one of the most practical applications for AI agents because:",{"type":17,"tag":80,"props":19485,"children":19486},{},[19487,19492,19497],{"type":17,"tag":84,"props":19488,"children":19489},{},[19490],{"type":23,"value":19491},"inputs are structured (time, party size, location)",{"type":17,"tag":84,"props":19493,"children":19494},{},[19495],{"type":23,"value":19496},"outputs are constrained (available slots)",{"type":17,"tag":84,"props":19498,"children":19499},{},[19500],{"type":23,"value":19501},"success is binary (reservation created or not)",{"type":17,"tag":29,"props":19503,"children":19504},{},[19505],{"type":23,"value":19506},"Unlike open-ended workflows, booking has:",{"type":17,"tag":80,"props":19508,"children":19509},{},[19510,19515,19520],{"type":17,"tag":84,"props":19511,"children":19512},{},[19513],{"type":23,"value":19514},"clear constraints",{"type":17,"tag":84,"props":19516,"children":19517},{},[19518],{"type":23,"value":19519},"deterministic APIs",{"type":17,"tag":84,"props":19521,"children":19522},{},[19523],{"type":23,"value":19524},"a defined execution step",{"type":17,"tag":68,"props":19526,"children":19528},{"id":19527},"reservation-based-commerce-model",[19529],{"type":23,"value":19530},"Reservation-based commerce model",{"type":17,"tag":29,"props":19532,"children":19533},{},[19534],{"type":23,"value":19535},"AI booking relies on a specific subset of commerce integrations.",{"type":17,"tag":7231,"props":19537,"children":19538},{},[19539,19554],{"type":17,"tag":7235,"props":19540,"children":19541},{},[19542],{"type":17,"tag":7239,"props":19543,"children":19544},{},[19545,19549],{"type":17,"tag":7243,"props":19546,"children":19547},{},[19548],{"type":23,"value":18594},{"type":17,"tag":7243,"props":19550,"children":19551},{},[19552],{"type":23,"value":19553},"Role in agent",{"type":17,"tag":7259,"props":19555,"children":19556},{},[19557,19570,19582,19594],{"type":17,"tag":7239,"props":19558,"children":19559},{},[19560,19565],{"type":17,"tag":7266,"props":19561,"children":19562},{},[19563],{"type":23,"value":19564},"Location",{"type":17,"tag":7266,"props":19566,"children":19567},{},[19568],{"type":23,"value":19569},"where the booking happens",{"type":17,"tag":7239,"props":19571,"children":19572},{},[19573,19577],{"type":17,"tag":7266,"props":19574,"children":19575},{},[19576],{"type":23,"value":11140},{"type":17,"tag":7266,"props":19578,"children":19579},{},[19580],{"type":23,"value":19581},"available time slots",{"type":17,"tag":7239,"props":19583,"children":19584},{},[19585,19589],{"type":17,"tag":7266,"props":19586,"children":19587},{},[19588],{"type":23,"value":11145},{"type":17,"tag":7266,"props":19590,"children":19591},{},[19592],{"type":23,"value":19593},"confirmed booking",{"type":17,"tag":7239,"props":19595,"children":19596},{},[19597,19602],{"type":17,"tag":7266,"props":19598,"children":19599},{},[19600],{"type":23,"value":19601},"Review",{"type":17,"tag":7266,"props":19603,"children":19604},{},[19605],{"type":23,"value":19606},"optional ranking or filtering",{"type":17,"tag":29,"props":19608,"children":19609},{},[19610],{"type":23,"value":19611},"Important constraint:",{"type":17,"tag":80,"props":19613,"children":19614},{},[19615,19623],{"type":17,"tag":84,"props":19616,"children":19617},{},[19618],{"type":17,"tag":48,"props":19619,"children":19620},{},[19621],{"type":23,"value":19622},"Availability is read-only",{"type":17,"tag":84,"props":19624,"children":19625},{},[19626],{"type":17,"tag":48,"props":19627,"children":19628},{},[19629],{"type":23,"value":19630},"Reservation is the write path",{"type":17,"tag":68,"props":19632,"children":19634},{"id":19633},"agent-architecture",[19635],{"type":23,"value":19636},"Agent architecture",{"type":17,"tag":29,"props":19638,"children":19639},{},[19640],{"type":23,"value":19641},"A production-ready AI booking agent typically includes:",{"type":17,"tag":239,"props":19643,"children":19645},{"id":19644},"_1-intent-layer-llm",[19646],{"type":23,"value":19647},"1. Intent layer (LLM)",{"type":17,"tag":29,"props":19649,"children":19650},{},[19651],{"type":23,"value":19652},"Parses:",{"type":17,"tag":80,"props":19654,"children":19655},{},[19656,19661,19666],{"type":17,"tag":84,"props":19657,"children":19658},{},[19659],{"type":23,"value":19660},"time ('7pm')",{"type":17,"tag":84,"props":19662,"children":19663},{},[19664],{"type":23,"value":19665},"party size ('2 people')",{"type":17,"tag":84,"props":19667,"children":19668},{},[19669],{"type":23,"value":19670},"location ('near me')",{"type":17,"tag":239,"props":19672,"children":19674},{"id":19673},"_2-tool-layer-unified-commerce-api",[19675],{"type":23,"value":19676},"2. Tool layer (Unified Commerce API)",{"type":17,"tag":29,"props":19678,"children":19679},{},[19680],{"type":23,"value":19681},"Provides structured operations:",{"type":17,"tag":80,"props":19683,"children":19684},{},[19685,19690,19695],{"type":17,"tag":84,"props":19686,"children":19687},{},[19688],{"type":23,"value":19689},"list locations",{"type":17,"tag":84,"props":19691,"children":19692},{},[19693],{"type":23,"value":19694},"retrieve availability",{"type":17,"tag":84,"props":19696,"children":19697},{},[19698],{"type":23,"value":19699},"create reservation",{"type":17,"tag":239,"props":19701,"children":19703},{"id":19702},"_3-decision-layer",[19704],{"type":23,"value":19705},"3. Decision layer",{"type":17,"tag":29,"props":19707,"children":19708},{},[19709],{"type":23,"value":19710},"Selects:",{"type":17,"tag":80,"props":19712,"children":19713},{},[19714,19719],{"type":17,"tag":84,"props":19715,"children":19716},{},[19717],{"type":23,"value":19718},"best location",{"type":17,"tag":84,"props":19720,"children":19721},{},[19722],{"type":23,"value":19723},"best time slot",{"type":17,"tag":239,"props":19725,"children":19727},{"id":19726},"_4-execution-layer",[19728],{"type":23,"value":19729},"4. Execution layer",{"type":17,"tag":29,"props":19731,"children":19732},{},[19733],{"type":23,"value":19734},"Creates the reservation and returns confirmation.",{"type":17,"tag":68,"props":19736,"children":19738},{"id":19737},"step-by-step-implementation",[19739],{"type":23,"value":19740},"Step-by-step implementation",{"type":17,"tag":239,"props":19742,"children":19744},{"id":19743},"step-1-initialize-the-sdk",[19745],{"type":23,"value":19746},"Step 1: Initialize the SDK",{"type":17,"tag":6893,"props":19748,"children":19751},{"className":19749,"code":19750,"language":18718,"meta":7},[18716],"import { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n",[19752],{"type":17,"tag":6121,"props":19753,"children":19754},{"__ignoreMap":7},[19755],{"type":23,"value":19750},{"type":17,"tag":29,"props":19757,"children":19758},{},[19759,19761,19767],{"type":23,"value":19760},"Each user must have a ",{"type":17,"tag":6121,"props":19762,"children":19764},{"className":19763},[],[19765],{"type":23,"value":19766},"connectionId",{"type":23,"value":19768}," for their authorized integration.",{"type":17,"tag":239,"props":19770,"children":19772},{"id":19771},"step-2-search-locations",[19773],{"type":23,"value":19774},"Step 2: Search locations",{"type":17,"tag":6893,"props":19776,"children":19779},{"className":19777,"code":19778,"language":18718,"meta":7},[18716],"const locations = await sdk.commerce.listCommerceLocations({\n  connectionId,\n});\n",[19780],{"type":17,"tag":6121,"props":19781,"children":19782},{"__ignoreMap":7},[19783],{"type":23,"value":19778},{"type":17,"tag":29,"props":19785,"children":19786},{},[19787],{"type":23,"value":19788},"The agent can:",{"type":17,"tag":80,"props":19790,"children":19791},{},[19792,19797],{"type":17,"tag":84,"props":19793,"children":19794},{},[19795],{"type":23,"value":19796},"filter by name or proximity (externally)",{"type":17,"tag":84,"props":19798,"children":19799},{},[19800],{"type":23,"value":19801},"rank based on relevance",{"type":17,"tag":239,"props":19803,"children":19805},{"id":19804},"step-3-retrieve-availability",[19806],{"type":23,"value":19807},"Step 3: Retrieve availability",{"type":17,"tag":6893,"props":19809,"children":19812},{"className":19810,"code":19811,"language":18718,"meta":7},[18716],"const availabilities = await sdk.commerce.listCommerceAvailabilities(\n  connectionId,\n  {\n    locationId: selectedLocationId,\n    startGte: \"2026-05-01T18:00:00Z\",\n    endLt: \"2026-05-01T22:00:00Z\",\n    size: 2,\n    limit: 20,\n  }\n);\n",[19813],{"type":17,"tag":6121,"props":19814,"children":19815},{"__ignoreMap":7},[19816],{"type":23,"value":19811},{"type":17,"tag":29,"props":19818,"children":19819},{},[19820],{"type":23,"value":19821},"Key points:",{"type":17,"tag":80,"props":19823,"children":19824},{},[19825,19835,19840],{"type":17,"tag":84,"props":19826,"children":19827},{},[19828,19830],{"type":23,"value":19829},"availability is ",{"type":17,"tag":48,"props":19831,"children":19832},{},[19833],{"type":23,"value":19834},"read-only",{"type":17,"tag":84,"props":19836,"children":19837},{},[19838],{"type":23,"value":19839},"filtering is critical for agent performance",{"type":17,"tag":84,"props":19841,"children":19842},{},[19843],{"type":23,"value":19844},"results return valid bookable time slots",{"type":17,"tag":239,"props":19846,"children":19848},{"id":19847},"step-4-select-a-time-slot",[19849],{"type":23,"value":19850},"Step 4: Select a time slot",{"type":17,"tag":29,"props":19852,"children":19853},{},[19854],{"type":23,"value":19855},"The agent chooses based on:",{"type":17,"tag":80,"props":19857,"children":19858},{},[19859,19864,19869],{"type":17,"tag":84,"props":19860,"children":19861},{},[19862],{"type":23,"value":19863},"closest match to requested time",{"type":17,"tag":84,"props":19865,"children":19866},{},[19867],{"type":23,"value":19868},"availability density",{"type":17,"tag":84,"props":19870,"children":19871},{},[19872],{"type":23,"value":19873},"optional business logic",{"type":17,"tag":29,"props":19875,"children":19876},{},[19877],{"type":23,"value":19878},"Example:",{"type":17,"tag":6893,"props":19880,"children":19883},{"className":19881,"code":19882,"language":18718,"meta":7},[18716],"const selectedSlot = availabilities.data[0];\n",[19884],{"type":17,"tag":6121,"props":19885,"children":19886},{"__ignoreMap":7},[19887],{"type":23,"value":19882},{"type":17,"tag":239,"props":19889,"children":19891},{"id":19890},"step-5-create-reservation",[19892],{"type":23,"value":19893},"Step 5: Create reservation",{"type":17,"tag":6893,"props":19895,"children":19898},{"className":19896,"code":19897,"language":18718,"meta":7},[18716],"const reservation = await sdk.commerce.createCommerceReservation({\n  connectionId,\n  commerceReservation: {\n    locationId: selectedSlot.location_id,\n    startAt: selectedSlot.start_at,\n    endAt: selectedSlot.end_at,\n    size: 2,\n    guestName: \"Jane Doe\",\n    guestEmail: \"jane@example.com\",\n  },\n});\n",[19899],{"type":17,"tag":6121,"props":19900,"children":19901},{"__ignoreMap":7},[19902],{"type":23,"value":19897},{"type":17,"tag":29,"props":19904,"children":19905},{},[19906],{"type":23,"value":19907},"Important:",{"type":17,"tag":80,"props":19909,"children":19910},{},[19911,19921],{"type":17,"tag":84,"props":19912,"children":19913},{},[19914,19916],{"type":23,"value":19915},"this is the ",{"type":17,"tag":48,"props":19917,"children":19918},{},[19919],{"type":23,"value":19920},"execution step",{"type":17,"tag":84,"props":19922,"children":19923},{},[19924],{"type":23,"value":19925},"all prior steps are preparation",{"type":17,"tag":239,"props":19927,"children":19929},{"id":19928},"step-6-confirm-result",[19930],{"type":23,"value":19931},"Step 6: Confirm result",{"type":17,"tag":29,"props":19933,"children":19934},{},[19935],{"type":23,"value":19936},"The response includes:",{"type":17,"tag":80,"props":19938,"children":19939},{},[19940,19945,19950],{"type":17,"tag":84,"props":19941,"children":19942},{},[19943],{"type":23,"value":19944},"reservation ID",{"type":17,"tag":84,"props":19946,"children":19947},{},[19948],{"type":23,"value":19949},"status",{"type":17,"tag":84,"props":19951,"children":19952},{},[19953],{"type":23,"value":19954},"timestamps",{"type":17,"tag":29,"props":19956,"children":19957},{},[19958],{"type":23,"value":19878},{"type":17,"tag":6893,"props":19960,"children":19963},{"className":19961,"code":19962,"language":18718,"meta":7},[18716],"console.log(reservation.id, reservation.status);\n",[19964],{"type":17,"tag":6121,"props":19965,"children":19966},{"__ignoreMap":7},[19967],{"type":23,"value":19962},{"type":17,"tag":68,"props":19969,"children":19971},{"id":19970},"handling-real-world-constraints",[19972],{"type":23,"value":19973},"Handling real-world constraints",{"type":17,"tag":29,"props":19975,"children":19976},{},[19977],{"type":23,"value":19978},"AI agents must handle incomplete or inconsistent support across integrations.",{"type":17,"tag":239,"props":19980,"children":19982},{"id":19981},"availability-constraints",[19983],{"type":23,"value":19984},"Availability constraints",{"type":17,"tag":80,"props":19986,"children":19987},{},[19988,19993],{"type":17,"tag":84,"props":19989,"children":19990},{},[19991],{"type":23,"value":19992},"always read-only",{"type":17,"tag":84,"props":19994,"children":19995},{},[19996],{"type":23,"value":19997},"may differ in structure across integrations",{"type":17,"tag":239,"props":19999,"children":20001},{"id":20000},"reservation-constraints",[20002],{"type":23,"value":20003},"Reservation constraints",{"type":17,"tag":7231,"props":20005,"children":20006},{},[20007,20023],{"type":17,"tag":7235,"props":20008,"children":20009},{},[20010],{"type":17,"tag":7239,"props":20011,"children":20012},{},[20013,20018],{"type":17,"tag":7243,"props":20014,"children":20015},{},[20016],{"type":23,"value":20017},"Integration",{"type":17,"tag":7243,"props":20019,"children":20020},{},[20021],{"type":23,"value":20022},"Behavior",{"type":17,"tag":7259,"props":20024,"children":20025},{},[20026,20038,20050,20061],{"type":17,"tag":7239,"props":20027,"children":20028},{},[20029,20033],{"type":17,"tag":7266,"props":20030,"children":20031},{},[20032],{"type":23,"value":11189},{"type":17,"tag":7266,"props":20034,"children":20035},{},[20036],{"type":23,"value":20037},"full reservation lifecycle",{"type":17,"tag":7239,"props":20039,"children":20040},{},[20041,20045],{"type":17,"tag":7266,"props":20042,"children":20043},{},[20044],{"type":23,"value":11169},{"type":17,"tag":7266,"props":20046,"children":20047},{},[20048],{"type":23,"value":20049},"create-only",{"type":17,"tag":7239,"props":20051,"children":20052},{},[20053,20057],{"type":17,"tag":7266,"props":20054,"children":20055},{},[20056],{"type":23,"value":11179},{"type":17,"tag":7266,"props":20058,"children":20059},{},[20060],{"type":23,"value":20049},{"type":17,"tag":7239,"props":20062,"children":20063},{},[20064,20068],{"type":17,"tag":7266,"props":20065,"children":20066},{},[20067],{"type":23,"value":11209},{"type":17,"tag":7266,"props":20069,"children":20070},{},[20071],{"type":23,"value":20049},{"type":17,"tag":29,"props":20073,"children":20074},{},[20075],{"type":23,"value":20076},"Implication:",{"type":17,"tag":3414,"props":20078,"children":20079},{},[20080],{"type":17,"tag":29,"props":20081,"children":20082},{},[20083],{"type":23,"value":20084},"the agent should prioritize successful creation, not full lifecycle control",{"type":17,"tag":239,"props":20086,"children":20088},{"id":20087},"field-variability",[20089],{"type":23,"value":20090},"Field variability",{"type":17,"tag":29,"props":20092,"children":20093},{},[20094],{"type":23,"value":20095},"Not all integrations support:",{"type":17,"tag":80,"props":20097,"children":20098},{},[20099,20104,20109],{"type":17,"tag":84,"props":20100,"children":20101},{},[20102],{"type":23,"value":20103},"staff assignment",{"type":17,"tag":84,"props":20105,"children":20106},{},[20107],{"type":23,"value":20108},"item-level booking",{"type":17,"tag":84,"props":20110,"children":20111},{},[20112],{"type":23,"value":20113},"full guest data",{"type":17,"tag":29,"props":20115,"children":20116},{},[20117],{"type":23,"value":20118},"Design the agent to:",{"type":17,"tag":80,"props":20120,"children":20121},{},[20122,20127],{"type":17,"tag":84,"props":20123,"children":20124},{},[20125],{"type":23,"value":20126},"use minimal required fields",{"type":17,"tag":84,"props":20128,"children":20129},{},[20130],{"type":23,"value":20131},"extend when supported",{"type":17,"tag":68,"props":20133,"children":20135},{"id":20134},"designing-agent-logic",[20136],{"type":23,"value":20137},"Designing agent logic",{"type":17,"tag":239,"props":20139,"children":20141},{"id":20140},"_1-constrain-the-search-space",[20142],{"type":23,"value":20143},"1. Constrain the search space",{"type":17,"tag":29,"props":20145,"children":20146},{},[20147],{"type":23,"value":20148},"Always filter:",{"type":17,"tag":80,"props":20150,"children":20151},{},[20152,20171,20183],{"type":17,"tag":84,"props":20153,"children":20154},{},[20155,20157,20163,20164,20170],{"type":23,"value":20156},"time range (",{"type":17,"tag":6121,"props":20158,"children":20160},{"className":20159},[],[20161],{"type":23,"value":20162},"startGte",{"type":23,"value":11826},{"type":17,"tag":6121,"props":20165,"children":20167},{"className":20166},[],[20168],{"type":23,"value":20169},"endLt",{"type":23,"value":12034},{"type":17,"tag":84,"props":20172,"children":20173},{},[20174,20176,20182],{"type":23,"value":20175},"party size (",{"type":17,"tag":6121,"props":20177,"children":20179},{"className":20178},[],[20180],{"type":23,"value":20181},"size",{"type":23,"value":12034},{"type":17,"tag":84,"props":20184,"children":20185},{},[20186,20188,20194],{"type":23,"value":20187},"location (",{"type":17,"tag":6121,"props":20189,"children":20191},{"className":20190},[],[20192],{"type":23,"value":20193},"locationId",{"type":23,"value":12034},{"type":17,"tag":239,"props":20196,"children":20198},{"id":20197},"_2-avoid-over-optimization",[20199],{"type":23,"value":20200},"2. Avoid over-optimization",{"type":17,"tag":29,"props":20202,"children":20203},{},[20204],{"type":23,"value":20205},"Do not attempt:",{"type":17,"tag":80,"props":20207,"children":20208},{},[20209,20214],{"type":17,"tag":84,"props":20210,"children":20211},{},[20212],{"type":23,"value":20213},"complex ranking models",{"type":17,"tag":84,"props":20215,"children":20216},{},[20217],{"type":23,"value":20218},"cross-provider aggregation",{"type":17,"tag":29,"props":20220,"children":20221},{},[20222],{"type":23,"value":20223},"Start with:",{"type":17,"tag":80,"props":20225,"children":20226},{},[20227,20232],{"type":17,"tag":84,"props":20228,"children":20229},{},[20230],{"type":23,"value":20231},"first valid slot",{"type":17,"tag":84,"props":20233,"children":20234},{},[20235],{"type":23,"value":20236},"or closest match",{"type":17,"tag":239,"props":20238,"children":20240},{"id":20239},"_3-handle-failure-paths",[20241],{"type":23,"value":20242},"3. Handle failure paths",{"type":17,"tag":29,"props":20244,"children":20245},{},[20246],{"type":23,"value":20247},"If no availability:",{"type":17,"tag":80,"props":20249,"children":20250},{},[20251,20256],{"type":17,"tag":84,"props":20252,"children":20253},{},[20254],{"type":23,"value":20255},"expand time window",{"type":17,"tag":84,"props":20257,"children":20258},{},[20259],{"type":23,"value":20260},"suggest alternatives",{"type":17,"tag":29,"props":20262,"children":20263},{},[20264],{"type":23,"value":20265},"If reservation fails:",{"type":17,"tag":80,"props":20267,"children":20268},{},[20269],{"type":17,"tag":84,"props":20270,"children":20271},{},[20272],{"type":23,"value":20273},"retry with another slot",{"type":17,"tag":68,"props":20275,"children":20277},{"id":20276},"monitoring-booking-outcomes",[20278],{"type":23,"value":20279},"Monitoring booking outcomes",{"type":17,"tag":29,"props":20281,"children":20282},{},[20283],{"type":23,"value":20284},"Most integrations do not provide native webhook support.",{"type":17,"tag":29,"props":20286,"children":20287},{},[20288],{"type":23,"value":20289},"Instead:",{"type":17,"tag":80,"props":20291,"children":20292},{},[20293,20304],{"type":17,"tag":84,"props":20294,"children":20295},{},[20296,20298,20302],{"type":23,"value":20297},"use [virtual ",{"type":17,"tag":133,"props":20299,"children":20300},{"href":4999},[20301],{"type":23,"value":5002},{"type":23,"value":20303},"](/blog/unlock_real_time_data_with_virtual_webhooks) (polling-based)",{"type":17,"tag":84,"props":20305,"children":20306},{},[20307],{"type":23,"value":20308},"or poll reservation endpoints directly",{"type":17,"tag":239,"props":20310,"children":20312},{"id":20311},"track-status-changes",[20313],{"type":23,"value":20314},"Track status changes",{"type":17,"tag":7231,"props":20316,"children":20317},{},[20318,20334],{"type":17,"tag":7235,"props":20319,"children":20320},{},[20321],{"type":17,"tag":7239,"props":20322,"children":20323},{},[20324,20329],{"type":17,"tag":7243,"props":20325,"children":20326},{},[20327],{"type":23,"value":20328},"Status",{"type":17,"tag":7243,"props":20330,"children":20331},{},[20332],{"type":23,"value":20333},"Meaning",{"type":17,"tag":7259,"props":20335,"children":20336},{},[20337,20350,20363,20376,20389],{"type":17,"tag":7239,"props":20338,"children":20339},{},[20340,20345],{"type":17,"tag":7266,"props":20341,"children":20342},{},[20343],{"type":23,"value":20344},"PENDING",{"type":17,"tag":7266,"props":20346,"children":20347},{},[20348],{"type":23,"value":20349},"awaiting confirmation",{"type":17,"tag":7239,"props":20351,"children":20352},{},[20353,20358],{"type":17,"tag":7266,"props":20354,"children":20355},{},[20356],{"type":23,"value":20357},"CONFIRMED",{"type":17,"tag":7266,"props":20359,"children":20360},{},[20361],{"type":23,"value":20362},"accepted",{"type":17,"tag":7239,"props":20364,"children":20365},{},[20366,20371],{"type":17,"tag":7266,"props":20367,"children":20368},{},[20369],{"type":23,"value":20370},"CANCELLED",{"type":17,"tag":7266,"props":20372,"children":20373},{},[20374],{"type":23,"value":20375},"cancelled",{"type":17,"tag":7239,"props":20377,"children":20378},{},[20379,20384],{"type":17,"tag":7266,"props":20380,"children":20381},{},[20382],{"type":23,"value":20383},"NO_SHOW",{"type":17,"tag":7266,"props":20385,"children":20386},{},[20387],{"type":23,"value":20388},"missed",{"type":17,"tag":7239,"props":20390,"children":20391},{},[20392,20397],{"type":17,"tag":7266,"props":20393,"children":20394},{},[20395],{"type":23,"value":20396},"COMPLETED",{"type":17,"tag":7266,"props":20398,"children":20399},{},[20400],{"type":23,"value":20401},"finished",{"type":17,"tag":29,"props":20403,"children":20404},{},[20405],{"type":23,"value":20406},"Key insight:",{"type":17,"tag":3414,"props":20408,"children":20409},{},[20410],{"type":17,"tag":29,"props":20411,"children":20412},{},[20413],{"type":23,"value":20414},"reservation status is the source of truth for booking state",{"type":17,"tag":68,"props":20416,"children":20418},{"id":20417},"why-this-works-with-a-unified-api",[20419],{"type":23,"value":20420},"Why this works with a unified API",{"type":17,"tag":29,"props":20422,"children":20423},{},[20424],{"type":23,"value":20425},"Without a unified model:",{"type":17,"tag":80,"props":20427,"children":20428},{},[20429,20434,20439],{"type":17,"tag":84,"props":20430,"children":20431},{},[20432],{"type":23,"value":20433},"each integration requires separate logic",{"type":17,"tag":84,"props":20435,"children":20436},{},[20437],{"type":23,"value":20438},"availability filters differ",{"type":17,"tag":84,"props":20440,"children":20441},{},[20442],{"type":23,"value":20443},"reservation payloads vary",{"type":17,"tag":29,"props":20445,"children":20446},{},[20447,20449,20455],{"type":23,"value":20448},"With the Unified ",{"type":17,"tag":133,"props":20450,"children":20452},{"href":20451},"/commerce",[20453],{"type":23,"value":20454},"Commerce API",{"type":23,"value":20456},":",{"type":17,"tag":80,"props":20458,"children":20459},{},[20460,20465,20470],{"type":17,"tag":84,"props":20461,"children":20462},{},[20463],{"type":23,"value":20464},"same objects across integrations",{"type":17,"tag":84,"props":20466,"children":20467},{},[20468],{"type":23,"value":20469},"same API structure",{"type":17,"tag":84,"props":20471,"children":20472},{},[20473],{"type":23,"value":20474},"same implementation pattern",{"type":17,"tag":29,"props":20476,"children":20477},{},[20478],{"type":23,"value":20479},"Requests are executed directly against each integration, so availability and reservation responses reflect the current state of the underlying platform.",{"type":17,"tag":68,"props":20481,"children":20482},{"id":7672},[20483],{"type":23,"value":7675},{"type":17,"tag":80,"props":20485,"children":20486},{},[20487,20492,20497,20502,20507,20512],{"type":17,"tag":84,"props":20488,"children":20489},{},[20490],{"type":23,"value":20491},"AI booking agents require structured APIs, not scraped data",{"type":17,"tag":84,"props":20493,"children":20494},{},[20495],{"type":23,"value":20496},"availability is the discovery layer, reservation is the execution layer",{"type":17,"tag":84,"props":20498,"children":20499},{},[20500],{"type":23,"value":20501},"the agent loop is: intent → availability → decision → reservation",{"type":17,"tag":84,"props":20503,"children":20504},{},[20505],{"type":23,"value":20506},"integration support varies beyond reservation creation",{"type":17,"tag":84,"props":20508,"children":20509},{},[20510],{"type":23,"value":20511},"reservation status defines lifecycle state",{"type":17,"tag":84,"props":20513,"children":20514},{},[20515],{"type":23,"value":20516},"a unified API allows one implementation across multiple booking integrations",{"type":17,"tag":29,"props":20518,"children":20519},{},[20520,20521],{"type":23,"value":1609},{"type":17,"tag":133,"props":20522,"children":20524},{"href":1612,"rel":20523},[214],[20525],{"type":23,"value":1616},{"type":17,"tag":29,"props":20527,"children":20528},{},[20529,20530],{"type":23,"value":1609},{"type":17,"tag":133,"props":20531,"children":20533},{"href":1623,"rel":20532},[214],[20534],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":20536},[20537,20538,20539,20540,20546,20554,20559,20564,20567,20568],{"id":19389,"depth":1629,"text":19392},{"id":19475,"depth":1629,"text":19478},{"id":19527,"depth":1629,"text":19530},{"id":19633,"depth":1629,"text":19636,"children":20541},[20542,20543,20544,20545],{"id":19644,"depth":1635,"text":19647},{"id":19673,"depth":1635,"text":19676},{"id":19702,"depth":1635,"text":19705},{"id":19726,"depth":1635,"text":19729},{"id":19737,"depth":1629,"text":19740,"children":20547},[20548,20549,20550,20551,20552,20553],{"id":19743,"depth":1635,"text":19746},{"id":19771,"depth":1635,"text":19774},{"id":19804,"depth":1635,"text":19807},{"id":19847,"depth":1635,"text":19850},{"id":19890,"depth":1635,"text":19893},{"id":19928,"depth":1635,"text":19931},{"id":19970,"depth":1629,"text":19973,"children":20555},[20556,20557,20558],{"id":19981,"depth":1635,"text":19984},{"id":20000,"depth":1635,"text":20003},{"id":20087,"depth":1635,"text":20090},{"id":20134,"depth":1629,"text":20137,"children":20560},[20561,20562,20563],{"id":20140,"depth":1635,"text":20143},{"id":20197,"depth":1635,"text":20200},{"id":20239,"depth":1635,"text":20242},{"id":20276,"depth":1629,"text":20279,"children":20565},[20566],{"id":20311,"depth":1635,"text":20314},{"id":20417,"depth":1629,"text":20420},{"id":7672,"depth":1629,"text":7675},"content:blog:how_to_build_an_ai_reservation_agent_using_a_unified_commerce_api.md","blog/how_to_build_an_ai_reservation_agent_using_a_unified_commerce_api.md","blog/how_to_build_an_ai_reservation_agent_using_a_unified_commerce_api",{"_path":20573,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":11289,"description":20574,"img":20575,"date":20576,"tag":12,"body":20577,"_type":1677,"_id":21840,"_source":1679,"_file":21841,"_stem":21842,"_extension":1682},"/blog/how_to_build_booking_into_your_product_across_opentable_yelp_sevenrooms_and_resos","Booking integrations let SaaS products search locations, retrieve available time slots, and create reservations directly inside their product. Using the...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_booking_into_your_product_across_opentable_yelp_sevenrooms_and_resos-icon.png","2026-03-24T22:17:00.000Z",{"type":14,"children":20578,"toc":21809},[20579,20584,20587,20594,20606,20612,20617,20635,20640,20663,20668,20674,20679,20684,20747,20759,20765,20770,20857,20862,20879,20885,20891,20896,20907,20912,20920,20925,20931,20936,20945,20949,20962,20968,21021,21026,21035,21040,21091,21097,21102,21111,21115,21124,21129,21161,21167,21172,21249,21254,21272,21278,21283,21311,21316,21322,21327,21333,21415,21421,21434,21440,21453,21457,21475,21481,21486,21492,21500,21506,21529,21535,21540,21558,21564,21569,21573,21591,21597,21610,21616,21646,21650,21657,21663,21668,21691,21696,21714,21719,21727,21732,21750,21755,21759,21791,21800],{"type":17,"tag":18,"props":20580,"children":20582},{"id":20581},"how-to-build-booking-into-your-product-across-opentable-yelp-sevenrooms-and-resos",[20583],{"type":23,"value":11289},{"type":17,"tag":25,"props":20585,"children":20586},{},[],{"type":17,"tag":29,"props":20588,"children":20589},{},[20590],{"type":17,"tag":33,"props":20591,"children":20592},{},[20593],{"type":23,"value":19372},{"type":17,"tag":29,"props":20595,"children":20596},{},[20597,20599,20604],{"type":23,"value":20598},"Booking integrations let SaaS products search locations, retrieve available time slots, and create reservations directly inside their product. Using the ",{"type":17,"tag":133,"props":20600,"children":20602},{"href":19380,"rel":20601},[214],[20603],{"type":23,"value":19384},{"type":23,"value":20605},", developers can implement this flow across reservation-based commerce integrations with a consistent set of objects and API calls.",{"type":17,"tag":68,"props":20607,"children":20609},{"id":20608},"why-booking-integrations-are-difficult",[20610],{"type":23,"value":20611},"Why booking integrations are difficult",{"type":17,"tag":29,"props":20613,"children":20614},{},[20615],{"type":23,"value":20616},"Adding booking into a product sounds simple:",{"type":17,"tag":80,"props":20618,"children":20619},{},[20620,20625,20630],{"type":17,"tag":84,"props":20621,"children":20622},{},[20623],{"type":23,"value":20624},"show available time slots",{"type":17,"tag":84,"props":20626,"children":20627},{},[20628],{"type":23,"value":20629},"let the user pick one",{"type":17,"tag":84,"props":20631,"children":20632},{},[20633],{"type":23,"value":20634},"confirm the reservation",{"type":17,"tag":29,"props":20636,"children":20637},{},[20638],{"type":23,"value":20639},"In practice, each integration behaves differently:",{"type":17,"tag":80,"props":20641,"children":20642},{},[20643,20648,20653,20658],{"type":17,"tag":84,"props":20644,"children":20645},{},[20646],{"type":23,"value":20647},"availability is structured differently",{"type":17,"tag":84,"props":20649,"children":20650},{},[20651],{"type":23,"value":20652},"time filters vary across APIs",{"type":17,"tag":84,"props":20654,"children":20655},{},[20656],{"type":23,"value":20657},"reservation payloads are inconsistent",{"type":17,"tag":84,"props":20659,"children":20660},{},[20661],{"type":23,"value":20662},"post-booking operations are not always supported",{"type":17,"tag":29,"props":20664,"children":20665},{},[20666],{"type":23,"value":20667},"Most teams end up building separate logic per integration just to support a single product feature.",{"type":17,"tag":68,"props":20669,"children":20671},{"id":20670},"reservation-based-vs-catalog-based-commerce",[20672],{"type":23,"value":20673},"Reservation-based vs catalog-based commerce",{"type":17,"tag":29,"props":20675,"children":20676},{},[20677],{"type":23,"value":20678},"Commerce integrations are not one uniform category.",{"type":17,"tag":29,"props":20680,"children":20681},{},[20682],{"type":23,"value":20683},"There are two distinct patterns:",{"type":17,"tag":7231,"props":20685,"children":20686},{},[20687,20708],{"type":17,"tag":7235,"props":20688,"children":20689},{},[20690],{"type":17,"tag":7239,"props":20691,"children":20692},{},[20693,20698,20703],{"type":17,"tag":7243,"props":20694,"children":20695},{},[20696],{"type":23,"value":20697},"Pattern",{"type":17,"tag":7243,"props":20699,"children":20700},{},[20701],{"type":23,"value":20702},"Core objects",{"type":17,"tag":7243,"props":20704,"children":20705},{},[20706],{"type":23,"value":20707},"Example integrations",{"type":17,"tag":7259,"props":20709,"children":20710},{},[20711,20729],{"type":17,"tag":7239,"props":20712,"children":20713},{},[20714,20719,20724],{"type":17,"tag":7266,"props":20715,"children":20716},{},[20717],{"type":23,"value":20718},"Catalog-based commerce",{"type":17,"tag":7266,"props":20720,"children":20721},{},[20722],{"type":23,"value":20723},"item, inventory, collection",{"type":17,"tag":7266,"props":20725,"children":20726},{},[20727],{"type":23,"value":20728},"Shopify, Squarespace",{"type":17,"tag":7239,"props":20730,"children":20731},{},[20732,20737,20742],{"type":17,"tag":7266,"props":20733,"children":20734},{},[20735],{"type":23,"value":20736},"Reservation-based commerce",{"type":17,"tag":7266,"props":20738,"children":20739},{},[20740],{"type":23,"value":20741},"location, availability, reservation",{"type":17,"tag":7266,"props":20743,"children":20744},{},[20745],{"type":23,"value":20746},"OpenTable, SevenRooms, resOS, Yelp",{"type":17,"tag":29,"props":20748,"children":20749},{},[20750,20752,20757],{"type":23,"value":20751},"This article focuses on ",{"type":17,"tag":48,"props":20753,"children":20754},{},[20755],{"type":23,"value":20756},"reservation-based commerce",{"type":23,"value":20758},", where the product experience is driven by time slots and bookings instead of inventory and products.",{"type":17,"tag":68,"props":20760,"children":20762},{"id":20761},"the-booking-data-model",[20763],{"type":23,"value":20764},"The booking data model",{"type":17,"tag":29,"props":20766,"children":20767},{},[20768],{"type":23,"value":20769},"A booking flow is built around four core objects:",{"type":17,"tag":7231,"props":20771,"children":20772},{},[20773,20788],{"type":17,"tag":7235,"props":20774,"children":20775},{},[20776],{"type":17,"tag":7239,"props":20777,"children":20778},{},[20779,20783],{"type":17,"tag":7243,"props":20780,"children":20781},{},[20782],{"type":23,"value":18594},{"type":17,"tag":7243,"props":20784,"children":20785},{},[20786],{"type":23,"value":20787},"Purpose",{"type":17,"tag":7259,"props":20789,"children":20790},{},[20791,20808,20825,20841],{"type":17,"tag":7239,"props":20792,"children":20793},{},[20794,20803],{"type":17,"tag":7266,"props":20795,"children":20796},{},[20797],{"type":17,"tag":133,"props":20798,"children":20801},{"href":20799,"rel":20800},"https://docs.unified.to/commerce/location/model",[214],[20802],{"type":23,"value":19564},{"type":17,"tag":7266,"props":20804,"children":20805},{},[20806],{"type":23,"value":20807},"physical venue (restaurant, salon, service location)",{"type":17,"tag":7239,"props":20809,"children":20810},{},[20811,20820],{"type":17,"tag":7266,"props":20812,"children":20813},{},[20814],{"type":17,"tag":133,"props":20815,"children":20818},{"href":20816,"rel":20817},"https://docs.unified.to/commerce/availability/model",[214],[20819],{"type":23,"value":11140},{"type":17,"tag":7266,"props":20821,"children":20822},{},[20823],{"type":23,"value":20824},"bookable time slots",{"type":17,"tag":7239,"props":20826,"children":20827},{},[20828,20837],{"type":17,"tag":7266,"props":20829,"children":20830},{},[20831],{"type":17,"tag":133,"props":20832,"children":20835},{"href":20833,"rel":20834},"https://docs.unified.to/commerce/reservation/model",[214],[20836],{"type":23,"value":11145},{"type":17,"tag":7266,"props":20838,"children":20839},{},[20840],{"type":23,"value":19593},{"type":17,"tag":7239,"props":20842,"children":20843},{},[20844,20852],{"type":17,"tag":7266,"props":20845,"children":20846},{},[20847],{"type":17,"tag":133,"props":20848,"children":20850},{"href":20849},"/32d6207b83848036bb4ae07ab37cfc4e",[20851],{"type":23,"value":19601},{"type":17,"tag":7266,"props":20853,"children":20854},{},[20855],{"type":23,"value":20856},"optional customer feedback",{"type":17,"tag":29,"props":20858,"children":20859},{},[20860],{"type":23,"value":20861},"Key constraint:",{"type":17,"tag":80,"props":20863,"children":20864},{},[20865,20872],{"type":17,"tag":84,"props":20866,"children":20867},{},[20868],{"type":17,"tag":48,"props":20869,"children":20870},{},[20871],{"type":23,"value":19622},{"type":17,"tag":84,"props":20873,"children":20874},{},[20875],{"type":17,"tag":48,"props":20876,"children":20877},{},[20878],{"type":23,"value":19630},{"type":17,"tag":68,"props":20880,"children":20882},{"id":20881},"how-the-booking-flow-works",[20883],{"type":23,"value":20884},"How the booking flow works",{"type":17,"tag":239,"props":20886,"children":20888},{"id":20887},"step-1-list-locations",[20889],{"type":23,"value":20890},"Step 1: List locations",{"type":17,"tag":29,"props":20892,"children":20893},{},[20894],{"type":23,"value":20895},"Retrieve available venues:",{"type":17,"tag":6893,"props":20897,"children":20902},{"className":20898,"code":20900,"language":20901,"meta":23},[20899],"language-plain","GET /commerce/{connection_id}/location\n","plain",[20903],{"type":17,"tag":6121,"props":20904,"children":20905},{"__ignoreMap":7},[20906],{"type":23,"value":20900},{"type":17,"tag":29,"props":20908,"children":20909},{},[20910],{"type":23,"value":20911},"TypeScript:",{"type":17,"tag":6893,"props":20913,"children":20915},{"className":20914,"code":19778,"language":18718,"meta":7},[18716],[20916],{"type":17,"tag":6121,"props":20917,"children":20918},{"__ignoreMap":7},[20919],{"type":23,"value":19778},{"type":17,"tag":29,"props":20921,"children":20922},{},[20923],{"type":23,"value":20924},"This returns the list of bookable locations for the integration.",{"type":17,"tag":239,"props":20926,"children":20928},{"id":20927},"step-2-retrieve-availability",[20929],{"type":23,"value":20930},"Step 2: Retrieve availability",{"type":17,"tag":29,"props":20932,"children":20933},{},[20934],{"type":23,"value":20935},"Availability represents bookable time slots.",{"type":17,"tag":6893,"props":20937,"children":20940},{"className":20938,"code":20939,"language":20901,"meta":23},[20899],"GET /commerce/{connection_id}/availability\n",[20941],{"type":17,"tag":6121,"props":20942,"children":20943},{"__ignoreMap":7},[20944],{"type":23,"value":20939},{"type":17,"tag":29,"props":20946,"children":20947},{},[20948],{"type":23,"value":19907},{"type":17,"tag":80,"props":20950,"children":20951},{},[20952,20957],{"type":17,"tag":84,"props":20953,"children":20954},{},[20955],{"type":23,"value":20956},"availability cannot be created or modified",{"type":17,"tag":84,"props":20958,"children":20959},{},[20960],{"type":23,"value":20961},"it reflects what the integration exposes",{"type":17,"tag":239,"props":20963,"children":20965},{"id":20964},"key-filters",[20966],{"type":23,"value":20967},"Key filters",{"type":17,"tag":80,"props":20969,"children":20970},{},[20971,20979,20987,20995,21003,21012],{"type":17,"tag":84,"props":20972,"children":20973},{},[20974],{"type":17,"tag":6121,"props":20975,"children":20977},{"className":20976},[],[20978],{"type":23,"value":20193},{"type":17,"tag":84,"props":20980,"children":20981},{},[20982],{"type":17,"tag":6121,"props":20983,"children":20985},{"className":20984},[],[20986],{"type":23,"value":20162},{"type":17,"tag":84,"props":20988,"children":20989},{},[20990],{"type":17,"tag":6121,"props":20991,"children":20993},{"className":20992},[],[20994],{"type":23,"value":20169},{"type":17,"tag":84,"props":20996,"children":20997},{},[20998],{"type":17,"tag":6121,"props":20999,"children":21001},{"className":21000},[],[21002],{"type":23,"value":20181},{"type":17,"tag":84,"props":21004,"children":21005},{},[21006],{"type":17,"tag":6121,"props":21007,"children":21009},{"className":21008},[],[21010],{"type":23,"value":21011},"itemId",{"type":17,"tag":84,"props":21013,"children":21014},{},[21015],{"type":17,"tag":6121,"props":21016,"children":21018},{"className":21017},[],[21019],{"type":23,"value":21020},"userId",{"type":17,"tag":239,"props":21022,"children":21024},{"id":21023},"example",[21025],{"type":23,"value":7377},{"type":17,"tag":6893,"props":21027,"children":21030},{"className":21028,"code":21029,"language":18718,"meta":7},[18716],"const availabilities = await sdk.commerce.listCommerceAvailabilities(\n  connectionId,\n  {\n    locationId: \"loc_123\",\n    startGte: \"2026-05-01T00:00:00Z\",\n    endLt: \"2026-05-02T00:00:00Z\",\n    size: 4,\n    itemId: \"item_789\",\n    fields: [\n      \"location_id\",\n      \"start_at\",\n      \"end_at\",\n      \"size\",\n      \"item_id\",\n      \"staff_user_id\",\n    ],\n    limit: 50,\n    offset: 0,\n  }\n);\n",[21031],{"type":17,"tag":6121,"props":21032,"children":21033},{"__ignoreMap":7},[21034],{"type":23,"value":21029},{"type":17,"tag":29,"props":21036,"children":21037},{},[21038],{"type":23,"value":21039},"Each result includes:",{"type":17,"tag":80,"props":21041,"children":21042},{},[21043,21052,21061,21070,21081],{"type":17,"tag":84,"props":21044,"children":21045},{},[21046],{"type":17,"tag":6121,"props":21047,"children":21049},{"className":21048},[],[21050],{"type":23,"value":21051},"start_at",{"type":17,"tag":84,"props":21053,"children":21054},{},[21055],{"type":17,"tag":6121,"props":21056,"children":21058},{"className":21057},[],[21059],{"type":23,"value":21060},"end_at",{"type":17,"tag":84,"props":21062,"children":21063},{},[21064],{"type":17,"tag":6121,"props":21065,"children":21067},{"className":21066},[],[21068],{"type":23,"value":21069},"location_id",{"type":17,"tag":84,"props":21071,"children":21072},{},[21073,21075],{"type":23,"value":21074},"optional ",{"type":17,"tag":6121,"props":21076,"children":21078},{"className":21077},[],[21079],{"type":23,"value":21080},"item_id",{"type":17,"tag":84,"props":21082,"children":21083},{},[21084,21085],{"type":23,"value":21074},{"type":17,"tag":6121,"props":21086,"children":21088},{"className":21087},[],[21089],{"type":23,"value":21090},"staff_user_id",{"type":17,"tag":239,"props":21092,"children":21094},{"id":21093},"step-3-create-a-reservation",[21095],{"type":23,"value":21096},"Step 3: Create a reservation",{"type":17,"tag":29,"props":21098,"children":21099},{},[21100],{"type":23,"value":21101},"Reservations are created using:",{"type":17,"tag":6893,"props":21103,"children":21106},{"className":21104,"code":21105,"language":20901,"meta":23},[20899],"POST /commerce/{connection_id}/reservation\n",[21107],{"type":17,"tag":6121,"props":21108,"children":21109},{"__ignoreMap":7},[21110],{"type":23,"value":21105},{"type":17,"tag":29,"props":21112,"children":21113},{},[21114],{"type":23,"value":20911},{"type":17,"tag":6893,"props":21116,"children":21119},{"className":21117,"code":21118,"language":18718,"meta":7},[18716],"const reservation = await sdk.commerce.createCommerceReservation({\n  connectionId,\n  commerceReservation: {\n    locationId: \"loc_123\",\n    startAt: \"2026-05-01T18:00:00Z\",\n    endAt: \"2026-05-01T20:00:00Z\",\n    size: 2,\n    guestName: \"Jane Doe\",\n    guestEmail: \"jane@example.com\",\n    guestPhone: \"+1-555-1234\",\n    notes: \"Window seat if possible\",\n    itemId: \"table_7\",\n  },\n});\n",[21120],{"type":17,"tag":6121,"props":21121,"children":21122},{"__ignoreMap":7},[21123],{"type":23,"value":21118},{"type":17,"tag":29,"props":21125,"children":21126},{},[21127],{"type":23,"value":21128},"Notes:",{"type":17,"tag":80,"props":21130,"children":21131},{},[21132,21137],{"type":17,"tag":84,"props":21133,"children":21134},{},[21135],{"type":23,"value":21136},"all fields are optional in the unified schema",{"type":17,"tag":84,"props":21138,"children":21139},{},[21140,21142],{"type":23,"value":21141},"integrations may require:\n",{"type":17,"tag":80,"props":21143,"children":21144},{},[21145,21153],{"type":17,"tag":84,"props":21146,"children":21147},{},[21148],{"type":17,"tag":6121,"props":21149,"children":21151},{"className":21150},[],[21152],{"type":23,"value":21069},{"type":17,"tag":84,"props":21154,"children":21155},{},[21156],{"type":17,"tag":6121,"props":21157,"children":21159},{"className":21158},[],[21160],{"type":23,"value":21051},{"type":17,"tag":239,"props":21162,"children":21164},{"id":21163},"step-4-manage-reservation-lifecycle",[21165],{"type":23,"value":21166},"Step 4: Manage reservation lifecycle",{"type":17,"tag":29,"props":21168,"children":21169},{},[21170],{"type":23,"value":21171},"Reservations move through a status lifecycle:",{"type":17,"tag":7231,"props":21173,"children":21174},{},[21175,21189],{"type":17,"tag":7235,"props":21176,"children":21177},{},[21178],{"type":17,"tag":7239,"props":21179,"children":21180},{},[21181,21185],{"type":17,"tag":7243,"props":21182,"children":21183},{},[21184],{"type":23,"value":20328},{"type":17,"tag":7243,"props":21186,"children":21187},{},[21188],{"type":23,"value":20333},{"type":17,"tag":7259,"props":21190,"children":21191},{},[21192,21203,21214,21225,21237],{"type":17,"tag":7239,"props":21193,"children":21194},{},[21195,21199],{"type":17,"tag":7266,"props":21196,"children":21197},{},[21198],{"type":23,"value":20344},{"type":17,"tag":7266,"props":21200,"children":21201},{},[21202],{"type":23,"value":20349},{"type":17,"tag":7239,"props":21204,"children":21205},{},[21206,21210],{"type":17,"tag":7266,"props":21207,"children":21208},{},[21209],{"type":23,"value":20357},{"type":17,"tag":7266,"props":21211,"children":21212},{},[21213],{"type":23,"value":20362},{"type":17,"tag":7239,"props":21215,"children":21216},{},[21217,21221],{"type":17,"tag":7266,"props":21218,"children":21219},{},[21220],{"type":23,"value":20370},{"type":17,"tag":7266,"props":21222,"children":21223},{},[21224],{"type":23,"value":20375},{"type":17,"tag":7239,"props":21226,"children":21227},{},[21228,21232],{"type":17,"tag":7266,"props":21229,"children":21230},{},[21231],{"type":23,"value":20383},{"type":17,"tag":7266,"props":21233,"children":21234},{},[21235],{"type":23,"value":21236},"guest did not arrive",{"type":17,"tag":7239,"props":21238,"children":21239},{},[21240,21244],{"type":17,"tag":7266,"props":21241,"children":21242},{},[21243],{"type":23,"value":20396},{"type":17,"tag":7266,"props":21245,"children":21246},{},[21247],{"type":23,"value":21248},"booking finished",{"type":17,"tag":29,"props":21250,"children":21251},{},[21252],{"type":23,"value":21253},"Key implementation detail:",{"type":17,"tag":80,"props":21255,"children":21256},{},[21257,21267],{"type":17,"tag":84,"props":21258,"children":21259},{},[21260,21262],{"type":23,"value":21261},"cancellation should typically be handled by updating status to ",{"type":17,"tag":6121,"props":21263,"children":21265},{"className":21264},[],[21266],{"type":23,"value":20370},{"type":17,"tag":84,"props":21268,"children":21269},{},[21270],{"type":23,"value":21271},"deletion removes the record entirely",{"type":17,"tag":68,"props":21273,"children":21275},{"id":21274},"end-to-end-booking-example",[21276],{"type":23,"value":21277},"End-to-end booking example",{"type":17,"tag":29,"props":21279,"children":21280},{},[21281],{"type":23,"value":21282},"A typical product flow:",{"type":17,"tag":6154,"props":21284,"children":21285},{},[21286,21291,21296,21301,21306],{"type":17,"tag":84,"props":21287,"children":21288},{},[21289],{"type":23,"value":21290},"user selects a location",{"type":17,"tag":84,"props":21292,"children":21293},{},[21294],{"type":23,"value":21295},"product retrieves availability",{"type":17,"tag":84,"props":21297,"children":21298},{},[21299],{"type":23,"value":21300},"user selects a time slot",{"type":17,"tag":84,"props":21302,"children":21303},{},[21304],{"type":23,"value":21305},"product creates reservation",{"type":17,"tag":84,"props":21307,"children":21308},{},[21309],{"type":23,"value":21310},"product tracks reservation status",{"type":17,"tag":29,"props":21312,"children":21313},{},[21314],{"type":23,"value":21315},"This flow is consistent across integrations at the object level, even if capabilities differ.",{"type":17,"tag":68,"props":21317,"children":21319},{"id":21318},"what-differs-across-integrations",[21320],{"type":23,"value":21321},"What differs across integrations",{"type":17,"tag":29,"props":21323,"children":21324},{},[21325],{"type":23,"value":21326},"While the object model is consistent, behavior is not.",{"type":17,"tag":239,"props":21328,"children":21330},{"id":21329},"reservation-support",[21331],{"type":23,"value":21332},"Reservation support",{"type":17,"tag":7231,"props":21334,"children":21335},{},[21336,21350],{"type":17,"tag":7235,"props":21337,"children":21338},{},[21339],{"type":17,"tag":7239,"props":21340,"children":21341},{},[21342,21346],{"type":17,"tag":7243,"props":21343,"children":21344},{},[21345],{"type":23,"value":20017},{"type":17,"tag":7243,"props":21347,"children":21348},{},[21349],{"type":23,"value":21332},{"type":17,"tag":7259,"props":21351,"children":21352},{},[21353,21368,21385,21399],{"type":17,"tag":7239,"props":21354,"children":21355},{},[21356,21363],{"type":17,"tag":7266,"props":21357,"children":21358},{},[21359],{"type":17,"tag":133,"props":21360,"children":21361},{"href":20849},[21362],{"type":23,"value":11189},{"type":17,"tag":7266,"props":21364,"children":21365},{},[21366],{"type":23,"value":21367},"full CRUD",{"type":17,"tag":7239,"props":21369,"children":21370},{},[21371,21380],{"type":17,"tag":7266,"props":21372,"children":21373},{},[21374],{"type":17,"tag":133,"props":21375,"children":21378},{"href":21376,"rel":21377},"https://docs.opentable.com/",[214],[21379],{"type":23,"value":11169},{"type":17,"tag":7266,"props":21381,"children":21382},{},[21383],{"type":23,"value":21384},"create only",{"type":17,"tag":7239,"props":21386,"children":21387},{},[21388,21395],{"type":17,"tag":7266,"props":21389,"children":21390},{},[21391],{"type":17,"tag":133,"props":21392,"children":21393},{"href":20849},[21394],{"type":23,"value":11179},{"type":17,"tag":7266,"props":21396,"children":21397},{},[21398],{"type":23,"value":21384},{"type":17,"tag":7239,"props":21400,"children":21401},{},[21402,21411],{"type":17,"tag":7266,"props":21403,"children":21404},{},[21405],{"type":17,"tag":133,"props":21406,"children":21409},{"href":21407,"rel":21408},"https://resos.com/api/",[214],[21410],{"type":23,"value":11209},{"type":17,"tag":7266,"props":21412,"children":21413},{},[21414],{"type":23,"value":21384},{"type":17,"tag":239,"props":21416,"children":21418},{"id":21417},"location-support",[21419],{"type":23,"value":21420},"Location support",{"type":17,"tag":80,"props":21422,"children":21423},{},[21424,21429],{"type":17,"tag":84,"props":21425,"children":21426},{},[21427],{"type":23,"value":21428},"listing supported across all",{"type":17,"tag":84,"props":21430,"children":21431},{},[21432],{"type":23,"value":21433},"retrieval varies by integration",{"type":17,"tag":239,"props":21435,"children":21437},{"id":21436},"review-support",[21438],{"type":23,"value":21439},"Review support",{"type":17,"tag":80,"props":21441,"children":21442},{},[21443,21448],{"type":17,"tag":84,"props":21444,"children":21445},{},[21446],{"type":23,"value":21447},"OpenTable and Yelp: read-only",{"type":17,"tag":84,"props":21449,"children":21450},{},[21451],{"type":23,"value":21452},"others: not supported",{"type":17,"tag":239,"props":21454,"children":21455},{"id":10342},[21456],{"type":23,"value":11140},{"type":17,"tag":80,"props":21458,"children":21459},{},[21460,21465,21470],{"type":17,"tag":84,"props":21461,"children":21462},{},[21463],{"type":23,"value":21464},"widely supported",{"type":17,"tag":84,"props":21466,"children":21467},{},[21468],{"type":23,"value":21469},"structure varies slightly",{"type":17,"tag":84,"props":21471,"children":21472},{},[21473],{"type":23,"value":21474},"webhook support limited",{"type":17,"tag":68,"props":21476,"children":21478},{"id":21477},"designing-for-partial-support",[21479],{"type":23,"value":21480},"Designing for partial support",{"type":17,"tag":29,"props":21482,"children":21483},{},[21484],{"type":23,"value":21485},"When building booking into your product:",{"type":17,"tag":239,"props":21487,"children":21489},{"id":21488},"design-for-the-minimum-flow",[21490],{"type":23,"value":21491},"Design for the minimum flow",{"type":17,"tag":80,"props":21493,"children":21494},{},[21495],{"type":17,"tag":84,"props":21496,"children":21497},{},[21498],{"type":23,"value":21499},"location → availability → create reservation",{"type":17,"tag":239,"props":21501,"children":21503},{"id":21502},"treat-advanced-features-as-optional",[21504],{"type":23,"value":21505},"Treat advanced features as optional",{"type":17,"tag":80,"props":21507,"children":21508},{},[21509,21514,21519,21524],{"type":17,"tag":84,"props":21510,"children":21511},{},[21512],{"type":23,"value":21513},"reservation retrieval",{"type":17,"tag":84,"props":21515,"children":21516},{},[21517],{"type":23,"value":21518},"updates",{"type":17,"tag":84,"props":21520,"children":21521},{},[21522],{"type":23,"value":21523},"deletion",{"type":17,"tag":84,"props":21525,"children":21526},{},[21527],{"type":23,"value":21528},"review workflows",{"type":17,"tag":239,"props":21530,"children":21532},{"id":21531},"avoid-assumptions",[21533],{"type":23,"value":21534},"Avoid assumptions",{"type":17,"tag":29,"props":21536,"children":21537},{},[21538],{"type":23,"value":21539},"Do not assume:",{"type":17,"tag":80,"props":21541,"children":21542},{},[21543,21548,21553],{"type":17,"tag":84,"props":21544,"children":21545},{},[21546],{"type":23,"value":21547},"reservation lifecycle APIs exist",{"type":17,"tag":84,"props":21549,"children":21550},{},[21551],{"type":23,"value":21552},"all fields are writable",{"type":17,"tag":84,"props":21554,"children":21555},{},[21556],{"type":23,"value":21557},"webhook support is available",{"type":17,"tag":68,"props":21559,"children":21561},{"id":21560},"monitoring-bookings",[21562],{"type":23,"value":21563},"Monitoring bookings",{"type":17,"tag":29,"props":21565,"children":21566},{},[21567],{"type":23,"value":21568},"Most booking integrations do not provide native webhook support.",{"type":17,"tag":29,"props":21570,"children":21571},{},[21572],{"type":23,"value":20289},{"type":17,"tag":80,"props":21574,"children":21575},{},[21576,21586],{"type":17,"tag":84,"props":21577,"children":21578},{},[21579,21581,21585],{"type":23,"value":21580},"Unified uses [virtual ",{"type":17,"tag":133,"props":21582,"children":21583},{"href":4999},[21584],{"type":23,"value":5002},{"type":23,"value":20303},{"type":17,"tag":84,"props":21587,"children":21588},{},[21589],{"type":23,"value":21590},"or you poll list endpoints directly",{"type":17,"tag":239,"props":21592,"children":21594},{"id":21593},"important-signals",[21595],{"type":23,"value":21596},"Important signals",{"type":17,"tag":80,"props":21598,"children":21599},{},[21600,21605],{"type":17,"tag":84,"props":21601,"children":21602},{},[21603],{"type":23,"value":21604},"reservation status changes",{"type":17,"tag":84,"props":21606,"children":21607},{},[21608],{"type":23,"value":21609},"availability updates",{"type":17,"tag":239,"props":21611,"children":21613},{"id":21612},"example-approach",[21614],{"type":23,"value":21615},"Example approach",{"type":17,"tag":80,"props":21617,"children":21618},{},[21619,21629,21641],{"type":17,"tag":84,"props":21620,"children":21621},{},[21622,21624],{"type":23,"value":21623},"poll reservations using ",{"type":17,"tag":6121,"props":21625,"children":21627},{"className":21626},[],[21628],{"type":23,"value":20162},{"type":17,"tag":84,"props":21630,"children":21631},{},[21632,21634,21639],{"type":23,"value":21633},"track ",{"type":17,"tag":6121,"props":21635,"children":21637},{"className":21636},[],[21638],{"type":23,"value":19949},{"type":23,"value":21640}," field transitions",{"type":17,"tag":84,"props":21642,"children":21643},{},[21644],{"type":23,"value":21645},"update UI accordingly",{"type":17,"tag":29,"props":21647,"children":21648},{},[21649],{"type":23,"value":20406},{"type":17,"tag":3414,"props":21651,"children":21652},{},[21653],{"type":17,"tag":29,"props":21654,"children":21655},{},[21656],{"type":23,"value":20414},{"type":17,"tag":68,"props":21658,"children":21660},{"id":21659},"build-once-with-the-unified-commerce-api",[21661],{"type":23,"value":21662},"Build once with the Unified Commerce API",{"type":17,"tag":29,"props":21664,"children":21665},{},[21666],{"type":23,"value":21667},"Instead of building per integration:",{"type":17,"tag":80,"props":21669,"children":21670},{},[21671,21676,21681,21686],{"type":17,"tag":84,"props":21672,"children":21673},{},[21674],{"type":23,"value":21675},"OpenTable API",{"type":17,"tag":84,"props":21677,"children":21678},{},[21679],{"type":23,"value":21680},"Yelp API",{"type":17,"tag":84,"props":21682,"children":21683},{},[21684],{"type":23,"value":21685},"SevenRooms API",{"type":17,"tag":84,"props":21687,"children":21688},{},[21689],{"type":23,"value":21690},"resOS API",{"type":17,"tag":29,"props":21692,"children":21693},{},[21694],{"type":23,"value":21695},"You implement one booking flow:",{"type":17,"tag":80,"props":21697,"children":21698},{},[21699,21704,21709],{"type":17,"tag":84,"props":21700,"children":21701},{},[21702],{"type":23,"value":21703},"same objects",{"type":17,"tag":84,"props":21705,"children":21706},{},[21707],{"type":23,"value":21708},"same endpoints",{"type":17,"tag":84,"props":21710,"children":21711},{},[21712],{"type":23,"value":21713},"same filters",{"type":17,"tag":29,"props":21715,"children":21716},{},[21717],{"type":23,"value":21718},"What changes:",{"type":17,"tag":80,"props":21720,"children":21721},{},[21722],{"type":17,"tag":84,"props":21723,"children":21724},{},[21725],{"type":23,"value":21726},"underlying integration behavior",{"type":17,"tag":29,"props":21728,"children":21729},{},[21730],{"type":23,"value":21731},"What stays consistent:",{"type":17,"tag":80,"props":21733,"children":21734},{},[21735,21740,21745],{"type":17,"tag":84,"props":21736,"children":21737},{},[21738],{"type":23,"value":21739},"API surface",{"type":17,"tag":84,"props":21741,"children":21742},{},[21743],{"type":23,"value":21744},"data model",{"type":17,"tag":84,"props":21746,"children":21747},{},[21748],{"type":23,"value":21749},"implementation pattern",{"type":17,"tag":29,"props":21751,"children":21752},{},[21753],{"type":23,"value":21754},"Unified routes each request directly to the underlying integration, without storing customer data, so responses reflect the current state of the source platform.",{"type":17,"tag":68,"props":21756,"children":21757},{"id":7672},[21758],{"type":23,"value":7675},{"type":17,"tag":80,"props":21760,"children":21761},{},[21762,21767,21772,21777,21782,21786],{"type":17,"tag":84,"props":21763,"children":21764},{},[21765],{"type":23,"value":21766},"booking integrations require multiple steps and vary significantly across integrations",{"type":17,"tag":84,"props":21768,"children":21769},{},[21770],{"type":23,"value":21771},"availability is read-only and used for discovery",{"type":17,"tag":84,"props":21773,"children":21774},{},[21775],{"type":23,"value":21776},"reservations are the write path for bookings",{"type":17,"tag":84,"props":21778,"children":21779},{},[21780],{"type":23,"value":21781},"integration support differs beyond reservation creation",{"type":17,"tag":84,"props":21783,"children":21784},{},[21785],{"type":23,"value":20511},{"type":17,"tag":84,"props":21787,"children":21788},{},[21789],{"type":23,"value":21790},"a unified data model removes most per-integration logic while still requiring awareness of provider limitations",{"type":17,"tag":29,"props":21792,"children":21793},{},[21794,21795],{"type":23,"value":1609},{"type":17,"tag":133,"props":21796,"children":21798},{"href":1612,"rel":21797},[214],[21799],{"type":23,"value":1616},{"type":17,"tag":29,"props":21801,"children":21802},{},[21803,21804],{"type":23,"value":1609},{"type":17,"tag":133,"props":21805,"children":21807},{"href":1623,"rel":21806},[214],[21808],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":21810},[21811,21812,21813,21814,21822,21823,21829,21834,21838,21839],{"id":20608,"depth":1629,"text":20611},{"id":20670,"depth":1629,"text":20673},{"id":20761,"depth":1629,"text":20764},{"id":20881,"depth":1629,"text":20884,"children":21815},[21816,21817,21818,21819,21820,21821],{"id":20887,"depth":1635,"text":20890},{"id":20927,"depth":1635,"text":20930},{"id":20964,"depth":1635,"text":20967},{"id":21023,"depth":1635,"text":7377},{"id":21093,"depth":1635,"text":21096},{"id":21163,"depth":1635,"text":21166},{"id":21274,"depth":1629,"text":21277},{"id":21318,"depth":1629,"text":21321,"children":21824},[21825,21826,21827,21828],{"id":21329,"depth":1635,"text":21332},{"id":21417,"depth":1635,"text":21420},{"id":21436,"depth":1635,"text":21439},{"id":10342,"depth":1635,"text":11140},{"id":21477,"depth":1629,"text":21480,"children":21830},[21831,21832,21833],{"id":21488,"depth":1635,"text":21491},{"id":21502,"depth":1635,"text":21505},{"id":21531,"depth":1635,"text":21534},{"id":21560,"depth":1629,"text":21563,"children":21835},[21836,21837],{"id":21593,"depth":1635,"text":21596},{"id":21612,"depth":1635,"text":21615},{"id":21659,"depth":1629,"text":21662},{"id":7672,"depth":1629,"text":7675},"content:blog:how_to_build_booking_into_your_product_across_opentable_yelp_sevenrooms_and_resos.md","blog/how_to_build_booking_into_your_product_across_opentable_yelp_sevenrooms_and_resos.md","blog/how_to_build_booking_into_your_product_across_opentable_yelp_sevenrooms_and_resos",{"_path":21844,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":11556,"description":21845,"img":21846,"date":21847,"tag":12,"body":21848,"_type":1677,"_id":23004,"_source":1679,"_file":23005,"_stem":23006,"_extension":1682},"/blog/how_to_build_an_advertising_dashboard_across_multiple_platforms_using_a_unified_advertising_api","An advertising dashboard shows campaign performance across multiple integrations and allows users to act on that data.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_advertising_dashboard_across_multiple_platforms_using_a_unified_advertising_api-icon.png","2026-03-24T14:45:00.000Z",{"type":14,"children":21849,"toc":22985},[21850,21855,21858,21865,21869,21880,21885,21908,21921,21949,21959,21963,21969,21974,21992,21997,22002,22025,22030,22048,22053,22064,22070,22075,22206,22211,22237,22243,22255,22264,22269,22306,22325,22331,22340,22344,22368,22374,22383,22388,22423,22428,22434,22439,22444,22481,22485,22493,22498,22509,22514,22541,22546,22552,22563,22572,22576,22600,22606,22611,22616,22622,22631,22637,22646,22652,22661,22666,22672,22677,22681,22704,22709,22718,22723,22729,22740,22749,22754,22772,22777,22783,22788,22797,22802,22830,22836,22841,22846,22851,22869,22874,22892,22897,22915,22920,22924,22967,22976],{"type":17,"tag":18,"props":21851,"children":21853},{"id":21852},"how-to-build-an-advertising-dashboard-across-multiple-platforms-using-a-unified-advertising-api",[21854],{"type":23,"value":11556},{"type":17,"tag":25,"props":21856,"children":21857},{},[],{"type":17,"tag":29,"props":21859,"children":21860},{},[21861],{"type":17,"tag":33,"props":21862,"children":21863},{},[21864],{"type":23,"value":19372},{"type":17,"tag":29,"props":21866,"children":21867},{},[21868],{"type":23,"value":21845},{"type":17,"tag":29,"props":21870,"children":21871},{},[21872,21874,21879],{"type":23,"value":21873},"In practice, this is not just a reporting problem. It is a ",{"type":17,"tag":48,"props":21875,"children":21876},{},[21877],{"type":23,"value":21878},"campaign structure and targeting problem",{"type":23,"value":54},{"type":17,"tag":29,"props":21881,"children":21882},{},[21883],{"type":23,"value":21884},"Each advertising integration defines:",{"type":17,"tag":80,"props":21886,"children":21887},{},[21888,21893,21898,21903],{"type":17,"tag":84,"props":21889,"children":21890},{},[21891],{"type":23,"value":21892},"campaign structure differently",{"type":17,"tag":84,"props":21894,"children":21895},{},[21896],{"type":23,"value":21897},"targeting inputs differently",{"type":17,"tag":84,"props":21899,"children":21900},{},[21901],{"type":23,"value":21902},"identifiers differently",{"type":17,"tag":84,"props":21904,"children":21905},{},[21906],{"type":23,"value":21907},"write behavior differently",{"type":17,"tag":29,"props":21909,"children":21910},{},[21911,21913,21919],{"type":23,"value":21912},"This guide shows how to ",{"type":17,"tag":133,"props":21914,"children":21916},{"href":21915},"/32d6207b8384806ab28acfd94dc9b227",[21917],{"type":23,"value":21918},"build a cross-platform advertising dashboard",{"type":23,"value":21920}," that:",{"type":17,"tag":80,"props":21922,"children":21923},{},[21924,21929,21934,21939,21944],{"type":17,"tag":84,"props":21925,"children":21926},{},[21927],{"type":23,"value":21928},"retrieves campaigns and performance data",{"type":17,"tag":84,"props":21930,"children":21931},{},[21932],{"type":23,"value":21933},"segments by ad account",{"type":17,"tag":84,"props":21935,"children":21936},{},[21937],{"type":23,"value":21938},"looks up targeting identifiers",{"type":17,"tag":84,"props":21940,"children":21941},{},[21942],{"type":23,"value":21943},"updates campaigns (status, budgets, dates)",{"type":17,"tag":84,"props":21945,"children":21946},{},[21947],{"type":23,"value":21948},"applies targeting at the correct level",{"type":17,"tag":29,"props":21950,"children":21951},{},[21952,21953,21958],{"type":23,"value":18449},{"type":17,"tag":133,"props":21954,"children":21956},{"href":18452,"rel":21955},[214],[21957],{"type":23,"value":18456},{"type":23,"value":54},{"type":17,"tag":11616,"props":21960,"children":21962},{"width":11618,"height":11619,"src":21961,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/r2K6SIdiUHc",[],{"type":17,"tag":68,"props":21964,"children":21966},{"id":21965},"why-advertising-dashboards-break",[21967],{"type":23,"value":21968},"Why Advertising Dashboards Break",{"type":17,"tag":29,"props":21970,"children":21971},{},[21972],{"type":23,"value":21973},"Most teams start with reporting:",{"type":17,"tag":80,"props":21975,"children":21976},{},[21977,21982,21987],{"type":17,"tag":84,"props":21978,"children":21979},{},[21980],{"type":23,"value":21981},"fetch campaigns",{"type":17,"tag":84,"props":21983,"children":21984},{},[21985],{"type":23,"value":21986},"fetch metrics",{"type":17,"tag":84,"props":21988,"children":21989},{},[21990],{"type":23,"value":21991},"display charts",{"type":17,"tag":29,"props":21993,"children":21994},{},[21995],{"type":23,"value":21996},"This works for one integration.",{"type":17,"tag":29,"props":21998,"children":21999},{},[22000],{"type":23,"value":22001},"It breaks when you support multiple:",{"type":17,"tag":80,"props":22003,"children":22004},{},[22005,22010,22015,22020],{"type":17,"tag":84,"props":22006,"children":22007},{},[22008],{"type":23,"value":22009},"targeting identifiers are incompatible",{"type":17,"tag":84,"props":22011,"children":22012},{},[22013],{"type":23,"value":22014},"campaign fields behave differently",{"type":17,"tag":84,"props":22016,"children":22017},{},[22018],{"type":23,"value":22019},"some integrations allow updates, others don't",{"type":17,"tag":84,"props":22021,"children":22022},{},[22023],{"type":23,"value":22024},"filtering logic becomes inconsistent",{"type":17,"tag":29,"props":22026,"children":22027},{},[22028],{"type":23,"value":22029},"The result:",{"type":17,"tag":80,"props":22031,"children":22032},{},[22033,22038,22043],{"type":17,"tag":84,"props":22034,"children":22035},{},[22036],{"type":23,"value":22037},"inconsistent UI",{"type":17,"tag":84,"props":22039,"children":22040},{},[22041],{"type":23,"value":22042},"fragile logic",{"type":17,"tag":84,"props":22044,"children":22045},{},[22046],{"type":23,"value":22047},"increasing maintenance",{"type":17,"tag":29,"props":22049,"children":22050},{},[22051],{"type":23,"value":22052},"The issue is not metrics.",{"type":17,"tag":29,"props":22054,"children":22055},{},[22056,22058,22063],{"type":23,"value":22057},"The issue is ",{"type":17,"tag":48,"props":22059,"children":22060},{},[22061],{"type":23,"value":22062},"campaign structure + targeting",{"type":23,"value":54},{"type":17,"tag":68,"props":22065,"children":22067},{"id":22066},"how-the-advertising-data-model-works",[22068],{"type":23,"value":22069},"How the Advertising Data Model Works",{"type":17,"tag":29,"props":22071,"children":22072},{},[22073],{"type":23,"value":22074},"Unified provides a consistent structure across integrations.",{"type":17,"tag":7231,"props":22076,"children":22077},{},[22078,22097],{"type":17,"tag":7235,"props":22079,"children":22080},{},[22081],{"type":17,"tag":7239,"props":22082,"children":22083},{},[22084,22088,22092],{"type":17,"tag":7243,"props":22085,"children":22086},{},[22087],{"type":23,"value":18594},{"type":17,"tag":7243,"props":22089,"children":22090},{},[22091],{"type":23,"value":20787},{"type":17,"tag":7243,"props":22093,"children":22094},{},[22095],{"type":23,"value":22096},"Key Fields",{"type":17,"tag":7259,"props":22098,"children":22099},{},[22100,22117,22134,22151,22167,22184],{"type":17,"tag":7239,"props":22101,"children":22102},{},[22103,22107,22112],{"type":17,"tag":7266,"props":22104,"children":22105},{},[22106],{"type":23,"value":18046},{"type":17,"tag":7266,"props":22108,"children":22109},{},[22110],{"type":23,"value":22111},"Ad account",{"type":17,"tag":7266,"props":22113,"children":22114},{},[22115],{"type":23,"value":22116},"id, name, currency",{"type":17,"tag":7239,"props":22118,"children":22119},{},[22120,22124,22129],{"type":17,"tag":7266,"props":22121,"children":22122},{},[22123],{"type":23,"value":18610},{"type":17,"tag":7266,"props":22125,"children":22126},{},[22127],{"type":23,"value":22128},"Budget + schedule",{"type":17,"tag":7266,"props":22130,"children":22131},{},[22132],{"type":23,"value":22133},"status, budget, dates",{"type":17,"tag":7239,"props":22135,"children":22136},{},[22137,22141,22146],{"type":17,"tag":7266,"props":22138,"children":22139},{},[22140],{"type":23,"value":18623},{"type":17,"tag":7266,"props":22142,"children":22143},{},[22144],{"type":23,"value":22145},"Targeting + delivery",{"type":17,"tag":7266,"props":22147,"children":22148},{},[22149],{"type":23,"value":22150},"targeting, bid",{"type":17,"tag":7239,"props":22152,"children":22153},{},[22154,22158,22162],{"type":17,"tag":7266,"props":22155,"children":22156},{},[22157],{"type":23,"value":18636},{"type":17,"tag":7266,"props":22159,"children":22160},{},[22161],{"type":23,"value":18641},{"type":17,"tag":7266,"props":22163,"children":22164},{},[22165],{"type":23,"value":22166},"headline, copy",{"type":17,"tag":7239,"props":22168,"children":22169},{},[22170,22174,22179],{"type":17,"tag":7266,"props":22171,"children":22172},{},[22173],{"type":23,"value":11314},{"type":17,"tag":7266,"props":22175,"children":22176},{},[22177],{"type":23,"value":22178},"Lookup values",{"type":17,"tag":7266,"props":22180,"children":22181},{},[22182],{"type":23,"value":22183},"id, name, type",{"type":17,"tag":7239,"props":22185,"children":22186},{},[22187,22192,22197],{"type":17,"tag":7266,"props":22188,"children":22189},{},[22190],{"type":23,"value":22191},"Report",{"type":17,"tag":7266,"props":22193,"children":22194},{},[22195],{"type":23,"value":22196},"Metrics",{"type":17,"tag":7266,"props":22198,"children":22199},{},[22200,22202],{"type":23,"value":22201},"metrics",{"type":17,"tag":22203,"props":22204,"children":22205},"span",{},[],{"type":17,"tag":29,"props":22207,"children":22208},{},[22209],{"type":23,"value":22210},"Targeting is:",{"type":17,"tag":80,"props":22212,"children":22213},{},[22214,22221,22229],{"type":17,"tag":84,"props":22215,"children":22216},{},[22217],{"type":17,"tag":48,"props":22218,"children":22219},{},[22220],{"type":23,"value":18677},{"type":17,"tag":84,"props":22222,"children":22223},{},[22224],{"type":17,"tag":48,"props":22225,"children":22226},{},[22227],{"type":23,"value":22228},"configurable primarily at the group level",{"type":17,"tag":84,"props":22230,"children":22231},{},[22232],{"type":17,"tag":48,"props":22233,"children":22234},{},[22235],{"type":23,"value":22236},"supported at campaign level only where the integration allows it",{"type":17,"tag":68,"props":22238,"children":22240},{"id":22239},"step-1-retrieve-ad-accounts",[22241],{"type":23,"value":22242},"Step 1: Retrieve Ad Accounts",{"type":17,"tag":29,"props":22244,"children":22245},{},[22246,22248,22254],{"type":23,"value":22247},"Ad accounts are represented as ",{"type":17,"tag":6121,"props":22249,"children":22251},{"className":22250},[],[22252],{"type":23,"value":22253},"AdsOrganization",{"type":23,"value":54},{"type":17,"tag":6893,"props":22256,"children":22259},{"className":22257,"code":22258,"language":18718,"meta":7},[18716],"const organizations = await sdk.ads.listAdsOrganizations({\n  connectionId,\n});\n",[22260],{"type":17,"tag":6121,"props":22261,"children":22262},{"__ignoreMap":7},[22263],{"type":23,"value":22258},{"type":17,"tag":29,"props":22265,"children":22266},{},[22267],{"type":23,"value":22268},"Each organization includes:",{"type":17,"tag":80,"props":22270,"children":22271},{},[22272,22280,22288,22297],{"type":17,"tag":84,"props":22273,"children":22274},{},[22275],{"type":17,"tag":6121,"props":22276,"children":22278},{"className":22277},[],[22279],{"type":23,"value":18766},{"type":17,"tag":84,"props":22281,"children":22282},{},[22283],{"type":17,"tag":6121,"props":22284,"children":22286},{"className":22285},[],[22287],{"type":23,"value":18781},{"type":17,"tag":84,"props":22289,"children":22290},{},[22291],{"type":17,"tag":6121,"props":22292,"children":22294},{"className":22293},[],[22295],{"type":23,"value":22296},"currency",{"type":17,"tag":84,"props":22298,"children":22299},{},[22300],{"type":17,"tag":6121,"props":22301,"children":22303},{"className":22302},[],[22304],{"type":23,"value":22305},"timezone",{"type":17,"tag":29,"props":22307,"children":22308},{},[22309,22311,22316,22318,22324],{"type":23,"value":22310},"Ad account selection happens ",{"type":17,"tag":48,"props":22312,"children":22313},{},[22314],{"type":23,"value":22315},"after authorization",{"type":23,"value":22317},", not during ",{"type":17,"tag":133,"props":22319,"children":22322},{"href":22320,"rel":22321},"https://auth0.com/intro-to-iam/what-is-oauth-2",[214],[22323],{"type":23,"value":782},{"type":23,"value":54},{"type":17,"tag":68,"props":22326,"children":22328},{"id":22327},"step-2-retrieve-campaigns",[22329],{"type":23,"value":22330},"Step 2: Retrieve Campaigns",{"type":17,"tag":6893,"props":22332,"children":22335},{"className":22333,"code":22334,"language":18718,"meta":7},[18716],"const campaigns = await sdk.ads.listAdsCampaigns({\n  connectionId,\n  orgId, // optional\n});\n",[22336],{"type":17,"tag":6121,"props":22337,"children":22338},{"__ignoreMap":7},[22339],{"type":23,"value":22334},{"type":17,"tag":29,"props":22341,"children":22342},{},[22343],{"type":23,"value":19821},{"type":17,"tag":80,"props":22345,"children":22346},{},[22347,22358,22363],{"type":17,"tag":84,"props":22348,"children":22349},{},[22350,22356],{"type":17,"tag":6121,"props":22351,"children":22353},{"className":22352},[],[22354],{"type":23,"value":22355},"orgId",{"type":23,"value":22357}," filters by ad account",{"type":17,"tag":84,"props":22359,"children":22360},{},[22361],{"type":23,"value":22362},"campaigns are returned using a unified structure",{"type":17,"tag":84,"props":22364,"children":22365},{},[22366],{"type":23,"value":22367},"targeting is included as a readable field",{"type":17,"tag":68,"props":22369,"children":22371},{"id":22370},"step-3-retrieve-performance-data",[22372],{"type":23,"value":22373},"Step 3: Retrieve Performance Data",{"type":17,"tag":6893,"props":22375,"children":22378},{"className":22376,"code":22377,"language":18718,"meta":7},[18716],"const reports = await sdk.ads.listAdsReports({\n  connectionId,\n  startGte: \"2026-01-01\",\n  endLt: \"2026-01-31\",\n});\n",[22379],{"type":17,"tag":6121,"props":22380,"children":22381},{"__ignoreMap":7},[22382],{"type":23,"value":22377},{"type":17,"tag":29,"props":22384,"children":22385},{},[22386],{"type":23,"value":22387},"Each report includes:",{"type":17,"tag":80,"props":22389,"children":22390},{},[22391,22400,22414],{"type":17,"tag":84,"props":22392,"children":22393},{},[22394],{"type":17,"tag":6121,"props":22395,"children":22397},{"className":22396},[],[22398],{"type":23,"value":22399},"organization_id",{"type":17,"tag":84,"props":22401,"children":22402},{},[22403,22408,22409],{"type":17,"tag":6121,"props":22404,"children":22406},{"className":22405},[],[22407],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":22410,"children":22412},{"className":22411},[],[22413],{"type":23,"value":21060},{"type":17,"tag":84,"props":22415,"children":22416},{},[22417],{"type":17,"tag":6121,"props":22418,"children":22420},{"className":22419},[],[22421],{"type":23,"value":22422},"metrics[]",{"type":17,"tag":29,"props":22424,"children":22425},{},[22426],{"type":23,"value":22427},"Metrics are integration-defined and should not be hardcoded.",{"type":17,"tag":68,"props":22429,"children":22431},{"id":22430},"step-4-look-up-targeting-identifiers",[22432],{"type":23,"value":22433},"Step 4: Look Up Targeting Identifiers",{"type":17,"tag":29,"props":22435,"children":22436},{},[22437],{"type":23,"value":22438},"Before applying targeting, you must retrieve valid IDs.",{"type":17,"tag":29,"props":22440,"children":22441},{},[22442],{"type":23,"value":22443},"Each integration uses different identifiers:",{"type":17,"tag":80,"props":22445,"children":22446},{},[22447,22459,22469],{"type":17,"tag":84,"props":22448,"children":22449},{},[22450,22457],{"type":17,"tag":133,"props":22451,"children":22454},{"href":22452,"rel":22453},"https://docs.unified.to/integrations/metaads",[214],[22455],{"type":23,"value":22456},"Meta",{"type":23,"value":22458}," → interest IDs",{"type":17,"tag":84,"props":22460,"children":22461},{},[22462,22467],{"type":17,"tag":133,"props":22463,"children":22464},{"href":21915},[22465],{"type":23,"value":22466},"Google",{"type":23,"value":22468}," → geoTargetConstants",{"type":17,"tag":84,"props":22470,"children":22471},{},[22472,22479],{"type":17,"tag":133,"props":22473,"children":22476},{"href":22474,"rel":22475},"https://docs.unified.to/integrations/tiktokads",[214],[22477],{"type":23,"value":22478},"TikTok",{"type":23,"value":22480}," → category IDs",{"type":17,"tag":29,"props":22482,"children":22483},{},[22484],{"type":23,"value":18712},{"type":17,"tag":6893,"props":22486,"children":22488},{"className":22487,"code":18717,"language":18718,"meta":7},[18716],[22489],{"type":17,"tag":6121,"props":22490,"children":22491},{"__ignoreMap":7},[22492],{"type":23,"value":18717},{"type":17,"tag":29,"props":22494,"children":22495},{},[22496],{"type":23,"value":22497},"Returns:",{"type":17,"tag":6893,"props":22499,"children":22504},{"className":22500,"code":22502,"language":22503,"meta":7},[22501],"language-json","[\n  { \"id\": \"US\", \"name\": \"United States\", \"type\": \"countries\" },\n  { \"id\": \"GB\", \"name\": \"United Kingdom\", \"type\": \"countries\" }\n]\n","json",[22505],{"type":17,"tag":6121,"props":22506,"children":22507},{"__ignoreMap":7},[22508],{"type":23,"value":22502},{"type":17,"tag":29,"props":22510,"children":22511},{},[22512],{"type":23,"value":22513},"Supported types include:",{"type":17,"tag":80,"props":22515,"children":22516},{},[22517,22522,22527,22532,22537],{"type":17,"tag":84,"props":22518,"children":22519},{},[22520],{"type":23,"value":22521},"countries, regions, cities",{"type":17,"tag":84,"props":22523,"children":22524},{},[22525],{"type":23,"value":22526},"locales, languages",{"type":17,"tag":84,"props":22528,"children":22529},{},[22530],{"type":23,"value":22531},"interests, behaviors, topics",{"type":17,"tag":84,"props":22533,"children":22534},{},[22535],{"type":23,"value":22536},"user_lists (custom audiences)",{"type":17,"tag":84,"props":22538,"children":22539},{},[22540],{"type":23,"value":18834},{"type":17,"tag":29,"props":22542,"children":22543},{},[22544],{"type":23,"value":22545},"These IDs are used in targeting payloads.",{"type":17,"tag":68,"props":22547,"children":22549},{"id":22548},"step-5-apply-targeting-group-level",[22550],{"type":23,"value":22551},"Step 5: Apply Targeting (Group-Level)",{"type":17,"tag":29,"props":22553,"children":22554},{},[22555,22557,22562],{"type":23,"value":22556},"For most integrations, targeting is configured at the ",{"type":17,"tag":48,"props":22558,"children":22559},{},[22560],{"type":23,"value":22561},"group level",{"type":23,"value":54},{"type":17,"tag":6893,"props":22564,"children":22567},{"className":22565,"code":22566,"language":18718,"meta":7},[18716],"const group = await sdk.ads.getAdsGroup({\n  connectionId,\n  id: groupId,\n});\n\nawait sdk.ads.updateAdsGroup({\n  connectionId,\n  id: groupId,\n  adsGroup: {\n    ...group,\n    targeting: {\n      geographic: {\n        countries: ['US'],\n        regions: [{ id: '3843', name: 'California' }],\n      },\n      demographic: {\n        ageMin: 25,\n        ageMax: 54,\n        male: true,\n        female: true,\n      },\n      audience: {\n        interests: [\n          { id: '600313926646746', name: 'Technology' }\n        ],\n      },\n    },\n  },\n});\n",[22568],{"type":17,"tag":6121,"props":22569,"children":22570},{"__ignoreMap":7},[22571],{"type":23,"value":22566},{"type":17,"tag":29,"props":22573,"children":22574},{},[22575],{"type":23,"value":19907},{"type":17,"tag":80,"props":22577,"children":22578},{},[22579,22590,22595],{"type":17,"tag":84,"props":22580,"children":22581},{},[22582,22584],{"type":23,"value":22583},"IDs come from ",{"type":17,"tag":6121,"props":22585,"children":22587},{"className":22586},[],[22588],{"type":23,"value":22589},"listAdsTargets",{"type":17,"tag":84,"props":22591,"children":22592},{},[22593],{"type":23,"value":22594},"targeting structure is consistent",{"type":17,"tag":84,"props":22596,"children":22597},{},[22598],{"type":23,"value":22599},"available targeting types vary by integration",{"type":17,"tag":68,"props":22601,"children":22603},{"id":22602},"step-6-update-campaign-controls",[22604],{"type":23,"value":22605},"Step 6: Update Campaign Controls",{"type":17,"tag":29,"props":22607,"children":22608},{},[22609],{"type":23,"value":22610},"Campaign updates use PUT semantics.",{"type":17,"tag":29,"props":22612,"children":22613},{},[22614],{"type":23,"value":22615},"Use a read → merge → update pattern.",{"type":17,"tag":239,"props":22617,"children":22619},{"id":22618},"pause-a-campaign",[22620],{"type":23,"value":22621},"Pause a campaign",{"type":17,"tag":6893,"props":22623,"children":22626},{"className":22624,"code":22625,"language":18718,"meta":7},[18716],"const campaign = await sdk.ads.getAdsCampaign({\n  connectionId,\n  id,\n});\n\nawait sdk.ads.updateAdsCampaign({\n  connectionId,\n  id,\n  adsCampaign: {\n    ...campaign,\n    status: 'PAUSED',\n  },\n});\n",[22627],{"type":17,"tag":6121,"props":22628,"children":22629},{"__ignoreMap":7},[22630],{"type":23,"value":22625},{"type":17,"tag":239,"props":22632,"children":22634},{"id":22633},"update-budget",[22635],{"type":23,"value":22636},"Update budget",{"type":17,"tag":6893,"props":22638,"children":22641},{"className":22639,"code":22640,"language":18718,"meta":7},[18716],"await sdk.ads.updateAdsCampaign({\n  connectionId,\n  id,\n  adsCampaign: {\n    ...campaign,\n    budgetAmount: 5000,\n    budgetPeriod: 'DAILY',\n  },\n});\n",[22642],{"type":17,"tag":6121,"props":22643,"children":22644},{"__ignoreMap":7},[22645],{"type":23,"value":22640},{"type":17,"tag":239,"props":22647,"children":22649},{"id":22648},"update-flight-dates",[22650],{"type":23,"value":22651},"Update flight dates",{"type":17,"tag":6893,"props":22653,"children":22656},{"className":22654,"code":22655,"language":18718,"meta":7},[18716],"await sdk.ads.updateAdsCampaign({\n  connectionId,\n  id,\n  adsCampaign: {\n    ...campaign,\n    endAt: '2026-03-31T23:59:59Z',\n  },\n});\n",[22657],{"type":17,"tag":6121,"props":22658,"children":22659},{"__ignoreMap":7},[22660],{"type":23,"value":22655},{"type":17,"tag":29,"props":22662,"children":22663},{},[22664],{"type":23,"value":22665},"Dates must be ISO-8601.",{"type":17,"tag":68,"props":22667,"children":22669},{"id":22668},"provider-differences-you-must-handle",[22670],{"type":23,"value":22671},"Provider Differences You Must Handle",{"type":17,"tag":29,"props":22673,"children":22674},{},[22675],{"type":23,"value":22676},"Not all integrations support the same fields.",{"type":17,"tag":29,"props":22678,"children":22679},{},[22680],{"type":23,"value":377},{"type":17,"tag":80,"props":22682,"children":22683},{},[22684,22689,22694,22699],{"type":17,"tag":84,"props":22685,"children":22686},{},[22687],{"type":23,"value":22688},"Some allow campaign-level targeting",{"type":17,"tag":84,"props":22690,"children":22691},{},[22692],{"type":23,"value":22693},"Most require group-level targeting",{"type":17,"tag":84,"props":22695,"children":22696},{},[22697],{"type":23,"value":22698},"Some do not allow budget updates",{"type":17,"tag":84,"props":22700,"children":22701},{},[22702],{"type":23,"value":22703},"Some restrict date changes",{"type":17,"tag":29,"props":22705,"children":22706},{},[22707],{"type":23,"value":22708},"When unsupported:",{"type":17,"tag":6893,"props":22710,"children":22713},{"className":22711,"code":22712,"language":20901,"meta":23},[20899],"501 Not Implemented\n",[22714],{"type":17,"tag":6121,"props":22715,"children":22716},{"__ignoreMap":7},[22717],{"type":23,"value":22712},{"type":17,"tag":29,"props":22719,"children":22720},{},[22721],{"type":23,"value":22722},"Do not retry these operations.",{"type":17,"tag":68,"props":22724,"children":22726},{"id":22725},"rate-limits-and-retry-logic",[22727],{"type":23,"value":22728},"Rate Limits and Retry Logic",{"type":17,"tag":29,"props":22730,"children":22731},{},[22732,22734,22738],{"type":23,"value":22733},"When ",{"type":17,"tag":133,"props":22735,"children":22736},{"href":135},[22737],{"type":23,"value":138},{"type":23,"value":22739}," are exceeded:",{"type":17,"tag":6893,"props":22741,"children":22744},{"className":22742,"code":22743,"language":20901,"meta":23},[20899],"429 Too Many Requests\n",[22745],{"type":17,"tag":6121,"props":22746,"children":22747},{"__ignoreMap":7},[22748],{"type":23,"value":22743},{"type":17,"tag":29,"props":22750,"children":22751},{},[22752],{"type":23,"value":22753},"Recommended approach:",{"type":17,"tag":80,"props":22755,"children":22756},{},[22757,22762,22767],{"type":17,"tag":84,"props":22758,"children":22759},{},[22760],{"type":23,"value":22761},"exponential backoff",{"type":17,"tag":84,"props":22763,"children":22764},{},[22765],{"type":23,"value":22766},"retry only on 429",{"type":17,"tag":84,"props":22768,"children":22769},{},[22770],{"type":23,"value":22771},"avoid retrying validation errors",{"type":17,"tag":29,"props":22773,"children":22774},{},[22775],{"type":23,"value":22776},"The SDK does not automatically retry write operations.",{"type":17,"tag":68,"props":22778,"children":22780},{"id":22779},"how-the-dashboard-comes-together",[22781],{"type":23,"value":22782},"How the Dashboard Comes Together",{"type":17,"tag":29,"props":22784,"children":22785},{},[22786],{"type":23,"value":22787},"The full data flow:",{"type":17,"tag":6893,"props":22789,"children":22792},{"className":22790,"code":22791,"language":18718,"meta":7},[18716],"organizations\n→ campaigns\n→ reports\n→ targets (lookup)\n→ groups (targeting)\n→ campaign updates\n",[22793],{"type":17,"tag":6121,"props":22794,"children":22795},{"__ignoreMap":7},[22796],{"type":23,"value":22791},{"type":17,"tag":29,"props":22798,"children":22799},{},[22800],{"type":23,"value":22801},"This allows you to:",{"type":17,"tag":80,"props":22803,"children":22804},{},[22805,22810,22815,22820,22825],{"type":17,"tag":84,"props":22806,"children":22807},{},[22808],{"type":23,"value":22809},"display campaigns across integrations",{"type":17,"tag":84,"props":22811,"children":22812},{},[22813],{"type":23,"value":22814},"compare performance",{"type":17,"tag":84,"props":22816,"children":22817},{},[22818],{"type":23,"value":22819},"segment by ad account",{"type":17,"tag":84,"props":22821,"children":22822},{},[22823],{"type":23,"value":22824},"apply targeting consistently",{"type":17,"tag":84,"props":22826,"children":22827},{},[22828],{"type":23,"value":22829},"update campaigns safely",{"type":17,"tag":68,"props":22831,"children":22833},{"id":22832},"why-targeting-is-the-hardest-part",[22834],{"type":23,"value":22835},"Why Targeting Is the Hardest Part",{"type":17,"tag":29,"props":22837,"children":22838},{},[22839],{"type":23,"value":22840},"Campaign metrics are easy to retrieve.",{"type":17,"tag":29,"props":22842,"children":22843},{},[22844],{"type":23,"value":22845},"Targeting is not.",{"type":17,"tag":29,"props":22847,"children":22848},{},[22849],{"type":23,"value":22850},"Each integration:",{"type":17,"tag":80,"props":22852,"children":22853},{},[22854,22859,22864],{"type":17,"tag":84,"props":22855,"children":22856},{},[22857],{"type":23,"value":22858},"uses different identifiers",{"type":17,"tag":84,"props":22860,"children":22861},{},[22862],{"type":23,"value":22863},"supports different targeting types",{"type":17,"tag":84,"props":22865,"children":22866},{},[22867],{"type":23,"value":22868},"validates inputs differently",{"type":17,"tag":29,"props":22870,"children":22871},{},[22872],{"type":23,"value":22873},"Without a lookup layer, you must:",{"type":17,"tag":80,"props":22875,"children":22876},{},[22877,22882,22887],{"type":17,"tag":84,"props":22878,"children":22879},{},[22880],{"type":23,"value":22881},"build mapping logic per integration",{"type":17,"tag":84,"props":22883,"children":22884},{},[22885],{"type":23,"value":22886},"maintain ID dictionaries",{"type":17,"tag":84,"props":22888,"children":22889},{},[22890],{"type":23,"value":22891},"handle edge cases manually",{"type":17,"tag":29,"props":22893,"children":22894},{},[22895],{"type":23,"value":22896},"Unified removes that step by providing:",{"type":17,"tag":80,"props":22898,"children":22899},{},[22900,22905,22910],{"type":17,"tag":84,"props":22901,"children":22902},{},[22903],{"type":23,"value":22904},"a targeting lookup endpoint",{"type":17,"tag":84,"props":22906,"children":22907},{},[22908],{"type":23,"value":22909},"a consistent targeting structure",{"type":17,"tag":84,"props":22911,"children":22912},{},[22913],{"type":23,"value":22914},"unified object models",{"type":17,"tag":29,"props":22916,"children":22917},{},[22918],{"type":23,"value":22919},"This reduces per-integration logic and simplifies campaign creation.",{"type":17,"tag":68,"props":22921,"children":22922},{"id":7672},[22923],{"type":23,"value":19256},{"type":17,"tag":80,"props":22925,"children":22926},{},[22927,22932,22937,22942,22952,22957,22962],{"type":17,"tag":84,"props":22928,"children":22929},{},[22930],{"type":23,"value":22931},"Advertising dashboards fail due to targeting and campaign structure differences",{"type":17,"tag":84,"props":22933,"children":22934},{},[22935],{"type":23,"value":22936},"Campaigns handle budget and scheduling",{"type":17,"tag":84,"props":22938,"children":22939},{},[22940],{"type":23,"value":22941},"Groups handle targeting for most integrations",{"type":17,"tag":84,"props":22943,"children":22944},{},[22945,22947],{"type":23,"value":22946},"Targeting IDs must be retrieved using ",{"type":17,"tag":6121,"props":22948,"children":22950},{"className":22949},[],[22951],{"type":23,"value":22589},{"type":17,"tag":84,"props":22953,"children":22954},{},[22955],{"type":23,"value":22956},"Campaign updates require read → merge → update",{"type":17,"tag":84,"props":22958,"children":22959},{},[22960],{"type":23,"value":22961},"Provider support varies and must be handled explicitly",{"type":17,"tag":84,"props":22963,"children":22964},{},[22965],{"type":23,"value":22966},"Targeting is the highest-friction part of campaign management",{"type":17,"tag":29,"props":22968,"children":22969},{},[22970,22971],{"type":23,"value":1609},{"type":17,"tag":133,"props":22972,"children":22974},{"href":1612,"rel":22973},[214],[22975],{"type":23,"value":1616},{"type":17,"tag":29,"props":22977,"children":22978},{},[22979,22980],{"type":23,"value":1609},{"type":17,"tag":133,"props":22981,"children":22983},{"href":1623,"rel":22982},[214],[22984],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":22986},[22987,22988,22989,22990,22991,22992,22993,22994,22999,23000,23001,23002,23003],{"id":21965,"depth":1629,"text":21968},{"id":22066,"depth":1629,"text":22069},{"id":22239,"depth":1629,"text":22242},{"id":22327,"depth":1629,"text":22330},{"id":22370,"depth":1629,"text":22373},{"id":22430,"depth":1629,"text":22433},{"id":22548,"depth":1629,"text":22551},{"id":22602,"depth":1629,"text":22605,"children":22995},[22996,22997,22998],{"id":22618,"depth":1635,"text":22621},{"id":22633,"depth":1635,"text":22636},{"id":22648,"depth":1635,"text":22651},{"id":22668,"depth":1629,"text":22671},{"id":22725,"depth":1629,"text":22728},{"id":22779,"depth":1629,"text":22782},{"id":22832,"depth":1629,"text":22835},{"id":7672,"depth":1629,"text":19256},"content:blog:how_to_build_an_advertising_dashboard_across_multiple_platforms_using_a_unified_advertising_api.md","blog/how_to_build_an_advertising_dashboard_across_multiple_platforms_using_a_unified_advertising_api.md","blog/how_to_build_an_advertising_dashboard_across_multiple_platforms_using_a_unified_advertising_api",{"_path":23008,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":23009,"description":23010,"img":23011,"date":23012,"tag":12,"body":23013,"_type":1677,"_id":24308,"_source":1679,"_file":24309,"_stem":24310,"_extension":1682},"/blog/10_knowledge_base_apis_to_integrate_with_confluence_notion_guru_and_unified_kms_apis","10 Knowledge Base APIs to Integrate With: Confluence, Notion, Guru, and Unified KMS APIs","Knowledge is one of the most underutilized datasets in SaaS.","https://s3.us-east-2.amazonaws.com/unified-article-images/10_knowledge_base_apis_to_integrate_with_confluence_notion_guru_and_unified_kms_apis-icon.png","2026-03-24T00:40:00.000Z",{"type":14,"children":23014,"toc":24277},[23015,23020,23023,23030,23034,23070,23075,23094,23100,23105,23110,23128,23133,23167,23173,23178,23183,23206,23210,23218,23223,23231,23236,23244,23249,23257,23262,23268,23273,23279,23288,23293,23297,23315,23321,23330,23335,23340,23358,23364,23373,23378,23383,23401,23407,23416,23421,23425,23442,23448,23458,23463,23467,23484,23490,23500,23505,23509,23526,23532,23542,23547,23551,23569,23575,23585,23590,23594,23611,23617,23627,23632,23636,23654,23660,23681,23686,23690,23703,23709,23714,23743,23748,23754,23759,23765,23770,23793,23798,23804,23809,23815,23820,23837,23841,23846,23864,23870,23875,23886,23890,23913,23918,23924,23944,23948,23989,23995,24000,24018,24023,24047,24053,24058,24076,24086,24090,24113,24125,24130,24136,24141,24167,24172,24178,24183,24188,24215,24220,24233,24237,24242,24247,24259,24268],{"type":17,"tag":18,"props":23016,"children":23018},{"id":23017},"_10-knowledge-base-apis-to-integrate-with-confluence-notion-guru-and-unified-kms-apis",[23019],{"type":23,"value":23009},{"type":17,"tag":25,"props":23021,"children":23022},{},[],{"type":17,"tag":29,"props":23024,"children":23025},{},[23026],{"type":17,"tag":33,"props":23027,"children":23028},{},[23029],{"type":23,"value":19372},{"type":17,"tag":29,"props":23031,"children":23032},{},[23033],{"type":23,"value":23010},{"type":17,"tag":29,"props":23035,"children":23036},{},[23037,23039,23046,23047,23054,23055,23062,23063,23069],{"type":23,"value":23038},"Documentation, help center articles, internal wikis, and support content live across tools like ",{"type":17,"tag":133,"props":23040,"children":23043},{"href":23041,"rel":23042},"https://developer.atlassian.com/cloud/confluence/rest/",[214],[23044],{"type":23,"value":23045},"Atlassian Confluence",{"type":23,"value":11826},{"type":17,"tag":133,"props":23048,"children":23051},{"href":23049,"rel":23050},"https://developers.notion.com/reference/intro",[214],[23052],{"type":23,"value":23053},"Notion",{"type":23,"value":11826},{"type":17,"tag":133,"props":23056,"children":23059},{"href":23057,"rel":23058},"https://developer.getguru.com/docs",[214],[23060],{"type":23,"value":23061},"Guru",{"type":23,"value":12561},{"type":17,"tag":133,"props":23064,"children":23067},{"href":23065,"rel":23066},"https://developers.intercom.com/docs/references/rest-api/api.intercom.io/",[214],[23068],{"type":23,"value":15729},{"type":23,"value":54},{"type":17,"tag":29,"props":23071,"children":23072},{},[23073],{"type":23,"value":23074},"For AI products, support platforms, and internal tools, this data is critical. But accessing it across multiple systems quickly becomes complex.",{"type":17,"tag":29,"props":23076,"children":23077},{},[23078,23080,23085,23087,23092],{"type":23,"value":23079},"This guide covers the ",{"type":17,"tag":48,"props":23081,"children":23082},{},[23083],{"type":23,"value":23084},"top knowledge base APIs to integrate with",{"type":23,"value":23086},", the most common use cases, the challenges of building KMS integrations directly, and why more teams are adopting ",{"type":17,"tag":48,"props":23088,"children":23089},{},[23090],{"type":23,"value":23091},"Unified KMS APIs",{"type":23,"value":23093}," to scale knowledge access and AI workflows.",{"type":17,"tag":68,"props":23095,"children":23097},{"id":23096},"what-is-a-knowledge-base-kms-api",[23098],{"type":23,"value":23099},"What is a knowledge base (KMS) API?",{"type":17,"tag":29,"props":23101,"children":23102},{},[23103],{"type":23,"value":23104},"A knowledge base API allows developers to access and manage documentation and help center data programmatically.",{"type":17,"tag":29,"props":23106,"children":23107},{},[23108],{"type":23,"value":23109},"That typically includes:",{"type":17,"tag":80,"props":23111,"children":23112},{},[23113,23118,23123],{"type":17,"tag":84,"props":23114,"children":23115},{},[23116],{"type":23,"value":23117},"spaces or workspaces",{"type":17,"tag":84,"props":23119,"children":23120},{},[23121],{"type":23,"value":23122},"pages or articles",{"type":17,"tag":84,"props":23124,"children":23125},{},[23126],{"type":23,"value":23127},"comments and discussions",{"type":17,"tag":29,"props":23129,"children":23130},{},[23131],{"type":23,"value":23132},"These APIs are used to build:",{"type":17,"tag":80,"props":23134,"children":23135},{},[23136,23141,23152,23157,23162],{"type":17,"tag":84,"props":23137,"children":23138},{},[23139],{"type":23,"value":23140},"enterprise search tools",{"type":17,"tag":84,"props":23142,"children":23143},{},[23144,23146,23150],{"type":23,"value":23145},"AI copilots and ",{"type":17,"tag":133,"props":23147,"children":23148},{"href":5201},[23149],{"type":23,"value":5204},{"type":23,"value":23151}," systems",{"type":17,"tag":84,"props":23153,"children":23154},{},[23155],{"type":23,"value":23156},"help center integrations",{"type":17,"tag":84,"props":23158,"children":23159},{},[23160],{"type":23,"value":23161},"documentation portals",{"type":17,"tag":84,"props":23163,"children":23164},{},[23165],{"type":23,"value":23166},"internal knowledge tools",{"type":17,"tag":68,"props":23168,"children":23170},{"id":23169},"why-saas-products-integrate-kms-apis",[23171],{"type":23,"value":23172},"Why SaaS products integrate KMS APIs",{"type":17,"tag":29,"props":23174,"children":23175},{},[23176],{"type":23,"value":23177},"Knowledge data is often fragmented across multiple systems.",{"type":17,"tag":29,"props":23179,"children":23180},{},[23181],{"type":23,"value":23182},"SaaS products integrate KMS platforms to:",{"type":17,"tag":80,"props":23184,"children":23185},{},[23186,23191,23196,23201],{"type":17,"tag":84,"props":23187,"children":23188},{},[23189],{"type":23,"value":23190},"power AI assistants with real documentation",{"type":17,"tag":84,"props":23192,"children":23193},{},[23194],{"type":23,"value":23195},"unify internal and external knowledge",{"type":17,"tag":84,"props":23197,"children":23198},{},[23199],{"type":23,"value":23200},"improve support and onboarding experiences",{"type":17,"tag":84,"props":23202,"children":23203},{},[23204],{"type":23,"value":23205},"enable cross-platform search",{"type":17,"tag":29,"props":23207,"children":23208},{},[23209],{"type":23,"value":12661},{"type":17,"tag":29,"props":23211,"children":23212},{},[23213],{"type":17,"tag":48,"props":23214,"children":23215},{},[23216],{"type":23,"value":23217},"Enterprise search",{"type":17,"tag":29,"props":23219,"children":23220},{},[23221],{"type":23,"value":23222},"Search across Confluence, Notion, SharePoint, and help centers in one place.",{"type":17,"tag":29,"props":23224,"children":23225},{},[23226],{"type":17,"tag":48,"props":23227,"children":23228},{},[23229],{"type":23,"value":23230},"AI knowledge assistants",{"type":17,"tag":29,"props":23232,"children":23233},{},[23234],{"type":23,"value":23235},"Feed documentation into LLMs for accurate, grounded responses.",{"type":17,"tag":29,"props":23237,"children":23238},{},[23239],{"type":17,"tag":48,"props":23240,"children":23241},{},[23242],{"type":23,"value":23243},"Documentation aggregation",{"type":17,"tag":29,"props":23245,"children":23246},{},[23247],{"type":23,"value":23248},"Combine multiple knowledge bases into a single interface.",{"type":17,"tag":29,"props":23250,"children":23251},{},[23252],{"type":17,"tag":48,"props":23253,"children":23254},{},[23255],{"type":23,"value":23256},"Support automation",{"type":17,"tag":29,"props":23258,"children":23259},{},[23260],{"type":23,"value":23261},"Use help center content to automate customer responses.",{"type":17,"tag":68,"props":23263,"children":23265},{"id":23264},"top-knowledge-base-apis-to-integrate-with",[23266],{"type":23,"value":23267},"Top knowledge base APIs to integrate with",{"type":17,"tag":29,"props":23269,"children":23270},{},[23271],{"type":23,"value":23272},"Below are the most commonly integrated knowledge management APIs.",{"type":17,"tag":239,"props":23274,"children":23276},{"id":23275},"_1-confluence-api",[23277],{"type":23,"value":23278},"1. Confluence API",{"type":17,"tag":29,"props":23280,"children":23281},{},[23282],{"type":17,"tag":133,"props":23283,"children":23285},{"href":23041,"rel":23284},[214],[23286],{"type":23,"value":23287},"Confluence API documentation",{"type":17,"tag":29,"props":23289,"children":23290},{},[23291],{"type":23,"value":23292},"Confluence is widely used for internal documentation and wikis.",{"type":17,"tag":29,"props":23294,"children":23295},{},[23296],{"type":23,"value":15093},{"type":17,"tag":80,"props":23298,"children":23299},{},[23300,23305,23310],{"type":17,"tag":84,"props":23301,"children":23302},{},[23303],{"type":23,"value":23304},"page retrieval",{"type":17,"tag":84,"props":23306,"children":23307},{},[23308],{"type":23,"value":23309},"documentation management",{"type":17,"tag":84,"props":23311,"children":23312},{},[23313],{"type":23,"value":23314},"internal knowledge systems",{"type":17,"tag":239,"props":23316,"children":23318},{"id":23317},"_2-notion-api",[23319],{"type":23,"value":23320},"2. Notion API",{"type":17,"tag":29,"props":23322,"children":23323},{},[23324],{"type":17,"tag":133,"props":23325,"children":23327},{"href":23049,"rel":23326},[214],[23328],{"type":23,"value":23329},"Notion API documentation",{"type":17,"tag":29,"props":23331,"children":23332},{},[23333],{"type":23,"value":23334},"Notion is used for docs, wikis, and internal tools.",{"type":17,"tag":29,"props":23336,"children":23337},{},[23338],{"type":23,"value":23339},"Typical uses:",{"type":17,"tag":80,"props":23341,"children":23342},{},[23343,23348,23353],{"type":17,"tag":84,"props":23344,"children":23345},{},[23346],{"type":23,"value":23347},"structured knowledge data",{"type":17,"tag":84,"props":23349,"children":23350},{},[23351],{"type":23,"value":23352},"content management",{"type":17,"tag":84,"props":23354,"children":23355},{},[23356],{"type":23,"value":23357},"internal tooling",{"type":17,"tag":239,"props":23359,"children":23361},{"id":23360},"_3-guru-api",[23362],{"type":23,"value":23363},"3. Guru API",{"type":17,"tag":29,"props":23365,"children":23366},{},[23367],{"type":17,"tag":133,"props":23368,"children":23370},{"href":23057,"rel":23369},[214],[23371],{"type":23,"value":23372},"Guru API documentation",{"type":17,"tag":29,"props":23374,"children":23375},{},[23376],{"type":23,"value":23377},"Guru is focused on verified knowledge and internal knowledge sharing.",{"type":17,"tag":29,"props":23379,"children":23380},{},[23381],{"type":23,"value":23382},"Common uses:",{"type":17,"tag":80,"props":23384,"children":23385},{},[23386,23391,23396],{"type":17,"tag":84,"props":23387,"children":23388},{},[23389],{"type":23,"value":23390},"knowledge cards",{"type":17,"tag":84,"props":23392,"children":23393},{},[23394],{"type":23,"value":23395},"team knowledge systems",{"type":17,"tag":84,"props":23397,"children":23398},{},[23399],{"type":23,"value":23400},"support enablement",{"type":17,"tag":239,"props":23402,"children":23404},{"id":23403},"_4-intercom-help-center-api",[23405],{"type":23,"value":23406},"4. Intercom Help Center API",{"type":17,"tag":29,"props":23408,"children":23409},{},[23410],{"type":17,"tag":133,"props":23411,"children":23413},{"href":23065,"rel":23412},[214],[23414],{"type":23,"value":23415},"Intercom API documentation",{"type":17,"tag":29,"props":23417,"children":23418},{},[23419],{"type":23,"value":23420},"Intercom includes a help center alongside messaging.",{"type":17,"tag":29,"props":23422,"children":23423},{},[23424],{"type":23,"value":23339},{"type":17,"tag":80,"props":23426,"children":23427},{},[23428,23433,23438],{"type":17,"tag":84,"props":23429,"children":23430},{},[23431],{"type":23,"value":23432},"help articles",{"type":17,"tag":84,"props":23434,"children":23435},{},[23436],{"type":23,"value":23437},"customer-facing knowledge",{"type":17,"tag":84,"props":23439,"children":23440},{},[23441],{"type":23,"value":15324},{"type":17,"tag":239,"props":23443,"children":23445},{"id":23444},"_5-help-scout-api",[23446],{"type":23,"value":23447},"5. Help Scout API",{"type":17,"tag":29,"props":23449,"children":23450},{},[23451],{"type":17,"tag":133,"props":23452,"children":23455},{"href":23453,"rel":23454},"https://developer.helpscout.com/mailbox-api/",[214],[23456],{"type":23,"value":23457},"Help Scout API documentation",{"type":17,"tag":29,"props":23459,"children":23460},{},[23461],{"type":23,"value":23462},"Help Scout provides helpdesk and knowledge base functionality.",{"type":17,"tag":29,"props":23464,"children":23465},{},[23466],{"type":23,"value":15093},{"type":17,"tag":80,"props":23468,"children":23469},{},[23470,23475,23479],{"type":17,"tag":84,"props":23471,"children":23472},{},[23473],{"type":23,"value":23474},"support content",{"type":17,"tag":84,"props":23476,"children":23477},{},[23478],{"type":23,"value":23432},{"type":17,"tag":84,"props":23480,"children":23481},{},[23482],{"type":23,"value":23483},"customer self-service",{"type":17,"tag":239,"props":23485,"children":23487},{"id":23486},"_6-zendesk-guide-api",[23488],{"type":23,"value":23489},"6. Zendesk Guide API",{"type":17,"tag":29,"props":23491,"children":23492},{},[23493],{"type":17,"tag":133,"props":23494,"children":23497},{"href":23495,"rel":23496},"https://developer.zendesk.com/api-reference/help_center/help-center-api/introduction/",[214],[23498],{"type":23,"value":23499},"Zendesk API documentation",{"type":17,"tag":29,"props":23501,"children":23502},{},[23503],{"type":23,"value":23504},"Zendesk Guide is the knowledge base component of Zendesk.",{"type":17,"tag":29,"props":23506,"children":23507},{},[23508],{"type":23,"value":23339},{"type":17,"tag":80,"props":23510,"children":23511},{},[23512,23517,23522],{"type":17,"tag":84,"props":23513,"children":23514},{},[23515],{"type":23,"value":23516},"help center content",{"type":17,"tag":84,"props":23518,"children":23519},{},[23520],{"type":23,"value":23521},"support knowledge systems",{"type":17,"tag":84,"props":23523,"children":23524},{},[23525],{"type":23,"value":23161},{"type":17,"tag":239,"props":23527,"children":23529},{"id":23528},"_7-microsoft-sharepoint-api",[23530],{"type":23,"value":23531},"7. Microsoft SharePoint API",{"type":17,"tag":29,"props":23533,"children":23534},{},[23535],{"type":17,"tag":133,"props":23536,"children":23539},{"href":23537,"rel":23538},"https://learn.microsoft.com/en-us/graph/api/resources/sharepoint",[214],[23540],{"type":23,"value":23541},"Microsoft Graph API documentation",{"type":17,"tag":29,"props":23543,"children":23544},{},[23545],{"type":23,"value":23546},"SharePoint is widely used for enterprise knowledge and document storage.",{"type":17,"tag":29,"props":23548,"children":23549},{},[23550],{"type":23,"value":23382},{"type":17,"tag":80,"props":23552,"children":23553},{},[23554,23559,23564],{"type":17,"tag":84,"props":23555,"children":23556},{},[23557],{"type":23,"value":23558},"internal documentation",{"type":17,"tag":84,"props":23560,"children":23561},{},[23562],{"type":23,"value":23563},"enterprise knowledge management",{"type":17,"tag":84,"props":23565,"children":23566},{},[23567],{"type":23,"value":23568},"content collaboration",{"type":17,"tag":239,"props":23570,"children":23572},{"id":23571},"_8-salesforce-knowledge-api",[23573],{"type":23,"value":23574},"8. Salesforce Knowledge API",{"type":17,"tag":29,"props":23576,"children":23577},{},[23578],{"type":17,"tag":133,"props":23579,"children":23582},{"href":23580,"rel":23581},"https://developer.salesforce.com/docs",[214],[23583],{"type":23,"value":23584},"Salesforce API documentation",{"type":17,"tag":29,"props":23586,"children":23587},{},[23588],{"type":23,"value":23589},"Salesforce includes knowledge functionality tied to CRM and support.",{"type":17,"tag":29,"props":23591,"children":23592},{},[23593],{"type":23,"value":23339},{"type":17,"tag":80,"props":23595,"children":23596},{},[23597,23602,23606],{"type":17,"tag":84,"props":23598,"children":23599},{},[23600],{"type":23,"value":23601},"support articles",{"type":17,"tag":84,"props":23603,"children":23604},{},[23605],{"type":23,"value":23437},{"type":17,"tag":84,"props":23607,"children":23608},{},[23609],{"type":23,"value":23610},"CRM-linked documentation",{"type":17,"tag":239,"props":23612,"children":23614},{"id":23613},"_9-servicenow-knowledge-api",[23615],{"type":23,"value":23616},"9. ServiceNow Knowledge API",{"type":17,"tag":29,"props":23618,"children":23619},{},[23620],{"type":17,"tag":133,"props":23621,"children":23624},{"href":23622,"rel":23623},"https://developer.servicenow.com/dev.do#!/reference/api/rome/rest",[214],[23625],{"type":23,"value":23626},"ServiceNow API documentation",{"type":17,"tag":29,"props":23628,"children":23629},{},[23630],{"type":23,"value":23631},"ServiceNow supports knowledge alongside ITSM workflows.",{"type":17,"tag":29,"props":23633,"children":23634},{},[23635],{"type":23,"value":23382},{"type":17,"tag":80,"props":23637,"children":23638},{},[23639,23644,23649],{"type":17,"tag":84,"props":23640,"children":23641},{},[23642],{"type":23,"value":23643},"IT knowledge bases",{"type":17,"tag":84,"props":23645,"children":23646},{},[23647],{"type":23,"value":23648},"internal support documentation",{"type":17,"tag":84,"props":23650,"children":23651},{},[23652],{"type":23,"value":23653},"enterprise workflows",{"type":17,"tag":239,"props":23655,"children":23657},{"id":23656},"_10-clickup-coda-apis",[23658],{"type":23,"value":23659},"10. ClickUp & Coda APIs",{"type":17,"tag":80,"props":23661,"children":23662},{},[23663,23671],{"type":17,"tag":84,"props":23664,"children":23665},{},[23666],{"type":17,"tag":133,"props":23667,"children":23669},{"href":12564,"rel":23668},[214],[23670],{"type":23,"value":12843},{"type":17,"tag":84,"props":23672,"children":23673},{},[23674],{"type":17,"tag":133,"props":23675,"children":23678},{"href":23676,"rel":23677},"https://coda.io/developers/apis/v1",[214],[23679],{"type":23,"value":23680},"Coda API",{"type":17,"tag":29,"props":23682,"children":23683},{},[23684],{"type":23,"value":23685},"These tools combine docs, tasks, and structured data.",{"type":17,"tag":29,"props":23687,"children":23688},{},[23689],{"type":23,"value":23339},{"type":17,"tag":80,"props":23691,"children":23692},{},[23693,23698],{"type":17,"tag":84,"props":23694,"children":23695},{},[23696],{"type":23,"value":23697},"hybrid knowledge + workflow systems",{"type":17,"tag":84,"props":23699,"children":23700},{},[23701],{"type":23,"value":23702},"collaborative documentation",{"type":17,"tag":239,"props":23704,"children":23706},{"id":23705},"additional-knowledge-platforms",[23707],{"type":23,"value":23708},"Additional knowledge platforms",{"type":17,"tag":29,"props":23710,"children":23711},{},[23712],{"type":23,"value":23713},"The knowledge ecosystem is broad and growing. Many teams also integrate:",{"type":17,"tag":80,"props":23715,"children":23716},{},[23717,23721,23726,23731,23735,23739],{"type":17,"tag":84,"props":23718,"children":23719},{},[23720],{"type":23,"value":23053},{"type":17,"tag":84,"props":23722,"children":23723},{},[23724],{"type":23,"value":23725},"Confluence",{"type":17,"tag":84,"props":23727,"children":23728},{},[23729],{"type":23,"value":23730},"SharePoint",{"type":17,"tag":84,"props":23732,"children":23733},{},[23734],{"type":23,"value":15738},{"type":17,"tag":84,"props":23736,"children":23737},{},[23738],{"type":23,"value":23061},{"type":17,"tag":84,"props":23740,"children":23741},{},[23742],{"type":23,"value":15729},{"type":17,"tag":29,"props":23744,"children":23745},{},[23746],{"type":23,"value":23747},"Depending on customer requirements, coverage often expands quickly.",{"type":17,"tag":68,"props":23749,"children":23751},{"id":23750},"challenges-with-kms-api-integrations",[23752],{"type":23,"value":23753},"Challenges with KMS API integrations",{"type":17,"tag":29,"props":23755,"children":23756},{},[23757],{"type":23,"value":23758},"Knowledge platforms look similar, but they differ significantly.",{"type":17,"tag":239,"props":23760,"children":23762},{"id":23761},"different-content-structures",[23763],{"type":23,"value":23764},"Different content structures",{"type":17,"tag":29,"props":23766,"children":23767},{},[23768],{"type":23,"value":23769},"Each platform models:",{"type":17,"tag":80,"props":23771,"children":23772},{},[23773,23778,23783,23788],{"type":17,"tag":84,"props":23774,"children":23775},{},[23776],{"type":23,"value":23777},"pages",{"type":17,"tag":84,"props":23779,"children":23780},{},[23781],{"type":23,"value":23782},"documents",{"type":17,"tag":84,"props":23784,"children":23785},{},[23786],{"type":23,"value":23787},"hierarchies",{"type":17,"tag":84,"props":23789,"children":23790},{},[23791],{"type":23,"value":23792},"metadata",{"type":17,"tag":29,"props":23794,"children":23795},{},[23796],{"type":23,"value":23797},"differently.",{"type":17,"tag":239,"props":23799,"children":23801},{"id":23800},"different-permissions-and-visibility-rules",[23802],{"type":23,"value":23803},"Different permissions and visibility rules",{"type":17,"tag":29,"props":23805,"children":23806},{},[23807],{"type":23,"value":23808},"Access control varies widely across platforms.",{"type":17,"tag":239,"props":23810,"children":23812},{"id":23811},"different-search-and-indexing-models",[23813],{"type":23,"value":23814},"Different search and indexing models",{"type":17,"tag":29,"props":23816,"children":23817},{},[23818],{"type":23,"value":23819},"Search capabilities differ in:",{"type":17,"tag":80,"props":23821,"children":23822},{},[23823,23828,23832],{"type":17,"tag":84,"props":23824,"children":23825},{},[23826],{"type":23,"value":23827},"indexing",{"type":17,"tag":84,"props":23829,"children":23830},{},[23831],{"type":23,"value":2118},{"type":17,"tag":84,"props":23833,"children":23834},{},[23835],{"type":23,"value":23836},"ranking",{"type":17,"tag":239,"props":23838,"children":23839},{"id":16796},[23840],{"type":23,"value":16799},{"type":17,"tag":29,"props":23842,"children":23843},{},[23844],{"type":23,"value":23845},"Supporting multiple KMS tools means maintaining:",{"type":17,"tag":80,"props":23847,"children":23848},{},[23849,23854,23859],{"type":17,"tag":84,"props":23850,"children":23851},{},[23852],{"type":23,"value":23853},"multiple APIs",{"type":17,"tag":84,"props":23855,"children":23856},{},[23857],{"type":23,"value":23858},"multiple schemas",{"type":17,"tag":84,"props":23860,"children":23861},{},[23862],{"type":23,"value":23863},"multiple auth systems",{"type":17,"tag":68,"props":23865,"children":23867},{"id":23866},"the-role-of-unified-kms-apis",[23868],{"type":23,"value":23869},"The role of Unified KMS APIs",{"type":17,"tag":29,"props":23871,"children":23872},{},[23873],{"type":23,"value":23874},"This is where Unified KMS APIs become valuable.",{"type":17,"tag":29,"props":23876,"children":23877},{},[23878,23880,23884],{"type":23,"value":23879},"Instead of building separate integrations for Confluence, Notion, Guru, SharePoint, Zendesk, and others, a ",{"type":17,"tag":133,"props":23881,"children":23882},{"href":7691},[23883],{"type":23,"value":7806},{"type":23,"value":23885}," provides a single interface.",{"type":17,"tag":29,"props":23887,"children":23888},{},[23889],{"type":23,"value":5804},{"type":17,"tag":80,"props":23891,"children":23892},{},[23893,23898,23903,23908],{"type":17,"tag":84,"props":23894,"children":23895},{},[23896],{"type":23,"value":23897},"one integration",{"type":17,"tag":84,"props":23899,"children":23900},{},[23901],{"type":23,"value":23902},"one authentication flow",{"type":17,"tag":84,"props":23904,"children":23905},{},[23906],{"type":23,"value":23907},"one schema for spaces, pages, and comments",{"type":17,"tag":84,"props":23909,"children":23910},{},[23911],{"type":23,"value":23912},"less maintenance",{"type":17,"tag":29,"props":23914,"children":23915},{},[23916],{"type":23,"value":23917},"For AI products and search-heavy applications, this is especially important.",{"type":17,"tag":68,"props":23919,"children":23921},{"id":23920},"build-once-with-the-unified-kms-api",[23922],{"type":23,"value":23923},"Build once with the Unified KMS API",{"type":17,"tag":29,"props":23925,"children":23926},{},[23927,23928,23935,23937,23942],{"type":23,"value":6712},{"type":17,"tag":133,"props":23929,"children":23932},{"href":23930,"rel":23931},"https://unified.to/kms",[214],[23933],{"type":23,"value":23934},"Unified KMS API",{"type":23,"value":23936}," gives developers access to ",{"type":17,"tag":48,"props":23938,"children":23939},{},[23940],{"type":23,"value":23941},"13+ knowledge management integrations",{"type":23,"value":23943}," through one standardized API.",{"type":17,"tag":29,"props":23945,"children":23946},{},[23947],{"type":23,"value":13248},{"type":17,"tag":80,"props":23949,"children":23950},{},[23951,23955,23959,23963,23967,23972,23976,23980,23985],{"type":17,"tag":84,"props":23952,"children":23953},{},[23954],{"type":23,"value":23725},{"type":17,"tag":84,"props":23956,"children":23957},{},[23958],{"type":23,"value":23053},{"type":17,"tag":84,"props":23960,"children":23961},{},[23962],{"type":23,"value":23061},{"type":17,"tag":84,"props":23964,"children":23965},{},[23966],{"type":23,"value":15729},{"type":17,"tag":84,"props":23968,"children":23969},{},[23970],{"type":23,"value":23971},"Help Scout",{"type":17,"tag":84,"props":23973,"children":23974},{},[23975],{"type":23,"value":23730},{"type":17,"tag":84,"props":23977,"children":23978},{},[23979],{"type":23,"value":15738},{"type":17,"tag":84,"props":23981,"children":23982},{},[23983],{"type":23,"value":23984},"ServiceNow",{"type":17,"tag":84,"props":23986,"children":23987},{},[23988],{"type":23,"value":3179},{"type":17,"tag":239,"props":23990,"children":23992},{"id":23991},"unified-kms-objects",[23993],{"type":23,"value":23994},"Unified KMS objects",{"type":17,"tag":29,"props":23996,"children":23997},{},[23998],{"type":23,"value":23999},"Unified standardizes key knowledge objects:",{"type":17,"tag":80,"props":24001,"children":24002},{},[24003,24008,24013],{"type":17,"tag":84,"props":24004,"children":24005},{},[24006],{"type":23,"value":24007},"Spaces (workspaces or knowledge bases)",{"type":17,"tag":84,"props":24009,"children":24010},{},[24011],{"type":23,"value":24012},"Pages (documents and articles)",{"type":17,"tag":84,"props":24014,"children":24015},{},[24016],{"type":23,"value":24017},"Comments (discussions and feedback)",{"type":17,"tag":29,"props":24019,"children":24020},{},[24021],{"type":23,"value":24022},"Each object supports consistent methods:",{"type":17,"tag":80,"props":24024,"children":24025},{},[24026,24030,24034,24039,24043],{"type":17,"tag":84,"props":24027,"children":24028},{},[24029],{"type":23,"value":11254},{"type":17,"tag":84,"props":24031,"children":24032},{},[24033],{"type":23,"value":11243},{"type":17,"tag":84,"props":24035,"children":24036},{},[24037],{"type":23,"value":24038},"retrieve",{"type":17,"tag":84,"props":24040,"children":24041},{},[24042],{"type":23,"value":11845},{"type":17,"tag":84,"props":24044,"children":24045},{},[24046],{"type":23,"value":11852},{"type":17,"tag":239,"props":24048,"children":24050},{"id":24049},"why-unified-is-different",[24051],{"type":23,"value":24052},"Why Unified is different",{"type":17,"tag":29,"props":24054,"children":24055},{},[24056],{"type":23,"value":24057},"Most integration approaches rely on:",{"type":17,"tag":80,"props":24059,"children":24060},{},[24061,24066,24071],{"type":17,"tag":84,"props":24062,"children":24063},{},[24064],{"type":23,"value":24065},"cached indexes",{"type":17,"tag":84,"props":24067,"children":24068},{},[24069],{"type":23,"value":24070},"sync pipelines",{"type":17,"tag":84,"props":24072,"children":24073},{},[24074],{"type":23,"value":24075},"duplicated storage",{"type":17,"tag":29,"props":24077,"children":24078},{},[24079,24081,24085],{"type":23,"value":24080},"Unified uses a ",{"type":17,"tag":48,"props":24082,"children":24083},{},[24084],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":24087,"children":24088},{},[24089],{"type":23,"value":5804},{"type":17,"tag":80,"props":24091,"children":24092},{},[24093,24098,24103,24108],{"type":17,"tag":84,"props":24094,"children":24095},{},[24096],{"type":23,"value":24097},"every request hits the source platform live",{"type":17,"tag":84,"props":24099,"children":24100},{},[24101],{"type":23,"value":24102},"no stale knowledge data",{"type":17,"tag":84,"props":24104,"children":24105},{},[24106],{"type":23,"value":24107},"no sync delays",{"type":17,"tag":84,"props":24109,"children":24110},{},[24111],{"type":23,"value":24112},"accurate, up-to-date content",{"type":17,"tag":29,"props":24114,"children":24115},{},[24116,24118,24123],{"type":23,"value":24117},"Unified is also ",{"type":17,"tag":48,"props":24119,"children":24120},{},[24121],{"type":23,"value":24122},"zero-storage by design",{"type":23,"value":24124},", so knowledge data is never stored at rest in the integration layer.",{"type":17,"tag":29,"props":24126,"children":24127},{},[24128],{"type":23,"value":24129},"This reduces compliance scope and improves security for sensitive internal documentation.",{"type":17,"tag":239,"props":24131,"children":24133},{"id":24132},"what-you-can-build-with-it",[24134],{"type":23,"value":24135},"What you can build with it",{"type":17,"tag":29,"props":24137,"children":24138},{},[24139],{"type":23,"value":24140},"With Unified, teams can build:",{"type":17,"tag":80,"props":24142,"children":24143},{},[24144,24148,24153,24157,24162],{"type":17,"tag":84,"props":24145,"children":24146},{},[24147],{"type":23,"value":23230},{"type":17,"tag":84,"props":24149,"children":24150},{},[24151],{"type":23,"value":24152},"enterprise search platforms",{"type":17,"tag":84,"props":24154,"children":24155},{},[24156],{"type":23,"value":23161},{"type":17,"tag":84,"props":24158,"children":24159},{},[24160],{"type":23,"value":24161},"support automation tools",{"type":17,"tag":84,"props":24163,"children":24164},{},[24165],{"type":23,"value":24166},"knowledge analytics systems",{"type":17,"tag":29,"props":24168,"children":24169},{},[24170],{"type":23,"value":24171},"without building separate integrations for each platform.",{"type":17,"tag":68,"props":24173,"children":24175},{"id":24174},"why-not-build-each-kms-integration-directly",[24176],{"type":23,"value":24177},"Why not build each KMS integration directly?",{"type":17,"tag":29,"props":24179,"children":24180},{},[24181],{"type":23,"value":24182},"You can, but the cost increases quickly.",{"type":17,"tag":29,"props":24184,"children":24185},{},[24186],{"type":23,"value":24187},"For each provider, you need to manage:",{"type":17,"tag":80,"props":24189,"children":24190},{},[24191,24195,24200,24205,24210],{"type":17,"tag":84,"props":24192,"children":24193},{},[24194],{"type":23,"value":2109},{"type":17,"tag":84,"props":24196,"children":24197},{},[24198],{"type":23,"value":24199},"content structure",{"type":17,"tag":84,"props":24201,"children":24202},{},[24203],{"type":23,"value":24204},"permissions",{"type":17,"tag":84,"props":24206,"children":24207},{},[24208],{"type":23,"value":24209},"search differences",{"type":17,"tag":84,"props":24211,"children":24212},{},[24213],{"type":23,"value":24214},"ongoing API changes",{"type":17,"tag":29,"props":24216,"children":24217},{},[24218],{"type":23,"value":24219},"Knowledge data is foundational for AI and support workflows, and fragile integrations here can break core product features.",{"type":17,"tag":29,"props":24221,"children":24222},{},[24223,24225,24231],{"type":23,"value":24224},"A Unified ",{"type":17,"tag":133,"props":24226,"children":24228},{"href":24227},"/kms",[24229],{"type":23,"value":24230},"KMS API",{"type":23,"value":24232}," simplifies that layer and makes it scalable.",{"type":17,"tag":68,"props":24234,"children":24235},{"id":1552},[24236],{"type":23,"value":1555},{"type":17,"tag":29,"props":24238,"children":24239},{},[24240],{"type":23,"value":24241},"Knowledge base APIs are essential for AI, support, and internal tooling, but supporting multiple platforms directly becomes difficult to maintain.",{"type":17,"tag":29,"props":24243,"children":24244},{},[24245],{"type":23,"value":24246},"That is why more SaaS teams are moving toward Unified KMS APIs.",{"type":17,"tag":29,"props":24248,"children":24249},{},[24250,24252,24257],{"type":23,"value":24251},"If you need real-time, read/write access to knowledge across Confluence, Notion, Guru, SharePoint, Zendesk, and more, ",{"type":17,"tag":133,"props":24253,"children":24255},{"href":212,"rel":24254},[214],[24256],{"type":23,"value":217},{"type":23,"value":24258}," provides a faster and more scalable way to support those workflows.",{"type":17,"tag":29,"props":24260,"children":24261},{},[24262,24263],{"type":23,"value":1609},{"type":17,"tag":133,"props":24264,"children":24266},{"href":1612,"rel":24265},[214],[24267],{"type":23,"value":1616},{"type":17,"tag":29,"props":24269,"children":24270},{},[24271,24272],{"type":23,"value":1609},{"type":17,"tag":133,"props":24273,"children":24275},{"href":1623,"rel":24274},[214],[24276],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":24278},[24279,24280,24281,24294,24300,24301,24306,24307],{"id":23096,"depth":1629,"text":23099},{"id":23169,"depth":1629,"text":23172},{"id":23264,"depth":1629,"text":23267,"children":24282},[24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293],{"id":23275,"depth":1635,"text":23278},{"id":23317,"depth":1635,"text":23320},{"id":23360,"depth":1635,"text":23363},{"id":23403,"depth":1635,"text":23406},{"id":23444,"depth":1635,"text":23447},{"id":23486,"depth":1635,"text":23489},{"id":23528,"depth":1635,"text":23531},{"id":23571,"depth":1635,"text":23574},{"id":23613,"depth":1635,"text":23616},{"id":23656,"depth":1635,"text":23659},{"id":23705,"depth":1635,"text":23708},{"id":23750,"depth":1629,"text":23753,"children":24295},[24296,24297,24298,24299],{"id":23761,"depth":1635,"text":23764},{"id":23800,"depth":1635,"text":23803},{"id":23811,"depth":1635,"text":23814},{"id":16796,"depth":1635,"text":16799},{"id":23866,"depth":1629,"text":23869},{"id":23920,"depth":1629,"text":23923,"children":24302},[24303,24304,24305],{"id":23991,"depth":1635,"text":23994},{"id":24049,"depth":1635,"text":24052},{"id":24132,"depth":1635,"text":24135},{"id":24174,"depth":1629,"text":24177},{"id":1552,"depth":1629,"text":1555},"content:blog:10_knowledge_base_apis_to_integrate_with_confluence_notion_guru_and_unified_kms_apis.md","blog/10_knowledge_base_apis_to_integrate_with_confluence_notion_guru_and_unified_kms_apis.md","blog/10_knowledge_base_apis_to_integrate_with_confluence_notion_guru_and_unified_kms_apis",{"_path":24312,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":24313,"description":24314,"img":24315,"date":24316,"tag":12,"body":24317,"_type":1677,"_id":25506,"_source":1679,"_file":25507,"_stem":25508,"_extension":1682},"/blog/how_to_build_ai_customer_support_copilots_using_zendesk_slack_and_notion","How to Build AI Customer Support Copilots Using Zendesk, Slack, and Notion","An AI customer support copilot is a feature inside a SaaS product that retrieves support tickets, conversations, and knowledge base content to help agents...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_ai_customer_support_copilots_using_zendesk_slack_and_notion-icon.png","2026-03-24T00:30:00.000Z",{"type":14,"children":24318,"toc":25489},[24319,24324,24327,24334,24339,24344,24349,24355,24360,24365,24393,24398,24416,24421,24427,24432,24440,24445,24453,24458,24466,24471,24479,24484,24492,24497,24503,24508,24606,24611,24617,24623,24633,24638,24749,24754,24760,24765,24823,24828,24885,24890,24896,24901,24960,24965,24989,24994,25000,25005,25010,25039,25044,25053,25058,25064,25069,25074,25083,25088,25097,25102,25111,25122,25128,25133,25138,25146,25151,25159,25164,25172,25177,25185,25190,25198,25203,25211,25216,25224,25229,25234,25240,25252,25257,25266,25270,25288,25293,25299,25304,25309,25327,25340,25346,25351,25355,25359,25376,25380,25395,25399,25414,25419,25423,25428,25433,25438,25461,25466,25471,25480],{"type":17,"tag":18,"props":24320,"children":24322},{"id":24321},"how-to-build-ai-customer-support-copilots-using-zendesk-slack-and-notion",[24323],{"type":23,"value":24313},{"type":17,"tag":25,"props":24325,"children":24326},{},[],{"type":17,"tag":29,"props":24328,"children":24329},{},[24330],{"type":17,"tag":33,"props":24331,"children":24332},{},[24333],{"type":23,"value":19372},{"type":17,"tag":29,"props":24335,"children":24336},{},[24337],{"type":23,"value":24338},"An AI customer support copilot is a feature inside a SaaS product that retrieves support tickets, conversations, and knowledge base content to help agents resolve issues faster. It allows teams to ask questions, generate responses, and summarize customer context using real data.",{"type":17,"tag":29,"props":24340,"children":24341},{},[24342],{"type":23,"value":24343},"To build this, your product needs access to multiple sources at once. Support tickets live in Zendesk, internal discussions happen in Slack, and documentation is stored in Notion. Each platform exposes different APIs and data models.",{"type":17,"tag":29,"props":24345,"children":24346},{},[24347],{"type":23,"value":24348},"Unified provides category-specific APIs that let your product retrieve ticketing, messaging, and knowledge data through consistent objects. This makes it possible to build AI copilots that operate across multiple platforms without per-provider integration logic.",{"type":17,"tag":68,"props":24350,"children":24352},{"id":24351},"why-saas-products-build-ai-support-copilots",[24353],{"type":23,"value":24354},"Why SaaS Products Build AI Support Copilots",{"type":17,"tag":29,"props":24356,"children":24357},{},[24358],{"type":23,"value":24359},"Many B2B SaaS products are adding AI support assistants for their customers.",{"type":17,"tag":29,"props":24361,"children":24362},{},[24363],{"type":23,"value":24364},"Examples include:",{"type":17,"tag":80,"props":24366,"children":24367},{},[24368,24373,24378,24383,24388],{"type":17,"tag":84,"props":24369,"children":24370},{},[24371],{"type":23,"value":24372},"Helpdesk platforms",{"type":17,"tag":84,"props":24374,"children":24375},{},[24376],{"type":23,"value":24377},"Customer support tools",{"type":17,"tag":84,"props":24379,"children":24380},{},[24381],{"type":23,"value":24382},"Customer success platforms",{"type":17,"tag":84,"props":24384,"children":24385},{},[24386],{"type":23,"value":24387},"AI productivity tools",{"type":17,"tag":84,"props":24389,"children":24390},{},[24391],{"type":23,"value":24392},"Support automation platforms",{"type":17,"tag":29,"props":24394,"children":24395},{},[24396],{"type":23,"value":24397},"These products help teams answer questions like:",{"type":17,"tag":80,"props":24399,"children":24400},{},[24401,24406,24411],{"type":17,"tag":84,"props":24402,"children":24403},{},[24404],{"type":23,"value":24405},"'Has this issue happened before?'",{"type":17,"tag":84,"props":24407,"children":24408},{},[24409],{"type":23,"value":24410},"'What's the context for this customer?'",{"type":17,"tag":84,"props":24412,"children":24413},{},[24414],{"type":23,"value":24415},"'How should I respond to this ticket?'",{"type":17,"tag":29,"props":24417,"children":24418},{},[24419],{"type":23,"value":24420},"Without unified access to tickets, conversations, and documentation, agents must search multiple tools manually.",{"type":17,"tag":68,"props":24422,"children":24424},{"id":24423},"common-ai-support-copilot-use-cases",[24425],{"type":23,"value":24426},"Common AI Support Copilot Use Cases",{"type":17,"tag":29,"props":24428,"children":24429},{},[24430],{"type":23,"value":24431},"AI support copilots typically support several workflows.",{"type":17,"tag":29,"props":24433,"children":24434},{},[24435],{"type":17,"tag":48,"props":24436,"children":24437},{},[24438],{"type":23,"value":24439},"Ticket summarization",{"type":17,"tag":29,"props":24441,"children":24442},{},[24443],{"type":23,"value":24444},"Summarize long support threads and provide quick context.",{"type":17,"tag":29,"props":24446,"children":24447},{},[24448],{"type":17,"tag":48,"props":24449,"children":24450},{},[24451],{"type":23,"value":24452},"Response generation",{"type":17,"tag":29,"props":24454,"children":24455},{},[24456],{"type":23,"value":24457},"Generate suggested replies based on previous tickets and documentation.",{"type":17,"tag":29,"props":24459,"children":24460},{},[24461],{"type":17,"tag":48,"props":24462,"children":24463},{},[24464],{"type":23,"value":24465},"Knowledge retrieval",{"type":17,"tag":29,"props":24467,"children":24468},{},[24469],{"type":23,"value":24470},"Search internal documentation and knowledge bases.",{"type":17,"tag":29,"props":24472,"children":24473},{},[24474],{"type":17,"tag":48,"props":24475,"children":24476},{},[24477],{"type":23,"value":24478},"Conversation analysis",{"type":17,"tag":29,"props":24480,"children":24481},{},[24482],{"type":23,"value":24483},"Extract insights from Slack or internal discussions.",{"type":17,"tag":29,"props":24485,"children":24486},{},[24487],{"type":17,"tag":48,"props":24488,"children":24489},{},[24490],{"type":23,"value":24491},"Case resolution assistance",{"type":17,"tag":29,"props":24493,"children":24494},{},[24495],{"type":23,"value":24496},"Provide step-by-step guidance based on historical data.",{"type":17,"tag":68,"props":24498,"children":24500},{"id":24499},"unified-categories-used",[24501],{"type":23,"value":24502},"Unified Categories Used",{"type":17,"tag":29,"props":24504,"children":24505},{},[24506],{"type":23,"value":24507},"An AI support copilot combines data from multiple categories.",{"type":17,"tag":7231,"props":24509,"children":24510},{},[24511,24531],{"type":17,"tag":7235,"props":24512,"children":24513},{},[24514],{"type":17,"tag":7239,"props":24515,"children":24516},{},[24517,24521,24526],{"type":17,"tag":7243,"props":24518,"children":24519},{},[24520],{"type":23,"value":7247},{"type":17,"tag":7243,"props":24522,"children":24523},{},[24524],{"type":23,"value":24525},"Description",{"type":17,"tag":7243,"props":24527,"children":24528},{},[24529],{"type":23,"value":24530},"Key Objects",{"type":17,"tag":7259,"props":24532,"children":24533},{},[24534,24552,24570,24588],{"type":17,"tag":7239,"props":24535,"children":24536},{},[24537,24542,24547],{"type":17,"tag":7266,"props":24538,"children":24539},{},[24540],{"type":23,"value":24541},"Ticketing",{"type":17,"tag":7266,"props":24543,"children":24544},{},[24545],{"type":23,"value":24546},"Support tickets from platforms like Zendesk",{"type":17,"tag":7266,"props":24548,"children":24549},{},[24550],{"type":23,"value":24551},"ticket",{"type":17,"tag":7239,"props":24553,"children":24554},{},[24555,24560,24565],{"type":17,"tag":7266,"props":24556,"children":24557},{},[24558],{"type":23,"value":24559},"Messaging",{"type":17,"tag":7266,"props":24561,"children":24562},{},[24563],{"type":23,"value":24564},"Conversations from platforms like Slack",{"type":17,"tag":7266,"props":24566,"children":24567},{},[24568],{"type":23,"value":24569},"message, channel",{"type":17,"tag":7239,"props":24571,"children":24572},{},[24573,24578,24583],{"type":17,"tag":7266,"props":24574,"children":24575},{},[24576],{"type":23,"value":24577},"Knowledge Management",{"type":17,"tag":7266,"props":24579,"children":24580},{},[24581],{"type":23,"value":24582},"Documentation from platforms like Notion",{"type":17,"tag":7266,"props":24584,"children":24585},{},[24586],{"type":23,"value":24587},"page, comment",{"type":17,"tag":7239,"props":24589,"children":24590},{},[24591,24596,24601],{"type":17,"tag":7266,"props":24592,"children":24593},{},[24594],{"type":23,"value":24595},"GenAI",{"type":17,"tag":7266,"props":24597,"children":24598},{},[24599],{"type":23,"value":24600},"Model interaction and response generation",{"type":17,"tag":7266,"props":24602,"children":24603},{},[24604],{"type":23,"value":24605},"genai_prompt, genai_model",{"type":17,"tag":29,"props":24607,"children":24608},{},[24609],{"type":23,"value":24610},"These categories allow your product to retrieve support data across multiple sources.",{"type":17,"tag":68,"props":24612,"children":24614},{"id":24613},"unified-objects-and-key-fields",[24615],{"type":23,"value":24616},"Unified Objects and Key Fields",{"type":17,"tag":239,"props":24618,"children":24620},{"id":24619},"ticketing-objects",[24621],{"type":23,"value":24622},"Ticketing Objects",{"type":17,"tag":29,"props":24624,"children":24625},{},[24626,24627,24631],{"type":23,"value":6712},{"type":17,"tag":48,"props":24628,"children":24629},{},[24630],{"type":23,"value":24551},{"type":23,"value":24632}," object represents a support request.",{"type":17,"tag":29,"props":24634,"children":24635},{},[24636],{"type":23,"value":24637},"Important fields include:",{"type":17,"tag":7231,"props":24639,"children":24640},{},[24641,24656],{"type":17,"tag":7235,"props":24642,"children":24643},{},[24644],{"type":17,"tag":7239,"props":24645,"children":24646},{},[24647,24652],{"type":17,"tag":7243,"props":24648,"children":24649},{},[24650],{"type":23,"value":24651},"Field",{"type":17,"tag":7243,"props":24653,"children":24654},{},[24655],{"type":23,"value":20787},{"type":17,"tag":7259,"props":24657,"children":24658},{},[24659,24672,24685,24697,24710,24723,24736],{"type":17,"tag":7239,"props":24660,"children":24661},{},[24662,24667],{"type":17,"tag":7266,"props":24663,"children":24664},{},[24665],{"type":23,"value":24666},"subject",{"type":17,"tag":7266,"props":24668,"children":24669},{},[24670],{"type":23,"value":24671},"Summary of the issue",{"type":17,"tag":7239,"props":24673,"children":24674},{},[24675,24680],{"type":17,"tag":7266,"props":24676,"children":24677},{},[24678],{"type":23,"value":24679},"description",{"type":17,"tag":7266,"props":24681,"children":24682},{},[24683],{"type":23,"value":24684},"Full ticket content",{"type":17,"tag":7239,"props":24686,"children":24687},{},[24688,24692],{"type":17,"tag":7266,"props":24689,"children":24690},{},[24691],{"type":23,"value":19949},{"type":17,"tag":7266,"props":24693,"children":24694},{},[24695],{"type":23,"value":24696},"Current state of the ticket",{"type":17,"tag":7239,"props":24698,"children":24699},{},[24700,24705],{"type":17,"tag":7266,"props":24701,"children":24702},{},[24703],{"type":23,"value":24704},"priority",{"type":17,"tag":7266,"props":24706,"children":24707},{},[24708],{"type":23,"value":24709},"Urgency level",{"type":17,"tag":7239,"props":24711,"children":24712},{},[24713,24718],{"type":17,"tag":7266,"props":24714,"children":24715},{},[24716],{"type":23,"value":24717},"requester",{"type":17,"tag":7266,"props":24719,"children":24720},{},[24721],{"type":23,"value":24722},"Customer who submitted the ticket",{"type":17,"tag":7239,"props":24724,"children":24725},{},[24726,24731],{"type":17,"tag":7266,"props":24727,"children":24728},{},[24729],{"type":23,"value":24730},"assignee",{"type":17,"tag":7266,"props":24732,"children":24733},{},[24734],{"type":23,"value":24735},"Agent handling the ticket",{"type":17,"tag":7239,"props":24737,"children":24738},{},[24739,24744],{"type":17,"tag":7266,"props":24740,"children":24741},{},[24742],{"type":23,"value":24743},"created_at / updated_at",{"type":17,"tag":7266,"props":24745,"children":24746},{},[24747],{"type":23,"value":24748},"Ticket timestamps",{"type":17,"tag":29,"props":24750,"children":24751},{},[24752],{"type":23,"value":24753},"These fields allow the copilot to understand the issue and its status.",{"type":17,"tag":239,"props":24755,"children":24757},{"id":24756},"messaging-objects",[24758],{"type":23,"value":24759},"Messaging Objects",{"type":17,"tag":29,"props":24761,"children":24762},{},[24763],{"type":23,"value":24764},"Messaging data provides additional context.",{"type":17,"tag":7231,"props":24766,"children":24767},{},[24768,24786],{"type":17,"tag":7235,"props":24769,"children":24770},{},[24771],{"type":17,"tag":7239,"props":24772,"children":24773},{},[24774,24778,24782],{"type":17,"tag":7243,"props":24775,"children":24776},{},[24777],{"type":23,"value":18594},{"type":17,"tag":7243,"props":24779,"children":24780},{},[24781],{"type":23,"value":22096},{"type":17,"tag":7243,"props":24783,"children":24784},{},[24785],{"type":23,"value":20787},{"type":17,"tag":7259,"props":24787,"children":24788},{},[24789,24806],{"type":17,"tag":7239,"props":24790,"children":24791},{},[24792,24796,24801],{"type":17,"tag":7266,"props":24793,"children":24794},{},[24795],{"type":23,"value":15800},{"type":17,"tag":7266,"props":24797,"children":24798},{},[24799],{"type":23,"value":24800},"message, author_member, created_at",{"type":17,"tag":7266,"props":24802,"children":24803},{},[24804],{"type":23,"value":24805},"Conversation content",{"type":17,"tag":7239,"props":24807,"children":24808},{},[24809,24813,24818],{"type":17,"tag":7266,"props":24810,"children":24811},{},[24812],{"type":23,"value":15787},{"type":17,"tag":7266,"props":24814,"children":24815},{},[24816],{"type":23,"value":24817},"id, name, members",{"type":17,"tag":7266,"props":24819,"children":24820},{},[24821],{"type":23,"value":24822},"Context for discussions",{"type":17,"tag":29,"props":24824,"children":24825},{},[24826],{"type":23,"value":24827},"Messages include:",{"type":17,"tag":80,"props":24829,"children":24830},{},[24831,24843,24862,24874],{"type":17,"tag":84,"props":24832,"children":24833},{},[24834,24836,24842],{"type":23,"value":24835},"sender (",{"type":17,"tag":6121,"props":24837,"children":24839},{"className":24838},[],[24840],{"type":23,"value":24841},"author_member",{"type":23,"value":12034},{"type":17,"tag":84,"props":24844,"children":24845},{},[24846,24848,24854,24855,24861],{"type":23,"value":24847},"recipients (",{"type":17,"tag":6121,"props":24849,"children":24851},{"className":24850},[],[24852],{"type":23,"value":24853},"destination_members",{"type":23,"value":11826},{"type":17,"tag":6121,"props":24856,"children":24858},{"className":24857},[],[24859],{"type":23,"value":24860},"mentioned_members",{"type":23,"value":12034},{"type":17,"tag":84,"props":24863,"children":24864},{},[24865,24867,24873],{"type":23,"value":24866},"message content (",{"type":17,"tag":6121,"props":24868,"children":24870},{"className":24869},[],[24871],{"type":23,"value":24872},"message",{"type":23,"value":12034},{"type":17,"tag":84,"props":24875,"children":24876},{},[24877,24879,24884],{"type":23,"value":24878},"thread structure (",{"type":17,"tag":6121,"props":24880,"children":24882},{"className":24881},[],[24883],{"type":23,"value":15863},{"type":23,"value":12034},{"type":17,"tag":29,"props":24886,"children":24887},{},[24888],{"type":23,"value":24889},"This allows the copilot to analyze internal discussions.",{"type":17,"tag":239,"props":24891,"children":24893},{"id":24892},"knowledge-management-objects",[24894],{"type":23,"value":24895},"Knowledge Management Objects",{"type":17,"tag":29,"props":24897,"children":24898},{},[24899],{"type":23,"value":24900},"Knowledge bases provide structured answers.",{"type":17,"tag":7231,"props":24902,"children":24903},{},[24904,24922],{"type":17,"tag":7235,"props":24905,"children":24906},{},[24907],{"type":17,"tag":7239,"props":24908,"children":24909},{},[24910,24914,24918],{"type":17,"tag":7243,"props":24911,"children":24912},{},[24913],{"type":23,"value":18594},{"type":17,"tag":7243,"props":24915,"children":24916},{},[24917],{"type":23,"value":22096},{"type":17,"tag":7243,"props":24919,"children":24920},{},[24921],{"type":23,"value":20787},{"type":17,"tag":7259,"props":24923,"children":24924},{},[24925,24943],{"type":17,"tag":7239,"props":24926,"children":24927},{},[24928,24933,24938],{"type":17,"tag":7266,"props":24929,"children":24930},{},[24931],{"type":23,"value":24932},"Page",{"type":17,"tag":7266,"props":24934,"children":24935},{},[24936],{"type":23,"value":24937},"title, download_url, updated_at",{"type":17,"tag":7266,"props":24939,"children":24940},{},[24941],{"type":23,"value":24942},"Knowledge articles",{"type":17,"tag":7239,"props":24944,"children":24945},{},[24946,24950,24955],{"type":17,"tag":7266,"props":24947,"children":24948},{},[24949],{"type":23,"value":13370},{"type":17,"tag":7266,"props":24951,"children":24952},{},[24953],{"type":23,"value":24954},"content, created_at",{"type":17,"tag":7266,"props":24956,"children":24957},{},[24958],{"type":23,"value":24959},"Discussion context",{"type":17,"tag":29,"props":24961,"children":24962},{},[24963],{"type":23,"value":24964},"Important behaviors:",{"type":17,"tag":80,"props":24966,"children":24967},{},[24968,24979,24984],{"type":17,"tag":84,"props":24969,"children":24970},{},[24971,24973],{"type":23,"value":24972},"page content is retrieved using ",{"type":17,"tag":6121,"props":24974,"children":24976},{"className":24975},[],[24977],{"type":23,"value":24978},"download_url",{"type":17,"tag":84,"props":24980,"children":24981},{},[24982],{"type":23,"value":24983},"comments include inline text",{"type":17,"tag":84,"props":24985,"children":24986},{},[24987],{"type":23,"value":24988},"timestamps indicate freshness",{"type":17,"tag":29,"props":24990,"children":24991},{},[24992],{"type":23,"value":24993},"These objects allow the copilot to retrieve relevant documentation.",{"type":17,"tag":68,"props":24995,"children":24997},{"id":24996},"connecting-customer-data-sources",[24998],{"type":23,"value":24999},"Connecting Customer Data Sources",{"type":17,"tag":29,"props":25001,"children":25002},{},[25003],{"type":23,"value":25004},"Customers connect their tools using Unified Connect.",{"type":17,"tag":29,"props":25006,"children":25007},{},[25008],{"type":23,"value":25009},"Typical flow:",{"type":17,"tag":6154,"props":25011,"children":25012},{},[25013,25018,25023,25028],{"type":17,"tag":84,"props":25014,"children":25015},{},[25016],{"type":23,"value":25017},"Your application launches the authorization flow.",{"type":17,"tag":84,"props":25019,"children":25020},{},[25021],{"type":23,"value":25022},"The user selects integrations such as Zendesk, Slack, or Notion.",{"type":17,"tag":84,"props":25024,"children":25025},{},[25026],{"type":23,"value":25027},"The user authorizes access.",{"type":17,"tag":84,"props":25029,"children":25030},{},[25031,25033,25038],{"type":23,"value":25032},"Unified returns a ",{"type":17,"tag":48,"props":25034,"children":25035},{},[25036],{"type":23,"value":25037},"connection_id",{"type":23,"value":54},{"type":17,"tag":29,"props":25040,"children":25041},{},[25042],{"type":23,"value":25043},"Your application stores:",{"type":17,"tag":6893,"props":25045,"children":25048},{"className":25046,"code":25047,"language":20901,"meta":23},[20899],"user_id → connection_id\n",[25049],{"type":17,"tag":6121,"props":25050,"children":25051},{"__ignoreMap":7},[25052],{"type":23,"value":25047},{"type":17,"tag":29,"props":25054,"children":25055},{},[25056],{"type":23,"value":25057},"All API requests reference this identifier.",{"type":17,"tag":68,"props":25059,"children":25061},{"id":25060},"retrieving-support-data",[25062],{"type":23,"value":25063},"Retrieving Support Data",{"type":17,"tag":29,"props":25065,"children":25066},{},[25067],{"type":23,"value":25068},"Your application retrieves data across categories using Unified endpoints.",{"type":17,"tag":29,"props":25070,"children":25071},{},[25072],{"type":23,"value":25073},"Ticketing:",{"type":17,"tag":6893,"props":25075,"children":25078},{"className":25076,"code":25077,"language":20901,"meta":23},[20899],"GET /ticketing/{connection_id}/ticket\n",[25079],{"type":17,"tag":6121,"props":25080,"children":25081},{"__ignoreMap":7},[25082],{"type":23,"value":25077},{"type":17,"tag":29,"props":25084,"children":25085},{},[25086],{"type":23,"value":25087},"Messaging:",{"type":17,"tag":6893,"props":25089,"children":25092},{"className":25090,"code":25091,"language":20901,"meta":23},[20899],"GET /messaging/{connection_id}/message\nGET /messaging/{connection_id}/channel\n",[25093],{"type":17,"tag":6121,"props":25094,"children":25095},{"__ignoreMap":7},[25096],{"type":23,"value":25091},{"type":17,"tag":29,"props":25098,"children":25099},{},[25100],{"type":23,"value":25101},"Knowledge management:",{"type":17,"tag":6893,"props":25103,"children":25106},{"className":25104,"code":25105,"language":20901,"meta":23},[20899],"GET /kms/{connection_id}/page\nGET /kms/{connection_id}/comment\n",[25107],{"type":17,"tag":6121,"props":25108,"children":25109},{"__ignoreMap":7},[25110],{"type":23,"value":25105},{"type":17,"tag":29,"props":25112,"children":25113},{},[25114,25116,25121],{"type":23,"value":25115},"For documentation, content is retrieved using ",{"type":17,"tag":6121,"props":25117,"children":25119},{"className":25118},[],[25120],{"type":23,"value":24978},{"type":23,"value":54},{"type":17,"tag":68,"props":25123,"children":25125},{"id":25124},"building-an-ai-support-pipeline",[25126],{"type":23,"value":25127},"Building an AI Support Pipeline",{"type":17,"tag":29,"props":25129,"children":25130},{},[25131],{"type":23,"value":25132},"AI support copilots typically use a retrieval-based architecture.",{"type":17,"tag":29,"props":25134,"children":25135},{},[25136],{"type":23,"value":25137},"A common implementation includes:",{"type":17,"tag":29,"props":25139,"children":25140},{},[25141],{"type":17,"tag":48,"props":25142,"children":25143},{},[25144],{"type":23,"value":25145},"1. Retrieve data",{"type":17,"tag":29,"props":25147,"children":25148},{},[25149],{"type":23,"value":25150},"Fetch tickets, messages, and documents.",{"type":17,"tag":29,"props":25152,"children":25153},{},[25154],{"type":17,"tag":48,"props":25155,"children":25156},{},[25157],{"type":23,"value":25158},"2. Extract content",{"type":17,"tag":29,"props":25160,"children":25161},{},[25162],{"type":23,"value":25163},"Pull text from ticket descriptions, messages, and documents.",{"type":17,"tag":29,"props":25165,"children":25166},{},[25167],{"type":17,"tag":48,"props":25168,"children":25169},{},[25170],{"type":23,"value":25171},"3. Chunk content",{"type":17,"tag":29,"props":25173,"children":25174},{},[25175],{"type":23,"value":25176},"Split large content into smaller segments.",{"type":17,"tag":29,"props":25178,"children":25179},{},[25180],{"type":17,"tag":48,"props":25181,"children":25182},{},[25183],{"type":23,"value":25184},"4. Generate embeddings",{"type":17,"tag":29,"props":25186,"children":25187},{},[25188],{"type":23,"value":25189},"Convert text into vector representations.",{"type":17,"tag":29,"props":25191,"children":25192},{},[25193],{"type":17,"tag":48,"props":25194,"children":25195},{},[25196],{"type":23,"value":25197},"5. Store vectors",{"type":17,"tag":29,"props":25199,"children":25200},{},[25201],{"type":23,"value":25202},"Save embeddings in a vector database.",{"type":17,"tag":29,"props":25204,"children":25205},{},[25206],{"type":17,"tag":48,"props":25207,"children":25208},{},[25209],{"type":23,"value":25210},"6. Retrieve context",{"type":17,"tag":29,"props":25212,"children":25213},{},[25214],{"type":23,"value":25215},"Search for relevant content when a user asks a question.",{"type":17,"tag":29,"props":25217,"children":25218},{},[25219],{"type":17,"tag":48,"props":25220,"children":25221},{},[25222],{"type":23,"value":25223},"7. Generate response",{"type":17,"tag":29,"props":25225,"children":25226},{},[25227],{"type":23,"value":25228},"Use a language model to produce an answer.",{"type":17,"tag":29,"props":25230,"children":25231},{},[25232],{"type":23,"value":25233},"This approach ensures responses are grounded in real support data.",{"type":17,"tag":68,"props":25235,"children":25237},{"id":25236},"generating-ai-responses",[25238],{"type":23,"value":25239},"Generating AI Responses",{"type":17,"tag":29,"props":25241,"children":25242},{},[25243,25245,25250],{"type":23,"value":25244},"Unified's ",{"type":17,"tag":133,"props":25246,"children":25247},{"href":16186},[25248],{"type":23,"value":25249},"GenAI API",{"type":23,"value":25251}," standardizes interaction with language models.",{"type":17,"tag":29,"props":25253,"children":25254},{},[25255],{"type":23,"value":25256},"Example request:",{"type":17,"tag":6893,"props":25258,"children":25261},{"className":25259,"code":25260,"language":20901,"meta":23},[20899],"{\n  \"messages\": [\n    { \"role\": \"system\", \"content\": \"You are a support assistant.\" },\n    { \"role\": \"user\", \"content\": \"Summarize this ticket and suggest a response.\" }\n  ]\n}\n",[25262],{"type":17,"tag":6121,"props":25263,"children":25264},{"__ignoreMap":7},[25265],{"type":23,"value":25260},{"type":17,"tag":29,"props":25267,"children":25268},{},[25269],{"type":23,"value":19936},{"type":17,"tag":80,"props":25271,"children":25272},{},[25273,25278,25283],{"type":17,"tag":84,"props":25274,"children":25275},{},[25276],{"type":23,"value":25277},"generated text",{"type":17,"tag":84,"props":25279,"children":25280},{},[25281],{"type":23,"value":25282},"token usage",{"type":17,"tag":84,"props":25284,"children":25285},{},[25286],{"type":23,"value":25287},"model output",{"type":17,"tag":29,"props":25289,"children":25290},{},[25291],{"type":23,"value":25292},"This allows your product to generate summaries and suggested replies.",{"type":17,"tag":68,"props":25294,"children":25296},{"id":25295},"keeping-support-data-updated",[25297],{"type":23,"value":25298},"Keeping Support Data Updated",{"type":17,"tag":29,"props":25300,"children":25301},{},[25302],{"type":23,"value":25303},"Support data changes frequently.",{"type":17,"tag":29,"props":25305,"children":25306},{},[25307],{"type":23,"value":25308},"Unified supports updates across categories:",{"type":17,"tag":80,"props":25310,"children":25311},{},[25312,25317,25322],{"type":17,"tag":84,"props":25313,"children":25314},{},[25315],{"type":23,"value":25316},"ticket updates",{"type":17,"tag":84,"props":25318,"children":25319},{},[25320],{"type":23,"value":25321},"new messages",{"type":17,"tag":84,"props":25323,"children":25324},{},[25325],{"type":23,"value":25326},"document changes",{"type":17,"tag":29,"props":25328,"children":25329},{},[25330,25332,25338],{"type":23,"value":25331},"Applications can use webhook events or timestamp fields such as ",{"type":17,"tag":6121,"props":25333,"children":25335},{"className":25334},[],[25336],{"type":23,"value":25337},"updated_at",{"type":23,"value":25339}," to trigger reprocessing and keep the AI context current.",{"type":17,"tag":68,"props":25341,"children":25343},{"id":25342},"supported-platforms",[25344],{"type":23,"value":25345},"Supported Platforms",{"type":17,"tag":29,"props":25347,"children":25348},{},[25349],{"type":23,"value":25350},"Unified supports a wide range of integrations.",{"type":17,"tag":29,"props":25352,"children":25353},{},[25354],{"type":23,"value":24364},{"type":17,"tag":29,"props":25356,"children":25357},{},[25358],{"type":23,"value":25073},{"type":17,"tag":80,"props":25360,"children":25361},{},[25362,25366,25371],{"type":17,"tag":84,"props":25363,"children":25364},{},[25365],{"type":23,"value":15738},{"type":17,"tag":84,"props":25367,"children":25368},{},[25369],{"type":23,"value":25370},"Jira Service Management",{"type":17,"tag":84,"props":25372,"children":25373},{},[25374],{"type":23,"value":25375},"Freshdesk",{"type":17,"tag":29,"props":25377,"children":25378},{},[25379],{"type":23,"value":25087},{"type":17,"tag":80,"props":25381,"children":25382},{},[25383,25387,25391],{"type":17,"tag":84,"props":25384,"children":25385},{},[25386],{"type":23,"value":3204},{"type":17,"tag":84,"props":25388,"children":25389},{},[25390],{"type":23,"value":14878},{"type":17,"tag":84,"props":25392,"children":25393},{},[25394],{"type":23,"value":14066},{"type":17,"tag":29,"props":25396,"children":25397},{},[25398],{"type":23,"value":25101},{"type":17,"tag":80,"props":25400,"children":25401},{},[25402,25406,25410],{"type":17,"tag":84,"props":25403,"children":25404},{},[25405],{"type":23,"value":23053},{"type":17,"tag":84,"props":25407,"children":25408},{},[25409],{"type":23,"value":23725},{"type":17,"tag":84,"props":25411,"children":25412},{},[25413],{"type":23,"value":23061},{"type":17,"tag":29,"props":25415,"children":25416},{},[25417],{"type":23,"value":25418},"This allows AI support copilots to operate across many customer environments.",{"type":17,"tag":68,"props":25420,"children":25421},{"id":883},[25422],{"type":23,"value":19178},{"type":17,"tag":29,"props":25424,"children":25425},{},[25426],{"type":23,"value":25427},"AI support copilots require access to multiple sources of customer data.",{"type":17,"tag":29,"props":25429,"children":25430},{},[25431],{"type":23,"value":25432},"Without unified integration infrastructure, developers must build and maintain separate integrations for ticketing, messaging, and documentation platforms.",{"type":17,"tag":29,"props":25434,"children":25435},{},[25436],{"type":23,"value":25437},"Unified provides:",{"type":17,"tag":80,"props":25439,"children":25440},{},[25441,25446,25451,25456],{"type":17,"tag":84,"props":25442,"children":25443},{},[25444],{"type":23,"value":25445},"consistent objects across categories",{"type":17,"tag":84,"props":25447,"children":25448},{},[25449],{"type":23,"value":25450},"real-time access to data",{"type":17,"tag":84,"props":25452,"children":25453},{},[25454],{"type":23,"value":25455},"unified authentication",{"type":17,"tag":84,"props":25457,"children":25458},{},[25459],{"type":23,"value":25460},"simplified data retrieval",{"type":17,"tag":29,"props":25462,"children":25463},{},[25464],{"type":23,"value":25465},"This allows product teams to build AI support features that help agents respond faster and resolve issues more effectively.",{"type":17,"tag":29,"props":25467,"children":25468},{},[25469],{"type":23,"value":25470},"Start building AI support copilots across Zendesk, Slack, Notion, and many other platforms today.",{"type":17,"tag":29,"props":25472,"children":25473},{},[25474,25475],{"type":23,"value":1609},{"type":17,"tag":133,"props":25476,"children":25478},{"href":1612,"rel":25477},[214],[25479],{"type":23,"value":1616},{"type":17,"tag":29,"props":25481,"children":25482},{},[25483,25484],{"type":23,"value":1609},{"type":17,"tag":133,"props":25485,"children":25487},{"href":1623,"rel":25486},[214],[25488],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":25490},[25491,25492,25493,25494,25499,25500,25501,25502,25503,25504,25505],{"id":24351,"depth":1629,"text":24354},{"id":24423,"depth":1629,"text":24426},{"id":24499,"depth":1629,"text":24502},{"id":24613,"depth":1629,"text":24616,"children":25495},[25496,25497,25498],{"id":24619,"depth":1635,"text":24622},{"id":24756,"depth":1635,"text":24759},{"id":24892,"depth":1635,"text":24895},{"id":24996,"depth":1629,"text":24999},{"id":25060,"depth":1629,"text":25063},{"id":25124,"depth":1629,"text":25127},{"id":25236,"depth":1629,"text":25239},{"id":25295,"depth":1629,"text":25298},{"id":25342,"depth":1629,"text":25345},{"id":883,"depth":1629,"text":19178},"content:blog:how_to_build_ai_customer_support_copilots_using_zendesk_slack_and_notion.md","blog/how_to_build_ai_customer_support_copilots_using_zendesk_slack_and_notion.md","blog/how_to_build_ai_customer_support_copilots_using_zendesk_slack_and_notion",{"_path":25510,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":25511,"description":25512,"img":25513,"date":24316,"tag":12,"body":25514,"_type":1677,"_id":26647,"_source":1679,"_file":26648,"_stem":26649,"_extension":1682},"/blog/how_to_build_ai_sales_forecasting_using_crm_and_billing_data","How to Build AI Sales Forecasting Using CRM and Billing Data","AI sales forecasting is a feature inside a SaaS product that predicts future revenue using CRM pipeline data and billing signals. It combines deal activity...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_ai_sales_forecasting_using_crm_and_billing_data-icon.png",{"type":14,"children":25515,"toc":26630},[25516,25521,25524,25531,25536,25541,25546,25552,25557,25561,25588,25592,25610,25615,25621,25626,25634,25639,25647,25652,25660,25665,25673,25678,25686,25691,25695,25700,25759,25764,25768,25774,25779,25874,25879,25926,25931,25937,25942,26002,26007,26068,26073,26079,26084,26092,26101,26106,26114,26123,26128,26136,26145,26150,26157,26166,26171,26176,26180,26185,26190,26215,26219,26227,26231,26237,26242,26247,26256,26261,26270,26275,26280,26305,26311,26316,26323,26328,26336,26341,26349,26354,26362,26367,26375,26380,26388,26393,26398,26404,26409,26414,26423,26428,26446,26451,26457,26462,26466,26489,26501,26505,26510,26515,26536,26541,26558,26563,26567,26572,26577,26581,26602,26607,26612,26621],{"type":17,"tag":18,"props":25517,"children":25519},{"id":25518},"how-to-build-ai-sales-forecasting-using-crm-and-billing-data",[25520],{"type":23,"value":25511},{"type":17,"tag":25,"props":25522,"children":25523},{},[],{"type":17,"tag":29,"props":25525,"children":25526},{},[25527],{"type":17,"tag":33,"props":25528,"children":25529},{},[25530],{"type":23,"value":19372},{"type":17,"tag":29,"props":25532,"children":25533},{},[25534],{"type":23,"value":25535},"AI sales forecasting is a feature inside a SaaS product that predicts future revenue using CRM pipeline data and billing signals. It combines deal activity from systems like Salesforce or HubSpot with subscription and payment data from platforms like Stripe to produce more accurate forecasts.",{"type":17,"tag":29,"props":25537,"children":25538},{},[25539],{"type":23,"value":25540},"To build this, your product needs access to both pipeline data and revenue data. CRM systems track deals and their progression, while billing platforms track subscriptions and payments. Each system has different APIs and schemas.",{"type":17,"tag":29,"props":25542,"children":25543},{},[25544],{"type":23,"value":25545},"Unified provides category-specific APIs for CRM and Payments, allowing your product to retrieve pipeline and billing data through consistent objects. This makes it possible to build forecasting features without maintaining separate integrations for each provider.",{"type":17,"tag":68,"props":25547,"children":25549},{"id":25548},"why-saas-products-build-ai-sales-forecasting-features",[25550],{"type":23,"value":25551},"Why SaaS Products Build AI Sales Forecasting Features",{"type":17,"tag":29,"props":25553,"children":25554},{},[25555],{"type":23,"value":25556},"Many B2B SaaS products include forecasting capabilities for their customers.",{"type":17,"tag":29,"props":25558,"children":25559},{},[25560],{"type":23,"value":24364},{"type":17,"tag":80,"props":25562,"children":25563},{},[25564,25569,25574,25579,25583],{"type":17,"tag":84,"props":25565,"children":25566},{},[25567],{"type":23,"value":25568},"Revenue intelligence platforms",{"type":17,"tag":84,"props":25570,"children":25571},{},[25572],{"type":23,"value":25573},"Sales analytics tools",{"type":17,"tag":84,"props":25575,"children":25576},{},[25577],{"type":23,"value":25578},"RevOps dashboards",{"type":17,"tag":84,"props":25580,"children":25581},{},[25582],{"type":23,"value":24382},{"type":17,"tag":84,"props":25584,"children":25585},{},[25586],{"type":23,"value":25587},"AI sales assistants",{"type":17,"tag":29,"props":25589,"children":25590},{},[25591],{"type":23,"value":24397},{"type":17,"tag":80,"props":25593,"children":25594},{},[25595,25600,25605],{"type":17,"tag":84,"props":25596,"children":25597},{},[25598],{"type":23,"value":25599},"'What revenue will close this quarter?'",{"type":17,"tag":84,"props":25601,"children":25602},{},[25603],{"type":23,"value":25604},"'Which deals are most likely to close?'",{"type":17,"tag":84,"props":25606,"children":25607},{},[25608],{"type":23,"value":25609},"'How does pipeline compare to actual revenue?'",{"type":17,"tag":29,"props":25611,"children":25612},{},[25613],{"type":23,"value":25614},"Without combining CRM and billing data, forecasts are incomplete or inaccurate.",{"type":17,"tag":68,"props":25616,"children":25618},{"id":25617},"common-ai-sales-forecasting-use-cases",[25619],{"type":23,"value":25620},"Common AI Sales Forecasting Use Cases",{"type":17,"tag":29,"props":25622,"children":25623},{},[25624],{"type":23,"value":25625},"AI forecasting features typically support several workflows.",{"type":17,"tag":29,"props":25627,"children":25628},{},[25629],{"type":17,"tag":48,"props":25630,"children":25631},{},[25632],{"type":23,"value":25633},"Revenue prediction",{"type":17,"tag":29,"props":25635,"children":25636},{},[25637],{"type":23,"value":25638},"Estimate future revenue based on pipeline and historical performance.",{"type":17,"tag":29,"props":25640,"children":25641},{},[25642],{"type":17,"tag":48,"props":25643,"children":25644},{},[25645],{"type":23,"value":25646},"Deal forecasting",{"type":17,"tag":29,"props":25648,"children":25649},{},[25650],{"type":23,"value":25651},"Predict the likelihood of deals closing.",{"type":17,"tag":29,"props":25653,"children":25654},{},[25655],{"type":17,"tag":48,"props":25656,"children":25657},{},[25658],{"type":23,"value":25659},"Pipeline analytics",{"type":17,"tag":29,"props":25661,"children":25662},{},[25663],{"type":23,"value":25664},"Analyze deal stages, velocity, and conversion rates.",{"type":17,"tag":29,"props":25666,"children":25667},{},[25668],{"type":17,"tag":48,"props":25669,"children":25670},{},[25671],{"type":23,"value":25672},"Forecast vs actual comparison",{"type":17,"tag":29,"props":25674,"children":25675},{},[25676],{"type":23,"value":25677},"Compare expected revenue with billing data.",{"type":17,"tag":29,"props":25679,"children":25680},{},[25681],{"type":17,"tag":48,"props":25682,"children":25683},{},[25684],{"type":23,"value":25685},"Risk detection",{"type":17,"tag":29,"props":25687,"children":25688},{},[25689],{"type":23,"value":25690},"Identify deals or accounts that may not close.",{"type":17,"tag":68,"props":25692,"children":25693},{"id":24499},[25694],{"type":23,"value":24502},{"type":17,"tag":29,"props":25696,"children":25697},{},[25698],{"type":23,"value":25699},"AI sales forecasting combines data from two categories.",{"type":17,"tag":7231,"props":25701,"children":25702},{},[25703,25721],{"type":17,"tag":7235,"props":25704,"children":25705},{},[25706],{"type":17,"tag":7239,"props":25707,"children":25708},{},[25709,25713,25717],{"type":17,"tag":7243,"props":25710,"children":25711},{},[25712],{"type":23,"value":7247},{"type":17,"tag":7243,"props":25714,"children":25715},{},[25716],{"type":23,"value":24525},{"type":17,"tag":7243,"props":25718,"children":25719},{},[25720],{"type":23,"value":24530},{"type":17,"tag":7259,"props":25722,"children":25723},{},[25724,25742],{"type":17,"tag":7239,"props":25725,"children":25726},{},[25727,25732,25737],{"type":17,"tag":7266,"props":25728,"children":25729},{},[25730],{"type":23,"value":25731},"CRM",{"type":17,"tag":7266,"props":25733,"children":25734},{},[25735],{"type":23,"value":25736},"Pipeline and account data from platforms like Salesforce and HubSpot",{"type":17,"tag":7266,"props":25738,"children":25739},{},[25740],{"type":23,"value":25741},"contact, company, deal, event",{"type":17,"tag":7239,"props":25743,"children":25744},{},[25745,25749,25754],{"type":17,"tag":7266,"props":25746,"children":25747},{},[25748],{"type":23,"value":11737},{"type":17,"tag":7266,"props":25750,"children":25751},{},[25752],{"type":23,"value":25753},"Subscription and transaction data from platforms like Stripe",{"type":17,"tag":7266,"props":25755,"children":25756},{},[25757],{"type":23,"value":25758},"payment, subscription",{"type":17,"tag":29,"props":25760,"children":25761},{},[25762],{"type":23,"value":25763},"These categories provide the inputs needed for forecasting.",{"type":17,"tag":68,"props":25765,"children":25766},{"id":24613},[25767],{"type":23,"value":24616},{"type":17,"tag":239,"props":25769,"children":25771},{"id":25770},"crm-objects",[25772],{"type":23,"value":25773},"CRM Objects",{"type":17,"tag":29,"props":25775,"children":25776},{},[25777],{"type":23,"value":25778},"CRM data provides pipeline and deal context.",{"type":17,"tag":7231,"props":25780,"children":25781},{},[25782,25800],{"type":17,"tag":7235,"props":25783,"children":25784},{},[25785],{"type":17,"tag":7239,"props":25786,"children":25787},{},[25788,25792,25796],{"type":17,"tag":7243,"props":25789,"children":25790},{},[25791],{"type":23,"value":18594},{"type":17,"tag":7243,"props":25793,"children":25794},{},[25795],{"type":23,"value":22096},{"type":17,"tag":7243,"props":25797,"children":25798},{},[25799],{"type":23,"value":20787},{"type":17,"tag":7259,"props":25801,"children":25802},{},[25803,25821,25839,25857],{"type":17,"tag":7239,"props":25804,"children":25805},{},[25806,25811,25816],{"type":17,"tag":7266,"props":25807,"children":25808},{},[25809],{"type":23,"value":25810},"Deal",{"type":17,"tag":7266,"props":25812,"children":25813},{},[25814],{"type":23,"value":25815},"amount, probability, stage_id, closing_at",{"type":17,"tag":7266,"props":25817,"children":25818},{},[25819],{"type":23,"value":25820},"Forecast pipeline revenue",{"type":17,"tag":7239,"props":25822,"children":25823},{},[25824,25829,25834],{"type":17,"tag":7266,"props":25825,"children":25826},{},[25827],{"type":23,"value":25828},"Contact",{"type":17,"tag":7266,"props":25830,"children":25831},{},[25832],{"type":23,"value":25833},"name, emails",{"type":17,"tag":7266,"props":25835,"children":25836},{},[25837],{"type":23,"value":25838},"Customer identity",{"type":17,"tag":7239,"props":25840,"children":25841},{},[25842,25847,25852],{"type":17,"tag":7266,"props":25843,"children":25844},{},[25845],{"type":23,"value":25846},"Company",{"type":17,"tag":7266,"props":25848,"children":25849},{},[25850],{"type":23,"value":25851},"name, domains",{"type":17,"tag":7266,"props":25853,"children":25854},{},[25855],{"type":23,"value":25856},"Account grouping",{"type":17,"tag":7239,"props":25858,"children":25859},{},[25860,25864,25869],{"type":17,"tag":7266,"props":25861,"children":25862},{},[25863],{"type":23,"value":14528},{"type":17,"tag":7266,"props":25865,"children":25866},{},[25867],{"type":23,"value":25868},"type, created_at",{"type":17,"tag":7266,"props":25870,"children":25871},{},[25872],{"type":23,"value":25873},"Activity history",{"type":17,"tag":29,"props":25875,"children":25876},{},[25877],{"type":23,"value":25878},"Important fields for forecasting:",{"type":17,"tag":80,"props":25880,"children":25881},{},[25882,25893,25904,25915],{"type":17,"tag":84,"props":25883,"children":25884},{},[25885,25891],{"type":17,"tag":6121,"props":25886,"children":25888},{"className":25887},[],[25889],{"type":23,"value":25890},"amount",{"type":23,"value":25892}," – deal value",{"type":17,"tag":84,"props":25894,"children":25895},{},[25896,25902],{"type":17,"tag":6121,"props":25897,"children":25899},{"className":25898},[],[25900],{"type":23,"value":25901},"probability",{"type":23,"value":25903}," – likelihood of closing",{"type":17,"tag":84,"props":25905,"children":25906},{},[25907,25913],{"type":17,"tag":6121,"props":25908,"children":25910},{"className":25909},[],[25911],{"type":23,"value":25912},"closing_at",{"type":23,"value":25914}," – expected close date",{"type":17,"tag":84,"props":25916,"children":25917},{},[25918,25924],{"type":17,"tag":6121,"props":25919,"children":25921},{"className":25920},[],[25922],{"type":23,"value":25923},"stage_id",{"type":23,"value":25925}," – pipeline stage",{"type":17,"tag":29,"props":25927,"children":25928},{},[25929],{"type":23,"value":25930},"These fields allow your product to estimate expected revenue.",{"type":17,"tag":239,"props":25932,"children":25934},{"id":25933},"payments-objects",[25935],{"type":23,"value":25936},"Payments Objects",{"type":17,"tag":29,"props":25938,"children":25939},{},[25940],{"type":23,"value":25941},"Billing data provides actual revenue signals.",{"type":17,"tag":7231,"props":25943,"children":25944},{},[25945,25963],{"type":17,"tag":7235,"props":25946,"children":25947},{},[25948],{"type":17,"tag":7239,"props":25949,"children":25950},{},[25951,25955,25959],{"type":17,"tag":7243,"props":25952,"children":25953},{},[25954],{"type":23,"value":18594},{"type":17,"tag":7243,"props":25956,"children":25957},{},[25958],{"type":23,"value":22096},{"type":17,"tag":7243,"props":25960,"children":25961},{},[25962],{"type":23,"value":20787},{"type":17,"tag":7259,"props":25964,"children":25965},{},[25966,25984],{"type":17,"tag":7239,"props":25967,"children":25968},{},[25969,25974,25979],{"type":17,"tag":7266,"props":25970,"children":25971},{},[25972],{"type":23,"value":25973},"Payment",{"type":17,"tag":7266,"props":25975,"children":25976},{},[25977],{"type":23,"value":25978},"total_amount, currency, contact_id",{"type":17,"tag":7266,"props":25980,"children":25981},{},[25982],{"type":23,"value":25983},"Cash collected",{"type":17,"tag":7239,"props":25985,"children":25986},{},[25987,25992,25997],{"type":17,"tag":7266,"props":25988,"children":25989},{},[25990],{"type":23,"value":25991},"Subscription",{"type":17,"tag":7266,"props":25993,"children":25994},{},[25995],{"type":23,"value":25996},"status, current_period_end_at, interval",{"type":17,"tag":7266,"props":25998,"children":25999},{},[26000],{"type":23,"value":26001},"Recurring revenue",{"type":17,"tag":29,"props":26003,"children":26004},{},[26005],{"type":23,"value":26006},"Important subscription fields include:",{"type":17,"tag":80,"props":26008,"children":26009},{},[26010,26020,26039,26057],{"type":17,"tag":84,"props":26011,"children":26012},{},[26013,26018],{"type":17,"tag":6121,"props":26014,"children":26016},{"className":26015},[],[26017],{"type":23,"value":19949},{"type":23,"value":26019}," – active, canceled, paused",{"type":17,"tag":84,"props":26021,"children":26022},{},[26023,26029,26031,26037],{"type":17,"tag":6121,"props":26024,"children":26026},{"className":26025},[],[26027],{"type":23,"value":26028},"current_period_start_at",{"type":23,"value":26030}," / ",{"type":17,"tag":6121,"props":26032,"children":26034},{"className":26033},[],[26035],{"type":23,"value":26036},"current_period_end_at",{"type":23,"value":26038}," – billing cycle",{"type":17,"tag":84,"props":26040,"children":26041},{},[26042,26048,26049,26055],{"type":17,"tag":6121,"props":26043,"children":26045},{"className":26044},[],[26046],{"type":23,"value":26047},"interval",{"type":23,"value":26030},{"type":17,"tag":6121,"props":26050,"children":26052},{"className":26051},[],[26053],{"type":23,"value":26054},"interval_unit",{"type":23,"value":26056}," – billing frequency",{"type":17,"tag":84,"props":26058,"children":26059},{},[26060,26066],{"type":17,"tag":6121,"props":26061,"children":26063},{"className":26062},[],[26064],{"type":23,"value":26065},"lineitems",{"type":23,"value":26067}," – pricing details",{"type":17,"tag":29,"props":26069,"children":26070},{},[26071],{"type":23,"value":26072},"These fields allow your product to calculate recurring revenue.",{"type":17,"tag":68,"props":26074,"children":26076},{"id":26075},"mapping-data-to-forecast-metrics",[26077],{"type":23,"value":26078},"Mapping Data to Forecast Metrics",{"type":17,"tag":29,"props":26080,"children":26081},{},[26082],{"type":23,"value":26083},"Forecasting models combine CRM and billing signals.",{"type":17,"tag":29,"props":26085,"children":26086},{},[26087],{"type":17,"tag":48,"props":26088,"children":26089},{},[26090],{"type":23,"value":26091},"Pipeline value",{"type":17,"tag":6893,"props":26093,"children":26096},{"className":26094,"code":26095,"language":20901,"meta":23},[20899],"weighted_pipeline = deal.amount * deal.probability\n",[26097],{"type":17,"tag":6121,"props":26098,"children":26099},{"__ignoreMap":7},[26100],{"type":23,"value":26095},{"type":17,"tag":29,"props":26102,"children":26103},{},[26104],{"type":23,"value":26105},"Estimates expected revenue based on deal probability.",{"type":17,"tag":29,"props":26107,"children":26108},{},[26109],{"type":17,"tag":48,"props":26110,"children":26111},{},[26112],{"type":23,"value":26113},"Projected revenue",{"type":17,"tag":6893,"props":26115,"children":26118},{"className":26116,"code":26117,"language":20901,"meta":23},[20899],"projected_revenue = sum(weighted_pipeline by closing_at period)\n",[26119],{"type":17,"tag":6121,"props":26120,"children":26121},{"__ignoreMap":7},[26122],{"type":23,"value":26117},{"type":17,"tag":29,"props":26124,"children":26125},{},[26126],{"type":23,"value":26127},"Forecasts revenue by time period.",{"type":17,"tag":29,"props":26129,"children":26130},{},[26131],{"type":17,"tag":48,"props":26132,"children":26133},{},[26134],{"type":23,"value":26135},"Actual revenue",{"type":17,"tag":6893,"props":26137,"children":26140},{"className":26138,"code":26139,"language":20901,"meta":23},[20899],"actual_revenue = sum(payment.total_amount)\n",[26141],{"type":17,"tag":6121,"props":26142,"children":26143},{"__ignoreMap":7},[26144],{"type":23,"value":26139},{"type":17,"tag":29,"props":26146,"children":26147},{},[26148],{"type":23,"value":26149},"Tracks collected revenue.",{"type":17,"tag":29,"props":26151,"children":26152},{},[26153],{"type":17,"tag":48,"props":26154,"children":26155},{},[26156],{"type":23,"value":26001},{"type":17,"tag":6893,"props":26158,"children":26161},{"className":26159,"code":26160,"language":20901,"meta":23},[20899],"MRR = sum(active subscription monthly value)\nARR = MRR * 12\n",[26162],{"type":17,"tag":6121,"props":26163,"children":26164},{"__ignoreMap":7},[26165],{"type":23,"value":26160},{"type":17,"tag":29,"props":26167,"children":26168},{},[26169],{"type":23,"value":26170},"Measures predictable revenue streams.",{"type":17,"tag":29,"props":26172,"children":26173},{},[26174],{"type":23,"value":26175},"Combining these metrics allows your product to compare forecasted vs actual performance.",{"type":17,"tag":68,"props":26177,"children":26178},{"id":24996},[26179],{"type":23,"value":24999},{"type":17,"tag":29,"props":26181,"children":26182},{},[26183],{"type":23,"value":26184},"Customers connect their CRM and billing platforms using Unified Connect.",{"type":17,"tag":29,"props":26186,"children":26187},{},[26188],{"type":23,"value":26189},"Typical process:",{"type":17,"tag":6154,"props":26191,"children":26192},{},[26193,26197,26202,26206],{"type":17,"tag":84,"props":26194,"children":26195},{},[26196],{"type":23,"value":25017},{"type":17,"tag":84,"props":26198,"children":26199},{},[26200],{"type":23,"value":26201},"The user selects integrations such as Salesforce, HubSpot, or Stripe.",{"type":17,"tag":84,"props":26203,"children":26204},{},[26205],{"type":23,"value":25027},{"type":17,"tag":84,"props":26207,"children":26208},{},[26209,26210,26214],{"type":23,"value":25032},{"type":17,"tag":48,"props":26211,"children":26212},{},[26213],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":26216,"children":26217},{},[26218],{"type":23,"value":25043},{"type":17,"tag":6893,"props":26220,"children":26222},{"className":26221,"code":25047,"language":20901,"meta":23},[20899],[26223],{"type":17,"tag":6121,"props":26224,"children":26225},{"__ignoreMap":7},[26226],{"type":23,"value":25047},{"type":17,"tag":29,"props":26228,"children":26229},{},[26230],{"type":23,"value":25057},{"type":17,"tag":68,"props":26232,"children":26234},{"id":26233},"retrieving-crm-and-billing-data",[26235],{"type":23,"value":26236},"Retrieving CRM and Billing Data",{"type":17,"tag":29,"props":26238,"children":26239},{},[26240],{"type":23,"value":26241},"Your application retrieves data using Unified endpoints.",{"type":17,"tag":29,"props":26243,"children":26244},{},[26245],{"type":23,"value":26246},"CRM:",{"type":17,"tag":6893,"props":26248,"children":26251},{"className":26249,"code":26250,"language":20901,"meta":23},[20899],"GET /crm/{connection_id}/deal\nGET /crm/{connection_id}/contact\nGET /crm/{connection_id}/company\nGET /crm/{connection_id}/event\n",[26252],{"type":17,"tag":6121,"props":26253,"children":26254},{"__ignoreMap":7},[26255],{"type":23,"value":26250},{"type":17,"tag":29,"props":26257,"children":26258},{},[26259],{"type":23,"value":26260},"Payments:",{"type":17,"tag":6893,"props":26262,"children":26265},{"className":26263,"code":26264,"language":20901,"meta":23},[20899],"GET /payment/{connection_id}/payment\nGET /payment/{connection_id}/subscription\n",[26266],{"type":17,"tag":6121,"props":26267,"children":26268},{"__ignoreMap":7},[26269],{"type":23,"value":26264},{"type":17,"tag":29,"props":26271,"children":26272},{},[26273],{"type":23,"value":26274},"These endpoints return normalized objects across providers.",{"type":17,"tag":29,"props":26276,"children":26277},{},[26278],{"type":23,"value":26279},"Common filters include:",{"type":17,"tag":80,"props":26281,"children":26282},{},[26283,26294],{"type":17,"tag":84,"props":26284,"children":26285},{},[26286,26292],{"type":17,"tag":6121,"props":26287,"children":26289},{"className":26288},[],[26290],{"type":23,"value":26291},"updated_gte",{"type":23,"value":26293}," for incremental updates",{"type":17,"tag":84,"props":26295,"children":26296},{},[26297,26303],{"type":17,"tag":6121,"props":26298,"children":26300},{"className":26299},[],[26301],{"type":23,"value":26302},"contact_id",{"type":23,"value":26304}," for linking revenue to accounts",{"type":17,"tag":68,"props":26306,"children":26308},{"id":26307},"building-an-ai-forecasting-pipeline",[26309],{"type":23,"value":26310},"Building an AI Forecasting Pipeline",{"type":17,"tag":29,"props":26312,"children":26313},{},[26314],{"type":23,"value":26315},"AI forecasting features typically follow this pattern.",{"type":17,"tag":29,"props":26317,"children":26318},{},[26319],{"type":17,"tag":48,"props":26320,"children":26321},{},[26322],{"type":23,"value":25145},{"type":17,"tag":29,"props":26324,"children":26325},{},[26326],{"type":23,"value":26327},"Fetch deals, payments, and subscriptions.",{"type":17,"tag":29,"props":26329,"children":26330},{},[26331],{"type":17,"tag":48,"props":26332,"children":26333},{},[26334],{"type":23,"value":26335},"2. Aggregate metrics",{"type":17,"tag":29,"props":26337,"children":26338},{},[26339],{"type":23,"value":26340},"Calculate pipeline, revenue, and activity metrics.",{"type":17,"tag":29,"props":26342,"children":26343},{},[26344],{"type":17,"tag":48,"props":26345,"children":26346},{},[26347],{"type":23,"value":26348},"3. Train or apply models",{"type":17,"tag":29,"props":26350,"children":26351},{},[26352],{"type":23,"value":26353},"Use historical data to predict outcomes.",{"type":17,"tag":29,"props":26355,"children":26356},{},[26357],{"type":17,"tag":48,"props":26358,"children":26359},{},[26360],{"type":23,"value":26361},"4. Generate forecasts",{"type":17,"tag":29,"props":26363,"children":26364},{},[26365],{"type":23,"value":26366},"Estimate revenue for future periods.",{"type":17,"tag":29,"props":26368,"children":26369},{},[26370],{"type":17,"tag":48,"props":26371,"children":26372},{},[26373],{"type":23,"value":26374},"5. Store results",{"type":17,"tag":29,"props":26376,"children":26377},{},[26378],{"type":23,"value":26379},"Persist forecasts in your application.",{"type":17,"tag":29,"props":26381,"children":26382},{},[26383],{"type":17,"tag":48,"props":26384,"children":26385},{},[26386],{"type":23,"value":26387},"6. Display insights",{"type":17,"tag":29,"props":26389,"children":26390},{},[26391],{"type":23,"value":26392},"Show forecasts in dashboards or reports.",{"type":17,"tag":29,"props":26394,"children":26395},{},[26396],{"type":23,"value":26397},"This pipeline allows your product to deliver predictive insights.",{"type":17,"tag":68,"props":26399,"children":26401},{"id":26400},"generating-ai-forecast-insights",[26402],{"type":23,"value":26403},"Generating AI Forecast Insights",{"type":17,"tag":29,"props":26405,"children":26406},{},[26407],{"type":23,"value":26408},"AI models can generate explanations alongside forecasts.",{"type":17,"tag":29,"props":26410,"children":26411},{},[26412],{"type":23,"value":26413},"Example prompt:",{"type":17,"tag":6893,"props":26415,"children":26418},{"className":26416,"code":26417,"language":20901,"meta":23},[20899],"{\n  \"messages\": [\n    { \"role\": \"system\", \"content\": \"You are a sales forecasting assistant.\" },\n    { \"role\": \"user\", \"content\": \"Explain why revenue is projected to decline next quarter.\" }\n  ]\n}\n",[26419],{"type":17,"tag":6121,"props":26420,"children":26421},{"__ignoreMap":7},[26422],{"type":23,"value":26417},{"type":17,"tag":29,"props":26424,"children":26425},{},[26426],{"type":23,"value":26427},"The model can produce:",{"type":17,"tag":80,"props":26429,"children":26430},{},[26431,26436,26441],{"type":17,"tag":84,"props":26432,"children":26433},{},[26434],{"type":23,"value":26435},"forecast summaries",{"type":17,"tag":84,"props":26437,"children":26438},{},[26439],{"type":23,"value":26440},"risk explanations",{"type":17,"tag":84,"props":26442,"children":26443},{},[26444],{"type":23,"value":26445},"recommendations",{"type":17,"tag":29,"props":26447,"children":26448},{},[26449],{"type":23,"value":26450},"This helps users understand not just the forecast, but the reasoning behind it.",{"type":17,"tag":68,"props":26452,"children":26454},{"id":26453},"keeping-forecast-data-updated",[26455],{"type":23,"value":26456},"Keeping Forecast Data Updated",{"type":17,"tag":29,"props":26458,"children":26459},{},[26460],{"type":23,"value":26461},"Forecasts must reflect current data.",{"type":17,"tag":29,"props":26463,"children":26464},{},[26465],{"type":23,"value":25308},{"type":17,"tag":80,"props":26467,"children":26468},{},[26469,26474,26479,26484],{"type":17,"tag":84,"props":26470,"children":26471},{},[26472],{"type":23,"value":26473},"deal updates",{"type":17,"tag":84,"props":26475,"children":26476},{},[26477],{"type":23,"value":26478},"activity changes",{"type":17,"tag":84,"props":26480,"children":26481},{},[26482],{"type":23,"value":26483},"subscription updates",{"type":17,"tag":84,"props":26485,"children":26486},{},[26487],{"type":23,"value":26488},"payment events",{"type":17,"tag":29,"props":26490,"children":26491},{},[26492,26494,26499],{"type":23,"value":26493},"Applications can use webhook events or timestamps such as ",{"type":17,"tag":6121,"props":26495,"children":26497},{"className":26496},[],[26498],{"type":23,"value":25337},{"type":23,"value":26500}," to trigger recalculation.",{"type":17,"tag":68,"props":26502,"children":26503},{"id":25342},[26504],{"type":23,"value":25345},{"type":17,"tag":29,"props":26506,"children":26507},{},[26508],{"type":23,"value":26509},"Unified supports a broad range of integrations.",{"type":17,"tag":29,"props":26511,"children":26512},{},[26513],{"type":23,"value":26514},"CRM (47+ integrations)",{"type":17,"tag":80,"props":26516,"children":26517},{},[26518,26522,26526,26531],{"type":17,"tag":84,"props":26519,"children":26520},{},[26521],{"type":23,"value":3179},{"type":17,"tag":84,"props":26523,"children":26524},{},[26525],{"type":23,"value":3184},{"type":17,"tag":84,"props":26527,"children":26528},{},[26529],{"type":23,"value":26530},"Pipedrive",{"type":17,"tag":84,"props":26532,"children":26533},{},[26534],{"type":23,"value":26535},"Zoho CRM",{"type":17,"tag":29,"props":26537,"children":26538},{},[26539],{"type":23,"value":26540},"Payments (16 integrations)",{"type":17,"tag":80,"props":26542,"children":26543},{},[26544,26549,26554],{"type":17,"tag":84,"props":26545,"children":26546},{},[26547],{"type":23,"value":26548},"Stripe",{"type":17,"tag":84,"props":26550,"children":26551},{},[26552],{"type":23,"value":26553},"PayPal",{"type":17,"tag":84,"props":26555,"children":26556},{},[26557],{"type":23,"value":14193},{"type":17,"tag":29,"props":26559,"children":26560},{},[26561],{"type":23,"value":26562},"This allows forecasting tools to support many customer environments.",{"type":17,"tag":68,"props":26564,"children":26565},{"id":883},[26566],{"type":23,"value":19178},{"type":17,"tag":29,"props":26568,"children":26569},{},[26570],{"type":23,"value":26571},"AI sales forecasting requires combining pipeline data and revenue data.",{"type":17,"tag":29,"props":26573,"children":26574},{},[26575],{"type":23,"value":26576},"Without unified integration infrastructure, developers must build and maintain separate integrations for CRM and billing platforms.",{"type":17,"tag":29,"props":26578,"children":26579},{},[26580],{"type":23,"value":25437},{"type":17,"tag":80,"props":26582,"children":26583},{},[26584,26589,26594,26598],{"type":17,"tag":84,"props":26585,"children":26586},{},[26587],{"type":23,"value":26588},"consistent objects across CRM and payments categories",{"type":17,"tag":84,"props":26590,"children":26591},{},[26592],{"type":23,"value":26593},"real-time access to source data",{"type":17,"tag":84,"props":26595,"children":26596},{},[26597],{"type":23,"value":25455},{"type":17,"tag":84,"props":26599,"children":26600},{},[26601],{"type":23,"value":25460},{"type":17,"tag":29,"props":26603,"children":26604},{},[26605],{"type":23,"value":26606},"This allows product teams to build forecasting features that provide accurate revenue predictions and actionable insights.",{"type":17,"tag":29,"props":26608,"children":26609},{},[26610],{"type":23,"value":26611},"Start building AI sales forecasting across CRM and billing platforms today.",{"type":17,"tag":29,"props":26613,"children":26614},{},[26615,26616],{"type":23,"value":1609},{"type":17,"tag":133,"props":26617,"children":26619},{"href":1612,"rel":26618},[214],[26620],{"type":23,"value":1616},{"type":17,"tag":29,"props":26622,"children":26623},{},[26624,26625],{"type":23,"value":1609},{"type":17,"tag":133,"props":26626,"children":26628},{"href":1623,"rel":26627},[214],[26629],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":26631},[26632,26633,26634,26635,26639,26640,26641,26642,26643,26644,26645,26646],{"id":25548,"depth":1629,"text":25551},{"id":25617,"depth":1629,"text":25620},{"id":24499,"depth":1629,"text":24502},{"id":24613,"depth":1629,"text":24616,"children":26636},[26637,26638],{"id":25770,"depth":1635,"text":25773},{"id":25933,"depth":1635,"text":25936},{"id":26075,"depth":1629,"text":26078},{"id":24996,"depth":1629,"text":24999},{"id":26233,"depth":1629,"text":26236},{"id":26307,"depth":1629,"text":26310},{"id":26400,"depth":1629,"text":26403},{"id":26453,"depth":1629,"text":26456},{"id":25342,"depth":1629,"text":25345},{"id":883,"depth":1629,"text":19178},"content:blog:how_to_build_ai_sales_forecasting_using_crm_and_billing_data.md","blog/how_to_build_ai_sales_forecasting_using_crm_and_billing_data.md","blog/how_to_build_ai_sales_forecasting_using_crm_and_billing_data",{"_path":26651,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":26652,"description":26653,"img":26654,"date":26655,"tag":12,"body":26656,"_type":1677,"_id":27710,"_source":1679,"_file":27711,"_stem":27712,"_extension":1682},"/blog/how_to_build_account_based_notifications_across_crm_and_messaging_platforms","How to Build Account-Based Notifications Across CRM and Messaging Platforms","Account-based notifications are a feature inside a SaaS product that trigger alerts based on changes in customer data—such as deal updates, new activity, or...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_account_based_notifications_across_crm_and_messaging_platforms-icon.png","2026-03-24T00:29:00.000Z",{"type":14,"children":26657,"toc":27696},[26658,26663,26666,26673,26678,26683,26688,26694,26699,26703,26729,26734,26739,26782,26787,26793,26798,26806,26811,26819,26824,26832,26837,26845,26850,26858,26863,26867,26872,26928,26933,26939,26944,27035,27040,27068,27073,27079,27084,27141,27145,27174,27179,27185,27190,27194,27219,27223,27231,27235,27241,27246,27251,27260,27264,27313,27318,27341,27347,27358,27367,27372,27395,27400,27409,27414,27432,27438,27443,27451,27456,27464,27469,27477,27482,27490,27495,27503,27508,27514,27519,27524,27542,27547,27560,27565,27569,27574,27578,27597,27602,27622,27627,27631,27636,27641,27645,27668,27673,27678,27687],{"type":17,"tag":18,"props":26659,"children":26661},{"id":26660},"how-to-build-account-based-notifications-across-crm-and-messaging-platforms",[26662],{"type":23,"value":26652},{"type":17,"tag":25,"props":26664,"children":26665},{},[],{"type":17,"tag":29,"props":26667,"children":26668},{},[26669],{"type":17,"tag":33,"props":26670,"children":26671},{},[26672],{"type":23,"value":19372},{"type":17,"tag":29,"props":26674,"children":26675},{},[26676],{"type":23,"value":26677},"Account-based notifications are a feature inside a SaaS product that trigger alerts based on changes in customer data—such as deal updates, new activity, or engagement signals—and deliver those alerts through messaging platforms like Slack, Gmail, or Microsoft Teams.",{"type":17,"tag":29,"props":26679,"children":26680},{},[26681],{"type":23,"value":26682},"To build this, your product needs to monitor CRM data in real time and send notifications through messaging systems. CRM platforms like Salesforce and HubSpot store deal and activity data, while messaging platforms handle delivery and collaboration.",{"type":17,"tag":29,"props":26684,"children":26685},{},[26686],{"type":23,"value":26687},"Each platform exposes different APIs and event models. Unified provides category-specific APIs for CRM and Messaging, allowing your product to retrieve updates and send notifications across platforms using consistent objects and endpoints.",{"type":17,"tag":68,"props":26689,"children":26691},{"id":26690},"why-saas-products-build-account-based-notifications",[26692],{"type":23,"value":26693},"Why SaaS Products Build Account-Based Notifications",{"type":17,"tag":29,"props":26695,"children":26696},{},[26697],{"type":23,"value":26698},"Many B2B SaaS products include notification features to help teams stay informed about account activity.",{"type":17,"tag":29,"props":26700,"children":26701},{},[26702],{"type":23,"value":24364},{"type":17,"tag":80,"props":26704,"children":26705},{},[26706,26710,26715,26720,26725],{"type":17,"tag":84,"props":26707,"children":26708},{},[26709],{"type":23,"value":25568},{"type":17,"tag":84,"props":26711,"children":26712},{},[26713],{"type":23,"value":26714},"Customer success tools",{"type":17,"tag":84,"props":26716,"children":26717},{},[26718],{"type":23,"value":26719},"Sales productivity tools",{"type":17,"tag":84,"props":26721,"children":26722},{},[26723],{"type":23,"value":26724},"Account management platforms",{"type":17,"tag":84,"props":26726,"children":26727},{},[26728],{"type":23,"value":25587},{"type":17,"tag":29,"props":26730,"children":26731},{},[26732],{"type":23,"value":26733},"These products help users respond quickly to changes in customer accounts.",{"type":17,"tag":29,"props":26735,"children":26736},{},[26737],{"type":23,"value":26738},"Typical needs include:",{"type":17,"tag":80,"props":26740,"children":26741},{},[26742,26752,26762,26772],{"type":17,"tag":84,"props":26743,"children":26744},{},[26745,26750],{"type":17,"tag":48,"props":26746,"children":26747},{},[26748],{"type":23,"value":26749},"Immediate alerts",{"type":23,"value":26751}," when important events occur",{"type":17,"tag":84,"props":26753,"children":26754},{},[26755,26760],{"type":17,"tag":48,"props":26756,"children":26757},{},[26758],{"type":23,"value":26759},"Proactive notifications",{"type":23,"value":26761}," for risk or opportunity signals",{"type":17,"tag":84,"props":26763,"children":26764},{},[26765,26770],{"type":17,"tag":48,"props":26766,"children":26767},{},[26768],{"type":23,"value":26769},"Team visibility",{"type":23,"value":26771}," across sales and customer success",{"type":17,"tag":84,"props":26773,"children":26774},{},[26775,26780],{"type":17,"tag":48,"props":26776,"children":26777},{},[26778],{"type":23,"value":26779},"Automated workflows",{"type":23,"value":26781}," triggered by account changes",{"type":17,"tag":29,"props":26783,"children":26784},{},[26785],{"type":23,"value":26786},"Without automation, teams must manually monitor CRM systems for updates.",{"type":17,"tag":68,"props":26788,"children":26790},{"id":26789},"common-notification-use-cases",[26791],{"type":23,"value":26792},"Common Notification Use Cases",{"type":17,"tag":29,"props":26794,"children":26795},{},[26796],{"type":23,"value":26797},"Account-based notifications typically support several workflows.",{"type":17,"tag":29,"props":26799,"children":26800},{},[26801],{"type":17,"tag":48,"props":26802,"children":26803},{},[26804],{"type":23,"value":26805},"Deal stalled alerts",{"type":17,"tag":29,"props":26807,"children":26808},{},[26809],{"type":23,"value":26810},"Notify teams when a deal has not progressed for a defined period.",{"type":17,"tag":29,"props":26812,"children":26813},{},[26814],{"type":17,"tag":48,"props":26815,"children":26816},{},[26817],{"type":23,"value":26818},"New activity alerts",{"type":17,"tag":29,"props":26820,"children":26821},{},[26822],{"type":23,"value":26823},"Trigger notifications when new calls, meetings, or notes are logged.",{"type":17,"tag":29,"props":26825,"children":26826},{},[26827],{"type":17,"tag":48,"props":26828,"children":26829},{},[26830],{"type":23,"value":26831},"Deal stage changes",{"type":17,"tag":29,"props":26833,"children":26834},{},[26835],{"type":23,"value":26836},"Alert users when a deal moves to a new stage.",{"type":17,"tag":29,"props":26838,"children":26839},{},[26840],{"type":17,"tag":48,"props":26841,"children":26842},{},[26843],{"type":23,"value":26844},"Customer risk signals",{"type":17,"tag":29,"props":26846,"children":26847},{},[26848],{"type":23,"value":26849},"Notify teams when support activity spikes or engagement drops.",{"type":17,"tag":29,"props":26851,"children":26852},{},[26853],{"type":17,"tag":48,"props":26854,"children":26855},{},[26856],{"type":23,"value":26857},"Internal collaboration alerts",{"type":17,"tag":29,"props":26859,"children":26860},{},[26861],{"type":23,"value":26862},"Send messages to Slack or Teams channels for team visibility.",{"type":17,"tag":68,"props":26864,"children":26865},{"id":24499},[26866],{"type":23,"value":24502},{"type":17,"tag":29,"props":26868,"children":26869},{},[26870],{"type":23,"value":26871},"Account-based notifications combine data from CRM and Messaging categories.",{"type":17,"tag":7231,"props":26873,"children":26874},{},[26875,26893],{"type":17,"tag":7235,"props":26876,"children":26877},{},[26878],{"type":17,"tag":7239,"props":26879,"children":26880},{},[26881,26885,26889],{"type":17,"tag":7243,"props":26882,"children":26883},{},[26884],{"type":23,"value":7247},{"type":17,"tag":7243,"props":26886,"children":26887},{},[26888],{"type":23,"value":24525},{"type":17,"tag":7243,"props":26890,"children":26891},{},[26892],{"type":23,"value":24530},{"type":17,"tag":7259,"props":26894,"children":26895},{},[26896,26912],{"type":17,"tag":7239,"props":26897,"children":26898},{},[26899,26903,26908],{"type":17,"tag":7266,"props":26900,"children":26901},{},[26902],{"type":23,"value":25731},{"type":17,"tag":7266,"props":26904,"children":26905},{},[26906],{"type":23,"value":26907},"Account, deal, and activity data from platforms like Salesforce and HubSpot",{"type":17,"tag":7266,"props":26909,"children":26910},{},[26911],{"type":23,"value":25741},{"type":17,"tag":7239,"props":26913,"children":26914},{},[26915,26919,26924],{"type":17,"tag":7266,"props":26916,"children":26917},{},[26918],{"type":23,"value":24559},{"type":17,"tag":7266,"props":26920,"children":26921},{},[26922],{"type":23,"value":26923},"Communication delivery across platforms like Slack, Gmail, and Teams",{"type":17,"tag":7266,"props":26925,"children":26926},{},[26927],{"type":23,"value":24569},{"type":17,"tag":29,"props":26929,"children":26930},{},[26931],{"type":23,"value":26932},"These categories allow your product to detect changes in account data and deliver notifications to users.",{"type":17,"tag":68,"props":26934,"children":26936},{"id":26935},"unified-crm-objects-and-key-fields",[26937],{"type":23,"value":26938},"Unified CRM Objects and Key Fields",{"type":17,"tag":29,"props":26940,"children":26941},{},[26942],{"type":23,"value":26943},"CRM objects provide the signals that trigger notifications.",{"type":17,"tag":7231,"props":26945,"children":26946},{},[26947,26965],{"type":17,"tag":7235,"props":26948,"children":26949},{},[26950],{"type":17,"tag":7239,"props":26951,"children":26952},{},[26953,26957,26961],{"type":17,"tag":7243,"props":26954,"children":26955},{},[26956],{"type":23,"value":18594},{"type":17,"tag":7243,"props":26958,"children":26959},{},[26960],{"type":23,"value":22096},{"type":17,"tag":7243,"props":26962,"children":26963},{},[26964],{"type":23,"value":20787},{"type":17,"tag":7259,"props":26966,"children":26967},{},[26968,26985,27002,27019],{"type":17,"tag":7239,"props":26969,"children":26970},{},[26971,26975,26980],{"type":17,"tag":7266,"props":26972,"children":26973},{},[26974],{"type":23,"value":25810},{"type":17,"tag":7266,"props":26976,"children":26977},{},[26978],{"type":23,"value":26979},"amount, stage_id, probability, closing_at",{"type":17,"tag":7266,"props":26981,"children":26982},{},[26983],{"type":23,"value":26984},"Track pipeline changes",{"type":17,"tag":7239,"props":26986,"children":26987},{},[26988,26992,26997],{"type":17,"tag":7266,"props":26989,"children":26990},{},[26991],{"type":23,"value":14528},{"type":17,"tag":7266,"props":26993,"children":26994},{},[26995],{"type":23,"value":26996},"type, created_at, contact_ids, company_ids",{"type":17,"tag":7266,"props":26998,"children":26999},{},[27000],{"type":23,"value":27001},"Detect new activity",{"type":17,"tag":7239,"props":27003,"children":27004},{},[27005,27009,27014],{"type":17,"tag":7266,"props":27006,"children":27007},{},[27008],{"type":23,"value":25828},{"type":17,"tag":7266,"props":27010,"children":27011},{},[27012],{"type":23,"value":27013},"name, emails, company_ids",{"type":17,"tag":7266,"props":27015,"children":27016},{},[27017],{"type":23,"value":27018},"Identify affected users",{"type":17,"tag":7239,"props":27020,"children":27021},{},[27022,27026,27030],{"type":17,"tag":7266,"props":27023,"children":27024},{},[27025],{"type":23,"value":25846},{"type":17,"tag":7266,"props":27027,"children":27028},{},[27029],{"type":23,"value":25851},{"type":17,"tag":7266,"props":27031,"children":27032},{},[27033],{"type":23,"value":27034},"Group account data",{"type":17,"tag":29,"props":27036,"children":27037},{},[27038],{"type":23,"value":27039},"Important event types include:",{"type":17,"tag":80,"props":27041,"children":27042},{},[27043,27048,27053,27058,27063],{"type":17,"tag":84,"props":27044,"children":27045},{},[27046],{"type":23,"value":27047},"NOTE",{"type":17,"tag":84,"props":27049,"children":27050},{},[27051],{"type":23,"value":27052},"EMAIL",{"type":17,"tag":84,"props":27054,"children":27055},{},[27056],{"type":23,"value":27057},"CALL",{"type":17,"tag":84,"props":27059,"children":27060},{},[27061],{"type":23,"value":27062},"MEETING",{"type":17,"tag":84,"props":27064,"children":27065},{},[27066],{"type":23,"value":27067},"TASK",{"type":17,"tag":29,"props":27069,"children":27070},{},[27071],{"type":23,"value":27072},"These activity types allow your product to trigger notifications based on customer engagement.",{"type":17,"tag":68,"props":27074,"children":27076},{"id":27075},"unified-messaging-objects-and-key-fields",[27077],{"type":23,"value":27078},"Unified Messaging Objects and Key Fields",{"type":17,"tag":29,"props":27080,"children":27081},{},[27082],{"type":23,"value":27083},"Messaging objects handle notification delivery.",{"type":17,"tag":7231,"props":27085,"children":27086},{},[27087,27105],{"type":17,"tag":7235,"props":27088,"children":27089},{},[27090],{"type":17,"tag":7239,"props":27091,"children":27092},{},[27093,27097,27101],{"type":17,"tag":7243,"props":27094,"children":27095},{},[27096],{"type":23,"value":18594},{"type":17,"tag":7243,"props":27098,"children":27099},{},[27100],{"type":23,"value":22096},{"type":17,"tag":7243,"props":27102,"children":27103},{},[27104],{"type":23,"value":20787},{"type":17,"tag":7259,"props":27106,"children":27107},{},[27108,27125],{"type":17,"tag":7239,"props":27109,"children":27110},{},[27111,27115,27120],{"type":17,"tag":7266,"props":27112,"children":27113},{},[27114],{"type":23,"value":15800},{"type":17,"tag":7266,"props":27116,"children":27117},{},[27118],{"type":23,"value":27119},"message, subject, author_member, created_at",{"type":17,"tag":7266,"props":27121,"children":27122},{},[27123],{"type":23,"value":27124},"Notification content",{"type":17,"tag":7239,"props":27126,"children":27127},{},[27128,27132,27136],{"type":17,"tag":7266,"props":27129,"children":27130},{},[27131],{"type":23,"value":15787},{"type":17,"tag":7266,"props":27133,"children":27134},{},[27135],{"type":23,"value":24817},{"type":17,"tag":7266,"props":27137,"children":27138},{},[27139],{"type":23,"value":27140},"Destination for notifications",{"type":17,"tag":29,"props":27142,"children":27143},{},[27144],{"type":23,"value":24827},{"type":17,"tag":80,"props":27146,"children":27147},{},[27148,27164,27169],{"type":17,"tag":84,"props":27149,"children":27150},{},[27151,27152,27157,27158,27163],{"type":23,"value":24847},{"type":17,"tag":6121,"props":27153,"children":27155},{"className":27154},[],[27156],{"type":23,"value":24853},{"type":23,"value":11826},{"type":17,"tag":6121,"props":27159,"children":27161},{"className":27160},[],[27162],{"type":23,"value":24860},{"type":23,"value":12034},{"type":17,"tag":84,"props":27165,"children":27166},{},[27167],{"type":23,"value":27168},"channels for group notifications",{"type":17,"tag":84,"props":27170,"children":27171},{},[27172],{"type":23,"value":27173},"content formatting (plain text, HTML, Markdown)",{"type":17,"tag":29,"props":27175,"children":27176},{},[27177],{"type":23,"value":27178},"These fields allow notifications to be sent across multiple platforms.",{"type":17,"tag":68,"props":27180,"children":27182},{"id":27181},"connecting-customer-crm-and-messaging-platforms",[27183],{"type":23,"value":27184},"Connecting Customer CRM and Messaging Platforms",{"type":17,"tag":29,"props":27186,"children":27187},{},[27188],{"type":23,"value":27189},"Customers connect their CRM and messaging platforms using Unified Connect.",{"type":17,"tag":29,"props":27191,"children":27192},{},[27193],{"type":23,"value":25009},{"type":17,"tag":6154,"props":27195,"children":27196},{},[27197,27201,27206,27210],{"type":17,"tag":84,"props":27198,"children":27199},{},[27200],{"type":23,"value":25017},{"type":17,"tag":84,"props":27202,"children":27203},{},[27204],{"type":23,"value":27205},"The user selects integrations such as Salesforce, HubSpot, Slack, or Gmail.",{"type":17,"tag":84,"props":27207,"children":27208},{},[27209],{"type":23,"value":25027},{"type":17,"tag":84,"props":27211,"children":27212},{},[27213,27214,27218],{"type":23,"value":25032},{"type":17,"tag":48,"props":27215,"children":27216},{},[27217],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":27220,"children":27221},{},[27222],{"type":23,"value":25043},{"type":17,"tag":6893,"props":27224,"children":27226},{"className":27225,"code":25047,"language":20901,"meta":23},[20899],[27227],{"type":17,"tag":6121,"props":27228,"children":27229},{"__ignoreMap":7},[27230],{"type":23,"value":25047},{"type":17,"tag":29,"props":27232,"children":27233},{},[27234],{"type":23,"value":25057},{"type":17,"tag":68,"props":27236,"children":27238},{"id":27237},"detecting-account-events",[27239],{"type":23,"value":27240},"Detecting Account Events",{"type":17,"tag":29,"props":27242,"children":27243},{},[27244],{"type":23,"value":27245},"Notifications are triggered by changes in CRM data.",{"type":17,"tag":29,"props":27247,"children":27248},{},[27249],{"type":23,"value":27250},"CRM events can be retrieved using:",{"type":17,"tag":6893,"props":27252,"children":27255},{"className":27253,"code":27254,"language":20901,"meta":23},[20899],"GET /crm/{connection_id}/event\n",[27256],{"type":17,"tag":6121,"props":27257,"children":27258},{"__ignoreMap":7},[27259],{"type":23,"value":27254},{"type":17,"tag":29,"props":27261,"children":27262},{},[27263],{"type":23,"value":26279},{"type":17,"tag":80,"props":27265,"children":27266},{},[27267,27277,27302],{"type":17,"tag":84,"props":27268,"children":27269},{},[27270,27275],{"type":17,"tag":6121,"props":27271,"children":27273},{"className":27272},[],[27274],{"type":23,"value":26291},{"type":23,"value":27276}," to retrieve recent changes",{"type":17,"tag":84,"props":27278,"children":27279},{},[27280,27286,27287,27292,27294,27300],{"type":17,"tag":6121,"props":27281,"children":27283},{"className":27282},[],[27284],{"type":23,"value":27285},"deal_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":27288,"children":27290},{"className":27289},[],[27291],{"type":23,"value":26302},{"type":23,"value":27293},", or ",{"type":17,"tag":6121,"props":27295,"children":27297},{"className":27296},[],[27298],{"type":23,"value":27299},"company_id",{"type":23,"value":27301}," to scope events",{"type":17,"tag":84,"props":27303,"children":27304},{},[27305,27311],{"type":17,"tag":6121,"props":27306,"children":27308},{"className":27307},[],[27309],{"type":23,"value":27310},"type",{"type":23,"value":27312}," to filter activity types",{"type":17,"tag":29,"props":27314,"children":27315},{},[27316],{"type":23,"value":27317},"Typical trigger conditions include:",{"type":17,"tag":80,"props":27319,"children":27320},{},[27321,27326,27331,27336],{"type":17,"tag":84,"props":27322,"children":27323},{},[27324],{"type":23,"value":27325},"no activity for a defined period",{"type":17,"tag":84,"props":27327,"children":27328},{},[27329],{"type":23,"value":27330},"new activity logged",{"type":17,"tag":84,"props":27332,"children":27333},{},[27334],{"type":23,"value":27335},"deal stage change",{"type":17,"tag":84,"props":27337,"children":27338},{},[27339],{"type":23,"value":27340},"deal created or updated",{"type":17,"tag":68,"props":27342,"children":27344},{"id":27343},"sending-notifications",[27345],{"type":23,"value":27346},"Sending Notifications",{"type":17,"tag":29,"props":27348,"children":27349},{},[27350,27352,27357],{"type":23,"value":27351},"Notifications are delivered through the ",{"type":17,"tag":133,"props":27353,"children":27354},{"href":14913},[27355],{"type":23,"value":27356},"Messaging API",{"type":23,"value":54},{"type":17,"tag":6893,"props":27359,"children":27362},{"className":27360,"code":27361,"language":20901,"meta":23},[20899],"POST /messaging/{connection_id}/message\n",[27363],{"type":17,"tag":6121,"props":27364,"children":27365},{"__ignoreMap":7},[27366],{"type":23,"value":27361},{"type":17,"tag":29,"props":27368,"children":27369},{},[27370],{"type":23,"value":27371},"To send a notification, provide:",{"type":17,"tag":80,"props":27373,"children":27374},{},[27375,27380,27385],{"type":17,"tag":84,"props":27376,"children":27377},{},[27378],{"type":23,"value":27379},"message content",{"type":17,"tag":84,"props":27381,"children":27382},{},[27383],{"type":23,"value":27384},"destination channel or recipients",{"type":17,"tag":84,"props":27386,"children":27387},{},[27388,27390],{"type":23,"value":27389},"optional thread context using ",{"type":17,"tag":6121,"props":27391,"children":27393},{"className":27392},[],[27394],{"type":23,"value":15863},{"type":17,"tag":29,"props":27396,"children":27397},{},[27398],{"type":23,"value":27399},"Example notification:",{"type":17,"tag":6893,"props":27401,"children":27404},{"className":27402,"code":27403,"language":20901,"meta":23},[20899],"Deal stalled: No activity on Acme Corp for 14 days\n",[27405],{"type":17,"tag":6121,"props":27406,"children":27407},{"__ignoreMap":7},[27408],{"type":23,"value":27403},{"type":17,"tag":29,"props":27410,"children":27411},{},[27412],{"type":23,"value":27413},"Messages can be sent to:",{"type":17,"tag":80,"props":27415,"children":27416},{},[27417,27422,27427],{"type":17,"tag":84,"props":27418,"children":27419},{},[27420],{"type":23,"value":27421},"Slack channels",{"type":17,"tag":84,"props":27423,"children":27424},{},[27425],{"type":23,"value":27426},"Microsoft Teams channels",{"type":17,"tag":84,"props":27428,"children":27429},{},[27430],{"type":23,"value":27431},"email recipients",{"type":17,"tag":68,"props":27433,"children":27435},{"id":27434},"building-notification-logic",[27436],{"type":23,"value":27437},"Building Notification Logic",{"type":17,"tag":29,"props":27439,"children":27440},{},[27441],{"type":23,"value":27442},"A typical notification system includes the following steps.",{"type":17,"tag":29,"props":27444,"children":27445},{},[27446],{"type":17,"tag":48,"props":27447,"children":27448},{},[27449],{"type":23,"value":27450},"1. Retrieve CRM data",{"type":17,"tag":29,"props":27452,"children":27453},{},[27454],{"type":23,"value":27455},"Fetch recent events, deals, and account activity.",{"type":17,"tag":29,"props":27457,"children":27458},{},[27459],{"type":17,"tag":48,"props":27460,"children":27461},{},[27462],{"type":23,"value":27463},"2. Evaluate conditions",{"type":17,"tag":29,"props":27465,"children":27466},{},[27467],{"type":23,"value":27468},"Apply rules such as inactivity thresholds or stage changes.",{"type":17,"tag":29,"props":27470,"children":27471},{},[27472],{"type":17,"tag":48,"props":27473,"children":27474},{},[27475],{"type":23,"value":27476},"3. Generate notification content",{"type":17,"tag":29,"props":27478,"children":27479},{},[27480],{"type":23,"value":27481},"Create a message describing the event or alert.",{"type":17,"tag":29,"props":27483,"children":27484},{},[27485],{"type":17,"tag":48,"props":27486,"children":27487},{},[27488],{"type":23,"value":27489},"4. Send notification",{"type":17,"tag":29,"props":27491,"children":27492},{},[27493],{"type":23,"value":27494},"Use the Messaging API to deliver the message.",{"type":17,"tag":29,"props":27496,"children":27497},{},[27498],{"type":17,"tag":48,"props":27499,"children":27500},{},[27501],{"type":23,"value":27502},"5. Track notifications",{"type":17,"tag":29,"props":27504,"children":27505},{},[27506],{"type":23,"value":27507},"Optionally store notification history in your application.",{"type":17,"tag":68,"props":27509,"children":27511},{"id":27510},"keeping-notifications-real-time",[27512],{"type":23,"value":27513},"Keeping Notifications Real-Time",{"type":17,"tag":29,"props":27515,"children":27516},{},[27517],{"type":23,"value":27518},"Unified provides webhook events for CRM and messaging updates.",{"type":17,"tag":29,"props":27520,"children":27521},{},[27522],{"type":23,"value":27523},"CRM events:",{"type":17,"tag":80,"props":27525,"children":27526},{},[27527,27532,27537],{"type":17,"tag":84,"props":27528,"children":27529},{},[27530],{"type":23,"value":27531},"deal created",{"type":17,"tag":84,"props":27533,"children":27534},{},[27535],{"type":23,"value":27536},"deal updated",{"type":17,"tag":84,"props":27538,"children":27539},{},[27540],{"type":23,"value":27541},"activity created",{"type":17,"tag":29,"props":27543,"children":27544},{},[27545],{"type":23,"value":27546},"Messaging events:",{"type":17,"tag":80,"props":27548,"children":27549},{},[27550,27555],{"type":17,"tag":84,"props":27551,"children":27552},{},[27553],{"type":23,"value":27554},"message created",{"type":17,"tag":84,"props":27556,"children":27557},{},[27558],{"type":23,"value":27559},"message updated",{"type":17,"tag":29,"props":27561,"children":27562},{},[27563],{"type":23,"value":27564},"These events allow your application to trigger notifications immediately when data changes.",{"type":17,"tag":68,"props":27566,"children":27567},{"id":25342},[27568],{"type":23,"value":25345},{"type":17,"tag":29,"props":27570,"children":27571},{},[27572],{"type":23,"value":27573},"Unified supports a wide range of integrations across categories.",{"type":17,"tag":29,"props":27575,"children":27576},{},[27577],{"type":23,"value":26514},{"type":17,"tag":80,"props":27579,"children":27580},{},[27581,27585,27589,27593],{"type":17,"tag":84,"props":27582,"children":27583},{},[27584],{"type":23,"value":3179},{"type":17,"tag":84,"props":27586,"children":27587},{},[27588],{"type":23,"value":3184},{"type":17,"tag":84,"props":27590,"children":27591},{},[27592],{"type":23,"value":26530},{"type":17,"tag":84,"props":27594,"children":27595},{},[27596],{"type":23,"value":26535},{"type":17,"tag":29,"props":27598,"children":27599},{},[27600],{"type":23,"value":27601},"Messaging (17 integrations)",{"type":17,"tag":80,"props":27603,"children":27604},{},[27605,27609,27613,27617],{"type":17,"tag":84,"props":27606,"children":27607},{},[27608],{"type":23,"value":3204},{"type":17,"tag":84,"props":27610,"children":27611},{},[27612],{"type":23,"value":14878},{"type":17,"tag":84,"props":27614,"children":27615},{},[27616],{"type":23,"value":14066},{"type":17,"tag":84,"props":27618,"children":27619},{},[27620],{"type":23,"value":27621},"Outlook",{"type":17,"tag":29,"props":27623,"children":27624},{},[27625],{"type":23,"value":27626},"This allows notification systems to work across many customer environments.",{"type":17,"tag":68,"props":27628,"children":27629},{"id":883},[27630],{"type":23,"value":19178},{"type":17,"tag":29,"props":27632,"children":27633},{},[27634],{"type":23,"value":27635},"Account-based notifications require monitoring CRM data and delivering alerts through messaging platforms.",{"type":17,"tag":29,"props":27637,"children":27638},{},[27639],{"type":23,"value":27640},"Without a unified approach, developers must build separate integrations and handle different event models.",{"type":17,"tag":29,"props":27642,"children":27643},{},[27644],{"type":23,"value":25437},{"type":17,"tag":80,"props":27646,"children":27647},{},[27648,27653,27658,27663],{"type":17,"tag":84,"props":27649,"children":27650},{},[27651],{"type":23,"value":27652},"consistent CRM and messaging APIs",{"type":17,"tag":84,"props":27654,"children":27655},{},[27656],{"type":23,"value":27657},"real-time data access",{"type":17,"tag":84,"props":27659,"children":27660},{},[27661],{"type":23,"value":27662},"unified event handling",{"type":17,"tag":84,"props":27664,"children":27665},{},[27666],{"type":23,"value":27667},"simplified notification delivery",{"type":17,"tag":29,"props":27669,"children":27670},{},[27671],{"type":23,"value":27672},"This allows product teams to build notification features that keep users informed without managing integration complexity.",{"type":17,"tag":29,"props":27674,"children":27675},{},[27676],{"type":23,"value":27677},"Start building account-based notifications across CRM and messaging platforms today. Sign up for a free trial or request a demo to see how Unified can power your product.",{"type":17,"tag":29,"props":27679,"children":27680},{},[27681,27682],{"type":23,"value":1609},{"type":17,"tag":133,"props":27683,"children":27685},{"href":1612,"rel":27684},[214],[27686],{"type":23,"value":1616},{"type":17,"tag":29,"props":27688,"children":27689},{},[27690,27691],{"type":23,"value":1609},{"type":17,"tag":133,"props":27692,"children":27694},{"href":1623,"rel":27693},[214],[27695],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":27697},[27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709],{"id":26690,"depth":1629,"text":26693},{"id":26789,"depth":1629,"text":26792},{"id":24499,"depth":1629,"text":24502},{"id":26935,"depth":1629,"text":26938},{"id":27075,"depth":1629,"text":27078},{"id":27181,"depth":1629,"text":27184},{"id":27237,"depth":1629,"text":27240},{"id":27343,"depth":1629,"text":27346},{"id":27434,"depth":1629,"text":27437},{"id":27510,"depth":1629,"text":27513},{"id":25342,"depth":1629,"text":25345},{"id":883,"depth":1629,"text":19178},"content:blog:how_to_build_account_based_notifications_across_crm_and_messaging_platforms.md","blog/how_to_build_account_based_notifications_across_crm_and_messaging_platforms.md","blog/how_to_build_account_based_notifications_across_crm_and_messaging_platforms",{"_path":27714,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":27715,"description":27716,"img":27717,"date":26655,"tag":12,"body":27718,"_type":1677,"_id":28866,"_source":1679,"_file":28867,"_stem":28868,"_extension":1682},"/blog/how_to_build_customer_health_scoring_using_crm_support_and_billing_data","How to Build Customer Health Scoring Using CRM, Support, and Billing Data","Customer health scoring is a feature inside a SaaS product that evaluates the status of a customer account using signals from CRM, support activity, and...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_customer_health_scoring_using_crm_support_and_billing_data-icon.png",{"type":14,"children":27719,"toc":28844},[27720,27725,27728,27735,27740,27745,27750,27756,27761,27765,27792,27796,27814,27819,27825,27830,27838,27843,27851,27856,27864,27869,27877,27882,27890,27895,27899,27904,27975,27980,27984,27988,27993,28079,28084,28088,28093,28135,28140,28163,28168,28172,28177,28232,28236,28259,28264,28268,28273,28277,28302,28306,28314,28318,28324,28329,28333,28342,28346,28354,28358,28366,28370,28376,28381,28387,28418,28424,28440,28446,28470,28475,28481,28486,28495,28500,28533,28538,28561,28567,28572,28579,28584,28592,28597,28605,28610,28618,28623,28630,28635,28642,28647,28653,28658,28663,28667,28685,28696,28700,28704,28708,28712,28731,28736,28751,28756,28771,28776,28780,28785,28790,28794,28816,28821,28826,28835],{"type":17,"tag":18,"props":27721,"children":27723},{"id":27722},"how-to-build-customer-health-scoring-using-crm-support-and-billing-data",[27724],{"type":23,"value":27715},{"type":17,"tag":25,"props":27726,"children":27727},{},[],{"type":17,"tag":29,"props":27729,"children":27730},{},[27731],{"type":17,"tag":33,"props":27732,"children":27733},{},[27734],{"type":23,"value":19372},{"type":17,"tag":29,"props":27736,"children":27737},{},[27738],{"type":23,"value":27739},"Customer health scoring is a feature inside a SaaS product that evaluates the status of a customer account using signals from CRM, support activity, and billing data. It helps teams identify which accounts are healthy, at risk, or likely to churn.",{"type":17,"tag":29,"props":27741,"children":27742},{},[27743],{"type":23,"value":27744},"To build this, your product needs access to multiple data sources at once. Account data lives in CRM platforms like Salesforce or HubSpot, support interactions are tracked in tools like Zendesk, and billing data is managed in systems like Stripe.",{"type":17,"tag":29,"props":27746,"children":27747},{},[27748],{"type":23,"value":27749},"Each platform exposes different APIs and schemas. Unified provides category-specific APIs that allow your product to retrieve CRM, ticketing, and payment data through consistent objects, making it possible to compute health scores without building separate integrations for each provider.",{"type":17,"tag":68,"props":27751,"children":27753},{"id":27752},"why-saas-products-build-customer-health-scoring",[27754],{"type":23,"value":27755},"Why SaaS Products Build Customer Health Scoring",{"type":17,"tag":29,"props":27757,"children":27758},{},[27759],{"type":23,"value":27760},"Customer health scoring is a core capability in many B2B SaaS products.",{"type":17,"tag":29,"props":27762,"children":27763},{},[27764],{"type":23,"value":24364},{"type":17,"tag":80,"props":27766,"children":27767},{},[27768,27772,27777,27782,27787],{"type":17,"tag":84,"props":27769,"children":27770},{},[27771],{"type":23,"value":24382},{"type":17,"tag":84,"props":27773,"children":27774},{},[27775],{"type":23,"value":27776},"Revenue intelligence tools",{"type":17,"tag":84,"props":27778,"children":27779},{},[27780],{"type":23,"value":27781},"Churn prediction products",{"type":17,"tag":84,"props":27783,"children":27784},{},[27785],{"type":23,"value":27786},"Account management tools",{"type":17,"tag":84,"props":27788,"children":27789},{},[27790],{"type":23,"value":27791},"AI customer assistants",{"type":17,"tag":29,"props":27793,"children":27794},{},[27795],{"type":23,"value":24397},{"type":17,"tag":80,"props":27797,"children":27798},{},[27799,27804,27809],{"type":17,"tag":84,"props":27800,"children":27801},{},[27802],{"type":23,"value":27803},"'Which accounts are at risk?'",{"type":17,"tag":84,"props":27805,"children":27806},{},[27807],{"type":23,"value":27808},"'Which customers are highly engaged?'",{"type":17,"tag":84,"props":27810,"children":27811},{},[27812],{"type":23,"value":27813},"'Who should we prioritize this week?'",{"type":17,"tag":29,"props":27815,"children":27816},{},[27817],{"type":23,"value":27818},"Without a unified view of CRM, support, and billing data, these insights require manual analysis across multiple tools.",{"type":17,"tag":68,"props":27820,"children":27822},{"id":27821},"common-customer-health-use-cases",[27823],{"type":23,"value":27824},"Common Customer Health Use Cases",{"type":17,"tag":29,"props":27826,"children":27827},{},[27828],{"type":23,"value":27829},"Customer health scoring typically supports several workflows.",{"type":17,"tag":29,"props":27831,"children":27832},{},[27833],{"type":17,"tag":48,"props":27834,"children":27835},{},[27836],{"type":23,"value":27837},"Churn prediction",{"type":17,"tag":29,"props":27839,"children":27840},{},[27841],{"type":23,"value":27842},"Identify accounts with declining activity or negative signals.",{"type":17,"tag":29,"props":27844,"children":27845},{},[27846],{"type":17,"tag":48,"props":27847,"children":27848},{},[27849],{"type":23,"value":27850},"Account prioritization",{"type":17,"tag":29,"props":27852,"children":27853},{},[27854],{"type":23,"value":27855},"Help customer success teams focus on high-risk or high-value accounts.",{"type":17,"tag":29,"props":27857,"children":27858},{},[27859],{"type":17,"tag":48,"props":27860,"children":27861},{},[27862],{"type":23,"value":27863},"Customer segmentation",{"type":17,"tag":29,"props":27865,"children":27866},{},[27867],{"type":23,"value":27868},"Group customers into health categories such as healthy, watch, or at risk.",{"type":17,"tag":29,"props":27870,"children":27871},{},[27872],{"type":17,"tag":48,"props":27873,"children":27874},{},[27875],{"type":23,"value":27876},"Renewal tracking",{"type":17,"tag":29,"props":27878,"children":27879},{},[27880],{"type":23,"value":27881},"Monitor subscription status and upcoming renewal risk.",{"type":17,"tag":29,"props":27883,"children":27884},{},[27885],{"type":17,"tag":48,"props":27886,"children":27887},{},[27888],{"type":23,"value":27889},"Engagement analysis",{"type":17,"tag":29,"props":27891,"children":27892},{},[27893],{"type":23,"value":27894},"Evaluate customer activity across support, sales, and communication channels.",{"type":17,"tag":68,"props":27896,"children":27897},{"id":24499},[27898],{"type":23,"value":24502},{"type":17,"tag":29,"props":27900,"children":27901},{},[27902],{"type":23,"value":27903},"Customer health scoring combines data from multiple categories.",{"type":17,"tag":7231,"props":27905,"children":27906},{},[27907,27925],{"type":17,"tag":7235,"props":27908,"children":27909},{},[27910],{"type":17,"tag":7239,"props":27911,"children":27912},{},[27913,27917,27921],{"type":17,"tag":7243,"props":27914,"children":27915},{},[27916],{"type":23,"value":7247},{"type":17,"tag":7243,"props":27918,"children":27919},{},[27920],{"type":23,"value":24525},{"type":17,"tag":7243,"props":27922,"children":27923},{},[27924],{"type":23,"value":24530},{"type":17,"tag":7259,"props":27926,"children":27927},{},[27928,27944,27960],{"type":17,"tag":7239,"props":27929,"children":27930},{},[27931,27935,27940],{"type":17,"tag":7266,"props":27932,"children":27933},{},[27934],{"type":23,"value":25731},{"type":17,"tag":7266,"props":27936,"children":27937},{},[27938],{"type":23,"value":27939},"Account, deal, and activity data from platforms like Salesforce",{"type":17,"tag":7266,"props":27941,"children":27942},{},[27943],{"type":23,"value":25741},{"type":17,"tag":7239,"props":27945,"children":27946},{},[27947,27951,27956],{"type":17,"tag":7266,"props":27948,"children":27949},{},[27950],{"type":23,"value":24541},{"type":17,"tag":7266,"props":27952,"children":27953},{},[27954],{"type":23,"value":27955},"Support interactions from platforms like Zendesk",{"type":17,"tag":7266,"props":27957,"children":27958},{},[27959],{"type":23,"value":24551},{"type":17,"tag":7239,"props":27961,"children":27962},{},[27963,27967,27971],{"type":17,"tag":7266,"props":27964,"children":27965},{},[27966],{"type":23,"value":11737},{"type":17,"tag":7266,"props":27968,"children":27969},{},[27970],{"type":23,"value":25753},{"type":17,"tag":7266,"props":27972,"children":27973},{},[27974],{"type":23,"value":25758},{"type":17,"tag":29,"props":27976,"children":27977},{},[27978],{"type":23,"value":27979},"Using category-specific APIs allows your product to retrieve data across these sources without writing provider-specific logic.",{"type":17,"tag":68,"props":27981,"children":27982},{"id":24613},[27983],{"type":23,"value":24616},{"type":17,"tag":239,"props":27985,"children":27986},{"id":25770},[27987],{"type":23,"value":25773},{"type":17,"tag":29,"props":27989,"children":27990},{},[27991],{"type":23,"value":27992},"CRM data provides account-level context and engagement history.",{"type":17,"tag":7231,"props":27994,"children":27995},{},[27996,28014],{"type":17,"tag":7235,"props":27997,"children":27998},{},[27999],{"type":17,"tag":7239,"props":28000,"children":28001},{},[28002,28006,28010],{"type":17,"tag":7243,"props":28003,"children":28004},{},[28005],{"type":23,"value":18594},{"type":17,"tag":7243,"props":28007,"children":28008},{},[28009],{"type":23,"value":22096},{"type":17,"tag":7243,"props":28011,"children":28012},{},[28013],{"type":23,"value":20787},{"type":17,"tag":7259,"props":28015,"children":28016},{},[28017,28032,28047,28063],{"type":17,"tag":7239,"props":28018,"children":28019},{},[28020,28024,28028],{"type":17,"tag":7266,"props":28021,"children":28022},{},[28023],{"type":23,"value":25828},{"type":17,"tag":7266,"props":28025,"children":28026},{},[28027],{"type":23,"value":27013},{"type":17,"tag":7266,"props":28029,"children":28030},{},[28031],{"type":23,"value":25838},{"type":17,"tag":7239,"props":28033,"children":28034},{},[28035,28039,28043],{"type":17,"tag":7266,"props":28036,"children":28037},{},[28038],{"type":23,"value":25846},{"type":17,"tag":7266,"props":28040,"children":28041},{},[28042],{"type":23,"value":25851},{"type":17,"tag":7266,"props":28044,"children":28045},{},[28046],{"type":23,"value":25856},{"type":17,"tag":7239,"props":28048,"children":28049},{},[28050,28054,28058],{"type":17,"tag":7266,"props":28051,"children":28052},{},[28053],{"type":23,"value":25810},{"type":17,"tag":7266,"props":28055,"children":28056},{},[28057],{"type":23,"value":26979},{"type":17,"tag":7266,"props":28059,"children":28060},{},[28061],{"type":23,"value":28062},"Pipeline context",{"type":17,"tag":7239,"props":28064,"children":28065},{},[28066,28070,28075],{"type":17,"tag":7266,"props":28067,"children":28068},{},[28069],{"type":23,"value":14528},{"type":17,"tag":7266,"props":28071,"children":28072},{},[28073],{"type":23,"value":28074},"type, created_at, contact_ids",{"type":17,"tag":7266,"props":28076,"children":28077},{},[28078],{"type":23,"value":25873},{"type":17,"tag":29,"props":28080,"children":28081},{},[28082],{"type":23,"value":28083},"These objects allow your product to measure sales activity and engagement.",{"type":17,"tag":239,"props":28085,"children":28086},{"id":24619},[28087],{"type":23,"value":24622},{"type":17,"tag":29,"props":28089,"children":28090},{},[28091],{"type":23,"value":28092},"Support data provides insight into customer experience.",{"type":17,"tag":7231,"props":28094,"children":28095},{},[28096,28114],{"type":17,"tag":7235,"props":28097,"children":28098},{},[28099],{"type":17,"tag":7239,"props":28100,"children":28101},{},[28102,28106,28110],{"type":17,"tag":7243,"props":28103,"children":28104},{},[28105],{"type":23,"value":18594},{"type":17,"tag":7243,"props":28107,"children":28108},{},[28109],{"type":23,"value":22096},{"type":17,"tag":7243,"props":28111,"children":28112},{},[28113],{"type":23,"value":20787},{"type":17,"tag":7259,"props":28115,"children":28116},{},[28117],{"type":17,"tag":7239,"props":28118,"children":28119},{},[28120,28125,28130],{"type":17,"tag":7266,"props":28121,"children":28122},{},[28123],{"type":23,"value":28124},"Ticket",{"type":17,"tag":7266,"props":28126,"children":28127},{},[28128],{"type":23,"value":28129},"subject, description, status, priority, created_at, updated_at",{"type":17,"tag":7266,"props":28131,"children":28132},{},[28133],{"type":23,"value":28134},"Support interactions",{"type":17,"tag":29,"props":28136,"children":28137},{},[28138],{"type":23,"value":28139},"Important signals include:",{"type":17,"tag":80,"props":28141,"children":28142},{},[28143,28148,28153,28158],{"type":17,"tag":84,"props":28144,"children":28145},{},[28146],{"type":23,"value":28147},"number of open tickets",{"type":17,"tag":84,"props":28149,"children":28150},{},[28151],{"type":23,"value":28152},"ticket resolution time",{"type":17,"tag":84,"props":28154,"children":28155},{},[28156],{"type":23,"value":28157},"ticket priority",{"type":17,"tag":84,"props":28159,"children":28160},{},[28161],{"type":23,"value":28162},"frequency of support requests",{"type":17,"tag":29,"props":28164,"children":28165},{},[28166],{"type":23,"value":28167},"These signals help identify frustrated or struggling customers.",{"type":17,"tag":239,"props":28169,"children":28170},{"id":25933},[28171],{"type":23,"value":25936},{"type":17,"tag":29,"props":28173,"children":28174},{},[28175],{"type":23,"value":28176},"Billing data provides financial signals.",{"type":17,"tag":7231,"props":28178,"children":28179},{},[28180,28198],{"type":17,"tag":7235,"props":28181,"children":28182},{},[28183],{"type":17,"tag":7239,"props":28184,"children":28185},{},[28186,28190,28194],{"type":17,"tag":7243,"props":28187,"children":28188},{},[28189],{"type":23,"value":18594},{"type":17,"tag":7243,"props":28191,"children":28192},{},[28193],{"type":23,"value":22096},{"type":17,"tag":7243,"props":28195,"children":28196},{},[28197],{"type":23,"value":20787},{"type":17,"tag":7259,"props":28199,"children":28200},{},[28201,28217],{"type":17,"tag":7239,"props":28202,"children":28203},{},[28204,28208,28212],{"type":17,"tag":7266,"props":28205,"children":28206},{},[28207],{"type":23,"value":25973},{"type":17,"tag":7266,"props":28209,"children":28210},{},[28211],{"type":23,"value":25978},{"type":17,"tag":7266,"props":28213,"children":28214},{},[28215],{"type":23,"value":28216},"Payment activity",{"type":17,"tag":7239,"props":28218,"children":28219},{},[28220,28224,28228],{"type":17,"tag":7266,"props":28221,"children":28222},{},[28223],{"type":23,"value":25991},{"type":17,"tag":7266,"props":28225,"children":28226},{},[28227],{"type":23,"value":25996},{"type":17,"tag":7266,"props":28229,"children":28230},{},[28231],{"type":23,"value":26001},{"type":17,"tag":29,"props":28233,"children":28234},{},[28235],{"type":23,"value":28139},{"type":17,"tag":80,"props":28237,"children":28238},{},[28239,28244,28249,28254],{"type":17,"tag":84,"props":28240,"children":28241},{},[28242],{"type":23,"value":28243},"active vs canceled subscriptions",{"type":17,"tag":84,"props":28245,"children":28246},{},[28247],{"type":23,"value":28248},"renewal dates",{"type":17,"tag":84,"props":28250,"children":28251},{},[28252],{"type":23,"value":28253},"payment activity",{"type":17,"tag":84,"props":28255,"children":28256},{},[28257],{"type":23,"value":28258},"billing frequency",{"type":17,"tag":29,"props":28260,"children":28261},{},[28262],{"type":23,"value":28263},"These signals help determine account stability.",{"type":17,"tag":68,"props":28265,"children":28266},{"id":24996},[28267],{"type":23,"value":24999},{"type":17,"tag":29,"props":28269,"children":28270},{},[28271],{"type":23,"value":28272},"Customers connect their CRM, support, and billing platforms using Unified Connect.",{"type":17,"tag":29,"props":28274,"children":28275},{},[28276],{"type":23,"value":26189},{"type":17,"tag":6154,"props":28278,"children":28279},{},[28280,28284,28289,28293],{"type":17,"tag":84,"props":28281,"children":28282},{},[28283],{"type":23,"value":25017},{"type":17,"tag":84,"props":28285,"children":28286},{},[28287],{"type":23,"value":28288},"The user selects integrations such as Salesforce, Zendesk, or Stripe.",{"type":17,"tag":84,"props":28290,"children":28291},{},[28292],{"type":23,"value":25027},{"type":17,"tag":84,"props":28294,"children":28295},{},[28296,28297,28301],{"type":23,"value":25032},{"type":17,"tag":48,"props":28298,"children":28299},{},[28300],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":28303,"children":28304},{},[28305],{"type":23,"value":25043},{"type":17,"tag":6893,"props":28307,"children":28309},{"className":28308,"code":25047,"language":20901,"meta":23},[20899],[28310],{"type":17,"tag":6121,"props":28311,"children":28312},{"__ignoreMap":7},[28313],{"type":23,"value":25047},{"type":17,"tag":29,"props":28315,"children":28316},{},[28317],{"type":23,"value":25057},{"type":17,"tag":68,"props":28319,"children":28321},{"id":28320},"retrieving-customer-data",[28322],{"type":23,"value":28323},"Retrieving Customer Data",{"type":17,"tag":29,"props":28325,"children":28326},{},[28327],{"type":23,"value":28328},"Your application retrieves data from each category using Unified endpoints.",{"type":17,"tag":29,"props":28330,"children":28331},{},[28332],{"type":23,"value":26246},{"type":17,"tag":6893,"props":28334,"children":28337},{"className":28335,"code":28336,"language":20901,"meta":23},[20899],"GET /crm/{connection_id}/contact\nGET /crm/{connection_id}/company\nGET /crm/{connection_id}/deal\nGET /crm/{connection_id}/event\n",[28338],{"type":17,"tag":6121,"props":28339,"children":28340},{"__ignoreMap":7},[28341],{"type":23,"value":28336},{"type":17,"tag":29,"props":28343,"children":28344},{},[28345],{"type":23,"value":25073},{"type":17,"tag":6893,"props":28347,"children":28349},{"className":28348,"code":25077,"language":20901,"meta":23},[20899],[28350],{"type":17,"tag":6121,"props":28351,"children":28352},{"__ignoreMap":7},[28353],{"type":23,"value":25077},{"type":17,"tag":29,"props":28355,"children":28356},{},[28357],{"type":23,"value":26260},{"type":17,"tag":6893,"props":28359,"children":28361},{"className":28360,"code":26264,"language":20901,"meta":23},[20899],[28362],{"type":17,"tag":6121,"props":28363,"children":28364},{"__ignoreMap":7},[28365],{"type":23,"value":26264},{"type":17,"tag":29,"props":28367,"children":28368},{},[28369],{"type":23,"value":26274},{"type":17,"tag":68,"props":28371,"children":28373},{"id":28372},"mapping-data-to-health-signals",[28374],{"type":23,"value":28375},"Mapping Data to Health Signals",{"type":17,"tag":29,"props":28377,"children":28378},{},[28379],{"type":23,"value":28380},"Customer health scores are built by combining signals across categories.",{"type":17,"tag":239,"props":28382,"children":28384},{"id":28383},"crm-signals",[28385],{"type":23,"value":28386},"CRM signals",{"type":17,"tag":80,"props":28388,"children":28389},{},[28390,28402,28413],{"type":17,"tag":84,"props":28391,"children":28392},{},[28393,28395,28401],{"type":23,"value":28394},"recent activity (",{"type":17,"tag":6121,"props":28396,"children":28398},{"className":28397},[],[28399],{"type":23,"value":28400},"event.created_at",{"type":23,"value":12034},{"type":17,"tag":84,"props":28403,"children":28404},{},[28405,28407,28412],{"type":23,"value":28406},"deal progression (",{"type":17,"tag":6121,"props":28408,"children":28410},{"className":28409},[],[28411],{"type":23,"value":25923},{"type":23,"value":12034},{"type":17,"tag":84,"props":28414,"children":28415},{},[28416],{"type":23,"value":28417},"engagement frequency",{"type":17,"tag":239,"props":28419,"children":28421},{"id":28420},"support-signals",[28422],{"type":23,"value":28423},"Support signals",{"type":17,"tag":80,"props":28425,"children":28426},{},[28427,28431,28435],{"type":17,"tag":84,"props":28428,"children":28429},{},[28430],{"type":23,"value":28147},{"type":17,"tag":84,"props":28432,"children":28433},{},[28434],{"type":23,"value":28157},{"type":17,"tag":84,"props":28436,"children":28437},{},[28438],{"type":23,"value":28439},"time to resolution",{"type":17,"tag":239,"props":28441,"children":28443},{"id":28442},"billing-signals",[28444],{"type":23,"value":28445},"Billing signals",{"type":17,"tag":80,"props":28447,"children":28448},{},[28449,28454,28465],{"type":17,"tag":84,"props":28450,"children":28451},{},[28452],{"type":23,"value":28453},"subscription status",{"type":17,"tag":84,"props":28455,"children":28456},{},[28457,28459,28464],{"type":23,"value":28458},"upcoming renewal (",{"type":17,"tag":6121,"props":28460,"children":28462},{"className":28461},[],[28463],{"type":23,"value":26036},{"type":23,"value":12034},{"type":17,"tag":84,"props":28466,"children":28467},{},[28468],{"type":23,"value":28469},"recent payments",{"type":17,"tag":29,"props":28471,"children":28472},{},[28473],{"type":23,"value":28474},"These signals are combined to create a health score.",{"type":17,"tag":68,"props":28476,"children":28478},{"id":28477},"example-health-score-model",[28479],{"type":23,"value":28480},"Example Health Score Model",{"type":17,"tag":29,"props":28482,"children":28483},{},[28484],{"type":23,"value":28485},"A simple scoring model might look like this:",{"type":17,"tag":6893,"props":28487,"children":28490},{"className":28488,"code":28489,"language":20901,"meta":23},[20899],"health_score = (engagement_score * 0.4) + (support_score * 0.3) + (billing_score * 0.3)\n",[28491],{"type":17,"tag":6121,"props":28492,"children":28493},{"__ignoreMap":7},[28494],{"type":23,"value":28489},{"type":17,"tag":29,"props":28496,"children":28497},{},[28498],{"type":23,"value":28499},"Where:",{"type":17,"tag":80,"props":28501,"children":28502},{},[28503,28513,28523],{"type":17,"tag":84,"props":28504,"children":28505},{},[28506,28511],{"type":17,"tag":48,"props":28507,"children":28508},{},[28509],{"type":23,"value":28510},"engagement_score",{"type":23,"value":28512}," is based on CRM activity",{"type":17,"tag":84,"props":28514,"children":28515},{},[28516,28521],{"type":17,"tag":48,"props":28517,"children":28518},{},[28519],{"type":23,"value":28520},"support_score",{"type":23,"value":28522}," is based on ticket behavior",{"type":17,"tag":84,"props":28524,"children":28525},{},[28526,28531],{"type":17,"tag":48,"props":28527,"children":28528},{},[28529],{"type":23,"value":28530},"billing_score",{"type":23,"value":28532}," is based on subscription status",{"type":17,"tag":29,"props":28534,"children":28535},{},[28536],{"type":23,"value":28537},"Example rules:",{"type":17,"tag":80,"props":28539,"children":28540},{},[28541,28546,28551,28556],{"type":17,"tag":84,"props":28542,"children":28543},{},[28544],{"type":23,"value":28545},"Active subscription → positive signal",{"type":17,"tag":84,"props":28547,"children":28548},{},[28549],{"type":23,"value":28550},"Overdue or canceled subscription → negative signal",{"type":17,"tag":84,"props":28552,"children":28553},{},[28554],{"type":23,"value":28555},"High ticket volume → negative signal",{"type":17,"tag":84,"props":28557,"children":28558},{},[28559],{"type":23,"value":28560},"Recent activity → positive signal",{"type":17,"tag":68,"props":28562,"children":28564},{"id":28563},"building-a-health-scoring-pipeline",[28565],{"type":23,"value":28566},"Building a Health Scoring Pipeline",{"type":17,"tag":29,"props":28568,"children":28569},{},[28570],{"type":23,"value":28571},"A typical implementation follows these steps.",{"type":17,"tag":29,"props":28573,"children":28574},{},[28575],{"type":17,"tag":48,"props":28576,"children":28577},{},[28578],{"type":23,"value":25145},{"type":17,"tag":29,"props":28580,"children":28581},{},[28582],{"type":23,"value":28583},"Fetch CRM, ticketing, and billing data using Unified APIs.",{"type":17,"tag":29,"props":28585,"children":28586},{},[28587],{"type":17,"tag":48,"props":28588,"children":28589},{},[28590],{"type":23,"value":28591},"2. Aggregate signals",{"type":17,"tag":29,"props":28593,"children":28594},{},[28595],{"type":23,"value":28596},"Group data by account using contact and company relationships.",{"type":17,"tag":29,"props":28598,"children":28599},{},[28600],{"type":17,"tag":48,"props":28601,"children":28602},{},[28603],{"type":23,"value":28604},"3. Calculate metrics",{"type":17,"tag":29,"props":28606,"children":28607},{},[28608],{"type":23,"value":28609},"Compute engagement, support, and billing indicators.",{"type":17,"tag":29,"props":28611,"children":28612},{},[28613],{"type":17,"tag":48,"props":28614,"children":28615},{},[28616],{"type":23,"value":28617},"4. Generate scores",{"type":17,"tag":29,"props":28619,"children":28620},{},[28621],{"type":23,"value":28622},"Apply a scoring model to produce a health score.",{"type":17,"tag":29,"props":28624,"children":28625},{},[28626],{"type":17,"tag":48,"props":28627,"children":28628},{},[28629],{"type":23,"value":26374},{"type":17,"tag":29,"props":28631,"children":28632},{},[28633],{"type":23,"value":28634},"Persist scores in your application database.",{"type":17,"tag":29,"props":28636,"children":28637},{},[28638],{"type":17,"tag":48,"props":28639,"children":28640},{},[28641],{"type":23,"value":26387},{"type":17,"tag":29,"props":28643,"children":28644},{},[28645],{"type":23,"value":28646},"Show health indicators in dashboards or account views.",{"type":17,"tag":68,"props":28648,"children":28650},{"id":28649},"keeping-health-scores-updated",[28651],{"type":23,"value":28652},"Keeping Health Scores Updated",{"type":17,"tag":29,"props":28654,"children":28655},{},[28656],{"type":23,"value":28657},"Customer data changes frequently, so scores must be recalculated regularly.",{"type":17,"tag":29,"props":28659,"children":28660},{},[28661],{"type":23,"value":28662},"Unified provides event-based updates across categories.",{"type":17,"tag":29,"props":28664,"children":28665},{},[28666],{"type":23,"value":24364},{"type":17,"tag":80,"props":28668,"children":28669},{},[28670,28675,28680],{"type":17,"tag":84,"props":28671,"children":28672},{},[28673],{"type":23,"value":28674},"CRM updates (deal changes, new activity)",{"type":17,"tag":84,"props":28676,"children":28677},{},[28678],{"type":23,"value":28679},"ticket updates (new or resolved tickets)",{"type":17,"tag":84,"props":28681,"children":28682},{},[28683],{"type":23,"value":28684},"payment and subscription changes",{"type":17,"tag":29,"props":28686,"children":28687},{},[28688,28690,28695],{"type":23,"value":28689},"Applications can subscribe to webhook events or use timestamps such as ",{"type":17,"tag":6121,"props":28691,"children":28693},{"className":28692},[],[28694],{"type":23,"value":25337},{"type":23,"value":26500},{"type":17,"tag":68,"props":28697,"children":28698},{"id":25342},[28699],{"type":23,"value":25345},{"type":17,"tag":29,"props":28701,"children":28702},{},[28703],{"type":23,"value":27573},{"type":17,"tag":29,"props":28705,"children":28706},{},[28707],{"type":23,"value":24364},{"type":17,"tag":29,"props":28709,"children":28710},{},[28711],{"type":23,"value":26514},{"type":17,"tag":80,"props":28713,"children":28714},{},[28715,28719,28723,28727],{"type":17,"tag":84,"props":28716,"children":28717},{},[28718],{"type":23,"value":3179},{"type":17,"tag":84,"props":28720,"children":28721},{},[28722],{"type":23,"value":3184},{"type":17,"tag":84,"props":28724,"children":28725},{},[28726],{"type":23,"value":26530},{"type":17,"tag":84,"props":28728,"children":28729},{},[28730],{"type":23,"value":26535},{"type":17,"tag":29,"props":28732,"children":28733},{},[28734],{"type":23,"value":28735},"Ticketing platforms",{"type":17,"tag":80,"props":28737,"children":28738},{},[28739,28743,28747],{"type":17,"tag":84,"props":28740,"children":28741},{},[28742],{"type":23,"value":15738},{"type":17,"tag":84,"props":28744,"children":28745},{},[28746],{"type":23,"value":25370},{"type":17,"tag":84,"props":28748,"children":28749},{},[28750],{"type":23,"value":25375},{"type":17,"tag":29,"props":28752,"children":28753},{},[28754],{"type":23,"value":28755},"Payments platforms (16 integrations)",{"type":17,"tag":80,"props":28757,"children":28758},{},[28759,28763,28767],{"type":17,"tag":84,"props":28760,"children":28761},{},[28762],{"type":23,"value":26548},{"type":17,"tag":84,"props":28764,"children":28765},{},[28766],{"type":23,"value":26553},{"type":17,"tag":84,"props":28768,"children":28769},{},[28770],{"type":23,"value":14193},{"type":17,"tag":29,"props":28772,"children":28773},{},[28774],{"type":23,"value":28775},"This allows customer success tools to support many customer environments.",{"type":17,"tag":68,"props":28777,"children":28778},{"id":883},[28779],{"type":23,"value":19178},{"type":17,"tag":29,"props":28781,"children":28782},{},[28783],{"type":23,"value":28784},"Customer health scoring requires combining data from multiple platforms.",{"type":17,"tag":29,"props":28786,"children":28787},{},[28788],{"type":23,"value":28789},"Without a unified approach, developers must build separate integrations for CRM, support, and billing systems.",{"type":17,"tag":29,"props":28791,"children":28792},{},[28793],{"type":23,"value":25437},{"type":17,"tag":80,"props":28795,"children":28796},{},[28797,28802,28807,28811],{"type":17,"tag":84,"props":28798,"children":28799},{},[28800],{"type":23,"value":28801},"normalized objects across CRM, ticketing, and payments",{"type":17,"tag":84,"props":28803,"children":28804},{},[28805],{"type":23,"value":28806},"consistent API endpoints for retrieving data",{"type":17,"tag":84,"props":28808,"children":28809},{},[28810],{"type":23,"value":26593},{"type":17,"tag":84,"props":28812,"children":28813},{},[28814],{"type":23,"value":28815},"unified authentication and webhook support",{"type":17,"tag":29,"props":28817,"children":28818},{},[28819],{"type":23,"value":28820},"This allows product teams to build customer success features without managing integration complexity.",{"type":17,"tag":29,"props":28822,"children":28823},{},[28824],{"type":23,"value":28825},"Start building customer health scoring across CRM, support, and billing platforms today.",{"type":17,"tag":29,"props":28827,"children":28828},{},[28829,28830],{"type":23,"value":1609},{"type":17,"tag":133,"props":28831,"children":28833},{"href":1612,"rel":28832},[214],[28834],{"type":23,"value":1616},{"type":17,"tag":29,"props":28836,"children":28837},{},[28838,28839],{"type":23,"value":1609},{"type":17,"tag":133,"props":28840,"children":28842},{"href":1623,"rel":28841},[214],[28843],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":28845},[28846,28847,28848,28849,28854,28855,28856,28861,28862,28863,28864,28865],{"id":27752,"depth":1629,"text":27755},{"id":27821,"depth":1629,"text":27824},{"id":24499,"depth":1629,"text":24502},{"id":24613,"depth":1629,"text":24616,"children":28850},[28851,28852,28853],{"id":25770,"depth":1635,"text":25773},{"id":24619,"depth":1635,"text":24622},{"id":25933,"depth":1635,"text":25936},{"id":24996,"depth":1629,"text":24999},{"id":28320,"depth":1629,"text":28323},{"id":28372,"depth":1629,"text":28375,"children":28857},[28858,28859,28860],{"id":28383,"depth":1635,"text":28386},{"id":28420,"depth":1635,"text":28423},{"id":28442,"depth":1635,"text":28445},{"id":28477,"depth":1629,"text":28480},{"id":28563,"depth":1629,"text":28566},{"id":28649,"depth":1629,"text":28652},{"id":25342,"depth":1629,"text":25345},{"id":883,"depth":1629,"text":19178},"content:blog:how_to_build_customer_health_scoring_using_crm_support_and_billing_data.md","blog/how_to_build_customer_health_scoring_using_crm_support_and_billing_data.md","blog/how_to_build_customer_health_scoring_using_crm_support_and_billing_data",{"_path":28870,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":28871,"description":28872,"img":28873,"date":28874,"tag":12,"body":28875,"_type":1677,"_id":30316,"_source":1679,"_file":30317,"_stem":30318,"_extension":1682},"/blog/25_file_storage_apis_to_integrate_with_in_2026_google_drive_dropbox_s3_and_unified_storage_apis","25 File Storage APIs to Integrate With in 2026: Google Drive, Dropbox, S3, and Unified Storage APIs","File storage is one of the most commonly integrated categories in SaaS.","https://s3.us-east-2.amazonaws.com/unified-article-images/25_file_storage_apis_to_integrate_with_in_2026_google_drive_dropbox_s3_and_unified_storage_apis-icon.png","2026-03-24T00:18:00.000Z",{"type":14,"children":28876,"toc":30282},[28877,28882,28885,28892,28896,28941,28946,28964,28970,28983,28987,29018,29022,29059,29065,29070,29075,29103,29107,29114,29119,29127,29132,29140,29145,29153,29158,29166,29171,29177,29182,29188,29197,29202,29206,29229,29235,29244,29249,29253,29271,29277,29286,29291,29295,29313,29319,29328,29333,29337,29354,29360,29369,29374,29378,29396,29402,29411,29416,29420,29443,29449,29458,29463,29467,29485,29491,29501,29506,29510,29527,29533,29543,29548,29552,29565,29571,29580,29585,29589,29605,29611,29619,29624,29628,29646,29652,29662,29667,29671,29689,29695,29700,29743,29748,29754,29759,29765,29770,29787,29792,29798,29803,29820,29826,29831,29853,29858,29864,29869,29873,29878,29896,29902,29907,29912,29916,29936,29941,29947,29966,29970,30006,30012,30017,30041,30045,30068,30072,30076,30094,30103,30107,30129,30139,30144,30148,30152,30183,30188,30194,30199,30203,30229,30234,30239,30243,30248,30253,30264,30273],{"type":17,"tag":18,"props":28878,"children":28880},{"id":28879},"_25-file-storage-apis-to-integrate-with-in-2026-google-drive-dropbox-s3-and-unified-storage-apis",[28881],{"type":23,"value":28871},{"type":17,"tag":25,"props":28883,"children":28884},{},[],{"type":17,"tag":29,"props":28886,"children":28887},{},[28888],{"type":17,"tag":33,"props":28889,"children":28890},{},[28891],{"type":23,"value":19372},{"type":17,"tag":29,"props":28893,"children":28894},{},[28895],{"type":23,"value":28872},{"type":17,"tag":29,"props":28897,"children":28898},{},[28899,28901,28908,28909,28916,28917,28924,28925,28932,28933,28940],{"type":23,"value":28900},"Documents, contracts, media, reports, and internal knowledge all live across tools like ",{"type":17,"tag":133,"props":28902,"children":28905},{"href":28903,"rel":28904},"https://developers.google.com/drive/api",[214],[28906],{"type":23,"value":28907},"Google Drive",{"type":23,"value":11826},{"type":17,"tag":133,"props":28910,"children":28913},{"href":28911,"rel":28912},"https://www.dropbox.com/developers/documentation/http/documentation",[214],[28914],{"type":23,"value":28915},"Dropbox",{"type":23,"value":11826},{"type":17,"tag":133,"props":28918,"children":28921},{"href":28919,"rel":28920},"https://learn.microsoft.com/en-us/graph/api/resources/onedrive",[214],[28922],{"type":23,"value":28923},"Microsoft OneDrive",{"type":23,"value":11826},{"type":17,"tag":133,"props":28926,"children":28929},{"href":28927,"rel":28928},"https://developer.box.com/reference/",[214],[28930],{"type":23,"value":28931},"Box",{"type":23,"value":12561},{"type":17,"tag":133,"props":28934,"children":28937},{"href":28935,"rel":28936},"https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html",[214],[28938],{"type":23,"value":28939},"Amazon S3",{"type":23,"value":54},{"type":17,"tag":29,"props":28942,"children":28943},{},[28944],{"type":23,"value":28945},"As soon as your product needs to access or process documents across multiple systems, you run into a familiar problem: every storage platform has a different API, schema, auth model, and file structure.",{"type":17,"tag":29,"props":28947,"children":28948},{},[28949,28950,28955,28957,28962],{"type":23,"value":23079},{"type":17,"tag":48,"props":28951,"children":28952},{},[28953],{"type":23,"value":28954},"top file storage APIs to integrate with",{"type":23,"value":28956},", the main use cases, the challenges of building storage integrations directly, and why more teams are adopting ",{"type":17,"tag":48,"props":28958,"children":28959},{},[28960],{"type":23,"value":28961},"Unified Storage APIs",{"type":23,"value":28963}," to simplify document access and workflows.",{"type":17,"tag":68,"props":28965,"children":28967},{"id":28966},"what-is-a-file-storage-api",[28968],{"type":23,"value":28969},"What is a file storage API?",{"type":17,"tag":29,"props":28971,"children":28972},{},[28973,28975,28981],{"type":23,"value":28974},"A [file ",{"type":17,"tag":133,"props":28976,"children":28978},{"href":28977},"/storage",[28979],{"type":23,"value":28980},"storage API",{"type":23,"value":28982},"](/storage) allows developers to access and manage documents programmatically.",{"type":17,"tag":29,"props":28984,"children":28985},{},[28986],{"type":23,"value":23109},{"type":17,"tag":80,"props":28988,"children":28989},{},[28990,28995,28999,29003,29008,29013],{"type":17,"tag":84,"props":28991,"children":28992},{},[28993],{"type":23,"value":28994},"files and folders",{"type":17,"tag":84,"props":28996,"children":28997},{},[28998],{"type":23,"value":23792},{"type":17,"tag":84,"props":29000,"children":29001},{},[29002],{"type":23,"value":24204},{"type":17,"tag":84,"props":29004,"children":29005},{},[29006],{"type":23,"value":29007},"file content",{"type":17,"tag":84,"props":29009,"children":29010},{},[29011],{"type":23,"value":29012},"versioning",{"type":17,"tag":84,"props":29014,"children":29015},{},[29016],{"type":23,"value":29017},"sharing and access control",{"type":17,"tag":29,"props":29019,"children":29020},{},[29021],{"type":23,"value":23132},{"type":17,"tag":80,"props":29023,"children":29024},{},[29025,29030,29034,29044,29049,29054],{"type":17,"tag":84,"props":29026,"children":29027},{},[29028],{"type":23,"value":29029},"document management systems",{"type":17,"tag":84,"props":29031,"children":29032},{},[29033],{"type":23,"value":23140},{"type":17,"tag":84,"props":29035,"children":29036},{},[29037,29039,29043],{"type":23,"value":29038},"AI knowledge and ",{"type":17,"tag":133,"props":29040,"children":29041},{"href":5201},[29042],{"type":23,"value":5204},{"type":23,"value":16143},{"type":17,"tag":84,"props":29045,"children":29046},{},[29047],{"type":23,"value":29048},"backup and sync solutions",{"type":17,"tag":84,"props":29050,"children":29051},{},[29052],{"type":23,"value":29053},"collaboration tools",{"type":17,"tag":84,"props":29055,"children":29056},{},[29057],{"type":23,"value":29058},"contract and content platforms",{"type":17,"tag":68,"props":29060,"children":29062},{"id":29061},"why-saas-products-integrate-file-storage-apis",[29063],{"type":23,"value":29064},"Why SaaS products integrate file storage APIs",{"type":17,"tag":29,"props":29066,"children":29067},{},[29068],{"type":23,"value":29069},"File storage is rarely standalone.",{"type":17,"tag":29,"props":29071,"children":29072},{},[29073],{"type":23,"value":29074},"SaaS products often connect storage platforms with:",{"type":17,"tag":80,"props":29076,"children":29077},{},[29078,29083,29088,29093,29098],{"type":17,"tag":84,"props":29079,"children":29080},{},[29081],{"type":23,"value":29082},"CRM and support systems",{"type":17,"tag":84,"props":29084,"children":29085},{},[29086],{"type":23,"value":29087},"analytics tools",{"type":17,"tag":84,"props":29089,"children":29090},{},[29091],{"type":23,"value":29092},"AI pipelines",{"type":17,"tag":84,"props":29094,"children":29095},{},[29096],{"type":23,"value":29097},"contract management systems",{"type":17,"tag":84,"props":29099,"children":29100},{},[29101],{"type":23,"value":29102},"internal knowledge bases",{"type":17,"tag":29,"props":29104,"children":29105},{},[29106],{"type":23,"value":12661},{"type":17,"tag":29,"props":29108,"children":29109},{},[29110],{"type":17,"tag":48,"props":29111,"children":29112},{},[29113],{"type":23,"value":23217},{"type":17,"tag":29,"props":29115,"children":29116},{},[29117],{"type":23,"value":29118},"Index and search documents across multiple platforms.",{"type":17,"tag":29,"props":29120,"children":29121},{},[29122],{"type":17,"tag":48,"props":29123,"children":29124},{},[29125],{"type":23,"value":29126},"AI document processing",{"type":17,"tag":29,"props":29128,"children":29129},{},[29130],{"type":23,"value":29131},"Feed documents into embeddings, RAG pipelines, or AI copilots.",{"type":17,"tag":29,"props":29133,"children":29134},{},[29135],{"type":17,"tag":48,"props":29136,"children":29137},{},[29138],{"type":23,"value":29139},"Document management",{"type":17,"tag":29,"props":29141,"children":29142},{},[29143],{"type":23,"value":29144},"Centralize file access and organization across systems.",{"type":17,"tag":29,"props":29146,"children":29147},{},[29148],{"type":17,"tag":48,"props":29149,"children":29150},{},[29151],{"type":23,"value":29152},"Backup and synchronization",{"type":17,"tag":29,"props":29154,"children":29155},{},[29156],{"type":23,"value":29157},"Sync files across platforms or create redundancy.",{"type":17,"tag":29,"props":29159,"children":29160},{},[29161],{"type":17,"tag":48,"props":29162,"children":29163},{},[29164],{"type":23,"value":29165},"Collaboration and workflows",{"type":17,"tag":29,"props":29167,"children":29168},{},[29169],{"type":23,"value":29170},"Enable editing, sharing, and version tracking across tools.",{"type":17,"tag":68,"props":29172,"children":29174},{"id":29173},"top-25-file-storage-apis-to-integrate-with",[29175],{"type":23,"value":29176},"Top 25 file storage APIs to integrate with",{"type":17,"tag":29,"props":29178,"children":29179},{},[29180],{"type":23,"value":29181},"Below are the most important file storage APIs SaaS teams commonly need to support.",{"type":17,"tag":239,"props":29183,"children":29185},{"id":29184},"_1-google-drive-api",[29186],{"type":23,"value":29187},"1. Google Drive API",{"type":17,"tag":29,"props":29189,"children":29190},{},[29191],{"type":17,"tag":133,"props":29192,"children":29194},{"href":28903,"rel":29193},[214],[29195],{"type":23,"value":29196},"Google Drive API documentation",{"type":17,"tag":29,"props":29198,"children":29199},{},[29200],{"type":23,"value":29201},"Google Drive is one of the most widely used storage platforms.",{"type":17,"tag":29,"props":29203,"children":29204},{},[29205],{"type":23,"value":15093},{"type":17,"tag":80,"props":29207,"children":29208},{},[29209,29214,29219,29224],{"type":17,"tag":84,"props":29210,"children":29211},{},[29212],{"type":23,"value":29213},"file access and search",{"type":17,"tag":84,"props":29215,"children":29216},{},[29217],{"type":23,"value":29218},"document management",{"type":17,"tag":84,"props":29220,"children":29221},{},[29222],{"type":23,"value":29223},"collaboration workflows",{"type":17,"tag":84,"props":29225,"children":29226},{},[29227],{"type":23,"value":29228},"AI data ingestion",{"type":17,"tag":239,"props":29230,"children":29232},{"id":29231},"_2-dropbox-api",[29233],{"type":23,"value":29234},"2. Dropbox API",{"type":17,"tag":29,"props":29236,"children":29237},{},[29238],{"type":17,"tag":133,"props":29239,"children":29241},{"href":28911,"rel":29240},[214],[29242],{"type":23,"value":29243},"Dropbox API documentation",{"type":17,"tag":29,"props":29245,"children":29246},{},[29247],{"type":23,"value":29248},"Dropbox is widely used for file storage and sharing.",{"type":17,"tag":29,"props":29250,"children":29251},{},[29252],{"type":23,"value":23339},{"type":17,"tag":80,"props":29254,"children":29255},{},[29256,29261,29266],{"type":17,"tag":84,"props":29257,"children":29258},{},[29259],{"type":23,"value":29260},"file storage and retrieval",{"type":17,"tag":84,"props":29262,"children":29263},{},[29264],{"type":23,"value":29265},"sharing and permissions",{"type":17,"tag":84,"props":29267,"children":29268},{},[29269],{"type":23,"value":29270},"synchronization workflows",{"type":17,"tag":239,"props":29272,"children":29274},{"id":29273},"_3-microsoft-onedrive-api",[29275],{"type":23,"value":29276},"3. Microsoft OneDrive API",{"type":17,"tag":29,"props":29278,"children":29279},{},[29280],{"type":17,"tag":133,"props":29281,"children":29283},{"href":28919,"rel":29282},[214],[29284],{"type":23,"value":29285},"Microsoft OneDrive API documentation",{"type":17,"tag":29,"props":29287,"children":29288},{},[29289],{"type":23,"value":29290},"OneDrive is part of the Microsoft ecosystem.",{"type":17,"tag":29,"props":29292,"children":29293},{},[29294],{"type":23,"value":15093},{"type":17,"tag":80,"props":29296,"children":29297},{},[29298,29303,29308],{"type":17,"tag":84,"props":29299,"children":29300},{},[29301],{"type":23,"value":29302},"enterprise document access",{"type":17,"tag":84,"props":29304,"children":29305},{},[29306],{"type":23,"value":29307},"collaboration",{"type":17,"tag":84,"props":29309,"children":29310},{},[29311],{"type":23,"value":29312},"file sync across Microsoft tools",{"type":17,"tag":239,"props":29314,"children":29316},{"id":29315},"_4-microsoft-sharepoint-api",[29317],{"type":23,"value":29318},"4. Microsoft SharePoint API",{"type":17,"tag":29,"props":29320,"children":29321},{},[29322],{"type":17,"tag":133,"props":29323,"children":29325},{"href":23537,"rel":29324},[214],[29326],{"type":23,"value":29327},"SharePoint API documentation",{"type":17,"tag":29,"props":29329,"children":29330},{},[29331],{"type":23,"value":29332},"SharePoint is heavily used for enterprise document management.",{"type":17,"tag":29,"props":29334,"children":29335},{},[29336],{"type":23,"value":23339},{"type":17,"tag":80,"props":29338,"children":29339},{},[29340,29345,29350],{"type":17,"tag":84,"props":29341,"children":29342},{},[29343],{"type":23,"value":29344},"document libraries",{"type":17,"tag":84,"props":29346,"children":29347},{},[29348],{"type":23,"value":29349},"enterprise content management",{"type":17,"tag":84,"props":29351,"children":29352},{},[29353],{"type":23,"value":23314},{"type":17,"tag":239,"props":29355,"children":29357},{"id":29356},"_5-box-api",[29358],{"type":23,"value":29359},"5. Box API",{"type":17,"tag":29,"props":29361,"children":29362},{},[29363],{"type":17,"tag":133,"props":29364,"children":29366},{"href":28927,"rel":29365},[214],[29367],{"type":23,"value":29368},"Box API documentation",{"type":17,"tag":29,"props":29370,"children":29371},{},[29372],{"type":23,"value":29373},"Box is popular for enterprise document storage and compliance-heavy workflows.",{"type":17,"tag":29,"props":29375,"children":29376},{},[29377],{"type":23,"value":23382},{"type":17,"tag":80,"props":29379,"children":29380},{},[29381,29386,29391],{"type":17,"tag":84,"props":29382,"children":29383},{},[29384],{"type":23,"value":29385},"secure document storage",{"type":17,"tag":84,"props":29387,"children":29388},{},[29389],{"type":23,"value":29390},"compliance and governance",{"type":17,"tag":84,"props":29392,"children":29393},{},[29394],{"type":23,"value":29395},"file sharing and permissions",{"type":17,"tag":239,"props":29397,"children":29399},{"id":29398},"_6-amazon-s3-api",[29400],{"type":23,"value":29401},"6. Amazon S3 API",{"type":17,"tag":29,"props":29403,"children":29404},{},[29405],{"type":17,"tag":133,"props":29406,"children":29408},{"href":28935,"rel":29407},[214],[29409],{"type":23,"value":29410},"Amazon S3 API documentation",{"type":17,"tag":29,"props":29412,"children":29413},{},[29414],{"type":23,"value":29415},"S3 is the default storage layer for many modern applications.",{"type":17,"tag":29,"props":29417,"children":29418},{},[29419],{"type":23,"value":23339},{"type":17,"tag":80,"props":29421,"children":29422},{},[29423,29428,29433,29438],{"type":17,"tag":84,"props":29424,"children":29425},{},[29426],{"type":23,"value":29427},"object storage",{"type":17,"tag":84,"props":29429,"children":29430},{},[29431],{"type":23,"value":29432},"media storage",{"type":17,"tag":84,"props":29434,"children":29435},{},[29436],{"type":23,"value":29437},"backups",{"type":17,"tag":84,"props":29439,"children":29440},{},[29441],{"type":23,"value":29442},"large-scale data storage",{"type":17,"tag":239,"props":29444,"children":29446},{"id":29445},"_7-github-api-repositories-files",[29447],{"type":23,"value":29448},"7. GitHub API (Repositories & Files)",{"type":17,"tag":29,"props":29450,"children":29451},{},[29452],{"type":17,"tag":133,"props":29453,"children":29455},{"href":12929,"rel":29454},[214],[29456],{"type":23,"value":29457},"GitHub API documentation",{"type":17,"tag":29,"props":29459,"children":29460},{},[29461],{"type":23,"value":29462},"GitHub is often used as a document and code storage system.",{"type":17,"tag":29,"props":29464,"children":29465},{},[29466],{"type":23,"value":15093},{"type":17,"tag":80,"props":29468,"children":29469},{},[29470,29475,29480],{"type":17,"tag":84,"props":29471,"children":29472},{},[29473],{"type":23,"value":29474},"repository file access",{"type":17,"tag":84,"props":29476,"children":29477},{},[29478],{"type":23,"value":29479},"version control workflows",{"type":17,"tag":84,"props":29481,"children":29482},{},[29483],{"type":23,"value":29484},"developer tooling",{"type":17,"tag":239,"props":29486,"children":29488},{"id":29487},"_8-asana-api",[29489],{"type":23,"value":29490},"8. Asana API",{"type":17,"tag":29,"props":29492,"children":29493},{},[29494],{"type":17,"tag":133,"props":29495,"children":29498},{"href":29496,"rel":29497},"https://developers.asana.com/docs",[214],[29499],{"type":23,"value":29500},"Asana API documentation",{"type":17,"tag":29,"props":29502,"children":29503},{},[29504],{"type":23,"value":29505},"Asana includes file attachments and project-related documents.",{"type":17,"tag":29,"props":29507,"children":29508},{},[29509],{"type":23,"value":23339},{"type":17,"tag":80,"props":29511,"children":29512},{},[29513,29518,29522],{"type":17,"tag":84,"props":29514,"children":29515},{},[29516],{"type":23,"value":29517},"project file access",{"type":17,"tag":84,"props":29519,"children":29520},{},[29521],{"type":23,"value":29223},{"type":17,"tag":84,"props":29523,"children":29524},{},[29525],{"type":23,"value":29526},"task-linked document retrieval",{"type":17,"tag":239,"props":29528,"children":29530},{"id":29529},"_9-atlassian-jira-api",[29531],{"type":23,"value":29532},"9. Atlassian Jira API",{"type":17,"tag":29,"props":29534,"children":29535},{},[29536],{"type":17,"tag":133,"props":29537,"children":29540},{"href":29538,"rel":29539},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/",[214],[29541],{"type":23,"value":29542},"Jira API documentation",{"type":17,"tag":29,"props":29544,"children":29545},{},[29546],{"type":23,"value":29547},"Jira includes attachments and documentation tied to issues.",{"type":17,"tag":29,"props":29549,"children":29550},{},[29551],{"type":23,"value":23382},{"type":17,"tag":80,"props":29553,"children":29554},{},[29555,29560],{"type":17,"tag":84,"props":29556,"children":29557},{},[29558],{"type":23,"value":29559},"document access within workflows",{"type":17,"tag":84,"props":29561,"children":29562},{},[29563],{"type":23,"value":29564},"engineering and support tooling",{"type":17,"tag":239,"props":29566,"children":29568},{"id":29567},"_10-clickup-api",[29569],{"type":23,"value":29570},"10. ClickUp API",{"type":17,"tag":29,"props":29572,"children":29573},{},[29574],{"type":17,"tag":133,"props":29575,"children":29577},{"href":12564,"rel":29576},[214],[29578],{"type":23,"value":29579},"ClickUp API documentation",{"type":17,"tag":29,"props":29581,"children":29582},{},[29583],{"type":23,"value":29584},"ClickUp combines project management and file storage.",{"type":17,"tag":29,"props":29586,"children":29587},{},[29588],{"type":23,"value":23339},{"type":17,"tag":80,"props":29590,"children":29591},{},[29592,29597,29601],{"type":17,"tag":84,"props":29593,"children":29594},{},[29595],{"type":23,"value":29596},"file attachments",{"type":17,"tag":84,"props":29598,"children":29599},{},[29600],{"type":23,"value":29307},{"type":17,"tag":84,"props":29602,"children":29603},{},[29604],{"type":23,"value":424},{"type":17,"tag":239,"props":29606,"children":29608},{"id":29607},"_11-dovetail-api",[29609],{"type":23,"value":29610},"11. Dovetail API",{"type":17,"tag":29,"props":29612,"children":29613},{},[29614],{"type":17,"tag":133,"props":29615,"children":29617},{"href":13026,"rel":29616},[214],[29618],{"type":23,"value":13030},{"type":17,"tag":29,"props":29620,"children":29621},{},[29622],{"type":23,"value":29623},"Dovetail is used for research and insights storage.",{"type":17,"tag":29,"props":29625,"children":29626},{},[29627],{"type":23,"value":15093},{"type":17,"tag":80,"props":29629,"children":29630},{},[29631,29636,29641],{"type":17,"tag":84,"props":29632,"children":29633},{},[29634],{"type":23,"value":29635},"qualitative research data",{"type":17,"tag":84,"props":29637,"children":29638},{},[29639],{"type":23,"value":29640},"document analysis",{"type":17,"tag":84,"props":29642,"children":29643},{},[29644],{"type":23,"value":29645},"knowledge management",{"type":17,"tag":239,"props":29647,"children":29649},{"id":29648},"_12-hubspot-files-api",[29650],{"type":23,"value":29651},"12. HubSpot Files API",{"type":17,"tag":29,"props":29653,"children":29654},{},[29655],{"type":17,"tag":133,"props":29656,"children":29659},{"href":29657,"rel":29658},"https://developers.hubspot.com/docs/api/overview",[214],[29660],{"type":23,"value":29661},"HubSpot API documentation",{"type":17,"tag":29,"props":29663,"children":29664},{},[29665],{"type":23,"value":29666},"HubSpot includes file storage tied to CRM and marketing.",{"type":17,"tag":29,"props":29668,"children":29669},{},[29670],{"type":23,"value":23339},{"type":17,"tag":80,"props":29672,"children":29673},{},[29674,29679,29684],{"type":17,"tag":84,"props":29675,"children":29676},{},[29677],{"type":23,"value":29678},"document storage linked to contacts",{"type":17,"tag":84,"props":29680,"children":29681},{},[29682],{"type":23,"value":29683},"marketing assets",{"type":17,"tag":84,"props":29685,"children":29686},{},[29687],{"type":23,"value":29688},"customer files",{"type":17,"tag":239,"props":29690,"children":29692},{"id":29691},"additional-file-storage-apis-teams-often-support",[29693],{"type":23,"value":29694},"Additional file storage APIs teams often support",{"type":17,"tag":29,"props":29696,"children":29697},{},[29698],{"type":23,"value":29699},"Depending on the product, teams may also integrate:",{"type":17,"tag":80,"props":29701,"children":29702},{},[29703,29711,29719,29727,29735],{"type":17,"tag":84,"props":29704,"children":29705},{},[29706],{"type":17,"tag":133,"props":29707,"children":29709},{"href":28919,"rel":29708},[214],[29710],{"type":23,"value":28923},{"type":17,"tag":84,"props":29712,"children":29713},{},[29714],{"type":17,"tag":133,"props":29715,"children":29717},{"href":28903,"rel":29716},[214],[29718],{"type":23,"value":28907},{"type":17,"tag":84,"props":29720,"children":29721},{},[29722],{"type":17,"tag":133,"props":29723,"children":29725},{"href":28911,"rel":29724},[214],[29726],{"type":23,"value":28915},{"type":17,"tag":84,"props":29728,"children":29729},{},[29730],{"type":17,"tag":133,"props":29731,"children":29733},{"href":28927,"rel":29732},[214],[29734],{"type":23,"value":28931},{"type":17,"tag":84,"props":29736,"children":29737},{},[29738],{"type":17,"tag":133,"props":29739,"children":29741},{"href":28935,"rel":29740},[214],[29742],{"type":23,"value":28939},{"type":17,"tag":29,"props":29744,"children":29745},{},[29746],{"type":23,"value":29747},"The storage ecosystem is broad, and requirements grow quickly once customers expect multi-platform support.",{"type":17,"tag":68,"props":29749,"children":29751},{"id":29750},"challenges-with-file-storage-api-integrations",[29752],{"type":23,"value":29753},"Challenges with file storage API integrations",{"type":17,"tag":29,"props":29755,"children":29756},{},[29757],{"type":23,"value":29758},"File storage integrations are deceptively complex.",{"type":17,"tag":239,"props":29760,"children":29762},{"id":29761},"different-file-and-folder-models",[29763],{"type":23,"value":29764},"Different file and folder models",{"type":17,"tag":29,"props":29766,"children":29767},{},[29768],{"type":23,"value":29769},"Some platforms use:",{"type":17,"tag":80,"props":29771,"children":29772},{},[29773,29778,29782],{"type":17,"tag":84,"props":29774,"children":29775},{},[29776],{"type":23,"value":29777},"hierarchical folders",{"type":17,"tag":84,"props":29779,"children":29780},{},[29781],{"type":23,"value":29427},{"type":17,"tag":84,"props":29783,"children":29784},{},[29785],{"type":23,"value":29786},"version-controlled repositories",{"type":17,"tag":29,"props":29788,"children":29789},{},[29790],{"type":23,"value":29791},"Each behaves differently.",{"type":17,"tag":239,"props":29793,"children":29795},{"id":29794},"permissions-and-access-control",[29796],{"type":23,"value":29797},"Permissions and access control",{"type":17,"tag":29,"props":29799,"children":29800},{},[29801],{"type":23,"value":29802},"Every platform has different:",{"type":17,"tag":80,"props":29804,"children":29805},{},[29806,29811,29815],{"type":17,"tag":84,"props":29807,"children":29808},{},[29809],{"type":23,"value":29810},"sharing models",{"type":17,"tag":84,"props":29812,"children":29813},{},[29814],{"type":23,"value":24204},{"type":17,"tag":84,"props":29816,"children":29817},{},[29818],{"type":23,"value":29819},"roles",{"type":17,"tag":239,"props":29821,"children":29823},{"id":29822},"file-formats-and-metadata",[29824],{"type":23,"value":29825},"File formats and metadata",{"type":17,"tag":29,"props":29827,"children":29828},{},[29829],{"type":23,"value":29830},"Handling:",{"type":17,"tag":80,"props":29832,"children":29833},{},[29834,29839,29843,29848],{"type":17,"tag":84,"props":29835,"children":29836},{},[29837],{"type":23,"value":29838},"file types",{"type":17,"tag":84,"props":29840,"children":29841},{},[29842],{"type":23,"value":23792},{"type":17,"tag":84,"props":29844,"children":29845},{},[29846],{"type":23,"value":29847},"previews",{"type":17,"tag":84,"props":29849,"children":29850},{},[29851],{"type":23,"value":29852},"versions",{"type":17,"tag":29,"props":29854,"children":29855},{},[29856],{"type":23,"value":29857},"varies widely.",{"type":17,"tag":239,"props":29859,"children":29861},{"id":29860},"large-file-handling",[29862],{"type":23,"value":29863},"Large file handling",{"type":17,"tag":29,"props":29865,"children":29866},{},[29867],{"type":23,"value":29868},"Uploads, downloads, and streaming introduce performance challenges.",{"type":17,"tag":239,"props":29870,"children":29871},{"id":16796},[29872],{"type":23,"value":16799},{"type":17,"tag":29,"props":29874,"children":29875},{},[29876],{"type":23,"value":29877},"Supporting multiple storage platforms means maintaining:",{"type":17,"tag":80,"props":29879,"children":29880},{},[29881,29886,29891],{"type":17,"tag":84,"props":29882,"children":29883},{},[29884],{"type":23,"value":29885},"different APIs",{"type":17,"tag":84,"props":29887,"children":29888},{},[29889],{"type":23,"value":29890},"different auth flows",{"type":17,"tag":84,"props":29892,"children":29893},{},[29894],{"type":23,"value":29895},"different data structures",{"type":17,"tag":68,"props":29897,"children":29899},{"id":29898},"the-role-of-unified-storage-apis",[29900],{"type":23,"value":29901},"The role of Unified Storage APIs",{"type":17,"tag":29,"props":29903,"children":29904},{},[29905],{"type":23,"value":29906},"This is where Unified Storage APIs become valuable.",{"type":17,"tag":29,"props":29908,"children":29909},{},[29910],{"type":23,"value":29911},"Instead of building separate integrations for Google Drive, Dropbox, OneDrive, Box, S3, and others, a Unified API provides one interface across all of them.",{"type":17,"tag":29,"props":29913,"children":29914},{},[29915],{"type":23,"value":5804},{"type":17,"tag":80,"props":29917,"children":29918},{},[29919,29923,29927,29932],{"type":17,"tag":84,"props":29920,"children":29921},{},[29922],{"type":23,"value":23897},{"type":17,"tag":84,"props":29924,"children":29925},{},[29926],{"type":23,"value":23902},{"type":17,"tag":84,"props":29928,"children":29929},{},[29930],{"type":23,"value":29931},"one schema for files and metadata",{"type":17,"tag":84,"props":29933,"children":29934},{},[29935],{"type":23,"value":23912},{"type":17,"tag":29,"props":29937,"children":29938},{},[29939],{"type":23,"value":29940},"For SaaS products that need access to documents across many systems, this simplifies architecture significantly.",{"type":17,"tag":68,"props":29942,"children":29944},{"id":29943},"build-once-with-the-unified-storage-api",[29945],{"type":23,"value":29946},"Build once with the Unified Storage API",{"type":17,"tag":29,"props":29948,"children":29949},{},[29950,29951,29958,29959,29964],{"type":23,"value":6712},{"type":17,"tag":133,"props":29952,"children":29955},{"href":29953,"rel":29954},"https://unified.to/storage",[214],[29956],{"type":23,"value":29957},"Unified Storage API",{"type":23,"value":23936},{"type":17,"tag":48,"props":29960,"children":29961},{},[29962],{"type":23,"value":29963},"26+ file storage integrations",{"type":23,"value":29965}," through a single standardized API.",{"type":17,"tag":29,"props":29967,"children":29968},{},[29969],{"type":23,"value":13248},{"type":17,"tag":80,"props":29971,"children":29972},{},[29973,29977,29981,29986,29990,29994,29998,30002],{"type":17,"tag":84,"props":29974,"children":29975},{},[29976],{"type":23,"value":28907},{"type":17,"tag":84,"props":29978,"children":29979},{},[29980],{"type":23,"value":28915},{"type":17,"tag":84,"props":29982,"children":29983},{},[29984],{"type":23,"value":29985},"OneDrive",{"type":17,"tag":84,"props":29987,"children":29988},{},[29989],{"type":23,"value":23730},{"type":17,"tag":84,"props":29991,"children":29992},{},[29993],{"type":23,"value":28931},{"type":17,"tag":84,"props":29995,"children":29996},{},[29997],{"type":23,"value":28939},{"type":17,"tag":84,"props":29999,"children":30000},{},[30001],{"type":23,"value":13311},{"type":17,"tag":84,"props":30003,"children":30004},{},[30005],{"type":23,"value":15768},{"type":17,"tag":239,"props":30007,"children":30009},{"id":30008},"unified-file-object",[30010],{"type":23,"value":30011},"Unified File object",{"type":17,"tag":29,"props":30013,"children":30014},{},[30015],{"type":23,"value":30016},"Unified standardizes file access through a single object:",{"type":17,"tag":80,"props":30018,"children":30019},{},[30020,30024,30028,30032,30037],{"type":17,"tag":84,"props":30021,"children":30022},{},[30023],{"type":23,"value":28994},{"type":17,"tag":84,"props":30025,"children":30026},{},[30027],{"type":23,"value":23792},{"type":17,"tag":84,"props":30029,"children":30030},{},[30031],{"type":23,"value":24204},{"type":17,"tag":84,"props":30033,"children":30034},{},[30035],{"type":23,"value":30036},"download URLs",{"type":17,"tag":84,"props":30038,"children":30039},{},[30040],{"type":23,"value":29012},{"type":17,"tag":29,"props":30042,"children":30043},{},[30044],{"type":23,"value":24022},{"type":17,"tag":80,"props":30046,"children":30047},{},[30048,30052,30056,30060,30064],{"type":17,"tag":84,"props":30049,"children":30050},{},[30051],{"type":23,"value":11254},{"type":17,"tag":84,"props":30053,"children":30054},{},[30055],{"type":23,"value":11243},{"type":17,"tag":84,"props":30057,"children":30058},{},[30059],{"type":23,"value":24038},{"type":17,"tag":84,"props":30061,"children":30062},{},[30063],{"type":23,"value":11845},{"type":17,"tag":84,"props":30065,"children":30066},{},[30067],{"type":23,"value":11852},{"type":17,"tag":239,"props":30069,"children":30070},{"id":24049},[30071],{"type":23,"value":24052},{"type":17,"tag":29,"props":30073,"children":30074},{},[30075],{"type":23,"value":24057},{"type":17,"tag":80,"props":30077,"children":30078},{},[30079,30084,30089],{"type":17,"tag":84,"props":30080,"children":30081},{},[30082],{"type":23,"value":30083},"cached file indexes",{"type":17,"tag":84,"props":30085,"children":30086},{},[30087],{"type":23,"value":30088},"background sync jobs",{"type":17,"tag":84,"props":30090,"children":30091},{},[30092],{"type":23,"value":30093},"fragmented auth",{"type":17,"tag":29,"props":30095,"children":30096},{},[30097,30098,30102],{"type":23,"value":24080},{"type":17,"tag":48,"props":30099,"children":30100},{},[30101],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":30104,"children":30105},{},[30106],{"type":23,"value":5804},{"type":17,"tag":80,"props":30108,"children":30109},{},[30110,30114,30119,30124],{"type":17,"tag":84,"props":30111,"children":30112},{},[30113],{"type":23,"value":24097},{"type":17,"tag":84,"props":30115,"children":30116},{},[30117],{"type":23,"value":30118},"no stale file data",{"type":17,"tag":84,"props":30120,"children":30121},{},[30122],{"type":23,"value":30123},"no sync lag",{"type":17,"tag":84,"props":30125,"children":30126},{},[30127],{"type":23,"value":30128},"direct access to documents",{"type":17,"tag":29,"props":30130,"children":30131},{},[30132,30133,30137],{"type":23,"value":24117},{"type":17,"tag":48,"props":30134,"children":30135},{},[30136],{"type":23,"value":24122},{"type":23,"value":30138},", so documents are not stored at rest by the integration layer.",{"type":17,"tag":29,"props":30140,"children":30141},{},[30142],{"type":23,"value":30143},"That reduces compliance scope, especially for sensitive document workflows.",{"type":17,"tag":239,"props":30145,"children":30146},{"id":24132},[30147],{"type":23,"value":24135},{"type":17,"tag":29,"props":30149,"children":30150},{},[30151],{"type":23,"value":24140},{"type":17,"tag":80,"props":30153,"children":30154},{},[30155,30159,30164,30168,30173,30178],{"type":17,"tag":84,"props":30156,"children":30157},{},[30158],{"type":23,"value":24152},{"type":17,"tag":84,"props":30160,"children":30161},{},[30162],{"type":23,"value":30163},"AI document ingestion pipelines",{"type":17,"tag":84,"props":30165,"children":30166},{},[30167],{"type":23,"value":29097},{"type":17,"tag":84,"props":30169,"children":30170},{},[30171],{"type":23,"value":30172},"multi-cloud file browsers",{"type":17,"tag":84,"props":30174,"children":30175},{},[30176],{"type":23,"value":30177},"backup and sync tools",{"type":17,"tag":84,"props":30179,"children":30180},{},[30181],{"type":23,"value":30182},"document analytics products",{"type":17,"tag":29,"props":30184,"children":30185},{},[30186],{"type":23,"value":30187},"without building separate integrations for every storage provider.",{"type":17,"tag":68,"props":30189,"children":30191},{"id":30190},"why-not-build-each-storage-integration-directly",[30192],{"type":23,"value":30193},"Why not build each storage integration directly?",{"type":17,"tag":29,"props":30195,"children":30196},{},[30197],{"type":23,"value":30198},"You can, but the complexity adds up quickly.",{"type":17,"tag":29,"props":30200,"children":30201},{},[30202],{"type":23,"value":24187},{"type":17,"tag":80,"props":30204,"children":30205},{},[30206,30210,30215,30219,30224],{"type":17,"tag":84,"props":30207,"children":30208},{},[30209],{"type":23,"value":2109},{"type":17,"tag":84,"props":30211,"children":30212},{},[30213],{"type":23,"value":30214},"file hierarchies",{"type":17,"tag":84,"props":30216,"children":30217},{},[30218],{"type":23,"value":24204},{"type":17,"tag":84,"props":30220,"children":30221},{},[30222],{"type":23,"value":30223},"upload/download logic",{"type":17,"tag":84,"props":30225,"children":30226},{},[30227],{"type":23,"value":30228},"API changes",{"type":17,"tag":29,"props":30230,"children":30231},{},[30232],{"type":23,"value":30233},"File storage becomes a major integration surface area as your product scales.",{"type":17,"tag":29,"props":30235,"children":30236},{},[30237],{"type":23,"value":30238},"A Unified Storage API reduces that burden and keeps your architecture clean.",{"type":17,"tag":68,"props":30240,"children":30241},{"id":1552},[30242],{"type":23,"value":1555},{"type":17,"tag":29,"props":30244,"children":30245},{},[30246],{"type":23,"value":30247},"File storage APIs are essential for document access, collaboration, and AI workflows, but supporting multiple providers directly becomes difficult to maintain.",{"type":17,"tag":29,"props":30249,"children":30250},{},[30251],{"type":23,"value":30252},"That is why more SaaS teams are moving toward Unified Storage APIs.",{"type":17,"tag":29,"props":30254,"children":30255},{},[30256,30258,30263],{"type":23,"value":30257},"If you need real-time, read/write access to documents across Google Drive, Dropbox, OneDrive, Box, S3, and more, ",{"type":17,"tag":133,"props":30259,"children":30261},{"href":212,"rel":30260},[214],[30262],{"type":23,"value":217},{"type":23,"value":24258},{"type":17,"tag":29,"props":30265,"children":30266},{},[30267,30268],{"type":23,"value":1609},{"type":17,"tag":133,"props":30269,"children":30271},{"href":1612,"rel":30270},[214],[30272],{"type":23,"value":1616},{"type":17,"tag":29,"props":30274,"children":30275},{},[30276,30277],{"type":23,"value":1609},{"type":17,"tag":133,"props":30278,"children":30280},{"href":1623,"rel":30279},[214],[30281],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":30283},[30284,30285,30286,30301,30308,30309,30314,30315],{"id":28966,"depth":1629,"text":28969},{"id":29061,"depth":1629,"text":29064},{"id":29173,"depth":1629,"text":29176,"children":30287},[30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300],{"id":29184,"depth":1635,"text":29187},{"id":29231,"depth":1635,"text":29234},{"id":29273,"depth":1635,"text":29276},{"id":29315,"depth":1635,"text":29318},{"id":29356,"depth":1635,"text":29359},{"id":29398,"depth":1635,"text":29401},{"id":29445,"depth":1635,"text":29448},{"id":29487,"depth":1635,"text":29490},{"id":29529,"depth":1635,"text":29532},{"id":29567,"depth":1635,"text":29570},{"id":29607,"depth":1635,"text":29610},{"id":29648,"depth":1635,"text":29651},{"id":29691,"depth":1635,"text":29694},{"id":29750,"depth":1629,"text":29753,"children":30302},[30303,30304,30305,30306,30307],{"id":29761,"depth":1635,"text":29764},{"id":29794,"depth":1635,"text":29797},{"id":29822,"depth":1635,"text":29825},{"id":29860,"depth":1635,"text":29863},{"id":16796,"depth":1635,"text":16799},{"id":29898,"depth":1629,"text":29901},{"id":29943,"depth":1629,"text":29946,"children":30310},[30311,30312,30313],{"id":30008,"depth":1635,"text":30011},{"id":24049,"depth":1635,"text":24052},{"id":24132,"depth":1635,"text":24135},{"id":30190,"depth":1629,"text":30193},{"id":1552,"depth":1629,"text":1555},"content:blog:25_file_storage_apis_to_integrate_with_in_2026_google_drive_dropbox_s3_and_unified_storage_apis.md","blog/25_file_storage_apis_to_integrate_with_in_2026_google_drive_dropbox_s3_and_unified_storage_apis.md","blog/25_file_storage_apis_to_integrate_with_in_2026_google_drive_dropbox_s3_and_unified_storage_apis",{"_path":30320,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":30321,"description":30322,"img":30323,"date":30324,"tag":12,"body":30325,"_type":1677,"_id":31893,"_source":1679,"_file":31894,"_stem":31895,"_extension":1682},"/blog/15_call_center_apis_to_integrate_with_in_2026_aircall_ringcentral_dialpad_and_unified_call_center_apis","15 Call Center APIs to Integrate With in 2026: Aircall, RingCentral, Dialpad, and Unified Call Center APIs","Call center data is one of the richest operational datasets inside a support organization.","https://s3.us-east-2.amazonaws.com/unified-article-images/15_call_center_apis_to_integrate_with_in_2026_aircall_ringcentral_dialpad_and_unified_call_center_apis-icon.png","2026-03-24T00:12:00.000Z",{"type":14,"children":30326,"toc":31856},[30327,30332,30335,30342,30346,30351,30356,30374,30380,30392,30397,30420,30424,30457,30463,30468,30473,30501,30505,30513,30518,30526,30531,30539,30544,30552,30557,30565,30570,30576,30581,30587,30597,30602,30606,30629,30635,30645,30650,30654,30677,30683,30693,30698,30702,30725,30731,30741,30746,30750,30773,30779,30789,30794,30798,30816,30822,30832,30837,30841,30859,30865,30875,30880,30884,30906,30912,30922,30927,30931,30952,30958,30967,30972,30976,30994,31000,31009,31014,31018,31035,31041,31051,31056,31060,31082,31088,31098,31103,31107,31125,31131,31139,31144,31148,31166,31172,31182,31187,31191,31209,31215,31225,31230,31234,31250,31256,31261,31266,31272,31277,31283,31288,31315,31319,31325,31336,31340,31345,31368,31373,31379,31384,31407,31412,31418,31423,31445,31451,31456,31467,31471,31491,31496,31502,31520,31524,31601,31607,31612,31635,31640,31644,31649,31667,31676,31680,31701,31711,31716,31720,31724,31756,31761,31767,31772,31776,31803,31808,31813,31817,31822,31827,31838,31847],{"type":17,"tag":18,"props":30328,"children":30330},{"id":30329},"_15-call-center-apis-to-integrate-with-in-2026-aircall-ringcentral-dialpad-and-unified-call-center-apis",[30331],{"type":23,"value":30321},{"type":17,"tag":25,"props":30333,"children":30334},{},[],{"type":17,"tag":29,"props":30336,"children":30337},{},[30338],{"type":17,"tag":33,"props":30339,"children":30340},{},[30341],{"type":23,"value":19372},{"type":17,"tag":29,"props":30343,"children":30344},{},[30345],{"type":23,"value":30322},{"type":17,"tag":29,"props":30347,"children":30348},{},[30349],{"type":23,"value":30350},"It captures customer conversations, agent activity, response timing, call outcomes, recordings, and contact history. For SaaS teams building support tools, QA tools, AI copilots, or call analytics products, this category matters a lot.",{"type":17,"tag":29,"props":30352,"children":30353},{},[30354],{"type":23,"value":30355},"The challenge is that call center and unified communications platforms all expose different APIs, authentication methods, object models, and event systems. Supporting one provider is doable. Supporting many becomes an infrastructure problem fast.",{"type":17,"tag":29,"props":30357,"children":30358},{},[30359,30360,30365,30367,30372],{"type":23,"value":23079},{"type":17,"tag":48,"props":30361,"children":30362},{},[30363],{"type":23,"value":30364},"top call center APIs to integrate with in 2026",{"type":23,"value":30366},", the main use cases in the category, the challenges of building these integrations directly, and why more teams are using ",{"type":17,"tag":48,"props":30368,"children":30369},{},[30370],{"type":23,"value":30371},"Unified Call Center APIs",{"type":23,"value":30373}," to scale support and voice workflows.",{"type":17,"tag":68,"props":30375,"children":30377},{"id":30376},"what-is-a-call-center-api",[30378],{"type":23,"value":30379},"What is a call center API?",{"type":17,"tag":29,"props":30381,"children":30382},{},[30383,30384,30390],{"type":23,"value":9619},{"type":17,"tag":133,"props":30385,"children":30387},{"href":30386},"/uc",[30388],{"type":23,"value":30389},"call center API",{"type":23,"value":30391}," gives developers programmatic access to support and communications data.",{"type":17,"tag":29,"props":30393,"children":30394},{},[30395],{"type":23,"value":30396},"That usually includes:",{"type":17,"tag":80,"props":30398,"children":30399},{},[30400,30405,30410,30415],{"type":17,"tag":84,"props":30401,"children":30402},{},[30403],{"type":23,"value":30404},"contacts",{"type":17,"tag":84,"props":30406,"children":30407},{},[30408],{"type":23,"value":30409},"calls",{"type":17,"tag":84,"props":30411,"children":30412},{},[30413],{"type":23,"value":30414},"comments or notes",{"type":17,"tag":84,"props":30416,"children":30417},{},[30418],{"type":23,"value":30419},"recordings",{"type":17,"tag":29,"props":30421,"children":30422},{},[30423],{"type":23,"value":23132},{"type":17,"tag":80,"props":30425,"children":30426},{},[30427,30432,30437,30442,30447,30452],{"type":17,"tag":84,"props":30428,"children":30429},{},[30430],{"type":23,"value":30431},"call analytics dashboards",{"type":17,"tag":84,"props":30433,"children":30434},{},[30435],{"type":23,"value":30436},"QA and coaching tools",{"type":17,"tag":84,"props":30438,"children":30439},{},[30440],{"type":23,"value":30441},"AI-powered call analysis",{"type":17,"tag":84,"props":30443,"children":30444},{},[30445],{"type":23,"value":30446},"CRM and helpdesk integrations",{"type":17,"tag":84,"props":30448,"children":30449},{},[30450],{"type":23,"value":30451},"contact center operations tools",{"type":17,"tag":84,"props":30453,"children":30454},{},[30455],{"type":23,"value":30456},"voice-driven workflow automation",{"type":17,"tag":68,"props":30458,"children":30460},{"id":30459},"why-saas-products-integrate-call-center-apis",[30461],{"type":23,"value":30462},"Why SaaS products integrate call center APIs",{"type":17,"tag":29,"props":30464,"children":30465},{},[30466],{"type":23,"value":30467},"Call center data is rarely useful on its own.",{"type":17,"tag":29,"props":30469,"children":30470},{},[30471],{"type":23,"value":30472},"SaaS products often connect voice platforms with:",{"type":17,"tag":80,"props":30474,"children":30475},{},[30476,30481,30486,30491,30496],{"type":17,"tag":84,"props":30477,"children":30478},{},[30479],{"type":23,"value":30480},"CRM systems",{"type":17,"tag":84,"props":30482,"children":30483},{},[30484],{"type":23,"value":30485},"helpdesks and ticketing tools",{"type":17,"tag":84,"props":30487,"children":30488},{},[30489],{"type":23,"value":30490},"sales engagement tools",{"type":17,"tag":84,"props":30492,"children":30493},{},[30494],{"type":23,"value":30495},"AI transcription and analysis systems",{"type":17,"tag":84,"props":30497,"children":30498},{},[30499],{"type":23,"value":30500},"support analytics dashboards",{"type":17,"tag":29,"props":30502,"children":30503},{},[30504],{"type":23,"value":12661},{"type":17,"tag":29,"props":30506,"children":30507},{},[30508],{"type":17,"tag":48,"props":30509,"children":30510},{},[30511],{"type":23,"value":30512},"Call analytics and reporting",{"type":17,"tag":29,"props":30514,"children":30515},{},[30516],{"type":23,"value":30517},"Track volume, duration, wait times, and agent activity across platforms.",{"type":17,"tag":29,"props":30519,"children":30520},{},[30521],{"type":17,"tag":48,"props":30522,"children":30523},{},[30524],{"type":23,"value":30525},"Customer context during calls",{"type":17,"tag":29,"props":30527,"children":30528},{},[30529],{"type":23,"value":30530},"Show customer information and call history in real time.",{"type":17,"tag":29,"props":30532,"children":30533},{},[30534],{"type":17,"tag":48,"props":30535,"children":30536},{},[30537],{"type":23,"value":30538},"Call recording analysis",{"type":17,"tag":29,"props":30540,"children":30541},{},[30542],{"type":23,"value":30543},"Analyze recordings for sentiment, compliance, QA, or coaching.",{"type":17,"tag":29,"props":30545,"children":30546},{},[30547],{"type":17,"tag":48,"props":30548,"children":30549},{},[30550],{"type":23,"value":30551},"Contact center automation",{"type":17,"tag":29,"props":30553,"children":30554},{},[30555],{"type":23,"value":30556},"Sync call records into downstream systems like CRMs and support tools.",{"type":17,"tag":29,"props":30558,"children":30559},{},[30560],{"type":17,"tag":48,"props":30561,"children":30562},{},[30563],{"type":23,"value":30564},"AI support and sales assistants",{"type":17,"tag":29,"props":30566,"children":30567},{},[30568],{"type":23,"value":30569},"Use call data to generate summaries, next steps, and insights.",{"type":17,"tag":68,"props":30571,"children":30573},{"id":30572},"top-15-call-center-apis-to-integrate-with-in-2026",[30574],{"type":23,"value":30575},"Top 15 call center APIs to integrate with in 2026",{"type":17,"tag":29,"props":30577,"children":30578},{},[30579],{"type":23,"value":30580},"Below are the most important call center and unified communications APIs SaaS teams commonly need to support.",{"type":17,"tag":239,"props":30582,"children":30584},{"id":30583},"_1-aircall-api",[30585],{"type":23,"value":30586},"1. Aircall API",{"type":17,"tag":29,"props":30588,"children":30589},{},[30590],{"type":17,"tag":133,"props":30591,"children":30594},{"href":30592,"rel":30593},"https://developer.aircall.io/api-references/",[214],[30595],{"type":23,"value":30596},"Aircall API documentation",{"type":17,"tag":29,"props":30598,"children":30599},{},[30600],{"type":23,"value":30601},"Aircall is widely used for modern cloud-based support and sales calling workflows.",{"type":17,"tag":29,"props":30603,"children":30604},{},[30605],{"type":23,"value":15093},{"type":17,"tag":80,"props":30607,"children":30608},{},[30609,30614,30619,30624],{"type":17,"tag":84,"props":30610,"children":30611},{},[30612],{"type":23,"value":30613},"call logging",{"type":17,"tag":84,"props":30615,"children":30616},{},[30617],{"type":23,"value":30618},"agent activity analytics",{"type":17,"tag":84,"props":30620,"children":30621},{},[30622],{"type":23,"value":30623},"call recording access",{"type":17,"tag":84,"props":30625,"children":30626},{},[30627],{"type":23,"value":30628},"CRM sync",{"type":17,"tag":239,"props":30630,"children":30632},{"id":30631},"_2-ringcentral-api",[30633],{"type":23,"value":30634},"2. RingCentral API",{"type":17,"tag":29,"props":30636,"children":30637},{},[30638],{"type":17,"tag":133,"props":30639,"children":30642},{"href":30640,"rel":30641},"https://developers.ringcentral.com/api-reference",[214],[30643],{"type":23,"value":30644},"RingCentral API documentation",{"type":17,"tag":29,"props":30646,"children":30647},{},[30648],{"type":23,"value":30649},"RingCentral is one of the most established unified communications platforms.",{"type":17,"tag":29,"props":30651,"children":30652},{},[30653],{"type":23,"value":23339},{"type":17,"tag":80,"props":30655,"children":30656},{},[30657,30662,30667,30672],{"type":17,"tag":84,"props":30658,"children":30659},{},[30660],{"type":23,"value":30661},"call logs and history",{"type":17,"tag":84,"props":30663,"children":30664},{},[30665],{"type":23,"value":30666},"contact sync",{"type":17,"tag":84,"props":30668,"children":30669},{},[30670],{"type":23,"value":30671},"call analytics",{"type":17,"tag":84,"props":30673,"children":30674},{},[30675],{"type":23,"value":30676},"recordings and messaging workflows",{"type":17,"tag":239,"props":30678,"children":30680},{"id":30679},"_3-dialpad-api",[30681],{"type":23,"value":30682},"3. Dialpad API",{"type":17,"tag":29,"props":30684,"children":30685},{},[30686],{"type":17,"tag":133,"props":30687,"children":30690},{"href":30688,"rel":30689},"https://developers.dialpad.com/",[214],[30691],{"type":23,"value":30692},"Dialpad API documentation",{"type":17,"tag":29,"props":30694,"children":30695},{},[30696],{"type":23,"value":30697},"Dialpad is important for AI-enhanced business calling and support workflows.",{"type":17,"tag":29,"props":30699,"children":30700},{},[30701],{"type":23,"value":15093},{"type":17,"tag":80,"props":30703,"children":30704},{},[30705,30710,30715,30720],{"type":17,"tag":84,"props":30706,"children":30707},{},[30708],{"type":23,"value":30709},"call data access",{"type":17,"tag":84,"props":30711,"children":30712},{},[30713],{"type":23,"value":30714},"call intelligence",{"type":17,"tag":84,"props":30716,"children":30717},{},[30718],{"type":23,"value":30719},"recordings and transcripts",{"type":17,"tag":84,"props":30721,"children":30722},{},[30723],{"type":23,"value":30724},"performance monitoring",{"type":17,"tag":239,"props":30726,"children":30728},{"id":30727},"_4-zoom-phone-api",[30729],{"type":23,"value":30730},"4. Zoom Phone API",{"type":17,"tag":29,"props":30732,"children":30733},{},[30734],{"type":17,"tag":133,"props":30735,"children":30738},{"href":30736,"rel":30737},"https://developers.zoom.us/docs/api/rest/reference/phone/methods/",[214],[30739],{"type":23,"value":30740},"Zoom Phone API documentation",{"type":17,"tag":29,"props":30742,"children":30743},{},[30744],{"type":23,"value":30745},"Zoom Phone matters for organizations already using Zoom across their communications stack.",{"type":17,"tag":29,"props":30747,"children":30748},{},[30749],{"type":23,"value":23339},{"type":17,"tag":80,"props":30751,"children":30752},{},[30753,30758,30763,30768],{"type":17,"tag":84,"props":30754,"children":30755},{},[30756],{"type":23,"value":30757},"call logs",{"type":17,"tag":84,"props":30759,"children":30760},{},[30761],{"type":23,"value":30762},"contact data",{"type":17,"tag":84,"props":30764,"children":30765},{},[30766],{"type":23,"value":30767},"support and operations workflows",{"type":17,"tag":84,"props":30769,"children":30770},{},[30771],{"type":23,"value":30772},"unified communication analytics",{"type":17,"tag":239,"props":30774,"children":30776},{"id":30775},"_5-8x8-api",[30777],{"type":23,"value":30778},"5. 8x8 API",{"type":17,"tag":29,"props":30780,"children":30781},{},[30782],{"type":17,"tag":133,"props":30783,"children":30786},{"href":30784,"rel":30785},"https://developer.8x8.com/",[214],[30787],{"type":23,"value":30788},"8x8 developer documentation",{"type":17,"tag":29,"props":30790,"children":30791},{},[30792],{"type":23,"value":30793},"8x8 supports both business communications and contact center workflows.",{"type":17,"tag":29,"props":30795,"children":30796},{},[30797],{"type":23,"value":15093},{"type":17,"tag":80,"props":30799,"children":30800},{},[30801,30806,30811],{"type":17,"tag":84,"props":30802,"children":30803},{},[30804],{"type":23,"value":30805},"call and contact analytics",{"type":17,"tag":84,"props":30807,"children":30808},{},[30809],{"type":23,"value":30810},"support operations tooling",{"type":17,"tag":84,"props":30812,"children":30813},{},[30814],{"type":23,"value":30815},"omnichannel communications",{"type":17,"tag":239,"props":30817,"children":30819},{"id":30818},"_6-8x8-contact-center-api",[30820],{"type":23,"value":30821},"6. 8x8 Contact Center API",{"type":17,"tag":29,"props":30823,"children":30824},{},[30825],{"type":17,"tag":133,"props":30826,"children":30829},{"href":30827,"rel":30828},"https://www.8x8.com/products/contact-center",[214],[30830],{"type":23,"value":30831},"8x8 Contact Center",{"type":17,"tag":29,"props":30833,"children":30834},{},[30835],{"type":23,"value":30836},"8x8 Contact Center is especially relevant for support-heavy teams and multi-agent operations.",{"type":17,"tag":29,"props":30838,"children":30839},{},[30840],{"type":23,"value":23339},{"type":17,"tag":80,"props":30842,"children":30843},{},[30844,30849,30854],{"type":17,"tag":84,"props":30845,"children":30846},{},[30847],{"type":23,"value":30848},"queue and call monitoring",{"type":17,"tag":84,"props":30850,"children":30851},{},[30852],{"type":23,"value":30853},"agent performance reporting",{"type":17,"tag":84,"props":30855,"children":30856},{},[30857],{"type":23,"value":30858},"support workflow automation",{"type":17,"tag":239,"props":30860,"children":30862},{"id":30861},"_7-cloudtalk-api",[30863],{"type":23,"value":30864},"7. CloudTalk API",{"type":17,"tag":29,"props":30866,"children":30867},{},[30868],{"type":17,"tag":133,"props":30869,"children":30872},{"href":30870,"rel":30871},"https://developers.cloudtalk.io/",[214],[30873],{"type":23,"value":30874},"CloudTalk API documentation",{"type":17,"tag":29,"props":30876,"children":30877},{},[30878],{"type":23,"value":30879},"CloudTalk is commonly used by support and sales teams that need cloud call center operations.",{"type":17,"tag":29,"props":30881,"children":30882},{},[30883],{"type":23,"value":23382},{"type":17,"tag":80,"props":30885,"children":30886},{},[30887,30892,30896,30901],{"type":17,"tag":84,"props":30888,"children":30889},{},[30890],{"type":23,"value":30891},"call records",{"type":17,"tag":84,"props":30893,"children":30894},{},[30895],{"type":23,"value":30666},{"type":17,"tag":84,"props":30897,"children":30898},{},[30899],{"type":23,"value":30900},"comments and notes",{"type":17,"tag":84,"props":30902,"children":30903},{},[30904],{"type":23,"value":30905},"analytics and automation",{"type":17,"tag":239,"props":30907,"children":30909},{"id":30908},"_8-justcall-api",[30910],{"type":23,"value":30911},"8. JustCall API",{"type":17,"tag":29,"props":30913,"children":30914},{},[30915],{"type":17,"tag":133,"props":30916,"children":30919},{"href":30917,"rel":30918},"https://developer.justcall.io/",[214],[30920],{"type":23,"value":30921},"JustCall API documentation",{"type":17,"tag":29,"props":30923,"children":30924},{},[30925],{"type":23,"value":30926},"JustCall is frequently used for support, sales, and outbound calling workflows.",{"type":17,"tag":29,"props":30928,"children":30929},{},[30930],{"type":23,"value":23339},{"type":17,"tag":80,"props":30932,"children":30933},{},[30934,30938,30942,30947],{"type":17,"tag":84,"props":30935,"children":30936},{},[30937],{"type":23,"value":30613},{"type":17,"tag":84,"props":30939,"children":30940},{},[30941],{"type":23,"value":30419},{"type":17,"tag":84,"props":30943,"children":30944},{},[30945],{"type":23,"value":30946},"agent analytics",{"type":17,"tag":84,"props":30948,"children":30949},{},[30950],{"type":23,"value":30951},"customer communication workflows",{"type":17,"tag":239,"props":30953,"children":30955},{"id":30954},"_9-microsoft-teams-api",[30956],{"type":23,"value":30957},"9. Microsoft Teams API",{"type":17,"tag":29,"props":30959,"children":30960},{},[30961],{"type":17,"tag":133,"props":30962,"children":30965},{"href":30963,"rel":30964},"https://learn.microsoft.com/en-us/graph/api/resources/callrecords-api-overview",[214],[30966],{"type":23,"value":23541},{"type":17,"tag":29,"props":30968,"children":30969},{},[30970],{"type":23,"value":30971},"Microsoft Teams is important for enterprise communication and voice workflows.",{"type":17,"tag":29,"props":30973,"children":30974},{},[30975],{"type":23,"value":15093},{"type":17,"tag":80,"props":30977,"children":30978},{},[30979,30984,30989],{"type":17,"tag":84,"props":30980,"children":30981},{},[30982],{"type":23,"value":30983},"call record access",{"type":17,"tag":84,"props":30985,"children":30986},{},[30987],{"type":23,"value":30988},"contact and directory integration",{"type":17,"tag":84,"props":30990,"children":30991},{},[30992],{"type":23,"value":30993},"enterprise communications analytics",{"type":17,"tag":239,"props":30995,"children":30997},{"id":30996},"_10-goto-api",[30998],{"type":23,"value":30999},"10. GoTo API",{"type":17,"tag":29,"props":31001,"children":31002},{},[31003],{"type":17,"tag":133,"props":31004,"children":31006},{"href":14265,"rel":31005},[214],[31007],{"type":23,"value":31008},"GoTo developer documentation",{"type":17,"tag":29,"props":31010,"children":31011},{},[31012],{"type":23,"value":31013},"GoTo supports communications and meeting workflows that overlap with voice and support operations.",{"type":17,"tag":29,"props":31015,"children":31016},{},[31017],{"type":23,"value":23339},{"type":17,"tag":80,"props":31019,"children":31020},{},[31021,31025,31030],{"type":17,"tag":84,"props":31022,"children":31023},{},[31024],{"type":23,"value":30891},{"type":17,"tag":84,"props":31026,"children":31027},{},[31028],{"type":23,"value":31029},"communication history",{"type":17,"tag":84,"props":31031,"children":31032},{},[31033],{"type":23,"value":31034},"support operations data",{"type":17,"tag":239,"props":31036,"children":31038},{"id":31037},"_11-gong-api",[31039],{"type":23,"value":31040},"11. Gong API",{"type":17,"tag":29,"props":31042,"children":31043},{},[31044],{"type":17,"tag":133,"props":31045,"children":31048},{"href":31046,"rel":31047},"https://developer.gong.io/",[214],[31049],{"type":23,"value":31050},"Gong API documentation",{"type":17,"tag":29,"props":31052,"children":31053},{},[31054],{"type":23,"value":31055},"Gong is especially relevant for conversation intelligence and revenue operations.",{"type":17,"tag":29,"props":31057,"children":31058},{},[31059],{"type":23,"value":23382},{"type":17,"tag":80,"props":31061,"children":31062},{},[31063,31068,31072,31077],{"type":17,"tag":84,"props":31064,"children":31065},{},[31066],{"type":23,"value":31067},"call metadata",{"type":17,"tag":84,"props":31069,"children":31070},{},[31071],{"type":23,"value":30419},{"type":17,"tag":84,"props":31073,"children":31074},{},[31075],{"type":23,"value":31076},"call intelligence and analysis",{"type":17,"tag":84,"props":31078,"children":31079},{},[31080],{"type":23,"value":31081},"sales coaching workflows",{"type":17,"tag":239,"props":31083,"children":31085},{"id":31084},"_12-gladly-api",[31086],{"type":23,"value":31087},"12. Gladly API",{"type":17,"tag":29,"props":31089,"children":31090},{},[31091],{"type":17,"tag":133,"props":31092,"children":31095},{"href":31093,"rel":31094},"https://www.gladly.com/",[214],[31096],{"type":23,"value":31097},"Gladly",{"type":17,"tag":29,"props":31099,"children":31100},{},[31101],{"type":23,"value":31102},"Gladly is support-oriented and useful for voice plus customer service workflows.",{"type":17,"tag":29,"props":31104,"children":31105},{},[31106],{"type":23,"value":23339},{"type":17,"tag":80,"props":31108,"children":31109},{},[31110,31115,31120],{"type":17,"tag":84,"props":31111,"children":31112},{},[31113],{"type":23,"value":31114},"support contact history",{"type":17,"tag":84,"props":31116,"children":31117},{},[31118],{"type":23,"value":31119},"conversation context",{"type":17,"tag":84,"props":31121,"children":31122},{},[31123],{"type":23,"value":31124},"support analytics",{"type":17,"tag":239,"props":31126,"children":31128},{"id":31127},"_13-hubspot-calling-conversations-apis",[31129],{"type":23,"value":31130},"13. HubSpot Calling / Conversations APIs",{"type":17,"tag":29,"props":31132,"children":31133},{},[31134],{"type":17,"tag":133,"props":31135,"children":31137},{"href":29657,"rel":31136},[214],[31138],{"type":23,"value":29661},{"type":17,"tag":29,"props":31140,"children":31141},{},[31142],{"type":23,"value":31143},"HubSpot call data matters when voice workflows connect to CRM and support operations.",{"type":17,"tag":29,"props":31145,"children":31146},{},[31147],{"type":23,"value":23382},{"type":17,"tag":80,"props":31149,"children":31150},{},[31151,31156,31161],{"type":17,"tag":84,"props":31152,"children":31153},{},[31154],{"type":23,"value":31155},"call logging into CRM records",{"type":17,"tag":84,"props":31157,"children":31158},{},[31159],{"type":23,"value":31160},"contact enrichment",{"type":17,"tag":84,"props":31162,"children":31163},{},[31164],{"type":23,"value":31165},"sales and support workflow automation",{"type":17,"tag":239,"props":31167,"children":31169},{"id":31168},"_14-outreach-api",[31170],{"type":23,"value":31171},"14. Outreach API",{"type":17,"tag":29,"props":31173,"children":31174},{},[31175],{"type":17,"tag":133,"props":31176,"children":31179},{"href":31177,"rel":31178},"https://developers.outreach.io/",[214],[31180],{"type":23,"value":31181},"Outreach developer documentation",{"type":17,"tag":29,"props":31183,"children":31184},{},[31185],{"type":23,"value":31186},"Outreach overlaps with call center and sales engagement workflows.",{"type":17,"tag":29,"props":31188,"children":31189},{},[31190],{"type":23,"value":23339},{"type":17,"tag":80,"props":31192,"children":31193},{},[31194,31199,31204],{"type":17,"tag":84,"props":31195,"children":31196},{},[31197],{"type":23,"value":31198},"call activity sync",{"type":17,"tag":84,"props":31200,"children":31201},{},[31202],{"type":23,"value":31203},"contact and rep workflows",{"type":17,"tag":84,"props":31205,"children":31206},{},[31207],{"type":23,"value":31208},"engagement analytics",{"type":17,"tag":239,"props":31210,"children":31212},{"id":31211},"_15-salesloft-api",[31213],{"type":23,"value":31214},"15. Salesloft API",{"type":17,"tag":29,"props":31216,"children":31217},{},[31218],{"type":17,"tag":133,"props":31219,"children":31222},{"href":31220,"rel":31221},"https://developers.salesloft.com/",[214],[31223],{"type":23,"value":31224},"Salesloft developer documentation",{"type":17,"tag":29,"props":31226,"children":31227},{},[31228],{"type":23,"value":31229},"Salesloft is important for sales-focused calling and activity logging.",{"type":17,"tag":29,"props":31231,"children":31232},{},[31233],{"type":23,"value":23382},{"type":17,"tag":80,"props":31235,"children":31236},{},[31237,31241,31246],{"type":17,"tag":84,"props":31238,"children":31239},{},[31240],{"type":23,"value":30891},{"type":17,"tag":84,"props":31242,"children":31243},{},[31244],{"type":23,"value":31245},"sales rep activity",{"type":17,"tag":84,"props":31247,"children":31248},{},[31249],{"type":23,"value":31208},{"type":17,"tag":239,"props":31251,"children":31253},{"id":31252},"_16-quo-and-other-specialized-voice-platforms",[31254],{"type":23,"value":31255},"16. QUO and other specialized voice platforms",{"type":17,"tag":29,"props":31257,"children":31258},{},[31259],{"type":23,"value":31260},"Depending on customer needs, teams may also need to support more specialized or regional systems.",{"type":17,"tag":29,"props":31262,"children":31263},{},[31264],{"type":23,"value":31265},"That is one reason call center integrations can expand quickly once a product starts serving support or revenue teams at scale.",{"type":17,"tag":68,"props":31267,"children":31269},{"id":31268},"challenges-with-call-center-api-integrations",[31270],{"type":23,"value":31271},"Challenges with call center API integrations",{"type":17,"tag":29,"props":31273,"children":31274},{},[31275],{"type":23,"value":31276},"Call center APIs are difficult to support because communications data is fragmented and provider-specific.",{"type":17,"tag":239,"props":31278,"children":31280},{"id":31279},"different-call-and-recording-models",[31281],{"type":23,"value":31282},"Different call and recording models",{"type":17,"tag":29,"props":31284,"children":31285},{},[31286],{"type":23,"value":31287},"Every provider structures:",{"type":17,"tag":80,"props":31289,"children":31290},{},[31291,31296,31301,31306,31311],{"type":17,"tag":84,"props":31292,"children":31293},{},[31294],{"type":23,"value":31295},"call objects",{"type":17,"tag":84,"props":31297,"children":31298},{},[31299],{"type":23,"value":31300},"participants",{"type":17,"tag":84,"props":31302,"children":31303},{},[31304],{"type":23,"value":31305},"call direction",{"type":17,"tag":84,"props":31307,"children":31308},{},[31309],{"type":23,"value":31310},"durations",{"type":17,"tag":84,"props":31312,"children":31313},{},[31314],{"type":23,"value":30419},{"type":17,"tag":29,"props":31316,"children":31317},{},[31318],{"type":23,"value":23797},{"type":17,"tag":239,"props":31320,"children":31322},{"id":31321},"different-auth-and-permissions",[31323],{"type":23,"value":31324},"Different auth and permissions",{"type":17,"tag":29,"props":31326,"children":31327},{},[31328,31330,31334],{"type":23,"value":31329},"Some providers use ",{"type":17,"tag":133,"props":31331,"children":31332},{"href":779},[31333],{"type":23,"value":782},{"type":23,"value":31335},", others use API keys or account-specific credentials. Permissioning also varies widely.",{"type":17,"tag":239,"props":31337,"children":31338},{"id":15546},[31339],{"type":23,"value":15549},{"type":17,"tag":29,"props":31341,"children":31342},{},[31343],{"type":23,"value":31344},"Real-time updates for:",{"type":17,"tag":80,"props":31346,"children":31347},{},[31348,31353,31358,31363],{"type":17,"tag":84,"props":31349,"children":31350},{},[31351],{"type":23,"value":31352},"calls starting or ending",{"type":17,"tag":84,"props":31354,"children":31355},{},[31356],{"type":23,"value":31357},"recordings becoming available",{"type":17,"tag":84,"props":31359,"children":31360},{},[31361],{"type":23,"value":31362},"comments added",{"type":17,"tag":84,"props":31364,"children":31365},{},[31366],{"type":23,"value":31367},"agent activity changes",{"type":17,"tag":29,"props":31369,"children":31370},{},[31371],{"type":23,"value":31372},"are not consistent across providers.",{"type":17,"tag":239,"props":31374,"children":31376},{"id":31375},"different-voice-and-support-context",[31377],{"type":23,"value":31378},"Different voice and support context",{"type":17,"tag":29,"props":31380,"children":31381},{},[31382],{"type":23,"value":31383},"Some systems are pure UC platforms. Others combine:",{"type":17,"tag":80,"props":31385,"children":31386},{},[31387,31392,31397,31402],{"type":17,"tag":84,"props":31388,"children":31389},{},[31390],{"type":23,"value":31391},"support conversations",{"type":17,"tag":84,"props":31393,"children":31394},{},[31395],{"type":23,"value":31396},"call center queues",{"type":17,"tag":84,"props":31398,"children":31399},{},[31400],{"type":23,"value":31401},"CRM context",{"type":17,"tag":84,"props":31403,"children":31404},{},[31405],{"type":23,"value":31406},"AI transcripts",{"type":17,"tag":29,"props":31408,"children":31409},{},[31410],{"type":23,"value":31411},"That makes normalization harder.",{"type":17,"tag":239,"props":31413,"children":31415},{"id":31414},"ongoing-maintenance",[31416],{"type":23,"value":31417},"Ongoing maintenance",{"type":17,"tag":29,"props":31419,"children":31420},{},[31421],{"type":23,"value":31422},"Supporting multiple providers means maintaining:",{"type":17,"tag":80,"props":31424,"children":31425},{},[31426,31431,31435,31440],{"type":17,"tag":84,"props":31427,"children":31428},{},[31429],{"type":23,"value":31430},"different schemas",{"type":17,"tag":84,"props":31432,"children":31433},{},[31434],{"type":23,"value":29890},{"type":17,"tag":84,"props":31436,"children":31437},{},[31438],{"type":23,"value":31439},"different webhook systems",{"type":17,"tag":84,"props":31441,"children":31442},{},[31443],{"type":23,"value":31444},"different lifecycle changes over time",{"type":17,"tag":68,"props":31446,"children":31448},{"id":31447},"the-role-of-unified-call-center-apis",[31449],{"type":23,"value":31450},"The role of Unified Call Center APIs",{"type":17,"tag":29,"props":31452,"children":31453},{},[31454],{"type":23,"value":31455},"This is where Unified Call Center APIs become valuable.",{"type":17,"tag":29,"props":31457,"children":31458},{},[31459,31461,31465],{"type":23,"value":31460},"Instead of building separate integrations for Aircall, RingCentral, Dialpad, 8x8, Zoom Phone, CloudTalk, JustCall, Microsoft Teams, Gong, and others, a ",{"type":17,"tag":133,"props":31462,"children":31463},{"href":7691},[31464],{"type":23,"value":7806},{"type":23,"value":31466}," provides one standardized interface.",{"type":17,"tag":29,"props":31468,"children":31469},{},[31470],{"type":23,"value":5804},{"type":17,"tag":80,"props":31472,"children":31473},{},[31474,31478,31482,31487],{"type":17,"tag":84,"props":31475,"children":31476},{},[31477],{"type":23,"value":23897},{"type":17,"tag":84,"props":31479,"children":31480},{},[31481],{"type":23,"value":23902},{"type":17,"tag":84,"props":31483,"children":31484},{},[31485],{"type":23,"value":31486},"one schema for contacts, calls, comments, and recordings",{"type":17,"tag":84,"props":31488,"children":31489},{},[31490],{"type":23,"value":23912},{"type":17,"tag":29,"props":31492,"children":31493},{},[31494],{"type":23,"value":31495},"For products that need call center and voice data across many platforms, this dramatically reduces integration complexity.",{"type":17,"tag":68,"props":31497,"children":31499},{"id":31498},"build-once-with-the-unified-call-center-api",[31500],{"type":23,"value":31501},"Build once with the Unified Call Center API",{"type":17,"tag":29,"props":31503,"children":31504},{},[31505,31506,31513,31514,31519],{"type":23,"value":6712},{"type":17,"tag":133,"props":31507,"children":31510},{"href":31508,"rel":31509},"https://unified.to/call-center",[214],[31511],{"type":23,"value":31512},"Unified Call Center API",{"type":23,"value":23936},{"type":17,"tag":48,"props":31515,"children":31516},{},[31517],{"type":23,"value":31518},"16+ call center integrations",{"type":23,"value":29965},{"type":17,"tag":29,"props":31521,"children":31522},{},[31523],{"type":23,"value":13248},{"type":17,"tag":80,"props":31525,"children":31526},{},[31527,31532,31536,31541,31546,31551,31555,31560,31564,31568,31573,31577,31582,31587,31591,31596],{"type":17,"tag":84,"props":31528,"children":31529},{},[31530],{"type":23,"value":31531},"8x8",{"type":17,"tag":84,"props":31533,"children":31534},{},[31535],{"type":23,"value":30831},{"type":17,"tag":84,"props":31537,"children":31538},{},[31539],{"type":23,"value":31540},"Aircall",{"type":17,"tag":84,"props":31542,"children":31543},{},[31544],{"type":23,"value":31545},"CloudTalk",{"type":17,"tag":84,"props":31547,"children":31548},{},[31549],{"type":23,"value":31550},"Dialpad",{"type":17,"tag":84,"props":31552,"children":31553},{},[31554],{"type":23,"value":31097},{"type":17,"tag":84,"props":31556,"children":31557},{},[31558],{"type":23,"value":31559},"Gong",{"type":17,"tag":84,"props":31561,"children":31562},{},[31563],{"type":23,"value":14269},{"type":17,"tag":84,"props":31565,"children":31566},{},[31567],{"type":23,"value":3184},{"type":17,"tag":84,"props":31569,"children":31570},{},[31571],{"type":23,"value":31572},"JustCall",{"type":17,"tag":84,"props":31574,"children":31575},{},[31576],{"type":23,"value":14066},{"type":17,"tag":84,"props":31578,"children":31579},{},[31580],{"type":23,"value":31581},"Outreach",{"type":17,"tag":84,"props":31583,"children":31584},{},[31585],{"type":23,"value":31586},"QUO",{"type":17,"tag":84,"props":31588,"children":31589},{},[31590],{"type":23,"value":14150},{"type":17,"tag":84,"props":31592,"children":31593},{},[31594],{"type":23,"value":31595},"Salesloft",{"type":17,"tag":84,"props":31597,"children":31598},{},[31599],{"type":23,"value":31600},"Zoom Phone",{"type":17,"tag":239,"props":31602,"children":31604},{"id":31603},"unified-call-center-objects",[31605],{"type":23,"value":31606},"Unified Call Center objects",{"type":17,"tag":29,"props":31608,"children":31609},{},[31610],{"type":23,"value":31611},"Unified standardizes key call center objects:",{"type":17,"tag":80,"props":31613,"children":31614},{},[31615,31620,31625,31630],{"type":17,"tag":84,"props":31616,"children":31617},{},[31618],{"type":23,"value":31619},"Contacts",{"type":17,"tag":84,"props":31621,"children":31622},{},[31623],{"type":23,"value":31624},"Calls",{"type":17,"tag":84,"props":31626,"children":31627},{},[31628],{"type":23,"value":31629},"Comments",{"type":17,"tag":84,"props":31631,"children":31632},{},[31633],{"type":23,"value":31634},"Recordings",{"type":17,"tag":29,"props":31636,"children":31637},{},[31638],{"type":23,"value":31639},"This allows developers to build one product experience across multiple call center platforms without maintaining provider-specific logic for each one.",{"type":17,"tag":239,"props":31641,"children":31642},{"id":24049},[31643],{"type":23,"value":24052},{"type":17,"tag":29,"props":31645,"children":31646},{},[31647],{"type":23,"value":31648},"Many integration approaches still rely on:",{"type":17,"tag":80,"props":31650,"children":31651},{},[31652,31657,31662],{"type":17,"tag":84,"props":31653,"children":31654},{},[31655],{"type":23,"value":31656},"polling",{"type":17,"tag":84,"props":31658,"children":31659},{},[31660],{"type":23,"value":31661},"cached records",{"type":17,"tag":84,"props":31663,"children":31664},{},[31665],{"type":23,"value":31666},"fragmented auth flows",{"type":17,"tag":29,"props":31668,"children":31669},{},[31670,31671,31675],{"type":23,"value":24080},{"type":17,"tag":48,"props":31672,"children":31673},{},[31674],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":31677,"children":31678},{},[31679],{"type":23,"value":5804},{"type":17,"tag":80,"props":31681,"children":31682},{},[31683,31687,31692,31696],{"type":17,"tag":84,"props":31684,"children":31685},{},[31686],{"type":23,"value":24097},{"type":17,"tag":84,"props":31688,"children":31689},{},[31690],{"type":23,"value":31691},"no stale call or support data",{"type":17,"tag":84,"props":31693,"children":31694},{},[31695],{"type":23,"value":30123},{"type":17,"tag":84,"props":31697,"children":31698},{},[31699],{"type":23,"value":31700},"read and write support across supported objects",{"type":17,"tag":29,"props":31702,"children":31703},{},[31704,31705,31709],{"type":23,"value":24117},{"type":17,"tag":48,"props":31706,"children":31707},{},[31708],{"type":23,"value":24122},{"type":23,"value":31710},", so customer support and voice data is not stored at rest by the integration layer.",{"type":17,"tag":29,"props":31712,"children":31713},{},[31714],{"type":23,"value":31715},"That helps reduce compliance scope and improves the security posture of products dealing with sensitive support data.",{"type":17,"tag":239,"props":31717,"children":31718},{"id":24132},[31719],{"type":23,"value":24135},{"type":17,"tag":29,"props":31721,"children":31722},{},[31723],{"type":23,"value":24140},{"type":17,"tag":80,"props":31725,"children":31726},{},[31727,31731,31736,31741,31746,31751],{"type":17,"tag":84,"props":31728,"children":31729},{},[31730],{"type":23,"value":30431},{"type":17,"tag":84,"props":31732,"children":31733},{},[31734],{"type":23,"value":31735},"QA and call coaching tools",{"type":17,"tag":84,"props":31737,"children":31738},{},[31739],{"type":23,"value":31740},"AI-powered support copilots",{"type":17,"tag":84,"props":31742,"children":31743},{},[31744],{"type":23,"value":31745},"CRM call sync products",{"type":17,"tag":84,"props":31747,"children":31748},{},[31749],{"type":23,"value":31750},"contact center automation systems",{"type":17,"tag":84,"props":31752,"children":31753},{},[31754],{"type":23,"value":31755},"voice intelligence workflows",{"type":17,"tag":29,"props":31757,"children":31758},{},[31759],{"type":23,"value":31760},"without building separate integrations for every UC or call center provider.",{"type":17,"tag":68,"props":31762,"children":31764},{"id":31763},"why-not-build-each-call-center-integration-directly",[31765],{"type":23,"value":31766},"Why not build each call center integration directly?",{"type":17,"tag":29,"props":31768,"children":31769},{},[31770],{"type":23,"value":31771},"You can, but the cost rises quickly.",{"type":17,"tag":29,"props":31773,"children":31774},{},[31775],{"type":23,"value":24187},{"type":17,"tag":80,"props":31777,"children":31778},{},[31779,31783,31788,31793,31798],{"type":17,"tag":84,"props":31780,"children":31781},{},[31782],{"type":23,"value":2109},{"type":17,"tag":84,"props":31784,"children":31785},{},[31786],{"type":23,"value":31787},"call and recording schemas",{"type":17,"tag":84,"props":31789,"children":31790},{},[31791],{"type":23,"value":31792},"webhook systems",{"type":17,"tag":84,"props":31794,"children":31795},{},[31796],{"type":23,"value":31797},"provider-specific event logic",{"type":17,"tag":84,"props":31799,"children":31800},{},[31801],{"type":23,"value":31802},"ongoing maintenance",{"type":17,"tag":29,"props":31804,"children":31805},{},[31806],{"type":23,"value":31807},"Voice data is important, but the integration work can easily become a distraction from your core product.",{"type":17,"tag":29,"props":31809,"children":31810},{},[31811],{"type":23,"value":31812},"A Unified Call Center API reduces that overhead and lets teams focus on building product value instead of plumbing.",{"type":17,"tag":68,"props":31814,"children":31815},{"id":1552},[31816],{"type":23,"value":1555},{"type":17,"tag":29,"props":31818,"children":31819},{},[31820],{"type":23,"value":31821},"Call center APIs are essential for support analytics, voice intelligence, CRM sync, and AI-powered support workflows, but supporting multiple platforms directly becomes difficult to maintain.",{"type":17,"tag":29,"props":31823,"children":31824},{},[31825],{"type":23,"value":31826},"That is why more SaaS teams are moving toward Unified Call Center APIs.",{"type":17,"tag":29,"props":31828,"children":31829},{},[31830,31832,31837],{"type":23,"value":31831},"If you need real-time, read/write access to call center data across Aircall, RingCentral, Dialpad, 8x8, Zoom Phone, and more, ",{"type":17,"tag":133,"props":31833,"children":31835},{"href":212,"rel":31834},[214],[31836],{"type":23,"value":217},{"type":23,"value":24258},{"type":17,"tag":29,"props":31839,"children":31840},{},[31841,31842],{"type":23,"value":1609},{"type":17,"tag":133,"props":31843,"children":31845},{"href":1612,"rel":31844},[214],[31846],{"type":23,"value":1616},{"type":17,"tag":29,"props":31848,"children":31849},{},[31850,31851],{"type":23,"value":1609},{"type":17,"tag":133,"props":31852,"children":31854},{"href":1623,"rel":31853},[214],[31855],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":31857},[31858,31859,31860,31878,31885,31886,31891,31892],{"id":30376,"depth":1629,"text":30379},{"id":30459,"depth":1629,"text":30462},{"id":30572,"depth":1629,"text":30575,"children":31861},[31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877],{"id":30583,"depth":1635,"text":30586},{"id":30631,"depth":1635,"text":30634},{"id":30679,"depth":1635,"text":30682},{"id":30727,"depth":1635,"text":30730},{"id":30775,"depth":1635,"text":30778},{"id":30818,"depth":1635,"text":30821},{"id":30861,"depth":1635,"text":30864},{"id":30908,"depth":1635,"text":30911},{"id":30954,"depth":1635,"text":30957},{"id":30996,"depth":1635,"text":30999},{"id":31037,"depth":1635,"text":31040},{"id":31084,"depth":1635,"text":31087},{"id":31127,"depth":1635,"text":31130},{"id":31168,"depth":1635,"text":31171},{"id":31211,"depth":1635,"text":31214},{"id":31252,"depth":1635,"text":31255},{"id":31268,"depth":1629,"text":31271,"children":31879},[31880,31881,31882,31883,31884],{"id":31279,"depth":1635,"text":31282},{"id":31321,"depth":1635,"text":31324},{"id":15546,"depth":1635,"text":15549},{"id":31375,"depth":1635,"text":31378},{"id":31414,"depth":1635,"text":31417},{"id":31447,"depth":1629,"text":31450},{"id":31498,"depth":1629,"text":31501,"children":31887},[31888,31889,31890],{"id":31603,"depth":1635,"text":31606},{"id":24049,"depth":1635,"text":24052},{"id":24132,"depth":1635,"text":24135},{"id":31763,"depth":1629,"text":31766},{"id":1552,"depth":1629,"text":1555},"content:blog:15_call_center_apis_to_integrate_with_in_2026_aircall_ringcentral_dialpad_and_unified_call_center_apis.md","blog/15_call_center_apis_to_integrate_with_in_2026_aircall_ringcentral_dialpad_and_unified_call_center_apis.md","blog/15_call_center_apis_to_integrate_with_in_2026_aircall_ringcentral_dialpad_and_unified_call_center_apis",{"_path":31897,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":31898,"description":31899,"img":6339,"date":31900,"tag":12,"body":31901,"_type":1677,"_id":33027,"_source":1679,"_file":33028,"_stem":33029,"_extension":1682},"/blog/7_ticketing_apis_to_integrate_with_in_2026_zendesk_intercom_servicenow_and_unified_ticketing_apis","7 Ticketing APIs to Integrate With in 2026: Zendesk, Intercom, ServiceNow, and Unified Ticketing APIs","Customer support data is one of the most valuable datasets inside a SaaS product.","2026-03-24T00:05:00.000Z",{"type":14,"children":31902,"toc":32999},[31903,31908,31911,31918,31922,31952,31957,31975,31981,31993,31997,32025,32029,32061,32067,32072,32077,32108,32112,32120,32125,32133,32138,32146,32151,32159,32164,32172,32177,32183,32188,32194,32202,32207,32211,32232,32238,32246,32251,32255,32277,32283,32292,32297,32301,32321,32327,32335,32340,32344,32367,32373,32383,32388,32392,32410,32416,32426,32431,32435,32453,32459,32467,32472,32476,32494,32500,32505,32511,32516,32544,32548,32554,32559,32565,32570,32576,32581,32585,32590,32610,32616,32621,32632,32636,32656,32661,32667,32685,32689,32722,32728,32733,32755,32759,32782,32787,32791,32796,32814,32823,32827,32848,32858,32863,32867,32871,32902,32907,32913,32918,32922,32946,32951,32956,32960,32965,32970,32981,32990],{"type":17,"tag":18,"props":31904,"children":31906},{"id":31905},"_7-ticketing-apis-to-integrate-with-in-2026-zendesk-intercom-servicenow-and-unified-ticketing-apis",[31907],{"type":23,"value":31898},{"type":17,"tag":25,"props":31909,"children":31910},{},[],{"type":17,"tag":29,"props":31912,"children":31913},{},[31914],{"type":17,"tag":33,"props":31915,"children":31916},{},[31917],{"type":23,"value":19372},{"type":17,"tag":29,"props":31919,"children":31920},{},[31921],{"type":23,"value":31899},{"type":17,"tag":29,"props":31923,"children":31924},{},[31925,31927,31932,31933,31938,31939,31945,31946,31951],{"type":23,"value":31926},"Tickets capture real customer problems, product feedback, churn signals, and operational gaps. But that data is usually fragmented across tools like ",{"type":17,"tag":133,"props":31928,"children":31930},{"href":15341,"rel":31929},[214],[31931],{"type":23,"value":15738},{"type":23,"value":11826},{"type":17,"tag":133,"props":31934,"children":31936},{"href":23065,"rel":31935},[214],[31937],{"type":23,"value":15729},{"type":23,"value":11826},{"type":17,"tag":133,"props":31940,"children":31943},{"href":31941,"rel":31942},"https://developers.freshdesk.com/api/",[214],[31944],{"type":23,"value":25375},{"type":23,"value":12561},{"type":17,"tag":133,"props":31947,"children":31949},{"href":23622,"rel":31948},[214],[31950],{"type":23,"value":23984},{"type":23,"value":54},{"type":17,"tag":29,"props":31953,"children":31954},{},[31955],{"type":23,"value":31956},"If your product needs to access, analyze, or act on support data across multiple systems, you quickly run into integration complexity.",{"type":17,"tag":29,"props":31958,"children":31959},{},[31960,31961,31966,31968,31973],{"type":23,"value":23079},{"type":17,"tag":48,"props":31962,"children":31963},{},[31964],{"type":23,"value":31965},"top ticketing APIs to integrate with",{"type":23,"value":31967},", the most common use cases, the challenges of building support integrations directly, and why more teams are adopting ",{"type":17,"tag":48,"props":31969,"children":31970},{},[31971],{"type":23,"value":31972},"Unified Ticketing APIs",{"type":23,"value":31974}," to simplify customer support workflows.",{"type":17,"tag":68,"props":31976,"children":31978},{"id":31977},"what-is-a-ticketing-api",[31979],{"type":23,"value":31980},"What is a ticketing API?",{"type":17,"tag":29,"props":31982,"children":31983},{},[31984,31985,31991],{"type":23,"value":9619},{"type":17,"tag":133,"props":31986,"children":31988},{"href":31987},"/ticketing",[31989],{"type":23,"value":31990},"ticketing API",{"type":23,"value":31992}," allows developers to access and manage customer support data programmatically.",{"type":17,"tag":29,"props":31994,"children":31995},{},[31996],{"type":23,"value":23109},{"type":17,"tag":80,"props":31998,"children":31999},{},[32000,32005,32010,32015,32020],{"type":17,"tag":84,"props":32001,"children":32002},{},[32003],{"type":23,"value":32004},"tickets and issues",{"type":17,"tag":84,"props":32006,"children":32007},{},[32008],{"type":23,"value":32009},"customers and users",{"type":17,"tag":84,"props":32011,"children":32012},{},[32013],{"type":23,"value":32014},"notes and comments",{"type":17,"tag":84,"props":32016,"children":32017},{},[32018],{"type":23,"value":32019},"categories and classifications",{"type":17,"tag":84,"props":32021,"children":32022},{},[32023],{"type":23,"value":32024},"ticket status, priority, and metadata",{"type":17,"tag":29,"props":32026,"children":32027},{},[32028],{"type":23,"value":23132},{"type":17,"tag":80,"props":32030,"children":32031},{},[32032,32036,32041,32046,32051,32056],{"type":17,"tag":84,"props":32033,"children":32034},{},[32035],{"type":23,"value":30500},{"type":17,"tag":84,"props":32037,"children":32038},{},[32039],{"type":23,"value":32040},"customer context tools",{"type":17,"tag":84,"props":32042,"children":32043},{},[32044],{"type":23,"value":32045},"AI support assistants",{"type":17,"tag":84,"props":32047,"children":32048},{},[32049],{"type":23,"value":32050},"ticket routing systems",{"type":17,"tag":84,"props":32052,"children":32053},{},[32054],{"type":23,"value":32055},"helpdesk automation workflows",{"type":17,"tag":84,"props":32057,"children":32058},{},[32059],{"type":23,"value":32060},"internal service desks",{"type":17,"tag":68,"props":32062,"children":32064},{"id":32063},"why-saas-products-integrate-ticketing-apis",[32065],{"type":23,"value":32066},"Why SaaS products integrate ticketing APIs",{"type":17,"tag":29,"props":32068,"children":32069},{},[32070],{"type":23,"value":32071},"Support data is rarely isolated.",{"type":17,"tag":29,"props":32073,"children":32074},{},[32075],{"type":23,"value":32076},"SaaS products often connect ticketing systems with:",{"type":17,"tag":80,"props":32078,"children":32079},{},[32080,32084,32089,32094,32099,32104],{"type":17,"tag":84,"props":32081,"children":32082},{},[32083],{"type":23,"value":30480},{"type":17,"tag":84,"props":32085,"children":32086},{},[32087],{"type":23,"value":32088},"product analytics",{"type":17,"tag":84,"props":32090,"children":32091},{},[32092],{"type":23,"value":32093},"messaging tools",{"type":17,"tag":84,"props":32095,"children":32096},{},[32097],{"type":23,"value":32098},"knowledge bases",{"type":17,"tag":84,"props":32100,"children":32101},{},[32102],{"type":23,"value":32103},"internal tools",{"type":17,"tag":84,"props":32105,"children":32106},{},[32107],{"type":23,"value":15895},{"type":17,"tag":29,"props":32109,"children":32110},{},[32111],{"type":23,"value":12661},{"type":17,"tag":29,"props":32113,"children":32114},{},[32115],{"type":17,"tag":48,"props":32116,"children":32117},{},[32118],{"type":23,"value":32119},"Support analytics and reporting",{"type":17,"tag":29,"props":32121,"children":32122},{},[32123],{"type":23,"value":32124},"Track response times, resolution rates, and ticket volume across platforms.",{"type":17,"tag":29,"props":32126,"children":32127},{},[32128],{"type":17,"tag":48,"props":32129,"children":32130},{},[32131],{"type":23,"value":32132},"Customer context aggregation",{"type":17,"tag":29,"props":32134,"children":32135},{},[32136],{"type":23,"value":32137},"Show a unified view of all customer interactions.",{"type":17,"tag":29,"props":32139,"children":32140},{},[32141],{"type":17,"tag":48,"props":32142,"children":32143},{},[32144],{"type":23,"value":32145},"AI-powered support tools",{"type":17,"tag":29,"props":32147,"children":32148},{},[32149],{"type":23,"value":32150},"Use historical ticket data to automate responses and improve resolution.",{"type":17,"tag":29,"props":32152,"children":32153},{},[32154],{"type":17,"tag":48,"props":32155,"children":32156},{},[32157],{"type":23,"value":32158},"Ticket routing and automation",{"type":17,"tag":29,"props":32160,"children":32161},{},[32162],{"type":23,"value":32163},"Assign tickets based on priority, category, or agent availability.",{"type":17,"tag":29,"props":32165,"children":32166},{},[32167],{"type":17,"tag":48,"props":32168,"children":32169},{},[32170],{"type":23,"value":32171},"Internal service desks",{"type":17,"tag":29,"props":32173,"children":32174},{},[32175],{"type":23,"value":32176},"Handle HR, IT, and operational requests using ticketing workflows.",{"type":17,"tag":68,"props":32178,"children":32180},{"id":32179},"top-ticketing-apis-to-integrate-with",[32181],{"type":23,"value":32182},"Top ticketing APIs to integrate with",{"type":17,"tag":29,"props":32184,"children":32185},{},[32186],{"type":23,"value":32187},"Below are the most important ticketing APIs SaaS teams commonly need to support.",{"type":17,"tag":239,"props":32189,"children":32191},{"id":32190},"_1-zendesk-api",[32192],{"type":23,"value":32193},"1. Zendesk API",{"type":17,"tag":29,"props":32195,"children":32196},{},[32197],{"type":17,"tag":133,"props":32198,"children":32200},{"href":15341,"rel":32199},[214],[32201],{"type":23,"value":23499},{"type":17,"tag":29,"props":32203,"children":32204},{},[32205],{"type":23,"value":32206},"Zendesk is one of the most widely used customer support platforms.",{"type":17,"tag":29,"props":32208,"children":32209},{},[32210],{"type":23,"value":15093},{"type":17,"tag":80,"props":32212,"children":32213},{},[32214,32219,32224,32228],{"type":17,"tag":84,"props":32215,"children":32216},{},[32217],{"type":23,"value":32218},"ticket management",{"type":17,"tag":84,"props":32220,"children":32221},{},[32222],{"type":23,"value":32223},"customer interaction tracking",{"type":17,"tag":84,"props":32225,"children":32226},{},[32227],{"type":23,"value":31124},{"type":17,"tag":84,"props":32229,"children":32230},{},[32231],{"type":23,"value":10949},{"type":17,"tag":239,"props":32233,"children":32235},{"id":32234},"_2-intercom-api",[32236],{"type":23,"value":32237},"2. Intercom API",{"type":17,"tag":29,"props":32239,"children":32240},{},[32241],{"type":17,"tag":133,"props":32242,"children":32244},{"href":23065,"rel":32243},[214],[32245],{"type":23,"value":23415},{"type":17,"tag":29,"props":32247,"children":32248},{},[32249],{"type":23,"value":32250},"Intercom is widely used for conversational support and customer messaging.",{"type":17,"tag":29,"props":32252,"children":32253},{},[32254],{"type":23,"value":23339},{"type":17,"tag":80,"props":32256,"children":32257},{},[32258,32263,32268,32272],{"type":17,"tag":84,"props":32259,"children":32260},{},[32261],{"type":23,"value":32262},"conversations and tickets",{"type":17,"tag":84,"props":32264,"children":32265},{},[32266],{"type":23,"value":32267},"customer messaging",{"type":17,"tag":84,"props":32269,"children":32270},{},[32271],{"type":23,"value":15324},{"type":17,"tag":84,"props":32273,"children":32274},{},[32275],{"type":23,"value":32276},"product and support insights",{"type":17,"tag":239,"props":32278,"children":32280},{"id":32279},"_3-freshdesk-api",[32281],{"type":23,"value":32282},"3. Freshdesk API",{"type":17,"tag":29,"props":32284,"children":32285},{},[32286],{"type":17,"tag":133,"props":32287,"children":32289},{"href":31941,"rel":32288},[214],[32290],{"type":23,"value":32291},"Freshdesk API documentation",{"type":17,"tag":29,"props":32293,"children":32294},{},[32295],{"type":23,"value":32296},"Freshdesk is a popular helpdesk platform for SMB and mid-market companies.",{"type":17,"tag":29,"props":32298,"children":32299},{},[32300],{"type":23,"value":15093},{"type":17,"tag":80,"props":32302,"children":32303},{},[32304,32308,32312,32316],{"type":17,"tag":84,"props":32305,"children":32306},{},[32307],{"type":23,"value":32218},{"type":17,"tag":84,"props":32309,"children":32310},{},[32311],{"type":23,"value":16134},{"type":17,"tag":84,"props":32313,"children":32314},{},[32315],{"type":23,"value":31124},{"type":17,"tag":84,"props":32317,"children":32318},{},[32319],{"type":23,"value":32320},"SLA tracking",{"type":17,"tag":239,"props":32322,"children":32324},{"id":32323},"_4-servicenow-api",[32325],{"type":23,"value":32326},"4. ServiceNow API",{"type":17,"tag":29,"props":32328,"children":32329},{},[32330],{"type":17,"tag":133,"props":32331,"children":32333},{"href":23622,"rel":32332},[214],[32334],{"type":23,"value":23626},{"type":17,"tag":29,"props":32336,"children":32337},{},[32338],{"type":23,"value":32339},"ServiceNow is widely used for enterprise support and IT service management.",{"type":17,"tag":29,"props":32341,"children":32342},{},[32343],{"type":23,"value":23339},{"type":17,"tag":80,"props":32345,"children":32346},{},[32347,32352,32357,32362],{"type":17,"tag":84,"props":32348,"children":32349},{},[32350],{"type":23,"value":32351},"IT service desk workflows",{"type":17,"tag":84,"props":32353,"children":32354},{},[32355],{"type":23,"value":32356},"enterprise ticketing",{"type":17,"tag":84,"props":32358,"children":32359},{},[32360],{"type":23,"value":32361},"internal operations",{"type":17,"tag":84,"props":32363,"children":32364},{},[32365],{"type":23,"value":32366},"compliance and audit tracking",{"type":17,"tag":239,"props":32368,"children":32370},{"id":32369},"_5-atlassian-jira-service-management-api",[32371],{"type":23,"value":32372},"5. Atlassian Jira Service Management API",{"type":17,"tag":29,"props":32374,"children":32375},{},[32376],{"type":17,"tag":133,"props":32377,"children":32380},{"href":32378,"rel":32379},"https://developer.atlassian.com/cloud/jira/service-desk/rest/",[214],[32381],{"type":23,"value":32382},"Jira Service Management API documentation",{"type":17,"tag":29,"props":32384,"children":32385},{},[32386],{"type":23,"value":32387},"Atlassian Service Desk (Jira Service Management) is often used for internal support and engineering workflows.",{"type":17,"tag":29,"props":32389,"children":32390},{},[32391],{"type":23,"value":15093},{"type":17,"tag":80,"props":32393,"children":32394},{},[32395,32400,32405],{"type":17,"tag":84,"props":32396,"children":32397},{},[32398],{"type":23,"value":32399},"IT and engineering support",{"type":17,"tag":84,"props":32401,"children":32402},{},[32403],{"type":23,"value":32404},"incident management",{"type":17,"tag":84,"props":32406,"children":32407},{},[32408],{"type":23,"value":32409},"ticket workflows tied to development",{"type":17,"tag":239,"props":32411,"children":32413},{"id":32412},"_6-gorgias-api",[32414],{"type":23,"value":32415},"6. Gorgias API",{"type":17,"tag":29,"props":32417,"children":32418},{},[32419],{"type":17,"tag":133,"props":32420,"children":32423},{"href":32421,"rel":32422},"https://developers.gorgias.com/reference/introduction",[214],[32424],{"type":23,"value":32425},"Gorgias developer documentation",{"type":17,"tag":29,"props":32427,"children":32428},{},[32429],{"type":23,"value":32430},"Gorgias is commonly used in e-commerce support environments.",{"type":17,"tag":29,"props":32432,"children":32433},{},[32434],{"type":23,"value":23339},{"type":17,"tag":80,"props":32436,"children":32437},{},[32438,32443,32448],{"type":17,"tag":84,"props":32439,"children":32440},{},[32441],{"type":23,"value":32442},"customer support automation",{"type":17,"tag":84,"props":32444,"children":32445},{},[32446],{"type":23,"value":32447},"order and support context",{"type":17,"tag":84,"props":32449,"children":32450},{},[32451],{"type":23,"value":32452},"ecommerce support workflows",{"type":17,"tag":239,"props":32454,"children":32456},{"id":32455},"_7-hubspot-service-hub-api",[32457],{"type":23,"value":32458},"7. HubSpot Service Hub API",{"type":17,"tag":29,"props":32460,"children":32461},{},[32462],{"type":17,"tag":133,"props":32463,"children":32465},{"href":29657,"rel":32464},[214],[32466],{"type":23,"value":29661},{"type":17,"tag":29,"props":32468,"children":32469},{},[32470],{"type":23,"value":32471},"HubSpot includes ticketing and support functionality alongside CRM.",{"type":17,"tag":29,"props":32473,"children":32474},{},[32475],{"type":23,"value":15093},{"type":17,"tag":80,"props":32477,"children":32478},{},[32479,32484,32489],{"type":17,"tag":84,"props":32480,"children":32481},{},[32482],{"type":23,"value":32483},"customer support workflows",{"type":17,"tag":84,"props":32485,"children":32486},{},[32487],{"type":23,"value":32488},"ticket and contact integration",{"type":17,"tag":84,"props":32490,"children":32491},{},[32492],{"type":23,"value":32493},"unified sales and support data",{"type":17,"tag":68,"props":32495,"children":32497},{"id":32496},"challenges-with-ticketing-api-integrations",[32498],{"type":23,"value":32499},"Challenges with ticketing API integrations",{"type":17,"tag":29,"props":32501,"children":32502},{},[32503],{"type":23,"value":32504},"Support systems may seem similar, but they differ significantly under the hood.",{"type":17,"tag":239,"props":32506,"children":32508},{"id":32507},"different-ticket-models",[32509],{"type":23,"value":32510},"Different ticket models",{"type":17,"tag":29,"props":32512,"children":32513},{},[32514],{"type":23,"value":32515},"Each platform structures:",{"type":17,"tag":80,"props":32517,"children":32518},{},[32519,32524,32529,32534,32539],{"type":17,"tag":84,"props":32520,"children":32521},{},[32522],{"type":23,"value":32523},"tickets",{"type":17,"tag":84,"props":32525,"children":32526},{},[32527],{"type":23,"value":32528},"conversations",{"type":17,"tag":84,"props":32530,"children":32531},{},[32532],{"type":23,"value":32533},"threads",{"type":17,"tag":84,"props":32535,"children":32536},{},[32537],{"type":23,"value":32538},"statuses",{"type":17,"tag":84,"props":32540,"children":32541},{},[32542],{"type":23,"value":32543},"priorities",{"type":17,"tag":29,"props":32545,"children":32546},{},[32547],{"type":23,"value":23797},{"type":17,"tag":239,"props":32549,"children":32551},{"id":32550},"different-customer-and-user-models",[32552],{"type":23,"value":32553},"Different customer and user models",{"type":17,"tag":29,"props":32555,"children":32556},{},[32557],{"type":23,"value":32558},"Customer identity and contact data vary across providers.",{"type":17,"tag":239,"props":32560,"children":32562},{"id":32561},"different-event-and-webhook-systems",[32563],{"type":23,"value":32564},"Different event and webhook systems",{"type":17,"tag":29,"props":32566,"children":32567},{},[32568],{"type":23,"value":32569},"Some systems support real-time updates, others rely more on polling or delayed events.",{"type":17,"tag":239,"props":32571,"children":32573},{"id":32572},"different-automation-and-workflow-logic",[32574],{"type":23,"value":32575},"Different automation and workflow logic",{"type":17,"tag":29,"props":32577,"children":32578},{},[32579],{"type":23,"value":32580},"Ticket routing, assignment, and categorization differ by platform.",{"type":17,"tag":239,"props":32582,"children":32583},{"id":16796},[32584],{"type":23,"value":16799},{"type":17,"tag":29,"props":32586,"children":32587},{},[32588],{"type":23,"value":32589},"Supporting multiple ticketing systems means managing:",{"type":17,"tag":80,"props":32591,"children":32592},{},[32593,32597,32601,32605],{"type":17,"tag":84,"props":32594,"children":32595},{},[32596],{"type":23,"value":29885},{"type":17,"tag":84,"props":32598,"children":32599},{},[32600],{"type":23,"value":31430},{"type":17,"tag":84,"props":32602,"children":32603},{},[32604],{"type":23,"value":29890},{"type":17,"tag":84,"props":32606,"children":32607},{},[32608],{"type":23,"value":32609},"ongoing API updates",{"type":17,"tag":68,"props":32611,"children":32613},{"id":32612},"the-role-of-unified-ticketing-apis",[32614],{"type":23,"value":32615},"The role of Unified Ticketing APIs",{"type":17,"tag":29,"props":32617,"children":32618},{},[32619],{"type":23,"value":32620},"This is where Unified Ticketing APIs become valuable.",{"type":17,"tag":29,"props":32622,"children":32623},{},[32624,32626,32630],{"type":23,"value":32625},"Instead of building separate integrations for Zendesk, Intercom, Freshdesk, ServiceNow, Jira Service Management, Gorgias, and HubSpot, a ",{"type":17,"tag":133,"props":32627,"children":32628},{"href":7691},[32629],{"type":23,"value":7806},{"type":23,"value":32631}," provides a single interface across all of them.",{"type":17,"tag":29,"props":32633,"children":32634},{},[32635],{"type":23,"value":5804},{"type":17,"tag":80,"props":32637,"children":32638},{},[32639,32643,32647,32652],{"type":17,"tag":84,"props":32640,"children":32641},{},[32642],{"type":23,"value":23897},{"type":17,"tag":84,"props":32644,"children":32645},{},[32646],{"type":23,"value":23902},{"type":17,"tag":84,"props":32648,"children":32649},{},[32650],{"type":23,"value":32651},"one schema for tickets, customers, notes, and categories",{"type":17,"tag":84,"props":32653,"children":32654},{},[32655],{"type":23,"value":23912},{"type":17,"tag":29,"props":32657,"children":32658},{},[32659],{"type":23,"value":32660},"For SaaS products that need support data across multiple systems, this simplifies architecture significantly.",{"type":17,"tag":68,"props":32662,"children":32664},{"id":32663},"build-once-with-the-unified-ticketing-api",[32665],{"type":23,"value":32666},"Build once with the Unified Ticketing API",{"type":17,"tag":29,"props":32668,"children":32669},{},[32670,32671,32678,32679,32684],{"type":23,"value":6712},{"type":17,"tag":133,"props":32672,"children":32675},{"href":32673,"rel":32674},"https://unified.to/ticketing",[214],[32676],{"type":23,"value":32677},"Unified Ticketing API",{"type":23,"value":23936},{"type":17,"tag":48,"props":32680,"children":32681},{},[32682],{"type":23,"value":32683},"7+ ticketing integrations",{"type":23,"value":23943},{"type":17,"tag":29,"props":32686,"children":32687},{},[32688],{"type":23,"value":13248},{"type":17,"tag":80,"props":32690,"children":32691},{},[32692,32696,32700,32704,32708,32713,32718],{"type":17,"tag":84,"props":32693,"children":32694},{},[32695],{"type":23,"value":15738},{"type":17,"tag":84,"props":32697,"children":32698},{},[32699],{"type":23,"value":25375},{"type":17,"tag":84,"props":32701,"children":32702},{},[32703],{"type":23,"value":15729},{"type":17,"tag":84,"props":32705,"children":32706},{},[32707],{"type":23,"value":23984},{"type":17,"tag":84,"props":32709,"children":32710},{},[32711],{"type":23,"value":32712},"Atlassian Service Desk",{"type":17,"tag":84,"props":32714,"children":32715},{},[32716],{"type":23,"value":32717},"Gorgias",{"type":17,"tag":84,"props":32719,"children":32720},{},[32721],{"type":23,"value":3184},{"type":17,"tag":239,"props":32723,"children":32725},{"id":32724},"unified-ticketing-objects",[32726],{"type":23,"value":32727},"Unified Ticketing objects",{"type":17,"tag":29,"props":32729,"children":32730},{},[32731],{"type":23,"value":32732},"Unified standardizes key ticketing objects:",{"type":17,"tag":80,"props":32734,"children":32735},{},[32736,32741,32746,32750],{"type":17,"tag":84,"props":32737,"children":32738},{},[32739],{"type":23,"value":32740},"Tickets",{"type":17,"tag":84,"props":32742,"children":32743},{},[32744],{"type":23,"value":32745},"Customers",{"type":17,"tag":84,"props":32747,"children":32748},{},[32749],{"type":23,"value":6701},{"type":17,"tag":84,"props":32751,"children":32752},{},[32753],{"type":23,"value":32754},"Categories",{"type":17,"tag":29,"props":32756,"children":32757},{},[32758],{"type":23,"value":24022},{"type":17,"tag":80,"props":32760,"children":32761},{},[32762,32766,32770,32774,32778],{"type":17,"tag":84,"props":32763,"children":32764},{},[32765],{"type":23,"value":11254},{"type":17,"tag":84,"props":32767,"children":32768},{},[32769],{"type":23,"value":11243},{"type":17,"tag":84,"props":32771,"children":32772},{},[32773],{"type":23,"value":24038},{"type":17,"tag":84,"props":32775,"children":32776},{},[32777],{"type":23,"value":11845},{"type":17,"tag":84,"props":32779,"children":32780},{},[32781],{"type":23,"value":11852},{"type":17,"tag":29,"props":32783,"children":32784},{},[32785],{"type":23,"value":32786},"This allows developers to build once and support multiple support systems without rewriting logic per provider.",{"type":17,"tag":239,"props":32788,"children":32789},{"id":24049},[32790],{"type":23,"value":24052},{"type":17,"tag":29,"props":32792,"children":32793},{},[32794],{"type":23,"value":32795},"Many integration approaches rely on:",{"type":17,"tag":80,"props":32797,"children":32798},{},[32799,32804,32809],{"type":17,"tag":84,"props":32800,"children":32801},{},[32802],{"type":23,"value":32803},"cached data",{"type":17,"tag":84,"props":32805,"children":32806},{},[32807],{"type":23,"value":32808},"sync jobs",{"type":17,"tag":84,"props":32810,"children":32811},{},[32812],{"type":23,"value":32813},"fragmented auth handling",{"type":17,"tag":29,"props":32815,"children":32816},{},[32817,32818,32822],{"type":23,"value":24080},{"type":17,"tag":48,"props":32819,"children":32820},{},[32821],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":32824,"children":32825},{},[32826],{"type":23,"value":5804},{"type":17,"tag":80,"props":32828,"children":32829},{},[32830,32834,32839,32843],{"type":17,"tag":84,"props":32831,"children":32832},{},[32833],{"type":23,"value":24097},{"type":17,"tag":84,"props":32835,"children":32836},{},[32837],{"type":23,"value":32838},"no stale ticket data",{"type":17,"tag":84,"props":32840,"children":32841},{},[32842],{"type":23,"value":30123},{"type":17,"tag":84,"props":32844,"children":32845},{},[32846],{"type":23,"value":32847},"read and write support across ticketing objects",{"type":17,"tag":29,"props":32849,"children":32850},{},[32851,32852,32856],{"type":23,"value":24117},{"type":17,"tag":48,"props":32853,"children":32854},{},[32855],{"type":23,"value":24122},{"type":23,"value":32857},", so sensitive customer support data is not stored at rest by the integration layer.",{"type":17,"tag":29,"props":32859,"children":32860},{},[32861],{"type":23,"value":32862},"That reduces compliance scope and improves security posture.",{"type":17,"tag":239,"props":32864,"children":32865},{"id":24132},[32866],{"type":23,"value":24135},{"type":17,"tag":29,"props":32868,"children":32869},{},[32870],{"type":23,"value":24140},{"type":17,"tag":80,"props":32872,"children":32873},{},[32874,32878,32883,32887,32892,32897],{"type":17,"tag":84,"props":32875,"children":32876},{},[32877],{"type":23,"value":30500},{"type":17,"tag":84,"props":32879,"children":32880},{},[32881],{"type":23,"value":32882},"customer context platforms",{"type":17,"tag":84,"props":32884,"children":32885},{},[32886],{"type":23,"value":32045},{"type":17,"tag":84,"props":32888,"children":32889},{},[32890],{"type":23,"value":32891},"ticket routing and automation systems",{"type":17,"tag":84,"props":32893,"children":32894},{},[32895],{"type":23,"value":32896},"internal service desk tools",{"type":17,"tag":84,"props":32898,"children":32899},{},[32900],{"type":23,"value":32901},"multi-platform support workflows",{"type":17,"tag":29,"props":32903,"children":32904},{},[32905],{"type":23,"value":32906},"without maintaining separate integrations for each provider.",{"type":17,"tag":68,"props":32908,"children":32910},{"id":32909},"why-not-build-each-ticketing-integration-directly",[32911],{"type":23,"value":32912},"Why not build each ticketing integration directly?",{"type":17,"tag":29,"props":32914,"children":32915},{},[32916],{"type":23,"value":32917},"You can, but the cost grows quickly.",{"type":17,"tag":29,"props":32919,"children":32920},{},[32921],{"type":23,"value":24187},{"type":17,"tag":80,"props":32923,"children":32924},{},[32925,32929,32933,32937,32942],{"type":17,"tag":84,"props":32926,"children":32927},{},[32928],{"type":23,"value":2109},{"type":17,"tag":84,"props":32930,"children":32931},{},[32932],{"type":23,"value":2128},{"type":17,"tag":84,"props":32934,"children":32935},{},[32936],{"type":23,"value":31792},{"type":17,"tag":84,"props":32938,"children":32939},{},[32940],{"type":23,"value":32941},"workflow differences",{"type":17,"tag":84,"props":32943,"children":32944},{},[32945],{"type":23,"value":31802},{"type":17,"tag":29,"props":32947,"children":32948},{},[32949],{"type":23,"value":32950},"Support data is critical, and brittle integrations here directly impact customer experience.",{"type":17,"tag":29,"props":32952,"children":32953},{},[32954],{"type":23,"value":32955},"A Unified Ticketing API reduces that risk and simplifies your architecture as you scale.",{"type":17,"tag":68,"props":32957,"children":32958},{"id":1552},[32959],{"type":23,"value":1555},{"type":17,"tag":29,"props":32961,"children":32962},{},[32963],{"type":23,"value":32964},"Ticketing APIs are essential for building support workflows, analytics, and AI-powered customer tools, but supporting multiple platforms directly becomes difficult to maintain.",{"type":17,"tag":29,"props":32966,"children":32967},{},[32968],{"type":23,"value":32969},"That is why more SaaS teams are moving toward Unified Ticketing APIs.",{"type":17,"tag":29,"props":32971,"children":32972},{},[32973,32975,32980],{"type":23,"value":32974},"If you need real-time, read/write access to support data across Zendesk, Intercom, Freshdesk, ServiceNow, and more, ",{"type":17,"tag":133,"props":32976,"children":32978},{"href":212,"rel":32977},[214],[32979],{"type":23,"value":217},{"type":23,"value":24258},{"type":17,"tag":29,"props":32982,"children":32983},{},[32984,32985],{"type":23,"value":1609},{"type":17,"tag":133,"props":32986,"children":32988},{"href":1612,"rel":32987},[214],[32989],{"type":23,"value":1616},{"type":17,"tag":29,"props":32991,"children":32992},{},[32993,32994],{"type":23,"value":1609},{"type":17,"tag":133,"props":32995,"children":32997},{"href":1623,"rel":32996},[214],[32998],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":33000},[33001,33002,33003,33012,33019,33020,33025,33026],{"id":31977,"depth":1629,"text":31980},{"id":32063,"depth":1629,"text":32066},{"id":32179,"depth":1629,"text":32182,"children":33004},[33005,33006,33007,33008,33009,33010,33011],{"id":32190,"depth":1635,"text":32193},{"id":32234,"depth":1635,"text":32237},{"id":32279,"depth":1635,"text":32282},{"id":32323,"depth":1635,"text":32326},{"id":32369,"depth":1635,"text":32372},{"id":32412,"depth":1635,"text":32415},{"id":32455,"depth":1635,"text":32458},{"id":32496,"depth":1629,"text":32499,"children":33013},[33014,33015,33016,33017,33018],{"id":32507,"depth":1635,"text":32510},{"id":32550,"depth":1635,"text":32553},{"id":32561,"depth":1635,"text":32564},{"id":32572,"depth":1635,"text":32575},{"id":16796,"depth":1635,"text":16799},{"id":32612,"depth":1629,"text":32615},{"id":32663,"depth":1629,"text":32666,"children":33021},[33022,33023,33024],{"id":32724,"depth":1635,"text":32727},{"id":24049,"depth":1635,"text":24052},{"id":24132,"depth":1635,"text":24135},{"id":32909,"depth":1629,"text":32912},{"id":1552,"depth":1629,"text":1555},"content:blog:7_ticketing_apis_to_integrate_with_in_2026_zendesk_intercom_servicenow_and_unified_ticketing_apis.md","blog/7_ticketing_apis_to_integrate_with_in_2026_zendesk_intercom_servicenow_and_unified_ticketing_apis.md","blog/7_ticketing_apis_to_integrate_with_in_2026_zendesk_intercom_servicenow_and_unified_ticketing_apis",{"_path":33031,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":33032,"description":33033,"img":33034,"date":33035,"tag":12,"body":33036,"_type":1677,"_id":34354,"_source":1679,"_file":34355,"_stem":34356,"_extension":1682},"/blog/how_to_build_a_shared_customer_inbox_across_slack_gmail_and_microsoft_team","How to Build a Shared Customer Inbox Across Slack, Gmail, and Microsoft Team","A shared customer inbox is a feature inside a SaaS product that aggregates conversations from messaging and email platforms into a single interface, allowing...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_shared_customer_inbox_across_slack_gmail_and_microsoft_team-icon.png","2026-03-23T23:54:00.000Z",{"type":14,"children":33037,"toc":34333},[33038,33043,33046,33054,33059,33064,33075,33081,33086,33090,33116,33121,33126,33169,33175,33180,33188,33193,33201,33206,33214,33219,33227,33232,33240,33245,33251,33256,33296,33301,33307,33317,33321,33515,33520,33526,33531,33535,33560,33564,33572,33576,33582,33587,33595,33601,33606,33614,33644,33652,33657,33677,33683,33688,33696,33705,33710,33718,33731,33736,33742,33747,33755,33761,33766,33790,33796,33801,33810,33815,33821,33945,33951,33960,33965,33971,33976,33981,34052,34057,34097,34102,34108,34113,34118,34148,34153,34171,34176,34199,34203,34208,34212,34239,34244,34248,34253,34258,34290,34295,34300,34317],{"type":17,"tag":18,"props":33039,"children":33041},{"id":33040},"how-to-build-a-shared-customer-inbox-across-slack-gmail-and-microsoft-team",[33042],{"type":23,"value":33032},{"type":17,"tag":25,"props":33044,"children":33045},{},[],{"type":17,"tag":29,"props":33047,"children":33048},{},[33049],{"type":17,"tag":33,"props":33050,"children":33051},{},[33052],{"type":23,"value":33053},"March 23, 2026",{"type":17,"tag":29,"props":33055,"children":33056},{},[33057],{"type":23,"value":33058},"A shared customer inbox is a feature inside a SaaS product that aggregates conversations from messaging and email platforms into a single interface, allowing teams to read, reply, and manage customer communication in one place.",{"type":17,"tag":29,"props":33060,"children":33061},{},[33062],{"type":23,"value":33063},"To build this, your product needs to retrieve messages from platforms like Slack, Gmail, and Microsoft Teams, group them into threads, and allow users to respond without switching tools.",{"type":17,"tag":29,"props":33065,"children":33066},{},[33067,33069,33073],{"type":23,"value":33068},"The challenge is that each platform exposes different APIs, message formats, and threading models. Unified provides a consistent ",{"type":17,"tag":133,"props":33070,"children":33071},{"href":14913},[33072],{"type":23,"value":27356},{"type":23,"value":33074}," that lets your product retrieve and send messages across these platforms using a single interface.",{"type":17,"tag":68,"props":33076,"children":33078},{"id":33077},"why-saas-products-build-shared-inbox-features",[33079],{"type":23,"value":33080},"Why SaaS Products Build Shared Inbox Features",{"type":17,"tag":29,"props":33082,"children":33083},{},[33084],{"type":23,"value":33085},"Many B2B SaaS products provide shared inbox functionality for their customers.",{"type":17,"tag":29,"props":33087,"children":33088},{},[33089],{"type":23,"value":24364},{"type":17,"tag":80,"props":33091,"children":33092},{},[33093,33098,33103,33107,33112],{"type":17,"tag":84,"props":33094,"children":33095},{},[33096],{"type":23,"value":33097},"Customer support platforms",{"type":17,"tag":84,"props":33099,"children":33100},{},[33101],{"type":23,"value":33102},"Sales communication tools",{"type":17,"tag":84,"props":33104,"children":33105},{},[33106],{"type":23,"value":24382},{"type":17,"tag":84,"props":33108,"children":33109},{},[33110],{"type":23,"value":33111},"Helpdesk products",{"type":17,"tag":84,"props":33113,"children":33114},{},[33115],{"type":23,"value":32045},{"type":17,"tag":29,"props":33117,"children":33118},{},[33119],{"type":23,"value":33120},"These products allow teams to manage communication across channels in one place.",{"type":17,"tag":29,"props":33122,"children":33123},{},[33124],{"type":23,"value":33125},"Typical use cases include:",{"type":17,"tag":80,"props":33127,"children":33128},{},[33129,33139,33149,33159],{"type":17,"tag":84,"props":33130,"children":33131},{},[33132,33137],{"type":17,"tag":48,"props":33133,"children":33134},{},[33135],{"type":23,"value":33136},"Support inboxes",{"type":23,"value":33138}," for handling customer requests",{"type":17,"tag":84,"props":33140,"children":33141},{},[33142,33147],{"type":17,"tag":48,"props":33143,"children":33144},{},[33145],{"type":23,"value":33146},"Sales inboxes",{"type":23,"value":33148}," for managing outbound and inbound communication",{"type":17,"tag":84,"props":33150,"children":33151},{},[33152,33157],{"type":17,"tag":48,"props":33153,"children":33154},{},[33155],{"type":23,"value":33156},"Customer success inboxes",{"type":23,"value":33158}," for account management",{"type":17,"tag":84,"props":33160,"children":33161},{},[33162,33167],{"type":17,"tag":48,"props":33163,"children":33164},{},[33165],{"type":23,"value":33166},"AI-assisted inboxes",{"type":23,"value":33168}," for automated replies and summaries",{"type":17,"tag":68,"props":33170,"children":33172},{"id":33171},"common-shared-inbox-use-cases",[33173],{"type":23,"value":33174},"Common Shared Inbox Use Cases",{"type":17,"tag":29,"props":33176,"children":33177},{},[33178],{"type":23,"value":33179},"Shared inbox features typically support several workflows.",{"type":17,"tag":29,"props":33181,"children":33182},{},[33183],{"type":17,"tag":48,"props":33184,"children":33185},{},[33186],{"type":23,"value":33187},"Unified conversation view",{"type":17,"tag":29,"props":33189,"children":33190},{},[33191],{"type":23,"value":33192},"Display messages from Slack, Gmail, and Teams in a single interface.",{"type":17,"tag":29,"props":33194,"children":33195},{},[33196],{"type":17,"tag":48,"props":33197,"children":33198},{},[33199],{"type":23,"value":33200},"Threaded conversations",{"type":17,"tag":29,"props":33202,"children":33203},{},[33204],{"type":23,"value":33205},"Group related messages into conversation threads.",{"type":17,"tag":29,"props":33207,"children":33208},{},[33209],{"type":17,"tag":48,"props":33210,"children":33211},{},[33212],{"type":23,"value":33213},"Multi-channel replies",{"type":17,"tag":29,"props":33215,"children":33216},{},[33217],{"type":23,"value":33218},"Allow users to respond to messages across platforms.",{"type":17,"tag":29,"props":33220,"children":33221},{},[33222],{"type":17,"tag":48,"props":33223,"children":33224},{},[33225],{"type":23,"value":33226},"Team collaboration",{"type":17,"tag":29,"props":33228,"children":33229},{},[33230],{"type":23,"value":33231},"Let multiple users participate in conversations.",{"type":17,"tag":29,"props":33233,"children":33234},{},[33235],{"type":17,"tag":48,"props":33236,"children":33237},{},[33238],{"type":23,"value":33239},"Automated responses",{"type":17,"tag":29,"props":33241,"children":33242},{},[33243],{"type":23,"value":33244},"Use AI to suggest or generate replies.",{"type":17,"tag":68,"props":33246,"children":33248},{"id":33247},"unified-messaging-category",[33249],{"type":23,"value":33250},"Unified Messaging Category",{"type":17,"tag":29,"props":33252,"children":33253},{},[33254],{"type":23,"value":33255},"The Messaging API normalizes communication across multiple platforms.",{"type":17,"tag":7231,"props":33257,"children":33258},{},[33259,33277],{"type":17,"tag":7235,"props":33260,"children":33261},{},[33262],{"type":17,"tag":7239,"props":33263,"children":33264},{},[33265,33269,33273],{"type":17,"tag":7243,"props":33266,"children":33267},{},[33268],{"type":23,"value":7247},{"type":17,"tag":7243,"props":33270,"children":33271},{},[33272],{"type":23,"value":24525},{"type":17,"tag":7243,"props":33274,"children":33275},{},[33276],{"type":23,"value":24530},{"type":17,"tag":7259,"props":33278,"children":33279},{},[33280],{"type":17,"tag":7239,"props":33281,"children":33282},{},[33283,33287,33292],{"type":17,"tag":7266,"props":33284,"children":33285},{},[33286],{"type":23,"value":24559},{"type":17,"tag":7266,"props":33288,"children":33289},{},[33290],{"type":23,"value":33291},"Email and chat conversations across platforms like Slack, Gmail, and Teams",{"type":17,"tag":7266,"props":33293,"children":33294},{},[33295],{"type":23,"value":24569},{"type":17,"tag":29,"props":33297,"children":33298},{},[33299],{"type":23,"value":33300},"This allows your product to retrieve and send messages across providers using the same API structure.",{"type":17,"tag":68,"props":33302,"children":33304},{"id":33303},"unified-message-object-and-key-fields",[33305],{"type":23,"value":33306},"Unified Message Object and Key Fields",{"type":17,"tag":29,"props":33308,"children":33309},{},[33310,33311,33315],{"type":23,"value":6712},{"type":17,"tag":48,"props":33312,"children":33313},{},[33314],{"type":23,"value":24872},{"type":23,"value":33316}," object represents a single communication event.",{"type":17,"tag":29,"props":33318,"children":33319},{},[33320],{"type":23,"value":24637},{"type":17,"tag":7231,"props":33322,"children":33323},{},[33324,33338],{"type":17,"tag":7235,"props":33325,"children":33326},{},[33327],{"type":17,"tag":7239,"props":33328,"children":33329},{},[33330,33334],{"type":17,"tag":7243,"props":33331,"children":33332},{},[33333],{"type":23,"value":24651},{"type":17,"tag":7243,"props":33335,"children":33336},{},[33337],{"type":23,"value":20787},{"type":17,"tag":7259,"props":33339,"children":33340},{},[33341,33353,33365,33378,33390,33402,33414,33426,33439,33452,33465,33478,33490,33503],{"type":17,"tag":7239,"props":33342,"children":33343},{},[33344,33348],{"type":17,"tag":7266,"props":33345,"children":33346},{},[33347],{"type":23,"value":18766},{"type":17,"tag":7266,"props":33349,"children":33350},{},[33351],{"type":23,"value":33352},"Unique identifier for the message",{"type":17,"tag":7239,"props":33354,"children":33355},{},[33356,33360],{"type":17,"tag":7266,"props":33357,"children":33358},{},[33359],{"type":23,"value":24872},{"type":17,"tag":7266,"props":33361,"children":33362},{},[33363],{"type":23,"value":33364},"Plain-text message body",{"type":17,"tag":7239,"props":33366,"children":33367},{},[33368,33373],{"type":17,"tag":7266,"props":33369,"children":33370},{},[33371],{"type":23,"value":33372},"message_html / message_markdown",{"type":17,"tag":7266,"props":33374,"children":33375},{},[33376],{"type":23,"value":33377},"Formatted message content",{"type":17,"tag":7239,"props":33379,"children":33380},{},[33381,33385],{"type":17,"tag":7266,"props":33382,"children":33383},{},[33384],{"type":23,"value":24666},{"type":17,"tag":7266,"props":33386,"children":33387},{},[33388],{"type":23,"value":33389},"Email subject",{"type":17,"tag":7239,"props":33391,"children":33392},{},[33393,33397],{"type":17,"tag":7266,"props":33394,"children":33395},{},[33396],{"type":23,"value":24841},{"type":17,"tag":7266,"props":33398,"children":33399},{},[33400],{"type":23,"value":33401},"Sender of the message",{"type":17,"tag":7239,"props":33403,"children":33404},{},[33405,33409],{"type":17,"tag":7266,"props":33406,"children":33407},{},[33408],{"type":23,"value":24853},{"type":17,"tag":7266,"props":33410,"children":33411},{},[33412],{"type":23,"value":33413},"Recipients (To)",{"type":17,"tag":7239,"props":33415,"children":33416},{},[33417,33421],{"type":17,"tag":7266,"props":33418,"children":33419},{},[33420],{"type":23,"value":24860},{"type":17,"tag":7266,"props":33422,"children":33423},{},[33424],{"type":23,"value":33425},"CC recipients",{"type":17,"tag":7239,"props":33427,"children":33428},{},[33429,33434],{"type":17,"tag":7266,"props":33430,"children":33431},{},[33432],{"type":23,"value":33433},"hidden_members",{"type":17,"tag":7266,"props":33435,"children":33436},{},[33437],{"type":23,"value":33438},"BCC recipients",{"type":17,"tag":7239,"props":33440,"children":33441},{},[33442,33447],{"type":17,"tag":7266,"props":33443,"children":33444},{},[33445],{"type":23,"value":33446},"created_at",{"type":17,"tag":7266,"props":33448,"children":33449},{},[33450],{"type":23,"value":33451},"Timestamp",{"type":17,"tag":7239,"props":33453,"children":33454},{},[33455,33460],{"type":17,"tag":7266,"props":33456,"children":33457},{},[33458],{"type":23,"value":33459},"channels",{"type":17,"tag":7266,"props":33461,"children":33462},{},[33463],{"type":23,"value":33464},"Channel context",{"type":17,"tag":7239,"props":33466,"children":33467},{},[33468,33473],{"type":17,"tag":7266,"props":33469,"children":33470},{},[33471],{"type":23,"value":33472},"attachments",{"type":17,"tag":7266,"props":33474,"children":33475},{},[33476],{"type":23,"value":33477},"Files or links",{"type":17,"tag":7239,"props":33479,"children":33480},{},[33481,33485],{"type":17,"tag":7266,"props":33482,"children":33483},{},[33484],{"type":23,"value":15863},{"type":17,"tag":7266,"props":33486,"children":33487},{},[33488],{"type":23,"value":33489},"ID of the parent message",{"type":17,"tag":7239,"props":33491,"children":33492},{},[33493,33498],{"type":17,"tag":7266,"props":33494,"children":33495},{},[33496],{"type":23,"value":33497},"message_thread_identifier",{"type":17,"tag":7266,"props":33499,"children":33500},{},[33501],{"type":23,"value":33502},"Thread identifier",{"type":17,"tag":7239,"props":33504,"children":33505},{},[33506,33510],{"type":17,"tag":7266,"props":33507,"children":33508},{},[33509],{"type":23,"value":12107},{"type":17,"tag":7266,"props":33511,"children":33512},{},[33513],{"type":23,"value":33514},"Link to the message in the source platform",{"type":17,"tag":29,"props":33516,"children":33517},{},[33518],{"type":23,"value":33519},"These fields allow your product to display conversations consistently across platforms.",{"type":17,"tag":68,"props":33521,"children":33523},{"id":33522},"connecting-customer-messaging-platforms",[33524],{"type":23,"value":33525},"Connecting Customer Messaging Platforms",{"type":17,"tag":29,"props":33527,"children":33528},{},[33529],{"type":23,"value":33530},"Customers connect their messaging platforms using Unified Connect.",{"type":17,"tag":29,"props":33532,"children":33533},{},[33534],{"type":23,"value":25009},{"type":17,"tag":6154,"props":33536,"children":33537},{},[33538,33542,33547,33551],{"type":17,"tag":84,"props":33539,"children":33540},{},[33541],{"type":23,"value":25017},{"type":17,"tag":84,"props":33543,"children":33544},{},[33545],{"type":23,"value":33546},"The user selects integrations such as Slack, Gmail, or Microsoft Teams.",{"type":17,"tag":84,"props":33548,"children":33549},{},[33550],{"type":23,"value":25027},{"type":17,"tag":84,"props":33552,"children":33553},{},[33554,33555,33559],{"type":23,"value":25032},{"type":17,"tag":48,"props":33556,"children":33557},{},[33558],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":33561,"children":33562},{},[33563],{"type":23,"value":25043},{"type":17,"tag":6893,"props":33565,"children":33567},{"className":33566,"code":25047,"language":20901,"meta":23},[20899],[33568],{"type":17,"tag":6121,"props":33569,"children":33570},{"__ignoreMap":7},[33571],{"type":23,"value":25047},{"type":17,"tag":29,"props":33573,"children":33574},{},[33575],{"type":23,"value":25057},{"type":17,"tag":68,"props":33577,"children":33579},{"id":33578},"retrieving-messages-and-threads",[33580],{"type":23,"value":33581},"Retrieving Messages and Threads",{"type":17,"tag":29,"props":33583,"children":33584},{},[33585],{"type":23,"value":33586},"Messages are retrieved using:",{"type":17,"tag":6893,"props":33588,"children":33590},{"className":33589,"code":25091,"language":20901,"meta":23},[20899],[33591],{"type":17,"tag":6121,"props":33592,"children":33593},{"__ignoreMap":7},[33594],{"type":23,"value":25091},{"type":17,"tag":239,"props":33596,"children":33598},{"id":33597},"thread-model",[33599],{"type":23,"value":33600},"Thread model",{"type":17,"tag":29,"props":33602,"children":33603},{},[33604],{"type":23,"value":33605},"Unified does not provide a separate thread object. Threads are reconstructed using message metadata.",{"type":17,"tag":29,"props":33607,"children":33608},{},[33609],{"type":17,"tag":48,"props":33610,"children":33611},{},[33612],{"type":23,"value":33613},"Parent-based threading",{"type":17,"tag":80,"props":33615,"children":33616},{},[33617,33627,33639],{"type":17,"tag":84,"props":33618,"children":33619},{},[33620,33622],{"type":23,"value":33621},"Each message includes a ",{"type":17,"tag":6121,"props":33623,"children":33625},{"className":33624},[],[33626],{"type":23,"value":15863},{"type":17,"tag":84,"props":33628,"children":33629},{},[33630,33632,33637],{"type":23,"value":33631},"Messages without a ",{"type":17,"tag":6121,"props":33633,"children":33635},{"className":33634},[],[33636],{"type":23,"value":15863},{"type":23,"value":33638}," are root messages",{"type":17,"tag":84,"props":33640,"children":33641},{},[33642],{"type":23,"value":33643},"Replies reference their parent message",{"type":17,"tag":29,"props":33645,"children":33646},{},[33647],{"type":17,"tag":48,"props":33648,"children":33649},{},[33650],{"type":23,"value":33651},"Thread grouping",{"type":17,"tag":29,"props":33653,"children":33654},{},[33655],{"type":23,"value":33656},"You can group messages by:",{"type":17,"tag":80,"props":33658,"children":33659},{},[33660,33665],{"type":17,"tag":84,"props":33661,"children":33662},{},[33663],{"type":23,"value":33664},"root message (no parent_id)",{"type":17,"tag":84,"props":33666,"children":33667},{},[33668,33670,33675],{"type":23,"value":33669},"or ",{"type":17,"tag":6121,"props":33671,"children":33673},{"className":33672},[],[33674],{"type":23,"value":33497},{"type":23,"value":33676}," (if available)",{"type":17,"tag":239,"props":33678,"children":33680},{"id":33679},"fetching-full-thread-history",[33681],{"type":23,"value":33682},"Fetching full thread history",{"type":17,"tag":29,"props":33684,"children":33685},{},[33686],{"type":23,"value":33687},"Two approaches:",{"type":17,"tag":29,"props":33689,"children":33690},{},[33691],{"type":17,"tag":48,"props":33692,"children":33693},{},[33694],{"type":23,"value":33695},"Filter by parent",{"type":17,"tag":6893,"props":33697,"children":33700},{"className":33698,"code":33699,"language":20901,"meta":23},[20899],"GET /messaging/{connection_id}/message?parent_id={message_id}\n",[33701],{"type":17,"tag":6121,"props":33702,"children":33703},{"__ignoreMap":7},[33704],{"type":23,"value":33699},{"type":17,"tag":29,"props":33706,"children":33707},{},[33708],{"type":23,"value":33709},"Returns direct replies.",{"type":17,"tag":29,"props":33711,"children":33712},{},[33713],{"type":17,"tag":48,"props":33714,"children":33715},{},[33716],{"type":23,"value":33717},"Expand full thread",{"type":17,"tag":29,"props":33719,"children":33720},{},[33721,33723,33729],{"type":23,"value":33722},"Use ",{"type":17,"tag":6121,"props":33724,"children":33726},{"className":33725},[],[33727],{"type":23,"value":33728},"expand=true",{"type":23,"value":33730}," when listing messages to return all nested replies in a single request.",{"type":17,"tag":29,"props":33732,"children":33733},{},[33734],{"type":23,"value":33735},"This allows your product to reconstruct complete conversations.",{"type":17,"tag":68,"props":33737,"children":33739},{"id":33738},"sending-and-replying-to-messages",[33740],{"type":23,"value":33741},"Sending and Replying to Messages",{"type":17,"tag":29,"props":33743,"children":33744},{},[33745],{"type":23,"value":33746},"Unified uses a single endpoint to send new messages and replies.",{"type":17,"tag":6893,"props":33748,"children":33750},{"className":33749,"code":27361,"language":20901,"meta":23},[20899],[33751],{"type":17,"tag":6121,"props":33752,"children":33753},{"__ignoreMap":7},[33754],{"type":23,"value":27361},{"type":17,"tag":239,"props":33756,"children":33758},{"id":33757},"sending-a-new-message",[33759],{"type":23,"value":33760},"Sending a new message",{"type":17,"tag":29,"props":33762,"children":33763},{},[33764],{"type":23,"value":33765},"Provide:",{"type":17,"tag":80,"props":33767,"children":33768},{},[33769,33779],{"type":17,"tag":84,"props":33770,"children":33771},{},[33772,33773,33778],{"type":23,"value":24866},{"type":17,"tag":6121,"props":33774,"children":33776},{"className":33775},[],[33777],{"type":23,"value":24872},{"type":23,"value":12034},{"type":17,"tag":84,"props":33780,"children":33781},{},[33782,33783,33788],{"type":23,"value":24847},{"type":17,"tag":6121,"props":33784,"children":33786},{"className":33785},[],[33787],{"type":23,"value":33459},{"type":23,"value":33789}," or email fields)",{"type":17,"tag":239,"props":33791,"children":33793},{"id":33792},"replying-to-a-thread",[33794],{"type":23,"value":33795},"Replying to a thread",{"type":17,"tag":29,"props":33797,"children":33798},{},[33799],{"type":23,"value":33800},"Set:",{"type":17,"tag":6893,"props":33802,"children":33805},{"className":33803,"code":33804,"language":20901,"meta":23},[20899],"parent_id = existing_message_id\n",[33806],{"type":17,"tag":6121,"props":33807,"children":33808},{"__ignoreMap":7},[33809],{"type":23,"value":33804},{"type":17,"tag":29,"props":33811,"children":33812},{},[33813],{"type":23,"value":33814},"This ensures the message appears in the correct thread.",{"type":17,"tag":239,"props":33816,"children":33818},{"id":33817},"writable-fields",[33819],{"type":23,"value":33820},"Writable fields",{"type":17,"tag":7231,"props":33822,"children":33823},{},[33824,33838],{"type":17,"tag":7235,"props":33825,"children":33826},{},[33827],{"type":17,"tag":7239,"props":33828,"children":33829},{},[33830,33834],{"type":17,"tag":7243,"props":33831,"children":33832},{},[33833],{"type":23,"value":24651},{"type":17,"tag":7243,"props":33835,"children":33836},{},[33837],{"type":23,"value":20787},{"type":17,"tag":7259,"props":33839,"children":33840},{},[33841,33853,33865,33877,33889,33900,33911,33923,33934],{"type":17,"tag":7239,"props":33842,"children":33843},{},[33844,33848],{"type":17,"tag":7266,"props":33845,"children":33846},{},[33847],{"type":23,"value":24872},{"type":17,"tag":7266,"props":33849,"children":33850},{},[33851],{"type":23,"value":33852},"Message body",{"type":17,"tag":7239,"props":33854,"children":33855},{},[33856,33860],{"type":17,"tag":7266,"props":33857,"children":33858},{},[33859],{"type":23,"value":33372},{"type":17,"tag":7266,"props":33861,"children":33862},{},[33863],{"type":23,"value":33864},"Formatted content",{"type":17,"tag":7239,"props":33866,"children":33867},{},[33868,33872],{"type":17,"tag":7266,"props":33869,"children":33870},{},[33871],{"type":23,"value":33459},{"type":17,"tag":7266,"props":33873,"children":33874},{},[33875],{"type":23,"value":33876},"Target channel",{"type":17,"tag":7239,"props":33878,"children":33879},{},[33880,33884],{"type":17,"tag":7266,"props":33881,"children":33882},{},[33883],{"type":23,"value":24853},{"type":17,"tag":7266,"props":33885,"children":33886},{},[33887],{"type":23,"value":33888},"Email recipients",{"type":17,"tag":7239,"props":33890,"children":33891},{},[33892,33896],{"type":17,"tag":7266,"props":33893,"children":33894},{},[33895],{"type":23,"value":24860},{"type":17,"tag":7266,"props":33897,"children":33898},{},[33899],{"type":23,"value":33425},{"type":17,"tag":7239,"props":33901,"children":33902},{},[33903,33907],{"type":17,"tag":7266,"props":33904,"children":33905},{},[33906],{"type":23,"value":33433},{"type":17,"tag":7266,"props":33908,"children":33909},{},[33910],{"type":23,"value":33438},{"type":17,"tag":7239,"props":33912,"children":33913},{},[33914,33918],{"type":17,"tag":7266,"props":33915,"children":33916},{},[33917],{"type":23,"value":24841},{"type":17,"tag":7266,"props":33919,"children":33920},{},[33921],{"type":23,"value":33922},"Sender",{"type":17,"tag":7239,"props":33924,"children":33925},{},[33926,33930],{"type":17,"tag":7266,"props":33927,"children":33928},{},[33929],{"type":23,"value":24666},{"type":17,"tag":7266,"props":33931,"children":33932},{},[33933],{"type":23,"value":33389},{"type":17,"tag":7239,"props":33935,"children":33936},{},[33937,33941],{"type":17,"tag":7266,"props":33938,"children":33939},{},[33940],{"type":23,"value":33472},{"type":17,"tag":7266,"props":33942,"children":33943},{},[33944],{"type":23,"value":33477},{"type":17,"tag":239,"props":33946,"children":33948},{"id":33947},"updating-messages",[33949],{"type":23,"value":33950},"Updating messages",{"type":17,"tag":6893,"props":33952,"children":33955},{"className":33953,"code":33954,"language":20901,"meta":23},[20899],"PUT /messaging/{connection_id}/message/{id}\n",[33956],{"type":17,"tag":6121,"props":33957,"children":33958},{"__ignoreMap":7},[33959],{"type":23,"value":33954},{"type":17,"tag":29,"props":33961,"children":33962},{},[33963],{"type":23,"value":33964},"Used to edit messages (supported in platforms like Slack).",{"type":17,"tag":68,"props":33966,"children":33968},{"id":33967},"building-a-shared-inbox-interface",[33969],{"type":23,"value":33970},"Building a Shared Inbox Interface",{"type":17,"tag":29,"props":33972,"children":33973},{},[33974],{"type":23,"value":33975},"A shared inbox typically combines messages into a single UI.",{"type":17,"tag":29,"props":33977,"children":33978},{},[33979],{"type":23,"value":33980},"Example structure:",{"type":17,"tag":7231,"props":33982,"children":33983},{},[33984,34000],{"type":17,"tag":7235,"props":33985,"children":33986},{},[33987],{"type":17,"tag":7239,"props":33988,"children":33989},{},[33990,33995],{"type":17,"tag":7243,"props":33991,"children":33992},{},[33993],{"type":23,"value":33994},"Source",{"type":17,"tag":7243,"props":33996,"children":33997},{},[33998],{"type":23,"value":33999},"Activity",{"type":17,"tag":7259,"props":34001,"children":34002},{},[34003,34015,34027,34040],{"type":17,"tag":7239,"props":34004,"children":34005},{},[34006,34010],{"type":17,"tag":7266,"props":34007,"children":34008},{},[34009],{"type":23,"value":3204},{"type":17,"tag":7266,"props":34011,"children":34012},{},[34013],{"type":23,"value":34014},"Customer message in channel",{"type":17,"tag":7239,"props":34016,"children":34017},{},[34018,34022],{"type":17,"tag":7266,"props":34019,"children":34020},{},[34021],{"type":23,"value":14878},{"type":17,"tag":7266,"props":34023,"children":34024},{},[34025],{"type":23,"value":34026},"Email thread",{"type":17,"tag":7239,"props":34028,"children":34029},{},[34030,34035],{"type":17,"tag":7266,"props":34031,"children":34032},{},[34033],{"type":23,"value":34034},"Teams",{"type":17,"tag":7266,"props":34036,"children":34037},{},[34038],{"type":23,"value":34039},"Internal discussion",{"type":17,"tag":7239,"props":34041,"children":34042},{},[34043,34047],{"type":17,"tag":7266,"props":34044,"children":34045},{},[34046],{"type":23,"value":3204},{"type":17,"tag":7266,"props":34048,"children":34049},{},[34050],{"type":23,"value":34051},"Reply to conversation",{"type":17,"tag":29,"props":34053,"children":34054},{},[34055],{"type":23,"value":34056},"Applications typically:",{"type":17,"tag":6154,"props":34058,"children":34059},{},[34060,34065,34070,34080,34092],{"type":17,"tag":84,"props":34061,"children":34062},{},[34063],{"type":23,"value":34064},"Retrieve messages across platforms",{"type":17,"tag":84,"props":34066,"children":34067},{},[34068],{"type":23,"value":34069},"Group them into threads",{"type":17,"tag":84,"props":34071,"children":34072},{},[34073,34075],{"type":23,"value":34074},"Sort by ",{"type":17,"tag":6121,"props":34076,"children":34078},{"className":34077},[],[34079],{"type":23,"value":33446},{"type":17,"tag":84,"props":34081,"children":34082},{},[34083,34085,34090],{"type":23,"value":34084},"Display participants using ",{"type":17,"tag":6121,"props":34086,"children":34088},{"className":34087},[],[34089],{"type":23,"value":24841},{"type":23,"value":34091}," and recipient fields",{"type":17,"tag":84,"props":34093,"children":34094},{},[34095],{"type":23,"value":34096},"Allow replies using the messaging API",{"type":17,"tag":29,"props":34098,"children":34099},{},[34100],{"type":23,"value":34101},"Because Unified normalizes message objects, this logic works across all supported providers.",{"type":17,"tag":68,"props":34103,"children":34105},{"id":34104},"keeping-inbox-data-updated",[34106],{"type":23,"value":34107},"Keeping Inbox Data Updated",{"type":17,"tag":29,"props":34109,"children":34110},{},[34111],{"type":23,"value":34112},"Unified provides webhook events for messaging updates.",{"type":17,"tag":29,"props":34114,"children":34115},{},[34116],{"type":23,"value":34117},"Common events include:",{"type":17,"tag":80,"props":34119,"children":34120},{},[34121,34130,34139],{"type":17,"tag":84,"props":34122,"children":34123},{},[34124],{"type":17,"tag":6121,"props":34125,"children":34127},{"className":34126},[],[34128],{"type":23,"value":34129},"message.created",{"type":17,"tag":84,"props":34131,"children":34132},{},[34133],{"type":17,"tag":6121,"props":34134,"children":34136},{"className":34135},[],[34137],{"type":23,"value":34138},"message.updated",{"type":17,"tag":84,"props":34140,"children":34141},{},[34142],{"type":17,"tag":6121,"props":34143,"children":34145},{"className":34144},[],[34146],{"type":23,"value":34147},"message.deleted",{"type":17,"tag":29,"props":34149,"children":34150},{},[34151],{"type":23,"value":34152},"Additional interaction events include:",{"type":17,"tag":80,"props":34154,"children":34155},{},[34156,34161,34166],{"type":17,"tag":84,"props":34157,"children":34158},{},[34159],{"type":23,"value":34160},"reactions",{"type":17,"tag":84,"props":34162,"children":34163},{},[34164],{"type":23,"value":34165},"mentions",{"type":17,"tag":84,"props":34167,"children":34168},{},[34169],{"type":23,"value":34170},"button clicks",{"type":17,"tag":29,"props":34172,"children":34173},{},[34174],{"type":23,"value":34175},"These events allow your inbox to:",{"type":17,"tag":80,"props":34177,"children":34178},{},[34179,34184,34189,34194],{"type":17,"tag":84,"props":34180,"children":34181},{},[34182],{"type":23,"value":34183},"update in real time",{"type":17,"tag":84,"props":34185,"children":34186},{},[34187],{"type":23,"value":34188},"show unread messages",{"type":17,"tag":84,"props":34190,"children":34191},{},[34192],{"type":23,"value":34193},"trigger notifications",{"type":17,"tag":84,"props":34195,"children":34196},{},[34197],{"type":23,"value":34198},"power AI workflows",{"type":17,"tag":68,"props":34200,"children":34201},{"id":25342},[34202],{"type":23,"value":25345},{"type":17,"tag":29,"props":34204,"children":34205},{},[34206],{"type":23,"value":34207},"Unified supports multiple messaging integrations.",{"type":17,"tag":29,"props":34209,"children":34210},{},[34211],{"type":23,"value":24364},{"type":17,"tag":80,"props":34213,"children":34214},{},[34215,34219,34223,34227,34231,34235],{"type":17,"tag":84,"props":34216,"children":34217},{},[34218],{"type":23,"value":3204},{"type":17,"tag":84,"props":34220,"children":34221},{},[34222],{"type":23,"value":14878},{"type":17,"tag":84,"props":34224,"children":34225},{},[34226],{"type":23,"value":14066},{"type":17,"tag":84,"props":34228,"children":34229},{},[34230],{"type":23,"value":27621},{"type":17,"tag":84,"props":34232,"children":34233},{},[34234],{"type":23,"value":15729},{"type":17,"tag":84,"props":34236,"children":34237},{},[34238],{"type":23,"value":15738},{"type":17,"tag":29,"props":34240,"children":34241},{},[34242],{"type":23,"value":34243},"This allows your product to support communication across multiple channels.",{"type":17,"tag":68,"props":34245,"children":34246},{"id":883},[34247],{"type":23,"value":19178},{"type":17,"tag":29,"props":34249,"children":34250},{},[34251],{"type":23,"value":34252},"Building a shared inbox requires integrating multiple messaging platforms and handling different APIs, threading models, and message formats.",{"type":17,"tag":29,"props":34254,"children":34255},{},[34256],{"type":23,"value":34257},"Unified simplifies this by providing:",{"type":17,"tag":80,"props":34259,"children":34260},{},[34261,34266,34271,34281],{"type":17,"tag":84,"props":34262,"children":34263},{},[34264],{"type":23,"value":34265},"normalized message objects across platforms",{"type":17,"tag":84,"props":34267,"children":34268},{},[34269],{"type":23,"value":34270},"a single endpoint for sending and replying to messages",{"type":17,"tag":84,"props":34272,"children":34273},{},[34274,34276],{"type":23,"value":34275},"consistent thread reconstruction using ",{"type":17,"tag":6121,"props":34277,"children":34279},{"className":34278},[],[34280],{"type":23,"value":15863},{"type":17,"tag":84,"props":34282,"children":34283},{},[34284,34286],{"type":23,"value":34285},"real-time updates via ",{"type":17,"tag":133,"props":34287,"children":34288},{"href":4999},[34289],{"type":23,"value":5002},{"type":17,"tag":29,"props":34291,"children":34292},{},[34293],{"type":23,"value":34294},"This allows product teams to focus on building inbox features instead of managing integration complexity.",{"type":17,"tag":29,"props":34296,"children":34297},{},[34298],{"type":23,"value":34299},"Start building shared inbox features across Slack, Gmail, Microsoft Teams, and other messaging platforms today.",{"type":17,"tag":29,"props":34301,"children":34302},{},[34303,34308,34309],{"type":17,"tag":48,"props":34304,"children":34305},{},[34306],{"type":23,"value":34307},"→",{"type":23,"value":18757},{"type":17,"tag":133,"props":34310,"children":34312},{"href":1612,"rel":34311},[214],[34313],{"type":17,"tag":48,"props":34314,"children":34315},{},[34316],{"type":23,"value":1616},{"type":17,"tag":29,"props":34318,"children":34319},{},[34320,34324,34325],{"type":17,"tag":48,"props":34321,"children":34322},{},[34323],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":34326,"children":34328},{"href":1623,"rel":34327},[214],[34329],{"type":17,"tag":48,"props":34330,"children":34331},{},[34332],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":34334},[34335,34336,34337,34338,34339,34340,34344,34350,34351,34352,34353],{"id":33077,"depth":1629,"text":33080},{"id":33171,"depth":1629,"text":33174},{"id":33247,"depth":1629,"text":33250},{"id":33303,"depth":1629,"text":33306},{"id":33522,"depth":1629,"text":33525},{"id":33578,"depth":1629,"text":33581,"children":34341},[34342,34343],{"id":33597,"depth":1635,"text":33600},{"id":33679,"depth":1635,"text":33682},{"id":33738,"depth":1629,"text":33741,"children":34345},[34346,34347,34348,34349],{"id":33757,"depth":1635,"text":33760},{"id":33792,"depth":1635,"text":33795},{"id":33817,"depth":1635,"text":33820},{"id":33947,"depth":1635,"text":33950},{"id":33967,"depth":1629,"text":33970},{"id":34104,"depth":1629,"text":34107},{"id":25342,"depth":1629,"text":25345},{"id":883,"depth":1629,"text":19178},"content:blog:how_to_build_a_shared_customer_inbox_across_slack_gmail_and_microsoft_team.md","blog/how_to_build_a_shared_customer_inbox_across_slack_gmail_and_microsoft_team.md","blog/how_to_build_a_shared_customer_inbox_across_slack_gmail_and_microsoft_team",{"_path":34358,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":34359,"description":34360,"img":34361,"date":34362,"tag":12,"body":34363,"_type":1677,"_id":35732,"_source":1679,"_file":35733,"_stem":35734,"_extension":1682},"/blog/10_shipping_apis_to_integrate_with_in_2026_fedex_ups_shippo_and_unified_shipping_apis","10 Shipping APIs to Integrate With in 2026: FedEx, UPS, Shippo, and Unified Shipping APIs","Shipping is one of the most operationally critical integration layers in SaaS.","https://s3.us-east-2.amazonaws.com/unified-article-images/10_shipping_apis_to_integrate_with_in_2026_fedex_ups_shippo_and_unified_shipping_apis-icon.png","2026-03-23T23:52:00.000Z",{"type":14,"children":34364,"toc":35701},[34365,34370,34373,34380,34384,34389,34445,34463,34469,34481,34485,34513,34517,34550,34556,34561,34566,34593,34597,34605,34610,34618,34623,34631,34636,34644,34649,34657,34662,34668,34673,34679,34688,34693,34697,34720,34726,34735,34740,34744,34765,34771,34780,34785,34789,34811,34817,34826,34831,34835,34856,34862,34871,34876,34880,34903,34909,34918,34923,34927,34948,34954,34964,34969,34973,34993,34999,35009,35014,35018,35038,35044,35054,35059,35063,35082,35088,35098,35103,35107,35129,35135,35140,35146,35151,35178,35182,35188,35193,35216,35221,35227,35232,35254,35260,35265,35287,35293,35298,35321,35327,35332,35343,35347,35367,35372,35378,35396,35400,35446,35452,35457,35485,35490,35494,35499,35516,35525,35529,35551,35561,35565,35569,35601,35606,35612,35616,35620,35649,35654,35659,35663,35668,35673,35684,35693],{"type":17,"tag":18,"props":34366,"children":34368},{"id":34367},"_10-shipping-apis-to-integrate-with-in-2026-fedex-ups-shippo-and-unified-shipping-apis",[34369],{"type":23,"value":34359},{"type":17,"tag":25,"props":34371,"children":34372},{},[],{"type":17,"tag":29,"props":34374,"children":34375},{},[34376],{"type":17,"tag":33,"props":34377,"children":34378},{},[34379],{"type":23,"value":33053},{"type":17,"tag":29,"props":34381,"children":34382},{},[34383],{"type":23,"value":34360},{"type":17,"tag":29,"props":34385,"children":34386},{},[34387],{"type":23,"value":34388},"If your product touches e-commerce, logistics, fulfillment, or marketplaces, you will need to connect to shipping providers to create labels, calculate rates, and track deliveries. That sounds straightforward until you try to support multiple carriers and platforms at once.",{"type":17,"tag":29,"props":34390,"children":34391},{},[34392,34394,34401,34402,34409,34410,34417,34418,34425,34427,34434,34436,34443],{"type":23,"value":34393},"APIs like ",{"type":17,"tag":133,"props":34395,"children":34398},{"href":34396,"rel":34397},"https://developer.fedex.com/api/en-us/home.html",[214],[34399],{"type":23,"value":34400},"FedEx",{"type":23,"value":11826},{"type":17,"tag":133,"props":34403,"children":34406},{"href":34404,"rel":34405},"https://developer.ups.com/",[214],[34407],{"type":23,"value":34408},"UPS",{"type":23,"value":11826},{"type":17,"tag":133,"props":34411,"children":34414},{"href":34412,"rel":34413},"https://www.usps.com/business/web-tools-apis/",[214],[34415],{"type":23,"value":34416},"USPS",{"type":23,"value":11826},{"type":17,"tag":133,"props":34419,"children":34422},{"href":34420,"rel":34421},"https://developer.dhl.com/api-reference",[214],[34423],{"type":23,"value":34424},"DHL",{"type":23,"value":34426},", and aggregator platforms like ",{"type":17,"tag":133,"props":34428,"children":34431},{"href":34429,"rel":34430},"https://docs.goshippo.com/shippoapi/public-api/",[214],[34432],{"type":23,"value":34433},"Shippo",{"type":23,"value":34435}," and ",{"type":17,"tag":133,"props":34437,"children":34440},{"href":34438,"rel":34439},"https://docs.shipstation.com/",[214],[34441],{"type":23,"value":34442},"ShipStation",{"type":23,"value":34444}," all behave differently.",{"type":17,"tag":29,"props":34446,"children":34447},{},[34448,34449,34454,34456,34461],{"type":23,"value":23079},{"type":17,"tag":48,"props":34450,"children":34451},{},[34452],{"type":23,"value":34453},"top shipping APIs to integrate with in 2026",{"type":23,"value":34455},", the most common use cases, the challenges of building shipping integrations directly, and why more teams are using ",{"type":17,"tag":48,"props":34457,"children":34458},{},[34459],{"type":23,"value":34460},"Unified Shipping APIs",{"type":23,"value":34462}," to simplify fulfillment workflows.",{"type":17,"tag":68,"props":34464,"children":34466},{"id":34465},"what-is-a-shipping-api",[34467],{"type":23,"value":34468},"What is a shipping API?",{"type":17,"tag":29,"props":34470,"children":34471},{},[34472,34473,34479],{"type":23,"value":9619},{"type":17,"tag":133,"props":34474,"children":34476},{"href":34475},"/shipping",[34477],{"type":23,"value":34478},"shipping API",{"type":23,"value":34480}," allows developers to manage shipments and logistics programmatically.",{"type":17,"tag":29,"props":34482,"children":34483},{},[34484],{"type":23,"value":23109},{"type":17,"tag":80,"props":34486,"children":34487},{},[34488,34493,34498,34503,34508],{"type":17,"tag":84,"props":34489,"children":34490},{},[34491],{"type":23,"value":34492},"shipments",{"type":17,"tag":84,"props":34494,"children":34495},{},[34496],{"type":23,"value":34497},"shipping rates",{"type":17,"tag":84,"props":34499,"children":34500},{},[34501],{"type":23,"value":34502},"labels",{"type":17,"tag":84,"props":34504,"children":34505},{},[34506],{"type":23,"value":34507},"tracking data",{"type":17,"tag":84,"props":34509,"children":34510},{},[34511],{"type":23,"value":34512},"carriers and services",{"type":17,"tag":29,"props":34514,"children":34515},{},[34516],{"type":23,"value":23132},{"type":17,"tag":80,"props":34518,"children":34519},{},[34520,34525,34530,34535,34540,34545],{"type":17,"tag":84,"props":34521,"children":34522},{},[34523],{"type":23,"value":34524},"shipping label generation tools",{"type":17,"tag":84,"props":34526,"children":34527},{},[34528],{"type":23,"value":34529},"rate comparison engines",{"type":17,"tag":84,"props":34531,"children":34532},{},[34533],{"type":23,"value":34534},"fulfillment automation systems",{"type":17,"tag":84,"props":34536,"children":34537},{},[34538],{"type":23,"value":34539},"tracking dashboards",{"type":17,"tag":84,"props":34541,"children":34542},{},[34543],{"type":23,"value":34544},"returns management workflows",{"type":17,"tag":84,"props":34546,"children":34547},{},[34548],{"type":23,"value":34549},"logistics analytics platforms",{"type":17,"tag":68,"props":34551,"children":34553},{"id":34552},"why-saas-products-integrate-shipping-apis",[34554],{"type":23,"value":34555},"Why SaaS products integrate shipping APIs",{"type":17,"tag":29,"props":34557,"children":34558},{},[34559],{"type":23,"value":34560},"Shipping data is essential for any product that handles orders or fulfillment.",{"type":17,"tag":29,"props":34562,"children":34563},{},[34564],{"type":23,"value":34565},"SaaS products often connect shipping systems with:",{"type":17,"tag":80,"props":34567,"children":34568},{},[34569,34574,34579,34584,34588],{"type":17,"tag":84,"props":34570,"children":34571},{},[34572],{"type":23,"value":34573},"e-commerce platforms",{"type":17,"tag":84,"props":34575,"children":34576},{},[34577],{"type":23,"value":34578},"warehouse management systems",{"type":17,"tag":84,"props":34580,"children":34581},{},[34582],{"type":23,"value":34583},"order management tools",{"type":17,"tag":84,"props":34585,"children":34586},{},[34587],{"type":23,"value":30951},{"type":17,"tag":84,"props":34589,"children":34590},{},[34591],{"type":23,"value":34592},"analytics dashboards",{"type":17,"tag":29,"props":34594,"children":34595},{},[34596],{"type":23,"value":12661},{"type":17,"tag":29,"props":34598,"children":34599},{},[34600],{"type":17,"tag":48,"props":34601,"children":34602},{},[34603],{"type":23,"value":34604},"Shipping label creation",{"type":17,"tag":29,"props":34606,"children":34607},{},[34608],{"type":23,"value":34609},"Generate labels automatically for orders.",{"type":17,"tag":29,"props":34611,"children":34612},{},[34613],{"type":17,"tag":48,"props":34614,"children":34615},{},[34616],{"type":23,"value":34617},"Rate comparison and optimization",{"type":17,"tag":29,"props":34619,"children":34620},{},[34621],{"type":23,"value":34622},"Compare rates across carriers and select the best option.",{"type":17,"tag":29,"props":34624,"children":34625},{},[34626],{"type":17,"tag":48,"props":34627,"children":34628},{},[34629],{"type":23,"value":34630},"Shipment tracking",{"type":17,"tag":29,"props":34632,"children":34633},{},[34634],{"type":23,"value":34635},"Provide real-time delivery status updates.",{"type":17,"tag":29,"props":34637,"children":34638},{},[34639],{"type":17,"tag":48,"props":34640,"children":34641},{},[34642],{"type":23,"value":34643},"Fulfillment automation",{"type":17,"tag":29,"props":34645,"children":34646},{},[34647],{"type":23,"value":34648},"Trigger shipping workflows when orders are created or updated.",{"type":17,"tag":29,"props":34650,"children":34651},{},[34652],{"type":17,"tag":48,"props":34653,"children":34654},{},[34655],{"type":23,"value":34656},"Returns processing",{"type":17,"tag":29,"props":34658,"children":34659},{},[34660],{"type":23,"value":34661},"Generate return labels and track reverse logistics.",{"type":17,"tag":68,"props":34663,"children":34665},{"id":34664},"top-10-shipping-apis-to-integrate-with-in-2026",[34666],{"type":23,"value":34667},"Top 10 shipping APIs to integrate with in 2026",{"type":17,"tag":29,"props":34669,"children":34670},{},[34671],{"type":23,"value":34672},"Below are the most important shipping APIs SaaS teams commonly need to support.",{"type":17,"tag":239,"props":34674,"children":34676},{"id":34675},"_1-fedex-api",[34677],{"type":23,"value":34678},"1. FedEx API",{"type":17,"tag":29,"props":34680,"children":34681},{},[34682],{"type":17,"tag":133,"props":34683,"children":34685},{"href":34396,"rel":34684},[214],[34686],{"type":23,"value":34687},"FedEx API documentation",{"type":17,"tag":29,"props":34689,"children":34690},{},[34691],{"type":23,"value":34692},"FedEx is one of the largest global shipping carriers.",{"type":17,"tag":29,"props":34694,"children":34695},{},[34696],{"type":23,"value":15093},{"type":17,"tag":80,"props":34698,"children":34699},{},[34700,34705,34710,34715],{"type":17,"tag":84,"props":34701,"children":34702},{},[34703],{"type":23,"value":34704},"shipment creation",{"type":17,"tag":84,"props":34706,"children":34707},{},[34708],{"type":23,"value":34709},"label generation",{"type":17,"tag":84,"props":34711,"children":34712},{},[34713],{"type":23,"value":34714},"rate calculation",{"type":17,"tag":84,"props":34716,"children":34717},{},[34718],{"type":23,"value":34719},"tracking",{"type":17,"tag":239,"props":34721,"children":34723},{"id":34722},"_2-ups-api",[34724],{"type":23,"value":34725},"2. UPS API",{"type":17,"tag":29,"props":34727,"children":34728},{},[34729],{"type":17,"tag":133,"props":34730,"children":34732},{"href":34404,"rel":34731},[214],[34733],{"type":23,"value":34734},"UPS API documentation",{"type":17,"tag":29,"props":34736,"children":34737},{},[34738],{"type":23,"value":34739},"UPS is widely used for both domestic and international shipping.",{"type":17,"tag":29,"props":34741,"children":34742},{},[34743],{"type":23,"value":23339},{"type":17,"tag":80,"props":34745,"children":34746},{},[34747,34752,34756,34760],{"type":17,"tag":84,"props":34748,"children":34749},{},[34750],{"type":23,"value":34751},"shipping rate calculation",{"type":17,"tag":84,"props":34753,"children":34754},{},[34755],{"type":23,"value":34709},{"type":17,"tag":84,"props":34757,"children":34758},{},[34759],{"type":23,"value":34719},{"type":17,"tag":84,"props":34761,"children":34762},{},[34763],{"type":23,"value":34764},"logistics automation",{"type":17,"tag":239,"props":34766,"children":34768},{"id":34767},"_3-usps-api",[34769],{"type":23,"value":34770},"3. USPS API",{"type":17,"tag":29,"props":34772,"children":34773},{},[34774],{"type":17,"tag":133,"props":34775,"children":34777},{"href":34412,"rel":34776},[214],[34778],{"type":23,"value":34779},"USPS API documentation",{"type":17,"tag":29,"props":34781,"children":34782},{},[34783],{"type":23,"value":34784},"USPS is essential for US-based shipping workflows.",{"type":17,"tag":29,"props":34786,"children":34787},{},[34788],{"type":23,"value":15093},{"type":17,"tag":80,"props":34790,"children":34791},{},[34792,34797,34802,34806],{"type":17,"tag":84,"props":34793,"children":34794},{},[34795],{"type":23,"value":34796},"domestic shipping",{"type":17,"tag":84,"props":34798,"children":34799},{},[34800],{"type":23,"value":34801},"rate lookup",{"type":17,"tag":84,"props":34803,"children":34804},{},[34805],{"type":23,"value":34719},{"type":17,"tag":84,"props":34807,"children":34808},{},[34809],{"type":23,"value":34810},"fulfillment automation",{"type":17,"tag":239,"props":34812,"children":34814},{"id":34813},"_4-dhl-api",[34815],{"type":23,"value":34816},"4. DHL API",{"type":17,"tag":29,"props":34818,"children":34819},{},[34820],{"type":17,"tag":133,"props":34821,"children":34823},{"href":34420,"rel":34822},[214],[34824],{"type":23,"value":34825},"DHL API documentation",{"type":17,"tag":29,"props":34827,"children":34828},{},[34829],{"type":23,"value":34830},"DHL is a major international shipping provider.",{"type":17,"tag":29,"props":34832,"children":34833},{},[34834],{"type":23,"value":23339},{"type":17,"tag":80,"props":34836,"children":34837},{},[34838,34843,34848,34852],{"type":17,"tag":84,"props":34839,"children":34840},{},[34841],{"type":23,"value":34842},"international shipments",{"type":17,"tag":84,"props":34844,"children":34845},{},[34846],{"type":23,"value":34847},"customs and cross-border logistics",{"type":17,"tag":84,"props":34849,"children":34850},{},[34851],{"type":23,"value":34719},{"type":17,"tag":84,"props":34853,"children":34854},{},[34855],{"type":23,"value":34714},{"type":17,"tag":239,"props":34857,"children":34859},{"id":34858},"_5-shippo-api",[34860],{"type":23,"value":34861},"5. Shippo API",{"type":17,"tag":29,"props":34863,"children":34864},{},[34865],{"type":17,"tag":133,"props":34866,"children":34868},{"href":34429,"rel":34867},[214],[34869],{"type":23,"value":34870},"Shippo API documentation",{"type":17,"tag":29,"props":34872,"children":34873},{},[34874],{"type":23,"value":34875},"Shippo acts as a multi-carrier shipping platform.",{"type":17,"tag":29,"props":34877,"children":34878},{},[34879],{"type":23,"value":15093},{"type":17,"tag":80,"props":34881,"children":34882},{},[34883,34888,34893,34898],{"type":17,"tag":84,"props":34884,"children":34885},{},[34886],{"type":23,"value":34887},"rate aggregation across carriers",{"type":17,"tag":84,"props":34889,"children":34890},{},[34891],{"type":23,"value":34892},"label creation",{"type":17,"tag":84,"props":34894,"children":34895},{},[34896],{"type":23,"value":34897},"shipment tracking",{"type":17,"tag":84,"props":34899,"children":34900},{},[34901],{"type":23,"value":34902},"simplified multi-carrier integration",{"type":17,"tag":239,"props":34904,"children":34906},{"id":34905},"_6-shipstation-api",[34907],{"type":23,"value":34908},"6. ShipStation API",{"type":17,"tag":29,"props":34910,"children":34911},{},[34912],{"type":17,"tag":133,"props":34913,"children":34915},{"href":34438,"rel":34914},[214],[34916],{"type":23,"value":34917},"ShipStation API documentation",{"type":17,"tag":29,"props":34919,"children":34920},{},[34921],{"type":23,"value":34922},"ShipStation is widely used for order fulfillment and shipping management.",{"type":17,"tag":29,"props":34924,"children":34925},{},[34926],{"type":23,"value":23339},{"type":17,"tag":80,"props":34928,"children":34929},{},[34930,34935,34939,34943],{"type":17,"tag":84,"props":34931,"children":34932},{},[34933],{"type":23,"value":34934},"order-to-shipment workflows",{"type":17,"tag":84,"props":34936,"children":34937},{},[34938],{"type":23,"value":34709},{"type":17,"tag":84,"props":34940,"children":34941},{},[34942],{"type":23,"value":34810},{"type":17,"tag":84,"props":34944,"children":34945},{},[34946],{"type":23,"value":34947},"warehouse integration",{"type":17,"tag":239,"props":34949,"children":34951},{"id":34950},"_7-easypost-api",[34952],{"type":23,"value":34953},"7. EasyPost API",{"type":17,"tag":29,"props":34955,"children":34956},{},[34957],{"type":17,"tag":133,"props":34958,"children":34961},{"href":34959,"rel":34960},"https://docs.easypost.com/docs/api",[214],[34962],{"type":23,"value":34963},"EasyPost API documentation",{"type":17,"tag":29,"props":34965,"children":34966},{},[34967],{"type":23,"value":34968},"EasyPost provides a unified layer across multiple carriers.",{"type":17,"tag":29,"props":34970,"children":34971},{},[34972],{"type":23,"value":23382},{"type":17,"tag":80,"props":34974,"children":34975},{},[34976,34981,34985,34989],{"type":17,"tag":84,"props":34977,"children":34978},{},[34979],{"type":23,"value":34980},"multi-carrier rate comparison",{"type":17,"tag":84,"props":34982,"children":34983},{},[34984],{"type":23,"value":34704},{"type":17,"tag":84,"props":34986,"children":34987},{},[34988],{"type":23,"value":34719},{"type":17,"tag":84,"props":34990,"children":34991},{},[34992],{"type":23,"value":34764},{"type":17,"tag":239,"props":34994,"children":34996},{"id":34995},"_8-sendcloud-api",[34997],{"type":23,"value":34998},"8. Sendcloud API",{"type":17,"tag":29,"props":35000,"children":35001},{},[35002],{"type":17,"tag":133,"props":35003,"children":35006},{"href":35004,"rel":35005},"https://docs.sendcloud.dev/docs/sendcloud-public-api",[214],[35007],{"type":23,"value":35008},"Sendcloud API documentation",{"type":17,"tag":29,"props":35010,"children":35011},{},[35012],{"type":23,"value":35013},"Sendcloud is commonly used in Europe for shipping and fulfillment workflows.",{"type":17,"tag":29,"props":35015,"children":35016},{},[35017],{"type":23,"value":23339},{"type":17,"tag":80,"props":35019,"children":35020},{},[35021,35025,35030,35034],{"type":17,"tag":84,"props":35022,"children":35023},{},[35024],{"type":23,"value":34709},{"type":17,"tag":84,"props":35026,"children":35027},{},[35028],{"type":23,"value":35029},"multi-carrier shipping",{"type":17,"tag":84,"props":35031,"children":35032},{},[35033],{"type":23,"value":34810},{"type":17,"tag":84,"props":35035,"children":35036},{},[35037],{"type":23,"value":34719},{"type":17,"tag":239,"props":35039,"children":35041},{"id":35040},"_9-canada-post-api",[35042],{"type":23,"value":35043},"9. Canada Post API",{"type":17,"tag":29,"props":35045,"children":35046},{},[35047],{"type":17,"tag":133,"props":35048,"children":35051},{"href":35049,"rel":35050},"https://www.canadapost-postescanada.ca/info/mc/business/productsservices/developers/services/index.jsf",[214],[35052],{"type":23,"value":35053},"Canada Post API documentation",{"type":17,"tag":29,"props":35055,"children":35056},{},[35057],{"type":23,"value":35058},"Canada Post is essential for Canadian shipping workflows.",{"type":17,"tag":29,"props":35060,"children":35061},{},[35062],{"type":23,"value":15093},{"type":17,"tag":80,"props":35064,"children":35065},{},[35066,35070,35074,35078],{"type":17,"tag":84,"props":35067,"children":35068},{},[35069],{"type":23,"value":34796},{"type":17,"tag":84,"props":35071,"children":35072},{},[35073],{"type":23,"value":34714},{"type":17,"tag":84,"props":35075,"children":35076},{},[35077],{"type":23,"value":34892},{"type":17,"tag":84,"props":35079,"children":35080},{},[35081],{"type":23,"value":34719},{"type":17,"tag":239,"props":35083,"children":35085},{"id":35084},"_10-netsuite-shipping-fulfillment-apis",[35086],{"type":23,"value":35087},"10. NetSuite Shipping / Fulfillment APIs",{"type":17,"tag":29,"props":35089,"children":35090},{},[35091],{"type":17,"tag":133,"props":35092,"children":35095},{"href":35093,"rel":35094},"https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_1555594476.html",[214],[35096],{"type":23,"value":35097},"NetSuite API documentation",{"type":17,"tag":29,"props":35099,"children":35100},{},[35101],{"type":23,"value":35102},"NetSuite is often used for ERP-driven fulfillment and shipping workflows.",{"type":17,"tag":29,"props":35104,"children":35105},{},[35106],{"type":23,"value":23339},{"type":17,"tag":80,"props":35108,"children":35109},{},[35110,35115,35120,35124],{"type":17,"tag":84,"props":35111,"children":35112},{},[35113],{"type":23,"value":35114},"order fulfillment",{"type":17,"tag":84,"props":35116,"children":35117},{},[35118],{"type":23,"value":35119},"shipment records",{"type":17,"tag":84,"props":35121,"children":35122},{},[35123],{"type":23,"value":34947},{"type":17,"tag":84,"props":35125,"children":35126},{},[35127],{"type":23,"value":35128},"financial + logistics sync",{"type":17,"tag":68,"props":35130,"children":35132},{"id":35131},"challenges-with-shipping-api-integrations",[35133],{"type":23,"value":35134},"Challenges with shipping API integrations",{"type":17,"tag":29,"props":35136,"children":35137},{},[35138],{"type":23,"value":35139},"Shipping APIs are deceptively complex.",{"type":17,"tag":239,"props":35141,"children":35143},{"id":35142},"carrier-fragmentation",[35144],{"type":23,"value":35145},"Carrier fragmentation",{"type":17,"tag":29,"props":35147,"children":35148},{},[35149],{"type":23,"value":35150},"Each carrier defines:",{"type":17,"tag":80,"props":35152,"children":35153},{},[35154,35159,35164,35169,35173],{"type":17,"tag":84,"props":35155,"children":35156},{},[35157],{"type":23,"value":35158},"rates",{"type":17,"tag":84,"props":35160,"children":35161},{},[35162],{"type":23,"value":35163},"services",{"type":17,"tag":84,"props":35165,"children":35166},{},[35167],{"type":23,"value":35168},"delivery times",{"type":17,"tag":84,"props":35170,"children":35171},{},[35172],{"type":23,"value":34502},{"type":17,"tag":84,"props":35174,"children":35175},{},[35176],{"type":23,"value":35177},"tracking events",{"type":17,"tag":29,"props":35179,"children":35180},{},[35181],{"type":23,"value":23797},{"type":17,"tag":239,"props":35183,"children":35185},{"id":35184},"rate-calculation-complexity",[35186],{"type":23,"value":35187},"Rate calculation complexity",{"type":17,"tag":29,"props":35189,"children":35190},{},[35191],{"type":23,"value":35192},"Rates depend on:",{"type":17,"tag":80,"props":35194,"children":35195},{},[35196,35201,35206,35211],{"type":17,"tag":84,"props":35197,"children":35198},{},[35199],{"type":23,"value":35200},"origin and destination",{"type":17,"tag":84,"props":35202,"children":35203},{},[35204],{"type":23,"value":35205},"package size and weight",{"type":17,"tag":84,"props":35207,"children":35208},{},[35209],{"type":23,"value":35210},"service type",{"type":17,"tag":84,"props":35212,"children":35213},{},[35214],{"type":23,"value":35215},"carrier rules",{"type":17,"tag":29,"props":35217,"children":35218},{},[35219],{"type":23,"value":35220},"Even small inconsistencies can break workflows.",{"type":17,"tag":239,"props":35222,"children":35224},{"id":35223},"tracking-event-differences",[35225],{"type":23,"value":35226},"Tracking event differences",{"type":17,"tag":29,"props":35228,"children":35229},{},[35230],{"type":23,"value":35231},"Tracking data varies across providers:",{"type":17,"tag":80,"props":35233,"children":35234},{},[35235,35240,35245,35249],{"type":17,"tag":84,"props":35236,"children":35237},{},[35238],{"type":23,"value":35239},"event formats",{"type":17,"tag":84,"props":35241,"children":35242},{},[35243],{"type":23,"value":35244},"status codes",{"type":17,"tag":84,"props":35246,"children":35247},{},[35248],{"type":23,"value":19954},{"type":17,"tag":84,"props":35250,"children":35251},{},[35252],{"type":23,"value":35253},"delivery estimates",{"type":17,"tag":239,"props":35255,"children":35257},{"id":35256},"label-formats-and-requirements",[35258],{"type":23,"value":35259},"Label formats and requirements",{"type":17,"tag":29,"props":35261,"children":35262},{},[35263],{"type":23,"value":35264},"Each provider has different:",{"type":17,"tag":80,"props":35266,"children":35267},{},[35268,35273,35277,35282],{"type":17,"tag":84,"props":35269,"children":35270},{},[35271],{"type":23,"value":35272},"label formats",{"type":17,"tag":84,"props":35274,"children":35275},{},[35276],{"type":23,"value":29838},{"type":17,"tag":84,"props":35278,"children":35279},{},[35280],{"type":23,"value":35281},"service constraints",{"type":17,"tag":84,"props":35283,"children":35284},{},[35285],{"type":23,"value":35286},"compliance requirements",{"type":17,"tag":239,"props":35288,"children":35290},{"id":35289},"multi-carrier-logic",[35291],{"type":23,"value":35292},"Multi-carrier logic",{"type":17,"tag":29,"props":35294,"children":35295},{},[35296],{"type":23,"value":35297},"Once you support multiple carriers, you need logic for:",{"type":17,"tag":80,"props":35299,"children":35300},{},[35301,35306,35311,35316],{"type":17,"tag":84,"props":35302,"children":35303},{},[35304],{"type":23,"value":35305},"carrier selection",{"type":17,"tag":84,"props":35307,"children":35308},{},[35309],{"type":23,"value":35310},"fallback strategies",{"type":17,"tag":84,"props":35312,"children":35313},{},[35314],{"type":23,"value":35315},"cost optimization",{"type":17,"tag":84,"props":35317,"children":35318},{},[35319],{"type":23,"value":35320},"service-level decisions",{"type":17,"tag":68,"props":35322,"children":35324},{"id":35323},"the-role-of-unified-shipping-apis",[35325],{"type":23,"value":35326},"The role of Unified Shipping APIs",{"type":17,"tag":29,"props":35328,"children":35329},{},[35330],{"type":23,"value":35331},"This is where Unified Shipping APIs become valuable.",{"type":17,"tag":29,"props":35333,"children":35334},{},[35335,35337,35341],{"type":23,"value":35336},"Instead of building separate integrations for FedEx, UPS, USPS, DHL, Shippo, ShipStation, EasyPost, and others, a ",{"type":17,"tag":133,"props":35338,"children":35339},{"href":7691},[35340],{"type":23,"value":7806},{"type":23,"value":35342}," provides one interface across all shipping providers.",{"type":17,"tag":29,"props":35344,"children":35345},{},[35346],{"type":23,"value":5804},{"type":17,"tag":80,"props":35348,"children":35349},{},[35350,35354,35358,35363],{"type":17,"tag":84,"props":35351,"children":35352},{},[35353],{"type":23,"value":23897},{"type":17,"tag":84,"props":35355,"children":35356},{},[35357],{"type":23,"value":23902},{"type":17,"tag":84,"props":35359,"children":35360},{},[35361],{"type":23,"value":35362},"one schema for shipments, labels, tracking, and rates",{"type":17,"tag":84,"props":35364,"children":35365},{},[35366],{"type":23,"value":23912},{"type":17,"tag":29,"props":35368,"children":35369},{},[35370],{"type":23,"value":35371},"For SaaS products that need to support multi-carrier shipping, this simplifies architecture significantly.",{"type":17,"tag":68,"props":35373,"children":35375},{"id":35374},"build-once-with-the-unified-shipping-api",[35376],{"type":23,"value":35377},"Build once with the Unified Shipping API",{"type":17,"tag":29,"props":35379,"children":35380},{},[35381,35382,35389,35390,35395],{"type":23,"value":6712},{"type":17,"tag":133,"props":35383,"children":35386},{"href":35384,"rel":35385},"https://unified.to/shipping",[214],[35387],{"type":23,"value":35388},"Unified Shipping API",{"type":23,"value":23936},{"type":17,"tag":48,"props":35391,"children":35392},{},[35393],{"type":23,"value":35394},"10+ shipping integrations",{"type":23,"value":29965},{"type":17,"tag":29,"props":35397,"children":35398},{},[35399],{"type":23,"value":13248},{"type":17,"tag":80,"props":35401,"children":35402},{},[35403,35407,35411,35415,35419,35423,35427,35432,35437,35442],{"type":17,"tag":84,"props":35404,"children":35405},{},[35406],{"type":23,"value":34400},{"type":17,"tag":84,"props":35408,"children":35409},{},[35410],{"type":23,"value":34408},{"type":17,"tag":84,"props":35412,"children":35413},{},[35414],{"type":23,"value":34416},{"type":17,"tag":84,"props":35416,"children":35417},{},[35418],{"type":23,"value":34424},{"type":17,"tag":84,"props":35420,"children":35421},{},[35422],{"type":23,"value":34433},{"type":17,"tag":84,"props":35424,"children":35425},{},[35426],{"type":23,"value":34442},{"type":17,"tag":84,"props":35428,"children":35429},{},[35430],{"type":23,"value":35431},"EasyPost",{"type":17,"tag":84,"props":35433,"children":35434},{},[35435],{"type":23,"value":35436},"Sendcloud",{"type":17,"tag":84,"props":35438,"children":35439},{},[35440],{"type":23,"value":35441},"Canada Post",{"type":17,"tag":84,"props":35443,"children":35444},{},[35445],{"type":23,"value":13070},{"type":17,"tag":239,"props":35447,"children":35449},{"id":35448},"unified-shipping-objects",[35450],{"type":23,"value":35451},"Unified Shipping objects",{"type":17,"tag":29,"props":35453,"children":35454},{},[35455],{"type":23,"value":35456},"Unified standardizes core shipping objects:",{"type":17,"tag":80,"props":35458,"children":35459},{},[35460,35465,35470,35475,35480],{"type":17,"tag":84,"props":35461,"children":35462},{},[35463],{"type":23,"value":35464},"Shipments",{"type":17,"tag":84,"props":35466,"children":35467},{},[35468],{"type":23,"value":35469},"Labels",{"type":17,"tag":84,"props":35471,"children":35472},{},[35473],{"type":23,"value":35474},"Tracking",{"type":17,"tag":84,"props":35476,"children":35477},{},[35478],{"type":23,"value":35479},"Rates",{"type":17,"tag":84,"props":35481,"children":35482},{},[35483],{"type":23,"value":35484},"Carriers",{"type":17,"tag":29,"props":35486,"children":35487},{},[35488],{"type":23,"value":35489},"This allows developers to build once and support multiple carriers without rewriting logic for each provider.",{"type":17,"tag":239,"props":35491,"children":35492},{"id":24049},[35493],{"type":23,"value":24052},{"type":17,"tag":29,"props":35495,"children":35496},{},[35497],{"type":23,"value":35498},"Many shipping integrations rely on:",{"type":17,"tag":80,"props":35500,"children":35501},{},[35502,35507,35512],{"type":17,"tag":84,"props":35503,"children":35504},{},[35505],{"type":23,"value":35506},"polling for updates",{"type":17,"tag":84,"props":35508,"children":35509},{},[35510],{"type":23,"value":35511},"cached shipment data",{"type":17,"tag":84,"props":35513,"children":35514},{},[35515],{"type":23,"value":32813},{"type":17,"tag":29,"props":35517,"children":35518},{},[35519,35520,35524],{"type":23,"value":24080},{"type":17,"tag":48,"props":35521,"children":35522},{},[35523],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":35526,"children":35527},{},[35528],{"type":23,"value":5804},{"type":17,"tag":80,"props":35530,"children":35531},{},[35532,35537,35542,35546],{"type":17,"tag":84,"props":35533,"children":35534},{},[35535],{"type":23,"value":35536},"every request hits the source carrier or platform live",{"type":17,"tag":84,"props":35538,"children":35539},{},[35540],{"type":23,"value":35541},"no stale tracking or shipment data",{"type":17,"tag":84,"props":35543,"children":35544},{},[35545],{"type":23,"value":30123},{"type":17,"tag":84,"props":35547,"children":35548},{},[35549],{"type":23,"value":35550},"read and write support across shipping objects",{"type":17,"tag":29,"props":35552,"children":35553},{},[35554,35555,35559],{"type":23,"value":24117},{"type":17,"tag":48,"props":35556,"children":35557},{},[35558],{"type":23,"value":24122},{"type":23,"value":35560},", so shipping and logistics data is not stored at rest by the integration layer.",{"type":17,"tag":239,"props":35562,"children":35563},{"id":24132},[35564],{"type":23,"value":24135},{"type":17,"tag":29,"props":35566,"children":35567},{},[35568],{"type":23,"value":24140},{"type":17,"tag":80,"props":35570,"children":35571},{},[35572,35577,35582,35586,35591,35596],{"type":17,"tag":84,"props":35573,"children":35574},{},[35575],{"type":23,"value":35576},"multi-carrier shipping dashboards",{"type":17,"tag":84,"props":35578,"children":35579},{},[35580],{"type":23,"value":35581},"label generation tools",{"type":17,"tag":84,"props":35583,"children":35584},{},[35585],{"type":23,"value":34534},{"type":17,"tag":84,"props":35587,"children":35588},{},[35589],{"type":23,"value":35590},"tracking and notification platforms",{"type":17,"tag":84,"props":35592,"children":35593},{},[35594],{"type":23,"value":35595},"returns management tools",{"type":17,"tag":84,"props":35597,"children":35598},{},[35599],{"type":23,"value":35600},"shipping analytics products",{"type":17,"tag":29,"props":35602,"children":35603},{},[35604],{"type":23,"value":35605},"without building separate integrations for every carrier.",{"type":17,"tag":68,"props":35607,"children":35609},{"id":35608},"why-not-build-each-shipping-integration-directly",[35610],{"type":23,"value":35611},"Why not build each shipping integration directly?",{"type":17,"tag":29,"props":35613,"children":35614},{},[35615],{"type":23,"value":30198},{"type":17,"tag":29,"props":35617,"children":35618},{},[35619],{"type":23,"value":24187},{"type":17,"tag":80,"props":35621,"children":35622},{},[35623,35627,35632,35637,35641,35645],{"type":17,"tag":84,"props":35624,"children":35625},{},[35626],{"type":23,"value":2109},{"type":17,"tag":84,"props":35628,"children":35629},{},[35630],{"type":23,"value":35631},"rate logic",{"type":17,"tag":84,"props":35633,"children":35634},{},[35635],{"type":23,"value":35636},"shipment schemas",{"type":17,"tag":84,"props":35638,"children":35639},{},[35640],{"type":23,"value":35177},{"type":17,"tag":84,"props":35642,"children":35643},{},[35644],{"type":23,"value":35272},{"type":17,"tag":84,"props":35646,"children":35647},{},[35648],{"type":23,"value":24214},{"type":17,"tag":29,"props":35650,"children":35651},{},[35652],{"type":23,"value":35653},"Shipping is one of the categories where fragmentation creates long-term maintenance overhead.",{"type":17,"tag":29,"props":35655,"children":35656},{},[35657],{"type":23,"value":35658},"A Unified Shipping API reduces that complexity and makes it easier to scale across carriers.",{"type":17,"tag":68,"props":35660,"children":35661},{"id":1552},[35662],{"type":23,"value":1555},{"type":17,"tag":29,"props":35664,"children":35665},{},[35666],{"type":23,"value":35667},"Shipping APIs are essential for any product that touches fulfillment, logistics, or e-commerce operations, but supporting multiple carriers directly is difficult to maintain at scale.",{"type":17,"tag":29,"props":35669,"children":35670},{},[35671],{"type":23,"value":35672},"That is why more SaaS teams are moving toward Unified Shipping APIs.",{"type":17,"tag":29,"props":35674,"children":35675},{},[35676,35678,35683],{"type":23,"value":35677},"If you need real-time, read/write access to shipping data across FedEx, UPS, USPS, DHL, Shippo, ShipStation, and more, ",{"type":17,"tag":133,"props":35679,"children":35681},{"href":212,"rel":35680},[214],[35682],{"type":23,"value":217},{"type":23,"value":24258},{"type":17,"tag":29,"props":35685,"children":35686},{},[35687,35688],{"type":23,"value":1609},{"type":17,"tag":133,"props":35689,"children":35691},{"href":35690},"/32c6207b83848010bee0d8181356c394",[35692],{"type":23,"value":1616},{"type":17,"tag":29,"props":35694,"children":35695},{},[35696,35697],{"type":23,"value":1609},{"type":17,"tag":133,"props":35698,"children":35699},{"href":35690},[35700],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":35702},[35703,35704,35705,35717,35724,35725,35730,35731],{"id":34465,"depth":1629,"text":34468},{"id":34552,"depth":1629,"text":34555},{"id":34664,"depth":1629,"text":34667,"children":35706},[35707,35708,35709,35710,35711,35712,35713,35714,35715,35716],{"id":34675,"depth":1635,"text":34678},{"id":34722,"depth":1635,"text":34725},{"id":34767,"depth":1635,"text":34770},{"id":34813,"depth":1635,"text":34816},{"id":34858,"depth":1635,"text":34861},{"id":34905,"depth":1635,"text":34908},{"id":34950,"depth":1635,"text":34953},{"id":34995,"depth":1635,"text":34998},{"id":35040,"depth":1635,"text":35043},{"id":35084,"depth":1635,"text":35087},{"id":35131,"depth":1629,"text":35134,"children":35718},[35719,35720,35721,35722,35723],{"id":35142,"depth":1635,"text":35145},{"id":35184,"depth":1635,"text":35187},{"id":35223,"depth":1635,"text":35226},{"id":35256,"depth":1635,"text":35259},{"id":35289,"depth":1635,"text":35292},{"id":35323,"depth":1629,"text":35326},{"id":35374,"depth":1629,"text":35377,"children":35726},[35727,35728,35729],{"id":35448,"depth":1635,"text":35451},{"id":24049,"depth":1635,"text":24052},{"id":24132,"depth":1635,"text":24135},{"id":35608,"depth":1629,"text":35611},{"id":1552,"depth":1629,"text":1555},"content:blog:10_shipping_apis_to_integrate_with_in_2026_fedex_ups_shippo_and_unified_shipping_apis.md","blog/10_shipping_apis_to_integrate_with_in_2026_fedex_ups_shippo_and_unified_shipping_apis.md","blog/10_shipping_apis_to_integrate_with_in_2026_fedex_ups_shippo_and_unified_shipping_apis",{"_path":35736,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":35737,"description":35738,"img":35739,"date":35740,"tag":12,"body":35741,"_type":1677,"_id":37390,"_source":1679,"_file":37391,"_stem":37392,"_extension":1682},"/blog/15_payment_apis_to_integrate_with_in_2026_stripe_paypal_square_and_unified_payment_apis","15 Payment APIs to Integrate With in 2026: Stripe, PayPal, Square, and Unified Payment APIs","Whether you are building billing, marketplaces, fintech products, or analytics tools, you will eventually need access to payment data across multiple...","https://s3.us-east-2.amazonaws.com/unified-article-images/15_payment_apis_to_integrate_with_in_2026_stripe_paypal_square_and_unified_payment_apis-icon.png","2026-03-23T23:42:00.000Z",{"type":14,"children":35742,"toc":37353},[35743,35748,35751,35758,35763,35768,35802,35815,35833,35839,35844,35848,35876,35880,35918,35924,35929,35934,35967,35971,35979,35984,35992,35997,36005,36010,36018,36023,36031,36036,36042,36047,36053,36062,36067,36071,36097,36103,36112,36117,36121,36144,36150,36159,36164,36168,36190,36196,36205,36210,36214,36237,36243,36253,36258,36262,36285,36291,36301,36306,36310,36333,36339,36349,36354,36358,36381,36387,36397,36402,36406,36429,36435,36445,36450,36454,36472,36478,36488,36493,36497,36519,36525,36535,36540,36544,36560,36566,36574,36579,36583,36600,36606,36616,36621,36625,36640,36646,36656,36661,36665,36685,36691,36699,36704,36708,36729,36735,36740,36773,36778,36784,36789,36795,36800,36819,36823,36829,36834,36860,36866,36871,36894,36899,36905,36910,36926,36931,36937,36941,36971,36976,36982,36987,36992,36996,37017,37022,37028,37046,37050,37093,37099,37104,37132,37137,37141,37146,37161,37170,37174,37195,37205,37210,37214,37218,37248,37253,37259,37263,37267,37295,37300,37305,37309,37314,37319,37324,37335,37344],{"type":17,"tag":18,"props":35744,"children":35746},{"id":35745},"_15-payment-apis-to-integrate-with-in-2026-stripe-paypal-square-and-unified-payment-apis",[35747],{"type":23,"value":35737},{"type":17,"tag":25,"props":35749,"children":35750},{},[],{"type":17,"tag":29,"props":35752,"children":35753},{},[35754],{"type":17,"tag":33,"props":35755,"children":35756},{},[35757],{"type":23,"value":33053},{"type":17,"tag":29,"props":35759,"children":35760},{},[35761],{"type":23,"value":35762},"Payments sit at the center of most SaaS products.",{"type":17,"tag":29,"props":35764,"children":35765},{},[35766],{"type":23,"value":35767},"Whether you are building billing, marketplaces, fintech products, or analytics tools, you will eventually need access to payment data across multiple providers. That is where things get complicated.",{"type":17,"tag":29,"props":35769,"children":35770},{},[35771,35773,35779,35780,35786,35787,35793,35794,35800],{"type":23,"value":35772},"Platforms like ",{"type":17,"tag":133,"props":35774,"children":35777},{"href":35775,"rel":35776},"https://docs.stripe.com/api",[214],[35778],{"type":23,"value":26548},{"type":23,"value":11826},{"type":17,"tag":133,"props":35781,"children":35784},{"href":35782,"rel":35783},"https://developer.paypal.com/api/rest/",[214],[35785],{"type":23,"value":26553},{"type":23,"value":11826},{"type":17,"tag":133,"props":35788,"children":35791},{"href":35789,"rel":35790},"https://developer.squareup.com/reference/square",[214],[35792],{"type":23,"value":14193},{"type":23,"value":11826},{"type":17,"tag":133,"props":35795,"children":35798},{"href":35796,"rel":35797},"https://docs.adyen.com/api-explorer/",[214],[35799],{"type":23,"value":11750},{"type":23,"value":35801},", and others all expose different APIs, authentication flows, object models, and lifecycle events.",{"type":17,"tag":29,"props":35803,"children":35804},{},[35805,35807,35813],{"type":23,"value":35806},"Supporting one ",{"type":17,"tag":133,"props":35808,"children":35810},{"href":35809},"/payment",[35811],{"type":23,"value":35812},"payment API",{"type":23,"value":35814}," is manageable. Supporting many becomes a real infrastructure problem.",{"type":17,"tag":29,"props":35816,"children":35817},{},[35818,35819,35824,35826,35831],{"type":23,"value":23079},{"type":17,"tag":48,"props":35820,"children":35821},{},[35822],{"type":23,"value":35823},"top payment APIs to integrate with in 2026",{"type":23,"value":35825},", the main use cases in this category, the challenges of building payment integrations directly, and why more teams are moving toward ",{"type":17,"tag":48,"props":35827,"children":35828},{},[35829],{"type":23,"value":35830},"Unified Payment APIs",{"type":23,"value":35832}," instead of managing each provider independently.",{"type":17,"tag":68,"props":35834,"children":35836},{"id":35835},"what-is-a-payment-api",[35837],{"type":23,"value":35838},"What is a payment API?",{"type":17,"tag":29,"props":35840,"children":35841},{},[35842],{"type":23,"value":35843},"A payment API allows developers to process and retrieve financial transactions programmatically.",{"type":17,"tag":29,"props":35845,"children":35846},{},[35847],{"type":23,"value":23109},{"type":17,"tag":80,"props":35849,"children":35850},{},[35851,35856,35861,35866,35871],{"type":17,"tag":84,"props":35852,"children":35853},{},[35854],{"type":23,"value":35855},"payments and charges",{"type":17,"tag":84,"props":35857,"children":35858},{},[35859],{"type":23,"value":35860},"payment links and checkout sessions",{"type":17,"tag":84,"props":35862,"children":35863},{},[35864],{"type":23,"value":35865},"payouts and transfers",{"type":17,"tag":84,"props":35867,"children":35868},{},[35869],{"type":23,"value":35870},"refunds and chargebacks",{"type":17,"tag":84,"props":35872,"children":35873},{},[35874],{"type":23,"value":35875},"subscriptions and recurring billing",{"type":17,"tag":29,"props":35877,"children":35878},{},[35879],{"type":23,"value":23132},{"type":17,"tag":80,"props":35881,"children":35882},{},[35883,35888,35893,35898,35903,35908,35913],{"type":17,"tag":84,"props":35884,"children":35885},{},[35886],{"type":23,"value":35887},"billing systems",{"type":17,"tag":84,"props":35889,"children":35890},{},[35891],{"type":23,"value":35892},"subscription platforms",{"type":17,"tag":84,"props":35894,"children":35895},{},[35896],{"type":23,"value":35897},"payment analytics dashboards",{"type":17,"tag":84,"props":35899,"children":35900},{},[35901],{"type":23,"value":35902},"reconciliation workflows",{"type":17,"tag":84,"props":35904,"children":35905},{},[35906],{"type":23,"value":35907},"marketplace payout systems",{"type":17,"tag":84,"props":35909,"children":35910},{},[35911],{"type":23,"value":35912},"fraud detection tools",{"type":17,"tag":84,"props":35914,"children":35915},{},[35916],{"type":23,"value":35917},"embedded finance products",{"type":17,"tag":68,"props":35919,"children":35921},{"id":35920},"why-saas-products-integrate-payment-apis",[35922],{"type":23,"value":35923},"Why SaaS products integrate payment APIs",{"type":17,"tag":29,"props":35925,"children":35926},{},[35927],{"type":23,"value":35928},"Payment data is foundational to many workflows beyond simple transactions.",{"type":17,"tag":29,"props":35930,"children":35931},{},[35932],{"type":23,"value":35933},"SaaS products often connect payment platforms with:",{"type":17,"tag":80,"props":35935,"children":35936},{},[35937,35942,35947,35952,35957,35962],{"type":17,"tag":84,"props":35938,"children":35939},{},[35940],{"type":23,"value":35941},"accounting systems",{"type":17,"tag":84,"props":35943,"children":35944},{},[35945],{"type":23,"value":35946},"CRM and revenue platforms",{"type":17,"tag":84,"props":35948,"children":35949},{},[35950],{"type":23,"value":35951},"subscription management",{"type":17,"tag":84,"props":35953,"children":35954},{},[35955],{"type":23,"value":35956},"marketplaces",{"type":17,"tag":84,"props":35958,"children":35959},{},[35960],{"type":23,"value":35961},"analytics and BI",{"type":17,"tag":84,"props":35963,"children":35964},{},[35965],{"type":23,"value":35966},"AI agents and automation",{"type":17,"tag":29,"props":35968,"children":35969},{},[35970],{"type":23,"value":12661},{"type":17,"tag":29,"props":35972,"children":35973},{},[35974],{"type":17,"tag":48,"props":35975,"children":35976},{},[35977],{"type":23,"value":35978},"Payment analytics and reporting",{"type":17,"tag":29,"props":35980,"children":35981},{},[35982],{"type":23,"value":35983},"Track revenue, refunds, and transaction volume across platforms.",{"type":17,"tag":29,"props":35985,"children":35986},{},[35987],{"type":17,"tag":48,"props":35988,"children":35989},{},[35990],{"type":23,"value":35991},"Subscription management",{"type":17,"tag":29,"props":35993,"children":35994},{},[35995],{"type":23,"value":35996},"Monitor recurring revenue, churn, and billing cycles.",{"type":17,"tag":29,"props":35998,"children":35999},{},[36000],{"type":17,"tag":48,"props":36001,"children":36002},{},[36003],{"type":23,"value":36004},"Marketplace payouts",{"type":17,"tag":29,"props":36006,"children":36007},{},[36008],{"type":23,"value":36009},"Manage disbursements across sellers or vendors.",{"type":17,"tag":29,"props":36011,"children":36012},{},[36013],{"type":17,"tag":48,"props":36014,"children":36015},{},[36016],{"type":23,"value":36017},"Reconciliation and accounting sync",{"type":17,"tag":29,"props":36019,"children":36020},{},[36021],{"type":23,"value":36022},"Match payments to invoices and sync with accounting tools.",{"type":17,"tag":29,"props":36024,"children":36025},{},[36026],{"type":17,"tag":48,"props":36027,"children":36028},{},[36029],{"type":23,"value":36030},"Fraud detection and monitoring",{"type":17,"tag":29,"props":36032,"children":36033},{},[36034],{"type":23,"value":36035},"Analyze payment patterns and anomalies across providers.",{"type":17,"tag":68,"props":36037,"children":36039},{"id":36038},"_15-payment-apis-to-integrate-with-in-2026",[36040],{"type":23,"value":36041},"15 Payment APIs to integrate with in 2026",{"type":17,"tag":29,"props":36043,"children":36044},{},[36045],{"type":23,"value":36046},"Below are the most important payment APIs SaaS teams commonly need to support.",{"type":17,"tag":239,"props":36048,"children":36050},{"id":36049},"_1-stripe-api",[36051],{"type":23,"value":36052},"1. Stripe API",{"type":17,"tag":29,"props":36054,"children":36055},{},[36056],{"type":17,"tag":133,"props":36057,"children":36059},{"href":35775,"rel":36058},[214],[36060],{"type":23,"value":36061},"Stripe API documentation",{"type":17,"tag":29,"props":36063,"children":36064},{},[36065],{"type":23,"value":36066},"Stripe is one of the most widely used payment APIs for SaaS, marketplaces, and subscription businesses.",{"type":17,"tag":29,"props":36068,"children":36069},{},[36070],{"type":23,"value":15093},{"type":17,"tag":80,"props":36072,"children":36073},{},[36074,36078,36083,36087,36092],{"type":17,"tag":84,"props":36075,"children":36076},{},[36077],{"type":23,"value":35855},{"type":17,"tag":84,"props":36079,"children":36080},{},[36081],{"type":23,"value":36082},"subscriptions and billing",{"type":17,"tag":84,"props":36084,"children":36085},{},[36086],{"type":23,"value":35865},{"type":17,"tag":84,"props":36088,"children":36089},{},[36090],{"type":23,"value":36091},"payment links",{"type":17,"tag":84,"props":36093,"children":36094},{},[36095],{"type":23,"value":36096},"financial reporting",{"type":17,"tag":239,"props":36098,"children":36100},{"id":36099},"_2-paypal-api",[36101],{"type":23,"value":36102},"2. PayPal API",{"type":17,"tag":29,"props":36104,"children":36105},{},[36106],{"type":17,"tag":133,"props":36107,"children":36109},{"href":35782,"rel":36108},[214],[36110],{"type":23,"value":36111},"PayPal API documentation",{"type":17,"tag":29,"props":36113,"children":36114},{},[36115],{"type":23,"value":36116},"PayPal remains essential for global payments and consumer-facing products.",{"type":17,"tag":29,"props":36118,"children":36119},{},[36120],{"type":23,"value":23339},{"type":17,"tag":80,"props":36122,"children":36123},{},[36124,36129,36134,36139],{"type":17,"tag":84,"props":36125,"children":36126},{},[36127],{"type":23,"value":36128},"checkout flows",{"type":17,"tag":84,"props":36130,"children":36131},{},[36132],{"type":23,"value":36133},"international payments",{"type":17,"tag":84,"props":36135,"children":36136},{},[36137],{"type":23,"value":36138},"subscriptions",{"type":17,"tag":84,"props":36140,"children":36141},{},[36142],{"type":23,"value":36143},"refunds and disputes",{"type":17,"tag":239,"props":36145,"children":36147},{"id":36146},"_3-square-api",[36148],{"type":23,"value":36149},"3. Square API",{"type":17,"tag":29,"props":36151,"children":36152},{},[36153],{"type":17,"tag":133,"props":36154,"children":36156},{"href":35789,"rel":36155},[214],[36157],{"type":23,"value":36158},"Square API documentation",{"type":17,"tag":29,"props":36160,"children":36161},{},[36162],{"type":23,"value":36163},"Square is widely used for both online and in-person payments.",{"type":17,"tag":29,"props":36165,"children":36166},{},[36167],{"type":23,"value":15093},{"type":17,"tag":80,"props":36169,"children":36170},{},[36171,36175,36180,36185],{"type":17,"tag":84,"props":36172,"children":36173},{},[36174],{"type":23,"value":11734},{"type":17,"tag":84,"props":36176,"children":36177},{},[36178],{"type":23,"value":36179},"POS integration",{"type":17,"tag":84,"props":36181,"children":36182},{},[36183],{"type":23,"value":36184},"catalog and items",{"type":17,"tag":84,"props":36186,"children":36187},{},[36188],{"type":23,"value":36189},"payouts and reporting",{"type":17,"tag":239,"props":36191,"children":36193},{"id":36192},"_4-adyen-api",[36194],{"type":23,"value":36195},"4. Adyen API",{"type":17,"tag":29,"props":36197,"children":36198},{},[36199],{"type":17,"tag":133,"props":36200,"children":36202},{"href":35796,"rel":36201},[214],[36203],{"type":23,"value":36204},"Adyen API documentation",{"type":17,"tag":29,"props":36206,"children":36207},{},[36208],{"type":23,"value":36209},"Adyen is a global payment platform used by enterprise businesses.",{"type":17,"tag":29,"props":36211,"children":36212},{},[36213],{"type":23,"value":23339},{"type":17,"tag":80,"props":36215,"children":36216},{},[36217,36222,36227,36232],{"type":17,"tag":84,"props":36218,"children":36219},{},[36220],{"type":23,"value":36221},"global payment processing",{"type":17,"tag":84,"props":36223,"children":36224},{},[36225],{"type":23,"value":36226},"fraud and risk management",{"type":17,"tag":84,"props":36228,"children":36229},{},[36230],{"type":23,"value":36231},"multi-region payment flows",{"type":17,"tag":84,"props":36233,"children":36234},{},[36235],{"type":23,"value":36236},"enterprise commerce platforms",{"type":17,"tag":239,"props":36238,"children":36240},{"id":36239},"_5-gocardless-api",[36241],{"type":23,"value":36242},"5. GoCardless API",{"type":17,"tag":29,"props":36244,"children":36245},{},[36246],{"type":17,"tag":133,"props":36247,"children":36250},{"href":36248,"rel":36249},"https://developer.gocardless.com/",[214],[36251],{"type":23,"value":36252},"GoCardless API documentation",{"type":17,"tag":29,"props":36254,"children":36255},{},[36256],{"type":23,"value":36257},"GoCardless focuses on bank payments and recurring billing.",{"type":17,"tag":29,"props":36259,"children":36260},{},[36261],{"type":23,"value":15093},{"type":17,"tag":80,"props":36263,"children":36264},{},[36265,36270,36275,36280],{"type":17,"tag":84,"props":36266,"children":36267},{},[36268],{"type":23,"value":36269},"direct debit payments",{"type":17,"tag":84,"props":36271,"children":36272},{},[36273],{"type":23,"value":36274},"subscription billing",{"type":17,"tag":84,"props":36276,"children":36277},{},[36278],{"type":23,"value":36279},"payment collection workflows",{"type":17,"tag":84,"props":36281,"children":36282},{},[36283],{"type":23,"value":36284},"AR automation",{"type":17,"tag":239,"props":36286,"children":36288},{"id":36287},"_6-chargebee-api",[36289],{"type":23,"value":36290},"6. Chargebee API",{"type":17,"tag":29,"props":36292,"children":36293},{},[36294],{"type":17,"tag":133,"props":36295,"children":36298},{"href":36296,"rel":36297},"https://apidocs.chargebee.com/docs/api",[214],[36299],{"type":23,"value":36300},"Chargebee API documentation",{"type":17,"tag":29,"props":36302,"children":36303},{},[36304],{"type":23,"value":36305},"Chargebee is commonly used for subscription and billing workflows.",{"type":17,"tag":29,"props":36307,"children":36308},{},[36309],{"type":23,"value":23339},{"type":17,"tag":80,"props":36311,"children":36312},{},[36313,36318,36323,36328],{"type":17,"tag":84,"props":36314,"children":36315},{},[36316],{"type":23,"value":36317},"subscription lifecycle management",{"type":17,"tag":84,"props":36319,"children":36320},{},[36321],{"type":23,"value":36322},"invoicing",{"type":17,"tag":84,"props":36324,"children":36325},{},[36326],{"type":23,"value":36327},"recurring billing",{"type":17,"tag":84,"props":36329,"children":36330},{},[36331],{"type":23,"value":36332},"revenue analytics",{"type":17,"tag":239,"props":36334,"children":36336},{"id":36335},"_7-brex-api",[36337],{"type":23,"value":36338},"7. Brex API",{"type":17,"tag":29,"props":36340,"children":36341},{},[36342],{"type":17,"tag":133,"props":36343,"children":36346},{"href":36344,"rel":36345},"https://developer.brex.com/",[214],[36347],{"type":23,"value":36348},"Brex developer documentation",{"type":17,"tag":29,"props":36350,"children":36351},{},[36352],{"type":23,"value":36353},"Brex is relevant for spend management and corporate payments.",{"type":17,"tag":29,"props":36355,"children":36356},{},[36357],{"type":23,"value":23382},{"type":17,"tag":80,"props":36359,"children":36360},{},[36361,36366,36371,36376],{"type":17,"tag":84,"props":36362,"children":36363},{},[36364],{"type":23,"value":36365},"card transactions",{"type":17,"tag":84,"props":36367,"children":36368},{},[36369],{"type":23,"value":36370},"expense tracking",{"type":17,"tag":84,"props":36372,"children":36373},{},[36374],{"type":23,"value":36375},"financial analytics",{"type":17,"tag":84,"props":36377,"children":36378},{},[36379],{"type":23,"value":36380},"spend visibility",{"type":17,"tag":239,"props":36382,"children":36384},{"id":36383},"_8-billcom-api",[36385],{"type":23,"value":36386},"8. Bill.com API",{"type":17,"tag":29,"props":36388,"children":36389},{},[36390],{"type":17,"tag":133,"props":36391,"children":36394},{"href":36392,"rel":36393},"https://developer.bill.com/",[214],[36395],{"type":23,"value":36396},"Bill.com developer documentation",{"type":17,"tag":29,"props":36398,"children":36399},{},[36400],{"type":23,"value":36401},"Bill.com bridges payments and accounting workflows.",{"type":17,"tag":29,"props":36403,"children":36404},{},[36405],{"type":23,"value":23339},{"type":17,"tag":80,"props":36407,"children":36408},{},[36409,36414,36419,36424],{"type":17,"tag":84,"props":36410,"children":36411},{},[36412],{"type":23,"value":36413},"bill payments",{"type":17,"tag":84,"props":36415,"children":36416},{},[36417],{"type":23,"value":36418},"AP automation",{"type":17,"tag":84,"props":36420,"children":36421},{},[36422],{"type":23,"value":36423},"invoice processing",{"type":17,"tag":84,"props":36425,"children":36426},{},[36427],{"type":23,"value":36428},"payment reconciliation",{"type":17,"tag":239,"props":36430,"children":36432},{"id":36431},"_9-crezco-api",[36433],{"type":23,"value":36434},"9. Crezco API",{"type":17,"tag":29,"props":36436,"children":36437},{},[36438],{"type":17,"tag":133,"props":36439,"children":36442},{"href":36440,"rel":36441},"https://www.crezco.com/",[214],[36443],{"type":23,"value":36444},"Crezco",{"type":17,"tag":29,"props":36446,"children":36447},{},[36448],{"type":23,"value":36449},"Crezco focuses on bank-to-bank payments and open banking flows.",{"type":17,"tag":29,"props":36451,"children":36452},{},[36453],{"type":23,"value":15093},{"type":17,"tag":80,"props":36455,"children":36456},{},[36457,36462,36467],{"type":17,"tag":84,"props":36458,"children":36459},{},[36460],{"type":23,"value":36461},"direct bank payments",{"type":17,"tag":84,"props":36463,"children":36464},{},[36465],{"type":23,"value":36466},"payment automation",{"type":17,"tag":84,"props":36468,"children":36469},{},[36470],{"type":23,"value":36471},"invoice settlement workflows",{"type":17,"tag":239,"props":36473,"children":36475},{"id":36474},"_10-quickbooks-payments-api",[36476],{"type":23,"value":36477},"10. QuickBooks Payments API",{"type":17,"tag":29,"props":36479,"children":36480},{},[36481],{"type":17,"tag":133,"props":36482,"children":36485},{"href":36483,"rel":36484},"https://developer.intuit.com/app/developer/qbo/docs/api/accounting/all-entities/account",[214],[36486],{"type":23,"value":36487},"QuickBooks API documentation",{"type":17,"tag":29,"props":36489,"children":36490},{},[36491],{"type":23,"value":36492},"QuickBooks payments often appear alongside accounting workflows.",{"type":17,"tag":29,"props":36494,"children":36495},{},[36496],{"type":23,"value":23382},{"type":17,"tag":80,"props":36498,"children":36499},{},[36500,36505,36510,36515],{"type":17,"tag":84,"props":36501,"children":36502},{},[36503],{"type":23,"value":36504},"payment collection",{"type":17,"tag":84,"props":36506,"children":36507},{},[36508],{"type":23,"value":36509},"invoice payments",{"type":17,"tag":84,"props":36511,"children":36512},{},[36513],{"type":23,"value":36514},"reconciliation",{"type":17,"tag":84,"props":36516,"children":36517},{},[36518],{"type":23,"value":36096},{"type":17,"tag":239,"props":36520,"children":36522},{"id":36521},"_11-sage-accounting-api",[36523],{"type":23,"value":36524},"11. Sage Accounting API",{"type":17,"tag":29,"props":36526,"children":36527},{},[36528],{"type":17,"tag":133,"props":36529,"children":36532},{"href":36530,"rel":36531},"https://developer.sage.com/accounting/",[214],[36533],{"type":23,"value":36534},"Sage Accounting API documentation",{"type":17,"tag":29,"props":36536,"children":36537},{},[36538],{"type":23,"value":36539},"Sage often overlaps accounting and payment workflows.",{"type":17,"tag":29,"props":36541,"children":36542},{},[36543],{"type":23,"value":23339},{"type":17,"tag":80,"props":36545,"children":36546},{},[36547,36552,36556],{"type":17,"tag":84,"props":36548,"children":36549},{},[36550],{"type":23,"value":36551},"transaction tracking",{"type":17,"tag":84,"props":36553,"children":36554},{},[36555],{"type":23,"value":36428},{"type":17,"tag":84,"props":36557,"children":36558},{},[36559],{"type":23,"value":36096},{"type":17,"tag":239,"props":36561,"children":36563},{"id":36562},"_12-netsuite-api",[36564],{"type":23,"value":36565},"12. NetSuite API",{"type":17,"tag":29,"props":36567,"children":36568},{},[36569],{"type":17,"tag":133,"props":36570,"children":36572},{"href":35093,"rel":36571},[214],[36573],{"type":23,"value":35097},{"type":17,"tag":29,"props":36575,"children":36576},{},[36577],{"type":23,"value":36578},"NetSuite supports both accounting and payment workflows in enterprise environments.",{"type":17,"tag":29,"props":36580,"children":36581},{},[36582],{"type":23,"value":23382},{"type":17,"tag":80,"props":36584,"children":36585},{},[36586,36591,36595],{"type":17,"tag":84,"props":36587,"children":36588},{},[36589],{"type":23,"value":36590},"financial transactions",{"type":17,"tag":84,"props":36592,"children":36593},{},[36594],{"type":23,"value":36428},{"type":17,"tag":84,"props":36596,"children":36597},{},[36598],{"type":23,"value":36599},"ERP-level reporting",{"type":17,"tag":239,"props":36601,"children":36603},{"id":36602},"_13-xero-api",[36604],{"type":23,"value":36605},"13. Xero API",{"type":17,"tag":29,"props":36607,"children":36608},{},[36609],{"type":17,"tag":133,"props":36610,"children":36613},{"href":36611,"rel":36612},"https://developer.xero.com/documentation/api/accounting/overview",[214],[36614],{"type":23,"value":36615},"Xero API documentation",{"type":17,"tag":29,"props":36617,"children":36618},{},[36619],{"type":23,"value":36620},"Xero often integrates payments with accounting workflows.",{"type":17,"tag":29,"props":36622,"children":36623},{},[36624],{"type":23,"value":23339},{"type":17,"tag":80,"props":36626,"children":36627},{},[36628,36632,36636],{"type":17,"tag":84,"props":36629,"children":36630},{},[36631],{"type":23,"value":36509},{"type":17,"tag":84,"props":36633,"children":36634},{},[36635],{"type":23,"value":36551},{"type":17,"tag":84,"props":36637,"children":36638},{},[36639],{"type":23,"value":36514},{"type":17,"tag":239,"props":36641,"children":36643},{"id":36642},"_14-zoho-payments-zoho-books-api",[36644],{"type":23,"value":36645},"14. Zoho Payments / Zoho Books API",{"type":17,"tag":29,"props":36647,"children":36648},{},[36649],{"type":17,"tag":133,"props":36650,"children":36653},{"href":36651,"rel":36652},"https://www.zoho.com/books/api/v3/",[214],[36654],{"type":23,"value":36655},"Zoho Books API documentation",{"type":17,"tag":29,"props":36657,"children":36658},{},[36659],{"type":23,"value":36660},"Zoho supports both accounting and payment workflows.",{"type":17,"tag":29,"props":36662,"children":36663},{},[36664],{"type":23,"value":23382},{"type":17,"tag":80,"props":36666,"children":36667},{},[36668,36672,36677,36681],{"type":17,"tag":84,"props":36669,"children":36670},{},[36671],{"type":23,"value":11734},{"type":17,"tag":84,"props":36673,"children":36674},{},[36675],{"type":23,"value":36676},"invoices",{"type":17,"tag":84,"props":36678,"children":36679},{},[36680],{"type":23,"value":36138},{"type":17,"tag":84,"props":36682,"children":36683},{},[36684],{"type":23,"value":36096},{"type":17,"tag":239,"props":36686,"children":36688},{"id":36687},"_15-squareup-square-payments",[36689],{"type":23,"value":36690},"15. SquareUp (Square Payments)",{"type":17,"tag":29,"props":36692,"children":36693},{},[36694],{"type":17,"tag":133,"props":36695,"children":36697},{"href":35789,"rel":36696},[214],[36698],{"type":23,"value":36158},{"type":17,"tag":29,"props":36700,"children":36701},{},[36702],{"type":23,"value":36703},"Square's payment layer is often used across retail and SaaS workflows.",{"type":17,"tag":29,"props":36705,"children":36706},{},[36707],{"type":23,"value":23339},{"type":17,"tag":80,"props":36709,"children":36710},{},[36711,36715,36720,36725],{"type":17,"tag":84,"props":36712,"children":36713},{},[36714],{"type":23,"value":11734},{"type":17,"tag":84,"props":36716,"children":36717},{},[36718],{"type":23,"value":36719},"refunds",{"type":17,"tag":84,"props":36721,"children":36722},{},[36723],{"type":23,"value":36724},"payouts",{"type":17,"tag":84,"props":36726,"children":36727},{},[36728],{"type":23,"value":966},{"type":17,"tag":239,"props":36730,"children":36732},{"id":36731},"additional-payment-apis-teams-often-support",[36733],{"type":23,"value":36734},"Additional payment APIs teams often support",{"type":17,"tag":29,"props":36736,"children":36737},{},[36738],{"type":23,"value":36739},"Depending on customer needs, teams may also integrate:",{"type":17,"tag":80,"props":36741,"children":36742},{},[36743,36753,36763],{"type":17,"tag":84,"props":36744,"children":36745},{},[36746,36751],{"type":17,"tag":133,"props":36747,"children":36749},{"href":35782,"rel":36748},[214],[36750],{"type":23,"value":26553},{"type":23,"value":36752}," (global payments)",{"type":17,"tag":84,"props":36754,"children":36755},{},[36756,36761],{"type":17,"tag":133,"props":36757,"children":36759},{"href":35775,"rel":36758},[214],[36760],{"type":23,"value":26548},{"type":23,"value":36762}," (subscriptions and SaaS billing)",{"type":17,"tag":84,"props":36764,"children":36765},{},[36766,36771],{"type":17,"tag":133,"props":36767,"children":36769},{"href":35796,"rel":36768},[214],[36770],{"type":23,"value":11750},{"type":23,"value":36772}," (enterprise payments)",{"type":17,"tag":29,"props":36774,"children":36775},{},[36776],{"type":23,"value":36777},"This overlap between payments, accounting, and commerce is why the category grows quickly.",{"type":17,"tag":68,"props":36779,"children":36781},{"id":36780},"challenges-with-payment-api-integrations",[36782],{"type":23,"value":36783},"Challenges with payment API integrations",{"type":17,"tag":29,"props":36785,"children":36786},{},[36787],{"type":23,"value":36788},"Payment APIs are one of the most sensitive and complex integration categories.",{"type":17,"tag":239,"props":36790,"children":36792},{"id":36791},"different-payment-models",[36793],{"type":23,"value":36794},"Different payment models",{"type":17,"tag":29,"props":36796,"children":36797},{},[36798],{"type":23,"value":36799},"Each provider structures:",{"type":17,"tag":80,"props":36801,"children":36802},{},[36803,36807,36811,36815],{"type":17,"tag":84,"props":36804,"children":36805},{},[36806],{"type":23,"value":11734},{"type":17,"tag":84,"props":36808,"children":36809},{},[36810],{"type":23,"value":36138},{"type":17,"tag":84,"props":36812,"children":36813},{},[36814],{"type":23,"value":36719},{"type":17,"tag":84,"props":36816,"children":36817},{},[36818],{"type":23,"value":36724},{"type":17,"tag":29,"props":36820,"children":36821},{},[36822],{"type":23,"value":23797},{"type":17,"tag":239,"props":36824,"children":36826},{"id":36825},"authentication-and-compliance-requirements",[36827],{"type":23,"value":36828},"Authentication and compliance requirements",{"type":17,"tag":29,"props":36830,"children":36831},{},[36832],{"type":23,"value":36833},"Payment providers often have stricter:",{"type":17,"tag":80,"props":36835,"children":36836},{},[36837,36845,36850,36855],{"type":17,"tag":84,"props":36838,"children":36839},{},[36840,36844],{"type":17,"tag":133,"props":36841,"children":36842},{"href":779},[36843],{"type":23,"value":782},{"type":23,"value":784},{"type":17,"tag":84,"props":36846,"children":36847},{},[36848],{"type":23,"value":36849},"API key handling",{"type":17,"tag":84,"props":36851,"children":36852},{},[36853],{"type":23,"value":36854},"security requirements",{"type":17,"tag":84,"props":36856,"children":36857},{},[36858],{"type":23,"value":36859},"compliance constraints",{"type":17,"tag":239,"props":36861,"children":36863},{"id":36862},"event-and-webhook-complexity",[36864],{"type":23,"value":36865},"Event and webhook complexity",{"type":17,"tag":29,"props":36867,"children":36868},{},[36869],{"type":23,"value":36870},"Payment workflows rely heavily on events like:",{"type":17,"tag":80,"props":36872,"children":36873},{},[36874,36879,36884,36889],{"type":17,"tag":84,"props":36875,"children":36876},{},[36877],{"type":23,"value":36878},"payment success",{"type":17,"tag":84,"props":36880,"children":36881},{},[36882],{"type":23,"value":36883},"failure",{"type":17,"tag":84,"props":36885,"children":36886},{},[36887],{"type":23,"value":36888},"refund",{"type":17,"tag":84,"props":36890,"children":36891},{},[36892],{"type":23,"value":36893},"dispute",{"type":17,"tag":29,"props":36895,"children":36896},{},[36897],{"type":23,"value":36898},"Each provider formats these differently.",{"type":17,"tag":239,"props":36900,"children":36902},{"id":36901},"reconciliation-across-systems",[36903],{"type":23,"value":36904},"Reconciliation across systems",{"type":17,"tag":29,"props":36906,"children":36907},{},[36908],{"type":23,"value":36909},"Payment data often needs to match:",{"type":17,"tag":80,"props":36911,"children":36912},{},[36913,36917,36922],{"type":17,"tag":84,"props":36914,"children":36915},{},[36916],{"type":23,"value":36676},{"type":17,"tag":84,"props":36918,"children":36919},{},[36920],{"type":23,"value":36921},"accounting entries",{"type":17,"tag":84,"props":36923,"children":36924},{},[36925],{"type":23,"value":36724},{"type":17,"tag":29,"props":36927,"children":36928},{},[36929],{"type":23,"value":36930},"This adds cross-system complexity.",{"type":17,"tag":239,"props":36932,"children":36934},{"id":36933},"maintenance-and-edge-cases",[36935],{"type":23,"value":36936},"Maintenance and edge cases",{"type":17,"tag":29,"props":36938,"children":36939},{},[36940],{"type":23,"value":29830},{"type":17,"tag":80,"props":36942,"children":36943},{},[36944,36949,36954,36961,36966],{"type":17,"tag":84,"props":36945,"children":36946},{},[36947],{"type":23,"value":36948},"retries",{"type":17,"tag":84,"props":36950,"children":36951},{},[36952],{"type":23,"value":36953},"idempotency",{"type":17,"tag":84,"props":36955,"children":36956},{},[36957],{"type":17,"tag":133,"props":36958,"children":36959},{"href":135},[36960],{"type":23,"value":138},{"type":17,"tag":84,"props":36962,"children":36963},{},[36964],{"type":23,"value":36965},"failures",{"type":17,"tag":84,"props":36967,"children":36968},{},[36969],{"type":23,"value":36970},"partial payments",{"type":17,"tag":29,"props":36972,"children":36973},{},[36974],{"type":23,"value":36975},"quickly becomes complex when supporting multiple providers.",{"type":17,"tag":68,"props":36977,"children":36979},{"id":36978},"the-role-of-unified-payment-apis",[36980],{"type":23,"value":36981},"The role of Unified Payment APIs",{"type":17,"tag":29,"props":36983,"children":36984},{},[36985],{"type":23,"value":36986},"This is where Unified Payment APIs become valuable.",{"type":17,"tag":29,"props":36988,"children":36989},{},[36990],{"type":23,"value":36991},"Instead of building separate integrations for Stripe, PayPal, Square, Adyen, GoCardless, Chargebee, and others, a Unified API provides a single interface across providers.",{"type":17,"tag":29,"props":36993,"children":36994},{},[36995],{"type":23,"value":5804},{"type":17,"tag":80,"props":36997,"children":36998},{},[36999,37003,37008,37013],{"type":17,"tag":84,"props":37000,"children":37001},{},[37002],{"type":23,"value":23897},{"type":17,"tag":84,"props":37004,"children":37005},{},[37006],{"type":23,"value":37007},"one authentication pattern",{"type":17,"tag":84,"props":37009,"children":37010},{},[37011],{"type":23,"value":37012},"one schema for payments, refunds, payouts, and subscriptions",{"type":17,"tag":84,"props":37014,"children":37015},{},[37016],{"type":23,"value":23912},{"type":17,"tag":29,"props":37018,"children":37019},{},[37020],{"type":23,"value":37021},"For products that need to support multiple payment providers, this is a much more scalable approach.",{"type":17,"tag":68,"props":37023,"children":37025},{"id":37024},"build-once-with-the-unified-payment-api",[37026],{"type":23,"value":37027},"Build once with the Unified Payment API",{"type":17,"tag":29,"props":37029,"children":37030},{},[37031,37032,37039,37040,37045],{"type":23,"value":6712},{"type":17,"tag":133,"props":37033,"children":37036},{"href":37034,"rel":37035},"https://unified.to/payment",[214],[37037],{"type":23,"value":37038},"Unified Payment API",{"type":23,"value":23936},{"type":17,"tag":48,"props":37041,"children":37042},{},[37043],{"type":23,"value":37044},"17+ payment integrations",{"type":23,"value":23943},{"type":17,"tag":29,"props":37047,"children":37048},{},[37049],{"type":23,"value":13248},{"type":17,"tag":80,"props":37051,"children":37052},{},[37053,37057,37061,37065,37069,37074,37079,37084,37089],{"type":17,"tag":84,"props":37054,"children":37055},{},[37056],{"type":23,"value":26548},{"type":17,"tag":84,"props":37058,"children":37059},{},[37060],{"type":23,"value":26553},{"type":17,"tag":84,"props":37062,"children":37063},{},[37064],{"type":23,"value":14193},{"type":17,"tag":84,"props":37066,"children":37067},{},[37068],{"type":23,"value":11750},{"type":17,"tag":84,"props":37070,"children":37071},{},[37072],{"type":23,"value":37073},"GoCardless",{"type":17,"tag":84,"props":37075,"children":37076},{},[37077],{"type":23,"value":37078},"Chargebee",{"type":17,"tag":84,"props":37080,"children":37081},{},[37082],{"type":23,"value":37083},"Brex",{"type":17,"tag":84,"props":37085,"children":37086},{},[37087],{"type":23,"value":37088},"Bill.com",{"type":17,"tag":84,"props":37090,"children":37091},{},[37092],{"type":23,"value":15768},{"type":17,"tag":239,"props":37094,"children":37096},{"id":37095},"unified-payment-objects",[37097],{"type":23,"value":37098},"Unified Payment objects",{"type":17,"tag":29,"props":37100,"children":37101},{},[37102],{"type":23,"value":37103},"Unified standardizes key payment objects:",{"type":17,"tag":80,"props":37105,"children":37106},{},[37107,37112,37117,37122,37127],{"type":17,"tag":84,"props":37108,"children":37109},{},[37110],{"type":23,"value":37111},"Links (checkout/payment links)",{"type":17,"tag":84,"props":37113,"children":37114},{},[37115],{"type":23,"value":37116},"Payments (transactions)",{"type":17,"tag":84,"props":37118,"children":37119},{},[37120],{"type":23,"value":37121},"Payouts (transfers)",{"type":17,"tag":84,"props":37123,"children":37124},{},[37125],{"type":23,"value":37126},"Refunds (reversals and disputes)",{"type":17,"tag":84,"props":37128,"children":37129},{},[37130],{"type":23,"value":37131},"Subscriptions (recurring billing)",{"type":17,"tag":29,"props":37133,"children":37134},{},[37135],{"type":23,"value":37136},"This allows developers to build once and support multiple payment systems without maintaining separate logic for each provider.",{"type":17,"tag":239,"props":37138,"children":37139},{"id":24049},[37140],{"type":23,"value":24052},{"type":17,"tag":29,"props":37142,"children":37143},{},[37144],{"type":23,"value":37145},"Most integration approaches still rely on:",{"type":17,"tag":80,"props":37147,"children":37148},{},[37149,37153,37157],{"type":17,"tag":84,"props":37150,"children":37151},{},[37152],{"type":23,"value":32808},{"type":17,"tag":84,"props":37154,"children":37155},{},[37156],{"type":23,"value":32803},{"type":17,"tag":84,"props":37158,"children":37159},{},[37160],{"type":23,"value":31666},{"type":17,"tag":29,"props":37162,"children":37163},{},[37164,37165,37169],{"type":23,"value":24080},{"type":17,"tag":48,"props":37166,"children":37167},{},[37168],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":37171,"children":37172},{},[37173],{"type":23,"value":5804},{"type":17,"tag":80,"props":37175,"children":37176},{},[37177,37181,37186,37190],{"type":17,"tag":84,"props":37178,"children":37179},{},[37180],{"type":23,"value":24097},{"type":17,"tag":84,"props":37182,"children":37183},{},[37184],{"type":23,"value":37185},"no stale transaction data",{"type":17,"tag":84,"props":37187,"children":37188},{},[37189],{"type":23,"value":30123},{"type":17,"tag":84,"props":37191,"children":37192},{},[37193],{"type":23,"value":37194},"read and write support across payment objects",{"type":17,"tag":29,"props":37196,"children":37197},{},[37198,37199,37203],{"type":23,"value":24117},{"type":17,"tag":48,"props":37200,"children":37201},{},[37202],{"type":23,"value":24122},{"type":23,"value":37204},", so sensitive financial data is not stored at rest by the integration layer.",{"type":17,"tag":29,"props":37206,"children":37207},{},[37208],{"type":23,"value":37209},"That reduces compliance scope and risk for payment-heavy products.",{"type":17,"tag":239,"props":37211,"children":37212},{"id":24132},[37213],{"type":23,"value":24135},{"type":17,"tag":29,"props":37215,"children":37216},{},[37217],{"type":23,"value":24140},{"type":17,"tag":80,"props":37219,"children":37220},{},[37221,37225,37230,37234,37238,37243],{"type":17,"tag":84,"props":37222,"children":37223},{},[37224],{"type":23,"value":35897},{"type":17,"tag":84,"props":37226,"children":37227},{},[37228],{"type":23,"value":37229},"subscription management tools",{"type":17,"tag":84,"props":37231,"children":37232},{},[37233],{"type":23,"value":35902},{"type":17,"tag":84,"props":37235,"children":37236},{},[37237],{"type":23,"value":35907},{"type":17,"tag":84,"props":37239,"children":37240},{},[37241],{"type":23,"value":37242},"AI-powered financial assistants",{"type":17,"tag":84,"props":37244,"children":37245},{},[37246],{"type":23,"value":37247},"multi-provider payment platforms",{"type":17,"tag":29,"props":37249,"children":37250},{},[37251],{"type":23,"value":37252},"without rebuilding payment integrations for every provider.",{"type":17,"tag":68,"props":37254,"children":37256},{"id":37255},"why-not-build-each-payment-integration-directly",[37257],{"type":23,"value":37258},"Why not build each payment integration directly?",{"type":17,"tag":29,"props":37260,"children":37261},{},[37262],{"type":23,"value":32917},{"type":17,"tag":29,"props":37264,"children":37265},{},[37266],{"type":23,"value":24187},{"type":17,"tag":80,"props":37268,"children":37269},{},[37270,37275,37280,37285,37290],{"type":17,"tag":84,"props":37271,"children":37272},{},[37273],{"type":23,"value":37274},"authentication and security",{"type":17,"tag":84,"props":37276,"children":37277},{},[37278],{"type":23,"value":37279},"payment lifecycle events",{"type":17,"tag":84,"props":37281,"children":37282},{},[37283],{"type":23,"value":37284},"schema differences",{"type":17,"tag":84,"props":37286,"children":37287},{},[37288],{"type":23,"value":37289},"reconciliation logic",{"type":17,"tag":84,"props":37291,"children":37292},{},[37293],{"type":23,"value":37294},"ongoing API maintenance",{"type":17,"tag":29,"props":37296,"children":37297},{},[37298],{"type":23,"value":37299},"Payment integrations are one of the fastest ways to accumulate long-term technical debt.",{"type":17,"tag":29,"props":37301,"children":37302},{},[37303],{"type":23,"value":37304},"A Unified Payment API reduces that burden and keeps your product architecture clean as you scale.",{"type":17,"tag":68,"props":37306,"children":37307},{"id":1552},[37308],{"type":23,"value":1555},{"type":17,"tag":29,"props":37310,"children":37311},{},[37312],{"type":23,"value":37313},"Payment APIs are critical for SaaS products, but they are also one of the most complex categories to support at scale.",{"type":17,"tag":29,"props":37315,"children":37316},{},[37317],{"type":23,"value":37318},"If your customers use different payment providers, building integrations one by one will eventually slow your team down.",{"type":17,"tag":29,"props":37320,"children":37321},{},[37322],{"type":23,"value":37323},"That is why more SaaS companies are moving toward Unified Payment APIs.",{"type":17,"tag":29,"props":37325,"children":37326},{},[37327,37329,37334],{"type":23,"value":37328},"If you need real-time, read/write access to payment data across Stripe, PayPal, Square, Adyen, and more, ",{"type":17,"tag":133,"props":37330,"children":37332},{"href":212,"rel":37331},[214],[37333],{"type":23,"value":217},{"type":23,"value":24258},{"type":17,"tag":29,"props":37336,"children":37337},{},[37338,37339],{"type":23,"value":1609},{"type":17,"tag":133,"props":37340,"children":37342},{"href":37341},"/32c6207b8384807daea0ec375ac0dabd",[37343],{"type":23,"value":1616},{"type":17,"tag":29,"props":37345,"children":37346},{},[37347,37348],{"type":23,"value":1609},{"type":17,"tag":133,"props":37349,"children":37351},{"href":1623,"rel":37350},[214],[37352],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":37354},[37355,37356,37357,37375,37382,37383,37388,37389],{"id":35835,"depth":1629,"text":35838},{"id":35920,"depth":1629,"text":35923},{"id":36038,"depth":1629,"text":36041,"children":37358},[37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374],{"id":36049,"depth":1635,"text":36052},{"id":36099,"depth":1635,"text":36102},{"id":36146,"depth":1635,"text":36149},{"id":36192,"depth":1635,"text":36195},{"id":36239,"depth":1635,"text":36242},{"id":36287,"depth":1635,"text":36290},{"id":36335,"depth":1635,"text":36338},{"id":36383,"depth":1635,"text":36386},{"id":36431,"depth":1635,"text":36434},{"id":36474,"depth":1635,"text":36477},{"id":36521,"depth":1635,"text":36524},{"id":36562,"depth":1635,"text":36565},{"id":36602,"depth":1635,"text":36605},{"id":36642,"depth":1635,"text":36645},{"id":36687,"depth":1635,"text":36690},{"id":36731,"depth":1635,"text":36734},{"id":36780,"depth":1629,"text":36783,"children":37376},[37377,37378,37379,37380,37381],{"id":36791,"depth":1635,"text":36794},{"id":36825,"depth":1635,"text":36828},{"id":36862,"depth":1635,"text":36865},{"id":36901,"depth":1635,"text":36904},{"id":36933,"depth":1635,"text":36936},{"id":36978,"depth":1629,"text":36981},{"id":37024,"depth":1629,"text":37027,"children":37384},[37385,37386,37387],{"id":37095,"depth":1635,"text":37098},{"id":24049,"depth":1635,"text":24052},{"id":24132,"depth":1635,"text":24135},{"id":37255,"depth":1629,"text":37258},{"id":1552,"depth":1629,"text":1555},"content:blog:15_payment_apis_to_integrate_with_in_2026_stripe_paypal_square_and_unified_payment_apis.md","blog/15_payment_apis_to_integrate_with_in_2026_stripe_paypal_square_and_unified_payment_apis.md","blog/15_payment_apis_to_integrate_with_in_2026_stripe_paypal_square_and_unified_payment_apis",{"_path":37394,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":37395,"description":37396,"img":37397,"date":37398,"tag":12,"body":37399,"_type":1677,"_id":39239,"_source":1679,"_file":39240,"_stem":39241,"_extension":1682},"/blog/15_e_commerce_apis_to_integrate_with_in_2026_shopify_woocommerce_bigcommerce_and_unified_commerce_apis","15 E-Commerce APIs to Integrate With in 2026: Shopify, WooCommerce, BigCommerce, and Unified Commerce APIs","E-commerce is one of the broadest integration categories in SaaS.","https://s3.us-east-2.amazonaws.com/unified-article-images/15_e_commerce_apis_to_integrate_with_in_2026_shopify_woocommerce_bigcommerce_and_unified_commerce_apis-icon.png","2026-03-23T23:02:00.000Z",{"type":14,"children":37400,"toc":39202},[37401,37406,37409,37416,37420,37425,37470,37488,37494,37506,37511,37549,37553,37591,37597,37602,37607,37644,37648,37656,37661,37669,37674,37682,37687,37695,37700,37708,37713,37721,37726,37732,37737,37743,37752,37757,37762,37790,37795,37801,37810,37815,37819,37842,37848,37857,37862,37866,37889,37895,37904,37909,37913,37936,37942,37951,37956,37960,37983,37989,37999,38004,38008,38029,38035,38043,38048,38052,38075,38081,38089,38094,38098,38121,38127,38135,38146,38150,38173,38179,38189,38194,38198,38221,38227,38237,38242,38246,38264,38270,38280,38285,38289,38312,38318,38328,38333,38337,38355,38361,38371,38376,38380,38403,38409,38418,38427,38432,38436,38458,38464,38469,38541,38546,38552,38557,38563,38568,38601,38606,38612,38617,38622,38645,38650,38656,38661,38666,38692,38697,38701,38705,38728,38734,38739,38765,38771,38776,38781,38785,38812,38817,38821,38838,38842,38913,38919,38924,38971,38976,38980,38984,39005,39014,39018,39043,39053,39058,39062,39066,39101,39106,39112,39117,39122,39148,39153,39158,39162,39167,39172,39184,39193],{"type":17,"tag":18,"props":37402,"children":37404},{"id":37403},"_15-e-commerce-apis-to-integrate-with-in-2026-shopify-woocommerce-bigcommerce-and-unified-commerce-apis",[37405],{"type":23,"value":37395},{"type":17,"tag":25,"props":37407,"children":37408},{},[],{"type":17,"tag":29,"props":37410,"children":37411},{},[37412],{"type":17,"tag":33,"props":37413,"children":37414},{},[37415],{"type":23,"value":33053},{"type":17,"tag":29,"props":37417,"children":37418},{},[37419],{"type":23,"value":37396},{"type":17,"tag":29,"props":37421,"children":37422},{},[37423],{"type":23,"value":37424},"A single product may need to connect to storefronts, marketplaces, catalog systems, review platforms, inventory tools, fulfillment systems, reservation platforms, and financial backends—all at once. That is what makes commerce integrations so valuable, and so difficult to support cleanly.",{"type":17,"tag":29,"props":37426,"children":37427},{},[37428,37429,37436,37437,37444,37445,37452,37453,37460,37461,37468],{"type":23,"value":35772},{"type":17,"tag":133,"props":37430,"children":37433},{"href":37431,"rel":37432},"https://shopify.dev/docs/api",[214],[37434],{"type":23,"value":37435},"Shopify",{"type":23,"value":11826},{"type":17,"tag":133,"props":37438,"children":37441},{"href":37439,"rel":37440},"https://woocommerce.github.io/woocommerce-rest-api-docs/",[214],[37442],{"type":23,"value":37443},"WooCommerce",{"type":23,"value":11826},{"type":17,"tag":133,"props":37446,"children":37449},{"href":37447,"rel":37448},"https://developer.bigcommerce.com/docs",[214],[37450],{"type":23,"value":37451},"BigCommerce",{"type":23,"value":11826},{"type":17,"tag":133,"props":37454,"children":37457},{"href":37455,"rel":37456},"https://developer-docs.amazon.com/sp-api/",[214],[37458],{"type":23,"value":37459},"Amazon Seller Central",{"type":23,"value":12561},{"type":17,"tag":133,"props":37462,"children":37465},{"href":37463,"rel":37464},"https://developer.walmart.com/",[214],[37466],{"type":23,"value":37467},"Walmart Marketplace",{"type":23,"value":37469}," all expose commerce data differently. Products, variants, collections, stock levels, locations, reviews, and sales channels rarely map neatly from one system to another.",{"type":17,"tag":29,"props":37471,"children":37472},{},[37473,37474,37479,37481,37486],{"type":23,"value":23079},{"type":17,"tag":48,"props":37475,"children":37476},{},[37477],{"type":23,"value":37478},"top e-commerce APIs to integrate with in 2026",{"type":23,"value":37480},", the most important use cases in the category, the challenges of building these integrations directly, and why more teams are moving toward ",{"type":17,"tag":48,"props":37482,"children":37483},{},[37484],{"type":23,"value":37485},"Unified Commerce APIs",{"type":23,"value":37487}," instead of supporting each platform one by one.",{"type":17,"tag":68,"props":37489,"children":37491},{"id":37490},"what-is-an-e-commerce-api",[37492],{"type":23,"value":37493},"What is an e-commerce API?",{"type":17,"tag":29,"props":37495,"children":37496},{},[37497,37499,37504],{"type":23,"value":37498},"An [e-",{"type":17,"tag":133,"props":37500,"children":37501},{"href":20451},[37502],{"type":23,"value":37503},"commerce API",{"type":23,"value":37505},"](/commerce) gives developers programmatic access to commerce data and workflows.",{"type":17,"tag":29,"props":37507,"children":37508},{},[37509],{"type":23,"value":37510},"That often includes:",{"type":17,"tag":80,"props":37512,"children":37513},{},[37514,37519,37524,37529,37534,37539,37544],{"type":17,"tag":84,"props":37515,"children":37516},{},[37517],{"type":23,"value":37518},"products and variants",{"type":17,"tag":84,"props":37520,"children":37521},{},[37522],{"type":23,"value":37523},"collections and catalogs",{"type":17,"tag":84,"props":37525,"children":37526},{},[37527],{"type":23,"value":37528},"inventory and stock levels",{"type":17,"tag":84,"props":37530,"children":37531},{},[37532],{"type":23,"value":37533},"store and warehouse locations",{"type":17,"tag":84,"props":37535,"children":37536},{},[37537],{"type":23,"value":37538},"reviews and ratings",{"type":17,"tag":84,"props":37540,"children":37541},{},[37542],{"type":23,"value":37543},"reservations and availability",{"type":17,"tag":84,"props":37545,"children":37546},{},[37547],{"type":23,"value":37548},"sales channels and marketplaces",{"type":17,"tag":29,"props":37550,"children":37551},{},[37552],{"type":23,"value":23132},{"type":17,"tag":80,"props":37554,"children":37555},{},[37556,37561,37566,37571,37576,37581,37586],{"type":17,"tag":84,"props":37557,"children":37558},{},[37559],{"type":23,"value":37560},"product sync tools",{"type":17,"tag":84,"props":37562,"children":37563},{},[37564],{"type":23,"value":37565},"marketplace management products",{"type":17,"tag":84,"props":37567,"children":37568},{},[37569],{"type":23,"value":37570},"inventory and catalog platforms",{"type":17,"tag":84,"props":37572,"children":37573},{},[37574],{"type":23,"value":37575},"review aggregation tools",{"type":17,"tag":84,"props":37577,"children":37578},{},[37579],{"type":23,"value":37580},"e-commerce analytics dashboards",{"type":17,"tag":84,"props":37582,"children":37583},{},[37584],{"type":23,"value":37585},"multichannel commerce operations",{"type":17,"tag":84,"props":37587,"children":37588},{},[37589],{"type":23,"value":37590},"AI-powered commerce assistants",{"type":17,"tag":68,"props":37592,"children":37594},{"id":37593},"why-saas-products-integrate-e-commerce-apis",[37595],{"type":23,"value":37596},"Why SaaS products integrate e-commerce APIs",{"type":17,"tag":29,"props":37598,"children":37599},{},[37600],{"type":23,"value":37601},"Commerce data touches many workflows beyond the storefront itself.",{"type":17,"tag":29,"props":37603,"children":37604},{},[37605],{"type":23,"value":37606},"SaaS products often need to connect e-commerce platforms with:",{"type":17,"tag":80,"props":37608,"children":37609},{},[37610,37615,37620,37624,37629,37634,37639],{"type":17,"tag":84,"props":37611,"children":37612},{},[37613],{"type":23,"value":37614},"ERP and accounting systems",{"type":17,"tag":84,"props":37616,"children":37617},{},[37618],{"type":23,"value":37619},"shipping and fulfillment tools",{"type":17,"tag":84,"props":37621,"children":37622},{},[37623],{"type":23,"value":35956},{"type":17,"tag":84,"props":37625,"children":37626},{},[37627],{"type":23,"value":37628},"ad platforms",{"type":17,"tag":84,"props":37630,"children":37631},{},[37632],{"type":23,"value":37633},"analytics and BI tools",{"type":17,"tag":84,"props":37635,"children":37636},{},[37637],{"type":23,"value":37638},"CRM and customer data platforms",{"type":17,"tag":84,"props":37640,"children":37641},{},[37642],{"type":23,"value":37643},"AI agents and workflow automation",{"type":17,"tag":29,"props":37645,"children":37646},{},[37647],{"type":23,"value":12661},{"type":17,"tag":29,"props":37649,"children":37650},{},[37651],{"type":17,"tag":48,"props":37652,"children":37653},{},[37654],{"type":23,"value":37655},"Product catalog synchronization",{"type":17,"tag":29,"props":37657,"children":37658},{},[37659],{"type":23,"value":37660},"Sync products and variants across multiple stores, marketplaces, or internal systems.",{"type":17,"tag":29,"props":37662,"children":37663},{},[37664],{"type":17,"tag":48,"props":37665,"children":37666},{},[37667],{"type":23,"value":37668},"Inventory synchronization",{"type":17,"tag":29,"props":37670,"children":37671},{},[37672],{"type":23,"value":37673},"Keep stock levels aligned across channels to avoid overselling.",{"type":17,"tag":29,"props":37675,"children":37676},{},[37677],{"type":17,"tag":48,"props":37678,"children":37679},{},[37680],{"type":23,"value":37681},"Multichannel commerce reporting",{"type":17,"tag":29,"props":37683,"children":37684},{},[37685],{"type":23,"value":37686},"Aggregate catalog, review, and inventory data across platforms into one dashboard.",{"type":17,"tag":29,"props":37688,"children":37689},{},[37690],{"type":17,"tag":48,"props":37691,"children":37692},{},[37693],{"type":23,"value":37694},"Marketplace operations",{"type":17,"tag":29,"props":37696,"children":37697},{},[37698],{"type":23,"value":37699},"Connect storefronts with channels like Amazon, Walmart, or other sales endpoints.",{"type":17,"tag":29,"props":37701,"children":37702},{},[37703],{"type":17,"tag":48,"props":37704,"children":37705},{},[37706],{"type":23,"value":37707},"Review aggregation",{"type":17,"tag":29,"props":37709,"children":37710},{},[37711],{"type":23,"value":37712},"Pull customer reviews into centralized analytics or moderation workflows.",{"type":17,"tag":29,"props":37714,"children":37715},{},[37716],{"type":17,"tag":48,"props":37717,"children":37718},{},[37719],{"type":23,"value":37720},"Availability and reservation workflows",{"type":17,"tag":29,"props":37722,"children":37723},{},[37724],{"type":23,"value":37725},"Support commerce-adjacent experiences like bookings, dining, or appointment inventory.",{"type":17,"tag":68,"props":37727,"children":37729},{"id":37728},"top-15-e-commerce-apis-to-integrate-with-in-2026",[37730],{"type":23,"value":37731},"Top 15 e-commerce APIs to integrate with in 2026",{"type":17,"tag":29,"props":37733,"children":37734},{},[37735],{"type":23,"value":37736},"Below are some of the most important commerce APIs SaaS teams commonly need to support.",{"type":17,"tag":239,"props":37738,"children":37740},{"id":37739},"_1-shopify-api",[37741],{"type":23,"value":37742},"1. Shopify API",{"type":17,"tag":29,"props":37744,"children":37745},{},[37746],{"type":17,"tag":133,"props":37747,"children":37749},{"href":37431,"rel":37748},[214],[37750],{"type":23,"value":37751},"Shopify API documentation",{"type":17,"tag":29,"props":37753,"children":37754},{},[37755],{"type":23,"value":37756},"Shopify is one of the most important e-commerce APIs to support.",{"type":17,"tag":29,"props":37758,"children":37759},{},[37760],{"type":23,"value":37761},"It is frequently used for:",{"type":17,"tag":80,"props":37763,"children":37764},{},[37765,37770,37775,37780,37785],{"type":17,"tag":84,"props":37766,"children":37767},{},[37768],{"type":23,"value":37769},"product and variant sync",{"type":17,"tag":84,"props":37771,"children":37772},{},[37773],{"type":23,"value":37774},"inventory visibility",{"type":17,"tag":84,"props":37776,"children":37777},{},[37778],{"type":23,"value":37779},"catalog and collection management",{"type":17,"tag":84,"props":37781,"children":37782},{},[37783],{"type":23,"value":37784},"storefront analytics",{"type":17,"tag":84,"props":37786,"children":37787},{},[37788],{"type":23,"value":37789},"multichannel commerce tooling",{"type":17,"tag":29,"props":37791,"children":37792},{},[37793],{"type":23,"value":37794},"For most SaaS teams serving merchants, Shopify is table stakes.",{"type":17,"tag":239,"props":37796,"children":37798},{"id":37797},"_2-woocommerce-api",[37799],{"type":23,"value":37800},"2. WooCommerce API",{"type":17,"tag":29,"props":37802,"children":37803},{},[37804],{"type":17,"tag":133,"props":37805,"children":37807},{"href":37439,"rel":37806},[214],[37808],{"type":23,"value":37809},"WooCommerce API documentation",{"type":17,"tag":29,"props":37811,"children":37812},{},[37813],{"type":23,"value":37814},"WooCommerce is still widely used by businesses that want more control over their commerce stack.",{"type":17,"tag":29,"props":37816,"children":37817},{},[37818],{"type":23,"value":15093},{"type":17,"tag":80,"props":37820,"children":37821},{},[37822,37827,37832,37837],{"type":17,"tag":84,"props":37823,"children":37824},{},[37825],{"type":23,"value":37826},"product and category sync",{"type":17,"tag":84,"props":37828,"children":37829},{},[37830],{"type":23,"value":37831},"order and catalog tooling",{"type":17,"tag":84,"props":37833,"children":37834},{},[37835],{"type":23,"value":37836},"reviews and customer feedback",{"type":17,"tag":84,"props":37838,"children":37839},{},[37840],{"type":23,"value":37841},"inventory workflows",{"type":17,"tag":239,"props":37843,"children":37845},{"id":37844},"_3-bigcommerce-api",[37846],{"type":23,"value":37847},"3. BigCommerce API",{"type":17,"tag":29,"props":37849,"children":37850},{},[37851],{"type":17,"tag":133,"props":37852,"children":37854},{"href":37447,"rel":37853},[214],[37855],{"type":23,"value":37856},"BigCommerce API documentation",{"type":17,"tag":29,"props":37858,"children":37859},{},[37860],{"type":23,"value":37861},"BigCommerce is especially important for larger merchants and more structured commerce operations.",{"type":17,"tag":29,"props":37863,"children":37864},{},[37865],{"type":23,"value":23339},{"type":17,"tag":80,"props":37867,"children":37868},{},[37869,37874,37879,37884],{"type":17,"tag":84,"props":37870,"children":37871},{},[37872],{"type":23,"value":37873},"product and inventory sync",{"type":17,"tag":84,"props":37875,"children":37876},{},[37877],{"type":23,"value":37878},"multistore management",{"type":17,"tag":84,"props":37880,"children":37881},{},[37882],{"type":23,"value":37883},"catalog integrations",{"type":17,"tag":84,"props":37885,"children":37886},{},[37887],{"type":23,"value":37888},"analytics and reporting",{"type":17,"tag":239,"props":37890,"children":37892},{"id":37891},"_4-amazon-seller-central-api",[37893],{"type":23,"value":37894},"4. Amazon Seller Central API",{"type":17,"tag":29,"props":37896,"children":37897},{},[37898],{"type":17,"tag":133,"props":37899,"children":37901},{"href":37455,"rel":37900},[214],[37902],{"type":23,"value":37903},"Amazon Seller Central SP-API documentation",{"type":17,"tag":29,"props":37905,"children":37906},{},[37907],{"type":23,"value":37908},"Amazon Seller Central is essential for marketplace operations.",{"type":17,"tag":29,"props":37910,"children":37911},{},[37912],{"type":23,"value":15093},{"type":17,"tag":80,"props":37914,"children":37915},{},[37916,37921,37926,37931],{"type":17,"tag":84,"props":37917,"children":37918},{},[37919],{"type":23,"value":37920},"listing and catalog sync",{"type":17,"tag":84,"props":37922,"children":37923},{},[37924],{"type":23,"value":37925},"marketplace inventory management",{"type":17,"tag":84,"props":37927,"children":37928},{},[37929],{"type":23,"value":37930},"cross-channel reporting",{"type":17,"tag":84,"props":37932,"children":37933},{},[37934],{"type":23,"value":37935},"seller operations tooling",{"type":17,"tag":239,"props":37937,"children":37939},{"id":37938},"_5-walmart-marketplace-api",[37940],{"type":23,"value":37941},"5. Walmart Marketplace API",{"type":17,"tag":29,"props":37943,"children":37944},{},[37945],{"type":17,"tag":133,"props":37946,"children":37948},{"href":37463,"rel":37947},[214],[37949],{"type":23,"value":37950},"Walmart API documentation",{"type":17,"tag":29,"props":37952,"children":37953},{},[37954],{"type":23,"value":37955},"Walmart matters for teams supporting marketplace expansion and multichannel retail operations.",{"type":17,"tag":29,"props":37957,"children":37958},{},[37959],{"type":23,"value":23339},{"type":17,"tag":80,"props":37961,"children":37962},{},[37963,37968,37973,37978],{"type":17,"tag":84,"props":37964,"children":37965},{},[37966],{"type":23,"value":37967},"product listing sync",{"type":17,"tag":84,"props":37969,"children":37970},{},[37971],{"type":23,"value":37972},"inventory updates",{"type":17,"tag":84,"props":37974,"children":37975},{},[37976],{"type":23,"value":37977},"marketplace reporting",{"type":17,"tag":84,"props":37979,"children":37980},{},[37981],{"type":23,"value":37982},"channel analytics",{"type":17,"tag":239,"props":37984,"children":37986},{"id":37985},"_6-squarespace-commerce-api",[37987],{"type":23,"value":37988},"6. Squarespace Commerce API",{"type":17,"tag":29,"props":37990,"children":37991},{},[37992],{"type":17,"tag":133,"props":37993,"children":37996},{"href":37994,"rel":37995},"https://developers.squarespace.com/commerce-apis/overview",[214],[37997],{"type":23,"value":37998},"Squarespace developer documentation",{"type":17,"tag":29,"props":38000,"children":38001},{},[38002],{"type":23,"value":38003},"Squarespace is relevant for smaller brands, creators, and storefront-first businesses.",{"type":17,"tag":29,"props":38005,"children":38006},{},[38007],{"type":23,"value":23382},{"type":17,"tag":80,"props":38009,"children":38010},{},[38011,38016,38020,38024],{"type":17,"tag":84,"props":38012,"children":38013},{},[38014],{"type":23,"value":38015},"product sync",{"type":17,"tag":84,"props":38017,"children":38018},{},[38019],{"type":23,"value":37774},{"type":17,"tag":84,"props":38021,"children":38022},{},[38023],{"type":23,"value":37831},{"type":17,"tag":84,"props":38025,"children":38026},{},[38027],{"type":23,"value":38028},"storefront data aggregation",{"type":17,"tag":239,"props":38030,"children":38032},{"id":38031},"_7-square-api",[38033],{"type":23,"value":38034},"7. Square API",{"type":17,"tag":29,"props":38036,"children":38037},{},[38038],{"type":17,"tag":133,"props":38039,"children":38041},{"href":35789,"rel":38040},[214],[38042],{"type":23,"value":36158},{"type":17,"tag":29,"props":38044,"children":38045},{},[38046],{"type":23,"value":38047},"Square is important because it bridges commerce, payments, and sometimes point-of-sale workflows.",{"type":17,"tag":29,"props":38049,"children":38050},{},[38051],{"type":23,"value":23339},{"type":17,"tag":80,"props":38053,"children":38054},{},[38055,38060,38065,38070],{"type":17,"tag":84,"props":38056,"children":38057},{},[38058],{"type":23,"value":38059},"item and inventory sync",{"type":17,"tag":84,"props":38061,"children":38062},{},[38063],{"type":23,"value":38064},"catalog management",{"type":17,"tag":84,"props":38066,"children":38067},{},[38068],{"type":23,"value":38069},"location-based commerce operations",{"type":17,"tag":84,"props":38071,"children":38072},{},[38073],{"type":23,"value":38074},"in-store plus online workflows",{"type":17,"tag":239,"props":38076,"children":38078},{"id":38077},"_8-shipstation-api",[38079],{"type":23,"value":38080},"8. ShipStation API",{"type":17,"tag":29,"props":38082,"children":38083},{},[38084],{"type":17,"tag":133,"props":38085,"children":38087},{"href":34438,"rel":38086},[214],[38088],{"type":23,"value":34917},{"type":17,"tag":29,"props":38090,"children":38091},{},[38092],{"type":23,"value":38093},"ShipStation is not a storefront, but it is critical to many commerce workflows.",{"type":17,"tag":29,"props":38095,"children":38096},{},[38097],{"type":23,"value":23382},{"type":17,"tag":80,"props":38099,"children":38100},{},[38101,38106,38111,38116],{"type":17,"tag":84,"props":38102,"children":38103},{},[38104],{"type":23,"value":38105},"fulfillment operations",{"type":17,"tag":84,"props":38107,"children":38108},{},[38109],{"type":23,"value":38110},"shipping integrations",{"type":17,"tag":84,"props":38112,"children":38113},{},[38114],{"type":23,"value":38115},"order routing",{"type":17,"tag":84,"props":38117,"children":38118},{},[38119],{"type":23,"value":38120},"warehouse and logistics tooling",{"type":17,"tag":239,"props":38122,"children":38124},{"id":38123},"_9-shippo-api",[38125],{"type":23,"value":38126},"9. Shippo API",{"type":17,"tag":29,"props":38128,"children":38129},{},[38130],{"type":17,"tag":133,"props":38131,"children":38133},{"href":34429,"rel":38132},[214],[38134],{"type":23,"value":34870},{"type":17,"tag":29,"props":38136,"children":38137},{},[38138,38140,38144],{"type":23,"value":38139},"Shippo is another important logistics and ",{"type":17,"tag":133,"props":38141,"children":38142},{"href":34475},[38143],{"type":23,"value":34478},{"type":23,"value":38145}," often connected to commerce products.",{"type":17,"tag":29,"props":38147,"children":38148},{},[38149],{"type":23,"value":15093},{"type":17,"tag":80,"props":38151,"children":38152},{},[38153,38158,38163,38168],{"type":17,"tag":84,"props":38154,"children":38155},{},[38156],{"type":23,"value":38157},"shipping automation",{"type":17,"tag":84,"props":38159,"children":38160},{},[38161],{"type":23,"value":38162},"order fulfillment workflows",{"type":17,"tag":84,"props":38164,"children":38165},{},[38166],{"type":23,"value":38167},"label generation and tracking",{"type":17,"tag":84,"props":38169,"children":38170},{},[38171],{"type":23,"value":38172},"logistics analytics",{"type":17,"tag":239,"props":38174,"children":38176},{"id":38175},"_10-akeneo-api",[38177],{"type":23,"value":38178},"10. Akeneo API",{"type":17,"tag":29,"props":38180,"children":38181},{},[38182],{"type":17,"tag":133,"props":38183,"children":38186},{"href":38184,"rel":38185},"https://api.akeneo.com/",[214],[38187],{"type":23,"value":38188},"Akeneo API documentation",{"type":17,"tag":29,"props":38190,"children":38191},{},[38192],{"type":23,"value":38193},"Akeneo matters for product information management and catalog workflows.",{"type":17,"tag":29,"props":38195,"children":38196},{},[38197],{"type":23,"value":23339},{"type":17,"tag":80,"props":38199,"children":38200},{},[38201,38206,38211,38216],{"type":17,"tag":84,"props":38202,"children":38203},{},[38204],{"type":23,"value":38205},"PIM integrations",{"type":17,"tag":84,"props":38207,"children":38208},{},[38209],{"type":23,"value":38210},"product catalog normalization",{"type":17,"tag":84,"props":38212,"children":38213},{},[38214],{"type":23,"value":38215},"variant and asset syndication",{"type":17,"tag":84,"props":38217,"children":38218},{},[38219],{"type":23,"value":38220},"multichannel product publishing",{"type":17,"tag":239,"props":38222,"children":38224},{"id":38223},"_11-salsify-api",[38225],{"type":23,"value":38226},"11. Salsify API",{"type":17,"tag":29,"props":38228,"children":38229},{},[38230],{"type":17,"tag":133,"props":38231,"children":38234},{"href":38232,"rel":38233},"https://developers.salsify.com/",[214],[38235],{"type":23,"value":38236},"Salsify developer documentation",{"type":17,"tag":29,"props":38238,"children":38239},{},[38240],{"type":23,"value":38241},"Salsify is important for product experience management and catalog distribution.",{"type":17,"tag":29,"props":38243,"children":38244},{},[38245],{"type":23,"value":23382},{"type":17,"tag":80,"props":38247,"children":38248},{},[38249,38254,38259],{"type":17,"tag":84,"props":38250,"children":38251},{},[38252],{"type":23,"value":38253},"catalog and content sync",{"type":17,"tag":84,"props":38255,"children":38256},{},[38257],{"type":23,"value":38258},"product data standardization",{"type":17,"tag":84,"props":38260,"children":38261},{},[38262],{"type":23,"value":38263},"channel publishing",{"type":17,"tag":239,"props":38265,"children":38267},{"id":38266},"_12-yotpo-api",[38268],{"type":23,"value":38269},"12. Yotpo API",{"type":17,"tag":29,"props":38271,"children":38272},{},[38273],{"type":17,"tag":133,"props":38274,"children":38277},{"href":38275,"rel":38276},"https://apidocs.yotpo.com/",[214],[38278],{"type":23,"value":38279},"Yotpo API documentation",{"type":17,"tag":29,"props":38281,"children":38282},{},[38283],{"type":23,"value":38284},"Yotpo is often critical for reviews, user-generated content, and customer feedback workflows.",{"type":17,"tag":29,"props":38286,"children":38287},{},[38288],{"type":23,"value":23339},{"type":17,"tag":80,"props":38290,"children":38291},{},[38292,38297,38302,38307],{"type":17,"tag":84,"props":38293,"children":38294},{},[38295],{"type":23,"value":38296},"review aggregation",{"type":17,"tag":84,"props":38298,"children":38299},{},[38300],{"type":23,"value":38301},"ratings analysis",{"type":17,"tag":84,"props":38303,"children":38304},{},[38305],{"type":23,"value":38306},"commerce feedback tooling",{"type":17,"tag":84,"props":38308,"children":38309},{},[38310],{"type":23,"value":38311},"social proof and merchandising workflows",{"type":17,"tag":239,"props":38313,"children":38315},{"id":38314},"_13-yelp-api",[38316],{"type":23,"value":38317},"13. Yelp API",{"type":17,"tag":29,"props":38319,"children":38320},{},[38321],{"type":17,"tag":133,"props":38322,"children":38325},{"href":38323,"rel":38324},"https://docs.developer.yelp.com/",[214],[38326],{"type":23,"value":38327},"Yelp API documentation",{"type":17,"tag":29,"props":38329,"children":38330},{},[38331],{"type":23,"value":38332},"Yelp is relevant for location-based commerce, hospitality, and review-heavy products.",{"type":17,"tag":29,"props":38334,"children":38335},{},[38336],{"type":23,"value":23382},{"type":17,"tag":80,"props":38338,"children":38339},{},[38340,38345,38350],{"type":17,"tag":84,"props":38341,"children":38342},{},[38343],{"type":23,"value":38344},"location and ratings data",{"type":17,"tag":84,"props":38346,"children":38347},{},[38348],{"type":23,"value":38349},"review monitoring",{"type":17,"tag":84,"props":38351,"children":38352},{},[38353],{"type":23,"value":38354},"multi-location commerce analytics",{"type":17,"tag":239,"props":38356,"children":38358},{"id":38357},"_14-opentable-api",[38359],{"type":23,"value":38360},"14. OpenTable API",{"type":17,"tag":29,"props":38362,"children":38363},{},[38364],{"type":17,"tag":133,"props":38365,"children":38368},{"href":38366,"rel":38367},"https://restaurant.opentable.com/",[214],[38369],{"type":23,"value":38370},"OpenTable for Restaurants",{"type":17,"tag":29,"props":38372,"children":38373},{},[38374],{"type":23,"value":38375},"OpenTable matters for reservation-based commerce and hospitality workflows.",{"type":17,"tag":29,"props":38377,"children":38378},{},[38379],{"type":23,"value":23339},{"type":17,"tag":80,"props":38381,"children":38382},{},[38383,38388,38393,38398],{"type":17,"tag":84,"props":38384,"children":38385},{},[38386],{"type":23,"value":38387},"reservations",{"type":17,"tag":84,"props":38389,"children":38390},{},[38391],{"type":23,"value":38392},"availability sync",{"type":17,"tag":84,"props":38394,"children":38395},{},[38396],{"type":23,"value":38397},"location and capacity management",{"type":17,"tag":84,"props":38399,"children":38400},{},[38401],{"type":23,"value":38402},"guest flow tooling",{"type":17,"tag":239,"props":38404,"children":38406},{"id":38405},"_15-sevenrooms-resos-and-reservation-commerce-tools",[38407],{"type":23,"value":38408},"15. SevenRooms / resOS and reservation commerce tools",{"type":17,"tag":29,"props":38410,"children":38411},{},[38412],{"type":17,"tag":133,"props":38413,"children":38416},{"href":38414,"rel":38415},"https://sevenrooms.com/en/platform/",[214],[38417],{"type":23,"value":11189},{"type":17,"tag":29,"props":38419,"children":38420},{},[38421],{"type":17,"tag":133,"props":38422,"children":38425},{"href":38423,"rel":38424},"https://www.resos.com/",[214],[38426],{"type":23,"value":11209},{"type":17,"tag":29,"props":38428,"children":38429},{},[38430],{"type":23,"value":38431},"These platforms matter when commerce includes bookings, hospitality, or reservation inventory.",{"type":17,"tag":29,"props":38433,"children":38434},{},[38435],{"type":23,"value":23339},{"type":17,"tag":80,"props":38437,"children":38438},{},[38439,38444,38448,38453],{"type":17,"tag":84,"props":38440,"children":38441},{},[38442],{"type":23,"value":38443},"reservation sync",{"type":17,"tag":84,"props":38445,"children":38446},{},[38447],{"type":23,"value":13988},{"type":17,"tag":84,"props":38449,"children":38450},{},[38451],{"type":23,"value":38452},"guest and location operations",{"type":17,"tag":84,"props":38454,"children":38455},{},[38456],{"type":23,"value":38457},"hospitality data workflows",{"type":17,"tag":239,"props":38459,"children":38461},{"id":38460},"other-commerce-apis-teams-often-need",[38462],{"type":23,"value":38463},"Other commerce APIs teams often need",{"type":17,"tag":29,"props":38465,"children":38466},{},[38467],{"type":23,"value":38468},"Depending on customer demand, teams may also need support for:",{"type":17,"tag":80,"props":38470,"children":38471},{},[38472,38480,38488,38498,38506,38514,38522,38531],{"type":17,"tag":84,"props":38473,"children":38474},{},[38475],{"type":17,"tag":133,"props":38476,"children":38478},{"href":35782,"rel":38477},[214],[38479],{"type":23,"value":26553},{"type":17,"tag":84,"props":38481,"children":38482},{},[38483],{"type":17,"tag":133,"props":38484,"children":38486},{"href":35775,"rel":38485},[214],[38487],{"type":23,"value":26548},{"type":17,"tag":84,"props":38489,"children":38490},{},[38491],{"type":17,"tag":133,"props":38492,"children":38495},{"href":38493,"rel":38494},"https://www.wayfair.com/",[214],[38496],{"type":23,"value":38497},"Wayfair",{"type":17,"tag":84,"props":38499,"children":38500},{},[38501],{"type":17,"tag":133,"props":38502,"children":38504},{"href":35093,"rel":38503},[214],[38505],{"type":23,"value":13070},{"type":17,"tag":84,"props":38507,"children":38508},{},[38509],{"type":17,"tag":133,"props":38510,"children":38512},{"href":36483,"rel":38511},[214],[38513],{"type":23,"value":3199},{"type":17,"tag":84,"props":38515,"children":38516},{},[38517],{"type":17,"tag":133,"props":38518,"children":38520},{"href":36611,"rel":38519},[214],[38521],{"type":23,"value":6678},{"type":17,"tag":84,"props":38523,"children":38524},{},[38525],{"type":17,"tag":133,"props":38526,"children":38528},{"href":36651,"rel":38527},[214],[38529],{"type":23,"value":38530},"Zoho Books",{"type":17,"tag":84,"props":38532,"children":38533},{},[38534],{"type":17,"tag":133,"props":38535,"children":38538},{"href":38536,"rel":38537},"https://developer.intacct.com/",[214],[38539],{"type":23,"value":38540},"Sage Intacct",{"type":17,"tag":29,"props":38542,"children":38543},{},[38544],{"type":23,"value":38545},"That overlap is one reason commerce is rarely just 'commerce.' It often blends into accounting, shipping, reservations, payments, and marketplaces.",{"type":17,"tag":68,"props":38547,"children":38549},{"id":38548},"challenges-with-e-commerce-api-integrations",[38550],{"type":23,"value":38551},"Challenges with e-commerce API integrations",{"type":17,"tag":29,"props":38553,"children":38554},{},[38555],{"type":23,"value":38556},"E-commerce APIs are difficult to support well because the category is broad and fragmented.",{"type":17,"tag":239,"props":38558,"children":38560},{"id":38559},"products-and-variants-are-modeled-differently",[38561],{"type":23,"value":38562},"Products and variants are modeled differently",{"type":17,"tag":29,"props":38564,"children":38565},{},[38566],{"type":23,"value":38567},"Every provider has its own structure for:",{"type":17,"tag":80,"props":38569,"children":38570},{},[38571,38576,38581,38586,38591,38596],{"type":17,"tag":84,"props":38572,"children":38573},{},[38574],{"type":23,"value":38575},"products",{"type":17,"tag":84,"props":38577,"children":38578},{},[38579],{"type":23,"value":38580},"variants",{"type":17,"tag":84,"props":38582,"children":38583},{},[38584],{"type":23,"value":38585},"options",{"type":17,"tag":84,"props":38587,"children":38588},{},[38589],{"type":23,"value":38590},"media",{"type":17,"tag":84,"props":38592,"children":38593},{},[38594],{"type":23,"value":38595},"collections",{"type":17,"tag":84,"props":38597,"children":38598},{},[38599],{"type":23,"value":38600},"inventory references",{"type":17,"tag":29,"props":38602,"children":38603},{},[38604],{"type":23,"value":38605},"Even basic product sync becomes provider-specific very quickly.",{"type":17,"tag":239,"props":38607,"children":38609},{"id":38608},"inventory-is-hard-across-channels",[38610],{"type":23,"value":38611},"Inventory is hard across channels",{"type":17,"tag":29,"props":38613,"children":38614},{},[38615],{"type":23,"value":38616},"Inventory is rarely just one number.",{"type":17,"tag":29,"props":38618,"children":38619},{},[38620],{"type":23,"value":38621},"It may be:",{"type":17,"tag":80,"props":38623,"children":38624},{},[38625,38630,38635,38640],{"type":17,"tag":84,"props":38626,"children":38627},{},[38628],{"type":23,"value":38629},"location-specific",{"type":17,"tag":84,"props":38631,"children":38632},{},[38633],{"type":23,"value":38634},"channel-specific",{"type":17,"tag":84,"props":38636,"children":38637},{},[38638],{"type":23,"value":38639},"warehouse-specific",{"type":17,"tag":84,"props":38641,"children":38642},{},[38643],{"type":23,"value":38644},"affected by reservations, returns, or bundles",{"type":17,"tag":29,"props":38646,"children":38647},{},[38648],{"type":23,"value":38649},"That makes cross-platform inventory sync especially tricky.",{"type":17,"tag":239,"props":38651,"children":38653},{"id":38652},"reviews-reservations-and-locations-complicate-the-category",[38654],{"type":23,"value":38655},"Reviews, reservations, and locations complicate the category",{"type":17,"tag":29,"props":38657,"children":38658},{},[38659],{"type":23,"value":38660},"Commerce does not stop at catalog and stock.",{"type":17,"tag":29,"props":38662,"children":38663},{},[38664],{"type":23,"value":38665},"Once you add:",{"type":17,"tag":80,"props":38667,"children":38668},{},[38669,38674,38679,38683,38687],{"type":17,"tag":84,"props":38670,"children":38671},{},[38672],{"type":23,"value":38673},"reviews",{"type":17,"tag":84,"props":38675,"children":38676},{},[38677],{"type":23,"value":38678},"store locations",{"type":17,"tag":84,"props":38680,"children":38681},{},[38682],{"type":23,"value":38387},{"type":17,"tag":84,"props":38684,"children":38685},{},[38686],{"type":23,"value":10342},{"type":17,"tag":84,"props":38688,"children":38689},{},[38690],{"type":23,"value":38691},"sales channels",{"type":17,"tag":29,"props":38693,"children":38694},{},[38695],{"type":23,"value":38696},"the object model becomes much broader than a basic storefront integration.",{"type":17,"tag":239,"props":38698,"children":38699},{"id":31321},[38700],{"type":23,"value":31324},{"type":17,"tag":29,"props":38702,"children":38703},{},[38704],{"type":23,"value":29802},{"type":17,"tag":80,"props":38706,"children":38707},{},[38708,38713,38718,38723],{"type":17,"tag":84,"props":38709,"children":38710},{},[38711],{"type":23,"value":38712},"OAuth requirements",{"type":17,"tag":84,"props":38714,"children":38715},{},[38716],{"type":23,"value":38717},"app review processes",{"type":17,"tag":84,"props":38719,"children":38720},{},[38721],{"type":23,"value":38722},"account models",{"type":17,"tag":84,"props":38724,"children":38725},{},[38726],{"type":23,"value":38727},"marketplace permissions",{"type":17,"tag":239,"props":38729,"children":38731},{"id":38730},"maintenance-grows-fast",[38732],{"type":23,"value":38733},"Maintenance grows fast",{"type":17,"tag":29,"props":38735,"children":38736},{},[38737],{"type":23,"value":38738},"Once you support multiple commerce systems directly, you take on:",{"type":17,"tag":80,"props":38740,"children":38741},{},[38742,38746,38750,38755,38760],{"type":17,"tag":84,"props":38743,"children":38744},{},[38745],{"type":23,"value":31430},{"type":17,"tag":84,"props":38747,"children":38748},{},[38749],{"type":23,"value":29890},{"type":17,"tag":84,"props":38751,"children":38752},{},[38753],{"type":23,"value":38754},"different webhook payloads",{"type":17,"tag":84,"props":38756,"children":38757},{},[38758],{"type":23,"value":38759},"different lifecycle changes",{"type":17,"tag":84,"props":38761,"children":38762},{},[38763],{"type":23,"value":38764},"ongoing API version maintenance",{"type":17,"tag":68,"props":38766,"children":38768},{"id":38767},"the-role-of-unified-commerce-apis",[38769],{"type":23,"value":38770},"The role of Unified Commerce APIs",{"type":17,"tag":29,"props":38772,"children":38773},{},[38774],{"type":23,"value":38775},"This is where Unified Commerce APIs become much more valuable.",{"type":17,"tag":29,"props":38777,"children":38778},{},[38779],{"type":23,"value":38780},"Instead of building separate integrations for Shopify, WooCommerce, BigCommerce, Amazon Seller Central, Walmart, Akeneo, ShipStation, Yotpo, and others, a Unified API gives you one interface across a fragmented category.",{"type":17,"tag":29,"props":38782,"children":38783},{},[38784],{"type":23,"value":5804},{"type":17,"tag":80,"props":38786,"children":38787},{},[38788,38792,38797,38802,38807],{"type":17,"tag":84,"props":38789,"children":38790},{},[38791],{"type":23,"value":23897},{"type":17,"tag":84,"props":38793,"children":38794},{},[38795],{"type":23,"value":38796},"one auth experience",{"type":17,"tag":84,"props":38798,"children":38799},{},[38800],{"type":23,"value":38801},"one schema for core commerce objects",{"type":17,"tag":84,"props":38803,"children":38804},{},[38805],{"type":23,"value":38806},"one observability layer",{"type":17,"tag":84,"props":38808,"children":38809},{},[38810],{"type":23,"value":38811},"less ongoing maintenance",{"type":17,"tag":29,"props":38813,"children":38814},{},[38815],{"type":23,"value":38816},"For SaaS teams that want broad commerce coverage without rebuilding their product logic per provider, this is a much more scalable model.",{"type":17,"tag":68,"props":38818,"children":38819},{"id":21659},[38820],{"type":23,"value":21662},{"type":17,"tag":29,"props":38822,"children":38823},{},[38824,38825,38831,38832,38837],{"type":23,"value":6712},{"type":17,"tag":133,"props":38826,"children":38829},{"href":38827,"rel":38828},"https://unified.to/e-commerce",[214],[38830],{"type":23,"value":19384},{"type":23,"value":23936},{"type":17,"tag":48,"props":38833,"children":38834},{},[38835],{"type":23,"value":38836},"35+ e-commerce integrations",{"type":23,"value":29965},{"type":17,"tag":29,"props":38839,"children":38840},{},[38841],{"type":23,"value":13248},{"type":17,"tag":80,"props":38843,"children":38844},{},[38845,38849,38853,38857,38861,38866,38871,38875,38879,38883,38888,38893,38897,38901,38905,38909],{"type":17,"tag":84,"props":38846,"children":38847},{},[38848],{"type":23,"value":37435},{"type":17,"tag":84,"props":38850,"children":38851},{},[38852],{"type":23,"value":37443},{"type":17,"tag":84,"props":38854,"children":38855},{},[38856],{"type":23,"value":37451},{"type":17,"tag":84,"props":38858,"children":38859},{},[38860],{"type":23,"value":37459},{"type":17,"tag":84,"props":38862,"children":38863},{},[38864],{"type":23,"value":38865},"Walmart",{"type":17,"tag":84,"props":38867,"children":38868},{},[38869],{"type":23,"value":38870},"Squarespace",{"type":17,"tag":84,"props":38872,"children":38873},{},[38874],{"type":23,"value":14193},{"type":17,"tag":84,"props":38876,"children":38877},{},[38878],{"type":23,"value":34442},{"type":17,"tag":84,"props":38880,"children":38881},{},[38882],{"type":23,"value":34433},{"type":17,"tag":84,"props":38884,"children":38885},{},[38886],{"type":23,"value":38887},"Akeneo",{"type":17,"tag":84,"props":38889,"children":38890},{},[38891],{"type":23,"value":38892},"Salsify",{"type":17,"tag":84,"props":38894,"children":38895},{},[38896],{"type":23,"value":11731},{"type":17,"tag":84,"props":38898,"children":38899},{},[38900],{"type":23,"value":11179},{"type":17,"tag":84,"props":38902,"children":38903},{},[38904],{"type":23,"value":11169},{"type":17,"tag":84,"props":38906,"children":38907},{},[38908],{"type":23,"value":11189},{"type":17,"tag":84,"props":38910,"children":38911},{},[38912],{"type":23,"value":15768},{"type":17,"tag":239,"props":38914,"children":38916},{"id":38915},"unified-commerce-objects",[38917],{"type":23,"value":38918},"Unified Commerce objects",{"type":17,"tag":29,"props":38920,"children":38921},{},[38922],{"type":23,"value":38923},"Unified standardizes key commerce objects including:",{"type":17,"tag":80,"props":38925,"children":38926},{},[38927,38932,38937,38942,38947,38952,38957,38962,38966],{"type":17,"tag":84,"props":38928,"children":38929},{},[38930],{"type":23,"value":38931},"Item Variants",{"type":17,"tag":84,"props":38933,"children":38934},{},[38935],{"type":23,"value":38936},"Items",{"type":17,"tag":84,"props":38938,"children":38939},{},[38940],{"type":23,"value":38941},"Collections",{"type":17,"tag":84,"props":38943,"children":38944},{},[38945],{"type":23,"value":38946},"Inventory",{"type":17,"tag":84,"props":38948,"children":38949},{},[38950],{"type":23,"value":38951},"Locations",{"type":17,"tag":84,"props":38953,"children":38954},{},[38955],{"type":23,"value":38956},"Reviews",{"type":17,"tag":84,"props":38958,"children":38959},{},[38960],{"type":23,"value":38961},"Reservations",{"type":17,"tag":84,"props":38963,"children":38964},{},[38965],{"type":23,"value":11140},{"type":17,"tag":84,"props":38967,"children":38968},{},[38969],{"type":23,"value":38970},"Sales Channels",{"type":17,"tag":29,"props":38972,"children":38973},{},[38974],{"type":23,"value":38975},"This makes it possible to build one product experience across many commerce systems without maintaining a separate model for each provider.",{"type":17,"tag":239,"props":38977,"children":38978},{"id":24049},[38979],{"type":23,"value":24052},{"type":17,"tag":29,"props":38981,"children":38982},{},[38983],{"type":23,"value":31648},{"type":17,"tag":80,"props":38985,"children":38986},{},[38987,38991,38996,39000],{"type":17,"tag":84,"props":38988,"children":38989},{},[38990],{"type":23,"value":32808},{"type":17,"tag":84,"props":38992,"children":38993},{},[38994],{"type":23,"value":38995},"cached product and inventory data",{"type":17,"tag":84,"props":38997,"children":38998},{},[38999],{"type":23,"value":31666},{"type":17,"tag":84,"props":39001,"children":39002},{},[39003],{"type":23,"value":39004},"shallow support across commerce-adjacent objects",{"type":17,"tag":29,"props":39006,"children":39007},{},[39008,39009,39013],{"type":23,"value":24080},{"type":17,"tag":48,"props":39010,"children":39011},{},[39012],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":39015,"children":39016},{},[39017],{"type":23,"value":5804},{"type":17,"tag":80,"props":39019,"children":39020},{},[39021,39025,39030,39034,39038],{"type":17,"tag":84,"props":39022,"children":39023},{},[39024],{"type":23,"value":24097},{"type":17,"tag":84,"props":39026,"children":39027},{},[39028],{"type":23,"value":39029},"no stale cache layer",{"type":17,"tag":84,"props":39031,"children":39032},{},[39033],{"type":23,"value":30123},{"type":17,"tag":84,"props":39035,"children":39036},{},[39037],{"type":23,"value":31700},{"type":17,"tag":84,"props":39039,"children":39040},{},[39041],{"type":23,"value":39042},"native and virtual webhooks for near-real-time workflows",{"type":17,"tag":29,"props":39044,"children":39045},{},[39046,39047,39051],{"type":23,"value":24117},{"type":17,"tag":48,"props":39048,"children":39049},{},[39050],{"type":23,"value":24122},{"type":23,"value":39052},", so customer commerce data is not stored at rest by the integration layer.",{"type":17,"tag":29,"props":39054,"children":39055},{},[39056],{"type":23,"value":39057},"That matters for teams handling sensitive merchant data, regional requirements, and customer environments where compliance scope matters.",{"type":17,"tag":239,"props":39059,"children":39060},{"id":24132},[39061],{"type":23,"value":24135},{"type":17,"tag":29,"props":39063,"children":39064},{},[39065],{"type":23,"value":24140},{"type":17,"tag":80,"props":39067,"children":39068},{},[39069,39074,39079,39084,39088,39092,39097],{"type":17,"tag":84,"props":39070,"children":39071},{},[39072],{"type":23,"value":39073},"multichannel product sync tools",{"type":17,"tag":84,"props":39075,"children":39076},{},[39077],{"type":23,"value":39078},"inventory synchronization platforms",{"type":17,"tag":84,"props":39080,"children":39081},{},[39082],{"type":23,"value":39083},"commerce analytics dashboards",{"type":17,"tag":84,"props":39085,"children":39086},{},[39087],{"type":23,"value":37565},{"type":17,"tag":84,"props":39089,"children":39090},{},[39091],{"type":23,"value":37575},{"type":17,"tag":84,"props":39093,"children":39094},{},[39095],{"type":23,"value":39096},"reservation and availability workflows",{"type":17,"tag":84,"props":39098,"children":39099},{},[39100],{"type":23,"value":37590},{"type":17,"tag":29,"props":39102,"children":39103},{},[39104],{"type":23,"value":39105},"without rebuilding the commerce category provider by provider.",{"type":17,"tag":68,"props":39107,"children":39109},{"id":39108},"why-not-just-build-each-commerce-integration-directly",[39110],{"type":23,"value":39111},"Why not just build each commerce integration directly?",{"type":17,"tag":29,"props":39113,"children":39114},{},[39115],{"type":23,"value":39116},"You can, but this category becomes expensive quickly.",{"type":17,"tag":29,"props":39118,"children":39119},{},[39120],{"type":23,"value":39121},"For every provider you support, you need to handle:",{"type":17,"tag":80,"props":39123,"children":39124},{},[39125,39130,39135,39139,39144],{"type":17,"tag":84,"props":39126,"children":39127},{},[39128],{"type":23,"value":39129},"new auth patterns",{"type":17,"tag":84,"props":39131,"children":39132},{},[39133],{"type":23,"value":39134},"different product and inventory schemas",{"type":17,"tag":84,"props":39136,"children":39137},{},[39138],{"type":23,"value":31439},{"type":17,"tag":84,"props":39140,"children":39141},{},[39142],{"type":23,"value":39143},"different marketplace rules",{"type":17,"tag":84,"props":39145,"children":39146},{},[39147],{"type":23,"value":37294},{"type":17,"tag":29,"props":39149,"children":39150},{},[39151],{"type":23,"value":39152},"That cost grows much faster than most teams expect because commerce touches so many adjacent systems.",{"type":17,"tag":29,"props":39154,"children":39155},{},[39156],{"type":23,"value":39157},"A Unified Commerce API removes much of that repeated infrastructure work and keeps your product architecture cleaner as you expand.",{"type":17,"tag":68,"props":39159,"children":39160},{"id":1552},[39161],{"type":23,"value":1555},{"type":17,"tag":29,"props":39163,"children":39164},{},[39165],{"type":23,"value":39166},"E-commerce APIs are foundational for catalog, inventory, marketplace, review, and reservation workflows, but the category is broad enough that direct integrations become difficult to scale.",{"type":17,"tag":29,"props":39168,"children":39169},{},[39170],{"type":23,"value":39171},"That is why more SaaS teams are moving toward Unified Commerce APIs.",{"type":17,"tag":29,"props":39173,"children":39174},{},[39175,39177,39182],{"type":23,"value":39176},"If you need real-time, read/write access to commerce data across Shopify, WooCommerce, BigCommerce, Amazon Seller Central, Walmart, and many more systems, ",{"type":17,"tag":133,"props":39178,"children":39180},{"href":212,"rel":39179},[214],[39181],{"type":23,"value":217},{"type":23,"value":39183}," gives you a much faster and more scalable way to support those workflows.",{"type":17,"tag":29,"props":39185,"children":39186},{},[39187,39188],{"type":23,"value":1609},{"type":17,"tag":133,"props":39189,"children":39191},{"href":39190},"/bf8154eb04f84537b972c6170fb94a79",[39192],{"type":23,"value":1616},{"type":17,"tag":29,"props":39194,"children":39195},{},[39196,39197],{"type":23,"value":1609},{"type":17,"tag":133,"props":39198,"children":39200},{"href":1623,"rel":39199},[214],[39201],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":39203},[39204,39205,39206,39224,39231,39232,39237,39238],{"id":37490,"depth":1629,"text":37493},{"id":37593,"depth":1629,"text":37596},{"id":37728,"depth":1629,"text":37731,"children":39207},[39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223],{"id":37739,"depth":1635,"text":37742},{"id":37797,"depth":1635,"text":37800},{"id":37844,"depth":1635,"text":37847},{"id":37891,"depth":1635,"text":37894},{"id":37938,"depth":1635,"text":37941},{"id":37985,"depth":1635,"text":37988},{"id":38031,"depth":1635,"text":38034},{"id":38077,"depth":1635,"text":38080},{"id":38123,"depth":1635,"text":38126},{"id":38175,"depth":1635,"text":38178},{"id":38223,"depth":1635,"text":38226},{"id":38266,"depth":1635,"text":38269},{"id":38314,"depth":1635,"text":38317},{"id":38357,"depth":1635,"text":38360},{"id":38405,"depth":1635,"text":38408},{"id":38460,"depth":1635,"text":38463},{"id":38548,"depth":1629,"text":38551,"children":39225},[39226,39227,39228,39229,39230],{"id":38559,"depth":1635,"text":38562},{"id":38608,"depth":1635,"text":38611},{"id":38652,"depth":1635,"text":38655},{"id":31321,"depth":1635,"text":31324},{"id":38730,"depth":1635,"text":38733},{"id":38767,"depth":1629,"text":38770},{"id":21659,"depth":1629,"text":21662,"children":39233},[39234,39235,39236],{"id":38915,"depth":1635,"text":38918},{"id":24049,"depth":1635,"text":24052},{"id":24132,"depth":1635,"text":24135},{"id":39108,"depth":1629,"text":39111},{"id":1552,"depth":1629,"text":1555},"content:blog:15_e_commerce_apis_to_integrate_with_in_2026_shopify_woocommerce_bigcommerce_and_unified_commerce_apis.md","blog/15_e_commerce_apis_to_integrate_with_in_2026_shopify_woocommerce_bigcommerce_and_unified_commerce_apis.md","blog/15_e_commerce_apis_to_integrate_with_in_2026_shopify_woocommerce_bigcommerce_and_unified_commerce_apis",{"_path":39243,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":39244,"description":39245,"img":39246,"date":39247,"tag":12,"body":39248,"_type":1677,"_id":40327,"_source":1679,"_file":40328,"_stem":40329,"_extension":1682},"/blog/3_forms_apis_to_integrate_with_typeform_google_forms_tally_and_unified_forms_apis","3 Forms APIs to Integrate With: Typeform, Google Forms, Tally, and Unified Forms APIs","Forms are one of the simplest ways businesses collect data, but supporting form integrations inside a SaaS product is rarely as simple as it looks.","https://s3.us-east-2.amazonaws.com/unified-article-images/3_forms_apis_to_integrate_with_typeform_google_forms_tally_and_unified_forms_apis-icon.png","2026-03-23T22:21:00.000Z",{"type":14,"children":39249,"toc":40303},[39250,39255,39258,39265,39269,39274,39292,39298,39310,39314,39342,39347,39379,39385,39390,39395,39423,39427,39435,39440,39448,39453,39460,39465,39473,39478,39486,39491,39497,39502,39508,39518,39523,39527,39555,39561,39571,39576,39580,39608,39614,39624,39629,39633,39661,39667,39672,39725,39730,39736,39741,39747,39752,39780,39784,39789,39795,39800,39805,39811,39816,39843,39849,39854,39881,39886,39892,39897,39908,39912,39937,39942,39948,39961,39966,39983,39989,39994,40002,40037,40045,40071,40076,40080,40085,40100,40109,40113,40134,40144,40149,40153,40157,40195,40200,40206,40211,40216,40249,40254,40259,40263,40268,40273,40285,40294],{"type":17,"tag":18,"props":39251,"children":39253},{"id":39252},"_3-forms-apis-to-integrate-with-typeform-google-forms-tally-and-unified-forms-apis",[39254],{"type":23,"value":39244},{"type":17,"tag":25,"props":39256,"children":39257},{},[],{"type":17,"tag":29,"props":39259,"children":39260},{},[39261],{"type":17,"tag":33,"props":39262,"children":39263},{},[39264],{"type":23,"value":33053},{"type":17,"tag":29,"props":39266,"children":39267},{},[39268],{"type":23,"value":39245},{"type":17,"tag":29,"props":39270,"children":39271},{},[39272],{"type":23,"value":39273},"Even lightweight form platforms have different authentication flows, response structures, webhook behavior, field models, and submission formats. If your product needs to pull submissions, trigger workflows, sync responses into a CRM, or analyze responses across tools, building each form integration separately becomes a maintenance problem fast.",{"type":17,"tag":29,"props":39275,"children":39276},{},[39277,39278,39283,39285,39290],{"type":23,"value":23079},{"type":17,"tag":48,"props":39279,"children":39280},{},[39281],{"type":23,"value":39282},"top forms APIs to integrate with",{"type":23,"value":39284},", the most common use cases for form data, the challenges of building these integrations directly, and why more products are using ",{"type":17,"tag":48,"props":39286,"children":39287},{},[39288],{"type":23,"value":39289},"Unified Forms APIs",{"type":23,"value":39291}," instead of supporting each form builder one by one.",{"type":17,"tag":68,"props":39293,"children":39295},{"id":39294},"what-is-a-forms-api",[39296],{"type":23,"value":39297},"What is a forms API?",{"type":17,"tag":29,"props":39299,"children":39300},{},[39301,39302,39308],{"type":23,"value":9619},{"type":17,"tag":133,"props":39303,"children":39305},{"href":39304},"/forms",[39306],{"type":23,"value":39307},"forms API",{"type":23,"value":39309}," lets developers access form and submission data programmatically.",{"type":17,"tag":29,"props":39311,"children":39312},{},[39313],{"type":23,"value":30396},{"type":17,"tag":80,"props":39315,"children":39316},{},[39317,39322,39327,39332,39337],{"type":17,"tag":84,"props":39318,"children":39319},{},[39320],{"type":23,"value":39321},"forms",{"type":17,"tag":84,"props":39323,"children":39324},{},[39325],{"type":23,"value":39326},"questions or fields",{"type":17,"tag":84,"props":39328,"children":39329},{},[39330],{"type":23,"value":39331},"submission responses",{"type":17,"tag":84,"props":39333,"children":39334},{},[39335],{"type":23,"value":39336},"respondent information",{"type":17,"tag":84,"props":39338,"children":39339},{},[39340],{"type":23,"value":39341},"metadata like timestamps, status, and published URLs",{"type":17,"tag":29,"props":39343,"children":39344},{},[39345],{"type":23,"value":39346},"These APIs are often used to build:",{"type":17,"tag":80,"props":39348,"children":39349},{},[39350,39355,39360,39364,39369,39374],{"type":17,"tag":84,"props":39351,"children":39352},{},[39353],{"type":23,"value":39354},"lead capture pipelines",{"type":17,"tag":84,"props":39356,"children":39357},{},[39358],{"type":23,"value":39359},"survey analytics",{"type":17,"tag":84,"props":39361,"children":39362},{},[39363],{"type":23,"value":424},{"type":17,"tag":84,"props":39365,"children":39366},{},[39367],{"type":23,"value":39368},"customer data sync",{"type":17,"tag":84,"props":39370,"children":39371},{},[39372],{"type":23,"value":39373},"registration and onboarding workflows",{"type":17,"tag":84,"props":39375,"children":39376},{},[39377],{"type":23,"value":39378},"AI-powered response analysis",{"type":17,"tag":68,"props":39380,"children":39382},{"id":39381},"why-saas-teams-integrate-forms-apis",[39383],{"type":23,"value":39384},"Why SaaS teams integrate forms APIs",{"type":17,"tag":29,"props":39386,"children":39387},{},[39388],{"type":23,"value":39389},"Form builders are often the first place customer or prospect data enters a system.",{"type":17,"tag":29,"props":39391,"children":39392},{},[39393],{"type":23,"value":39394},"That makes form integrations important for products that need to:",{"type":17,"tag":80,"props":39396,"children":39397},{},[39398,39403,39408,39413,39418],{"type":17,"tag":84,"props":39399,"children":39400},{},[39401],{"type":23,"value":39402},"collect and route leads",{"type":17,"tag":84,"props":39404,"children":39405},{},[39406],{"type":23,"value":39407},"sync submissions into CRMs",{"type":17,"tag":84,"props":39409,"children":39410},{},[39411],{"type":23,"value":39412},"trigger onboarding or application flows",{"type":17,"tag":84,"props":39414,"children":39415},{},[39416],{"type":23,"value":39417},"analyze survey responses",{"type":17,"tag":84,"props":39419,"children":39420},{},[39421],{"type":23,"value":39422},"centralize intake data across tools",{"type":17,"tag":29,"props":39424,"children":39425},{},[39426],{"type":23,"value":12661},{"type":17,"tag":29,"props":39428,"children":39429},{},[39430],{"type":17,"tag":48,"props":39431,"children":39432},{},[39433],{"type":23,"value":39434},"Lead capture and routing",{"type":17,"tag":29,"props":39436,"children":39437},{},[39438],{"type":23,"value":39439},"Move new submissions into a CRM or sales workflow automatically.",{"type":17,"tag":29,"props":39441,"children":39442},{},[39443],{"type":17,"tag":48,"props":39444,"children":39445},{},[39446],{"type":23,"value":39447},"Survey and feedback analysis",{"type":17,"tag":29,"props":39449,"children":39450},{},[39451],{"type":23,"value":39452},"Aggregate responses from customer or employee surveys into analytics tools.",{"type":17,"tag":29,"props":39454,"children":39455},{},[39456],{"type":17,"tag":48,"props":39457,"children":39458},{},[39459],{"type":23,"value":12682},{"type":17,"tag":29,"props":39461,"children":39462},{},[39463],{"type":23,"value":39464},"Trigger downstream actions whenever a form is submitted.",{"type":17,"tag":29,"props":39466,"children":39467},{},[39468],{"type":17,"tag":48,"props":39469,"children":39470},{},[39471],{"type":23,"value":39472},"Application and intake flows",{"type":17,"tag":29,"props":39474,"children":39475},{},[39476],{"type":23,"value":39477},"Use form responses to start structured review, onboarding, or approval workflows.",{"type":17,"tag":29,"props":39479,"children":39480},{},[39481],{"type":17,"tag":48,"props":39482,"children":39483},{},[39484],{"type":23,"value":39485},"AI response analysis",{"type":17,"tag":29,"props":39487,"children":39488},{},[39489],{"type":23,"value":39490},"Analyze free-text or structured submissions for themes, sentiment, or next-best actions.",{"type":17,"tag":68,"props":39492,"children":39494},{"id":39493},"top-forms-apis-to-integrate-with",[39495],{"type":23,"value":39496},"Top forms APIs to integrate with",{"type":17,"tag":29,"props":39498,"children":39499},{},[39500],{"type":23,"value":39501},"Today, most SaaS teams commonly need to support a smaller set of major form platforms.",{"type":17,"tag":239,"props":39503,"children":39505},{"id":39504},"_1-typeform-api",[39506],{"type":23,"value":39507},"1. Typeform API",{"type":17,"tag":29,"props":39509,"children":39510},{},[39511],{"type":17,"tag":133,"props":39512,"children":39515},{"href":39513,"rel":39514},"https://www.typeform.com/developers/",[214],[39516],{"type":23,"value":39517},"Typeform API documentation",{"type":17,"tag":29,"props":39519,"children":39520},{},[39521],{"type":23,"value":39522},"Typeform is one of the most widely used form and survey platforms, especially for modern lead capture, surveys, and product intake flows.",{"type":17,"tag":29,"props":39524,"children":39525},{},[39526],{"type":23,"value":15093},{"type":17,"tag":80,"props":39528,"children":39529},{},[39530,39535,39540,39545,39550],{"type":17,"tag":84,"props":39531,"children":39532},{},[39533],{"type":23,"value":39534},"lead forms",{"type":17,"tag":84,"props":39536,"children":39537},{},[39538],{"type":23,"value":39539},"customer surveys",{"type":17,"tag":84,"props":39541,"children":39542},{},[39543],{"type":23,"value":39544},"product research",{"type":17,"tag":84,"props":39546,"children":39547},{},[39548],{"type":23,"value":39549},"qualification forms",{"type":17,"tag":84,"props":39551,"children":39552},{},[39553],{"type":23,"value":39554},"event registrations",{"type":17,"tag":239,"props":39556,"children":39558},{"id":39557},"_2-google-forms-api",[39559],{"type":23,"value":39560},"2. Google Forms API",{"type":17,"tag":29,"props":39562,"children":39563},{},[39564],{"type":17,"tag":133,"props":39565,"children":39568},{"href":39566,"rel":39567},"https://developers.google.com/forms/api/guides/overview",[214],[39569],{"type":23,"value":39570},"Google Forms API documentation",{"type":17,"tag":29,"props":39572,"children":39573},{},[39574],{"type":23,"value":39575},"Google Forms is widely used across teams because it is lightweight, familiar, and part of the broader Google Workspace ecosystem.",{"type":17,"tag":29,"props":39577,"children":39578},{},[39579],{"type":23,"value":15093},{"type":17,"tag":80,"props":39581,"children":39582},{},[39583,39588,39593,39598,39603],{"type":17,"tag":84,"props":39584,"children":39585},{},[39586],{"type":23,"value":39587},"internal forms",{"type":17,"tag":84,"props":39589,"children":39590},{},[39591],{"type":23,"value":39592},"surveys",{"type":17,"tag":84,"props":39594,"children":39595},{},[39596],{"type":23,"value":39597},"employee feedback",{"type":17,"tag":84,"props":39599,"children":39600},{},[39601],{"type":23,"value":39602},"operational intake forms",{"type":17,"tag":84,"props":39604,"children":39605},{},[39606],{"type":23,"value":39607},"education and training workflows",{"type":17,"tag":239,"props":39609,"children":39611},{"id":39610},"_3-tally-api",[39612],{"type":23,"value":39613},"3. Tally API",{"type":17,"tag":29,"props":39615,"children":39616},{},[39617],{"type":17,"tag":133,"props":39618,"children":39621},{"href":39619,"rel":39620},"https://tally.so/",[214],[39622],{"type":23,"value":39623},"Tally",{"type":17,"tag":29,"props":39625,"children":39626},{},[39627],{"type":23,"value":39628},"Tally has grown quickly as a flexible, no-code form builder for startups, operators, and modern software teams.",{"type":17,"tag":29,"props":39630,"children":39631},{},[39632],{"type":23,"value":23339},{"type":17,"tag":80,"props":39634,"children":39635},{},[39636,39641,39646,39651,39656],{"type":17,"tag":84,"props":39637,"children":39638},{},[39639],{"type":23,"value":39640},"lead capture",{"type":17,"tag":84,"props":39642,"children":39643},{},[39644],{"type":23,"value":39645},"onboarding questionnaires",{"type":17,"tag":84,"props":39647,"children":39648},{},[39649],{"type":23,"value":39650},"application forms",{"type":17,"tag":84,"props":39652,"children":39653},{},[39654],{"type":23,"value":39655},"waitlists",{"type":17,"tag":84,"props":39657,"children":39658},{},[39659],{"type":23,"value":39660},"feedback collection",{"type":17,"tag":68,"props":39662,"children":39664},{"id":39663},"other-form-platforms-teams-often-care-about",[39665],{"type":23,"value":39666},"Other form platforms teams often care about",{"type":17,"tag":29,"props":39668,"children":39669},{},[39670],{"type":23,"value":39671},"Even if your current support is focused on Typeform, Google Forms, and Tally, the broader category often includes:",{"type":17,"tag":80,"props":39673,"children":39674},{},[39675,39685,39695,39705,39715],{"type":17,"tag":84,"props":39676,"children":39677},{},[39678],{"type":17,"tag":133,"props":39679,"children":39682},{"href":39680,"rel":39681},"https://api.jotform.com/docs/",[214],[39683],{"type":23,"value":39684},"Jotform",{"type":17,"tag":84,"props":39686,"children":39687},{},[39688],{"type":17,"tag":133,"props":39689,"children":39692},{"href":39690,"rel":39691},"https://developer.surveymonkey.com/api/v3/",[214],[39693],{"type":23,"value":39694},"SurveyMonkey",{"type":17,"tag":84,"props":39696,"children":39697},{},[39698],{"type":17,"tag":133,"props":39699,"children":39702},{"href":39700,"rel":39701},"https://learn.microsoft.com/en-us/graph/api/resources/forms-overview",[214],[39703],{"type":23,"value":39704},"Microsoft Forms",{"type":17,"tag":84,"props":39706,"children":39707},{},[39708],{"type":17,"tag":133,"props":39709,"children":39712},{"href":39710,"rel":39711},"https://api.wufoo.com/",[214],[39713],{"type":23,"value":39714},"Wufoo",{"type":17,"tag":84,"props":39716,"children":39717},{},[39718],{"type":17,"tag":133,"props":39719,"children":39722},{"href":39720,"rel":39721},"https://developers.formstack.com/",[214],[39723],{"type":23,"value":39724},"Formstack",{"type":17,"tag":29,"props":39726,"children":39727},{},[39728],{"type":23,"value":39729},"That matters because once customers ask for one more form platform, the category can widen quickly.",{"type":17,"tag":68,"props":39731,"children":39733},{"id":39732},"challenges-with-forms-api-integrations",[39734],{"type":23,"value":39735},"Challenges with forms API integrations",{"type":17,"tag":29,"props":39737,"children":39738},{},[39739],{"type":23,"value":39740},"Forms may look simple compared with CRM or accounting, but the integration complexity is still real.",{"type":17,"tag":239,"props":39742,"children":39744},{"id":39743},"different-field-and-answer-structures",[39745],{"type":23,"value":39746},"Different field and answer structures",{"type":17,"tag":29,"props":39748,"children":39749},{},[39750],{"type":23,"value":39751},"Every form platform models:",{"type":17,"tag":80,"props":39753,"children":39754},{},[39755,39760,39765,39770,39775],{"type":17,"tag":84,"props":39756,"children":39757},{},[39758],{"type":23,"value":39759},"fields",{"type":17,"tag":84,"props":39761,"children":39762},{},[39763],{"type":23,"value":39764},"question types",{"type":17,"tag":84,"props":39766,"children":39767},{},[39768],{"type":23,"value":39769},"choice options",{"type":17,"tag":84,"props":39771,"children":39772},{},[39773],{"type":23,"value":39774},"respondent details",{"type":17,"tag":84,"props":39776,"children":39777},{},[39778],{"type":23,"value":39779},"answer payloads",{"type":17,"tag":29,"props":39781,"children":39782},{},[39783],{"type":23,"value":23797},{"type":17,"tag":29,"props":39785,"children":39786},{},[39787],{"type":23,"value":39788},"That makes cross-platform support harder than it first appears.",{"type":17,"tag":239,"props":39790,"children":39792},{"id":39791},"different-submission-and-webhook-behavior",[39793],{"type":23,"value":39794},"Different submission and webhook behavior",{"type":17,"tag":29,"props":39796,"children":39797},{},[39798],{"type":23,"value":39799},"Some systems are more webhook-friendly than others. Others require more polling or provider-specific setup.",{"type":17,"tag":29,"props":39801,"children":39802},{},[39803],{"type":23,"value":39804},"If your product relies on immediate submission handling, this matters.",{"type":17,"tag":239,"props":39806,"children":39808},{"id":39807},"different-auth-and-permission-models",[39809],{"type":23,"value":39810},"Different auth and permission models",{"type":17,"tag":29,"props":39812,"children":39813},{},[39814],{"type":23,"value":39815},"Even smaller form platforms vary in:",{"type":17,"tag":80,"props":39817,"children":39818},{},[39819,39828,39833,39838],{"type":17,"tag":84,"props":39820,"children":39821},{},[39822,39826],{"type":17,"tag":133,"props":39823,"children":39824},{"href":779},[39825],{"type":23,"value":782},{"type":23,"value":39827}," behavior",{"type":17,"tag":84,"props":39829,"children":39830},{},[39831],{"type":23,"value":39832},"API keys",{"type":17,"tag":84,"props":39834,"children":39835},{},[39836],{"type":23,"value":39837},"account permissions",{"type":17,"tag":84,"props":39839,"children":39840},{},[39841],{"type":23,"value":39842},"tenant setup",{"type":17,"tag":239,"props":39844,"children":39846},{"id":39845},"response-normalization-gets-messy",[39847],{"type":23,"value":39848},"Response normalization gets messy",{"type":17,"tag":29,"props":39850,"children":39851},{},[39852],{"type":23,"value":39853},"If you want to treat 'submission data' consistently across platforms, you have to normalize:",{"type":17,"tag":80,"props":39855,"children":39856},{},[39857,39862,39867,39872,39876],{"type":17,"tag":84,"props":39858,"children":39859},{},[39860],{"type":23,"value":39861},"respondent names",{"type":17,"tag":84,"props":39863,"children":39864},{},[39865],{"type":23,"value":39866},"respondent emails",{"type":17,"tag":84,"props":39868,"children":39869},{},[39870],{"type":23,"value":39871},"answers",{"type":17,"tag":84,"props":39873,"children":39874},{},[39875],{"type":23,"value":19954},{"type":17,"tag":84,"props":39877,"children":39878},{},[39879],{"type":23,"value":39880},"question metadata",{"type":17,"tag":29,"props":39882,"children":39883},{},[39884],{"type":23,"value":39885},"That logic becomes repetitive if you build platform by platform.",{"type":17,"tag":68,"props":39887,"children":39889},{"id":39888},"the-role-of-unified-forms-apis",[39890],{"type":23,"value":39891},"The role of Unified Forms APIs",{"type":17,"tag":29,"props":39893,"children":39894},{},[39895],{"type":23,"value":39896},"This is where Unified Forms APIs become helpful.",{"type":17,"tag":29,"props":39898,"children":39899},{},[39900,39902,39906],{"type":23,"value":39901},"Instead of building separate integrations for Typeform, Google Forms, Tally, Jotform, SurveyMonkey, and others, a ",{"type":17,"tag":133,"props":39903,"children":39904},{"href":7691},[39905],{"type":23,"value":7806},{"type":23,"value":39907}," provides one consistent interface for form and submission data.",{"type":17,"tag":29,"props":39909,"children":39910},{},[39911],{"type":23,"value":5804},{"type":17,"tag":80,"props":39913,"children":39914},{},[39915,39919,39923,39928,39932],{"type":17,"tag":84,"props":39916,"children":39917},{},[39918],{"type":23,"value":23897},{"type":17,"tag":84,"props":39920,"children":39921},{},[39922],{"type":23,"value":37007},{"type":17,"tag":84,"props":39924,"children":39925},{},[39926],{"type":23,"value":39927},"one schema for forms and submissions",{"type":17,"tag":84,"props":39929,"children":39930},{},[39931],{"type":23,"value":23912},{"type":17,"tag":84,"props":39933,"children":39934},{},[39935],{"type":23,"value":39936},"easier scaling when customers request more platforms",{"type":17,"tag":29,"props":39938,"children":39939},{},[39940],{"type":23,"value":39941},"For teams building intake-heavy, survey-heavy, or lead capture products, that is a much cleaner model.",{"type":17,"tag":68,"props":39943,"children":39945},{"id":39944},"build-once-with-the-unified-forms-api",[39946],{"type":23,"value":39947},"Build once with the Unified Forms API",{"type":17,"tag":29,"props":39949,"children":39950},{},[39951,39952,39959],{"type":23,"value":6712},{"type":17,"tag":133,"props":39953,"children":39956},{"href":39954,"rel":39955},"https://unified.to/forms",[214],[39957],{"type":23,"value":39958},"Unified Forms API",{"type":23,"value":39960}," provides access to supported form platforms through one standardized interface.",{"type":17,"tag":29,"props":39962,"children":39963},{},[39964],{"type":23,"value":39965},"Current supported integrations include:",{"type":17,"tag":80,"props":39967,"children":39968},{},[39969,39974,39978],{"type":17,"tag":84,"props":39970,"children":39971},{},[39972],{"type":23,"value":39973},"Google Forms",{"type":17,"tag":84,"props":39975,"children":39976},{},[39977],{"type":23,"value":39623},{"type":17,"tag":84,"props":39979,"children":39980},{},[39981],{"type":23,"value":39982},"Typeform",{"type":17,"tag":239,"props":39984,"children":39986},{"id":39985},"unified-forms-objects",[39987],{"type":23,"value":39988},"Unified Forms objects",{"type":17,"tag":29,"props":39990,"children":39991},{},[39992],{"type":23,"value":39993},"Unified standardizes the two most important forms objects:",{"type":17,"tag":29,"props":39995,"children":39996},{},[39997],{"type":17,"tag":48,"props":39998,"children":39999},{},[40000],{"type":23,"value":40001},"Form",{"type":17,"tag":80,"props":40003,"children":40004},{},[40005,40009,40013,40017,40022,40027,40032],{"type":17,"tag":84,"props":40006,"children":40007},{},[40008],{"type":23,"value":18781},{"type":17,"tag":84,"props":40010,"children":40011},{},[40012],{"type":23,"value":24679},{"type":17,"tag":84,"props":40014,"children":40015},{},[40016],{"type":23,"value":39759},{"type":17,"tag":84,"props":40018,"children":40019},{},[40020],{"type":23,"value":40021},"active status",{"type":17,"tag":84,"props":40023,"children":40024},{},[40025],{"type":23,"value":40026},"published URL",{"type":17,"tag":84,"props":40028,"children":40029},{},[40030],{"type":23,"value":40031},"response count",{"type":17,"tag":84,"props":40033,"children":40034},{},[40035],{"type":23,"value":40036},"confirmation settings",{"type":17,"tag":29,"props":40038,"children":40039},{},[40040],{"type":17,"tag":48,"props":40041,"children":40042},{},[40043],{"type":23,"value":40044},"Submission",{"type":17,"tag":80,"props":40046,"children":40047},{},[40048,40053,40058,40063,40067],{"type":17,"tag":84,"props":40049,"children":40050},{},[40051],{"type":23,"value":40052},"form ID",{"type":17,"tag":84,"props":40054,"children":40055},{},[40056],{"type":23,"value":40057},"respondent email",{"type":17,"tag":84,"props":40059,"children":40060},{},[40061],{"type":23,"value":40062},"respondent name",{"type":17,"tag":84,"props":40064,"children":40065},{},[40066],{"type":23,"value":39871},{"type":17,"tag":84,"props":40068,"children":40069},{},[40070],{"type":23,"value":19954},{"type":17,"tag":29,"props":40072,"children":40073},{},[40074],{"type":23,"value":40075},"This makes it possible to build one product flow across multiple form systems instead of maintaining separate code paths for each one.",{"type":17,"tag":239,"props":40077,"children":40078},{"id":24049},[40079],{"type":23,"value":24052},{"type":17,"tag":29,"props":40081,"children":40082},{},[40083],{"type":23,"value":40084},"A lot of integration approaches still rely on:",{"type":17,"tag":80,"props":40086,"children":40087},{},[40088,40092,40096],{"type":17,"tag":84,"props":40089,"children":40090},{},[40091],{"type":23,"value":32803},{"type":17,"tag":84,"props":40093,"children":40094},{},[40095],{"type":23,"value":32808},{"type":17,"tag":84,"props":40097,"children":40098},{},[40099],{"type":23,"value":32813},{"type":17,"tag":29,"props":40101,"children":40102},{},[40103,40104,40108],{"type":23,"value":24080},{"type":17,"tag":48,"props":40105,"children":40106},{},[40107],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":40110,"children":40111},{},[40112],{"type":23,"value":5804},{"type":17,"tag":80,"props":40114,"children":40115},{},[40116,40120,40125,40129],{"type":17,"tag":84,"props":40117,"children":40118},{},[40119],{"type":23,"value":24097},{"type":17,"tag":84,"props":40121,"children":40122},{},[40123],{"type":23,"value":40124},"no stale submission cache",{"type":17,"tag":84,"props":40126,"children":40127},{},[40128],{"type":23,"value":30123},{"type":17,"tag":84,"props":40130,"children":40131},{},[40132],{"type":23,"value":40133},"immediate access to up-to-date responses",{"type":17,"tag":29,"props":40135,"children":40136},{},[40137,40138,40142],{"type":23,"value":24117},{"type":17,"tag":48,"props":40139,"children":40140},{},[40141],{"type":23,"value":24122},{"type":23,"value":40143},", so end-customer form submissions are not stored at rest by the integration layer.",{"type":17,"tag":29,"props":40145,"children":40146},{},[40147],{"type":23,"value":40148},"That matters when form responses contain sensitive data, customer information, or intake details tied to regulated workflows.",{"type":17,"tag":239,"props":40150,"children":40151},{"id":24132},[40152],{"type":23,"value":24135},{"type":17,"tag":29,"props":40154,"children":40155},{},[40156],{"type":23,"value":24140},{"type":17,"tag":80,"props":40158,"children":40159},{},[40160,40165,40170,40175,40180,40185,40190],{"type":17,"tag":84,"props":40161,"children":40162},{},[40163],{"type":23,"value":40164},"lead capture integrations",{"type":17,"tag":84,"props":40166,"children":40167},{},[40168],{"type":23,"value":40169},"survey response dashboards",{"type":17,"tag":84,"props":40171,"children":40172},{},[40173],{"type":23,"value":40174},"workflow triggers based on new submissions",{"type":17,"tag":84,"props":40176,"children":40177},{},[40178],{"type":23,"value":40179},"form-to-CRM sync",{"type":17,"tag":84,"props":40181,"children":40182},{},[40183],{"type":23,"value":40184},"response analytics pipelines",{"type":17,"tag":84,"props":40186,"children":40187},{},[40188],{"type":23,"value":40189},"AI-powered submission analysis",{"type":17,"tag":84,"props":40191,"children":40192},{},[40193],{"type":23,"value":40194},"multi-platform data collection tools",{"type":17,"tag":29,"props":40196,"children":40197},{},[40198],{"type":23,"value":40199},"without rebuilding the category one provider at a time.",{"type":17,"tag":68,"props":40201,"children":40203},{"id":40202},"why-not-just-build-each-forms-integration-directly",[40204],{"type":23,"value":40205},"Why not just build each forms integration directly?",{"type":17,"tag":29,"props":40207,"children":40208},{},[40209],{"type":23,"value":40210},"You can, but even this smaller category creates recurring engineering overhead.",{"type":17,"tag":29,"props":40212,"children":40213},{},[40214],{"type":23,"value":40215},"For each provider, you take on:",{"type":17,"tag":80,"props":40217,"children":40218},{},[40219,40224,40229,40234,40239,40244],{"type":17,"tag":84,"props":40220,"children":40221},{},[40222],{"type":23,"value":40223},"auth and token handling",{"type":17,"tag":84,"props":40225,"children":40226},{},[40227],{"type":23,"value":40228},"field normalization",{"type":17,"tag":84,"props":40230,"children":40231},{},[40232],{"type":23,"value":40233},"submission parsing",{"type":17,"tag":84,"props":40235,"children":40236},{},[40237],{"type":23,"value":40238},"provider-specific quirks",{"type":17,"tag":84,"props":40240,"children":40241},{},[40242],{"type":23,"value":40243},"webhook handling",{"type":17,"tag":84,"props":40245,"children":40246},{},[40247],{"type":23,"value":40248},"maintenance whenever the API changes",{"type":17,"tag":29,"props":40250,"children":40251},{},[40252],{"type":23,"value":40253},"That may be acceptable for one platform. It becomes much less attractive once customers ask for multiple.",{"type":17,"tag":29,"props":40255,"children":40256},{},[40257],{"type":23,"value":40258},"A Unified Forms API reduces that repeated work and gives you a cleaner product architecture from the start.",{"type":17,"tag":68,"props":40260,"children":40261},{"id":1552},[40262],{"type":23,"value":1555},{"type":17,"tag":29,"props":40264,"children":40265},{},[40266],{"type":23,"value":40267},"Forms APIs are deceptively simple. Once you need to support multiple form builders, centralize submission data, and trigger workflows from responses, the integration work adds up quickly.",{"type":17,"tag":29,"props":40269,"children":40270},{},[40271],{"type":23,"value":40272},"That is why more SaaS teams are moving toward Unified Forms APIs.",{"type":17,"tag":29,"props":40274,"children":40275},{},[40276,40278,40283],{"type":23,"value":40277},"If you need real-time access to form and submission data across Typeform, Google Forms, Tally, and more over time, ",{"type":17,"tag":133,"props":40279,"children":40281},{"href":212,"rel":40280},[214],[40282],{"type":23,"value":217},{"type":23,"value":40284}," gives you a faster and more scalable way to support those workflows.",{"type":17,"tag":29,"props":40286,"children":40287},{},[40288,40289],{"type":23,"value":1609},{"type":17,"tag":133,"props":40290,"children":40292},{"href":1612,"rel":40291},[214],[40293],{"type":23,"value":1616},{"type":17,"tag":29,"props":40295,"children":40296},{},[40297,40298],{"type":23,"value":1609},{"type":17,"tag":133,"props":40299,"children":40301},{"href":40300},"/32c6207b83848001bba7c288a20200c9",[40302],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":40304},[40305,40306,40307,40312,40313,40319,40320,40325,40326],{"id":39294,"depth":1629,"text":39297},{"id":39381,"depth":1629,"text":39384},{"id":39493,"depth":1629,"text":39496,"children":40308},[40309,40310,40311],{"id":39504,"depth":1635,"text":39507},{"id":39557,"depth":1635,"text":39560},{"id":39610,"depth":1635,"text":39613},{"id":39663,"depth":1629,"text":39666},{"id":39732,"depth":1629,"text":39735,"children":40314},[40315,40316,40317,40318],{"id":39743,"depth":1635,"text":39746},{"id":39791,"depth":1635,"text":39794},{"id":39807,"depth":1635,"text":39810},{"id":39845,"depth":1635,"text":39848},{"id":39888,"depth":1629,"text":39891},{"id":39944,"depth":1629,"text":39947,"children":40321},[40322,40323,40324],{"id":39985,"depth":1635,"text":39988},{"id":24049,"depth":1635,"text":24052},{"id":24132,"depth":1635,"text":24135},{"id":40202,"depth":1629,"text":40205},{"id":1552,"depth":1629,"text":1555},"content:blog:3_forms_apis_to_integrate_with_typeform_google_forms_tally_and_unified_forms_apis.md","blog/3_forms_apis_to_integrate_with_typeform_google_forms_tally_and_unified_forms_apis.md","blog/3_forms_apis_to_integrate_with_typeform_google_forms_tally_and_unified_forms_apis",{"_path":40331,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":40332,"description":40333,"img":40334,"date":40335,"tag":12,"body":40336,"_type":1677,"_id":42023,"_source":1679,"_file":42024,"_stem":42025,"_extension":1682},"/blog/13_advertising_apis_to_integrate_with_in_2026_google_ads_meta_ads_tiktok_ads_and_unified_advertising_apis","13 Advertising APIs to Integrate With in 2026: Google Ads, Meta Ads, TikTok Ads, and Unified Advertising APIs","Advertising is one of the hardest API categories to support well inside a SaaS product.","https://s3.us-east-2.amazonaws.com/unified-article-images/13_advertising_apis_to_integrate_with_in_2026_google_ads_meta_ads_tiktok_ads_and_unified_advertising_apis-icon.png","2026-03-23T22:13:00.000Z",{"type":14,"children":40337,"toc":41988},[40338,40343,40346,40353,40357,40399,40404,40409,40427,40433,40445,40450,40493,40497,40530,40536,40541,40546,40577,40581,40589,40594,40602,40607,40615,40620,40628,40633,40641,40646,40652,40657,40663,40672,40677,40681,40704,40710,40719,40724,40728,40750,40756,40765,40770,40774,40797,40803,40812,40817,40821,40844,40850,40859,40864,40868,40891,40897,40907,40912,40916,40939,40945,40955,40960,40964,40986,40992,41002,41007,41012,41033,41039,41049,41054,41058,41079,41085,41095,41100,41104,41126,41132,41142,41147,41151,41173,41179,41189,41194,41198,41221,41227,41237,41242,41246,41269,41275,41297,41302,41308,41313,41319,41324,41329,41362,41367,41373,41377,41403,41409,41414,41419,41457,41462,41468,41473,41496,41502,41507,41539,41544,41550,41555,41566,41570,41597,41602,41608,41625,41629,41685,41691,41696,41744,41749,41753,41758,41777,41786,41790,41815,41825,41830,41834,41838,41876,41881,41887,41892,41897,41929,41934,41939,41943,41948,41953,41958,41970,41979],{"type":17,"tag":18,"props":40339,"children":40341},{"id":40340},"_13-advertising-apis-to-integrate-with-in-2026-google-ads-meta-ads-tiktok-ads-and-unified-advertising-apis",[40342],{"type":23,"value":40332},{"type":17,"tag":25,"props":40344,"children":40345},{},[],{"type":17,"tag":29,"props":40347,"children":40348},{},[40349],{"type":17,"tag":33,"props":40350,"children":40351},{},[40352],{"type":23,"value":33053},{"type":17,"tag":29,"props":40354,"children":40355},{},[40356],{"type":23,"value":40333},{"type":17,"tag":29,"props":40358,"children":40359},{},[40360,40362,40368,40369,40375,40376,40382,40383,40390,40391,40397],{"type":23,"value":40361},"Each major platform—",{"type":17,"tag":133,"props":40363,"children":40366},{"href":40364,"rel":40365},"https://developers.google.com/google-ads/api/docs/start",[214],[40367],{"type":23,"value":11337},{"type":23,"value":11826},{"type":17,"tag":133,"props":40370,"children":40373},{"href":40371,"rel":40372},"https://developers.facebook.com/docs/marketing-apis/",[214],[40374],{"type":23,"value":11332},{"type":23,"value":11826},{"type":17,"tag":133,"props":40377,"children":40380},{"href":40378,"rel":40379},"https://business-api.tiktok.com/portal/docs",[214],[40381],{"type":23,"value":11362},{"type":23,"value":11826},{"type":17,"tag":133,"props":40384,"children":40387},{"href":40385,"rel":40386},"https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads/ads-overview",[214],[40388],{"type":23,"value":40389},"LinkedIn Ads",{"type":23,"value":11826},{"type":17,"tag":133,"props":40392,"children":40395},{"href":40393,"rel":40394},"https://advertising.amazon.com/API/docs/en-us/get-started/overview",[214],[40396],{"type":23,"value":11347},{"type":23,"value":40398},", and others—has its own authentication flows, object structures, reporting models, and rate-limit behavior.",{"type":17,"tag":29,"props":40400,"children":40401},{},[40402],{"type":23,"value":40403},"Even simple tasks like listing campaigns, pulling performance metrics, or updating budgets require platform-specific logic. Writing or editing ads adds another layer of complexity.",{"type":17,"tag":29,"props":40405,"children":40406},{},[40407],{"type":23,"value":40408},"That is why more SaaS teams are looking for a better way to support advertising integrations at scale.",{"type":17,"tag":29,"props":40410,"children":40411},{},[40412,40413,40418,40420,40425],{"type":23,"value":23079},{"type":17,"tag":48,"props":40414,"children":40415},{},[40416],{"type":23,"value":40417},"top advertising APIs to integrate with in 2026",{"type":23,"value":40419},", the main challenges in this category, and why more products are moving toward ",{"type":17,"tag":48,"props":40421,"children":40422},{},[40423],{"type":23,"value":40424},"Unified Advertising APIs",{"type":23,"value":40426}," instead of building and maintaining every ad platform separately.",{"type":17,"tag":68,"props":40428,"children":40430},{"id":40429},"what-is-an-advertising-api",[40431],{"type":23,"value":40432},"What is an advertising API?",{"type":17,"tag":29,"props":40434,"children":40435},{},[40436,40438,40443],{"type":23,"value":40437},"An ",{"type":17,"tag":133,"props":40439,"children":40440},{"href":11091},[40441],{"type":23,"value":40442},"advertising API",{"type":23,"value":40444}," gives developers programmatic access to ad platforms.",{"type":17,"tag":29,"props":40446,"children":40447},{},[40448],{"type":23,"value":40449},"That can include:",{"type":17,"tag":80,"props":40451,"children":40452},{},[40453,40458,40463,40468,40473,40478,40483,40488],{"type":17,"tag":84,"props":40454,"children":40455},{},[40456],{"type":23,"value":40457},"organizations or ad accounts",{"type":17,"tag":84,"props":40459,"children":40460},{},[40461],{"type":23,"value":40462},"campaigns",{"type":17,"tag":84,"props":40464,"children":40465},{},[40466],{"type":23,"value":40467},"ad groups",{"type":17,"tag":84,"props":40469,"children":40470},{},[40471],{"type":23,"value":40472},"ads",{"type":17,"tag":84,"props":40474,"children":40475},{},[40476],{"type":23,"value":40477},"creatives",{"type":17,"tag":84,"props":40479,"children":40480},{},[40481],{"type":23,"value":40482},"insertion orders",{"type":17,"tag":84,"props":40484,"children":40485},{},[40486],{"type":23,"value":40487},"targeting",{"type":17,"tag":84,"props":40489,"children":40490},{},[40491],{"type":23,"value":40492},"reports and performance metrics",{"type":17,"tag":29,"props":40494,"children":40495},{},[40496],{"type":23,"value":23132},{"type":17,"tag":80,"props":40498,"children":40499},{},[40500,40505,40510,40515,40520,40525],{"type":17,"tag":84,"props":40501,"children":40502},{},[40503],{"type":23,"value":40504},"campaign analytics dashboards",{"type":17,"tag":84,"props":40506,"children":40507},{},[40508],{"type":23,"value":40509},"agency reporting tools",{"type":17,"tag":84,"props":40511,"children":40512},{},[40513],{"type":23,"value":40514},"budget monitoring products",{"type":17,"tag":84,"props":40516,"children":40517},{},[40518],{"type":23,"value":40519},"creative management workflows",{"type":17,"tag":84,"props":40521,"children":40522},{},[40523],{"type":23,"value":40524},"cross-platform attribution tools",{"type":17,"tag":84,"props":40526,"children":40527},{},[40528],{"type":23,"value":40529},"AI-powered campaign analysis and recommendations",{"type":17,"tag":68,"props":40531,"children":40533},{"id":40532},"why-saas-products-integrate-advertising-apis",[40534],{"type":23,"value":40535},"Why SaaS products integrate advertising APIs",{"type":17,"tag":29,"props":40537,"children":40538},{},[40539],{"type":23,"value":40540},"Advertising data is rarely useful in isolation.",{"type":17,"tag":29,"props":40542,"children":40543},{},[40544],{"type":23,"value":40545},"SaaS teams often need to connect ad data with:",{"type":17,"tag":80,"props":40547,"children":40548},{},[40549,40553,40558,40563,40567,40572],{"type":17,"tag":84,"props":40550,"children":40551},{},[40552],{"type":23,"value":30480},{"type":17,"tag":84,"props":40554,"children":40555},{},[40556],{"type":23,"value":40557},"ecommerce platforms",{"type":17,"tag":84,"props":40559,"children":40560},{},[40561],{"type":23,"value":40562},"attribution models",{"type":17,"tag":84,"props":40564,"children":40565},{},[40566],{"type":23,"value":29087},{"type":17,"tag":84,"props":40568,"children":40569},{},[40570],{"type":23,"value":40571},"finance and reporting systems",{"type":17,"tag":84,"props":40573,"children":40574},{},[40575],{"type":23,"value":40576},"AI copilots and workflow automation",{"type":17,"tag":29,"props":40578,"children":40579},{},[40580],{"type":23,"value":12661},{"type":17,"tag":29,"props":40582,"children":40583},{},[40584],{"type":17,"tag":48,"props":40585,"children":40586},{},[40587],{"type":23,"value":40588},"Cross-platform ad reporting",{"type":17,"tag":29,"props":40590,"children":40591},{},[40592],{"type":23,"value":40593},"Pull campaign and ad performance from multiple ad platforms into one dashboard.",{"type":17,"tag":29,"props":40595,"children":40596},{},[40597],{"type":17,"tag":48,"props":40598,"children":40599},{},[40600],{"type":23,"value":40601},"Budget and pacing monitoring",{"type":17,"tag":29,"props":40603,"children":40604},{},[40605],{"type":23,"value":40606},"Track spend and alert when campaigns approach thresholds.",{"type":17,"tag":29,"props":40608,"children":40609},{},[40610],{"type":17,"tag":48,"props":40611,"children":40612},{},[40613],{"type":23,"value":40614},"Campaign management",{"type":17,"tag":29,"props":40616,"children":40617},{},[40618],{"type":23,"value":40619},"Create, pause, resume, or update campaigns across platforms.",{"type":17,"tag":29,"props":40621,"children":40622},{},[40623],{"type":17,"tag":48,"props":40624,"children":40625},{},[40626],{"type":23,"value":40627},"Creative and targeting operations",{"type":17,"tag":29,"props":40629,"children":40630},{},[40631],{"type":23,"value":40632},"Manage ad copy, creatives, placements, and targeting settings inside your product.",{"type":17,"tag":29,"props":40634,"children":40635},{},[40636],{"type":17,"tag":48,"props":40637,"children":40638},{},[40639],{"type":23,"value":40640},"AI campaign analysis",{"type":17,"tag":29,"props":40642,"children":40643},{},[40644],{"type":23,"value":40645},"Use live campaign data to generate recommendations, anomaly detection, or predictive insights.",{"type":17,"tag":68,"props":40647,"children":40649},{"id":40648},"_13-advertising-apis-to-integrate-with-in-2026",[40650],{"type":23,"value":40651},"13 Advertising APIs to Integrate With in 2026",{"type":17,"tag":29,"props":40653,"children":40654},{},[40655],{"type":23,"value":40656},"Below are the major advertising APIs SaaS teams commonly need to support.",{"type":17,"tag":239,"props":40658,"children":40660},{"id":40659},"_1-google-ads-api",[40661],{"type":23,"value":40662},"1. Google Ads API",{"type":17,"tag":29,"props":40664,"children":40665},{},[40666],{"type":17,"tag":133,"props":40667,"children":40669},{"href":40364,"rel":40668},[214],[40670],{"type":23,"value":40671},"Google Ads API documentation",{"type":17,"tag":29,"props":40673,"children":40674},{},[40675],{"type":23,"value":40676},"Google Ads is one of the most important advertising APIs to support for search, shopping, display, and performance marketing workflows.",{"type":17,"tag":29,"props":40678,"children":40679},{},[40680],{"type":23,"value":15093},{"type":17,"tag":80,"props":40682,"children":40683},{},[40684,40689,40694,40699],{"type":17,"tag":84,"props":40685,"children":40686},{},[40687],{"type":23,"value":40688},"campaign and ad group reporting",{"type":17,"tag":84,"props":40690,"children":40691},{},[40692],{"type":23,"value":40693},"budget monitoring",{"type":17,"tag":84,"props":40695,"children":40696},{},[40697],{"type":23,"value":40698},"bid and targeting updates",{"type":17,"tag":84,"props":40700,"children":40701},{},[40702],{"type":23,"value":40703},"search ad and performance campaign analytics",{"type":17,"tag":239,"props":40705,"children":40707},{"id":40706},"_2-meta-ads-api",[40708],{"type":23,"value":40709},"2. Meta Ads API",{"type":17,"tag":29,"props":40711,"children":40712},{},[40713],{"type":17,"tag":133,"props":40714,"children":40716},{"href":40371,"rel":40715},[214],[40717],{"type":23,"value":40718},"Meta Marketing API documentation",{"type":17,"tag":29,"props":40720,"children":40721},{},[40722],{"type":23,"value":40723},"Meta Ads covers Facebook and Instagram advertising, making it essential for most B2C and many B2B marketing products.",{"type":17,"tag":29,"props":40725,"children":40726},{},[40727],{"type":23,"value":15093},{"type":17,"tag":80,"props":40729,"children":40730},{},[40731,40736,40741,40745],{"type":17,"tag":84,"props":40732,"children":40733},{},[40734],{"type":23,"value":40735},"campaign performance tracking",{"type":17,"tag":84,"props":40737,"children":40738},{},[40739],{"type":23,"value":40740},"audience and creative insights",{"type":17,"tag":84,"props":40742,"children":40743},{},[40744],{"type":23,"value":37930},{"type":17,"tag":84,"props":40746,"children":40747},{},[40748],{"type":23,"value":40749},"budget and status management",{"type":17,"tag":239,"props":40751,"children":40753},{"id":40752},"_3-tiktok-ads-api",[40754],{"type":23,"value":40755},"3. TikTok Ads API",{"type":17,"tag":29,"props":40757,"children":40758},{},[40759],{"type":17,"tag":133,"props":40760,"children":40762},{"href":40378,"rel":40761},[214],[40763],{"type":23,"value":40764},"TikTok Ads API documentation",{"type":17,"tag":29,"props":40766,"children":40767},{},[40768],{"type":23,"value":40769},"TikTok has become a core platform for performance and creative-heavy advertising workflows.",{"type":17,"tag":29,"props":40771,"children":40772},{},[40773],{"type":23,"value":23339},{"type":17,"tag":80,"props":40775,"children":40776},{},[40777,40782,40787,40792],{"type":17,"tag":84,"props":40778,"children":40779},{},[40780],{"type":23,"value":40781},"campaign and ad reporting",{"type":17,"tag":84,"props":40783,"children":40784},{},[40785],{"type":23,"value":40786},"creative analysis",{"type":17,"tag":84,"props":40788,"children":40789},{},[40790],{"type":23,"value":40791},"audience targeting",{"type":17,"tag":84,"props":40793,"children":40794},{},[40795],{"type":23,"value":40796},"performance monitoring across paid social",{"type":17,"tag":239,"props":40798,"children":40800},{"id":40799},"_4-linkedin-ads-api",[40801],{"type":23,"value":40802},"4. LinkedIn Ads API",{"type":17,"tag":29,"props":40804,"children":40805},{},[40806],{"type":17,"tag":133,"props":40807,"children":40809},{"href":40385,"rel":40808},[214],[40810],{"type":23,"value":40811},"LinkedIn Marketing API documentation",{"type":17,"tag":29,"props":40813,"children":40814},{},[40815],{"type":23,"value":40816},"LinkedIn is especially important for B2B SaaS advertising and lead generation products.",{"type":17,"tag":29,"props":40818,"children":40819},{},[40820],{"type":23,"value":15093},{"type":17,"tag":80,"props":40822,"children":40823},{},[40824,40829,40834,40839],{"type":17,"tag":84,"props":40825,"children":40826},{},[40827],{"type":23,"value":40828},"sponsored content reporting",{"type":17,"tag":84,"props":40830,"children":40831},{},[40832],{"type":23,"value":40833},"B2B campaign analytics",{"type":17,"tag":84,"props":40835,"children":40836},{},[40837],{"type":23,"value":40838},"lead generation form workflows",{"type":17,"tag":84,"props":40840,"children":40841},{},[40842],{"type":23,"value":40843},"budget and audience monitoring",{"type":17,"tag":239,"props":40845,"children":40847},{"id":40846},"_5-amazon-advertising-api",[40848],{"type":23,"value":40849},"5. Amazon Advertising API",{"type":17,"tag":29,"props":40851,"children":40852},{},[40853],{"type":17,"tag":133,"props":40854,"children":40856},{"href":40393,"rel":40855},[214],[40857],{"type":23,"value":40858},"Amazon Advertising API documentation",{"type":17,"tag":29,"props":40860,"children":40861},{},[40862],{"type":23,"value":40863},"Amazon Advertising is a major API for retail media, marketplace performance, and commerce advertising workflows.",{"type":17,"tag":29,"props":40865,"children":40866},{},[40867],{"type":23,"value":23339},{"type":17,"tag":80,"props":40869,"children":40870},{},[40871,40876,40881,40886],{"type":17,"tag":84,"props":40872,"children":40873},{},[40874],{"type":23,"value":40875},"sponsored products and sponsored brands performance",{"type":17,"tag":84,"props":40877,"children":40878},{},[40879],{"type":23,"value":40880},"marketplace ad reporting",{"type":17,"tag":84,"props":40882,"children":40883},{},[40884],{"type":23,"value":40885},"ROAS dashboards",{"type":17,"tag":84,"props":40887,"children":40888},{},[40889],{"type":23,"value":40890},"retail media optimization",{"type":17,"tag":239,"props":40892,"children":40894},{"id":40893},"_6-microsoft-advertising-api",[40895],{"type":23,"value":40896},"6. Microsoft Advertising API",{"type":17,"tag":29,"props":40898,"children":40899},{},[40900],{"type":17,"tag":133,"props":40901,"children":40904},{"href":40902,"rel":40903},"https://learn.microsoft.com/en-us/advertising/",[214],[40905],{"type":23,"value":40906},"Microsoft Advertising API documentation",{"type":17,"tag":29,"props":40908,"children":40909},{},[40910],{"type":23,"value":40911},"Microsoft Advertising remains important for search and audience advertising beyond Google.",{"type":17,"tag":29,"props":40913,"children":40914},{},[40915],{"type":23,"value":15093},{"type":17,"tag":80,"props":40917,"children":40918},{},[40919,40924,40929,40934],{"type":17,"tag":84,"props":40920,"children":40921},{},[40922],{"type":23,"value":40923},"search ad management",{"type":17,"tag":84,"props":40925,"children":40926},{},[40927],{"type":23,"value":40928},"campaign reporting",{"type":17,"tag":84,"props":40930,"children":40931},{},[40932],{"type":23,"value":40933},"budget updates",{"type":17,"tag":84,"props":40935,"children":40936},{},[40937],{"type":23,"value":40938},"cross-search-channel analytics",{"type":17,"tag":239,"props":40940,"children":40942},{"id":40941},"_7-pinterest-ads-api",[40943],{"type":23,"value":40944},"7. Pinterest Ads API",{"type":17,"tag":29,"props":40946,"children":40947},{},[40948],{"type":17,"tag":133,"props":40949,"children":40952},{"href":40950,"rel":40951},"https://developers.pinterest.com/",[214],[40953],{"type":23,"value":40954},"Pinterest API documentation",{"type":17,"tag":29,"props":40956,"children":40957},{},[40958],{"type":23,"value":40959},"Pinterest Ads matters for ecommerce, visual discovery, and consumer brand products.",{"type":17,"tag":29,"props":40961,"children":40962},{},[40963],{"type":23,"value":15093},{"type":17,"tag":80,"props":40965,"children":40966},{},[40967,40972,40976,40981],{"type":17,"tag":84,"props":40968,"children":40969},{},[40970],{"type":23,"value":40971},"creative reporting",{"type":17,"tag":84,"props":40973,"children":40974},{},[40975],{"type":23,"value":40791},{"type":17,"tag":84,"props":40977,"children":40978},{},[40979],{"type":23,"value":40980},"campaign analytics",{"type":17,"tag":84,"props":40982,"children":40983},{},[40984],{"type":23,"value":40985},"social commerce dashboards",{"type":17,"tag":239,"props":40987,"children":40989},{"id":40988},"_8-reddit-ads-api",[40990],{"type":23,"value":40991},"8. Reddit Ads API",{"type":17,"tag":29,"props":40993,"children":40994},{},[40995],{"type":17,"tag":133,"props":40996,"children":40999},{"href":40997,"rel":40998},"https://ads-api.reddit.com/docs/",[214],[41000],{"type":23,"value":41001},"Reddit Ads API documentation",{"type":17,"tag":29,"props":41003,"children":41004},{},[41005],{"type":23,"value":41006},"Reddit Ads is increasingly relevant for community-based targeting and niche audience acquisition.",{"type":17,"tag":29,"props":41008,"children":41009},{},[41010],{"type":23,"value":41011},"Typical use cases:",{"type":17,"tag":80,"props":41013,"children":41014},{},[41015,41019,41023,41028],{"type":17,"tag":84,"props":41016,"children":41017},{},[41018],{"type":23,"value":40688},{"type":17,"tag":84,"props":41020,"children":41021},{},[41022],{"type":23,"value":30724},{"type":17,"tag":84,"props":41024,"children":41025},{},[41026],{"type":23,"value":41027},"social ad analytics",{"type":17,"tag":84,"props":41029,"children":41030},{},[41031],{"type":23,"value":41032},"multi-platform media dashboards",{"type":17,"tag":239,"props":41034,"children":41036},{"id":41035},"_9-snapchat-marketing-api",[41037],{"type":23,"value":41038},"9. Snapchat Marketing API",{"type":17,"tag":29,"props":41040,"children":41041},{},[41042],{"type":17,"tag":133,"props":41043,"children":41046},{"href":41044,"rel":41045},"https://developers.snap.com/api/marketing-api/Overview",[214],[41047],{"type":23,"value":41048},"Snapchat Marketing API documentation",{"type":17,"tag":29,"props":41050,"children":41051},{},[41052],{"type":23,"value":41053},"Snapchat remains useful for consumer-focused brands and mobile-heavy ad strategies.",{"type":17,"tag":29,"props":41055,"children":41056},{},[41057],{"type":23,"value":23339},{"type":17,"tag":80,"props":41059,"children":41060},{},[41061,41065,41070,41074],{"type":17,"tag":84,"props":41062,"children":41063},{},[41064],{"type":23,"value":40980},{"type":17,"tag":84,"props":41066,"children":41067},{},[41068],{"type":23,"value":41069},"creative performance",{"type":17,"tag":84,"props":41071,"children":41072},{},[41073],{"type":23,"value":40791},{"type":17,"tag":84,"props":41075,"children":41076},{},[41077],{"type":23,"value":41078},"paid social reporting",{"type":17,"tag":239,"props":41080,"children":41082},{"id":41081},"_10-x-ads-api-twitter-ads",[41083],{"type":23,"value":41084},"10. X Ads API (Twitter Ads)",{"type":17,"tag":29,"props":41086,"children":41087},{},[41088],{"type":17,"tag":133,"props":41089,"children":41092},{"href":41090,"rel":41091},"https://developer.x.com/en/docs/x-ads-api",[214],[41093],{"type":23,"value":41094},"X Ads API documentation",{"type":17,"tag":29,"props":41096,"children":41097},{},[41098],{"type":23,"value":41099},"X Ads is still relevant for some brand, media, and acquisition workflows.",{"type":17,"tag":29,"props":41101,"children":41102},{},[41103],{"type":23,"value":15093},{"type":17,"tag":80,"props":41105,"children":41106},{},[41107,41111,41116,41121],{"type":17,"tag":84,"props":41108,"children":41109},{},[41110],{"type":23,"value":40735},{"type":17,"tag":84,"props":41112,"children":41113},{},[41114],{"type":23,"value":41115},"spend reporting",{"type":17,"tag":84,"props":41117,"children":41118},{},[41119],{"type":23,"value":41120},"audience and creative monitoring",{"type":17,"tag":84,"props":41122,"children":41123},{},[41124],{"type":23,"value":41125},"multi-channel social analytics",{"type":17,"tag":239,"props":41127,"children":41129},{"id":41128},"_11-google-campaign-manager-360-api",[41130],{"type":23,"value":41131},"11. Google Campaign Manager 360 API",{"type":17,"tag":29,"props":41133,"children":41134},{},[41135],{"type":17,"tag":133,"props":41136,"children":41139},{"href":41137,"rel":41138},"https://developers.google.com/doubleclick-advertisers",[214],[41140],{"type":23,"value":41141},"Campaign Manager 360 API documentation",{"type":17,"tag":29,"props":41143,"children":41144},{},[41145],{"type":23,"value":41146},"Campaign Manager 360 matters for more advanced media buying, ad serving, and agency workflows.",{"type":17,"tag":29,"props":41148,"children":41149},{},[41150],{"type":23,"value":23339},{"type":17,"tag":80,"props":41152,"children":41153},{},[41154,41159,41163,41168],{"type":17,"tag":84,"props":41155,"children":41156},{},[41157],{"type":23,"value":41158},"campaign trafficking",{"type":17,"tag":84,"props":41160,"children":41161},{},[41162],{"type":23,"value":966},{"type":17,"tag":84,"props":41164,"children":41165},{},[41166],{"type":23,"value":41167},"ad serving operations",{"type":17,"tag":84,"props":41169,"children":41170},{},[41171],{"type":23,"value":41172},"enterprise ad operations tooling",{"type":17,"tag":239,"props":41174,"children":41176},{"id":41175},"_12-google-display-video-360-api",[41177],{"type":23,"value":41178},"12. Google Display & Video 360 API",{"type":17,"tag":29,"props":41180,"children":41181},{},[41182],{"type":17,"tag":133,"props":41183,"children":41186},{"href":41184,"rel":41185},"https://developers.google.com/display-video/api/guides/getting-started/overview",[214],[41187],{"type":23,"value":41188},"Display & Video 360 API documentation",{"type":17,"tag":29,"props":41190,"children":41191},{},[41192],{"type":23,"value":41193},"DV360 is critical for programmatic and enterprise media-buying workflows.",{"type":17,"tag":29,"props":41195,"children":41196},{},[41197],{"type":23,"value":23382},{"type":17,"tag":80,"props":41199,"children":41200},{},[41201,41206,41211,41216],{"type":17,"tag":84,"props":41202,"children":41203},{},[41204],{"type":23,"value":41205},"insertion order management",{"type":17,"tag":84,"props":41207,"children":41208},{},[41209],{"type":23,"value":41210},"line item reporting",{"type":17,"tag":84,"props":41212,"children":41213},{},[41214],{"type":23,"value":41215},"creative workflows",{"type":17,"tag":84,"props":41217,"children":41218},{},[41219],{"type":23,"value":41220},"programmatic campaign operations",{"type":17,"tag":239,"props":41222,"children":41224},{"id":41223},"_13-the-trade-desk-api",[41225],{"type":23,"value":41226},"13. The Trade Desk API",{"type":17,"tag":29,"props":41228,"children":41229},{},[41230],{"type":17,"tag":133,"props":41231,"children":41234},{"href":41232,"rel":41233},"https://api.thetradedesk.com/",[214],[41235],{"type":23,"value":41236},"The Trade Desk developer documentation",{"type":17,"tag":29,"props":41238,"children":41239},{},[41240],{"type":23,"value":41241},"The Trade Desk is especially important for agency and programmatic advertising products.",{"type":17,"tag":29,"props":41243,"children":41244},{},[41245],{"type":23,"value":23339},{"type":17,"tag":80,"props":41247,"children":41248},{},[41249,41254,41259,41264],{"type":17,"tag":84,"props":41250,"children":41251},{},[41252],{"type":23,"value":41253},"media buying workflows",{"type":17,"tag":84,"props":41255,"children":41256},{},[41257],{"type":23,"value":41258},"campaign and insertion order management",{"type":17,"tag":84,"props":41260,"children":41261},{},[41262],{"type":23,"value":41263},"targeting and pacing",{"type":17,"tag":84,"props":41265,"children":41266},{},[41267],{"type":23,"value":41268},"enterprise reporting",{"type":17,"tag":239,"props":41270,"children":41272},{"id":41271},"other-advertising-apis-worth-supporting",[41273],{"type":23,"value":41274},"Other advertising APIs worth supporting",{"type":17,"tag":29,"props":41276,"children":41277},{},[41278,41280,41287,41288,41295],{"type":23,"value":41279},"Depending on your customers, you may also need support for platforms like ",{"type":17,"tag":133,"props":41281,"children":41284},{"href":41282,"rel":41283},"https://developer.yahooinc.com/",[214],[41285],{"type":23,"value":41286},"Yahoo DSP",{"type":23,"value":11826},{"type":17,"tag":133,"props":41289,"children":41292},{"href":41290,"rel":41291},"https://developers.criteo.com/",[214],[41293],{"type":23,"value":41294},"Criteo",{"type":23,"value":41296},", or other retail media and DSP environments.",{"type":17,"tag":29,"props":41298,"children":41299},{},[41300],{"type":23,"value":41301},"That is why ad tech products often end up needing broad platform coverage faster than expected.",{"type":17,"tag":68,"props":41303,"children":41305},{"id":41304},"challenges-with-advertising-api-integrations",[41306],{"type":23,"value":41307},"Challenges with advertising API integrations",{"type":17,"tag":29,"props":41309,"children":41310},{},[41311],{"type":23,"value":41312},"Advertising APIs are hard to support because each platform defines the stack differently.",{"type":17,"tag":239,"props":41314,"children":41316},{"id":41315},"different-campaign-hierarchies",[41317],{"type":23,"value":41318},"Different campaign hierarchies",{"type":17,"tag":29,"props":41320,"children":41321},{},[41322],{"type":23,"value":41323},"A campaign hierarchy is not consistent across platforms.",{"type":17,"tag":29,"props":41325,"children":41326},{},[41327],{"type":23,"value":41328},"You may have:",{"type":17,"tag":80,"props":41330,"children":41331},{},[41332,41336,41340,41344,41348,41353,41357],{"type":17,"tag":84,"props":41333,"children":41334},{},[41335],{"type":23,"value":40462},{"type":17,"tag":84,"props":41337,"children":41338},{},[41339],{"type":23,"value":40467},{"type":17,"tag":84,"props":41341,"children":41342},{},[41343],{"type":23,"value":40472},{"type":17,"tag":84,"props":41345,"children":41346},{},[41347],{"type":23,"value":40482},{"type":17,"tag":84,"props":41349,"children":41350},{},[41351],{"type":23,"value":41352},"line items",{"type":17,"tag":84,"props":41354,"children":41355},{},[41356],{"type":23,"value":40477},{"type":17,"tag":84,"props":41358,"children":41359},{},[41360],{"type":23,"value":41361},"promoted objects",{"type":17,"tag":29,"props":41363,"children":41364},{},[41365],{"type":23,"value":41366},"The relationships between these vary significantly.",{"type":17,"tag":239,"props":41368,"children":41370},{"id":41369},"platform-specific-auth-and-permissions",[41371],{"type":23,"value":41372},"Platform-specific auth and permissions",{"type":17,"tag":29,"props":41374,"children":41375},{},[41376],{"type":23,"value":35264},{"type":17,"tag":80,"props":41378,"children":41379},{},[41380,41388,41393,41398],{"type":17,"tag":84,"props":41381,"children":41382},{},[41383,41387],{"type":17,"tag":133,"props":41384,"children":41385},{"href":779},[41386],{"type":23,"value":782},{"type":23,"value":784},{"type":17,"tag":84,"props":41389,"children":41390},{},[41391],{"type":23,"value":41392},"account structures",{"type":17,"tag":84,"props":41394,"children":41395},{},[41396],{"type":23,"value":41397},"permission models",{"type":17,"tag":84,"props":41399,"children":41400},{},[41401],{"type":23,"value":41402},"access reviews and app requirements",{"type":17,"tag":239,"props":41404,"children":41406},{"id":41405},"reporting-schemas-vary-widely",[41407],{"type":23,"value":41408},"Reporting schemas vary widely",{"type":17,"tag":29,"props":41410,"children":41411},{},[41412],{"type":23,"value":41413},"Metrics are not normalized by default.",{"type":17,"tag":29,"props":41415,"children":41416},{},[41417],{"type":23,"value":41418},"You often need to reconcile:",{"type":17,"tag":80,"props":41420,"children":41421},{},[41422,41427,41432,41437,41442,41447,41452],{"type":17,"tag":84,"props":41423,"children":41424},{},[41425],{"type":23,"value":41426},"impressions",{"type":17,"tag":84,"props":41428,"children":41429},{},[41430],{"type":23,"value":41431},"clicks",{"type":17,"tag":84,"props":41433,"children":41434},{},[41435],{"type":23,"value":41436},"conversions",{"type":17,"tag":84,"props":41438,"children":41439},{},[41440],{"type":23,"value":41441},"spend",{"type":17,"tag":84,"props":41443,"children":41444},{},[41445],{"type":23,"value":41446},"ROAS",{"type":17,"tag":84,"props":41448,"children":41449},{},[41450],{"type":23,"value":41451},"CPA",{"type":17,"tag":84,"props":41453,"children":41454},{},[41455],{"type":23,"value":41456},"engagement metrics",{"type":17,"tag":29,"props":41458,"children":41459},{},[41460],{"type":23,"value":41461},"and even basic naming conventions differ across platforms.",{"type":17,"tag":239,"props":41463,"children":41465},{"id":41464},"rate-limits-and-async-reporting-complexity",[41466],{"type":23,"value":41467},"Rate limits and async reporting complexity",{"type":17,"tag":29,"props":41469,"children":41470},{},[41471],{"type":23,"value":41472},"Advertising APIs often involve:",{"type":17,"tag":80,"props":41474,"children":41475},{},[41476,41481,41486,41491],{"type":17,"tag":84,"props":41477,"children":41478},{},[41479],{"type":23,"value":41480},"asynchronous reporting jobs",{"type":17,"tag":84,"props":41482,"children":41483},{},[41484],{"type":23,"value":41485},"quota limits",{"type":17,"tag":84,"props":41487,"children":41488},{},[41489],{"type":23,"value":41490},"account-level constraints",{"type":17,"tag":84,"props":41492,"children":41493},{},[41494],{"type":23,"value":41495},"long-running exports",{"type":17,"tag":239,"props":41497,"children":41499},{"id":41498},"creative-and-targeting-differences",[41500],{"type":23,"value":41501},"Creative and targeting differences",{"type":17,"tag":29,"props":41503,"children":41504},{},[41505],{"type":23,"value":41506},"Each provider has different requirements for:",{"type":17,"tag":80,"props":41508,"children":41509},{},[41510,41515,41520,41525,41529,41534],{"type":17,"tag":84,"props":41511,"children":41512},{},[41513],{"type":23,"value":41514},"creative formats",{"type":17,"tag":84,"props":41516,"children":41517},{},[41518],{"type":23,"value":41519},"ad copy",{"type":17,"tag":84,"props":41521,"children":41522},{},[41523],{"type":23,"value":41524},"placements",{"type":17,"tag":84,"props":41526,"children":41527},{},[41528],{"type":23,"value":40791},{"type":17,"tag":84,"props":41530,"children":41531},{},[41532],{"type":23,"value":41533},"scheduling",{"type":17,"tag":84,"props":41535,"children":41536},{},[41537],{"type":23,"value":41538},"political ad flags and compliance metadata",{"type":17,"tag":29,"props":41540,"children":41541},{},[41542],{"type":23,"value":41543},"This makes cross-platform support difficult if you build everything directly.",{"type":17,"tag":68,"props":41545,"children":41547},{"id":41546},"the-role-of-unified-advertising-apis",[41548],{"type":23,"value":41549},"The role of Unified Advertising APIs",{"type":17,"tag":29,"props":41551,"children":41552},{},[41553],{"type":23,"value":41554},"This is where Unified Advertising APIs become much more useful.",{"type":17,"tag":29,"props":41556,"children":41557},{},[41558,41560,41564],{"type":23,"value":41559},"Instead of building separate integrations for Google Ads, Meta Ads, TikTok Ads, LinkedIn, Microsoft Advertising, Amazon Advertising, and others, a ",{"type":17,"tag":133,"props":41561,"children":41562},{"href":7691},[41563],{"type":23,"value":7806},{"type":23,"value":41565}," gives you one normalized interface across platforms.",{"type":17,"tag":29,"props":41567,"children":41568},{},[41569],{"type":23,"value":5804},{"type":17,"tag":80,"props":41571,"children":41572},{},[41573,41578,41582,41587,41592],{"type":17,"tag":84,"props":41574,"children":41575},{},[41576],{"type":23,"value":41577},"one integration layer",{"type":17,"tag":84,"props":41579,"children":41580},{},[41581],{"type":23,"value":38796},{"type":17,"tag":84,"props":41583,"children":41584},{},[41585],{"type":23,"value":41586},"one schema",{"type":17,"tag":84,"props":41588,"children":41589},{},[41590],{"type":23,"value":41591},"one observability model",{"type":17,"tag":84,"props":41593,"children":41594},{},[41595],{"type":23,"value":41596},"less maintenance over time",{"type":17,"tag":29,"props":41598,"children":41599},{},[41600],{"type":23,"value":41601},"For products that need to support many ad platforms, this is a much more scalable approach than building provider by provider.",{"type":17,"tag":68,"props":41603,"children":41605},{"id":41604},"build-once-with-the-unified-advertising-api",[41606],{"type":23,"value":41607},"Build once with the Unified Advertising API",{"type":17,"tag":29,"props":41609,"children":41610},{},[41611,41612,41618,41619,41624],{"type":23,"value":6712},{"type":17,"tag":133,"props":41613,"children":41616},{"href":41614,"rel":41615},"https://unified.to/advertising",[214],[41617],{"type":23,"value":18456},{"type":23,"value":23936},{"type":17,"tag":48,"props":41620,"children":41621},{},[41622],{"type":23,"value":41623},"13+ advertising integrations",{"type":23,"value":23943},{"type":17,"tag":29,"props":41626,"children":41627},{},[41628],{"type":23,"value":13248},{"type":17,"tag":80,"props":41630,"children":41631},{},[41632,41636,41640,41644,41648,41652,41656,41660,41664,41668,41672,41677,41681],{"type":17,"tag":84,"props":41633,"children":41634},{},[41635],{"type":23,"value":11337},{"type":17,"tag":84,"props":41637,"children":41638},{},[41639],{"type":23,"value":11332},{"type":17,"tag":84,"props":41641,"children":41642},{},[41643],{"type":23,"value":11362},{"type":17,"tag":84,"props":41645,"children":41646},{},[41647],{"type":23,"value":11357},{"type":17,"tag":84,"props":41649,"children":41650},{},[41651],{"type":23,"value":11382},{"type":17,"tag":84,"props":41653,"children":41654},{},[41655],{"type":23,"value":11347},{"type":17,"tag":84,"props":41657,"children":41658},{},[41659],{"type":23,"value":11377},{"type":17,"tag":84,"props":41661,"children":41662},{},[41663],{"type":23,"value":11372},{"type":17,"tag":84,"props":41665,"children":41666},{},[41667],{"type":23,"value":11367},{"type":17,"tag":84,"props":41669,"children":41670},{},[41671],{"type":23,"value":11352},{"type":17,"tag":84,"props":41673,"children":41674},{},[41675],{"type":23,"value":41676},"Google Campaign Manager 360",{"type":17,"tag":84,"props":41678,"children":41679},{},[41680],{"type":23,"value":11342},{"type":17,"tag":84,"props":41682,"children":41683},{},[41684],{"type":23,"value":11387},{"type":17,"tag":239,"props":41686,"children":41688},{"id":41687},"unified-advertising-objects",[41689],{"type":23,"value":41690},"Unified Advertising objects",{"type":17,"tag":29,"props":41692,"children":41693},{},[41694],{"type":23,"value":41695},"Unified provides standardized access to key advertising objects, including:",{"type":17,"tag":80,"props":41697,"children":41698},{},[41699,41704,41709,41714,41719,41724,41729,41734,41739],{"type":17,"tag":84,"props":41700,"children":41701},{},[41702],{"type":23,"value":41703},"Organizations",{"type":17,"tag":84,"props":41705,"children":41706},{},[41707],{"type":23,"value":41708},"Campaigns",{"type":17,"tag":84,"props":41710,"children":41711},{},[41712],{"type":23,"value":41713},"Promoted objects",{"type":17,"tag":84,"props":41715,"children":41716},{},[41717],{"type":23,"value":41718},"Creatives",{"type":17,"tag":84,"props":41720,"children":41721},{},[41722],{"type":23,"value":41723},"Insertion Orders",{"type":17,"tag":84,"props":41725,"children":41726},{},[41727],{"type":23,"value":41728},"Groups",{"type":17,"tag":84,"props":41730,"children":41731},{},[41732],{"type":23,"value":41733},"Ads",{"type":17,"tag":84,"props":41735,"children":41736},{},[41737],{"type":23,"value":41738},"Reports",{"type":17,"tag":84,"props":41740,"children":41741},{},[41742],{"type":23,"value":41743},"Targets",{"type":17,"tag":29,"props":41745,"children":41746},{},[41747],{"type":23,"value":41748},"This makes it possible to build one product experience across multiple ad platforms without maintaining separate schemas for each one.",{"type":17,"tag":239,"props":41750,"children":41751},{"id":24049},[41752],{"type":23,"value":24052},{"type":17,"tag":29,"props":41754,"children":41755},{},[41756],{"type":23,"value":41757},"Many advertising integration approaches still rely on:",{"type":17,"tag":80,"props":41759,"children":41760},{},[41761,41765,41769,41773],{"type":17,"tag":84,"props":41762,"children":41763},{},[41764],{"type":23,"value":31656},{"type":17,"tag":84,"props":41766,"children":41767},{},[41768],{"type":23,"value":32808},{"type":17,"tag":84,"props":41770,"children":41771},{},[41772],{"type":23,"value":32803},{"type":17,"tag":84,"props":41774,"children":41775},{},[41776],{"type":23,"value":31666},{"type":17,"tag":29,"props":41778,"children":41779},{},[41780,41781,41785],{"type":23,"value":24080},{"type":17,"tag":48,"props":41782,"children":41783},{},[41784],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":41787,"children":41788},{},[41789],{"type":23,"value":5804},{"type":17,"tag":80,"props":41791,"children":41792},{},[41793,41797,41802,41806,41810],{"type":17,"tag":84,"props":41794,"children":41795},{},[41796],{"type":23,"value":24097},{"type":17,"tag":84,"props":41798,"children":41799},{},[41800],{"type":23,"value":41801},"no sync jobs",{"type":17,"tag":84,"props":41803,"children":41804},{},[41805],{"type":23,"value":39029},{"type":17,"tag":84,"props":41807,"children":41808},{},[41809],{"type":23,"value":31700},{"type":17,"tag":84,"props":41811,"children":41812},{},[41813],{"type":23,"value":41814},"native and virtual webhooks for updates",{"type":17,"tag":29,"props":41816,"children":41817},{},[41818,41819,41823],{"type":23,"value":24117},{"type":17,"tag":48,"props":41820,"children":41821},{},[41822],{"type":23,"value":24122},{"type":23,"value":41824},", so customer advertising data is not stored at rest by the integration layer.",{"type":17,"tag":29,"props":41826,"children":41827},{},[41828],{"type":23,"value":41829},"That is especially important for products dealing with sensitive account access, regional data requirements, or compliance-heavy customers.",{"type":17,"tag":239,"props":41831,"children":41832},{"id":24132},[41833],{"type":23,"value":24135},{"type":17,"tag":29,"props":41835,"children":41836},{},[41837],{"type":23,"value":24140},{"type":17,"tag":80,"props":41839,"children":41840},{},[41841,41846,41851,41856,41861,41866,41871],{"type":17,"tag":84,"props":41842,"children":41843},{},[41844],{"type":23,"value":41845},"multi-platform advertising dashboards",{"type":17,"tag":84,"props":41847,"children":41848},{},[41849],{"type":23,"value":41850},"agency reporting platforms",{"type":17,"tag":84,"props":41852,"children":41853},{},[41854],{"type":23,"value":41855},"AI-powered campaign analysis tools",{"type":17,"tag":84,"props":41857,"children":41858},{},[41859],{"type":23,"value":41860},"budget and pacing monitors",{"type":17,"tag":84,"props":41862,"children":41863},{},[41864],{"type":23,"value":41865},"creative and targeting management workflows",{"type":17,"tag":84,"props":41867,"children":41868},{},[41869],{"type":23,"value":41870},"data warehousing and BI pipelines",{"type":17,"tag":84,"props":41872,"children":41873},{},[41874],{"type":23,"value":41875},"ecommerce ad analytics products",{"type":17,"tag":29,"props":41877,"children":41878},{},[41879],{"type":23,"value":41880},"without rebuilding the integration stack every time a customer asks for another ad platform.",{"type":17,"tag":68,"props":41882,"children":41884},{"id":41883},"why-not-just-build-each-advertising-integration-directly",[41885],{"type":23,"value":41886},"Why not just build each advertising integration directly?",{"type":17,"tag":29,"props":41888,"children":41889},{},[41890],{"type":23,"value":41891},"You can, but this category gets expensive quickly.",{"type":17,"tag":29,"props":41893,"children":41894},{},[41895],{"type":23,"value":41896},"For each provider, you need to handle:",{"type":17,"tag":80,"props":41898,"children":41899},{},[41900,41905,41910,41915,41919,41924],{"type":17,"tag":84,"props":41901,"children":41902},{},[41903],{"type":23,"value":41904},"different auth and permission flows",{"type":17,"tag":84,"props":41906,"children":41907},{},[41908],{"type":23,"value":41909},"different campaign hierarchies",{"type":17,"tag":84,"props":41911,"children":41912},{},[41913],{"type":23,"value":41914},"different reporting APIs",{"type":17,"tag":84,"props":41916,"children":41917},{},[41918],{"type":23,"value":5773},{"type":17,"tag":84,"props":41920,"children":41921},{},[41922],{"type":23,"value":41923},"different creative and targeting rules",{"type":17,"tag":84,"props":41925,"children":41926},{},[41927],{"type":23,"value":41928},"ongoing maintenance every time APIs change",{"type":17,"tag":29,"props":41930,"children":41931},{},[41932],{"type":23,"value":41933},"That cost compounds with every platform you add.",{"type":17,"tag":29,"props":41935,"children":41936},{},[41937],{"type":23,"value":41938},"A Unified Advertising API removes most of that duplicate infrastructure work and makes the product layer much easier to scale.",{"type":17,"tag":68,"props":41940,"children":41941},{"id":1552},[41942],{"type":23,"value":1555},{"type":17,"tag":29,"props":41944,"children":41945},{},[41946],{"type":23,"value":41947},"Advertising APIs are essential for analytics, agency tooling, campaign management, and AI-driven ad products, but they are one of the hardest categories to support cleanly.",{"type":17,"tag":29,"props":41949,"children":41950},{},[41951],{"type":23,"value":41952},"If your customers use multiple ad platforms, building each integration directly can become a long-term maintenance burden.",{"type":17,"tag":29,"props":41954,"children":41955},{},[41956],{"type":23,"value":41957},"That is why more SaaS teams are moving toward Unified Advertising APIs.",{"type":17,"tag":29,"props":41959,"children":41960},{},[41961,41963,41968],{"type":23,"value":41962},"If you need real-time, read/write access to advertising data across Google Ads, Meta Ads, TikTok Ads, LinkedIn, Amazon Advertising, The Trade Desk, and more, ",{"type":17,"tag":133,"props":41964,"children":41966},{"href":212,"rel":41965},[214],[41967],{"type":23,"value":217},{"type":23,"value":41969}," provides a much faster and more scalable way to support those workflows.",{"type":17,"tag":29,"props":41971,"children":41972},{},[41973,41974],{"type":23,"value":1609},{"type":17,"tag":133,"props":41975,"children":41977},{"href":1612,"rel":41976},[214],[41978],{"type":23,"value":1616},{"type":17,"tag":29,"props":41980,"children":41981},{},[41982,41983],{"type":23,"value":1609},{"type":17,"tag":133,"props":41984,"children":41986},{"href":1623,"rel":41985},[214],[41987],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":41989},[41990,41991,41992,42008,42015,42016,42021,42022],{"id":40429,"depth":1629,"text":40432},{"id":40532,"depth":1629,"text":40535},{"id":40648,"depth":1629,"text":40651,"children":41993},[41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007],{"id":40659,"depth":1635,"text":40662},{"id":40706,"depth":1635,"text":40709},{"id":40752,"depth":1635,"text":40755},{"id":40799,"depth":1635,"text":40802},{"id":40846,"depth":1635,"text":40849},{"id":40893,"depth":1635,"text":40896},{"id":40941,"depth":1635,"text":40944},{"id":40988,"depth":1635,"text":40991},{"id":41035,"depth":1635,"text":41038},{"id":41081,"depth":1635,"text":41084},{"id":41128,"depth":1635,"text":41131},{"id":41175,"depth":1635,"text":41178},{"id":41223,"depth":1635,"text":41226},{"id":41271,"depth":1635,"text":41274},{"id":41304,"depth":1629,"text":41307,"children":42009},[42010,42011,42012,42013,42014],{"id":41315,"depth":1635,"text":41318},{"id":41369,"depth":1635,"text":41372},{"id":41405,"depth":1635,"text":41408},{"id":41464,"depth":1635,"text":41467},{"id":41498,"depth":1635,"text":41501},{"id":41546,"depth":1629,"text":41549},{"id":41604,"depth":1629,"text":41607,"children":42017},[42018,42019,42020],{"id":41687,"depth":1635,"text":41690},{"id":24049,"depth":1635,"text":24052},{"id":24132,"depth":1635,"text":24135},{"id":41883,"depth":1629,"text":41886},{"id":1552,"depth":1629,"text":1555},"content:blog:13_advertising_apis_to_integrate_with_in_2026_google_ads_meta_ads_tiktok_ads_and_unified_advertising_apis.md","blog/13_advertising_apis_to_integrate_with_in_2026_google_ads_meta_ads_tiktok_ads_and_unified_advertising_apis.md","blog/13_advertising_apis_to_integrate_with_in_2026_google_ads_meta_ads_tiktok_ads_and_unified_advertising_apis",{"_path":42027,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":42028,"description":42029,"img":6339,"date":42030,"tag":6341,"body":42031,"_type":1677,"_id":42587,"_source":1679,"_file":42588,"_stem":42589,"_extension":1682},"/blog/how_to_register_your_google_ads_oauth2_application","How to Register your Google Ads OAuth2 Application","Click Select a project at the top of the page, then click New Project...","2026-03-21T02:49:00.000Z",{"type":14,"children":42032,"toc":42584},[42033,42038,42041,42049,42057,42579],{"type":17,"tag":18,"props":42034,"children":42036},{"id":42035},"how-to-register-your-google-ads-oauth2-application",[42037],{"type":23,"value":42028},{"type":17,"tag":25,"props":42039,"children":42040},{},[],{"type":17,"tag":29,"props":42042,"children":42043},{},[42044],{"type":17,"tag":33,"props":42045,"children":42046},{},[42047],{"type":23,"value":42048},"March 21, 2026",{"type":17,"tag":68,"props":42050,"children":42052},{"id":42051},"how-to-register-your-google-ads-oauth2-application-1",[42053],{"type":17,"tag":48,"props":42054,"children":42055},{},[42056],{"type":23,"value":42028},{"type":17,"tag":6154,"props":42058,"children":42059},{},[42060,42126,42182,42301,42338,42449,42524],{"type":17,"tag":84,"props":42061,"children":42062},{},[42063,42065],{"type":23,"value":42064},"Create a Google Cloud project\n",{"type":17,"tag":80,"props":42066,"children":42067},{},[42068,42082,42099,42117],{"type":17,"tag":84,"props":42069,"children":42070},{},[42071,42073],{"type":23,"value":42072},"Go to ",{"type":17,"tag":133,"props":42074,"children":42077},{"href":42075,"rel":42076},"https://console.cloud.google.com/",[214],[42078],{"type":17,"tag":48,"props":42079,"children":42080},{},[42081],{"type":23,"value":42075},{"type":17,"tag":84,"props":42083,"children":42084},{},[42085,42087,42092,42094],{"type":23,"value":42086},"Click ",{"type":17,"tag":48,"props":42088,"children":42089},{},[42090],{"type":23,"value":42091},"Select a project",{"type":23,"value":42093}," at the top of the page, then click ",{"type":17,"tag":48,"props":42095,"children":42096},{},[42097],{"type":23,"value":42098},"New Project",{"type":17,"tag":84,"props":42100,"children":42101},{},[42102,42104],{"type":23,"value":42103},"Enter the following details:\n",{"type":17,"tag":80,"props":42105,"children":42106},{},[42107,42112],{"type":17,"tag":84,"props":42108,"children":42109},{},[42110],{"type":23,"value":42111},"Project Name",{"type":17,"tag":84,"props":42113,"children":42114},{},[42115],{"type":23,"value":42116},"Organization (if applicable)",{"type":17,"tag":84,"props":42118,"children":42119},{},[42120,42121],{"type":23,"value":42086},{"type":17,"tag":48,"props":42122,"children":42123},{},[42124],{"type":23,"value":42125},"Create",{"type":17,"tag":84,"props":42127,"children":42128},{},[42129,42131,42136],{"type":23,"value":42130},"Enable the Google ",{"type":17,"tag":133,"props":42132,"children":42133},{"href":11091},[42134],{"type":23,"value":42135},"Ads API",{"type":17,"tag":80,"props":42137,"children":42138},{},[42139,42152,42162,42173],{"type":17,"tag":84,"props":42140,"children":42141},{},[42142,42143],{"type":23,"value":42072},{"type":17,"tag":133,"props":42144,"children":42147},{"href":42145,"rel":42146},"https://console.cloud.google.com/apis/library",[214],[42148],{"type":17,"tag":48,"props":42149,"children":42150},{},[42151],{"type":23,"value":42145},{"type":17,"tag":84,"props":42153,"children":42154},{},[42155,42157],{"type":23,"value":42156},"Search for ",{"type":17,"tag":48,"props":42158,"children":42159},{},[42160],{"type":23,"value":42161},"Google Ads API",{"type":17,"tag":84,"props":42163,"children":42164},{},[42165,42167,42171],{"type":23,"value":42166},"Click on ",{"type":17,"tag":48,"props":42168,"children":42169},{},[42170],{"type":23,"value":42161},{"type":23,"value":42172}," in the results",{"type":17,"tag":84,"props":42174,"children":42175},{},[42176,42177],{"type":23,"value":42086},{"type":17,"tag":48,"props":42178,"children":42179},{},[42180],{"type":23,"value":42181},"Enable",{"type":17,"tag":84,"props":42183,"children":42184},{},[42185,42187,42191,42193],{"type":23,"value":42186},"Configure the ",{"type":17,"tag":133,"props":42188,"children":42189},{"href":779},[42190],{"type":23,"value":782},{"type":23,"value":42192}," Consent Screen\n",{"type":17,"tag":80,"props":42194,"children":42195},{},[42196,42209,42225,42247,42256,42280,42288,42293],{"type":17,"tag":84,"props":42197,"children":42198},{},[42199,42200],{"type":23,"value":42072},{"type":17,"tag":133,"props":42201,"children":42204},{"href":42202,"rel":42203},"https://console.cloud.google.com/apis/credentials/consent",[214],[42205],{"type":17,"tag":48,"props":42206,"children":42207},{},[42208],{"type":23,"value":42202},{"type":17,"tag":84,"props":42210,"children":42211},{},[42212,42214,42219,42221],{"type":23,"value":42213},"Select ",{"type":17,"tag":48,"props":42215,"children":42216},{},[42217],{"type":23,"value":42218},"External",{"type":23,"value":42220}," as the user type, then click ",{"type":17,"tag":48,"props":42222,"children":42223},{},[42224],{"type":23,"value":42125},{"type":17,"tag":84,"props":42226,"children":42227},{},[42228,42229],{"type":23,"value":42103},{"type":17,"tag":80,"props":42230,"children":42231},{},[42232,42237,42242],{"type":17,"tag":84,"props":42233,"children":42234},{},[42235],{"type":23,"value":42236},"App Name",{"type":17,"tag":84,"props":42238,"children":42239},{},[42240],{"type":23,"value":42241},"User Support Email",{"type":17,"tag":84,"props":42243,"children":42244},{},[42245],{"type":23,"value":42246},"Developer Contact Email",{"type":17,"tag":84,"props":42248,"children":42249},{},[42250,42251],{"type":23,"value":42086},{"type":17,"tag":48,"props":42252,"children":42253},{},[42254],{"type":23,"value":42255},"Save and Continue",{"type":17,"tag":84,"props":42257,"children":42258},{},[42259,42261,42266,42268],{"type":23,"value":42260},"On the Scopes step, click ",{"type":17,"tag":48,"props":42262,"children":42263},{},[42264],{"type":23,"value":42265},"Add or Remove Scopes",{"type":23,"value":42267}," and add the following scope:\n",{"type":17,"tag":80,"props":42269,"children":42270},{},[42271],{"type":17,"tag":84,"props":42272,"children":42273},{},[42274],{"type":17,"tag":6121,"props":42275,"children":42277},{"className":42276},[],[42278],{"type":23,"value":42279},"https://www.googleapis.com/auth/adwords",{"type":17,"tag":84,"props":42281,"children":42282},{},[42283,42284],{"type":23,"value":42086},{"type":17,"tag":48,"props":42285,"children":42286},{},[42287],{"type":23,"value":42255},{"type":17,"tag":84,"props":42289,"children":42290},{},[42291],{"type":23,"value":42292},"On the Test Users step, add any Google accounts you want to test with",{"type":17,"tag":84,"props":42294,"children":42295},{},[42296,42297],{"type":23,"value":42086},{"type":17,"tag":48,"props":42298,"children":42299},{},[42300],{"type":23,"value":42255},{"type":17,"tag":84,"props":42302,"children":42303},{},[42304,42306],{"type":23,"value":42305},"Publish the OAuth Consent Screen\n",{"type":17,"tag":80,"props":42307,"children":42308},{},[42309,42322,42333],{"type":17,"tag":84,"props":42310,"children":42311},{},[42312,42314],{"type":23,"value":42313},"Go back to ",{"type":17,"tag":133,"props":42315,"children":42317},{"href":42202,"rel":42316},[214],[42318],{"type":17,"tag":48,"props":42319,"children":42320},{},[42321],{"type":23,"value":42202},{"type":17,"tag":84,"props":42323,"children":42324},{},[42325,42326,42331],{"type":23,"value":42086},{"type":17,"tag":48,"props":42327,"children":42328},{},[42329],{"type":23,"value":42330},"Publish App",{"type":23,"value":42332}," to move from Testing to Production status",{"type":17,"tag":84,"props":42334,"children":42335},{},[42336],{"type":23,"value":42337},"This allows any Google user to authorize your application, not just the test users you added",{"type":17,"tag":84,"props":42339,"children":42340},{},[42341,42343],{"type":23,"value":42342},"Create OAuth2 Credentials\n",{"type":17,"tag":80,"props":42344,"children":42345},{},[42346,42359,42375,42386,42391,42424,42432],{"type":17,"tag":84,"props":42347,"children":42348},{},[42349,42350],{"type":23,"value":42072},{"type":17,"tag":133,"props":42351,"children":42354},{"href":42352,"rel":42353},"https://console.cloud.google.com/apis/credentials",[214],[42355],{"type":17,"tag":48,"props":42356,"children":42357},{},[42358],{"type":23,"value":42352},{"type":17,"tag":84,"props":42360,"children":42361},{},[42362,42363,42368,42370],{"type":23,"value":42086},{"type":17,"tag":48,"props":42364,"children":42365},{},[42366],{"type":23,"value":42367},"Create Credentials",{"type":23,"value":42369}," → ",{"type":17,"tag":48,"props":42371,"children":42372},{},[42373],{"type":23,"value":42374},"OAuth client ID",{"type":17,"tag":84,"props":42376,"children":42377},{},[42378,42379,42384],{"type":23,"value":42213},{"type":17,"tag":48,"props":42380,"children":42381},{},[42382],{"type":23,"value":42383},"Web application",{"type":23,"value":42385}," as the Application Type",{"type":17,"tag":84,"props":42387,"children":42388},{},[42389],{"type":23,"value":42390},"Enter a name for the OAuth client",{"type":17,"tag":84,"props":42392,"children":42393},{},[42394,42396,42401,42403,42407,42409],{"type":23,"value":42395},"Under ",{"type":17,"tag":48,"props":42397,"children":42398},{},[42399],{"type":23,"value":42400},"Authorized redirect URIs",{"type":23,"value":42402},", add the following ",{"type":17,"tag":48,"props":42404,"children":42405},{},[42406],{"type":23,"value":217},{"type":23,"value":42408}," OAuth2 redirect URL:\n",{"type":17,"tag":80,"props":42410,"children":42411},{},[42412],{"type":17,"tag":84,"props":42413,"children":42414},{},[42415],{"type":17,"tag":133,"props":42416,"children":42419},{"href":42417,"rel":42418},"https://api.unified.to/oauth/code",[214],[42420],{"type":17,"tag":48,"props":42421,"children":42422},{},[42423],{"type":23,"value":42417},{"type":17,"tag":84,"props":42425,"children":42426},{},[42427,42428],{"type":23,"value":42086},{"type":17,"tag":48,"props":42429,"children":42430},{},[42431],{"type":23,"value":42125},{"type":17,"tag":84,"props":42433,"children":42434},{},[42435,42437,42441,42443,42447],{"type":23,"value":42436},"Copy the ",{"type":17,"tag":48,"props":42438,"children":42439},{},[42440],{"type":23,"value":6040},{"type":23,"value":42442}," and ",{"type":17,"tag":48,"props":42444,"children":42445},{},[42446],{"type":23,"value":6045},{"type":23,"value":42448}," from the dialog that appears",{"type":17,"tag":84,"props":42450,"children":42451},{},[42452,42454],{"type":23,"value":42453},"Request Basic Access for the Google Ads Developer Token\n",{"type":17,"tag":80,"props":42455,"children":42456},{},[42457,42487,42497,42514,42519],{"type":17,"tag":84,"props":42458,"children":42459},{},[42460,42461,42470],{"type":23,"value":42072},{"type":17,"tag":133,"props":42462,"children":42465},{"href":42463,"rel":42464},"https://ads.google.com/aw/apicenter",[214],[42466],{"type":17,"tag":48,"props":42467,"children":42468},{},[42469],{"type":23,"value":42463},{"type":17,"tag":80,"props":42471,"children":42472},{},[42473],{"type":17,"tag":84,"props":42474,"children":42475},{},[42476,42478],{"type":23,"value":42477},"Note: You must be logged into a Google Ads Manager account. If you do not have one, create one at ",{"type":17,"tag":133,"props":42479,"children":42482},{"href":42480,"rel":42481},"https://ads.google.com/intl/en/home/tools/manager-accounts/",[214],[42483],{"type":17,"tag":48,"props":42484,"children":42485},{},[42486],{"type":23,"value":42480},{"type":17,"tag":84,"props":42488,"children":42489},{},[42490,42492],{"type":23,"value":42491},"In the API Center, you will see your ",{"type":17,"tag":48,"props":42493,"children":42494},{},[42495],{"type":23,"value":42496},"Developer Token",{"type":17,"tag":84,"props":42498,"children":42499},{},[42500,42502,42507,42509],{"type":23,"value":42501},"Your token will initially have ",{"type":17,"tag":48,"props":42503,"children":42504},{},[42505],{"type":23,"value":42506},"Test Account",{"type":23,"value":42508}," access. To use it with production accounts, click ",{"type":17,"tag":48,"props":42510,"children":42511},{},[42512],{"type":23,"value":42513},"Apply for Basic Access",{"type":17,"tag":84,"props":42515,"children":42516},{},[42517],{"type":23,"value":42518},"Fill out the application form with details about how you will use the API",{"type":17,"tag":84,"props":42520,"children":42521},{},[42522],{"type":23,"value":42523},"Google typically reviews and approves Basic Access applications within a few business days",{"type":17,"tag":84,"props":42525,"children":42526},{},[42527,42529],{"type":23,"value":42528},"Configure Unified.to\n",{"type":17,"tag":80,"props":42530,"children":42531},{},[42532],{"type":17,"tag":84,"props":42533,"children":42534},{},[42535,42537,42546,42548],{"type":23,"value":42536},"In Unified ",{"type":17,"tag":133,"props":42538,"children":42541},{"href":42539,"rel":42540},"https://app.unified.to/integrations/googleads",[214],[42542],{"type":17,"tag":48,"props":42543,"children":42544},{},[42545],{"type":23,"value":42539},{"type":23,"value":42547},", add the following:\n",{"type":17,"tag":80,"props":42549,"children":42550},{},[42551,42560,42568],{"type":17,"tag":84,"props":42552,"children":42553},{},[42554,42556],{"type":23,"value":42555},"The OAuth client's ",{"type":17,"tag":48,"props":42557,"children":42558},{},[42559],{"type":23,"value":6040},{"type":17,"tag":84,"props":42561,"children":42562},{},[42563,42564],{"type":23,"value":42555},{"type":17,"tag":48,"props":42565,"children":42566},{},[42567],{"type":23,"value":6045},{"type":17,"tag":84,"props":42569,"children":42570},{},[42571,42573,42577],{"type":23,"value":42572},"Your ",{"type":17,"tag":48,"props":42574,"children":42575},{},[42576],{"type":23,"value":42496},{"type":23,"value":42578}," from the API Center",{"type":17,"tag":29,"props":42580,"children":42581},{},[42582],{"type":23,"value":42583},"You are now all set to authorize a Google Ads connection",{"title":7,"searchDepth":1629,"depth":1629,"links":42585},[42586],{"id":42051,"depth":1629,"text":42028},"content:blog:how_to_register_your_google_ads_oauth2_application.md","blog/how_to_register_your_google_ads_oauth2_application.md","blog/how_to_register_your_google_ads_oauth2_application",{"_path":42591,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":42592,"description":42593,"img":6339,"date":42594,"tag":6341,"body":42595,"_type":1677,"_id":43170,"_source":1679,"_file":43171,"_stem":43172,"_extension":1682},"/blog/how_to_create_a_unified_connection_to_highlevel","How to Create a Unified.to Connection to HighLevel","This guide explains how to connect an existing HighLevel account to Unified.to. It assumes,","2026-03-19T20:01:00.000Z",{"type":14,"children":42596,"toc":43157},[42597,42602,42605,42613,42626,42644,42647,42653,42658,42687,42690,42696,42722,42729,42849,42852,42858,42870,42877,42894,42906,42913,42918,42921,42927,43013,43016,43022,43045,43050,43053,43059,43065,43073,43079,43092,43098,43111,43114,43118,43131,43134,43139],{"type":17,"tag":18,"props":42598,"children":42600},{"id":42599},"how-to-create-a-unifiedto-connection-to-highlevel",[42601],{"type":23,"value":42592},{"type":17,"tag":25,"props":42603,"children":42604},{},[],{"type":17,"tag":29,"props":42606,"children":42607},{},[42608],{"type":17,"tag":33,"props":42609,"children":42610},{},[42611],{"type":23,"value":42612},"March 19, 2026",{"type":17,"tag":29,"props":42614,"children":42615},{},[42616,42618,42624],{"type":23,"value":42617},"This guide explains how to connect an existing HighLevel account to ",{"type":17,"tag":133,"props":42619,"children":42622},{"href":42620,"rel":42621},"http://unified.to/",[214],[42623],{"type":23,"value":217},{"type":23,"value":42625},". It assumes:",{"type":17,"tag":80,"props":42627,"children":42628},{},[42629,42634,42639],{"type":17,"tag":84,"props":42630,"children":42631},{},[42632],{"type":23,"value":42633},"You already have a Unified.to account",{"type":17,"tag":84,"props":42635,"children":42636},{},[42637],{"type":23,"value":42638},"You already have a HighLevel account",{"type":17,"tag":84,"props":42640,"children":42641},{},[42642],{"type":23,"value":42643},"You have access to a HighLevel Developer (Agency) account",{"type":17,"tag":25,"props":42645,"children":42646},{},[],{"type":17,"tag":68,"props":42648,"children":42650},{"id":42649},"overview",[42651],{"type":23,"value":42652},"Overview",{"type":17,"tag":29,"props":42654,"children":42655},{},[42656],{"type":23,"value":42657},"To create a connection between Unified.to and HighLevel, you will:",{"type":17,"tag":6154,"props":42659,"children":42660},{},[42661,42672,42677,42682],{"type":17,"tag":84,"props":42662,"children":42663},{},[42664,42666,42670],{"type":23,"value":42665},"Create or configure a HighLevel ",{"type":17,"tag":133,"props":42667,"children":42668},{"href":779},[42669],{"type":23,"value":782},{"type":23,"value":42671}," app",{"type":17,"tag":84,"props":42673,"children":42674},{},[42675],{"type":23,"value":42676},"Collect required credentials (Client ID, Client Secret, etc.)",{"type":17,"tag":84,"props":42678,"children":42679},{},[42680],{"type":23,"value":42681},"Use Unified.to to create a connection",{"type":17,"tag":84,"props":42683,"children":42684},{},[42685],{"type":23,"value":42686},"Authorize the connection via OAuth",{"type":17,"tag":25,"props":42688,"children":42689},{},[],{"type":17,"tag":68,"props":42691,"children":42693},{"id":42692},"step-1-create-a-highlevel-oauth-app",[42694],{"type":23,"value":42695},"Step 1: Create a HighLevel OAuth App",{"type":17,"tag":6154,"props":42697,"children":42698},{},[42699,42711],{"type":17,"tag":84,"props":42700,"children":42701},{},[42702,42704],{"type":23,"value":42703},"Log in to your HighLevel Developer (Agency) account ",{"type":17,"tag":133,"props":42705,"children":42708},{"href":42706,"rel":42707},"https://marketplace.gohighlevel.com/apps",[214],[42709],{"type":23,"value":42710},"link",{"type":17,"tag":84,"props":42712,"children":42713},{},[42714,42716,42721],{"type":23,"value":42715},"Navigate to the ",{"type":17,"tag":48,"props":42717,"children":42718},{},[42719],{"type":23,"value":42720},"App Dashboard",{"type":23,"value":54},{"type":17,"tag":29,"props":42723,"children":42724},{},[42725],{"type":17,"tag":6438,"props":42726,"children":42728},{"alt":6440,"src":42727},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-0.png",[],{"type":17,"tag":6154,"props":42730,"children":42731},{},[42732,42740,42844],{"type":17,"tag":84,"props":42733,"children":42734},{},[42735,42736],{"type":23,"value":6629},{"type":17,"tag":48,"props":42737,"children":42738},{},[42739],{"type":23,"value":6525},{"type":17,"tag":84,"props":42741,"children":42742},{},[42743,42745,42825,42828,42830,42835,42837,42840],{"type":23,"value":42744},"Fill in the required details:",{"type":17,"tag":80,"props":42746,"children":42747},{},[42748,42764,42808],{"type":17,"tag":84,"props":42749,"children":42750},{},[42751,42755,42757,42760],{"type":17,"tag":48,"props":42752,"children":42753},{},[42754],{"type":23,"value":42236},{"type":23,"value":42756},": Any name (e.g., Unified Integration)",{"type":17,"tag":3891,"props":42758,"children":42759},{},[],{"type":17,"tag":6438,"props":42761,"children":42763},{"alt":6440,"src":42762},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-1.png",[],{"type":17,"tag":84,"props":42765,"children":42766},{},[42767,42772,42774,42779,42781,42786,42788,42793,42794,42797,42801,42804],{"type":17,"tag":48,"props":42768,"children":42769},{},[42770],{"type":23,"value":42771},"Redirect URL",{"type":23,"value":42773},": In ",{"type":17,"tag":48,"props":42775,"children":42776},{},[42777],{"type":23,"value":42778},"Advanced settings → Auth",{"type":23,"value":42780},", set the redirect URL to the value shown on the integration's ",{"type":17,"tag":48,"props":42782,"children":42783},{},[42784],{"type":23,"value":42785},"OAuth2 Credentials",{"type":23,"value":42787}," page in ",{"type":17,"tag":133,"props":42789,"children":42791},{"href":42620,"rel":42790},[214],[42792],{"type":23,"value":217},{"type":23,"value":54},{"type":17,"tag":3891,"props":42795,"children":42796},{},[],{"type":17,"tag":6438,"props":42798,"children":42800},{"alt":6440,"src":42799},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-2.png",[],{"type":17,"tag":3891,"props":42802,"children":42803},{},[],{"type":17,"tag":6438,"props":42805,"children":42807},{"alt":6440,"src":42806},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-3.png",[],{"type":17,"tag":84,"props":42809,"children":42810},{},[42811,42816,42818,42821],{"type":17,"tag":48,"props":42812,"children":42813},{},[42814],{"type":23,"value":42815},"Scopes",{"type":23,"value":42817},": Use the scopes listed on the HighLevel app setup page.",{"type":17,"tag":3891,"props":42819,"children":42820},{},[],{"type":17,"tag":6438,"props":42822,"children":42824},{"alt":6440,"src":42823},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-4.png",[],{"type":17,"tag":3891,"props":42826,"children":42827},{},[],{"type":23,"value":42829},"In ",{"type":17,"tag":133,"props":42831,"children":42833},{"href":42620,"rel":42832},[214],[42834],{"type":23,"value":217},{"type":23,"value":42836},", you can also find the required scopes listed below the integration page.",{"type":17,"tag":3891,"props":42838,"children":42839},{},[],{"type":17,"tag":6438,"props":42841,"children":42843},{"alt":6440,"src":42842},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-5.png",[],{"type":17,"tag":84,"props":42845,"children":42846},{},[42847],{"type":23,"value":42848},"Save the app in HighLevel.",{"type":17,"tag":25,"props":42850,"children":42851},{},[],{"type":17,"tag":68,"props":42853,"children":42855},{"id":42854},"step-2-get-credentials",[42856],{"type":23,"value":42857},"Step 2: Get Credentials",{"type":17,"tag":29,"props":42859,"children":42860},{},[42861,42863,42868],{"type":23,"value":42862},"After creating the app, go to ",{"type":17,"tag":48,"props":42864,"children":42865},{},[42866],{"type":23,"value":42867},"Manage → Secrets",{"type":23,"value":42869}," and add:",{"type":17,"tag":29,"props":42871,"children":42872},{},[42873],{"type":17,"tag":6438,"props":42874,"children":42876},{"alt":6440,"src":42875},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-6.png",[],{"type":17,"tag":80,"props":42878,"children":42879},{},[42880,42887],{"type":17,"tag":84,"props":42881,"children":42882},{},[42883],{"type":17,"tag":48,"props":42884,"children":42885},{},[42886],{"type":23,"value":6040},{"type":17,"tag":84,"props":42888,"children":42889},{},[42890],{"type":17,"tag":48,"props":42891,"children":42892},{},[42893],{"type":23,"value":6045},{"type":17,"tag":29,"props":42895,"children":42896},{},[42897,42899,42904],{"type":23,"value":42898},"To find the ",{"type":17,"tag":48,"props":42900,"children":42901},{},[42902],{"type":23,"value":42903},"Version ID",{"type":23,"value":42905},", open the install link and copy the Version ID from the resulting page.",{"type":17,"tag":29,"props":42907,"children":42908},{},[42909],{"type":17,"tag":6438,"props":42910,"children":42912},{"alt":6440,"src":42911},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_a_unified_connection_to_highlevel-7.png",[],{"type":17,"tag":29,"props":42914,"children":42915},{},[42916],{"type":23,"value":42917},"Keep these secure. You will need them in Unified.to.",{"type":17,"tag":25,"props":42919,"children":42920},{},[],{"type":17,"tag":68,"props":42922,"children":42924},{"id":42923},"step-3-create-connection-in-unifiedto",[42925],{"type":23,"value":42926},"Step 3: Create Connection in Unified.to",{"type":17,"tag":6154,"props":42928,"children":42929},{},[42930,42935,42946,42958,42990,42995,43004],{"type":17,"tag":84,"props":42931,"children":42932},{},[42933],{"type":23,"value":42934},"Log in to your Unified.to dashboard",{"type":17,"tag":84,"props":42936,"children":42937},{},[42938,42940,42945],{"type":23,"value":42939},"Navigate to ",{"type":17,"tag":48,"props":42941,"children":42942},{},[42943],{"type":23,"value":42944},"Integrations",{"type":23,"value":54},{"type":17,"tag":84,"props":42947,"children":42948},{},[42949,42951,42956],{"type":23,"value":42950},"Select ",{"type":17,"tag":48,"props":42952,"children":42953},{},[42954],{"type":23,"value":42955},"HighLevel",{"type":23,"value":42957}," as the integration",{"type":17,"tag":84,"props":42959,"children":42960},{},[42961,42962],{"type":23,"value":42103},{"type":17,"tag":80,"props":42963,"children":42964},{},[42965,42974,42982],{"type":17,"tag":84,"props":42966,"children":42967},{},[42968,42972],{"type":17,"tag":48,"props":42969,"children":42970},{},[42971],{"type":23,"value":6040},{"type":23,"value":42973}," (from HighLevel)",{"type":17,"tag":84,"props":42975,"children":42976},{},[42977,42981],{"type":17,"tag":48,"props":42978,"children":42979},{},[42980],{"type":23,"value":6045},{"type":23,"value":42973},{"type":17,"tag":84,"props":42983,"children":42984},{},[42985,42989],{"type":17,"tag":48,"props":42986,"children":42987},{},[42988],{"type":23,"value":42903},{"type":23,"value":42973},{"type":17,"tag":84,"props":42991,"children":42992},{},[42993],{"type":23,"value":42994},"Click Activate",{"type":17,"tag":84,"props":42996,"children":42997},{},[42998,42999,43003],{"type":23,"value":6661},{"type":17,"tag":48,"props":43000,"children":43001},{},[43002],{"type":23,"value":6666},{"type":23,"value":54},{"type":17,"tag":84,"props":43005,"children":43006},{},[43007,43008,43012],{"type":23,"value":6629},{"type":17,"tag":48,"props":43009,"children":43010},{},[43011],{"type":23,"value":42955},{"type":23,"value":54},{"type":17,"tag":25,"props":43014,"children":43015},{},[],{"type":17,"tag":68,"props":43017,"children":43019},{"id":43018},"step-4-authorize-the-connection",[43020],{"type":23,"value":43021},"Step 4: Authorize the Connection",{"type":17,"tag":6154,"props":43023,"children":43024},{},[43025,43030,43035,43040],{"type":17,"tag":84,"props":43026,"children":43027},{},[43028],{"type":23,"value":43029},"You will be redirected to HighLevel",{"type":17,"tag":84,"props":43031,"children":43032},{},[43033],{"type":23,"value":43034},"Log in (if not already logged in)",{"type":17,"tag":84,"props":43036,"children":43037},{},[43038],{"type":23,"value":43039},"Select the account/location you want to connect",{"type":17,"tag":84,"props":43041,"children":43042},{},[43043],{"type":23,"value":43044},"Approve the requested permissions",{"type":17,"tag":29,"props":43046,"children":43047},{},[43048],{"type":23,"value":43049},"Once approved, you will be redirected back to Unified.to",{"type":17,"tag":25,"props":43051,"children":43052},{},[],{"type":17,"tag":68,"props":43054,"children":43056},{"id":43055},"common-issues-troubleshooting",[43057],{"type":23,"value":43058},"Common Issues & Troubleshooting",{"type":17,"tag":239,"props":43060,"children":43062},{"id":43061},"_1-invalid-redirect-uri",[43063],{"type":23,"value":43064},"1. Invalid Redirect URI",{"type":17,"tag":80,"props":43066,"children":43067},{},[43068],{"type":17,"tag":84,"props":43069,"children":43070},{},[43071],{"type":23,"value":43072},"Ensure the redirect URL in HighLevel exactly matches the one used by Unified.to",{"type":17,"tag":239,"props":43074,"children":43076},{"id":43075},"_2-unauthorized-401-errors",[43077],{"type":23,"value":43078},"2. Unauthorized / 401 Errors",{"type":17,"tag":80,"props":43080,"children":43081},{},[43082,43087],{"type":17,"tag":84,"props":43083,"children":43084},{},[43085],{"type":23,"value":43086},"Double-check Client ID and Client Secret",{"type":17,"tag":84,"props":43088,"children":43089},{},[43090],{"type":23,"value":43091},"Ensure the OAuth app is active",{"type":17,"tag":239,"props":43093,"children":43095},{"id":43094},"_3-missing-data",[43096],{"type":23,"value":43097},"3. Missing Data",{"type":17,"tag":80,"props":43099,"children":43100},{},[43101,43106],{"type":17,"tag":84,"props":43102,"children":43103},{},[43104],{"type":23,"value":43105},"Ensure correct scopes are selected in HighLevel",{"type":17,"tag":84,"props":43107,"children":43108},{},[43109],{"type":23,"value":43110},"Some data may depend on the selected location/account",{"type":17,"tag":25,"props":43112,"children":43113},{},[],{"type":17,"tag":68,"props":43115,"children":43116},{"id":6698},[43117],{"type":23,"value":6701},{"type":17,"tag":80,"props":43119,"children":43120},{},[43121,43126],{"type":17,"tag":84,"props":43122,"children":43123},{},[43124],{"type":23,"value":43125},"HighLevel uses location-based access. Make sure you select the correct location during authorization",{"type":17,"tag":84,"props":43127,"children":43128},{},[43129],{"type":23,"value":43130},"You can create multiple connections for different locations if needed",{"type":17,"tag":25,"props":43132,"children":43133},{},[],{"type":17,"tag":29,"props":43135,"children":43136},{},[43137],{"type":23,"value":43138},"If you run into issues, reach out to the Unified.to support team with:",{"type":17,"tag":80,"props":43140,"children":43141},{},[43142,43147,43152],{"type":17,"tag":84,"props":43143,"children":43144},{},[43145],{"type":23,"value":43146},"Connection ID",{"type":17,"tag":84,"props":43148,"children":43149},{},[43150],{"type":23,"value":43151},"Error logs",{"type":17,"tag":84,"props":43153,"children":43154},{},[43155],{"type":23,"value":43156},"Steps to reproduce",{"title":7,"searchDepth":1629,"depth":1629,"links":43158},[43159,43160,43161,43162,43163,43164,43169],{"id":42649,"depth":1629,"text":42652},{"id":42692,"depth":1629,"text":42695},{"id":42854,"depth":1629,"text":42857},{"id":42923,"depth":1629,"text":42926},{"id":43018,"depth":1629,"text":43021},{"id":43055,"depth":1629,"text":43058,"children":43165},[43166,43167,43168],{"id":43061,"depth":1635,"text":43064},{"id":43075,"depth":1635,"text":43078},{"id":43094,"depth":1635,"text":43097},{"id":6698,"depth":1629,"text":6701},"content:blog:how_to_create_a_unified_connection_to_highlevel.md","blog/how_to_create_a_unified_connection_to_highlevel.md","blog/how_to_create_a_unified_connection_to_highlevel",{"_path":43174,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":43175,"description":43176,"img":43177,"date":43178,"tag":12,"body":43179,"_type":1677,"_id":44528,"_source":1679,"_file":44529,"_stem":44530,"_extension":1682},"/blog/best_tools_for_giving_ai_agents_access_to_saas_apis","Best Tools for Giving AI Agents Access to SaaS APIs","AI agents are only as powerful as the systems they can access.","https://s3.us-east-2.amazonaws.com/unified-article-images/best_tools_for_giving_ai_agents_access_to_saas_apis-icon.png","2026-03-17T23:40:00.000Z",{"type":14,"children":43180,"toc":44491},[43181,43186,43189,43197,43201,43206,43211,43223,43229,43411,43417,43429,43500,43505,43509,43515,43530,43541,43552,43563,43569,43576,43594,43602,43642,43650,43663,43671,43684,43692,43705,43711,43716,43754,43760,43769,43783,43789,43812,43816,43846,43852,43862,43876,43881,43904,43908,43939,43945,43954,43968,43973,43991,43996,44014,44020,44029,44038,44043,44061,44066,44084,44090,44099,44108,44113,44131,44136,44154,44160,44166,44189,44195,44219,44225,44248,44254,44289,44301,44307,44318,44341,44350,44363,44372,44385,44394,44407,44412,44424,44429,44452,44457,44462,44467,44473,44482],{"type":17,"tag":18,"props":43182,"children":43184},{"id":43183},"best-tools-for-giving-ai-agents-access-to-saas-apis",[43185],{"type":23,"value":43175},{"type":17,"tag":25,"props":43187,"children":43188},{},[],{"type":17,"tag":29,"props":43190,"children":43191},{},[43192],{"type":17,"tag":33,"props":43193,"children":43194},{},[43195],{"type":23,"value":43196},"March 17, 2026",{"type":17,"tag":29,"props":43198,"children":43199},{},[43200],{"type":23,"value":43176},{"type":17,"tag":29,"props":43202,"children":43203},{},[43204],{"type":23,"value":43205},"If your agent can't reliably read from or write to tools like Salesforce, Slack, Google Drive, or Workday, it becomes a demo—not a production system.",{"type":17,"tag":29,"props":43207,"children":43208},{},[43209],{"type":23,"value":43210},"The challenge is not calling APIs. It's handling authentication, normalization, real-time data access, and safe execution across dozens or hundreds of SaaS platforms.",{"type":17,"tag":29,"props":43212,"children":43213},{},[43214,43216,43221],{"type":23,"value":43215},"This guide breaks down the ",{"type":17,"tag":48,"props":43217,"children":43218},{},[43219],{"type":23,"value":43220},"best tools for giving AI agents access to SaaS APIs",{"type":23,"value":43222},", and more importantly, which architecture actually works in production.",{"type":17,"tag":68,"props":43224,"children":43226},{"id":43225},"tldr-best-tools-for-ai-agent-saas-api-access",[43227],{"type":23,"value":43228},"TL;DR: Best Tools for AI Agent → SaaS API Access",{"type":17,"tag":7231,"props":43230,"children":43231},{},[43232,43258],{"type":17,"tag":7235,"props":43233,"children":43234},{},[43235],{"type":17,"tag":7239,"props":43236,"children":43237},{},[43238,43243,43248,43253],{"type":17,"tag":7243,"props":43239,"children":43240},{},[43241],{"type":23,"value":43242},"Platform",{"type":17,"tag":7243,"props":43244,"children":43245},{},[43246],{"type":23,"value":43247},"Best For",{"type":17,"tag":7243,"props":43249,"children":43250},{},[43251],{"type":23,"value":43252},"Key Strength",{"type":17,"tag":7243,"props":43254,"children":43255},{},[43256],{"type":23,"value":43257},"Limitation",{"type":17,"tag":7259,"props":43259,"children":43260},{},[43261,43286,43311,43336,43361,43386],{"type":17,"tag":7239,"props":43262,"children":43263},{},[43264,43271,43276,43281],{"type":17,"tag":7266,"props":43265,"children":43266},{},[43267],{"type":17,"tag":48,"props":43268,"children":43269},{},[43270],{"type":23,"value":217},{"type":17,"tag":7266,"props":43272,"children":43273},{},[43274],{"type":23,"value":43275},"Real-time SaaS data access across many categories",{"type":17,"tag":7266,"props":43277,"children":43278},{},[43279],{"type":23,"value":43280},"Unified schemas + real-time read/write + MCP",{"type":17,"tag":7266,"props":43282,"children":43283},{},[43284],{"type":23,"value":43285},"Not just a tool layer (full infra)",{"type":17,"tag":7239,"props":43287,"children":43288},{},[43289,43296,43301,43306],{"type":17,"tag":7266,"props":43290,"children":43291},{},[43292],{"type":17,"tag":48,"props":43293,"children":43294},{},[43295],{"type":23,"value":1015},{"type":17,"tag":7266,"props":43297,"children":43298},{},[43299],{"type":23,"value":43300},"Agent-native tool execution",{"type":17,"tag":7266,"props":43302,"children":43303},{},[43304],{"type":23,"value":43305},"MCP + tool calling UX",{"type":17,"tag":7266,"props":43307,"children":43308},{},[43309],{"type":23,"value":43310},"Limited data architecture depth",{"type":17,"tag":7239,"props":43312,"children":43313},{},[43314,43321,43326,43331],{"type":17,"tag":7266,"props":43315,"children":43316},{},[43317],{"type":17,"tag":48,"props":43318,"children":43319},{},[43320],{"type":23,"value":1025},{"type":17,"tag":7266,"props":43322,"children":43323},{},[43324],{"type":23,"value":43325},"OAuth + custom integrations",{"type":17,"tag":7266,"props":43327,"children":43328},{},[43329],{"type":23,"value":43330},"Strong auth + sync infra",{"type":17,"tag":7266,"props":43332,"children":43333},{},[43334],{"type":23,"value":43335},"Requires building data layer",{"type":17,"tag":7239,"props":43337,"children":43338},{},[43339,43346,43351,43356],{"type":17,"tag":7266,"props":43340,"children":43341},{},[43342],{"type":17,"tag":48,"props":43343,"children":43344},{},[43345],{"type":23,"value":227},{"type":17,"tag":7266,"props":43347,"children":43348},{},[43349],{"type":23,"value":43350},"Structured business data (HR/CRM)",{"type":17,"tag":7266,"props":43352,"children":43353},{},[43354],{"type":23,"value":43355},"Deep normalized schemas",{"type":17,"tag":7266,"props":43357,"children":43358},{},[43359],{"type":23,"value":43360},"Sync-based, not real-time",{"type":17,"tag":7239,"props":43362,"children":43363},{},[43364,43371,43376,43381],{"type":17,"tag":7266,"props":43365,"children":43366},{},[43367],{"type":17,"tag":48,"props":43368,"children":43369},{},[43370],{"type":23,"value":486},{"type":17,"tag":7266,"props":43372,"children":43373},{},[43374],{"type":23,"value":43375},"Simple automations",{"type":17,"tag":7266,"props":43377,"children":43378},{},[43379],{"type":23,"value":43380},"Massive app ecosystem",{"type":17,"tag":7266,"props":43382,"children":43383},{},[43384],{"type":23,"value":43385},"Not designed for production agents",{"type":17,"tag":7239,"props":43387,"children":43388},{},[43389,43396,43401,43406],{"type":17,"tag":7266,"props":43390,"children":43391},{},[43392],{"type":17,"tag":48,"props":43393,"children":43394},{},[43395],{"type":23,"value":390},{"type":17,"tag":7266,"props":43397,"children":43398},{},[43399],{"type":23,"value":43400},"Enterprise workflows",{"type":17,"tag":7266,"props":43402,"children":43403},{},[43404],{"type":23,"value":43405},"Governance + automation",{"type":17,"tag":7266,"props":43407,"children":43408},{},[43409],{"type":23,"value":43410},"Low-code, not dev-first",{"type":17,"tag":68,"props":43412,"children":43414},{"id":43413},"what-ai-agents-actually-need-and-most-tools-miss",[43415],{"type":23,"value":43416},"What AI Agents Actually Need (and Most Tools Miss)",{"type":17,"tag":29,"props":43418,"children":43419},{},[43420,43422,43427],{"type":23,"value":43421},"Most tools solve ",{"type":17,"tag":48,"props":43423,"children":43424},{},[43425],{"type":23,"value":43426},"one layer",{"type":23,"value":43428}," of the problem. Production AI agents need all of them:",{"type":17,"tag":80,"props":43430,"children":43431},{},[43432,43446,43454,43462,43470,43484,43492],{"type":17,"tag":84,"props":43433,"children":43434},{},[43435],{"type":17,"tag":48,"props":43436,"children":43437},{},[43438,43440,43444],{"type":23,"value":43439},"Authentication (",{"type":17,"tag":133,"props":43441,"children":43442},{"href":779},[43443],{"type":23,"value":782},{"type":23,"value":43445},", API keys, multi-tenant)",{"type":17,"tag":84,"props":43447,"children":43448},{},[43449],{"type":17,"tag":48,"props":43450,"children":43451},{},[43452],{"type":23,"value":43453},"Real-time data access (not batch syncs)",{"type":17,"tag":84,"props":43455,"children":43456},{},[43457],{"type":17,"tag":48,"props":43458,"children":43459},{},[43460],{"type":23,"value":43461},"Normalized schemas (LLMs need consistency)",{"type":17,"tag":84,"props":43463,"children":43464},{},[43465],{"type":17,"tag":48,"props":43466,"children":43467},{},[43468],{"type":23,"value":43469},"Read + write capabilities (agents must act, not just read)",{"type":17,"tag":84,"props":43471,"children":43472},{},[43473],{"type":17,"tag":48,"props":43474,"children":43475},{},[43476,43478,43482],{"type":23,"value":43477},"Tool calling / ",{"type":17,"tag":133,"props":43479,"children":43480},{"href":326},[43481],{"type":23,"value":329},{"type":23,"value":43483}," compatibility",{"type":17,"tag":84,"props":43485,"children":43486},{},[43487],{"type":17,"tag":48,"props":43488,"children":43489},{},[43490],{"type":23,"value":43491},"Observability + error handling",{"type":17,"tag":84,"props":43493,"children":43494},{},[43495],{"type":17,"tag":48,"props":43496,"children":43497},{},[43498],{"type":23,"value":43499},"Security + compliance (SOC 2, GDPR, etc.)",{"type":17,"tag":29,"props":43501,"children":43502},{},[43503],{"type":23,"value":43504},"If one layer is missing, you end up building it yourself.",{"type":17,"tag":11616,"props":43506,"children":43508},{"width":11618,"height":11619,"src":43507,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/Z8_dsrpIJ7I",[],{"type":17,"tag":68,"props":43510,"children":43512},{"id":43511},"_1-unifiedto-best-for-real-time-multi-system-ai-agents",[43513],{"type":23,"value":43514},"1. Unified.to — Best for Real-Time, Multi-System AI Agents",{"type":17,"tag":29,"props":43516,"children":43517},{},[43518,43523,43525],{"type":17,"tag":48,"props":43519,"children":43520},{},[43521],{"type":23,"value":43522},"Best for:",{"type":23,"value":43524}," B2B SaaS teams building AI agents that need ",{"type":17,"tag":48,"props":43526,"children":43527},{},[43528],{"type":23,"value":43529},"live, read/write access across many SaaS systems",{"type":17,"tag":29,"props":43531,"children":43532},{},[43533,43535,43540],{"type":23,"value":43534},"Unified is not just a connector or tool wrapper. It is a ",{"type":17,"tag":48,"props":43536,"children":43537},{},[43538],{"type":23,"value":43539},"real-time integration infrastructure layer",{"type":23,"value":54},{"type":17,"tag":29,"props":43542,"children":43543},{},[43544,43545],{"type":23,"value":1609},{"type":17,"tag":133,"props":43546,"children":43549},{"href":43547,"rel":43548},"https://docs.unified.to/",[214],[43550],{"type":23,"value":43551},"Unified Documentation",{"type":17,"tag":29,"props":43553,"children":43554},{},[43555,43556],{"type":23,"value":1609},{"type":17,"tag":133,"props":43557,"children":43560},{"href":43558,"rel":43559},"https://docs.unified.to/mcp",[214],[43561],{"type":23,"value":43562},"Unified MCP Server",{"type":17,"tag":239,"props":43564,"children":43566},{"id":43565},"why-it-stands-out",[43567],{"type":23,"value":43568},"Why it stands out",{"type":17,"tag":29,"props":43570,"children":43571},{},[43572],{"type":17,"tag":48,"props":43573,"children":43574},{},[43575],{"type":23,"value":13405},{"type":17,"tag":80,"props":43577,"children":43578},{},[43579,43584,43589],{"type":17,"tag":84,"props":43580,"children":43581},{},[43582],{"type":23,"value":43583},"Every request hits the source API live",{"type":17,"tag":84,"props":43585,"children":43586},{},[43587],{"type":23,"value":43588},"No caching, no sync jobs, no stale data",{"type":17,"tag":84,"props":43590,"children":43591},{},[43592],{"type":23,"value":43593},"Critical for AI agents making decisions in real time",{"type":17,"tag":29,"props":43595,"children":43596},{},[43597],{"type":17,"tag":48,"props":43598,"children":43599},{},[43600],{"type":23,"value":43601},"Unified schemas across 415+ integrations",{"type":17,"tag":80,"props":43603,"children":43604},{},[43605,43610,43615],{"type":17,"tag":84,"props":43606,"children":43607},{},[43608],{"type":23,"value":43609},"CRM, HRIS, ATS, messaging, file storage, and more",{"type":17,"tag":84,"props":43611,"children":43612},{},[43613],{"type":23,"value":43614},"Same object structure across providers",{"type":17,"tag":84,"props":43616,"children":43617},{},[43618,43620,43626,43627,43633,43634,43640],{"type":23,"value":43619},"Example: ",{"type":17,"tag":6121,"props":43621,"children":43623},{"className":43622},[],[43624],{"type":23,"value":43625},"contact",{"type":23,"value":11826},{"type":17,"tag":6121,"props":43628,"children":43630},{"className":43629},[],[43631],{"type":23,"value":43632},"deal",{"type":23,"value":11826},{"type":17,"tag":6121,"props":43635,"children":43637},{"className":43636},[],[43638],{"type":23,"value":43639},"employee",{"type":23,"value":43641}," work the same across systems",{"type":17,"tag":29,"props":43643,"children":43644},{},[43645],{"type":17,"tag":48,"props":43646,"children":43647},{},[43648],{"type":23,"value":43649},"Read + write support",{"type":17,"tag":80,"props":43651,"children":43652},{},[43653,43658],{"type":17,"tag":84,"props":43654,"children":43655},{},[43656],{"type":23,"value":43657},"Agents can take actions (not just retrieve data)",{"type":17,"tag":84,"props":43659,"children":43660},{},[43661],{"type":23,"value":43662},"Update records, create workflows, trigger actions",{"type":17,"tag":29,"props":43664,"children":43665},{},[43666],{"type":17,"tag":48,"props":43667,"children":43668},{},[43669],{"type":23,"value":43670},"Zero-storage design",{"type":17,"tag":80,"props":43672,"children":43673},{},[43674,43679],{"type":17,"tag":84,"props":43675,"children":43676},{},[43677],{"type":23,"value":43678},"No customer data stored",{"type":17,"tag":84,"props":43680,"children":43681},{},[43682],{"type":23,"value":43683},"Reduces compliance scope (GDPR, SOC 2, HIPAA)",{"type":17,"tag":29,"props":43685,"children":43686},{},[43687],{"type":17,"tag":48,"props":43688,"children":43689},{},[43690],{"type":23,"value":43691},"Built for AI (MCP + tool execution)",{"type":17,"tag":80,"props":43693,"children":43694},{},[43695,43700],{"type":17,"tag":84,"props":43696,"children":43697},{},[43698],{"type":23,"value":43699},"MCP server exposes integrations as callable tools",{"type":17,"tag":84,"props":43701,"children":43702},{},[43703],{"type":23,"value":43704},"Works with Claude, GPT, Gemini, Cohere",{"type":17,"tag":239,"props":43706,"children":43708},{"id":43707},"where-it-fits",[43709],{"type":23,"value":43710},"Where it fits",{"type":17,"tag":29,"props":43712,"children":43713},{},[43714],{"type":23,"value":43715},"Unified is strongest when:",{"type":17,"tag":80,"props":43717,"children":43718},{},[43719,43729,43739,43749],{"type":17,"tag":84,"props":43720,"children":43721},{},[43722,43724],{"type":23,"value":43723},"your agent needs ",{"type":17,"tag":48,"props":43725,"children":43726},{},[43727],{"type":23,"value":43728},"fresh data, not synced snapshots",{"type":17,"tag":84,"props":43730,"children":43731},{},[43732,43734],{"type":23,"value":43733},"you support ",{"type":17,"tag":48,"props":43735,"children":43736},{},[43737],{"type":23,"value":43738},"multiple SaaS categories",{"type":17,"tag":84,"props":43740,"children":43741},{},[43742,43744],{"type":23,"value":43743},"you need ",{"type":17,"tag":48,"props":43745,"children":43746},{},[43747],{"type":23,"value":43748},"consistent schemas for LLM reliability",{"type":17,"tag":84,"props":43750,"children":43751},{},[43752],{"type":23,"value":43753},"you want to avoid building integration infrastructure",{"type":17,"tag":68,"props":43755,"children":43757},{"id":43756},"_2-composio-best-for-agent-native-tool-calling",[43758],{"type":23,"value":43759},"2. Composio — Best for Agent-Native Tool Calling",{"type":17,"tag":29,"props":43761,"children":43762},{},[43763,43764],{"type":23,"value":1609},{"type":17,"tag":133,"props":43765,"children":43767},{"href":1011,"rel":43766},[214],[43768],{"type":23,"value":1015},{"type":17,"tag":29,"props":43770,"children":43771},{},[43772,43776,43778],{"type":17,"tag":48,"props":43773,"children":43774},{},[43775],{"type":23,"value":43522},{"type":23,"value":43777}," teams focused on ",{"type":17,"tag":48,"props":43779,"children":43780},{},[43781],{"type":23,"value":43782},"tool execution + MCP-first agents",{"type":17,"tag":239,"props":43784,"children":43786},{"id":43785},"strengths",[43787],{"type":23,"value":43788},"Strengths",{"type":17,"tag":80,"props":43790,"children":43791},{},[43792,43797,43802,43807],{"type":17,"tag":84,"props":43793,"children":43794},{},[43795],{"type":23,"value":43796},"MCP-native architecture",{"type":17,"tag":84,"props":43798,"children":43799},{},[43800],{"type":23,"value":43801},"Pre-built tool definitions for LLMs",{"type":17,"tag":84,"props":43803,"children":43804},{},[43805],{"type":23,"value":43806},"Strong SDK experience (Python, TypeScript)",{"type":17,"tag":84,"props":43808,"children":43809},{},[43810],{"type":23,"value":43811},"Event-driven agent workflows",{"type":17,"tag":239,"props":43813,"children":43814},{"id":437},[43815],{"type":23,"value":440},{"type":17,"tag":80,"props":43817,"children":43818},{},[43819,43831,43841],{"type":17,"tag":84,"props":43820,"children":43821},{},[43822,43824,43829],{"type":23,"value":43823},"Focused on ",{"type":17,"tag":48,"props":43825,"children":43826},{},[43827],{"type":23,"value":43828},"tool execution layer",{"type":23,"value":43830},", not full data architecture",{"type":17,"tag":84,"props":43832,"children":43833},{},[43834,43836],{"type":23,"value":43835},"Less emphasis on ",{"type":17,"tag":48,"props":43837,"children":43838},{},[43839],{"type":23,"value":43840},"normalized data across categories",{"type":17,"tag":84,"props":43842,"children":43843},{},[43844],{"type":23,"value":43845},"May require additional infrastructure for complex SaaS data use cases",{"type":17,"tag":68,"props":43847,"children":43849},{"id":43848},"_3-nango-best-for-oauth-and-custom-integration-infrastructure",[43850],{"type":23,"value":43851},"3. Nango — Best for OAuth and Custom Integration Infrastructure",{"type":17,"tag":29,"props":43853,"children":43854},{},[43855,43856],{"type":23,"value":1609},{"type":17,"tag":133,"props":43857,"children":43860},{"href":43858,"rel":43859},"https://nango.dev/",[214],[43861],{"type":23,"value":1025},{"type":17,"tag":29,"props":43863,"children":43864},{},[43865,43869,43871],{"type":17,"tag":48,"props":43866,"children":43867},{},[43868],{"type":23,"value":43522},{"type":23,"value":43870}," teams that want to ",{"type":17,"tag":48,"props":43872,"children":43873},{},[43874],{"type":23,"value":43875},"own their integrations but outsource OAuth complexity",{"type":17,"tag":239,"props":43877,"children":43879},{"id":43878},"strengths-1",[43880],{"type":23,"value":43788},{"type":17,"tag":80,"props":43882,"children":43883},{},[43884,43889,43899],{"type":17,"tag":84,"props":43885,"children":43886},{},[43887],{"type":23,"value":43888},"OAuth lifecycle management (refresh, storage, scopes)",{"type":17,"tag":84,"props":43890,"children":43891},{},[43892,43897],{"type":17,"tag":133,"props":43893,"children":43894},{"href":4999},[43895],{"type":23,"value":43896},"Webhooks",{"type":23,"value":43898}," + sync infrastructure",{"type":17,"tag":84,"props":43900,"children":43901},{},[43902],{"type":23,"value":43903},"700+ API connectors",{"type":17,"tag":239,"props":43905,"children":43906},{"id":523},[43907],{"type":23,"value":440},{"type":17,"tag":80,"props":43909,"children":43910},{},[43911,43916],{"type":17,"tag":84,"props":43912,"children":43913},{},[43914],{"type":23,"value":43915},"Not a full unified API layer",{"type":17,"tag":84,"props":43917,"children":43918},{},[43919,43921],{"type":23,"value":43920},"You still need to:\n",{"type":17,"tag":80,"props":43922,"children":43923},{},[43924,43929,43934],{"type":17,"tag":84,"props":43925,"children":43926},{},[43927],{"type":23,"value":43928},"normalize schemas",{"type":17,"tag":84,"props":43930,"children":43931},{},[43932],{"type":23,"value":43933},"build data models",{"type":17,"tag":84,"props":43935,"children":43936},{},[43937],{"type":23,"value":43938},"manage consistency across APIs",{"type":17,"tag":68,"props":43940,"children":43942},{"id":43941},"_4-merge-best-for-structured-business-data-hr-crm",[43943],{"type":23,"value":43944},"4. Merge — Best for Structured Business Data (HR, CRM)",{"type":17,"tag":29,"props":43946,"children":43947},{},[43948,43949],{"type":23,"value":1609},{"type":17,"tag":133,"props":43950,"children":43952},{"href":223,"rel":43951},[214],[43953],{"type":23,"value":227},{"type":17,"tag":29,"props":43955,"children":43956},{},[43957,43961,43963],{"type":17,"tag":48,"props":43958,"children":43959},{},[43960],{"type":23,"value":43522},{"type":23,"value":43962}," SaaS products focused on ",{"type":17,"tag":48,"props":43964,"children":43965},{},[43966],{"type":23,"value":43967},"HRIS, CRM, or accounting data",{"type":17,"tag":239,"props":43969,"children":43971},{"id":43970},"strengths-2",[43972],{"type":23,"value":43788},{"type":17,"tag":80,"props":43974,"children":43975},{},[43976,43981,43986],{"type":17,"tag":84,"props":43977,"children":43978},{},[43979],{"type":23,"value":43980},"Deep normalized schemas in specific categories",{"type":17,"tag":84,"props":43982,"children":43983},{},[43984],{"type":23,"value":43985},"Strong enterprise adoption",{"type":17,"tag":84,"props":43987,"children":43988},{},[43989],{"type":23,"value":43990},"Good for analytics + data syncing",{"type":17,"tag":239,"props":43992,"children":43994},{"id":43993},"limitations-2",[43995],{"type":23,"value":440},{"type":17,"tag":80,"props":43997,"children":43998},{},[43999,44004,44009],{"type":17,"tag":84,"props":44000,"children":44001},{},[44002],{"type":23,"value":44003},"Sync-based architecture (not fully real-time)",{"type":17,"tag":84,"props":44005,"children":44006},{},[44007],{"type":23,"value":44008},"Limited flexibility outside predefined models",{"type":17,"tag":84,"props":44010,"children":44011},{},[44012],{"type":23,"value":44013},"Less suited for dynamic AI agent workflows",{"type":17,"tag":68,"props":44015,"children":44017},{"id":44016},"_5-zapier-best-for-simple-automation-workflows",[44018],{"type":23,"value":44019},"5. Zapier — Best for Simple Automation Workflows",{"type":17,"tag":29,"props":44021,"children":44022},{},[44023,44024],{"type":23,"value":1609},{"type":17,"tag":133,"props":44025,"children":44027},{"href":482,"rel":44026},[214],[44028],{"type":23,"value":486},{"type":17,"tag":29,"props":44030,"children":44031},{},[44032,44036],{"type":17,"tag":48,"props":44033,"children":44034},{},[44035],{"type":23,"value":43522},{"type":23,"value":44037}," non-technical or lightweight automation use cases",{"type":17,"tag":239,"props":44039,"children":44041},{"id":44040},"strengths-3",[44042],{"type":23,"value":43788},{"type":17,"tag":80,"props":44044,"children":44045},{},[44046,44051,44056],{"type":17,"tag":84,"props":44047,"children":44048},{},[44049],{"type":23,"value":44050},"8,000+ app integrations",{"type":17,"tag":84,"props":44052,"children":44053},{},[44054],{"type":23,"value":44055},"Easy to use",{"type":17,"tag":84,"props":44057,"children":44058},{},[44059],{"type":23,"value":44060},"Quick prototyping",{"type":17,"tag":239,"props":44062,"children":44064},{"id":44063},"limitations-3",[44065],{"type":23,"value":440},{"type":17,"tag":80,"props":44067,"children":44068},{},[44069,44074,44079],{"type":17,"tag":84,"props":44070,"children":44071},{},[44072],{"type":23,"value":44073},"Not built for production AI agents",{"type":17,"tag":84,"props":44075,"children":44076},{},[44077],{"type":23,"value":44078},"No structured tool calling",{"type":17,"tag":84,"props":44080,"children":44081},{},[44082],{"type":23,"value":44083},"Limited observability and control",{"type":17,"tag":68,"props":44085,"children":44087},{"id":44086},"_6-workato-best-for-enterprise-automation",[44088],{"type":23,"value":44089},"6. Workato — Best for Enterprise Automation",{"type":17,"tag":29,"props":44091,"children":44092},{},[44093,44094],{"type":23,"value":1609},{"type":17,"tag":133,"props":44095,"children":44097},{"href":386,"rel":44096},[214],[44098],{"type":23,"value":390},{"type":17,"tag":29,"props":44100,"children":44101},{},[44102,44106],{"type":17,"tag":48,"props":44103,"children":44104},{},[44105],{"type":23,"value":43522},{"type":23,"value":44107}," large enterprises needing governance and workflow automation",{"type":17,"tag":239,"props":44109,"children":44111},{"id":44110},"strengths-4",[44112],{"type":23,"value":43788},{"type":17,"tag":80,"props":44114,"children":44115},{},[44116,44121,44126],{"type":17,"tag":84,"props":44117,"children":44118},{},[44119],{"type":23,"value":44120},"Enterprise-grade automation",{"type":17,"tag":84,"props":44122,"children":44123},{},[44124],{"type":23,"value":44125},"Strong compliance and auditing",{"type":17,"tag":84,"props":44127,"children":44128},{},[44129],{"type":23,"value":44130},"Workflow orchestration",{"type":17,"tag":239,"props":44132,"children":44134},{"id":44133},"limitations-4",[44135],{"type":23,"value":440},{"type":17,"tag":80,"props":44137,"children":44138},{},[44139,44144,44149],{"type":17,"tag":84,"props":44140,"children":44141},{},[44142],{"type":23,"value":44143},"Low-code oriented",{"type":17,"tag":84,"props":44145,"children":44146},{},[44147],{"type":23,"value":44148},"Not optimized for developer-first AI agent systems",{"type":17,"tag":84,"props":44150,"children":44151},{},[44152],{"type":23,"value":44153},"Limited flexibility for custom agent architectures",{"type":17,"tag":68,"props":44155,"children":44157},{"id":44156},"key-architecture-tradeoffs",[44158],{"type":23,"value":44159},"Key Architecture Tradeoffs",{"type":17,"tag":239,"props":44161,"children":44163},{"id":44162},"tool-first-platforms-composio-zapier",[44164],{"type":23,"value":44165},"Tool-first platforms (Composio, Zapier)",{"type":17,"tag":80,"props":44167,"children":44168},{},[44169,44179],{"type":17,"tag":84,"props":44170,"children":44171},{},[44172,44174],{"type":23,"value":44173},"Focus on ",{"type":17,"tag":48,"props":44175,"children":44176},{},[44177],{"type":23,"value":44178},"execution",{"type":17,"tag":84,"props":44180,"children":44181},{},[44182,44184],{"type":23,"value":44183},"Weak on ",{"type":17,"tag":48,"props":44185,"children":44186},{},[44187],{"type":23,"value":44188},"data consistency",{"type":17,"tag":239,"props":44190,"children":44192},{"id":44191},"auth-first-platforms-nango",[44193],{"type":23,"value":44194},"Auth-first platforms (Nango)",{"type":17,"tag":80,"props":44196,"children":44197},{},[44198,44207],{"type":17,"tag":84,"props":44199,"children":44200},{},[44201,44203],{"type":23,"value":44202},"Solve ",{"type":17,"tag":48,"props":44204,"children":44205},{},[44206],{"type":23,"value":782},{"type":17,"tag":84,"props":44208,"children":44209},{},[44210,44212,44217],{"type":23,"value":44211},"Leave ",{"type":17,"tag":48,"props":44213,"children":44214},{},[44215],{"type":23,"value":44216},"data + logic",{"type":23,"value":44218}," to you",{"type":17,"tag":239,"props":44220,"children":44222},{"id":44221},"data-first-unified-apis-merge",[44223],{"type":23,"value":44224},"Data-first unified APIs (Merge)",{"type":17,"tag":80,"props":44226,"children":44227},{},[44228,44238],{"type":17,"tag":84,"props":44229,"children":44230},{},[44231,44233],{"type":23,"value":44232},"Strong ",{"type":17,"tag":48,"props":44234,"children":44235},{},[44236],{"type":23,"value":44237},"schemas",{"type":17,"tag":84,"props":44239,"children":44240},{},[44241,44243],{"type":23,"value":44242},"Limited ",{"type":17,"tag":48,"props":44244,"children":44245},{},[44246],{"type":23,"value":44247},"real-time + flexibility",{"type":17,"tag":239,"props":44249,"children":44251},{"id":44250},"real-time-unified-infrastructure-unifiedto",[44252],{"type":23,"value":44253},"Real-time unified infrastructure (Unified.to)",{"type":17,"tag":80,"props":44255,"children":44256},{},[44257],{"type":17,"tag":84,"props":44258,"children":44259},{},[44260,44262],{"type":23,"value":44261},"Combines:\n",{"type":17,"tag":80,"props":44263,"children":44264},{},[44265,44270,44274,44279,44284],{"type":17,"tag":84,"props":44266,"children":44267},{},[44268],{"type":23,"value":44269},"auth",{"type":17,"tag":84,"props":44271,"children":44272},{},[44273],{"type":23,"value":44237},{"type":17,"tag":84,"props":44275,"children":44276},{},[44277],{"type":23,"value":44278},"real-time access",{"type":17,"tag":84,"props":44280,"children":44281},{},[44282],{"type":23,"value":44283},"read/write actions",{"type":17,"tag":84,"props":44285,"children":44286},{},[44287],{"type":23,"value":44288},"MCP tools",{"type":17,"tag":29,"props":44290,"children":44291},{},[44292,44294,44299],{"type":23,"value":44293},"This is why it performs better in ",{"type":17,"tag":48,"props":44295,"children":44296},{},[44297],{"type":23,"value":44298},"production AI systems",{"type":23,"value":44300},", not just demos.",{"type":17,"tag":68,"props":44302,"children":44304},{"id":44303},"when-to-choose-each-approach",[44305],{"type":23,"value":44306},"When to Choose Each Approach",{"type":17,"tag":29,"props":44308,"children":44309},{},[44310,44312,44316],{"type":23,"value":44311},"Choose ",{"type":17,"tag":48,"props":44313,"children":44314},{},[44315],{"type":23,"value":217},{"type":23,"value":44317}," if:",{"type":17,"tag":80,"props":44319,"children":44320},{},[44321,44326,44331,44336],{"type":17,"tag":84,"props":44322,"children":44323},{},[44324],{"type":23,"value":44325},"your agent needs real-time SaaS data",{"type":17,"tag":84,"props":44327,"children":44328},{},[44329],{"type":23,"value":44330},"you support multiple SaaS categories",{"type":17,"tag":84,"props":44332,"children":44333},{},[44334],{"type":23,"value":44335},"you need consistent schemas for LLMs",{"type":17,"tag":84,"props":44337,"children":44338},{},[44339],{"type":23,"value":44340},"you want minimal integration maintenance",{"type":17,"tag":29,"props":44342,"children":44343},{},[44344,44345,44349],{"type":23,"value":44311},{"type":17,"tag":48,"props":44346,"children":44347},{},[44348],{"type":23,"value":1015},{"type":23,"value":44317},{"type":17,"tag":80,"props":44351,"children":44352},{},[44353,44358],{"type":17,"tag":84,"props":44354,"children":44355},{},[44356],{"type":23,"value":44357},"your focus is MCP tool execution",{"type":17,"tag":84,"props":44359,"children":44360},{},[44361],{"type":23,"value":44362},"you prioritize agent-native workflows",{"type":17,"tag":29,"props":44364,"children":44365},{},[44366,44367,44371],{"type":23,"value":44311},{"type":17,"tag":48,"props":44368,"children":44369},{},[44370],{"type":23,"value":1025},{"type":23,"value":44317},{"type":17,"tag":80,"props":44373,"children":44374},{},[44375,44380],{"type":17,"tag":84,"props":44376,"children":44377},{},[44378],{"type":23,"value":44379},"OAuth is your main problem",{"type":17,"tag":84,"props":44381,"children":44382},{},[44383],{"type":23,"value":44384},"you want to build your own integration layer",{"type":17,"tag":29,"props":44386,"children":44387},{},[44388,44389,44393],{"type":23,"value":44311},{"type":17,"tag":48,"props":44390,"children":44391},{},[44392],{"type":23,"value":227},{"type":23,"value":44317},{"type":17,"tag":80,"props":44395,"children":44396},{},[44397,44402],{"type":17,"tag":84,"props":44398,"children":44399},{},[44400],{"type":23,"value":44401},"you only need HR/CRM/accounting data",{"type":17,"tag":84,"props":44403,"children":44404},{},[44405],{"type":23,"value":44406},"batch/sync data is acceptable",{"type":17,"tag":68,"props":44408,"children":44409},{"id":1552},[44410],{"type":23,"value":44411},"Final Thoughts",{"type":17,"tag":29,"props":44413,"children":44414},{},[44415,44417,44422],{"type":23,"value":44416},"The biggest mistake teams make is choosing tools based on ",{"type":17,"tag":48,"props":44418,"children":44419},{},[44420],{"type":23,"value":44421},"what's easiest to start",{"type":23,"value":44423},", not what works at scale.",{"type":17,"tag":29,"props":44425,"children":44426},{},[44427],{"type":23,"value":44428},"AI agents introduce new constraints:",{"type":17,"tag":80,"props":44430,"children":44431},{},[44432,44437,44442,44447],{"type":17,"tag":84,"props":44433,"children":44434},{},[44435],{"type":23,"value":44436},"they need consistent schemas",{"type":17,"tag":84,"props":44438,"children":44439},{},[44440],{"type":23,"value":44441},"they require deterministic tool execution",{"type":17,"tag":84,"props":44443,"children":44444},{},[44445],{"type":23,"value":44446},"they depend on fresh, real-time data",{"type":17,"tag":84,"props":44448,"children":44449},{},[44450],{"type":23,"value":44451},"they must safely perform actions",{"type":17,"tag":29,"props":44453,"children":44454},{},[44455],{"type":23,"value":44456},"Most tools solve one of these.",{"type":17,"tag":29,"props":44458,"children":44459},{},[44460],{"type":23,"value":44461},"Very few solve all of them together.",{"type":17,"tag":29,"props":44463,"children":44464},{},[44465],{"type":23,"value":44466},"That's why the architecture you choose matters more than the tool itself.",{"type":17,"tag":68,"props":44468,"children":44470},{"id":44469},"next-steps",[44471],{"type":23,"value":44472},"Next Steps",{"type":17,"tag":29,"props":44474,"children":44475},{},[44476],{"type":17,"tag":133,"props":44477,"children":44479},{"href":1612,"rel":44478},[214],[44480],{"type":23,"value":44481},"→ Start your 30-day free trial",{"type":17,"tag":29,"props":44483,"children":44484},{},[44485],{"type":17,"tag":133,"props":44486,"children":44488},{"href":1623,"rel":44487},[214],[44489],{"type":23,"value":44490},"→ Book a demo",{"title":7,"searchDepth":1629,"depth":1629,"links":44492},[44493,44494,44495,44499,44503,44507,44511,44515,44519,44525,44526,44527],{"id":43225,"depth":1629,"text":43228},{"id":43413,"depth":1629,"text":43416},{"id":43511,"depth":1629,"text":43514,"children":44496},[44497,44498],{"id":43565,"depth":1635,"text":43568},{"id":43707,"depth":1635,"text":43710},{"id":43756,"depth":1629,"text":43759,"children":44500},[44501,44502],{"id":43785,"depth":1635,"text":43788},{"id":437,"depth":1635,"text":440},{"id":43848,"depth":1629,"text":43851,"children":44504},[44505,44506],{"id":43878,"depth":1635,"text":43788},{"id":523,"depth":1635,"text":440},{"id":43941,"depth":1629,"text":43944,"children":44508},[44509,44510],{"id":43970,"depth":1635,"text":43788},{"id":43993,"depth":1635,"text":440},{"id":44016,"depth":1629,"text":44019,"children":44512},[44513,44514],{"id":44040,"depth":1635,"text":43788},{"id":44063,"depth":1635,"text":440},{"id":44086,"depth":1629,"text":44089,"children":44516},[44517,44518],{"id":44110,"depth":1635,"text":43788},{"id":44133,"depth":1635,"text":440},{"id":44156,"depth":1629,"text":44159,"children":44520},[44521,44522,44523,44524],{"id":44162,"depth":1635,"text":44165},{"id":44191,"depth":1635,"text":44194},{"id":44221,"depth":1635,"text":44224},{"id":44250,"depth":1635,"text":44253},{"id":44303,"depth":1629,"text":44306},{"id":1552,"depth":1629,"text":44411},{"id":44469,"depth":1629,"text":44472},"content:blog:best_tools_for_giving_ai_agents_access_to_saas_apis.md","blog/best_tools_for_giving_ai_agents_access_to_saas_apis.md","blog/best_tools_for_giving_ai_agents_access_to_saas_apis",{"_path":44532,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":44533,"description":44534,"img":44535,"date":44536,"tag":12,"body":44537,"_type":1677,"_id":45735,"_source":1679,"_file":45736,"_stem":45737,"_extension":1682},"/blog/cli_command_line_interface_vs_mcp_model_context_protocol_architecture_tradeoffs_for_ai_agents_and_saas_applications","CLI (Command-Line Interface) vs MCP (Model Context Protocol): Architecture Tradeoffs for AI Agents and SaaS Applications","A CLI (command-line interface) and an MCP (Model Context Protocol) server are two ways to give AI agents access to external tools and data. CLIs execute...","https://s3.us-east-2.amazonaws.com/unified-article-images/cli_command_line_interface_vs_mcp_model_context_protocol_architecture_tradeoffs_for_ai_agents_and_saas_applications-icon.png","2026-03-17T20:36:00.000Z",{"type":14,"children":44538,"toc":45713},[44539,44544,44547,44554,44583,44589,44612,44615,44621,44626,44631,44649,44654,44672,44677,44683,44689,44694,44712,44716,44725,44730,44753,44759,44764,44787,44792,44801,44805,44828,44834,44840,44847,44865,44872,44890,44894,44899,44905,44912,44930,44937,44955,44959,44964,44970,44977,44995,45002,45020,45024,45029,45035,45042,45060,45067,45085,45089,45094,45100,45107,45125,45132,45150,45154,45159,45165,45172,45190,45197,45215,45219,45224,45230,45235,45258,45263,45286,45291,45297,45302,45330,45334,45357,45362,45368,45373,45378,45396,45407,45421,45444,45449,45467,45472,45490,45496,45501,45524,45529,45588,45594,45599,45622,45627,45632,45641,45647,45652,45670,45675,45693,45698,45706],{"type":17,"tag":18,"props":44540,"children":44542},{"id":44541},"cli-command-line-interface-vs-mcp-model-context-protocol-architecture-tradeoffs-for-ai-agents-and-saas-applications",[44543],{"type":23,"value":44533},{"type":17,"tag":25,"props":44545,"children":44546},{},[],{"type":17,"tag":29,"props":44548,"children":44549},{},[44550],{"type":17,"tag":33,"props":44551,"children":44552},{},[44553],{"type":23,"value":43196},{"type":17,"tag":29,"props":44555,"children":44556},{},[44557,44559,44566,44568,44572,44574,44581],{"type":23,"value":44558},"A CLI (",{"type":17,"tag":133,"props":44560,"children":44563},{"href":44561,"rel":44562},"https://github.com/resources/articles/what-is-a-cli",[214],[44564],{"type":23,"value":44565},"command-line interface",{"type":23,"value":44567},") and an ",{"type":17,"tag":133,"props":44569,"children":44570},{"href":326},[44571],{"type":23,"value":329},{"type":23,"value":44573}," (",{"type":17,"tag":133,"props":44575,"children":44578},{"href":44576,"rel":44577},"https://modelcontextprotocol.io/docs/getting-started/intro",[214],[44579],{"type":23,"value":44580},"Model Context Protocol",{"type":23,"value":44582},") server are two ways to give AI agents access to external tools and data. CLIs execute commands directly in a shell and return text output. MCP servers provide structured tools through a standardized interface with defined schemas and authentication. Both are useful, but they operate at different layers of the stack and are suited to different environments.",{"type":17,"tag":239,"props":44584,"children":44586},{"id":44585},"summary",[44587],{"type":23,"value":44588},"Summary",{"type":17,"tag":80,"props":44590,"children":44591},{},[44592,44597,44602,44607],{"type":17,"tag":84,"props":44593,"children":44594},{},[44595],{"type":23,"value":44596},"CLI and MCP solve different problems. CLI is optimized for local execution, while MCP provides structured access to external tools.",{"type":17,"tag":84,"props":44598,"children":44599},{},[44600],{"type":23,"value":44601},"CLI is more efficient in developer-controlled environments, with no schema overhead and faster iteration loops.",{"type":17,"tag":84,"props":44603,"children":44604},{},[44605],{"type":23,"value":44606},"MCP introduces overhead but enables structured data handling, centralized authentication, and controlled access to external platforms.",{"type":17,"tag":84,"props":44608,"children":44609},{},[44610],{"type":23,"value":44611},"The correct choice depends on environment: CLI for local workflows, MCP for agent interaction with external systems.",{"type":17,"tag":11616,"props":44613,"children":44614},{"width":11618,"height":11619,"src":11620,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"type":17,"tag":68,"props":44616,"children":44618},{"id":44617},"why-this-matters-now",[44619],{"type":23,"value":44620},"Why this matters now",{"type":17,"tag":29,"props":44622,"children":44623},{},[44624],{"type":23,"value":44625},"As AI agents move from local development into production systems, the interface between models and external tools has become a critical design decision.",{"type":17,"tag":29,"props":44627,"children":44628},{},[44629],{"type":23,"value":44630},"Recent discussions have highlighted:",{"type":17,"tag":80,"props":44632,"children":44633},{},[44634,44639,44644],{"type":17,"tag":84,"props":44635,"children":44636},{},[44637],{"type":23,"value":44638},"token overhead from MCP tool schemas",{"type":17,"tag":84,"props":44640,"children":44641},{},[44642],{"type":23,"value":44643},"efficiency gains from CLI-based execution",{"type":17,"tag":84,"props":44645,"children":44646},{},[44647],{"type":23,"value":44648},"reliability differences between local and remote tool access",{"type":17,"tag":29,"props":44650,"children":44651},{},[44652],{"type":23,"value":44653},"At the same time, teams are building agents that:",{"type":17,"tag":80,"props":44655,"children":44656},{},[44657,44662,44667],{"type":17,"tag":84,"props":44658,"children":44659},{},[44660],{"type":23,"value":44661},"interact with multiple SaaS platforms",{"type":17,"tag":84,"props":44663,"children":44664},{},[44665],{"type":23,"value":44666},"operate on behalf of end users",{"type":17,"tag":84,"props":44668,"children":44669},{},[44670],{"type":23,"value":44671},"run inside multi-tenant applications",{"type":17,"tag":29,"props":44673,"children":44674},{},[44675],{"type":23,"value":44676},"These two realities are often discussed together, but they introduce different constraints. Understanding the architectural differences between CLI and MCP helps clarify when each approach is appropriate.",{"type":17,"tag":68,"props":44678,"children":44680},{"id":44679},"how-cli-and-mcp-work",[44681],{"type":23,"value":44682},"How CLI and MCP work",{"type":17,"tag":239,"props":44684,"children":44686},{"id":44685},"cli-execution-model",[44687],{"type":23,"value":44688},"CLI execution model",{"type":17,"tag":29,"props":44690,"children":44691},{},[44692],{"type":23,"value":44693},"A CLI-based agent:",{"type":17,"tag":6154,"props":44695,"children":44696},{},[44697,44702,44707],{"type":17,"tag":84,"props":44698,"children":44699},{},[44700],{"type":23,"value":44701},"generates a command",{"type":17,"tag":84,"props":44703,"children":44704},{},[44705],{"type":23,"value":44706},"executes it in a shell",{"type":17,"tag":84,"props":44708,"children":44709},{},[44710],{"type":23,"value":44711},"reads stdout as text",{"type":17,"tag":29,"props":44713,"children":44714},{},[44715],{"type":23,"value":19878},{"type":17,"tag":6893,"props":44717,"children":44720},{"className":44718,"code":44719,"language":20901,"meta":23},[20899],"gh pr list --repo org/repo --json number,title\n",[44721],{"type":17,"tag":6121,"props":44722,"children":44723},{"__ignoreMap":7},[44724],{"type":23,"value":44719},{"type":17,"tag":29,"props":44726,"children":44727},{},[44728],{"type":23,"value":44729},"Characteristics:",{"type":17,"tag":80,"props":44731,"children":44732},{},[44733,44738,44743,44748],{"type":17,"tag":84,"props":44734,"children":44735},{},[44736],{"type":23,"value":44737},"stateless execution",{"type":17,"tag":84,"props":44739,"children":44740},{},[44741],{"type":23,"value":44742},"no upfront schema or capability loading",{"type":17,"tag":84,"props":44744,"children":44745},{},[44746],{"type":23,"value":44747},"output is typically unstructured or semi-structured text (optionally JSON)",{"type":17,"tag":84,"props":44749,"children":44750},{},[44751],{"type":23,"value":44752},"relies on the model's prior knowledge of command syntax",{"type":17,"tag":239,"props":44754,"children":44756},{"id":44755},"mcp-execution-model",[44757],{"type":23,"value":44758},"MCP execution model",{"type":17,"tag":29,"props":44760,"children":44761},{},[44762],{"type":23,"value":44763},"An MCP-based agent:",{"type":17,"tag":6154,"props":44765,"children":44766},{},[44767,44772,44777,44782],{"type":17,"tag":84,"props":44768,"children":44769},{},[44770],{"type":23,"value":44771},"connects to a server",{"type":17,"tag":84,"props":44773,"children":44774},{},[44775],{"type":23,"value":44776},"receives available tools (name, description, schema)",{"type":17,"tag":84,"props":44778,"children":44779},{},[44780],{"type":23,"value":44781},"selects and calls tools via structured requests",{"type":17,"tag":84,"props":44783,"children":44784},{},[44785],{"type":23,"value":44786},"receives structured JSON responses",{"type":17,"tag":29,"props":44788,"children":44789},{},[44790],{"type":23,"value":44791},"Example (conceptual):",{"type":17,"tag":6893,"props":44793,"children":44796},{"className":44794,"code":44795,"language":20901,"meta":23},[20899],"tool: list_pull_requests\ninput: { \"repo\": \"org/repo\" }\n",[44797],{"type":17,"tag":6121,"props":44798,"children":44799},{"__ignoreMap":7},[44800],{"type":23,"value":44795},{"type":17,"tag":29,"props":44802,"children":44803},{},[44804],{"type":23,"value":44729},{"type":17,"tag":80,"props":44806,"children":44807},{},[44808,44813,44818,44823],{"type":17,"tag":84,"props":44809,"children":44810},{},[44811],{"type":23,"value":44812},"tools are defined with explicit schemas",{"type":17,"tag":84,"props":44814,"children":44815},{},[44816],{"type":23,"value":44817},"structured inputs and outputs",{"type":17,"tag":84,"props":44819,"children":44820},{},[44821],{"type":23,"value":44822},"authentication handled at the server layer",{"type":17,"tag":84,"props":44824,"children":44825},{},[44826],{"type":23,"value":44827},"tools are discoverable at runtime",{"type":17,"tag":68,"props":44829,"children":44831},{"id":44830},"core-architecture-tradeoffs",[44832],{"type":23,"value":44833},"Core architecture tradeoffs",{"type":17,"tag":239,"props":44835,"children":44837},{"id":44836},"_1-context-and-token-usage",[44838],{"type":23,"value":44839},"1. Context and token usage",{"type":17,"tag":29,"props":44841,"children":44842},{},[44843],{"type":17,"tag":48,"props":44844,"children":44845},{},[44846],{"type":23,"value":11609},{"type":17,"tag":80,"props":44848,"children":44849},{},[44850,44855,44860],{"type":17,"tag":84,"props":44851,"children":44852},{},[44853],{"type":23,"value":44854},"no schema overhead",{"type":17,"tag":84,"props":44856,"children":44857},{},[44858],{"type":23,"value":44859},"tokens used only for commands and outputs",{"type":17,"tag":84,"props":44861,"children":44862},{},[44863],{"type":23,"value":44864},"efficient for short, iterative tasks",{"type":17,"tag":29,"props":44866,"children":44867},{},[44868],{"type":17,"tag":48,"props":44869,"children":44870},{},[44871],{"type":23,"value":329},{"type":17,"tag":80,"props":44873,"children":44874},{},[44875,44880,44885],{"type":17,"tag":84,"props":44876,"children":44877},{},[44878],{"type":23,"value":44879},"tool definitions may be loaded into context",{"type":17,"tag":84,"props":44881,"children":44882},{},[44883],{"type":23,"value":44884},"cost grows with number of tools",{"type":17,"tag":84,"props":44886,"children":44887},{},[44888],{"type":23,"value":44889},"newer implementations reduce this via selective loading",{"type":17,"tag":29,"props":44891,"children":44892},{},[44893],{"type":23,"value":20076},{"type":17,"tag":29,"props":44895,"children":44896},{},[44897],{"type":23,"value":44898},"CLI is more efficient in environments where context budget is tight and tasks are simple. MCP introduces overhead in exchange for structure and discoverability.",{"type":17,"tag":239,"props":44900,"children":44902},{"id":44901},"_2-execution-model",[44903],{"type":23,"value":44904},"2. Execution model",{"type":17,"tag":29,"props":44906,"children":44907},{},[44908],{"type":17,"tag":48,"props":44909,"children":44910},{},[44911],{"type":23,"value":11609},{"type":17,"tag":80,"props":44913,"children":44914},{},[44915,44920,44925],{"type":17,"tag":84,"props":44916,"children":44917},{},[44918],{"type":23,"value":44919},"subprocess execution",{"type":17,"tag":84,"props":44921,"children":44922},{},[44923],{"type":23,"value":44924},"one command per interaction",{"type":17,"tag":84,"props":44926,"children":44927},{},[44928],{"type":23,"value":44929},"no persistent session",{"type":17,"tag":29,"props":44931,"children":44932},{},[44933],{"type":17,"tag":48,"props":44934,"children":44935},{},[44936],{"type":23,"value":329},{"type":17,"tag":80,"props":44938,"children":44939},{},[44940,44945,44950],{"type":17,"tag":84,"props":44941,"children":44942},{},[44943],{"type":23,"value":44944},"persistent connection to a server",{"type":17,"tag":84,"props":44946,"children":44947},{},[44948],{"type":23,"value":44949},"supports multi-step tool usage within a session",{"type":17,"tag":84,"props":44951,"children":44952},{},[44953],{"type":23,"value":44954},"can maintain context across operations",{"type":17,"tag":29,"props":44956,"children":44957},{},[44958],{"type":23,"value":20076},{"type":17,"tag":29,"props":44960,"children":44961},{},[44962],{"type":23,"value":44963},"MCP is better suited for workflows that require coordination across multiple steps or tools.",{"type":17,"tag":239,"props":44965,"children":44967},{"id":44966},"_3-authentication-and-permissions",[44968],{"type":23,"value":44969},"3. Authentication and permissions",{"type":17,"tag":29,"props":44971,"children":44972},{},[44973],{"type":17,"tag":48,"props":44974,"children":44975},{},[44976],{"type":23,"value":11609},{"type":17,"tag":80,"props":44978,"children":44979},{},[44980,44985,44990],{"type":17,"tag":84,"props":44981,"children":44982},{},[44983],{"type":23,"value":44984},"uses environment variables or local credentials",{"type":17,"tag":84,"props":44986,"children":44987},{},[44988],{"type":23,"value":44989},"typically tied to a single user",{"type":17,"tag":84,"props":44991,"children":44992},{},[44993],{"type":23,"value":44994},"permission handling is external to the interface",{"type":17,"tag":29,"props":44996,"children":44997},{},[44998],{"type":17,"tag":48,"props":44999,"children":45000},{},[45001],{"type":23,"value":329},{"type":17,"tag":80,"props":45003,"children":45004},{},[45005,45010,45015],{"type":17,"tag":84,"props":45006,"children":45007},{},[45008],{"type":23,"value":45009},"centralized authentication",{"type":17,"tag":84,"props":45011,"children":45012},{},[45013],{"type":23,"value":45014},"supports per-user authorization",{"type":17,"tag":84,"props":45016,"children":45017},{},[45018],{"type":23,"value":45019},"enforces scoped access at the tool level",{"type":17,"tag":29,"props":45021,"children":45022},{},[45023],{"type":23,"value":20076},{"type":17,"tag":29,"props":45025,"children":45026},{},[45027],{"type":23,"value":45028},"CLI works well when the agent acts as the developer. MCP is more suitable when actions must be scoped to specific users or roles.",{"type":17,"tag":239,"props":45030,"children":45032},{"id":45031},"_4-output-and-data-handling",[45033],{"type":23,"value":45034},"4. Output and data handling",{"type":17,"tag":29,"props":45036,"children":45037},{},[45038],{"type":17,"tag":48,"props":45039,"children":45040},{},[45041],{"type":23,"value":11609},{"type":17,"tag":80,"props":45043,"children":45044},{},[45045,45050,45055],{"type":17,"tag":84,"props":45046,"children":45047},{},[45048],{"type":23,"value":45049},"returns text (or optional JSON flags)",{"type":17,"tag":84,"props":45051,"children":45052},{},[45053],{"type":23,"value":45054},"parsing is handled by the model",{"type":17,"tag":84,"props":45056,"children":45057},{},[45058],{"type":23,"value":45059},"output formats vary across tools",{"type":17,"tag":29,"props":45061,"children":45062},{},[45063],{"type":17,"tag":48,"props":45064,"children":45065},{},[45066],{"type":23,"value":329},{"type":17,"tag":80,"props":45068,"children":45069},{},[45070,45075,45080],{"type":17,"tag":84,"props":45071,"children":45072},{},[45073],{"type":23,"value":45074},"returns structured JSON",{"type":17,"tag":84,"props":45076,"children":45077},{},[45078],{"type":23,"value":45079},"consistent schemas across tools",{"type":17,"tag":84,"props":45081,"children":45082},{},[45083],{"type":23,"value":45084},"easier for agents to reason over",{"type":17,"tag":29,"props":45086,"children":45087},{},[45088],{"type":23,"value":20076},{"type":17,"tag":29,"props":45090,"children":45091},{},[45092],{"type":23,"value":45093},"MCP reduces ambiguity in data handling, especially for complex or multi-step tasks.",{"type":17,"tag":239,"props":45095,"children":45097},{"id":45096},"_5-reliability-and-infrastructure",[45098],{"type":23,"value":45099},"5. Reliability and infrastructure",{"type":17,"tag":29,"props":45101,"children":45102},{},[45103],{"type":17,"tag":48,"props":45104,"children":45105},{},[45106],{"type":23,"value":11609},{"type":17,"tag":80,"props":45108,"children":45109},{},[45110,45115,45120],{"type":17,"tag":84,"props":45111,"children":45112},{},[45113],{"type":23,"value":45114},"runs locally",{"type":17,"tag":84,"props":45116,"children":45117},{},[45118],{"type":23,"value":45119},"minimal network dependencies",{"type":17,"tag":84,"props":45121,"children":45122},{},[45123],{"type":23,"value":45124},"fewer points of failure",{"type":17,"tag":29,"props":45126,"children":45127},{},[45128],{"type":17,"tag":48,"props":45129,"children":45130},{},[45131],{"type":23,"value":329},{"type":17,"tag":80,"props":45133,"children":45134},{},[45135,45140,45145],{"type":17,"tag":84,"props":45136,"children":45137},{},[45138],{"type":23,"value":45139},"depends on server availability",{"type":17,"tag":84,"props":45141,"children":45142},{},[45143],{"type":23,"value":45144},"requires connection management",{"type":17,"tag":84,"props":45146,"children":45147},{},[45148],{"type":23,"value":45149},"introduces network latency and failure modes",{"type":17,"tag":29,"props":45151,"children":45152},{},[45153],{"type":23,"value":20076},{"type":17,"tag":29,"props":45155,"children":45156},{},[45157],{"type":23,"value":45158},"CLI is more reliable in local environments. MCP requires infrastructure but enables centralized access.",{"type":17,"tag":239,"props":45160,"children":45162},{"id":45161},"_6-developer-experience",[45163],{"type":23,"value":45164},"6. Developer experience",{"type":17,"tag":29,"props":45166,"children":45167},{},[45168],{"type":17,"tag":48,"props":45169,"children":45170},{},[45171],{"type":23,"value":11609},{"type":17,"tag":80,"props":45173,"children":45174},{},[45175,45180,45185],{"type":17,"tag":84,"props":45176,"children":45177},{},[45178],{"type":23,"value":45179},"familiar to developers",{"type":17,"tag":84,"props":45181,"children":45182},{},[45183],{"type":23,"value":45184},"composable (pipes, scripts)",{"type":17,"tag":84,"props":45186,"children":45187},{},[45188],{"type":23,"value":45189},"easy to debug",{"type":17,"tag":29,"props":45191,"children":45192},{},[45193],{"type":17,"tag":48,"props":45194,"children":45195},{},[45196],{"type":23,"value":329},{"type":17,"tag":80,"props":45198,"children":45199},{},[45200,45205,45210],{"type":17,"tag":84,"props":45201,"children":45202},{},[45203],{"type":23,"value":45204},"requires setup and configuration",{"type":17,"tag":84,"props":45206,"children":45207},{},[45208],{"type":23,"value":45209},"provides consistent interfaces across tools",{"type":17,"tag":84,"props":45211,"children":45212},{},[45213],{"type":23,"value":45214},"reduces need to learn individual APIs",{"type":17,"tag":29,"props":45216,"children":45217},{},[45218],{"type":23,"value":20076},{"type":17,"tag":29,"props":45220,"children":45221},{},[45222],{"type":23,"value":45223},"CLI favors speed and familiarity. MCP favors consistency and abstraction.",{"type":17,"tag":68,"props":45225,"children":45227},{"id":45226},"when-cli-is-the-right-choice",[45228],{"type":23,"value":45229},"When CLI is the right choice",{"type":17,"tag":29,"props":45231,"children":45232},{},[45233],{"type":23,"value":45234},"CLI performs best in environments where:",{"type":17,"tag":80,"props":45236,"children":45237},{},[45238,45243,45248,45253],{"type":17,"tag":84,"props":45239,"children":45240},{},[45241],{"type":23,"value":45242},"the agent operates locally",{"type":17,"tag":84,"props":45244,"children":45245},{},[45246],{"type":23,"value":45247},"the developer owns the workflow",{"type":17,"tag":84,"props":45249,"children":45250},{},[45251],{"type":23,"value":45252},"tasks are short and iterative",{"type":17,"tag":84,"props":45254,"children":45255},{},[45256],{"type":23,"value":45257},"tools are already well understood by the model",{"type":17,"tag":29,"props":45259,"children":45260},{},[45261],{"type":23,"value":45262},"Common examples:",{"type":17,"tag":80,"props":45264,"children":45265},{},[45266,45271,45276,45281],{"type":17,"tag":84,"props":45267,"children":45268},{},[45269],{"type":23,"value":45270},"running tests and linters",{"type":17,"tag":84,"props":45272,"children":45273},{},[45274],{"type":23,"value":45275},"debugging integration behavior",{"type":17,"tag":84,"props":45277,"children":45278},{},[45279],{"type":23,"value":45280},"scripting data retrieval",{"type":17,"tag":84,"props":45282,"children":45283},{},[45284],{"type":23,"value":45285},"prototyping agent workflows",{"type":17,"tag":29,"props":45287,"children":45288},{},[45289],{"type":23,"value":45290},"In these cases, the lack of overhead and direct execution model provide faster feedback loops.",{"type":17,"tag":68,"props":45292,"children":45294},{"id":45293},"when-mcp-is-the-right-choice",[45295],{"type":23,"value":45296},"When MCP is the right choice",{"type":17,"tag":29,"props":45298,"children":45299},{},[45300],{"type":23,"value":45301},"MCP is more effective when:",{"type":17,"tag":80,"props":45303,"children":45304},{},[45305,45310,45315,45320,45325],{"type":17,"tag":84,"props":45306,"children":45307},{},[45308],{"type":23,"value":45309},"the agent interacts with external platforms",{"type":17,"tag":84,"props":45311,"children":45312},{},[45313],{"type":23,"value":45314},"structured data is required",{"type":17,"tag":84,"props":45316,"children":45317},{},[45318],{"type":23,"value":45319},"authentication must be managed centrally",{"type":17,"tag":84,"props":45321,"children":45322},{},[45323],{"type":23,"value":45324},"workflows involve multiple coordinated steps",{"type":17,"tag":84,"props":45326,"children":45327},{},[45328],{"type":23,"value":45329},"actions must be constrained and auditable",{"type":17,"tag":29,"props":45331,"children":45332},{},[45333],{"type":23,"value":45262},{"type":17,"tag":80,"props":45335,"children":45336},{},[45337,45342,45347,45352],{"type":17,"tag":84,"props":45338,"children":45339},{},[45340],{"type":23,"value":45341},"querying CI/CD pipelines",{"type":17,"tag":84,"props":45343,"children":45344},{},[45345],{"type":23,"value":45346},"interacting with CRM or HR platforms",{"type":17,"tag":84,"props":45348,"children":45349},{},[45350],{"type":23,"value":45351},"coordinating actions across multiple services",{"type":17,"tag":84,"props":45353,"children":45354},{},[45355],{"type":23,"value":45356},"enforcing permission boundaries",{"type":17,"tag":29,"props":45358,"children":45359},{},[45360],{"type":23,"value":45361},"In these environments, structure and control outweigh the cost of additional overhead.",{"type":17,"tag":68,"props":45363,"children":45365},{"id":45364},"example-mcp-for-multi-platform-multi-tenant-agents",[45366],{"type":23,"value":45367},"Example: MCP for multi-platform, multi-tenant agents",{"type":17,"tag":29,"props":45369,"children":45370},{},[45371],{"type":23,"value":45372},"A common challenge with MCP is managing multiple external systems at once. In practice, agents often need to operate across CRM, support tools, file storage, and communication platforms simultaneously.",{"type":17,"tag":29,"props":45374,"children":45375},{},[45376],{"type":23,"value":45377},"Running a separate MCP server per vendor introduces:",{"type":17,"tag":80,"props":45379,"children":45380},{},[45381,45386,45391],{"type":17,"tag":84,"props":45382,"children":45383},{},[45384],{"type":23,"value":45385},"inconsistent tool behavior",{"type":17,"tag":84,"props":45387,"children":45388},{},[45389],{"type":23,"value":45390},"fragmented authentication models",{"type":17,"tag":84,"props":45392,"children":45393},{},[45394],{"type":23,"value":45395},"additional operational overhead",{"type":17,"tag":29,"props":45397,"children":45398},{},[45399,45400,45405],{"type":23,"value":9619},{"type":17,"tag":133,"props":45401,"children":45402},{"href":326},[45403],{"type":23,"value":45404},"unified MCP",{"type":23,"value":45406}," approach addresses this by exposing multiple integrations through a single interface, with centralized authorization and consistent tool definitions.",{"type":17,"tag":29,"props":45408,"children":45409},{},[45410,45412,45419],{"type":23,"value":45411},"For example, ",{"type":17,"tag":133,"props":45413,"children":45416},{"href":45414,"rel":45415},"https://unified.to/mcp",[214],[45417],{"type":23,"value":45418},"Unified MCP",{"type":23,"value":45420}," provides access to hundreds of integrations across categories like CRM, accounting, and ticketing, while enforcing:",{"type":17,"tag":80,"props":45422,"children":45423},{},[45424,45429,45434,45439],{"type":17,"tag":84,"props":45425,"children":45426},{},[45427],{"type":23,"value":45428},"centralized authentication and token management",{"type":17,"tag":84,"props":45430,"children":45431},{},[45432],{"type":23,"value":45433},"scoped, authorized tool access per connection",{"type":17,"tag":84,"props":45435,"children":45436},{},[45437],{"type":23,"value":45438},"structured outputs with optional sensitive field filtering",{"type":17,"tag":84,"props":45440,"children":45441},{},[45442],{"type":23,"value":45443},"auditability of all tool calls",{"type":17,"tag":29,"props":45445,"children":45446},{},[45447],{"type":23,"value":45448},"This allows agents to perform actions like:",{"type":17,"tag":80,"props":45450,"children":45451},{},[45452,45457,45462],{"type":17,"tag":84,"props":45453,"children":45454},{},[45455],{"type":23,"value":45456},"retrieving CRM data and updating records",{"type":17,"tag":84,"props":45458,"children":45459},{},[45460],{"type":23,"value":45461},"creating tickets and assigning workflows",{"type":17,"tag":84,"props":45463,"children":45464},{},[45465],{"type":23,"value":45466},"coordinating actions across multiple platforms",{"type":17,"tag":29,"props":45468,"children":45469},{},[45470],{"type":23,"value":45471},"within a single, controlled interface, without requiring per-vendor integration logic.",{"type":17,"tag":29,"props":45473,"children":45474},{},[45475,45481],{"type":17,"tag":133,"props":45476,"children":45479},{"href":45477,"rel":45478},"https://unified.to/blog/why_use_a_unified_mcp_instead_of_connecting_directly_to_vendor_mcps",[214],[45480],{"type":23,"value":1609},{"type":17,"tag":133,"props":45482,"children":45484},{"href":45477,"rel":45483},[214],[45485],{"type":17,"tag":48,"props":45486,"children":45487},{},[45488],{"type":23,"value":45489},"Why Use a Unified MCP Instead of Connecting Directly to Vendor MCPs",{"type":17,"tag":68,"props":45491,"children":45493},{"id":45492},"the-environment-determines-the-interface",[45494],{"type":23,"value":45495},"The environment determines the interface",{"type":17,"tag":29,"props":45497,"children":45498},{},[45499],{"type":23,"value":45500},"A useful way to think about the difference:",{"type":17,"tag":80,"props":45502,"children":45503},{},[45504,45514],{"type":17,"tag":84,"props":45505,"children":45506},{},[45507,45509],{"type":23,"value":45508},"CLI is optimized for ",{"type":17,"tag":48,"props":45510,"children":45511},{},[45512],{"type":23,"value":45513},"local execution",{"type":17,"tag":84,"props":45515,"children":45516},{},[45517,45519],{"type":23,"value":45518},"MCP is optimized for ",{"type":17,"tag":48,"props":45520,"children":45521},{},[45522],{"type":23,"value":45523},"agent-to-system interaction",{"type":17,"tag":29,"props":45525,"children":45526},{},[45527],{"type":23,"value":45528},"The key variable is not preference, but environment:",{"type":17,"tag":7231,"props":45530,"children":45531},{},[45532,45548],{"type":17,"tag":7235,"props":45533,"children":45534},{},[45535],{"type":17,"tag":7239,"props":45536,"children":45537},{},[45538,45543],{"type":17,"tag":7243,"props":45539,"children":45540},{},[45541],{"type":23,"value":45542},"Environment",{"type":17,"tag":7243,"props":45544,"children":45545},{},[45546],{"type":23,"value":45547},"Preferred interface",{"type":17,"tag":7259,"props":45549,"children":45550},{},[45551,45563,45575],{"type":17,"tag":7239,"props":45552,"children":45553},{},[45554,45559],{"type":17,"tag":7266,"props":45555,"children":45556},{},[45557],{"type":23,"value":45558},"Local developer workflows",{"type":17,"tag":7266,"props":45560,"children":45561},{},[45562],{"type":23,"value":11609},{"type":17,"tag":7239,"props":45564,"children":45565},{},[45566,45571],{"type":17,"tag":7266,"props":45567,"children":45568},{},[45569],{"type":23,"value":45570},"Shared systems and services",{"type":17,"tag":7266,"props":45572,"children":45573},{},[45574],{"type":23,"value":329},{"type":17,"tag":7239,"props":45576,"children":45577},{},[45578,45583],{"type":17,"tag":7266,"props":45579,"children":45580},{},[45581],{"type":23,"value":45582},"Production SaaS applications",{"type":17,"tag":7266,"props":45584,"children":45585},{},[45586],{"type":23,"value":45587},"API",{"type":17,"tag":68,"props":45589,"children":45591},{"id":45590},"where-cli-fits-in-the-unified-stack",[45592],{"type":23,"value":45593},"Where CLI fits in the Unified stack",{"type":17,"tag":29,"props":45595,"children":45596},{},[45597],{"type":23,"value":45598},"The Unified CLI is a developer tool for:",{"type":17,"tag":80,"props":45600,"children":45601},{},[45602,45607,45612,45617],{"type":17,"tag":84,"props":45603,"children":45604},{},[45605],{"type":23,"value":45606},"testing integrations",{"type":17,"tag":84,"props":45608,"children":45609},{},[45610],{"type":23,"value":45611},"validating connections",{"type":17,"tag":84,"props":45613,"children":45614},{},[45615],{"type":23,"value":45616},"inspecting data quickly",{"type":17,"tag":84,"props":45618,"children":45619},{},[45620],{"type":23,"value":45621},"prototyping workflows",{"type":17,"tag":29,"props":45623,"children":45624},{},[45625],{"type":23,"value":45626},"It provides a fast way to interact with Unified's API surface during development.",{"type":17,"tag":29,"props":45628,"children":45629},{},[45630],{"type":23,"value":45631},"It is not intended as a replacement for API-based integration in production systems.",{"type":17,"tag":29,"props":45633,"children":45634},{},[45635],{"type":17,"tag":133,"props":45636,"children":45638},{"href":45637},"/3266207b83848030b081efc7c93d46a5",[45639],{"type":23,"value":45640},"View CLI on GitHub →",{"type":17,"tag":68,"props":45642,"children":45644},{"id":45643},"key-takeaway",[45645],{"type":23,"value":45646},"Key takeaway",{"type":17,"tag":29,"props":45648,"children":45649},{},[45650],{"type":23,"value":45651},"CLI and MCP are not competing solutions. They operate at different layers and solve different problems.",{"type":17,"tag":80,"props":45653,"children":45654},{},[45655,45660,45665],{"type":17,"tag":84,"props":45656,"children":45657},{},[45658],{"type":23,"value":45659},"CLI provides efficient, direct execution for local workflows",{"type":17,"tag":84,"props":45661,"children":45662},{},[45663],{"type":23,"value":45664},"MCP provides structured, controlled access to external tools",{"type":17,"tag":84,"props":45666,"children":45667},{},[45668],{"type":23,"value":45669},"APIs remain the foundation for production SaaS applications",{"type":17,"tag":29,"props":45671,"children":45672},{},[45673],{"type":23,"value":45674},"The correct approach is to match the interface to the environment:",{"type":17,"tag":80,"props":45676,"children":45677},{},[45678,45683,45688],{"type":17,"tag":84,"props":45679,"children":45680},{},[45681],{"type":23,"value":45682},"use CLI for speed and iteration",{"type":17,"tag":84,"props":45684,"children":45685},{},[45686],{"type":23,"value":45687},"use MCP where structure and control are required",{"type":17,"tag":84,"props":45689,"children":45690},{},[45691],{"type":23,"value":45692},"use APIs for everything that runs in production",{"type":17,"tag":29,"props":45694,"children":45695},{},[45696],{"type":23,"value":45697},"Understanding this separation avoids architectural tradeoffs that only appear later at scale.",{"type":17,"tag":29,"props":45699,"children":45700},{},[45701],{"type":17,"tag":133,"props":45702,"children":45704},{"href":45703},"/3206207b8384802786c0c80cae744891",[45705],{"type":23,"value":44481},{"type":17,"tag":29,"props":45707,"children":45708},{},[45709],{"type":17,"tag":133,"props":45710,"children":45711},{"href":45703},[45712],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":45714},[45715,45716,45717,45721,45729,45730,45731,45732,45733,45734],{"id":44585,"depth":1635,"text":44588},{"id":44617,"depth":1629,"text":44620},{"id":44679,"depth":1629,"text":44682,"children":45718},[45719,45720],{"id":44685,"depth":1635,"text":44688},{"id":44755,"depth":1635,"text":44758},{"id":44830,"depth":1629,"text":44833,"children":45722},[45723,45724,45725,45726,45727,45728],{"id":44836,"depth":1635,"text":44839},{"id":44901,"depth":1635,"text":44904},{"id":44966,"depth":1635,"text":44969},{"id":45031,"depth":1635,"text":45034},{"id":45096,"depth":1635,"text":45099},{"id":45161,"depth":1635,"text":45164},{"id":45226,"depth":1629,"text":45229},{"id":45293,"depth":1629,"text":45296},{"id":45364,"depth":1629,"text":45367},{"id":45492,"depth":1629,"text":45495},{"id":45590,"depth":1629,"text":45593},{"id":45643,"depth":1629,"text":45646},"content:blog:cli_command_line_interface_vs_mcp_model_context_protocol_architecture_tradeoffs_for_ai_agents_and_saas_applications.md","blog/cli_command_line_interface_vs_mcp_model_context_protocol_architecture_tradeoffs_for_ai_agents_and_saas_applications.md","blog/cli_command_line_interface_vs_mcp_model_context_protocol_architecture_tradeoffs_for_ai_agents_and_saas_applications",{"_path":45739,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":45740,"description":45741,"img":45742,"date":45743,"tag":12,"body":45744,"_type":1677,"_id":46765,"_source":1679,"_file":46766,"_stem":46767,"_extension":1682},"/blog/how_to_build_enterprise_grade_semantic_search_in_2026_that_actually_works_at_scale","How to Build Enterprise-Grade Semantic Search in 2026 (That Actually Works at Scale)","Semantic search helps users find meaning across documents, messages, and application data instead of relying on exact keyword matches.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_enterprise_grade_semantic_search_in_2026_that_actually_works_at_scale-icon.png","2026-03-17T18:06:00.000Z",{"type":14,"children":45745,"toc":46735},[45746,45751,45754,45761,45765,45770,45783,45789,45794,45822,45827,45863,45868,45876,45881,45889,45894,45902,45907,45915,45929,45934,45940,45945,45953,45958,45966,45971,45979,45984,45992,45997,46005,46010,46015,46021,46026,46032,46037,46043,46048,46054,46059,46065,46070,46076,46081,46087,46092,46097,46120,46125,46130,46136,46141,46147,46160,46166,46171,46177,46190,46196,46201,46207,46212,46217,46223,46228,46233,46406,46422,46428,46433,46438,46456,46461,46469,46474,46482,46487,46495,46500,46508,46513,46518,46524,46529,46534,46539,46544,46550,46555,46561,46575,46581,46586,46592,46597,46603,46608,46616,46639,46647,46669,46674,46678,46711,46716,46721,46728],{"type":17,"tag":18,"props":45747,"children":45749},{"id":45748},"how-to-build-enterprise-grade-semantic-search-in-2026-that-actually-works-at-scale",[45750],{"type":23,"value":45740},{"type":17,"tag":25,"props":45752,"children":45753},{},[],{"type":17,"tag":29,"props":45755,"children":45756},{},[45757],{"type":17,"tag":33,"props":45758,"children":45759},{},[45760],{"type":23,"value":43196},{"type":17,"tag":29,"props":45762,"children":45763},{},[45764],{"type":23,"value":45741},{"type":17,"tag":29,"props":45766,"children":45767},{},[45768],{"type":23,"value":45769},"At enterprise scale, it fails less because of embedding models and more because the underlying data is stale, inconsistent, and poorly integrated.",{"type":17,"tag":29,"props":45771,"children":45772},{},[45773,45775,45781],{"type":23,"value":45774},"This guide explains how ",{"type":17,"tag":133,"props":45776,"children":45779},{"href":45777,"rel":45778},"https://cloud.google.com/discover/what-is-semantic-search",[214],[45780],{"type":23,"value":16542},{"type":23,"value":45782}," actually works in production, where teams go wrong, and how to design an architecture that scales.",{"type":17,"tag":68,"props":45784,"children":45786},{"id":45785},"why-semantic-search-breaks-in-saas-products",[45787],{"type":23,"value":45788},"Why semantic search breaks in SaaS products",{"type":17,"tag":29,"props":45790,"children":45791},{},[45792],{"type":23,"value":45793},"In real SaaS environments, data is fragmented across dozens of platforms:",{"type":17,"tag":80,"props":45795,"children":45796},{},[45797,45802,45807,45812,45817],{"type":17,"tag":84,"props":45798,"children":45799},{},[45800],{"type":23,"value":45801},"CRM records (Salesforce, HubSpot)",{"type":17,"tag":84,"props":45803,"children":45804},{},[45805],{"type":23,"value":45806},"support tickets (Zendesk, Freshdesk)",{"type":17,"tag":84,"props":45808,"children":45809},{},[45810],{"type":23,"value":45811},"internal knowledge (Notion, Confluence)",{"type":17,"tag":84,"props":45813,"children":45814},{},[45815],{"type":23,"value":45816},"communication (Slack, email)",{"type":17,"tag":84,"props":45818,"children":45819},{},[45820],{"type":23,"value":45821},"files (Google Drive, SharePoint)",{"type":17,"tag":29,"props":45823,"children":45824},{},[45825],{"type":23,"value":45826},"Each platform introduces its own:",{"type":17,"tag":80,"props":45828,"children":45829},{},[45830,45835,45852],{"type":17,"tag":84,"props":45831,"children":45832},{},[45833],{"type":23,"value":45834},"schema (field names, structures, relationships)",{"type":17,"tag":84,"props":45836,"children":45837},{},[45838,45845,45846,45850],{"type":17,"tag":133,"props":45839,"children":45842},{"href":45840,"rel":45841},"https://unified.to/embeddedauth",[214],[45843],{"type":23,"value":45844},"authorization model",{"type":23,"value":44573},{"type":17,"tag":133,"props":45847,"children":45848},{"href":779},[45849],{"type":23,"value":782},{"type":23,"value":45851}," scopes, user permissions)",{"type":17,"tag":84,"props":45853,"children":45854},{},[45855,45857,45861],{"type":23,"value":45856},"update model (",{"type":17,"tag":133,"props":45858,"children":45859},{"href":4999},[45860],{"type":23,"value":5002},{"type":23,"value":45862},", polling, or none)",{"type":17,"tag":29,"props":45864,"children":45865},{},[45866],{"type":23,"value":45867},"This creates four core problems:",{"type":17,"tag":29,"props":45869,"children":45870},{},[45871],{"type":17,"tag":48,"props":45872,"children":45873},{},[45874],{"type":23,"value":45875},"1. Schema inconsistency",{"type":17,"tag":29,"props":45877,"children":45878},{},[45879],{"type":23,"value":45880},"The same concept appears differently across tools. A 'customer' may be a Contact, Account, or Company depending on the platform. Without normalization, every integration requires custom mapping.",{"type":17,"tag":29,"props":45882,"children":45883},{},[45884],{"type":17,"tag":48,"props":45885,"children":45886},{},[45887],{"type":23,"value":45888},"2. Stale data pipelines",{"type":17,"tag":29,"props":45890,"children":45891},{},[45892],{"type":23,"value":45893},"Most teams rely on ETL or scheduled syncs. Data is copied into a warehouse or integration layer, then embedded later. By the time it is searchable, it is already outdated.",{"type":17,"tag":29,"props":45895,"children":45896},{},[45897],{"type":17,"tag":48,"props":45898,"children":45899},{},[45900],{"type":23,"value":45901},"3. Missing metadata and permissions",{"type":17,"tag":29,"props":45903,"children":45904},{},[45905],{"type":23,"value":45906},"Search quality depends on metadata like timestamps, ownership, and access control. Shallow connectors often miss this, leading to incorrect ranking or data leakage.",{"type":17,"tag":29,"props":45908,"children":45909},{},[45910],{"type":17,"tag":48,"props":45911,"children":45912},{},[45913],{"type":23,"value":45914},"4. Fragmented ingestion pipelines",{"type":17,"tag":29,"props":45916,"children":45917},{},[45918,45920,45927],{"type":23,"value":45919},"Teams build separate pipelines per integration, each handling auth, retries, and ",{"type":17,"tag":133,"props":45921,"children":45924},{"href":45922,"rel":45923},"https://docs.unified.to/concepts/glossary/schema",[214],[45925],{"type":23,"value":45926},"schema",{"type":23,"value":45928}," differences. Over time, the system becomes brittle and expensive to maintain.",{"type":17,"tag":29,"props":45930,"children":45931},{},[45932],{"type":23,"value":45933},"This is why semantic search often works in a demo but fails in production.",{"type":17,"tag":68,"props":45935,"children":45937},{"id":45936},"what-enterprise-grade-semantic-search-actually-means",[45938],{"type":23,"value":45939},"What 'enterprise-grade' semantic search actually means",{"type":17,"tag":29,"props":45941,"children":45942},{},[45943],{"type":23,"value":45944},"Adding embeddings to a dataset is not enough. Enterprise-grade semantic search must meet the same requirements as any production system:",{"type":17,"tag":29,"props":45946,"children":45947},{},[45948],{"type":17,"tag":48,"props":45949,"children":45950},{},[45951],{"type":23,"value":45952},"Real-time consistency",{"type":17,"tag":29,"props":45954,"children":45955},{},[45956],{"type":23,"value":45957},"Search results must reflect the current state of the data, not a cached snapshot.",{"type":17,"tag":29,"props":45959,"children":45960},{},[45961],{"type":17,"tag":48,"props":45962,"children":45963},{},[45964],{"type":23,"value":45965},"Hybrid retrieval",{"type":17,"tag":29,"props":45967,"children":45968},{},[45969],{"type":23,"value":45970},"Combine semantic similarity (embeddings) with lexical search to ensure both fuzzy matching and exactness.",{"type":17,"tag":29,"props":45972,"children":45973},{},[45974],{"type":17,"tag":48,"props":45975,"children":45976},{},[45977],{"type":23,"value":45978},"Permission-aware results",{"type":17,"tag":29,"props":45980,"children":45981},{},[45982],{"type":23,"value":45983},"Every query must respect user-level access control and tenant boundaries.",{"type":17,"tag":29,"props":45985,"children":45986},{},[45987],{"type":17,"tag":48,"props":45988,"children":45989},{},[45990],{"type":23,"value":45991},"Scalable performance",{"type":17,"tag":29,"props":45993,"children":45994},{},[45995],{"type":23,"value":45996},"Sub-100ms queries across millions of records, with predictable performance under load.",{"type":17,"tag":29,"props":45998,"children":45999},{},[46000],{"type":17,"tag":48,"props":46001,"children":46002},{},[46003],{"type":23,"value":46004},"Observability",{"type":17,"tag":29,"props":46006,"children":46007},{},[46008],{"type":23,"value":46009},"Track freshness, indexing lag, retrieval quality, and failure rates.",{"type":17,"tag":29,"props":46011,"children":46012},{},[46013],{"type":23,"value":46014},"If any of these break, users stop trusting the system.",{"type":17,"tag":68,"props":46016,"children":46018},{"id":46017},"where-teams-go-wrong",[46019],{"type":23,"value":46020},"Where teams go wrong",{"type":17,"tag":29,"props":46022,"children":46023},{},[46024],{"type":23,"value":46025},"Most failures come from architectural decisions, not model quality.",{"type":17,"tag":239,"props":46027,"children":46029},{"id":46028},"over-relying-on-vector-databases",[46030],{"type":23,"value":46031},"Over-relying on vector databases",{"type":17,"tag":29,"props":46033,"children":46034},{},[46035],{"type":23,"value":46036},"Vector search is only one part of the system. Without metadata filtering and hybrid retrieval, results lack precision and context.",{"type":17,"tag":239,"props":46038,"children":46040},{"id":46039},"treating-embeddings-as-the-source-of-truth",[46041],{"type":23,"value":46042},"Treating embeddings as the source of truth",{"type":17,"tag":29,"props":46044,"children":46045},{},[46046],{"type":23,"value":46047},"Embeddings are derived from underlying data. When the source changes, embeddings must be updated. Treating them as primary data creates drift and stale results.",{"type":17,"tag":239,"props":46049,"children":46051},{"id":46050},"using-stale-synced-data",[46052],{"type":23,"value":46053},"Using stale synced data",{"type":17,"tag":29,"props":46055,"children":46056},{},[46057],{"type":23,"value":46058},"If embeddings are generated from data that is hours or days old, the entire system becomes unreliable. This is one of the most common failure modes.",{"type":17,"tag":239,"props":46060,"children":46062},{"id":46061},"building-per-integration-pipelines",[46063],{"type":23,"value":46064},"Building per-integration pipelines",{"type":17,"tag":29,"props":46066,"children":46067},{},[46068],{"type":23,"value":46069},"Custom ingestion logic for each SaaS tool introduces duplication, schema drift, and ongoing maintenance overhead.",{"type":17,"tag":239,"props":46071,"children":46073},{"id":46072},"ignoring-authorization-complexity",[46074],{"type":23,"value":46075},"Ignoring authorization complexity",{"type":17,"tag":29,"props":46077,"children":46078},{},[46079],{"type":23,"value":46080},"Each platform has different permission models. Failing to enforce them correctly leads to either missing results or security risks.",{"type":17,"tag":68,"props":46082,"children":46084},{"id":46083},"why-integration-architecture-determines-search-quality",[46085],{"type":23,"value":46086},"Why integration architecture determines search quality",{"type":17,"tag":29,"props":46088,"children":46089},{},[46090],{"type":23,"value":46091},"Semantic search is often framed as an AI problem. In practice, it is an integration problem first.",{"type":17,"tag":29,"props":46093,"children":46094},{},[46095],{"type":23,"value":46096},"Search quality depends on:",{"type":17,"tag":80,"props":46098,"children":46099},{},[46100,46105,46110,46115],{"type":17,"tag":84,"props":46101,"children":46102},{},[46103],{"type":23,"value":46104},"how current the data is",{"type":17,"tag":84,"props":46106,"children":46107},{},[46108],{"type":23,"value":46109},"how consistent the schema is",{"type":17,"tag":84,"props":46111,"children":46112},{},[46113],{"type":23,"value":46114},"whether permissions are enforced correctly",{"type":17,"tag":84,"props":46116,"children":46117},{},[46118],{"type":23,"value":46119},"how updates propagate through the system",{"type":17,"tag":29,"props":46121,"children":46122},{},[46123],{"type":23,"value":46124},"Embedding models cannot fix stale data, missing fields, or broken access control.",{"type":17,"tag":29,"props":46126,"children":46127},{},[46128],{"type":23,"value":46129},"If your integration layer is unreliable, your search results will be too.",{"type":17,"tag":68,"props":46131,"children":46133},{"id":46132},"architecture-that-actually-works-at-scale",[46134],{"type":23,"value":46135},"Architecture that actually works at scale",{"type":17,"tag":29,"props":46137,"children":46138},{},[46139],{"type":23,"value":46140},"A production-ready semantic search system requires five layers:",{"type":17,"tag":239,"props":46142,"children":46144},{"id":46143},"_1-data-access-layer",[46145],{"type":23,"value":46146},"1. Data access layer",{"type":17,"tag":29,"props":46148,"children":46149},{},[46150,46152,46158],{"type":23,"value":46151},"Connect to SaaS platforms and retrieve records along with ",{"type":17,"tag":133,"props":46153,"children":46156},{"href":46154,"rel":46155},"https://docs.unified.to/metadata/metadata/model",[214],[46157],{"type":23,"value":23792},{"type":23,"value":46159}," (timestamps, owners, permissions).",{"type":17,"tag":239,"props":46161,"children":46163},{"id":46162},"_2-normalization-layer",[46164],{"type":23,"value":46165},"2. Normalization layer",{"type":17,"tag":29,"props":46167,"children":46168},{},[46169],{"type":23,"value":46170},"Standardize core objects (e.g., contact, ticket, document) so the rest of the pipeline can operate consistently.",{"type":17,"tag":239,"props":46172,"children":46174},{"id":46173},"_3-event-driven-update-pipeline",[46175],{"type":23,"value":46176},"3. Event-driven update pipeline",{"type":17,"tag":29,"props":46178,"children":46179},{},[46180,46182,46189],{"type":23,"value":46181},"Capture changes using webhooks or change streams. Avoid ",{"type":17,"tag":133,"props":46183,"children":46186},{"href":46184,"rel":46185},"https://medium.com/@mtigo0931/the-complete-guide-to-modern-etl-from-batch-processing-to-real-time-data-pipelines-0b69cc3fdeba",[214],[46187],{"type":23,"value":46188},"batch ETL",{"type":23,"value":54},{"type":17,"tag":239,"props":46191,"children":46193},{"id":46192},"_4-embedding-and-index-layer",[46194],{"type":23,"value":46195},"4. Embedding and index layer",{"type":17,"tag":29,"props":46197,"children":46198},{},[46199],{"type":23,"value":46200},"Generate embeddings incrementally and store them as an index (not a source of truth).",{"type":17,"tag":239,"props":46202,"children":46204},{"id":46203},"_5-retrieval-layer",[46205],{"type":23,"value":46206},"5. Retrieval layer",{"type":17,"tag":29,"props":46208,"children":46209},{},[46210],{"type":23,"value":46211},"Combine vector search, keyword search, and metadata filtering to return accurate results.",{"type":17,"tag":29,"props":46213,"children":46214},{},[46215],{"type":23,"value":46216},"The key is not the embedding model. It is how data flows through these layers.",{"type":17,"tag":68,"props":46218,"children":46220},{"id":46219},"etl-vs-real-time-architecture",[46221],{"type":23,"value":46222},"ETL vs real-time architecture",{"type":17,"tag":29,"props":46224,"children":46225},{},[46226],{"type":23,"value":46227},"Most teams build semantic search on top of synced data. That introduces lag and complexity.",{"type":17,"tag":29,"props":46229,"children":46230},{},[46231],{"type":23,"value":46232},"Here is the difference:",{"type":17,"tag":7231,"props":46234,"children":46235},{},[46236,46257],{"type":17,"tag":7235,"props":46237,"children":46238},{},[46239],{"type":17,"tag":7239,"props":46240,"children":46241},{},[46242,46247,46252],{"type":17,"tag":7243,"props":46243,"children":46244},{},[46245],{"type":23,"value":46246},"Layer",{"type":17,"tag":7243,"props":46248,"children":46249},{},[46250],{"type":23,"value":46251},"Traditional Approach (ETL / stored data)",{"type":17,"tag":7243,"props":46253,"children":46254},{},[46255],{"type":23,"value":46256},"Real-Time Approach (Unified)",{"type":17,"tag":7259,"props":46258,"children":46259},{},[46260,46281,46301,46322,46343,46364,46385],{"type":17,"tag":7239,"props":46261,"children":46262},{},[46263,46271,46276],{"type":17,"tag":7266,"props":46264,"children":46265},{},[46266],{"type":17,"tag":48,"props":46267,"children":46268},{},[46269],{"type":23,"value":46270},"Data access",{"type":17,"tag":7266,"props":46272,"children":46273},{},[46274],{"type":23,"value":46275},"Data copied into a warehouse or integration database",{"type":17,"tag":7266,"props":46277,"children":46278},{},[46279],{"type":23,"value":46280},"Data fetched directly from source APIs",{"type":17,"tag":7239,"props":46282,"children":46283},{},[46284,46291,46296],{"type":17,"tag":7266,"props":46285,"children":46286},{},[46287],{"type":17,"tag":48,"props":46288,"children":46289},{},[46290],{"type":23,"value":9960},{"type":17,"tag":7266,"props":46292,"children":46293},{},[46294],{"type":23,"value":46295},"Delayed (sync intervals)",{"type":17,"tag":7266,"props":46297,"children":46298},{},[46299],{"type":23,"value":46300},"Current on every request",{"type":17,"tag":7239,"props":46302,"children":46303},{},[46304,46312,46317],{"type":17,"tag":7266,"props":46305,"children":46306},{},[46307],{"type":17,"tag":48,"props":46308,"children":46309},{},[46310],{"type":23,"value":46311},"Schema handling",{"type":17,"tag":7266,"props":46313,"children":46314},{},[46315],{"type":23,"value":46316},"Per-provider mapping or flattened schemas",{"type":17,"tag":7266,"props":46318,"children":46319},{},[46320],{"type":23,"value":46321},"Consistent objects per category with full field coverage",{"type":17,"tag":7239,"props":46323,"children":46324},{},[46325,46333,46338],{"type":17,"tag":7266,"props":46326,"children":46327},{},[46328],{"type":17,"tag":48,"props":46329,"children":46330},{},[46331],{"type":23,"value":46332},"Update mechanism",{"type":17,"tag":7266,"props":46334,"children":46335},{},[46336],{"type":23,"value":46337},"Batch ETL or polling",{"type":17,"tag":7266,"props":46339,"children":46340},{},[46341],{"type":23,"value":46342},"Event-driven via webhooks",{"type":17,"tag":7239,"props":46344,"children":46345},{},[46346,46354,46359],{"type":17,"tag":7266,"props":46347,"children":46348},{},[46349],{"type":17,"tag":48,"props":46350,"children":46351},{},[46352],{"type":23,"value":46353},"Embedding updates",{"type":17,"tag":7266,"props":46355,"children":46356},{},[46357],{"type":23,"value":46358},"Recomputed in batches",{"type":17,"tag":7266,"props":46360,"children":46361},{},[46362],{"type":23,"value":46363},"Incremental updates as data changes",{"type":17,"tag":7239,"props":46365,"children":46366},{},[46367,46375,46380],{"type":17,"tag":7266,"props":46368,"children":46369},{},[46370],{"type":17,"tag":48,"props":46371,"children":46372},{},[46373],{"type":23,"value":46374},"Operational complexity",{"type":17,"tag":7266,"props":46376,"children":46377},{},[46378],{"type":23,"value":46379},"Multiple systems (warehouse, sync jobs, vector DB)",{"type":17,"tag":7266,"props":46381,"children":46382},{},[46383],{"type":23,"value":46384},"Fewer layers, no duplicate storage",{"type":17,"tag":7239,"props":46386,"children":46387},{},[46388,46396,46401],{"type":17,"tag":7266,"props":46389,"children":46390},{},[46391],{"type":17,"tag":48,"props":46392,"children":46393},{},[46394],{"type":23,"value":46395},"Suitability for AI search",{"type":17,"tag":7266,"props":46397,"children":46398},{},[46399],{"type":23,"value":46400},"Prone to stale embeddings and drift",{"type":17,"tag":7266,"props":46402,"children":46403},{},[46404],{"type":23,"value":46405},"Supports real-time, accurate retrieval",{"type":17,"tag":29,"props":46407,"children":46408},{},[46409,46414],{"type":17,"tag":133,"props":46410,"children":46412},{"href":46411},"/3266207b83848034a4ccf0aa3606ea93",[46413],{"type":23,"value":1609},{"type":17,"tag":133,"props":46415,"children":46416},{"href":46411},[46417],{"type":17,"tag":48,"props":46418,"children":46419},{},[46420],{"type":23,"value":46421},"Real-Time Data Pipelines vs ETL: What Modern SaaS Systems Actually Need",{"type":17,"tag":68,"props":46423,"children":46425},{"id":46424},"why-database-first-integration-platforms-fall-short",[46426],{"type":23,"value":46427},"Why database-first integration platforms fall short",{"type":17,"tag":29,"props":46429,"children":46430},{},[46431],{"type":23,"value":46432},"Many integration platforms normalize and store a copy of customer data, then expose it through an API.",{"type":17,"tag":29,"props":46434,"children":46435},{},[46436],{"type":23,"value":46437},"This simplifies access, but introduces a second data layer that must be:",{"type":17,"tag":80,"props":46439,"children":46440},{},[46441,46446,46451],{"type":17,"tag":84,"props":46442,"children":46443},{},[46444],{"type":23,"value":46445},"synced with the source",{"type":17,"tag":84,"props":46447,"children":46448},{},[46449],{"type":23,"value":46450},"re-indexed when changes occur",{"type":17,"tag":84,"props":46452,"children":46453},{},[46454],{"type":23,"value":46455},"kept consistent across systems",{"type":17,"tag":29,"props":46457,"children":46458},{},[46459],{"type":23,"value":46460},"For semantic search, this creates specific problems:",{"type":17,"tag":29,"props":46462,"children":46463},{},[46464],{"type":17,"tag":48,"props":46465,"children":46466},{},[46467],{"type":23,"value":46468},"Stale embeddings",{"type":17,"tag":29,"props":46470,"children":46471},{},[46472],{"type":23,"value":46473},"Embeddings are built on synced data, not current data.",{"type":17,"tag":29,"props":46475,"children":46476},{},[46477],{"type":17,"tag":48,"props":46478,"children":46479},{},[46480],{"type":23,"value":46481},"Sync delays",{"type":17,"tag":29,"props":46483,"children":46484},{},[46485],{"type":23,"value":46486},"Updates depend on polling or scheduled jobs.",{"type":17,"tag":29,"props":46488,"children":46489},{},[46490],{"type":17,"tag":48,"props":46491,"children":46492},{},[46493],{"type":23,"value":46494},"Re-indexing overhead",{"type":17,"tag":29,"props":46496,"children":46497},{},[46498],{"type":23,"value":46499},"Changes require reprocessing and re-embedding.",{"type":17,"tag":29,"props":46501,"children":46502},{},[46503],{"type":17,"tag":48,"props":46504,"children":46505},{},[46506],{"type":23,"value":46507},"Data duplication",{"type":17,"tag":29,"props":46509,"children":46510},{},[46511],{"type":23,"value":46512},"Sensitive data is copied into multiple systems, increasing compliance scope.",{"type":17,"tag":29,"props":46514,"children":46515},{},[46516],{"type":23,"value":46517},"This architecture works for reporting and analytics. It is not optimized for real-time retrieval.",{"type":17,"tag":68,"props":46519,"children":46521},{"id":46520},"build-semantic-search-on-real-time-integration-infrastructure",[46522],{"type":23,"value":46523},"Build semantic search on real-time integration infrastructure",{"type":17,"tag":29,"props":46525,"children":46526},{},[46527],{"type":23,"value":46528},"Semantic search systems need current data, consistent objects, and reliable update signals.",{"type":17,"tag":29,"props":46530,"children":46531},{},[46532],{"type":23,"value":46533},"Unified provides this as infrastructure.",{"type":17,"tag":239,"props":46535,"children":46537},{"id":46536},"real-time-data-access",[46538],{"type":23,"value":4711},{"type":17,"tag":29,"props":46540,"children":46541},{},[46542],{"type":23,"value":46543},"Every request is routed directly to the source API. There is no cached replica or sync layer. This ensures that search and embeddings reflect the current state of the data.",{"type":17,"tag":239,"props":46545,"children":46547},{"id":46546},"normalized-objects-without-losing-flexibility",[46548],{"type":23,"value":46549},"Normalized objects without losing flexibility",{"type":17,"tag":29,"props":46551,"children":46552},{},[46553],{"type":23,"value":46554},"Unified standardizes core objects within each category, removing per-provider mapping logic. When needed, provider-specific fields and custom objects remain accessible.",{"type":17,"tag":239,"props":46556,"children":46558},{"id":46557},"event-driven-updates",[46559],{"type":23,"value":46560},"Event-driven updates",{"type":17,"tag":29,"props":46562,"children":46563},{},[46564,46566,46573],{"type":23,"value":46565},"Unified supports native webhooks where available and ",{"type":17,"tag":133,"props":46567,"children":46570},{"href":46568,"rel":46569},"https://unified.to/blog/unlock_real_time_data_with_virtual_webhooks",[214],[46571],{"type":23,"value":46572},"virtual webhooks",{"type":23,"value":46574}," where they are not. This allows systems to react to changes immediately without building polling infrastructure.",{"type":17,"tag":239,"props":46576,"children":46578},{"id":46577},"no-stored-customer-data",[46579],{"type":23,"value":46580},"No stored customer data",{"type":17,"tag":29,"props":46582,"children":46583},{},[46584],{"type":23,"value":46585},"Unified does not store or cache customer data. This avoids duplication, reduces compliance scope, and eliminates drift between systems.",{"type":17,"tag":239,"props":46587,"children":46589},{"id":46588},"built-for-ai-driven-workflows",[46590],{"type":23,"value":46591},"Built for AI-driven workflows",{"type":17,"tag":29,"props":46593,"children":46594},{},[46595],{"type":23,"value":46596},"Because data is current, structured, and permission-aware, it can be used directly in retrieval pipelines and AI applications without additional transformation layers.",{"type":17,"tag":68,"props":46598,"children":46600},{"id":46599},"example-crm-search",[46601],{"type":23,"value":46602},"Example: CRM search",{"type":17,"tag":29,"props":46604,"children":46605},{},[46606],{"type":23,"value":46607},"Consider a user searching: 'show me all overdue deals for Acme'",{"type":17,"tag":29,"props":46609,"children":46610},{},[46611],{"type":17,"tag":48,"props":46612,"children":46613},{},[46614],{"type":23,"value":46615},"Database-first approach",{"type":17,"tag":80,"props":46617,"children":46618},{},[46619,46624,46629,46634],{"type":17,"tag":84,"props":46620,"children":46621},{},[46622],{"type":23,"value":46623},"deal updated in CRM",{"type":17,"tag":84,"props":46625,"children":46626},{},[46627],{"type":23,"value":46628},"sync runs later",{"type":17,"tag":84,"props":46630,"children":46631},{},[46632],{"type":23,"value":46633},"embedding remains outdated",{"type":17,"tag":84,"props":46635,"children":46636},{},[46637],{"type":23,"value":46638},"search returns incorrect results",{"type":17,"tag":29,"props":46640,"children":46641},{},[46642],{"type":17,"tag":48,"props":46643,"children":46644},{},[46645],{"type":23,"value":46646},"Real-time approach",{"type":17,"tag":80,"props":46648,"children":46649},{},[46650,46654,46659,46664],{"type":17,"tag":84,"props":46651,"children":46652},{},[46653],{"type":23,"value":46623},{"type":17,"tag":84,"props":46655,"children":46656},{},[46657],{"type":23,"value":46658},"webhook triggers update",{"type":17,"tag":84,"props":46660,"children":46661},{},[46662],{"type":23,"value":46663},"embedding updated immediately",{"type":17,"tag":84,"props":46665,"children":46666},{},[46667],{"type":23,"value":46668},"search returns correct results",{"type":17,"tag":29,"props":46670,"children":46671},{},[46672],{"type":23,"value":46673},"This difference determines whether users trust the system.",{"type":17,"tag":68,"props":46675,"children":46676},{"id":7672},[46677],{"type":23,"value":7675},{"type":17,"tag":80,"props":46679,"children":46680},{},[46681,46686,46691,46696,46701,46706],{"type":17,"tag":84,"props":46682,"children":46683},{},[46684],{"type":23,"value":46685},"Semantic search failures are usually integration failures, not model failures",{"type":17,"tag":84,"props":46687,"children":46688},{},[46689],{"type":23,"value":46690},"Real-time data access is required to prevent stale embeddings",{"type":17,"tag":84,"props":46692,"children":46693},{},[46694],{"type":23,"value":46695},"Normalized schemas reduce per-provider complexity and improve consistency",{"type":17,"tag":84,"props":46697,"children":46698},{},[46699],{"type":23,"value":46700},"Event-driven updates outperform batch ETL for search systems",{"type":17,"tag":84,"props":46702,"children":46703},{},[46704],{"type":23,"value":46705},"Database-first architectures introduce lag, duplication, and re-indexing overhead",{"type":17,"tag":84,"props":46707,"children":46708},{},[46709],{"type":23,"value":46710},"Real-time integration infrastructure provides a better foundation for AI search",{"type":17,"tag":29,"props":46712,"children":46713},{},[46714],{"type":23,"value":46715},"With the right architecture, semantic search becomes a reliable production capability instead of an experimental feature.",{"type":17,"tag":29,"props":46717,"children":46718},{},[46719],{"type":23,"value":46720},"The difference is not the model you choose. It is how you access, structure, and update your data.",{"type":17,"tag":29,"props":46722,"children":46723},{},[46724],{"type":17,"tag":133,"props":46725,"children":46726},{"href":45703},[46727],{"type":23,"value":44481},{"type":17,"tag":29,"props":46729,"children":46730},{},[46731],{"type":17,"tag":133,"props":46732,"children":46733},{"href":45703},[46734],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":46736},[46737,46738,46739,46746,46747,46754,46755,46756,46763,46764],{"id":45785,"depth":1629,"text":45788},{"id":45936,"depth":1629,"text":45939},{"id":46017,"depth":1629,"text":46020,"children":46740},[46741,46742,46743,46744,46745],{"id":46028,"depth":1635,"text":46031},{"id":46039,"depth":1635,"text":46042},{"id":46050,"depth":1635,"text":46053},{"id":46061,"depth":1635,"text":46064},{"id":46072,"depth":1635,"text":46075},{"id":46083,"depth":1629,"text":46086},{"id":46132,"depth":1629,"text":46135,"children":46748},[46749,46750,46751,46752,46753],{"id":46143,"depth":1635,"text":46146},{"id":46162,"depth":1635,"text":46165},{"id":46173,"depth":1635,"text":46176},{"id":46192,"depth":1635,"text":46195},{"id":46203,"depth":1635,"text":46206},{"id":46219,"depth":1629,"text":46222},{"id":46424,"depth":1629,"text":46427},{"id":46520,"depth":1629,"text":46523,"children":46757},[46758,46759,46760,46761,46762],{"id":46536,"depth":1635,"text":4711},{"id":46546,"depth":1635,"text":46549},{"id":46557,"depth":1635,"text":46560},{"id":46577,"depth":1635,"text":46580},{"id":46588,"depth":1635,"text":46591},{"id":46599,"depth":1629,"text":46602},{"id":7672,"depth":1629,"text":7675},"content:blog:how_to_build_enterprise_grade_semantic_search_in_2026_that_actually_works_at_scale.md","blog/how_to_build_enterprise_grade_semantic_search_in_2026_that_actually_works_at_scale.md","blog/how_to_build_enterprise_grade_semantic_search_in_2026_that_actually_works_at_scale",{"_path":46769,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":11794,"description":46770,"img":46771,"date":46772,"tag":12,"body":46773,"_type":1677,"_id":47074,"_source":1679,"_file":47075,"_stem":47076,"_extension":1682},"/blog/how_unified_prioritizes_new_features","We've built a next-generation architecture that allows us to move quickly while keeping maintenance overhead low.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_unified_prioritizes_new_features-icon.png","2026-03-16T00:00:00.000Z",{"type":14,"children":46774,"toc":47067},[46775,46780,46783,46791,46795,46800,46808,46813,46819,46835,46841,46846,46857,46862,46868,46873,46878,46883,46961,46967,46972,46981,46990,47012,47017,47022,47036],{"type":17,"tag":18,"props":46776,"children":46778},{"id":46777},"how-unified-prioritizes-new-features",[46779],{"type":23,"value":11794},{"type":17,"tag":25,"props":46781,"children":46782},{},[],{"type":17,"tag":29,"props":46784,"children":46785},{},[46786],{"type":17,"tag":33,"props":46787,"children":46788},{},[46789],{"type":23,"value":46790},"March 16, 2026",{"type":17,"tag":29,"props":46792,"children":46793},{},[46794],{"type":23,"value":46770},{"type":17,"tag":29,"props":46796,"children":46797},{},[46798],{"type":23,"value":46799},"With this architecture, along with our internal AI-assisted build processes, we can typically build a new API integration in under an hour, or introduce a new data model across an entire integration category within a few hours.",{"type":17,"tag":29,"props":46801,"children":46802},{},[46803],{"type":17,"tag":48,"props":46804,"children":46805},{},[46806],{"type":23,"value":46807},"But how do we decide what to build?",{"type":17,"tag":29,"props":46809,"children":46810},{},[46811],{"type":23,"value":46812},"Below is how we approach prioritization and the systems that support it.",{"type":17,"tag":68,"props":46814,"children":46816},{"id":46815},"two-pillars-of-prioritization",[46817],{"type":23,"value":46818},"Two Pillars of Prioritization",{"type":17,"tag":29,"props":46820,"children":46821},{},[46822,46824,46829,46830],{"type":23,"value":46823},"Our roadmap decisions fall into two primary categories: ",{"type":17,"tag":48,"props":46825,"children":46826},{},[46827],{"type":23,"value":46828},"strategic initiatives",{"type":23,"value":34435},{"type":17,"tag":48,"props":46831,"children":46832},{},[46833],{"type":23,"value":46834},"customer-led development.",{"type":17,"tag":239,"props":46836,"children":46838},{"id":46837},"strategic",[46839],{"type":23,"value":46840},"Strategic",{"type":17,"tag":29,"props":46842,"children":46843},{},[46844],{"type":23,"value":46845},"Our goal is to become the default integration infrastructure for SaaS products.",{"type":17,"tag":29,"props":46847,"children":46848},{},[46849,46851,46855],{"type":23,"value":46850},"We evaluate new verticals and use cases to determine where a ",{"type":17,"tag":133,"props":46852,"children":46853},{"href":7691},[46854],{"type":23,"value":7459},{"type":23,"value":46856}," delivers the most value. Strategic work is then sequenced into the roadmap behind high-priority feature requests and critical defects.",{"type":17,"tag":29,"props":46858,"children":46859},{},[46860],{"type":23,"value":46861},"Given our architecture, introducing a new vertical typically takes no more than a week of engineering effort.",{"type":17,"tag":239,"props":46863,"children":46865},{"id":46864},"customer-led",[46866],{"type":23,"value":46867},"Customer-Led",{"type":17,"tag":29,"props":46869,"children":46870},{},[46871],{"type":23,"value":46872},"Most of our roadmap is driven by direct interaction with customers and prospects.",{"type":17,"tag":29,"props":46874,"children":46875},{},[46876],{"type":23,"value":46877},"Since our earliest version, we've relied on customer input to guide what gets built next.",{"type":17,"tag":29,"props":46879,"children":46880},{},[46881],{"type":23,"value":46882},"Our prioritization hierarchy:",{"type":17,"tag":6154,"props":46884,"children":46885},{},[46886,46899,46912,46935,46948],{"type":17,"tag":84,"props":46887,"children":46888},{},[46889,46894,46897],{"type":17,"tag":48,"props":46890,"children":46891},{},[46892],{"type":23,"value":46893},"Critical blockers",{"type":17,"tag":3891,"props":46895,"children":46896},{},[],{"type":23,"value":46898},"Issues that prevent customers from using the product are addressed immediately. Our internal SLA is under one hour, and we track resolution times closely.",{"type":17,"tag":84,"props":46900,"children":46901},{},[46902,46907,46910],{"type":17,"tag":48,"props":46903,"children":46904},{},[46905],{"type":23,"value":46906},"Defects and backfill",{"type":17,"tag":3891,"props":46908,"children":46909},{},[],{"type":23,"value":46911},"Non-blocking issues and gaps in existing functionality are prioritized based on severity and impact.",{"type":17,"tag":84,"props":46913,"children":46914},{},[46915,46920,46923,46925,46928,46930,46933],{"type":17,"tag":48,"props":46916,"children":46917},{},[46918],{"type":23,"value":46919},"Feature requests from paying customers",{"type":17,"tag":3891,"props":46921,"children":46922},{},[],{"type":23,"value":46924},"These are prioritized based on customer timelines and urgency, with near-term deadlines taking precedence.",{"type":17,"tag":3891,"props":46926,"children":46927},{},[],{"type":23,"value":46929},"Volume also matters — features requested by multiple customers are prioritized higher.",{"type":17,"tag":3891,"props":46931,"children":46932},{},[],{"type":23,"value":46934},"We focus heavily on customer experience, ensuring our customers can deliver reliably to their own end users.",{"type":17,"tag":84,"props":46936,"children":46937},{},[46938,46943,46946],{"type":17,"tag":48,"props":46939,"children":46940},{},[46941],{"type":23,"value":46942},"Enterprise customer requests",{"type":17,"tag":3891,"props":46944,"children":46945},{},[],{"type":23,"value":46947},"Customers on Enterprise plans receive additional prioritization as part of their service tier.",{"type":17,"tag":84,"props":46949,"children":46950},{},[46951,46956,46959],{"type":17,"tag":48,"props":46952,"children":46953},{},[46954],{"type":23,"value":46955},"Prospect and internal requests",{"type":17,"tag":3891,"props":46957,"children":46958},{},[],{"type":23,"value":46960},"Requests from prospects and internal team members are evaluated last, but still inform long-term roadmap direction.",{"type":17,"tag":68,"props":46962,"children":46964},{"id":46963},"tooling",[46965],{"type":23,"value":46966},"Tooling",{"type":17,"tag":29,"props":46968,"children":46969},{},[46970],{"type":23,"value":46971},"Over time, we've used a range of product tools — including Asana, Jira, and GitHub Issues. At Unified, we've intentionally consolidated into a small set of tools that work well together.",{"type":17,"tag":29,"props":46973,"children":46974},{},[46975,46979],{"type":17,"tag":48,"props":46976,"children":46977},{},[46978],{"type":23,"value":3204},{"type":23,"value":46980}," is our central communication layer for both internal collaboration and customer interaction. Customers are onboarded into private channels, which are connected to our support and roadmap systems.",{"type":17,"tag":29,"props":46982,"children":46983},{},[46984,46988],{"type":17,"tag":48,"props":46985,"children":46986},{},[46987],{"type":23,"value":23053},{"type":23,"value":46989}," is our core product system. We use it to manage:",{"type":17,"tag":80,"props":46991,"children":46992},{},[46993,46997,47002,47007],{"type":17,"tag":84,"props":46994,"children":46995},{},[46996],{"type":23,"value":25731},{"type":17,"tag":84,"props":46998,"children":46999},{},[47000],{"type":23,"value":47001},"task tracking",{"type":17,"tag":84,"props":47003,"children":47004},{},[47005],{"type":23,"value":47006},"roadmap",{"type":17,"tag":84,"props":47008,"children":47009},{},[47010],{"type":23,"value":47011},"support tickets",{"type":17,"tag":29,"props":47013,"children":47014},{},[47015],{"type":23,"value":47016},"All systems are connected within a single database.",{"type":17,"tag":29,"props":47018,"children":47019},{},[47020],{"type":23,"value":47021},"Our Notion roadmap automatically calculates prioritization based on the framework above and syncs updates back to customer Slack channels, so customers can track progress on their requests and issues.",{"type":17,"tag":29,"props":47023,"children":47024},{},[47025,47027,47034],{"type":23,"value":47026},"The pace of our output — visible in our ",{"type":17,"tag":133,"props":47028,"children":47031},{"href":47029,"rel":47030},"https://unified.to/changelog",[214],[47032],{"type":23,"value":47033},"changelog",{"type":23,"value":47035}," — reflects both our architecture and our prioritization system working together.",{"type":17,"tag":29,"props":47037,"children":47038},{},[47039,47041,47051,47053,47063],{"type":23,"value":47040},"Customers can track their tickets in the ",{"type":17,"tag":133,"props":47042,"children":47045},{"href":47043,"rel":47044},"https://app.unified.to/help/tickets",[214],[47046],{"type":17,"tag":48,"props":47047,"children":47048},{},[47049],{"type":23,"value":47050},"Unified ticket portal",{"type":23,"value":47052}," and view the ",{"type":17,"tag":133,"props":47054,"children":47057},{"href":47055,"rel":47056},"https://app.unified.to/help/roadmap",[214],[47058],{"type":17,"tag":48,"props":47059,"children":47060},{},[47061],{"type":23,"value":47062},"integration roadmap",{"type":17,"tag":48,"props":47064,"children":47065},{},[47066],{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":47068},[47069,47073],{"id":46815,"depth":1629,"text":46818,"children":47070},[47071,47072],{"id":46837,"depth":1635,"text":46840},{"id":46864,"depth":1635,"text":46867},{"id":46963,"depth":1629,"text":46966},"content:blog:how_unified_prioritizes_new_features.md","blog/how_unified_prioritizes_new_features.md","blog/how_unified_prioritizes_new_features",{"_path":47078,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":11547,"description":47079,"img":47080,"date":47081,"tag":6341,"body":47082,"_type":1677,"_id":49439,"_source":1679,"_file":49440,"_stem":49441,"_extension":1682},"/blog/creating_ads_using_the_unified_ads_api","The Unified API Ads category models advertising structures across Meta, Google, Amazon, Twitter, LinkedIn, and other providers. Understanding how objects...","https://s3.us-east-2.amazonaws.com/unified-article-images/creating_ads_using_the_unified_ads_api-icon.png","2026-03-14T23:39:00.000Z",{"type":14,"children":47083,"toc":49401},[47084,47089,47092,47100,47106,47116,47122,47127,47136,47299,47305,47409,47415,47494,47499,47544,47550,47555,47740,47748,47754,47759,47850,47868,47871,47877,47889,47908,47917,47920,47926,47931,48036,48042,48236,48239,48245,48257,48272,48280,48421,48427,48438,48443,48452,48458,48467,48473,48482,48517,48523,48556,48559,48565,48571,48580,48586,48595,48601,48610,48616,48625,48631,48640,48643,48649,48668,48674,48679,48693,48700,48847,48953,48987,48993,49002,49006,49015,49021,49030,49034,49043,49049,49058,49064,49097,49195,49198,49204,49210,49215,49224,49229,49238,49244,49253,49259,49271,49280,49335,49341,49350,49356,49361,49370,49389,49398],{"type":17,"tag":18,"props":47085,"children":47087},{"id":47086},"creating-ads-using-the-unified-ads-api",[47088],{"type":23,"value":11547},{"type":17,"tag":25,"props":47090,"children":47091},{},[],{"type":17,"tag":29,"props":47093,"children":47094},{},[47095],{"type":17,"tag":33,"props":47096,"children":47097},{},[47098],{"type":23,"value":47099},"March 14, 2026",{"type":17,"tag":18,"props":47101,"children":47103},{"id":47102},"unified-ads-api-overview",[47104],{"type":23,"value":47105},"Unified Ads API Overview",{"type":17,"tag":29,"props":47107,"children":47108},{},[47109,47110,47114],{"type":23,"value":6712},{"type":17,"tag":133,"props":47111,"children":47112},{"href":7691},[47113],{"type":23,"value":7806},{"type":23,"value":47115}," Ads category models advertising structures across Meta, Google, Amazon, Twitter, LinkedIn, and other providers. Understanding how objects relate helps you build the correc flows.",{"type":17,"tag":239,"props":47117,"children":47119},{"id":47118},"core-hierarchy",[47120],{"type":23,"value":47121},"Core Hierarchy",{"type":17,"tag":29,"props":47123,"children":47124},{},[47125],{"type":23,"value":47126},"Most integrations follow a hierarchy from organization → campaign → ad group → ad:",{"type":17,"tag":6893,"props":47128,"children":47131},{"className":47129,"code":47130,"language":20901,"meta":23},[20899],"ads_organization (ad account)\n    └── ads_campaign\n            └── ads_group (ad set, line item, etc.)\n                    └── ads_ad\n",[47132],{"type":17,"tag":6121,"props":47133,"children":47134},{"__ignoreMap":7},[47135],{"type":23,"value":47130},{"type":17,"tag":7231,"props":47137,"children":47138},{},[47139,47163],{"type":17,"tag":7235,"props":47140,"children":47141},{},[47142],{"type":17,"tag":7239,"props":47143,"children":47144},{},[47145,47149,47153,47158],{"type":17,"tag":7243,"props":47146,"children":47147},{},[47148],{"type":23,"value":18594},{"type":17,"tag":7243,"props":47150,"children":47151},{},[47152],{"type":23,"value":24525},{"type":17,"tag":7243,"props":47154,"children":47155},{},[47156],{"type":23,"value":47157},"Parent(s)",{"type":17,"tag":7243,"props":47159,"children":47160},{},[47161],{"type":23,"value":47162},"Typical use",{"type":17,"tag":7259,"props":47164,"children":47165},{},[47166,47192,47221,47257],{"type":17,"tag":7239,"props":47167,"children":47168},{},[47169,47177,47182,47187],{"type":17,"tag":7266,"props":47170,"children":47171},{},[47172],{"type":17,"tag":48,"props":47173,"children":47174},{},[47175],{"type":23,"value":47176},"ads_organization",{"type":17,"tag":7266,"props":47178,"children":47179},{},[47180],{"type":23,"value":47181},"The ad account (e.g., Meta ad account, Google Ads customer). Billing and access are scoped here.",{"type":17,"tag":7266,"props":47183,"children":47184},{},[47185],{"type":23,"value":47186},"—",{"type":17,"tag":7266,"props":47188,"children":47189},{},[47190],{"type":23,"value":47191},"List accounts, select which account to use",{"type":17,"tag":7239,"props":47193,"children":47194},{},[47195,47203,47208,47216],{"type":17,"tag":7266,"props":47196,"children":47197},{},[47198],{"type":17,"tag":48,"props":47199,"children":47200},{},[47201],{"type":23,"value":47202},"ads_campaign",{"type":17,"tag":7266,"props":47204,"children":47205},{},[47206],{"type":23,"value":47207},"A campaign groups ad sets under a goal, budget, and schedule.",{"type":17,"tag":7266,"props":47209,"children":47210},{},[47211],{"type":17,"tag":6121,"props":47212,"children":47214},{"className":47213},[],[47215],{"type":23,"value":22399},{"type":17,"tag":7266,"props":47217,"children":47218},{},[47219],{"type":23,"value":47220},"Set campaign-level budget, dates, objective",{"type":17,"tag":7239,"props":47222,"children":47223},{},[47224,47232,47237,47252],{"type":17,"tag":7266,"props":47225,"children":47226},{},[47227],{"type":17,"tag":48,"props":47228,"children":47229},{},[47230],{"type":23,"value":47231},"ads_group",{"type":17,"tag":7266,"props":47233,"children":47234},{},[47235],{"type":23,"value":47236},"An ad set or line item. Holds targeting, bid, and budget. Often called \"ad set\" (Meta) or \"line item\" (DV360).",{"type":17,"tag":7266,"props":47238,"children":47239},{},[47240,47246,47247],{"type":17,"tag":6121,"props":47241,"children":47243},{"className":47242},[],[47244],{"type":23,"value":47245},"campaign_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":47248,"children":47250},{"className":47249},[],[47251],{"type":23,"value":22399},{"type":17,"tag":7266,"props":47253,"children":47254},{},[47255],{"type":23,"value":47256},"Define who sees ads (targeting), bid strategy, promoted object",{"type":17,"tag":7239,"props":47258,"children":47259},{},[47260,47268,47273,47294],{"type":17,"tag":7266,"props":47261,"children":47262},{},[47263],{"type":17,"tag":48,"props":47264,"children":47265},{},[47266],{"type":23,"value":47267},"ads_ad",{"type":17,"tag":7266,"props":47269,"children":47270},{},[47271],{"type":23,"value":47272},"The actual ad creative + placement. What users see.",{"type":17,"tag":7266,"props":47274,"children":47275},{},[47276,47282,47283,47288,47289],{"type":17,"tag":6121,"props":47277,"children":47279},{"className":47278},[],[47280],{"type":23,"value":47281},"group_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":47284,"children":47286},{"className":47285},[],[47287],{"type":23,"value":47245},{"type":23,"value":11826},{"type":17,"tag":6121,"props":47290,"children":47292},{"className":47291},[],[47293],{"type":23,"value":22399},{"type":17,"tag":7266,"props":47295,"children":47296},{},[47297],{"type":23,"value":47298},"Creative content, destination URL, promoted entity (e.g., tweet, product)",{"type":17,"tag":239,"props":47300,"children":47302},{"id":47301},"creatives-and-insertion-orders",[47303],{"type":23,"value":47304},"Creatives and Insertion Orders",{"type":17,"tag":7231,"props":47306,"children":47307},{},[47308,47330],{"type":17,"tag":7235,"props":47309,"children":47310},{},[47311],{"type":17,"tag":7239,"props":47312,"children":47313},{},[47314,47318,47322,47326],{"type":17,"tag":7243,"props":47315,"children":47316},{},[47317],{"type":23,"value":18594},{"type":17,"tag":7243,"props":47319,"children":47320},{},[47321],{"type":23,"value":24525},{"type":17,"tag":7243,"props":47323,"children":47324},{},[47325],{"type":23,"value":47157},{"type":17,"tag":7243,"props":47327,"children":47328},{},[47329],{"type":23,"value":6701},{"type":17,"tag":7259,"props":47331,"children":47332},{},[47333,47374],{"type":17,"tag":7239,"props":47334,"children":47335},{},[47336,47344,47349,47369],{"type":17,"tag":7266,"props":47337,"children":47338},{},[47339],{"type":17,"tag":48,"props":47340,"children":47341},{},[47342],{"type":23,"value":47343},"ads_creative",{"type":17,"tag":7266,"props":47345,"children":47346},{},[47347],{"type":23,"value":47348},"The creative asset (image, video, copy). Some providers treat it as a separate resource; others embed it in the ad.",{"type":17,"tag":7266,"props":47350,"children":47351},{},[47352,47357,47358,47363,47364],{"type":17,"tag":6121,"props":47353,"children":47355},{"className":47354},[],[47356],{"type":23,"value":47281},{"type":23,"value":11826},{"type":17,"tag":6121,"props":47359,"children":47361},{"className":47360},[],[47362],{"type":23,"value":47245},{"type":23,"value":11826},{"type":17,"tag":6121,"props":47365,"children":47367},{"className":47366},[],[47368],{"type":23,"value":22399},{"type":17,"tag":7266,"props":47370,"children":47371},{},[47372],{"type":23,"value":47373},"Meta: can be shared across ads. Amazon/Twitter: often 1:1 with ad.",{"type":17,"tag":7239,"props":47375,"children":47376},{},[47377,47385,47390,47404],{"type":17,"tag":7266,"props":47378,"children":47379},{},[47380],{"type":17,"tag":48,"props":47381,"children":47382},{},[47383],{"type":23,"value":47384},"ads_insertionorder",{"type":17,"tag":7266,"props":47386,"children":47387},{},[47388],{"type":23,"value":47389},"DV360-specific. Sits between campaign and line item.",{"type":17,"tag":7266,"props":47391,"children":47392},{},[47393,47398,47399],{"type":17,"tag":6121,"props":47394,"children":47396},{"className":47395},[],[47397],{"type":23,"value":47245},{"type":23,"value":11826},{"type":17,"tag":6121,"props":47400,"children":47402},{"className":47401},[],[47403],{"type":23,"value":22399},{"type":17,"tag":7266,"props":47405,"children":47406},{},[47407],{"type":23,"value":47408},"Similar to a purchase order for a campaign.",{"type":17,"tag":239,"props":47410,"children":47412},{"id":47411},"discovery",[47413],{"type":23,"value":47414},"Discovery",{"type":17,"tag":7231,"props":47416,"children":47417},{},[47418,47436],{"type":17,"tag":7235,"props":47419,"children":47420},{},[47421],{"type":17,"tag":7239,"props":47422,"children":47423},{},[47424,47428,47432],{"type":17,"tag":7243,"props":47425,"children":47426},{},[47427],{"type":23,"value":18594},{"type":17,"tag":7243,"props":47429,"children":47430},{},[47431],{"type":23,"value":24525},{"type":17,"tag":7243,"props":47433,"children":47434},{},[47435],{"type":23,"value":20787},{"type":17,"tag":7259,"props":47437,"children":47438},{},[47439,47466],{"type":17,"tag":7239,"props":47440,"children":47441},{},[47442,47449,47454],{"type":17,"tag":7266,"props":47443,"children":47444},{},[47445],{"type":17,"tag":48,"props":47446,"children":47447},{},[47448],{"type":23,"value":11510},{"type":17,"tag":7266,"props":47450,"children":47451},{},[47452],{"type":23,"value":47453},"Targeting options (countries, regions, interests, etc.).",{"type":17,"tag":7266,"props":47455,"children":47456},{},[47457,47459,47464],{"type":23,"value":47458},"Look up valid IDs to use in ",{"type":17,"tag":6121,"props":47460,"children":47462},{"className":47461},[],[47463],{"type":23,"value":40487},{"type":23,"value":47465}," when creating campaigns/groups.",{"type":17,"tag":7239,"props":47467,"children":47468},{},[47469,47477,47482],{"type":17,"tag":7266,"props":47470,"children":47471},{},[47472],{"type":17,"tag":48,"props":47473,"children":47474},{},[47475],{"type":23,"value":47476},"ads_promote",{"type":17,"tag":7266,"props":47478,"children":47479},{},[47480],{"type":23,"value":47481},"Promoted entities (pages, apps, products, tweets, ad group types).",{"type":17,"tag":7266,"props":47483,"children":47484},{},[47485,47487,47492],{"type":23,"value":47486},"Look up or pass IDs for ",{"type":17,"tag":6121,"props":47488,"children":47490},{"className":47489},[],[47491],{"type":23,"value":11521},{"type":23,"value":47493}," when creating groups/ads/creatives.",{"type":17,"tag":239,"props":47495,"children":47496},{"id":966},[47497],{"type":23,"value":47498},"Reporting",{"type":17,"tag":7231,"props":47500,"children":47501},{},[47502,47520],{"type":17,"tag":7235,"props":47503,"children":47504},{},[47505],{"type":17,"tag":7239,"props":47506,"children":47507},{},[47508,47512,47516],{"type":17,"tag":7243,"props":47509,"children":47510},{},[47511],{"type":23,"value":18594},{"type":17,"tag":7243,"props":47513,"children":47514},{},[47515],{"type":23,"value":24525},{"type":17,"tag":7243,"props":47517,"children":47518},{},[47519],{"type":23,"value":20787},{"type":17,"tag":7259,"props":47521,"children":47522},{},[47523],{"type":17,"tag":7239,"props":47524,"children":47525},{},[47526,47534,47539],{"type":17,"tag":7266,"props":47527,"children":47528},{},[47529],{"type":17,"tag":48,"props":47530,"children":47531},{},[47532],{"type":23,"value":47533},"ads_report",{"type":17,"tag":7266,"props":47535,"children":47536},{},[47537],{"type":23,"value":47538},"Performance metrics.",{"type":17,"tag":7266,"props":47540,"children":47541},{},[47542],{"type":23,"value":47543},"Fetch impressions, clicks, spend, etc. by org, campaign, group, or ad.",{"type":17,"tag":239,"props":47545,"children":47547},{"id":47546},"provider-mapping",[47548],{"type":23,"value":47549},"Provider Mapping",{"type":17,"tag":29,"props":47551,"children":47552},{},[47553],{"type":23,"value":47554},"Naming varies by provider:",{"type":17,"tag":7231,"props":47556,"children":47557},{},[47558,47590],{"type":17,"tag":7235,"props":47559,"children":47560},{},[47561],{"type":17,"tag":7239,"props":47562,"children":47563},{},[47564,47568,47572,47576,47581,47586],{"type":17,"tag":7243,"props":47565,"children":47566},{},[47567],{"type":23,"value":7806},{"type":17,"tag":7243,"props":47569,"children":47570},{},[47571],{"type":23,"value":11332},{"type":17,"tag":7243,"props":47573,"children":47574},{},[47575],{"type":23,"value":11337},{"type":17,"tag":7243,"props":47577,"children":47578},{},[47579],{"type":23,"value":47580},"Amazon Ads",{"type":17,"tag":7243,"props":47582,"children":47583},{},[47584],{"type":23,"value":47585},"Twitter Ads",{"type":17,"tag":7243,"props":47587,"children":47588},{},[47589],{"type":23,"value":11357},{"type":17,"tag":7259,"props":47591,"children":47592},{},[47593,47625,47653,47683,47712],{"type":17,"tag":7239,"props":47594,"children":47595},{},[47596,47600,47605,47610,47615,47620],{"type":17,"tag":7266,"props":47597,"children":47598},{},[47599],{"type":23,"value":47176},{"type":17,"tag":7266,"props":47601,"children":47602},{},[47603],{"type":23,"value":47604},"Ad Account",{"type":17,"tag":7266,"props":47606,"children":47607},{},[47608],{"type":23,"value":47609},"Customer",{"type":17,"tag":7266,"props":47611,"children":47612},{},[47613],{"type":23,"value":47614},"Profile",{"type":17,"tag":7266,"props":47616,"children":47617},{},[47618],{"type":23,"value":47619},"Account",{"type":17,"tag":7266,"props":47621,"children":47622},{},[47623],{"type":23,"value":47624},"Sponsored Account",{"type":17,"tag":7239,"props":47626,"children":47627},{},[47628,47632,47636,47640,47644,47648],{"type":17,"tag":7266,"props":47629,"children":47630},{},[47631],{"type":23,"value":47202},{"type":17,"tag":7266,"props":47633,"children":47634},{},[47635],{"type":23,"value":18610},{"type":17,"tag":7266,"props":47637,"children":47638},{},[47639],{"type":23,"value":18610},{"type":17,"tag":7266,"props":47641,"children":47642},{},[47643],{"type":23,"value":18610},{"type":17,"tag":7266,"props":47645,"children":47646},{},[47647],{"type":23,"value":18610},{"type":17,"tag":7266,"props":47649,"children":47650},{},[47651],{"type":23,"value":47652},"Campaign Group",{"type":17,"tag":7239,"props":47654,"children":47655},{},[47656,47660,47665,47670,47674,47679],{"type":17,"tag":7266,"props":47657,"children":47658},{},[47659],{"type":23,"value":47231},{"type":17,"tag":7266,"props":47661,"children":47662},{},[47663],{"type":23,"value":47664},"Ad Set",{"type":17,"tag":7266,"props":47666,"children":47667},{},[47668],{"type":23,"value":47669},"Ad Group",{"type":17,"tag":7266,"props":47671,"children":47672},{},[47673],{"type":23,"value":47669},{"type":17,"tag":7266,"props":47675,"children":47676},{},[47677],{"type":23,"value":47678},"Line Item",{"type":17,"tag":7266,"props":47680,"children":47681},{},[47682],{"type":23,"value":18610},{"type":17,"tag":7239,"props":47684,"children":47685},{},[47686,47690,47694,47698,47703,47708],{"type":17,"tag":7266,"props":47687,"children":47688},{},[47689],{"type":23,"value":47267},{"type":17,"tag":7266,"props":47691,"children":47692},{},[47693],{"type":23,"value":18636},{"type":17,"tag":7266,"props":47695,"children":47696},{},[47697],{"type":23,"value":18636},{"type":17,"tag":7266,"props":47699,"children":47700},{},[47701],{"type":23,"value":47702},"Product Ad",{"type":17,"tag":7266,"props":47704,"children":47705},{},[47706],{"type":23,"value":47707},"Promoted Tweet",{"type":17,"tag":7266,"props":47709,"children":47710},{},[47711],{"type":23,"value":18641},{"type":17,"tag":7239,"props":47713,"children":47714},{},[47715,47719,47724,47728,47732,47736],{"type":17,"tag":7266,"props":47716,"children":47717},{},[47718],{"type":23,"value":47343},{"type":17,"tag":7266,"props":47720,"children":47721},{},[47722],{"type":23,"value":47723},"Ad Creative",{"type":17,"tag":7266,"props":47725,"children":47726},{},[47727],{"type":23,"value":18636},{"type":17,"tag":7266,"props":47729,"children":47730},{},[47731],{"type":23,"value":47702},{"type":17,"tag":7266,"props":47733,"children":47734},{},[47735],{"type":23,"value":47707},{"type":17,"tag":7266,"props":47737,"children":47738},{},[47739],{"type":23,"value":18641},{"type":17,"tag":29,"props":47741,"children":47742},{},[47743],{"type":17,"tag":33,"props":47744,"children":47745},{},[47746],{"type":23,"value":47747},"Some integrations collapse levels (e.g., LinkedIn's \"Campaign\" maps to our ads_group).",{"type":17,"tag":239,"props":47749,"children":47751},{"id":47750},"creating-ads-required-parent-ids",[47752],{"type":23,"value":47753},"Creating Ads: Required Parent IDs",{"type":17,"tag":29,"props":47755,"children":47756},{},[47757],{"type":23,"value":47758},"When creating objects, you typically need parent IDs:",{"type":17,"tag":80,"props":47760,"children":47761},{},[47762,47776,47796,47822],{"type":17,"tag":84,"props":47763,"children":47764},{},[47765,47770,47771],{"type":17,"tag":48,"props":47766,"children":47767},{},[47768],{"type":23,"value":47769},"Create campaign:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":47772,"children":47774},{"className":47773},[],[47775],{"type":23,"value":22399},{"type":17,"tag":84,"props":47777,"children":47778},{},[47779,47784,47785,47790,47791],{"type":17,"tag":48,"props":47780,"children":47781},{},[47782],{"type":23,"value":47783},"Create ad group:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":47786,"children":47788},{"className":47787},[],[47789],{"type":23,"value":22399},{"type":23,"value":11826},{"type":17,"tag":6121,"props":47792,"children":47794},{"className":47793},[],[47795],{"type":23,"value":47245},{"type":17,"tag":84,"props":47797,"children":47798},{},[47799,47804,47805,47810,47811,47816,47817],{"type":17,"tag":48,"props":47800,"children":47801},{},[47802],{"type":23,"value":47803},"Create ad:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":47806,"children":47808},{"className":47807},[],[47809],{"type":23,"value":22399},{"type":23,"value":11826},{"type":17,"tag":6121,"props":47812,"children":47814},{"className":47813},[],[47815],{"type":23,"value":47245},{"type":23,"value":11826},{"type":17,"tag":6121,"props":47818,"children":47820},{"className":47819},[],[47821],{"type":23,"value":47281},{"type":17,"tag":84,"props":47823,"children":47824},{},[47825,47830,47831,47836,47837,47842,47843,47848],{"type":17,"tag":48,"props":47826,"children":47827},{},[47828],{"type":23,"value":47829},"Create creative:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":47832,"children":47834},{"className":47833},[],[47835],{"type":23,"value":22399},{"type":23,"value":11826},{"type":17,"tag":6121,"props":47838,"children":47840},{"className":47839},[],[47841],{"type":23,"value":47245},{"type":23,"value":11826},{"type":17,"tag":6121,"props":47844,"children":47846},{"className":47845},[],[47847],{"type":23,"value":47281},{"type":23,"value":47849}," (varies by provider)",{"type":17,"tag":29,"props":47851,"children":47852},{},[47853,47854,47859,47861,47866],{"type":23,"value":6712},{"type":17,"tag":6121,"props":47855,"children":47857},{"className":47856},[],[47858],{"type":23,"value":11521},{"type":23,"value":47860}," field is required when creating ad groups or ads that need a promoted entity (e.g., Meta ad set with a page, Twitter promoted tweet with a tweet ID). Use ",{"type":17,"tag":6121,"props":47862,"children":47864},{"className":47863},[],[47865],{"type":23,"value":47476},{"type":23,"value":47867}," to discover options, or pass IDs manually when the provider has no list API.",{"type":17,"tag":25,"props":47869,"children":47870},{},[],{"type":17,"tag":18,"props":47872,"children":47874},{"id":47873},"promoted-explained",[47875],{"type":23,"value":47876},"Promoted Explained",{"type":17,"tag":29,"props":47878,"children":47879},{},[47880,47882,47887],{"type":23,"value":47881},"The new ",{"type":17,"tag":6121,"props":47883,"children":47885},{"className":47884},[],[47886],{"type":23,"value":11521},{"type":23,"value":47888}," field specifies promoted entities (pages, apps, products, tweets, ad group types) when creating and managing ads across the Unified API.",{"type":17,"tag":29,"props":47890,"children":47891},{},[47892,47894,47899,47901,47906],{"type":23,"value":47893},"Ads, Campaigns, and AdGroups have a ",{"type":17,"tag":6121,"props":47895,"children":47897},{"className":47896},[],[47898],{"type":23,"value":11521},{"type":23,"value":47900}," field to specify an ID of an entity to promote.  There is also a ",{"type":17,"tag":6121,"props":47902,"children":47904},{"className":47903},[],[47905],{"type":23,"value":47476},{"type":23,"value":47907}," endpoint that provides a clean way to query the promoted entities.",{"type":17,"tag":6893,"props":47909,"children":47912},{"className":47910,"code":47911,"language":22503,"meta":7},[22501],"{\n  \"organization_id\": \"act_123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"My Ad Group\",\n  \"promoted\": [\n    { \"id\": \"789\", \"type\": \"PAGE_ID\" }\n  ]\n}\n",[47913],{"type":17,"tag":6121,"props":47914,"children":47915},{"__ignoreMap":7},[47916],{"type":23,"value":47911},{"type":17,"tag":25,"props":47918,"children":47919},{},[],{"type":17,"tag":68,"props":47921,"children":47923},{"id":47922},"the-adspromoted-object",[47924],{"type":23,"value":47925},"The AdsPromoted Object",{"type":17,"tag":29,"props":47927,"children":47928},{},[47929],{"type":23,"value":47930},"Each promoted entity has a simple structure:",{"type":17,"tag":7231,"props":47932,"children":47933},{},[47934,47958],{"type":17,"tag":7235,"props":47935,"children":47936},{},[47937],{"type":17,"tag":7239,"props":47938,"children":47939},{},[47940,47944,47949,47954],{"type":17,"tag":7243,"props":47941,"children":47942},{},[47943],{"type":23,"value":24651},{"type":17,"tag":7243,"props":47945,"children":47946},{},[47947],{"type":23,"value":47948},"Type",{"type":17,"tag":7243,"props":47950,"children":47951},{},[47952],{"type":23,"value":47953},"Required",{"type":17,"tag":7243,"props":47955,"children":47956},{},[47957],{"type":23,"value":24525},{"type":17,"tag":7259,"props":47959,"children":47960},{},[47961,47987,48012],{"type":17,"tag":7239,"props":47962,"children":47963},{},[47964,47972,47977,47982],{"type":17,"tag":7266,"props":47965,"children":47966},{},[47967],{"type":17,"tag":6121,"props":47968,"children":47970},{"className":47969},[],[47971],{"type":23,"value":18766},{"type":17,"tag":7266,"props":47973,"children":47974},{},[47975],{"type":23,"value":47976},"string",{"type":17,"tag":7266,"props":47978,"children":47979},{},[47980],{"type":23,"value":47981},"Yes",{"type":17,"tag":7266,"props":47983,"children":47984},{},[47985],{"type":23,"value":47986},"The entity ID (e.g., page ID, ASIN, tweet ID)",{"type":17,"tag":7239,"props":47988,"children":47989},{},[47990,47998,48002,48007],{"type":17,"tag":7266,"props":47991,"children":47992},{},[47993],{"type":17,"tag":6121,"props":47994,"children":47996},{"className":47995},[],[47997],{"type":23,"value":18781},{"type":17,"tag":7266,"props":47999,"children":48000},{},[48001],{"type":23,"value":47976},{"type":17,"tag":7266,"props":48003,"children":48004},{},[48005],{"type":23,"value":48006},"No",{"type":17,"tag":7266,"props":48008,"children":48009},{},[48010],{"type":23,"value":48011},"Display name (optional, used in list responses)",{"type":17,"tag":7239,"props":48013,"children":48014},{},[48015,48023,48027,48031],{"type":17,"tag":7266,"props":48016,"children":48017},{},[48018],{"type":17,"tag":6121,"props":48019,"children":48021},{"className":48020},[],[48022],{"type":23,"value":27310},{"type":17,"tag":7266,"props":48024,"children":48025},{},[48026],{"type":23,"value":47976},{"type":17,"tag":7266,"props":48028,"children":48029},{},[48030],{"type":23,"value":47981},{"type":17,"tag":7266,"props":48032,"children":48033},{},[48034],{"type":23,"value":48035},"One of the supported promoted types (see below)",{"type":17,"tag":239,"props":48037,"children":48039},{"id":48038},"supported-promoted-types",[48040],{"type":23,"value":48041},"Supported Promoted Types",{"type":17,"tag":7231,"props":48043,"children":48044},{},[48045,48064],{"type":17,"tag":7235,"props":48046,"children":48047},{},[48048],{"type":17,"tag":7239,"props":48049,"children":48050},{},[48051,48055,48060],{"type":17,"tag":7243,"props":48052,"children":48053},{},[48054],{"type":23,"value":47948},{"type":17,"tag":7243,"props":48056,"children":48057},{},[48058],{"type":23,"value":48059},"Integration(s)",{"type":17,"tag":7243,"props":48061,"children":48062},{},[48063],{"type":23,"value":24525},{"type":17,"tag":7259,"props":48065,"children":48066},{},[48067,48088,48109,48130,48151,48172,48193,48214],{"type":17,"tag":7239,"props":48068,"children":48069},{},[48070,48079,48083],{"type":17,"tag":7266,"props":48071,"children":48072},{},[48073],{"type":17,"tag":6121,"props":48074,"children":48076},{"className":48075},[],[48077],{"type":23,"value":48078},"PAGE_ID",{"type":17,"tag":7266,"props":48080,"children":48081},{},[48082],{"type":23,"value":11332},{"type":17,"tag":7266,"props":48084,"children":48085},{},[48086],{"type":23,"value":48087},"Facebook Page to promote",{"type":17,"tag":7239,"props":48089,"children":48090},{},[48091,48100,48104],{"type":17,"tag":7266,"props":48092,"children":48093},{},[48094],{"type":17,"tag":6121,"props":48095,"children":48097},{"className":48096},[],[48098],{"type":23,"value":48099},"APP_ID",{"type":17,"tag":7266,"props":48101,"children":48102},{},[48103],{"type":23,"value":11332},{"type":17,"tag":7266,"props":48105,"children":48106},{},[48107],{"type":23,"value":48108},"App to promote",{"type":17,"tag":7239,"props":48110,"children":48111},{},[48112,48121,48125],{"type":17,"tag":7266,"props":48113,"children":48114},{},[48115],{"type":17,"tag":6121,"props":48116,"children":48118},{"className":48117},[],[48119],{"type":23,"value":48120},"PIXEL_ID",{"type":17,"tag":7266,"props":48122,"children":48123},{},[48124],{"type":23,"value":11332},{"type":17,"tag":7266,"props":48126,"children":48127},{},[48128],{"type":23,"value":48129},"Conversion pixel",{"type":17,"tag":7239,"props":48131,"children":48132},{},[48133,48142,48146],{"type":17,"tag":7266,"props":48134,"children":48135},{},[48136],{"type":17,"tag":6121,"props":48137,"children":48139},{"className":48138},[],[48140],{"type":23,"value":48141},"CATALOG_ID",{"type":17,"tag":7266,"props":48143,"children":48144},{},[48145],{"type":23,"value":11332},{"type":17,"tag":7266,"props":48147,"children":48148},{},[48149],{"type":23,"value":48150},"Product catalog",{"type":17,"tag":7239,"props":48152,"children":48153},{},[48154,48163,48167],{"type":17,"tag":7266,"props":48155,"children":48156},{},[48157],{"type":17,"tag":6121,"props":48158,"children":48160},{"className":48159},[],[48161],{"type":23,"value":48162},"STORE_URL",{"type":17,"tag":7266,"props":48164,"children":48165},{},[48166],{"type":23,"value":11332},{"type":17,"tag":7266,"props":48168,"children":48169},{},[48170],{"type":23,"value":48171},"Store URL (manual input)",{"type":17,"tag":7239,"props":48173,"children":48174},{},[48175,48184,48188],{"type":17,"tag":7266,"props":48176,"children":48177},{},[48178],{"type":17,"tag":6121,"props":48179,"children":48181},{"className":48180},[],[48182],{"type":23,"value":48183},"PRODUCT_ID",{"type":17,"tag":7266,"props":48185,"children":48186},{},[48187],{"type":23,"value":47580},{"type":17,"tag":7266,"props":48189,"children":48190},{},[48191],{"type":23,"value":48192},"Product ASIN (manual input)",{"type":17,"tag":7239,"props":48194,"children":48195},{},[48196,48205,48209],{"type":17,"tag":7266,"props":48197,"children":48198},{},[48199],{"type":17,"tag":6121,"props":48200,"children":48202},{"className":48201},[],[48203],{"type":23,"value":48204},"TWEET_ID",{"type":17,"tag":7266,"props":48206,"children":48207},{},[48208],{"type":23,"value":47585},{"type":17,"tag":7266,"props":48210,"children":48211},{},[48212],{"type":23,"value":48213},"Tweet to promote",{"type":17,"tag":7239,"props":48215,"children":48216},{},[48217,48226,48231],{"type":17,"tag":7266,"props":48218,"children":48219},{},[48220],{"type":17,"tag":6121,"props":48221,"children":48223},{"className":48222},[],[48224],{"type":23,"value":48225},"AD_GROUP_TYPE",{"type":17,"tag":7266,"props":48227,"children":48228},{},[48229],{"type":23,"value":48230},"LinkedIn, Google Ads",{"type":17,"tag":7266,"props":48232,"children":48233},{},[48234],{"type":23,"value":48235},"Campaign/ad group type (e.g., SPONSORED_UPDATES, SEARCH_STANDARD)",{"type":17,"tag":25,"props":48237,"children":48238},{},[],{"type":17,"tag":68,"props":48240,"children":48242},{"id":48241},"get-adsconnection_idpromoted-endpoint",[48243],{"type":23,"value":48244},"GET /ads/{connection_id}/promoted Endpoint",{"type":17,"tag":29,"props":48246,"children":48247},{},[48248,48250,48255],{"type":23,"value":48249},"Use the ",{"type":17,"tag":6121,"props":48251,"children":48253},{"className":48252},[],[48254],{"type":23,"value":47476},{"type":23,"value":48256}," list endpoint to discover available promoted entities that the integration supports.",{"type":17,"tag":29,"props":48258,"children":48259},{},[48260,48265,48266],{"type":17,"tag":48,"props":48261,"children":48262},{},[48263],{"type":23,"value":48264},"Endpoint:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":48267,"children":48269},{"className":48268},[],[48270],{"type":23,"value":48271},"GET /ads/{connection_id}/promote",{"type":17,"tag":29,"props":48273,"children":48274},{},[48275],{"type":17,"tag":48,"props":48276,"children":48277},{},[48278],{"type":23,"value":48279},"Query parameters:",{"type":17,"tag":7231,"props":48281,"children":48282},{},[48283,48302],{"type":17,"tag":7235,"props":48284,"children":48285},{},[48286],{"type":17,"tag":7239,"props":48287,"children":48288},{},[48289,48294,48298],{"type":17,"tag":7243,"props":48290,"children":48291},{},[48292],{"type":23,"value":48293},"Parameter",{"type":17,"tag":7243,"props":48295,"children":48296},{},[48297],{"type":23,"value":47948},{"type":17,"tag":7243,"props":48299,"children":48300},{},[48301],{"type":23,"value":24525},{"type":17,"tag":7259,"props":48303,"children":48304},{},[48305,48337,48357,48378,48400],{"type":17,"tag":7239,"props":48306,"children":48307},{},[48308,48316,48320],{"type":17,"tag":7266,"props":48309,"children":48310},{},[48311],{"type":17,"tag":6121,"props":48312,"children":48314},{"className":48313},[],[48315],{"type":23,"value":27310},{"type":17,"tag":7266,"props":48317,"children":48318},{},[48319],{"type":23,"value":47976},{"type":17,"tag":7266,"props":48321,"children":48322},{},[48323,48325,48330,48331,48336],{"type":23,"value":48324},"Filter by promoted type (e.g., ",{"type":17,"tag":6121,"props":48326,"children":48328},{"className":48327},[],[48329],{"type":23,"value":48078},{"type":23,"value":11826},{"type":17,"tag":6121,"props":48332,"children":48334},{"className":48333},[],[48335],{"type":23,"value":48204},{"type":23,"value":12034},{"type":17,"tag":7239,"props":48338,"children":48339},{},[48340,48348,48352],{"type":17,"tag":7266,"props":48341,"children":48342},{},[48343],{"type":17,"tag":6121,"props":48344,"children":48346},{"className":48345},[],[48347],{"type":23,"value":11980},{"type":17,"tag":7266,"props":48349,"children":48350},{},[48351],{"type":23,"value":47976},{"type":17,"tag":7266,"props":48353,"children":48354},{},[48355],{"type":23,"value":48356},"Organization/account I",{"type":17,"tag":7239,"props":48358,"children":48359},{},[48360,48369,48373],{"type":17,"tag":7266,"props":48361,"children":48362},{},[48363],{"type":17,"tag":6121,"props":48364,"children":48366},{"className":48365},[],[48367],{"type":23,"value":48368},"query",{"type":17,"tag":7266,"props":48370,"children":48371},{},[48372],{"type":23,"value":47976},{"type":17,"tag":7266,"props":48374,"children":48375},{},[48376],{"type":23,"value":48377},"Optional search filter",{"type":17,"tag":7239,"props":48379,"children":48380},{},[48381,48390,48395],{"type":17,"tag":7266,"props":48382,"children":48383},{},[48384],{"type":17,"tag":6121,"props":48385,"children":48387},{"className":48386},[],[48388],{"type":23,"value":48389},"limit",{"type":17,"tag":7266,"props":48391,"children":48392},{},[48393],{"type":23,"value":48394},"number",{"type":17,"tag":7266,"props":48396,"children":48397},{},[48398],{"type":23,"value":48399},"Max results (default 100)",{"type":17,"tag":7239,"props":48401,"children":48402},{},[48403,48412,48416],{"type":17,"tag":7266,"props":48404,"children":48405},{},[48406],{"type":17,"tag":6121,"props":48407,"children":48409},{"className":48408},[],[48410],{"type":23,"value":48411},"offset",{"type":17,"tag":7266,"props":48413,"children":48414},{},[48415],{"type":23,"value":48394},{"type":17,"tag":7266,"props":48417,"children":48418},{},[48419],{"type":23,"value":48420},"Pagination offset",{"type":17,"tag":239,"props":48422,"children":48424},{"id":48423},"example-list-facebook-pages-meta-ads",[48425],{"type":23,"value":48426},"Example: List Facebook Pages (Meta Ads)",{"type":17,"tag":6893,"props":48428,"children":48433},{"className":48429,"code":48431,"language":48432,"meta":7},[48430],"language-bash","GET /ads/{connection_id}/promote?type=PAGE_ID\n","bash",[48434],{"type":17,"tag":6121,"props":48435,"children":48436},{"__ignoreMap":7},[48437],{"type":23,"value":48431},{"type":17,"tag":29,"props":48439,"children":48440},{},[48441],{"type":23,"value":48442},"Response:",{"type":17,"tag":6893,"props":48444,"children":48447},{"className":48445,"code":48446,"language":22503,"meta":7},[22501],"[\n    { \"id\": \"123456789\", \"name\": \"My Business Page\", \"type\": \"PAGE_ID\" },\n    { \"id\": \"987654321\", \"name\": \"Another Page\", \"type\": \"PAGE_ID\" }\n]\n",[48448],{"type":17,"tag":6121,"props":48449,"children":48450},{"__ignoreMap":7},[48451],{"type":23,"value":48446},{"type":17,"tag":239,"props":48453,"children":48455},{"id":48454},"example-list-user-tweets-twitter-ads",[48456],{"type":23,"value":48457},"Example: List User Tweets (Twitter Ads)",{"type":17,"tag":6893,"props":48459,"children":48462},{"className":48460,"code":48461,"language":48432,"meta":7},[48430],"GET /ads/{connection_id}/promote?type=TWEET_ID\n",[48463],{"type":17,"tag":6121,"props":48464,"children":48465},{"__ignoreMap":7},[48466],{"type":23,"value":48461},{"type":17,"tag":239,"props":48468,"children":48470},{"id":48469},"example-list-ad-group-types-google-ads-linkedin",[48471],{"type":23,"value":48472},"Example: List Ad Group Types (Google Ads, LinkedIn)",{"type":17,"tag":6893,"props":48474,"children":48477},{"className":48475,"code":48476,"language":48432,"meta":7},[48430],"GET /ads/{connection_id}/promote?type=AD_GROUP_TYPE\n",[48478],{"type":17,"tag":6121,"props":48479,"children":48480},{"__ignoreMap":7},[48481],{"type":23,"value":48476},{"type":17,"tag":29,"props":48483,"children":48484},{},[48485,48487,48493,48494,48500,48502,48508,48509,48515],{"type":23,"value":48486},"Some integrations will return static options (e.g., ",{"type":17,"tag":6121,"props":48488,"children":48490},{"className":48489},[],[48491],{"type":23,"value":48492},"SEARCH_STANDARD",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48495,"children":48497},{"className":48496},[],[48498],{"type":23,"value":48499},"DISPLAY_STANDARD",{"type":23,"value":48501}," for Google; ",{"type":17,"tag":6121,"props":48503,"children":48505},{"className":48504},[],[48506],{"type":23,"value":48507},"SPONSORED_UPDATES",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48510,"children":48512},{"className":48511},[],[48513],{"type":23,"value":48514},"TEXT_ADS",{"type":23,"value":48516}," for LinkedIn).",{"type":17,"tag":239,"props":48518,"children":48520},{"id":48519},"when-ads_promoted-returns-empty",[48521],{"type":23,"value":48522},"When ads_promoted Returns Empty",{"type":17,"tag":29,"props":48524,"children":48525},{},[48526,48528,48533,48535,48540,48542,48547,48549,48554],{"type":23,"value":48527},"Some promoted types have no discovery API (e.g., Amazon ",{"type":17,"tag":6121,"props":48529,"children":48531},{"className":48530},[],[48532],{"type":23,"value":48183},{"type":23,"value":48534},", Meta ",{"type":17,"tag":6121,"props":48536,"children":48538},{"className":48537},[],[48539],{"type":23,"value":48162},{"type":23,"value":48541},"). In those cases, ",{"type":17,"tag":6121,"props":48543,"children":48545},{"className":48544},[],[48546],{"type":23,"value":47476},{"type":23,"value":48548}," returns an empty array. You can still create ads by passing ",{"type":17,"tag":6121,"props":48550,"children":48552},{"className":48551},[],[48553],{"type":23,"value":11521},{"type":23,"value":48555}," manually with IDs you already know (e.g., ASINs for Amazon, store URLs for Meta).",{"type":17,"tag":25,"props":48557,"children":48558},{},[],{"type":17,"tag":68,"props":48560,"children":48562},{"id":48561},"quick-reference-create-examples",[48563],{"type":23,"value":48564},"Quick Reference: Create Examples",{"type":17,"tag":239,"props":48566,"children":48568},{"id":48567},"meta-ads-create-ad-group-with-page",[48569],{"type":23,"value":48570},"Meta Ads – Create Ad Group with Page",{"type":17,"tag":6893,"props":48572,"children":48575},{"className":48573,"code":48574,"language":22503,"meta":7},[22501],"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"act_123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"My Ad Group\",\n  \"promoted\": [{ \"id\": \"789\", \"type\": \"PAGE_ID\" }]\n}\n",[48576],{"type":17,"tag":6121,"props":48577,"children":48578},{"__ignoreMap":7},[48579],{"type":23,"value":48574},{"type":17,"tag":239,"props":48581,"children":48583},{"id":48582},"amazon-ads-create-product-ad",[48584],{"type":23,"value":48585},"Amazon Ads – Create Product Ad",{"type":17,"tag":6893,"props":48587,"children":48590},{"className":48588,"code":48589,"language":22503,"meta":7},[22501],"POST /ads/{connection_id}/ad\n{\n  \"organization_id\": \"profile_123\",\n  \"campaign_id\": \"456\",\n  \"group_id\": \"789\",\n  \"name\": \"Product Ad\",\n  \"promoted\": [{ \"id\": \"B08N5WRWNW\", \"type\": \"PRODUCT_ID\" }]\n}\n",[48591],{"type":17,"tag":6121,"props":48592,"children":48593},{"__ignoreMap":7},[48594],{"type":23,"value":48589},{"type":17,"tag":239,"props":48596,"children":48598},{"id":48597},"twitter-ads-create-promoted-tweet",[48599],{"type":23,"value":48600},"Twitter Ads – Create Promoted Tweet",{"type":17,"tag":6893,"props":48602,"children":48605},{"className":48603,"code":48604,"language":22503,"meta":7},[22501],"POST /ads/{connection_id}/ad\n{\n  \"organization_id\": \"account_123\",\n  \"group_id\": \"line_item_456\",\n  \"name\": \"Promoted Tweet\",\n  \"promoted\": [{ \"id\": \"1234567890\", \"type\": \"TWEET_ID\" }]\n}\n",[48606],{"type":17,"tag":6121,"props":48607,"children":48608},{"__ignoreMap":7},[48609],{"type":23,"value":48604},{"type":17,"tag":239,"props":48611,"children":48613},{"id":48612},"linkedin-create-ad-group-campaign",[48614],{"type":23,"value":48615},"LinkedIn – Create Ad Group (Campaign)",{"type":17,"tag":6893,"props":48617,"children":48620},{"className":48618,"code":48619,"language":22503,"meta":7},[22501],"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"Sponsored Updates Campaign\",\n  \"promoted\": [{ \"id\": \"SPONSORED_UPDATES\", \"type\": \"AD_GROUP_TYPE\" }]\n}\n",[48621],{"type":17,"tag":6121,"props":48622,"children":48623},{"__ignoreMap":7},[48624],{"type":23,"value":48619},{"type":17,"tag":239,"props":48626,"children":48628},{"id":48627},"google-ads-create-ad-group",[48629],{"type":23,"value":48630},"Google Ads – Create Ad Group",{"type":17,"tag":6893,"props":48632,"children":48635},{"className":48633,"code":48634,"language":22503,"meta":7},[22501],"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"Search Ad Group\",\n  \"promoted\": [{ \"id\": \"SEARCH_STANDARD\", \"type\": \"AD_GROUP_TYPE\" }]\n}\n",[48636],{"type":17,"tag":6121,"props":48637,"children":48638},{"__ignoreMap":7},[48639],{"type":23,"value":48634},{"type":17,"tag":25,"props":48641,"children":48642},{},[],{"type":17,"tag":68,"props":48644,"children":48646},{"id":48645},"using-targeting",[48647],{"type":23,"value":48648},"Using Targeting",{"type":17,"tag":29,"props":48650,"children":48651},{},[48652,48654,48659,48661,48666],{"type":23,"value":48653},"Targeting lets you define who sees your ads (geography, demographics, interests, etc.). Use the ",{"type":17,"tag":6121,"props":48655,"children":48657},{"className":48656},[],[48658],{"type":23,"value":11510},{"type":23,"value":48660}," endpoint to look up valid targeting IDs, then pass them in the ",{"type":17,"tag":6121,"props":48662,"children":48664},{"className":48663},[],[48665],{"type":23,"value":40487},{"type":23,"value":48667}," field when creating campaigns, ad groups, or ads.",{"type":17,"tag":239,"props":48669,"children":48671},{"id":48670},"the-ads_target-endpoint",[48672],{"type":23,"value":48673},"The ads_target Endpoint",{"type":17,"tag":29,"props":48675,"children":48676},{},[48677],{"type":23,"value":48678},"Look up targeting options (countries, regions, cities, interests, etc.) before creating ad objects.",{"type":17,"tag":29,"props":48680,"children":48681},{},[48682,48686,48687],{"type":17,"tag":48,"props":48683,"children":48684},{},[48685],{"type":23,"value":48264},{"type":23,"value":18757},{"type":17,"tag":6121,"props":48688,"children":48690},{"className":48689},[],[48691],{"type":23,"value":48692},"GET /ads/{connection_id}/target",{"type":17,"tag":29,"props":48694,"children":48695},{},[48696],{"type":17,"tag":48,"props":48697,"children":48698},{},[48699],{"type":23,"value":48279},{"type":17,"tag":7231,"props":48701,"children":48702},{},[48703,48725],{"type":17,"tag":7235,"props":48704,"children":48705},{},[48706],{"type":17,"tag":7239,"props":48707,"children":48708},{},[48709,48713,48717,48721],{"type":17,"tag":7243,"props":48710,"children":48711},{},[48712],{"type":23,"value":48293},{"type":17,"tag":7243,"props":48714,"children":48715},{},[48716],{"type":23,"value":47948},{"type":17,"tag":7243,"props":48718,"children":48719},{},[48720],{"type":23,"value":47953},{"type":17,"tag":7243,"props":48722,"children":48723},{},[48724],{"type":23,"value":24525},{"type":17,"tag":7259,"props":48726,"children":48727},{},[48728,48752,48777,48801,48824],{"type":17,"tag":7239,"props":48729,"children":48730},{},[48731,48739,48743,48747],{"type":17,"tag":7266,"props":48732,"children":48733},{},[48734],{"type":17,"tag":6121,"props":48735,"children":48737},{"className":48736},[],[48738],{"type":23,"value":27310},{"type":17,"tag":7266,"props":48740,"children":48741},{},[48742],{"type":23,"value":47976},{"type":17,"tag":7266,"props":48744,"children":48745},{},[48746],{"type":23,"value":47981},{"type":17,"tag":7266,"props":48748,"children":48749},{},[48750],{"type":23,"value":48751},"Targeting type (see supported types below)",{"type":17,"tag":7239,"props":48753,"children":48754},{},[48755,48763,48767,48772],{"type":17,"tag":7266,"props":48756,"children":48757},{},[48758],{"type":17,"tag":6121,"props":48759,"children":48761},{"className":48760},[],[48762],{"type":23,"value":48368},{"type":17,"tag":7266,"props":48764,"children":48765},{},[48766],{"type":23,"value":47976},{"type":17,"tag":7266,"props":48768,"children":48769},{},[48770],{"type":23,"value":48771},"Yes*",{"type":17,"tag":7266,"props":48773,"children":48774},{},[48775],{"type":23,"value":48776},"Search term (*required for most types)",{"type":17,"tag":7239,"props":48778,"children":48779},{},[48780,48788,48792,48796],{"type":17,"tag":7266,"props":48781,"children":48782},{},[48783],{"type":17,"tag":6121,"props":48784,"children":48786},{"className":48785},[],[48787],{"type":23,"value":11980},{"type":17,"tag":7266,"props":48789,"children":48790},{},[48791],{"type":23,"value":47976},{"type":17,"tag":7266,"props":48793,"children":48794},{},[48795],{"type":23,"value":48006},{"type":17,"tag":7266,"props":48797,"children":48798},{},[48799],{"type":23,"value":48800},"Organization/account ID (required for some types)",{"type":17,"tag":7239,"props":48802,"children":48803},{},[48804,48812,48816,48820],{"type":17,"tag":7266,"props":48805,"children":48806},{},[48807],{"type":17,"tag":6121,"props":48808,"children":48810},{"className":48809},[],[48811],{"type":23,"value":48389},{"type":17,"tag":7266,"props":48813,"children":48814},{},[48815],{"type":23,"value":48394},{"type":17,"tag":7266,"props":48817,"children":48818},{},[48819],{"type":23,"value":48006},{"type":17,"tag":7266,"props":48821,"children":48822},{},[48823],{"type":23,"value":48399},{"type":17,"tag":7239,"props":48825,"children":48826},{},[48827,48835,48839,48843],{"type":17,"tag":7266,"props":48828,"children":48829},{},[48830],{"type":17,"tag":6121,"props":48831,"children":48833},{"className":48832},[],[48834],{"type":23,"value":48411},{"type":17,"tag":7266,"props":48836,"children":48837},{},[48838],{"type":23,"value":48394},{"type":17,"tag":7266,"props":48840,"children":48841},{},[48842],{"type":23,"value":48006},{"type":17,"tag":7266,"props":48844,"children":48845},{},[48846],{"type":23,"value":48420},{"type":17,"tag":29,"props":48848,"children":48849},{},[48850,48855,48856,48864,48865,48870,48871,48877,48878,48884,48885,48891,48892,48898,48899,48905,48906,48911,48912,48918,48919,48925,48926,48932,48933,48939,48940,48946,48947],{"type":17,"tag":48,"props":48851,"children":48852},{},[48853],{"type":23,"value":48854},"Supported",{"type":23,"value":18757},{"type":17,"tag":48,"props":48857,"children":48858},{},[48859],{"type":17,"tag":6121,"props":48860,"children":48862},{"className":48861},[],[48863],{"type":23,"value":27310},{"type":23,"value":18757},{"type":17,"tag":48,"props":48866,"children":48867},{},[48868],{"type":23,"value":48869},"values:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":48872,"children":48874},{"className":48873},[],[48875],{"type":23,"value":48876},"countries",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48879,"children":48881},{"className":48880},[],[48882],{"type":23,"value":48883},"regions",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48886,"children":48888},{"className":48887},[],[48889],{"type":23,"value":48890},"cities",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48893,"children":48895},{"className":48894},[],[48896],{"type":23,"value":48897},"zips",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48900,"children":48902},{"className":48901},[],[48903],{"type":23,"value":48904},"us_dmas",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48907,"children":48909},{"className":48908},[],[48910],{"type":23,"value":18860},{"type":23,"value":11826},{"type":17,"tag":6121,"props":48913,"children":48915},{"className":48914},[],[48916],{"type":23,"value":48917},"interests",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48920,"children":48922},{"className":48921},[],[48923],{"type":23,"value":48924},"behaviors",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48927,"children":48929},{"className":48928},[],[48930],{"type":23,"value":48931},"topics",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48934,"children":48936},{"className":48935},[],[48937],{"type":23,"value":48938},"user_lists",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48941,"children":48943},{"className":48942},[],[48944],{"type":23,"value":48945},"age_ranges",{"type":23,"value":11826},{"type":17,"tag":6121,"props":48948,"children":48950},{"className":48949},[],[48951],{"type":23,"value":48952},"genders",{"type":17,"tag":29,"props":48954,"children":48955},{},[48956,48961,48962,48970,48971,48976,48977],{"type":17,"tag":33,"props":48957,"children":48958},{},[48959],{"type":23,"value":48960},"Support varies by integration. Meta Ads supports most types; others (e.g., Amazon, Twitter) may support only",{"type":23,"value":18757},{"type":17,"tag":33,"props":48963,"children":48964},{},[48965],{"type":17,"tag":6121,"props":48966,"children":48968},{"className":48967},[],[48969],{"type":23,"value":48876},{"type":23,"value":18757},{"type":17,"tag":33,"props":48972,"children":48973},{},[48974],{"type":23,"value":48975},"and",{"type":23,"value":18757},{"type":17,"tag":33,"props":48978,"children":48979},{},[48980,48985],{"type":17,"tag":6121,"props":48981,"children":48983},{"className":48982},[],[48984],{"type":23,"value":18860},{"type":23,"value":48986},"__.",{"type":17,"tag":239,"props":48988,"children":48990},{"id":48989},"example-look-up-countries",[48991],{"type":23,"value":48992},"Example: Look Up Countries",{"type":17,"tag":6893,"props":48994,"children":48997},{"className":48995,"code":48996,"language":48432,"meta":7},[48430],"GET /ads/{connection_id}/target?type=countries&query=united\n",[48998],{"type":17,"tag":6121,"props":48999,"children":49000},{"__ignoreMap":7},[49001],{"type":23,"value":48996},{"type":17,"tag":29,"props":49003,"children":49004},{},[49005],{"type":23,"value":48442},{"type":17,"tag":6893,"props":49007,"children":49010},{"className":49008,"code":49009,"language":22503,"meta":7},[22501],"[\n    { \"id\": \"US\", \"name\": \"United States\", \"value\": \"US\", \"type\": \"countries\" },\n    { \"id\": \"GB\", \"name\": \"United Kingdom\", \"value\": \"GB\", \"type\": \"countries\" }\n]\n",[49011],{"type":17,"tag":6121,"props":49012,"children":49013},{"__ignoreMap":7},[49014],{"type":23,"value":49009},{"type":17,"tag":239,"props":49016,"children":49018},{"id":49017},"example-look-up-regions-eg-us-states",[49019],{"type":23,"value":49020},"Example: Look Up Regions (e.g., US States)",{"type":17,"tag":6893,"props":49022,"children":49025},{"className":49023,"code":49024,"language":48432,"meta":7},[48430],"GET /ads/{connection_id}/target?type=regions&query=california\n",[49026],{"type":17,"tag":6121,"props":49027,"children":49028},{"__ignoreMap":7},[49029],{"type":23,"value":49024},{"type":17,"tag":29,"props":49031,"children":49032},{},[49033],{"type":23,"value":48442},{"type":17,"tag":6893,"props":49035,"children":49038},{"className":49036,"code":49037,"language":22503,"meta":7},[22501],"[\n    { \"id\": \"3843\", \"name\": \"California\", \"value\": \"3843\", \"type\": \"regions\" }\n]\n",[49039],{"type":17,"tag":6121,"props":49040,"children":49041},{"__ignoreMap":7},[49042],{"type":23,"value":49037},{"type":17,"tag":239,"props":49044,"children":49046},{"id":49045},"example-look-up-interests-meta-ads",[49047],{"type":23,"value":49048},"Example: Look Up Interests (Meta Ads)",{"type":17,"tag":6893,"props":49050,"children":49053},{"className":49051,"code":49052,"language":48432,"meta":7},[48430],"GET /ads/{connection_id}/target?type=interests&query=technology\n",[49054],{"type":17,"tag":6121,"props":49055,"children":49056},{"__ignoreMap":7},[49057],{"type":23,"value":49052},{"type":17,"tag":239,"props":49059,"children":49061},{"id":49060},"using-targeting-ids-when-creating-ads",[49062],{"type":23,"value":49063},"Using Targeting IDs When Creating Ads",{"type":17,"tag":29,"props":49065,"children":49066},{},[49067,49069,49074,49076,49081,49083,49088,49090,49095],{"type":23,"value":49068},"Pass the ",{"type":17,"tag":6121,"props":49070,"children":49072},{"className":49071},[],[49073],{"type":23,"value":18766},{"type":23,"value":49075}," (or ",{"type":17,"tag":6121,"props":49077,"children":49079},{"className":49078},[],[49080],{"type":23,"value":18792},{"type":23,"value":49082},") from ",{"type":17,"tag":6121,"props":49084,"children":49086},{"className":49085},[],[49087],{"type":23,"value":11510},{"type":23,"value":49089}," responses into the ",{"type":17,"tag":6121,"props":49091,"children":49093},{"className":49092},[],[49094],{"type":23,"value":40487},{"type":23,"value":49096}," object. The structure matches the targeting type:",{"type":17,"tag":80,"props":49098,"children":49099},{},[49100,49124,49156,49178],{"type":17,"tag":84,"props":49101,"children":49102},{},[49103,49108,49109,49115,49117,49123],{"type":17,"tag":48,"props":49104,"children":49105},{},[49106],{"type":23,"value":49107},"Countries:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":49110,"children":49112},{"className":49111},[],[49113],{"type":23,"value":49114},"targeting.geographic.countries",{"type":23,"value":49116}," — array of ISO country codes (e.g., ",{"type":17,"tag":6121,"props":49118,"children":49120},{"className":49119},[],[49121],{"type":23,"value":49122},"[\"US\", \"CA\"]",{"type":23,"value":12034},{"type":17,"tag":84,"props":49125,"children":49126},{},[49127,49132,49133,49139,49141,49147,49149,49154],{"type":17,"tag":48,"props":49128,"children":49129},{},[49130],{"type":23,"value":49131},"Regions:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":49134,"children":49136},{"className":49135},[],[49137],{"type":23,"value":49138},"targeting.geographic.regions",{"type":23,"value":49140}," — array of ",{"type":17,"tag":6121,"props":49142,"children":49144},{"className":49143},[],[49145],{"type":23,"value":49146},"{ id, name? }",{"type":23,"value":49148}," (use ",{"type":17,"tag":6121,"props":49150,"children":49152},{"className":49151},[],[49153],{"type":23,"value":18766},{"type":23,"value":49155}," from ads_target)",{"type":17,"tag":84,"props":49157,"children":49158},{},[49159,49164,49165,49171,49172],{"type":17,"tag":48,"props":49160,"children":49161},{},[49162],{"type":23,"value":49163},"Cities:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":49166,"children":49168},{"className":49167},[],[49169],{"type":23,"value":49170},"targeting.geographic.cities",{"type":23,"value":49140},{"type":17,"tag":6121,"props":49173,"children":49175},{"className":49174},[],[49176],{"type":23,"value":49177},"{ id, name?, radius?, radius_unit? }",{"type":17,"tag":84,"props":49179,"children":49180},{},[49181,49186,49187,49193],{"type":17,"tag":48,"props":49182,"children":49183},{},[49184],{"type":23,"value":49185},"Demographics:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":49188,"children":49190},{"className":49189},[],[49191],{"type":23,"value":49192},"targeting.demographic",{"type":23,"value":49194}," — age and gender (no lookup needed; use values directly)",{"type":17,"tag":25,"props":49196,"children":49197},{},[],{"type":17,"tag":68,"props":49199,"children":49201},{"id":49200},"targeting-examples",[49202],{"type":23,"value":49203},"Targeting Examples",{"type":17,"tag":239,"props":49205,"children":49207},{"id":49206},"geo-targeting-countries-and-regions",[49208],{"type":23,"value":49209},"Geo-Targeting: Countries and Regions",{"type":17,"tag":29,"props":49211,"children":49212},{},[49213],{"type":23,"value":49214},"First, look up IDs:",{"type":17,"tag":6893,"props":49216,"children":49219},{"className":49217,"code":49218,"language":48432,"meta":7},[48430],"# Get country codes\nGET /ads/{connection_id}/target?type=countries&query=united\n\n# Get regions (e.g., states) — for regions, query often includes country context\nGET /ads/{connection_id}/target?type=regions&query=california\n",[49220],{"type":17,"tag":6121,"props":49221,"children":49222},{"__ignoreMap":7},[49223],{"type":23,"value":49218},{"type":17,"tag":29,"props":49225,"children":49226},{},[49227],{"type":23,"value":49228},"Then create an ad group with geographic targeting:",{"type":17,"tag":6893,"props":49230,"children":49233},{"className":49231,"code":49232,"language":22503,"meta":7},[22501],"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"act_123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"US & California Ad Group\",\n  \"promoted\": [{ \"id\": \"789\", \"type\": \"PAGE_ID\" }],\n  \"targeting\": {\n    \"geographic\": {\n      \"countries\": [\"US\"],\n      \"regions\": [\n        { \"id\": \"3843\", \"name\": \"California\" }\n      ]\n    }\n  }\n}\n",[49234],{"type":17,"tag":6121,"props":49235,"children":49236},{"__ignoreMap":7},[49237],{"type":23,"value":49232},{"type":17,"tag":239,"props":49239,"children":49241},{"id":49240},"geo-targeting-cities-with-radius",[49242],{"type":23,"value":49243},"Geo-Targeting: Cities with Radius",{"type":17,"tag":6893,"props":49245,"children":49248},{"className":49246,"code":49247,"language":22503,"meta":7},[22501],"{\n  \"targeting\": {\n    \"geographic\": {\n      \"countries\": [\"US\"],\n      \"cities\": [\n        {\n          \"id\": \"2420379\",\n          \"name\": \"San Francisco\",\n          \"radius\": 25,\n          \"radius_unit\": \"MILES\"\n        }\n      ]\n    }\n  }\n}\n",[49249],{"type":17,"tag":6121,"props":49250,"children":49251},{"__ignoreMap":7},[49252],{"type":23,"value":49247},{"type":17,"tag":239,"props":49254,"children":49256},{"id":49255},"demographic-targeting",[49257],{"type":23,"value":49258},"Demographic Targeting",{"type":17,"tag":29,"props":49260,"children":49261},{},[49262,49264,49269],{"type":23,"value":49263},"Demographic targeting uses simple values; no ",{"type":17,"tag":6121,"props":49265,"children":49267},{"className":49266},[],[49268],{"type":23,"value":11510},{"type":23,"value":49270}," lookup is needed:",{"type":17,"tag":6893,"props":49272,"children":49275},{"className":49273,"code":49274,"language":22503,"meta":7},[22501],"{\n  \"targeting\": {\n    \"demographic\": {\n      \"age_min\": 25,\n      \"age_max\": 54,\n      \"male\": true,\n      \"female\": true\n    }\n  }\n}\n",[49276],{"type":17,"tag":6121,"props":49277,"children":49278},{"__ignoreMap":7},[49279],{"type":23,"value":49274},{"type":17,"tag":80,"props":49281,"children":49282},{},[49283,49301],{"type":17,"tag":84,"props":49284,"children":49285},{},[49286,49292,49293,49299],{"type":17,"tag":6121,"props":49287,"children":49289},{"className":49288},[],[49290],{"type":23,"value":49291},"age_min",{"type":23,"value":26030},{"type":17,"tag":6121,"props":49294,"children":49296},{"className":49295},[],[49297],{"type":23,"value":49298},"age_max",{"type":23,"value":49300},": 18–65 typically",{"type":17,"tag":84,"props":49302,"children":49303},{},[49304,49310,49311,49317,49319,49325,49327,49333],{"type":17,"tag":6121,"props":49305,"children":49307},{"className":49306},[],[49308],{"type":23,"value":49309},"male",{"type":23,"value":26030},{"type":17,"tag":6121,"props":49312,"children":49314},{"className":49313},[],[49315],{"type":23,"value":49316},"female",{"type":23,"value":49318},": ",{"type":17,"tag":6121,"props":49320,"children":49322},{"className":49321},[],[49323],{"type":23,"value":49324},"true",{"type":23,"value":49326}," to include, ",{"type":17,"tag":6121,"props":49328,"children":49330},{"className":49329},[],[49331],{"type":23,"value":49332},"false",{"type":23,"value":49334}," or omit to exclude",{"type":17,"tag":239,"props":49336,"children":49338},{"id":49337},"combined-geo-demographic-targeting",[49339],{"type":23,"value":49340},"Combined Geo + Demographic Targeting",{"type":17,"tag":6893,"props":49342,"children":49345},{"className":49343,"code":49344,"language":22503,"meta":7},[22501],"POST /ads/{connection_id}/group\n{\n  \"organization_id\": \"act_123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"US Adults 25-54\",\n  \"promoted\": [{ \"id\": \"789\", \"type\": \"PAGE_ID\" }],\n  \"targeting\": {\n    \"geographic\": {\n      \"countries\": [\"US\"]\n    },\n    \"demographic\": {\n      \"age_min\": 25,\n      \"age_max\": 54,\n      \"male\": true,\n      \"female\": true\n    }\n  }\n}\n",[49346],{"type":17,"tag":6121,"props":49347,"children":49348},{"__ignoreMap":7},[49349],{"type":23,"value":49344},{"type":17,"tag":239,"props":49351,"children":49353},{"id":49352},"audience-targeting-interests-custom-audiences",[49354],{"type":23,"value":49355},"Audience Targeting (Interests, Custom Audiences)",{"type":17,"tag":29,"props":49357,"children":49358},{},[49359],{"type":23,"value":49360},"For interests and custom audiences, look up IDs first:",{"type":17,"tag":6893,"props":49362,"children":49365},{"className":49363,"code":49364,"language":48432,"meta":7},[48430],"GET /ads/{connection_id}/target?type=interests&query=technology\nGET /ads/{connection_id}/target?type=user_lists&query=my&org_id=act_123\n",[49366],{"type":17,"tag":6121,"props":49367,"children":49368},{"__ignoreMap":7},[49369],{"type":23,"value":49364},{"type":17,"tag":29,"props":49371,"children":49372},{},[49373,49375,49380,49382,49388],{"type":23,"value":49374},"Then use the ",{"type":17,"tag":6121,"props":49376,"children":49378},{"className":49377},[],[49379],{"type":23,"value":18766},{"type":23,"value":49381}," values in ",{"type":17,"tag":6121,"props":49383,"children":49385},{"className":49384},[],[49386],{"type":23,"value":49387},"targeting.audience",{"type":23,"value":20456},{"type":17,"tag":6893,"props":49390,"children":49393},{"className":49391,"code":49392,"language":22503,"meta":7},[22501],"{\n  \"targeting\": {\n    \"audience\": {\n      \"interests\": [\n        { \"id\": \"600313926646746\", \"name\": \"Technology\" }\n      ],\n      \"custom_audiences\": [\n        { \"id\": \"12345678\", \"name\": \"My Custom Audience\" }\n      ]\n    }\n  }\n}\n",[49394],{"type":17,"tag":6121,"props":49395,"children":49396},{"__ignoreMap":7},[49397],{"type":23,"value":49392},{"type":17,"tag":25,"props":49399,"children":49400},{},[],{"title":7,"searchDepth":1629,"depth":1629,"links":49402},[49403,49404,49405,49406,49407,49408,49409,49412,49418,49425,49432],{"id":47118,"depth":1635,"text":47121},{"id":47301,"depth":1635,"text":47304},{"id":47411,"depth":1635,"text":47414},{"id":966,"depth":1635,"text":47498},{"id":47546,"depth":1635,"text":47549},{"id":47750,"depth":1635,"text":47753},{"id":47922,"depth":1629,"text":47925,"children":49410},[49411],{"id":48038,"depth":1635,"text":48041},{"id":48241,"depth":1629,"text":48244,"children":49413},[49414,49415,49416,49417],{"id":48423,"depth":1635,"text":48426},{"id":48454,"depth":1635,"text":48457},{"id":48469,"depth":1635,"text":48472},{"id":48519,"depth":1635,"text":48522},{"id":48561,"depth":1629,"text":48564,"children":49419},[49420,49421,49422,49423,49424],{"id":48567,"depth":1635,"text":48570},{"id":48582,"depth":1635,"text":48585},{"id":48597,"depth":1635,"text":48600},{"id":48612,"depth":1635,"text":48615},{"id":48627,"depth":1635,"text":48630},{"id":48645,"depth":1629,"text":48648,"children":49426},[49427,49428,49429,49430,49431],{"id":48670,"depth":1635,"text":48673},{"id":48989,"depth":1635,"text":48992},{"id":49017,"depth":1635,"text":49020},{"id":49045,"depth":1635,"text":49048},{"id":49060,"depth":1635,"text":49063},{"id":49200,"depth":1629,"text":49203,"children":49433},[49434,49435,49436,49437,49438],{"id":49206,"depth":1635,"text":49209},{"id":49240,"depth":1635,"text":49243},{"id":49255,"depth":1635,"text":49258},{"id":49337,"depth":1635,"text":49340},{"id":49352,"depth":1635,"text":49355},"content:blog:creating_ads_using_the_unified_ads_api.md","blog/creating_ads_using_the_unified_ads_api.md","blog/creating_ads_using_the_unified_ads_api",{"_path":49443,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":49444,"description":49445,"img":49446,"date":49447,"tag":12,"body":49448,"_type":1677,"_id":50971,"_source":1679,"_file":50972,"_stem":50973,"_extension":1682},"/blog/25_enrichment_apis_to_integrate_with_in_2026_clearbit_zoominfo_apollo","25 Enrichment APIs to Integrate With in 2026: Clearbit, ZoomInfo, Apollo","Data enrichment has become a core part of modern SaaS products. Whether you're building a CRM, sales platform, marketing automation tool, or analytics product,...","https://s3.us-east-2.amazonaws.com/unified-article-images/25_enrichment_apis_to_integrate_with_in_2026_clearbit_zoominfo_apollo-icon.png","2026-03-11T17:22:00.000Z",{"type":14,"children":49449,"toc":50945},[49450,49455,49458,49466,49471,49476,49495,49500,49518,49524,49539,49544,49597,49602,49610,49615,49623,49628,49633,49664,49670,49675,49679,49687,49692,49700,49705,49713,49718,49726,49731,49739,49744,49749,49755,49760,49766,49776,49781,49786,49791,49819,49830,49836,49846,49851,49856,49884,49895,49901,49911,49916,49921,49943,49954,49960,49970,49975,49980,50001,50013,50019,50029,50034,50039,50057,50068,50074,50084,50089,50093,50115,50126,50132,50141,50146,50150,50173,50184,50190,50199,50204,50209,50232,50243,50249,50259,50264,50268,50284,50295,50301,50311,50316,50321,50337,50348,50354,50359,50502,50507,50513,50518,50526,50537,50544,50549,50559,50564,50572,50577,50585,50590,50595,50601,50612,50617,50622,50650,50655,50661,50680,50691,50696,50702,50707,50715,50720,50755,50762,50767,50797,50803,50814,50819,50837,50842,50848,50853,50858,50869,50875,50886,50891,50898,50903,50908,50919,50931,50938],{"type":17,"tag":18,"props":49451,"children":49453},{"id":49452},"_25-enrichment-apis-to-integrate-with-in-2026-clearbit-zoominfo-apollo",[49454],{"type":23,"value":49444},{"type":17,"tag":25,"props":49456,"children":49457},{},[],{"type":17,"tag":29,"props":49459,"children":49460},{},[49461],{"type":17,"tag":33,"props":49462,"children":49463},{},[49464],{"type":23,"value":49465},"March 11, 2026",{"type":17,"tag":29,"props":49467,"children":49468},{},[49469],{"type":23,"value":49470},"Data enrichment has become a core part of modern SaaS products. Whether you're building a CRM, sales platform, marketing automation tool, or analytics product, enriched customer data powers better segmentation, lead scoring, personalization, and automation.",{"type":17,"tag":29,"props":49472,"children":49473},{},[49474],{"type":23,"value":49475},"But integrating enrichment providers is rarely straightforward.",{"type":17,"tag":29,"props":49477,"children":49478},{},[49479,49481,49486,49488,49493],{"type":23,"value":49480},"Each enrichment platform exposes different APIs, authentication methods, schemas, and response formats. Some focus on ",{"type":17,"tag":48,"props":49482,"children":49483},{},[49484],{"type":23,"value":49485},"person enrichment",{"type":23,"value":49487},", others on ",{"type":17,"tag":48,"props":49489,"children":49490},{},[49491],{"type":23,"value":49492},"company intelligence",{"type":23,"value":49494},", and many specialize in niche data sources such as hiring signals, technology stacks, or intent data.",{"type":17,"tag":29,"props":49496,"children":49497},{},[49498],{"type":23,"value":49499},"For SaaS teams building data-driven products, this fragmentation quickly becomes a major engineering challenge.",{"type":17,"tag":29,"props":49501,"children":49502},{},[49503,49504,49509,49511,49516],{"type":23,"value":12584},{"type":17,"tag":48,"props":49505,"children":49506},{},[49507],{"type":23,"value":49508},"25+ enrichment APIs developers commonly integrate with",{"type":23,"value":49510},", the challenges of building enrichment integrations directly, and how ",{"type":17,"tag":48,"props":49512,"children":49513},{},[49514],{"type":23,"value":49515},"unified enrichment APIs",{"type":23,"value":49517}," allow products to support dozens of providers through a single integration.",{"type":17,"tag":68,"props":49519,"children":49521},{"id":49520},"what-is-an-enrichment-api",[49522],{"type":23,"value":49523},"What Is an Enrichment API?",{"type":17,"tag":29,"props":49525,"children":49526},{},[49527,49528,49537],{"type":23,"value":40437},{"type":17,"tag":48,"props":49529,"children":49530},{},[49531],{"type":17,"tag":133,"props":49532,"children":49534},{"href":49533},"/enrich",[49535],{"type":23,"value":49536},"enrichment API",{"type":23,"value":49538}," allows software applications to enhance existing customer records with additional data from external providers.",{"type":17,"tag":29,"props":49540,"children":49541},{},[49542],{"type":23,"value":49543},"For example, an enrichment API might transform an email address into a full professional profile including:",{"type":17,"tag":80,"props":49545,"children":49546},{},[49547,49552,49557,49562,49567,49572,49577,49582,49587,49592],{"type":17,"tag":84,"props":49548,"children":49549},{},[49550],{"type":23,"value":49551},"full name",{"type":17,"tag":84,"props":49553,"children":49554},{},[49555],{"type":23,"value":49556},"job title",{"type":17,"tag":84,"props":49558,"children":49559},{},[49560],{"type":23,"value":49561},"company name",{"type":17,"tag":84,"props":49563,"children":49564},{},[49565],{"type":23,"value":49566},"company size",{"type":17,"tag":84,"props":49568,"children":49569},{},[49570],{"type":23,"value":49571},"revenue range",{"type":17,"tag":84,"props":49573,"children":49574},{},[49575],{"type":23,"value":49576},"industry classification",{"type":17,"tag":84,"props":49578,"children":49579},{},[49580],{"type":23,"value":49581},"social profiles",{"type":17,"tag":84,"props":49583,"children":49584},{},[49585],{"type":23,"value":49586},"contact details",{"type":17,"tag":84,"props":49588,"children":49589},{},[49590],{"type":23,"value":49591},"hiring signals",{"type":17,"tag":84,"props":49593,"children":49594},{},[49595],{"type":23,"value":49596},"technology stack",{"type":17,"tag":29,"props":49598,"children":49599},{},[49600],{"type":23,"value":49601},"Enrichment APIs typically expose endpoints for two core entities:",{"type":17,"tag":29,"props":49603,"children":49604},{},[49605],{"type":17,"tag":48,"props":49606,"children":49607},{},[49608],{"type":23,"value":49609},"Person enrichment",{"type":17,"tag":29,"props":49611,"children":49612},{},[49613],{"type":23,"value":49614},"Enhances individual profiles with professional and demographic information.",{"type":17,"tag":29,"props":49616,"children":49617},{},[49618],{"type":17,"tag":48,"props":49619,"children":49620},{},[49621],{"type":23,"value":49622},"Company enrichment",{"type":17,"tag":29,"props":49624,"children":49625},{},[49626],{"type":23,"value":49627},"Enhances organizations with firmographic and business intelligence data.",{"type":17,"tag":29,"props":49629,"children":49630},{},[49631],{"type":23,"value":49632},"These APIs are widely used across SaaS categories including:",{"type":17,"tag":80,"props":49634,"children":49635},{},[49636,49641,49646,49650,49655,49659],{"type":17,"tag":84,"props":49637,"children":49638},{},[49639],{"type":23,"value":49640},"sales intelligence platforms",{"type":17,"tag":84,"props":49642,"children":49643},{},[49644],{"type":23,"value":49645},"marketing automation tools",{"type":17,"tag":84,"props":49647,"children":49648},{},[49649],{"type":23,"value":30480},{"type":17,"tag":84,"props":49651,"children":49652},{},[49653],{"type":23,"value":49654},"lead generation platforms",{"type":17,"tag":84,"props":49656,"children":49657},{},[49658],{"type":23,"value":29087},{"type":17,"tag":84,"props":49660,"children":49661},{},[49662],{"type":23,"value":49663},"AI agents and copilots",{"type":17,"tag":68,"props":49665,"children":49667},{"id":49666},"why-saas-products-integrate-with-enrichment-apis",[49668],{"type":23,"value":49669},"Why SaaS Products Integrate with Enrichment APIs",{"type":17,"tag":29,"props":49671,"children":49672},{},[49673],{"type":23,"value":49674},"Enrichment APIs power many modern SaaS workflows.",{"type":17,"tag":29,"props":49676,"children":49677},{},[49678],{"type":23,"value":12661},{"type":17,"tag":29,"props":49680,"children":49681},{},[49682],{"type":17,"tag":48,"props":49683,"children":49684},{},[49685],{"type":23,"value":49686},"Lead enrichment",{"type":17,"tag":29,"props":49688,"children":49689},{},[49690],{"type":23,"value":49691},"Convert partial leads (like email addresses) into complete profiles with job titles, company data, and contact details.",{"type":17,"tag":29,"props":49693,"children":49694},{},[49695],{"type":17,"tag":48,"props":49696,"children":49697},{},[49698],{"type":23,"value":49699},"Sales intelligence",{"type":17,"tag":29,"props":49701,"children":49702},{},[49703],{"type":23,"value":49704},"Provide sales teams with deeper prospect insights such as company size, funding rounds, industry classification, and decision-maker information.",{"type":17,"tag":29,"props":49706,"children":49707},{},[49708],{"type":17,"tag":48,"props":49709,"children":49710},{},[49711],{"type":23,"value":49712},"Marketing personalization",{"type":17,"tag":29,"props":49714,"children":49715},{},[49716],{"type":23,"value":49717},"Enhance marketing databases with demographic and firmographic attributes to improve targeting and segmentation.",{"type":17,"tag":29,"props":49719,"children":49720},{},[49721],{"type":17,"tag":48,"props":49722,"children":49723},{},[49724],{"type":23,"value":49725},"CRM data enhancement",{"type":17,"tag":29,"props":49727,"children":49728},{},[49729],{"type":23,"value":49730},"Automatically update CRM contacts with enriched attributes and maintain data quality across sales pipelines.",{"type":17,"tag":29,"props":49732,"children":49733},{},[49734],{"type":17,"tag":48,"props":49735,"children":49736},{},[49737],{"type":23,"value":49738},"AI-powered prospecting",{"type":17,"tag":29,"props":49740,"children":49741},{},[49742],{"type":23,"value":49743},"Feed enriched person and company data into AI models that score leads, identify buying signals, and recommend outreach strategies.",{"type":17,"tag":29,"props":49745,"children":49746},{},[49747],{"type":23,"value":49748},"Because enriched data improves nearly every downstream workflow, enrichment APIs are now a critical part of many SaaS architectures.",{"type":17,"tag":68,"props":49750,"children":49752},{"id":49751},"_25-enrichment-apis-developers-integrate-with",[49753],{"type":23,"value":49754},"25+ Enrichment APIs Developers Integrate With",{"type":17,"tag":29,"props":49756,"children":49757},{},[49758],{"type":23,"value":49759},"Below are some of the most commonly used enrichment APIs in modern SaaS products.",{"type":17,"tag":239,"props":49761,"children":49763},{"id":49762},"clearbit-api",[49764],{"type":23,"value":49765},"Clearbit API",{"type":17,"tag":29,"props":49767,"children":49768},{},[49769],{"type":17,"tag":133,"props":49770,"children":49773},{"href":49771,"rel":49772},"https://clearbit.com/docs",[214],[49774],{"type":23,"value":49775},"Clearbit Developer Docs",{"type":17,"tag":29,"props":49777,"children":49778},{},[49779],{"type":23,"value":49780},"Clearbit is one of the most widely used enrichment providers for SaaS companies.",{"type":17,"tag":29,"props":49782,"children":49783},{},[49784],{"type":23,"value":49785},"Its APIs provide company and person enrichment using email addresses or domains.",{"type":17,"tag":29,"props":49787,"children":49788},{},[49789],{"type":23,"value":49790},"Key capabilities include:",{"type":17,"tag":80,"props":49792,"children":49793},{},[49794,49799,49804,49809,49814],{"type":17,"tag":84,"props":49795,"children":49796},{},[49797],{"type":23,"value":49798},"person profile enrichment",{"type":17,"tag":84,"props":49800,"children":49801},{},[49802],{"type":23,"value":49803},"company firmographics",{"type":17,"tag":84,"props":49805,"children":49806},{},[49807],{"type":23,"value":49808},"technology stack detection",{"type":17,"tag":84,"props":49810,"children":49811},{},[49812],{"type":23,"value":49813},"domain-based enrichment",{"type":17,"tag":84,"props":49815,"children":49816},{},[49817],{"type":23,"value":49818},"company logo and brand data",{"type":17,"tag":29,"props":49820,"children":49821},{},[49822,49824,49829],{"type":23,"value":49823},"Clearbit is widely used in ",{"type":17,"tag":48,"props":49825,"children":49826},{},[49827],{"type":23,"value":49828},"lead scoring, CRM enrichment, and marketing automation tools",{"type":23,"value":54},{"type":17,"tag":239,"props":49831,"children":49833},{"id":49832},"zoominfo-api",[49834],{"type":23,"value":49835},"ZoomInfo API",{"type":17,"tag":29,"props":49837,"children":49838},{},[49839],{"type":17,"tag":133,"props":49840,"children":49843},{"href":49841,"rel":49842},"https://developers.zoominfo.com/",[214],[49844],{"type":23,"value":49845},"ZoomInfo Developer Docs",{"type":17,"tag":29,"props":49847,"children":49848},{},[49849],{"type":23,"value":49850},"ZoomInfo provides extensive B2B contact and company intelligence data.",{"type":17,"tag":29,"props":49852,"children":49853},{},[49854],{"type":23,"value":49855},"Its APIs allow SaaS products to retrieve:",{"type":17,"tag":80,"props":49857,"children":49858},{},[49859,49864,49869,49874,49879],{"type":17,"tag":84,"props":49860,"children":49861},{},[49862],{"type":23,"value":49863},"professional contact profiles",{"type":17,"tag":84,"props":49865,"children":49866},{},[49867],{"type":23,"value":49868},"company financial data",{"type":17,"tag":84,"props":49870,"children":49871},{},[49872],{"type":23,"value":49873},"organizational structures",{"type":17,"tag":84,"props":49875,"children":49876},{},[49877],{"type":23,"value":49878},"intent signals",{"type":17,"tag":84,"props":49880,"children":49881},{},[49882],{"type":23,"value":49883},"technographic insights",{"type":17,"tag":29,"props":49885,"children":49886},{},[49887,49889,49894],{"type":23,"value":49888},"ZoomInfo is commonly integrated into ",{"type":17,"tag":48,"props":49890,"children":49891},{},[49892],{"type":23,"value":49893},"sales intelligence platforms and prospecting tools",{"type":23,"value":54},{"type":17,"tag":239,"props":49896,"children":49898},{"id":49897},"apollo-api",[49899],{"type":23,"value":49900},"Apollo API",{"type":17,"tag":29,"props":49902,"children":49903},{},[49904],{"type":17,"tag":133,"props":49905,"children":49908},{"href":49906,"rel":49907},"https://apollo.io/",[214],[49909],{"type":23,"value":49910},"Apollo API Documentation",{"type":17,"tag":29,"props":49912,"children":49913},{},[49914],{"type":23,"value":49915},"Apollo combines enrichment data with prospecting and outbound sales automation.",{"type":17,"tag":29,"props":49917,"children":49918},{},[49919],{"type":23,"value":49920},"Its APIs support:",{"type":17,"tag":80,"props":49922,"children":49923},{},[49924,49928,49933,49938],{"type":17,"tag":84,"props":49925,"children":49926},{},[49927],{"type":23,"value":31160},{"type":17,"tag":84,"props":49929,"children":49930},{},[49931],{"type":23,"value":49932},"company data lookup",{"type":17,"tag":84,"props":49934,"children":49935},{},[49936],{"type":23,"value":49937},"lead scoring signals",{"type":17,"tag":84,"props":49939,"children":49940},{},[49941],{"type":23,"value":49942},"outreach automation data",{"type":17,"tag":29,"props":49944,"children":49945},{},[49946,49948,49953],{"type":23,"value":49947},"Apollo is often used for ",{"type":17,"tag":48,"props":49949,"children":49950},{},[49951],{"type":23,"value":49952},"sales prospecting workflows and outbound lead generation tools",{"type":23,"value":54},{"type":17,"tag":239,"props":49955,"children":49957},{"id":49956},"fullcontact-api",[49958],{"type":23,"value":49959},"FullContact API",{"type":17,"tag":29,"props":49961,"children":49962},{},[49963],{"type":17,"tag":133,"props":49964,"children":49967},{"href":49965,"rel":49966},"https://www.fullcontact.com/developer",[214],[49968],{"type":23,"value":49969},"FullContact Developer Platform",{"type":17,"tag":29,"props":49971,"children":49972},{},[49973],{"type":23,"value":49974},"FullContact focuses on identity resolution and profile enrichment.",{"type":17,"tag":29,"props":49976,"children":49977},{},[49978],{"type":23,"value":49979},"Capabilities include:",{"type":17,"tag":80,"props":49981,"children":49982},{},[49983,49988,49992,49997],{"type":17,"tag":84,"props":49984,"children":49985},{},[49986],{"type":23,"value":49987},"identity graphs",{"type":17,"tag":84,"props":49989,"children":49990},{},[49991],{"type":23,"value":49485},{"type":17,"tag":84,"props":49993,"children":49994},{},[49995],{"type":23,"value":49996},"social profile aggregation",{"type":17,"tag":84,"props":49998,"children":49999},{},[50000],{"type":23,"value":49492},{"type":17,"tag":29,"props":50002,"children":50003},{},[50004,50006,50011],{"type":23,"value":50005},"FullContact is commonly used in ",{"type":17,"tag":48,"props":50007,"children":50008},{},[50009],{"type":23,"value":50010},"customer data platforms (CDPs)",{"type":23,"value":50012}," and identity resolution pipelines.",{"type":17,"tag":239,"props":50014,"children":50016},{"id":50015},"hunter-api",[50017],{"type":23,"value":50018},"Hunter API",{"type":17,"tag":29,"props":50020,"children":50021},{},[50022],{"type":17,"tag":133,"props":50023,"children":50026},{"href":50024,"rel":50025},"https://hunter.io/api",[214],[50027],{"type":23,"value":50028},"Hunter API Documentation",{"type":17,"tag":29,"props":50030,"children":50031},{},[50032],{"type":23,"value":50033},"Hunter specializes in email discovery and verification.",{"type":17,"tag":29,"props":50035,"children":50036},{},[50037],{"type":23,"value":50038},"Its APIs provide:",{"type":17,"tag":80,"props":50040,"children":50041},{},[50042,50047,50052],{"type":17,"tag":84,"props":50043,"children":50044},{},[50045],{"type":23,"value":50046},"domain email discovery",{"type":17,"tag":84,"props":50048,"children":50049},{},[50050],{"type":23,"value":50051},"email verification",{"type":17,"tag":84,"props":50053,"children":50054},{},[50055],{"type":23,"value":50056},"company contact patterns",{"type":17,"tag":29,"props":50058,"children":50059},{},[50060,50062,50067],{"type":23,"value":50061},"Hunter is widely used in ",{"type":17,"tag":48,"props":50063,"children":50064},{},[50065],{"type":23,"value":50066},"sales prospecting platforms and outreach tools",{"type":23,"value":54},{"type":17,"tag":239,"props":50069,"children":50071},{"id":50070},"people-data-labs-api",[50072],{"type":23,"value":50073},"People Data Labs API",{"type":17,"tag":29,"props":50075,"children":50076},{},[50077],{"type":17,"tag":133,"props":50078,"children":50081},{"href":50079,"rel":50080},"https://docs.peopledatalabs.com/",[214],[50082],{"type":23,"value":50083},"People Data Labs Developer Docs",{"type":17,"tag":29,"props":50085,"children":50086},{},[50087],{"type":23,"value":50088},"People Data Labs provides one of the largest structured datasets for person and company enrichment.",{"type":17,"tag":29,"props":50090,"children":50091},{},[50092],{"type":23,"value":49920},{"type":17,"tag":80,"props":50094,"children":50095},{},[50096,50101,50105,50110],{"type":17,"tag":84,"props":50097,"children":50098},{},[50099],{"type":23,"value":50100},"professional profiles",{"type":17,"tag":84,"props":50102,"children":50103},{},[50104],{"type":23,"value":49803},{"type":17,"tag":84,"props":50106,"children":50107},{},[50108],{"type":23,"value":50109},"demographic attributes",{"type":17,"tag":84,"props":50111,"children":50112},{},[50113],{"type":23,"value":50114},"skills and employment history",{"type":17,"tag":29,"props":50116,"children":50117},{},[50118,50120,50125],{"type":23,"value":50119},"People Data Labs is often integrated into ",{"type":17,"tag":48,"props":50121,"children":50122},{},[50123],{"type":23,"value":50124},"AI prospecting tools and workforce analytics platforms",{"type":23,"value":54},{"type":17,"tag":239,"props":50127,"children":50129},{"id":50128},"rocketreach-api",[50130],{"type":23,"value":50131},"RocketReach API",{"type":17,"tag":29,"props":50133,"children":50134},{},[50135],{"type":17,"tag":133,"props":50136,"children":50139},{"href":50137,"rel":50138},"https://rocketreach.co/",[214],[50140],{"type":23,"value":50131},{"type":17,"tag":29,"props":50142,"children":50143},{},[50144],{"type":23,"value":50145},"RocketReach focuses on professional contact discovery.",{"type":17,"tag":29,"props":50147,"children":50148},{},[50149],{"type":23,"value":49790},{"type":17,"tag":80,"props":50151,"children":50152},{},[50153,50158,50163,50168],{"type":17,"tag":84,"props":50154,"children":50155},{},[50156],{"type":23,"value":50157},"email discovery",{"type":17,"tag":84,"props":50159,"children":50160},{},[50161],{"type":23,"value":50162},"phone number lookup",{"type":17,"tag":84,"props":50164,"children":50165},{},[50166],{"type":23,"value":50167},"company enrichment",{"type":17,"tag":84,"props":50169,"children":50170},{},[50171],{"type":23,"value":50172},"contact profiles",{"type":17,"tag":29,"props":50174,"children":50175},{},[50176,50178,50183],{"type":23,"value":50177},"It is commonly used by ",{"type":17,"tag":48,"props":50179,"children":50180},{},[50181],{"type":23,"value":50182},"sales automation platforms and recruitment tools",{"type":23,"value":54},{"type":17,"tag":239,"props":50185,"children":50187},{"id":50186},"crunchbase-api",[50188],{"type":23,"value":50189},"Crunchbase API",{"type":17,"tag":29,"props":50191,"children":50192},{},[50193],{"type":17,"tag":133,"props":50194,"children":50197},{"href":50195,"rel":50196},"https://data.crunchbase.com/",[214],[50198],{"type":23,"value":50189},{"type":17,"tag":29,"props":50200,"children":50201},{},[50202],{"type":23,"value":50203},"Crunchbase provides company intelligence focused on startups and venture-backed businesses.",{"type":17,"tag":29,"props":50205,"children":50206},{},[50207],{"type":23,"value":50208},"Its APIs allow developers to access:",{"type":17,"tag":80,"props":50210,"children":50211},{},[50212,50217,50222,50227],{"type":17,"tag":84,"props":50213,"children":50214},{},[50215],{"type":23,"value":50216},"funding rounds",{"type":17,"tag":84,"props":50218,"children":50219},{},[50220],{"type":23,"value":50221},"investor relationships",{"type":17,"tag":84,"props":50223,"children":50224},{},[50225],{"type":23,"value":50226},"startup profiles",{"type":17,"tag":84,"props":50228,"children":50229},{},[50230],{"type":23,"value":50231},"company growth signals",{"type":17,"tag":29,"props":50233,"children":50234},{},[50235,50237,50242],{"type":23,"value":50236},"Crunchbase data is commonly used in ",{"type":17,"tag":48,"props":50238,"children":50239},{},[50240],{"type":23,"value":50241},"venture analytics platforms and startup discovery tools",{"type":23,"value":54},{"type":17,"tag":239,"props":50244,"children":50246},{"id":50245},"lusha-api",[50247],{"type":23,"value":50248},"Lusha API",{"type":17,"tag":29,"props":50250,"children":50251},{},[50252],{"type":17,"tag":133,"props":50253,"children":50256},{"href":50254,"rel":50255},"https://www.lusha.com/",[214],[50257],{"type":23,"value":50258},"Lusha Developer Platform",{"type":17,"tag":29,"props":50260,"children":50261},{},[50262],{"type":23,"value":50263},"Lusha provides B2B contact and company enrichment data.",{"type":17,"tag":29,"props":50265,"children":50266},{},[50267],{"type":23,"value":49979},{"type":17,"tag":80,"props":50269,"children":50270},{},[50271,50276,50280],{"type":17,"tag":84,"props":50272,"children":50273},{},[50274],{"type":23,"value":50275},"phone number discovery",{"type":17,"tag":84,"props":50277,"children":50278},{},[50279],{"type":23,"value":50100},{"type":17,"tag":84,"props":50281,"children":50282},{},[50283],{"type":23,"value":49803},{"type":17,"tag":29,"props":50285,"children":50286},{},[50287,50289,50294],{"type":23,"value":50288},"Lusha is commonly integrated into ",{"type":17,"tag":48,"props":50290,"children":50291},{},[50292],{"type":23,"value":50293},"sales prospecting and CRM enrichment tools",{"type":23,"value":54},{"type":17,"tag":239,"props":50296,"children":50298},{"id":50297},"uplead-api",[50299],{"type":23,"value":50300},"UpLead API",{"type":17,"tag":29,"props":50302,"children":50303},{},[50304],{"type":17,"tag":133,"props":50305,"children":50308},{"href":50306,"rel":50307},"https://www.uplead.com/",[214],[50309],{"type":23,"value":50310},"UpLead Platform",{"type":17,"tag":29,"props":50312,"children":50313},{},[50314],{"type":23,"value":50315},"UpLead provides B2B contact and company intelligence.",{"type":17,"tag":29,"props":50317,"children":50318},{},[50319],{"type":23,"value":50320},"Its APIs allow developers to retrieve:",{"type":17,"tag":80,"props":50322,"children":50323},{},[50324,50329,50333],{"type":17,"tag":84,"props":50325,"children":50326},{},[50327],{"type":23,"value":50328},"verified business contacts",{"type":17,"tag":84,"props":50330,"children":50331},{},[50332],{"type":23,"value":49803},{"type":17,"tag":84,"props":50334,"children":50335},{},[50336],{"type":23,"value":49878},{"type":17,"tag":29,"props":50338,"children":50339},{},[50340,50342,50347],{"type":23,"value":50341},"UpLead is often used in ",{"type":17,"tag":48,"props":50343,"children":50344},{},[50345],{"type":23,"value":50346},"sales intelligence products",{"type":23,"value":54},{"type":17,"tag":239,"props":50349,"children":50351},{"id":50350},"additional-enrichment-apis",[50352],{"type":23,"value":50353},"Additional Enrichment APIs",{"type":17,"tag":29,"props":50355,"children":50356},{},[50357],{"type":23,"value":50358},"Beyond the major providers above, SaaS products often integrate with many additional enrichment platforms including:",{"type":17,"tag":80,"props":50360,"children":50361},{},[50362,50372,50382,50392,50402,50412,50422,50432,50442,50452,50462,50472,50482,50492],{"type":17,"tag":84,"props":50363,"children":50364},{},[50365],{"type":17,"tag":133,"props":50366,"children":50369},{"href":50367,"rel":50368},"https://contactout.com/",[214],[50370],{"type":23,"value":50371},"ContactOut",{"type":17,"tag":84,"props":50373,"children":50374},{},[50375],{"type":17,"tag":133,"props":50376,"children":50379},{"href":50377,"rel":50378},"https://www.crystalknows.com/",[214],[50380],{"type":23,"value":50381},"CrystalKnows",{"type":17,"tag":84,"props":50383,"children":50384},{},[50385],{"type":17,"tag":133,"props":50386,"children":50389},{"href":50387,"rel":50388},"https://datagma.com/",[214],[50390],{"type":23,"value":50391},"Datagma",{"type":17,"tag":84,"props":50393,"children":50394},{},[50395],{"type":17,"tag":133,"props":50396,"children":50399},{"href":50397,"rel":50398},"https://dropcontact.com/",[214],[50400],{"type":23,"value":50401},"DropContact",{"type":17,"tag":84,"props":50403,"children":50404},{},[50405],{"type":17,"tag":133,"props":50406,"children":50409},{"href":50407,"rel":50408},"https://www.exactbuyer.com/",[214],[50410],{"type":23,"value":50411},"ExactBuyer",{"type":17,"tag":84,"props":50413,"children":50414},{},[50415],{"type":17,"tag":133,"props":50416,"children":50419},{"href":50417,"rel":50418},"https://getprospect.com/",[214],[50420],{"type":23,"value":50421},"GetProspect",{"type":17,"tag":84,"props":50423,"children":50424},{},[50425],{"type":17,"tag":133,"props":50426,"children":50429},{"href":50427,"rel":50428},"https://humantic.ai/",[214],[50430],{"type":23,"value":50431},"Humantic AI",{"type":17,"tag":84,"props":50433,"children":50434},{},[50435],{"type":17,"tag":133,"props":50436,"children":50439},{"href":50437,"rel":50438},"https://leadsift.com/",[214],[50440],{"type":23,"value":50441},"LeadSift",{"type":17,"tag":84,"props":50443,"children":50444},{},[50445],{"type":17,"tag":133,"props":50446,"children":50449},{"href":50447,"rel":50448},"https://mattermark.com/",[214],[50450],{"type":23,"value":50451},"Mattermark",{"type":17,"tag":84,"props":50453,"children":50454},{},[50455],{"type":17,"tag":133,"props":50456,"children":50459},{"href":50457,"rel":50458},"https://pipl.com/",[214],[50460],{"type":23,"value":50461},"Pipl",{"type":17,"tag":84,"props":50463,"children":50464},{},[50465],{"type":17,"tag":133,"props":50466,"children":50469},{"href":50467,"rel":50468},"https://pitchbook.com/",[214],[50470],{"type":23,"value":50471},"PitchBook",{"type":17,"tag":84,"props":50473,"children":50474},{},[50475],{"type":17,"tag":133,"props":50476,"children":50479},{"href":50477,"rel":50478},"https://www.receptiviti.com/",[214],[50480],{"type":23,"value":50481},"Receptiviti",{"type":17,"tag":84,"props":50483,"children":50484},{},[50485],{"type":17,"tag":133,"props":50486,"children":50489},{"href":50487,"rel":50488},"https://www.slintel.com/",[214],[50490],{"type":23,"value":50491},"Slintel",{"type":17,"tag":84,"props":50493,"children":50494},{},[50495],{"type":17,"tag":133,"props":50496,"children":50499},{"href":50497,"rel":50498},"https://developer.twitter.com/",[214],[50500],{"type":23,"value":50501},"Twitter/X APIs",{"type":17,"tag":29,"props":50503,"children":50504},{},[50505],{"type":23,"value":50506},"The enrichment ecosystem is large and constantly evolving, making it difficult for SaaS companies to maintain integrations with every provider customers may request.",{"type":17,"tag":68,"props":50508,"children":50510},{"id":50509},"challenges-when-integrating-enrichment-apis",[50511],{"type":23,"value":50512},"Challenges When Integrating Enrichment APIs",{"type":17,"tag":29,"props":50514,"children":50515},{},[50516],{"type":23,"value":50517},"Building enrichment integrations directly with each provider introduces several challenges.",{"type":17,"tag":29,"props":50519,"children":50520},{},[50521],{"type":17,"tag":48,"props":50522,"children":50523},{},[50524],{"type":23,"value":50525},"Different authentication systems",{"type":17,"tag":29,"props":50527,"children":50528},{},[50529,50531,50535],{"type":23,"value":50530},"Each provider may use API keys, ",{"type":17,"tag":133,"props":50532,"children":50533},{"href":779},[50534],{"type":23,"value":782},{"type":23,"value":50536},", or proprietary authentication methods.",{"type":17,"tag":29,"props":50538,"children":50539},{},[50540],{"type":17,"tag":48,"props":50541,"children":50542},{},[50543],{"type":23,"value":1901},{"type":17,"tag":29,"props":50545,"children":50546},{},[50547],{"type":23,"value":50548},"Person and company objects differ widely between providers.",{"type":17,"tag":29,"props":50550,"children":50551},{},[50552],{"type":17,"tag":48,"props":50553,"children":50554},{},[50555],{"type":17,"tag":133,"props":50556,"children":50557},{"href":135},[50558],{"type":23,"value":3279},{"type":17,"tag":29,"props":50560,"children":50561},{},[50562],{"type":23,"value":50563},"Many enrichment providers enforce strict request quotas and concurrency limits.",{"type":17,"tag":29,"props":50565,"children":50566},{},[50567],{"type":17,"tag":48,"props":50568,"children":50569},{},[50570],{"type":23,"value":50571},"Version changes",{"type":17,"tag":29,"props":50573,"children":50574},{},[50575],{"type":23,"value":50576},"APIs frequently evolve, requiring ongoing maintenance.",{"type":17,"tag":29,"props":50578,"children":50579},{},[50580],{"type":17,"tag":48,"props":50581,"children":50582},{},[50583],{"type":23,"value":50584},"Provider fragmentation",{"type":17,"tag":29,"props":50586,"children":50587},{},[50588],{"type":23,"value":50589},"Customers may use completely different enrichment providers, forcing SaaS companies to support multiple APIs.",{"type":17,"tag":29,"props":50591,"children":50592},{},[50593],{"type":23,"value":50594},"As SaaS platforms scale, maintaining dozens of enrichment integrations becomes increasingly expensive.",{"type":17,"tag":68,"props":50596,"children":50598},{"id":50597},"the-role-of-unified-enrichment-apis",[50599],{"type":23,"value":50600},"The Role of Unified Enrichment APIs",{"type":17,"tag":29,"props":50602,"children":50603},{},[50604,50606,50611],{"type":23,"value":50605},"To solve this problem, many SaaS products now adopt ",{"type":17,"tag":48,"props":50607,"children":50608},{},[50609],{"type":23,"value":50610},"Unified Enrichment APIs",{"type":23,"value":54},{"type":17,"tag":29,"props":50613,"children":50614},{},[50615],{"type":23,"value":50616},"A unified API standardizes enrichment data models and authentication across multiple providers so developers can integrate once and support many platforms.",{"type":17,"tag":29,"props":50618,"children":50619},{},[50620],{"type":23,"value":50621},"Instead of building separate integrations for Clearbit, ZoomInfo, Apollo, and others, a unified API layer provides:",{"type":17,"tag":80,"props":50623,"children":50624},{},[50625,50630,50635,50640,50645],{"type":17,"tag":84,"props":50626,"children":50627},{},[50628],{"type":23,"value":50629},"a single authentication model",{"type":17,"tag":84,"props":50631,"children":50632},{},[50633],{"type":23,"value":50634},"normalized person and company schemas",{"type":17,"tag":84,"props":50636,"children":50637},{},[50638],{"type":23,"value":50639},"consistent API endpoints",{"type":17,"tag":84,"props":50641,"children":50642},{},[50643],{"type":23,"value":50644},"standardized error handling",{"type":17,"tag":84,"props":50646,"children":50647},{},[50648],{"type":23,"value":50649},"automatic vendor API updates",{"type":17,"tag":29,"props":50651,"children":50652},{},[50653],{"type":23,"value":50654},"This significantly reduces integration complexity and maintenance overhead.",{"type":17,"tag":68,"props":50656,"children":50658},{"id":50657},"build-once-with-the-unified-enrichment-api",[50659],{"type":23,"value":50660},"Build Once with the Unified Enrichment API",{"type":17,"tag":29,"props":50662,"children":50663},{},[50664,50666,50671,50673,50678],{"type":23,"value":50665},"Unified provides a ",{"type":17,"tag":48,"props":50667,"children":50668},{},[50669],{"type":23,"value":50670},"Unified Enrichment API",{"type":23,"value":50672}," that supports ",{"type":17,"tag":48,"props":50674,"children":50675},{},[50676],{"type":23,"value":50677},"25+ enrichment providers",{"type":23,"value":50679}," through a single integration.",{"type":17,"tag":29,"props":50681,"children":50682},{},[50683,50685],{"type":23,"value":50684},"You can explore the full integration list here: ",{"type":17,"tag":133,"props":50686,"children":50688},{"href":212,"rel":50687},[214],[50689],{"type":23,"value":50690},"Unified Enrichment Integrations",{"type":17,"tag":29,"props":50692,"children":50693},{},[50694],{"type":23,"value":50695},"Unified standardizes enrichment data across providers like Clearbit, ZoomInfo, Apollo, FullContact, Hunter, and many others.",{"type":17,"tag":239,"props":50697,"children":50699},{"id":50698},"unified-enrichment-data-objects",[50700],{"type":23,"value":50701},"Unified Enrichment Data Objects",{"type":17,"tag":29,"props":50703,"children":50704},{},[50705],{"type":23,"value":50706},"The Unified Enrichment API provides two core normalized objects.",{"type":17,"tag":29,"props":50708,"children":50709},{},[50710],{"type":17,"tag":48,"props":50711,"children":50712},{},[50713],{"type":23,"value":50714},"Person",{"type":17,"tag":29,"props":50716,"children":50717},{},[50718],{"type":23,"value":50719},"Enhanced individual profiles including:",{"type":17,"tag":80,"props":50721,"children":50722},{},[50723,50727,50731,50736,50741,50746,50750],{"type":17,"tag":84,"props":50724,"children":50725},{},[50726],{"type":23,"value":18781},{"type":17,"tag":84,"props":50728,"children":50729},{},[50730],{"type":23,"value":49556},{"type":17,"tag":84,"props":50732,"children":50733},{},[50734],{"type":23,"value":50735},"emails",{"type":17,"tag":84,"props":50737,"children":50738},{},[50739],{"type":23,"value":50740},"phone numbers",{"type":17,"tag":84,"props":50742,"children":50743},{},[50744],{"type":23,"value":50745},"company affiliation",{"type":17,"tag":84,"props":50747,"children":50748},{},[50749],{"type":23,"value":49581},{"type":17,"tag":84,"props":50751,"children":50752},{},[50753],{"type":23,"value":50754},"work history",{"type":17,"tag":29,"props":50756,"children":50757},{},[50758],{"type":17,"tag":48,"props":50759,"children":50760},{},[50761],{"type":23,"value":25846},{"type":17,"tag":29,"props":50763,"children":50764},{},[50765],{"type":23,"value":50766},"Firmographic company information including:",{"type":17,"tag":80,"props":50768,"children":50769},{},[50770,50775,50779,50784,50789,50793],{"type":17,"tag":84,"props":50771,"children":50772},{},[50773],{"type":23,"value":50774},"domain",{"type":17,"tag":84,"props":50776,"children":50777},{},[50778],{"type":23,"value":49566},{"type":17,"tag":84,"props":50780,"children":50781},{},[50782],{"type":23,"value":50783},"industry",{"type":17,"tag":84,"props":50785,"children":50786},{},[50787],{"type":23,"value":50788},"revenue estimates",{"type":17,"tag":84,"props":50790,"children":50791},{},[50792],{"type":23,"value":49596},{"type":17,"tag":84,"props":50794,"children":50795},{},[50796],{"type":23,"value":49581},{"type":17,"tag":239,"props":50798,"children":50800},{"id":50799},"real-time-enrichment-data",[50801],{"type":23,"value":50802},"Real-Time Enrichment Data",{"type":17,"tag":29,"props":50804,"children":50805},{},[50806,50808,50813],{"type":23,"value":50807},"Unlike many integration platforms that cache or sync datasets periodically, Unified uses a ",{"type":17,"tag":48,"props":50809,"children":50810},{},[50811],{"type":23,"value":50812},"real-time pass-through architecture",{"type":23,"value":54},{"type":17,"tag":29,"props":50815,"children":50816},{},[50817],{"type":23,"value":50818},"Every enrichment request:",{"type":17,"tag":80,"props":50820,"children":50821},{},[50822,50827,50832],{"type":17,"tag":84,"props":50823,"children":50824},{},[50825],{"type":23,"value":50826},"hits the source provider API live",{"type":17,"tag":84,"props":50828,"children":50829},{},[50830],{"type":23,"value":50831},"returns fresh data immediately",{"type":17,"tag":84,"props":50833,"children":50834},{},[50835],{"type":23,"value":50836},"does not rely on cached datasets",{"type":17,"tag":29,"props":50838,"children":50839},{},[50840],{"type":23,"value":50841},"This ensures your product always receives the most up-to-date enrichment information.",{"type":17,"tag":239,"props":50843,"children":50845},{"id":50844},"zero-data-storage",[50846],{"type":23,"value":50847},"Zero Data Storage",{"type":17,"tag":29,"props":50849,"children":50850},{},[50851],{"type":23,"value":50852},"Unified does not store customer data.",{"type":17,"tag":29,"props":50854,"children":50855},{},[50856],{"type":23,"value":50857},"All enrichment requests are processed statelessly and forwarded directly to the enrichment provider.",{"type":17,"tag":29,"props":50859,"children":50860},{},[50861,50863,50868],{"type":23,"value":50862},"This architecture significantly reduces ",{"type":17,"tag":48,"props":50864,"children":50865},{},[50866],{"type":23,"value":50867},"compliance risk when working with personal or company data",{"type":23,"value":54},{"type":17,"tag":239,"props":50870,"children":50872},{"id":50871},"faster-enrichment-integrations",[50873],{"type":23,"value":50874},"Faster Enrichment Integrations",{"type":17,"tag":29,"props":50876,"children":50877},{},[50878,50880,50885],{"type":23,"value":50879},"Instead of building and maintaining integrations for dozens of enrichment vendors individually, SaaS teams can integrate once and support ",{"type":17,"tag":48,"props":50881,"children":50882},{},[50883],{"type":23,"value":50884},"25+ enrichment providers immediately",{"type":23,"value":54},{"type":17,"tag":29,"props":50887,"children":50888},{},[50889],{"type":23,"value":50890},"This allows companies to ship enrichment-powered features much faster.",{"type":17,"tag":68,"props":50892,"children":50893},{"id":7672},[50894],{"type":17,"tag":48,"props":50895,"children":50896},{},[50897],{"type":23,"value":19256},{"type":17,"tag":29,"props":50899,"children":50900},{},[50901],{"type":23,"value":50902},"Enrichment APIs play a critical role in modern SaaS products. They power sales intelligence, lead scoring, marketing personalization, and AI-driven customer insights.",{"type":17,"tag":29,"props":50904,"children":50905},{},[50906],{"type":23,"value":50907},"However, integrating dozens of enrichment providers individually can quickly become a major engineering burden.",{"type":17,"tag":29,"props":50909,"children":50910},{},[50911,50913,50917],{"type":23,"value":50912},"As the enrichment ecosystem continues to grow, many SaaS companies are adopting ",{"type":17,"tag":48,"props":50914,"children":50915},{},[50916],{"type":23,"value":50610},{"type":23,"value":50918}," to support multiple providers through a single integration.",{"type":17,"tag":29,"props":50920,"children":50921},{},[50922,50924,50929],{"type":23,"value":50923},"If you're building a SaaS product that relies on enriched customer data, unified APIs provide a scalable way to support ",{"type":17,"tag":48,"props":50925,"children":50926},{},[50927],{"type":23,"value":50928},"Clearbit, ZoomInfo, Apollo, and many other enrichment providers",{"type":23,"value":50930}," without maintaining dozens of separate integrations.",{"type":17,"tag":29,"props":50932,"children":50933},{},[50934],{"type":17,"tag":133,"props":50935,"children":50936},{"href":45703},[50937],{"type":23,"value":44481},{"type":17,"tag":29,"props":50939,"children":50940},{},[50941],{"type":17,"tag":133,"props":50942,"children":50943},{"href":45703},[50944],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":50946},[50947,50948,50949,50962,50963,50964,50970],{"id":49520,"depth":1629,"text":49523},{"id":49666,"depth":1629,"text":49669},{"id":49751,"depth":1629,"text":49754,"children":50950},[50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961],{"id":49762,"depth":1635,"text":49765},{"id":49832,"depth":1635,"text":49835},{"id":49897,"depth":1635,"text":49900},{"id":49956,"depth":1635,"text":49959},{"id":50015,"depth":1635,"text":50018},{"id":50070,"depth":1635,"text":50073},{"id":50128,"depth":1635,"text":50131},{"id":50186,"depth":1635,"text":50189},{"id":50245,"depth":1635,"text":50248},{"id":50297,"depth":1635,"text":50300},{"id":50350,"depth":1635,"text":50353},{"id":50509,"depth":1629,"text":50512},{"id":50597,"depth":1629,"text":50600},{"id":50657,"depth":1629,"text":50660,"children":50965},[50966,50967,50968,50969],{"id":50698,"depth":1635,"text":50701},{"id":50799,"depth":1635,"text":50802},{"id":50844,"depth":1635,"text":50847},{"id":50871,"depth":1635,"text":50874},{"id":7672,"depth":1629,"text":19256},"content:blog:25_enrichment_apis_to_integrate_with_in_2026_clearbit_zoominfo_apollo.md","blog/25_enrichment_apis_to_integrate_with_in_2026_clearbit_zoominfo_apollo.md","blog/25_enrichment_apis_to_integrate_with_in_2026_clearbit_zoominfo_apollo",{"_path":50975,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":50976,"description":50977,"img":50978,"date":50979,"tag":12,"body":50980,"_type":1677,"_id":52251,"_source":1679,"_file":52252,"_stem":52253,"_extension":1682},"/blog/13_marketing_apis_to_integrate_with_in_2026_mailchimp_hubspot_klaviyo","13 Marketing APIs to Integrate With in 2026: Mailchimp, HubSpot, Klaviyo","Marketing automation platforms power modern customer acquisition, email campaigns, and lifecycle marketing workflows. From managing subscriber lists to...","https://s3.us-east-2.amazonaws.com/unified-article-images/13_marketing_apis_to_integrate_with_in_2026_mailchimp_hubspot_klaviyo-icon.png","2026-03-11T16:53:00.000Z",{"type":14,"children":50981,"toc":52214},[50982,50987,50990,50997,51002,51014,51025,51037,51043,51054,51059,51097,51102,51134,51139,51145,51150,51154,51160,51165,51171,51176,51182,51187,51193,51198,51204,51209,51214,51220,51225,51231,51241,51246,51250,51277,51282,51288,51298,51303,51308,51331,51336,51342,51352,51357,51361,51383,51388,51394,51404,51409,51414,51437,51442,51448,51458,51463,51468,51491,51496,51502,51512,51517,51522,51545,51550,51556,51566,51571,51576,51599,51604,51610,51620,51625,51630,51653,51658,51664,51674,51679,51683,51700,51705,51711,51721,51726,51731,51754,51759,51765,51775,51780,51785,51808,51813,51819,51824,51828,51839,51845,51850,51856,51867,51873,51878,51884,51889,51894,51900,51911,51916,51921,51949,51954,51960,51977,51983,51988,51996,52001,52009,52014,52021,52026,52033,52038,52043,52066,52071,52076,52085,52090,52113,52118,52122,52127,52132,52137,52160,52164,52169,52174,52185,52200],{"type":17,"tag":18,"props":50983,"children":50985},{"id":50984},"_13-marketing-apis-to-integrate-with-in-2026-mailchimp-hubspot-klaviyo",[50986],{"type":23,"value":50976},{"type":17,"tag":25,"props":50988,"children":50989},{},[],{"type":17,"tag":29,"props":50991,"children":50992},{},[50993],{"type":17,"tag":33,"props":50994,"children":50995},{},[50996],{"type":23,"value":49465},{"type":17,"tag":29,"props":50998,"children":50999},{},[51000],{"type":23,"value":51001},"Marketing automation platforms power modern customer acquisition, email campaigns, and lifecycle marketing workflows. From managing subscriber lists to tracking campaign performance, marketing systems generate a huge amount of lead and engagement data.",{"type":17,"tag":29,"props":51003,"children":51004},{},[51005,51007,51012],{"type":23,"value":51006},"As SaaS products increasingly connect with marketing platforms, ",{"type":17,"tag":48,"props":51008,"children":51009},{},[51010],{"type":23,"value":51011},"marketing APIs have become a core part of integration infrastructure",{"type":23,"value":51013},". These APIs allow applications to sync leads, manage marketing lists, automate campaigns, and analyze engagement across different platforms.",{"type":17,"tag":29,"props":51015,"children":51016},{},[51017,51019,51023],{"type":23,"value":51018},"However, integrating marketing platforms individually introduces significant engineering complexity. Each platform exposes different authentication models, data structures, ",{"type":17,"tag":133,"props":51020,"children":51021},{"href":135},[51022],{"type":23,"value":138},{"type":23,"value":51024},", and webhook systems.",{"type":17,"tag":29,"props":51026,"children":51027},{},[51028,51030,51035],{"type":23,"value":51029},"In this guide, we'll explore ",{"type":17,"tag":48,"props":51031,"children":51032},{},[51033],{"type":23,"value":51034},"13+ marketing APIs developers commonly integrate with",{"type":23,"value":51036},", the challenges of building marketing integrations, and how unified marketing APIs simplify multi-platform marketing data access.",{"type":17,"tag":68,"props":51038,"children":51040},{"id":51039},"what-is-a-marketing-api",[51041],{"type":23,"value":51042},"What Is a Marketing API?",{"type":17,"tag":29,"props":51044,"children":51045},{},[51046,51047,51052],{"type":23,"value":9619},{"type":17,"tag":48,"props":51048,"children":51049},{},[51050],{"type":23,"value":51051},"marketing automation API",{"type":23,"value":51053}," allows software applications to access marketing data and automate customer engagement workflows programmatically.",{"type":17,"tag":29,"props":51055,"children":51056},{},[51057],{"type":23,"value":51058},"Marketing APIs typically expose operations for:",{"type":17,"tag":80,"props":51060,"children":51061},{},[51062,51067,51072,51077,51082,51087,51092],{"type":17,"tag":84,"props":51063,"children":51064},{},[51065],{"type":23,"value":51066},"managing marketing lists and audiences",{"type":17,"tag":84,"props":51068,"children":51069},{},[51070],{"type":23,"value":51071},"creating and updating subscribers",{"type":17,"tag":84,"props":51073,"children":51074},{},[51075],{"type":23,"value":51076},"triggering email campaigns",{"type":17,"tag":84,"props":51078,"children":51079},{},[51080],{"type":23,"value":51081},"retrieving campaign analytics",{"type":17,"tag":84,"props":51083,"children":51084},{},[51085],{"type":23,"value":51086},"tracking engagement metrics",{"type":17,"tag":84,"props":51088,"children":51089},{},[51090],{"type":23,"value":51091},"segmenting audiences",{"type":17,"tag":84,"props":51093,"children":51094},{},[51095],{"type":23,"value":51096},"synchronizing leads across systems",{"type":17,"tag":29,"props":51098,"children":51099},{},[51100],{"type":23,"value":51101},"These APIs enable SaaS platforms to build workflows such as:",{"type":17,"tag":80,"props":51103,"children":51104},{},[51105,51110,51115,51119,51124,51129],{"type":17,"tag":84,"props":51106,"children":51107},{},[51108],{"type":23,"value":51109},"lead capture and enrichment",{"type":17,"tag":84,"props":51111,"children":51112},{},[51113],{"type":23,"value":51114},"lifecycle email automation",{"type":17,"tag":84,"props":51116,"children":51117},{},[51118],{"type":23,"value":40504},{"type":17,"tag":84,"props":51120,"children":51121},{},[51122],{"type":23,"value":51123},"CRM-marketing synchronization",{"type":17,"tag":84,"props":51125,"children":51126},{},[51127],{"type":23,"value":51128},"AI-powered customer segmentation",{"type":17,"tag":84,"props":51130,"children":51131},{},[51132],{"type":23,"value":51133},"marketing attribution reporting",{"type":17,"tag":29,"props":51135,"children":51136},{},[51137],{"type":23,"value":51138},"Because marketing systems often sit upstream of sales workflows, these APIs frequently integrate closely with CRM platforms.",{"type":17,"tag":68,"props":51140,"children":51142},{"id":51141},"why-saas-products-integrate-marketing-apis",[51143],{"type":23,"value":51144},"Why SaaS Products Integrate Marketing APIs",{"type":17,"tag":29,"props":51146,"children":51147},{},[51148],{"type":23,"value":51149},"Many SaaS platforms integrate marketing systems to automate customer communication and track growth performance.",{"type":17,"tag":29,"props":51151,"children":51152},{},[51153],{"type":23,"value":12661},{"type":17,"tag":239,"props":51155,"children":51157},{"id":51156},"lead-synchronization",[51158],{"type":23,"value":51159},"Lead synchronization",{"type":17,"tag":29,"props":51161,"children":51162},{},[51163],{"type":23,"value":51164},"Automatically sync leads between marketing platforms and CRMs to ensure sales teams always have current contact information.",{"type":17,"tag":239,"props":51166,"children":51168},{"id":51167},"campaign-automation",[51169],{"type":23,"value":51170},"Campaign automation",{"type":17,"tag":29,"props":51172,"children":51173},{},[51174],{"type":23,"value":51175},"Trigger marketing campaigns or personalized messages based on user behavior or product events.",{"type":17,"tag":239,"props":51177,"children":51179},{"id":51178},"audience-segmentation",[51180],{"type":23,"value":51181},"Audience segmentation",{"type":17,"tag":29,"props":51183,"children":51184},{},[51185],{"type":23,"value":51186},"Build tools that dynamically segment customers based on activity, engagement, or demographic data.",{"type":17,"tag":239,"props":51188,"children":51190},{"id":51189},"campaign-performance-analytics",[51191],{"type":23,"value":51192},"Campaign performance analytics",{"type":17,"tag":29,"props":51194,"children":51195},{},[51196],{"type":23,"value":51197},"Pull campaign metrics into dashboards to analyze open rates, click-through rates, and engagement trends.",{"type":17,"tag":239,"props":51199,"children":51201},{"id":51200},"lifecycle-marketing-automation",[51202],{"type":23,"value":51203},"Lifecycle marketing automation",{"type":17,"tag":29,"props":51205,"children":51206},{},[51207],{"type":23,"value":51208},"Automate onboarding emails, retention campaigns, or win-back workflows based on customer actions.",{"type":17,"tag":29,"props":51210,"children":51211},{},[51212],{"type":23,"value":51213},"Because companies often use multiple marketing platforms simultaneously, supporting multiple marketing APIs quickly becomes necessary.",{"type":17,"tag":68,"props":51215,"children":51217},{"id":51216},"_13-marketing-apis-developers-integrate-with",[51218],{"type":23,"value":51219},"13+ Marketing APIs Developers Integrate With",{"type":17,"tag":29,"props":51221,"children":51222},{},[51223],{"type":23,"value":51224},"Below are some of the most commonly integrated marketing automation APIs used by SaaS products today.",{"type":17,"tag":239,"props":51226,"children":51228},{"id":51227},"mailchimp-api",[51229],{"type":23,"value":51230},"Mailchimp API",{"type":17,"tag":29,"props":51232,"children":51233},{},[51234],{"type":17,"tag":133,"props":51235,"children":51238},{"href":51236,"rel":51237},"https://mailchimp.com/developer/",[214],[51239],{"type":23,"value":51240},"Mailchimp Developer Docs",{"type":17,"tag":29,"props":51242,"children":51243},{},[51244],{"type":23,"value":51245},"Mailchimp is one of the most widely used email marketing platforms globally. Its API allows developers to manage subscriber lists, campaigns, and engagement data.",{"type":17,"tag":29,"props":51247,"children":51248},{},[51249],{"type":23,"value":12607},{"type":17,"tag":80,"props":51251,"children":51252},{},[51253,51258,51263,51268,51273],{"type":17,"tag":84,"props":51254,"children":51255},{},[51256],{"type":23,"value":51257},"subscriber list management",{"type":17,"tag":84,"props":51259,"children":51260},{},[51261],{"type":23,"value":51262},"campaign creation and scheduling",{"type":17,"tag":84,"props":51264,"children":51265},{},[51266],{"type":23,"value":51267},"email performance analytics",{"type":17,"tag":84,"props":51269,"children":51270},{},[51271],{"type":23,"value":51272},"audience segmentation",{"type":17,"tag":84,"props":51274,"children":51275},{},[51276],{"type":23,"value":10949},{"type":17,"tag":29,"props":51278,"children":51279},{},[51280],{"type":23,"value":51281},"Mailchimp integrations are common in SaaS platforms that manage email marketing or customer engagement.",{"type":17,"tag":239,"props":51283,"children":51285},{"id":51284},"hubspot-marketing-api",[51286],{"type":23,"value":51287},"HubSpot Marketing API",{"type":17,"tag":29,"props":51289,"children":51290},{},[51291],{"type":17,"tag":133,"props":51292,"children":51295},{"href":51293,"rel":51294},"https://developers.hubspot.com/docs/api/marketing",[214],[51296],{"type":23,"value":51297},"HubSpot Marketing API Docs",{"type":17,"tag":29,"props":51299,"children":51300},{},[51301],{"type":23,"value":51302},"HubSpot provides a comprehensive marketing automation platform tightly integrated with its CRM.",{"type":17,"tag":29,"props":51304,"children":51305},{},[51306],{"type":23,"value":51307},"The API enables applications to:",{"type":17,"tag":80,"props":51309,"children":51310},{},[51311,51316,51321,51326],{"type":17,"tag":84,"props":51312,"children":51313},{},[51314],{"type":23,"value":51315},"manage contacts and marketing lists",{"type":17,"tag":84,"props":51317,"children":51318},{},[51319],{"type":23,"value":51320},"create email campaigns",{"type":17,"tag":84,"props":51322,"children":51323},{},[51324],{"type":23,"value":51325},"retrieve marketing analytics",{"type":17,"tag":84,"props":51327,"children":51328},{},[51329],{"type":23,"value":51330},"track customer lifecycle events",{"type":17,"tag":29,"props":51332,"children":51333},{},[51334],{"type":23,"value":51335},"HubSpot is frequently used in SaaS platforms that combine CRM and marketing automation workflows.",{"type":17,"tag":239,"props":51337,"children":51339},{"id":51338},"klaviyo-api",[51340],{"type":23,"value":51341},"Klaviyo API",{"type":17,"tag":29,"props":51343,"children":51344},{},[51345],{"type":17,"tag":133,"props":51346,"children":51349},{"href":51347,"rel":51348},"https://developers.klaviyo.com/",[214],[51350],{"type":23,"value":51351},"Klaviyo Developer Platform",{"type":17,"tag":29,"props":51353,"children":51354},{},[51355],{"type":23,"value":51356},"Klaviyo is widely used by e-commerce companies for email and SMS marketing automation.",{"type":17,"tag":29,"props":51358,"children":51359},{},[51360],{"type":23,"value":49790},{"type":17,"tag":80,"props":51362,"children":51363},{},[51364,51369,51374,51378],{"type":17,"tag":84,"props":51365,"children":51366},{},[51367],{"type":23,"value":51368},"customer segmentation",{"type":17,"tag":84,"props":51370,"children":51371},{},[51372],{"type":23,"value":51373},"behavioral marketing triggers",{"type":17,"tag":84,"props":51375,"children":51376},{},[51377],{"type":23,"value":40735},{"type":17,"tag":84,"props":51379,"children":51380},{},[51381],{"type":23,"value":51382},"subscriber profile management",{"type":17,"tag":29,"props":51384,"children":51385},{},[51386],{"type":23,"value":51387},"Klaviyo integrations are common in commerce analytics, personalization, and lifecycle marketing platforms.",{"type":17,"tag":239,"props":51389,"children":51391},{"id":51390},"activecampaign-api",[51392],{"type":23,"value":51393},"ActiveCampaign API",{"type":17,"tag":29,"props":51395,"children":51396},{},[51397],{"type":17,"tag":133,"props":51398,"children":51401},{"href":51399,"rel":51400},"https://developers.activecampaign.com/reference",[214],[51402],{"type":23,"value":51403},"ActiveCampaign Developer Docs",{"type":17,"tag":29,"props":51405,"children":51406},{},[51407],{"type":23,"value":51408},"ActiveCampaign combines CRM and marketing automation into a single platform.",{"type":17,"tag":29,"props":51410,"children":51411},{},[51412],{"type":23,"value":51413},"Its API allows developers to:",{"type":17,"tag":80,"props":51415,"children":51416},{},[51417,51422,51427,51432],{"type":17,"tag":84,"props":51418,"children":51419},{},[51420],{"type":23,"value":51421},"manage contacts and lists",{"type":17,"tag":84,"props":51423,"children":51424},{},[51425],{"type":23,"value":51426},"automate marketing sequences",{"type":17,"tag":84,"props":51428,"children":51429},{},[51430],{"type":23,"value":51431},"track campaign engagement",{"type":17,"tag":84,"props":51433,"children":51434},{},[51435],{"type":23,"value":51436},"build custom marketing workflows",{"type":17,"tag":29,"props":51438,"children":51439},{},[51440],{"type":23,"value":51441},"ActiveCampaign integrations are widely used in lead nurturing and customer engagement tools.",{"type":17,"tag":239,"props":51443,"children":51445},{"id":51444},"customerio-api",[51446],{"type":23,"value":51447},"Customer.io API",{"type":17,"tag":29,"props":51449,"children":51450},{},[51451],{"type":17,"tag":133,"props":51452,"children":51455},{"href":51453,"rel":51454},"https://customer.io/docs/api/",[214],[51456],{"type":23,"value":51457},"Customer.io API Docs",{"type":17,"tag":29,"props":51459,"children":51460},{},[51461],{"type":23,"value":51462},"Customer.io focuses on event-driven messaging for SaaS products.",{"type":17,"tag":29,"props":51464,"children":51465},{},[51466],{"type":23,"value":51467},"Its API supports:",{"type":17,"tag":80,"props":51469,"children":51470},{},[51471,51476,51481,51486],{"type":17,"tag":84,"props":51472,"children":51473},{},[51474],{"type":23,"value":51475},"event-triggered messaging",{"type":17,"tag":84,"props":51477,"children":51478},{},[51479],{"type":23,"value":51480},"behavioral segmentation",{"type":17,"tag":84,"props":51482,"children":51483},{},[51484],{"type":23,"value":51485},"lifecycle marketing automation",{"type":17,"tag":84,"props":51487,"children":51488},{},[51489],{"type":23,"value":51490},"transactional messaging workflows",{"type":17,"tag":29,"props":51492,"children":51493},{},[51494],{"type":23,"value":51495},"Customer.io is commonly integrated into SaaS platforms that require product-triggered messaging.",{"type":17,"tag":239,"props":51497,"children":51499},{"id":51498},"keap-api",[51500],{"type":23,"value":51501},"Keap API",{"type":17,"tag":29,"props":51503,"children":51504},{},[51505],{"type":17,"tag":133,"props":51506,"children":51509},{"href":51507,"rel":51508},"https://developer.keap.com/",[214],[51510],{"type":23,"value":51511},"Keap Developer API",{"type":17,"tag":29,"props":51513,"children":51514},{},[51515],{"type":23,"value":51516},"Keap (formerly Infusionsoft) provides CRM and marketing automation for small businesses.",{"type":17,"tag":29,"props":51518,"children":51519},{},[51520],{"type":23,"value":51521},"Key API capabilities include:",{"type":17,"tag":80,"props":51523,"children":51524},{},[51525,51530,51535,51540],{"type":17,"tag":84,"props":51526,"children":51527},{},[51528],{"type":23,"value":51529},"contact and lead management",{"type":17,"tag":84,"props":51531,"children":51532},{},[51533],{"type":23,"value":51534},"marketing automation workflows",{"type":17,"tag":84,"props":51536,"children":51537},{},[51538],{"type":23,"value":51539},"email campaign management",{"type":17,"tag":84,"props":51541,"children":51542},{},[51543],{"type":23,"value":51544},"reporting and engagement analytics",{"type":17,"tag":29,"props":51546,"children":51547},{},[51548],{"type":23,"value":51549},"Keap integrations are commonly used in small business automation tools.",{"type":17,"tag":239,"props":51551,"children":51553},{"id":51552},"salesforce-marketing-cloud-api",[51554],{"type":23,"value":51555},"Salesforce Marketing Cloud API",{"type":17,"tag":29,"props":51557,"children":51558},{},[51559],{"type":17,"tag":133,"props":51560,"children":51563},{"href":51561,"rel":51562},"https://developer.salesforce.com/docs/marketing/marketing-cloud/",[214],[51564],{"type":23,"value":51565},"Salesforce Marketing Cloud API Docs",{"type":17,"tag":29,"props":51567,"children":51568},{},[51569],{"type":23,"value":51570},"Salesforce Marketing Cloud provides enterprise-grade marketing automation and customer journey orchestration.",{"type":17,"tag":29,"props":51572,"children":51573},{},[51574],{"type":23,"value":51575},"Its APIs allow developers to:",{"type":17,"tag":80,"props":51577,"children":51578},{},[51579,51584,51589,51594],{"type":17,"tag":84,"props":51580,"children":51581},{},[51582],{"type":23,"value":51583},"manage marketing journeys",{"type":17,"tag":84,"props":51585,"children":51586},{},[51587],{"type":23,"value":51588},"automate customer engagement workflows",{"type":17,"tag":84,"props":51590,"children":51591},{},[51592],{"type":23,"value":51593},"retrieve campaign analytics",{"type":17,"tag":84,"props":51595,"children":51596},{},[51597],{"type":23,"value":51598},"personalize messaging at scale",{"type":17,"tag":29,"props":51600,"children":51601},{},[51602],{"type":23,"value":51603},"Marketing Cloud integrations are common in enterprise marketing platforms.",{"type":17,"tag":239,"props":51605,"children":51607},{"id":51606},"instantlyai-api",[51608],{"type":23,"value":51609},"Instantly.ai API",{"type":17,"tag":29,"props":51611,"children":51612},{},[51613],{"type":17,"tag":133,"props":51614,"children":51617},{"href":51615,"rel":51616},"https://instantly.ai/",[214],[51618],{"type":23,"value":51619},"Instantly Platform",{"type":17,"tag":29,"props":51621,"children":51622},{},[51623],{"type":23,"value":51624},"Instantly.ai focuses on outbound email automation and cold outreach workflows.",{"type":17,"tag":29,"props":51626,"children":51627},{},[51628],{"type":23,"value":51629},"Common capabilities include:",{"type":17,"tag":80,"props":51631,"children":51632},{},[51633,51638,51643,51648],{"type":17,"tag":84,"props":51634,"children":51635},{},[51636],{"type":23,"value":51637},"managing outreach campaigns",{"type":17,"tag":84,"props":51639,"children":51640},{},[51641],{"type":23,"value":51642},"tracking email deliverability",{"type":17,"tag":84,"props":51644,"children":51645},{},[51646],{"type":23,"value":51647},"monitoring reply and engagement rates",{"type":17,"tag":84,"props":51649,"children":51650},{},[51651],{"type":23,"value":51652},"syncing prospect data with other systems",{"type":17,"tag":29,"props":51654,"children":51655},{},[51656],{"type":23,"value":51657},"Instantly integrations are commonly used by sales engagement platforms.",{"type":17,"tag":239,"props":51659,"children":51661},{"id":51660},"sendfox-api",[51662],{"type":23,"value":51663},"SendFox API",{"type":17,"tag":29,"props":51665,"children":51666},{},[51667],{"type":17,"tag":133,"props":51668,"children":51671},{"href":51669,"rel":51670},"https://sendfox.com/",[214],[51672],{"type":23,"value":51673},"SendFox Platform",{"type":17,"tag":29,"props":51675,"children":51676},{},[51677],{"type":23,"value":51678},"SendFox provides simplified email marketing tools for creators and small businesses.",{"type":17,"tag":29,"props":51680,"children":51681},{},[51682],{"type":23,"value":51413},{"type":17,"tag":80,"props":51684,"children":51685},{},[51686,51691,51696],{"type":17,"tag":84,"props":51687,"children":51688},{},[51689],{"type":23,"value":51690},"manage subscriber lists",{"type":17,"tag":84,"props":51692,"children":51693},{},[51694],{"type":23,"value":51695},"automate campaigns",{"type":17,"tag":84,"props":51697,"children":51698},{},[51699],{"type":23,"value":51593},{"type":17,"tag":29,"props":51701,"children":51702},{},[51703],{"type":23,"value":51704},"SendFox integrations are typically used in creator tools and newsletter platforms.",{"type":17,"tag":239,"props":51706,"children":51708},{"id":51707},"sendgrid-api",[51709],{"type":23,"value":51710},"SendGrid API",{"type":17,"tag":29,"props":51712,"children":51713},{},[51714],{"type":17,"tag":133,"props":51715,"children":51718},{"href":51716,"rel":51717},"https://docs.sendgrid.com/api-reference",[214],[51719],{"type":23,"value":51720},"SendGrid API Docs",{"type":17,"tag":29,"props":51722,"children":51723},{},[51724],{"type":23,"value":51725},"SendGrid provides transactional email infrastructure and marketing campaign tools.",{"type":17,"tag":29,"props":51727,"children":51728},{},[51729],{"type":23,"value":51730},"The API supports:",{"type":17,"tag":80,"props":51732,"children":51733},{},[51734,51739,51744,51749],{"type":17,"tag":84,"props":51735,"children":51736},{},[51737],{"type":23,"value":51738},"email delivery and templates",{"type":17,"tag":84,"props":51740,"children":51741},{},[51742],{"type":23,"value":51743},"marketing campaign management",{"type":17,"tag":84,"props":51745,"children":51746},{},[51747],{"type":23,"value":51748},"subscriber lists and segmentation",{"type":17,"tag":84,"props":51750,"children":51751},{},[51752],{"type":23,"value":51753},"email analytics and engagement metrics",{"type":17,"tag":29,"props":51755,"children":51756},{},[51757],{"type":23,"value":51758},"SendGrid is widely used for both transactional and marketing email workflows.",{"type":17,"tag":239,"props":51760,"children":51762},{"id":51761},"yotpo-api",[51763],{"type":23,"value":51764},"Yotpo API",{"type":17,"tag":29,"props":51766,"children":51767},{},[51768],{"type":17,"tag":133,"props":51769,"children":51772},{"href":51770,"rel":51771},"https://developers.yotpo.com/",[214],[51773],{"type":23,"value":51774},"Yotpo Developer Docs",{"type":17,"tag":29,"props":51776,"children":51777},{},[51778],{"type":23,"value":51779},"Yotpo provides marketing tools for e-commerce brands, including reviews, loyalty programs, and email/SMS marketing.",{"type":17,"tag":29,"props":51781,"children":51782},{},[51783],{"type":23,"value":51784},"Its APIs enable integrations for:",{"type":17,"tag":80,"props":51786,"children":51787},{},[51788,51793,51798,51803],{"type":17,"tag":84,"props":51789,"children":51790},{},[51791],{"type":23,"value":51792},"loyalty programs",{"type":17,"tag":84,"props":51794,"children":51795},{},[51796],{"type":23,"value":51797},"customer reviews",{"type":17,"tag":84,"props":51799,"children":51800},{},[51801],{"type":23,"value":51802},"SMS marketing campaigns",{"type":17,"tag":84,"props":51804,"children":51805},{},[51806],{"type":23,"value":51807},"user-generated content",{"type":17,"tag":29,"props":51809,"children":51810},{},[51811],{"type":23,"value":51812},"Yotpo integrations are common in commerce marketing stacks.",{"type":17,"tag":68,"props":51814,"children":51816},{"id":51815},"challenges-when-integrating-marketing-apis",[51817],{"type":23,"value":51818},"Challenges When Integrating Marketing APIs",{"type":17,"tag":29,"props":51820,"children":51821},{},[51822],{"type":23,"value":51823},"Building marketing integrations directly with each provider introduces several challenges.",{"type":17,"tag":239,"props":51825,"children":51826},{"id":1785},[51827],{"type":23,"value":1788},{"type":17,"tag":29,"props":51829,"children":51830},{},[51831,51833,51837],{"type":23,"value":51832},"Some marketing APIs use ",{"type":17,"tag":133,"props":51834,"children":51835},{"href":779},[51836],{"type":23,"value":782},{"type":23,"value":51838},", while others rely on API keys or custom authentication flows.",{"type":17,"tag":239,"props":51840,"children":51842},{"id":51841},"inconsistent-data-models",[51843],{"type":23,"value":51844},"Inconsistent data models",{"type":17,"tag":29,"props":51846,"children":51847},{},[51848],{"type":23,"value":51849},"Subscriber lists, contacts, and campaigns are structured differently across platforms.",{"type":17,"tag":239,"props":51851,"children":51853},{"id":51852},"rate-limits-and-pagination",[51854],{"type":23,"value":51855},"Rate limits and pagination",{"type":17,"tag":29,"props":51857,"children":51858},{},[51859,51861,51865],{"type":23,"value":51860},"Each provider enforces different API limits and ",{"type":17,"tag":133,"props":51862,"children":51863},{"href":1857},[51864],{"type":23,"value":1860},{"type":23,"value":51866}," rules.",{"type":17,"tag":239,"props":51868,"children":51870},{"id":51869},"event-and-webhook-differences",[51871],{"type":23,"value":51872},"Event and webhook differences",{"type":17,"tag":29,"props":51874,"children":51875},{},[51876],{"type":23,"value":51877},"Some platforms offer real-time webhooks while others require polling.",{"type":17,"tag":239,"props":51879,"children":51881},{"id":51880},"data-privacy-requirements",[51882],{"type":23,"value":51883},"Data privacy requirements",{"type":17,"tag":29,"props":51885,"children":51886},{},[51887],{"type":23,"value":51888},"Marketing data often includes personally identifiable information (PII), which introduces compliance requirements under GDPR, CCPA, and other regulations.",{"type":17,"tag":29,"props":51890,"children":51891},{},[51892],{"type":23,"value":51893},"As companies integrate with more marketing platforms, this complexity compounds quickly.",{"type":17,"tag":68,"props":51895,"children":51897},{"id":51896},"the-role-of-unified-marketing-apis",[51898],{"type":23,"value":51899},"The Role of Unified Marketing APIs",{"type":17,"tag":29,"props":51901,"children":51902},{},[51903,51905,51910],{"type":23,"value":51904},"To reduce this complexity, many SaaS companies adopt ",{"type":17,"tag":48,"props":51906,"children":51907},{},[51908],{"type":23,"value":51909},"unified marketing APIs",{"type":23,"value":54},{"type":17,"tag":29,"props":51912,"children":51913},{},[51914],{"type":23,"value":51915},"A unified API standardizes marketing data across multiple platforms so developers can integrate once and support many providers.",{"type":17,"tag":29,"props":51917,"children":51918},{},[51919],{"type":23,"value":51920},"Instead of building separate integrations for Mailchimp, HubSpot, Klaviyo, and others, a unified API provides:",{"type":17,"tag":80,"props":51922,"children":51923},{},[51924,51929,51934,51939,51944],{"type":17,"tag":84,"props":51925,"children":51926},{},[51927],{"type":23,"value":51928},"standardized contact and list models",{"type":17,"tag":84,"props":51930,"children":51931},{},[51932],{"type":23,"value":51933},"consistent campaign structures",{"type":17,"tag":84,"props":51935,"children":51936},{},[51937],{"type":23,"value":51938},"unified authentication flows",{"type":17,"tag":84,"props":51940,"children":51941},{},[51942],{"type":23,"value":51943},"standardized webhooks and event handling",{"type":17,"tag":84,"props":51945,"children":51946},{},[51947],{"type":23,"value":51948},"automatic handling of vendor API changes",{"type":17,"tag":29,"props":51950,"children":51951},{},[51952],{"type":23,"value":51953},"This dramatically reduces the engineering overhead required to maintain marketing integrations.",{"type":17,"tag":68,"props":51955,"children":51957},{"id":51956},"build-once-with-the-unified-marketing-api",[51958],{"type":23,"value":51959},"Build Once with the Unified Marketing API",{"type":17,"tag":29,"props":51961,"children":51962},{},[51963,51964,51969,51971,51976],{"type":23,"value":6712},{"type":17,"tag":48,"props":51965,"children":51966},{},[51967],{"type":23,"value":51968},"Unified Marketing API",{"type":23,"value":51970}," allows developers to integrate with ",{"type":17,"tag":48,"props":51972,"children":51973},{},[51974],{"type":23,"value":51975},"13+ marketing automation platforms",{"type":23,"value":23943},{"type":17,"tag":239,"props":51978,"children":51980},{"id":51979},"unified-marketing-data-objects",[51981],{"type":23,"value":51982},"Unified Marketing Data Objects",{"type":17,"tag":29,"props":51984,"children":51985},{},[51986],{"type":23,"value":51987},"Unified normalizes marketing data across providers using common objects:",{"type":17,"tag":29,"props":51989,"children":51990},{},[51991],{"type":17,"tag":48,"props":51992,"children":51993},{},[51994],{"type":23,"value":51995},"Lists",{"type":17,"tag":29,"props":51997,"children":51998},{},[51999],{"type":23,"value":52000},"Marketing lists or audiences used to manage subscribers.",{"type":17,"tag":29,"props":52002,"children":52003},{},[52004],{"type":17,"tag":48,"props":52005,"children":52006},{},[52007],{"type":23,"value":52008},"Members",{"type":17,"tag":29,"props":52010,"children":52011},{},[52012],{"type":23,"value":52013},"Contacts and list subscribers across marketing platforms.",{"type":17,"tag":29,"props":52015,"children":52016},{},[52017],{"type":17,"tag":48,"props":52018,"children":52019},{},[52020],{"type":23,"value":41708},{"type":17,"tag":29,"props":52022,"children":52023},{},[52024],{"type":23,"value":52025},"Email or marketing campaigns triggered through automation workflows.",{"type":17,"tag":29,"props":52027,"children":52028},{},[52029],{"type":17,"tag":48,"props":52030,"children":52031},{},[52032],{"type":23,"value":41738},{"type":17,"tag":29,"props":52034,"children":52035},{},[52036],{"type":23,"value":52037},"Campaign analytics including opens, clicks, bounces, and engagement metrics.",{"type":17,"tag":29,"props":52039,"children":52040},{},[52041],{"type":23,"value":52042},"Each object supports consistent API operations:",{"type":17,"tag":80,"props":52044,"children":52045},{},[52046,52050,52054,52058,52062],{"type":17,"tag":84,"props":52047,"children":52048},{},[52049],{"type":23,"value":11254},{"type":17,"tag":84,"props":52051,"children":52052},{},[52053],{"type":23,"value":11243},{"type":17,"tag":84,"props":52055,"children":52056},{},[52057],{"type":23,"value":24038},{"type":17,"tag":84,"props":52059,"children":52060},{},[52061],{"type":23,"value":11845},{"type":17,"tag":84,"props":52063,"children":52064},{},[52065],{"type":23,"value":11852},{"type":17,"tag":29,"props":52067,"children":52068},{},[52069],{"type":23,"value":52070},"This allows developers to build marketing features once and support multiple platforms.",{"type":17,"tag":239,"props":52072,"children":52073},{"id":46536},[52074],{"type":23,"value":52075},"Real-Time Data Access",{"type":17,"tag":29,"props":52077,"children":52078},{},[52079,52080,52084],{"type":23,"value":24080},{"type":17,"tag":48,"props":52081,"children":52082},{},[52083],{"type":23,"value":50812},{"type":23,"value":54},{"type":17,"tag":29,"props":52086,"children":52087},{},[52088],{"type":23,"value":52089},"Every API request is routed directly to the source marketing platform, ensuring:",{"type":17,"tag":80,"props":52091,"children":52092},{},[52093,52098,52103,52108],{"type":17,"tag":84,"props":52094,"children":52095},{},[52096],{"type":23,"value":52097},"live lead and campaign data",{"type":17,"tag":84,"props":52099,"children":52100},{},[52101],{"type":23,"value":52102},"no stale records",{"type":17,"tag":84,"props":52104,"children":52105},{},[52106],{"type":23,"value":52107},"real-time engagement metrics",{"type":17,"tag":84,"props":52109,"children":52110},{},[52111],{"type":23,"value":52112},"instant workflow triggers",{"type":17,"tag":29,"props":52114,"children":52115},{},[52116],{"type":23,"value":52117},"This architecture is ideal for marketing dashboards, lifecycle automation, and AI-powered personalization systems.",{"type":17,"tag":239,"props":52119,"children":52120},{"id":50844},[52121],{"type":23,"value":50847},{"type":17,"tag":29,"props":52123,"children":52124},{},[52125],{"type":23,"value":52126},"Unified never stores marketing lead data.",{"type":17,"tag":29,"props":52128,"children":52129},{},[52130],{"type":23,"value":52131},"All requests are processed statelessly and routed directly to the source system.",{"type":17,"tag":29,"props":52133,"children":52134},{},[52135],{"type":23,"value":52136},"This architecture:",{"type":17,"tag":80,"props":52138,"children":52139},{},[52140,52145,52150,52155],{"type":17,"tag":84,"props":52141,"children":52142},{},[52143],{"type":23,"value":52144},"reduces compliance scope",{"type":17,"tag":84,"props":52146,"children":52147},{},[52148],{"type":23,"value":52149},"lowers data-at-rest risk",{"type":17,"tag":84,"props":52151,"children":52152},{},[52153],{"type":23,"value":52154},"simplifies privacy audits",{"type":17,"tag":84,"props":52156,"children":52157},{},[52158],{"type":23,"value":52159},"ensures real-time synchronization",{"type":17,"tag":68,"props":52161,"children":52162},{"id":1552},[52163],{"type":23,"value":44411},{"type":17,"tag":29,"props":52165,"children":52166},{},[52167],{"type":23,"value":52168},"Marketing APIs power many modern SaaS growth workflows—from lead capture and segmentation to lifecycle messaging and campaign analytics.",{"type":17,"tag":29,"props":52170,"children":52171},{},[52172],{"type":23,"value":52173},"But integrating marketing platforms individually quickly becomes difficult to maintain.",{"type":17,"tag":29,"props":52175,"children":52176},{},[52177,52179,52183],{"type":23,"value":52178},"Unified marketing APIs allow developers to integrate once and support ",{"type":17,"tag":48,"props":52180,"children":52181},{},[52182],{"type":23,"value":51975},{"type":23,"value":52184}," through a single integration layer, dramatically simplifying product development.",{"type":17,"tag":29,"props":52186,"children":52187},{},[52188,52193],{"type":17,"tag":133,"props":52189,"children":52191},{"href":52190},"/3206207b83848025a357cc98a9d37af3",[52192],{"type":23,"value":1609},{"type":17,"tag":133,"props":52194,"children":52195},{"href":52190},[52196],{"type":17,"tag":48,"props":52197,"children":52198},{},[52199],{"type":23,"value":1616},{"type":17,"tag":29,"props":52201,"children":52202},{},[52203,52207],{"type":17,"tag":133,"props":52204,"children":52205},{"href":52190},[52206],{"type":23,"value":1609},{"type":17,"tag":133,"props":52208,"children":52209},{"href":52190},[52210],{"type":17,"tag":48,"props":52211,"children":52212},{},[52213],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":52215},[52216,52217,52224,52237,52244,52245,52250],{"id":51039,"depth":1629,"text":51042},{"id":51141,"depth":1629,"text":51144,"children":52218},[52219,52220,52221,52222,52223],{"id":51156,"depth":1635,"text":51159},{"id":51167,"depth":1635,"text":51170},{"id":51178,"depth":1635,"text":51181},{"id":51189,"depth":1635,"text":51192},{"id":51200,"depth":1635,"text":51203},{"id":51216,"depth":1629,"text":51219,"children":52225},[52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236],{"id":51227,"depth":1635,"text":51230},{"id":51284,"depth":1635,"text":51287},{"id":51338,"depth":1635,"text":51341},{"id":51390,"depth":1635,"text":51393},{"id":51444,"depth":1635,"text":51447},{"id":51498,"depth":1635,"text":51501},{"id":51552,"depth":1635,"text":51555},{"id":51606,"depth":1635,"text":51609},{"id":51660,"depth":1635,"text":51663},{"id":51707,"depth":1635,"text":51710},{"id":51761,"depth":1635,"text":51764},{"id":51815,"depth":1629,"text":51818,"children":52238},[52239,52240,52241,52242,52243],{"id":1785,"depth":1635,"text":1788},{"id":51841,"depth":1635,"text":51844},{"id":51852,"depth":1635,"text":51855},{"id":51869,"depth":1635,"text":51872},{"id":51880,"depth":1635,"text":51883},{"id":51896,"depth":1629,"text":51899},{"id":51956,"depth":1629,"text":51959,"children":52246},[52247,52248,52249],{"id":51979,"depth":1635,"text":51982},{"id":46536,"depth":1635,"text":52075},{"id":50844,"depth":1635,"text":50847},{"id":1552,"depth":1629,"text":44411},"content:blog:13_marketing_apis_to_integrate_with_in_2026_mailchimp_hubspot_klaviyo.md","blog/13_marketing_apis_to_integrate_with_in_2026_mailchimp_hubspot_klaviyo.md","blog/13_marketing_apis_to_integrate_with_in_2026_mailchimp_hubspot_klaviyo",{"_path":52255,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":52256,"description":52257,"img":52258,"date":52259,"tag":12,"body":52260,"_type":1677,"_id":53369,"_source":1679,"_file":53370,"_stem":53371,"_extension":1682},"/blog/6_assessment_apis_to_integrate_with_in_2026_greenhouse_workable_ashby","6 Assessment APIs to Integrate With in 2026: Greenhouse, Workable, Ashby","Hiring assessments have become a core part of modern recruiting workflows. From coding tests and skills assessments to behavioral and personality evaluations,...","https://s3.us-east-2.amazonaws.com/unified-article-images/6_assessment_apis_to_integrate_with_in_2026_greenhouse_workable_ashby-icon.png","2026-03-11T16:44:00.000Z",{"type":14,"children":52261,"toc":53330},[52262,52267,52270,52277,52282,52294,52299,52310,52316,52331,52336,52369,52374,52407,52412,52418,52423,52427,52433,52438,52444,52449,52455,52460,52466,52471,52477,52482,52487,52493,52498,52504,52514,52519,52524,52528,52551,52556,52562,52572,52577,52582,52605,52610,52616,52626,52631,52636,52641,52664,52669,52675,52685,52690,52695,52718,52723,52729,52739,52744,52749,52772,52777,52783,52793,52798,52803,52826,52831,52837,52842,52847,52853,52858,52864,52875,52881,52886,52892,52897,52902,52907,52912,52918,52929,52939,52944,52972,52977,52983,52999,53010,53015,53021,53026,53034,53039,53047,53052,53057,53090,53094,53117,53122,53128,53133,53139,53144,53149,53154,53159,53164,53169,53174,53180,53185,53191,53202,53207,53230,53235,53240,53245,53250,53255,53278,53283,53287,53292,53297,53309,53314,53322],{"type":17,"tag":18,"props":52263,"children":52265},{"id":52264},"_6-assessment-apis-to-integrate-with-in-2026-greenhouse-workable-ashby",[52266],{"type":23,"value":52256},{"type":17,"tag":25,"props":52268,"children":52269},{},[],{"type":17,"tag":29,"props":52271,"children":52272},{},[52273],{"type":17,"tag":33,"props":52274,"children":52275},{},[52276],{"type":23,"value":49465},{"type":17,"tag":29,"props":52278,"children":52279},{},[52280],{"type":23,"value":52281},"Hiring assessments have become a core part of modern recruiting workflows. From coding tests and skills assessments to behavioral and personality evaluations, many companies now rely on assessment platforms to evaluate candidates before interviews.",{"type":17,"tag":29,"props":52283,"children":52284},{},[52285,52287,52292],{"type":23,"value":52286},"As a result, ",{"type":17,"tag":48,"props":52288,"children":52289},{},[52290],{"type":23,"value":52291},"assessment APIs",{"type":23,"value":52293}," have become an important part of the recruiting software ecosystem. They allow SaaS platforms to trigger assessments automatically, track results, and synchronize outcomes directly with Applicant Tracking Systems (ATS).",{"type":17,"tag":29,"props":52295,"children":52296},{},[52297],{"type":23,"value":52298},"However, integrating assessment providers directly with every ATS platform introduces complexity. Each ATS exposes different assessment APIs, webhook formats, authentication models, and data schemas.",{"type":17,"tag":29,"props":52300,"children":52301},{},[52302,52303,52308],{"type":23,"value":12584},{"type":17,"tag":48,"props":52304,"children":52305},{},[52306],{"type":23,"value":52307},"6+ assessment APIs developers commonly integrate with",{"type":23,"value":52309},", the challenges of building assessment integrations, and how unified assessment APIs simplify multi-platform recruiting workflows.",{"type":17,"tag":68,"props":52311,"children":52313},{"id":52312},"what-is-an-assessment-api",[52314],{"type":23,"value":52315},"What Is an Assessment API?",{"type":17,"tag":29,"props":52317,"children":52318},{},[52319,52320,52329],{"type":23,"value":40437},{"type":17,"tag":48,"props":52321,"children":52322},{},[52323],{"type":17,"tag":133,"props":52324,"children":52326},{"href":52325},"/assessment",[52327],{"type":23,"value":52328},"assessment API",{"type":23,"value":52330}," allows software applications to deliver candidate assessments and synchronize results with recruiting platforms.",{"type":17,"tag":29,"props":52332,"children":52333},{},[52334],{"type":23,"value":52335},"Assessment APIs typically support operations such as:",{"type":17,"tag":80,"props":52337,"children":52338},{},[52339,52344,52349,52354,52359,52364],{"type":17,"tag":84,"props":52340,"children":52341},{},[52342],{"type":23,"value":52343},"creating assessment packages",{"type":17,"tag":84,"props":52345,"children":52346},{},[52347],{"type":23,"value":52348},"ordering assessments for candidates",{"type":17,"tag":84,"props":52350,"children":52351},{},[52352],{"type":23,"value":52353},"receiving assessment orders from an ATS",{"type":17,"tag":84,"props":52355,"children":52356},{},[52357],{"type":23,"value":52358},"tracking assessment status",{"type":17,"tag":84,"props":52360,"children":52361},{},[52362],{"type":23,"value":52363},"submitting results back to recruiting systems",{"type":17,"tag":84,"props":52365,"children":52366},{},[52367],{"type":23,"value":52368},"retrieving assessment reports",{"type":17,"tag":29,"props":52370,"children":52371},{},[52372],{"type":23,"value":52373},"These APIs power recruiting workflows including:",{"type":17,"tag":80,"props":52375,"children":52376},{},[52377,52382,52387,52392,52397,52402],{"type":17,"tag":84,"props":52378,"children":52379},{},[52380],{"type":23,"value":52381},"technical coding assessments",{"type":17,"tag":84,"props":52383,"children":52384},{},[52385],{"type":23,"value":52386},"aptitude and skills testing",{"type":17,"tag":84,"props":52388,"children":52389},{},[52390],{"type":23,"value":52391},"behavioral or personality assessments",{"type":17,"tag":84,"props":52393,"children":52394},{},[52395],{"type":23,"value":52396},"interview preparation assessments",{"type":17,"tag":84,"props":52398,"children":52399},{},[52400],{"type":23,"value":52401},"background screening integrations",{"type":17,"tag":84,"props":52403,"children":52404},{},[52405],{"type":23,"value":52406},"credential or compliance assessments",{"type":17,"tag":29,"props":52408,"children":52409},{},[52410],{"type":23,"value":52411},"Many ATS platforms now provide built-in assessment APIs so recruiters can request assessments directly within their recruiting workflow.",{"type":17,"tag":68,"props":52413,"children":52415},{"id":52414},"why-saas-products-integrate-assessment-apis",[52416],{"type":23,"value":52417},"Why SaaS Products Integrate Assessment APIs",{"type":17,"tag":29,"props":52419,"children":52420},{},[52421],{"type":23,"value":52422},"Recruiting software increasingly integrates assessments to improve hiring quality and reduce manual screening.",{"type":17,"tag":29,"props":52424,"children":52425},{},[52426],{"type":23,"value":12661},{"type":17,"tag":239,"props":52428,"children":52430},{"id":52429},"candidate-skills-testing",[52431],{"type":23,"value":52432},"Candidate skills testing",{"type":17,"tag":29,"props":52434,"children":52435},{},[52436],{"type":23,"value":52437},"Automatically send coding challenges, technical assessments, or role-specific tests to candidates.",{"type":17,"tag":239,"props":52439,"children":52441},{"id":52440},"behavioral-and-personality-assessments",[52442],{"type":23,"value":52443},"Behavioral and personality assessments",{"type":17,"tag":29,"props":52445,"children":52446},{},[52447],{"type":23,"value":52448},"Evaluate communication style, teamwork traits, or leadership qualities before interviews.",{"type":17,"tag":239,"props":52450,"children":52452},{"id":52451},"interview-preparation-assessments",[52453],{"type":23,"value":52454},"Interview preparation assessments",{"type":17,"tag":29,"props":52456,"children":52457},{},[52458],{"type":23,"value":52459},"Send pre-interview exercises that help candidates demonstrate skills.",{"type":17,"tag":239,"props":52461,"children":52463},{"id":52462},"background-or-compliance-verification",[52464],{"type":23,"value":52465},"Background or compliance verification",{"type":17,"tag":29,"props":52467,"children":52468},{},[52469],{"type":23,"value":52470},"Trigger background or verification assessments during specific hiring stages.",{"type":17,"tag":239,"props":52472,"children":52474},{"id":52473},"automated-hiring-workflows",[52475],{"type":23,"value":52476},"Automated hiring workflows",{"type":17,"tag":29,"props":52478,"children":52479},{},[52480],{"type":23,"value":52481},"Automatically trigger assessments when candidates reach specific stages in an ATS pipeline.",{"type":17,"tag":29,"props":52483,"children":52484},{},[52485],{"type":23,"value":52486},"Because these workflows often live inside ATS systems, assessment integrations must support multiple recruiting platforms.",{"type":17,"tag":68,"props":52488,"children":52490},{"id":52489},"_6-assessment-apis-developers-integrate-with",[52491],{"type":23,"value":52492},"6+ Assessment APIs Developers Integrate With",{"type":17,"tag":29,"props":52494,"children":52495},{},[52496],{"type":23,"value":52497},"Below are some of the most common ATS-connected assessment APIs used by recruiting software.",{"type":17,"tag":239,"props":52499,"children":52501},{"id":52500},"greenhouse-assessment-api",[52502],{"type":23,"value":52503},"Greenhouse Assessment API",{"type":17,"tag":29,"props":52505,"children":52506},{},[52507],{"type":17,"tag":133,"props":52508,"children":52511},{"href":52509,"rel":52510},"https://developers.greenhouse.io/",[214],[52512],{"type":23,"value":52513},"Greenhouse Developer Platform",{"type":17,"tag":29,"props":52515,"children":52516},{},[52517],{"type":23,"value":52518},"Greenhouse is one of the most widely used ATS platforms for technology companies.",{"type":17,"tag":29,"props":52520,"children":52521},{},[52522],{"type":23,"value":52523},"Its assessment integrations allow recruiters to trigger third-party assessments directly from within the Greenhouse hiring pipeline.",{"type":17,"tag":29,"props":52525,"children":52526},{},[52527],{"type":23,"value":12607},{"type":17,"tag":80,"props":52529,"children":52530},{},[52531,52536,52541,52546],{"type":17,"tag":84,"props":52532,"children":52533},{},[52534],{"type":23,"value":52535},"ordering candidate assessments",{"type":17,"tag":84,"props":52537,"children":52538},{},[52539],{"type":23,"value":52540},"attaching results to candidate profiles",{"type":17,"tag":84,"props":52542,"children":52543},{},[52544],{"type":23,"value":52545},"synchronizing status updates",{"type":17,"tag":84,"props":52547,"children":52548},{},[52549],{"type":23,"value":52550},"returning assessment scores to hiring teams",{"type":17,"tag":29,"props":52552,"children":52553},{},[52554],{"type":23,"value":52555},"Greenhouse integrations are common for coding tests, technical screening, and behavioral assessments.",{"type":17,"tag":239,"props":52557,"children":52559},{"id":52558},"workable-assessment-api",[52560],{"type":23,"value":52561},"Workable Assessment API",{"type":17,"tag":29,"props":52563,"children":52564},{},[52565],{"type":17,"tag":133,"props":52566,"children":52569},{"href":52567,"rel":52568},"https://developer.workable.com/",[214],[52570],{"type":23,"value":52571},"Workable Developer API",{"type":17,"tag":29,"props":52573,"children":52574},{},[52575],{"type":23,"value":52576},"Workable provides recruiting software used by thousands of companies worldwide.",{"type":17,"tag":29,"props":52578,"children":52579},{},[52580],{"type":23,"value":52581},"Its assessment integrations allow recruiting teams to:",{"type":17,"tag":80,"props":52583,"children":52584},{},[52585,52590,52595,52600],{"type":17,"tag":84,"props":52586,"children":52587},{},[52588],{"type":23,"value":52589},"trigger assessments automatically during hiring workflows",{"type":17,"tag":84,"props":52591,"children":52592},{},[52593],{"type":23,"value":52594},"send candidate data to assessment providers",{"type":17,"tag":84,"props":52596,"children":52597},{},[52598],{"type":23,"value":52599},"receive results directly inside the ATS",{"type":17,"tag":84,"props":52601,"children":52602},{},[52603],{"type":23,"value":52604},"track candidate progress through evaluation stages",{"type":17,"tag":29,"props":52606,"children":52607},{},[52608],{"type":23,"value":52609},"Workable is frequently integrated with skills testing and interview preparation platforms.",{"type":17,"tag":239,"props":52611,"children":52613},{"id":52612},"ashby-assessment-api",[52614],{"type":23,"value":52615},"Ashby Assessment API",{"type":17,"tag":29,"props":52617,"children":52618},{},[52619],{"type":17,"tag":133,"props":52620,"children":52623},{"href":52621,"rel":52622},"https://developers.ashbyhq.com/",[214],[52624],{"type":23,"value":52625},"Ashby API Documentation",{"type":17,"tag":29,"props":52627,"children":52628},{},[52629],{"type":23,"value":52630},"Ashby is a modern recruiting platform built for scaling companies.",{"type":17,"tag":29,"props":52632,"children":52633},{},[52634],{"type":23,"value":52635},"Its API-first architecture allows assessment providers to integrate tightly into the recruiting workflow.",{"type":17,"tag":29,"props":52637,"children":52638},{},[52639],{"type":23,"value":52640},"Common integration capabilities include:",{"type":17,"tag":80,"props":52642,"children":52643},{},[52644,52649,52654,52659],{"type":17,"tag":84,"props":52645,"children":52646},{},[52647],{"type":23,"value":52648},"assessment ordering",{"type":17,"tag":84,"props":52650,"children":52651},{},[52652],{"type":23,"value":52653},"webhook notifications when recruiters request tests",{"type":17,"tag":84,"props":52655,"children":52656},{},[52657],{"type":23,"value":52658},"candidate data synchronization",{"type":17,"tag":84,"props":52660,"children":52661},{},[52662],{"type":23,"value":52663},"structured scorecard submissions",{"type":17,"tag":29,"props":52665,"children":52666},{},[52667],{"type":23,"value":52668},"Ashby integrations are popular with recruiting automation platforms and developer assessment tools.",{"type":17,"tag":239,"props":52670,"children":52672},{"id":52671},"recruitee-assessment-api",[52673],{"type":23,"value":52674},"Recruitee Assessment API",{"type":17,"tag":29,"props":52676,"children":52677},{},[52678],{"type":17,"tag":133,"props":52679,"children":52682},{"href":52680,"rel":52681},"https://developers.recruitee.com/",[214],[52683],{"type":23,"value":52684},"Recruitee Developer Docs",{"type":17,"tag":29,"props":52686,"children":52687},{},[52688],{"type":23,"value":52689},"Recruitee provides recruiting software used by many growing companies and startups.",{"type":17,"tag":29,"props":52691,"children":52692},{},[52693],{"type":23,"value":52694},"Assessment integrations allow recruiting teams to:",{"type":17,"tag":80,"props":52696,"children":52697},{},[52698,52703,52708,52713],{"type":17,"tag":84,"props":52699,"children":52700},{},[52701],{"type":23,"value":52702},"trigger assessments for candidates",{"type":17,"tag":84,"props":52704,"children":52705},{},[52706],{"type":23,"value":52707},"track completion status",{"type":17,"tag":84,"props":52709,"children":52710},{},[52711],{"type":23,"value":52712},"attach results to candidate profiles",{"type":17,"tag":84,"props":52714,"children":52715},{},[52716],{"type":23,"value":52717},"automate hiring workflows",{"type":17,"tag":29,"props":52719,"children":52720},{},[52721],{"type":23,"value":52722},"Recruitee supports webhook-driven integrations for real-time assessment updates.",{"type":17,"tag":239,"props":52724,"children":52726},{"id":52725},"talentlyft-assessment-api",[52727],{"type":23,"value":52728},"TalentLyft Assessment API",{"type":17,"tag":29,"props":52730,"children":52731},{},[52732],{"type":17,"tag":133,"props":52733,"children":52736},{"href":52734,"rel":52735},"https://www.talentlyft.com/",[214],[52737],{"type":23,"value":52738},"TalentLyft Platform",{"type":17,"tag":29,"props":52740,"children":52741},{},[52742],{"type":23,"value":52743},"TalentLyft is a recruiting platform designed for talent acquisition teams and hiring automation.",{"type":17,"tag":29,"props":52745,"children":52746},{},[52747],{"type":23,"value":52748},"Assessment integrations support workflows such as:",{"type":17,"tag":80,"props":52750,"children":52751},{},[52752,52757,52762,52767],{"type":17,"tag":84,"props":52753,"children":52754},{},[52755],{"type":23,"value":52756},"candidate screening tests",{"type":17,"tag":84,"props":52758,"children":52759},{},[52760],{"type":23,"value":52761},"behavioral assessments",{"type":17,"tag":84,"props":52763,"children":52764},{},[52765],{"type":23,"value":52766},"recruitment marketing evaluations",{"type":17,"tag":84,"props":52768,"children":52769},{},[52770],{"type":23,"value":52771},"pipeline-stage triggered testing",{"type":17,"tag":29,"props":52773,"children":52774},{},[52775],{"type":23,"value":52776},"These integrations help recruiters evaluate candidate capabilities earlier in the hiring process.",{"type":17,"tag":239,"props":52778,"children":52780},{"id":52779},"cornerstone-assessment-api",[52781],{"type":23,"value":52782},"Cornerstone Assessment API",{"type":17,"tag":29,"props":52784,"children":52785},{},[52786],{"type":17,"tag":133,"props":52787,"children":52790},{"href":52788,"rel":52789},"https://www.cornerstoneondemand.com/",[214],[52791],{"type":23,"value":52792},"Cornerstone OnDemand Platform",{"type":17,"tag":29,"props":52794,"children":52795},{},[52796],{"type":23,"value":52797},"Cornerstone provides enterprise talent management and recruiting infrastructure.",{"type":17,"tag":29,"props":52799,"children":52800},{},[52801],{"type":23,"value":52802},"Assessment integrations allow organizations to:",{"type":17,"tag":80,"props":52804,"children":52805},{},[52806,52811,52816,52821],{"type":17,"tag":84,"props":52807,"children":52808},{},[52809],{"type":23,"value":52810},"deliver assessments during hiring processes",{"type":17,"tag":84,"props":52812,"children":52813},{},[52814],{"type":23,"value":52815},"track candidate evaluation results",{"type":17,"tag":84,"props":52817,"children":52818},{},[52819],{"type":23,"value":52820},"integrate training or certification workflows",{"type":17,"tag":84,"props":52822,"children":52823},{},[52824],{"type":23,"value":52825},"analyze candidate performance data",{"type":17,"tag":29,"props":52827,"children":52828},{},[52829],{"type":23,"value":52830},"Cornerstone integrations are often used by large enterprises with complex hiring pipelines.",{"type":17,"tag":68,"props":52832,"children":52834},{"id":52833},"challenges-when-integrating-assessment-apis",[52835],{"type":23,"value":52836},"Challenges When Integrating Assessment APIs",{"type":17,"tag":29,"props":52838,"children":52839},{},[52840],{"type":23,"value":52841},"Assessment integrations are more complex than simple data retrieval APIs because they involve asynchronous workflows.",{"type":17,"tag":29,"props":52843,"children":52844},{},[52845],{"type":23,"value":52846},"Common challenges include:",{"type":17,"tag":239,"props":52848,"children":52850},{"id":52849},"different-ats-assessment-apis",[52851],{"type":23,"value":52852},"Different ATS assessment APIs",{"type":17,"tag":29,"props":52854,"children":52855},{},[52856],{"type":23,"value":52857},"Each ATS platform implements assessment integrations differently.",{"type":17,"tag":239,"props":52859,"children":52861},{"id":52860},"webhook-complexity",[52862],{"type":23,"value":52863},"Webhook complexity",{"type":17,"tag":29,"props":52865,"children":52866},{},[52867,52869,52873],{"type":23,"value":52868},"Assessment requests are typically delivered through ",{"type":17,"tag":133,"props":52870,"children":52871},{"href":4999},[52872],{"type":23,"value":5002},{"type":23,"value":52874}," rather than API polling.",{"type":17,"tag":239,"props":52876,"children":52878},{"id":52877},"inconsistent-order-payloads",[52879],{"type":23,"value":52880},"Inconsistent order payloads",{"type":17,"tag":29,"props":52882,"children":52883},{},[52884],{"type":23,"value":52885},"Candidate information, job references, and assessment parameters vary across platforms.",{"type":17,"tag":239,"props":52887,"children":52889},{"id":52888},"result-submission-differences",[52890],{"type":23,"value":52891},"Result submission differences",{"type":17,"tag":29,"props":52893,"children":52894},{},[52895],{"type":23,"value":52896},"Each ATS expects different formats for submitting assessment results.",{"type":17,"tag":239,"props":52898,"children":52900},{"id":52899},"workflow-orchestration",[52901],{"type":23,"value":44130},{"type":17,"tag":29,"props":52903,"children":52904},{},[52905],{"type":23,"value":52906},"Assessment workflows must synchronize candidate data, status changes, and results across systems.",{"type":17,"tag":29,"props":52908,"children":52909},{},[52910],{"type":23,"value":52911},"Supporting multiple ATS platforms quickly becomes a maintenance challenge.",{"type":17,"tag":68,"props":52913,"children":52915},{"id":52914},"the-role-of-unified-assessment-apis",[52916],{"type":23,"value":52917},"The Role of Unified Assessment APIs",{"type":17,"tag":29,"props":52919,"children":52920},{},[52921,52923,52928],{"type":23,"value":52922},"To simplify assessment integrations, many SaaS platforms adopt ",{"type":17,"tag":48,"props":52924,"children":52925},{},[52926],{"type":23,"value":52927},"unified assessment APIs",{"type":23,"value":54},{"type":17,"tag":29,"props":52930,"children":52931},{},[52932,52933,52937],{"type":23,"value":9619},{"type":17,"tag":133,"props":52934,"children":52935},{"href":7691},[52936],{"type":23,"value":7459},{"type":23,"value":52938}," standardizes the integration layer across multiple ATS systems so developers can integrate once and support multiple recruiting platforms.",{"type":17,"tag":29,"props":52940,"children":52941},{},[52942],{"type":23,"value":52943},"Instead of building separate integrations for Greenhouse, Workable, Ashby, and others, a unified API provides:",{"type":17,"tag":80,"props":52945,"children":52946},{},[52947,52952,52957,52962,52967],{"type":17,"tag":84,"props":52948,"children":52949},{},[52950],{"type":23,"value":52951},"standardized assessment package structures",{"type":17,"tag":84,"props":52953,"children":52954},{},[52955],{"type":23,"value":52956},"consistent webhook events for new orders",{"type":17,"tag":84,"props":52958,"children":52959},{},[52960],{"type":23,"value":52961},"normalized candidate and job data models",{"type":17,"tag":84,"props":52963,"children":52964},{},[52965],{"type":23,"value":52966},"unified result submission endpoints",{"type":17,"tag":84,"props":52968,"children":52969},{},[52970],{"type":23,"value":52971},"simplified authentication flows",{"type":17,"tag":29,"props":52973,"children":52974},{},[52975],{"type":23,"value":52976},"This approach allows assessment providers to support multiple ATS platforms through a single integration.",{"type":17,"tag":68,"props":52978,"children":52980},{"id":52979},"build-once-with-the-unified-assessment-api",[52981],{"type":23,"value":52982},"Build Once with the Unified Assessment API",{"type":17,"tag":29,"props":52984,"children":52985},{},[52986,52987,52992,52993,52998],{"type":23,"value":6712},{"type":17,"tag":48,"props":52988,"children":52989},{},[52990],{"type":23,"value":52991},"Unified Assessment API",{"type":23,"value":51970},{"type":17,"tag":48,"props":52994,"children":52995},{},[52996],{"type":23,"value":52997},"6+ ATS assessment platforms",{"type":23,"value":23943},{"type":17,"tag":29,"props":53000,"children":53001},{},[53002,53004],{"type":23,"value":53003},"You can explore the category here: ",{"type":17,"tag":133,"props":53005,"children":53008},{"href":53006,"rel":53007},"https://unified.to/assessment",[214],[53009],{"type":23,"value":52991},{"type":17,"tag":29,"props":53011,"children":53012},{},[53013],{"type":23,"value":53014},"Unified normalizes assessment workflows across platforms including Ashby, Greenhouse, Workable, Recruitee, TalentLyft, and Cornerstone.",{"type":17,"tag":239,"props":53016,"children":53018},{"id":53017},"unified-assessment-data-objects",[53019],{"type":23,"value":53020},"Unified Assessment Data Objects",{"type":17,"tag":29,"props":53022,"children":53023},{},[53024],{"type":23,"value":53025},"Unified standardizes assessment integrations using two primary objects.",{"type":17,"tag":29,"props":53027,"children":53028},{},[53029],{"type":17,"tag":48,"props":53030,"children":53031},{},[53032],{"type":23,"value":53033},"Assessment Packages",{"type":17,"tag":29,"props":53035,"children":53036},{},[53037],{"type":23,"value":53038},"Define available assessments that recruiters can order from within their ATS.",{"type":17,"tag":29,"props":53040,"children":53041},{},[53042],{"type":17,"tag":48,"props":53043,"children":53044},{},[53045],{"type":23,"value":53046},"Assessment Orders",{"type":17,"tag":29,"props":53048,"children":53049},{},[53050],{"type":23,"value":53051},"Represent assessment requests submitted by recruiters for candidates.",{"type":17,"tag":29,"props":53053,"children":53054},{},[53055],{"type":23,"value":53056},"Orders include:",{"type":17,"tag":80,"props":53058,"children":53059},{},[53060,53065,53070,53075,53080,53085],{"type":17,"tag":84,"props":53061,"children":53062},{},[53063],{"type":23,"value":53064},"candidate details",{"type":17,"tag":84,"props":53066,"children":53067},{},[53068],{"type":23,"value":53069},"job references",{"type":17,"tag":84,"props":53071,"children":53072},{},[53073],{"type":23,"value":53074},"application identifiers",{"type":17,"tag":84,"props":53076,"children":53077},{},[53078],{"type":23,"value":53079},"order status",{"type":17,"tag":84,"props":53081,"children":53082},{},[53083],{"type":23,"value":53084},"scores and completion results",{"type":17,"tag":84,"props":53086,"children":53087},{},[53088],{"type":23,"value":53089},"downloadable assessment reports",{"type":17,"tag":29,"props":53091,"children":53092},{},[53093],{"type":23,"value":52042},{"type":17,"tag":80,"props":53095,"children":53096},{},[53097,53101,53105,53109,53113],{"type":17,"tag":84,"props":53098,"children":53099},{},[53100],{"type":23,"value":11254},{"type":17,"tag":84,"props":53102,"children":53103},{},[53104],{"type":23,"value":11243},{"type":17,"tag":84,"props":53106,"children":53107},{},[53108],{"type":23,"value":24038},{"type":17,"tag":84,"props":53110,"children":53111},{},[53112],{"type":23,"value":11845},{"type":17,"tag":84,"props":53114,"children":53115},{},[53116],{"type":23,"value":11852},{"type":17,"tag":29,"props":53118,"children":53119},{},[53120],{"type":23,"value":53121},"This structure allows developers to build assessment workflows once and support multiple ATS platforms.",{"type":17,"tag":68,"props":53123,"children":53125},{"id":53124},"common-assessment-integration-use-cases",[53126],{"type":23,"value":53127},"Common Assessment Integration Use Cases",{"type":17,"tag":29,"props":53129,"children":53130},{},[53131],{"type":23,"value":53132},"Unified assessment APIs support many recruiting workflows.",{"type":17,"tag":239,"props":53134,"children":53136},{"id":53135},"candidate-skills-testing-platforms",[53137],{"type":23,"value":53138},"Candidate skills testing platforms",{"type":17,"tag":29,"props":53140,"children":53141},{},[53142],{"type":23,"value":53143},"Send coding or technical tests when recruiters request assessments from their ATS.",{"type":17,"tag":239,"props":53145,"children":53147},{"id":53146},"behavioral-and-personality-assessments-1",[53148],{"type":23,"value":52443},{"type":17,"tag":29,"props":53150,"children":53151},{},[53152],{"type":23,"value":53153},"Collect candidate responses and return structured results to hiring teams.",{"type":17,"tag":239,"props":53155,"children":53157},{"id":53156},"background-or-compliance-verification-1",[53158],{"type":23,"value":52465},{"type":17,"tag":29,"props":53160,"children":53161},{},[53162],{"type":23,"value":53163},"Integrate verification workflows into recruiting pipelines.",{"type":17,"tag":239,"props":53165,"children":53167},{"id":53166},"interview-preparation-assessments-1",[53168],{"type":23,"value":52454},{"type":17,"tag":29,"props":53170,"children":53171},{},[53172],{"type":23,"value":53173},"Provide pre-interview exercises that help candidates demonstrate their capabilities.",{"type":17,"tag":239,"props":53175,"children":53177},{"id":53176},"recruiting-analytics",[53178],{"type":23,"value":53179},"Recruiting analytics",{"type":17,"tag":29,"props":53181,"children":53182},{},[53183],{"type":23,"value":53184},"Track candidate performance across assessments and hiring pipelines.",{"type":17,"tag":68,"props":53186,"children":53188},{"id":53187},"real-time-assessment-workflows",[53189],{"type":23,"value":53190},"Real-Time Assessment Workflows",{"type":17,"tag":29,"props":53192,"children":53193},{},[53194,53195,53200],{"type":23,"value":24080},{"type":17,"tag":48,"props":53196,"children":53197},{},[53198],{"type":23,"value":53199},"real-time webhook architecture",{"type":23,"value":53201}," for assessment orders.",{"type":17,"tag":29,"props":53203,"children":53204},{},[53205],{"type":23,"value":53206},"When a recruiter requests an assessment in their ATS:",{"type":17,"tag":6154,"props":53208,"children":53209},{},[53210,53215,53220,53225],{"type":17,"tag":84,"props":53211,"children":53212},{},[53213],{"type":23,"value":53214},"Unified immediately delivers an order webhook.",{"type":17,"tag":84,"props":53216,"children":53217},{},[53218],{"type":23,"value":53219},"The assessment platform sends the test to the candidate.",{"type":17,"tag":84,"props":53221,"children":53222},{},[53223],{"type":23,"value":53224},"Results are submitted back through the Unified API.",{"type":17,"tag":84,"props":53226,"children":53227},{},[53228],{"type":23,"value":53229},"The ATS receives the results instantly.",{"type":17,"tag":29,"props":53231,"children":53232},{},[53233],{"type":23,"value":53234},"This architecture ensures recruiters always see the latest candidate evaluation results.",{"type":17,"tag":68,"props":53236,"children":53237},{"id":17064},[53238],{"type":23,"value":53239},"Zero-Storage Architecture",{"type":17,"tag":29,"props":53241,"children":53242},{},[53243],{"type":23,"value":53244},"Unified never stores assessment data.",{"type":17,"tag":29,"props":53246,"children":53247},{},[53248],{"type":23,"value":53249},"All requests are processed statelessly and routed directly to the source ATS platform.",{"type":17,"tag":29,"props":53251,"children":53252},{},[53253],{"type":23,"value":53254},"This provides several benefits:",{"type":17,"tag":80,"props":53256,"children":53257},{},[53258,53263,53268,53273],{"type":17,"tag":84,"props":53259,"children":53260},{},[53261],{"type":23,"value":53262},"reduced compliance scope",{"type":17,"tag":84,"props":53264,"children":53265},{},[53266],{"type":23,"value":53267},"lower risk for candidate data exposure",{"type":17,"tag":84,"props":53269,"children":53270},{},[53271],{"type":23,"value":53272},"simplified privacy and audit requirements",{"type":17,"tag":84,"props":53274,"children":53275},{},[53276],{"type":23,"value":53277},"real-time synchronization of results",{"type":17,"tag":29,"props":53279,"children":53280},{},[53281],{"type":23,"value":53282},"For recruiting workflows involving sensitive candidate information, minimizing stored data significantly improves security.",{"type":17,"tag":68,"props":53284,"children":53285},{"id":1552},[53286],{"type":23,"value":44411},{"type":17,"tag":29,"props":53288,"children":53289},{},[53290],{"type":23,"value":53291},"Assessment APIs are becoming a critical component of modern recruiting infrastructure.",{"type":17,"tag":29,"props":53293,"children":53294},{},[53295],{"type":23,"value":53296},"But supporting multiple ATS platforms individually can quickly become difficult to maintain.",{"type":17,"tag":29,"props":53298,"children":53299},{},[53300,53302,53307],{"type":23,"value":53301},"Unified assessment APIs allow developers to integrate once and support ",{"type":17,"tag":48,"props":53303,"children":53304},{},[53305],{"type":23,"value":53306},"multiple ATS assessment platforms",{"type":23,"value":53308}," through a single integration layer.",{"type":17,"tag":29,"props":53310,"children":53311},{},[53312],{"type":23,"value":53313},"For assessment providers, recruiting software vendors, and hiring automation tools, this architecture dramatically simplifies building scalable assessment integrations.",{"type":17,"tag":29,"props":53315,"children":53316},{},[53317],{"type":17,"tag":133,"props":53318,"children":53320},{"href":1612,"rel":53319},[214],[53321],{"type":23,"value":44481},{"type":17,"tag":29,"props":53323,"children":53324},{},[53325],{"type":17,"tag":133,"props":53326,"children":53328},{"href":1623,"rel":53327},[214],[53329],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":53331},[53332,53333,53340,53348,53355,53356,53359,53366,53367,53368],{"id":52312,"depth":1629,"text":52315},{"id":52414,"depth":1629,"text":52417,"children":53334},[53335,53336,53337,53338,53339],{"id":52429,"depth":1635,"text":52432},{"id":52440,"depth":1635,"text":52443},{"id":52451,"depth":1635,"text":52454},{"id":52462,"depth":1635,"text":52465},{"id":52473,"depth":1635,"text":52476},{"id":52489,"depth":1629,"text":52492,"children":53341},[53342,53343,53344,53345,53346,53347],{"id":52500,"depth":1635,"text":52503},{"id":52558,"depth":1635,"text":52561},{"id":52612,"depth":1635,"text":52615},{"id":52671,"depth":1635,"text":52674},{"id":52725,"depth":1635,"text":52728},{"id":52779,"depth":1635,"text":52782},{"id":52833,"depth":1629,"text":52836,"children":53349},[53350,53351,53352,53353,53354],{"id":52849,"depth":1635,"text":52852},{"id":52860,"depth":1635,"text":52863},{"id":52877,"depth":1635,"text":52880},{"id":52888,"depth":1635,"text":52891},{"id":52899,"depth":1635,"text":44130},{"id":52914,"depth":1629,"text":52917},{"id":52979,"depth":1629,"text":52982,"children":53357},[53358],{"id":53017,"depth":1635,"text":53020},{"id":53124,"depth":1629,"text":53127,"children":53360},[53361,53362,53363,53364,53365],{"id":53135,"depth":1635,"text":53138},{"id":53146,"depth":1635,"text":52443},{"id":53156,"depth":1635,"text":52465},{"id":53166,"depth":1635,"text":52454},{"id":53176,"depth":1635,"text":53179},{"id":53187,"depth":1629,"text":53190},{"id":17064,"depth":1629,"text":53239},{"id":1552,"depth":1629,"text":44411},"content:blog:6_assessment_apis_to_integrate_with_in_2026_greenhouse_workable_ashby.md","blog/6_assessment_apis_to_integrate_with_in_2026_greenhouse_workable_ashby.md","blog/6_assessment_apis_to_integrate_with_in_2026_greenhouse_workable_ashby",{"_path":53373,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":53374,"description":53375,"img":53376,"date":53377,"tag":12,"body":53378,"_type":1677,"_id":54352,"_source":1679,"_file":54353,"_stem":54354,"_extension":1682},"/blog/5_verification_apis_to_integrate_with_in_2026_checkr_first_advantage_certn","5 Verification APIs to Integrate With in 2026: Checkr, First Advantage, Certn","Background verification has become a critical step in many digital workflows. Whether you're building hiring software, contractor marketplaces, fintech...","https://s3.us-east-2.amazonaws.com/unified-article-images/5_verification_apis_to_integrate_with_in_2026_checkr_first_advantage_certn-icon.png","2026-03-11T16:23:00.000Z",{"type":14,"children":53379,"toc":54314},[53380,53385,53388,53395,53400,53412,53417,53428,53434,53449,53454,53487,53492,53525,53530,53536,53541,53545,53551,53556,53562,53567,53573,53578,53584,53589,53595,53600,53605,53611,53616,53622,53627,53638,53666,53671,53677,53687,53692,53718,53723,53729,53739,53743,53763,53768,53774,53784,53789,53812,53817,53823,53833,53838,53858,53863,53869,53874,53880,53885,53891,53896,53902,53907,53913,53918,53924,53929,53934,53940,53951,53956,53967,53995,54000,54006,54023,54032,54037,54043,54048,54056,54061,54069,54074,54079,54102,54107,54113,54118,54124,54129,54135,54140,54146,54151,54157,54162,54168,54173,54179,54189,54193,54216,54221,54226,54231,54236,54241,54263,54268,54272,54277,54282,54293,54298,54306],{"type":17,"tag":18,"props":53381,"children":53383},{"id":53382},"_5-verification-apis-to-integrate-with-in-2026-checkr-first-advantage-certn",[53384],{"type":23,"value":53374},{"type":17,"tag":25,"props":53386,"children":53387},{},[],{"type":17,"tag":29,"props":53389,"children":53390},{},[53391],{"type":17,"tag":33,"props":53392,"children":53393},{},[53394],{"type":23,"value":49465},{"type":17,"tag":29,"props":53396,"children":53397},{},[53398],{"type":23,"value":53399},"Background verification has become a critical step in many digital workflows. Whether you're building hiring software, contractor marketplaces, fintech onboarding flows, or compliance platforms, identity and background verification is often required before a user can access services or begin work.",{"type":17,"tag":29,"props":53401,"children":53402},{},[53403,53405,53410],{"type":23,"value":53404},"Modern SaaS platforms increasingly rely on ",{"type":17,"tag":48,"props":53406,"children":53407},{},[53408],{"type":23,"value":53409},"verification APIs",{"type":23,"value":53411}," to automate these processes. Instead of manually coordinating background checks, identity verification, or credential validation, developers can trigger verification workflows programmatically and track their status in real time.",{"type":17,"tag":29,"props":53413,"children":53414},{},[53415],{"type":23,"value":53416},"However, integrating verification providers directly can introduce complexity. Each provider exposes different APIs, authentication methods, request schemas, and result formats.",{"type":17,"tag":29,"props":53418,"children":53419},{},[53420,53421,53426],{"type":23,"value":12584},{"type":17,"tag":48,"props":53422,"children":53423},{},[53424],{"type":23,"value":53425},"5+ verification APIs developers commonly integrate with",{"type":23,"value":53427},", the challenges of building verification integrations directly, and how unified verification APIs simplify multi-provider integrations.",{"type":17,"tag":68,"props":53429,"children":53431},{"id":53430},"what-is-a-verification-api",[53432],{"type":23,"value":53433},"What Is a Verification API?",{"type":17,"tag":29,"props":53435,"children":53436},{},[53437,53438,53447],{"type":23,"value":9619},{"type":17,"tag":48,"props":53439,"children":53440},{},[53441],{"type":17,"tag":133,"props":53442,"children":53444},{"href":53443},"/verification",[53445],{"type":23,"value":53446},"verification API",{"type":23,"value":53448}," allows software applications to request and retrieve identity, employment, or background verification data from third-party screening providers.",{"type":17,"tag":29,"props":53450,"children":53451},{},[53452],{"type":23,"value":53453},"These APIs typically support operations such as:",{"type":17,"tag":80,"props":53455,"children":53456},{},[53457,53462,53467,53472,53477,53482],{"type":17,"tag":84,"props":53458,"children":53459},{},[53460],{"type":23,"value":53461},"requesting background checks",{"type":17,"tag":84,"props":53463,"children":53464},{},[53465],{"type":23,"value":53466},"verifying identity documents",{"type":17,"tag":84,"props":53468,"children":53469},{},[53470],{"type":23,"value":53471},"employment and credential verification",{"type":17,"tag":84,"props":53473,"children":53474},{},[53475],{"type":23,"value":53476},"monitoring verification status",{"type":17,"tag":84,"props":53478,"children":53479},{},[53480],{"type":23,"value":53481},"retrieving verification results",{"type":17,"tag":84,"props":53483,"children":53484},{},[53485],{"type":23,"value":53486},"downloading verification reports",{"type":17,"tag":29,"props":53488,"children":53489},{},[53490],{"type":23,"value":53491},"Verification APIs power workflows in:",{"type":17,"tag":80,"props":53493,"children":53494},{},[53495,53500,53505,53510,53515,53520],{"type":17,"tag":84,"props":53496,"children":53497},{},[53498],{"type":23,"value":53499},"recruiting platforms",{"type":17,"tag":84,"props":53501,"children":53502},{},[53503],{"type":23,"value":53504},"contractor marketplaces",{"type":17,"tag":84,"props":53506,"children":53507},{},[53508],{"type":23,"value":53509},"financial onboarding",{"type":17,"tag":84,"props":53511,"children":53512},{},[53513],{"type":23,"value":53514},"compliance tools",{"type":17,"tag":84,"props":53516,"children":53517},{},[53518],{"type":23,"value":53519},"workforce management platforms",{"type":17,"tag":84,"props":53521,"children":53522},{},[53523],{"type":23,"value":53524},"identity verification systems",{"type":17,"tag":29,"props":53526,"children":53527},{},[53528],{"type":23,"value":53529},"Because verification providers often act as trusted third parties that validate identity or background data, these integrations are commonly used in regulated industries.",{"type":17,"tag":68,"props":53531,"children":53533},{"id":53532},"why-saas-products-integrate-verification-apis",[53534],{"type":23,"value":53535},"Why SaaS Products Integrate Verification APIs",{"type":17,"tag":29,"props":53537,"children":53538},{},[53539],{"type":23,"value":53540},"Many SaaS products depend on verification data to enable secure and compliant operations.",{"type":17,"tag":29,"props":53542,"children":53543},{},[53544],{"type":23,"value":12661},{"type":17,"tag":239,"props":53546,"children":53548},{"id":53547},"applicant-background-screening",[53549],{"type":23,"value":53550},"Applicant background screening",{"type":17,"tag":29,"props":53552,"children":53553},{},[53554],{"type":23,"value":53555},"Recruiting platforms can automatically initiate background checks for candidates during the hiring process.",{"type":17,"tag":239,"props":53557,"children":53559},{"id":53558},"employee-onboarding-automation",[53560],{"type":23,"value":53561},"Employee onboarding automation",{"type":17,"tag":29,"props":53563,"children":53564},{},[53565],{"type":23,"value":53566},"Trigger identity or employment verification after a candidate accepts an offer.",{"type":17,"tag":239,"props":53568,"children":53570},{"id":53569},"contractor-marketplace-verification",[53571],{"type":23,"value":53572},"Contractor marketplace verification",{"type":17,"tag":29,"props":53574,"children":53575},{},[53576],{"type":23,"value":53577},"Marketplaces for gig workers or contractors often verify identity, background history, or credentials before allowing users onto the platform.",{"type":17,"tag":239,"props":53579,"children":53581},{"id":53580},"compliance-and-risk-management",[53582],{"type":23,"value":53583},"Compliance and risk management",{"type":17,"tag":29,"props":53585,"children":53586},{},[53587],{"type":23,"value":53588},"Financial services, healthcare platforms, and enterprise onboarding tools use verification services to meet regulatory requirements.",{"type":17,"tag":239,"props":53590,"children":53592},{"id":53591},"identity-verification-for-digital-services",[53593],{"type":23,"value":53594},"Identity verification for digital services",{"type":17,"tag":29,"props":53596,"children":53597},{},[53598],{"type":23,"value":53599},"Fintech, SaaS platforms, and digital marketplaces often verify user identities before allowing access to sensitive features.",{"type":17,"tag":29,"props":53601,"children":53602},{},[53603],{"type":23,"value":53604},"Because many organizations need flexibility in choosing their verification provider, supporting multiple APIs becomes important.",{"type":17,"tag":68,"props":53606,"children":53608},{"id":53607},"_5-verification-apis-developers-integrate-with",[53609],{"type":23,"value":53610},"5+ Verification APIs Developers Integrate With",{"type":17,"tag":29,"props":53612,"children":53613},{},[53614],{"type":23,"value":53615},"Below are some of the most commonly integrated verification APIs used by SaaS products today.",{"type":17,"tag":239,"props":53617,"children":53619},{"id":53618},"checkr-api",[53620],{"type":23,"value":53621},"Checkr API",{"type":17,"tag":29,"props":53623,"children":53624},{},[53625],{"type":23,"value":53626},"Checkr is one of the most widely used background screening providers for modern SaaS and marketplace platforms.",{"type":17,"tag":29,"props":53628,"children":53629},{},[53630,53631,53636],{"type":23,"value":6712},{"type":17,"tag":133,"props":53632,"children":53634},{"href":53633},"/3206207b8384800bb44fedca69277f31",[53635],{"type":23,"value":53621},{"type":23,"value":53637}," supports:",{"type":17,"tag":80,"props":53639,"children":53640},{},[53641,53646,53651,53656,53661],{"type":17,"tag":84,"props":53642,"children":53643},{},[53644],{"type":23,"value":53645},"criminal background checks",{"type":17,"tag":84,"props":53647,"children":53648},{},[53649],{"type":23,"value":53650},"identity verification",{"type":17,"tag":84,"props":53652,"children":53653},{},[53654],{"type":23,"value":53655},"employment verification",{"type":17,"tag":84,"props":53657,"children":53658},{},[53659],{"type":23,"value":53660},"driving record checks",{"type":17,"tag":84,"props":53662,"children":53663},{},[53664],{"type":23,"value":53665},"candidate screening workflows",{"type":17,"tag":29,"props":53667,"children":53668},{},[53669],{"type":23,"value":53670},"Checkr is commonly integrated into recruiting platforms, contractor marketplaces, and HR systems.",{"type":17,"tag":239,"props":53672,"children":53674},{"id":53673},"first-advantage-api",[53675],{"type":23,"value":53676},"First Advantage API",{"type":17,"tag":29,"props":53678,"children":53679},{},[53680,53685],{"type":17,"tag":133,"props":53681,"children":53682},{"href":53633},[53683],{"type":23,"value":53684},"First Advantage",{"type":23,"value":53686}," is an enterprise background screening provider used by large organizations.",{"type":17,"tag":29,"props":53688,"children":53689},{},[53690],{"type":23,"value":53691},"Typical integrations support:",{"type":17,"tag":80,"props":53693,"children":53694},{},[53695,53699,53704,53709,53713],{"type":17,"tag":84,"props":53696,"children":53697},{},[53698],{"type":23,"value":53645},{"type":17,"tag":84,"props":53700,"children":53701},{},[53702],{"type":23,"value":53703},"employment history verification",{"type":17,"tag":84,"props":53705,"children":53706},{},[53707],{"type":23,"value":53708},"drug screening",{"type":17,"tag":84,"props":53710,"children":53711},{},[53712],{"type":23,"value":53650},{"type":17,"tag":84,"props":53714,"children":53715},{},[53716],{"type":23,"value":53717},"compliance reporting",{"type":17,"tag":29,"props":53719,"children":53720},{},[53721],{"type":23,"value":53722},"First Advantage is frequently used by large enterprises and global hiring platforms.",{"type":17,"tag":239,"props":53724,"children":53726},{"id":53725},"certn-api",[53727],{"type":23,"value":53728},"Certn API",{"type":17,"tag":29,"props":53730,"children":53731},{},[53732,53737],{"type":17,"tag":133,"props":53733,"children":53734},{"href":53633},[53735],{"type":23,"value":53736},"Certn",{"type":23,"value":53738}," provides automated background screening services with a focus on fast digital verification.",{"type":17,"tag":29,"props":53740,"children":53741},{},[53742],{"type":23,"value":12661},{"type":17,"tag":80,"props":53744,"children":53745},{},[53746,53750,53754,53759],{"type":17,"tag":84,"props":53747,"children":53748},{},[53749],{"type":23,"value":53645},{"type":17,"tag":84,"props":53751,"children":53752},{},[53753],{"type":23,"value":53650},{"type":17,"tag":84,"props":53755,"children":53756},{},[53757],{"type":23,"value":53758},"global screening",{"type":17,"tag":84,"props":53760,"children":53761},{},[53762],{"type":23,"value":53655},{"type":17,"tag":29,"props":53764,"children":53765},{},[53766],{"type":23,"value":53767},"Certn is widely used by HR platforms and hiring software that require fast screening workflows.",{"type":17,"tag":239,"props":53769,"children":53771},{"id":53770},"verifiable-api",[53772],{"type":23,"value":53773},"Verifiable API",{"type":17,"tag":29,"props":53775,"children":53776},{},[53777,53782],{"type":17,"tag":133,"props":53778,"children":53779},{"href":53633},[53780],{"type":23,"value":53781},"Verifiable",{"type":23,"value":53783}," focuses on credential verification, particularly in regulated industries such as healthcare.",{"type":17,"tag":29,"props":53785,"children":53786},{},[53787],{"type":23,"value":53788},"Its APIs allow developers to verify:",{"type":17,"tag":80,"props":53790,"children":53791},{},[53792,53797,53802,53807],{"type":17,"tag":84,"props":53793,"children":53794},{},[53795],{"type":23,"value":53796},"professional licenses",{"type":17,"tag":84,"props":53798,"children":53799},{},[53800],{"type":23,"value":53801},"certifications",{"type":17,"tag":84,"props":53803,"children":53804},{},[53805],{"type":23,"value":53806},"employment history",{"type":17,"tag":84,"props":53808,"children":53809},{},[53810],{"type":23,"value":53811},"regulatory credentials",{"type":17,"tag":29,"props":53813,"children":53814},{},[53815],{"type":23,"value":53816},"Healthcare staffing platforms and credential verification tools often integrate Verifiable.",{"type":17,"tag":239,"props":53818,"children":53820},{"id":53819},"yardstik-api",[53821],{"type":23,"value":53822},"Yardstik API",{"type":17,"tag":29,"props":53824,"children":53825},{},[53826,53831],{"type":17,"tag":133,"props":53827,"children":53828},{"href":53633},[53829],{"type":23,"value":53830},"Yardstik",{"type":23,"value":53832}," provides background screening infrastructure designed for developer-first platforms.",{"type":17,"tag":29,"props":53834,"children":53835},{},[53836],{"type":23,"value":53837},"Typical integrations include:",{"type":17,"tag":80,"props":53839,"children":53840},{},[53841,53845,53849,53853],{"type":17,"tag":84,"props":53842,"children":53843},{},[53844],{"type":23,"value":53645},{"type":17,"tag":84,"props":53846,"children":53847},{},[53848],{"type":23,"value":53650},{"type":17,"tag":84,"props":53850,"children":53851},{},[53852],{"type":23,"value":53655},{"type":17,"tag":84,"props":53854,"children":53855},{},[53856],{"type":23,"value":53857},"workforce compliance checks",{"type":17,"tag":29,"props":53859,"children":53860},{},[53861],{"type":23,"value":53862},"Yardstik is often used by gig economy platforms, contractor marketplaces, and hiring products.",{"type":17,"tag":68,"props":53864,"children":53866},{"id":53865},"challenges-when-integrating-verification-apis",[53867],{"type":23,"value":53868},"Challenges When Integrating Verification APIs",{"type":17,"tag":29,"props":53870,"children":53871},{},[53872],{"type":23,"value":53873},"Verification integrations introduce unique challenges compared to other SaaS APIs.",{"type":17,"tag":239,"props":53875,"children":53877},{"id":53876},"different-verification-packages",[53878],{"type":23,"value":53879},"Different verification packages",{"type":17,"tag":29,"props":53881,"children":53882},{},[53883],{"type":23,"value":53884},"Each provider structures screening packages differently, which makes it difficult to normalize workflows across providers.",{"type":17,"tag":239,"props":53886,"children":53888},{"id":53887},"inconsistent-request-schemas",[53889],{"type":23,"value":53890},"Inconsistent request schemas",{"type":17,"tag":29,"props":53892,"children":53893},{},[53894],{"type":23,"value":53895},"Verification APIs require complex payloads containing identity information, addresses, and documents.",{"type":17,"tag":239,"props":53897,"children":53899},{"id":53898},"status-tracking-complexity",[53900],{"type":23,"value":53901},"Status tracking complexity",{"type":17,"tag":29,"props":53903,"children":53904},{},[53905],{"type":23,"value":53906},"Verification requests often run asynchronously and require polling or webhook handling to track completion.",{"type":17,"tag":239,"props":53908,"children":53910},{"id":53909},"provider-specific-compliance-rules",[53911],{"type":23,"value":53912},"Provider-specific compliance rules",{"type":17,"tag":29,"props":53914,"children":53915},{},[53916],{"type":23,"value":53917},"Background screening often involves region-specific compliance rules that vary across providers.",{"type":17,"tag":239,"props":53919,"children":53921},{"id":53920},"sensitive-data-handling",[53922],{"type":23,"value":53923},"Sensitive data handling",{"type":17,"tag":29,"props":53925,"children":53926},{},[53927],{"type":23,"value":53928},"Verification requests frequently include sensitive personal information such as addresses, identification numbers, or birth dates.",{"type":17,"tag":29,"props":53930,"children":53931},{},[53932],{"type":23,"value":53933},"Because of these factors, supporting multiple verification providers can quickly become difficult to maintain.",{"type":17,"tag":68,"props":53935,"children":53937},{"id":53936},"the-role-of-unified-verification-apis",[53938],{"type":23,"value":53939},"The Role of Unified Verification APIs",{"type":17,"tag":29,"props":53941,"children":53942},{},[53943,53945,53950],{"type":23,"value":53944},"To reduce this complexity, many SaaS platforms adopt ",{"type":17,"tag":48,"props":53946,"children":53947},{},[53948],{"type":23,"value":53949},"unified verification APIs",{"type":23,"value":54},{"type":17,"tag":29,"props":53952,"children":53953},{},[53954],{"type":23,"value":53955},"A unified verification API standardizes the core objects and workflows across providers so developers can integrate once and support multiple screening services.",{"type":17,"tag":29,"props":53957,"children":53958},{},[53959,53961,53965],{"type":23,"value":53960},"Instead of building custom integrations for Checkr, First Advantage, Certn, and others, a ",{"type":17,"tag":133,"props":53962,"children":53963},{"href":7691},[53964],{"type":23,"value":7459},{"type":23,"value":53966}," provides:",{"type":17,"tag":80,"props":53968,"children":53969},{},[53970,53975,53980,53985,53990],{"type":17,"tag":84,"props":53971,"children":53972},{},[53973],{"type":23,"value":53974},"standardized verification request schemas",{"type":17,"tag":84,"props":53976,"children":53977},{},[53978],{"type":23,"value":53979},"consistent authentication flows",{"type":17,"tag":84,"props":53981,"children":53982},{},[53983],{"type":23,"value":53984},"unified request status tracking",{"type":17,"tag":84,"props":53986,"children":53987},{},[53988],{"type":23,"value":53989},"normalized verification result structures",{"type":17,"tag":84,"props":53991,"children":53992},{},[53993],{"type":23,"value":53994},"simplified webhook and event handling",{"type":17,"tag":29,"props":53996,"children":53997},{},[53998],{"type":23,"value":53999},"This approach allows platforms to support multiple verification vendors without maintaining separate integrations for each one.",{"type":17,"tag":68,"props":54001,"children":54003},{"id":54002},"build-once-with-the-unified-verification-api",[54004],{"type":23,"value":54005},"Build Once with the Unified Verification API",{"type":17,"tag":29,"props":54007,"children":54008},{},[54009,54010,54015,54017,54022],{"type":23,"value":6712},{"type":17,"tag":48,"props":54011,"children":54012},{},[54013],{"type":23,"value":54014},"Unified Verification API",{"type":23,"value":54016}," allows developers to access verification services across ",{"type":17,"tag":48,"props":54018,"children":54019},{},[54020],{"type":23,"value":54021},"5+ providers",{"type":23,"value":23943},{"type":17,"tag":29,"props":54024,"children":54025},{},[54026,54027],{"type":23,"value":53003},{"type":17,"tag":133,"props":54028,"children":54029},{"href":53633},[54030],{"type":23,"value":54031},"Verification API",{"type":17,"tag":29,"props":54033,"children":54034},{},[54035],{"type":23,"value":54036},"Unified normalizes verification workflows across providers like Checkr, Certn, First Advantage, Verifiable, and Yardstik.",{"type":17,"tag":239,"props":54038,"children":54040},{"id":54039},"unified-verification-data-objects",[54041],{"type":23,"value":54042},"Unified Verification Data Objects",{"type":17,"tag":29,"props":54044,"children":54045},{},[54046],{"type":23,"value":54047},"Unified standardizes verification workflows using two primary objects.",{"type":17,"tag":29,"props":54049,"children":54050},{},[54051],{"type":17,"tag":48,"props":54052,"children":54053},{},[54054],{"type":23,"value":54055},"Packages",{"type":17,"tag":29,"props":54057,"children":54058},{},[54059],{"type":23,"value":54060},"Verification packages define the type of checks available, such as background checks, identity verification, or credential verification.",{"type":17,"tag":29,"props":54062,"children":54063},{},[54064],{"type":17,"tag":48,"props":54065,"children":54066},{},[54067],{"type":23,"value":54068},"Requests",{"type":17,"tag":29,"props":54070,"children":54071},{},[54072],{"type":23,"value":54073},"Requests represent the actual verification jobs submitted for a candidate or individual. These include parameters, status updates, completion timestamps, scores, and downloadable reports.",{"type":17,"tag":29,"props":54075,"children":54076},{},[54077],{"type":23,"value":54078},"Each object supports consistent API methods:",{"type":17,"tag":80,"props":54080,"children":54081},{},[54082,54086,54090,54094,54098],{"type":17,"tag":84,"props":54083,"children":54084},{},[54085],{"type":23,"value":11254},{"type":17,"tag":84,"props":54087,"children":54088},{},[54089],{"type":23,"value":11243},{"type":17,"tag":84,"props":54091,"children":54092},{},[54093],{"type":23,"value":24038},{"type":17,"tag":84,"props":54095,"children":54096},{},[54097],{"type":23,"value":11845},{"type":17,"tag":84,"props":54099,"children":54100},{},[54101],{"type":23,"value":11852},{"type":17,"tag":29,"props":54103,"children":54104},{},[54105],{"type":23,"value":54106},"This standardization allows developers to trigger verification workflows across multiple providers using the same integration logic.",{"type":17,"tag":68,"props":54108,"children":54110},{"id":54109},"common-verification-integration-use-cases",[54111],{"type":23,"value":54112},"Common Verification Integration Use Cases",{"type":17,"tag":29,"props":54114,"children":54115},{},[54116],{"type":23,"value":54117},"Unified verification APIs enable many SaaS workflows.",{"type":17,"tag":239,"props":54119,"children":54121},{"id":54120},"hiring-and-recruiting-platforms",[54122],{"type":23,"value":54123},"Hiring and recruiting platforms",{"type":17,"tag":29,"props":54125,"children":54126},{},[54127],{"type":23,"value":54128},"Automatically trigger background checks during the hiring process.",{"type":17,"tag":239,"props":54130,"children":54132},{"id":54131},"contractor-marketplaces",[54133],{"type":23,"value":54134},"Contractor marketplaces",{"type":17,"tag":29,"props":54136,"children":54137},{},[54138],{"type":23,"value":54139},"Verify identity and background information before allowing contractors onto a platform.",{"type":17,"tag":239,"props":54141,"children":54143},{"id":54142},"compliance-and-risk-tools",[54144],{"type":23,"value":54145},"Compliance and risk tools",{"type":17,"tag":29,"props":54147,"children":54148},{},[54149],{"type":23,"value":54150},"Track verification completion status and ensure regulatory requirements are met.",{"type":17,"tag":239,"props":54152,"children":54154},{"id":54153},"identity-verification-platforms",[54155],{"type":23,"value":54156},"Identity verification platforms",{"type":17,"tag":29,"props":54158,"children":54159},{},[54160],{"type":23,"value":54161},"Automate identity validation across multiple verification providers.",{"type":17,"tag":239,"props":54163,"children":54165},{"id":54164},"vendor-flexibility",[54166],{"type":23,"value":54167},"Vendor flexibility",{"type":17,"tag":29,"props":54169,"children":54170},{},[54171],{"type":23,"value":54172},"Allow customers to choose their preferred verification provider while maintaining a single integration architecture.",{"type":17,"tag":68,"props":54174,"children":54176},{"id":54175},"real-time-verification-data-access",[54177],{"type":23,"value":54178},"Real-Time Verification Data Access",{"type":17,"tag":29,"props":54180,"children":54181},{},[54182,54183,54187],{"type":23,"value":24080},{"type":17,"tag":48,"props":54184,"children":54185},{},[54186],{"type":23,"value":50812},{"type":23,"value":54188},", meaning every verification request is executed directly against the provider API.",{"type":17,"tag":29,"props":54190,"children":54191},{},[54192],{"type":23,"value":7403},{"type":17,"tag":80,"props":54194,"children":54195},{},[54196,54201,54206,54211],{"type":17,"tag":84,"props":54197,"children":54198},{},[54199],{"type":23,"value":54200},"no cached verification data",{"type":17,"tag":84,"props":54202,"children":54203},{},[54204],{"type":23,"value":54205},"real-time status updates",{"type":17,"tag":84,"props":54207,"children":54208},{},[54209],{"type":23,"value":54210},"direct access to provider responses",{"type":17,"tag":84,"props":54212,"children":54213},{},[54214],{"type":23,"value":54215},"no delayed synchronization jobs",{"type":17,"tag":29,"props":54217,"children":54218},{},[54219],{"type":23,"value":54220},"This architecture is especially important for sensitive identity and verification workflows.",{"type":17,"tag":68,"props":54222,"children":54223},{"id":13413},[54224],{"type":23,"value":54225},"Zero-Storage by Design",{"type":17,"tag":29,"props":54227,"children":54228},{},[54229],{"type":23,"value":54230},"Unified never stores customer verification data.",{"type":17,"tag":29,"props":54232,"children":54233},{},[54234],{"type":23,"value":54235},"Requests are processed statelessly and routed directly to the verification provider.",{"type":17,"tag":29,"props":54237,"children":54238},{},[54239],{"type":23,"value":54240},"This reduces:",{"type":17,"tag":80,"props":54242,"children":54243},{},[54244,54248,54253,54258],{"type":17,"tag":84,"props":54245,"children":54246},{},[54247],{"type":23,"value":9406},{"type":17,"tag":84,"props":54249,"children":54250},{},[54251],{"type":23,"value":54252},"sensitive data storage risks",{"type":17,"tag":84,"props":54254,"children":54255},{},[54256],{"type":23,"value":54257},"breach exposure",{"type":17,"tag":84,"props":54259,"children":54260},{},[54261],{"type":23,"value":54262},"data retention obligations",{"type":17,"tag":29,"props":54264,"children":54265},{},[54266],{"type":23,"value":54267},"For verification workflows involving sensitive identity information, minimizing stored data is a significant security advantage.",{"type":17,"tag":68,"props":54269,"children":54270},{"id":1552},[54271],{"type":23,"value":44411},{"type":17,"tag":29,"props":54273,"children":54274},{},[54275],{"type":23,"value":54276},"Verification APIs power critical workflows across hiring, onboarding, compliance, and identity verification.",{"type":17,"tag":29,"props":54278,"children":54279},{},[54280],{"type":23,"value":54281},"But integrating multiple screening providers individually can introduce complexity and long-term maintenance overhead.",{"type":17,"tag":29,"props":54283,"children":54284},{},[54285,54287,54292],{"type":23,"value":54286},"Unified verification APIs provide a scalable way to support ",{"type":17,"tag":48,"props":54288,"children":54289},{},[54290],{"type":23,"value":54291},"Checkr, Certn, First Advantage, Yardstik, and other verification platforms",{"type":23,"value":53308},{"type":17,"tag":29,"props":54294,"children":54295},{},[54296],{"type":23,"value":54297},"For SaaS platforms building hiring tools, marketplaces, or compliance systems, this approach makes it possible to support multiple verification providers without maintaining separate integrations for each one.",{"type":17,"tag":29,"props":54299,"children":54300},{},[54301],{"type":17,"tag":133,"props":54302,"children":54304},{"href":1612,"rel":54303},[214],[54305],{"type":23,"value":44481},{"type":17,"tag":29,"props":54307,"children":54308},{},[54309],{"type":17,"tag":133,"props":54310,"children":54312},{"href":1623,"rel":54311},[214],[54313],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":54315},[54316,54317,54324,54331,54338,54339,54342,54349,54350,54351],{"id":53430,"depth":1629,"text":53433},{"id":53532,"depth":1629,"text":53535,"children":54318},[54319,54320,54321,54322,54323],{"id":53547,"depth":1635,"text":53550},{"id":53558,"depth":1635,"text":53561},{"id":53569,"depth":1635,"text":53572},{"id":53580,"depth":1635,"text":53583},{"id":53591,"depth":1635,"text":53594},{"id":53607,"depth":1629,"text":53610,"children":54325},[54326,54327,54328,54329,54330],{"id":53618,"depth":1635,"text":53621},{"id":53673,"depth":1635,"text":53676},{"id":53725,"depth":1635,"text":53728},{"id":53770,"depth":1635,"text":53773},{"id":53819,"depth":1635,"text":53822},{"id":53865,"depth":1629,"text":53868,"children":54332},[54333,54334,54335,54336,54337],{"id":53876,"depth":1635,"text":53879},{"id":53887,"depth":1635,"text":53890},{"id":53898,"depth":1635,"text":53901},{"id":53909,"depth":1635,"text":53912},{"id":53920,"depth":1635,"text":53923},{"id":53936,"depth":1629,"text":53939},{"id":54002,"depth":1629,"text":54005,"children":54340},[54341],{"id":54039,"depth":1635,"text":54042},{"id":54109,"depth":1629,"text":54112,"children":54343},[54344,54345,54346,54347,54348],{"id":54120,"depth":1635,"text":54123},{"id":54131,"depth":1635,"text":54134},{"id":54142,"depth":1635,"text":54145},{"id":54153,"depth":1635,"text":54156},{"id":54164,"depth":1635,"text":54167},{"id":54175,"depth":1629,"text":54178},{"id":13413,"depth":1629,"text":54225},{"id":1552,"depth":1629,"text":44411},"content:blog:5_verification_apis_to_integrate_with_in_2026_checkr_first_advantage_certn.md","blog/5_verification_apis_to_integrate_with_in_2026_checkr_first_advantage_certn.md","blog/5_verification_apis_to_integrate_with_in_2026_checkr_first_advantage_certn",{"_path":54356,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":54357,"description":54358,"img":54359,"date":54360,"tag":12,"body":54361,"_type":1677,"_id":55616,"_source":1679,"_file":55617,"_stem":55618,"_extension":1682},"/blog/8_lms_apis_to_integrate_with_in_2026_coursera_d2l_brightspace_workday","8 LMS APIs to Integrate With in 2026: Coursera, D2L Brightspace, Workday","Learning Management Systems are now core infrastructure for employee enablement, customer education, training businesses, and workforce upskilling. Whether you...","https://s3.us-east-2.amazonaws.com/unified-article-images/8_lms_apis_to_integrate_with_in_2026_coursera_d2l_brightspace_workday-icon.png","2026-03-11T16:17:00.000Z",{"type":14,"children":54362,"toc":55574},[54363,54368,54371,54378,54383,54388,54393,54411,54417,54432,54437,54480,54485,54523,54528,54534,54539,54543,54549,54554,54560,54565,54571,54576,54582,54587,54593,54598,54604,54609,54614,54620,54625,54631,54641,54646,54651,54679,54684,54690,54700,54705,54710,54738,54743,54749,54759,54764,54769,54797,54802,54808,54818,54823,54828,54851,54856,54862,54872,54877,54882,54908,54913,54919,54929,54934,54938,54961,54966,54972,54982,54987,54992,55015,55020,55026,55036,55041,55046,55069,55074,55080,55085,55089,55094,55100,55111,55117,55122,55128,55133,55139,55144,55150,55155,55161,55170,55175,55186,55214,55219,55225,55242,55252,55257,55263,55268,55276,55281,55289,55294,55302,55307,55315,55320,55328,55333,55340,55345,55350,55356,55361,55367,55372,55378,55383,55388,55393,55399,55404,55410,55415,55421,55426,55432,55442,55447,55451,55474,55479,55483,55488,55493,55498,55520,55524,55529,55534,55546,55558,55566],{"type":17,"tag":18,"props":54364,"children":54366},{"id":54365},"_8-lms-apis-to-integrate-with-in-2026-coursera-d2l-brightspace-workday",[54367],{"type":23,"value":54357},{"type":17,"tag":25,"props":54369,"children":54370},{},[],{"type":17,"tag":29,"props":54372,"children":54373},{},[54374],{"type":17,"tag":33,"props":54375,"children":54376},{},[54377],{"type":23,"value":49465},{"type":17,"tag":29,"props":54379,"children":54380},{},[54381],{"type":23,"value":54382},"Learning Management Systems are now core infrastructure for employee enablement, customer education, training businesses, and workforce upskilling. Whether you are building an L&D product, a skills analytics platform, an internal enablement tool, or a course marketplace, LMS integrations are often what make the product useful in production.",{"type":17,"tag":29,"props":54384,"children":54385},{},[54386],{"type":23,"value":54387},"But LMS integrations are rarely straightforward.",{"type":17,"tag":29,"props":54389,"children":54390},{},[54391],{"type":23,"value":54392},"Every provider has its own authentication model, content structure, enrollment logic, and learner activity model. One platform might emphasize courses and completions. Another might center everything around content objects, collections, and consumption events. Others blend learning into broader HR or workforce systems.",{"type":17,"tag":29,"props":54394,"children":54395},{},[54396,54397,54402,54404,54409],{"type":23,"value":12584},{"type":17,"tag":48,"props":54398,"children":54399},{},[54400],{"type":23,"value":54401},"8+ LMS APIs developers commonly integrate with",{"type":23,"value":54403},", the challenges of building LMS integrations directly, and why more companies are moving toward ",{"type":17,"tag":48,"props":54405,"children":54406},{},[54407],{"type":23,"value":54408},"unified LMS APIs",{"type":23,"value":54410}," to support multiple learning platforms through one integration layer.",{"type":17,"tag":68,"props":54412,"children":54414},{"id":54413},"what-is-an-lms-api",[54415],{"type":23,"value":54416},"What Is an LMS API?",{"type":17,"tag":29,"props":54418,"children":54419},{},[54420,54421,54430],{"type":23,"value":40437},{"type":17,"tag":48,"props":54422,"children":54423},{},[54424],{"type":17,"tag":133,"props":54425,"children":54427},{"href":54426},"/lms",[54428],{"type":23,"value":54429},"LMS API",{"type":23,"value":54431}," allows software applications to access learning data programmatically from a learning management platform.",{"type":17,"tag":29,"props":54433,"children":54434},{},[54435],{"type":23,"value":54436},"These APIs typically expose endpoints for:",{"type":17,"tag":80,"props":54438,"children":54439},{},[54440,54445,54450,54455,54460,54465,54470,54475],{"type":17,"tag":84,"props":54441,"children":54442},{},[54443],{"type":23,"value":54444},"courses",{"type":17,"tag":84,"props":54446,"children":54447},{},[54448],{"type":23,"value":54449},"students or learners",{"type":17,"tag":84,"props":54451,"children":54452},{},[54453],{"type":23,"value":54454},"instructors",{"type":17,"tag":84,"props":54456,"children":54457},{},[54458],{"type":23,"value":54459},"content objects",{"type":17,"tag":84,"props":54461,"children":54462},{},[54463],{"type":23,"value":54464},"collections or learning paths",{"type":17,"tag":84,"props":54466,"children":54467},{},[54468],{"type":23,"value":54469},"activity and completion records",{"type":17,"tag":84,"props":54471,"children":54472},{},[54473],{"type":23,"value":54474},"enrollments",{"type":17,"tag":84,"props":54476,"children":54477},{},[54478],{"type":23,"value":54479},"progress tracking",{"type":17,"tag":29,"props":54481,"children":54482},{},[54483],{"type":23,"value":54484},"LMS APIs make it possible to build products such as:",{"type":17,"tag":80,"props":54486,"children":54487},{},[54488,54493,54498,54503,54508,54513,54518],{"type":17,"tag":84,"props":54489,"children":54490},{},[54491],{"type":23,"value":54492},"learning analytics dashboards",{"type":17,"tag":84,"props":54494,"children":54495},{},[54496],{"type":23,"value":54497},"course marketplaces",{"type":17,"tag":84,"props":54499,"children":54500},{},[54501],{"type":23,"value":54502},"employee enablement tools",{"type":17,"tag":84,"props":54504,"children":54505},{},[54506],{"type":23,"value":54507},"training compliance platforms",{"type":17,"tag":84,"props":54509,"children":54510},{},[54511],{"type":23,"value":54512},"content recommendation engines",{"type":17,"tag":84,"props":54514,"children":54515},{},[54516],{"type":23,"value":54517},"AI learning assistants",{"type":17,"tag":84,"props":54519,"children":54520},{},[54521],{"type":23,"value":54522},"enrollment and provisioning workflows",{"type":17,"tag":29,"props":54524,"children":54525},{},[54526],{"type":23,"value":54527},"Because LMS platforms often serve as the system of record for training activity, content access, and learner progress, they are a critical integration point for many SaaS products.",{"type":17,"tag":68,"props":54529,"children":54531},{"id":54530},"why-saas-products-integrate-with-lms-apis",[54532],{"type":23,"value":54533},"Why SaaS Products Integrate with LMS APIs",{"type":17,"tag":29,"props":54535,"children":54536},{},[54537],{"type":23,"value":54538},"LMS integrations support a broad range of workflows across education, workforce training, and customer enablement.",{"type":17,"tag":29,"props":54540,"children":54541},{},[54542],{"type":23,"value":12661},{"type":17,"tag":239,"props":54544,"children":54546},{"id":54545},"learning-analytics",[54547],{"type":23,"value":54548},"Learning analytics",{"type":17,"tag":29,"props":54550,"children":54551},{},[54552],{"type":23,"value":54553},"Pull learner activity, progress, and completion data into reporting tools or operational dashboards.",{"type":17,"tag":239,"props":54555,"children":54557},{"id":54556},"enrollment-automation",[54558],{"type":23,"value":54559},"Enrollment automation",{"type":17,"tag":29,"props":54561,"children":54562},{},[54563],{"type":23,"value":54564},"Automatically enroll employees, students, or customers into courses and learning paths.",{"type":17,"tag":239,"props":54566,"children":54568},{"id":54567},"course-distribution",[54569],{"type":23,"value":54570},"Course distribution",{"type":17,"tag":29,"props":54572,"children":54573},{},[54574],{"type":23,"value":54575},"Sync learning content from providers into your own application or internal portal.",{"type":17,"tag":239,"props":54577,"children":54579},{"id":54578},"skills-and-readiness-tracking",[54580],{"type":23,"value":54581},"Skills and readiness tracking",{"type":17,"tag":29,"props":54583,"children":54584},{},[54585],{"type":23,"value":54586},"Combine learning activity with workforce or performance systems to measure skill development.",{"type":17,"tag":239,"props":54588,"children":54590},{"id":54589},"customer-education",[54591],{"type":23,"value":54592},"Customer education",{"type":17,"tag":29,"props":54594,"children":54595},{},[54596],{"type":23,"value":54597},"Surface product training courses inside your SaaS application and track progress in real time.",{"type":17,"tag":239,"props":54599,"children":54601},{"id":54600},"ai-powered-learning-assistants",[54602],{"type":23,"value":54603},"AI-powered learning assistants",{"type":17,"tag":29,"props":54605,"children":54606},{},[54607],{"type":23,"value":54608},"Use course, content, and activity data to power search, recommendations, tutoring, and learning copilots.",{"type":17,"tag":29,"props":54610,"children":54611},{},[54612],{"type":23,"value":54613},"As learning programs become more distributed across multiple platforms, LMS integrations become essential infrastructure.",{"type":17,"tag":68,"props":54615,"children":54617},{"id":54616},"_8-lms-apis-developers-integrate-with",[54618],{"type":23,"value":54619},"8+ LMS APIs Developers Integrate With",{"type":17,"tag":29,"props":54621,"children":54622},{},[54623],{"type":23,"value":54624},"Below are some of the most commonly integrated LMS APIs used by SaaS products today.",{"type":17,"tag":68,"props":54626,"children":54628},{"id":54627},"coursera-api",[54629],{"type":23,"value":54630},"Coursera API",{"type":17,"tag":29,"props":54632,"children":54633},{},[54634],{"type":17,"tag":133,"props":54635,"children":54638},{"href":54636,"rel":54637},"https://www.coursera.org/",[214],[54639],{"type":23,"value":54640},"Coursera",{"type":17,"tag":29,"props":54642,"children":54643},{},[54644],{"type":23,"value":54645},"Coursera is one of the best-known online learning platforms, used by both individuals and enterprises.",{"type":17,"tag":29,"props":54647,"children":54648},{},[54649],{"type":23,"value":54650},"Typical integration use cases include:",{"type":17,"tag":80,"props":54652,"children":54653},{},[54654,54659,54664,54669,54674],{"type":17,"tag":84,"props":54655,"children":54656},{},[54657],{"type":23,"value":54658},"course catalog access",{"type":17,"tag":84,"props":54660,"children":54661},{},[54662],{"type":23,"value":54663},"learner provisioning",{"type":17,"tag":84,"props":54665,"children":54666},{},[54667],{"type":23,"value":54668},"content distribution",{"type":17,"tag":84,"props":54670,"children":54671},{},[54672],{"type":23,"value":54673},"completion tracking",{"type":17,"tag":84,"props":54675,"children":54676},{},[54677],{"type":23,"value":54678},"enterprise learning workflows",{"type":17,"tag":29,"props":54680,"children":54681},{},[54682],{"type":23,"value":54683},"Coursera integrations are often relevant for employee upskilling and external learning content delivery.",{"type":17,"tag":68,"props":54685,"children":54687},{"id":54686},"d2l-brightspace-api",[54688],{"type":23,"value":54689},"D2L Brightspace API",{"type":17,"tag":29,"props":54691,"children":54692},{},[54693],{"type":17,"tag":133,"props":54694,"children":54697},{"href":54695,"rel":54696},"https://docs.valence.desire2learn.com/",[214],[54698],{"type":23,"value":54699},"D2L Brightspace Developer Docs",{"type":17,"tag":29,"props":54701,"children":54702},{},[54703],{"type":23,"value":54704},"D2L Brightspace is a major LMS used by higher education institutions, training providers, and enterprises.",{"type":17,"tag":29,"props":54706,"children":54707},{},[54708],{"type":23,"value":54709},"Its APIs are commonly used for:",{"type":17,"tag":80,"props":54711,"children":54712},{},[54713,54718,54723,54728,54733],{"type":17,"tag":84,"props":54714,"children":54715},{},[54716],{"type":23,"value":54717},"course and class synchronization",{"type":17,"tag":84,"props":54719,"children":54720},{},[54721],{"type":23,"value":54722},"learner enrollment workflows",{"type":17,"tag":84,"props":54724,"children":54725},{},[54726],{"type":23,"value":54727},"instructor and student management",{"type":17,"tag":84,"props":54729,"children":54730},{},[54731],{"type":23,"value":54732},"content access",{"type":17,"tag":84,"props":54734,"children":54735},{},[54736],{"type":23,"value":54737},"activity and completion reporting",{"type":17,"tag":29,"props":54739,"children":54740},{},[54741],{"type":23,"value":54742},"Brightspace integrations are common in education technology and compliance learning products.",{"type":17,"tag":68,"props":54744,"children":54746},{"id":54745},"go1-api",[54747],{"type":23,"value":54748},"Go1 API",{"type":17,"tag":29,"props":54750,"children":54751},{},[54752],{"type":17,"tag":133,"props":54753,"children":54756},{"href":54754,"rel":54755},"https://www.go1.com/",[214],[54757],{"type":23,"value":54758},"Go1",{"type":17,"tag":29,"props":54760,"children":54761},{},[54762],{"type":23,"value":54763},"Go1 is a large learning content aggregation platform used by enterprises to distribute external course libraries.",{"type":17,"tag":29,"props":54765,"children":54766},{},[54767],{"type":23,"value":54768},"Common integration use cases include:",{"type":17,"tag":80,"props":54770,"children":54771},{},[54772,54777,54782,54787,54792],{"type":17,"tag":84,"props":54773,"children":54774},{},[54775],{"type":23,"value":54776},"content library access",{"type":17,"tag":84,"props":54778,"children":54779},{},[54780],{"type":23,"value":54781},"course distribution",{"type":17,"tag":84,"props":54783,"children":54784},{},[54785],{"type":23,"value":54786},"enrollment workflows",{"type":17,"tag":84,"props":54788,"children":54789},{},[54790],{"type":23,"value":54791},"learning path delivery",{"type":17,"tag":84,"props":54793,"children":54794},{},[54795],{"type":23,"value":54796},"learner analytics",{"type":17,"tag":29,"props":54798,"children":54799},{},[54800],{"type":23,"value":54801},"Go1 is especially relevant when products need access to external training content at scale.",{"type":17,"tag":68,"props":54803,"children":54805},{"id":54804},"google-classroom-api",[54806],{"type":23,"value":54807},"Google Classroom API",{"type":17,"tag":29,"props":54809,"children":54810},{},[54811],{"type":17,"tag":133,"props":54812,"children":54815},{"href":54813,"rel":54814},"https://developers.google.com/classroom",[214],[54816],{"type":23,"value":54817},"Google Classroom API Docs",{"type":17,"tag":29,"props":54819,"children":54820},{},[54821],{"type":23,"value":54822},"Google Classroom is widely used in education settings and exposes APIs for classes, assignments, coursework, and user data.",{"type":17,"tag":29,"props":54824,"children":54825},{},[54826],{"type":23,"value":54827},"Common integrations include:",{"type":17,"tag":80,"props":54829,"children":54830},{},[54831,54836,54841,54846],{"type":17,"tag":84,"props":54832,"children":54833},{},[54834],{"type":23,"value":54835},"classroom synchronization",{"type":17,"tag":84,"props":54837,"children":54838},{},[54839],{"type":23,"value":54840},"student and teacher access",{"type":17,"tag":84,"props":54842,"children":54843},{},[54844],{"type":23,"value":54845},"coursework and assignment workflows",{"type":17,"tag":84,"props":54847,"children":54848},{},[54849],{"type":23,"value":54850},"activity tracking",{"type":17,"tag":29,"props":54852,"children":54853},{},[54854],{"type":23,"value":54855},"Google Classroom integrations are often used by edtech platforms and classroom workflow tools.",{"type":17,"tag":68,"props":54857,"children":54859},{"id":54858},"learnupon-api",[54860],{"type":23,"value":54861},"LearnUpon API",{"type":17,"tag":29,"props":54863,"children":54864},{},[54865],{"type":17,"tag":133,"props":54866,"children":54869},{"href":54867,"rel":54868},"https://www.learnupon.com/",[214],[54870],{"type":23,"value":54871},"LearnUpon",{"type":17,"tag":29,"props":54873,"children":54874},{},[54875],{"type":23,"value":54876},"LearnUpon is a modern LMS used by businesses for employee learning, partner training, and customer education.",{"type":17,"tag":29,"props":54878,"children":54879},{},[54880],{"type":23,"value":54881},"Common API-driven workflows include:",{"type":17,"tag":80,"props":54883,"children":54884},{},[54885,54889,54894,54898,54903],{"type":17,"tag":84,"props":54886,"children":54887},{},[54888],{"type":23,"value":54663},{"type":17,"tag":84,"props":54890,"children":54891},{},[54892],{"type":23,"value":54893},"course enrollments",{"type":17,"tag":84,"props":54895,"children":54896},{},[54897],{"type":23,"value":54673},{"type":17,"tag":84,"props":54899,"children":54900},{},[54901],{"type":23,"value":54902},"customer education programs",{"type":17,"tag":84,"props":54904,"children":54905},{},[54906],{"type":23,"value":54907},"reporting and analytics",{"type":17,"tag":29,"props":54909,"children":54910},{},[54911],{"type":23,"value":54912},"LearnUpon is especially common in customer education and partner enablement use cases.",{"type":17,"tag":68,"props":54914,"children":54916},{"id":54915},"linkedin-learning-api",[54917],{"type":23,"value":54918},"LinkedIn Learning API",{"type":17,"tag":29,"props":54920,"children":54921},{},[54922],{"type":17,"tag":133,"props":54923,"children":54926},{"href":54924,"rel":54925},"https://learning.linkedin.com/",[214],[54927],{"type":23,"value":54928},"LinkedIn Learning",{"type":17,"tag":29,"props":54930,"children":54931},{},[54932],{"type":23,"value":54933},"LinkedIn Learning provides professional development content used by enterprises and individuals.",{"type":17,"tag":29,"props":54935,"children":54936},{},[54937],{"type":23,"value":54768},{"type":17,"tag":80,"props":54939,"children":54940},{},[54941,54946,54951,54956],{"type":17,"tag":84,"props":54942,"children":54943},{},[54944],{"type":23,"value":54945},"content recommendation",{"type":17,"tag":84,"props":54947,"children":54948},{},[54949],{"type":23,"value":54950},"learner activity tracking",{"type":17,"tag":84,"props":54952,"children":54953},{},[54954],{"type":23,"value":54955},"completion reporting",{"type":17,"tag":84,"props":54957,"children":54958},{},[54959],{"type":23,"value":54960},"workforce development analytics",{"type":17,"tag":29,"props":54962,"children":54963},{},[54964],{"type":23,"value":54965},"LinkedIn Learning is frequently integrated into L&D systems and skills intelligence platforms.",{"type":17,"tag":68,"props":54967,"children":54969},{"id":54968},"sap-successfactors-learning-api",[54970],{"type":23,"value":54971},"SAP SuccessFactors Learning API",{"type":17,"tag":29,"props":54973,"children":54974},{},[54975],{"type":17,"tag":133,"props":54976,"children":54979},{"href":54977,"rel":54978},"https://www.sap.com/products/hcm/learning-management.html",[214],[54980],{"type":23,"value":54981},"SAP SuccessFactors",{"type":17,"tag":29,"props":54983,"children":54984},{},[54985],{"type":23,"value":54986},"SAP SuccessFactors includes a learning module used by large organizations for enterprise training and compliance programs.",{"type":17,"tag":29,"props":54988,"children":54989},{},[54990],{"type":23,"value":54991},"Common integration scenarios include:",{"type":17,"tag":80,"props":54993,"children":54994},{},[54995,55000,55005,55010],{"type":17,"tag":84,"props":54996,"children":54997},{},[54998],{"type":23,"value":54999},"employee training records",{"type":17,"tag":84,"props":55001,"children":55002},{},[55003],{"type":23,"value":55004},"compliance certification tracking",{"type":17,"tag":84,"props":55006,"children":55007},{},[55008],{"type":23,"value":55009},"course access and completions",{"type":17,"tag":84,"props":55011,"children":55012},{},[55013],{"type":23,"value":55014},"learning administration workflows",{"type":17,"tag":29,"props":55016,"children":55017},{},[55018],{"type":23,"value":55019},"Because SuccessFactors is often part of a broader HR stack, its learning data is frequently connected with workforce and HR analytics tools.",{"type":17,"tag":68,"props":55021,"children":55023},{"id":55022},"workday-learning-api",[55024],{"type":23,"value":55025},"Workday Learning API",{"type":17,"tag":29,"props":55027,"children":55028},{},[55029],{"type":17,"tag":133,"props":55030,"children":55033},{"href":55031,"rel":55032},"https://developer.workday.com/",[214],[55034],{"type":23,"value":55035},"Workday Developer Portal",{"type":17,"tag":29,"props":55037,"children":55038},{},[55039],{"type":23,"value":55040},"Workday includes learning capabilities as part of its broader workforce platform.",{"type":17,"tag":29,"props":55042,"children":55043},{},[55044],{"type":23,"value":55045},"Workday learning integrations often involve:",{"type":17,"tag":80,"props":55047,"children":55048},{},[55049,55054,55059,55064],{"type":17,"tag":84,"props":55050,"children":55051},{},[55052],{"type":23,"value":55053},"employee training history",{"type":17,"tag":84,"props":55055,"children":55056},{},[55057],{"type":23,"value":55058},"assigned learning content",{"type":17,"tag":84,"props":55060,"children":55061},{},[55062],{"type":23,"value":55063},"activity and completion data",{"type":17,"tag":84,"props":55065,"children":55066},{},[55067],{"type":23,"value":55068},"workforce readiness programs",{"type":17,"tag":29,"props":55070,"children":55071},{},[55072],{"type":23,"value":55073},"These integrations are especially relevant when learning data needs to be combined with HR, skills, or workforce planning data.",{"type":17,"tag":68,"props":55075,"children":55077},{"id":55076},"challenges-when-integrating-lms-apis",[55078],{"type":23,"value":55079},"Challenges When Integrating LMS APIs",{"type":17,"tag":29,"props":55081,"children":55082},{},[55083],{"type":23,"value":55084},"LMS integrations are often harder than they appear.",{"type":17,"tag":239,"props":55086,"children":55087},{"id":13098},[55088],{"type":23,"value":13101},{"type":17,"tag":29,"props":55090,"children":55091},{},[55092],{"type":23,"value":55093},"Some providers focus on courses and enrollments. Others expose content, collections, activities, and localized assets as separate objects.",{"type":17,"tag":239,"props":55095,"children":55097},{"id":55096},"inconsistent-authentication",[55098],{"type":23,"value":55099},"Inconsistent authentication",{"type":17,"tag":29,"props":55101,"children":55102},{},[55103,55105,55109],{"type":23,"value":55104},"Authentication varies across providers, from ",{"type":17,"tag":133,"props":55106,"children":55107},{"href":779},[55108],{"type":23,"value":782},{"type":23,"value":55110}," to enterprise-specific credential models.",{"type":17,"tag":239,"props":55112,"children":55114},{"id":55113},"fragmented-content-structures",[55115],{"type":23,"value":55116},"Fragmented content structures",{"type":17,"tag":29,"props":55118,"children":55119},{},[55120],{"type":23,"value":55121},"Content hierarchies differ significantly between platforms, especially for collections, modules, and learning paths.",{"type":17,"tag":239,"props":55123,"children":55125},{"id":55124},"progress-tracking-differences",[55126],{"type":23,"value":55127},"Progress tracking differences",{"type":17,"tag":29,"props":55129,"children":55130},{},[55131],{"type":23,"value":55132},"Not all platforms define completion, progress percentage, or activity duration in the same way.",{"type":17,"tag":239,"props":55134,"children":55136},{"id":55135},"broader-system-overlap",[55137],{"type":23,"value":55138},"Broader system overlap",{"type":17,"tag":29,"props":55140,"children":55141},{},[55142],{"type":23,"value":55143},"Some LMS providers are standalone. Others are embedded inside HR or workforce suites, which adds complexity around permissions and object relationships.",{"type":17,"tag":239,"props":55145,"children":55147},{"id":55146},"maintenance-burden",[55148],{"type":23,"value":55149},"Maintenance burden",{"type":17,"tag":29,"props":55151,"children":55152},{},[55153],{"type":23,"value":55154},"Every provider has different docs, limits, change cycles, and event models. Supporting many LMSs directly creates ongoing engineering overhead.",{"type":17,"tag":68,"props":55156,"children":55158},{"id":55157},"the-role-of-unified-lms-apis",[55159],{"type":23,"value":55160},"The Role of Unified LMS APIs",{"type":17,"tag":29,"props":55162,"children":55163},{},[55164,55165,55169],{"type":23,"value":51904},{"type":17,"tag":48,"props":55166,"children":55167},{},[55168],{"type":23,"value":54408},{"type":23,"value":54},{"type":17,"tag":29,"props":55171,"children":55172},{},[55173],{"type":23,"value":55174},"A unified LMS API standardizes learning data models and endpoint patterns across providers, so developers can integrate once and support many learning platforms.",{"type":17,"tag":29,"props":55176,"children":55177},{},[55178,55180,55184],{"type":23,"value":55179},"Instead of building custom integrations for Coursera, Brightspace, LearnUpon, Workday, and others, a ",{"type":17,"tag":133,"props":55181,"children":55182},{"href":7691},[55183],{"type":23,"value":7459},{"type":23,"value":55185}," can provide:",{"type":17,"tag":80,"props":55187,"children":55188},{},[55189,55194,55199,55204,55209],{"type":17,"tag":84,"props":55190,"children":55191},{},[55192],{"type":23,"value":55193},"one authentication and connection model",{"type":17,"tag":84,"props":55195,"children":55196},{},[55197],{"type":23,"value":55198},"normalized course and learner objects",{"type":17,"tag":84,"props":55200,"children":55201},{},[55202],{"type":23,"value":55203},"consistent content and activity endpoints",{"type":17,"tag":84,"props":55205,"children":55206},{},[55207],{"type":23,"value":55208},"standardized read and write methods",{"type":17,"tag":84,"props":55210,"children":55211},{},[55212],{"type":23,"value":55213},"automatic handling of provider-specific differences",{"type":17,"tag":29,"props":55215,"children":55216},{},[55217],{"type":23,"value":55218},"This makes LMS integrations much easier to scale.",{"type":17,"tag":68,"props":55220,"children":55222},{"id":55221},"build-once-with-the-unified-lms-api",[55223],{"type":23,"value":55224},"Build Once with the Unified LMS API",{"type":17,"tag":29,"props":55226,"children":55227},{},[55228,55229,55234,55236,55241],{"type":23,"value":6712},{"type":17,"tag":48,"props":55230,"children":55231},{},[55232],{"type":23,"value":55233},"Unified LMS API",{"type":23,"value":55235}," allows developers to access learning data across ",{"type":17,"tag":48,"props":55237,"children":55238},{},[55239],{"type":23,"value":55240},"8+ LMS integrations",{"type":23,"value":23943},{"type":17,"tag":29,"props":55243,"children":55244},{},[55245,55246],{"type":23,"value":53003},{"type":17,"tag":133,"props":55247,"children":55250},{"href":55248,"rel":55249},"https://unified.to/lms",[214],[55251],{"type":23,"value":55233},{"type":17,"tag":29,"props":55253,"children":55254},{},[55255],{"type":23,"value":55256},"Unified provides normalized LMS objects across providers such as Coursera, D2L Brightspace, Go1, Google Classroom, LearnUpon, LinkedIn Learning, SAP SuccessFactors Learning, and Workday.",{"type":17,"tag":68,"props":55258,"children":55260},{"id":55259},"unified-lms-data-objects",[55261],{"type":23,"value":55262},"Unified LMS Data Objects",{"type":17,"tag":29,"props":55264,"children":55265},{},[55266],{"type":23,"value":55267},"Unified standardizes learning data into the following core objects:",{"type":17,"tag":29,"props":55269,"children":55270},{},[55271],{"type":17,"tag":48,"props":55272,"children":55273},{},[55274],{"type":23,"value":55275},"Course",{"type":17,"tag":29,"props":55277,"children":55278},{},[55279],{"type":23,"value":55280},"Course catalogs, course metadata, pricing, languages, instructors, and enrolled students.",{"type":17,"tag":29,"props":55282,"children":55283},{},[55284],{"type":17,"tag":48,"props":55285,"children":55286},{},[55287],{"type":23,"value":55288},"Student",{"type":17,"tag":29,"props":55290,"children":55291},{},[55292],{"type":23,"value":55293},"Learner profiles and enrollment-related learner data.",{"type":17,"tag":29,"props":55295,"children":55296},{},[55297],{"type":17,"tag":48,"props":55298,"children":55299},{},[55300],{"type":23,"value":55301},"Instructor",{"type":17,"tag":29,"props":55303,"children":55304},{},[55305],{"type":23,"value":55306},"Instructor records and teaching profiles.",{"type":17,"tag":29,"props":55308,"children":55309},{},[55310],{"type":17,"tag":48,"props":55311,"children":55312},{},[55313],{"type":23,"value":55314},"Content",{"type":17,"tag":29,"props":55316,"children":55317},{},[55318],{"type":23,"value":55319},"Learning objects such as modules, lessons, media assets, and content items.",{"type":17,"tag":29,"props":55321,"children":55322},{},[55323],{"type":17,"tag":48,"props":55324,"children":55325},{},[55326],{"type":23,"value":55327},"Collection",{"type":17,"tag":29,"props":55329,"children":55330},{},[55331],{"type":23,"value":55332},"Grouped content, learning paths, and structured learning bundles.",{"type":17,"tag":29,"props":55334,"children":55335},{},[55336],{"type":17,"tag":48,"props":55337,"children":55338},{},[55339],{"type":23,"value":33999},{"type":17,"tag":29,"props":55341,"children":55342},{},[55343],{"type":23,"value":55344},"Learner engagement, duration, start and completion timestamps, and progress tracking.",{"type":17,"tag":29,"props":55346,"children":55347},{},[55348],{"type":23,"value":55349},"This object model gives teams more depth than a shallow 'course only' abstraction and makes it easier to build serious LMS workflows.",{"type":17,"tag":68,"props":55351,"children":55353},{"id":55352},"common-lms-integration-use-cases",[55354],{"type":23,"value":55355},"Common LMS Integration Use Cases",{"type":17,"tag":29,"props":55357,"children":55358},{},[55359],{"type":23,"value":55360},"With a unified LMS API, SaaS teams can support a wide range of learning use cases.",{"type":17,"tag":239,"props":55362,"children":55364},{"id":55363},"learning-analytics-dashboards",[55365],{"type":23,"value":55366},"Learning analytics dashboards",{"type":17,"tag":29,"props":55368,"children":55369},{},[55370],{"type":23,"value":55371},"Aggregate learner progress and completion data across multiple LMS platforms.",{"type":17,"tag":239,"props":55373,"children":55375},{"id":55374},"customer-education-products",[55376],{"type":23,"value":55377},"Customer education products",{"type":17,"tag":29,"props":55379,"children":55380},{},[55381],{"type":23,"value":55382},"Surface courses and content from external learning platforms directly in your product.",{"type":17,"tag":239,"props":55384,"children":55386},{"id":55385},"enrollment-automation-1",[55387],{"type":23,"value":54559},{"type":17,"tag":29,"props":55389,"children":55390},{},[55391],{"type":23,"value":55392},"Enroll users into courses and collections without maintaining separate provider integrations.",{"type":17,"tag":239,"props":55394,"children":55396},{"id":55395},"skills-and-compliance-tracking",[55397],{"type":23,"value":55398},"Skills and compliance tracking",{"type":17,"tag":29,"props":55400,"children":55401},{},[55402],{"type":23,"value":55403},"Track completion status and activity history for training and certification workflows.",{"type":17,"tag":239,"props":55405,"children":55407},{"id":55406},"content-replication-and-distribution",[55408],{"type":23,"value":55409},"Content replication and distribution",{"type":17,"tag":29,"props":55411,"children":55412},{},[55413],{"type":23,"value":55414},"Sync courses and content across learning systems or distribute them inside your own application.",{"type":17,"tag":239,"props":55416,"children":55418},{"id":55417},"ai-learning-products",[55419],{"type":23,"value":55420},"AI learning products",{"type":17,"tag":29,"props":55422,"children":55423},{},[55424],{"type":23,"value":55425},"Feed real-time course, content, and activity data into search, recommendations, copilots, or RAG pipelines.",{"type":17,"tag":68,"props":55427,"children":55429},{"id":55428},"real-time-lms-data-access",[55430],{"type":23,"value":55431},"Real-Time LMS Data Access",{"type":17,"tag":29,"props":55433,"children":55434},{},[55435,55437,55441],{"type":23,"value":55436},"Unlike integration systems that rely on caching or scheduled sync jobs, Unified uses a ",{"type":17,"tag":48,"props":55438,"children":55439},{},[55440],{"type":23,"value":50812},{"type":23,"value":54},{"type":17,"tag":29,"props":55443,"children":55444},{},[55445],{"type":23,"value":55446},"Every request hits the source LMS directly.",{"type":17,"tag":29,"props":55448,"children":55449},{},[55450],{"type":23,"value":5804},{"type":17,"tag":80,"props":55452,"children":55453},{},[55454,55459,55464,55469],{"type":17,"tag":84,"props":55455,"children":55456},{},[55457],{"type":23,"value":55458},"no stale learning records",{"type":17,"tag":84,"props":55460,"children":55461},{},[55462],{"type":23,"value":55463},"no delayed completion updates",{"type":17,"tag":84,"props":55465,"children":55466},{},[55467],{"type":23,"value":55468},"no sync lag between systems",{"type":17,"tag":84,"props":55470,"children":55471},{},[55472],{"type":23,"value":55473},"live access to content and learner activity",{"type":17,"tag":29,"props":55475,"children":55476},{},[55477],{"type":23,"value":55478},"This is especially important for products that depend on current learning progress or need to trigger workflows immediately after course activity changes.",{"type":17,"tag":68,"props":55480,"children":55481},{"id":13413},[55482],{"type":23,"value":54225},{"type":17,"tag":29,"props":55484,"children":55485},{},[55486],{"type":23,"value":55487},"Unified does not store customers' LMS data.",{"type":17,"tag":29,"props":55489,"children":55490},{},[55491],{"type":23,"value":55492},"Requests are processed statelessly and routed directly to the source platform.",{"type":17,"tag":29,"props":55494,"children":55495},{},[55496],{"type":23,"value":55497},"For teams handling learner data, employee training data, or customer education records, this architecture reduces:",{"type":17,"tag":80,"props":55499,"children":55500},{},[55501,55505,55510,55515],{"type":17,"tag":84,"props":55502,"children":55503},{},[55504],{"type":23,"value":9406},{"type":17,"tag":84,"props":55506,"children":55507},{},[55508],{"type":23,"value":55509},"data-at-rest risk",{"type":17,"tag":84,"props":55511,"children":55512},{},[55513],{"type":23,"value":55514},"retention complexity",{"type":17,"tag":84,"props":55516,"children":55517},{},[55518],{"type":23,"value":55519},"security review overhead",{"type":17,"tag":68,"props":55521,"children":55522},{"id":1552},[55523],{"type":23,"value":44411},{"type":17,"tag":29,"props":55525,"children":55526},{},[55527],{"type":23,"value":55528},"LMS APIs are becoming a core part of SaaS product architecture for training, education, workforce enablement, and customer learning.",{"type":17,"tag":29,"props":55530,"children":55531},{},[55532],{"type":23,"value":55533},"But integrating learning platforms directly can create a lot of engineering complexity, especially as you support more systems and deeper learning workflows.",{"type":17,"tag":29,"props":55535,"children":55536},{},[55537,55539,55544],{"type":23,"value":55538},"A unified LMS API gives teams a more scalable way to connect to ",{"type":17,"tag":48,"props":55540,"children":55541},{},[55542],{"type":23,"value":55543},"8+ learning platforms",{"type":23,"value":55545}," through one integration layer, with consistent objects for courses, students, instructors, content, collections, and activity.",{"type":17,"tag":29,"props":55547,"children":55548},{},[55549,55551,55556],{"type":23,"value":55550},"If your product needs to integrate with learning systems, a unified API makes it possible to support ",{"type":17,"tag":48,"props":55552,"children":55553},{},[55554],{"type":23,"value":55555},"Coursera, Brightspace, LearnUpon, Workday, and other major LMS platforms",{"type":23,"value":55557}," without maintaining separate integrations for each one.",{"type":17,"tag":29,"props":55559,"children":55560},{},[55561],{"type":17,"tag":133,"props":55562,"children":55564},{"href":1612,"rel":55563},[214],[55565],{"type":23,"value":44481},{"type":17,"tag":29,"props":55567,"children":55568},{},[55569],{"type":17,"tag":133,"props":55570,"children":55572},{"href":1623,"rel":55571},[214],[55573],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":55575},[55576,55577,55585,55586,55587,55588,55589,55590,55591,55592,55593,55594,55602,55603,55604,55605,55613,55614,55615],{"id":54413,"depth":1629,"text":54416},{"id":54530,"depth":1629,"text":54533,"children":55578},[55579,55580,55581,55582,55583,55584],{"id":54545,"depth":1635,"text":54548},{"id":54556,"depth":1635,"text":54559},{"id":54567,"depth":1635,"text":54570},{"id":54578,"depth":1635,"text":54581},{"id":54589,"depth":1635,"text":54592},{"id":54600,"depth":1635,"text":54603},{"id":54616,"depth":1629,"text":54619},{"id":54627,"depth":1629,"text":54630},{"id":54686,"depth":1629,"text":54689},{"id":54745,"depth":1629,"text":54748},{"id":54804,"depth":1629,"text":54807},{"id":54858,"depth":1629,"text":54861},{"id":54915,"depth":1629,"text":54918},{"id":54968,"depth":1629,"text":54971},{"id":55022,"depth":1629,"text":55025},{"id":55076,"depth":1629,"text":55079,"children":55595},[55596,55597,55598,55599,55600,55601],{"id":13098,"depth":1635,"text":13101},{"id":55096,"depth":1635,"text":55099},{"id":55113,"depth":1635,"text":55116},{"id":55124,"depth":1635,"text":55127},{"id":55135,"depth":1635,"text":55138},{"id":55146,"depth":1635,"text":55149},{"id":55157,"depth":1629,"text":55160},{"id":55221,"depth":1629,"text":55224},{"id":55259,"depth":1629,"text":55262},{"id":55352,"depth":1629,"text":55355,"children":55606},[55607,55608,55609,55610,55611,55612],{"id":55363,"depth":1635,"text":55366},{"id":55374,"depth":1635,"text":55377},{"id":55385,"depth":1635,"text":54559},{"id":55395,"depth":1635,"text":55398},{"id":55406,"depth":1635,"text":55409},{"id":55417,"depth":1635,"text":55420},{"id":55428,"depth":1629,"text":55431},{"id":13413,"depth":1629,"text":54225},{"id":1552,"depth":1629,"text":44411},"content:blog:8_lms_apis_to_integrate_with_in_2026_coursera_d2l_brightspace_workday.md","blog/8_lms_apis_to_integrate_with_in_2026_coursera_d2l_brightspace_workday.md","blog/8_lms_apis_to_integrate_with_in_2026_coursera_d2l_brightspace_workday",{"_path":55620,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":55621,"description":55622,"img":55623,"date":55624,"tag":12,"body":55625,"_type":1677,"_id":57139,"_source":1679,"_file":57140,"_stem":57141,"_extension":1682},"/blog/15_ats_apis_to_integrate_with_in_2026_greenhouse_lever_workable","15 ATS APIs to Integrate With in 2026: Greenhouse, Lever, Workable","Applicant Tracking Systems (ATS) sit at the center of modern hiring infrastructure. They manage candidate pipelines, job postings, applications, interview...","https://s3.us-east-2.amazonaws.com/unified-article-images/15_ats_apis_to_integrate_with_in_2026_greenhouse_lever_workable-icon.png","2026-03-11T16:04:00.000Z",{"type":14,"children":55626,"toc":57106},[55627,55632,55635,55642,55647,55659,55664,55669,55681,55687,55702,55706,55749,55754,55787,55799,55805,55810,55814,55820,55825,55831,55836,55842,55847,55853,55858,55864,55869,55875,55880,55885,55891,55903,55909,55918,55923,55928,55956,55967,55973,55983,55988,55992,56018,56029,56035,56045,56050,56055,56081,56092,56098,56108,56113,56118,56146,56151,56157,56167,56172,56177,56203,56209,56219,56224,56228,56250,56256,56266,56271,56275,56296,56302,56312,56317,56321,56341,56346,56352,56362,56367,56372,56393,56399,56409,56414,56418,56439,56445,56453,56458,56463,56482,56488,56498,56503,56507,56522,56528,56533,56645,56656,56662,56667,56672,56683,56689,56694,56700,56711,56717,56722,56728,56733,56738,56744,56755,56760,56765,56770,56795,56800,56806,56829,56834,56840,56845,56853,56858,56866,56871,56879,56884,56892,56897,56905,56910,56918,56923,56931,56936,56944,56949,56953,56976,56981,56987,56996,57001,57005,57028,57032,57037,57042,57053,57057,57062,57067,57078,57090,57098],{"type":17,"tag":18,"props":55628,"children":55630},{"id":55629},"_15-ats-apis-to-integrate-with-in-2026-greenhouse-lever-workable",[55631],{"type":23,"value":55621},{"type":17,"tag":25,"props":55633,"children":55634},{},[],{"type":17,"tag":29,"props":55636,"children":55637},{},[55638],{"type":17,"tag":33,"props":55639,"children":55640},{},[55641],{"type":23,"value":49465},{"type":17,"tag":29,"props":55643,"children":55644},{},[55645],{"type":23,"value":55646},"Applicant Tracking Systems (ATS) sit at the center of modern hiring infrastructure. They manage candidate pipelines, job postings, applications, interview scheduling, and recruiting analytics.",{"type":17,"tag":29,"props":55648,"children":55649},{},[55650,55652,55657],{"type":23,"value":55651},"For SaaS platforms building ",{"type":17,"tag":48,"props":55653,"children":55654},{},[55655],{"type":23,"value":55656},"recruiting tools, HR analytics products, background check services, sourcing platforms, or interview tools",{"type":23,"value":55658},", integrating with ATS systems has become essential.",{"type":17,"tag":29,"props":55660,"children":55661},{},[55662],{"type":23,"value":55663},"But integrating ATS systems is rarely simple.",{"type":17,"tag":29,"props":55665,"children":55666},{},[55667],{"type":23,"value":55668},"Every recruiting platform exposes a different API structure, authentication system, webhook model, and hiring pipeline schema. Supporting multiple ATS providers quickly becomes a major engineering burden.",{"type":17,"tag":29,"props":55670,"children":55671},{},[55672,55674,55679],{"type":23,"value":55673},"In this guide we'll cover ",{"type":17,"tag":48,"props":55675,"children":55676},{},[55677],{"type":23,"value":55678},"15+ ATS APIs developers commonly integrate with",{"type":23,"value":55680},", the challenges of building recruiting integrations, and how unified ATS APIs simplify integration across dozens of recruiting systems.",{"type":17,"tag":68,"props":55682,"children":55684},{"id":55683},"what-is-an-ats-api",[55685],{"type":23,"value":55686},"What Is an ATS API?",{"type":17,"tag":29,"props":55688,"children":55689},{},[55690,55691,55700],{"type":23,"value":40437},{"type":17,"tag":48,"props":55692,"children":55693},{},[55694],{"type":17,"tag":133,"props":55695,"children":55697},{"href":55696},"/ats",[55698],{"type":23,"value":55699},"ATS API",{"type":23,"value":55701}," allows software applications to programmatically access recruiting and hiring data stored inside an applicant tracking system.",{"type":17,"tag":29,"props":55703,"children":55704},{},[55705],{"type":23,"value":54436},{"type":17,"tag":80,"props":55707,"children":55708},{},[55709,55714,55719,55724,55729,55734,55739,55744],{"type":17,"tag":84,"props":55710,"children":55711},{},[55712],{"type":23,"value":55713},"candidates",{"type":17,"tag":84,"props":55715,"children":55716},{},[55717],{"type":23,"value":55718},"job postings",{"type":17,"tag":84,"props":55720,"children":55721},{},[55722],{"type":23,"value":55723},"applications",{"type":17,"tag":84,"props":55725,"children":55726},{},[55727],{"type":23,"value":55728},"interviews",{"type":17,"tag":84,"props":55730,"children":55731},{},[55732],{"type":23,"value":55733},"recruiting activities",{"type":17,"tag":84,"props":55735,"children":55736},{},[55737],{"type":23,"value":55738},"resumes and documents",{"type":17,"tag":84,"props":55740,"children":55741},{},[55742],{"type":23,"value":55743},"hiring scorecards",{"type":17,"tag":84,"props":55745,"children":55746},{},[55747],{"type":23,"value":55748},"recruiting pipelines",{"type":17,"tag":29,"props":55750,"children":55751},{},[55752],{"type":23,"value":55753},"ATS APIs enable SaaS products to build features such as:",{"type":17,"tag":80,"props":55755,"children":55756},{},[55757,55762,55767,55772,55777,55782],{"type":17,"tag":84,"props":55758,"children":55759},{},[55760],{"type":23,"value":55761},"candidate sourcing tools",{"type":17,"tag":84,"props":55763,"children":55764},{},[55765],{"type":23,"value":55766},"recruiting analytics dashboards",{"type":17,"tag":84,"props":55768,"children":55769},{},[55770],{"type":23,"value":55771},"interview scheduling platforms",{"type":17,"tag":84,"props":55773,"children":55774},{},[55775],{"type":23,"value":55776},"background check automation",{"type":17,"tag":84,"props":55778,"children":55779},{},[55780],{"type":23,"value":55781},"recruiting CRM systems",{"type":17,"tag":84,"props":55783,"children":55784},{},[55785],{"type":23,"value":55786},"recruitment marketing tools",{"type":17,"tag":29,"props":55788,"children":55789},{},[55790,55792,55797],{"type":23,"value":55791},"Because ATS systems act as the ",{"type":17,"tag":48,"props":55793,"children":55794},{},[55795],{"type":23,"value":55796},"system of record for hiring data",{"type":23,"value":55798},", many SaaS platforms depend on them to power recruiting workflows.",{"type":17,"tag":68,"props":55800,"children":55802},{"id":55801},"why-saas-products-integrate-with-ats-apis",[55803],{"type":23,"value":55804},"Why SaaS Products Integrate with ATS APIs",{"type":17,"tag":29,"props":55806,"children":55807},{},[55808],{"type":23,"value":55809},"Recruiting integrations unlock powerful automation across hiring workflows.",{"type":17,"tag":29,"props":55811,"children":55812},{},[55813],{"type":23,"value":12661},{"type":17,"tag":239,"props":55815,"children":55817},{"id":55816},"recruiting-analytics-and-reporting",[55818],{"type":23,"value":55819},"Recruiting analytics and reporting",{"type":17,"tag":29,"props":55821,"children":55822},{},[55823],{"type":23,"value":55824},"Pull candidate pipeline data to measure time-to-hire, conversion rates, and recruiter performance.",{"type":17,"tag":239,"props":55826,"children":55828},{"id":55827},"candidate-sourcing-tools",[55829],{"type":23,"value":55830},"Candidate sourcing tools",{"type":17,"tag":29,"props":55832,"children":55833},{},[55834],{"type":23,"value":55835},"Automatically push sourced candidates into a company's ATS pipeline.",{"type":17,"tag":239,"props":55837,"children":55839},{"id":55838},"interview-scheduling-platforms",[55840],{"type":23,"value":55841},"Interview scheduling platforms",{"type":17,"tag":29,"props":55843,"children":55844},{},[55845],{"type":23,"value":55846},"Coordinate interviewer availability and update interview events inside the ATS.",{"type":17,"tag":239,"props":55848,"children":55850},{"id":55849},"background-check-automation",[55851],{"type":23,"value":55852},"Background check automation",{"type":17,"tag":29,"props":55854,"children":55855},{},[55856],{"type":23,"value":55857},"Trigger background checks when candidates reach specific hiring stages.",{"type":17,"tag":239,"props":55859,"children":55861},{"id":55860},"recruitment-marketing",[55862],{"type":23,"value":55863},"Recruitment marketing",{"type":17,"tag":29,"props":55865,"children":55866},{},[55867],{"type":23,"value":55868},"Publish job postings to career pages and track candidate sources.",{"type":17,"tag":239,"props":55870,"children":55872},{"id":55871},"ai-recruiting-assistants",[55873],{"type":23,"value":55874},"AI recruiting assistants",{"type":17,"tag":29,"props":55876,"children":55877},{},[55878],{"type":23,"value":55879},"Analyze candidate profiles and recommend top candidates based on job requirements.",{"type":17,"tag":29,"props":55881,"children":55882},{},[55883],{"type":23,"value":55884},"As recruiting stacks expand, ATS integrations become critical infrastructure.",{"type":17,"tag":18,"props":55886,"children":55888},{"id":55887},"_15-ats-apis-developers-integrate-with",[55889],{"type":23,"value":55890},"15+ ATS APIs Developers Integrate With",{"type":17,"tag":29,"props":55892,"children":55893},{},[55894,55896,55901],{"type":23,"value":55895},"Below are some of the ",{"type":17,"tag":48,"props":55897,"children":55898},{},[55899],{"type":23,"value":55900},"most commonly integrated ATS APIs",{"type":23,"value":55902}," used by SaaS products today.",{"type":17,"tag":68,"props":55904,"children":55906},{"id":55905},"greenhouse-api",[55907],{"type":23,"value":55908},"Greenhouse API",{"type":17,"tag":29,"props":55910,"children":55911},{},[55912],{"type":17,"tag":133,"props":55913,"children":55915},{"href":52509,"rel":55914},[214],[55916],{"type":23,"value":55917},"Greenhouse Developer Docs",{"type":17,"tag":29,"props":55919,"children":55920},{},[55921],{"type":23,"value":55922},"Greenhouse is one of the most widely used enterprise ATS platforms.",{"type":17,"tag":29,"props":55924,"children":55925},{},[55926],{"type":23,"value":55927},"Its APIs provide access to:",{"type":17,"tag":80,"props":55929,"children":55930},{},[55931,55936,55941,55946,55951],{"type":17,"tag":84,"props":55932,"children":55933},{},[55934],{"type":23,"value":55935},"candidate profiles",{"type":17,"tag":84,"props":55937,"children":55938},{},[55939],{"type":23,"value":55940},"applications and job pipelines",{"type":17,"tag":84,"props":55942,"children":55943},{},[55944],{"type":23,"value":55945},"interview scheduling",{"type":17,"tag":84,"props":55947,"children":55948},{},[55949],{"type":23,"value":55950},"scorecards and feedback",{"type":17,"tag":84,"props":55952,"children":55953},{},[55954],{"type":23,"value":55955},"recruiting activity tracking",{"type":17,"tag":29,"props":55957,"children":55958},{},[55959,55961,55966],{"type":23,"value":55960},"Greenhouse integrations are common for ",{"type":17,"tag":48,"props":55962,"children":55963},{},[55964],{"type":23,"value":55965},"recruiting analytics platforms and sourcing tools",{"type":23,"value":54},{"type":17,"tag":68,"props":55968,"children":55970},{"id":55969},"lever-api",[55971],{"type":23,"value":55972},"Lever API",{"type":17,"tag":29,"props":55974,"children":55975},{},[55976],{"type":17,"tag":133,"props":55977,"children":55980},{"href":55978,"rel":55979},"https://hire.lever.co/developer",[214],[55981],{"type":23,"value":55982},"Lever Developer Portal",{"type":17,"tag":29,"props":55984,"children":55985},{},[55986],{"type":23,"value":55987},"Lever provides recruiting CRM functionality alongside traditional ATS capabilities.",{"type":17,"tag":29,"props":55989,"children":55990},{},[55991],{"type":23,"value":51467},{"type":17,"tag":80,"props":55993,"children":55994},{},[55995,56000,56004,56008,56013],{"type":17,"tag":84,"props":55996,"children":55997},{},[55998],{"type":23,"value":55999},"candidates and opportunities",{"type":17,"tag":84,"props":56001,"children":56002},{},[56003],{"type":23,"value":55718},{"type":17,"tag":84,"props":56005,"children":56006},{},[56007],{"type":23,"value":55945},{"type":17,"tag":84,"props":56009,"children":56010},{},[56011],{"type":23,"value":56012},"candidate communications",{"type":17,"tag":84,"props":56014,"children":56015},{},[56016],{"type":23,"value":56017},"recruiting pipeline stages",{"type":17,"tag":29,"props":56019,"children":56020},{},[56021,56023,56028],{"type":23,"value":56022},"Lever integrations often power ",{"type":17,"tag":48,"props":56024,"children":56025},{},[56026],{"type":23,"value":56027},"sourcing automation and recruiting CRM tools",{"type":23,"value":54},{"type":17,"tag":68,"props":56030,"children":56032},{"id":56031},"workable-api",[56033],{"type":23,"value":56034},"Workable API",{"type":17,"tag":29,"props":56036,"children":56037},{},[56038],{"type":17,"tag":133,"props":56039,"children":56042},{"href":56040,"rel":56041},"https://workable.readme.io/",[214],[56043],{"type":23,"value":56044},"Workable API Documentation",{"type":17,"tag":29,"props":56046,"children":56047},{},[56048],{"type":23,"value":56049},"Workable is widely used by SMBs and mid-market companies.",{"type":17,"tag":29,"props":56051,"children":56052},{},[56053],{"type":23,"value":56054},"Its APIs expose:",{"type":17,"tag":80,"props":56056,"children":56057},{},[56058,56063,56067,56072,56076],{"type":17,"tag":84,"props":56059,"children":56060},{},[56061],{"type":23,"value":56062},"candidate applications",{"type":17,"tag":84,"props":56064,"children":56065},{},[56066],{"type":23,"value":55718},{"type":17,"tag":84,"props":56068,"children":56069},{},[56070],{"type":23,"value":56071},"recruiting stages",{"type":17,"tag":84,"props":56073,"children":56074},{},[56075],{"type":23,"value":55945},{"type":17,"tag":84,"props":56077,"children":56078},{},[56079],{"type":23,"value":56080},"hiring team assignments",{"type":17,"tag":29,"props":56082,"children":56083},{},[56084,56086,56091],{"type":23,"value":56085},"Workable is frequently integrated into ",{"type":17,"tag":48,"props":56087,"children":56088},{},[56089],{"type":23,"value":56090},"interview platforms and recruiting analytics tools",{"type":23,"value":54},{"type":17,"tag":68,"props":56093,"children":56095},{"id":56094},"icims-api",[56096],{"type":23,"value":56097},"iCIMS API",{"type":17,"tag":29,"props":56099,"children":56100},{},[56101],{"type":17,"tag":133,"props":56102,"children":56105},{"href":56103,"rel":56104},"https://developer.icims.com/",[214],[56106],{"type":23,"value":56107},"iCIMS Developer Portal",{"type":17,"tag":29,"props":56109,"children":56110},{},[56111],{"type":23,"value":56112},"iCIMS is a large enterprise recruiting platform used by global organizations.",{"type":17,"tag":29,"props":56114,"children":56115},{},[56116],{"type":23,"value":56117},"Typical integration capabilities include:",{"type":17,"tag":80,"props":56119,"children":56120},{},[56121,56126,56131,56136,56141],{"type":17,"tag":84,"props":56122,"children":56123},{},[56124],{"type":23,"value":56125},"candidate records",{"type":17,"tag":84,"props":56127,"children":56128},{},[56129],{"type":23,"value":56130},"hiring workflows",{"type":17,"tag":84,"props":56132,"children":56133},{},[56134],{"type":23,"value":56135},"job requisitions",{"type":17,"tag":84,"props":56137,"children":56138},{},[56139],{"type":23,"value":56140},"interview management",{"type":17,"tag":84,"props":56142,"children":56143},{},[56144],{"type":23,"value":56145},"recruiting reports",{"type":17,"tag":29,"props":56147,"children":56148},{},[56149],{"type":23,"value":56150},"iCIMS integrations often require enterprise access.",{"type":17,"tag":68,"props":56152,"children":56154},{"id":56153},"smartrecruiters-api",[56155],{"type":23,"value":56156},"SmartRecruiters API",{"type":17,"tag":29,"props":56158,"children":56159},{},[56160],{"type":17,"tag":133,"props":56161,"children":56164},{"href":56162,"rel":56163},"https://dev.smartrecruiters.com/",[214],[56165],{"type":23,"value":56166},"SmartRecruiters API Docs",{"type":17,"tag":29,"props":56168,"children":56169},{},[56170],{"type":23,"value":56171},"SmartRecruiters provides enterprise recruiting infrastructure.",{"type":17,"tag":29,"props":56173,"children":56174},{},[56175],{"type":23,"value":56176},"Common API capabilities include:",{"type":17,"tag":80,"props":56178,"children":56179},{},[56180,56185,56190,56194,56198],{"type":17,"tag":84,"props":56181,"children":56182},{},[56183],{"type":23,"value":56184},"job posting distribution",{"type":17,"tag":84,"props":56186,"children":56187},{},[56188],{"type":23,"value":56189},"candidate pipelines",{"type":17,"tag":84,"props":56191,"children":56192},{},[56193],{"type":23,"value":55945},{"type":17,"tag":84,"props":56195,"children":56196},{},[56197],{"type":23,"value":56130},{"type":17,"tag":84,"props":56199,"children":56200},{},[56201],{"type":23,"value":56202},"recruiting analytics",{"type":17,"tag":68,"props":56204,"children":56206},{"id":56205},"jobvite-api",[56207],{"type":23,"value":56208},"Jobvite API",{"type":17,"tag":29,"props":56210,"children":56211},{},[56212],{"type":17,"tag":133,"props":56213,"children":56216},{"href":56214,"rel":56215},"https://developer.jobvite.com/",[214],[56217],{"type":23,"value":56218},"Jobvite Developer Docs",{"type":17,"tag":29,"props":56220,"children":56221},{},[56222],{"type":23,"value":56223},"Jobvite offers recruiting automation and talent acquisition tools.",{"type":17,"tag":29,"props":56225,"children":56226},{},[56227],{"type":23,"value":49920},{"type":17,"tag":80,"props":56229,"children":56230},{},[56231,56236,56241,56245],{"type":17,"tag":84,"props":56232,"children":56233},{},[56234],{"type":23,"value":56235},"candidate management",{"type":17,"tag":84,"props":56237,"children":56238},{},[56239],{"type":23,"value":56240},"recruiting workflows",{"type":17,"tag":84,"props":56242,"children":56243},{},[56244],{"type":23,"value":56135},{"type":17,"tag":84,"props":56246,"children":56247},{},[56248],{"type":23,"value":56249},"applicant pipelines",{"type":17,"tag":68,"props":56251,"children":56253},{"id":56252},"jazzhr-api",[56254],{"type":23,"value":56255},"JazzHR API",{"type":17,"tag":29,"props":56257,"children":56258},{},[56259],{"type":17,"tag":133,"props":56260,"children":56263},{"href":56261,"rel":56262},"https://api.jazzhr.com/",[214],[56264],{"type":23,"value":56265},"JazzHR Developer Docs",{"type":17,"tag":29,"props":56267,"children":56268},{},[56269],{"type":23,"value":56270},"JazzHR focuses on SMB recruiting teams.",{"type":17,"tag":29,"props":56272,"children":56273},{},[56274],{"type":23,"value":53837},{"type":17,"tag":80,"props":56276,"children":56277},{},[56278,56282,56287,56292],{"type":17,"tag":84,"props":56279,"children":56280},{},[56281],{"type":23,"value":56062},{"type":17,"tag":84,"props":56283,"children":56284},{},[56285],{"type":23,"value":56286},"job listings",{"type":17,"tag":84,"props":56288,"children":56289},{},[56290],{"type":23,"value":56291},"hiring pipelines",{"type":17,"tag":84,"props":56293,"children":56294},{},[56295],{"type":23,"value":55945},{"type":17,"tag":68,"props":56297,"children":56299},{"id":56298},"ashby-api",[56300],{"type":23,"value":56301},"Ashby API",{"type":17,"tag":29,"props":56303,"children":56304},{},[56305],{"type":17,"tag":133,"props":56306,"children":56309},{"href":56307,"rel":56308},"https://www.ashbyhq.com/",[214],[56310],{"type":23,"value":56311},"Ashby Recruiting",{"type":17,"tag":29,"props":56313,"children":56314},{},[56315],{"type":23,"value":56316},"Ashby is a modern ATS built with an API-first architecture.",{"type":17,"tag":29,"props":56318,"children":56319},{},[56320],{"type":23,"value":54827},{"type":17,"tag":80,"props":56322,"children":56323},{},[56324,56328,56333,56337],{"type":17,"tag":84,"props":56325,"children":56326},{},[56327],{"type":23,"value":56202},{"type":17,"tag":84,"props":56329,"children":56330},{},[56331],{"type":23,"value":56332},"sourcing automation",{"type":17,"tag":84,"props":56334,"children":56335},{},[56336],{"type":23,"value":55945},{"type":17,"tag":84,"props":56338,"children":56339},{},[56340],{"type":23,"value":55748},{"type":17,"tag":29,"props":56342,"children":56343},{},[56344],{"type":23,"value":56345},"Ashby is becoming increasingly popular with startups.",{"type":17,"tag":68,"props":56347,"children":56349},{"id":56348},"breezyhr-api",[56350],{"type":23,"value":56351},"BreezyHR API",{"type":17,"tag":29,"props":56353,"children":56354},{},[56355],{"type":17,"tag":133,"props":56356,"children":56359},{"href":56357,"rel":56358},"https://breezy.hr/",[214],[56360],{"type":23,"value":56361},"BreezyHR",{"type":17,"tag":29,"props":56363,"children":56364},{},[56365],{"type":23,"value":56366},"BreezyHR offers recruiting automation and candidate pipeline tools.",{"type":17,"tag":29,"props":56368,"children":56369},{},[56370],{"type":23,"value":56371},"Its APIs enable:",{"type":17,"tag":80,"props":56373,"children":56374},{},[56375,56380,56385,56389],{"type":17,"tag":84,"props":56376,"children":56377},{},[56378],{"type":23,"value":56379},"job management",{"type":17,"tag":84,"props":56381,"children":56382},{},[56383],{"type":23,"value":56384},"candidate tracking",{"type":17,"tag":84,"props":56386,"children":56387},{},[56388],{"type":23,"value":55945},{"type":17,"tag":84,"props":56390,"children":56391},{},[56392],{"type":23,"value":56240},{"type":17,"tag":68,"props":56394,"children":56396},{"id":56395},"teamtailor-api",[56397],{"type":23,"value":56398},"Teamtailor API",{"type":17,"tag":29,"props":56400,"children":56401},{},[56402],{"type":17,"tag":133,"props":56403,"children":56406},{"href":56404,"rel":56405},"https://developers.teamtailor.com/",[214],[56407],{"type":23,"value":56408},"Teamtailor Developer Docs",{"type":17,"tag":29,"props":56410,"children":56411},{},[56412],{"type":23,"value":56413},"Teamtailor provides recruiting tools used heavily in Europe.",{"type":17,"tag":29,"props":56415,"children":56416},{},[56417],{"type":23,"value":54827},{"type":17,"tag":80,"props":56419,"children":56420},{},[56421,56425,56429,56434],{"type":17,"tag":84,"props":56422,"children":56423},{},[56424],{"type":23,"value":55718},{"type":17,"tag":84,"props":56426,"children":56427},{},[56428],{"type":23,"value":56189},{"type":17,"tag":84,"props":56430,"children":56431},{},[56432],{"type":23,"value":56433},"recruiting automation",{"type":17,"tag":84,"props":56435,"children":56436},{},[56437],{"type":23,"value":56438},"hiring analytics",{"type":17,"tag":68,"props":56440,"children":56442},{"id":56441},"workday-recruiting-api",[56443],{"type":23,"value":56444},"Workday Recruiting API",{"type":17,"tag":29,"props":56446,"children":56447},{},[56448],{"type":17,"tag":133,"props":56449,"children":56451},{"href":55031,"rel":56450},[214],[56452],{"type":23,"value":55035},{"type":17,"tag":29,"props":56454,"children":56455},{},[56456],{"type":23,"value":56457},"Workday provides recruiting infrastructure alongside HR and payroll.",{"type":17,"tag":29,"props":56459,"children":56460},{},[56461],{"type":23,"value":56462},"Its recruiting APIs expose:",{"type":17,"tag":80,"props":56464,"children":56465},{},[56466,56470,56474,56478],{"type":17,"tag":84,"props":56467,"children":56468},{},[56469],{"type":23,"value":56135},{"type":17,"tag":84,"props":56471,"children":56472},{},[56473],{"type":23,"value":56062},{"type":17,"tag":84,"props":56475,"children":56476},{},[56477],{"type":23,"value":56291},{"type":17,"tag":84,"props":56479,"children":56480},{},[56481],{"type":23,"value":56240},{"type":17,"tag":68,"props":56483,"children":56485},{"id":56484},"oracle-taleo-api",[56486],{"type":23,"value":56487},"Oracle Taleo API",{"type":17,"tag":29,"props":56489,"children":56490},{},[56491],{"type":17,"tag":133,"props":56492,"children":56495},{"href":56493,"rel":56494},"https://www.oracle.com/human-capital-management/",[214],[56496],{"type":23,"value":56497},"Oracle Taleo",{"type":17,"tag":29,"props":56499,"children":56500},{},[56501],{"type":23,"value":56502},"Oracle Taleo remains widely used by large enterprises.",{"type":17,"tag":29,"props":56504,"children":56505},{},[56506],{"type":23,"value":54827},{"type":17,"tag":80,"props":56508,"children":56509},{},[56510,56514,56518],{"type":17,"tag":84,"props":56511,"children":56512},{},[56513],{"type":23,"value":56062},{"type":17,"tag":84,"props":56515,"children":56516},{},[56517],{"type":23,"value":55748},{"type":17,"tag":84,"props":56519,"children":56520},{},[56521],{"type":23,"value":56130},{"type":17,"tag":68,"props":56523,"children":56525},{"id":56524},"additional-ats-platforms",[56526],{"type":23,"value":56527},"Additional ATS Platforms",{"type":17,"tag":29,"props":56529,"children":56530},{},[56531],{"type":23,"value":56532},"Many other ATS platforms are commonly integrated by SaaS products, including:",{"type":17,"tag":80,"props":56534,"children":56535},{},[56536,56546,56555,56565,56575,56585,56595,56605,56615,56625,56635],{"type":17,"tag":84,"props":56537,"children":56538},{},[56539],{"type":17,"tag":133,"props":56540,"children":56543},{"href":56541,"rel":56542},"https://www.lever.co/",[214],[56544],{"type":23,"value":56545},"Lever",{"type":17,"tag":84,"props":56547,"children":56548},{},[56549],{"type":17,"tag":133,"props":56550,"children":56553},{"href":56551,"rel":56552},"https://www.greenhouse.io/",[214],[56554],{"type":23,"value":3189},{"type":17,"tag":84,"props":56556,"children":56557},{},[56558],{"type":17,"tag":133,"props":56559,"children":56562},{"href":56560,"rel":56561},"https://www.workable.com/",[214],[56563],{"type":23,"value":56564},"Workable",{"type":17,"tag":84,"props":56566,"children":56567},{},[56568],{"type":17,"tag":133,"props":56569,"children":56572},{"href":56570,"rel":56571},"https://www.teamtailor.com/",[214],[56573],{"type":23,"value":56574},"Teamtailor",{"type":17,"tag":84,"props":56576,"children":56577},{},[56578],{"type":17,"tag":133,"props":56579,"children":56582},{"href":56580,"rel":56581},"https://recruitee.com/",[214],[56583],{"type":23,"value":56584},"Recruitee",{"type":17,"tag":84,"props":56586,"children":56587},{},[56588],{"type":17,"tag":133,"props":56589,"children":56592},{"href":56590,"rel":56591},"https://recruitcrm.io/",[214],[56593],{"type":23,"value":56594},"RecruitCRM",{"type":17,"tag":84,"props":56596,"children":56597},{},[56598],{"type":17,"tag":133,"props":56599,"children":56602},{"href":56600,"rel":56601},"https://www.manatal.com/",[214],[56603],{"type":23,"value":56604},"Manatal",{"type":17,"tag":84,"props":56606,"children":56607},{},[56608],{"type":17,"tag":133,"props":56609,"children":56612},{"href":56610,"rel":56611},"https://loxo.co/",[214],[56613],{"type":23,"value":56614},"Loxo",{"type":17,"tag":84,"props":56616,"children":56617},{},[56618],{"type":17,"tag":133,"props":56619,"children":56622},{"href":56620,"rel":56621},"https://www.pinpointhq.com/",[214],[56623],{"type":23,"value":56624},"Pinpoint",{"type":17,"tag":84,"props":56626,"children":56627},{},[56628],{"type":17,"tag":133,"props":56629,"children":56632},{"href":56630,"rel":56631},"https://www.tribepad.com/",[214],[56633],{"type":23,"value":56634},"Tribepad",{"type":17,"tag":84,"props":56636,"children":56637},{},[56638],{"type":17,"tag":133,"props":56639,"children":56642},{"href":56640,"rel":56641},"https://www.vincere.io/",[214],[56643],{"type":23,"value":56644},"Vincere",{"type":17,"tag":29,"props":56646,"children":56647},{},[56648,56650,56655],{"type":23,"value":56649},"The recruiting ecosystem is highly fragmented, which means supporting customers often requires ",{"type":17,"tag":48,"props":56651,"children":56652},{},[56653],{"type":23,"value":56654},"integrating dozens of ATS platforms simultaneously",{"type":23,"value":54},{"type":17,"tag":18,"props":56657,"children":56659},{"id":56658},"challenges-when-integrating-ats-apis",[56660],{"type":23,"value":56661},"Challenges When Integrating ATS APIs",{"type":17,"tag":29,"props":56663,"children":56664},{},[56665],{"type":23,"value":56666},"Integrating recruiting platforms directly introduces several engineering challenges.",{"type":17,"tag":239,"props":56668,"children":56670},{"id":56669},"different-authentication-systems",[56671],{"type":23,"value":50525},{"type":17,"tag":29,"props":56673,"children":56674},{},[56675,56677,56681],{"type":23,"value":56676},"Some ATS platforms use ",{"type":17,"tag":133,"props":56678,"children":56679},{"href":779},[56680],{"type":23,"value":782},{"type":23,"value":56682}," while others rely on API keys or enterprise authentication flows.",{"type":17,"tag":239,"props":56684,"children":56686},{"id":56685},"inconsistent-candidate-data-models",[56687],{"type":23,"value":56688},"Inconsistent candidate data models",{"type":17,"tag":29,"props":56690,"children":56691},{},[56692],{"type":23,"value":56693},"Candidate records, applications, and pipeline stages vary widely between vendors.",{"type":17,"tag":239,"props":56695,"children":56697},{"id":56696},"webhook-and-event-differences",[56698],{"type":23,"value":56699},"Webhook and event differences",{"type":17,"tag":29,"props":56701,"children":56702},{},[56703,56705,56709],{"type":23,"value":56704},"Some platforms support real-time ",{"type":17,"tag":133,"props":56706,"children":56707},{"href":4999},[56708],{"type":23,"value":5002},{"type":23,"value":56710}," while others require polling.",{"type":17,"tag":239,"props":56712,"children":56714},{"id":56713},"api-version-changes",[56715],{"type":23,"value":56716},"API version changes",{"type":17,"tag":29,"props":56718,"children":56719},{},[56720],{"type":23,"value":56721},"Recruiting platforms frequently update APIs and deprecate endpoints.",{"type":17,"tag":239,"props":56723,"children":56725},{"id":56724},"compliance-and-candidate-data",[56726],{"type":23,"value":56727},"Compliance and candidate data",{"type":17,"tag":29,"props":56729,"children":56730},{},[56731],{"type":23,"value":56732},"Candidate records often include sensitive personal information that must be handled securely.",{"type":17,"tag":29,"props":56734,"children":56735},{},[56736],{"type":23,"value":56737},"As companies support more ATS integrations, this complexity grows exponentially.",{"type":17,"tag":18,"props":56739,"children":56741},{"id":56740},"the-role-of-unified-ats-apis",[56742],{"type":23,"value":56743},"The Role of Unified ATS APIs",{"type":17,"tag":29,"props":56745,"children":56746},{},[56747,56749,56754],{"type":23,"value":56748},"To reduce integration complexity, many SaaS platforms adopt ",{"type":17,"tag":48,"props":56750,"children":56751},{},[56752],{"type":23,"value":56753},"Unified ATS APIs",{"type":23,"value":54},{"type":17,"tag":29,"props":56756,"children":56757},{},[56758],{"type":23,"value":56759},"A unified API standardizes recruiting data models and authentication across multiple ATS providers.",{"type":17,"tag":29,"props":56761,"children":56762},{},[56763],{"type":23,"value":56764},"Instead of building separate integrations for Greenhouse, Lever, Workable, Jobvite, and dozens of others, developers integrate once and support many recruiting systems.",{"type":17,"tag":29,"props":56766,"children":56767},{},[56768],{"type":23,"value":56769},"Unified APIs typically provide:",{"type":17,"tag":80,"props":56771,"children":56772},{},[56773,56777,56781,56786,56791],{"type":17,"tag":84,"props":56774,"children":56775},{},[56776],{"type":23,"value":52961},{"type":17,"tag":84,"props":56778,"children":56779},{},[56780],{"type":23,"value":53979},{"type":17,"tag":84,"props":56782,"children":56783},{},[56784],{"type":23,"value":56785},"standardized endpoints",{"type":17,"tag":84,"props":56787,"children":56788},{},[56789],{"type":23,"value":56790},"unified webhooks",{"type":17,"tag":84,"props":56792,"children":56793},{},[56794],{"type":23,"value":51948},{"type":17,"tag":29,"props":56796,"children":56797},{},[56798],{"type":23,"value":56799},"This dramatically reduces integration maintenance.",{"type":17,"tag":18,"props":56801,"children":56803},{"id":56802},"build-once-with-the-unified-ats-api",[56804],{"type":23,"value":56805},"Build Once with the Unified ATS API",{"type":17,"tag":29,"props":56807,"children":56808},{},[56809,56810,56820,56822,56827],{"type":23,"value":6712},{"type":17,"tag":133,"props":56811,"children":56814},{"href":56812,"rel":56813},"https://unified.to/ats",[214],[56815],{"type":17,"tag":48,"props":56816,"children":56817},{},[56818],{"type":23,"value":56819},"Unified ATS API",{"type":23,"value":56821}," allows developers to access recruiting data across ",{"type":17,"tag":48,"props":56823,"children":56824},{},[56825],{"type":23,"value":56826},"73+ ATS integrations",{"type":23,"value":56828}," through a single API.",{"type":17,"tag":29,"props":56830,"children":56831},{},[56832],{"type":23,"value":56833},"Unified normalizes hiring data across platforms like Greenhouse, Lever, Workable, SmartRecruiters, and many others.",{"type":17,"tag":68,"props":56835,"children":56837},{"id":56836},"unified-ats-data-objects",[56838],{"type":23,"value":56839},"Unified ATS Data Objects",{"type":17,"tag":29,"props":56841,"children":56842},{},[56843],{"type":23,"value":56844},"Unified provides standardized recruiting objects across all ATS platforms:",{"type":17,"tag":29,"props":56846,"children":56847},{},[56848],{"type":17,"tag":48,"props":56849,"children":56850},{},[56851],{"type":23,"value":56852},"Candidates",{"type":17,"tag":29,"props":56854,"children":56855},{},[56856],{"type":23,"value":56857},"Applicant profiles and recruiting information.",{"type":17,"tag":29,"props":56859,"children":56860},{},[56861],{"type":17,"tag":48,"props":56862,"children":56863},{},[56864],{"type":23,"value":56865},"Jobs",{"type":17,"tag":29,"props":56867,"children":56868},{},[56869],{"type":23,"value":56870},"Job postings and requisitions.",{"type":17,"tag":29,"props":56872,"children":56873},{},[56874],{"type":17,"tag":48,"props":56875,"children":56876},{},[56877],{"type":23,"value":56878},"Applications",{"type":17,"tag":29,"props":56880,"children":56881},{},[56882],{"type":23,"value":56883},"Candidate submissions to jobs.",{"type":17,"tag":29,"props":56885,"children":56886},{},[56887],{"type":17,"tag":48,"props":56888,"children":56889},{},[56890],{"type":23,"value":56891},"Interviews",{"type":17,"tag":29,"props":56893,"children":56894},{},[56895],{"type":23,"value":56896},"Interview schedules and interviewer assignments.",{"type":17,"tag":29,"props":56898,"children":56899},{},[56900],{"type":17,"tag":48,"props":56901,"children":56902},{},[56903],{"type":23,"value":56904},"Activities",{"type":17,"tag":29,"props":56906,"children":56907},{},[56908],{"type":23,"value":56909},"Notes, communications, and recruiting interactions.",{"type":17,"tag":29,"props":56911,"children":56912},{},[56913],{"type":17,"tag":48,"props":56914,"children":56915},{},[56916],{"type":23,"value":56917},"Scorecards",{"type":17,"tag":29,"props":56919,"children":56920},{},[56921],{"type":23,"value":56922},"Interview feedback and evaluation forms.",{"type":17,"tag":29,"props":56924,"children":56925},{},[56926],{"type":17,"tag":48,"props":56927,"children":56928},{},[56929],{"type":23,"value":56930},"Documents",{"type":17,"tag":29,"props":56932,"children":56933},{},[56934],{"type":23,"value":56935},"Resumes, cover letters, and attachments.",{"type":17,"tag":29,"props":56937,"children":56938},{},[56939],{"type":17,"tag":48,"props":56940,"children":56941},{},[56942],{"type":23,"value":56943},"Companies",{"type":17,"tag":29,"props":56945,"children":56946},{},[56947],{"type":23,"value":56948},"Organizations related to recruiting workflows.",{"type":17,"tag":29,"props":56950,"children":56951},{},[56952],{"type":23,"value":24022},{"type":17,"tag":80,"props":56954,"children":56955},{},[56956,56960,56964,56968,56972],{"type":17,"tag":84,"props":56957,"children":56958},{},[56959],{"type":23,"value":11254},{"type":17,"tag":84,"props":56961,"children":56962},{},[56963],{"type":23,"value":11243},{"type":17,"tag":84,"props":56965,"children":56966},{},[56967],{"type":23,"value":24038},{"type":17,"tag":84,"props":56969,"children":56970},{},[56971],{"type":23,"value":11845},{"type":17,"tag":84,"props":56973,"children":56974},{},[56975],{"type":23,"value":11852},{"type":17,"tag":29,"props":56977,"children":56978},{},[56979],{"type":23,"value":56980},"This allows SaaS products to build recruiting features once and support dozens of ATS providers.",{"type":17,"tag":68,"props":56982,"children":56984},{"id":56983},"real-time-recruiting-data",[56985],{"type":23,"value":56986},"Real-Time Recruiting Data",{"type":17,"tag":29,"props":56988,"children":56989},{},[56990,56991,56995],{"type":23,"value":24080},{"type":17,"tag":48,"props":56992,"children":56993},{},[56994],{"type":23,"value":50812},{"type":23,"value":54},{"type":17,"tag":29,"props":56997,"children":56998},{},[56999],{"type":23,"value":57000},"Every request is routed directly to the underlying ATS system.",{"type":17,"tag":29,"props":57002,"children":57003},{},[57004],{"type":23,"value":7403},{"type":17,"tag":80,"props":57006,"children":57007},{},[57008,57013,57018,57023],{"type":17,"tag":84,"props":57009,"children":57010},{},[57011],{"type":23,"value":57012},"no cached candidate data",{"type":17,"tag":84,"props":57014,"children":57015},{},[57016],{"type":23,"value":57017},"no scheduled sync jobs",{"type":17,"tag":84,"props":57019,"children":57020},{},[57021],{"type":23,"value":57022},"real-time pipeline updates",{"type":17,"tag":84,"props":57024,"children":57025},{},[57026],{"type":23,"value":57027},"instant recruiting workflow automation",{"type":17,"tag":68,"props":57029,"children":57030},{"id":17064},[57031],{"type":23,"value":53239},{"type":17,"tag":29,"props":57033,"children":57034},{},[57035],{"type":23,"value":57036},"Unified never stores candidate data.",{"type":17,"tag":29,"props":57038,"children":57039},{},[57040],{"type":23,"value":57041},"All requests are stateless and routed directly to ATS providers.",{"type":17,"tag":29,"props":57043,"children":57044},{},[57045,57047,57052],{"type":23,"value":57046},"This architecture reduces compliance scope for platforms handling ",{"type":17,"tag":48,"props":57048,"children":57049},{},[57050],{"type":23,"value":57051},"sensitive recruiting information",{"type":23,"value":54},{"type":17,"tag":18,"props":57054,"children":57055},{"id":1552},[57056],{"type":23,"value":44411},{"type":17,"tag":29,"props":57058,"children":57059},{},[57060],{"type":23,"value":57061},"ATS APIs power modern recruiting software, enabling everything from sourcing tools to recruiting analytics platforms.",{"type":17,"tag":29,"props":57063,"children":57064},{},[57065],{"type":23,"value":57066},"However, integrating recruiting platforms individually quickly becomes a complex engineering challenge.",{"type":17,"tag":29,"props":57068,"children":57069},{},[57070,57072,57076],{"type":23,"value":57071},"As the recruiting ecosystem continues to grow, many SaaS companies are adopting ",{"type":17,"tag":48,"props":57073,"children":57074},{},[57075],{"type":23,"value":56753},{"type":23,"value":57077}," to simplify integrations and support dozens of recruiting systems through a single integration layer.",{"type":17,"tag":29,"props":57079,"children":57080},{},[57081,57083,57088],{"type":23,"value":57082},"If your product connects to recruiting tools, unified APIs make it possible to support ",{"type":17,"tag":48,"props":57084,"children":57085},{},[57086],{"type":23,"value":57087},"Greenhouse, Lever, Workable, and many other ATS platforms",{"type":23,"value":57089}," without maintaining separate integrations for each provider.",{"type":17,"tag":29,"props":57091,"children":57092},{},[57093],{"type":17,"tag":133,"props":57094,"children":57096},{"href":1612,"rel":57095},[214],[57097],{"type":23,"value":44481},{"type":17,"tag":29,"props":57099,"children":57100},{},[57101],{"type":17,"tag":133,"props":57102,"children":57104},{"href":1623,"rel":57103},[214],[57105],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":57107},[57108,57109,57117,57118,57119,57120,57121,57122,57123,57124,57125,57126,57127,57128,57129,57136,57137,57138],{"id":55683,"depth":1629,"text":55686},{"id":55801,"depth":1629,"text":55804,"children":57110},[57111,57112,57113,57114,57115,57116],{"id":55816,"depth":1635,"text":55819},{"id":55827,"depth":1635,"text":55830},{"id":55838,"depth":1635,"text":55841},{"id":55849,"depth":1635,"text":55852},{"id":55860,"depth":1635,"text":55863},{"id":55871,"depth":1635,"text":55874},{"id":55905,"depth":1629,"text":55908},{"id":55969,"depth":1629,"text":55972},{"id":56031,"depth":1629,"text":56034},{"id":56094,"depth":1629,"text":56097},{"id":56153,"depth":1629,"text":56156},{"id":56205,"depth":1629,"text":56208},{"id":56252,"depth":1629,"text":56255},{"id":56298,"depth":1629,"text":56301},{"id":56348,"depth":1629,"text":56351},{"id":56395,"depth":1629,"text":56398},{"id":56441,"depth":1629,"text":56444},{"id":56484,"depth":1629,"text":56487},{"id":56524,"depth":1629,"text":56527,"children":57130},[57131,57132,57133,57134,57135],{"id":56669,"depth":1635,"text":50525},{"id":56685,"depth":1635,"text":56688},{"id":56696,"depth":1635,"text":56699},{"id":56713,"depth":1635,"text":56716},{"id":56724,"depth":1635,"text":56727},{"id":56836,"depth":1629,"text":56839},{"id":56983,"depth":1629,"text":56986},{"id":17064,"depth":1629,"text":53239},"content:blog:15_ats_apis_to_integrate_with_in_2026_greenhouse_lever_workable.md","blog/15_ats_apis_to_integrate_with_in_2026_greenhouse_lever_workable.md","blog/15_ats_apis_to_integrate_with_in_2026_greenhouse_lever_workable",{"_path":57143,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":57144,"description":57145,"img":57146,"date":57147,"tag":12,"body":57148,"_type":1677,"_id":58491,"_source":1679,"_file":58492,"_stem":58493,"_extension":1682},"/blog/15_workforce_management_apis_to_integrate_with_in_2026_ukg_deputy_humanforce","15 Workforce Management APIs to Integrate With in 2026: UKG, Deputy, Humanforce","Workforce management platforms help companies coordinate scheduling, time tracking, shift management, attendance, and labor compliance. For SaaS platforms that...","https://s3.us-east-2.amazonaws.com/unified-article-images/15_workforce_management_apis_to_integrate_with_in_2026_ukg_deputy_humanforce-icon.png","2026-03-11T15:57:00.000Z",{"type":14,"children":57149,"toc":58454},[57150,57155,57158,57165,57170,57181,57186,57197,57203,57214,57218,57261,57266,57299,57311,57317,57322,57326,57332,57337,57343,57348,57354,57359,57365,57370,57376,57381,57387,57392,57404,57410,57420,57426,57436,57447,57451,57477,57482,57488,57498,57503,57507,57534,57539,57545,57555,57560,57564,57591,57597,57607,57612,57616,57642,57648,57658,57663,57668,57690,57696,57704,57709,57713,57739,57745,57755,57760,57765,57787,57793,57803,57808,57812,57832,57838,57843,57926,57937,57943,57948,58009,58014,58020,58025,58031,58036,58040,58051,58057,58067,58073,58084,58090,58095,58100,58106,58118,58123,58150,58155,58161,58166,58188,58199,58204,58214,58226,58232,58237,58284,58289,58312,58317,58323,58332,58337,58341,58359,58364,58369,58374,58379,58396,58401,58405,58410,58415,58427,58438,58446],{"type":17,"tag":18,"props":57151,"children":57153},{"id":57152},"_15-workforce-management-apis-to-integrate-with-in-2026-ukg-deputy-humanforce",[57154],{"type":23,"value":57144},{"type":17,"tag":25,"props":57156,"children":57157},{},[],{"type":17,"tag":29,"props":57159,"children":57160},{},[57161],{"type":17,"tag":33,"props":57162,"children":57163},{},[57164],{"type":23,"value":49465},{"type":17,"tag":29,"props":57166,"children":57167},{},[57168],{"type":23,"value":57169},"Workforce management platforms help companies coordinate scheduling, time tracking, shift management, attendance, and labor compliance. For SaaS platforms that serve HR, operations, payroll, or analytics workflows, integrating with workforce systems has become increasingly important.",{"type":17,"tag":29,"props":57171,"children":57172},{},[57173,57175,57180],{"type":23,"value":57174},"These platforms sit between HR systems and payroll infrastructure, managing the operational side of labor: ",{"type":17,"tag":48,"props":57176,"children":57177},{},[57178],{"type":23,"value":57179},"who is working, when they are working, and how labor costs are calculated",{"type":23,"value":54},{"type":17,"tag":29,"props":57182,"children":57183},{},[57184],{"type":23,"value":57185},"But like most enterprise systems, workforce management software exposes different APIs, authentication systems, and data models. Supporting multiple workforce platforms quickly becomes an engineering challenge.",{"type":17,"tag":29,"props":57187,"children":57188},{},[57189,57190,57195],{"type":23,"value":12584},{"type":17,"tag":48,"props":57191,"children":57192},{},[57193],{"type":23,"value":57194},"15+ workforce management APIs developers commonly integrate with",{"type":23,"value":57196},", the challenges of building workforce integrations, and how unified APIs simplify workforce connectivity across many providers.",{"type":17,"tag":68,"props":57198,"children":57200},{"id":57199},"what-is-a-workforce-management-api",[57201],{"type":23,"value":57202},"What Is a Workforce Management API?",{"type":17,"tag":29,"props":57204,"children":57205},{},[57206,57207,57212],{"type":23,"value":9619},{"type":17,"tag":48,"props":57208,"children":57209},{},[57210],{"type":23,"value":57211},"workforce management API",{"type":23,"value":57213}," allows applications to programmatically access operational labor data from scheduling and workforce platforms.",{"type":17,"tag":29,"props":57215,"children":57216},{},[57217],{"type":23,"value":54436},{"type":17,"tag":80,"props":57219,"children":57220},{},[57221,57226,57231,57236,57241,57246,57251,57256],{"type":17,"tag":84,"props":57222,"children":57223},{},[57224],{"type":23,"value":57225},"employee schedules",{"type":17,"tag":84,"props":57227,"children":57228},{},[57229],{"type":23,"value":57230},"shift assignments",{"type":17,"tag":84,"props":57232,"children":57233},{},[57234],{"type":23,"value":57235},"time tracking and attendance",{"type":17,"tag":84,"props":57237,"children":57238},{},[57239],{"type":23,"value":57240},"clock-in / clock-out records",{"type":17,"tag":84,"props":57242,"children":57243},{},[57244],{"type":23,"value":57245},"workforce planning data",{"type":17,"tag":84,"props":57247,"children":57248},{},[57249],{"type":23,"value":57250},"labor cost reporting",{"type":17,"tag":84,"props":57252,"children":57253},{},[57254],{"type":23,"value":57255},"PTO and leave requests",{"type":17,"tag":84,"props":57257,"children":57258},{},[57259],{"type":23,"value":57260},"staffing and capacity planning",{"type":17,"tag":29,"props":57262,"children":57263},{},[57264],{"type":23,"value":57265},"Workforce APIs enable SaaS products to automate operational workflows such as:",{"type":17,"tag":80,"props":57267,"children":57268},{},[57269,57274,57279,57284,57289,57294],{"type":17,"tag":84,"props":57270,"children":57271},{},[57272],{"type":23,"value":57273},"employee shift scheduling",{"type":17,"tag":84,"props":57275,"children":57276},{},[57277],{"type":23,"value":57278},"labor cost analytics",{"type":17,"tag":84,"props":57280,"children":57281},{},[57282],{"type":23,"value":57283},"time tracking automation",{"type":17,"tag":84,"props":57285,"children":57286},{},[57287],{"type":23,"value":57288},"workforce forecasting",{"type":17,"tag":84,"props":57290,"children":57291},{},[57292],{"type":23,"value":57293},"payroll synchronization",{"type":17,"tag":84,"props":57295,"children":57296},{},[57297],{"type":23,"value":57298},"operational reporting",{"type":17,"tag":29,"props":57300,"children":57301},{},[57302,57304,57309],{"type":23,"value":57303},"Because workforce data connects directly to payroll and HR systems, workforce APIs are often used alongside ",{"type":17,"tag":48,"props":57305,"children":57306},{},[57307],{"type":23,"value":57308},"HRIS APIs and payroll APIs",{"type":23,"value":57310}," to power end-to-end workforce automation.",{"type":17,"tag":68,"props":57312,"children":57314},{"id":57313},"why-saas-products-integrate-with-workforce-management-apis",[57315],{"type":23,"value":57316},"Why SaaS Products Integrate with Workforce Management APIs",{"type":17,"tag":29,"props":57318,"children":57319},{},[57320],{"type":23,"value":57321},"Workforce integrations power many modern SaaS features across HR tech, operations tools, and analytics platforms.",{"type":17,"tag":29,"props":57323,"children":57324},{},[57325],{"type":23,"value":12661},{"type":17,"tag":239,"props":57327,"children":57329},{"id":57328},"time-tracking-and-attendance-automation",[57330],{"type":23,"value":57331},"Time tracking and attendance automation",{"type":17,"tag":29,"props":57333,"children":57334},{},[57335],{"type":23,"value":57336},"Capture employee clock-ins, shift completions, and overtime hours automatically.",{"type":17,"tag":239,"props":57338,"children":57340},{"id":57339},"workforce-planning-tools",[57341],{"type":23,"value":57342},"Workforce planning tools",{"type":17,"tag":29,"props":57344,"children":57345},{},[57346],{"type":23,"value":57347},"Use scheduling and staffing data to forecast labor demand and optimize staffing levels.",{"type":17,"tag":239,"props":57349,"children":57351},{"id":57350},"payroll-synchronization",[57352],{"type":23,"value":57353},"Payroll synchronization",{"type":17,"tag":29,"props":57355,"children":57356},{},[57357],{"type":23,"value":57358},"Sync shift data and time tracking information directly into payroll systems.",{"type":17,"tag":239,"props":57360,"children":57362},{"id":57361},"labor-analytics-and-reporting",[57363],{"type":23,"value":57364},"Labor analytics and reporting",{"type":17,"tag":29,"props":57366,"children":57367},{},[57368],{"type":23,"value":57369},"Analyze workforce utilization, labor costs, and staffing efficiency.",{"type":17,"tag":239,"props":57371,"children":57373},{"id":57372},"employee-scheduling-automation",[57374],{"type":23,"value":57375},"Employee scheduling automation",{"type":17,"tag":29,"props":57377,"children":57378},{},[57379],{"type":23,"value":57380},"Allow managers to generate and update schedules programmatically.",{"type":17,"tag":239,"props":57382,"children":57384},{"id":57383},"compliance-and-labor-regulation-tracking",[57385],{"type":23,"value":57386},"Compliance and labor regulation tracking",{"type":17,"tag":29,"props":57388,"children":57389},{},[57390],{"type":23,"value":57391},"Track overtime rules, break requirements, and labor regulations automatically.",{"type":17,"tag":29,"props":57393,"children":57394},{},[57395,57397,57402],{"type":23,"value":57396},"Because workforce platforms often sit ",{"type":17,"tag":48,"props":57398,"children":57399},{},[57400],{"type":23,"value":57401},"between HR systems and payroll systems",{"type":23,"value":57403},", integrations are critical for operational automation.",{"type":17,"tag":68,"props":57405,"children":57407},{"id":57406},"_15-workforce-management-apis-developers-integrate-with",[57408],{"type":23,"value":57409},"15+ Workforce Management APIs Developers Integrate With",{"type":17,"tag":29,"props":57411,"children":57412},{},[57413,57414,57419],{"type":23,"value":55895},{"type":17,"tag":48,"props":57415,"children":57416},{},[57417],{"type":23,"value":57418},"most commonly integrated workforce management APIs",{"type":23,"value":55902},{"type":17,"tag":239,"props":57421,"children":57423},{"id":57422},"ukg-api-ultimate-kronos-group",[57424],{"type":23,"value":57425},"UKG API (Ultimate Kronos Group)",{"type":17,"tag":29,"props":57427,"children":57428},{},[57429],{"type":17,"tag":133,"props":57430,"children":57433},{"href":57431,"rel":57432},"https://developer.ukg.com/",[214],[57434],{"type":23,"value":57435},"UKG Developer Portal",{"type":17,"tag":29,"props":57437,"children":57438},{},[57439,57441,57446],{"type":23,"value":57440},"UKG (Ultimate Kronos Group) provides workforce management software including ",{"type":17,"tag":48,"props":57442,"children":57443},{},[57444],{"type":23,"value":57445},"UKG Pro, UKG Ready, and Kronos Workforce Central",{"type":23,"value":54},{"type":17,"tag":29,"props":57448,"children":57449},{},[57450],{"type":23,"value":52640},{"type":17,"tag":80,"props":57452,"children":57453},{},[57454,57459,57463,57468,57472],{"type":17,"tag":84,"props":57455,"children":57456},{},[57457],{"type":23,"value":57458},"time and attendance data",{"type":17,"tag":84,"props":57460,"children":57461},{},[57462],{"type":23,"value":57225},{"type":17,"tag":84,"props":57464,"children":57465},{},[57466],{"type":23,"value":57467},"workforce analytics",{"type":17,"tag":84,"props":57469,"children":57470},{},[57471],{"type":23,"value":57293},{"type":17,"tag":84,"props":57473,"children":57474},{},[57475],{"type":23,"value":57476},"workforce compliance tracking",{"type":17,"tag":29,"props":57478,"children":57479},{},[57480],{"type":23,"value":57481},"UKG is widely used by large enterprises managing hourly workforces.",{"type":17,"tag":239,"props":57483,"children":57485},{"id":57484},"deputy-api",[57486],{"type":23,"value":57487},"Deputy API",{"type":17,"tag":29,"props":57489,"children":57490},{},[57491],{"type":17,"tag":133,"props":57492,"children":57495},{"href":57493,"rel":57494},"https://www.deputy.com/developers",[214],[57496],{"type":23,"value":57497},"Deputy API Docs",{"type":17,"tag":29,"props":57499,"children":57500},{},[57501],{"type":23,"value":57502},"Deputy is a workforce management platform focused on shift scheduling and time tracking.",{"type":17,"tag":29,"props":57504,"children":57505},{},[57506],{"type":23,"value":51467},{"type":17,"tag":80,"props":57508,"children":57509},{},[57510,57515,57520,57525,57530],{"type":17,"tag":84,"props":57511,"children":57512},{},[57513],{"type":23,"value":57514},"shift scheduling",{"type":17,"tag":84,"props":57516,"children":57517},{},[57518],{"type":23,"value":57519},"employee clock-in / clock-out data",{"type":17,"tag":84,"props":57521,"children":57522},{},[57523],{"type":23,"value":57524},"attendance records",{"type":17,"tag":84,"props":57526,"children":57527},{},[57528],{"type":23,"value":57529},"leave management",{"type":17,"tag":84,"props":57531,"children":57532},{},[57533],{"type":23,"value":57467},{"type":17,"tag":29,"props":57535,"children":57536},{},[57537],{"type":23,"value":57538},"Deputy integrations are common in retail, hospitality, and service industries.",{"type":17,"tag":239,"props":57540,"children":57542},{"id":57541},"humanforce-api",[57543],{"type":23,"value":57544},"Humanforce API",{"type":17,"tag":29,"props":57546,"children":57547},{},[57548],{"type":17,"tag":133,"props":57549,"children":57552},{"href":57550,"rel":57551},"https://www.humanforce.com/",[214],[57553],{"type":23,"value":57554},"Humanforce",{"type":17,"tag":29,"props":57556,"children":57557},{},[57558],{"type":23,"value":57559},"Humanforce provides workforce management tools used heavily in hospitality and healthcare.",{"type":17,"tag":29,"props":57561,"children":57562},{},[57563],{"type":23,"value":53837},{"type":17,"tag":80,"props":57565,"children":57566},{},[57567,57572,57577,57582,57587],{"type":17,"tag":84,"props":57568,"children":57569},{},[57570],{"type":23,"value":57571},"employee scheduling",{"type":17,"tag":84,"props":57573,"children":57574},{},[57575],{"type":23,"value":57576},"time tracking",{"type":17,"tag":84,"props":57578,"children":57579},{},[57580],{"type":23,"value":57581},"workforce compliance",{"type":17,"tag":84,"props":57583,"children":57584},{},[57585],{"type":23,"value":57586},"payroll export data",{"type":17,"tag":84,"props":57588,"children":57589},{},[57590],{"type":23,"value":57278},{"type":17,"tag":239,"props":57592,"children":57594},{"id":57593},"ceridian-dayforce-api",[57595],{"type":23,"value":57596},"Ceridian Dayforce API",{"type":17,"tag":29,"props":57598,"children":57599},{},[57600],{"type":17,"tag":133,"props":57601,"children":57604},{"href":57602,"rel":57603},"https://developers.dayforce.com/",[214],[57605],{"type":23,"value":57606},"Ceridian Developer Portal",{"type":17,"tag":29,"props":57608,"children":57609},{},[57610],{"type":23,"value":57611},"Ceridian Dayforce provides enterprise workforce management capabilities alongside payroll.",{"type":17,"tag":29,"props":57613,"children":57614},{},[57615],{"type":23,"value":56054},{"type":17,"tag":80,"props":57617,"children":57618},{},[57619,57623,57628,57633,57637],{"type":17,"tag":84,"props":57620,"children":57621},{},[57622],{"type":23,"value":57225},{"type":17,"tag":84,"props":57624,"children":57625},{},[57626],{"type":23,"value":57627},"time and attendance",{"type":17,"tag":84,"props":57629,"children":57630},{},[57631],{"type":23,"value":57632},"payroll and compensation",{"type":17,"tag":84,"props":57634,"children":57635},{},[57636],{"type":23,"value":57467},{"type":17,"tag":84,"props":57638,"children":57639},{},[57640],{"type":23,"value":57641},"HR integrations",{"type":17,"tag":239,"props":57643,"children":57645},{"id":57644},"adp-workforce-now-api",[57646],{"type":23,"value":57647},"ADP Workforce Now API",{"type":17,"tag":29,"props":57649,"children":57650},{},[57651],{"type":17,"tag":133,"props":57652,"children":57655},{"href":57653,"rel":57654},"https://developers.adp.com/",[214],[57656],{"type":23,"value":57657},"ADP Developer Portal",{"type":17,"tag":29,"props":57659,"children":57660},{},[57661],{"type":23,"value":57662},"ADP Workforce Now includes workforce scheduling and time tracking functionality.",{"type":17,"tag":29,"props":57664,"children":57665},{},[57666],{"type":23,"value":57667},"Integration capabilities include:",{"type":17,"tag":80,"props":57669,"children":57670},{},[57671,57676,57681,57685],{"type":17,"tag":84,"props":57672,"children":57673},{},[57674],{"type":23,"value":57675},"worker time records",{"type":17,"tag":84,"props":57677,"children":57678},{},[57679],{"type":23,"value":57680},"employee attendance",{"type":17,"tag":84,"props":57682,"children":57683},{},[57684],{"type":23,"value":57293},{"type":17,"tag":84,"props":57686,"children":57687},{},[57688],{"type":23,"value":57689},"workforce reporting",{"type":17,"tag":239,"props":57691,"children":57693},{"id":57692},"workday-workforce-api",[57694],{"type":23,"value":57695},"Workday Workforce API",{"type":17,"tag":29,"props":57697,"children":57698},{},[57699],{"type":17,"tag":133,"props":57700,"children":57702},{"href":55031,"rel":57701},[214],[57703],{"type":23,"value":55035},{"type":17,"tag":29,"props":57705,"children":57706},{},[57707],{"type":23,"value":57708},"Workday provides workforce management alongside HR and payroll infrastructure.",{"type":17,"tag":29,"props":57710,"children":57711},{},[57712],{"type":23,"value":54827},{"type":17,"tag":80,"props":57714,"children":57715},{},[57716,57721,57725,57730,57734],{"type":17,"tag":84,"props":57717,"children":57718},{},[57719],{"type":23,"value":57720},"workforce planning",{"type":17,"tag":84,"props":57722,"children":57723},{},[57724],{"type":23,"value":57576},{"type":17,"tag":84,"props":57726,"children":57727},{},[57728],{"type":23,"value":57729},"labor analytics",{"type":17,"tag":84,"props":57731,"children":57732},{},[57733],{"type":23,"value":57571},{"type":17,"tag":84,"props":57735,"children":57736},{},[57737],{"type":23,"value":57738},"HR synchronization",{"type":17,"tag":239,"props":57740,"children":57742},{"id":57741},"rippling-workforce-api",[57743],{"type":23,"value":57744},"Rippling Workforce API",{"type":17,"tag":29,"props":57746,"children":57747},{},[57748],{"type":17,"tag":133,"props":57749,"children":57752},{"href":57750,"rel":57751},"https://developer.rippling.com/",[214],[57753],{"type":23,"value":57754},"Rippling Developer Docs",{"type":17,"tag":29,"props":57756,"children":57757},{},[57758],{"type":23,"value":57759},"Rippling combines HR, payroll, IT, and workforce automation.",{"type":17,"tag":29,"props":57761,"children":57762},{},[57763],{"type":23,"value":57764},"Its workforce-related APIs support:",{"type":17,"tag":80,"props":57766,"children":57767},{},[57768,57773,57778,57782],{"type":17,"tag":84,"props":57769,"children":57770},{},[57771],{"type":23,"value":57772},"employee lifecycle automation",{"type":17,"tag":84,"props":57774,"children":57775},{},[57776],{"type":23,"value":57777},"workforce provisioning",{"type":17,"tag":84,"props":57779,"children":57780},{},[57781],{"type":23,"value":57576},{"type":17,"tag":84,"props":57783,"children":57784},{},[57785],{"type":23,"value":57786},"payroll integration",{"type":17,"tag":239,"props":57788,"children":57790},{"id":57789},"factorialhr-api",[57791],{"type":23,"value":57792},"FactorialHR API",{"type":17,"tag":29,"props":57794,"children":57795},{},[57796],{"type":17,"tag":133,"props":57797,"children":57800},{"href":57798,"rel":57799},"https://factorialhr.com/",[214],[57801],{"type":23,"value":57802},"FactorialHR",{"type":17,"tag":29,"props":57804,"children":57805},{},[57806],{"type":23,"value":57807},"FactorialHR provides HR and workforce management software for SMBs.",{"type":17,"tag":29,"props":57809,"children":57810},{},[57811],{"type":23,"value":53837},{"type":17,"tag":80,"props":57813,"children":57814},{},[57815,57819,57823,57828],{"type":17,"tag":84,"props":57816,"children":57817},{},[57818],{"type":23,"value":57571},{"type":17,"tag":84,"props":57820,"children":57821},{},[57822],{"type":23,"value":57576},{"type":17,"tag":84,"props":57824,"children":57825},{},[57826],{"type":23,"value":57827},"PTO requests",{"type":17,"tag":84,"props":57829,"children":57830},{},[57831],{"type":23,"value":57467},{"type":17,"tag":239,"props":57833,"children":57835},{"id":57834},"deputy-style-scheduling-platforms",[57836],{"type":23,"value":57837},"Deputy-Style Scheduling Platforms",{"type":17,"tag":29,"props":57839,"children":57840},{},[57841],{"type":23,"value":57842},"Other workforce tools often integrated by SaaS products include:",{"type":17,"tag":80,"props":57844,"children":57845},{},[57846,57856,57866,57876,57886,57896,57906,57916],{"type":17,"tag":84,"props":57847,"children":57848},{},[57849],{"type":17,"tag":133,"props":57850,"children":57853},{"href":57851,"rel":57852},"https://www.joinhomebase.com/",[214],[57854],{"type":23,"value":57855},"Homebase",{"type":17,"tag":84,"props":57857,"children":57858},{},[57859],{"type":17,"tag":133,"props":57860,"children":57863},{"href":57861,"rel":57862},"https://wheniwork.com/",[214],[57864],{"type":23,"value":57865},"When I Work",{"type":17,"tag":84,"props":57867,"children":57868},{},[57869],{"type":17,"tag":133,"props":57870,"children":57873},{"href":57871,"rel":57872},"https://www.7shifts.com/",[214],[57874],{"type":23,"value":57875},"7shifts",{"type":17,"tag":84,"props":57877,"children":57878},{},[57879],{"type":17,"tag":133,"props":57880,"children":57883},{"href":57881,"rel":57882},"https://getsling.com/",[214],[57884],{"type":23,"value":57885},"Sling",{"type":17,"tag":84,"props":57887,"children":57888},{},[57889],{"type":17,"tag":133,"props":57890,"children":57893},{"href":57891,"rel":57892},"https://www.planday.com/",[214],[57894],{"type":23,"value":57895},"Planday",{"type":17,"tag":84,"props":57897,"children":57898},{},[57899],{"type":17,"tag":133,"props":57900,"children":57903},{"href":57901,"rel":57902},"https://www.zoomshift.com/",[214],[57904],{"type":23,"value":57905},"ZoomShift",{"type":17,"tag":84,"props":57907,"children":57908},{},[57909],{"type":17,"tag":133,"props":57910,"children":57913},{"href":57911,"rel":57912},"https://www.hotschedules.com/",[214],[57914],{"type":23,"value":57915},"HotSchedules",{"type":17,"tag":84,"props":57917,"children":57918},{},[57919],{"type":17,"tag":133,"props":57920,"children":57923},{"href":57921,"rel":57922},"https://www.shiftboard.com/",[214],[57924],{"type":23,"value":57925},"Shiftboard",{"type":17,"tag":29,"props":57927,"children":57928},{},[57929,57931,57936],{"type":23,"value":57930},"These platforms primarily focus on ",{"type":17,"tag":48,"props":57932,"children":57933},{},[57934],{"type":23,"value":57935},"shift scheduling and labor planning",{"type":23,"value":54},{"type":17,"tag":239,"props":57938,"children":57940},{"id":57939},"additional-workforce-and-operations-platforms",[57941],{"type":23,"value":57942},"Additional Workforce and Operations Platforms",{"type":17,"tag":29,"props":57944,"children":57945},{},[57946],{"type":23,"value":57947},"Developers also frequently integrate workforce data from platforms such as:",{"type":17,"tag":80,"props":57949,"children":57950},{},[57951,57961,57971,57981,57991,58001],{"type":17,"tag":84,"props":57952,"children":57953},{},[57954],{"type":17,"tag":133,"props":57955,"children":57958},{"href":57956,"rel":57957},"https://www.assembled.com/",[214],[57959],{"type":23,"value":57960},"Assembled",{"type":17,"tag":84,"props":57962,"children":57963},{},[57964],{"type":17,"tag":133,"props":57965,"children":57968},{"href":57966,"rel":57967},"https://www.harri.com/",[214],[57969],{"type":23,"value":57970},"Harri",{"type":17,"tag":84,"props":57972,"children":57973},{},[57974],{"type":17,"tag":133,"props":57975,"children":57978},{"href":57976,"rel":57977},"https://www.workstream.us/",[214],[57979],{"type":23,"value":57980},"Workstream",{"type":17,"tag":84,"props":57982,"children":57983},{},[57984],{"type":17,"tag":133,"props":57985,"children":57988},{"href":57986,"rel":57987},"https://foundu.com/",[214],[57989],{"type":23,"value":57990},"FoundU",{"type":17,"tag":84,"props":57992,"children":57993},{},[57994],{"type":17,"tag":133,"props":57995,"children":57998},{"href":57996,"rel":57997},"https://www.deputy.com/",[214],[57999],{"type":23,"value":58000},"Deputy",{"type":17,"tag":84,"props":58002,"children":58003},{},[58004],{"type":17,"tag":133,"props":58005,"children":58007},{"href":57550,"rel":58006},[214],[58008],{"type":23,"value":57554},{"type":17,"tag":29,"props":58010,"children":58011},{},[58012],{"type":23,"value":58013},"The workforce ecosystem continues to grow as companies digitize operations and labor planning.",{"type":17,"tag":68,"props":58015,"children":58017},{"id":58016},"challenges-when-integrating-workforce-apis",[58018],{"type":23,"value":58019},"Challenges When Integrating Workforce APIs",{"type":17,"tag":29,"props":58021,"children":58022},{},[58023],{"type":23,"value":58024},"Integrating workforce platforms directly introduces several engineering challenges.",{"type":17,"tag":239,"props":58026,"children":58028},{"id":58027},"inconsistent-scheduling-models",[58029],{"type":23,"value":58030},"Inconsistent scheduling models",{"type":17,"tag":29,"props":58032,"children":58033},{},[58034],{"type":23,"value":58035},"Each provider represents schedules, shifts, and attendance differently.",{"type":17,"tag":239,"props":58037,"children":58038},{"id":1785},[58039],{"type":23,"value":1788},{"type":17,"tag":29,"props":58041,"children":58042},{},[58043,58045,58049],{"type":23,"value":58044},"Platforms may use ",{"type":17,"tag":133,"props":58046,"children":58047},{"href":779},[58048],{"type":23,"value":782},{"type":23,"value":58050},", API keys, or enterprise authentication flows.",{"type":17,"tag":239,"props":58052,"children":58054},{"id":58053},"eventing-and-webhook-inconsistencies",[58055],{"type":23,"value":58056},"Eventing and webhook inconsistencies",{"type":17,"tag":29,"props":58058,"children":58059},{},[58060,58062,58066],{"type":23,"value":58061},"Some providers support real-time ",{"type":17,"tag":133,"props":58063,"children":58064},{"href":4999},[58065],{"type":23,"value":5002},{"type":23,"value":56710},{"type":17,"tag":239,"props":58068,"children":58070},{"id":58069},"rate-limits-and-api-complexity",[58071],{"type":23,"value":58072},"Rate limits and API complexity",{"type":17,"tag":29,"props":58074,"children":58075},{},[58076,58078,58082],{"type":23,"value":58077},"Workforce APIs often enforce strict ",{"type":17,"tag":133,"props":58079,"children":58080},{"href":135},[58081],{"type":23,"value":138},{"type":23,"value":58083}," due to heavy operational data usage.",{"type":17,"tag":239,"props":58085,"children":58087},{"id":58086},"cross-system-dependencies",[58088],{"type":23,"value":58089},"Cross-system dependencies",{"type":17,"tag":29,"props":58091,"children":58092},{},[58093],{"type":23,"value":58094},"Workforce data must often sync with HR systems and payroll platforms.",{"type":17,"tag":29,"props":58096,"children":58097},{},[58098],{"type":23,"value":58099},"As companies support more workforce tools, integration complexity grows quickly.",{"type":17,"tag":68,"props":58101,"children":58103},{"id":58102},"the-role-of-unified-workforce-apis",[58104],{"type":23,"value":58105},"The Role of Unified Workforce APIs",{"type":17,"tag":29,"props":58107,"children":58108},{},[58109,58111,58116],{"type":23,"value":58110},"To simplify workforce integrations, many SaaS platforms adopt ",{"type":17,"tag":48,"props":58112,"children":58113},{},[58114],{"type":23,"value":58115},"unified APIs",{"type":23,"value":58117}," that standardize workforce data across providers.",{"type":17,"tag":29,"props":58119,"children":58120},{},[58121],{"type":23,"value":58122},"A unified API layer provides:",{"type":17,"tag":80,"props":58124,"children":58125},{},[58126,58131,58136,58141,58146],{"type":17,"tag":84,"props":58127,"children":58128},{},[58129],{"type":23,"value":58130},"a single authentication flow",{"type":17,"tag":84,"props":58132,"children":58133},{},[58134],{"type":23,"value":58135},"normalized workforce data models",{"type":17,"tag":84,"props":58137,"children":58138},{},[58139],{"type":23,"value":58140},"consistent endpoints",{"type":17,"tag":84,"props":58142,"children":58143},{},[58144],{"type":23,"value":58145},"unified webhook handling",{"type":17,"tag":84,"props":58147,"children":58148},{},[58149],{"type":23,"value":50649},{"type":17,"tag":29,"props":58151,"children":58152},{},[58153],{"type":23,"value":58154},"Instead of building integrations for every workforce platform separately, developers can integrate once and support many providers.",{"type":17,"tag":68,"props":58156,"children":58158},{"id":58157},"build-workforce-integrations-once",[58159],{"type":23,"value":58160},"Build Workforce Integrations Once",{"type":17,"tag":29,"props":58162,"children":58163},{},[58164],{"type":23,"value":58165},"Workforce systems rarely exist alone. They typically connect with:",{"type":17,"tag":80,"props":58167,"children":58168},{},[58169,58173,58178,58183],{"type":17,"tag":84,"props":58170,"children":58171},{},[58172],{"type":23,"value":93},{"type":17,"tag":84,"props":58174,"children":58175},{},[58176],{"type":23,"value":58177},"payroll systems",{"type":17,"tag":84,"props":58179,"children":58180},{},[58181],{"type":23,"value":58182},"identity management tools",{"type":17,"tag":84,"props":58184,"children":58185},{},[58186],{"type":23,"value":58187},"operational analytics platforms",{"type":17,"tag":29,"props":58189,"children":58190},{},[58191,58193,58198],{"type":23,"value":58192},"That's why many workforce integrations are built through ",{"type":17,"tag":48,"props":58194,"children":58195},{},[58196],{"type":23,"value":58197},"HR and directory infrastructure",{"type":23,"value":54},{"type":17,"tag":29,"props":58200,"children":58201},{},[58202],{"type":23,"value":58203},"You can explore Unified's workforce and HR integrations here:",{"type":17,"tag":29,"props":58205,"children":58206},{},[58207],{"type":17,"tag":133,"props":58208,"children":58211},{"href":58209,"rel":58210},"https://unified.to/hris",[214],[58212],{"type":23,"value":58213},"Unified HRIS API",{"type":17,"tag":29,"props":58215,"children":58216},{},[58217,58219,58224],{"type":23,"value":58218},"Unified supports ",{"type":17,"tag":48,"props":58220,"children":58221},{},[58222],{"type":23,"value":58223},"224+ HR, workforce, and directory integrations",{"type":23,"value":58225},", allowing SaaS platforms to access workforce data across many providers through a single API.",{"type":17,"tag":239,"props":58227,"children":58229},{"id":58228},"workforce-data-objects-available",[58230],{"type":23,"value":58231},"Workforce Data Objects Available",{"type":17,"tag":29,"props":58233,"children":58234},{},[58235],{"type":23,"value":58236},"Unified normalizes workforce and HR data into consistent objects including:",{"type":17,"tag":80,"props":58238,"children":58239},{},[58240,58245,58250,58254,58259,58264,58269,58274,58279],{"type":17,"tag":84,"props":58241,"children":58242},{},[58243],{"type":23,"value":58244},"Employees",{"type":17,"tag":84,"props":58246,"children":58247},{},[58248],{"type":23,"value":58249},"Groups (teams or departments)",{"type":17,"tag":84,"props":58251,"children":58252},{},[58253],{"type":23,"value":38951},{"type":17,"tag":84,"props":58255,"children":58256},{},[58257],{"type":23,"value":58258},"Time Off (PTO)",{"type":17,"tag":84,"props":58260,"children":58261},{},[58262],{"type":23,"value":58263},"Time Shifts (work schedules)",{"type":17,"tag":84,"props":58265,"children":58266},{},[58267],{"type":23,"value":58268},"Payslips",{"type":17,"tag":84,"props":58270,"children":58271},{},[58272],{"type":23,"value":58273},"Benefits",{"type":17,"tag":84,"props":58275,"children":58276},{},[58277],{"type":23,"value":58278},"Deductions",{"type":17,"tag":84,"props":58280,"children":58281},{},[58282],{"type":23,"value":58283},"Devices",{"type":17,"tag":29,"props":58285,"children":58286},{},[58287],{"type":23,"value":58288},"Each object supports consistent operations:",{"type":17,"tag":80,"props":58290,"children":58291},{},[58292,58296,58300,58304,58308],{"type":17,"tag":84,"props":58293,"children":58294},{},[58295],{"type":23,"value":11254},{"type":17,"tag":84,"props":58297,"children":58298},{},[58299],{"type":23,"value":11243},{"type":17,"tag":84,"props":58301,"children":58302},{},[58303],{"type":23,"value":24038},{"type":17,"tag":84,"props":58305,"children":58306},{},[58307],{"type":23,"value":11845},{"type":17,"tag":84,"props":58309,"children":58310},{},[58311],{"type":23,"value":11852},{"type":17,"tag":29,"props":58313,"children":58314},{},[58315],{"type":23,"value":58316},"This allows developers to build workforce features once and support many providers.",{"type":17,"tag":239,"props":58318,"children":58320},{"id":58319},"real-time-workforce-data",[58321],{"type":23,"value":58322},"Real-Time Workforce Data",{"type":17,"tag":29,"props":58324,"children":58325},{},[58326,58327,58331],{"type":23,"value":24080},{"type":17,"tag":48,"props":58328,"children":58329},{},[58330],{"type":23,"value":50812},{"type":23,"value":54},{"type":17,"tag":29,"props":58333,"children":58334},{},[58335],{"type":23,"value":58336},"Every request is routed directly to the source platform.",{"type":17,"tag":29,"props":58338,"children":58339},{},[58340],{"type":23,"value":7403},{"type":17,"tag":80,"props":58342,"children":58343},{},[58344,58349,58354],{"type":17,"tag":84,"props":58345,"children":58346},{},[58347],{"type":23,"value":58348},"workforce data is always up to date",{"type":17,"tag":84,"props":58350,"children":58351},{},[58352],{"type":23,"value":58353},"no periodic sync jobs are required",{"type":17,"tag":84,"props":58355,"children":58356},{},[58357],{"type":23,"value":58358},"applications can react instantly to employee changes",{"type":17,"tag":239,"props":58360,"children":58361},{"id":17064},[58362],{"type":23,"value":58363},"Zero Storage Architecture",{"type":17,"tag":29,"props":58365,"children":58366},{},[58367],{"type":23,"value":58368},"Unified does not store workforce or employee data.",{"type":17,"tag":29,"props":58370,"children":58371},{},[58372],{"type":23,"value":58373},"Requests are processed statelessly and routed directly to source systems.",{"type":17,"tag":29,"props":58375,"children":58376},{},[58377],{"type":23,"value":58378},"This architecture reduces:",{"type":17,"tag":80,"props":58380,"children":58381},{},[58382,58386,58391],{"type":17,"tag":84,"props":58383,"children":58384},{},[58385],{"type":23,"value":9406},{"type":17,"tag":84,"props":58387,"children":58388},{},[58389],{"type":23,"value":58390},"data retention complexity",{"type":17,"tag":84,"props":58392,"children":58393},{},[58394],{"type":23,"value":58395},"security exposure from cached workforce data",{"type":17,"tag":29,"props":58397,"children":58398},{},[58399],{"type":23,"value":58400},"For workforce systems that handle employee information, this architecture significantly reduces risk.",{"type":17,"tag":68,"props":58402,"children":58403},{"id":1552},[58404],{"type":23,"value":44411},{"type":17,"tag":29,"props":58406,"children":58407},{},[58408],{"type":23,"value":58409},"Workforce management APIs power scheduling, attendance tracking, labor planning, and operational automation across many industries.",{"type":17,"tag":29,"props":58411,"children":58412},{},[58413],{"type":23,"value":58414},"However, integrating workforce platforms individually can become a complex engineering challenge involving multiple APIs, authentication systems, and data models.",{"type":17,"tag":29,"props":58416,"children":58417},{},[58418,58420,58425],{"type":23,"value":58419},"As the workforce technology ecosystem continues to expand, many SaaS companies are adopting ",{"type":17,"tag":48,"props":58421,"children":58422},{},[58423],{"type":23,"value":58424},"unified workforce APIs",{"type":23,"value":58426}," to simplify integrations and support dozens of workforce systems through a single integration layer.",{"type":17,"tag":29,"props":58428,"children":58429},{},[58430,58432,58437],{"type":23,"value":58431},"If your product needs to connect with workforce platforms, unified APIs make it possible to support ",{"type":17,"tag":48,"props":58433,"children":58434},{},[58435],{"type":23,"value":58436},"UKG, Deputy, Humanforce, and many other workforce systems",{"type":23,"value":57089},{"type":17,"tag":29,"props":58439,"children":58440},{},[58441],{"type":17,"tag":133,"props":58442,"children":58444},{"href":1612,"rel":58443},[214],[58445],{"type":23,"value":44481},{"type":17,"tag":29,"props":58447,"children":58448},{},[58449],{"type":17,"tag":133,"props":58450,"children":58452},{"href":1623,"rel":58451},[214],[58453],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":58455},[58456,58457,58465,58477,58484,58485,58490],{"id":57199,"depth":1629,"text":57202},{"id":57313,"depth":1629,"text":57316,"children":58458},[58459,58460,58461,58462,58463,58464],{"id":57328,"depth":1635,"text":57331},{"id":57339,"depth":1635,"text":57342},{"id":57350,"depth":1635,"text":57353},{"id":57361,"depth":1635,"text":57364},{"id":57372,"depth":1635,"text":57375},{"id":57383,"depth":1635,"text":57386},{"id":57406,"depth":1629,"text":57409,"children":58466},[58467,58468,58469,58470,58471,58472,58473,58474,58475,58476],{"id":57422,"depth":1635,"text":57425},{"id":57484,"depth":1635,"text":57487},{"id":57541,"depth":1635,"text":57544},{"id":57593,"depth":1635,"text":57596},{"id":57644,"depth":1635,"text":57647},{"id":57692,"depth":1635,"text":57695},{"id":57741,"depth":1635,"text":57744},{"id":57789,"depth":1635,"text":57792},{"id":57834,"depth":1635,"text":57837},{"id":57939,"depth":1635,"text":57942},{"id":58016,"depth":1629,"text":58019,"children":58478},[58479,58480,58481,58482,58483],{"id":58027,"depth":1635,"text":58030},{"id":1785,"depth":1635,"text":1788},{"id":58053,"depth":1635,"text":58056},{"id":58069,"depth":1635,"text":58072},{"id":58086,"depth":1635,"text":58089},{"id":58102,"depth":1629,"text":58105},{"id":58157,"depth":1629,"text":58160,"children":58486},[58487,58488,58489],{"id":58228,"depth":1635,"text":58231},{"id":58319,"depth":1635,"text":58322},{"id":17064,"depth":1635,"text":58363},{"id":1552,"depth":1629,"text":44411},"content:blog:15_workforce_management_apis_to_integrate_with_in_2026_ukg_deputy_humanforce.md","blog/15_workforce_management_apis_to_integrate_with_in_2026_ukg_deputy_humanforce.md","blog/15_workforce_management_apis_to_integrate_with_in_2026_ukg_deputy_humanforce",{"_path":58495,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":58496,"description":58497,"img":58498,"date":58499,"tag":12,"body":58500,"_type":1677,"_id":60101,"_source":1679,"_file":60102,"_stem":60103,"_extension":1682},"/blog/15_payroll_apis_to_integrate_with_in_2026_adp_gusto_paychex","15 Payroll APIs to Integrate With in 2026: ADP, Gusto, Paychex","Payroll systems sit at the core of financial operations for companies of all sizes. They manage employee compensation, tax withholdings, deductions, benefits...","https://s3.us-east-2.amazonaws.com/unified-article-images/15_payroll_apis_to_integrate_with_in_2026_adp_gusto_paychex-icon.png","2026-03-11T15:34:00.000Z",{"type":14,"children":58501,"toc":60057},[58502,58507,58510,58517,58528,58533,58538,58549,58555,58566,58571,58614,58619,58652,58664,58670,58675,58679,58685,58690,58696,58701,58707,58712,58718,58723,58729,58734,58745,58751,58762,58768,58776,58781,58785,58813,58818,58824,58834,58839,58844,58870,58875,58881,58891,58896,58900,58922,58928,58938,58943,58947,58968,58974,58984,58989,58993,59016,59022,59032,59037,59042,59065,59070,59076,59085,59090,59095,59116,59121,59127,59136,59141,59146,59168,59174,59183,59188,59192,59213,59219,59229,59234,59238,59260,59264,59274,59279,59284,59304,59310,59320,59325,59330,59352,59358,59368,59373,59377,59393,59399,59409,59414,59418,59435,59441,59451,59456,59461,59483,59489,59499,59504,59508,59525,59531,59536,59627,59638,59644,59649,59655,59660,59664,59675,59681,59686,59690,59695,59701,59706,59712,59717,59722,59728,59739,59749,59754,59786,59791,59797,59802,59807,59812,59822,59828,59833,59879,59884,59907,59912,59916,59926,59930,59953,59957,59962,59967,59972,59993,59998,60002,60007,60012,60024,60036,60041,60049],{"type":17,"tag":18,"props":58503,"children":58505},{"id":58504},"_15-payroll-apis-to-integrate-with-in-2026-adp-gusto-paychex",[58506],{"type":23,"value":58496},{"type":17,"tag":25,"props":58508,"children":58509},{},[],{"type":17,"tag":29,"props":58511,"children":58512},{},[58513],{"type":17,"tag":33,"props":58514,"children":58515},{},[58516],{"type":23,"value":49465},{"type":17,"tag":29,"props":58518,"children":58519},{},[58520,58522,58527],{"type":23,"value":58521},"Payroll systems sit at the core of financial operations for companies of all sizes. They manage employee compensation, tax withholdings, deductions, benefits contributions, and compliance reporting. As SaaS platforms increasingly automate workforce management, HR operations, and financial workflows, ",{"type":17,"tag":48,"props":58523,"children":58524},{},[58525],{"type":23,"value":58526},"payroll APIs have become essential infrastructure for modern software products",{"type":23,"value":54},{"type":17,"tag":29,"props":58529,"children":58530},{},[58531],{"type":23,"value":58532},"But integrating payroll systems is rarely straightforward.",{"type":17,"tag":29,"props":58534,"children":58535},{},[58536],{"type":23,"value":58537},"Every payroll platform exposes different APIs, authentication mechanisms, compliance requirements, and data schemas. Payroll data is also highly sensitive, which introduces additional security and regulatory considerations.",{"type":17,"tag":29,"props":58539,"children":58540},{},[58541,58542,58547],{"type":23,"value":12584},{"type":17,"tag":48,"props":58543,"children":58544},{},[58545],{"type":23,"value":58546},"15+ payroll APIs developers commonly integrate with",{"type":23,"value":58548},", explore the challenges of payroll integrations, and explain how unified payroll APIs help SaaS teams support dozens of payroll systems without building separate integrations for each one.",{"type":17,"tag":68,"props":58550,"children":58552},{"id":58551},"what-is-a-payroll-api",[58553],{"type":23,"value":58554},"What Is a Payroll API?",{"type":17,"tag":29,"props":58556,"children":58557},{},[58558,58559,58564],{"type":23,"value":9619},{"type":17,"tag":48,"props":58560,"children":58561},{},[58562],{"type":23,"value":58563},"payroll API",{"type":23,"value":58565}," allows applications to access payroll and compensation data programmatically.",{"type":17,"tag":29,"props":58567,"children":58568},{},[58569],{"type":23,"value":58570},"Payroll APIs typically expose endpoints for:",{"type":17,"tag":80,"props":58572,"children":58573},{},[58574,58579,58584,58589,58594,58599,58604,58609],{"type":17,"tag":84,"props":58575,"children":58576},{},[58577],{"type":23,"value":58578},"employee payroll profiles",{"type":17,"tag":84,"props":58580,"children":58581},{},[58582],{"type":23,"value":58583},"compensation and salary data",{"type":17,"tag":84,"props":58585,"children":58586},{},[58587],{"type":23,"value":58588},"payroll runs and payment history",{"type":17,"tag":84,"props":58590,"children":58591},{},[58592],{"type":23,"value":58593},"tax withholdings and compliance reporting",{"type":17,"tag":84,"props":58595,"children":58596},{},[58597],{"type":23,"value":58598},"deductions and benefits contributions",{"type":17,"tag":84,"props":58600,"children":58601},{},[58602],{"type":23,"value":58603},"direct deposit and bank accounts",{"type":17,"tag":84,"props":58605,"children":58606},{},[58607],{"type":23,"value":58608},"contractor payments",{"type":17,"tag":84,"props":58610,"children":58611},{},[58612],{"type":23,"value":58613},"timesheets and hours worked",{"type":17,"tag":29,"props":58615,"children":58616},{},[58617],{"type":23,"value":58618},"These APIs enable SaaS products to automate workflows such as:",{"type":17,"tag":80,"props":58620,"children":58621},{},[58622,58627,58632,58637,58642,58647],{"type":17,"tag":84,"props":58623,"children":58624},{},[58625],{"type":23,"value":58626},"payroll synchronization with HR systems",{"type":17,"tag":84,"props":58628,"children":58629},{},[58630],{"type":23,"value":58631},"benefits and compensation management",{"type":17,"tag":84,"props":58633,"children":58634},{},[58635],{"type":23,"value":58636},"workforce analytics dashboards",{"type":17,"tag":84,"props":58638,"children":58639},{},[58640],{"type":23,"value":58641},"accounting and finance reconciliation",{"type":17,"tag":84,"props":58643,"children":58644},{},[58645],{"type":23,"value":58646},"employee financial wellness tools",{"type":17,"tag":84,"props":58648,"children":58649},{},[58650],{"type":23,"value":58651},"contractor and global payroll automation",{"type":17,"tag":29,"props":58653,"children":58654},{},[58655,58657,58662],{"type":23,"value":58656},"Because payroll systems often act as the ",{"type":17,"tag":48,"props":58658,"children":58659},{},[58660],{"type":23,"value":58661},"financial system of record for employee compensation",{"type":23,"value":58663},", payroll integrations are foundational for many SaaS products.",{"type":17,"tag":68,"props":58665,"children":58667},{"id":58666},"why-saas-products-integrate-with-payroll-apis",[58668],{"type":23,"value":58669},"Why SaaS Products Integrate with Payroll APIs",{"type":17,"tag":29,"props":58671,"children":58672},{},[58673],{"type":23,"value":58674},"Payroll integrations power many product features across HR, finance, and workforce software.",{"type":17,"tag":29,"props":58676,"children":58677},{},[58678],{"type":23,"value":12661},{"type":17,"tag":239,"props":58680,"children":58682},{"id":58681},"payroll-automation",[58683],{"type":23,"value":58684},"Payroll automation",{"type":17,"tag":29,"props":58686,"children":58687},{},[58688],{"type":23,"value":58689},"Sync payroll runs, payment status, and employee compensation data automatically across systems.",{"type":17,"tag":239,"props":58691,"children":58693},{"id":58692},"benefits-and-deductions-management",[58694],{"type":23,"value":58695},"Benefits and deductions management",{"type":17,"tag":29,"props":58697,"children":58698},{},[58699],{"type":23,"value":58700},"Track deductions for benefits programs, retirement contributions, and taxes across payroll providers.",{"type":17,"tag":239,"props":58702,"children":58704},{"id":58703},"financial-reporting-and-reconciliation",[58705],{"type":23,"value":58706},"Financial reporting and reconciliation",{"type":17,"tag":29,"props":58708,"children":58709},{},[58710],{"type":23,"value":58711},"Pull payroll data into accounting systems or analytics platforms to generate financial reports.",{"type":17,"tag":239,"props":58713,"children":58715},{"id":58714},"global-workforce-payments",[58716],{"type":23,"value":58717},"Global workforce payments",{"type":17,"tag":29,"props":58719,"children":58720},{},[58721],{"type":23,"value":58722},"Automate payments for contractors and international employees.",{"type":17,"tag":239,"props":58724,"children":58726},{"id":58725},"employee-financial-tools",[58727],{"type":23,"value":58728},"Employee financial tools",{"type":17,"tag":29,"props":58730,"children":58731},{},[58732],{"type":23,"value":58733},"Build applications that help employees track income, taxes, and benefits.",{"type":17,"tag":29,"props":58735,"children":58736},{},[58737,58739,58744],{"type":23,"value":58738},"Because payroll data is tightly connected to HR and finance systems, payroll APIs often serve as ",{"type":17,"tag":48,"props":58740,"children":58741},{},[58742],{"type":23,"value":58743},"a critical integration point between multiple SaaS platforms",{"type":23,"value":54},{"type":17,"tag":68,"props":58746,"children":58748},{"id":58747},"_15-payroll-apis-developers-integrate-with",[58749],{"type":23,"value":58750},"15+ Payroll APIs Developers Integrate With",{"type":17,"tag":29,"props":58752,"children":58753},{},[58754,58756,58761],{"type":23,"value":58755},"There are dozens of payroll platforms available globally. Below are some of the ",{"type":17,"tag":48,"props":58757,"children":58758},{},[58759],{"type":23,"value":58760},"most commonly integrated payroll APIs used by SaaS products today",{"type":23,"value":54},{"type":17,"tag":239,"props":58763,"children":58765},{"id":58764},"adp-api",[58766],{"type":23,"value":58767},"ADP API",{"type":17,"tag":29,"props":58769,"children":58770},{},[58771],{"type":17,"tag":133,"props":58772,"children":58774},{"href":57653,"rel":58773},[214],[58775],{"type":23,"value":57657},{"type":17,"tag":29,"props":58777,"children":58778},{},[58779],{"type":23,"value":58780},"ADP is one of the largest payroll providers in the world. Its APIs allow developers to access employee payroll data, tax information, and compensation records.",{"type":17,"tag":29,"props":58782,"children":58783},{},[58784],{"type":23,"value":51629},{"type":17,"tag":80,"props":58786,"children":58787},{},[58788,58793,58798,58803,58808],{"type":17,"tag":84,"props":58789,"children":58790},{},[58791],{"type":23,"value":58792},"payroll processing data",{"type":17,"tag":84,"props":58794,"children":58795},{},[58796],{"type":23,"value":58797},"worker profiles",{"type":17,"tag":84,"props":58799,"children":58800},{},[58801],{"type":23,"value":58802},"tax reporting and compliance",{"type":17,"tag":84,"props":58804,"children":58805},{},[58806],{"type":23,"value":58807},"benefits enrollment",{"type":17,"tag":84,"props":58809,"children":58810},{},[58811],{"type":23,"value":58812},"payroll run status",{"type":17,"tag":29,"props":58814,"children":58815},{},[58816],{"type":23,"value":58817},"ADP integrations are common in enterprise workforce platforms.",{"type":17,"tag":239,"props":58819,"children":58821},{"id":58820},"gusto-api",[58822],{"type":23,"value":58823},"Gusto API",{"type":17,"tag":29,"props":58825,"children":58826},{},[58827],{"type":17,"tag":133,"props":58828,"children":58831},{"href":58829,"rel":58830},"https://docs.gusto.com/",[214],[58832],{"type":23,"value":58833},"Gusto API Docs",{"type":17,"tag":29,"props":58835,"children":58836},{},[58837],{"type":23,"value":58838},"Gusto provides payroll, benefits, and HR infrastructure for small and mid-sized businesses.",{"type":17,"tag":29,"props":58840,"children":58841},{},[58842],{"type":23,"value":58843},"Its API enables SaaS platforms to automate:",{"type":17,"tag":80,"props":58845,"children":58846},{},[58847,58852,58857,58861,58866],{"type":17,"tag":84,"props":58848,"children":58849},{},[58850],{"type":23,"value":58851},"payroll runs",{"type":17,"tag":84,"props":58853,"children":58854},{},[58855],{"type":23,"value":58856},"employee onboarding",{"type":17,"tag":84,"props":58858,"children":58859},{},[58860],{"type":23,"value":58608},{"type":17,"tag":84,"props":58862,"children":58863},{},[58864],{"type":23,"value":58865},"tax filings",{"type":17,"tag":84,"props":58867,"children":58868},{},[58869],{"type":23,"value":58807},{"type":17,"tag":29,"props":58871,"children":58872},{},[58873],{"type":23,"value":58874},"Gusto is widely used by HR, accounting, and workforce SaaS tools.",{"type":17,"tag":239,"props":58876,"children":58878},{"id":58877},"paychex-api",[58879],{"type":23,"value":58880},"Paychex API",{"type":17,"tag":29,"props":58882,"children":58883},{},[58884],{"type":17,"tag":133,"props":58885,"children":58888},{"href":58886,"rel":58887},"https://developer.paychex.com/",[214],[58889],{"type":23,"value":58890},"Paychex Developer Portal",{"type":17,"tag":29,"props":58892,"children":58893},{},[58894],{"type":23,"value":58895},"Paychex offers payroll and HR services for small to enterprise companies.",{"type":17,"tag":29,"props":58897,"children":58898},{},[58899],{"type":23,"value":49920},{"type":17,"tag":80,"props":58901,"children":58902},{},[58903,58908,58913,58917],{"type":17,"tag":84,"props":58904,"children":58905},{},[58906],{"type":23,"value":58907},"payroll processing",{"type":17,"tag":84,"props":58909,"children":58910},{},[58911],{"type":23,"value":58912},"employee records",{"type":17,"tag":84,"props":58914,"children":58915},{},[58916],{"type":23,"value":57458},{"type":17,"tag":84,"props":58918,"children":58919},{},[58920],{"type":23,"value":58921},"tax and compliance reporting",{"type":17,"tag":239,"props":58923,"children":58925},{"id":58924},"paylocity-api",[58926],{"type":23,"value":58927},"Paylocity API",{"type":17,"tag":29,"props":58929,"children":58930},{},[58931],{"type":17,"tag":133,"props":58932,"children":58935},{"href":58933,"rel":58934},"https://developer.paylocity.com/",[214],[58936],{"type":23,"value":58937},"Paylocity Developer Portal",{"type":17,"tag":29,"props":58939,"children":58940},{},[58941],{"type":23,"value":58942},"Paylocity provides payroll and HR technology platforms.",{"type":17,"tag":29,"props":58944,"children":58945},{},[58946],{"type":23,"value":56054},{"type":17,"tag":80,"props":58948,"children":58949},{},[58950,58955,58960,58964],{"type":17,"tag":84,"props":58951,"children":58952},{},[58953],{"type":23,"value":58954},"payroll runs and pay statements",{"type":17,"tag":84,"props":58956,"children":58957},{},[58958],{"type":23,"value":58959},"employee profiles",{"type":17,"tag":84,"props":58961,"children":58962},{},[58963],{"type":23,"value":58807},{"type":17,"tag":84,"props":58965,"children":58966},{},[58967],{"type":23,"value":57467},{"type":17,"tag":239,"props":58969,"children":58971},{"id":58970},"paycor-api",[58972],{"type":23,"value":58973},"Paycor API",{"type":17,"tag":29,"props":58975,"children":58976},{},[58977],{"type":17,"tag":133,"props":58978,"children":58981},{"href":58979,"rel":58980},"https://www.paycor.com/",[214],[58982],{"type":23,"value":58983},"Paycor",{"type":17,"tag":29,"props":58985,"children":58986},{},[58987],{"type":23,"value":58988},"Paycor offers payroll and workforce management software.",{"type":17,"tag":29,"props":58990,"children":58991},{},[58992],{"type":23,"value":54768},{"type":17,"tag":80,"props":58994,"children":58995},{},[58996,59001,59006,59011],{"type":17,"tag":84,"props":58997,"children":58998},{},[58999],{"type":23,"value":59000},"payroll reporting",{"type":17,"tag":84,"props":59002,"children":59003},{},[59004],{"type":23,"value":59005},"employee compensation data",{"type":17,"tag":84,"props":59007,"children":59008},{},[59009],{"type":23,"value":59010},"tax reporting",{"type":17,"tag":84,"props":59012,"children":59013},{},[59014],{"type":23,"value":59015},"HR and payroll automation",{"type":17,"tag":239,"props":59017,"children":59019},{"id":59018},"deel-api",[59020],{"type":23,"value":59021},"Deel API",{"type":17,"tag":29,"props":59023,"children":59024},{},[59025],{"type":17,"tag":133,"props":59026,"children":59029},{"href":59027,"rel":59028},"https://developer.deel.com/",[214],[59030],{"type":23,"value":59031},"Deel Developer Docs",{"type":17,"tag":29,"props":59033,"children":59034},{},[59035],{"type":23,"value":59036},"Deel focuses on global payroll and contractor payments.",{"type":17,"tag":29,"props":59038,"children":59039},{},[59040],{"type":23,"value":59041},"Its APIs enable automation for:",{"type":17,"tag":80,"props":59043,"children":59044},{},[59045,59050,59055,59060],{"type":17,"tag":84,"props":59046,"children":59047},{},[59048],{"type":23,"value":59049},"international payroll",{"type":17,"tag":84,"props":59051,"children":59052},{},[59053],{"type":23,"value":59054},"contractor management",{"type":17,"tag":84,"props":59056,"children":59057},{},[59058],{"type":23,"value":59059},"tax compliance workflows",{"type":17,"tag":84,"props":59061,"children":59062},{},[59063],{"type":23,"value":59064},"payment processing across jurisdictions",{"type":17,"tag":29,"props":59066,"children":59067},{},[59068],{"type":23,"value":59069},"Deel is widely used by global workforce SaaS products.",{"type":17,"tag":239,"props":59071,"children":59073},{"id":59072},"rippling-api",[59074],{"type":23,"value":59075},"Rippling API",{"type":17,"tag":29,"props":59077,"children":59078},{},[59079],{"type":17,"tag":133,"props":59080,"children":59082},{"href":57750,"rel":59081},[214],[59083],{"type":23,"value":59084},"Rippling Developer Portal",{"type":17,"tag":29,"props":59086,"children":59087},{},[59088],{"type":23,"value":59089},"Rippling combines HR, payroll, and identity provisioning in a unified platform.",{"type":17,"tag":29,"props":59091,"children":59092},{},[59093],{"type":23,"value":59094},"Payroll integrations typically include:",{"type":17,"tag":80,"props":59096,"children":59097},{},[59098,59102,59107,59112],{"type":17,"tag":84,"props":59099,"children":59100},{},[59101],{"type":23,"value":58907},{"type":17,"tag":84,"props":59103,"children":59104},{},[59105],{"type":23,"value":59106},"employee compensation",{"type":17,"tag":84,"props":59108,"children":59109},{},[59110],{"type":23,"value":59111},"benefits deductions",{"type":17,"tag":84,"props":59113,"children":59114},{},[59115],{"type":23,"value":59010},{"type":17,"tag":29,"props":59117,"children":59118},{},[59119],{"type":23,"value":59120},"Rippling is commonly integrated with IT provisioning systems.",{"type":17,"tag":239,"props":59122,"children":59124},{"id":59123},"quickbooks-payroll-api",[59125],{"type":23,"value":59126},"QuickBooks Payroll API",{"type":17,"tag":29,"props":59128,"children":59129},{},[59130],{"type":17,"tag":133,"props":59131,"children":59133},{"href":13076,"rel":59132},[214],[59134],{"type":23,"value":59135},"Intuit Developer Platform",{"type":17,"tag":29,"props":59137,"children":59138},{},[59139],{"type":23,"value":59140},"QuickBooks provides payroll tools integrated with accounting workflows.",{"type":17,"tag":29,"props":59142,"children":59143},{},[59144],{"type":23,"value":59145},"Typical API use cases include:",{"type":17,"tag":80,"props":59147,"children":59148},{},[59149,59153,59158,59163],{"type":17,"tag":84,"props":59150,"children":59151},{},[59152],{"type":23,"value":58851},{"type":17,"tag":84,"props":59154,"children":59155},{},[59156],{"type":23,"value":59157},"tax payments",{"type":17,"tag":84,"props":59159,"children":59160},{},[59161],{"type":23,"value":59162},"employee payroll records",{"type":17,"tag":84,"props":59164,"children":59165},{},[59166],{"type":23,"value":59167},"accounting reconciliation",{"type":17,"tag":239,"props":59169,"children":59171},{"id":59170},"square-payroll-api",[59172],{"type":23,"value":59173},"Square Payroll API",{"type":17,"tag":29,"props":59175,"children":59176},{},[59177],{"type":17,"tag":133,"props":59178,"children":59180},{"href":14189,"rel":59179},[214],[59181],{"type":23,"value":59182},"Square Developer Platform",{"type":17,"tag":29,"props":59184,"children":59185},{},[59186],{"type":23,"value":59187},"Square Payroll integrates with the broader Square ecosystem.",{"type":17,"tag":29,"props":59189,"children":59190},{},[59191],{"type":23,"value":49979},{"type":17,"tag":80,"props":59193,"children":59194},{},[59195,59200,59204,59208],{"type":17,"tag":84,"props":59196,"children":59197},{},[59198],{"type":23,"value":59199},"employee payroll",{"type":17,"tag":84,"props":59201,"children":59202},{},[59203],{"type":23,"value":58608},{"type":17,"tag":84,"props":59205,"children":59206},{},[59207],{"type":23,"value":59010},{"type":17,"tag":84,"props":59209,"children":59210},{},[59211],{"type":23,"value":59212},"payroll schedules",{"type":17,"tag":239,"props":59214,"children":59216},{"id":59215},"remote-api",[59217],{"type":23,"value":59218},"Remote API",{"type":17,"tag":29,"props":59220,"children":59221},{},[59222],{"type":17,"tag":133,"props":59223,"children":59226},{"href":59224,"rel":59225},"https://remote.com/",[214],[59227],{"type":23,"value":59228},"Remote",{"type":17,"tag":29,"props":59230,"children":59231},{},[59232],{"type":23,"value":59233},"Remote provides payroll and compliance infrastructure for global teams.",{"type":17,"tag":29,"props":59235,"children":59236},{},[59237],{"type":23,"value":49920},{"type":17,"tag":80,"props":59239,"children":59240},{},[59241,59246,59250,59255],{"type":17,"tag":84,"props":59242,"children":59243},{},[59244],{"type":23,"value":59245},"global payroll management",{"type":17,"tag":84,"props":59247,"children":59248},{},[59249],{"type":23,"value":58608},{"type":17,"tag":84,"props":59251,"children":59252},{},[59253],{"type":23,"value":59254},"employer-of-record services",{"type":17,"tag":84,"props":59256,"children":59257},{},[59258],{"type":23,"value":59259},"workforce compliance automation",{"type":17,"tag":239,"props":59261,"children":59262},{"id":57593},[59263],{"type":23,"value":57596},{"type":17,"tag":29,"props":59265,"children":59266},{},[59267],{"type":17,"tag":133,"props":59268,"children":59271},{"href":59269,"rel":59270},"https://www.ceridian.com/",[214],[59272],{"type":23,"value":59273},"Ceridian / Dayforce",{"type":17,"tag":29,"props":59275,"children":59276},{},[59277],{"type":23,"value":59278},"Ceridian Dayforce is widely used for enterprise payroll and workforce management.",{"type":17,"tag":29,"props":59280,"children":59281},{},[59282],{"type":23,"value":59283},"Typical payroll integration scenarios include:",{"type":17,"tag":80,"props":59285,"children":59286},{},[59287,59291,59296,59300],{"type":17,"tag":84,"props":59288,"children":59289},{},[59290],{"type":23,"value":58907},{"type":17,"tag":84,"props":59292,"children":59293},{},[59294],{"type":23,"value":59295},"pay statements",{"type":17,"tag":84,"props":59297,"children":59298},{},[59299],{"type":23,"value":57627},{"type":17,"tag":84,"props":59301,"children":59302},{},[59303],{"type":23,"value":53717},{"type":17,"tag":239,"props":59305,"children":59307},{"id":59306},"workday-payroll-api",[59308],{"type":23,"value":59309},"Workday Payroll API",{"type":17,"tag":29,"props":59311,"children":59312},{},[59313],{"type":17,"tag":133,"props":59314,"children":59317},{"href":59315,"rel":59316},"https://www.workday.com/",[214],[59318],{"type":23,"value":59319},"Workday",{"type":17,"tag":29,"props":59321,"children":59322},{},[59323],{"type":23,"value":59324},"Workday supports payroll and workforce infrastructure for large enterprises.",{"type":17,"tag":29,"props":59326,"children":59327},{},[59328],{"type":23,"value":59329},"Payroll-related integrations often include:",{"type":17,"tag":80,"props":59331,"children":59332},{},[59333,59338,59342,59347],{"type":17,"tag":84,"props":59334,"children":59335},{},[59336],{"type":23,"value":59337},"worker compensation",{"type":17,"tag":84,"props":59339,"children":59340},{},[59341],{"type":23,"value":58851},{"type":17,"tag":84,"props":59343,"children":59344},{},[59345],{"type":23,"value":59346},"tax data",{"type":17,"tag":84,"props":59348,"children":59349},{},[59350],{"type":23,"value":59351},"deductions and benefits",{"type":17,"tag":239,"props":59353,"children":59355},{"id":59354},"sage-payroll-api",[59356],{"type":23,"value":59357},"Sage Payroll API",{"type":17,"tag":29,"props":59359,"children":59360},{},[59361],{"type":17,"tag":133,"props":59362,"children":59365},{"href":59363,"rel":59364},"https://www.sage.com/",[214],[59366],{"type":23,"value":59367},"Sage",{"type":17,"tag":29,"props":59369,"children":59370},{},[59371],{"type":23,"value":59372},"Sage provides payroll and accounting software for SMB and mid-market businesses.",{"type":17,"tag":29,"props":59374,"children":59375},{},[59376],{"type":23,"value":54768},{"type":17,"tag":80,"props":59378,"children":59379},{},[59380,59384,59388],{"type":17,"tag":84,"props":59381,"children":59382},{},[59383],{"type":23,"value":57293},{"type":17,"tag":84,"props":59385,"children":59386},{},[59387],{"type":23,"value":59167},{"type":17,"tag":84,"props":59389,"children":59390},{},[59391],{"type":23,"value":59392},"reporting workflows",{"type":17,"tag":239,"props":59394,"children":59396},{"id":59395},"trinet-api",[59397],{"type":23,"value":59398},"TriNet API",{"type":17,"tag":29,"props":59400,"children":59401},{},[59402],{"type":17,"tag":133,"props":59403,"children":59406},{"href":59404,"rel":59405},"https://www.trinet.com/",[214],[59407],{"type":23,"value":59408},"TriNet",{"type":17,"tag":29,"props":59410,"children":59411},{},[59412],{"type":23,"value":59413},"TriNet offers payroll and HR support for SMBs and growing companies.",{"type":17,"tag":29,"props":59415,"children":59416},{},[59417],{"type":23,"value":53837},{"type":17,"tag":80,"props":59419,"children":59420},{},[59421,59426,59431],{"type":17,"tag":84,"props":59422,"children":59423},{},[59424],{"type":23,"value":59425},"payroll and employee records",{"type":17,"tag":84,"props":59427,"children":59428},{},[59429],{"type":23,"value":59430},"benefits administration",{"type":17,"tag":84,"props":59432,"children":59433},{},[59434],{"type":23,"value":53717},{"type":17,"tag":239,"props":59436,"children":59438},{"id":59437},"payfit-api",[59439],{"type":23,"value":59440},"PayFit API",{"type":17,"tag":29,"props":59442,"children":59443},{},[59444],{"type":17,"tag":133,"props":59445,"children":59448},{"href":59446,"rel":59447},"https://www.payfit.com/",[214],[59449],{"type":23,"value":59450},"PayFit",{"type":17,"tag":29,"props":59452,"children":59453},{},[59454],{"type":23,"value":59455},"PayFit is widely used in Europe for payroll and HR automation.",{"type":17,"tag":29,"props":59457,"children":59458},{},[59459],{"type":23,"value":59460},"Its platform is commonly integrated for:",{"type":17,"tag":80,"props":59462,"children":59463},{},[59464,59469,59474,59478],{"type":17,"tag":84,"props":59465,"children":59466},{},[59467],{"type":23,"value":59468},"payroll calculations",{"type":17,"tag":84,"props":59470,"children":59471},{},[59472],{"type":23,"value":59473},"leave and compensation",{"type":17,"tag":84,"props":59475,"children":59476},{},[59477],{"type":23,"value":58912},{"type":17,"tag":84,"props":59479,"children":59480},{},[59481],{"type":23,"value":59482},"compliance workflows",{"type":17,"tag":239,"props":59484,"children":59486},{"id":59485},"payworks-api",[59487],{"type":23,"value":59488},"Payworks API",{"type":17,"tag":29,"props":59490,"children":59491},{},[59492],{"type":17,"tag":133,"props":59493,"children":59496},{"href":59494,"rel":59495},"https://www.payworks.ca/",[214],[59497],{"type":23,"value":59498},"Payworks",{"type":17,"tag":29,"props":59500,"children":59501},{},[59502],{"type":23,"value":59503},"Payworks provides payroll solutions in Canada.",{"type":17,"tag":29,"props":59505,"children":59506},{},[59507],{"type":23,"value":54827},{"type":17,"tag":80,"props":59509,"children":59510},{},[59511,59516,59520],{"type":17,"tag":84,"props":59512,"children":59513},{},[59514],{"type":23,"value":59515},"payroll data exports",{"type":17,"tag":84,"props":59517,"children":59518},{},[59519],{"type":23,"value":58921},{"type":17,"tag":84,"props":59521,"children":59522},{},[59523],{"type":23,"value":59524},"employee pay records",{"type":17,"tag":68,"props":59526,"children":59528},{"id":59527},"additional-payroll-and-workforce-platforms",[59529],{"type":23,"value":59530},"Additional Payroll and Workforce Platforms",{"type":17,"tag":29,"props":59532,"children":59533},{},[59534],{"type":23,"value":59535},"Beyond the major payroll providers above, SaaS teams often integrate with adjacent payroll and workforce systems such as:",{"type":17,"tag":80,"props":59537,"children":59538},{},[59539,59547,59555,59565,59574,59582,59592,59600,59610,59619],{"type":17,"tag":84,"props":59540,"children":59541},{},[59542],{"type":17,"tag":133,"props":59543,"children":59545},{"href":57996,"rel":59544},[214],[59546],{"type":23,"value":58000},{"type":17,"tag":84,"props":59548,"children":59549},{},[59550],{"type":17,"tag":133,"props":59551,"children":59553},{"href":59224,"rel":59552},[214],[59554],{"type":23,"value":59228},{"type":17,"tag":84,"props":59556,"children":59557},{},[59558],{"type":17,"tag":133,"props":59559,"children":59562},{"href":59560,"rel":59561},"https://www.rippling.com/",[214],[59563],{"type":23,"value":59564},"Rippling",{"type":17,"tag":84,"props":59566,"children":59567},{},[59568],{"type":17,"tag":133,"props":59569,"children":59571},{"href":59269,"rel":59570},[214],[59572],{"type":23,"value":59573},"Ceridian Dayforce",{"type":17,"tag":84,"props":59575,"children":59576},{},[59577],{"type":17,"tag":133,"props":59578,"children":59580},{"href":59315,"rel":59579},[214],[59581],{"type":23,"value":59319},{"type":17,"tag":84,"props":59583,"children":59584},{},[59585],{"type":17,"tag":133,"props":59586,"children":59589},{"href":59587,"rel":59588},"https://www.paylocity.com/",[214],[59590],{"type":23,"value":59591},"Paylocity",{"type":17,"tag":84,"props":59593,"children":59594},{},[59595],{"type":17,"tag":133,"props":59596,"children":59598},{"href":58979,"rel":59597},[214],[59599],{"type":23,"value":58983},{"type":17,"tag":84,"props":59601,"children":59602},{},[59603],{"type":17,"tag":133,"props":59604,"children":59607},{"href":59605,"rel":59606},"https://gusto.com/",[214],[59608],{"type":23,"value":59609},"Gusto",{"type":17,"tag":84,"props":59611,"children":59612},{},[59613],{"type":17,"tag":133,"props":59614,"children":59617},{"href":59615,"rel":59616},"https://squareup.com/",[214],[59618],{"type":23,"value":14193},{"type":17,"tag":84,"props":59620,"children":59621},{},[59622],{"type":17,"tag":133,"props":59623,"children":59625},{"href":59363,"rel":59624},[214],[59626],{"type":23,"value":59367},{"type":17,"tag":29,"props":59628,"children":59629},{},[59630,59632,59637],{"type":23,"value":59631},"The payroll ecosystem is fragmented, and supporting customers often requires ",{"type":17,"tag":48,"props":59633,"children":59634},{},[59635],{"type":23,"value":59636},"integrating with multiple payroll systems simultaneously",{"type":23,"value":54},{"type":17,"tag":68,"props":59639,"children":59641},{"id":59640},"challenges-when-integrating-payroll-apis",[59642],{"type":23,"value":59643},"Challenges When Integrating Payroll APIs",{"type":17,"tag":29,"props":59645,"children":59646},{},[59647],{"type":23,"value":59648},"Building payroll integrations directly with each vendor introduces significant complexity.",{"type":17,"tag":239,"props":59650,"children":59652},{"id":59651},"security-and-compliance-requirements",[59653],{"type":23,"value":59654},"Security and compliance requirements",{"type":17,"tag":29,"props":59656,"children":59657},{},[59658],{"type":23,"value":59659},"Payroll data includes highly sensitive information such as compensation, tax identifiers, and bank accounts. Integrations must meet strict security and compliance requirements.",{"type":17,"tag":239,"props":59661,"children":59662},{"id":1785},[59663],{"type":23,"value":1788},{"type":17,"tag":29,"props":59665,"children":59666},{},[59667,59669,59673],{"type":23,"value":59668},"Payroll platforms use different authentication methods including ",{"type":17,"tag":133,"props":59670,"children":59671},{"href":779},[59672],{"type":23,"value":782},{"type":23,"value":59674},", API keys, and custom enterprise authentication systems.",{"type":17,"tag":239,"props":59676,"children":59678},{"id":59677},"inconsistent-payroll-schemas",[59679],{"type":23,"value":59680},"Inconsistent payroll schemas",{"type":17,"tag":29,"props":59682,"children":59683},{},[59684],{"type":23,"value":59685},"Payroll objects differ significantly across providers. Compensation, deductions, taxes, and benefits structures vary widely.",{"type":17,"tag":239,"props":59687,"children":59688},{"id":56713},[59689],{"type":23,"value":56716},{"type":17,"tag":29,"props":59691,"children":59692},{},[59693],{"type":23,"value":59694},"Payroll APIs frequently evolve, which requires continuous maintenance and monitoring.",{"type":17,"tag":239,"props":59696,"children":59698},{"id":59697},"rate-limits-and-job-processing",[59699],{"type":23,"value":59700},"Rate limits and job processing",{"type":17,"tag":29,"props":59702,"children":59703},{},[59704],{"type":23,"value":59705},"Payroll runs are often batch-based processes that introduce asynchronous workflows and queue management.",{"type":17,"tag":239,"props":59707,"children":59709},{"id":59708},"global-payroll-complexity",[59710],{"type":23,"value":59711},"Global payroll complexity",{"type":17,"tag":29,"props":59713,"children":59714},{},[59715],{"type":23,"value":59716},"Handling payroll across jurisdictions introduces tax, compliance, and currency challenges.",{"type":17,"tag":29,"props":59718,"children":59719},{},[59720],{"type":23,"value":59721},"As SaaS companies support more payroll providers, this complexity grows quickly.",{"type":17,"tag":68,"props":59723,"children":59725},{"id":59724},"the-role-of-unified-payroll-apis",[59726],{"type":23,"value":59727},"The Role of Unified Payroll APIs",{"type":17,"tag":29,"props":59729,"children":59730},{},[59731,59733,59738],{"type":23,"value":59732},"To reduce the complexity of integrating many payroll providers, many SaaS platforms adopt ",{"type":17,"tag":48,"props":59734,"children":59735},{},[59736],{"type":23,"value":59737},"Unified Payroll APIs",{"type":23,"value":54},{"type":17,"tag":29,"props":59740,"children":59741},{},[59742,59743,59747],{"type":23,"value":9619},{"type":17,"tag":133,"props":59744,"children":59745},{"href":7691},[59746],{"type":23,"value":7459},{"type":23,"value":59748}," standardizes authentication, schemas, and endpoints across multiple payroll platforms.",{"type":17,"tag":29,"props":59750,"children":59751},{},[59752],{"type":23,"value":59753},"Instead of building integrations separately for ADP, Gusto, Paychex, Paylocity, and many others, a unified API layer provides:",{"type":17,"tag":80,"props":59755,"children":59756},{},[59757,59761,59766,59770,59781],{"type":17,"tag":84,"props":59758,"children":59759},{},[59760],{"type":23,"value":23902},{"type":17,"tag":84,"props":59762,"children":59763},{},[59764],{"type":23,"value":59765},"normalized payroll data models",{"type":17,"tag":84,"props":59767,"children":59768},{},[59769],{"type":23,"value":50639},{"type":17,"tag":84,"props":59771,"children":59772},{},[59773,59775,59779],{"type":23,"value":59774},"unified ",{"type":17,"tag":133,"props":59776,"children":59777},{"href":4999},[59778],{"type":23,"value":5002},{"type":23,"value":59780}," and events",{"type":17,"tag":84,"props":59782,"children":59783},{},[59784],{"type":23,"value":59785},"automatic handling of provider API updates",{"type":17,"tag":29,"props":59787,"children":59788},{},[59789],{"type":23,"value":59790},"This significantly reduces engineering overhead.",{"type":17,"tag":68,"props":59792,"children":59794},{"id":59793},"build-once-with-the-unified-payroll-api",[59795],{"type":23,"value":59796},"Build Once with the Unified Payroll API",{"type":17,"tag":29,"props":59798,"children":59799},{},[59800],{"type":23,"value":59801},"Unified APIs allow developers to access payroll-related data across multiple providers through a single integration layer.",{"type":17,"tag":29,"props":59803,"children":59804},{},[59805],{"type":23,"value":59806},"That matters because payroll products rarely live in isolation. They are tightly connected to HR, benefits, deductions, time tracking, and employee lifecycle systems.",{"type":17,"tag":29,"props":59808,"children":59809},{},[59810],{"type":23,"value":59811},"If you're building payroll-related workflows, the broader HR and workforce layer usually matters just as much as the payroll run itself.",{"type":17,"tag":29,"props":59813,"children":59814},{},[59815,59817],{"type":23,"value":59816},"You can explore Unified's HR and workforce infrastructure here: ",{"type":17,"tag":133,"props":59818,"children":59820},{"href":58209,"rel":59819},[214],[59821],{"type":23,"value":58213},{"type":17,"tag":239,"props":59823,"children":59825},{"id":59824},"unified-hr-and-payroll-related-objects",[59826],{"type":23,"value":59827},"Unified HR and Payroll-Related Objects",{"type":17,"tag":29,"props":59829,"children":59830},{},[59831],{"type":23,"value":59832},"Unified supports a broad set of workforce and payroll-related objects, including:",{"type":17,"tag":80,"props":59834,"children":59835},{},[59836,59840,59844,59848,59852,59856,59861,59866,59871,59875],{"type":17,"tag":84,"props":59837,"children":59838},{},[59839],{"type":23,"value":58244},{"type":17,"tag":84,"props":59841,"children":59842},{},[59843],{"type":23,"value":56943},{"type":17,"tag":84,"props":59845,"children":59846},{},[59847],{"type":23,"value":58273},{"type":17,"tag":84,"props":59849,"children":59850},{},[59851],{"type":23,"value":58278},{"type":17,"tag":84,"props":59853,"children":59854},{},[59855],{"type":23,"value":58268},{"type":17,"tag":84,"props":59857,"children":59858},{},[59859],{"type":23,"value":59860},"Bank Accounts",{"type":17,"tag":84,"props":59862,"children":59863},{},[59864],{"type":23,"value":59865},"Time Off",{"type":17,"tag":84,"props":59867,"children":59868},{},[59869],{"type":23,"value":59870},"Time Shifts",{"type":17,"tag":84,"props":59872,"children":59873},{},[59874],{"type":23,"value":41728},{"type":17,"tag":84,"props":59876,"children":59877},{},[59878],{"type":23,"value":38951},{"type":17,"tag":29,"props":59880,"children":59881},{},[59882],{"type":23,"value":59883},"These objects support consistent operations across providers such as:",{"type":17,"tag":80,"props":59885,"children":59886},{},[59887,59891,59895,59899,59903],{"type":17,"tag":84,"props":59888,"children":59889},{},[59890],{"type":23,"value":11254},{"type":17,"tag":84,"props":59892,"children":59893},{},[59894],{"type":23,"value":11243},{"type":17,"tag":84,"props":59896,"children":59897},{},[59898],{"type":23,"value":24038},{"type":17,"tag":84,"props":59900,"children":59901},{},[59902],{"type":23,"value":11845},{"type":17,"tag":84,"props":59904,"children":59905},{},[59906],{"type":23,"value":11852},{"type":17,"tag":29,"props":59908,"children":59909},{},[59910],{"type":23,"value":59911},"This lets developers build payroll and workforce workflows once and support many systems through the same API architecture.",{"type":17,"tag":239,"props":59913,"children":59914},{"id":46536},[59915],{"type":23,"value":52075},{"type":17,"tag":29,"props":59917,"children":59918},{},[59919,59921,59925],{"type":23,"value":59920},"Unlike platforms that rely on cached datasets or periodic sync jobs, Unified uses a ",{"type":17,"tag":48,"props":59922,"children":59923},{},[59924],{"type":23,"value":50812},{"type":23,"value":54},{"type":17,"tag":29,"props":59927,"children":59928},{},[59929],{"type":23,"value":5804},{"type":17,"tag":80,"props":59931,"children":59932},{},[59933,59938,59943,59948],{"type":17,"tag":84,"props":59934,"children":59935},{},[59936],{"type":23,"value":59937},"every request hits the source API live",{"type":17,"tag":84,"props":59939,"children":59940},{},[59941],{"type":23,"value":59942},"payroll and workforce data stays current",{"type":17,"tag":84,"props":59944,"children":59945},{},[59946],{"type":23,"value":59947},"there are no stale sync cycles to manage",{"type":17,"tag":84,"props":59949,"children":59950},{},[59951],{"type":23,"value":59952},"you do not need to maintain separate synchronization infrastructure",{"type":17,"tag":239,"props":59954,"children":59955},{"id":13413},[59956],{"type":23,"value":54225},{"type":17,"tag":29,"props":59958,"children":59959},{},[59960],{"type":23,"value":59961},"Unified does not store end-customer payroll or workforce records.",{"type":17,"tag":29,"props":59963,"children":59964},{},[59965],{"type":23,"value":59966},"Requests are routed directly to the source system and processed statelessly.",{"type":17,"tag":29,"props":59968,"children":59969},{},[59970],{"type":23,"value":59971},"That architecture reduces:",{"type":17,"tag":80,"props":59973,"children":59974},{},[59975,59979,59983,59988],{"type":17,"tag":84,"props":59976,"children":59977},{},[59978],{"type":23,"value":9406},{"type":17,"tag":84,"props":59980,"children":59981},{},[59982],{"type":23,"value":55509},{"type":17,"tag":84,"props":59984,"children":59985},{},[59986],{"type":23,"value":59987},"retention and deletion overhead",{"type":17,"tag":84,"props":59989,"children":59990},{},[59991],{"type":23,"value":59992},"security exposure from mirrored payroll data",{"type":17,"tag":29,"props":59994,"children":59995},{},[59996],{"type":23,"value":59997},"For payroll-related integrations, that matters a lot.",{"type":17,"tag":68,"props":59999,"children":60000},{"id":1552},[60001],{"type":23,"value":44411},{"type":17,"tag":29,"props":60003,"children":60004},{},[60005],{"type":23,"value":60006},"Payroll APIs power critical workflows across HR, finance, and workforce software.",{"type":17,"tag":29,"props":60008,"children":60009},{},[60010],{"type":23,"value":60011},"But integrating payroll platforms one by one can quickly become a complex engineering problem involving different authentication systems, schemas, compliance requirements, and maintenance burdens.",{"type":17,"tag":29,"props":60013,"children":60014},{},[60015,60017,60022],{"type":23,"value":60016},"As the payroll ecosystem continues to expand, more SaaS companies are moving toward ",{"type":17,"tag":48,"props":60018,"children":60019},{},[60020],{"type":23,"value":60021},"unified payroll and workforce APIs",{"type":23,"value":60023}," to reduce complexity and launch integrations faster.",{"type":17,"tag":29,"props":60025,"children":60026},{},[60027,60029,60034],{"type":23,"value":60028},"If your product needs to support payroll-related workflows, unified APIs provide a scalable path to support ",{"type":17,"tag":48,"props":60030,"children":60031},{},[60032],{"type":23,"value":60033},"ADP, Gusto, Paychex, and many other payroll platforms",{"type":23,"value":60035}," without building and maintaining separate integrations for each one.",{"type":17,"tag":29,"props":60037,"children":60038},{},[60039],{"type":23,"value":60040},"For future posts, I'll keep all links in this inline format so they paste cleanly into Notion.",{"type":17,"tag":29,"props":60042,"children":60043},{},[60044],{"type":17,"tag":133,"props":60045,"children":60047},{"href":1612,"rel":60046},[214],[60048],{"type":23,"value":44481},{"type":17,"tag":29,"props":60050,"children":60051},{},[60052],{"type":17,"tag":133,"props":60053,"children":60055},{"href":1623,"rel":60054},[214],[60056],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":60058},[60059,60060,60067,60085,60086,60094,60095,60100],{"id":58551,"depth":1629,"text":58554},{"id":58666,"depth":1629,"text":58669,"children":60061},[60062,60063,60064,60065,60066],{"id":58681,"depth":1635,"text":58684},{"id":58692,"depth":1635,"text":58695},{"id":58703,"depth":1635,"text":58706},{"id":58714,"depth":1635,"text":58717},{"id":58725,"depth":1635,"text":58728},{"id":58747,"depth":1629,"text":58750,"children":60068},[60069,60070,60071,60072,60073,60074,60075,60076,60077,60078,60079,60080,60081,60082,60083,60084],{"id":58764,"depth":1635,"text":58767},{"id":58820,"depth":1635,"text":58823},{"id":58877,"depth":1635,"text":58880},{"id":58924,"depth":1635,"text":58927},{"id":58970,"depth":1635,"text":58973},{"id":59018,"depth":1635,"text":59021},{"id":59072,"depth":1635,"text":59075},{"id":59123,"depth":1635,"text":59126},{"id":59170,"depth":1635,"text":59173},{"id":59215,"depth":1635,"text":59218},{"id":57593,"depth":1635,"text":57596},{"id":59306,"depth":1635,"text":59309},{"id":59354,"depth":1635,"text":59357},{"id":59395,"depth":1635,"text":59398},{"id":59437,"depth":1635,"text":59440},{"id":59485,"depth":1635,"text":59488},{"id":59527,"depth":1629,"text":59530},{"id":59640,"depth":1629,"text":59643,"children":60087},[60088,60089,60090,60091,60092,60093],{"id":59651,"depth":1635,"text":59654},{"id":1785,"depth":1635,"text":1788},{"id":59677,"depth":1635,"text":59680},{"id":56713,"depth":1635,"text":56716},{"id":59697,"depth":1635,"text":59700},{"id":59708,"depth":1635,"text":59711},{"id":59724,"depth":1629,"text":59727},{"id":59793,"depth":1629,"text":59796,"children":60096},[60097,60098,60099],{"id":59824,"depth":1635,"text":59827},{"id":46536,"depth":1635,"text":52075},{"id":13413,"depth":1635,"text":54225},{"id":1552,"depth":1629,"text":44411},"content:blog:15_payroll_apis_to_integrate_with_in_2026_adp_gusto_paychex.md","blog/15_payroll_apis_to_integrate_with_in_2026_adp_gusto_paychex.md","blog/15_payroll_apis_to_integrate_with_in_2026_adp_gusto_paychex",{"_path":60105,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":60106,"description":60107,"img":60108,"date":60109,"tag":12,"body":60110,"_type":1677,"_id":61529,"_source":1679,"_file":61530,"_stem":61531,"_extension":1682},"/blog/25_hris_apis_to_integrate_with_in_2026_workday_bamboohr_adp_and_unified_hr_integration_apis","25 HRIS APIs to Integrate With in 2026: Workday, BambooHR, ADP and Unified HR Integration APIs","Human Resource Information Systems (HRIS) sit at the center of modern workforce infrastructure. They manage employee records, payroll data, organizational...","https://s3.us-east-2.amazonaws.com/unified-article-images/25_hris_apis_to_integrate_with_in_2026_workday_bamboohr_adp_and_unified_hr_integration_apis-icon.png","2026-03-11T15:14:00.000Z",{"type":14,"children":60111,"toc":61490},[60112,60117,60120,60127,60137,60142,60153,60171,60177,60192,60197,60240,60245,60277,60282,60288,60293,60297,60303,60308,60314,60319,60325,60330,60336,60341,60347,60352,60364,60370,60382,60388,60397,60402,60406,60433,60438,60444,60454,60459,60464,60491,60495,60504,60509,60513,60538,60543,60547,60556,60561,60565,60588,60599,60605,60615,60620,60625,60647,60652,60658,60668,60673,60678,60700,60705,60711,60720,60725,60729,60751,60755,60764,60769,60773,60795,60799,60808,60813,60817,60836,60840,60849,60854,60858,60880,60886,60891,61011,61021,61027,61032,61036,61047,61051,61056,61060,61065,61069,61074,61078,61083,61089,61094,61099,61105,61114,61119,61124,61149,61154,61160,61176,61187,61192,61198,61203,61211,61216,61223,61228,61235,61240,61247,61252,61259,61264,61271,61276,61283,61288,61295,61300,61307,61312,61319,61324,61328,61351,61356,61360,61370,61375,61379,61401,61405,61410,61415,61421,61426,61438,61442,61447,61452,61463,61474,61482],{"type":17,"tag":18,"props":60113,"children":60115},{"id":60114},"_25-hris-apis-to-integrate-with-in-2026-workday-bamboohr-adp-and-unified-hr-integration-apis",[60116],{"type":23,"value":60106},{"type":17,"tag":25,"props":60118,"children":60119},{},[],{"type":17,"tag":29,"props":60121,"children":60122},{},[60123],{"type":17,"tag":33,"props":60124,"children":60125},{},[60126],{"type":23,"value":49465},{"type":17,"tag":29,"props":60128,"children":60129},{},[60130,60132],{"type":23,"value":60131},"Human Resource Information Systems (HRIS) sit at the center of modern workforce infrastructure. They manage employee records, payroll data, organizational structures, benefits, time-off balances, and much more. As SaaS products increasingly integrate with HR platforms to automate onboarding, identity provisioning, workforce analytics, and payroll workflows, ",{"type":17,"tag":48,"props":60133,"children":60134},{},[60135],{"type":23,"value":60136},"HRIS APIs have become a core part of product architecture.",{"type":17,"tag":29,"props":60138,"children":60139},{},[60140],{"type":23,"value":60141},"But integrating HR systems is rarely simple.",{"type":17,"tag":29,"props":60143,"children":60144},{},[60145,60147,60151],{"type":23,"value":60146},"Every HR platform exposes different APIs, authentication flows, schemas, ",{"type":17,"tag":133,"props":60148,"children":60149},{"href":135},[60150],{"type":23,"value":138},{"type":23,"value":60152},", and event systems. Building integrations across Workday, BambooHR, ADP, and dozens of other systems quickly becomes a major engineering burden.",{"type":17,"tag":29,"props":60154,"children":60155},{},[60156,60157,60162,60164,60169],{"type":23,"value":12584},{"type":17,"tag":48,"props":60158,"children":60159},{},[60160],{"type":23,"value":60161},"25+ HRIS APIs developers commonly integrate with",{"type":23,"value":60163},", the challenges of building HR integrations, and why many SaaS companies now rely on ",{"type":17,"tag":48,"props":60165,"children":60166},{},[60167],{"type":23,"value":60168},"Unified HR APIs",{"type":23,"value":60170}," to scale integrations across hundreds of workforce systems.",{"type":17,"tag":68,"props":60172,"children":60174},{"id":60173},"what-is-an-hris-api",[60175],{"type":23,"value":60176},"What Is an HRIS API?",{"type":17,"tag":29,"props":60178,"children":60179},{},[60180,60181,60190],{"type":23,"value":40437},{"type":17,"tag":48,"props":60182,"children":60183},{},[60184],{"type":17,"tag":133,"props":60185,"children":60187},{"href":60186},"/hris",[60188],{"type":23,"value":60189},"HRIS API",{"type":23,"value":60191}," allows software applications to access employee and workforce data programmatically.",{"type":17,"tag":29,"props":60193,"children":60194},{},[60195],{"type":23,"value":60196},"Typical HRIS APIs expose endpoints for:",{"type":17,"tag":80,"props":60198,"children":60199},{},[60200,60205,60210,60215,60220,60225,60230,60235],{"type":17,"tag":84,"props":60201,"children":60202},{},[60203],{"type":23,"value":60204},"Employee records",{"type":17,"tag":84,"props":60206,"children":60207},{},[60208],{"type":23,"value":60209},"Organizational groups or departments",{"type":17,"tag":84,"props":60211,"children":60212},{},[60213],{"type":23,"value":60214},"Locations and offices",{"type":17,"tag":84,"props":60216,"children":60217},{},[60218],{"type":23,"value":60219},"Payroll and payslips",{"type":17,"tag":84,"props":60221,"children":60222},{},[60223],{"type":23,"value":60224},"Benefits and deductions",{"type":17,"tag":84,"props":60226,"children":60227},{},[60228],{"type":23,"value":60229},"Time-off balances and PTO requests",{"type":17,"tag":84,"props":60231,"children":60232},{},[60233],{"type":23,"value":60234},"Work schedules and timesheets",{"type":17,"tag":84,"props":60236,"children":60237},{},[60238],{"type":23,"value":60239},"Devices and assets assigned to employees",{"type":17,"tag":29,"props":60241,"children":60242},{},[60243],{"type":23,"value":60244},"These APIs enable SaaS products to build workflows such as:",{"type":17,"tag":80,"props":60246,"children":60247},{},[60248,60253,60258,60263,60267,60272],{"type":17,"tag":84,"props":60249,"children":60250},{},[60251],{"type":23,"value":60252},"employee onboarding automation",{"type":17,"tag":84,"props":60254,"children":60255},{},[60256],{"type":23,"value":60257},"identity and access provisioning",{"type":17,"tag":84,"props":60259,"children":60260},{},[60261],{"type":23,"value":60262},"HR analytics dashboards",{"type":17,"tag":84,"props":60264,"children":60265},{},[60266],{"type":23,"value":57293},{"type":17,"tag":84,"props":60268,"children":60269},{},[60270],{"type":23,"value":60271},"workforce planning tools",{"type":17,"tag":84,"props":60273,"children":60274},{},[60275],{"type":23,"value":60276},"employee directories and org charts",{"type":17,"tag":29,"props":60278,"children":60279},{},[60280],{"type":23,"value":60281},"However, every HR vendor structures these APIs differently, which creates significant complexity for developers.",{"type":17,"tag":68,"props":60283,"children":60285},{"id":60284},"why-saas-products-integrate-with-hris-apis",[60286],{"type":23,"value":60287},"Why SaaS Products Integrate with HRIS APIs",{"type":17,"tag":29,"props":60289,"children":60290},{},[60291],{"type":23,"value":60292},"Many SaaS products rely on HR integrations to deliver key features.",{"type":17,"tag":29,"props":60294,"children":60295},{},[60296],{"type":23,"value":12661},{"type":17,"tag":239,"props":60298,"children":60300},{"id":60299},"employee-onboarding-and-offboarding-automation",[60301],{"type":23,"value":60302},"Employee onboarding and offboarding automation",{"type":17,"tag":29,"props":60304,"children":60305},{},[60306],{"type":23,"value":60307},"Automatically create user accounts in SaaS tools when a new employee appears in an HR system, and revoke access when employees leave.",{"type":17,"tag":239,"props":60309,"children":60311},{"id":60310},"identity-and-access-management",[60312],{"type":23,"value":60313},"Identity and access management",{"type":17,"tag":29,"props":60315,"children":60316},{},[60317],{"type":23,"value":60318},"Sync employee roles, departments, and reporting structures to enforce access policies across tools like Okta or Active Directory.",{"type":17,"tag":239,"props":60320,"children":60322},{"id":60321},"employee-directories-and-org-charts",[60323],{"type":23,"value":60324},"Employee directories and org charts",{"type":17,"tag":29,"props":60326,"children":60327},{},[60328],{"type":23,"value":60329},"Display up-to-date workforce information inside collaboration tools, intranets, or productivity apps.",{"type":17,"tag":239,"props":60331,"children":60333},{"id":60332},"benefits-and-payroll-integrations",[60334],{"type":23,"value":60335},"Benefits and payroll integrations",{"type":17,"tag":29,"props":60337,"children":60338},{},[60339],{"type":23,"value":60340},"Sync compensation, benefits eligibility, and deductions across payroll and finance systems.",{"type":17,"tag":239,"props":60342,"children":60344},{"id":60343},"hr-analytics-and-workforce-insights",[60345],{"type":23,"value":60346},"HR analytics and workforce insights",{"type":17,"tag":29,"props":60348,"children":60349},{},[60350],{"type":23,"value":60351},"Pull employee data into analytics platforms to track headcount, turnover, and workforce planning metrics.",{"type":17,"tag":29,"props":60353,"children":60354},{},[60355,60357,60362],{"type":23,"value":60356},"Because HR systems often act as the ",{"type":17,"tag":48,"props":60358,"children":60359},{},[60360],{"type":23,"value":60361},"system of record for employee data",{"type":23,"value":60363},", integrating them is essential for many SaaS platforms.",{"type":17,"tag":68,"props":60365,"children":60367},{"id":60366},"_25-hris-apis-developers-integrate-with",[60368],{"type":23,"value":60369},"25+ HRIS APIs Developers Integrate With",{"type":17,"tag":29,"props":60371,"children":60372},{},[60373,60375,60380],{"type":23,"value":60374},"There are hundreds of HR and workforce management platforms available today. Below are some of the ",{"type":17,"tag":48,"props":60376,"children":60377},{},[60378],{"type":23,"value":60379},"most commonly integrated HRIS APIs",{"type":23,"value":60381}," used by SaaS products.",{"type":17,"tag":239,"props":60383,"children":60385},{"id":60384},"workday-api",[60386],{"type":23,"value":60387},"Workday API",{"type":17,"tag":29,"props":60389,"children":60390},{},[60391],{"type":17,"tag":133,"props":60392,"children":60394},{"href":55031,"rel":60393},[214],[60395],{"type":23,"value":60396},"Workday Developer API documentation",{"type":17,"tag":29,"props":60398,"children":60399},{},[60400],{"type":23,"value":60401},"Workday is one of the most widely used enterprise HR systems. Its APIs allow developers to access employee records, organizational hierarchies, payroll information, and benefits data.",{"type":17,"tag":29,"props":60403,"children":60404},{},[60405],{"type":23,"value":49790},{"type":17,"tag":80,"props":60407,"children":60408},{},[60409,60414,60419,60423,60428],{"type":17,"tag":84,"props":60410,"children":60411},{},[60412],{"type":23,"value":60413},"worker and employee profiles",{"type":17,"tag":84,"props":60415,"children":60416},{},[60417],{"type":23,"value":60418},"payroll and compensation data",{"type":17,"tag":84,"props":60420,"children":60421},{},[60422],{"type":23,"value":49873},{"type":17,"tag":84,"props":60424,"children":60425},{},[60426],{"type":23,"value":60427},"recruiting and talent management",{"type":17,"tag":84,"props":60429,"children":60430},{},[60431],{"type":23,"value":60432},"reporting APIs",{"type":17,"tag":29,"props":60434,"children":60435},{},[60436],{"type":23,"value":60437},"Workday integrations are common in enterprise SaaS products but can be complex due to SOAP and REST API variations.",{"type":17,"tag":239,"props":60439,"children":60441},{"id":60440},"bamboohr-api",[60442],{"type":23,"value":60443},"BambooHR API",{"type":17,"tag":29,"props":60445,"children":60446},{},[60447],{"type":17,"tag":133,"props":60448,"children":60451},{"href":60449,"rel":60450},"https://documentation.bamboohr.com/docs/api-details",[214],[60452],{"type":23,"value":60453},"BambooHR API documentation",{"type":17,"tag":29,"props":60455,"children":60456},{},[60457],{"type":23,"value":60458},"BambooHR is a popular HRIS platform for mid-market companies. Its REST API provides access to employee records, time-off requests, company directories, and custom employee fields.",{"type":17,"tag":29,"props":60460,"children":60461},{},[60462],{"type":23,"value":60463},"Typical endpoints include:",{"type":17,"tag":80,"props":60465,"children":60466},{},[60467,60471,60476,60481,60486],{"type":17,"tag":84,"props":60468,"children":60469},{},[60470],{"type":23,"value":58959},{"type":17,"tag":84,"props":60472,"children":60473},{},[60474],{"type":23,"value":60475},"time-off requests and balances",{"type":17,"tag":84,"props":60477,"children":60478},{},[60479],{"type":23,"value":60480},"job information",{"type":17,"tag":84,"props":60482,"children":60483},{},[60484],{"type":23,"value":60485},"company directory data",{"type":17,"tag":84,"props":60487,"children":60488},{},[60489],{"type":23,"value":60490},"employee lifecycle changes",{"type":17,"tag":239,"props":60492,"children":60493},{"id":57644},[60494],{"type":23,"value":57647},{"type":17,"tag":29,"props":60496,"children":60497},{},[60498],{"type":17,"tag":133,"props":60499,"children":60501},{"href":57653,"rel":60500},[214],[60502],{"type":23,"value":60503},"ADP Developer Platform",{"type":17,"tag":29,"props":60505,"children":60506},{},[60507],{"type":23,"value":60508},"ADP Workforce Now is one of the largest payroll and HR platforms globally. Its APIs allow SaaS products to retrieve payroll records, employee information, and workforce data.",{"type":17,"tag":29,"props":60510,"children":60511},{},[60512],{"type":23,"value":49979},{"type":17,"tag":80,"props":60514,"children":60515},{},[60516,60521,60526,60530,60534],{"type":17,"tag":84,"props":60517,"children":60518},{},[60519],{"type":23,"value":60520},"payroll data and pay statements",{"type":17,"tag":84,"props":60522,"children":60523},{},[60524],{"type":23,"value":60525},"worker records",{"type":17,"tag":84,"props":60527,"children":60528},{},[60529],{"type":23,"value":58807},{"type":17,"tag":84,"props":60531,"children":60532},{},[60533],{"type":23,"value":57627},{"type":17,"tag":84,"props":60535,"children":60536},{},[60537],{"type":23,"value":58921},{"type":17,"tag":29,"props":60539,"children":60540},{},[60541],{"type":23,"value":60542},"ADP integrations often require partner access and enterprise authentication flows.",{"type":17,"tag":239,"props":60544,"children":60545},{"id":59072},[60546],{"type":23,"value":59075},{"type":17,"tag":29,"props":60548,"children":60549},{},[60550],{"type":17,"tag":133,"props":60551,"children":60553},{"href":57750,"rel":60552},[214],[60554],{"type":23,"value":60555},"Rippling API documentation",{"type":17,"tag":29,"props":60557,"children":60558},{},[60559],{"type":23,"value":60560},"Rippling combines HR, payroll, device management, and identity provisioning into a unified workforce platform.",{"type":17,"tag":29,"props":60562,"children":60563},{},[60564],{"type":23,"value":59041},{"type":17,"tag":80,"props":60566,"children":60567},{},[60568,60573,60578,60583],{"type":17,"tag":84,"props":60569,"children":60570},{},[60571],{"type":23,"value":60572},"employee lifecycle events",{"type":17,"tag":84,"props":60574,"children":60575},{},[60576],{"type":23,"value":60577},"device and application provisioning",{"type":17,"tag":84,"props":60579,"children":60580},{},[60581],{"type":23,"value":60582},"payroll data",{"type":17,"tag":84,"props":60584,"children":60585},{},[60586],{"type":23,"value":60587},"benefits and deductions",{"type":17,"tag":29,"props":60589,"children":60590},{},[60591,60593,60598],{"type":23,"value":60592},"Rippling is commonly used for ",{"type":17,"tag":48,"props":60594,"children":60595},{},[60596],{"type":23,"value":60597},"IT provisioning workflows triggered by HR events",{"type":23,"value":54},{"type":17,"tag":239,"props":60600,"children":60602},{"id":60601},"personio-api",[60603],{"type":23,"value":60604},"Personio API",{"type":17,"tag":29,"props":60606,"children":60607},{},[60608],{"type":17,"tag":133,"props":60609,"children":60612},{"href":60610,"rel":60611},"https://developer.personio.de/",[214],[60613],{"type":23,"value":60614},"Personio API documentation",{"type":17,"tag":29,"props":60616,"children":60617},{},[60618],{"type":23,"value":60619},"Personio is widely used by European companies for HR management.",{"type":17,"tag":29,"props":60621,"children":60622},{},[60623],{"type":23,"value":60624},"The Personio API provides endpoints for:",{"type":17,"tag":80,"props":60626,"children":60627},{},[60628,60632,60637,60642],{"type":17,"tag":84,"props":60629,"children":60630},{},[60631],{"type":23,"value":58912},{"type":17,"tag":84,"props":60633,"children":60634},{},[60635],{"type":23,"value":60636},"absences and time off",{"type":17,"tag":84,"props":60638,"children":60639},{},[60640],{"type":23,"value":60641},"departments and teams",{"type":17,"tag":84,"props":60643,"children":60644},{},[60645],{"type":23,"value":60646},"payroll attributes",{"type":17,"tag":29,"props":60648,"children":60649},{},[60650],{"type":23,"value":60651},"Personio is often integrated into workforce analytics and HR automation tools.",{"type":17,"tag":239,"props":60653,"children":60655},{"id":60654},"hibob-api",[60656],{"type":23,"value":60657},"HiBob API",{"type":17,"tag":29,"props":60659,"children":60660},{},[60661],{"type":17,"tag":133,"props":60662,"children":60665},{"href":60663,"rel":60664},"https://apidocs.hibob.com/",[214],[60666],{"type":23,"value":60667},"HiBob API documentation",{"type":17,"tag":29,"props":60669,"children":60670},{},[60671],{"type":23,"value":60672},"HiBob provides modern HR infrastructure for scaling companies.",{"type":17,"tag":29,"props":60674,"children":60675},{},[60676],{"type":23,"value":60677},"Its API allows access to:",{"type":17,"tag":80,"props":60679,"children":60680},{},[60681,60685,60690,60695],{"type":17,"tag":84,"props":60682,"children":60683},{},[60684],{"type":23,"value":58959},{"type":17,"tag":84,"props":60686,"children":60687},{},[60688],{"type":23,"value":60689},"company structures",{"type":17,"tag":84,"props":60691,"children":60692},{},[60693],{"type":23,"value":60694},"lifecycle events",{"type":17,"tag":84,"props":60696,"children":60697},{},[60698],{"type":23,"value":60699},"custom employee attributes",{"type":17,"tag":29,"props":60701,"children":60702},{},[60703],{"type":23,"value":60704},"HiBob is frequently used by global startups and scale-ups.",{"type":17,"tag":239,"props":60706,"children":60708},{"id":60707},"ukg-api",[60709],{"type":23,"value":60710},"UKG API",{"type":17,"tag":29,"props":60712,"children":60713},{},[60714],{"type":17,"tag":133,"props":60715,"children":60717},{"href":57431,"rel":60716},[214],[60718],{"type":23,"value":60719},"UKG Developer Platform",{"type":17,"tag":29,"props":60721,"children":60722},{},[60723],{"type":23,"value":60724},"UKG (Ultimate Kronos Group) provides workforce management and HR platforms including UKG Pro and UKG Ready.",{"type":17,"tag":29,"props":60726,"children":60727},{},[60728],{"type":23,"value":54827},{"type":17,"tag":80,"props":60730,"children":60731},{},[60732,60736,60741,60746],{"type":17,"tag":84,"props":60733,"children":60734},{},[60735],{"type":23,"value":58912},{"type":17,"tag":84,"props":60737,"children":60738},{},[60739],{"type":23,"value":60740},"workforce scheduling",{"type":17,"tag":84,"props":60742,"children":60743},{},[60744],{"type":23,"value":60745},"payroll",{"type":17,"tag":84,"props":60747,"children":60748},{},[60749],{"type":23,"value":60750},"attendance tracking",{"type":17,"tag":239,"props":60752,"children":60753},{"id":57593},[60754],{"type":23,"value":57596},{"type":17,"tag":29,"props":60756,"children":60757},{},[60758],{"type":17,"tag":133,"props":60759,"children":60761},{"href":57602,"rel":60760},[214],[60762],{"type":23,"value":60763},"Dayforce Developer Portal",{"type":17,"tag":29,"props":60765,"children":60766},{},[60767],{"type":23,"value":60768},"Ceridian Dayforce is another enterprise workforce platform used for payroll and scheduling.",{"type":17,"tag":29,"props":60770,"children":60771},{},[60772],{"type":23,"value":56054},{"type":17,"tag":80,"props":60774,"children":60775},{},[60776,60781,60785,60790],{"type":17,"tag":84,"props":60777,"children":60778},{},[60779],{"type":23,"value":60780},"employee information",{"type":17,"tag":84,"props":60782,"children":60783},{},[60784],{"type":23,"value":57458},{"type":17,"tag":84,"props":60786,"children":60787},{},[60788],{"type":23,"value":60789},"payroll information",{"type":17,"tag":84,"props":60791,"children":60792},{},[60793],{"type":23,"value":60794},"HR reporting endpoints",{"type":17,"tag":239,"props":60796,"children":60797},{"id":58820},[60798],{"type":23,"value":58823},{"type":17,"tag":29,"props":60800,"children":60801},{},[60802],{"type":17,"tag":133,"props":60803,"children":60805},{"href":58829,"rel":60804},[214],[60806],{"type":23,"value":60807},"Gusto API documentation",{"type":17,"tag":29,"props":60809,"children":60810},{},[60811],{"type":23,"value":60812},"Gusto provides payroll and HR tools for SMBs. Its API supports integrations for payroll automation, employee data, and benefits.",{"type":17,"tag":29,"props":60814,"children":60815},{},[60816],{"type":23,"value":12661},{"type":17,"tag":80,"props":60818,"children":60819},{},[60820,60824,60828,60832],{"type":17,"tag":84,"props":60821,"children":60822},{},[60823],{"type":23,"value":58907},{"type":17,"tag":84,"props":60825,"children":60826},{},[60827],{"type":23,"value":58856},{"type":17,"tag":84,"props":60829,"children":60830},{},[60831],{"type":23,"value":59010},{"type":17,"tag":84,"props":60833,"children":60834},{},[60835],{"type":23,"value":58608},{"type":17,"tag":239,"props":60837,"children":60838},{"id":59018},[60839],{"type":23,"value":59021},{"type":17,"tag":29,"props":60841,"children":60842},{},[60843],{"type":17,"tag":133,"props":60844,"children":60846},{"href":59027,"rel":60845},[214],[60847],{"type":23,"value":60848},"Deel API documentation",{"type":17,"tag":29,"props":60850,"children":60851},{},[60852],{"type":23,"value":60853},"Deel focuses on global payroll and contractor management. Its APIs enable SaaS products to automate onboarding and payroll for international teams.",{"type":17,"tag":29,"props":60855,"children":60856},{},[60857],{"type":23,"value":49979},{"type":17,"tag":80,"props":60859,"children":60860},{},[60861,60866,60871,60875],{"type":17,"tag":84,"props":60862,"children":60863},{},[60864],{"type":23,"value":60865},"contractor and employee management",{"type":17,"tag":84,"props":60867,"children":60868},{},[60869],{"type":23,"value":60870},"payroll payments",{"type":17,"tag":84,"props":60872,"children":60873},{},[60874],{"type":23,"value":59482},{"type":17,"tag":84,"props":60876,"children":60877},{},[60878],{"type":23,"value":60879},"global hiring support",{"type":17,"tag":239,"props":60881,"children":60883},{"id":60882},"additional-hris-apis",[60884],{"type":23,"value":60885},"Additional HRIS APIs",{"type":17,"tag":29,"props":60887,"children":60888},{},[60889],{"type":23,"value":60890},"Beyond the major platforms above, SaaS companies often integrate with many other HR tools, including:",{"type":17,"tag":80,"props":60892,"children":60893},{},[60894,60904,60914,60922,60930,60940,60950,60960,60970,60978,60986,60994,61003],{"type":17,"tag":84,"props":60895,"children":60896},{},[60897],{"type":17,"tag":133,"props":60898,"children":60901},{"href":60899,"rel":60900},"https://www.namely.com/",[214],[60902],{"type":23,"value":60903},"Namely",{"type":17,"tag":84,"props":60905,"children":60906},{},[60907],{"type":17,"tag":133,"props":60908,"children":60911},{"href":60909,"rel":60910},"https://www.paychex.com/",[214],[60912],{"type":23,"value":60913},"Paychex",{"type":17,"tag":84,"props":60915,"children":60916},{},[60917],{"type":17,"tag":133,"props":60918,"children":60920},{"href":59587,"rel":60919},[214],[60921],{"type":23,"value":59591},{"type":17,"tag":84,"props":60923,"children":60924},{},[60925],{"type":17,"tag":133,"props":60926,"children":60928},{"href":58979,"rel":60927},[214],[60929],{"type":23,"value":58983},{"type":17,"tag":84,"props":60931,"children":60932},{},[60933],{"type":17,"tag":133,"props":60934,"children":60937},{"href":60935,"rel":60936},"https://humaans.io/",[214],[60938],{"type":23,"value":60939},"Humaans",{"type":17,"tag":84,"props":60941,"children":60942},{},[60943],{"type":17,"tag":133,"props":60944,"children":60947},{"href":60945,"rel":60946},"https://lattice.com/",[214],[60948],{"type":23,"value":60949},"Lattice",{"type":17,"tag":84,"props":60951,"children":60952},{},[60953],{"type":17,"tag":133,"props":60954,"children":60957},{"href":60955,"rel":60956},"https://leapsome.com/",[214],[60958],{"type":23,"value":60959},"Leapsome",{"type":17,"tag":84,"props":60961,"children":60962},{},[60963],{"type":17,"tag":133,"props":60964,"children":60967},{"href":60965,"rel":60966},"https://cultureamp.com/",[214],[60968],{"type":23,"value":60969},"Culture Amp",{"type":17,"tag":84,"props":60971,"children":60972},{},[60973],{"type":17,"tag":133,"props":60974,"children":60976},{"href":57996,"rel":60975},[214],[60977],{"type":23,"value":58000},{"type":17,"tag":84,"props":60979,"children":60980},{},[60981],{"type":17,"tag":133,"props":60982,"children":60984},{"href":57550,"rel":60983},[214],[60985],{"type":23,"value":57554},{"type":17,"tag":84,"props":60987,"children":60988},{},[60989],{"type":17,"tag":133,"props":60990,"children":60992},{"href":59224,"rel":60991},[214],[60993],{"type":23,"value":59228},{"type":17,"tag":84,"props":60995,"children":60996},{},[60997],{"type":17,"tag":133,"props":60998,"children":61000},{"href":59404,"rel":60999},[214],[61001],{"type":23,"value":61002},"TriNet Zenefits",{"type":17,"tag":84,"props":61004,"children":61005},{},[61006],{"type":17,"tag":133,"props":61007,"children":61009},{"href":56560,"rel":61008},[214],[61010],{"type":23,"value":56564},{"type":17,"tag":29,"props":61012,"children":61013},{},[61014,61016],{"type":23,"value":61015},"The HR ecosystem is extremely fragmented, which means supporting customers often requires ",{"type":17,"tag":48,"props":61017,"children":61018},{},[61019],{"type":23,"value":61020},"integrating dozens of HR systems simultaneously.",{"type":17,"tag":68,"props":61022,"children":61024},{"id":61023},"challenges-when-integrating-hris-apis",[61025],{"type":23,"value":61026},"Challenges When Integrating HRIS APIs",{"type":17,"tag":29,"props":61028,"children":61029},{},[61030],{"type":23,"value":61031},"Building HR integrations directly with each provider introduces several challenges.",{"type":17,"tag":239,"props":61033,"children":61034},{"id":56669},[61035],{"type":23,"value":50525},{"type":17,"tag":29,"props":61037,"children":61038},{},[61039,61041,61045],{"type":23,"value":61040},"Some HR APIs use ",{"type":17,"tag":133,"props":61042,"children":61043},{"href":779},[61044],{"type":23,"value":782},{"type":23,"value":61046},", others rely on API keys or custom authentication.",{"type":17,"tag":239,"props":61048,"children":61049},{"id":51841},[61050],{"type":23,"value":51844},{"type":17,"tag":29,"props":61052,"children":61053},{},[61054],{"type":23,"value":61055},"Employee records, job titles, departments, and benefits fields vary widely between vendors.",{"type":17,"tag":239,"props":61057,"children":61058},{"id":56713},[61059],{"type":23,"value":56716},{"type":17,"tag":29,"props":61061,"children":61062},{},[61063],{"type":23,"value":61064},"HR providers frequently update their APIs, requiring ongoing maintenance.",{"type":17,"tag":239,"props":61066,"children":61067},{"id":51852},[61068],{"type":23,"value":51855},{"type":17,"tag":29,"props":61070,"children":61071},{},[61072],{"type":23,"value":61073},"Each provider enforces different limits and pagination rules.",{"type":17,"tag":239,"props":61075,"children":61076},{"id":56696},[61077],{"type":23,"value":56699},{"type":17,"tag":29,"props":61079,"children":61080},{},[61081],{"type":23,"value":61082},"Some systems support real-time webhooks while others require polling.",{"type":17,"tag":239,"props":61084,"children":61086},{"id":61085},"compliance-requirements",[61087],{"type":23,"value":61088},"Compliance requirements",{"type":17,"tag":29,"props":61090,"children":61091},{},[61092],{"type":23,"value":61093},"Employee data often contains sensitive personal information, requiring strict privacy controls and data residency considerations.",{"type":17,"tag":29,"props":61095,"children":61096},{},[61097],{"type":23,"value":61098},"As companies integrate with more HR systems, this complexity grows exponentially.",{"type":17,"tag":68,"props":61100,"children":61102},{"id":61101},"the-role-of-unified-hr-apis",[61103],{"type":23,"value":61104},"The Role of Unified HR APIs",{"type":17,"tag":29,"props":61106,"children":61107},{},[61108,61109,61113],{"type":23,"value":53944},{"type":17,"tag":48,"props":61110,"children":61111},{},[61112],{"type":23,"value":60168},{"type":23,"value":54},{"type":17,"tag":29,"props":61115,"children":61116},{},[61117],{"type":23,"value":61118},"A unified API standardizes data models and authentication across multiple HR providers so developers can integrate once and support many platforms.",{"type":17,"tag":29,"props":61120,"children":61121},{},[61122],{"type":23,"value":61123},"Instead of building separate integrations for Workday, BambooHR, ADP, Personio, and dozens of others, a unified API layer provides:",{"type":17,"tag":80,"props":61125,"children":61126},{},[61127,61131,61136,61140,61145],{"type":17,"tag":84,"props":61128,"children":61129},{},[61130],{"type":23,"value":58130},{"type":17,"tag":84,"props":61132,"children":61133},{},[61134],{"type":23,"value":61135},"normalized employee data models",{"type":17,"tag":84,"props":61137,"children":61138},{},[61139],{"type":23,"value":50639},{"type":17,"tag":84,"props":61141,"children":61142},{},[61143],{"type":23,"value":61144},"standardized webhooks and events",{"type":17,"tag":84,"props":61146,"children":61147},{},[61148],{"type":23,"value":51948},{"type":17,"tag":29,"props":61150,"children":61151},{},[61152],{"type":23,"value":61153},"This dramatically reduces integration complexity.",{"type":17,"tag":68,"props":61155,"children":61157},{"id":61156},"build-once-with-the-unified-hris-api",[61158],{"type":23,"value":61159},"Build Once with the Unified HRIS API",{"type":17,"tag":29,"props":61161,"children":61162},{},[61163,61164,61168,61170,61175],{"type":23,"value":6712},{"type":17,"tag":48,"props":61165,"children":61166},{},[61167],{"type":23,"value":58213},{"type":23,"value":61169}," allows developers to access workforce data across ",{"type":17,"tag":48,"props":61171,"children":61172},{},[61173],{"type":23,"value":61174},"224+ HR and directory integrations",{"type":23,"value":23943},{"type":17,"tag":29,"props":61177,"children":61178},{},[61179,61181],{"type":23,"value":61180},"You can explore the full list here: ",{"type":17,"tag":133,"props":61182,"children":61184},{"href":58209,"rel":61183},[214],[61185],{"type":23,"value":61186},"Unified HRIS API integrations",{"type":17,"tag":29,"props":61188,"children":61189},{},[61190],{"type":23,"value":61191},"Unified normalizes HR data across platforms like Workday, BambooHR, ADP, Personio, HiBob, and many others.",{"type":17,"tag":239,"props":61193,"children":61195},{"id":61194},"unified-hr-data-objects",[61196],{"type":23,"value":61197},"Unified HR Data Objects",{"type":17,"tag":29,"props":61199,"children":61200},{},[61201],{"type":23,"value":61202},"Unified provides consistent objects across all supported HR systems:",{"type":17,"tag":29,"props":61204,"children":61205},{},[61206],{"type":17,"tag":48,"props":61207,"children":61208},{},[61209],{"type":23,"value":61210},"Employee",{"type":17,"tag":29,"props":61212,"children":61213},{},[61214],{"type":23,"value":61215},"Employee profiles, employment status, compensation, and contact information.",{"type":17,"tag":29,"props":61217,"children":61218},{},[61219],{"type":17,"tag":48,"props":61220,"children":61221},{},[61222],{"type":23,"value":41728},{"type":17,"tag":29,"props":61224,"children":61225},{},[61226],{"type":23,"value":61227},"Departments, teams, divisions, and organizational units.",{"type":17,"tag":29,"props":61229,"children":61230},{},[61231],{"type":17,"tag":48,"props":61232,"children":61233},{},[61234],{"type":23,"value":38951},{"type":17,"tag":29,"props":61236,"children":61237},{},[61238],{"type":23,"value":61239},"Office locations and geographic data.",{"type":17,"tag":29,"props":61241,"children":61242},{},[61243],{"type":17,"tag":48,"props":61244,"children":61245},{},[61246],{"type":23,"value":59865},{"type":17,"tag":29,"props":61248,"children":61249},{},[61250],{"type":23,"value":61251},"Vacation, PTO balances, and leave requests.",{"type":17,"tag":29,"props":61253,"children":61254},{},[61255],{"type":17,"tag":48,"props":61256,"children":61257},{},[61258],{"type":23,"value":58268},{"type":17,"tag":29,"props":61260,"children":61261},{},[61262],{"type":23,"value":61263},"Payroll information and compensation details.",{"type":17,"tag":29,"props":61265,"children":61266},{},[61267],{"type":17,"tag":48,"props":61268,"children":61269},{},[61270],{"type":23,"value":58273},{"type":17,"tag":29,"props":61272,"children":61273},{},[61274],{"type":23,"value":61275},"Health insurance and benefits enrollment.",{"type":17,"tag":29,"props":61277,"children":61278},{},[61279],{"type":17,"tag":48,"props":61280,"children":61281},{},[61282],{"type":23,"value":58278},{"type":17,"tag":29,"props":61284,"children":61285},{},[61286],{"type":23,"value":61287},"Payroll deductions and tax withholdings.",{"type":17,"tag":29,"props":61289,"children":61290},{},[61291],{"type":17,"tag":48,"props":61292,"children":61293},{},[61294],{"type":23,"value":58283},{"type":17,"tag":29,"props":61296,"children":61297},{},[61298],{"type":23,"value":61299},"Company-issued devices assigned to employees.",{"type":17,"tag":29,"props":61301,"children":61302},{},[61303],{"type":17,"tag":48,"props":61304,"children":61305},{},[61306],{"type":23,"value":59870},{"type":17,"tag":29,"props":61308,"children":61309},{},[61310],{"type":23,"value":61311},"Work schedules and shift assignments.",{"type":17,"tag":29,"props":61313,"children":61314},{},[61315],{"type":17,"tag":48,"props":61316,"children":61317},{},[61318],{"type":23,"value":59860},{"type":17,"tag":29,"props":61320,"children":61321},{},[61322],{"type":23,"value":61323},"Employee payroll payment accounts.",{"type":17,"tag":29,"props":61325,"children":61326},{},[61327],{"type":23,"value":24022},{"type":17,"tag":80,"props":61329,"children":61330},{},[61331,61335,61339,61343,61347],{"type":17,"tag":84,"props":61332,"children":61333},{},[61334],{"type":23,"value":11254},{"type":17,"tag":84,"props":61336,"children":61337},{},[61338],{"type":23,"value":11243},{"type":17,"tag":84,"props":61340,"children":61341},{},[61342],{"type":23,"value":24038},{"type":17,"tag":84,"props":61344,"children":61345},{},[61346],{"type":23,"value":11845},{"type":17,"tag":84,"props":61348,"children":61349},{},[61350],{"type":23,"value":11852},{"type":17,"tag":29,"props":61352,"children":61353},{},[61354],{"type":23,"value":61355},"This allows developers to build workforce features once and support many HR platforms.",{"type":17,"tag":239,"props":61357,"children":61358},{"id":46536},[61359],{"type":23,"value":52075},{"type":17,"tag":29,"props":61361,"children":61362},{},[61363,61365,61369],{"type":23,"value":61364},"Unlike integration systems that rely on cached datasets or periodic sync jobs, the Unified HRIS API uses a ",{"type":17,"tag":48,"props":61366,"children":61367},{},[61368],{"type":23,"value":50812},{"type":23,"value":54},{"type":17,"tag":29,"props":61371,"children":61372},{},[61373],{"type":23,"value":61374},"Every request hits the source HR system directly.",{"type":17,"tag":29,"props":61376,"children":61377},{},[61378],{"type":23,"value":7403},{"type":17,"tag":80,"props":61380,"children":61381},{},[61382,61387,61391,61396],{"type":17,"tag":84,"props":61383,"children":61384},{},[61385],{"type":23,"value":61386},"no cached employee data",{"type":17,"tag":84,"props":61388,"children":61389},{},[61390],{"type":23,"value":52102},{"type":17,"tag":84,"props":61392,"children":61393},{},[61394],{"type":23,"value":61395},"real-time employee updates",{"type":17,"tag":84,"props":61397,"children":61398},{},[61399],{"type":23,"value":61400},"lower compliance risk for sensitive workforce data",{"type":17,"tag":239,"props":61402,"children":61403},{"id":50844},[61404],{"type":23,"value":50847},{"type":17,"tag":29,"props":61406,"children":61407},{},[61408],{"type":23,"value":61409},"Unified never stores employee data.",{"type":17,"tag":29,"props":61411,"children":61412},{},[61413],{"type":23,"value":61414},"Requests are processed statelessly and routed directly to the HR provider. Traffic is regionalized across US, EU, and AU environments to support data residency requirements.",{"type":17,"tag":239,"props":61416,"children":61418},{"id":61417},"faster-hr-integrations",[61419],{"type":23,"value":61420},"Faster HR Integrations",{"type":17,"tag":29,"props":61422,"children":61423},{},[61424],{"type":23,"value":61425},"Using a unified API, teams can ship HR integrations much faster.",{"type":17,"tag":29,"props":61427,"children":61428},{},[61429,61431,61436],{"type":23,"value":61430},"Instead of building and maintaining separate integrations for dozens of HR platforms, developers can integrate once and support ",{"type":17,"tag":48,"props":61432,"children":61433},{},[61434],{"type":23,"value":61435},"224+ HR systems",{"type":23,"value":61437}," immediately.",{"type":17,"tag":68,"props":61439,"children":61440},{"id":1552},[61441],{"type":23,"value":44411},{"type":17,"tag":29,"props":61443,"children":61444},{},[61445],{"type":23,"value":61446},"HRIS APIs power many critical SaaS workflows, from employee onboarding automation to payroll integrations and workforce analytics.",{"type":17,"tag":29,"props":61448,"children":61449},{},[61450],{"type":23,"value":61451},"But integrating HR systems individually can quickly become a complex and expensive engineering challenge.",{"type":17,"tag":29,"props":61453,"children":61454},{},[61455,61457,61461],{"type":23,"value":61456},"As the HR ecosystem continues to grow, many SaaS companies are adopting ",{"type":17,"tag":48,"props":61458,"children":61459},{},[61460],{"type":23,"value":60168},{"type":23,"value":61462}," to simplify integration development and support hundreds of workforce platforms through a single API.",{"type":17,"tag":29,"props":61464,"children":61465},{},[61466,61468,61473],{"type":23,"value":61467},"If you're building a product that connects to HR systems, unified APIs provide a scalable way to support ",{"type":17,"tag":48,"props":61469,"children":61470},{},[61471],{"type":23,"value":61472},"Workday, BambooHR, ADP, and hundreds of other HR platforms",{"type":23,"value":50930},{"type":17,"tag":29,"props":61475,"children":61476},{},[61477],{"type":17,"tag":133,"props":61478,"children":61480},{"href":1612,"rel":61479},[214],[61481],{"type":23,"value":44481},{"type":17,"tag":29,"props":61483,"children":61484},{},[61485],{"type":17,"tag":133,"props":61486,"children":61488},{"href":1623,"rel":61487},[214],[61489],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":61491},[61492,61493,61500,61513,61521,61522,61528],{"id":60173,"depth":1629,"text":60176},{"id":60284,"depth":1629,"text":60287,"children":61494},[61495,61496,61497,61498,61499],{"id":60299,"depth":1635,"text":60302},{"id":60310,"depth":1635,"text":60313},{"id":60321,"depth":1635,"text":60324},{"id":60332,"depth":1635,"text":60335},{"id":60343,"depth":1635,"text":60346},{"id":60366,"depth":1629,"text":60369,"children":61501},[61502,61503,61504,61505,61506,61507,61508,61509,61510,61511,61512],{"id":60384,"depth":1635,"text":60387},{"id":60440,"depth":1635,"text":60443},{"id":57644,"depth":1635,"text":57647},{"id":59072,"depth":1635,"text":59075},{"id":60601,"depth":1635,"text":60604},{"id":60654,"depth":1635,"text":60657},{"id":60707,"depth":1635,"text":60710},{"id":57593,"depth":1635,"text":57596},{"id":58820,"depth":1635,"text":58823},{"id":59018,"depth":1635,"text":59021},{"id":60882,"depth":1635,"text":60885},{"id":61023,"depth":1629,"text":61026,"children":61514},[61515,61516,61517,61518,61519,61520],{"id":56669,"depth":1635,"text":50525},{"id":51841,"depth":1635,"text":51844},{"id":56713,"depth":1635,"text":56716},{"id":51852,"depth":1635,"text":51855},{"id":56696,"depth":1635,"text":56699},{"id":61085,"depth":1635,"text":61088},{"id":61101,"depth":1629,"text":61104},{"id":61156,"depth":1629,"text":61159,"children":61523},[61524,61525,61526,61527],{"id":61194,"depth":1635,"text":61197},{"id":46536,"depth":1635,"text":52075},{"id":50844,"depth":1635,"text":50847},{"id":61417,"depth":1635,"text":61420},{"id":1552,"depth":1629,"text":44411},"content:blog:25_hris_apis_to_integrate_with_in_2026_workday_bamboohr_adp_and_unified_hr_integration_apis.md","blog/25_hris_apis_to_integrate_with_in_2026_workday_bamboohr_adp_and_unified_hr_integration_apis.md","blog/25_hris_apis_to_integrate_with_in_2026_workday_bamboohr_adp_and_unified_hr_integration_apis",{"_path":61533,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":61534,"description":61535,"img":61536,"date":61537,"tag":12,"body":61538,"_type":1677,"_id":63375,"_source":1679,"_file":63376,"_stem":63377,"_extension":1682},"/blog/25_crm_apis_to_integrate_with_in_2026_salesforce_hubspot_pipedrive_and_unified_crm_integration_apis","25 CRM APIs to Integrate With in 2026: Salesforce, HubSpot, Pipedrive and Unified CRM Integration APIs","If you are building a SaaS product that needs CRM integrations, the first question usually is not whether you need a CRM API. It is which CRM APIs you need to...","https://s3.us-east-2.amazonaws.com/unified-article-images/25_crm_apis_to_integrate_with_in_2026_salesforce_hubspot_pipedrive_and_unified_crm_integration_apis-icon.png","2026-03-11T15:01:00.000Z",{"type":14,"children":61539,"toc":63324},[61540,61545,61548,61555,61568,61573,61658,61663,61668,61674,61679,61684,61716,61721,61726,61732,61737,61743,61748,61754,61759,61765,61770,61776,61781,61785,61790,61796,61801,61806,61811,61858,61863,61868,61874,61879,61885,61895,61900,61905,61911,61921,61926,61931,61937,61947,61952,61957,61963,61973,61978,61983,61989,61999,62004,62009,62015,62025,62030,62035,62041,62051,62056,62061,62067,62077,62082,62087,62093,62103,62108,62113,62119,62129,62134,62139,62145,62155,62160,62165,62171,62181,62186,62191,62197,62207,62212,62217,62223,62233,62238,62243,62249,62259,62264,62269,62275,62285,62290,62295,62301,62306,62311,62315,62320,62325,62390,62395,62418,62423,62428,62432,62496,62500,62523,62527,62532,62536,62604,62608,62631,62636,62641,62645,62717,62721,62744,62750,62755,62759,62815,62819,62842,62848,62853,62857,62887,62891,62914,62919,62925,62930,62935,62940,62978,62983,62989,62994,63027,63032,63037,63043,63048,63053,63059,63064,63068,63073,63078,63082,63087,63093,63098,63129,63134,63140,63145,63151,63156,63160,63165,63171,63176,63222,63227,63233,63238,63243,63248,63252,63257,63262,63267,63272,63303,63308,63316],{"type":17,"tag":18,"props":61541,"children":61543},{"id":61542},"_25-crm-apis-to-integrate-with-in-2026-salesforce-hubspot-pipedrive-and-unified-crm-integration-apis",[61544],{"type":23,"value":61534},{"type":17,"tag":25,"props":61546,"children":61547},{},[],{"type":17,"tag":29,"props":61549,"children":61550},{},[61551],{"type":17,"tag":33,"props":61552,"children":61553},{},[61554],{"type":23,"value":49465},{"type":17,"tag":29,"props":61556,"children":61557},{},[61558,61560,61566],{"type":23,"value":61559},"If you are building a SaaS product that needs CRM integrations, the first question usually is not whether you need a ",{"type":17,"tag":133,"props":61561,"children":61563},{"href":61562},"/crm",[61564],{"type":23,"value":61565},"CRM API",{"type":23,"value":61567},". It is which CRM APIs you need to support, how fast you can launch them, and how much long-term integration overhead you are willing to carry.",{"type":17,"tag":29,"props":61569,"children":61570},{},[61571],{"type":23,"value":61572},"That gets complicated fast.",{"type":17,"tag":29,"props":61574,"children":61575},{},[61576,61578,61584,61585,61591,61592,61599,61600,61606,61607,61613,61614,61621,61622,61629,61630,61637,61638,61645,61647,61651,61652,61656],{"type":23,"value":61577},"Your customers may use ",{"type":17,"tag":133,"props":61579,"children":61582},{"href":61580,"rel":61581},"https://www.salesforce.com/",[214],[61583],{"type":23,"value":3179},{"type":23,"value":11826},{"type":17,"tag":133,"props":61586,"children":61589},{"href":61587,"rel":61588},"https://www.hubspot.com/",[214],[61590],{"type":23,"value":3184},{"type":23,"value":11826},{"type":17,"tag":133,"props":61593,"children":61596},{"href":61594,"rel":61595},"https://dynamics.microsoft.com/",[214],[61597],{"type":23,"value":61598},"Microsoft Dynamics 365",{"type":23,"value":11826},{"type":17,"tag":133,"props":61601,"children":61604},{"href":61602,"rel":61603},"https://www.pipedrive.com/",[214],[61605],{"type":23,"value":26530},{"type":23,"value":11826},{"type":17,"tag":133,"props":61608,"children":61611},{"href":61609,"rel":61610},"https://www.zoho.com/crm/",[214],[61612],{"type":23,"value":26535},{"type":23,"value":11826},{"type":17,"tag":133,"props":61615,"children":61618},{"href":61616,"rel":61617},"https://www.close.com/",[214],[61619],{"type":23,"value":61620},"Close",{"type":23,"value":11826},{"type":17,"tag":133,"props":61623,"children":61626},{"href":61624,"rel":61625},"https://www.copper.com/",[214],[61627],{"type":23,"value":61628},"Copper",{"type":23,"value":11826},{"type":17,"tag":133,"props":61631,"children":61634},{"href":61632,"rel":61633},"https://www.freshworks.com/crm/",[214],[61635],{"type":23,"value":61636},"Freshsales",{"type":23,"value":11826},{"type":17,"tag":133,"props":61639,"children":61642},{"href":61640,"rel":61641},"https://attio.com/",[214],[61643],{"type":23,"value":61644},"Attio",{"type":23,"value":61646},", or a long tail of other CRMs. Each one has different auth, data models, ",{"type":17,"tag":133,"props":61648,"children":61649},{"href":4999},[61650],{"type":23,"value":5002},{"type":23,"value":11826},{"type":17,"tag":133,"props":61653,"children":61654},{"href":1857},[61655],{"type":23,"value":1860},{"type":23,"value":61657}," patterns, rate limits, and custom field behavior.",{"type":17,"tag":29,"props":61659,"children":61660},{},[61661],{"type":23,"value":61662},"That is exactly why CRM integration work expands so quickly once you go beyond one or two providers.",{"type":17,"tag":29,"props":61664,"children":61665},{},[61666],{"type":23,"value":61667},"In this guide, we cover 15+ CRM APIs worth knowing, the core CRM objects most teams need, the technical challenges of building direct integrations, and when a unified CRM API is the better architecture.",{"type":17,"tag":68,"props":61669,"children":61671},{"id":61670},"what-is-a-crm-api",[61672],{"type":23,"value":61673},"What is a CRM API?",{"type":17,"tag":29,"props":61675,"children":61676},{},[61677],{"type":23,"value":61678},"A CRM API lets your application read and write customer relationship data from a CRM platform.",{"type":17,"tag":29,"props":61680,"children":61681},{},[61682],{"type":23,"value":61683},"That usually includes objects like:",{"type":17,"tag":80,"props":61685,"children":61686},{},[61687,61691,61696,61701,61706,61711],{"type":17,"tag":84,"props":61688,"children":61689},{},[61690],{"type":23,"value":30404},{"type":17,"tag":84,"props":61692,"children":61693},{},[61694],{"type":23,"value":61695},"companies or accounts",{"type":17,"tag":84,"props":61697,"children":61698},{},[61699],{"type":23,"value":61700},"deals or opportunities",{"type":17,"tag":84,"props":61702,"children":61703},{},[61704],{"type":23,"value":61705},"leads",{"type":17,"tag":84,"props":61707,"children":61708},{},[61709],{"type":23,"value":61710},"activities or events",{"type":17,"tag":84,"props":61712,"children":61713},{},[61714],{"type":23,"value":61715},"pipelines and stages",{"type":17,"tag":29,"props":61717,"children":61718},{},[61719],{"type":23,"value":61720},"Some CRM APIs are broad and highly customizable. Others are simpler and better suited to SMB workflows. Some are built around enterprise object models. Others are designed for speed and ease of use.",{"type":17,"tag":29,"props":61722,"children":61723},{},[61724],{"type":23,"value":61725},"If you are building a product integration, a CRM API is the layer that lets your application sync records, trigger workflows, enrich customer context, or automate sales operations.",{"type":17,"tag":68,"props":61727,"children":61729},{"id":61728},"why-teams-integrate-crm-apis",[61730],{"type":23,"value":61731},"Why teams integrate CRM APIs",{"type":17,"tag":29,"props":61733,"children":61734},{},[61735],{"type":23,"value":61736},"CRM integrations show up in more products than most teams expect. Common use cases include:",{"type":17,"tag":239,"props":61738,"children":61740},{"id":61739},"sales-enablement",[61741],{"type":23,"value":61742},"Sales enablement",{"type":17,"tag":29,"props":61744,"children":61745},{},[61746],{"type":23,"value":61747},"Pull contacts, companies, deals, and activity history into your product so reps can act with context.",{"type":17,"tag":239,"props":61749,"children":61751},{"id":61750},"lead-routing-and-enrichment",[61752],{"type":23,"value":61753},"Lead routing and enrichment",{"type":17,"tag":29,"props":61755,"children":61756},{},[61757],{"type":23,"value":61758},"Create or update leads, score them, assign them, and enrich records using data from multiple systems.",{"type":17,"tag":239,"props":61760,"children":61762},{"id":61761},"customer-analytics",[61763],{"type":23,"value":61764},"Customer analytics",{"type":17,"tag":29,"props":61766,"children":61767},{},[61768],{"type":23,"value":61769},"Combine CRM data with payments, support, product usage, or marketing data to create pipeline and revenue reporting.",{"type":17,"tag":239,"props":61771,"children":61773},{"id":61772},"ai-assistants-and-copilots",[61774],{"type":23,"value":61775},"AI assistants and copilots",{"type":17,"tag":29,"props":61777,"children":61778},{},[61779],{"type":23,"value":61780},"Give AI systems access to live CRM records so they can summarize accounts, identify next steps, or draft outreach based on current data.",{"type":17,"tag":239,"props":61782,"children":61783},{"id":13496},[61784],{"type":23,"value":12682},{"type":17,"tag":29,"props":61786,"children":61787},{},[61788],{"type":23,"value":61789},"Trigger downstream actions when a deal changes stage, a new lead is created, or a contact record is updated.",{"type":17,"tag":68,"props":61791,"children":61793},{"id":61792},"the-main-challenge-with-direct-crm-api-integrations",[61794],{"type":23,"value":61795},"The main challenge with direct CRM API integrations",{"type":17,"tag":29,"props":61797,"children":61798},{},[61799],{"type":23,"value":61800},"Direct CRM integrations sound manageable at first. Then the fourth or fifth integration shows up.",{"type":17,"tag":29,"props":61802,"children":61803},{},[61804],{"type":23,"value":61805},"That is where the maintenance burden usually becomes obvious.",{"type":17,"tag":29,"props":61807,"children":61808},{},[61809],{"type":23,"value":61810},"Here is what changes across CRM APIs:",{"type":17,"tag":80,"props":61812,"children":61813},{},[61814,61819,61824,61829,61833,61838,61843,61848,61853],{"type":17,"tag":84,"props":61815,"children":61816},{},[61817],{"type":23,"value":61818},"OAuth flows and token refresh behavior",{"type":17,"tag":84,"props":61820,"children":61821},{},[61822],{"type":23,"value":61823},"object names and field structures",{"type":17,"tag":84,"props":61825,"children":61826},{},[61827],{"type":23,"value":61828},"pagination and filtering",{"type":17,"tag":84,"props":61830,"children":61831},{},[61832],{"type":23,"value":138},{"type":17,"tag":84,"props":61834,"children":61835},{},[61836],{"type":23,"value":61837},"webhook models",{"type":17,"tag":84,"props":61839,"children":61840},{},[61841],{"type":23,"value":61842},"custom fields and custom objects",{"type":17,"tag":84,"props":61844,"children":61845},{},[61846],{"type":23,"value":61847},"read and write support by object",{"type":17,"tag":84,"props":61849,"children":61850},{},[61851],{"type":23,"value":61852},"error formats",{"type":17,"tag":84,"props":61854,"children":61855},{},[61856],{"type":23,"value":61857},"versioning and deprecation cycles",{"type":17,"tag":29,"props":61859,"children":61860},{},[61861],{"type":23,"value":61862},"A deal in one platform is not always a deal in another. A company may be an account. A lead may convert into a contact. Some APIs support robust write operations. Others are more limited. Some offer custom objects. Others do not.",{"type":17,"tag":29,"props":61864,"children":61865},{},[61866],{"type":23,"value":61867},"If your product needs to support many CRMs, you either build and maintain all of that logic yourself, or you use a unified layer.",{"type":17,"tag":68,"props":61869,"children":61871},{"id":61870},"_15-crm-apis-to-know-in-2026",[61872],{"type":23,"value":61873},"15+ CRM APIs to know in 2026",{"type":17,"tag":29,"props":61875,"children":61876},{},[61877],{"type":23,"value":61878},"Below are some of the most important CRM APIs for SaaS teams building integrations today.",{"type":17,"tag":239,"props":61880,"children":61882},{"id":61881},"salesforce-api",[61883],{"type":23,"value":61884},"Salesforce API",{"type":17,"tag":29,"props":61886,"children":61887},{},[61888],{"type":17,"tag":133,"props":61889,"children":61892},{"href":61890,"rel":61891},"https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_what_is_rest_api.htm",[214],[61893],{"type":23,"value":61894},"Salesforce API docs",{"type":17,"tag":29,"props":61896,"children":61897},{},[61898],{"type":23,"value":61899},"Salesforce remains the most requested CRM integration for many B2B products. It is powerful, deeply customizable, and common in enterprise environments. It also comes with more complexity than most CRMs, especially around object models, custom fields, custom objects, and auth.",{"type":17,"tag":29,"props":61901,"children":61902},{},[61903],{"type":23,"value":61904},"Best for enterprise CRM workflows, account intelligence, custom object support, and large-scale sales operations.",{"type":17,"tag":239,"props":61906,"children":61908},{"id":61907},"hubspot-crm-api",[61909],{"type":23,"value":61910},"HubSpot CRM API",{"type":17,"tag":29,"props":61912,"children":61913},{},[61914],{"type":17,"tag":133,"props":61915,"children":61918},{"href":61916,"rel":61917},"https://developers.hubspot.com/docs/api/crm/crm-overview",[214],[61919],{"type":23,"value":61920},"HubSpot CRM API docs",{"type":17,"tag":29,"props":61922,"children":61923},{},[61924],{"type":23,"value":61925},"HubSpot is widely used across sales, marketing, and customer success teams. Its API is popular because it is broad, relatively developer-friendly, and common among mid-market and growth-stage companies.",{"type":17,"tag":29,"props":61927,"children":61928},{},[61929],{"type":23,"value":61930},"Best for contact, company, deal, and marketing-adjacent CRM workflows.",{"type":17,"tag":239,"props":61932,"children":61934},{"id":61933},"microsoft-dynamics-365-api",[61935],{"type":23,"value":61936},"Microsoft Dynamics 365 API",{"type":17,"tag":29,"props":61938,"children":61939},{},[61940],{"type":17,"tag":133,"props":61941,"children":61944},{"href":61942,"rel":61943},"https://learn.microsoft.com/en-us/dynamics365/",[214],[61945],{"type":23,"value":61946},"Dynamics 365 developer docs",{"type":17,"tag":29,"props":61948,"children":61949},{},[61950],{"type":23,"value":61951},"Dynamics 365 is a major enterprise CRM ecosystem, especially in Microsoft-heavy environments. It often comes up in larger IT and operations-led organizations.",{"type":17,"tag":29,"props":61953,"children":61954},{},[61955],{"type":23,"value":61956},"Best for enterprise environments that already run on Microsoft infrastructure.",{"type":17,"tag":239,"props":61958,"children":61960},{"id":61959},"pipedrive-api",[61961],{"type":23,"value":61962},"Pipedrive API",{"type":17,"tag":29,"props":61964,"children":61965},{},[61966],{"type":17,"tag":133,"props":61967,"children":61970},{"href":61968,"rel":61969},"https://developers.pipedrive.com/docs/api/v1",[214],[61971],{"type":23,"value":61972},"Pipedrive API docs",{"type":17,"tag":29,"props":61974,"children":61975},{},[61976],{"type":23,"value":61977},"Pipedrive is common among SMB and mid-market sales teams that want a straightforward pipeline-driven CRM. Its API is heavily used for deal automation and pipeline reporting.",{"type":17,"tag":29,"props":61979,"children":61980},{},[61981],{"type":23,"value":61982},"Best for sales pipeline visibility, lead routing, and SMB sales tooling.",{"type":17,"tag":239,"props":61984,"children":61986},{"id":61985},"zoho-crm-api",[61987],{"type":23,"value":61988},"Zoho CRM API",{"type":17,"tag":29,"props":61990,"children":61991},{},[61992],{"type":17,"tag":133,"props":61993,"children":61996},{"href":61994,"rel":61995},"https://www.zoho.com/crm/developer/docs/api/v8/overview.html",[214],[61997],{"type":23,"value":61998},"Zoho CRM API docs",{"type":17,"tag":29,"props":62000,"children":62001},{},[62002],{"type":23,"value":62003},"Zoho CRM has broad adoption and a substantial ecosystem. It is often used by growing teams that want flexibility without full enterprise complexity.",{"type":17,"tag":29,"props":62005,"children":62006},{},[62007],{"type":23,"value":62008},"Best for broad CRM coverage across SMB and mid-market accounts.",{"type":17,"tag":239,"props":62010,"children":62012},{"id":62011},"close-api",[62013],{"type":23,"value":62014},"Close API",{"type":17,"tag":29,"props":62016,"children":62017},{},[62018],{"type":17,"tag":133,"props":62019,"children":62022},{"href":62020,"rel":62021},"https://developer.close.com/",[214],[62023],{"type":23,"value":62024},"Close API docs",{"type":17,"tag":29,"props":62026,"children":62027},{},[62028],{"type":23,"value":62029},"Close is especially relevant for outbound-focused sales teams. If your users care about calling, emailing, and sales execution inside one workflow, Close often appears on the shortlist.",{"type":17,"tag":29,"props":62031,"children":62032},{},[62033],{"type":23,"value":62034},"Best for outbound sales workflows and communication-heavy CRM use cases.",{"type":17,"tag":239,"props":62036,"children":62038},{"id":62037},"copper-api",[62039],{"type":23,"value":62040},"Copper API",{"type":17,"tag":29,"props":62042,"children":62043},{},[62044],{"type":17,"tag":133,"props":62045,"children":62048},{"href":62046,"rel":62047},"https://developer.copper.com/",[214],[62049],{"type":23,"value":62050},"Copper API docs",{"type":17,"tag":29,"props":62052,"children":62053},{},[62054],{"type":23,"value":62055},"Copper is especially relevant in Google Workspace-centric teams. It is often chosen by smaller sales organizations that want lighter CRM infrastructure.",{"type":17,"tag":29,"props":62057,"children":62058},{},[62059],{"type":23,"value":62060},"Best for Google-centric CRM workflows and lightweight customer management.",{"type":17,"tag":239,"props":62062,"children":62064},{"id":62063},"freshsales-api",[62065],{"type":23,"value":62066},"Freshsales API",{"type":17,"tag":29,"props":62068,"children":62069},{},[62070],{"type":17,"tag":133,"props":62071,"children":62074},{"href":62072,"rel":62073},"https://developers.freshworks.com/crm/",[214],[62075],{"type":23,"value":62076},"Freshsales developer docs",{"type":17,"tag":29,"props":62078,"children":62079},{},[62080],{"type":23,"value":62081},"Freshsales sits inside the larger Freshworks ecosystem and is often part of broader sales and support workflows.",{"type":17,"tag":29,"props":62083,"children":62084},{},[62085],{"type":23,"value":62086},"Best for teams already operating inside Freshworks.",{"type":17,"tag":239,"props":62088,"children":62090},{"id":62089},"insightly-api",[62091],{"type":23,"value":62092},"Insightly API",{"type":17,"tag":29,"props":62094,"children":62095},{},[62096],{"type":17,"tag":133,"props":62097,"children":62100},{"href":62098,"rel":62099},"https://api.insightly.com/v3.1/Help",[214],[62101],{"type":23,"value":62102},"Insightly API docs",{"type":17,"tag":29,"props":62104,"children":62105},{},[62106],{"type":23,"value":62107},"Insightly combines CRM and project-style workflows, which can make it useful in services-oriented organizations.",{"type":17,"tag":29,"props":62109,"children":62110},{},[62111],{"type":23,"value":62112},"Best for customer management tied closely to delivery or project operations.",{"type":17,"tag":239,"props":62114,"children":62116},{"id":62115},"attio-api",[62117],{"type":23,"value":62118},"Attio API",{"type":17,"tag":29,"props":62120,"children":62121},{},[62122],{"type":17,"tag":133,"props":62123,"children":62126},{"href":62124,"rel":62125},"https://docs.attio.com/",[214],[62127],{"type":23,"value":62128},"Attio developer docs",{"type":17,"tag":29,"props":62130,"children":62131},{},[62132],{"type":23,"value":62133},"Attio is one of the most interesting newer CRM platforms. It is modern, flexible, and often adopted by startups and relationship-driven teams that want more customization without enterprise CRM overhead.",{"type":17,"tag":29,"props":62135,"children":62136},{},[62137],{"type":23,"value":62138},"Best for modern CRM workflows, flexible data models, and API-first teams.",{"type":17,"tag":239,"props":62140,"children":62142},{"id":62141},"salesflare-api",[62143],{"type":23,"value":62144},"Salesflare API",{"type":17,"tag":29,"props":62146,"children":62147},{},[62148],{"type":17,"tag":133,"props":62149,"children":62152},{"href":62150,"rel":62151},"https://api.salesflare.com/docs",[214],[62153],{"type":23,"value":62154},"Salesflare API docs",{"type":17,"tag":29,"props":62156,"children":62157},{},[62158],{"type":23,"value":62159},"Salesflare is built around automation and relationship intelligence for smaller teams.",{"type":17,"tag":29,"props":62161,"children":62162},{},[62163],{"type":23,"value":62164},"Best for SMB relationship management and automated contact enrichment use cases.",{"type":17,"tag":239,"props":62166,"children":62168},{"id":62167},"netsuite-crm-api",[62169],{"type":23,"value":62170},"NetSuite CRM API",{"type":17,"tag":29,"props":62172,"children":62173},{},[62174],{"type":17,"tag":133,"props":62175,"children":62178},{"href":62176,"rel":62177},"https://docs.oracle.com/en/cloud/saas/netsuite/",[214],[62179],{"type":23,"value":62180},"NetSuite developer docs",{"type":17,"tag":29,"props":62182,"children":62183},{},[62184],{"type":23,"value":62185},"NetSuite matters when CRM data is closely tied to ERP, finance, and operations systems. It is usually part of more complex back-office architectures.",{"type":17,"tag":29,"props":62187,"children":62188},{},[62189],{"type":23,"value":62190},"Best for CRM workflows in finance-heavy and ERP-linked environments.",{"type":17,"tag":239,"props":62192,"children":62194},{"id":62193},"zendesk-sell-api",[62195],{"type":23,"value":62196},"Zendesk Sell API",{"type":17,"tag":29,"props":62198,"children":62199},{},[62200],{"type":17,"tag":133,"props":62201,"children":62204},{"href":62202,"rel":62203},"https://developer.zendesk.com/api-reference/sales-crm/introduction/",[214],[62205],{"type":23,"value":62206},"Zendesk Sell API docs",{"type":17,"tag":29,"props":62208,"children":62209},{},[62210],{"type":23,"value":62211},"Zendesk Sell is relevant when customer-facing teams need CRM functionality close to support and service operations.",{"type":17,"tag":29,"props":62213,"children":62214},{},[62215],{"type":23,"value":62216},"Best for sales plus support-adjacent workflows.",{"type":17,"tag":239,"props":62218,"children":62220},{"id":62219},"highlevel-api",[62221],{"type":23,"value":62222},"HighLevel API",{"type":17,"tag":29,"props":62224,"children":62225},{},[62226],{"type":17,"tag":133,"props":62227,"children":62230},{"href":62228,"rel":62229},"https://highlevel.stoplight.io/docs/integrations/",[214],[62231],{"type":23,"value":62232},"HighLevel developer docs",{"type":17,"tag":29,"props":62234,"children":62235},{},[62236],{"type":23,"value":62237},"HighLevel is especially visible in agency, local business, and marketing automation environments.",{"type":17,"tag":29,"props":62239,"children":62240},{},[62241],{"type":23,"value":62242},"Best for CRM plus marketing automation workflows in agency-led contexts.",{"type":17,"tag":239,"props":62244,"children":62246},{"id":62245},"apolloio-api",[62247],{"type":23,"value":62248},"Apollo.io API",{"type":17,"tag":29,"props":62250,"children":62251},{},[62252],{"type":17,"tag":133,"props":62253,"children":62256},{"href":62254,"rel":62255},"https://apolloio.github.io/apollo-api-docs/",[214],[62257],{"type":23,"value":62258},"Apollo API docs",{"type":17,"tag":29,"props":62260,"children":62261},{},[62262],{"type":23,"value":62263},"Apollo is often used more for enrichment and prospecting than as a system of record, but it still appears in CRM workflows and outbound stacks.",{"type":17,"tag":29,"props":62265,"children":62266},{},[62267],{"type":23,"value":62268},"Best for prospecting, lead enrichment, and outbound growth workflows.",{"type":17,"tag":239,"props":62270,"children":62272},{"id":62271},"affinity-api",[62273],{"type":23,"value":62274},"Affinity API",{"type":17,"tag":29,"props":62276,"children":62277},{},[62278],{"type":17,"tag":133,"props":62279,"children":62282},{"href":62280,"rel":62281},"https://api-docs.affinity.co/",[214],[62283],{"type":23,"value":62284},"Affinity developer docs",{"type":17,"tag":29,"props":62286,"children":62287},{},[62288],{"type":23,"value":62289},"Affinity is common in relationship-driven teams such as venture, private capital, and dealmaking workflows.",{"type":17,"tag":29,"props":62291,"children":62292},{},[62293],{"type":23,"value":62294},"Best for relationship intelligence and network-based CRM use cases.",{"type":17,"tag":68,"props":62296,"children":62298},{"id":62297},"the-crm-objects-most-teams-actually-need",[62299],{"type":23,"value":62300},"The CRM objects most teams actually need",{"type":17,"tag":29,"props":62302,"children":62303},{},[62304],{"type":23,"value":62305},"If you strip CRM integrations down to what most SaaS teams need to support, the object model is surprisingly consistent.",{"type":17,"tag":29,"props":62307,"children":62308},{},[62309],{"type":23,"value":62310},"In our CRM API, we standardize six core CRM objects:",{"type":17,"tag":239,"props":62312,"children":62313},{"id":43625},[62314],{"type":23,"value":25828},{"type":17,"tag":29,"props":62316,"children":62317},{},[62318],{"type":23,"value":62319},"Used for people and customer contact records.",{"type":17,"tag":29,"props":62321,"children":62322},{},[62323],{"type":23,"value":62324},"Typical fields include:",{"type":17,"tag":80,"props":62326,"children":62327},{},[62328,62332,62337,62342,62347,62351,62356,62361,62366,62371,62376,62381,62385],{"type":17,"tag":84,"props":62329,"children":62330},{},[62331],{"type":23,"value":18781},{"type":17,"tag":84,"props":62333,"children":62334},{},[62335],{"type":23,"value":62336},"first_name",{"type":17,"tag":84,"props":62338,"children":62339},{},[62340],{"type":23,"value":62341},"last_name",{"type":17,"tag":84,"props":62343,"children":62344},{},[62345],{"type":23,"value":62346},"title",{"type":17,"tag":84,"props":62348,"children":62349},{},[62350],{"type":23,"value":50735},{"type":17,"tag":84,"props":62352,"children":62353},{},[62354],{"type":23,"value":62355},"telephones",{"type":17,"tag":84,"props":62357,"children":62358},{},[62359],{"type":23,"value":62360},"company_ids",{"type":17,"tag":84,"props":62362,"children":62363},{},[62364],{"type":23,"value":62365},"deal_ids",{"type":17,"tag":84,"props":62367,"children":62368},{},[62369],{"type":23,"value":62370},"address",{"type":17,"tag":84,"props":62372,"children":62373},{},[62374],{"type":23,"value":62375},"department",{"type":17,"tag":84,"props":62377,"children":62378},{},[62379],{"type":23,"value":62380},"image_url",{"type":17,"tag":84,"props":62382,"children":62383},{},[62384],{"type":23,"value":23792},{"type":17,"tag":84,"props":62386,"children":62387},{},[62388],{"type":23,"value":62389},"raw",{"type":17,"tag":29,"props":62391,"children":62392},{},[62393],{"type":23,"value":62394},"Typical methods:",{"type":17,"tag":80,"props":62396,"children":62397},{},[62398,62402,62406,62410,62414],{"type":17,"tag":84,"props":62399,"children":62400},{},[62401],{"type":23,"value":11254},{"type":17,"tag":84,"props":62403,"children":62404},{},[62405],{"type":23,"value":11243},{"type":17,"tag":84,"props":62407,"children":62408},{},[62409],{"type":23,"value":24038},{"type":17,"tag":84,"props":62411,"children":62412},{},[62413],{"type":23,"value":11845},{"type":17,"tag":84,"props":62415,"children":62416},{},[62417],{"type":23,"value":11852},{"type":17,"tag":239,"props":62419,"children":62421},{"id":62420},"company",[62422],{"type":23,"value":25846},{"type":17,"tag":29,"props":62424,"children":62425},{},[62426],{"type":23,"value":62427},"Used for organizations or accounts.",{"type":17,"tag":29,"props":62429,"children":62430},{},[62431],{"type":23,"value":62324},{"type":17,"tag":80,"props":62433,"children":62434},{},[62435,62439,62444,62448,62452,62457,62461,62465,62470,62474,62479,62484,62488,62492],{"type":17,"tag":84,"props":62436,"children":62437},{},[62438],{"type":23,"value":18781},{"type":17,"tag":84,"props":62440,"children":62441},{},[62442],{"type":23,"value":62443},"domains",{"type":17,"tag":84,"props":62445,"children":62446},{},[62447],{"type":23,"value":50735},{"type":17,"tag":84,"props":62449,"children":62450},{},[62451],{"type":23,"value":62355},{"type":17,"tag":84,"props":62453,"children":62454},{},[62455],{"type":23,"value":62456},"websites",{"type":17,"tag":84,"props":62458,"children":62459},{},[62460],{"type":23,"value":62370},{"type":17,"tag":84,"props":62462,"children":62463},{},[62464],{"type":23,"value":50783},{"type":17,"tag":84,"props":62466,"children":62467},{},[62468],{"type":23,"value":62469},"employees",{"type":17,"tag":84,"props":62471,"children":62472},{},[62473],{"type":23,"value":22305},{"type":17,"tag":84,"props":62475,"children":62476},{},[62477],{"type":23,"value":62478},"tags",{"type":17,"tag":84,"props":62480,"children":62481},{},[62482],{"type":23,"value":62483},"contact_ids",{"type":17,"tag":84,"props":62485,"children":62486},{},[62487],{"type":23,"value":62365},{"type":17,"tag":84,"props":62489,"children":62490},{},[62491],{"type":23,"value":23792},{"type":17,"tag":84,"props":62493,"children":62494},{},[62495],{"type":23,"value":62389},{"type":17,"tag":29,"props":62497,"children":62498},{},[62499],{"type":23,"value":62394},{"type":17,"tag":80,"props":62501,"children":62502},{},[62503,62507,62511,62515,62519],{"type":17,"tag":84,"props":62504,"children":62505},{},[62506],{"type":23,"value":11254},{"type":17,"tag":84,"props":62508,"children":62509},{},[62510],{"type":23,"value":11243},{"type":17,"tag":84,"props":62512,"children":62513},{},[62514],{"type":23,"value":24038},{"type":17,"tag":84,"props":62516,"children":62517},{},[62518],{"type":23,"value":11845},{"type":17,"tag":84,"props":62520,"children":62521},{},[62522],{"type":23,"value":11852},{"type":17,"tag":239,"props":62524,"children":62525},{"id":43632},[62526],{"type":23,"value":25810},{"type":17,"tag":29,"props":62528,"children":62529},{},[62530],{"type":23,"value":62531},"Used for opportunities and revenue pipeline records.",{"type":17,"tag":29,"props":62533,"children":62534},{},[62535],{"type":23,"value":62324},{"type":17,"tag":80,"props":62537,"children":62538},{},[62539,62543,62547,62551,62555,62560,62565,62570,62574,62578,62583,62587,62591,62595,62599],{"type":17,"tag":84,"props":62540,"children":62541},{},[62542],{"type":23,"value":18781},{"type":17,"tag":84,"props":62544,"children":62545},{},[62546],{"type":23,"value":25890},{"type":17,"tag":84,"props":62548,"children":62549},{},[62550],{"type":23,"value":22296},{"type":17,"tag":84,"props":62552,"children":62553},{},[62554],{"type":23,"value":25901},{"type":17,"tag":84,"props":62556,"children":62557},{},[62558],{"type":23,"value":62559},"stages",{"type":17,"tag":84,"props":62561,"children":62562},{},[62563],{"type":23,"value":62564},"source",{"type":17,"tag":84,"props":62566,"children":62567},{},[62568],{"type":23,"value":62569},"closed_at",{"type":17,"tag":84,"props":62571,"children":62572},{},[62573],{"type":23,"value":25912},{"type":17,"tag":84,"props":62575,"children":62576},{},[62577],{"type":23,"value":62478},{"type":17,"tag":84,"props":62579,"children":62580},{},[62581],{"type":23,"value":62582},"user_id",{"type":17,"tag":84,"props":62584,"children":62585},{},[62586],{"type":23,"value":62483},{"type":17,"tag":84,"props":62588,"children":62589},{},[62590],{"type":23,"value":62360},{"type":17,"tag":84,"props":62592,"children":62593},{},[62594],{"type":23,"value":23792},{"type":17,"tag":84,"props":62596,"children":62597},{},[62598],{"type":23,"value":62389},{"type":17,"tag":84,"props":62600,"children":62601},{},[62602],{"type":23,"value":62603},"pipelines",{"type":17,"tag":29,"props":62605,"children":62606},{},[62607],{"type":23,"value":62394},{"type":17,"tag":80,"props":62609,"children":62610},{},[62611,62615,62619,62623,62627],{"type":17,"tag":84,"props":62612,"children":62613},{},[62614],{"type":23,"value":11254},{"type":17,"tag":84,"props":62616,"children":62617},{},[62618],{"type":23,"value":11243},{"type":17,"tag":84,"props":62620,"children":62621},{},[62622],{"type":23,"value":24038},{"type":17,"tag":84,"props":62624,"children":62625},{},[62626],{"type":23,"value":11845},{"type":17,"tag":84,"props":62628,"children":62629},{},[62630],{"type":23,"value":11852},{"type":17,"tag":239,"props":62632,"children":62634},{"id":62633},"event",[62635],{"type":23,"value":14528},{"type":17,"tag":29,"props":62637,"children":62638},{},[62639],{"type":23,"value":62640},"Used for activities and interactions.",{"type":17,"tag":29,"props":62642,"children":62643},{},[62644],{"type":23,"value":62324},{"type":17,"tag":80,"props":62646,"children":62647},{},[62648,62652,62657,62662,62667,62672,62677,62682,62687,62692,62696,62700,62704,62709,62713],{"type":17,"tag":84,"props":62649,"children":62650},{},[62651],{"type":23,"value":27310},{"type":17,"tag":84,"props":62653,"children":62654},{},[62655],{"type":23,"value":62656},"note",{"type":17,"tag":84,"props":62658,"children":62659},{},[62660],{"type":23,"value":62661},"meeting",{"type":17,"tag":84,"props":62663,"children":62664},{},[62665],{"type":23,"value":62666},"email",{"type":17,"tag":84,"props":62668,"children":62669},{},[62670],{"type":23,"value":62671},"call",{"type":17,"tag":84,"props":62673,"children":62674},{},[62675],{"type":23,"value":62676},"task",{"type":17,"tag":84,"props":62678,"children":62679},{},[62680],{"type":23,"value":62681},"marketing_email",{"type":17,"tag":84,"props":62683,"children":62684},{},[62685],{"type":23,"value":62686},"form",{"type":17,"tag":84,"props":62688,"children":62689},{},[62690],{"type":23,"value":62691},"page_view",{"type":17,"tag":84,"props":62693,"children":62694},{},[62695],{"type":23,"value":62365},{"type":17,"tag":84,"props":62697,"children":62698},{},[62699],{"type":23,"value":62360},{"type":17,"tag":84,"props":62701,"children":62702},{},[62703],{"type":23,"value":62483},{"type":17,"tag":84,"props":62705,"children":62706},{},[62707],{"type":23,"value":62708},"lead_ids",{"type":17,"tag":84,"props":62710,"children":62711},{},[62712],{"type":23,"value":62582},{"type":17,"tag":84,"props":62714,"children":62715},{},[62716],{"type":23,"value":62389},{"type":17,"tag":29,"props":62718,"children":62719},{},[62720],{"type":23,"value":62394},{"type":17,"tag":80,"props":62722,"children":62723},{},[62724,62728,62732,62736,62740],{"type":17,"tag":84,"props":62725,"children":62726},{},[62727],{"type":23,"value":11254},{"type":17,"tag":84,"props":62729,"children":62730},{},[62731],{"type":23,"value":11243},{"type":17,"tag":84,"props":62733,"children":62734},{},[62735],{"type":23,"value":24038},{"type":17,"tag":84,"props":62737,"children":62738},{},[62739],{"type":23,"value":11845},{"type":17,"tag":84,"props":62741,"children":62742},{},[62743],{"type":23,"value":11852},{"type":17,"tag":239,"props":62745,"children":62747},{"id":62746},"lead",[62748],{"type":23,"value":62749},"Lead",{"type":17,"tag":29,"props":62751,"children":62752},{},[62753],{"type":23,"value":62754},"Used for prospective customer records.",{"type":17,"tag":29,"props":62756,"children":62757},{},[62758],{"type":23,"value":62324},{"type":17,"tag":80,"props":62760,"children":62761},{},[62762,62766,62770,62774,62778,62782,62787,62791,62795,62799,62803,62807,62811],{"type":17,"tag":84,"props":62763,"children":62764},{},[62765],{"type":23,"value":18781},{"type":17,"tag":84,"props":62767,"children":62768},{},[62769],{"type":23,"value":62336},{"type":17,"tag":84,"props":62771,"children":62772},{},[62773],{"type":23,"value":62341},{"type":17,"tag":84,"props":62775,"children":62776},{},[62777],{"type":23,"value":26302},{"type":17,"tag":84,"props":62779,"children":62780},{},[62781],{"type":23,"value":27299},{"type":17,"tag":84,"props":62783,"children":62784},{},[62785],{"type":23,"value":62786},"company_name",{"type":17,"tag":84,"props":62788,"children":62789},{},[62790],{"type":23,"value":62564},{"type":17,"tag":84,"props":62792,"children":62793},{},[62794],{"type":23,"value":19949},{"type":17,"tag":84,"props":62796,"children":62797},{},[62798],{"type":23,"value":50735},{"type":17,"tag":84,"props":62800,"children":62801},{},[62802],{"type":23,"value":62355},{"type":17,"tag":84,"props":62804,"children":62805},{},[62806],{"type":23,"value":62370},{"type":17,"tag":84,"props":62808,"children":62809},{},[62810],{"type":23,"value":23792},{"type":17,"tag":84,"props":62812,"children":62813},{},[62814],{"type":23,"value":62389},{"type":17,"tag":29,"props":62816,"children":62817},{},[62818],{"type":23,"value":62394},{"type":17,"tag":80,"props":62820,"children":62821},{},[62822,62826,62830,62834,62838],{"type":17,"tag":84,"props":62823,"children":62824},{},[62825],{"type":23,"value":11254},{"type":17,"tag":84,"props":62827,"children":62828},{},[62829],{"type":23,"value":11243},{"type":17,"tag":84,"props":62831,"children":62832},{},[62833],{"type":23,"value":24038},{"type":17,"tag":84,"props":62835,"children":62836},{},[62837],{"type":23,"value":11845},{"type":17,"tag":84,"props":62839,"children":62840},{},[62841],{"type":23,"value":11852},{"type":17,"tag":239,"props":62843,"children":62845},{"id":62844},"pipeline",[62846],{"type":23,"value":62847},"Pipeline",{"type":17,"tag":29,"props":62849,"children":62850},{},[62851],{"type":23,"value":62852},"Used for sales pipelines and stages.",{"type":17,"tag":29,"props":62854,"children":62855},{},[62856],{"type":23,"value":62324},{"type":17,"tag":80,"props":62858,"children":62859},{},[62860,62864,62869,62874,62879,62883],{"type":17,"tag":84,"props":62861,"children":62862},{},[62863],{"type":23,"value":18781},{"type":17,"tag":84,"props":62865,"children":62866},{},[62867],{"type":23,"value":62868},"is_active",{"type":17,"tag":84,"props":62870,"children":62871},{},[62872],{"type":23,"value":62873},"deal_probability",{"type":17,"tag":84,"props":62875,"children":62876},{},[62877],{"type":23,"value":62878},"display_order",{"type":17,"tag":84,"props":62880,"children":62881},{},[62882],{"type":23,"value":62559},{"type":17,"tag":84,"props":62884,"children":62885},{},[62886],{"type":23,"value":62389},{"type":17,"tag":29,"props":62888,"children":62889},{},[62890],{"type":23,"value":62394},{"type":17,"tag":80,"props":62892,"children":62893},{},[62894,62898,62902,62906,62910],{"type":17,"tag":84,"props":62895,"children":62896},{},[62897],{"type":23,"value":11254},{"type":17,"tag":84,"props":62899,"children":62900},{},[62901],{"type":23,"value":11243},{"type":17,"tag":84,"props":62903,"children":62904},{},[62905],{"type":23,"value":24038},{"type":17,"tag":84,"props":62907,"children":62908},{},[62909],{"type":23,"value":11845},{"type":17,"tag":84,"props":62911,"children":62912},{},[62913],{"type":23,"value":11852},{"type":17,"tag":29,"props":62915,"children":62916},{},[62917],{"type":23,"value":62918},"This matters because a unified CRM API should not stop at shallow reads. It should give you meaningful, normalized object coverage with real read and write support where providers allow it.",{"type":17,"tag":68,"props":62920,"children":62922},{"id":62921},"why-direct-crm-integrations-become-expensive",[62923],{"type":23,"value":62924},"Why direct CRM integrations become expensive",{"type":17,"tag":29,"props":62926,"children":62927},{},[62928],{"type":23,"value":62929},"If you are only supporting one CRM, direct integration can be fine.",{"type":17,"tag":29,"props":62931,"children":62932},{},[62933],{"type":23,"value":62934},"If you are supporting several, costs compound quickly.",{"type":17,"tag":29,"props":62936,"children":62937},{},[62938],{"type":23,"value":62939},"The hidden costs usually include:",{"type":17,"tag":80,"props":62941,"children":62942},{},[62943,62948,62953,62958,62963,62968,62973],{"type":17,"tag":84,"props":62944,"children":62945},{},[62946],{"type":23,"value":62947},"separate auth flows for every provider",{"type":17,"tag":84,"props":62949,"children":62950},{},[62951],{"type":23,"value":62952},"field mapping logic per CRM",{"type":17,"tag":84,"props":62954,"children":62955},{},[62956],{"type":23,"value":62957},"custom object edge cases",{"type":17,"tag":84,"props":62959,"children":62960},{},[62961],{"type":23,"value":62962},"webhook differences",{"type":17,"tag":84,"props":62964,"children":62965},{},[62966],{"type":23,"value":62967},"version changes and deprecations",{"type":17,"tag":84,"props":62969,"children":62970},{},[62971],{"type":23,"value":62972},"retry, rate limit, and error handling logic",{"type":17,"tag":84,"props":62974,"children":62975},{},[62976],{"type":23,"value":62977},"testing and support across dozens of provider-specific behaviors",{"type":17,"tag":29,"props":62979,"children":62980},{},[62981],{"type":23,"value":62982},"This is where teams end up carrying an internal integration platform whether they planned to or not.",{"type":17,"tag":68,"props":62984,"children":62986},{"id":62985},"when-a-unified-crm-api-is-the-better-option",[62987],{"type":23,"value":62988},"When a unified CRM API is the better option",{"type":17,"tag":29,"props":62990,"children":62991},{},[62992],{"type":23,"value":62993},"A unified CRM API usually makes more sense when:",{"type":17,"tag":80,"props":62995,"children":62996},{},[62997,63002,63007,63012,63017,63022],{"type":17,"tag":84,"props":62998,"children":62999},{},[63000],{"type":23,"value":63001},"your customers use multiple CRM platforms",{"type":17,"tag":84,"props":63003,"children":63004},{},[63005],{"type":23,"value":63006},"your product needs CRM data as a feature, not a one-off integration",{"type":17,"tag":84,"props":63008,"children":63009},{},[63010],{"type":23,"value":63011},"you need to launch faster",{"type":17,"tag":84,"props":63013,"children":63014},{},[63015],{"type":23,"value":63016},"you want normalized objects across providers",{"type":17,"tag":84,"props":63018,"children":63019},{},[63020],{"type":23,"value":63021},"you want to avoid maintaining every provider integration separately",{"type":17,"tag":84,"props":63023,"children":63024},{},[63025],{"type":23,"value":63026},"you need CRM integrations to work inside automation or AI workflows",{"type":17,"tag":29,"props":63028,"children":63029},{},[63030],{"type":23,"value":63031},"The value is not just fewer integrations. It is less architectural sprawl.",{"type":17,"tag":29,"props":63033,"children":63034},{},[63035],{"type":23,"value":63036},"Instead of building and maintaining a different implementation for Salesforce, HubSpot, Pipedrive, Zoho, and everything else, your product integrates once and works across the category.",{"type":17,"tag":68,"props":63038,"children":63040},{"id":63039},"why-teams-use-unifiedto-for-crm-integrations",[63041],{"type":23,"value":63042},"Why teams use Unified.to for CRM integrations",{"type":17,"tag":29,"props":63044,"children":63045},{},[63046],{"type":23,"value":63047},"We built our CRM API for teams that want real CRM coverage without sync-and-store tradeoffs.",{"type":17,"tag":29,"props":63049,"children":63050},{},[63051],{"type":23,"value":63052},"Here is what that means in practice.",{"type":17,"tag":239,"props":63054,"children":63056},{"id":63055},"_47-crm-integrations-through-one-api",[63057],{"type":23,"value":63058},"47+ CRM integrations through one API",{"type":17,"tag":29,"props":63060,"children":63061},{},[63062],{"type":23,"value":63063},"We support 47+ CRM integrations today, including major platforms such as Salesforce, HubSpot, Microsoft Dynamics 365, Pipedrive, Zoho CRM, Close, Copper, Freshsales, Attio, Salesflare, NetSuite, Zendesk Sell, HighLevel, Affinity, and Apollo.io.",{"type":17,"tag":239,"props":63065,"children":63066},{"id":13402},[63067],{"type":23,"value":13405},{"type":17,"tag":29,"props":63069,"children":63070},{},[63071],{"type":23,"value":63072},"Every request hits the source API live. There is no cache, no sync job, and no stale replica sitting in the middle.",{"type":17,"tag":29,"props":63074,"children":63075},{},[63076],{"type":23,"value":63077},"That matters for CRM workflows because teams often need live deal state, current contact information, or up-to-date activity context.",{"type":17,"tag":239,"props":63079,"children":63080},{"id":13413},[63081],{"type":23,"value":13416},{"type":17,"tag":29,"props":63083,"children":63084},{},[63085],{"type":23,"value":63086},"We do not store end-customer CRM records. That reduces compliance scope and removes the extra data-at-rest risk that comes with sync-and-store architectures.",{"type":17,"tag":239,"props":63088,"children":63090},{"id":63089},"deeply-normalized-crm-objects",[63091],{"type":23,"value":63092},"Deeply normalized CRM objects",{"type":17,"tag":29,"props":63094,"children":63095},{},[63096],{"type":23,"value":63097},"We standardize six core CRM objects:",{"type":17,"tag":80,"props":63099,"children":63100},{},[63101,63105,63109,63114,63119,63124],{"type":17,"tag":84,"props":63102,"children":63103},{},[63104],{"type":23,"value":31619},{"type":17,"tag":84,"props":63106,"children":63107},{},[63108],{"type":23,"value":56943},{"type":17,"tag":84,"props":63110,"children":63111},{},[63112],{"type":23,"value":63113},"Deals",{"type":17,"tag":84,"props":63115,"children":63116},{},[63117],{"type":23,"value":63118},"Events",{"type":17,"tag":84,"props":63120,"children":63121},{},[63122],{"type":23,"value":63123},"Leads",{"type":17,"tag":84,"props":63125,"children":63126},{},[63127],{"type":23,"value":63128},"Pipelines",{"type":17,"tag":29,"props":63130,"children":63131},{},[63132],{"type":23,"value":63133},"That gives product teams a consistent object model across providers, while still preserving access to provider-specific fields through raw payload support and metadata.",{"type":17,"tag":239,"props":63135,"children":63137},{"id":63136},"read-and-write-support",[63138],{"type":23,"value":63139},"Read and write support",{"type":17,"tag":29,"props":63141,"children":63142},{},[63143],{"type":23,"value":63144},"CRM integrations are not useful if you can only read. We support read and write behavior across normalized CRM objects where the underlying provider allows it.",{"type":17,"tag":239,"props":63146,"children":63148},{"id":63147},"custom-fields-and-custom-objects",[63149],{"type":23,"value":63150},"Custom fields and custom objects",{"type":17,"tag":29,"props":63152,"children":63153},{},[63154],{"type":23,"value":63155},"A lot of CRM integration pain starts when real customer accounts use custom fields or provider-specific objects. We support custom fields and metadata APIs so you can go beyond shallow, lowest-common-denominator schemas.",{"type":17,"tag":239,"props":63157,"children":63158},{"id":15879},[63159],{"type":23,"value":15882},{"type":17,"tag":29,"props":63161,"children":63162},{},[63163],{"type":23,"value":63164},"If you are building AI assistants, copilot workflows, lead scoring, customer intelligence, or sales automation, live CRM data matters. Our platform is built to support those use cases without forcing you into stale sync patterns.",{"type":17,"tag":68,"props":63166,"children":63168},{"id":63167},"common-crm-api-use-cases-we-see",[63169],{"type":23,"value":63170},"Common CRM API use cases we see",{"type":17,"tag":29,"props":63172,"children":63173},{},[63174],{"type":23,"value":63175},"Teams use our CRM API for:",{"type":17,"tag":80,"props":63177,"children":63178},{},[63179,63184,63189,63194,63198,63203,63207,63212,63217],{"type":17,"tag":84,"props":63180,"children":63181},{},[63182],{"type":23,"value":63183},"lead generation and lead routing",{"type":17,"tag":84,"props":63185,"children":63186},{},[63187],{"type":23,"value":63188},"CRM enrichment",{"type":17,"tag":84,"props":63190,"children":63191},{},[63192],{"type":23,"value":63193},"customer 360 dashboards",{"type":17,"tag":84,"props":63195,"children":63196},{},[63197],{"type":23,"value":36332},{"type":17,"tag":84,"props":63199,"children":63200},{},[63201],{"type":23,"value":63202},"sales enablement tooling",{"type":17,"tag":84,"props":63204,"children":63205},{},[63206],{"type":23,"value":25587},{"type":17,"tag":84,"props":63208,"children":63209},{},[63210],{"type":23,"value":63211},"pipeline reporting",{"type":17,"tag":84,"props":63213,"children":63214},{},[63215],{"type":23,"value":63216},"event-driven automation",{"type":17,"tag":84,"props":63218,"children":63219},{},[63220],{"type":23,"value":63221},"syncing CRM context into support, messaging, and communications tools",{"type":17,"tag":29,"props":63223,"children":63224},{},[63225],{"type":23,"value":63226},"If your product needs CRM data to power features instead of just exporting records, architecture matters.",{"type":17,"tag":68,"props":63228,"children":63230},{"id":63229},"so-which-crm-api-should-you-choose",[63231],{"type":23,"value":63232},"So which CRM API should you choose?",{"type":17,"tag":29,"props":63234,"children":63235},{},[63236],{"type":23,"value":63237},"If you are building a deep integration for one provider and know your users only need that provider, a direct API may be enough.",{"type":17,"tag":29,"props":63239,"children":63240},{},[63241],{"type":23,"value":63242},"If you are building a SaaS product for a broader market, the better question is not which single CRM API you should choose. It is whether you want to own and maintain the differences across all of them.",{"type":17,"tag":29,"props":63244,"children":63245},{},[63246],{"type":23,"value":63247},"That is the inflection point where unified APIs start to make more sense.",{"type":17,"tag":68,"props":63249,"children":63250},{"id":1552},[63251],{"type":23,"value":1555},{"type":17,"tag":29,"props":63253,"children":63254},{},[63255],{"type":23,"value":63256},"CRM APIs are foundational for modern SaaS products. The problem is that CRM integrations rarely stay small.",{"type":17,"tag":29,"props":63258,"children":63259},{},[63260],{"type":23,"value":63261},"What starts as one Salesforce integration often becomes a roadmap that includes HubSpot, Pipedrive, Zoho CRM, Microsoft Dynamics, Close, Copper, and a long tail of customer requests after that.",{"type":17,"tag":29,"props":63263,"children":63264},{},[63265],{"type":23,"value":63266},"If your team wants to support CRM integrations without building and maintaining 47+ separate code paths, a unified CRM API is the practical way forward.",{"type":17,"tag":29,"props":63268,"children":63269},{},[63270],{"type":23,"value":63271},"We built Unified.to's CRM API to give teams:",{"type":17,"tag":80,"props":63273,"children":63274},{},[63275,63280,63285,63289,63294,63299],{"type":17,"tag":84,"props":63276,"children":63277},{},[63278],{"type":23,"value":63279},"47+ CRM integrations",{"type":17,"tag":84,"props":63281,"children":63282},{},[63283],{"type":23,"value":63284},"normalized Contacts, Companies, Deals, Events, Leads, and Pipelines",{"type":17,"tag":84,"props":63286,"children":63287},{},[63288],{"type":23,"value":27657},{"type":17,"tag":84,"props":63290,"children":63291},{},[63292],{"type":23,"value":63293},"read and write support",{"type":17,"tag":84,"props":63295,"children":63296},{},[63297],{"type":23,"value":63298},"zero-storage architecture",{"type":17,"tag":84,"props":63300,"children":63301},{},[63302],{"type":23,"value":1391},{"type":17,"tag":29,"props":63304,"children":63305},{},[63306],{"type":23,"value":63307},"That is how teams get CRM integrations from backlog to production faster, without inheriting years of integration debt.",{"type":17,"tag":29,"props":63309,"children":63310},{},[63311],{"type":17,"tag":133,"props":63312,"children":63314},{"href":1612,"rel":63313},[214],[63315],{"type":23,"value":44481},{"type":17,"tag":29,"props":63317,"children":63318},{},[63319],{"type":17,"tag":133,"props":63320,"children":63322},{"href":1623,"rel":63321},[214],[63323],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":63325},[63326,63327,63334,63335,63353,63361,63362,63363,63372,63373,63374],{"id":61670,"depth":1629,"text":61673},{"id":61728,"depth":1629,"text":61731,"children":63328},[63329,63330,63331,63332,63333],{"id":61739,"depth":1635,"text":61742},{"id":61750,"depth":1635,"text":61753},{"id":61761,"depth":1635,"text":61764},{"id":61772,"depth":1635,"text":61775},{"id":13496,"depth":1635,"text":12682},{"id":61792,"depth":1629,"text":61795},{"id":61870,"depth":1629,"text":61873,"children":63336},[63337,63338,63339,63340,63341,63342,63343,63344,63345,63346,63347,63348,63349,63350,63351,63352],{"id":61881,"depth":1635,"text":61884},{"id":61907,"depth":1635,"text":61910},{"id":61933,"depth":1635,"text":61936},{"id":61959,"depth":1635,"text":61962},{"id":61985,"depth":1635,"text":61988},{"id":62011,"depth":1635,"text":62014},{"id":62037,"depth":1635,"text":62040},{"id":62063,"depth":1635,"text":62066},{"id":62089,"depth":1635,"text":62092},{"id":62115,"depth":1635,"text":62118},{"id":62141,"depth":1635,"text":62144},{"id":62167,"depth":1635,"text":62170},{"id":62193,"depth":1635,"text":62196},{"id":62219,"depth":1635,"text":62222},{"id":62245,"depth":1635,"text":62248},{"id":62271,"depth":1635,"text":62274},{"id":62297,"depth":1629,"text":62300,"children":63354},[63355,63356,63357,63358,63359,63360],{"id":43625,"depth":1635,"text":25828},{"id":62420,"depth":1635,"text":25846},{"id":43632,"depth":1635,"text":25810},{"id":62633,"depth":1635,"text":14528},{"id":62746,"depth":1635,"text":62749},{"id":62844,"depth":1635,"text":62847},{"id":62921,"depth":1629,"text":62924},{"id":62985,"depth":1629,"text":62988},{"id":63039,"depth":1629,"text":63042,"children":63364},[63365,63366,63367,63368,63369,63370,63371],{"id":63055,"depth":1635,"text":63058},{"id":13402,"depth":1635,"text":13405},{"id":13413,"depth":1635,"text":13416},{"id":63089,"depth":1635,"text":63092},{"id":63136,"depth":1635,"text":63139},{"id":63147,"depth":1635,"text":63150},{"id":15879,"depth":1635,"text":15882},{"id":63167,"depth":1629,"text":63170},{"id":63229,"depth":1629,"text":63232},{"id":1552,"depth":1629,"text":1555},"content:blog:25_crm_apis_to_integrate_with_in_2026_salesforce_hubspot_pipedrive_and_unified_crm_integration_apis.md","blog/25_crm_apis_to_integrate_with_in_2026_salesforce_hubspot_pipedrive_and_unified_crm_integration_apis.md","blog/25_crm_apis_to_integrate_with_in_2026_salesforce_hubspot_pipedrive_and_unified_crm_integration_apis",{"_path":63379,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":63380,"description":63381,"img":63382,"date":63383,"tag":12,"body":63384,"_type":1677,"_id":64454,"_source":1679,"_file":64455,"_stem":64456,"_extension":1682},"/blog/why_zero_storage_unified_apis_simplify_compliance_for_saas_integrations","Why Zero-Storage Unified APIs Simplify Compliance for SaaS Integrations","Compliance is one of the biggest challenges when building SaaS integrations. Enterprise customers increasingly require vendors to demonstrate adherence to...","https://s3.us-east-2.amazonaws.com/unified-article-images/why_zero_storage_unified_apis_simplify_compliance_for_saas_integrations-icon.png","2026-03-11T14:57:00.000Z",{"type":14,"children":63385,"toc":64440},[63386,63391,63394,63401,63437,63448,63453,63465,63477,63482,63487,63493,63504,63509,63537,63542,63547,63570,63575,63588,63593,63599,63610,63615,63620,63625,63658,63663,63689,63695,63700,63711,63716,63722,63727,63732,63760,63765,63770,63775,63793,63799,63820,63825,63843,63848,63853,63866,63878,63889,63895,63900,63905,63910,63933,63938,63949,63961,63967,63972,63990,63995,64017,64022,64033,64039,64044,64049,64077,64082,64087,64105,64110,64116,64128,64133,64151,64156,64161,64184,64205,64210,64216,64221,64226,64233,64238,64243,64251,64256,64261,64269,64280,64285,64293,64304,64312,64323,64331,64336,64354,64359,64367,64372,64377,64381,64392,64397,64402,64407,64419,64424,64432],{"type":17,"tag":18,"props":63387,"children":63389},{"id":63388},"why-zero-storage-unified-apis-simplify-compliance-for-saas-integrations",[63390],{"type":23,"value":63380},{"type":17,"tag":25,"props":63392,"children":63393},{},[],{"type":17,"tag":29,"props":63395,"children":63396},{},[63397],{"type":17,"tag":33,"props":63398,"children":63399},{},[63400],{"type":23,"value":49465},{"type":17,"tag":29,"props":63402,"children":63403},{},[63404,63406,63411,63412,63417,63418,63423,63424,63429,63430,63435],{"type":23,"value":63405},"Compliance is one of the biggest challenges when building SaaS integrations. Enterprise customers increasingly require vendors to demonstrate adherence to frameworks such as ",{"type":17,"tag":48,"props":63407,"children":63408},{},[63409],{"type":23,"value":63410},"SOC 2",{"type":23,"value":11826},{"type":17,"tag":48,"props":63413,"children":63414},{},[63415],{"type":23,"value":63416},"GDPR",{"type":23,"value":11826},{"type":17,"tag":48,"props":63419,"children":63420},{},[63421],{"type":23,"value":63422},"HIPAA",{"type":23,"value":11826},{"type":17,"tag":48,"props":63425,"children":63426},{},[63427],{"type":23,"value":63428},"CCPA",{"type":23,"value":12561},{"type":17,"tag":48,"props":63431,"children":63432},{},[63433],{"type":23,"value":63434},"PIPEDA",{"type":23,"value":63436}," before they can even begin procurement.",{"type":17,"tag":29,"props":63438,"children":63439},{},[63440,63442,63447],{"type":23,"value":63441},"Yet many integration platforms quietly introduce an additional compliance problem: they ",{"type":17,"tag":48,"props":63443,"children":63444},{},[63445],{"type":23,"value":63446},"store copies of customer data",{"type":23,"value":54},{"type":17,"tag":29,"props":63449,"children":63450},{},[63451],{"type":23,"value":63452},"Traditional integration architectures often replicate records from third-party systems into internal databases so that applications can query them quickly. While this can improve response times, it dramatically expands the compliance scope. Suddenly your integration vendor is storing customer data, which means additional security controls, audit requirements, and privacy obligations.",{"type":17,"tag":29,"props":63454,"children":63455},{},[63456,63458,63463],{"type":23,"value":63457},"A newer architectural pattern—",{"type":17,"tag":48,"props":63459,"children":63460},{},[63461],{"type":23,"value":63462},"zero-storage unified APIs",{"type":23,"value":63464},"—eliminates this problem.",{"type":17,"tag":29,"props":63466,"children":63467},{},[63468,63470,63475],{"type":23,"value":63469},"Platforms built on this model act as ",{"type":17,"tag":48,"props":63471,"children":63472},{},[63473],{"type":23,"value":63474},"real-time pass-through integration layers",{"type":23,"value":63476}," that never persist third-party data. Requests are executed live against the source system, the response is returned to the application, and the data is discarded immediately after processing.",{"type":17,"tag":29,"props":63478,"children":63479},{},[63480],{"type":23,"value":63481},"Unified follows this approach.",{"type":17,"tag":29,"props":63483,"children":63484},{},[63485],{"type":23,"value":63486},"This article explains why zero-storage unified APIs simplify compliance and why they represent a more secure architecture for SaaS integrations.",{"type":17,"tag":68,"props":63488,"children":63490},{"id":63489},"what-zero-storage-integration-means",[63491],{"type":23,"value":63492},"What Zero-Storage Integration Means",{"type":17,"tag":29,"props":63494,"children":63495},{},[63496,63498,63503],{"type":23,"value":63497},"Zero-storage integration refers to an architecture where the integration layer ",{"type":17,"tag":48,"props":63499,"children":63500},{},[63501],{"type":23,"value":63502},"does not persist customer data",{"type":23,"value":54},{"type":17,"tag":29,"props":63505,"children":63506},{},[63507],{"type":23,"value":63508},"Instead of copying records into its own database, the integration platform:",{"type":17,"tag":6154,"props":63510,"children":63511},{},[63512,63517,63522,63527,63532],{"type":17,"tag":84,"props":63513,"children":63514},{},[63515],{"type":23,"value":63516},"receives an authenticated request",{"type":17,"tag":84,"props":63518,"children":63519},{},[63520],{"type":23,"value":63521},"routes it to the source system's API",{"type":17,"tag":84,"props":63523,"children":63524},{},[63525],{"type":23,"value":63526},"processes the response in memory",{"type":17,"tag":84,"props":63528,"children":63529},{},[63530],{"type":23,"value":63531},"returns the data to the application",{"type":17,"tag":84,"props":63533,"children":63534},{},[63535],{"type":23,"value":63536},"discards the payload immediately",{"type":17,"tag":29,"props":63538,"children":63539},{},[63540],{"type":23,"value":63541},"There is no secondary dataset, no synchronization pipeline, and no cache containing customer records.",{"type":17,"tag":29,"props":63543,"children":63544},{},[63545],{"type":23,"value":63546},"Unified's architecture follows this pattern:",{"type":17,"tag":80,"props":63548,"children":63549},{},[63550,63555,63560,63565],{"type":17,"tag":84,"props":63551,"children":63552},{},[63553],{"type":23,"value":63554},"API calls execute directly against the authorized source system",{"type":17,"tag":84,"props":63556,"children":63557},{},[63558],{"type":23,"value":63559},"customer data is processed in memory only",{"type":17,"tag":84,"props":63561,"children":63562},{},[63563],{"type":23,"value":63564},"responses are returned immediately",{"type":17,"tag":84,"props":63566,"children":63567},{},[63568],{"type":23,"value":63569},"no external customer records are stored",{"type":17,"tag":29,"props":63571,"children":63572},{},[63573],{"type":23,"value":63574},"Because the integration layer never stores the data, the only systems containing the data remain:",{"type":17,"tag":80,"props":63576,"children":63577},{},[63578,63583],{"type":17,"tag":84,"props":63579,"children":63580},{},[63581],{"type":23,"value":63582},"the original SaaS provider",{"type":17,"tag":84,"props":63584,"children":63585},{},[63586],{"type":23,"value":63587},"the application requesting the data",{"type":17,"tag":29,"props":63589,"children":63590},{},[63591],{"type":23,"value":63592},"This architectural decision has major implications for security and regulatory compliance.",{"type":17,"tag":68,"props":63594,"children":63596},{"id":63595},"the-compliance-problem-with-stored-integration-data",[63597],{"type":23,"value":63598},"The Compliance Problem with Stored Integration Data",{"type":17,"tag":29,"props":63600,"children":63601},{},[63602,63604,63609],{"type":23,"value":63603},"Many integration platforms rely on ",{"type":17,"tag":48,"props":63605,"children":63606},{},[63607],{"type":23,"value":63608},"sync-and-store architectures",{"type":23,"value":54},{"type":17,"tag":29,"props":63611,"children":63612},{},[63613],{"type":23,"value":63614},"These systems replicate customer data into their own infrastructure using scheduled sync jobs or change-data-capture pipelines.",{"type":17,"tag":29,"props":63616,"children":63617},{},[63618],{"type":23,"value":63619},"While this enables faster queries, it creates new compliance obligations.",{"type":17,"tag":29,"props":63621,"children":63622},{},[63623],{"type":23,"value":63624},"If an integration platform stores personal data, it becomes part of the organization's regulated environment. This introduces additional requirements:",{"type":17,"tag":80,"props":63626,"children":63627},{},[63628,63633,63638,63643,63648,63653],{"type":17,"tag":84,"props":63629,"children":63630},{},[63631],{"type":23,"value":63632},"encryption of stored datasets",{"type":17,"tag":84,"props":63634,"children":63635},{},[63636],{"type":23,"value":63637},"retention and deletion policies",{"type":17,"tag":84,"props":63639,"children":63640},{},[63641],{"type":23,"value":63642},"access control for replicated databases",{"type":17,"tag":84,"props":63644,"children":63645},{},[63646],{"type":23,"value":63647},"breach monitoring and reporting",{"type":17,"tag":84,"props":63649,"children":63650},{},[63651],{"type":23,"value":63652},"cross-border data transfer restrictions",{"type":17,"tag":84,"props":63654,"children":63655},{},[63656],{"type":23,"value":63657},"vendor risk management",{"type":17,"tag":29,"props":63659,"children":63660},{},[63661],{"type":23,"value":63662},"In other words, every system that stores personal data must now be audited.",{"type":17,"tag":29,"props":63664,"children":63665},{},[63666,63668,63672,63673,63677,63678,63682,63683,63687],{"type":23,"value":63667},"For companies operating under frameworks such as ",{"type":17,"tag":48,"props":63669,"children":63670},{},[63671],{"type":23,"value":63410},{"type":23,"value":11826},{"type":17,"tag":48,"props":63674,"children":63675},{},[63676],{"type":23,"value":63416},{"type":23,"value":11826},{"type":17,"tag":48,"props":63679,"children":63680},{},[63681],{"type":23,"value":63422},{"type":23,"value":27293},{"type":17,"tag":48,"props":63684,"children":63685},{},[63686],{"type":23,"value":63428},{"type":23,"value":63688},", this significantly increases complexity.",{"type":17,"tag":68,"props":63690,"children":63692},{"id":63691},"how-zero-storage-unified-apis-reduce-compliance-scope",[63693],{"type":23,"value":63694},"How Zero-Storage Unified APIs Reduce Compliance Scope",{"type":17,"tag":29,"props":63696,"children":63697},{},[63698],{"type":23,"value":63699},"Zero-storage integration architectures remove an entire category of compliance risk.",{"type":17,"tag":29,"props":63701,"children":63702},{},[63703,63705,63710],{"type":23,"value":63704},"Instead of storing customer records, the integration platform acts purely as a ",{"type":17,"tag":48,"props":63706,"children":63707},{},[63708],{"type":23,"value":63709},"secure transport layer",{"type":23,"value":54},{"type":17,"tag":29,"props":63712,"children":63713},{},[63714],{"type":23,"value":63715},"This leads to several major compliance benefits.",{"type":17,"tag":239,"props":63717,"children":63719},{"id":63718},"smaller-audit-footprint",[63720],{"type":23,"value":63721},"Smaller audit footprint",{"type":17,"tag":29,"props":63723,"children":63724},{},[63725],{"type":23,"value":63726},"When an integration platform stores customer records, those records must be included in security audits.",{"type":17,"tag":29,"props":63728,"children":63729},{},[63730],{"type":23,"value":63731},"Auditors must verify controls such as:",{"type":17,"tag":80,"props":63733,"children":63734},{},[63735,63740,63745,63750,63755],{"type":17,"tag":84,"props":63736,"children":63737},{},[63738],{"type":23,"value":63739},"encryption at rest",{"type":17,"tag":84,"props":63741,"children":63742},{},[63743],{"type":23,"value":63744},"data retention policies",{"type":17,"tag":84,"props":63746,"children":63747},{},[63748],{"type":23,"value":63749},"backup and restoration processes",{"type":17,"tag":84,"props":63751,"children":63752},{},[63753],{"type":23,"value":63754},"deletion workflows",{"type":17,"tag":84,"props":63756,"children":63757},{},[63758],{"type":23,"value":63759},"access monitoring",{"type":17,"tag":29,"props":63761,"children":63762},{},[63763],{"type":23,"value":63764},"If the integration layer does not store customer records, these requirements disappear.",{"type":17,"tag":29,"props":63766,"children":63767},{},[63768],{"type":23,"value":63769},"The compliance boundary becomes smaller because fewer systems hold regulated data.",{"type":17,"tag":29,"props":63771,"children":63772},{},[63773],{"type":23,"value":63774},"For SOC 2 audits, this often means:",{"type":17,"tag":80,"props":63776,"children":63777},{},[63778,63783,63788],{"type":17,"tag":84,"props":63779,"children":63780},{},[63781],{"type":23,"value":63782},"fewer systems in scope",{"type":17,"tag":84,"props":63784,"children":63785},{},[63786],{"type":23,"value":63787},"fewer controls to document",{"type":17,"tag":84,"props":63789,"children":63790},{},[63791],{"type":23,"value":63792},"faster security reviews",{"type":17,"tag":239,"props":63794,"children":63796},{"id":63795},"clear-data-residency-boundaries",[63797],{"type":23,"value":63798},"Clear data residency boundaries",{"type":17,"tag":29,"props":63800,"children":63801},{},[63802,63804,63808,63809,63813,63814,63818],{"type":23,"value":63803},"Regulations such as ",{"type":17,"tag":48,"props":63805,"children":63806},{},[63807],{"type":23,"value":63416},{"type":23,"value":11826},{"type":17,"tag":48,"props":63810,"children":63811},{},[63812],{"type":23,"value":63428},{"type":23,"value":12561},{"type":17,"tag":48,"props":63815,"children":63816},{},[63817],{"type":23,"value":63434},{"type":23,"value":63819}," impose restrictions on where personal data can be stored or processed.",{"type":17,"tag":29,"props":63821,"children":63822},{},[63823],{"type":23,"value":63824},"If an integration platform replicates customer records, organizations must track:",{"type":17,"tag":80,"props":63826,"children":63827},{},[63828,63833,63838],{"type":17,"tag":84,"props":63829,"children":63830},{},[63831],{"type":23,"value":63832},"where those copies are stored",{"type":17,"tag":84,"props":63834,"children":63835},{},[63836],{"type":23,"value":63837},"which jurisdictions they reside in",{"type":17,"tag":84,"props":63839,"children":63840},{},[63841],{"type":23,"value":63842},"which sub-processors access them",{"type":17,"tag":29,"props":63844,"children":63845},{},[63846],{"type":23,"value":63847},"Zero-storage unified APIs simplify this dramatically.",{"type":17,"tag":29,"props":63849,"children":63850},{},[63851],{"type":23,"value":63852},"Because the integration layer does not persist data, personal information remains only in:",{"type":17,"tag":80,"props":63854,"children":63855},{},[63856,63861],{"type":17,"tag":84,"props":63857,"children":63858},{},[63859],{"type":23,"value":63860},"the original source system",{"type":17,"tag":84,"props":63862,"children":63863},{},[63864],{"type":23,"value":63865},"the application that requested it",{"type":17,"tag":29,"props":63867,"children":63868},{},[63869,63871,63876],{"type":23,"value":63870},"This makes it easier to enforce ",{"type":17,"tag":48,"props":63872,"children":63873},{},[63874],{"type":23,"value":63875},"regional routing policies",{"type":23,"value":63877}," and comply with data-residency rules.",{"type":17,"tag":29,"props":63879,"children":63880},{},[63881,63882,63887],{"type":23,"value":58218},{"type":17,"tag":48,"props":63883,"children":63884},{},[63885],{"type":23,"value":63886},"regional infrastructure deployments in the US, EU, and AU",{"type":23,"value":63888},", allowing organizations to keep traffic within the appropriate jurisdiction.",{"type":17,"tag":239,"props":63890,"children":63892},{"id":63891},"reduced-breach-and-liability-risk",[63893],{"type":23,"value":63894},"Reduced breach and liability risk",{"type":17,"tag":29,"props":63896,"children":63897},{},[63898],{"type":23,"value":63899},"Stored data is a liability.",{"type":17,"tag":29,"props":63901,"children":63902},{},[63903],{"type":23,"value":63904},"If an integration vendor maintains a database containing replicated customer records, that database becomes a potential breach target.",{"type":17,"tag":29,"props":63906,"children":63907},{},[63908],{"type":23,"value":63909},"A security incident involving the integration vendor could expose:",{"type":17,"tag":80,"props":63911,"children":63912},{},[63913,63918,63923,63928],{"type":17,"tag":84,"props":63914,"children":63915},{},[63916],{"type":23,"value":63917},"personal information",{"type":17,"tag":84,"props":63919,"children":63920},{},[63921],{"type":23,"value":63922},"financial data",{"type":17,"tag":84,"props":63924,"children":63925},{},[63926],{"type":23,"value":63927},"communications data",{"type":17,"tag":84,"props":63929,"children":63930},{},[63931],{"type":23,"value":63932},"operational records",{"type":17,"tag":29,"props":63934,"children":63935},{},[63936],{"type":23,"value":63937},"Zero-storage architectures remove this attack surface.",{"type":17,"tag":29,"props":63939,"children":63940},{},[63941,63943,63948],{"type":23,"value":63942},"If no customer data is stored, there is ",{"type":17,"tag":48,"props":63944,"children":63945},{},[63946],{"type":23,"value":63947},"nothing at rest to compromise",{"type":23,"value":54},{"type":17,"tag":29,"props":63950,"children":63951},{},[63952,63954,63959],{"type":23,"value":63953},"This aligns directly with privacy principles such as ",{"type":17,"tag":48,"props":63955,"children":63956},{},[63957],{"type":23,"value":63958},"data minimization",{"type":23,"value":63960},", which are embedded in regulations like GDPR.",{"type":17,"tag":239,"props":63962,"children":63964},{"id":63963},"simplified-retention-and-deletion-requirements",[63965],{"type":23,"value":63966},"Simplified retention and deletion requirements",{"type":17,"tag":29,"props":63968,"children":63969},{},[63970],{"type":23,"value":63971},"Privacy regulations require organizations to implement strict policies around:",{"type":17,"tag":80,"props":63973,"children":63974},{},[63975,63980,63985],{"type":17,"tag":84,"props":63976,"children":63977},{},[63978],{"type":23,"value":63979},"how long personal data can be stored",{"type":17,"tag":84,"props":63981,"children":63982},{},[63983],{"type":23,"value":63984},"how it must be deleted",{"type":17,"tag":84,"props":63986,"children":63987},{},[63988],{"type":23,"value":63989},"how deletion requests propagate across systems",{"type":17,"tag":29,"props":63991,"children":63992},{},[63993],{"type":23,"value":63994},"If an integration platform stores replicated data, organizations must ensure that deletion requests remove data from:",{"type":17,"tag":80,"props":63996,"children":63997},{},[63998,64003,64008,64013],{"type":17,"tag":84,"props":63999,"children":64000},{},[64001],{"type":23,"value":64002},"the original system",{"type":17,"tag":84,"props":64004,"children":64005},{},[64006],{"type":23,"value":64007},"the integration platform",{"type":17,"tag":84,"props":64009,"children":64010},{},[64011],{"type":23,"value":64012},"downstream analytics systems",{"type":17,"tag":84,"props":64014,"children":64015},{},[64016],{"type":23,"value":29437},{"type":17,"tag":29,"props":64018,"children":64019},{},[64020],{"type":23,"value":64021},"This creates operational complexity.",{"type":17,"tag":29,"props":64023,"children":64024},{},[64025,64027,64032],{"type":23,"value":64026},"Zero-storage integration architectures eliminate the need to maintain deletion policies for the integration layer because ",{"type":17,"tag":48,"props":64028,"children":64029},{},[64030],{"type":23,"value":64031},"the data is never persisted there",{"type":23,"value":54},{"type":17,"tag":239,"props":64034,"children":64036},{"id":64035},"lower-long-term-compliance-costs",[64037],{"type":23,"value":64038},"Lower long-term compliance costs",{"type":17,"tag":29,"props":64040,"children":64041},{},[64042],{"type":23,"value":64043},"Compliance is expensive.",{"type":17,"tag":29,"props":64045,"children":64046},{},[64047],{"type":23,"value":64048},"Organizations must invest in:",{"type":17,"tag":80,"props":64050,"children":64051},{},[64052,64057,64062,64067,64072],{"type":17,"tag":84,"props":64053,"children":64054},{},[64055],{"type":23,"value":64056},"monitoring systems",{"type":17,"tag":84,"props":64058,"children":64059},{},[64060],{"type":23,"value":64061},"security audits",{"type":17,"tag":84,"props":64063,"children":64064},{},[64065],{"type":23,"value":64066},"compliance documentation",{"type":17,"tag":84,"props":64068,"children":64069},{},[64070],{"type":23,"value":64071},"vendor assessments",{"type":17,"tag":84,"props":64073,"children":64074},{},[64075],{"type":23,"value":64076},"data-governance processes",{"type":17,"tag":29,"props":64078,"children":64079},{},[64080],{"type":23,"value":64081},"The more systems storing personal data, the higher these costs become.",{"type":17,"tag":29,"props":64083,"children":64084},{},[64085],{"type":23,"value":64086},"By minimizing stored data, zero-storage architectures reduce:",{"type":17,"tag":80,"props":64088,"children":64089},{},[64090,64095,64100],{"type":17,"tag":84,"props":64091,"children":64092},{},[64093],{"type":23,"value":64094},"the number of systems requiring audits",{"type":17,"tag":84,"props":64096,"children":64097},{},[64098],{"type":23,"value":64099},"the number of security controls required",{"type":17,"tag":84,"props":64101,"children":64102},{},[64103],{"type":23,"value":64104},"the documentation burden during compliance reviews",{"type":17,"tag":29,"props":64106,"children":64107},{},[64108],{"type":23,"value":64109},"This can significantly reduce operational overhead.",{"type":17,"tag":68,"props":64111,"children":64113},{"id":64112},"why-zero-storage-unified-apis-are-especially-important-for-ai-driven-saas",[64114],{"type":23,"value":64115},"Why Zero-Storage Unified APIs Are Especially Important for AI-Driven SaaS",{"type":17,"tag":29,"props":64117,"children":64118},{},[64119,64121,64126],{"type":23,"value":64120},"The rise of ",{"type":17,"tag":48,"props":64122,"children":64123},{},[64124],{"type":23,"value":64125},"AI agents and automation systems",{"type":23,"value":64127}," has created new requirements for integration infrastructure.",{"type":17,"tag":29,"props":64129,"children":64130},{},[64131],{"type":23,"value":64132},"AI systems often require:",{"type":17,"tag":80,"props":64134,"children":64135},{},[64136,64141,64146],{"type":17,"tag":84,"props":64137,"children":64138},{},[64139],{"type":23,"value":64140},"real-time access to operational data",{"type":17,"tag":84,"props":64142,"children":64143},{},[64144],{"type":23,"value":64145},"secure execution of actions across SaaS tools",{"type":17,"tag":84,"props":64147,"children":64148},{},[64149],{"type":23,"value":64150},"consistent schemas across providers",{"type":17,"tag":29,"props":64152,"children":64153},{},[64154],{"type":23,"value":64155},"Traditional sync-and-store integration platforms are poorly suited for these workflows because cached datasets may be stale.",{"type":17,"tag":29,"props":64157,"children":64158},{},[64159],{"type":23,"value":64160},"Zero-storage unified APIs provide two advantages:",{"type":17,"tag":80,"props":64162,"children":64163},{},[64164,64174],{"type":17,"tag":84,"props":64165,"children":64166},{},[64167,64172],{"type":17,"tag":48,"props":64168,"children":64169},{},[64170],{"type":23,"value":64171},"live data access",{"type":23,"value":64173}," from source systems",{"type":17,"tag":84,"props":64175,"children":64176},{},[64177,64182],{"type":17,"tag":48,"props":64178,"children":64179},{},[64180],{"type":23,"value":64181},"reduced privacy risk",{"type":23,"value":64183}," when AI agents interact with external platforms",{"type":17,"tag":29,"props":64185,"children":64186},{},[64187,64188,64203],{"type":23,"value":25244},{"type":17,"tag":48,"props":64189,"children":64190},{},[64191,64196,64197,64201],{"type":17,"tag":133,"props":64192,"children":64194},{"href":64193},"/blog/what_is_model_context_protocol_mcp_a_guide_for_product_managers",[64195],{"type":23,"value":44580},{"type":23,"value":44573},{"type":17,"tag":133,"props":64198,"children":64199},{"href":326},[64200],{"type":23,"value":329},{"type":23,"value":64202},") server",{"type":23,"value":64204}," builds on this architecture by exposing SaaS operations as secure tools for AI systems without storing customer data.",{"type":17,"tag":29,"props":64206,"children":64207},{},[64208],{"type":23,"value":64209},"This allows AI agents to safely perform actions across hundreds of SaaS platforms while maintaining strong security boundaries.",{"type":17,"tag":68,"props":64211,"children":64213},{"id":64212},"unifieds-security-first-integration-architecture",[64214],{"type":23,"value":64215},"Unified's Security-First Integration Architecture",{"type":17,"tag":29,"props":64217,"children":64218},{},[64219],{"type":23,"value":64220},"Unified's platform is designed around several security principles that support compliance across multiple frameworks.",{"type":17,"tag":29,"props":64222,"children":64223},{},[64224],{"type":23,"value":64225},"Key characteristics include:",{"type":17,"tag":29,"props":64227,"children":64228},{},[64229],{"type":17,"tag":48,"props":64230,"children":64231},{},[64232],{"type":23,"value":17067},{"type":17,"tag":29,"props":64234,"children":64235},{},[64236],{"type":23,"value":64237},"Customer records from third-party systems are never stored.",{"type":17,"tag":29,"props":64239,"children":64240},{},[64241],{"type":23,"value":64242},"API responses are processed in memory and immediately returned.",{"type":17,"tag":29,"props":64244,"children":64245},{},[64246],{"type":17,"tag":48,"props":64247,"children":64248},{},[64249],{"type":23,"value":64250},"Pass-through API execution",{"type":17,"tag":29,"props":64252,"children":64253},{},[64254],{"type":23,"value":64255},"Every request is executed directly against the source API at request time.",{"type":17,"tag":29,"props":64257,"children":64258},{},[64259],{"type":23,"value":64260},"This ensures fresh data without replication.",{"type":17,"tag":29,"props":64262,"children":64263},{},[64264],{"type":17,"tag":48,"props":64265,"children":64266},{},[64267],{"type":23,"value":64268},"Authorization-first access",{"type":17,"tag":29,"props":64270,"children":64271},{},[64272,64274,64278],{"type":23,"value":64273},"Every integration operates through explicit customer authorization using ",{"type":17,"tag":133,"props":64275,"children":64276},{"href":779},[64277],{"type":23,"value":782},{"type":23,"value":64279}," or API credentials.",{"type":17,"tag":29,"props":64281,"children":64282},{},[64283],{"type":23,"value":64284},"Connections are scoped to specific tenants and permissions.",{"type":17,"tag":29,"props":64286,"children":64287},{},[64288],{"type":17,"tag":48,"props":64289,"children":64290},{},[64291],{"type":23,"value":64292},"Encrypted transport",{"type":17,"tag":29,"props":64294,"children":64295},{},[64296,64298,64303],{"type":23,"value":64297},"All data is transmitted using ",{"type":17,"tag":48,"props":64299,"children":64300},{},[64301],{"type":23,"value":64302},"TLS 1.2+ encryption",{"type":23,"value":54},{"type":17,"tag":29,"props":64305,"children":64306},{},[64307],{"type":17,"tag":48,"props":64308,"children":64309},{},[64310],{"type":23,"value":64311},"Minimal operational metadata",{"type":17,"tag":29,"props":64313,"children":64314},{},[64315,64317,64322],{"type":23,"value":64316},"Only limited operational metadata is stored, encrypted using ",{"type":17,"tag":48,"props":64318,"children":64319},{},[64320],{"type":23,"value":64321},"AES-256",{"type":23,"value":54},{"type":17,"tag":29,"props":64324,"children":64325},{},[64326],{"type":17,"tag":48,"props":64327,"children":64328},{},[64329],{"type":23,"value":64330},"Regional infrastructure",{"type":17,"tag":29,"props":64332,"children":64333},{},[64334],{"type":23,"value":64335},"Unified provides isolated infrastructure regions in:",{"type":17,"tag":80,"props":64337,"children":64338},{},[64339,64344,64349],{"type":17,"tag":84,"props":64340,"children":64341},{},[64342],{"type":23,"value":64343},"United States",{"type":17,"tag":84,"props":64345,"children":64346},{},[64347],{"type":23,"value":64348},"Europe",{"type":17,"tag":84,"props":64350,"children":64351},{},[64352],{"type":23,"value":64353},"Australia",{"type":17,"tag":29,"props":64355,"children":64356},{},[64357],{"type":23,"value":64358},"This supports regional compliance requirements.",{"type":17,"tag":29,"props":64360,"children":64361},{},[64362],{"type":17,"tag":48,"props":64363,"children":64364},{},[64365],{"type":23,"value":64366},"Centralized observability",{"type":17,"tag":29,"props":64368,"children":64369},{},[64370],{"type":23,"value":64371},"Integration activity is logged and monitored without storing sensitive payloads.",{"type":17,"tag":29,"props":64373,"children":64374},{},[64375],{"type":23,"value":64376},"Together, these characteristics help organizations maintain strong security controls while minimizing regulatory complexity.",{"type":17,"tag":68,"props":64378,"children":64379},{"id":1552},[64380],{"type":23,"value":44411},{"type":17,"tag":29,"props":64382,"children":64383},{},[64384,64386,64391],{"type":23,"value":64385},"Compliance frameworks such as SOC 2, GDPR, HIPAA, CCPA, and PIPEDA all emphasize a common principle: ",{"type":17,"tag":48,"props":64387,"children":64388},{},[64389],{"type":23,"value":64390},"minimize the collection and storage of personal data wherever possible",{"type":23,"value":54},{"type":17,"tag":29,"props":64393,"children":64394},{},[64395],{"type":23,"value":64396},"Integration architecture plays a major role in achieving this goal.",{"type":17,"tag":29,"props":64398,"children":64399},{},[64400],{"type":23,"value":64401},"Platforms that replicate customer data introduce new regulatory risks because they create additional storage locations that must be secured, audited, and managed.",{"type":17,"tag":29,"props":64403,"children":64404},{},[64405],{"type":23,"value":64406},"Zero-storage unified APIs eliminate this problem.",{"type":17,"tag":29,"props":64408,"children":64409},{},[64410,64412,64417],{"type":23,"value":64411},"By treating integrations as ",{"type":17,"tag":48,"props":64413,"children":64414},{},[64415],{"type":23,"value":64416},"stateless pass-through operations",{"type":23,"value":64418},", these architectures reduce the compliance footprint, clarify data-residency boundaries, and significantly lower breach risk.",{"type":17,"tag":29,"props":64420,"children":64421},{},[64422],{"type":23,"value":64423},"For SaaS companies building integration-heavy products, choosing a zero-storage unified API architecture can dramatically simplify security reviews, accelerate enterprise adoption, and reduce long-term compliance costs.",{"type":17,"tag":29,"props":64425,"children":64426},{},[64427],{"type":17,"tag":133,"props":64428,"children":64430},{"href":1612,"rel":64429},[214],[64431],{"type":23,"value":44481},{"type":17,"tag":29,"props":64433,"children":64434},{},[64435],{"type":17,"tag":133,"props":64436,"children":64438},{"href":1623,"rel":64437},[214],[64439],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":64441},[64442,64443,64444,64451,64452,64453],{"id":63489,"depth":1629,"text":63492},{"id":63595,"depth":1629,"text":63598},{"id":63691,"depth":1629,"text":63694,"children":64445},[64446,64447,64448,64449,64450],{"id":63718,"depth":1635,"text":63721},{"id":63795,"depth":1635,"text":63798},{"id":63891,"depth":1635,"text":63894},{"id":63963,"depth":1635,"text":63966},{"id":64035,"depth":1635,"text":64038},{"id":64112,"depth":1629,"text":64115},{"id":64212,"depth":1629,"text":64215},{"id":1552,"depth":1629,"text":44411},"content:blog:why_zero_storage_unified_apis_simplify_compliance_for_saas_integrations.md","blog/why_zero_storage_unified_apis_simplify_compliance_for_saas_integrations.md","blog/why_zero_storage_unified_apis_simplify_compliance_for_saas_integrations",{"_path":64458,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":64459,"description":64460,"img":64461,"date":64462,"tag":12,"body":64463,"_type":1677,"_id":65536,"_source":1679,"_file":65537,"_stem":65538,"_extension":1682},"/blog/how_to_design_saas_integrations_that_meet_soc_2_gdpr_hipaa_ccpa_and_pipeda_requirements","How to Design SaaS Integrations That Meet SOC 2, GDPR, HIPAA, CCPA, and PIPEDA Requirements","Modern SaaS integrations move customer, employee, financial, and sometimes healthcare data across multiple systems. Compliance is not just a legal or policy...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_design_saas_integrations_that_meet_soc_2_gdpr_hipaa_ccpa_and_pipeda_requirements-icon.png","2026-03-11T14:52:00.000Z",{"type":14,"children":64464,"toc":65509},[64465,64470,64473,64480,64485,64490,64495,64501,64506,64511,64585,64590,64594,64600,64605,64610,64615,64620,64625,64630,64652,64657,64662,64667,64672,64695,64700,64706,64711,64734,64739,64762,64767,64772,64777,64782,64805,64810,64816,64821,64971,64976,64982,64987,64992,65103,65108,65114,65119,65125,65130,65136,65141,65147,65152,65158,65163,65169,65174,65180,65185,65191,65196,65202,65207,65213,65218,65223,65251,65256,65261,65267,65272,65277,65295,65300,65323,65328,65334,65339,65344,65382,65387,65392,65398,65451,65455,65493,65501],{"type":17,"tag":18,"props":64466,"children":64468},{"id":64467},"how-to-design-saas-integrations-that-meet-soc-2-gdpr-hipaa-ccpa-and-pipeda-requirements",[64469],{"type":23,"value":64459},{"type":17,"tag":25,"props":64471,"children":64472},{},[],{"type":17,"tag":29,"props":64474,"children":64475},{},[64476],{"type":17,"tag":33,"props":64477,"children":64478},{},[64479],{"type":23,"value":49465},{"type":17,"tag":29,"props":64481,"children":64482},{},[64483],{"type":23,"value":64484},"Modern SaaS integrations move customer, employee, financial, and sometimes healthcare data across multiple systems. Compliance is not just a legal or policy problem—it is an architectural one.",{"type":17,"tag":29,"props":64486,"children":64487},{},[64488],{"type":23,"value":64489},"Every integration introduces another system that can access, process, or store regulated data. As integrations scale, so does the compliance surface. Systems that replicate or persist data increase audit scope, while systems that minimize storage reduce risk.",{"type":17,"tag":29,"props":64491,"children":64492},{},[64493],{"type":23,"value":64494},"For integration-heavy SaaS products, the architecture used to connect systems directly determines how difficult compliance becomes.",{"type":17,"tag":68,"props":64496,"children":64498},{"id":64497},"why-integration-architecture-matters-for-compliance",[64499],{"type":23,"value":64500},"Why integration architecture matters for compliance",{"type":17,"tag":29,"props":64502,"children":64503},{},[64504],{"type":23,"value":64505},"Most SaaS platforms rely on dozens of integrations—CRMs, support tools, messaging platforms, analytics systems, billing providers. Each one creates a new data flow path.",{"type":17,"tag":29,"props":64507,"children":64508},{},[64509],{"type":23,"value":64510},"This introduces several compounding risks:",{"type":17,"tag":80,"props":64512,"children":64513},{},[64514,64533,64546,64559,64572],{"type":17,"tag":84,"props":64515,"children":64516},{},[64517,64522,64525,64527,64531],{"type":17,"tag":48,"props":64518,"children":64519},{},[64520],{"type":23,"value":64521},"Every integration adds a new path for sensitive data",{"type":17,"tag":3891,"props":64523,"children":64524},{},[],{"type":23,"value":64526},"Data no longer lives in a single system. It moves across APIs, ",{"type":17,"tag":133,"props":64528,"children":64529},{"href":4999},[64530],{"type":23,"value":5002},{"type":23,"value":64532},", and vendors.",{"type":17,"tag":84,"props":64534,"children":64535},{},[64536,64541,64544],{"type":17,"tag":48,"props":64537,"children":64538},{},[64539],{"type":23,"value":64540},"Replicated data increases audit scope",{"type":17,"tag":3891,"props":64542,"children":64543},{},[],{"type":23,"value":64545},"When data is copied into multiple systems, each one must be secured, audited, and monitored.",{"type":17,"tag":84,"props":64547,"children":64548},{},[64549,64554,64557],{"type":17,"tag":48,"props":64550,"children":64551},{},[64552],{"type":23,"value":64553},"Deletion and correction become harder",{"type":17,"tag":3891,"props":64555,"children":64556},{},[],{"type":23,"value":64558},"Privacy requests must propagate across every system that holds the data.",{"type":17,"tag":84,"props":64560,"children":64561},{},[64562,64567,64570],{"type":17,"tag":48,"props":64563,"children":64564},{},[64565],{"type":23,"value":64566},"More vendors means more risk",{"type":17,"tag":3891,"props":64568,"children":64569},{},[],{"type":23,"value":64571},"Each integration partner becomes a processor or sub-processor with its own security posture.",{"type":17,"tag":84,"props":64573,"children":64574},{},[64575,64580,64583],{"type":17,"tag":48,"props":64576,"children":64577},{},[64578],{"type":23,"value":64579},"Regional transfer obligations get more complex",{"type":17,"tag":3891,"props":64581,"children":64582},{},[],{"type":23,"value":64584},"Cross-border data flows introduce additional compliance requirements under GDPR and PIPEDA.",{"type":17,"tag":29,"props":64586,"children":64587},{},[64588],{"type":23,"value":64589},"Compliance complexity is not linear—it compounds with each additional system that stores or processes data.",{"type":17,"tag":11616,"props":64591,"children":64593},{"width":11618,"height":11619,"src":64592,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/rDEFLIeb6ik",[],{"type":17,"tag":68,"props":64595,"children":64597},{"id":64596},"which-compliance-frameworks-affect-saas-integrations",[64598],{"type":23,"value":64599},"Which compliance frameworks affect SaaS integrations",{"type":17,"tag":239,"props":64601,"children":64603},{"id":64602},"soc-2",[64604],{"type":23,"value":63410},{"type":17,"tag":29,"props":64606,"children":64607},{},[64608],{"type":23,"value":64609},"SOC 2 evaluates how well a system protects data across five Trust Services Criteria: security, availability, processing integrity, confidentiality, and privacy.",{"type":17,"tag":29,"props":64611,"children":64612},{},[64613],{"type":23,"value":64614},"Integrations directly impact all five. They introduce new authentication flows, data transfers, vendor dependencies, and operational risks. Auditors expect visibility into how integrations handle access control, logging, encryption, and data processing.",{"type":17,"tag":239,"props":64616,"children":64618},{"id":64617},"gdpr",[64619],{"type":23,"value":63416},{"type":17,"tag":29,"props":64621,"children":64622},{},[64623],{"type":23,"value":64624},"The General Data Protection Regulation governs how personal data of EU residents is collected, processed, and transferred.",{"type":17,"tag":29,"props":64626,"children":64627},{},[64628],{"type":23,"value":64629},"For integrations, GDPR introduces strict requirements around:",{"type":17,"tag":80,"props":64631,"children":64632},{},[64633,64637,64642,64647],{"type":17,"tag":84,"props":64634,"children":64635},{},[64636],{"type":23,"value":63958},{"type":17,"tag":84,"props":64638,"children":64639},{},[64640],{"type":23,"value":64641},"lawful processing",{"type":17,"tag":84,"props":64643,"children":64644},{},[64645],{"type":23,"value":64646},"cross-border transfers",{"type":17,"tag":84,"props":64648,"children":64649},{},[64650],{"type":23,"value":64651},"deletion and access rights",{"type":17,"tag":29,"props":64653,"children":64654},{},[64655],{"type":23,"value":64656},"Any system that stores or processes EU data becomes part of the compliance scope.",{"type":17,"tag":239,"props":64658,"children":64660},{"id":64659},"hipaa",[64661],{"type":23,"value":63422},{"type":17,"tag":29,"props":64663,"children":64664},{},[64665],{"type":23,"value":64666},"HIPAA regulates protected health information (PHI) in the US healthcare ecosystem.",{"type":17,"tag":29,"props":64668,"children":64669},{},[64670],{"type":23,"value":64671},"Integrations must enforce:",{"type":17,"tag":80,"props":64673,"children":64674},{},[64675,64680,64685,64690],{"type":17,"tag":84,"props":64676,"children":64677},{},[64678],{"type":23,"value":64679},"strict access controls",{"type":17,"tag":84,"props":64681,"children":64682},{},[64683],{"type":23,"value":64684},"encryption in transit and at rest",{"type":17,"tag":84,"props":64686,"children":64687},{},[64688],{"type":23,"value":64689},"detailed audit logging",{"type":17,"tag":84,"props":64691,"children":64692},{},[64693],{"type":23,"value":64694},"vendor agreements (BAAs)",{"type":17,"tag":29,"props":64696,"children":64697},{},[64698],{"type":23,"value":64699},"Any integration that touches PHI—whether clinical or operational—must meet these requirements.",{"type":17,"tag":239,"props":64701,"children":64703},{"id":64702},"ccpa-cpra",[64704],{"type":23,"value":64705},"CCPA / CPRA",{"type":17,"tag":29,"props":64707,"children":64708},{},[64709],{"type":23,"value":64710},"The California Consumer Privacy Act and CPRA grant users rights over their personal data, including:",{"type":17,"tag":80,"props":64712,"children":64713},{},[64714,64719,64724,64729],{"type":17,"tag":84,"props":64715,"children":64716},{},[64717],{"type":23,"value":64718},"access to collected data",{"type":17,"tag":84,"props":64720,"children":64721},{},[64722],{"type":23,"value":64723},"deletion requests",{"type":17,"tag":84,"props":64725,"children":64726},{},[64727],{"type":23,"value":64728},"correction of inaccurate data",{"type":17,"tag":84,"props":64730,"children":64731},{},[64732],{"type":23,"value":64733},"opt-out of sale or sharing",{"type":17,"tag":29,"props":64735,"children":64736},{},[64737],{"type":23,"value":64738},"A key distinction is vendor classification:",{"type":17,"tag":80,"props":64740,"children":64741},{},[64742,64752],{"type":17,"tag":84,"props":64743,"children":64744},{},[64745,64750],{"type":17,"tag":48,"props":64746,"children":64747},{},[64748],{"type":23,"value":64749},"Service providers",{"type":23,"value":64751}," process data only on your behalf",{"type":17,"tag":84,"props":64753,"children":64754},{},[64755,64760],{"type":17,"tag":48,"props":64756,"children":64757},{},[64758],{"type":23,"value":64759},"Third parties",{"type":23,"value":64761}," may use data independently (triggering opt-out requirements)",{"type":17,"tag":29,"props":64763,"children":64764},{},[64765],{"type":23,"value":64766},"Integrations must support deletion propagation, opt-out enforcement, and consumer request workflows.",{"type":17,"tag":239,"props":64768,"children":64770},{"id":64769},"pipeda",[64771],{"type":23,"value":63434},{"type":17,"tag":29,"props":64773,"children":64774},{},[64775],{"type":23,"value":64776},"PIPEDA governs how Canadian personal data is collected and processed.",{"type":17,"tag":29,"props":64778,"children":64779},{},[64780],{"type":23,"value":64781},"It does not restrict cross-border transfers, but it places accountability on the originating organization. If data is processed outside Canada:",{"type":17,"tag":80,"props":64783,"children":64784},{},[64785,64790,64795,64800],{"type":17,"tag":84,"props":64786,"children":64787},{},[64788],{"type":23,"value":64789},"the original company remains responsible",{"type":17,"tag":84,"props":64791,"children":64792},{},[64793],{"type":23,"value":64794},"third-party processors must provide comparable safeguards",{"type":17,"tag":84,"props":64796,"children":64797},{},[64798],{"type":23,"value":64799},"contracts must enforce protections",{"type":17,"tag":84,"props":64801,"children":64802},{},[64803],{"type":23,"value":64804},"users must be informed",{"type":17,"tag":29,"props":64806,"children":64807},{},[64808],{"type":23,"value":64809},"This makes integration architecture critical—replicated data increases the number of systems that must meet these obligations.",{"type":17,"tag":68,"props":64811,"children":64813},{"id":64812},"overlapping-controls-across-soc-2-gdpr-hipaa-ccpa-and-pipeda",[64814],{"type":23,"value":64815},"Overlapping controls across SOC 2, GDPR, HIPAA, CCPA, and PIPEDA",{"type":17,"tag":29,"props":64817,"children":64818},{},[64819],{"type":23,"value":64820},"Despite different scopes, these frameworks share a common set of technical requirements.",{"type":17,"tag":7231,"props":64822,"children":64823},{},[64824,64845],{"type":17,"tag":7235,"props":64825,"children":64826},{},[64827],{"type":17,"tag":7239,"props":64828,"children":64829},{},[64830,64835,64840],{"type":17,"tag":7243,"props":64831,"children":64832},{},[64833],{"type":23,"value":64834},"Control area",{"type":17,"tag":7243,"props":64836,"children":64837},{},[64838],{"type":23,"value":64839},"Why it matters for integrations",{"type":17,"tag":7243,"props":64841,"children":64842},{},[64843],{"type":23,"value":64844},"Relevant frameworks",{"type":17,"tag":7259,"props":64846,"children":64847},{},[64848,64866,64883,64900,64917,64935,64953],{"type":17,"tag":7239,"props":64849,"children":64850},{},[64851,64856,64861],{"type":17,"tag":7266,"props":64852,"children":64853},{},[64854],{"type":23,"value":64855},"Least-privilege access",{"type":17,"tag":7266,"props":64857,"children":64858},{},[64859],{"type":23,"value":64860},"Limits unnecessary access to regulated data",{"type":17,"tag":7266,"props":64862,"children":64863},{},[64864],{"type":23,"value":64865},"All",{"type":17,"tag":7239,"props":64867,"children":64868},{},[64869,64874,64879],{"type":17,"tag":7266,"props":64870,"children":64871},{},[64872],{"type":23,"value":64873},"Encryption in transit and at rest",{"type":17,"tag":7266,"props":64875,"children":64876},{},[64877],{"type":23,"value":64878},"Protects data moving across systems",{"type":17,"tag":7266,"props":64880,"children":64881},{},[64882],{"type":23,"value":64865},{"type":17,"tag":7239,"props":64884,"children":64885},{},[64886,64891,64896],{"type":17,"tag":7266,"props":64887,"children":64888},{},[64889],{"type":23,"value":64890},"Logging and auditability",{"type":17,"tag":7266,"props":64892,"children":64893},{},[64894],{"type":23,"value":64895},"Supports incident response and audits",{"type":17,"tag":7266,"props":64897,"children":64898},{},[64899],{"type":23,"value":64865},{"type":17,"tag":7239,"props":64901,"children":64902},{},[64903,64908,64913],{"type":17,"tag":7266,"props":64904,"children":64905},{},[64906],{"type":23,"value":64907},"Vendor risk management",{"type":17,"tag":7266,"props":64909,"children":64910},{},[64911],{"type":23,"value":64912},"Third-party integrations expand scope",{"type":17,"tag":7266,"props":64914,"children":64915},{},[64916],{"type":23,"value":64865},{"type":17,"tag":7239,"props":64918,"children":64919},{},[64920,64925,64930],{"type":17,"tag":7266,"props":64921,"children":64922},{},[64923],{"type":23,"value":64924},"Data minimization",{"type":17,"tag":7266,"props":64926,"children":64927},{},[64928],{"type":23,"value":64929},"Reduces privacy and security exposure",{"type":17,"tag":7266,"props":64931,"children":64932},{},[64933],{"type":23,"value":64934},"GDPR, CCPA, PIPEDA, HIPAA in practice",{"type":17,"tag":7239,"props":64936,"children":64937},{},[64938,64943,64948],{"type":17,"tag":7266,"props":64939,"children":64940},{},[64941],{"type":23,"value":64942},"Deletion/correction workflows",{"type":17,"tag":7266,"props":64944,"children":64945},{},[64946],{"type":23,"value":64947},"Required for privacy rights and operational hygiene",{"type":17,"tag":7266,"props":64949,"children":64950},{},[64951],{"type":23,"value":64952},"GDPR, CCPA, PIPEDA",{"type":17,"tag":7239,"props":64954,"children":64955},{},[64956,64961,64966],{"type":17,"tag":7266,"props":64957,"children":64958},{},[64959],{"type":23,"value":64960},"Regional processing controls",{"type":17,"tag":7266,"props":64962,"children":64963},{},[64964],{"type":23,"value":64965},"Limits unauthorized transfers",{"type":17,"tag":7266,"props":64967,"children":64968},{},[64969],{"type":23,"value":64970},"GDPR, PIPEDA",{"type":17,"tag":29,"props":64972,"children":64973},{},[64974],{"type":23,"value":64975},"If your integration architecture enforces these controls consistently, you satisfy a large portion of requirements across all frameworks.",{"type":17,"tag":68,"props":64977,"children":64979},{"id":64978},"what-makes-integrations-hard-to-keep-compliant",[64980],{"type":23,"value":64981},"What makes integrations hard to keep compliant",{"type":17,"tag":29,"props":64983,"children":64984},{},[64985],{"type":23,"value":64986},"Compliance challenges rarely come from a single system—they emerge from how systems interact.",{"type":17,"tag":29,"props":64988,"children":64989},{},[64990],{"type":23,"value":64991},"Common failure points include:",{"type":17,"tag":80,"props":64993,"children":64994},{},[64995,65008,65021,65034,65047,65060,65077,65090],{"type":17,"tag":84,"props":64996,"children":64997},{},[64998,65003,65006],{"type":17,"tag":48,"props":64999,"children":65000},{},[65001],{"type":23,"value":65002},"Data replication across systems",{"type":17,"tag":3891,"props":65004,"children":65005},{},[],{"type":23,"value":65007},"Multiple storage layers expand audit scope and breach risk.",{"type":17,"tag":84,"props":65009,"children":65010},{},[65011,65016,65019],{"type":17,"tag":48,"props":65012,"children":65013},{},[65014],{"type":23,"value":65015},"Multiple processors and vendors",{"type":17,"tag":3891,"props":65017,"children":65018},{},[],{"type":23,"value":65020},"Each integration introduces another party handling regulated data.",{"type":17,"tag":84,"props":65022,"children":65023},{},[65024,65029,65032],{"type":17,"tag":48,"props":65025,"children":65026},{},[65027],{"type":23,"value":65028},"Hard deletion propagation",{"type":17,"tag":3891,"props":65030,"children":65031},{},[],{"type":23,"value":65033},"Removing data across all systems becomes operationally complex.",{"type":17,"tag":84,"props":65035,"children":65036},{},[65037,65042,65045],{"type":17,"tag":48,"props":65038,"children":65039},{},[65040],{"type":23,"value":65041},"Inconsistent retention policies",{"type":17,"tag":3891,"props":65043,"children":65044},{},[],{"type":23,"value":65046},"Different systems store data for different durations.",{"type":17,"tag":84,"props":65048,"children":65049},{},[65050,65055,65058],{"type":17,"tag":48,"props":65051,"children":65052},{},[65053],{"type":23,"value":65054},"Weak observability",{"type":17,"tag":3891,"props":65056,"children":65057},{},[],{"type":23,"value":65059},"Lack of logs makes it difficult to prove compliance or investigate incidents.",{"type":17,"tag":84,"props":65061,"children":65062},{},[65063,65068,65071,65075],{"type":17,"tag":48,"props":65064,"children":65065},{},[65066],{"type":23,"value":65067},"Token and credential sprawl",{"type":17,"tag":3891,"props":65069,"children":65070},{},[],{"type":17,"tag":133,"props":65072,"children":65073},{"href":779},[65074],{"type":23,"value":782},{"type":23,"value":65076}," tokens and API keys proliferate across systems.",{"type":17,"tag":84,"props":65078,"children":65079},{},[65080,65085,65088],{"type":17,"tag":48,"props":65081,"children":65082},{},[65083],{"type":23,"value":65084},"Webhook endpoints and retry systems",{"type":17,"tag":3891,"props":65086,"children":65087},{},[],{"type":23,"value":65089},"Delivery failures, duplicates, and retries create additional operational complexity.",{"type":17,"tag":84,"props":65091,"children":65092},{},[65093,65098,65101],{"type":17,"tag":48,"props":65094,"children":65095},{},[65096],{"type":23,"value":65097},"Cross-region data flows",{"type":17,"tag":3891,"props":65099,"children":65100},{},[],{"type":23,"value":65102},"Data may unintentionally move across jurisdictions.",{"type":17,"tag":29,"props":65104,"children":65105},{},[65106],{"type":23,"value":65107},"These problems are architectural, not just procedural.",{"type":17,"tag":68,"props":65109,"children":65111},{"id":65110},"architecture-principles-for-compliant-saas-integrations",[65112],{"type":23,"value":65113},"Architecture principles for compliant SaaS integrations",{"type":17,"tag":29,"props":65115,"children":65116},{},[65117],{"type":23,"value":65118},"To reduce compliance risk, integration architecture should follow a consistent set of principles.",{"type":17,"tag":239,"props":65120,"children":65122},{"id":65121},"map-and-classify-data-flows",[65123],{"type":23,"value":65124},"Map and classify data flows",{"type":17,"tag":29,"props":65126,"children":65127},{},[65128],{"type":23,"value":65129},"Identify what data is collected, where it moves, and which systems process it.",{"type":17,"tag":239,"props":65131,"children":65133},{"id":65132},"enforce-least-privilege-access",[65134],{"type":23,"value":65135},"Enforce least-privilege access",{"type":17,"tag":29,"props":65137,"children":65138},{},[65139],{"type":23,"value":65140},"Use scoped OAuth tokens, tenant isolation, and role-based access control.",{"type":17,"tag":239,"props":65142,"children":65144},{"id":65143},"minimize-stored-data",[65145],{"type":23,"value":65146},"Minimize stored data",{"type":17,"tag":29,"props":65148,"children":65149},{},[65150],{"type":23,"value":65151},"Avoid persisting customer records unless necessary. Store only what is required for functionality.",{"type":17,"tag":239,"props":65153,"children":65155},{"id":65154},"centralize-logging-and-monitoring",[65156],{"type":23,"value":65157},"Centralize logging and monitoring",{"type":17,"tag":29,"props":65159,"children":65160},{},[65161],{"type":23,"value":65162},"Capture API activity, authentication events, and data access in a single system.",{"type":17,"tag":239,"props":65164,"children":65166},{"id":65165},"automate-privacy-workflows",[65167],{"type":23,"value":65168},"Automate privacy workflows",{"type":17,"tag":29,"props":65170,"children":65171},{},[65172],{"type":23,"value":65173},"Ensure deletion, correction, and opt-out requests propagate across all integrations.",{"type":17,"tag":239,"props":65175,"children":65177},{"id":65176},"evaluate-vendors-and-contracts",[65178],{"type":23,"value":65179},"Evaluate vendors and contracts",{"type":17,"tag":29,"props":65181,"children":65182},{},[65183],{"type":23,"value":65184},"Verify security practices, certifications, and data processing agreements.",{"type":17,"tag":239,"props":65186,"children":65188},{"id":65187},"isolate-sensitive-workloads",[65189],{"type":23,"value":65190},"Isolate sensitive workloads",{"type":17,"tag":29,"props":65192,"children":65193},{},[65194],{"type":23,"value":65195},"Separate systems handling highly sensitive data (e.g. PHI) from general infrastructure.",{"type":17,"tag":239,"props":65197,"children":65199},{"id":65198},"use-regional-infrastructure-where-required",[65200],{"type":23,"value":65201},"Use regional infrastructure where required",{"type":17,"tag":29,"props":65203,"children":65204},{},[65205],{"type":23,"value":65206},"Route data based on geographic requirements and enforce region-specific processing.",{"type":17,"tag":68,"props":65208,"children":65210},{"id":65209},"why-data-replication-makes-compliance-harder",[65211],{"type":23,"value":65212},"Why data replication makes compliance harder",{"type":17,"tag":29,"props":65214,"children":65215},{},[65216],{"type":23,"value":65217},"Many integration platforms replicate customer data into internal databases.",{"type":17,"tag":29,"props":65219,"children":65220},{},[65221],{"type":23,"value":65222},"This architecture introduces additional complexity:",{"type":17,"tag":80,"props":65224,"children":65225},{},[65226,65231,65236,65241,65246],{"type":17,"tag":84,"props":65227,"children":65228},{},[65229],{"type":23,"value":65230},"more systems store regulated data",{"type":17,"tag":84,"props":65232,"children":65233},{},[65234],{"type":23,"value":65235},"deletion requests must propagate across multiple databases",{"type":17,"tag":84,"props":65237,"children":65238},{},[65239],{"type":23,"value":65240},"vendors gain access to sensitive information",{"type":17,"tag":84,"props":65242,"children":65243},{},[65244],{"type":23,"value":65245},"audit scope increases significantly",{"type":17,"tag":84,"props":65247,"children":65248},{},[65249],{"type":23,"value":65250},"breach exposure expands",{"type":17,"tag":29,"props":65252,"children":65253},{},[65254],{"type":23,"value":65255},"Each additional data store becomes part of the compliance boundary.",{"type":17,"tag":29,"props":65257,"children":65258},{},[65259],{"type":23,"value":65260},"Reducing unnecessary storage is one of the most effective ways to simplify compliance.",{"type":17,"tag":68,"props":65262,"children":65264},{"id":65263},"how-real-time-pass-through-integration-architectures-reduce-compliance-scope",[65265],{"type":23,"value":65266},"How real-time pass-through integration architectures reduce compliance scope",{"type":17,"tag":29,"props":65268,"children":65269},{},[65270],{"type":23,"value":65271},"Modern integration architectures increasingly avoid storing customer data altogether.",{"type":17,"tag":29,"props":65273,"children":65274},{},[65275],{"type":23,"value":65276},"Instead of replicating data, they:",{"type":17,"tag":80,"props":65278,"children":65279},{},[65280,65285,65290],{"type":17,"tag":84,"props":65281,"children":65282},{},[65283],{"type":23,"value":65284},"fetch data directly from the source system",{"type":17,"tag":84,"props":65286,"children":65287},{},[65288],{"type":23,"value":65289},"process requests in real time",{"type":17,"tag":84,"props":65291,"children":65292},{},[65293],{"type":23,"value":65294},"avoid intermediate storage layers",{"type":17,"tag":29,"props":65296,"children":65297},{},[65298],{"type":23,"value":65299},"This reduces compliance complexity by:",{"type":17,"tag":80,"props":65301,"children":65302},{},[65303,65308,65313,65318],{"type":17,"tag":84,"props":65304,"children":65305},{},[65306],{"type":23,"value":65307},"minimizing data-at-rest exposure",{"type":17,"tag":84,"props":65309,"children":65310},{},[65311],{"type":23,"value":65312},"simplifying deletion workflows",{"type":17,"tag":84,"props":65314,"children":65315},{},[65316],{"type":23,"value":65317},"reducing the number of processors",{"type":17,"tag":84,"props":65319,"children":65320},{},[65321],{"type":23,"value":65322},"shrinking audit scope",{"type":17,"tag":29,"props":65324,"children":65325},{},[65326],{"type":23,"value":65327},"Less stored data means fewer systems to secure, monitor, and audit.",{"type":17,"tag":68,"props":65329,"children":65331},{"id":65330},"unifieds-compliance-focused-architecture",[65332],{"type":23,"value":65333},"Unified's compliance-focused architecture",{"type":17,"tag":29,"props":65335,"children":65336},{},[65337],{"type":23,"value":65338},"Unified is designed around a real-time pass-through model.",{"type":17,"tag":29,"props":65340,"children":65341},{},[65342],{"type":23,"value":65343},"Key characteristics:",{"type":17,"tag":80,"props":65345,"children":65346},{},[65347,65352,65357,65362,65367,65372,65377],{"type":17,"tag":84,"props":65348,"children":65349},{},[65350],{"type":23,"value":65351},"customer records are not stored on Unified infrastructure",{"type":17,"tag":84,"props":65353,"children":65354},{},[65355],{"type":23,"value":65356},"API requests execute directly against source systems",{"type":17,"tag":84,"props":65358,"children":65359},{},[65360],{"type":23,"value":65361},"operational metadata is encrypted (AES-256)",{"type":17,"tag":84,"props":65363,"children":65364},{},[65365],{"type":23,"value":65366},"all data transmission uses TLS 1.2+",{"type":17,"tag":84,"props":65368,"children":65369},{},[65370],{"type":23,"value":65371},"regional infrastructure supports data residency requirements",{"type":17,"tag":84,"props":65373,"children":65374},{},[65375],{"type":23,"value":65376},"OAuth credentials can be stored in customer-controlled secrets managers",{"type":17,"tag":84,"props":65378,"children":65379},{},[65380],{"type":23,"value":65381},"centralized observability for API calls and webhooks",{"type":17,"tag":29,"props":65383,"children":65384},{},[65385],{"type":23,"value":65386},"Unified supports major compliance frameworks including SOC 2, GDPR, HIPAA, CCPA, and PIPEDA.",{"type":17,"tag":29,"props":65388,"children":65389},{},[65390],{"type":23,"value":65391},"By avoiding data replication, the platform reduces compliance scope while maintaining real-time data access.",{"type":17,"tag":68,"props":65393,"children":65395},{"id":65394},"compliance-checklist-for-saas-integration-teams",[65396],{"type":23,"value":65397},"Compliance checklist for SaaS integration teams",{"type":17,"tag":80,"props":65399,"children":65400},{},[65401,65406,65411,65416,65421,65426,65431,65436,65441,65446],{"type":17,"tag":84,"props":65402,"children":65403},{},[65404],{"type":23,"value":65405},"Map data flows across all integrations",{"type":17,"tag":84,"props":65407,"children":65408},{},[65409],{"type":23,"value":65410},"Classify sensitive and regulated data",{"type":17,"tag":84,"props":65412,"children":65413},{},[65414],{"type":23,"value":65415},"Minimize fields and API scopes",{"type":17,"tag":84,"props":65417,"children":65418},{},[65419],{"type":23,"value":65420},"Encrypt all data in transit and metadata at rest",{"type":17,"tag":84,"props":65422,"children":65423},{},[65424],{"type":23,"value":65425},"Centralize audit logging and monitoring",{"type":17,"tag":84,"props":65427,"children":65428},{},[65429],{"type":23,"value":65430},"Automate deletion, correction, and opt-out workflows",{"type":17,"tag":84,"props":65432,"children":65433},{},[65434],{"type":23,"value":65435},"Review vendor security practices and contracts",{"type":17,"tag":84,"props":65437,"children":65438},{},[65439],{"type":23,"value":65440},"Reduce replicated data across systems",{"type":17,"tag":84,"props":65442,"children":65443},{},[65444],{"type":23,"value":65445},"Test deletion and correction propagation",{"type":17,"tag":84,"props":65447,"children":65448},{},[65449],{"type":23,"value":65450},"Enforce region-aware data routing where required",{"type":17,"tag":68,"props":65452,"children":65453},{"id":7672},[65454],{"type":23,"value":7675},{"type":17,"tag":80,"props":65456,"children":65457},{},[65458,65463,65468,65473,65478,65483,65488],{"type":17,"tag":84,"props":65459,"children":65460},{},[65461],{"type":23,"value":65462},"Integration architecture directly determines compliance complexity",{"type":17,"tag":84,"props":65464,"children":65465},{},[65466],{"type":23,"value":65467},"Replicated data increases audit scope, risk, and operational overhead",{"type":17,"tag":84,"props":65469,"children":65470},{},[65471],{"type":23,"value":65472},"Most compliance frameworks share the same core technical controls",{"type":17,"tag":84,"props":65474,"children":65475},{},[65476],{"type":23,"value":65477},"Automating privacy workflows is critical for scalability",{"type":17,"tag":84,"props":65479,"children":65480},{},[65481],{"type":23,"value":65482},"Reducing stored data simplifies audits and security requirements",{"type":17,"tag":84,"props":65484,"children":65485},{},[65486],{"type":23,"value":65487},"Real-time, pass-through architectures minimize compliance surface area",{"type":17,"tag":84,"props":65489,"children":65490},{},[65491],{"type":23,"value":65492},"Choosing the right integration architecture early reduces long-term risk",{"type":17,"tag":29,"props":65494,"children":65495},{},[65496],{"type":17,"tag":133,"props":65497,"children":65499},{"href":1612,"rel":65498},[214],[65500],{"type":23,"value":44481},{"type":17,"tag":29,"props":65502,"children":65503},{},[65504],{"type":17,"tag":133,"props":65505,"children":65507},{"href":1623,"rel":65506},[214],[65508],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":65510},[65511,65512,65519,65520,65521,65531,65532,65533,65534,65535],{"id":64497,"depth":1629,"text":64500},{"id":64596,"depth":1629,"text":64599,"children":65513},[65514,65515,65516,65517,65518],{"id":64602,"depth":1635,"text":63410},{"id":64617,"depth":1635,"text":63416},{"id":64659,"depth":1635,"text":63422},{"id":64702,"depth":1635,"text":64705},{"id":64769,"depth":1635,"text":63434},{"id":64812,"depth":1629,"text":64815},{"id":64978,"depth":1629,"text":64981},{"id":65110,"depth":1629,"text":65113,"children":65522},[65523,65524,65525,65526,65527,65528,65529,65530],{"id":65121,"depth":1635,"text":65124},{"id":65132,"depth":1635,"text":65135},{"id":65143,"depth":1635,"text":65146},{"id":65154,"depth":1635,"text":65157},{"id":65165,"depth":1635,"text":65168},{"id":65176,"depth":1635,"text":65179},{"id":65187,"depth":1635,"text":65190},{"id":65198,"depth":1635,"text":65201},{"id":65209,"depth":1629,"text":65212},{"id":65263,"depth":1629,"text":65266},{"id":65330,"depth":1629,"text":65333},{"id":65394,"depth":1629,"text":65397},{"id":7672,"depth":1629,"text":7675},"content:blog:how_to_design_saas_integrations_that_meet_soc_2_gdpr_hipaa_ccpa_and_pipeda_requirements.md","blog/how_to_design_saas_integrations_that_meet_soc_2_gdpr_hipaa_ccpa_and_pipeda_requirements.md","blog/how_to_design_saas_integrations_that_meet_soc_2_gdpr_hipaa_ccpa_and_pipeda_requirements",{"_path":65540,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":65541,"description":65542,"img":65543,"date":65544,"tag":12,"body":65545,"_type":1677,"_id":65980,"_source":1679,"_file":65981,"_stem":65982,"_extension":1682},"/blog/how_to_build_pipeda_compliant_saas_integrations_for_canadian_data","How to Build PIPEDA-Compliant SaaS Integrations for Canadian Data","If your SaaS product processes personal data about individuals in Canada, your organization remains responsible for that data—even when it is handled by...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_pipeda_compliant_saas_integrations_for_canadian_data-icon.png","2026-03-11T14:48:00.000Z",{"type":14,"children":65546,"toc":65966},[65547,65552,65555,65562,65567,65572,65577,65583,65588,65616,65621,65627,65632,65637,65660,65665,65670,65676,65681,65709,65714,65720,65726,65731,65736,65742,65747,65760,65771,65776,65781,65799,65804,65809,65814,65832,65838,65843,65861,65867,65872,65877,65900,65905,65909,65914,65919,65924,65940,65945,65950,65958],{"type":17,"tag":18,"props":65548,"children":65550},{"id":65549},"how-to-build-pipeda-compliant-saas-integrations-for-canadian-data",[65551],{"type":23,"value":65541},{"type":17,"tag":25,"props":65553,"children":65554},{},[],{"type":17,"tag":29,"props":65556,"children":65557},{},[65558],{"type":17,"tag":33,"props":65559,"children":65560},{},[65561],{"type":23,"value":49465},{"type":17,"tag":29,"props":65563,"children":65564},{},[65565],{"type":23,"value":65566},"PIPEDA compliance is driven by accountability.",{"type":17,"tag":29,"props":65568,"children":65569},{},[65570],{"type":23,"value":65571},"If your SaaS product processes personal data about individuals in Canada, your organization remains responsible for that data—even when it is handled by third-party integrations.",{"type":17,"tag":29,"props":65573,"children":65574},{},[65575],{"type":23,"value":65576},"For integration-heavy products, this means compliance is determined by how data moves across systems, not just how it is stored in your core application.",{"type":17,"tag":68,"props":65578,"children":65580},{"id":65579},"what-matters-for-pipeda-in-integrations",[65581],{"type":23,"value":65582},"What matters for PIPEDA in integrations",{"type":17,"tag":29,"props":65584,"children":65585},{},[65586],{"type":23,"value":65587},"PIPEDA is based on principles rather than prescriptive rules, but several directly impact integration architecture:",{"type":17,"tag":80,"props":65589,"children":65590},{},[65591,65596,65601,65606,65611],{"type":17,"tag":84,"props":65592,"children":65593},{},[65594],{"type":23,"value":65595},"organizations are responsible for all personal data under their control",{"type":17,"tag":84,"props":65597,"children":65598},{},[65599],{"type":23,"value":65600},"data must only be used for clearly defined purposes",{"type":17,"tag":84,"props":65602,"children":65603},{},[65604],{"type":23,"value":65605},"individuals must provide meaningful consent",{"type":17,"tag":84,"props":65607,"children":65608},{},[65609],{"type":23,"value":65610},"access to personal data must be limited and controlled",{"type":17,"tag":84,"props":65612,"children":65613},{},[65614],{"type":23,"value":65615},"organizations must be able to demonstrate compliance",{"type":17,"tag":29,"props":65617,"children":65618},{},[65619],{"type":23,"value":65620},"In practice, this means every integration that processes personal data becomes part of your compliance scope.",{"type":17,"tag":68,"props":65622,"children":65624},{"id":65623},"cross-border-processing-and-processor-accountability",[65625],{"type":23,"value":65626},"Cross-border processing and processor accountability",{"type":17,"tag":29,"props":65628,"children":65629},{},[65630],{"type":23,"value":65631},"PIPEDA does not require Canadian data to remain in Canada.",{"type":17,"tag":29,"props":65633,"children":65634},{},[65635],{"type":23,"value":65636},"However, it imposes strict obligations when data is handled by third parties:",{"type":17,"tag":80,"props":65638,"children":65639},{},[65640,65645,65650,65655],{"type":17,"tag":84,"props":65641,"children":65642},{},[65643],{"type":23,"value":65644},"your organization remains accountable for the data",{"type":17,"tag":84,"props":65646,"children":65647},{},[65648],{"type":23,"value":65649},"processors must provide comparable levels of protection",{"type":17,"tag":84,"props":65651,"children":65652},{},[65653],{"type":23,"value":65654},"contracts must define how data is handled and secured",{"type":17,"tag":84,"props":65656,"children":65657},{},[65658],{"type":23,"value":65659},"users must be informed if data is processed outside Canada",{"type":17,"tag":29,"props":65661,"children":65662},{},[65663],{"type":23,"value":65664},"For SaaS integrations, this means every external system must meet your security and privacy standards.",{"type":17,"tag":29,"props":65666,"children":65667},{},[65668],{"type":23,"value":65669},"The more systems that store or process data, the harder this becomes to manage.",{"type":17,"tag":68,"props":65671,"children":65673},{"id":65672},"where-integrations-create-risk",[65674],{"type":23,"value":65675},"Where integrations create risk",{"type":17,"tag":29,"props":65677,"children":65678},{},[65679],{"type":23,"value":65680},"Integration architecture often introduces hidden compliance issues:",{"type":17,"tag":80,"props":65682,"children":65683},{},[65684,65689,65694,65699,65704],{"type":17,"tag":84,"props":65685,"children":65686},{},[65687],{"type":23,"value":65688},"personal data replicated across multiple systems",{"type":17,"tag":84,"props":65690,"children":65691},{},[65692],{"type":23,"value":65693},"unclear ownership of data between vendors",{"type":17,"tag":84,"props":65695,"children":65696},{},[65697],{"type":23,"value":65698},"inconsistent retention policies",{"type":17,"tag":84,"props":65700,"children":65701},{},[65702],{"type":23,"value":65703},"limited visibility into where data is processed",{"type":17,"tag":84,"props":65705,"children":65706},{},[65707],{"type":23,"value":65708},"difficulty fulfilling access or correction requests",{"type":17,"tag":29,"props":65710,"children":65711},{},[65712],{"type":23,"value":65713},"These issues are not caused by PIPEDA itself—they come from how integrations are designed.",{"type":17,"tag":68,"props":65715,"children":65717},{"id":65716},"core-controls-for-pipeda-compliant-integrations",[65718],{"type":23,"value":65719},"Core controls for PIPEDA-compliant integrations",{"type":17,"tag":239,"props":65721,"children":65723},{"id":65722},"purpose-limitation",[65724],{"type":23,"value":65725},"Purpose limitation",{"type":17,"tag":29,"props":65727,"children":65728},{},[65729],{"type":23,"value":65730},"Each integration should have a clearly defined purpose.",{"type":17,"tag":29,"props":65732,"children":65733},{},[65734],{"type":23,"value":65735},"Data should not be sent to external systems unless it directly supports that purpose.",{"type":17,"tag":239,"props":65737,"children":65739},{"id":65738},"consent-and-transparency",[65740],{"type":23,"value":65741},"Consent and transparency",{"type":17,"tag":29,"props":65743,"children":65744},{},[65745],{"type":23,"value":65746},"Users must understand:",{"type":17,"tag":80,"props":65748,"children":65749},{},[65750,65755],{"type":17,"tag":84,"props":65751,"children":65752},{},[65753],{"type":23,"value":65754},"which systems receive their data",{"type":17,"tag":84,"props":65756,"children":65757},{},[65758],{"type":23,"value":65759},"why the data is being shared",{"type":17,"tag":29,"props":65761,"children":65762},{},[65763,65765,65769],{"type":23,"value":65764},"Authorization flows (such as ",{"type":17,"tag":133,"props":65766,"children":65767},{"href":779},[65768],{"type":23,"value":782},{"type":23,"value":65770},") should clearly reflect this.",{"type":17,"tag":239,"props":65772,"children":65774},{"id":65773},"least-privilege-access",[65775],{"type":23,"value":64855},{"type":17,"tag":29,"props":65777,"children":65778},{},[65779],{"type":23,"value":65780},"Integrations should only access the data they require.",{"type":17,"tag":80,"props":65782,"children":65783},{},[65784,65789,65794],{"type":17,"tag":84,"props":65785,"children":65786},{},[65787],{"type":23,"value":65788},"scoped API permissions",{"type":17,"tag":84,"props":65790,"children":65791},{},[65792],{"type":23,"value":65793},"tenant-level isolation",{"type":17,"tag":84,"props":65795,"children":65796},{},[65797],{"type":23,"value":65798},"restricted administrative access",{"type":17,"tag":239,"props":65800,"children":65802},{"id":65801},"logging-and-auditability",[65803],{"type":23,"value":64890},{"type":17,"tag":29,"props":65805,"children":65806},{},[65807],{"type":23,"value":65808},"You must be able to demonstrate how data is handled.",{"type":17,"tag":29,"props":65810,"children":65811},{},[65812],{"type":23,"value":65813},"Integration systems should log:",{"type":17,"tag":80,"props":65815,"children":65816},{},[65817,65822,65827],{"type":17,"tag":84,"props":65818,"children":65819},{},[65820],{"type":23,"value":65821},"who accessed data",{"type":17,"tag":84,"props":65823,"children":65824},{},[65825],{"type":23,"value":65826},"when access occurred",{"type":17,"tag":84,"props":65828,"children":65829},{},[65830],{"type":23,"value":65831},"which systems processed it",{"type":17,"tag":239,"props":65833,"children":65835},{"id":65834},"vendor-controls",[65836],{"type":23,"value":65837},"Vendor controls",{"type":17,"tag":29,"props":65839,"children":65840},{},[65841],{"type":23,"value":65842},"Every integration partner must be evaluated.",{"type":17,"tag":80,"props":65844,"children":65845},{},[65846,65851,65856],{"type":17,"tag":84,"props":65847,"children":65848},{},[65849],{"type":23,"value":65850},"security certifications (SOC 2, ISO 27001)",{"type":17,"tag":84,"props":65852,"children":65853},{},[65854],{"type":23,"value":65855},"breach response processes",{"type":17,"tag":84,"props":65857,"children":65858},{},[65859],{"type":23,"value":65860},"contractual data protection obligations",{"type":17,"tag":68,"props":65862,"children":65864},{"id":65863},"why-reducing-stored-data-simplifies-compliance",[65865],{"type":23,"value":65866},"Why reducing stored data simplifies compliance",{"type":17,"tag":29,"props":65868,"children":65869},{},[65870],{"type":23,"value":65871},"The largest source of PIPEDA complexity is data replication.",{"type":17,"tag":29,"props":65873,"children":65874},{},[65875],{"type":23,"value":65876},"When integration platforms copy customer data into their own systems:",{"type":17,"tag":80,"props":65878,"children":65879},{},[65880,65885,65890,65895],{"type":17,"tag":84,"props":65881,"children":65882},{},[65883],{"type":23,"value":65884},"more vendors handle personal data",{"type":17,"tag":84,"props":65886,"children":65887},{},[65888],{"type":23,"value":65889},"more systems must meet compliance requirements",{"type":17,"tag":84,"props":65891,"children":65892},{},[65893],{"type":23,"value":65894},"deletion and correction become harder",{"type":17,"tag":84,"props":65896,"children":65897},{},[65898],{"type":23,"value":65899},"breach exposure increases",{"type":17,"tag":29,"props":65901,"children":65902},{},[65903],{"type":23,"value":65904},"Reducing the number of systems that store data reduces the number of systems you must audit and control.",{"type":17,"tag":68,"props":65906,"children":65907},{"id":45643},[65908],{"type":23,"value":45646},{"type":17,"tag":29,"props":65910,"children":65911},{},[65912],{"type":23,"value":65913},"PIPEDA compliance is not about where data is stored—it is about who is responsible for it.",{"type":17,"tag":29,"props":65915,"children":65916},{},[65917],{"type":23,"value":65918},"Every integration expands that responsibility.",{"type":17,"tag":29,"props":65920,"children":65921},{},[65922],{"type":23,"value":65923},"Architectures that replicate data across systems increase:",{"type":17,"tag":80,"props":65925,"children":65926},{},[65927,65931,65935],{"type":17,"tag":84,"props":65928,"children":65929},{},[65930],{"type":23,"value":9406},{"type":17,"tag":84,"props":65932,"children":65933},{},[65934],{"type":23,"value":10303},{"type":17,"tag":84,"props":65936,"children":65937},{},[65938],{"type":23,"value":65939},"operational overhead",{"type":17,"tag":29,"props":65941,"children":65942},{},[65943],{"type":23,"value":65944},"Architectures that minimize storage and keep data closer to the source reduce the number of systems you are accountable for.",{"type":17,"tag":29,"props":65946,"children":65947},{},[65948],{"type":23,"value":65949},"That makes PIPEDA compliance easier to maintain as your integrations scale.",{"type":17,"tag":29,"props":65951,"children":65952},{},[65953],{"type":17,"tag":133,"props":65954,"children":65956},{"href":1612,"rel":65955},[214],[65957],{"type":23,"value":44481},{"type":17,"tag":29,"props":65959,"children":65960},{},[65961],{"type":17,"tag":133,"props":65962,"children":65964},{"href":1623,"rel":65963},[214],[65965],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":65967},[65968,65969,65970,65971,65978,65979],{"id":65579,"depth":1629,"text":65582},{"id":65623,"depth":1629,"text":65626},{"id":65672,"depth":1629,"text":65675},{"id":65716,"depth":1629,"text":65719,"children":65972},[65973,65974,65975,65976,65977],{"id":65722,"depth":1635,"text":65725},{"id":65738,"depth":1635,"text":65741},{"id":65773,"depth":1635,"text":64855},{"id":65801,"depth":1635,"text":64890},{"id":65834,"depth":1635,"text":65837},{"id":65863,"depth":1629,"text":65866},{"id":45643,"depth":1629,"text":45646},"content:blog:how_to_build_pipeda_compliant_saas_integrations_for_canadian_data.md","blog/how_to_build_pipeda_compliant_saas_integrations_for_canadian_data.md","blog/how_to_build_pipeda_compliant_saas_integrations_for_canadian_data",{"_path":65984,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":65985,"description":65986,"img":65987,"date":65988,"tag":12,"body":65989,"_type":1677,"_id":67210,"_source":1679,"_file":67211,"_stem":67212,"_extension":1682},"/blog/how_to_design_ccpa_compliant_saas_integrations","How to Design CCPA-Compliant SaaS Integrations","The California Consumer Privacy Act (CCPA) and its expansion under the California Privacy Rights Act (CPRA) fundamentally changed how SaaS companies must...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_design_ccpa_compliant_saas_integrations-icon.png","2026-03-11T01:48:00.000Z",{"type":14,"children":65990,"toc":67179},[65991,65996,65999,66006,66024,66029,66056,66067,66072,66077,66105,66111,66116,66121,66127,66132,66191,66196,66231,66236,66241,66247,66252,66288,66300,66305,66332,66342,66348,66353,66358,66370,66374,66379,66397,66402,66406,66417,66421,66439,66444,66450,66455,66462,66475,66482,66495,66507,66513,66518,66523,66551,66556,66562,66567,66573,66578,66583,66611,66616,66622,66633,66638,66661,66666,66672,66677,66694,66699,66704,66710,66720,66725,66758,66763,66769,66774,66797,66802,66808,66818,66823,66828,66851,66856,66861,66867,66877,66887,66892,66915,66920,66926,66937,66941,66997,67002,67007,67026,67032,67037,67043,67048,67053,67059,67064,67070,67075,67081,67086,67092,67097,67101,67106,67111,67123,67146,67158,67163,67171],{"type":17,"tag":18,"props":65992,"children":65994},{"id":65993},"how-to-design-ccpa-compliant-saas-integrations",[65995],{"type":23,"value":65985},{"type":17,"tag":25,"props":65997,"children":65998},{},[],{"type":17,"tag":29,"props":66000,"children":66001},{},[66002],{"type":17,"tag":33,"props":66003,"children":66004},{},[66005],{"type":23,"value":49465},{"type":17,"tag":29,"props":66007,"children":66008},{},[66009,66010,66015,66017,66022],{"type":23,"value":6712},{"type":17,"tag":48,"props":66011,"children":66012},{},[66013],{"type":23,"value":66014},"California Consumer Privacy Act (CCPA)",{"type":23,"value":66016}," and its expansion under the ",{"type":17,"tag":48,"props":66018,"children":66019},{},[66020],{"type":23,"value":66021},"California Privacy Rights Act (CPRA)",{"type":23,"value":66023}," fundamentally changed how SaaS companies must handle personal data.",{"type":17,"tag":29,"props":66025,"children":66026},{},[66027],{"type":23,"value":66028},"For companies building integrations between SaaS applications, the law introduces new responsibilities around:",{"type":17,"tag":80,"props":66030,"children":66031},{},[66032,66036,66041,66046,66051],{"type":17,"tag":84,"props":66033,"children":66034},{},[66035],{"type":23,"value":63958},{"type":17,"tag":84,"props":66037,"children":66038},{},[66039],{"type":23,"value":66040},"consumer deletion rights",{"type":17,"tag":84,"props":66042,"children":66043},{},[66044],{"type":23,"value":66045},"opt-out of data sharing",{"type":17,"tag":84,"props":66047,"children":66048},{},[66049],{"type":23,"value":66050},"vendor and service-provider contracts",{"type":17,"tag":84,"props":66052,"children":66053},{},[66054],{"type":23,"value":66055},"transparency around data flows",{"type":17,"tag":29,"props":66057,"children":66058},{},[66059,66061,66066],{"type":23,"value":66060},"These requirements affect not just your application, but also ",{"type":17,"tag":48,"props":66062,"children":66063},{},[66064],{"type":23,"value":66065},"how your integration architecture is designed",{"type":23,"value":54},{"type":17,"tag":29,"props":66068,"children":66069},{},[66070],{"type":23,"value":66071},"Many SaaS companies discover that their integration infrastructure — especially systems that replicate or store customer data — becomes the hardest part of staying compliant.",{"type":17,"tag":29,"props":66073,"children":66074},{},[66075],{"type":23,"value":66076},"This guide explains:",{"type":17,"tag":80,"props":66078,"children":66079},{},[66080,66090,66095],{"type":17,"tag":84,"props":66081,"children":66082},{},[66083,66085],{"type":23,"value":66084},"the core architectural principles behind ",{"type":17,"tag":48,"props":66086,"children":66087},{},[66088],{"type":23,"value":66089},"CCPA-compliant SaaS integrations",{"type":17,"tag":84,"props":66091,"children":66092},{},[66093],{"type":23,"value":66094},"the technical patterns teams use to implement them",{"type":17,"tag":84,"props":66096,"children":66097},{},[66098,66100],{"type":23,"value":66099},"how modern ",{"type":17,"tag":48,"props":66101,"children":66102},{},[66103],{"type":23,"value":66104},"real-time integration architectures simplify compliance",{"type":17,"tag":68,"props":66106,"children":66108},{"id":66107},"what-ccpa-requires-from-saas-platforms",[66109],{"type":23,"value":66110},"What CCPA Requires from SaaS Platforms",{"type":17,"tag":29,"props":66112,"children":66113},{},[66114],{"type":23,"value":66115},"The CCPA grants California residents several important rights over their personal information.",{"type":17,"tag":29,"props":66117,"children":66118},{},[66119],{"type":23,"value":66120},"SaaS platforms must design their systems to support these rights.",{"type":17,"tag":239,"props":66122,"children":66124},{"id":66123},"core-consumer-rights-under-ccpa",[66125],{"type":23,"value":66126},"Core consumer rights under CCPA",{"type":17,"tag":29,"props":66128,"children":66129},{},[66130],{"type":23,"value":66131},"SaaS systems must support workflows for the following:",{"type":17,"tag":80,"props":66133,"children":66134},{},[66135,66145,66155,66165,66173,66181],{"type":17,"tag":84,"props":66136,"children":66137},{},[66138,66143],{"type":17,"tag":48,"props":66139,"children":66140},{},[66141],{"type":23,"value":66142},"Right to know",{"type":23,"value":66144}," what personal data is collected and how it is used",{"type":17,"tag":84,"props":66146,"children":66147},{},[66148,66153],{"type":17,"tag":48,"props":66149,"children":66150},{},[66151],{"type":23,"value":66152},"Right to delete",{"type":23,"value":66154}," personal data upon request",{"type":17,"tag":84,"props":66156,"children":66157},{},[66158,66163],{"type":17,"tag":48,"props":66159,"children":66160},{},[66161],{"type":23,"value":66162},"Right to correct",{"type":23,"value":66164}," inaccurate personal information",{"type":17,"tag":84,"props":66166,"children":66167},{},[66168],{"type":17,"tag":48,"props":66169,"children":66170},{},[66171],{"type":23,"value":66172},"Right to opt-out of sale or sharing of personal data",{"type":17,"tag":84,"props":66174,"children":66175},{},[66176],{"type":17,"tag":48,"props":66177,"children":66178},{},[66179],{"type":23,"value":66180},"Right to limit the use of sensitive personal information",{"type":17,"tag":84,"props":66182,"children":66183},{},[66184,66189],{"type":17,"tag":48,"props":66185,"children":66186},{},[66187],{"type":23,"value":66188},"Right to non-discrimination",{"type":23,"value":66190}," for exercising privacy rights",{"type":17,"tag":29,"props":66192,"children":66193},{},[66194],{"type":23,"value":66195},"Under CPRA updates, additional obligations include:",{"type":17,"tag":80,"props":66197,"children":66198},{},[66199,66211,66221],{"type":17,"tag":84,"props":66200,"children":66201},{},[66202,66204,66209],{"type":23,"value":66203},"recognizing ",{"type":17,"tag":48,"props":66205,"children":66206},{},[66207],{"type":23,"value":66208},"Global Privacy Control (GPC)",{"type":23,"value":66210}," signals",{"type":17,"tag":84,"props":66212,"children":66213},{},[66214,66216],{"type":23,"value":66215},"supporting ",{"type":17,"tag":48,"props":66217,"children":66218},{},[66219],{"type":23,"value":66220},"automated decision-making opt-out",{"type":17,"tag":84,"props":66222,"children":66223},{},[66224,66226],{"type":23,"value":66225},"managing ",{"type":17,"tag":48,"props":66227,"children":66228},{},[66229],{"type":23,"value":66230},"sensitive personal information classifications",{"type":17,"tag":29,"props":66232,"children":66233},{},[66234],{"type":23,"value":66235},"If your SaaS platform integrates with multiple third-party systems, every one of those systems becomes part of the compliance surface.",{"type":17,"tag":29,"props":66237,"children":66238},{},[66239],{"type":23,"value":66240},"That is where architecture becomes critical.",{"type":17,"tag":68,"props":66242,"children":66244},{"id":66243},"why-integration-architecture-matters-for-ccpa-compliance",[66245],{"type":23,"value":66246},"Why Integration Architecture Matters for CCPA Compliance",{"type":17,"tag":29,"props":66248,"children":66249},{},[66250],{"type":23,"value":66251},"Most SaaS platforms today rely on integrations with dozens of other applications:",{"type":17,"tag":80,"props":66253,"children":66254},{},[66255,66259,66264,66268,66273,66278,66283],{"type":17,"tag":84,"props":66256,"children":66257},{},[66258],{"type":23,"value":88},{"type":17,"tag":84,"props":66260,"children":66261},{},[66262],{"type":23,"value":66263},"support tools",{"type":17,"tag":84,"props":66265,"children":66266},{},[66267],{"type":23,"value":108},{"type":17,"tag":84,"props":66269,"children":66270},{},[66271],{"type":23,"value":66272},"marketing software",{"type":17,"tag":84,"props":66274,"children":66275},{},[66276],{"type":23,"value":66277},"messaging platforms",{"type":17,"tag":84,"props":66279,"children":66280},{},[66281],{"type":23,"value":66282},"payment systems",{"type":17,"tag":84,"props":66284,"children":66285},{},[66286],{"type":23,"value":66287},"internal productivity tools",{"type":17,"tag":29,"props":66289,"children":66290},{},[66291,66293,66298],{"type":23,"value":66292},"Each integration creates a ",{"type":17,"tag":48,"props":66294,"children":66295},{},[66296],{"type":23,"value":66297},"new data flow path",{"type":23,"value":66299}," where personal information may travel.",{"type":17,"tag":29,"props":66301,"children":66302},{},[66303],{"type":23,"value":66304},"Poor integration architecture can introduce several compliance risks:",{"type":17,"tag":80,"props":66306,"children":66307},{},[66308,66312,66317,66322,66327],{"type":17,"tag":84,"props":66309,"children":66310},{},[66311],{"type":23,"value":65688},{"type":17,"tag":84,"props":66313,"children":66314},{},[66315],{"type":23,"value":66316},"difficulty deleting consumer records everywhere",{"type":17,"tag":84,"props":66318,"children":66319},{},[66320],{"type":23,"value":66321},"vendors gaining access to unnecessary data",{"type":17,"tag":84,"props":66323,"children":66324},{},[66325],{"type":23,"value":66326},"inconsistent opt-out enforcement",{"type":17,"tag":84,"props":66328,"children":66329},{},[66330],{"type":23,"value":66331},"lack of visibility into where personal information resides",{"type":17,"tag":29,"props":66333,"children":66334},{},[66335,66337],{"type":23,"value":66336},"CCPA compliance therefore requires ",{"type":17,"tag":48,"props":66338,"children":66339},{},[66340],{"type":23,"value":66341},"designing integrations with privacy controls built into the architecture itself.",{"type":17,"tag":68,"props":66343,"children":66345},{"id":66344},"core-architecture-principles-for-ccpa-compliant-integrations",[66346],{"type":23,"value":66347},"Core Architecture Principles for CCPA-Compliant Integrations",{"type":17,"tag":29,"props":66349,"children":66350},{},[66351],{"type":23,"value":66352},"Several technical design principles consistently appear in privacy-compliant SaaS architectures.",{"type":17,"tag":239,"props":66354,"children":66356},{"id":66355},"data-minimization",[66357],{"type":23,"value":64924},{"type":17,"tag":29,"props":66359,"children":66360},{},[66361,66363,66368],{"type":23,"value":66362},"Only transmit the ",{"type":17,"tag":48,"props":66364,"children":66365},{},[66366],{"type":23,"value":66367},"minimum amount of personal data required",{"type":23,"value":66369}," for the integration to function.",{"type":17,"tag":29,"props":66371,"children":66372},{},[66373],{"type":23,"value":3258},{"type":17,"tag":29,"props":66375,"children":66376},{},[66377],{"type":23,"value":66378},"Instead of sending full user profiles to every tool, integrations should send only required fields such as:",{"type":17,"tag":80,"props":66380,"children":66381},{},[66382,66387,66392],{"type":17,"tag":84,"props":66383,"children":66384},{},[66385],{"type":23,"value":66386},"internal identifiers",{"type":17,"tag":84,"props":66388,"children":66389},{},[66390],{"type":23,"value":66391},"anonymized tokens",{"type":17,"tag":84,"props":66393,"children":66394},{},[66395],{"type":23,"value":66396},"limited contact metadata",{"type":17,"tag":29,"props":66398,"children":66399},{},[66400],{"type":23,"value":66401},"Reducing data exposure significantly lowers compliance risk.",{"type":17,"tag":239,"props":66403,"children":66404},{"id":65722},[66405],{"type":23,"value":65725},{"type":17,"tag":29,"props":66407,"children":66408},{},[66409,66411,66416],{"type":23,"value":66410},"Every integration must have a ",{"type":17,"tag":48,"props":66412,"children":66413},{},[66414],{"type":23,"value":66415},"clearly defined business purpose",{"type":23,"value":54},{"type":17,"tag":29,"props":66418,"children":66419},{},[66420],{"type":23,"value":3258},{"type":17,"tag":80,"props":66422,"children":66423},{},[66424,66429,66434],{"type":17,"tag":84,"props":66425,"children":66426},{},[66427],{"type":23,"value":66428},"sending support tickets to a helpdesk platform",{"type":17,"tag":84,"props":66430,"children":66431},{},[66432],{"type":23,"value":66433},"syncing invoices with accounting software",{"type":17,"tag":84,"props":66435,"children":66436},{},[66437],{"type":23,"value":66438},"updating contact status in a CRM",{"type":17,"tag":29,"props":66440,"children":66441},{},[66442],{"type":23,"value":66443},"Data should never be shared with vendors for undefined or secondary purposes.",{"type":17,"tag":239,"props":66445,"children":66447},{"id":66446},"vendor-classification-service-provider-vs-third-party",[66448],{"type":23,"value":66449},"Vendor classification: service provider vs third party",{"type":17,"tag":29,"props":66451,"children":66452},{},[66453],{"type":23,"value":66454},"Under CCPA, vendors fall into two categories:",{"type":17,"tag":29,"props":66456,"children":66457},{},[66458],{"type":17,"tag":48,"props":66459,"children":66460},{},[66461],{"type":23,"value":64749},{"type":17,"tag":80,"props":66463,"children":66464},{},[66465,66470],{"type":17,"tag":84,"props":66466,"children":66467},{},[66468],{"type":23,"value":66469},"process data strictly on behalf of your business",{"type":17,"tag":84,"props":66471,"children":66472},{},[66473],{"type":23,"value":66474},"cannot use data for their own purposes",{"type":17,"tag":29,"props":66476,"children":66477},{},[66478],{"type":17,"tag":48,"props":66479,"children":66480},{},[66481],{"type":23,"value":64759},{"type":17,"tag":80,"props":66483,"children":66484},{},[66485,66490],{"type":17,"tag":84,"props":66486,"children":66487},{},[66488],{"type":23,"value":66489},"may use the data independently",{"type":17,"tag":84,"props":66491,"children":66492},{},[66493],{"type":23,"value":66494},"trigger opt-out requirements",{"type":17,"tag":29,"props":66496,"children":66497},{},[66498,66500,66505],{"type":23,"value":66499},"When building integrations, this classification determines whether you must provide a ",{"type":17,"tag":48,"props":66501,"children":66502},{},[66503],{"type":23,"value":66504},"'Do Not Sell or Share My Personal Information'",{"type":23,"value":66506}," mechanism.",{"type":17,"tag":239,"props":66508,"children":66510},{"id":66509},"contractual-protections",[66511],{"type":23,"value":66512},"Contractual protections",{"type":17,"tag":29,"props":66514,"children":66515},{},[66516],{"type":23,"value":66517},"CCPA requires strict contractual terms with service providers.",{"type":17,"tag":29,"props":66519,"children":66520},{},[66521],{"type":23,"value":66522},"Integration contracts must:",{"type":17,"tag":80,"props":66524,"children":66525},{},[66526,66531,66536,66541,66546],{"type":17,"tag":84,"props":66527,"children":66528},{},[66529],{"type":23,"value":66530},"prohibit selling or sharing personal information",{"type":17,"tag":84,"props":66532,"children":66533},{},[66534],{"type":23,"value":66535},"restrict use of data to defined business purposes",{"type":17,"tag":84,"props":66537,"children":66538},{},[66539],{"type":23,"value":66540},"require compliance with privacy regulations",{"type":17,"tag":84,"props":66542,"children":66543},{},[66544],{"type":23,"value":66545},"require cooperation with deletion and correction requests",{"type":17,"tag":84,"props":66547,"children":66548},{},[66549],{"type":23,"value":66550},"allow auditing of vendor practices",{"type":17,"tag":29,"props":66552,"children":66553},{},[66554],{"type":23,"value":66555},"These contractual controls must be reflected in how integrations operate technically.",{"type":17,"tag":68,"props":66557,"children":66559},{"id":66558},"designing-ccpa-compliant-saas-integration-architecture",[66560],{"type":23,"value":66561},"Designing CCPA-Compliant SaaS Integration Architecture",{"type":17,"tag":29,"props":66563,"children":66564},{},[66565],{"type":23,"value":66566},"Beyond policy and contracts, the architecture itself must support privacy operations.",{"type":17,"tag":239,"props":66568,"children":66570},{"id":66569},"build-a-centralized-privacy-orchestration-layer",[66571],{"type":23,"value":66572},"Build a centralized privacy orchestration layer",{"type":17,"tag":29,"props":66574,"children":66575},{},[66576],{"type":23,"value":66577},"A privacy orchestration system should sit between your application and all integrations.",{"type":17,"tag":29,"props":66579,"children":66580},{},[66581],{"type":23,"value":66582},"This layer handles:",{"type":17,"tag":80,"props":66584,"children":66585},{},[66586,66591,66596,66601,66606],{"type":17,"tag":84,"props":66587,"children":66588},{},[66589],{"type":23,"value":66590},"data classification",{"type":17,"tag":84,"props":66592,"children":66593},{},[66594],{"type":23,"value":66595},"consent management",{"type":17,"tag":84,"props":66597,"children":66598},{},[66599],{"type":23,"value":66600},"opt-out enforcement",{"type":17,"tag":84,"props":66602,"children":66603},{},[66604],{"type":23,"value":66605},"deletion propagation",{"type":17,"tag":84,"props":66607,"children":66608},{},[66609],{"type":23,"value":66610},"vendor request routing",{"type":17,"tag":29,"props":66612,"children":66613},{},[66614],{"type":23,"value":66615},"When a consumer requests deletion, this system can automatically trigger removal across every integrated platform.",{"type":17,"tag":239,"props":66617,"children":66619},{"id":66618},"map-all-personal-data-flows",[66620],{"type":23,"value":66621},"Map all personal data flows",{"type":17,"tag":29,"props":66623,"children":66624},{},[66625,66627,66632],{"type":23,"value":66626},"CCPA compliance requires knowing ",{"type":17,"tag":48,"props":66628,"children":66629},{},[66630],{"type":23,"value":66631},"exactly where personal data travels",{"type":23,"value":54},{"type":17,"tag":29,"props":66634,"children":66635},{},[66636],{"type":23,"value":66637},"Create data flow diagrams that identify:",{"type":17,"tag":80,"props":66639,"children":66640},{},[66641,66646,66651,66656],{"type":17,"tag":84,"props":66642,"children":66643},{},[66644],{"type":23,"value":66645},"which systems collect personal data",{"type":17,"tag":84,"props":66647,"children":66648},{},[66649],{"type":23,"value":66650},"where data is transmitted",{"type":17,"tag":84,"props":66652,"children":66653},{},[66654],{"type":23,"value":66655},"which vendors store or process it",{"type":17,"tag":84,"props":66657,"children":66658},{},[66659],{"type":23,"value":66660},"how long data is retained",{"type":17,"tag":29,"props":66662,"children":66663},{},[66664],{"type":23,"value":66665},"Without this visibility, fulfilling deletion or correction requests becomes extremely difficult.",{"type":17,"tag":239,"props":66667,"children":66669},{"id":66668},"support-automated-consumer-request-workflows",[66670],{"type":23,"value":66671},"Support automated consumer request workflows",{"type":17,"tag":29,"props":66673,"children":66674},{},[66675],{"type":23,"value":66676},"Integration architecture must support automated handling of:",{"type":17,"tag":80,"props":66678,"children":66679},{},[66680,66684,66689],{"type":17,"tag":84,"props":66681,"children":66682},{},[66683],{"type":23,"value":64723},{"type":17,"tag":84,"props":66685,"children":66686},{},[66687],{"type":23,"value":66688},"correction requests",{"type":17,"tag":84,"props":66690,"children":66691},{},[66692],{"type":23,"value":66693},"opt-out signals",{"type":17,"tag":29,"props":66695,"children":66696},{},[66697],{"type":23,"value":66698},"These requests must propagate to every integrated service that holds the consumer's data.",{"type":17,"tag":29,"props":66700,"children":66701},{},[66702],{"type":23,"value":66703},"Automation is critical because manual processes quickly break down as integrations scale.",{"type":17,"tag":239,"props":66705,"children":66707},{"id":66706},"implement-strong-security-controls",[66708],{"type":23,"value":66709},"Implement strong security controls",{"type":17,"tag":29,"props":66711,"children":66712},{},[66713,66715],{"type":23,"value":66714},"CCPA requires organizations to maintain ",{"type":17,"tag":48,"props":66716,"children":66717},{},[66718],{"type":23,"value":66719},"'reasonable security practices.'",{"type":17,"tag":29,"props":66721,"children":66722},{},[66723],{"type":23,"value":66724},"Typical safeguards include:",{"type":17,"tag":80,"props":66726,"children":66727},{},[66728,66733,66738,66743,66748,66753],{"type":17,"tag":84,"props":66729,"children":66730},{},[66731],{"type":23,"value":66732},"TLS encryption for API communication",{"type":17,"tag":84,"props":66734,"children":66735},{},[66736],{"type":23,"value":66737},"AES-256 encryption for stored data",{"type":17,"tag":84,"props":66739,"children":66740},{},[66741],{"type":23,"value":66742},"role-based access control (RBAC)",{"type":17,"tag":84,"props":66744,"children":66745},{},[66746],{"type":23,"value":66747},"multi-factor authentication",{"type":17,"tag":84,"props":66749,"children":66750},{},[66751],{"type":23,"value":66752},"centralized logging and monitoring",{"type":17,"tag":84,"props":66754,"children":66755},{},[66756],{"type":23,"value":66757},"network segmentation",{"type":17,"tag":29,"props":66759,"children":66760},{},[66761],{"type":23,"value":66762},"Security failures can trigger significant regulatory penalties.",{"type":17,"tag":239,"props":66764,"children":66766},{"id":66765},"maintain-detailed-audit-logs",[66767],{"type":23,"value":66768},"Maintain detailed audit logs",{"type":17,"tag":29,"props":66770,"children":66771},{},[66772],{"type":23,"value":66773},"Every integration interaction should generate logs capturing:",{"type":17,"tag":80,"props":66775,"children":66776},{},[66777,66782,66787,66792],{"type":17,"tag":84,"props":66778,"children":66779},{},[66780],{"type":23,"value":66781},"user or system identity",{"type":17,"tag":84,"props":66783,"children":66784},{},[66785],{"type":23,"value":66786},"time of access",{"type":17,"tag":84,"props":66788,"children":66789},{},[66790],{"type":23,"value":66791},"API endpoint accessed",{"type":17,"tag":84,"props":66793,"children":66794},{},[66795],{"type":23,"value":66796},"result of the request",{"type":17,"tag":29,"props":66798,"children":66799},{},[66800],{"type":23,"value":66801},"These logs help demonstrate compliance during audits and investigations.",{"type":17,"tag":68,"props":66803,"children":66805},{"id":66804},"the-hidden-compliance-challenge-data-replication",[66806],{"type":23,"value":66807},"The Hidden Compliance Challenge: Data Replication",{"type":17,"tag":29,"props":66809,"children":66810},{},[66811,66813],{"type":23,"value":66812},"One of the most common architectural problems for privacy compliance is ",{"type":17,"tag":48,"props":66814,"children":66815},{},[66816],{"type":23,"value":66817},"data replication.",{"type":17,"tag":29,"props":66819,"children":66820},{},[66821],{"type":23,"value":66822},"Many integration platforms replicate customer data internally to power their APIs.",{"type":17,"tag":29,"props":66824,"children":66825},{},[66826],{"type":23,"value":66827},"This creates several compliance challenges:",{"type":17,"tag":80,"props":66829,"children":66830},{},[66831,66836,66841,66846],{"type":17,"tag":84,"props":66832,"children":66833},{},[66834],{"type":23,"value":66835},"personal data exists in multiple systems",{"type":17,"tag":84,"props":66837,"children":66838},{},[66839],{"type":23,"value":66840},"deletion requests must propagate everywhere",{"type":17,"tag":84,"props":66842,"children":66843},{},[66844],{"type":23,"value":66845},"vendors may hold sensitive information",{"type":17,"tag":84,"props":66847,"children":66848},{},[66849],{"type":23,"value":66850},"breach surface area increases",{"type":17,"tag":29,"props":66852,"children":66853},{},[66854],{"type":23,"value":66855},"Every system storing personal information becomes part of the regulatory scope.",{"type":17,"tag":29,"props":66857,"children":66858},{},[66859],{"type":23,"value":66860},"Reducing unnecessary data storage significantly simplifies compliance.",{"type":17,"tag":68,"props":66862,"children":66864},{"id":66863},"why-real-time-integration-architectures-simplify-ccpa-compliance",[66865],{"type":23,"value":66866},"Why Real-Time Integration Architectures Simplify CCPA Compliance",{"type":17,"tag":29,"props":66868,"children":66869},{},[66870,66872],{"type":23,"value":66871},"Modern integration architectures are increasingly moving toward ",{"type":17,"tag":48,"props":66873,"children":66874},{},[66875],{"type":23,"value":66876},"real-time data access instead of data replication.",{"type":17,"tag":29,"props":66878,"children":66879},{},[66880,66882],{"type":23,"value":66881},"Instead of copying customer data into a separate database, the integration layer simply ",{"type":17,"tag":48,"props":66883,"children":66884},{},[66885],{"type":23,"value":66886},"retrieves data live from the source system when needed.",{"type":17,"tag":29,"props":66888,"children":66889},{},[66890],{"type":23,"value":66891},"This approach offers several privacy advantages:",{"type":17,"tag":80,"props":66893,"children":66894},{},[66895,66900,66905,66910],{"type":17,"tag":84,"props":66896,"children":66897},{},[66898],{"type":23,"value":66899},"fewer systems store personal data",{"type":17,"tag":84,"props":66901,"children":66902},{},[66903],{"type":23,"value":66904},"deletion requests are easier to fulfill",{"type":17,"tag":84,"props":66906,"children":66907},{},[66908],{"type":23,"value":66909},"vendors do not maintain long-term copies",{"type":17,"tag":84,"props":66911,"children":66912},{},[66913],{"type":23,"value":66914},"compliance scope is reduced",{"type":17,"tag":29,"props":66916,"children":66917},{},[66918],{"type":23,"value":66919},"At Unified, our integration infrastructure is built around this principle.",{"type":17,"tag":239,"props":66921,"children":66923},{"id":66922},"unifieds-privacy-friendly-architecture",[66924],{"type":23,"value":66925},"Unified's privacy-friendly architecture",{"type":17,"tag":29,"props":66927,"children":66928},{},[66929,66931,66936],{"type":23,"value":66930},"Unified is designed as a ",{"type":17,"tag":48,"props":66932,"children":66933},{},[66934],{"type":23,"value":66935},"real-time pass-through integration platform",{"type":23,"value":54},{"type":17,"tag":29,"props":66938,"children":66939},{},[66940],{"type":23,"value":64225},{"type":17,"tag":80,"props":66942,"children":66943},{},[66944,66954,66964,66978,66988],{"type":17,"tag":84,"props":66945,"children":66946},{},[66947,66949],{"type":23,"value":66948},"customer data is ",{"type":17,"tag":48,"props":66950,"children":66951},{},[66952],{"type":23,"value":66953},"never stored on Unified infrastructure",{"type":17,"tag":84,"props":66955,"children":66956},{},[66957,66959],{"type":23,"value":66958},"API requests fetch data ",{"type":17,"tag":48,"props":66960,"children":66961},{},[66962],{"type":23,"value":66963},"directly from the source system",{"type":17,"tag":84,"props":66965,"children":66966},{},[66967,66971,66973],{"type":17,"tag":133,"props":66968,"children":66969},{"href":779},[66970],{"type":23,"value":782},{"type":23,"value":66972}," credentials can remain in ",{"type":17,"tag":48,"props":66974,"children":66975},{},[66976],{"type":23,"value":66977},"customer-controlled secrets managers",{"type":17,"tag":84,"props":66979,"children":66980},{},[66981,66983],{"type":23,"value":66982},"webhook updates deliver changes ",{"type":17,"tag":48,"props":66984,"children":66985},{},[66986],{"type":23,"value":66987},"without replicating datasets",{"type":17,"tag":84,"props":66989,"children":66990},{},[66991,66993],{"type":23,"value":66992},"regional infrastructure supports ",{"type":17,"tag":48,"props":66994,"children":66995},{},[66996],{"type":23,"value":10280},{"type":17,"tag":29,"props":66998,"children":66999},{},[67000],{"type":23,"value":67001},"Because the platform does not store customer records, organizations avoid many of the challenges associated with replicated data.",{"type":17,"tag":29,"props":67003,"children":67004},{},[67005],{"type":23,"value":67006},"This architecture aligns naturally with privacy frameworks like:",{"type":17,"tag":80,"props":67008,"children":67009},{},[67010,67014,67018,67022],{"type":17,"tag":84,"props":67011,"children":67012},{},[67013],{"type":23,"value":64705},{"type":17,"tag":84,"props":67015,"children":67016},{},[67017],{"type":23,"value":63416},{"type":17,"tag":84,"props":67019,"children":67020},{},[67021],{"type":23,"value":63422},{"type":17,"tag":84,"props":67023,"children":67024},{},[67025],{"type":23,"value":63434},{"type":17,"tag":68,"props":67027,"children":67029},{"id":67028},"best-practices-for-ccpa-compliant-saas-integrations",[67030],{"type":23,"value":67031},"Best Practices for CCPA-Compliant SaaS Integrations",{"type":17,"tag":29,"props":67033,"children":67034},{},[67035],{"type":23,"value":67036},"Organizations building SaaS integrations should follow several key practices.",{"type":17,"tag":239,"props":67038,"children":67040},{"id":67039},"minimize-data-exposure",[67041],{"type":23,"value":67042},"Minimize data exposure",{"type":17,"tag":29,"props":67044,"children":67045},{},[67046],{"type":23,"value":67047},"Send only necessary fields to integrations.",{"type":17,"tag":29,"props":67049,"children":67050},{},[67051],{"type":23,"value":67052},"Avoid transmitting unnecessary identifiers or sensitive information.",{"type":17,"tag":239,"props":67054,"children":67056},{"id":67055},"implement-least-privilege-access",[67057],{"type":23,"value":67058},"Implement least-privilege access",{"type":17,"tag":29,"props":67060,"children":67061},{},[67062],{"type":23,"value":67063},"Use scoped API tokens and strict role-based access control.",{"type":17,"tag":239,"props":67065,"children":67067},{"id":67066},"build-automated-privacy-workflows",[67068],{"type":23,"value":67069},"Build automated privacy workflows",{"type":17,"tag":29,"props":67071,"children":67072},{},[67073],{"type":23,"value":67074},"Deletion and correction requests should propagate automatically across integrations.",{"type":17,"tag":239,"props":67076,"children":67078},{"id":67077},"evaluate-vendors-carefully",[67079],{"type":23,"value":67080},"Evaluate vendors carefully",{"type":17,"tag":29,"props":67082,"children":67083},{},[67084],{"type":23,"value":67085},"Ensure vendors provide strong security practices and contractual privacy protections.",{"type":17,"tag":239,"props":67087,"children":67089},{"id":67088},"monitor-data-flows-continuously",[67090],{"type":23,"value":67091},"Monitor data flows continuously",{"type":17,"tag":29,"props":67093,"children":67094},{},[67095],{"type":23,"value":67096},"Use automated monitoring tools to detect unauthorized data transfers or policy violations.",{"type":17,"tag":68,"props":67098,"children":67099},{"id":1552},[67100],{"type":23,"value":44411},{"type":17,"tag":29,"props":67102,"children":67103},{},[67104],{"type":23,"value":67105},"The CCPA and CPRA require SaaS companies to rethink how personal data moves through their systems.",{"type":17,"tag":29,"props":67107,"children":67108},{},[67109],{"type":23,"value":67110},"For integration-heavy SaaS products, the architecture used to connect systems plays a major role in compliance.",{"type":17,"tag":29,"props":67112,"children":67113},{},[67114,67116,67121],{"type":23,"value":67115},"Teams that rely on integration platforms that ",{"type":17,"tag":48,"props":67117,"children":67118},{},[67119],{"type":23,"value":67120},"replicate and store customer data",{"type":23,"value":67122}," often face:",{"type":17,"tag":80,"props":67124,"children":67125},{},[67126,67131,67136,67141],{"type":17,"tag":84,"props":67127,"children":67128},{},[67129],{"type":23,"value":67130},"larger compliance scope",{"type":17,"tag":84,"props":67132,"children":67133},{},[67134],{"type":23,"value":67135},"more complex deletion workflows",{"type":17,"tag":84,"props":67137,"children":67138},{},[67139],{"type":23,"value":67140},"higher breach risk",{"type":17,"tag":84,"props":67142,"children":67143},{},[67144],{"type":23,"value":67145},"greater regulatory exposure",{"type":17,"tag":29,"props":67147,"children":67148},{},[67149,67151,67156],{"type":23,"value":67150},"Architectures that emphasize ",{"type":17,"tag":48,"props":67152,"children":67153},{},[67154],{"type":23,"value":67155},"real-time data access and minimal storage",{"type":23,"value":67157}," simplify privacy compliance while still enabling powerful integrations.",{"type":17,"tag":29,"props":67159,"children":67160},{},[67161],{"type":23,"value":67162},"As privacy regulations continue expanding globally, designing integration infrastructure with compliance in mind is becoming a critical architectural decision for SaaS companies.",{"type":17,"tag":29,"props":67164,"children":67165},{},[67166],{"type":17,"tag":133,"props":67167,"children":67169},{"href":1612,"rel":67168},[214],[67170],{"type":23,"value":44481},{"type":17,"tag":29,"props":67172,"children":67173},{},[67174],{"type":17,"tag":133,"props":67175,"children":67177},{"href":1623,"rel":67176},[214],[67178],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":67180},[67181,67184,67185,67191,67198,67199,67202,67209],{"id":66107,"depth":1629,"text":66110,"children":67182},[67183],{"id":66123,"depth":1635,"text":66126},{"id":66243,"depth":1629,"text":66246},{"id":66344,"depth":1629,"text":66347,"children":67186},[67187,67188,67189,67190],{"id":66355,"depth":1635,"text":64924},{"id":65722,"depth":1635,"text":65725},{"id":66446,"depth":1635,"text":66449},{"id":66509,"depth":1635,"text":66512},{"id":66558,"depth":1629,"text":66561,"children":67192},[67193,67194,67195,67196,67197],{"id":66569,"depth":1635,"text":66572},{"id":66618,"depth":1635,"text":66621},{"id":66668,"depth":1635,"text":66671},{"id":66706,"depth":1635,"text":66709},{"id":66765,"depth":1635,"text":66768},{"id":66804,"depth":1629,"text":66807},{"id":66863,"depth":1629,"text":66866,"children":67200},[67201],{"id":66922,"depth":1635,"text":66925},{"id":67028,"depth":1629,"text":67031,"children":67203},[67204,67205,67206,67207,67208],{"id":67039,"depth":1635,"text":67042},{"id":67055,"depth":1635,"text":67058},{"id":67066,"depth":1635,"text":67069},{"id":67077,"depth":1635,"text":67080},{"id":67088,"depth":1635,"text":67091},{"id":1552,"depth":1629,"text":44411},"content:blog:how_to_design_ccpa_compliant_saas_integrations.md","blog/how_to_design_ccpa_compliant_saas_integrations.md","blog/how_to_design_ccpa_compliant_saas_integrations",{"_path":67214,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":67215,"description":67216,"img":67217,"date":67218,"tag":12,"body":67219,"_type":1677,"_id":68210,"_source":1679,"_file":68211,"_stem":68212,"_extension":1682},"/blog/how_to_build_hipaa_compliant_saas_integrations_architecture_patterns_for_healthcare_platforms","How to Build HIPAA-Compliant SaaS Integrations: Architecture Patterns for Healthcare Platforms","Healthcare SaaS products rely on integrations across dozens of systems—EHRs, billing platforms, scheduling tools, support systems, and internal collaboration...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_hipaa_compliant_saas_integrations_architecture_patterns_for_healthcare_platforms-icon.png","2026-03-11T01:46:00.000Z",{"type":14,"children":67220,"toc":68181},[67221,67226,67229,67236,67241,67260,67265,67271,67276,67282,67287,67313,67319,67324,67342,67348,67353,67358,67384,67389,67395,67400,67423,67428,67440,67445,67451,67456,67461,67489,67494,67500,67505,67509,67514,67532,67539,67551,67558,67566,67572,67577,67584,67597,67604,67617,67622,67628,67633,67646,67653,67661,67668,67681,67687,67692,67699,67712,67717,67734,67740,67745,67768,67773,67778,67784,67789,67794,67817,67822,67828,67833,67837,67842,67847,67865,67871,67876,67881,67887,67892,67897,67903,67908,67926,67932,67937,67942,67965,67970,67975,67981,67986,67996,68000,68018,68023,68029,68034,68070,68075,68081,68124,68128,68133,68138,68155,68160,68165,68173],{"type":17,"tag":18,"props":67222,"children":67224},{"id":67223},"how-to-build-hipaa-compliant-saas-integrations-architecture-patterns-for-healthcare-platforms",[67225],{"type":23,"value":67215},{"type":17,"tag":25,"props":67227,"children":67228},{},[],{"type":17,"tag":29,"props":67230,"children":67231},{},[67232],{"type":17,"tag":33,"props":67233,"children":67234},{},[67235],{"type":23,"value":49465},{"type":17,"tag":29,"props":67237,"children":67238},{},[67239],{"type":23,"value":67240},"Healthcare SaaS products rely on integrations across dozens of systems—EHRs, billing platforms, scheduling tools, support systems, and internal collaboration software.",{"type":17,"tag":29,"props":67242,"children":67243},{},[67244,67246,67251,67253,67258],{"type":23,"value":67245},"These integrations frequently handle ",{"type":17,"tag":48,"props":67247,"children":67248},{},[67249],{"type":23,"value":67250},"protected health information (PHI)",{"type":23,"value":67252},". That makes the integration layer subject to the ",{"type":17,"tag":48,"props":67254,"children":67255},{},[67256],{"type":23,"value":67257},"HIPAA Security Rule",{"type":23,"value":67259},", not just the core application.",{"type":17,"tag":29,"props":67261,"children":67262},{},[67263],{"type":23,"value":67264},"Compliance is not just about encryption. It depends on how data flows, where it is stored, and which systems can access it.",{"type":17,"tag":68,"props":67266,"children":67268},{"id":67267},"what-hipaa-requires-for-saas-integrations",[67269],{"type":23,"value":67270},"What HIPAA requires for SaaS integrations",{"type":17,"tag":29,"props":67272,"children":67273},{},[67274],{"type":23,"value":67275},"The HIPAA Security Rule defines safeguards for handling electronic protected health information (ePHI). For integrations, five areas matter most.",{"type":17,"tag":239,"props":67277,"children":67279},{"id":67278},"access-control",[67280],{"type":23,"value":67281},"Access control",{"type":17,"tag":29,"props":67283,"children":67284},{},[67285],{"type":23,"value":67286},"Every user and system accessing PHI must have a unique identity and the minimum required permissions.",{"type":17,"tag":80,"props":67288,"children":67289},{},[67290,67294,67299,67308],{"type":17,"tag":84,"props":67291,"children":67292},{},[67293],{"type":23,"value":66742},{"type":17,"tag":84,"props":67295,"children":67296},{},[67297],{"type":23,"value":67298},"scoped API tokens",{"type":17,"tag":84,"props":67300,"children":67301},{},[67302,67306],{"type":17,"tag":133,"props":67303,"children":67304},{"href":779},[67305],{"type":23,"value":782},{"type":23,"value":67307}," 2.0 authorization",{"type":17,"tag":84,"props":67309,"children":67310},{},[67311],{"type":23,"value":67312},"multi-factor authentication (MFA)",{"type":17,"tag":239,"props":67314,"children":67316},{"id":67315},"encryption",[67317],{"type":23,"value":67318},"Encryption",{"type":17,"tag":29,"props":67320,"children":67321},{},[67322],{"type":23,"value":67323},"PHI must be protected in transit and at rest.",{"type":17,"tag":80,"props":67325,"children":67326},{},[67327,67332,67337],{"type":17,"tag":84,"props":67328,"children":67329},{},[67330],{"type":23,"value":67331},"TLS 1.2+ for API communication",{"type":17,"tag":84,"props":67333,"children":67334},{},[67335],{"type":23,"value":67336},"encryption for stored data",{"type":17,"tag":84,"props":67338,"children":67339},{},[67340],{"type":23,"value":67341},"secure key management",{"type":17,"tag":239,"props":67343,"children":67345},{"id":67344},"audit-logging",[67346],{"type":23,"value":67347},"Audit logging",{"type":17,"tag":29,"props":67349,"children":67350},{},[67351],{"type":23,"value":67352},"Systems must record who accessed what data and when.",{"type":17,"tag":29,"props":67354,"children":67355},{},[67356],{"type":23,"value":67357},"Typical logs include:",{"type":17,"tag":80,"props":67359,"children":67360},{},[67361,67365,67370,67374,67379],{"type":17,"tag":84,"props":67362,"children":67363},{},[67364],{"type":23,"value":66781},{"type":17,"tag":84,"props":67366,"children":67367},{},[67368],{"type":23,"value":67369},"timestamp",{"type":17,"tag":84,"props":67371,"children":67372},{},[67373],{"type":23,"value":66791},{"type":17,"tag":84,"props":67375,"children":67376},{},[67377],{"type":23,"value":67378},"action performed",{"type":17,"tag":84,"props":67380,"children":67381},{},[67382],{"type":23,"value":67383},"source IP",{"type":17,"tag":29,"props":67385,"children":67386},{},[67387],{"type":23,"value":67388},"Healthcare environments often retain logs for up to six years.",{"type":17,"tag":239,"props":67390,"children":67392},{"id":67391},"data-integrity",[67393],{"type":23,"value":67394},"Data integrity",{"type":17,"tag":29,"props":67396,"children":67397},{},[67398],{"type":23,"value":67399},"Data must be protected from unauthorized modification.",{"type":17,"tag":80,"props":67401,"children":67402},{},[67403,67408,67413,67418],{"type":17,"tag":84,"props":67404,"children":67405},{},[67406],{"type":23,"value":67407},"input validation",{"type":17,"tag":84,"props":67409,"children":67410},{},[67411],{"type":23,"value":67412},"request signing",{"type":17,"tag":84,"props":67414,"children":67415},{},[67416],{"type":23,"value":67417},"idempotent operations",{"type":17,"tag":84,"props":67419,"children":67420},{},[67421],{"type":23,"value":67422},"integrity checks",{"type":17,"tag":239,"props":67424,"children":67426},{"id":67425},"vendor-risk-management",[67427],{"type":23,"value":64907},{"type":17,"tag":29,"props":67429,"children":67430},{},[67431,67433,67438],{"type":23,"value":67432},"Any system that processes PHI must sign a ",{"type":17,"tag":48,"props":67434,"children":67435},{},[67436],{"type":23,"value":67437},"Business Associate Agreement (BAA)",{"type":23,"value":67439}," and implement appropriate safeguards.",{"type":17,"tag":29,"props":67441,"children":67442},{},[67443],{"type":23,"value":67444},"Every integration partner becomes part of your compliance boundary.",{"type":17,"tag":68,"props":67446,"children":67448},{"id":67447},"why-integration-architecture-matters",[67449],{"type":23,"value":67450},"Why integration architecture matters",{"type":17,"tag":29,"props":67452,"children":67453},{},[67454],{"type":23,"value":67455},"HIPAA risk is often introduced at the integration layer.",{"type":17,"tag":29,"props":67457,"children":67458},{},[67459],{"type":23,"value":67460},"Common issues include:",{"type":17,"tag":80,"props":67462,"children":67463},{},[67464,67469,67474,67479,67484],{"type":17,"tag":84,"props":67465,"children":67466},{},[67467],{"type":23,"value":67468},"unnecessary PHI storage",{"type":17,"tag":84,"props":67470,"children":67471},{},[67472],{"type":23,"value":67473},"uncontrolled data replication",{"type":17,"tag":84,"props":67475,"children":67476},{},[67477],{"type":23,"value":67478},"excessive vendor access",{"type":17,"tag":84,"props":67480,"children":67481},{},[67482],{"type":23,"value":67483},"weak credential handling",{"type":17,"tag":84,"props":67485,"children":67486},{},[67487],{"type":23,"value":67488},"missing or incomplete audit trails",{"type":17,"tag":29,"props":67490,"children":67491},{},[67492],{"type":23,"value":67493},"These are architectural problems, not just implementation bugs.",{"type":17,"tag":68,"props":67495,"children":67497},{"id":67496},"common-integration-patterns-in-healthcare",[67498],{"type":23,"value":67499},"Common integration patterns in healthcare",{"type":17,"tag":29,"props":67501,"children":67502},{},[67503],{"type":23,"value":67504},"Different integration approaches create different compliance tradeoffs.",{"type":17,"tag":239,"props":67506,"children":67507},{"id":4676},[67508],{"type":23,"value":4679},{"type":17,"tag":29,"props":67510,"children":67511},{},[67512],{"type":23,"value":67513},"Systems connect directly using secure APIs.",{"type":17,"tag":80,"props":67515,"children":67516},{},[67517,67522,67527],{"type":17,"tag":84,"props":67518,"children":67519},{},[67520],{"type":23,"value":67521},"REST or FHIR APIs",{"type":17,"tag":84,"props":67523,"children":67524},{},[67525],{"type":23,"value":67526},"OAuth authorization",{"type":17,"tag":84,"props":67528,"children":67529},{},[67530],{"type":23,"value":67531},"TLS encryption",{"type":17,"tag":29,"props":67533,"children":67534},{},[67535],{"type":17,"tag":48,"props":67536,"children":67537},{},[67538],{"type":23,"value":43788},{"type":17,"tag":80,"props":67540,"children":67541},{},[67542,67546],{"type":17,"tag":84,"props":67543,"children":67544},{},[67545],{"type":23,"value":44278},{"type":17,"tag":84,"props":67547,"children":67548},{},[67549],{"type":23,"value":67550},"minimal infrastructure",{"type":17,"tag":29,"props":67552,"children":67553},{},[67554],{"type":17,"tag":48,"props":67555,"children":67556},{},[67557],{"type":23,"value":621},{"type":17,"tag":80,"props":67559,"children":67560},{},[67561],{"type":17,"tag":84,"props":67562,"children":67563},{},[67564],{"type":23,"value":67565},"each integration must handle security and logging independently",{"type":17,"tag":239,"props":67567,"children":67569},{"id":67568},"middleware-and-ipaas-layers",[67570],{"type":23,"value":67571},"Middleware and iPaaS layers",{"type":17,"tag":29,"props":67573,"children":67574},{},[67575],{"type":23,"value":67576},"Central platforms manage multiple integrations.",{"type":17,"tag":29,"props":67578,"children":67579},{},[67580],{"type":17,"tag":48,"props":67581,"children":67582},{},[67583],{"type":23,"value":43788},{"type":17,"tag":80,"props":67585,"children":67586},{},[67587,67592],{"type":17,"tag":84,"props":67588,"children":67589},{},[67590],{"type":23,"value":67591},"centralized orchestration",{"type":17,"tag":84,"props":67593,"children":67594},{},[67595],{"type":23,"value":67596},"easier scaling across systems",{"type":17,"tag":29,"props":67598,"children":67599},{},[67600],{"type":17,"tag":48,"props":67601,"children":67602},{},[67603],{"type":23,"value":621},{"type":17,"tag":80,"props":67605,"children":67606},{},[67607,67612],{"type":17,"tag":84,"props":67608,"children":67609},{},[67610],{"type":23,"value":67611},"PHI may be stored or processed internally",{"type":17,"tag":84,"props":67613,"children":67614},{},[67615],{"type":23,"value":67616},"additional vendor increases compliance scope",{"type":17,"tag":29,"props":67618,"children":67619},{},[67620],{"type":23,"value":67621},"Any middleware handling PHI must support BAAs and strict controls.",{"type":17,"tag":239,"props":67623,"children":67625},{"id":67624},"secure-file-transfer",[67626],{"type":23,"value":67627},"Secure file transfer",{"type":17,"tag":29,"props":67629,"children":67630},{},[67631],{"type":23,"value":67632},"Used by legacy systems.",{"type":17,"tag":80,"props":67634,"children":67635},{},[67636,67641],{"type":17,"tag":84,"props":67637,"children":67638},{},[67639],{"type":23,"value":67640},"SFTP",{"type":17,"tag":84,"props":67642,"children":67643},{},[67644],{"type":23,"value":67645},"encrypted batch transfers",{"type":17,"tag":29,"props":67647,"children":67648},{},[67649],{"type":17,"tag":48,"props":67650,"children":67651},{},[67652],{"type":23,"value":43788},{"type":17,"tag":80,"props":67654,"children":67655},{},[67656],{"type":17,"tag":84,"props":67657,"children":67658},{},[67659],{"type":23,"value":67660},"compatibility with older systems",{"type":17,"tag":29,"props":67662,"children":67663},{},[67664],{"type":17,"tag":48,"props":67665,"children":67666},{},[67667],{"type":23,"value":621},{"type":17,"tag":80,"props":67669,"children":67670},{},[67671,67676],{"type":17,"tag":84,"props":67672,"children":67673},{},[67674],{"type":23,"value":67675},"delayed processing",{"type":17,"tag":84,"props":67677,"children":67678},{},[67679],{"type":23,"value":67680},"complex error handling",{"type":17,"tag":239,"props":67682,"children":67684},{"id":67683},"microservices-architectures",[67685],{"type":23,"value":67686},"Microservices architectures",{"type":17,"tag":29,"props":67688,"children":67689},{},[67690],{"type":23,"value":67691},"Systems are split into smaller services with controlled boundaries.",{"type":17,"tag":29,"props":67693,"children":67694},{},[67695],{"type":17,"tag":48,"props":67696,"children":67697},{},[67698],{"type":23,"value":43788},{"type":17,"tag":80,"props":67700,"children":67701},{},[67702,67707],{"type":17,"tag":84,"props":67703,"children":67704},{},[67705],{"type":23,"value":67706},"isolation of PHI",{"type":17,"tag":84,"props":67708,"children":67709},{},[67710],{"type":23,"value":67711},"reduced blast radius",{"type":17,"tag":29,"props":67713,"children":67714},{},[67715],{"type":23,"value":67716},"Common safeguards:",{"type":17,"tag":80,"props":67718,"children":67719},{},[67720,67725,67729],{"type":17,"tag":84,"props":67721,"children":67722},{},[67723],{"type":23,"value":67724},"API gateways",{"type":17,"tag":84,"props":67726,"children":67727},{},[67728],{"type":23,"value":66757},{"type":17,"tag":84,"props":67730,"children":67731},{},[67732],{"type":23,"value":67733},"centralized logging",{"type":17,"tag":239,"props":67735,"children":67737},{"id":67736},"standards-based-apis-fhir",[67738],{"type":23,"value":67739},"Standards-based APIs (FHIR)",{"type":17,"tag":29,"props":67741,"children":67742},{},[67743],{"type":23,"value":67744},"FHIR provides structured healthcare data models.",{"type":17,"tag":80,"props":67746,"children":67747},{},[67748,67753,67758,67763],{"type":17,"tag":84,"props":67749,"children":67750},{},[67751],{"type":23,"value":67752},"Patient",{"type":17,"tag":84,"props":67754,"children":67755},{},[67756],{"type":23,"value":67757},"Observation",{"type":17,"tag":84,"props":67759,"children":67760},{},[67761],{"type":23,"value":67762},"Medication",{"type":17,"tag":84,"props":67764,"children":67765},{},[67766],{"type":23,"value":67767},"Encounter",{"type":17,"tag":29,"props":67769,"children":67770},{},[67771],{"type":23,"value":67772},"Typically paired with OAuth and secure transport.",{"type":17,"tag":29,"props":67774,"children":67775},{},[67776],{"type":23,"value":67777},"FHIR improves interoperability while maintaining security controls.",{"type":17,"tag":68,"props":67779,"children":67781},{"id":67780},"operational-integrations-still-handle-phi",[67782],{"type":23,"value":67783},"Operational integrations still handle PHI",{"type":17,"tag":29,"props":67785,"children":67786},{},[67787],{"type":23,"value":67788},"Not all HIPAA exposure comes from clinical systems.",{"type":17,"tag":29,"props":67790,"children":67791},{},[67792],{"type":23,"value":67793},"Operational tools often process PHI indirectly:",{"type":17,"tag":80,"props":67795,"children":67796},{},[67797,67802,67807,67812],{"type":17,"tag":84,"props":67798,"children":67799},{},[67800],{"type":23,"value":67801},"CRM systems (patient communications)",{"type":17,"tag":84,"props":67803,"children":67804},{},[67805],{"type":23,"value":67806},"support platforms (tickets with identifiers)",{"type":17,"tag":84,"props":67808,"children":67809},{},[67810],{"type":23,"value":67811},"scheduling tools (appointments)",{"type":17,"tag":84,"props":67813,"children":67814},{},[67815],{"type":23,"value":67816},"billing systems (invoices, insurance data)",{"type":17,"tag":29,"props":67818,"children":67819},{},[67820],{"type":23,"value":67821},"Even if a system is not an EHR, the integration may still fall under HIPAA.",{"type":17,"tag":68,"props":67823,"children":67825},{"id":67824},"reducing-phi-exposure-in-integration-architecture",[67826],{"type":23,"value":67827},"Reducing PHI exposure in integration architecture",{"type":17,"tag":29,"props":67829,"children":67830},{},[67831],{"type":23,"value":67832},"The most effective way to simplify compliance is to reduce how much PHI flows through integrations.",{"type":17,"tag":239,"props":67834,"children":67835},{"id":66355},[67836],{"type":23,"value":64924},{"type":17,"tag":29,"props":67838,"children":67839},{},[67840],{"type":23,"value":67841},"Only expose required fields.",{"type":17,"tag":29,"props":67843,"children":67844},{},[67845],{"type":23,"value":67846},"Avoid transmitting:",{"type":17,"tag":80,"props":67848,"children":67849},{},[67850,67855,67860],{"type":17,"tag":84,"props":67851,"children":67852},{},[67853],{"type":23,"value":67854},"full patient records",{"type":17,"tag":84,"props":67856,"children":67857},{},[67858],{"type":23,"value":67859},"unnecessary identifiers",{"type":17,"tag":84,"props":67861,"children":67862},{},[67863],{"type":23,"value":67864},"sensitive attributes",{"type":17,"tag":239,"props":67866,"children":67868},{"id":67867},"tokenization-and-pseudonymization",[67869],{"type":23,"value":67870},"Tokenization and pseudonymization",{"type":17,"tag":29,"props":67872,"children":67873},{},[67874],{"type":23,"value":67875},"Replace identifiers with tokens before sending data externally.",{"type":17,"tag":29,"props":67877,"children":67878},{},[67879],{"type":23,"value":67880},"Keep the mapping in a controlled internal system.",{"type":17,"tag":239,"props":67882,"children":67884},{"id":67883},"isolating-phi-systems",[67885],{"type":23,"value":67886},"Isolating PHI systems",{"type":17,"tag":29,"props":67888,"children":67889},{},[67890],{"type":23,"value":67891},"Separate systems that store PHI from general-purpose services.",{"type":17,"tag":29,"props":67893,"children":67894},{},[67895],{"type":23,"value":67896},"Limit which components can access sensitive data.",{"type":17,"tag":239,"props":67898,"children":67900},{"id":67899},"strict-vendor-controls",[67901],{"type":23,"value":67902},"Strict vendor controls",{"type":17,"tag":29,"props":67904,"children":67905},{},[67906],{"type":23,"value":67907},"Limit which vendors can process PHI and require:",{"type":17,"tag":80,"props":67909,"children":67910},{},[67911,67916,67921],{"type":17,"tag":84,"props":67912,"children":67913},{},[67914],{"type":23,"value":67915},"BAAs",{"type":17,"tag":84,"props":67917,"children":67918},{},[67919],{"type":23,"value":67920},"security certifications",{"type":17,"tag":84,"props":67922,"children":67923},{},[67924],{"type":23,"value":67925},"documented controls",{"type":17,"tag":68,"props":67927,"children":67929},{"id":67928},"why-data-replication-increases-hipaa-risk",[67930],{"type":23,"value":67931},"Why data replication increases HIPAA risk",{"type":17,"tag":29,"props":67933,"children":67934},{},[67935],{"type":23,"value":67936},"Many integration platforms replicate data into internal systems.",{"type":17,"tag":29,"props":67938,"children":67939},{},[67940],{"type":23,"value":67941},"This creates additional risk:",{"type":17,"tag":80,"props":67943,"children":67944},{},[67945,67950,67955,67960],{"type":17,"tag":84,"props":67946,"children":67947},{},[67948],{"type":23,"value":67949},"PHI stored in multiple locations",{"type":17,"tag":84,"props":67951,"children":67952},{},[67953],{"type":23,"value":67954},"more vendors handling sensitive data",{"type":17,"tag":84,"props":67956,"children":67957},{},[67958],{"type":23,"value":67959},"increased breach surface",{"type":17,"tag":84,"props":67961,"children":67962},{},[67963],{"type":23,"value":67964},"expanded audit scope",{"type":17,"tag":29,"props":67966,"children":67967},{},[67968],{"type":23,"value":67969},"Each additional system storing PHI must be secured and audited.",{"type":17,"tag":29,"props":67971,"children":67972},{},[67973],{"type":23,"value":67974},"Reducing storage reduces exposure.",{"type":17,"tag":68,"props":67976,"children":67978},{"id":67977},"a-lower-risk-integration-architecture",[67979],{"type":23,"value":67980},"A lower-risk integration architecture",{"type":17,"tag":29,"props":67982,"children":67983},{},[67984],{"type":23,"value":67985},"A safer approach is to avoid storing PHI in the integration layer.",{"type":17,"tag":29,"props":67987,"children":67988},{},[67989,67994],{"type":17,"tag":48,"props":67990,"children":67991},{},[67992],{"type":23,"value":67993},"Real-time pass-through architectures",{"type":23,"value":67995}," retrieve data directly from source systems instead of copying it.",{"type":17,"tag":29,"props":67997,"children":67998},{},[67999],{"type":23,"value":65343},{"type":17,"tag":80,"props":68001,"children":68002},{},[68003,68008,68013],{"type":17,"tag":84,"props":68004,"children":68005},{},[68006],{"type":23,"value":68007},"no persistent storage of patient records",{"type":17,"tag":84,"props":68009,"children":68010},{},[68011],{"type":23,"value":68012},"no replication into intermediate databases",{"type":17,"tag":84,"props":68014,"children":68015},{},[68016],{"type":23,"value":68017},"direct API execution against source systems",{"type":17,"tag":29,"props":68019,"children":68020},{},[68021],{"type":23,"value":68022},"This reduces the number of systems handling PHI.",{"type":17,"tag":68,"props":68024,"children":68026},{"id":68025},"how-unified-supports-hipaa-compliant-integrations",[68027],{"type":23,"value":68028},"How Unified supports HIPAA-compliant integrations",{"type":17,"tag":29,"props":68030,"children":68031},{},[68032],{"type":23,"value":68033},"Unified is designed to minimize PHI exposure in the integration layer.",{"type":17,"tag":80,"props":68035,"children":68036},{},[68037,68042,68046,68051,68056,68061,68066],{"type":17,"tag":84,"props":68038,"children":68039},{},[68040],{"type":23,"value":68041},"customer data is not stored on Unified infrastructure",{"type":17,"tag":84,"props":68043,"children":68044},{},[68045],{"type":23,"value":65356},{"type":17,"tag":84,"props":68047,"children":68048},{},[68049],{"type":23,"value":68050},"no caching or replication of patient data",{"type":17,"tag":84,"props":68052,"children":68053},{},[68054],{"type":23,"value":68055},"OAuth credentials can be stored in customer-controlled secret managers",{"type":17,"tag":84,"props":68057,"children":68058},{},[68059],{"type":23,"value":68060},"TLS encryption protects all data in transit",{"type":17,"tag":84,"props":68062,"children":68063},{},[68064],{"type":23,"value":68065},"audit logs track API and webhook activity",{"type":17,"tag":84,"props":68067,"children":68068},{},[68069],{"type":23,"value":65371},{"type":17,"tag":29,"props":68071,"children":68072},{},[68073],{"type":23,"value":68074},"Because data is not replicated, fewer systems fall within the compliance boundary.",{"type":17,"tag":68,"props":68076,"children":68078},{"id":68077},"best-practices-for-healthcare-saas-integrations",[68079],{"type":23,"value":68080},"Best practices for healthcare SaaS integrations",{"type":17,"tag":80,"props":68082,"children":68083},{},[68084,68089,68094,68099,68104,68109,68114,68119],{"type":17,"tag":84,"props":68085,"children":68086},{},[68087],{"type":23,"value":68088},"enforce least-privilege access across all integrations",{"type":17,"tag":84,"props":68090,"children":68091},{},[68092],{"type":23,"value":68093},"encrypt all data flows",{"type":17,"tag":84,"props":68095,"children":68096},{},[68097],{"type":23,"value":68098},"centralize logging and monitoring",{"type":17,"tag":84,"props":68100,"children":68101},{},[68102],{"type":23,"value":68103},"map PHI data flows before implementation",{"type":17,"tag":84,"props":68105,"children":68106},{},[68107],{"type":23,"value":68108},"require BAAs for all vendors handling PHI",{"type":17,"tag":84,"props":68110,"children":68111},{},[68112],{"type":23,"value":68113},"isolate sensitive systems from general infrastructure",{"type":17,"tag":84,"props":68115,"children":68116},{},[68117],{"type":23,"value":68118},"monitor integration failures and retries",{"type":17,"tag":84,"props":68120,"children":68121},{},[68122],{"type":23,"value":68123},"validate data integrity across systems",{"type":17,"tag":68,"props":68125,"children":68126},{"id":45643},[68127],{"type":23,"value":45646},{"type":17,"tag":29,"props":68129,"children":68130},{},[68131],{"type":23,"value":68132},"HIPAA compliance is heavily influenced by how integrations are designed.",{"type":17,"tag":29,"props":68134,"children":68135},{},[68136],{"type":23,"value":68137},"Every additional system that stores or processes PHI increases:",{"type":17,"tag":80,"props":68139,"children":68140},{},[68141,68145,68150],{"type":17,"tag":84,"props":68142,"children":68143},{},[68144],{"type":23,"value":9406},{"type":17,"tag":84,"props":68146,"children":68147},{},[68148],{"type":23,"value":68149},"audit complexity",{"type":17,"tag":84,"props":68151,"children":68152},{},[68153],{"type":23,"value":68154},"breach risk",{"type":17,"tag":29,"props":68156,"children":68157},{},[68158],{"type":23,"value":68159},"Architectures that minimize storage and restrict data flow reduce the number of systems that must be secured and audited.",{"type":17,"tag":29,"props":68161,"children":68162},{},[68163],{"type":23,"value":68164},"For healthcare SaaS platforms, integration design is one of the primary drivers of compliance risk.",{"type":17,"tag":29,"props":68166,"children":68167},{},[68168],{"type":17,"tag":133,"props":68169,"children":68171},{"href":1612,"rel":68170},[214],[68172],{"type":23,"value":44481},{"type":17,"tag":29,"props":68174,"children":68175},{},[68176],{"type":17,"tag":133,"props":68177,"children":68179},{"href":1623,"rel":68178},[214],[68180],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":68182},[68183,68190,68191,68198,68199,68205,68206,68207,68208,68209],{"id":67267,"depth":1629,"text":67270,"children":68184},[68185,68186,68187,68188,68189],{"id":67278,"depth":1635,"text":67281},{"id":67315,"depth":1635,"text":67318},{"id":67344,"depth":1635,"text":67347},{"id":67391,"depth":1635,"text":67394},{"id":67425,"depth":1635,"text":64907},{"id":67447,"depth":1629,"text":67450},{"id":67496,"depth":1629,"text":67499,"children":68192},[68193,68194,68195,68196,68197],{"id":4676,"depth":1635,"text":4679},{"id":67568,"depth":1635,"text":67571},{"id":67624,"depth":1635,"text":67627},{"id":67683,"depth":1635,"text":67686},{"id":67736,"depth":1635,"text":67739},{"id":67780,"depth":1629,"text":67783},{"id":67824,"depth":1629,"text":67827,"children":68200},[68201,68202,68203,68204],{"id":66355,"depth":1635,"text":64924},{"id":67867,"depth":1635,"text":67870},{"id":67883,"depth":1635,"text":67886},{"id":67899,"depth":1635,"text":67902},{"id":67928,"depth":1629,"text":67931},{"id":67977,"depth":1629,"text":67980},{"id":68025,"depth":1629,"text":68028},{"id":68077,"depth":1629,"text":68080},{"id":45643,"depth":1629,"text":45646},"content:blog:how_to_build_hipaa_compliant_saas_integrations_architecture_patterns_for_healthcare_platforms.md","blog/how_to_build_hipaa_compliant_saas_integrations_architecture_patterns_for_healthcare_platforms.md","blog/how_to_build_hipaa_compliant_saas_integrations_architecture_patterns_for_healthcare_platforms",{"_path":68214,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":68215,"description":68216,"img":68217,"date":68218,"tag":12,"body":68219,"_type":1677,"_id":68749,"_source":1679,"_file":68750,"_stem":68751,"_extension":1682},"/blog/how_to_build_soc_2_compliant_saas_integrations","How to Build SOC 2-Compliant SaaS Integrations","SOC 2 compliance depends heavily on how your integrations handle access, data movement, and observability.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_soc_2_compliant_saas_integrations-icon.png","2026-03-11T01:44:00.000Z",{"type":14,"children":68220,"toc":68739},[68221,68226,68229,68236,68240,68245,68250,68256,68261,68288,68293,68298,68332,68337,68343,68348,68353,68376,68381,68387,68398,68403,68431,68436,68454,68459,68465,68470,68475,68498,68503,68508,68514,68519,68524,68552,68557,68563,68568,68573,68601,68606,68622,68627,68633,68638,68681,68685,68690,68695,68713,68718,68723,68731],{"type":17,"tag":18,"props":68222,"children":68224},{"id":68223},"how-to-build-soc-2-compliant-saas-integrations",[68225],{"type":23,"value":68215},{"type":17,"tag":25,"props":68227,"children":68228},{},[],{"type":17,"tag":29,"props":68230,"children":68231},{},[68232],{"type":17,"tag":33,"props":68233,"children":68234},{},[68235],{"type":23,"value":49465},{"type":17,"tag":29,"props":68237,"children":68238},{},[68239],{"type":23,"value":68216},{"type":17,"tag":29,"props":68241,"children":68242},{},[68243],{"type":23,"value":68244},"Most SaaS products rely on third-party APIs—CRMs, HR systems, billing platforms, messaging tools. These integrations introduce new credentials, new data flows, and new vendors. That makes them one of the most scrutinized areas during a SOC 2 audit.",{"type":17,"tag":29,"props":68246,"children":68247},{},[68248],{"type":23,"value":68249},"This guide focuses on the controls auditors expect to see specifically in your integration layer.",{"type":17,"tag":68,"props":68251,"children":68253},{"id":68252},"why-integrations-are-a-soc-2-risk-surface",[68254],{"type":23,"value":68255},"Why integrations are a SOC 2 risk surface",{"type":17,"tag":29,"props":68257,"children":68258},{},[68259],{"type":23,"value":68260},"SOC 2 is built around the Trust Services Criteria:",{"type":17,"tag":80,"props":68262,"children":68263},{},[68264,68269,68273,68278,68283],{"type":17,"tag":84,"props":68265,"children":68266},{},[68267],{"type":23,"value":68268},"Security",{"type":17,"tag":84,"props":68270,"children":68271},{},[68272],{"type":23,"value":11140},{"type":17,"tag":84,"props":68274,"children":68275},{},[68276],{"type":23,"value":68277},"Processing Integrity",{"type":17,"tag":84,"props":68279,"children":68280},{},[68281],{"type":23,"value":68282},"Confidentiality",{"type":17,"tag":84,"props":68284,"children":68285},{},[68286],{"type":23,"value":68287},"Privacy",{"type":17,"tag":29,"props":68289,"children":68290},{},[68291],{"type":23,"value":68292},"Integrations touch all five.",{"type":17,"tag":29,"props":68294,"children":68295},{},[68296],{"type":23,"value":68297},"Each integration introduces:",{"type":17,"tag":80,"props":68299,"children":68300},{},[68301,68312,68317,68322,68327],{"type":17,"tag":84,"props":68302,"children":68303},{},[68304,68306,68310],{"type":23,"value":68305},"API tokens and ",{"type":17,"tag":133,"props":68307,"children":68308},{"href":779},[68309],{"type":23,"value":782},{"type":23,"value":68311}," credentials",{"type":17,"tag":84,"props":68313,"children":68314},{},[68315],{"type":23,"value":68316},"external data transfers",{"type":17,"tag":84,"props":68318,"children":68319},{},[68320],{"type":23,"value":68321},"webhook endpoints",{"type":17,"tag":84,"props":68323,"children":68324},{},[68325],{"type":23,"value":68326},"vendor dependencies",{"type":17,"tag":84,"props":68328,"children":68329},{},[68330],{"type":23,"value":68331},"background processing and retries",{"type":17,"tag":29,"props":68333,"children":68334},{},[68335],{"type":23,"value":68336},"If these systems are not tightly controlled, they become direct entry points into your infrastructure.",{"type":17,"tag":68,"props":68338,"children":68340},{"id":68339},"_1-least-privilege-access",[68341],{"type":23,"value":68342},"1. Least-privilege access",{"type":17,"tag":29,"props":68344,"children":68345},{},[68346],{"type":23,"value":68347},"SOC 2 requires that systems only access the data they need.",{"type":17,"tag":29,"props":68349,"children":68350},{},[68351],{"type":23,"value":68352},"For integrations, this means:",{"type":17,"tag":80,"props":68354,"children":68355},{},[68356,68361,68366,68371],{"type":17,"tag":84,"props":68357,"children":68358},{},[68359],{"type":23,"value":68360},"scoped OAuth permissions per integration",{"type":17,"tag":84,"props":68362,"children":68363},{},[68364],{"type":23,"value":68365},"tenant-level isolation of credentials",{"type":17,"tag":84,"props":68367,"children":68368},{},[68369],{"type":23,"value":68370},"API tokens restricted to specific actions",{"type":17,"tag":84,"props":68372,"children":68373},{},[68374],{"type":23,"value":68375},"user-linked authorization (not shared credentials)",{"type":17,"tag":29,"props":68377,"children":68378},{},[68379],{"type":23,"value":68380},"Access should always be traceable to a specific user or system and limited to the minimum required scope.",{"type":17,"tag":68,"props":68382,"children":68384},{"id":68383},"_2-logging-and-audit-evidence",[68385],{"type":23,"value":68386},"2. Logging and audit evidence",{"type":17,"tag":29,"props":68388,"children":68389},{},[68390,68392,68397],{"type":23,"value":68391},"Auditors need to verify ",{"type":17,"tag":48,"props":68393,"children":68394},{},[68395],{"type":23,"value":68396},"who accessed what data and when",{"type":23,"value":54},{"type":17,"tag":29,"props":68399,"children":68400},{},[68401],{"type":23,"value":68402},"Your integration layer should produce:",{"type":17,"tag":80,"props":68404,"children":68405},{},[68406,68411,68416,68421,68426],{"type":17,"tag":84,"props":68407,"children":68408},{},[68409],{"type":23,"value":68410},"API request logs (endpoint, timestamp, actor)",{"type":17,"tag":84,"props":68412,"children":68413},{},[68414],{"type":23,"value":68415},"webhook delivery logs (success, failure, retries)",{"type":17,"tag":84,"props":68417,"children":68418},{},[68419],{"type":23,"value":68420},"authentication events (token creation, refresh, revocation)",{"type":17,"tag":84,"props":68422,"children":68423},{},[68424],{"type":23,"value":68425},"configuration changes",{"type":17,"tag":84,"props":68427,"children":68428},{},[68429],{"type":23,"value":68430},"error and retry activity",{"type":17,"tag":29,"props":68432,"children":68433},{},[68434],{"type":23,"value":68435},"Logs should be:",{"type":17,"tag":80,"props":68437,"children":68438},{},[68439,68444,68449],{"type":17,"tag":84,"props":68440,"children":68441},{},[68442],{"type":23,"value":68443},"centralized",{"type":17,"tag":84,"props":68445,"children":68446},{},[68447],{"type":23,"value":68448},"immutable or tamper-resistant",{"type":17,"tag":84,"props":68450,"children":68451},{},[68452],{"type":23,"value":68453},"retained according to policy",{"type":17,"tag":29,"props":68455,"children":68456},{},[68457],{"type":23,"value":68458},"Without this, you cannot demonstrate control effectiveness during an audit.",{"type":17,"tag":68,"props":68460,"children":68462},{"id":68461},"_3-vendor-risk-management",[68463],{"type":23,"value":68464},"3. Vendor risk management",{"type":17,"tag":29,"props":68466,"children":68467},{},[68468],{"type":23,"value":68469},"Every integration partner becomes part of your compliance scope.",{"type":17,"tag":29,"props":68471,"children":68472},{},[68473],{"type":23,"value":68474},"SOC 2 requires you to:",{"type":17,"tag":80,"props":68476,"children":68477},{},[68478,68483,68488,68493],{"type":17,"tag":84,"props":68479,"children":68480},{},[68481],{"type":23,"value":68482},"assess vendor security posture (SOC 2, ISO 27001, etc.)",{"type":17,"tag":84,"props":68484,"children":68485},{},[68486],{"type":23,"value":68487},"maintain Data Processing Agreements (DPAs)",{"type":17,"tag":84,"props":68489,"children":68490},{},[68491],{"type":23,"value":68492},"track sub-processors",{"type":17,"tag":84,"props":68494,"children":68495},{},[68496],{"type":23,"value":68497},"monitor for security incidents",{"type":17,"tag":29,"props":68499,"children":68500},{},[68501],{"type":23,"value":68502},"The more vendors that store or process customer data, the larger your audit surface.",{"type":17,"tag":29,"props":68504,"children":68505},{},[68506],{"type":23,"value":68507},"Reducing unnecessary data sharing across integrations directly reduces vendor risk.",{"type":17,"tag":68,"props":68509,"children":68511},{"id":68510},"_4-processing-integrity",[68512],{"type":23,"value":68513},"4. Processing integrity",{"type":17,"tag":29,"props":68515,"children":68516},{},[68517],{"type":23,"value":68518},"SOC 2 requires that systems process data accurately and reliably.",{"type":17,"tag":29,"props":68520,"children":68521},{},[68522],{"type":23,"value":68523},"For integrations, this includes:",{"type":17,"tag":80,"props":68525,"children":68526},{},[68527,68532,68537,68542,68547],{"type":17,"tag":84,"props":68528,"children":68529},{},[68530],{"type":23,"value":68531},"input validation on all external data",{"type":17,"tag":84,"props":68533,"children":68534},{},[68535],{"type":23,"value":68536},"idempotent operations to prevent duplication",{"type":17,"tag":84,"props":68538,"children":68539},{},[68540],{"type":23,"value":68541},"retry logic with backoff",{"type":17,"tag":84,"props":68543,"children":68544},{},[68545],{"type":23,"value":68546},"monitoring failed jobs and webhook deliveries",{"type":17,"tag":84,"props":68548,"children":68549},{},[68550],{"type":23,"value":68551},"reconciliation checks for critical data flows",{"type":17,"tag":29,"props":68553,"children":68554},{},[68555],{"type":23,"value":68556},"Silent failures or inconsistent data states are considered control failures under processing integrity.",{"type":17,"tag":68,"props":68558,"children":68560},{"id":68559},"_5-audit-ready-integration-architecture",[68561],{"type":23,"value":68562},"5. Audit-ready integration architecture",{"type":17,"tag":29,"props":68564,"children":68565},{},[68566],{"type":23,"value":68567},"SOC 2 does not prescribe architecture, but certain patterns make audits easier.",{"type":17,"tag":29,"props":68569,"children":68570},{},[68571],{"type":23,"value":68572},"Auditors will expect to see:",{"type":17,"tag":80,"props":68574,"children":68575},{},[68576,68581,68586,68591,68596],{"type":17,"tag":84,"props":68577,"children":68578},{},[68579],{"type":23,"value":68580},"clear ownership of integration credentials",{"type":17,"tag":84,"props":68582,"children":68583},{},[68584],{"type":23,"value":68585},"traceability across systems",{"type":17,"tag":84,"props":68587,"children":68588},{},[68589],{"type":23,"value":68590},"consistent logging across all integrations",{"type":17,"tag":84,"props":68592,"children":68593},{},[68594],{"type":23,"value":68595},"controlled data access boundaries",{"type":17,"tag":84,"props":68597,"children":68598},{},[68599],{"type":23,"value":68600},"minimal unnecessary data storage",{"type":17,"tag":29,"props":68602,"children":68603},{},[68604],{"type":23,"value":68605},"Architectures that replicate and store large amounts of third-party data increase:",{"type":17,"tag":80,"props":68607,"children":68608},{},[68609,68613,68618],{"type":17,"tag":84,"props":68610,"children":68611},{},[68612],{"type":23,"value":10275},{"type":17,"tag":84,"props":68614,"children":68615},{},[68616],{"type":23,"value":68617},"retention requirements",{"type":17,"tag":84,"props":68619,"children":68620},{},[68621],{"type":23,"value":54257},{"type":17,"tag":29,"props":68623,"children":68624},{},[68625],{"type":23,"value":68626},"Reducing stored data simplifies compliance.",{"type":17,"tag":68,"props":68628,"children":68630},{"id":68629},"practical-checklist",[68631],{"type":23,"value":68632},"Practical checklist",{"type":17,"tag":29,"props":68634,"children":68635},{},[68636],{"type":23,"value":68637},"To prepare your integration layer for SOC 2:",{"type":17,"tag":80,"props":68639,"children":68640},{},[68641,68646,68651,68656,68661,68666,68671,68676],{"type":17,"tag":84,"props":68642,"children":68643},{},[68644],{"type":23,"value":68645},"Scope OAuth permissions to the minimum required",{"type":17,"tag":84,"props":68647,"children":68648},{},[68649],{"type":23,"value":68650},"Isolate credentials per customer or tenant",{"type":17,"tag":84,"props":68652,"children":68653},{},[68654],{"type":23,"value":68655},"Centralize API and webhook logs",{"type":17,"tag":84,"props":68657,"children":68658},{},[68659],{"type":23,"value":68660},"Retain audit logs with clear access history",{"type":17,"tag":84,"props":68662,"children":68663},{},[68664],{"type":23,"value":68665},"Validate and monitor all integration data flows",{"type":17,"tag":84,"props":68667,"children":68668},{},[68669],{"type":23,"value":68670},"Implement retry and failure handling with visibility",{"type":17,"tag":84,"props":68672,"children":68673},{},[68674],{"type":23,"value":68675},"Review vendor security certifications and contracts",{"type":17,"tag":84,"props":68677,"children":68678},{},[68679],{"type":23,"value":68680},"Minimize stored third-party data wherever possible",{"type":17,"tag":68,"props":68682,"children":68683},{"id":45643},[68684],{"type":23,"value":45646},{"type":17,"tag":29,"props":68686,"children":68687},{},[68688],{"type":23,"value":68689},"SOC 2 audits do not just evaluate your core application—they evaluate how your system interacts with other systems.",{"type":17,"tag":29,"props":68691,"children":68692},{},[68693],{"type":23,"value":68694},"Integrations are where:",{"type":17,"tag":80,"props":68696,"children":68697},{},[68698,68703,68708],{"type":17,"tag":84,"props":68699,"children":68700},{},[68701],{"type":23,"value":68702},"credentials are exposed",{"type":17,"tag":84,"props":68704,"children":68705},{},[68706],{"type":23,"value":68707},"data moves across boundaries",{"type":17,"tag":84,"props":68709,"children":68710},{},[68711],{"type":23,"value":68712},"vendors enter your architecture",{"type":17,"tag":29,"props":68714,"children":68715},{},[68716],{"type":23,"value":68717},"If those systems are not observable, scoped, and controlled, they become the weakest point in your compliance posture.",{"type":17,"tag":29,"props":68719,"children":68720},{},[68721],{"type":23,"value":68722},"Designing integrations with least privilege, strong logging, and minimal data storage makes SOC 2 significantly easier to pass and maintain.",{"type":17,"tag":29,"props":68724,"children":68725},{},[68726],{"type":17,"tag":133,"props":68727,"children":68729},{"href":1612,"rel":68728},[214],[68730],{"type":23,"value":44481},{"type":17,"tag":29,"props":68732,"children":68733},{},[68734],{"type":17,"tag":133,"props":68735,"children":68737},{"href":1623,"rel":68736},[214],[68738],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":68740},[68741,68742,68743,68744,68745,68746,68747,68748],{"id":68252,"depth":1629,"text":68255},{"id":68339,"depth":1629,"text":68342},{"id":68383,"depth":1629,"text":68386},{"id":68461,"depth":1629,"text":68464},{"id":68510,"depth":1629,"text":68513},{"id":68559,"depth":1629,"text":68562},{"id":68629,"depth":1629,"text":68632},{"id":45643,"depth":1629,"text":45646},"content:blog:how_to_build_soc_2_compliant_saas_integrations.md","blog/how_to_build_soc_2_compliant_saas_integrations.md","blog/how_to_build_soc_2_compliant_saas_integrations",{"_path":68753,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":68754,"description":68755,"img":68756,"date":68757,"tag":12,"body":68758,"_type":1677,"_id":70065,"_source":1679,"_file":70066,"_stem":70067,"_extension":1682},"/blog/best_ipaas_alternatives_for_saas_integrations_in_2026_unified_apis_in_house_and_real_time_architectures","Best iPaaS Alternatives for SaaS Integrations in 2026: Unified APIs, In-House, and Real-Time Architectures","iPaaS alternatives include building integrations in-house, using unified APIs, adopting code-first integration platforms, or implementing real-time...","https://s3.us-east-2.amazonaws.com/unified-article-images/best_ipaas_alternatives_for_saas_integrations_in_2026_unified_apis_in_house_and_real_time_architectures-icon.png","2026-03-11T01:03:00.000Z",{"type":14,"children":68759,"toc":70045},[68760,68765,68768,68775,68787,68793,68798,68803,68821,68826,68834,68839,68847,68852,68860,68865,68873,68878,68886,68891,68896,68900,68906,68912,68917,68925,68943,68951,68985,68990,68996,69001,69005,69034,69041,69059,69066,69094,69099,69105,69110,69114,69134,69141,69159,69166,69189,69200,69206,69211,69215,69226,69233,69251,69258,69276,69281,69287,69298,69303,69321,69325,69336,69341,69347,69506,69517,69523,69528,69534,69539,69561,69566,69581,69587,69592,69610,69615,69621,69626,69643,69648,69654,69669,69674,69682,69699,69707,69725,69733,69751,69758,69776,69784,69802,69807,69825,69831,69836,69844,69862,69870,69888,69896,69909,69917,69935,69939,69967,69971,69976,69981,69999,70004,70022,70027,70036],{"type":17,"tag":18,"props":68761,"children":68763},{"id":68762},"best-ipaas-alternatives-for-saas-integrations-in-2026-unified-apis-in-house-and-real-time-architectures",[68764],{"type":23,"value":68754},{"type":17,"tag":25,"props":68766,"children":68767},{},[],{"type":17,"tag":29,"props":68769,"children":68770},{},[68771],{"type":17,"tag":33,"props":68772,"children":68773},{},[68774],{"type":23,"value":49465},{"type":17,"tag":29,"props":68776,"children":68777},{},[68778,68780,68785],{"type":23,"value":68779},"iPaaS alternatives include building integrations in-house, using unified APIs, adopting code-first integration platforms, or implementing real-time pass-through architectures. These approaches differ in how they handle data (batch vs real-time), storage, maintenance, and developer experience. In 2026, many SaaS companies are moving away from iPaaS toward ",{"type":17,"tag":48,"props":68781,"children":68782},{},[68783],{"type":23,"value":68784},"real-time unified APIs",{"type":23,"value":68786}," that eliminate data storage, reduce maintenance, and support AI-driven use cases.",{"type":17,"tag":68,"props":68788,"children":68790},{"id":68789},"why-does-ipaas-fall-short-for-modern-saas-integrations",[68791],{"type":23,"value":68792},"Why does iPaaS fall short for modern SaaS integrations?",{"type":17,"tag":29,"props":68794,"children":68795},{},[68796],{"type":23,"value":68797},"iPaaS (Integration Platform as a Service) platforms were designed to help teams connect applications through workflows and automation.",{"type":17,"tag":29,"props":68799,"children":68800},{},[68801],{"type":23,"value":68802},"But most iPaaS platforms still rely on:",{"type":17,"tag":80,"props":68804,"children":68805},{},[68806,68811,68816],{"type":17,"tag":84,"props":68807,"children":68808},{},[68809],{"type":23,"value":68810},"polling or scheduled syncs",{"type":17,"tag":84,"props":68812,"children":68813},{},[68814],{"type":23,"value":68815},"workflow builders instead of APIs",{"type":17,"tag":84,"props":68817,"children":68818},{},[68819],{"type":23,"value":68820},"stored data and intermediate systems",{"type":17,"tag":29,"props":68822,"children":68823},{},[68824],{"type":23,"value":68825},"This creates several issues for product teams:",{"type":17,"tag":29,"props":68827,"children":68828},{},[68829],{"type":17,"tag":48,"props":68830,"children":68831},{},[68832],{"type":23,"value":68833},"Not built for product integrations",{"type":17,"tag":29,"props":68835,"children":68836},{},[68837],{"type":23,"value":68838},"iPaaS tools are optimized for internal automation, not embedding integrations into SaaS products.",{"type":17,"tag":29,"props":68840,"children":68841},{},[68842],{"type":17,"tag":48,"props":68843,"children":68844},{},[68845],{"type":23,"value":68846},"Limited API coverage",{"type":17,"tag":29,"props":68848,"children":68849},{},[68850],{"type":23,"value":68851},"Pre-built connectors only expose a subset of each provider's API.",{"type":17,"tag":29,"props":68853,"children":68854},{},[68855],{"type":17,"tag":48,"props":68856,"children":68857},{},[68858],{"type":23,"value":68859},"Poor developer experience",{"type":17,"tag":29,"props":68861,"children":68862},{},[68863],{"type":23,"value":68864},"Engineers often end up writing custom logic inside low-code tools.",{"type":17,"tag":29,"props":68866,"children":68867},{},[68868],{"type":17,"tag":48,"props":68869,"children":68870},{},[68871],{"type":23,"value":68872},"Data staleness",{"type":17,"tag":29,"props":68874,"children":68875},{},[68876],{"type":23,"value":68877},"Polling and sync intervals introduce delays (minutes to hours).",{"type":17,"tag":29,"props":68879,"children":68880},{},[68881],{"type":17,"tag":48,"props":68882,"children":68883},{},[68884],{"type":23,"value":68885},"Higher compliance burden",{"type":17,"tag":29,"props":68887,"children":68888},{},[68889],{"type":23,"value":68890},"Storing third-party data creates additional security and regulatory scope.",{"type":17,"tag":29,"props":68892,"children":68893},{},[68894],{"type":23,"value":68895},"For SaaS companies building customer-facing integrations, these limitations compound quickly.",{"type":17,"tag":11616,"props":68897,"children":68899},{"width":11618,"height":11619,"src":68898,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/P2S06Yho320",[],{"type":17,"tag":68,"props":68901,"children":68903},{"id":68902},"what-are-the-main-ipaas-alternatives",[68904],{"type":23,"value":68905},"What are the main iPaaS alternatives?",{"type":17,"tag":239,"props":68907,"children":68909},{"id":68908},"_1-building-integrations-in-house",[68910],{"type":23,"value":68911},"1. Building integrations in-house",{"type":17,"tag":29,"props":68913,"children":68914},{},[68915],{"type":23,"value":68916},"Building integrations internally gives full control over architecture and behavior.",{"type":17,"tag":29,"props":68918,"children":68919},{},[68920],{"type":17,"tag":48,"props":68921,"children":68922},{},[68923],{"type":23,"value":68924},"Pros",{"type":17,"tag":80,"props":68926,"children":68927},{},[68928,68933,68938],{"type":17,"tag":84,"props":68929,"children":68930},{},[68931],{"type":23,"value":68932},"Full flexibility across any API",{"type":17,"tag":84,"props":68934,"children":68935},{},[68936],{"type":23,"value":68937},"Complete control over data handling",{"type":17,"tag":84,"props":68939,"children":68940},{},[68941],{"type":23,"value":68942},"No dependency on external vendors",{"type":17,"tag":29,"props":68944,"children":68945},{},[68946],{"type":17,"tag":48,"props":68947,"children":68948},{},[68949],{"type":23,"value":68950},"Cons",{"type":17,"tag":80,"props":68952,"children":68953},{},[68954,68959,68964,68974],{"type":17,"tag":84,"props":68955,"children":68956},{},[68957],{"type":23,"value":68958},"High engineering cost",{"type":17,"tag":84,"props":68960,"children":68961},{},[68962],{"type":23,"value":68963},"Slow time-to-market",{"type":17,"tag":84,"props":68965,"children":68966},{},[68967,68969,68973],{"type":23,"value":68968},"Ongoing maintenance burden (API changes, auth, retries, ",{"type":17,"tag":133,"props":68970,"children":68971},{"href":135},[68972],{"type":23,"value":138},{"type":23,"value":12034},{"type":17,"tag":84,"props":68975,"children":68976},{},[68977,68979,68983],{"type":23,"value":68978},"Requires building infrastructure (",{"type":17,"tag":133,"props":68980,"children":68981},{"href":779},[68982],{"type":23,"value":782},{"type":23,"value":68984},", queues, logging, error handling)",{"type":17,"tag":29,"props":68986,"children":68987},{},[68988],{"type":23,"value":68989},"This approach is viable for a small number of integrations, but becomes difficult to scale beyond a few systems.",{"type":17,"tag":239,"props":68991,"children":68993},{"id":68992},"_2-embedded-ipaas-platforms",[68994],{"type":23,"value":68995},"2. Embedded iPaaS platforms",{"type":17,"tag":29,"props":68997,"children":68998},{},[68999],{"type":23,"value":69000},"Embedded iPaaS platforms attempt to bring workflow automation into SaaS products.",{"type":17,"tag":29,"props":69002,"children":69003},{},[69004],{"type":23,"value":24364},{"type":17,"tag":80,"props":69006,"children":69007},{},[69008,69017,69026],{"type":17,"tag":84,"props":69009,"children":69010},{},[69011],{"type":17,"tag":133,"props":69012,"children":69015},{"href":69013,"rel":69014},"https://www.useparagon.com/",[214],[69016],{"type":23,"value":581},{"type":17,"tag":84,"props":69018,"children":69019},{},[69020],{"type":17,"tag":133,"props":69021,"children":69023},{"href":386,"rel":69022},[214],[69024],{"type":23,"value":69025},"Workato Embedded",{"type":17,"tag":84,"props":69027,"children":69028},{},[69029],{"type":17,"tag":133,"props":69030,"children":69032},{"href":567,"rel":69031},[214],[69033],{"type":23,"value":571},{"type":17,"tag":29,"props":69035,"children":69036},{},[69037],{"type":17,"tag":48,"props":69038,"children":69039},{},[69040],{"type":23,"value":68924},{"type":17,"tag":80,"props":69042,"children":69043},{},[69044,69049,69054],{"type":17,"tag":84,"props":69045,"children":69046},{},[69047],{"type":23,"value":69048},"Faster setup than in-house",{"type":17,"tag":84,"props":69050,"children":69051},{},[69052],{"type":23,"value":69053},"Pre-built connectors",{"type":17,"tag":84,"props":69055,"children":69056},{},[69057],{"type":23,"value":69058},"Visual workflow builders",{"type":17,"tag":29,"props":69060,"children":69061},{},[69062],{"type":17,"tag":48,"props":69063,"children":69064},{},[69065],{"type":23,"value":68950},{"type":17,"tag":80,"props":69067,"children":69068},{},[69069,69074,69079,69084,69089],{"type":17,"tag":84,"props":69070,"children":69071},{},[69072],{"type":23,"value":69073},"Still workflow-first, not API-first",{"type":17,"tag":84,"props":69075,"children":69076},{},[69077],{"type":23,"value":69078},"Limited depth of integrations",{"type":17,"tag":84,"props":69080,"children":69081},{},[69082],{"type":23,"value":69083},"Requires engineering for real use cases",{"type":17,"tag":84,"props":69085,"children":69086},{},[69087],{"type":23,"value":69088},"Often stores customer data",{"type":17,"tag":84,"props":69090,"children":69091},{},[69092],{"type":23,"value":69093},"Not optimized for real-time or AI use cases",{"type":17,"tag":29,"props":69095,"children":69096},{},[69097],{"type":23,"value":69098},"These platforms reduce initial effort but still inherit many iPaaS limitations.",{"type":17,"tag":239,"props":69100,"children":69102},{"id":69101},"_3-first-generation-unified-apis",[69103],{"type":23,"value":69104},"3. First-generation unified APIs",{"type":17,"tag":29,"props":69106,"children":69107},{},[69108],{"type":23,"value":69109},"Unified APIs provide a single API layer across multiple providers.",{"type":17,"tag":29,"props":69111,"children":69112},{},[69113],{"type":23,"value":24364},{"type":17,"tag":80,"props":69115,"children":69116},{},[69117,69125],{"type":17,"tag":84,"props":69118,"children":69119},{},[69120],{"type":17,"tag":133,"props":69121,"children":69123},{"href":223,"rel":69122},[214],[69124],{"type":23,"value":227},{"type":17,"tag":84,"props":69126,"children":69127},{},[69128],{"type":17,"tag":133,"props":69129,"children":69132},{"href":69130,"rel":69131},"https://www.apideck.com/",[214],[69133],{"type":23,"value":237},{"type":17,"tag":29,"props":69135,"children":69136},{},[69137],{"type":17,"tag":48,"props":69138,"children":69139},{},[69140],{"type":23,"value":68924},{"type":17,"tag":80,"props":69142,"children":69143},{},[69144,69149,69154],{"type":17,"tag":84,"props":69145,"children":69146},{},[69147],{"type":23,"value":69148},"Single integration → multiple providers",{"type":17,"tag":84,"props":69150,"children":69151},{},[69152],{"type":23,"value":69153},"Normalized schemas",{"type":17,"tag":84,"props":69155,"children":69156},{},[69157],{"type":23,"value":69158},"Reduced maintenance",{"type":17,"tag":29,"props":69160,"children":69161},{},[69162],{"type":17,"tag":48,"props":69163,"children":69164},{},[69165],{"type":23,"value":68950},{"type":17,"tag":80,"props":69167,"children":69168},{},[69169,69174,69179,69184],{"type":17,"tag":84,"props":69170,"children":69171},{},[69172],{"type":23,"value":69173},"Typically rely on sync-and-store architecture",{"type":17,"tag":84,"props":69175,"children":69176},{},[69177],{"type":23,"value":69178},"Data can be stale (sync intervals)",{"type":17,"tag":84,"props":69180,"children":69181},{},[69182],{"type":23,"value":69183},"Limited flexibility for provider-specific features",{"type":17,"tag":84,"props":69185,"children":69186},{},[69187],{"type":23,"value":69188},"Additional compliance scope due to stored data",{"type":17,"tag":29,"props":69190,"children":69191},{},[69192,69194,69199],{"type":23,"value":69193},"These platforms improve developer experience, but still rely on ",{"type":17,"tag":48,"props":69195,"children":69196},{},[69197],{"type":23,"value":69198},"batch or cached data models",{"type":23,"value":54},{"type":17,"tag":239,"props":69201,"children":69203},{"id":69202},"_4-code-first-integration-platforms",[69204],{"type":23,"value":69205},"4. Code-first integration platforms",{"type":17,"tag":29,"props":69207,"children":69208},{},[69209],{"type":23,"value":69210},"Code-first platforms focus on giving developers infrastructure to build integrations faster.",{"type":17,"tag":29,"props":69212,"children":69213},{},[69214],{"type":23,"value":19878},{"type":17,"tag":80,"props":69216,"children":69217},{},[69218],{"type":17,"tag":84,"props":69219,"children":69220},{},[69221],{"type":17,"tag":133,"props":69222,"children":69224},{"href":1021,"rel":69223},[214],[69225],{"type":23,"value":1025},{"type":17,"tag":29,"props":69227,"children":69228},{},[69229],{"type":17,"tag":48,"props":69230,"children":69231},{},[69232],{"type":23,"value":68924},{"type":17,"tag":80,"props":69234,"children":69235},{},[69236,69241,69246],{"type":17,"tag":84,"props":69237,"children":69238},{},[69239],{"type":23,"value":69240},"Strong control and flexibility",{"type":17,"tag":84,"props":69242,"children":69243},{},[69244],{"type":23,"value":69245},"Built-in auth and sync infrastructure",{"type":17,"tag":84,"props":69247,"children":69248},{},[69249],{"type":23,"value":69250},"Developer-friendly",{"type":17,"tag":29,"props":69252,"children":69253},{},[69254],{"type":17,"tag":48,"props":69255,"children":69256},{},[69257],{"type":23,"value":68950},{"type":17,"tag":80,"props":69259,"children":69260},{},[69261,69266,69271],{"type":17,"tag":84,"props":69262,"children":69263},{},[69264],{"type":23,"value":69265},"Still requires building and maintaining integrations",{"type":17,"tag":84,"props":69267,"children":69268},{},[69269],{"type":23,"value":69270},"Sync-based architecture introduces latency",{"type":17,"tag":84,"props":69272,"children":69273},{},[69274],{"type":23,"value":69275},"Ongoing operational overhead",{"type":17,"tag":29,"props":69277,"children":69278},{},[69279],{"type":23,"value":69280},"This approach is often a middle ground between in-house and unified APIs.",{"type":17,"tag":239,"props":69282,"children":69284},{"id":69283},"_5-real-time-unified-apis-modern-architecture",[69285],{"type":23,"value":69286},"5. Real-time unified APIs (modern architecture)",{"type":17,"tag":29,"props":69288,"children":69289},{},[69290,69292,69297],{"type":23,"value":69291},"A newer category has emerged: ",{"type":17,"tag":48,"props":69293,"children":69294},{},[69295],{"type":23,"value":69296},"real-time, pass-through unified APIs",{"type":23,"value":54},{"type":17,"tag":29,"props":69299,"children":69300},{},[69301],{"type":23,"value":69302},"Instead of syncing or storing data, these platforms:",{"type":17,"tag":80,"props":69304,"children":69305},{},[69306,69311,69316],{"type":17,"tag":84,"props":69307,"children":69308},{},[69309],{"type":23,"value":69310},"fetch data directly from source systems on request",{"type":17,"tag":84,"props":69312,"children":69313},{},[69314],{"type":23,"value":69315},"return normalized responses in real time",{"type":17,"tag":84,"props":69317,"children":69318},{},[69319],{"type":23,"value":69320},"avoid caching and replication",{"type":17,"tag":29,"props":69322,"children":69323},{},[69324],{"type":23,"value":19878},{"type":17,"tag":80,"props":69326,"children":69327},{},[69328],{"type":17,"tag":84,"props":69329,"children":69330},{},[69331],{"type":17,"tag":133,"props":69332,"children":69334},{"href":42620,"rel":69333},[214],[69335],{"type":23,"value":217},{"type":17,"tag":29,"props":69337,"children":69338},{},[69339],{"type":23,"value":69340},"This architecture eliminates many of the tradeoffs found in iPaaS and first-gen unified APIs.",{"type":17,"tag":68,"props":69342,"children":69344},{"id":69343},"how-does-a-real-time-unified-api-differ-from-ipaas",[69345],{"type":23,"value":69346},"How does a real-time unified API differ from iPaaS?",{"type":17,"tag":7231,"props":69348,"children":69349},{},[69350,69376],{"type":17,"tag":7235,"props":69351,"children":69352},{},[69353],{"type":17,"tag":7239,"props":69354,"children":69355},{},[69356,69361,69366,69371],{"type":17,"tag":7243,"props":69357,"children":69358},{},[69359],{"type":23,"value":69360},"Capability",{"type":17,"tag":7243,"props":69362,"children":69363},{},[69364],{"type":23,"value":69365},"iPaaS",{"type":17,"tag":7243,"props":69367,"children":69368},{},[69369],{"type":23,"value":69370},"First-Gen Unified APIs",{"type":17,"tag":7243,"props":69372,"children":69373},{},[69374],{"type":23,"value":69375},"Real-Time Unified APIs",{"type":17,"tag":7259,"props":69377,"children":69378},{},[69379,69401,69421,69442,69465,69486],{"type":17,"tag":7239,"props":69380,"children":69381},{},[69382,69386,69391,69396],{"type":17,"tag":7266,"props":69383,"children":69384},{},[69385],{"type":23,"value":46270},{"type":17,"tag":7266,"props":69387,"children":69388},{},[69389],{"type":23,"value":69390},"Polling / workflows",{"type":17,"tag":7266,"props":69392,"children":69393},{},[69394],{"type":23,"value":69395},"Synced / cached",{"type":17,"tag":7266,"props":69397,"children":69398},{},[69399],{"type":23,"value":69400},"Live, on-demand",{"type":17,"tag":7239,"props":69402,"children":69403},{},[69404,69409,69413,69417],{"type":17,"tag":7266,"props":69405,"children":69406},{},[69407],{"type":23,"value":69408},"Data storage",{"type":17,"tag":7266,"props":69410,"children":69411},{},[69412],{"type":23,"value":47981},{"type":17,"tag":7266,"props":69414,"children":69415},{},[69416],{"type":23,"value":47981},{"type":17,"tag":7266,"props":69418,"children":69419},{},[69420],{"type":23,"value":48006},{"type":17,"tag":7239,"props":69422,"children":69423},{},[69424,69428,69433,69437],{"type":17,"tag":7266,"props":69425,"children":69426},{},[69427],{"type":23,"value":9978},{"type":17,"tag":7266,"props":69429,"children":69430},{},[69431],{"type":23,"value":69432},"Minutes–hours",{"type":17,"tag":7266,"props":69434,"children":69435},{},[69436],{"type":23,"value":69432},{"type":17,"tag":7266,"props":69438,"children":69439},{},[69440],{"type":23,"value":69441},"100–500ms typical",{"type":17,"tag":7239,"props":69443,"children":69444},{},[69445,69450,69455,69460],{"type":17,"tag":7266,"props":69446,"children":69447},{},[69448],{"type":23,"value":69449},"Maintenance",{"type":17,"tag":7266,"props":69451,"children":69452},{},[69453],{"type":23,"value":69454},"Medium–high",{"type":17,"tag":7266,"props":69456,"children":69457},{},[69458],{"type":23,"value":69459},"Low",{"type":17,"tag":7266,"props":69461,"children":69462},{},[69463],{"type":23,"value":69464},"Very low",{"type":17,"tag":7239,"props":69466,"children":69467},{},[69468,69472,69477,69482],{"type":17,"tag":7266,"props":69469,"children":69470},{},[69471],{"type":23,"value":10067},{"type":17,"tag":7266,"props":69473,"children":69474},{},[69475],{"type":23,"value":69476},"High",{"type":17,"tag":7266,"props":69478,"children":69479},{},[69480],{"type":23,"value":69481},"Medium",{"type":17,"tag":7266,"props":69483,"children":69484},{},[69485],{"type":23,"value":69459},{"type":17,"tag":7239,"props":69487,"children":69488},{},[69489,69494,69498,69502],{"type":17,"tag":7266,"props":69490,"children":69491},{},[69492],{"type":23,"value":69493},"AI readiness",{"type":17,"tag":7266,"props":69495,"children":69496},{},[69497],{"type":23,"value":69459},{"type":17,"tag":7266,"props":69499,"children":69500},{},[69501],{"type":23,"value":69481},{"type":17,"tag":7266,"props":69503,"children":69504},{},[69505],{"type":23,"value":69476},{"type":17,"tag":29,"props":69507,"children":69508},{},[69509,69511,69516],{"type":23,"value":69510},"The key shift is ",{"type":17,"tag":48,"props":69512,"children":69513},{},[69514],{"type":23,"value":69515},"moving from sync-based architectures to real-time access",{"type":23,"value":54},{"type":17,"tag":68,"props":69518,"children":69520},{"id":69519},"why-are-saas-companies-moving-away-from-ipaas",[69521],{"type":23,"value":69522},"Why are SaaS companies moving away from iPaaS?",{"type":17,"tag":29,"props":69524,"children":69525},{},[69526],{"type":23,"value":69527},"Three trends are driving this shift:",{"type":17,"tag":239,"props":69529,"children":69531},{"id":69530},"_1-real-time-expectations",[69532],{"type":23,"value":69533},"1. Real-time expectations",{"type":17,"tag":29,"props":69535,"children":69536},{},[69537],{"type":23,"value":69538},"Modern applications require live data:",{"type":17,"tag":80,"props":69540,"children":69541},{},[69542,69547,69552,69557],{"type":17,"tag":84,"props":69543,"children":69544},{},[69545],{"type":23,"value":69546},"sales dashboards",{"type":17,"tag":84,"props":69548,"children":69549},{},[69550],{"type":23,"value":69551},"onboarding workflows",{"type":17,"tag":84,"props":69553,"children":69554},{},[69555],{"type":23,"value":69556},"automation triggers",{"type":17,"tag":84,"props":69558,"children":69559},{},[69560],{"type":23,"value":15895},{"type":17,"tag":29,"props":69562,"children":69563},{},[69564],{"type":23,"value":69565},"Batch-based systems cannot support these reliably.",{"type":17,"tag":29,"props":69567,"children":69568},{},[69569,69571],{"type":23,"value":69570},"→ See also: ",{"type":17,"tag":133,"props":69572,"children":69575},{"href":69573,"rel":69574},"https://unified.to/blog/real_time_data_pipelines_vs_etl_what_modern_saas_systems_actually_need",[214],[69576],{"type":17,"tag":33,"props":69577,"children":69578},{},[69579],{"type":23,"value":69580},"Real-time data pipelines vs ETL",{"type":17,"tag":239,"props":69582,"children":69584},{"id":69583},"_2-integration-scale",[69585],{"type":23,"value":69586},"2. Integration scale",{"type":17,"tag":29,"props":69588,"children":69589},{},[69590],{"type":23,"value":69591},"SaaS products often need:",{"type":17,"tag":80,"props":69593,"children":69594},{},[69595,69600,69605],{"type":17,"tag":84,"props":69596,"children":69597},{},[69598],{"type":23,"value":69599},"dozens or hundreds of integrations",{"type":17,"tag":84,"props":69601,"children":69602},{},[69603],{"type":23,"value":69604},"consistent schemas",{"type":17,"tag":84,"props":69606,"children":69607},{},[69608],{"type":23,"value":69609},"predictable behavior",{"type":17,"tag":29,"props":69611,"children":69612},{},[69613],{"type":23,"value":69614},"iPaaS and in-house approaches do not scale efficiently.",{"type":17,"tag":239,"props":69616,"children":69618},{"id":69617},"_3-ai-native-products",[69619],{"type":23,"value":69620},"3. AI-native products",{"type":17,"tag":29,"props":69622,"children":69623},{},[69624],{"type":23,"value":69625},"AI agents and copilots require:",{"type":17,"tag":80,"props":69627,"children":69628},{},[69629,69633,69638],{"type":17,"tag":84,"props":69630,"children":69631},{},[69632],{"type":23,"value":27657},{"type":17,"tag":84,"props":69634,"children":69635},{},[69636],{"type":23,"value":69637},"structured schemas",{"type":17,"tag":84,"props":69639,"children":69640},{},[69641],{"type":23,"value":69642},"reliable tool execution",{"type":17,"tag":29,"props":69644,"children":69645},{},[69646],{"type":23,"value":69647},"Cached or delayed data breaks these workflows.",{"type":17,"tag":68,"props":69649,"children":69651},{"id":69650},"build-with-unifieds-real-time-integration-infrastructure",[69652],{"type":23,"value":69653},"Build with Unified's real-time integration infrastructure",{"type":17,"tag":29,"props":69655,"children":69656},{},[69657,69658,69667],{"type":23,"value":50665},{"type":17,"tag":48,"props":69659,"children":69660},{},[69661,69663],{"type":23,"value":69662},"real-time ",{"type":17,"tag":133,"props":69664,"children":69665},{"href":7691},[69666],{"type":23,"value":7459},{"type":23,"value":69668}," designed for SaaS products.",{"type":17,"tag":29,"props":69670,"children":69671},{},[69672],{"type":23,"value":69673},"Instead of workflows or sync pipelines, Unified uses:",{"type":17,"tag":29,"props":69675,"children":69676},{},[69677],{"type":17,"tag":48,"props":69678,"children":69679},{},[69680],{"type":23,"value":69681},"Real-time pass-through architecture",{"type":17,"tag":80,"props":69683,"children":69684},{},[69685,69689,69694],{"type":17,"tag":84,"props":69686,"children":69687},{},[69688],{"type":23,"value":43583},{"type":17,"tag":84,"props":69690,"children":69691},{},[69692],{"type":23,"value":69693},"No polling or scheduled syncs",{"type":17,"tag":84,"props":69695,"children":69696},{},[69697],{"type":23,"value":69698},"Always up-to-date data",{"type":17,"tag":29,"props":69700,"children":69701},{},[69702],{"type":17,"tag":48,"props":69703,"children":69704},{},[69705],{"type":23,"value":69706},"Zero data storage",{"type":17,"tag":80,"props":69708,"children":69709},{},[69710,69715,69720],{"type":17,"tag":84,"props":69711,"children":69712},{},[69713],{"type":23,"value":69714},"No third-party data stored",{"type":17,"tag":84,"props":69716,"children":69717},{},[69718],{"type":23,"value":69719},"Reduced compliance scope (SOC 2, GDPR, HIPAA, CCPA)",{"type":17,"tag":84,"props":69721,"children":69722},{},[69723],{"type":23,"value":69724},"Lower security risk",{"type":17,"tag":29,"props":69726,"children":69727},{},[69728],{"type":17,"tag":48,"props":69729,"children":69730},{},[69731],{"type":23,"value":69732},"Deeply normalized schemas",{"type":17,"tag":80,"props":69734,"children":69735},{},[69736,69741,69746],{"type":17,"tag":84,"props":69737,"children":69738},{},[69739],{"type":23,"value":69740},"CRM, HRIS, ATS, and more",{"type":17,"tag":84,"props":69742,"children":69743},{},[69744],{"type":23,"value":69745},"Unified objects across providers",{"type":17,"tag":84,"props":69747,"children":69748},{},[69749],{"type":23,"value":69750},"Access raw fields when needed",{"type":17,"tag":29,"props":69752,"children":69753},{},[69754],{"type":17,"tag":48,"props":69755,"children":69756},{},[69757],{"type":23,"value":18185},{"type":17,"tag":80,"props":69759,"children":69760},{},[69761,69766,69771],{"type":17,"tag":84,"props":69762,"children":69763},{},[69764],{"type":23,"value":69765},"OAuth + API key handling",{"type":17,"tag":84,"props":69767,"children":69768},{},[69769],{"type":23,"value":69770},"Token refresh and scope management",{"type":17,"tag":84,"props":69772,"children":69773},{},[69774],{"type":23,"value":69775},"Embedded auth UI",{"type":17,"tag":29,"props":69777,"children":69778},{},[69779],{"type":17,"tag":48,"props":69780,"children":69781},{},[69782],{"type":23,"value":69783},"AI-ready infrastructure",{"type":17,"tag":80,"props":69785,"children":69786},{},[69787,69792,69797],{"type":17,"tag":84,"props":69788,"children":69789},{},[69790],{"type":23,"value":69791},"Works with MCP and LLM tool calling",{"type":17,"tag":84,"props":69793,"children":69794},{},[69795],{"type":23,"value":69796},"Supports real-time read/write actions",{"type":17,"tag":84,"props":69798,"children":69799},{},[69800],{"type":23,"value":69801},"No stale data in agent workflows",{"type":17,"tag":29,"props":69803,"children":69804},{},[69805],{"type":23,"value":69806},"This allows teams to:",{"type":17,"tag":80,"props":69808,"children":69809},{},[69810,69815,69820],{"type":17,"tag":84,"props":69811,"children":69812},{},[69813],{"type":23,"value":69814},"launch integrations in days, not months",{"type":17,"tag":84,"props":69816,"children":69817},{},[69818],{"type":23,"value":69819},"avoid maintaining dozens of APIs",{"type":17,"tag":84,"props":69821,"children":69822},{},[69823],{"type":23,"value":69824},"support real-time product features",{"type":17,"tag":68,"props":69826,"children":69828},{"id":69827},"which-integration-architecture-should-you-choose",[69829],{"type":23,"value":69830},"Which integration architecture should you choose?",{"type":17,"tag":29,"props":69832,"children":69833},{},[69834],{"type":23,"value":69835},"The right approach depends on your product requirements.",{"type":17,"tag":29,"props":69837,"children":69838},{},[69839],{"type":17,"tag":48,"props":69840,"children":69841},{},[69842],{"type":23,"value":69843},"Choose in-house if:",{"type":17,"tag":80,"props":69845,"children":69846},{},[69847,69852,69857],{"type":17,"tag":84,"props":69848,"children":69849},{},[69850],{"type":23,"value":69851},"you only need 1–2 integrations",{"type":17,"tag":84,"props":69853,"children":69854},{},[69855],{"type":23,"value":69856},"you require full custom control",{"type":17,"tag":84,"props":69858,"children":69859},{},[69860],{"type":23,"value":69861},"you have dedicated engineering resources",{"type":17,"tag":29,"props":69863,"children":69864},{},[69865],{"type":17,"tag":48,"props":69866,"children":69867},{},[69868],{"type":23,"value":69869},"Choose embedded iPaaS if:",{"type":17,"tag":80,"props":69871,"children":69872},{},[69873,69878,69883],{"type":17,"tag":84,"props":69874,"children":69875},{},[69876],{"type":23,"value":69877},"you are building internal workflows",{"type":17,"tag":84,"props":69879,"children":69880},{},[69881],{"type":23,"value":69882},"real-time data is not critical",{"type":17,"tag":84,"props":69884,"children":69885},{},[69886],{"type":23,"value":69887},"you need non-technical tooling",{"type":17,"tag":29,"props":69889,"children":69890},{},[69891],{"type":17,"tag":48,"props":69892,"children":69893},{},[69894],{"type":23,"value":69895},"Choose first-gen unified APIs if:",{"type":17,"tag":80,"props":69897,"children":69898},{},[69899,69904],{"type":17,"tag":84,"props":69900,"children":69901},{},[69902],{"type":23,"value":69903},"you need faster integration delivery",{"type":17,"tag":84,"props":69905,"children":69906},{},[69907],{"type":23,"value":69908},"some data latency is acceptable",{"type":17,"tag":29,"props":69910,"children":69911},{},[69912],{"type":17,"tag":48,"props":69913,"children":69914},{},[69915],{"type":23,"value":69916},"Choose real-time unified APIs if:",{"type":17,"tag":80,"props":69918,"children":69919},{},[69920,69925,69930],{"type":17,"tag":84,"props":69921,"children":69922},{},[69923],{"type":23,"value":69924},"your product depends on live data",{"type":17,"tag":84,"props":69926,"children":69927},{},[69928],{"type":23,"value":69929},"you are building AI-powered features",{"type":17,"tag":84,"props":69931,"children":69932},{},[69933],{"type":23,"value":69934},"you want minimal maintenance and compliance overhead",{"type":17,"tag":68,"props":69936,"children":69937},{"id":7672},[69938],{"type":23,"value":7675},{"type":17,"tag":80,"props":69940,"children":69941},{},[69942,69947,69952,69957,69962],{"type":17,"tag":84,"props":69943,"children":69944},{},[69945],{"type":23,"value":69946},"iPaaS platforms are designed for workflows, not product integrations",{"type":17,"tag":84,"props":69948,"children":69949},{},[69950],{"type":23,"value":69951},"In-house integrations offer control but do not scale",{"type":17,"tag":84,"props":69953,"children":69954},{},[69955],{"type":23,"value":69956},"First-generation unified APIs simplify development but rely on cached data",{"type":17,"tag":84,"props":69958,"children":69959},{},[69960],{"type":23,"value":69961},"Real-time unified APIs eliminate storage and sync delays",{"type":17,"tag":84,"props":69963,"children":69964},{},[69965],{"type":23,"value":69966},"Modern SaaS products require live, structured, and reliable data access",{"type":17,"tag":68,"props":69968,"children":69969},{"id":1552},[69970],{"type":23,"value":1555},{"type":17,"tag":29,"props":69972,"children":69973},{},[69974],{"type":23,"value":69975},"iPaaS was an important step in the evolution of integrations, but it is no longer the best fit for modern SaaS products.",{"type":17,"tag":29,"props":69977,"children":69978},{},[69979],{"type":23,"value":69980},"As integration requirements shift toward:",{"type":17,"tag":80,"props":69982,"children":69983},{},[69984,69989,69994],{"type":17,"tag":84,"props":69985,"children":69986},{},[69987],{"type":23,"value":69988},"real-time data",{"type":17,"tag":84,"props":69990,"children":69991},{},[69992],{"type":23,"value":69993},"AI-native workflows",{"type":17,"tag":84,"props":69995,"children":69996},{},[69997],{"type":23,"value":69998},"large-scale integration coverage",{"type":17,"tag":29,"props":70000,"children":70001},{},[70002],{"type":23,"value":70003},"teams are moving toward architectures that are:",{"type":17,"tag":80,"props":70005,"children":70006},{},[70007,70012,70017],{"type":17,"tag":84,"props":70008,"children":70009},{},[70010],{"type":23,"value":70011},"stateless",{"type":17,"tag":84,"props":70013,"children":70014},{},[70015],{"type":23,"value":70016},"real-time",{"type":17,"tag":84,"props":70018,"children":70019},{},[70020],{"type":23,"value":70021},"API-first",{"type":17,"tag":29,"props":70023,"children":70024},{},[70025],{"type":23,"value":70026},"Real-time unified APIs represent that shift.",{"type":17,"tag":29,"props":70028,"children":70029},{},[70030,70031],{"type":23,"value":1609},{"type":17,"tag":133,"props":70032,"children":70034},{"href":1612,"rel":70033},[214],[70035],{"type":23,"value":1616},{"type":17,"tag":29,"props":70037,"children":70038},{},[70039,70040],{"type":23,"value":1609},{"type":17,"tag":133,"props":70041,"children":70043},{"href":1623,"rel":70042},[214],[70044],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":70046},[70047,70048,70055,70056,70061,70062,70063,70064],{"id":68789,"depth":1629,"text":68792},{"id":68902,"depth":1629,"text":68905,"children":70049},[70050,70051,70052,70053,70054],{"id":68908,"depth":1635,"text":68911},{"id":68992,"depth":1635,"text":68995},{"id":69101,"depth":1635,"text":69104},{"id":69202,"depth":1635,"text":69205},{"id":69283,"depth":1635,"text":69286},{"id":69343,"depth":1629,"text":69346},{"id":69519,"depth":1629,"text":69522,"children":70057},[70058,70059,70060],{"id":69530,"depth":1635,"text":69533},{"id":69583,"depth":1635,"text":69586},{"id":69617,"depth":1635,"text":69620},{"id":69650,"depth":1629,"text":69653},{"id":69827,"depth":1629,"text":69830},{"id":7672,"depth":1629,"text":7675},{"id":1552,"depth":1629,"text":1555},"content:blog:best_ipaas_alternatives_for_saas_integrations_in_2026_unified_apis_in_house_and_real_time_architectures.md","blog/best_ipaas_alternatives_for_saas_integrations_in_2026_unified_apis_in_house_and_real_time_architectures.md","blog/best_ipaas_alternatives_for_saas_integrations_in_2026_unified_apis_in_house_and_real_time_architectures",{"_path":70069,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":70070,"description":70071,"img":70072,"date":70073,"tag":12,"body":70074,"_type":1677,"_id":72199,"_source":1679,"_file":72200,"_stem":72201,"_extension":1682},"/blog/how_to_integrate_with_stripe_api_a_step_by_step_guide_for_developers","How to Integrate with Stripe API: A Step-by-Step Guide for Developers","A Stripe API integration lets your product process payments, manage subscriptions, create invoices, issue refunds, and synchronize billing data with Stripe...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with_stripe_api_a_step_by_step_guide_for_developers-icon.png","2026-03-10T12:41:00.000Z",{"type":14,"children":70075,"toc":72151},[70076,70081,70084,70092,70103,70108,70112,70149,70160,70165,70188,70194,70200,70211,70216,70225,70230,70239,70257,70275,70285,70291,70301,70306,70387,70392,70401,70406,70424,70435,70441,70453,70465,70469,70478,70490,70501,70507,70512,70517,70522,70528,70537,70542,70562,70566,70575,70586,70592,70603,70608,70614,70623,70628,70637,70642,70651,70655,70664,70675,70681,70692,70704,70709,70718,70729,70734,70739,70745,70754,70759,70768,70772,70781,70792,70797,70802,70808,70817,70822,70831,70835,70844,70855,70860,70865,70871,70880,70884,70893,70904,70910,70927,70932,70943,70948,70957,70962,70971,70976,70985,70990,70999,71005,71016,71021,71030,71034,71043,71047,71056,71061,71070,71076,71081,71085,71094,71099,71108,71113,71125,71130,71139,71145,71150,71155,71164,71169,71178,71183,71209,71214,71223,71229,71240,71252,71261,71266,71275,71279,71288,71293,71302,71308,71313,71354,71359,71371,71377,71382,71387,71396,71402,71413,71422,71427,71436,71447,71453,71458,71463,71585,71591,71595,71600,71609,71614,71623,71628,71637,71641,71650,71653,71657,71661,71670,71674,71683,71687,71695,71698,71702,71706,71714,71718,71727,71731,71739,71742,71746,71750,71758,71762,71771,71775,71783,71786,71792,71797,71806,71811,71820,71825,71834,71839,71848,71853,71862,71867,71876,71882,71887,71894,71899,71903,71912,71919,71924,71929,71938,71943,71952,71958,71963,71968,71976,71981,71986,72004,72010,72016,72039,72045,72068,72072,72077,72082,72087,72119,72130,72135,72143],{"type":17,"tag":18,"props":70077,"children":70079},{"id":70078},"how-to-integrate-with-stripe-api-a-step-by-step-guide-for-developers",[70080],{"type":23,"value":70070},{"type":17,"tag":25,"props":70082,"children":70083},{},[],{"type":17,"tag":29,"props":70085,"children":70086},{},[70087],{"type":17,"tag":33,"props":70088,"children":70089},{},[70090],{"type":23,"value":70091},"March 10, 2026",{"type":17,"tag":29,"props":70093,"children":70094},{},[70095,70096,70101],{"type":23,"value":9619},{"type":17,"tag":48,"props":70097,"children":70098},{},[70099],{"type":23,"value":70100},"Stripe API integration",{"type":23,"value":70102}," lets your product process payments, manage subscriptions, create invoices, issue refunds, and synchronize billing data with Stripe accounts.",{"type":17,"tag":29,"props":70104,"children":70105},{},[70106],{"type":23,"value":70107},"For SaaS companies selling into ecommerce, marketplaces, or subscription businesses, Stripe is often the financial backbone of the product.",{"type":17,"tag":29,"props":70109,"children":70110},{},[70111],{"type":23,"value":53837},{"type":17,"tag":80,"props":70113,"children":70114},{},[70115,70120,70125,70130,70135,70140],{"type":17,"tag":84,"props":70116,"children":70117},{},[70118],{"type":23,"value":70119},"Creating payments and PaymentIntents",{"type":17,"tag":84,"props":70121,"children":70122},{},[70123],{"type":23,"value":70124},"Managing customers and subscriptions",{"type":17,"tag":84,"props":70126,"children":70127},{},[70128],{"type":23,"value":70129},"Generating invoices",{"type":17,"tag":84,"props":70131,"children":70132},{},[70133],{"type":23,"value":70134},"Handling refunds",{"type":17,"tag":84,"props":70136,"children":70137},{},[70138],{"type":23,"value":70139},"Synchronizing billing data",{"type":17,"tag":84,"props":70141,"children":70142},{},[70143,70145],{"type":23,"value":70144},"Listening to payment events via ",{"type":17,"tag":133,"props":70146,"children":70147},{"href":4999},[70148],{"type":23,"value":5002},{"type":17,"tag":29,"props":70150,"children":70151},{},[70152,70154,70158],{"type":23,"value":70153},"But a production-grade Stripe integration involves more than sending a payment request. You need to design for idempotency, retries, ",{"type":17,"tag":133,"props":70155,"children":70156},{"href":1857},[70157],{"type":23,"value":1860},{"type":23,"value":70159},", webhook reliability, and multi-account platforms like Stripe Connect.",{"type":17,"tag":29,"props":70161,"children":70162},{},[70163],{"type":23,"value":70164},"This guide covers:",{"type":17,"tag":6154,"props":70166,"children":70167},{},[70168,70173,70178,70183],{"type":17,"tag":84,"props":70169,"children":70170},{},[70171],{"type":23,"value":70172},"How to integrate directly with the Stripe API",{"type":17,"tag":84,"props":70174,"children":70175},{},[70176],{"type":23,"value":70177},"The operational complexity you will own",{"type":17,"tag":84,"props":70179,"children":70180},{},[70181],{"type":23,"value":70182},"How to integrate Stripe using Unified's Payment and Accounting APIs",{"type":17,"tag":84,"props":70184,"children":70185},{},[70186],{"type":23,"value":70187},"When to build direct vs use an integration layer",{"type":17,"tag":68,"props":70189,"children":70191},{"id":70190},"direct-stripe-api-integration",[70192],{"type":23,"value":70193},"Direct Stripe API integration",{"type":17,"tag":239,"props":70195,"children":70197},{"id":70196},"step-1-understand-the-stripe-api-model",[70198],{"type":23,"value":70199},"Step 1: Understand the Stripe API model",{"type":17,"tag":29,"props":70201,"children":70202},{},[70203,70205,70210],{"type":23,"value":70204},"Stripe provides a ",{"type":17,"tag":48,"props":70206,"children":70207},{},[70208],{"type":23,"value":70209},"REST API with resource-oriented endpoints",{"type":23,"value":54},{"type":17,"tag":29,"props":70212,"children":70213},{},[70214],{"type":23,"value":70215},"All endpoints are rooted under:",{"type":17,"tag":6893,"props":70217,"children":70220},{"className":70218,"code":70219,"language":20901,"meta":23},[20899],"https://api.stripe.com\n",[70221],{"type":17,"tag":6121,"props":70222,"children":70223},{"__ignoreMap":7},[70224],{"type":23,"value":70219},{"type":17,"tag":29,"props":70226,"children":70227},{},[70228],{"type":23,"value":70229},"Requests use standard HTTP methods:",{"type":17,"tag":6893,"props":70231,"children":70234},{"className":70232,"code":70233,"language":20901,"meta":23},[20899],"GET\nPOST\nPUT\nDELETE\n",[70235],{"type":17,"tag":6121,"props":70236,"children":70237},{"__ignoreMap":7},[70238],{"type":23,"value":70233},{"type":17,"tag":29,"props":70240,"children":70241},{},[70242,70244,70249,70251,70256],{"type":23,"value":70243},"Requests typically send ",{"type":17,"tag":48,"props":70245,"children":70246},{},[70247],{"type":23,"value":70248},"form-encoded bodies",{"type":23,"value":70250},", while responses are always ",{"type":17,"tag":48,"props":70252,"children":70253},{},[70254],{"type":23,"value":70255},"JSON",{"type":23,"value":54},{"type":17,"tag":29,"props":70258,"children":70259},{},[70260,70262,70267,70269,70274],{"type":23,"value":70261},"Stripe's documentation explains that each API request operates on a ",{"type":17,"tag":48,"props":70263,"children":70264},{},[70265],{"type":23,"value":70266},"single object",{"type":23,"value":70268},", meaning the API does ",{"type":17,"tag":48,"props":70270,"children":70271},{},[70272],{"type":23,"value":70273},"not support bulk updates",{"type":23,"value":54},{"type":17,"tag":29,"props":70276,"children":70277},{},[70278,70280],{"type":23,"value":70279},"Stripe API reference: ",{"type":17,"tag":133,"props":70281,"children":70283},{"href":35775,"rel":70282},[214],[70284],{"type":23,"value":35775},{"type":17,"tag":239,"props":70286,"children":70288},{"id":70287},"step-2-authenticate-using-api-keys",[70289],{"type":23,"value":70290},"Step 2: Authenticate using API keys",{"type":17,"tag":29,"props":70292,"children":70293},{},[70294,70296,70300],{"type":23,"value":70295},"Stripe authenticates API requests using ",{"type":17,"tag":48,"props":70297,"children":70298},{},[70299],{"type":23,"value":39832},{"type":23,"value":54},{"type":17,"tag":29,"props":70302,"children":70303},{},[70304],{"type":23,"value":70305},"Keys are generated in the Stripe dashboard and come in several types:",{"type":17,"tag":7231,"props":70307,"children":70308},{},[70309,70330],{"type":17,"tag":7235,"props":70310,"children":70311},{},[70312],{"type":17,"tag":7239,"props":70313,"children":70314},{},[70315,70320,70325],{"type":17,"tag":7243,"props":70316,"children":70317},{},[70318],{"type":23,"value":70319},"Key Type",{"type":17,"tag":7243,"props":70321,"children":70322},{},[70323],{"type":23,"value":70324},"Prefix",{"type":17,"tag":7243,"props":70326,"children":70327},{},[70328],{"type":23,"value":70329},"Usage",{"type":17,"tag":7259,"props":70331,"children":70332},{},[70333,70351,70369],{"type":17,"tag":7239,"props":70334,"children":70335},{},[70336,70341,70346],{"type":17,"tag":7266,"props":70337,"children":70338},{},[70339],{"type":23,"value":70340},"Publishable",{"type":17,"tag":7266,"props":70342,"children":70343},{},[70344],{"type":23,"value":70345},"pk_test / pk_live",{"type":17,"tag":7266,"props":70347,"children":70348},{},[70349],{"type":23,"value":70350},"client-side use",{"type":17,"tag":7239,"props":70352,"children":70353},{},[70354,70359,70364],{"type":17,"tag":7266,"props":70355,"children":70356},{},[70357],{"type":23,"value":70358},"Secret",{"type":17,"tag":7266,"props":70360,"children":70361},{},[70362],{"type":23,"value":70363},"sk_test / sk_live",{"type":17,"tag":7266,"props":70365,"children":70366},{},[70367],{"type":23,"value":70368},"server-side API calls",{"type":17,"tag":7239,"props":70370,"children":70371},{},[70372,70377,70382],{"type":17,"tag":7266,"props":70373,"children":70374},{},[70375],{"type":23,"value":70376},"Restricted",{"type":17,"tag":7266,"props":70378,"children":70379},{},[70380],{"type":23,"value":70381},"rk_",{"type":17,"tag":7266,"props":70383,"children":70384},{},[70385],{"type":23,"value":70386},"limited permissions",{"type":17,"tag":29,"props":70388,"children":70389},{},[70390],{"type":23,"value":70391},"Example authenticated request:",{"type":17,"tag":6893,"props":70393,"children":70396},{"className":70394,"code":70395,"language":20901,"meta":23},[20899],"curl https://api.stripe.com/v1/customers \\\n  -u sk_test_...:\n",[70397],{"type":17,"tag":6121,"props":70398,"children":70399},{"__ignoreMap":7},[70400],{"type":23,"value":70395},{"type":17,"tag":29,"props":70402,"children":70403},{},[70404],{"type":23,"value":70405},"Important security practices:",{"type":17,"tag":80,"props":70407,"children":70408},{},[70409,70414,70419],{"type":17,"tag":84,"props":70410,"children":70411},{},[70412],{"type":23,"value":70413},"Never expose secret keys in client-side code",{"type":17,"tag":84,"props":70415,"children":70416},{},[70417],{"type":23,"value":70418},"Always store keys in environment variables",{"type":17,"tag":84,"props":70420,"children":70421},{},[70422],{"type":23,"value":70423},"Only make requests over HTTPS",{"type":17,"tag":29,"props":70425,"children":70426},{},[70427,70429],{"type":23,"value":70428},"Stripe authentication docs: ",{"type":17,"tag":133,"props":70430,"children":70433},{"href":70431,"rel":70432},"https://docs.stripe.com/api/authentication",[214],[70434],{"type":23,"value":70431},{"type":17,"tag":68,"props":70436,"children":70438},{"id":70437},"step-3-use-idempotency-for-safe-retries",[70439],{"type":23,"value":70440},"Step 3: Use idempotency for safe retries",{"type":17,"tag":29,"props":70442,"children":70443},{},[70444,70446,70451],{"type":23,"value":70445},"Stripe supports ",{"type":17,"tag":48,"props":70447,"children":70448},{},[70449],{"type":23,"value":70450},"idempotent requests",{"type":23,"value":70452}," to prevent duplicate operations when retries occur.",{"type":17,"tag":29,"props":70454,"children":70455},{},[70456,70458,70463],{"type":23,"value":70457},"You supply an ",{"type":17,"tag":48,"props":70459,"children":70460},{},[70461],{"type":23,"value":70462},"Idempotency-Key header",{"type":23,"value":70464}," when creating or updating objects.",{"type":17,"tag":29,"props":70466,"children":70467},{},[70468],{"type":23,"value":19878},{"type":17,"tag":6893,"props":70470,"children":70473},{"className":70471,"code":70472,"language":20901,"meta":23},[20899],"curl https://api.stripe.com/v1/customers \\\n  -H \"Idempotency-Key: 3f41c9c3-3e55-4d78-a7c8\" \\\n  -u sk_test_... \\\n  -d description=\"Example customer\"\n",[70474],{"type":17,"tag":6121,"props":70475,"children":70476},{"__ignoreMap":7},[70477],{"type":23,"value":70472},{"type":17,"tag":29,"props":70479,"children":70480},{},[70481,70483,70488],{"type":23,"value":70482},"Stripe stores the result for that key for ",{"type":17,"tag":48,"props":70484,"children":70485},{},[70486],{"type":23,"value":70487},"24 hours",{"type":23,"value":70489},", returning the same result if the request is retried.",{"type":17,"tag":29,"props":70491,"children":70492},{},[70493,70495],{"type":23,"value":70494},"Stripe idempotency docs: ",{"type":17,"tag":133,"props":70496,"children":70499},{"href":70497,"rel":70498},"https://docs.stripe.com/api/idempotent_requests",[214],[70500],{"type":23,"value":70497},{"type":17,"tag":68,"props":70502,"children":70504},{"id":70503},"core-stripe-operations",[70505],{"type":23,"value":70506},"Core Stripe operations",{"type":17,"tag":29,"props":70508,"children":70509},{},[70510],{"type":23,"value":70511},"Stripe integrations typically revolve around several core resources.",{"type":17,"tag":239,"props":70513,"children":70515},{"id":70514},"customers",[70516],{"type":23,"value":32745},{"type":17,"tag":29,"props":70518,"children":70519},{},[70520],{"type":23,"value":70521},"Customers store billing and identity information for a user.",{"type":17,"tag":239,"props":70523,"children":70525},{"id":70524},"create-customer",[70526],{"type":23,"value":70527},"Create customer",{"type":17,"tag":6893,"props":70529,"children":70532},{"className":70530,"code":70531,"language":20901,"meta":23},[20899],"POST /v1/customers\n",[70533],{"type":17,"tag":6121,"props":70534,"children":70535},{"__ignoreMap":7},[70536],{"type":23,"value":70531},{"type":17,"tag":29,"props":70538,"children":70539},{},[70540],{"type":23,"value":70541},"Common parameters:",{"type":17,"tag":80,"props":70543,"children":70544},{},[70545,70549,70553,70558],{"type":17,"tag":84,"props":70546,"children":70547},{},[70548],{"type":23,"value":18781},{"type":17,"tag":84,"props":70550,"children":70551},{},[70552],{"type":23,"value":62666},{"type":17,"tag":84,"props":70554,"children":70555},{},[70556],{"type":23,"value":70557},"phone",{"type":17,"tag":84,"props":70559,"children":70560},{},[70561],{"type":23,"value":23792},{"type":17,"tag":29,"props":70563,"children":70564},{},[70565],{"type":23,"value":19878},{"type":17,"tag":6893,"props":70567,"children":70570},{"className":70568,"code":70569,"language":20901,"meta":23},[20899],"curl https://api.stripe.com/v1/customers \\\n  -u sk_test_... \\\n  -d name=\"Jenny Rosen\" \\\n  -d email=\"jenny@example.com\"\n",[70571],{"type":17,"tag":6121,"props":70572,"children":70573},{"__ignoreMap":7},[70574],{"type":23,"value":70569},{"type":17,"tag":29,"props":70576,"children":70577},{},[70578,70580],{"type":23,"value":70579},"Stripe customers API: ",{"type":17,"tag":133,"props":70581,"children":70584},{"href":70582,"rel":70583},"https://docs.stripe.com/api/customers",[214],[70585],{"type":23,"value":70582},{"type":17,"tag":68,"props":70587,"children":70589},{"id":70588},"paymentintents",[70590],{"type":23,"value":70591},"PaymentIntents",{"type":17,"tag":29,"props":70593,"children":70594},{},[70595,70597,70601],{"type":23,"value":70596},"Stripe recommends using ",{"type":17,"tag":48,"props":70598,"children":70599},{},[70600],{"type":23,"value":70591},{"type":23,"value":70602}," instead of creating charges directly.",{"type":17,"tag":29,"props":70604,"children":70605},{},[70606],{"type":23,"value":70607},"A PaymentIntent manages the full payment lifecycle.",{"type":17,"tag":239,"props":70609,"children":70611},{"id":70610},"create-payment-intent",[70612],{"type":23,"value":70613},"Create payment intent",{"type":17,"tag":6893,"props":70615,"children":70618},{"className":70616,"code":70617,"language":20901,"meta":23},[20899],"POST /v1/payment_intents\n",[70619],{"type":17,"tag":6121,"props":70620,"children":70621},{"__ignoreMap":7},[70622],{"type":23,"value":70617},{"type":17,"tag":29,"props":70624,"children":70625},{},[70626],{"type":23,"value":70627},"Required fields:",{"type":17,"tag":6893,"props":70629,"children":70632},{"className":70630,"code":70631,"language":20901,"meta":23},[20899],"amount\ncurrency\n",[70633],{"type":17,"tag":6121,"props":70634,"children":70635},{"__ignoreMap":7},[70636],{"type":23,"value":70631},{"type":17,"tag":29,"props":70638,"children":70639},{},[70640],{"type":23,"value":70641},"Common optional parameters:",{"type":17,"tag":6893,"props":70643,"children":70646},{"className":70644,"code":70645,"language":20901,"meta":23},[20899],"customer\nautomatic_payment_methods[enabled]\npayment_method\nconfirm\n",[70647],{"type":17,"tag":6121,"props":70648,"children":70649},{"__ignoreMap":7},[70650],{"type":23,"value":70645},{"type":17,"tag":29,"props":70652,"children":70653},{},[70654],{"type":23,"value":19878},{"type":17,"tag":6893,"props":70656,"children":70659},{"className":70657,"code":70658,"language":20901,"meta":23},[20899],"curl https://api.stripe.com/v1/payment_intents \\\n  -u sk_test_... \\\n  -d amount=2000 \\\n  -d currency=usd \\\n  -d automatic_payment_methods[enabled]=true\n",[70660],{"type":17,"tag":6121,"props":70661,"children":70662},{"__ignoreMap":7},[70663],{"type":23,"value":70658},{"type":17,"tag":29,"props":70665,"children":70666},{},[70667,70669],{"type":23,"value":70668},"Stripe PaymentIntents docs: ",{"type":17,"tag":133,"props":70670,"children":70673},{"href":70671,"rel":70672},"https://docs.stripe.com/api/payment_intents",[214],[70674],{"type":23,"value":70671},{"type":17,"tag":68,"props":70676,"children":70678},{"id":70677},"charges",[70679],{"type":23,"value":70680},"Charges",{"type":17,"tag":29,"props":70682,"children":70683},{},[70684,70685,70690],{"type":23,"value":6712},{"type":17,"tag":48,"props":70686,"children":70687},{},[70688],{"type":23,"value":70689},"Charge object",{"type":23,"value":70691}," represents a completed payment.",{"type":17,"tag":29,"props":70693,"children":70694},{},[70695,70697,70702],{"type":23,"value":70696},"Modern integrations typically do ",{"type":17,"tag":48,"props":70698,"children":70699},{},[70700],{"type":23,"value":70701},"not create charges directly",{"type":23,"value":70703},", because charges are generated automatically by PaymentIntents.",{"type":17,"tag":29,"props":70705,"children":70706},{},[70707],{"type":23,"value":70708},"Retrieve charge:",{"type":17,"tag":6893,"props":70710,"children":70713},{"className":70711,"code":70712,"language":20901,"meta":23},[20899],"GET /v1/charges/{charge_id}\n",[70714],{"type":17,"tag":6121,"props":70715,"children":70716},{"__ignoreMap":7},[70717],{"type":23,"value":70712},{"type":17,"tag":29,"props":70719,"children":70720},{},[70721,70723],{"type":23,"value":70722},"Stripe charges docs: ",{"type":17,"tag":133,"props":70724,"children":70727},{"href":70725,"rel":70726},"https://docs.stripe.com/api/charges",[214],[70728],{"type":23,"value":70725},{"type":17,"tag":68,"props":70730,"children":70731},{"id":36676},[70732],{"type":23,"value":70733},"Invoices",{"type":17,"tag":29,"props":70735,"children":70736},{},[70737],{"type":23,"value":70738},"Invoices allow billing customers manually or through subscriptions.",{"type":17,"tag":239,"props":70740,"children":70742},{"id":70741},"create-invoice",[70743],{"type":23,"value":70744},"Create invoice",{"type":17,"tag":6893,"props":70746,"children":70749},{"className":70747,"code":70748,"language":20901,"meta":23},[20899],"POST /v1/invoices\n",[70750],{"type":17,"tag":6121,"props":70751,"children":70752},{"__ignoreMap":7},[70753],{"type":23,"value":70748},{"type":17,"tag":29,"props":70755,"children":70756},{},[70757],{"type":23,"value":70758},"Key parameters:",{"type":17,"tag":6893,"props":70760,"children":70763},{"className":70761,"code":70762,"language":20901,"meta":23},[20899],"customer\ncollection_method\ndue_date\nauto_advance\n",[70764],{"type":17,"tag":6121,"props":70765,"children":70766},{"__ignoreMap":7},[70767],{"type":23,"value":70762},{"type":17,"tag":29,"props":70769,"children":70770},{},[70771],{"type":23,"value":19878},{"type":17,"tag":6893,"props":70773,"children":70776},{"className":70774,"code":70775,"language":20901,"meta":23},[20899],"curl https://api.stripe.com/v1/invoices \\\n  -u sk_test_... \\\n  -d customer=cus_123\n",[70777],{"type":17,"tag":6121,"props":70778,"children":70779},{"__ignoreMap":7},[70780],{"type":23,"value":70775},{"type":17,"tag":29,"props":70782,"children":70783},{},[70784,70786],{"type":23,"value":70785},"Stripe invoices docs: ",{"type":17,"tag":133,"props":70787,"children":70790},{"href":70788,"rel":70789},"https://docs.stripe.com/api/invoices",[214],[70791],{"type":23,"value":70788},{"type":17,"tag":68,"props":70793,"children":70794},{"id":36138},[70795],{"type":23,"value":70796},"Subscriptions",{"type":17,"tag":29,"props":70798,"children":70799},{},[70800],{"type":23,"value":70801},"Subscriptions power recurring billing.",{"type":17,"tag":239,"props":70803,"children":70805},{"id":70804},"create-subscription",[70806],{"type":23,"value":70807},"Create subscription",{"type":17,"tag":6893,"props":70809,"children":70812},{"className":70810,"code":70811,"language":20901,"meta":23},[20899],"POST /v1/subscriptions\n",[70813],{"type":17,"tag":6121,"props":70814,"children":70815},{"__ignoreMap":7},[70816],{"type":23,"value":70811},{"type":17,"tag":29,"props":70818,"children":70819},{},[70820],{"type":23,"value":70821},"Required parameters:",{"type":17,"tag":6893,"props":70823,"children":70826},{"className":70824,"code":70825,"language":20901,"meta":23},[20899],"customer\nitems[0][price]\n",[70827],{"type":17,"tag":6121,"props":70828,"children":70829},{"__ignoreMap":7},[70830],{"type":23,"value":70825},{"type":17,"tag":29,"props":70832,"children":70833},{},[70834],{"type":23,"value":19878},{"type":17,"tag":6893,"props":70836,"children":70839},{"className":70837,"code":70838,"language":20901,"meta":23},[20899],"curl https://api.stripe.com/v1/subscriptions \\\n  -u sk_test_... \\\n  -d customer=cus_123 \\\n  -d items[0][price]=price_monthly\n",[70840],{"type":17,"tag":6121,"props":70841,"children":70842},{"__ignoreMap":7},[70843],{"type":23,"value":70838},{"type":17,"tag":29,"props":70845,"children":70846},{},[70847,70849],{"type":23,"value":70848},"Stripe subscriptions docs: ",{"type":17,"tag":133,"props":70850,"children":70853},{"href":70851,"rel":70852},"https://docs.stripe.com/api/subscriptions",[214],[70854],{"type":23,"value":70851},{"type":17,"tag":68,"props":70856,"children":70857},{"id":36719},[70858],{"type":23,"value":70859},"Refunds",{"type":17,"tag":29,"props":70861,"children":70862},{},[70863],{"type":23,"value":70864},"Refunds return funds from a charge or PaymentIntent.",{"type":17,"tag":239,"props":70866,"children":70868},{"id":70867},"create-refund",[70869],{"type":23,"value":70870},"Create refund",{"type":17,"tag":6893,"props":70872,"children":70875},{"className":70873,"code":70874,"language":20901,"meta":23},[20899],"POST /v1/refunds\n",[70876],{"type":17,"tag":6121,"props":70877,"children":70878},{"__ignoreMap":7},[70879],{"type":23,"value":70874},{"type":17,"tag":29,"props":70881,"children":70882},{},[70883],{"type":23,"value":19878},{"type":17,"tag":6893,"props":70885,"children":70888},{"className":70886,"code":70887,"language":20901,"meta":23},[20899],"curl https://api.stripe.com/v1/refunds \\\n  -u sk_test_... \\\n  -d payment_intent=pi_123\n",[70889],{"type":17,"tag":6121,"props":70890,"children":70891},{"__ignoreMap":7},[70892],{"type":23,"value":70887},{"type":17,"tag":29,"props":70894,"children":70895},{},[70896,70898],{"type":23,"value":70897},"Stripe refunds docs: ",{"type":17,"tag":133,"props":70899,"children":70902},{"href":70900,"rel":70901},"https://docs.stripe.com/api/refunds",[214],[70903],{"type":23,"value":70900},{"type":17,"tag":68,"props":70905,"children":70907},{"id":70906},"products-and-prices",[70908],{"type":23,"value":70909},"Products and prices",{"type":17,"tag":29,"props":70911,"children":70912},{},[70913,70915,70919,70921,70926],{"type":23,"value":70914},"Stripe separates ",{"type":17,"tag":48,"props":70916,"children":70917},{},[70918],{"type":23,"value":38575},{"type":23,"value":70920}," from ",{"type":17,"tag":48,"props":70922,"children":70923},{},[70924],{"type":23,"value":70925},"prices",{"type":23,"value":54},{"type":17,"tag":29,"props":70928,"children":70929},{},[70930],{"type":23,"value":70931},"Products describe what is sold.",{"type":17,"tag":29,"props":70933,"children":70934},{},[70935,70937,70942],{"type":23,"value":70936},"Prices define ",{"type":17,"tag":48,"props":70938,"children":70939},{},[70940],{"type":23,"value":70941},"billing amount and frequency",{"type":23,"value":54},{"type":17,"tag":29,"props":70944,"children":70945},{},[70946],{"type":23,"value":70947},"Create product:",{"type":17,"tag":6893,"props":70949,"children":70952},{"className":70950,"code":70951,"language":20901,"meta":23},[20899],"POST /v1/products\n",[70953],{"type":17,"tag":6121,"props":70954,"children":70955},{"__ignoreMap":7},[70956],{"type":23,"value":70951},{"type":17,"tag":29,"props":70958,"children":70959},{},[70960],{"type":23,"value":70961},"Create price:",{"type":17,"tag":6893,"props":70963,"children":70966},{"className":70964,"code":70965,"language":20901,"meta":23},[20899],"POST /v1/prices\n",[70967],{"type":17,"tag":6121,"props":70968,"children":70969},{"__ignoreMap":7},[70970],{"type":23,"value":70965},{"type":17,"tag":29,"props":70972,"children":70973},{},[70974],{"type":23,"value":70975},"Stripe product docs",{"type":17,"tag":29,"props":70977,"children":70978},{},[70979],{"type":17,"tag":133,"props":70980,"children":70983},{"href":70981,"rel":70982},"https://docs.stripe.com/api/products",[214],[70984],{"type":23,"value":70981},{"type":17,"tag":29,"props":70986,"children":70987},{},[70988],{"type":23,"value":70989},"Stripe price docs",{"type":17,"tag":29,"props":70991,"children":70992},{},[70993],{"type":17,"tag":133,"props":70994,"children":70997},{"href":70995,"rel":70996},"https://docs.stripe.com/api/prices",[214],[70998],{"type":23,"value":70995},{"type":17,"tag":68,"props":71000,"children":71002},{"id":71001},"stripe-pagination",[71003],{"type":23,"value":71004},"Stripe pagination",{"type":17,"tag":29,"props":71006,"children":71007},{},[71008,71010,71015],{"type":23,"value":71009},"Stripe uses ",{"type":17,"tag":48,"props":71011,"children":71012},{},[71013],{"type":23,"value":71014},"cursor-based pagination",{"type":23,"value":54},{"type":17,"tag":29,"props":71017,"children":71018},{},[71019],{"type":23,"value":71020},"List endpoints accept:",{"type":17,"tag":6893,"props":71022,"children":71025},{"className":71023,"code":71024,"language":20901,"meta":23},[20899],"limit\nstarting_after\nending_before\n",[71026],{"type":17,"tag":6121,"props":71027,"children":71028},{"__ignoreMap":7},[71029],{"type":23,"value":71024},{"type":17,"tag":29,"props":71031,"children":71032},{},[71033],{"type":23,"value":19878},{"type":17,"tag":6893,"props":71035,"children":71038},{"className":71036,"code":71037,"language":20901,"meta":23},[20899],"GET /v1/customers?limit=100\n",[71039],{"type":17,"tag":6121,"props":71040,"children":71041},{"__ignoreMap":7},[71042],{"type":23,"value":71037},{"type":17,"tag":29,"props":71044,"children":71045},{},[71046],{"type":23,"value":19936},{"type":17,"tag":6893,"props":71048,"children":71051},{"className":71049,"code":71050,"language":20901,"meta":23},[20899],"data\nhas_more\nurl\n",[71052],{"type":17,"tag":6121,"props":71053,"children":71054},{"__ignoreMap":7},[71055],{"type":23,"value":71050},{"type":17,"tag":29,"props":71057,"children":71058},{},[71059],{"type":23,"value":71060},"Stripe pagination docs",{"type":17,"tag":29,"props":71062,"children":71063},{},[71064],{"type":17,"tag":133,"props":71065,"children":71068},{"href":71066,"rel":71067},"https://docs.stripe.com/api/pagination",[214],[71069],{"type":23,"value":71066},{"type":17,"tag":68,"props":71071,"children":71073},{"id":71072},"stripe-search-api",[71074],{"type":23,"value":71075},"Stripe search API",{"type":17,"tag":29,"props":71077,"children":71078},{},[71079],{"type":23,"value":71080},"Stripe supports search endpoints for some objects.",{"type":17,"tag":29,"props":71082,"children":71083},{},[71084],{"type":23,"value":19878},{"type":17,"tag":6893,"props":71086,"children":71089},{"className":71087,"code":71088,"language":20901,"meta":23},[20899],"GET /v1/customers/search\n",[71090],{"type":17,"tag":6121,"props":71091,"children":71092},{"__ignoreMap":7},[71093],{"type":23,"value":71088},{"type":17,"tag":29,"props":71095,"children":71096},{},[71097],{"type":23,"value":71098},"Query example:",{"type":17,"tag":6893,"props":71100,"children":71103},{"className":71101,"code":71102,"language":20901,"meta":23},[20899],"email:'@example.com'\n",[71104],{"type":17,"tag":6121,"props":71105,"children":71106},{"__ignoreMap":7},[71107],{"type":23,"value":71102},{"type":17,"tag":29,"props":71109,"children":71110},{},[71111],{"type":23,"value":71112},"Important note:",{"type":17,"tag":29,"props":71114,"children":71115},{},[71116,71118,71123],{"type":23,"value":71117},"Stripe search is ",{"type":17,"tag":48,"props":71119,"children":71120},{},[71121],{"type":23,"value":71122},"eventually consistent",{"type":23,"value":71124},", so it should not be used for read-after-write workflows.",{"type":17,"tag":29,"props":71126,"children":71127},{},[71128],{"type":23,"value":71129},"Stripe search docs",{"type":17,"tag":29,"props":71131,"children":71132},{},[71133],{"type":17,"tag":133,"props":71134,"children":71137},{"href":71135,"rel":71136},"https://docs.stripe.com/search",[214],[71138],{"type":23,"value":71135},{"type":17,"tag":68,"props":71140,"children":71142},{"id":71141},"stripe-webhooks",[71143],{"type":23,"value":71144},"Stripe webhooks",{"type":17,"tag":29,"props":71146,"children":71147},{},[71148],{"type":23,"value":71149},"Stripe webhooks notify your system when events occur.",{"type":17,"tag":29,"props":71151,"children":71152},{},[71153],{"type":23,"value":71154},"Example events:",{"type":17,"tag":6893,"props":71156,"children":71159},{"className":71157,"code":71158,"language":20901,"meta":23},[20899],"payment_intent.succeeded\ninvoice.paid\ncharge.refunded\ncustomer.subscription.created\n",[71160],{"type":17,"tag":6121,"props":71161,"children":71162},{"__ignoreMap":7},[71163],{"type":23,"value":71158},{"type":17,"tag":29,"props":71165,"children":71166},{},[71167],{"type":23,"value":71168},"Webhook payloads contain:",{"type":17,"tag":6893,"props":71170,"children":71173},{"className":71171,"code":71172,"language":20901,"meta":23},[20899],"id\ntype\ncreated\ndata.object\n",[71174],{"type":17,"tag":6121,"props":71175,"children":71176},{"__ignoreMap":7},[71177],{"type":23,"value":71172},{"type":17,"tag":29,"props":71179,"children":71180},{},[71181],{"type":23,"value":71182},"Security requirements:",{"type":17,"tag":80,"props":71184,"children":71185},{},[71186,71199,71204],{"type":17,"tag":84,"props":71187,"children":71188},{},[71189,71191,71197],{"type":23,"value":71190},"Verify signatures using the ",{"type":17,"tag":6121,"props":71192,"children":71194},{"className":71193},[],[71195],{"type":23,"value":71196},"Stripe-Signature",{"type":23,"value":71198}," header",{"type":17,"tag":84,"props":71200,"children":71201},{},[71202],{"type":23,"value":71203},"Use HTTPS endpoints",{"type":17,"tag":84,"props":71205,"children":71206},{},[71207],{"type":23,"value":71208},"Treat events as idempotent",{"type":17,"tag":29,"props":71210,"children":71211},{},[71212],{"type":23,"value":71213},"Stripe webhook docs",{"type":17,"tag":29,"props":71215,"children":71216},{},[71217],{"type":17,"tag":133,"props":71218,"children":71221},{"href":71219,"rel":71220},"https://docs.stripe.com/webhooks",[214],[71222],{"type":23,"value":71219},{"type":17,"tag":68,"props":71224,"children":71226},{"id":71225},"stripe-connect-for-saas-platforms",[71227],{"type":23,"value":71228},"Stripe Connect for SaaS platforms",{"type":17,"tag":29,"props":71230,"children":71231},{},[71232,71234,71239],{"type":23,"value":71233},"Stripe Connect enables platforms to process payments for ",{"type":17,"tag":48,"props":71235,"children":71236},{},[71237],{"type":23,"value":71238},"multiple businesses",{"type":23,"value":54},{"type":17,"tag":29,"props":71241,"children":71242},{},[71243,71245,71250],{"type":23,"value":71244},"Platforms create ",{"type":17,"tag":48,"props":71246,"children":71247},{},[71248],{"type":23,"value":71249},"connected accounts",{"type":23,"value":71251},", identified by:",{"type":17,"tag":6893,"props":71253,"children":71256},{"className":71254,"code":71255,"language":20901,"meta":23},[20899],"acct_xxxxx\n",[71257],{"type":17,"tag":6121,"props":71258,"children":71259},{"__ignoreMap":7},[71260],{"type":23,"value":71255},{"type":17,"tag":29,"props":71262,"children":71263},{},[71264],{"type":23,"value":71265},"To act on behalf of a connected account, include:",{"type":17,"tag":6893,"props":71267,"children":71270},{"className":71268,"code":71269,"language":20901,"meta":23},[20899],"Stripe-Account: acct_xxxxx\n",[71271],{"type":17,"tag":6121,"props":71272,"children":71273},{"__ignoreMap":7},[71274],{"type":23,"value":71269},{"type":17,"tag":29,"props":71276,"children":71277},{},[71278],{"type":23,"value":19878},{"type":17,"tag":6893,"props":71280,"children":71283},{"className":71281,"code":71282,"language":20901,"meta":23},[20899],"curl https://api.stripe.com/v1/payment_intents \\\n  -H \"Stripe-Account: acct_123\"\n",[71284],{"type":17,"tag":6121,"props":71285,"children":71286},{"__ignoreMap":7},[71287],{"type":23,"value":71282},{"type":17,"tag":29,"props":71289,"children":71290},{},[71291],{"type":23,"value":71292},"Stripe Connect docs",{"type":17,"tag":29,"props":71294,"children":71295},{},[71296],{"type":17,"tag":133,"props":71297,"children":71300},{"href":71298,"rel":71299},"https://docs.stripe.com/connect",[214],[71301],{"type":23,"value":71298},{"type":17,"tag":68,"props":71303,"children":71305},{"id":71304},"where-stripe-integrations-become-operationally-complex",[71306],{"type":23,"value":71307},"Where Stripe integrations become operationally complex",{"type":17,"tag":29,"props":71309,"children":71310},{},[71311],{"type":23,"value":71312},"Direct Stripe integrations require handling:",{"type":17,"tag":80,"props":71314,"children":71315},{},[71316,71321,71325,71330,71334,71339,71344,71349],{"type":17,"tag":84,"props":71317,"children":71318},{},[71319],{"type":23,"value":71320},"payment state machines",{"type":17,"tag":84,"props":71322,"children":71323},{},[71324],{"type":23,"value":5921},{"type":17,"tag":84,"props":71326,"children":71327},{},[71328],{"type":23,"value":71329},"webhook ordering and duplication",{"type":17,"tag":84,"props":71331,"children":71332},{},[71333],{"type":23,"value":36317},{"type":17,"tag":84,"props":71335,"children":71336},{},[71337],{"type":23,"value":71338},"pagination across large datasets",{"type":17,"tag":84,"props":71340,"children":71341},{},[71342],{"type":23,"value":71343},"multi-account routing (Stripe Connect)",{"type":17,"tag":84,"props":71345,"children":71346},{},[71347],{"type":23,"value":71348},"API version upgrades",{"type":17,"tag":84,"props":71350,"children":71351},{},[71352],{"type":23,"value":71353},"billing reconciliation",{"type":17,"tag":29,"props":71355,"children":71356},{},[71357],{"type":23,"value":71358},"For a single billing integration this is manageable.",{"type":17,"tag":29,"props":71360,"children":71361},{},[71362,71364,71369],{"type":23,"value":71363},"For ",{"type":17,"tag":48,"props":71365,"children":71366},{},[71367],{"type":23,"value":71368},"multi-tenant SaaS products",{"type":23,"value":71370},", this becomes real integration infrastructure.",{"type":17,"tag":68,"props":71372,"children":71374},{"id":71373},"integrating-stripe-via-unified",[71375],{"type":23,"value":71376},"Integrating Stripe via Unified",{"type":17,"tag":29,"props":71378,"children":71379},{},[71380],{"type":23,"value":71381},"Unified normalizes Stripe into multiple API categories.",{"type":17,"tag":29,"props":71383,"children":71384},{},[71385],{"type":23,"value":71386},"Stripe spans:",{"type":17,"tag":6893,"props":71388,"children":71391},{"className":71389,"code":71390,"language":20901,"meta":23},[20899],"Payment\nAccounting\nCommerce\nAuthentication\nPassthrough\n",[71392],{"type":17,"tag":6121,"props":71393,"children":71394},{"__ignoreMap":7},[71395],{"type":23,"value":71390},{"type":17,"tag":239,"props":71397,"children":71399},{"id":71398},"step-1-configure-oauth-redirect",[71400],{"type":23,"value":71401},"Step 1: Configure OAuth redirect",{"type":17,"tag":29,"props":71403,"children":71404},{},[71405,71407,71411],{"type":23,"value":71406},"When registering Stripe with Unified, set the ",{"type":17,"tag":133,"props":71408,"children":71409},{"href":779},[71410],{"type":23,"value":782},{"type":23,"value":71412}," callback to:",{"type":17,"tag":6893,"props":71414,"children":71417},{"className":71415,"code":71416,"language":20901,"meta":23},[20899],"https://api.unified.to/oauth/code\n",[71418],{"type":17,"tag":6121,"props":71419,"children":71420},{"__ignoreMap":7},[71421],{"type":23,"value":71416},{"type":17,"tag":29,"props":71423,"children":71424},{},[71425],{"type":23,"value":71426},"EU region variant:",{"type":17,"tag":6893,"props":71428,"children":71431},{"className":71429,"code":71430,"language":20901,"meta":23},[20899],"https://api-eu.unified.to/oauth/code\n",[71432],{"type":17,"tag":6121,"props":71433,"children":71434},{"__ignoreMap":7},[71435],{"type":23,"value":71430},{"type":17,"tag":29,"props":71437,"children":71438},{},[71439,71441,71445],{"type":23,"value":71440},"Unified manages the OAuth handshake and returns a ",{"type":17,"tag":48,"props":71442,"children":71443},{},[71444],{"type":23,"value":25037},{"type":23,"value":71446}," used in API requests.",{"type":17,"tag":239,"props":71448,"children":71450},{"id":71449},"step-2-use-unified-normalized-objects",[71451],{"type":23,"value":71452},"Step 2: Use Unified normalized objects",{"type":17,"tag":29,"props":71454,"children":71455},{},[71456],{"type":23,"value":71457},"Unified maps Stripe resources to normalized objects.",{"type":17,"tag":29,"props":71459,"children":71460},{},[71461],{"type":23,"value":71462},"Supported Stripe objects include:",{"type":17,"tag":7231,"props":71464,"children":71465},{},[71466,71482],{"type":17,"tag":7235,"props":71467,"children":71468},{},[71469],{"type":17,"tag":7239,"props":71470,"children":71471},{},[71472,71477],{"type":17,"tag":7243,"props":71473,"children":71474},{},[71475],{"type":23,"value":71476},"Unified Object",{"type":17,"tag":7243,"props":71478,"children":71479},{},[71480],{"type":23,"value":71481},"Stripe Resource",{"type":17,"tag":7259,"props":71483,"children":71484},{},[71485,71498,71511,71523,71535,71547,71560,71572],{"type":17,"tag":7239,"props":71486,"children":71487},{},[71488,71493],{"type":17,"tag":7266,"props":71489,"children":71490},{},[71491],{"type":23,"value":71492},"payment",{"type":17,"tag":7266,"props":71494,"children":71495},{},[71496],{"type":23,"value":71497},"PaymentIntent / Charge",{"type":17,"tag":7239,"props":71499,"children":71500},{},[71501,71506],{"type":17,"tag":7266,"props":71502,"children":71503},{},[71504],{"type":23,"value":71505},"payout",{"type":17,"tag":7266,"props":71507,"children":71508},{},[71509],{"type":23,"value":71510},"Payout",{"type":17,"tag":7239,"props":71512,"children":71513},{},[71514,71518],{"type":17,"tag":7266,"props":71515,"children":71516},{},[71517],{"type":23,"value":36888},{"type":17,"tag":7266,"props":71519,"children":71520},{},[71521],{"type":23,"value":71522},"Refund",{"type":17,"tag":7239,"props":71524,"children":71525},{},[71526,71531],{"type":17,"tag":7266,"props":71527,"children":71528},{},[71529],{"type":23,"value":71530},"subscription",{"type":17,"tag":7266,"props":71532,"children":71533},{},[71534],{"type":23,"value":25991},{"type":17,"tag":7239,"props":71536,"children":71537},{},[71538,71543],{"type":17,"tag":7266,"props":71539,"children":71540},{},[71541],{"type":23,"value":71542},"accounting_contact",{"type":17,"tag":7266,"props":71544,"children":71545},{},[71546],{"type":23,"value":47609},{"type":17,"tag":7239,"props":71548,"children":71549},{},[71550,71555],{"type":17,"tag":7266,"props":71551,"children":71552},{},[71553],{"type":23,"value":71554},"accounting_invoice",{"type":17,"tag":7266,"props":71556,"children":71557},{},[71558],{"type":23,"value":71559},"Invoice",{"type":17,"tag":7239,"props":71561,"children":71562},{},[71563,71568],{"type":17,"tag":7266,"props":71564,"children":71565},{},[71566],{"type":23,"value":71567},"commerce_item",{"type":17,"tag":7266,"props":71569,"children":71570},{},[71571],{"type":23,"value":12},{"type":17,"tag":7239,"props":71573,"children":71574},{},[71575,71580],{"type":17,"tag":7266,"props":71576,"children":71577},{},[71578],{"type":23,"value":71579},"commerce_itemvariant",{"type":17,"tag":7266,"props":71581,"children":71582},{},[71583],{"type":23,"value":71584},"Price",{"type":17,"tag":68,"props":71586,"children":71588},{"id":71587},"unified-stripe-object-coverage",[71589],{"type":23,"value":71590},"Unified Stripe object coverage",{"type":17,"tag":239,"props":71592,"children":71593},{"id":71492},[71594],{"type":23,"value":25973},{"type":17,"tag":29,"props":71596,"children":71597},{},[71598],{"type":23,"value":71599},"Methods",{"type":17,"tag":6893,"props":71601,"children":71604},{"className":71602,"code":71603,"language":20901,"meta":23},[20899],"list\nget\nupdate\nremove\n",[71605],{"type":17,"tag":6121,"props":71606,"children":71607},{"__ignoreMap":7},[71608],{"type":23,"value":71603},{"type":17,"tag":29,"props":71610,"children":71611},{},[71612],{"type":23,"value":71613},"List parameters",{"type":17,"tag":6893,"props":71615,"children":71618},{"className":71616,"code":71617,"language":20901,"meta":23},[20899],"limit\noffset\ncontact_id\nupdated_gte\n",[71619],{"type":17,"tag":6121,"props":71620,"children":71621},{"__ignoreMap":7},[71622],{"type":23,"value":71617},{"type":17,"tag":29,"props":71624,"children":71625},{},[71626],{"type":23,"value":71627},"Readable fields",{"type":17,"tag":6893,"props":71629,"children":71632},{"className":71630,"code":71631,"language":20901,"meta":23},[20899],"id\ncontact_id\ncurrency\npayment_method\nreference\ntotal_amount\ninvoice_id\ncreated_at\nupdated_at\n",[71633],{"type":17,"tag":6121,"props":71634,"children":71635},{"__ignoreMap":7},[71636],{"type":23,"value":71631},{"type":17,"tag":29,"props":71638,"children":71639},{},[71640],{"type":23,"value":43896},{"type":17,"tag":6893,"props":71642,"children":71645},{"className":71643,"code":71644,"language":20901,"meta":23},[20899],"Virtual\nNative\n",[71646],{"type":17,"tag":6121,"props":71647,"children":71648},{"__ignoreMap":7},[71649],{"type":23,"value":71644},{"type":17,"tag":25,"props":71651,"children":71652},{},[],{"type":17,"tag":239,"props":71654,"children":71655},{"id":71505},[71656],{"type":23,"value":71510},{"type":17,"tag":29,"props":71658,"children":71659},{},[71660],{"type":23,"value":71599},{"type":17,"tag":6893,"props":71662,"children":71665},{"className":71663,"code":71664,"language":20901,"meta":23},[20899],"list\nget\n",[71666],{"type":17,"tag":6121,"props":71667,"children":71668},{"__ignoreMap":7},[71669],{"type":23,"value":71664},{"type":17,"tag":29,"props":71671,"children":71672},{},[71673],{"type":23,"value":71627},{"type":17,"tag":6893,"props":71675,"children":71678},{"className":71676,"code":71677,"language":20901,"meta":23},[20899],"id\nstatus\ncurrency\ntotal_amount\ncreated_at\nupdated_at\n",[71679],{"type":17,"tag":6121,"props":71680,"children":71681},{"__ignoreMap":7},[71682],{"type":23,"value":71677},{"type":17,"tag":29,"props":71684,"children":71685},{},[71686],{"type":23,"value":43896},{"type":17,"tag":6893,"props":71688,"children":71690},{"className":71689,"code":71644,"language":20901,"meta":23},[20899],[71691],{"type":17,"tag":6121,"props":71692,"children":71693},{"__ignoreMap":7},[71694],{"type":23,"value":71644},{"type":17,"tag":25,"props":71696,"children":71697},{},[],{"type":17,"tag":239,"props":71699,"children":71700},{"id":36888},[71701],{"type":23,"value":71522},{"type":17,"tag":29,"props":71703,"children":71704},{},[71705],{"type":23,"value":71599},{"type":17,"tag":6893,"props":71707,"children":71709},{"className":71708,"code":71664,"language":20901,"meta":23},[20899],[71710],{"type":17,"tag":6121,"props":71711,"children":71712},{"__ignoreMap":7},[71713],{"type":23,"value":71664},{"type":17,"tag":29,"props":71715,"children":71716},{},[71717],{"type":23,"value":71627},{"type":17,"tag":6893,"props":71719,"children":71722},{"className":71720,"code":71721,"language":20901,"meta":23},[20899],"id\npayment_id\ncurrency\nstatus\ntotal_amount\ncreated_at\nupdated_at\n",[71723],{"type":17,"tag":6121,"props":71724,"children":71725},{"__ignoreMap":7},[71726],{"type":23,"value":71721},{"type":17,"tag":29,"props":71728,"children":71729},{},[71730],{"type":23,"value":43896},{"type":17,"tag":6893,"props":71732,"children":71734},{"className":71733,"code":71644,"language":20901,"meta":23},[20899],[71735],{"type":17,"tag":6121,"props":71736,"children":71737},{"__ignoreMap":7},[71738],{"type":23,"value":71644},{"type":17,"tag":25,"props":71740,"children":71741},{},[],{"type":17,"tag":239,"props":71743,"children":71744},{"id":71530},[71745],{"type":23,"value":25991},{"type":17,"tag":29,"props":71747,"children":71748},{},[71749],{"type":23,"value":71599},{"type":17,"tag":6893,"props":71751,"children":71753},{"className":71752,"code":71664,"language":20901,"meta":23},[20899],[71754],{"type":17,"tag":6121,"props":71755,"children":71756},{"__ignoreMap":7},[71757],{"type":23,"value":71664},{"type":17,"tag":29,"props":71759,"children":71760},{},[71761],{"type":23,"value":71627},{"type":17,"tag":6893,"props":71763,"children":71766},{"className":71764,"code":71765,"language":20901,"meta":23},[20899],"id\nstatus\ninterval\ninterval_unit\ninvoice_id\ncurrency\ncurrent_period_start_at\ncurrent_period_end_at\n",[71767],{"type":17,"tag":6121,"props":71768,"children":71769},{"__ignoreMap":7},[71770],{"type":23,"value":71765},{"type":17,"tag":29,"props":71772,"children":71773},{},[71774],{"type":23,"value":43896},{"type":17,"tag":6893,"props":71776,"children":71778},{"className":71777,"code":71644,"language":20901,"meta":23},[20899],[71779],{"type":17,"tag":6121,"props":71780,"children":71781},{"__ignoreMap":7},[71782],{"type":23,"value":71644},{"type":17,"tag":25,"props":71784,"children":71785},{},[],{"type":17,"tag":68,"props":71787,"children":71789},{"id":71788},"unified-api-examples",[71790],{"type":23,"value":71791},"Unified API examples",{"type":17,"tag":29,"props":71793,"children":71794},{},[71795],{"type":23,"value":71796},"List customers:",{"type":17,"tag":6893,"props":71798,"children":71801},{"className":71799,"code":71800,"language":20901,"meta":23},[20899],"GET /ticketing/{connection_id}/customer\n",[71802],{"type":17,"tag":6121,"props":71803,"children":71804},{"__ignoreMap":7},[71805],{"type":23,"value":71800},{"type":17,"tag":29,"props":71807,"children":71808},{},[71809],{"type":23,"value":71810},"Create customer:",{"type":17,"tag":6893,"props":71812,"children":71815},{"className":71813,"code":71814,"language":20901,"meta":23},[20899],"POST /ticketing/{connection_id}/customer\n",[71816],{"type":17,"tag":6121,"props":71817,"children":71818},{"__ignoreMap":7},[71819],{"type":23,"value":71814},{"type":17,"tag":29,"props":71821,"children":71822},{},[71823],{"type":23,"value":71824},"List payments:",{"type":17,"tag":6893,"props":71826,"children":71829},{"className":71827,"code":71828,"language":20901,"meta":23},[20899],"GET /payment/{connection_id}/payment\n",[71830],{"type":17,"tag":6121,"props":71831,"children":71832},{"__ignoreMap":7},[71833],{"type":23,"value":71828},{"type":17,"tag":29,"props":71835,"children":71836},{},[71837],{"type":23,"value":71838},"Create payment:",{"type":17,"tag":6893,"props":71840,"children":71843},{"className":71841,"code":71842,"language":20901,"meta":23},[20899],"POST /payment/{connection_id}/payment\n",[71844],{"type":17,"tag":6121,"props":71845,"children":71846},{"__ignoreMap":7},[71847],{"type":23,"value":71842},{"type":17,"tag":29,"props":71849,"children":71850},{},[71851],{"type":23,"value":71852},"List invoices:",{"type":17,"tag":6893,"props":71854,"children":71857},{"className":71855,"code":71856,"language":20901,"meta":23},[20899],"GET /accounting/{connection_id}/invoice\n",[71858],{"type":17,"tag":6121,"props":71859,"children":71860},{"__ignoreMap":7},[71861],{"type":23,"value":71856},{"type":17,"tag":29,"props":71863,"children":71864},{},[71865],{"type":23,"value":71866},"Create invoice:",{"type":17,"tag":6893,"props":71868,"children":71871},{"className":71869,"code":71870,"language":20901,"meta":23},[20899],"POST /accounting/{connection_id}/invoice\n",[71872],{"type":17,"tag":6121,"props":71873,"children":71874},{"__ignoreMap":7},[71875],{"type":23,"value":71870},{"type":17,"tag":68,"props":71877,"children":71879},{"id":71878},"unified-webhooks",[71880],{"type":23,"value":71881},"Unified webhooks",{"type":17,"tag":29,"props":71883,"children":71884},{},[71885],{"type":23,"value":71886},"Unified supports two webhook types.",{"type":17,"tag":29,"props":71888,"children":71889},{},[71890],{"type":17,"tag":48,"props":71891,"children":71892},{},[71893],{"type":23,"value":9024},{"type":17,"tag":29,"props":71895,"children":71896},{},[71897],{"type":23,"value":71898},"Forward events directly from Stripe.",{"type":17,"tag":29,"props":71900,"children":71901},{},[71902],{"type":23,"value":377},{"type":17,"tag":6893,"props":71904,"children":71907},{"className":71905,"code":71906,"language":20901,"meta":23},[20899],"payment_intent.succeeded\ninvoice.paid\ncharge.refunded\ncustomer.subscription.updated\n",[71908],{"type":17,"tag":6121,"props":71909,"children":71910},{"__ignoreMap":7},[71911],{"type":23,"value":71906},{"type":17,"tag":29,"props":71913,"children":71914},{},[71915],{"type":17,"tag":48,"props":71916,"children":71917},{},[71918],{"type":23,"value":9256},{"type":17,"tag":29,"props":71920,"children":71921},{},[71922],{"type":23,"value":71923},"When providers lack native webhook support, Unified polls for changes and emits events.",{"type":17,"tag":29,"props":71925,"children":71926},{},[71927],{"type":23,"value":71928},"Webhook payload includes:",{"type":17,"tag":6893,"props":71930,"children":71933},{"className":71931,"code":71932,"language":20901,"meta":23},[20899],"data\nwebhook metadata\nnonce\nsig256\ntype\n",[71934],{"type":17,"tag":6121,"props":71935,"children":71936},{"__ignoreMap":7},[71937],{"type":23,"value":71932},{"type":17,"tag":29,"props":71939,"children":71940},{},[71941],{"type":23,"value":71942},"Possible types:",{"type":17,"tag":6893,"props":71944,"children":71947},{"className":71945,"code":71946,"language":20901,"meta":23},[20899],"INITIAL-PARTIAL\nINITIAL-COMPLETE\nVIRTUAL\nNATIVE\n",[71948],{"type":17,"tag":6121,"props":71949,"children":71950},{"__ignoreMap":7},[71951],{"type":23,"value":71946},{"type":17,"tag":68,"props":71953,"children":71955},{"id":71954},"unified-passthrough",[71956],{"type":23,"value":71957},"Unified passthrough",{"type":17,"tag":29,"props":71959,"children":71960},{},[71961],{"type":23,"value":71962},"When Stripe features are not normalized, use passthrough.",{"type":17,"tag":29,"props":71964,"children":71965},{},[71966],{"type":23,"value":71967},"Supported methods:",{"type":17,"tag":6893,"props":71969,"children":71971},{"className":71970,"code":70233,"language":20901,"meta":23},[20899],[71972],{"type":17,"tag":6121,"props":71973,"children":71974},{"__ignoreMap":7},[71975],{"type":23,"value":70233},{"type":17,"tag":29,"props":71977,"children":71978},{},[71979],{"type":23,"value":71980},"Passthrough forwards the request to the Stripe API using the existing connection authentication.",{"type":17,"tag":29,"props":71982,"children":71983},{},[71984],{"type":23,"value":71985},"Use cases:",{"type":17,"tag":80,"props":71987,"children":71988},{},[71989,71994,71999],{"type":17,"tag":84,"props":71990,"children":71991},{},[71992],{"type":23,"value":71993},"creating refunds with custom options",{"type":17,"tag":84,"props":71995,"children":71996},{},[71997],{"type":23,"value":71998},"managing Stripe products or prices",{"type":17,"tag":84,"props":72000,"children":72001},{},[72002],{"type":23,"value":72003},"calling beta Stripe APIs",{"type":17,"tag":68,"props":72005,"children":72007},{"id":72006},"direct-vs-unified-when-to-choose-each",[72008],{"type":23,"value":72009},"Direct vs Unified: when to choose each",{"type":17,"tag":239,"props":72011,"children":72013},{"id":72012},"build-directly-with-stripe-if",[72014],{"type":23,"value":72015},"Build directly with Stripe if",{"type":17,"tag":80,"props":72017,"children":72018},{},[72019,72024,72029,72034],{"type":17,"tag":84,"props":72020,"children":72021},{},[72022],{"type":23,"value":72023},"Stripe is a core product feature",{"type":17,"tag":84,"props":72025,"children":72026},{},[72027],{"type":23,"value":72028},"you need full control over PaymentIntent flows",{"type":17,"tag":84,"props":72030,"children":72031},{},[72032],{"type":23,"value":72033},"you rely heavily on Stripe Connect",{"type":17,"tag":84,"props":72035,"children":72036},{},[72037],{"type":23,"value":72038},"you need advanced billing features",{"type":17,"tag":239,"props":72040,"children":72042},{"id":72041},"use-unified-if",[72043],{"type":23,"value":72044},"Use Unified if",{"type":17,"tag":80,"props":72046,"children":72047},{},[72048,72053,72058,72063],{"type":17,"tag":84,"props":72049,"children":72050},{},[72051],{"type":23,"value":72052},"Stripe is one of several payment providers",{"type":17,"tag":84,"props":72054,"children":72055},{},[72056],{"type":23,"value":72057},"you want normalized billing objects",{"type":17,"tag":84,"props":72059,"children":72060},{},[72061],{"type":23,"value":72062},"you want webhook handling abstracted",{"type":17,"tag":84,"props":72064,"children":72065},{},[72066],{"type":23,"value":72067},"you want to reduce integration maintenance",{"type":17,"tag":68,"props":72069,"children":72070},{"id":1552},[72071],{"type":23,"value":1555},{"type":17,"tag":29,"props":72073,"children":72074},{},[72075],{"type":23,"value":72076},"Stripe is one of the most powerful payment APIs available.",{"type":17,"tag":29,"props":72078,"children":72079},{},[72080],{"type":23,"value":72081},"But a production integration involves much more than sending a payment request.",{"type":17,"tag":29,"props":72083,"children":72084},{},[72085],{"type":23,"value":72086},"The real complexity appears in:",{"type":17,"tag":80,"props":72088,"children":72089},{},[72090,72095,72100,72104,72109,72114],{"type":17,"tag":84,"props":72091,"children":72092},{},[72093],{"type":23,"value":72094},"idempotent request handling",{"type":17,"tag":84,"props":72096,"children":72097},{},[72098],{"type":23,"value":72099},"webhook reliability",{"type":17,"tag":84,"props":72101,"children":72102},{},[72103],{"type":23,"value":36317},{"type":17,"tag":84,"props":72105,"children":72106},{},[72107],{"type":23,"value":72108},"multi-account routing",{"type":17,"tag":84,"props":72110,"children":72111},{},[72112],{"type":23,"value":72113},"API versioning",{"type":17,"tag":84,"props":72115,"children":72116},{},[72117],{"type":23,"value":72118},"large-scale billing operations",{"type":17,"tag":29,"props":72120,"children":72121},{},[72122,72124,72129],{"type":23,"value":72123},"Design your Stripe integration around ",{"type":17,"tag":48,"props":72125,"children":72126},{},[72127],{"type":23,"value":72128},"PaymentIntents, webhooks, and idempotency from day one",{"type":23,"value":54},{"type":17,"tag":29,"props":72131,"children":72132},{},[72133],{"type":23,"value":72134},"If Stripe is one of many billing integrations your product must support, a normalized integration layer can significantly reduce engineering overhead.",{"type":17,"tag":29,"props":72136,"children":72137},{},[72138],{"type":17,"tag":133,"props":72139,"children":72141},{"href":1612,"rel":72140},[214],[72142],{"type":23,"value":44481},{"type":17,"tag":29,"props":72144,"children":72145},{},[72146],{"type":17,"tag":133,"props":72147,"children":72149},{"href":1623,"rel":72148},[214],[72150],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":72152},[72153,72157,72158,72162,72165,72166,72169,72172,72175,72176,72177,72178,72179,72180,72181,72185,72191,72192,72193,72194,72198],{"id":70190,"depth":1629,"text":70193,"children":72154},[72155,72156],{"id":70196,"depth":1635,"text":70199},{"id":70287,"depth":1635,"text":70290},{"id":70437,"depth":1629,"text":70440},{"id":70503,"depth":1629,"text":70506,"children":72159},[72160,72161],{"id":70514,"depth":1635,"text":32745},{"id":70524,"depth":1635,"text":70527},{"id":70588,"depth":1629,"text":70591,"children":72163},[72164],{"id":70610,"depth":1635,"text":70613},{"id":70677,"depth":1629,"text":70680},{"id":36676,"depth":1629,"text":70733,"children":72167},[72168],{"id":70741,"depth":1635,"text":70744},{"id":36138,"depth":1629,"text":70796,"children":72170},[72171],{"id":70804,"depth":1635,"text":70807},{"id":36719,"depth":1629,"text":70859,"children":72173},[72174],{"id":70867,"depth":1635,"text":70870},{"id":70906,"depth":1629,"text":70909},{"id":71001,"depth":1629,"text":71004},{"id":71072,"depth":1629,"text":71075},{"id":71141,"depth":1629,"text":71144},{"id":71225,"depth":1629,"text":71228},{"id":71304,"depth":1629,"text":71307},{"id":71373,"depth":1629,"text":71376,"children":72182},[72183,72184],{"id":71398,"depth":1635,"text":71401},{"id":71449,"depth":1635,"text":71452},{"id":71587,"depth":1629,"text":71590,"children":72186},[72187,72188,72189,72190],{"id":71492,"depth":1635,"text":25973},{"id":71505,"depth":1635,"text":71510},{"id":36888,"depth":1635,"text":71522},{"id":71530,"depth":1635,"text":25991},{"id":71788,"depth":1629,"text":71791},{"id":71878,"depth":1629,"text":71881},{"id":71954,"depth":1629,"text":71957},{"id":72006,"depth":1629,"text":72009,"children":72195},[72196,72197],{"id":72012,"depth":1635,"text":72015},{"id":72041,"depth":1635,"text":72044},{"id":1552,"depth":1629,"text":1555},"content:blog:how_to_integrate_with_stripe_api_a_step_by_step_guide_for_developers.md","blog/how_to_integrate_with_stripe_api_a_step_by_step_guide_for_developers.md","blog/how_to_integrate_with_stripe_api_a_step_by_step_guide_for_developers",{"_path":72203,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":72204,"description":72205,"img":72206,"date":72207,"tag":12,"body":72208,"_type":1677,"_id":73700,"_source":1679,"_file":73701,"_stem":73702,"_extension":1682},"/blog/how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_and_notion","How to Build AI Search and Insights Across Google Drive, Slack, Zendesk, and Notion","Many B2B SaaS products are adding AI search features that allow their customers to ask questions about their company's internal knowledge and operational data....","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_and_notion-icon.png","2026-03-10T01:19:00.000Z",{"type":14,"children":72209,"toc":73675},[72210,72215,72218,72225,72230,72235,72240,72245,72251,72256,72260,72286,72291,72295,72348,72353,72359,72370,72459,72464,72470,72482,72493,72498,72729,72734,72743,72755,72761,72766,72771,72830,72836,72841,72845,72961,72966,72975,72986,72992,72997,73001,73054,73059,73064,73069,73074,73119,73124,73185,73189,73197,73202,73207,73212,73223,73258,73263,73269,73280,73284,73312,73317,73325,73330,73336,73341,73346,73352,73357,73363,73368,73374,73386,73392,73397,73403,73408,73414,73419,73425,73430,73436,73441,73446,73452,73457,73462,73466,73489,73494,73505,73509,73514,73518,73525,73540,73547,73562,73569,73584,73591,73606,73611,73617,73622,73626,73649,73654,73659,73667],{"type":17,"tag":18,"props":72211,"children":72213},{"id":72212},"how-to-build-ai-search-and-insights-across-google-drive-slack-zendesk-and-notion",[72214],{"type":23,"value":72204},{"type":17,"tag":25,"props":72216,"children":72217},{},[],{"type":17,"tag":29,"props":72219,"children":72220},{},[72221],{"type":17,"tag":33,"props":72222,"children":72223},{},[72224],{"type":23,"value":70091},{"type":17,"tag":29,"props":72226,"children":72227},{},[72228],{"type":23,"value":72229},"Many B2B SaaS products are adding AI search features that allow their customers to ask questions about their company's internal knowledge and operational data. Instead of manually searching documents, support tickets, or conversations, users can ask natural language questions and receive answers grounded in their organization's data.",{"type":17,"tag":29,"props":72231,"children":72232},{},[72233],{"type":23,"value":72234},"For example, a support platform might allow teams to search past Zendesk tickets, Slack discussions, and internal documentation to resolve issues faster. A productivity platform might let employees ask questions about company policies stored in Notion or documents in Google Drive.",{"type":17,"tag":29,"props":72236,"children":72237},{},[72238],{"type":23,"value":72239},"The challenge is that enterprise knowledge lives across many systems. Documents are stored in Google Drive, conversations occur in Slack, support issues are logged in Zendesk, and knowledge bases are managed in tools like Notion. Each platform exposes different APIs, schemas, and authentication models.",{"type":17,"tag":29,"props":72241,"children":72242},{},[72243],{"type":23,"value":72244},"Unified simplifies this by providing normalized APIs across file storage, messaging, knowledge management, and ticketing platforms. Developers can retrieve documents, conversations, and support records through consistent objects and endpoints, enabling AI search features without maintaining dozens of integrations.",{"type":17,"tag":68,"props":72246,"children":72248},{"id":72247},"why-saas-products-build-ai-search-features",[72249],{"type":23,"value":72250},"Why SaaS Products Build AI Search Features",{"type":17,"tag":29,"props":72252,"children":72253},{},[72254],{"type":23,"value":72255},"AI search is becoming a core capability in many SaaS products.",{"type":17,"tag":29,"props":72257,"children":72258},{},[72259],{"type":23,"value":24364},{"type":17,"tag":80,"props":72261,"children":72262},{},[72263,72267,72272,72277,72281],{"type":17,"tag":84,"props":72264,"children":72265},{},[72266],{"type":23,"value":23230},{"type":17,"tag":84,"props":72268,"children":72269},{},[72270],{"type":23,"value":72271},"Enterprise search platforms",{"type":17,"tag":84,"props":72273,"children":72274},{},[72275],{"type":23,"value":72276},"Customer support copilots",{"type":17,"tag":84,"props":72278,"children":72279},{},[72280],{"type":23,"value":13822},{"type":17,"tag":84,"props":72282,"children":72283},{},[72284],{"type":23,"value":72285},"AI-powered help desks",{"type":17,"tag":29,"props":72287,"children":72288},{},[72289],{"type":23,"value":72290},"These products allow customers to search across their internal tools using natural language.",{"type":17,"tag":29,"props":72292,"children":72293},{},[72294],{"type":23,"value":12607},{"type":17,"tag":80,"props":72296,"children":72297},{},[72298,72308,72318,72328,72338],{"type":17,"tag":84,"props":72299,"children":72300},{},[72301,72306],{"type":17,"tag":48,"props":72302,"children":72303},{},[72304],{"type":23,"value":72305},"Document search",{"type":23,"value":72307}," across company knowledge bases",{"type":17,"tag":84,"props":72309,"children":72310},{},[72311,72316],{"type":17,"tag":48,"props":72312,"children":72313},{},[72314],{"type":23,"value":72315},"Conversation retrieval",{"type":23,"value":72317}," from chat platforms like Slack",{"type":17,"tag":84,"props":72319,"children":72320},{},[72321,72326],{"type":17,"tag":48,"props":72322,"children":72323},{},[72324],{"type":23,"value":72325},"Support ticket search",{"type":23,"value":72327}," across help desk systems",{"type":17,"tag":84,"props":72329,"children":72330},{},[72331,72336],{"type":17,"tag":48,"props":72332,"children":72333},{},[72334],{"type":23,"value":72335},"AI-powered question answering",{"type":23,"value":72337}," using enterprise data",{"type":17,"tag":84,"props":72339,"children":72340},{},[72341,72346],{"type":17,"tag":48,"props":72342,"children":72343},{},[72344],{"type":23,"value":72345},"Knowledge discovery",{"type":23,"value":72347}," across files and internal documentation",{"type":17,"tag":29,"props":72349,"children":72350},{},[72351],{"type":23,"value":72352},"By integrating with customer systems, SaaS products can build unified search experiences across multiple sources of knowledge.",{"type":17,"tag":68,"props":72354,"children":72356},{"id":72355},"unified-categories-used-for-ai-search",[72357],{"type":23,"value":72358},"Unified Categories Used for AI Search",{"type":17,"tag":29,"props":72360,"children":72361},{},[72362,72364,72368],{"type":23,"value":72363},"An AI search feature typically combines data from several ",{"type":17,"tag":133,"props":72365,"children":72366},{"href":7691},[72367],{"type":23,"value":7806},{"type":23,"value":72369}," categories.",{"type":17,"tag":7231,"props":72371,"children":72372},{},[72373,72391],{"type":17,"tag":7235,"props":72374,"children":72375},{},[72376],{"type":17,"tag":7239,"props":72377,"children":72378},{},[72379,72383,72387],{"type":17,"tag":7243,"props":72380,"children":72381},{},[72382],{"type":23,"value":7247},{"type":17,"tag":7243,"props":72384,"children":72385},{},[72386],{"type":23,"value":24525},{"type":17,"tag":7243,"props":72388,"children":72389},{},[72390],{"type":23,"value":24530},{"type":17,"tag":7259,"props":72392,"children":72393},{},[72394,72412,72427,72444],{"type":17,"tag":7239,"props":72395,"children":72396},{},[72397,72402,72407],{"type":17,"tag":7266,"props":72398,"children":72399},{},[72400],{"type":23,"value":72401},"File Storage",{"type":17,"tag":7266,"props":72403,"children":72404},{},[72405],{"type":23,"value":72406},"Documents and files from platforms like Google Drive",{"type":17,"tag":7266,"props":72408,"children":72409},{},[72410],{"type":23,"value":72411},"StorageFile",{"type":17,"tag":7239,"props":72413,"children":72414},{},[72415,72419,72423],{"type":17,"tag":7266,"props":72416,"children":72417},{},[72418],{"type":23,"value":24559},{"type":17,"tag":7266,"props":72420,"children":72421},{},[72422],{"type":23,"value":24564},{"type":17,"tag":7266,"props":72424,"children":72425},{},[72426],{"type":23,"value":24569},{"type":17,"tag":7239,"props":72428,"children":72429},{},[72430,72434,72439],{"type":17,"tag":7266,"props":72431,"children":72432},{},[72433],{"type":23,"value":24577},{"type":17,"tag":7266,"props":72435,"children":72436},{},[72437],{"type":23,"value":72438},"Knowledge bases such as Notion or Confluence",{"type":17,"tag":7266,"props":72440,"children":72441},{},[72442],{"type":23,"value":72443},"page, space, comment",{"type":17,"tag":7239,"props":72445,"children":72446},{},[72447,72451,72455],{"type":17,"tag":7266,"props":72448,"children":72449},{},[72450],{"type":23,"value":24541},{"type":17,"tag":7266,"props":72452,"children":72453},{},[72454],{"type":23,"value":24546},{"type":17,"tag":7266,"props":72456,"children":72457},{},[72458],{"type":23,"value":24551},{"type":17,"tag":29,"props":72460,"children":72461},{},[72462],{"type":23,"value":72463},"Using normalized APIs across these categories allows developers to build search features that span multiple enterprise systems.",{"type":17,"tag":68,"props":72465,"children":72467},{"id":72466},"unified-file-storage-objects",[72468],{"type":23,"value":72469},"Unified File Storage Objects",{"type":17,"tag":29,"props":72471,"children":72472},{},[72473,72475,72480],{"type":23,"value":72474},"Unified's [File ",{"type":17,"tag":133,"props":72476,"children":72477},{"href":28977},[72478],{"type":23,"value":72479},"Storage API",{"type":23,"value":72481},"](/storage) normalizes files and folders across storage providers.",{"type":17,"tag":29,"props":72483,"children":72484},{},[72485,72487,72491],{"type":23,"value":72486},"The primary object is ",{"type":17,"tag":48,"props":72488,"children":72489},{},[72490],{"type":23,"value":72411},{"type":23,"value":72492},", which represents both files and directories.",{"type":17,"tag":29,"props":72494,"children":72495},{},[72496],{"type":23,"value":72497},"Key fields include:",{"type":17,"tag":7231,"props":72499,"children":72500},{},[72501,72520],{"type":17,"tag":7235,"props":72502,"children":72503},{},[72504],{"type":17,"tag":7239,"props":72505,"children":72506},{},[72507,72511,72515],{"type":17,"tag":7243,"props":72508,"children":72509},{},[72510],{"type":23,"value":24651},{"type":17,"tag":7243,"props":72512,"children":72513},{},[72514],{"type":23,"value":24525},{"type":17,"tag":7243,"props":72516,"children":72517},{},[72518],{"type":23,"value":72519},"AI Search Usage",{"type":17,"tag":7259,"props":72521,"children":72522},{},[72523,72540,72557,72574,72592,72609,72626,72643,72660,72677,72695,72712],{"type":17,"tag":7239,"props":72524,"children":72525},{},[72526,72530,72535],{"type":17,"tag":7266,"props":72527,"children":72528},{},[72529],{"type":23,"value":18766},{"type":17,"tag":7266,"props":72531,"children":72532},{},[72533],{"type":23,"value":72534},"Unique identifier for the file",{"type":17,"tag":7266,"props":72536,"children":72537},{},[72538],{"type":23,"value":72539},"Internal reference for indexing",{"type":17,"tag":7239,"props":72541,"children":72542},{},[72543,72547,72552],{"type":17,"tag":7266,"props":72544,"children":72545},{},[72546],{"type":23,"value":18781},{"type":17,"tag":7266,"props":72548,"children":72549},{},[72550],{"type":23,"value":72551},"File name",{"type":17,"tag":7266,"props":72553,"children":72554},{},[72555],{"type":23,"value":72556},"Used as document title in search",{"type":17,"tag":7239,"props":72558,"children":72559},{},[72560,72564,72569],{"type":17,"tag":7266,"props":72561,"children":72562},{},[72563],{"type":23,"value":24679},{"type":17,"tag":7266,"props":72565,"children":72566},{},[72567],{"type":23,"value":72568},"Optional description",{"type":17,"tag":7266,"props":72570,"children":72571},{},[72572],{"type":23,"value":72573},"Additional searchable metadata",{"type":17,"tag":7239,"props":72575,"children":72576},{},[72577,72582,72587],{"type":17,"tag":7266,"props":72578,"children":72579},{},[72580],{"type":23,"value":72581},"mime_type",{"type":17,"tag":7266,"props":72583,"children":72584},{},[72585],{"type":23,"value":72586},"File format",{"type":17,"tag":7266,"props":72588,"children":72589},{},[72590],{"type":23,"value":72591},"Determines how content is processed",{"type":17,"tag":7239,"props":72593,"children":72594},{},[72595,72599,72604],{"type":17,"tag":7266,"props":72596,"children":72597},{},[72598],{"type":23,"value":20181},{"type":17,"tag":7266,"props":72600,"children":72601},{},[72602],{"type":23,"value":72603},"File size in bytes",{"type":17,"tag":7266,"props":72605,"children":72606},{},[72607],{"type":23,"value":72608},"Used for processing limits",{"type":17,"tag":7239,"props":72610,"children":72611},{},[72612,72616,72621],{"type":17,"tag":7266,"props":72613,"children":72614},{},[72615],{"type":23,"value":15863},{"type":17,"tag":7266,"props":72617,"children":72618},{},[72619],{"type":23,"value":72620},"Parent folder ID",{"type":17,"tag":7266,"props":72622,"children":72623},{},[72624],{"type":23,"value":72625},"Enables hierarchical navigation",{"type":17,"tag":7239,"props":72627,"children":72628},{},[72629,72633,72638],{"type":17,"tag":7266,"props":72630,"children":72631},{},[72632],{"type":23,"value":24204},{"type":17,"tag":7266,"props":72634,"children":72635},{},[72636],{"type":23,"value":72637},"Access control metadata",{"type":17,"tag":7266,"props":72639,"children":72640},{},[72641],{"type":23,"value":72642},"Used for permission-aware search",{"type":17,"tag":7239,"props":72644,"children":72645},{},[72646,72650,72655],{"type":17,"tag":7266,"props":72647,"children":72648},{},[72649],{"type":23,"value":33446},{"type":17,"tag":7266,"props":72651,"children":72652},{},[72653],{"type":23,"value":72654},"File creation timestamp",{"type":17,"tag":7266,"props":72656,"children":72657},{},[72658],{"type":23,"value":72659},"Useful for timeline filtering",{"type":17,"tag":7239,"props":72661,"children":72662},{},[72663,72667,72672],{"type":17,"tag":7266,"props":72664,"children":72665},{},[72666],{"type":23,"value":25337},{"type":17,"tag":7266,"props":72668,"children":72669},{},[72670],{"type":23,"value":72671},"Last modification timestamp",{"type":17,"tag":7266,"props":72673,"children":72674},{},[72675],{"type":23,"value":72676},"Used for incremental indexing",{"type":17,"tag":7239,"props":72678,"children":72679},{},[72680,72685,72690],{"type":17,"tag":7266,"props":72681,"children":72682},{},[72683],{"type":23,"value":72684},"version",{"type":17,"tag":7266,"props":72686,"children":72687},{},[72688],{"type":23,"value":72689},"Provider revision identifier",{"type":17,"tag":7266,"props":72691,"children":72692},{},[72693],{"type":23,"value":72694},"Detects content changes",{"type":17,"tag":7239,"props":72696,"children":72697},{},[72698,72702,72707],{"type":17,"tag":7266,"props":72699,"children":72700},{},[72701],{"type":23,"value":24978},{"type":17,"tag":7266,"props":72703,"children":72704},{},[72705],{"type":23,"value":72706},"Temporary URL to retrieve file contents",{"type":17,"tag":7266,"props":72708,"children":72709},{},[72710],{"type":23,"value":72711},"Used to fetch document text",{"type":17,"tag":7239,"props":72713,"children":72714},{},[72715,72719,72724],{"type":17,"tag":7266,"props":72716,"children":72717},{},[72718],{"type":23,"value":12107},{"type":17,"tag":7266,"props":72720,"children":72721},{},[72722],{"type":23,"value":72723},"Provider link to the file",{"type":17,"tag":7266,"props":72725,"children":72726},{},[72727],{"type":23,"value":72728},"Allows users to open the original file",{"type":17,"tag":29,"props":72730,"children":72731},{},[72732],{"type":23,"value":72733},"Files are retrieved through the storage endpoints:",{"type":17,"tag":6893,"props":72735,"children":72738},{"className":72736,"code":72737,"language":20901,"meta":23},[20899],"GET /storage/{connection_id}/file\nGET /storage/{connection_id}/file/{id}\n",[72739],{"type":17,"tag":6121,"props":72740,"children":72741},{"__ignoreMap":7},[72742],{"type":23,"value":72737},{"type":17,"tag":29,"props":72744,"children":72745},{},[72746,72748,72753],{"type":23,"value":72747},"To retrieve file content, applications call the file endpoint and then download the content using the ",{"type":17,"tag":6121,"props":72749,"children":72751},{"className":72750},[],[72752],{"type":23,"value":24978},{"type":23,"value":72754}," field.",{"type":17,"tag":68,"props":72756,"children":72758},{"id":72757},"unified-knowledge-management-objects",[72759],{"type":23,"value":72760},"Unified Knowledge Management Objects",{"type":17,"tag":29,"props":72762,"children":72763},{},[72764],{"type":23,"value":72765},"Unified's Knowledge Management API normalizes knowledge base content across platforms like Notion and Confluence.",{"type":17,"tag":29,"props":72767,"children":72768},{},[72769],{"type":23,"value":72770},"The API exposes three primary objects:",{"type":17,"tag":7231,"props":72772,"children":72773},{},[72774,72788],{"type":17,"tag":7235,"props":72775,"children":72776},{},[72777],{"type":17,"tag":7239,"props":72778,"children":72779},{},[72780,72784],{"type":17,"tag":7243,"props":72781,"children":72782},{},[72783],{"type":23,"value":18594},{"type":17,"tag":7243,"props":72785,"children":72786},{},[72787],{"type":23,"value":20787},{"type":17,"tag":7259,"props":72789,"children":72790},{},[72791,72804,72817],{"type":17,"tag":7239,"props":72792,"children":72793},{},[72794,72799],{"type":17,"tag":7266,"props":72795,"children":72796},{},[72797],{"type":23,"value":72798},"page",{"type":17,"tag":7266,"props":72800,"children":72801},{},[72802],{"type":23,"value":72803},"Represents a knowledge article or document",{"type":17,"tag":7239,"props":72805,"children":72806},{},[72807,72812],{"type":17,"tag":7266,"props":72808,"children":72809},{},[72810],{"type":23,"value":72811},"space",{"type":17,"tag":7266,"props":72813,"children":72814},{},[72815],{"type":23,"value":72816},"Represents a workspace or knowledge collection",{"type":17,"tag":7239,"props":72818,"children":72819},{},[72820,72825],{"type":17,"tag":7266,"props":72821,"children":72822},{},[72823],{"type":23,"value":72824},"comment",{"type":17,"tag":7266,"props":72826,"children":72827},{},[72828],{"type":23,"value":72829},"Represents discussions attached to pages",{"type":17,"tag":239,"props":72831,"children":72833},{"id":72832},"page-object",[72834],{"type":23,"value":72835},"Page Object",{"type":17,"tag":29,"props":72837,"children":72838},{},[72839],{"type":23,"value":72840},"Pages contain the primary knowledge content.",{"type":17,"tag":29,"props":72842,"children":72843},{},[72844],{"type":23,"value":72497},{"type":17,"tag":7231,"props":72846,"children":72847},{},[72848,72862],{"type":17,"tag":7235,"props":72849,"children":72850},{},[72851],{"type":17,"tag":7239,"props":72852,"children":72853},{},[72854,72858],{"type":17,"tag":7243,"props":72855,"children":72856},{},[72857],{"type":23,"value":24651},{"type":17,"tag":7243,"props":72859,"children":72860},{},[72861],{"type":23,"value":24525},{"type":17,"tag":7259,"props":72863,"children":72864},{},[72865,72877,72889,72901,72913,72924,72936,72949],{"type":17,"tag":7239,"props":72866,"children":72867},{},[72868,72872],{"type":17,"tag":7266,"props":72869,"children":72870},{},[72871],{"type":23,"value":62346},{"type":17,"tag":7266,"props":72873,"children":72874},{},[72875],{"type":23,"value":72876},"Page title",{"type":17,"tag":7239,"props":72878,"children":72879},{},[72880,72884],{"type":17,"tag":7266,"props":72881,"children":72882},{},[72883],{"type":23,"value":24978},{"type":17,"tag":7266,"props":72885,"children":72886},{},[72887],{"type":23,"value":72888},"URL used to retrieve page content",{"type":17,"tag":7239,"props":72890,"children":72891},{},[72892,72896],{"type":17,"tag":7266,"props":72893,"children":72894},{},[72895],{"type":23,"value":12107},{"type":17,"tag":7266,"props":72897,"children":72898},{},[72899],{"type":23,"value":72900},"Link to the page in the source platform",{"type":17,"tag":7239,"props":72902,"children":72903},{},[72904,72908],{"type":17,"tag":7266,"props":72905,"children":72906},{},[72907],{"type":23,"value":33446},{"type":17,"tag":7266,"props":72909,"children":72910},{},[72911],{"type":23,"value":72912},"Creation timestamp",{"type":17,"tag":7239,"props":72914,"children":72915},{},[72916,72920],{"type":17,"tag":7266,"props":72917,"children":72918},{},[72919],{"type":23,"value":25337},{"type":17,"tag":7266,"props":72921,"children":72922},{},[72923],{"type":23,"value":72671},{"type":17,"tag":7239,"props":72925,"children":72926},{},[72927,72931],{"type":17,"tag":7266,"props":72928,"children":72929},{},[72930],{"type":23,"value":62582},{"type":17,"tag":7266,"props":72932,"children":72933},{},[72934],{"type":23,"value":72935},"Author or editor",{"type":17,"tag":7239,"props":72937,"children":72938},{},[72939,72944],{"type":17,"tag":7266,"props":72940,"children":72941},{},[72942],{"type":23,"value":72943},"space_id",{"type":17,"tag":7266,"props":72945,"children":72946},{},[72947],{"type":23,"value":72948},"Parent knowledge space",{"type":17,"tag":7239,"props":72950,"children":72951},{},[72952,72956],{"type":17,"tag":7266,"props":72953,"children":72954},{},[72955],{"type":23,"value":27310},{"type":17,"tag":7266,"props":72957,"children":72958},{},[72959],{"type":23,"value":72960},"Page type",{"type":17,"tag":29,"props":72962,"children":72963},{},[72964],{"type":23,"value":72965},"Pages can be retrieved using:",{"type":17,"tag":6893,"props":72967,"children":72970},{"className":72968,"code":72969,"language":20901,"meta":23},[20899],"GET /kms/{connection_id}/page\nGET /kms/{connection_id}/page/{id}\n",[72971],{"type":17,"tag":6121,"props":72972,"children":72973},{"__ignoreMap":7},[72974],{"type":23,"value":72969},{"type":17,"tag":29,"props":72976,"children":72977},{},[72978,72980,72985],{"type":23,"value":72979},"Because page bodies are not always returned inline, applications typically retrieve the content through the ",{"type":17,"tag":6121,"props":72981,"children":72983},{"className":72982},[],[72984],{"type":23,"value":24978},{"type":23,"value":54},{"type":17,"tag":239,"props":72987,"children":72989},{"id":72988},"comment-object",[72990],{"type":23,"value":72991},"Comment Object",{"type":17,"tag":29,"props":72993,"children":72994},{},[72995],{"type":23,"value":72996},"Comments represent discussions attached to knowledge articles.",{"type":17,"tag":29,"props":72998,"children":72999},{},[73000],{"type":23,"value":24637},{"type":17,"tag":80,"props":73002,"children":73003},{},[73004,73012,73021,73029,73037,73045],{"type":17,"tag":84,"props":73005,"children":73006},{},[73007],{"type":17,"tag":6121,"props":73008,"children":73010},{"className":73009},[],[73011],{"type":23,"value":1679},{"type":17,"tag":84,"props":73013,"children":73014},{},[73015],{"type":17,"tag":6121,"props":73016,"children":73018},{"className":73017},[],[73019],{"type":23,"value":73020},"content_type",{"type":17,"tag":84,"props":73022,"children":73023},{},[73024],{"type":17,"tag":6121,"props":73025,"children":73027},{"className":73026},[],[73028],{"type":23,"value":33446},{"type":17,"tag":84,"props":73030,"children":73031},{},[73032],{"type":17,"tag":6121,"props":73033,"children":73035},{"className":73034},[],[73036],{"type":23,"value":25337},{"type":17,"tag":84,"props":73038,"children":73039},{},[73040],{"type":17,"tag":6121,"props":73041,"children":73043},{"className":73042},[],[73044],{"type":23,"value":62582},{"type":17,"tag":84,"props":73046,"children":73047},{},[73048],{"type":17,"tag":6121,"props":73049,"children":73051},{"className":73050},[],[73052],{"type":23,"value":73053},"page_id",{"type":17,"tag":29,"props":73055,"children":73056},{},[73057],{"type":23,"value":73058},"These fields allow AI search systems to incorporate discussions into knowledge retrieval.",{"type":17,"tag":68,"props":73060,"children":73061},{"id":15771},[73062],{"type":23,"value":73063},"Unified Messaging Objects",{"type":17,"tag":29,"props":73065,"children":73066},{},[73067],{"type":23,"value":73068},"Unified's Messaging API normalizes conversations across messaging platforms such as Slack.",{"type":17,"tag":29,"props":73070,"children":73071},{},[73072],{"type":23,"value":73073},"Key messaging objects include:",{"type":17,"tag":7231,"props":73075,"children":73076},{},[73077,73091],{"type":17,"tag":7235,"props":73078,"children":73079},{},[73080],{"type":17,"tag":7239,"props":73081,"children":73082},{},[73083,73087],{"type":17,"tag":7243,"props":73084,"children":73085},{},[73086],{"type":23,"value":18594},{"type":17,"tag":7243,"props":73088,"children":73089},{},[73090],{"type":23,"value":20787},{"type":17,"tag":7259,"props":73092,"children":73093},{},[73094,73106],{"type":17,"tag":7239,"props":73095,"children":73096},{},[73097,73101],{"type":17,"tag":7266,"props":73098,"children":73099},{},[73100],{"type":23,"value":24872},{"type":17,"tag":7266,"props":73102,"children":73103},{},[73104],{"type":23,"value":73105},"Individual email or chat message",{"type":17,"tag":7239,"props":73107,"children":73108},{},[73109,73114],{"type":17,"tag":7266,"props":73110,"children":73111},{},[73112],{"type":23,"value":73113},"channel",{"type":17,"tag":7266,"props":73115,"children":73116},{},[73117],{"type":23,"value":73118},"Messaging channel or conversation group",{"type":17,"tag":29,"props":73120,"children":73121},{},[73122],{"type":23,"value":73123},"Messages contain important search fields such as:",{"type":17,"tag":80,"props":73125,"children":73126},{},[73127,73132,73142,73158,73169,73180],{"type":17,"tag":84,"props":73128,"children":73129},{},[73130],{"type":23,"value":73131},"message body text",{"type":17,"tag":84,"props":73133,"children":73134},{},[73135,73136,73141],{"type":23,"value":24835},{"type":17,"tag":6121,"props":73137,"children":73139},{"className":73138},[],[73140],{"type":23,"value":24841},{"type":23,"value":12034},{"type":17,"tag":84,"props":73143,"children":73144},{},[73145,73146,73151,73152,73157],{"type":23,"value":24847},{"type":17,"tag":6121,"props":73147,"children":73149},{"className":73148},[],[73150],{"type":23,"value":24853},{"type":23,"value":11826},{"type":17,"tag":6121,"props":73153,"children":73155},{"className":73154},[],[73156],{"type":23,"value":24860},{"type":23,"value":12034},{"type":17,"tag":84,"props":73159,"children":73160},{},[73161,73163,73168],{"type":23,"value":73162},"timestamps (",{"type":17,"tag":6121,"props":73164,"children":73166},{"className":73165},[],[73167],{"type":23,"value":33446},{"type":23,"value":12034},{"type":17,"tag":84,"props":73170,"children":73171},{},[73172,73174,73179],{"type":23,"value":73173},"thread relationships (",{"type":17,"tag":6121,"props":73175,"children":73177},{"className":73176},[],[73178],{"type":23,"value":15863},{"type":23,"value":12034},{"type":17,"tag":84,"props":73181,"children":73182},{},[73183],{"type":23,"value":73184},"attachments and links",{"type":17,"tag":29,"props":73186,"children":73187},{},[73188],{"type":23,"value":33586},{"type":17,"tag":6893,"props":73190,"children":73192},{"className":73191,"code":25091,"language":20901,"meta":23},[20899],[73193],{"type":17,"tag":6121,"props":73194,"children":73195},{"__ignoreMap":7},[73196],{"type":23,"value":25091},{"type":17,"tag":29,"props":73198,"children":73199},{},[73200],{"type":23,"value":73201},"Threads can be reconstructed by retrieving messages that share the same parent identifier.",{"type":17,"tag":68,"props":73203,"children":73204},{"id":32724},[73205],{"type":23,"value":73206},"Unified Ticketing Objects",{"type":17,"tag":29,"props":73208,"children":73209},{},[73210],{"type":23,"value":73211},"Support systems like Zendesk store customer issues as tickets.",{"type":17,"tag":29,"props":73213,"children":73214},{},[73215,73217,73221],{"type":23,"value":73216},"The normalized ",{"type":17,"tag":48,"props":73218,"children":73219},{},[73220],{"type":23,"value":24551},{"type":23,"value":73222}," object includes fields such as:",{"type":17,"tag":80,"props":73224,"children":73225},{},[73226,73230,73234,73238,73242,73246,73250,73254],{"type":17,"tag":84,"props":73227,"children":73228},{},[73229],{"type":23,"value":24666},{"type":17,"tag":84,"props":73231,"children":73232},{},[73233],{"type":23,"value":24679},{"type":17,"tag":84,"props":73235,"children":73236},{},[73237],{"type":23,"value":19949},{"type":17,"tag":84,"props":73239,"children":73240},{},[73241],{"type":23,"value":24704},{"type":17,"tag":84,"props":73243,"children":73244},{},[73245],{"type":23,"value":24717},{"type":17,"tag":84,"props":73247,"children":73248},{},[73249],{"type":23,"value":24730},{"type":17,"tag":84,"props":73251,"children":73252},{},[73253],{"type":23,"value":33446},{"type":17,"tag":84,"props":73255,"children":73256},{},[73257],{"type":23,"value":25337},{"type":17,"tag":29,"props":73259,"children":73260},{},[73261],{"type":23,"value":73262},"These fields allow AI systems to retrieve past support cases and provide context when answering questions.",{"type":17,"tag":68,"props":73264,"children":73266},{"id":73265},"connecting-customer-integrations",[73267],{"type":23,"value":73268},"Connecting Customer Integrations",{"type":17,"tag":29,"props":73270,"children":73271},{},[73272,73274,73279],{"type":23,"value":73273},"Customers authorize their platforms through ",{"type":17,"tag":48,"props":73275,"children":73276},{},[73277],{"type":23,"value":73278},"Unified Connect",{"type":23,"value":54},{"type":17,"tag":29,"props":73281,"children":73282},{},[73283],{"type":23,"value":26189},{"type":17,"tag":6154,"props":73285,"children":73286},{},[73287,73292,73297,73302],{"type":17,"tag":84,"props":73288,"children":73289},{},[73290],{"type":23,"value":73291},"Your application launches the Unified Connect authorization flow.",{"type":17,"tag":84,"props":73293,"children":73294},{},[73295],{"type":23,"value":73296},"The user selects integrations such as Google Drive, Slack, Zendesk, or Notion.",{"type":17,"tag":84,"props":73298,"children":73299},{},[73300],{"type":23,"value":73301},"The user authorizes the integration.",{"type":17,"tag":84,"props":73303,"children":73304},{},[73305,73307,73311],{"type":23,"value":73306},"Unified redirects back to your application with a ",{"type":17,"tag":48,"props":73308,"children":73309},{},[73310],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":73313,"children":73314},{},[73315],{"type":23,"value":73316},"Your application stores the mapping:",{"type":17,"tag":6893,"props":73318,"children":73320},{"className":73319,"code":25047,"language":20901,"meta":23},[20899],[73321],{"type":17,"tag":6121,"props":73322,"children":73323},{"__ignoreMap":7},[73324],{"type":23,"value":25047},{"type":17,"tag":29,"props":73326,"children":73327},{},[73328],{"type":23,"value":73329},"All subsequent Unified API requests use this identifier to retrieve data for that customer.",{"type":17,"tag":68,"props":73331,"children":73333},{"id":73332},"building-an-ai-search-pipeline",[73334],{"type":23,"value":73335},"Building an AI Search Pipeline",{"type":17,"tag":29,"props":73337,"children":73338},{},[73339],{"type":23,"value":73340},"Most AI search systems use a retrieval-augmented generation (RAG) architecture.",{"type":17,"tag":29,"props":73342,"children":73343},{},[73344],{"type":23,"value":73345},"A typical implementation includes the following steps.",{"type":17,"tag":239,"props":73347,"children":73349},{"id":73348},"_1-connect-data-sources",[73350],{"type":23,"value":73351},"1. Connect data sources",{"type":17,"tag":29,"props":73353,"children":73354},{},[73355],{"type":23,"value":73356},"Customers connect their tools through Unified Connect.",{"type":17,"tag":239,"props":73358,"children":73360},{"id":73359},"_2-retrieve-documents-and-conversations",[73361],{"type":23,"value":73362},"2. Retrieve documents and conversations",{"type":17,"tag":29,"props":73364,"children":73365},{},[73366],{"type":23,"value":73367},"Use Unified APIs to retrieve files, knowledge articles, messages, and support tickets.",{"type":17,"tag":239,"props":73369,"children":73371},{"id":73370},"_3-extract-content",[73372],{"type":23,"value":73373},"3. Extract content",{"type":17,"tag":29,"props":73375,"children":73376},{},[73377,73379,73384],{"type":23,"value":73378},"Download document bodies using ",{"type":17,"tag":6121,"props":73380,"children":73382},{"className":73381},[],[73383],{"type":23,"value":24978},{"type":23,"value":73385}," or retrieve message and comment text from API responses.",{"type":17,"tag":239,"props":73387,"children":73389},{"id":73388},"_4-chunk-content",[73390],{"type":23,"value":73391},"4. Chunk content",{"type":17,"tag":29,"props":73393,"children":73394},{},[73395],{"type":23,"value":73396},"Split large documents or conversations into smaller segments suitable for embedding.",{"type":17,"tag":239,"props":73398,"children":73400},{"id":73399},"_5-generate-embeddings",[73401],{"type":23,"value":73402},"5. Generate embeddings",{"type":17,"tag":29,"props":73404,"children":73405},{},[73406],{"type":23,"value":73407},"Use an embedding model to convert text segments into vector representations.",{"type":17,"tag":239,"props":73409,"children":73411},{"id":73410},"_6-store-vectors",[73412],{"type":23,"value":73413},"6. Store vectors",{"type":17,"tag":29,"props":73415,"children":73416},{},[73417],{"type":23,"value":73418},"Persist embeddings in a vector database such as Pinecone or pgvector.",{"type":17,"tag":239,"props":73420,"children":73422},{"id":73421},"_7-retrieve-relevant-context",[73423],{"type":23,"value":73424},"7. Retrieve relevant context",{"type":17,"tag":29,"props":73426,"children":73427},{},[73428],{"type":23,"value":73429},"When a user asks a question, embed the query and retrieve the most relevant segments from the vector database.",{"type":17,"tag":239,"props":73431,"children":73433},{"id":73432},"_8-generate-an-ai-answer",[73434],{"type":23,"value":73435},"8. Generate an AI answer",{"type":17,"tag":29,"props":73437,"children":73438},{},[73439],{"type":23,"value":73440},"Pass retrieved context to a language model to generate a response grounded in the customer's data.",{"type":17,"tag":29,"props":73442,"children":73443},{},[73444],{"type":23,"value":73445},"This approach allows AI systems to answer questions using enterprise knowledge across multiple systems.",{"type":17,"tag":68,"props":73447,"children":73449},{"id":73448},"keeping-the-search-index-updated",[73450],{"type":23,"value":73451},"Keeping the Search Index Updated",{"type":17,"tag":29,"props":73453,"children":73454},{},[73455],{"type":23,"value":73456},"Enterprise data changes frequently, so search indexes must remain synchronized.",{"type":17,"tag":29,"props":73458,"children":73459},{},[73460],{"type":23,"value":73461},"Unified provides webhook events that notify applications when records change.",{"type":17,"tag":29,"props":73463,"children":73464},{},[73465],{"type":23,"value":24364},{"type":17,"tag":80,"props":73467,"children":73468},{},[73469,73474,73479,73484],{"type":17,"tag":84,"props":73470,"children":73471},{},[73472],{"type":23,"value":73473},"file updates in storage systems",{"type":17,"tag":84,"props":73475,"children":73476},{},[73477],{"type":23,"value":73478},"new Slack messages or channel changes",{"type":17,"tag":84,"props":73480,"children":73481},{},[73482],{"type":23,"value":73483},"knowledge base updates",{"type":17,"tag":84,"props":73485,"children":73486},{},[73487],{"type":23,"value":73488},"new or updated support tickets",{"type":17,"tag":29,"props":73490,"children":73491},{},[73492],{"type":23,"value":73493},"Applications can subscribe to these webhook events to trigger re-indexing of updated documents.",{"type":17,"tag":29,"props":73495,"children":73496},{},[73497,73498,73503],{"type":23,"value":6712},{"type":17,"tag":6121,"props":73499,"children":73501},{"className":73500},[],[73502],{"type":23,"value":25337},{"type":23,"value":73504}," field can also be used to detect changed content and refresh embeddings.",{"type":17,"tag":68,"props":73506,"children":73507},{"id":25342},[73508],{"type":23,"value":25345},{"type":17,"tag":29,"props":73510,"children":73511},{},[73512],{"type":23,"value":73513},"Unified supports a broad ecosystem of integrations across knowledge sources.",{"type":17,"tag":29,"props":73515,"children":73516},{},[73517],{"type":23,"value":24364},{"type":17,"tag":29,"props":73519,"children":73520},{},[73521],{"type":17,"tag":48,"props":73522,"children":73523},{},[73524],{"type":23,"value":72401},{"type":17,"tag":80,"props":73526,"children":73527},{},[73528,73532,73536],{"type":17,"tag":84,"props":73529,"children":73530},{},[73531],{"type":23,"value":28907},{"type":17,"tag":84,"props":73533,"children":73534},{},[73535],{"type":23,"value":28915},{"type":17,"tag":84,"props":73537,"children":73538},{},[73539],{"type":23,"value":28931},{"type":17,"tag":29,"props":73541,"children":73542},{},[73543],{"type":17,"tag":48,"props":73544,"children":73545},{},[73546],{"type":23,"value":24559},{"type":17,"tag":80,"props":73548,"children":73549},{},[73550,73554,73558],{"type":17,"tag":84,"props":73551,"children":73552},{},[73553],{"type":23,"value":3204},{"type":17,"tag":84,"props":73555,"children":73556},{},[73557],{"type":23,"value":14878},{"type":17,"tag":84,"props":73559,"children":73560},{},[73561],{"type":23,"value":14066},{"type":17,"tag":29,"props":73563,"children":73564},{},[73565],{"type":17,"tag":48,"props":73566,"children":73567},{},[73568],{"type":23,"value":24577},{"type":17,"tag":80,"props":73570,"children":73571},{},[73572,73576,73580],{"type":17,"tag":84,"props":73573,"children":73574},{},[73575],{"type":23,"value":23053},{"type":17,"tag":84,"props":73577,"children":73578},{},[73579],{"type":23,"value":23725},{"type":17,"tag":84,"props":73581,"children":73582},{},[73583],{"type":23,"value":23061},{"type":17,"tag":29,"props":73585,"children":73586},{},[73587],{"type":17,"tag":48,"props":73588,"children":73589},{},[73590],{"type":23,"value":24541},{"type":17,"tag":80,"props":73592,"children":73593},{},[73594,73598,73602],{"type":17,"tag":84,"props":73595,"children":73596},{},[73597],{"type":23,"value":15738},{"type":17,"tag":84,"props":73599,"children":73600},{},[73601],{"type":23,"value":25370},{"type":17,"tag":84,"props":73603,"children":73604},{},[73605],{"type":23,"value":25375},{"type":17,"tag":29,"props":73607,"children":73608},{},[73609],{"type":23,"value":73610},"This allows SaaS products to support AI search across a wide range of enterprise tools.",{"type":17,"tag":68,"props":73612,"children":73614},{"id":73613},"why-product-teams-choose-unified",[73615],{"type":23,"value":73616},"Why Product Teams Choose Unified",{"type":17,"tag":29,"props":73618,"children":73619},{},[73620],{"type":23,"value":73621},"Building AI search across enterprise tools normally requires integrating with many APIs.",{"type":17,"tag":29,"props":73623,"children":73624},{},[73625],{"type":23,"value":34257},{"type":17,"tag":80,"props":73627,"children":73628},{},[73629,73634,73639,73644],{"type":17,"tag":84,"props":73630,"children":73631},{},[73632],{"type":23,"value":73633},"normalized APIs across file storage, messaging, knowledge management, and ticketing platforms",{"type":17,"tag":84,"props":73635,"children":73636},{},[73637],{"type":23,"value":73638},"consistent objects for documents, messages, and knowledge content",{"type":17,"tag":84,"props":73640,"children":73641},{},[73642],{"type":23,"value":73643},"unified authentication through Unified Connect",{"type":17,"tag":84,"props":73645,"children":73646},{},[73647],{"type":23,"value":73648},"webhook events for real-time data updates",{"type":17,"tag":29,"props":73650,"children":73651},{},[73652],{"type":23,"value":73653},"Instead of maintaining dozens of integrations, product teams can focus on building AI features that help customers discover and understand their data.",{"type":17,"tag":29,"props":73655,"children":73656},{},[73657],{"type":23,"value":73658},"Start building AI search across Google Drive, Slack, Zendesk, Notion, and many other platforms today.",{"type":17,"tag":29,"props":73660,"children":73661},{},[73662],{"type":17,"tag":133,"props":73663,"children":73665},{"href":1612,"rel":73664},[214],[73666],{"type":23,"value":44481},{"type":17,"tag":29,"props":73668,"children":73669},{},[73670],{"type":17,"tag":133,"props":73671,"children":73673},{"href":1623,"rel":73672},[214],[73674],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":73676},[73677,73678,73679,73680,73684,73685,73686,73687,73697,73698,73699],{"id":72247,"depth":1629,"text":72250},{"id":72355,"depth":1629,"text":72358},{"id":72466,"depth":1629,"text":72469},{"id":72757,"depth":1629,"text":72760,"children":73681},[73682,73683],{"id":72832,"depth":1635,"text":72835},{"id":72988,"depth":1635,"text":72991},{"id":15771,"depth":1629,"text":73063},{"id":32724,"depth":1629,"text":73206},{"id":73265,"depth":1629,"text":73268},{"id":73332,"depth":1629,"text":73335,"children":73688},[73689,73690,73691,73692,73693,73694,73695,73696],{"id":73348,"depth":1635,"text":73351},{"id":73359,"depth":1635,"text":73362},{"id":73370,"depth":1635,"text":73373},{"id":73388,"depth":1635,"text":73391},{"id":73399,"depth":1635,"text":73402},{"id":73410,"depth":1635,"text":73413},{"id":73421,"depth":1635,"text":73424},{"id":73432,"depth":1635,"text":73435},{"id":73448,"depth":1629,"text":73451},{"id":25342,"depth":1629,"text":25345},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_and_notion.md","blog/how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_and_notion.md","blog/how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_and_notion",{"_path":73704,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":73705,"description":73706,"img":73707,"date":73708,"tag":12,"body":73709,"_type":1677,"_id":75149,"_source":1679,"_file":75150,"_stem":75151,"_extension":1682},"/blog/how_to_build_an_ai_meeting_notetaker_across_zoom_google_meet_outlook_and_salesforce","How to Build an AI Meeting Notetaker Across Zoom, Google Meet, Outlook, and Salesforce","AI meeting notetakers have quickly become a core feature in many B2B SaaS products. Sales teams, customer success teams, and account managers want automatic...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_ai_meeting_notetaker_across_zoom_google_meet_outlook_and_salesforce-icon.png","2026-03-10T00:57:00.000Z",{"type":14,"children":73710,"toc":75131},[73711,73716,73719,73726,73731,73736,73741,73746,73752,73757,73761,73787,73792,73796,73847,73852,73858,73868,73943,73948,73954,73959,73965,73976,73980,74162,74167,74176,74181,74187,74198,74202,74405,74410,74419,74424,74430,74441,74446,74451,74532,74537,74542,74560,74565,74569,74579,74583,74609,74613,74621,74626,74632,74642,74654,74659,74668,74673,74703,74707,74724,74729,74752,74758,74763,74768,74810,74815,74820,74826,74831,74836,74947,74952,74975,74979,74984,74990,74994,75025,75031,75035,75059,75064,75068,75073,75077,75105,75110,75115,75123],{"type":17,"tag":18,"props":73712,"children":73714},{"id":73713},"how-to-build-an-ai-meeting-notetaker-across-zoom-google-meet-outlook-and-salesforce",[73715],{"type":23,"value":73705},{"type":17,"tag":25,"props":73717,"children":73718},{},[],{"type":17,"tag":29,"props":73720,"children":73721},{},[73722],{"type":17,"tag":33,"props":73723,"children":73724},{},[73725],{"type":23,"value":70091},{"type":17,"tag":29,"props":73727,"children":73728},{},[73729],{"type":23,"value":73730},"AI meeting notetakers have quickly become a core feature in many B2B SaaS products. Sales teams, customer success teams, and account managers want automatic summaries of their meetings, action items extracted from conversations, and follow-ups written back to CRM systems.",{"type":17,"tag":29,"props":73732,"children":73733},{},[73734],{"type":23,"value":73735},"Products like meeting intelligence tools, sales assistants, and AI productivity platforms provide these capabilities by connecting to their customers' meeting platforms. Instead of users manually taking notes, the application joins meetings, retrieves transcripts, generates summaries, and updates CRM records automatically.",{"type":17,"tag":29,"props":73737,"children":73738},{},[73739],{"type":23,"value":73740},"The challenge is that meeting data lives across multiple systems. Meetings are scheduled in Google Calendar or Outlook, hosted on platforms like Zoom or Google Meet, and the resulting insights often need to be attached to CRM systems like Salesforce. Each system exposes different APIs, schemas, and webhook models.",{"type":17,"tag":29,"props":73742,"children":73743},{},[73744],{"type":23,"value":73745},"Unified simplifies this by providing normalized APIs across calendar, meeting recording, messaging, and CRM platforms. Developers can retrieve meeting metadata, transcripts, and recordings through a consistent API and use that data to power AI summarization workflows.",{"type":17,"tag":68,"props":73747,"children":73749},{"id":73748},"why-saas-products-build-ai-meeting-notetakers",[73750],{"type":23,"value":73751},"Why SaaS Products Build AI Meeting Notetakers",{"type":17,"tag":29,"props":73753,"children":73754},{},[73755],{"type":23,"value":73756},"Many SaaS platforms build AI meeting assistants for their customers.",{"type":17,"tag":29,"props":73758,"children":73759},{},[73760],{"type":23,"value":24364},{"type":17,"tag":80,"props":73762,"children":73763},{},[73764,73769,73774,73779,73783],{"type":17,"tag":84,"props":73765,"children":73766},{},[73767],{"type":23,"value":73768},"Meeting intelligence tools",{"type":17,"tag":84,"props":73770,"children":73771},{},[73772],{"type":23,"value":73773},"Sales meeting assistants",{"type":17,"tag":84,"props":73775,"children":73776},{},[73777],{"type":23,"value":73778},"AI note-taking applications",{"type":17,"tag":84,"props":73780,"children":73781},{},[73782],{"type":23,"value":24382},{"type":17,"tag":84,"props":73784,"children":73785},{},[73786],{"type":23,"value":27776},{"type":17,"tag":29,"props":73788,"children":73789},{},[73790],{"type":23,"value":73791},"These products help teams automate several tasks that normally require manual effort.",{"type":17,"tag":29,"props":73793,"children":73794},{},[73795],{"type":23,"value":51629},{"type":17,"tag":80,"props":73797,"children":73798},{},[73799,73809,73819,73829,73839],{"type":17,"tag":84,"props":73800,"children":73801},{},[73802,73807],{"type":17,"tag":48,"props":73803,"children":73804},{},[73805],{"type":23,"value":73806},"Automatic meeting summaries",{"type":23,"value":73808}," generated from transcripts",{"type":17,"tag":84,"props":73810,"children":73811},{},[73812,73817],{"type":17,"tag":48,"props":73813,"children":73814},{},[73815],{"type":23,"value":73816},"Action item extraction",{"type":23,"value":73818}," from meeting conversations",{"type":17,"tag":84,"props":73820,"children":73821},{},[73822,73827],{"type":17,"tag":48,"props":73823,"children":73824},{},[73825],{"type":23,"value":73826},"Follow-up reminders",{"type":23,"value":73828}," created automatically",{"type":17,"tag":84,"props":73830,"children":73831},{},[73832,73837],{"type":17,"tag":48,"props":73833,"children":73834},{},[73835],{"type":23,"value":73836},"CRM updates",{"type":23,"value":73838}," based on meeting outcomes",{"type":17,"tag":84,"props":73840,"children":73841},{},[73842],{"type":17,"tag":48,"props":73843,"children":73844},{},[73845],{"type":23,"value":73846},"Searchable meeting knowledge bases",{"type":17,"tag":29,"props":73848,"children":73849},{},[73850],{"type":23,"value":73851},"By connecting to customer calendars and meeting platforms, SaaS products can automate note-taking across all meetings without requiring users to manually record notes.",{"type":17,"tag":68,"props":73853,"children":73855},{"id":73854},"unified-categories-used-for-ai-meeting-notetakers",[73856],{"type":23,"value":73857},"Unified Categories Used for AI Meeting Notetakers",{"type":17,"tag":29,"props":73859,"children":73860},{},[73861,73863,73867],{"type":23,"value":73862},"An AI meeting assistant typically connects to several ",{"type":17,"tag":133,"props":73864,"children":73865},{"href":7691},[73866],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":73869,"children":73870},{},[73871,73889],{"type":17,"tag":7235,"props":73872,"children":73873},{},[73874],{"type":17,"tag":7239,"props":73875,"children":73876},{},[73877,73881,73885],{"type":17,"tag":7243,"props":73878,"children":73879},{},[73880],{"type":23,"value":7247},{"type":17,"tag":7243,"props":73882,"children":73883},{},[73884],{"type":23,"value":20787},{"type":17,"tag":7243,"props":73886,"children":73887},{},[73888],{"type":23,"value":24530},{"type":17,"tag":7259,"props":73890,"children":73891},{},[73892,73910,73927],{"type":17,"tag":7239,"props":73893,"children":73894},{},[73895,73900,73905],{"type":17,"tag":7266,"props":73896,"children":73897},{},[73898],{"type":23,"value":73899},"Calendar & Meetings",{"type":17,"tag":7266,"props":73901,"children":73902},{},[73903],{"type":23,"value":73904},"Meeting schedules and recordings from providers like Zoom and Google Meet",{"type":17,"tag":7266,"props":73906,"children":73907},{},[73908],{"type":23,"value":73909},"calendar_event, calendar_recording",{"type":17,"tag":7239,"props":73911,"children":73912},{},[73913,73917,73922],{"type":17,"tag":7266,"props":73914,"children":73915},{},[73916],{"type":23,"value":25731},{"type":17,"tag":7266,"props":73918,"children":73919},{},[73920],{"type":23,"value":73921},"Customer and deal context stored in platforms like Salesforce",{"type":17,"tag":7266,"props":73923,"children":73924},{},[73925],{"type":23,"value":73926},"contact, company, deal",{"type":17,"tag":7239,"props":73928,"children":73929},{},[73930,73934,73939],{"type":17,"tag":7266,"props":73931,"children":73932},{},[73933],{"type":23,"value":24595},{"type":17,"tag":7266,"props":73935,"children":73936},{},[73937],{"type":23,"value":73938},"Prompt generation and model responses",{"type":17,"tag":7266,"props":73940,"children":73941},{},[73942],{"type":23,"value":24605},{"type":17,"tag":29,"props":73944,"children":73945},{},[73946],{"type":23,"value":73947},"Using normalized APIs across these categories allows developers to build AI assistants without implementing separate integrations for each meeting provider.",{"type":17,"tag":68,"props":73949,"children":73951},{"id":73950},"unified-calendar-and-meeting-objects",[73952],{"type":23,"value":73953},"Unified Calendar and Meeting Objects",{"type":17,"tag":29,"props":73955,"children":73956},{},[73957],{"type":23,"value":73958},"Unified normalizes meeting data across multiple providers through two primary objects.",{"type":17,"tag":239,"props":73960,"children":73962},{"id":73961},"calendar-event",[73963],{"type":23,"value":73964},"Calendar Event",{"type":17,"tag":29,"props":73966,"children":73967},{},[73968,73969,73974],{"type":23,"value":6712},{"type":17,"tag":48,"props":73970,"children":73971},{},[73972],{"type":23,"value":73973},"calendar_event",{"type":23,"value":73975}," object represents a scheduled meeting.",{"type":17,"tag":29,"props":73977,"children":73978},{},[73979],{"type":23,"value":72497},{"type":17,"tag":7231,"props":73981,"children":73982},{},[73983,74001],{"type":17,"tag":7235,"props":73984,"children":73985},{},[73986],{"type":17,"tag":7239,"props":73987,"children":73988},{},[73989,73993,73997],{"type":17,"tag":7243,"props":73990,"children":73991},{},[73992],{"type":23,"value":24651},{"type":17,"tag":7243,"props":73994,"children":73995},{},[73996],{"type":23,"value":24525},{"type":17,"tag":7243,"props":73998,"children":73999},{},[74000],{"type":23,"value":70329},{"type":17,"tag":7259,"props":74002,"children":74003},{},[74004,74021,74039,74056,74073,74091,74109,74127,74145],{"type":17,"tag":7239,"props":74005,"children":74006},{},[74007,74011,74016],{"type":17,"tag":7266,"props":74008,"children":74009},{},[74010],{"type":23,"value":18766},{"type":17,"tag":7266,"props":74012,"children":74013},{},[74014],{"type":23,"value":74015},"Unique identifier for the meeting",{"type":17,"tag":7266,"props":74017,"children":74018},{},[74019],{"type":23,"value":74020},"Internal reference",{"type":17,"tag":7239,"props":74022,"children":74023},{},[74024,74029,74034],{"type":17,"tag":7266,"props":74025,"children":74026},{},[74027],{"type":23,"value":74028},"title / subject",{"type":17,"tag":7266,"props":74030,"children":74031},{},[74032],{"type":23,"value":74033},"Meeting title",{"type":17,"tag":7266,"props":74035,"children":74036},{},[74037],{"type":23,"value":74038},"Used in meeting summaries",{"type":17,"tag":7239,"props":74040,"children":74041},{},[74042,74046,74051],{"type":17,"tag":7266,"props":74043,"children":74044},{},[74045],{"type":23,"value":21051},{"type":17,"tag":7266,"props":74047,"children":74048},{},[74049],{"type":23,"value":74050},"Meeting start time",{"type":17,"tag":7266,"props":74052,"children":74053},{},[74054],{"type":23,"value":74055},"Used to schedule the notetaker",{"type":17,"tag":7239,"props":74057,"children":74058},{},[74059,74063,74068],{"type":17,"tag":7266,"props":74060,"children":74061},{},[74062],{"type":23,"value":21060},{"type":17,"tag":7266,"props":74064,"children":74065},{},[74066],{"type":23,"value":74067},"Meeting end time",{"type":17,"tag":7266,"props":74069,"children":74070},{},[74071],{"type":23,"value":74072},"Used to stop recording",{"type":17,"tag":7239,"props":74074,"children":74075},{},[74076,74081,74086],{"type":17,"tag":7266,"props":74077,"children":74078},{},[74079],{"type":23,"value":74080},"attendees",{"type":17,"tag":7266,"props":74082,"children":74083},{},[74084],{"type":23,"value":74085},"List of participants",{"type":17,"tag":7266,"props":74087,"children":74088},{},[74089],{"type":23,"value":74090},"Used to identify speakers",{"type":17,"tag":7239,"props":74092,"children":74093},{},[74094,74099,74104],{"type":17,"tag":7266,"props":74095,"children":74096},{},[74097],{"type":23,"value":74098},"conference",{"type":17,"tag":7266,"props":74100,"children":74101},{},[74102],{"type":23,"value":74103},"Meeting provider and join URL",{"type":17,"tag":7266,"props":74105,"children":74106},{},[74107],{"type":23,"value":74108},"Used for meeting access",{"type":17,"tag":7239,"props":74110,"children":74111},{},[74112,74117,74122],{"type":17,"tag":7266,"props":74113,"children":74114},{},[74115],{"type":23,"value":74116},"organizer",{"type":17,"tag":7266,"props":74118,"children":74119},{},[74120],{"type":23,"value":74121},"Meeting creator",{"type":17,"tag":7266,"props":74123,"children":74124},{},[74125],{"type":23,"value":74126},"Used for CRM ownership context",{"type":17,"tag":7239,"props":74128,"children":74129},{},[74130,74135,74140],{"type":17,"tag":7266,"props":74131,"children":74132},{},[74133],{"type":23,"value":74134},"location",{"type":17,"tag":7266,"props":74136,"children":74137},{},[74138],{"type":23,"value":74139},"Meeting location or link",{"type":17,"tag":7266,"props":74141,"children":74142},{},[74143],{"type":23,"value":74144},"Display context",{"type":17,"tag":7239,"props":74146,"children":74147},{},[74148,74152,74157],{"type":17,"tag":7266,"props":74149,"children":74150},{},[74151],{"type":23,"value":12107},{"type":17,"tag":7266,"props":74153,"children":74154},{},[74155],{"type":23,"value":74156},"Provider link to the event",{"type":17,"tag":7266,"props":74158,"children":74159},{},[74160],{"type":23,"value":74161},"Reference to source meeting",{"type":17,"tag":29,"props":74163,"children":74164},{},[74165],{"type":23,"value":74166},"Events can be retrieved using:",{"type":17,"tag":6893,"props":74168,"children":74171},{"className":74169,"code":74170,"language":20901,"meta":23},[20899],"GET /calendar/{connection_id}/event\nGET /calendar/{connection_id}/event/{id}\n",[74172],{"type":17,"tag":6121,"props":74173,"children":74174},{"__ignoreMap":7},[74175],{"type":23,"value":74170},{"type":17,"tag":29,"props":74177,"children":74178},{},[74179],{"type":23,"value":74180},"These endpoints allow applications to identify upcoming meetings and retrieve meeting metadata.",{"type":17,"tag":239,"props":74182,"children":74184},{"id":74183},"meeting-recording",[74185],{"type":23,"value":74186},"Meeting Recording",{"type":17,"tag":29,"props":74188,"children":74189},{},[74190,74191,74196],{"type":23,"value":6712},{"type":17,"tag":48,"props":74192,"children":74193},{},[74194],{"type":23,"value":74195},"calendar_recording",{"type":23,"value":74197}," object represents a meeting recording and transcript.",{"type":17,"tag":29,"props":74199,"children":74200},{},[74201],{"type":23,"value":72497},{"type":17,"tag":7231,"props":74203,"children":74204},{},[74205,74223],{"type":17,"tag":7235,"props":74206,"children":74207},{},[74208],{"type":17,"tag":7239,"props":74209,"children":74210},{},[74211,74215,74219],{"type":17,"tag":7243,"props":74212,"children":74213},{},[74214],{"type":23,"value":24651},{"type":17,"tag":7243,"props":74216,"children":74217},{},[74218],{"type":23,"value":24525},{"type":17,"tag":7243,"props":74220,"children":74221},{},[74222],{"type":23,"value":70329},{"type":17,"tag":7259,"props":74224,"children":74225},{},[74226,74242,74260,74278,74296,74314,74334,74352,74370,74388],{"type":17,"tag":7239,"props":74227,"children":74228},{},[74229,74233,74238],{"type":17,"tag":7266,"props":74230,"children":74231},{},[74232],{"type":23,"value":18766},{"type":17,"tag":7266,"props":74234,"children":74235},{},[74236],{"type":23,"value":74237},"Recording identifier",{"type":17,"tag":7266,"props":74239,"children":74240},{},[74241],{"type":23,"value":74020},{"type":17,"tag":7239,"props":74243,"children":74244},{},[74245,74250,74255],{"type":17,"tag":7266,"props":74246,"children":74247},{},[74248],{"type":23,"value":74249},"event_id",{"type":17,"tag":7266,"props":74251,"children":74252},{},[74253],{"type":23,"value":74254},"Associated meeting event",{"type":17,"tag":7266,"props":74256,"children":74257},{},[74258],{"type":23,"value":74259},"Links recording to event",{"type":17,"tag":7239,"props":74261,"children":74262},{},[74263,74268,74273],{"type":17,"tag":7266,"props":74264,"children":74265},{},[74266],{"type":23,"value":74267},"start_at / end_at",{"type":17,"tag":7266,"props":74269,"children":74270},{},[74271],{"type":23,"value":74272},"Recording timestamps",{"type":17,"tag":7266,"props":74274,"children":74275},{},[74276],{"type":23,"value":74277},"Used for timeline analysis",{"type":17,"tag":7239,"props":74279,"children":74280},{},[74281,74286,74291],{"type":17,"tag":7266,"props":74282,"children":74283},{},[74284],{"type":23,"value":74285},"provider",{"type":17,"tag":7266,"props":74287,"children":74288},{},[74289],{"type":23,"value":74290},"Recording provider (Zoom, Teams, etc.)",{"type":17,"tag":7266,"props":74292,"children":74293},{},[74294],{"type":23,"value":74295},"Source platform",{"type":17,"tag":7239,"props":74297,"children":74298},{},[74299,74304,74309],{"type":17,"tag":7266,"props":74300,"children":74301},{},[74302],{"type":23,"value":74303},"duration_seconds",{"type":17,"tag":7266,"props":74305,"children":74306},{},[74307],{"type":23,"value":74308},"Recording duration",{"type":17,"tag":7266,"props":74310,"children":74311},{},[74312],{"type":23,"value":74313},"Meeting length analytics",{"type":17,"tag":7239,"props":74315,"children":74316},{},[74317,74324,74329],{"type":17,"tag":7266,"props":74318,"children":74319},{},[74320,74321],{"type":23,"value":38590},{"type":17,"tag":22203,"props":74322,"children":74323},{},[],{"type":17,"tag":7266,"props":74325,"children":74326},{},[74327],{"type":23,"value":74328},"Media segments including transcripts",{"type":17,"tag":7266,"props":74330,"children":74331},{},[74332],{"type":23,"value":74333},"Transcript extraction",{"type":17,"tag":7239,"props":74335,"children":74336},{},[74337,74342,74347],{"type":17,"tag":7266,"props":74338,"children":74339},{},[74340],{"type":23,"value":74341},"transcript_download_url",{"type":17,"tag":7266,"props":74343,"children":74344},{},[74345],{"type":23,"value":74346},"URL for full transcript",{"type":17,"tag":7266,"props":74348,"children":74349},{},[74350],{"type":23,"value":74351},"Used for summarization",{"type":17,"tag":7239,"props":74353,"children":74354},{},[74355,74360,74365],{"type":17,"tag":7266,"props":74356,"children":74357},{},[74358],{"type":23,"value":74359},"recording_download_url",{"type":17,"tag":7266,"props":74361,"children":74362},{},[74363],{"type":23,"value":74364},"URL for audio/video",{"type":17,"tag":7266,"props":74366,"children":74367},{},[74368],{"type":23,"value":74369},"Optional processing",{"type":17,"tag":7239,"props":74371,"children":74372},{},[74373,74378,74383],{"type":17,"tag":7266,"props":74374,"children":74375},{},[74376],{"type":23,"value":74377},"language",{"type":17,"tag":7266,"props":74379,"children":74380},{},[74381],{"type":23,"value":74382},"Transcript language",{"type":17,"tag":7266,"props":74384,"children":74385},{},[74386],{"type":23,"value":74387},"Model selection",{"type":17,"tag":7239,"props":74389,"children":74390},{},[74391,74395,74400],{"type":17,"tag":7266,"props":74392,"children":74393},{},[74394],{"type":23,"value":12107},{"type":17,"tag":7266,"props":74396,"children":74397},{},[74398],{"type":23,"value":74399},"Recording view link",{"type":17,"tag":7266,"props":74401,"children":74402},{},[74403],{"type":23,"value":74404},"Reference to original recording",{"type":17,"tag":29,"props":74406,"children":74407},{},[74408],{"type":23,"value":74409},"Recordings can be retrieved using:",{"type":17,"tag":6893,"props":74411,"children":74414},{"className":74412,"code":74413,"language":20901,"meta":23},[20899],"GET /calendar/{connection_id}/recording\nGET /calendar/{connection_id}/recording/{id}\n",[74415],{"type":17,"tag":6121,"props":74416,"children":74417},{"__ignoreMap":7},[74418],{"type":23,"value":74413},{"type":17,"tag":29,"props":74420,"children":74421},{},[74422],{"type":23,"value":74423},"These objects provide everything needed to generate AI meeting notes.",{"type":17,"tag":68,"props":74425,"children":74427},{"id":74426},"retrieving-meeting-transcripts",[74428],{"type":23,"value":74429},"Retrieving Meeting Transcripts",{"type":17,"tag":29,"props":74431,"children":74432},{},[74433,74435,74439],{"type":23,"value":74434},"Meeting transcripts are stored within the ",{"type":17,"tag":48,"props":74436,"children":74437},{},[74438],{"type":23,"value":38590},{"type":23,"value":74440}," array of a recording object.",{"type":17,"tag":29,"props":74442,"children":74443},{},[74444],{"type":23,"value":74445},"Each media segment may include transcript data.",{"type":17,"tag":29,"props":74447,"children":74448},{},[74449],{"type":23,"value":74450},"Important transcript fields include:",{"type":17,"tag":7231,"props":74452,"children":74453},{},[74454,74468],{"type":17,"tag":7235,"props":74455,"children":74456},{},[74457],{"type":17,"tag":7239,"props":74458,"children":74459},{},[74460,74464],{"type":17,"tag":7243,"props":74461,"children":74462},{},[74463],{"type":23,"value":24651},{"type":17,"tag":7243,"props":74465,"children":74466},{},[74467],{"type":23,"value":24525},{"type":17,"tag":7259,"props":74469,"children":74470},{},[74471,74483,74495,74507,74520],{"type":17,"tag":7239,"props":74472,"children":74473},{},[74474,74478],{"type":17,"tag":7266,"props":74475,"children":74476},{},[74477],{"type":23,"value":21051},{"type":17,"tag":7266,"props":74479,"children":74480},{},[74481],{"type":23,"value":74482},"Timestamp when the speech segment begins",{"type":17,"tag":7239,"props":74484,"children":74485},{},[74486,74490],{"type":17,"tag":7266,"props":74487,"children":74488},{},[74489],{"type":23,"value":21060},{"type":17,"tag":7266,"props":74491,"children":74492},{},[74493],{"type":23,"value":74494},"Timestamp when the segment ends",{"type":17,"tag":7239,"props":74496,"children":74497},{},[74498,74502],{"type":17,"tag":7266,"props":74499,"children":74500},{},[74501],{"type":23,"value":23},{"type":17,"tag":7266,"props":74503,"children":74504},{},[74505],{"type":23,"value":74506},"Transcript text",{"type":17,"tag":7239,"props":74508,"children":74509},{},[74510,74515],{"type":17,"tag":7266,"props":74511,"children":74512},{},[74513],{"type":23,"value":74514},"attendee",{"type":17,"tag":7266,"props":74516,"children":74517},{},[74518],{"type":23,"value":74519},"Speaker metadata including name and email",{"type":17,"tag":7239,"props":74521,"children":74522},{},[74523,74527],{"type":17,"tag":7266,"props":74524,"children":74525},{},[74526],{"type":23,"value":74377},{"type":17,"tag":7266,"props":74528,"children":74529},{},[74530],{"type":23,"value":74531},"Language of the segment",{"type":17,"tag":29,"props":74533,"children":74534},{},[74535],{"type":23,"value":74536},"These transcript segments can be assembled into a full conversation transcript.",{"type":17,"tag":29,"props":74538,"children":74539},{},[74540],{"type":23,"value":74541},"Applications can retrieve transcripts in two ways:",{"type":17,"tag":80,"props":74543,"children":74544},{},[74545,74550],{"type":17,"tag":84,"props":74546,"children":74547},{},[74548],{"type":23,"value":74549},"iterate through transcript segments returned in the API response",{"type":17,"tag":84,"props":74551,"children":74552},{},[74553,74555],{"type":23,"value":74554},"download the full transcript using ",{"type":17,"tag":6121,"props":74556,"children":74558},{"className":74557},[],[74559],{"type":23,"value":74341},{"type":17,"tag":29,"props":74561,"children":74562},{},[74563],{"type":23,"value":74564},"Once the transcript text is assembled, it can be passed to an AI model to generate summaries.",{"type":17,"tag":68,"props":74566,"children":74567},{"id":73265},[74568],{"type":23,"value":73268},{"type":17,"tag":29,"props":74570,"children":74571},{},[74572,74574,74578],{"type":23,"value":74573},"Customers authorize their meeting platforms and CRM systems through ",{"type":17,"tag":48,"props":74575,"children":74576},{},[74577],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":74580,"children":74581},{},[74582],{"type":23,"value":26189},{"type":17,"tag":6154,"props":74584,"children":74585},{},[74586,74590,74595,74600],{"type":17,"tag":84,"props":74587,"children":74588},{},[74589],{"type":23,"value":73291},{"type":17,"tag":84,"props":74591,"children":74592},{},[74593],{"type":23,"value":74594},"The user selects integrations such as Zoom, Google Meet, Outlook, or Salesforce.",{"type":17,"tag":84,"props":74596,"children":74597},{},[74598],{"type":23,"value":74599},"The user authorizes access to their accounts.",{"type":17,"tag":84,"props":74601,"children":74602},{},[74603,74604,74608],{"type":23,"value":73306},{"type":17,"tag":48,"props":74605,"children":74606},{},[74607],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":74610,"children":74611},{},[74612],{"type":23,"value":73316},{"type":17,"tag":6893,"props":74614,"children":74616},{"className":74615,"code":25047,"language":20901,"meta":23},[20899],[74617],{"type":17,"tag":6121,"props":74618,"children":74619},{"__ignoreMap":7},[74620],{"type":23,"value":25047},{"type":17,"tag":29,"props":74622,"children":74623},{},[74624],{"type":23,"value":74625},"All subsequent API requests use this identifier to retrieve meeting data.",{"type":17,"tag":68,"props":74627,"children":74629},{"id":74628},"generating-ai-meeting-notes",[74630],{"type":23,"value":74631},"Generating AI Meeting Notes",{"type":17,"tag":29,"props":74633,"children":74634},{},[74635,74637,74641],{"type":23,"value":74636},"Once transcripts are retrieved, the application can generate summaries using Unified's ",{"type":17,"tag":133,"props":74638,"children":74639},{"href":16186},[74640],{"type":23,"value":25249},{"type":23,"value":54},{"type":17,"tag":29,"props":74643,"children":74644},{},[74645,74647,74652],{"type":23,"value":74646},"A prompt is created using the ",{"type":17,"tag":48,"props":74648,"children":74649},{},[74650],{"type":23,"value":74651},"genai_prompt",{"type":23,"value":74653}," object.",{"type":17,"tag":29,"props":74655,"children":74656},{},[74657],{"type":23,"value":74658},"Example prompt request:",{"type":17,"tag":6893,"props":74660,"children":74663},{"className":74661,"code":74662,"language":20901,"meta":23},[20899],"{\n  \"messages\": [\n    { \"role\": \"system\", \"content\": \"You are an AI meeting assistant.\" },\n    { \"role\": \"user\", \"content\": \"Summarize this meeting and extract action items.\" }\n  ]\n}\n",[74664],{"type":17,"tag":6121,"props":74665,"children":74666},{"__ignoreMap":7},[74667],{"type":23,"value":74662},{"type":17,"tag":29,"props":74669,"children":74670},{},[74671],{"type":23,"value":74672},"The request can include parameters such as:",{"type":17,"tag":80,"props":74674,"children":74675},{},[74676,74685,74694],{"type":17,"tag":84,"props":74677,"children":74678},{},[74679],{"type":17,"tag":6121,"props":74680,"children":74682},{"className":74681},[],[74683],{"type":23,"value":74684},"model_id",{"type":17,"tag":84,"props":74686,"children":74687},{},[74688],{"type":17,"tag":6121,"props":74689,"children":74691},{"className":74690},[],[74692],{"type":23,"value":74693},"temperature",{"type":17,"tag":84,"props":74695,"children":74696},{},[74697],{"type":17,"tag":6121,"props":74698,"children":74700},{"className":74699},[],[74701],{"type":23,"value":74702},"max_tokens",{"type":17,"tag":29,"props":74704,"children":74705},{},[74706],{"type":23,"value":19936},{"type":17,"tag":80,"props":74708,"children":74709},{},[74710,74715,74719],{"type":17,"tag":84,"props":74711,"children":74712},{},[74713],{"type":23,"value":74714},"generated summary text",{"type":17,"tag":84,"props":74716,"children":74717},{},[74718],{"type":23,"value":25282},{"type":17,"tag":84,"props":74720,"children":74721},{},[74722],{"type":23,"value":74723},"model response metadata",{"type":17,"tag":29,"props":74725,"children":74726},{},[74727],{"type":23,"value":74728},"This allows applications to generate:",{"type":17,"tag":80,"props":74730,"children":74731},{},[74732,74737,74742,74747],{"type":17,"tag":84,"props":74733,"children":74734},{},[74735],{"type":23,"value":74736},"meeting summaries",{"type":17,"tag":84,"props":74738,"children":74739},{},[74740],{"type":23,"value":74741},"key discussion points",{"type":17,"tag":84,"props":74743,"children":74744},{},[74745],{"type":23,"value":74746},"follow-up tasks",{"type":17,"tag":84,"props":74748,"children":74749},{},[74750],{"type":23,"value":74751},"sentiment insights",{"type":17,"tag":68,"props":74753,"children":74755},{"id":74754},"writing-meeting-insights-back-to-crm",[74756],{"type":23,"value":74757},"Writing Meeting Insights Back to CRM",{"type":17,"tag":29,"props":74759,"children":74760},{},[74761],{"type":23,"value":74762},"Many AI meeting assistants automatically update CRM records.",{"type":17,"tag":29,"props":74764,"children":74765},{},[74766],{"type":23,"value":74767},"For example, after summarizing a meeting, the application can:",{"type":17,"tag":80,"props":74769,"children":74770},{},[74771,74781,74791,74801],{"type":17,"tag":84,"props":74772,"children":74773},{},[74774,74776],{"type":23,"value":74775},"attach the summary to a ",{"type":17,"tag":48,"props":74777,"children":74778},{},[74779],{"type":23,"value":74780},"deal record",{"type":17,"tag":84,"props":74782,"children":74783},{},[74784,74786],{"type":23,"value":74785},"create a ",{"type":17,"tag":48,"props":74787,"children":74788},{},[74789],{"type":23,"value":74790},"note activity",{"type":17,"tag":84,"props":74792,"children":74793},{},[74794,74796],{"type":23,"value":74795},"update ",{"type":17,"tag":48,"props":74797,"children":74798},{},[74799],{"type":23,"value":74800},"deal stage or next steps",{"type":17,"tag":84,"props":74802,"children":74803},{},[74804,74806],{"type":23,"value":74805},"assign ",{"type":17,"tag":48,"props":74807,"children":74808},{},[74809],{"type":23,"value":74746},{"type":17,"tag":29,"props":74811,"children":74812},{},[74813],{"type":23,"value":74814},"Using CRM APIs, the meeting insights become part of the customer's activity history.",{"type":17,"tag":29,"props":74816,"children":74817},{},[74818],{"type":23,"value":74819},"This ensures sales teams always have an accurate record of customer conversations.",{"type":17,"tag":68,"props":74821,"children":74823},{"id":74822},"real-time-meeting-automation-with-webhooks",[74824],{"type":23,"value":74825},"Real-Time Meeting Automation with Webhooks",{"type":17,"tag":29,"props":74827,"children":74828},{},[74829],{"type":23,"value":74830},"Unified provides webhook events that allow meeting assistants to react to calendar changes in real time.",{"type":17,"tag":29,"props":74832,"children":74833},{},[74834],{"type":23,"value":74835},"Important events include:",{"type":17,"tag":7231,"props":74837,"children":74838},{},[74839,74853],{"type":17,"tag":7235,"props":74840,"children":74841},{},[74842],{"type":17,"tag":7239,"props":74843,"children":74844},{},[74845,74849],{"type":17,"tag":7243,"props":74846,"children":74847},{},[74848],{"type":23,"value":14528},{"type":17,"tag":7243,"props":74850,"children":74851},{},[74852],{"type":23,"value":24525},{"type":17,"tag":7259,"props":74854,"children":74855},{},[74856,74869,74882,74895,74908,74921,74934],{"type":17,"tag":7239,"props":74857,"children":74858},{},[74859,74864],{"type":17,"tag":7266,"props":74860,"children":74861},{},[74862],{"type":23,"value":74863},"event.created",{"type":17,"tag":7266,"props":74865,"children":74866},{},[74867],{"type":23,"value":74868},"New meeting scheduled",{"type":17,"tag":7239,"props":74870,"children":74871},{},[74872,74877],{"type":17,"tag":7266,"props":74873,"children":74874},{},[74875],{"type":23,"value":74876},"event.updated",{"type":17,"tag":7266,"props":74878,"children":74879},{},[74880],{"type":23,"value":74881},"Meeting details changed",{"type":17,"tag":7239,"props":74883,"children":74884},{},[74885,74890],{"type":17,"tag":7266,"props":74886,"children":74887},{},[74888],{"type":23,"value":74889},"event.deleted",{"type":17,"tag":7266,"props":74891,"children":74892},{},[74893],{"type":23,"value":74894},"Meeting cancelled",{"type":17,"tag":7239,"props":74896,"children":74897},{},[74898,74903],{"type":17,"tag":7266,"props":74899,"children":74900},{},[74901],{"type":23,"value":74902},"event.started",{"type":17,"tag":7266,"props":74904,"children":74905},{},[74906],{"type":23,"value":74907},"Meeting begins",{"type":17,"tag":7239,"props":74909,"children":74910},{},[74911,74916],{"type":17,"tag":7266,"props":74912,"children":74913},{},[74914],{"type":23,"value":74915},"event.ended",{"type":17,"tag":7266,"props":74917,"children":74918},{},[74919],{"type":23,"value":74920},"Meeting finishes",{"type":17,"tag":7239,"props":74922,"children":74923},{},[74924,74929],{"type":17,"tag":7266,"props":74925,"children":74926},{},[74927],{"type":23,"value":74928},"recording.created",{"type":17,"tag":7266,"props":74930,"children":74931},{},[74932],{"type":23,"value":74933},"Recording becomes available",{"type":17,"tag":7239,"props":74935,"children":74936},{},[74937,74942],{"type":17,"tag":7266,"props":74938,"children":74939},{},[74940],{"type":23,"value":74941},"recording.completed",{"type":17,"tag":7266,"props":74943,"children":74944},{},[74945],{"type":23,"value":74946},"Transcript processing finished",{"type":17,"tag":29,"props":74948,"children":74949},{},[74950],{"type":23,"value":74951},"These events allow AI assistants to:",{"type":17,"tag":80,"props":74953,"children":74954},{},[74955,74960,74965,74970],{"type":17,"tag":84,"props":74956,"children":74957},{},[74958],{"type":23,"value":74959},"join meetings automatically",{"type":17,"tag":84,"props":74961,"children":74962},{},[74963],{"type":23,"value":74964},"start recording at the correct time",{"type":17,"tag":84,"props":74966,"children":74967},{},[74968],{"type":23,"value":74969},"retrieve transcripts once recordings are processed",{"type":17,"tag":84,"props":74971,"children":74972},{},[74973],{"type":23,"value":74974},"trigger summarization workflows immediately",{"type":17,"tag":68,"props":74976,"children":74977},{"id":25342},[74978],{"type":23,"value":25345},{"type":17,"tag":29,"props":74980,"children":74981},{},[74982],{"type":23,"value":74983},"Unified supports a broad range of meeting and CRM integrations.",{"type":17,"tag":239,"props":74985,"children":74987},{"id":74986},"calendar-meetings-27-integrations",[74988],{"type":23,"value":74989},"Calendar & Meetings (27 integrations)",{"type":17,"tag":29,"props":74991,"children":74992},{},[74993],{"type":23,"value":24364},{"type":17,"tag":80,"props":74995,"children":74996},{},[74997,75001,75005,75009,75013,75017,75021],{"type":17,"tag":84,"props":74998,"children":74999},{},[75000],{"type":23,"value":14472},{"type":17,"tag":84,"props":75002,"children":75003},{},[75004],{"type":23,"value":14045},{"type":17,"tag":84,"props":75006,"children":75007},{},[75008],{"type":23,"value":14455},{"type":17,"tag":84,"props":75010,"children":75011},{},[75012],{"type":23,"value":14066},{"type":17,"tag":84,"props":75014,"children":75015},{},[75016],{"type":23,"value":14129},{"type":17,"tag":84,"props":75018,"children":75019},{},[75020],{"type":23,"value":13678},{"type":17,"tag":84,"props":75022,"children":75023},{},[75024],{"type":23,"value":14108},{"type":17,"tag":239,"props":75026,"children":75028},{"id":75027},"crm-47-integrations",[75029],{"type":23,"value":75030},"CRM (47 integrations)",{"type":17,"tag":29,"props":75032,"children":75033},{},[75034],{"type":23,"value":24364},{"type":17,"tag":80,"props":75036,"children":75037},{},[75038,75042,75046,75050,75054],{"type":17,"tag":84,"props":75039,"children":75040},{},[75041],{"type":23,"value":3179},{"type":17,"tag":84,"props":75043,"children":75044},{},[75045],{"type":23,"value":3184},{"type":17,"tag":84,"props":75047,"children":75048},{},[75049],{"type":23,"value":26530},{"type":17,"tag":84,"props":75051,"children":75052},{},[75053],{"type":23,"value":26535},{"type":17,"tag":84,"props":75055,"children":75056},{},[75057],{"type":23,"value":75058},"Microsoft Dynamics",{"type":17,"tag":29,"props":75060,"children":75061},{},[75062],{"type":23,"value":75063},"This allows AI meeting assistants to support many customer environments without building separate integrations.",{"type":17,"tag":68,"props":75065,"children":75066},{"id":73613},[75067],{"type":23,"value":73616},{"type":17,"tag":29,"props":75069,"children":75070},{},[75071],{"type":23,"value":75072},"Building an AI meeting assistant typically requires multiple integrations across meeting platforms and CRM systems.",{"type":17,"tag":29,"props":75074,"children":75075},{},[75076],{"type":23,"value":34257},{"type":17,"tag":80,"props":75078,"children":75079},{},[75080,75085,75090,75095,75100],{"type":17,"tag":84,"props":75081,"children":75082},{},[75083],{"type":23,"value":75084},"normalized calendar and meeting recording objects",{"type":17,"tag":84,"props":75086,"children":75087},{},[75088],{"type":23,"value":75089},"unified APIs across 27 meeting integrations",{"type":17,"tag":84,"props":75091,"children":75092},{},[75093],{"type":23,"value":75094},"CRM integrations across 47 platforms",{"type":17,"tag":84,"props":75096,"children":75097},{},[75098],{"type":23,"value":75099},"webhook events for real-time meeting workflows",{"type":17,"tag":84,"props":75101,"children":75102},{},[75103],{"type":23,"value":75104},"standardized transcript retrieval across providers",{"type":17,"tag":29,"props":75106,"children":75107},{},[75108],{"type":23,"value":75109},"Instead of maintaining dozens of integrations, product teams can focus on building AI features that automatically summarize meetings, capture action items, and update CRM systems.",{"type":17,"tag":29,"props":75111,"children":75112},{},[75113],{"type":23,"value":75114},"Start building AI meeting notetakers across Zoom, Google Meet, Outlook, Salesforce, and many other platforms today.",{"type":17,"tag":29,"props":75116,"children":75117},{},[75118],{"type":17,"tag":133,"props":75119,"children":75121},{"href":1612,"rel":75120},[214],[75122],{"type":23,"value":44481},{"type":17,"tag":29,"props":75124,"children":75125},{},[75126],{"type":17,"tag":133,"props":75127,"children":75129},{"href":1623,"rel":75128},[214],[75130],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":75132},[75133,75134,75135,75139,75140,75141,75142,75143,75144,75148],{"id":73748,"depth":1629,"text":73751},{"id":73854,"depth":1629,"text":73857},{"id":73950,"depth":1629,"text":73953,"children":75136},[75137,75138],{"id":73961,"depth":1635,"text":73964},{"id":74183,"depth":1635,"text":74186},{"id":74426,"depth":1629,"text":74429},{"id":73265,"depth":1629,"text":73268},{"id":74628,"depth":1629,"text":74631},{"id":74754,"depth":1629,"text":74757},{"id":74822,"depth":1629,"text":74825},{"id":25342,"depth":1629,"text":25345,"children":75145},[75146,75147],{"id":74986,"depth":1635,"text":74989},{"id":75027,"depth":1635,"text":75030},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_an_ai_meeting_notetaker_across_zoom_google_meet_outlook_and_salesforce.md","blog/how_to_build_an_ai_meeting_notetaker_across_zoom_google_meet_outlook_and_salesforce.md","blog/how_to_build_an_ai_meeting_notetaker_across_zoom_google_meet_outlook_and_salesforce",{"_path":75153,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":75154,"description":75155,"img":75156,"date":75157,"tag":12,"body":75158,"_type":1677,"_id":76247,"_source":1679,"_file":76248,"_stem":76249,"_extension":1682},"/blog/how_to_build_a_job_board_integrating_greenhouse_lever_and_73_ats_platforms_with_an_ats_api","How to Build a Job Board Integrating Greenhouse, Lever, and 73+ ATS Platforms with an ATS API","Many SaaS products build job board features so their customers can display open roles directly from their applicant tracking systems (ATS). Recruiting...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_job_board_integrating_greenhouse_lever_and_73_ats_platforms_with_an_ats_api-icon.png","2026-03-10T00:54:00.000Z",{"type":14,"children":75159,"toc":76236},[75160,75165,75168,75175,75180,75185,75199,75205,75210,75214,75242,75247,75252,75275,75280,75286,75297,75345,75350,75362,75368,75373,75378,75613,75618,75646,75651,75657,75667,75671,75697,75701,75709,75714,75720,75725,75734,75746,75751,75755,75825,75830,75836,75841,75846,75927,75932,75963,75968,75974,75984,75989,76025,76044,76049,76094,76106,76112,76122,76126,76169,76174,76178,76183,76187,76210,76215,76220,76228],{"type":17,"tag":18,"props":75161,"children":75163},{"id":75162},"how-to-build-a-job-board-integrating-greenhouse-lever-and-73-ats-platforms-with-an-ats-api",[75164],{"type":23,"value":75154},{"type":17,"tag":25,"props":75166,"children":75167},{},[],{"type":17,"tag":29,"props":75169,"children":75170},{},[75171],{"type":17,"tag":33,"props":75172,"children":75173},{},[75174],{"type":23,"value":70091},{"type":17,"tag":29,"props":75176,"children":75177},{},[75178],{"type":23,"value":75179},"Many SaaS products build job board features so their customers can display open roles directly from their applicant tracking systems (ATS). Recruiting marketplaces, talent platforms, and hiring analytics tools often need to aggregate jobs from systems like Greenhouse or Lever and render them in their own product experience.",{"type":17,"tag":29,"props":75181,"children":75182},{},[75183],{"type":23,"value":75184},"The challenge is that every ATS exposes different APIs, schemas, and authentication models. Pulling job listings from Greenhouse, Workday, iCIMS, SmartRecruiters, or other systems typically requires building and maintaining separate integrations.",{"type":17,"tag":29,"props":75186,"children":75187},{},[75188,75190,75197],{"type":23,"value":75189},"Unified simplifies this process by providing a normalized ",{"type":17,"tag":48,"props":75191,"children":75192},{},[75193],{"type":17,"tag":133,"props":75194,"children":75195},{"href":55696},[75196],{"type":23,"value":55699},{"type":23,"value":75198}," that supports dozens of hiring platforms. Instead of building per-provider connectors, developers can retrieve job postings from many ATS systems through a consistent endpoint and schema. This allows SaaS products to build job boards that automatically display customer job listings and stay synchronized with their ATS.",{"type":17,"tag":68,"props":75200,"children":75202},{"id":75201},"why-saas-products-build-job-board-integrations",[75203],{"type":23,"value":75204},"Why SaaS Products Build Job Board Integrations",{"type":17,"tag":29,"props":75206,"children":75207},{},[75208],{"type":23,"value":75209},"Many B2B SaaS products build job board functionality for their customers.",{"type":17,"tag":29,"props":75211,"children":75212},{},[75213],{"type":23,"value":24364},{"type":17,"tag":80,"props":75215,"children":75216},{},[75217,75222,75227,75232,75237],{"type":17,"tag":84,"props":75218,"children":75219},{},[75220],{"type":23,"value":75221},"Recruiting marketplaces",{"type":17,"tag":84,"props":75223,"children":75224},{},[75225],{"type":23,"value":75226},"Talent sourcing platforms",{"type":17,"tag":84,"props":75228,"children":75229},{},[75230],{"type":23,"value":75231},"Hiring analytics tools",{"type":17,"tag":84,"props":75233,"children":75234},{},[75235],{"type":23,"value":75236},"Employer branding platforms",{"type":17,"tag":84,"props":75238,"children":75239},{},[75240],{"type":23,"value":75241},"Candidate matching platforms",{"type":17,"tag":29,"props":75243,"children":75244},{},[75245],{"type":23,"value":75246},"These products allow customers to connect their ATS so the platform can retrieve job openings and display them to candidates.",{"type":17,"tag":29,"props":75248,"children":75249},{},[75250],{"type":23,"value":75251},"Typical features include:",{"type":17,"tag":80,"props":75253,"children":75254},{},[75255,75260,75265,75270],{"type":17,"tag":84,"props":75256,"children":75257},{},[75258],{"type":23,"value":75259},"Aggregated job listings across companies",{"type":17,"tag":84,"props":75261,"children":75262},{},[75263],{"type":23,"value":75264},"Custom career pages embedded in SaaS products",{"type":17,"tag":84,"props":75266,"children":75267},{},[75268],{"type":23,"value":75269},"Talent marketplaces displaying open roles",{"type":17,"tag":84,"props":75271,"children":75272},{},[75273],{"type":23,"value":75274},"Hiring dashboards that track job availability",{"type":17,"tag":29,"props":75276,"children":75277},{},[75278],{"type":23,"value":75279},"By integrating with customer ATS systems, SaaS platforms can automatically keep job listings updated without manual uploads.",{"type":17,"tag":68,"props":75281,"children":75283},{"id":75282},"unified-ats-category",[75284],{"type":23,"value":75285},"Unified ATS Category",{"type":17,"tag":29,"props":75287,"children":75288},{},[75289,75291,75295],{"type":23,"value":75290},"Unified's ATS API normalizes job data across ",{"type":17,"tag":48,"props":75292,"children":75293},{},[75294],{"type":23,"value":56826},{"type":23,"value":75296},", including platforms such as:",{"type":17,"tag":80,"props":75298,"children":75299},{},[75300,75304,75308,75312,75317,75322,75327,75332,75336,75340],{"type":17,"tag":84,"props":75301,"children":75302},{},[75303],{"type":23,"value":3189},{"type":17,"tag":84,"props":75305,"children":75306},{},[75307],{"type":23,"value":56545},{"type":17,"tag":84,"props":75309,"children":75310},{},[75311],{"type":23,"value":59319},{"type":17,"tag":84,"props":75313,"children":75314},{},[75315],{"type":23,"value":75316},"iCIMS",{"type":17,"tag":84,"props":75318,"children":75319},{},[75320],{"type":23,"value":75321},"SmartRecruiters",{"type":17,"tag":84,"props":75323,"children":75324},{},[75325],{"type":23,"value":75326},"Ashby",{"type":17,"tag":84,"props":75328,"children":75329},{},[75330],{"type":23,"value":75331},"Jobvite",{"type":17,"tag":84,"props":75333,"children":75334},{},[75335],{"type":23,"value":3194},{"type":17,"tag":84,"props":75337,"children":75338},{},[75339],{"type":23,"value":56564},{"type":17,"tag":84,"props":75341,"children":75342},{},[75343],{"type":23,"value":75344},"Zoho Recruit",{"type":17,"tag":29,"props":75346,"children":75347},{},[75348],{"type":23,"value":75349},"These integrations allow SaaS products to support many hiring platforms with a single implementation.",{"type":17,"tag":29,"props":75351,"children":75352},{},[75353,75355,75360],{"type":23,"value":75354},"The primary object used for job boards is the ",{"type":17,"tag":48,"props":75356,"children":75357},{},[75358],{"type":23,"value":75359},"job object",{"type":23,"value":75361},", which represents a job posting or requisition in an ATS.",{"type":17,"tag":68,"props":75363,"children":75365},{"id":75364},"unified-job-object-and-key-fields",[75366],{"type":23,"value":75367},"Unified Job Object and Key Fields",{"type":17,"tag":29,"props":75369,"children":75370},{},[75371],{"type":23,"value":75372},"Unified standardizes job records across ATS providers.",{"type":17,"tag":29,"props":75374,"children":75375},{},[75376],{"type":23,"value":75377},"Important job fields include:",{"type":17,"tag":7231,"props":75379,"children":75380},{},[75381,75400],{"type":17,"tag":7235,"props":75382,"children":75383},{},[75384],{"type":17,"tag":7239,"props":75385,"children":75386},{},[75387,75391,75395],{"type":17,"tag":7243,"props":75388,"children":75389},{},[75390],{"type":23,"value":24651},{"type":17,"tag":7243,"props":75392,"children":75393},{},[75394],{"type":23,"value":24525},{"type":17,"tag":7243,"props":75396,"children":75397},{},[75398],{"type":23,"value":75399},"Job Board Usage",{"type":17,"tag":7259,"props":75401,"children":75402},{},[75403,75420,75437,75454,75471,75489,75507,75525,75543,75561,75579,75596],{"type":17,"tag":7239,"props":75404,"children":75405},{},[75406,75410,75415],{"type":17,"tag":7266,"props":75407,"children":75408},{},[75409],{"type":23,"value":18766},{"type":17,"tag":7266,"props":75411,"children":75412},{},[75413],{"type":23,"value":75414},"Unique identifier for the job",{"type":17,"tag":7266,"props":75416,"children":75417},{},[75418],{"type":23,"value":75419},"Used internally to track listings",{"type":17,"tag":7239,"props":75421,"children":75422},{},[75423,75427,75432],{"type":17,"tag":7266,"props":75424,"children":75425},{},[75426],{"type":23,"value":18781},{"type":17,"tag":7266,"props":75428,"children":75429},{},[75430],{"type":23,"value":75431},"Job title",{"type":17,"tag":7266,"props":75433,"children":75434},{},[75435],{"type":23,"value":75436},"Displayed as the primary listing title",{"type":17,"tag":7239,"props":75438,"children":75439},{},[75440,75444,75449],{"type":17,"tag":7266,"props":75441,"children":75442},{},[75443],{"type":23,"value":24679},{"type":17,"tag":7266,"props":75445,"children":75446},{},[75447],{"type":23,"value":75448},"Full job description",{"type":17,"tag":7266,"props":75450,"children":75451},{},[75452],{"type":23,"value":75453},"Rendered on the job details page",{"type":17,"tag":7239,"props":75455,"children":75456},{},[75457,75461,75466],{"type":17,"tag":7266,"props":75458,"children":75459},{},[75460],{"type":23,"value":19949},{"type":17,"tag":7266,"props":75462,"children":75463},{},[75464],{"type":23,"value":75465},"Job state (open, closed, etc.)",{"type":17,"tag":7266,"props":75467,"children":75468},{},[75469],{"type":23,"value":75470},"Filter to show only active roles",{"type":17,"tag":7239,"props":75472,"children":75473},{},[75474,75479,75484],{"type":17,"tag":7266,"props":75475,"children":75476},{},[75477],{"type":23,"value":75478},"public_job_urls",{"type":17,"tag":7266,"props":75480,"children":75481},{},[75482],{"type":23,"value":75483},"Public apply URLs",{"type":17,"tag":7266,"props":75485,"children":75486},{},[75487],{"type":23,"value":75488},"Used for 'Apply' buttons",{"type":17,"tag":7239,"props":75490,"children":75491},{},[75492,75497,75502],{"type":17,"tag":7266,"props":75493,"children":75494},{},[75495],{"type":23,"value":75496},"addresses",{"type":17,"tag":7266,"props":75498,"children":75499},{},[75500],{"type":23,"value":75501},"Job location information",{"type":17,"tag":7266,"props":75503,"children":75504},{},[75505],{"type":23,"value":75506},"Display city or region",{"type":17,"tag":7239,"props":75508,"children":75509},{},[75510,75515,75520],{"type":17,"tag":7266,"props":75511,"children":75512},{},[75513],{"type":23,"value":75514},"employment_type",{"type":17,"tag":7266,"props":75516,"children":75517},{},[75518],{"type":23,"value":75519},"Employment classification",{"type":17,"tag":7266,"props":75521,"children":75522},{},[75523],{"type":23,"value":75524},"Show full-time, part-time, contract",{"type":17,"tag":7239,"props":75526,"children":75527},{},[75528,75533,75538],{"type":17,"tag":7266,"props":75529,"children":75530},{},[75531],{"type":23,"value":75532},"departments",{"type":17,"tag":7266,"props":75534,"children":75535},{},[75536],{"type":23,"value":75537},"Department or team",{"type":17,"tag":7266,"props":75539,"children":75540},{},[75541],{"type":23,"value":75542},"Enable filtering by department",{"type":17,"tag":7239,"props":75544,"children":75545},{},[75546,75551,75556],{"type":17,"tag":7266,"props":75547,"children":75548},{},[75549],{"type":23,"value":75550},"remote",{"type":17,"tag":7266,"props":75552,"children":75553},{},[75554],{"type":23,"value":75555},"Indicates if job is remote",{"type":17,"tag":7266,"props":75557,"children":75558},{},[75559],{"type":23,"value":75560},"Power remote-only filters",{"type":17,"tag":7239,"props":75562,"children":75563},{},[75564,75569,75574],{"type":17,"tag":7266,"props":75565,"children":75566},{},[75567],{"type":23,"value":75568},"number_of_openings",{"type":17,"tag":7266,"props":75570,"children":75571},{},[75572],{"type":23,"value":75573},"Number of available positions",{"type":17,"tag":7266,"props":75575,"children":75576},{},[75577],{"type":23,"value":75578},"Show number of roles available",{"type":17,"tag":7239,"props":75580,"children":75581},{},[75582,75586,75591],{"type":17,"tag":7266,"props":75583,"children":75584},{},[75585],{"type":23,"value":33446},{"type":17,"tag":7266,"props":75587,"children":75588},{},[75589],{"type":23,"value":75590},"Job creation timestamp",{"type":17,"tag":7266,"props":75592,"children":75593},{},[75594],{"type":23,"value":75595},"Sort listings by newest jobs",{"type":17,"tag":7239,"props":75597,"children":75598},{},[75599,75603,75608],{"type":17,"tag":7266,"props":75600,"children":75601},{},[75602],{"type":23,"value":25337},{"type":17,"tag":7266,"props":75604,"children":75605},{},[75606],{"type":23,"value":75607},"Last update timestamp",{"type":17,"tag":7266,"props":75609,"children":75610},{},[75611],{"type":23,"value":75612},"Detect updates for incremental sync",{"type":17,"tag":29,"props":75614,"children":75615},{},[75616],{"type":23,"value":75617},"Additional fields may be available depending on the provider, including:",{"type":17,"tag":80,"props":75619,"children":75620},{},[75621,75626,75631,75636,75641],{"type":17,"tag":84,"props":75622,"children":75623},{},[75624],{"type":23,"value":75625},"compensation ranges",{"type":17,"tag":84,"props":75627,"children":75628},{},[75629],{"type":23,"value":75630},"recruiter or hiring manager IDs",{"type":17,"tag":84,"props":75632,"children":75633},{},[75634],{"type":23,"value":75635},"screening questions",{"type":17,"tag":84,"props":75637,"children":75638},{},[75639],{"type":23,"value":75640},"metadata fields",{"type":17,"tag":84,"props":75642,"children":75643},{},[75644],{"type":23,"value":75645},"language locale information",{"type":17,"tag":29,"props":75647,"children":75648},{},[75649],{"type":23,"value":75650},"These normalized fields allow SaaS platforms to display job listings consistently across many ATS systems.",{"type":17,"tag":68,"props":75652,"children":75654},{"id":75653},"connecting-customer-ats-platforms",[75655],{"type":23,"value":75656},"Connecting Customer ATS Platforms",{"type":17,"tag":29,"props":75658,"children":75659},{},[75660,75662,75666],{"type":23,"value":75661},"Customers authorize their ATS integrations using ",{"type":17,"tag":48,"props":75663,"children":75664},{},[75665],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":75668,"children":75669},{},[75670],{"type":23,"value":26189},{"type":17,"tag":6154,"props":75672,"children":75673},{},[75674,75679,75684,75688],{"type":17,"tag":84,"props":75675,"children":75676},{},[75677],{"type":23,"value":75678},"Your application launches the Unified Connect authorization component.",{"type":17,"tag":84,"props":75680,"children":75681},{},[75682],{"type":23,"value":75683},"The user selects their ATS platform, such as Greenhouse or Lever.",{"type":17,"tag":84,"props":75685,"children":75686},{},[75687],{"type":23,"value":73301},{"type":17,"tag":84,"props":75689,"children":75690},{},[75691,75692,75696],{"type":23,"value":73306},{"type":17,"tag":48,"props":75693,"children":75694},{},[75695],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":75698,"children":75699},{},[75700],{"type":23,"value":73316},{"type":17,"tag":6893,"props":75702,"children":75704},{"className":75703,"code":25047,"language":20901,"meta":23},[20899],[75705],{"type":17,"tag":6121,"props":75706,"children":75707},{"__ignoreMap":7},[75708],{"type":23,"value":25047},{"type":17,"tag":29,"props":75710,"children":75711},{},[75712],{"type":23,"value":75713},"All subsequent API calls reference this connection identifier to retrieve jobs from the customer's ATS.",{"type":17,"tag":68,"props":75715,"children":75717},{"id":75716},"retrieving-job-listings",[75718],{"type":23,"value":75719},"Retrieving Job Listings",{"type":17,"tag":29,"props":75721,"children":75722},{},[75723],{"type":23,"value":75724},"Job listings are retrieved using the ATS job endpoint.",{"type":17,"tag":6893,"props":75726,"children":75729},{"className":75727,"code":75728,"language":20901,"meta":23},[20899],"GET /ats/{connection_id}/job\n",[75730],{"type":17,"tag":6121,"props":75731,"children":75732},{"__ignoreMap":7},[75733],{"type":23,"value":75728},{"type":17,"tag":29,"props":75735,"children":75736},{},[75737,75739,75744],{"type":23,"value":75738},"This endpoint returns a normalized list of ",{"type":17,"tag":48,"props":75740,"children":75741},{},[75742],{"type":23,"value":75743},"AtsJob",{"type":23,"value":75745}," objects across supported providers.",{"type":17,"tag":29,"props":75747,"children":75748},{},[75749],{"type":23,"value":75750},"Several filters help retrieve and synchronize job data.",{"type":17,"tag":29,"props":75752,"children":75753},{},[75754],{"type":23,"value":26279},{"type":17,"tag":80,"props":75756,"children":75757},{},[75758,75768,75784,75794,75804,75814],{"type":17,"tag":84,"props":75759,"children":75760},{},[75761,75766],{"type":17,"tag":6121,"props":75762,"children":75764},{"className":75763},[],[75765],{"type":23,"value":48389},{"type":23,"value":75767}," – number of jobs returned",{"type":17,"tag":84,"props":75769,"children":75770},{},[75771,75776,75778,75782],{"type":17,"tag":6121,"props":75772,"children":75774},{"className":75773},[],[75775],{"type":23,"value":48411},{"type":23,"value":75777}," – ",{"type":17,"tag":133,"props":75779,"children":75780},{"href":1857},[75781],{"type":23,"value":1860},{"type":23,"value":75783}," offset",{"type":17,"tag":84,"props":75785,"children":75786},{},[75787,75792],{"type":17,"tag":6121,"props":75788,"children":75790},{"className":75789},[],[75791],{"type":23,"value":26291},{"type":23,"value":75793}," – return jobs updated after a given timestamp",{"type":17,"tag":84,"props":75795,"children":75796},{},[75797,75802],{"type":17,"tag":6121,"props":75798,"children":75800},{"className":75799},[],[75801],{"type":23,"value":48368},{"type":23,"value":75803}," – search jobs by keyword or title",{"type":17,"tag":84,"props":75805,"children":75806},{},[75807,75812],{"type":17,"tag":6121,"props":75808,"children":75810},{"className":75809},[],[75811],{"type":23,"value":62582},{"type":23,"value":75813}," – filter jobs owned by a recruiter or hiring manager",{"type":17,"tag":84,"props":75815,"children":75816},{},[75817,75823],{"type":17,"tag":6121,"props":75818,"children":75820},{"className":75819},[],[75821],{"type":23,"value":75822},"order",{"type":23,"value":75824}," and sorting options – control ordering of results",{"type":17,"tag":29,"props":75826,"children":75827},{},[75828],{"type":23,"value":75829},"Using these filters allows job boards to implement pagination, keyword search, and incremental updates.",{"type":17,"tag":68,"props":75831,"children":75833},{"id":75832},"rendering-job-listings",[75834],{"type":23,"value":75835},"Rendering Job Listings",{"type":17,"tag":29,"props":75837,"children":75838},{},[75839],{"type":23,"value":75840},"Once jobs are retrieved, your application can render them in a job board interface.",{"type":17,"tag":29,"props":75842,"children":75843},{},[75844],{"type":23,"value":75845},"Typical rendering logic includes:",{"type":17,"tag":80,"props":75847,"children":75848},{},[75849,75861,75879,75898,75910],{"type":17,"tag":84,"props":75850,"children":75851},{},[75852,75854,75859],{"type":23,"value":75853},"Display the job ",{"type":17,"tag":6121,"props":75855,"children":75857},{"className":75856},[],[75858],{"type":23,"value":18781},{"type":23,"value":75860}," as the listing title",{"type":17,"tag":84,"props":75862,"children":75863},{},[75864,75866,75871,75872,75877],{"type":23,"value":75865},"Show the ",{"type":17,"tag":6121,"props":75867,"children":75869},{"className":75868},[],[75870],{"type":23,"value":75514},{"type":23,"value":34435},{"type":17,"tag":6121,"props":75873,"children":75875},{"className":75874},[],[75876],{"type":23,"value":62375},{"type":23,"value":75878}," as tags or filters",{"type":17,"tag":84,"props":75880,"children":75881},{},[75882,75884,75889,75891,75896],{"type":23,"value":75883},"Display ",{"type":17,"tag":6121,"props":75885,"children":75887},{"className":75886},[],[75888],{"type":23,"value":75496},{"type":23,"value":75890}," or ",{"type":17,"tag":6121,"props":75892,"children":75894},{"className":75893},[],[75895],{"type":23,"value":75550},{"type":23,"value":75897}," status for location filtering",{"type":17,"tag":84,"props":75899,"children":75900},{},[75901,75903,75908],{"type":23,"value":75902},"Render the ",{"type":17,"tag":6121,"props":75904,"children":75906},{"className":75905},[],[75907],{"type":23,"value":24679},{"type":23,"value":75909}," on the job detail page",{"type":17,"tag":84,"props":75911,"children":75912},{},[75913,75915,75920,75922],{"type":23,"value":75914},"Provide an ",{"type":17,"tag":48,"props":75916,"children":75917},{},[75918],{"type":23,"value":75919},"Apply",{"type":23,"value":75921}," button using ",{"type":17,"tag":6121,"props":75923,"children":75925},{"className":75924},[],[75926],{"type":23,"value":75478},{"type":17,"tag":29,"props":75928,"children":75929},{},[75930],{"type":23,"value":75931},"Example job listing elements:",{"type":17,"tag":80,"props":75933,"children":75934},{},[75935,75939,75943,75948,75953,75958],{"type":17,"tag":84,"props":75936,"children":75937},{},[75938],{"type":23,"value":75431},{"type":17,"tag":84,"props":75940,"children":75941},{},[75942],{"type":23,"value":19564},{"type":17,"tag":84,"props":75944,"children":75945},{},[75946],{"type":23,"value":75947},"Department",{"type":17,"tag":84,"props":75949,"children":75950},{},[75951],{"type":23,"value":75952},"Employment type",{"type":17,"tag":84,"props":75954,"children":75955},{},[75956],{"type":23,"value":75957},"Compensation (if available)",{"type":17,"tag":84,"props":75959,"children":75960},{},[75961],{"type":23,"value":75962},"Apply link",{"type":17,"tag":29,"props":75964,"children":75965},{},[75966],{"type":23,"value":75967},"This allows your SaaS product to provide a complete job board experience using ATS data.",{"type":17,"tag":68,"props":75969,"children":75971},{"id":75970},"keeping-job-listings-updated",[75972],{"type":23,"value":75973},"Keeping Job Listings Updated",{"type":17,"tag":29,"props":75975,"children":75976},{},[75977,75979,75983],{"type":23,"value":75978},"To keep job listings synchronized with the underlying ATS, applications can use both incremental queries and ",{"type":17,"tag":133,"props":75980,"children":75981},{"href":4999},[75982],{"type":23,"value":5002},{"type":23,"value":54},{"type":17,"tag":29,"props":75985,"children":75986},{},[75987],{"type":23,"value":75988},"Unified supports webhook events for job records, including:",{"type":17,"tag":80,"props":75990,"children":75991},{},[75992,76003,76014],{"type":17,"tag":84,"props":75993,"children":75994},{},[75995,76001],{"type":17,"tag":6121,"props":75996,"children":75998},{"className":75997},[],[75999],{"type":23,"value":76000},"job.created",{"type":23,"value":76002}," – fired when a new job is created",{"type":17,"tag":84,"props":76004,"children":76005},{},[76006,76012],{"type":17,"tag":6121,"props":76007,"children":76009},{"className":76008},[],[76010],{"type":23,"value":76011},"job.updated",{"type":23,"value":76013}," – fired when job fields change",{"type":17,"tag":84,"props":76015,"children":76016},{},[76017,76023],{"type":17,"tag":6121,"props":76018,"children":76020},{"className":76019},[],[76021],{"type":23,"value":76022},"job.deleted",{"type":23,"value":76024}," – fired when a job is removed",{"type":17,"tag":29,"props":76026,"children":76027},{},[76028,76030,76035,76037,76042],{"type":23,"value":76029},"Some ATS platforms also provide job closure events. In unified APIs, job closures typically appear as ",{"type":17,"tag":48,"props":76031,"children":76032},{},[76033],{"type":23,"value":76034},"job.updated events",{"type":23,"value":76036}," where the ",{"type":17,"tag":6121,"props":76038,"children":76040},{"className":76039},[],[76041],{"type":23,"value":19949},{"type":23,"value":76043}," field changes to 'closed' or 'filled'.",{"type":17,"tag":29,"props":76045,"children":76046},{},[76047],{"type":23,"value":76048},"Job boards typically handle updates by:",{"type":17,"tag":80,"props":76050,"children":76051},{},[76052,76062,76072,76082],{"type":17,"tag":84,"props":76053,"children":76054},{},[76055,76057],{"type":23,"value":76056},"creating listings on ",{"type":17,"tag":6121,"props":76058,"children":76060},{"className":76059},[],[76061],{"type":23,"value":76000},{"type":17,"tag":84,"props":76063,"children":76064},{},[76065,76067],{"type":23,"value":76066},"updating listings on ",{"type":17,"tag":6121,"props":76068,"children":76070},{"className":76069},[],[76071],{"type":23,"value":76011},{"type":17,"tag":84,"props":76073,"children":76074},{},[76075,76077],{"type":23,"value":76076},"removing listings on ",{"type":17,"tag":6121,"props":76078,"children":76080},{"className":76079},[],[76081],{"type":23,"value":76022},{"type":17,"tag":84,"props":76083,"children":76084},{},[76085,76087,76092],{"type":23,"value":76086},"hiding listings when ",{"type":17,"tag":6121,"props":76088,"children":76090},{"className":76089},[],[76091],{"type":23,"value":19949},{"type":23,"value":76093}," changes to closed",{"type":17,"tag":29,"props":76095,"children":76096},{},[76097,76099,76104],{"type":23,"value":76098},"Combined with the ",{"type":17,"tag":6121,"props":76100,"children":76102},{"className":76101},[],[76103],{"type":23,"value":26291},{"type":23,"value":76105}," filter, this ensures listings remain synchronized with the ATS.",{"type":17,"tag":68,"props":76107,"children":76109},{"id":76108},"supported-ats-platforms",[76110],{"type":23,"value":76111},"Supported ATS Platforms",{"type":17,"tag":29,"props":76113,"children":76114},{},[76115,76116,76120],{"type":23,"value":58218},{"type":17,"tag":48,"props":76117,"children":76118},{},[76119],{"type":23,"value":56826},{"type":23,"value":76121},", allowing SaaS products to connect to a wide range of hiring platforms.",{"type":17,"tag":29,"props":76123,"children":76124},{},[76125],{"type":23,"value":24364},{"type":17,"tag":80,"props":76127,"children":76128},{},[76129,76133,76137,76141,76145,76149,76153,76157,76161,76165],{"type":17,"tag":84,"props":76130,"children":76131},{},[76132],{"type":23,"value":3189},{"type":17,"tag":84,"props":76134,"children":76135},{},[76136],{"type":23,"value":56545},{"type":17,"tag":84,"props":76138,"children":76139},{},[76140],{"type":23,"value":75326},{"type":17,"tag":84,"props":76142,"children":76143},{},[76144],{"type":23,"value":75321},{"type":17,"tag":84,"props":76146,"children":76147},{},[76148],{"type":23,"value":75316},{"type":17,"tag":84,"props":76150,"children":76151},{},[76152],{"type":23,"value":59319},{"type":17,"tag":84,"props":76154,"children":76155},{},[76156],{"type":23,"value":75331},{"type":17,"tag":84,"props":76158,"children":76159},{},[76160],{"type":23,"value":3194},{"type":17,"tag":84,"props":76162,"children":76163},{},[76164],{"type":23,"value":56564},{"type":17,"tag":84,"props":76166,"children":76167},{},[76168],{"type":23,"value":75344},{"type":17,"tag":29,"props":76170,"children":76171},{},[76172],{"type":23,"value":76173},"Because Unified normalizes job data across providers, SaaS platforms can support many ATS environments with a single integration.",{"type":17,"tag":68,"props":76175,"children":76176},{"id":73613},[76177],{"type":23,"value":73616},{"type":17,"tag":29,"props":76179,"children":76180},{},[76181],{"type":23,"value":76182},"Building job board integrations directly with multiple ATS platforms requires maintaining separate connectors and adapting to different APIs.",{"type":17,"tag":29,"props":76184,"children":76185},{},[76186],{"type":23,"value":34257},{"type":17,"tag":80,"props":76188,"children":76189},{},[76190,76195,76200,76205],{"type":17,"tag":84,"props":76191,"children":76192},{},[76193],{"type":23,"value":76194},"normalized job objects across 73+ ATS integrations",{"type":17,"tag":84,"props":76196,"children":76197},{},[76198],{"type":23,"value":76199},"consistent API endpoints for retrieving job listings",{"type":17,"tag":84,"props":76201,"children":76202},{},[76203],{"type":23,"value":76204},"unified authorization through Unified Connect",{"type":17,"tag":84,"props":76206,"children":76207},{},[76208],{"type":23,"value":76209},"webhook events to keep listings synchronized",{"type":17,"tag":29,"props":76211,"children":76212},{},[76213],{"type":23,"value":76214},"Instead of maintaining dozens of ATS integrations, product teams can focus on building recruiting features such as job boards, candidate marketplaces, and hiring analytics.",{"type":17,"tag":29,"props":76216,"children":76217},{},[76218],{"type":23,"value":76219},"Start building job boards that integrate with Greenhouse, Lever, and dozens of other ATS platforms today.",{"type":17,"tag":29,"props":76221,"children":76222},{},[76223],{"type":17,"tag":133,"props":76224,"children":76226},{"href":1612,"rel":76225},[214],[76227],{"type":23,"value":44481},{"type":17,"tag":29,"props":76229,"children":76230},{},[76231],{"type":17,"tag":133,"props":76232,"children":76234},{"href":1623,"rel":76233},[214],[76235],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":76237},[76238,76239,76240,76241,76242,76243,76244,76245,76246],{"id":75201,"depth":1629,"text":75204},{"id":75282,"depth":1629,"text":75285},{"id":75364,"depth":1629,"text":75367},{"id":75653,"depth":1629,"text":75656},{"id":75716,"depth":1629,"text":75719},{"id":75832,"depth":1629,"text":75835},{"id":75970,"depth":1629,"text":75973},{"id":76108,"depth":1629,"text":76111},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_a_job_board_integrating_greenhouse_lever_and_73_ats_platforms_with_an_ats_api.md","blog/how_to_build_a_job_board_integrating_greenhouse_lever_and_73_ats_platforms_with_an_ats_api.md","blog/how_to_build_a_job_board_integrating_greenhouse_lever_and_73_ats_platforms_with_an_ats_api",{"_path":76251,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":76252,"description":76253,"img":76254,"date":76255,"tag":12,"body":76256,"_type":1677,"_id":77393,"_source":1679,"_file":77394,"_stem":77395,"_extension":1682},"/blog/how_to_build_ai_account_research_assistants_using_salesforce_slack_and_google_drive","How to Build AI Account Research Assistants Using Salesforce, Slack, and Google Drive","An AI account research assistant is a feature inside a SaaS product that retrieves and summarizes customer account data from systems like CRM, messaging, and...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_ai_account_research_assistants_using_salesforce_slack_and_google_drive-icon.png","2026-03-10T00:20:00.000Z",{"type":14,"children":76257,"toc":77376},[76258,76263,76266,76273,76278,76306,76311,76317,76322,76326,76352,76357,76375,76380,76386,76391,76399,76404,76412,76417,76424,76429,76437,76442,76450,76455,76459,76469,76570,76575,76579,76583,76588,76673,76678,76682,76687,76742,76746,76797,76802,76808,76813,76853,76857,76890,76895,76899,76904,76908,76933,76937,76945,76950,76956,76960,76964,76972,76976,76984,76989,76997,77008,77014,77027,77032,77039,77044,77051,77056,77063,77068,77075,77080,77087,77091,77098,77103,77110,77115,77120,77124,77129,77139,77143,77152,77156,77172,77177,77183,77188,77193,77197,77215,77220,77231,77235,77239,77243,77247,77266,77271,77286,77291,77306,77311,77315,77320,77325,77329,77350,77355,77360,77368],{"type":17,"tag":18,"props":76259,"children":76261},{"id":76260},"how-to-build-ai-account-research-assistants-using-salesforce-slack-and-google-drive",[76262],{"type":23,"value":76252},{"type":17,"tag":25,"props":76264,"children":76265},{},[],{"type":17,"tag":29,"props":76267,"children":76268},{},[76269],{"type":17,"tag":33,"props":76270,"children":76271},{},[76272],{"type":23,"value":70091},{"type":17,"tag":29,"props":76274,"children":76275},{},[76276],{"type":23,"value":76277},"An AI account research assistant is a feature inside a SaaS product that retrieves and summarizes customer account data from systems like CRM, messaging, and file storage. It allows users to ask questions like 'What's going on with this account?' and get answers grounded in real customer data.",{"type":17,"tag":29,"props":76279,"children":76280},{},[76281,76283,76289,76291,76297,76299,76304],{"type":23,"value":76282},"To build this, your product needs access to multiple data sources at once. Account data lives in ",{"type":17,"tag":133,"props":76284,"children":76287},{"href":76285,"rel":76286},"https://developer.salesforce.com/docs/apis",[214],[76288],{"type":23,"value":3179},{"type":23,"value":76290},", conversations happen in ",{"type":17,"tag":133,"props":76292,"children":76295},{"href":76293,"rel":76294},"https://api.slack.com/apps",[214],[76296],{"type":23,"value":3204},{"type":23,"value":76298},", and documents are stored in ",{"type":17,"tag":133,"props":76300,"children":76302},{"href":76301},"/31f6207b838480d19831ceaf936ed26d",[76303],{"type":23,"value":28907},{"type":23,"value":76305},". Each platform has different APIs, schemas, and authentication models.",{"type":17,"tag":29,"props":76307,"children":76308},{},[76309],{"type":23,"value":76310},"Unified provides a consistent way to retrieve this data across categories in real time, so your product can combine account context without building separate integrations for each platform.",{"type":17,"tag":68,"props":76312,"children":76314},{"id":76313},"why-saas-products-build-ai-account-research-features",[76315],{"type":23,"value":76316},"Why SaaS Products Build AI Account Research Features",{"type":17,"tag":29,"props":76318,"children":76319},{},[76320],{"type":23,"value":76321},"Many B2B SaaS products are adding AI account research capabilities to help their customers understand accounts faster.",{"type":17,"tag":29,"props":76323,"children":76324},{},[76325],{"type":23,"value":24364},{"type":17,"tag":80,"props":76327,"children":76328},{},[76329,76334,76338,76343,76347],{"type":17,"tag":84,"props":76330,"children":76331},{},[76332],{"type":23,"value":76333},"Sales intelligence platforms",{"type":17,"tag":84,"props":76335,"children":76336},{},[76337],{"type":23,"value":26714},{"type":17,"tag":84,"props":76339,"children":76340},{},[76341],{"type":23,"value":76342},"Revenue intelligence products",{"type":17,"tag":84,"props":76344,"children":76345},{},[76346],{"type":23,"value":25587},{"type":17,"tag":84,"props":76348,"children":76349},{},[76350],{"type":23,"value":76351},"Account planning software",{"type":17,"tag":29,"props":76353,"children":76354},{},[76355],{"type":23,"value":76356},"These products help users answer questions such as:",{"type":17,"tag":80,"props":76358,"children":76359},{},[76360,76365,76370],{"type":17,"tag":84,"props":76361,"children":76362},{},[76363],{"type":23,"value":76364},"'What's the current status of this deal?'",{"type":17,"tag":84,"props":76366,"children":76367},{},[76368],{"type":23,"value":76369},"'What conversations have happened with this account?'",{"type":17,"tag":84,"props":76371,"children":76372},{},[76373],{"type":23,"value":76374},"'What documents are relevant to this customer?'",{"type":17,"tag":29,"props":76376,"children":76377},{},[76378],{"type":23,"value":76379},"Without unified access to CRM, messaging, and documents, answering these questions requires manual work across multiple tools.",{"type":17,"tag":68,"props":76381,"children":76383},{"id":76382},"common-ai-account-research-use-cases",[76384],{"type":23,"value":76385},"Common AI Account Research Use Cases",{"type":17,"tag":29,"props":76387,"children":76388},{},[76389],{"type":23,"value":76390},"AI account research assistants typically support several workflows.",{"type":17,"tag":29,"props":76392,"children":76393},{},[76394],{"type":17,"tag":48,"props":76395,"children":76396},{},[76397],{"type":23,"value":76398},"Account summaries",{"type":17,"tag":29,"props":76400,"children":76401},{},[76402],{"type":23,"value":76403},"Generate a high-level summary of a customer account using CRM, conversations, and documents.",{"type":17,"tag":29,"props":76405,"children":76406},{},[76407],{"type":17,"tag":48,"props":76408,"children":76409},{},[76410],{"type":23,"value":76411},"Deal intelligence",{"type":17,"tag":29,"props":76413,"children":76414},{},[76415],{"type":23,"value":76416},"Explain pipeline status, recent activity, and potential risks based on deal data.",{"type":17,"tag":29,"props":76418,"children":76419},{},[76420],{"type":17,"tag":48,"props":76421,"children":76422},{},[76423],{"type":23,"value":24478},{"type":17,"tag":29,"props":76425,"children":76426},{},[76427],{"type":23,"value":76428},"Summarize Slack discussions and identify important signals from customer interactions.",{"type":17,"tag":29,"props":76430,"children":76431},{},[76432],{"type":17,"tag":48,"props":76433,"children":76434},{},[76435],{"type":23,"value":76436},"Document retrieval",{"type":17,"tag":29,"props":76438,"children":76439},{},[76440],{"type":23,"value":76441},"Retrieve relevant files from Google Drive to support account context.",{"type":17,"tag":29,"props":76443,"children":76444},{},[76445],{"type":17,"tag":48,"props":76446,"children":76447},{},[76448],{"type":23,"value":76449},"Next-step recommendations",{"type":17,"tag":29,"props":76451,"children":76452},{},[76453],{"type":23,"value":76454},"Suggest actions based on account activity, deal stage, and engagement patterns.",{"type":17,"tag":68,"props":76456,"children":76457},{"id":24499},[76458],{"type":23,"value":24502},{"type":17,"tag":29,"props":76460,"children":76461},{},[76462,76464,76468],{"type":23,"value":76463},"An AI account research assistant combines data from multiple ",{"type":17,"tag":133,"props":76465,"children":76466},{"href":7691},[76467],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":76470,"children":76471},{},[76472,76490],{"type":17,"tag":7235,"props":76473,"children":76474},{},[76475],{"type":17,"tag":7239,"props":76476,"children":76477},{},[76478,76482,76486],{"type":17,"tag":7243,"props":76479,"children":76480},{},[76481],{"type":23,"value":7247},{"type":17,"tag":7243,"props":76483,"children":76484},{},[76485],{"type":23,"value":24525},{"type":17,"tag":7243,"props":76487,"children":76488},{},[76489],{"type":23,"value":24530},{"type":17,"tag":7259,"props":76491,"children":76492},{},[76493,76513,76533,76552],{"type":17,"tag":7239,"props":76494,"children":76495},{},[76496,76505,76509],{"type":17,"tag":7266,"props":76497,"children":76498},{},[76499],{"type":17,"tag":133,"props":76500,"children":76503},{"href":76501,"rel":76502},"https://unified.to/crm",[214],[76504],{"type":23,"value":25731},{"type":17,"tag":7266,"props":76506,"children":76507},{},[76508],{"type":23,"value":27939},{"type":17,"tag":7266,"props":76510,"children":76511},{},[76512],{"type":23,"value":25741},{"type":17,"tag":7239,"props":76514,"children":76515},{},[76516,76525,76529],{"type":17,"tag":7266,"props":76517,"children":76518},{},[76519],{"type":17,"tag":133,"props":76520,"children":76523},{"href":76521,"rel":76522},"https://unified.to/messaging",[214],[76524],{"type":23,"value":24559},{"type":17,"tag":7266,"props":76526,"children":76527},{},[76528],{"type":23,"value":24564},{"type":17,"tag":7266,"props":76530,"children":76531},{},[76532],{"type":23,"value":24569},{"type":17,"tag":7239,"props":76534,"children":76535},{},[76536,76543,76548],{"type":17,"tag":7266,"props":76537,"children":76538},{},[76539],{"type":17,"tag":133,"props":76540,"children":76541},{"href":76301},[76542],{"type":23,"value":72401},{"type":17,"tag":7266,"props":76544,"children":76545},{},[76546],{"type":23,"value":76547},"Documents from platforms like Google Drive",{"type":17,"tag":7266,"props":76549,"children":76550},{},[76551],{"type":23,"value":72411},{"type":17,"tag":7239,"props":76553,"children":76554},{},[76555,76562,76566],{"type":17,"tag":7266,"props":76556,"children":76557},{},[76558],{"type":17,"tag":133,"props":76559,"children":76560},{"href":76301},[76561],{"type":23,"value":24595},{"type":17,"tag":7266,"props":76563,"children":76564},{},[76565],{"type":23,"value":24600},{"type":17,"tag":7266,"props":76567,"children":76568},{},[76569],{"type":23,"value":24605},{"type":17,"tag":29,"props":76571,"children":76572},{},[76573],{"type":23,"value":76574},"Each category provides a consistent interface across multiple integrations, allowing your product to retrieve data without vendor-specific logic.",{"type":17,"tag":68,"props":76576,"children":76577},{"id":24613},[76578],{"type":23,"value":24616},{"type":17,"tag":239,"props":76580,"children":76581},{"id":25770},[76582],{"type":23,"value":25773},{"type":17,"tag":29,"props":76584,"children":76585},{},[76586],{"type":23,"value":76587},"CRM data provides structured account and deal context.",{"type":17,"tag":7231,"props":76589,"children":76590},{},[76591,76609],{"type":17,"tag":7235,"props":76592,"children":76593},{},[76594],{"type":17,"tag":7239,"props":76595,"children":76596},{},[76597,76601,76605],{"type":17,"tag":7243,"props":76598,"children":76599},{},[76600],{"type":23,"value":18594},{"type":17,"tag":7243,"props":76602,"children":76603},{},[76604],{"type":23,"value":22096},{"type":17,"tag":7243,"props":76606,"children":76607},{},[76608],{"type":23,"value":20787},{"type":17,"tag":7259,"props":76610,"children":76611},{},[76612,76627,76643,76658],{"type":17,"tag":7239,"props":76613,"children":76614},{},[76615,76619,76623],{"type":17,"tag":7266,"props":76616,"children":76617},{},[76618],{"type":23,"value":25828},{"type":17,"tag":7266,"props":76620,"children":76621},{},[76622],{"type":23,"value":27013},{"type":17,"tag":7266,"props":76624,"children":76625},{},[76626],{"type":23,"value":25838},{"type":17,"tag":7239,"props":76628,"children":76629},{},[76630,76634,76638],{"type":17,"tag":7266,"props":76631,"children":76632},{},[76633],{"type":23,"value":25846},{"type":17,"tag":7266,"props":76635,"children":76636},{},[76637],{"type":23,"value":25851},{"type":17,"tag":7266,"props":76639,"children":76640},{},[76641],{"type":23,"value":76642},"Account-level grouping",{"type":17,"tag":7239,"props":76644,"children":76645},{},[76646,76650,76654],{"type":17,"tag":7266,"props":76647,"children":76648},{},[76649],{"type":23,"value":25810},{"type":17,"tag":7266,"props":76651,"children":76652},{},[76653],{"type":23,"value":26979},{"type":17,"tag":7266,"props":76655,"children":76656},{},[76657],{"type":23,"value":28062},{"type":17,"tag":7239,"props":76659,"children":76660},{},[76661,76665,76669],{"type":17,"tag":7266,"props":76662,"children":76663},{},[76664],{"type":23,"value":14528},{"type":17,"tag":7266,"props":76666,"children":76667},{},[76668],{"type":23,"value":26996},{"type":17,"tag":7266,"props":76670,"children":76671},{},[76672],{"type":23,"value":25873},{"type":17,"tag":29,"props":76674,"children":76675},{},[76676],{"type":23,"value":76677},"These objects allow the assistant to understand account status, pipeline progression, and past interactions.",{"type":17,"tag":239,"props":76679,"children":76680},{"id":24756},[76681],{"type":23,"value":24759},{"type":17,"tag":29,"props":76683,"children":76684},{},[76685],{"type":23,"value":76686},"Messaging data provides conversational context.",{"type":17,"tag":7231,"props":76688,"children":76689},{},[76690,76708],{"type":17,"tag":7235,"props":76691,"children":76692},{},[76693],{"type":17,"tag":7239,"props":76694,"children":76695},{},[76696,76700,76704],{"type":17,"tag":7243,"props":76697,"children":76698},{},[76699],{"type":23,"value":18594},{"type":17,"tag":7243,"props":76701,"children":76702},{},[76703],{"type":23,"value":22096},{"type":17,"tag":7243,"props":76705,"children":76706},{},[76707],{"type":23,"value":20787},{"type":17,"tag":7259,"props":76709,"children":76710},{},[76711,76726],{"type":17,"tag":7239,"props":76712,"children":76713},{},[76714,76718,76722],{"type":17,"tag":7266,"props":76715,"children":76716},{},[76717],{"type":23,"value":15800},{"type":17,"tag":7266,"props":76719,"children":76720},{},[76721],{"type":23,"value":27119},{"type":17,"tag":7266,"props":76723,"children":76724},{},[76725],{"type":23,"value":24805},{"type":17,"tag":7239,"props":76727,"children":76728},{},[76729,76733,76737],{"type":17,"tag":7266,"props":76730,"children":76731},{},[76732],{"type":23,"value":15787},{"type":17,"tag":7266,"props":76734,"children":76735},{},[76736],{"type":23,"value":24817},{"type":17,"tag":7266,"props":76738,"children":76739},{},[76740],{"type":23,"value":76741},"Context for conversations",{"type":17,"tag":29,"props":76743,"children":76744},{},[76745],{"type":23,"value":24827},{"type":17,"tag":80,"props":76747,"children":76748},{},[76749,76759,76775,76792],{"type":17,"tag":84,"props":76750,"children":76751},{},[76752,76753,76758],{"type":23,"value":24835},{"type":17,"tag":6121,"props":76754,"children":76756},{"className":76755},[],[76757],{"type":23,"value":24841},{"type":23,"value":12034},{"type":17,"tag":84,"props":76760,"children":76761},{},[76762,76763,76768,76769,76774],{"type":23,"value":24847},{"type":17,"tag":6121,"props":76764,"children":76766},{"className":76765},[],[76767],{"type":23,"value":24853},{"type":23,"value":11826},{"type":17,"tag":6121,"props":76770,"children":76772},{"className":76771},[],[76773],{"type":23,"value":24860},{"type":23,"value":12034},{"type":17,"tag":84,"props":76776,"children":76777},{},[76778,76779,76784,76785,76791],{"type":23,"value":24866},{"type":17,"tag":6121,"props":76780,"children":76782},{"className":76781},[],[76783],{"type":23,"value":24872},{"type":23,"value":11826},{"type":17,"tag":6121,"props":76786,"children":76788},{"className":76787},[],[76789],{"type":23,"value":76790},"message_html",{"type":23,"value":12034},{"type":17,"tag":84,"props":76793,"children":76794},{},[76795],{"type":23,"value":76796},"timestamps and thread relationships",{"type":17,"tag":29,"props":76798,"children":76799},{},[76800],{"type":23,"value":76801},"This allows the assistant to analyze conversations and extract insights.",{"type":17,"tag":239,"props":76803,"children":76805},{"id":76804},"file-storage-objects",[76806],{"type":23,"value":76807},"File Storage Objects",{"type":17,"tag":29,"props":76809,"children":76810},{},[76811],{"type":23,"value":76812},"Documents provide supporting context for accounts.",{"type":17,"tag":7231,"props":76814,"children":76815},{},[76816,76834],{"type":17,"tag":7235,"props":76817,"children":76818},{},[76819],{"type":17,"tag":7239,"props":76820,"children":76821},{},[76822,76826,76830],{"type":17,"tag":7243,"props":76823,"children":76824},{},[76825],{"type":23,"value":18594},{"type":17,"tag":7243,"props":76827,"children":76828},{},[76829],{"type":23,"value":22096},{"type":17,"tag":7243,"props":76831,"children":76832},{},[76833],{"type":23,"value":20787},{"type":17,"tag":7259,"props":76835,"children":76836},{},[76837],{"type":17,"tag":7239,"props":76838,"children":76839},{},[76840,76844,76849],{"type":17,"tag":7266,"props":76841,"children":76842},{},[76843],{"type":23,"value":72411},{"type":17,"tag":7266,"props":76845,"children":76846},{},[76847],{"type":23,"value":76848},"name, mime_type, updated_at, download_url, permissions",{"type":17,"tag":7266,"props":76850,"children":76851},{},[76852],{"type":23,"value":76436},{"type":17,"tag":29,"props":76854,"children":76855},{},[76856],{"type":23,"value":24964},{"type":17,"tag":80,"props":76858,"children":76859},{},[76860,76870,76880],{"type":17,"tag":84,"props":76861,"children":76862},{},[76863,76865],{"type":23,"value":76864},"file content is retrieved using ",{"type":17,"tag":6121,"props":76866,"children":76868},{"className":76867},[],[76869],{"type":23,"value":24978},{"type":17,"tag":84,"props":76871,"children":76872},{},[76873,76878],{"type":17,"tag":6121,"props":76874,"children":76876},{"className":76875},[],[76877],{"type":23,"value":25337},{"type":23,"value":76879}," indicates when a file has changed",{"type":17,"tag":84,"props":76881,"children":76882},{},[76883,76888],{"type":17,"tag":6121,"props":76884,"children":76886},{"className":76885},[],[76887],{"type":23,"value":24204},{"type":23,"value":76889}," can be used to restrict access",{"type":17,"tag":29,"props":76891,"children":76892},{},[76893],{"type":23,"value":76894},"These fields allow your product to retrieve and index documents for AI search.",{"type":17,"tag":68,"props":76896,"children":76897},{"id":24996},[76898],{"type":23,"value":24999},{"type":17,"tag":29,"props":76900,"children":76901},{},[76902],{"type":23,"value":76903},"Customers authorize their integrations using Unified Connect.",{"type":17,"tag":29,"props":76905,"children":76906},{},[76907],{"type":23,"value":25009},{"type":17,"tag":6154,"props":76909,"children":76910},{},[76911,76915,76920,76924],{"type":17,"tag":84,"props":76912,"children":76913},{},[76914],{"type":23,"value":25017},{"type":17,"tag":84,"props":76916,"children":76917},{},[76918],{"type":23,"value":76919},"The user selects platforms such as Salesforce, Slack, or Google Drive.",{"type":17,"tag":84,"props":76921,"children":76922},{},[76923],{"type":23,"value":25027},{"type":17,"tag":84,"props":76925,"children":76926},{},[76927,76928,76932],{"type":23,"value":25032},{"type":17,"tag":48,"props":76929,"children":76930},{},[76931],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":76934,"children":76935},{},[76936],{"type":23,"value":73316},{"type":17,"tag":6893,"props":76938,"children":76940},{"className":76939,"code":25047,"language":20901,"meta":23},[20899],[76941],{"type":17,"tag":6121,"props":76942,"children":76943},{"__ignoreMap":7},[76944],{"type":23,"value":25047},{"type":17,"tag":29,"props":76946,"children":76947},{},[76948],{"type":23,"value":76949},"All API calls use this identifier to retrieve data for that customer.",{"type":17,"tag":68,"props":76951,"children":76953},{"id":76952},"retrieving-account-data-across-systems",[76954],{"type":23,"value":76955},"Retrieving Account Data Across Systems",{"type":17,"tag":29,"props":76957,"children":76958},{},[76959],{"type":23,"value":28328},{"type":17,"tag":29,"props":76961,"children":76962},{},[76963],{"type":23,"value":26246},{"type":17,"tag":6893,"props":76965,"children":76967},{"className":76966,"code":28336,"language":20901,"meta":23},[20899],[76968],{"type":17,"tag":6121,"props":76969,"children":76970},{"__ignoreMap":7},[76971],{"type":23,"value":28336},{"type":17,"tag":29,"props":76973,"children":76974},{},[76975],{"type":23,"value":25087},{"type":17,"tag":6893,"props":76977,"children":76979},{"className":76978,"code":25091,"language":20901,"meta":23},[20899],[76980],{"type":17,"tag":6121,"props":76981,"children":76982},{"__ignoreMap":7},[76983],{"type":23,"value":25091},{"type":17,"tag":29,"props":76985,"children":76986},{},[76987],{"type":23,"value":76988},"File storage:",{"type":17,"tag":6893,"props":76990,"children":76992},{"className":76991,"code":72737,"language":20901,"meta":23},[20899],[76993],{"type":17,"tag":6121,"props":76994,"children":76995},{"__ignoreMap":7},[76996],{"type":23,"value":72737},{"type":17,"tag":29,"props":76998,"children":76999},{},[77000,77002,77007],{"type":23,"value":77001},"For documents, your application retrieves metadata first and then fetches content using ",{"type":17,"tag":6121,"props":77003,"children":77005},{"className":77004},[],[77006],{"type":23,"value":24978},{"type":23,"value":54},{"type":17,"tag":68,"props":77009,"children":77011},{"id":77010},"building-an-ai-account-research-pipeline",[77012],{"type":23,"value":77013},"Building an AI Account Research Pipeline",{"type":17,"tag":29,"props":77015,"children":77016},{},[77017,77019,77025],{"type":23,"value":77018},"AI account research assistants typically use a ",{"type":17,"tag":133,"props":77020,"children":77022},{"href":77021},"/guides/retrieval_augmented_generation_rag#retrieval-augmented-generation-%5Brag%5D(/guides/retrieval_augmented_generation_rag#retrieval-augmented-generation-rag)",[77023],{"type":23,"value":77024},"retrieval-augmented generation",{"type":23,"value":77026}," approach.",{"type":17,"tag":29,"props":77028,"children":77029},{},[77030],{"type":23,"value":77031},"A common architecture includes the following steps.",{"type":17,"tag":29,"props":77033,"children":77034},{},[77035],{"type":17,"tag":48,"props":77036,"children":77037},{},[77038],{"type":23,"value":25145},{"type":17,"tag":29,"props":77040,"children":77041},{},[77042],{"type":23,"value":77043},"Fetch CRM records, messages, and files using Unified APIs.",{"type":17,"tag":29,"props":77045,"children":77046},{},[77047],{"type":17,"tag":48,"props":77048,"children":77049},{},[77050],{"type":23,"value":25158},{"type":17,"tag":29,"props":77052,"children":77053},{},[77054],{"type":23,"value":77055},"Pull message text and document content from API responses and download URLs.",{"type":17,"tag":29,"props":77057,"children":77058},{},[77059],{"type":17,"tag":48,"props":77060,"children":77061},{},[77062],{"type":23,"value":25171},{"type":17,"tag":29,"props":77064,"children":77065},{},[77066],{"type":23,"value":77067},"Split large documents and conversations into smaller segments.",{"type":17,"tag":29,"props":77069,"children":77070},{},[77071],{"type":17,"tag":48,"props":77072,"children":77073},{},[77074],{"type":23,"value":25184},{"type":17,"tag":29,"props":77076,"children":77077},{},[77078],{"type":23,"value":77079},"Convert text segments into vector representations using an embedding model.",{"type":17,"tag":29,"props":77081,"children":77082},{},[77083],{"type":17,"tag":48,"props":77084,"children":77085},{},[77086],{"type":23,"value":25197},{"type":17,"tag":29,"props":77088,"children":77089},{},[77090],{"type":23,"value":73418},{"type":17,"tag":29,"props":77092,"children":77093},{},[77094],{"type":17,"tag":48,"props":77095,"children":77096},{},[77097],{"type":23,"value":25210},{"type":17,"tag":29,"props":77099,"children":77100},{},[77101],{"type":23,"value":77102},"When a user asks a question, embed the query and retrieve relevant content.",{"type":17,"tag":29,"props":77104,"children":77105},{},[77106],{"type":17,"tag":48,"props":77107,"children":77108},{},[77109],{"type":23,"value":25223},{"type":17,"tag":29,"props":77111,"children":77112},{},[77113],{"type":23,"value":77114},"Pass retrieved context to a language model to generate an answer.",{"type":17,"tag":29,"props":77116,"children":77117},{},[77118],{"type":23,"value":77119},"This architecture allows the assistant to answer questions using real customer data.",{"type":17,"tag":68,"props":77121,"children":77122},{"id":25236},[77123],{"type":23,"value":25239},{"type":17,"tag":29,"props":77125,"children":77126},{},[77127],{"type":23,"value":77128},"Unified's GenAI API standardizes interaction with language models.",{"type":17,"tag":29,"props":77130,"children":77131},{},[77132,77134,77138],{"type":23,"value":77133},"A request is created using a ",{"type":17,"tag":48,"props":77135,"children":77136},{},[77137],{"type":23,"value":74651},{"type":23,"value":74653},{"type":17,"tag":29,"props":77140,"children":77141},{},[77142],{"type":23,"value":19878},{"type":17,"tag":6893,"props":77144,"children":77147},{"className":77145,"code":77146,"language":20901,"meta":23},[20899],"{\n  \"messages\": [\n    { \"role\": \"system\", \"content\": \"You are an account research assistant.\" },\n    { \"role\": \"user\", \"content\": \"Summarize this account.\" }\n  ]\n}\n",[77148],{"type":17,"tag":6121,"props":77149,"children":77150},{"__ignoreMap":7},[77151],{"type":23,"value":77146},{"type":17,"tag":29,"props":77153,"children":77154},{},[77155],{"type":23,"value":19936},{"type":17,"tag":80,"props":77157,"children":77158},{},[77159,77164,77168],{"type":17,"tag":84,"props":77160,"children":77161},{},[77162],{"type":23,"value":77163},"generated output",{"type":17,"tag":84,"props":77165,"children":77166},{},[77167],{"type":23,"value":25282},{"type":17,"tag":84,"props":77169,"children":77170},{},[77171],{"type":23,"value":74723},{"type":17,"tag":29,"props":77173,"children":77174},{},[77175],{"type":23,"value":77176},"This allows your application to generate summaries, insights, and recommendations based on retrieved data.",{"type":17,"tag":68,"props":77178,"children":77180},{"id":77179},"keeping-account-data-updated",[77181],{"type":23,"value":77182},"Keeping Account Data Updated",{"type":17,"tag":29,"props":77184,"children":77185},{},[77186],{"type":23,"value":77187},"Account data changes frequently, so the assistant must stay synchronized.",{"type":17,"tag":29,"props":77189,"children":77190},{},[77191],{"type":23,"value":77192},"Unified supports webhook events across categories.",{"type":17,"tag":29,"props":77194,"children":77195},{},[77196],{"type":23,"value":24364},{"type":17,"tag":80,"props":77198,"children":77199},{},[77200,77205,77210],{"type":17,"tag":84,"props":77201,"children":77202},{},[77203],{"type":23,"value":77204},"CRM updates (deal changes, contact updates)",{"type":17,"tag":84,"props":77206,"children":77207},{},[77208],{"type":23,"value":77209},"messaging events (new messages, updates)",{"type":17,"tag":84,"props":77211,"children":77212},{},[77213],{"type":23,"value":77214},"file updates (documents modified)",{"type":17,"tag":29,"props":77216,"children":77217},{},[77218],{"type":23,"value":77219},"Applications can subscribe to these events to trigger re-indexing.",{"type":17,"tag":29,"props":77221,"children":77222},{},[77223,77224,77229],{"type":23,"value":6712},{"type":17,"tag":6121,"props":77225,"children":77227},{"className":77226},[],[77228],{"type":23,"value":25337},{"type":23,"value":77230}," field can also be used to identify changed records and refresh embeddings.",{"type":17,"tag":68,"props":77232,"children":77233},{"id":25342},[77234],{"type":23,"value":25345},{"type":17,"tag":29,"props":77236,"children":77237},{},[77238],{"type":23,"value":27573},{"type":17,"tag":29,"props":77240,"children":77241},{},[77242],{"type":23,"value":24364},{"type":17,"tag":29,"props":77244,"children":77245},{},[77246],{"type":23,"value":26514},{"type":17,"tag":80,"props":77248,"children":77249},{},[77250,77254,77258,77262],{"type":17,"tag":84,"props":77251,"children":77252},{},[77253],{"type":23,"value":3179},{"type":17,"tag":84,"props":77255,"children":77256},{},[77257],{"type":23,"value":3184},{"type":17,"tag":84,"props":77259,"children":77260},{},[77261],{"type":23,"value":26530},{"type":17,"tag":84,"props":77263,"children":77264},{},[77265],{"type":23,"value":26535},{"type":17,"tag":29,"props":77267,"children":77268},{},[77269],{"type":23,"value":77270},"Messaging (17+ integrations)",{"type":17,"tag":80,"props":77272,"children":77273},{},[77274,77278,77282],{"type":17,"tag":84,"props":77275,"children":77276},{},[77277],{"type":23,"value":3204},{"type":17,"tag":84,"props":77279,"children":77280},{},[77281],{"type":23,"value":14878},{"type":17,"tag":84,"props":77283,"children":77284},{},[77285],{"type":23,"value":14066},{"type":17,"tag":29,"props":77287,"children":77288},{},[77289],{"type":23,"value":77290},"File storage (26+ integrations)",{"type":17,"tag":80,"props":77292,"children":77293},{},[77294,77298,77302],{"type":17,"tag":84,"props":77295,"children":77296},{},[77297],{"type":23,"value":28907},{"type":17,"tag":84,"props":77299,"children":77300},{},[77301],{"type":23,"value":28915},{"type":17,"tag":84,"props":77303,"children":77304},{},[77305],{"type":23,"value":28931},{"type":17,"tag":29,"props":77307,"children":77308},{},[77309],{"type":23,"value":77310},"This allows your product to support many customer environments without building separate integrations.",{"type":17,"tag":68,"props":77312,"children":77313},{"id":883},[77314],{"type":23,"value":19178},{"type":17,"tag":29,"props":77316,"children":77317},{},[77318],{"type":23,"value":77319},"AI account research assistants depend on access to multiple data sources.",{"type":17,"tag":29,"props":77321,"children":77322},{},[77323],{"type":23,"value":77324},"Without unified integration infrastructure, developers must build and maintain separate connectors for CRM, messaging, and storage platforms.",{"type":17,"tag":29,"props":77326,"children":77327},{},[77328],{"type":23,"value":25437},{"type":17,"tag":80,"props":77330,"children":77331},{},[77332,77337,77341,77345],{"type":17,"tag":84,"props":77333,"children":77334},{},[77335],{"type":23,"value":77336},"consistent data models across categories",{"type":17,"tag":84,"props":77338,"children":77339},{},[77340],{"type":23,"value":26593},{"type":17,"tag":84,"props":77342,"children":77343},{},[77344],{"type":23,"value":51938},{"type":17,"tag":84,"props":77346,"children":77347},{},[77348],{"type":23,"value":77349},"webhook-based updates",{"type":17,"tag":29,"props":77351,"children":77352},{},[77353],{"type":23,"value":77354},"This allows product teams to focus on building AI features instead of managing integrations.",{"type":17,"tag":29,"props":77356,"children":77357},{},[77358],{"type":23,"value":77359},"Start building AI account research assistants across Salesforce, Slack, Google Drive, and many other platforms today.",{"type":17,"tag":29,"props":77361,"children":77362},{},[77363],{"type":17,"tag":133,"props":77364,"children":77366},{"href":1612,"rel":77365},[214],[77367],{"type":23,"value":44481},{"type":17,"tag":29,"props":77369,"children":77370},{},[77371],{"type":17,"tag":133,"props":77372,"children":77374},{"href":1623,"rel":77373},[214],[77375],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":77377},[77378,77379,77380,77381,77386,77387,77388,77389,77390,77391,77392],{"id":76313,"depth":1629,"text":76316},{"id":76382,"depth":1629,"text":76385},{"id":24499,"depth":1629,"text":24502},{"id":24613,"depth":1629,"text":24616,"children":77382},[77383,77384,77385],{"id":25770,"depth":1635,"text":25773},{"id":24756,"depth":1635,"text":24759},{"id":76804,"depth":1635,"text":76807},{"id":24996,"depth":1629,"text":24999},{"id":76952,"depth":1629,"text":76955},{"id":77010,"depth":1629,"text":77013},{"id":25236,"depth":1629,"text":25239},{"id":77179,"depth":1629,"text":77182},{"id":25342,"depth":1629,"text":25345},{"id":883,"depth":1629,"text":19178},"content:blog:how_to_build_ai_account_research_assistants_using_salesforce_slack_and_google_drive.md","blog/how_to_build_ai_account_research_assistants_using_salesforce_slack_and_google_drive.md","blog/how_to_build_ai_account_research_assistants_using_salesforce_slack_and_google_drive",{"_path":77397,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":77398,"description":77399,"img":77400,"date":77401,"tag":12,"body":77402,"_type":1677,"_id":78541,"_source":1679,"_file":78542,"_stem":78543,"_extension":1682},"/blog/how_to_handle_oauth_across_many_integrations","How to Handle OAuth Across Many Integrations","The most effective way to handle OAuth across many integrations is to centralize authorization into a single system that manages provider configuration, token...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_handle_oauth_across_many_integrations-icon.png","2026-03-09T19:55:00.000Z",{"type":14,"children":77403,"toc":78516},[77404,77409,77412,77419,77438,77443,77448,77454,77459,77501,77545,77550,77555,77560,77566,77572,77577,77582,77614,77619,77652,77657,77663,77668,77696,77701,77724,77729,77735,77740,77749,77761,77778,77783,77789,77794,77798,77816,77821,77827,77832,77837,77855,77860,77865,77873,77878,77886,77891,77904,77909,77915,77920,77924,77942,77947,77960,77965,77971,77976,77999,78004,78010,78015,78026,78030,78038,78043,78051,78056,78064,78069,78076,78081,78089,78094,78099,78105,78110,78115,78134,78139,78161,78166,78189,78195,78200,78205,78210,78216,78246,78252,78265,78271,78284,78290,78313,78319,78332,78338,78351,78357,78362,78390,78395,78413,78418,78441,78445,78450,78478,78483,78488,78493,78499,78508],{"type":17,"tag":18,"props":77405,"children":77407},{"id":77406},"how-to-handle-oauth-across-many-integrations",[77408],{"type":23,"value":77398},{"type":17,"tag":25,"props":77410,"children":77411},{},[],{"type":17,"tag":29,"props":77413,"children":77414},{},[77415],{"type":17,"tag":33,"props":77416,"children":77417},{},[77418],{"type":23,"value":37},{"type":17,"tag":29,"props":77420,"children":77421},{},[77422,77424,77428,77430,77436],{"type":23,"value":77423},"The most effective way to handle ",{"type":17,"tag":133,"props":77425,"children":77426},{"href":779},[77427],{"type":23,"value":782},{"type":23,"value":77429}," across many integrations is to ",{"type":17,"tag":133,"props":77431,"children":77433},{"href":45840,"rel":77432},[214],[77434],{"type":23,"value":77435},"centralize authorization",{"type":23,"value":77437}," into a single system that manages provider configuration, token storage, refresh logic, scopes, and error handling across all integrations.",{"type":17,"tag":29,"props":77439,"children":77440},{},[77441],{"type":23,"value":77442},"Once your product integrates with more than a few APIs, OAuth becomes infrastructure—not per-integration code.",{"type":17,"tag":29,"props":77444,"children":77445},{},[77446],{"type":23,"value":77447},"Without this shift, teams quickly run into scaling issues: broken tokens, inconsistent scopes, race conditions, and brittle refresh logic.",{"type":17,"tag":68,"props":77449,"children":77451},{"id":77450},"why-oauth-becomes-a-bottleneck-at-scale",[77452],{"type":23,"value":77453},"Why OAuth becomes a bottleneck at scale",{"type":17,"tag":29,"props":77455,"children":77456},{},[77457],{"type":23,"value":77458},"OAuth 2.0 is a standard, but in practice every provider implements it differently.",{"type":17,"tag":29,"props":77460,"children":77461},{},[77462,77464,77470,77471,77477,77478,77484,77485,77491,77492,77499],{"type":23,"value":77463},"When integrating with platforms like ",{"type":17,"tag":133,"props":77465,"children":77468},{"href":77466,"rel":77467},"https://developers.google.com/identity/protocols/oauth2",[214],[77469],{"type":23,"value":22466},{"type":23,"value":11826},{"type":17,"tag":133,"props":77472,"children":77475},{"href":77473,"rel":77474},"https://api.slack.com/authentication/oauth-v2",[214],[77476],{"type":23,"value":3204},{"type":23,"value":11826},{"type":17,"tag":133,"props":77479,"children":77482},{"href":77480,"rel":77481},"https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_web_server_flow.htm&type=5",[214],[77483],{"type":23,"value":3179},{"type":23,"value":11826},{"type":17,"tag":133,"props":77486,"children":77489},{"href":77487,"rel":77488},"https://developers.hubspot.com/docs/apps/legacy-apps/authentication/oauth-quickstart-guide",[214],[77490],{"type":23,"value":3184},{"type":23,"value":12561},{"type":17,"tag":133,"props":77493,"children":77496},{"href":77494,"rel":77495},"https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow",[214],[77497],{"type":23,"value":77498},"Microsoft",{"type":23,"value":77500},", you encounter:",{"type":17,"tag":80,"props":77502,"children":77503},{},[77504,77509,77514,77519,77524,77529,77534],{"type":17,"tag":84,"props":77505,"children":77506},{},[77507],{"type":23,"value":77508},"different OAuth flows (authorization_code, client_credentials, API keys)",{"type":17,"tag":84,"props":77510,"children":77511},{},[77512],{"type":23,"value":77513},"inconsistent scope naming (contacts.read vs read_contacts)",{"type":17,"tag":84,"props":77515,"children":77516},{},[77517],{"type":23,"value":77518},"different token formats and expiration rules",{"type":17,"tag":84,"props":77520,"children":77521},{},[77522],{"type":23,"value":77523},"refresh token rotation vs static refresh tokens",{"type":17,"tag":84,"props":77525,"children":77526},{},[77527],{"type":23,"value":77528},"redirect URI inconsistencies",{"type":17,"tag":84,"props":77530,"children":77531},{},[77532],{"type":23,"value":77533},"HTML vs JSON error responses",{"type":17,"tag":84,"props":77535,"children":77536},{},[77537,77539,77543],{"type":23,"value":77538},"varying ",{"type":17,"tag":133,"props":77540,"children":77541},{"href":135},[77542],{"type":23,"value":138},{"type":23,"value":77544}," and retry requirements",{"type":17,"tag":29,"props":77546,"children":77547},{},[77548],{"type":23,"value":77549},"Each new integration introduces new edge cases.",{"type":17,"tag":29,"props":77551,"children":77552},{},[77553],{"type":23,"value":77554},"At 5 integrations, this is manageable.",{"type":17,"tag":29,"props":77556,"children":77557},{},[77558],{"type":23,"value":77559},"At 20+, it becomes a system reliability problem.",{"type":17,"tag":68,"props":77561,"children":77563},{"id":77562},"core-architecture-for-managing-oauth-at-scale",[77564],{"type":23,"value":77565},"Core architecture for managing OAuth at scale",{"type":17,"tag":239,"props":77567,"children":77569},{"id":77568},"_1-centralized-token-store",[77570],{"type":23,"value":77571},"1. Centralized token store",{"type":17,"tag":29,"props":77573,"children":77574},{},[77575],{"type":23,"value":77576},"All tokens should be stored in a single, secure system.",{"type":17,"tag":29,"props":77578,"children":77579},{},[77580],{"type":23,"value":77581},"Each record should include:",{"type":17,"tag":80,"props":77583,"children":77584},{},[77585,77590,77594,77599,77604,77609],{"type":17,"tag":84,"props":77586,"children":77587},{},[77588],{"type":23,"value":77589},"user_id or tenant_id",{"type":17,"tag":84,"props":77591,"children":77592},{},[77593],{"type":23,"value":74285},{"type":17,"tag":84,"props":77595,"children":77596},{},[77597],{"type":23,"value":77598},"access_token",{"type":17,"tag":84,"props":77600,"children":77601},{},[77602],{"type":23,"value":77603},"refresh_token",{"type":17,"tag":84,"props":77605,"children":77606},{},[77607],{"type":23,"value":77608},"expires_at",{"type":17,"tag":84,"props":77610,"children":77611},{},[77612],{"type":23,"value":77613},"scopes",{"type":17,"tag":29,"props":77615,"children":77616},{},[77617],{"type":23,"value":77618},"Best practices:",{"type":17,"tag":80,"props":77620,"children":77621},{},[77622,77627,77647],{"type":17,"tag":84,"props":77623,"children":77624},{},[77625],{"type":23,"value":77626},"encrypt tokens at rest (AES-256)",{"type":17,"tag":84,"props":77628,"children":77629},{},[77630,77632,77639,77640],{"type":23,"value":77631},"use envelope encryption with systems like ",{"type":17,"tag":133,"props":77633,"children":77636},{"href":77634,"rel":77635},"https://aws.amazon.com/kms/",[214],[77637],{"type":23,"value":77638},"AWS KMS",{"type":23,"value":75890},{"type":17,"tag":133,"props":77641,"children":77644},{"href":77642,"rel":77643},"https://www.vaultproject.io/",[214],[77645],{"type":23,"value":77646},"HashiCorp Vault",{"type":17,"tag":84,"props":77648,"children":77649},{},[77650],{"type":23,"value":77651},"always scope queries per tenant (never global access)",{"type":17,"tag":29,"props":77653,"children":77654},{},[77655],{"type":23,"value":77656},"This becomes your single source of truth for all integrations.",{"type":17,"tag":239,"props":77658,"children":77660},{"id":77659},"_2-unified-oauth-service-layer",[77661],{"type":23,"value":77662},"2. Unified OAuth service layer",{"type":17,"tag":29,"props":77664,"children":77665},{},[77666],{"type":23,"value":77667},"Instead of handling OAuth separately for every API, build a shared service that handles:",{"type":17,"tag":80,"props":77669,"children":77670},{},[77671,77676,77681,77686,77691],{"type":17,"tag":84,"props":77672,"children":77673},{},[77674],{"type":23,"value":77675},"authorization URL generation",{"type":17,"tag":84,"props":77677,"children":77678},{},[77679],{"type":23,"value":77680},"callback handling",{"type":17,"tag":84,"props":77682,"children":77683},{},[77684],{"type":23,"value":77685},"token exchange",{"type":17,"tag":84,"props":77687,"children":77688},{},[77689],{"type":23,"value":77690},"token refresh",{"type":17,"tag":84,"props":77692,"children":77693},{},[77694],{"type":23,"value":77695},"revocation handling",{"type":17,"tag":29,"props":77697,"children":77698},{},[77699],{"type":23,"value":77700},"Typical interface:",{"type":17,"tag":80,"props":77702,"children":77703},{},[77704,77709,77714,77719],{"type":17,"tag":84,"props":77705,"children":77706},{},[77707],{"type":23,"value":77708},"getAuthorizationUrl(provider, user)",{"type":17,"tag":84,"props":77710,"children":77711},{},[77712],{"type":23,"value":77713},"exchangeCode(provider, code)",{"type":17,"tag":84,"props":77715,"children":77716},{},[77717],{"type":23,"value":77718},"refreshToken(connectionId)",{"type":17,"tag":84,"props":77720,"children":77721},{},[77722],{"type":23,"value":77723},"getValidToken(connectionId)",{"type":17,"tag":29,"props":77725,"children":77726},{},[77727],{"type":23,"value":77728},"This removes duplicated logic across integrations.",{"type":17,"tag":239,"props":77730,"children":77732},{"id":77731},"_3-standardized-redirect-handling",[77733],{"type":23,"value":77734},"3. Standardized redirect handling",{"type":17,"tag":29,"props":77736,"children":77737},{},[77738],{"type":23,"value":77739},"Use a single callback endpoint:",{"type":17,"tag":6893,"props":77741,"children":77744},{"className":77742,"code":77743,"language":20901,"meta":23},[20899],"/auth/callback\n",[77745],{"type":17,"tag":6121,"props":77746,"children":77747},{"__ignoreMap":7},[77748],{"type":23,"value":77743},{"type":17,"tag":29,"props":77750,"children":77751},{},[77752,77753,77759],{"type":23,"value":48249},{"type":17,"tag":6121,"props":77754,"children":77756},{"className":77755},[],[77757],{"type":23,"value":77758},"state",{"type":23,"value":77760}," parameter to encode:",{"type":17,"tag":80,"props":77762,"children":77763},{},[77764,77768,77773],{"type":17,"tag":84,"props":77765,"children":77766},{},[77767],{"type":23,"value":74285},{"type":17,"tag":84,"props":77769,"children":77770},{},[77771],{"type":23,"value":77772},"tenant_id",{"type":17,"tag":84,"props":77774,"children":77775},{},[77776],{"type":23,"value":77777},"nonce",{"type":17,"tag":29,"props":77779,"children":77780},{},[77781],{"type":23,"value":77782},"This allows one endpoint to handle all integrations safely.",{"type":17,"tag":239,"props":77784,"children":77786},{"id":77785},"_4-proactive-token-refresh",[77787],{"type":23,"value":77788},"4. Proactive token refresh",{"type":17,"tag":29,"props":77790,"children":77791},{},[77792],{"type":23,"value":77793},"Never wait for a 401.",{"type":17,"tag":29,"props":77795,"children":77796},{},[77797],{"type":23,"value":20289},{"type":17,"tag":80,"props":77799,"children":77800},{},[77801,77806,77811],{"type":17,"tag":84,"props":77802,"children":77803},{},[77804],{"type":23,"value":77805},"refresh tokens before expiration (e.g. 5–10 minutes early)",{"type":17,"tag":84,"props":77807,"children":77808},{},[77809],{"type":23,"value":77810},"run background workers to manage refresh cycles",{"type":17,"tag":84,"props":77812,"children":77813},{},[77814],{"type":23,"value":77815},"track expiration centrally",{"type":17,"tag":29,"props":77817,"children":77818},{},[77819],{"type":23,"value":77820},"This prevents production failures and improves reliability.",{"type":17,"tag":239,"props":77822,"children":77824},{"id":77823},"_5-concurrency-safe-token-refresh",[77825],{"type":23,"value":77826},"5. Concurrency-safe token refresh",{"type":17,"tag":29,"props":77828,"children":77829},{},[77830],{"type":23,"value":77831},"One of the most common failure points is race conditions.",{"type":17,"tag":29,"props":77833,"children":77834},{},[77835],{"type":23,"value":77836},"Without protection:",{"type":17,"tag":80,"props":77838,"children":77839},{},[77840,77845,77850],{"type":17,"tag":84,"props":77841,"children":77842},{},[77843],{"type":23,"value":77844},"multiple requests trigger refresh simultaneously",{"type":17,"tag":84,"props":77846,"children":77847},{},[77848],{"type":23,"value":77849},"refresh tokens get overwritten",{"type":17,"tag":84,"props":77851,"children":77852},{},[77853],{"type":23,"value":77854},"tokens become invalid",{"type":17,"tag":29,"props":77856,"children":77857},{},[77858],{"type":23,"value":77859},"Solution: locking",{"type":17,"tag":29,"props":77861,"children":77862},{},[77863],{"type":23,"value":77864},"Single instance:",{"type":17,"tag":80,"props":77866,"children":77867},{},[77868],{"type":17,"tag":84,"props":77869,"children":77870},{},[77871],{"type":23,"value":77872},"in-memory locks",{"type":17,"tag":29,"props":77874,"children":77875},{},[77876],{"type":23,"value":77877},"Distributed systems:",{"type":17,"tag":80,"props":77879,"children":77880},{},[77881],{"type":17,"tag":84,"props":77882,"children":77883},{},[77884],{"type":23,"value":77885},"Redis-based locking (e.g. Redlock)",{"type":17,"tag":29,"props":77887,"children":77888},{},[77889],{"type":23,"value":77890},"Example pattern:",{"type":17,"tag":80,"props":77892,"children":77893},{},[77894,77899],{"type":17,"tag":84,"props":77895,"children":77896},{},[77897],{"type":23,"value":77898},"only one refresh runs per connection",{"type":17,"tag":84,"props":77900,"children":77901},{},[77902],{"type":23,"value":77903},"all other requests wait for completion",{"type":17,"tag":29,"props":77905,"children":77906},{},[77907],{"type":23,"value":77908},"This avoids token corruption.",{"type":17,"tag":239,"props":77910,"children":77912},{"id":77911},"_6-scope-normalization",[77913],{"type":23,"value":77914},"6. Scope normalization",{"type":17,"tag":29,"props":77916,"children":77917},{},[77918],{"type":23,"value":77919},"Every provider defines scopes differently.",{"type":17,"tag":29,"props":77921,"children":77922},{},[77923],{"type":23,"value":377},{"type":17,"tag":80,"props":77925,"children":77926},{},[77927,77932,77937],{"type":17,"tag":84,"props":77928,"children":77929},{},[77930],{"type":23,"value":77931},"contacts.read",{"type":17,"tag":84,"props":77933,"children":77934},{},[77935],{"type":23,"value":77936},"read_contacts",{"type":17,"tag":84,"props":77938,"children":77939},{},[77940],{"type":23,"value":77941},"crm.objects.contacts.read",{"type":17,"tag":29,"props":77943,"children":77944},{},[77945],{"type":23,"value":77946},"To manage this:",{"type":17,"tag":80,"props":77948,"children":77949},{},[77950,77955],{"type":17,"tag":84,"props":77951,"children":77952},{},[77953],{"type":23,"value":77954},"define internal 'unified scopes'",{"type":17,"tag":84,"props":77956,"children":77957},{},[77958],{"type":23,"value":77959},"map provider scopes to internal ones",{"type":17,"tag":29,"props":77961,"children":77962},{},[77963],{"type":23,"value":77964},"This simplifies permission management across integrations.",{"type":17,"tag":239,"props":77966,"children":77968},{"id":77967},"_7-api-request-guardrails",[77969],{"type":23,"value":77970},"7. API request guardrails",{"type":17,"tag":29,"props":77972,"children":77973},{},[77974],{"type":23,"value":77975},"Every API request should:",{"type":17,"tag":80,"props":77977,"children":77978},{},[77979,77984,77989,77994],{"type":17,"tag":84,"props":77980,"children":77981},{},[77982],{"type":23,"value":77983},"validate token freshness",{"type":17,"tag":84,"props":77985,"children":77986},{},[77987],{"type":23,"value":77988},"retry on 401 with refresh",{"type":17,"tag":84,"props":77990,"children":77991},{},[77992],{"type":23,"value":77993},"respect provider rate limits",{"type":17,"tag":84,"props":77995,"children":77996},{},[77997],{"type":23,"value":77998},"handle provider-specific errors",{"type":17,"tag":29,"props":78000,"children":78001},{},[78002],{"type":23,"value":78003},"This logic should live in your OAuth layer—not in product code.",{"type":17,"tag":68,"props":78005,"children":78007},{"id":78006},"operational-challenges-teams-underestimate",[78008],{"type":23,"value":78009},"Operational challenges teams underestimate",{"type":17,"tag":29,"props":78011,"children":78012},{},[78013],{"type":23,"value":78014},"Most teams don't struggle with OAuth setup.",{"type":17,"tag":29,"props":78016,"children":78017},{},[78018,78020,78025],{"type":23,"value":78019},"They struggle with ",{"type":17,"tag":48,"props":78021,"children":78022},{},[78023],{"type":23,"value":78024},"operating OAuth at scale",{"type":23,"value":54},{"type":17,"tag":29,"props":78027,"children":78028},{},[78029],{"type":23,"value":67460},{"type":17,"tag":29,"props":78031,"children":78032},{},[78033],{"type":17,"tag":48,"props":78034,"children":78035},{},[78036],{"type":23,"value":78037},"Token drift",{"type":17,"tag":29,"props":78039,"children":78040},{},[78041],{"type":23,"value":78042},"Tokens expire at different times across integrations.",{"type":17,"tag":29,"props":78044,"children":78045},{},[78046],{"type":17,"tag":48,"props":78047,"children":78048},{},[78049],{"type":23,"value":78050},"Revocations",{"type":17,"tag":29,"props":78052,"children":78053},{},[78054],{"type":23,"value":78055},"Users disconnect apps externally, breaking integrations silently.",{"type":17,"tag":29,"props":78057,"children":78058},{},[78059],{"type":17,"tag":48,"props":78060,"children":78061},{},[78062],{"type":23,"value":78063},"Refresh failures",{"type":17,"tag":29,"props":78065,"children":78066},{},[78067],{"type":23,"value":78068},"Invalid_grant errors force re-authentication.",{"type":17,"tag":29,"props":78070,"children":78071},{},[78072],{"type":17,"tag":48,"props":78073,"children":78074},{},[78075],{"type":23,"value":3279},{"type":17,"tag":29,"props":78077,"children":78078},{},[78079],{"type":23,"value":78080},"Some providers throttle token refresh aggressively.",{"type":17,"tag":29,"props":78082,"children":78083},{},[78084],{"type":17,"tag":48,"props":78085,"children":78086},{},[78087],{"type":23,"value":78088},"Observability gaps",{"type":17,"tag":29,"props":78090,"children":78091},{},[78092],{"type":23,"value":78093},"Teams don't know when connections are broken.",{"type":17,"tag":29,"props":78095,"children":78096},{},[78097],{"type":23,"value":78098},"Without centralized handling, these issues multiply quickly.",{"type":17,"tag":68,"props":78100,"children":78102},{"id":78101},"build-vs-buy-oauth-infrastructure",[78103],{"type":23,"value":78104},"Build vs buy: OAuth infrastructure",{"type":17,"tag":29,"props":78106,"children":78107},{},[78108],{"type":23,"value":78109},"At small scale, teams build OAuth internally.",{"type":17,"tag":29,"props":78111,"children":78112},{},[78113],{"type":23,"value":78114},"At scale, many adopt tools like:",{"type":17,"tag":80,"props":78116,"children":78117},{},[78118,78126],{"type":17,"tag":84,"props":78119,"children":78120},{},[78121],{"type":17,"tag":133,"props":78122,"children":78124},{"href":1021,"rel":78123},[214],[78125],{"type":23,"value":1025},{"type":17,"tag":84,"props":78127,"children":78128},{},[78129],{"type":17,"tag":133,"props":78130,"children":78132},{"href":69013,"rel":78131},[214],[78133],{"type":23,"value":581},{"type":17,"tag":29,"props":78135,"children":78136},{},[78137],{"type":23,"value":78138},"These tools help with:",{"type":17,"tag":80,"props":78140,"children":78141},{},[78142,78147,78151,78156],{"type":17,"tag":84,"props":78143,"children":78144},{},[78145],{"type":23,"value":78146},"OAuth flows",{"type":17,"tag":84,"props":78148,"children":78149},{},[78150],{"type":23,"value":789},{"type":17,"tag":84,"props":78152,"children":78153},{},[78154],{"type":23,"value":78155},"refresh logic",{"type":17,"tag":84,"props":78157,"children":78158},{},[78159],{"type":23,"value":78160},"provider configuration",{"type":17,"tag":29,"props":78162,"children":78163},{},[78164],{"type":23,"value":78165},"However, they still introduce tradeoffs:",{"type":17,"tag":80,"props":78167,"children":78168},{},[78169,78174,78179,78184],{"type":17,"tag":84,"props":78170,"children":78171},{},[78172],{"type":23,"value":78173},"additional infrastructure layer",{"type":17,"tag":84,"props":78175,"children":78176},{},[78177],{"type":23,"value":78178},"data handling considerations",{"type":17,"tag":84,"props":78180,"children":78181},{},[78182],{"type":23,"value":78183},"limitations across integration depth",{"type":17,"tag":84,"props":78185,"children":78186},{},[78187],{"type":23,"value":78188},"need to coordinate with your API layer",{"type":17,"tag":68,"props":78190,"children":78192},{"id":78191},"how-unified-handles-oauth-across-415-integrations",[78193],{"type":23,"value":78194},"How Unified handles OAuth across 415+ integrations",{"type":17,"tag":29,"props":78196,"children":78197},{},[78198],{"type":23,"value":78199},"At Unified, OAuth is treated as part of the integration infrastructure—not a separate system.",{"type":17,"tag":29,"props":78201,"children":78202},{},[78203],{"type":23,"value":78204},"Instead of managing OAuth alongside integrations, we unify it into the same layer.",{"type":17,"tag":29,"props":78206,"children":78207},{},[78208],{"type":23,"value":78209},"This includes:",{"type":17,"tag":239,"props":78211,"children":78213},{"id":78212},"unified-oauth-abstraction",[78214],{"type":23,"value":78215},"Unified OAuth abstraction",{"type":17,"tag":80,"props":78217,"children":78218},{},[78219,78230,78241],{"type":17,"tag":84,"props":78220,"children":78221},{},[78222,78224],{"type":23,"value":78223},"supports all major ",{"type":17,"tag":133,"props":78225,"children":78228},{"href":78226,"rel":78227},"https://unified.to/blog/understanding_oauth2_authorization_flows",[214],[78229],{"type":23,"value":78146},{"type":17,"tag":84,"props":78231,"children":78232},{},[78233,78239],{"type":17,"tag":133,"props":78234,"children":78236},{"href":78235},"/31e6207b838480daacbcf57bfcaddb75",[78237],{"type":23,"value":78238},"normalizes",{"type":23,"value":78240}," provider differences",{"type":17,"tag":84,"props":78242,"children":78243},{},[78244],{"type":23,"value":78245},"handles API keys and token-based auth",{"type":17,"tag":239,"props":78247,"children":78249},{"id":78248},"single-redirect-model",[78250],{"type":23,"value":78251},"Single redirect model",{"type":17,"tag":80,"props":78253,"children":78254},{},[78255,78260],{"type":17,"tag":84,"props":78256,"children":78257},{},[78258],{"type":23,"value":78259},"one standardized callback endpoint",{"type":17,"tag":84,"props":78261,"children":78262},{},[78263],{"type":23,"value":78264},"no per-provider configuration complexity",{"type":17,"tag":239,"props":78266,"children":78268},{"id":78267},"unified-scope-system",[78269],{"type":23,"value":78270},"Unified scope system",{"type":17,"tag":80,"props":78272,"children":78273},{},[78274,78279],{"type":17,"tag":84,"props":78275,"children":78276},{},[78277],{"type":23,"value":78278},"abstract scopes like crm_contact_read",{"type":17,"tag":84,"props":78280,"children":78281},{},[78282],{"type":23,"value":78283},"mapped to provider-specific permissions",{"type":17,"tag":239,"props":78285,"children":78287},{"id":78286},"automatic-token-lifecycle-management",[78288],{"type":23,"value":78289},"Automatic token lifecycle management",{"type":17,"tag":80,"props":78291,"children":78292},{},[78293,78298,78303,78308],{"type":17,"tag":84,"props":78294,"children":78295},{},[78296],{"type":23,"value":78297},"encrypted storage",{"type":17,"tag":84,"props":78299,"children":78300},{},[78301],{"type":23,"value":78302},"automatic refresh",{"type":17,"tag":84,"props":78304,"children":78305},{},[78306],{"type":23,"value":78307},"provider-specific handling",{"type":17,"tag":84,"props":78309,"children":78310},{},[78311],{"type":23,"value":78312},"failure detection and connection health tracking",{"type":17,"tag":239,"props":78314,"children":78316},{"id":78315},"standardized-error-handling",[78317],{"type":23,"value":78318},"Standardized error handling",{"type":17,"tag":80,"props":78320,"children":78321},{},[78322,78327],{"type":17,"tag":84,"props":78323,"children":78324},{},[78325],{"type":23,"value":78326},"consistent 401 / 403 / 400 responses",{"type":17,"tag":84,"props":78328,"children":78329},{},[78330],{"type":23,"value":78331},"no provider-specific parsing",{"type":17,"tag":239,"props":78333,"children":78335},{"id":78334},"connection-based-security",[78336],{"type":23,"value":78337},"Connection-based security",{"type":17,"tag":80,"props":78339,"children":78340},{},[78341,78346],{"type":17,"tag":84,"props":78342,"children":78343},{},[78344],{"type":23,"value":78345},"each integration tied to a scoped connection",{"type":17,"tag":84,"props":78347,"children":78348},{},[78349],{"type":23,"value":78350},"permissions enforced at the connection level",{"type":17,"tag":68,"props":78352,"children":78354},{"id":78353},"why-this-matters-for-saas-products",[78355],{"type":23,"value":78356},"Why this matters for SaaS products",{"type":17,"tag":29,"props":78358,"children":78359},{},[78360],{"type":23,"value":78361},"OAuth complexity directly impacts:",{"type":17,"tag":80,"props":78363,"children":78364},{},[78365,78370,78375,78380,78385],{"type":17,"tag":84,"props":78366,"children":78367},{},[78368],{"type":23,"value":78369},"time to launch integrations",{"type":17,"tag":84,"props":78371,"children":78372},{},[78373],{"type":23,"value":78374},"reliability in production",{"type":17,"tag":84,"props":78376,"children":78377},{},[78378],{"type":23,"value":78379},"customer onboarding experience",{"type":17,"tag":84,"props":78381,"children":78382},{},[78383],{"type":23,"value":78384},"support burden",{"type":17,"tag":84,"props":78386,"children":78387},{},[78388],{"type":23,"value":78389},"security and compliance",{"type":17,"tag":29,"props":78391,"children":78392},{},[78393],{"type":23,"value":78394},"When OAuth is fragmented:",{"type":17,"tag":80,"props":78396,"children":78397},{},[78398,78403,78408],{"type":17,"tag":84,"props":78399,"children":78400},{},[78401],{"type":23,"value":78402},"integrations break silently",{"type":17,"tag":84,"props":78404,"children":78405},{},[78406],{"type":23,"value":78407},"engineers spend time debugging auth issues",{"type":17,"tag":84,"props":78409,"children":78410},{},[78411],{"type":23,"value":78412},"customers must reconnect frequently",{"type":17,"tag":29,"props":78414,"children":78415},{},[78416],{"type":23,"value":78417},"When OAuth is centralized:",{"type":17,"tag":80,"props":78419,"children":78420},{},[78421,78426,78431,78436],{"type":17,"tag":84,"props":78422,"children":78423},{},[78424],{"type":23,"value":78425},"integrations behave consistently",{"type":17,"tag":84,"props":78427,"children":78428},{},[78429],{"type":23,"value":78430},"failures are predictable and visible",{"type":17,"tag":84,"props":78432,"children":78433},{},[78434],{"type":23,"value":78435},"onboarding becomes faster",{"type":17,"tag":84,"props":78437,"children":78438},{},[78439],{"type":23,"value":78440},"systems scale cleanly",{"type":17,"tag":68,"props":78442,"children":78443},{"id":7672},[78444],{"type":23,"value":7675},{"type":17,"tag":29,"props":78446,"children":78447},{},[78448],{"type":23,"value":78449},"If you're building SaaS integrations:",{"type":17,"tag":80,"props":78451,"children":78452},{},[78453,78458,78463,78468,78473],{"type":17,"tag":84,"props":78454,"children":78455},{},[78456],{"type":23,"value":78457},"treat OAuth as infrastructure, not feature code",{"type":17,"tag":84,"props":78459,"children":78460},{},[78461],{"type":23,"value":78462},"centralize token storage and lifecycle management",{"type":17,"tag":84,"props":78464,"children":78465},{},[78466],{"type":23,"value":78467},"normalize scopes and redirect flows",{"type":17,"tag":84,"props":78469,"children":78470},{},[78471],{"type":23,"value":78472},"implement concurrency-safe refresh logic",{"type":17,"tag":84,"props":78474,"children":78475},{},[78476],{"type":23,"value":78477},"build observability into connection health",{"type":17,"tag":29,"props":78479,"children":78480},{},[78481],{"type":23,"value":78482},"And most importantly:",{"type":17,"tag":29,"props":78484,"children":78485},{},[78486],{"type":23,"value":78487},"The complexity is not in the OAuth handshake.",{"type":17,"tag":29,"props":78489,"children":78490},{},[78491],{"type":23,"value":78492},"It's in managing OAuth reliably across dozens or hundreds of integrations.",{"type":17,"tag":68,"props":78494,"children":78496},{"id":78495},"start-building-faster",[78497],{"type":23,"value":78498},"Start building faster",{"type":17,"tag":29,"props":78500,"children":78501},{},[78502,78503],{"type":23,"value":1609},{"type":17,"tag":133,"props":78504,"children":78506},{"href":1612,"rel":78505},[214],[78507],{"type":23,"value":1616},{"type":17,"tag":29,"props":78509,"children":78510},{},[78511,78512],{"type":23,"value":1609},{"type":17,"tag":133,"props":78513,"children":78514},{"href":78235},[78515],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":78517},[78518,78519,78528,78529,78530,78538,78539,78540],{"id":77450,"depth":1629,"text":77453},{"id":77562,"depth":1629,"text":77565,"children":78520},[78521,78522,78523,78524,78525,78526,78527],{"id":77568,"depth":1635,"text":77571},{"id":77659,"depth":1635,"text":77662},{"id":77731,"depth":1635,"text":77734},{"id":77785,"depth":1635,"text":77788},{"id":77823,"depth":1635,"text":77826},{"id":77911,"depth":1635,"text":77914},{"id":77967,"depth":1635,"text":77970},{"id":78006,"depth":1629,"text":78009},{"id":78101,"depth":1629,"text":78104},{"id":78191,"depth":1629,"text":78194,"children":78531},[78532,78533,78534,78535,78536,78537],{"id":78212,"depth":1635,"text":78215},{"id":78248,"depth":1635,"text":78251},{"id":78267,"depth":1635,"text":78270},{"id":78286,"depth":1635,"text":78289},{"id":78315,"depth":1635,"text":78318},{"id":78334,"depth":1635,"text":78337},{"id":78353,"depth":1629,"text":78356},{"id":7672,"depth":1629,"text":7675},{"id":78495,"depth":1629,"text":78498},"content:blog:how_to_handle_oauth_across_many_integrations.md","blog/how_to_handle_oauth_across_many_integrations.md","blog/how_to_handle_oauth_across_many_integrations",{"_path":78545,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":78546,"description":78547,"img":78548,"date":77401,"tag":12,"body":78549,"_type":1677,"_id":79592,"_source":1679,"_file":79593,"_stem":79594,"_extension":1682},"/blog/top_benefits_of_unified_apis_for_saas_integrations","Top Benefits of Unified APIs for SaaS Integrations","SaaS products don't struggle to build integrations. They struggle to scale them.","https://s3.us-east-2.amazonaws.com/unified-article-images/top_benefits_of_unified_apis_for_saas_integrations-icon.png",{"type":14,"children":78550,"toc":79577},[78551,78556,78559,78566,78577,78588,78593,78598,78610,78615,78626,78632,78642,78666,78688,78693,78714,78720,78725,78759,78764,78769,78774,78780,78785,78803,78807,78836,78841,78847,78852,78870,78875,78893,78898,78916,78922,78927,78932,78950,78955,78959,78977,78982,78988,78993,78997,79015,79020,79028,79033,79057,79061,79079,79085,79090,79106,79111,79116,79134,79139,79157,79173,79179,79184,79208,79231,79236,79259,79264,79270,79275,79280,79298,79302,79319,79323,79341,79347,79352,79375,79379,79397,79403,79408,79421,79426,79444,79450,79455,79471,79476,79494,79498,79514,79518,79523,79528,79550,79555,79560,79568],{"type":17,"tag":18,"props":78552,"children":78554},{"id":78553},"top-benefits-of-unified-apis-for-saas-integrations",[78555],{"type":23,"value":78546},{"type":17,"tag":25,"props":78557,"children":78558},{},[],{"type":17,"tag":29,"props":78560,"children":78561},{},[78562],{"type":17,"tag":33,"props":78563,"children":78564},{},[78565],{"type":23,"value":37},{"type":17,"tag":29,"props":78567,"children":78568},{},[78569,78571,78576],{"type":23,"value":78570},"SaaS products don't struggle to build integrations. They struggle to ",{"type":17,"tag":48,"props":78572,"children":78573},{},[78574],{"type":23,"value":78575},"scale them",{"type":23,"value":54},{"type":17,"tag":29,"props":78578,"children":78579},{},[78580,78582,78586],{"type":23,"value":78581},"Every new customer brings a different stack: Salesforce, HubSpot, Workday, QuickBooks, Slack. Each one requires its own authentication, schema, ",{"type":17,"tag":133,"props":78583,"children":78584},{"href":135},[78585],{"type":23,"value":138},{"type":23,"value":78587},", edge cases, and maintenance.",{"type":17,"tag":29,"props":78589,"children":78590},{},[78591],{"type":23,"value":78592},"This is where most teams get stuck.",{"type":17,"tag":29,"props":78594,"children":78595},{},[78596],{"type":23,"value":78597},"Engineering time shifts away from product development into integration maintenance. Roadmaps slow down. Deals stall. Systems become brittle.",{"type":17,"tag":29,"props":78599,"children":78600},{},[78601,78608],{"type":17,"tag":133,"props":78602,"children":78605},{"href":78603,"rel":78604},"https://unified.to/technology",[214],[78606],{"type":23,"value":78607},"Unified APIs",{"type":23,"value":78609}," change that model.",{"type":17,"tag":29,"props":78611,"children":78612},{},[78613],{"type":23,"value":78614},"Instead of building integrations one-by-one, you integrate once and support entire categories of software through a single interface.",{"type":17,"tag":29,"props":78616,"children":78617},{},[78618,78619,78624],{"type":23,"value":59},{"type":17,"tag":48,"props":78620,"children":78621},{},[78622],{"type":23,"value":78623},"real benefits of Unified APIs",{"type":23,"value":78625},", what they actually solve, and why modern SaaS teams are moving toward real-time, zero-storage architectures.",{"type":17,"tag":68,"props":78627,"children":78629},{"id":78628},"what-is-a-unified-api",[78630],{"type":23,"value":78631},"What Is a Unified API?",{"type":17,"tag":29,"props":78633,"children":78634},{},[78635,78636,78640],{"type":23,"value":9619},{"type":17,"tag":133,"props":78637,"children":78638},{"href":7691},[78639],{"type":23,"value":7806},{"type":23,"value":78641}," is an abstraction layer that standardizes multiple third-party APIs into a single interface.",{"type":17,"tag":29,"props":78643,"children":78644},{},[78645,78647,78652,78653,78658,78659,78664],{"type":23,"value":78646},"Instead of building separate integrations for platforms like ",{"type":17,"tag":133,"props":78648,"children":78650},{"href":76285,"rel":78649},[214],[78651],{"type":23,"value":3179},{"type":23,"value":11826},{"type":17,"tag":133,"props":78654,"children":78656},{"href":29657,"rel":78655},[214],[78657],{"type":23,"value":3184},{"type":23,"value":12561},{"type":17,"tag":133,"props":78660,"children":78662},{"href":61968,"rel":78661},[214],[78663],{"type":23,"value":26530},{"type":23,"value":78665},", you integrate once and access all of them through:",{"type":17,"tag":80,"props":78667,"children":78668},{},[78669,78674,78678,78683],{"type":17,"tag":84,"props":78670,"children":78671},{},[78672],{"type":23,"value":78673},"one authentication model",{"type":17,"tag":84,"props":78675,"children":78676},{},[78677],{"type":23,"value":41586},{"type":17,"tag":84,"props":78679,"children":78680},{},[78681],{"type":23,"value":78682},"one set of endpoints",{"type":17,"tag":84,"props":78684,"children":78685},{},[78686],{"type":23,"value":78687},"one error format",{"type":17,"tag":29,"props":78689,"children":78690},{},[78691],{"type":23,"value":78692},"Modern unified APIs also support:",{"type":17,"tag":80,"props":78694,"children":78695},{},[78696,78700,78705,78710],{"type":17,"tag":84,"props":78697,"children":78698},{},[78699],{"type":23,"value":27657},{"type":17,"tag":84,"props":78701,"children":78702},{},[78703],{"type":23,"value":78704},"read and write operations",{"type":17,"tag":84,"props":78706,"children":78707},{},[78708],{"type":23,"value":78709},"normalized + raw data access",{"type":17,"tag":84,"props":78711,"children":78712},{},[78713],{"type":23,"value":77349},{"type":17,"tag":68,"props":78715,"children":78717},{"id":78716},"the-core-problem-unified-apis-solve",[78718],{"type":23,"value":78719},"The Core Problem Unified APIs Solve",{"type":17,"tag":29,"props":78721,"children":78722},{},[78723],{"type":23,"value":78724},"Building integrations directly creates:",{"type":17,"tag":80,"props":78726,"children":78727},{},[78728,78739,78744,78749,78754],{"type":17,"tag":84,"props":78729,"children":78730},{},[78731,78733,78737],{"type":23,"value":78732},"duplicated ",{"type":17,"tag":133,"props":78734,"children":78735},{"href":779},[78736],{"type":23,"value":782},{"type":23,"value":78738}," implementations per provider",{"type":17,"tag":84,"props":78740,"children":78741},{},[78742],{"type":23,"value":78743},"inconsistent data models across systems",{"type":17,"tag":84,"props":78745,"children":78746},{},[78747],{"type":23,"value":78748},"ongoing breakage from API changes",{"type":17,"tag":84,"props":78750,"children":78751},{},[78752],{"type":23,"value":78753},"complex retry and rate-limit handling",{"type":17,"tag":84,"props":78755,"children":78756},{},[78757],{"type":23,"value":78758},"fragmented observability",{"type":17,"tag":29,"props":78760,"children":78761},{},[78762],{"type":23,"value":78763},"This compounds quickly.",{"type":17,"tag":29,"props":78765,"children":78766},{},[78767],{"type":23,"value":78768},"Supporting 10 integrations does not mean 10x effort. It often means exponential complexity.",{"type":17,"tag":29,"props":78770,"children":78771},{},[78772],{"type":23,"value":78773},"Unified APIs remove that layer entirely.",{"type":17,"tag":68,"props":78775,"children":78777},{"id":78776},"_1-build-once-support-many-integrations",[78778],{"type":23,"value":78779},"1. Build Once, Support Many Integrations",{"type":17,"tag":29,"props":78781,"children":78782},{},[78783],{"type":23,"value":78784},"With a unified API:",{"type":17,"tag":80,"props":78786,"children":78787},{},[78788,78793,78798],{"type":17,"tag":84,"props":78789,"children":78790},{},[78791],{"type":23,"value":78792},"one integration unlocks dozens of providers",{"type":17,"tag":84,"props":78794,"children":78795},{},[78796],{"type":23,"value":78797},"new integrations do not require new engineering work",{"type":17,"tag":84,"props":78799,"children":78800},{},[78801],{"type":23,"value":78802},"expansion into new markets becomes configuration, not development",{"type":17,"tag":29,"props":78804,"children":78805},{},[78806],{"type":23,"value":3258},{"type":17,"tag":80,"props":78808,"children":78809},{},[78810,78823],{"type":17,"tag":84,"props":78811,"children":78812},{},[78813,78815,78821],{"type":23,"value":78814},"a ",{"type":17,"tag":133,"props":78816,"children":78818},{"href":76501,"rel":78817},[214],[78819],{"type":23,"value":78820},"CRM unified API",{"type":23,"value":78822}," can support 47+ CRM integrations",{"type":17,"tag":84,"props":78824,"children":78825},{},[78826,78828,78834],{"type":23,"value":78827},"an ",{"type":17,"tag":133,"props":78829,"children":78831},{"href":58209,"rel":78830},[214],[78832],{"type":23,"value":78833},"HRIS unified API",{"type":23,"value":78835}," can support 224+ workforce systems",{"type":17,"tag":29,"props":78837,"children":78838},{},[78839],{"type":23,"value":78840},"Instead of committing engineering cycles per integration, teams unlock entire categories at once.",{"type":17,"tag":68,"props":78842,"children":78844},{"id":78843},"_2-faster-time-to-market",[78845],{"type":23,"value":78846},"2. Faster Time-to-Market",{"type":17,"tag":29,"props":78848,"children":78849},{},[78850],{"type":23,"value":78851},"Traditional integrations:",{"type":17,"tag":80,"props":78853,"children":78854},{},[78855,78860,78865],{"type":17,"tag":84,"props":78856,"children":78857},{},[78858],{"type":23,"value":78859},"2–4 weeks per provider",{"type":17,"tag":84,"props":78861,"children":78862},{},[78863],{"type":23,"value":78864},"additional time for edge cases and testing",{"type":17,"tag":84,"props":78866,"children":78867},{},[78868],{"type":23,"value":78869},"ongoing fixes after launch",{"type":17,"tag":29,"props":78871,"children":78872},{},[78873],{"type":23,"value":78874},"Unified APIs:",{"type":17,"tag":80,"props":78876,"children":78877},{},[78878,78883,78888],{"type":17,"tag":84,"props":78879,"children":78880},{},[78881],{"type":23,"value":78882},"days to production",{"type":17,"tag":84,"props":78884,"children":78885},{},[78886],{"type":23,"value":78887},"no per-provider logic",{"type":17,"tag":84,"props":78889,"children":78890},{},[78891],{"type":23,"value":78892},"minimal rework",{"type":17,"tag":29,"props":78894,"children":78895},{},[78896],{"type":23,"value":78897},"This directly impacts:",{"type":17,"tag":80,"props":78899,"children":78900},{},[78901,78906,78911],{"type":17,"tag":84,"props":78902,"children":78903},{},[78904],{"type":23,"value":78905},"enterprise deal velocity",{"type":17,"tag":84,"props":78907,"children":78908},{},[78909],{"type":23,"value":78910},"feature release timelines",{"type":17,"tag":84,"props":78912,"children":78913},{},[78914],{"type":23,"value":78915},"ability to close integration-dependent deals",{"type":17,"tag":68,"props":78917,"children":78919},{"id":78918},"_3-reduced-maintenance-overhead",[78920],{"type":23,"value":78921},"3. Reduced Maintenance Overhead",{"type":17,"tag":29,"props":78923,"children":78924},{},[78925],{"type":23,"value":78926},"Most integration cost happens after launch.",{"type":17,"tag":29,"props":78928,"children":78929},{},[78930],{"type":23,"value":78931},"APIs change constantly:",{"type":17,"tag":80,"props":78933,"children":78934},{},[78935,78940,78945],{"type":17,"tag":84,"props":78936,"children":78937},{},[78938],{"type":23,"value":78939},"endpoints get deprecated",{"type":17,"tag":84,"props":78941,"children":78942},{},[78943],{"type":23,"value":78944},"fields change",{"type":17,"tag":84,"props":78946,"children":78947},{},[78948],{"type":23,"value":78949},"authentication flows evolve",{"type":17,"tag":29,"props":78951,"children":78952},{},[78953],{"type":23,"value":78954},"With direct integrations, every change requires code updates.",{"type":17,"tag":29,"props":78956,"children":78957},{},[78958],{"type":23,"value":78784},{"type":17,"tag":80,"props":78960,"children":78961},{},[78962,78967,78972],{"type":17,"tag":84,"props":78963,"children":78964},{},[78965],{"type":23,"value":78966},"changes are handled centrally",{"type":17,"tag":84,"props":78968,"children":78969},{},[78970],{"type":23,"value":78971},"your integration layer remains stable",{"type":17,"tag":84,"props":78973,"children":78974},{},[78975],{"type":23,"value":78976},"maintenance drops significantly",{"type":17,"tag":29,"props":78978,"children":78979},{},[78980],{"type":23,"value":78981},"This is one of the highest ROI benefits.",{"type":17,"tag":68,"props":78983,"children":78985},{"id":78984},"_4-consistent-data-models-across-providers",[78986],{"type":23,"value":78987},"4. Consistent Data Models Across Providers",{"type":17,"tag":29,"props":78989,"children":78990},{},[78991],{"type":23,"value":78992},"Different platforms structure data differently.",{"type":17,"tag":29,"props":78994,"children":78995},{},[78996],{"type":23,"value":19878},{"type":17,"tag":80,"props":78998,"children":78999},{},[79000,79005,79010],{"type":17,"tag":84,"props":79001,"children":79002},{},[79003],{"type":23,"value":79004},"Salesforce → Account.Name",{"type":17,"tag":84,"props":79006,"children":79007},{},[79008],{"type":23,"value":79009},"HubSpot → company.properties.name",{"type":17,"tag":84,"props":79011,"children":79012},{},[79013],{"type":23,"value":79014},"Pipedrive → org.name",{"type":17,"tag":29,"props":79016,"children":79017},{},[79018],{"type":23,"value":79019},"Unified APIs normalize this into:",{"type":17,"tag":80,"props":79021,"children":79022},{},[79023],{"type":17,"tag":84,"props":79024,"children":79025},{},[79026],{"type":23,"value":79027},"company.name",{"type":17,"tag":29,"props":79029,"children":79030},{},[79031],{"type":23,"value":79032},"This applies across:",{"type":17,"tag":80,"props":79034,"children":79035},{},[79036,79040,79045,79049,79053],{"type":17,"tag":84,"props":79037,"children":79038},{},[79039],{"type":23,"value":30404},{"type":17,"tag":84,"props":79041,"children":79042},{},[79043],{"type":23,"value":79044},"deals",{"type":17,"tag":84,"props":79046,"children":79047},{},[79048],{"type":23,"value":62469},{"type":17,"tag":84,"props":79050,"children":79051},{},[79052],{"type":23,"value":55713},{"type":17,"tag":84,"props":79054,"children":79055},{},[79056],{"type":23,"value":36676},{"type":17,"tag":29,"props":79058,"children":79059},{},[79060],{"type":23,"value":22029},{"type":17,"tag":80,"props":79062,"children":79063},{},[79064,79069,79074],{"type":17,"tag":84,"props":79065,"children":79066},{},[79067],{"type":23,"value":79068},"less transformation logic",{"type":17,"tag":84,"props":79070,"children":79071},{},[79072],{"type":23,"value":79073},"simpler product features",{"type":17,"tag":84,"props":79075,"children":79076},{},[79077],{"type":23,"value":79078},"cleaner analytics",{"type":17,"tag":68,"props":79080,"children":79082},{"id":79081},"_5-real-time-data-instead-of-sync-delays",[79083],{"type":23,"value":79084},"5. Real-Time Data Instead of Sync Delays",{"type":17,"tag":29,"props":79086,"children":79087},{},[79088],{"type":23,"value":79089},"Many integration platforms rely on:",{"type":17,"tag":80,"props":79091,"children":79092},{},[79093,79097,79102],{"type":17,"tag":84,"props":79094,"children":79095},{},[79096],{"type":23,"value":31656},{"type":17,"tag":84,"props":79098,"children":79099},{},[79100],{"type":23,"value":79101},"scheduled syncs",{"type":17,"tag":84,"props":79103,"children":79104},{},[79105],{"type":23,"value":32803},{"type":17,"tag":29,"props":79107,"children":79108},{},[79109],{"type":23,"value":79110},"This creates stale data and reliability issues.",{"type":17,"tag":29,"props":79112,"children":79113},{},[79114],{"type":23,"value":79115},"Modern unified APIs use:",{"type":17,"tag":80,"props":79117,"children":79118},{},[79119,79124,79129],{"type":17,"tag":84,"props":79120,"children":79121},{},[79122],{"type":23,"value":79123},"real-time pass-through requests",{"type":17,"tag":84,"props":79125,"children":79126},{},[79127],{"type":23,"value":79128},"native + virtual webhooks",{"type":17,"tag":84,"props":79130,"children":79131},{},[79132],{"type":23,"value":79133},"event-driven updates",{"type":17,"tag":29,"props":79135,"children":79136},{},[79137],{"type":23,"value":79138},"This enables:",{"type":17,"tag":80,"props":79140,"children":79141},{},[79142,79147,79152],{"type":17,"tag":84,"props":79143,"children":79144},{},[79145],{"type":23,"value":79146},"instant workflows",{"type":17,"tag":84,"props":79148,"children":79149},{},[79150],{"type":23,"value":79151},"accurate dashboards",{"type":17,"tag":84,"props":79153,"children":79154},{},[79155],{"type":23,"value":79156},"reliable automation",{"type":17,"tag":29,"props":79158,"children":79159},{},[79160,79165],{"type":17,"tag":133,"props":79161,"children":79163},{"href":79162},"/31e6207b83848063a7d8de9a02e0d9aa",[79164],{"type":23,"value":1609},{"type":17,"tag":133,"props":79166,"children":79167},{"href":79162},[79168],{"type":17,"tag":48,"props":79169,"children":79170},{},[79171],{"type":23,"value":79172},"Unlock real-time data with virtual webhooks",{"type":17,"tag":68,"props":79174,"children":79176},{"id":79175},"_6-simplified-oauth-and-authentication",[79177],{"type":23,"value":79178},"6. Simplified OAuth and Authentication",{"type":17,"tag":29,"props":79180,"children":79181},{},[79182],{"type":23,"value":79183},"OAuth is one of the hardest parts of integrations.",{"type":17,"tag":29,"props":79185,"children":79186},{},[79187,79189,79194,79195,79200,79201,79206],{"type":23,"value":79188},"Across providers like ",{"type":17,"tag":133,"props":79190,"children":79192},{"href":77466,"rel":79191},[214],[79193],{"type":23,"value":22466},{"type":23,"value":11826},{"type":17,"tag":133,"props":79196,"children":79198},{"href":77473,"rel":79197},[214],[79199],{"type":23,"value":3204},{"type":23,"value":12561},{"type":17,"tag":133,"props":79202,"children":79204},{"href":77494,"rel":79203},[214],[79205],{"type":23,"value":77498},{"type":23,"value":79207},", you deal with:",{"type":17,"tag":80,"props":79209,"children":79210},{},[79211,79216,79221,79226],{"type":17,"tag":84,"props":79212,"children":79213},{},[79214],{"type":23,"value":79215},"different grant types",{"type":17,"tag":84,"props":79217,"children":79218},{},[79219],{"type":23,"value":79220},"inconsistent scopes",{"type":17,"tag":84,"props":79222,"children":79223},{},[79224],{"type":23,"value":79225},"token refresh logic",{"type":17,"tag":84,"props":79227,"children":79228},{},[79229],{"type":23,"value":79230},"provider-specific edge cases",{"type":17,"tag":29,"props":79232,"children":79233},{},[79234],{"type":23,"value":79235},"Unified APIs standardize this by:",{"type":17,"tag":80,"props":79237,"children":79238},{},[79239,79244,79249,79254],{"type":17,"tag":84,"props":79240,"children":79241},{},[79242],{"type":23,"value":79243},"handling OAuth flows centrally",{"type":17,"tag":84,"props":79245,"children":79246},{},[79247],{"type":23,"value":79248},"automating token refresh",{"type":17,"tag":84,"props":79250,"children":79251},{},[79252],{"type":23,"value":79253},"normalizing scopes",{"type":17,"tag":84,"props":79255,"children":79256},{},[79257],{"type":23,"value":79258},"providing one authorization interface",{"type":17,"tag":29,"props":79260,"children":79261},{},[79262],{"type":23,"value":79263},"Instead of solving OAuth repeatedly, you solve it once.",{"type":17,"tag":68,"props":79265,"children":79267},{"id":79266},"_7-stronger-security-and-compliance",[79268],{"type":23,"value":79269},"7. Stronger Security and Compliance",{"type":17,"tag":29,"props":79271,"children":79272},{},[79273],{"type":23,"value":79274},"Every integration increases risk.",{"type":17,"tag":29,"props":79276,"children":79277},{},[79278],{"type":23,"value":79279},"Traditional architectures often:",{"type":17,"tag":80,"props":79281,"children":79282},{},[79283,79288,79293],{"type":17,"tag":84,"props":79284,"children":79285},{},[79286],{"type":23,"value":79287},"store third-party data",{"type":17,"tag":84,"props":79289,"children":79290},{},[79291],{"type":23,"value":79292},"duplicate sensitive data across systems",{"type":17,"tag":84,"props":79294,"children":79295},{},[79296],{"type":23,"value":79297},"expand audit scope",{"type":17,"tag":29,"props":79299,"children":79300},{},[79301],{"type":23,"value":79115},{"type":17,"tag":80,"props":79303,"children":79304},{},[79305,79309,79314],{"type":17,"tag":84,"props":79306,"children":79307},{},[79308],{"type":23,"value":63298},{"type":17,"tag":84,"props":79310,"children":79311},{},[79312],{"type":23,"value":79313},"encrypted credential handling",{"type":17,"tag":84,"props":79315,"children":79316},{},[79317],{"type":23,"value":79318},"regional routing (US/EU/AU)",{"type":17,"tag":29,"props":79320,"children":79321},{},[79322],{"type":23,"value":148},{"type":17,"tag":80,"props":79324,"children":79325},{},[79326,79331,79336],{"type":17,"tag":84,"props":79327,"children":79328},{},[79329],{"type":23,"value":79330},"smaller compliance scope",{"type":17,"tag":84,"props":79332,"children":79333},{},[79334],{"type":23,"value":79335},"easier SOC 2, GDPR, HIPAA alignment",{"type":17,"tag":84,"props":79337,"children":79338},{},[79339],{"type":23,"value":79340},"reduced breach risk",{"type":17,"tag":68,"props":79342,"children":79344},{"id":79343},"_8-better-developer-experience",[79345],{"type":23,"value":79346},"8. Better Developer Experience",{"type":17,"tag":29,"props":79348,"children":79349},{},[79350],{"type":23,"value":79351},"Unified APIs give developers:",{"type":17,"tag":80,"props":79353,"children":79354},{},[79355,79360,79365,79370],{"type":17,"tag":84,"props":79356,"children":79357},{},[79358],{"type":23,"value":79359},"one API instead of many",{"type":17,"tag":84,"props":79361,"children":79362},{},[79363],{"type":23,"value":79364},"consistent SDKs",{"type":17,"tag":84,"props":79366,"children":79367},{},[79368],{"type":23,"value":79369},"standardized errors",{"type":17,"tag":84,"props":79371,"children":79372},{},[79373],{"type":23,"value":79374},"unified pagination",{"type":17,"tag":29,"props":79376,"children":79377},{},[79378],{"type":23,"value":54240},{"type":17,"tag":80,"props":79380,"children":79381},{},[79382,79387,79392],{"type":17,"tag":84,"props":79383,"children":79384},{},[79385],{"type":23,"value":79386},"onboarding time",{"type":17,"tag":84,"props":79388,"children":79389},{},[79390],{"type":23,"value":79391},"debugging complexity",{"type":17,"tag":84,"props":79393,"children":79394},{},[79395],{"type":23,"value":79396},"dependency on vendor-specific knowledge",{"type":17,"tag":68,"props":79398,"children":79400},{"id":79399},"_9-predictable-scaling",[79401],{"type":23,"value":79402},"9. Predictable Scaling",{"type":17,"tag":29,"props":79404,"children":79405},{},[79406],{"type":23,"value":79407},"Without unified APIs:",{"type":17,"tag":80,"props":79409,"children":79410},{},[79411,79416],{"type":17,"tag":84,"props":79412,"children":79413},{},[79414],{"type":23,"value":79415},"more integrations → more engineers",{"type":17,"tag":84,"props":79417,"children":79418},{},[79419],{"type":23,"value":79420},"more customers → more failures",{"type":17,"tag":29,"props":79422,"children":79423},{},[79424],{"type":23,"value":79425},"With unified APIs:",{"type":17,"tag":80,"props":79427,"children":79428},{},[79429,79434,79439],{"type":17,"tag":84,"props":79430,"children":79431},{},[79432],{"type":23,"value":79433},"scaling integrations does not scale complexity",{"type":17,"tag":84,"props":79435,"children":79436},{},[79437],{"type":23,"value":79438},"infrastructure remains consistent",{"type":17,"tag":84,"props":79440,"children":79441},{},[79442],{"type":23,"value":79443},"teams stay small and efficient",{"type":17,"tag":68,"props":79445,"children":79447},{"id":79446},"_10-enables-ai-and-automation",[79448],{"type":23,"value":79449},"10. Enables AI and Automation",{"type":17,"tag":29,"props":79451,"children":79452},{},[79453],{"type":23,"value":79454},"AI systems require:",{"type":17,"tag":80,"props":79456,"children":79457},{},[79458,79463,79467],{"type":17,"tag":84,"props":79459,"children":79460},{},[79461],{"type":23,"value":79462},"clean data",{"type":17,"tag":84,"props":79464,"children":79465},{},[79466],{"type":23,"value":44278},{"type":17,"tag":84,"props":79468,"children":79469},{},[79470],{"type":23,"value":69604},{"type":17,"tag":29,"props":79472,"children":79473},{},[79474],{"type":23,"value":79475},"Unified APIs provide:",{"type":17,"tag":80,"props":79477,"children":79478},{},[79479,79484,79489],{"type":17,"tag":84,"props":79480,"children":79481},{},[79482],{"type":23,"value":79483},"normalized data across systems",{"type":17,"tag":84,"props":79485,"children":79486},{},[79487],{"type":23,"value":79488},"real-time retrieval",{"type":17,"tag":84,"props":79490,"children":79491},{},[79492],{"type":23,"value":79493},"safe write capabilities",{"type":17,"tag":29,"props":79495,"children":79496},{},[79497],{"type":23,"value":79138},{"type":17,"tag":80,"props":79499,"children":79500},{},[79501,79505,79509],{"type":17,"tag":84,"props":79502,"children":79503},{},[79504],{"type":23,"value":15895},{"type":17,"tag":84,"props":79506,"children":79507},{},[79508],{"type":23,"value":10949},{"type":17,"tag":84,"props":79510,"children":79511},{},[79512],{"type":23,"value":79513},"predictive analytics",{"type":17,"tag":68,"props":79515,"children":79516},{"id":1552},[79517],{"type":23,"value":44411},{"type":17,"tag":29,"props":79519,"children":79520},{},[79521],{"type":23,"value":79522},"Unified APIs are not just an integration tool. They are infrastructure.",{"type":17,"tag":29,"props":79524,"children":79525},{},[79526],{"type":23,"value":79527},"They allow teams to:",{"type":17,"tag":80,"props":79529,"children":79530},{},[79531,79536,79541,79545],{"type":17,"tag":84,"props":79532,"children":79533},{},[79534],{"type":23,"value":79535},"move faster",{"type":17,"tag":84,"props":79537,"children":79538},{},[79539],{"type":23,"value":79540},"support more integrations",{"type":17,"tag":84,"props":79542,"children":79543},{},[79544],{"type":23,"value":13221},{"type":17,"tag":84,"props":79546,"children":79547},{},[79548],{"type":23,"value":79549},"build more advanced products",{"type":17,"tag":29,"props":79551,"children":79552},{},[79553],{"type":23,"value":79554},"The biggest benefit is not fewer integrations to manage.",{"type":17,"tag":29,"props":79556,"children":79557},{},[79558],{"type":23,"value":79559},"It's the ability to focus on building your product.",{"type":17,"tag":29,"props":79561,"children":79562},{},[79563,79564],{"type":23,"value":1609},{"type":17,"tag":133,"props":79565,"children":79566},{"href":79162},[79567],{"type":23,"value":1616},{"type":17,"tag":29,"props":79569,"children":79570},{},[79571,79572],{"type":23,"value":1609},{"type":17,"tag":133,"props":79573,"children":79575},{"href":1623,"rel":79574},[214],[79576],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":79578},[79579,79580,79581,79582,79583,79584,79585,79586,79587,79588,79589,79590,79591],{"id":78628,"depth":1629,"text":78631},{"id":78716,"depth":1629,"text":78719},{"id":78776,"depth":1629,"text":78779},{"id":78843,"depth":1629,"text":78846},{"id":78918,"depth":1629,"text":78921},{"id":78984,"depth":1629,"text":78987},{"id":79081,"depth":1629,"text":79084},{"id":79175,"depth":1629,"text":79178},{"id":79266,"depth":1629,"text":79269},{"id":79343,"depth":1629,"text":79346},{"id":79399,"depth":1629,"text":79402},{"id":79446,"depth":1629,"text":79449},{"id":1552,"depth":1629,"text":44411},"content:blog:top_benefits_of_unified_apis_for_saas_integrations.md","blog/top_benefits_of_unified_apis_for_saas_integrations.md","blog/top_benefits_of_unified_apis_for_saas_integrations",{"_path":79596,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":79597,"description":79598,"img":79599,"date":79600,"tag":12,"body":79601,"_type":1677,"_id":80999,"_source":1679,"_file":81000,"_stem":81001,"_extension":1682},"/blog/building_your_own_integration_vs_using_a_unified_api","Building your own integration vs using a Unified API","If you only need one or two shallow integrations, building in-house can make sense. If your product needs to support multiple customer systems, move quickly,...","https://s3.us-east-2.amazonaws.com/unified-article-images/building_your_own_integration_vs_using_a_unified_api-icon.png","2026-03-09T19:54:00.000Z",{"type":14,"children":79602,"toc":80958},[79603,79608,79611,79618,79629,79634,79639,79645,79650,79710,79746,79751,79757,79762,79767,79772,79803,79808,79814,79819,79825,79830,79834,79839,79845,79850,79855,79873,79879,79884,79889,79895,79900,79906,79911,79944,79949,79954,79960,79965,79970,79998,80003,80009,80014,80019,80024,80029,80035,80040,80073,80078,80084,80089,80095,80100,80104,80127,80132,80138,80143,80148,80153,80159,80164,80189,80194,80200,80205,80210,80215,80221,80226,80231,80263,80268,80291,80296,80301,80309,80315,80327,80332,80336,80341,80345,80367,80372,80376,80381,80386,80406,80411,80417,80422,80449,80454,80460,80465,80469,80492,80497,80503,80508,80535,80540,80546,80551,80755,80761,80766,80784,80789,80795,80800,80833,80838,80844,80849,80855,80860,80866,80871,80877,80882,80888,80893,80899,80904,80908,80913,80918,80923,80928,80940,80949],{"type":17,"tag":18,"props":79604,"children":79606},{"id":79605},"building-your-own-integration-vs-using-a-unified-api",[79607],{"type":23,"value":79597},{"type":17,"tag":25,"props":79609,"children":79610},{},[],{"type":17,"tag":29,"props":79612,"children":79613},{},[79614],{"type":17,"tag":33,"props":79615,"children":79616},{},[79617],{"type":23,"value":37},{"type":17,"tag":29,"props":79619,"children":79620},{},[79621,79623,79627],{"type":23,"value":79622},"If you only need one or two shallow integrations, building in-house can make sense. If your product needs to support multiple customer systems, move quickly, and avoid turning integrations into a permanent engineering tax, a ",{"type":17,"tag":133,"props":79624,"children":79625},{"href":7691},[79626],{"type":23,"value":7806},{"type":23,"value":79628}," is usually the better choice.",{"type":17,"tag":29,"props":79630,"children":79631},{},[79632],{"type":23,"value":79633},"The real tradeoff is not just control vs convenience. It is speed, maintenance, reliability, and how much of your roadmap gets consumed by third-party API work.",{"type":17,"tag":29,"props":79635,"children":79636},{},[79637],{"type":23,"value":79638},"This guide breaks down both approaches, where each makes sense, and why more B2B SaaS teams are moving to real-time Unified API infrastructure instead of building every integration themselves.",{"type":17,"tag":68,"props":79640,"children":79642},{"id":79641},"what-does-building-your-own-integration-actually-mean",[79643],{"type":23,"value":79644},"What does 'building your own integration' actually mean?",{"type":17,"tag":29,"props":79646,"children":79647},{},[79648],{"type":23,"value":79649},"Building an integration yourself means your team owns every layer of the integration stack:",{"type":17,"tag":80,"props":79651,"children":79652},{},[79653,79663,79668,79673,79678,79685,79690,79695,79700,79705],{"type":17,"tag":84,"props":79654,"children":79655},{},[79656,79658,79662],{"type":23,"value":79657},"authentication and ",{"type":17,"tag":133,"props":79659,"children":79660},{"href":779},[79661],{"type":23,"value":782},{"type":23,"value":784},{"type":17,"tag":84,"props":79664,"children":79665},{},[79666],{"type":23,"value":79667},"token storage and refresh logic",{"type":17,"tag":84,"props":79669,"children":79670},{},[79671],{"type":23,"value":79672},"rate-limit handling",{"type":17,"tag":84,"props":79674,"children":79675},{},[79676],{"type":23,"value":79677},"retries and backoff",{"type":17,"tag":84,"props":79679,"children":79680},{},[79681],{"type":17,"tag":133,"props":79682,"children":79683},{"href":1857},[79684],{"type":23,"value":1860},{"type":17,"tag":84,"props":79686,"children":79687},{},[79688],{"type":23,"value":79689},"data mapping",{"type":17,"tag":84,"props":79691,"children":79692},{},[79693],{"type":23,"value":79694},"webhook ingestion",{"type":17,"tag":84,"props":79696,"children":79697},{},[79698],{"type":23,"value":79699},"schema changes",{"type":17,"tag":84,"props":79701,"children":79702},{},[79703],{"type":23,"value":79704},"monitoring and debugging",{"type":17,"tag":84,"props":79706,"children":79707},{},[79708],{"type":23,"value":79709},"customer-specific edge cases",{"type":17,"tag":29,"props":79711,"children":79712},{},[79713,79715,79720,79721,79726,79727,79732,79733,79738,79739,79745],{"type":23,"value":79714},"That is true whether you are integrating with ",{"type":17,"tag":133,"props":79716,"children":79718},{"href":29657,"rel":79717},[214],[79719],{"type":23,"value":3184},{"type":23,"value":11826},{"type":17,"tag":133,"props":79722,"children":79724},{"href":76285,"rel":79723},[214],[79725],{"type":23,"value":3179},{"type":23,"value":11826},{"type":17,"tag":133,"props":79728,"children":79730},{"href":36483,"rel":79729},[214],[79731],{"type":23,"value":3199},{"type":23,"value":11826},{"type":17,"tag":133,"props":79734,"children":79736},{"href":55031,"rel":79735},[214],[79737],{"type":23,"value":59319},{"type":23,"value":27293},{"type":17,"tag":133,"props":79740,"children":79743},{"href":79741,"rel":79742},"https://api.slack.com/apis",[214],[79744],{"type":23,"value":3204},{"type":23,"value":54},{"type":17,"tag":29,"props":79747,"children":79748},{},[79749],{"type":23,"value":79750},"The first API call is usually the easy part. Production reliability is the hard part.",{"type":17,"tag":68,"props":79752,"children":79754},{"id":79753},"what-does-using-a-unified-api-mean",[79755],{"type":23,"value":79756},"What does using a Unified API mean?",{"type":17,"tag":29,"props":79758,"children":79759},{},[79760],{"type":23,"value":79761},"A Unified API gives you one normalized interface across many providers in the same category.",{"type":17,"tag":29,"props":79763,"children":79764},{},[79765],{"type":23,"value":79766},"Instead of building separate integrations for Salesforce, HubSpot, and Pipedrive, you integrate once with a CRM API. Instead of building separate integrations for Workday, BambooHR, and ADP, you integrate once with an HRIS API.",{"type":17,"tag":29,"props":79768,"children":79769},{},[79770],{"type":23,"value":79771},"With a strong Unified API platform, you also get:",{"type":17,"tag":80,"props":79773,"children":79774},{},[79775,79780,79784,79788,79793,79798],{"type":17,"tag":84,"props":79776,"children":79777},{},[79778],{"type":23,"value":79779},"normalized objects and endpoints",{"type":17,"tag":84,"props":79781,"children":79782},{},[79783],{"type":23,"value":45009},{"type":17,"tag":84,"props":79785,"children":79786},{},[79787],{"type":23,"value":40243},{"type":17,"tag":84,"props":79789,"children":79790},{},[79791],{"type":23,"value":79792},"provider maintenance",{"type":17,"tag":84,"props":79794,"children":79795},{},[79796],{"type":23,"value":79797},"observability",{"type":17,"tag":84,"props":79799,"children":79800},{},[79801],{"type":23,"value":79802},"support for new providers without rebuilding your product logic",{"type":17,"tag":29,"props":79804,"children":79805},{},[79806],{"type":23,"value":79807},"The best platforms go further and support real-time, read/write access instead of relying on cached sync jobs.",{"type":17,"tag":68,"props":79809,"children":79811},{"id":79810},"the-case-for-building-integrations-yourself",[79812],{"type":23,"value":79813},"The case for building integrations yourself",{"type":17,"tag":29,"props":79815,"children":79816},{},[79817],{"type":23,"value":79818},"There are still valid reasons to build in-house.",{"type":17,"tag":239,"props":79820,"children":79822},{"id":79821},"_1-you-need-a-very-specific-integration",[79823],{"type":23,"value":79824},"1. You need a very specific integration",{"type":17,"tag":29,"props":79826,"children":79827},{},[79828],{"type":23,"value":79829},"If your product depends on one provider and uses deep, proprietary endpoints that fall outside standard objects, building directly can make sense.",{"type":17,"tag":29,"props":79831,"children":79832},{},[79833],{"type":23,"value":19878},{"type":17,"tag":29,"props":79835,"children":79836},{},[79837],{"type":23,"value":79838},"A product built exclusively for Salesforce admins may need highly custom Salesforce behavior that a generic abstraction layer would not fully expose.",{"type":17,"tag":239,"props":79840,"children":79842},{"id":79841},"_2-integrations-are-your-core-product",[79843],{"type":23,"value":79844},"2. Integrations are your core product",{"type":17,"tag":29,"props":79846,"children":79847},{},[79848],{"type":23,"value":79849},"If your differentiation is the integration itself, owning the full stack may be worth it.",{"type":17,"tag":29,"props":79851,"children":79852},{},[79853],{"type":23,"value":79854},"This is more common when:",{"type":17,"tag":80,"props":79856,"children":79857},{},[79858,79863,79868],{"type":17,"tag":84,"props":79859,"children":79860},{},[79861],{"type":23,"value":79862},"you are building highly specialized middleware",{"type":17,"tag":84,"props":79864,"children":79865},{},[79866],{"type":23,"value":79867},"your customers use one dominant system",{"type":17,"tag":84,"props":79869,"children":79870},{},[79871],{"type":23,"value":79872},"the integration logic is a core moat, not a supporting feature",{"type":17,"tag":239,"props":79874,"children":79876},{"id":79875},"_3-you-only-need-one-or-two-integrations",[79877],{"type":23,"value":79878},"3. You only need one or two integrations",{"type":17,"tag":29,"props":79880,"children":79881},{},[79882],{"type":23,"value":79883},"If you need a small number of integrations, have strong internal API expertise, and are comfortable owning long-term maintenance, the economics can still work.",{"type":17,"tag":29,"props":79885,"children":79886},{},[79887],{"type":23,"value":79888},"But that only holds if the scope stays small.",{"type":17,"tag":68,"props":79890,"children":79892},{"id":79891},"the-hidden-cost-of-building-your-own-integrations",[79893],{"type":23,"value":79894},"The hidden cost of building your own integrations",{"type":17,"tag":29,"props":79896,"children":79897},{},[79898],{"type":23,"value":79899},"This is where most teams underestimate the work.",{"type":17,"tag":239,"props":79901,"children":79903},{"id":79902},"oauth-is-not-a-solved-problem-when-you-do-it-yourself",[79904],{"type":23,"value":79905},"OAuth is not a solved problem when you do it yourself",{"type":17,"tag":29,"props":79907,"children":79908},{},[79909],{"type":23,"value":79910},"Across SaaS APIs, OAuth is inconsistent. Providers differ on:",{"type":17,"tag":80,"props":79912,"children":79913},{},[79914,79919,79924,79929,79934,79939],{"type":17,"tag":84,"props":79915,"children":79916},{},[79917],{"type":23,"value":79918},"grant types",{"type":17,"tag":84,"props":79920,"children":79921},{},[79922],{"type":23,"value":79923},"scope formats",{"type":17,"tag":84,"props":79925,"children":79926},{},[79927],{"type":23,"value":79928},"redirect requirements",{"type":17,"tag":84,"props":79930,"children":79931},{},[79932],{"type":23,"value":79933},"refresh token behavior",{"type":17,"tag":84,"props":79935,"children":79936},{},[79937],{"type":23,"value":79938},"token lifetimes",{"type":17,"tag":84,"props":79940,"children":79941},{},[79942],{"type":23,"value":79943},"error responses",{"type":17,"tag":29,"props":79945,"children":79946},{},[79947],{"type":23,"value":79948},"Even after you get an integration working, you still need to manage refreshes, reauthorization, edge cases, and multi-tenant credential security.",{"type":17,"tag":29,"props":79950,"children":79951},{},[79952],{"type":23,"value":79953},"That is why teams often end up building an internal auth system before they have even shipped the actual feature.",{"type":17,"tag":239,"props":79955,"children":79957},{"id":79956},"every-provider-has-a-different-schema",[79958],{"type":23,"value":79959},"Every provider has a different schema",{"type":17,"tag":29,"props":79961,"children":79962},{},[79963],{"type":23,"value":79964},"A 'contact' is not the same across providers. A 'deal,' 'candidate,' 'employee,' or 'invoice' can vary even more.",{"type":17,"tag":29,"props":79966,"children":79967},{},[79968],{"type":23,"value":79969},"You end up writing and maintaining:",{"type":17,"tag":80,"props":79971,"children":79972},{},[79973,79978,79983,79988,79993],{"type":17,"tag":84,"props":79974,"children":79975},{},[79976],{"type":23,"value":79977},"field mappings",{"type":17,"tag":84,"props":79979,"children":79980},{},[79981],{"type":23,"value":79982},"transformation logic",{"type":17,"tag":84,"props":79984,"children":79985},{},[79986],{"type":23,"value":79987},"provider-specific conditions",{"type":17,"tag":84,"props":79989,"children":79990},{},[79991],{"type":23,"value":79992},"partial support for missing fields",{"type":17,"tag":84,"props":79994,"children":79995},{},[79996],{"type":23,"value":79997},"fallback behavior when a system does not support the object cleanly",{"type":17,"tag":29,"props":79999,"children":80000},{},[80001],{"type":23,"value":80002},"This compounds with every new integration.",{"type":17,"tag":239,"props":80004,"children":80006},{"id":80005},"maintenance-never-stops",[80007],{"type":23,"value":80008},"Maintenance never stops",{"type":17,"tag":29,"props":80010,"children":80011},{},[80012],{"type":23,"value":80013},"APIs change constantly.",{"type":17,"tag":29,"props":80015,"children":80016},{},[80017],{"type":23,"value":80018},"Endpoints get deprecated. OAuth flows change. Fields are renamed. Rate limits are tightened. Webhook payloads evolve.",{"type":17,"tag":29,"props":80020,"children":80021},{},[80022],{"type":23,"value":80023},"When you build in-house, every one of those changes becomes your problem.",{"type":17,"tag":29,"props":80025,"children":80026},{},[80027],{"type":23,"value":80028},"The result is that integrations start as roadmap items and end up as recurring operational work.",{"type":17,"tag":239,"props":80030,"children":80032},{"id":80031},"debugging-gets-expensive-fast",[80033],{"type":23,"value":80034},"Debugging gets expensive fast",{"type":17,"tag":29,"props":80036,"children":80037},{},[80038],{"type":23,"value":80039},"When something breaks, you need to answer:",{"type":17,"tag":80,"props":80041,"children":80042},{},[80043,80048,80053,80058,80063,80068],{"type":17,"tag":84,"props":80044,"children":80045},{},[80046],{"type":23,"value":80047},"is the token expired?",{"type":17,"tag":84,"props":80049,"children":80050},{},[80051],{"type":23,"value":80052},"did the provider change behavior?",{"type":17,"tag":84,"props":80054,"children":80055},{},[80056],{"type":23,"value":80057},"is this customer configured differently?",{"type":17,"tag":84,"props":80059,"children":80060},{},[80061],{"type":23,"value":80062},"did the webhook fail?",{"type":17,"tag":84,"props":80064,"children":80065},{},[80066],{"type":23,"value":80067},"is the schema mapping wrong?",{"type":17,"tag":84,"props":80069,"children":80070},{},[80071],{"type":23,"value":80072},"is the API temporarily rate-limiting us?",{"type":17,"tag":29,"props":80074,"children":80075},{},[80076],{"type":23,"value":80077},"Without strong integration observability, debugging can become slow and support-heavy.",{"type":17,"tag":68,"props":80079,"children":80081},{"id":80080},"the-case-for-using-a-unified-api",[80082],{"type":23,"value":80083},"The case for using a Unified API",{"type":17,"tag":29,"props":80085,"children":80086},{},[80087],{"type":23,"value":80088},"For most B2B SaaS teams, the biggest value of a Unified API is not just faster launch. It is reducing the amount of integration-specific infrastructure your team has to own forever.",{"type":17,"tag":239,"props":80090,"children":80092},{"id":80091},"_1-faster-time-to-market",[80093],{"type":23,"value":80094},"1. Faster time-to-market",{"type":17,"tag":29,"props":80096,"children":80097},{},[80098],{"type":23,"value":80099},"Instead of building provider by provider, you integrate once and unlock a category.",{"type":17,"tag":29,"props":80101,"children":80102},{},[80103],{"type":23,"value":5804},{"type":17,"tag":80,"props":80105,"children":80106},{},[80107,80112,80117,80122],{"type":17,"tag":84,"props":80108,"children":80109},{},[80110],{"type":23,"value":80111},"fewer weeks spent per integration",{"type":17,"tag":84,"props":80113,"children":80114},{},[80115],{"type":23,"value":80116},"less duplicate auth work",{"type":17,"tag":84,"props":80118,"children":80119},{},[80120],{"type":23,"value":80121},"less schema mapping",{"type":17,"tag":84,"props":80123,"children":80124},{},[80125],{"type":23,"value":80126},"faster delivery for enterprise deals",{"type":17,"tag":29,"props":80128,"children":80129},{},[80130],{"type":23,"value":80131},"This is especially important when customers ask for multiple systems across the same category.",{"type":17,"tag":239,"props":80133,"children":80135},{"id":80134},"_2-lower-maintenance-burden",[80136],{"type":23,"value":80137},"2. Lower maintenance burden",{"type":17,"tag":29,"props":80139,"children":80140},{},[80141],{"type":23,"value":80142},"A Unified API platform absorbs much of the provider-specific churn.",{"type":17,"tag":29,"props":80144,"children":80145},{},[80146],{"type":23,"value":80147},"Your team no longer has to keep rewriting the same integration logic whenever a vendor changes their API.",{"type":17,"tag":29,"props":80149,"children":80150},{},[80151],{"type":23,"value":80152},"That translates into less maintenance work and more time on your core product.",{"type":17,"tag":239,"props":80154,"children":80156},{"id":80155},"_3-consistent-developer-experience",[80157],{"type":23,"value":80158},"3. Consistent developer experience",{"type":17,"tag":29,"props":80160,"children":80161},{},[80162],{"type":23,"value":80163},"With a Unified API, developers work with:",{"type":17,"tag":80,"props":80165,"children":80166},{},[80167,80171,80175,80180,80185],{"type":17,"tag":84,"props":80168,"children":80169},{},[80170],{"type":23,"value":23902},{"type":17,"tag":84,"props":80172,"children":80173},{},[80174],{"type":23,"value":41586},{"type":17,"tag":84,"props":80176,"children":80177},{},[80178],{"type":23,"value":80179},"one documentation set",{"type":17,"tag":84,"props":80181,"children":80182},{},[80183],{"type":23,"value":80184},"one error model",{"type":17,"tag":84,"props":80186,"children":80187},{},[80188],{"type":23,"value":38806},{"type":17,"tag":29,"props":80190,"children":80191},{},[80192],{"type":23,"value":80193},"That reduces cognitive load and makes it much easier to scale integration support internally.",{"type":17,"tag":239,"props":80195,"children":80197},{"id":80196},"_4-better-product-scalability",[80198],{"type":23,"value":80199},"4. Better product scalability",{"type":17,"tag":29,"props":80201,"children":80202},{},[80203],{"type":23,"value":80204},"Direct integrations scale poorly because every new provider adds new complexity.",{"type":17,"tag":29,"props":80206,"children":80207},{},[80208],{"type":23,"value":80209},"Unified APIs scale better because your product logic stays consistent while the provider catalog grows underneath it.",{"type":17,"tag":29,"props":80211,"children":80212},{},[80213],{"type":23,"value":80214},"That matters if your customers use a fragmented stack and you want broad compatibility.",{"type":17,"tag":68,"props":80216,"children":80218},{"id":80217},"where-traditional-unified-apis-still-fall-short",[80219],{"type":23,"value":80220},"Where traditional Unified APIs still fall short",{"type":17,"tag":29,"props":80222,"children":80223},{},[80224],{"type":23,"value":80225},"Not all Unified APIs are equal.",{"type":17,"tag":29,"props":80227,"children":80228},{},[80229],{"type":23,"value":80230},"Older or first-generation Unified APIs often rely on:",{"type":17,"tag":80,"props":80232,"children":80233},{},[80234,80239,80243,80248,80253,80258],{"type":17,"tag":84,"props":80235,"children":80236},{},[80237],{"type":23,"value":80238},"batch syncs",{"type":17,"tag":84,"props":80240,"children":80241},{},[80242],{"type":23,"value":32803},{"type":17,"tag":84,"props":80244,"children":80245},{},[80246],{"type":23,"value":80247},"shallow common models",{"type":17,"tag":84,"props":80249,"children":80250},{},[80251],{"type":23,"value":80252},"limited write support",{"type":17,"tag":84,"props":80254,"children":80255},{},[80256],{"type":23,"value":80257},"weak support for custom fields",{"type":17,"tag":84,"props":80259,"children":80260},{},[80261],{"type":23,"value":80262},"limited real-time behavior",{"type":17,"tag":29,"props":80264,"children":80265},{},[80266],{"type":23,"value":80267},"That creates a new set of issues:",{"type":17,"tag":80,"props":80269,"children":80270},{},[80271,80276,80281,80286],{"type":17,"tag":84,"props":80272,"children":80273},{},[80274],{"type":23,"value":80275},"stale data",{"type":17,"tag":84,"props":80277,"children":80278},{},[80279],{"type":23,"value":80280},"delayed workflows",{"type":17,"tag":84,"props":80282,"children":80283},{},[80284],{"type":23,"value":80285},"brittle AI use cases",{"type":17,"tag":84,"props":80287,"children":80288},{},[80289],{"type":23,"value":80290},"gaps between normalized and provider-specific behavior",{"type":17,"tag":29,"props":80292,"children":80293},{},[80294],{"type":23,"value":80295},"So the real choice is not just 'build vs Unified API.'",{"type":17,"tag":29,"props":80297,"children":80298},{},[80299],{"type":23,"value":80300},"It is often:",{"type":17,"tag":29,"props":80302,"children":80303},{},[80304],{"type":17,"tag":48,"props":80305,"children":80306},{},[80307],{"type":23,"value":80308},"build it yourself vs use a modern, real-time Unified API architecture",{"type":17,"tag":68,"props":80310,"children":80312},{"id":80311},"why-unifiedto-changes-the-equation",[80313],{"type":23,"value":80314},"Why Unified.to changes the equation",{"type":17,"tag":29,"props":80316,"children":80317},{},[80318,80320,80325],{"type":23,"value":80319},"This is where ",{"type":17,"tag":133,"props":80321,"children":80323},{"href":212,"rel":80322},[214],[80324],{"type":23,"value":217},{"type":23,"value":80326}," stands apart.",{"type":17,"tag":29,"props":80328,"children":80329},{},[80330],{"type":23,"value":80331},"Unified is not just a convenience wrapper over many APIs. It is a real-time integration infrastructure layer designed for modern SaaS and AI products.",{"type":17,"tag":239,"props":80333,"children":80334},{"id":13402},[80335],{"type":23,"value":13405},{"type":17,"tag":29,"props":80337,"children":80338},{},[80339],{"type":23,"value":80340},"Every request hits the source API live.",{"type":17,"tag":29,"props":80342,"children":80343},{},[80344],{"type":23,"value":5804},{"type":17,"tag":80,"props":80346,"children":80347},{},[80348,80353,80357,80362],{"type":17,"tag":84,"props":80349,"children":80350},{},[80351],{"type":23,"value":80352},"no cached snapshots",{"type":17,"tag":84,"props":80354,"children":80355},{},[80356],{"type":23,"value":30123},{"type":17,"tag":84,"props":80358,"children":80359},{},[80360],{"type":23,"value":80361},"no stale data issues",{"type":17,"tag":84,"props":80363,"children":80364},{},[80365],{"type":23,"value":80366},"better fit for automation and AI agents",{"type":17,"tag":29,"props":80368,"children":80369},{},[80370],{"type":23,"value":80371},"For products that rely on current customer data, this is a major architectural advantage over sync-and-store models.",{"type":17,"tag":239,"props":80373,"children":80374},{"id":13413},[80375],{"type":23,"value":13416},{"type":17,"tag":29,"props":80377,"children":80378},{},[80379],{"type":23,"value":80380},"Unified does not store end-customer data.",{"type":17,"tag":29,"props":80382,"children":80383},{},[80384],{"type":23,"value":80385},"That reduces:",{"type":17,"tag":80,"props":80387,"children":80388},{},[80389,80393,80397,80402],{"type":17,"tag":84,"props":80390,"children":80391},{},[80392],{"type":23,"value":9406},{"type":17,"tag":84,"props":80394,"children":80395},{},[80396],{"type":23,"value":55509},{"type":17,"tag":84,"props":80398,"children":80399},{},[80400],{"type":23,"value":80401},"storage duplication",{"type":17,"tag":84,"props":80403,"children":80404},{},[80405],{"type":23,"value":68149},{"type":17,"tag":29,"props":80407,"children":80408},{},[80409],{"type":23,"value":80410},"For teams dealing with GDPR, SOC 2, HIPAA, CCPA, or PIPEDA concerns, this is a meaningful difference.",{"type":17,"tag":239,"props":80412,"children":80414},{"id":80413},"deep-normalization-not-just-surface-level-aggregation",[80415],{"type":23,"value":80416},"Deep normalization, not just surface-level aggregation",{"type":17,"tag":29,"props":80418,"children":80419},{},[80420],{"type":23,"value":80421},"Unified standardizes:",{"type":17,"tag":80,"props":80423,"children":80424},{},[80425,80430,80435,80440,80444],{"type":17,"tag":84,"props":80426,"children":80427},{},[80428],{"type":23,"value":80429},"objects",{"type":17,"tag":84,"props":80431,"children":80432},{},[80433],{"type":23,"value":80434},"endpoints",{"type":17,"tag":84,"props":80436,"children":80437},{},[80438],{"type":23,"value":80439},"permission scopes",{"type":17,"tag":84,"props":80441,"children":80442},{},[80443],{"type":23,"value":833},{"type":17,"tag":84,"props":80445,"children":80446},{},[80447],{"type":23,"value":80448},"authentication patterns",{"type":17,"tag":29,"props":80450,"children":80451},{},[80452],{"type":23,"value":80453},"And when you need provider-specific behavior, raw payload passthrough and metadata support help you go deeper without rebuilding everything.",{"type":17,"tag":239,"props":80455,"children":80457},{"id":80456},"read-and-write-support-across-categories",[80458],{"type":23,"value":80459},"Read and write support across categories",{"type":17,"tag":29,"props":80461,"children":80462},{},[80463],{"type":23,"value":80464},"Many integration use cases are not just about reading data.",{"type":17,"tag":29,"props":80466,"children":80467},{},[80468],{"type":23,"value":7477},{"type":17,"tag":80,"props":80470,"children":80471},{},[80472,80477,80482,80487],{"type":17,"tag":84,"props":80473,"children":80474},{},[80475],{"type":23,"value":80476},"create records",{"type":17,"tag":84,"props":80478,"children":80479},{},[80480],{"type":23,"value":80481},"update statuses",{"type":17,"tag":84,"props":80483,"children":80484},{},[80485],{"type":23,"value":80486},"trigger workflows",{"type":17,"tag":84,"props":80488,"children":80489},{},[80490],{"type":23,"value":80491},"push data back into customer systems",{"type":17,"tag":29,"props":80493,"children":80494},{},[80495],{"type":23,"value":80496},"Unified supports read and write across major categories, which makes it much more useful for real product workflows.",{"type":17,"tag":239,"props":80498,"children":80500},{"id":80499},"strong-fit-for-ai-products",[80501],{"type":23,"value":80502},"Strong fit for AI products",{"type":17,"tag":29,"props":80504,"children":80505},{},[80506],{"type":23,"value":80507},"If you are building AI copilots, agents, search, enrichment, analytics, or workflow automation, Unified is especially compelling because it combines:",{"type":17,"tag":80,"props":80509,"children":80510},{},[80511,80515,80520,80525,80530],{"type":17,"tag":84,"props":80512,"children":80513},{},[80514],{"type":23,"value":27657},{"type":17,"tag":84,"props":80516,"children":80517},{},[80518],{"type":23,"value":80519},"normalized schemas",{"type":17,"tag":84,"props":80521,"children":80522},{},[80523],{"type":23,"value":80524},"MCP support",{"type":17,"tag":84,"props":80526,"children":80527},{},[80528],{"type":23,"value":80529},"secure write actions",{"type":17,"tag":84,"props":80531,"children":80532},{},[80533],{"type":23,"value":80534},"no stale sync dependencies",{"type":17,"tag":29,"props":80536,"children":80537},{},[80538],{"type":23,"value":80539},"That is difficult to replicate cleanly with a mix of custom integrations and separate auth infrastructure.",{"type":17,"tag":68,"props":80541,"children":80543},{"id":80542},"head-to-head-building-yourself-vs-using-a-unified-api",[80544],{"type":23,"value":80545},"Head-to-head: building yourself vs using a Unified API",{"type":17,"tag":68,"props":80547,"children":80549},{"id":80548},"building-your-own-integration-vs-using-a-unified-api-1",[80550],{"type":23,"value":79597},{"type":17,"tag":7231,"props":80552,"children":80553},{},[80554,80574],{"type":17,"tag":7235,"props":80555,"children":80556},{},[80557],{"type":17,"tag":7239,"props":80558,"children":80559},{},[80560,80564,80569],{"type":17,"tag":7243,"props":80561,"children":80562},{},[80563],{"type":23,"value":7247},{"type":17,"tag":7243,"props":80565,"children":80566},{},[80567],{"type":23,"value":80568},"Build In-House",{"type":17,"tag":7243,"props":80570,"children":80571},{},[80572],{"type":23,"value":80573},"Use a Unified API",{"type":17,"tag":7259,"props":80575,"children":80576},{},[80577,80595,80613,80631,80648,80666,80684,80702,80719,80737],{"type":17,"tag":7239,"props":80578,"children":80579},{},[80580,80585,80590],{"type":17,"tag":7266,"props":80581,"children":80582},{},[80583],{"type":23,"value":80584},"Initial build time",{"type":17,"tag":7266,"props":80586,"children":80587},{},[80588],{"type":23,"value":80589},"Slow, provider-by-provider",{"type":17,"tag":7266,"props":80591,"children":80592},{},[80593],{"type":23,"value":80594},"Faster, integrate once per category",{"type":17,"tag":7239,"props":80596,"children":80597},{},[80598,80603,80608],{"type":17,"tag":7266,"props":80599,"children":80600},{},[80601],{"type":23,"value":80602},"OAuth and token lifecycle",{"type":17,"tag":7266,"props":80604,"children":80605},{},[80606],{"type":23,"value":80607},"You own it",{"type":17,"tag":7266,"props":80609,"children":80610},{},[80611],{"type":23,"value":80612},"Handled centrally",{"type":17,"tag":7239,"props":80614,"children":80615},{},[80616,80621,80626],{"type":17,"tag":7266,"props":80617,"children":80618},{},[80619],{"type":23,"value":80620},"Schema mapping",{"type":17,"tag":7266,"props":80622,"children":80623},{},[80624],{"type":23,"value":80625},"You write and maintain it",{"type":17,"tag":7266,"props":80627,"children":80628},{},[80629],{"type":23,"value":80630},"Normalized for you",{"type":17,"tag":7239,"props":80632,"children":80633},{},[80634,80638,80643],{"type":17,"tag":7266,"props":80635,"children":80636},{},[80637],{"type":23,"value":69449},{"type":17,"tag":7266,"props":80639,"children":80640},{},[80641],{"type":23,"value":80642},"Ongoing and cumulative",{"type":17,"tag":7266,"props":80644,"children":80645},{},[80646],{"type":23,"value":80647},"Reduced significantly",{"type":17,"tag":7239,"props":80649,"children":80650},{},[80651,80656,80661],{"type":17,"tag":7266,"props":80652,"children":80653},{},[80654],{"type":23,"value":80655},"Real-time access",{"type":17,"tag":7266,"props":80657,"children":80658},{},[80659],{"type":23,"value":80660},"Possible, but you build it",{"type":17,"tag":7266,"props":80662,"children":80663},{},[80664],{"type":23,"value":80665},"Platform-dependent",{"type":17,"tag":7239,"props":80667,"children":80668},{},[80669,80674,80679],{"type":17,"tag":7266,"props":80670,"children":80671},{},[80672],{"type":23,"value":80673},"Debugging",{"type":17,"tag":7266,"props":80675,"children":80676},{},[80677],{"type":23,"value":80678},"Fragmented across providers",{"type":17,"tag":7266,"props":80680,"children":80681},{},[80682],{"type":23,"value":80683},"Centralized",{"type":17,"tag":7239,"props":80685,"children":80686},{},[80687,80692,80697],{"type":17,"tag":7266,"props":80688,"children":80689},{},[80690],{"type":23,"value":80691},"Scaling to many integrations",{"type":17,"tag":7266,"props":80693,"children":80694},{},[80695],{"type":23,"value":80696},"Expensive",{"type":17,"tag":7266,"props":80698,"children":80699},{},[80700],{"type":23,"value":80701},"Much easier",{"type":17,"tag":7239,"props":80703,"children":80704},{},[80705,80709,80714],{"type":17,"tag":7266,"props":80706,"children":80707},{},[80708],{"type":23,"value":10067},{"type":17,"tag":7266,"props":80710,"children":80711},{},[80712],{"type":23,"value":80713},"Larger if you store/sync data",{"type":17,"tag":7266,"props":80715,"children":80716},{},[80717],{"type":23,"value":80718},"Smaller with zero-storage models",{"type":17,"tag":7239,"props":80720,"children":80721},{},[80722,80727,80732],{"type":17,"tag":7266,"props":80723,"children":80724},{},[80725],{"type":23,"value":80726},"Customization",{"type":17,"tag":7266,"props":80728,"children":80729},{},[80730],{"type":23,"value":80731},"Maximum control",{"type":17,"tag":7266,"props":80733,"children":80734},{},[80735],{"type":23,"value":80736},"Depends on platform depth",{"type":17,"tag":7239,"props":80738,"children":80739},{},[80740,80745,80750],{"type":17,"tag":7266,"props":80741,"children":80742},{},[80743],{"type":23,"value":80744},"Best fit",{"type":17,"tag":7266,"props":80746,"children":80747},{},[80748],{"type":23,"value":80749},"Few deep integrations",{"type":17,"tag":7266,"props":80751,"children":80752},{},[80753],{"type":23,"value":80754},"Broad, scalable integration support",{"type":17,"tag":68,"props":80756,"children":80758},{"id":80757},"when-should-you-still-build-in-house",[80759],{"type":23,"value":80760},"When should you still build in-house?",{"type":17,"tag":29,"props":80762,"children":80763},{},[80764],{"type":23,"value":80765},"Build in-house when all three are true:",{"type":17,"tag":6154,"props":80767,"children":80768},{},[80769,80774,80779],{"type":17,"tag":84,"props":80770,"children":80771},{},[80772],{"type":23,"value":80773},"You need only a few integrations",{"type":17,"tag":84,"props":80775,"children":80776},{},[80777],{"type":23,"value":80778},"Those integrations are unusually deep or custom",{"type":17,"tag":84,"props":80780,"children":80781},{},[80782],{"type":23,"value":80783},"You are willing to own the maintenance long-term",{"type":17,"tag":29,"props":80785,"children":80786},{},[80787],{"type":23,"value":80788},"If even one of those stops being true, the economics usually shift.",{"type":17,"tag":68,"props":80790,"children":80792},{"id":80791},"when-is-a-unified-api-the-better-choice",[80793],{"type":23,"value":80794},"When is a Unified API the better choice?",{"type":17,"tag":29,"props":80796,"children":80797},{},[80798],{"type":23,"value":80799},"Use a Unified API when:",{"type":17,"tag":80,"props":80801,"children":80802},{},[80803,80808,80813,80818,80823,80828],{"type":17,"tag":84,"props":80804,"children":80805},{},[80806],{"type":23,"value":80807},"integrations are important, but not your core moat",{"type":17,"tag":84,"props":80809,"children":80810},{},[80811],{"type":23,"value":80812},"your customers use many different systems",{"type":17,"tag":84,"props":80814,"children":80815},{},[80816],{"type":23,"value":80817},"you need to move fast",{"type":17,"tag":84,"props":80819,"children":80820},{},[80821],{"type":23,"value":80822},"your engineering team should stay focused on product differentiation",{"type":17,"tag":84,"props":80824,"children":80825},{},[80826],{"type":23,"value":80827},"you want predictable scaling across categories",{"type":17,"tag":84,"props":80829,"children":80830},{},[80831],{"type":23,"value":80832},"you care about real-time access and lower compliance overhead",{"type":17,"tag":29,"props":80834,"children":80835},{},[80836],{"type":23,"value":80837},"That is the reality for most B2B SaaS products.",{"type":17,"tag":68,"props":80839,"children":80841},{"id":80840},"the-practical-decision-framework",[80842],{"type":23,"value":80843},"The practical decision framework",{"type":17,"tag":29,"props":80845,"children":80846},{},[80847],{"type":23,"value":80848},"Ask these questions:",{"type":17,"tag":239,"props":80850,"children":80852},{"id":80851},"how-many-integrations-will-we-need-in-12-months",[80853],{"type":23,"value":80854},"How many integrations will we need in 12 months?",{"type":17,"tag":29,"props":80856,"children":80857},{},[80858],{"type":23,"value":80859},"If the answer is more than a handful, building one by one usually becomes a drag on product velocity.",{"type":17,"tag":239,"props":80861,"children":80863},{"id":80862},"are-integrations-a-supporting-feature-or-the-core-product",[80864],{"type":23,"value":80865},"Are integrations a supporting feature or the core product?",{"type":17,"tag":29,"props":80867,"children":80868},{},[80869],{"type":23,"value":80870},"If they support the product, do not let them consume the roadmap like they are the product.",{"type":17,"tag":239,"props":80872,"children":80874},{"id":80873},"do-we-need-real-time-reads-and-writes",[80875],{"type":23,"value":80876},"Do we need real-time reads and writes?",{"type":17,"tag":29,"props":80878,"children":80879},{},[80880],{"type":23,"value":80881},"If yes, avoid architectures built around slow sync jobs and cached snapshots.",{"type":17,"tag":239,"props":80883,"children":80885},{"id":80884},"how-much-engineering-time-are-we-willing-to-spend-on-maintenance",[80886],{"type":23,"value":80887},"How much engineering time are we willing to spend on maintenance?",{"type":17,"tag":29,"props":80889,"children":80890},{},[80891],{"type":23,"value":80892},"This is the question teams avoid, but it matters more than initial build time.",{"type":17,"tag":239,"props":80894,"children":80896},{"id":80895},"are-security-and-compliance-important",[80897],{"type":23,"value":80898},"Are security and compliance important?",{"type":17,"tag":29,"props":80900,"children":80901},{},[80902],{"type":23,"value":80903},"If yes, minimizing stored customer data and centralizing auth handling becomes much more valuable.",{"type":17,"tag":68,"props":80905,"children":80906},{"id":1552},[80907],{"type":23,"value":1555},{"type":17,"tag":29,"props":80909,"children":80910},{},[80911],{"type":23,"value":80912},"Building your own integrations gives you control. It also gives you every problem that comes with that control.",{"type":17,"tag":29,"props":80914,"children":80915},{},[80916],{"type":23,"value":80917},"For a very small number of highly specific integrations, that can still be the right tradeoff.",{"type":17,"tag":29,"props":80919,"children":80920},{},[80921],{"type":23,"value":80922},"But for most SaaS products, the better move is not to keep rebuilding integration infrastructure internally. It is to use a Unified API platform that lets your team launch faster, scale broader, and spend less time maintaining third-party API code.",{"type":17,"tag":29,"props":80924,"children":80925},{},[80926],{"type":23,"value":80927},"And if you are going to use a Unified API, the architecture matters.",{"type":17,"tag":29,"props":80929,"children":80930},{},[80931,80933,80938],{"type":23,"value":80932},"A modern, real-time platform like ",{"type":17,"tag":133,"props":80934,"children":80936},{"href":212,"rel":80935},[214],[80937],{"type":23,"value":217},{"type":23,"value":80939}," gives you the benefits of abstraction without forcing you into stale, sync-based integration models. That makes it a much stronger option for B2B SaaS teams building modern workflows, automation, and AI-powered products.",{"type":17,"tag":29,"props":80941,"children":80942},{},[80943,80944],{"type":23,"value":1609},{"type":17,"tag":133,"props":80945,"children":80947},{"href":1612,"rel":80946},[214],[80948],{"type":23,"value":1616},{"type":17,"tag":29,"props":80950,"children":80951},{},[80952,80953],{"type":23,"value":1609},{"type":17,"tag":133,"props":80954,"children":80956},{"href":80955},"/31e6207b8384801a917ad663b7f0d1f7",[80957],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":80959},[80960,80961,80962,80967,80973,80979,80980,80987,80988,80989,80990,80991,80998],{"id":79641,"depth":1629,"text":79644},{"id":79753,"depth":1629,"text":79756},{"id":79810,"depth":1629,"text":79813,"children":80963},[80964,80965,80966],{"id":79821,"depth":1635,"text":79824},{"id":79841,"depth":1635,"text":79844},{"id":79875,"depth":1635,"text":79878},{"id":79891,"depth":1629,"text":79894,"children":80968},[80969,80970,80971,80972],{"id":79902,"depth":1635,"text":79905},{"id":79956,"depth":1635,"text":79959},{"id":80005,"depth":1635,"text":80008},{"id":80031,"depth":1635,"text":80034},{"id":80080,"depth":1629,"text":80083,"children":80974},[80975,80976,80977,80978],{"id":80091,"depth":1635,"text":80094},{"id":80134,"depth":1635,"text":80137},{"id":80155,"depth":1635,"text":80158},{"id":80196,"depth":1635,"text":80199},{"id":80217,"depth":1629,"text":80220},{"id":80311,"depth":1629,"text":80314,"children":80981},[80982,80983,80984,80985,80986],{"id":13402,"depth":1635,"text":13405},{"id":13413,"depth":1635,"text":13416},{"id":80413,"depth":1635,"text":80416},{"id":80456,"depth":1635,"text":80459},{"id":80499,"depth":1635,"text":80502},{"id":80542,"depth":1629,"text":80545},{"id":80548,"depth":1629,"text":79597},{"id":80757,"depth":1629,"text":80760},{"id":80791,"depth":1629,"text":80794},{"id":80840,"depth":1629,"text":80843,"children":80992},[80993,80994,80995,80996,80997],{"id":80851,"depth":1635,"text":80854},{"id":80862,"depth":1635,"text":80865},{"id":80873,"depth":1635,"text":80876},{"id":80884,"depth":1635,"text":80887},{"id":80895,"depth":1635,"text":80898},{"id":1552,"depth":1629,"text":1555},"content:blog:building_your_own_integration_vs_using_a_unified_api.md","blog/building_your_own_integration_vs_using_a_unified_api.md","blog/building_your_own_integration_vs_using_a_unified_api",{"_path":81003,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":81004,"description":81005,"img":81006,"date":81007,"tag":12,"body":81008,"_type":1677,"_id":82376,"_source":1679,"_file":82377,"_stem":82378,"_extension":1682},"/blog/5_ways_to_build_in_app_integrations_in_2026","5 Ways to Build In-App Integrations in 2026","In-app integrations are usually built in one of five ways, native integrations built from scratch, embedded iPaaS platforms, unified APIs, API infrastructure...","https://s3.us-east-2.amazonaws.com/unified-article-images/5_ways_to_build_in_app_integrations_in_2026-icon.png","2026-03-09T19:53:00.000Z",{"type":14,"children":81009,"toc":82327},[81010,81015,81018,81025,81036,81041,81047,81052,81057,81094,81099,81105,81110,81178,81182,81188,81347,81353,81358,81363,81397,81402,81425,81430,81458,81463,81468,81486,81491,81497,81522,81527,81532,81555,81560,81588,81593,81598,81616,81621,81627,81632,81656,81661,81689,81694,81717,81722,81727,81745,81750,81756,81761,81766,81795,81814,81819,81842,81847,81870,81875,81880,81898,81903,81909,81914,81919,81932,81937,81942,81965,81970,81988,81993,81998,82016,82022,82028,82033,82039,82044,82050,82055,82061,82066,82072,82088,82093,82125,82130,82136,82142,82147,82153,82158,82164,82169,82175,82180,82186,82191,82197,82202,82239,82244,82262,82266,82304,82309,82318],{"type":17,"tag":18,"props":81011,"children":81013},{"id":81012},"_5-ways-to-build-in-app-integrations-in-2026",[81014],{"type":23,"value":81004},{"type":17,"tag":25,"props":81016,"children":81017},{},[],{"type":17,"tag":29,"props":81019,"children":81020},{},[81021],{"type":17,"tag":33,"props":81022,"children":81023},{},[81024],{"type":23,"value":37},{"type":17,"tag":29,"props":81026,"children":81027},{},[81028,81030,81034],{"type":23,"value":81029},"In-app integrations are usually built in one of five ways: native integrations built from scratch, embedded iPaaS platforms, unified APIs, API infrastructure platforms, or hybrid approaches that combine a ",{"type":17,"tag":133,"props":81031,"children":81032},{"href":7691},[81033],{"type":23,"value":7459},{"type":23,"value":81035}," with direct API access. The right choice depends on how many integrations you need, how deep they need to go, how quickly you need to ship, and how much maintenance your team can absorb.",{"type":17,"tag":29,"props":81037,"children":81038},{},[81039],{"type":23,"value":81040},"For most B2B SaaS teams, the real decision is not just build vs. buy. It is whether you want to own integration infrastructure forever, or use a platform that removes the repetitive parts without limiting what you can ship.",{"type":17,"tag":68,"props":81042,"children":81044},{"id":81043},"why-this-decision-matters",[81045],{"type":23,"value":81046},"Why this decision matters",{"type":17,"tag":29,"props":81048,"children":81049},{},[81050],{"type":23,"value":81051},"Most teams underestimate how much work sits behind a production-ready integration.",{"type":17,"tag":29,"props":81053,"children":81054},{},[81055],{"type":23,"value":81056},"The first read request is usually easy. The hard part comes later:",{"type":17,"tag":80,"props":81058,"children":81059},{},[81060,81065,81070,81079,81084,81089],{"type":17,"tag":84,"props":81061,"children":81062},{},[81063],{"type":23,"value":81064},"authorization flows across many integrations",{"type":17,"tag":84,"props":81066,"children":81067},{},[81068],{"type":23,"value":81069},"token refresh and credential lifecycle management",{"type":17,"tag":84,"props":81071,"children":81072},{},[81073,81075],{"type":23,"value":81074},"retries, backoff, and ",{"type":17,"tag":133,"props":81076,"children":81077},{"href":135},[81078],{"type":23,"value":138},{"type":17,"tag":84,"props":81080,"children":81081},{},[81082],{"type":23,"value":81083},"webhook delivery and fallback behavior",{"type":17,"tag":84,"props":81085,"children":81086},{},[81087],{"type":23,"value":81088},"schema differences across APIs",{"type":17,"tag":84,"props":81090,"children":81091},{},[81092],{"type":23,"value":81093},"monitoring, debugging, and ongoing maintenance",{"type":17,"tag":29,"props":81095,"children":81096},{},[81097],{"type":23,"value":81098},"That is why a proof of concept can take a day, while a production integration can take weeks.",{"type":17,"tag":68,"props":81100,"children":81102},{"id":81101},"what-should-you-evaluate-before-choosing-an-approach",[81103],{"type":23,"value":81104},"What should you evaluate before choosing an approach?",{"type":17,"tag":29,"props":81106,"children":81107},{},[81108],{"type":23,"value":81109},"Before choosing how to build in-app integrations, look at these factors:",{"type":17,"tag":80,"props":81111,"children":81112},{},[81113,81123,81133,81143,81158,81168],{"type":17,"tag":84,"props":81114,"children":81115},{},[81116,81121],{"type":17,"tag":48,"props":81117,"children":81118},{},[81119],{"type":23,"value":81120},"How many integrations do you need?",{"type":23,"value":81122}," Supporting 2 deep integrations is very different from supporting 40+ in one category.",{"type":17,"tag":84,"props":81124,"children":81125},{},[81126,81131],{"type":17,"tag":48,"props":81127,"children":81128},{},[81129],{"type":23,"value":81130},"How deep do they need to go?",{"type":23,"value":81132}," Reading contacts is easier than supporting custom objects, write actions, and real-time updates.",{"type":17,"tag":84,"props":81134,"children":81135},{},[81136,81141],{"type":17,"tag":48,"props":81137,"children":81138},{},[81139],{"type":23,"value":81140},"How real-time does the experience need to be?",{"type":23,"value":81142}," AI features, dashboards, and user-facing workflows usually break on stale or delayed data.",{"type":17,"tag":84,"props":81144,"children":81145},{},[81146,81151,81152,81156],{"type":17,"tag":48,"props":81147,"children":81148},{},[81149],{"type":23,"value":81150},"How much integration logic can your team maintain?",{"type":23,"value":18757},{"type":17,"tag":133,"props":81153,"children":81154},{"href":779},[81155],{"type":23,"value":782},{"type":23,"value":81157},", retries, webhook health, and schema mapping create long-term overhead.",{"type":17,"tag":84,"props":81159,"children":81160},{},[81161,81166],{"type":17,"tag":48,"props":81162,"children":81163},{},[81164],{"type":23,"value":81165},"How important is coverage across a category?",{"type":23,"value":81167}," If customers use Salesforce, HubSpot, Pipedrive, Zoho, and Microsoft Dynamics, building one by one is expensive.",{"type":17,"tag":84,"props":81169,"children":81170},{},[81171,81176],{"type":17,"tag":48,"props":81172,"children":81173},{},[81174],{"type":23,"value":81175},"How much flexibility do you need?",{"type":23,"value":81177}," Some approaches are faster to launch, while others give deeper control.",{"type":17,"tag":11616,"props":81179,"children":81181},{"width":11618,"height":11619,"src":81180,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/O_GnyNAnavk",[],{"type":17,"tag":68,"props":81183,"children":81185},{"id":81184},"the-5-main-ways-to-build-in-app-integrations",[81186],{"type":23,"value":81187},"The 5 main ways to build in-app integrations",{"type":17,"tag":7231,"props":81189,"children":81190},{},[81191,81220],{"type":17,"tag":7235,"props":81192,"children":81193},{},[81194],{"type":17,"tag":7239,"props":81195,"children":81196},{},[81197,81202,81206,81211,81216],{"type":17,"tag":7243,"props":81198,"children":81199},{},[81200],{"type":23,"value":81201},"Approach",{"type":17,"tag":7243,"props":81203,"children":81204},{},[81205],{"type":23,"value":502},{"type":17,"tag":7243,"props":81207,"children":81208},{},[81209],{"type":23,"value":81210},"Speed",{"type":17,"tag":7243,"props":81212,"children":81213},{},[81214],{"type":23,"value":81215},"Flexibility",{"type":17,"tag":7243,"props":81217,"children":81218},{},[81219],{"type":23,"value":55149},{"type":17,"tag":7259,"props":81221,"children":81222},{},[81223,81248,81273,81297,81322],{"type":17,"tag":7239,"props":81224,"children":81225},{},[81226,81231,81236,81240,81244],{"type":17,"tag":7266,"props":81227,"children":81228},{},[81229],{"type":23,"value":81230},"Build from scratch",{"type":17,"tag":7266,"props":81232,"children":81233},{},[81234],{"type":23,"value":81235},"A few very deep integrations",{"type":17,"tag":7266,"props":81237,"children":81238},{},[81239],{"type":23,"value":69459},{"type":17,"tag":7266,"props":81241,"children":81242},{},[81243],{"type":23,"value":69476},{"type":17,"tag":7266,"props":81245,"children":81246},{},[81247],{"type":23,"value":69476},{"type":17,"tag":7239,"props":81249,"children":81250},{},[81251,81256,81261,81265,81269],{"type":17,"tag":7266,"props":81252,"children":81253},{},[81254],{"type":23,"value":81255},"Embedded iPaaS",{"type":17,"tag":7266,"props":81257,"children":81258},{},[81259],{"type":23,"value":81260},"Customer-configurable integrations and workflow-style use cases",{"type":17,"tag":7266,"props":81262,"children":81263},{},[81264],{"type":23,"value":69481},{"type":17,"tag":7266,"props":81266,"children":81267},{},[81268],{"type":23,"value":69481},{"type":17,"tag":7266,"props":81270,"children":81271},{},[81272],{"type":23,"value":69481},{"type":17,"tag":7239,"props":81274,"children":81275},{},[81276,81280,81285,81289,81293],{"type":17,"tag":7266,"props":81277,"children":81278},{},[81279],{"type":23,"value":78607},{"type":17,"tag":7266,"props":81281,"children":81282},{},[81283],{"type":23,"value":81284},"Category-wide coverage with normalized objects",{"type":17,"tag":7266,"props":81286,"children":81287},{},[81288],{"type":23,"value":69476},{"type":17,"tag":7266,"props":81290,"children":81291},{},[81292],{"type":23,"value":69481},{"type":17,"tag":7266,"props":81294,"children":81295},{},[81296],{"type":23,"value":69459},{"type":17,"tag":7239,"props":81298,"children":81299},{},[81300,81305,81310,81314,81318],{"type":17,"tag":7266,"props":81301,"children":81302},{},[81303],{"type":23,"value":81304},"API infrastructure platforms",{"type":17,"tag":7266,"props":81306,"children":81307},{},[81308],{"type":23,"value":81309},"Teams that want full API access without building auth and sync plumbing",{"type":17,"tag":7266,"props":81311,"children":81312},{},[81313],{"type":23,"value":69481},{"type":17,"tag":7266,"props":81315,"children":81316},{},[81317],{"type":23,"value":69476},{"type":17,"tag":7266,"props":81319,"children":81320},{},[81321],{"type":23,"value":69481},{"type":17,"tag":7239,"props":81323,"children":81324},{},[81325,81330,81335,81339,81343],{"type":17,"tag":7266,"props":81326,"children":81327},{},[81328],{"type":23,"value":81329},"Hybrid model",{"type":17,"tag":7266,"props":81331,"children":81332},{},[81333],{"type":23,"value":81334},"Teams that need category coverage plus edge-case flexibility",{"type":17,"tag":7266,"props":81336,"children":81337},{},[81338],{"type":23,"value":69476},{"type":17,"tag":7266,"props":81340,"children":81341},{},[81342],{"type":23,"value":69476},{"type":17,"tag":7266,"props":81344,"children":81345},{},[81346],{"type":23,"value":69481},{"type":17,"tag":68,"props":81348,"children":81350},{"id":81349},"_1-build-integrations-from-scratch",[81351],{"type":23,"value":81352},"1. Build integrations from scratch",{"type":17,"tag":29,"props":81354,"children":81355},{},[81356],{"type":23,"value":81357},"This means your team builds directly against each third-party API in your own codebase.",{"type":17,"tag":29,"props":81359,"children":81360},{},[81361],{"type":23,"value":81362},"You handle:",{"type":17,"tag":80,"props":81364,"children":81365},{},[81366,81371,81375,81379,81383,81388,81392],{"type":17,"tag":84,"props":81367,"children":81368},{},[81369],{"type":23,"value":81370},"authorization",{"type":17,"tag":84,"props":81372,"children":81373},{},[81374],{"type":23,"value":77690},{"type":17,"tag":84,"props":81376,"children":81377},{},[81378],{"type":23,"value":79677},{"type":17,"tag":84,"props":81380,"children":81381},{},[81382],{"type":23,"value":138},{"type":17,"tag":84,"props":81384,"children":81385},{},[81386],{"type":23,"value":81387},"schema mapping",{"type":17,"tag":84,"props":81389,"children":81390},{},[81391],{"type":23,"value":79694},{"type":17,"tag":84,"props":81393,"children":81394},{},[81395],{"type":23,"value":81396},"logging and alerts",{"type":17,"tag":239,"props":81398,"children":81400},{"id":81399},"pros",[81401],{"type":23,"value":68924},{"type":17,"tag":80,"props":81403,"children":81404},{},[81405,81410,81415,81420],{"type":17,"tag":84,"props":81406,"children":81407},{},[81408],{"type":23,"value":81409},"Full control over the integration behavior",{"type":17,"tag":84,"props":81411,"children":81412},{},[81413],{"type":23,"value":81414},"Tight alignment with your product logic",{"type":17,"tag":84,"props":81416,"children":81417},{},[81418],{"type":23,"value":81419},"Best fit for highly specialized integrations",{"type":17,"tag":84,"props":81421,"children":81422},{},[81423],{"type":23,"value":81424},"No dependency on a third-party integration vendor",{"type":17,"tag":239,"props":81426,"children":81428},{"id":81427},"cons",[81429],{"type":23,"value":68950},{"type":17,"tag":80,"props":81431,"children":81432},{},[81433,81438,81443,81448,81453],{"type":17,"tag":84,"props":81434,"children":81435},{},[81436],{"type":23,"value":81437},"Slowest path to production",{"type":17,"tag":84,"props":81439,"children":81440},{},[81441],{"type":23,"value":81442},"Highest maintenance burden",{"type":17,"tag":84,"props":81444,"children":81445},{},[81446],{"type":23,"value":81447},"Every new integration starts from zero",{"type":17,"tag":84,"props":81449,"children":81450},{},[81451],{"type":23,"value":81452},"Each API behaves differently, so complexity compounds quickly",{"type":17,"tag":84,"props":81454,"children":81455},{},[81456],{"type":23,"value":81457},"Hard to scale when customers ask for many integrations in the same category",{"type":17,"tag":239,"props":81459,"children":81461},{"id":81460},"best-fit",[81462],{"type":23,"value":80744},{"type":17,"tag":29,"props":81464,"children":81465},{},[81466],{"type":23,"value":81467},"Build from scratch makes sense when:",{"type":17,"tag":80,"props":81469,"children":81470},{},[81471,81476,81481],{"type":17,"tag":84,"props":81472,"children":81473},{},[81474],{"type":23,"value":81475},"you only need a small number of integrations",{"type":17,"tag":84,"props":81477,"children":81478},{},[81479],{"type":23,"value":81480},"those integrations are central to your product differentiation",{"type":17,"tag":84,"props":81482,"children":81483},{},[81484],{"type":23,"value":81485},"your team is comfortable owning the full lifecycle long-term",{"type":17,"tag":29,"props":81487,"children":81488},{},[81489],{"type":23,"value":81490},"If you need Salesforce, HubSpot, Microsoft Dynamics, and Pipedrive support in the same quarter, this approach usually becomes a bottleneck.",{"type":17,"tag":68,"props":81492,"children":81494},{"id":81493},"_2-use-an-embedded-ipaas",[81495],{"type":23,"value":81496},"2. Use an embedded iPaaS",{"type":17,"tag":29,"props":81498,"children":81499},{},[81500,81502,81507,81508,81515,81516,81521],{"type":23,"value":81501},"Embedded iPaaS platforms let you add customer-facing integrations through an embedded builder or integration layer inside your product. Examples include ",{"type":17,"tag":133,"props":81503,"children":81505},{"href":69013,"rel":81504},[214],[81506],{"type":23,"value":581},{"type":23,"value":11826},{"type":17,"tag":133,"props":81509,"children":81512},{"href":81510,"rel":81511},"https://tray.ai/embedded",[214],[81513],{"type":23,"value":81514},"Tray Embedded",{"type":23,"value":12561},{"type":17,"tag":133,"props":81517,"children":81519},{"href":587,"rel":81518},[214],[81520],{"type":23,"value":591},{"type":23,"value":54},{"type":17,"tag":29,"props":81523,"children":81524},{},[81525],{"type":23,"value":81526},"These platforms are often used when customers want some control over how data is routed or when the integration experience is closer to configuration than application logic.",{"type":17,"tag":239,"props":81528,"children":81530},{"id":81529},"pros-1",[81531],{"type":23,"value":68924},{"type":17,"tag":80,"props":81533,"children":81534},{},[81535,81540,81545,81550],{"type":17,"tag":84,"props":81536,"children":81537},{},[81538],{"type":23,"value":81539},"Faster to launch than building everything internally",{"type":17,"tag":84,"props":81541,"children":81542},{},[81543],{"type":23,"value":81544},"Useful for customer-configurable integrations",{"type":17,"tag":84,"props":81546,"children":81547},{},[81548],{"type":23,"value":81549},"Can support workflow-style setups without writing everything from scratch",{"type":17,"tag":84,"props":81551,"children":81552},{},[81553],{"type":23,"value":81554},"Often includes embedded authorization and connection management",{"type":17,"tag":239,"props":81556,"children":81558},{"id":81557},"cons-1",[81559],{"type":23,"value":68950},{"type":17,"tag":80,"props":81561,"children":81562},{},[81563,81568,81573,81578,81583],{"type":17,"tag":84,"props":81564,"children":81565},{},[81566],{"type":23,"value":81567},"Many implementations still require engineering support",{"type":17,"tag":84,"props":81569,"children":81570},{},[81571],{"type":23,"value":81572},"Visual builders are often weaker for code-heavy product teams",{"type":17,"tag":84,"props":81574,"children":81575},{},[81576],{"type":23,"value":81577},"Coverage and depth vary significantly by integration",{"type":17,"tag":84,"props":81579,"children":81580},{},[81581],{"type":23,"value":81582},"Complex, real-time, product-grade experiences can become difficult to maintain",{"type":17,"tag":84,"props":81584,"children":81585},{},[81586],{"type":23,"value":81587},"You may still need direct integrations for advanced use cases",{"type":17,"tag":239,"props":81589,"children":81591},{"id":81590},"best-fit-1",[81592],{"type":23,"value":80744},{"type":17,"tag":29,"props":81594,"children":81595},{},[81596],{"type":23,"value":81597},"Embedded iPaaS works best when:",{"type":17,"tag":80,"props":81599,"children":81600},{},[81601,81606,81611],{"type":17,"tag":84,"props":81602,"children":81603},{},[81604],{"type":23,"value":81605},"your customers need configurable integrations",{"type":17,"tag":84,"props":81607,"children":81608},{},[81609],{"type":23,"value":81610},"the use case is more workflow-oriented",{"type":17,"tag":84,"props":81612,"children":81613},{},[81614],{"type":23,"value":81615},"you want faster delivery but are comfortable with some abstraction tradeoffs",{"type":17,"tag":29,"props":81617,"children":81618},{},[81619],{"type":23,"value":81620},"For deep, real-time product integrations, embedded iPaaS can become restrictive.",{"type":17,"tag":68,"props":81622,"children":81624},{"id":81623},"_3-use-a-unified-api",[81625],{"type":23,"value":81626},"3. Use a unified API",{"type":17,"tag":29,"props":81628,"children":81629},{},[81630],{"type":23,"value":81631},"Unified APIs standardize access to many integrations within the same category. Instead of building separately for Salesforce, HubSpot, and Pipedrive, you build once to a CRM API. Instead of building separately for Workday, BambooHR, and ADP, you build once to an HRIS API.",{"type":17,"tag":29,"props":81633,"children":81634},{},[81635,81637,81643,81644,81649,81650,81655],{"type":23,"value":81636},"Examples in the market include ",{"type":17,"tag":133,"props":81638,"children":81641},{"href":81639,"rel":81640},"https://www.merge.dev/",[214],[81642],{"type":23,"value":227},{"type":23,"value":11826},{"type":17,"tag":133,"props":81645,"children":81647},{"href":69130,"rel":81646},[214],[81648],{"type":23,"value":237},{"type":23,"value":12561},{"type":17,"tag":133,"props":81651,"children":81653},{"href":212,"rel":81652},[214],[81654],{"type":23,"value":217},{"type":23,"value":54},{"type":17,"tag":239,"props":81657,"children":81659},{"id":81658},"pros-2",[81660],{"type":23,"value":68924},{"type":17,"tag":80,"props":81662,"children":81663},{},[81664,81669,81674,81679,81684],{"type":17,"tag":84,"props":81665,"children":81666},{},[81667],{"type":23,"value":81668},"Fastest way to support many integrations in the same category",{"type":17,"tag":84,"props":81670,"children":81671},{},[81672],{"type":23,"value":81673},"One category-scoped API instead of many direct integrations",{"type":17,"tag":84,"props":81675,"children":81676},{},[81677],{"type":23,"value":81678},"Normalized objects reduce per-integration logic",{"type":17,"tag":84,"props":81680,"children":81681},{},[81682],{"type":23,"value":81683},"Lower maintenance than building one by one",{"type":17,"tag":84,"props":81685,"children":81686},{},[81687],{"type":23,"value":81688},"Strong fit for SaaS teams that need broad customer coverage",{"type":17,"tag":239,"props":81690,"children":81692},{"id":81691},"cons-2",[81693],{"type":23,"value":68950},{"type":17,"tag":80,"props":81695,"children":81696},{},[81697,81702,81707,81712],{"type":17,"tag":84,"props":81698,"children":81699},{},[81700],{"type":23,"value":81701},"Some unified APIs only support the lowest common denominator",{"type":17,"tag":84,"props":81703,"children":81704},{},[81705],{"type":23,"value":81706},"Coverage depth can vary by vendor",{"type":17,"tag":84,"props":81708,"children":81709},{},[81710],{"type":23,"value":81711},"Advanced use cases may still require passthrough access or direct API calls",{"type":17,"tag":84,"props":81713,"children":81714},{},[81715],{"type":23,"value":81716},"Stored-data architectures can introduce stale data and compliance overhead",{"type":17,"tag":239,"props":81718,"children":81720},{"id":81719},"best-fit-2",[81721],{"type":23,"value":80744},{"type":17,"tag":29,"props":81723,"children":81724},{},[81725],{"type":23,"value":81726},"Unified APIs are best when:",{"type":17,"tag":80,"props":81728,"children":81729},{},[81730,81735,81740],{"type":17,"tag":84,"props":81731,"children":81732},{},[81733],{"type":23,"value":81734},"you need many integrations in a category",{"type":17,"tag":84,"props":81736,"children":81737},{},[81738],{"type":23,"value":81739},"broad coverage matters more than owning every edge case",{"type":17,"tag":84,"props":81741,"children":81742},{},[81743],{"type":23,"value":81744},"you want to launch faster without building a large integration team",{"type":17,"tag":29,"props":81746,"children":81747},{},[81748],{"type":23,"value":81749},"This is often the best fit for B2B SaaS products that need CRM, ATS, HRIS, accounting, file storage, or ticketing integrations at scale.",{"type":17,"tag":68,"props":81751,"children":81753},{"id":81752},"_4-use-an-api-infrastructure-platform",[81754],{"type":23,"value":81755},"4. Use an API infrastructure platform",{"type":17,"tag":29,"props":81757,"children":81758},{},[81759],{"type":23,"value":81760},"This approach sits between native development and unified APIs.",{"type":17,"tag":29,"props":81762,"children":81763},{},[81764],{"type":23,"value":81765},"Instead of getting pre-normalized category models, you get infrastructure for the hard parts:",{"type":17,"tag":80,"props":81767,"children":81768},{},[81769,81773,81778,81783,81787,81791],{"type":17,"tag":84,"props":81770,"children":81771},{},[81772],{"type":23,"value":81370},{"type":17,"tag":84,"props":81774,"children":81775},{},[81776],{"type":23,"value":81777},"token lifecycle management",{"type":17,"tag":84,"props":81779,"children":81780},{},[81781],{"type":23,"value":81782},"request execution",{"type":17,"tag":84,"props":81784,"children":81785},{},[81786],{"type":23,"value":36948},{"type":17,"tag":84,"props":81788,"children":81789},{},[81790],{"type":23,"value":41533},{"type":17,"tag":84,"props":81792,"children":81793},{},[81794],{"type":23,"value":40243},{"type":17,"tag":29,"props":81796,"children":81797},{},[81798,81800,81805,81806,81813],{"type":23,"value":81799},"Examples include ",{"type":17,"tag":133,"props":81801,"children":81803},{"href":1021,"rel":81802},[214],[81804],{"type":23,"value":1025},{"type":23,"value":34435},{"type":17,"tag":133,"props":81807,"children":81810},{"href":81808,"rel":81809},"https://pizzly.io/",[214],[81811],{"type":23,"value":81812},"Pizzly",{"type":23,"value":54},{"type":17,"tag":239,"props":81815,"children":81817},{"id":81816},"pros-3",[81818],{"type":23,"value":68924},{"type":17,"tag":80,"props":81820,"children":81821},{},[81822,81827,81832,81837],{"type":17,"tag":84,"props":81823,"children":81824},{},[81825],{"type":23,"value":81826},"More flexibility than a fixed unified model",{"type":17,"tag":84,"props":81828,"children":81829},{},[81830],{"type":23,"value":81831},"You keep direct access to the source API",{"type":17,"tag":84,"props":81833,"children":81834},{},[81835],{"type":23,"value":81836},"Less infrastructure to build internally",{"type":17,"tag":84,"props":81838,"children":81839},{},[81840],{"type":23,"value":81841},"Strong fit for deep integrations with a limited number of APIs",{"type":17,"tag":239,"props":81843,"children":81845},{"id":81844},"cons-3",[81846],{"type":23,"value":68950},{"type":17,"tag":80,"props":81848,"children":81849},{},[81850,81855,81860,81865],{"type":17,"tag":84,"props":81851,"children":81852},{},[81853],{"type":23,"value":81854},"You still need to understand each external API",{"type":17,"tag":84,"props":81856,"children":81857},{},[81858],{"type":23,"value":81859},"You still build integrations one by one",{"type":17,"tag":84,"props":81861,"children":81862},{},[81863],{"type":23,"value":81864},"No category-wide normalization out of the box",{"type":17,"tag":84,"props":81866,"children":81867},{},[81868],{"type":23,"value":81869},"Maintenance is lower than scratch, but still significant as coverage expands",{"type":17,"tag":239,"props":81871,"children":81873},{"id":81872},"best-fit-3",[81874],{"type":23,"value":80744},{"type":17,"tag":29,"props":81876,"children":81877},{},[81878],{"type":23,"value":81879},"API infrastructure platforms work well when:",{"type":17,"tag":80,"props":81881,"children":81882},{},[81883,81888,81893],{"type":17,"tag":84,"props":81884,"children":81885},{},[81886],{"type":23,"value":81887},"you need full API flexibility",{"type":17,"tag":84,"props":81889,"children":81890},{},[81891],{"type":23,"value":81892},"you have a technical team that wants code-first control",{"type":17,"tag":84,"props":81894,"children":81895},{},[81896],{"type":23,"value":81897},"you want to avoid building auth and retry infrastructure internally",{"type":17,"tag":29,"props":81899,"children":81900},{},[81901],{"type":23,"value":81902},"This model is useful for deep integrations, but less efficient when you need very broad support across a category.",{"type":17,"tag":68,"props":81904,"children":81906},{"id":81905},"_5-use-a-hybrid-model",[81907],{"type":23,"value":81908},"5. Use a hybrid model",{"type":17,"tag":29,"props":81910,"children":81911},{},[81912],{"type":23,"value":81913},"This is increasingly the most practical approach.",{"type":17,"tag":29,"props":81915,"children":81916},{},[81917],{"type":23,"value":81918},"A hybrid model means:",{"type":17,"tag":80,"props":81920,"children":81921},{},[81922,81927],{"type":17,"tag":84,"props":81923,"children":81924},{},[81925],{"type":23,"value":81926},"use a unified API for the common objects and most of the category",{"type":17,"tag":84,"props":81928,"children":81929},{},[81930],{"type":23,"value":81931},"use passthrough access or direct API calls for vendor-specific edge cases",{"type":17,"tag":29,"props":81933,"children":81934},{},[81935],{"type":23,"value":81936},"This gives you the speed benefits of normalization without forcing every use case into the same abstraction.",{"type":17,"tag":239,"props":81938,"children":81940},{"id":81939},"pros-4",[81941],{"type":23,"value":68924},{"type":17,"tag":80,"props":81943,"children":81944},{},[81945,81950,81955,81960],{"type":17,"tag":84,"props":81946,"children":81947},{},[81948],{"type":23,"value":81949},"Faster launch across a category",{"type":17,"tag":84,"props":81951,"children":81952},{},[81953],{"type":23,"value":81954},"More flexibility for complex product requirements",{"type":17,"tag":84,"props":81956,"children":81957},{},[81958],{"type":23,"value":81959},"Lower maintenance than building everything directly",{"type":17,"tag":84,"props":81961,"children":81962},{},[81963],{"type":23,"value":81964},"Better long-term fit for teams that need both breadth and depth",{"type":17,"tag":239,"props":81966,"children":81968},{"id":81967},"cons-4",[81969],{"type":23,"value":68950},{"type":17,"tag":80,"props":81971,"children":81972},{},[81973,81978,81983],{"type":17,"tag":84,"props":81974,"children":81975},{},[81976],{"type":23,"value":81977},"Requires choosing a platform that supports both normalized models and direct API access",{"type":17,"tag":84,"props":81979,"children":81980},{},[81981],{"type":23,"value":81982},"Architecture still needs discipline",{"type":17,"tag":84,"props":81984,"children":81985},{},[81986],{"type":23,"value":81987},"Not every vendor in the market supports this well",{"type":17,"tag":239,"props":81989,"children":81991},{"id":81990},"best-fit-4",[81992],{"type":23,"value":80744},{"type":17,"tag":29,"props":81994,"children":81995},{},[81996],{"type":23,"value":81997},"Hybrid is best when:",{"type":17,"tag":80,"props":81999,"children":82000},{},[82001,82006,82011],{"type":17,"tag":84,"props":82002,"children":82003},{},[82004],{"type":23,"value":82005},"you need broad support across a category",{"type":17,"tag":84,"props":82007,"children":82008},{},[82009],{"type":23,"value":82010},"you also need custom fields, custom objects, or vendor-specific endpoints",{"type":17,"tag":84,"props":82012,"children":82013},{},[82014],{"type":23,"value":82015},"you want to move fast without giving up technical flexibility",{"type":17,"tag":68,"props":82017,"children":82019},{"id":82018},"which-approach-is-best-for-which-type-of-company",[82020],{"type":23,"value":82021},"Which approach is best for which type of company?",{"type":17,"tag":239,"props":82023,"children":82025},{"id":82024},"if-you-are-an-early-stage-saas-company-with-23-key-integrations",[82026],{"type":23,"value":82027},"If you are an early-stage SaaS company with 2–3 key integrations",{"type":17,"tag":29,"props":82029,"children":82030},{},[82031],{"type":23,"value":82032},"Building from scratch or using an API infrastructure platform can make sense, especially if those integrations are deep and central to your product.",{"type":17,"tag":239,"props":82034,"children":82036},{"id":82035},"if-you-are-a-growing-b2b-saas-company-with-many-customer-integration-requests",[82037],{"type":23,"value":82038},"If you are a growing B2B SaaS company with many customer integration requests",{"type":17,"tag":29,"props":82040,"children":82041},{},[82042],{"type":23,"value":82043},"A unified API or hybrid model is usually the strongest option. This reduces integration backlog and gets category coverage live much faster.",{"type":17,"tag":239,"props":82045,"children":82047},{"id":82046},"if-your-product-includes-customer-configurable-automation",[82048],{"type":23,"value":82049},"If your product includes customer-configurable automation",{"type":17,"tag":29,"props":82051,"children":82052},{},[82053],{"type":23,"value":82054},"An embedded iPaaS may fit, especially if customers need to define mapping logic or conditional steps themselves.",{"type":17,"tag":239,"props":82056,"children":82058},{"id":82057},"if-you-need-category-breadth-and-real-time-product-behavior",[82059],{"type":23,"value":82060},"If you need category breadth and real-time product behavior",{"type":17,"tag":29,"props":82062,"children":82063},{},[82064],{"type":23,"value":82065},"A real-time unified API with passthrough support is usually the strongest architectural choice.",{"type":17,"tag":68,"props":82067,"children":82069},{"id":82068},"how-unifiedto-fits-into-this-landscape",[82070],{"type":23,"value":82071},"How Unified.to fits into this landscape",{"type":17,"tag":29,"props":82073,"children":82074},{},[82075,82080,82082,82087],{"type":17,"tag":133,"props":82076,"children":82078},{"href":212,"rel":82077},[214],[82079],{"type":23,"value":217},{"type":23,"value":82081}," is best understood as a ",{"type":17,"tag":48,"props":82083,"children":82084},{},[82085],{"type":23,"value":82086},"real-time unified API platform with integration infrastructure built in",{"type":23,"value":54},{"type":17,"tag":29,"props":82089,"children":82090},{},[82091],{"type":23,"value":82092},"That matters because most teams do not just need normalized objects. They also need:",{"type":17,"tag":80,"props":82094,"children":82095},{},[82096,82101,82106,82111,82116,82120],{"type":17,"tag":84,"props":82097,"children":82098},{},[82099],{"type":23,"value":82100},"authorization across hundreds of integrations",{"type":17,"tag":84,"props":82102,"children":82103},{},[82104],{"type":23,"value":82105},"token refresh handling",{"type":17,"tag":84,"props":82107,"children":82108},{},[82109],{"type":23,"value":82110},"native and virtual webhooks",{"type":17,"tag":84,"props":82112,"children":82113},{},[82114],{"type":23,"value":82115},"connection health tracking",{"type":17,"tag":84,"props":82117,"children":82118},{},[82119],{"type":23,"value":79797},{"type":17,"tag":84,"props":82121,"children":82122},{},[82123],{"type":23,"value":82124},"passthrough access for edge cases",{"type":17,"tag":29,"props":82126,"children":82127},{},[82128],{"type":23,"value":82129},"Unified combines those layers in one platform.",{"type":17,"tag":68,"props":82131,"children":82133},{"id":82132},"why-teams-choose-unifiedto-over-other-approaches",[82134],{"type":23,"value":82135},"Why teams choose Unified.to over other approaches",{"type":17,"tag":239,"props":82137,"children":82139},{"id":82138},"_1-real-time-pass-through-architecture",[82140],{"type":23,"value":82141},"1. Real-time, pass-through architecture",{"type":17,"tag":29,"props":82143,"children":82144},{},[82145],{"type":23,"value":82146},"Every request is routed directly to the source API. Unified does not store or cache customer data, which reduces stale-data issues and lowers compliance scope. That architecture is a core part of Unified's positioning",{"type":17,"tag":239,"props":82148,"children":82150},{"id":82149},"_2-one-api-per-category-not-one-build-per-integration",[82151],{"type":23,"value":82152},"2. One API per category, not one build per integration",{"type":17,"tag":29,"props":82154,"children":82155},{},[82156],{"type":23,"value":82157},"Unified provides category-scoped APIs with normalized objects, so teams can build once for CRM, ATS, HRIS, accounting, ticketing, file storage, and other categories instead of handling each integration separately. This is part of Unified's core positioning and comparison framework.",{"type":17,"tag":239,"props":82159,"children":82161},{"id":82160},"_3-authorization-is-built-in",[82162],{"type":23,"value":82163},"3. Authorization is built in",{"type":17,"tag":29,"props":82165,"children":82166},{},[82167],{"type":23,"value":82168},"Unified includes pre-built authorization components and handles OAuth2 variations, token exchange, expiration, refresh, and non-OAuth authentication methods across integrations. That dramatically reduces custom integration logic.",{"type":17,"tag":239,"props":82170,"children":82172},{"id":82171},"_4-virtual-webhooks-remove-polling-work",[82173],{"type":23,"value":82174},"4. Virtual webhooks remove polling work",{"type":17,"tag":29,"props":82176,"children":82177},{},[82178],{"type":23,"value":82179},"When an integration does not support native webhooks, Unified provides Virtual Webhooks so teams still get an event-driven interface without building their own polling system.",{"type":17,"tag":239,"props":82181,"children":82183},{"id":82182},"_5-hybrid-flexibility",[82184],{"type":23,"value":82185},"5. Hybrid flexibility",{"type":17,"tag":29,"props":82187,"children":82188},{},[82189],{"type":23,"value":82190},"Unified supports normalized objects and passthrough access, which means teams can move fast on standard use cases while still handling custom fields, custom objects, and vendor-specific endpoints where needed.",{"type":17,"tag":68,"props":82192,"children":82194},{"id":82193},"pros-and-cons-of-unifiedto-specifically",[82195],{"type":23,"value":82196},"Pros and cons of Unified.to specifically",{"type":17,"tag":239,"props":82198,"children":82200},{"id":82199},"pros-5",[82201],{"type":23,"value":68924},{"type":17,"tag":80,"props":82203,"children":82204},{},[82205,82210,82215,82219,82224,82229,82234],{"type":17,"tag":84,"props":82206,"children":82207},{},[82208],{"type":23,"value":82209},"Fast category-wide coverage",{"type":17,"tag":84,"props":82211,"children":82212},{},[82213],{"type":23,"value":82214},"Real-time data fetched directly from source APIs",{"type":17,"tag":84,"props":82216,"children":82217},{},[82218],{"type":23,"value":17067},{"type":17,"tag":84,"props":82220,"children":82221},{},[82222],{"type":23,"value":82223},"Built-in authorization and webhook infrastructure",{"type":17,"tag":84,"props":82225,"children":82226},{},[82227],{"type":23,"value":82228},"Lower maintenance than one-off integrations",{"type":17,"tag":84,"props":82230,"children":82231},{},[82232],{"type":23,"value":82233},"Supports both unified models and direct passthrough access",{"type":17,"tag":84,"props":82235,"children":82236},{},[82237],{"type":23,"value":82238},"Strong fit for AI products that need current data, not stale copies",{"type":17,"tag":239,"props":82240,"children":82242},{"id":82241},"cons-5",[82243],{"type":23,"value":68950},{"type":17,"tag":80,"props":82245,"children":82246},{},[82247,82252,82257],{"type":17,"tag":84,"props":82248,"children":82249},{},[82250],{"type":23,"value":82251},"If your product depends almost entirely on one integration with deeply custom logic, building directly may still make sense",{"type":17,"tag":84,"props":82253,"children":82254},{},[82255],{"type":23,"value":82256},"Teams still need to understand their own product-side data model and integration requirements",{"type":17,"tag":84,"props":82258,"children":82259},{},[82260],{"type":23,"value":82261},"Not every possible use case in every category should be forced into a unified model",{"type":17,"tag":68,"props":82263,"children":82264},{"id":7672},[82265],{"type":23,"value":7675},{"type":17,"tag":80,"props":82267,"children":82268},{},[82269,82274,82279,82284,82289,82294,82299],{"type":17,"tag":84,"props":82270,"children":82271},{},[82272],{"type":23,"value":82273},"There is no single best way to build in-app integrations for every company.",{"type":17,"tag":84,"props":82275,"children":82276},{},[82277],{"type":23,"value":82278},"Building from scratch gives maximum control, but creates the most long-term overhead.",{"type":17,"tag":84,"props":82280,"children":82281},{},[82282],{"type":23,"value":82283},"Embedded iPaaS works best for customer-configurable integration scenarios.",{"type":17,"tag":84,"props":82285,"children":82286},{},[82287],{"type":23,"value":82288},"Unified APIs are the fastest way to support many integrations in the same category.",{"type":17,"tag":84,"props":82290,"children":82291},{},[82292],{"type":23,"value":82293},"API infrastructure platforms reduce plumbing but still require direct per-API work.",{"type":17,"tag":84,"props":82295,"children":82296},{},[82297],{"type":23,"value":82298},"Hybrid models are often the best fit for B2B SaaS teams that need both breadth and depth.",{"type":17,"tag":84,"props":82300,"children":82301},{},[82302],{"type":23,"value":82303},"Unified.to is strongest when you need category-wide coverage, real-time data access, built-in authorization, and lower maintenance overhead.",{"type":17,"tag":29,"props":82305,"children":82306},{},[82307],{"type":23,"value":82308},"If your team is trying to support more customer integrations without building a permanent integration maintenance function, that is usually the signal that a unified, real-time architecture is the better path.",{"type":17,"tag":29,"props":82310,"children":82311},{},[82312,82313],{"type":23,"value":1609},{"type":17,"tag":133,"props":82314,"children":82316},{"href":1612,"rel":82315},[214],[82317],{"type":23,"value":1616},{"type":17,"tag":29,"props":82319,"children":82320},{},[82321,82322],{"type":23,"value":1609},{"type":17,"tag":133,"props":82323,"children":82325},{"href":1623,"rel":82324},[214],[82326],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":82328},[82329,82330,82331,82332,82337,82342,82347,82352,82357,82363,82364,82371,82375],{"id":81043,"depth":1629,"text":81046},{"id":81101,"depth":1629,"text":81104},{"id":81184,"depth":1629,"text":81187},{"id":81349,"depth":1629,"text":81352,"children":82333},[82334,82335,82336],{"id":81399,"depth":1635,"text":68924},{"id":81427,"depth":1635,"text":68950},{"id":81460,"depth":1635,"text":80744},{"id":81493,"depth":1629,"text":81496,"children":82338},[82339,82340,82341],{"id":81529,"depth":1635,"text":68924},{"id":81557,"depth":1635,"text":68950},{"id":81590,"depth":1635,"text":80744},{"id":81623,"depth":1629,"text":81626,"children":82343},[82344,82345,82346],{"id":81658,"depth":1635,"text":68924},{"id":81691,"depth":1635,"text":68950},{"id":81719,"depth":1635,"text":80744},{"id":81752,"depth":1629,"text":81755,"children":82348},[82349,82350,82351],{"id":81816,"depth":1635,"text":68924},{"id":81844,"depth":1635,"text":68950},{"id":81872,"depth":1635,"text":80744},{"id":81905,"depth":1629,"text":81908,"children":82353},[82354,82355,82356],{"id":81939,"depth":1635,"text":68924},{"id":81967,"depth":1635,"text":68950},{"id":81990,"depth":1635,"text":80744},{"id":82018,"depth":1629,"text":82021,"children":82358},[82359,82360,82361,82362],{"id":82024,"depth":1635,"text":82027},{"id":82035,"depth":1635,"text":82038},{"id":82046,"depth":1635,"text":82049},{"id":82057,"depth":1635,"text":82060},{"id":82068,"depth":1629,"text":82071},{"id":82132,"depth":1629,"text":82135,"children":82365},[82366,82367,82368,82369,82370],{"id":82138,"depth":1635,"text":82141},{"id":82149,"depth":1635,"text":82152},{"id":82160,"depth":1635,"text":82163},{"id":82171,"depth":1635,"text":82174},{"id":82182,"depth":1635,"text":82185},{"id":82193,"depth":1629,"text":82196,"children":82372},[82373,82374],{"id":82199,"depth":1635,"text":68924},{"id":82241,"depth":1635,"text":68950},{"id":7672,"depth":1629,"text":7675},"content:blog:5_ways_to_build_in_app_integrations_in_2026.md","blog/5_ways_to_build_in_app_integrations_in_2026.md","blog/5_ways_to_build_in_app_integrations_in_2026",{"_path":82380,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":82381,"description":82382,"img":82383,"date":82384,"tag":12,"body":82385,"_type":1677,"_id":84156,"_source":1679,"_file":84157,"_stem":84158,"_extension":1682},"/blog/15_accounting_apis_to_integrate_with_in_2026_quickbooks_xero_freshbooks_and_unified_accounting_apis","15 Accounting APIs to Integrate With in 2026: QuickBooks, Xero, FreshBooks, and Unified Accounting APIs","If your product touches invoicing, expenses, reporting, reconciliation, revenue, or financial operations, there is a good chance your customers expect it to...","https://s3.us-east-2.amazonaws.com/unified-article-images/15_accounting_apis_to_integrate_with_in_2026_quickbooks_xero_freshbooks_and_unified_accounting_apis-icon.png","2026-03-09T19:51:00.000Z",{"type":14,"children":82386,"toc":84119},[82387,82392,82395,82402,82407,82412,82431,82449,82455,82460,82464,82520,82525,82562,82568,82573,82578,82608,82612,82620,82625,82633,82638,82646,82651,82659,82664,82672,82677,82683,82688,82694,82702,82707,82711,82740,82745,82767,82773,82781,82786,82790,82822,82827,82850,82856,82866,82871,82876,82901,82906,82924,82930,82938,82943,82948,82974,82979,82985,82993,82998,83003,83027,83033,83042,83047,83051,83078,83084,83092,83097,83102,83131,83137,83147,83152,83156,83177,83183,83191,83196,83201,83229,83234,83240,83250,83255,83260,83283,83289,83299,83304,83309,83315,83325,83330,83335,83360,83366,83376,83381,83385,83414,83420,83428,83433,83438,83456,83462,83470,83475,83480,83501,83507,83512,83589,83594,83600,83605,83611,83615,83643,83647,83652,83658,83668,83673,83679,83684,83690,83695,83701,83706,83712,83717,83722,83726,83749,83754,83760,83778,83783,83789,83794,83881,83886,83890,83895,83911,83920,83924,83946,83956,83961,83965,83969,84007,84012,84018,84023,84028,84061,84066,84071,84075,84080,84085,84090,84102,84111],{"type":17,"tag":18,"props":82388,"children":82390},{"id":82389},"_15-accounting-apis-to-integrate-with-in-2026-quickbooks-xero-freshbooks-and-unified-accounting-apis",[82391],{"type":23,"value":82381},{"type":17,"tag":25,"props":82393,"children":82394},{},[],{"type":17,"tag":29,"props":82396,"children":82397},{},[82398],{"type":17,"tag":33,"props":82399,"children":82400},{},[82401],{"type":23,"value":37},{"type":17,"tag":29,"props":82403,"children":82404},{},[82405],{"type":23,"value":82406},"If your product touches invoicing, expenses, reporting, reconciliation, revenue, or financial operations, there is a good chance your customers expect it to connect with their accounting system.",{"type":17,"tag":29,"props":82408,"children":82409},{},[82410],{"type":23,"value":82411},"That sounds straightforward until you actually start building.",{"type":17,"tag":29,"props":82413,"children":82414},{},[82415,82417,82421,82423,82429],{"type":23,"value":82416},"Every accounting platform has its own authentication model, object structure, ",{"type":17,"tag":133,"props":82418,"children":82419},{"href":1857},[82420],{"type":23,"value":1860},{"type":23,"value":82422}," rules, webhook support, and quirks around invoices, tax, payments, journals, and reporting. Supporting one ",{"type":17,"tag":133,"props":82424,"children":82426},{"href":82425},"/accounting",[82427],{"type":23,"value":82428},"accounting API",{"type":23,"value":82430}," can be manageable. Supporting 10 or 15 becomes a real integration strategy problem.",{"type":17,"tag":29,"props":82432,"children":82433},{},[82434,82435,82440,82442,82447],{"type":23,"value":23079},{"type":17,"tag":48,"props":82436,"children":82437},{},[82438],{"type":23,"value":82439},"top accounting APIs to integrate with in 2026",{"type":23,"value":82441},", the most common use cases, the challenges teams run into, and why more SaaS teams are moving toward ",{"type":17,"tag":48,"props":82443,"children":82444},{},[82445],{"type":23,"value":82446},"Unified Accounting APIs",{"type":23,"value":82448}," instead of building every financial integration one by one.",{"type":17,"tag":68,"props":82450,"children":82452},{"id":82451},"what-is-an-accounting-api",[82453],{"type":23,"value":82454},"What is an accounting API?",{"type":17,"tag":29,"props":82456,"children":82457},{},[82458],{"type":23,"value":82459},"An accounting API lets developers read and write financial data from accounting platforms programmatically.",{"type":17,"tag":29,"props":82461,"children":82462},{},[82463],{"type":23,"value":40449},{"type":17,"tag":80,"props":82465,"children":82466},{},[82467,82471,82476,82480,82485,82490,82495,82500,82505,82510,82515],{"type":17,"tag":84,"props":82468,"children":82469},{},[82470],{"type":23,"value":36676},{"type":17,"tag":84,"props":82472,"children":82473},{},[82474],{"type":23,"value":82475},"bills",{"type":17,"tag":84,"props":82477,"children":82478},{},[82479],{"type":23,"value":30404},{"type":17,"tag":84,"props":82481,"children":82482},{},[82483],{"type":23,"value":82484},"expenses",{"type":17,"tag":84,"props":82486,"children":82487},{},[82488],{"type":23,"value":82489},"journal entries",{"type":17,"tag":84,"props":82491,"children":82492},{},[82493],{"type":23,"value":82494},"transactions",{"type":17,"tag":84,"props":82496,"children":82497},{},[82498],{"type":23,"value":82499},"accounts",{"type":17,"tag":84,"props":82501,"children":82502},{},[82503],{"type":23,"value":82504},"tax rates",{"type":17,"tag":84,"props":82506,"children":82507},{},[82508],{"type":23,"value":82509},"financial reports",{"type":17,"tag":84,"props":82511,"children":82512},{},[82513],{"type":23,"value":82514},"purchase orders",{"type":17,"tag":84,"props":82516,"children":82517},{},[82518],{"type":23,"value":82519},"sales orders",{"type":17,"tag":29,"props":82521,"children":82522},{},[82523],{"type":23,"value":82524},"For SaaS products, accounting APIs make it possible to build:",{"type":17,"tag":80,"props":82526,"children":82527},{},[82528,82533,82538,82543,82548,82552,82557],{"type":17,"tag":84,"props":82529,"children":82530},{},[82531],{"type":23,"value":82532},"financial dashboards",{"type":17,"tag":84,"props":82534,"children":82535},{},[82536],{"type":23,"value":82537},"invoice automation",{"type":17,"tag":84,"props":82539,"children":82540},{},[82541],{"type":23,"value":82542},"expense management",{"type":17,"tag":84,"props":82544,"children":82545},{},[82546],{"type":23,"value":82547},"bookkeeping workflows",{"type":17,"tag":84,"props":82549,"children":82550},{},[82551],{"type":23,"value":36428},{"type":17,"tag":84,"props":82553,"children":82554},{},[82555],{"type":23,"value":82556},"forecasting and analytics",{"type":17,"tag":84,"props":82558,"children":82559},{},[82560],{"type":23,"value":82561},"AI assistants for finance teams",{"type":17,"tag":68,"props":82563,"children":82565},{"id":82564},"why-saas-teams-integrate-accounting-apis",[82566],{"type":23,"value":82567},"Why SaaS teams integrate accounting APIs",{"type":17,"tag":29,"props":82569,"children":82570},{},[82571],{"type":23,"value":82572},"Accounting integrations are valuable because financial data does not live in isolation.",{"type":17,"tag":29,"props":82574,"children":82575},{},[82576],{"type":23,"value":82577},"Products often need to connect accounting data with:",{"type":17,"tag":80,"props":82579,"children":82580},{},[82581,82585,82590,82594,82599,82603],{"type":17,"tag":84,"props":82582,"children":82583},{},[82584],{"type":23,"value":30480},{"type":17,"tag":84,"props":82586,"children":82587},{},[82588],{"type":23,"value":82589},"payment processors",{"type":17,"tag":84,"props":82591,"children":82592},{},[82593],{"type":23,"value":58177},{"type":17,"tag":84,"props":82595,"children":82596},{},[82597],{"type":23,"value":82598},"procurement workflows",{"type":17,"tag":84,"props":82600,"children":82601},{},[82602],{"type":23,"value":34573},{"type":17,"tag":84,"props":82604,"children":82605},{},[82606],{"type":23,"value":82607},"BI and analytics tools",{"type":17,"tag":29,"props":82609,"children":82610},{},[82611],{"type":23,"value":12661},{"type":17,"tag":29,"props":82613,"children":82614},{},[82615],{"type":17,"tag":48,"props":82616,"children":82617},{},[82618],{"type":23,"value":82619},"Automated invoicing",{"type":17,"tag":29,"props":82621,"children":82622},{},[82623],{"type":23,"value":82624},"Create invoices from usage, subscriptions, or closed deals.",{"type":17,"tag":29,"props":82626,"children":82627},{},[82628],{"type":17,"tag":48,"props":82629,"children":82630},{},[82631],{"type":23,"value":82632},"Expense tracking and categorization",{"type":17,"tag":29,"props":82634,"children":82635},{},[82636],{"type":23,"value":82637},"Pull expenses into dashboards or push categorized spend back into the accounting platform.",{"type":17,"tag":29,"props":82639,"children":82640},{},[82641],{"type":17,"tag":48,"props":82642,"children":82643},{},[82644],{"type":23,"value":82645},"Real-time financial reporting",{"type":17,"tag":29,"props":82647,"children":82648},{},[82649],{"type":23,"value":82650},"Display live invoice, expense, and cash flow data without waiting for nightly syncs.",{"type":17,"tag":29,"props":82652,"children":82653},{},[82654],{"type":17,"tag":48,"props":82655,"children":82656},{},[82657],{"type":23,"value":82658},"Reconciliation workflows",{"type":17,"tag":29,"props":82660,"children":82661},{},[82662],{"type":23,"value":82663},"Match payments, invoices, and transactions across accounting and payments systems.",{"type":17,"tag":29,"props":82665,"children":82666},{},[82667],{"type":17,"tag":48,"props":82668,"children":82669},{},[82670],{"type":23,"value":82671},"Embedded finance or fintech workflows",{"type":17,"tag":29,"props":82673,"children":82674},{},[82675],{"type":23,"value":82676},"Use accounting data to power underwriting, insights, forecasting, or spend controls.",{"type":17,"tag":68,"props":82678,"children":82680},{"id":82679},"top-15-accounting-apis-to-integrate-with-in-2026",[82681],{"type":23,"value":82682},"Top 15 Accounting APIs to Integrate With in 2026",{"type":17,"tag":29,"props":82684,"children":82685},{},[82686],{"type":23,"value":82687},"There are many accounting and financial systems on the market, but these are some of the most important APIs SaaS teams commonly need to support.",{"type":17,"tag":239,"props":82689,"children":82691},{"id":82690},"_1-quickbooks-api",[82692],{"type":23,"value":82693},"1. QuickBooks API",{"type":17,"tag":29,"props":82695,"children":82696},{},[82697],{"type":17,"tag":133,"props":82698,"children":82700},{"href":36483,"rel":82699},[214],[82701],{"type":23,"value":36487},{"type":17,"tag":29,"props":82703,"children":82704},{},[82705],{"type":23,"value":82706},"QuickBooks remains one of the most widely requested accounting integrations for SMB and mid-market software.",{"type":17,"tag":29,"props":82708,"children":82709},{},[82710],{"type":23,"value":41011},{"type":17,"tag":80,"props":82712,"children":82713},{},[82714,82718,82722,82726,82731,82735],{"type":17,"tag":84,"props":82715,"children":82716},{},[82717],{"type":23,"value":36676},{"type":17,"tag":84,"props":82719,"children":82720},{},[82721],{"type":23,"value":82484},{"type":17,"tag":84,"props":82723,"children":82724},{},[82725],{"type":23,"value":30404},{"type":17,"tag":84,"props":82727,"children":82728},{},[82729],{"type":23,"value":82730},"chart of accounts",{"type":17,"tag":84,"props":82732,"children":82733},{},[82734],{"type":23,"value":82489},{"type":17,"tag":84,"props":82736,"children":82737},{},[82738],{"type":23,"value":82739},"reports",{"type":17,"tag":29,"props":82741,"children":82742},{},[82743],{"type":23,"value":82744},"QuickBooks is often essential for:",{"type":17,"tag":80,"props":82746,"children":82747},{},[82748,82753,82758,82762],{"type":17,"tag":84,"props":82749,"children":82750},{},[82751],{"type":23,"value":82752},"invoicing tools",{"type":17,"tag":84,"props":82754,"children":82755},{},[82756],{"type":23,"value":82757},"spend management products",{"type":17,"tag":84,"props":82759,"children":82760},{},[82761],{"type":23,"value":82532},{"type":17,"tag":84,"props":82763,"children":82764},{},[82765],{"type":23,"value":82766},"bookkeeping automation",{"type":17,"tag":239,"props":82768,"children":82770},{"id":82769},"_2-xero-api",[82771],{"type":23,"value":82772},"2. Xero API",{"type":17,"tag":29,"props":82774,"children":82775},{},[82776],{"type":17,"tag":133,"props":82777,"children":82779},{"href":36611,"rel":82778},[214],[82780],{"type":23,"value":36615},{"type":17,"tag":29,"props":82782,"children":82783},{},[82784],{"type":23,"value":82785},"Xero is a major accounting platform, especially outside the US.",{"type":17,"tag":29,"props":82787,"children":82788},{},[82789],{"type":23,"value":51467},{"type":17,"tag":80,"props":82791,"children":82792},{},[82793,82797,82801,82805,82810,82814,82818],{"type":17,"tag":84,"props":82794,"children":82795},{},[82796],{"type":23,"value":36676},{"type":17,"tag":84,"props":82798,"children":82799},{},[82800],{"type":23,"value":82475},{"type":17,"tag":84,"props":82802,"children":82803},{},[82804],{"type":23,"value":30404},{"type":17,"tag":84,"props":82806,"children":82807},{},[82808],{"type":23,"value":82809},"bank transactions",{"type":17,"tag":84,"props":82811,"children":82812},{},[82813],{"type":23,"value":82499},{"type":17,"tag":84,"props":82815,"children":82816},{},[82817],{"type":23,"value":82739},{"type":17,"tag":84,"props":82819,"children":82820},{},[82821],{"type":23,"value":82504},{"type":17,"tag":29,"props":82823,"children":82824},{},[82825],{"type":23,"value":82826},"Xero is commonly used in:",{"type":17,"tag":80,"props":82828,"children":82829},{},[82830,82835,82840,82845],{"type":17,"tag":84,"props":82831,"children":82832},{},[82833],{"type":23,"value":82834},"accounting automation",{"type":17,"tag":84,"props":82836,"children":82837},{},[82838],{"type":23,"value":82839},"cash flow tools",{"type":17,"tag":84,"props":82841,"children":82842},{},[82843],{"type":23,"value":82844},"e-commerce finance workflows",{"type":17,"tag":84,"props":82846,"children":82847},{},[82848],{"type":23,"value":82849},"reporting products",{"type":17,"tag":239,"props":82851,"children":82853},{"id":82852},"_3-freshbooks-api",[82854],{"type":23,"value":82855},"3. FreshBooks API",{"type":17,"tag":29,"props":82857,"children":82858},{},[82859],{"type":17,"tag":133,"props":82860,"children":82863},{"href":82861,"rel":82862},"https://www.freshbooks.com/api",[214],[82864],{"type":23,"value":82865},"FreshBooks API documentation",{"type":17,"tag":29,"props":82867,"children":82868},{},[82869],{"type":23,"value":82870},"FreshBooks is popular with service businesses and smaller teams that need lightweight accounting and invoicing workflows.",{"type":17,"tag":29,"props":82872,"children":82873},{},[82874],{"type":23,"value":82875},"Common objects include:",{"type":17,"tag":80,"props":82877,"children":82878},{},[82879,82883,82888,82892,82897],{"type":17,"tag":84,"props":82880,"children":82881},{},[82882],{"type":23,"value":36676},{"type":17,"tag":84,"props":82884,"children":82885},{},[82886],{"type":23,"value":82887},"clients",{"type":17,"tag":84,"props":82889,"children":82890},{},[82891],{"type":23,"value":82484},{"type":17,"tag":84,"props":82893,"children":82894},{},[82895],{"type":23,"value":82896},"estimates",{"type":17,"tag":84,"props":82898,"children":82899},{},[82900],{"type":23,"value":11734},{"type":17,"tag":29,"props":82902,"children":82903},{},[82904],{"type":23,"value":82905},"It is especially relevant for:",{"type":17,"tag":80,"props":82907,"children":82908},{},[82909,82914,82919],{"type":17,"tag":84,"props":82910,"children":82911},{},[82912],{"type":23,"value":82913},"invoicing software",{"type":17,"tag":84,"props":82915,"children":82916},{},[82917],{"type":23,"value":82918},"freelancer tools",{"type":17,"tag":84,"props":82920,"children":82921},{},[82922],{"type":23,"value":82923},"SMB financial products",{"type":17,"tag":239,"props":82925,"children":82927},{"id":82926},"_4-netsuite-api",[82928],{"type":23,"value":82929},"4. NetSuite API",{"type":17,"tag":29,"props":82931,"children":82932},{},[82933],{"type":17,"tag":133,"props":82934,"children":82936},{"href":35093,"rel":82935},[214],[82937],{"type":23,"value":35097},{"type":17,"tag":29,"props":82939,"children":82940},{},[82941],{"type":23,"value":82942},"NetSuite is a much deeper ERP and finance platform used by larger companies.",{"type":17,"tag":29,"props":82944,"children":82945},{},[82946],{"type":23,"value":82947},"Teams typically integrate NetSuite for:",{"type":17,"tag":80,"props":82949,"children":82950},{},[82951,82956,82961,82965,82970],{"type":17,"tag":84,"props":82952,"children":82953},{},[82954],{"type":23,"value":82955},"financial consolidation",{"type":17,"tag":84,"props":82957,"children":82958},{},[82959],{"type":23,"value":82960},"order-to-cash flows",{"type":17,"tag":84,"props":82962,"children":82963},{},[82964],{"type":23,"value":82489},{"type":17,"tag":84,"props":82966,"children":82967},{},[82968],{"type":23,"value":82969},"invoices and AR/AP",{"type":17,"tag":84,"props":82971,"children":82972},{},[82973],{"type":23,"value":41268},{"type":17,"tag":29,"props":82975,"children":82976},{},[82977],{"type":23,"value":82978},"NetSuite is often a must-have for companies selling into larger accounts.",{"type":17,"tag":239,"props":82980,"children":82982},{"id":82981},"_5-sage-accounting-api",[82983],{"type":23,"value":82984},"5. Sage Accounting API",{"type":17,"tag":29,"props":82986,"children":82987},{},[82988],{"type":17,"tag":133,"props":82989,"children":82991},{"href":36530,"rel":82990},[214],[82992],{"type":23,"value":36534},{"type":17,"tag":29,"props":82994,"children":82995},{},[82996],{"type":23,"value":82997},"Sage remains important in several regions and segments, especially for SMB accounting and finance use cases.",{"type":17,"tag":29,"props":82999,"children":83000},{},[83001],{"type":23,"value":83002},"It commonly supports:",{"type":17,"tag":80,"props":83004,"children":83005},{},[83006,83010,83014,83019,83023],{"type":17,"tag":84,"props":83007,"children":83008},{},[83009],{"type":23,"value":30404},{"type":17,"tag":84,"props":83011,"children":83012},{},[83013],{"type":23,"value":36676},{"type":17,"tag":84,"props":83015,"children":83016},{},[83017],{"type":23,"value":83018},"ledger accounts",{"type":17,"tag":84,"props":83020,"children":83021},{},[83022],{"type":23,"value":82504},{"type":17,"tag":84,"props":83024,"children":83025},{},[83026],{"type":23,"value":82494},{"type":17,"tag":239,"props":83028,"children":83030},{"id":83029},"_6-sage-intacct-api",[83031],{"type":23,"value":83032},"6. Sage Intacct API",{"type":17,"tag":29,"props":83034,"children":83035},{},[83036],{"type":17,"tag":133,"props":83037,"children":83039},{"href":38536,"rel":83038},[214],[83040],{"type":23,"value":83041},"Sage Intacct API documentation",{"type":17,"tag":29,"props":83043,"children":83044},{},[83045],{"type":23,"value":83046},"Sage Intacct is more enterprise-oriented than Sage Accounting and is commonly used in finance-heavy organizations.",{"type":17,"tag":29,"props":83048,"children":83049},{},[83050],{"type":23,"value":53837},{"type":17,"tag":80,"props":83052,"children":83053},{},[83054,83059,83064,83069,83073],{"type":17,"tag":84,"props":83055,"children":83056},{},[83057],{"type":23,"value":83058},"GL data",{"type":17,"tag":84,"props":83060,"children":83061},{},[83062],{"type":23,"value":83063},"AP/AR",{"type":17,"tag":84,"props":83065,"children":83066},{},[83067],{"type":23,"value":83068},"dimensions",{"type":17,"tag":84,"props":83070,"children":83071},{},[83072],{"type":23,"value":966},{"type":17,"tag":84,"props":83074,"children":83075},{},[83076],{"type":23,"value":83077},"multi-entity finance workflows",{"type":17,"tag":239,"props":83079,"children":83081},{"id":83080},"_7-zoho-books-api",[83082],{"type":23,"value":83083},"7. Zoho Books API",{"type":17,"tag":29,"props":83085,"children":83086},{},[83087],{"type":17,"tag":133,"props":83088,"children":83090},{"href":36651,"rel":83089},[214],[83091],{"type":23,"value":36655},{"type":17,"tag":29,"props":83093,"children":83094},{},[83095],{"type":23,"value":83096},"Zoho Books is frequently used in smaller and mid-sized businesses, especially when companies already use other Zoho products.",{"type":17,"tag":29,"props":83098,"children":83099},{},[83100],{"type":23,"value":83101},"Its API typically includes:",{"type":17,"tag":80,"props":83103,"children":83104},{},[83105,83109,83113,83117,83122,83127],{"type":17,"tag":84,"props":83106,"children":83107},{},[83108],{"type":23,"value":36676},{"type":17,"tag":84,"props":83110,"children":83111},{},[83112],{"type":23,"value":30404},{"type":17,"tag":84,"props":83114,"children":83115},{},[83116],{"type":23,"value":82475},{"type":17,"tag":84,"props":83118,"children":83119},{},[83120],{"type":23,"value":83121},"items",{"type":17,"tag":84,"props":83123,"children":83124},{},[83125],{"type":23,"value":83126},"taxes",{"type":17,"tag":84,"props":83128,"children":83129},{},[83130],{"type":23,"value":82484},{"type":17,"tag":239,"props":83132,"children":83134},{"id":83133},"_8-wave-api",[83135],{"type":23,"value":83136},"8. Wave API",{"type":17,"tag":29,"props":83138,"children":83139},{},[83140],{"type":17,"tag":133,"props":83141,"children":83144},{"href":83142,"rel":83143},"https://developer.waveapps.com/hc/en-us",[214],[83145],{"type":23,"value":83146},"Wave API documentation",{"type":17,"tag":29,"props":83148,"children":83149},{},[83150],{"type":23,"value":83151},"Wave is relevant for small businesses and freelancer-oriented accounting workflows.",{"type":17,"tag":29,"props":83153,"children":83154},{},[83155],{"type":23,"value":15093},{"type":17,"tag":80,"props":83157,"children":83158},{},[83159,83163,83168,83172],{"type":17,"tag":84,"props":83160,"children":83161},{},[83162],{"type":23,"value":36322},{"type":17,"tag":84,"props":83164,"children":83165},{},[83166],{"type":23,"value":83167},"bookkeeping",{"type":17,"tag":84,"props":83169,"children":83170},{},[83171],{"type":23,"value":966},{"type":17,"tag":84,"props":83173,"children":83174},{},[83175],{"type":23,"value":83176},"expense visibility",{"type":17,"tag":239,"props":83178,"children":83180},{"id":83179},"_9-billcom-api",[83181],{"type":23,"value":83182},"9. Bill.com API",{"type":17,"tag":29,"props":83184,"children":83185},{},[83186],{"type":17,"tag":133,"props":83187,"children":83189},{"href":36392,"rel":83188},[214],[83190],{"type":23,"value":36396},{"type":17,"tag":29,"props":83192,"children":83193},{},[83194],{"type":23,"value":83195},"Bill.com is especially relevant for AP/AR automation.",{"type":17,"tag":29,"props":83197,"children":83198},{},[83199],{"type":23,"value":83200},"It is often used for:",{"type":17,"tag":80,"props":83202,"children":83203},{},[83204,83209,83214,83219,83224],{"type":17,"tag":84,"props":83205,"children":83206},{},[83207],{"type":23,"value":83208},"bill pay",{"type":17,"tag":84,"props":83210,"children":83211},{},[83212],{"type":23,"value":83213},"approvals",{"type":17,"tag":84,"props":83215,"children":83216},{},[83217],{"type":23,"value":83218},"vendor workflows",{"type":17,"tag":84,"props":83220,"children":83221},{},[83222],{"type":23,"value":83223},"invoice management",{"type":17,"tag":84,"props":83225,"children":83226},{},[83227],{"type":23,"value":83228},"payables automation",{"type":17,"tag":29,"props":83230,"children":83231},{},[83232],{"type":23,"value":83233},"This makes it important for procurement, AP automation, and spend management products.",{"type":17,"tag":239,"props":83235,"children":83237},{"id":83236},"_10-concur-api",[83238],{"type":23,"value":83239},"10. Concur API",{"type":17,"tag":29,"props":83241,"children":83242},{},[83243],{"type":17,"tag":133,"props":83244,"children":83247},{"href":83245,"rel":83246},"https://developer.concur.com/api-reference/",[214],[83248],{"type":23,"value":83249},"Concur API documentation",{"type":17,"tag":29,"props":83251,"children":83252},{},[83253],{"type":23,"value":83254},"Concur is a major enterprise platform for expense and travel management.",{"type":17,"tag":29,"props":83256,"children":83257},{},[83258],{"type":23,"value":83259},"Key use cases:",{"type":17,"tag":80,"props":83261,"children":83262},{},[83263,83268,83273,83278],{"type":17,"tag":84,"props":83264,"children":83265},{},[83266],{"type":23,"value":83267},"expense capture",{"type":17,"tag":84,"props":83269,"children":83270},{},[83271],{"type":23,"value":83272},"reimbursement workflows",{"type":17,"tag":84,"props":83274,"children":83275},{},[83276],{"type":23,"value":83277},"travel + finance reconciliation",{"type":17,"tag":84,"props":83279,"children":83280},{},[83281],{"type":23,"value":83282},"employee spend analytics",{"type":17,"tag":239,"props":83284,"children":83286},{"id":83285},"_11-myob-api",[83287],{"type":23,"value":83288},"11. MYOB API",{"type":17,"tag":29,"props":83290,"children":83291},{},[83292],{"type":17,"tag":133,"props":83293,"children":83296},{"href":83294,"rel":83295},"https://developer.myob.com/",[214],[83297],{"type":23,"value":83298},"MYOB API documentation",{"type":17,"tag":29,"props":83300,"children":83301},{},[83302],{"type":23,"value":83303},"MYOB matters especially in Australia and New Zealand.",{"type":17,"tag":29,"props":83305,"children":83306},{},[83307],{"type":23,"value":83308},"For SaaS teams expanding regionally, it can be an important accounting integration to support.",{"type":17,"tag":239,"props":83310,"children":83312},{"id":83311},"_12-odoo-api",[83313],{"type":23,"value":83314},"12. Odoo API",{"type":17,"tag":29,"props":83316,"children":83317},{},[83318],{"type":17,"tag":133,"props":83319,"children":83322},{"href":83320,"rel":83321},"https://www.odoo.com/documentation",[214],[83323],{"type":23,"value":83324},"Odoo developer documentation",{"type":17,"tag":29,"props":83326,"children":83327},{},[83328],{"type":23,"value":83329},"Odoo spans accounting and ERP functionality.",{"type":17,"tag":29,"props":83331,"children":83332},{},[83333],{"type":23,"value":83334},"Its accounting integration can matter for:",{"type":17,"tag":80,"props":83336,"children":83337},{},[83338,83342,83347,83351,83355],{"type":17,"tag":84,"props":83339,"children":83340},{},[83341],{"type":23,"value":36676},{"type":17,"tag":84,"props":83343,"children":83344},{},[83345],{"type":23,"value":83346},"orders",{"type":17,"tag":84,"props":83348,"children":83349},{},[83350],{"type":23,"value":30404},{"type":17,"tag":84,"props":83352,"children":83353},{},[83354],{"type":23,"value":82834},{"type":17,"tag":84,"props":83356,"children":83357},{},[83358],{"type":23,"value":83359},"custom ERP workflows",{"type":17,"tag":239,"props":83361,"children":83363},{"id":83362},"_13-microsoft-dynamics-365-business-central-api",[83364],{"type":23,"value":83365},"13. Microsoft Dynamics 365 Business Central API",{"type":17,"tag":29,"props":83367,"children":83368},{},[83369],{"type":17,"tag":133,"props":83370,"children":83373},{"href":83371,"rel":83372},"https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/",[214],[83374],{"type":23,"value":83375},"Business Central API documentation",{"type":17,"tag":29,"props":83377,"children":83378},{},[83379],{"type":23,"value":83380},"Business Central is important for finance and ERP workflows in Microsoft-centric environments.",{"type":17,"tag":29,"props":83382,"children":83383},{},[83384],{"type":23,"value":37761},{"type":17,"tag":80,"props":83386,"children":83387},{},[83388,83393,83397,83401,83406,83410],{"type":17,"tag":84,"props":83389,"children":83390},{},[83391],{"type":23,"value":83392},"finance operations",{"type":17,"tag":84,"props":83394,"children":83395},{},[83396],{"type":23,"value":36676},{"type":17,"tag":84,"props":83398,"children":83399},{},[83400],{"type":23,"value":70514},{"type":17,"tag":84,"props":83402,"children":83403},{},[83404],{"type":23,"value":83405},"vendors",{"type":17,"tag":84,"props":83407,"children":83408},{},[83409],{"type":23,"value":83346},{"type":17,"tag":84,"props":83411,"children":83412},{},[83413],{"type":23,"value":966},{"type":17,"tag":239,"props":83415,"children":83417},{"id":83416},"_14-stripe-api",[83418],{"type":23,"value":83419},"14. Stripe API",{"type":17,"tag":29,"props":83421,"children":83422},{},[83423],{"type":17,"tag":133,"props":83424,"children":83426},{"href":35775,"rel":83425},[214],[83427],{"type":23,"value":36061},{"type":17,"tag":29,"props":83429,"children":83430},{},[83431],{"type":23,"value":83432},"Stripe is not a traditional accounting platform, but in practice it is one of the most important financial APIs SaaS teams integrate.",{"type":17,"tag":29,"props":83434,"children":83435},{},[83436],{"type":23,"value":83437},"Why it matters:",{"type":17,"tag":80,"props":83439,"children":83440},{},[83441,83446,83451],{"type":17,"tag":84,"props":83442,"children":83443},{},[83444],{"type":23,"value":83445},"payments and invoicing often need to be reconciled with accounting systems",{"type":17,"tag":84,"props":83447,"children":83448},{},[83449],{"type":23,"value":83450},"products frequently combine Stripe with QuickBooks, Xero, or NetSuite",{"type":17,"tag":84,"props":83452,"children":83453},{},[83454],{"type":23,"value":83455},"finance automation workflows often start here",{"type":17,"tag":239,"props":83457,"children":83459},{"id":83458},"_15-gocardless-api",[83460],{"type":23,"value":83461},"15. GoCardless API",{"type":17,"tag":29,"props":83463,"children":83464},{},[83465],{"type":17,"tag":133,"props":83466,"children":83468},{"href":36248,"rel":83467},[214],[83469],{"type":23,"value":36252},{"type":17,"tag":29,"props":83471,"children":83472},{},[83473],{"type":23,"value":83474},"GoCardless is highly relevant for payments and collections workflows, especially recurring payments.",{"type":17,"tag":29,"props":83476,"children":83477},{},[83478],{"type":23,"value":83479},"It often shows up in:",{"type":17,"tag":80,"props":83481,"children":83482},{},[83483,83488,83492,83496],{"type":17,"tag":84,"props":83484,"children":83485},{},[83486],{"type":23,"value":83487},"invoice collection workflows",{"type":17,"tag":84,"props":83489,"children":83490},{},[83491],{"type":23,"value":36428},{"type":17,"tag":84,"props":83493,"children":83494},{},[83495],{"type":23,"value":36284},{"type":17,"tag":84,"props":83497,"children":83498},{},[83499],{"type":23,"value":83500},"billing operations",{"type":17,"tag":68,"props":83502,"children":83504},{"id":83503},"other-accounting-apis-worth-supporting",[83505],{"type":23,"value":83506},"Other accounting APIs worth supporting",{"type":17,"tag":29,"props":83508,"children":83509},{},[83510],{"type":23,"value":83511},"Beyond the top 15 above, many SaaS teams also need support for:",{"type":17,"tag":80,"props":83513,"children":83514},{},[83515,83523,83533,83541,83549,83557,83565,83573,83581],{"type":17,"tag":84,"props":83516,"children":83517},{},[83518],{"type":17,"tag":133,"props":83519,"children":83521},{"href":36344,"rel":83520},[214],[83522],{"type":23,"value":37083},{"type":17,"tag":84,"props":83524,"children":83525},{},[83526],{"type":17,"tag":133,"props":83527,"children":83530},{"href":83528,"rel":83529},"https://docs.ramp.com/developer-api/",[214],[83531],{"type":23,"value":83532},"Ramp",{"type":17,"tag":84,"props":83534,"children":83535},{},[83536],{"type":17,"tag":133,"props":83537,"children":83539},{"href":35782,"rel":83538},[214],[83540],{"type":23,"value":26553},{"type":17,"tag":84,"props":83542,"children":83543},{},[83544],{"type":17,"tag":133,"props":83545,"children":83547},{"href":35789,"rel":83546},[214],[83548],{"type":23,"value":14193},{"type":17,"tag":84,"props":83550,"children":83551},{},[83552],{"type":17,"tag":133,"props":83553,"children":83555},{"href":36296,"rel":83554},[214],[83556],{"type":23,"value":37078},{"type":17,"tag":84,"props":83558,"children":83559},{},[83560],{"type":17,"tag":133,"props":83561,"children":83563},{"href":35796,"rel":83562},[214],[83564],{"type":23,"value":11750},{"type":17,"tag":84,"props":83566,"children":83567},{},[83568],{"type":17,"tag":133,"props":83569,"children":83571},{"href":37439,"rel":83570},[214],[83572],{"type":23,"value":37443},{"type":17,"tag":84,"props":83574,"children":83575},{},[83576],{"type":17,"tag":133,"props":83577,"children":83579},{"href":37431,"rel":83578},[214],[83580],{"type":23,"value":37435},{"type":17,"tag":84,"props":83582,"children":83583},{},[83584],{"type":17,"tag":133,"props":83585,"children":83587},{"href":37455,"rel":83586},[214],[83588],{"type":23,"value":37459},{"type":17,"tag":29,"props":83590,"children":83591},{},[83592],{"type":23,"value":83593},"This is why accounting integrations increasingly overlap with billing, payments, commerce, and ERP.",{"type":17,"tag":68,"props":83595,"children":83597},{"id":83596},"challenges-with-accounting-api-integrations",[83598],{"type":23,"value":83599},"Challenges with accounting API integrations",{"type":17,"tag":29,"props":83601,"children":83602},{},[83603],{"type":23,"value":83604},"Accounting APIs are some of the hardest categories to support well.",{"type":17,"tag":239,"props":83606,"children":83608},{"id":83607},"different-financial-data-models",[83609],{"type":23,"value":83610},"Different financial data models",{"type":17,"tag":29,"props":83612,"children":83613},{},[83614],{"type":23,"value":31287},{"type":17,"tag":80,"props":83616,"children":83617},{},[83618,83622,83626,83630,83634,83639],{"type":17,"tag":84,"props":83619,"children":83620},{},[83621],{"type":23,"value":36676},{"type":17,"tag":84,"props":83623,"children":83624},{},[83625],{"type":23,"value":82475},{"type":17,"tag":84,"props":83627,"children":83628},{},[83629],{"type":23,"value":82494},{"type":17,"tag":84,"props":83631,"children":83632},{},[83633],{"type":23,"value":41352},{"type":17,"tag":84,"props":83635,"children":83636},{},[83637],{"type":23,"value":83638},"tax",{"type":17,"tag":84,"props":83640,"children":83641},{},[83642],{"type":23,"value":82739},{"type":17,"tag":29,"props":83644,"children":83645},{},[83646],{"type":23,"value":23797},{"type":17,"tag":29,"props":83648,"children":83649},{},[83650],{"type":23,"value":83651},"Even 'simple' objects like contacts can vary based on whether the platform treats them as customers, vendors, suppliers, or all of the above.",{"type":17,"tag":239,"props":83653,"children":83655},{"id":83654},"authentication-complexity",[83656],{"type":23,"value":83657},"Authentication complexity",{"type":17,"tag":29,"props":83659,"children":83660},{},[83661,83662,83666],{"type":23,"value":31329},{"type":17,"tag":133,"props":83663,"children":83664},{"href":779},[83665],{"type":23,"value":782},{"type":23,"value":83667},", some use API keys, and some require more enterprise-specific setup.",{"type":17,"tag":29,"props":83669,"children":83670},{},[83671],{"type":23,"value":83672},"Supporting many accounting APIs means handling many auth patterns.",{"type":17,"tag":239,"props":83674,"children":83676},{"id":83675},"tax-and-regional-differences",[83677],{"type":23,"value":83678},"Tax and regional differences",{"type":17,"tag":29,"props":83680,"children":83681},{},[83682],{"type":23,"value":83683},"Tax handling is not universal. VAT, GST, US sales tax, exemptions, and provider-specific tax objects all create complexity.",{"type":17,"tag":239,"props":83685,"children":83687},{"id":83686},"reports-are-not-standardized",[83688],{"type":23,"value":83689},"Reports are not standardized",{"type":17,"tag":29,"props":83691,"children":83692},{},[83693],{"type":23,"value":83694},"Balance sheet, P&L, trial balance, and cash flow reports are exposed differently across systems.",{"type":17,"tag":239,"props":83696,"children":83698},{"id":83697},"real-time-requirements",[83699],{"type":23,"value":83700},"Real-time requirements",{"type":17,"tag":29,"props":83702,"children":83703},{},[83704],{"type":23,"value":83705},"For finance, stale data creates real operational problems. A nightly sync might be acceptable for some dashboards, but not for approvals, payment collection, or reconciliation workflows.",{"type":17,"tag":68,"props":83707,"children":83709},{"id":83708},"the-role-of-unified-accounting-apis",[83710],{"type":23,"value":83711},"The role of Unified Accounting APIs",{"type":17,"tag":29,"props":83713,"children":83714},{},[83715],{"type":23,"value":83716},"This is where Unified Accounting APIs become valuable.",{"type":17,"tag":29,"props":83718,"children":83719},{},[83720],{"type":23,"value":83721},"Instead of building separate integrations for QuickBooks, Xero, FreshBooks, NetSuite, Sage, Zoho Books, and others, a Unified API provides one normalized interface across platforms.",{"type":17,"tag":29,"props":83723,"children":83724},{},[83725],{"type":23,"value":5804},{"type":17,"tag":80,"props":83727,"children":83728},{},[83729,83733,83737,83741,83745],{"type":17,"tag":84,"props":83730,"children":83731},{},[83732],{"type":23,"value":23897},{"type":17,"tag":84,"props":83734,"children":83735},{},[83736],{"type":23,"value":38796},{"type":17,"tag":84,"props":83738,"children":83739},{},[83740],{"type":23,"value":41586},{"type":17,"tag":84,"props":83742,"children":83743},{},[83744],{"type":23,"value":38806},{"type":17,"tag":84,"props":83746,"children":83747},{},[83748],{"type":23,"value":23912},{"type":17,"tag":29,"props":83750,"children":83751},{},[83752],{"type":23,"value":83753},"For accounting use cases, this is especially valuable because the object model is broad and operationally important.",{"type":17,"tag":68,"props":83755,"children":83757},{"id":83756},"build-once-with-the-unified-accounting-api",[83758],{"type":23,"value":83759},"Build once with the Unified Accounting API",{"type":17,"tag":29,"props":83761,"children":83762},{},[83763,83764,83771,83772,83777],{"type":23,"value":6712},{"type":17,"tag":133,"props":83765,"children":83768},{"href":83766,"rel":83767},"https://unified.to/accounting",[214],[83769],{"type":23,"value":83770},"Unified Accounting API",{"type":23,"value":23936},{"type":17,"tag":48,"props":83773,"children":83774},{},[83775],{"type":23,"value":83776},"42+ accounting integrations",{"type":23,"value":56828},{"type":17,"tag":29,"props":83779,"children":83780},{},[83781],{"type":23,"value":83782},"It supports major systems including QuickBooks, Xero, FreshBooks, NetSuite, Sage, Zoho Books, Bill.com, Concur, and more.",{"type":17,"tag":239,"props":83784,"children":83786},{"id":83785},"unified-accounting-objects",[83787],{"type":23,"value":83788},"Unified Accounting objects",{"type":17,"tag":29,"props":83790,"children":83791},{},[83792],{"type":23,"value":83793},"Unified supports standardized financial objects such as:",{"type":17,"tag":80,"props":83795,"children":83796},{},[83797,83802,83806,83811,83815,83819,83824,83829,83834,83838,83843,83848,83853,83857,83862,83867,83872,83876],{"type":17,"tag":84,"props":83798,"children":83799},{},[83800],{"type":23,"value":83801},"Accounts",{"type":17,"tag":84,"props":83803,"children":83804},{},[83805],{"type":23,"value":6718},{"type":17,"tag":84,"props":83807,"children":83808},{},[83809],{"type":23,"value":83810},"Transactions",{"type":17,"tag":84,"props":83812,"children":83813},{},[83814],{"type":23,"value":31619},{"type":17,"tag":84,"props":83816,"children":83817},{},[83818],{"type":23,"value":70733},{"type":17,"tag":84,"props":83820,"children":83821},{},[83822],{"type":23,"value":83823},"Bills",{"type":17,"tag":84,"props":83825,"children":83826},{},[83827],{"type":23,"value":83828},"Credit Memos",{"type":17,"tag":84,"props":83830,"children":83831},{},[83832],{"type":23,"value":83833},"Tax Rates",{"type":17,"tag":84,"props":83835,"children":83836},{},[83837],{"type":23,"value":41703},{"type":17,"tag":84,"props":83839,"children":83840},{},[83841],{"type":23,"value":83842},"Orders",{"type":17,"tag":84,"props":83844,"children":83845},{},[83846],{"type":23,"value":83847},"Purchase Orders",{"type":17,"tag":84,"props":83849,"children":83850},{},[83851],{"type":23,"value":83852},"Sales Orders",{"type":17,"tag":84,"props":83854,"children":83855},{},[83856],{"type":23,"value":41738},{"type":17,"tag":84,"props":83858,"children":83859},{},[83860],{"type":23,"value":83861},"Balance Sheets",{"type":17,"tag":84,"props":83863,"children":83864},{},[83865],{"type":23,"value":83866},"Trial Balances",{"type":17,"tag":84,"props":83868,"children":83869},{},[83870],{"type":23,"value":83871},"Cash Flows",{"type":17,"tag":84,"props":83873,"children":83874},{},[83875],{"type":23,"value":32754},{"type":17,"tag":84,"props":83877,"children":83878},{},[83879],{"type":23,"value":83880},"Expenses",{"type":17,"tag":29,"props":83882,"children":83883},{},[83884],{"type":23,"value":83885},"This is what makes it useful not just for simple invoicing integrations, but for real product features across financial workflows.",{"type":17,"tag":239,"props":83887,"children":83888},{"id":24049},[83889],{"type":23,"value":24052},{"type":17,"tag":29,"props":83891,"children":83892},{},[83893],{"type":23,"value":83894},"Most platforms in this category still rely on:",{"type":17,"tag":80,"props":83896,"children":83897},{},[83898,83902,83906],{"type":17,"tag":84,"props":83899,"children":83900},{},[83901],{"type":23,"value":32808},{"type":17,"tag":84,"props":83903,"children":83904},{},[83905],{"type":23,"value":32803},{"type":17,"tag":84,"props":83907,"children":83908},{},[83909],{"type":23,"value":83910},"shallow schemas",{"type":17,"tag":29,"props":83912,"children":83913},{},[83914,83915,83919],{"type":23,"value":24080},{"type":17,"tag":48,"props":83916,"children":83917},{},[83918],{"type":23,"value":289},{"type":23,"value":54},{"type":17,"tag":29,"props":83921,"children":83922},{},[83923],{"type":23,"value":5804},{"type":17,"tag":80,"props":83925,"children":83926},{},[83927,83931,83936,83941],{"type":17,"tag":84,"props":83928,"children":83929},{},[83930],{"type":23,"value":59937},{"type":17,"tag":84,"props":83932,"children":83933},{},[83934],{"type":23,"value":83935},"there is no stale cache layer",{"type":17,"tag":84,"props":83937,"children":83938},{},[83939],{"type":23,"value":83940},"requests are read and write",{"type":17,"tag":84,"props":83942,"children":83943},{},[83944],{"type":23,"value":83945},"native and virtual webhooks support real-time updates",{"type":17,"tag":29,"props":83947,"children":83948},{},[83949,83950,83954],{"type":23,"value":24117},{"type":17,"tag":48,"props":83951,"children":83952},{},[83953],{"type":23,"value":24122},{"type":23,"value":83955},", so customer financial data is not stored at rest by the integration layer.",{"type":17,"tag":29,"props":83957,"children":83958},{},[83959],{"type":23,"value":83960},"For products dealing with sensitive financial data, that matters.",{"type":17,"tag":239,"props":83962,"children":83963},{"id":11390},[83964],{"type":23,"value":11393},{"type":17,"tag":29,"props":83966,"children":83967},{},[83968],{"type":23,"value":24140},{"type":17,"tag":80,"props":83970,"children":83971},{},[83972,83977,83982,83987,83992,83997,84002],{"type":17,"tag":84,"props":83973,"children":83974},{},[83975],{"type":23,"value":83976},"live financial dashboards",{"type":17,"tag":84,"props":83978,"children":83979},{},[83980],{"type":23,"value":83981},"invoice and bill automation",{"type":17,"tag":84,"props":83983,"children":83984},{},[83985],{"type":23,"value":83986},"expense management workflows",{"type":17,"tag":84,"props":83988,"children":83989},{},[83990],{"type":23,"value":83991},"accounting reconciliation flows",{"type":17,"tag":84,"props":83993,"children":83994},{},[83995],{"type":23,"value":83996},"AI-powered finance assistants",{"type":17,"tag":84,"props":83998,"children":83999},{},[84000],{"type":23,"value":84001},"e-commerce + accounting sync",{"type":17,"tag":84,"props":84003,"children":84004},{},[84005],{"type":23,"value":84006},"multi-system financial reporting",{"type":17,"tag":29,"props":84008,"children":84009},{},[84010],{"type":23,"value":84011},"without building and maintaining 10+ separate accounting integrations.",{"type":17,"tag":68,"props":84013,"children":84015},{"id":84014},"why-not-just-build-each-accounting-integration-yourself",[84016],{"type":23,"value":84017},"Why not just build each accounting integration yourself?",{"type":17,"tag":29,"props":84019,"children":84020},{},[84021],{"type":23,"value":84022},"You can, but the cost compounds quickly.",{"type":17,"tag":29,"props":84024,"children":84025},{},[84026],{"type":23,"value":84027},"For every new accounting platform, you take on:",{"type":17,"tag":80,"props":84029,"children":84030},{},[84031,84036,84041,84046,84051,84056],{"type":17,"tag":84,"props":84032,"children":84033},{},[84034],{"type":23,"value":84035},"new OAuth flows",{"type":17,"tag":84,"props":84037,"children":84038},{},[84039],{"type":23,"value":84040},"new schemas",{"type":17,"tag":84,"props":84042,"children":84043},{},[84044],{"type":23,"value":84045},"new rate limit behavior",{"type":17,"tag":84,"props":84047,"children":84048},{},[84049],{"type":23,"value":84050},"new maintenance work",{"type":17,"tag":84,"props":84052,"children":84053},{},[84054],{"type":23,"value":84055},"new edge cases",{"type":17,"tag":84,"props":84057,"children":84058},{},[84059],{"type":23,"value":84060},"new debugging overhead",{"type":17,"tag":29,"props":84062,"children":84063},{},[84064],{"type":23,"value":84065},"Accounting is one of the categories where this gets painful fast because the data model is broad and important.",{"type":17,"tag":29,"props":84067,"children":84068},{},[84069],{"type":23,"value":84070},"A Unified API removes most of that overhead while keeping the product experience consistent.",{"type":17,"tag":68,"props":84072,"children":84073},{"id":1552},[84074],{"type":23,"value":1555},{"type":17,"tag":29,"props":84076,"children":84077},{},[84078],{"type":23,"value":84079},"Accounting APIs are foundational for many SaaS products, but they are not easy to support at scale.",{"type":17,"tag":29,"props":84081,"children":84082},{},[84083],{"type":23,"value":84084},"If your customers use different accounting systems, building and maintaining every integration directly will eventually slow down product velocity and increase operational overhead.",{"type":17,"tag":29,"props":84086,"children":84087},{},[84088],{"type":23,"value":84089},"That is why more SaaS teams are moving toward Unified Accounting APIs.",{"type":17,"tag":29,"props":84091,"children":84092},{},[84093,84095,84100],{"type":23,"value":84094},"If you need real-time, read/write access to accounting data across QuickBooks, Xero, FreshBooks, NetSuite, and many more systems, a platform like ",{"type":17,"tag":133,"props":84096,"children":84098},{"href":212,"rel":84097},[214],[84099],{"type":23,"value":217},{"type":23,"value":84101}," gives you a much faster and more scalable path.",{"type":17,"tag":29,"props":84103,"children":84104},{},[84105,84106],{"type":23,"value":1609},{"type":17,"tag":133,"props":84107,"children":84109},{"href":84108},"/31e6207b8384803eb53fd24ea5ffab56",[84110],{"type":23,"value":1616},{"type":17,"tag":29,"props":84112,"children":84113},{},[84114,84115],{"type":23,"value":1609},{"type":17,"tag":133,"props":84116,"children":84117},{"href":84108},[84118],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":84120},[84121,84122,84123,84140,84141,84148,84149,84154,84155],{"id":82451,"depth":1629,"text":82454},{"id":82564,"depth":1629,"text":82567},{"id":82679,"depth":1629,"text":82682,"children":84124},[84125,84126,84127,84128,84129,84130,84131,84132,84133,84134,84135,84136,84137,84138,84139],{"id":82690,"depth":1635,"text":82693},{"id":82769,"depth":1635,"text":82772},{"id":82852,"depth":1635,"text":82855},{"id":82926,"depth":1635,"text":82929},{"id":82981,"depth":1635,"text":82984},{"id":83029,"depth":1635,"text":83032},{"id":83080,"depth":1635,"text":83083},{"id":83133,"depth":1635,"text":83136},{"id":83179,"depth":1635,"text":83182},{"id":83236,"depth":1635,"text":83239},{"id":83285,"depth":1635,"text":83288},{"id":83311,"depth":1635,"text":83314},{"id":83362,"depth":1635,"text":83365},{"id":83416,"depth":1635,"text":83419},{"id":83458,"depth":1635,"text":83461},{"id":83503,"depth":1629,"text":83506},{"id":83596,"depth":1629,"text":83599,"children":84142},[84143,84144,84145,84146,84147],{"id":83607,"depth":1635,"text":83610},{"id":83654,"depth":1635,"text":83657},{"id":83675,"depth":1635,"text":83678},{"id":83686,"depth":1635,"text":83689},{"id":83697,"depth":1635,"text":83700},{"id":83708,"depth":1629,"text":83711},{"id":83756,"depth":1629,"text":83759,"children":84150},[84151,84152,84153],{"id":83785,"depth":1635,"text":83788},{"id":24049,"depth":1635,"text":24052},{"id":11390,"depth":1635,"text":11393},{"id":84014,"depth":1629,"text":84017},{"id":1552,"depth":1629,"text":1555},"content:blog:15_accounting_apis_to_integrate_with_in_2026_quickbooks_xero_freshbooks_and_unified_accounting_apis.md","blog/15_accounting_apis_to_integrate_with_in_2026_quickbooks_xero_freshbooks_and_unified_accounting_apis.md","blog/15_accounting_apis_to_integrate_with_in_2026_quickbooks_xero_freshbooks_and_unified_accounting_apis",{"_path":84160,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":84161,"description":84162,"img":84163,"date":84164,"tag":12,"body":84165,"_type":1677,"_id":85332,"_source":1679,"_file":85333,"_stem":85334,"_extension":1682},"/blog/best_ai_agent_integration_platforms_to_consider_in_2026","Best AI Agent Integration Platforms to Consider in 2026","AI agent integration platforms help AI products connect agents to customer integrations safely and reliably.","https://s3.us-east-2.amazonaws.com/unified-article-images/best_ai_agent_integration_platforms_to_consider_in_2026-icon.png","2026-03-09T19:48:00.000Z",{"type":14,"children":84166,"toc":85295},[84167,84172,84175,84182,84186,84191,84196,84202,84207,84212,84246,84251,84259,84265,84270,84276,84281,84286,84292,84297,84302,84308,84313,84318,84324,84329,84363,84368,84374,84383,84388,84394,84399,84405,84410,84416,84421,84427,84432,84438,84443,84449,84454,84459,84465,84472,84493,84505,84513,84531,84539,84557,84562,84567,84573,84580,84599,84604,84612,84619,84637,84644,84657,84661,84673,84679,84686,84706,84716,84723,84741,84748,84766,84770,84782,84788,84793,84799,84817,84823,84841,84847,84875,84879,84884,84889,84902,84907,84913,84918,84923,84929,84934,84939,84962,84968,84973,84978,84983,85006,85012,85017,85022,85028,85033,85038,85043,85049,85054,85154,85160,85165,85170,85198,85203,85209,85214,85252,85256,85279,85287],{"type":17,"tag":18,"props":84168,"children":84170},{"id":84169},"best-ai-agent-integration-platforms-to-consider-in-2026",[84171],{"type":23,"value":84161},{"type":17,"tag":25,"props":84173,"children":84174},{},[],{"type":17,"tag":29,"props":84176,"children":84177},{},[84178],{"type":17,"tag":33,"props":84179,"children":84180},{},[84181],{"type":23,"value":37},{"type":17,"tag":29,"props":84183,"children":84184},{},[84185],{"type":23,"value":84162},{"type":17,"tag":29,"props":84187,"children":84188},{},[84189],{"type":23,"value":84190},"At a minimum, they handle authorization, tool execution, logging, and ongoing connector maintenance. The reason they matter is simple: model quality is no longer the main bottleneck. The harder problem is giving agents structured, authorized access to customer data and actions across APIs your product does not control.",{"type":17,"tag":29,"props":84192,"children":84193},{},[84194],{"type":23,"value":84195},"For B2B SaaS teams, this is now an architecture decision. The platform you choose affects latency, security scope, observability, and how much custom integration logic your team still has to maintain.",{"type":17,"tag":68,"props":84197,"children":84199},{"id":84198},"what-is-an-ai-agent-integration-platform",[84200],{"type":23,"value":84201},"What is an AI agent integration platform?",{"type":17,"tag":29,"props":84203,"children":84204},{},[84205],{"type":23,"value":84206},"An AI agent integration platform sits between your AI system and third-party APIs.",{"type":17,"tag":29,"props":84208,"children":84209},{},[84210],{"type":23,"value":84211},"It handles things like:",{"type":17,"tag":80,"props":84213,"children":84214},{},[84215,84226,84231,84236,84241],{"type":17,"tag":84,"props":84216,"children":84217},{},[84218,84220,84224],{"type":23,"value":84219},"Authorization (",{"type":17,"tag":133,"props":84221,"children":84222},{"href":779},[84223],{"type":23,"value":782},{"type":23,"value":84225},", tokens, scopes)",{"type":17,"tag":84,"props":84227,"children":84228},{},[84229],{"type":23,"value":84230},"Executing actions across APIs",{"type":17,"tag":84,"props":84232,"children":84233},{},[84234],{"type":23,"value":84235},"Normalizing or structuring access to data",{"type":17,"tag":84,"props":84237,"children":84238},{},[84239],{"type":23,"value":84240},"Logging and debugging requests",{"type":17,"tag":84,"props":84242,"children":84243},{},[84244],{"type":23,"value":84245},"Maintaining integrations over time",{"type":17,"tag":29,"props":84247,"children":84248},{},[84249],{"type":23,"value":84250},"The goal is simple:",{"type":17,"tag":3414,"props":84252,"children":84253},{},[84254],{"type":17,"tag":29,"props":84255,"children":84256},{},[84257],{"type":23,"value":84258},"Let your agent safely read and write data across customer systems — without your team building and maintaining integrations for every API.",{"type":17,"tag":68,"props":84260,"children":84262},{"id":84261},"what-should-teams-look-for",[84263],{"type":23,"value":84264},"What should teams look for?",{"type":17,"tag":29,"props":84266,"children":84267},{},[84268],{"type":23,"value":84269},"Before comparing options, it helps to separate what actually matters from what is just packaging.",{"type":17,"tag":239,"props":84271,"children":84273},{"id":84272},"_1-authorization",[84274],{"type":23,"value":84275},"1. Authorization",{"type":17,"tag":29,"props":84277,"children":84278},{},[84279],{"type":23,"value":84280},"This is still the hardest part.",{"type":17,"tag":29,"props":84282,"children":84283},{},[84284],{"type":23,"value":84285},"Every integration has its own OAuth behavior, token model, API key requirements, and scope rules. If the platform does not simplify authorization well, your team will still end up owning a large amount of brittle integration code. Unified's positioning material is explicit that authorization is often the hardest part of integrations because every vendor has different token flows, scopes, and permission models.",{"type":17,"tag":239,"props":84287,"children":84289},{"id":84288},"_2-structured-integration-access",[84290],{"type":23,"value":84291},"2. Structured integration access",{"type":17,"tag":29,"props":84293,"children":84294},{},[84295],{"type":23,"value":84296},"An agent does not need a giant list of unrelated actions. It needs access to structured objects and predictable endpoints.",{"type":17,"tag":29,"props":84298,"children":84299},{},[84300],{"type":23,"value":84301},"That matters because AI products are rarely built around one isolated action. They usually need repeated access across categories like CRM, ATS, storage, ticketing, messaging, and calendar. Unified's architecture is built around category-scoped APIs and unified data models so teams can standardize objects and mapped associations across integrations.",{"type":17,"tag":239,"props":84303,"children":84305},{"id":84304},"_3-real-time-access-vs-stored-copies",[84306],{"type":23,"value":84307},"3. Real-time access vs stored copies",{"type":17,"tag":29,"props":84309,"children":84310},{},[84311],{"type":23,"value":84312},"For agent use cases, stored data introduces risk.",{"type":17,"tag":29,"props":84314,"children":84315},{},[84316],{"type":23,"value":84317},"If an agent is reading a cached copy of a record, or acting on delayed sync data, product behavior degrades fast. Unified's materials frame this as an architectural distinction: requests are fetched directly from the source API, with no caching or storage of customer data, which reduces stale records and compliance scope.",{"type":17,"tag":239,"props":84319,"children":84321},{"id":84320},"_4-observability",[84322],{"type":23,"value":84323},"4. Observability",{"type":17,"tag":29,"props":84325,"children":84326},{},[84327],{"type":23,"value":84328},"If an agent call fails, the product team needs to know:",{"type":17,"tag":80,"props":84330,"children":84331},{},[84332,84337,84342,84347,84352],{"type":17,"tag":84,"props":84333,"children":84334},{},[84335],{"type":23,"value":84336},"which integration failed",{"type":17,"tag":84,"props":84338,"children":84339},{},[84340],{"type":23,"value":84341},"which user or connection triggered it",{"type":17,"tag":84,"props":84343,"children":84344},{},[84345],{"type":23,"value":84346},"which API call ran",{"type":17,"tag":84,"props":84348,"children":84349},{},[84350],{"type":23,"value":84351},"what came back",{"type":17,"tag":84,"props":84353,"children":84354},{},[84355,84357,84361],{"type":23,"value":84356},"whether the issue was auth, schema, ",{"type":17,"tag":133,"props":84358,"children":84359},{"href":135},[84360],{"type":23,"value":138},{"type":23,"value":84362},", or bad inputs",{"type":17,"tag":29,"props":84364,"children":84365},{},[84366],{"type":23,"value":84367},"Without this, teams cannot debug production behavior or trust agent actions at scale.",{"type":17,"tag":239,"props":84369,"children":84371},{"id":84370},"_5-support-beyond-mcp",[84372],{"type":23,"value":84373},"5. Support beyond MCP",{"type":17,"tag":29,"props":84375,"children":84376},{},[84377,84381],{"type":17,"tag":133,"props":84378,"children":84379},{"href":326},[84380],{"type":23,"value":329},{"type":23,"value":84382}," matters, but it is not the only requirement.",{"type":17,"tag":29,"props":84384,"children":84385},{},[84386],{"type":23,"value":84387},"Most B2B SaaS teams do not just need agents to call actions. They also need traditional product integrations: API reads, writes, event delivery, database sync, and support for customer-facing application features. Unified supports multiple delivery methods on the same unified models: API, webhooks, database sync, and MCP.",{"type":17,"tag":68,"props":84389,"children":84391},{"id":84390},"the-main-types-of-ai-agent-integration-platforms",[84392],{"type":23,"value":84393},"The main types of AI agent integration platforms",{"type":17,"tag":29,"props":84395,"children":84396},{},[84397],{"type":23,"value":84398},"Not all platforms in this category solve the same problem. In practice, most fall into one of four groups.",{"type":17,"tag":239,"props":84400,"children":84402},{"id":84401},"mcp-first-action-layers",[84403],{"type":23,"value":84404},"MCP-first action layers",{"type":17,"tag":29,"props":84406,"children":84407},{},[84408],{"type":23,"value":84409},"These are designed primarily around model-triggered actions. They are useful when your core requirement is exposing a set of callable actions to an agent.",{"type":17,"tag":239,"props":84411,"children":84413},{"id":84412},"unified-api-platforms-with-agent-support",[84414],{"type":23,"value":84415},"Unified API platforms with agent support",{"type":17,"tag":29,"props":84417,"children":84418},{},[84419],{"type":23,"value":84420},"These platforms were built to support product integrations across categories and are now also extending into agent use cases. This model is often stronger for B2B SaaS products because the same integration layer can support both standard product features and agent behavior.",{"type":17,"tag":239,"props":84422,"children":84424},{"id":84423},"embedded-automation-platforms",[84425],{"type":23,"value":84426},"Embedded automation platforms",{"type":17,"tag":29,"props":84428,"children":84429},{},[84430],{"type":23,"value":84431},"These are usually stronger for recipe-style automation and internal process logic. They can support agent scenarios, but the architecture is often optimized around automation builders rather than product-grade integration infrastructure.",{"type":17,"tag":239,"props":84433,"children":84435},{"id":84434},"in-house-integration-layers",[84436],{"type":23,"value":84437},"In-house integration layers",{"type":17,"tag":29,"props":84439,"children":84440},{},[84441],{"type":23,"value":84442},"Some companies build their own stack. This gives maximum control, but it also means owning auth handling, mapping logic, monitoring, retries, connector maintenance, and schema changes.",{"type":17,"tag":68,"props":84444,"children":84446},{"id":84445},"the-3-types-of-ai-agent-integration-platforms",[84447],{"type":23,"value":84448},"The 3 types of AI agent integration platforms",{"type":17,"tag":29,"props":84450,"children":84451},{},[84452],{"type":23,"value":84453},"Most tools in this space fall into one of three buckets.",{"type":17,"tag":29,"props":84455,"children":84456},{},[84457],{"type":23,"value":84458},"Understanding this is more important than comparing feature lists.",{"type":17,"tag":239,"props":84460,"children":84462},{"id":84461},"_1-action-first-mcp-native-platforms",[84463],{"type":23,"value":84464},"1. Action-first / MCP-native platforms",{"type":17,"tag":29,"props":84466,"children":84467},{},[84468],{"type":17,"tag":48,"props":84469,"children":84470},{},[84471],{"type":23,"value":377},{"type":17,"tag":80,"props":84473,"children":84474},{},[84475,84483],{"type":17,"tag":84,"props":84476,"children":84477},{},[84478],{"type":17,"tag":133,"props":84479,"children":84481},{"href":84480},"/31e6207b838480a4bdbffd64c840a95a",[84482],{"type":23,"value":1015},{"type":17,"tag":84,"props":84484,"children":84485},{},[84486],{"type":17,"tag":133,"props":84487,"children":84490},{"href":84488,"rel":84489},"https://www.arcade.dev/",[214],[84491],{"type":23,"value":84492},"Arcade",{"type":17,"tag":29,"props":84494,"children":84495},{},[84496,84498,84503],{"type":23,"value":84497},"These platforms are built around exposing ",{"type":17,"tag":48,"props":84499,"children":84500},{},[84501],{"type":23,"value":84502},"tools/actions",{"type":23,"value":84504}," that agents can call.",{"type":17,"tag":29,"props":84506,"children":84507},{},[84508],{"type":17,"tag":48,"props":84509,"children":84510},{},[84511],{"type":23,"value":84512},"Strengths:",{"type":17,"tag":80,"props":84514,"children":84515},{},[84516,84521,84526],{"type":17,"tag":84,"props":84517,"children":84518},{},[84519],{"type":23,"value":84520},"Fast to get started",{"type":17,"tag":84,"props":84522,"children":84523},{},[84524],{"type":23,"value":84525},"Designed specifically for agent execution",{"type":17,"tag":84,"props":84527,"children":84528},{},[84529],{"type":23,"value":84530},"Good authorization abstractions",{"type":17,"tag":29,"props":84532,"children":84533},{},[84534],{"type":17,"tag":48,"props":84535,"children":84536},{},[84537],{"type":23,"value":84538},"Limitations:",{"type":17,"tag":80,"props":84540,"children":84541},{},[84542,84547,84552],{"type":17,"tag":84,"props":84543,"children":84544},{},[84545],{"type":23,"value":84546},"Actions are often not structured around consistent data models",{"type":17,"tag":84,"props":84548,"children":84549},{},[84550],{"type":23,"value":84551},"Harder to reuse for non-agent product features",{"type":17,"tag":84,"props":84553,"children":84554},{},[84555],{"type":23,"value":84556},"Less suited for complex, category-wide integrations (e.g. 'support all CRMs')",{"type":17,"tag":29,"props":84558,"children":84559},{},[84560],{"type":23,"value":84561},"👉 Best when:",{"type":17,"tag":29,"props":84563,"children":84564},{},[84565],{"type":23,"value":84566},"You're building agent workflows, not a full integration layer inside your product.",{"type":17,"tag":239,"props":84568,"children":84570},{"id":84569},"_2-unified-api-platforms-with-agent-support",[84571],{"type":23,"value":84572},"2. Unified API platforms with agent support",{"type":17,"tag":29,"props":84574,"children":84575},{},[84576],{"type":17,"tag":48,"props":84577,"children":84578},{},[84579],{"type":23,"value":377},{"type":17,"tag":80,"props":84581,"children":84582},{},[84583,84591],{"type":17,"tag":84,"props":84584,"children":84585},{},[84586],{"type":17,"tag":133,"props":84587,"children":84589},{"href":42620,"rel":84588},[214],[84590],{"type":23,"value":217},{"type":17,"tag":84,"props":84592,"children":84593},{},[84594],{"type":17,"tag":133,"props":84595,"children":84597},{"href":81639,"rel":84596},[214],[84598],{"type":23,"value":227},{"type":17,"tag":29,"props":84600,"children":84601},{},[84602],{"type":23,"value":84603},"These platforms start with a different abstraction:",{"type":17,"tag":3414,"props":84605,"children":84606},{},[84607],{"type":17,"tag":29,"props":84608,"children":84609},{},[84610],{"type":23,"value":84611},"Normalize entire categories of APIs (CRM, ATS, ticketing, etc.) into a unified model — and then expose that to both your product and your agents.",{"type":17,"tag":29,"props":84613,"children":84614},{},[84615],{"type":17,"tag":48,"props":84616,"children":84617},{},[84618],{"type":23,"value":84512},{"type":17,"tag":80,"props":84620,"children":84621},{},[84622,84627,84632],{"type":17,"tag":84,"props":84623,"children":84624},{},[84625],{"type":23,"value":84626},"One integration layer for both product features and AI agents",{"type":17,"tag":84,"props":84628,"children":84629},{},[84630],{"type":23,"value":84631},"Structured data models (not just actions)",{"type":17,"tag":84,"props":84633,"children":84634},{},[84635],{"type":23,"value":84636},"Easier to support many integrations without custom code per API",{"type":17,"tag":29,"props":84638,"children":84639},{},[84640],{"type":17,"tag":48,"props":84641,"children":84642},{},[84643],{"type":23,"value":84538},{"type":17,"tag":80,"props":84645,"children":84646},{},[84647,84652],{"type":17,"tag":84,"props":84648,"children":84649},{},[84650],{"type":23,"value":84651},"More upfront modeling decisions",{"type":17,"tag":84,"props":84653,"children":84654},{},[84655],{"type":23,"value":84656},"Requires thinking in categories, not individual APIs",{"type":17,"tag":29,"props":84658,"children":84659},{},[84660],{"type":23,"value":84561},{"type":17,"tag":29,"props":84662,"children":84663},{},[84664,84666,84671],{"type":23,"value":84665},"You're building a ",{"type":17,"tag":48,"props":84667,"children":84668},{},[84669],{"type":23,"value":84670},"B2B SaaS product",{"type":23,"value":84672}," that needs integrations as part of the core experience.",{"type":17,"tag":239,"props":84674,"children":84676},{"id":84675},"_3-automation-ipaas-platforms",[84677],{"type":23,"value":84678},"3. Automation / iPaaS platforms",{"type":17,"tag":29,"props":84680,"children":84681},{},[84682],{"type":17,"tag":48,"props":84683,"children":84684},{},[84685],{"type":23,"value":377},{"type":17,"tag":80,"props":84687,"children":84688},{},[84689,84697],{"type":17,"tag":84,"props":84690,"children":84691},{},[84692],{"type":17,"tag":133,"props":84693,"children":84695},{"href":386,"rel":84694},[214],[84696],{"type":23,"value":390},{"type":17,"tag":84,"props":84698,"children":84699},{},[84700],{"type":17,"tag":133,"props":84701,"children":84704},{"href":84702,"rel":84703},"http://tray.iohttps//tray.io/",[214],[84705],{"type":23,"value":571},{"type":17,"tag":29,"props":84707,"children":84708},{},[84709,84711,84715],{"type":23,"value":84710},"These platforms are built around ",{"type":17,"tag":48,"props":84712,"children":84713},{},[84714],{"type":23,"value":424},{"type":23,"value":372},{"type":17,"tag":29,"props":84717,"children":84718},{},[84719],{"type":17,"tag":48,"props":84720,"children":84721},{},[84722],{"type":23,"value":84512},{"type":17,"tag":80,"props":84724,"children":84725},{},[84726,84731,84736],{"type":17,"tag":84,"props":84727,"children":84728},{},[84729],{"type":23,"value":84730},"Powerful for internal workflows",{"type":17,"tag":84,"props":84732,"children":84733},{},[84734],{"type":23,"value":84735},"Visual builders and automation recipes",{"type":17,"tag":84,"props":84737,"children":84738},{},[84739],{"type":23,"value":84740},"Strong governance features",{"type":17,"tag":29,"props":84742,"children":84743},{},[84744],{"type":17,"tag":48,"props":84745,"children":84746},{},[84747],{"type":23,"value":84538},{"type":17,"tag":80,"props":84749,"children":84750},{},[84751,84756,84761],{"type":17,"tag":84,"props":84752,"children":84753},{},[84754],{"type":23,"value":84755},"Not designed for product-facing integrations",{"type":17,"tag":84,"props":84757,"children":84758},{},[84759],{"type":23,"value":84760},"Harder to embed cleanly into SaaS UX",{"type":17,"tag":84,"props":84762,"children":84763},{},[84764],{"type":23,"value":84765},"Less control for engineering teams",{"type":17,"tag":29,"props":84767,"children":84768},{},[84769],{"type":23,"value":84561},{"type":17,"tag":29,"props":84771,"children":84772},{},[84773,84775,84780],{"type":23,"value":84774},"You're solving ",{"type":17,"tag":48,"props":84776,"children":84777},{},[84778],{"type":23,"value":84779},"internal automation",{"type":23,"value":84781},", not building integrations into your product.",{"type":17,"tag":68,"props":84783,"children":84785},{"id":84784},"how-to-choose-the-right-platform",[84786],{"type":23,"value":84787},"How to choose the right platform",{"type":17,"tag":29,"props":84789,"children":84790},{},[84791],{"type":23,"value":84792},"Here's the simplest way to decide:",{"type":17,"tag":239,"props":84794,"children":84796},{"id":84795},"choose-an-action-first-platform-composio-arcade-if",[84797],{"type":23,"value":84798},"Choose an action-first platform (Composio, Arcade) if:",{"type":17,"tag":80,"props":84800,"children":84801},{},[84802,84807,84812],{"type":17,"tag":84,"props":84803,"children":84804},{},[84805],{"type":23,"value":84806},"You're building agent workflows quickly",{"type":17,"tag":84,"props":84808,"children":84809},{},[84810],{"type":23,"value":84811},"You don't need a full integration layer",{"type":17,"tag":84,"props":84813,"children":84814},{},[84815],{"type":23,"value":84816},"Your product doesn't depend heavily on integrations",{"type":17,"tag":239,"props":84818,"children":84820},{"id":84819},"choose-an-automation-platform-workato-tray-if",[84821],{"type":23,"value":84822},"Choose an automation platform (Workato, Tray) if:",{"type":17,"tag":80,"props":84824,"children":84825},{},[84826,84831,84836],{"type":17,"tag":84,"props":84827,"children":84828},{},[84829],{"type":23,"value":84830},"Your use case is internal automation",{"type":17,"tag":84,"props":84832,"children":84833},{},[84834],{"type":23,"value":84835},"You want visual workflows and governance",{"type":17,"tag":84,"props":84837,"children":84838},{},[84839],{"type":23,"value":84840},"You're not embedding integrations deeply into your product",{"type":17,"tag":239,"props":84842,"children":84844},{"id":84843},"choose-a-unified-api-platform-unified-if",[84845],{"type":23,"value":84846},"Choose a unified API platform (Unified) if:",{"type":17,"tag":80,"props":84848,"children":84849},{},[84850,84855,84860,84865,84870],{"type":17,"tag":84,"props":84851,"children":84852},{},[84853],{"type":23,"value":84854},"Integrations are part of your product",{"type":17,"tag":84,"props":84856,"children":84857},{},[84858],{"type":23,"value":84859},"You need to support many APIs in a category",{"type":17,"tag":84,"props":84861,"children":84862},{},[84863],{"type":23,"value":84864},"You want one model across all integrations",{"type":17,"tag":84,"props":84866,"children":84867},{},[84868],{"type":23,"value":84869},"You need both product integrations and agent actions",{"type":17,"tag":84,"props":84871,"children":84872},{},[84873],{"type":23,"value":84874},"You want real-time access instead of stored data",{"type":17,"tag":68,"props":84876,"children":84877},{"id":1051},[84878],{"type":23,"value":1054},{"type":17,"tag":29,"props":84880,"children":84881},{},[84882],{"type":23,"value":84883},"Unified is built for B2B SaaS and AI-native product teams. Its positioning is not 'agent actions only.' It is a broader integration architecture that includes a real-time unified API and a unified MCP server.",{"type":17,"tag":29,"props":84885,"children":84886},{},[84887],{"type":23,"value":84888},"That matters because most products need both:",{"type":17,"tag":80,"props":84890,"children":84891},{},[84892,84897],{"type":17,"tag":84,"props":84893,"children":84894},{},[84895],{"type":23,"value":84896},"deterministic application features built on integrations",{"type":17,"tag":84,"props":84898,"children":84899},{},[84900],{"type":23,"value":84901},"agentic behaviors built on the same customer data and actions",{"type":17,"tag":29,"props":84903,"children":84904},{},[84905],{"type":23,"value":84906},"Unified's architecture gives teams both on the same foundation.",{"type":17,"tag":239,"props":84908,"children":84910},{"id":84909},"_1-unified-supports-category-scoped-apis-not-just-isolated-actions",[84911],{"type":23,"value":84912},"1. Unified supports category-scoped APIs, not just isolated actions",{"type":17,"tag":29,"props":84914,"children":84915},{},[84916],{"type":23,"value":84917},"Unified organizes access around categories and unified data models, not disconnected action lists. It standardizes objects and mapped associations across integrations, such as CRM contact, company, and deal, while still supporting custom fields and custom objects where needed.",{"type":17,"tag":29,"props":84919,"children":84920},{},[84921],{"type":23,"value":84922},"For AI products, that means less per-integration logic. Agents can operate against a cleaner, more predictable object structure.",{"type":17,"tag":239,"props":84924,"children":84926},{"id":84925},"_2-unified-is-built-around-real-time-access-with-no-stored-customer-data",[84927],{"type":23,"value":84928},"2. Unified is built around real-time access with no stored customer data",{"type":17,"tag":29,"props":84930,"children":84931},{},[84932],{"type":23,"value":84933},"Unified's positioning is explicit: requests are routed directly to the source API, with no caching or storage of customer data.",{"type":17,"tag":29,"props":84935,"children":84936},{},[84937],{"type":23,"value":84938},"This matters for agent use cases because:",{"type":17,"tag":80,"props":84940,"children":84941},{},[84942,84947,84952,84957],{"type":17,"tag":84,"props":84943,"children":84944},{},[84945],{"type":23,"value":84946},"records are current at execution time",{"type":17,"tag":84,"props":84948,"children":84949},{},[84950],{"type":23,"value":84951},"teams are not acting on delayed copies",{"type":17,"tag":84,"props":84953,"children":84954},{},[84955],{"type":23,"value":84956},"procurement and compliance conversations are simpler",{"type":17,"tag":84,"props":84958,"children":84959},{},[84960],{"type":23,"value":84961},"security scope is reduced because customer records are not stored like a database",{"type":17,"tag":239,"props":84963,"children":84965},{"id":84964},"_3-unified-supports-both-mcp-and-non-agent-product-delivery-patterns",[84966],{"type":23,"value":84967},"3. Unified supports both MCP and non-agent product delivery patterns",{"type":17,"tag":29,"props":84969,"children":84970},{},[84971],{"type":23,"value":84972},"This is one of the clearest separations in the market.",{"type":17,"tag":29,"props":84974,"children":84975},{},[84976],{"type":23,"value":84977},"Many teams evaluating agent platforms are also building standard product integrations. Unified supports multiple delivery methods on the same unified models, including API, webhooks, database sync, and MCP.",{"type":17,"tag":29,"props":84979,"children":84980},{},[84981],{"type":23,"value":84982},"That means the same integration foundation can power:",{"type":17,"tag":80,"props":84984,"children":84985},{},[84986,84991,84996,85001],{"type":17,"tag":84,"props":84987,"children":84988},{},[84989],{"type":23,"value":84990},"an agent that updates a CRM deal",{"type":17,"tag":84,"props":84992,"children":84993},{},[84994],{"type":23,"value":84995},"an application view that retrieves CRM records",{"type":17,"tag":84,"props":84997,"children":84998},{},[84999],{"type":23,"value":85000},"webhook-driven updates into your product",{"type":17,"tag":84,"props":85002,"children":85003},{},[85004],{"type":23,"value":85005},"downstream sync patterns when needed",{"type":17,"tag":239,"props":85007,"children":85009},{"id":85008},"_4-unified-handles-authorization-across-integrations",[85010],{"type":23,"value":85011},"4. Unified handles authorization across integrations",{"type":17,"tag":29,"props":85013,"children":85014},{},[85015],{"type":23,"value":85016},"Unified provides pre-built authorization components and supports OAuth2, API keys, tokens, username/password, and custom models. Its comparison framework also emphasizes that unified authorization removes repeated effort reading vendor docs, debugging edge cases, and maintaining brittle auth code.",{"type":17,"tag":29,"props":85018,"children":85019},{},[85020],{"type":23,"value":85021},"For agent products, this is not a side feature. It is core infrastructure.",{"type":17,"tag":239,"props":85023,"children":85025},{"id":85024},"_5-unified-supports-custom-fields-and-custom-objects",[85026],{"type":23,"value":85027},"5. Unified supports custom fields and custom objects",{"type":17,"tag":29,"props":85029,"children":85030},{},[85031],{"type":23,"value":85032},"A lot of AI agent demos assume every customer uses clean default schemas. That is not how B2B SaaS works in production.",{"type":17,"tag":29,"props":85034,"children":85035},{},[85036],{"type":23,"value":85037},"Unified supports read and write access to custom objects and custom fields via unified models plus passthrough access for cases that fall outside the modeled schema.",{"type":17,"tag":29,"props":85039,"children":85040},{},[85041],{"type":23,"value":85042},"This is especially important in CRM, ATS, and ERP-style environments where customers extend fields heavily.",{"type":17,"tag":68,"props":85044,"children":85046},{"id":85045},"what-should-teams-ask-when-evaluating-ai-agent-integration-platforms",[85047],{"type":23,"value":85048},"What should teams ask when evaluating AI agent integration platforms?",{"type":17,"tag":29,"props":85050,"children":85051},{},[85052],{"type":23,"value":85053},"Here are the questions that matter more than generic feature lists:",{"type":17,"tag":7231,"props":85055,"children":85056},{},[85057,85073],{"type":17,"tag":7235,"props":85058,"children":85059},{},[85060],{"type":17,"tag":7239,"props":85061,"children":85062},{},[85063,85068],{"type":17,"tag":7243,"props":85064,"children":85065},{},[85066],{"type":23,"value":85067},"Question",{"type":17,"tag":7243,"props":85069,"children":85070},{},[85071],{"type":23,"value":85072},"Why it matters",{"type":17,"tag":7259,"props":85074,"children":85075},{},[85076,85089,85102,85115,85128,85141],{"type":17,"tag":7239,"props":85077,"children":85078},{},[85079,85084],{"type":17,"tag":7266,"props":85080,"children":85081},{},[85082],{"type":23,"value":85083},"Does the platform handle authorization across integrations?",{"type":17,"tag":7266,"props":85085,"children":85086},{},[85087],{"type":23,"value":85088},"Otherwise your team still owns the hardest part.",{"type":17,"tag":7239,"props":85090,"children":85091},{},[85092,85097],{"type":17,"tag":7266,"props":85093,"children":85094},{},[85095],{"type":23,"value":85096},"Does it support structured objects or only disconnected actions?",{"type":17,"tag":7266,"props":85098,"children":85099},{},[85100],{"type":23,"value":85101},"Agents need predictable data models.",{"type":17,"tag":7239,"props":85103,"children":85104},{},[85105,85110],{"type":17,"tag":7266,"props":85106,"children":85107},{},[85108],{"type":23,"value":85109},"Does it read from source APIs in real time, or depend on stored copies?",{"type":17,"tag":7266,"props":85111,"children":85112},{},[85113],{"type":23,"value":85114},"This affects latency, correctness, and compliance scope.",{"type":17,"tag":7239,"props":85116,"children":85117},{},[85118,85123],{"type":17,"tag":7266,"props":85119,"children":85120},{},[85121],{"type":23,"value":85122},"Can it support both agent actions and standard product integrations?",{"type":17,"tag":7266,"props":85124,"children":85125},{},[85126],{"type":23,"value":85127},"Most B2B SaaS teams need both.",{"type":17,"tag":7239,"props":85129,"children":85130},{},[85131,85136],{"type":17,"tag":7266,"props":85132,"children":85133},{},[85134],{"type":23,"value":85135},"Does it support custom fields and objects?",{"type":17,"tag":7266,"props":85137,"children":85138},{},[85139],{"type":23,"value":85140},"Enterprise customer data is rarely clean or default.",{"type":17,"tag":7239,"props":85142,"children":85143},{},[85144,85149],{"type":17,"tag":7266,"props":85145,"children":85146},{},[85147],{"type":23,"value":85148},"What observability exists at the request level?",{"type":17,"tag":7266,"props":85150,"children":85151},{},[85152],{"type":23,"value":85153},"Agent behavior is hard to trust without detailed logs.",{"type":17,"tag":68,"props":85155,"children":85157},{"id":85156},"why-this-category-matters-in-2026",[85158],{"type":23,"value":85159},"Why this category matters in 2026",{"type":17,"tag":29,"props":85161,"children":85162},{},[85163],{"type":23,"value":85164},"More B2B SaaS products now need agents that can do more than answer questions. They need to read CRM records, create tickets, update opportunities, search files, post messages, and trigger downstream actions.",{"type":17,"tag":29,"props":85166,"children":85167},{},[85168],{"type":23,"value":85169},"That creates a new integration problem. Traditional product integrations were built for deterministic application features. Agent integrations add another layer of requirements:",{"type":17,"tag":80,"props":85171,"children":85172},{},[85173,85178,85183,85188,85193],{"type":17,"tag":84,"props":85174,"children":85175},{},[85176],{"type":23,"value":85177},"authorized access per user or customer",{"type":17,"tag":84,"props":85179,"children":85180},{},[85181],{"type":23,"value":85182},"structured actions the model can call reliably",{"type":17,"tag":84,"props":85184,"children":85185},{},[85186],{"type":23,"value":85187},"clear failure handling",{"type":17,"tag":84,"props":85189,"children":85190},{},[85191],{"type":23,"value":85192},"support for many integrations without writing custom code per API",{"type":17,"tag":84,"props":85194,"children":85195},{},[85196],{"type":23,"value":85197},"observability at the request level",{"type":17,"tag":29,"props":85199,"children":85200},{},[85201],{"type":23,"value":85202},"This is why the AI agent integration platform category exists. It sits between your model and your customer integrations and turns external APIs into something your product can safely use.",{"type":17,"tag":68,"props":85204,"children":85206},{"id":85205},"when-unified-is-the-right-fit",[85207],{"type":23,"value":85208},"When Unified is the right fit",{"type":17,"tag":29,"props":85210,"children":85211},{},[85212],{"type":23,"value":85213},"Unified is the right fit when:",{"type":17,"tag":80,"props":85215,"children":85216},{},[85217,85222,85227,85232,85237,85242,85247],{"type":17,"tag":84,"props":85218,"children":85219},{},[85220],{"type":23,"value":85221},"you are building a B2B SaaS product, not just an internal assistant",{"type":17,"tag":84,"props":85223,"children":85224},{},[85225],{"type":23,"value":85226},"your product needs both application integrations and agent actions",{"type":17,"tag":84,"props":85228,"children":85229},{},[85230],{"type":23,"value":85231},"you want category-scoped APIs and structured objects",{"type":17,"tag":84,"props":85233,"children":85234},{},[85235],{"type":23,"value":85236},"you care about real-time access fetched directly from source APIs",{"type":17,"tag":84,"props":85238,"children":85239},{},[85240],{"type":23,"value":85241},"you do not want customer records stored at rest",{"type":17,"tag":84,"props":85243,"children":85244},{},[85245],{"type":23,"value":85246},"you need support for custom fields, custom objects, and passthrough access where needed",{"type":17,"tag":84,"props":85248,"children":85249},{},[85250],{"type":23,"value":85251},"you want one integration foundation across API, webhooks, database sync, and MCP",{"type":17,"tag":68,"props":85253,"children":85254},{"id":7672},[85255],{"type":23,"value":7675},{"type":17,"tag":80,"props":85257,"children":85258},{},[85259,85264,85269,85274],{"type":17,"tag":84,"props":85260,"children":85261},{},[85262],{"type":23,"value":85263},"AI agent integration platforms are now a core part of B2B SaaS architecture, not just an AI add-on.",{"type":17,"tag":84,"props":85265,"children":85266},{},[85267],{"type":23,"value":85268},"The real evaluation criteria are authorization, structured integration access, real-time behavior, observability, and support for both agent and non-agent product needs.",{"type":17,"tag":84,"props":85270,"children":85271},{},[85272],{"type":23,"value":85273},"For B2B SaaS teams, the strongest option is often not an isolated action platform. It is a unified integration layer that can support the full product.",{"type":17,"tag":84,"props":85275,"children":85276},{},[85277],{"type":23,"value":85278},"Unified is differentiated because it combines category-scoped APIs, Unified MCP, real-time requests routed directly to source APIs, no customer data storage, custom field support, and multiple delivery methods on the same models.",{"type":17,"tag":29,"props":85280,"children":85281},{},[85282],{"type":17,"tag":133,"props":85283,"children":85285},{"href":1612,"rel":85284},[214],[85286],{"type":23,"value":44481},{"type":17,"tag":29,"props":85288,"children":85289},{},[85290],{"type":17,"tag":133,"props":85291,"children":85293},{"href":1623,"rel":85292},[214],[85294],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":85296},[85297,85298,85305,85311,85316,85321,85328,85329,85330,85331],{"id":84198,"depth":1629,"text":84201},{"id":84261,"depth":1629,"text":84264,"children":85299},[85300,85301,85302,85303,85304],{"id":84272,"depth":1635,"text":84275},{"id":84288,"depth":1635,"text":84291},{"id":84304,"depth":1635,"text":84307},{"id":84320,"depth":1635,"text":84323},{"id":84370,"depth":1635,"text":84373},{"id":84390,"depth":1629,"text":84393,"children":85306},[85307,85308,85309,85310],{"id":84401,"depth":1635,"text":84404},{"id":84412,"depth":1635,"text":84415},{"id":84423,"depth":1635,"text":84426},{"id":84434,"depth":1635,"text":84437},{"id":84445,"depth":1629,"text":84448,"children":85312},[85313,85314,85315],{"id":84461,"depth":1635,"text":84464},{"id":84569,"depth":1635,"text":84572},{"id":84675,"depth":1635,"text":84678},{"id":84784,"depth":1629,"text":84787,"children":85317},[85318,85319,85320],{"id":84795,"depth":1635,"text":84798},{"id":84819,"depth":1635,"text":84822},{"id":84843,"depth":1635,"text":84846},{"id":1051,"depth":1629,"text":1054,"children":85322},[85323,85324,85325,85326,85327],{"id":84909,"depth":1635,"text":84912},{"id":84925,"depth":1635,"text":84928},{"id":84964,"depth":1635,"text":84967},{"id":85008,"depth":1635,"text":85011},{"id":85024,"depth":1635,"text":85027},{"id":85045,"depth":1629,"text":85048},{"id":85156,"depth":1629,"text":85159},{"id":85205,"depth":1629,"text":85208},{"id":7672,"depth":1629,"text":7675},"content:blog:best_ai_agent_integration_platforms_to_consider_in_2026.md","blog/best_ai_agent_integration_platforms_to_consider_in_2026.md","blog/best_ai_agent_integration_platforms_to_consider_in_2026",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"img":10,"date":11,"tag":12,"body":85336,"_type":1677,"_id":1678,"_source":1679,"_file":1680,"_stem":1681,"_extension":1682},{"type":14,"children":85337,"toc":86624},[85338,85342,85345,85352,85356,85365,85374,85378,85382,85405,85409,85432,85436,85455,85459,85463,85472,85476,85480,85507,85511,85530,85534,85538,85582,85586,85601,85605,85614,85618,85645,85649,85664,85668,85683,85687,85691,85695,85714,85718,85733,85737,85752,85756,85760,85764,85791,85795,85810,85814,85829,85833,85837,85841,85868,85872,85891,85895,85899,85903,85930,85934,85957,85961,85965,85969,85973,85992,85996,86023,86027,86031,86046,86050,86054,86058,86077,86081,86096,86100,86104,86108,86112,86116,86120,86139,86143,86158,86162,86166,86181,86185,86200,86204,86208,86212,86231,86235,86239,86254,86258,86262,86285,86289,86293,86302,86306,86310,86314,86337,86341,86360,86364,86368,86372,86415,86419,86423,86442,86446,86450,86454,86458,86462,86477,86481,86485,86500,86504,86508,86512,86516,86520,86539,86543,86562,86566,86570,86574,86593,86597,86606,86615],{"type":17,"tag":18,"props":85339,"children":85340},{"id":20},[85341],{"type":23,"value":8},{"type":17,"tag":25,"props":85343,"children":85344},{},[],{"type":17,"tag":29,"props":85346,"children":85347},{},[85348],{"type":17,"tag":33,"props":85349,"children":85350},{},[85351],{"type":23,"value":37},{"type":17,"tag":29,"props":85353,"children":85354},{},[85355],{"type":23,"value":9},{"type":17,"tag":29,"props":85357,"children":85358},{},[85359,85360,85364],{"type":23,"value":46},{"type":17,"tag":48,"props":85361,"children":85362},{},[85363],{"type":23,"value":52},{"type":23,"value":54},{"type":17,"tag":29,"props":85366,"children":85367},{},[85368,85369,85373],{"type":23,"value":59},{"type":17,"tag":48,"props":85370,"children":85371},{},[85372],{"type":23,"value":64},{"type":23,"value":66},{"type":17,"tag":68,"props":85375,"children":85376},{"id":70},[85377],{"type":23,"value":73},{"type":17,"tag":29,"props":85379,"children":85380},{},[85381],{"type":23,"value":78},{"type":17,"tag":80,"props":85383,"children":85384},{},[85385,85389,85393,85397,85401],{"type":17,"tag":84,"props":85386,"children":85387},{},[85388],{"type":23,"value":88},{"type":17,"tag":84,"props":85390,"children":85391},{},[85392],{"type":23,"value":93},{"type":17,"tag":84,"props":85394,"children":85395},{},[85396],{"type":23,"value":98},{"type":17,"tag":84,"props":85398,"children":85399},{},[85400],{"type":23,"value":103},{"type":17,"tag":84,"props":85402,"children":85403},{},[85404],{"type":23,"value":108},{"type":17,"tag":29,"props":85406,"children":85407},{},[85408],{"type":23,"value":113},{"type":17,"tag":80,"props":85410,"children":85411},{},[85412,85416,85420,85428],{"type":17,"tag":84,"props":85413,"children":85414},{},[85415],{"type":23,"value":121},{"type":17,"tag":84,"props":85417,"children":85418},{},[85419],{"type":23,"value":126},{"type":17,"tag":84,"props":85421,"children":85422},{},[85423,85424],{"type":23,"value":131},{"type":17,"tag":133,"props":85425,"children":85426},{"href":135},[85427],{"type":23,"value":138},{"type":17,"tag":84,"props":85429,"children":85430},{},[85431],{"type":23,"value":143},{"type":17,"tag":29,"props":85433,"children":85434},{},[85435],{"type":23,"value":148},{"type":17,"tag":80,"props":85437,"children":85438},{},[85439,85443,85447,85451],{"type":17,"tag":84,"props":85440,"children":85441},{},[85442],{"type":23,"value":156},{"type":17,"tag":84,"props":85444,"children":85445},{},[85446],{"type":23,"value":161},{"type":17,"tag":84,"props":85448,"children":85449},{},[85450],{"type":23,"value":166},{"type":17,"tag":84,"props":85452,"children":85453},{},[85454],{"type":23,"value":171},{"type":17,"tag":29,"props":85456,"children":85457},{},[85458],{"type":23,"value":176},{"type":17,"tag":68,"props":85460,"children":85461},{"id":179},[85462],{"type":23,"value":182},{"type":17,"tag":29,"props":85464,"children":85465},{},[85466,85467,85471],{"type":23,"value":187},{"type":17,"tag":48,"props":85468,"children":85469},{},[85470],{"type":23,"value":192},{"type":23,"value":54},{"type":17,"tag":29,"props":85473,"children":85474},{},[85475],{"type":23,"value":198},{"type":17,"tag":29,"props":85477,"children":85478},{},[85479],{"type":23,"value":203},{"type":17,"tag":80,"props":85481,"children":85482},{},[85483,85491,85499],{"type":17,"tag":84,"props":85484,"children":85485},{},[85486],{"type":17,"tag":133,"props":85487,"children":85489},{"href":212,"rel":85488},[214],[85490],{"type":23,"value":217},{"type":17,"tag":84,"props":85492,"children":85493},{},[85494],{"type":17,"tag":133,"props":85495,"children":85497},{"href":223,"rel":85496},[214],[85498],{"type":23,"value":227},{"type":17,"tag":84,"props":85500,"children":85501},{},[85502],{"type":17,"tag":133,"props":85503,"children":85505},{"href":233,"rel":85504},[214],[85506],{"type":23,"value":237},{"type":17,"tag":239,"props":85508,"children":85509},{"id":241},[85510],{"type":23,"value":244},{"type":17,"tag":80,"props":85512,"children":85513},{},[85514,85518,85522,85526],{"type":17,"tag":84,"props":85515,"children":85516},{},[85517],{"type":23,"value":252},{"type":17,"tag":84,"props":85519,"children":85520},{},[85521],{"type":23,"value":257},{"type":17,"tag":84,"props":85523,"children":85524},{},[85525],{"type":23,"value":262},{"type":17,"tag":84,"props":85527,"children":85528},{},[85529],{"type":23,"value":267},{"type":17,"tag":239,"props":85531,"children":85532},{"id":270},[85533],{"type":23,"value":273},{"type":17,"tag":29,"props":85535,"children":85536},{},[85537],{"type":23,"value":278},{"type":17,"tag":80,"props":85539,"children":85540},{},[85541,85549,85557,85564,85571],{"type":17,"tag":84,"props":85542,"children":85543},{},[85544,85548],{"type":17,"tag":48,"props":85545,"children":85546},{},[85547],{"type":23,"value":289},{"type":23,"value":291},{"type":17,"tag":84,"props":85550,"children":85551},{},[85552,85556],{"type":17,"tag":48,"props":85553,"children":85554},{},[85555],{"type":23,"value":299},{"type":23,"value":301},{"type":17,"tag":84,"props":85558,"children":85559},{},[85560],{"type":17,"tag":48,"props":85561,"children":85562},{},[85563],{"type":23,"value":309},{"type":17,"tag":84,"props":85565,"children":85566},{},[85567],{"type":17,"tag":48,"props":85568,"children":85569},{},[85570],{"type":23,"value":317},{"type":17,"tag":84,"props":85572,"children":85573},{},[85574],{"type":17,"tag":48,"props":85575,"children":85576},{},[85577,85581],{"type":17,"tag":133,"props":85578,"children":85579},{"href":326},[85580],{"type":23,"value":329},{"type":23,"value":331},{"type":17,"tag":29,"props":85583,"children":85584},{},[85585],{"type":23,"value":336},{"type":17,"tag":80,"props":85587,"children":85588},{},[85589,85593,85597],{"type":17,"tag":84,"props":85590,"children":85591},{},[85592],{"type":23,"value":344},{"type":17,"tag":84,"props":85594,"children":85595},{},[85596],{"type":23,"value":349},{"type":17,"tag":84,"props":85598,"children":85599},{},[85600],{"type":23,"value":354},{"type":17,"tag":68,"props":85602,"children":85603},{"id":357},[85604],{"type":23,"value":360},{"type":17,"tag":29,"props":85606,"children":85607},{},[85608,85609,85613],{"type":23,"value":365},{"type":17,"tag":48,"props":85610,"children":85611},{},[85612],{"type":23,"value":370},{"type":23,"value":372},{"type":17,"tag":29,"props":85615,"children":85616},{},[85617],{"type":23,"value":377},{"type":17,"tag":80,"props":85619,"children":85620},{},[85621,85629,85637],{"type":17,"tag":84,"props":85622,"children":85623},{},[85624],{"type":17,"tag":133,"props":85625,"children":85627},{"href":386,"rel":85626},[214],[85628],{"type":23,"value":390},{"type":17,"tag":84,"props":85630,"children":85631},{},[85632],{"type":17,"tag":133,"props":85633,"children":85635},{"href":396,"rel":85634},[214],[85636],{"type":23,"value":400},{"type":17,"tag":84,"props":85638,"children":85639},{},[85640],{"type":17,"tag":133,"props":85641,"children":85643},{"href":406,"rel":85642},[214],[85644],{"type":23,"value":410},{"type":17,"tag":239,"props":85646,"children":85647},{"id":413},[85648],{"type":23,"value":416},{"type":17,"tag":80,"props":85650,"children":85651},{},[85652,85656,85660],{"type":17,"tag":84,"props":85653,"children":85654},{},[85655],{"type":23,"value":424},{"type":17,"tag":84,"props":85657,"children":85658},{},[85659],{"type":23,"value":429},{"type":17,"tag":84,"props":85661,"children":85662},{},[85663],{"type":23,"value":434},{"type":17,"tag":239,"props":85665,"children":85666},{"id":437},[85667],{"type":23,"value":440},{"type":17,"tag":80,"props":85669,"children":85670},{},[85671,85675,85679],{"type":17,"tag":84,"props":85672,"children":85673},{},[85674],{"type":23,"value":448},{"type":17,"tag":84,"props":85676,"children":85677},{},[85678],{"type":23,"value":453},{"type":17,"tag":84,"props":85680,"children":85681},{},[85682],{"type":23,"value":458},{"type":17,"tag":68,"props":85684,"children":85685},{"id":461},[85686],{"type":23,"value":464},{"type":17,"tag":29,"props":85688,"children":85689},{},[85690],{"type":23,"value":469},{"type":17,"tag":29,"props":85692,"children":85693},{},[85694],{"type":23,"value":377},{"type":17,"tag":80,"props":85696,"children":85697},{},[85698,85706],{"type":17,"tag":84,"props":85699,"children":85700},{},[85701],{"type":17,"tag":133,"props":85702,"children":85704},{"href":482,"rel":85703},[214],[85705],{"type":23,"value":486},{"type":17,"tag":84,"props":85707,"children":85708},{},[85709],{"type":17,"tag":133,"props":85710,"children":85712},{"href":492,"rel":85711},[214],[85713],{"type":23,"value":496},{"type":17,"tag":239,"props":85715,"children":85716},{"id":499},[85717],{"type":23,"value":502},{"type":17,"tag":80,"props":85719,"children":85720},{},[85721,85725,85729],{"type":17,"tag":84,"props":85722,"children":85723},{},[85724],{"type":23,"value":510},{"type":17,"tag":84,"props":85726,"children":85727},{},[85728],{"type":23,"value":515},{"type":17,"tag":84,"props":85730,"children":85731},{},[85732],{"type":23,"value":520},{"type":17,"tag":239,"props":85734,"children":85735},{"id":523},[85736],{"type":23,"value":440},{"type":17,"tag":80,"props":85738,"children":85739},{},[85740,85744,85748],{"type":17,"tag":84,"props":85741,"children":85742},{},[85743],{"type":23,"value":533},{"type":17,"tag":84,"props":85745,"children":85746},{},[85747],{"type":23,"value":538},{"type":17,"tag":84,"props":85749,"children":85750},{},[85751],{"type":23,"value":543},{"type":17,"tag":68,"props":85753,"children":85754},{"id":546},[85755],{"type":23,"value":549},{"type":17,"tag":29,"props":85757,"children":85758},{},[85759],{"type":23,"value":554},{"type":17,"tag":29,"props":85761,"children":85762},{},[85763],{"type":23,"value":377},{"type":17,"tag":80,"props":85765,"children":85766},{},[85767,85775,85783],{"type":17,"tag":84,"props":85768,"children":85769},{},[85770],{"type":17,"tag":133,"props":85771,"children":85773},{"href":567,"rel":85772},[214],[85774],{"type":23,"value":571},{"type":17,"tag":84,"props":85776,"children":85777},{},[85778],{"type":17,"tag":133,"props":85779,"children":85781},{"href":577,"rel":85780},[214],[85782],{"type":23,"value":581},{"type":17,"tag":84,"props":85784,"children":85785},{},[85786],{"type":17,"tag":133,"props":85787,"children":85789},{"href":587,"rel":85788},[214],[85790],{"type":23,"value":591},{"type":17,"tag":239,"props":85792,"children":85793},{"id":594},[85794],{"type":23,"value":597},{"type":17,"tag":80,"props":85796,"children":85797},{},[85798,85802,85806],{"type":17,"tag":84,"props":85799,"children":85800},{},[85801],{"type":23,"value":605},{"type":17,"tag":84,"props":85803,"children":85804},{},[85805],{"type":23,"value":610},{"type":17,"tag":84,"props":85807,"children":85808},{},[85809],{"type":23,"value":615},{"type":17,"tag":239,"props":85811,"children":85812},{"id":618},[85813],{"type":23,"value":621},{"type":17,"tag":80,"props":85815,"children":85816},{},[85817,85821,85825],{"type":17,"tag":84,"props":85818,"children":85819},{},[85820],{"type":23,"value":629},{"type":17,"tag":84,"props":85822,"children":85823},{},[85824],{"type":23,"value":634},{"type":17,"tag":84,"props":85826,"children":85827},{},[85828],{"type":23,"value":639},{"type":17,"tag":68,"props":85830,"children":85831},{"id":642},[85832],{"type":23,"value":645},{"type":17,"tag":29,"props":85834,"children":85835},{},[85836],{"type":23,"value":650},{"type":17,"tag":29,"props":85838,"children":85839},{},[85840],{"type":23,"value":377},{"type":17,"tag":80,"props":85842,"children":85843},{},[85844,85852,85860],{"type":17,"tag":84,"props":85845,"children":85846},{},[85847],{"type":17,"tag":133,"props":85848,"children":85850},{"href":663,"rel":85849},[214],[85851],{"type":23,"value":667},{"type":17,"tag":84,"props":85853,"children":85854},{},[85855],{"type":17,"tag":133,"props":85856,"children":85858},{"href":673,"rel":85857},[214],[85859],{"type":23,"value":677},{"type":17,"tag":84,"props":85861,"children":85862},{},[85863],{"type":17,"tag":133,"props":85864,"children":85866},{"href":683,"rel":85865},[214],[85867],{"type":23,"value":687},{"type":17,"tag":239,"props":85869,"children":85870},{"id":690},[85871],{"type":23,"value":693},{"type":17,"tag":80,"props":85873,"children":85874},{},[85875,85879,85883,85887],{"type":17,"tag":84,"props":85876,"children":85877},{},[85878],{"type":23,"value":701},{"type":17,"tag":84,"props":85880,"children":85881},{},[85882],{"type":23,"value":706},{"type":17,"tag":84,"props":85884,"children":85885},{},[85886],{"type":23,"value":711},{"type":17,"tag":84,"props":85888,"children":85889},{},[85890],{"type":23,"value":716},{"type":17,"tag":68,"props":85892,"children":85893},{"id":719},[85894],{"type":23,"value":722},{"type":17,"tag":29,"props":85896,"children":85897},{},[85898],{"type":23,"value":727},{"type":17,"tag":29,"props":85900,"children":85901},{},[85902],{"type":23,"value":377},{"type":17,"tag":80,"props":85904,"children":85905},{},[85906,85914,85922],{"type":17,"tag":84,"props":85907,"children":85908},{},[85909],{"type":17,"tag":133,"props":85910,"children":85912},{"href":740,"rel":85911},[214],[85913],{"type":23,"value":744},{"type":17,"tag":84,"props":85915,"children":85916},{},[85917],{"type":17,"tag":133,"props":85918,"children":85920},{"href":750,"rel":85919},[214],[85921],{"type":23,"value":754},{"type":17,"tag":84,"props":85923,"children":85924},{},[85925],{"type":17,"tag":133,"props":85926,"children":85928},{"href":760,"rel":85927},[214],[85929],{"type":23,"value":764},{"type":17,"tag":239,"props":85931,"children":85932},{"id":767},[85933],{"type":23,"value":770},{"type":17,"tag":80,"props":85935,"children":85936},{},[85937,85945,85949,85953],{"type":17,"tag":84,"props":85938,"children":85939},{},[85940,85944],{"type":17,"tag":133,"props":85941,"children":85942},{"href":779},[85943],{"type":23,"value":782},{"type":23,"value":784},{"type":17,"tag":84,"props":85946,"children":85947},{},[85948],{"type":23,"value":789},{"type":17,"tag":84,"props":85950,"children":85951},{},[85952],{"type":23,"value":794},{"type":17,"tag":84,"props":85954,"children":85955},{},[85956],{"type":23,"value":799},{"type":17,"tag":29,"props":85958,"children":85959},{},[85960],{"type":23,"value":804},{"type":17,"tag":68,"props":85962,"children":85963},{"id":807},[85964],{"type":23,"value":810},{"type":17,"tag":29,"props":85966,"children":85967},{},[85968],{"type":23,"value":815},{"type":17,"tag":29,"props":85970,"children":85971},{},[85972],{"type":23,"value":820},{"type":17,"tag":80,"props":85974,"children":85975},{},[85976,85980,85984,85988],{"type":17,"tag":84,"props":85977,"children":85978},{},[85979],{"type":23,"value":828},{"type":17,"tag":84,"props":85981,"children":85982},{},[85983],{"type":23,"value":833},{"type":17,"tag":84,"props":85985,"children":85986},{},[85987],{"type":23,"value":838},{"type":17,"tag":84,"props":85989,"children":85990},{},[85991],{"type":23,"value":843},{"type":17,"tag":29,"props":85993,"children":85994},{},[85995],{"type":23,"value":377},{"type":17,"tag":80,"props":85997,"children":85998},{},[85999,86007,86015],{"type":17,"tag":84,"props":86000,"children":86001},{},[86002],{"type":17,"tag":133,"props":86003,"children":86005},{"href":856,"rel":86004},[214],[86006],{"type":23,"value":860},{"type":17,"tag":84,"props":86008,"children":86009},{},[86010],{"type":17,"tag":133,"props":86011,"children":86013},{"href":866,"rel":86012},[214],[86014],{"type":23,"value":870},{"type":17,"tag":84,"props":86016,"children":86017},{},[86018],{"type":17,"tag":133,"props":86019,"children":86021},{"href":876,"rel":86020},[214],[86022],{"type":23,"value":880},{"type":17,"tag":239,"props":86024,"children":86025},{"id":883},[86026],{"type":23,"value":886},{"type":17,"tag":29,"props":86028,"children":86029},{},[86030],{"type":23,"value":891},{"type":17,"tag":80,"props":86032,"children":86033},{},[86034,86038,86042],{"type":17,"tag":84,"props":86035,"children":86036},{},[86037],{"type":23,"value":899},{"type":17,"tag":84,"props":86039,"children":86040},{},[86041],{"type":23,"value":904},{"type":17,"tag":84,"props":86043,"children":86044},{},[86045],{"type":23,"value":909},{"type":17,"tag":68,"props":86047,"children":86048},{"id":912},[86049],{"type":23,"value":915},{"type":17,"tag":29,"props":86051,"children":86052},{},[86053],{"type":23,"value":920},{"type":17,"tag":29,"props":86055,"children":86056},{},[86057],{"type":23,"value":377},{"type":17,"tag":80,"props":86059,"children":86060},{},[86061,86069],{"type":17,"tag":84,"props":86062,"children":86063},{},[86064],{"type":17,"tag":133,"props":86065,"children":86067},{"href":933,"rel":86066},[214],[86068],{"type":23,"value":937},{"type":17,"tag":84,"props":86070,"children":86071},{},[86072],{"type":17,"tag":133,"props":86073,"children":86075},{"href":943,"rel":86074},[214],[86076],{"type":23,"value":947},{"type":17,"tag":239,"props":86078,"children":86079},{"id":950},[86080],{"type":23,"value":953},{"type":17,"tag":80,"props":86082,"children":86083},{},[86084,86088,86092],{"type":17,"tag":84,"props":86085,"children":86086},{},[86087],{"type":23,"value":961},{"type":17,"tag":84,"props":86089,"children":86090},{},[86091],{"type":23,"value":966},{"type":17,"tag":84,"props":86093,"children":86094},{},[86095],{"type":23,"value":971},{"type":17,"tag":239,"props":86097,"children":86098},{"id":974},[86099],{"type":23,"value":977},{"type":17,"tag":29,"props":86101,"children":86102},{},[86103],{"type":23,"value":982},{"type":17,"tag":29,"props":86105,"children":86106},{},[86107],{"type":23,"value":987},{"type":17,"tag":68,"props":86109,"children":86110},{"id":990},[86111],{"type":23,"value":993},{"type":17,"tag":29,"props":86113,"children":86114},{},[86115],{"type":23,"value":998},{"type":17,"tag":29,"props":86117,"children":86118},{},[86119],{"type":23,"value":377},{"type":17,"tag":80,"props":86121,"children":86122},{},[86123,86131],{"type":17,"tag":84,"props":86124,"children":86125},{},[86126],{"type":17,"tag":133,"props":86127,"children":86129},{"href":1011,"rel":86128},[214],[86130],{"type":23,"value":1015},{"type":17,"tag":84,"props":86132,"children":86133},{},[86134],{"type":17,"tag":133,"props":86135,"children":86137},{"href":1021,"rel":86136},[214],[86138],{"type":23,"value":1025},{"type":17,"tag":239,"props":86140,"children":86141},{"id":1028},[86142],{"type":23,"value":693},{"type":17,"tag":80,"props":86144,"children":86145},{},[86146,86150,86154],{"type":17,"tag":84,"props":86147,"children":86148},{},[86149],{"type":23,"value":1038},{"type":17,"tag":84,"props":86151,"children":86152},{},[86153],{"type":23,"value":1043},{"type":17,"tag":84,"props":86155,"children":86156},{},[86157],{"type":23,"value":1048},{"type":17,"tag":239,"props":86159,"children":86160},{"id":1051},[86161],{"type":23,"value":1054},{"type":17,"tag":29,"props":86163,"children":86164},{},[86165],{"type":23,"value":1059},{"type":17,"tag":80,"props":86167,"children":86168},{},[86169,86173,86177],{"type":17,"tag":84,"props":86170,"children":86171},{},[86172],{"type":23,"value":1067},{"type":17,"tag":84,"props":86174,"children":86175},{},[86176],{"type":23,"value":1072},{"type":17,"tag":84,"props":86178,"children":86179},{},[86180],{"type":23,"value":1077},{"type":17,"tag":29,"props":86182,"children":86183},{},[86184],{"type":23,"value":1082},{"type":17,"tag":80,"props":86186,"children":86187},{},[86188,86192,86196],{"type":17,"tag":84,"props":86189,"children":86190},{},[86191],{"type":23,"value":1090},{"type":17,"tag":84,"props":86193,"children":86194},{},[86195],{"type":23,"value":1095},{"type":17,"tag":84,"props":86197,"children":86198},{},[86199],{"type":23,"value":1100},{"type":17,"tag":68,"props":86201,"children":86202},{"id":1103},[86203],{"type":23,"value":1106},{"type":17,"tag":29,"props":86205,"children":86206},{},[86207],{"type":23,"value":1111},{"type":17,"tag":29,"props":86209,"children":86210},{},[86211],{"type":23,"value":377},{"type":17,"tag":80,"props":86213,"children":86214},{},[86215,86223],{"type":17,"tag":84,"props":86216,"children":86217},{},[86218],{"type":17,"tag":133,"props":86219,"children":86221},{"href":1124,"rel":86220},[214],[86222],{"type":23,"value":1128},{"type":17,"tag":84,"props":86224,"children":86225},{},[86226],{"type":17,"tag":133,"props":86227,"children":86229},{"href":1134,"rel":86228},[214],[86230],{"type":23,"value":1138},{"type":17,"tag":239,"props":86232,"children":86233},{"id":1141},[86234],{"type":23,"value":886},{"type":17,"tag":29,"props":86236,"children":86237},{},[86238],{"type":23,"value":1148},{"type":17,"tag":80,"props":86240,"children":86241},{},[86242,86246,86250],{"type":17,"tag":84,"props":86243,"children":86244},{},[86245],{"type":23,"value":1156},{"type":17,"tag":84,"props":86247,"children":86248},{},[86249],{"type":23,"value":1161},{"type":17,"tag":84,"props":86251,"children":86252},{},[86253],{"type":23,"value":1166},{"type":17,"tag":68,"props":86255,"children":86256},{"id":1169},[86257],{"type":23,"value":1172},{"type":17,"tag":29,"props":86259,"children":86260},{},[86261],{"type":23,"value":1177},{"type":17,"tag":80,"props":86263,"children":86264},{},[86265,86269,86273,86277,86281],{"type":17,"tag":84,"props":86266,"children":86267},{},[86268],{"type":23,"value":1185},{"type":17,"tag":84,"props":86270,"children":86271},{},[86272],{"type":23,"value":1190},{"type":17,"tag":84,"props":86274,"children":86275},{},[86276],{"type":23,"value":1195},{"type":17,"tag":84,"props":86278,"children":86279},{},[86280],{"type":23,"value":1200},{"type":17,"tag":84,"props":86282,"children":86283},{},[86284],{"type":23,"value":1205},{"type":17,"tag":29,"props":86286,"children":86287},{},[86288],{"type":23,"value":1210},{"type":17,"tag":29,"props":86290,"children":86291},{},[86292],{"type":23,"value":1215},{"type":17,"tag":29,"props":86294,"children":86295},{},[86296,86297,86301],{"type":23,"value":1220},{"type":17,"tag":48,"props":86298,"children":86299},{},[86300],{"type":23,"value":1225},{"type":23,"value":54},{"type":17,"tag":68,"props":86303,"children":86304},{"id":1229},[86305],{"type":23,"value":1232},{"type":17,"tag":29,"props":86307,"children":86308},{},[86309],{"type":23,"value":1237},{"type":17,"tag":29,"props":86311,"children":86312},{},[86313],{"type":23,"value":1242},{"type":17,"tag":80,"props":86315,"children":86316},{},[86317,86321,86325,86329,86333],{"type":17,"tag":84,"props":86318,"children":86319},{},[86320],{"type":23,"value":1250},{"type":17,"tag":84,"props":86322,"children":86323},{},[86324],{"type":23,"value":1255},{"type":17,"tag":84,"props":86326,"children":86327},{},[86328],{"type":23,"value":1260},{"type":17,"tag":84,"props":86330,"children":86331},{},[86332],{"type":23,"value":1265},{"type":17,"tag":84,"props":86334,"children":86335},{},[86336],{"type":23,"value":1270},{"type":17,"tag":29,"props":86338,"children":86339},{},[86340],{"type":23,"value":1275},{"type":17,"tag":80,"props":86342,"children":86343},{},[86344,86348,86352,86356],{"type":17,"tag":84,"props":86345,"children":86346},{},[86347],{"type":23,"value":1283},{"type":17,"tag":84,"props":86349,"children":86350},{},[86351],{"type":23,"value":1288},{"type":17,"tag":84,"props":86353,"children":86354},{},[86355],{"type":23,"value":1293},{"type":17,"tag":84,"props":86357,"children":86358},{},[86359],{"type":23,"value":1298},{"type":17,"tag":29,"props":86361,"children":86362},{},[86363],{"type":23,"value":1303},{"type":17,"tag":239,"props":86365,"children":86366},{"id":1306},[86367],{"type":23,"value":1309},{"type":17,"tag":29,"props":86369,"children":86370},{},[86371],{"type":23,"value":1314},{"type":17,"tag":80,"props":86373,"children":86374},{},[86375,86383,86391,86399,86407],{"type":17,"tag":84,"props":86376,"children":86377},{},[86378,86382],{"type":17,"tag":48,"props":86379,"children":86380},{},[86381],{"type":23,"value":1325},{"type":23,"value":1327},{"type":17,"tag":84,"props":86384,"children":86385},{},[86386,86390],{"type":17,"tag":48,"props":86387,"children":86388},{},[86389],{"type":23,"value":1335},{"type":23,"value":1337},{"type":17,"tag":84,"props":86392,"children":86393},{},[86394,86398],{"type":17,"tag":48,"props":86395,"children":86396},{},[86397],{"type":23,"value":1345},{"type":23,"value":1347},{"type":17,"tag":84,"props":86400,"children":86401},{},[86402,86406],{"type":17,"tag":48,"props":86403,"children":86404},{},[86405],{"type":23,"value":1355},{"type":23,"value":1357},{"type":17,"tag":84,"props":86408,"children":86409},{},[86410,86414],{"type":17,"tag":48,"props":86411,"children":86412},{},[86413],{"type":23,"value":1365},{"type":23,"value":1367},{"type":17,"tag":239,"props":86416,"children":86417},{"id":1370},[86418],{"type":23,"value":1373},{"type":17,"tag":29,"props":86420,"children":86421},{},[86422],{"type":23,"value":1378},{"type":17,"tag":80,"props":86424,"children":86425},{},[86426,86430,86434,86438],{"type":17,"tag":84,"props":86427,"children":86428},{},[86429],{"type":23,"value":1386},{"type":17,"tag":84,"props":86431,"children":86432},{},[86433],{"type":23,"value":1391},{"type":17,"tag":84,"props":86435,"children":86436},{},[86437],{"type":23,"value":1396},{"type":17,"tag":84,"props":86439,"children":86440},{},[86441],{"type":23,"value":1401},{"type":17,"tag":68,"props":86443,"children":86444},{"id":1404},[86445],{"type":23,"value":1407},{"type":17,"tag":29,"props":86447,"children":86448},{},[86449],{"type":23,"value":1412},{"type":17,"tag":29,"props":86451,"children":86452},{},[86453],{"type":23,"value":1417},{"type":17,"tag":29,"props":86455,"children":86456},{},[86457],{"type":23,"value":1422},{"type":17,"tag":29,"props":86459,"children":86460},{},[86461],{"type":23,"value":1427},{"type":17,"tag":80,"props":86463,"children":86464},{},[86465,86469,86473],{"type":17,"tag":84,"props":86466,"children":86467},{},[86468],{"type":23,"value":1435},{"type":17,"tag":84,"props":86470,"children":86471},{},[86472],{"type":23,"value":1440},{"type":17,"tag":84,"props":86474,"children":86475},{},[86476],{"type":23,"value":1445},{"type":17,"tag":29,"props":86478,"children":86479},{},[86480],{"type":23,"value":1450},{"type":17,"tag":29,"props":86482,"children":86483},{},[86484],{"type":23,"value":1427},{"type":17,"tag":80,"props":86486,"children":86487},{},[86488,86492,86496],{"type":17,"tag":84,"props":86489,"children":86490},{},[86491],{"type":23,"value":1462},{"type":17,"tag":84,"props":86493,"children":86494},{},[86495],{"type":23,"value":1467},{"type":17,"tag":84,"props":86497,"children":86498},{},[86499],{"type":23,"value":1472},{"type":17,"tag":29,"props":86501,"children":86502},{},[86503],{"type":23,"value":1477},{"type":17,"tag":68,"props":86505,"children":86506},{"id":1480},[86507],{"type":23,"value":1483},{"type":17,"tag":29,"props":86509,"children":86510},{},[86511],{"type":23,"value":1488},{"type":17,"tag":29,"props":86513,"children":86514},{},[86515],{"type":23,"value":1493},{"type":17,"tag":29,"props":86517,"children":86518},{},[86519],{"type":23,"value":1498},{"type":17,"tag":80,"props":86521,"children":86522},{},[86523,86527,86531,86535],{"type":17,"tag":84,"props":86524,"children":86525},{},[86526],{"type":23,"value":1506},{"type":17,"tag":84,"props":86528,"children":86529},{},[86530],{"type":23,"value":1511},{"type":17,"tag":84,"props":86532,"children":86533},{},[86534],{"type":23,"value":1516},{"type":17,"tag":84,"props":86536,"children":86537},{},[86538],{"type":23,"value":1521},{"type":17,"tag":29,"props":86540,"children":86541},{},[86542],{"type":23,"value":1526},{"type":17,"tag":80,"props":86544,"children":86545},{},[86546,86550,86554,86558],{"type":17,"tag":84,"props":86547,"children":86548},{},[86549],{"type":23,"value":1534},{"type":17,"tag":84,"props":86551,"children":86552},{},[86553],{"type":23,"value":1539},{"type":17,"tag":84,"props":86555,"children":86556},{},[86557],{"type":23,"value":1544},{"type":17,"tag":84,"props":86559,"children":86560},{},[86561],{"type":23,"value":1549},{"type":17,"tag":68,"props":86563,"children":86564},{"id":1552},[86565],{"type":23,"value":1555},{"type":17,"tag":29,"props":86567,"children":86568},{},[86569],{"type":23,"value":1560},{"type":17,"tag":29,"props":86571,"children":86572},{},[86573],{"type":23,"value":1565},{"type":17,"tag":80,"props":86575,"children":86576},{},[86577,86581,86585,86589],{"type":17,"tag":84,"props":86578,"children":86579},{},[86580],{"type":23,"value":1573},{"type":17,"tag":84,"props":86582,"children":86583},{},[86584],{"type":23,"value":1578},{"type":17,"tag":84,"props":86586,"children":86587},{},[86588],{"type":23,"value":1583},{"type":17,"tag":84,"props":86590,"children":86591},{},[86592],{"type":23,"value":1588},{"type":17,"tag":29,"props":86594,"children":86595},{},[86596],{"type":23,"value":1593},{"type":17,"tag":29,"props":86598,"children":86599},{},[86600,86601,86605],{"type":23,"value":1598},{"type":17,"tag":48,"props":86602,"children":86603},{},[86604],{"type":23,"value":1603},{"type":23,"value":54},{"type":17,"tag":29,"props":86607,"children":86608},{},[86609,86610],{"type":23,"value":1609},{"type":17,"tag":133,"props":86611,"children":86613},{"href":1612,"rel":86612},[214],[86614],{"type":23,"value":1616},{"type":17,"tag":29,"props":86616,"children":86617},{},[86618,86619],{"type":23,"value":1609},{"type":17,"tag":133,"props":86620,"children":86622},{"href":1623,"rel":86621},[214],[86623],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":86625},[86626,86627,86631,86635,86639,86643,86646,86649,86652,86656,86660,86663,86664,86668,86669,86670],{"id":70,"depth":1629,"text":73},{"id":179,"depth":1629,"text":182,"children":86628},[86629,86630],{"id":241,"depth":1635,"text":244},{"id":270,"depth":1635,"text":273},{"id":357,"depth":1629,"text":360,"children":86632},[86633,86634],{"id":413,"depth":1635,"text":416},{"id":437,"depth":1635,"text":440},{"id":461,"depth":1629,"text":464,"children":86636},[86637,86638],{"id":499,"depth":1635,"text":502},{"id":523,"depth":1635,"text":440},{"id":546,"depth":1629,"text":549,"children":86640},[86641,86642],{"id":594,"depth":1635,"text":597},{"id":618,"depth":1635,"text":621},{"id":642,"depth":1629,"text":645,"children":86644},[86645],{"id":690,"depth":1635,"text":693},{"id":719,"depth":1629,"text":722,"children":86647},[86648],{"id":767,"depth":1635,"text":770},{"id":807,"depth":1629,"text":810,"children":86650},[86651],{"id":883,"depth":1635,"text":886},{"id":912,"depth":1629,"text":915,"children":86653},[86654,86655],{"id":950,"depth":1635,"text":953},{"id":974,"depth":1635,"text":977},{"id":990,"depth":1629,"text":993,"children":86657},[86658,86659],{"id":1028,"depth":1635,"text":693},{"id":1051,"depth":1635,"text":1054},{"id":1103,"depth":1629,"text":1106,"children":86661},[86662],{"id":1141,"depth":1635,"text":886},{"id":1169,"depth":1629,"text":1172},{"id":1229,"depth":1629,"text":1232,"children":86665},[86666,86667],{"id":1306,"depth":1635,"text":1309},{"id":1370,"depth":1635,"text":1373},{"id":1404,"depth":1629,"text":1407},{"id":1480,"depth":1629,"text":1483},{"id":1552,"depth":1629,"text":1555},{"_path":86672,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":86673,"description":86674,"img":86675,"date":86676,"tag":12,"body":86677,"_type":1677,"_id":87871,"_source":1679,"_file":87872,"_stem":87873,"_extension":1682},"/blog/3_top_paragon_alternatives_to_consider_in_2026","3 Top Paragon Alternatives to Consider in 2026","Paragon is a popular embedded integration platform used by B2B SaaS companies to build customer-facing integrations without maintaining hundreds of connectors...","https://s3.us-east-2.amazonaws.com/unified-article-images/3_top_paragon_alternatives_to_consider_in_2026-icon.png","2026-03-09T19:44:00.000Z",{"type":14,"children":86678,"toc":87852},[86679,86684,86687,86694,86699,86704,86725,86736,86741,86774,86779,86784,86790,86874,86885,86891,86908,86924,86929,86935,86943,86948,86955,86969,86976,86981,86993,86998,87006,87011,87019,87031,87037,87042,87050,87055,87063,87068,87076,87081,87089,87094,87100,87105,87110,87122,87127,87134,87139,87147,87152,87160,87165,87173,87178,87184,87189,87197,87202,87210,87215,87223,87228,87234,87239,87272,87278,87283,87295,87300,87323,87328,87333,87341,87346,87354,87359,87367,87372,87380,87385,87393,87398,87404,87409,87417,87422,87430,87435,87443,87448,87453,87458,87490,87495,87499,87505,87673,87677,87682,87687,87740,87745,87750,87776,87781,87786,87831,87836,87844],{"type":17,"tag":18,"props":86680,"children":86682},{"id":86681},"_3-top-paragon-alternatives-to-consider-in-2026",[86683],{"type":23,"value":86673},{"type":17,"tag":25,"props":86685,"children":86686},{},[],{"type":17,"tag":29,"props":86688,"children":86689},{},[86690],{"type":17,"tag":33,"props":86691,"children":86692},{},[86693],{"type":23,"value":37},{"type":17,"tag":29,"props":86695,"children":86696},{},[86697],{"type":23,"value":86698},"Paragon is a popular embedded integration platform used by B2B SaaS companies to build customer-facing integrations without maintaining hundreds of connectors internally.",{"type":17,"tag":29,"props":86700,"children":86701},{},[86702],{"type":23,"value":86703},"It provides a combination of:",{"type":17,"tag":80,"props":86705,"children":86706},{},[86707,86712,86716,86720],{"type":17,"tag":84,"props":86708,"children":86709},{},[86710],{"type":23,"value":86711},"Managed Sync pipelines",{"type":17,"tag":84,"props":86713,"children":86714},{},[86715],{"type":23,"value":12682},{"type":17,"tag":84,"props":86717,"children":86718},{},[86719],{"type":23,"value":69053},{"type":17,"tag":84,"props":86721,"children":86722},{},[86723],{"type":23,"value":86724},"Embedded authentication components",{"type":17,"tag":29,"props":86726,"children":86727},{},[86728,86730,86734],{"type":23,"value":86729},"This architecture allows SaaS products to ship integrations faster by outsourcing infrastructure such as ",{"type":17,"tag":133,"props":86731,"children":86732},{"href":779},[86733],{"type":23,"value":782},{"type":23,"value":86735}," flows, polling jobs, and workflow orchestration.",{"type":17,"tag":29,"props":86737,"children":86738},{},[86739],{"type":23,"value":86740},"However, Paragon's architecture also introduces trade-offs. Its Managed Sync pipelines replicate customer data into Paragon's infrastructure and refresh it on scheduled intervals. While this enables fast queries against stored datasets, it also means:",{"type":17,"tag":80,"props":86742,"children":86743},{},[86744,86754,86764],{"type":17,"tag":84,"props":86745,"children":86746},{},[86747,86749],{"type":23,"value":86748},"Data may be ",{"type":17,"tag":48,"props":86750,"children":86751},{},[86752],{"type":23,"value":86753},"minutes or hours behind the source system",{"type":17,"tag":84,"props":86755,"children":86756},{},[86757,86759],{"type":23,"value":86758},"Customer data is ",{"type":17,"tag":48,"props":86760,"children":86761},{},[86762],{"type":23,"value":86763},"stored inside a third-party platform",{"type":17,"tag":84,"props":86765,"children":86766},{},[86767,86769],{"type":23,"value":86768},"Integration pipelines require ",{"type":17,"tag":48,"props":86770,"children":86771},{},[86772],{"type":23,"value":86773},"continuous sync maintenance",{"type":17,"tag":29,"props":86775,"children":86776},{},[86777],{"type":23,"value":86778},"For teams building modern SaaS or AI-driven products, these constraints often lead them to evaluate alternative integration architectures.",{"type":17,"tag":29,"props":86780,"children":86781},{},[86782],{"type":23,"value":86783},"Below are three leading alternatives to Paragon and the types of teams they are best suited for.",{"type":17,"tag":68,"props":86785,"children":86787},{"id":86786},"paragon-alternatives-at-a-glance",[86788],{"type":23,"value":86789},"Paragon Alternatives at a Glance",{"type":17,"tag":7231,"props":86791,"children":86792},{},[86793,86811],{"type":17,"tag":7235,"props":86794,"children":86795},{},[86796],{"type":17,"tag":7239,"props":86797,"children":86798},{},[86799,86803,86807],{"type":17,"tag":7243,"props":86800,"children":86801},{},[86802],{"type":23,"value":43242},{"type":17,"tag":7243,"props":86804,"children":86805},{},[86806],{"type":23,"value":7359},{"type":17,"tag":7243,"props":86808,"children":86809},{},[86810],{"type":23,"value":43247},{"type":17,"tag":7259,"props":86812,"children":86813},{},[86814,86834,86854],{"type":17,"tag":7239,"props":86815,"children":86816},{},[86817,86824,86829],{"type":17,"tag":7266,"props":86818,"children":86819},{},[86820],{"type":17,"tag":48,"props":86821,"children":86822},{},[86823],{"type":23,"value":217},{"type":17,"tag":7266,"props":86825,"children":86826},{},[86827],{"type":23,"value":86828},"Real-time pass-through unified API",{"type":17,"tag":7266,"props":86830,"children":86831},{},[86832],{"type":23,"value":86833},"SaaS and AI products needing live data without storing customer records",{"type":17,"tag":7239,"props":86835,"children":86836},{},[86837,86844,86849],{"type":17,"tag":7266,"props":86838,"children":86839},{},[86840],{"type":17,"tag":48,"props":86841,"children":86842},{},[86843],{"type":23,"value":227},{"type":17,"tag":7266,"props":86845,"children":86846},{},[86847],{"type":23,"value":86848},"Sync-and-store unified API",{"type":17,"tag":7266,"props":86850,"children":86851},{},[86852],{"type":23,"value":86853},"SaaS companies building HRIS, CRM, or ATS integrations",{"type":17,"tag":7239,"props":86855,"children":86856},{},[86857,86864,86869],{"type":17,"tag":7266,"props":86858,"children":86859},{},[86860],{"type":17,"tag":48,"props":86861,"children":86862},{},[86863],{"type":23,"value":1025},{"type":17,"tag":7266,"props":86865,"children":86866},{},[86867],{"type":23,"value":86868},"Code-first sync engine",{"type":17,"tag":7266,"props":86870,"children":86871},{},[86872],{"type":23,"value":86873},"Engineering teams that want full control over integration logic",{"type":17,"tag":29,"props":86875,"children":86876},{},[86877,86879,86884],{"type":23,"value":86878},"Each platform solves integration challenges differently depending on whether the priority is ",{"type":17,"tag":48,"props":86880,"children":86881},{},[86882],{"type":23,"value":86883},"data freshness, operational simplicity, or infrastructure control",{"type":23,"value":54},{"type":17,"tag":68,"props":86886,"children":86888},{"id":86887},"_1-unifiedto",[86889],{"type":23,"value":86890},"1. Unified.to",{"type":17,"tag":29,"props":86892,"children":86893},{},[86894,86896,86906],{"type":23,"value":86895},"Unified.to is a ",{"type":17,"tag":48,"props":86897,"children":86898},{},[86899,86900,86904],{"type":23,"value":69662},{"type":17,"tag":133,"props":86901,"children":86902},{"href":7691},[86903],{"type":23,"value":7459},{"type":23,"value":86905}," platform",{"type":23,"value":86907}," designed for SaaS products and AI applications that need access to live data across hundreds of integrations without replicating it into a data warehouse.",{"type":17,"tag":29,"props":86909,"children":86910},{},[86911,86913,86922],{"type":23,"value":86912},"Unlike Paragon's Managed Sync pipelines, Unified uses a ",{"type":17,"tag":133,"props":86914,"children":86916},{"href":78603,"rel":86915},[214],[86917],{"type":17,"tag":48,"props":86918,"children":86919},{},[86920],{"type":23,"value":86921},"pass-through architecture",{"type":23,"value":86923}," where every request is executed directly against the upstream API at runtime.",{"type":17,"tag":29,"props":86925,"children":86926},{},[86927],{"type":23,"value":86928},"This means the platform does not maintain a stored copy of customer data.",{"type":17,"tag":239,"props":86930,"children":86932},{"id":86931},"key-features",[86933],{"type":23,"value":86934},"Key Features",{"type":17,"tag":29,"props":86936,"children":86937},{},[86938],{"type":17,"tag":48,"props":86939,"children":86940},{},[86941],{"type":23,"value":86942},"Real-time API execution",{"type":17,"tag":29,"props":86944,"children":86945},{},[86946],{"type":23,"value":86947},"Every API call is routed directly to the source integration. There are no background sync jobs or cached datasets.",{"type":17,"tag":29,"props":86949,"children":86950},{},[86951],{"type":17,"tag":48,"props":86952,"children":86953},{},[86954],{"type":23,"value":69706},{"type":17,"tag":29,"props":86956,"children":86957},{},[86958,86960,86967],{"type":23,"value":86959},"Unified ",{"type":17,"tag":133,"props":86961,"children":86964},{"href":86962,"rel":86963},"https://unified.to/security",[214],[86965],{"type":23,"value":86966},"does not store customer records",{"type":23,"value":86968},". Requests are processed in memory and forwarded to the upstream system.",{"type":17,"tag":29,"props":86970,"children":86971},{},[86972],{"type":17,"tag":48,"props":86973,"children":86974},{},[86975],{"type":23,"value":13427},{"type":17,"tag":29,"props":86977,"children":86978},{},[86979],{"type":23,"value":86980},"Normalized schemas across categories like CRM, HRIS, ATS, messaging, file storage, accounting, and more allow developers to integrate once and support many providers.",{"type":17,"tag":29,"props":86982,"children":86983},{},[86984],{"type":17,"tag":48,"props":86985,"children":86986},{},[86987,86989],{"type":23,"value":86988},"Native and ",{"type":17,"tag":133,"props":86990,"children":86991},{"href":9007},[86992],{"type":23,"value":46572},{"type":17,"tag":29,"props":86994,"children":86995},{},[86996],{"type":23,"value":86997},"Unified delivers events through a single webhook interface. When providers lack webhooks, Unified detects changes and emits equivalent events automatically.",{"type":17,"tag":29,"props":86999,"children":87000},{},[87001],{"type":17,"tag":48,"props":87002,"children":87003},{},[87004],{"type":23,"value":87005},"MCP server for AI agents",{"type":17,"tag":29,"props":87007,"children":87008},{},[87009],{"type":23,"value":87010},"Unified exposes integrations as structured tools via its Model Context Protocol (MCP) server, allowing AI agents to safely interact with SaaS systems.",{"type":17,"tag":29,"props":87012,"children":87013},{},[87014],{"type":17,"tag":48,"props":87015,"children":87016},{},[87017],{"type":23,"value":87018},"415+ integrations across 25 categories",{"type":17,"tag":29,"props":87020,"children":87021},{},[87022,87024,87030],{"type":23,"value":87023},"Coverage includes CRM, HRIS, ATS, accounting, messaging, marketing, file storage, verification, commerce, ",{"type":17,"tag":133,"props":87025,"children":87028},{"href":87026,"rel":87027},"https://unified.to/integrations",[214],[87029],{"type":23,"value":15768},{"type":23,"value":54},{"type":17,"tag":239,"props":87032,"children":87034},{"id":87033},"when-to-choose-unified-instead-of-paragon",[87035],{"type":23,"value":87036},"When to Choose Unified Instead of Paragon",{"type":17,"tag":29,"props":87038,"children":87039},{},[87040],{"type":23,"value":87041},"Unified is typically a better fit when:",{"type":17,"tag":29,"props":87043,"children":87044},{},[87045],{"type":17,"tag":48,"props":87046,"children":87047},{},[87048],{"type":23,"value":87049},"You need real-time data",{"type":17,"tag":29,"props":87051,"children":87052},{},[87053],{"type":23,"value":87054},"Paragon's sync pipelines introduce latency depending on polling frequency. Unified retrieves data live from the provider.",{"type":17,"tag":29,"props":87056,"children":87057},{},[87058],{"type":17,"tag":48,"props":87059,"children":87060},{},[87061],{"type":23,"value":87062},"You want to avoid storing customer data",{"type":17,"tag":29,"props":87064,"children":87065},{},[87066],{"type":23,"value":87067},"Unified's zero-storage architecture reduces compliance scope and eliminates risks associated with replicating customer records.",{"type":17,"tag":29,"props":87069,"children":87070},{},[87071],{"type":17,"tag":48,"props":87072,"children":87073},{},[87074],{"type":23,"value":87075},"You're building AI agents",{"type":17,"tag":29,"props":87077,"children":87078},{},[87079],{"type":23,"value":87080},"Unified's MCP server exposes integrations as structured tools for LLMs, enabling agents to safely read and write across SaaS platforms.",{"type":17,"tag":29,"props":87082,"children":87083},{},[87084],{"type":17,"tag":48,"props":87085,"children":87086},{},[87087],{"type":23,"value":87088},"You want simpler infrastructure",{"type":17,"tag":29,"props":87090,"children":87091},{},[87092],{"type":23,"value":87093},"There are no sync pipelines, cron jobs, or data warehouses to manage.",{"type":17,"tag":68,"props":87095,"children":87097},{"id":87096},"_2-merge",[87098],{"type":23,"value":87099},"2. Merge",{"type":17,"tag":29,"props":87101,"children":87102},{},[87103],{"type":23,"value":87104},"Merge is one of the most widely used unified API platforms and focuses on providing standardized data models across core business categories.",{"type":17,"tag":29,"props":87106,"children":87107},{},[87108],{"type":23,"value":87109},"It supports integrations across HRIS, ATS, CRM, accounting, ticketing, and file storage.",{"type":17,"tag":29,"props":87111,"children":87112},{},[87113,87115,87120],{"type":23,"value":87114},"Unlike Unified, Merge uses a ",{"type":17,"tag":48,"props":87116,"children":87117},{},[87118],{"type":23,"value":87119},"sync-and-store architecture",{"type":23,"value":87121}," where customer data is replicated into Merge's infrastructure and normalized into common models.",{"type":17,"tag":239,"props":87123,"children":87125},{"id":87124},"key-features-1",[87126],{"type":23,"value":86934},{"type":17,"tag":29,"props":87128,"children":87129},{},[87130],{"type":17,"tag":48,"props":87131,"children":87132},{},[87133],{"type":23,"value":13427},{"type":17,"tag":29,"props":87135,"children":87136},{},[87137],{"type":23,"value":87138},"Merge standardizes objects like Employee, Candidate, Contact, and Deal across providers.",{"type":17,"tag":29,"props":87140,"children":87141},{},[87142],{"type":17,"tag":48,"props":87143,"children":87144},{},[87145],{"type":23,"value":87146},"Scheduled synchronization",{"type":17,"tag":29,"props":87148,"children":87149},{},[87150],{"type":23,"value":87151},"Integrations run sync jobs that periodically refresh the stored dataset.",{"type":17,"tag":29,"props":87153,"children":87154},{},[87155],{"type":17,"tag":48,"props":87156,"children":87157},{},[87158],{"type":23,"value":87159},"Integration observability",{"type":17,"tag":29,"props":87161,"children":87162},{},[87163],{"type":23,"value":87164},"Dashboards and logs help teams monitor integration performance.",{"type":17,"tag":29,"props":87166,"children":87167},{},[87168],{"type":17,"tag":48,"props":87169,"children":87170},{},[87171],{"type":23,"value":87172},"Field mapping",{"type":17,"tag":29,"props":87174,"children":87175},{},[87176],{"type":23,"value":87177},"Developers can access custom objects and provider-specific fields when needed.",{"type":17,"tag":239,"props":87179,"children":87181},{"id":87180},"when-to-choose-merge-instead-of-paragon",[87182],{"type":23,"value":87183},"When to Choose Merge Instead of Paragon",{"type":17,"tag":29,"props":87185,"children":87186},{},[87187],{"type":23,"value":87188},"Merge is often preferred when:",{"type":17,"tag":29,"props":87190,"children":87191},{},[87192],{"type":17,"tag":48,"props":87193,"children":87194},{},[87195],{"type":23,"value":87196},"You need broad coverage within specific categories",{"type":17,"tag":29,"props":87198,"children":87199},{},[87200],{"type":23,"value":87201},"Merge focuses heavily on HRIS, ATS, CRM, and accounting integrations.",{"type":17,"tag":29,"props":87203,"children":87204},{},[87205],{"type":17,"tag":48,"props":87206,"children":87207},{},[87208],{"type":23,"value":87209},"Your application relies on cached data",{"type":17,"tag":29,"props":87211,"children":87212},{},[87213],{"type":23,"value":87214},"Because Merge stores data locally, queries are often faster than live API calls.",{"type":17,"tag":29,"props":87216,"children":87217},{},[87218],{"type":17,"tag":48,"props":87219,"children":87220},{},[87221],{"type":23,"value":87222},"You want normalized schemas across similar platforms",{"type":17,"tag":29,"props":87224,"children":87225},{},[87226],{"type":23,"value":87227},"For example, employee objects across dozens of HRIS systems.",{"type":17,"tag":239,"props":87229,"children":87231},{"id":87230},"trade-offs-compared-to-paragon",[87232],{"type":23,"value":87233},"Trade-offs Compared to Paragon",{"type":17,"tag":29,"props":87235,"children":87236},{},[87237],{"type":23,"value":87238},"Merge simplifies schema mapping but introduces similar architectural constraints as Paragon:",{"type":17,"tag":80,"props":87240,"children":87241},{},[87242,87252,87262],{"type":17,"tag":84,"props":87243,"children":87244},{},[87245,87247],{"type":23,"value":87246},"Data is ",{"type":17,"tag":48,"props":87248,"children":87249},{},[87250],{"type":23,"value":87251},"replicated into Merge's infrastructure",{"type":17,"tag":84,"props":87253,"children":87254},{},[87255,87257],{"type":23,"value":87256},"Freshness depends on ",{"type":17,"tag":48,"props":87258,"children":87259},{},[87260],{"type":23,"value":87261},"sync frequency",{"type":17,"tag":84,"props":87263,"children":87264},{},[87265,87267],{"type":23,"value":87266},"Compliance scope increases because ",{"type":17,"tag":48,"props":87268,"children":87269},{},[87270],{"type":23,"value":87271},"customer data is stored",{"type":17,"tag":68,"props":87273,"children":87275},{"id":87274},"_3-nango",[87276],{"type":23,"value":87277},"3. Nango",{"type":17,"tag":29,"props":87279,"children":87280},{},[87281],{"type":23,"value":87282},"Nango takes a very different approach compared to Paragon and most unified API platforms.",{"type":17,"tag":29,"props":87284,"children":87285},{},[87286,87288,87293],{"type":23,"value":87287},"It provides a ",{"type":17,"tag":48,"props":87289,"children":87290},{},[87291],{"type":23,"value":87292},"code-first integration infrastructure",{"type":23,"value":87294}," where developers write TypeScript functions that run on Nango's runtime.",{"type":17,"tag":29,"props":87296,"children":87297},{},[87298],{"type":23,"value":87299},"These functions handle:",{"type":17,"tag":80,"props":87301,"children":87302},{},[87303,87308,87313,87318],{"type":17,"tag":84,"props":87304,"children":87305},{},[87306],{"type":23,"value":87307},"OAuth authentication",{"type":17,"tag":84,"props":87309,"children":87310},{},[87311],{"type":23,"value":87312},"API polling",{"type":17,"tag":84,"props":87314,"children":87315},{},[87316],{"type":23,"value":87317},"Data synchronization",{"type":17,"tag":84,"props":87319,"children":87320},{},[87321],{"type":23,"value":87322},"Schema transformations",{"type":17,"tag":29,"props":87324,"children":87325},{},[87326],{"type":23,"value":87327},"Instead of relying on a prebuilt unified schema, developers define their own models and integration logic.",{"type":17,"tag":239,"props":87329,"children":87331},{"id":87330},"key-features-2",[87332],{"type":23,"value":86934},{"type":17,"tag":29,"props":87334,"children":87335},{},[87336],{"type":17,"tag":48,"props":87337,"children":87338},{},[87339],{"type":23,"value":87340},"OAuth infrastructure",{"type":17,"tag":29,"props":87342,"children":87343},{},[87344],{"type":23,"value":87345},"Nango handles authentication flows, token refresh, and credential storage across hundreds of APIs.",{"type":17,"tag":29,"props":87347,"children":87348},{},[87349],{"type":17,"tag":48,"props":87350,"children":87351},{},[87352],{"type":23,"value":87353},"Custom sync functions",{"type":17,"tag":29,"props":87355,"children":87356},{},[87357],{"type":23,"value":87358},"Developers write TypeScript sync jobs that fetch and transform data.",{"type":17,"tag":29,"props":87360,"children":87361},{},[87362],{"type":17,"tag":48,"props":87363,"children":87364},{},[87365],{"type":23,"value":87366},"Proxy API",{"type":17,"tag":29,"props":87368,"children":87369},{},[87370],{"type":23,"value":87371},"Applications can make real-time API calls through Nango's proxy with automatic credential injection.",{"type":17,"tag":29,"props":87373,"children":87374},{},[87375],{"type":17,"tag":48,"props":87376,"children":87377},{},[87378],{"type":23,"value":87379},"700+ supported APIs",{"type":17,"tag":29,"props":87381,"children":87382},{},[87383],{"type":23,"value":87384},"Developers can integrate with a large catalog of SaaS services.",{"type":17,"tag":29,"props":87386,"children":87387},{},[87388],{"type":17,"tag":48,"props":87389,"children":87390},{},[87391],{"type":23,"value":87392},"Self-hosting options",{"type":17,"tag":29,"props":87394,"children":87395},{},[87396],{"type":23,"value":87397},"Nango can be deployed in private infrastructure.",{"type":17,"tag":239,"props":87399,"children":87401},{"id":87400},"when-to-choose-nango-instead-of-paragon",[87402],{"type":23,"value":87403},"When to Choose Nango Instead of Paragon",{"type":17,"tag":29,"props":87405,"children":87406},{},[87407],{"type":23,"value":87408},"Nango is best suited for teams that:",{"type":17,"tag":29,"props":87410,"children":87411},{},[87412],{"type":17,"tag":48,"props":87413,"children":87414},{},[87415],{"type":23,"value":87416},"Want full control over integration logic",{"type":17,"tag":29,"props":87418,"children":87419},{},[87420],{"type":23,"value":87421},"Developers write the code for each sync pipeline.",{"type":17,"tag":29,"props":87423,"children":87424},{},[87425],{"type":17,"tag":48,"props":87426,"children":87427},{},[87428],{"type":23,"value":87429},"Need self-hosted infrastructure",{"type":17,"tag":29,"props":87431,"children":87432},{},[87433],{"type":23,"value":87434},"Some organizations require integrations to run within their own environment.",{"type":17,"tag":29,"props":87436,"children":87437},{},[87438],{"type":17,"tag":48,"props":87439,"children":87440},{},[87441],{"type":23,"value":87442},"Prefer code-first integration development",{"type":17,"tag":29,"props":87444,"children":87445},{},[87446],{"type":23,"value":87447},"Instead of relying on pre-built schemas.",{"type":17,"tag":239,"props":87449,"children":87451},{"id":87450},"trade-offs-compared-to-paragon-1",[87452],{"type":23,"value":87233},{"type":17,"tag":29,"props":87454,"children":87455},{},[87456],{"type":23,"value":87457},"The flexibility of Nango comes with increased engineering responsibility:",{"type":17,"tag":80,"props":87459,"children":87460},{},[87461,87471,87481],{"type":17,"tag":84,"props":87462,"children":87463},{},[87464,87466],{"type":23,"value":87465},"Developers must ",{"type":17,"tag":48,"props":87467,"children":87468},{},[87469],{"type":23,"value":87470},"write and maintain sync code",{"type":17,"tag":84,"props":87472,"children":87473},{},[87474,87476],{"type":23,"value":87475},"Integration logic must be ",{"type":17,"tag":48,"props":87477,"children":87478},{},[87479],{"type":23,"value":87480},"updated whenever APIs change",{"type":17,"tag":84,"props":87482,"children":87483},{},[87484,87485],{"type":23,"value":87246},{"type":17,"tag":48,"props":87486,"children":87487},{},[87488],{"type":23,"value":87489},"stored inside Nango's database",{"type":17,"tag":29,"props":87491,"children":87492},{},[87493],{"type":23,"value":87494},"This approach works well for teams with strong internal integration expertise but may increase maintenance overhead.",{"type":17,"tag":11616,"props":87496,"children":87498},{"width":11618,"height":11619,"src":87497,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/kBKThqfLyjo",[],{"type":17,"tag":68,"props":87500,"children":87502},{"id":87501},"comparison-unified-vs-merge-vs-nango-vs-paragon",[87503],{"type":23,"value":87504},"Comparison: Unified vs Merge vs Nango vs Paragon",{"type":17,"tag":7231,"props":87506,"children":87507},{},[87508,87536],{"type":17,"tag":7235,"props":87509,"children":87510},{},[87511],{"type":17,"tag":7239,"props":87512,"children":87513},{},[87514,87519,87524,87528,87532],{"type":17,"tag":7243,"props":87515,"children":87516},{},[87517],{"type":23,"value":87518},"Feature",{"type":17,"tag":7243,"props":87520,"children":87521},{},[87522],{"type":23,"value":87523},"Unified",{"type":17,"tag":7243,"props":87525,"children":87526},{},[87527],{"type":23,"value":227},{"type":17,"tag":7243,"props":87529,"children":87530},{},[87531],{"type":23,"value":1025},{"type":17,"tag":7243,"props":87533,"children":87534},{},[87535],{"type":23,"value":581},{"type":17,"tag":7259,"props":87537,"children":87538},{},[87539,87564,87590,87617,87645],{"type":17,"tag":7239,"props":87540,"children":87541},{},[87542,87546,87551,87555,87559],{"type":17,"tag":7266,"props":87543,"children":87544},{},[87545],{"type":23,"value":7359},{"type":17,"tag":7266,"props":87547,"children":87548},{},[87549],{"type":23,"value":87550},"Real-time pass-through",{"type":17,"tag":7266,"props":87552,"children":87553},{},[87554],{"type":23,"value":10452},{"type":17,"tag":7266,"props":87556,"children":87557},{},[87558],{"type":23,"value":86868},{"type":17,"tag":7266,"props":87560,"children":87561},{},[87562],{"type":23,"value":87563},"Workflow + sync pipelines",{"type":17,"tag":7239,"props":87565,"children":87566},{},[87567,87571,87575,87580,87585],{"type":17,"tag":7266,"props":87568,"children":87569},{},[87570],{"type":23,"value":69408},{"type":17,"tag":7266,"props":87572,"children":87573},{},[87574],{"type":23,"value":43678},{"type":17,"tag":7266,"props":87576,"children":87577},{},[87578],{"type":23,"value":87579},"Cached datasets",{"type":17,"tag":7266,"props":87581,"children":87582},{},[87583],{"type":23,"value":87584},"Stored sync cache",{"type":17,"tag":7266,"props":87586,"children":87587},{},[87588],{"type":23,"value":87589},"Stored sync datasets",{"type":17,"tag":7239,"props":87591,"children":87592},{},[87593,87597,87602,87607,87612],{"type":17,"tag":7266,"props":87594,"children":87595},{},[87596],{"type":23,"value":10049},{"type":17,"tag":7266,"props":87598,"children":87599},{},[87600],{"type":23,"value":87601},"Native + virtual webhooks",{"type":17,"tag":7266,"props":87603,"children":87604},{},[87605],{"type":23,"value":87606},"Webhooks after sync",{"type":17,"tag":7266,"props":87608,"children":87609},{},[87610],{"type":23,"value":87611},"Polling + webhooks",{"type":17,"tag":7266,"props":87613,"children":87614},{},[87615],{"type":23,"value":87616},"Sync events + workflows",{"type":17,"tag":7239,"props":87618,"children":87619},{},[87620,87625,87630,87635,87640],{"type":17,"tag":7266,"props":87621,"children":87622},{},[87623],{"type":23,"value":87624},"Schema model",{"type":17,"tag":7266,"props":87626,"children":87627},{},[87628],{"type":23,"value":87629},"Normalized objects with passthrough",{"type":17,"tag":7266,"props":87631,"children":87632},{},[87633],{"type":23,"value":87634},"Category-specific common models",{"type":17,"tag":7266,"props":87636,"children":87637},{},[87638],{"type":23,"value":87639},"Developer-defined models",{"type":17,"tag":7266,"props":87641,"children":87642},{},[87643],{"type":23,"value":87644},"Synced Object schemas",{"type":17,"tag":7239,"props":87646,"children":87647},{},[87648,87653,87658,87663,87668],{"type":17,"tag":7266,"props":87649,"children":87650},{},[87651],{"type":23,"value":87652},"Primary use case",{"type":17,"tag":7266,"props":87654,"children":87655},{},[87656],{"type":23,"value":87657},"Real-time SaaS and AI integrations",{"type":17,"tag":7266,"props":87659,"children":87660},{},[87661],{"type":23,"value":87662},"HRIS / CRM integrations",{"type":17,"tag":7266,"props":87664,"children":87665},{},[87666],{"type":23,"value":87667},"Custom integration infrastructure",{"type":17,"tag":7266,"props":87669,"children":87670},{},[87671],{"type":23,"value":87672},"Embedded integrations with workflows",{"type":17,"tag":68,"props":87674,"children":87675},{"id":1552},[87676],{"type":23,"value":44411},{"type":17,"tag":29,"props":87678,"children":87679},{},[87680],{"type":23,"value":87681},"The integration infrastructure landscape has evolved significantly over the past few years.",{"type":17,"tag":29,"props":87683,"children":87684},{},[87685],{"type":23,"value":87686},"Platforms now fall into several architectural categories:",{"type":17,"tag":80,"props":87688,"children":87689},{},[87690,87700,87710,87720,87730],{"type":17,"tag":84,"props":87691,"children":87692},{},[87693,87698],{"type":17,"tag":48,"props":87694,"children":87695},{},[87696],{"type":23,"value":87697},"Real-time pass-through APIs",{"type":23,"value":87699}," (Unified, Apideck, Truto)",{"type":17,"tag":84,"props":87701,"children":87702},{},[87703,87708],{"type":17,"tag":48,"props":87704,"children":87705},{},[87706],{"type":23,"value":87707},"Sync-and-store unified APIs",{"type":23,"value":87709}," (Merge, Finch, Kombo)",{"type":17,"tag":84,"props":87711,"children":87712},{},[87713,87718],{"type":17,"tag":48,"props":87714,"children":87715},{},[87716],{"type":23,"value":87717},"Workflow automation platforms",{"type":23,"value":87719}," (Paragon)",{"type":17,"tag":84,"props":87721,"children":87722},{},[87723,87728],{"type":17,"tag":48,"props":87724,"children":87725},{},[87726],{"type":23,"value":87727},"Code-first integration frameworks",{"type":23,"value":87729}," (Nango)",{"type":17,"tag":84,"props":87731,"children":87732},{},[87733,87738],{"type":17,"tag":48,"props":87734,"children":87735},{},[87736],{"type":23,"value":87737},"AI tool execution layers",{"type":23,"value":87739}," (Composio)",{"type":17,"tag":29,"props":87741,"children":87742},{},[87743],{"type":23,"value":87744},"Paragon remains a strong option for SaaS teams that want embedded workflows and managed sync pipelines.",{"type":17,"tag":29,"props":87746,"children":87747},{},[87748],{"type":23,"value":87749},"However, many companies are now prioritizing:",{"type":17,"tag":80,"props":87751,"children":87752},{},[87753,87760,87768],{"type":17,"tag":84,"props":87754,"children":87755},{},[87756],{"type":17,"tag":48,"props":87757,"children":87758},{},[87759],{"type":23,"value":4711},{"type":17,"tag":84,"props":87761,"children":87762},{},[87763],{"type":17,"tag":48,"props":87764,"children":87765},{},[87766],{"type":23,"value":87767},"AI-agent compatibility",{"type":17,"tag":84,"props":87769,"children":87770},{},[87771],{"type":17,"tag":48,"props":87772,"children":87773},{},[87774],{"type":23,"value":87775},"lower compliance risk from storing customer data",{"type":17,"tag":29,"props":87777,"children":87778},{},[87779],{"type":23,"value":87780},"In these scenarios, real-time integration architectures like Unified can provide a more scalable foundation.",{"type":17,"tag":29,"props":87782,"children":87783},{},[87784],{"type":23,"value":87785},"Before selecting an integration platform, teams should evaluate:",{"type":17,"tag":80,"props":87787,"children":87788},{},[87789,87799,87811,87821],{"type":17,"tag":84,"props":87790,"children":87791},{},[87792,87794],{"type":23,"value":87793},"Whether their product requires ",{"type":17,"tag":48,"props":87795,"children":87796},{},[87797],{"type":23,"value":87798},"live data or cached datasets",{"type":17,"tag":84,"props":87800,"children":87801},{},[87802,87804,87809],{"type":23,"value":87803},"How much ",{"type":17,"tag":48,"props":87805,"children":87806},{},[87807],{"type":23,"value":87808},"operational infrastructure",{"type":23,"value":87810}," they want to manage",{"type":17,"tag":84,"props":87812,"children":87813},{},[87814,87816],{"type":23,"value":87815},"Whether integrations must support ",{"type":17,"tag":48,"props":87817,"children":87818},{},[87819],{"type":23,"value":87820},"AI agents or automation workflows",{"type":17,"tag":84,"props":87822,"children":87823},{},[87824,87826],{"type":23,"value":87825},"Their ",{"type":17,"tag":48,"props":87827,"children":87828},{},[87829],{"type":23,"value":87830},"security and compliance requirements",{"type":17,"tag":29,"props":87832,"children":87833},{},[87834],{"type":23,"value":87835},"Understanding the architectural trade-offs between these platforms will help ensure the integration strategy you choose scales with your product and your customers.",{"type":17,"tag":29,"props":87837,"children":87838},{},[87839],{"type":17,"tag":133,"props":87840,"children":87842},{"href":1612,"rel":87841},[214],[87843],{"type":23,"value":44481},{"type":17,"tag":29,"props":87845,"children":87846},{},[87847],{"type":17,"tag":133,"props":87848,"children":87850},{"href":1623,"rel":87849},[214],[87851],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":87853},[87854,87855,87859,87864,87869,87870],{"id":86786,"depth":1629,"text":86789},{"id":86887,"depth":1629,"text":86890,"children":87856},[87857,87858],{"id":86931,"depth":1635,"text":86934},{"id":87033,"depth":1635,"text":87036},{"id":87096,"depth":1629,"text":87099,"children":87860},[87861,87862,87863],{"id":87124,"depth":1635,"text":86934},{"id":87180,"depth":1635,"text":87183},{"id":87230,"depth":1635,"text":87233},{"id":87274,"depth":1629,"text":87277,"children":87865},[87866,87867,87868],{"id":87330,"depth":1635,"text":86934},{"id":87400,"depth":1635,"text":87403},{"id":87450,"depth":1635,"text":87233},{"id":87501,"depth":1629,"text":87504},{"id":1552,"depth":1629,"text":44411},"content:blog:3_top_paragon_alternatives_to_consider_in_2026.md","blog/3_top_paragon_alternatives_to_consider_in_2026.md","blog/3_top_paragon_alternatives_to_consider_in_2026",{"_path":87875,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":87876,"description":87877,"img":87878,"date":86676,"tag":12,"body":87879,"_type":1677,"_id":88992,"_source":1679,"_file":88993,"_stem":88994,"_extension":1682},"/blog/top_5_merge_dev_alternatives_for_native_saas_integrations_2026_guide","Top 5 Merge.dev Alternatives for Native SaaS Integrations (2026 Guide)","SaaS companies increasingly rely on integrations to connect their products with the systems their customers already use. Platforms like https,//merge.dev have...","https://s3.us-east-2.amazonaws.com/unified-article-images/top_5_merge_dev_alternatives_for_native_saas_integrations_2026_guide-icon.png",{"type":14,"children":87880,"toc":88967},[87881,87886,87889,87896,87915,87920,87925,87937,87955,87960,87965,87971,88078,88089,88093,88110,88122,88126,88133,88138,88145,88150,88157,88162,88176,88181,88189,88194,88202,88207,88213,88218,88228,88233,88243,88247,88257,88262,88272,88277,88289,88295,88305,88310,88314,88319,88324,88329,88334,88340,88345,88354,88363,88372,88377,88382,88388,88393,88405,88409,88414,88419,88424,88429,88434,88440,88445,88454,88464,88473,88478,88484,88489,88501,88506,88511,88516,88521,88526,88532,88537,88546,88556,88565,88570,88576,88587,88592,88597,88602,88607,88612,88617,88622,88628,88633,88643,88653,88663,88668,88674,88860,88864,88869,88880,88885,88917,88922,88934,88946,88951,88959],{"type":17,"tag":18,"props":87882,"children":87884},{"id":87883},"top-5-mergedev-alternatives-for-native-saas-integrations-2026-guide",[87885],{"type":23,"value":87876},{"type":17,"tag":25,"props":87887,"children":87888},{},[],{"type":17,"tag":29,"props":87890,"children":87891},{},[87892],{"type":17,"tag":33,"props":87893,"children":87894},{},[87895],{"type":23,"value":37},{"type":17,"tag":29,"props":87897,"children":87898},{},[87899,87901,87907,87909,87913],{"type":23,"value":87900},"SaaS companies increasingly rely on integrations to connect their products with the systems their customers already use. Platforms like ",{"type":17,"tag":133,"props":87902,"children":87904},{"href":223,"rel":87903},[214],[87905],{"type":23,"value":87906},"https://merge.dev",{"type":23,"value":87908}," have become popular because they provide a ",{"type":17,"tag":133,"props":87910,"children":87911},{"href":7691},[87912],{"type":23,"value":7459},{"type":23,"value":87914}," that normalizes integrations across categories such as HRIS, ATS, CRM, and accounting.",{"type":17,"tag":29,"props":87916,"children":87917},{},[87918],{"type":23,"value":87919},"Merge helps teams ship integrations faster by providing standardized data models and authentication infrastructure. Instead of building and maintaining dozens of individual connectors, developers integrate once with Merge's common models.",{"type":17,"tag":29,"props":87921,"children":87922},{},[87923],{"type":23,"value":87924},"However, Merge's architecture is not the best fit for every use case.",{"type":17,"tag":29,"props":87926,"children":87927},{},[87928,87930,87935],{"type":23,"value":87929},"Merge operates primarily as a ",{"type":17,"tag":48,"props":87931,"children":87932},{},[87933],{"type":23,"value":87934},"sync-and-store integration platform",{"type":23,"value":87936},". When a customer connects an integration, Merge performs an initial sync and then periodically refreshes the stored dataset. Applications query this cached data through Merge's API. While this approach enables fast queries, it introduces several tradeoffs:",{"type":17,"tag":80,"props":87938,"children":87939},{},[87940,87945,87950],{"type":17,"tag":84,"props":87941,"children":87942},{},[87943],{"type":23,"value":87944},"Data freshness depends on sync frequency",{"type":17,"tag":84,"props":87946,"children":87947},{},[87948],{"type":23,"value":87949},"Customer data is replicated into Merge's infrastructure",{"type":17,"tag":84,"props":87951,"children":87952},{},[87953],{"type":23,"value":87954},"Sync pipelines must run continuously to stay current",{"type":17,"tag":29,"props":87956,"children":87957},{},[87958],{"type":23,"value":87959},"Because of these constraints, many SaaS teams evaluate alternative integration architectures when building native integrations for their products.",{"type":17,"tag":29,"props":87961,"children":87962},{},[87963],{"type":23,"value":87964},"Below are five leading alternatives to Merge.dev and the types of teams each platform is best suited for.",{"type":17,"tag":68,"props":87966,"children":87968},{"id":87967},"mergedev-alternatives-at-a-glance",[87969],{"type":23,"value":87970},"Merge.dev Alternatives at a Glance",{"type":17,"tag":7231,"props":87972,"children":87973},{},[87974,87992],{"type":17,"tag":7235,"props":87975,"children":87976},{},[87977],{"type":17,"tag":7239,"props":87978,"children":87979},{},[87980,87984,87988],{"type":17,"tag":7243,"props":87981,"children":87982},{},[87983],{"type":23,"value":43242},{"type":17,"tag":7243,"props":87985,"children":87986},{},[87987],{"type":23,"value":7359},{"type":17,"tag":7243,"props":87989,"children":87990},{},[87991],{"type":23,"value":43247},{"type":17,"tag":7259,"props":87993,"children":87994},{},[87995,88010,88027,88044,88061],{"type":17,"tag":7239,"props":87996,"children":87997},{},[87998,88002,88006],{"type":17,"tag":7266,"props":87999,"children":88000},{},[88001],{"type":23,"value":217},{"type":17,"tag":7266,"props":88003,"children":88004},{},[88005],{"type":23,"value":86828},{"type":17,"tag":7266,"props":88007,"children":88008},{},[88009],{"type":23,"value":86833},{"type":17,"tag":7239,"props":88011,"children":88012},{},[88013,88017,88022],{"type":17,"tag":7266,"props":88014,"children":88015},{},[88016],{"type":23,"value":237},{"type":17,"tag":7266,"props":88018,"children":88019},{},[88020],{"type":23,"value":88021},"Real-time unified API with virtual webhooks",{"type":17,"tag":7266,"props":88023,"children":88024},{},[88025],{"type":23,"value":88026},"SaaS teams building integrations across multiple SaaS categories",{"type":17,"tag":7239,"props":88028,"children":88029},{},[88030,88034,88039],{"type":17,"tag":7266,"props":88031,"children":88032},{},[88033],{"type":23,"value":8037},{"type":17,"tag":7266,"props":88035,"children":88036},{},[88037],{"type":23,"value":88038},"Real-time proxy with declarative schema mapping",{"type":17,"tag":7266,"props":88040,"children":88041},{},[88042],{"type":23,"value":88043},"Teams needing customizable unified schemas",{"type":17,"tag":7239,"props":88045,"children":88046},{},[88047,88051,88056],{"type":17,"tag":7266,"props":88048,"children":88049},{},[88050],{"type":23,"value":581},{"type":17,"tag":7266,"props":88052,"children":88053},{},[88054],{"type":23,"value":88055},"Workflow automation + managed sync pipelines",{"type":17,"tag":7266,"props":88057,"children":88058},{},[88059],{"type":23,"value":88060},"Embedded integration marketplaces and workflow automation",{"type":17,"tag":7239,"props":88062,"children":88063},{},[88064,88068,88073],{"type":17,"tag":7266,"props":88065,"children":88066},{},[88067],{"type":23,"value":1025},{"type":17,"tag":7266,"props":88069,"children":88070},{},[88071],{"type":23,"value":88072},"Code-first integration infrastructure",{"type":17,"tag":7266,"props":88074,"children":88075},{},[88076],{"type":23,"value":88077},"Engineering teams wanting full control over sync logic",{"type":17,"tag":29,"props":88079,"children":88080},{},[88081,88083,88088],{"type":23,"value":88082},"Each platform solves integration challenges differently depending on priorities such as ",{"type":17,"tag":48,"props":88084,"children":88085},{},[88086],{"type":23,"value":88087},"data freshness, architectural control, or operational simplicity",{"type":23,"value":54},{"type":17,"tag":68,"props":88090,"children":88091},{"id":86887},[88092],{"type":23,"value":86890},{"type":17,"tag":29,"props":88094,"children":88095},{},[88096,88101,88103,88108],{"type":17,"tag":133,"props":88097,"children":88099},{"href":42620,"rel":88098},[214],[88100],{"type":23,"value":217},{"type":23,"value":88102}," is a ",{"type":17,"tag":48,"props":88104,"children":88105},{},[88106],{"type":23,"value":88107},"real-time unified API platform",{"type":23,"value":88109}," designed for SaaS applications and AI products that need to access live data across hundreds of integrations without replicating it into a data warehouse.",{"type":17,"tag":29,"props":88111,"children":88112},{},[88113,88115,88120],{"type":23,"value":88114},"Unlike Merge's sync-based architecture, Unified uses a ",{"type":17,"tag":48,"props":88116,"children":88117},{},[88118],{"type":23,"value":88119},"pass-through execution model",{"type":23,"value":88121}," where every request is executed directly against the source API at runtime.",{"type":17,"tag":239,"props":88123,"children":88124},{"id":86931},[88125],{"type":23,"value":86934},{"type":17,"tag":29,"props":88127,"children":88128},{},[88129],{"type":17,"tag":48,"props":88130,"children":88131},{},[88132],{"type":23,"value":86942},{"type":17,"tag":29,"props":88134,"children":88135},{},[88136],{"type":23,"value":88137},"Every API call hits the upstream integration directly. There are no scheduled sync jobs or cached datasets.",{"type":17,"tag":29,"props":88139,"children":88140},{},[88141],{"type":17,"tag":48,"props":88142,"children":88143},{},[88144],{"type":23,"value":69706},{"type":17,"tag":29,"props":88146,"children":88147},{},[88148],{"type":23,"value":88149},"Unified does not store customer records. Requests are processed in memory and returned immediately, reducing compliance and security risks.",{"type":17,"tag":29,"props":88151,"children":88152},{},[88153],{"type":17,"tag":48,"props":88154,"children":88155},{},[88156],{"type":23,"value":69732},{"type":17,"tag":29,"props":88158,"children":88159},{},[88160],{"type":23,"value":88161},"Unified provides consistent objects across categories such as CRM, ATS, HRIS, messaging, marketing, and file storage.",{"type":17,"tag":29,"props":88163,"children":88164},{},[88165],{"type":17,"tag":48,"props":88166,"children":88167},{},[88168,88170,88174],{"type":23,"value":88169},"Native and [virtual ",{"type":17,"tag":133,"props":88171,"children":88172},{"href":4999},[88173],{"type":23,"value":5002},{"type":23,"value":88175},"](/blog/unlock_real_time_data_with_virtual_webhooks)",{"type":17,"tag":29,"props":88177,"children":88178},{},[88179],{"type":23,"value":88180},"Unified delivers real-time updates using native provider webhooks when available. For systems without webhooks, it creates virtual webhooks that detect changes automatically.",{"type":17,"tag":29,"props":88182,"children":88183},{},[88184],{"type":17,"tag":48,"props":88185,"children":88186},{},[88187],{"type":23,"value":88188},"AI-ready MCP server",{"type":17,"tag":29,"props":88190,"children":88191},{},[88192],{"type":23,"value":88193},"Unified exposes integrations as callable tools via its Model Context Protocol server, allowing AI agents to interact with SaaS systems safely.",{"type":17,"tag":29,"props":88195,"children":88196},{},[88197],{"type":17,"tag":48,"props":88198,"children":88199},{},[88200],{"type":23,"value":88201},"415+ integrations across 24 categories",{"type":17,"tag":29,"props":88203,"children":88204},{},[88205],{"type":23,"value":88206},"Coverage includes CRM, HRIS, ATS, accounting, messaging, file storage, commerce, and many other SaaS platforms.",{"type":17,"tag":239,"props":88208,"children":88210},{"id":88209},"when-to-choose-unified-instead-of-merge",[88211],{"type":23,"value":88212},"When to Choose Unified Instead of Merge",{"type":17,"tag":29,"props":88214,"children":88215},{},[88216],{"type":23,"value":88217},"Unified is typically the better option when:",{"type":17,"tag":29,"props":88219,"children":88220},{},[88221,88223],{"type":23,"value":88222},"You need ",{"type":17,"tag":48,"props":88224,"children":88225},{},[88226],{"type":23,"value":88227},"live data from source systems",{"type":17,"tag":29,"props":88229,"children":88230},{},[88231],{"type":23,"value":88232},"Merge's scheduled sync model can introduce delays depending on the refresh schedule.",{"type":17,"tag":29,"props":88234,"children":88235},{},[88236,88238],{"type":23,"value":88237},"You want to ",{"type":17,"tag":48,"props":88239,"children":88240},{},[88241],{"type":23,"value":88242},"avoid storing customer data",{"type":17,"tag":29,"props":88244,"children":88245},{},[88246],{"type":23,"value":87067},{"type":17,"tag":29,"props":88248,"children":88249},{},[88250,88252],{"type":23,"value":88251},"You are building ",{"type":17,"tag":48,"props":88253,"children":88254},{},[88255],{"type":23,"value":88256},"AI-driven SaaS products",{"type":17,"tag":29,"props":88258,"children":88259},{},[88260],{"type":23,"value":88261},"Unified's MCP server allows AI agents to safely call integrations as structured tools.",{"type":17,"tag":29,"props":88263,"children":88264},{},[88265,88267],{"type":23,"value":88266},"You want ",{"type":17,"tag":48,"props":88268,"children":88269},{},[88270],{"type":23,"value":88271},"simpler integration infrastructure",{"type":17,"tag":29,"props":88273,"children":88274},{},[88275],{"type":23,"value":88276},"There are no sync pipelines or background jobs to maintain.",{"type":17,"tag":29,"props":88278,"children":88279},{},[88280,88282,88288],{"type":23,"value":88281},"Learn more about Unified's architecture at ",{"type":17,"tag":133,"props":88283,"children":88285},{"href":212,"rel":88284},[214],[88286],{"type":23,"value":88287},"https://unified.to",{"type":23,"value":54},{"type":17,"tag":68,"props":88290,"children":88292},{"id":88291},"_2-apideck",[88293],{"type":23,"value":88294},"2. Apideck",{"type":17,"tag":29,"props":88296,"children":88297},{},[88298,88300,88304],{"type":23,"value":88299},"Apideck provides a unified API platform similar to Merge but built around a ",{"type":17,"tag":48,"props":88301,"children":88302},{},[88303],{"type":23,"value":50812},{"type":23,"value":54},{"type":17,"tag":29,"props":88306,"children":88307},{},[88308],{"type":23,"value":88309},"Instead of syncing data into a central database, Apideck proxies requests directly to the upstream API and returns normalized responses.",{"type":17,"tag":239,"props":88311,"children":88312},{"id":87124},[88313],{"type":23,"value":86934},{"type":17,"tag":29,"props":88315,"children":88316},{},[88317],{"type":23,"value":88318},"Unified APIs across categories such as CRM, HRIS, accounting, ecommerce, and issue tracking.",{"type":17,"tag":29,"props":88320,"children":88321},{},[88322],{"type":23,"value":88323},"Virtual webhooks that simulate real-time events by polling providers without native webhook support.",{"type":17,"tag":29,"props":88325,"children":88326},{},[88327],{"type":23,"value":88328},"A Proxy API that allows direct access to provider-specific endpoints when unified models do not cover them.",{"type":17,"tag":29,"props":88330,"children":88331},{},[88332],{"type":23,"value":88333},"Standardized rate-limit headers to simplify retry logic across providers.",{"type":17,"tag":239,"props":88335,"children":88337},{"id":88336},"when-to-choose-apideck-instead-of-merge",[88338],{"type":23,"value":88339},"When to Choose Apideck Instead of Merge",{"type":17,"tag":29,"props":88341,"children":88342},{},[88343],{"type":23,"value":88344},"Apideck works well when:",{"type":17,"tag":29,"props":88346,"children":88347},{},[88348,88349],{"type":23,"value":88266},{"type":17,"tag":48,"props":88350,"children":88351},{},[88352],{"type":23,"value":88353},"real-time data access without cached datasets",{"type":17,"tag":29,"props":88355,"children":88356},{},[88357,88358],{"type":23,"value":88222},{"type":17,"tag":48,"props":88359,"children":88360},{},[88361],{"type":23,"value":88362},"unified APIs across many SaaS categories",{"type":17,"tag":29,"props":88364,"children":88365},{},[88366,88367],{"type":23,"value":88266},{"type":17,"tag":48,"props":88368,"children":88369},{},[88370],{"type":23,"value":88371},"direct passthrough access to provider APIs",{"type":17,"tag":29,"props":88373,"children":88374},{},[88375],{"type":23,"value":88376},"Because Apideck does not store customer data, it avoids some of the compliance overhead associated with sync-and-store platforms.",{"type":17,"tag":29,"props":88378,"children":88379},{},[88380],{"type":23,"value":88381},"However, pass-through architectures can introduce latency because responses depend on the upstream API.",{"type":17,"tag":68,"props":88383,"children":88385},{"id":88384},"_3-truto",[88386],{"type":23,"value":88387},"3. Truto",{"type":17,"tag":29,"props":88389,"children":88390},{},[88391],{"type":23,"value":88392},"Truto is another real-time unified API platform that emphasizes customization through a declarative mapping layer.",{"type":17,"tag":29,"props":88394,"children":88395},{},[88396,88398,88403],{"type":23,"value":88397},"Like Unified and Apideck, Truto uses a ",{"type":17,"tag":48,"props":88399,"children":88400},{},[88401],{"type":23,"value":88402},"proxy-based architecture",{"type":23,"value":88404}," where API requests are forwarded directly to the source provider rather than served from cached datasets.",{"type":17,"tag":239,"props":88406,"children":88407},{"id":87330},[88408],{"type":23,"value":86934},{"type":17,"tag":29,"props":88410,"children":88411},{},[88412],{"type":23,"value":88413},"Real-time API calls with no data caching.",{"type":17,"tag":29,"props":88415,"children":88416},{},[88417],{"type":23,"value":88418},"Declarative schema mappings powered by JSONata transformations.",{"type":17,"tag":29,"props":88420,"children":88421},{},[88422],{"type":23,"value":88423},"RapidBridge orchestration for batch ingestion and historical data sync.",{"type":17,"tag":29,"props":88425,"children":88426},{},[88427],{"type":23,"value":88428},"Proxy API for vendor-specific endpoints.",{"type":17,"tag":29,"props":88430,"children":88431},{},[88432],{"type":23,"value":88433},"Webhook pipelines that normalize provider events into unified payloads.",{"type":17,"tag":239,"props":88435,"children":88437},{"id":88436},"when-to-choose-truto-instead-of-merge",[88438],{"type":23,"value":88439},"When to Choose Truto Instead of Merge",{"type":17,"tag":29,"props":88441,"children":88442},{},[88443],{"type":23,"value":88444},"Truto is a strong option when:",{"type":17,"tag":29,"props":88446,"children":88447},{},[88448,88449],{"type":23,"value":88266},{"type":17,"tag":48,"props":88450,"children":88451},{},[88452],{"type":23,"value":88453},"real-time integration architecture",{"type":17,"tag":29,"props":88455,"children":88456},{},[88457,88459],{"type":23,"value":88458},"Your integrations require ",{"type":17,"tag":48,"props":88460,"children":88461},{},[88462],{"type":23,"value":88463},"custom schema transformations",{"type":17,"tag":29,"props":88465,"children":88466},{},[88467,88468],{"type":23,"value":88222},{"type":17,"tag":48,"props":88469,"children":88470},{},[88471],{"type":23,"value":88472},"flexible unified models that can be overridden per customer",{"type":17,"tag":29,"props":88474,"children":88475},{},[88476],{"type":23,"value":88477},"The trade-off is that teams must manage more complex mapping logic when transforming provider data.",{"type":17,"tag":68,"props":88479,"children":88481},{"id":88480},"_4-paragon",[88482],{"type":23,"value":88483},"4. Paragon",{"type":17,"tag":29,"props":88485,"children":88486},{},[88487],{"type":23,"value":88488},"Paragon provides embedded integration infrastructure with a strong focus on workflow automation.",{"type":17,"tag":29,"props":88490,"children":88491},{},[88492,88494,88499],{"type":23,"value":88493},"Its architecture combines a ",{"type":17,"tag":48,"props":88495,"children":88496},{},[88497],{"type":23,"value":88498},"sync-and-store data model",{"type":23,"value":88500}," with a workflow engine for orchestrating integrations.",{"type":17,"tag":239,"props":88502,"children":88504},{"id":88503},"key-features-3",[88505],{"type":23,"value":86934},{"type":17,"tag":29,"props":88507,"children":88508},{},[88509],{"type":23,"value":88510},"Managed Sync pipelines that replicate data into Paragon's infrastructure.",{"type":17,"tag":29,"props":88512,"children":88513},{},[88514],{"type":23,"value":88515},"ActionKit, which exposes prebuilt API actions for common integrations.",{"type":17,"tag":29,"props":88517,"children":88518},{},[88519],{"type":23,"value":88520},"Workflow automation tools that trigger integration actions based on events.",{"type":17,"tag":29,"props":88522,"children":88523},{},[88524],{"type":23,"value":88525},"130+ connectors across common SaaS platforms.",{"type":17,"tag":239,"props":88527,"children":88529},{"id":88528},"when-to-choose-paragon-instead-of-merge",[88530],{"type":23,"value":88531},"When to Choose Paragon Instead of Merge",{"type":17,"tag":29,"props":88533,"children":88534},{},[88535],{"type":23,"value":88536},"Paragon may be preferable when:",{"type":17,"tag":29,"props":88538,"children":88539},{},[88540,88541],{"type":23,"value":88266},{"type":17,"tag":48,"props":88542,"children":88543},{},[88544],{"type":23,"value":88545},"workflow automation alongside integrations",{"type":17,"tag":29,"props":88547,"children":88548},{},[88549,88551],{"type":23,"value":88550},"Your product requires ",{"type":17,"tag":48,"props":88552,"children":88553},{},[88554],{"type":23,"value":88555},"low-code configuration of integration workflows",{"type":17,"tag":29,"props":88557,"children":88558},{},[88559,88560],{"type":23,"value":88222},{"type":17,"tag":48,"props":88561,"children":88562},{},[88563],{"type":23,"value":88564},"prebuilt integration actions for common SaaS tools",{"type":17,"tag":29,"props":88566,"children":88567},{},[88568],{"type":23,"value":88569},"However, Paragon stores replicated data and relies on periodic sync pipelines, which introduces latency similar to Merge's architecture.",{"type":17,"tag":68,"props":88571,"children":88573},{"id":88572},"_5-nango",[88574],{"type":23,"value":88575},"5. Nango",{"type":17,"tag":29,"props":88577,"children":88578},{},[88579,88581,88586],{"type":23,"value":88580},"Nango is a developer-focused integration infrastructure platform that takes a ",{"type":17,"tag":48,"props":88582,"children":88583},{},[88584],{"type":23,"value":88585},"code-first approach",{"type":23,"value":54},{"type":17,"tag":29,"props":88588,"children":88589},{},[88590],{"type":23,"value":88591},"Rather than providing a predefined unified schema, Nango allows engineers to write their own sync logic and mapping code.",{"type":17,"tag":239,"props":88593,"children":88595},{"id":88594},"key-features-4",[88596],{"type":23,"value":86934},{"type":17,"tag":29,"props":88598,"children":88599},{},[88600],{"type":23,"value":88601},"OAuth infrastructure for managing authentication across hundreds of APIs.",{"type":17,"tag":29,"props":88603,"children":88604},{},[88605],{"type":23,"value":88606},"Proxy API for real-time requests.",{"type":17,"tag":29,"props":88608,"children":88609},{},[88610],{"type":23,"value":88611},"TypeScript runtime for implementing custom integration logic.",{"type":17,"tag":29,"props":88613,"children":88614},{},[88615],{"type":23,"value":88616},"Polling-based sync engine that stores records in a local cache.",{"type":17,"tag":29,"props":88618,"children":88619},{},[88620],{"type":23,"value":88621},"700+ supported APIs.",{"type":17,"tag":239,"props":88623,"children":88625},{"id":88624},"when-to-choose-nango-instead-of-merge",[88626],{"type":23,"value":88627},"When to Choose Nango Instead of Merge",{"type":17,"tag":29,"props":88629,"children":88630},{},[88631],{"type":23,"value":88632},"Nango works best when:",{"type":17,"tag":29,"props":88634,"children":88635},{},[88636,88638],{"type":23,"value":88637},"Your team wants ",{"type":17,"tag":48,"props":88639,"children":88640},{},[88641],{"type":23,"value":88642},"full control over integration logic",{"type":17,"tag":29,"props":88644,"children":88645},{},[88646,88648],{"type":23,"value":88647},"You prefer ",{"type":17,"tag":48,"props":88649,"children":88650},{},[88651],{"type":23,"value":88652},"code-first integration development",{"type":17,"tag":29,"props":88654,"children":88655},{},[88656,88658],{"type":23,"value":88657},"You want the ability to ",{"type":17,"tag":48,"props":88659,"children":88660},{},[88661],{"type":23,"value":88662},"self-host integration infrastructure",{"type":17,"tag":29,"props":88664,"children":88665},{},[88666],{"type":23,"value":88667},"The downside is that developers must maintain sync pipelines, mappings, and polling logic themselves.",{"type":17,"tag":68,"props":88669,"children":88671},{"id":88670},"merge-alternatives-comparison",[88672],{"type":23,"value":88673},"Merge Alternatives Comparison",{"type":17,"tag":7231,"props":88675,"children":88676},{},[88677,88707],{"type":17,"tag":7235,"props":88678,"children":88679},{},[88680],{"type":17,"tag":7239,"props":88681,"children":88682},{},[88683,88687,88691,88695,88699,88703],{"type":17,"tag":7243,"props":88684,"children":88685},{},[88686],{"type":23,"value":87518},{"type":17,"tag":7243,"props":88688,"children":88689},{},[88690],{"type":23,"value":87523},{"type":17,"tag":7243,"props":88692,"children":88693},{},[88694],{"type":23,"value":237},{"type":17,"tag":7243,"props":88696,"children":88697},{},[88698],{"type":23,"value":8037},{"type":17,"tag":7243,"props":88700,"children":88701},{},[88702],{"type":23,"value":581},{"type":17,"tag":7243,"props":88704,"children":88705},{},[88706],{"type":23,"value":1025},{"type":17,"tag":7259,"props":88708,"children":88709},{},[88710,88739,88769,88797,88829],{"type":17,"tag":7239,"props":88711,"children":88712},{},[88713,88717,88721,88725,88729,88734],{"type":17,"tag":7266,"props":88714,"children":88715},{},[88716],{"type":23,"value":7359},{"type":17,"tag":7266,"props":88718,"children":88719},{},[88720],{"type":23,"value":87550},{"type":17,"tag":7266,"props":88722,"children":88723},{},[88724],{"type":23,"value":87550},{"type":17,"tag":7266,"props":88726,"children":88727},{},[88728],{"type":23,"value":87550},{"type":17,"tag":7266,"props":88730,"children":88731},{},[88732],{"type":23,"value":88733},"Sync + workflow engine",{"type":17,"tag":7266,"props":88735,"children":88736},{},[88737],{"type":23,"value":88738},"Code-first sync",{"type":17,"tag":7239,"props":88740,"children":88741},{},[88742,88746,88750,88755,88759,88764],{"type":17,"tag":7266,"props":88743,"children":88744},{},[88745],{"type":23,"value":69408},{"type":17,"tag":7266,"props":88747,"children":88748},{},[88749],{"type":23,"value":43678},{"type":17,"tag":7266,"props":88751,"children":88752},{},[88753],{"type":23,"value":88754},"No storage",{"type":17,"tag":7266,"props":88756,"children":88757},{},[88758],{"type":23,"value":88754},{"type":17,"tag":7266,"props":88760,"children":88761},{},[88762],{"type":23,"value":88763},"Stores synced data",{"type":17,"tag":7266,"props":88765,"children":88766},{},[88767],{"type":23,"value":88768},"Stores cached records",{"type":17,"tag":7239,"props":88770,"children":88771},{},[88772,88776,88780,88784,88789,88793],{"type":17,"tag":7266,"props":88773,"children":88774},{},[88775],{"type":23,"value":10049},{"type":17,"tag":7266,"props":88777,"children":88778},{},[88779],{"type":23,"value":87601},{"type":17,"tag":7266,"props":88781,"children":88782},{},[88783],{"type":23,"value":87601},{"type":17,"tag":7266,"props":88785,"children":88786},{},[88787],{"type":23,"value":88788},"Webhook pipelines",{"type":17,"tag":7266,"props":88790,"children":88791},{},[88792],{"type":23,"value":87616},{"type":17,"tag":7266,"props":88794,"children":88795},{},[88796],{"type":23,"value":87611},{"type":17,"tag":7239,"props":88798,"children":88799},{},[88800,88804,88809,88814,88819,88824],{"type":17,"tag":7266,"props":88801,"children":88802},{},[88803],{"type":23,"value":87624},{"type":17,"tag":7266,"props":88805,"children":88806},{},[88807],{"type":23,"value":88808},"Deep unified schemas",{"type":17,"tag":7266,"props":88810,"children":88811},{},[88812],{"type":23,"value":88813},"Unified models + passthrough",{"type":17,"tag":7266,"props":88815,"children":88816},{},[88817],{"type":23,"value":88818},"Declarative mapping layer",{"type":17,"tag":7266,"props":88820,"children":88821},{},[88822],{"type":23,"value":88823},"Synced object models",{"type":17,"tag":7266,"props":88825,"children":88826},{},[88827],{"type":23,"value":88828},"Developer-defined schemas",{"type":17,"tag":7239,"props":88830,"children":88831},{},[88832,88836,88841,88846,88851,88856],{"type":17,"tag":7266,"props":88833,"children":88834},{},[88835],{"type":23,"value":502},{"type":17,"tag":7266,"props":88837,"children":88838},{},[88839],{"type":23,"value":88840},"Real-time SaaS & AI integrations",{"type":17,"tag":7266,"props":88842,"children":88843},{},[88844],{"type":23,"value":88845},"SaaS integrations across categories",{"type":17,"tag":7266,"props":88847,"children":88848},{},[88849],{"type":23,"value":88850},"Custom unified schemas",{"type":17,"tag":7266,"props":88852,"children":88853},{},[88854],{"type":23,"value":88855},"Embedded workflows",{"type":17,"tag":7266,"props":88857,"children":88858},{},[88859],{"type":23,"value":87667},{"type":17,"tag":68,"props":88861,"children":88862},{"id":1552},[88863],{"type":23,"value":44411},{"type":17,"tag":29,"props":88865,"children":88866},{},[88867],{"type":23,"value":88868},"Merge remains one of the most widely adopted unified API platforms for SaaS integrations, particularly in categories such as HRIS, CRM, and ATS.",{"type":17,"tag":29,"props":88870,"children":88871},{},[88872,88874,88878],{"type":23,"value":88873},"However, its ",{"type":17,"tag":48,"props":88875,"children":88876},{},[88877],{"type":23,"value":87119},{"type":23,"value":88879}," introduces tradeoffs around data freshness, compliance, and infrastructure complexity.",{"type":17,"tag":29,"props":88881,"children":88882},{},[88883],{"type":23,"value":88884},"Alternative platforms now offer different architectural approaches:",{"type":17,"tag":80,"props":88886,"children":88887},{},[88888,88897,88907],{"type":17,"tag":84,"props":88889,"children":88890},{},[88891,88895],{"type":17,"tag":48,"props":88892,"children":88893},{},[88894],{"type":23,"value":87697},{"type":23,"value":88896}," such as Unified, Apideck, and Truto deliver live data directly from source systems.",{"type":17,"tag":84,"props":88898,"children":88899},{},[88900,88905],{"type":17,"tag":48,"props":88901,"children":88902},{},[88903],{"type":23,"value":88904},"Workflow-oriented platforms",{"type":23,"value":88906}," like Paragon combine integrations with automation.",{"type":17,"tag":84,"props":88908,"children":88909},{},[88910,88915],{"type":17,"tag":48,"props":88911,"children":88912},{},[88913],{"type":23,"value":88914},"Code-first infrastructure",{"type":23,"value":88916}," like Nango gives developers full control over integration logic.",{"type":17,"tag":29,"props":88918,"children":88919},{},[88920],{"type":23,"value":88921},"Choosing the right platform ultimately depends on how your product uses integrations.",{"type":17,"tag":29,"props":88923,"children":88924},{},[88925,88927,88932],{"type":23,"value":88926},"If your product requires ",{"type":17,"tag":48,"props":88928,"children":88929},{},[88930],{"type":23,"value":88931},"real-time access to customer systems, minimal compliance risk, and AI-ready integrations",{"type":23,"value":88933},", platforms built around pass-through architectures are often the best foundation.",{"type":17,"tag":29,"props":88935,"children":88936},{},[88937,88939,88944],{"type":23,"value":88938},"If you need ",{"type":17,"tag":48,"props":88940,"children":88941},{},[88942],{"type":23,"value":88943},"cached datasets or workflow automation",{"type":23,"value":88945},", sync-based platforms may still be the better fit.",{"type":17,"tag":29,"props":88947,"children":88948},{},[88949],{"type":23,"value":88950},"Understanding these architectural differences will help ensure the integration strategy you choose scales with both your product and your customers' needs.",{"type":17,"tag":29,"props":88952,"children":88953},{},[88954],{"type":17,"tag":133,"props":88955,"children":88957},{"href":1612,"rel":88956},[214],[88958],{"type":23,"value":44481},{"type":17,"tag":29,"props":88960,"children":88961},{},[88962],{"type":17,"tag":133,"props":88963,"children":88965},{"href":1623,"rel":88964},[214],[88966],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":88968},[88969,88970,88974,88978,88982,88986,88990,88991],{"id":87967,"depth":1629,"text":87970},{"id":86887,"depth":1629,"text":86890,"children":88971},[88972,88973],{"id":86931,"depth":1635,"text":86934},{"id":88209,"depth":1635,"text":88212},{"id":88291,"depth":1629,"text":88294,"children":88975},[88976,88977],{"id":87124,"depth":1635,"text":86934},{"id":88336,"depth":1635,"text":88339},{"id":88384,"depth":1629,"text":88387,"children":88979},[88980,88981],{"id":87330,"depth":1635,"text":86934},{"id":88436,"depth":1635,"text":88439},{"id":88480,"depth":1629,"text":88483,"children":88983},[88984,88985],{"id":88503,"depth":1635,"text":86934},{"id":88528,"depth":1635,"text":88531},{"id":88572,"depth":1629,"text":88575,"children":88987},[88988,88989],{"id":88594,"depth":1635,"text":86934},{"id":88624,"depth":1635,"text":88627},{"id":88670,"depth":1629,"text":88673},{"id":1552,"depth":1629,"text":44411},"content:blog:top_5_merge_dev_alternatives_for_native_saas_integrations_2026_guide.md","blog/top_5_merge_dev_alternatives_for_native_saas_integrations_2026_guide.md","blog/top_5_merge_dev_alternatives_for_native_saas_integrations_2026_guide",{"_path":88996,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":88997,"description":88998,"img":88999,"date":89000,"tag":12,"body":89001,"_type":1677,"_id":90463,"_source":1679,"_file":90464,"_stem":90465,"_extension":1682},"/blog/top_challenges_of_normalizing_multiple_api_integrations","Top Challenges of Normalizing Multiple API Integrations","Normalizing one API is manageable. Normalizing ten, twenty, or fifty is where things get difficult.","https://s3.us-east-2.amazonaws.com/unified-article-images/top_challenges_of_normalizing_multiple_api_integrations-icon.png","2026-03-09T19:38:00.000Z",{"type":14,"children":89002,"toc":90439},[89003,89008,89011,89018,89022,89027,89032,89064,89069,89074,89080,89092,89097,89125,89130,89135,89140,89145,89151,89156,89189,89194,89200,89205,89210,89215,89220,89225,89230,89248,89253,89259,89264,89268,89314,89319,89342,89347,89393,89398,89404,89409,89414,89442,89447,89475,89480,89485,89508,89513,89519,89524,89529,89534,89539,89577,89582,89587,89592,89598,89603,89607,89630,89635,89640,89645,89651,89656,89661,89666,89711,89716,89721,89727,89732,89737,89775,89780,89785,89790,89823,89829,89834,89839,89870,89875,89880,89907,89912,89917,89923,89928,89933,89938,89981,89986,89991,89997,90002,90007,90040,90045,90067,90072,90078,90083,90088,90121,90126,90137,90142,90147,90152,90157,90163,90168,90179,90206,90211,90237,90242,90248,90259,90264,90269,90275,90280,90286,90291,90295,90300,90305,90310,90316,90321,90325,90330,90335,90340,90345,90363,90368,90401,90406,90411,90421,90430],{"type":17,"tag":18,"props":89004,"children":89006},{"id":89005},"top-challenges-of-normalizing-multiple-api-integrations",[89007],{"type":23,"value":88997},{"type":17,"tag":25,"props":89009,"children":89010},{},[],{"type":17,"tag":29,"props":89012,"children":89013},{},[89014],{"type":17,"tag":33,"props":89015,"children":89016},{},[89017],{"type":23,"value":37},{"type":17,"tag":29,"props":89019,"children":89020},{},[89021],{"type":23,"value":88998},{"type":17,"tag":29,"props":89023,"children":89024},{},[89025],{"type":23,"value":89026},"On the surface, normalization sounds straightforward: take similar data from different systems and map it into one consistent model.",{"type":17,"tag":29,"props":89028,"children":89029},{},[89030],{"type":23,"value":89031},"In practice, that means handling:",{"type":17,"tag":80,"props":89033,"children":89034},{},[89035,89039,89044,89049,89054,89059],{"type":17,"tag":84,"props":89036,"children":89037},{},[89038],{"type":23,"value":31430},{"type":17,"tag":84,"props":89040,"children":89041},{},[89042],{"type":23,"value":89043},"different naming conventions",{"type":17,"tag":84,"props":89045,"children":89046},{},[89047],{"type":23,"value":89048},"different levels of data quality",{"type":17,"tag":84,"props":89050,"children":89051},{},[89052],{"type":23,"value":89053},"different authentication methods",{"type":17,"tag":84,"props":89055,"children":89056},{},[89057],{"type":23,"value":89058},"different write behaviors",{"type":17,"tag":84,"props":89060,"children":89061},{},[89062],{"type":23,"value":89063},"different webhook or polling models",{"type":17,"tag":29,"props":89065,"children":89066},{},[89067],{"type":23,"value":89068},"And that is before you deal with enterprise custom fields, edge cases, and scale.",{"type":17,"tag":29,"props":89070,"children":89071},{},[89072],{"type":23,"value":89073},"If you are building integrations across CRM, HRIS, ATS, accounting, file storage, or other SaaS categories, normalization is one of the hardest parts of the architecture. This article breaks down the biggest challenges and what technical teams should do about them.",{"type":17,"tag":68,"props":89075,"children":89077},{"id":89076},"what-does-it-mean-to-normalize-multiple-api-integrations",[89078],{"type":23,"value":89079},"What does it mean to normalize multiple API integrations?",{"type":17,"tag":29,"props":89081,"children":89082},{},[89083,89085,89090],{"type":23,"value":89084},"Normalization means taking data from different APIs and converting it into a ",{"type":17,"tag":48,"props":89086,"children":89087},{},[89088],{"type":23,"value":89089},"single internal format",{"type":23,"value":89091}," that your product can use consistently.",{"type":17,"tag":29,"props":89093,"children":89094},{},[89095],{"type":23,"value":89096},"For example, one CRM might represent a company as:",{"type":17,"tag":80,"props":89098,"children":89099},{},[89100,89109,89117],{"type":17,"tag":84,"props":89101,"children":89102},{},[89103],{"type":17,"tag":6121,"props":89104,"children":89106},{"className":89105},[],[89107],{"type":23,"value":89108},"account",{"type":17,"tag":84,"props":89110,"children":89111},{},[89112],{"type":17,"tag":6121,"props":89113,"children":89115},{"className":89114},[],[89116],{"type":23,"value":17941},{"type":17,"tag":84,"props":89118,"children":89119},{},[89120],{"type":17,"tag":6121,"props":89121,"children":89123},{"className":89122},[],[89124],{"type":23,"value":62420},{"type":17,"tag":29,"props":89126,"children":89127},{},[89128],{"type":23,"value":89129},"Another might split names differently, structure addresses differently, or expose nested custom fields in completely different ways.",{"type":17,"tag":29,"props":89131,"children":89132},{},[89133],{"type":23,"value":89134},"A normalized integration layer hides those differences so your application can work with one unified object model.",{"type":17,"tag":29,"props":89136,"children":89137},{},[89138],{"type":23,"value":89139},"That is the theory.",{"type":17,"tag":29,"props":89141,"children":89142},{},[89143],{"type":23,"value":89144},"The challenge is that APIs rarely line up cleanly enough to make this simple.",{"type":17,"tag":68,"props":89146,"children":89148},{"id":89147},"why-normalization-is-so-hard",[89149],{"type":23,"value":89150},"Why normalization is so hard",{"type":17,"tag":29,"props":89152,"children":89153},{},[89154],{"type":23,"value":89155},"The hardest part of normalization is not the first mapping. It is building a system that keeps working when:",{"type":17,"tag":80,"props":89157,"children":89158},{},[89159,89164,89169,89174,89179,89184],{"type":17,"tag":84,"props":89160,"children":89161},{},[89162],{"type":23,"value":89163},"new integrations are added",{"type":17,"tag":84,"props":89165,"children":89166},{},[89167],{"type":23,"value":89168},"providers change their APIs",{"type":17,"tag":84,"props":89170,"children":89171},{},[89172],{"type":23,"value":89173},"customers use custom fields and custom objects",{"type":17,"tag":84,"props":89175,"children":89176},{},[89177],{"type":23,"value":89178},"your product needs deeper read and write support",{"type":17,"tag":84,"props":89180,"children":89181},{},[89182],{"type":23,"value":89183},"volumes increase",{"type":17,"tag":84,"props":89185,"children":89186},{},[89187],{"type":23,"value":89188},"edge cases multiply",{"type":17,"tag":29,"props":89190,"children":89191},{},[89192],{"type":23,"value":89193},"That is why many teams start with a clean internal model and then slowly end up with exceptions, conditionals, fallback paths, passthrough logic, and integration-specific code everywhere.",{"type":17,"tag":68,"props":89195,"children":89197},{"id":89196},"_1-the-same-object-is-not-actually-the-same-across-systems",[89198],{"type":23,"value":89199},"1. The same 'object' is not actually the same across systems",{"type":17,"tag":29,"props":89201,"children":89202},{},[89203],{"type":23,"value":89204},"This is the most obvious challenge, but also the most fundamental.",{"type":17,"tag":29,"props":89206,"children":89207},{},[89208],{"type":23,"value":89209},"A 'candidate' in one ATS is not always the same as a 'candidate' in another.",{"type":17,"tag":29,"props":89211,"children":89212},{},[89213],{"type":23,"value":89214},"A 'contact' in one CRM may behave more like a 'lead' in another.",{"type":17,"tag":29,"props":89216,"children":89217},{},[89218],{"type":23,"value":89219},"An 'invoice' in one accounting platform may expose statuses, line items, and tax behavior very differently from another.",{"type":17,"tag":29,"props":89221,"children":89222},{},[89223],{"type":23,"value":89224},"Even when two systems use the same label, the semantics can differ.",{"type":17,"tag":29,"props":89226,"children":89227},{},[89228],{"type":23,"value":89229},"That creates normalization problems in three places:",{"type":17,"tag":80,"props":89231,"children":89232},{},[89233,89238,89243],{"type":17,"tag":84,"props":89234,"children":89235},{},[89236],{"type":23,"value":89237},"object definitions",{"type":17,"tag":84,"props":89239,"children":89240},{},[89241],{"type":23,"value":89242},"field structures",{"type":17,"tag":84,"props":89244,"children":89245},{},[89246],{"type":23,"value":89247},"lifecycle states",{"type":17,"tag":29,"props":89249,"children":89250},{},[89251],{"type":23,"value":89252},"If you normalize too aggressively, you lose important provider-specific meaning. If you normalize too loosely, your unified model becomes messy and inconsistent.",{"type":17,"tag":68,"props":89254,"children":89256},{"id":89255},"_2-field-mapping-becomes-fragile-at-scale",[89257],{"type":23,"value":89258},"2. Field mapping becomes fragile at scale",{"type":17,"tag":29,"props":89260,"children":89261},{},[89262],{"type":23,"value":89263},"Field mapping looks easy until you do it across dozens of integrations.",{"type":17,"tag":29,"props":89265,"children":89266},{},[89267],{"type":23,"value":377},{"type":17,"tag":80,"props":89269,"children":89270},{},[89271,89288,89299,89309],{"type":17,"tag":84,"props":89272,"children":89273},{},[89274,89279,89281,89286],{"type":17,"tag":6121,"props":89275,"children":89277},{"className":89276},[],[89278],{"type":23,"value":62336},{"type":23,"value":89280}," + ",{"type":17,"tag":6121,"props":89282,"children":89284},{"className":89283},[],[89285],{"type":23,"value":62341},{"type":23,"value":89287}," in one system",{"type":17,"tag":84,"props":89289,"children":89290},{},[89291,89297],{"type":17,"tag":6121,"props":89292,"children":89294},{"className":89293},[],[89295],{"type":23,"value":89296},"full_name",{"type":23,"value":89298}," in another",{"type":17,"tag":84,"props":89300,"children":89301},{},[89302,89308],{"type":17,"tag":6121,"props":89303,"children":89305},{"className":89304},[],[89306],{"type":23,"value":89307},"display_name",{"type":23,"value":89298},{"type":17,"tag":84,"props":89310,"children":89311},{},[89312],{"type":23,"value":89313},"localized name formats in another",{"type":17,"tag":29,"props":89315,"children":89316},{},[89317],{"type":23,"value":89318},"Now add:",{"type":17,"tag":80,"props":89320,"children":89321},{},[89322,89327,89332,89337],{"type":17,"tag":84,"props":89323,"children":89324},{},[89325],{"type":23,"value":89326},"optional middle names",{"type":17,"tag":84,"props":89328,"children":89329},{},[89330],{"type":23,"value":89331},"prefixes and suffixes",{"type":17,"tag":84,"props":89333,"children":89334},{},[89335],{"type":23,"value":89336},"multi-part surnames",{"type":17,"tag":84,"props":89338,"children":89339},{},[89340],{"type":23,"value":89341},"inconsistent user-entered data",{"type":17,"tag":29,"props":89343,"children":89344},{},[89345],{"type":23,"value":89346},"That is one simple example. It gets much worse with:",{"type":17,"tag":80,"props":89348,"children":89349},{},[89350,89354,89359,89364,89369,89374,89379,89384,89388],{"type":17,"tag":84,"props":89351,"children":89352},{},[89353],{"type":23,"value":75496},{"type":17,"tag":84,"props":89355,"children":89356},{},[89357],{"type":23,"value":89358},"job titles",{"type":17,"tag":84,"props":89360,"children":89361},{},[89362],{"type":23,"value":89363},"employment status",{"type":17,"tag":84,"props":89365,"children":89366},{},[89367],{"type":23,"value":89368},"opportunity stages",{"type":17,"tag":84,"props":89370,"children":89371},{},[89372],{"type":23,"value":89373},"tax fields",{"type":17,"tag":84,"props":89375,"children":89376},{},[89377],{"type":23,"value":89378},"compensation fields",{"type":17,"tag":84,"props":89380,"children":89381},{},[89382],{"type":23,"value":89383},"status enums",{"type":17,"tag":84,"props":89385,"children":89386},{},[89387],{"type":23,"value":33472},{"type":17,"tag":84,"props":89389,"children":89390},{},[89391],{"type":23,"value":89392},"references between objects",{"type":17,"tag":29,"props":89394,"children":89395},{},[89396],{"type":23,"value":89397},"What starts as a few straightforward mappings quickly becomes a transformation engine that has to handle bad inputs, inconsistent values, and exceptions continuously.",{"type":17,"tag":68,"props":89399,"children":89401},{"id":89400},"_3-custom-fields-and-custom-objects-break-simple-models",[89402],{"type":23,"value":89403},"3. Custom fields and custom objects break simple models",{"type":17,"tag":29,"props":89405,"children":89406},{},[89407],{"type":23,"value":89408},"This is where many normalization projects start to crack.",{"type":17,"tag":29,"props":89410,"children":89411},{},[89412],{"type":23,"value":89413},"SaaS systems are heavily customized, especially in:",{"type":17,"tag":80,"props":89415,"children":89416},{},[89417,89421,89425,89429,89433,89437],{"type":17,"tag":84,"props":89418,"children":89419},{},[89420],{"type":23,"value":3179},{"type":17,"tag":84,"props":89422,"children":89423},{},[89424],{"type":23,"value":3184},{"type":17,"tag":84,"props":89426,"children":89427},{},[89428],{"type":23,"value":59319},{"type":17,"tag":84,"props":89430,"children":89431},{},[89432],{"type":23,"value":13070},{"type":17,"tag":84,"props":89434,"children":89435},{},[89436],{"type":23,"value":23984},{"type":17,"tag":84,"props":89438,"children":89439},{},[89440],{"type":23,"value":89441},"many enterprise ATS and HR systems",{"type":17,"tag":29,"props":89443,"children":89444},{},[89445],{"type":23,"value":89446},"Customers often rely on:",{"type":17,"tag":80,"props":89448,"children":89449},{},[89450,89455,89460,89465,89470],{"type":17,"tag":84,"props":89451,"children":89452},{},[89453],{"type":23,"value":89454},"custom fields",{"type":17,"tag":84,"props":89456,"children":89457},{},[89458],{"type":23,"value":89459},"custom objects",{"type":17,"tag":84,"props":89461,"children":89462},{},[89463],{"type":23,"value":89464},"custom statuses",{"type":17,"tag":84,"props":89466,"children":89467},{},[89468],{"type":23,"value":89469},"custom workflows",{"type":17,"tag":84,"props":89471,"children":89472},{},[89473],{"type":23,"value":89474},"custom schemas",{"type":17,"tag":29,"props":89476,"children":89477},{},[89478],{"type":23,"value":89479},"If your normalized API only supports standard fields, you create a ceiling. Teams hit that ceiling fast when they move from simple read access to real production workflows.",{"type":17,"tag":29,"props":89481,"children":89482},{},[89483],{"type":23,"value":89484},"This is why normalization cannot just be about 'common objects.' It also has to support extension paths such as:",{"type":17,"tag":80,"props":89486,"children":89487},{},[89488,89493,89498,89503],{"type":17,"tag":84,"props":89489,"children":89490},{},[89491],{"type":23,"value":89492},"custom field mapping",{"type":17,"tag":84,"props":89494,"children":89495},{},[89496],{"type":23,"value":89497},"metadata APIs",{"type":17,"tag":84,"props":89499,"children":89500},{},[89501],{"type":23,"value":89502},"raw payload access",{"type":17,"tag":84,"props":89504,"children":89505},{},[89506],{"type":23,"value":89507},"passthrough reads and writes",{"type":17,"tag":29,"props":89509,"children":89510},{},[89511],{"type":23,"value":89512},"Without that, teams either abandon the normalized layer or maintain a second parallel integration path.",{"type":17,"tag":68,"props":89514,"children":89516},{"id":89515},"_4-write-behavior-is-much-harder-than-read-behavior",[89517],{"type":23,"value":89518},"4. Write behavior is much harder than read behavior",{"type":17,"tag":29,"props":89520,"children":89521},{},[89522],{"type":23,"value":89523},"Reading data is only half the problem.",{"type":17,"tag":29,"props":89525,"children":89526},{},[89527],{"type":23,"value":89528},"Writing normalized data back into source systems is where things get much more difficult.",{"type":17,"tag":29,"props":89530,"children":89531},{},[89532],{"type":23,"value":89533},"Why?",{"type":17,"tag":29,"props":89535,"children":89536},{},[89537],{"type":23,"value":89538},"Because providers differ on:",{"type":17,"tag":80,"props":89540,"children":89541},{},[89542,89547,89552,89557,89562,89567,89572],{"type":17,"tag":84,"props":89543,"children":89544},{},[89545],{"type":23,"value":89546},"required fields",{"type":17,"tag":84,"props":89548,"children":89549},{},[89550],{"type":23,"value":89551},"validation rules",{"type":17,"tag":84,"props":89553,"children":89554},{},[89555],{"type":23,"value":89556},"status transitions",{"type":17,"tag":84,"props":89558,"children":89559},{},[89560],{"type":23,"value":89561},"write permissions",{"type":17,"tag":84,"props":89563,"children":89564},{},[89565],{"type":23,"value":89566},"update semantics",{"type":17,"tag":84,"props":89568,"children":89569},{},[89570],{"type":23,"value":89571},"partial update support",{"type":17,"tag":84,"props":89573,"children":89574},{},[89575],{"type":23,"value":89576},"nested object handling",{"type":17,"tag":29,"props":89578,"children":89579},{},[89580],{"type":23,"value":89581},"An example:",{"type":17,"tag":29,"props":89583,"children":89584},{},[89585],{"type":23,"value":89586},"You may normalize an invoice model cleanly across multiple accounting APIs. But when you try to create or update that invoice, one platform may require tax settings, another may auto-calculate them, and another may silently override them depending on account configuration.",{"type":17,"tag":29,"props":89588,"children":89589},{},[89590],{"type":23,"value":89591},"That means a normalized write path has to do more than map fields. It has to understand provider-specific business rules.",{"type":17,"tag":68,"props":89593,"children":89595},{"id":89594},"_5-lifecycle-stages-do-not-map-neatly",[89596],{"type":23,"value":89597},"5. Lifecycle stages do not map neatly",{"type":17,"tag":29,"props":89599,"children":89600},{},[89601],{"type":23,"value":89602},"This is especially painful in categories like CRM, ATS, ticketing, and HR.",{"type":17,"tag":29,"props":89604,"children":89605},{},[89606],{"type":23,"value":377},{"type":17,"tag":80,"props":89608,"children":89609},{},[89610,89615,89620,89625],{"type":17,"tag":84,"props":89611,"children":89612},{},[89613],{"type":23,"value":89614},"'Closed won' in one CRM may not behave like 'won' in another",{"type":17,"tag":84,"props":89616,"children":89617},{},[89618],{"type":23,"value":89619},"'Hired' in one ATS may occur before onboarding, while another uses a different transition entirely",{"type":17,"tag":84,"props":89621,"children":89622},{},[89623],{"type":23,"value":89624},"'Resolved' and 'closed' can mean different things in ticketing systems",{"type":17,"tag":84,"props":89626,"children":89627},{},[89628],{"type":23,"value":89629},"'Active employee' can have different logic across HRIS platforms",{"type":17,"tag":29,"props":89631,"children":89632},{},[89633],{"type":23,"value":89634},"These differences matter because your product logic often depends on them.",{"type":17,"tag":29,"props":89636,"children":89637},{},[89638],{"type":23,"value":89639},"Normalization cannot just flatten these states into generic enums without losing critical operational meaning. But if you preserve too much provider nuance, your unified layer becomes harder to use.",{"type":17,"tag":29,"props":89641,"children":89642},{},[89643],{"type":23,"value":89644},"This is one of the hardest architectural tradeoffs in normalization.",{"type":17,"tag":68,"props":89646,"children":89648},{"id":89647},"_6-real-time-normalization-is-harder-than-batch-normalization",[89649],{"type":23,"value":89650},"6. Real-time normalization is harder than batch normalization",{"type":17,"tag":29,"props":89652,"children":89653},{},[89654],{"type":23,"value":89655},"If your architecture stores and syncs data in batches, normalization is already difficult.",{"type":17,"tag":29,"props":89657,"children":89658},{},[89659],{"type":23,"value":89660},"If your architecture is real-time, it gets harder.",{"type":17,"tag":29,"props":89662,"children":89663},{},[89664],{"type":23,"value":89665},"Real-time systems need to normalize data on demand while also handling:",{"type":17,"tag":80,"props":89667,"children":89668},{},[89669,89678,89683,89692,89697,89701,89706],{"type":17,"tag":84,"props":89670,"children":89671},{},[89672,89674],{"type":23,"value":89673},"native ",{"type":17,"tag":133,"props":89675,"children":89676},{"href":4999},[89677],{"type":23,"value":5002},{"type":17,"tag":84,"props":89679,"children":89680},{},[89681],{"type":23,"value":89682},"missing webhook support",{"type":17,"tag":84,"props":89684,"children":89685},{},[89686,89690],{"type":17,"tag":133,"props":89687,"children":89688},{"href":9007},[89689],{"type":23,"value":46572},{"type":23,"value":89691}," or polling fallback",{"type":17,"tag":84,"props":89693,"children":89694},{},[89695],{"type":23,"value":89696},"event ordering",{"type":17,"tag":84,"props":89698,"children":89699},{},[89700],{"type":23,"value":36948},{"type":17,"tag":84,"props":89702,"children":89703},{},[89704],{"type":23,"value":89705},"deduplication",{"type":17,"tag":84,"props":89707,"children":89708},{},[89709],{"type":23,"value":89710},"eventual consistency across providers",{"type":17,"tag":29,"props":89712,"children":89713},{},[89714],{"type":23,"value":89715},"The more integrations you support, the harder it becomes to make the normalized layer feel consistent to your product team and your customers.",{"type":17,"tag":29,"props":89717,"children":89718},{},[89719],{"type":23,"value":89720},"This is especially important for AI products, dashboards, and operational workflows where stale data breaks the experience.",{"type":17,"tag":68,"props":89722,"children":89724},{"id":89723},"_7-data-quality-issues-multiply-across-integrations",[89725],{"type":23,"value":89726},"7. Data quality issues multiply across integrations",{"type":17,"tag":29,"props":89728,"children":89729},{},[89730],{"type":23,"value":89731},"Even if your mapping logic is good, the source data may not be.",{"type":17,"tag":29,"props":89733,"children":89734},{},[89735],{"type":23,"value":89736},"You will see:",{"type":17,"tag":80,"props":89738,"children":89739},{},[89740,89745,89750,89755,89760,89765,89770],{"type":17,"tag":84,"props":89741,"children":89742},{},[89743],{"type":23,"value":89744},"missing fields",{"type":17,"tag":84,"props":89746,"children":89747},{},[89748],{"type":23,"value":89749},"malformed values",{"type":17,"tag":84,"props":89751,"children":89752},{},[89753],{"type":23,"value":89754},"inconsistent casing",{"type":17,"tag":84,"props":89756,"children":89757},{},[89758],{"type":23,"value":89759},"duplicate records",{"type":17,"tag":84,"props":89761,"children":89762},{},[89763],{"type":23,"value":89764},"broken references",{"type":17,"tag":84,"props":89766,"children":89767},{},[89768],{"type":23,"value":89769},"outdated statuses",{"type":17,"tag":84,"props":89771,"children":89772},{},[89773],{"type":23,"value":89774},"partial objects",{"type":17,"tag":29,"props":89776,"children":89777},{},[89778],{"type":23,"value":89779},"And that is before enterprise customers start using the same field in different ways internally.",{"type":17,"tag":29,"props":89781,"children":89782},{},[89783],{"type":23,"value":89784},"Poor source data does not disappear when you normalize it. In many cases, normalization simply makes the underlying mess visible.",{"type":17,"tag":29,"props":89786,"children":89787},{},[89788],{"type":23,"value":89789},"That means a robust normalization layer needs:",{"type":17,"tag":80,"props":89791,"children":89792},{},[89793,89798,89803,89808,89813,89818],{"type":17,"tag":84,"props":89794,"children":89795},{},[89796],{"type":23,"value":89797},"validation",{"type":17,"tag":84,"props":89799,"children":89800},{},[89801],{"type":23,"value":89802},"null handling",{"type":17,"tag":84,"props":89804,"children":89805},{},[89806],{"type":23,"value":89807},"fallback logic",{"type":17,"tag":84,"props":89809,"children":89810},{},[89811],{"type":23,"value":89812},"transform monitoring",{"type":17,"tag":84,"props":89814,"children":89815},{},[89816],{"type":23,"value":89817},"exception handling",{"type":17,"tag":84,"props":89819,"children":89820},{},[89821],{"type":23,"value":89822},"observability into bad upstream data",{"type":17,"tag":68,"props":89824,"children":89826},{"id":89825},"_8-security-and-data-minimization-complicate-normalization",[89827],{"type":23,"value":89828},"8. Security and data minimization complicate normalization",{"type":17,"tag":29,"props":89830,"children":89831},{},[89832],{"type":23,"value":89833},"The more data you normalize, the more security and compliance work you create.",{"type":17,"tag":29,"props":89835,"children":89836},{},[89837],{"type":23,"value":89838},"This matters in categories like:",{"type":17,"tag":80,"props":89840,"children":89841},{},[89842,89847,89851,89856,89860,89865],{"type":17,"tag":84,"props":89843,"children":89844},{},[89845],{"type":23,"value":89846},"HRIS",{"type":17,"tag":84,"props":89848,"children":89849},{},[89850],{"type":23,"value":11756},{"type":17,"tag":84,"props":89852,"children":89853},{},[89854],{"type":23,"value":89855},"accounting",{"type":17,"tag":84,"props":89857,"children":89858},{},[89859],{"type":23,"value":98},{"type":17,"tag":84,"props":89861,"children":89862},{},[89863],{"type":23,"value":89864},"ticketing",{"type":17,"tag":84,"props":89866,"children":89867},{},[89868],{"type":23,"value":89869},"healthcare-adjacent systems",{"type":17,"tag":29,"props":89871,"children":89872},{},[89873],{"type":23,"value":89874},"The challenge is not just securing the data. It is deciding what should be normalized at all.",{"type":17,"tag":29,"props":89876,"children":89877},{},[89878],{"type":23,"value":89879},"You need to balance:",{"type":17,"tag":80,"props":89881,"children":89882},{},[89883,89888,89893,89897,89902],{"type":17,"tag":84,"props":89884,"children":89885},{},[89886],{"type":23,"value":89887},"product usefulness",{"type":17,"tag":84,"props":89889,"children":89890},{},[89891],{"type":23,"value":89892},"least-privilege access",{"type":17,"tag":84,"props":89894,"children":89895},{},[89896],{"type":23,"value":63958},{"type":17,"tag":84,"props":89898,"children":89899},{},[89900],{"type":23,"value":89901},"regional requirements",{"type":17,"tag":84,"props":89903,"children":89904},{},[89905],{"type":23,"value":89906},"customer trust",{"type":17,"tag":29,"props":89908,"children":89909},{},[89910],{"type":23,"value":89911},"A lot of normalization projects fail here because they try to ingest and store too much.",{"type":17,"tag":29,"props":89913,"children":89914},{},[89915],{"type":23,"value":89916},"This is also why real-time, zero-storage architectures can be advantageous. If you do not persist end-customer records at rest, your compliance surface becomes much smaller.",{"type":17,"tag":68,"props":89918,"children":89920},{"id":89919},"_9-performance-and-scale-force-architectural-decisions",[89921],{"type":23,"value":89922},"9. Performance and scale force architectural decisions",{"type":17,"tag":29,"props":89924,"children":89925},{},[89926],{"type":23,"value":89927},"Normalizing a few thousand objects is one thing.",{"type":17,"tag":29,"props":89929,"children":89930},{},[89931],{"type":23,"value":89932},"Normalizing millions is another.",{"type":17,"tag":29,"props":89934,"children":89935},{},[89936],{"type":23,"value":89937},"At scale, you need to think about:",{"type":17,"tag":80,"props":89939,"children":89940},{},[89941,89946,89951,89956,89961,89966,89971,89976],{"type":17,"tag":84,"props":89942,"children":89943},{},[89944],{"type":23,"value":89945},"transformation performance",{"type":17,"tag":84,"props":89947,"children":89948},{},[89949],{"type":23,"value":89950},"queueing",{"type":17,"tag":84,"props":89952,"children":89953},{},[89954],{"type":23,"value":89955},"retry behavior",{"type":17,"tag":84,"props":89957,"children":89958},{},[89959],{"type":23,"value":89960},"memory use",{"type":17,"tag":84,"props":89962,"children":89963},{},[89964],{"type":23,"value":89965},"payload size",{"type":17,"tag":84,"props":89967,"children":89968},{},[89969],{"type":23,"value":89970},"downstream bottlenecks",{"type":17,"tag":84,"props":89972,"children":89973},{},[89974],{"type":23,"value":89975},"caching tradeoffs",{"type":17,"tag":84,"props":89977,"children":89978},{},[89979],{"type":23,"value":89980},"concurrency",{"type":17,"tag":29,"props":89982,"children":89983},{},[89984],{"type":23,"value":89985},"This is where 'simple mappings' turn into platform engineering.",{"type":17,"tag":29,"props":89987,"children":89988},{},[89989],{"type":23,"value":89990},"A transformation layer that works beautifully in a pilot can become expensive and brittle when a large customer pushes real production volume through it.",{"type":17,"tag":68,"props":89992,"children":89994},{"id":89993},"_10-documentation-and-maintenance-become-a-hidden-tax",[89995],{"type":23,"value":89996},"10. Documentation and maintenance become a hidden tax",{"type":17,"tag":29,"props":89998,"children":89999},{},[90000],{"type":23,"value":90001},"Even after you normalize successfully, you still have to maintain that normalization layer.",{"type":17,"tag":29,"props":90003,"children":90004},{},[90005],{"type":23,"value":90006},"That means tracking:",{"type":17,"tag":80,"props":90008,"children":90009},{},[90010,90015,90020,90025,90030,90035],{"type":17,"tag":84,"props":90011,"children":90012},{},[90013],{"type":23,"value":90014},"provider API changes",{"type":17,"tag":84,"props":90016,"children":90017},{},[90018],{"type":23,"value":90019},"deprecated fields",{"type":17,"tag":84,"props":90021,"children":90022},{},[90023],{"type":23,"value":90024},"new required fields",{"type":17,"tag":84,"props":90026,"children":90027},{},[90028],{"type":23,"value":90029},"new integrations",{"type":17,"tag":84,"props":90031,"children":90032},{},[90033],{"type":23,"value":90034},"model version changes",{"type":17,"tag":84,"props":90036,"children":90037},{},[90038],{"type":23,"value":90039},"edge-case regressions",{"type":17,"tag":29,"props":90041,"children":90042},{},[90043],{"type":23,"value":90044},"You also need to explain the model clearly to:",{"type":17,"tag":80,"props":90046,"children":90047},{},[90048,90053,90058,90063],{"type":17,"tag":84,"props":90049,"children":90050},{},[90051],{"type":23,"value":90052},"developers",{"type":17,"tag":84,"props":90054,"children":90055},{},[90056],{"type":23,"value":90057},"support teams",{"type":17,"tag":84,"props":90059,"children":90060},{},[90061],{"type":23,"value":90062},"solutions engineers",{"type":17,"tag":84,"props":90064,"children":90065},{},[90066],{"type":23,"value":70514},{"type":17,"tag":29,"props":90068,"children":90069},{},[90070],{"type":23,"value":90071},"Without strong documentation and observability, normalization becomes hard to debug and even harder to trust.",{"type":17,"tag":68,"props":90073,"children":90075},{"id":90074},"the-architectural-tradeoff-most-teams-miss",[90076],{"type":23,"value":90077},"The architectural tradeoff most teams miss",{"type":17,"tag":29,"props":90079,"children":90080},{},[90081],{"type":23,"value":90082},"There is a pattern here.",{"type":17,"tag":29,"props":90084,"children":90085},{},[90086],{"type":23,"value":90087},"The more integrations you normalize, the more you are effectively building:",{"type":17,"tag":80,"props":90089,"children":90090},{},[90091,90096,90101,90106,90111,90116],{"type":17,"tag":84,"props":90092,"children":90093},{},[90094],{"type":23,"value":90095},"a transformation engine",{"type":17,"tag":84,"props":90097,"children":90098},{},[90099],{"type":23,"value":90100},"a schema layer",{"type":17,"tag":84,"props":90102,"children":90103},{},[90104],{"type":23,"value":90105},"an auth layer",{"type":17,"tag":84,"props":90107,"children":90108},{},[90109],{"type":23,"value":90110},"a webhook layer",{"type":17,"tag":84,"props":90112,"children":90113},{},[90114],{"type":23,"value":90115},"a monitoring layer",{"type":17,"tag":84,"props":90117,"children":90118},{},[90119],{"type":23,"value":90120},"a maintenance layer",{"type":17,"tag":29,"props":90122,"children":90123},{},[90124],{"type":23,"value":90125},"In other words, you are not just building integrations.",{"type":17,"tag":29,"props":90127,"children":90128},{},[90129,90131,90136],{"type":23,"value":90130},"You are building an ",{"type":17,"tag":48,"props":90132,"children":90133},{},[90134],{"type":23,"value":90135},"integration platform",{"type":23,"value":54},{"type":17,"tag":29,"props":90138,"children":90139},{},[90140],{"type":23,"value":90141},"That is why the question is rarely just:",{"type":17,"tag":29,"props":90143,"children":90144},{},[90145],{"type":23,"value":90146},"'How do we map fields?'",{"type":17,"tag":29,"props":90148,"children":90149},{},[90150],{"type":23,"value":90151},"The better question is:",{"type":17,"tag":29,"props":90153,"children":90154},{},[90155],{"type":23,"value":90156},"'How much of this platform do we want to build and maintain ourselves?'",{"type":17,"tag":68,"props":90158,"children":90160},{"id":90159},"why-this-matters-for-unified-apis",[90161],{"type":23,"value":90162},"Why this matters for unified APIs",{"type":17,"tag":29,"props":90164,"children":90165},{},[90166],{"type":23,"value":90167},"This is where unified APIs either become extremely valuable or extremely limiting.",{"type":17,"tag":29,"props":90169,"children":90170},{},[90171,90173,90177],{"type":23,"value":90172},"A weak ",{"type":17,"tag":133,"props":90174,"children":90175},{"href":7691},[90176],{"type":23,"value":7459},{"type":23,"value":90178}," gives you:",{"type":17,"tag":80,"props":90180,"children":90181},{},[90182,90186,90191,90196,90201],{"type":17,"tag":84,"props":90183,"children":90184},{},[90185],{"type":23,"value":80247},{"type":17,"tag":84,"props":90187,"children":90188},{},[90189],{"type":23,"value":90190},"basic read support",{"type":17,"tag":84,"props":90192,"children":90193},{},[90194],{"type":23,"value":90195},"little room for custom fields",{"type":17,"tag":84,"props":90197,"children":90198},{},[90199],{"type":23,"value":90200},"limited write depth",{"type":17,"tag":84,"props":90202,"children":90203},{},[90204],{"type":23,"value":90205},"poor visibility into provider-specific behavior",{"type":17,"tag":29,"props":90207,"children":90208},{},[90209],{"type":23,"value":90210},"A stronger unified API gives you:",{"type":17,"tag":80,"props":90212,"children":90213},{},[90214,90219,90223,90227,90232],{"type":17,"tag":84,"props":90215,"children":90216},{},[90217],{"type":23,"value":90218},"deeply normalized models",{"type":17,"tag":84,"props":90220,"children":90221},{},[90222],{"type":23,"value":44278},{"type":17,"tag":84,"props":90224,"children":90225},{},[90226],{"type":23,"value":10527},{"type":17,"tag":84,"props":90228,"children":90229},{},[90230],{"type":23,"value":90231},"passthrough where normalization stops",{"type":17,"tag":84,"props":90233,"children":90234},{},[90235],{"type":23,"value":90236},"built-in auth, observability, and webhook infrastructure",{"type":17,"tag":29,"props":90238,"children":90239},{},[90240],{"type":23,"value":90241},"That difference matters a lot.",{"type":17,"tag":68,"props":90243,"children":90245},{"id":90244},"how-unifiedto-approaches-this-problem",[90246],{"type":23,"value":90247},"How Unified.to approaches this problem",{"type":17,"tag":29,"props":90249,"children":90250},{},[90251,90252,90257],{"type":23,"value":80319},{"type":17,"tag":133,"props":90253,"children":90255},{"href":212,"rel":90254},[214],[90256],{"type":23,"value":217},{"type":23,"value":90258}," has a stronger story than many vendors.",{"type":17,"tag":29,"props":90260,"children":90261},{},[90262],{"type":23,"value":90263},"Unified is not just trying to flatten everything into the lowest common denominator.",{"type":17,"tag":29,"props":90265,"children":90266},{},[90267],{"type":23,"value":90268},"It combines several things that matter when normalizing many APIs:",{"type":17,"tag":239,"props":90270,"children":90272},{"id":90271},"deep-category-models",[90273],{"type":23,"value":90274},"Deep category models",{"type":17,"tag":29,"props":90276,"children":90277},{},[90278],{"type":23,"value":90279},"Unified provides normalized APIs across categories like CRM, ATS, HRIS, accounting, ticketing, file storage, and more, with support for both standard objects and deeper category-specific structures.",{"type":17,"tag":239,"props":90281,"children":90283},{"id":90282},"custom-fields-and-passthrough-access",[90284],{"type":23,"value":90285},"Custom fields and passthrough access",{"type":17,"tag":29,"props":90287,"children":90288},{},[90289],{"type":23,"value":90290},"This matters because normalization alone is not enough. Teams often need access to fields and objects outside the standard model. Unified supports that through metadata APIs and passthrough-style flexibility, which keeps the normalized layer useful without turning it into a dead end.",{"type":17,"tag":239,"props":90292,"children":90293},{"id":13402},[90294],{"type":23,"value":13405},{"type":17,"tag":29,"props":90296,"children":90297},{},[90298],{"type":23,"value":90299},"Unified fetches live data from source APIs instead of relying on cached copies. That reduces stale-data problems and helps products that depend on current records and real-time actions.",{"type":17,"tag":239,"props":90301,"children":90303},{"id":90302},"zero-storage-design",[90304],{"type":23,"value":43670},{"type":17,"tag":29,"props":90306,"children":90307},{},[90308],{"type":23,"value":90309},"Because Unified does not store end-customer data at rest, the compliance and security footprint is smaller. For normalization-heavy architectures, that is a real advantage.",{"type":17,"tag":239,"props":90311,"children":90313},{"id":90312},"built-in-auth-webhook-and-observability-layers",[90314],{"type":23,"value":90315},"Built-in auth, webhook, and observability layers",{"type":17,"tag":29,"props":90317,"children":90318},{},[90319],{"type":23,"value":90320},"Normalization at scale is not just a schema problem. It is also an operational problem. Unified includes authorization handling, native and virtual webhooks, and platform-level observability so teams do not have to build every supporting layer themselves.",{"type":17,"tag":68,"props":90322,"children":90323},{"id":1552},[90324],{"type":23,"value":1555},{"type":17,"tag":29,"props":90326,"children":90327},{},[90328],{"type":23,"value":90329},"Normalizing multiple API integrations sounds like a data mapping exercise.",{"type":17,"tag":29,"props":90331,"children":90332},{},[90333],{"type":23,"value":90334},"It is not.",{"type":17,"tag":29,"props":90336,"children":90337},{},[90338],{"type":23,"value":90339},"It is a product, platform, and architecture problem all at once.",{"type":17,"tag":29,"props":90341,"children":90342},{},[90343],{"type":23,"value":90344},"The hardest parts are not just:",{"type":17,"tag":80,"props":90346,"children":90347},{},[90348,90353,90358],{"type":17,"tag":84,"props":90349,"children":90350},{},[90351],{"type":23,"value":90352},"naming things consistently",{"type":17,"tag":84,"props":90354,"children":90355},{},[90356],{"type":23,"value":90357},"mapping fields",{"type":17,"tag":84,"props":90359,"children":90360},{},[90361],{"type":23,"value":90362},"transforming values",{"type":17,"tag":29,"props":90364,"children":90365},{},[90366],{"type":23,"value":90367},"The hardest parts are:",{"type":17,"tag":80,"props":90369,"children":90370},{},[90371,90376,90381,90386,90391,90396],{"type":17,"tag":84,"props":90372,"children":90373},{},[90374],{"type":23,"value":90375},"preserving meaning across systems",{"type":17,"tag":84,"props":90377,"children":90378},{},[90379],{"type":23,"value":90380},"supporting writes without breaking provider-specific logic",{"type":17,"tag":84,"props":90382,"children":90383},{},[90384],{"type":23,"value":90385},"handling custom fields and custom objects",{"type":17,"tag":84,"props":90387,"children":90388},{},[90389],{"type":23,"value":90390},"staying real-time",{"type":17,"tag":84,"props":90392,"children":90393},{},[90394],{"type":23,"value":90395},"scaling securely",{"type":17,"tag":84,"props":90397,"children":90398},{},[90399],{"type":23,"value":90400},"maintaining trust in the model over time",{"type":17,"tag":29,"props":90402,"children":90403},{},[90404],{"type":23,"value":90405},"That is why teams often underestimate normalization until they are deep into it.",{"type":17,"tag":29,"props":90407,"children":90408},{},[90409],{"type":23,"value":90410},"If your product needs to support many integrations across a category, the right goal is not just 'normalize the data.'",{"type":17,"tag":29,"props":90412,"children":90413},{},[90414,90416],{"type":23,"value":90415},"It is: ",{"type":17,"tag":48,"props":90417,"children":90418},{},[90419],{"type":23,"value":90420},"build or adopt an integration architecture that makes normalization sustainable.",{"type":17,"tag":29,"props":90422,"children":90423},{},[90424,90425],{"type":23,"value":1609},{"type":17,"tag":133,"props":90426,"children":90428},{"href":1612,"rel":90427},[214],[90429],{"type":23,"value":1616},{"type":17,"tag":29,"props":90431,"children":90432},{},[90433,90434],{"type":23,"value":1609},{"type":17,"tag":133,"props":90435,"children":90437},{"href":1623,"rel":90436},[214],[90438],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":90440},[90441,90442,90443,90444,90445,90446,90447,90448,90449,90450,90451,90452,90453,90454,90455,90462],{"id":89076,"depth":1629,"text":89079},{"id":89147,"depth":1629,"text":89150},{"id":89196,"depth":1629,"text":89199},{"id":89255,"depth":1629,"text":89258},{"id":89400,"depth":1629,"text":89403},{"id":89515,"depth":1629,"text":89518},{"id":89594,"depth":1629,"text":89597},{"id":89647,"depth":1629,"text":89650},{"id":89723,"depth":1629,"text":89726},{"id":89825,"depth":1629,"text":89828},{"id":89919,"depth":1629,"text":89922},{"id":89993,"depth":1629,"text":89996},{"id":90074,"depth":1629,"text":90077},{"id":90159,"depth":1629,"text":90162},{"id":90244,"depth":1629,"text":90247,"children":90456},[90457,90458,90459,90460,90461],{"id":90271,"depth":1635,"text":90274},{"id":90282,"depth":1635,"text":90285},{"id":13402,"depth":1635,"text":13405},{"id":90302,"depth":1635,"text":43670},{"id":90312,"depth":1635,"text":90315},{"id":1552,"depth":1629,"text":1555},"content:blog:top_challenges_of_normalizing_multiple_api_integrations.md","blog/top_challenges_of_normalizing_multiple_api_integrations.md","blog/top_challenges_of_normalizing_multiple_api_integrations",{"_path":90467,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":90468,"description":90469,"img":90470,"date":90471,"tag":12,"body":90472,"_type":1677,"_id":91628,"_source":1679,"_file":91629,"_stem":91630,"_extension":1682},"/blog/embedded_ipaas_vs_unified_apis_choosing_the_right_integration_architecture_for_your_saas_product","Embedded iPaaS vs Unified APIs: Choosing the Right Integration Architecture for Your SaaS Product","SaaS products increasingly rely on integrations to connect with their customers' existing tools. CRM systems, HR platforms, payment providers, file storage...","https://s3.us-east-2.amazonaws.com/unified-article-images/embedded_ipaas_vs_unified_apis_choosing_the_right_integration_architecture_for_your_saas_product-icon.png","2026-03-09T19:37:00.000Z",{"type":14,"children":90473,"toc":91596},[90474,90479,90482,90489,90494,90506,90511,90529,90534,90539,90545,90550,90555,90583,90600,90605,90611,90621,90626,90631,90635,90663,90674,90678,90696,90702,90707,90713,90718,90723,90741,90746,90752,90757,90762,90789,90794,90800,90805,90822,90827,90833,90838,90843,90847,90852,90858,90863,90869,90874,90880,90885,90896,90902,90907,90913,90918,90924,90929,90933,90956,90961,90966,90971,90989,90995,91007,91011,91021,91026,91031,91040,91045,91065,91070,91076,91087,91092,91097,91120,91132,91137,91142,91153,91158,91163,91186,91191,91197,91358,91364,91369,91375,91398,91404,91422,91428,91451,91457,91468,91472,91495,91500,91505,91527,91537,91541,91546,91558,91563,91575,91580,91588],{"type":17,"tag":18,"props":90475,"children":90477},{"id":90476},"embedded-ipaas-vs-unified-apis-choosing-the-right-integration-architecture-for-your-saas-product",[90478],{"type":23,"value":90468},{"type":17,"tag":25,"props":90480,"children":90481},{},[],{"type":17,"tag":29,"props":90483,"children":90484},{},[90485],{"type":17,"tag":33,"props":90486,"children":90487},{},[90488],{"type":23,"value":37},{"type":17,"tag":29,"props":90490,"children":90491},{},[90492],{"type":23,"value":90493},"SaaS products increasingly rely on integrations to connect with their customers' existing tools. CRM systems, HR platforms, payment providers, file storage tools, and messaging platforms all become part of the product experience.",{"type":17,"tag":29,"props":90495,"children":90496},{},[90497,90499,90504],{"type":23,"value":90498},"But choosing the ",{"type":17,"tag":48,"props":90500,"children":90501},{},[90502],{"type":23,"value":90503},"right integration architecture",{"type":23,"value":90505}," is not straightforward.",{"type":17,"tag":29,"props":90507,"children":90508},{},[90509],{"type":23,"value":90510},"Two approaches dominate modern SaaS integration infrastructure:",{"type":17,"tag":80,"props":90512,"children":90513},{},[90514,90522],{"type":17,"tag":84,"props":90515,"children":90516},{},[90517],{"type":17,"tag":48,"props":90518,"children":90519},{},[90520],{"type":23,"value":90521},"Embedded iPaaS platforms",{"type":17,"tag":84,"props":90523,"children":90524},{},[90525],{"type":17,"tag":48,"props":90526,"children":90527},{},[90528],{"type":23,"value":78607},{"type":17,"tag":29,"props":90530,"children":90531},{},[90532],{"type":23,"value":90533},"Both promise faster integrations and reduced engineering effort. However, they are built on very different architectural foundations.",{"type":17,"tag":29,"props":90535,"children":90536},{},[90537],{"type":23,"value":90538},"This guide explains how embedded iPaaS platforms work, how unified APIs differ, and when each approach makes sense for your product. It also explains why many SaaS companies are increasingly moving toward real-time unified APIs such as Unified.to.",{"type":17,"tag":68,"props":90540,"children":90542},{"id":90541},"why-saas-products-need-integration-infrastructure",[90543],{"type":23,"value":90544},"Why SaaS Products Need Integration Infrastructure",{"type":17,"tag":29,"props":90546,"children":90547},{},[90548],{"type":23,"value":90549},"Most SaaS products cannot operate in isolation. Customers expect their tools to integrate with the systems they already use.",{"type":17,"tag":29,"props":90551,"children":90552},{},[90553],{"type":23,"value":90554},"Common examples include:",{"type":17,"tag":80,"props":90556,"children":90557},{},[90558,90563,90568,90573,90578],{"type":17,"tag":84,"props":90559,"children":90560},{},[90561],{"type":23,"value":90562},"HR platforms syncing employee data with payroll systems",{"type":17,"tag":84,"props":90564,"children":90565},{},[90566],{"type":23,"value":90567},"customer support tools integrating with CRMs",{"type":17,"tag":84,"props":90569,"children":90570},{},[90571],{"type":23,"value":90572},"analytics platforms pulling data from advertising networks",{"type":17,"tag":84,"props":90574,"children":90575},{},[90576],{"type":23,"value":90577},"product analytics tools accessing customer messaging data",{"type":17,"tag":84,"props":90579,"children":90580},{},[90581],{"type":23,"value":90582},"AI copilots interacting with external SaaS applications",{"type":17,"tag":29,"props":90584,"children":90585},{},[90586,90588,90592,90594,90598],{"type":23,"value":90587},"Historically, companies built these integrations one provider at a time. But this approach quickly becomes difficult to scale. Each API introduces its own authentication flow, ",{"type":17,"tag":133,"props":90589,"children":90590},{"href":135},[90591],{"type":23,"value":138},{"type":23,"value":90593},", schema design, ",{"type":17,"tag":133,"props":90595,"children":90596},{"href":1857},[90597],{"type":23,"value":1860},{"type":23,"value":90599}," rules, and webhook behavior.",{"type":17,"tag":29,"props":90601,"children":90602},{},[90603],{"type":23,"value":90604},"Integration infrastructure platforms attempt to solve this problem.",{"type":17,"tag":68,"props":90606,"children":90608},{"id":90607},"what-is-embedded-ipaas",[90609],{"type":23,"value":90610},"What Is Embedded iPaaS?",{"type":17,"tag":29,"props":90612,"children":90613},{},[90614,90619],{"type":17,"tag":48,"props":90615,"children":90616},{},[90617],{"type":23,"value":90618},"Embedded iPaaS (Integration Platform as a Service)",{"type":23,"value":90620}," platforms provide workflow automation and orchestration infrastructure that SaaS companies can embed directly into their product.",{"type":17,"tag":29,"props":90622,"children":90623},{},[90624],{"type":23,"value":90625},"Examples include platforms like Paragon.",{"type":17,"tag":29,"props":90627,"children":90628},{},[90629],{"type":23,"value":90630},"Instead of writing custom integration code, developers use the platform's infrastructure to connect SaaS applications and orchestrate workflows between them.",{"type":17,"tag":29,"props":90632,"children":90633},{},[90634],{"type":23,"value":12607},{"type":17,"tag":80,"props":90636,"children":90637},{},[90638,90643,90648,90653,90658],{"type":17,"tag":84,"props":90639,"children":90640},{},[90641],{"type":23,"value":90642},"workflow automation engines",{"type":17,"tag":84,"props":90644,"children":90645},{},[90646],{"type":23,"value":90647},"integration marketplaces for customers",{"type":17,"tag":84,"props":90649,"children":90650},{},[90651],{"type":23,"value":90652},"scheduled data synchronization pipelines",{"type":17,"tag":84,"props":90654,"children":90655},{},[90656],{"type":23,"value":90657},"event queues and job orchestration",{"type":17,"tag":84,"props":90659,"children":90660},{},[90661],{"type":23,"value":90662},"low-code workflow builders",{"type":17,"tag":29,"props":90664,"children":90665},{},[90666,90668,90673],{"type":23,"value":90667},"Embedded iPaaS platforms are often used when SaaS products want to ",{"type":17,"tag":48,"props":90669,"children":90670},{},[90671],{"type":23,"value":90672},"embed automation workflows for their users",{"type":23,"value":54},{"type":17,"tag":29,"props":90675,"children":90676},{},[90677],{"type":23,"value":3258},{"type":17,"tag":80,"props":90679,"children":90680},{},[90681,90686,90691],{"type":17,"tag":84,"props":90682,"children":90683},{},[90684],{"type":23,"value":90685},"triggering Slack notifications when a CRM deal changes",{"type":17,"tag":84,"props":90687,"children":90688},{},[90689],{"type":23,"value":90690},"updating project management tasks after support tickets close",{"type":17,"tag":84,"props":90692,"children":90693},{},[90694],{"type":23,"value":90695},"syncing data between marketing platforms and CRMs",{"type":17,"tag":68,"props":90697,"children":90699},{"id":90698},"how-embedded-ipaas-architectures-work",[90700],{"type":23,"value":90701},"How Embedded iPaaS Architectures Work",{"type":17,"tag":29,"props":90703,"children":90704},{},[90705],{"type":23,"value":90706},"Most embedded iPaaS systems follow a similar architectural pattern.",{"type":17,"tag":239,"props":90708,"children":90710},{"id":90709},"data-ingestion-and-sync-pipelines",[90711],{"type":23,"value":90712},"Data ingestion and sync pipelines",{"type":17,"tag":29,"props":90714,"children":90715},{},[90716],{"type":23,"value":90717},"iPaaS platforms often ingest data from external systems and store it in their own infrastructure. This allows workflows to operate on a local dataset rather than calling the upstream API for every request.",{"type":17,"tag":29,"props":90719,"children":90720},{},[90721],{"type":23,"value":90722},"For example, many platforms perform:",{"type":17,"tag":80,"props":90724,"children":90725},{},[90726,90731,90736],{"type":17,"tag":84,"props":90727,"children":90728},{},[90729],{"type":23,"value":90730},"an initial data sync",{"type":17,"tag":84,"props":90732,"children":90733},{},[90734],{"type":23,"value":90735},"incremental sync jobs at scheduled intervals",{"type":17,"tag":84,"props":90737,"children":90738},{},[90739],{"type":23,"value":90740},"periodic full refresh jobs to reconcile state",{"type":17,"tag":29,"props":90742,"children":90743},{},[90744],{"type":23,"value":90745},"These pipelines populate normalized objects that workflows can access.",{"type":17,"tag":239,"props":90747,"children":90749},{"id":90748},"workflow-execution-engines",[90750],{"type":23,"value":90751},"Workflow execution engines",{"type":17,"tag":29,"props":90753,"children":90754},{},[90755],{"type":23,"value":90756},"Once data is available, automation workflows run inside the platform's execution environment.",{"type":17,"tag":29,"props":90758,"children":90759},{},[90760],{"type":23,"value":90761},"These workflows may include:",{"type":17,"tag":80,"props":90763,"children":90764},{},[90765,90770,90775,90779,90784],{"type":17,"tag":84,"props":90766,"children":90767},{},[90768],{"type":23,"value":90769},"conditional logic",{"type":17,"tag":84,"props":90771,"children":90772},{},[90773],{"type":23,"value":90774},"event triggers",{"type":17,"tag":84,"props":90776,"children":90777},{},[90778],{"type":23,"value":828},{"type":17,"tag":84,"props":90780,"children":90781},{},[90782],{"type":23,"value":90783},"transformation steps",{"type":17,"tag":84,"props":90785,"children":90786},{},[90787],{"type":23,"value":90788},"asynchronous processing",{"type":17,"tag":29,"props":90790,"children":90791},{},[90792],{"type":23,"value":90793},"Execution engines typically rely on message queues and worker systems to process jobs reliably.",{"type":17,"tag":239,"props":90795,"children":90797},{"id":90796},"webhook-and-polling-infrastructure",[90798],{"type":23,"value":90799},"Webhook and polling infrastructure",{"type":17,"tag":29,"props":90801,"children":90802},{},[90803],{"type":23,"value":90804},"To detect changes in external systems, embedded iPaaS platforms use a mix of:",{"type":17,"tag":80,"props":90806,"children":90807},{},[90808,90817],{"type":17,"tag":84,"props":90809,"children":90810},{},[90811,90813],{"type":23,"value":90812},"provider ",{"type":17,"tag":133,"props":90814,"children":90815},{"href":4999},[90816],{"type":23,"value":5002},{"type":17,"tag":84,"props":90818,"children":90819},{},[90820],{"type":23,"value":90821},"scheduled polling jobs",{"type":17,"tag":29,"props":90823,"children":90824},{},[90825],{"type":23,"value":90826},"If a provider does not support webhooks, the platform polls the API periodically to detect changes.",{"type":17,"tag":68,"props":90828,"children":90830},{"id":90829},"advantages-of-embedded-ipaas",[90831],{"type":23,"value":90832},"Advantages of Embedded iPaaS",{"type":17,"tag":29,"props":90834,"children":90835},{},[90836],{"type":23,"value":90837},"Embedded iPaaS platforms are powerful when products need automation and orchestration capabilities.",{"type":17,"tag":29,"props":90839,"children":90840},{},[90841],{"type":23,"value":90842},"Common advantages include:",{"type":17,"tag":239,"props":90844,"children":90845},{"id":13496},[90846],{"type":23,"value":12682},{"type":17,"tag":29,"props":90848,"children":90849},{},[90850],{"type":23,"value":90851},"iPaaS platforms allow developers and product teams to create complex automation pipelines without building their own workflow engine.",{"type":17,"tag":239,"props":90853,"children":90855},{"id":90854},"visual-integration-builders",[90856],{"type":23,"value":90857},"Visual integration builders",{"type":17,"tag":29,"props":90859,"children":90860},{},[90861],{"type":23,"value":90862},"Many platforms include low-code or no-code workflow builders that allow non-technical users to configure automations.",{"type":17,"tag":239,"props":90864,"children":90866},{"id":90865},"durable-job-execution",[90867],{"type":23,"value":90868},"Durable job execution",{"type":17,"tag":29,"props":90870,"children":90871},{},[90872],{"type":23,"value":90873},"Because workflows run inside a managed execution environment, tasks can be retried automatically and failures can be monitored centrally.",{"type":17,"tag":239,"props":90875,"children":90877},{"id":90876},"event-driven-automation",[90878],{"type":23,"value":90879},"Event-driven automation",{"type":17,"tag":29,"props":90881,"children":90882},{},[90883],{"type":23,"value":90884},"Webhook triggers and scheduled jobs allow applications to react to changes across multiple systems.",{"type":17,"tag":29,"props":90886,"children":90887},{},[90888,90890,90894],{"type":23,"value":90889},"For SaaS products focused on ",{"type":17,"tag":48,"props":90891,"children":90892},{},[90893],{"type":23,"value":10949},{"type":23,"value":90895},", this architecture can be extremely valuable.",{"type":17,"tag":68,"props":90897,"children":90899},{"id":90898},"limitations-of-embedded-ipaas-for-product-integrations",[90900],{"type":23,"value":90901},"Limitations of Embedded iPaaS for Product Integrations",{"type":17,"tag":29,"props":90903,"children":90904},{},[90905],{"type":23,"value":90906},"While embedded iPaaS platforms are strong automation tools, they introduce several architectural trade-offs when used for product integrations.",{"type":17,"tag":239,"props":90908,"children":90910},{"id":90909},"data-replication",[90911],{"type":23,"value":90912},"Data replication",{"type":17,"tag":29,"props":90914,"children":90915},{},[90916],{"type":23,"value":90917},"Many iPaaS systems store synchronized copies of customer data in their infrastructure. This can introduce additional security and compliance considerations when dealing with sensitive data.",{"type":17,"tag":239,"props":90919,"children":90921},{"id":90920},"sync-latency",[90922],{"type":23,"value":90923},"Sync latency",{"type":17,"tag":29,"props":90925,"children":90926},{},[90927],{"type":23,"value":90928},"Because data is refreshed through polling or scheduled jobs, updates may take minutes or hours to appear.",{"type":17,"tag":29,"props":90930,"children":90931},{},[90932],{"type":23,"value":3258},{"type":17,"tag":80,"props":90934,"children":90935},{},[90936,90941,90946],{"type":17,"tag":84,"props":90937,"children":90938},{},[90939],{"type":23,"value":90940},"minute-level sync jobs still produce ~30-second average latency",{"type":17,"tag":84,"props":90942,"children":90943},{},[90944],{"type":23,"value":90945},"hourly sync schedules produce ~30-minute average delays",{"type":17,"tag":84,"props":90947,"children":90948},{},[90949,90951],{"type":23,"value":90950},"daily sync schedules can introduce ",{"type":17,"tag":48,"props":90952,"children":90953},{},[90954],{"type":23,"value":90955},"12-hour average staleness",{"type":17,"tag":239,"props":90957,"children":90959},{"id":90958},"infrastructure-complexity",[90960],{"type":23,"value":10085},{"type":17,"tag":29,"props":90962,"children":90963},{},[90964],{"type":23,"value":90965},"Workflow orchestration engines add operational complexity compared with simple API access.",{"type":17,"tag":29,"props":90967,"children":90968},{},[90969],{"type":23,"value":90970},"Debugging issues may require analyzing:",{"type":17,"tag":80,"props":90972,"children":90973},{},[90974,90979,90984],{"type":17,"tag":84,"props":90975,"children":90976},{},[90977],{"type":23,"value":90978},"workflow execution logs",{"type":17,"tag":84,"props":90980,"children":90981},{},[90982],{"type":23,"value":90983},"queue processing states",{"type":17,"tag":84,"props":90985,"children":90986},{},[90987],{"type":23,"value":90988},"job retry histories",{"type":17,"tag":239,"props":90990,"children":90992},{"id":90991},"over-engineering-for-simple-integrations",[90993],{"type":23,"value":90994},"Over-engineering for simple integrations",{"type":17,"tag":29,"props":90996,"children":90997},{},[90998,91000,91005],{"type":23,"value":90999},"If your product only needs ",{"type":17,"tag":48,"props":91001,"children":91002},{},[91003],{"type":23,"value":91004},"real-time API reads and writes",{"type":23,"value":91006},", workflow orchestration may be unnecessary overhead.",{"type":17,"tag":68,"props":91008,"children":91009},{"id":78628},[91010],{"type":23,"value":78631},{"type":17,"tag":29,"props":91012,"children":91013},{},[91014,91015,91019],{"type":23,"value":9619},{"type":17,"tag":48,"props":91016,"children":91017},{},[91018],{"type":23,"value":7459},{"type":23,"value":91020}," provides a single API layer that abstracts multiple SaaS providers behind a standardized data model.",{"type":17,"tag":29,"props":91022,"children":91023},{},[91024],{"type":23,"value":91025},"Instead of integrating separately with dozens of APIs, developers integrate once with the unified API.",{"type":17,"tag":29,"props":91027,"children":91028},{},[91029],{"type":23,"value":91030},"For example, a unified CRM API may expose endpoints like:",{"type":17,"tag":6893,"props":91032,"children":91035},{"className":91033,"code":91034,"language":20901,"meta":23},[20899],"GET /crm/{connection_id}/contact\nGET /crm/{connection_id}/company\nGET /crm/{connection_id}/deal\n",[91036],{"type":17,"tag":6121,"props":91037,"children":91038},{"__ignoreMap":7},[91039],{"type":23,"value":91034},{"type":17,"tag":29,"props":91041,"children":91042},{},[91043],{"type":23,"value":91044},"These endpoints map internally to provider-specific APIs such as:",{"type":17,"tag":80,"props":91046,"children":91047},{},[91048,91052,91056,91060],{"type":17,"tag":84,"props":91049,"children":91050},{},[91051],{"type":23,"value":3179},{"type":17,"tag":84,"props":91053,"children":91054},{},[91055],{"type":23,"value":3184},{"type":17,"tag":84,"props":91057,"children":91058},{},[91059],{"type":23,"value":26530},{"type":17,"tag":84,"props":91061,"children":91062},{},[91063],{"type":23,"value":91064},"Zoho",{"type":17,"tag":29,"props":91066,"children":91067},{},[91068],{"type":23,"value":91069},"Unified APIs normalize differences between providers so applications can interact with a consistent schema.",{"type":17,"tag":68,"props":91071,"children":91073},{"id":91072},"first-generation-unified-apis",[91074],{"type":23,"value":91075},"First-Generation Unified APIs",{"type":17,"tag":29,"props":91077,"children":91078},{},[91079,91081,91086],{"type":23,"value":91080},"The first generation of unified APIs often combined schema normalization with ",{"type":17,"tag":48,"props":91082,"children":91083},{},[91084],{"type":23,"value":91085},"data synchronization pipelines",{"type":23,"value":54},{"type":17,"tag":29,"props":91088,"children":91089},{},[91090],{"type":23,"value":91091},"Platforms such as Merge.dev or Finch commonly use this architecture.",{"type":17,"tag":29,"props":91093,"children":91094},{},[91095],{"type":23,"value":91096},"Typical characteristics include:",{"type":17,"tag":80,"props":91098,"children":91099},{},[91100,91105,91110,91115],{"type":17,"tag":84,"props":91101,"children":91102},{},[91103],{"type":23,"value":91104},"normalized data models across providers",{"type":17,"tag":84,"props":91106,"children":91107},{},[91108],{"type":23,"value":91109},"scheduled sync jobs that replicate provider data",{"type":17,"tag":84,"props":91111,"children":91112},{},[91113],{"type":23,"value":91114},"APIs that serve data from stored datasets",{"type":17,"tag":84,"props":91116,"children":91117},{},[91118],{"type":23,"value":91119},"webhook notifications after sync completion",{"type":17,"tag":29,"props":91121,"children":91122},{},[91123,91125,91130],{"type":23,"value":91124},"This architecture simplifies querying but introduces data freshness limitations because the API returns ",{"type":17,"tag":48,"props":91126,"children":91127},{},[91128],{"type":23,"value":91129},"the most recent sync",{"type":23,"value":91131},", not the current provider state.",{"type":17,"tag":68,"props":91133,"children":91135},{"id":91134},"real-time-unified-apis",[91136],{"type":23,"value":69375},{"type":17,"tag":29,"props":91138,"children":91139},{},[91140],{"type":23,"value":91141},"A newer category of unified APIs has emerged that removes the sync-and-store layer entirely.",{"type":17,"tag":29,"props":91143,"children":91144},{},[91145,91147,91151],{"type":23,"value":91146},"Real-time unified APIs use a ",{"type":17,"tag":48,"props":91148,"children":91149},{},[91150],{"type":23,"value":86921},{"type":23,"value":91152}," where each API request is executed directly against the source system.",{"type":17,"tag":29,"props":91154,"children":91155},{},[91156],{"type":23,"value":91157},"One platform built on this architecture is Unified.to.",{"type":17,"tag":29,"props":91159,"children":91160},{},[91161],{"type":23,"value":91162},"Instead of replicating data, these platforms:",{"type":17,"tag":80,"props":91164,"children":91165},{},[91166,91171,91176,91181],{"type":17,"tag":84,"props":91167,"children":91168},{},[91169],{"type":23,"value":91170},"proxy API requests directly to providers",{"type":17,"tag":84,"props":91172,"children":91173},{},[91174],{"type":23,"value":91175},"normalize responses in real time",{"type":17,"tag":84,"props":91177,"children":91178},{},[91179],{"type":23,"value":91180},"avoid storing customer records",{"type":17,"tag":84,"props":91182,"children":91183},{},[91184],{"type":23,"value":91185},"deliver updates through native or virtual webhooks",{"type":17,"tag":29,"props":91187,"children":91188},{},[91189],{"type":23,"value":91190},"This design eliminates synchronization delays while still providing a consistent integration layer.",{"type":17,"tag":68,"props":91192,"children":91194},{"id":91193},"embedded-ipaas-vs-unified-apis-architecture-comparison",[91195],{"type":23,"value":91196},"Embedded iPaaS vs Unified APIs: Architecture Comparison",{"type":17,"tag":7231,"props":91198,"children":91199},{},[91200,91223],{"type":17,"tag":7235,"props":91201,"children":91202},{},[91203],{"type":17,"tag":7239,"props":91204,"children":91205},{},[91206,91210,91214,91218],{"type":17,"tag":7243,"props":91207,"children":91208},{},[91209],{"type":23,"value":7247},{"type":17,"tag":7243,"props":91211,"children":91212},{},[91213],{"type":23,"value":81255},{"type":17,"tag":7243,"props":91215,"children":91216},{},[91217],{"type":23,"value":7806},{"type":17,"tag":7243,"props":91219,"children":91220},{},[91221],{"type":23,"value":91222},"Real-Time Unified API",{"type":17,"tag":7259,"props":91224,"children":91225},{},[91226,91248,91269,91291,91313,91335],{"type":17,"tag":7239,"props":91227,"children":91228},{},[91229,91234,91238,91243],{"type":17,"tag":7266,"props":91230,"children":91231},{},[91232],{"type":23,"value":91233},"Core purpose",{"type":17,"tag":7266,"props":91235,"children":91236},{},[91237],{"type":23,"value":12682},{"type":17,"tag":7266,"props":91239,"children":91240},{},[91241],{"type":23,"value":91242},"Schema abstraction",{"type":17,"tag":7266,"props":91244,"children":91245},{},[91246],{"type":23,"value":91247},"Live integration layer",{"type":17,"tag":7239,"props":91249,"children":91250},{},[91251,91255,91260,91265],{"type":17,"tag":7266,"props":91252,"children":91253},{},[91254],{"type":23,"value":69408},{"type":17,"tag":7266,"props":91256,"children":91257},{},[91258],{"type":23,"value":91259},"Stored datasets",{"type":17,"tag":7266,"props":91261,"children":91262},{},[91263],{"type":23,"value":91264},"Often cached",{"type":17,"tag":7266,"props":91266,"children":91267},{},[91268],{"type":23,"value":46580},{"type":17,"tag":7239,"props":91270,"children":91271},{},[91272,91277,91282,91287],{"type":17,"tag":7266,"props":91273,"children":91274},{},[91275],{"type":23,"value":91276},"Update model",{"type":17,"tag":7266,"props":91278,"children":91279},{},[91280],{"type":23,"value":91281},"Polling + workflows",{"type":17,"tag":7266,"props":91283,"children":91284},{},[91285],{"type":23,"value":91286},"Sync pipelines",{"type":17,"tag":7266,"props":91288,"children":91289},{},[91290],{"type":23,"value":87550},{"type":17,"tag":7239,"props":91292,"children":91293},{},[91294,91298,91303,91308],{"type":17,"tag":7266,"props":91295,"children":91296},{},[91297],{"type":23,"value":9960},{"type":17,"tag":7266,"props":91299,"children":91300},{},[91301],{"type":23,"value":91302},"Minutes to hours",{"type":17,"tag":7266,"props":91304,"children":91305},{},[91306],{"type":23,"value":91307},"Depends on sync",{"type":17,"tag":7266,"props":91309,"children":91310},{},[91311],{"type":23,"value":91312},"Always live",{"type":17,"tag":7239,"props":91314,"children":91315},{},[91316,91321,91326,91330],{"type":17,"tag":7266,"props":91317,"children":91318},{},[91319],{"type":23,"value":91320},"Infrastructure",{"type":17,"tag":7266,"props":91322,"children":91323},{},[91324],{"type":23,"value":91325},"Workflow engines",{"type":17,"tag":7266,"props":91327,"children":91328},{},[91329],{"type":23,"value":91286},{"type":17,"tag":7266,"props":91331,"children":91332},{},[91333],{"type":23,"value":91334},"Stateless proxy layer",{"type":17,"tag":7239,"props":91336,"children":91337},{},[91338,91343,91348,91353],{"type":17,"tag":7266,"props":91339,"children":91340},{},[91341],{"type":23,"value":91342},"Best use case",{"type":17,"tag":7266,"props":91344,"children":91345},{},[91346],{"type":23,"value":91347},"Automation workflows",{"type":17,"tag":7266,"props":91349,"children":91350},{},[91351],{"type":23,"value":91352},"Category integrations",{"type":17,"tag":7266,"props":91354,"children":91355},{},[91356],{"type":23,"value":91357},"Product integrations",{"type":17,"tag":68,"props":91359,"children":91361},{"id":91360},"which-approach-is-right-for-your-product",[91362],{"type":23,"value":91363},"Which Approach Is Right for Your Product?",{"type":17,"tag":29,"props":91365,"children":91366},{},[91367],{"type":23,"value":91368},"The best architecture depends on the role integrations play in your product.",{"type":17,"tag":239,"props":91370,"children":91372},{"id":91371},"choose-embedded-ipaas-if-your-product-needs",[91373],{"type":23,"value":91374},"Choose embedded iPaaS if your product needs:",{"type":17,"tag":80,"props":91376,"children":91377},{},[91378,91383,91388,91393],{"type":17,"tag":84,"props":91379,"children":91380},{},[91381],{"type":23,"value":91382},"user-configurable automation workflows",{"type":17,"tag":84,"props":91384,"children":91385},{},[91386],{"type":23,"value":91387},"cross-application orchestration",{"type":17,"tag":84,"props":91389,"children":91390},{},[91391],{"type":23,"value":91392},"visual workflow builders",{"type":17,"tag":84,"props":91394,"children":91395},{},[91396],{"type":23,"value":91397},"durable job pipelines",{"type":17,"tag":239,"props":91399,"children":91401},{"id":91400},"choose-unified-apis-if-your-product-primarily-needs",[91402],{"type":23,"value":91403},"Choose unified APIs if your product primarily needs:",{"type":17,"tag":80,"props":91405,"children":91406},{},[91407,91412,91417],{"type":17,"tag":84,"props":91408,"children":91409},{},[91410],{"type":23,"value":91411},"standardized access to many SaaS APIs",{"type":17,"tag":84,"props":91413,"children":91414},{},[91415],{"type":23,"value":91416},"normalized schemas across providers",{"type":17,"tag":84,"props":91418,"children":91419},{},[91420],{"type":23,"value":91421},"faster integration launches",{"type":17,"tag":239,"props":91423,"children":91425},{"id":91424},"choose-real-time-unified-apis-if-your-product-requires",[91426],{"type":23,"value":91427},"Choose real-time unified APIs if your product requires:",{"type":17,"tag":80,"props":91429,"children":91430},{},[91431,91436,91441,91446],{"type":17,"tag":84,"props":91432,"children":91433},{},[91434],{"type":23,"value":91435},"live access to customer systems",{"type":17,"tag":84,"props":91437,"children":91438},{},[91439],{"type":23,"value":91440},"AI agents interacting with external tools",{"type":17,"tag":84,"props":91442,"children":91443},{},[91444],{"type":23,"value":91445},"minimal compliance surface area",{"type":17,"tag":84,"props":91447,"children":91448},{},[91449],{"type":23,"value":91450},"fast launch of hundreds of integrations",{"type":17,"tag":68,"props":91452,"children":91454},{"id":91453},"why-real-time-unified-apis-are-emerging-as-the-next-integration-layer",[91455],{"type":23,"value":91456},"Why Real-Time Unified APIs Are Emerging as the Next Integration Layer",{"type":17,"tag":29,"props":91458,"children":91459},{},[91460,91462,91467],{"type":23,"value":91461},"Modern SaaS products increasingly depend on ",{"type":17,"tag":48,"props":91463,"children":91464},{},[91465],{"type":23,"value":91466},"real-time external data",{"type":23,"value":54},{"type":17,"tag":29,"props":91469,"children":91470},{},[91471],{"type":23,"value":24364},{"type":17,"tag":80,"props":91473,"children":91474},{},[91475,91480,91485,91490],{"type":17,"tag":84,"props":91476,"children":91477},{},[91478],{"type":23,"value":91479},"AI copilots interacting with SaaS systems",{"type":17,"tag":84,"props":91481,"children":91482},{},[91483],{"type":23,"value":91484},"live operational dashboards",{"type":17,"tag":84,"props":91486,"children":91487},{},[91488],{"type":23,"value":91489},"collaborative workflows across tools",{"type":17,"tag":84,"props":91491,"children":91492},{},[91493],{"type":23,"value":91494},"context-aware automation",{"type":17,"tag":29,"props":91496,"children":91497},{},[91498],{"type":23,"value":91499},"These use cases are difficult to support with architectures that rely on stored datasets and scheduled syncs.",{"type":17,"tag":29,"props":91501,"children":91502},{},[91503],{"type":23,"value":91504},"Real-time unified APIs address this challenge by combining:",{"type":17,"tag":80,"props":91506,"children":91507},{},[91508,91513,91517,91522],{"type":17,"tag":84,"props":91509,"children":91510},{},[91511],{"type":23,"value":91512},"pass-through API execution",{"type":17,"tag":84,"props":91514,"children":91515},{},[91516],{"type":23,"value":91416},{"type":17,"tag":84,"props":91518,"children":91519},{},[91520],{"type":23,"value":91521},"webhook-driven event delivery",{"type":17,"tag":84,"props":91523,"children":91524},{},[91525],{"type":23,"value":91526},"zero customer data storage",{"type":17,"tag":29,"props":91528,"children":91529},{},[91530,91531,91535],{"type":23,"value":35772},{"type":17,"tag":48,"props":91532,"children":91533},{},[91534],{"type":23,"value":217},{"type":23,"value":91536}," are built specifically for these scenarios.",{"type":17,"tag":68,"props":91538,"children":91539},{"id":1552},[91540],{"type":23,"value":44411},{"type":17,"tag":29,"props":91542,"children":91543},{},[91544],{"type":23,"value":91545},"Embedded iPaaS platforms helped popularize integrations in SaaS products by providing workflow infrastructure and automation capabilities.",{"type":17,"tag":29,"props":91547,"children":91548},{},[91549,91551,91556],{"type":23,"value":91550},"However, as SaaS applications increasingly require ",{"type":17,"tag":48,"props":91552,"children":91553},{},[91554],{"type":23,"value":91555},"real-time data access and AI-driven workflows",{"type":23,"value":91557},", newer architectures are emerging.",{"type":17,"tag":29,"props":91559,"children":91560},{},[91561],{"type":23,"value":91562},"Unified APIs simplify integration development by standardizing schemas across providers.",{"type":17,"tag":29,"props":91564,"children":91565},{},[91566,91568,91573],{"type":23,"value":91567},"Real-time unified APIs go one step further, enabling applications and AI agents to interact with external SaaS systems ",{"type":17,"tag":48,"props":91569,"children":91570},{},[91571],{"type":23,"value":91572},"live",{"type":23,"value":91574},", without storing customer data.",{"type":17,"tag":29,"props":91576,"children":91577},{},[91578],{"type":23,"value":91579},"For SaaS companies building modern integration-heavy products, understanding these architectural differences is essential when choosing the right platform.",{"type":17,"tag":29,"props":91581,"children":91582},{},[91583],{"type":17,"tag":133,"props":91584,"children":91586},{"href":1612,"rel":91585},[214],[91587],{"type":23,"value":44481},{"type":17,"tag":29,"props":91589,"children":91590},{},[91591],{"type":17,"tag":133,"props":91592,"children":91594},{"href":1623,"rel":91593},[214],[91595],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":91597},[91598,91599,91600,91605,91611,91617,91618,91619,91620,91621,91626,91627],{"id":90541,"depth":1629,"text":90544},{"id":90607,"depth":1629,"text":90610},{"id":90698,"depth":1629,"text":90701,"children":91601},[91602,91603,91604],{"id":90709,"depth":1635,"text":90712},{"id":90748,"depth":1635,"text":90751},{"id":90796,"depth":1635,"text":90799},{"id":90829,"depth":1629,"text":90832,"children":91606},[91607,91608,91609,91610],{"id":13496,"depth":1635,"text":12682},{"id":90854,"depth":1635,"text":90857},{"id":90865,"depth":1635,"text":90868},{"id":90876,"depth":1635,"text":90879},{"id":90898,"depth":1629,"text":90901,"children":91612},[91613,91614,91615,91616],{"id":90909,"depth":1635,"text":90912},{"id":90920,"depth":1635,"text":90923},{"id":90958,"depth":1635,"text":10085},{"id":90991,"depth":1635,"text":90994},{"id":78628,"depth":1629,"text":78631},{"id":91072,"depth":1629,"text":91075},{"id":91134,"depth":1629,"text":69375},{"id":91193,"depth":1629,"text":91196},{"id":91360,"depth":1629,"text":91363,"children":91622},[91623,91624,91625],{"id":91371,"depth":1635,"text":91374},{"id":91400,"depth":1635,"text":91403},{"id":91424,"depth":1635,"text":91427},{"id":91453,"depth":1629,"text":91456},{"id":1552,"depth":1629,"text":44411},"content:blog:embedded_ipaas_vs_unified_apis_choosing_the_right_integration_architecture_for_your_saas_product.md","blog/embedded_ipaas_vs_unified_apis_choosing_the_right_integration_architecture_for_your_saas_product.md","blog/embedded_ipaas_vs_unified_apis_choosing_the_right_integration_architecture_for_your_saas_product",{"_path":91632,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":91633,"description":91634,"img":91635,"date":91636,"tag":12,"body":91637,"_type":1677,"_id":92945,"_source":1679,"_file":92946,"_stem":92947,"_extension":1682},"/blog/top_7_hidden_costs_of_saas_integrations_no_one_talks_about","Top 7 Hidden Costs of SaaS Integrations No One Talks About","SaaS integrations look straightforward on the surface. Connect two systems, move some data, and ship the feature.","https://s3.us-east-2.amazonaws.com/unified-article-images/top_7_hidden_costs_of_saas_integrations_no_one_talks_about-icon.png","2026-03-09T19:36:00.000Z",{"type":14,"children":91638,"toc":92910},[91639,91644,91647,91654,91658,91663,91674,91679,91685,91690,91713,91718,91770,91775,91781,91786,91791,91830,91835,91841,91879,91885,91890,91895,91923,91928,91934,91939,91965,91970,91976,91981,91985,92013,92018,92023,92029,92034,92039,92045,92050,92055,92061,92113,92118,92151,92157,92162,92167,92172,92178,92183,92187,92220,92225,92231,92264,92270,92308,92313,92319,92324,92329,92334,92339,92345,92388,92393,92398,92404,92409,92414,92466,92471,92477,92510,92516,92521,92549,92554,92560,92565,92587,92592,92623,92629,92634,92667,92672,92678,92711,92716,92722,92727,92733,92781,92787,92792,92797,92825,92829,92834,92839,92879,92884,92889,92894,92902],{"type":17,"tag":18,"props":91640,"children":91642},{"id":91641},"top-7-hidden-costs-of-saas-integrations-no-one-talks-about",[91643],{"type":23,"value":91633},{"type":17,"tag":25,"props":91645,"children":91646},{},[],{"type":17,"tag":29,"props":91648,"children":91649},{},[91650],{"type":17,"tag":33,"props":91651,"children":91652},{},[91653],{"type":23,"value":37},{"type":17,"tag":29,"props":91655,"children":91656},{},[91657],{"type":23,"value":91634},{"type":17,"tag":29,"props":91659,"children":91660},{},[91661],{"type":23,"value":91662},"In practice, the visible cost is usually the smallest part of the project.",{"type":17,"tag":29,"props":91664,"children":91665},{},[91666,91668,91672],{"type":23,"value":91667},"The real cost shows up later in engineering maintenance, stale data, support escalations, security reviews, broken ",{"type":17,"tag":133,"props":91669,"children":91670},{"href":4999},[91671],{"type":23,"value":5002},{"type":23,"value":91673},", pricing surprises, and AI use cases that fail because the architecture underneath the integration stack was never built for real-time product workflows.",{"type":17,"tag":29,"props":91675,"children":91676},{},[91677],{"type":23,"value":91678},"If you are evaluating how to build product integrations in 2026, these are the hidden SaaS integration costs that matter most.",{"type":17,"tag":68,"props":91680,"children":91682},{"id":91681},"why-hidden-saas-integration-costs-matter",[91683],{"type":23,"value":91684},"Why hidden SaaS integration costs matter",{"type":17,"tag":29,"props":91686,"children":91687},{},[91688],{"type":23,"value":91689},"Most teams budget for the obvious costs:",{"type":17,"tag":80,"props":91691,"children":91692},{},[91693,91698,91703,91708],{"type":17,"tag":84,"props":91694,"children":91695},{},[91696],{"type":23,"value":91697},"Vendor fees",{"type":17,"tag":84,"props":91699,"children":91700},{},[91701],{"type":23,"value":91702},"Initial implementation",{"type":17,"tag":84,"props":91704,"children":91705},{},[91706],{"type":23,"value":91707},"A few weeks of engineering time",{"type":17,"tag":84,"props":91709,"children":91710},{},[91711],{"type":23,"value":91712},"QA and launch work",{"type":17,"tag":29,"props":91714,"children":91715},{},[91716],{"type":23,"value":91717},"What they usually do not budget for:",{"type":17,"tag":80,"props":91719,"children":91720},{},[91721,91726,91731,91736,91745,91750,91755,91760,91765],{"type":17,"tag":84,"props":91722,"children":91723},{},[91724],{"type":23,"value":91725},"Ongoing API maintenance",{"type":17,"tag":84,"props":91727,"children":91728},{},[91729],{"type":23,"value":91730},"Debugging and support time",{"type":17,"tag":84,"props":91732,"children":91733},{},[91734],{"type":23,"value":91735},"Schema drift",{"type":17,"tag":84,"props":91737,"children":91738},{},[91739,91743],{"type":17,"tag":133,"props":91740,"children":91741},{"href":779},[91742],{"type":23,"value":782},{"type":23,"value":91744}," and token lifecycle issues",{"type":17,"tag":84,"props":91746,"children":91747},{},[91748],{"type":23,"value":91749},"Security and compliance overhead",{"type":17,"tag":84,"props":91751,"children":91752},{},[91753],{"type":23,"value":91754},"Data freshness problems",{"type":17,"tag":84,"props":91756,"children":91757},{},[91758],{"type":23,"value":91759},"Customer-facing reliability issues",{"type":17,"tag":84,"props":91761,"children":91762},{},[91763],{"type":23,"value":91764},"Pricing models that scale badly",{"type":17,"tag":84,"props":91766,"children":91767},{},[91768],{"type":23,"value":91769},"AI features that break on stale or fragmented data",{"type":17,"tag":29,"props":91771,"children":91772},{},[91773],{"type":23,"value":91774},"That is where integration debt starts.",{"type":17,"tag":68,"props":91776,"children":91778},{"id":91777},"_1-integration-maintenance-never-really-stops",[91779],{"type":23,"value":91780},"1. Integration maintenance never really stops",{"type":17,"tag":29,"props":91782,"children":91783},{},[91784],{"type":23,"value":91785},"A proof of concept is often cheap. A production integration is not.",{"type":17,"tag":29,"props":91787,"children":91788},{},[91789],{"type":23,"value":91790},"Once an integration is live, your team is now tied to another company's:",{"type":17,"tag":80,"props":91792,"children":91793},{},[91794,91798,91803,91810,91815,91820,91825],{"type":17,"tag":84,"props":91795,"children":91796},{},[91797],{"type":23,"value":30228},{"type":17,"tag":84,"props":91799,"children":91800},{},[91801],{"type":23,"value":91802},"OAuth behavior",{"type":17,"tag":84,"props":91804,"children":91805},{},[91806],{"type":17,"tag":133,"props":91807,"children":91808},{"href":135},[91809],{"type":23,"value":138},{"type":17,"tag":84,"props":91811,"children":91812},{},[91813],{"type":23,"value":91814},"webhook behavior",{"type":17,"tag":84,"props":91816,"children":91817},{},[91818],{"type":23,"value":91819},"field structure",{"type":17,"tag":84,"props":91821,"children":91822},{},[91823],{"type":23,"value":91824},"uptime",{"type":17,"tag":84,"props":91826,"children":91827},{},[91828],{"type":23,"value":91829},"deprecation schedule",{"type":17,"tag":29,"props":91831,"children":91832},{},[91833],{"type":23,"value":91834},"That means every integration becomes an ongoing maintenance surface.",{"type":17,"tag":239,"props":91836,"children":91838},{"id":91837},"what-drives-maintenance-costs",[91839],{"type":23,"value":91840},"What drives maintenance costs",{"type":17,"tag":80,"props":91842,"children":91843},{},[91844,91849,91854,91859,91864,91869,91874],{"type":17,"tag":84,"props":91845,"children":91846},{},[91847],{"type":23,"value":91848},"Providers add or remove fields",{"type":17,"tag":84,"props":91850,"children":91851},{},[91852],{"type":23,"value":91853},"APIs version or deprecate endpoints",{"type":17,"tag":84,"props":91855,"children":91856},{},[91857],{"type":23,"value":91858},"OAuth scopes change",{"type":17,"tag":84,"props":91860,"children":91861},{},[91862],{"type":23,"value":91863},"refresh tokens fail or rotate",{"type":17,"tag":84,"props":91865,"children":91866},{},[91867],{"type":23,"value":91868},"webhook payloads change",{"type":17,"tag":84,"props":91870,"children":91871},{},[91872],{"type":23,"value":91873},"undocumented edge cases surface in production",{"type":17,"tag":84,"props":91875,"children":91876},{},[91877],{"type":23,"value":91878},"one large customer exposes scale issues the sandbox never showed",{"type":17,"tag":239,"props":91880,"children":91882},{"id":91881},"why-this-gets-expensive-fast",[91883],{"type":23,"value":91884},"Why this gets expensive fast",{"type":17,"tag":29,"props":91886,"children":91887},{},[91888],{"type":23,"value":91889},"The hidden cost is not just engineering hours. It is lost roadmap velocity.",{"type":17,"tag":29,"props":91891,"children":91892},{},[91893],{"type":23,"value":91894},"Instead of shipping product improvements, your team starts spending time on:",{"type":17,"tag":80,"props":91896,"children":91897},{},[91898,91903,91908,91913,91918],{"type":17,"tag":84,"props":91899,"children":91900},{},[91901],{"type":23,"value":91902},"connector fixes",{"type":17,"tag":84,"props":91904,"children":91905},{},[91906],{"type":23,"value":91907},"support escalations",{"type":17,"tag":84,"props":91909,"children":91910},{},[91911],{"type":23,"value":91912},"auth failures",{"type":17,"tag":84,"props":91914,"children":91915},{},[91916],{"type":23,"value":91917},"provider-specific workarounds",{"type":17,"tag":84,"props":91919,"children":91920},{},[91921],{"type":23,"value":91922},"regression testing",{"type":17,"tag":29,"props":91924,"children":91925},{},[91926],{"type":23,"value":91927},"This is one reason companies underestimate the cost of building integrations in-house.",{"type":17,"tag":68,"props":91929,"children":91931},{"id":91930},"_2-stale-data-quietly-breaks-workflows",[91932],{"type":23,"value":91933},"2. Stale data quietly breaks workflows",{"type":17,"tag":29,"props":91935,"children":91936},{},[91937],{"type":23,"value":91938},"A lot of integration architectures still depend on:",{"type":17,"tag":80,"props":91940,"children":91941},{},[91942,91946,91950,91955,91960],{"type":17,"tag":84,"props":91943,"children":91944},{},[91945],{"type":23,"value":31656},{"type":17,"tag":84,"props":91947,"children":91948},{},[91949],{"type":23,"value":79101},{"type":17,"tag":84,"props":91951,"children":91952},{},[91953],{"type":23,"value":91954},"warehouse replication",{"type":17,"tag":84,"props":91956,"children":91957},{},[91958],{"type":23,"value":91959},"micro-batches",{"type":17,"tag":84,"props":91961,"children":91962},{},[91963],{"type":23,"value":91964},"delayed refresh jobs",{"type":17,"tag":29,"props":91966,"children":91967},{},[91968],{"type":23,"value":91969},"That may be acceptable for analytics. It is much more expensive in customer-facing product workflows.",{"type":17,"tag":239,"props":91971,"children":91973},{"id":91972},"the-hidden-cost-of-stale-integration-data",[91974],{"type":23,"value":91975},"The hidden cost of stale integration data",{"type":17,"tag":29,"props":91977,"children":91978},{},[91979],{"type":23,"value":91980},"When data is delayed, the problem is not just technical. It becomes operational.",{"type":17,"tag":29,"props":91982,"children":91983},{},[91984],{"type":23,"value":377},{"type":17,"tag":80,"props":91986,"children":91987},{},[91988,91993,91998,92003,92008],{"type":17,"tag":84,"props":91989,"children":91990},{},[91991],{"type":23,"value":91992},"a rep sees the wrong account state",{"type":17,"tag":84,"props":91994,"children":91995},{},[91996],{"type":23,"value":91997},"a support tool acts on an outdated ticket",{"type":17,"tag":84,"props":91999,"children":92000},{},[92001],{"type":23,"value":92002},"a recruiting workflow misses a status change",{"type":17,"tag":84,"props":92004,"children":92005},{},[92006],{"type":23,"value":92007},"an onboarding workflow fires off the wrong action",{"type":17,"tag":84,"props":92009,"children":92010},{},[92011],{"type":23,"value":92012},"an AI copilot gives an answer based on old records",{"type":17,"tag":29,"props":92014,"children":92015},{},[92016],{"type":23,"value":92017},"Once users stop trusting integration data, they start using spreadsheets, manual checks, and workaround processes.",{"type":17,"tag":29,"props":92019,"children":92020},{},[92021],{"type":23,"value":92022},"That destroys the value of the integration.",{"type":17,"tag":239,"props":92024,"children":92026},{"id":92025},"why-this-matters-more-in-2026",[92027],{"type":23,"value":92028},"Why this matters more in 2026",{"type":17,"tag":29,"props":92030,"children":92031},{},[92032],{"type":23,"value":92033},"AI agents, copilots, and product automation need live data much more than legacy dashboards do.",{"type":17,"tag":29,"props":92035,"children":92036},{},[92037],{"type":23,"value":92038},"If your integration layer is hours behind, your product is effectively making decisions on stale context.",{"type":17,"tag":68,"props":92040,"children":92042},{"id":92041},"_3-security-and-compliance-reviews-get-much-harder-when-data-is-copied",[92043],{"type":23,"value":92044},"3. Security and compliance reviews get much harder when data is copied",{"type":17,"tag":29,"props":92046,"children":92047},{},[92048],{"type":23,"value":92049},"This is one of the biggest hidden costs in SaaS integrations.",{"type":17,"tag":29,"props":92051,"children":92052},{},[92053],{"type":23,"value":92054},"The moment your architecture starts syncing and storing customer data in another platform, your security and compliance burden expands.",{"type":17,"tag":239,"props":92056,"children":92058},{"id":92057},"what-gets-harder-when-data-is-stored",[92059],{"type":23,"value":92060},"What gets harder when data is stored",{"type":17,"tag":80,"props":92062,"children":92063},{},[92064,92069,92074,92079,92084,92089,92094,92099,92104,92108],{"type":17,"tag":84,"props":92065,"children":92066},{},[92067],{"type":23,"value":92068},"GDPR review",{"type":17,"tag":84,"props":92070,"children":92071},{},[92072],{"type":23,"value":92073},"HIPAA review",{"type":17,"tag":84,"props":92075,"children":92076},{},[92077],{"type":23,"value":92078},"CCPA review",{"type":17,"tag":84,"props":92080,"children":92081},{},[92082],{"type":23,"value":92083},"SOC 2 review",{"type":17,"tag":84,"props":92085,"children":92086},{},[92087],{"type":23,"value":92088},"data residency analysis",{"type":17,"tag":84,"props":92090,"children":92091},{},[92092],{"type":23,"value":92093},"deletion handling",{"type":17,"tag":84,"props":92095,"children":92096},{},[92097],{"type":23,"value":92098},"sub-processor review",{"type":17,"tag":84,"props":92100,"children":92101},{},[92102],{"type":23,"value":92103},"retention policy review",{"type":17,"tag":84,"props":92105,"children":92106},{},[92107],{"type":23,"value":10275},{"type":17,"tag":84,"props":92109,"children":92110},{},[92111],{"type":23,"value":92112},"customer security questionnaires",{"type":17,"tag":29,"props":92114,"children":92115},{},[92116],{"type":23,"value":92117},"Instead of just evaluating whether the integration works, your team now has to explain:",{"type":17,"tag":80,"props":92119,"children":92120},{},[92121,92126,92131,92136,92141,92146],{"type":17,"tag":84,"props":92122,"children":92123},{},[92124],{"type":23,"value":92125},"where customer data lives",{"type":17,"tag":84,"props":92127,"children":92128},{},[92129],{"type":23,"value":92130},"how long it is stored",{"type":17,"tag":84,"props":92132,"children":92133},{},[92134],{"type":23,"value":92135},"how it is deleted",{"type":17,"tag":84,"props":92137,"children":92138},{},[92139],{"type":23,"value":92140},"whether it crosses regions",{"type":17,"tag":84,"props":92142,"children":92143},{},[92144],{"type":23,"value":92145},"whether it appears in logs or backups",{"type":17,"tag":84,"props":92147,"children":92148},{},[92149],{"type":23,"value":92150},"who can access it",{"type":17,"tag":239,"props":92152,"children":92154},{"id":92153},"why-architecture-matters-here",[92155],{"type":23,"value":92156},"Why architecture matters here",{"type":17,"tag":29,"props":92158,"children":92159},{},[92160],{"type":23,"value":92161},"This is where real-time, zero-storage integration infrastructure changes the conversation.",{"type":17,"tag":29,"props":92163,"children":92164},{},[92165],{"type":23,"value":92166},"At Unified.to, we use a pass-through architecture by default. Customer records are not copied into a Unified-owned cache or warehouse. That reduces data-at-rest exposure and simplifies security reviews compared with sync-and-store integration architectures.",{"type":17,"tag":29,"props":92168,"children":92169},{},[92170],{"type":23,"value":92171},"That does not remove your compliance obligations, but it can remove a lot of unnecessary integration-related scope.",{"type":17,"tag":68,"props":92173,"children":92175},{"id":92174},"_4-poor-observability-turns-small-issues-into-expensive-support-tickets",[92176],{"type":23,"value":92177},"4. Poor observability turns small issues into expensive support tickets",{"type":17,"tag":29,"props":92179,"children":92180},{},[92181],{"type":23,"value":92182},"Many integration issues are not total outages. They are partial failures.",{"type":17,"tag":29,"props":92184,"children":92185},{},[92186],{"type":23,"value":377},{"type":17,"tag":80,"props":92188,"children":92189},{},[92190,92195,92200,92205,92210,92215],{"type":17,"tag":84,"props":92191,"children":92192},{},[92193],{"type":23,"value":92194},"one connection becomes unhealthy",{"type":17,"tag":84,"props":92196,"children":92197},{},[92198],{"type":23,"value":92199},"a webhook retries for a single customer",{"type":17,"tag":84,"props":92201,"children":92202},{},[92203],{"type":23,"value":92204},"one provider rejects a field",{"type":17,"tag":84,"props":92206,"children":92207},{},[92208],{"type":23,"value":92209},"one endpoint hits a rate limit",{"type":17,"tag":84,"props":92211,"children":92212},{},[92213],{"type":23,"value":92214},"one action is unsupported for one integration",{"type":17,"tag":84,"props":92216,"children":92217},{},[92218],{"type":23,"value":92219},"one OAuth connection loses permission",{"type":17,"tag":29,"props":92221,"children":92222},{},[92223],{"type":23,"value":92224},"Without strong observability, these issues become expensive because every team gets pulled in.",{"type":17,"tag":239,"props":92226,"children":92228},{"id":92227},"hidden-support-costs-caused-by-weak-observability",[92229],{"type":23,"value":92230},"Hidden support costs caused by weak observability",{"type":17,"tag":80,"props":92232,"children":92233},{},[92234,92239,92244,92249,92254,92259],{"type":17,"tag":84,"props":92235,"children":92236},{},[92237],{"type":23,"value":92238},"Support cannot explain the issue",{"type":17,"tag":84,"props":92240,"children":92241},{},[92242],{"type":23,"value":92243},"Customer success cannot answer the customer confidently",{"type":17,"tag":84,"props":92245,"children":92246},{},[92247],{"type":23,"value":92248},"Engineering has to investigate manually",{"type":17,"tag":84,"props":92250,"children":92251},{},[92252],{"type":23,"value":92253},"Product gets dragged into incident handling",{"type":17,"tag":84,"props":92255,"children":92256},{},[92257],{"type":23,"value":92258},"Resolution time increases",{"type":17,"tag":84,"props":92260,"children":92261},{},[92262],{"type":23,"value":92263},"Customer trust drops",{"type":17,"tag":239,"props":92265,"children":92267},{"id":92266},"what-good-integration-observability-should-include",[92268],{"type":23,"value":92269},"What good integration observability should include",{"type":17,"tag":80,"props":92271,"children":92272},{},[92273,92278,92283,92288,92293,92298,92303],{"type":17,"tag":84,"props":92274,"children":92275},{},[92276],{"type":23,"value":92277},"API call logs",{"type":17,"tag":84,"props":92279,"children":92280},{},[92281],{"type":23,"value":92282},"webhook delivery logs",{"type":17,"tag":84,"props":92284,"children":92285},{},[92286],{"type":23,"value":92287},"connection health states",{"type":17,"tag":84,"props":92289,"children":92290},{},[92291],{"type":23,"value":92292},"error details",{"type":17,"tag":84,"props":92294,"children":92295},{},[92296],{"type":23,"value":92297},"integration feature support visibility",{"type":17,"tag":84,"props":92299,"children":92300},{},[92301],{"type":23,"value":92302},"event notifications",{"type":17,"tag":84,"props":92304,"children":92305},{},[92306],{"type":23,"value":92307},"filtering by connection ID, webhook ID, and integration",{"type":17,"tag":29,"props":92309,"children":92310},{},[92311],{"type":23,"value":92312},"Without that, even small failures become expensive to diagnose.",{"type":17,"tag":68,"props":92314,"children":92316},{"id":92315},"_5-tool-sprawl-and-overlapping-integration-platforms-create-waste",[92317],{"type":23,"value":92318},"5. Tool sprawl and overlapping integration platforms create waste",{"type":17,"tag":29,"props":92320,"children":92321},{},[92322],{"type":23,"value":92323},"This happens more often than teams expect.",{"type":17,"tag":29,"props":92325,"children":92326},{},[92327],{"type":23,"value":92328},"One team buys an embedded iPaaS. Another team builds custom integrations. Another team uses ETL pipelines. Another adopts a unified API vendor. Another adds workflow automation tooling.",{"type":17,"tag":29,"props":92330,"children":92331},{},[92332],{"type":23,"value":92333},"Individually, each decision can sound reasonable.",{"type":17,"tag":29,"props":92335,"children":92336},{},[92337],{"type":23,"value":92338},"Together, they create integration sprawl.",{"type":17,"tag":239,"props":92340,"children":92342},{"id":92341},"the-hidden-cost-of-integration-sprawl",[92343],{"type":23,"value":92344},"The hidden cost of integration sprawl",{"type":17,"tag":80,"props":92346,"children":92347},{},[92348,92353,92358,92363,92368,92373,92378,92383],{"type":17,"tag":84,"props":92349,"children":92350},{},[92351],{"type":23,"value":92352},"duplicate vendor spend",{"type":17,"tag":84,"props":92354,"children":92355},{},[92356],{"type":23,"value":92357},"duplicated auth patterns",{"type":17,"tag":84,"props":92359,"children":92360},{},[92361],{"type":23,"value":92362},"multiple logging surfaces",{"type":17,"tag":84,"props":92364,"children":92365},{},[92366],{"type":23,"value":92367},"fragmented support workflows",{"type":17,"tag":84,"props":92369,"children":92370},{},[92371],{"type":23,"value":92372},"inconsistent data models",{"type":17,"tag":84,"props":92374,"children":92375},{},[92376],{"type":23,"value":92377},"conflicting ownership across teams",{"type":17,"tag":84,"props":92379,"children":92380},{},[92381],{"type":23,"value":92382},"repeated security reviews",{"type":17,"tag":84,"props":92384,"children":92385},{},[92386],{"type":23,"value":92387},"higher onboarding complexity for internal teams",{"type":17,"tag":29,"props":92389,"children":92390},{},[92391],{"type":23,"value":92392},"This is not just a procurement problem. It is an architecture problem.",{"type":17,"tag":29,"props":92394,"children":92395},{},[92396],{"type":23,"value":92397},"The more integration patterns you stack on top of each other, the more expensive your product becomes to operate.",{"type":17,"tag":68,"props":92399,"children":92401},{"id":92400},"_6-pricing-models-often-get-worse-as-adoption-grows",[92402],{"type":23,"value":92403},"6. Pricing models often get worse as adoption grows",{"type":17,"tag":29,"props":92405,"children":92406},{},[92407],{"type":23,"value":92408},"A platform can look affordable at low volume and become painful once customers actually use it.",{"type":17,"tag":29,"props":92410,"children":92411},{},[92412],{"type":23,"value":92413},"Different vendors charge by:",{"type":17,"tag":80,"props":92415,"children":92416},{},[92417,92422,92427,92431,92436,92441,92446,92451,92456,92461],{"type":17,"tag":84,"props":92418,"children":92419},{},[92420],{"type":23,"value":92421},"linked account",{"type":17,"tag":84,"props":92423,"children":92424},{},[92425],{"type":23,"value":92426},"connection",{"type":17,"tag":84,"props":92428,"children":92429},{},[92430],{"type":23,"value":62676},{"type":17,"tag":84,"props":92432,"children":92433},{},[92434],{"type":23,"value":92435},"workflow run",{"type":17,"tag":84,"props":92437,"children":92438},{},[92439],{"type":23,"value":92440},"sync volume",{"type":17,"tag":84,"props":92442,"children":92443},{},[92444],{"type":23,"value":92445},"connector",{"type":17,"tag":84,"props":92447,"children":92448},{},[92449],{"type":23,"value":92450},"compute",{"type":17,"tag":84,"props":92452,"children":92453},{},[92454],{"type":23,"value":92455},"storage",{"type":17,"tag":84,"props":92457,"children":92458},{},[92459],{"type":23,"value":92460},"environments",{"type":17,"tag":84,"props":92462,"children":92463},{},[92464],{"type":23,"value":92465},"feature tiers",{"type":17,"tag":29,"props":92467,"children":92468},{},[92469],{"type":23,"value":92470},"The hidden cost appears when pricing does not align with the value your product gets from integrations.",{"type":17,"tag":239,"props":92472,"children":92474},{"id":92473},"common-pricing-problems",[92475],{"type":23,"value":92476},"Common pricing problems",{"type":17,"tag":80,"props":92478,"children":92479},{},[92480,92485,92490,92495,92500,92505],{"type":17,"tag":84,"props":92481,"children":92482},{},[92483],{"type":23,"value":92484},"each new customer increases cost faster than revenue",{"type":17,"tag":84,"props":92486,"children":92487},{},[92488],{"type":23,"value":92489},"turning on more integrations hurts margin",{"type":17,"tag":84,"props":92491,"children":92492},{},[92493],{"type":23,"value":92494},"enabling more frequent syncs increases cost",{"type":17,"tag":84,"props":92496,"children":92497},{},[92498],{"type":23,"value":92499},"observability, custom fields, or passthrough require upgrades",{"type":17,"tag":84,"props":92501,"children":92502},{},[92503],{"type":23,"value":92504},"write access is gated behind expensive plans",{"type":17,"tag":84,"props":92506,"children":92507},{},[92508],{"type":23,"value":92509},"AI use cases multiply request volume in ways pricing was not designed for",{"type":17,"tag":239,"props":92511,"children":92513},{"id":92512},"why-this-matters-strategically",[92514],{"type":23,"value":92515},"Why this matters strategically",{"type":17,"tag":29,"props":92517,"children":92518},{},[92519],{"type":23,"value":92520},"If your integration cost model punishes product adoption, your team starts making bad decisions:",{"type":17,"tag":80,"props":92522,"children":92523},{},[92524,92529,92534,92539,92544],{"type":17,"tag":84,"props":92525,"children":92526},{},[92527],{"type":23,"value":92528},"limiting integrations",{"type":17,"tag":84,"props":92530,"children":92531},{},[92532],{"type":23,"value":92533},"restricting features",{"type":17,"tag":84,"props":92535,"children":92536},{},[92537],{"type":23,"value":92538},"delaying rollout",{"type":17,"tag":84,"props":92540,"children":92541},{},[92542],{"type":23,"value":92543},"avoiding real-time use cases",{"type":17,"tag":84,"props":92545,"children":92546},{},[92547],{"type":23,"value":92548},"saying no to customer requests for margin reasons",{"type":17,"tag":29,"props":92550,"children":92551},{},[92552],{"type":23,"value":92553},"That is a hidden cost because it constrains product strategy, not just budget.",{"type":17,"tag":68,"props":92555,"children":92557},{"id":92556},"_7-ai-features-expose-weak-integration-architecture-faster-than-anything-else",[92558],{"type":23,"value":92559},"7. AI features expose weak integration architecture faster than anything else",{"type":17,"tag":29,"props":92561,"children":92562},{},[92563],{"type":23,"value":92564},"A lot of integration stacks were built for:",{"type":17,"tag":80,"props":92566,"children":92567},{},[92568,92572,92577,92582],{"type":17,"tag":84,"props":92569,"children":92570},{},[92571],{"type":23,"value":84779},{"type":17,"tag":84,"props":92573,"children":92574},{},[92575],{"type":23,"value":92576},"batch sync",{"type":17,"tag":84,"props":92578,"children":92579},{},[92580],{"type":23,"value":92581},"BI reporting",{"type":17,"tag":84,"props":92583,"children":92584},{},[92585],{"type":23,"value":92586},"back-office workflows",{"type":17,"tag":29,"props":92588,"children":92589},{},[92590],{"type":23,"value":92591},"They were not built for:",{"type":17,"tag":80,"props":92593,"children":92594},{},[92595,92599,92603,92608,92613,92618],{"type":17,"tag":84,"props":92596,"children":92597},{},[92598],{"type":23,"value":17197},{"type":17,"tag":84,"props":92600,"children":92601},{},[92602],{"type":23,"value":10376},{"type":17,"tag":84,"props":92604,"children":92605},{},[92606],{"type":23,"value":92607},"retrieval workflows",{"type":17,"tag":84,"props":92609,"children":92610},{},[92611],{"type":23,"value":92612},"live tool calling",{"type":17,"tag":84,"props":92614,"children":92615},{},[92616],{"type":23,"value":92617},"bi-directional LLM actions",{"type":17,"tag":84,"props":92619,"children":92620},{},[92621],{"type":23,"value":92622},"customer-facing AI features",{"type":17,"tag":239,"props":92624,"children":92626},{"id":92625},"why-ai-makes-integration-weaknesses-obvious",[92627],{"type":23,"value":92628},"Why AI makes integration weaknesses obvious",{"type":17,"tag":29,"props":92630,"children":92631},{},[92632],{"type":23,"value":92633},"AI systems need:",{"type":17,"tag":80,"props":92635,"children":92636},{},[92637,92642,92647,92652,92657,92662],{"type":17,"tag":84,"props":92638,"children":92639},{},[92640],{"type":23,"value":92641},"current data",{"type":17,"tag":84,"props":92643,"children":92644},{},[92645],{"type":23,"value":92646},"clear schemas",{"type":17,"tag":84,"props":92648,"children":92649},{},[92650],{"type":23,"value":92651},"safe authorization boundaries",{"type":17,"tag":84,"props":92653,"children":92654},{},[92655],{"type":23,"value":92656},"strong observability",{"type":17,"tag":84,"props":92658,"children":92659},{},[92660],{"type":23,"value":92661},"predictable tool behavior",{"type":17,"tag":84,"props":92663,"children":92664},{},[92665],{"type":23,"value":92666},"low-friction read and write paths",{"type":17,"tag":29,"props":92668,"children":92669},{},[92670],{"type":23,"value":92671},"If your integration stack depends on stale syncs, shallow models, or inconsistent permissions, the AI layer inherits all of that weakness.",{"type":17,"tag":239,"props":92673,"children":92675},{"id":92674},"the-hidden-ai-cost",[92676],{"type":23,"value":92677},"The hidden AI cost",{"type":17,"tag":80,"props":92679,"children":92680},{},[92681,92686,92691,92696,92701,92706],{"type":17,"tag":84,"props":92682,"children":92683},{},[92684],{"type":23,"value":92685},"agents act on outdated records",{"type":17,"tag":84,"props":92687,"children":92688},{},[92689],{"type":23,"value":92690},"prompt quality degrades because schemas are inconsistent",{"type":17,"tag":84,"props":92692,"children":92693},{},[92694],{"type":23,"value":92695},"tool lists get bloated with poor abstractions",{"type":17,"tag":84,"props":92697,"children":92698},{},[92699],{"type":23,"value":92700},"permissions become hard to enforce cleanly",{"type":17,"tag":84,"props":92702,"children":92703},{},[92704],{"type":23,"value":92705},"support teams cannot audit what happened",{"type":17,"tag":84,"props":92707,"children":92708},{},[92709],{"type":23,"value":92710},"reliability drops exactly where users expect the most intelligence",{"type":17,"tag":29,"props":92712,"children":92713},{},[92714],{"type":23,"value":92715},"This is why AI readiness is now a core integration architecture decision, not a future concern.",{"type":17,"tag":68,"props":92717,"children":92719},{"id":92718},"how-to-reduce-the-hidden-cost-of-saas-integrations",[92720],{"type":23,"value":92721},"How to reduce the hidden cost of SaaS integrations",{"type":17,"tag":29,"props":92723,"children":92724},{},[92725],{"type":23,"value":92726},"If you want to lower long-term integration costs, optimize for architecture, not just connector count.",{"type":17,"tag":239,"props":92728,"children":92730},{"id":92729},"what-to-look-for-in-an-integration-platform",[92731],{"type":23,"value":92732},"What to look for in an integration platform",{"type":17,"tag":80,"props":92734,"children":92735},{},[92736,92741,92746,92751,92756,92761,92766,92771,92776],{"type":17,"tag":84,"props":92737,"children":92738},{},[92739],{"type":23,"value":92740},"Real-time data access, not just scheduled syncs",{"type":17,"tag":84,"props":92742,"children":92743},{},[92744],{"type":23,"value":92745},"Deep normalized models, not shallow wrappers",{"type":17,"tag":84,"props":92747,"children":92748},{},[92749],{"type":23,"value":92750},"Native and virtual webhooks",{"type":17,"tag":84,"props":92752,"children":92753},{},[92754],{"type":23,"value":92755},"Strong observability and health tracking",{"type":17,"tag":84,"props":92757,"children":92758},{},[92759],{"type":23,"value":92760},"Explicit authorization boundaries",{"type":17,"tag":84,"props":92762,"children":92763},{},[92764],{"type":23,"value":92765},"Minimal or zero storage of customer data by default",{"type":17,"tag":84,"props":92767,"children":92768},{},[92769],{"type":23,"value":92770},"Flexible passthrough for provider-specific cases",{"type":17,"tag":84,"props":92772,"children":92773},{},[92774],{"type":23,"value":92775},"Pricing that scales predictably",{"type":17,"tag":84,"props":92777,"children":92778},{},[92779],{"type":23,"value":92780},"Infrastructure that can support AI agents and live product workflows",{"type":17,"tag":239,"props":92782,"children":92784},{"id":92783},"why-this-is-the-direction-we-believe-in",[92785],{"type":23,"value":92786},"Why this is the direction we believe in",{"type":17,"tag":29,"props":92788,"children":92789},{},[92790],{"type":23,"value":92791},"At Unified.to, we built our platform around real-time pass-through architecture, zero customer data storage by default, deep unified data models, native and virtual webhooks, and connection-scoped authorization.",{"type":17,"tag":29,"props":92793,"children":92794},{},[92795],{"type":23,"value":92796},"That matters because it removes several hidden costs at the root:",{"type":17,"tag":80,"props":92798,"children":92799},{},[92800,92805,92810,92815,92820],{"type":17,"tag":84,"props":92801,"children":92802},{},[92803],{"type":23,"value":92804},"less stale data risk",{"type":17,"tag":84,"props":92806,"children":92807},{},[92808],{"type":23,"value":92809},"less compliance overhead from copied records",{"type":17,"tag":84,"props":92811,"children":92812},{},[92813],{"type":23,"value":92814},"less sync infrastructure to manage",{"type":17,"tag":84,"props":92816,"children":92817},{},[92818],{"type":23,"value":92819},"better fit for AI and live SaaS workflows",{"type":17,"tag":84,"props":92821,"children":92822},{},[92823],{"type":23,"value":92824},"faster launch paths across hundreds of integrations",{"type":17,"tag":68,"props":92826,"children":92827},{"id":1552},[92828],{"type":23,"value":1555},{"type":17,"tag":29,"props":92830,"children":92831},{},[92832],{"type":23,"value":92833},"The biggest cost of SaaS integrations is usually not the one on the pricing page.",{"type":17,"tag":29,"props":92835,"children":92836},{},[92837],{"type":23,"value":92838},"It is the accumulated cost of:",{"type":17,"tag":80,"props":92840,"children":92841},{},[92842,92847,92851,92855,92859,92864,92869,92874],{"type":17,"tag":84,"props":92843,"children":92844},{},[92845],{"type":23,"value":92846},"maintenance",{"type":17,"tag":84,"props":92848,"children":92849},{},[92850],{"type":23,"value":80275},{"type":17,"tag":84,"props":92852,"children":92853},{},[92854],{"type":23,"value":9406},{"type":17,"tag":84,"props":92856,"children":92857},{},[92858],{"type":23,"value":78384},{"type":17,"tag":84,"props":92860,"children":92861},{},[92862],{"type":23,"value":92863},"weak observability",{"type":17,"tag":84,"props":92865,"children":92866},{},[92867],{"type":23,"value":92868},"fragmented tooling",{"type":17,"tag":84,"props":92870,"children":92871},{},[92872],{"type":23,"value":92873},"pricing misalignment",{"type":17,"tag":84,"props":92875,"children":92876},{},[92877],{"type":23,"value":92878},"AI unreadiness",{"type":17,"tag":29,"props":92880,"children":92881},{},[92882],{"type":23,"value":92883},"If you are evaluating SaaS integration architecture in 2026, compare more than connector counts and launch speed.",{"type":17,"tag":29,"props":92885,"children":92886},{},[92887],{"type":23,"value":92888},"Look at the long-term operating cost of the architecture underneath.",{"type":17,"tag":29,"props":92890,"children":92891},{},[92892],{"type":23,"value":92893},"That is where the real difference shows up.",{"type":17,"tag":29,"props":92895,"children":92896},{},[92897],{"type":17,"tag":133,"props":92898,"children":92900},{"href":1612,"rel":92899},[214],[92901],{"type":23,"value":44481},{"type":17,"tag":29,"props":92903,"children":92904},{},[92905],{"type":17,"tag":133,"props":92906,"children":92908},{"href":1623,"rel":92907},[214],[92909],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":92911},[92912,92913,92917,92921,92925,92929,92932,92936,92940,92944],{"id":91681,"depth":1629,"text":91684},{"id":91777,"depth":1629,"text":91780,"children":92914},[92915,92916],{"id":91837,"depth":1635,"text":91840},{"id":91881,"depth":1635,"text":91884},{"id":91930,"depth":1629,"text":91933,"children":92918},[92919,92920],{"id":91972,"depth":1635,"text":91975},{"id":92025,"depth":1635,"text":92028},{"id":92041,"depth":1629,"text":92044,"children":92922},[92923,92924],{"id":92057,"depth":1635,"text":92060},{"id":92153,"depth":1635,"text":92156},{"id":92174,"depth":1629,"text":92177,"children":92926},[92927,92928],{"id":92227,"depth":1635,"text":92230},{"id":92266,"depth":1635,"text":92269},{"id":92315,"depth":1629,"text":92318,"children":92930},[92931],{"id":92341,"depth":1635,"text":92344},{"id":92400,"depth":1629,"text":92403,"children":92933},[92934,92935],{"id":92473,"depth":1635,"text":92476},{"id":92512,"depth":1635,"text":92515},{"id":92556,"depth":1629,"text":92559,"children":92937},[92938,92939],{"id":92625,"depth":1635,"text":92628},{"id":92674,"depth":1635,"text":92677},{"id":92718,"depth":1629,"text":92721,"children":92941},[92942,92943],{"id":92729,"depth":1635,"text":92732},{"id":92783,"depth":1635,"text":92786},{"id":1552,"depth":1629,"text":1555},"content:blog:top_7_hidden_costs_of_saas_integrations_no_one_talks_about.md","blog/top_7_hidden_costs_of_saas_integrations_no_one_talks_about.md","blog/top_7_hidden_costs_of_saas_integrations_no_one_talks_about",{"_path":92949,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":92950,"description":92951,"img":92952,"date":92953,"tag":12,"body":92954,"_type":1677,"_id":93587,"_source":1679,"_file":93588,"_stem":93589,"_extension":1682},"/blog/how_to_build_saas_integrations_that_comply_with_eu_data_residency_requirements_gdpr","How to Build SaaS Integrations That Comply with EU Data Residency Requirements (GDPR)","EU data residency is not just a legal constraint—it's an architectural constraint.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_saas_integrations_that_comply_with_eu_data_residency_requirements_gdpr-icon.png","2026-03-09T19:31:00.000Z",{"type":14,"children":92955,"toc":93569},[92956,92961,92964,92971,92975,92980,92985,92991,92996,93001,93019,93024,93029,93056,93061,93067,93072,93090,93095,93099,93104,93109,93126,93131,93137,93142,93147,93153,93158,93163,93186,93191,93197,93202,93207,93212,93217,93222,93227,93233,93238,93261,93267,93272,93295,93299,93304,93322,93328,93333,93343,93348,93366,93371,93376,93382,93387,93404,93409,93414,93442,93447,93453,93458,93476,93481,93509,93514,93518,93523,93527,93543,93548,93553,93561],{"type":17,"tag":18,"props":92957,"children":92959},{"id":92958},"how-to-build-saas-integrations-that-comply-with-eu-data-residency-requirements-gdpr",[92960],{"type":23,"value":92950},{"type":17,"tag":25,"props":92962,"children":92963},{},[],{"type":17,"tag":29,"props":92965,"children":92966},{},[92967],{"type":17,"tag":33,"props":92968,"children":92969},{},[92970],{"type":23,"value":37},{"type":17,"tag":29,"props":92972,"children":92973},{},[92974],{"type":23,"value":92951},{"type":17,"tag":29,"props":92976,"children":92977},{},[92978],{"type":23,"value":92979},"If your product processes personal data from users in the European Union, GDPR requires you to control how that data is stored, transferred, and accessed across systems. For integration-heavy SaaS products, this becomes a design problem.",{"type":17,"tag":29,"props":92981,"children":92982},{},[92983],{"type":23,"value":92984},"Every integration introduces another system that may process EU data. The question is not just where your data lives, but where it flows.",{"type":17,"tag":68,"props":92986,"children":92988},{"id":92987},"what-gdpr-requires-from-integration-architecture",[92989],{"type":23,"value":92990},"What GDPR requires from integration architecture",{"type":17,"tag":29,"props":92992,"children":92993},{},[92994],{"type":23,"value":92995},"GDPR does not require all EU data to remain inside the European Union. It regulates how data is transferred across borders.",{"type":17,"tag":29,"props":92997,"children":92998},{},[92999],{"type":23,"value":93000},"Personal data can leave the EU only if:",{"type":17,"tag":80,"props":93002,"children":93003},{},[93004,93009,93014],{"type":17,"tag":84,"props":93005,"children":93006},{},[93007],{"type":23,"value":93008},"the destination country has an adequacy decision",{"type":17,"tag":84,"props":93010,"children":93011},{},[93012],{"type":23,"value":93013},"transfers are protected by Standard Contractual Clauses (SCCs) or Binding Corporate Rules (BCRs)",{"type":17,"tag":84,"props":93015,"children":93016},{},[93017],{"type":23,"value":93018},"a limited derogation applies (such as explicit consent)",{"type":17,"tag":29,"props":93020,"children":93021},{},[93022],{"type":23,"value":93023},"In practice, many SaaS companies still prefer to keep EU data within EU infrastructure. This avoids transfer complexity and simplifies audits.",{"type":17,"tag":29,"props":93025,"children":93026},{},[93027],{"type":23,"value":93028},"For integrations, this creates several requirements:",{"type":17,"tag":80,"props":93030,"children":93031},{},[93032,93037,93042,93046,93051],{"type":17,"tag":84,"props":93033,"children":93034},{},[93035],{"type":23,"value":93036},"clear visibility into where data is processed",{"type":17,"tag":84,"props":93038,"children":93039},{},[93040],{"type":23,"value":93041},"control over cross-region data flows",{"type":17,"tag":84,"props":93043,"children":93044},{},[93045],{"type":23,"value":64684},{"type":17,"tag":84,"props":93047,"children":93048},{},[93049],{"type":23,"value":93050},"support for data subject rights (access, deletion, portability)",{"type":17,"tag":84,"props":93052,"children":93053},{},[93054],{"type":23,"value":93055},"auditability across systems",{"type":17,"tag":29,"props":93057,"children":93058},{},[93059],{"type":23,"value":93060},"These requirements are difficult to enforce if data is copied across multiple systems.",{"type":17,"tag":68,"props":93062,"children":93064},{"id":93063},"why-traditional-integration-architectures-create-gdpr-risk",[93065],{"type":23,"value":93066},"Why traditional integration architectures create GDPR risk",{"type":17,"tag":29,"props":93068,"children":93069},{},[93070],{"type":23,"value":93071},"Many integration platforms rely on copying data into intermediate systems:",{"type":17,"tag":80,"props":93073,"children":93074},{},[93075,93080,93085],{"type":17,"tag":84,"props":93076,"children":93077},{},[93078],{"type":23,"value":93079},"ETL pipelines feeding warehouses",{"type":17,"tag":84,"props":93081,"children":93082},{},[93083],{"type":23,"value":93084},"iPaaS platforms storing normalized datasets",{"type":17,"tag":84,"props":93086,"children":93087},{},[93088],{"type":23,"value":93089},"unified APIs backed by internal databases",{"type":17,"tag":29,"props":93091,"children":93092},{},[93093],{"type":23,"value":93094},"This introduces three major problems.",{"type":17,"tag":239,"props":93096,"children":93097},{"id":90909},[93098],{"type":23,"value":90912},{"type":17,"tag":29,"props":93100,"children":93101},{},[93102],{"type":23,"value":93103},"Once data is copied into another system, that system becomes an additional processor.",{"type":17,"tag":29,"props":93105,"children":93106},{},[93107],{"type":23,"value":93108},"This expands compliance scope. You now need to secure and audit:",{"type":17,"tag":80,"props":93110,"children":93111},{},[93112,93117,93121],{"type":17,"tag":84,"props":93113,"children":93114},{},[93115],{"type":23,"value":93116},"the source system",{"type":17,"tag":84,"props":93118,"children":93119},{},[93120],{"type":23,"value":64007},{"type":17,"tag":84,"props":93122,"children":93123},{},[93124],{"type":23,"value":93125},"downstream storage (warehouses, analytics, backups)",{"type":17,"tag":29,"props":93127,"children":93128},{},[93129],{"type":23,"value":93130},"Each additional copy increases exposure.",{"type":17,"tag":239,"props":93132,"children":93134},{"id":93133},"cross-region-data-movement",[93135],{"type":23,"value":93136},"Cross-region data movement",{"type":17,"tag":29,"props":93138,"children":93139},{},[93140],{"type":23,"value":93141},"Global infrastructure often routes or stores data outside the EU.",{"type":17,"tag":29,"props":93143,"children":93144},{},[93145],{"type":23,"value":93146},"If EU data is replicated into non-EU regions, organizations must implement SCCs or similar safeguards. This adds operational overhead and legal complexity.",{"type":17,"tag":239,"props":93148,"children":93150},{"id":93149},"deletion-and-lifecycle-management",[93151],{"type":23,"value":93152},"Deletion and lifecycle management",{"type":17,"tag":29,"props":93154,"children":93155},{},[93156],{"type":23,"value":93157},"GDPR requires that personal data can be deleted (Article 17).",{"type":17,"tag":29,"props":93159,"children":93160},{},[93161],{"type":23,"value":93162},"If data exists in multiple systems, deletion must propagate to:",{"type":17,"tag":80,"props":93164,"children":93165},{},[93166,93171,93176,93181],{"type":17,"tag":84,"props":93167,"children":93168},{},[93169],{"type":23,"value":93170},"primary databases",{"type":17,"tag":84,"props":93172,"children":93173},{},[93174],{"type":23,"value":93175},"integration layers",{"type":17,"tag":84,"props":93177,"children":93178},{},[93179],{"type":23,"value":93180},"caches and warehouses",{"type":17,"tag":84,"props":93182,"children":93183},{},[93184],{"type":23,"value":93185},"backups and derived datasets",{"type":17,"tag":29,"props":93187,"children":93188},{},[93189],{"type":23,"value":93190},"This is one of the most common failure points in compliance.",{"type":17,"tag":68,"props":93192,"children":93194},{"id":93193},"architecture-principles-for-gdpr-compliant-integrations",[93195],{"type":23,"value":93196},"Architecture principles for GDPR-compliant integrations",{"type":17,"tag":29,"props":93198,"children":93199},{},[93200],{"type":23,"value":93201},"To reduce risk, integration architecture should minimize persistence and control where data flows.",{"type":17,"tag":239,"props":93203,"children":93205},{"id":93204},"regional-infrastructure",[93206],{"type":23,"value":64330},{"type":17,"tag":29,"props":93208,"children":93209},{},[93210],{"type":23,"value":93211},"Deploy region-specific infrastructure and route requests accordingly.",{"type":17,"tag":29,"props":93213,"children":93214},{},[93215],{"type":23,"value":93216},"EU users → EU systems",{"type":17,"tag":29,"props":93218,"children":93219},{},[93220],{"type":23,"value":93221},"Non-EU users → appropriate regional systems",{"type":17,"tag":29,"props":93223,"children":93224},{},[93225],{"type":23,"value":93226},"This ensures data is processed in the correct jurisdiction.",{"type":17,"tag":239,"props":93228,"children":93230},{"id":93229},"encryption-and-key-management",[93231],{"type":23,"value":93232},"Encryption and key management",{"type":17,"tag":29,"props":93234,"children":93235},{},[93236],{"type":23,"value":93237},"Protect all data flows:",{"type":17,"tag":80,"props":93239,"children":93240},{},[93241,93246,93251,93256],{"type":17,"tag":84,"props":93242,"children":93243},{},[93244],{"type":23,"value":93245},"TLS for all API communication",{"type":17,"tag":84,"props":93247,"children":93248},{},[93249],{"type":23,"value":93250},"encryption for stored metadata",{"type":17,"tag":84,"props":93252,"children":93253},{},[93254],{"type":23,"value":93255},"region-specific key management where required",{"type":17,"tag":84,"props":93257,"children":93258},{},[93259],{"type":23,"value":93260},"secure secrets storage",{"type":17,"tag":239,"props":93262,"children":93264},{"id":93263},"least-privilege-authorization",[93265],{"type":23,"value":93266},"Least-privilege authorization",{"type":17,"tag":29,"props":93268,"children":93269},{},[93270],{"type":23,"value":93271},"Only access data users explicitly authorize.",{"type":17,"tag":80,"props":93273,"children":93274},{},[93275,93286,93290],{"type":17,"tag":84,"props":93276,"children":93277},{},[93278,93280,93284],{"type":23,"value":93279},"scoped ",{"type":17,"tag":133,"props":93281,"children":93282},{"href":779},[93283],{"type":23,"value":782},{"type":23,"value":93285}," permissions",{"type":17,"tag":84,"props":93287,"children":93288},{},[93289],{"type":23,"value":65793},{"type":17,"tag":84,"props":93291,"children":93292},{},[93293],{"type":23,"value":93294},"revocable access",{"type":17,"tag":239,"props":93296,"children":93297},{"id":66355},[93298],{"type":23,"value":64924},{"type":17,"tag":29,"props":93300,"children":93301},{},[93302],{"type":23,"value":93303},"Only retrieve and transmit what is required.",{"type":17,"tag":80,"props":93305,"children":93306},{},[93307,93312,93317],{"type":17,"tag":84,"props":93308,"children":93309},{},[93310],{"type":23,"value":93311},"selective field retrieval",{"type":17,"tag":84,"props":93313,"children":93314},{},[93315],{"type":23,"value":93316},"filtered webhook payloads",{"type":17,"tag":84,"props":93318,"children":93319},{},[93320],{"type":23,"value":93321},"minimal logging of personal data",{"type":17,"tag":68,"props":93323,"children":93325},{"id":93324},"the-architecture-that-simplifies-compliance",[93326],{"type":23,"value":93327},"The architecture that simplifies compliance",{"type":17,"tag":29,"props":93329,"children":93330},{},[93331],{"type":23,"value":93332},"The simplest way to reduce GDPR complexity is to avoid storing data entirely.",{"type":17,"tag":29,"props":93334,"children":93335},{},[93336,93341],{"type":17,"tag":48,"props":93337,"children":93338},{},[93339],{"type":23,"value":93340},"Real-time pass-through integrations",{"type":23,"value":93342}," retrieve data directly from the source system at request time.",{"type":17,"tag":29,"props":93344,"children":93345},{},[93346],{"type":23,"value":93347},"Instead of copying data into an intermediate platform, the integration layer acts as a proxy:",{"type":17,"tag":80,"props":93349,"children":93350},{},[93351,93356,93361],{"type":17,"tag":84,"props":93352,"children":93353},{},[93354],{"type":23,"value":93355},"no persistent storage of customer records",{"type":17,"tag":84,"props":93357,"children":93358},{},[93359],{"type":23,"value":93360},"no replication into databases or warehouses",{"type":17,"tag":84,"props":93362,"children":93363},{},[93364],{"type":23,"value":93365},"real-time reads and writes against source systems",{"type":17,"tag":29,"props":93367,"children":93368},{},[93369],{"type":23,"value":93370},"This reduces compliance scope because fewer systems handle personal data.",{"type":17,"tag":29,"props":93372,"children":93373},{},[93374],{"type":23,"value":93375},"Less stored data means fewer systems to secure, audit, and clean up.",{"type":17,"tag":68,"props":93377,"children":93379},{"id":93378},"how-unified-supports-eu-data-residency-requirements",[93380],{"type":23,"value":93381},"How Unified supports EU data residency requirements",{"type":17,"tag":29,"props":93383,"children":93384},{},[93385],{"type":23,"value":93386},"Unified is built on a real-time pass-through model.",{"type":17,"tag":80,"props":93388,"children":93389},{},[93390,93394,93399],{"type":17,"tag":84,"props":93391,"children":93392},{},[93393],{"type":23,"value":68041},{"type":17,"tag":84,"props":93395,"children":93396},{},[93397],{"type":23,"value":93398},"requests execute directly against source systems",{"type":17,"tag":84,"props":93400,"children":93401},{},[93402],{"type":23,"value":93403},"no cached datasets or replicated records",{"type":17,"tag":29,"props":93405,"children":93406},{},[93407],{"type":23,"value":93408},"This allows customer data to remain within the original provider's region.",{"type":17,"tag":29,"props":93410,"children":93411},{},[93412],{"type":23,"value":93413},"Additional controls include:",{"type":17,"tag":80,"props":93415,"children":93416},{},[93417,93422,93427,93432,93437],{"type":17,"tag":84,"props":93418,"children":93419},{},[93420],{"type":23,"value":93421},"regional infrastructure (US, EU, Australia)",{"type":17,"tag":84,"props":93423,"children":93424},{},[93425],{"type":23,"value":93426},"TLS 1.2+ for all data in transit",{"type":17,"tag":84,"props":93428,"children":93429},{},[93430],{"type":23,"value":93431},"AES-256 encryption for operational metadata",{"type":17,"tag":84,"props":93433,"children":93434},{},[93435],{"type":23,"value":93436},"optional credential storage in customer-managed vaults",{"type":17,"tag":84,"props":93438,"children":93439},{},[93440],{"type":23,"value":93441},"OAuth-based, tenant-scoped access",{"type":17,"tag":29,"props":93443,"children":93444},{},[93445],{"type":23,"value":93446},"Because data is not replicated, the number of systems handling EU data is reduced.",{"type":17,"tag":68,"props":93448,"children":93450},{"id":93449},"when-to-build-this-yourself",[93451],{"type":23,"value":93452},"When to build this yourself",{"type":17,"tag":29,"props":93454,"children":93455},{},[93456],{"type":23,"value":93457},"Some teams still build custom integration infrastructure:",{"type":17,"tag":80,"props":93459,"children":93460},{},[93461,93466,93471],{"type":17,"tag":84,"props":93462,"children":93463},{},[93464],{"type":23,"value":93465},"internal or highly specialized systems",{"type":17,"tag":84,"props":93467,"children":93468},{},[93469],{"type":23,"value":93470},"on-premise environments",{"type":17,"tag":84,"props":93472,"children":93473},{},[93474],{"type":23,"value":93475},"large-scale analytics pipelines",{"type":17,"tag":29,"props":93477,"children":93478},{},[93479],{"type":23,"value":93480},"But this requires implementing:",{"type":17,"tag":80,"props":93482,"children":93483},{},[93484,93489,93494,93499,93504],{"type":17,"tag":84,"props":93485,"children":93486},{},[93487],{"type":23,"value":93488},"region-aware routing",{"type":17,"tag":84,"props":93490,"children":93491},{},[93492],{"type":23,"value":93493},"OAuth lifecycle management",{"type":17,"tag":84,"props":93495,"children":93496},{},[93497],{"type":23,"value":93498},"webhook reliability and retries",{"type":17,"tag":84,"props":93500,"children":93501},{},[93502],{"type":23,"value":93503},"data normalization across providers",{"type":17,"tag":84,"props":93505,"children":93506},{},[93507],{"type":23,"value":93508},"compliance monitoring and documentation",{"type":17,"tag":29,"props":93510,"children":93511},{},[93512],{"type":23,"value":93513},"For most teams, this becomes a significant engineering and operational burden.",{"type":17,"tag":68,"props":93515,"children":93516},{"id":45643},[93517],{"type":23,"value":45646},{"type":17,"tag":29,"props":93519,"children":93520},{},[93521],{"type":23,"value":93522},"GDPR compliance is not just about where data is stored—it is about how data moves.",{"type":17,"tag":29,"props":93524,"children":93525},{},[93526],{"type":23,"value":65923},{"type":17,"tag":80,"props":93528,"children":93529},{},[93530,93534,93538],{"type":17,"tag":84,"props":93531,"children":93532},{},[93533],{"type":23,"value":9406},{"type":17,"tag":84,"props":93535,"children":93536},{},[93537],{"type":23,"value":68149},{"type":17,"tag":84,"props":93539,"children":93540},{},[93541],{"type":23,"value":93542},"deletion risk",{"type":17,"tag":29,"props":93544,"children":93545},{},[93546],{"type":23,"value":93547},"Architectures that minimize storage and rely on real-time access reduce the number of systems handling personal data.",{"type":17,"tag":29,"props":93549,"children":93550},{},[93551],{"type":23,"value":93552},"That makes EU data residency easier to enforce and maintain as integrations scale.",{"type":17,"tag":29,"props":93554,"children":93555},{},[93556],{"type":17,"tag":133,"props":93557,"children":93559},{"href":1612,"rel":93558},[214],[93560],{"type":23,"value":44481},{"type":17,"tag":29,"props":93562,"children":93563},{},[93564],{"type":17,"tag":133,"props":93565,"children":93567},{"href":1623,"rel":93566},[214],[93568],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":93570},[93571,93572,93577,93583,93584,93585,93586],{"id":92987,"depth":1629,"text":92990},{"id":93063,"depth":1629,"text":93066,"children":93573},[93574,93575,93576],{"id":90909,"depth":1635,"text":90912},{"id":93133,"depth":1635,"text":93136},{"id":93149,"depth":1635,"text":93152},{"id":93193,"depth":1629,"text":93196,"children":93578},[93579,93580,93581,93582],{"id":93204,"depth":1635,"text":64330},{"id":93229,"depth":1635,"text":93232},{"id":93263,"depth":1635,"text":93266},{"id":66355,"depth":1635,"text":64924},{"id":93324,"depth":1629,"text":93327},{"id":93378,"depth":1629,"text":93381},{"id":93449,"depth":1629,"text":93452},{"id":45643,"depth":1629,"text":45646},"content:blog:how_to_build_saas_integrations_that_comply_with_eu_data_residency_requirements_gdpr.md","blog/how_to_build_saas_integrations_that_comply_with_eu_data_residency_requirements_gdpr.md","blog/how_to_build_saas_integrations_that_comply_with_eu_data_residency_requirements_gdpr",{"_path":93591,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":93592,"description":93593,"img":93594,"date":93595,"tag":12,"body":93596,"_type":1677,"_id":94367,"_source":1679,"_file":94368,"_stem":94369,"_extension":1682},"/blog/how_to_build_secure_integrations_5_tips","How to Build Secure Integrations: 5 Tips","Security is one of the first things technical buyers evaluate in an integration platform, and for good reason.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_secure_integrations_5_tips-icon.png","2026-03-09T19:30:00.000Z",{"type":14,"children":93597,"toc":94348},[93598,93603,93606,93613,93617,93622,93658,93663,93668,93673,93679,93684,93688,93716,93721,93726,93732,93742,93747,93753,93758,93763,93768,93801,93806,93811,93816,93821,93827,93832,93837,93842,93870,93875,93880,93885,93890,93907,93918,93923,93929,93934,93939,93973,93978,94011,94016,94021,94026,94064,94069,94075,94080,94085,94090,94122,94127,94132,94162,94167,94172,94177,94200,94205,94210,94216,94221,94274,94279,94283,94288,94315,94320,94325,94330,94339],{"type":17,"tag":18,"props":93599,"children":93601},{"id":93600},"how-to-build-secure-integrations-5-tips",[93602],{"type":23,"value":93592},{"type":17,"tag":25,"props":93604,"children":93605},{},[],{"type":17,"tag":29,"props":93607,"children":93608},{},[93609],{"type":17,"tag":33,"props":93610,"children":93611},{},[93612],{"type":23,"value":37},{"type":17,"tag":29,"props":93614,"children":93615},{},[93616],{"type":23,"value":93593},{"type":17,"tag":29,"props":93618,"children":93619},{},[93620],{"type":23,"value":93621},"Integrations often touch sensitive data:",{"type":17,"tag":80,"props":93623,"children":93624},{},[93625,93629,93633,93637,93642,93647],{"type":17,"tag":84,"props":93626,"children":93627},{},[93628],{"type":23,"value":58912},{"type":17,"tag":84,"props":93630,"children":93631},{},[93632],{"type":23,"value":15319},{"type":17,"tag":84,"props":93634,"children":93635},{},[93636],{"type":23,"value":36590},{"type":17,"tag":84,"props":93638,"children":93639},{},[93640],{"type":23,"value":93641},"contracts and files",{"type":17,"tag":84,"props":93643,"children":93644},{},[93645],{"type":23,"value":93646},"healthcare-adjacent data",{"type":17,"tag":84,"props":93648,"children":93649},{},[93650,93652,93656],{"type":23,"value":93651},"API credentials and ",{"type":17,"tag":133,"props":93653,"children":93654},{"href":779},[93655],{"type":23,"value":782},{"type":23,"value":93657}," tokens",{"type":17,"tag":29,"props":93659,"children":93660},{},[93661],{"type":23,"value":93662},"If your integration layer stores too much, logs too much, or over-permissions access, you are expanding your risk surface every time you add a new connection.",{"type":17,"tag":29,"props":93664,"children":93665},{},[93666],{"type":23,"value":93667},"The good news is that secure integrations are not just about adding encryption or passing an audit. They come from making better architectural decisions from the start.",{"type":17,"tag":29,"props":93669,"children":93670},{},[93671],{"type":23,"value":93672},"Here are five practical tips for building secure integrations, plus what to look for if you are evaluating a third-party platform.",{"type":17,"tag":68,"props":93674,"children":93676},{"id":93675},"_1-use-api-based-least-privilege-access-wherever-possible",[93677],{"type":23,"value":93678},"1. Use API-based, least-privilege access wherever possible",{"type":17,"tag":29,"props":93680,"children":93681},{},[93682],{"type":23,"value":93683},"The safest integration is usually the one that accesses only the data it needs, through a well-defined API, with the narrowest permissions possible.",{"type":17,"tag":29,"props":93685,"children":93686},{},[93687],{"type":23,"value":5804},{"type":17,"tag":80,"props":93689,"children":93690},{},[93691,93696,93701,93706,93711],{"type":17,"tag":84,"props":93692,"children":93693},{},[93694],{"type":23,"value":93695},"prefer API-based integrations over fragile file transfers or scripts",{"type":17,"tag":84,"props":93697,"children":93698},{},[93699],{"type":23,"value":93700},"request the minimum scopes needed for the use case",{"type":17,"tag":84,"props":93702,"children":93703},{},[93704],{"type":23,"value":93705},"separate read and write permissions where possible",{"type":17,"tag":84,"props":93707,"children":93708},{},[93709],{"type":23,"value":93710},"avoid broad admin access if object-level access is enough",{"type":17,"tag":84,"props":93712,"children":93713},{},[93714],{"type":23,"value":93715},"rotate and review scopes as your product changes",{"type":17,"tag":29,"props":93717,"children":93718},{},[93719],{"type":23,"value":93720},"This matters because over-scoped integrations create unnecessary risk. If your product only needs to read contacts, it should not ask for full account-wide write access.",{"type":17,"tag":29,"props":93722,"children":93723},{},[93724],{"type":23,"value":93725},"At scale, scope discipline becomes one of the biggest differentiators between a secure integration program and a risky one.",{"type":17,"tag":239,"props":93727,"children":93729},{"id":93728},"why-unifiedto-is-stronger-here",[93730],{"type":23,"value":93731},"Why Unified.to is stronger here",{"type":17,"tag":29,"props":93733,"children":93734},{},[93735,93740],{"type":17,"tag":133,"props":93736,"children":93738},{"href":212,"rel":93737},[214],[93739],{"type":23,"value":217},{"type":23,"value":93741}," was built around scoped, permissioned access. Its authorization layer supports unified scopes across categories, and the platform verifies access during connection creation so mis-scoped or incomplete connections do not quietly make it into production.",{"type":17,"tag":29,"props":93743,"children":93744},{},[93745],{"type":23,"value":93746},"That matters because you are not just managing one OAuth flow. You are managing hundreds of variations across integrations.",{"type":17,"tag":68,"props":93748,"children":93750},{"id":93749},"_2-protect-credentials-like-production-secrets-not-app-settings",[93751],{"type":23,"value":93752},"2. Protect credentials like production secrets, not app settings",{"type":17,"tag":29,"props":93754,"children":93755},{},[93756],{"type":23,"value":93757},"A surprising amount of integration risk comes down to poor credential handling.",{"type":17,"tag":29,"props":93759,"children":93760},{},[93761],{"type":23,"value":93762},"API keys, OAuth refresh tokens, client secrets, and service credentials should never be treated like ordinary config values.",{"type":17,"tag":29,"props":93764,"children":93765},{},[93766],{"type":23,"value":93767},"Best practices include:",{"type":17,"tag":80,"props":93769,"children":93770},{},[93771,93776,93781,93786,93791,93796],{"type":17,"tag":84,"props":93772,"children":93773},{},[93774],{"type":23,"value":93775},"never hardcode secrets in source code",{"type":17,"tag":84,"props":93777,"children":93778},{},[93779],{"type":23,"value":93780},"use a dedicated secrets manager",{"type":17,"tag":84,"props":93782,"children":93783},{},[93784],{"type":23,"value":93785},"encrypt credentials at rest",{"type":17,"tag":84,"props":93787,"children":93788},{},[93789],{"type":23,"value":93790},"limit who can access production secrets",{"type":17,"tag":84,"props":93792,"children":93793},{},[93794],{"type":23,"value":93795},"rotate credentials and revoke them when no longer needed",{"type":17,"tag":84,"props":93797,"children":93798},{},[93799],{"type":23,"value":93800},"keep token lifetimes short where possible",{"type":17,"tag":29,"props":93802,"children":93803},{},[93804],{"type":23,"value":93805},"If you are building integrations internally, secret management becomes a platform problem very quickly. If you are using a third-party integration vendor, their credential architecture matters just as much as your own.",{"type":17,"tag":239,"props":93807,"children":93809},{"id":93808},"why-unifiedto-is-stronger-here-1",[93810],{"type":23,"value":93731},{"type":17,"tag":29,"props":93812,"children":93813},{},[93814],{"type":23,"value":93815},"Unified supports customer-controlled secret storage through providers such as AWS Secrets Manager, Google Cloud, Azure, and HashiCorp Vault. That means customers can keep OAuth credentials and end-customer API tokens in their own secrets infrastructure instead of expanding vendor-side storage risk.",{"type":17,"tag":29,"props":93817,"children":93818},{},[93819],{"type":23,"value":93820},"That is a meaningful difference. Many platforms say they are secure, but still require you to trust them with long-lived credentials and stored customer data.",{"type":17,"tag":68,"props":93822,"children":93824},{"id":93823},"_3-minimize-stored-data-and-log-only-what-you-actually-need",[93825],{"type":23,"value":93826},"3. Minimize stored data and log only what you actually need",{"type":17,"tag":29,"props":93828,"children":93829},{},[93830],{"type":23,"value":93831},"The more integration data you store, the more data you have to secure, govern, retain, delete, and explain during audits.",{"type":17,"tag":29,"props":93833,"children":93834},{},[93835],{"type":23,"value":93836},"This is why storage architecture matters so much.",{"type":17,"tag":29,"props":93838,"children":93839},{},[93840],{"type":23,"value":93841},"A traditional sync-and-store integration model creates extra copies of customer records inside the integration layer. That means:",{"type":17,"tag":80,"props":93843,"children":93844},{},[93845,93850,93855,93860,93865],{"type":17,"tag":84,"props":93846,"children":93847},{},[93848],{"type":23,"value":93849},"more data at rest",{"type":17,"tag":84,"props":93851,"children":93852},{},[93853],{"type":23,"value":93854},"more breach exposure",{"type":17,"tag":84,"props":93856,"children":93857},{},[93858],{"type":23,"value":93859},"more retention complexity",{"type":17,"tag":84,"props":93861,"children":93862},{},[93863],{"type":23,"value":93864},"more compliance overhead",{"type":17,"tag":84,"props":93866,"children":93867},{},[93868],{"type":23,"value":93869},"more audit scope",{"type":17,"tag":29,"props":93871,"children":93872},{},[93873],{"type":23,"value":93874},"A more secure pattern is to fetch data live from the source API, process it in memory, return it to the destination, and avoid storing end-customer records unless absolutely necessary.",{"type":17,"tag":29,"props":93876,"children":93877},{},[93878],{"type":23,"value":93879},"The same principle applies to logs. Logs should be useful for debugging and monitoring, but they should not become a shadow database full of sensitive payloads.",{"type":17,"tag":239,"props":93881,"children":93883},{"id":93882},"why-unifiedto-is-stronger-here-2",[93884],{"type":23,"value":93731},{"type":17,"tag":29,"props":93886,"children":93887},{},[93888],{"type":23,"value":93889},"This is one of Unified's biggest architectural advantages.",{"type":17,"tag":29,"props":93891,"children":93892},{},[93893,93898,93900,93905],{"type":17,"tag":133,"props":93894,"children":93896},{"href":212,"rel":93895},[214],[93897],{"type":23,"value":217},{"type":23,"value":93899}," uses a ",{"type":17,"tag":48,"props":93901,"children":93902},{},[93903],{"type":23,"value":93904},"zero-storage, pass-through architecture",{"type":23,"value":93906},". Customer data is fetched live from the source, transformed in transit, and delivered in real time. It is not stored at rest on Unified's servers. Unified also minimizes detailed operational logging to reduce exposure.",{"type":17,"tag":29,"props":93908,"children":93909},{},[93910,93912,93916],{"type":23,"value":93911},"That gives Unified one of the strongest security postures in the ",{"type":17,"tag":133,"props":93913,"children":93914},{"href":7691},[93915],{"type":23,"value":7459},{"type":23,"value":93917}," market because it removes an entire class of data-at-rest risk.",{"type":17,"tag":29,"props":93919,"children":93920},{},[93921],{"type":23,"value":93922},"It also helps with compliance. If you do not persist end-customer data, you reduce audit scope and simplify security reviews.",{"type":17,"tag":68,"props":93924,"children":93926},{"id":93925},"_4-design-for-auditability-observability-and-controlled-access",[93927],{"type":23,"value":93928},"4. Design for auditability, observability, and controlled access",{"type":17,"tag":29,"props":93930,"children":93931},{},[93932],{"type":23,"value":93933},"Secure integrations are not just about prevention. They are also about visibility.",{"type":17,"tag":29,"props":93935,"children":93936},{},[93937],{"type":23,"value":93938},"When something goes wrong, you need to know:",{"type":17,"tag":80,"props":93940,"children":93941},{},[93942,93947,93952,93957,93962],{"type":17,"tag":84,"props":93943,"children":93944},{},[93945],{"type":23,"value":93946},"what happened",{"type":17,"tag":84,"props":93948,"children":93949},{},[93950],{"type":23,"value":93951},"when it happened",{"type":17,"tag":84,"props":93953,"children":93954},{},[93955],{"type":23,"value":93956},"which connection was involved",{"type":17,"tag":84,"props":93958,"children":93959},{},[93960],{"type":23,"value":93961},"which user or service initiated it",{"type":17,"tag":84,"props":93963,"children":93964},{},[93965,93967,93971],{"type":23,"value":93966},"whether it was caused by auth, scopes, ",{"type":17,"tag":133,"props":93968,"children":93969},{"href":135},[93970],{"type":23,"value":138},{"type":23,"value":93972},", bad payloads, or upstream changes",{"type":17,"tag":29,"props":93974,"children":93975},{},[93976],{"type":23,"value":93977},"That requires:",{"type":17,"tag":80,"props":93979,"children":93980},{},[93981,93986,93991,93996,94001,94006],{"type":17,"tag":84,"props":93982,"children":93983},{},[93984],{"type":23,"value":93985},"searchable API and webhook logs",{"type":17,"tag":84,"props":93987,"children":93988},{},[93989],{"type":23,"value":93990},"role-based access control",{"type":17,"tag":84,"props":93992,"children":93993},{},[93994],{"type":23,"value":93995},"audit trails for admin actions",{"type":17,"tag":84,"props":93997,"children":93998},{},[93999],{"type":23,"value":94000},"IP allowlisting or IP restrictions",{"type":17,"tag":84,"props":94002,"children":94003},{},[94004],{"type":23,"value":94005},"environment separation",{"type":17,"tag":84,"props":94007,"children":94008},{},[94009],{"type":23,"value":94010},"alerting for failed auth and unusual events",{"type":17,"tag":29,"props":94012,"children":94013},{},[94014],{"type":23,"value":94015},"Without observability, teams often overcompensate by logging too much, which creates a new security issue. The goal is not maximum logging. It is useful, controlled logging.",{"type":17,"tag":239,"props":94017,"children":94019},{"id":94018},"why-unifiedto-is-stronger-here-3",[94020],{"type":23,"value":93731},{"type":17,"tag":29,"props":94022,"children":94023},{},[94024],{"type":23,"value":94025},"Unified combines several security controls that matter in practice:",{"type":17,"tag":80,"props":94027,"children":94028},{},[94029,94034,94039,94044,94049,94054,94059],{"type":17,"tag":84,"props":94030,"children":94031},{},[94032],{"type":23,"value":94033},"SAML-based SSO for dashboard access",{"type":17,"tag":84,"props":94035,"children":94036},{},[94037],{"type":23,"value":94038},"role-based access controls",{"type":17,"tag":84,"props":94040,"children":94041},{},[94042],{"type":23,"value":94043},"IP address restrictions",{"type":17,"tag":84,"props":94045,"children":94046},{},[94047],{"type":23,"value":94048},"segregated regional hosting",{"type":17,"tag":84,"props":94050,"children":94051},{},[94052],{"type":23,"value":94053},"scoped access for MCP and API usage",{"type":17,"tag":84,"props":94055,"children":94056},{},[94057],{"type":23,"value":94058},"options to restrict or remove PII from LLM-accessible data",{"type":17,"tag":84,"props":94060,"children":94061},{},[94062],{"type":23,"value":94063},"audit-friendly security posture through its Trust Center and compliance documentation",{"type":17,"tag":29,"props":94065,"children":94066},{},[94067],{"type":23,"value":94068},"For teams building AI features, that MCP point matters. Unified does not just expose broad data access to models. It provides scoped, permissioned access with additional controls to limit sensitive data exposure.",{"type":17,"tag":68,"props":94070,"children":94072},{"id":94071},"_5-choose-an-architecture-that-reduces-compliance-burden-not-one-that-adds-to-it",[94073],{"type":23,"value":94074},"5. Choose an architecture that reduces compliance burden, not one that adds to it",{"type":17,"tag":29,"props":94076,"children":94077},{},[94078],{"type":23,"value":94079},"A lot of integration 'security' discussions focus on checklists. Those matter, but architecture matters more.",{"type":17,"tag":29,"props":94081,"children":94082},{},[94083],{"type":23,"value":94084},"If your integration platform stores customer records, caches synced data, retains verbose logs, and centralizes secrets, then every new integration increases your compliance surface area.",{"type":17,"tag":29,"props":94086,"children":94087},{},[94088],{"type":23,"value":94089},"If your platform is:",{"type":17,"tag":80,"props":94091,"children":94092},{},[94093,94097,94102,94107,94112,94117],{"type":17,"tag":84,"props":94094,"children":94095},{},[94096],{"type":23,"value":70016},{"type":17,"tag":84,"props":94098,"children":94099},{},[94100],{"type":23,"value":94101},"pass-through",{"type":17,"tag":84,"props":94103,"children":94104},{},[94105],{"type":23,"value":94106},"zero-storage",{"type":17,"tag":84,"props":94108,"children":94109},{},[94110],{"type":23,"value":94111},"regionally segregated",{"type":17,"tag":84,"props":94113,"children":94114},{},[94115],{"type":23,"value":94116},"scope-aware",{"type":17,"tag":84,"props":94118,"children":94119},{},[94120],{"type":23,"value":94121},"backed by strong compliance controls",{"type":17,"tag":29,"props":94123,"children":94124},{},[94125],{"type":23,"value":94126},"then your compliance story gets simpler, not harder.",{"type":17,"tag":29,"props":94128,"children":94129},{},[94130],{"type":23,"value":94131},"That matters for frameworks and customer reviews involving:",{"type":17,"tag":80,"props":94133,"children":94134},{},[94135,94140,94144,94149,94153,94157],{"type":17,"tag":84,"props":94136,"children":94137},{},[94138],{"type":23,"value":94139},"SOC 2 Type II",{"type":17,"tag":84,"props":94141,"children":94142},{},[94143],{"type":23,"value":63416},{"type":17,"tag":84,"props":94145,"children":94146},{},[94147],{"type":23,"value":94148},"CCPA/CPRA",{"type":17,"tag":84,"props":94150,"children":94151},{},[94152],{"type":23,"value":63422},{"type":17,"tag":84,"props":94154,"children":94155},{},[94156],{"type":23,"value":63434},{"type":17,"tag":84,"props":94158,"children":94159},{},[94160],{"type":23,"value":94161},"regional data residency requirements",{"type":17,"tag":239,"props":94163,"children":94165},{"id":94164},"why-unifiedto-is-stronger-here-4",[94166],{"type":23,"value":93731},{"type":17,"tag":29,"props":94168,"children":94169},{},[94170],{"type":23,"value":94171},"Unified is positioned unusually well here because its architecture and certifications reinforce each other.",{"type":17,"tag":29,"props":94173,"children":94174},{},[94175],{"type":23,"value":94176},"Unified pairs its no-storage design with:",{"type":17,"tag":80,"props":94178,"children":94179},{},[94180,94184,94188,94192,94196],{"type":17,"tag":84,"props":94181,"children":94182},{},[94183],{"type":23,"value":94139},{"type":17,"tag":84,"props":94185,"children":94186},{},[94187],{"type":23,"value":63416},{"type":17,"tag":84,"props":94189,"children":94190},{},[94191],{"type":23,"value":94148},{"type":17,"tag":84,"props":94193,"children":94194},{},[94195],{"type":23,"value":63422},{"type":17,"tag":84,"props":94197,"children":94198},{},[94199],{"type":23,"value":63434},{"type":17,"tag":29,"props":94201,"children":94202},{},[94203],{"type":23,"value":94204},"It also supports fully segregated regions across the United States, Europe, and Australia.",{"type":17,"tag":29,"props":94206,"children":94207},{},[94208],{"type":23,"value":94209},"That combination is hard to match. Many vendors can talk about compliance. Fewer can say their architecture was specifically designed to reduce stored-data risk in the first place.",{"type":17,"tag":68,"props":94211,"children":94213},{"id":94212},"what-to-look-for-when-evaluating-a-third-party-integration-platform",[94214],{"type":23,"value":94215},"What to look for when evaluating a third-party integration platform",{"type":17,"tag":29,"props":94217,"children":94218},{},[94219],{"type":23,"value":94220},"If you are comparing vendors, ask these questions directly:",{"type":17,"tag":80,"props":94222,"children":94223},{},[94224,94229,94234,94239,94244,94249,94254,94259,94264,94269],{"type":17,"tag":84,"props":94225,"children":94226},{},[94227],{"type":23,"value":94228},"Do you store end-customer data at rest?",{"type":17,"tag":84,"props":94230,"children":94231},{},[94232],{"type":23,"value":94233},"Do you cache synced records?",{"type":17,"tag":84,"props":94235,"children":94236},{},[94237],{"type":23,"value":94238},"How much of the request and response payload is logged?",{"type":17,"tag":84,"props":94240,"children":94241},{},[94242],{"type":23,"value":94243},"Where are OAuth tokens and secrets stored?",{"type":17,"tag":84,"props":94245,"children":94246},{},[94247],{"type":23,"value":94248},"Can customers use their own secrets manager?",{"type":17,"tag":84,"props":94250,"children":94251},{},[94252],{"type":23,"value":94253},"Do you support least-privilege scopes?",{"type":17,"tag":84,"props":94255,"children":94256},{},[94257],{"type":23,"value":94258},"Do you provide SSO, RBAC, audit trails, and IP allowlisting?",{"type":17,"tag":84,"props":94260,"children":94261},{},[94262],{"type":23,"value":94263},"Are data regions segregated?",{"type":17,"tag":84,"props":94265,"children":94266},{},[94267],{"type":23,"value":94268},"Which compliance frameworks do you actually support?",{"type":17,"tag":84,"props":94270,"children":94271},{},[94272],{"type":23,"value":94273},"Can you restrict PII exposure for AI and MCP use cases?",{"type":17,"tag":29,"props":94275,"children":94276},{},[94277],{"type":23,"value":94278},"These questions often reveal the real security posture much faster than a generic security page.",{"type":17,"tag":68,"props":94280,"children":94281},{"id":1552},[94282],{"type":23,"value":1555},{"type":17,"tag":29,"props":94284,"children":94285},{},[94286],{"type":23,"value":94287},"Secure integrations are built through a combination of:",{"type":17,"tag":80,"props":94289,"children":94290},{},[94291,94295,94300,94305,94310],{"type":17,"tag":84,"props":94292,"children":94293},{},[94294],{"type":23,"value":89892},{"type":17,"tag":84,"props":94296,"children":94297},{},[94298],{"type":23,"value":94299},"strong secret handling",{"type":17,"tag":84,"props":94301,"children":94302},{},[94303],{"type":23,"value":94304},"minimal data retention",{"type":17,"tag":84,"props":94306,"children":94307},{},[94308],{"type":23,"value":94309},"useful observability",{"type":17,"tag":84,"props":94311,"children":94312},{},[94313],{"type":23,"value":94314},"lower-risk architecture",{"type":17,"tag":29,"props":94316,"children":94317},{},[94318],{"type":23,"value":94319},"That is also why Unified.to has one of the strongest security positions in the unified API market.",{"type":17,"tag":29,"props":94321,"children":94322},{},[94323],{"type":23,"value":94324},"It is not just because of certifications. It is because the platform is built around a pass-through, zero-storage model that removes major classes of security and compliance risk before they become your problem.",{"type":17,"tag":29,"props":94326,"children":94327},{},[94328],{"type":23,"value":94329},"If you are building customer-facing integrations at scale, that is the difference between adding infrastructure that expands your risk surface and adopting infrastructure that helps contain it.",{"type":17,"tag":29,"props":94331,"children":94332},{},[94333,94334],{"type":23,"value":1609},{"type":17,"tag":133,"props":94335,"children":94337},{"href":1612,"rel":94336},[214],[94338],{"type":23,"value":1616},{"type":17,"tag":29,"props":94340,"children":94341},{},[94342,94343],{"type":23,"value":1609},{"type":17,"tag":133,"props":94344,"children":94346},{"href":1623,"rel":94345},[214],[94347],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":94349},[94350,94353,94356,94359,94362,94365,94366],{"id":93675,"depth":1629,"text":93678,"children":94351},[94352],{"id":93728,"depth":1635,"text":93731},{"id":93749,"depth":1629,"text":93752,"children":94354},[94355],{"id":93808,"depth":1635,"text":93731},{"id":93823,"depth":1629,"text":93826,"children":94357},[94358],{"id":93882,"depth":1635,"text":93731},{"id":93925,"depth":1629,"text":93928,"children":94360},[94361],{"id":94018,"depth":1635,"text":93731},{"id":94071,"depth":1629,"text":94074,"children":94363},[94364],{"id":94164,"depth":1635,"text":93731},{"id":94212,"depth":1629,"text":94215},{"id":1552,"depth":1629,"text":1555},"content:blog:how_to_build_secure_integrations_5_tips.md","blog/how_to_build_secure_integrations_5_tips.md","blog/how_to_build_secure_integrations_5_tips",{"_path":94371,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":94372,"description":94373,"img":6339,"date":94374,"tag":12,"body":94375,"_type":1677,"_id":95951,"_source":1679,"_file":95952,"_stem":95953,"_extension":1682},"/blog/saas_integration_everything_you_need_to_know_strategies_platforms_and_best_practices","SaaS Integration: Everything You Need to Know (Strategies, Platforms, and Best Practices)","SaaS integration is how modern software products connect to the tools their customers already use. It enables real-time data flow, automation, and better user...","2026-03-09T19:22:00.000Z",{"type":14,"children":94376,"toc":95894},[94377,94382,94385,94392,94404,94410,94415,94420,94425,94433,94446,94453,94466,94471,94477,94482,94487,94493,94501,94506,94514,94519,94527,94532,94540,94545,94553,94558,94564,94570,94586,94592,94622,94628,94645,94651,94670,94676,94692,94697,94703,94709,94714,94741,94746,94752,94761,94766,94792,94797,94803,94808,94813,94829,94835,94839,94856,94861,94867,94872,94888,94893,94899,94905,94912,94930,94937,94959,94963,94976,94982,94986,95013,95020,95037,95044,95067,95071,95078,95084,95088,95115,95122,95143,95151,95167,95171,95178,95184,95189,95194,95209,95214,95220,95246,95257,95263,95268,95272,95277,95294,95298,95303,95319,95325,95329,95348,95353,95357,95362,95378,95383,95387,95392,95414,95419,95425,95431,95449,95455,95473,95479,95484,95502,95508,95513,95530,95536,95554,95560,95578,95584,95592,95597,95605,95610,95618,95623,95631,95636,95644,95648,95665,95673,95678,95684,95690,95695,95712,95718,95723,95729,95734,95746,95752,95757,95763,95769,95774,95780,95785,95791,95816,95822,95845,95849,95854,95859,95864,95876,95885],{"type":17,"tag":18,"props":94378,"children":94380},{"id":94379},"saas-integration-everything-you-need-to-know-strategies-platforms-and-best-practices",[94381],{"type":23,"value":94372},{"type":17,"tag":25,"props":94383,"children":94384},{},[],{"type":17,"tag":29,"props":94386,"children":94387},{},[94388],{"type":17,"tag":33,"props":94389,"children":94390},{},[94391],{"type":23,"value":37},{"type":17,"tag":29,"props":94393,"children":94394},{},[94395,94397,94402],{"type":23,"value":94396},"SaaS integration is how modern software products connect to the tools their customers already use. It enables real-time data flow, automation, and better user experiences. Most teams start by building integrations themselves, then hit scaling, maintenance, and reliability issues. Modern approaches—especially real-time Unified APIs like ",{"type":17,"tag":133,"props":94398,"children":94400},{"href":212,"rel":94399},[214],[94401],{"type":23,"value":217},{"type":23,"value":94403},"—replace fragmented, one-off integrations with a single, scalable integration layer.",{"type":17,"tag":68,"props":94405,"children":94407},{"id":94406},"what-is-saas-integration",[94408],{"type":23,"value":94409},"What is SaaS integration?",{"type":17,"tag":29,"props":94411,"children":94412},{},[94413],{"type":23,"value":94414},"SaaS integration is the process of connecting cloud-based applications so they can share data and trigger workflows automatically.",{"type":17,"tag":29,"props":94416,"children":94417},{},[94418],{"type":23,"value":94419},"At a technical level, SaaS integrations are typically built using APIs. One system sends a request, another system responds, and data flows between them.",{"type":17,"tag":29,"props":94421,"children":94422},{},[94423],{"type":23,"value":94424},"There are two main types:",{"type":17,"tag":29,"props":94426,"children":94427},{},[94428],{"type":17,"tag":48,"props":94429,"children":94430},{},[94431],{"type":23,"value":94432},"Internal integrations",{"type":17,"tag":80,"props":94434,"children":94435},{},[94436,94441],{"type":17,"tag":84,"props":94437,"children":94438},{},[94439],{"type":23,"value":94440},"Connecting tools your team uses (e.g., Slack + CRM + analytics)",{"type":17,"tag":84,"props":94442,"children":94443},{},[94444],{"type":23,"value":94445},"Focused on automation and efficiency",{"type":17,"tag":29,"props":94447,"children":94448},{},[94449],{"type":17,"tag":48,"props":94450,"children":94451},{},[94452],{"type":23,"value":17558},{"type":17,"tag":80,"props":94454,"children":94455},{},[94456,94461],{"type":17,"tag":84,"props":94457,"children":94458},{},[94459],{"type":23,"value":94460},"Built into your product for your customers",{"type":17,"tag":84,"props":94462,"children":94463},{},[94464],{"type":23,"value":94465},"Let users connect their systems (e.g., Salesforce, HubSpot, Workday)",{"type":17,"tag":29,"props":94467,"children":94468},{},[94469],{"type":23,"value":94470},"This second category is what most B2B SaaS companies care about. It directly impacts product adoption, deal velocity, and retention.",{"type":17,"tag":68,"props":94472,"children":94474},{"id":94473},"why-saas-integrations-matter",[94475],{"type":23,"value":94476},"Why SaaS integrations matter",{"type":17,"tag":29,"props":94478,"children":94479},{},[94480],{"type":23,"value":94481},"SaaS adoption has exploded. Most companies now use dozens or hundreds of tools across CRM, HR, finance, marketing, and support.",{"type":17,"tag":29,"props":94483,"children":94484},{},[94485],{"type":23,"value":94486},"Without integrations, those tools become disconnected systems.",{"type":17,"tag":239,"props":94488,"children":94490},{"id":94489},"key-benefits",[94491],{"type":23,"value":94492},"Key benefits",{"type":17,"tag":29,"props":94494,"children":94495},{},[94496],{"type":17,"tag":48,"props":94497,"children":94498},{},[94499],{"type":23,"value":94500},"Eliminate data silos",{"type":17,"tag":29,"props":94502,"children":94503},{},[94504],{"type":23,"value":94505},"Data stays in sync across systems instead of being duplicated or manually updated.",{"type":17,"tag":29,"props":94507,"children":94508},{},[94509],{"type":17,"tag":48,"props":94510,"children":94511},{},[94512],{"type":23,"value":94513},"Reduce manual work",{"type":17,"tag":29,"props":94515,"children":94516},{},[94517],{"type":23,"value":94518},"No more copying data between systems or reconciling mismatches.",{"type":17,"tag":29,"props":94520,"children":94521},{},[94522],{"type":17,"tag":48,"props":94523,"children":94524},{},[94525],{"type":23,"value":94526},"Improve product value",{"type":17,"tag":29,"props":94528,"children":94529},{},[94530],{"type":23,"value":94531},"Customers expect your product to work with their existing stack.",{"type":17,"tag":29,"props":94533,"children":94534},{},[94535],{"type":17,"tag":48,"props":94536,"children":94537},{},[94538],{"type":23,"value":94539},"Increase retention and expansion",{"type":17,"tag":29,"props":94541,"children":94542},{},[94543],{"type":23,"value":94544},"Integrations make your product stickier and more embedded in workflows.",{"type":17,"tag":29,"props":94546,"children":94547},{},[94548],{"type":17,"tag":48,"props":94549,"children":94550},{},[94551],{"type":23,"value":94552},"Enable automation and AI",{"type":17,"tag":29,"props":94554,"children":94555},{},[94556],{"type":23,"value":94557},"Real-time data access is required for workflows, analytics, and AI agents.",{"type":17,"tag":68,"props":94559,"children":94561},{"id":94560},"common-saas-integration-use-cases",[94562],{"type":23,"value":94563},"Common SaaS integration use cases",{"type":17,"tag":239,"props":94565,"children":94567},{"id":94566},"crm-marketing-automation",[94568],{"type":23,"value":94569},"CRM + Marketing automation",{"type":17,"tag":29,"props":94571,"children":94572},{},[94573,94575,94580,94581],{"type":23,"value":94574},"Sync leads between tools like ",{"type":17,"tag":133,"props":94576,"children":94578},{"href":29657,"rel":94577},[214],[94579],{"type":23,"value":3184},{"type":23,"value":34435},{"type":17,"tag":133,"props":94582,"children":94584},{"href":76285,"rel":94583},[214],[94585],{"type":23,"value":3179},{"type":17,"tag":239,"props":94587,"children":94589},{"id":94588},"ats-hris-onboarding",[94590],{"type":23,"value":94591},"ATS → HRIS onboarding",{"type":17,"tag":29,"props":94593,"children":94594},{},[94595,94597,94602,94603,94609,94611,94616,94617],{"type":23,"value":94596},"Move candidates from systems like ",{"type":17,"tag":133,"props":94598,"children":94600},{"href":52509,"rel":94599},[214],[94601],{"type":23,"value":3189},{"type":23,"value":75890},{"type":17,"tag":133,"props":94604,"children":94607},{"href":94605,"rel":94606},"https://hire.lever.co/developer/documentation",[214],[94608],{"type":23,"value":56545},{"type":23,"value":94610}," into HR platforms like ",{"type":17,"tag":133,"props":94612,"children":94614},{"href":55031,"rel":94613},[214],[94615],{"type":23,"value":59319},{"type":23,"value":75890},{"type":17,"tag":133,"props":94618,"children":94620},{"href":60449,"rel":94619},[214],[94621],{"type":23,"value":3194},{"type":17,"tag":239,"props":94623,"children":94625},{"id":94624},"hris-payroll",[94626],{"type":23,"value":94627},"HRIS → payroll",{"type":17,"tag":29,"props":94629,"children":94630},{},[94631,94633,94639,94640],{"type":23,"value":94632},"Sync employee data into systems like ",{"type":17,"tag":133,"props":94634,"children":94636},{"href":57653,"rel":94635},[214],[94637],{"type":23,"value":94638},"ADP",{"type":23,"value":75890},{"type":17,"tag":133,"props":94641,"children":94643},{"href":58829,"rel":94642},[214],[94644],{"type":23,"value":59609},{"type":17,"tag":239,"props":94646,"children":94648},{"id":94647},"crm-contract-storage",[94649],{"type":23,"value":94650},"CRM → contract + storage",{"type":17,"tag":29,"props":94652,"children":94653},{},[94654,94656,94663,94665],{"type":23,"value":94655},"Trigger contracts via ",{"type":17,"tag":133,"props":94657,"children":94660},{"href":94658,"rel":94659},"https://developers.docusign.com/",[214],[94661],{"type":23,"value":94662},"DocuSign",{"type":23,"value":94664}," and store files in ",{"type":17,"tag":133,"props":94666,"children":94668},{"href":28903,"rel":94667},[214],[94669],{"type":23,"value":28907},{"type":17,"tag":239,"props":94671,"children":94673},{"id":94672},"support-engineering-tools",[94674],{"type":23,"value":94675},"Support + engineering tools",{"type":17,"tag":29,"props":94677,"children":94678},{},[94679,94681,94686,94687],{"type":23,"value":94680},"Sync tickets between ",{"type":17,"tag":133,"props":94682,"children":94684},{"href":15341,"rel":94683},[214],[94685],{"type":23,"value":15738},{"type":23,"value":34435},{"type":17,"tag":133,"props":94688,"children":94690},{"href":29538,"rel":94689},[214],[94691],{"type":23,"value":12559},{"type":17,"tag":29,"props":94693,"children":94694},{},[94695],{"type":23,"value":94696},"These are simple examples. In practice, most products need dozens of integrations across categories.",{"type":17,"tag":68,"props":94698,"children":94700},{"id":94699},"key-challenges-in-saas-integrations",[94701],{"type":23,"value":94702},"Key challenges in SaaS integrations",{"type":17,"tag":239,"props":94704,"children":94706},{"id":94705},"_1-api-fragmentation",[94707],{"type":23,"value":94708},"1. API fragmentation",{"type":17,"tag":29,"props":94710,"children":94711},{},[94712],{"type":23,"value":94713},"Every provider has different:",{"type":17,"tag":80,"props":94715,"children":94716},{},[94717,94722,94726,94730,94737],{"type":17,"tag":84,"props":94718,"children":94719},{},[94720],{"type":23,"value":94721},"authentication methods",{"type":17,"tag":84,"props":94723,"children":94724},{},[94725],{"type":23,"value":44237},{"type":17,"tag":84,"props":94727,"children":94728},{},[94729],{"type":23,"value":80434},{"type":17,"tag":84,"props":94731,"children":94732},{},[94733],{"type":17,"tag":133,"props":94734,"children":94735},{"href":135},[94736],{"type":23,"value":138},{"type":17,"tag":84,"props":94738,"children":94739},{},[94740],{"type":23,"value":31792},{"type":17,"tag":29,"props":94742,"children":94743},{},[94744],{"type":23,"value":94745},"Even within one category (like CRM), no two APIs behave the same.",{"type":17,"tag":239,"props":94747,"children":94749},{"id":94748},"_2-oauth-and-credential-management",[94750],{"type":23,"value":94751},"2. OAuth and credential management",{"type":17,"tag":29,"props":94753,"children":94754},{},[94755,94759],{"type":17,"tag":133,"props":94756,"children":94757},{"href":779},[94758],{"type":23,"value":782},{"type":23,"value":94760}," is inconsistent across providers.",{"type":17,"tag":29,"props":94762,"children":94763},{},[94764],{"type":23,"value":94765},"You need to handle:",{"type":17,"tag":80,"props":94767,"children":94768},{},[94769,94773,94777,94782,94787],{"type":17,"tag":84,"props":94770,"children":94771},{},[94772],{"type":23,"value":789},{"type":17,"tag":84,"props":94774,"children":94775},{},[94776],{"type":23,"value":78155},{"type":17,"tag":84,"props":94778,"children":94779},{},[94780],{"type":23,"value":94781},"expiration",{"type":17,"tag":84,"props":94783,"children":94784},{},[94785],{"type":23,"value":94786},"re-authentication",{"type":17,"tag":84,"props":94788,"children":94789},{},[94790],{"type":23,"value":94791},"security",{"type":17,"tag":29,"props":94793,"children":94794},{},[94795],{"type":23,"value":94796},"This becomes a major infrastructure problem at scale.",{"type":17,"tag":239,"props":94798,"children":94800},{"id":94799},"_3-data-normalization",[94801],{"type":23,"value":94802},"3. Data normalization",{"type":17,"tag":29,"props":94804,"children":94805},{},[94806],{"type":23,"value":94807},"A 'contact,' 'employee,' or 'deal' looks different across systems.",{"type":17,"tag":29,"props":94809,"children":94810},{},[94811],{"type":23,"value":94812},"You end up building:",{"type":17,"tag":80,"props":94814,"children":94815},{},[94816,94820,94824],{"type":17,"tag":84,"props":94817,"children":94818},{},[94819],{"type":23,"value":79977},{"type":17,"tag":84,"props":94821,"children":94822},{},[94823],{"type":23,"value":79982},{"type":17,"tag":84,"props":94825,"children":94826},{},[94827],{"type":23,"value":94828},"fallback handling",{"type":17,"tag":239,"props":94830,"children":94832},{"id":94831},"_4-maintenance-overhead",[94833],{"type":23,"value":94834},"4. Maintenance overhead",{"type":17,"tag":29,"props":94836,"children":94837},{},[94838],{"type":23,"value":80013},{"type":17,"tag":80,"props":94840,"children":94841},{},[94842,94847,94851],{"type":17,"tag":84,"props":94843,"children":94844},{},[94845],{"type":23,"value":94846},"endpoints deprecate",{"type":17,"tag":84,"props":94848,"children":94849},{},[94850],{"type":23,"value":78944},{"type":17,"tag":84,"props":94852,"children":94853},{},[94854],{"type":23,"value":94855},"auth flows update",{"type":17,"tag":29,"props":94857,"children":94858},{},[94859],{"type":23,"value":94860},"Every integration becomes a long-term maintenance burden.",{"type":17,"tag":239,"props":94862,"children":94864},{"id":94863},"_5-real-time-vs-batch-limitations",[94865],{"type":23,"value":94866},"5. Real-time vs batch limitations",{"type":17,"tag":29,"props":94868,"children":94869},{},[94870],{"type":23,"value":94871},"Many systems rely on polling or sync jobs, leading to:",{"type":17,"tag":80,"props":94873,"children":94874},{},[94875,94879,94883],{"type":17,"tag":84,"props":94876,"children":94877},{},[94878],{"type":23,"value":80275},{"type":17,"tag":84,"props":94880,"children":94881},{},[94882],{"type":23,"value":80280},{"type":17,"tag":84,"props":94884,"children":94885},{},[94886],{"type":23,"value":94887},"broken automation",{"type":17,"tag":29,"props":94889,"children":94890},{},[94891],{"type":23,"value":94892},"This becomes especially problematic for AI use cases.",{"type":17,"tag":68,"props":94894,"children":94896},{"id":94895},"choosing-the-right-approach-build-vs-buy",[94897],{"type":23,"value":94898},"Choosing the right approach: build vs buy",{"type":17,"tag":239,"props":94900,"children":94902},{"id":94901},"option-1-build-integrations-in-house",[94903],{"type":23,"value":94904},"Option 1: Build integrations in-house",{"type":17,"tag":29,"props":94906,"children":94907},{},[94908],{"type":17,"tag":48,"props":94909,"children":94910},{},[94911],{"type":23,"value":68924},{"type":17,"tag":80,"props":94913,"children":94914},{},[94915,94920,94925],{"type":17,"tag":84,"props":94916,"children":94917},{},[94918],{"type":23,"value":94919},"full control",{"type":17,"tag":84,"props":94921,"children":94922},{},[94923],{"type":23,"value":94924},"deep customization",{"type":17,"tag":84,"props":94926,"children":94927},{},[94928],{"type":23,"value":94929},"no vendor dependency",{"type":17,"tag":29,"props":94931,"children":94932},{},[94933],{"type":17,"tag":48,"props":94934,"children":94935},{},[94936],{"type":23,"value":68950},{"type":17,"tag":80,"props":94938,"children":94939},{},[94940,94945,94950,94954],{"type":17,"tag":84,"props":94941,"children":94942},{},[94943],{"type":23,"value":94944},"slow to build",{"type":17,"tag":84,"props":94946,"children":94947},{},[94948],{"type":23,"value":94949},"expensive to maintain",{"type":17,"tag":84,"props":94951,"children":94952},{},[94953],{"type":23,"value":543},{"type":17,"tag":84,"props":94955,"children":94956},{},[94957],{"type":23,"value":94958},"requires ongoing API expertise",{"type":17,"tag":29,"props":94960,"children":94961},{},[94962],{"type":23,"value":43522},{"type":17,"tag":80,"props":94964,"children":94965},{},[94966,94971],{"type":17,"tag":84,"props":94967,"children":94968},{},[94969],{"type":23,"value":94970},"a small number of integrations",{"type":17,"tag":84,"props":94972,"children":94973},{},[94974],{"type":23,"value":94975},"highly custom requirements",{"type":17,"tag":239,"props":94977,"children":94979},{"id":94978},"option-2-use-ipaas-or-embedded-ipaas",[94980],{"type":23,"value":94981},"Option 2: Use iPaaS or embedded iPaaS",{"type":17,"tag":29,"props":94983,"children":94984},{},[94985],{"type":23,"value":377},{"type":17,"tag":80,"props":94987,"children":94988},{},[94989,94997,95005],{"type":17,"tag":84,"props":94990,"children":94991},{},[94992],{"type":17,"tag":133,"props":94993,"children":94995},{"href":386,"rel":94994},[214],[94996],{"type":23,"value":390},{"type":17,"tag":84,"props":94998,"children":94999},{},[95000],{"type":17,"tag":133,"props":95001,"children":95003},{"href":482,"rel":95002},[214],[95004],{"type":23,"value":486},{"type":17,"tag":84,"props":95006,"children":95007},{},[95008],{"type":17,"tag":133,"props":95009,"children":95011},{"href":396,"rel":95010},[214],[95012],{"type":23,"value":400},{"type":17,"tag":29,"props":95014,"children":95015},{},[95016],{"type":17,"tag":48,"props":95017,"children":95018},{},[95019],{"type":23,"value":68924},{"type":17,"tag":80,"props":95021,"children":95022},{},[95023,95028,95032],{"type":17,"tag":84,"props":95024,"children":95025},{},[95026],{"type":23,"value":95027},"fast setup",{"type":17,"tag":84,"props":95029,"children":95030},{},[95031],{"type":23,"value":424},{"type":17,"tag":84,"props":95033,"children":95034},{},[95035],{"type":23,"value":95036},"large connector libraries",{"type":17,"tag":29,"props":95038,"children":95039},{},[95040],{"type":17,"tag":48,"props":95041,"children":95042},{},[95043],{"type":23,"value":68950},{"type":17,"tag":80,"props":95045,"children":95046},{},[95047,95052,95057,95062],{"type":17,"tag":84,"props":95048,"children":95049},{},[95050],{"type":23,"value":95051},"not built for product integrations",{"type":17,"tag":84,"props":95053,"children":95054},{},[95055],{"type":23,"value":95056},"limited control",{"type":17,"tag":84,"props":95058,"children":95059},{},[95060],{"type":23,"value":95061},"often batch-based",{"type":17,"tag":84,"props":95063,"children":95064},{},[95065],{"type":23,"value":95066},"not ideal for real-time or AI",{"type":17,"tag":29,"props":95068,"children":95069},{},[95070],{"type":23,"value":43522},{"type":17,"tag":80,"props":95072,"children":95073},{},[95074],{"type":17,"tag":84,"props":95075,"children":95076},{},[95077],{"type":23,"value":84779},{"type":17,"tag":239,"props":95079,"children":95081},{"id":95080},"option-3-use-a-unified-api",[95082],{"type":23,"value":95083},"Option 3: Use a Unified API",{"type":17,"tag":29,"props":95085,"children":95086},{},[95087],{"type":23,"value":377},{"type":17,"tag":80,"props":95089,"children":95090},{},[95091,95099,95107],{"type":17,"tag":84,"props":95092,"children":95093},{},[95094],{"type":17,"tag":133,"props":95095,"children":95097},{"href":81639,"rel":95096},[214],[95098],{"type":23,"value":227},{"type":17,"tag":84,"props":95100,"children":95101},{},[95102],{"type":17,"tag":133,"props":95103,"children":95105},{"href":69130,"rel":95104},[214],[95106],{"type":23,"value":237},{"type":17,"tag":84,"props":95108,"children":95109},{},[95110],{"type":17,"tag":133,"props":95111,"children":95113},{"href":212,"rel":95112},[214],[95114],{"type":23,"value":217},{"type":17,"tag":29,"props":95116,"children":95117},{},[95118],{"type":17,"tag":48,"props":95119,"children":95120},{},[95121],{"type":23,"value":68924},{"type":17,"tag":80,"props":95123,"children":95124},{},[95125,95130,95134,95138],{"type":17,"tag":84,"props":95126,"children":95127},{},[95128],{"type":23,"value":95129},"integrate once, support many systems",{"type":17,"tag":84,"props":95131,"children":95132},{},[95133],{"type":23,"value":257},{"type":17,"tag":84,"props":95135,"children":95136},{},[95137],{"type":23,"value":267},{"type":17,"tag":84,"props":95139,"children":95140},{},[95141],{"type":23,"value":95142},"faster time-to-market",{"type":17,"tag":29,"props":95144,"children":95145},{},[95146],{"type":17,"tag":48,"props":95147,"children":95148},{},[95149],{"type":23,"value":95150},"Cons (older platforms)",{"type":17,"tag":80,"props":95152,"children":95153},{},[95154,95158,95162],{"type":17,"tag":84,"props":95155,"children":95156},{},[95157],{"type":23,"value":83910},{"type":17,"tag":84,"props":95159,"children":95160},{},[95161],{"type":23,"value":80252},{"type":17,"tag":84,"props":95163,"children":95164},{},[95165],{"type":23,"value":95166},"sync-based architectures",{"type":17,"tag":29,"props":95168,"children":95169},{},[95170],{"type":23,"value":43522},{"type":17,"tag":80,"props":95172,"children":95173},{},[95174],{"type":17,"tag":84,"props":95175,"children":95176},{},[95177],{"type":23,"value":192},{"type":17,"tag":68,"props":95179,"children":95181},{"id":95180},"a-modern-approach-real-time-unified-apis",[95182],{"type":23,"value":95183},"A modern approach: real-time Unified APIs",{"type":17,"tag":29,"props":95185,"children":95186},{},[95187],{"type":23,"value":95188},"Not all Unified APIs are the same.",{"type":17,"tag":29,"props":95190,"children":95191},{},[95192],{"type":23,"value":95193},"Older platforms rely on:",{"type":17,"tag":80,"props":95195,"children":95196},{},[95197,95201,95205],{"type":17,"tag":84,"props":95198,"children":95199},{},[95200],{"type":23,"value":31656},{"type":17,"tag":84,"props":95202,"children":95203},{},[95204],{"type":23,"value":92576},{"type":17,"tag":84,"props":95206,"children":95207},{},[95208],{"type":23,"value":32803},{"type":17,"tag":29,"props":95210,"children":95211},{},[95212],{"type":23,"value":95213},"This creates latency and data consistency issues.",{"type":17,"tag":239,"props":95215,"children":95217},{"id":95216},"what-modern-saas-products-need-instead",[95218],{"type":23,"value":95219},"What modern SaaS products need instead",{"type":17,"tag":80,"props":95221,"children":95222},{},[95223,95227,95232,95236,95241],{"type":17,"tag":84,"props":95224,"children":95225},{},[95226],{"type":23,"value":27657},{"type":17,"tag":84,"props":95228,"children":95229},{},[95230],{"type":23,"value":95231},"read + write support",{"type":17,"tag":84,"props":95233,"children":95234},{},[95235],{"type":23,"value":80519},{"type":17,"tag":84,"props":95237,"children":95238},{},[95239],{"type":23,"value":95240},"strong auth handling",{"type":17,"tag":84,"props":95242,"children":95243},{},[95244],{"type":23,"value":95245},"minimal data storage",{"type":17,"tag":29,"props":95247,"children":95248},{},[95249,95250,95255],{"type":23,"value":80319},{"type":17,"tag":133,"props":95251,"children":95253},{"href":212,"rel":95252},[214],[95254],{"type":23,"value":217},{"type":23,"value":95256}," fits differently.",{"type":17,"tag":68,"props":95258,"children":95260},{"id":95259},"why-unifiedto-stands-out",[95261],{"type":23,"value":95262},"Why Unified.to stands out",{"type":17,"tag":29,"props":95264,"children":95265},{},[95266],{"type":23,"value":95267},"Unified is built as real-time integration infrastructure, not a sync layer.",{"type":17,"tag":239,"props":95269,"children":95270},{"id":13402},[95271],{"type":23,"value":69681},{"type":17,"tag":29,"props":95273,"children":95274},{},[95275],{"type":23,"value":95276},"Every request hits the source API directly.",{"type":17,"tag":80,"props":95278,"children":95279},{},[95280,95285,95289],{"type":17,"tag":84,"props":95281,"children":95282},{},[95283],{"type":23,"value":95284},"no caching",{"type":17,"tag":84,"props":95286,"children":95287},{},[95288],{"type":23,"value":41801},{"type":17,"tag":84,"props":95290,"children":95291},{},[95292],{"type":23,"value":95293},"no stale data",{"type":17,"tag":239,"props":95295,"children":95296},{"id":90302},[95297],{"type":23,"value":43670},{"type":17,"tag":29,"props":95299,"children":95300},{},[95301],{"type":23,"value":95302},"No customer data is stored.",{"type":17,"tag":80,"props":95304,"children":95305},{},[95306,95310,95314],{"type":17,"tag":84,"props":95307,"children":95308},{},[95309],{"type":23,"value":79330},{"type":17,"tag":84,"props":95311,"children":95312},{},[95313],{"type":23,"value":79340},{"type":17,"tag":84,"props":95315,"children":95316},{},[95317],{"type":23,"value":95318},"simpler audits",{"type":17,"tag":239,"props":95320,"children":95322},{"id":95321},"deep-normalization",[95323],{"type":23,"value":95324},"Deep normalization",{"type":17,"tag":29,"props":95326,"children":95327},{},[95328],{"type":23,"value":80421},{"type":17,"tag":80,"props":95330,"children":95331},{},[95332,95336,95340,95344],{"type":17,"tag":84,"props":95333,"children":95334},{},[95335],{"type":23,"value":80429},{"type":17,"tag":84,"props":95337,"children":95338},{},[95339],{"type":23,"value":80434},{"type":17,"tag":84,"props":95341,"children":95342},{},[95343],{"type":23,"value":77613},{"type":17,"tag":84,"props":95345,"children":95346},{},[95347],{"type":23,"value":833},{"type":17,"tag":29,"props":95349,"children":95350},{},[95351],{"type":23,"value":95352},"While still allowing raw access when needed.",{"type":17,"tag":239,"props":95354,"children":95355},{"id":63136},[95356],{"type":23,"value":63139},{"type":17,"tag":29,"props":95358,"children":95359},{},[95360],{"type":23,"value":95361},"You can:",{"type":17,"tag":80,"props":95363,"children":95364},{},[95365,95369,95374],{"type":17,"tag":84,"props":95366,"children":95367},{},[95368],{"type":23,"value":80476},{"type":17,"tag":84,"props":95370,"children":95371},{},[95372],{"type":23,"value":95373},"update data",{"type":17,"tag":84,"props":95375,"children":95376},{},[95377],{"type":23,"value":80486},{"type":17,"tag":29,"props":95379,"children":95380},{},[95381],{"type":23,"value":95382},"Not just read data.",{"type":17,"tag":239,"props":95384,"children":95385},{"id":15879},[95386],{"type":23,"value":15882},{"type":17,"tag":29,"props":95388,"children":95389},{},[95390],{"type":23,"value":95391},"Unified supports:",{"type":17,"tag":80,"props":95393,"children":95394},{},[95395,95400,95409],{"type":17,"tag":84,"props":95396,"children":95397},{},[95398],{"type":23,"value":95399},"real-time data pipelines",{"type":17,"tag":84,"props":95401,"children":95402},{},[95403,95407],{"type":17,"tag":133,"props":95404,"children":95405},{"href":326},[95406],{"type":23,"value":329},{"type":23,"value":95408}," (Model Context Protocol)",{"type":17,"tag":84,"props":95410,"children":95411},{},[95412],{"type":23,"value":95413},"agent tool execution",{"type":17,"tag":29,"props":95415,"children":95416},{},[95417],{"type":23,"value":95418},"This makes it usable for modern AI-native products.",{"type":17,"tag":68,"props":95420,"children":95422},{"id":95421},"how-to-integrate-saas-applications-step-by-step",[95423],{"type":23,"value":95424},"How to integrate SaaS applications (step-by-step)",{"type":17,"tag":239,"props":95426,"children":95428},{"id":95427},"_1-define-your-goal",[95429],{"type":23,"value":95430},"1. Define your goal",{"type":17,"tag":80,"props":95432,"children":95433},{},[95434,95439,95444],{"type":17,"tag":84,"props":95435,"children":95436},{},[95437],{"type":23,"value":95438},"internal automation?",{"type":17,"tag":84,"props":95440,"children":95441},{},[95442],{"type":23,"value":95443},"customer-facing integrations?",{"type":17,"tag":84,"props":95445,"children":95446},{},[95447],{"type":23,"value":95448},"analytics or AI?",{"type":17,"tag":239,"props":95450,"children":95452},{"id":95451},"_2-choose-your-approach",[95453],{"type":23,"value":95454},"2. Choose your approach",{"type":17,"tag":80,"props":95456,"children":95457},{},[95458,95463,95468],{"type":17,"tag":84,"props":95459,"children":95460},{},[95461],{"type":23,"value":95462},"build in-house",{"type":17,"tag":84,"props":95464,"children":95465},{},[95466],{"type":23,"value":95467},"use iPaaS",{"type":17,"tag":84,"props":95469,"children":95470},{},[95471],{"type":23,"value":95472},"use a Unified API",{"type":17,"tag":239,"props":95474,"children":95476},{"id":95475},"_3-map-data-flows",[95477],{"type":23,"value":95478},"3. Map data flows",{"type":17,"tag":29,"props":95480,"children":95481},{},[95482],{"type":23,"value":95483},"Define:",{"type":17,"tag":80,"props":95485,"children":95486},{},[95487,95492,95497],{"type":17,"tag":84,"props":95488,"children":95489},{},[95490],{"type":23,"value":95491},"which objects move where",{"type":17,"tag":84,"props":95493,"children":95494},{},[95495],{"type":23,"value":95496},"how fields map",{"type":17,"tag":84,"props":95498,"children":95499},{},[95500],{"type":23,"value":95501},"what triggers updates",{"type":17,"tag":239,"props":95503,"children":95505},{"id":95504},"_4-set-up-authentication",[95506],{"type":23,"value":95507},"4. Set up authentication",{"type":17,"tag":29,"props":95509,"children":95510},{},[95511],{"type":23,"value":95512},"Use:",{"type":17,"tag":80,"props":95514,"children":95515},{},[95516,95521,95525],{"type":17,"tag":84,"props":95517,"children":95518},{},[95519],{"type":23,"value":95520},"OAuth 2.0",{"type":17,"tag":84,"props":95522,"children":95523},{},[95524],{"type":23,"value":39832},{"type":17,"tag":84,"props":95526,"children":95527},{},[95528],{"type":23,"value":95529},"secure credential storage",{"type":17,"tag":239,"props":95531,"children":95533},{"id":95532},"_5-build-and-test",[95534],{"type":23,"value":95535},"5. Build and test",{"type":17,"tag":80,"props":95537,"children":95538},{},[95539,95544,95549],{"type":17,"tag":84,"props":95540,"children":95541},{},[95542],{"type":23,"value":95543},"use sandbox environments",{"type":17,"tag":84,"props":95545,"children":95546},{},[95547],{"type":23,"value":95548},"test edge cases",{"type":17,"tag":84,"props":95550,"children":95551},{},[95552],{"type":23,"value":95553},"validate data consistency",{"type":17,"tag":239,"props":95555,"children":95557},{"id":95556},"_6-monitor-and-iterate",[95558],{"type":23,"value":95559},"6. Monitor and iterate",{"type":17,"tag":80,"props":95561,"children":95562},{},[95563,95568,95573],{"type":17,"tag":84,"props":95564,"children":95565},{},[95566],{"type":23,"value":95567},"track failures",{"type":17,"tag":84,"props":95569,"children":95570},{},[95571],{"type":23,"value":95572},"monitor performance",{"type":17,"tag":84,"props":95574,"children":95575},{},[95576],{"type":23,"value":95577},"improve over time",{"type":17,"tag":68,"props":95579,"children":95581},{"id":95580},"saas-integration-best-practices",[95582],{"type":23,"value":95583},"SaaS integration best practices",{"type":17,"tag":29,"props":95585,"children":95586},{},[95587],{"type":17,"tag":48,"props":95588,"children":95589},{},[95590],{"type":23,"value":95591},"Start with high-impact integrations",{"type":17,"tag":29,"props":95593,"children":95594},{},[95595],{"type":23,"value":95596},"Focus on integrations that unlock real value for users.",{"type":17,"tag":29,"props":95598,"children":95599},{},[95600],{"type":17,"tag":48,"props":95601,"children":95602},{},[95603],{"type":23,"value":95604},"Design for scale",{"type":17,"tag":29,"props":95606,"children":95607},{},[95608],{"type":23,"value":95609},"Avoid one-off integrations. Plan for many.",{"type":17,"tag":29,"props":95611,"children":95612},{},[95613],{"type":17,"tag":48,"props":95614,"children":95615},{},[95616],{"type":23,"value":95617},"Prioritize real-time where possible",{"type":17,"tag":29,"props":95619,"children":95620},{},[95621],{"type":23,"value":95622},"Polling-based systems create downstream issues.",{"type":17,"tag":29,"props":95624,"children":95625},{},[95626],{"type":17,"tag":48,"props":95627,"children":95628},{},[95629],{"type":23,"value":95630},"Centralize authentication",{"type":17,"tag":29,"props":95632,"children":95633},{},[95634],{"type":23,"value":95635},"OAuth should not be handled differently per integration.",{"type":17,"tag":29,"props":95637,"children":95638},{},[95639],{"type":17,"tag":48,"props":95640,"children":95641},{},[95642],{"type":23,"value":95643},"Invest in observability",{"type":17,"tag":29,"props":95645,"children":95646},{},[95647],{"type":23,"value":820},{"type":17,"tag":80,"props":95649,"children":95650},{},[95651,95655,95660],{"type":17,"tag":84,"props":95652,"children":95653},{},[95654],{"type":23,"value":36965},{"type":17,"tag":84,"props":95656,"children":95657},{},[95658],{"type":23,"value":95659},"token issues",{"type":17,"tag":84,"props":95661,"children":95662},{},[95663],{"type":23,"value":95664},"API errors",{"type":17,"tag":29,"props":95666,"children":95667},{},[95668],{"type":17,"tag":48,"props":95669,"children":95670},{},[95671],{"type":23,"value":95672},"Minimize data storage",{"type":17,"tag":29,"props":95674,"children":95675},{},[95676],{"type":23,"value":95677},"Less stored data means less risk and easier compliance.",{"type":17,"tag":68,"props":95679,"children":95681},{"id":95680},"the-future-of-saas-integration",[95682],{"type":23,"value":95683},"The future of SaaS integration",{"type":17,"tag":239,"props":95685,"children":95687},{"id":95686},"_1-ai-native-integrations",[95688],{"type":23,"value":95689},"1. AI-native integrations",{"type":17,"tag":29,"props":95691,"children":95692},{},[95693],{"type":23,"value":95694},"AI agents require:",{"type":17,"tag":80,"props":95696,"children":95697},{},[95698,95702,95707],{"type":17,"tag":84,"props":95699,"children":95700},{},[95701],{"type":23,"value":69988},{"type":17,"tag":84,"props":95703,"children":95704},{},[95705],{"type":23,"value":95706},"structured tools",{"type":17,"tag":84,"props":95708,"children":95709},{},[95710],{"type":23,"value":95711},"reliable write actions",{"type":17,"tag":239,"props":95713,"children":95715},{"id":95714},"_2-event-driven-architectures",[95716],{"type":23,"value":95717},"2. Event-driven architectures",{"type":17,"tag":29,"props":95719,"children":95720},{},[95721],{"type":23,"value":95722},"Webhooks and streaming will replace polling.",{"type":17,"tag":239,"props":95724,"children":95726},{"id":95725},"_3-zero-storage-and-compliance-first-design",[95727],{"type":23,"value":95728},"3. Zero-storage and compliance-first design",{"type":17,"tag":29,"props":95730,"children":95731},{},[95732],{"type":23,"value":95733},"Regulations will push architectures toward:",{"type":17,"tag":80,"props":95735,"children":95736},{},[95737,95741],{"type":17,"tag":84,"props":95738,"children":95739},{},[95740],{"type":23,"value":94304},{"type":17,"tag":84,"props":95742,"children":95743},{},[95744],{"type":23,"value":95745},"stronger security boundaries",{"type":17,"tag":239,"props":95747,"children":95749},{"id":95748},"_4-unified-integration-layers",[95750],{"type":23,"value":95751},"4. Unified integration layers",{"type":17,"tag":29,"props":95753,"children":95754},{},[95755],{"type":23,"value":95756},"Instead of building integrations repeatedly, products will rely on a shared infrastructure layer.",{"type":17,"tag":68,"props":95758,"children":95760},{"id":95759},"faq",[95761],{"type":23,"value":95762},"FAQ",{"type":17,"tag":239,"props":95764,"children":95766},{"id":95765},"what-is-the-difference-between-saas-integration-and-api-integration",[95767],{"type":23,"value":95768},"What is the difference between SaaS integration and API integration?",{"type":17,"tag":29,"props":95770,"children":95771},{},[95772],{"type":23,"value":95773},"SaaS integration focuses on connecting cloud applications. API integration is broader and can include on-prem systems.",{"type":17,"tag":239,"props":95775,"children":95777},{"id":95776},"should-i-build-or-buy-integrations",[95778],{"type":23,"value":95779},"Should I build or buy integrations?",{"type":17,"tag":29,"props":95781,"children":95782},{},[95783],{"type":23,"value":95784},"Build if you need a few deep integrations. Buy (Unified API) if you need scale.",{"type":17,"tag":239,"props":95786,"children":95788},{"id":95787},"what-is-the-best-saas-integration-platform",[95789],{"type":23,"value":95790},"What is the best SaaS integration platform?",{"type":17,"tag":80,"props":95792,"children":95793},{},[95794,95799,95804],{"type":17,"tag":84,"props":95795,"children":95796},{},[95797],{"type":23,"value":95798},"iPaaS for internal workflows",{"type":17,"tag":84,"props":95800,"children":95801},{},[95802],{"type":23,"value":95803},"Unified APIs for product integrations",{"type":17,"tag":84,"props":95805,"children":95806},{},[95807,95809,95814],{"type":23,"value":95808},"real-time platforms like ",{"type":17,"tag":133,"props":95810,"children":95812},{"href":212,"rel":95811},[214],[95813],{"type":23,"value":217},{"type":23,"value":95815}," for modern SaaS and AI use cases",{"type":17,"tag":239,"props":95817,"children":95819},{"id":95818},"how-do-i-ensure-security",[95820],{"type":23,"value":95821},"How do I ensure security?",{"type":17,"tag":80,"props":95823,"children":95824},{},[95825,95830,95835,95840],{"type":17,"tag":84,"props":95826,"children":95827},{},[95828],{"type":23,"value":95829},"use OAuth 2.0",{"type":17,"tag":84,"props":95831,"children":95832},{},[95833],{"type":23,"value":95834},"encrypt credentials",{"type":17,"tag":84,"props":95836,"children":95837},{},[95838],{"type":23,"value":95839},"minimize stored data",{"type":17,"tag":84,"props":95841,"children":95842},{},[95843],{"type":23,"value":95844},"use compliant infrastructure",{"type":17,"tag":68,"props":95846,"children":95847},{"id":1552},[95848],{"type":23,"value":1555},{"type":17,"tag":29,"props":95850,"children":95851},{},[95852],{"type":23,"value":95853},"SaaS integration is no longer optional. It is core infrastructure for any modern product.",{"type":17,"tag":29,"props":95855,"children":95856},{},[95857],{"type":23,"value":95858},"The challenge is not connecting one API. It is supporting dozens or hundreds reliably.",{"type":17,"tag":29,"props":95860,"children":95861},{},[95862],{"type":23,"value":95863},"Most teams start by building integrations themselves. Over time, the cost shifts from development to maintenance, and integrations become a bottleneck instead of a feature.",{"type":17,"tag":29,"props":95865,"children":95866},{},[95867,95869,95874],{"type":23,"value":95868},"Unified APIs solve that problem. And real-time, zero-storage platforms like ",{"type":17,"tag":133,"props":95870,"children":95872},{"href":212,"rel":95871},[214],[95873],{"type":23,"value":217},{"type":23,"value":95875}," go further by making integrations scalable, secure, and usable for modern workflows and AI systems.",{"type":17,"tag":29,"props":95877,"children":95878},{},[95879,95880],{"type":23,"value":1609},{"type":17,"tag":133,"props":95881,"children":95883},{"href":1612,"rel":95882},[214],[95884],{"type":23,"value":1616},{"type":17,"tag":29,"props":95886,"children":95887},{},[95888,95889],{"type":23,"value":1609},{"type":17,"tag":133,"props":95890,"children":95892},{"href":1623,"rel":95891},[214],[95893],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":95895},[95896,95897,95900,95907,95914,95919,95922,95929,95937,95938,95944,95950],{"id":94406,"depth":1629,"text":94409},{"id":94473,"depth":1629,"text":94476,"children":95898},[95899],{"id":94489,"depth":1635,"text":94492},{"id":94560,"depth":1629,"text":94563,"children":95901},[95902,95903,95904,95905,95906],{"id":94566,"depth":1635,"text":94569},{"id":94588,"depth":1635,"text":94591},{"id":94624,"depth":1635,"text":94627},{"id":94647,"depth":1635,"text":94650},{"id":94672,"depth":1635,"text":94675},{"id":94699,"depth":1629,"text":94702,"children":95908},[95909,95910,95911,95912,95913],{"id":94705,"depth":1635,"text":94708},{"id":94748,"depth":1635,"text":94751},{"id":94799,"depth":1635,"text":94802},{"id":94831,"depth":1635,"text":94834},{"id":94863,"depth":1635,"text":94866},{"id":94895,"depth":1629,"text":94898,"children":95915},[95916,95917,95918],{"id":94901,"depth":1635,"text":94904},{"id":94978,"depth":1635,"text":94981},{"id":95080,"depth":1635,"text":95083},{"id":95180,"depth":1629,"text":95183,"children":95920},[95921],{"id":95216,"depth":1635,"text":95219},{"id":95259,"depth":1629,"text":95262,"children":95923},[95924,95925,95926,95927,95928],{"id":13402,"depth":1635,"text":69681},{"id":90302,"depth":1635,"text":43670},{"id":95321,"depth":1635,"text":95324},{"id":63136,"depth":1635,"text":63139},{"id":15879,"depth":1635,"text":15882},{"id":95421,"depth":1629,"text":95424,"children":95930},[95931,95932,95933,95934,95935,95936],{"id":95427,"depth":1635,"text":95430},{"id":95451,"depth":1635,"text":95454},{"id":95475,"depth":1635,"text":95478},{"id":95504,"depth":1635,"text":95507},{"id":95532,"depth":1635,"text":95535},{"id":95556,"depth":1635,"text":95559},{"id":95580,"depth":1629,"text":95583},{"id":95680,"depth":1629,"text":95683,"children":95939},[95940,95941,95942,95943],{"id":95686,"depth":1635,"text":95689},{"id":95714,"depth":1635,"text":95717},{"id":95725,"depth":1635,"text":95728},{"id":95748,"depth":1635,"text":95751},{"id":95759,"depth":1629,"text":95762,"children":95945},[95946,95947,95948,95949],{"id":95765,"depth":1635,"text":95768},{"id":95776,"depth":1635,"text":95779},{"id":95787,"depth":1635,"text":95790},{"id":95818,"depth":1635,"text":95821},{"id":1552,"depth":1629,"text":1555},"content:blog:saas_integration_everything_you_need_to_know_strategies_platforms_and_best_practices.md","blog/saas_integration_everything_you_need_to_know_strategies_platforms_and_best_practices.md","blog/saas_integration_everything_you_need_to_know_strategies_platforms_and_best_practices",{"_path":95955,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":46421,"description":95956,"img":95957,"date":95958,"tag":12,"body":95959,"_type":1677,"_id":96895,"_source":1679,"_file":96896,"_stem":96897,"_extension":1682},"/blog/real_time_data_pipelines_vs_etl_what_modern_saas_systems_actually_need","Data integration has traditionally relied on ETL pipelines to move data between systems. These pipelines extract data from a source, transform it, and load it...","https://s3.us-east-2.amazonaws.com/unified-article-images/real_time_data_pipelines_vs_etl_what_modern_saas_systems_actually_need-icon.png","2026-03-09T19:17:00.000Z",{"type":14,"children":95960,"toc":96868},[95961,95966,95969,95976,95988,96006,96011,96016,96022,96030,96042,96047,96088,96094,96105,96110,96148,96154,96164,96168,96279,96307,96313,96318,96324,96329,96335,96340,96346,96351,96363,96369,96374,96384,96389,96395,96411,96415,96438,96444,96449,96454,96460,96601,96607,96612,96618,96623,96641,96647,96652,96670,96676,96681,96687,96697,96703,96708,96726,96732,96744,96748,96753,96775,96781,96786,96791,96826,96832,96837,96842,96847,96852,96860],{"type":17,"tag":18,"props":95962,"children":95964},{"id":95963},"real-time-data-pipelines-vs-etl-what-modern-saas-systems-actually-need",[95965],{"type":23,"value":46421},{"type":17,"tag":25,"props":95967,"children":95968},{},[],{"type":17,"tag":29,"props":95970,"children":95971},{},[95972],{"type":17,"tag":33,"props":95973,"children":95974},{},[95975],{"type":23,"value":37},{"type":17,"tag":29,"props":95977,"children":95978},{},[95979,95981,95986],{"type":23,"value":95980},"Data integration has traditionally relied on ",{"type":17,"tag":48,"props":95982,"children":95983},{},[95984],{"type":23,"value":95985},"ETL pipelines",{"type":23,"value":95987}," to move data between systems. These pipelines extract data from a source, transform it, and load it into a warehouse or database where it can be queried and analyzed.",{"type":17,"tag":29,"props":95989,"children":95990},{},[95991,95993,95998,96000,96004],{"type":23,"value":95992},"But as modern applications and AI systems increasingly depend on ",{"type":17,"tag":48,"props":95994,"children":95995},{},[95996],{"type":23,"value":95997},"live operational data",{"type":23,"value":95999},", many teams are shifting toward ",{"type":17,"tag":48,"props":96001,"children":96002},{},[96003],{"type":23,"value":95399},{"type":23,"value":96005}," that deliver updates as they occur rather than hours later.",{"type":17,"tag":29,"props":96007,"children":96008},{},[96009],{"type":23,"value":96010},"Understanding the difference between ETL pipelines and real-time data pipelines is critical when designing modern data architecture. Each approach solves a different class of problems, and the wrong choice can introduce latency, operational complexity, and data freshness issues.",{"type":17,"tag":29,"props":96012,"children":96013},{},[96014],{"type":23,"value":96015},"This guide explains how traditional ETL systems work, how modern pipelines evolved, and when real-time architectures provide a better foundation for application development.",{"type":17,"tag":68,"props":96017,"children":96019},{"id":96018},"what-etl-is",[96020],{"type":23,"value":96021},"What ETL Is",{"type":17,"tag":29,"props":96023,"children":96024},{},[96025],{"type":17,"tag":48,"props":96026,"children":96027},{},[96028],{"type":23,"value":96029},"ETL stands for Extract, Transform, Load.",{"type":17,"tag":29,"props":96031,"children":96032},{},[96033,96035,96040],{"type":23,"value":96034},"The model emerged to support ",{"type":17,"tag":48,"props":96036,"children":96037},{},[96038],{"type":23,"value":96039},"enterprise data warehousing",{"type":23,"value":96041},". Data from operational systems is periodically extracted, transformed into a consistent format, and loaded into a centralized warehouse where it can be queried for reporting and analysis.",{"type":17,"tag":29,"props":96043,"children":96044},{},[96045],{"type":23,"value":96046},"Traditional ETL tools include platforms such as:",{"type":17,"tag":80,"props":96048,"children":96049},{},[96050,96055,96060,96064,96068],{"type":17,"tag":84,"props":96051,"children":96052},{},[96053],{"type":23,"value":96054},"Informatica PowerCenter",{"type":17,"tag":84,"props":96056,"children":96057},{},[96058],{"type":23,"value":96059},"Talend Data Integration",{"type":17,"tag":84,"props":96061,"children":96062},{},[96063],{"type":23,"value":937},{"type":17,"tag":84,"props":96065,"children":96066},{},[96067],{"type":23,"value":947},{"type":17,"tag":84,"props":96069,"children":96070},{},[96071,96073,96076,96078,96081,96083,96086],{"type":23,"value":96072},"Snowflake ingestion pipelines (Snowpipe)",{"type":17,"tag":3891,"props":96074,"children":96075},{},[],{"type":23,"value":96077},"While these tools differ in implementation, their architecture typically follows the same pattern:",{"type":17,"tag":3891,"props":96079,"children":96080},{},[],{"type":23,"value":96082},"Source system → extraction job → transformation pipeline → destination warehouse",{"type":17,"tag":3891,"props":96084,"children":96085},{},[],{"type":23,"value":96087},"The result is a centralized data store optimized for analytics rather than operational application use.",{"type":17,"tag":68,"props":96089,"children":96091},{"id":96090},"how-traditional-etl-platforms-work",[96092],{"type":23,"value":96093},"How Traditional ETL Platforms Work",{"type":17,"tag":29,"props":96095,"children":96096},{},[96097,96099,96104],{"type":23,"value":96098},"Most ETL tools follow a ",{"type":17,"tag":48,"props":96100,"children":96101},{},[96102],{"type":23,"value":96103},"batch-oriented architecture",{"type":23,"value":54},{"type":17,"tag":29,"props":96106,"children":96107},{},[96108],{"type":23,"value":96109},"A typical workflow looks like this:",{"type":17,"tag":6154,"props":96111,"children":96112},{},[96113,96118,96123],{"type":17,"tag":84,"props":96114,"children":96115},{},[96116],{"type":23,"value":96117},"Data is extracted from operational systems such as CRMs, ERPs, or APIs",{"type":17,"tag":84,"props":96119,"children":96120},{},[96121],{"type":23,"value":96122},"The pipeline transforms the data using mapping rules or SQL logic",{"type":17,"tag":84,"props":96124,"children":96125},{},[96126,96128,96131,96133,96136,96138,96141,96143],{"type":23,"value":96127},"The results are loaded into a destination warehouse",{"type":17,"tag":3891,"props":96129,"children":96130},{},[],{"type":23,"value":96132},"Platforms such as Informatica PowerCenter and Talend orchestrate these workflows using scheduled jobs. Developers define transformation pipelines and configure jobs to run hourly, daily, or on other intervals.",{"type":17,"tag":3891,"props":96134,"children":96135},{},[],{"type":23,"value":96137},"Modern ELT tools like Fivetran and Airbyte shifted some transformation work into the warehouse itself. Instead of transforming data before loading it, they load raw data first and apply transformations later using SQL or tools like dbt.",{"type":17,"tag":3891,"props":96139,"children":96140},{},[],{"type":23,"value":96142},"Despite this evolution, the core architecture remains the same: ",{"type":17,"tag":48,"props":96144,"children":96145},{},[96146],{"type":23,"value":96147},"data is replicated into a storage layer before applications can access it.",{"type":17,"tag":68,"props":96149,"children":96151},{"id":96150},"why-etl-introduces-latency",[96152],{"type":23,"value":96153},"Why ETL Introduces Latency",{"type":17,"tag":29,"props":96155,"children":96156},{},[96157,96159,96163],{"type":23,"value":96158},"Because ETL pipelines rely on scheduled execution, ",{"type":17,"tag":48,"props":96160,"children":96161},{},[96162],{"type":23,"value":9856},{"type":23,"value":54},{"type":17,"tag":29,"props":96165,"children":96166},{},[96167],{"type":23,"value":3258},{"type":17,"tag":7231,"props":96169,"children":96170},{},[96171,96187],{"type":17,"tag":7235,"props":96172,"children":96173},{},[96174],{"type":17,"tag":7239,"props":96175,"children":96176},{},[96177,96182],{"type":17,"tag":7243,"props":96178,"children":96179},{},[96180],{"type":23,"value":96181},"Sync Frequency",{"type":17,"tag":7243,"props":96183,"children":96184},{},[96185],{"type":23,"value":96186},"Average Data Delay",{"type":17,"tag":7259,"props":96188,"children":96189},{},[96190,96203,96216,96229,96241,96258,96269],{"type":17,"tag":7239,"props":96191,"children":96192},{},[96193,96198],{"type":17,"tag":7266,"props":96194,"children":96195},{},[96196],{"type":23,"value":96197},"1 minute",{"type":17,"tag":7266,"props":96199,"children":96200},{},[96201],{"type":23,"value":96202},"~30 seconds",{"type":17,"tag":7239,"props":96204,"children":96205},{},[96206,96211],{"type":17,"tag":7266,"props":96207,"children":96208},{},[96209],{"type":23,"value":96210},"15 minutes",{"type":17,"tag":7266,"props":96212,"children":96213},{},[96214],{"type":23,"value":96215},"~7.5 minutes",{"type":17,"tag":7239,"props":96217,"children":96218},{},[96219,96224],{"type":17,"tag":7266,"props":96220,"children":96221},{},[96222],{"type":23,"value":96223},"1 hour",{"type":17,"tag":7266,"props":96225,"children":96226},{},[96227],{"type":23,"value":96228},"~30 minutes",{"type":17,"tag":7239,"props":96230,"children":96231},{},[96232,96236],{"type":17,"tag":7266,"props":96233,"children":96234},{},[96235],{"type":23,"value":70487},{"type":17,"tag":7266,"props":96237,"children":96238},{},[96239],{"type":23,"value":96240},"~12 hours",{"type":17,"tag":7239,"props":96242,"children":96243},{},[96244,96255],{"type":17,"tag":7266,"props":96245,"children":96246},{},[96247,96249,96253],{"type":23,"value":96248},"Even when using incremental sync or Change Data Capture (CDC), the data typically lands in the warehouse in ",{"type":17,"tag":48,"props":96250,"children":96251},{},[96252],{"type":23,"value":91959},{"type":23,"value":96254},", not instantly.",{"type":17,"tag":7266,"props":96256,"children":96257},{},[],{"type":17,"tag":7239,"props":96259,"children":96260},{},[96261,96266],{"type":17,"tag":7266,"props":96262,"children":96263},{},[96264],{"type":23,"value":96265},"This model works well for analytics workloads but creates problems for operational applications where users expect up-to-date data.",{"type":17,"tag":7266,"props":96267,"children":96268},{},[],{"type":17,"tag":7239,"props":96270,"children":96271},{},[96272,96276],{"type":17,"tag":7266,"props":96273,"children":96274},{},[96275],{"type":23,"value":52846},{"type":17,"tag":7266,"props":96277,"children":96278},{},[],{"type":17,"tag":80,"props":96280,"children":96281},{},[96282,96287,96292,96297],{"type":17,"tag":84,"props":96283,"children":96284},{},[96285],{"type":23,"value":96286},"stale dashboards",{"type":17,"tag":84,"props":96288,"children":96289},{},[96290],{"type":23,"value":96291},"delayed notifications",{"type":17,"tag":84,"props":96293,"children":96294},{},[96295],{"type":23,"value":96296},"outdated records",{"type":17,"tag":84,"props":96298,"children":96299},{},[96300,96302,96305],{"type":23,"value":96301},"inconsistent system state",{"type":17,"tag":3891,"props":96303,"children":96304},{},[],{"type":23,"value":96306},"The problem becomes more pronounced when pipelines run infrequently, which is still common in many environments.",{"type":17,"tag":68,"props":96308,"children":96310},{"id":96309},"how-modern-elt-and-cdc-changed-the-model",[96311],{"type":23,"value":96312},"How Modern ELT and CDC Changed the Model",{"type":17,"tag":29,"props":96314,"children":96315},{},[96316],{"type":23,"value":96317},"Modern data platforms introduced several improvements over traditional ETL.",{"type":17,"tag":239,"props":96319,"children":96321},{"id":96320},"change-data-capture-cdc",[96322],{"type":23,"value":96323},"Change Data Capture (CDC)",{"type":17,"tag":29,"props":96325,"children":96326},{},[96327],{"type":23,"value":96328},"Instead of re-extracting entire tables, CDC captures changes directly from database transaction logs. Platforms like Fivetran and Airbyte use CDC to replicate updates more efficiently while minimizing load on the source system.",{"type":17,"tag":239,"props":96330,"children":96332},{"id":96331},"micro-batch-ingestion",[96333],{"type":23,"value":96334},"Micro-batch ingestion",{"type":17,"tag":29,"props":96336,"children":96337},{},[96338],{"type":23,"value":96339},"Services like Snowpipe process new files automatically as they arrive in cloud storage, reducing latency compared with scheduled bulk loads.",{"type":17,"tag":239,"props":96341,"children":96343},{"id":96342},"streaming-ingestion",[96344],{"type":23,"value":96345},"Streaming ingestion",{"type":17,"tag":29,"props":96347,"children":96348},{},[96349],{"type":23,"value":96350},"Streaming ingestion allows applications to send data continuously with low latency rather than waiting for scheduled jobs.",{"type":17,"tag":29,"props":96352,"children":96353},{},[96354,96356,96361],{"type":23,"value":96355},"These improvements reduce lag, but they still rely on a ",{"type":17,"tag":48,"props":96357,"children":96358},{},[96359],{"type":23,"value":96360},"replication model",{"type":23,"value":96362}," where data is copied into a storage layer before it becomes usable. That distinction matters for operational systems.",{"type":17,"tag":68,"props":96364,"children":96366},{"id":96365},"what-real-time-data-pipelines-are",[96367],{"type":23,"value":96368},"What Real-Time Data Pipelines Are",{"type":17,"tag":29,"props":96370,"children":96371},{},[96372],{"type":23,"value":96373},"Real-time pipelines take a different architectural approach.",{"type":17,"tag":29,"props":96375,"children":96376},{},[96377,96379],{"type":23,"value":96378},"Instead of replicating data into a warehouse, ",{"type":17,"tag":48,"props":96380,"children":96381},{},[96382],{"type":23,"value":96383},"data is accessed directly from the source system when it is needed or delivered immediately when changes occur.",{"type":17,"tag":29,"props":96385,"children":96386},{},[96387],{"type":23,"value":96388},"There are two common forms of real-time pipelines:",{"type":17,"tag":239,"props":96390,"children":96392},{"id":96391},"event-driven-pipelines",[96393],{"type":23,"value":96394},"Event-driven pipelines",{"type":17,"tag":29,"props":96396,"children":96397},{},[96398,96400,96409],{"type":23,"value":96399},"These rely on ",{"type":17,"tag":48,"props":96401,"children":96402},{},[96403,96407],{"type":17,"tag":133,"props":96404,"children":96405},{"href":4999},[96406],{"type":23,"value":5002},{"type":23,"value":96408}," or message queues",{"type":23,"value":96410}," to push updates whenever data changes.",{"type":17,"tag":29,"props":96412,"children":96413},{},[96414],{"type":23,"value":24364},{"type":17,"tag":80,"props":96416,"children":96417},{},[96418,96423,96428],{"type":17,"tag":84,"props":96419,"children":96420},{},[96421],{"type":23,"value":96422},"payment events triggered immediately after transactions",{"type":17,"tag":84,"props":96424,"children":96425},{},[96426],{"type":23,"value":96427},"messaging systems delivering updates within seconds",{"type":17,"tag":84,"props":96429,"children":96430},{},[96431,96433,96436],{"type":23,"value":96432},"application events triggering downstream actions",{"type":17,"tag":3891,"props":96434,"children":96435},{},[],{"type":23,"value":96437},"These pipelines allow systems to react instantly without polling.",{"type":17,"tag":239,"props":96439,"children":96441},{"id":96440},"pass-through-api-access",[96442],{"type":23,"value":96443},"Pass-through API access",{"type":17,"tag":29,"props":96445,"children":96446},{},[96447],{"type":23,"value":96448},"In pass-through architectures, applications request data directly from the source system at runtime rather than reading from a cached copy.",{"type":17,"tag":29,"props":96450,"children":96451},{},[96452],{"type":23,"value":96453},"This ensures that every request reflects the most current state available.",{"type":17,"tag":68,"props":96455,"children":96457},{"id":96456},"real-time-data-pipelines-vs-etl-key-architectural-differences",[96458],{"type":23,"value":96459},"Real-Time Data Pipelines vs ETL: Key Architectural Differences",{"type":17,"tag":7231,"props":96461,"children":96462},{},[96463,96483],{"type":17,"tag":7235,"props":96464,"children":96465},{},[96466],{"type":17,"tag":7239,"props":96467,"children":96468},{},[96469,96473,96478],{"type":17,"tag":7243,"props":96470,"children":96471},{},[96472],{"type":23,"value":9904},{"type":17,"tag":7243,"props":96474,"children":96475},{},[96476],{"type":23,"value":96477},"ETL / ELT Pipelines",{"type":17,"tag":7243,"props":96479,"children":96480},{},[96481],{"type":23,"value":96482},"Real-Time Pipelines",{"type":17,"tag":7259,"props":96484,"children":96485},{},[96486,96504,96522,96539,96556,96574],{"type":17,"tag":7239,"props":96487,"children":96488},{},[96489,96494,96499],{"type":17,"tag":7266,"props":96490,"children":96491},{},[96492],{"type":23,"value":96493},"Data movement",{"type":17,"tag":7266,"props":96495,"children":96496},{},[96497],{"type":23,"value":96498},"Batch extraction and replication",{"type":17,"tag":7266,"props":96500,"children":96501},{},[96502],{"type":23,"value":96503},"On-demand access or event-driven updates",{"type":17,"tag":7239,"props":96505,"children":96506},{},[96507,96512,96517],{"type":17,"tag":7266,"props":96508,"children":96509},{},[96510],{"type":23,"value":96511},"Storage",{"type":17,"tag":7266,"props":96513,"children":96514},{},[96515],{"type":23,"value":96516},"Data copied into warehouse",{"type":17,"tag":7266,"props":96518,"children":96519},{},[96520],{"type":23,"value":96521},"No intermediate storage required",{"type":17,"tag":7239,"props":96523,"children":96524},{},[96525,96529,96534],{"type":17,"tag":7266,"props":96526,"children":96527},{},[96528],{"type":23,"value":9236},{"type":17,"tag":7266,"props":96530,"children":96531},{},[96532],{"type":23,"value":96533},"Minutes to hours (or days)",{"type":17,"tag":7266,"props":96535,"children":96536},{},[96537],{"type":23,"value":96538},"Seconds or milliseconds",{"type":17,"tag":7239,"props":96540,"children":96541},{},[96542,96546,96551],{"type":17,"tag":7266,"props":96543,"children":96544},{},[96545],{"type":23,"value":91320},{"type":17,"tag":7266,"props":96547,"children":96548},{},[96549],{"type":23,"value":96550},"Scheduled jobs, staging layers",{"type":17,"tag":7266,"props":96552,"children":96553},{},[96554],{"type":23,"value":96555},"Webhooks or direct API access",{"type":17,"tag":7239,"props":96557,"children":96558},{},[96559,96564,96569],{"type":17,"tag":7266,"props":96560,"children":96561},{},[96562],{"type":23,"value":96563},"Use case",{"type":17,"tag":7266,"props":96565,"children":96566},{},[96567],{"type":23,"value":96568},"Analytics and reporting",{"type":17,"tag":7266,"props":96570,"children":96571},{},[96572],{"type":23,"value":96573},"Operational application behavior",{"type":17,"tag":7239,"props":96575,"children":96576},{},[96577,96595,96598],{"type":17,"tag":7266,"props":96578,"children":96579},{},[96580,96582,96587,96589,96594],{"type":23,"value":96581},"ETL pipelines optimize for ",{"type":17,"tag":48,"props":96583,"children":96584},{},[96585],{"type":23,"value":96586},"analytics performance",{"type":23,"value":96588},", while real-time pipelines optimize for ",{"type":17,"tag":48,"props":96590,"children":96591},{},[96592],{"type":23,"value":96593},"responsiveness and live system interaction",{"type":23,"value":54},{"type":17,"tag":7266,"props":96596,"children":96597},{},[],{"type":17,"tag":7266,"props":96599,"children":96600},{},[],{"type":17,"tag":68,"props":96602,"children":96604},{"id":96603},"when-etl-is-the-right-choice",[96605],{"type":23,"value":96606},"When ETL Is the Right Choice",{"type":17,"tag":29,"props":96608,"children":96609},{},[96610],{"type":23,"value":96611},"ETL remains the best architecture for several workloads.",{"type":17,"tag":239,"props":96613,"children":96615},{"id":96614},"analytics-and-bi",[96616],{"type":23,"value":96617},"Analytics and BI",{"type":17,"tag":29,"props":96619,"children":96620},{},[96621],{"type":23,"value":96622},"Data warehouses aggregate historical datasets from multiple systems, enabling:",{"type":17,"tag":80,"props":96624,"children":96625},{},[96626,96631,96636],{"type":17,"tag":84,"props":96627,"children":96628},{},[96629],{"type":23,"value":96630},"complex queries",{"type":17,"tag":84,"props":96632,"children":96633},{},[96634],{"type":23,"value":96635},"reporting dashboards",{"type":17,"tag":84,"props":96637,"children":96638},{},[96639],{"type":23,"value":96640},"business intelligence workflows",{"type":17,"tag":239,"props":96642,"children":96644},{"id":96643},"historical-data-processing",[96645],{"type":23,"value":96646},"Historical data processing",{"type":17,"tag":29,"props":96648,"children":96649},{},[96650],{"type":23,"value":96651},"Batch pipelines are well-suited for:",{"type":17,"tag":80,"props":96653,"children":96654},{},[96655,96660,96665],{"type":17,"tag":84,"props":96656,"children":96657},{},[96658],{"type":23,"value":96659},"long-term data storage",{"type":17,"tag":84,"props":96661,"children":96662},{},[96663],{"type":23,"value":96664},"model training datasets",{"type":17,"tag":84,"props":96666,"children":96667},{},[96668],{"type":23,"value":96669},"financial and operational reporting",{"type":17,"tag":239,"props":96671,"children":96673},{"id":96672},"cross-system-transformations",[96674],{"type":23,"value":96675},"Cross-system transformations",{"type":17,"tag":29,"props":96677,"children":96678},{},[96679],{"type":23,"value":96680},"Large-scale transformations across multiple datasets are often easier to run in a warehouse environment than in real-time systems.",{"type":17,"tag":68,"props":96682,"children":96684},{"id":96683},"when-real-time-pipelines-are-the-better-architecture",[96685],{"type":23,"value":96686},"When Real-Time Pipelines Are the Better Architecture",{"type":17,"tag":29,"props":96688,"children":96689},{},[96690,96692],{"type":23,"value":96691},"Real-time pipelines are increasingly necessary for ",{"type":17,"tag":48,"props":96693,"children":96694},{},[96695],{"type":23,"value":96696},"operational systems and user-facing application behavior.",{"type":17,"tag":239,"props":96698,"children":96700},{"id":96699},"live-application-features",[96701],{"type":23,"value":96702},"Live application features",{"type":17,"tag":29,"props":96704,"children":96705},{},[96706],{"type":23,"value":96707},"Applications that depend on current state require immediate data access, such as:",{"type":17,"tag":80,"props":96709,"children":96710},{},[96711,96716,96721],{"type":17,"tag":84,"props":96712,"children":96713},{},[96714],{"type":23,"value":96715},"updating user-facing dashboards",{"type":17,"tag":84,"props":96717,"children":96718},{},[96719],{"type":23,"value":96720},"triggering in-app actions",{"type":17,"tag":84,"props":96722,"children":96723},{},[96724],{"type":23,"value":96725},"synchronizing state across systems",{"type":17,"tag":239,"props":96727,"children":96729},{"id":96728},"ai-and-agent-workflows",[96730],{"type":23,"value":96731},"AI and agent workflows",{"type":17,"tag":29,"props":96733,"children":96734},{},[96735,96737,96742],{"type":23,"value":96736},"AI systems require ",{"type":17,"tag":48,"props":96738,"children":96739},{},[96740],{"type":23,"value":96741},"fresh, low-latency data",{"type":23,"value":96743}," to function reliably. Delayed data leads to outdated context and degraded performance.",{"type":17,"tag":239,"props":96745,"children":96746},{"id":90876},[96747],{"type":23,"value":90879},{"type":17,"tag":29,"props":96749,"children":96750},{},[96751],{"type":23,"value":96752},"Modern systems often rely on immediate triggers:",{"type":17,"tag":80,"props":96754,"children":96755},{},[96756,96761,96765],{"type":17,"tag":84,"props":96757,"children":96758},{},[96759],{"type":23,"value":96760},"state changes",{"type":17,"tag":84,"props":96762,"children":96763},{},[96764],{"type":23,"value":82494},{"type":17,"tag":84,"props":96766,"children":96767},{},[96768,96770,96773],{"type":23,"value":96769},"user actions",{"type":17,"tag":3891,"props":96771,"children":96772},{},[],{"type":23,"value":96774},"Event-driven pipelines enable immediate responses without polling delays.",{"type":17,"tag":68,"props":96776,"children":96778},{"id":96777},"why-ai-and-modern-applications-are-moving-beyond-batch-data",[96779],{"type":23,"value":96780},"Why AI and Modern Applications Are Moving Beyond Batch Data",{"type":17,"tag":29,"props":96782,"children":96783},{},[96784],{"type":23,"value":96785},"The shift toward AI-driven and real-time applications is accelerating the move away from batch architectures.",{"type":17,"tag":29,"props":96787,"children":96788},{},[96789],{"type":23,"value":96790},"These systems require:",{"type":17,"tag":80,"props":96792,"children":96793},{},[96794,96799,96804],{"type":17,"tag":84,"props":96795,"children":96796},{},[96797],{"type":23,"value":96798},"continuously updated data",{"type":17,"tag":84,"props":96800,"children":96801},{},[96802],{"type":23,"value":96803},"low-latency access",{"type":17,"tag":84,"props":96805,"children":96806},{},[96807,96809,96812,96814,96817,96819,96824],{"type":23,"value":96808},"consistent system state",{"type":17,"tag":3891,"props":96810,"children":96811},{},[],{"type":23,"value":96813},"Batch pipelines, even when optimized, cannot fully meet these requirements.",{"type":17,"tag":3891,"props":96815,"children":96816},{},[],{"type":23,"value":96818},"As a result, many teams are adopting architectures that prioritize ",{"type":17,"tag":48,"props":96820,"children":96821},{},[96822],{"type":23,"value":96823},"real-time access and event-driven updates",{"type":23,"value":96825}," to support modern application behavior.",{"type":17,"tag":68,"props":96827,"children":96829},{"id":96828},"the-bottom-line",[96830],{"type":23,"value":96831},"The Bottom Line",{"type":17,"tag":29,"props":96833,"children":96834},{},[96835],{"type":23,"value":96836},"ETL pipelines and real-time data pipelines solve fundamentally different problems.",{"type":17,"tag":29,"props":96838,"children":96839},{},[96840],{"type":23,"value":96841},"ETL remains essential for analytics, reporting, and large-scale historical data processing.",{"type":17,"tag":29,"props":96843,"children":96844},{},[96845],{"type":23,"value":96846},"Real-time pipelines are better suited for operational systems where applications must interact with live data and respond immediately to change.",{"type":17,"tag":29,"props":96848,"children":96849},{},[96850],{"type":23,"value":96851},"As modern software increasingly depends on real-time context, data architectures are evolving toward models that minimize latency and maximize responsiveness. Understanding these differences allows teams to design systems that align with how their applications actually use data.",{"type":17,"tag":29,"props":96853,"children":96854},{},[96855],{"type":17,"tag":133,"props":96856,"children":96858},{"href":1612,"rel":96857},[214],[96859],{"type":23,"value":44481},{"type":17,"tag":29,"props":96861,"children":96862},{},[96863],{"type":17,"tag":133,"props":96864,"children":96866},{"href":1623,"rel":96865},[214],[96867],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":96869},[96870,96871,96872,96873,96878,96882,96883,96888,96893,96894],{"id":96018,"depth":1629,"text":96021},{"id":96090,"depth":1629,"text":96093},{"id":96150,"depth":1629,"text":96153},{"id":96309,"depth":1629,"text":96312,"children":96874},[96875,96876,96877],{"id":96320,"depth":1635,"text":96323},{"id":96331,"depth":1635,"text":96334},{"id":96342,"depth":1635,"text":96345},{"id":96365,"depth":1629,"text":96368,"children":96879},[96880,96881],{"id":96391,"depth":1635,"text":96394},{"id":96440,"depth":1635,"text":96443},{"id":96456,"depth":1629,"text":96459},{"id":96603,"depth":1629,"text":96606,"children":96884},[96885,96886,96887],{"id":96614,"depth":1635,"text":96617},{"id":96643,"depth":1635,"text":96646},{"id":96672,"depth":1635,"text":96675},{"id":96683,"depth":1629,"text":96686,"children":96889},[96890,96891,96892],{"id":96699,"depth":1635,"text":96702},{"id":96728,"depth":1635,"text":96731},{"id":90876,"depth":1635,"text":90879},{"id":96777,"depth":1629,"text":96780},{"id":96828,"depth":1629,"text":96831},"content:blog:real_time_data_pipelines_vs_etl_what_modern_saas_systems_actually_need.md","blog/real_time_data_pipelines_vs_etl_what_modern_saas_systems_actually_need.md","blog/real_time_data_pipelines_vs_etl_what_modern_saas_systems_actually_need",{"_path":96899,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":96900,"description":96901,"img":96902,"date":96903,"tag":12,"body":96904,"_type":1677,"_id":98712,"_source":1679,"_file":98713,"_stem":98714,"_extension":1682},"/blog/how_to_integrate_with_microsoft_outlook","How to Integrate with Microsoft Outlook","If your product needs inbox access, email sending, scheduling, or calendar sync, a Microsoft Outlook API integration usually means building on Microsoft Graph....","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with_microsoft_outlook-icon.png","2026-03-05T21:54:00.000Z",{"type":14,"children":96905,"toc":98676},[96906,96911,96914,96922,96941,96960,96964,96985,97006,97012,97018,97051,97056,97062,97089,97094,97119,97125,97130,97213,97218,97224,97235,97240,97287,97299,97346,97358,97364,97370,97375,97384,97433,97439,97444,97453,97458,97467,97497,97503,97508,97517,97538,97544,97549,97558,97577,97583,97588,97597,97602,97608,97613,97622,97627,97636,97649,97655,97660,97669,97674,97683,97696,97702,97708,97720,97725,97734,97739,97748,97753,97790,97795,97801,97850,97855,97884,97902,97908,97934,97939,97945,97950,97998,98003,98008,98014,98019,98025,98030,98038,98043,98064,98069,98181,98213,98219,98224,98249,98261,98267,98272,98293,98298,98307,98312,98321,98326,98335,98341,98346,98374,98378,98383,98392,98397,98406,98411,98420,98425,98434,98440,98480,98486,98491,98532,98537,98541,98547,98570,98575,98603,98607,98612,98617,98650,98655,98660,98668],{"type":17,"tag":18,"props":96907,"children":96909},{"id":96908},"how-to-integrate-with-microsoft-outlook",[96910],{"type":23,"value":96900},{"type":17,"tag":25,"props":96912,"children":96913},{},[],{"type":17,"tag":29,"props":96915,"children":96916},{},[96917],{"type":17,"tag":33,"props":96918,"children":96919},{},[96920],{"type":23,"value":96921},"March 5, 2026",{"type":17,"tag":29,"props":96923,"children":96924},{},[96925,96927,96932,96934,96939],{"type":23,"value":96926},"If your product needs inbox access, email sending, scheduling, or calendar sync, a ",{"type":17,"tag":48,"props":96928,"children":96929},{},[96930],{"type":23,"value":96931},"Microsoft Outlook API integration",{"type":23,"value":96933}," usually means building on ",{"type":17,"tag":48,"props":96935,"children":96936},{},[96937],{"type":23,"value":96938},"Microsoft Graph",{"type":23,"value":96940},". That gives you access to mail folders, messages, calendars, events, and change notifications across Microsoft 365 accounts.",{"type":17,"tag":29,"props":96942,"children":96943},{},[96944,96946,96952,96954,96958],{"type":23,"value":96945},"But a production-grade Outlook integration involves more than calling ",{"type":17,"tag":6121,"props":96947,"children":96949},{"className":96948},[],[96950],{"type":23,"value":96951},"/me/messages",{"type":23,"value":96953},". You need to register an app in Microsoft Entra ID, choose the right delegated permissions, implement ",{"type":17,"tag":133,"props":96955,"children":96956},{"href":779},[96957],{"type":23,"value":782},{"type":23,"value":96959}," correctly, decide between delta sync and change notifications, and handle throttling safely.",{"type":17,"tag":29,"props":96961,"children":96962},{},[96963],{"type":23,"value":70164},{"type":17,"tag":6154,"props":96965,"children":96966},{},[96967,96972,96976,96981],{"type":17,"tag":84,"props":96968,"children":96969},{},[96970],{"type":23,"value":96971},"How to integrate directly with Microsoft Graph for Outlook email and calendar",{"type":17,"tag":84,"props":96973,"children":96974},{},[96975],{"type":23,"value":70177},{"type":17,"tag":84,"props":96977,"children":96978},{},[96979],{"type":23,"value":96980},"How to integrate Outlook using Unified's Messaging and Calendar APIs",{"type":17,"tag":84,"props":96982,"children":96983},{},[96984],{"type":23,"value":70187},{"type":17,"tag":29,"props":96986,"children":96987},{},[96988,96990,96997,96998,97005],{"type":23,"value":96989},"If you are comparing adjacent integrations, you may also want our guides on ",{"type":17,"tag":133,"props":96991,"children":96994},{"href":96992,"rel":96993},"https://unified.to/blog/gmail_api_integration_a_step_by_step_guide_for_b2b_saas_teams_2026",[214],[96995],{"type":23,"value":96996},"Gmail API integration",{"type":23,"value":34435},{"type":17,"tag":133,"props":96999,"children":97002},{"href":97000,"rel":97001},"https://unified.to/blog/how_to_integrate_with_the_salesforce_api_a_step_by_step_guide_for_b2b_saas_teams_2026",[214],[97003],{"type":23,"value":97004},"Salesforce API integration",{"type":23,"value":54},{"type":17,"tag":68,"props":97007,"children":97009},{"id":97008},"direct-microsoft-graph-setup",[97010],{"type":23,"value":97011},"Direct Microsoft Graph setup",{"type":17,"tag":239,"props":97013,"children":97015},{"id":97014},"step-1-register-your-app-in-microsoft-entra-id",[97016],{"type":23,"value":97017},"Step 1: Register your app in Microsoft Entra ID",{"type":17,"tag":29,"props":97019,"children":97020},{},[97021,97023,97028,97030,97035,97037,97042,97044,97049],{"type":23,"value":97022},"In the Microsoft Entra admin center, create a new app under ",{"type":17,"tag":48,"props":97024,"children":97025},{},[97026],{"type":23,"value":97027},"App registrations",{"type":23,"value":97029},". Registration gives you an ",{"type":17,"tag":48,"props":97031,"children":97032},{},[97033],{"type":23,"value":97034},"Application (client) ID",{"type":23,"value":97036}," and lets you configure one or more ",{"type":17,"tag":48,"props":97038,"children":97039},{},[97040],{"type":23,"value":97041},"redirect URIs",{"type":23,"value":97043}," under the app's ",{"type":17,"tag":48,"props":97045,"children":97046},{},[97047],{"type":23,"value":97048},"Authentication",{"type":23,"value":97050}," section. Microsoft documents app registration and redirect URI setup in its Graph authentication guidance.",{"type":17,"tag":29,"props":97052,"children":97053},{},[97054],{"type":23,"value":97055},"For a B2B SaaS integration, you will usually choose a multi-tenant app registration so customers in different Microsoft 365 tenants can authorize your app. That decision depends on your product and customer base, but the Entra registration flow is where you set it.",{"type":17,"tag":239,"props":97057,"children":97059},{"id":97058},"step-2-choose-delegated-vs-application-permissions",[97060],{"type":23,"value":97061},"Step 2: Choose delegated vs application permissions",{"type":17,"tag":29,"props":97063,"children":97064},{},[97065,97067,97072,97074,97080,97082,97087],{"type":23,"value":97066},"For inbox and calendar integrations in SaaS products, ",{"type":17,"tag":48,"props":97068,"children":97069},{},[97070],{"type":23,"value":97071},"delegated permissions",{"type":23,"value":97073}," are usually the default. They let your app act on behalf of the signed-in user, and ",{"type":17,"tag":6121,"props":97075,"children":97077},{"className":97076},[],[97078],{"type":23,"value":97079},"/me/...",{"type":23,"value":97081}," endpoints only work in delegated scenarios. ",{"type":17,"tag":48,"props":97083,"children":97084},{},[97085],{"type":23,"value":97086},"Application permissions",{"type":23,"value":97088}," are app-only and are generally used for background services or tenant-wide access with admin consent.",{"type":17,"tag":29,"props":97090,"children":97091},{},[97092],{"type":23,"value":97093},"That distinction matters immediately:",{"type":17,"tag":80,"props":97095,"children":97096},{},[97097,97108],{"type":17,"tag":84,"props":97098,"children":97099},{},[97100,97101,97106],{"type":23,"value":33722},{"type":17,"tag":48,"props":97102,"children":97103},{},[97104],{"type":23,"value":97105},"delegated",{"type":23,"value":97107}," when each user connects their own mailbox and calendar",{"type":17,"tag":84,"props":97109,"children":97110},{},[97111,97112,97117],{"type":23,"value":33722},{"type":17,"tag":48,"props":97113,"children":97114},{},[97115],{"type":23,"value":97116},"application",{"type":23,"value":97118}," only when you truly need service-level access to mailboxes across a tenant and can support admin consent workflows",{"type":17,"tag":239,"props":97120,"children":97122},{"id":97121},"step-3-configure-the-right-graph-permissions",[97123],{"type":23,"value":97124},"Step 3: Configure the right Graph permissions",{"type":17,"tag":29,"props":97126,"children":97127},{},[97128],{"type":23,"value":97129},"For Outlook email and calendar, the common delegated permissions include:",{"type":17,"tag":80,"props":97131,"children":97132},{},[97133,97151,97162,97173,97191,97202],{"type":17,"tag":84,"props":97134,"children":97135},{},[97136,97142,97143,97149],{"type":17,"tag":6121,"props":97137,"children":97139},{"className":97138},[],[97140],{"type":23,"value":97141},"Mail.ReadBasic",{"type":23,"value":75890},{"type":17,"tag":6121,"props":97144,"children":97146},{"className":97145},[],[97147],{"type":23,"value":97148},"Mail.Read",{"type":23,"value":97150}," for reading mail",{"type":17,"tag":84,"props":97152,"children":97153},{},[97154,97160],{"type":17,"tag":6121,"props":97155,"children":97157},{"className":97156},[],[97158],{"type":23,"value":97159},"Mail.ReadWrite",{"type":23,"value":97161}," for updating or deleting messages",{"type":17,"tag":84,"props":97163,"children":97164},{},[97165,97171],{"type":17,"tag":6121,"props":97166,"children":97168},{"className":97167},[],[97169],{"type":23,"value":97170},"Mail.Send",{"type":23,"value":97172}," for sending mail",{"type":17,"tag":84,"props":97174,"children":97175},{},[97176,97182,97183,97189],{"type":17,"tag":6121,"props":97177,"children":97179},{"className":97178},[],[97180],{"type":23,"value":97181},"Calendars.ReadBasic",{"type":23,"value":75890},{"type":17,"tag":6121,"props":97184,"children":97186},{"className":97185},[],[97187],{"type":23,"value":97188},"Calendars.Read",{"type":23,"value":97190}," for reading calendars and events",{"type":17,"tag":84,"props":97192,"children":97193},{},[97194,97200],{"type":17,"tag":6121,"props":97195,"children":97197},{"className":97196},[],[97198],{"type":23,"value":97199},"Calendars.ReadWrite",{"type":23,"value":97201}," for creating or editing events",{"type":17,"tag":84,"props":97203,"children":97204},{},[97205,97211],{"type":17,"tag":6121,"props":97206,"children":97208},{"className":97207},[],[97209],{"type":23,"value":97210},"offline_access",{"type":23,"value":97212}," if you need refresh tokens for long-lived connections",{"type":17,"tag":29,"props":97214,"children":97215},{},[97216],{"type":23,"value":97217},"As with every OAuth integration, request the least privilege you need.",{"type":17,"tag":239,"props":97219,"children":97221},{"id":97220},"step-4-implement-oauth-20-authorization-code-flow",[97222],{"type":23,"value":97223},"Step 4: Implement OAuth 2.0 authorization code flow",{"type":17,"tag":29,"props":97225,"children":97226},{},[97227,97229,97234],{"type":23,"value":97228},"For user-connected Outlook integrations, the standard flow is the Microsoft identity platform's ",{"type":17,"tag":48,"props":97230,"children":97231},{},[97232],{"type":23,"value":97233},"authorization code flow",{"type":23,"value":54},{"type":17,"tag":29,"props":97236,"children":97237},{},[97238],{"type":23,"value":97239},"You send the user to the authorize endpoint with:",{"type":17,"tag":80,"props":97241,"children":97242},{},[97243,97252,97261,97270,97279],{"type":17,"tag":84,"props":97244,"children":97245},{},[97246],{"type":17,"tag":6121,"props":97247,"children":97249},{"className":97248},[],[97250],{"type":23,"value":97251},"client_id",{"type":17,"tag":84,"props":97253,"children":97254},{},[97255],{"type":17,"tag":6121,"props":97256,"children":97258},{"className":97257},[],[97259],{"type":23,"value":97260},"response_type=code",{"type":17,"tag":84,"props":97262,"children":97263},{},[97264],{"type":17,"tag":6121,"props":97265,"children":97267},{"className":97266},[],[97268],{"type":23,"value":97269},"redirect_uri",{"type":17,"tag":84,"props":97271,"children":97272},{},[97273],{"type":17,"tag":6121,"props":97274,"children":97276},{"className":97275},[],[97277],{"type":23,"value":97278},"scope",{"type":17,"tag":84,"props":97280,"children":97281},{},[97282],{"type":17,"tag":6121,"props":97283,"children":97285},{"className":97284},[],[97286],{"type":23,"value":77758},{"type":17,"tag":29,"props":97288,"children":97289},{},[97290,97292,97297],{"type":23,"value":97291},"Then you exchange the returned ",{"type":17,"tag":6121,"props":97293,"children":97295},{"className":97294},[],[97296],{"type":23,"value":6121},{"type":23,"value":97298}," at the token endpoint, typically including:",{"type":17,"tag":80,"props":97300,"children":97301},{},[97302,97310,97321,97329,97337],{"type":17,"tag":84,"props":97303,"children":97304},{},[97305],{"type":17,"tag":6121,"props":97306,"children":97308},{"className":97307},[],[97309],{"type":23,"value":97251},{"type":17,"tag":84,"props":97311,"children":97312},{},[97313,97319],{"type":17,"tag":6121,"props":97314,"children":97316},{"className":97315},[],[97317],{"type":23,"value":97318},"client_secret",{"type":23,"value":97320}," for confidential clients",{"type":17,"tag":84,"props":97322,"children":97323},{},[97324],{"type":17,"tag":6121,"props":97325,"children":97327},{"className":97326},[],[97328],{"type":23,"value":6121},{"type":17,"tag":84,"props":97330,"children":97331},{},[97332],{"type":17,"tag":6121,"props":97333,"children":97335},{"className":97334},[],[97336],{"type":23,"value":97269},{"type":17,"tag":84,"props":97338,"children":97339},{},[97340],{"type":17,"tag":6121,"props":97341,"children":97343},{"className":97342},[],[97344],{"type":23,"value":97345},"grant_type=authorization_code",{"type":17,"tag":29,"props":97347,"children":97348},{},[97349,97351,97356],{"type":23,"value":97350},"Request ",{"type":17,"tag":6121,"props":97352,"children":97354},{"className":97353},[],[97355],{"type":23,"value":97210},{"type":23,"value":97357}," if you need a refresh token so the integration can continue working after the original access token expires. Microsoft's OAuth documentation explicitly calls this out.",{"type":17,"tag":68,"props":97359,"children":97361},{"id":97360},"core-microsoft-graph-endpoints-for-outlook-email-and-calendar",[97362],{"type":23,"value":97363},"Core Microsoft Graph endpoints for Outlook email and calendar",{"type":17,"tag":239,"props":97365,"children":97367},{"id":97366},"list-mail-folders",[97368],{"type":23,"value":97369},"List mail folders",{"type":17,"tag":29,"props":97371,"children":97372},{},[97373],{"type":23,"value":97374},"To list Outlook folders, use:",{"type":17,"tag":6893,"props":97376,"children":97379},{"className":97377,"code":97378,"language":20901,"meta":23},[20899],"GET /me/mailFolders\nGET /users/{id}/mailFolders\n",[97380],{"type":17,"tag":6121,"props":97381,"children":97382},{"__ignoreMap":7},[97383],{"type":23,"value":97378},{"type":17,"tag":29,"props":97385,"children":97386},{},[97387,97389,97395,97397,97403,97404,97410,97411,97417,97418,97424,97425,97431],{"type":23,"value":97388},"You can also include ",{"type":17,"tag":6121,"props":97390,"children":97392},{"className":97391},[],[97393],{"type":23,"value":97394},"includeHiddenFolders=true",{"type":23,"value":97396},", and Graph supports common OData parameters like ",{"type":17,"tag":6121,"props":97398,"children":97400},{"className":97399},[],[97401],{"type":23,"value":97402},"$top",{"type":23,"value":11826},{"type":17,"tag":6121,"props":97405,"children":97407},{"className":97406},[],[97408],{"type":23,"value":97409},"$skip",{"type":23,"value":11826},{"type":17,"tag":6121,"props":97412,"children":97414},{"className":97413},[],[97415],{"type":23,"value":97416},"$select",{"type":23,"value":11826},{"type":17,"tag":6121,"props":97419,"children":97421},{"className":97420},[],[97422],{"type":23,"value":97423},"$filter",{"type":23,"value":12561},{"type":17,"tag":6121,"props":97426,"children":97428},{"className":97427},[],[97429],{"type":23,"value":97430},"$orderby",{"type":23,"value":97432}," here.",{"type":17,"tag":239,"props":97434,"children":97436},{"id":97435},"list-messages",[97437],{"type":23,"value":97438},"List messages",{"type":17,"tag":29,"props":97440,"children":97441},{},[97442],{"type":23,"value":97443},"To list all messages:",{"type":17,"tag":6893,"props":97445,"children":97448},{"className":97446,"code":97447,"language":20901,"meta":23},[20899],"GET /me/messages\nGET /users/{id}/messages\n",[97449],{"type":17,"tag":6121,"props":97450,"children":97451},{"__ignoreMap":7},[97452],{"type":23,"value":97447},{"type":17,"tag":29,"props":97454,"children":97455},{},[97456],{"type":23,"value":97457},"To list messages in a specific folder:",{"type":17,"tag":6893,"props":97459,"children":97462},{"className":97460,"code":97461,"language":20901,"meta":23},[20899],"GET /me/mailFolders/{id}/messages\nGET /users/{id}/mailFolders/{id}/messages\n",[97463],{"type":17,"tag":6121,"props":97464,"children":97465},{"__ignoreMap":7},[97466],{"type":23,"value":97461},{"type":17,"tag":29,"props":97468,"children":97469},{},[97470,97472,97477,97478,97483,97485,97490,97491,97496],{"type":23,"value":97471},"Graph supports ",{"type":17,"tag":6121,"props":97473,"children":97475},{"className":97474},[],[97476],{"type":23,"value":97416},{"type":23,"value":34435},{"type":17,"tag":6121,"props":97479,"children":97481},{"className":97480},[],[97482],{"type":23,"value":97402},{"type":23,"value":97484},", and Microsoft documents some important rules when combining ",{"type":17,"tag":6121,"props":97486,"children":97488},{"className":97487},[],[97489],{"type":23,"value":97423},{"type":23,"value":34435},{"type":17,"tag":6121,"props":97492,"children":97494},{"className":97493},[],[97495],{"type":23,"value":97430},{"type":23,"value":54},{"type":17,"tag":239,"props":97498,"children":97500},{"id":97499},"get-a-message",[97501],{"type":23,"value":97502},"Get a message",{"type":17,"tag":29,"props":97504,"children":97505},{},[97506],{"type":23,"value":97507},"To retrieve a single message:",{"type":17,"tag":6893,"props":97509,"children":97512},{"className":97510,"code":97511,"language":20901,"meta":23},[20899],"GET /me/messages/{id}\nGET /users/{id}/messages/{id}\n",[97513],{"type":17,"tag":6121,"props":97514,"children":97515},{"__ignoreMap":7},[97516],{"type":23,"value":97511},{"type":17,"tag":29,"props":97518,"children":97519},{},[97520,97522,97528,97530,97536],{"type":23,"value":97521},"If you need MIME content, append ",{"type":17,"tag":6121,"props":97523,"children":97525},{"className":97524},[],[97526],{"type":23,"value":97527},"/$value",{"type":23,"value":97529},". You can also use the ",{"type":17,"tag":6121,"props":97531,"children":97533},{"className":97532},[],[97534],{"type":23,"value":97535},"Prefer: outlook.body-content-type",{"type":23,"value":97537}," header to request text or HTML body formatting.",{"type":17,"tag":239,"props":97539,"children":97541},{"id":97540},"send-mail",[97542],{"type":23,"value":97543},"Send mail",{"type":17,"tag":29,"props":97545,"children":97546},{},[97547],{"type":23,"value":97548},"To send an email:",{"type":17,"tag":6893,"props":97550,"children":97553},{"className":97551,"code":97552,"language":20901,"meta":23},[20899],"POST /me/sendMail\nPOST /users/{id}/sendMail\n",[97554],{"type":17,"tag":6121,"props":97555,"children":97556},{"__ignoreMap":7},[97557],{"type":23,"value":97552},{"type":17,"tag":29,"props":97559,"children":97560},{},[97561,97562,97567,97569,97575],{"type":23,"value":19465},{"type":17,"tag":6121,"props":97563,"children":97565},{"className":97564},[],[97566],{"type":23,"value":97170},{"type":23,"value":97568},". Microsoft Graph returns ",{"type":17,"tag":6121,"props":97570,"children":97572},{"className":97571},[],[97573],{"type":23,"value":97574},"202 Accepted",{"type":23,"value":97576}," for successful send requests.",{"type":17,"tag":239,"props":97578,"children":97580},{"id":97579},"list-calendars",[97581],{"type":23,"value":97582},"List calendars",{"type":17,"tag":29,"props":97584,"children":97585},{},[97586],{"type":23,"value":97587},"To list calendars:",{"type":17,"tag":6893,"props":97589,"children":97592},{"className":97590,"code":97591,"language":20901,"meta":23},[20899],"GET /me/calendars\nGET /users/{id}/calendars\n",[97593],{"type":17,"tag":6121,"props":97594,"children":97595},{"__ignoreMap":7},[97596],{"type":23,"value":97591},{"type":17,"tag":29,"props":97598,"children":97599},{},[97600],{"type":23,"value":97601},"You can also list calendars within a calendar group. OData parameters are supported here as well.",{"type":17,"tag":239,"props":97603,"children":97605},{"id":97604},"list-events",[97606],{"type":23,"value":97607},"List events",{"type":17,"tag":29,"props":97609,"children":97610},{},[97611],{"type":23,"value":97612},"To list events from the default calendar:",{"type":17,"tag":6893,"props":97614,"children":97617},{"className":97615,"code":97616,"language":20901,"meta":23},[20899],"GET /me/calendar/events\nGET /users/{id}/calendar/events\n",[97618],{"type":17,"tag":6121,"props":97619,"children":97620},{"__ignoreMap":7},[97621],{"type":23,"value":97616},{"type":17,"tag":29,"props":97623,"children":97624},{},[97625],{"type":23,"value":97626},"To list events from a specific calendar:",{"type":17,"tag":6893,"props":97628,"children":97631},{"className":97629,"code":97630,"language":20901,"meta":23},[20899],"GET /me/calendars/{id}/events\nGET /users/{id}/calendars/{id}/events\n",[97632],{"type":17,"tag":6121,"props":97633,"children":97634},{"__ignoreMap":7},[97635],{"type":23,"value":97630},{"type":17,"tag":29,"props":97637,"children":97638},{},[97639,97641,97647],{"type":23,"value":97640},"You can set ",{"type":17,"tag":6121,"props":97642,"children":97644},{"className":97643},[],[97645],{"type":23,"value":97646},"Prefer: outlook.timezone",{"type":23,"value":97648}," to control how start and end times are returned.",{"type":17,"tag":239,"props":97650,"children":97652},{"id":97651},"create-and-update-events",[97653],{"type":23,"value":97654},"Create and update events",{"type":17,"tag":29,"props":97656,"children":97657},{},[97658],{"type":23,"value":97659},"To create an event:",{"type":17,"tag":6893,"props":97661,"children":97664},{"className":97662,"code":97663,"language":20901,"meta":23},[20899],"POST /me/events\nPOST /users/{id}/events\nPOST /me/calendars/{id}/events\n",[97665],{"type":17,"tag":6121,"props":97666,"children":97667},{"__ignoreMap":7},[97668],{"type":23,"value":97663},{"type":17,"tag":29,"props":97670,"children":97671},{},[97672],{"type":23,"value":97673},"To update an event:",{"type":17,"tag":6893,"props":97675,"children":97678},{"className":97676,"code":97677,"language":20901,"meta":23},[20899],"PATCH /me/events/{id}\nPATCH /users/{id}/events/{id}\nPATCH /me/calendars/{id}/events/{id}\n",[97679],{"type":17,"tag":6121,"props":97680,"children":97681},{"__ignoreMap":7},[97682],{"type":23,"value":97677},{"type":17,"tag":29,"props":97684,"children":97685},{},[97686,97688,97694],{"type":23,"value":97687},"Graph supports partial updates, and Microsoft recommends using ",{"type":17,"tag":6121,"props":97689,"children":97691},{"className":97690},[],[97692],{"type":23,"value":97693},"transactionId",{"type":23,"value":97695}," on create requests for idempotency.",{"type":17,"tag":68,"props":97697,"children":97699},{"id":97698},"change-sync-options-delta-queries-vs-change-notifications",[97700],{"type":23,"value":97701},"Change sync options: delta queries vs change notifications",{"type":17,"tag":239,"props":97703,"children":97705},{"id":97704},"delta-queries",[97706],{"type":23,"value":97707},"Delta queries",{"type":17,"tag":29,"props":97709,"children":97710},{},[97711,97713,97718],{"type":23,"value":97712},"Microsoft Graph supports ",{"type":17,"tag":48,"props":97714,"children":97715},{},[97716],{"type":23,"value":97717},"delta queries",{"type":23,"value":97719}," for both messages and events.",{"type":17,"tag":29,"props":97721,"children":97722},{},[97723],{"type":23,"value":97724},"For mail, you can use:",{"type":17,"tag":6893,"props":97726,"children":97729},{"className":97727,"code":97728,"language":20901,"meta":23},[20899],"GET /me/messages/delta\nGET /me/mailFolders/{id}/messages/delta\n",[97730],{"type":17,"tag":6121,"props":97731,"children":97732},{"__ignoreMap":7},[97733],{"type":23,"value":97728},{"type":17,"tag":29,"props":97735,"children":97736},{},[97737],{"type":23,"value":97738},"For calendar sync, Graph supports delta on calendar views, for example:",{"type":17,"tag":6893,"props":97740,"children":97743},{"className":97741,"code":97742,"language":20901,"meta":23},[20899],"GET /me/calendarView/delta?startDateTime=...&endDateTime=...\n",[97744],{"type":17,"tag":6121,"props":97745,"children":97746},{"__ignoreMap":7},[97747],{"type":23,"value":97742},{"type":17,"tag":29,"props":97749,"children":97750},{},[97751],{"type":23,"value":97752},"The pattern is:",{"type":17,"tag":6154,"props":97754,"children":97755},{},[97756,97761,97774,97785],{"type":17,"tag":84,"props":97757,"children":97758},{},[97759],{"type":23,"value":97760},"Make the initial delta request",{"type":17,"tag":84,"props":97762,"children":97763},{},[97764,97766,97772],{"type":23,"value":97765},"Follow ",{"type":17,"tag":6121,"props":97767,"children":97769},{"className":97768},[],[97770],{"type":23,"value":97771},"@odata.nextLink",{"type":23,"value":97773}," until exhausted",{"type":17,"tag":84,"props":97775,"children":97776},{},[97777,97779],{"type":23,"value":97778},"Persist the final ",{"type":17,"tag":6121,"props":97780,"children":97782},{"className":97781},[],[97783],{"type":23,"value":97784},"@odata.deltaLink",{"type":17,"tag":84,"props":97786,"children":97787},{},[97788],{"type":23,"value":97789},"Reuse that delta link later to retrieve only changes since the last checkpoint",{"type":17,"tag":29,"props":97791,"children":97792},{},[97793],{"type":23,"value":97794},"This is the right pattern for efficient pull-based sync.",{"type":17,"tag":239,"props":97796,"children":97798},{"id":97797},"change-notifications-webhooks",[97799],{"type":23,"value":97800},"Change notifications (webhooks)",{"type":17,"tag":29,"props":97802,"children":97803},{},[97804,97806,97811,97813,97819,97821,97827,97829,97835,97836,97842,97843,97849],{"type":23,"value":97805},"Graph also supports ",{"type":17,"tag":48,"props":97807,"children":97808},{},[97809],{"type":23,"value":97810},"change notifications",{"type":23,"value":97812}," for Outlook resources including messages and events. You create a subscription via ",{"type":17,"tag":6121,"props":97814,"children":97816},{"className":97815},[],[97817],{"type":23,"value":97818},"POST /subscriptions",{"type":23,"value":97820},", provide your ",{"type":17,"tag":6121,"props":97822,"children":97824},{"className":97823},[],[97825],{"type":23,"value":97826},"notificationUrl",{"type":23,"value":97828},", specify the monitored resource, and include ",{"type":17,"tag":6121,"props":97830,"children":97832},{"className":97831},[],[97833],{"type":23,"value":97834},"changeType",{"type":23,"value":11826},{"type":17,"tag":6121,"props":97837,"children":97839},{"className":97838},[],[97840],{"type":23,"value":97841},"expirationDateTime",{"type":23,"value":12561},{"type":17,"tag":6121,"props":97844,"children":97846},{"className":97845},[],[97847],{"type":23,"value":97848},"clientState",{"type":23,"value":54},{"type":17,"tag":29,"props":97851,"children":97852},{},[97853],{"type":23,"value":97854},"Important operational details:",{"type":17,"tag":80,"props":97856,"children":97857},{},[97858,97869,97874,97879],{"type":17,"tag":84,"props":97859,"children":97860},{},[97861,97863],{"type":23,"value":97862},"Graph validates your webhook by sending a ",{"type":17,"tag":6121,"props":97864,"children":97866},{"className":97865},[],[97867],{"type":23,"value":97868},"validationToken",{"type":17,"tag":84,"props":97870,"children":97871},{},[97872],{"type":23,"value":97873},"Your endpoint must return the plain-text token within 10 seconds",{"type":17,"tag":84,"props":97875,"children":97876},{},[97877],{"type":23,"value":97878},"Subscriptions expire and must be renewed",{"type":17,"tag":84,"props":97880,"children":97881},{},[97882],{"type":23,"value":97883},"Outlook resources have bounded subscription lifetimes, so renewal logic is mandatory",{"type":17,"tag":29,"props":97885,"children":97886},{},[97887,97889,97894,97895,97900],{"type":23,"value":97888},"In practice, many robust integrations use ",{"type":17,"tag":48,"props":97890,"children":97891},{},[97892],{"type":23,"value":97893},"change notifications to trigger work",{"type":23,"value":34435},{"type":17,"tag":48,"props":97896,"children":97897},{},[97898],{"type":23,"value":97899},"delta queries to fetch the actual changes",{"type":23,"value":97901},". That reduces missed updates and keeps sync logic simpler.",{"type":17,"tag":68,"props":97903,"children":97905},{"id":97904},"throttling-and-retry-behavior",[97906],{"type":23,"value":97907},"Throttling and retry behavior",{"type":17,"tag":29,"props":97909,"children":97910},{},[97911,97913,97918,97920,97925,97927,97932],{"type":23,"value":97912},"Microsoft Graph returns ",{"type":17,"tag":48,"props":97914,"children":97915},{},[97916],{"type":23,"value":97917},"429 Too Many Requests",{"type":23,"value":97919}," when you hit throttling limits. When that happens, Graph usually includes a ",{"type":17,"tag":48,"props":97921,"children":97922},{},[97923],{"type":23,"value":97924},"Retry-After",{"type":23,"value":97926}," header, and Microsoft's guidance is clear: wait the specified number of seconds, then retry. If no ",{"type":17,"tag":6121,"props":97928,"children":97930},{"className":97929},[],[97931],{"type":23,"value":97924},{"type":23,"value":97933}," header is present, implement exponential backoff.",{"type":17,"tag":29,"props":97935,"children":97936},{},[97937],{"type":23,"value":97938},"Microsoft also recommends avoiding aggressive polling and using delta queries and change notifications instead, which is especially relevant for inbox and calendar sync.",{"type":17,"tag":68,"props":97940,"children":97942},{"id":97941},"where-direct-outlook-integrations-become-operationally-expensive",[97943],{"type":23,"value":97944},"Where direct Outlook integrations become operationally expensive",{"type":17,"tag":29,"props":97946,"children":97947},{},[97948],{"type":23,"value":97949},"A direct Microsoft Graph integration means you own:",{"type":17,"tag":80,"props":97951,"children":97952},{},[97953,97958,97963,97968,97973,97978,97983,97988,97993],{"type":17,"tag":84,"props":97954,"children":97955},{},[97956],{"type":23,"value":97957},"Entra app registration and tenant configuration",{"type":17,"tag":84,"props":97959,"children":97960},{},[97961],{"type":23,"value":97962},"Delegated vs application permission strategy",{"type":17,"tag":84,"props":97964,"children":97965},{},[97966],{"type":23,"value":97967},"OAuth flow implementation and refresh token handling",{"type":17,"tag":84,"props":97969,"children":97970},{},[97971],{"type":23,"value":97972},"Mail + calendar endpoint orchestration",{"type":17,"tag":84,"props":97974,"children":97975},{},[97976],{"type":23,"value":97977},"Delta checkpoint storage",{"type":17,"tag":84,"props":97979,"children":97980},{},[97981],{"type":23,"value":97982},"Webhook subscription creation, validation, and renewal",{"type":17,"tag":84,"props":97984,"children":97985},{},[97986],{"type":23,"value":97987},"Throttling management and backoff",{"type":17,"tag":84,"props":97989,"children":97990},{},[97991],{"type":23,"value":97992},"Multi-tenant mailbox isolation",{"type":17,"tag":84,"props":97994,"children":97995},{},[97996],{"type":23,"value":97997},"Admin-consent-heavy scenarios for broader directory access",{"type":17,"tag":29,"props":97999,"children":98000},{},[98001],{"type":23,"value":98002},"For a single internal tool, this may be acceptable.",{"type":17,"tag":29,"props":98004,"children":98005},{},[98006],{"type":23,"value":98007},"For a customer-facing SaaS product serving many Microsoft 365 tenants, this is real infrastructure work.",{"type":17,"tag":68,"props":98009,"children":98011},{"id":98010},"integrating-microsoft-outlook-via-unified",[98012],{"type":23,"value":98013},"Integrating Microsoft Outlook via Unified",{"type":17,"tag":29,"props":98015,"children":98016},{},[98017],{"type":23,"value":98018},"Using the Unified Outlook configuration you shared, the flow is simpler.",{"type":17,"tag":239,"props":98020,"children":98022},{"id":98021},"step-1-register-outlook-oauth-for-unified",[98023],{"type":23,"value":98024},"Step 1: Register Outlook OAuth for Unified",{"type":17,"tag":29,"props":98026,"children":98027},{},[98028],{"type":23,"value":98029},"For Unified, the redirect URI is:",{"type":17,"tag":6893,"props":98031,"children":98033},{"className":98032,"code":71416,"language":20901,"meta":23},[20899],[98034],{"type":17,"tag":6121,"props":98035,"children":98036},{"__ignoreMap":7},[98037],{"type":23,"value":71416},{"type":17,"tag":29,"props":98039,"children":98040},{},[98041],{"type":23,"value":98042},"You also noted region-specific variants:",{"type":17,"tag":80,"props":98044,"children":98045},{},[98046,98055],{"type":17,"tag":84,"props":98047,"children":98048},{},[98049],{"type":17,"tag":6121,"props":98050,"children":98052},{"className":98051},[],[98053],{"type":23,"value":98054},"https://eu.api.unified.to/oauth/code",{"type":17,"tag":84,"props":98056,"children":98057},{},[98058],{"type":17,"tag":6121,"props":98059,"children":98061},{"className":98060},[],[98062],{"type":23,"value":98063},"https://au.api.unified.to/oauth/code",{"type":17,"tag":29,"props":98065,"children":98066},{},[98067],{"type":23,"value":98068},"On the Outlook side, Unified scopes map to Microsoft Graph scopes like:",{"type":17,"tag":80,"props":98070,"children":98071},{},[98072,98088,98103,98130,98159],{"type":17,"tag":84,"props":98073,"children":98074},{},[98075,98081,98083],{"type":17,"tag":6121,"props":98076,"children":98078},{"className":98077},[],[98079],{"type":23,"value":98080},"messaging_channel_read",{"type":23,"value":98082}," → ",{"type":17,"tag":6121,"props":98084,"children":98086},{"className":98085},[],[98087],{"type":23,"value":97141},{"type":17,"tag":84,"props":98089,"children":98090},{},[98091,98097,98098],{"type":17,"tag":6121,"props":98092,"children":98094},{"className":98093},[],[98095],{"type":23,"value":98096},"messaging_message_read",{"type":23,"value":98082},{"type":17,"tag":6121,"props":98099,"children":98101},{"className":98100},[],[98102],{"type":23,"value":97148},{"type":17,"tag":84,"props":98104,"children":98105},{},[98106,98112,98113,98118,98119,98124,98125],{"type":17,"tag":6121,"props":98107,"children":98109},{"className":98108},[],[98110],{"type":23,"value":98111},"messaging_message_write",{"type":23,"value":98082},{"type":17,"tag":6121,"props":98114,"children":98116},{"className":98115},[],[98117],{"type":23,"value":97148},{"type":23,"value":11826},{"type":17,"tag":6121,"props":98120,"children":98122},{"className":98121},[],[98123],{"type":23,"value":97170},{"type":23,"value":11826},{"type":17,"tag":6121,"props":98126,"children":98128},{"className":98127},[],[98129],{"type":23,"value":97159},{"type":17,"tag":84,"props":98131,"children":98132},{},[98133,98139,98140,98146,98147,98153,98154],{"type":17,"tag":6121,"props":98134,"children":98136},{"className":98135},[],[98137],{"type":23,"value":98138},"calendar_calendar_read",{"type":23,"value":26030},{"type":17,"tag":6121,"props":98141,"children":98143},{"className":98142},[],[98144],{"type":23,"value":98145},"calendar_event_read",{"type":23,"value":26030},{"type":17,"tag":6121,"props":98148,"children":98150},{"className":98149},[],[98151],{"type":23,"value":98152},"calendar_busy_read",{"type":23,"value":98082},{"type":17,"tag":6121,"props":98155,"children":98157},{"className":98156},[],[98158],{"type":23,"value":97188},{"type":17,"tag":84,"props":98160,"children":98161},{},[98162,98168,98169,98175,98176],{"type":17,"tag":6121,"props":98163,"children":98165},{"className":98164},[],[98166],{"type":23,"value":98167},"calendar_calendar_write",{"type":23,"value":26030},{"type":17,"tag":6121,"props":98170,"children":98172},{"className":98171},[],[98173],{"type":23,"value":98174},"calendar_event_write",{"type":23,"value":98082},{"type":17,"tag":6121,"props":98177,"children":98179},{"className":98178},[],[98180],{"type":23,"value":97199},{"type":17,"tag":29,"props":98182,"children":98183},{},[98184,98186,98192,98193,98198,98199,98205,98206,98211],{"type":23,"value":98185},"Plus identity scopes such as ",{"type":17,"tag":6121,"props":98187,"children":98189},{"className":98188},[],[98190],{"type":23,"value":98191},"openid",{"type":23,"value":11826},{"type":17,"tag":6121,"props":98194,"children":98196},{"className":98195},[],[98197],{"type":23,"value":62666},{"type":23,"value":11826},{"type":17,"tag":6121,"props":98200,"children":98202},{"className":98201},[],[98203],{"type":23,"value":98204},"profile",{"type":23,"value":12561},{"type":17,"tag":6121,"props":98207,"children":98209},{"className":98208},[],[98210],{"type":23,"value":97210},{"type":23,"value":98212},", based on the integration sheet you shared.",{"type":17,"tag":239,"props":98214,"children":98216},{"id":98215},"step-2-authorize-a-connection",[98217],{"type":23,"value":98218},"Step 2: Authorize a connection",{"type":17,"tag":29,"props":98220,"children":98221},{},[98222],{"type":23,"value":98223},"Unified's pattern is:",{"type":17,"tag":6154,"props":98225,"children":98226},{},[98227,98232,98237],{"type":17,"tag":84,"props":98228,"children":98229},{},[98230],{"type":23,"value":98231},"Activate the Outlook integration in your workspace",{"type":17,"tag":84,"props":98233,"children":98234},{},[98235],{"type":23,"value":98236},"Redirect the user through Unified's authorization flow",{"type":17,"tag":84,"props":98238,"children":98239},{},[98240,98242,98247],{"type":23,"value":98241},"Receive a ",{"type":17,"tag":6121,"props":98243,"children":98245},{"className":98244},[],[98246],{"type":23,"value":25037},{"type":23,"value":98248}," after successful authorization",{"type":17,"tag":29,"props":98250,"children":98251},{},[98252,98254,98259],{"type":23,"value":98253},"That gives you a stable identifier for future Messaging and ",{"type":17,"tag":133,"props":98255,"children":98256},{"href":13708},[98257],{"type":23,"value":98258},"Calendar API",{"type":23,"value":98260}," calls.",{"type":17,"tag":239,"props":98262,"children":98264},{"id":98263},"step-3-call-unifieds-messaging-api",[98265],{"type":23,"value":98266},"Step 3: Call Unified's Messaging API",{"type":17,"tag":29,"props":98268,"children":98269},{},[98270],{"type":23,"value":98271},"Based on the integration details you shared, Outlook under Unified supports:",{"type":17,"tag":80,"props":98273,"children":98274},{},[98275,98284],{"type":17,"tag":84,"props":98276,"children":98277},{},[98278,98282],{"type":17,"tag":48,"props":98279,"children":98280},{},[98281],{"type":23,"value":15787},{"type":23,"value":98283},": list, get",{"type":17,"tag":84,"props":98285,"children":98286},{},[98287,98291],{"type":17,"tag":48,"props":98288,"children":98289},{},[98290],{"type":23,"value":15800},{"type":23,"value":98292},": list, get, create, update, remove",{"type":17,"tag":29,"props":98294,"children":98295},{},[98296],{"type":23,"value":98297},"A first-call example to list folders/channels looks like:",{"type":17,"tag":6893,"props":98299,"children":98302},{"className":98300,"code":98301,"language":48432,"meta":7},[48430],"curl -X GET \"https://api.unified.to/messaging/CONNECTION_ID/channel?limit=50&offset=0\" \\\n  -H \"Authorization: Bearer ACCESS_TOKEN\"\n",[98303],{"type":17,"tag":6121,"props":98304,"children":98305},{"__ignoreMap":7},[98306],{"type":23,"value":98301},{"type":17,"tag":29,"props":98308,"children":98309},{},[98310],{"type":23,"value":98311},"And to list messages in a folder:",{"type":17,"tag":6893,"props":98313,"children":98316},{"className":98314,"code":98315,"language":48432,"meta":7},[48430],"curl -X GET \"https://api.unified.to/messaging/CONNECTION_ID/message?channel_id=CHANNEL_ID&limit=50\" \\\n  -H \"Authorization: Bearer ACCESS_TOKEN\"\n",[98317],{"type":17,"tag":6121,"props":98318,"children":98319},{"__ignoreMap":7},[98320],{"type":23,"value":98315},{"type":17,"tag":29,"props":98322,"children":98323},{},[98324],{"type":23,"value":98325},"To create or send a message:",{"type":17,"tag":6893,"props":98327,"children":98330},{"className":98328,"code":98329,"language":48432,"meta":7},[48430],"curl -X POST \"https://api.unified.to/messaging/CONNECTION_ID/message\" \\\n  -H \"Authorization: Bearer ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"channels\": [\"CHANNEL_ID\"],\n    \"subject\": \"Hello\",\n    \"message\": \"This is the body\",\n    \"message_html\": \"\u003Cp>This is the \u003Cstrong>HTML\u003C/strong> body\u003C/p>\",\n    \"attachments\": []\n  }'\n",[98331],{"type":17,"tag":6121,"props":98332,"children":98333},{"__ignoreMap":7},[98334],{"type":23,"value":98329},{"type":17,"tag":239,"props":98336,"children":98338},{"id":98337},"step-4-call-unifieds-calendar-api",[98339],{"type":23,"value":98340},"Step 4: Call Unified's Calendar API",{"type":17,"tag":29,"props":98342,"children":98343},{},[98344],{"type":23,"value":98345},"From the Outlook mapping you shared, Unified supports:",{"type":17,"tag":80,"props":98347,"children":98348},{},[98349,98357,98365],{"type":17,"tag":84,"props":98350,"children":98351},{},[98352,98356],{"type":17,"tag":48,"props":98353,"children":98354},{},[98355],{"type":23,"value":14515},{"type":23,"value":98283},{"type":17,"tag":84,"props":98358,"children":98359},{},[98360,98364],{"type":17,"tag":48,"props":98361,"children":98362},{},[98363],{"type":23,"value":14528},{"type":23,"value":98292},{"type":17,"tag":84,"props":98366,"children":98367},{},[98368,98372],{"type":17,"tag":48,"props":98369,"children":98370},{},[98371],{"type":23,"value":14541},{"type":23,"value":98373},": list",{"type":17,"tag":29,"props":98375,"children":98376},{},[98377],{"type":23,"value":377},{"type":17,"tag":29,"props":98379,"children":98380},{},[98381],{"type":23,"value":98382},"List calendars:",{"type":17,"tag":6893,"props":98384,"children":98387},{"className":98385,"code":98386,"language":48432,"meta":7},[48430],"curl -X GET \"https://api.unified.to/calendar/CONNECTION_ID/calendar?limit=50&offset=0\" \\\n  -H \"Authorization: Bearer ACCESS_TOKEN\"\n",[98388],{"type":17,"tag":6121,"props":98389,"children":98390},{"__ignoreMap":7},[98391],{"type":23,"value":98386},{"type":17,"tag":29,"props":98393,"children":98394},{},[98395],{"type":23,"value":98396},"List events:",{"type":17,"tag":6893,"props":98398,"children":98401},{"className":98399,"code":98400,"language":48432,"meta":7},[48430],"curl -X GET \"https://api.unified.to/calendar/CONNECTION_ID/event?calendar_id=CALENDAR_ID&limit=50\" \\\n  -H \"Authorization: Bearer ACCESS_TOKEN\"\n",[98402],{"type":17,"tag":6121,"props":98403,"children":98404},{"__ignoreMap":7},[98405],{"type":23,"value":98400},{"type":17,"tag":29,"props":98407,"children":98408},{},[98409],{"type":23,"value":98410},"Create an event:",{"type":17,"tag":6893,"props":98412,"children":98415},{"className":98413,"code":98414,"language":48432,"meta":7},[48430],"curl -X POST \"https://api.unified.to/calendar/CONNECTION_ID/event\" \\\n  -H \"Authorization: Bearer ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"calendar_id\": \"CALENDAR_ID\",\n    \"start\": \"2026-03-10T15:00:00Z\",\n    \"end\": \"2026-03-10T16:00:00Z\",\n    \"summary\": \"Planning meeting\",\n    \"description\": \"Weekly planning meeting\",\n    \"attendees\": [{\"email\": \"user@example.com\", \"name\": \"User Name\"}]\n  }'\n",[98416],{"type":17,"tag":6121,"props":98417,"children":98418},{"__ignoreMap":7},[98419],{"type":23,"value":98414},{"type":17,"tag":29,"props":98421,"children":98422},{},[98423],{"type":23,"value":98424},"List free/busy data:",{"type":17,"tag":6893,"props":98426,"children":98429},{"className":98427,"code":98428,"language":48432,"meta":7},[48430],"curl -X GET \"https://api.unified.to/calendar/CONNECTION_ID/busy?calendar_ids[]=CALENDAR_ID&start=2026-03-10T00:00:00Z&end=2026-03-10T23:59:59Z\" \\\n  -H \"Authorization: Bearer ACCESS_TOKEN\"\n",[98430],{"type":17,"tag":6121,"props":98431,"children":98432},{"__ignoreMap":7},[98433],{"type":23,"value":98428},{"type":17,"tag":239,"props":98435,"children":98437},{"id":98436},"step-5-use-passthrough-when-needed",[98438],{"type":23,"value":98439},"Step 5: Use passthrough when needed",{"type":17,"tag":29,"props":98441,"children":98442},{},[98443,98445,98450,98451,98457,98458,98464,98465,98471,98472,98478],{"type":23,"value":98444},"The Outlook integration details you shared also include passthrough methods (",{"type":17,"tag":6121,"props":98446,"children":98448},{"className":98447},[],[98449],{"type":23,"value":11832},{"type":23,"value":11826},{"type":17,"tag":6121,"props":98452,"children":98454},{"className":98453},[],[98455],{"type":23,"value":98456},"post",{"type":23,"value":11826},{"type":17,"tag":6121,"props":98459,"children":98461},{"className":98460},[],[98462],{"type":23,"value":98463},"put",{"type":23,"value":11826},{"type":17,"tag":6121,"props":98466,"children":98468},{"className":98467},[],[98469],{"type":23,"value":98470},"patch",{"type":23,"value":11826},{"type":17,"tag":6121,"props":98473,"children":98475},{"className":98474},[],[98476],{"type":23,"value":98477},"delete",{"type":23,"value":98479},"). That gives you a fallback path for Graph features not covered by Unified's normalized Messaging and Calendar models.",{"type":17,"tag":68,"props":98481,"children":98483},{"id":98482},"unified-webhooks-for-outlook",[98484],{"type":23,"value":98485},"Unified webhooks for Outlook",{"type":17,"tag":29,"props":98487,"children":98488},{},[98489],{"type":23,"value":98490},"Based on the Unified Outlook notes you shared:",{"type":17,"tag":80,"props":98492,"children":98493},{},[98494,98517,98522,98527],{"type":17,"tag":84,"props":98495,"children":98496},{},[98497,98499,98504,98505,98510,98511,98515],{"type":23,"value":98498},"Outlook supports both ",{"type":17,"tag":48,"props":98500,"children":98501},{},[98502],{"type":23,"value":98503},"native",{"type":23,"value":34435},{"type":17,"tag":48,"props":98506,"children":98507},{},[98508],{"type":23,"value":98509},"virtual",{"type":23,"value":18757},{"type":17,"tag":133,"props":98512,"children":98513},{"href":4999},[98514],{"type":23,"value":5002},{"type":23,"value":98516}," in Unified for messages and calendar events",{"type":17,"tag":84,"props":98518,"children":98519},{},[98520],{"type":23,"value":98521},"Native webhooks are used when Graph supports subscriptions for the resource",{"type":17,"tag":84,"props":98523,"children":98524},{},[98525],{"type":23,"value":98526},"Virtual webhooks are used when polling is needed or selected",{"type":17,"tag":84,"props":98528,"children":98529},{},[98530],{"type":23,"value":98531},"Unified recommends webhooks over polling and applies built-in retry/backoff behavior",{"type":17,"tag":29,"props":98533,"children":98534},{},[98535],{"type":23,"value":98536},"That means you can get standardized change notifications without implementing Graph subscription validation and renewal yourself, depending on how you configure the integration.",{"type":17,"tag":68,"props":98538,"children":98539},{"id":72006},[98540],{"type":23,"value":72009},{"type":17,"tag":239,"props":98542,"children":98544},{"id":98543},"build-direct-with-microsoft-graph-if",[98545],{"type":23,"value":98546},"Build direct with Microsoft Graph if:",{"type":17,"tag":80,"props":98548,"children":98549},{},[98550,98555,98560,98565],{"type":17,"tag":84,"props":98551,"children":98552},{},[98553],{"type":23,"value":98554},"Outlook is one of your core product surfaces",{"type":17,"tag":84,"props":98556,"children":98557},{},[98558],{"type":23,"value":98559},"You need full Graph flexibility for mail and calendar features",{"type":17,"tag":84,"props":98561,"children":98562},{},[98563],{"type":23,"value":98564},"You are comfortable owning delta sync, webhook subscriptions, renewal, and throttling logic",{"type":17,"tag":84,"props":98566,"children":98567},{},[98568],{"type":23,"value":98569},"You need app-only scenarios, tenant-wide access, or highly custom Microsoft 365 behavior",{"type":17,"tag":239,"props":98571,"children":98572},{"id":72041},[98573],{"type":23,"value":98574},"Use Unified if:",{"type":17,"tag":80,"props":98576,"children":98577},{},[98578,98583,98588,98593,98598],{"type":17,"tag":84,"props":98579,"children":98580},{},[98581],{"type":23,"value":98582},"You want one integration surface across Outlook and other providers",{"type":17,"tag":84,"props":98584,"children":98585},{},[98586],{"type":23,"value":98587},"You prefer not to manage Graph-specific OAuth, webhook validation, and renewal logic",{"type":17,"tag":84,"props":98589,"children":98590},{},[98591],{"type":23,"value":98592},"Your product mainly needs common email + calendar behavior",{"type":17,"tag":84,"props":98594,"children":98595},{},[98596],{"type":23,"value":98597},"You want normalized channel, message, calendar, event, and busy abstractions",{"type":17,"tag":84,"props":98599,"children":98600},{},[98601],{"type":23,"value":98602},"You want passthrough available for edge cases",{"type":17,"tag":68,"props":98604,"children":98605},{"id":1552},[98606],{"type":23,"value":1555},{"type":17,"tag":29,"props":98608,"children":98609},{},[98610],{"type":23,"value":98611},"A Microsoft Outlook integration is straightforward at the endpoint level.",{"type":17,"tag":29,"props":98613,"children":98614},{},[98615],{"type":23,"value":98616},"The engineering complexity shows up in:",{"type":17,"tag":80,"props":98618,"children":98619},{},[98620,98625,98630,98635,98640,98645],{"type":17,"tag":84,"props":98621,"children":98622},{},[98623],{"type":23,"value":98624},"delegated vs application permission decisions",{"type":17,"tag":84,"props":98626,"children":98627},{},[98628],{"type":23,"value":98629},"long-lived OAuth handling",{"type":17,"tag":84,"props":98631,"children":98632},{},[98633],{"type":23,"value":98634},"mailbox and calendar sync design",{"type":17,"tag":84,"props":98636,"children":98637},{},[98638],{"type":23,"value":98639},"webhook validation and renewal",{"type":17,"tag":84,"props":98641,"children":98642},{},[98643],{"type":23,"value":98644},"delta checkpoint management",{"type":17,"tag":84,"props":98646,"children":98647},{},[98648],{"type":23,"value":98649},"throttling and retry behavior",{"type":17,"tag":29,"props":98651,"children":98652},{},[98653],{"type":23,"value":98654},"If Outlook email and calendar are central to your product, building directly on Microsoft Graph can make sense.",{"type":17,"tag":29,"props":98656,"children":98657},{},[98658],{"type":23,"value":98659},"If they are critical but not differentiating, using a normalized integration layer can reduce time-to-market and lower long-term maintenance.",{"type":17,"tag":29,"props":98661,"children":98662},{},[98663],{"type":17,"tag":133,"props":98664,"children":98666},{"href":1612,"rel":98665},[214],[98667],{"type":23,"value":44481},{"type":17,"tag":29,"props":98669,"children":98670},{},[98671],{"type":17,"tag":133,"props":98672,"children":98674},{"href":1623,"rel":98673},[214],[98675],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":98677},[98678,98684,98693,98697,98698,98699,98706,98707,98711],{"id":97008,"depth":1629,"text":97011,"children":98679},[98680,98681,98682,98683],{"id":97014,"depth":1635,"text":97017},{"id":97058,"depth":1635,"text":97061},{"id":97121,"depth":1635,"text":97124},{"id":97220,"depth":1635,"text":97223},{"id":97360,"depth":1629,"text":97363,"children":98685},[98686,98687,98688,98689,98690,98691,98692],{"id":97366,"depth":1635,"text":97369},{"id":97435,"depth":1635,"text":97438},{"id":97499,"depth":1635,"text":97502},{"id":97540,"depth":1635,"text":97543},{"id":97579,"depth":1635,"text":97582},{"id":97604,"depth":1635,"text":97607},{"id":97651,"depth":1635,"text":97654},{"id":97698,"depth":1629,"text":97701,"children":98694},[98695,98696],{"id":97704,"depth":1635,"text":97707},{"id":97797,"depth":1635,"text":97800},{"id":97904,"depth":1629,"text":97907},{"id":97941,"depth":1629,"text":97944},{"id":98010,"depth":1629,"text":98013,"children":98700},[98701,98702,98703,98704,98705],{"id":98021,"depth":1635,"text":98024},{"id":98215,"depth":1635,"text":98218},{"id":98263,"depth":1635,"text":98266},{"id":98337,"depth":1635,"text":98340},{"id":98436,"depth":1635,"text":98439},{"id":98482,"depth":1629,"text":98485},{"id":72006,"depth":1629,"text":72009,"children":98708},[98709,98710],{"id":98543,"depth":1635,"text":98546},{"id":72041,"depth":1635,"text":98574},{"id":1552,"depth":1629,"text":1555},"content:blog:how_to_integrate_with_microsoft_outlook.md","blog/how_to_integrate_with_microsoft_outlook.md","blog/how_to_integrate_with_microsoft_outlook",{"_path":98716,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":98717,"description":98718,"img":98719,"date":98720,"tag":12,"body":98721,"_type":1677,"_id":99942,"_source":1679,"_file":99943,"_stem":99944,"_extension":1682},"/blog/what_unified_api_is_best_for_calendar_and_meeting_platform_integrations","What Unified API Is Best for Calendar and Meeting Platform Integrations?","The best unified API for calendar and meeting integrations depends on what your product needs. If you are building a scheduling-first product with complex...","https://s3.us-east-2.amazonaws.com/unified-article-images/what_unified_api_is_best_for_calendar_and_meeting_platform_integrations-icon.png","2026-03-05T20:44:00.000Z",{"type":14,"children":98722,"toc":99915},[98723,98728,98731,98738,98749,98760,98766,98771,98776,98809,98814,98819,98824,98830,98835,98840,99007,99012,99018,99032,99038,99043,99048,99066,99071,99077,99082,99098,99102,99115,99120,99126,99131,99136,99154,99164,99170,99175,99181,99186,99191,99207,99212,99217,99235,99240,99246,99251,99269,99274,99279,99297,99302,99308,99313,99326,99339,99373,99378,99396,99401,99407,99412,99445,99450,99468,99473,99479,99484,99489,99507,99512,99517,99523,99528,99534,99539,99545,99550,99556,99561,99567,99572,99578,99583,99589,99594,99599,99617,99622,99627,99632,99638,99744,99750,99755,99760,99765,99793,99798,99803,99815,99820,99842,99846,99874,99879,99884,99894,99899,99907],{"type":17,"tag":18,"props":98724,"children":98726},{"id":98725},"what-unified-api-is-best-for-calendar-and-meeting-platform-integrations",[98727],{"type":23,"value":98717},{"type":17,"tag":25,"props":98729,"children":98730},{},[],{"type":17,"tag":29,"props":98732,"children":98733},{},[98734],{"type":17,"tag":33,"props":98735,"children":98736},{},[98737],{"type":23,"value":96921},{"type":17,"tag":29,"props":98739,"children":98740},{},[98741,98743,98747],{"type":23,"value":98742},"The best ",{"type":17,"tag":133,"props":98744,"children":98745},{"href":7691},[98746],{"type":23,"value":7459},{"type":23,"value":98748}," for calendar and meeting integrations depends on what your product needs. If you are building a scheduling-first product with complex booking logic, a calendar-focused API may be the right fit.",{"type":17,"tag":29,"props":98750,"children":98751},{},[98752,98754,98758],{"type":23,"value":98753},"But if your product needs calendar and meeting data alongside CRM, ATS, or AI workflows, ",{"type":17,"tag":48,"props":98755,"children":98756},{},[98757],{"type":23,"value":87523},{"type":23,"value":98759}," is the stronger option—because it provides real-time access to events, availability, recordings, and transcripts across integrations without storing end-customer calendar data.",{"type":17,"tag":68,"props":98761,"children":98763},{"id":98762},"why-calendar-and-meeting-integrations-are-harder-than-they-look",[98764],{"type":23,"value":98765},"Why calendar and meeting integrations are harder than they look",{"type":17,"tag":29,"props":98767,"children":98768},{},[98769],{"type":23,"value":98770},"Calendar integrations are often underestimated.",{"type":17,"tag":29,"props":98772,"children":98773},{},[98774],{"type":23,"value":98775},"At a surface level, the problem looks like simple event CRUD. In practice, once you support multiple integrations, the complexity expands quickly:",{"type":17,"tag":80,"props":98777,"children":98778},{},[98779,98784,98789,98794,98799,98804],{"type":17,"tag":84,"props":98780,"children":98781},{},[98782],{"type":23,"value":98783},"Event schemas vary across providers",{"type":17,"tag":84,"props":98785,"children":98786},{},[98787],{"type":23,"value":98788},"Free/busy and availability behave differently",{"type":17,"tag":84,"props":98790,"children":98791},{},[98792],{"type":23,"value":98793},"Recurring events are modeled inconsistently",{"type":17,"tag":84,"props":98795,"children":98796},{},[98797],{"type":23,"value":98798},"Conferencing (Zoom, Meet, Teams) is attached differently",{"type":17,"tag":84,"props":98800,"children":98801},{},[98802],{"type":23,"value":98803},"Recordings and transcripts are not standardized",{"type":17,"tag":84,"props":98805,"children":98806},{},[98807],{"type":23,"value":98808},"Lifecycle events (created, updated, deleted, started, ended) vary widely",{"type":17,"tag":29,"props":98810,"children":98811},{},[98812],{"type":23,"value":98813},"This becomes a product problem, not just an integration problem.",{"type":17,"tag":29,"props":98815,"children":98816},{},[98817],{"type":23,"value":98818},"If your product exposes scheduling to users, stale or delayed data breaks workflows immediately. If you are building AI features, missing or partial transcript data leads to incorrect outputs.",{"type":17,"tag":29,"props":98820,"children":98821},{},[98822],{"type":23,"value":98823},"That is why the choice of unified API matters more for calendar and meetings than almost any other category.",{"type":17,"tag":68,"props":98825,"children":98827},{"id":98826},"what-to-evaluate-in-a-unified-calendar-and-meetings-api",[98828],{"type":23,"value":98829},"What to evaluate in a unified calendar and meetings API",{"type":17,"tag":29,"props":98831,"children":98832},{},[98833],{"type":23,"value":98834},"When comparing providers, most teams focus on integrations supported. That is not enough.",{"type":17,"tag":29,"props":98836,"children":98837},{},[98838],{"type":23,"value":98839},"The more important criteria are below:",{"type":17,"tag":7231,"props":98841,"children":98842},{},[98843,98863],{"type":17,"tag":7235,"props":98844,"children":98845},{},[98846],{"type":17,"tag":7239,"props":98847,"children":98848},{},[98849,98854,98858],{"type":17,"tag":7243,"props":98850,"children":98851},{},[98852],{"type":23,"value":98853},"Area",{"type":17,"tag":7243,"props":98855,"children":98856},{},[98857],{"type":23,"value":85072},{"type":17,"tag":7243,"props":98859,"children":98860},{},[98861],{"type":23,"value":98862},"What to look for",{"type":17,"tag":7259,"props":98864,"children":98865},{},[98866,98883,98901,98919,98937,98954,98972,98989],{"type":17,"tag":7239,"props":98867,"children":98868},{},[98869,98873,98878],{"type":17,"tag":7266,"props":98870,"children":98871},{},[98872],{"type":23,"value":7359},{"type":17,"tag":7266,"props":98874,"children":98875},{},[98876],{"type":23,"value":98877},"Calendar data changes constantly",{"type":17,"tag":7266,"props":98879,"children":98880},{},[98881],{"type":23,"value":98882},"Real-time requests vs stored/synced data",{"type":17,"tag":7239,"props":98884,"children":98885},{},[98886,98891,98896],{"type":17,"tag":7266,"props":98887,"children":98888},{},[98889],{"type":23,"value":98890},"Event + meeting coverage",{"type":17,"tag":7266,"props":98892,"children":98893},{},[98894],{"type":23,"value":98895},"Scheduling is only part of the problem",{"type":17,"tag":7266,"props":98897,"children":98898},{},[98899],{"type":23,"value":98900},"Support for events, availability, recordings, transcripts",{"type":17,"tag":7239,"props":98902,"children":98903},{},[98904,98909,98914],{"type":17,"tag":7266,"props":98905,"children":98906},{},[98907],{"type":23,"value":98908},"Availability support",{"type":17,"tag":7266,"props":98910,"children":98911},{},[98912],{"type":23,"value":98913},"Required for scheduling flows",{"type":17,"tag":7266,"props":98915,"children":98916},{},[98917],{"type":23,"value":98918},"Normalized free/busy retrieval",{"type":17,"tag":7239,"props":98920,"children":98921},{},[98922,98927,98932],{"type":17,"tag":7266,"props":98923,"children":98924},{},[98925],{"type":23,"value":98926},"Recordings + transcripts",{"type":17,"tag":7266,"props":98928,"children":98929},{},[98930],{"type":23,"value":98931},"Required for AI and post-meeting workflows",{"type":17,"tag":7266,"props":98933,"children":98934},{},[98935],{"type":23,"value":98936},"Access to transcripts and recording metadata",{"type":17,"tag":7239,"props":98938,"children":98939},{},[98940,98944,98949],{"type":17,"tag":7266,"props":98941,"children":98942},{},[98943],{"type":23,"value":43896},{"type":17,"tag":7266,"props":98945,"children":98946},{},[98947],{"type":23,"value":98948},"Needed for real-time updates",{"type":17,"tag":7266,"props":98950,"children":98951},{},[98952],{"type":23,"value":98953},"Native + fallback delivery model",{"type":17,"tag":7239,"props":98955,"children":98956},{},[98957,98962,98967],{"type":17,"tag":7266,"props":98958,"children":98959},{},[98960],{"type":23,"value":98961},"Cross-category support",{"type":17,"tag":7266,"props":98963,"children":98964},{},[98965],{"type":23,"value":98966},"Calendar rarely lives alone",{"type":17,"tag":7266,"props":98968,"children":98969},{},[98970],{"type":23,"value":98971},"Ability to connect with CRM, ATS, etc.",{"type":17,"tag":7239,"props":98973,"children":98974},{},[98975,98979,98984],{"type":17,"tag":7266,"props":98976,"children":98977},{},[98978],{"type":23,"value":69493},{"type":17,"tag":7266,"props":98980,"children":98981},{},[98982],{"type":23,"value":98983},"Increasingly a core use case",{"type":17,"tag":7266,"props":98985,"children":98986},{},[98987],{"type":23,"value":98988},"Structured transcript + meeting data",{"type":17,"tag":7239,"props":98990,"children":98991},{},[98992,98997,99002],{"type":17,"tag":7266,"props":98993,"children":98994},{},[98995],{"type":23,"value":98996},"Pricing model",{"type":17,"tag":7266,"props":98998,"children":98999},{},[99000],{"type":23,"value":99001},"Impacts scale economics",{"type":17,"tag":7266,"props":99003,"children":99004},{},[99005],{"type":23,"value":99006},"Per-connection vs usage-based",{"type":17,"tag":29,"props":99008,"children":99009},{},[99010],{"type":23,"value":99011},"This framework changes how 'best' is defined.",{"type":17,"tag":68,"props":99013,"children":99015},{"id":99014},"the-three-types-of-unified-apis-in-this-market",[99016],{"type":23,"value":99017},"The three types of unified APIs in this market",{"type":17,"tag":29,"props":99019,"children":99020},{},[99021,99023,99030],{"type":23,"value":99022},"There is no single category of ",{"type":17,"tag":133,"props":99024,"children":99027},{"href":99025,"rel":99026},"https://unified.to/calendar",[214],[99028],{"type":23,"value":99029},"'calendar API.",{"type":23,"value":99031},"' There are three distinct approaches.",{"type":17,"tag":239,"props":99033,"children":99035},{"id":99034},"_1-scheduling-specialists",[99036],{"type":23,"value":99037},"1. Scheduling specialists",{"type":17,"tag":29,"props":99039,"children":99040},{},[99041],{"type":23,"value":99042},"These platforms focus deeply on scheduling.",{"type":17,"tag":29,"props":99044,"children":99045},{},[99046],{"type":23,"value":99047},"They are strong when:",{"type":17,"tag":80,"props":99049,"children":99050},{},[99051,99056,99061],{"type":17,"tag":84,"props":99052,"children":99053},{},[99054],{"type":23,"value":99055},"booking logic is the core product",{"type":17,"tag":84,"props":99057,"children":99058},{},[99059],{"type":23,"value":99060},"advanced availability rules matter",{"type":17,"tag":84,"props":99062,"children":99063},{},[99064],{"type":23,"value":99065},"scheduling is the primary feature",{"type":17,"tag":29,"props":99067,"children":99068},{},[99069],{"type":23,"value":99070},"They are less suited when calendar is just one part of a broader product.",{"type":17,"tag":239,"props":99072,"children":99074},{"id":99073},"_2-communications-apis",[99075],{"type":23,"value":99076},"2. Communications APIs",{"type":17,"tag":29,"props":99078,"children":99079},{},[99080],{"type":23,"value":99081},"These bundle:",{"type":17,"tag":80,"props":99083,"children":99084},{},[99085,99089,99094],{"type":17,"tag":84,"props":99086,"children":99087},{},[99088],{"type":23,"value":62666},{"type":17,"tag":84,"props":99090,"children":99091},{},[99092],{"type":23,"value":99093},"calendar",{"type":17,"tag":84,"props":99095,"children":99096},{},[99097],{"type":23,"value":30404},{"type":17,"tag":29,"props":99099,"children":99100},{},[99101],{"type":23,"value":99047},{"type":17,"tag":80,"props":99103,"children":99104},{},[99105,99110],{"type":17,"tag":84,"props":99106,"children":99107},{},[99108],{"type":23,"value":99109},"you need inbox + calendar together",{"type":17,"tag":84,"props":99111,"children":99112},{},[99113],{"type":23,"value":99114},"you are building communication-heavy products",{"type":17,"tag":29,"props":99116,"children":99117},{},[99118],{"type":23,"value":99119},"They are not designed for broader integration coverage beyond communications.",{"type":17,"tag":239,"props":99121,"children":99123},{"id":99122},"_3-broad-integration-platforms-with-calendar-support",[99124],{"type":23,"value":99125},"3. Broad integration platforms with calendar support",{"type":17,"tag":29,"props":99127,"children":99128},{},[99129],{"type":23,"value":99130},"These platforms treat calendar as one category among many.",{"type":17,"tag":29,"props":99132,"children":99133},{},[99134],{"type":23,"value":99135},"They are designed for:",{"type":17,"tag":80,"props":99137,"children":99138},{},[99139,99144,99149],{"type":17,"tag":84,"props":99140,"children":99141},{},[99142],{"type":23,"value":99143},"B2B SaaS products",{"type":17,"tag":84,"props":99145,"children":99146},{},[99147],{"type":23,"value":99148},"customer-facing integrations",{"type":17,"tag":84,"props":99150,"children":99151},{},[99152],{"type":23,"value":99153},"multi-system workflows",{"type":17,"tag":29,"props":99155,"children":99156},{},[99157,99162],{"type":17,"tag":48,"props":99158,"children":99159},{},[99160],{"type":23,"value":99161},"Unified fits here",{"type":23,"value":99163},", with a focus on real-time access, normalized data models, and cross-category integration.",{"type":17,"tag":68,"props":99165,"children":99167},{"id":99166},"where-unified-stands-out",[99168],{"type":23,"value":99169},"Where Unified stands out",{"type":17,"tag":29,"props":99171,"children":99172},{},[99173],{"type":23,"value":99174},"Unified is not trying to be the deepest scheduling engine. It is designed to support calendar and meeting integrations as part of a broader product architecture.",{"type":17,"tag":239,"props":99176,"children":99178},{"id":99177},"real-time-calendar-and-meeting-access",[99179],{"type":23,"value":99180},"Real-time calendar and meeting access",{"type":17,"tag":29,"props":99182,"children":99183},{},[99184],{"type":23,"value":99185},"Unified executes requests directly against source APIs in real time.",{"type":17,"tag":29,"props":99187,"children":99188},{},[99189],{"type":23,"value":99190},"When you request:",{"type":17,"tag":80,"props":99192,"children":99193},{},[99194,99199,99203],{"type":17,"tag":84,"props":99195,"children":99196},{},[99197],{"type":23,"value":99198},"events",{"type":17,"tag":84,"props":99200,"children":99201},{},[99202],{"type":23,"value":10342},{"type":17,"tag":84,"props":99204,"children":99205},{},[99206],{"type":23,"value":30419},{"type":17,"tag":29,"props":99208,"children":99209},{},[99210],{"type":23,"value":99211},"the data is fetched live from the underlying system.",{"type":17,"tag":29,"props":99213,"children":99214},{},[99215],{"type":23,"value":99216},"This matters because:",{"type":17,"tag":80,"props":99218,"children":99219},{},[99220,99225,99230],{"type":17,"tag":84,"props":99221,"children":99222},{},[99223],{"type":23,"value":99224},"scheduling flows require up-to-date availability",{"type":17,"tag":84,"props":99226,"children":99227},{},[99228],{"type":23,"value":99229},"reschedules and cancellations need immediate propagation",{"type":17,"tag":84,"props":99231,"children":99232},{},[99233],{"type":23,"value":99234},"AI features depend on current data",{"type":17,"tag":29,"props":99236,"children":99237},{},[99238],{"type":23,"value":99239},"This aligns with Unified's broader architecture: real-time execution without relying on stored or cached customer data.",{"type":17,"tag":239,"props":99241,"children":99243},{"id":99242},"no-end-customer-calendar-data-stored-at-rest",[99244],{"type":23,"value":99245},"No end-customer calendar data stored at rest",{"type":17,"tag":29,"props":99247,"children":99248},{},[99249],{"type":23,"value":99250},"Calendar data is sensitive:",{"type":17,"tag":80,"props":99252,"children":99253},{},[99254,99259,99264],{"type":17,"tag":84,"props":99255,"children":99256},{},[99257],{"type":23,"value":99258},"meeting titles expose deal context",{"type":17,"tag":84,"props":99260,"children":99261},{},[99262],{"type":23,"value":99263},"attendees reveal relationships",{"type":17,"tag":84,"props":99265,"children":99266},{},[99267],{"type":23,"value":99268},"recordings and transcripts contain internal discussions",{"type":17,"tag":29,"props":99270,"children":99271},{},[99272],{"type":23,"value":99273},"Unified does not store this data as a persistent dataset.",{"type":17,"tag":29,"props":99275,"children":99276},{},[99277],{"type":23,"value":99278},"Instead, it acts as a real-time access layer, which reduces:",{"type":17,"tag":80,"props":99280,"children":99281},{},[99282,99287,99292],{"type":17,"tag":84,"props":99283,"children":99284},{},[99285],{"type":23,"value":99286},"compliance surface area",{"type":17,"tag":84,"props":99288,"children":99289},{},[99290],{"type":23,"value":99291},"data storage risk",{"type":17,"tag":84,"props":99293,"children":99294},{},[99295],{"type":23,"value":99296},"long-term data handling complexity",{"type":17,"tag":29,"props":99298,"children":99299},{},[99300],{"type":23,"value":99301},"This is a core differentiator compared to sync-and-store approaches.",{"type":17,"tag":239,"props":99303,"children":99305},{"id":99304},"broader-object-coverage-beyond-basic-event-apis",[99306],{"type":23,"value":99307},"Broader object coverage beyond basic event APIs",{"type":17,"tag":29,"props":99309,"children":99310},{},[99311],{"type":23,"value":99312},"Many calendar APIs stop at:",{"type":17,"tag":80,"props":99314,"children":99315},{},[99316,99321],{"type":17,"tag":84,"props":99317,"children":99318},{},[99319],{"type":23,"value":99320},"event CRUD",{"type":17,"tag":84,"props":99322,"children":99323},{},[99324],{"type":23,"value":99325},"free/busy",{"type":17,"tag":29,"props":99327,"children":99328},{},[99329,99331,99338],{"type":23,"value":99330},"Unified's calendar and meetings category supports a ",{"type":17,"tag":133,"props":99332,"children":99335},{"href":99333,"rel":99334},"https://docs.unified.to/calendar/overview",[214],[99336],{"type":23,"value":99337},"broader model",{"type":23,"value":20456},{"type":17,"tag":80,"props":99340,"children":99341},{},[99342,99352,99363],{"type":17,"tag":84,"props":99343,"children":99344},{},[99345,99350],{"type":17,"tag":6121,"props":99346,"children":99348},{"className":99347},[],[99349],{"type":23,"value":73973},{"type":23,"value":99351}," for scheduling",{"type":17,"tag":84,"props":99353,"children":99354},{},[99355,99361],{"type":17,"tag":6121,"props":99356,"children":99358},{"className":99357},[],[99359],{"type":23,"value":99360},"busy",{"type":23,"value":99362}," for availability",{"type":17,"tag":84,"props":99364,"children":99365},{},[99366,99371],{"type":17,"tag":6121,"props":99367,"children":99369},{"className":99368},[],[99370],{"type":23,"value":74195},{"type":23,"value":99372}," for meeting recordings and transcripts",{"type":17,"tag":29,"props":99374,"children":99375},{},[99376],{"type":23,"value":99377},"This allows teams to build:",{"type":17,"tag":80,"props":99379,"children":99380},{},[99381,99386,99391],{"type":17,"tag":84,"props":99382,"children":99383},{},[99384],{"type":23,"value":99385},"scheduling features",{"type":17,"tag":84,"props":99387,"children":99388},{},[99389],{"type":23,"value":99390},"meeting intelligence",{"type":17,"tag":84,"props":99392,"children":99393},{},[99394],{"type":23,"value":99395},"post-meeting workflows",{"type":17,"tag":29,"props":99397,"children":99398},{},[99399],{"type":23,"value":99400},"not just calendar syncing.",{"type":17,"tag":239,"props":99402,"children":99404},{"id":99403},"strong-fit-for-ai-meeting-products",[99405],{"type":23,"value":99406},"Strong fit for AI meeting products",{"type":17,"tag":29,"props":99408,"children":99409},{},[99410],{"type":23,"value":99411},"Calendar integrations are increasingly used for:",{"type":17,"tag":80,"props":99413,"children":99414},{},[99415,99420,99425,99430,99440],{"type":17,"tag":84,"props":99416,"children":99417},{},[99418],{"type":23,"value":99419},"AI meeting notetakers",{"type":17,"tag":84,"props":99421,"children":99422},{},[99423],{"type":23,"value":99424},"transcript summarization",{"type":17,"tag":84,"props":99426,"children":99427},{},[99428],{"type":23,"value":99429},"action item extraction",{"type":17,"tag":84,"props":99431,"children":99432},{},[99433,99435,99439],{"type":23,"value":99434},"meeting search (",{"type":17,"tag":133,"props":99436,"children":99437},{"href":5201},[99438],{"type":23,"value":5204},{"type":23,"value":12034},{"type":17,"tag":84,"props":99441,"children":99442},{},[99443],{"type":23,"value":99444},"CRM updates after calls",{"type":17,"tag":29,"props":99446,"children":99447},{},[99448],{"type":23,"value":99449},"This depends on:",{"type":17,"tag":80,"props":99451,"children":99452},{},[99453,99458,99463],{"type":17,"tag":84,"props":99454,"children":99455},{},[99456],{"type":23,"value":99457},"transcript access",{"type":17,"tag":84,"props":99459,"children":99460},{},[99461],{"type":23,"value":99462},"speaker attribution",{"type":17,"tag":84,"props":99464,"children":99465},{},[99466],{"type":23,"value":99467},"recording lifecycle events",{"type":17,"tag":29,"props":99469,"children":99470},{},[99471],{"type":23,"value":99472},"Unified's model supports retrieving recordings and transcript data in a normalized format, making it usable for AI pipelines without building separate integrations per provider.",{"type":17,"tag":239,"props":99474,"children":99476},{"id":99475},"better-fit-for-cross-category-workflows",[99477],{"type":23,"value":99478},"Better fit for cross-category workflows",{"type":17,"tag":29,"props":99480,"children":99481},{},[99482],{"type":23,"value":99483},"Calendar data rarely exists in isolation.",{"type":17,"tag":29,"props":99485,"children":99486},{},[99487],{"type":23,"value":99488},"Common product workflows include:",{"type":17,"tag":80,"props":99490,"children":99491},{},[99492,99497,99502],{"type":17,"tag":84,"props":99493,"children":99494},{},[99495],{"type":23,"value":99496},"ATS + Calendar for interview scheduling",{"type":17,"tag":84,"props":99498,"children":99499},{},[99500],{"type":23,"value":99501},"Calendar + CRM for sales activity tracking",{"type":17,"tag":84,"props":99503,"children":99504},{},[99505],{"type":23,"value":99506},"Calendar + AI for summaries and follow-ups",{"type":17,"tag":29,"props":99508,"children":99509},{},[99510],{"type":23,"value":99511},"Unified supports these workflows because calendar is one category among many.",{"type":17,"tag":29,"props":99513,"children":99514},{},[99515],{"type":23,"value":99516},"Instead of stitching together multiple vendors, teams can build across categories using the same connection model and API structure.",{"type":17,"tag":68,"props":99518,"children":99520},{"id":99519},"when-unified-is-the-strongest-choice",[99521],{"type":23,"value":99522},"When Unified is the strongest choice",{"type":17,"tag":29,"props":99524,"children":99525},{},[99526],{"type":23,"value":99527},"Unified is the best option when your product needs calendar and meeting data as part of a larger system.",{"type":17,"tag":239,"props":99529,"children":99531},{"id":99530},"embedded-scheduling-inside-saas-products",[99532],{"type":23,"value":99533},"Embedded scheduling inside SaaS products",{"type":17,"tag":29,"props":99535,"children":99536},{},[99537],{"type":23,"value":99538},"When scheduling is a feature, not the product.",{"type":17,"tag":239,"props":99540,"children":99542},{"id":99541},"interview-scheduling-across-ats-and-calendar",[99543],{"type":23,"value":99544},"Interview scheduling across ATS and calendar",{"type":17,"tag":29,"props":99546,"children":99547},{},[99548],{"type":23,"value":99549},"When calendar data needs to align with candidate and job context.",{"type":17,"tag":239,"props":99551,"children":99553},{"id":99552},"ai-meeting-assistants-and-notetakers",[99554],{"type":23,"value":99555},"AI meeting assistants and notetakers",{"type":17,"tag":29,"props":99557,"children":99558},{},[99559],{"type":23,"value":99560},"When transcripts and recordings drive product functionality.",{"type":17,"tag":239,"props":99562,"children":99564},{"id":99563},"crm-connected-meeting-workflows",[99565],{"type":23,"value":99566},"CRM-connected meeting workflows",{"type":17,"tag":29,"props":99568,"children":99569},{},[99570],{"type":23,"value":99571},"When meetings trigger updates, notes, and follow-ups.",{"type":17,"tag":239,"props":99573,"children":99575},{"id":99574},"multi-category-integrations",[99576],{"type":23,"value":99577},"Multi-category integrations",{"type":17,"tag":29,"props":99579,"children":99580},{},[99581],{"type":23,"value":99582},"When calendar is one of several integration requirements.",{"type":17,"tag":68,"props":99584,"children":99586},{"id":99585},"when-a-calendar-specialist-may-be-a-better-fit",[99587],{"type":23,"value":99588},"When a calendar specialist may be a better fit",{"type":17,"tag":29,"props":99590,"children":99591},{},[99592],{"type":23,"value":99593},"There are cases where a specialist is the right choice.",{"type":17,"tag":29,"props":99595,"children":99596},{},[99597],{"type":23,"value":99598},"If your product is:",{"type":17,"tag":80,"props":99600,"children":99601},{},[99602,99607,99612],{"type":17,"tag":84,"props":99603,"children":99604},{},[99605],{"type":23,"value":99606},"a scheduling platform",{"type":17,"tag":84,"props":99608,"children":99609},{},[99610],{"type":23,"value":99611},"a booking engine",{"type":17,"tag":84,"props":99613,"children":99614},{},[99615],{"type":23,"value":99616},"focused on complex scheduling rules",{"type":17,"tag":29,"props":99618,"children":99619},{},[99620],{"type":23,"value":99621},"then a scheduling-focused API may offer deeper functionality.",{"type":17,"tag":29,"props":99623,"children":99624},{},[99625],{"type":23,"value":99626},"But this is a narrower category.",{"type":17,"tag":29,"props":99628,"children":99629},{},[99630],{"type":23,"value":99631},"Most B2B SaaS products do not operate this way. They need calendar data to connect with other systems and workflows.",{"type":17,"tag":68,"props":99633,"children":99635},{"id":99634},"best-fit-by-use-case",[99636],{"type":23,"value":99637},"Best fit by use case",{"type":17,"tag":7231,"props":99639,"children":99640},{},[99641,99655],{"type":17,"tag":7235,"props":99642,"children":99643},{},[99644],{"type":17,"tag":7239,"props":99645,"children":99646},{},[99647,99651],{"type":17,"tag":7243,"props":99648,"children":99649},{},[99650],{"type":23,"value":96563},{"type":17,"tag":7243,"props":99652,"children":99653},{},[99654],{"type":23,"value":80744},{"type":17,"tag":7259,"props":99656,"children":99657},{},[99658,99671,99684,99699,99714,99729],{"type":17,"tag":7239,"props":99659,"children":99660},{},[99661,99666],{"type":17,"tag":7266,"props":99662,"children":99663},{},[99664],{"type":23,"value":99665},"Scheduling-first product",{"type":17,"tag":7266,"props":99667,"children":99668},{},[99669],{"type":23,"value":99670},"Scheduling specialist",{"type":17,"tag":7239,"props":99672,"children":99673},{},[99674,99679],{"type":17,"tag":7266,"props":99675,"children":99676},{},[99677],{"type":23,"value":99678},"Email + calendar product",{"type":17,"tag":7266,"props":99680,"children":99681},{},[99682],{"type":23,"value":99683},"Communications API",{"type":17,"tag":7239,"props":99685,"children":99686},{},[99687,99692],{"type":17,"tag":7266,"props":99688,"children":99689},{},[99690],{"type":23,"value":99691},"AI meeting products",{"type":17,"tag":7266,"props":99693,"children":99694},{},[99695],{"type":17,"tag":48,"props":99696,"children":99697},{},[99698],{"type":23,"value":87523},{"type":17,"tag":7239,"props":99700,"children":99701},{},[99702,99707],{"type":17,"tag":7266,"props":99703,"children":99704},{},[99705],{"type":23,"value":99706},"SaaS with multiple integrations",{"type":17,"tag":7266,"props":99708,"children":99709},{},[99710],{"type":17,"tag":48,"props":99711,"children":99712},{},[99713],{"type":23,"value":87523},{"type":17,"tag":7239,"props":99715,"children":99716},{},[99717,99722],{"type":17,"tag":7266,"props":99718,"children":99719},{},[99720],{"type":23,"value":99721},"Interview coordination (ATS + Calendar)",{"type":17,"tag":7266,"props":99723,"children":99724},{},[99725],{"type":17,"tag":48,"props":99726,"children":99727},{},[99728],{"type":23,"value":87523},{"type":17,"tag":7239,"props":99730,"children":99731},{},[99732,99737],{"type":17,"tag":7266,"props":99733,"children":99734},{},[99735],{"type":23,"value":99736},"Privacy-sensitive B2B SaaS",{"type":17,"tag":7266,"props":99738,"children":99739},{},[99740],{"type":17,"tag":48,"props":99741,"children":99742},{},[99743],{"type":23,"value":87523},{"type":17,"tag":68,"props":99745,"children":99747},{"id":99746},"why-the-best-calendar-api-question-has-changed",[99748],{"type":23,"value":99749},"Why the 'best calendar API' question has changed",{"type":17,"tag":29,"props":99751,"children":99752},{},[99753],{"type":23,"value":99754},"A few years ago, this decision was mostly about scheduling and event sync.",{"type":17,"tag":29,"props":99756,"children":99757},{},[99758],{"type":23,"value":99759},"That is no longer the case.",{"type":17,"tag":29,"props":99761,"children":99762},{},[99763],{"type":23,"value":99764},"Calendar and meeting integrations now support:",{"type":17,"tag":80,"props":99766,"children":99767},{},[99768,99773,99778,99783,99788],{"type":17,"tag":84,"props":99769,"children":99770},{},[99771],{"type":23,"value":99772},"customer-facing scheduling",{"type":17,"tag":84,"props":99774,"children":99775},{},[99776],{"type":23,"value":99777},"interview coordination",{"type":17,"tag":84,"props":99779,"children":99780},{},[99781],{"type":23,"value":99782},"meeting recordings and transcripts",{"type":17,"tag":84,"props":99784,"children":99785},{},[99786],{"type":23,"value":99787},"AI-generated summaries",{"type":17,"tag":84,"props":99789,"children":99790},{},[99791],{"type":23,"value":99792},"cross-system workflows",{"type":17,"tag":29,"props":99794,"children":99795},{},[99796],{"type":23,"value":99797},"That changes what 'best' means.",{"type":17,"tag":29,"props":99799,"children":99800},{},[99801],{"type":23,"value":99802},"It is no longer just about:",{"type":17,"tag":80,"props":99804,"children":99805},{},[99806,99811],{"type":17,"tag":84,"props":99807,"children":99808},{},[99809],{"type":23,"value":99810},"event creation",{"type":17,"tag":84,"props":99812,"children":99813},{},[99814],{"type":23,"value":10342},{"type":17,"tag":29,"props":99816,"children":99817},{},[99818],{"type":23,"value":99819},"It is about:",{"type":17,"tag":80,"props":99821,"children":99822},{},[99823,99828,99833,99837],{"type":17,"tag":84,"props":99824,"children":99825},{},[99826],{"type":23,"value":99827},"real-time accuracy",{"type":17,"tag":84,"props":99829,"children":99830},{},[99831],{"type":23,"value":99832},"meeting lifecycle coverage",{"type":17,"tag":84,"props":99834,"children":99835},{},[99836],{"type":23,"value":99457},{"type":17,"tag":84,"props":99838,"children":99839},{},[99840],{"type":23,"value":99841},"integration with the rest of your product",{"type":17,"tag":68,"props":99843,"children":99844},{"id":7672},[99845],{"type":23,"value":7675},{"type":17,"tag":80,"props":99847,"children":99848},{},[99849,99854,99859,99864,99869],{"type":17,"tag":84,"props":99850,"children":99851},{},[99852],{"type":23,"value":99853},"The best unified API for calendar and meeting integrations depends on whether calendar is your product or part of your product",{"type":17,"tag":84,"props":99855,"children":99856},{},[99857],{"type":23,"value":99858},"Scheduling specialists are strong when booking logic is the core requirement",{"type":17,"tag":84,"props":99860,"children":99861},{},[99862],{"type":23,"value":99863},"Unified is stronger for modern SaaS products that need calendar data alongside CRM, ATS, and AI workflows",{"type":17,"tag":84,"props":99865,"children":99866},{},[99867],{"type":23,"value":99868},"Real-time execution and no stored customer data matter for calendar and meeting use cases",{"type":17,"tag":84,"props":99870,"children":99871},{},[99872],{"type":23,"value":99873},"Meeting integrations now need to support recordings, transcripts, and AI—not just event CRUD",{"type":17,"tag":29,"props":99875,"children":99876},{},[99877],{"type":23,"value":99878},"If you are building a modern B2B SaaS product, calendar integrations are not an isolated feature.",{"type":17,"tag":29,"props":99880,"children":99881},{},[99882],{"type":23,"value":99883},"They are part of how your product schedules, communicates, analyzes, and acts on customer interactions.",{"type":17,"tag":29,"props":99885,"children":99886},{},[99887,99889,99893],{"type":23,"value":99888},"That is why the best choice is not just the deepest ",{"type":17,"tag":133,"props":99890,"children":99891},{"href":13708},[99892],{"type":23,"value":13711},{"type":23,"value":54},{"type":17,"tag":29,"props":99895,"children":99896},{},[99897],{"type":23,"value":99898},"It is the one that fits the full system your product needs to build.",{"type":17,"tag":29,"props":99900,"children":99901},{},[99902],{"type":17,"tag":133,"props":99903,"children":99905},{"href":1612,"rel":99904},[214],[99906],{"type":23,"value":44481},{"type":17,"tag":29,"props":99908,"children":99909},{},[99910],{"type":17,"tag":133,"props":99911,"children":99913},{"href":1623,"rel":99912},[214],[99914],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":99916},[99917,99918,99919,99924,99931,99938,99939,99940,99941],{"id":98762,"depth":1629,"text":98765},{"id":98826,"depth":1629,"text":98829},{"id":99014,"depth":1629,"text":99017,"children":99920},[99921,99922,99923],{"id":99034,"depth":1635,"text":99037},{"id":99073,"depth":1635,"text":99076},{"id":99122,"depth":1635,"text":99125},{"id":99166,"depth":1629,"text":99169,"children":99925},[99926,99927,99928,99929,99930],{"id":99177,"depth":1635,"text":99180},{"id":99242,"depth":1635,"text":99245},{"id":99304,"depth":1635,"text":99307},{"id":99403,"depth":1635,"text":99406},{"id":99475,"depth":1635,"text":99478},{"id":99519,"depth":1629,"text":99522,"children":99932},[99933,99934,99935,99936,99937],{"id":99530,"depth":1635,"text":99533},{"id":99541,"depth":1635,"text":99544},{"id":99552,"depth":1635,"text":99555},{"id":99563,"depth":1635,"text":99566},{"id":99574,"depth":1635,"text":99577},{"id":99585,"depth":1629,"text":99588},{"id":99634,"depth":1629,"text":99637},{"id":99746,"depth":1629,"text":99749},{"id":7672,"depth":1629,"text":7675},"content:blog:what_unified_api_is_best_for_calendar_and_meeting_platform_integrations.md","blog/what_unified_api_is_best_for_calendar_and_meeting_platform_integrations.md","blog/what_unified_api_is_best_for_calendar_and_meeting_platform_integrations",{"_path":99946,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":99947,"description":99948,"img":99949,"date":98720,"tag":12,"body":99950,"_type":1677,"_id":101182,"_source":1679,"_file":101183,"_stem":101184,"_extension":1682},"/blog/what_unified_api_is_best_for_task_and_project_management_integrations_across_saas_platforms","What Unified API is Best for Task and Project Management Integrations Across SaaS Platforms?","The best unified API for task and project management integrations depends on whether your product needs current task state, write support, normalized objects,...","https://s3.us-east-2.amazonaws.com/unified-article-images/what_unified_api_is_best_for_task_and_project_management_integrations_across_saas_platforms-icon.png",{"type":14,"children":99951,"toc":101152},[99952,99957,99960,99967,99977,99982,99988,100000,100005,100028,100033,100039,100044,100049,100128,100133,100152,100157,100178,100183,100189,100201,100207,100410,100416,100421,100426,100449,100454,100477,100482,100487,100510,100515,100521,100526,100531,100537,100542,100547,100570,100576,100581,100585,100601,100606,100612,100617,100636,100641,100646,100669,100674,100679,100684,100689,100706,100711,100734,100740,100745,100750,100778,100783,100789,100794,100799,100804,100809,100813,100831,100835,100840,100845,100868,100872,100877,100881,100898,100903,100908,100912,100930,100935,100941,100946,100972,100977,100983,100988,100993,100998,101004,101009,101015,101020,101026,101031,101037,101042,101074,101079,101102,101106,101134,101143],{"type":17,"tag":18,"props":99953,"children":99955},{"id":99954},"what-unified-api-is-best-for-task-and-project-management-integrations-across-saas-platforms",[99956],{"type":23,"value":99947},{"type":17,"tag":25,"props":99958,"children":99959},{},[],{"type":17,"tag":29,"props":99961,"children":99962},{},[99963],{"type":17,"tag":33,"props":99964,"children":99965},{},[99966],{"type":23,"value":96921},{"type":17,"tag":29,"props":99968,"children":99969},{},[99970,99971,99975],{"type":23,"value":98742},{"type":17,"tag":133,"props":99972,"children":99973},{"href":7691},[99974],{"type":23,"value":7459},{"type":23,"value":99976}," for task and project management integrations depends on whether your product needs current task state, write support, normalized objects, and consistent event delivery across integrations like Asana, Jira, ClickUp, GitHub, and Linear.",{"type":17,"tag":29,"props":99978,"children":99979},{},[99980],{"type":23,"value":99981},"For most SaaS products building analytics, automation, copilots, or coordination features on top of task data, Unified is the strongest fit because it provides a Task Management API where requests are routed directly to the source API, no end-customer task data is stored at rest, and core objects like Project, Task, Comment, and Change are standardized across integrations.",{"type":17,"tag":68,"props":99983,"children":99985},{"id":99984},"what-is-a-unified-api-for-task-and-project-management",[99986],{"type":23,"value":99987},"What is a unified API for task and project management?",{"type":17,"tag":29,"props":99989,"children":99990},{},[99991,99992,99998],{"type":23,"value":9619},{"type":17,"tag":133,"props":99993,"children":99995},{"href":99994},"/31a6207b83848081ad42f5104ba6bec4",[99996],{"type":23,"value":99997},"unified API for task and project management",{"type":23,"value":99999}," allows SaaS products to access and update work data across multiple integrations using a consistent object model and API structure.",{"type":17,"tag":29,"props":100001,"children":100002},{},[100003],{"type":23,"value":100004},"Instead of building separate integrations for each API, developers work with a single category-scoped API that standardizes:",{"type":17,"tag":80,"props":100006,"children":100007},{},[100008,100013,100018,100023],{"type":17,"tag":84,"props":100009,"children":100010},{},[100011],{"type":23,"value":100012},"projects (boards, workspaces, collections)",{"type":17,"tag":84,"props":100014,"children":100015},{},[100016],{"type":23,"value":100017},"tasks (issues, to-dos, work items)",{"type":17,"tag":84,"props":100019,"children":100020},{},[100021],{"type":23,"value":100022},"comments (discussion and updates)",{"type":17,"tag":84,"props":100024,"children":100025},{},[100026],{"type":23,"value":100027},"change history (activity and field updates)",{"type":17,"tag":29,"props":100029,"children":100030},{},[100031],{"type":23,"value":100032},"The goal is not just connectivity. It is removing the need to rewrite logic for every integration's task structure, status model, assignment system, and update behavior.",{"type":17,"tag":68,"props":100034,"children":100036},{"id":100035},"why-are-task-and-project-management-integrations-harder-than-they-look",[100037],{"type":23,"value":100038},"Why are task and project management integrations harder than they look?",{"type":17,"tag":29,"props":100040,"children":100041},{},[100042],{"type":23,"value":100043},"Task data appears simple at first. In practice, it is one of the most inconsistent categories across SaaS integrations.",{"type":17,"tag":29,"props":100045,"children":100046},{},[100047],{"type":23,"value":100048},"Key differences across integrations:",{"type":17,"tag":80,"props":100050,"children":100051},{},[100052,100062,100072,100082,100092,100102,100112],{"type":17,"tag":84,"props":100053,"children":100054},{},[100055,100060],{"type":17,"tag":48,"props":100056,"children":100057},{},[100058],{"type":23,"value":100059},"Task structure:",{"type":23,"value":100061}," tasks, issues, and work items follow different schemas",{"type":17,"tag":84,"props":100063,"children":100064},{},[100065,100070],{"type":17,"tag":48,"props":100066,"children":100067},{},[100068],{"type":23,"value":100069},"Project hierarchy:",{"type":23,"value":100071}," boards, workspaces, folders, and portfolios are modeled differently",{"type":17,"tag":84,"props":100073,"children":100074},{},[100075,100080],{"type":17,"tag":48,"props":100076,"children":100077},{},[100078],{"type":23,"value":100079},"Status and completion:",{"type":23,"value":100081}," some integrations use workflows, others use boolean completion with timestamps",{"type":17,"tag":84,"props":100083,"children":100084},{},[100085,100090],{"type":17,"tag":48,"props":100086,"children":100087},{},[100088],{"type":23,"value":100089},"Comments:",{"type":23,"value":100091}," editing, deletion, and formatting behavior varies",{"type":17,"tag":84,"props":100093,"children":100094},{},[100095,100100],{"type":17,"tag":48,"props":100096,"children":100097},{},[100098],{"type":23,"value":100099},"Change history:",{"type":23,"value":100101}," some integrations expose detailed activity logs, others provide limited updates",{"type":17,"tag":84,"props":100103,"children":100104},{},[100105,100110],{"type":17,"tag":48,"props":100106,"children":100107},{},[100108],{"type":23,"value":100109},"Due dates and priority:",{"type":23,"value":100111}," not all integrations support the same fields or formats",{"type":17,"tag":84,"props":100113,"children":100114},{},[100115,100120,100122,100126],{"type":17,"tag":48,"props":100116,"children":100117},{},[100118],{"type":23,"value":100119},"Event delivery:",{"type":23,"value":100121}," some integrations provide native ",{"type":17,"tag":133,"props":100123,"children":100124},{"href":4999},[100125],{"type":23,"value":5002},{"type":23,"value":100127},", others require polling-based change detection",{"type":17,"tag":29,"props":100129,"children":100130},{},[100131],{"type":23,"value":100132},"These differences create two problems:",{"type":17,"tag":6154,"props":100134,"children":100135},{},[100136,100144],{"type":17,"tag":84,"props":100137,"children":100138},{},[100139],{"type":17,"tag":48,"props":100140,"children":100141},{},[100142],{"type":23,"value":100143},"Engineering overhead increases with every integration",{"type":17,"tag":84,"props":100145,"children":100146},{},[100147],{"type":17,"tag":48,"props":100148,"children":100149},{},[100150],{"type":23,"value":100151},"Product features degrade when task data is delayed or inconsistent",{"type":17,"tag":29,"props":100153,"children":100154},{},[100155],{"type":23,"value":100156},"Task data changes constantly. If your product depends on current work-state, stale or partial data breaks:",{"type":17,"tag":80,"props":100158,"children":100159},{},[100160,100164,100169,100173],{"type":17,"tag":84,"props":100161,"children":100162},{},[100163],{"type":23,"value":54907},{"type":17,"tag":84,"props":100165,"children":100166},{},[100167],{"type":23,"value":100168},"prioritization logic",{"type":17,"tag":84,"props":100170,"children":100171},{},[100172],{"type":23,"value":69556},{"type":17,"tag":84,"props":100174,"children":100175},{},[100176],{"type":23,"value":100177},"AI-generated summaries and actions",{"type":17,"tag":29,"props":100179,"children":100180},{},[100181],{"type":23,"value":100182},"This is why architecture matters more for task and project management than most other integration categories.",{"type":17,"tag":68,"props":100184,"children":100186},{"id":100185},"what-should-saas-teams-evaluate-in-a-task-management-unified-api",[100187],{"type":23,"value":100188},"What should SaaS teams evaluate in a task management unified API?",{"type":17,"tag":29,"props":100190,"children":100191},{},[100192,100194,100199],{"type":23,"value":100193},"A useful task management unified API needs to ",{"type":17,"tag":133,"props":100195,"children":100196},{"href":99994},[100197],{"type":23,"value":100198},"handle more than basic retrieval",{"type":23,"value":100200},". It must support full work-state modeling, updates, and event delivery across integrations.",{"type":17,"tag":239,"props":100202,"children":100204},{"id":100203},"evaluation-criteria",[100205],{"type":23,"value":100206},"Evaluation criteria",{"type":17,"tag":7231,"props":100208,"children":100209},{},[100210,100230],{"type":17,"tag":7235,"props":100211,"children":100212},{},[100213],{"type":17,"tag":7239,"props":100214,"children":100215},{},[100216,100221,100225],{"type":17,"tag":7243,"props":100217,"children":100218},{},[100219],{"type":23,"value":100220},"Criterion",{"type":17,"tag":7243,"props":100222,"children":100223},{},[100224],{"type":23,"value":85072},{"type":17,"tag":7243,"props":100226,"children":100227},{},[100228],{"type":23,"value":100229},"What strong support looks like",{"type":17,"tag":7259,"props":100231,"children":100232},{},[100233,100251,100268,100286,100303,100321,100339,100357,100375,100393],{"type":17,"tag":7239,"props":100234,"children":100235},{},[100236,100241,100246],{"type":17,"tag":7266,"props":100237,"children":100238},{},[100239],{"type":23,"value":100240},"Project, Task, Comment, and Change coverage",{"type":17,"tag":7266,"props":100242,"children":100243},{},[100244],{"type":23,"value":100245},"Serious product features require more than just tasks",{"type":17,"tag":7266,"props":100247,"children":100248},{},[100249],{"type":23,"value":100250},"Core work objects are standardized across integrations",{"type":17,"tag":7239,"props":100252,"children":100253},{},[100254,100258,100263],{"type":17,"tag":7266,"props":100255,"children":100256},{},[100257],{"type":23,"value":63139},{"type":17,"tag":7266,"props":100259,"children":100260},{},[100261],{"type":23,"value":100262},"Many products need to update tasks, assign users, and add comments",{"type":17,"tag":7266,"props":100264,"children":100265},{},[100266],{"type":23,"value":100267},"API supports both retrieval and write operations where integrations allow",{"type":17,"tag":7239,"props":100269,"children":100270},{},[100271,100276,100281],{"type":17,"tag":7266,"props":100272,"children":100273},{},[100274],{"type":23,"value":100275},"Current-state reads",{"type":17,"tag":7266,"props":100277,"children":100278},{},[100279],{"type":23,"value":100280},"Task data changes frequently",{"type":17,"tag":7266,"props":100282,"children":100283},{},[100284],{"type":23,"value":100285},"Requests are routed directly to the source API rather than served from a stored replica",{"type":17,"tag":7239,"props":100287,"children":100288},{},[100289,100293,100298],{"type":17,"tag":7266,"props":100290,"children":100291},{},[100292],{"type":23,"value":10049},{"type":17,"tag":7266,"props":100294,"children":100295},{},[100296],{"type":23,"value":100297},"Automations and notifications depend on updates",{"type":17,"tag":7266,"props":100299,"children":100300},{},[100301],{"type":23,"value":100302},"Native and virtual webhooks delivered through a consistent interface",{"type":17,"tag":7239,"props":100304,"children":100305},{},[100306,100311,100316],{"type":17,"tag":7266,"props":100307,"children":100308},{},[100309],{"type":23,"value":100310},"Status and completion handling",{"type":17,"tag":7266,"props":100312,"children":100313},{},[100314],{"type":23,"value":100315},"Work-state semantics vary across integrations",{"type":17,"tag":7266,"props":100317,"children":100318},{},[100319],{"type":23,"value":100320},"Common fields are standardized while respecting integration-specific behavior",{"type":17,"tag":7239,"props":100322,"children":100323},{},[100324,100329,100334],{"type":17,"tag":7266,"props":100325,"children":100326},{},[100327],{"type":23,"value":100328},"Comments and change history",{"type":17,"tag":7266,"props":100330,"children":100331},{},[100332],{"type":23,"value":100333},"Context and auditability are critical",{"type":17,"tag":7266,"props":100335,"children":100336},{},[100337],{"type":23,"value":100338},"Discussion and updates are accessible alongside tasks",{"type":17,"tag":7239,"props":100340,"children":100341},{},[100342,100347,100352],{"type":17,"tag":7266,"props":100343,"children":100344},{},[100345],{"type":23,"value":100346},"Custom fields support",{"type":17,"tag":7266,"props":100348,"children":100349},{},[100350],{"type":23,"value":100351},"Many customers rely on integration-specific fields",{"type":17,"tag":7266,"props":100353,"children":100354},{},[100355],{"type":23,"value":100356},"Access to custom fields or original provider fields when needed",{"type":17,"tag":7239,"props":100358,"children":100359},{},[100360,100365,100370],{"type":17,"tag":7266,"props":100361,"children":100362},{},[100363],{"type":23,"value":100364},"Authorization handling",{"type":17,"tag":7266,"props":100366,"children":100367},{},[100368],{"type":23,"value":100369},"Auth complexity slows launches",{"type":17,"tag":7266,"props":100371,"children":100372},{},[100373],{"type":23,"value":100374},"Unified authorization across integrations with minimal setup",{"type":17,"tag":7239,"props":100376,"children":100377},{},[100378,100383,100388],{"type":17,"tag":7266,"props":100379,"children":100380},{},[100381],{"type":23,"value":100382},"Pricing at scale",{"type":17,"tag":7266,"props":100384,"children":100385},{},[100386],{"type":23,"value":100387},"Per-connection pricing can limit growth",{"type":17,"tag":7266,"props":100389,"children":100390},{},[100391],{"type":23,"value":100392},"Usage-based pricing aligned to API volume",{"type":17,"tag":7239,"props":100394,"children":100395},{},[100396,100400,100405],{"type":17,"tag":7266,"props":100397,"children":100398},{},[100399],{"type":23,"value":98961},{"type":17,"tag":7266,"props":100401,"children":100402},{},[100403],{"type":23,"value":100404},"Task data often connects to other domains",{"type":17,"tag":7266,"props":100406,"children":100407},{},[100408],{"type":23,"value":100409},"Adjacent categories available on the same platform",{"type":17,"tag":68,"props":100411,"children":100413},{"id":100412},"which-unified-api-is-best-for-task-and-project-management-integrations",[100414],{"type":23,"value":100415},"Which unified API is best for task and project management integrations?",{"type":17,"tag":29,"props":100417,"children":100418},{},[100419],{"type":23,"value":100420},"The answer depends on what your product needs from task data.",{"type":17,"tag":29,"props":100422,"children":100423},{},[100424],{"type":23,"value":100425},"If your product:",{"type":17,"tag":80,"props":100427,"children":100428},{},[100429,100434,100439,100444],{"type":17,"tag":84,"props":100430,"children":100431},{},[100432],{"type":23,"value":100433},"aggregates work across multiple integrations",{"type":17,"tag":84,"props":100435,"children":100436},{},[100437],{"type":23,"value":100438},"depends on current task state",{"type":17,"tag":84,"props":100440,"children":100441},{},[100442],{"type":23,"value":100443},"needs to update tasks, assignments, or comments",{"type":17,"tag":84,"props":100445,"children":100446},{},[100447],{"type":23,"value":100448},"builds analytics, automation, or AI features on top of task data",{"type":17,"tag":29,"props":100450,"children":100451},{},[100452],{"type":23,"value":100453},"then the strongest fit is a unified API that:",{"type":17,"tag":80,"props":100455,"children":100456},{},[100457,100462,100467,100472],{"type":17,"tag":84,"props":100458,"children":100459},{},[100460],{"type":23,"value":100461},"retrieves data directly from the source API",{"type":17,"tag":84,"props":100463,"children":100464},{},[100465],{"type":23,"value":100466},"does not store a separate task database",{"type":17,"tag":84,"props":100468,"children":100469},{},[100470],{"type":23,"value":100471},"standardizes core task objects",{"type":17,"tag":84,"props":100473,"children":100474},{},[100475],{"type":23,"value":100476},"provides consistent event delivery",{"type":17,"tag":29,"props":100478,"children":100479},{},[100480],{"type":23,"value":100481},"For this use case, Unified is the strongest option.",{"type":17,"tag":29,"props":100483,"children":100484},{},[100485],{"type":23,"value":100486},"Other architectural approaches exist, but they optimize for different tradeoffs:",{"type":17,"tag":80,"props":100488,"children":100489},{},[100490,100500],{"type":17,"tag":84,"props":100491,"children":100492},{},[100493,100498],{"type":17,"tag":48,"props":100494,"children":100495},{},[100496],{"type":23,"value":100497},"stored sync layers",{"type":23,"value":100499}," prioritize predictable read performance but introduce delay between the source integration and your product",{"type":17,"tag":84,"props":100501,"children":100502},{},[100503,100508],{"type":17,"tag":48,"props":100504,"children":100505},{},[100506],{"type":23,"value":100507},"integration-specific execution layers",{"type":23,"value":100509}," prioritize direct access to each API but do not provide a unified task model",{"type":17,"tag":29,"props":100511,"children":100512},{},[100513],{"type":23,"value":100514},"For task and project management, where work-state changes constantly, those tradeoffs can limit product accuracy and increase integration maintenance.",{"type":17,"tag":68,"props":100516,"children":100518},{"id":100517},"why-unified-is-a-strong-fit-for-task-and-project-management-data",[100519],{"type":23,"value":100520},"Why Unified is a strong fit for task and project management data",{"type":17,"tag":29,"props":100522,"children":100523},{},[100524],{"type":23,"value":100525},"Task data is operational. It reflects what teams are working on right now.",{"type":17,"tag":29,"props":100527,"children":100528},{},[100529],{"type":23,"value":100530},"Unified is designed around that constraint.",{"type":17,"tag":239,"props":100532,"children":100534},{"id":100533},"real-time-requests-routed-to-the-source-api",[100535],{"type":23,"value":100536},"Real-time requests routed to the source API",{"type":17,"tag":29,"props":100538,"children":100539},{},[100540],{"type":23,"value":100541},"Every request is executed directly against the source API. There is no stored task replica.",{"type":17,"tag":29,"props":100543,"children":100544},{},[100545],{"type":23,"value":100546},"This matters when:",{"type":17,"tag":80,"props":100548,"children":100549},{},[100550,100555,100560,100565],{"type":17,"tag":84,"props":100551,"children":100552},{},[100553],{"type":23,"value":100554},"task status changes frequently",{"type":17,"tag":84,"props":100556,"children":100557},{},[100558],{"type":23,"value":100559},"assignments update throughout the day",{"type":17,"tag":84,"props":100561,"children":100562},{},[100563],{"type":23,"value":100564},"comments and activity drive context",{"type":17,"tag":84,"props":100566,"children":100567},{},[100568],{"type":23,"value":100569},"analytics depend on current state",{"type":17,"tag":239,"props":100571,"children":100573},{"id":100572},"no-end-customer-task-data-stored-at-rest",[100574],{"type":23,"value":100575},"No end-customer task data stored at rest",{"type":17,"tag":29,"props":100577,"children":100578},{},[100579],{"type":23,"value":100580},"Unified does not store customer task data.",{"type":17,"tag":29,"props":100582,"children":100583},{},[100584],{"type":23,"value":54240},{"type":17,"tag":80,"props":100586,"children":100587},{},[100588,100592,100596],{"type":17,"tag":84,"props":100589,"children":100590},{},[100591],{"type":23,"value":9406},{"type":17,"tag":84,"props":100593,"children":100594},{},[100595],{"type":23,"value":99291},{"type":17,"tag":84,"props":100597,"children":100598},{},[100599],{"type":23,"value":100600},"complexity around data retention",{"type":17,"tag":29,"props":100602,"children":100603},{},[100604],{"type":23,"value":100605},"It also ensures your application is always working from current task data rather than a delayed copy.",{"type":17,"tag":239,"props":100607,"children":100609},{"id":100608},"unified-object-model-across-task-integrations",[100610],{"type":23,"value":100611},"Unified object model across task integrations",{"type":17,"tag":29,"props":100613,"children":100614},{},[100615],{"type":23,"value":100616},"Unified standardizes core task objects:",{"type":17,"tag":80,"props":100618,"children":100619},{},[100620,100624,100628,100632],{"type":17,"tag":84,"props":100621,"children":100622},{},[100623],{"type":23,"value":13344},{"type":17,"tag":84,"props":100625,"children":100626},{},[100627],{"type":23,"value":13357},{"type":17,"tag":84,"props":100629,"children":100630},{},[100631],{"type":23,"value":13370},{"type":17,"tag":84,"props":100633,"children":100634},{},[100635],{"type":23,"value":13383},{"type":17,"tag":29,"props":100637,"children":100638},{},[100639],{"type":23,"value":100640},"This removes the need to map each integration's schema individually.",{"type":17,"tag":29,"props":100642,"children":100643},{},[100644],{"type":23,"value":100645},"Instead of writing logic for every API:",{"type":17,"tag":80,"props":100647,"children":100648},{},[100649,100654,100659,100664],{"type":17,"tag":84,"props":100650,"children":100651},{},[100652],{"type":23,"value":100653},"status models",{"type":17,"tag":84,"props":100655,"children":100656},{},[100657],{"type":23,"value":100658},"assignment structures",{"type":17,"tag":84,"props":100660,"children":100661},{},[100662],{"type":23,"value":100663},"comment formats",{"type":17,"tag":84,"props":100665,"children":100666},{},[100667],{"type":23,"value":100668},"hierarchy handling",{"type":17,"tag":29,"props":100670,"children":100671},{},[100672],{"type":23,"value":100673},"you build once against a consistent model.",{"type":17,"tag":239,"props":100675,"children":100677},{"id":100676},"native-and-virtual-webhooks",[100678],{"type":23,"value":92750},{"type":17,"tag":29,"props":100680,"children":100681},{},[100682],{"type":23,"value":100683},"Not all integrations provide native webhooks.",{"type":17,"tag":29,"props":100685,"children":100686},{},[100687],{"type":23,"value":100688},"Unified handles both cases:",{"type":17,"tag":80,"props":100690,"children":100691},{},[100692,100697],{"type":17,"tag":84,"props":100693,"children":100694},{},[100695],{"type":23,"value":100696},"native webhooks when available",{"type":17,"tag":84,"props":100698,"children":100699},{},[100700,100704],{"type":17,"tag":133,"props":100701,"children":100702},{"href":9007},[100703],{"type":23,"value":46572},{"type":23,"value":100705}," when not",{"type":17,"tag":29,"props":100707,"children":100708},{},[100709],{"type":23,"value":100710},"This gives you a consistent event interface for:",{"type":17,"tag":80,"props":100712,"children":100713},{},[100714,100719,100724,100729],{"type":17,"tag":84,"props":100715,"children":100716},{},[100717],{"type":23,"value":100718},"task updates",{"type":17,"tag":84,"props":100720,"children":100721},{},[100722],{"type":23,"value":100723},"assignment changes",{"type":17,"tag":84,"props":100725,"children":100726},{},[100727],{"type":23,"value":100728},"comment creation",{"type":17,"tag":84,"props":100730,"children":100731},{},[100732],{"type":23,"value":100733},"project changes",{"type":17,"tag":239,"props":100735,"children":100737},{"id":100736},"built-for-multi-category-workflows",[100738],{"type":23,"value":100739},"Built for multi-category workflows",{"type":17,"tag":29,"props":100741,"children":100742},{},[100743],{"type":23,"value":100744},"Task data rarely exists in isolation.",{"type":17,"tag":29,"props":100746,"children":100747},{},[100748],{"type":23,"value":100749},"SaaS products often combine task data with:",{"type":17,"tag":80,"props":100751,"children":100752},{},[100753,100758,100763,100768,100773],{"type":17,"tag":84,"props":100754,"children":100755},{},[100756],{"type":23,"value":100757},"messaging integrations",{"type":17,"tag":84,"props":100759,"children":100760},{},[100761],{"type":23,"value":100762},"calendar integrations",{"type":17,"tag":84,"props":100764,"children":100765},{},[100766],{"type":23,"value":100767},"repository integrations",{"type":17,"tag":84,"props":100769,"children":100770},{},[100771],{"type":23,"value":100772},"CRM data",{"type":17,"tag":84,"props":100774,"children":100775},{},[100776],{"type":23,"value":100777},"storage and attachments",{"type":17,"tag":29,"props":100779,"children":100780},{},[100781],{"type":23,"value":100782},"Unified supports 415+ integrations across 25 categories, which allows products to connect task data to the rest of their application architecture without introducing additional integration layers.",{"type":17,"tag":68,"props":100784,"children":100786},{"id":100785},"what-objects-matter-most-in-a-task-and-project-management-api",[100787],{"type":23,"value":100788},"What objects matter most in a task and project management API?",{"type":17,"tag":29,"props":100790,"children":100791},{},[100792],{"type":23,"value":100793},"A task API that only exposes tasks is too limited for most product use cases.",{"type":17,"tag":29,"props":100795,"children":100796},{},[100797],{"type":23,"value":100798},"Unified's Task Management API is built around four objects:",{"type":17,"tag":239,"props":100800,"children":100802},{"id":100801},"project",[100803],{"type":23,"value":13344},{"type":17,"tag":29,"props":100805,"children":100806},{},[100807],{"type":23,"value":100808},"Represents boards, workspaces, or collections of tasks.",{"type":17,"tag":29,"props":100810,"children":100811},{},[100812],{"type":23,"value":13970},{"type":17,"tag":80,"props":100814,"children":100815},{},[100816,100821,100826],{"type":17,"tag":84,"props":100817,"children":100818},{},[100819],{"type":23,"value":100820},"grouping work",{"type":17,"tag":84,"props":100822,"children":100823},{},[100824],{"type":23,"value":100825},"organizing execution",{"type":17,"tag":84,"props":100827,"children":100828},{},[100829],{"type":23,"value":100830},"structuring analytics",{"type":17,"tag":239,"props":100832,"children":100833},{"id":62676},[100834],{"type":23,"value":13357},{"type":17,"tag":29,"props":100836,"children":100837},{},[100838],{"type":23,"value":100839},"Represents the core unit of work.",{"type":17,"tag":29,"props":100841,"children":100842},{},[100843],{"type":23,"value":100844},"Includes:",{"type":17,"tag":80,"props":100846,"children":100847},{},[100848,100853,100858,100863],{"type":17,"tag":84,"props":100849,"children":100850},{},[100851],{"type":23,"value":100852},"status and completion",{"type":17,"tag":84,"props":100854,"children":100855},{},[100856],{"type":23,"value":100857},"assignments",{"type":17,"tag":84,"props":100859,"children":100860},{},[100861],{"type":23,"value":100862},"due dates and priority",{"type":17,"tag":84,"props":100864,"children":100865},{},[100866],{"type":23,"value":100867},"hierarchy and relationships",{"type":17,"tag":239,"props":100869,"children":100870},{"id":72824},[100871],{"type":23,"value":13370},{"type":17,"tag":29,"props":100873,"children":100874},{},[100875],{"type":23,"value":100876},"Represents discussion attached to a task.",{"type":17,"tag":29,"props":100878,"children":100879},{},[100880],{"type":23,"value":13970},{"type":17,"tag":80,"props":100882,"children":100883},{},[100884,100889,100893],{"type":17,"tag":84,"props":100885,"children":100886},{},[100887],{"type":23,"value":100888},"context",{"type":17,"tag":84,"props":100890,"children":100891},{},[100892],{"type":23,"value":29307},{"type":17,"tag":84,"props":100894,"children":100895},{},[100896],{"type":23,"value":100897},"decision tracking",{"type":17,"tag":239,"props":100899,"children":100901},{"id":100900},"change",[100902],{"type":23,"value":13383},{"type":17,"tag":29,"props":100904,"children":100905},{},[100906],{"type":23,"value":100907},"Represents activity history.",{"type":17,"tag":29,"props":100909,"children":100910},{},[100911],{"type":23,"value":13970},{"type":17,"tag":80,"props":100913,"children":100914},{},[100915,100920,100925],{"type":17,"tag":84,"props":100916,"children":100917},{},[100918],{"type":23,"value":100919},"tracking updates over time",{"type":17,"tag":84,"props":100921,"children":100922},{},[100923],{"type":23,"value":100924},"building audit logs",{"type":17,"tag":84,"props":100926,"children":100927},{},[100928],{"type":23,"value":100929},"triggering automation",{"type":17,"tag":29,"props":100931,"children":100932},{},[100933],{"type":23,"value":100934},"This object model allows SaaS products to move beyond simple task lists and build features around full work-state.",{"type":17,"tag":68,"props":100936,"children":100938},{"id":100937},"how-unified-reduces-maintenance-across-task-integrations",[100939],{"type":23,"value":100940},"How Unified reduces maintenance across task integrations",{"type":17,"tag":29,"props":100942,"children":100943},{},[100944],{"type":23,"value":100945},"Supporting multiple task integrations typically requires:",{"type":17,"tag":80,"props":100947,"children":100948},{},[100949,100954,100958,100962,100967],{"type":17,"tag":84,"props":100950,"children":100951},{},[100952],{"type":23,"value":100953},"separate API implementations",{"type":17,"tag":84,"props":100955,"children":100956},{},[100957],{"type":23,"value":29890},{"type":17,"tag":84,"props":100959,"children":100960},{},[100961],{"type":23,"value":89492},{"type":17,"tag":84,"props":100963,"children":100964},{},[100965],{"type":23,"value":100966},"inconsistent webhook handling",{"type":17,"tag":84,"props":100968,"children":100969},{},[100970],{"type":23,"value":100971},"ongoing maintenance as APIs change",{"type":17,"tag":29,"props":100973,"children":100974},{},[100975],{"type":23,"value":100976},"Unified reduces that overhead.",{"type":17,"tag":239,"props":100978,"children":100980},{"id":100979},"one-api-per-category",[100981],{"type":23,"value":100982},"One API per category",{"type":17,"tag":29,"props":100984,"children":100985},{},[100986],{"type":23,"value":100987},"You build once against the Task Management API and support multiple integrations without rewriting logic per API.",{"type":17,"tag":239,"props":100989,"children":100991},{"id":100990},"unified-authorization",[100992],{"type":23,"value":19143},{"type":17,"tag":29,"props":100994,"children":100995},{},[100996],{"type":23,"value":100997},"Authorization is handled consistently across integrations, removing the need to implement and maintain different OAuth flows.",{"type":17,"tag":239,"props":100999,"children":101001},{"id":101000},"consistent-object-structure",[101002],{"type":23,"value":101003},"Consistent object structure",{"type":17,"tag":29,"props":101005,"children":101006},{},[101007],{"type":23,"value":101008},"Projects, tasks, comments, and changes follow the same schema across integrations.",{"type":17,"tag":239,"props":101010,"children":101012},{"id":101011},"managed-event-delivery",[101013],{"type":23,"value":101014},"Managed event delivery",{"type":17,"tag":29,"props":101016,"children":101017},{},[101018],{"type":23,"value":101019},"Native and virtual webhooks are delivered through a single interface, so your application does not need to manage polling or integration-specific event logic.",{"type":17,"tag":239,"props":101021,"children":101023},{"id":101022},"access-to-integration-specific-fields-when-needed",[101024],{"type":23,"value":101025},"Access to integration-specific fields when needed",{"type":17,"tag":29,"props":101027,"children":101028},{},[101029],{"type":23,"value":101030},"If a field is not part of the unified model, you can still access original provider fields without breaking the integration.",{"type":17,"tag":68,"props":101032,"children":101034},{"id":101033},"build-once-with-unifieds-task-management-api",[101035],{"type":23,"value":101036},"Build once with Unified's Task Management API",{"type":17,"tag":29,"props":101038,"children":101039},{},[101040],{"type":23,"value":101041},"Unified's Task Management API provides:",{"type":17,"tag":80,"props":101043,"children":101044},{},[101045,101050,101055,101060,101065,101070],{"type":17,"tag":84,"props":101046,"children":101047},{},[101048],{"type":23,"value":101049},"access to 21+ task management integrations",{"type":17,"tag":84,"props":101051,"children":101052},{},[101053],{"type":23,"value":101054},"standardized objects for Project, Task, Comment, and Change",{"type":17,"tag":84,"props":101056,"children":101057},{},[101058],{"type":23,"value":101059},"read and write operations across integrations",{"type":17,"tag":84,"props":101061,"children":101062},{},[101063],{"type":23,"value":101064},"requests routed directly to the source API",{"type":17,"tag":84,"props":101066,"children":101067},{},[101068],{"type":23,"value":101069},"no stored end-customer task data",{"type":17,"tag":84,"props":101071,"children":101072},{},[101073],{"type":23,"value":41814},{"type":17,"tag":29,"props":101075,"children":101076},{},[101077],{"type":23,"value":101078},"This allows SaaS teams to:",{"type":17,"tag":80,"props":101080,"children":101081},{},[101082,101087,101092,101097],{"type":17,"tag":84,"props":101083,"children":101084},{},[101085],{"type":23,"value":101086},"launch task integrations faster",{"type":17,"tag":84,"props":101088,"children":101089},{},[101090],{"type":23,"value":101091},"maintain fewer integration-specific code paths",{"type":17,"tag":84,"props":101093,"children":101094},{},[101095],{"type":23,"value":101096},"build features on top of current task data",{"type":17,"tag":84,"props":101098,"children":101099},{},[101100],{"type":23,"value":101101},"support multiple integrations without expanding engineering overhead",{"type":17,"tag":68,"props":101103,"children":101104},{"id":7672},[101105],{"type":23,"value":7675},{"type":17,"tag":80,"props":101107,"children":101108},{},[101109,101114,101119,101124,101129],{"type":17,"tag":84,"props":101110,"children":101111},{},[101112],{"type":23,"value":101113},"Task and project management integrations are complex because task structures, status models, and event systems vary across integrations",{"type":17,"tag":84,"props":101115,"children":101116},{},[101117],{"type":23,"value":101118},"Product features built on task data require current work-state, not delayed or partial data",{"type":17,"tag":84,"props":101120,"children":101121},{},[101122],{"type":23,"value":101123},"A strong unified API must support projects, tasks, comments, and change history, along with read and write operations",{"type":17,"tag":84,"props":101125,"children":101126},{},[101127],{"type":23,"value":101128},"Architecture matters: retrieving data directly from the source API avoids inconsistencies introduced by stored replicas",{"type":17,"tag":84,"props":101130,"children":101131},{},[101132],{"type":23,"value":101133},"Unified is the strongest fit for SaaS products that need accurate, current task data across integrations, with reduced integration maintenance and consistent object models",{"type":17,"tag":29,"props":101135,"children":101136},{},[101137,101138],{"type":23,"value":1609},{"type":17,"tag":133,"props":101139,"children":101141},{"href":1612,"rel":101140},[214],[101142],{"type":23,"value":1616},{"type":17,"tag":29,"props":101144,"children":101145},{},[101146,101147],{"type":23,"value":1609},{"type":17,"tag":133,"props":101148,"children":101150},{"href":1623,"rel":101149},[214],[101151],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":101153},[101154,101155,101156,101159,101160,101167,101173,101180,101181],{"id":99984,"depth":1629,"text":99987},{"id":100035,"depth":1629,"text":100038},{"id":100185,"depth":1629,"text":100188,"children":101157},[101158],{"id":100203,"depth":1635,"text":100206},{"id":100412,"depth":1629,"text":100415},{"id":100517,"depth":1629,"text":100520,"children":101161},[101162,101163,101164,101165,101166],{"id":100533,"depth":1635,"text":100536},{"id":100572,"depth":1635,"text":100575},{"id":100608,"depth":1635,"text":100611},{"id":100676,"depth":1635,"text":92750},{"id":100736,"depth":1635,"text":100739},{"id":100785,"depth":1629,"text":100788,"children":101168},[101169,101170,101171,101172],{"id":100801,"depth":1635,"text":13344},{"id":62676,"depth":1635,"text":13357},{"id":72824,"depth":1635,"text":13370},{"id":100900,"depth":1635,"text":13383},{"id":100937,"depth":1629,"text":100940,"children":101174},[101175,101176,101177,101178,101179],{"id":100979,"depth":1635,"text":100982},{"id":100990,"depth":1635,"text":19143},{"id":101000,"depth":1635,"text":101003},{"id":101011,"depth":1635,"text":101014},{"id":101022,"depth":1635,"text":101025},{"id":101033,"depth":1629,"text":101036},{"id":7672,"depth":1629,"text":7675},"content:blog:what_unified_api_is_best_for_task_and_project_management_integrations_across_saas_platforms.md","blog/what_unified_api_is_best_for_task_and_project_management_integrations_across_saas_platforms.md","blog/what_unified_api_is_best_for_task_and_project_management_integrations_across_saas_platforms",{"_path":101186,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":101187,"description":101188,"img":101189,"date":101190,"tag":12,"body":101191,"_type":1677,"_id":102644,"_source":1679,"_file":102645,"_stem":102646,"_extension":1682},"/blog/what_is_the_best_unified_api_for_e_commerce_integrations_for_saas_products_in_2026","What Is the Best Unified API for E-Commerce Integrations for SaaS Products in 2026?","E-commerce integrations look simple until you support more than one platform.","https://s3.us-east-2.amazonaws.com/unified-article-images/what_is_the_best_unified_api_for_e_commerce_integrations_for_saas_products_in_2026-icon.png","2026-03-05T20:43:00.000Z",{"type":14,"children":101192,"toc":102612},[101193,101198,101201,101208,101212,101217,101222,101227,101250,101255,101261,101274,101279,101319,101324,101329,101344,101349,101360,101365,101384,101389,101395,101400,101406,101411,101436,101441,101446,101452,101457,101462,101475,101480,101493,101498,101521,101526,101532,101537,101560,101571,101589,101594,101600,101605,101610,101631,101636,101642,101647,101664,101669,101686,101691,101697,101702,101708,101713,101731,101737,101742,101767,101772,101777,101782,101808,101813,101819,101824,101842,101847,101853,101858,101867,101874,101943,101950,101958,101964,101973,101980,101993,102000,102018,102023,102032,102039,102057,102064,102077,102082,102091,102098,102116,102123,102136,102141,102150,102157,102170,102177,102190,102196,102201,102206,102219,102224,102229,102234,102239,102257,102262,102267,102273,102277,102282,102299,102304,102324,102330,102335,102340,102367,102372,102378,102383,102388,102407,102412,102416,102421,102438,102447,102453,102462,102485,102494,102507,102516,102529,102533,102538,102543,102560,102565,102570,102586,102591,102596,102604],{"type":17,"tag":18,"props":101194,"children":101196},{"id":101195},"what-is-the-best-unified-api-for-e-commerce-integrations-for-saas-products-in-2026",[101197],{"type":23,"value":101187},{"type":17,"tag":25,"props":101199,"children":101200},{},[],{"type":17,"tag":29,"props":101202,"children":101203},{},[101204],{"type":17,"tag":33,"props":101205,"children":101206},{},[101207],{"type":23,"value":96921},{"type":17,"tag":29,"props":101209,"children":101210},{},[101211],{"type":23,"value":101188},{"type":17,"tag":29,"props":101213,"children":101214},{},[101215],{"type":23,"value":101216},"Shopify, WooCommerce, BigCommerce, Amazon, Walmart—each models products, variants, inventory, locations, and reviews differently. Add marketplaces, shipping systems, and reservation platforms, and the problem expands quickly.",{"type":17,"tag":29,"props":101218,"children":101219},{},[101220],{"type":23,"value":101221},"Most teams assume the challenge is connecting APIs. It isn't.",{"type":17,"tag":29,"props":101223,"children":101224},{},[101225],{"type":23,"value":101226},"The real challenge is:",{"type":17,"tag":80,"props":101228,"children":101229},{},[101230,101235,101240,101245],{"type":17,"tag":84,"props":101231,"children":101232},{},[101233],{"type":23,"value":101234},"inconsistent schemas across platforms",{"type":17,"tag":84,"props":101236,"children":101237},{},[101238],{"type":23,"value":101239},"stale data from sync jobs",{"type":17,"tag":84,"props":101241,"children":101242},{},[101243],{"type":23,"value":101244},"uneven webhook support",{"type":17,"tag":84,"props":101246,"children":101247},{},[101248],{"type":23,"value":101249},"growing maintenance across every integration",{"type":17,"tag":29,"props":101251,"children":101252},{},[101253],{"type":23,"value":101254},"That's why unified APIs exist. But not all of them solve the same problem.",{"type":17,"tag":68,"props":101256,"children":101258},{"id":101257},"what-a-unified-e-commerce-api-actually-means",[101259],{"type":23,"value":101260},"What a 'unified e-commerce API' actually means",{"type":17,"tag":29,"props":101262,"children":101263},{},[101264,101266,101272],{"type":23,"value":101265},"A true ",{"type":17,"tag":133,"props":101267,"children":101269},{"href":19380,"rel":101268},[214],[101270],{"type":23,"value":101271},"unified e-commerce API",{"type":23,"value":101273}," should give you a consistent way to work with product-side commerce data across platforms.",{"type":17,"tag":29,"props":101275,"children":101276},{},[101277],{"type":23,"value":101278},"That includes:",{"type":17,"tag":80,"props":101280,"children":101281},{},[101282,101287,101292,101296,101301,101306,101310,101314],{"type":17,"tag":84,"props":101283,"children":101284},{},[101285],{"type":23,"value":101286},"items (products)",{"type":17,"tag":84,"props":101288,"children":101289},{},[101290],{"type":23,"value":101291},"item variants (SKUs)",{"type":17,"tag":84,"props":101293,"children":101294},{},[101295],{"type":23,"value":37523},{"type":17,"tag":84,"props":101297,"children":101298},{},[101299],{"type":23,"value":101300},"inventory across locations",{"type":17,"tag":84,"props":101302,"children":101303},{},[101304],{"type":23,"value":101305},"locations (stores, warehouses, venues)",{"type":17,"tag":84,"props":101307,"children":101308},{},[101309],{"type":23,"value":37538},{"type":17,"tag":84,"props":101311,"children":101312},{},[101313],{"type":23,"value":38691},{"type":17,"tag":84,"props":101315,"children":101316},{},[101317],{"type":23,"value":101318},"reservation and availability (for booking-based commerce)",{"type":17,"tag":29,"props":101320,"children":101321},{},[101322],{"type":23,"value":101323},"This is broader than how most platforms define 'e-commerce.'",{"type":17,"tag":29,"props":101325,"children":101326},{},[101327],{"type":23,"value":101328},"Many only unify:",{"type":17,"tag":80,"props":101330,"children":101331},{},[101332,101336,101340],{"type":17,"tag":84,"props":101333,"children":101334},{},[101335],{"type":23,"value":38575},{"type":17,"tag":84,"props":101337,"children":101338},{},[101339],{"type":23,"value":83346},{"type":17,"tag":84,"props":101341,"children":101342},{},[101343],{"type":23,"value":70514},{"type":17,"tag":29,"props":101345,"children":101346},{},[101347],{"type":23,"value":101348},"That is not enough for modern SaaS products.",{"type":17,"tag":29,"props":101350,"children":101351},{},[101352,101354,101359],{"type":23,"value":101353},"It also matters what ",{"type":17,"tag":48,"props":101355,"children":101356},{},[101357],{"type":23,"value":101358},"commerce does not include",{"type":23,"value":54},{"type":17,"tag":29,"props":101361,"children":101362},{},[101363],{"type":23,"value":101364},"Commerce APIs manage product-side data. They do not own:",{"type":17,"tag":80,"props":101366,"children":101367},{},[101368,101372,101376,101380],{"type":17,"tag":84,"props":101369,"children":101370},{},[101371],{"type":23,"value":11734},{"type":17,"tag":84,"props":101373,"children":101374},{},[101375],{"type":23,"value":89855},{"type":17,"tag":84,"props":101377,"children":101378},{},[101379],{"type":23,"value":25731},{"type":17,"tag":84,"props":101381,"children":101382},{},[101383],{"type":23,"value":11715},{"type":17,"tag":29,"props":101385,"children":101386},{},[101387],{"type":23,"value":101388},"Those belong to separate categories and should stay separate.",{"type":17,"tag":68,"props":101390,"children":101392},{"id":101391},"what-to-look-for-in-a-unified-api-for-e-commerce-integrations",[101393],{"type":23,"value":101394},"What to look for in a unified API for e-commerce integrations",{"type":17,"tag":29,"props":101396,"children":101397},{},[101398],{"type":23,"value":101399},"The differences between platforms are not in their marketing pages. They are in how they handle data.",{"type":17,"tag":239,"props":101401,"children":101403},{"id":101402},"_1-scope-of-the-commerce-model",[101404],{"type":23,"value":101405},"1. Scope of the commerce model",{"type":17,"tag":29,"props":101407,"children":101408},{},[101409],{"type":23,"value":101410},"Can the API handle:",{"type":17,"tag":80,"props":101412,"children":101413},{},[101414,101418,101423,101427,101431],{"type":17,"tag":84,"props":101415,"children":101416},{},[101417],{"type":23,"value":101300},{"type":17,"tag":84,"props":101419,"children":101420},{},[101421],{"type":23,"value":101422},"collections and merchandising",{"type":17,"tag":84,"props":101424,"children":101425},{},[101426],{"type":23,"value":38673},{"type":17,"tag":84,"props":101428,"children":101429},{},[101430],{"type":23,"value":38691},{"type":17,"tag":84,"props":101432,"children":101433},{},[101434],{"type":23,"value":101435},"reservation workflows",{"type":17,"tag":29,"props":101437,"children":101438},{},[101439],{"type":23,"value":101440},"Or is it limited to products and orders?",{"type":17,"tag":29,"props":101442,"children":101443},{},[101444],{"type":23,"value":101445},"If your product depends on anything beyond basic catalog sync, this matters immediately.",{"type":17,"tag":239,"props":101447,"children":101449},{"id":101448},"_2-real-time-vs-sync-based-architecture",[101450],{"type":23,"value":101451},"2. Real-time vs sync-based architecture",{"type":17,"tag":29,"props":101453,"children":101454},{},[101455],{"type":23,"value":101456},"This is the most important distinction.",{"type":17,"tag":29,"props":101458,"children":101459},{},[101460],{"type":23,"value":101461},"Some platforms:",{"type":17,"tag":80,"props":101463,"children":101464},{},[101465,101470],{"type":17,"tag":84,"props":101466,"children":101467},{},[101468],{"type":23,"value":101469},"store and sync data into their own database",{"type":17,"tag":84,"props":101471,"children":101472},{},[101473],{"type":23,"value":101474},"update it on a schedule",{"type":17,"tag":29,"props":101476,"children":101477},{},[101478],{"type":23,"value":101479},"Others:",{"type":17,"tag":80,"props":101481,"children":101482},{},[101483,101488],{"type":17,"tag":84,"props":101484,"children":101485},{},[101486],{"type":23,"value":101487},"fetch data live from the source system",{"type":17,"tag":84,"props":101489,"children":101490},{},[101491],{"type":23,"value":101492},"return current state on every request",{"type":17,"tag":29,"props":101494,"children":101495},{},[101496],{"type":23,"value":101497},"For commerce, stale data breaks real use cases:",{"type":17,"tag":80,"props":101499,"children":101500},{},[101501,101506,101511,101516],{"type":17,"tag":84,"props":101502,"children":101503},{},[101504],{"type":23,"value":101505},"inventory sync",{"type":17,"tag":84,"props":101507,"children":101508},{},[101509],{"type":23,"value":101510},"availability search",{"type":17,"tag":84,"props":101512,"children":101513},{},[101514],{"type":23,"value":101515},"reservation booking",{"type":17,"tag":84,"props":101517,"children":101518},{},[101519],{"type":23,"value":101520},"analytics and forecasting",{"type":17,"tag":29,"props":101522,"children":101523},{},[101524],{"type":23,"value":101525},"If your data is even minutes behind, your product behavior becomes unreliable.",{"type":17,"tag":239,"props":101527,"children":101529},{"id":101528},"_3-handling-provider-variability",[101530],{"type":23,"value":101531},"3. Handling provider variability",{"type":17,"tag":29,"props":101533,"children":101534},{},[101535],{"type":23,"value":101536},"Every commerce platform behaves differently.",{"type":17,"tag":80,"props":101538,"children":101539},{},[101540,101545,101550,101555],{"type":17,"tag":84,"props":101541,"children":101542},{},[101543],{"type":23,"value":101544},"write support varies",{"type":17,"tag":84,"props":101546,"children":101547},{},[101548],{"type":23,"value":101549},"webhook coverage varies",{"type":17,"tag":84,"props":101551,"children":101552},{},[101553],{"type":23,"value":101554},"field structures vary",{"type":17,"tag":84,"props":101556,"children":101557},{},[101558],{"type":23,"value":101559},"custom fields are common",{"type":17,"tag":29,"props":101561,"children":101562},{},[101563,101565,101569],{"type":23,"value":101564},"A usable ",{"type":17,"tag":133,"props":101566,"children":101567},{"href":7691},[101568],{"type":23,"value":7459},{"type":23,"value":101570}," must:",{"type":17,"tag":80,"props":101572,"children":101573},{},[101574,101579,101584],{"type":17,"tag":84,"props":101575,"children":101576},{},[101577],{"type":23,"value":101578},"normalize core objects",{"type":17,"tag":84,"props":101580,"children":101581},{},[101582],{"type":23,"value":101583},"allow access to provider-specific fields",{"type":17,"tag":84,"props":101585,"children":101586},{},[101587],{"type":23,"value":101588},"handle incomplete feature parity across integrations",{"type":17,"tag":29,"props":101590,"children":101591},{},[101592],{"type":23,"value":101593},"Otherwise, you end up rebuilding logic per platform.",{"type":17,"tag":239,"props":101595,"children":101597},{"id":101596},"_4-cross-category-expansion",[101598],{"type":23,"value":101599},"4. Cross-category expansion",{"type":17,"tag":29,"props":101601,"children":101602},{},[101603],{"type":23,"value":101604},"Commerce rarely exists on its own.",{"type":17,"tag":29,"props":101606,"children":101607},{},[101608],{"type":23,"value":101609},"Most SaaS products eventually need to connect commerce data with:",{"type":17,"tag":80,"props":101611,"children":101612},{},[101613,101617,101622,101626],{"type":17,"tag":84,"props":101614,"children":101615},{},[101616],{"type":23,"value":35941},{"type":17,"tag":84,"props":101618,"children":101619},{},[101620],{"type":23,"value":101621},"payment platforms",{"type":17,"tag":84,"props":101623,"children":101624},{},[101625],{"type":23,"value":25731},{"type":17,"tag":84,"props":101627,"children":101628},{},[101629],{"type":23,"value":101630},"marketing tools",{"type":17,"tag":29,"props":101632,"children":101633},{},[101634],{"type":23,"value":101635},"If your integration layer is commerce-only, you will likely need a second vendor later.",{"type":17,"tag":239,"props":101637,"children":101639},{"id":101638},"_5-suitability-for-ai-and-automation",[101640],{"type":23,"value":101641},"5. Suitability for AI and automation",{"type":17,"tag":29,"props":101643,"children":101644},{},[101645],{"type":23,"value":101646},"Modern SaaS products increasingly rely on:",{"type":17,"tag":80,"props":101648,"children":101649},{},[101650,101654,101659],{"type":17,"tag":84,"props":101651,"children":101652},{},[101653],{"type":23,"value":69988},{"type":17,"tag":84,"props":101655,"children":101656},{},[101657],{"type":23,"value":101658},"structured objects",{"type":17,"tag":84,"props":101660,"children":101661},{},[101662],{"type":23,"value":101663},"reliable write operations",{"type":17,"tag":29,"props":101665,"children":101666},{},[101667],{"type":23,"value":101668},"If your integration layer cannot support:",{"type":17,"tag":80,"props":101670,"children":101671},{},[101672,101677,101681],{"type":17,"tag":84,"props":101673,"children":101674},{},[101675],{"type":23,"value":101676},"live reads",{"type":17,"tag":84,"props":101678,"children":101679},{},[101680],{"type":23,"value":69604},{"type":17,"tag":84,"props":101682,"children":101683},{},[101684],{"type":23,"value":101685},"write-back into source systems",{"type":17,"tag":29,"props":101687,"children":101688},{},[101689],{"type":23,"value":101690},"it limits what you can build.",{"type":17,"tag":68,"props":101692,"children":101694},{"id":101693},"the-main-approaches-in-the-market",[101695],{"type":23,"value":101696},"The main approaches in the market",{"type":17,"tag":29,"props":101698,"children":101699},{},[101700],{"type":23,"value":101701},"Not all unified APIs are built the same way. Most fall into four categories.",{"type":17,"tag":239,"props":101703,"children":101705},{"id":101704},"commerce-only-aggregators",[101706],{"type":23,"value":101707},"Commerce-only aggregators",{"type":17,"tag":29,"props":101709,"children":101710},{},[101711],{"type":23,"value":101712},"These platforms focus entirely on e-commerce.",{"type":17,"tag":80,"props":101714,"children":101715},{},[101716,101721,101726],{"type":17,"tag":84,"props":101717,"children":101718},{},[101719],{"type":23,"value":101720},"strong connector coverage",{"type":17,"tag":84,"props":101722,"children":101723},{},[101724],{"type":23,"value":101725},"designed for storefront and marketplace integrations",{"type":17,"tag":84,"props":101727,"children":101728},{},[101729],{"type":23,"value":101730},"limited outside commerce",{"type":17,"tag":239,"props":101732,"children":101734},{"id":101733},"generalist-unified-apis",[101735],{"type":23,"value":101736},"Generalist unified APIs",{"type":17,"tag":29,"props":101738,"children":101739},{},[101740],{"type":23,"value":101741},"These platforms cover multiple categories:",{"type":17,"tag":80,"props":101743,"children":101744},{},[101745,101749,101753,101757,101762],{"type":17,"tag":84,"props":101746,"children":101747},{},[101748],{"type":23,"value":11635},{"type":17,"tag":84,"props":101750,"children":101751},{},[101752],{"type":23,"value":25731},{"type":17,"tag":84,"props":101754,"children":101755},{},[101756],{"type":23,"value":89855},{"type":17,"tag":84,"props":101758,"children":101759},{},[101760],{"type":23,"value":101761},"HR",{"type":17,"tag":84,"props":101763,"children":101764},{},[101765],{"type":23,"value":101766},"messaging",{"type":17,"tag":29,"props":101768,"children":101769},{},[101770],{"type":23,"value":101771},"They aim to provide a single integration layer across your product.",{"type":17,"tag":239,"props":101773,"children":101775},{"id":101774},"code-first-integration-infrastructure",[101776],{"type":23,"value":88072},{"type":17,"tag":29,"props":101778,"children":101779},{},[101780],{"type":23,"value":101781},"These tools handle:",{"type":17,"tag":80,"props":101783,"children":101784},{},[101785,101789,101796,101803],{"type":17,"tag":84,"props":101786,"children":101787},{},[101788],{"type":23,"value":2109},{"type":17,"tag":84,"props":101790,"children":101791},{},[101792],{"type":17,"tag":133,"props":101793,"children":101794},{"href":135},[101795],{"type":23,"value":138},{"type":17,"tag":84,"props":101797,"children":101798},{},[101799],{"type":17,"tag":133,"props":101800,"children":101801},{"href":1857},[101802],{"type":23,"value":1860},{"type":17,"tag":84,"props":101804,"children":101805},{},[101806],{"type":23,"value":101807},"sync execution",{"type":17,"tag":29,"props":101809,"children":101810},{},[101811],{"type":23,"value":101812},"But your team writes the integration logic.",{"type":17,"tag":239,"props":101814,"children":101816},{"id":101815},"sync-based-embedded-platforms",[101817],{"type":23,"value":101818},"Sync-based embedded platforms",{"type":17,"tag":29,"props":101820,"children":101821},{},[101822],{"type":23,"value":101823},"These platforms:",{"type":17,"tag":80,"props":101825,"children":101826},{},[101827,101832,101837],{"type":17,"tag":84,"props":101828,"children":101829},{},[101830],{"type":23,"value":101831},"move and store data",{"type":17,"tag":84,"props":101833,"children":101834},{},[101835],{"type":23,"value":101836},"rely on scheduled syncs",{"type":17,"tag":84,"props":101838,"children":101839},{},[101840],{"type":23,"value":101841},"are designed for pipelines and ETL workflows",{"type":17,"tag":29,"props":101843,"children":101844},{},[101845],{"type":23,"value":101846},"They are not optimized for real-time application logic.",{"type":17,"tag":68,"props":101848,"children":101850},{"id":101849},"platform-comparison-api2cart-vs-unified-vs-nango-vs-apideck-vs-hotglue",[101851],{"type":23,"value":101852},"Platform comparison: API2Cart vs Unified vs Nango vs Apideck vs hotglue",{"type":17,"tag":239,"props":101854,"children":101856},{"id":101855},"unifiedto",[101857],{"type":23,"value":217},{"type":17,"tag":29,"props":101859,"children":101860},{},[101861,101865],{"type":17,"tag":48,"props":101862,"children":101863},{},[101864],{"type":23,"value":43522},{"type":23,"value":101866}," SaaS products that need real-time commerce data and room to expand",{"type":17,"tag":29,"props":101868,"children":101869},{},[101870],{"type":17,"tag":48,"props":101871,"children":101872},{},[101873],{"type":23,"value":84512},{"type":17,"tag":80,"props":101875,"children":101876},{},[101877,101881,101886,101933,101938],{"type":17,"tag":84,"props":101878,"children":101879},{},[101880],{"type":23,"value":289},{"type":17,"tag":84,"props":101882,"children":101883},{},[101884],{"type":23,"value":101885},"no data stored at rest",{"type":17,"tag":84,"props":101887,"children":101888},{},[101889,101891],{"type":23,"value":101890},"normalized commerce objects:\n",{"type":17,"tag":80,"props":101892,"children":101893},{},[101894,101898,101903,101907,101912,101917,101921,101925,101929],{"type":17,"tag":84,"props":101895,"children":101896},{},[101897],{"type":23,"value":83121},{"type":17,"tag":84,"props":101899,"children":101900},{},[101901],{"type":23,"value":101902},"item variants",{"type":17,"tag":84,"props":101904,"children":101905},{},[101906],{"type":23,"value":38595},{"type":17,"tag":84,"props":101908,"children":101909},{},[101910],{"type":23,"value":101911},"inventory",{"type":17,"tag":84,"props":101913,"children":101914},{},[101915],{"type":23,"value":101916},"locations",{"type":17,"tag":84,"props":101918,"children":101919},{},[101920],{"type":23,"value":38673},{"type":17,"tag":84,"props":101922,"children":101923},{},[101924],{"type":23,"value":38691},{"type":17,"tag":84,"props":101926,"children":101927},{},[101928],{"type":23,"value":38387},{"type":17,"tag":84,"props":101930,"children":101931},{},[101932],{"type":23,"value":10342},{"type":17,"tag":84,"props":101934,"children":101935},{},[101936],{"type":23,"value":101937},"supports both storefront and reservation-based commerce",{"type":17,"tag":84,"props":101939,"children":101940},{},[101941],{"type":23,"value":101942},"works across 25+ API categories",{"type":17,"tag":29,"props":101944,"children":101945},{},[101946],{"type":17,"tag":48,"props":101947,"children":101948},{},[101949],{"type":23,"value":84538},{"type":17,"tag":80,"props":101951,"children":101952},{},[101953],{"type":17,"tag":84,"props":101954,"children":101955},{},[101956],{"type":23,"value":101957},"you handle your own data storage if needed",{"type":17,"tag":239,"props":101959,"children":101961},{"id":101960},"api2cart",[101962],{"type":23,"value":101963},"API2Cart",{"type":17,"tag":29,"props":101965,"children":101966},{},[101967,101971],{"type":17,"tag":48,"props":101968,"children":101969},{},[101970],{"type":23,"value":43522},{"type":23,"value":101972}," Commerce-only SaaS products",{"type":17,"tag":29,"props":101974,"children":101975},{},[101976],{"type":17,"tag":48,"props":101977,"children":101978},{},[101979],{"type":23,"value":84512},{"type":17,"tag":80,"props":101981,"children":101982},{},[101983,101988],{"type":17,"tag":84,"props":101984,"children":101985},{},[101986],{"type":23,"value":101987},"large number of e-commerce and marketplace connectors",{"type":17,"tag":84,"props":101989,"children":101990},{},[101991],{"type":23,"value":101992},"purpose-built for commerce",{"type":17,"tag":29,"props":101994,"children":101995},{},[101996],{"type":17,"tag":48,"props":101997,"children":101998},{},[101999],{"type":23,"value":84538},{"type":17,"tag":80,"props":102001,"children":102002},{},[102003,102008,102013],{"type":17,"tag":84,"props":102004,"children":102005},{},[102006],{"type":23,"value":102007},"limited to e-commerce only",{"type":17,"tag":84,"props":102009,"children":102010},{},[102011],{"type":23,"value":102012},"method-based API design",{"type":17,"tag":84,"props":102014,"children":102015},{},[102016],{"type":23,"value":102017},"not built for cross-category workflows",{"type":17,"tag":239,"props":102019,"children":102021},{"id":102020},"nango",[102022],{"type":23,"value":1025},{"type":17,"tag":29,"props":102024,"children":102025},{},[102026,102030],{"type":17,"tag":48,"props":102027,"children":102028},{},[102029],{"type":23,"value":43522},{"type":23,"value":102031}," Teams that want full control over integration logic",{"type":17,"tag":29,"props":102033,"children":102034},{},[102035],{"type":17,"tag":48,"props":102036,"children":102037},{},[102038],{"type":23,"value":84512},{"type":17,"tag":80,"props":102040,"children":102041},{},[102042,102047,102052],{"type":17,"tag":84,"props":102043,"children":102044},{},[102045],{"type":23,"value":102046},"code-level flexibility",{"type":17,"tag":84,"props":102048,"children":102049},{},[102050],{"type":23,"value":102051},"direct access to provider APIs",{"type":17,"tag":84,"props":102053,"children":102054},{},[102055],{"type":23,"value":102056},"handles auth and infrastructure",{"type":17,"tag":29,"props":102058,"children":102059},{},[102060],{"type":17,"tag":48,"props":102061,"children":102062},{},[102063],{"type":23,"value":84538},{"type":17,"tag":80,"props":102065,"children":102066},{},[102067,102072],{"type":17,"tag":84,"props":102068,"children":102069},{},[102070],{"type":23,"value":102071},"higher engineering effort",{"type":17,"tag":84,"props":102073,"children":102074},{},[102075],{"type":23,"value":102076},"no unified abstraction out of the box",{"type":17,"tag":239,"props":102078,"children":102080},{"id":102079},"apideck",[102081],{"type":23,"value":237},{"type":17,"tag":29,"props":102083,"children":102084},{},[102085,102089],{"type":17,"tag":48,"props":102086,"children":102087},{},[102088],{"type":23,"value":43522},{"type":23,"value":102090}," General integrations with lighter commerce needs",{"type":17,"tag":29,"props":102092,"children":102093},{},[102094],{"type":17,"tag":48,"props":102095,"children":102096},{},[102097],{"type":23,"value":84512},{"type":17,"tag":80,"props":102099,"children":102100},{},[102101,102106,102111],{"type":17,"tag":84,"props":102102,"children":102103},{},[102104],{"type":23,"value":102105},"multi-category coverage",{"type":17,"tag":84,"props":102107,"children":102108},{},[102109],{"type":23,"value":102110},"simple unified models",{"type":17,"tag":84,"props":102112,"children":102113},{},[102114],{"type":23,"value":102115},"strong developer experience",{"type":17,"tag":29,"props":102117,"children":102118},{},[102119],{"type":17,"tag":48,"props":102120,"children":102121},{},[102122],{"type":23,"value":84538},{"type":17,"tag":80,"props":102124,"children":102125},{},[102126,102131],{"type":17,"tag":84,"props":102127,"children":102128},{},[102129],{"type":23,"value":102130},"narrower commerce model",{"type":17,"tag":84,"props":102132,"children":102133},{},[102134],{"type":23,"value":102135},"fewer commerce-specific objects",{"type":17,"tag":239,"props":102137,"children":102139},{"id":102138},"hotglue",[102140],{"type":23,"value":102138},{"type":17,"tag":29,"props":102142,"children":102143},{},[102144,102148],{"type":17,"tag":48,"props":102145,"children":102146},{},[102147],{"type":23,"value":43522},{"type":23,"value":102149}," Sync-based data pipelines",{"type":17,"tag":29,"props":102151,"children":102152},{},[102153],{"type":17,"tag":48,"props":102154,"children":102155},{},[102156],{"type":23,"value":84512},{"type":17,"tag":80,"props":102158,"children":102159},{},[102160,102165],{"type":17,"tag":84,"props":102161,"children":102162},{},[102163],{"type":23,"value":102164},"customizable transformations",{"type":17,"tag":84,"props":102166,"children":102167},{},[102168],{"type":23,"value":102169},"embedded integration workflows",{"type":17,"tag":29,"props":102171,"children":102172},{},[102173],{"type":17,"tag":48,"props":102174,"children":102175},{},[102176],{"type":23,"value":84538},{"type":17,"tag":80,"props":102178,"children":102179},{},[102180,102185],{"type":17,"tag":84,"props":102181,"children":102182},{},[102183],{"type":23,"value":102184},"not real-time",{"type":17,"tag":84,"props":102186,"children":102187},{},[102188],{"type":23,"value":102189},"built for data movement, not live application logic",{"type":17,"tag":68,"props":102191,"children":102193},{"id":102192},"why-architecture-matters-more-than-connector-count",[102194],{"type":23,"value":102195},"Why architecture matters more than connector count",{"type":17,"tag":29,"props":102197,"children":102198},{},[102199],{"type":23,"value":102200},"Connector count is the most overvalued metric in this category.",{"type":17,"tag":29,"props":102202,"children":102203},{},[102204],{"type":23,"value":102205},"There are two kinds of breadth:",{"type":17,"tag":80,"props":102207,"children":102208},{},[102209,102214],{"type":17,"tag":84,"props":102210,"children":102211},{},[102212],{"type":23,"value":102213},"connector breadth",{"type":17,"tag":84,"props":102215,"children":102216},{},[102217],{"type":23,"value":102218},"object-model depth",{"type":17,"tag":29,"props":102220,"children":102221},{},[102222],{"type":23,"value":102223},"A platform can support many integrations and still give you a weak abstraction.",{"type":17,"tag":29,"props":102225,"children":102226},{},[102227],{"type":23,"value":102228},"Another can support fewer integrations but give you a strong, consistent model to build on.",{"type":17,"tag":29,"props":102230,"children":102231},{},[102232],{"type":23,"value":102233},"For SaaS products, the second matters more.",{"type":17,"tag":29,"props":102235,"children":102236},{},[102237],{"type":23,"value":102238},"If your product depends on:",{"type":17,"tag":80,"props":102240,"children":102241},{},[102242,102247,102252],{"type":17,"tag":84,"props":102243,"children":102244},{},[102245],{"type":23,"value":102246},"inventory accuracy",{"type":17,"tag":84,"props":102248,"children":102249},{},[102250],{"type":23,"value":102251},"real-time availability",{"type":17,"tag":84,"props":102253,"children":102254},{},[102255],{"type":23,"value":102256},"cross-platform consistency",{"type":17,"tag":29,"props":102258,"children":102259},{},[102260],{"type":23,"value":102261},"then architecture determines whether your integrations actually work in production.",{"type":17,"tag":29,"props":102263,"children":102264},{},[102265],{"type":23,"value":102266},"Not just whether they connect.",{"type":17,"tag":68,"props":102268,"children":102270},{"id":102269},"why-unified-is-the-strongest-choice-for-modern-saas-products",[102271],{"type":23,"value":102272},"Why Unified is the strongest choice for modern SaaS products",{"type":17,"tag":239,"props":102274,"children":102275},{"id":13402},[102276],{"type":23,"value":13405},{"type":17,"tag":29,"props":102278,"children":102279},{},[102280],{"type":23,"value":102281},"Every request is executed live against the source system.",{"type":17,"tag":80,"props":102283,"children":102284},{},[102285,102289,102294],{"type":17,"tag":84,"props":102286,"children":102287},{},[102288],{"type":23,"value":24107},{"type":17,"tag":84,"props":102290,"children":102291},{},[102292],{"type":23,"value":102293},"no cached data",{"type":17,"tag":84,"props":102295,"children":102296},{},[102297],{"type":23,"value":102298},"no stale reads",{"type":17,"tag":29,"props":102300,"children":102301},{},[102302],{"type":23,"value":102303},"This is critical for:",{"type":17,"tag":80,"props":102305,"children":102306},{},[102307,102311,102315,102319],{"type":17,"tag":84,"props":102308,"children":102309},{},[102310],{"type":23,"value":101911},{"type":17,"tag":84,"props":102312,"children":102313},{},[102314],{"type":23,"value":10342},{"type":17,"tag":84,"props":102316,"children":102317},{},[102318],{"type":23,"value":101435},{"type":17,"tag":84,"props":102320,"children":102321},{},[102322],{"type":23,"value":102323},"analytics",{"type":17,"tag":239,"props":102325,"children":102327},{"id":102326},"complete-commerce-object-model",[102328],{"type":23,"value":102329},"Complete commerce object model",{"type":17,"tag":29,"props":102331,"children":102332},{},[102333],{"type":23,"value":102334},"Unified does not stop at products.",{"type":17,"tag":29,"props":102336,"children":102337},{},[102338],{"type":23,"value":102339},"It includes:",{"type":17,"tag":80,"props":102341,"children":102342},{},[102343,102347,102351,102355,102359,102363],{"type":17,"tag":84,"props":102344,"children":102345},{},[102346],{"type":23,"value":101911},{"type":17,"tag":84,"props":102348,"children":102349},{},[102350],{"type":23,"value":101916},{"type":17,"tag":84,"props":102352,"children":102353},{},[102354],{"type":23,"value":38673},{"type":17,"tag":84,"props":102356,"children":102357},{},[102358],{"type":23,"value":38691},{"type":17,"tag":84,"props":102360,"children":102361},{},[102362],{"type":23,"value":38387},{"type":17,"tag":84,"props":102364,"children":102365},{},[102366],{"type":23,"value":10342},{"type":17,"tag":29,"props":102368,"children":102369},{},[102370],{"type":23,"value":102371},"This allows you to build real product features, not just basic integrations.",{"type":17,"tag":239,"props":102373,"children":102375},{"id":102374},"built-for-expansion-beyond-commerce",[102376],{"type":23,"value":102377},"Built for expansion beyond commerce",{"type":17,"tag":29,"props":102379,"children":102380},{},[102381],{"type":23,"value":102382},"Commerce rarely lives in isolation.",{"type":17,"tag":29,"props":102384,"children":102385},{},[102386],{"type":23,"value":102387},"Unified allows you to connect commerce data with:",{"type":17,"tag":80,"props":102389,"children":102390},{},[102391,102395,102399,102403],{"type":17,"tag":84,"props":102392,"children":102393},{},[102394],{"type":23,"value":89855},{"type":17,"tag":84,"props":102396,"children":102397},{},[102398],{"type":23,"value":11734},{"type":17,"tag":84,"props":102400,"children":102401},{},[102402],{"type":23,"value":25731},{"type":17,"tag":84,"props":102404,"children":102405},{},[102406],{"type":23,"value":11715},{"type":17,"tag":29,"props":102408,"children":102409},{},[102410],{"type":23,"value":102411},"without introducing another integration provider.",{"type":17,"tag":239,"props":102413,"children":102414},{"id":90302},[102415],{"type":23,"value":43670},{"type":17,"tag":29,"props":102417,"children":102418},{},[102419],{"type":23,"value":102420},"Unified does not store customer data at rest.",{"type":17,"tag":80,"props":102422,"children":102423},{},[102424,102428,102433],{"type":17,"tag":84,"props":102425,"children":102426},{},[102427],{"type":23,"value":52144},{"type":17,"tag":84,"props":102429,"children":102430},{},[102431],{"type":23,"value":102432},"avoids data duplication",{"type":17,"tag":84,"props":102434,"children":102435},{},[102436],{"type":23,"value":102437},"keeps your architecture simpler",{"type":17,"tag":29,"props":102439,"children":102440},{},[102441],{"type":17,"tag":133,"props":102442,"children":102444},{"href":102443},"/31a6207b838480dd8de0fd3fb40c162f",[102445],{"type":23,"value":102446},"→ Read the docs",{"type":17,"tag":68,"props":102448,"children":102450},{"id":102449},"which-platform-should-you-choose",[102451],{"type":23,"value":102452},"Which platform should you choose?",{"type":17,"tag":29,"props":102454,"children":102455},{},[102456,102457,102461],{"type":23,"value":44311},{"type":17,"tag":48,"props":102458,"children":102459},{},[102460],{"type":23,"value":87523},{"type":23,"value":44317},{"type":17,"tag":80,"props":102463,"children":102464},{},[102465,102470,102475,102480],{"type":17,"tag":84,"props":102466,"children":102467},{},[102468],{"type":23,"value":102469},"you are building a SaaS product",{"type":17,"tag":84,"props":102471,"children":102472},{},[102473],{"type":23,"value":102474},"you need real-time commerce data",{"type":17,"tag":84,"props":102476,"children":102477},{},[102478],{"type":23,"value":102479},"you want a consistent object model across platforms",{"type":17,"tag":84,"props":102481,"children":102482},{},[102483],{"type":23,"value":102484},"you expect to expand beyond commerce",{"type":17,"tag":29,"props":102486,"children":102487},{},[102488,102489,102493],{"type":23,"value":44311},{"type":17,"tag":48,"props":102490,"children":102491},{},[102492],{"type":23,"value":101963},{"type":23,"value":44317},{"type":17,"tag":80,"props":102495,"children":102496},{},[102497,102502],{"type":17,"tag":84,"props":102498,"children":102499},{},[102500],{"type":23,"value":102501},"you only need e-commerce integrations",{"type":17,"tag":84,"props":102503,"children":102504},{},[102505],{"type":23,"value":102506},"connector coverage is your top priority",{"type":17,"tag":29,"props":102508,"children":102509},{},[102510,102511,102515],{"type":23,"value":44311},{"type":17,"tag":48,"props":102512,"children":102513},{},[102514],{"type":23,"value":1025},{"type":23,"value":44317},{"type":17,"tag":80,"props":102517,"children":102518},{},[102519,102524],{"type":17,"tag":84,"props":102520,"children":102521},{},[102522],{"type":23,"value":102523},"you want full control over integration logic",{"type":17,"tag":84,"props":102525,"children":102526},{},[102527],{"type":23,"value":102528},"your team is willing to build and maintain it",{"type":17,"tag":68,"props":102530,"children":102531},{"id":1552},[102532],{"type":23,"value":1555},{"type":17,"tag":29,"props":102534,"children":102535},{},[102536],{"type":23,"value":102537},"Most unified APIs look similar at the surface.",{"type":17,"tag":29,"props":102539,"children":102540},{},[102541],{"type":23,"value":102542},"They all promise:",{"type":17,"tag":80,"props":102544,"children":102545},{},[102546,102550,102555],{"type":17,"tag":84,"props":102547,"children":102548},{},[102549],{"type":23,"value":23897},{"type":17,"tag":84,"props":102551,"children":102552},{},[102553],{"type":23,"value":102554},"multiple platforms",{"type":17,"tag":84,"props":102556,"children":102557},{},[102558],{"type":23,"value":102559},"faster development",{"type":17,"tag":29,"props":102561,"children":102562},{},[102563],{"type":23,"value":102564},"The real difference is how they handle data.",{"type":17,"tag":29,"props":102566,"children":102567},{},[102568],{"type":23,"value":102569},"For modern SaaS products, the deciding factors are:",{"type":17,"tag":80,"props":102571,"children":102572},{},[102573,102577,102581],{"type":17,"tag":84,"props":102574,"children":102575},{},[102576],{"type":23,"value":44278},{"type":17,"tag":84,"props":102578,"children":102579},{},[102580],{"type":23,"value":5832},{"type":17,"tag":84,"props":102582,"children":102583},{},[102584],{"type":23,"value":102585},"ability to expand across categories",{"type":17,"tag":29,"props":102587,"children":102588},{},[102589],{"type":23,"value":102590},"If your product depends on current commerce state and consistent data across platforms, those factors matter more than how many connectors a platform lists.",{"type":17,"tag":29,"props":102592,"children":102593},{},[102594],{"type":23,"value":102595},"Choosing the right architecture early determines whether your integration layer scales—or becomes something you have to rebuild later.",{"type":17,"tag":29,"props":102597,"children":102598},{},[102599],{"type":17,"tag":133,"props":102600,"children":102602},{"href":1612,"rel":102601},[214],[102603],{"type":23,"value":44481},{"type":17,"tag":29,"props":102605,"children":102606},{},[102607],{"type":17,"tag":133,"props":102608,"children":102610},{"href":1623,"rel":102609},[214],[102611],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":102613},[102614,102615,102622,102628,102635,102636,102642,102643],{"id":101257,"depth":1629,"text":101260},{"id":101391,"depth":1629,"text":101394,"children":102616},[102617,102618,102619,102620,102621],{"id":101402,"depth":1635,"text":101405},{"id":101448,"depth":1635,"text":101451},{"id":101528,"depth":1635,"text":101531},{"id":101596,"depth":1635,"text":101599},{"id":101638,"depth":1635,"text":101641},{"id":101693,"depth":1629,"text":101696,"children":102623},[102624,102625,102626,102627],{"id":101704,"depth":1635,"text":101707},{"id":101733,"depth":1635,"text":101736},{"id":101774,"depth":1635,"text":88072},{"id":101815,"depth":1635,"text":101818},{"id":101849,"depth":1629,"text":101852,"children":102629},[102630,102631,102632,102633,102634],{"id":101855,"depth":1635,"text":217},{"id":101960,"depth":1635,"text":101963},{"id":102020,"depth":1635,"text":1025},{"id":102079,"depth":1635,"text":237},{"id":102138,"depth":1635,"text":102138},{"id":102192,"depth":1629,"text":102195},{"id":102269,"depth":1629,"text":102272,"children":102637},[102638,102639,102640,102641],{"id":13402,"depth":1635,"text":13405},{"id":102326,"depth":1635,"text":102329},{"id":102374,"depth":1635,"text":102377},{"id":90302,"depth":1635,"text":43670},{"id":102449,"depth":1629,"text":102452},{"id":1552,"depth":1629,"text":1555},"content:blog:what_is_the_best_unified_api_for_e_commerce_integrations_for_saas_products_in_2026.md","blog/what_is_the_best_unified_api_for_e_commerce_integrations_for_saas_products_in_2026.md","blog/what_is_the_best_unified_api_for_e_commerce_integrations_for_saas_products_in_2026",{"_path":102648,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":102649,"description":102650,"img":102651,"date":101190,"tag":12,"body":102652,"_type":1677,"_id":103430,"_source":1679,"_file":103431,"_stem":103432,"_extension":1682},"/blog/what_unified_api_is_best_for_employment_and_identity_verification","What Unified API Is Best for Employment and Identity Verification?","If your product needs both employment data and real verification flows (background checks, identity, credentials), Unified.to is the best option because it's...","https://s3.us-east-2.amazonaws.com/unified-article-images/what_unified_api_is_best_for_employment_and_identity_verification-icon.png",{"type":14,"children":102653,"toc":103408},[102654,102659,102662,102669,102687,102692,102697,102702,102708,102713,102726,102731,102739,102743,102766,102771,102777,102782,102815,102820,102826,102831,102852,102857,102863,102876,102884,102889,102895,102908,102916,102921,102927,102935,102943,102948,102954,102959,102977,102985,102991,103002,103007,103012,103017,103022,103027,103032,103055,103061,103066,103079,103084,103100,103106,103111,103128,103133,103148,103153,103158,103163,103184,103189,103194,103220,103225,103231,103236,103241,103259,103271,103276,103282,103287,103315,103321,103339,103349,103355,103360,103373,103381,103392,103400],{"type":17,"tag":18,"props":102655,"children":102657},{"id":102656},"what-unified-api-is-best-for-employment-and-identity-verification",[102658],{"type":23,"value":102649},{"type":17,"tag":25,"props":102660,"children":102661},{},[],{"type":17,"tag":29,"props":102663,"children":102664},{},[102665],{"type":17,"tag":33,"props":102666,"children":102667},{},[102668],{"type":23,"value":96921},{"type":17,"tag":29,"props":102670,"children":102671},{},[102672,102674,102678,102680,102685],{"type":23,"value":102673},"If your product needs both employment data ",{"type":17,"tag":33,"props":102675,"children":102676},{},[102677],{"type":23,"value":48975},{"type":23,"value":102679}," real verification flows (background checks, identity, credentials), ",{"type":17,"tag":48,"props":102681,"children":102682},{},[102683],{"type":23,"value":102684},"Unified.to is the best option",{"type":23,"value":102686}," because it's the only platform that supports both through a single, real-time API without storing sensitive data.",{"type":17,"tag":29,"props":102688,"children":102689},{},[102690],{"type":23,"value":102691},"If you only need employment/payroll data, Finch is a strong specialist.",{"type":17,"tag":29,"props":102693,"children":102694},{},[102695],{"type":23,"value":102696},"If you only need consumer income verification, Argyle fits.",{"type":17,"tag":29,"props":102698,"children":102699},{},[102700],{"type":23,"value":102701},"But most products need both layers — and that's where Unified stands apart.",{"type":17,"tag":68,"props":102703,"children":102705},{"id":102704},"why-this-question-is-often-answered-incorrectly",[102706],{"type":23,"value":102707},"Why this question is often answered incorrectly",{"type":17,"tag":29,"props":102709,"children":102710},{},[102711],{"type":23,"value":102712},"Most comparisons split the problem into two categories:",{"type":17,"tag":80,"props":102714,"children":102715},{},[102716,102721],{"type":17,"tag":84,"props":102717,"children":102718},{},[102719],{"type":23,"value":102720},"Employment data (HRIS, payroll)",{"type":17,"tag":84,"props":102722,"children":102723},{},[102724],{"type":23,"value":102725},"Verification (background checks, identity)",{"type":17,"tag":29,"props":102727,"children":102728},{},[102729],{"type":23,"value":102730},"That's technically correct — but practically wrong.",{"type":17,"tag":29,"props":102732,"children":102733},{},[102734],{"type":17,"tag":48,"props":102735,"children":102736},{},[102737],{"type":23,"value":102738},"Real products need both working together.",{"type":17,"tag":29,"props":102740,"children":102741},{},[102742],{"type":23,"value":19878},{"type":17,"tag":80,"props":102744,"children":102745},{},[102746,102751,102756,102761],{"type":17,"tag":84,"props":102747,"children":102748},{},[102749],{"type":23,"value":102750},"Pull candidate from ATS",{"type":17,"tag":84,"props":102752,"children":102753},{},[102754],{"type":23,"value":102755},"Run background check",{"type":17,"tag":84,"props":102757,"children":102758},{},[102759],{"type":23,"value":102760},"Track status",{"type":17,"tag":84,"props":102762,"children":102763},{},[102764],{"type":23,"value":102765},"Update onboarding or hiring workflow",{"type":17,"tag":29,"props":102767,"children":102768},{},[102769],{"type":23,"value":102770},"That's one system, not two.",{"type":17,"tag":68,"props":102772,"children":102774},{"id":102773},"what-a-complete-verification-workflow-actually-requires",[102775],{"type":23,"value":102776},"What a complete verification workflow actually requires",{"type":17,"tag":29,"props":102778,"children":102779},{},[102780],{"type":23,"value":102781},"To support employment + identity verification properly, your API needs to handle:",{"type":17,"tag":80,"props":102783,"children":102784},{},[102785,102790,102795,102800,102805,102810],{"type":17,"tag":84,"props":102786,"children":102787},{},[102788],{"type":23,"value":102789},"Access to employment or candidate data (HRIS / ATS)",{"type":17,"tag":84,"props":102791,"children":102792},{},[102793],{"type":23,"value":102794},"Ability to trigger verification requests",{"type":17,"tag":84,"props":102796,"children":102797},{},[102798],{"type":23,"value":102799},"Async lifecycle handling (pending → processing → completed)",{"type":17,"tag":84,"props":102801,"children":102802},{},[102803],{"type":23,"value":102804},"Real-time status updates",{"type":17,"tag":84,"props":102806,"children":102807},{},[102808],{"type":23,"value":102809},"Result retrieval (scores, reports, details)",{"type":17,"tag":84,"props":102811,"children":102812},{},[102813],{"type":23,"value":102814},"Downstream updates (ATS, onboarding, compliance)",{"type":17,"tag":29,"props":102816,"children":102817},{},[102818],{"type":23,"value":102819},"Most platforms only solve part of this.",{"type":17,"tag":68,"props":102821,"children":102823},{"id":102822},"where-most-unified-apis-fall-short",[102824],{"type":23,"value":102825},"Where most unified APIs fall short",{"type":17,"tag":239,"props":102827,"children":102829},{"id":102828},"finch",[102830],{"type":23,"value":7973},{"type":17,"tag":80,"props":102832,"children":102833},{},[102834,102839,102844],{"type":17,"tag":84,"props":102835,"children":102836},{},[102837],{"type":23,"value":102838},"Strong HRIS + payroll coverage",{"type":17,"tag":84,"props":102840,"children":102841},{},[102842],{"type":23,"value":102843},"Supports employment data deeply",{"type":17,"tag":84,"props":102845,"children":102846},{},[102847],{"type":17,"tag":48,"props":102848,"children":102849},{},[102850],{"type":23,"value":102851},"Does not support verification workflows",{"type":17,"tag":29,"props":102853,"children":102854},{},[102855],{"type":23,"value":102856},"Best for: employment data only",{"type":17,"tag":239,"props":102858,"children":102860},{"id":102859},"argyle-plaid-income",[102861],{"type":23,"value":102862},"Argyle / Plaid Income",{"type":17,"tag":80,"props":102864,"children":102865},{},[102866,102871],{"type":17,"tag":84,"props":102867,"children":102868},{},[102869],{"type":23,"value":102870},"Consumer-permissioned income + employment verification",{"type":17,"tag":84,"props":102872,"children":102873},{},[102874],{"type":23,"value":102875},"Built for lending / fintech",{"type":17,"tag":29,"props":102877,"children":102878},{},[102879],{"type":17,"tag":48,"props":102880,"children":102881},{},[102882],{"type":23,"value":102883},"Not designed for B2B SaaS verification workflows",{"type":17,"tag":29,"props":102885,"children":102886},{},[102887],{"type":23,"value":102888},"Best for: user-permissioned financial verification",{"type":17,"tag":239,"props":102890,"children":102892},{"id":102891},"merge-apideck",[102893],{"type":23,"value":102894},"Merge / Apideck",{"type":17,"tag":80,"props":102896,"children":102897},{},[102898,102903],{"type":17,"tag":84,"props":102899,"children":102900},{},[102901],{"type":23,"value":102902},"Broad category coverage (HR, CRM, etc.)",{"type":17,"tag":84,"props":102904,"children":102905},{},[102906],{"type":23,"value":102907},"Strong general-purpose integration layer",{"type":17,"tag":29,"props":102909,"children":102910},{},[102911],{"type":17,"tag":48,"props":102912,"children":102913},{},[102914],{"type":23,"value":102915},"No dedicated verification category",{"type":17,"tag":29,"props":102917,"children":102918},{},[102919],{"type":23,"value":102920},"Best for: multi-category integrations without verification",{"type":17,"tag":239,"props":102922,"children":102924},{"id":102923},"identitykyc-providers-socure-trulioo",[102925],{"type":23,"value":102926},"Identity/KYC providers (Socure, Trulioo)",{"type":17,"tag":80,"props":102928,"children":102929},{},[102930],{"type":17,"tag":84,"props":102931,"children":102932},{},[102933],{"type":23,"value":102934},"Strong identity verification and fraud detection",{"type":17,"tag":29,"props":102936,"children":102937},{},[102938],{"type":17,"tag":48,"props":102939,"children":102940},{},[102941],{"type":23,"value":102942},"Do not integrate with HR, ATS, or verification workflows",{"type":17,"tag":29,"props":102944,"children":102945},{},[102946],{"type":23,"value":102947},"Best for: identity only",{"type":17,"tag":68,"props":102949,"children":102951},{"id":102950},"why-unifiedto-is-different",[102952],{"type":23,"value":102953},"Why Unified.to is different",{"type":17,"tag":29,"props":102955,"children":102956},{},[102957],{"type":23,"value":102958},"Unified is the only platform here that supports:",{"type":17,"tag":80,"props":102960,"children":102961},{},[102962,102967,102972],{"type":17,"tag":84,"props":102963,"children":102964},{},[102965],{"type":23,"value":102966},"Employment data (HRIS, ATS, directory)",{"type":17,"tag":84,"props":102968,"children":102969},{},[102970],{"type":23,"value":102971},"AND",{"type":17,"tag":84,"props":102973,"children":102974},{},[102975],{"type":23,"value":102976},"Verification workflows (background, identity, credentials)",{"type":17,"tag":29,"props":102978,"children":102979},{},[102980],{"type":17,"tag":48,"props":102981,"children":102982},{},[102983],{"type":23,"value":102984},"Through one API.",{"type":17,"tag":68,"props":102986,"children":102988},{"id":102987},"built-for-how-verification-actually-works",[102989],{"type":23,"value":102990},"Built for how verification actually works",{"type":17,"tag":29,"props":102992,"children":102993},{},[102994,102995,103000],{"type":23,"value":25244},{"type":17,"tag":133,"props":102996,"children":102998},{"href":102997},"/31a6207b838480009524d00596869cb8",[102999],{"type":23,"value":54031},{"type":23,"value":103001}," is intentionally simple:",{"type":17,"tag":239,"props":103003,"children":103005},{"id":103004},"packages",[103006],{"type":23,"value":54055},{"type":17,"tag":29,"props":103008,"children":103009},{},[103010],{"type":23,"value":103011},"What checks are available (background check, identity, etc.)",{"type":17,"tag":239,"props":103013,"children":103015},{"id":103014},"requests",[103016],{"type":23,"value":54068},{"type":17,"tag":29,"props":103018,"children":103019},{},[103020],{"type":23,"value":103021},"The actual verification job",{"type":17,"tag":29,"props":103023,"children":103024},{},[103025],{"type":23,"value":103026},"That's it.",{"type":17,"tag":29,"props":103028,"children":103029},{},[103030],{"type":23,"value":103031},"This matches real-world behavior:",{"type":17,"tag":80,"props":103033,"children":103034},{},[103035,103040,103045,103050],{"type":17,"tag":84,"props":103036,"children":103037},{},[103038],{"type":23,"value":103039},"pick a package",{"type":17,"tag":84,"props":103041,"children":103042},{},[103043],{"type":23,"value":103044},"create a request",{"type":17,"tag":84,"props":103046,"children":103047},{},[103048],{"type":23,"value":103049},"track it",{"type":17,"tag":84,"props":103051,"children":103052},{},[103053],{"type":23,"value":103054},"get results",{"type":17,"tag":68,"props":103056,"children":103058},{"id":103057},"real-time-execution-not-sync-based",[103059],{"type":23,"value":103060},"Real-time execution (not sync-based)",{"type":17,"tag":29,"props":103062,"children":103063},{},[103064],{"type":23,"value":103065},"Verification is time-sensitive.",{"type":17,"tag":80,"props":103067,"children":103068},{},[103069,103074],{"type":17,"tag":84,"props":103070,"children":103071},{},[103072],{"type":23,"value":103073},"A check completes → your system needs to know immediately",{"type":17,"tag":84,"props":103075,"children":103076},{},[103077],{"type":23,"value":103078},"Delays slow hiring, onboarding, or approvals",{"type":17,"tag":29,"props":103080,"children":103081},{},[103082],{"type":23,"value":103083},"Unified executes every request directly against the provider API:",{"type":17,"tag":80,"props":103085,"children":103086},{},[103087,103091,103095],{"type":17,"tag":84,"props":103088,"children":103089},{},[103090],{"type":23,"value":102293},{"type":17,"tag":84,"props":103092,"children":103093},{},[103094],{"type":23,"value":24107},{"type":17,"tag":84,"props":103096,"children":103097},{},[103098],{"type":23,"value":103099},"no stale status",{"type":17,"tag":68,"props":103101,"children":103103},{"id":103102},"native-virtual-webhooks-critical-for-verification",[103104],{"type":23,"value":103105},"Native + virtual webhooks (critical for verification)",{"type":17,"tag":29,"props":103107,"children":103108},{},[103109],{"type":23,"value":103110},"Providers are inconsistent:",{"type":17,"tag":80,"props":103112,"children":103113},{},[103114,103123],{"type":17,"tag":84,"props":103115,"children":103116},{},[103117,103119],{"type":23,"value":103118},"some have ",{"type":17,"tag":133,"props":103120,"children":103121},{"href":4999},[103122],{"type":23,"value":5002},{"type":17,"tag":84,"props":103124,"children":103125},{},[103126],{"type":23,"value":103127},"some don't",{"type":17,"tag":29,"props":103129,"children":103130},{},[103131],{"type":23,"value":103132},"Unified standardizes this:",{"type":17,"tag":80,"props":103134,"children":103135},{},[103136,103140],{"type":17,"tag":84,"props":103137,"children":103138},{},[103139],{"type":23,"value":100696},{"type":17,"tag":84,"props":103141,"children":103142},{},[103143,103147],{"type":17,"tag":133,"props":103144,"children":103145},{"href":9007},[103146],{"type":23,"value":46572},{"type":23,"value":100705},{"type":17,"tag":29,"props":103149,"children":103150},{},[103151],{"type":23,"value":103152},"→ same event model either way",{"type":17,"tag":68,"props":103154,"children":103155},{"id":94106},[103156],{"type":23,"value":103157},"Zero storage",{"type":17,"tag":29,"props":103159,"children":103160},{},[103161],{"type":23,"value":103162},"Verification data includes:",{"type":17,"tag":80,"props":103164,"children":103165},{},[103166,103171,103175,103180],{"type":17,"tag":84,"props":103167,"children":103168},{},[103169],{"type":23,"value":103170},"DOB",{"type":17,"tag":84,"props":103172,"children":103173},{},[103174],{"type":23,"value":75496},{"type":17,"tag":84,"props":103176,"children":103177},{},[103178],{"type":23,"value":103179},"identifiers",{"type":17,"tag":84,"props":103181,"children":103182},{},[103183],{"type":23,"value":82739},{"type":17,"tag":29,"props":103185,"children":103186},{},[103187],{"type":23,"value":103188},"Most platforms store this.",{"type":17,"tag":29,"props":103190,"children":103191},{},[103192],{"type":23,"value":103193},"Unified does not.",{"type":17,"tag":80,"props":103195,"children":103196},{},[103197,103206,103211,103215],{"type":17,"tag":84,"props":103198,"children":103199},{},[103200],{"type":17,"tag":133,"props":103201,"children":103203},{"href":86962,"rel":103202},[214],[103204],{"type":23,"value":103205},"no data at rest",{"type":17,"tag":84,"props":103207,"children":103208},{},[103209],{"type":23,"value":103210},"stateless requests",{"type":17,"tag":84,"props":103212,"children":103213},{},[103214],{"type":23,"value":53262},{"type":17,"tag":84,"props":103216,"children":103217},{},[103218],{"type":23,"value":103219},"lower breach risk",{"type":17,"tag":29,"props":103221,"children":103222},{},[103223],{"type":23,"value":103224},"If you need persistence, you control it.",{"type":17,"tag":68,"props":103226,"children":103228},{"id":103227},"works-across-your-full-product-not-just-verification",[103229],{"type":23,"value":103230},"Works across your full product, not just verification",{"type":17,"tag":29,"props":103232,"children":103233},{},[103234],{"type":23,"value":103235},"Verification doesn't live in isolation.",{"type":17,"tag":29,"props":103237,"children":103238},{},[103239],{"type":23,"value":103240},"You often also need:",{"type":17,"tag":80,"props":103242,"children":103243},{},[103244,103249,103254],{"type":17,"tag":84,"props":103245,"children":103246},{},[103247],{"type":23,"value":103248},"ATS (candidates, hiring stages)",{"type":17,"tag":84,"props":103250,"children":103251},{},[103252],{"type":23,"value":103253},"HRIS (employees, onboarding)",{"type":17,"tag":84,"props":103255,"children":103256},{},[103257],{"type":23,"value":103258},"CRM or other systems",{"type":17,"tag":29,"props":103260,"children":103261},{},[103262,103263,103269],{"type":23,"value":58218},{"type":17,"tag":133,"props":103264,"children":103266},{"href":87026,"rel":103265},[214],[103267],{"type":23,"value":103268},"420+ integrations",{"type":23,"value":103270}," across 25 categories.",{"type":17,"tag":29,"props":103272,"children":103273},{},[103274],{"type":23,"value":103275},"→ You don't need a second platform later",{"type":17,"tag":68,"props":103277,"children":103279},{"id":103278},"when-unified-is-the-best-choice",[103280],{"type":23,"value":103281},"When Unified is the best choice",{"type":17,"tag":29,"props":103283,"children":103284},{},[103285],{"type":23,"value":103286},"Unified is the right fit if you are building:",{"type":17,"tag":80,"props":103288,"children":103289},{},[103290,103295,103300,103305,103310],{"type":17,"tag":84,"props":103291,"children":103292},{},[103293],{"type":23,"value":103294},"Recruiting or hiring platforms",{"type":17,"tag":84,"props":103296,"children":103297},{},[103298],{"type":23,"value":103299},"HR or onboarding systems",{"type":17,"tag":84,"props":103301,"children":103302},{},[103303],{"type":23,"value":103304},"Contractor or marketplace platforms",{"type":17,"tag":84,"props":103306,"children":103307},{},[103308],{"type":23,"value":103309},"Compliance or risk tools",{"type":17,"tag":84,"props":103311,"children":103312},{},[103313],{"type":23,"value":103314},"AI products using real-time verification data",{"type":17,"tag":68,"props":103316,"children":103318},{"id":103317},"when-you-might-choose-something-else",[103319],{"type":23,"value":103320},"When you might choose something else",{"type":17,"tag":80,"props":103322,"children":103323},{},[103324,103329,103334],{"type":17,"tag":84,"props":103325,"children":103326},{},[103327],{"type":23,"value":103328},"Choose Finch → if you only need HRIS/payroll data",{"type":17,"tag":84,"props":103330,"children":103331},{},[103332],{"type":23,"value":103333},"Choose Argyle → if you only need consumer income verification",{"type":17,"tag":84,"props":103335,"children":103336},{},[103337],{"type":23,"value":103338},"Choose KYC providers → if identity verification is your only requirement",{"type":17,"tag":29,"props":103340,"children":103341},{},[103342,103347],{"type":17,"tag":48,"props":103343,"children":103344},{},[103345],{"type":23,"value":103346},"Note:",{"type":23,"value":103348}," Unified supports all of the above use cases as part of a broader integration layer. The difference is that these platforms are optimized for a single slice of the problem, while Unified is designed to support the full workflow across employment data and verification.",{"type":17,"tag":68,"props":103350,"children":103352},{"id":103351},"bottom-line",[103353],{"type":23,"value":103354},"Bottom line",{"type":17,"tag":29,"props":103356,"children":103357},{},[103358],{"type":23,"value":103359},"Most 'unified APIs' solve either:",{"type":17,"tag":80,"props":103361,"children":103362},{},[103363,103368],{"type":17,"tag":84,"props":103364,"children":103365},{},[103366],{"type":23,"value":103367},"employment data",{"type":17,"tag":84,"props":103369,"children":103370},{},[103371],{"type":23,"value":103372},"or verification workflows",{"type":17,"tag":29,"props":103374,"children":103375},{},[103376],{"type":17,"tag":48,"props":103377,"children":103378},{},[103379],{"type":23,"value":103380},"Unified is the only one that solves both together.",{"type":17,"tag":29,"props":103382,"children":103383},{},[103384,103386,103390],{"type":23,"value":103385},"That's what makes it the best ",{"type":17,"tag":133,"props":103387,"children":103388},{"href":7691},[103389],{"type":23,"value":7459},{"type":23,"value":103391}," for employment and identity verification.",{"type":17,"tag":29,"props":103393,"children":103394},{},[103395],{"type":17,"tag":133,"props":103396,"children":103398},{"href":1612,"rel":103397},[214],[103399],{"type":23,"value":44481},{"type":17,"tag":29,"props":103401,"children":103402},{},[103403],{"type":17,"tag":133,"props":103404,"children":103406},{"href":1623,"rel":103405},[214],[103407],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":103409},[103410,103411,103412,103418,103419,103423,103424,103425,103426,103427,103428,103429],{"id":102704,"depth":1629,"text":102707},{"id":102773,"depth":1629,"text":102776},{"id":102822,"depth":1629,"text":102825,"children":103413},[103414,103415,103416,103417],{"id":102828,"depth":1635,"text":7973},{"id":102859,"depth":1635,"text":102862},{"id":102891,"depth":1635,"text":102894},{"id":102923,"depth":1635,"text":102926},{"id":102950,"depth":1629,"text":102953},{"id":102987,"depth":1629,"text":102990,"children":103420},[103421,103422],{"id":103004,"depth":1635,"text":54055},{"id":103014,"depth":1635,"text":54068},{"id":103057,"depth":1629,"text":103060},{"id":103102,"depth":1629,"text":103105},{"id":94106,"depth":1629,"text":103157},{"id":103227,"depth":1629,"text":103230},{"id":103278,"depth":1629,"text":103281},{"id":103317,"depth":1629,"text":103320},{"id":103351,"depth":1629,"text":103354},"content:blog:what_unified_api_is_best_for_employment_and_identity_verification.md","blog/what_unified_api_is_best_for_employment_and_identity_verification.md","blog/what_unified_api_is_best_for_employment_and_identity_verification",{"_path":103434,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":103435,"description":103436,"img":103437,"date":101190,"tag":12,"body":103438,"_type":1677,"_id":104713,"_source":1679,"_file":104714,"_stem":104715,"_extension":1682},"/blog/what_unified_api_is_best_for_read_and_write_accounting_integrations_for_saas_platforms","What Unified API Is Best for Read and Write Accounting Integrations for SaaS Platforms?","The best unified API for read and write accounting integrations depends on how your product handles financial data.","https://s3.us-east-2.amazonaws.com/unified-article-images/what_unified_api_is_best_for_read_and_write_accounting_integrations_for_saas_platforms-icon.png",{"type":14,"children":103439,"toc":104675},[103440,103445,103448,103455,103465,103478,103484,103489,103494,103499,103527,103532,103550,103562,103568,103574,103579,103607,103611,103620,103625,103630,103653,103658,103664,103669,103674,103687,103692,103715,103720,103738,103743,103749,103754,103759,103765,103773,103791,103798,103811,103819,103837,103843,103850,103868,103875,103888,103895,103913,103919,103926,103937,103944,103962,103969,103986,103992,103997,104002,104020,104025,104043,104048,104053,104059,104065,104070,104075,104093,104099,104104,104127,104132,104138,104143,104161,104166,104172,104177,104190,104196,104202,104207,104223,104229,104234,104252,104258,104263,104276,104280,104297,104303,104308,104334,104339,104345,104350,104366,104371,104377,104382,104387,104410,104422,104428,104455,104461,104484,104490,104495,104513,104518,104536,104541,104547,104553,104558,104571,104577,104581,104594,104600,104604,104622,104626,104659,104667],{"type":17,"tag":18,"props":103441,"children":103443},{"id":103442},"what-unified-api-is-best-for-read-and-write-accounting-integrations-for-saas-platforms",[103444],{"type":23,"value":103435},{"type":17,"tag":25,"props":103446,"children":103447},{},[],{"type":17,"tag":29,"props":103449,"children":103450},{},[103451],{"type":17,"tag":33,"props":103452,"children":103453},{},[103454],{"type":23,"value":96921},{"type":17,"tag":29,"props":103456,"children":103457},{},[103458,103459,103463],{"type":23,"value":98742},{"type":17,"tag":133,"props":103460,"children":103461},{"href":7691},[103462],{"type":23,"value":7459},{"type":23,"value":103464}," for read and write accounting integrations depends on how your product handles financial data.",{"type":17,"tag":29,"props":103466,"children":103467},{},[103468,103470,103476],{"type":23,"value":103469},"For SaaS platforms building customer-facing features, the strongest option is an API that supports both reads and writes directly against the source system, without relying on ",{"type":17,"tag":133,"props":103471,"children":103473},{"href":86962,"rel":103472},[214],[103474],{"type":23,"value":103475},"cached data ",{"type":23,"value":103477},"or storing customer financial records. This ensures invoice accuracy, reliable write behavior, and simpler architecture.",{"type":17,"tag":68,"props":103479,"children":103481},{"id":103480},"why-accounting-integrations-are-harder-than-they-look",[103482],{"type":23,"value":103483},"Why accounting integrations are harder than they look",{"type":17,"tag":29,"props":103485,"children":103486},{},[103487],{"type":23,"value":103488},"Accounting integrations are often treated like standard data retrieval.",{"type":17,"tag":29,"props":103490,"children":103491},{},[103492],{"type":23,"value":103493},"They are not.",{"type":17,"tag":29,"props":103495,"children":103496},{},[103497],{"type":23,"value":103498},"Accounting introduces constraints that don't exist in most other integration categories:",{"type":17,"tag":80,"props":103500,"children":103501},{},[103502,103507,103512,103517,103522],{"type":17,"tag":84,"props":103503,"children":103504},{},[103505],{"type":23,"value":103506},"invoices and bills follow strict lifecycle rules",{"type":17,"tag":84,"props":103508,"children":103509},{},[103510],{"type":23,"value":103511},"financial state is derived, not stored directly",{"type":17,"tag":84,"props":103513,"children":103514},{},[103515],{"type":23,"value":103516},"transactions do not always map cleanly to invoices",{"type":17,"tag":84,"props":103518,"children":103519},{},[103520],{"type":23,"value":103521},"reports are generated, not event-driven",{"type":17,"tag":84,"props":103523,"children":103524},{},[103525],{"type":23,"value":103526},"customer identity is not shared across categories",{"type":17,"tag":29,"props":103528,"children":103529},{},[103530],{"type":23,"value":103531},"For SaaS teams, this means:",{"type":17,"tag":80,"props":103533,"children":103534},{},[103535,103540,103545],{"type":17,"tag":84,"props":103536,"children":103537},{},[103538],{"type":23,"value":103539},"incorrect data leads to broken dashboards",{"type":17,"tag":84,"props":103541,"children":103542},{},[103543],{"type":23,"value":103544},"delayed writes create inconsistent system state",{"type":17,"tag":84,"props":103546,"children":103547},{},[103548],{"type":23,"value":103549},"mapping errors create duplicate or mismatched customers",{"type":17,"tag":29,"props":103551,"children":103552},{},[103553,103555,103560],{"type":23,"value":103554},"This is why the 'best API' question is really about ",{"type":17,"tag":48,"props":103556,"children":103557},{},[103558],{"type":23,"value":103559},"architecture",{"type":23,"value":103561},", not features.",{"type":17,"tag":68,"props":103563,"children":103565},{"id":103564},"what-read-and-write-actually-means-in-accounting",[103566],{"type":23,"value":103567},"What 'read and write' actually means in accounting",{"type":17,"tag":239,"props":103569,"children":103571},{"id":103570},"reading-accounting-data",[103572],{"type":23,"value":103573},"Reading accounting data",{"type":17,"tag":29,"props":103575,"children":103576},{},[103577],{"type":23,"value":103578},"Most SaaS products need to retrieve:",{"type":17,"tag":80,"props":103580,"children":103581},{},[103582,103587,103592,103597,103602],{"type":17,"tag":84,"props":103583,"children":103584},{},[103585],{"type":23,"value":103586},"invoices (accounts receivable)",{"type":17,"tag":84,"props":103588,"children":103589},{},[103590],{"type":23,"value":103591},"bills (accounts payable)",{"type":17,"tag":84,"props":103593,"children":103594},{},[103595],{"type":23,"value":103596},"transactions (ledger activity)",{"type":17,"tag":84,"props":103598,"children":103599},{},[103600],{"type":23,"value":103601},"contacts (customers or suppliers)",{"type":17,"tag":84,"props":103603,"children":103604},{},[103605],{"type":23,"value":103606},"reports (profit & loss, trial balance)",{"type":17,"tag":29,"props":103608,"children":103609},{},[103610],{"type":23,"value":19878},{"type":17,"tag":6893,"props":103612,"children":103615},{"className":103613,"code":103614,"language":20901,"meta":23},[20899],"GET /accounting/{connection_id}/invoice?updated_gte=2026-03-01T00:00:00Z\n",[103616],{"type":17,"tag":6121,"props":103617,"children":103618},{"__ignoreMap":7},[103619],{"type":23,"value":103614},{"type":17,"tag":29,"props":103621,"children":103622},{},[103623],{"type":23,"value":103624},"Reading is not just pulling records.",{"type":17,"tag":29,"props":103626,"children":103627},{},[103628],{"type":23,"value":103629},"You are retrieving:",{"type":17,"tag":80,"props":103631,"children":103632},{},[103633,103638,103643,103648],{"type":17,"tag":84,"props":103634,"children":103635},{},[103636],{"type":23,"value":103637},"current balances",{"type":17,"tag":84,"props":103639,"children":103640},{},[103641],{"type":23,"value":103642},"invoice status",{"type":17,"tag":84,"props":103644,"children":103645},{},[103646],{"type":23,"value":103647},"payment progress",{"type":17,"tag":84,"props":103649,"children":103650},{},[103651],{"type":23,"value":103652},"time-based financial state",{"type":17,"tag":29,"props":103654,"children":103655},{},[103656],{"type":23,"value":103657},"If the data is stale, the product breaks.",{"type":17,"tag":239,"props":103659,"children":103661},{"id":103660},"writing-accounting-data",[103662],{"type":23,"value":103663},"Writing accounting data",{"type":17,"tag":29,"props":103665,"children":103666},{},[103667],{"type":23,"value":103668},"Write operations are where most unified APIs fail.",{"type":17,"tag":29,"props":103670,"children":103671},{},[103672],{"type":23,"value":103673},"Simple writes:",{"type":17,"tag":80,"props":103675,"children":103676},{},[103677,103682],{"type":17,"tag":84,"props":103678,"children":103679},{},[103680],{"type":23,"value":103681},"create contact",{"type":17,"tag":84,"props":103683,"children":103684},{},[103685],{"type":23,"value":103686},"create draft invoice",{"type":17,"tag":29,"props":103688,"children":103689},{},[103690],{"type":23,"value":103691},"Complex writes:",{"type":17,"tag":80,"props":103693,"children":103694},{},[103695,103700,103705,103710],{"type":17,"tag":84,"props":103696,"children":103697},{},[103698],{"type":23,"value":103699},"multi-line invoices with tax handling",{"type":17,"tag":84,"props":103701,"children":103702},{},[103703],{"type":23,"value":103704},"posting to ledger",{"type":17,"tag":84,"props":103706,"children":103707},{},[103708],{"type":23,"value":103709},"updating invoices after state changes",{"type":17,"tag":84,"props":103711,"children":103712},{},[103713],{"type":23,"value":103714},"handling provider-specific required fields",{"type":17,"tag":29,"props":103716,"children":103717},{},[103718],{"type":23,"value":103719},"Accounting systems enforce rules like:",{"type":17,"tag":80,"props":103721,"children":103722},{},[103723,103728,103733],{"type":17,"tag":84,"props":103724,"children":103725},{},[103726],{"type":23,"value":103727},"posted invoices may not be editable",{"type":17,"tag":84,"props":103729,"children":103730},{},[103731],{"type":23,"value":103732},"deletes may convert to voids",{"type":17,"tag":84,"props":103734,"children":103735},{},[103736],{"type":23,"value":103737},"totals may be recomputed",{"type":17,"tag":29,"props":103739,"children":103740},{},[103741],{"type":23,"value":103742},"If the API does not handle this correctly, write operations become unreliable.",{"type":17,"tag":68,"props":103744,"children":103746},{"id":103745},"the-three-architecture-models-behind-unified-apis",[103747],{"type":23,"value":103748},"The three architecture models behind unified APIs",{"type":17,"tag":29,"props":103750,"children":103751},{},[103752],{"type":23,"value":103753},"Most comparisons focus on vendors.",{"type":17,"tag":29,"props":103755,"children":103756},{},[103757],{"type":23,"value":103758},"The real difference is architecture.",{"type":17,"tag":239,"props":103760,"children":103762},{"id":103761},"_1-cached-sync-based-apis",[103763],{"type":23,"value":103764},"1. Cached / sync-based APIs",{"type":17,"tag":29,"props":103766,"children":103767},{},[103768],{"type":17,"tag":48,"props":103769,"children":103770},{},[103771],{"type":23,"value":103772},"How they work",{"type":17,"tag":80,"props":103774,"children":103775},{},[103776,103781,103786],{"type":17,"tag":84,"props":103777,"children":103778},{},[103779],{"type":23,"value":103780},"data is copied into a platform-managed database",{"type":17,"tag":84,"props":103782,"children":103783},{},[103784],{"type":23,"value":103785},"reads come from cached data",{"type":17,"tag":84,"props":103787,"children":103788},{},[103789],{"type":23,"value":103790},"writes are often queued or asynchronous",{"type":17,"tag":29,"props":103792,"children":103793},{},[103794],{"type":17,"tag":48,"props":103795,"children":103796},{},[103797],{"type":23,"value":43788},{"type":17,"tag":80,"props":103799,"children":103800},{},[103801,103806],{"type":17,"tag":84,"props":103802,"children":103803},{},[103804],{"type":23,"value":103805},"fast read performance",{"type":17,"tag":84,"props":103807,"children":103808},{},[103809],{"type":23,"value":103810},"simplified rate limit handling",{"type":17,"tag":29,"props":103812,"children":103813},{},[103814],{"type":17,"tag":48,"props":103815,"children":103816},{},[103817],{"type":23,"value":103818},"Limitations for accounting",{"type":17,"tag":80,"props":103820,"children":103821},{},[103822,103827,103832],{"type":17,"tag":84,"props":103823,"children":103824},{},[103825],{"type":23,"value":103826},"invoice status may be outdated",{"type":17,"tag":84,"props":103828,"children":103829},{},[103830],{"type":23,"value":103831},"receivable balances may lag behind reality",{"type":17,"tag":84,"props":103833,"children":103834},{},[103835],{"type":23,"value":103836},"financial dashboards can be incorrect",{"type":17,"tag":239,"props":103838,"children":103840},{"id":103839},"_2-deep-sync-infrastructure",[103841],{"type":23,"value":103842},"2. Deep sync infrastructure",{"type":17,"tag":29,"props":103844,"children":103845},{},[103846],{"type":17,"tag":48,"props":103847,"children":103848},{},[103849],{"type":23,"value":103772},{"type":17,"tag":80,"props":103851,"children":103852},{},[103853,103858,103863],{"type":17,"tag":84,"props":103854,"children":103855},{},[103856],{"type":23,"value":103857},"bi-directional sync pipelines",{"type":17,"tag":84,"props":103859,"children":103860},{},[103861],{"type":23,"value":103862},"custom mapping per customer",{"type":17,"tag":84,"props":103864,"children":103865},{},[103866],{"type":23,"value":103867},"often code-driven",{"type":17,"tag":29,"props":103869,"children":103870},{},[103871],{"type":17,"tag":48,"props":103872,"children":103873},{},[103874],{"type":23,"value":43788},{"type":17,"tag":80,"props":103876,"children":103877},{},[103878,103883],{"type":17,"tag":84,"props":103879,"children":103880},{},[103881],{"type":23,"value":103882},"flexible for complex ERP environments",{"type":17,"tag":84,"props":103884,"children":103885},{},[103886],{"type":23,"value":103887},"supports custom objects and schemas",{"type":17,"tag":29,"props":103889,"children":103890},{},[103891],{"type":17,"tag":48,"props":103892,"children":103893},{},[103894],{"type":23,"value":440},{"type":17,"tag":80,"props":103896,"children":103897},{},[103898,103903,103908],{"type":17,"tag":84,"props":103899,"children":103900},{},[103901],{"type":23,"value":103902},"high engineering overhead",{"type":17,"tag":84,"props":103904,"children":103905},{},[103906],{"type":23,"value":103907},"longer time to production",{"type":17,"tag":84,"props":103909,"children":103910},{},[103911],{"type":23,"value":103912},"requires ongoing maintenance",{"type":17,"tag":239,"props":103914,"children":103916},{"id":103915},"_3-real-time-pass-through-apis",[103917],{"type":23,"value":103918},"3. Real-time pass-through APIs",{"type":17,"tag":29,"props":103920,"children":103921},{},[103922],{"type":17,"tag":48,"props":103923,"children":103924},{},[103925],{"type":23,"value":103772},{"type":17,"tag":80,"props":103927,"children":103928},{},[103929,103933],{"type":17,"tag":84,"props":103930,"children":103931},{},[103932],{"type":23,"value":7411},{"type":17,"tag":84,"props":103934,"children":103935},{},[103936],{"type":23,"value":7416},{"type":17,"tag":29,"props":103938,"children":103939},{},[103940],{"type":17,"tag":48,"props":103941,"children":103942},{},[103943],{"type":23,"value":43788},{"type":17,"tag":80,"props":103945,"children":103946},{},[103947,103952,103957],{"type":17,"tag":84,"props":103948,"children":103949},{},[103950],{"type":23,"value":103951},"always current financial data",{"type":17,"tag":84,"props":103953,"children":103954},{},[103955],{"type":23,"value":103956},"no sync infrastructure required",{"type":17,"tag":84,"props":103958,"children":103959},{},[103960],{"type":23,"value":103961},"reduced compliance footprint",{"type":17,"tag":29,"props":103963,"children":103964},{},[103965],{"type":17,"tag":48,"props":103966,"children":103967},{},[103968],{"type":23,"value":621},{"type":17,"tag":80,"props":103970,"children":103971},{},[103972,103977],{"type":17,"tag":84,"props":103973,"children":103974},{},[103975],{"type":23,"value":103976},"higher latency per request",{"type":17,"tag":84,"props":103978,"children":103979},{},[103980,103982],{"type":23,"value":103981},"direct exposure to provider ",{"type":17,"tag":133,"props":103983,"children":103984},{"href":135},[103985],{"type":23,"value":138},{"type":17,"tag":68,"props":103987,"children":103989},{"id":103988},"why-accounting-favors-real-time-architecture",[103990],{"type":23,"value":103991},"Why accounting favors real-time architecture",{"type":17,"tag":29,"props":103993,"children":103994},{},[103995],{"type":23,"value":103996},"Accounting systems are stateful and time-sensitive.",{"type":17,"tag":29,"props":103998,"children":103999},{},[104000],{"type":23,"value":104001},"Key examples:",{"type":17,"tag":80,"props":104003,"children":104004},{},[104005,104010,104015],{"type":17,"tag":84,"props":104006,"children":104007},{},[104008],{"type":23,"value":104009},"invoice status changes as payments are applied",{"type":17,"tag":84,"props":104011,"children":104012},{},[104013],{"type":23,"value":104014},"balances update as transactions are recorded",{"type":17,"tag":84,"props":104016,"children":104017},{},[104018],{"type":23,"value":104019},"reports reflect current ledger state",{"type":17,"tag":29,"props":104021,"children":104022},{},[104023],{"type":23,"value":104024},"If your API returns cached data:",{"type":17,"tag":80,"props":104026,"children":104027},{},[104028,104033,104038],{"type":17,"tag":84,"props":104029,"children":104030},{},[104031],{"type":23,"value":104032},"receivables can be wrong",{"type":17,"tag":84,"props":104034,"children":104035},{},[104036],{"type":23,"value":104037},"invoice status can be outdated",{"type":17,"tag":84,"props":104039,"children":104040},{},[104041],{"type":23,"value":104042},"financial dashboards lose trust",{"type":17,"tag":29,"props":104044,"children":104045},{},[104046],{"type":23,"value":104047},"For read-heavy categories, caching can work.",{"type":17,"tag":29,"props":104049,"children":104050},{},[104051],{"type":23,"value":104052},"For accounting, it introduces risk.",{"type":17,"tag":68,"props":104054,"children":104056},{"id":104055},"what-most-unified-api-comparisons-miss",[104057],{"type":23,"value":104058},"What most unified API comparisons miss",{"type":17,"tag":239,"props":104060,"children":104062},{"id":104061},"_1-connector-count-is-not-the-constraint",[104063],{"type":23,"value":104064},"1. Connector count is not the constraint",{"type":17,"tag":29,"props":104066,"children":104067},{},[104068],{"type":23,"value":104069},"The difference is not how many integrations exist.",{"type":17,"tag":29,"props":104071,"children":104072},{},[104073],{"type":23,"value":104074},"It is:",{"type":17,"tag":80,"props":104076,"children":104077},{},[104078,104083,104088],{"type":17,"tag":84,"props":104079,"children":104080},{},[104081],{"type":23,"value":104082},"how invoices behave",{"type":17,"tag":84,"props":104084,"children":104085},{},[104086],{"type":23,"value":104087},"how writes are handled",{"type":17,"tag":84,"props":104089,"children":104090},{},[104091],{"type":23,"value":104092},"how data stays consistent",{"type":17,"tag":239,"props":104094,"children":104096},{"id":104095},"_2-there-is-no-shared-customer-identity",[104097],{"type":23,"value":104098},"2. There is no shared customer identity",{"type":17,"tag":29,"props":104100,"children":104101},{},[104102],{"type":23,"value":104103},"Across categories:",{"type":17,"tag":80,"props":104105,"children":104106},{},[104107,104112,104122],{"type":17,"tag":84,"props":104108,"children":104109},{},[104110],{"type":23,"value":104111},"CRM contact ≠ accounting contact",{"type":17,"tag":84,"props":104113,"children":104114},{},[104115,104117],{"type":23,"value":104116},"accounting uses its own ",{"type":17,"tag":6121,"props":104118,"children":104120},{"className":104119},[],[104121],{"type":23,"value":26302},{"type":17,"tag":84,"props":104123,"children":104124},{},[104125],{"type":23,"value":104126},"applications must build their own mapping",{"type":17,"tag":29,"props":104128,"children":104129},{},[104130],{"type":23,"value":104131},"This is a required part of any architecture.",{"type":17,"tag":239,"props":104133,"children":104135},{"id":104134},"_3-accounting-is-not-crud-only",[104136],{"type":23,"value":104137},"3. Accounting is not CRUD-only",{"type":17,"tag":29,"props":104139,"children":104140},{},[104141],{"type":23,"value":104142},"Accounting systems enforce:",{"type":17,"tag":80,"props":104144,"children":104145},{},[104146,104151,104156],{"type":17,"tag":84,"props":104147,"children":104148},{},[104149],{"type":23,"value":104150},"lifecycle rules",{"type":17,"tag":84,"props":104152,"children":104153},{},[104154],{"type":23,"value":104155},"validation constraints",{"type":17,"tag":84,"props":104157,"children":104158},{},[104159],{"type":23,"value":104160},"derived fields",{"type":17,"tag":29,"props":104162,"children":104163},{},[104164],{"type":23,"value":104165},"A simple 'create and update' model is not enough.",{"type":17,"tag":239,"props":104167,"children":104169},{"id":104168},"_4-financial-state-must-be-current",[104170],{"type":23,"value":104171},"4. Financial state must be current",{"type":17,"tag":29,"props":104173,"children":104174},{},[104175],{"type":23,"value":104176},"In accounting:",{"type":17,"tag":80,"props":104178,"children":104179},{},[104180,104185],{"type":17,"tag":84,"props":104181,"children":104182},{},[104183],{"type":23,"value":104184},"stale data is not a performance issue",{"type":17,"tag":84,"props":104186,"children":104187},{},[104188],{"type":23,"value":104189},"it is a correctness issue",{"type":17,"tag":68,"props":104191,"children":104193},{"id":104192},"how-to-evaluate-a-unified-api-for-accounting",[104194],{"type":23,"value":104195},"How to evaluate a unified API for accounting",{"type":17,"tag":239,"props":104197,"children":104199},{"id":104198},"read-coverage",[104200],{"type":23,"value":104201},"Read coverage",{"type":17,"tag":29,"props":104203,"children":104204},{},[104205],{"type":23,"value":104206},"Can you retrieve:",{"type":17,"tag":80,"props":104208,"children":104209},{},[104210,104215,104219],{"type":17,"tag":84,"props":104211,"children":104212},{},[104213],{"type":23,"value":104214},"invoices with line items",{"type":17,"tag":84,"props":104216,"children":104217},{},[104218],{"type":23,"value":82494},{"type":17,"tag":84,"props":104220,"children":104221},{},[104222],{"type":23,"value":103606},{"type":17,"tag":239,"props":104224,"children":104226},{"id":104225},"write-reliability",[104227],{"type":23,"value":104228},"Write reliability",{"type":17,"tag":29,"props":104230,"children":104231},{},[104232],{"type":23,"value":104233},"Test:",{"type":17,"tag":80,"props":104235,"children":104236},{},[104237,104242,104247],{"type":17,"tag":84,"props":104238,"children":104239},{},[104240],{"type":23,"value":104241},"invoice creation with tax",{"type":17,"tag":84,"props":104243,"children":104244},{},[104245],{"type":23,"value":104246},"updates after posting",{"type":17,"tag":84,"props":104248,"children":104249},{},[104250],{"type":23,"value":104251},"error handling across integrations",{"type":17,"tag":239,"props":104253,"children":104255},{"id":104254},"data-handling-model",[104256],{"type":23,"value":104257},"Data handling model",{"type":17,"tag":29,"props":104259,"children":104260},{},[104261],{"type":23,"value":104262},"Understand:",{"type":17,"tag":80,"props":104264,"children":104265},{},[104266,104271],{"type":17,"tag":84,"props":104267,"children":104268},{},[104269],{"type":23,"value":104270},"whether data is cached or fetched directly",{"type":17,"tag":84,"props":104272,"children":104273},{},[104274],{"type":23,"value":104275},"whether customer financial data is stored",{"type":17,"tag":29,"props":104277,"children":104278},{},[104279],{"type":23,"value":9398},{"type":17,"tag":80,"props":104281,"children":104282},{},[104283,104288,104293],{"type":17,"tag":84,"props":104284,"children":104285},{},[104286],{"type":23,"value":104287},"compliance",{"type":17,"tag":84,"props":104289,"children":104290},{},[104291],{"type":23,"value":104292},"architecture complexity",{"type":17,"tag":84,"props":104294,"children":104295},{},[104296],{"type":23,"value":10347},{"type":17,"tag":239,"props":104298,"children":104300},{"id":104299},"incremental-updates",[104301],{"type":23,"value":104302},"Incremental updates",{"type":17,"tag":29,"props":104304,"children":104305},{},[104306],{"type":23,"value":104307},"Look for:",{"type":17,"tag":80,"props":104309,"children":104310},{},[104311,104322,104329],{"type":17,"tag":84,"props":104312,"children":104313},{},[104314,104316,104321],{"type":23,"value":104315},"timestamp filters (",{"type":17,"tag":6121,"props":104317,"children":104319},{"className":104318},[],[104320],{"type":23,"value":26291},{"type":23,"value":12034},{"type":17,"tag":84,"props":104323,"children":104324},{},[104325],{"type":17,"tag":133,"props":104326,"children":104327},{"href":1857},[104328],{"type":23,"value":1860},{"type":17,"tag":84,"props":104330,"children":104331},{},[104332],{"type":23,"value":104333},"field filtering",{"type":17,"tag":29,"props":104335,"children":104336},{},[104337],{"type":23,"value":104338},"These determine how your system stays in sync.",{"type":17,"tag":239,"props":104340,"children":104342},{"id":104341},"cross-category-integration",[104343],{"type":23,"value":104344},"Cross-category integration",{"type":17,"tag":29,"props":104346,"children":104347},{},[104348],{"type":23,"value":104349},"Most SaaS products combine:",{"type":17,"tag":80,"props":104351,"children":104352},{},[104353,104357,104361],{"type":17,"tag":84,"props":104354,"children":104355},{},[104356],{"type":23,"value":25731},{"type":17,"tag":84,"props":104358,"children":104359},{},[104360],{"type":23,"value":11737},{"type":17,"tag":84,"props":104362,"children":104363},{},[104364],{"type":23,"value":104365},"Accounting",{"type":17,"tag":29,"props":104367,"children":104368},{},[104369],{"type":23,"value":104370},"Your architecture must support joining these datasets.",{"type":17,"tag":68,"props":104372,"children":104374},{"id":104373},"where-unified-fits-for-accounting-integrations",[104375],{"type":23,"value":104376},"Where Unified fits for accounting integrations",{"type":17,"tag":239,"props":104378,"children":104380},{"id":104379},"unified-accounting-api",[104381],{"type":23,"value":83770},{"type":17,"tag":29,"props":104383,"children":104384},{},[104385],{"type":23,"value":104386},"Unified provides an accounting API that standardizes how developers read and write:",{"type":17,"tag":80,"props":104388,"children":104389},{},[104390,104394,104398,104402,104406],{"type":17,"tag":84,"props":104391,"children":104392},{},[104393],{"type":23,"value":36676},{"type":17,"tag":84,"props":104395,"children":104396},{},[104397],{"type":23,"value":82475},{"type":17,"tag":84,"props":104399,"children":104400},{},[104401],{"type":23,"value":82494},{"type":17,"tag":84,"props":104403,"children":104404},{},[104405],{"type":23,"value":30404},{"type":17,"tag":84,"props":104407,"children":104408},{},[104409],{"type":23,"value":82739},{"type":17,"tag":29,"props":104411,"children":104412},{},[104413,104415,104421],{"type":23,"value":104414},"across ",{"type":17,"tag":133,"props":104416,"children":104418},{"href":83766,"rel":104417},[214],[104419],{"type":23,"value":104420},"40+ accounting integrations",{"type":23,"value":54},{"type":17,"tag":239,"props":104423,"children":104425},{"id":104424},"architecture-behavior",[104426],{"type":23,"value":104427},"Architecture behavior",{"type":17,"tag":80,"props":104429,"children":104430},{},[104431,104435,104440,104445,104450],{"type":17,"tag":84,"props":104432,"children":104433},{},[104434],{"type":23,"value":7411},{"type":17,"tag":84,"props":104436,"children":104437},{},[104438],{"type":23,"value":104439},"no customer data is stored or cached",{"type":17,"tag":84,"props":104441,"children":104442},{},[104443],{"type":23,"value":104444},"objects are normalized within the accounting category",{"type":17,"tag":84,"props":104446,"children":104447},{},[104448],{"type":23,"value":104449},"custom fields are accessible when needed",{"type":17,"tag":84,"props":104451,"children":104452},{},[104453],{"type":23,"value":104454},"updates can be retrieved using timestamp filters",{"type":17,"tag":239,"props":104456,"children":104458},{"id":104457},"what-this-enables-for-saas-products",[104459],{"type":23,"value":104460},"What this enables for SaaS products",{"type":17,"tag":80,"props":104462,"children":104463},{},[104464,104469,104474,104479],{"type":17,"tag":84,"props":104465,"children":104466},{},[104467],{"type":23,"value":104468},"accurate accounts receivable views",{"type":17,"tag":84,"props":104470,"children":104471},{},[104472],{"type":23,"value":104473},"real-time invoice and balance data",{"type":17,"tag":84,"props":104475,"children":104476},{},[104477],{"type":23,"value":104478},"consistent read and write behavior across integrations",{"type":17,"tag":84,"props":104480,"children":104481},{},[104482],{"type":23,"value":104483},"no sync jobs or storage infrastructure",{"type":17,"tag":239,"props":104485,"children":104487},{"id":104486},"what-your-application-still-owns",[104488],{"type":23,"value":104489},"What your application still owns",{"type":17,"tag":29,"props":104491,"children":104492},{},[104493],{"type":23,"value":104494},"Unified does not:",{"type":17,"tag":80,"props":104496,"children":104497},{},[104498,104503,104508],{"type":17,"tag":84,"props":104499,"children":104500},{},[104501],{"type":23,"value":104502},"link CRM and accounting contacts",{"type":17,"tag":84,"props":104504,"children":104505},{},[104506],{"type":23,"value":104507},"compute revenue metrics",{"type":17,"tag":84,"props":104509,"children":104510},{},[104511],{"type":23,"value":104512},"manage reconciliation logic",{"type":17,"tag":29,"props":104514,"children":104515},{},[104516],{"type":23,"value":104517},"Applications are responsible for:",{"type":17,"tag":80,"props":104519,"children":104520},{},[104521,104526,104531],{"type":17,"tag":84,"props":104522,"children":104523},{},[104524],{"type":23,"value":104525},"customer identity mapping",{"type":17,"tag":84,"props":104527,"children":104528},{},[104529],{"type":23,"value":104530},"analytics and dashboards",{"type":17,"tag":84,"props":104532,"children":104533},{},[104534],{"type":23,"value":104535},"business logic",{"type":17,"tag":29,"props":104537,"children":104538},{},[104539],{"type":23,"value":104540},"This separation keeps the API focused on data access rather than derived state.",{"type":17,"tag":68,"props":104542,"children":104544},{"id":104543},"when-different-architectures-may-make-sense",[104545],{"type":23,"value":104546},"When different architectures may make sense",{"type":17,"tag":239,"props":104548,"children":104550},{"id":104549},"cached-apis",[104551],{"type":23,"value":104552},"Cached APIs",{"type":17,"tag":29,"props":104554,"children":104555},{},[104556],{"type":23,"value":104557},"Use when:",{"type":17,"tag":80,"props":104559,"children":104560},{},[104561,104566],{"type":17,"tag":84,"props":104562,"children":104563},{},[104564],{"type":23,"value":104565},"financial data is secondary",{"type":17,"tag":84,"props":104567,"children":104568},{},[104569],{"type":23,"value":104570},"slight staleness is acceptable",{"type":17,"tag":239,"props":104572,"children":104574},{"id":104573},"deep-sync-infrastructure",[104575],{"type":23,"value":104576},"Deep sync infrastructure",{"type":17,"tag":29,"props":104578,"children":104579},{},[104580],{"type":23,"value":104557},{"type":17,"tag":80,"props":104582,"children":104583},{},[104584,104589],{"type":17,"tag":84,"props":104585,"children":104586},{},[104587],{"type":23,"value":104588},"customers use heavily customized ERP systems",{"type":17,"tag":84,"props":104590,"children":104591},{},[104592],{"type":23,"value":104593},"you need custom object-level control",{"type":17,"tag":239,"props":104595,"children":104597},{"id":104596},"real-time-apis",[104598],{"type":23,"value":104599},"Real-time APIs",{"type":17,"tag":29,"props":104601,"children":104602},{},[104603],{"type":23,"value":104557},{"type":17,"tag":80,"props":104605,"children":104606},{},[104607,104612,104617],{"type":17,"tag":84,"props":104608,"children":104609},{},[104610],{"type":23,"value":104611},"your product depends on accurate financial state",{"type":17,"tag":84,"props":104613,"children":104614},{},[104615],{"type":23,"value":104616},"you support customer-facing billing or analytics",{"type":17,"tag":84,"props":104618,"children":104619},{},[104620],{"type":23,"value":104621},"you want to avoid storing financial data",{"type":17,"tag":68,"props":104623,"children":104624},{"id":7672},[104625],{"type":23,"value":19256},{"type":17,"tag":80,"props":104627,"children":104628},{},[104629,104634,104639,104644,104649,104654],{"type":17,"tag":84,"props":104630,"children":104631},{},[104632],{"type":23,"value":104633},"Accounting integrations are constrained by ledger behavior, not just API design",{"type":17,"tag":84,"props":104635,"children":104636},{},[104637],{"type":23,"value":104638},"Read and write operations behave differently in accounting systems",{"type":17,"tag":84,"props":104640,"children":104641},{},[104642],{"type":23,"value":104643},"Cached APIs trade accuracy for speed",{"type":17,"tag":84,"props":104645,"children":104646},{},[104647],{"type":23,"value":104648},"Real-time APIs align better with financial state changes",{"type":17,"tag":84,"props":104650,"children":104651},{},[104652],{"type":23,"value":104653},"There is no shared customer identity across CRM, payments, and accounting",{"type":17,"tag":84,"props":104655,"children":104656},{},[104657],{"type":23,"value":104658},"Unified provides real-time, normalized access to accounting data without storing customer data",{"type":17,"tag":29,"props":104660,"children":104661},{},[104662],{"type":17,"tag":133,"props":104663,"children":104665},{"href":1612,"rel":104664},[214],[104666],{"type":23,"value":44481},{"type":17,"tag":29,"props":104668,"children":104669},{},[104670],{"type":17,"tag":133,"props":104671,"children":104673},{"href":1623,"rel":104672},[214],[104674],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":104676},[104677,104678,104682,104687,104688,104694,104701,104707,104712],{"id":103480,"depth":1629,"text":103483},{"id":103564,"depth":1629,"text":103567,"children":104679},[104680,104681],{"id":103570,"depth":1635,"text":103573},{"id":103660,"depth":1635,"text":103663},{"id":103745,"depth":1629,"text":103748,"children":104683},[104684,104685,104686],{"id":103761,"depth":1635,"text":103764},{"id":103839,"depth":1635,"text":103842},{"id":103915,"depth":1635,"text":103918},{"id":103988,"depth":1629,"text":103991},{"id":104055,"depth":1629,"text":104058,"children":104689},[104690,104691,104692,104693],{"id":104061,"depth":1635,"text":104064},{"id":104095,"depth":1635,"text":104098},{"id":104134,"depth":1635,"text":104137},{"id":104168,"depth":1635,"text":104171},{"id":104192,"depth":1629,"text":104195,"children":104695},[104696,104697,104698,104699,104700],{"id":104198,"depth":1635,"text":104201},{"id":104225,"depth":1635,"text":104228},{"id":104254,"depth":1635,"text":104257},{"id":104299,"depth":1635,"text":104302},{"id":104341,"depth":1635,"text":104344},{"id":104373,"depth":1629,"text":104376,"children":104702},[104703,104704,104705,104706],{"id":104379,"depth":1635,"text":83770},{"id":104424,"depth":1635,"text":104427},{"id":104457,"depth":1635,"text":104460},{"id":104486,"depth":1635,"text":104489},{"id":104543,"depth":1629,"text":104546,"children":104708},[104709,104710,104711],{"id":104549,"depth":1635,"text":104552},{"id":104573,"depth":1635,"text":104576},{"id":104596,"depth":1635,"text":104599},{"id":7672,"depth":1629,"text":19256},"content:blog:what_unified_api_is_best_for_read_and_write_accounting_integrations_for_saas_platforms.md","blog/what_unified_api_is_best_for_read_and_write_accounting_integrations_for_saas_platforms.md","blog/what_unified_api_is_best_for_read_and_write_accounting_integrations_for_saas_platforms",{"_path":104717,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":104718,"description":104719,"img":104720,"date":101190,"tag":12,"body":104721,"_type":1677,"_id":106352,"_source":1679,"_file":106353,"_stem":106354,"_extension":1682},"/blog/what_unified_api_is_best_for_shipping_and_logistics_integrations_for_e_commerce_platforms_in_2026","What Unified API Is Best for Shipping and Logistics Integrations for E-Commerce Platforms in 2026?","Shipping integrations look straightforward until you support more than one provider.","https://s3.us-east-2.amazonaws.com/unified-article-images/what_unified_api_is_best_for_shipping_and_logistics_integrations_for_e_commerce_platforms_in_2026-icon.png",{"type":14,"children":104722,"toc":106312},[104723,104728,104731,104738,104742,104747,104752,104775,104785,104790,104803,104809,104814,104825,104829,104877,104882,104905,104910,104915,104921,104926,104931,104937,104942,104965,104970,104976,104980,105000,105004,105027,105038,105044,105048,105055,105060,105065,105083,105088,105094,105099,105105,105110,105134,105139,105162,105167,105173,105178,105183,105201,105206,105219,105224,105228,105233,105256,105261,105278,105283,105289,105294,105299,105312,105317,105323,105328,105333,105351,105356,105362,105367,105384,105389,105407,105412,105418,105423,105428,105437,105491,105496,105507,105518,105523,105532,105550,105555,105564,105582,105587,105596,105614,105619,105628,105641,105647,105652,105657,105662,105685,105690,105698,105704,105709,105713,105718,105734,105739,105756,105760,105765,105782,105788,105792,105815,105820,105826,105849,105857,105862,105868,105873,105878,105896,105902,105907,105912,105952,105957,105962,105968,105973,105978,106000,106005,106011,106015,106031,106036,106054,106060,106064,106082,106087,106099,106105,106109,106122,106127,106145,106151,106155,106173,106178,106191,106196,106200,106209,106236,106246,106264,106268,106273,106278,106283,106288,106296,106304],{"type":17,"tag":18,"props":104724,"children":104726},{"id":104725},"what-unified-api-is-best-for-shipping-and-logistics-integrations-for-e-commerce-platforms-in-2026",[104727],{"type":23,"value":104718},{"type":17,"tag":25,"props":104729,"children":104730},{},[],{"type":17,"tag":29,"props":104732,"children":104733},{},[104734],{"type":17,"tag":33,"props":104735,"children":104736},{},[104737],{"type":23,"value":96921},{"type":17,"tag":29,"props":104739,"children":104740},{},[104741],{"type":23,"value":104719},{"type":17,"tag":29,"props":104743,"children":104744},{},[104745],{"type":23,"value":104746},"FedEx, UPS, USPS, DHL, Shippo, ShipStation—each exposes different APIs, different assumptions, and different levels of event support. Tracking updates arrive inconsistently. Labels trigger irreversible actions. Some systems don't even support list endpoints.",{"type":17,"tag":29,"props":104748,"children":104749},{},[104750],{"type":23,"value":104751},"When shipping data is stitched together across these systems, the result is predictable:",{"type":17,"tag":80,"props":104753,"children":104754},{},[104755,104760,104765,104770],{"type":17,"tag":84,"props":104756,"children":104757},{},[104758],{"type":23,"value":104759},"delayed tracking updates",{"type":17,"tag":84,"props":104761,"children":104762},{},[104763],{"type":23,"value":104764},"inconsistent fulfillment state",{"type":17,"tag":84,"props":104766,"children":104767},{},[104768],{"type":23,"value":104769},"brittle retry logic",{"type":17,"tag":84,"props":104771,"children":104772},{},[104773],{"type":23,"value":104774},"poor customer experience",{"type":17,"tag":29,"props":104776,"children":104777},{},[104778,104780,104784],{"type":23,"value":104779},"This is why teams look for a ",{"type":17,"tag":133,"props":104781,"children":104782},{"href":7691},[104783],{"type":23,"value":7459},{"type":23,"value":54},{"type":17,"tag":29,"props":104786,"children":104787},{},[104788],{"type":23,"value":104789},"But most comparisons miss a key detail.",{"type":17,"tag":29,"props":104791,"children":104792},{},[104793],{"type":17,"tag":48,"props":104794,"children":104795},{},[104796,104797,104801],{"type":23,"value":98742},{"type":17,"tag":133,"props":104798,"children":104799},{"href":34475},[104800],{"type":23,"value":34478},{"type":23,"value":104802}," for merchants is not always the best unified API for SaaS platforms.",{"type":17,"tag":68,"props":104804,"children":104806},{"id":104805},"what-a-shipping-api-actually-covers-and-what-it-doesnt",[104807],{"type":23,"value":104808},"What a shipping API actually covers (and what it doesn't)",{"type":17,"tag":29,"props":104810,"children":104811},{},[104812],{"type":23,"value":104813},"Before comparing platforms, it's important to define the category clearly.",{"type":17,"tag":29,"props":104815,"children":104816},{},[104817,104819,104824],{"type":23,"value":104818},"A shipping API manages ",{"type":17,"tag":48,"props":104820,"children":104821},{},[104822],{"type":23,"value":104823},"logistics execution and delivery state",{"type":23,"value":54},{"type":17,"tag":29,"props":104826,"children":104827},{},[104828],{"type":23,"value":101278},{"type":17,"tag":80,"props":104830,"children":104831},{},[104832,104841,104850,104859,104868],{"type":17,"tag":84,"props":104833,"children":104834},{},[104835,104839],{"type":17,"tag":48,"props":104836,"children":104837},{},[104838],{"type":23,"value":35464},{"type":23,"value":104840}," — the movement of goods",{"type":17,"tag":84,"props":104842,"children":104843},{},[104844,104848],{"type":17,"tag":48,"props":104845,"children":104846},{},[104847],{"type":23,"value":35469},{"type":23,"value":104849}," — purchased postage",{"type":17,"tag":84,"props":104851,"children":104852},{},[104853,104857],{"type":17,"tag":48,"props":104854,"children":104855},{},[104856],{"type":23,"value":35474},{"type":23,"value":104858}," — delivery progress and events",{"type":17,"tag":84,"props":104860,"children":104861},{},[104862,104866],{"type":17,"tag":48,"props":104863,"children":104864},{},[104865],{"type":23,"value":35479},{"type":23,"value":104867}," — shipping quotes",{"type":17,"tag":84,"props":104869,"children":104870},{},[104871,104875],{"type":17,"tag":48,"props":104872,"children":104873},{},[104874],{"type":23,"value":35484},{"type":23,"value":104876}," — service providers and metadata",{"type":17,"tag":29,"props":104878,"children":104879},{},[104880],{"type":23,"value":104881},"What it does not include:",{"type":17,"tag":80,"props":104883,"children":104884},{},[104885,104890,104895,104900],{"type":17,"tag":84,"props":104886,"children":104887},{},[104888],{"type":23,"value":104889},"products or inventory (Commerce)",{"type":17,"tag":84,"props":104891,"children":104892},{},[104893],{"type":23,"value":104894},"orders and financial records (Accounting)",{"type":17,"tag":84,"props":104896,"children":104897},{},[104898],{"type":23,"value":104899},"payments or refunds (Payments)",{"type":17,"tag":84,"props":104901,"children":104902},{},[104903],{"type":23,"value":104904},"customers as CRM objects",{"type":17,"tag":29,"props":104906,"children":104907},{},[104908],{"type":23,"value":104909},"Shipping sits downstream of those systems. It consumes context from them, but it does not own them.",{"type":17,"tag":29,"props":104911,"children":104912},{},[104913],{"type":23,"value":104914},"That distinction matters when choosing an integration strategy.",{"type":17,"tag":68,"props":104916,"children":104918},{"id":104917},"the-critical-distinction-shipping-platforms-vs-unified-apis",[104919],{"type":23,"value":104920},"The critical distinction: shipping platforms vs unified APIs",{"type":17,"tag":29,"props":104922,"children":104923},{},[104924],{"type":23,"value":104925},"Most 'best shipping API' lists mix together tools that solve different problems.",{"type":17,"tag":29,"props":104927,"children":104928},{},[104929],{"type":23,"value":104930},"There are three layers to understand.",{"type":17,"tag":239,"props":104932,"children":104934},{"id":104933},"_1-carrier-apis",[104935],{"type":23,"value":104936},"1. Carrier APIs",{"type":17,"tag":29,"props":104938,"children":104939},{},[104940],{"type":23,"value":104941},"These are direct integrations with carriers:",{"type":17,"tag":80,"props":104943,"children":104944},{},[104945,104949,104953,104957,104961],{"type":17,"tag":84,"props":104946,"children":104947},{},[104948],{"type":23,"value":34400},{"type":17,"tag":84,"props":104950,"children":104951},{},[104952],{"type":23,"value":34408},{"type":17,"tag":84,"props":104954,"children":104955},{},[104956],{"type":23,"value":34416},{"type":17,"tag":84,"props":104958,"children":104959},{},[104960],{"type":23,"value":34424},{"type":17,"tag":84,"props":104962,"children":104963},{},[104964],{"type":23,"value":35441},{"type":17,"tag":29,"props":104966,"children":104967},{},[104968],{"type":23,"value":104969},"They are low-level, inconsistent, and rarely used directly by SaaS teams.",{"type":17,"tag":239,"props":104971,"children":104973},{"id":104972},"_2-shipping-platforms-multi-carrier-aggregators",[104974],{"type":23,"value":104975},"2. Shipping platforms / multi-carrier aggregators",{"type":17,"tag":29,"props":104977,"children":104978},{},[104979],{"type":23,"value":377},{"type":17,"tag":80,"props":104981,"children":104982},{},[104983,104987,104991,104996],{"type":17,"tag":84,"props":104984,"children":104985},{},[104986],{"type":23,"value":35431},{"type":17,"tag":84,"props":104988,"children":104989},{},[104990],{"type":23,"value":34433},{"type":17,"tag":84,"props":104992,"children":104993},{},[104994],{"type":23,"value":104995},"ShipEngine",{"type":17,"tag":84,"props":104997,"children":104998},{},[104999],{"type":23,"value":35436},{"type":17,"tag":29,"props":105001,"children":105002},{},[105003],{"type":23,"value":101823},{"type":17,"tag":80,"props":105005,"children":105006},{},[105007,105012,105017,105022],{"type":17,"tag":84,"props":105008,"children":105009},{},[105010],{"type":23,"value":105011},"connect to multiple carriers",{"type":17,"tag":84,"props":105013,"children":105014},{},[105015],{"type":23,"value":105016},"generate labels",{"type":17,"tag":84,"props":105018,"children":105019},{},[105020],{"type":23,"value":105021},"provide rate shopping",{"type":17,"tag":84,"props":105023,"children":105024},{},[105025],{"type":23,"value":105026},"expose tracking",{"type":17,"tag":29,"props":105028,"children":105029},{},[105030,105032,105037],{"type":23,"value":105031},"They are the right choice if you are ",{"type":17,"tag":48,"props":105033,"children":105034},{},[105035],{"type":23,"value":105036},"shipping products yourself",{"type":23,"value":54},{"type":17,"tag":239,"props":105039,"children":105041},{"id":105040},"_3-unified-apis-for-saas-platforms",[105042],{"type":23,"value":105043},"3. Unified APIs for SaaS platforms",{"type":17,"tag":29,"props":105045,"children":105046},{},[105047],{"type":23,"value":19878},{"type":17,"tag":80,"props":105049,"children":105050},{},[105051],{"type":17,"tag":84,"props":105052,"children":105053},{},[105054],{"type":23,"value":87523},{"type":17,"tag":29,"props":105056,"children":105057},{},[105058],{"type":23,"value":105059},"This layer exists for a different use case.",{"type":17,"tag":29,"props":105061,"children":105062},{},[105063],{"type":23,"value":105064},"Instead of helping you ship, it helps your product:",{"type":17,"tag":80,"props":105066,"children":105067},{},[105068,105073,105078],{"type":17,"tag":84,"props":105069,"children":105070},{},[105071],{"type":23,"value":105072},"integrate with your customers' shipping systems",{"type":17,"tag":84,"props":105074,"children":105075},{},[105076],{"type":23,"value":105077},"normalize shipping data across providers",{"type":17,"tag":84,"props":105079,"children":105080},{},[105081],{"type":23,"value":105082},"connect shipping to Commerce, Accounting, and Payments",{"type":17,"tag":29,"props":105084,"children":105085},{},[105086],{"type":23,"value":105087},"This is the layer most SaaS teams actually need.",{"type":17,"tag":68,"props":105089,"children":105091},{"id":105090},"what-to-look-for-in-a-unified-shipping-api",[105092],{"type":23,"value":105093},"What to look for in a unified shipping API",{"type":17,"tag":29,"props":105095,"children":105096},{},[105097],{"type":23,"value":105098},"Not all unified APIs solve the same problems. The differences show up in how they handle real shipping behavior.",{"type":17,"tag":239,"props":105100,"children":105102},{"id":105101},"_1-object-coverage-and-realism",[105103],{"type":23,"value":105104},"1. Object coverage and realism",{"type":17,"tag":29,"props":105106,"children":105107},{},[105108],{"type":23,"value":105109},"A useful shipping API should expose:",{"type":17,"tag":80,"props":105111,"children":105112},{},[105113,105117,105121,105125,105129],{"type":17,"tag":84,"props":105114,"children":105115},{},[105116],{"type":23,"value":34492},{"type":17,"tag":84,"props":105118,"children":105119},{},[105120],{"type":23,"value":34502},{"type":17,"tag":84,"props":105122,"children":105123},{},[105124],{"type":23,"value":34719},{"type":17,"tag":84,"props":105126,"children":105127},{},[105128],{"type":23,"value":35158},{"type":17,"tag":84,"props":105130,"children":105131},{},[105132],{"type":23,"value":105133},"carriers",{"type":17,"tag":29,"props":105135,"children":105136},{},[105137],{"type":23,"value":105138},"More importantly, it should reflect how these objects behave in practice:",{"type":17,"tag":80,"props":105140,"children":105141},{},[105142,105147,105152,105157],{"type":17,"tag":84,"props":105143,"children":105144},{},[105145],{"type":23,"value":105146},"rates are read-only snapshots",{"type":17,"tag":84,"props":105148,"children":105149},{},[105150],{"type":23,"value":105151},"labels are often irreversible",{"type":17,"tag":84,"props":105153,"children":105154},{},[105155],{"type":23,"value":105156},"tracking is the primary update source",{"type":17,"tag":84,"props":105158,"children":105159},{},[105160],{"type":23,"value":105161},"shipment updates are not always reliable",{"type":17,"tag":29,"props":105163,"children":105164},{},[105165],{"type":23,"value":105166},"If the model ignores these constraints, your integration will break under real usage.",{"type":17,"tag":239,"props":105168,"children":105170},{"id":105169},"_2-real-time-vs-sync-based-data",[105171],{"type":23,"value":105172},"2. Real-time vs sync-based data",{"type":17,"tag":29,"props":105174,"children":105175},{},[105176],{"type":23,"value":105177},"Shipping is sensitive to timing.",{"type":17,"tag":29,"props":105179,"children":105180},{},[105181],{"type":23,"value":105182},"Delays cause:",{"type":17,"tag":80,"props":105184,"children":105185},{},[105186,105191,105196],{"type":17,"tag":84,"props":105187,"children":105188},{},[105189],{"type":23,"value":105190},"incorrect delivery estimates",{"type":17,"tag":84,"props":105192,"children":105193},{},[105194],{"type":23,"value":105195},"stale tracking data",{"type":17,"tag":84,"props":105197,"children":105198},{},[105199],{"type":23,"value":105200},"missed exceptions",{"type":17,"tag":29,"props":105202,"children":105203},{},[105204],{"type":23,"value":105205},"In practice:",{"type":17,"tag":80,"props":105207,"children":105208},{},[105209,105214],{"type":17,"tag":84,"props":105210,"children":105211},{},[105212],{"type":23,"value":105213},"tracking is the most reliable real-time signal",{"type":17,"tag":84,"props":105215,"children":105216},{},[105217],{"type":23,"value":105218},"other objects often require polling or partial updates",{"type":17,"tag":29,"props":105220,"children":105221},{},[105222],{"type":23,"value":105223},"Any platform that relies heavily on cached or delayed data will introduce inconsistencies.",{"type":17,"tag":239,"props":105225,"children":105226},{"id":101528},[105227],{"type":23,"value":101531},{"type":17,"tag":29,"props":105229,"children":105230},{},[105231],{"type":23,"value":105232},"Shipping providers are inconsistent by design.",{"type":17,"tag":80,"props":105234,"children":105235},{},[105236,105241,105246,105251],{"type":17,"tag":84,"props":105237,"children":105238},{},[105239],{"type":23,"value":105240},"webhook support varies",{"type":17,"tag":84,"props":105242,"children":105243},{},[105244],{"type":23,"value":105245},"some objects cannot be listed or monitored",{"type":17,"tag":84,"props":105247,"children":105248},{},[105249],{"type":23,"value":105250},"schemas differ",{"type":17,"tag":84,"props":105252,"children":105253},{},[105254],{"type":23,"value":105255},"carrier rules differ",{"type":17,"tag":29,"props":105257,"children":105258},{},[105259],{"type":23,"value":105260},"A unified API must:",{"type":17,"tag":80,"props":105262,"children":105263},{},[105264,105268,105273],{"type":17,"tag":84,"props":105265,"children":105266},{},[105267],{"type":23,"value":101578},{"type":17,"tag":84,"props":105269,"children":105270},{},[105271],{"type":23,"value":105272},"handle missing features gracefully",{"type":17,"tag":84,"props":105274,"children":105275},{},[105276],{"type":23,"value":105277},"expose provider-specific data when needed",{"type":17,"tag":29,"props":105279,"children":105280},{},[105281],{"type":23,"value":105282},"Otherwise, you end up rebuilding logic per provider.",{"type":17,"tag":239,"props":105284,"children":105286},{"id":105285},"_4-merchant-vs-saas-integration-model",[105287],{"type":23,"value":105288},"4. Merchant vs SaaS integration model",{"type":17,"tag":29,"props":105290,"children":105291},{},[105292],{"type":23,"value":105293},"This is the most important decision.",{"type":17,"tag":29,"props":105295,"children":105296},{},[105297],{"type":23,"value":105298},"Are you:",{"type":17,"tag":80,"props":105300,"children":105301},{},[105302,105307],{"type":17,"tag":84,"props":105303,"children":105304},{},[105305],{"type":23,"value":105306},"shipping orders directly?",{"type":17,"tag":84,"props":105308,"children":105309},{},[105310],{"type":23,"value":105311},"or building a product that integrates with your customers' shipping systems?",{"type":17,"tag":29,"props":105313,"children":105314},{},[105315],{"type":23,"value":105316},"These are different problems, and they require different tools.",{"type":17,"tag":239,"props":105318,"children":105320},{"id":105319},"_5-cross-category-compatibility",[105321],{"type":23,"value":105322},"5. Cross-category compatibility",{"type":17,"tag":29,"props":105324,"children":105325},{},[105326],{"type":23,"value":105327},"Shipping does not operate in isolation.",{"type":17,"tag":29,"props":105329,"children":105330},{},[105331],{"type":23,"value":105332},"It depends on:",{"type":17,"tag":80,"props":105334,"children":105335},{},[105336,105341,105346],{"type":17,"tag":84,"props":105337,"children":105338},{},[105339],{"type":23,"value":105340},"Commerce (inventory, locations)",{"type":17,"tag":84,"props":105342,"children":105343},{},[105344],{"type":23,"value":105345},"Accounting (orders)",{"type":17,"tag":84,"props":105347,"children":105348},{},[105349],{"type":23,"value":105350},"Payments (transactions and refunds)",{"type":17,"tag":29,"props":105352,"children":105353},{},[105354],{"type":23,"value":105355},"A good unified API should fit cleanly into this broader system.",{"type":17,"tag":239,"props":105357,"children":105359},{"id":105358},"_6-suitability-for-automation-and-ai",[105360],{"type":23,"value":105361},"6. Suitability for automation and AI",{"type":17,"tag":29,"props":105363,"children":105364},{},[105365],{"type":23,"value":105366},"Modern SaaS products rely on:",{"type":17,"tag":80,"props":105368,"children":105369},{},[105370,105375,105380],{"type":17,"tag":84,"props":105371,"children":105372},{},[105373],{"type":23,"value":105374},"structured data",{"type":17,"tag":84,"props":105376,"children":105377},{},[105378],{"type":23,"value":105379},"reliable updates",{"type":17,"tag":84,"props":105381,"children":105382},{},[105383],{"type":23,"value":69604},{"type":17,"tag":29,"props":105385,"children":105386},{},[105387],{"type":23,"value":105388},"Shipping is especially sensitive here because:",{"type":17,"tag":80,"props":105390,"children":105391},{},[105392,105397,105402],{"type":17,"tag":84,"props":105393,"children":105394},{},[105395],{"type":23,"value":105396},"state changes are operationally important",{"type":17,"tag":84,"props":105398,"children":105399},{},[105400],{"type":23,"value":105401},"delays are visible to customers",{"type":17,"tag":84,"props":105403,"children":105404},{},[105405],{"type":23,"value":105406},"decisions are repetitive and rule-based",{"type":17,"tag":29,"props":105408,"children":105409},{},[105410],{"type":23,"value":105411},"This makes shipping a strong candidate for automation and vertical AI—if the data layer supports it.",{"type":17,"tag":68,"props":105413,"children":105415},{"id":105414},"platform-comparison-easypost-vs-shippo-vs-shipengine-vs-sendcloud-vs-unified",[105416],{"type":23,"value":105417},"Platform comparison: EasyPost vs Shippo vs ShipEngine vs Sendcloud vs Unified",{"type":17,"tag":29,"props":105419,"children":105420},{},[105421],{"type":23,"value":105422},"These platforms are often compared directly, but they serve different roles.",{"type":17,"tag":239,"props":105424,"children":105426},{"id":105425},"unified",[105427],{"type":23,"value":87523},{"type":17,"tag":29,"props":105429,"children":105430},{},[105431,105435],{"type":17,"tag":48,"props":105432,"children":105433},{},[105434],{"type":23,"value":43522},{"type":23,"value":105436}," SaaS platforms integrating shipping across customers",{"type":17,"tag":80,"props":105438,"children":105439},{},[105440,105445,105477,105481,105486],{"type":17,"tag":84,"props":105441,"children":105442},{},[105443],{"type":23,"value":105444},"unified API for shipping systems",{"type":17,"tag":84,"props":105446,"children":105447},{},[105448,105450],{"type":23,"value":105449},"normalized objects:\n",{"type":17,"tag":80,"props":105451,"children":105452},{},[105453,105458,105463,105467,105472],{"type":17,"tag":84,"props":105454,"children":105455},{},[105456],{"type":23,"value":105457},"shipment",{"type":17,"tag":84,"props":105459,"children":105460},{},[105461],{"type":23,"value":105462},"label",{"type":17,"tag":84,"props":105464,"children":105465},{},[105466],{"type":23,"value":34719},{"type":17,"tag":84,"props":105468,"children":105469},{},[105470],{"type":23,"value":105471},"rate",{"type":17,"tag":84,"props":105473,"children":105474},{},[105475],{"type":23,"value":105476},"carrier",{"type":17,"tag":84,"props":105478,"children":105479},{},[105480],{"type":23,"value":289},{"type":17,"tag":84,"props":105482,"children":105483},{},[105484],{"type":23,"value":105485},"zero data stored at rest",{"type":17,"tag":84,"props":105487,"children":105488},{},[105489],{"type":23,"value":105490},"connects shipping with Commerce, Accounting, and Payments",{"type":17,"tag":29,"props":105492,"children":105493},{},[105494],{"type":23,"value":105495},"Important distinction:",{"type":17,"tag":29,"props":105497,"children":105498},{},[105499,105501,105506],{"type":23,"value":105500},"The following four platforms help you ",{"type":17,"tag":48,"props":105502,"children":105503},{},[105504],{"type":23,"value":105505},"execute shipping",{"type":23,"value":54},{"type":17,"tag":29,"props":105508,"children":105509},{},[105510,105512,105517],{"type":23,"value":105511},"Unified helps you ",{"type":17,"tag":48,"props":105513,"children":105514},{},[105515],{"type":23,"value":105516},"integrate shipping into your product",{"type":23,"value":54},{"type":17,"tag":239,"props":105519,"children":105521},{"id":105520},"easypost",[105522],{"type":23,"value":35431},{"type":17,"tag":29,"props":105524,"children":105525},{},[105526,105530],{"type":17,"tag":48,"props":105527,"children":105528},{},[105529],{"type":23,"value":43522},{"type":23,"value":105531}," developer teams building shipping infrastructure",{"type":17,"tag":80,"props":105533,"children":105534},{},[105535,105540,105545],{"type":17,"tag":84,"props":105536,"children":105537},{},[105538],{"type":23,"value":105539},"large carrier network",{"type":17,"tag":84,"props":105541,"children":105542},{},[105543],{"type":23,"value":105544},"strong API design",{"type":17,"tag":84,"props":105546,"children":105547},{},[105548],{"type":23,"value":105549},"direct label and rate handling",{"type":17,"tag":239,"props":105551,"children":105553},{"id":105552},"shippo",[105554],{"type":23,"value":34433},{"type":17,"tag":29,"props":105556,"children":105557},{},[105558,105562],{"type":17,"tag":48,"props":105559,"children":105560},{},[105561],{"type":23,"value":43522},{"type":23,"value":105563}," SMB to mid-market shipping workflows",{"type":17,"tag":80,"props":105565,"children":105566},{},[105567,105572,105577],{"type":17,"tag":84,"props":105568,"children":105569},{},[105570],{"type":23,"value":105571},"API + dashboard combination",{"type":17,"tag":84,"props":105573,"children":105574},{},[105575],{"type":23,"value":105576},"strong e-commerce integrations",{"type":17,"tag":84,"props":105578,"children":105579},{},[105580],{"type":23,"value":105581},"accessible pricing model",{"type":17,"tag":239,"props":105583,"children":105585},{"id":105584},"shipengine",[105586],{"type":23,"value":104995},{"type":17,"tag":29,"props":105588,"children":105589},{},[105590,105594],{"type":17,"tag":48,"props":105591,"children":105592},{},[105593],{"type":23,"value":43522},{"type":23,"value":105595}," high-volume shipping and marketplaces",{"type":17,"tag":80,"props":105597,"children":105598},{},[105599,105604,105609],{"type":17,"tag":84,"props":105600,"children":105601},{},[105602],{"type":23,"value":105603},"built for scale",{"type":17,"tag":84,"props":105605,"children":105606},{},[105607],{"type":23,"value":105608},"advanced carrier features",{"type":17,"tag":84,"props":105610,"children":105611},{},[105612],{"type":23,"value":105613},"strong performance",{"type":17,"tag":239,"props":105615,"children":105617},{"id":105616},"sendcloud",[105618],{"type":23,"value":35436},{"type":17,"tag":29,"props":105620,"children":105621},{},[105622,105626],{"type":17,"tag":48,"props":105623,"children":105624},{},[105625],{"type":23,"value":43522},{"type":23,"value":105627}," European logistics workflows",{"type":17,"tag":80,"props":105629,"children":105630},{},[105631,105636],{"type":17,"tag":84,"props":105632,"children":105633},{},[105634],{"type":23,"value":105635},"strong EU carrier coverage",{"type":17,"tag":84,"props":105637,"children":105638},{},[105639],{"type":23,"value":105640},"returns and cross-border focus",{"type":17,"tag":68,"props":105642,"children":105644},{"id":105643},"why-architecture-matters-more-than-carrier-count",[105645],{"type":23,"value":105646},"Why architecture matters more than carrier count",{"type":17,"tag":29,"props":105648,"children":105649},{},[105650],{"type":23,"value":105651},"Carrier count is often used as a comparison metric.",{"type":17,"tag":29,"props":105653,"children":105654},{},[105655],{"type":23,"value":105656},"It shouldn't be.",{"type":17,"tag":29,"props":105658,"children":105659},{},[105660],{"type":23,"value":105661},"Shipping complexity does not come from how many carriers you support. It comes from:",{"type":17,"tag":80,"props":105663,"children":105664},{},[105665,105670,105675,105680],{"type":17,"tag":84,"props":105666,"children":105667},{},[105668],{"type":23,"value":105669},"inconsistent object behavior",{"type":17,"tag":84,"props":105671,"children":105672},{},[105673],{"type":23,"value":105674},"uneven event coverage",{"type":17,"tag":84,"props":105676,"children":105677},{},[105678],{"type":23,"value":105679},"lifecycle constraints",{"type":17,"tag":84,"props":105681,"children":105682},{},[105683],{"type":23,"value":105684},"cross-system dependencies",{"type":17,"tag":29,"props":105686,"children":105687},{},[105688],{"type":23,"value":105689},"A platform with more carriers but weaker abstraction can create more work, not less.",{"type":17,"tag":29,"props":105691,"children":105692},{},[105693],{"type":17,"tag":48,"props":105694,"children":105695},{},[105696],{"type":23,"value":105697},"For SaaS products, the real question is not how many carriers a platform supports. It is how well it normalizes shipping state, handles provider variability, and fits into your product architecture.",{"type":17,"tag":68,"props":105699,"children":105701},{"id":105700},"why-unified-is-the-strongest-choice-for-saas-shipping-integrations",[105702],{"type":23,"value":105703},"Why Unified is the strongest choice for SaaS shipping integrations",{"type":17,"tag":29,"props":105705,"children":105706},{},[105707],{"type":23,"value":105708},"Unified is designed for the integration problem, not just the shipping problem.",{"type":17,"tag":239,"props":105710,"children":105711},{"id":13402},[105712],{"type":23,"value":13405},{"type":17,"tag":29,"props":105714,"children":105715},{},[105716],{"type":23,"value":105717},"Every request hits the source system live.",{"type":17,"tag":80,"props":105719,"children":105720},{},[105721,105725,105729],{"type":17,"tag":84,"props":105722,"children":105723},{},[105724],{"type":23,"value":41801},{"type":17,"tag":84,"props":105726,"children":105727},{},[105728],{"type":23,"value":102293},{"type":17,"tag":84,"props":105730,"children":105731},{},[105732],{"type":23,"value":105733},"no stale state",{"type":17,"tag":29,"props":105735,"children":105736},{},[105737],{"type":23,"value":105738},"This matters for:",{"type":17,"tag":80,"props":105740,"children":105741},{},[105742,105747,105751],{"type":17,"tag":84,"props":105743,"children":105744},{},[105745],{"type":23,"value":105746},"tracking accuracy",{"type":17,"tag":84,"props":105748,"children":105749},{},[105750],{"type":23,"value":34714},{"type":17,"tag":84,"props":105752,"children":105753},{},[105754],{"type":23,"value":105755},"shipment status",{"type":17,"tag":239,"props":105757,"children":105758},{"id":90302},[105759],{"type":23,"value":43670},{"type":17,"tag":29,"props":105761,"children":105762},{},[105763],{"type":23,"value":105764},"Unified does not store shipping data at rest.",{"type":17,"tag":80,"props":105766,"children":105767},{},[105768,105772,105777],{"type":17,"tag":84,"props":105769,"children":105770},{},[105771],{"type":23,"value":52144},{"type":17,"tag":84,"props":105773,"children":105774},{},[105775],{"type":23,"value":105776},"avoids duplicated data layers",{"type":17,"tag":84,"props":105778,"children":105779},{},[105780],{"type":23,"value":105781},"keeps architecture simpler",{"type":17,"tag":239,"props":105783,"children":105785},{"id":105784},"normalized-shipping-object-model",[105786],{"type":23,"value":105787},"Normalized shipping object model",{"type":17,"tag":29,"props":105789,"children":105790},{},[105791],{"type":23,"value":80421},{"type":17,"tag":80,"props":105793,"children":105794},{},[105795,105799,105803,105807,105811],{"type":17,"tag":84,"props":105796,"children":105797},{},[105798],{"type":23,"value":34492},{"type":17,"tag":84,"props":105800,"children":105801},{},[105802],{"type":23,"value":34502},{"type":17,"tag":84,"props":105804,"children":105805},{},[105806],{"type":23,"value":34719},{"type":17,"tag":84,"props":105808,"children":105809},{},[105810],{"type":23,"value":35158},{"type":17,"tag":84,"props":105812,"children":105813},{},[105814],{"type":23,"value":105133},{"type":17,"tag":29,"props":105816,"children":105817},{},[105818],{"type":23,"value":105819},"This allows one implementation across providers, even with uneven feature support.",{"type":17,"tag":239,"props":105821,"children":105823},{"id":105822},"built-for-real-world-provider-behavior",[105824],{"type":23,"value":105825},"Built for real-world provider behavior",{"type":17,"tag":80,"props":105827,"children":105828},{},[105829,105839,105844],{"type":17,"tag":84,"props":105830,"children":105831},{},[105832,105833,105837],{"type":23,"value":89673},{"type":17,"tag":133,"props":105834,"children":105835},{"href":4999},[105836],{"type":23,"value":5002},{"type":23,"value":105838}," where available",{"type":17,"tag":84,"props":105840,"children":105841},{},[105842],{"type":23,"value":105843},"virtual webhooks (polling) where needed",{"type":17,"tag":84,"props":105845,"children":105846},{},[105847],{"type":23,"value":105848},"tracking treated as primary update source",{"type":17,"tag":29,"props":105850,"children":105851},{},[105852],{"type":17,"tag":48,"props":105853,"children":105854},{},[105855],{"type":23,"value":105856},"In shipping, real-time usually means tracking-driven visibility, not perfect event coverage across every object.",{"type":17,"tag":29,"props":105858,"children":105859},{},[105860],{"type":23,"value":105861},"Unified reflects that reality.",{"type":17,"tag":239,"props":105863,"children":105865},{"id":105864},"designed-for-saas-not-just-merchants",[105866],{"type":23,"value":105867},"Designed for SaaS, not just merchants",{"type":17,"tag":29,"props":105869,"children":105870},{},[105871],{"type":23,"value":105872},"Unified is not trying to replace shipping platforms.",{"type":17,"tag":29,"props":105874,"children":105875},{},[105876],{"type":23,"value":105877},"It sits above them, allowing your product to:",{"type":17,"tag":80,"props":105879,"children":105880},{},[105881,105886,105891],{"type":17,"tag":84,"props":105882,"children":105883},{},[105884],{"type":23,"value":105885},"integrate with multiple shipping systems",{"type":17,"tag":84,"props":105887,"children":105888},{},[105889],{"type":23,"value":105890},"normalize logistics data",{"type":17,"tag":84,"props":105892,"children":105893},{},[105894],{"type":23,"value":105895},"avoid per-provider logic",{"type":17,"tag":68,"props":105897,"children":105899},{"id":105898},"how-shipping-fits-into-finance-commerce",[105900],{"type":23,"value":105901},"How shipping fits into Finance & Commerce",{"type":17,"tag":29,"props":105903,"children":105904},{},[105905],{"type":23,"value":105906},"Shipping becomes much more valuable when connected to other systems.",{"type":17,"tag":29,"props":105908,"children":105909},{},[105910],{"type":23,"value":105911},"Within a unified platform:",{"type":17,"tag":80,"props":105913,"children":105914},{},[105915,105924,105933,105942],{"type":17,"tag":84,"props":105916,"children":105917},{},[105918,105922],{"type":17,"tag":48,"props":105919,"children":105920},{},[105921],{"type":23,"value":11638},{"type":23,"value":105923}," manages products, inventory, locations",{"type":17,"tag":84,"props":105925,"children":105926},{},[105927,105931],{"type":17,"tag":48,"props":105928,"children":105929},{},[105930],{"type":23,"value":104365},{"type":23,"value":105932}," manages orders and financial records",{"type":17,"tag":84,"props":105934,"children":105935},{},[105936,105940],{"type":17,"tag":48,"props":105937,"children":105938},{},[105939],{"type":23,"value":11737},{"type":23,"value":105941}," manages transactions and refunds",{"type":17,"tag":84,"props":105943,"children":105944},{},[105945,105950],{"type":17,"tag":48,"props":105946,"children":105947},{},[105948],{"type":23,"value":105949},"Shipping",{"type":23,"value":105951}," manages fulfillment and delivery",{"type":17,"tag":29,"props":105953,"children":105954},{},[105955],{"type":23,"value":105956},"Shipping depends on these systems, but remains separate from them.",{"type":17,"tag":29,"props":105958,"children":105959},{},[105960],{"type":23,"value":105961},"That separation is what keeps integrations clean and maintainable.",{"type":17,"tag":68,"props":105963,"children":105965},{"id":105964},"why-this-matters-for-vertical-ai",[105966],{"type":23,"value":105967},"Why this matters for vertical AI",{"type":17,"tag":29,"props":105969,"children":105970},{},[105971],{"type":23,"value":105972},"Shipping is one of the strongest categories for vertical AI.",{"type":17,"tag":29,"props":105974,"children":105975},{},[105976],{"type":23,"value":105977},"It has:",{"type":17,"tag":80,"props":105979,"children":105980},{},[105981,105986,105991,105996],{"type":17,"tag":84,"props":105982,"children":105983},{},[105984],{"type":23,"value":105985},"structured states",{"type":17,"tag":84,"props":105987,"children":105988},{},[105989],{"type":23,"value":105990},"clear lifecycles",{"type":17,"tag":84,"props":105992,"children":105993},{},[105994],{"type":23,"value":105995},"high operational impact",{"type":17,"tag":84,"props":105997,"children":105998},{},[105999],{"type":23,"value":105684},{"type":17,"tag":29,"props":106001,"children":106002},{},[106003],{"type":23,"value":106004},"But AI only works if the data is reliable.",{"type":17,"tag":239,"props":106006,"children":106008},{"id":106007},"fulfillment-exception-detection",[106009],{"type":23,"value":106010},"Fulfillment exception detection",{"type":17,"tag":29,"props":106012,"children":106013},{},[106014],{"type":23,"value":95512},{"type":17,"tag":80,"props":106016,"children":106017},{},[106018,106022,106026],{"type":17,"tag":84,"props":106019,"children":106020},{},[106021],{"type":23,"value":105755},{"type":17,"tag":84,"props":106023,"children":106024},{},[106025],{"type":23,"value":35177},{"type":17,"tag":84,"props":106027,"children":106028},{},[106029],{"type":23,"value":106030},"carrier signals",{"type":17,"tag":29,"props":106032,"children":106033},{},[106034],{"type":23,"value":106035},"To identify:",{"type":17,"tag":80,"props":106037,"children":106038},{},[106039,106044,106049],{"type":17,"tag":84,"props":106040,"children":106041},{},[106042],{"type":23,"value":106043},"delays",{"type":17,"tag":84,"props":106045,"children":106046},{},[106047],{"type":23,"value":106048},"stuck shipments",{"type":17,"tag":84,"props":106050,"children":106051},{},[106052],{"type":23,"value":106053},"delivery failures",{"type":17,"tag":239,"props":106055,"children":106057},{"id":106056},"intelligent-rate-and-carrier-selection",[106058],{"type":23,"value":106059},"Intelligent rate and carrier selection",{"type":17,"tag":29,"props":106061,"children":106062},{},[106063],{"type":23,"value":95512},{"type":17,"tag":80,"props":106065,"children":106066},{},[106067,106072,106077],{"type":17,"tag":84,"props":106068,"children":106069},{},[106070],{"type":23,"value":106071},"rate data",{"type":17,"tag":84,"props":106073,"children":106074},{},[106075],{"type":23,"value":106076},"service levels",{"type":17,"tag":84,"props":106078,"children":106079},{},[106080],{"type":23,"value":106081},"package details",{"type":17,"tag":29,"props":106083,"children":106084},{},[106085],{"type":23,"value":106086},"To optimize:",{"type":17,"tag":80,"props":106088,"children":106089},{},[106090,106095],{"type":17,"tag":84,"props":106091,"children":106092},{},[106093],{"type":23,"value":106094},"cost vs speed",{"type":17,"tag":84,"props":106096,"children":106097},{},[106098],{"type":23,"value":35305},{"type":17,"tag":239,"props":106100,"children":106102},{"id":106101},"customer-support-automation",[106103],{"type":23,"value":106104},"Customer support automation",{"type":17,"tag":29,"props":106106,"children":106107},{},[106108],{"type":23,"value":95512},{"type":17,"tag":80,"props":106110,"children":106111},{},[106112,106117],{"type":17,"tag":84,"props":106113,"children":106114},{},[106115],{"type":23,"value":106116},"tracking status",{"type":17,"tag":84,"props":106118,"children":106119},{},[106120],{"type":23,"value":106121},"delivery events",{"type":17,"tag":29,"props":106123,"children":106124},{},[106125],{"type":23,"value":106126},"To answer:",{"type":17,"tag":80,"props":106128,"children":106129},{},[106130,106135,106140],{"type":17,"tag":84,"props":106131,"children":106132},{},[106133],{"type":23,"value":106134},"where a package is",{"type":17,"tag":84,"props":106136,"children":106137},{},[106138],{"type":23,"value":106139},"whether it is delayed",{"type":17,"tag":84,"props":106141,"children":106142},{},[106143],{"type":23,"value":106144},"when to intervene",{"type":17,"tag":239,"props":106146,"children":106148},{"id":106147},"returns-orchestration",[106149],{"type":23,"value":106150},"Returns orchestration",{"type":17,"tag":29,"props":106152,"children":106153},{},[106154],{"type":23,"value":95512},{"type":17,"tag":80,"props":106156,"children":106157},{},[106158,106163,106168],{"type":17,"tag":84,"props":106159,"children":106160},{},[106161],{"type":23,"value":106162},"shipment and return data",{"type":17,"tag":84,"props":106164,"children":106165},{},[106166],{"type":23,"value":106167},"label state",{"type":17,"tag":84,"props":106169,"children":106170},{},[106171],{"type":23,"value":106172},"tracking updates",{"type":17,"tag":29,"props":106174,"children":106175},{},[106176],{"type":23,"value":106177},"To automate:",{"type":17,"tag":80,"props":106179,"children":106180},{},[106181,106186],{"type":17,"tag":84,"props":106182,"children":106183},{},[106184],{"type":23,"value":106185},"return workflows",{"type":17,"tag":84,"props":106187,"children":106188},{},[106189],{"type":23,"value":106190},"escalation logic",{"type":17,"tag":29,"props":106192,"children":106193},{},[106194],{"type":23,"value":106195},"Vertical AI in shipping depends on connected operational context across Commerce, Accounting, Payments, and Shipping.",{"type":17,"tag":68,"props":106197,"children":106198},{"id":102449},[106199],{"type":23,"value":102452},{"type":17,"tag":29,"props":106201,"children":106202},{},[106203,106204,106208],{"type":23,"value":44311},{"type":17,"tag":48,"props":106205,"children":106206},{},[106207],{"type":23,"value":87523},{"type":23,"value":44317},{"type":17,"tag":80,"props":106210,"children":106211},{},[106212,106216,106221,106226,106231],{"type":17,"tag":84,"props":106213,"children":106214},{},[106215],{"type":23,"value":102469},{"type":17,"tag":84,"props":106217,"children":106218},{},[106219],{"type":23,"value":106220},"you need to integrate with your customers' shipping systems",{"type":17,"tag":84,"props":106222,"children":106223},{},[106224],{"type":23,"value":106225},"you want normalized logistics data across providers",{"type":17,"tag":84,"props":106227,"children":106228},{},[106229],{"type":23,"value":106230},"you need shipping to work with Commerce, Accounting, and Payments",{"type":17,"tag":84,"props":106232,"children":106233},{},[106234],{"type":23,"value":106235},"you are building automation or AI workflows",{"type":17,"tag":29,"props":106237,"children":106238},{},[106239,106240,106245],{"type":23,"value":44311},{"type":17,"tag":48,"props":106241,"children":106242},{},[106243],{"type":23,"value":106244},"EasyPost, Shippo, ShipEngine, or Sendcloud",{"type":23,"value":44317},{"type":17,"tag":80,"props":106247,"children":106248},{},[106249,106254,106259],{"type":17,"tag":84,"props":106250,"children":106251},{},[106252],{"type":23,"value":106253},"you are shipping products directly",{"type":17,"tag":84,"props":106255,"children":106256},{},[106257],{"type":23,"value":106258},"you need carrier access and label generation",{"type":17,"tag":84,"props":106260,"children":106261},{},[106262],{"type":23,"value":106263},"you are building fulfillment infrastructure",{"type":17,"tag":68,"props":106265,"children":106266},{"id":1552},[106267],{"type":23,"value":1555},{"type":17,"tag":29,"props":106269,"children":106270},{},[106271],{"type":23,"value":106272},"Shipping integrations are often underestimated.",{"type":17,"tag":29,"props":106274,"children":106275},{},[106276],{"type":23,"value":106277},"Most tools solve execution—labels, rates, tracking.",{"type":17,"tag":29,"props":106279,"children":106280},{},[106281],{"type":23,"value":106282},"Fewer solve integration—normalizing data, handling provider variability, and connecting shipping to the rest of your product.",{"type":17,"tag":29,"props":106284,"children":106285},{},[106286],{"type":23,"value":106287},"That difference shows up quickly in production.",{"type":17,"tag":29,"props":106289,"children":106290},{},[106291],{"type":17,"tag":48,"props":106292,"children":106293},{},[106294],{"type":23,"value":106295},"The best unified API for shipping is the one that gives you consistent, real-time logistics state and fits cleanly into your broader architecture.",{"type":17,"tag":29,"props":106297,"children":106298},{},[106299],{"type":17,"tag":133,"props":106300,"children":106302},{"href":1612,"rel":106301},[214],[106303],{"type":23,"value":44481},{"type":17,"tag":29,"props":106305,"children":106306},{},[106307],{"type":17,"tag":133,"props":106308,"children":106310},{"href":1623,"rel":106309},[214],[106311],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":106313},[106314,106315,106320,106328,106335,106336,106343,106344,106350,106351],{"id":104805,"depth":1629,"text":104808},{"id":104917,"depth":1629,"text":104920,"children":106316},[106317,106318,106319],{"id":104933,"depth":1635,"text":104936},{"id":104972,"depth":1635,"text":104975},{"id":105040,"depth":1635,"text":105043},{"id":105090,"depth":1629,"text":105093,"children":106321},[106322,106323,106324,106325,106326,106327],{"id":105101,"depth":1635,"text":105104},{"id":105169,"depth":1635,"text":105172},{"id":101528,"depth":1635,"text":101531},{"id":105285,"depth":1635,"text":105288},{"id":105319,"depth":1635,"text":105322},{"id":105358,"depth":1635,"text":105361},{"id":105414,"depth":1629,"text":105417,"children":106329},[106330,106331,106332,106333,106334],{"id":105425,"depth":1635,"text":87523},{"id":105520,"depth":1635,"text":35431},{"id":105552,"depth":1635,"text":34433},{"id":105584,"depth":1635,"text":104995},{"id":105616,"depth":1635,"text":35436},{"id":105643,"depth":1629,"text":105646},{"id":105700,"depth":1629,"text":105703,"children":106337},[106338,106339,106340,106341,106342],{"id":13402,"depth":1635,"text":13405},{"id":90302,"depth":1635,"text":43670},{"id":105784,"depth":1635,"text":105787},{"id":105822,"depth":1635,"text":105825},{"id":105864,"depth":1635,"text":105867},{"id":105898,"depth":1629,"text":105901},{"id":105964,"depth":1629,"text":105967,"children":106345},[106346,106347,106348,106349],{"id":106007,"depth":1635,"text":106010},{"id":106056,"depth":1635,"text":106059},{"id":106101,"depth":1635,"text":106104},{"id":106147,"depth":1635,"text":106150},{"id":102449,"depth":1629,"text":102452},{"id":1552,"depth":1629,"text":1555},"content:blog:what_unified_api_is_best_for_shipping_and_logistics_integrations_for_e_commerce_platforms_in_2026.md","blog/what_unified_api_is_best_for_shipping_and_logistics_integrations_for_e_commerce_platforms_in_2026.md","blog/what_unified_api_is_best_for_shipping_and_logistics_integrations_for_e_commerce_platforms_in_2026",{"_path":106356,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":106357,"description":106358,"img":106359,"date":106360,"tag":6341,"body":106361,"_type":1677,"_id":106763,"_source":1679,"_file":106764,"_stem":106765,"_extension":1682},"/blog/how_to_register_your_metaads_oauth2_application","How to Register your MetaAds OAuth2 application","Go to https,//developers.facebook.com/apps/creation/...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-icon.png","2026-03-04T16:22:00.000Z",{"type":14,"children":106362,"toc":106761},[106363,106368,106371,106379,106601,106609,106654,106662,106756],{"type":17,"tag":18,"props":106364,"children":106366},{"id":106365},"how-to-register-your-metaads-oauth2-application",[106367],{"type":23,"value":106357},{"type":17,"tag":25,"props":106369,"children":106370},{},[],{"type":17,"tag":29,"props":106372,"children":106373},{},[106374],{"type":17,"tag":33,"props":106375,"children":106376},{},[106377],{"type":23,"value":106378},"March 4, 2026",{"type":17,"tag":6154,"props":106380,"children":106381},{},[106382,106400],{"type":17,"tag":84,"props":106383,"children":106384},{},[106385,106387],{"type":23,"value":106386},"Create a Meta Developer account",{"type":17,"tag":80,"props":106388,"children":106389},{},[106390],{"type":17,"tag":84,"props":106391,"children":106392},{},[106393,106394],{"type":23,"value":6661},{"type":17,"tag":133,"props":106395,"children":106398},{"href":106396,"rel":106397},"https://developers.facebook.com/",[214],[106399],{"type":23,"value":106396},{"type":17,"tag":84,"props":106401,"children":106402},{},[106403,106405,106484,106487,106492,106588,106591,106593,106596],{"type":23,"value":106404},"Create an application",{"type":17,"tag":80,"props":106406,"children":106407},{},[106408,106426,106464],{"type":17,"tag":84,"props":106409,"children":106410},{},[106411,106412,106418,106421],{"type":23,"value":6661},{"type":17,"tag":133,"props":106413,"children":106416},{"href":106414,"rel":106415},"https://developers.facebook.com/apps/creation/",[214],[106417],{"type":23,"value":106414},{"type":17,"tag":3891,"props":106419,"children":106420},{},[],{"type":17,"tag":6438,"props":106422,"children":106425},{"alt":106423,"src":106424},"03cc19ca-b1b5-43fa-b858-37a6aeb9ab77.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-0.png",[],{"type":17,"tag":84,"props":106427,"children":106428},{},[106429,106431,106449,106452,106456,106459],{"type":23,"value":106430},"Enter the following details:",{"type":17,"tag":80,"props":106432,"children":106433},{},[106434,106441],{"type":17,"tag":84,"props":106435,"children":106436},{},[106437],{"type":17,"tag":48,"props":106438,"children":106439},{},[106440],{"type":23,"value":42236},{"type":17,"tag":84,"props":106442,"children":106443},{},[106444],{"type":17,"tag":48,"props":106445,"children":106446},{},[106447],{"type":23,"value":106448},"App Contact Email",{"type":17,"tag":3891,"props":106450,"children":106451},{},[],{"type":17,"tag":6438,"props":106453,"children":106455},{"alt":6440,"src":106454},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-1.png",[],{"type":17,"tag":3891,"props":106457,"children":106458},{},[],{"type":17,"tag":6438,"props":106460,"children":106463},{"alt":106461,"src":106462},"Screenshot_2026-03-05_at_09.37.16.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-2.png",[],{"type":17,"tag":84,"props":106465,"children":106466},{},[106467,106469,106475,106477,106480],{"type":23,"value":106468},"Add the following use-cases; 'Manage ads using ",{"type":17,"tag":133,"props":106470,"children":106472},{"href":106471},"/martech",[106473],{"type":23,"value":106474},"Marketing API",{"type":23,"value":106476},"' and 'Measure ad performance'",{"type":17,"tag":3891,"props":106478,"children":106479},{},[],{"type":17,"tag":6438,"props":106481,"children":106483},{"alt":6440,"src":106482},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-3.png",[],{"type":17,"tag":3891,"props":106485,"children":106486},{},[],{"type":17,"tag":48,"props":106488,"children":106489},{},[106490],{"type":23,"value":106491},"3. Configure Permissions for the Marketing API",{"type":17,"tag":80,"props":106493,"children":106494},{},[106495,106507,106512,106543,106570],{"type":17,"tag":84,"props":106496,"children":106497},{},[106498,106500,106503],{"type":23,"value":106499},"Enable all permissions in the 'Create & Manage Ads' and 'Measure ad performance' use-cases",{"type":17,"tag":3891,"props":106501,"children":106502},{},[],{"type":17,"tag":6438,"props":106504,"children":106506},{"alt":6440,"src":106505},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-4.png",[],{"type":17,"tag":84,"props":106508,"children":106509},{},[106510],{"type":23,"value":106511},"or -",{"type":17,"tag":84,"props":106513,"children":106514},{},[106515,106517,106535,106538],{"type":23,"value":106516},"After the application is created:",{"type":17,"tag":80,"props":106518,"children":106519},{},[106520,106530],{"type":17,"tag":84,"props":106521,"children":106522},{},[106523,106525,106529],{"type":23,"value":106524},"Open the ",{"type":17,"tag":48,"props":106526,"children":106527},{},[106528],{"type":23,"value":42720},{"type":23,"value":54},{"type":17,"tag":84,"props":106531,"children":106532},{},[106533],{"type":23,"value":106534},"Navigate to:\nUse Cases → Customize → Create & Manage Ads",{"type":17,"tag":3891,"props":106536,"children":106537},{},[],{"type":17,"tag":6438,"props":106539,"children":106542},{"alt":106540,"src":106541},"Screenshot_2026-03-05_at_09.42.12.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-5.png",[],{"type":17,"tag":84,"props":106544,"children":106545},{},[106546,106548],{"type":23,"value":106547},"Enable the following permissions:",{"type":17,"tag":80,"props":106549,"children":106550},{},[106551,106556,106561,106566],{"type":17,"tag":84,"props":106552,"children":106553},{},[106554],{"type":23,"value":106555},"ads_management",{"type":17,"tag":84,"props":106557,"children":106558},{},[106559],{"type":23,"value":106560},"ads_read",{"type":17,"tag":84,"props":106562,"children":106563},{},[106564],{"type":23,"value":106565},"business_management",{"type":17,"tag":84,"props":106567,"children":106568},{},[106569],{"type":23,"value":62666},{"type":17,"tag":84,"props":106571,"children":106572},{},[106573,106575],{"type":23,"value":106574},"Additional permissions such as:",{"type":17,"tag":80,"props":106576,"children":106577},{},[106578,106583],{"type":17,"tag":84,"props":106579,"children":106580},{},[106581],{"type":23,"value":106582},"pages_manage_ads",{"type":17,"tag":84,"props":106584,"children":106585},{},[106586],{"type":23,"value":106587},"pages_read_engagement",{"type":17,"tag":3891,"props":106589,"children":106590},{},[],{"type":23,"value":106592},"This may also be enabled depending on your integration requirements.",{"type":17,"tag":3891,"props":106594,"children":106595},{},[],{"type":17,"tag":6438,"props":106597,"children":106600},{"alt":106598,"src":106599},"Screenshot_2026-03-05_at_09.44.57.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-6.png",[],{"type":17,"tag":29,"props":106602,"children":106603},{},[106604],{"type":17,"tag":48,"props":106605,"children":106606},{},[106607],{"type":23,"value":106608},"4. Configure Facebook Login for Business",{"type":17,"tag":80,"props":106610,"children":106611},{},[106612,106625,106644],{"type":17,"tag":84,"props":106613,"children":106614},{},[106615,106617,106620],{"type":23,"value":106616},"In the left sidebar, open (1, 2):\nFacebook Login for Business → Settings",{"type":17,"tag":3891,"props":106618,"children":106619},{},[],{"type":17,"tag":6438,"props":106621,"children":106624},{"alt":106622,"src":106623},"Screenshot_2026-03-05_at_09.49.45.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-7.png",[],{"type":17,"tag":84,"props":106626,"children":106627},{},[106628,106630,106635,106637,106640],{"type":23,"value":106629},"Specify the ",{"type":17,"tag":133,"props":106631,"children":106633},{"href":42620,"rel":106632},[214],[106634],{"type":23,"value":217},{"type":23,"value":106636}," OAuth2 redirect URLs (3)",{"type":17,"tag":3891,"props":106638,"children":106639},{},[],{"type":17,"tag":6438,"props":106641,"children":106643},{"alt":6440,"src":106642},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-8.png",[],{"type":17,"tag":84,"props":106645,"children":106646},{},[106647,106648,106653],{"type":23,"value":42086},{"type":17,"tag":48,"props":106649,"children":106650},{},[106651],{"type":23,"value":106652},"Save Changes (4)",{"type":23,"value":54},{"type":17,"tag":29,"props":106655,"children":106656},{},[106657],{"type":17,"tag":48,"props":106658,"children":106659},{},[106660],{"type":23,"value":106661},"5. Configure App Domains",{"type":17,"tag":80,"props":106663,"children":106664},{},[106665,106670,106730],{"type":17,"tag":84,"props":106666,"children":106667},{},[106668],{"type":23,"value":106669},"Go to App Settings → Basic",{"type":17,"tag":84,"props":106671,"children":106672},{},[106673,106675,106680,106682,106688,106695,106702,106709,106716,106723],{"type":23,"value":106674},"Add the following ",{"type":17,"tag":48,"props":106676,"children":106677},{},[106678],{"type":23,"value":106679},"App Domains",{"type":23,"value":106681},"(3):\n",{"type":17,"tag":133,"props":106683,"children":106685},{"href":42620,"rel":106684},[214],[106686],{"type":23,"value":106687},"unified.to",{"type":17,"tag":133,"props":106689,"children":106692},{"href":106690,"rel":106691},"http://api.unified.to/",[214],[106693],{"type":23,"value":106694},"api.unified.to",{"type":17,"tag":133,"props":106696,"children":106699},{"href":106697,"rel":106698},"http://app.unified.to/",[214],[106700],{"type":23,"value":106701},"app.unified.to",{"type":17,"tag":133,"props":106703,"children":106706},{"href":106704,"rel":106705},"http://api-eu.unified.to/",[214],[106707],{"type":23,"value":106708},"api-eu.unified.to",{"type":17,"tag":133,"props":106710,"children":106713},{"href":106711,"rel":106712},"http://app-eu.unified.to/",[214],[106714],{"type":23,"value":106715},"app-eu.unified.to",{"type":17,"tag":133,"props":106717,"children":106720},{"href":106718,"rel":106719},"http://api-au.unified.to/",[214],[106721],{"type":23,"value":106722},"api-au.unified.to",{"type":17,"tag":133,"props":106724,"children":106727},{"href":106725,"rel":106726},"http://app-au.unified.to/",[214],[106728],{"type":23,"value":106729},"app-au.unified.to",{"type":17,"tag":84,"props":106731,"children":106732},{},[106733,106735,106738,106743,106746,106748,106754],{"type":23,"value":106734},"Scroll down and save the settings (4).",{"type":17,"tag":3891,"props":106736,"children":106737},{},[],{"type":17,"tag":6438,"props":106739,"children":106742},{"alt":106740,"src":106741},"Screenshot_2026-03-05_at_10.05.24.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_your_metaads_oauth2_application-9.png",[],{"type":17,"tag":3891,"props":106744,"children":106745},{},[],{"type":23,"value":106747},"In Unified ",{"type":17,"tag":133,"props":106749,"children":106752},{"href":106750,"rel":106751},"https://app.unified.to/integrations/metaads",[214],[106753],{"type":23,"value":106750},{"type":23,"value":106755},", add the application's App ID (as the client ID) and the App secret (as the client secret).  This information can be found in the App settings > Basic page.",{"type":17,"tag":29,"props":106757,"children":106758},{},[106759],{"type":23,"value":106760},"You are now all set to authorize a MetaAds connection",{"title":7,"searchDepth":1629,"depth":1629,"links":106762},[],"content:blog:how_to_register_your_metaads_oauth2_application.md","blog/how_to_register_your_metaads_oauth2_application.md","blog/how_to_register_your_metaads_oauth2_application",{"_path":106767,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":106768,"description":106769,"img":106770,"date":106771,"tag":12,"body":106772,"_type":1677,"_id":108040,"_source":1679,"_file":108041,"_stem":108042,"_extension":1682},"/blog/how_to_build_an_ai_sales_copilot_using_salesforce_gmail_and_slack_data","How to Build an AI Sales Copilot Using Salesforce, Gmail, and Slack Data","Sales teams generate valuable information across many platforms. Pipeline activity lives in CRM systems like Salesforce. Customer conversations happen in Gmail...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_ai_sales_copilot_using_salesforce_gmail_and_slack_data-icon.png","2026-03-04T16:00:00.000Z",{"type":14,"children":106773,"toc":108020},[106774,106779,106782,106789,106794,106799,106804,106809,106815,106820,106825,106850,106855,106898,106903,106926,106932,106937,106945,106950,106958,106963,106970,106975,106983,106988,106996,107001,107007,107017,107104,107109,107113,107118,107122,107211,107215,107290,107295,107351,107356,107362,107372,107417,107422,107426,107436,107440,107466,107470,107478,107483,107489,107494,107500,107508,107513,107519,107527,107532,107544,107549,107555,107571,107576,107584,107589,107597,107602,107610,107615,107623,107628,107635,107640,107648,107652,107659,107664,107672,107677,107682,107686,107691,107702,107720,107725,107734,107739,107752,107763,107768,107774,107779,107783,107788,107796,107814,107822,107843,107859,107864,107869,107873,107878,107886,107890,107921,107929,107933,107948,107953,107957,107962,107967,107971,107994,107999,108004,108012],{"type":17,"tag":18,"props":106775,"children":106777},{"id":106776},"how-to-build-an-ai-sales-copilot-using-salesforce-gmail-and-slack-data",[106778],{"type":23,"value":106768},{"type":17,"tag":25,"props":106780,"children":106781},{},[],{"type":17,"tag":29,"props":106783,"children":106784},{},[106785],{"type":17,"tag":33,"props":106786,"children":106787},{},[106788],{"type":23,"value":106378},{"type":17,"tag":29,"props":106790,"children":106791},{},[106792],{"type":23,"value":106793},"Sales teams generate valuable information across many platforms. Pipeline activity lives in CRM systems like Salesforce. Customer conversations happen in Gmail threads and Slack channels. Important context about deals and accounts is spread across all of them.",{"type":17,"tag":29,"props":106795,"children":106796},{},[106797],{"type":23,"value":106798},"AI sales copilots aim to unify this data so that sales reps can ask questions, get summaries, and receive recommendations without switching tools.",{"type":17,"tag":29,"props":106800,"children":106801},{},[106802],{"type":23,"value":106803},"The challenge is that building a copilot requires retrieving and combining data from multiple systems with different APIs, schemas, and authentication flows.",{"type":17,"tag":29,"props":106805,"children":106806},{},[106807],{"type":23,"value":106808},"Unified simplifies this process by providing normalized APIs across CRM and messaging platforms. Instead of building separate integrations for Salesforce, Gmail, and Slack, developers can retrieve conversations, deal data, and account context through consistent objects and endpoints and use that data to power AI workflows.",{"type":17,"tag":68,"props":106810,"children":106812},{"id":106811},"why-saas-products-are-building-ai-sales-copilots",[106813],{"type":23,"value":106814},"Why SaaS Products Are Building AI Sales Copilots",{"type":17,"tag":29,"props":106816,"children":106817},{},[106818],{"type":23,"value":106819},"AI sales copilots are becoming a core feature in many SaaS products. They help sales teams understand customer activity and take action faster.",{"type":17,"tag":29,"props":106821,"children":106822},{},[106823],{"type":23,"value":106824},"Products building these capabilities include:",{"type":17,"tag":80,"props":106826,"children":106827},{},[106828,106833,106837,106842,106846],{"type":17,"tag":84,"props":106829,"children":106830},{},[106831],{"type":23,"value":106832},"Sales automation platforms",{"type":17,"tag":84,"props":106834,"children":106835},{},[106836],{"type":23,"value":27776},{"type":17,"tag":84,"props":106838,"children":106839},{},[106840],{"type":23,"value":106841},"CRM productivity extensions",{"type":17,"tag":84,"props":106843,"children":106844},{},[106845],{"type":23,"value":24382},{"type":17,"tag":84,"props":106847,"children":106848},{},[106849],{"type":23,"value":25587},{"type":17,"tag":29,"props":106851,"children":106852},{},[106853],{"type":23,"value":106854},"These products rely on combining several types of data:",{"type":17,"tag":80,"props":106856,"children":106857},{},[106858,106868,106878,106888],{"type":17,"tag":84,"props":106859,"children":106860},{},[106861,106866],{"type":17,"tag":48,"props":106862,"children":106863},{},[106864],{"type":23,"value":106865},"CRM pipeline data",{"type":23,"value":106867}," such as deals, stages, and owners",{"type":17,"tag":84,"props":106869,"children":106870},{},[106871,106876],{"type":17,"tag":48,"props":106872,"children":106873},{},[106874],{"type":23,"value":106875},"Email conversations",{"type":23,"value":106877}," between sales teams and prospects",{"type":17,"tag":84,"props":106879,"children":106880},{},[106881,106886],{"type":17,"tag":48,"props":106882,"children":106883},{},[106884],{"type":23,"value":106885},"Internal messaging discussions",{"type":23,"value":106887}," in platforms like Slack",{"type":17,"tag":84,"props":106889,"children":106890},{},[106891,106896],{"type":17,"tag":48,"props":106892,"children":106893},{},[106894],{"type":23,"value":106895},"Customer interaction history",{"type":23,"value":106897}," including meetings, calls, and notes",{"type":17,"tag":29,"props":106899,"children":106900},{},[106901],{"type":23,"value":106902},"When these data sources are connected, an AI assistant can answer questions like:",{"type":17,"tag":80,"props":106904,"children":106905},{},[106906,106911,106916,106921],{"type":17,"tag":84,"props":106907,"children":106908},{},[106909],{"type":23,"value":106910},"'What's the latest activity on this deal?'",{"type":17,"tag":84,"props":106912,"children":106913},{},[106914],{"type":23,"value":106915},"'Summarize the last email thread with this prospect.'",{"type":17,"tag":84,"props":106917,"children":106918},{},[106919],{"type":23,"value":106920},"'Which deals are at risk this quarter?'",{"type":17,"tag":84,"props":106922,"children":106923},{},[106924],{"type":23,"value":106925},"'What should I do next for this account?'",{"type":17,"tag":68,"props":106927,"children":106929},{"id":106928},"common-ai-sales-copilot-use-cases",[106930],{"type":23,"value":106931},"Common AI Sales Copilot Use Cases",{"type":17,"tag":29,"props":106933,"children":106934},{},[106935],{"type":23,"value":106936},"AI copilots support a range of sales workflows.",{"type":17,"tag":29,"props":106938,"children":106939},{},[106940],{"type":17,"tag":48,"props":106941,"children":106942},{},[106943],{"type":23,"value":106944},"Deal summaries",{"type":17,"tag":29,"props":106946,"children":106947},{},[106948],{"type":23,"value":106949},"Automatically summarize opportunity history including emails, Slack conversations, and CRM activity.",{"type":17,"tag":29,"props":106951,"children":106952},{},[106953],{"type":17,"tag":48,"props":106954,"children":106955},{},[106956],{"type":23,"value":106957},"Conversation insights",{"type":17,"tag":29,"props":106959,"children":106960},{},[106961],{"type":23,"value":106962},"Analyze email and Slack messages to identify customer sentiment or risk signals.",{"type":17,"tag":29,"props":106964,"children":106965},{},[106966],{"type":17,"tag":48,"props":106967,"children":106968},{},[106969],{"type":23,"value":76449},{"type":17,"tag":29,"props":106971,"children":106972},{},[106973],{"type":23,"value":106974},"Suggest actions based on pipeline stage, recent activity, and communication patterns.",{"type":17,"tag":29,"props":106976,"children":106977},{},[106978],{"type":17,"tag":48,"props":106979,"children":106980},{},[106981],{"type":23,"value":106982},"Customer conversation search",{"type":17,"tag":29,"props":106984,"children":106985},{},[106986],{"type":23,"value":106987},"Allow sales teams to query historical conversations across Gmail and Slack.",{"type":17,"tag":29,"props":106989,"children":106990},{},[106991],{"type":17,"tag":48,"props":106992,"children":106993},{},[106994],{"type":23,"value":106995},"Pipeline insights",{"type":17,"tag":29,"props":106997,"children":106998},{},[106999],{"type":23,"value":107000},"Identify stalled deals or accounts that need follow-up.",{"type":17,"tag":68,"props":107002,"children":107004},{"id":107003},"unified-categories-used-for-an-ai-sales-copilot",[107005],{"type":23,"value":107006},"Unified Categories Used for an AI Sales Copilot",{"type":17,"tag":29,"props":107008,"children":107009},{},[107010,107012,107016],{"type":23,"value":107011},"An AI sales copilot typically retrieves data from three ",{"type":17,"tag":133,"props":107013,"children":107014},{"href":7691},[107015],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":107018,"children":107019},{},[107020,107038],{"type":17,"tag":7235,"props":107021,"children":107022},{},[107023],{"type":17,"tag":7239,"props":107024,"children":107025},{},[107026,107030,107034],{"type":17,"tag":7243,"props":107027,"children":107028},{},[107029],{"type":23,"value":7247},{"type":17,"tag":7243,"props":107031,"children":107032},{},[107033],{"type":23,"value":24525},{"type":17,"tag":7243,"props":107035,"children":107036},{},[107037],{"type":23,"value":24530},{"type":17,"tag":7259,"props":107039,"children":107040},{},[107041,107062,107083],{"type":17,"tag":7239,"props":107042,"children":107043},{},[107044,107053,107058],{"type":17,"tag":7266,"props":107045,"children":107046},{},[107047],{"type":17,"tag":133,"props":107048,"children":107051},{"href":107049,"rel":107050},"https://docs.unified.to/crm/overview",[214],[107052],{"type":23,"value":25731},{"type":17,"tag":7266,"props":107054,"children":107055},{},[107056],{"type":23,"value":107057},"Sales pipeline and account data from platforms like Salesforce",{"type":17,"tag":7266,"props":107059,"children":107060},{},[107061],{"type":23,"value":25741},{"type":17,"tag":7239,"props":107063,"children":107064},{},[107065,107074,107079],{"type":17,"tag":7266,"props":107066,"children":107067},{},[107068],{"type":17,"tag":133,"props":107069,"children":107072},{"href":107070,"rel":107071},"https://docs.unified.to/messaging/overview",[214],[107073],{"type":23,"value":24559},{"type":17,"tag":7266,"props":107075,"children":107076},{},[107077],{"type":23,"value":107078},"Communication data from Gmail, Slack, and other messaging systems",{"type":17,"tag":7266,"props":107080,"children":107081},{},[107082],{"type":23,"value":24569},{"type":17,"tag":7239,"props":107084,"children":107085},{},[107086,107095,107100],{"type":17,"tag":7266,"props":107087,"children":107088},{},[107089],{"type":17,"tag":133,"props":107090,"children":107093},{"href":107091,"rel":107092},"https://docs.unified.to/genai/overview",[214],[107094],{"type":23,"value":24595},{"type":17,"tag":7266,"props":107096,"children":107097},{},[107098],{"type":23,"value":107099},"Objects used to generate AI responses across LLM providers",{"type":17,"tag":7266,"props":107101,"children":107102},{},[107103],{"type":23,"value":24605},{"type":17,"tag":29,"props":107105,"children":107106},{},[107107],{"type":23,"value":107108},"Using these normalized APIs allows developers to retrieve sales context from multiple systems without writing vendor-specific integrations.",{"type":17,"tag":68,"props":107110,"children":107111},{"id":24613},[107112],{"type":23,"value":24616},{"type":17,"tag":29,"props":107114,"children":107115},{},[107116],{"type":23,"value":107117},"Unified standardizes the objects required for building AI assistants.",{"type":17,"tag":239,"props":107119,"children":107120},{"id":25770},[107121],{"type":23,"value":25773},{"type":17,"tag":7231,"props":107123,"children":107124},{},[107125,107143],{"type":17,"tag":7235,"props":107126,"children":107127},{},[107128],{"type":17,"tag":7239,"props":107129,"children":107130},{},[107131,107135,107139],{"type":17,"tag":7243,"props":107132,"children":107133},{},[107134],{"type":23,"value":18594},{"type":17,"tag":7243,"props":107136,"children":107137},{},[107138],{"type":23,"value":22096},{"type":17,"tag":7243,"props":107140,"children":107141},{},[107142],{"type":23,"value":20787},{"type":17,"tag":7259,"props":107144,"children":107145},{},[107146,107162,107179,107195],{"type":17,"tag":7239,"props":107147,"children":107148},{},[107149,107153,107157],{"type":17,"tag":7266,"props":107150,"children":107151},{},[107152],{"type":23,"value":25828},{"type":17,"tag":7266,"props":107154,"children":107155},{},[107156],{"type":23,"value":27013},{"type":17,"tag":7266,"props":107158,"children":107159},{},[107160],{"type":23,"value":107161},"Customer profile information",{"type":17,"tag":7239,"props":107163,"children":107164},{},[107165,107169,107174],{"type":17,"tag":7266,"props":107166,"children":107167},{},[107168],{"type":23,"value":25846},{"type":17,"tag":7266,"props":107170,"children":107171},{},[107172],{"type":23,"value":107173},"name, domains, industry",{"type":17,"tag":7266,"props":107175,"children":107176},{},[107177],{"type":23,"value":107178},"Account-level context",{"type":17,"tag":7239,"props":107180,"children":107181},{},[107182,107186,107190],{"type":17,"tag":7266,"props":107183,"children":107184},{},[107185],{"type":23,"value":25810},{"type":17,"tag":7266,"props":107187,"children":107188},{},[107189],{"type":23,"value":26979},{"type":17,"tag":7266,"props":107191,"children":107192},{},[107193],{"type":23,"value":107194},"Pipeline and opportunity data",{"type":17,"tag":7239,"props":107196,"children":107197},{},[107198,107202,107206],{"type":17,"tag":7266,"props":107199,"children":107200},{},[107201],{"type":23,"value":14528},{"type":17,"tag":7266,"props":107203,"children":107204},{},[107205],{"type":23,"value":28074},{"type":17,"tag":7266,"props":107207,"children":107208},{},[107209],{"type":23,"value":107210},"Sales activity such as calls or meetings",{"type":17,"tag":239,"props":107212,"children":107213},{"id":24756},[107214],{"type":23,"value":24759},{"type":17,"tag":7231,"props":107216,"children":107217},{},[107218,107236],{"type":17,"tag":7235,"props":107219,"children":107220},{},[107221],{"type":17,"tag":7239,"props":107222,"children":107223},{},[107224,107228,107232],{"type":17,"tag":7243,"props":107225,"children":107226},{},[107227],{"type":23,"value":18594},{"type":17,"tag":7243,"props":107229,"children":107230},{},[107231],{"type":23,"value":22096},{"type":17,"tag":7243,"props":107233,"children":107234},{},[107235],{"type":23,"value":20787},{"type":17,"tag":7259,"props":107237,"children":107238},{},[107239,107256,107272],{"type":17,"tag":7239,"props":107240,"children":107241},{},[107242,107246,107251],{"type":17,"tag":7266,"props":107243,"children":107244},{},[107245],{"type":23,"value":15800},{"type":17,"tag":7266,"props":107247,"children":107248},{},[107249],{"type":23,"value":107250},"message, subject, created_at, author_member",{"type":17,"tag":7266,"props":107252,"children":107253},{},[107254],{"type":23,"value":107255},"Email or chat content",{"type":17,"tag":7239,"props":107257,"children":107258},{},[107259,107263,107267],{"type":17,"tag":7266,"props":107260,"children":107261},{},[107262],{"type":23,"value":15787},{"type":17,"tag":7266,"props":107264,"children":107265},{},[107266],{"type":23,"value":24817},{"type":17,"tag":7266,"props":107268,"children":107269},{},[107270],{"type":23,"value":107271},"Context for Slack or messaging conversations",{"type":17,"tag":7239,"props":107273,"children":107274},{},[107275,107280,107285],{"type":17,"tag":7266,"props":107276,"children":107277},{},[107278],{"type":23,"value":107279},"Thread",{"type":17,"tag":7266,"props":107281,"children":107282},{},[107283],{"type":23,"value":107284},"parent_id, message_thread_identifier",{"type":17,"tag":7266,"props":107286,"children":107287},{},[107288],{"type":23,"value":107289},"Conversation history across replies",{"type":17,"tag":29,"props":107291,"children":107292},{},[107293],{"type":23,"value":107294},"Messaging records also contain:",{"type":17,"tag":80,"props":107296,"children":107297},{},[107298,107309,107325,107342,107346],{"type":17,"tag":84,"props":107299,"children":107300},{},[107301,107303,107308],{"type":23,"value":107302},"sender information (",{"type":17,"tag":6121,"props":107304,"children":107306},{"className":107305},[],[107307],{"type":23,"value":24841},{"type":23,"value":12034},{"type":17,"tag":84,"props":107310,"children":107311},{},[107312,107313,107318,107319,107324],{"type":23,"value":24847},{"type":17,"tag":6121,"props":107314,"children":107316},{"className":107315},[],[107317],{"type":23,"value":24853},{"type":23,"value":11826},{"type":17,"tag":6121,"props":107320,"children":107322},{"className":107321},[],[107323],{"type":23,"value":24860},{"type":23,"value":12034},{"type":17,"tag":84,"props":107326,"children":107327},{},[107328,107330,107335,107336,107341],{"type":23,"value":107329},"message bodies (",{"type":17,"tag":6121,"props":107331,"children":107333},{"className":107332},[],[107334],{"type":23,"value":24872},{"type":23,"value":11826},{"type":17,"tag":6121,"props":107337,"children":107339},{"className":107338},[],[107340],{"type":23,"value":76790},{"type":23,"value":12034},{"type":17,"tag":84,"props":107343,"children":107344},{},[107345],{"type":23,"value":73184},{"type":17,"tag":84,"props":107347,"children":107348},{},[107349],{"type":23,"value":107350},"timestamps for conversation timelines",{"type":17,"tag":29,"props":107352,"children":107353},{},[107354],{"type":23,"value":107355},"These fields provide the context that AI models use to understand customer conversations.",{"type":17,"tag":239,"props":107357,"children":107359},{"id":107358},"genai-objects",[107360],{"type":23,"value":107361},"GenAI Objects",{"type":17,"tag":29,"props":107363,"children":107364},{},[107365,107366,107370],{"type":23,"value":25244},{"type":17,"tag":133,"props":107367,"children":107368},{"href":16186},[107369],{"type":23,"value":25249},{"type":23,"value":107371}," normalizes LLM interactions across providers.",{"type":17,"tag":7231,"props":107373,"children":107374},{},[107375,107389],{"type":17,"tag":7235,"props":107376,"children":107377},{},[107378],{"type":17,"tag":7239,"props":107379,"children":107380},{},[107381,107385],{"type":17,"tag":7243,"props":107382,"children":107383},{},[107384],{"type":23,"value":18594},{"type":17,"tag":7243,"props":107386,"children":107387},{},[107388],{"type":23,"value":20787},{"type":17,"tag":7259,"props":107390,"children":107391},{},[107392,107404],{"type":17,"tag":7239,"props":107393,"children":107394},{},[107395,107399],{"type":17,"tag":7266,"props":107396,"children":107397},{},[107398],{"type":23,"value":74651},{"type":17,"tag":7266,"props":107400,"children":107401},{},[107402],{"type":23,"value":107403},"Sends prompts to a language model and returns responses",{"type":17,"tag":7239,"props":107405,"children":107406},{},[107407,107412],{"type":17,"tag":7266,"props":107408,"children":107409},{},[107410],{"type":23,"value":107411},"genai_model",{"type":17,"tag":7266,"props":107413,"children":107414},{},[107415],{"type":23,"value":107416},"Describes available AI models and their capabilities",{"type":17,"tag":29,"props":107418,"children":107419},{},[107420],{"type":23,"value":107421},"These objects allow applications to generate AI responses without changing code for each provider.",{"type":17,"tag":68,"props":107423,"children":107424},{"id":73265},[107425],{"type":23,"value":73268},{"type":17,"tag":29,"props":107427,"children":107428},{},[107429,107431,107435],{"type":23,"value":107430},"Customers connect their CRM and messaging platforms using ",{"type":17,"tag":48,"props":107432,"children":107433},{},[107434],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":107437,"children":107438},{},[107439],{"type":23,"value":26189},{"type":17,"tag":6154,"props":107441,"children":107442},{},[107443,107447,107452,107457],{"type":17,"tag":84,"props":107444,"children":107445},{},[107446],{"type":23,"value":75678},{"type":17,"tag":84,"props":107448,"children":107449},{},[107450],{"type":23,"value":107451},"The user selects integrations such as Salesforce, Gmail, or Slack.",{"type":17,"tag":84,"props":107453,"children":107454},{},[107455],{"type":23,"value":107456},"The user authorizes access to their account.",{"type":17,"tag":84,"props":107458,"children":107459},{},[107460,107461,107465],{"type":23,"value":73306},{"type":17,"tag":48,"props":107462,"children":107463},{},[107464],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":107467,"children":107468},{},[107469],{"type":23,"value":73316},{"type":17,"tag":6893,"props":107471,"children":107473},{"className":107472,"code":25047,"language":20901,"meta":23},[20899],[107474],{"type":17,"tag":6121,"props":107475,"children":107476},{"__ignoreMap":7},[107477],{"type":23,"value":25047},{"type":17,"tag":29,"props":107479,"children":107480},{},[107481],{"type":23,"value":107482},"All Unified API requests use this identifier to retrieve data from the authorized integration.",{"type":17,"tag":68,"props":107484,"children":107486},{"id":107485},"retrieving-crm-and-messaging-data",[107487],{"type":23,"value":107488},"Retrieving CRM and Messaging Data",{"type":17,"tag":29,"props":107490,"children":107491},{},[107492],{"type":23,"value":107493},"AI copilots retrieve context from CRM and messaging endpoints.",{"type":17,"tag":239,"props":107495,"children":107497},{"id":107496},"crm-endpoints",[107498],{"type":23,"value":107499},"CRM endpoints",{"type":17,"tag":6893,"props":107501,"children":107503},{"className":107502,"code":28336,"language":20901,"meta":23},[20899],[107504],{"type":17,"tag":6121,"props":107505,"children":107506},{"__ignoreMap":7},[107507],{"type":23,"value":28336},{"type":17,"tag":29,"props":107509,"children":107510},{},[107511],{"type":23,"value":107512},"These endpoints provide pipeline information, account data, and sales activity.",{"type":17,"tag":239,"props":107514,"children":107516},{"id":107515},"messaging-endpoints",[107517],{"type":23,"value":107518},"Messaging endpoints",{"type":17,"tag":6893,"props":107520,"children":107522},{"className":107521,"code":25091,"language":20901,"meta":23},[20899],[107523],{"type":17,"tag":6121,"props":107524,"children":107525},{"__ignoreMap":7},[107526],{"type":23,"value":25091},{"type":17,"tag":29,"props":107528,"children":107529},{},[107530],{"type":23,"value":107531},"Messages include the full conversation body, sender information, recipients, timestamps, and thread relationships.",{"type":17,"tag":29,"props":107533,"children":107534},{},[107535,107537,107542],{"type":23,"value":107536},"Threads can be retrieved by filtering messages using the ",{"type":17,"tag":6121,"props":107538,"children":107540},{"className":107539},[],[107541],{"type":23,"value":15863},{"type":23,"value":107543}," parameter and expanding descendants.",{"type":17,"tag":29,"props":107545,"children":107546},{},[107547],{"type":23,"value":107548},"This allows an AI assistant to retrieve full email or Slack conversation history.",{"type":17,"tag":68,"props":107550,"children":107552},{"id":107551},"building-a-rag-pipeline-for-sales-context",[107553],{"type":23,"value":107554},"Building a RAG Pipeline for Sales Context",{"type":17,"tag":29,"props":107556,"children":107557},{},[107558,107560,107569],{"type":23,"value":107559},"Most AI copilots rely on ",{"type":17,"tag":48,"props":107561,"children":107562},{},[107563,107567],{"type":17,"tag":133,"props":107564,"children":107565},{"href":5201},[107566],{"type":23,"value":77024},{"type":23,"value":107568}," (RAG)",{"type":23,"value":107570}," to provide accurate answers.",{"type":17,"tag":29,"props":107572,"children":107573},{},[107574],{"type":23,"value":107575},"A typical architecture follows these steps.",{"type":17,"tag":29,"props":107577,"children":107578},{},[107579],{"type":17,"tag":48,"props":107580,"children":107581},{},[107582],{"type":23,"value":107583},"1. Connect integrations",{"type":17,"tag":29,"props":107585,"children":107586},{},[107587],{"type":23,"value":107588},"Customers authorize CRM and messaging systems through Unified Connect.",{"type":17,"tag":29,"props":107590,"children":107591},{},[107592],{"type":17,"tag":48,"props":107593,"children":107594},{},[107595],{"type":23,"value":107596},"2. Subscribe to webhooks",{"type":17,"tag":29,"props":107598,"children":107599},{},[107600],{"type":23,"value":107601},"Register webhook subscriptions for objects such as messages, deals, and contacts.",{"type":17,"tag":29,"props":107603,"children":107604},{},[107605],{"type":17,"tag":48,"props":107606,"children":107607},{},[107608],{"type":23,"value":107609},"3. Retrieve updated records",{"type":17,"tag":29,"props":107611,"children":107612},{},[107613],{"type":23,"value":107614},"When a webhook fires, retrieve the latest object from the Unified API.",{"type":17,"tag":29,"props":107616,"children":107617},{},[107618],{"type":17,"tag":48,"props":107619,"children":107620},{},[107621],{"type":23,"value":107622},"4. Chunk conversation content",{"type":17,"tag":29,"props":107624,"children":107625},{},[107626],{"type":23,"value":107627},"Split long email threads or Slack conversations into smaller segments.",{"type":17,"tag":29,"props":107629,"children":107630},{},[107631],{"type":17,"tag":48,"props":107632,"children":107633},{},[107634],{"type":23,"value":73402},{"type":17,"tag":29,"props":107636,"children":107637},{},[107638],{"type":23,"value":107639},"Use an embedding model to convert text into vector representations.",{"type":17,"tag":29,"props":107641,"children":107642},{},[107643],{"type":17,"tag":48,"props":107644,"children":107645},{},[107646],{"type":23,"value":107647},"6. Store vectors in a database",{"type":17,"tag":29,"props":107649,"children":107650},{},[107651],{"type":23,"value":73418},{"type":17,"tag":29,"props":107653,"children":107654},{},[107655],{"type":17,"tag":48,"props":107656,"children":107657},{},[107658],{"type":23,"value":73424},{"type":17,"tag":29,"props":107660,"children":107661},{},[107662],{"type":23,"value":107663},"When a user asks a question, search the vector database for relevant records.",{"type":17,"tag":29,"props":107665,"children":107666},{},[107667],{"type":17,"tag":48,"props":107668,"children":107669},{},[107670],{"type":23,"value":107671},"8. Generate an AI response",{"type":17,"tag":29,"props":107673,"children":107674},{},[107675],{"type":23,"value":107676},"Send retrieved context to the language model to generate a grounded answer.",{"type":17,"tag":29,"props":107678,"children":107679},{},[107680],{"type":23,"value":107681},"This pipeline allows AI assistants to answer questions using real customer data.",{"type":17,"tag":68,"props":107683,"children":107684},{"id":25236},[107685],{"type":23,"value":25239},{"type":17,"tag":29,"props":107687,"children":107688},{},[107689],{"type":23,"value":107690},"Unified's GenAI API standardizes how applications interact with language models.",{"type":17,"tag":29,"props":107692,"children":107693},{},[107694,107696,107700],{"type":23,"value":107695},"To generate a response, create a ",{"type":17,"tag":48,"props":107697,"children":107698},{},[107699],{"type":23,"value":74651},{"type":23,"value":107701}," object containing:",{"type":17,"tag":80,"props":107703,"children":107704},{},[107705,107710,107715],{"type":17,"tag":84,"props":107706,"children":107707},{},[107708],{"type":23,"value":107709},"a list of messages",{"type":17,"tag":84,"props":107711,"children":107712},{},[107713],{"type":23,"value":107714},"optional model parameters",{"type":17,"tag":84,"props":107716,"children":107717},{},[107718],{"type":23,"value":107719},"generation controls such as temperature or max tokens",{"type":17,"tag":29,"props":107721,"children":107722},{},[107723],{"type":23,"value":107724},"Example request structure:",{"type":17,"tag":6893,"props":107726,"children":107729},{"className":107727,"code":107728,"language":20901,"meta":23},[20899],"{\n  \"messages\": [\n    { \"role\": \"system\", \"content\": \"You are a sales assistant.\" },\n    { \"role\": \"user\", \"content\": \"Summarize recent activity for this deal.\" }\n  ]\n}\n",[107730],{"type":17,"tag":6121,"props":107731,"children":107732},{"__ignoreMap":7},[107733],{"type":23,"value":107728},{"type":17,"tag":29,"props":107735,"children":107736},{},[107737],{"type":23,"value":107738},"The API returns a prompt object containing:",{"type":17,"tag":80,"props":107740,"children":107741},{},[107742,107747],{"type":17,"tag":84,"props":107743,"children":107744},{},[107745],{"type":23,"value":107746},"generated responses",{"type":17,"tag":84,"props":107748,"children":107749},{},[107750],{"type":23,"value":107751},"token usage statistics",{"type":17,"tag":29,"props":107753,"children":107754},{},[107755,107757,107761],{"type":23,"value":107756},"Applications can also retrieve available models using the ",{"type":17,"tag":48,"props":107758,"children":107759},{},[107760],{"type":23,"value":107411},{"type":23,"value":107762}," endpoint, which provides model IDs, token limits, and provider information.",{"type":17,"tag":29,"props":107764,"children":107765},{},[107766],{"type":23,"value":107767},"Unified supports multiple LLM providers, allowing developers to switch models without changing application logic.",{"type":17,"tag":68,"props":107769,"children":107771},{"id":107770},"keeping-the-copilot-updated",[107772],{"type":23,"value":107773},"Keeping the Copilot Updated",{"type":17,"tag":29,"props":107775,"children":107776},{},[107777],{"type":23,"value":107778},"AI assistants require fresh data to remain useful.",{"type":17,"tag":29,"props":107780,"children":107781},{},[107782],{"type":23,"value":73461},{"type":17,"tag":29,"props":107784,"children":107785},{},[107786],{"type":23,"value":107787},"Typical webhook events include:",{"type":17,"tag":29,"props":107789,"children":107790},{},[107791],{"type":17,"tag":48,"props":107792,"children":107793},{},[107794],{"type":23,"value":107795},"CRM events",{"type":17,"tag":80,"props":107797,"children":107798},{},[107799,107804,107809],{"type":17,"tag":84,"props":107800,"children":107801},{},[107802],{"type":23,"value":107803},"contact created / updated / deleted",{"type":17,"tag":84,"props":107805,"children":107806},{},[107807],{"type":23,"value":107808},"deal created / updated / deleted",{"type":17,"tag":84,"props":107810,"children":107811},{},[107812],{"type":23,"value":107813},"pipeline updates",{"type":17,"tag":29,"props":107815,"children":107816},{},[107817],{"type":17,"tag":48,"props":107818,"children":107819},{},[107820],{"type":23,"value":107821},"Messaging events",{"type":17,"tag":80,"props":107823,"children":107824},{},[107825,107829,107833,107838],{"type":17,"tag":84,"props":107826,"children":107827},{},[107828],{"type":23,"value":27554},{"type":17,"tag":84,"props":107830,"children":107831},{},[107832],{"type":23,"value":27559},{"type":17,"tag":84,"props":107834,"children":107835},{},[107836],{"type":23,"value":107837},"channel created or deleted",{"type":17,"tag":84,"props":107839,"children":107840},{},[107841],{"type":23,"value":107842},"interaction events such as reactions or mentions",{"type":17,"tag":29,"props":107844,"children":107845},{},[107846,107848,107853,107854,107858],{"type":23,"value":107847},"Unified supports both ",{"type":17,"tag":48,"props":107849,"children":107850},{},[107851],{"type":23,"value":107852},"native webhooks",{"type":23,"value":34435},{"type":17,"tag":48,"props":107855,"children":107856},{},[107857],{"type":23,"value":46572},{"type":23,"value":54},{"type":17,"tag":29,"props":107860,"children":107861},{},[107862],{"type":23,"value":107863},"Native webhooks deliver immediate push notifications when supported by the provider. Virtual webhooks simulate real-time updates through managed polling when native events are unavailable.",{"type":17,"tag":29,"props":107865,"children":107866},{},[107867],{"type":23,"value":107868},"These events ensure the AI copilot always has access to the latest CRM activity and customer conversations.",{"type":17,"tag":68,"props":107870,"children":107871},{"id":25342},[107872],{"type":23,"value":25345},{"type":17,"tag":29,"props":107874,"children":107875},{},[107876],{"type":23,"value":107877},"Unified provides broad integration coverage across CRM and messaging systems.",{"type":17,"tag":29,"props":107879,"children":107880},{},[107881],{"type":17,"tag":48,"props":107882,"children":107883},{},[107884],{"type":23,"value":107885},"CRM platforms (47+ integrations)",{"type":17,"tag":29,"props":107887,"children":107888},{},[107889],{"type":23,"value":24364},{"type":17,"tag":80,"props":107891,"children":107892},{},[107893,107897,107901,107905,107909,107913,107917],{"type":17,"tag":84,"props":107894,"children":107895},{},[107896],{"type":23,"value":3179},{"type":17,"tag":84,"props":107898,"children":107899},{},[107900],{"type":23,"value":3184},{"type":17,"tag":84,"props":107902,"children":107903},{},[107904],{"type":23,"value":26530},{"type":17,"tag":84,"props":107906,"children":107907},{},[107908],{"type":23,"value":26535},{"type":17,"tag":84,"props":107910,"children":107911},{},[107912],{"type":23,"value":75058},{"type":17,"tag":84,"props":107914,"children":107915},{},[107916],{"type":23,"value":61628},{"type":17,"tag":84,"props":107918,"children":107919},{},[107920],{"type":23,"value":61620},{"type":17,"tag":29,"props":107922,"children":107923},{},[107924],{"type":17,"tag":48,"props":107925,"children":107926},{},[107927],{"type":23,"value":107928},"Messaging platforms",{"type":17,"tag":29,"props":107930,"children":107931},{},[107932],{"type":23,"value":24364},{"type":17,"tag":80,"props":107934,"children":107935},{},[107936,107940,107944],{"type":17,"tag":84,"props":107937,"children":107938},{},[107939],{"type":23,"value":14878},{"type":17,"tag":84,"props":107941,"children":107942},{},[107943],{"type":23,"value":3204},{"type":17,"tag":84,"props":107945,"children":107946},{},[107947],{"type":23,"value":14066},{"type":17,"tag":29,"props":107949,"children":107950},{},[107951],{"type":23,"value":107952},"These integrations allow AI assistants to access sales conversations and pipeline data across many customer environments.",{"type":17,"tag":68,"props":107954,"children":107955},{"id":73613},[107956],{"type":23,"value":73616},{"type":17,"tag":29,"props":107958,"children":107959},{},[107960],{"type":23,"value":107961},"Building an AI sales copilot requires access to multiple sources of customer context.",{"type":17,"tag":29,"props":107963,"children":107964},{},[107965],{"type":23,"value":107966},"Without integration infrastructure, developers must maintain separate integrations for each CRM and messaging platform.",{"type":17,"tag":29,"props":107968,"children":107969},{},[107970],{"type":23,"value":34257},{"type":17,"tag":80,"props":107972,"children":107973},{},[107974,107979,107984,107989],{"type":17,"tag":84,"props":107975,"children":107976},{},[107977],{"type":23,"value":107978},"normalized APIs across CRM and messaging platforms",{"type":17,"tag":84,"props":107980,"children":107981},{},[107982],{"type":23,"value":107983},"real-time data access and webhook events",{"type":17,"tag":84,"props":107985,"children":107986},{},[107987],{"type":23,"value":107988},"consistent authentication flows through Unified Connect",{"type":17,"tag":84,"props":107990,"children":107991},{},[107992],{"type":23,"value":107993},"AI-ready data models for building RAG pipelines",{"type":17,"tag":29,"props":107995,"children":107996},{},[107997],{"type":23,"value":107998},"Instead of managing integration complexity, product teams can focus on building AI capabilities that help sales teams close deals faster.",{"type":17,"tag":29,"props":108000,"children":108001},{},[108002],{"type":23,"value":108003},"Start building AI sales assistants powered by Salesforce, Gmail, Slack, and dozens of other integrations today.",{"type":17,"tag":29,"props":108005,"children":108006},{},[108007],{"type":17,"tag":133,"props":108008,"children":108010},{"href":1612,"rel":108009},[214],[108011],{"type":23,"value":44481},{"type":17,"tag":29,"props":108013,"children":108014},{},[108015],{"type":17,"tag":133,"props":108016,"children":108018},{"href":1623,"rel":108017},[214],[108019],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":108021},[108022,108023,108024,108025,108030,108031,108035,108036,108037,108038,108039],{"id":106811,"depth":1629,"text":106814},{"id":106928,"depth":1629,"text":106931},{"id":107003,"depth":1629,"text":107006},{"id":24613,"depth":1629,"text":24616,"children":108026},[108027,108028,108029],{"id":25770,"depth":1635,"text":25773},{"id":24756,"depth":1635,"text":24759},{"id":107358,"depth":1635,"text":107361},{"id":73265,"depth":1629,"text":73268},{"id":107485,"depth":1629,"text":107488,"children":108032},[108033,108034],{"id":107496,"depth":1635,"text":107499},{"id":107515,"depth":1635,"text":107518},{"id":107551,"depth":1629,"text":107554},{"id":25236,"depth":1629,"text":25239},{"id":107770,"depth":1629,"text":107773},{"id":25342,"depth":1629,"text":25345},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_an_ai_sales_copilot_using_salesforce_gmail_and_slack_data.md","blog/how_to_build_an_ai_sales_copilot_using_salesforce_gmail_and_slack_data.md","blog/how_to_build_an_ai_sales_copilot_using_salesforce_gmail_and_slack_data",{"_path":108044,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":108045,"description":108046,"img":108047,"date":108048,"tag":12,"body":108049,"_type":1677,"_id":109525,"_source":1679,"_file":109526,"_stem":109527,"_extension":1682},"/blog/how_to_build_a_customer_360_dashboard_using_salesforce_hubspot_and_stripe_data_with_a_crm_api","How to Build a Customer 360 Dashboard Using Salesforce, HubSpot, and Stripe Data with a CRM API","RevOps platforms, analytics tools, and AI products increasingly need CRM data and billing data in the same place.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_customer_360_dashboard_using_salesforce_hubspot_and_stripe_data_with_a_crm_api-icon.png","2026-03-04T15:59:00.000Z",{"type":14,"children":108050,"toc":109497},[108051,108056,108059,108066,108077,108082,108100,108105,108110,108115,108127,108133,108138,108166,108171,108193,108199,108204,108213,108219,108224,108232,108237,108245,108250,108257,108262,108269,108274,108292,108298,108308,108397,108402,108408,108413,108556,108561,108567,108572,108578,108583,108588,108611,108616,108629,108635,108640,108645,108667,108671,108687,108693,108698,108702,108725,108729,108742,108748,108753,108757,108780,108784,108792,108798,108803,108808,108826,108831,108837,108849,108854,108859,108864,108896,108901,108918,108923,108929,108939,108944,108948,108977,108982,108990,108995,109001,109006,109010,109014,109022,109027,109077,109082,109088,109097,109102,109154,109159,109165,109170,109175,109227,109247,109252,109280,109285,109291,109296,109302,109314,109354,109360,109371,109398,109404,109415,109435,109439,109444,109448,109471,109476,109481,109489],{"type":17,"tag":18,"props":108052,"children":108054},{"id":108053},"how-to-build-a-customer-360-dashboard-using-salesforce-hubspot-and-stripe-data-with-a-crm-api",[108055],{"type":23,"value":108045},{"type":17,"tag":25,"props":108057,"children":108058},{},[],{"type":17,"tag":29,"props":108060,"children":108061},{},[108062],{"type":17,"tag":33,"props":108063,"children":108064},{},[108065],{"type":23,"value":106378},{"type":17,"tag":29,"props":108067,"children":108068},{},[108069,108071,108076],{"type":23,"value":108070},"RevOps platforms, analytics tools, and AI products increasingly need ",{"type":17,"tag":48,"props":108072,"children":108073},{},[108074],{"type":23,"value":108075},"CRM data and billing data in the same place",{"type":23,"value":54},{"type":17,"tag":29,"props":108078,"children":108079},{},[108080],{"type":23,"value":108081},"A Customer 360 dashboard combines:",{"type":17,"tag":80,"props":108083,"children":108084},{},[108085,108090,108095],{"type":17,"tag":84,"props":108086,"children":108087},{},[108088],{"type":23,"value":108089},"contact and company data from CRMs",{"type":17,"tag":84,"props":108091,"children":108092},{},[108093],{"type":23,"value":108094},"deal and pipeline activity",{"type":17,"tag":84,"props":108096,"children":108097},{},[108098],{"type":23,"value":108099},"invoices, payments, and subscriptions",{"type":17,"tag":29,"props":108101,"children":108102},{},[108103],{"type":23,"value":108104},"This allows products to show a complete view of each customer — from first sales interaction to ongoing revenue.",{"type":17,"tag":29,"props":108106,"children":108107},{},[108108],{"type":23,"value":108109},"The challenge is that this data lives across multiple platforms. A customer's sales activity might exist in Salesforce or HubSpot, while billing and subscriptions are managed in Stripe or an accounting platform.",{"type":17,"tag":29,"props":108111,"children":108112},{},[108113],{"type":23,"value":108114},"Each system exposes different APIs, authentication models, and data schemas. Building and maintaining direct integrations across all of them quickly becomes expensive.",{"type":17,"tag":29,"props":108116,"children":108117},{},[108118,108120,108125],{"type":23,"value":108119},"Unified solves this by providing ",{"type":17,"tag":48,"props":108121,"children":108122},{},[108123],{"type":23,"value":108124},"category-specific APIs that normalize data across platforms in real time",{"type":23,"value":108126},". With the CRM, Payments, and Accounting APIs, your product can retrieve customer, deal, invoice, and subscription data through a consistent interface and combine it into a single dashboard.",{"type":17,"tag":68,"props":108128,"children":108130},{"id":108129},"when-to-build-a-customer-360-dashboard",[108131],{"type":23,"value":108132},"When to Build a Customer 360 Dashboard",{"type":17,"tag":29,"props":108134,"children":108135},{},[108136],{"type":23,"value":108137},"Product teams commonly build Customer 360 views when developing:",{"type":17,"tag":80,"props":108139,"children":108140},{},[108141,108146,108151,108156,108161],{"type":17,"tag":84,"props":108142,"children":108143},{},[108144],{"type":23,"value":108145},"customer analytics platforms",{"type":17,"tag":84,"props":108147,"children":108148},{},[108149],{"type":23,"value":108150},"RevOps and revenue intelligence products",{"type":17,"tag":84,"props":108152,"children":108153},{},[108154],{"type":23,"value":108155},"account health dashboards",{"type":17,"tag":84,"props":108157,"children":108158},{},[108159],{"type":23,"value":108160},"AI sales copilots",{"type":17,"tag":84,"props":108162,"children":108163},{},[108164],{"type":23,"value":108165},"customer success tools",{"type":17,"tag":29,"props":108167,"children":108168},{},[108169],{"type":23,"value":108170},"These products need to combine sales pipeline data with billing and subscription information to understand the full customer lifecycle.",{"type":17,"tag":29,"props":108172,"children":108173},{},[108174,108179,108180],{"type":17,"tag":33,"props":108175,"children":108176},{},[108177],{"type":23,"value":108178},"Learn how to retrieve CRM and billing records in real time in our guide:",{"type":23,"value":18757},{"type":17,"tag":133,"props":108181,"children":108184},{"href":108182,"rel":108183},"https://unified.to/blog/how_to_build_sales_enrichment_across_salesforce_hubspot_and_38_crms_with_a_unified_api",[214],[108185],{"type":17,"tag":33,"props":108186,"children":108187},{},[108188],{"type":17,"tag":48,"props":108189,"children":108190},{},[108191],{"type":23,"value":108192},"How to Build Sales Enrichment Across Salesforce, HubSpot, and 38+ CRMs",{"type":17,"tag":239,"props":108194,"children":108196},{"id":108195},"customer-360-architecture",[108197],{"type":23,"value":108198},"Customer 360 architecture",{"type":17,"tag":29,"props":108200,"children":108201},{},[108202],{"type":23,"value":108203},"A typical Customer 360 dashboard combines three data sources:",{"type":17,"tag":6893,"props":108205,"children":108208},{"className":108206,"code":108207,"language":20901,"meta":23},[20899],"CRM platforms\n(Salesforce, HubSpot)\n        ↓\nUnified CRM API\n        ↓\nCustomer profile + pipeline data\n\nBilling platforms\n(Stripe, QuickBooks)\n        ↓\nUnified Payments / Accounting APIs\n        ↓\nInvoices, subscriptions, payments\n\nYour application database\n        ↓\nCustomer 360 dashboard\n",[108209],{"type":17,"tag":6121,"props":108210,"children":108211},{"__ignoreMap":7},[108212],{"type":23,"value":108207},{"type":17,"tag":68,"props":108214,"children":108216},{"id":108215},"common-customer-360-use-cases",[108217],{"type":23,"value":108218},"Common Customer 360 Use Cases",{"type":17,"tag":29,"props":108220,"children":108221},{},[108222],{"type":23,"value":108223},"Products typically build Customer 360 dashboards to support:",{"type":17,"tag":29,"props":108225,"children":108226},{},[108227],{"type":17,"tag":48,"props":108228,"children":108229},{},[108230],{"type":23,"value":108231},"Customer analytics platforms",{"type":17,"tag":29,"props":108233,"children":108234},{},[108235],{"type":23,"value":108236},"Combine CRM and billing data to analyze revenue by account.",{"type":17,"tag":29,"props":108238,"children":108239},{},[108240],{"type":17,"tag":48,"props":108241,"children":108242},{},[108243],{"type":23,"value":108244},"Sales intelligence tools",{"type":17,"tag":29,"props":108246,"children":108247},{},[108248],{"type":23,"value":108249},"Provide reps with a unified view of pipeline activity and payment status.",{"type":17,"tag":29,"props":108251,"children":108252},{},[108253],{"type":17,"tag":48,"props":108254,"children":108255},{},[108256],{"type":23,"value":24382},{"type":17,"tag":29,"props":108258,"children":108259},{},[108260],{"type":23,"value":108261},"Surface account health signals such as overdue invoices, declining engagement, or stalled deals.",{"type":17,"tag":29,"props":108263,"children":108264},{},[108265],{"type":17,"tag":48,"props":108266,"children":108267},{},[108268],{"type":23,"value":15895},{"type":17,"tag":29,"props":108270,"children":108271},{},[108272],{"type":23,"value":108273},"Allow LLM assistants to answer questions like:",{"type":17,"tag":80,"props":108275,"children":108276},{},[108277,108282,108287],{"type":17,"tag":84,"props":108278,"children":108279},{},[108280],{"type":23,"value":108281},"'What's the latest deal activity for this customer?'",{"type":17,"tag":84,"props":108283,"children":108284},{},[108285],{"type":23,"value":108286},"'Has this account paid their last invoice?'",{"type":17,"tag":84,"props":108288,"children":108289},{},[108290],{"type":23,"value":108291},"'When does their subscription renew?'",{"type":17,"tag":68,"props":108293,"children":108295},{"id":108294},"unified-categories-used-in-a-customer-360-dashboard",[108296],{"type":23,"value":108297},"Unified Categories Used in a Customer 360 Dashboard",{"type":17,"tag":29,"props":108299,"children":108300},{},[108301,108303,108307],{"type":23,"value":108302},"A Customer 360 dashboard typically pulls data from three ",{"type":17,"tag":133,"props":108304,"children":108305},{"href":7691},[108306],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":108309,"children":108310},{},[108311,108329],{"type":17,"tag":7235,"props":108312,"children":108313},{},[108314],{"type":17,"tag":7239,"props":108315,"children":108316},{},[108317,108321,108325],{"type":17,"tag":7243,"props":108318,"children":108319},{},[108320],{"type":23,"value":7247},{"type":17,"tag":7243,"props":108322,"children":108323},{},[108324],{"type":23,"value":24525},{"type":17,"tag":7243,"props":108326,"children":108327},{},[108328],{"type":23,"value":24530},{"type":17,"tag":7259,"props":108330,"children":108331},{},[108332,108353,108375],{"type":17,"tag":7239,"props":108333,"children":108334},{},[108335,108343,108348],{"type":17,"tag":7266,"props":108336,"children":108337},{},[108338],{"type":17,"tag":133,"props":108339,"children":108341},{"href":107049,"rel":108340},[214],[108342],{"type":23,"value":25731},{"type":17,"tag":7266,"props":108344,"children":108345},{},[108346],{"type":23,"value":108347},"Customer relationship data across platforms like Salesforce and HubSpot",{"type":17,"tag":7266,"props":108349,"children":108350},{},[108351],{"type":23,"value":108352},"contact, company, deal, event, lead, pipeline",{"type":17,"tag":7239,"props":108354,"children":108355},{},[108356,108365,108370],{"type":17,"tag":7266,"props":108357,"children":108358},{},[108359],{"type":17,"tag":133,"props":108360,"children":108363},{"href":108361,"rel":108362},"https://docs.unified.to/payment/overview",[214],[108364],{"type":23,"value":11737},{"type":17,"tag":7266,"props":108366,"children":108367},{},[108368],{"type":23,"value":108369},"Billing and subscription data across providers like Stripe",{"type":17,"tag":7266,"props":108371,"children":108372},{},[108373],{"type":23,"value":108374},"payments, refunds, payouts, subscriptions",{"type":17,"tag":7239,"props":108376,"children":108377},{},[108378,108387,108392],{"type":17,"tag":7266,"props":108379,"children":108380},{},[108381],{"type":17,"tag":133,"props":108382,"children":108385},{"href":108383,"rel":108384},"https://docs.unified.to/accounting/overview",[214],[108386],{"type":23,"value":104365},{"type":17,"tag":7266,"props":108388,"children":108389},{},[108390],{"type":23,"value":108391},"Invoice and financial records from accounting platforms",{"type":17,"tag":7266,"props":108393,"children":108394},{},[108395],{"type":23,"value":108396},"invoices, bills, transactions, contacts",{"type":17,"tag":29,"props":108398,"children":108399},{},[108400],{"type":23,"value":108401},"These APIs normalize the core objects used in most CRM and billing systems, allowing your product to retrieve customer and revenue data through consistent endpoints.",{"type":17,"tag":68,"props":108403,"children":108405},{"id":108404},"unified-objects-key-fields",[108406],{"type":23,"value":108407},"Unified Objects & Key Fields",{"type":17,"tag":29,"props":108409,"children":108410},{},[108411],{"type":23,"value":108412},"Unified standardizes the core objects needed to power customer analytics.",{"type":17,"tag":7231,"props":108414,"children":108415},{},[108416,108434],{"type":17,"tag":7235,"props":108417,"children":108418},{},[108419],{"type":17,"tag":7239,"props":108420,"children":108421},{},[108422,108426,108430],{"type":17,"tag":7243,"props":108423,"children":108424},{},[108425],{"type":23,"value":18594},{"type":17,"tag":7243,"props":108427,"children":108428},{},[108429],{"type":23,"value":20787},{"type":17,"tag":7243,"props":108431,"children":108432},{},[108433],{"type":23,"value":22096},{"type":17,"tag":7259,"props":108435,"children":108436},{},[108437,108454,108471,108488,108505,108522,108539],{"type":17,"tag":7239,"props":108438,"children":108439},{},[108440,108444,108449],{"type":17,"tag":7266,"props":108441,"children":108442},{},[108443],{"type":23,"value":25828},{"type":17,"tag":7266,"props":108445,"children":108446},{},[108447],{"type":23,"value":108448},"Individual customer or prospect",{"type":17,"tag":7266,"props":108450,"children":108451},{},[108452],{"type":23,"value":108453},"id, name, emails, telephones, company_ids, deal_ids, user_id",{"type":17,"tag":7239,"props":108455,"children":108456},{},[108457,108461,108466],{"type":17,"tag":7266,"props":108458,"children":108459},{},[108460],{"type":23,"value":25846},{"type":17,"tag":7266,"props":108462,"children":108463},{},[108464],{"type":23,"value":108465},"Organization associated with contacts and deals",{"type":17,"tag":7266,"props":108467,"children":108468},{},[108469],{"type":23,"value":108470},"id, name, domains, industry, employees, contact_ids, deal_ids",{"type":17,"tag":7239,"props":108472,"children":108473},{},[108474,108478,108483],{"type":17,"tag":7266,"props":108475,"children":108476},{},[108477],{"type":23,"value":25810},{"type":17,"tag":7266,"props":108479,"children":108480},{},[108481],{"type":23,"value":108482},"Revenue opportunity in a pipeline",{"type":17,"tag":7266,"props":108484,"children":108485},{},[108486],{"type":23,"value":108487},"id, amount, currency, stage_id, closing_at, contact_ids, company_ids",{"type":17,"tag":7239,"props":108489,"children":108490},{},[108491,108495,108500],{"type":17,"tag":7266,"props":108492,"children":108493},{},[108494],{"type":23,"value":14528},{"type":17,"tag":7266,"props":108496,"children":108497},{},[108498],{"type":23,"value":108499},"Activity record such as meeting, call, or note",{"type":17,"tag":7266,"props":108501,"children":108502},{},[108503],{"type":23,"value":108504},"id, type, created_at, contact_ids, company_ids, deal_ids",{"type":17,"tag":7239,"props":108506,"children":108507},{},[108508,108512,108517],{"type":17,"tag":7266,"props":108509,"children":108510},{},[108511],{"type":23,"value":71559},{"type":17,"tag":7266,"props":108513,"children":108514},{},[108515],{"type":23,"value":108516},"Billing document issued to a customer",{"type":17,"tag":7266,"props":108518,"children":108519},{},[108520],{"type":23,"value":108521},"id, contact_id, total_amount, status, due_at, paid_at",{"type":17,"tag":7239,"props":108523,"children":108524},{},[108525,108529,108534],{"type":17,"tag":7266,"props":108526,"children":108527},{},[108528],{"type":23,"value":25973},{"type":17,"tag":7266,"props":108530,"children":108531},{},[108532],{"type":23,"value":108533},"Transaction associated with an invoice",{"type":17,"tag":7266,"props":108535,"children":108536},{},[108537],{"type":23,"value":108538},"id, invoice_id, contact_id, total_amount, currency",{"type":17,"tag":7239,"props":108540,"children":108541},{},[108542,108546,108551],{"type":17,"tag":7266,"props":108543,"children":108544},{},[108545],{"type":23,"value":25991},{"type":17,"tag":7266,"props":108547,"children":108548},{},[108549],{"type":23,"value":108550},"Recurring billing relationship",{"type":17,"tag":7266,"props":108552,"children":108553},{},[108554],{"type":23,"value":108555},"id, contact_id, status, current_period_start_at, current_period_end_at",{"type":17,"tag":29,"props":108557,"children":108558},{},[108559],{"type":23,"value":108560},"These objects provide the foundation for linking CRM activity with billing and subscription data.",{"type":17,"tag":68,"props":108562,"children":108564},{"id":108563},"what-to-show-in-a-customer-360-dashboard",[108565],{"type":23,"value":108566},"What to Show in a Customer 360 Dashboard",{"type":17,"tag":29,"props":108568,"children":108569},{},[108570],{"type":23,"value":108571},"A minimal Customer 360 view usually includes five panels.",{"type":17,"tag":239,"props":108573,"children":108575},{"id":108574},"account-profile",[108576],{"type":23,"value":108577},"Account profile",{"type":17,"tag":29,"props":108579,"children":108580},{},[108581],{"type":23,"value":108582},"Displays the basic account record.",{"type":17,"tag":29,"props":108584,"children":108585},{},[108586],{"type":23,"value":108587},"Example fields",{"type":17,"tag":80,"props":108589,"children":108590},{},[108591,108596,108601,108606],{"type":17,"tag":84,"props":108592,"children":108593},{},[108594],{"type":23,"value":108595},"company name and domain",{"type":17,"tag":84,"props":108597,"children":108598},{},[108599],{"type":23,"value":108600},"primary contact",{"type":17,"tag":84,"props":108602,"children":108603},{},[108604],{"type":23,"value":108605},"account owner",{"type":17,"tag":84,"props":108607,"children":108608},{},[108609],{"type":23,"value":108610},"industry and employee size",{"type":17,"tag":29,"props":108612,"children":108613},{},[108614],{"type":23,"value":108615},"Powered by",{"type":17,"tag":80,"props":108617,"children":108618},{},[108619,108624],{"type":17,"tag":84,"props":108620,"children":108621},{},[108622],{"type":23,"value":108623},"CRM company",{"type":17,"tag":84,"props":108625,"children":108626},{},[108627],{"type":23,"value":108628},"CRM contact",{"type":17,"tag":239,"props":108630,"children":108632},{"id":108631},"revenue-and-billing-status",[108633],{"type":23,"value":108634},"Revenue and billing status",{"type":17,"tag":29,"props":108636,"children":108637},{},[108638],{"type":23,"value":108639},"Shows the current financial relationship with the customer.",{"type":17,"tag":29,"props":108641,"children":108642},{},[108643],{"type":23,"value":108644},"Example metrics",{"type":17,"tag":80,"props":108646,"children":108647},{},[108648,108652,108657,108662],{"type":17,"tag":84,"props":108649,"children":108650},{},[108651],{"type":23,"value":28453},{"type":17,"tag":84,"props":108653,"children":108654},{},[108655],{"type":23,"value":108656},"renewal date",{"type":17,"tag":84,"props":108658,"children":108659},{},[108660],{"type":23,"value":108661},"most recent payment",{"type":17,"tag":84,"props":108663,"children":108664},{},[108665],{"type":23,"value":108666},"outstanding invoices",{"type":17,"tag":29,"props":108668,"children":108669},{},[108670],{"type":23,"value":108615},{"type":17,"tag":80,"props":108672,"children":108673},{},[108674,108678,108683],{"type":17,"tag":84,"props":108675,"children":108676},{},[108677],{"type":23,"value":71530},{"type":17,"tag":84,"props":108679,"children":108680},{},[108681],{"type":23,"value":108682},"invoice",{"type":17,"tag":84,"props":108684,"children":108685},{},[108686],{"type":23,"value":71492},{"type":17,"tag":239,"props":108688,"children":108690},{"id":108689},"pipeline-snapshot",[108691],{"type":23,"value":108692},"Pipeline snapshot",{"type":17,"tag":29,"props":108694,"children":108695},{},[108696],{"type":23,"value":108697},"Displays current revenue opportunities.",{"type":17,"tag":29,"props":108699,"children":108700},{},[108701],{"type":23,"value":108644},{"type":17,"tag":80,"props":108703,"children":108704},{},[108705,108710,108715,108720],{"type":17,"tag":84,"props":108706,"children":108707},{},[108708],{"type":23,"value":108709},"open deals",{"type":17,"tag":84,"props":108711,"children":108712},{},[108713],{"type":23,"value":108714},"deal stage",{"type":17,"tag":84,"props":108716,"children":108717},{},[108718],{"type":23,"value":108719},"expected close date",{"type":17,"tag":84,"props":108721,"children":108722},{},[108723],{"type":23,"value":108724},"total pipeline amount",{"type":17,"tag":29,"props":108726,"children":108727},{},[108728],{"type":23,"value":108615},{"type":17,"tag":80,"props":108730,"children":108731},{},[108732,108737],{"type":17,"tag":84,"props":108733,"children":108734},{},[108735],{"type":23,"value":108736},"CRM deal",{"type":17,"tag":84,"props":108738,"children":108739},{},[108740],{"type":23,"value":108741},"CRM pipeline",{"type":17,"tag":239,"props":108743,"children":108745},{"id":108744},"engagement-timeline",[108746],{"type":23,"value":108747},"Engagement timeline",{"type":17,"tag":29,"props":108749,"children":108750},{},[108751],{"type":23,"value":108752},"Shows recent interactions with the customer.",{"type":17,"tag":29,"props":108754,"children":108755},{},[108756],{"type":23,"value":108644},{"type":17,"tag":80,"props":108758,"children":108759},{},[108760,108765,108770,108775],{"type":17,"tag":84,"props":108761,"children":108762},{},[108763],{"type":23,"value":108764},"last activity date",{"type":17,"tag":84,"props":108766,"children":108767},{},[108768],{"type":23,"value":108769},"meetings and calls",{"type":17,"tag":84,"props":108771,"children":108772},{},[108773],{"type":23,"value":108774},"notes and emails",{"type":17,"tag":84,"props":108776,"children":108777},{},[108778],{"type":23,"value":108779},"activity count over time",{"type":17,"tag":29,"props":108781,"children":108782},{},[108783],{"type":23,"value":108615},{"type":17,"tag":80,"props":108785,"children":108786},{},[108787],{"type":17,"tag":84,"props":108788,"children":108789},{},[108790],{"type":23,"value":108791},"CRM event",{"type":17,"tag":239,"props":108793,"children":108795},{"id":108794},"customer-health-indicators",[108796],{"type":23,"value":108797},"Customer health indicators",{"type":17,"tag":29,"props":108799,"children":108800},{},[108801],{"type":23,"value":108802},"Combines sales and billing signals to assess account health.",{"type":17,"tag":29,"props":108804,"children":108805},{},[108806],{"type":23,"value":108807},"Example signals",{"type":17,"tag":80,"props":108809,"children":108810},{},[108811,108816,108821],{"type":17,"tag":84,"props":108812,"children":108813},{},[108814],{"type":23,"value":108815},"overdue invoices",{"type":17,"tag":84,"props":108817,"children":108818},{},[108819],{"type":23,"value":108820},"canceled subscriptions",{"type":17,"tag":84,"props":108822,"children":108823},{},[108824],{"type":23,"value":108825},"lack of recent activity",{"type":17,"tag":29,"props":108827,"children":108828},{},[108829],{"type":23,"value":108830},"These signals help customer success teams prioritize accounts that need attention.",{"type":17,"tag":68,"props":108832,"children":108834},{"id":108833},"linking-crm-customers-to-billing-customers",[108835],{"type":23,"value":108836},"Linking CRM Customers to Billing Customers",{"type":17,"tag":29,"props":108838,"children":108839},{},[108840,108842,108847],{"type":23,"value":108841},"CRM contacts and billing contacts are intentionally ",{"type":17,"tag":48,"props":108843,"children":108844},{},[108845],{"type":23,"value":108846},"separate objects",{"type":23,"value":108848}," in Unified.",{"type":17,"tag":29,"props":108850,"children":108851},{},[108852],{"type":23,"value":108853},"CRM objects represent sales activity, while accounting and payment objects represent financial transactions. Because different systems manage these records, they use different identifiers.",{"type":17,"tag":29,"props":108855,"children":108856},{},[108857],{"type":23,"value":108858},"To build a Customer 360 view, your application should maintain a mapping between them.",{"type":17,"tag":29,"props":108860,"children":108861},{},[108862],{"type":23,"value":108863},"Typical approach:",{"type":17,"tag":6154,"props":108865,"children":108866},{},[108867,108878],{"type":17,"tag":84,"props":108868,"children":108869},{},[108870,108872],{"type":23,"value":108871},"Maintain an internal ",{"type":17,"tag":6121,"props":108873,"children":108875},{"className":108874},[],[108876],{"type":23,"value":108877},"customer_id",{"type":17,"tag":84,"props":108879,"children":108880},{},[108881,108883],{"type":23,"value":108882},"Store associated identifiers from both domains\n",{"type":17,"tag":80,"props":108884,"children":108885},{},[108886,108891],{"type":17,"tag":84,"props":108887,"children":108888},{},[108889],{"type":23,"value":108890},"CRM contact or company IDs",{"type":17,"tag":84,"props":108892,"children":108893},{},[108894],{"type":23,"value":108895},"accounting contact IDs",{"type":17,"tag":29,"props":108897,"children":108898},{},[108899],{"type":23,"value":108900},"Matching is usually done using:",{"type":17,"tag":80,"props":108902,"children":108903},{},[108904,108909,108914],{"type":17,"tag":84,"props":108905,"children":108906},{},[108907],{"type":23,"value":108908},"primary email address",{"type":17,"tag":84,"props":108910,"children":108911},{},[108912],{"type":23,"value":108913},"company domain",{"type":17,"tag":84,"props":108915,"children":108916},{},[108917],{"type":23,"value":49561},{"type":17,"tag":29,"props":108919,"children":108920},{},[108921],{"type":23,"value":108922},"Once mapped, your application can join CRM and billing data consistently.",{"type":17,"tag":68,"props":108924,"children":108926},{"id":108925},"connect-customer-accounts",[108927],{"type":23,"value":108928},"Connect Customer Accounts",{"type":17,"tag":29,"props":108930,"children":108931},{},[108932,108934,108938],{"type":23,"value":108933},"Customers authorize their systems through ",{"type":17,"tag":48,"props":108935,"children":108936},{},[108937],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":108940,"children":108941},{},[108942],{"type":23,"value":108943},"The authorization flow is the same across CRM, payments, and accounting platforms.",{"type":17,"tag":29,"props":108945,"children":108946},{},[108947],{"type":23,"value":26189},{"type":17,"tag":6154,"props":108949,"children":108950},{},[108951,108956,108961,108966],{"type":17,"tag":84,"props":108952,"children":108953},{},[108954],{"type":23,"value":108955},"Your application launches the authorization flow using the Unified Connect component.",{"type":17,"tag":84,"props":108957,"children":108958},{},[108959],{"type":23,"value":108960},"The customer selects a provider such as Salesforce, HubSpot, or Stripe.",{"type":17,"tag":84,"props":108962,"children":108963},{},[108964],{"type":23,"value":108965},"After authorization, the user is redirected back to your application.",{"type":17,"tag":84,"props":108967,"children":108968},{},[108969,108971,108975],{"type":23,"value":108970},"The redirect URL includes a ",{"type":17,"tag":48,"props":108972,"children":108973},{},[108974],{"type":23,"value":25037},{"type":23,"value":108976}," identifying the authorized account.",{"type":17,"tag":29,"props":108978,"children":108979},{},[108980],{"type":23,"value":108981},"You store the mapping between:",{"type":17,"tag":6893,"props":108983,"children":108985},{"className":108984,"code":25047,"language":20901,"meta":23},[20899],[108986],{"type":17,"tag":6121,"props":108987,"children":108988},{"__ignoreMap":7},[108989],{"type":23,"value":25047},{"type":17,"tag":29,"props":108991,"children":108992},{},[108993],{"type":23,"value":108994},"Once the connection exists, the same identifier can be used across all Unified API calls.",{"type":17,"tag":68,"props":108996,"children":108998},{"id":108997},"retrieving-customer-and-billing-data",[108999],{"type":23,"value":109000},"Retrieving Customer and Billing Data",{"type":17,"tag":29,"props":109002,"children":109003},{},[109004],{"type":23,"value":109005},"A Customer 360 dashboard typically queries CRM and billing objects using list endpoints.",{"type":17,"tag":29,"props":109007,"children":109008},{},[109009],{"type":23,"value":24364},{"type":17,"tag":239,"props":109011,"children":109012},{"id":107496},[109013],{"type":23,"value":107499},{"type":17,"tag":6893,"props":109015,"children":109017},{"className":109016,"code":91034,"language":20901,"meta":23},[20899],[109018],{"type":17,"tag":6121,"props":109019,"children":109020},{"__ignoreMap":7},[109021],{"type":23,"value":91034},{"type":17,"tag":29,"props":109023,"children":109024},{},[109025],{"type":23,"value":109026},"Common filters used in dashboards:",{"type":17,"tag":80,"props":109028,"children":109029},{},[109030,109040,109050,109066],{"type":17,"tag":84,"props":109031,"children":109032},{},[109033,109038],{"type":17,"tag":6121,"props":109034,"children":109036},{"className":109035},[],[109037],{"type":23,"value":26291},{"type":23,"value":109039}," – retrieve recently changed records",{"type":17,"tag":84,"props":109041,"children":109042},{},[109043,109048],{"type":17,"tag":6121,"props":109044,"children":109046},{"className":109045},[],[109047],{"type":23,"value":62582},{"type":23,"value":109049}," – filter by account owner",{"type":17,"tag":84,"props":109051,"children":109052},{},[109053,109058,109059,109064],{"type":17,"tag":6121,"props":109054,"children":109056},{"className":109055},[],[109057],{"type":23,"value":27299},{"type":23,"value":75890},{"type":17,"tag":6121,"props":109060,"children":109062},{"className":109061},[],[109063],{"type":23,"value":26302},{"type":23,"value":109065}," – retrieve related records",{"type":17,"tag":84,"props":109067,"children":109068},{},[109069,109075],{"type":17,"tag":6121,"props":109070,"children":109072},{"className":109071},[],[109073],{"type":23,"value":109074},"pipeline_id",{"type":23,"value":109076}," – filter deals by pipeline",{"type":17,"tag":29,"props":109078,"children":109079},{},[109080],{"type":23,"value":109081},"These parameters make it easy to retrieve incremental updates and group data for analytics.",{"type":17,"tag":239,"props":109083,"children":109085},{"id":109084},"billing-and-payment-endpoints",[109086],{"type":23,"value":109087},"Billing and payment endpoints",{"type":17,"tag":6893,"props":109089,"children":109092},{"className":109090,"code":109091,"language":20901,"meta":23},[20899],"GET /accounting/{connection_id}/invoice\nGET /accounting/{connection_id}/contact\nGET /payment/{connection_id}/payment\nGET /payment/{connection_id}/subscription\n",[109093],{"type":17,"tag":6121,"props":109094,"children":109095},{"__ignoreMap":7},[109096],{"type":23,"value":109091},{"type":17,"tag":29,"props":109098,"children":109099},{},[109100],{"type":23,"value":109101},"Useful filters include:",{"type":17,"tag":80,"props":109103,"children":109104},{},[109105,109115,109126,109136],{"type":17,"tag":84,"props":109106,"children":109107},{},[109108,109113],{"type":17,"tag":6121,"props":109109,"children":109111},{"className":109110},[],[109112],{"type":23,"value":26302},{"type":23,"value":109114}," – retrieve invoices for a specific customer",{"type":17,"tag":84,"props":109116,"children":109117},{},[109118,109124],{"type":17,"tag":6121,"props":109119,"children":109121},{"className":109120},[],[109122],{"type":23,"value":109123},"invoice_id",{"type":23,"value":109125}," – retrieve payments linked to a particular invoice",{"type":17,"tag":84,"props":109127,"children":109128},{},[109129,109134],{"type":17,"tag":6121,"props":109130,"children":109132},{"className":109131},[],[109133],{"type":23,"value":26291},{"type":23,"value":109135}," – incremental updates",{"type":17,"tag":84,"props":109137,"children":109138},{},[109139,109145,109146,109152],{"type":17,"tag":6121,"props":109140,"children":109142},{"className":109141},[],[109143],{"type":23,"value":109144},"start_gte",{"type":23,"value":26030},{"type":17,"tag":6121,"props":109147,"children":109149},{"className":109148},[],[109150],{"type":23,"value":109151},"end_lt",{"type":23,"value":109153}," – subscription lifecycle analysis",{"type":17,"tag":29,"props":109155,"children":109156},{},[109157],{"type":23,"value":109158},"Using these endpoints, your application can retrieve invoice status, subscription lifecycle data, and payment history for each customer.",{"type":17,"tag":68,"props":109160,"children":109162},{"id":109161},"keeping-customer-360-data-updated",[109163],{"type":23,"value":109164},"Keeping Customer 360 Data Updated",{"type":17,"tag":29,"props":109166,"children":109167},{},[109168],{"type":23,"value":109169},"Unified provides a consistent webhook system for tracking record changes.",{"type":17,"tag":29,"props":109171,"children":109172},{},[109173],{"type":23,"value":109174},"Webhook subscriptions specify:",{"type":17,"tag":80,"props":109176,"children":109177},{},[109178,109197,109222],{"type":17,"tag":84,"props":109179,"children":109180},{},[109181,109183,109189,109190,109196],{"type":23,"value":109182},"the object type (for example ",{"type":17,"tag":6121,"props":109184,"children":109186},{"className":109185},[],[109187],{"type":23,"value":109188},"crm.contact",{"type":23,"value":75890},{"type":17,"tag":6121,"props":109191,"children":109193},{"className":109192},[],[109194],{"type":23,"value":109195},"accounting.invoice",{"type":23,"value":12034},{"type":17,"tag":84,"props":109198,"children":109199},{},[109200,109202,109208,109209,109215,109216],{"type":23,"value":109201},"event types such as ",{"type":17,"tag":6121,"props":109203,"children":109205},{"className":109204},[],[109206],{"type":23,"value":109207},"created",{"type":23,"value":11826},{"type":17,"tag":6121,"props":109210,"children":109212},{"className":109211},[],[109213],{"type":23,"value":109214},"updated",{"type":23,"value":27293},{"type":17,"tag":6121,"props":109217,"children":109219},{"className":109218},[],[109220],{"type":23,"value":109221},"deleted",{"type":17,"tag":84,"props":109223,"children":109224},{},[109225],{"type":23,"value":109226},"a callback URL",{"type":17,"tag":29,"props":109228,"children":109229},{},[109230,109232,109236,109238,109245],{"type":23,"value":109231},"When supported by the underlying platform, native ",{"type":17,"tag":133,"props":109233,"children":109234},{"href":4999},[109235],{"type":23,"value":5002},{"type":23,"value":109237}," are forwarded directly. If a platform lacks native webhooks, Unified provides ",{"type":17,"tag":48,"props":109239,"children":109240},{},[109241],{"type":17,"tag":133,"props":109242,"children":109243},{"href":9007},[109244],{"type":23,"value":46572},{"type":23,"value":109246},", which poll the source API and emit events when records change.",{"type":17,"tag":29,"props":109248,"children":109249},{},[109250],{"type":23,"value":109251},"For Customer 360 dashboards this enables updates such as:",{"type":17,"tag":80,"props":109253,"children":109254},{},[109255,109260,109265,109270,109275],{"type":17,"tag":84,"props":109256,"children":109257},{},[109258],{"type":23,"value":109259},"contact profile updates",{"type":17,"tag":84,"props":109261,"children":109262},{},[109263],{"type":23,"value":109264},"deal stage changes",{"type":17,"tag":84,"props":109266,"children":109267},{},[109268],{"type":23,"value":109269},"invoice status updates",{"type":17,"tag":84,"props":109271,"children":109272},{},[109273],{"type":23,"value":109274},"payment completion events",{"type":17,"tag":84,"props":109276,"children":109277},{},[109278],{"type":23,"value":109279},"subscription lifecycle changes",{"type":17,"tag":29,"props":109281,"children":109282},{},[109283],{"type":23,"value":109284},"Your application receives these events and updates the dashboard immediately.",{"type":17,"tag":68,"props":109286,"children":109288},{"id":109287},"supported-crm-and-billing-platforms",[109289],{"type":23,"value":109290},"Supported CRM and Billing Platforms",{"type":17,"tag":29,"props":109292,"children":109293},{},[109294],{"type":23,"value":109295},"Unified supports a large ecosystem of CRM and billing integrations.",{"type":17,"tag":239,"props":109297,"children":109299},{"id":109298},"crm-platforms",[109300],{"type":23,"value":109301},"CRM platforms",{"type":17,"tag":29,"props":109303,"children":109304},{},[109305,109307,109312],{"type":23,"value":109306},"Unified's CRM API supports ",{"type":17,"tag":48,"props":109308,"children":109309},{},[109310],{"type":23,"value":109311},"47 CRM integrations",{"type":23,"value":109313},", including:",{"type":17,"tag":80,"props":109315,"children":109316},{},[109317,109321,109325,109329,109333,109337,109341,109345,109349],{"type":17,"tag":84,"props":109318,"children":109319},{},[109320],{"type":23,"value":3179},{"type":17,"tag":84,"props":109322,"children":109323},{},[109324],{"type":23,"value":3184},{"type":17,"tag":84,"props":109326,"children":109327},{},[109328],{"type":23,"value":26530},{"type":17,"tag":84,"props":109330,"children":109331},{},[109332],{"type":23,"value":26535},{"type":17,"tag":84,"props":109334,"children":109335},{},[109336],{"type":23,"value":61598},{"type":17,"tag":84,"props":109338,"children":109339},{},[109340],{"type":23,"value":61628},{"type":17,"tag":84,"props":109342,"children":109343},{},[109344],{"type":23,"value":61620},{"type":17,"tag":84,"props":109346,"children":109347},{},[109348],{"type":23,"value":61636},{"type":17,"tag":84,"props":109350,"children":109351},{},[109352],{"type":23,"value":109353},"Insightly",{"type":17,"tag":239,"props":109355,"children":109357},{"id":109356},"billing-and-payments-platforms",[109358],{"type":23,"value":109359},"Billing and payments platforms",{"type":17,"tag":29,"props":109361,"children":109362},{},[109363,109365,109370],{"type":23,"value":109364},"Unified's payments category supports ",{"type":17,"tag":48,"props":109366,"children":109367},{},[109368],{"type":23,"value":109369},"16 payment integrations",{"type":23,"value":109313},{"type":17,"tag":80,"props":109372,"children":109373},{},[109374,109378,109382,109386,109390,109394],{"type":17,"tag":84,"props":109375,"children":109376},{},[109377],{"type":23,"value":26548},{"type":17,"tag":84,"props":109379,"children":109380},{},[109381],{"type":23,"value":26553},{"type":17,"tag":84,"props":109383,"children":109384},{},[109385],{"type":23,"value":37078},{"type":17,"tag":84,"props":109387,"children":109388},{},[109389],{"type":23,"value":37073},{"type":17,"tag":84,"props":109391,"children":109392},{},[109393],{"type":23,"value":14193},{"type":17,"tag":84,"props":109395,"children":109396},{},[109397],{"type":23,"value":37083},{"type":17,"tag":239,"props":109399,"children":109401},{"id":109400},"accounting-platforms",[109402],{"type":23,"value":109403},"Accounting platforms",{"type":17,"tag":29,"props":109405,"children":109406},{},[109407,109409,109414],{"type":23,"value":109408},"Unified's accounting category supports ",{"type":17,"tag":48,"props":109410,"children":109411},{},[109412],{"type":23,"value":109413},"41 accounting integrations",{"type":23,"value":109313},{"type":17,"tag":80,"props":109416,"children":109417},{},[109418,109422,109426,109430],{"type":17,"tag":84,"props":109419,"children":109420},{},[109421],{"type":23,"value":3199},{"type":17,"tag":84,"props":109423,"children":109424},{},[109425],{"type":23,"value":6678},{"type":17,"tag":84,"props":109427,"children":109428},{},[109429],{"type":23,"value":38530},{"type":17,"tag":84,"props":109431,"children":109432},{},[109433],{"type":23,"value":109434},"Sage Accounting",{"type":17,"tag":68,"props":109436,"children":109437},{"id":73613},[109438],{"type":23,"value":73616},{"type":17,"tag":29,"props":109440,"children":109441},{},[109442],{"type":23,"value":109443},"Building a Customer 360 dashboard without integration infrastructure requires separate connectors for every CRM and billing platform.",{"type":17,"tag":29,"props":109445,"children":109446},{},[109447],{"type":23,"value":34257},{"type":17,"tag":80,"props":109449,"children":109450},{},[109451,109456,109461,109466],{"type":17,"tag":84,"props":109452,"children":109453},{},[109454],{"type":23,"value":109455},"normalized objects across CRM and billing categories",{"type":17,"tag":84,"props":109457,"children":109458},{},[109459],{"type":23,"value":109460},"real-time data retrieval from source APIs",{"type":17,"tag":84,"props":109462,"children":109463},{},[109464],{"type":23,"value":109465},"consistent webhook events across providers",{"type":17,"tag":84,"props":109467,"children":109468},{},[109469],{"type":23,"value":109470},"reusable authorization flows for all integrations",{"type":17,"tag":29,"props":109472,"children":109473},{},[109474],{"type":23,"value":109475},"Instead of building and maintaining dozens of connectors, your team can focus on the product experience and analytics layer.",{"type":17,"tag":29,"props":109477,"children":109478},{},[109479],{"type":23,"value":109480},"Start building customer analytics across Salesforce, HubSpot, Stripe, and dozens of other platforms today.",{"type":17,"tag":29,"props":109482,"children":109483},{},[109484],{"type":17,"tag":133,"props":109485,"children":109487},{"href":1612,"rel":109486},[214],[109488],{"type":23,"value":44481},{"type":17,"tag":29,"props":109490,"children":109491},{},[109492],{"type":17,"tag":133,"props":109493,"children":109495},{"href":1623,"rel":109494},[214],[109496],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":109498},[109499,109502,109503,109504,109505,109512,109513,109514,109518,109519,109524],{"id":108129,"depth":1629,"text":108132,"children":109500},[109501],{"id":108195,"depth":1635,"text":108198},{"id":108215,"depth":1629,"text":108218},{"id":108294,"depth":1629,"text":108297},{"id":108404,"depth":1629,"text":108407},{"id":108563,"depth":1629,"text":108566,"children":109506},[109507,109508,109509,109510,109511],{"id":108574,"depth":1635,"text":108577},{"id":108631,"depth":1635,"text":108634},{"id":108689,"depth":1635,"text":108692},{"id":108744,"depth":1635,"text":108747},{"id":108794,"depth":1635,"text":108797},{"id":108833,"depth":1629,"text":108836},{"id":108925,"depth":1629,"text":108928},{"id":108997,"depth":1629,"text":109000,"children":109515},[109516,109517],{"id":107496,"depth":1635,"text":107499},{"id":109084,"depth":1635,"text":109087},{"id":109161,"depth":1629,"text":109164},{"id":109287,"depth":1629,"text":109290,"children":109520},[109521,109522,109523],{"id":109298,"depth":1635,"text":109301},{"id":109356,"depth":1635,"text":109359},{"id":109400,"depth":1635,"text":109403},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_a_customer_360_dashboard_using_salesforce_hubspot_and_stripe_data_with_a_crm_api.md","blog/how_to_build_a_customer_360_dashboard_using_salesforce_hubspot_and_stripe_data_with_a_crm_api.md","blog/how_to_build_a_customer_360_dashboard_using_salesforce_hubspot_and_stripe_data_with_a_crm_api",{"_path":109529,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":109530,"description":109531,"img":109532,"date":108048,"tag":12,"body":109533,"_type":1677,"_id":110730,"_source":1679,"_file":110731,"_stem":110732,"_extension":1682},"/blog/how_to_build_crm_sync_across_salesforce_hubspot_and_47_crms_with_a_crm_api","How to Build CRM Sync Across Salesforce, HubSpot, and 47+ CRMs with a CRM API","SaaS products often need to synchronize CRM data between customer platforms and their own application.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_crm_sync_across_salesforce_hubspot_and_47_crms_with_a_crm_api-icon.png",{"type":14,"children":109534,"toc":110710},[109535,109540,109543,109550,109554,109559,109581,109586,109591,109609,109615,109620,109628,109633,109641,109646,109654,109659,109667,109672,109677,109683,109688,109693,109698,109789,109794,109800,109810,109815,109819,109846,109850,109858,109863,109869,109874,109879,109887,109892,109897,109940,109945,109951,109956,109961,110101,110114,110119,110125,110130,110135,110171,110176,110180,110208,110213,110218,110245,110250,110256,110261,110273,110286,110304,110309,110321,110326,110344,110356,110361,110367,110372,110378,110383,110388,110400,110406,110418,110423,110429,110434,110438,110447,110452,110458,110463,110474,110483,110489,110493,110542,110552,110557,110563,110568,110573,110579,110584,110590,110599,110638,110643,110647,110652,110656,110684,110689,110694,110702],{"type":17,"tag":18,"props":109536,"children":109538},{"id":109537},"how-to-build-crm-sync-across-salesforce-hubspot-and-47-crms-with-a-crm-api",[109539],{"type":23,"value":109530},{"type":17,"tag":25,"props":109541,"children":109542},{},[],{"type":17,"tag":29,"props":109544,"children":109545},{},[109546],{"type":17,"tag":33,"props":109547,"children":109548},{},[109549],{"type":23,"value":106378},{"type":17,"tag":29,"props":109551,"children":109552},{},[109553],{"type":23,"value":109531},{"type":17,"tag":29,"props":109555,"children":109556},{},[109557],{"type":23,"value":109558},"Customers may use Salesforce, HubSpot, Pipedrive, or dozens of other CRMs, but your product still needs access to contacts, companies, deals, and activities in order to power features like:",{"type":17,"tag":80,"props":109560,"children":109561},{},[109562,109567,109572,109577],{"type":17,"tag":84,"props":109563,"children":109564},{},[109565],{"type":23,"value":109566},"sales automation",{"type":17,"tag":84,"props":109568,"children":109569},{},[109570],{"type":23,"value":109571},"RevOps analytics",{"type":17,"tag":84,"props":109573,"children":109574},{},[109575],{"type":23,"value":109576},"customer success dashboards",{"type":17,"tag":84,"props":109578,"children":109579},{},[109580],{"type":23,"value":25587},{"type":17,"tag":29,"props":109582,"children":109583},{},[109584],{"type":23,"value":109585},"The challenge is that every CRM platform exposes different APIs, authentication models, and data schemas.",{"type":17,"tag":29,"props":109587,"children":109588},{},[109589],{"type":23,"value":109590},"Building direct integrations across each provider requires constant maintenance and vendor-specific logic.",{"type":17,"tag":29,"props":109592,"children":109593},{},[109594,109596,109607],{"type":23,"value":109595},"Unified solves this by providing a ",{"type":17,"tag":48,"props":109597,"children":109598},{},[109599,109601,109605],{"type":23,"value":109600},"normalized ",{"type":17,"tag":133,"props":109602,"children":109603},{"href":61562},[109604],{"type":23,"value":61565},{"type":23,"value":109606}," that supports 47 CRM platforms",{"type":23,"value":109608},". Your product integrates once and can read and write CRM data across Salesforce, HubSpot, and dozens of other systems through a consistent interface.",{"type":17,"tag":68,"props":109610,"children":109612},{"id":109611},"when-to-use-crm-sync",[109613],{"type":23,"value":109614},"When to Use CRM Sync",{"type":17,"tag":29,"props":109616,"children":109617},{},[109618],{"type":23,"value":109619},"Products typically build CRM synchronization when they need to:",{"type":17,"tag":29,"props":109621,"children":109622},{},[109623],{"type":17,"tag":48,"props":109624,"children":109625},{},[109626],{"type":23,"value":109627},"Sync contacts and accounts",{"type":17,"tag":29,"props":109629,"children":109630},{},[109631],{"type":23,"value":109632},"Keep customer profiles synchronized between your application and a user's CRM.",{"type":17,"tag":29,"props":109634,"children":109635},{},[109636],{"type":17,"tag":48,"props":109637,"children":109638},{},[109639],{"type":23,"value":109640},"Update pipeline records",{"type":17,"tag":29,"props":109642,"children":109643},{},[109644],{"type":23,"value":109645},"Create or update opportunities when actions occur in your product.",{"type":17,"tag":29,"props":109647,"children":109648},{},[109649],{"type":17,"tag":48,"props":109650,"children":109651},{},[109652],{"type":23,"value":109653},"Ingest leads",{"type":17,"tag":29,"props":109655,"children":109656},{},[109657],{"type":23,"value":109658},"Automatically send new leads captured in your product into the user's CRM.",{"type":17,"tag":29,"props":109660,"children":109661},{},[109662],{"type":17,"tag":48,"props":109663,"children":109664},{},[109665],{"type":23,"value":109666},"Build CRM analytics",{"type":17,"tag":29,"props":109668,"children":109669},{},[109670],{"type":23,"value":109671},"Pull contacts, companies, deals, and activities into your own database for reporting and dashboards.",{"type":17,"tag":29,"props":109673,"children":109674},{},[109675],{"type":23,"value":109676},"In each of these cases, the product needs a reliable way to read and write CRM data across many different providers.",{"type":17,"tag":68,"props":109678,"children":109680},{"id":109679},"unified-crm-api-overview",[109681],{"type":23,"value":109682},"Unified CRM API Overview",{"type":17,"tag":29,"props":109684,"children":109685},{},[109686],{"type":23,"value":109687},"Unified's CRM API standardizes core CRM objects across dozens of platforms.",{"type":17,"tag":29,"props":109689,"children":109690},{},[109691],{"type":23,"value":109692},"The API normalizes authentication, endpoints, and schemas so developers can interact with contacts, companies, deals, and activities without writing provider-specific code.",{"type":17,"tag":29,"props":109694,"children":109695},{},[109696],{"type":23,"value":109697},"The primary CRM objects include:",{"type":17,"tag":7231,"props":109699,"children":109700},{},[109701,109715],{"type":17,"tag":7235,"props":109702,"children":109703},{},[109704],{"type":17,"tag":7239,"props":109705,"children":109706},{},[109707,109711],{"type":17,"tag":7243,"props":109708,"children":109709},{},[109710],{"type":23,"value":18594},{"type":17,"tag":7243,"props":109712,"children":109713},{},[109714],{"type":23,"value":20787},{"type":17,"tag":7259,"props":109716,"children":109717},{},[109718,109730,109741,109753,109765,109777],{"type":17,"tag":7239,"props":109719,"children":109720},{},[109721,109725],{"type":17,"tag":7266,"props":109722,"children":109723},{},[109724],{"type":23,"value":43625},{"type":17,"tag":7266,"props":109726,"children":109727},{},[109728],{"type":23,"value":109729},"Individual lead or customer record",{"type":17,"tag":7239,"props":109731,"children":109732},{},[109733,109737],{"type":17,"tag":7266,"props":109734,"children":109735},{},[109736],{"type":23,"value":62420},{"type":17,"tag":7266,"props":109738,"children":109739},{},[109740],{"type":23,"value":108465},{"type":17,"tag":7239,"props":109742,"children":109743},{},[109744,109748],{"type":17,"tag":7266,"props":109745,"children":109746},{},[109747],{"type":23,"value":43632},{"type":17,"tag":7266,"props":109749,"children":109750},{},[109751],{"type":23,"value":109752},"Revenue opportunity or pipeline record",{"type":17,"tag":7239,"props":109754,"children":109755},{},[109756,109760],{"type":17,"tag":7266,"props":109757,"children":109758},{},[109759],{"type":23,"value":62633},{"type":17,"tag":7266,"props":109761,"children":109762},{},[109763],{"type":23,"value":109764},"Activity such as a call, meeting, email, or note",{"type":17,"tag":7239,"props":109766,"children":109767},{},[109768,109772],{"type":17,"tag":7266,"props":109769,"children":109770},{},[109771],{"type":23,"value":62746},{"type":17,"tag":7266,"props":109773,"children":109774},{},[109775],{"type":23,"value":109776},"Prospect record prior to becoming a contact",{"type":17,"tag":7239,"props":109778,"children":109779},{},[109780,109784],{"type":17,"tag":7266,"props":109781,"children":109782},{},[109783],{"type":23,"value":62844},{"type":17,"tag":7266,"props":109785,"children":109786},{},[109787],{"type":23,"value":109788},"Sales pipeline and stages",{"type":17,"tag":29,"props":109790,"children":109791},{},[109792],{"type":23,"value":109793},"These objects provide the foundation for synchronizing CRM records between your product and customer CRMs.",{"type":17,"tag":68,"props":109795,"children":109797},{"id":109796},"connecting-customer-crm-accounts",[109798],{"type":23,"value":109799},"Connecting Customer CRM Accounts",{"type":17,"tag":29,"props":109801,"children":109802},{},[109803,109805,109809],{"type":23,"value":109804},"Customers authorize their CRM accounts through ",{"type":17,"tag":48,"props":109806,"children":109807},{},[109808],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":109811,"children":109812},{},[109813],{"type":23,"value":109814},"The authorization flow works the same across all CRM providers.",{"type":17,"tag":29,"props":109816,"children":109817},{},[109818],{"type":23,"value":25009},{"type":17,"tag":6154,"props":109820,"children":109821},{},[109822,109827,109832,109836],{"type":17,"tag":84,"props":109823,"children":109824},{},[109825],{"type":23,"value":109826},"Your product launches the Unified Connect authorization component.",{"type":17,"tag":84,"props":109828,"children":109829},{},[109830],{"type":23,"value":109831},"The user selects a provider such as Salesforce or HubSpot.",{"type":17,"tag":84,"props":109833,"children":109834},{},[109835],{"type":23,"value":108965},{"type":17,"tag":84,"props":109837,"children":109838},{},[109839,109840,109844],{"type":23,"value":108970},{"type":17,"tag":48,"props":109841,"children":109842},{},[109843],{"type":23,"value":25037},{"type":23,"value":109845}," identifying the CRM account.",{"type":17,"tag":29,"props":109847,"children":109848},{},[109849],{"type":23,"value":73316},{"type":17,"tag":6893,"props":109851,"children":109853},{"className":109852,"code":25047,"language":20901,"meta":23},[20899],[109854],{"type":17,"tag":6121,"props":109855,"children":109856},{"__ignoreMap":7},[109857],{"type":23,"value":25047},{"type":17,"tag":29,"props":109859,"children":109860},{},[109861],{"type":23,"value":109862},"All future API calls use the connection_id to access the customer's CRM data.",{"type":17,"tag":68,"props":109864,"children":109866},{"id":109865},"retrieving-crm-records",[109867],{"type":23,"value":109868},"Retrieving CRM Records",{"type":17,"tag":29,"props":109870,"children":109871},{},[109872],{"type":23,"value":109873},"CRM records are retrieved through normalized list endpoints.",{"type":17,"tag":29,"props":109875,"children":109876},{},[109877],{"type":23,"value":109878},"Example requests:",{"type":17,"tag":6893,"props":109880,"children":109882},{"className":109881,"code":28336,"language":20901,"meta":23},[20899],[109883],{"type":17,"tag":6121,"props":109884,"children":109885},{"__ignoreMap":7},[109886],{"type":23,"value":28336},{"type":17,"tag":29,"props":109888,"children":109889},{},[109890],{"type":23,"value":109891},"These endpoints return standardized records regardless of whether the underlying system is Salesforce, HubSpot, or another CRM.",{"type":17,"tag":29,"props":109893,"children":109894},{},[109895],{"type":23,"value":109896},"Common filters used for syncing and analytics include:",{"type":17,"tag":80,"props":109898,"children":109899},{},[109900,109910,109920,109930],{"type":17,"tag":84,"props":109901,"children":109902},{},[109903,109908],{"type":17,"tag":6121,"props":109904,"children":109906},{"className":109905},[],[109907],{"type":23,"value":26291},{"type":23,"value":109909}," – retrieve records updated after a specific timestamp",{"type":17,"tag":84,"props":109911,"children":109912},{},[109913,109918],{"type":17,"tag":6121,"props":109914,"children":109916},{"className":109915},[],[109917],{"type":23,"value":27299},{"type":23,"value":109919}," – return records associated with a specific company",{"type":17,"tag":84,"props":109921,"children":109922},{},[109923,109928],{"type":17,"tag":6121,"props":109924,"children":109926},{"className":109925},[],[109927],{"type":23,"value":26302},{"type":23,"value":109929}," – retrieve records linked to a contact",{"type":17,"tag":84,"props":109931,"children":109932},{},[109933,109938],{"type":17,"tag":6121,"props":109934,"children":109936},{"className":109935},[],[109937],{"type":23,"value":62582},{"type":23,"value":109939}," – filter records owned by a specific salesperson",{"type":17,"tag":29,"props":109941,"children":109942},{},[109943],{"type":23,"value":109944},"Using these filters allows applications to retrieve incremental updates rather than reloading entire datasets.",{"type":17,"tag":68,"props":109946,"children":109948},{"id":109947},"writing-updates-back-to-crm-platforms",[109949],{"type":23,"value":109950},"Writing Updates Back to CRM Platforms",{"type":17,"tag":29,"props":109952,"children":109953},{},[109954],{"type":23,"value":109955},"CRM synchronization requires the ability to create and update records.",{"type":17,"tag":29,"props":109957,"children":109958},{},[109959],{"type":23,"value":109960},"Unified provides consistent write endpoints for the primary CRM objects.",{"type":17,"tag":7231,"props":109962,"children":109963},{},[109964,109988],{"type":17,"tag":7235,"props":109965,"children":109966},{},[109967],{"type":17,"tag":7239,"props":109968,"children":109969},{},[109970,109974,109978,109983],{"type":17,"tag":7243,"props":109971,"children":109972},{},[109973],{"type":23,"value":18594},{"type":17,"tag":7243,"props":109975,"children":109976},{},[109977],{"type":23,"value":42125},{"type":17,"tag":7243,"props":109979,"children":109980},{},[109981],{"type":23,"value":109982},"Update",{"type":17,"tag":7243,"props":109984,"children":109985},{},[109986],{"type":23,"value":109987},"Delete",{"type":17,"tag":7259,"props":109989,"children":109990},{},[109991,110013,110035,110057,110079],{"type":17,"tag":7239,"props":109992,"children":109993},{},[109994,109998,110003,110008],{"type":17,"tag":7266,"props":109995,"children":109996},{},[109997],{"type":23,"value":25828},{"type":17,"tag":7266,"props":109999,"children":110000},{},[110001],{"type":23,"value":110002},"POST /crm/{connection_id}/contact",{"type":17,"tag":7266,"props":110004,"children":110005},{},[110006],{"type":23,"value":110007},"PUT /crm/{connection_id}/contact/{id}",{"type":17,"tag":7266,"props":110009,"children":110010},{},[110011],{"type":23,"value":110012},"DELETE /crm/{connection_id}/contact/{id}",{"type":17,"tag":7239,"props":110014,"children":110015},{},[110016,110020,110025,110030],{"type":17,"tag":7266,"props":110017,"children":110018},{},[110019],{"type":23,"value":25846},{"type":17,"tag":7266,"props":110021,"children":110022},{},[110023],{"type":23,"value":110024},"POST /crm/{connection_id}/company",{"type":17,"tag":7266,"props":110026,"children":110027},{},[110028],{"type":23,"value":110029},"PUT /crm/{connection_id}/company/{id}",{"type":17,"tag":7266,"props":110031,"children":110032},{},[110033],{"type":23,"value":110034},"DELETE /crm/{connection_id}/company/{id}",{"type":17,"tag":7239,"props":110036,"children":110037},{},[110038,110042,110047,110052],{"type":17,"tag":7266,"props":110039,"children":110040},{},[110041],{"type":23,"value":25810},{"type":17,"tag":7266,"props":110043,"children":110044},{},[110045],{"type":23,"value":110046},"POST /crm/{connection_id}/deal",{"type":17,"tag":7266,"props":110048,"children":110049},{},[110050],{"type":23,"value":110051},"PUT /crm/{connection_id}/deal/{id}",{"type":17,"tag":7266,"props":110053,"children":110054},{},[110055],{"type":23,"value":110056},"DELETE /crm/{connection_id}/deal/{id}",{"type":17,"tag":7239,"props":110058,"children":110059},{},[110060,110064,110069,110074],{"type":17,"tag":7266,"props":110061,"children":110062},{},[110063],{"type":23,"value":14528},{"type":17,"tag":7266,"props":110065,"children":110066},{},[110067],{"type":23,"value":110068},"POST /crm/{connection_id}/event",{"type":17,"tag":7266,"props":110070,"children":110071},{},[110072],{"type":23,"value":110073},"PUT /crm/{connection_id}/event/{id}",{"type":17,"tag":7266,"props":110075,"children":110076},{},[110077],{"type":23,"value":110078},"DELETE /crm/{connection_id}/event/{id}",{"type":17,"tag":7239,"props":110080,"children":110081},{},[110082,110086,110091,110096],{"type":17,"tag":7266,"props":110083,"children":110084},{},[110085],{"type":23,"value":62749},{"type":17,"tag":7266,"props":110087,"children":110088},{},[110089],{"type":23,"value":110090},"POST /crm/{connection_id}/lead",{"type":17,"tag":7266,"props":110092,"children":110093},{},[110094],{"type":23,"value":110095},"PUT /crm/{connection_id}/lead/{id}",{"type":17,"tag":7266,"props":110097,"children":110098},{},[110099],{"type":23,"value":110100},"DELETE /crm/{connection_id}/lead/{id}",{"type":17,"tag":29,"props":110102,"children":110103},{},[110104,110106,110112],{"type":23,"value":110105},"Updates use full object replacement through ",{"type":17,"tag":6121,"props":110107,"children":110109},{"className":110108},[],[110110],{"type":23,"value":110111},"PUT",{"type":23,"value":110113},", so applications should send the complete record payload when modifying objects.",{"type":17,"tag":29,"props":110115,"children":110116},{},[110117],{"type":23,"value":110118},"These endpoints allow your product to create new contacts, update deal stages, record activities, and remove records across all supported CRM platforms.",{"type":17,"tag":68,"props":110120,"children":110122},{"id":110121},"linking-crm-records-across-platforms",[110123],{"type":23,"value":110124},"Linking CRM Records Across Platforms",{"type":17,"tag":29,"props":110126,"children":110127},{},[110128],{"type":23,"value":110129},"CRM objects include normalized association fields that define relationships between records.",{"type":17,"tag":29,"props":110131,"children":110132},{},[110133],{"type":23,"value":110134},"Key association fields include:",{"type":17,"tag":80,"props":110136,"children":110137},{},[110138,110149,110160],{"type":17,"tag":84,"props":110139,"children":110140},{},[110141,110147],{"type":17,"tag":6121,"props":110142,"children":110144},{"className":110143},[],[110145],{"type":23,"value":110146},"company_ids[]",{"type":23,"value":110148}," on contacts and deals",{"type":17,"tag":84,"props":110150,"children":110151},{},[110152,110158],{"type":17,"tag":6121,"props":110153,"children":110155},{"className":110154},[],[110156],{"type":23,"value":110157},"contact_ids[]",{"type":23,"value":110159}," on deals and companies",{"type":17,"tag":84,"props":110161,"children":110162},{},[110163,110169],{"type":17,"tag":6121,"props":110164,"children":110166},{"className":110165},[],[110167],{"type":23,"value":110168},"deal_ids[]",{"type":23,"value":110170}," on contacts and companies",{"type":17,"tag":29,"props":110172,"children":110173},{},[110174],{"type":23,"value":110175},"These arrays allow developers to build deterministic relationships between objects.",{"type":17,"tag":29,"props":110177,"children":110178},{},[110179],{"type":23,"value":3258},{"type":17,"tag":80,"props":110181,"children":110182},{},[110183,110193,110203],{"type":17,"tag":84,"props":110184,"children":110185},{},[110186,110188],{"type":23,"value":110187},"a deal references its contacts through ",{"type":17,"tag":6121,"props":110189,"children":110191},{"className":110190},[],[110192],{"type":23,"value":110157},{"type":17,"tag":84,"props":110194,"children":110195},{},[110196,110198],{"type":23,"value":110197},"a company references all related deals through ",{"type":17,"tag":6121,"props":110199,"children":110201},{"className":110200},[],[110202],{"type":23,"value":110168},{"type":17,"tag":84,"props":110204,"children":110205},{},[110206],{"type":23,"value":110207},"an activity references contacts, companies, and deals through relationship arrays",{"type":17,"tag":29,"props":110209,"children":110210},{},[110211],{"type":23,"value":110212},"Because these association fields are consistent across integrations, developers can link records without writing vendor-specific logic.",{"type":17,"tag":29,"props":110214,"children":110215},{},[110216],{"type":23,"value":110217},"List endpoints also expose relationship filters such as:",{"type":17,"tag":80,"props":110219,"children":110220},{},[110221,110229,110237],{"type":17,"tag":84,"props":110222,"children":110223},{},[110224],{"type":17,"tag":6121,"props":110225,"children":110227},{"className":110226},[],[110228],{"type":23,"value":27299},{"type":17,"tag":84,"props":110230,"children":110231},{},[110232],{"type":17,"tag":6121,"props":110233,"children":110235},{"className":110234},[],[110236],{"type":23,"value":26302},{"type":17,"tag":84,"props":110238,"children":110239},{},[110240],{"type":17,"tag":6121,"props":110241,"children":110243},{"className":110242},[],[110244],{"type":23,"value":27285},{"type":17,"tag":29,"props":110246,"children":110247},{},[110248],{"type":23,"value":110249},"These parameters allow applications to retrieve related records directly from the API.",{"type":17,"tag":68,"props":110251,"children":110253},{"id":110252},"handling-custom-crm-fields",[110254],{"type":23,"value":110255},"Handling Custom CRM Fields",{"type":17,"tag":29,"props":110257,"children":110258},{},[110259],{"type":23,"value":110260},"Most CRM systems allow organizations to define custom properties or custom objects.",{"type":17,"tag":29,"props":110262,"children":110263},{},[110264,110266,110271],{"type":23,"value":110265},"Unified supports these through its ",{"type":17,"tag":48,"props":110267,"children":110268},{},[110269],{"type":23,"value":110270},"Metadata API",{"type":23,"value":110272}," and provider-specific field access.",{"type":17,"tag":29,"props":110274,"children":110275},{},[110276,110278,110284],{"type":23,"value":110277},"Developers can define custom field schemas using the ",{"type":17,"tag":6121,"props":110279,"children":110281},{"className":110280},[],[110282],{"type":23,"value":110283},"metadata_metadata",{"type":23,"value":110285}," object by specifying:",{"type":17,"tag":80,"props":110287,"children":110288},{},[110289,110294,110299],{"type":17,"tag":84,"props":110290,"children":110291},{},[110292],{"type":23,"value":110293},"a unique slug",{"type":17,"tag":84,"props":110295,"children":110296},{},[110297],{"type":23,"value":110298},"a human-readable name",{"type":17,"tag":84,"props":110300,"children":110301},{},[110302],{"type":23,"value":110303},"a field type such as TEXT, NUMBER, DATE, or SELECT",{"type":17,"tag":29,"props":110305,"children":110306},{},[110307],{"type":23,"value":110308},"These metadata definitions act as a schema registry for custom fields.",{"type":17,"tag":29,"props":110310,"children":110311},{},[110312,110314,110319],{"type":23,"value":110313},"Custom values can then be attached to records through the ",{"type":17,"tag":6121,"props":110315,"children":110317},{"className":110316},[],[110318],{"type":23,"value":23792},{"type":23,"value":110320}," array when creating or updating objects.",{"type":17,"tag":29,"props":110322,"children":110323},{},[110324],{"type":23,"value":110325},"Example workflow:",{"type":17,"tag":6154,"props":110327,"children":110328},{},[110329,110334,110339],{"type":17,"tag":84,"props":110330,"children":110331},{},[110332],{"type":23,"value":110333},"Create a metadata definition describing the custom field.",{"type":17,"tag":84,"props":110335,"children":110336},{},[110337],{"type":23,"value":110338},"Attach values to CRM records through the metadata array.",{"type":17,"tag":84,"props":110340,"children":110341},{},[110342],{"type":23,"value":110343},"Retrieve those values when reading CRM objects.",{"type":17,"tag":29,"props":110345,"children":110346},{},[110347,110349,110354],{"type":23,"value":110348},"If an application needs access to original CRM platform fields, it can request provider-specific data by including ",{"type":17,"tag":6121,"props":110350,"children":110352},{"className":110351},[],[110353],{"type":23,"value":62389},{"type":23,"value":110355}," in the fields parameter. This returns the underlying platform payload, allowing access to fields not included in the normalized schema.",{"type":17,"tag":29,"props":110357,"children":110358},{},[110359],{"type":23,"value":110360},"This approach allows developers to maintain a consistent data model while still supporting organization-specific CRM configurations.",{"type":17,"tag":68,"props":110362,"children":110364},{"id":110363},"data-flow-for-crm-sync",[110365],{"type":23,"value":110366},"Data Flow for CRM Sync",{"type":17,"tag":29,"props":110368,"children":110369},{},[110370],{"type":23,"value":110371},"A reliable CRM synchronization pipeline typically follows this pattern.",{"type":17,"tag":239,"props":110373,"children":110375},{"id":110374},"_1-initial-backfill",[110376],{"type":23,"value":110377},"1 Initial backfill",{"type":17,"tag":29,"props":110379,"children":110380},{},[110381],{"type":23,"value":110382},"Retrieve all records using paginated list endpoints.",{"type":17,"tag":29,"props":110384,"children":110385},{},[110386],{"type":23,"value":110387},"Endpoints return up to 100 records per page. Applications iterate using limit and offset until all records are retrieved.",{"type":17,"tag":29,"props":110389,"children":110390},{},[110391,110393,110398],{"type":23,"value":110392},"During the backfill process, store the highest ",{"type":17,"tag":6121,"props":110394,"children":110396},{"className":110395},[],[110397],{"type":23,"value":25337},{"type":23,"value":110399}," value for each object.",{"type":17,"tag":239,"props":110401,"children":110403},{"id":110402},"_2-save-incremental-checkpoints",[110404],{"type":23,"value":110405},"2 Save incremental checkpoints",{"type":17,"tag":29,"props":110407,"children":110408},{},[110409,110411,110416],{"type":23,"value":110410},"Store the most recent ",{"type":17,"tag":6121,"props":110412,"children":110414},{"className":110413},[],[110415],{"type":23,"value":25337},{"type":23,"value":110417}," timestamp for each object type.",{"type":17,"tag":29,"props":110419,"children":110420},{},[110421],{"type":23,"value":110422},"Separate checkpoints should be maintained for contacts, companies, deals, and events.",{"type":17,"tag":239,"props":110424,"children":110426},{"id":110425},"_3-incremental-updates",[110427],{"type":23,"value":110428},"3 Incremental updates",{"type":17,"tag":29,"props":110430,"children":110431},{},[110432],{"type":23,"value":110433},"Subsequent sync runs request only records updated after the checkpoint.",{"type":17,"tag":29,"props":110435,"children":110436},{},[110437],{"type":23,"value":19878},{"type":17,"tag":6893,"props":110439,"children":110442},{"className":110440,"code":110441,"language":20901,"meta":23},[20899],"GET /crm/{connection_id}/contact?updated_gte=timestamp\n",[110443],{"type":17,"tag":6121,"props":110444,"children":110445},{"__ignoreMap":7},[110446],{"type":23,"value":110441},{"type":17,"tag":29,"props":110448,"children":110449},{},[110450],{"type":23,"value":110451},"The returned records are applied to the local data store and the checkpoint is advanced.",{"type":17,"tag":239,"props":110453,"children":110455},{"id":110454},"_4-choose-polling-or-webhooks",[110456],{"type":23,"value":110457},"4 Choose polling or webhooks",{"type":17,"tag":29,"props":110459,"children":110460},{},[110461],{"type":23,"value":110462},"Applications can retrieve updates through incremental polling or subscribe to webhook events.",{"type":17,"tag":29,"props":110464,"children":110465},{},[110466,110468,110473],{"type":23,"value":110467},"Polling periodically requests updates using ",{"type":17,"tag":6121,"props":110469,"children":110471},{"className":110470},[],[110472],{"type":23,"value":26291},{"type":23,"value":54},{"type":17,"tag":29,"props":110475,"children":110476},{},[110477,110481],{"type":17,"tag":133,"props":110478,"children":110479},{"href":4999},[110480],{"type":23,"value":43896},{"type":23,"value":110482}," deliver changes automatically.",{"type":17,"tag":239,"props":110484,"children":110486},{"id":110485},"_5-subscribe-to-webhooks",[110487],{"type":23,"value":110488},"5 Subscribe to webhooks",{"type":17,"tag":29,"props":110490,"children":110491},{},[110492],{"type":23,"value":109174},{"type":17,"tag":80,"props":110494,"children":110495},{},[110496,110514,110537],{"type":17,"tag":84,"props":110497,"children":110498},{},[110499,110501,110506,110507,110513],{"type":23,"value":110500},"object type (for example ",{"type":17,"tag":6121,"props":110502,"children":110504},{"className":110503},[],[110505],{"type":23,"value":109188},{"type":23,"value":75890},{"type":17,"tag":6121,"props":110508,"children":110510},{"className":110509},[],[110511],{"type":23,"value":110512},"crm.deal",{"type":23,"value":12034},{"type":17,"tag":84,"props":110515,"children":110516},{},[110517,110519,110524,110525,110530,110531,110536],{"type":23,"value":110518},"event type (",{"type":17,"tag":6121,"props":110520,"children":110522},{"className":110521},[],[110523],{"type":23,"value":109207},{"type":23,"value":11826},{"type":17,"tag":6121,"props":110526,"children":110528},{"className":110527},[],[110529],{"type":23,"value":109214},{"type":23,"value":27293},{"type":17,"tag":6121,"props":110532,"children":110534},{"className":110533},[],[110535],{"type":23,"value":109221},{"type":23,"value":12034},{"type":17,"tag":84,"props":110538,"children":110539},{},[110540],{"type":23,"value":110541},"callback URL",{"type":17,"tag":29,"props":110543,"children":110544},{},[110545,110547,110551],{"type":23,"value":110546},"Unified supports both native and ",{"type":17,"tag":133,"props":110548,"children":110549},{"href":9007},[110550],{"type":23,"value":46572},{"type":23,"value":54},{"type":17,"tag":29,"props":110553,"children":110554},{},[110555],{"type":23,"value":110556},"Native webhooks deliver immediate events when supported by the provider. Virtual webhooks simulate real-time updates through managed polling.",{"type":17,"tag":239,"props":110558,"children":110560},{"id":110559},"_6-process-events",[110561],{"type":23,"value":110562},"6 Process events",{"type":17,"tag":29,"props":110564,"children":110565},{},[110566],{"type":23,"value":110567},"Webhook payloads include the changed records along with metadata such as signatures and nonces.",{"type":17,"tag":29,"props":110569,"children":110570},{},[110571],{"type":23,"value":110572},"Applications should validate the signature, update their local database, and advance their checkpoints.",{"type":17,"tag":239,"props":110574,"children":110576},{"id":110575},"_7-periodic-reconciliation",[110577],{"type":23,"value":110578},"7 Periodic reconciliation",{"type":17,"tag":29,"props":110580,"children":110581},{},[110582],{"type":23,"value":110583},"Even with webhooks enabled, occasional full syncs ensure that missed events or integration edge cases do not cause data drift.",{"type":17,"tag":68,"props":110585,"children":110587},{"id":110586},"supported-crm-platforms",[110588],{"type":23,"value":110589},"Supported CRM Platforms",{"type":17,"tag":29,"props":110591,"children":110592},{},[110593,110594,110598],{"type":23,"value":109306},{"type":17,"tag":48,"props":110595,"children":110596},{},[110597],{"type":23,"value":109311},{"type":23,"value":109313},{"type":17,"tag":80,"props":110600,"children":110601},{},[110602,110606,110610,110614,110618,110622,110626,110630,110634],{"type":17,"tag":84,"props":110603,"children":110604},{},[110605],{"type":23,"value":3179},{"type":17,"tag":84,"props":110607,"children":110608},{},[110609],{"type":23,"value":3184},{"type":17,"tag":84,"props":110611,"children":110612},{},[110613],{"type":23,"value":26530},{"type":17,"tag":84,"props":110615,"children":110616},{},[110617],{"type":23,"value":26535},{"type":17,"tag":84,"props":110619,"children":110620},{},[110621],{"type":23,"value":61598},{"type":17,"tag":84,"props":110623,"children":110624},{},[110625],{"type":23,"value":61628},{"type":17,"tag":84,"props":110627,"children":110628},{},[110629],{"type":23,"value":61620},{"type":17,"tag":84,"props":110631,"children":110632},{},[110633],{"type":23,"value":61636},{"type":17,"tag":84,"props":110635,"children":110636},{},[110637],{"type":23,"value":109353},{"type":17,"tag":29,"props":110639,"children":110640},{},[110641],{"type":23,"value":110642},"Integrating once with the Unified CRM API allows your product to read and write CRM data across all supported providers.",{"type":17,"tag":68,"props":110644,"children":110645},{"id":73613},[110646],{"type":23,"value":73616},{"type":17,"tag":29,"props":110648,"children":110649},{},[110650],{"type":23,"value":110651},"Building CRM integrations directly requires separate connectors for each platform.",{"type":17,"tag":29,"props":110653,"children":110654},{},[110655],{"type":23,"value":34257},{"type":17,"tag":80,"props":110657,"children":110658},{},[110659,110664,110669,110674,110679],{"type":17,"tag":84,"props":110660,"children":110661},{},[110662],{"type":23,"value":110663},"normalized CRM objects across 47 platforms",{"type":17,"tag":84,"props":110665,"children":110666},{},[110667],{"type":23,"value":110668},"consistent read and write endpoints",{"type":17,"tag":84,"props":110670,"children":110671},{},[110672],{"type":23,"value":110673},"unified webhook events across providers",{"type":17,"tag":84,"props":110675,"children":110676},{},[110677],{"type":23,"value":110678},"built-in OAuth authorization flows",{"type":17,"tag":84,"props":110680,"children":110681},{},[110682],{"type":23,"value":110683},"support for custom fields and custom objects",{"type":17,"tag":29,"props":110685,"children":110686},{},[110687],{"type":23,"value":110688},"Instead of maintaining dozens of vendor integrations, your team can focus on building product features powered by CRM data.",{"type":17,"tag":29,"props":110690,"children":110691},{},[110692],{"type":23,"value":110693},"Start building CRM synchronization across Salesforce, HubSpot, and dozens of other platforms today.",{"type":17,"tag":29,"props":110695,"children":110696},{},[110697],{"type":17,"tag":133,"props":110698,"children":110700},{"href":1612,"rel":110699},[214],[110701],{"type":23,"value":44481},{"type":17,"tag":29,"props":110703,"children":110704},{},[110705],{"type":17,"tag":133,"props":110706,"children":110708},{"href":1623,"rel":110707},[214],[110709],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":110711},[110712,110713,110714,110715,110716,110717,110718,110719,110728,110729],{"id":109611,"depth":1629,"text":109614},{"id":109679,"depth":1629,"text":109682},{"id":109796,"depth":1629,"text":109799},{"id":109865,"depth":1629,"text":109868},{"id":109947,"depth":1629,"text":109950},{"id":110121,"depth":1629,"text":110124},{"id":110252,"depth":1629,"text":110255},{"id":110363,"depth":1629,"text":110366,"children":110720},[110721,110722,110723,110724,110725,110726,110727],{"id":110374,"depth":1635,"text":110377},{"id":110402,"depth":1635,"text":110405},{"id":110425,"depth":1635,"text":110428},{"id":110454,"depth":1635,"text":110457},{"id":110485,"depth":1635,"text":110488},{"id":110559,"depth":1635,"text":110562},{"id":110575,"depth":1635,"text":110578},{"id":110586,"depth":1629,"text":110589},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_crm_sync_across_salesforce_hubspot_and_47_crms_with_a_crm_api.md","blog/how_to_build_crm_sync_across_salesforce_hubspot_and_47_crms_with_a_crm_api.md","blog/how_to_build_crm_sync_across_salesforce_hubspot_and_47_crms_with_a_crm_api",{"_path":110734,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":110735,"description":110736,"img":110737,"date":108048,"tag":12,"body":110738,"_type":1677,"_id":112086,"_source":1679,"_file":112087,"_stem":112088,"_extension":1682},"/blog/how_to_build_engineering_activity_dashboards_across_github_jira_and_linear","How to Build Engineering Activity Dashboards Across GitHub, Jira, and Linear","An engineering activity dashboard is a feature inside a SaaS product that aggregates development activity across repositories and task systems, allowing teams...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_engineering_activity_dashboards_across_github_jira_and_linear-icon.png",{"type":14,"children":110739,"toc":112067},[110740,110745,110748,110755,110760,110765,110770,110776,110781,110785,110813,110817,110840,110845,110851,110856,110864,110869,110877,110882,110890,110895,110903,110908,110916,110921,110925,110930,110990,110995,111001,111006,111010,111116,111121,111125,111194,111199,111203,111296,111301,111306,111423,111428,111434,111439,111444,111464,111469,111561,111566,111570,111575,111579,111604,111608,111616,111620,111626,111631,111640,111645,111654,111659,111665,111670,111678,111687,111692,111700,111709,111714,111722,111731,111736,111744,111753,111758,111763,111769,111774,111779,111860,111864,111887,111892,111898,111903,111908,111913,111930,111935,111939,111944,111948,111956,111971,111979,111995,111999,112003,112008,112013,112017,112040,112045,112050,112058],{"type":17,"tag":18,"props":110741,"children":110743},{"id":110742},"how-to-build-engineering-activity-dashboards-across-github-jira-and-linear",[110744],{"type":23,"value":110735},{"type":17,"tag":25,"props":110746,"children":110747},{},[],{"type":17,"tag":29,"props":110749,"children":110750},{},[110751],{"type":17,"tag":33,"props":110752,"children":110753},{},[110754],{"type":23,"value":106378},{"type":17,"tag":29,"props":110756,"children":110757},{},[110758],{"type":23,"value":110759},"An engineering activity dashboard is a feature inside a SaaS product that aggregates development activity across repositories and task systems, allowing teams to track code changes, pull requests, and issue progress in one place.",{"type":17,"tag":29,"props":110761,"children":110762},{},[110763],{"type":23,"value":110764},"To build this, your product needs access to multiple data sources at once. Code activity lives in GitHub, task tracking happens in Jira or Linear, and teams need a unified view of what's happening across both.",{"type":17,"tag":29,"props":110766,"children":110767},{},[110768],{"type":23,"value":110769},"The challenge is that each platform exposes different APIs and data models. Unified provides a consistent interface across repository and task integrations, so your product can retrieve engineering activity data without building separate integrations for each tool.",{"type":17,"tag":68,"props":110771,"children":110773},{"id":110772},"why-saas-products-build-engineering-activity-dashboards",[110774],{"type":23,"value":110775},"Why SaaS Products Build Engineering Activity Dashboards",{"type":17,"tag":29,"props":110777,"children":110778},{},[110779],{"type":23,"value":110780},"Many B2B SaaS products provide engineering analytics features for their customers.",{"type":17,"tag":29,"props":110782,"children":110783},{},[110784],{"type":23,"value":24364},{"type":17,"tag":80,"props":110786,"children":110787},{},[110788,110793,110798,110803,110808],{"type":17,"tag":84,"props":110789,"children":110790},{},[110791],{"type":23,"value":110792},"Developer productivity tools",{"type":17,"tag":84,"props":110794,"children":110795},{},[110796],{"type":23,"value":110797},"Engineering intelligence platforms",{"type":17,"tag":84,"props":110799,"children":110800},{},[110801],{"type":23,"value":110802},"DevOps dashboards",{"type":17,"tag":84,"props":110804,"children":110805},{},[110806],{"type":23,"value":110807},"Sprint analytics tools",{"type":17,"tag":84,"props":110809,"children":110810},{},[110811],{"type":23,"value":110812},"AI engineering assistants",{"type":17,"tag":29,"props":110814,"children":110815},{},[110816],{"type":23,"value":24397},{"type":17,"tag":80,"props":110818,"children":110819},{},[110820,110825,110830,110835],{"type":17,"tag":84,"props":110821,"children":110822},{},[110823],{"type":23,"value":110824},"'How active is this team this week?'",{"type":17,"tag":84,"props":110826,"children":110827},{},[110828],{"type":23,"value":110829},"'Which pull requests are stuck?'",{"type":17,"tag":84,"props":110831,"children":110832},{},[110833],{"type":23,"value":110834},"'How many issues are being completed per sprint?'",{"type":17,"tag":84,"props":110836,"children":110837},{},[110838],{"type":23,"value":110839},"'Who is contributing to this repository?'",{"type":17,"tag":29,"props":110841,"children":110842},{},[110843],{"type":23,"value":110844},"Without unified access to repository and task data, these insights require manual aggregation across tools.",{"type":17,"tag":68,"props":110846,"children":110848},{"id":110847},"common-engineering-dashboard-use-cases",[110849],{"type":23,"value":110850},"Common Engineering Dashboard Use Cases",{"type":17,"tag":29,"props":110852,"children":110853},{},[110854],{"type":23,"value":110855},"Engineering dashboards typically support several workflows.",{"type":17,"tag":29,"props":110857,"children":110858},{},[110859],{"type":17,"tag":48,"props":110860,"children":110861},{},[110862],{"type":23,"value":110863},"Repository activity tracking",{"type":17,"tag":29,"props":110865,"children":110866},{},[110867],{"type":23,"value":110868},"Monitor commits, branches, and pull requests across repositories.",{"type":17,"tag":29,"props":110870,"children":110871},{},[110872],{"type":17,"tag":48,"props":110873,"children":110874},{},[110875],{"type":23,"value":110876},"Pull request analytics",{"type":17,"tag":29,"props":110878,"children":110879},{},[110880],{"type":23,"value":110881},"Track open vs. closed PRs, review cycles, and merge timelines.",{"type":17,"tag":29,"props":110883,"children":110884},{},[110885],{"type":17,"tag":48,"props":110886,"children":110887},{},[110888],{"type":23,"value":110889},"Issue and task tracking",{"type":17,"tag":29,"props":110891,"children":110892},{},[110893],{"type":23,"value":110894},"Monitor ticket status, sprint progress, and team velocity.",{"type":17,"tag":29,"props":110896,"children":110897},{},[110898],{"type":17,"tag":48,"props":110899,"children":110900},{},[110901],{"type":23,"value":110902},"Developer contribution analysis",{"type":17,"tag":29,"props":110904,"children":110905},{},[110906],{"type":23,"value":110907},"Measure contributions by user across repositories and tasks.",{"type":17,"tag":29,"props":110909,"children":110910},{},[110911],{"type":17,"tag":48,"props":110912,"children":110913},{},[110914],{"type":23,"value":110915},"Release visibility",{"type":17,"tag":29,"props":110917,"children":110918},{},[110919],{"type":23,"value":110920},"Understand what code changes are shipping and when.",{"type":17,"tag":68,"props":110922,"children":110923},{"id":24499},[110924],{"type":23,"value":24502},{"type":17,"tag":29,"props":110926,"children":110927},{},[110928],{"type":23,"value":110929},"Engineering dashboards combine data from two categories.",{"type":17,"tag":7231,"props":110931,"children":110932},{},[110933,110951],{"type":17,"tag":7235,"props":110934,"children":110935},{},[110936],{"type":17,"tag":7239,"props":110937,"children":110938},{},[110939,110943,110947],{"type":17,"tag":7243,"props":110940,"children":110941},{},[110942],{"type":23,"value":7247},{"type":17,"tag":7243,"props":110944,"children":110945},{},[110946],{"type":23,"value":24525},{"type":17,"tag":7243,"props":110948,"children":110949},{},[110950],{"type":23,"value":24530},{"type":17,"tag":7259,"props":110952,"children":110953},{},[110954,110972],{"type":17,"tag":7239,"props":110955,"children":110956},{},[110957,110962,110967],{"type":17,"tag":7266,"props":110958,"children":110959},{},[110960],{"type":23,"value":110961},"Code Repositories",{"type":17,"tag":7266,"props":110963,"children":110964},{},[110965],{"type":23,"value":110966},"Source control data from platforms like GitHub",{"type":17,"tag":7266,"props":110968,"children":110969},{},[110970],{"type":23,"value":110971},"repository, branch, commit, pull_request",{"type":17,"tag":7239,"props":110973,"children":110974},{},[110975,110980,110985],{"type":17,"tag":7266,"props":110976,"children":110977},{},[110978],{"type":23,"value":110979},"Task Management",{"type":17,"tag":7266,"props":110981,"children":110982},{},[110983],{"type":23,"value":110984},"Issue and task tracking from platforms like Jira and Linear",{"type":17,"tag":7266,"props":110986,"children":110987},{},[110988],{"type":23,"value":110989},"task, issue, project",{"type":17,"tag":29,"props":110991,"children":110992},{},[110993],{"type":23,"value":110994},"Each category provides a consistent API surface across integrations, allowing your product to retrieve activity data without per-provider logic.",{"type":17,"tag":68,"props":110996,"children":110998},{"id":110997},"unified-repository-objects-and-key-fields",[110999],{"type":23,"value":111000},"Unified Repository Objects and Key Fields",{"type":17,"tag":29,"props":111002,"children":111003},{},[111004],{"type":23,"value":111005},"Unified normalizes repository data across GitHub, GitLab, Bitbucket, and similar platforms.",{"type":17,"tag":239,"props":111007,"children":111008},{"id":17946},[111009],{"type":23,"value":18059},{"type":17,"tag":7231,"props":111011,"children":111012},{},[111013,111027],{"type":17,"tag":7235,"props":111014,"children":111015},{},[111016],{"type":17,"tag":7239,"props":111017,"children":111018},{},[111019,111023],{"type":17,"tag":7243,"props":111020,"children":111021},{},[111022],{"type":23,"value":24651},{"type":17,"tag":7243,"props":111024,"children":111025},{},[111026],{"type":23,"value":20787},{"type":17,"tag":7259,"props":111028,"children":111029},{},[111030,111042,111054,111066,111079,111092,111104],{"type":17,"tag":7239,"props":111031,"children":111032},{},[111033,111037],{"type":17,"tag":7266,"props":111034,"children":111035},{},[111036],{"type":23,"value":18766},{"type":17,"tag":7266,"props":111038,"children":111039},{},[111040],{"type":23,"value":111041},"Unique repository identifier",{"type":17,"tag":7239,"props":111043,"children":111044},{},[111045,111049],{"type":17,"tag":7266,"props":111046,"children":111047},{},[111048],{"type":23,"value":18781},{"type":17,"tag":7266,"props":111050,"children":111051},{},[111052],{"type":23,"value":111053},"Repository name",{"type":17,"tag":7239,"props":111055,"children":111056},{},[111057,111061],{"type":17,"tag":7266,"props":111058,"children":111059},{},[111060],{"type":23,"value":24679},{"type":17,"tag":7266,"props":111062,"children":111063},{},[111064],{"type":23,"value":111065},"Repository description",{"type":17,"tag":7239,"props":111067,"children":111068},{},[111069,111074],{"type":17,"tag":7266,"props":111070,"children":111071},{},[111072],{"type":23,"value":111073},"owner",{"type":17,"tag":7266,"props":111075,"children":111076},{},[111077],{"type":23,"value":111078},"Owner of the repository",{"type":17,"tag":7239,"props":111080,"children":111081},{},[111082,111087],{"type":17,"tag":7266,"props":111083,"children":111084},{},[111085],{"type":23,"value":111086},"is_private",{"type":17,"tag":7266,"props":111088,"children":111089},{},[111090],{"type":23,"value":111091},"Visibility flag",{"type":17,"tag":7239,"props":111093,"children":111094},{},[111095,111099],{"type":17,"tag":7266,"props":111096,"children":111097},{},[111098],{"type":23,"value":12107},{"type":17,"tag":7266,"props":111100,"children":111101},{},[111102],{"type":23,"value":111103},"Link to the repository",{"type":17,"tag":7239,"props":111105,"children":111106},{},[111107,111111],{"type":17,"tag":7266,"props":111108,"children":111109},{},[111110],{"type":23,"value":24743},{"type":17,"tag":7266,"props":111112,"children":111113},{},[111114],{"type":23,"value":111115},"Repository timestamps",{"type":17,"tag":29,"props":111117,"children":111118},{},[111119],{"type":23,"value":111120},"Used to identify and group engineering activity.",{"type":17,"tag":239,"props":111122,"children":111123},{"id":17951},[111124],{"type":23,"value":18072},{"type":17,"tag":7231,"props":111126,"children":111127},{},[111128,111142],{"type":17,"tag":7235,"props":111129,"children":111130},{},[111131],{"type":17,"tag":7239,"props":111132,"children":111133},{},[111134,111138],{"type":17,"tag":7243,"props":111135,"children":111136},{},[111137],{"type":23,"value":24651},{"type":17,"tag":7243,"props":111139,"children":111140},{},[111141],{"type":23,"value":20787},{"type":17,"tag":7259,"props":111143,"children":111144},{},[111145,111157,111169,111182],{"type":17,"tag":7239,"props":111146,"children":111147},{},[111148,111152],{"type":17,"tag":7266,"props":111149,"children":111150},{},[111151],{"type":23,"value":18766},{"type":17,"tag":7266,"props":111153,"children":111154},{},[111155],{"type":23,"value":111156},"Branch identifier",{"type":17,"tag":7239,"props":111158,"children":111159},{},[111160,111164],{"type":17,"tag":7266,"props":111161,"children":111162},{},[111163],{"type":23,"value":18781},{"type":17,"tag":7266,"props":111165,"children":111166},{},[111167],{"type":23,"value":111168},"Branch name",{"type":17,"tag":7239,"props":111170,"children":111171},{},[111172,111177],{"type":17,"tag":7266,"props":111173,"children":111174},{},[111175],{"type":23,"value":111176},"repo_id",{"type":17,"tag":7266,"props":111178,"children":111179},{},[111180],{"type":23,"value":111181},"Associated repository",{"type":17,"tag":7239,"props":111183,"children":111184},{},[111185,111189],{"type":17,"tag":7266,"props":111186,"children":111187},{},[111188],{"type":23,"value":24743},{"type":17,"tag":7266,"props":111190,"children":111191},{},[111192],{"type":23,"value":111193},"Branch timestamps",{"type":17,"tag":29,"props":111195,"children":111196},{},[111197],{"type":23,"value":111198},"Used to track active development branches.",{"type":17,"tag":239,"props":111200,"children":111201},{"id":17956},[111202],{"type":23,"value":18085},{"type":17,"tag":7231,"props":111204,"children":111205},{},[111206,111220],{"type":17,"tag":7235,"props":111207,"children":111208},{},[111209],{"type":17,"tag":7239,"props":111210,"children":111211},{},[111212,111216],{"type":17,"tag":7243,"props":111213,"children":111214},{},[111215],{"type":23,"value":24651},{"type":17,"tag":7243,"props":111217,"children":111218},{},[111219],{"type":23,"value":20787},{"type":17,"tag":7259,"props":111221,"children":111222},{},[111223,111235,111247,111259,111271,111284],{"type":17,"tag":7239,"props":111224,"children":111225},{},[111226,111230],{"type":17,"tag":7266,"props":111227,"children":111228},{},[111229],{"type":23,"value":18766},{"type":17,"tag":7266,"props":111231,"children":111232},{},[111233],{"type":23,"value":111234},"Commit identifier",{"type":17,"tag":7239,"props":111236,"children":111237},{},[111238,111242],{"type":17,"tag":7266,"props":111239,"children":111240},{},[111241],{"type":23,"value":24872},{"type":17,"tag":7266,"props":111243,"children":111244},{},[111245],{"type":23,"value":111246},"Commit description",{"type":17,"tag":7239,"props":111248,"children":111249},{},[111250,111254],{"type":17,"tag":7266,"props":111251,"children":111252},{},[111253],{"type":23,"value":62582},{"type":17,"tag":7266,"props":111255,"children":111256},{},[111257],{"type":23,"value":111258},"Author",{"type":17,"tag":7239,"props":111260,"children":111261},{},[111262,111266],{"type":17,"tag":7266,"props":111263,"children":111264},{},[111265],{"type":23,"value":111176},{"type":17,"tag":7266,"props":111267,"children":111268},{},[111269],{"type":23,"value":111270},"Repository reference",{"type":17,"tag":7239,"props":111272,"children":111273},{},[111274,111279],{"type":17,"tag":7266,"props":111275,"children":111276},{},[111277],{"type":23,"value":111278},"branch_id",{"type":17,"tag":7266,"props":111280,"children":111281},{},[111282],{"type":23,"value":111283},"Branch reference",{"type":17,"tag":7239,"props":111285,"children":111286},{},[111287,111291],{"type":17,"tag":7266,"props":111288,"children":111289},{},[111290],{"type":23,"value":24743},{"type":17,"tag":7266,"props":111292,"children":111293},{},[111294],{"type":23,"value":111295},"Commit timestamps",{"type":17,"tag":29,"props":111297,"children":111298},{},[111299],{"type":23,"value":111300},"Used to measure developer activity and code changes.",{"type":17,"tag":239,"props":111302,"children":111304},{"id":111303},"pull-request",[111305],{"type":23,"value":18098},{"type":17,"tag":7231,"props":111307,"children":111308},{},[111309,111323],{"type":17,"tag":7235,"props":111310,"children":111311},{},[111312],{"type":17,"tag":7239,"props":111313,"children":111314},{},[111315,111319],{"type":17,"tag":7243,"props":111316,"children":111317},{},[111318],{"type":23,"value":24651},{"type":17,"tag":7243,"props":111320,"children":111321},{},[111322],{"type":23,"value":20787},{"type":17,"tag":7259,"props":111324,"children":111325},{},[111326,111338,111350,111363,111374,111387,111399,111411],{"type":17,"tag":7239,"props":111327,"children":111328},{},[111329,111333],{"type":17,"tag":7266,"props":111330,"children":111331},{},[111332],{"type":23,"value":18766},{"type":17,"tag":7266,"props":111334,"children":111335},{},[111336],{"type":23,"value":111337},"Pull request identifier",{"type":17,"tag":7239,"props":111339,"children":111340},{},[111341,111345],{"type":17,"tag":7266,"props":111342,"children":111343},{},[111344],{"type":23,"value":19949},{"type":17,"tag":7266,"props":111346,"children":111347},{},[111348],{"type":23,"value":111349},"Open, merged, or closed",{"type":17,"tag":7239,"props":111351,"children":111352},{},[111353,111358],{"type":17,"tag":7266,"props":111354,"children":111355},{},[111356],{"type":23,"value":111357},"user_ids",{"type":17,"tag":7266,"props":111359,"children":111360},{},[111361],{"type":23,"value":111362},"Authors and reviewers",{"type":17,"tag":7239,"props":111364,"children":111365},{},[111366,111370],{"type":17,"tag":7266,"props":111367,"children":111368},{},[111369],{"type":23,"value":111176},{"type":17,"tag":7266,"props":111371,"children":111372},{},[111373],{"type":23,"value":111270},{"type":17,"tag":7239,"props":111375,"children":111376},{},[111377,111382],{"type":17,"tag":7266,"props":111378,"children":111379},{},[111380],{"type":23,"value":111381},"commit_ids",{"type":17,"tag":7266,"props":111383,"children":111384},{},[111385],{"type":23,"value":111386},"Associated commits",{"type":17,"tag":7239,"props":111388,"children":111389},{},[111390,111394],{"type":17,"tag":7266,"props":111391,"children":111392},{},[111393],{"type":23,"value":24743},{"type":17,"tag":7266,"props":111395,"children":111396},{},[111397],{"type":23,"value":111398},"PR lifecycle timestamps",{"type":17,"tag":7239,"props":111400,"children":111401},{},[111402,111406],{"type":17,"tag":7266,"props":111403,"children":111404},{},[111405],{"type":23,"value":62569},{"type":17,"tag":7266,"props":111407,"children":111408},{},[111409],{"type":23,"value":111410},"Merge or close time",{"type":17,"tag":7239,"props":111412,"children":111413},{},[111414,111418],{"type":17,"tag":7266,"props":111415,"children":111416},{},[111417],{"type":23,"value":34502},{"type":17,"tag":7266,"props":111419,"children":111420},{},[111421],{"type":23,"value":111422},"PR classification",{"type":17,"tag":29,"props":111424,"children":111425},{},[111426],{"type":23,"value":111427},"Used to track review cycles and deployment readiness.",{"type":17,"tag":68,"props":111429,"children":111431},{"id":111430},"unified-task-objects",[111432],{"type":23,"value":111433},"Unified Task Objects",{"type":17,"tag":29,"props":111435,"children":111436},{},[111437],{"type":23,"value":111438},"Task and issue tracking platforms provide structured work items.",{"type":17,"tag":29,"props":111440,"children":111441},{},[111442],{"type":23,"value":111443},"Typical objects include:",{"type":17,"tag":80,"props":111445,"children":111446},{},[111447,111451,111456,111460],{"type":17,"tag":84,"props":111448,"children":111449},{},[111450],{"type":23,"value":62676},{"type":17,"tag":84,"props":111452,"children":111453},{},[111454],{"type":23,"value":111455},"issue",{"type":17,"tag":84,"props":111457,"children":111458},{},[111459],{"type":23,"value":100801},{"type":17,"tag":84,"props":111461,"children":111462},{},[111463],{"type":23,"value":72824},{"type":17,"tag":29,"props":111465,"children":111466},{},[111467],{"type":23,"value":111468},"Key fields:",{"type":17,"tag":7231,"props":111470,"children":111471},{},[111472,111486],{"type":17,"tag":7235,"props":111473,"children":111474},{},[111475],{"type":17,"tag":7239,"props":111476,"children":111477},{},[111478,111482],{"type":17,"tag":7243,"props":111479,"children":111480},{},[111481],{"type":23,"value":24651},{"type":17,"tag":7243,"props":111483,"children":111484},{},[111485],{"type":23,"value":20787},{"type":17,"tag":7259,"props":111487,"children":111488},{},[111489,111501,111513,111525,111537,111549],{"type":17,"tag":7239,"props":111490,"children":111491},{},[111492,111496],{"type":17,"tag":7266,"props":111493,"children":111494},{},[111495],{"type":23,"value":18766},{"type":17,"tag":7266,"props":111497,"children":111498},{},[111499],{"type":23,"value":111500},"Task identifier",{"type":17,"tag":7239,"props":111502,"children":111503},{},[111504,111508],{"type":17,"tag":7266,"props":111505,"children":111506},{},[111507],{"type":23,"value":62346},{"type":17,"tag":7266,"props":111509,"children":111510},{},[111511],{"type":23,"value":111512},"Task name",{"type":17,"tag":7239,"props":111514,"children":111515},{},[111516,111520],{"type":17,"tag":7266,"props":111517,"children":111518},{},[111519],{"type":23,"value":19949},{"type":17,"tag":7266,"props":111521,"children":111522},{},[111523],{"type":23,"value":111524},"Current state",{"type":17,"tag":7239,"props":111526,"children":111527},{},[111528,111532],{"type":17,"tag":7266,"props":111529,"children":111530},{},[111531],{"type":23,"value":24730},{"type":17,"tag":7266,"props":111533,"children":111534},{},[111535],{"type":23,"value":111536},"Responsible user",{"type":17,"tag":7239,"props":111538,"children":111539},{},[111540,111544],{"type":17,"tag":7266,"props":111541,"children":111542},{},[111543],{"type":23,"value":24704},{"type":17,"tag":7266,"props":111545,"children":111546},{},[111547],{"type":23,"value":111548},"Importance level",{"type":17,"tag":7239,"props":111550,"children":111551},{},[111552,111556],{"type":17,"tag":7266,"props":111553,"children":111554},{},[111555],{"type":23,"value":24743},{"type":17,"tag":7266,"props":111557,"children":111558},{},[111559],{"type":23,"value":111560},"Task timestamps",{"type":17,"tag":29,"props":111562,"children":111563},{},[111564],{"type":23,"value":111565},"These fields allow dashboards to measure throughput and progress.",{"type":17,"tag":68,"props":111567,"children":111568},{"id":73265},[111569],{"type":23,"value":73268},{"type":17,"tag":29,"props":111571,"children":111572},{},[111573],{"type":23,"value":111574},"Customers connect their engineering tools through Unified Connect.",{"type":17,"tag":29,"props":111576,"children":111577},{},[111578],{"type":23,"value":25009},{"type":17,"tag":6154,"props":111580,"children":111581},{},[111582,111586,111591,111595],{"type":17,"tag":84,"props":111583,"children":111584},{},[111585],{"type":23,"value":25017},{"type":17,"tag":84,"props":111587,"children":111588},{},[111589],{"type":23,"value":111590},"The user selects integrations such as GitHub, Jira, or Linear.",{"type":17,"tag":84,"props":111592,"children":111593},{},[111594],{"type":23,"value":25027},{"type":17,"tag":84,"props":111596,"children":111597},{},[111598,111599,111603],{"type":23,"value":25032},{"type":17,"tag":48,"props":111600,"children":111601},{},[111602],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":111605,"children":111606},{},[111607],{"type":23,"value":25043},{"type":17,"tag":6893,"props":111609,"children":111611},{"className":111610,"code":25047,"language":20901,"meta":23},[20899],[111612],{"type":17,"tag":6121,"props":111613,"children":111614},{"__ignoreMap":7},[111615],{"type":23,"value":25047},{"type":17,"tag":29,"props":111617,"children":111618},{},[111619],{"type":23,"value":25057},{"type":17,"tag":68,"props":111621,"children":111623},{"id":111622},"retrieving-engineering-activity-data",[111624],{"type":23,"value":111625},"Retrieving Engineering Activity Data",{"type":17,"tag":29,"props":111627,"children":111628},{},[111629],{"type":23,"value":111630},"Repository activity is retrieved using:",{"type":17,"tag":6893,"props":111632,"children":111635},{"className":111633,"code":111634,"language":20901,"meta":23},[20899],"GET /repo/{connection_id}/repository\nGET /repo/{connection_id}/branch\nGET /repo/{connection_id}/commit\nGET /repo/{connection_id}/pullrequest\n",[111636],{"type":17,"tag":6121,"props":111637,"children":111638},{"__ignoreMap":7},[111639],{"type":23,"value":111634},{"type":17,"tag":29,"props":111641,"children":111642},{},[111643],{"type":23,"value":111644},"Task data is retrieved using:",{"type":17,"tag":6893,"props":111646,"children":111649},{"className":111647,"code":111648,"language":20901,"meta":23},[20899],"GET /task/{connection_id}/task\nGET /task/{connection_id}/issue\n",[111650],{"type":17,"tag":6121,"props":111651,"children":111652},{"__ignoreMap":7},[111653],{"type":23,"value":111648},{"type":17,"tag":29,"props":111655,"children":111656},{},[111657],{"type":23,"value":111658},"These endpoints return normalized objects regardless of the underlying provider.",{"type":17,"tag":68,"props":111660,"children":111662},{"id":111661},"mapping-activity-to-metrics",[111663],{"type":23,"value":111664},"Mapping Activity to Metrics",{"type":17,"tag":29,"props":111666,"children":111667},{},[111668],{"type":23,"value":111669},"Engineering dashboards derive metrics from repository and task data.",{"type":17,"tag":29,"props":111671,"children":111672},{},[111673],{"type":17,"tag":48,"props":111674,"children":111675},{},[111676],{"type":23,"value":111677},"Commit activity",{"type":17,"tag":6893,"props":111679,"children":111682},{"className":111680,"code":111681,"language":20901,"meta":23},[20899],"commit_count = count(commits)\n",[111683],{"type":17,"tag":6121,"props":111684,"children":111685},{"__ignoreMap":7},[111686],{"type":23,"value":111681},{"type":17,"tag":29,"props":111688,"children":111689},{},[111690],{"type":23,"value":111691},"Tracks code contribution volume.",{"type":17,"tag":29,"props":111693,"children":111694},{},[111695],{"type":17,"tag":48,"props":111696,"children":111697},{},[111698],{"type":23,"value":111699},"Pull request velocity",{"type":17,"tag":6893,"props":111701,"children":111704},{"className":111702,"code":111703,"language":20901,"meta":23},[20899],"PR_velocity = closed_PRs / time_period\n",[111705],{"type":17,"tag":6121,"props":111706,"children":111707},{"__ignoreMap":7},[111708],{"type":23,"value":111703},{"type":17,"tag":29,"props":111710,"children":111711},{},[111712],{"type":23,"value":111713},"Measures how quickly code is reviewed and merged.",{"type":17,"tag":29,"props":111715,"children":111716},{},[111717],{"type":17,"tag":48,"props":111718,"children":111719},{},[111720],{"type":23,"value":111721},"Issue throughput",{"type":17,"tag":6893,"props":111723,"children":111726},{"className":111724,"code":111725,"language":20901,"meta":23},[20899],"completed_tasks = count(tasks where status = done)\n",[111727],{"type":17,"tag":6121,"props":111728,"children":111729},{"__ignoreMap":7},[111730],{"type":23,"value":111725},{"type":17,"tag":29,"props":111732,"children":111733},{},[111734],{"type":23,"value":111735},"Tracks productivity.",{"type":17,"tag":29,"props":111737,"children":111738},{},[111739],{"type":17,"tag":48,"props":111740,"children":111741},{},[111742],{"type":23,"value":111743},"Cycle time",{"type":17,"tag":6893,"props":111745,"children":111748},{"className":111746,"code":111747,"language":20901,"meta":23},[20899],"cycle_time = PR.closed_at - PR.created_at\n",[111749],{"type":17,"tag":6121,"props":111750,"children":111751},{"__ignoreMap":7},[111752],{"type":23,"value":111747},{"type":17,"tag":29,"props":111754,"children":111755},{},[111756],{"type":23,"value":111757},"Measures how long changes take to ship.",{"type":17,"tag":29,"props":111759,"children":111760},{},[111761],{"type":23,"value":111762},"These metrics allow teams to understand performance across repositories and tasks.",{"type":17,"tag":68,"props":111764,"children":111766},{"id":111765},"building-an-engineering-dashboard",[111767],{"type":23,"value":111768},"Building an Engineering Dashboard",{"type":17,"tag":29,"props":111770,"children":111771},{},[111772],{"type":23,"value":111773},"A typical dashboard aggregates activity across sources.",{"type":17,"tag":29,"props":111775,"children":111776},{},[111777],{"type":23,"value":111778},"Example view:",{"type":17,"tag":7231,"props":111780,"children":111781},{},[111782,111796],{"type":17,"tag":7235,"props":111783,"children":111784},{},[111785],{"type":17,"tag":7239,"props":111786,"children":111787},{},[111788,111792],{"type":17,"tag":7243,"props":111789,"children":111790},{},[111791],{"type":23,"value":33994},{"type":17,"tag":7243,"props":111793,"children":111794},{},[111795],{"type":23,"value":33999},{"type":17,"tag":7259,"props":111797,"children":111798},{},[111799,111811,111823,111835,111848],{"type":17,"tag":7239,"props":111800,"children":111801},{},[111802,111806],{"type":17,"tag":7266,"props":111803,"children":111804},{},[111805],{"type":23,"value":18059},{"type":17,"tag":7266,"props":111807,"children":111808},{},[111809],{"type":23,"value":111810},"New commits pushed",{"type":17,"tag":7239,"props":111812,"children":111813},{},[111814,111818],{"type":17,"tag":7266,"props":111815,"children":111816},{},[111817],{"type":23,"value":18059},{"type":17,"tag":7266,"props":111819,"children":111820},{},[111821],{"type":23,"value":111822},"Pull request opened",{"type":17,"tag":7239,"props":111824,"children":111825},{},[111826,111830],{"type":17,"tag":7266,"props":111827,"children":111828},{},[111829],{"type":23,"value":18059},{"type":17,"tag":7266,"props":111831,"children":111832},{},[111833],{"type":23,"value":111834},"Pull request merged",{"type":17,"tag":7239,"props":111836,"children":111837},{},[111838,111843],{"type":17,"tag":7266,"props":111839,"children":111840},{},[111841],{"type":23,"value":111842},"Task system",{"type":17,"tag":7266,"props":111844,"children":111845},{},[111846],{"type":23,"value":111847},"Issue created",{"type":17,"tag":7239,"props":111849,"children":111850},{},[111851,111855],{"type":17,"tag":7266,"props":111852,"children":111853},{},[111854],{"type":23,"value":111842},{"type":17,"tag":7266,"props":111856,"children":111857},{},[111858],{"type":23,"value":111859},"Issue completed",{"type":17,"tag":29,"props":111861,"children":111862},{},[111863],{"type":23,"value":34056},{"type":17,"tag":6154,"props":111865,"children":111866},{},[111867,111872,111877,111882],{"type":17,"tag":84,"props":111868,"children":111869},{},[111870],{"type":23,"value":111871},"Retrieve repository and task data",{"type":17,"tag":84,"props":111873,"children":111874},{},[111875],{"type":23,"value":111876},"Aggregate activity by time period",{"type":17,"tag":84,"props":111878,"children":111879},{},[111880],{"type":23,"value":111881},"Group by repository, team, or user",{"type":17,"tag":84,"props":111883,"children":111884},{},[111885],{"type":23,"value":111886},"Display metrics and timelines",{"type":17,"tag":29,"props":111888,"children":111889},{},[111890],{"type":23,"value":111891},"Because Unified normalizes objects across integrations, this aggregation logic works across all supported platforms.",{"type":17,"tag":68,"props":111893,"children":111895},{"id":111894},"keeping-activity-updated",[111896],{"type":23,"value":111897},"Keeping Activity Updated",{"type":17,"tag":29,"props":111899,"children":111900},{},[111901],{"type":23,"value":111902},"Engineering activity changes continuously.",{"type":17,"tag":29,"props":111904,"children":111905},{},[111906],{"type":23,"value":111907},"Unified supports event-based updates across integrations.",{"type":17,"tag":29,"props":111909,"children":111910},{},[111911],{"type":23,"value":111912},"Typical events include:",{"type":17,"tag":80,"props":111914,"children":111915},{},[111916,111921,111925],{"type":17,"tag":84,"props":111917,"children":111918},{},[111919],{"type":23,"value":111920},"pull request created or updated",{"type":17,"tag":84,"props":111922,"children":111923},{},[111924],{"type":23,"value":18141},{"type":17,"tag":84,"props":111926,"children":111927},{},[111928],{"type":23,"value":111929},"task status changes",{"type":17,"tag":29,"props":111931,"children":111932},{},[111933],{"type":23,"value":111934},"Applications can subscribe to webhook events or use incremental updates via timestamps to keep dashboards synchronized.",{"type":17,"tag":68,"props":111936,"children":111937},{"id":25342},[111938],{"type":23,"value":25345},{"type":17,"tag":29,"props":111940,"children":111941},{},[111942],{"type":23,"value":111943},"Unified supports a wide range of engineering tools.",{"type":17,"tag":29,"props":111945,"children":111946},{},[111947],{"type":23,"value":24364},{"type":17,"tag":29,"props":111949,"children":111950},{},[111951],{"type":17,"tag":48,"props":111952,"children":111953},{},[111954],{"type":23,"value":111955},"Code repositories",{"type":17,"tag":80,"props":111957,"children":111958},{},[111959,111963,111967],{"type":17,"tag":84,"props":111960,"children":111961},{},[111962],{"type":23,"value":13311},{"type":17,"tag":84,"props":111964,"children":111965},{},[111966],{"type":23,"value":13320},{"type":17,"tag":84,"props":111968,"children":111969},{},[111970],{"type":23,"value":17383},{"type":17,"tag":29,"props":111972,"children":111973},{},[111974],{"type":17,"tag":48,"props":111975,"children":111976},{},[111977],{"type":23,"value":111978},"Task management",{"type":17,"tag":80,"props":111980,"children":111981},{},[111982,111986,111990],{"type":17,"tag":84,"props":111983,"children":111984},{},[111985],{"type":23,"value":12559},{"type":17,"tag":84,"props":111987,"children":111988},{},[111989],{"type":23,"value":13302},{"type":17,"tag":84,"props":111991,"children":111992},{},[111993],{"type":23,"value":111994},"other issue tracking platforms",{"type":17,"tag":29,"props":111996,"children":111997},{},[111998],{"type":23,"value":77310},{"type":17,"tag":68,"props":112000,"children":112001},{"id":883},[112002],{"type":23,"value":19178},{"type":17,"tag":29,"props":112004,"children":112005},{},[112006],{"type":23,"value":112007},"Engineering dashboards require combining data from multiple platforms.",{"type":17,"tag":29,"props":112009,"children":112010},{},[112011],{"type":23,"value":112012},"Without a unified approach, developers must build and maintain separate integrations for each repository and task system.",{"type":17,"tag":29,"props":112014,"children":112015},{},[112016],{"type":23,"value":25437},{"type":17,"tag":80,"props":112018,"children":112019},{},[112020,112025,112030,112035],{"type":17,"tag":84,"props":112021,"children":112022},{},[112023],{"type":23,"value":112024},"normalized objects across repository and task categories",{"type":17,"tag":84,"props":112026,"children":112027},{},[112028],{"type":23,"value":112029},"real-time data access from source APIs",{"type":17,"tag":84,"props":112031,"children":112032},{},[112033],{"type":23,"value":112034},"consistent authorization and data retrieval",{"type":17,"tag":84,"props":112036,"children":112037},{},[112038],{"type":23,"value":112039},"unified webhook support",{"type":17,"tag":29,"props":112041,"children":112042},{},[112043],{"type":23,"value":112044},"This allows product teams to build engineering analytics features quickly while avoiding integration maintenance overhead.",{"type":17,"tag":29,"props":112046,"children":112047},{},[112048],{"type":23,"value":112049},"Start building engineering activity dashboards across GitHub, Jira, Linear, and many other platforms today.",{"type":17,"tag":29,"props":112051,"children":112052},{},[112053,112054],{"type":23,"value":1609},{"type":17,"tag":133,"props":112055,"children":112056},{"href":37341},[112057],{"type":23,"value":1616},{"type":17,"tag":29,"props":112059,"children":112060},{},[112061,112062],{"type":23,"value":1609},{"type":17,"tag":133,"props":112063,"children":112065},{"href":1623,"rel":112064},[214],[112066],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":112068},[112069,112070,112071,112072,112078,112079,112080,112081,112082,112083,112084,112085],{"id":110772,"depth":1629,"text":110775},{"id":110847,"depth":1629,"text":110850},{"id":24499,"depth":1629,"text":24502},{"id":110997,"depth":1629,"text":111000,"children":112073},[112074,112075,112076,112077],{"id":17946,"depth":1635,"text":18059},{"id":17951,"depth":1635,"text":18072},{"id":17956,"depth":1635,"text":18085},{"id":111303,"depth":1635,"text":18098},{"id":111430,"depth":1629,"text":111433},{"id":73265,"depth":1629,"text":73268},{"id":111622,"depth":1629,"text":111625},{"id":111661,"depth":1629,"text":111664},{"id":111765,"depth":1629,"text":111768},{"id":111894,"depth":1629,"text":111897},{"id":25342,"depth":1629,"text":25345},{"id":883,"depth":1629,"text":19178},"content:blog:how_to_build_engineering_activity_dashboards_across_github_jira_and_linear.md","blog/how_to_build_engineering_activity_dashboards_across_github_jira_and_linear.md","blog/how_to_build_engineering_activity_dashboards_across_github_jira_and_linear",{"_path":112090,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":112091,"description":112092,"img":112093,"date":108048,"tag":12,"body":112094,"_type":1677,"_id":113213,"_source":1679,"_file":113214,"_stem":113215,"_extension":1682},"/blog/how_to_build_revenue_analytics_across_stripe_quickbooks_and_salesforce_with_crm_and_accounting_apis","How to Build Revenue Analytics Across Stripe, QuickBooks, and Salesforce with CRM and Accounting APIs","Revenue analytics products need data from multiple systems to present an accurate picture of business performance.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_revenue_analytics_across_stripe_quickbooks_and_salesforce_with_crm_and_accounting_apis-icon.png",{"type":14,"children":112095,"toc":113200},[112096,112101,112104,112111,112115,112120,112125,112130,112136,112141,112169,112174,112207,112212,112218,112223,112231,112236,112244,112249,112257,112262,112270,112275,112283,112288,112294,112304,112390,112395,112399,112404,112497,112502,112508,112513,112520,112525,112533,112541,112546,112555,112562,112567,112576,112583,112588,112596,112601,112607,112617,112622,112626,112652,112656,112664,112669,112673,112678,112685,112694,112699,112707,112716,112721,112729,112737,112742,112747,112780,112785,112791,112796,112804,112809,112817,112822,112830,112835,112843,112854,112866,112871,112879,112884,112889,112895,112900,112904,112949,112954,112961,112966,112976,112981,112986,113003,113007,113012,113019,113023,113062,113070,113074,113097,113105,113109,113128,113133,113137,113142,113146,113174,113179,113184,113192],{"type":17,"tag":18,"props":112097,"children":112099},{"id":112098},"how-to-build-revenue-analytics-across-stripe-quickbooks-and-salesforce-with-crm-and-accounting-apis",[112100],{"type":23,"value":112091},{"type":17,"tag":25,"props":112102,"children":112103},{},[],{"type":17,"tag":29,"props":112105,"children":112106},{},[112107],{"type":17,"tag":33,"props":112108,"children":112109},{},[112110],{"type":23,"value":106378},{"type":17,"tag":29,"props":112112,"children":112113},{},[112114],{"type":23,"value":112092},{"type":17,"tag":29,"props":112116,"children":112117},{},[112118],{"type":23,"value":112119},"Sales pipeline data typically lives in CRM platforms like Salesforce, billing and invoices are stored in accounting tools such as QuickBooks, and payments or subscriptions may be processed through Stripe.",{"type":17,"tag":29,"props":112121,"children":112122},{},[112123],{"type":23,"value":112124},"For SaaS teams building revenue dashboards, RevOps tools, or financial analytics platforms, this fragmentation creates a difficult integration challenge. Each provider exposes different APIs, authentication models, and data schemas.",{"type":17,"tag":29,"props":112126,"children":112127},{},[112128],{"type":23,"value":112129},"Unified simplifies this process by providing normalized APIs for CRM, payments, and accounting platforms. Instead of building separate integrations for Salesforce, Stripe, and QuickBooks, developers can retrieve and combine revenue data through consistent objects and endpoints.",{"type":17,"tag":68,"props":112131,"children":112133},{"id":112132},"why-saas-products-need-revenue-analytics",[112134],{"type":23,"value":112135},"Why SaaS Products Need Revenue Analytics",{"type":17,"tag":29,"props":112137,"children":112138},{},[112139],{"type":23,"value":112140},"Revenue analytics features are common in many SaaS products, including:",{"type":17,"tag":80,"props":112142,"children":112143},{},[112144,112149,112154,112159,112164],{"type":17,"tag":84,"props":112145,"children":112146},{},[112147],{"type":23,"value":112148},"RevOps platforms",{"type":17,"tag":84,"props":112150,"children":112151},{},[112152],{"type":23,"value":112153},"Financial reporting tools",{"type":17,"tag":84,"props":112155,"children":112156},{},[112157],{"type":23,"value":112158},"SaaS metrics dashboards",{"type":17,"tag":84,"props":112160,"children":112161},{},[112162],{"type":23,"value":112163},"Customer success analytics products",{"type":17,"tag":84,"props":112165,"children":112166},{},[112167],{"type":23,"value":112168},"AI-driven revenue assistants",{"type":17,"tag":29,"props":112170,"children":112171},{},[112172],{"type":23,"value":112173},"These tools rely on combining three different categories of data:",{"type":17,"tag":80,"props":112175,"children":112176},{},[112177,112187,112197],{"type":17,"tag":84,"props":112178,"children":112179},{},[112180,112185],{"type":17,"tag":48,"props":112181,"children":112182},{},[112183],{"type":23,"value":112184},"Sales pipeline data",{"type":23,"value":112186}," from CRM systems",{"type":17,"tag":84,"props":112188,"children":112189},{},[112190,112195],{"type":17,"tag":48,"props":112191,"children":112192},{},[112193],{"type":23,"value":112194},"Invoices and receivables",{"type":23,"value":112196}," from accounting platforms",{"type":17,"tag":84,"props":112198,"children":112199},{},[112200,112205],{"type":17,"tag":48,"props":112201,"children":112202},{},[112203],{"type":23,"value":112204},"Transactions and subscriptions",{"type":23,"value":112206}," from payment processors",{"type":17,"tag":29,"props":112208,"children":112209},{},[112210],{"type":23,"value":112211},"When these sources are connected, product teams can build dashboards that track the full lifecycle of revenue — from deal creation to invoice issuance to payment collection.",{"type":17,"tag":68,"props":112213,"children":112215},{"id":112214},"common-revenue-analytics-use-cases",[112216],{"type":23,"value":112217},"Common Revenue Analytics Use Cases",{"type":17,"tag":29,"props":112219,"children":112220},{},[112221],{"type":23,"value":112222},"Revenue analytics dashboards typically support several key workflows.",{"type":17,"tag":29,"props":112224,"children":112225},{},[112226],{"type":17,"tag":48,"props":112227,"children":112228},{},[112229],{"type":23,"value":112230},"Pipeline forecasting",{"type":17,"tag":29,"props":112232,"children":112233},{},[112234],{"type":23,"value":112235},"Sales teams estimate future revenue using open opportunities and their probability of closing.",{"type":17,"tag":29,"props":112237,"children":112238},{},[112239],{"type":17,"tag":48,"props":112240,"children":112241},{},[112242],{"type":23,"value":112243},"Billed revenue tracking",{"type":17,"tag":29,"props":112245,"children":112246},{},[112247],{"type":23,"value":112248},"Finance teams monitor the total value of invoices issued to customers.",{"type":17,"tag":29,"props":112250,"children":112251},{},[112252],{"type":17,"tag":48,"props":112253,"children":112254},{},[112255],{"type":23,"value":112256},"Cash collections monitoring",{"type":17,"tag":29,"props":112258,"children":112259},{},[112260],{"type":23,"value":112261},"Revenue teams track payments received against outstanding invoices.",{"type":17,"tag":29,"props":112263,"children":112264},{},[112265],{"type":17,"tag":48,"props":112266,"children":112267},{},[112268],{"type":23,"value":112269},"Recurring revenue metrics",{"type":17,"tag":29,"props":112271,"children":112272},{},[112273],{"type":23,"value":112274},"Subscription products measure MRR, ARR, renewals, and churn.",{"type":17,"tag":29,"props":112276,"children":112277},{},[112278],{"type":17,"tag":48,"props":112279,"children":112280},{},[112281],{"type":23,"value":112282},"Revenue attribution",{"type":17,"tag":29,"props":112284,"children":112285},{},[112286],{"type":23,"value":112287},"Analytics platforms connect sales pipeline data with billing records to understand how deals convert into revenue.",{"type":17,"tag":68,"props":112289,"children":112291},{"id":112290},"unified-categories-used-in-revenue-analytics",[112292],{"type":23,"value":112293},"Unified Categories Used in Revenue Analytics",{"type":17,"tag":29,"props":112295,"children":112296},{},[112297,112299,112303],{"type":23,"value":112298},"A revenue analytics product usually pulls data from three ",{"type":17,"tag":133,"props":112300,"children":112301},{"href":7691},[112302],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":112305,"children":112306},{},[112307,112325],{"type":17,"tag":7235,"props":112308,"children":112309},{},[112310],{"type":17,"tag":7239,"props":112311,"children":112312},{},[112313,112317,112321],{"type":17,"tag":7243,"props":112314,"children":112315},{},[112316],{"type":23,"value":7247},{"type":17,"tag":7243,"props":112318,"children":112319},{},[112320],{"type":23,"value":24525},{"type":17,"tag":7243,"props":112322,"children":112323},{},[112324],{"type":23,"value":24530},{"type":17,"tag":7259,"props":112326,"children":112327},{},[112328,112348,112369],{"type":17,"tag":7239,"props":112329,"children":112330},{},[112331,112339,112344],{"type":17,"tag":7266,"props":112332,"children":112333},{},[112334],{"type":17,"tag":133,"props":112335,"children":112337},{"href":107049,"rel":112336},[214],[112338],{"type":23,"value":25731},{"type":17,"tag":7266,"props":112340,"children":112341},{},[112342],{"type":23,"value":112343},"Sales pipeline and customer data from platforms like Salesforce and HubSpot",{"type":17,"tag":7266,"props":112345,"children":112346},{},[112347],{"type":23,"value":25741},{"type":17,"tag":7239,"props":112349,"children":112350},{},[112351,112359,112364],{"type":17,"tag":7266,"props":112352,"children":112353},{},[112354],{"type":17,"tag":133,"props":112355,"children":112357},{"href":108361,"rel":112356},[214],[112358],{"type":23,"value":25973},{"type":17,"tag":7266,"props":112360,"children":112361},{},[112362],{"type":23,"value":112363},"Transactions and subscription billing data from processors like Stripe",{"type":17,"tag":7266,"props":112365,"children":112366},{},[112367],{"type":23,"value":112368},"payment, subscription, refund",{"type":17,"tag":7239,"props":112370,"children":112371},{},[112372,112380,112385],{"type":17,"tag":7266,"props":112373,"children":112374},{},[112375],{"type":17,"tag":133,"props":112376,"children":112378},{"href":108383,"rel":112377},[214],[112379],{"type":23,"value":104365},{"type":17,"tag":7266,"props":112381,"children":112382},{},[112383],{"type":23,"value":112384},"Invoices and accounts-receivable data from accounting systems",{"type":17,"tag":7266,"props":112386,"children":112387},{},[112388],{"type":23,"value":112389},"invoice, contact, transaction",{"type":17,"tag":29,"props":112391,"children":112392},{},[112393],{"type":23,"value":112394},"Using these normalized categories allows developers to retrieve revenue data across many platforms without writing vendor-specific integrations.",{"type":17,"tag":68,"props":112396,"children":112397},{"id":24613},[112398],{"type":23,"value":24616},{"type":17,"tag":29,"props":112400,"children":112401},{},[112402],{"type":23,"value":112403},"Unified standardizes the core objects required for revenue analytics.",{"type":17,"tag":7231,"props":112405,"children":112406},{},[112407,112426],{"type":17,"tag":7235,"props":112408,"children":112409},{},[112410],{"type":17,"tag":7239,"props":112411,"children":112412},{},[112413,112417,112421],{"type":17,"tag":7243,"props":112414,"children":112415},{},[112416],{"type":23,"value":18594},{"type":17,"tag":7243,"props":112418,"children":112419},{},[112420],{"type":23,"value":22096},{"type":17,"tag":7243,"props":112422,"children":112423},{},[112424],{"type":23,"value":112425},"Analytics Purpose",{"type":17,"tag":7259,"props":112427,"children":112428},{},[112429,112446,112463,112480],{"type":17,"tag":7239,"props":112430,"children":112431},{},[112432,112436,112441],{"type":17,"tag":7266,"props":112433,"children":112434},{},[112435],{"type":23,"value":25810},{"type":17,"tag":7266,"props":112437,"children":112438},{},[112439],{"type":23,"value":112440},"amount, currency, probability, closing_at",{"type":17,"tag":7266,"props":112442,"children":112443},{},[112444],{"type":23,"value":112445},"Pipeline forecasting and expected revenue",{"type":17,"tag":7239,"props":112447,"children":112448},{},[112449,112453,112458],{"type":17,"tag":7266,"props":112450,"children":112451},{},[112452],{"type":23,"value":71559},{"type":17,"tag":7266,"props":112454,"children":112455},{},[112456],{"type":23,"value":112457},"total_amount, paid_amount, balance_amount, due_at, status",{"type":17,"tag":7266,"props":112459,"children":112460},{},[112461],{"type":23,"value":112462},"Tracking billed revenue and accounts receivable",{"type":17,"tag":7239,"props":112464,"children":112465},{},[112466,112470,112475],{"type":17,"tag":7266,"props":112467,"children":112468},{},[112469],{"type":23,"value":25973},{"type":17,"tag":7266,"props":112471,"children":112472},{},[112473],{"type":23,"value":112474},"total_amount, payment_method, invoice_id, currency",{"type":17,"tag":7266,"props":112476,"children":112477},{},[112478],{"type":23,"value":112479},"Measuring collected revenue and payment methods",{"type":17,"tag":7239,"props":112481,"children":112482},{},[112483,112487,112492],{"type":17,"tag":7266,"props":112484,"children":112485},{},[112486],{"type":23,"value":25991},{"type":17,"tag":7266,"props":112488,"children":112489},{},[112490],{"type":23,"value":112491},"status, current_period_start_at, current_period_end_at, interval",{"type":17,"tag":7266,"props":112493,"children":112494},{},[112495],{"type":23,"value":112496},"Calculating recurring revenue and renewal forecasts",{"type":17,"tag":29,"props":112498,"children":112499},{},[112500],{"type":23,"value":112501},"These normalized fields allow analytics tools to calculate revenue metrics consistently across platforms.",{"type":17,"tag":68,"props":112503,"children":112505},{"id":112504},"revenue-metrics-and-how-they-map-to-data",[112506],{"type":23,"value":112507},"Revenue Metrics and How They Map to Data",{"type":17,"tag":29,"props":112509,"children":112510},{},[112511],{"type":23,"value":112512},"Once data from CRM, accounting, and payment systems is combined, several key revenue metrics can be calculated.",{"type":17,"tag":29,"props":112514,"children":112515},{},[112516],{"type":17,"tag":48,"props":112517,"children":112518},{},[112519],{"type":23,"value":26091},{"type":17,"tag":29,"props":112521,"children":112522},{},[112523],{"type":23,"value":112524},"Derived from open CRM deals.",{"type":17,"tag":6893,"props":112526,"children":112528},{"className":112527,"code":26095,"language":20901,"meta":23},[20899],[112529],{"type":17,"tag":6121,"props":112530,"children":112531},{"__ignoreMap":7},[112532],{"type":23,"value":26095},{"type":17,"tag":29,"props":112534,"children":112535},{},[112536],{"type":17,"tag":48,"props":112537,"children":112538},{},[112539],{"type":23,"value":112540},"Billed revenue",{"type":17,"tag":29,"props":112542,"children":112543},{},[112544],{"type":23,"value":112545},"Calculated from invoices issued to customers.",{"type":17,"tag":6893,"props":112547,"children":112550},{"className":112548,"code":112549,"language":20901,"meta":23},[20899],"billed_revenue = sum(invoice.total_amount)\n",[112551],{"type":17,"tag":6121,"props":112552,"children":112553},{"__ignoreMap":7},[112554],{"type":23,"value":112549},{"type":17,"tag":29,"props":112556,"children":112557},{},[112558],{"type":17,"tag":48,"props":112559,"children":112560},{},[112561],{"type":23,"value":25983},{"type":17,"tag":29,"props":112563,"children":112564},{},[112565],{"type":23,"value":112566},"Based on payment transactions.",{"type":17,"tag":6893,"props":112568,"children":112571},{"className":112569,"code":112570,"language":20901,"meta":23},[20899],"collections = sum(payment.total_amount)\n",[112572],{"type":17,"tag":6121,"props":112573,"children":112574},{"__ignoreMap":7},[112575],{"type":23,"value":112570},{"type":17,"tag":29,"props":112577,"children":112578},{},[112579],{"type":17,"tag":48,"props":112580,"children":112581},{},[112582],{"type":23,"value":26001},{"type":17,"tag":29,"props":112584,"children":112585},{},[112586],{"type":23,"value":112587},"Calculated from active subscriptions.",{"type":17,"tag":6893,"props":112589,"children":112591},{"className":112590,"code":26160,"language":20901,"meta":23},[20899],[112592],{"type":17,"tag":6121,"props":112593,"children":112594},{"__ignoreMap":7},[112595],{"type":23,"value":26160},{"type":17,"tag":29,"props":112597,"children":112598},{},[112599],{"type":23,"value":112600},"These metrics allow teams to compare pipeline forecasts with actual revenue and collections.",{"type":17,"tag":68,"props":112602,"children":112604},{"id":112603},"connecting-customer-accounts",[112605],{"type":23,"value":112606},"Connecting Customer Accounts",{"type":17,"tag":29,"props":112608,"children":112609},{},[112610,112612,112616],{"type":23,"value":112611},"Customers authorize their systems using ",{"type":17,"tag":48,"props":112613,"children":112614},{},[112615],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":112618,"children":112619},{},[112620],{"type":23,"value":112621},"The authorization flow is consistent across CRM, payments, and accounting integrations.",{"type":17,"tag":29,"props":112623,"children":112624},{},[112625],{"type":23,"value":26189},{"type":17,"tag":6154,"props":112627,"children":112628},{},[112629,112633,112638,112643],{"type":17,"tag":84,"props":112630,"children":112631},{},[112632],{"type":23,"value":75678},{"type":17,"tag":84,"props":112634,"children":112635},{},[112636],{"type":23,"value":112637},"The user selects integrations such as Salesforce, Stripe, or QuickBooks.",{"type":17,"tag":84,"props":112639,"children":112640},{},[112641],{"type":23,"value":112642},"The user authorizes the selected platform.",{"type":17,"tag":84,"props":112644,"children":112645},{},[112646,112647,112651],{"type":23,"value":108970},{"type":17,"tag":48,"props":112648,"children":112649},{},[112650],{"type":23,"value":25037},{"type":23,"value":108976},{"type":17,"tag":29,"props":112653,"children":112654},{},[112655],{"type":23,"value":73316},{"type":17,"tag":6893,"props":112657,"children":112659},{"className":112658,"code":25047,"language":20901,"meta":23},[20899],[112660],{"type":17,"tag":6121,"props":112661,"children":112662},{"__ignoreMap":7},[112663],{"type":23,"value":25047},{"type":17,"tag":29,"props":112665,"children":112666},{},[112667],{"type":23,"value":112668},"All future Unified API requests reference this connection identifier.",{"type":17,"tag":68,"props":112670,"children":112671},{"id":26233},[112672],{"type":23,"value":26236},{"type":17,"tag":29,"props":112674,"children":112675},{},[112676],{"type":23,"value":112677},"Revenue analytics dashboards retrieve data from several Unified endpoints.",{"type":17,"tag":29,"props":112679,"children":112680},{},[112681],{"type":17,"tag":48,"props":112682,"children":112683},{},[112684],{"type":23,"value":107499},{"type":17,"tag":6893,"props":112686,"children":112689},{"className":112687,"code":112688,"language":20901,"meta":23},[20899],"GET /crm/{connection_id}/deal\nGET /crm/{connection_id}/contact\nGET /crm/{connection_id}/company\n",[112690],{"type":17,"tag":6121,"props":112691,"children":112692},{"__ignoreMap":7},[112693],{"type":23,"value":112688},{"type":17,"tag":29,"props":112695,"children":112696},{},[112697],{"type":23,"value":112698},"These endpoints return normalized CRM records regardless of the underlying provider.",{"type":17,"tag":29,"props":112700,"children":112701},{},[112702],{"type":17,"tag":48,"props":112703,"children":112704},{},[112705],{"type":23,"value":112706},"Accounting endpoints",{"type":17,"tag":6893,"props":112708,"children":112711},{"className":112709,"code":112710,"language":20901,"meta":23},[20899],"GET /accounting/{connection_id}/invoice\nGET /accounting/{connection_id}/contact\n",[112712],{"type":17,"tag":6121,"props":112713,"children":112714},{"__ignoreMap":7},[112715],{"type":23,"value":112710},{"type":17,"tag":29,"props":112717,"children":112718},{},[112719],{"type":23,"value":112720},"These endpoints retrieve invoices and accounting customer records.",{"type":17,"tag":29,"props":112722,"children":112723},{},[112724],{"type":17,"tag":48,"props":112725,"children":112726},{},[112727],{"type":23,"value":112728},"Payments endpoints",{"type":17,"tag":6893,"props":112730,"children":112732},{"className":112731,"code":26264,"language":20901,"meta":23},[20899],[112733],{"type":17,"tag":6121,"props":112734,"children":112735},{"__ignoreMap":7},[112736],{"type":23,"value":26264},{"type":17,"tag":29,"props":112738,"children":112739},{},[112740],{"type":23,"value":112741},"These endpoints provide payment transactions and recurring billing data.",{"type":17,"tag":29,"props":112743,"children":112744},{},[112745],{"type":23,"value":112746},"Common filters used for analytics include:",{"type":17,"tag":80,"props":112748,"children":112749},{},[112750,112760,112770],{"type":17,"tag":84,"props":112751,"children":112752},{},[112753,112758],{"type":17,"tag":6121,"props":112754,"children":112756},{"className":112755},[],[112757],{"type":23,"value":26291},{"type":23,"value":112759}," — retrieve records updated after a specific timestamp",{"type":17,"tag":84,"props":112761,"children":112762},{},[112763,112768],{"type":17,"tag":6121,"props":112764,"children":112766},{"className":112765},[],[112767],{"type":23,"value":26302},{"type":23,"value":112769}," — retrieve invoices or payments associated with a customer",{"type":17,"tag":84,"props":112771,"children":112772},{},[112773,112778],{"type":17,"tag":6121,"props":112774,"children":112776},{"className":112775},[],[112777],{"type":23,"value":109123},{"type":23,"value":112779}," — retrieve payments tied to a specific invoice",{"type":17,"tag":29,"props":112781,"children":112782},{},[112783],{"type":23,"value":112784},"Using these filters allows applications to build efficient incremental sync pipelines.",{"type":17,"tag":68,"props":112786,"children":112788},{"id":112787},"data-flow-for-revenue-analytics",[112789],{"type":23,"value":112790},"Data Flow for Revenue Analytics",{"type":17,"tag":29,"props":112792,"children":112793},{},[112794],{"type":23,"value":112795},"A typical revenue analytics pipeline follows this sequence.",{"type":17,"tag":29,"props":112797,"children":112798},{},[112799],{"type":17,"tag":48,"props":112800,"children":112801},{},[112802],{"type":23,"value":112803},"1. Connect customer systems",{"type":17,"tag":29,"props":112805,"children":112806},{},[112807],{"type":23,"value":112808},"Customers authorize Salesforce, Stripe, or QuickBooks through Unified Connect.",{"type":17,"tag":29,"props":112810,"children":112811},{},[112812],{"type":17,"tag":48,"props":112813,"children":112814},{},[112815],{"type":23,"value":112816},"2. Perform an initial backfill",{"type":17,"tag":29,"props":112818,"children":112819},{},[112820],{"type":23,"value":112821},"Retrieve deals, invoices, payments, and subscriptions using paginated list endpoints.",{"type":17,"tag":29,"props":112823,"children":112824},{},[112825],{"type":17,"tag":48,"props":112826,"children":112827},{},[112828],{"type":23,"value":112829},"3. Store data locally",{"type":17,"tag":29,"props":112831,"children":112832},{},[112833],{"type":23,"value":112834},"Save normalized objects in your application database or analytics warehouse.",{"type":17,"tag":29,"props":112836,"children":112837},{},[112838],{"type":17,"tag":48,"props":112839,"children":112840},{},[112841],{"type":23,"value":112842},"4. Run incremental syncs",{"type":17,"tag":29,"props":112844,"children":112845},{},[112846,112847,112852],{"type":23,"value":48249},{"type":17,"tag":6121,"props":112848,"children":112850},{"className":112849},[],[112851],{"type":23,"value":26291},{"type":23,"value":112853}," parameter to retrieve records updated since the last sync.",{"type":17,"tag":29,"props":112855,"children":112856},{},[112857],{"type":17,"tag":48,"props":112858,"children":112859},{},[112860,112862],{"type":23,"value":112861},"5. Subscribe to ",{"type":17,"tag":133,"props":112863,"children":112864},{"href":4999},[112865],{"type":23,"value":5002},{"type":17,"tag":29,"props":112867,"children":112868},{},[112869],{"type":23,"value":112870},"Register webhook subscriptions for objects such as deals, invoices, and payments.",{"type":17,"tag":29,"props":112872,"children":112873},{},[112874],{"type":17,"tag":48,"props":112875,"children":112876},{},[112877],{"type":23,"value":112878},"6. Update analytics metrics",{"type":17,"tag":29,"props":112880,"children":112881},{},[112882],{"type":23,"value":112883},"Recalculate revenue metrics and update the dashboard.",{"type":17,"tag":29,"props":112885,"children":112886},{},[112887],{"type":23,"value":112888},"This pattern keeps analytics data synchronized with customer systems.",{"type":17,"tag":68,"props":112890,"children":112892},{"id":112891},"keeping-revenue-data-updated",[112893],{"type":23,"value":112894},"Keeping Revenue Data Updated",{"type":17,"tag":29,"props":112896,"children":112897},{},[112898],{"type":23,"value":112899},"Unified supports webhook events that notify applications when records change.",{"type":17,"tag":29,"props":112901,"children":112902},{},[112903],{"type":23,"value":109174},{"type":17,"tag":80,"props":112905,"children":112906},{},[112907,112930,112945],{"type":17,"tag":84,"props":112908,"children":112909},{},[112910,112911,112916,112917,112922,112923,112929],{"type":23,"value":109182},{"type":17,"tag":6121,"props":112912,"children":112914},{"className":112913},[],[112915],{"type":23,"value":110512},{"type":23,"value":11826},{"type":17,"tag":6121,"props":112918,"children":112920},{"className":112919},[],[112921],{"type":23,"value":109195},{"type":23,"value":27293},{"type":17,"tag":6121,"props":112924,"children":112926},{"className":112925},[],[112927],{"type":23,"value":112928},"payment.payment",{"type":23,"value":12034},{"type":17,"tag":84,"props":112931,"children":112932},{},[112933,112934,112939,112940],{"type":23,"value":109201},{"type":17,"tag":6121,"props":112935,"children":112937},{"className":112936},[],[112938],{"type":23,"value":109207},{"type":23,"value":75890},{"type":17,"tag":6121,"props":112941,"children":112943},{"className":112942},[],[112944],{"type":23,"value":109214},{"type":17,"tag":84,"props":112946,"children":112947},{},[112948],{"type":23,"value":109226},{"type":17,"tag":29,"props":112950,"children":112951},{},[112952],{"type":23,"value":112953},"Unified supports two event delivery models:",{"type":17,"tag":29,"props":112955,"children":112956},{},[112957],{"type":17,"tag":48,"props":112958,"children":112959},{},[112960],{"type":23,"value":9024},{"type":17,"tag":29,"props":112962,"children":112963},{},[112964],{"type":23,"value":112965},"Immediate push notifications when supported by the provider.",{"type":17,"tag":29,"props":112967,"children":112968},{},[112969],{"type":17,"tag":48,"props":112970,"children":112971},{},[112972],{"type":17,"tag":133,"props":112973,"children":112974},{"href":9007},[112975],{"type":23,"value":9256},{"type":17,"tag":29,"props":112977,"children":112978},{},[112979],{"type":23,"value":112980},"Managed polling that simulates real-time events when native webhooks are unavailable.",{"type":17,"tag":29,"props":112982,"children":112983},{},[112984],{"type":23,"value":112985},"These events allow analytics dashboards to react immediately to changes such as:",{"type":17,"tag":80,"props":112987,"children":112988},{},[112989,112994,112998],{"type":17,"tag":84,"props":112990,"children":112991},{},[112992],{"type":23,"value":112993},"deal stage updates",{"type":17,"tag":84,"props":112995,"children":112996},{},[112997],{"type":23,"value":36509},{"type":17,"tag":84,"props":112999,"children":113000},{},[113001],{"type":23,"value":113002},"subscription renewals or cancellations",{"type":17,"tag":68,"props":113004,"children":113005},{"id":109287},[113006],{"type":23,"value":109290},{"type":17,"tag":29,"props":113008,"children":113009},{},[113010],{"type":23,"value":113011},"Unified supports a broad set of integrations across CRM, payments, and accounting platforms.",{"type":17,"tag":29,"props":113013,"children":113014},{},[113015],{"type":17,"tag":48,"props":113016,"children":113017},{},[113018],{"type":23,"value":107885},{"type":17,"tag":29,"props":113020,"children":113021},{},[113022],{"type":23,"value":24364},{"type":17,"tag":80,"props":113024,"children":113025},{},[113026,113030,113034,113038,113042,113046,113050,113054,113058],{"type":17,"tag":84,"props":113027,"children":113028},{},[113029],{"type":23,"value":3179},{"type":17,"tag":84,"props":113031,"children":113032},{},[113033],{"type":23,"value":3184},{"type":17,"tag":84,"props":113035,"children":113036},{},[113037],{"type":23,"value":26530},{"type":17,"tag":84,"props":113039,"children":113040},{},[113041],{"type":23,"value":26535},{"type":17,"tag":84,"props":113043,"children":113044},{},[113045],{"type":23,"value":61598},{"type":17,"tag":84,"props":113047,"children":113048},{},[113049],{"type":23,"value":61628},{"type":17,"tag":84,"props":113051,"children":113052},{},[113053],{"type":23,"value":61620},{"type":17,"tag":84,"props":113055,"children":113056},{},[113057],{"type":23,"value":61636},{"type":17,"tag":84,"props":113059,"children":113060},{},[113061],{"type":23,"value":109353},{"type":17,"tag":29,"props":113063,"children":113064},{},[113065],{"type":17,"tag":48,"props":113066,"children":113067},{},[113068],{"type":23,"value":113069},"Payment platforms (16+ integrations)",{"type":17,"tag":29,"props":113071,"children":113072},{},[113073],{"type":23,"value":24364},{"type":17,"tag":80,"props":113075,"children":113076},{},[113077,113081,113085,113089,113093],{"type":17,"tag":84,"props":113078,"children":113079},{},[113080],{"type":23,"value":26548},{"type":17,"tag":84,"props":113082,"children":113083},{},[113084],{"type":23,"value":26553},{"type":17,"tag":84,"props":113086,"children":113087},{},[113088],{"type":23,"value":14193},{"type":17,"tag":84,"props":113090,"children":113091},{},[113092],{"type":23,"value":37078},{"type":17,"tag":84,"props":113094,"children":113095},{},[113096],{"type":23,"value":37073},{"type":17,"tag":29,"props":113098,"children":113099},{},[113100],{"type":17,"tag":48,"props":113101,"children":113102},{},[113103],{"type":23,"value":113104},"Accounting platforms (41+ integrations)",{"type":17,"tag":29,"props":113106,"children":113107},{},[113108],{"type":23,"value":24364},{"type":17,"tag":80,"props":113110,"children":113111},{},[113112,113116,113120,113124],{"type":17,"tag":84,"props":113113,"children":113114},{},[113115],{"type":23,"value":3199},{"type":17,"tag":84,"props":113117,"children":113118},{},[113119],{"type":23,"value":6678},{"type":17,"tag":84,"props":113121,"children":113122},{},[113123],{"type":23,"value":38530},{"type":17,"tag":84,"props":113125,"children":113126},{},[113127],{"type":23,"value":109434},{"type":17,"tag":29,"props":113129,"children":113130},{},[113131],{"type":23,"value":113132},"This allows revenue analytics products to support many customer environments without building separate connectors.",{"type":17,"tag":68,"props":113134,"children":113135},{"id":73613},[113136],{"type":23,"value":73616},{"type":17,"tag":29,"props":113138,"children":113139},{},[113140],{"type":23,"value":113141},"Building revenue analytics features across CRM, accounting, and payment systems usually requires dozens of integrations.",{"type":17,"tag":29,"props":113143,"children":113144},{},[113145],{"type":23,"value":34257},{"type":17,"tag":80,"props":113147,"children":113148},{},[113149,113154,113159,113164,113169],{"type":17,"tag":84,"props":113150,"children":113151},{},[113152],{"type":23,"value":113153},"normalized data models across CRM, payments, and accounting categories",{"type":17,"tag":84,"props":113155,"children":113156},{},[113157],{"type":23,"value":113158},"consistent API endpoints for reading and writing data",{"type":17,"tag":84,"props":113160,"children":113161},{},[113162],{"type":23,"value":113163},"unified authorization flows across integrations",{"type":17,"tag":84,"props":113165,"children":113166},{},[113167],{"type":23,"value":113168},"webhook events that work across providers",{"type":17,"tag":84,"props":113170,"children":113171},{},[113172],{"type":23,"value":113173},"support for custom fields and provider-specific data",{"type":17,"tag":29,"props":113175,"children":113176},{},[113177],{"type":23,"value":113178},"Instead of maintaining complex integration infrastructure, product teams can focus on building revenue analytics features and delivering insights to their users.",{"type":17,"tag":29,"props":113180,"children":113181},{},[113182],{"type":23,"value":113183},"Start building revenue analytics across Stripe, QuickBooks, Salesforce, and dozens of other platforms today.",{"type":17,"tag":29,"props":113185,"children":113186},{},[113187],{"type":17,"tag":133,"props":113188,"children":113190},{"href":1612,"rel":113189},[214],[113191],{"type":23,"value":44481},{"type":17,"tag":29,"props":113193,"children":113194},{},[113195],{"type":17,"tag":133,"props":113196,"children":113198},{"href":1623,"rel":113197},[214],[113199],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":113201},[113202,113203,113204,113205,113206,113207,113208,113209,113210,113211,113212],{"id":112132,"depth":1629,"text":112135},{"id":112214,"depth":1629,"text":112217},{"id":112290,"depth":1629,"text":112293},{"id":24613,"depth":1629,"text":24616},{"id":112504,"depth":1629,"text":112507},{"id":112603,"depth":1629,"text":112606},{"id":26233,"depth":1629,"text":26236},{"id":112787,"depth":1629,"text":112790},{"id":112891,"depth":1629,"text":112894},{"id":109287,"depth":1629,"text":109290},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_revenue_analytics_across_stripe_quickbooks_and_salesforce_with_crm_and_accounting_apis.md","blog/how_to_build_revenue_analytics_across_stripe_quickbooks_and_salesforce_with_crm_and_accounting_apis.md","blog/how_to_build_revenue_analytics_across_stripe_quickbooks_and_salesforce_with_crm_and_accounting_apis",{"_path":113217,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":113218,"description":113219,"img":113220,"date":108048,"tag":12,"body":113221,"_type":1677,"_id":114394,"_source":1679,"_file":114395,"_stem":114396,"_extension":1682},"/blog/how_to_build_scheduling_into_your_product_across_google_calendar_outlook_and_zoom","How to Build Scheduling Into Your Product Across Google Calendar, Outlook, and Zoom","Embedded scheduling is a feature inside a SaaS product that allows users to create meetings using their existing calendar tools, without leaving the product....","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_scheduling_into_your_product_across_google_calendar_outlook_and_zoom-icon.png",{"type":14,"children":113222,"toc":114375},[113223,113228,113231,113238,113243,113248,113260,113266,113271,113275,113302,113307,113312,113361,113367,113372,113380,113385,113393,113398,113406,113411,113419,113424,113432,113437,113443,113448,113488,113493,113499,113508,113512,113650,113654,113662,113668,113673,113677,113702,113706,113714,113719,113725,113730,113735,113744,113750,113819,113825,113830,113875,113881,113904,113909,113927,113932,113938,113943,113952,113958,114060,114065,114074,114085,114091,114102,114107,114122,114127,114153,114158,114164,114169,114174,114201,114206,114225,114230,114253,114257,114262,114266,114293,114305,114309,114314,114319,114323,114349,114354,114359,114367],{"type":17,"tag":18,"props":113224,"children":113226},{"id":113225},"how-to-build-scheduling-into-your-product-across-google-calendar-outlook-and-zoom",[113227],{"type":23,"value":113218},{"type":17,"tag":25,"props":113229,"children":113230},{},[],{"type":17,"tag":29,"props":113232,"children":113233},{},[113234],{"type":17,"tag":33,"props":113235,"children":113236},{},[113237],{"type":23,"value":106378},{"type":17,"tag":29,"props":113239,"children":113240},{},[113241],{"type":23,"value":113242},"Embedded scheduling is a feature inside a SaaS product that allows users to create meetings using their existing calendar tools, without leaving the product. It typically includes availability checking, time selection, and automatic calendar event creation.",{"type":17,"tag":29,"props":113244,"children":113245},{},[113246],{"type":23,"value":113247},"To build this, your product needs access to calendar data across providers like Google Calendar, Microsoft Outlook, and Zoom. Each platform has different APIs and data models for events, availability, and conferencing.",{"type":17,"tag":29,"props":113249,"children":113250},{},[113251,113253,113258],{"type":23,"value":113252},"Unified provides a consistent ",{"type":17,"tag":133,"props":113254,"children":113255},{"href":13708},[113256],{"type":23,"value":113257},"Calendar & Meetings API",{"type":23,"value":113259}," that lets your product retrieve availability, create events, and attach conferencing details across integrations.",{"type":17,"tag":68,"props":113261,"children":113263},{"id":113262},"why-saas-products-build-scheduling-features",[113264],{"type":23,"value":113265},"Why SaaS Products Build Scheduling Features",{"type":17,"tag":29,"props":113267,"children":113268},{},[113269],{"type":23,"value":113270},"Many B2B SaaS products include scheduling functionality for their customers.",{"type":17,"tag":29,"props":113272,"children":113273},{},[113274],{"type":23,"value":24364},{"type":17,"tag":80,"props":113276,"children":113277},{},[113278,113283,113288,113293,113297],{"type":17,"tag":84,"props":113279,"children":113280},{},[113281],{"type":23,"value":113282},"Sales demo booking tools",{"type":17,"tag":84,"props":113284,"children":113285},{},[113286],{"type":23,"value":113287},"Customer onboarding platforms",{"type":17,"tag":84,"props":113289,"children":113290},{},[113291],{"type":23,"value":113292},"Interview scheduling tools",{"type":17,"tag":84,"props":113294,"children":113295},{},[113296],{"type":23,"value":24382},{"type":17,"tag":84,"props":113298,"children":113299},{},[113300],{"type":23,"value":113301},"Support scheduling tools",{"type":17,"tag":29,"props":113303,"children":113304},{},[113305],{"type":23,"value":113306},"These products allow users to book meetings without switching to external tools.",{"type":17,"tag":29,"props":113308,"children":113309},{},[113310],{"type":23,"value":113311},"Typical requirements include:",{"type":17,"tag":80,"props":113313,"children":113314},{},[113315,113325,113335,113345,113353],{"type":17,"tag":84,"props":113316,"children":113317},{},[113318,113323],{"type":17,"tag":48,"props":113319,"children":113320},{},[113321],{"type":23,"value":113322},"Checking availability",{"type":23,"value":113324}," across one or more calendars",{"type":17,"tag":84,"props":113326,"children":113327},{},[113328,113333],{"type":17,"tag":48,"props":113329,"children":113330},{},[113331],{"type":23,"value":113332},"Creating meetings",{"type":23,"value":113334}," directly inside the product",{"type":17,"tag":84,"props":113336,"children":113337},{},[113338,113343],{"type":17,"tag":48,"props":113339,"children":113340},{},[113341],{"type":23,"value":113342},"Adding video conferencing links",{"type":23,"value":113344}," automatically",{"type":17,"tag":84,"props":113346,"children":113347},{},[113348],{"type":17,"tag":48,"props":113349,"children":113350},{},[113351],{"type":23,"value":113352},"Handling rescheduling and cancellations",{"type":17,"tag":84,"props":113354,"children":113355},{},[113356],{"type":17,"tag":48,"props":113357,"children":113358},{},[113359],{"type":23,"value":113360},"Coordinating multiple participants",{"type":17,"tag":68,"props":113362,"children":113364},{"id":113363},"common-scheduling-use-cases",[113365],{"type":23,"value":113366},"Common Scheduling Use Cases",{"type":17,"tag":29,"props":113368,"children":113369},{},[113370],{"type":23,"value":113371},"Scheduling features usually support several workflows.",{"type":17,"tag":29,"props":113373,"children":113374},{},[113375],{"type":17,"tag":48,"props":113376,"children":113377},{},[113378],{"type":23,"value":113379},"Booking flows",{"type":17,"tag":29,"props":113381,"children":113382},{},[113383],{"type":23,"value":113384},"Users select a time slot based on availability.",{"type":17,"tag":29,"props":113386,"children":113387},{},[113388],{"type":17,"tag":48,"props":113389,"children":113390},{},[113391],{"type":23,"value":113392},"Sales demos",{"type":17,"tag":29,"props":113394,"children":113395},{},[113396],{"type":23,"value":113397},"Prospects schedule meetings with sales teams.",{"type":17,"tag":29,"props":113399,"children":113400},{},[113401],{"type":17,"tag":48,"props":113402,"children":113403},{},[113404],{"type":23,"value":113405},"Onboarding sessions",{"type":17,"tag":29,"props":113407,"children":113408},{},[113409],{"type":23,"value":113410},"Customers book implementation or onboarding calls.",{"type":17,"tag":29,"props":113412,"children":113413},{},[113414],{"type":17,"tag":48,"props":113415,"children":113416},{},[113417],{"type":23,"value":113418},"Support calls",{"type":17,"tag":29,"props":113420,"children":113421},{},[113422],{"type":23,"value":113423},"Users schedule time with support teams.",{"type":17,"tag":29,"props":113425,"children":113426},{},[113427],{"type":17,"tag":48,"props":113428,"children":113429},{},[113430],{"type":23,"value":113431},"Internal coordination",{"type":17,"tag":29,"props":113433,"children":113434},{},[113435],{"type":23,"value":113436},"Teams schedule meetings across multiple participants.",{"type":17,"tag":68,"props":113438,"children":113440},{"id":113439},"unified-category-used",[113441],{"type":23,"value":113442},"Unified Category Used",{"type":17,"tag":29,"props":113444,"children":113445},{},[113446],{"type":23,"value":113447},"Scheduling relies on the Calendar & Meetings category.",{"type":17,"tag":7231,"props":113449,"children":113450},{},[113451,113469],{"type":17,"tag":7235,"props":113452,"children":113453},{},[113454],{"type":17,"tag":7239,"props":113455,"children":113456},{},[113457,113461,113465],{"type":17,"tag":7243,"props":113458,"children":113459},{},[113460],{"type":23,"value":7247},{"type":17,"tag":7243,"props":113462,"children":113463},{},[113464],{"type":23,"value":24525},{"type":17,"tag":7243,"props":113466,"children":113467},{},[113468],{"type":23,"value":24530},{"type":17,"tag":7259,"props":113470,"children":113471},{},[113472],{"type":17,"tag":7239,"props":113473,"children":113474},{},[113475,113479,113484],{"type":17,"tag":7266,"props":113476,"children":113477},{},[113478],{"type":23,"value":73899},{"type":17,"tag":7266,"props":113480,"children":113481},{},[113482],{"type":23,"value":113483},"Calendar events and availability across platforms like Google Calendar and Outlook",{"type":17,"tag":7266,"props":113485,"children":113486},{},[113487],{"type":23,"value":73973},{"type":17,"tag":29,"props":113489,"children":113490},{},[113491],{"type":23,"value":113492},"This category provides consistent access to events and availability across integrations.",{"type":17,"tag":68,"props":113494,"children":113496},{"id":113495},"unified-calendar-event-object",[113497],{"type":23,"value":113498},"Unified Calendar Event Object",{"type":17,"tag":29,"props":113500,"children":113501},{},[113502,113503,113507],{"type":23,"value":6712},{"type":17,"tag":48,"props":113504,"children":113505},{},[113506],{"type":23,"value":73973},{"type":23,"value":73975},{"type":17,"tag":29,"props":113509,"children":113510},{},[113511],{"type":23,"value":72497},{"type":17,"tag":7231,"props":113513,"children":113514},{},[113515,113529],{"type":17,"tag":7235,"props":113516,"children":113517},{},[113518],{"type":17,"tag":7239,"props":113519,"children":113520},{},[113521,113525],{"type":17,"tag":7243,"props":113522,"children":113523},{},[113524],{"type":23,"value":24651},{"type":17,"tag":7243,"props":113526,"children":113527},{},[113528],{"type":23,"value":20787},{"type":17,"tag":7259,"props":113530,"children":113531},{},[113532,113544,113555,113567,113579,113591,113602,113614,113626,113638],{"type":17,"tag":7239,"props":113533,"children":113534},{},[113535,113539],{"type":17,"tag":7266,"props":113536,"children":113537},{},[113538],{"type":23,"value":18766},{"type":17,"tag":7266,"props":113540,"children":113541},{},[113542],{"type":23,"value":113543},"Unique event identifier",{"type":17,"tag":7239,"props":113545,"children":113546},{},[113547,113551],{"type":17,"tag":7266,"props":113548,"children":113549},{},[113550],{"type":23,"value":74028},{"type":17,"tag":7266,"props":113552,"children":113553},{},[113554],{"type":23,"value":74033},{"type":17,"tag":7239,"props":113556,"children":113557},{},[113558,113562],{"type":17,"tag":7266,"props":113559,"children":113560},{},[113561],{"type":23,"value":21051},{"type":17,"tag":7266,"props":113563,"children":113564},{},[113565],{"type":23,"value":113566},"Start time",{"type":17,"tag":7239,"props":113568,"children":113569},{},[113570,113574],{"type":17,"tag":7266,"props":113571,"children":113572},{},[113573],{"type":23,"value":21060},{"type":17,"tag":7266,"props":113575,"children":113576},{},[113577],{"type":23,"value":113578},"End time",{"type":17,"tag":7239,"props":113580,"children":113581},{},[113582,113586],{"type":17,"tag":7266,"props":113583,"children":113584},{},[113585],{"type":23,"value":22305},{"type":17,"tag":7266,"props":113587,"children":113588},{},[113589],{"type":23,"value":113590},"Time zone",{"type":17,"tag":7239,"props":113592,"children":113593},{},[113594,113598],{"type":17,"tag":7266,"props":113595,"children":113596},{},[113597],{"type":23,"value":74080},{"type":17,"tag":7266,"props":113599,"children":113600},{},[113601],{"type":23,"value":74085},{"type":17,"tag":7239,"props":113603,"children":113604},{},[113605,113609],{"type":17,"tag":7266,"props":113606,"children":113607},{},[113608],{"type":23,"value":74116},{"type":17,"tag":7266,"props":113610,"children":113611},{},[113612],{"type":23,"value":113613},"Event creator",{"type":17,"tag":7239,"props":113615,"children":113616},{},[113617,113621],{"type":17,"tag":7266,"props":113618,"children":113619},{},[113620],{"type":23,"value":74098},{"type":17,"tag":7266,"props":113622,"children":113623},{},[113624],{"type":23,"value":113625},"Video conferencing details",{"type":17,"tag":7239,"props":113627,"children":113628},{},[113629,113633],{"type":17,"tag":7266,"props":113630,"children":113631},{},[113632],{"type":23,"value":74134},{"type":17,"tag":7266,"props":113634,"children":113635},{},[113636],{"type":23,"value":113637},"Physical or virtual location",{"type":17,"tag":7239,"props":113639,"children":113640},{},[113641,113645],{"type":17,"tag":7266,"props":113642,"children":113643},{},[113644],{"type":23,"value":12107},{"type":17,"tag":7266,"props":113646,"children":113647},{},[113648],{"type":23,"value":113649},"Link to the event",{"type":17,"tag":29,"props":113651,"children":113652},{},[113653],{"type":23,"value":74166},{"type":17,"tag":6893,"props":113655,"children":113657},{"className":113656,"code":74170,"language":20901,"meta":23},[20899],[113658],{"type":17,"tag":6121,"props":113659,"children":113660},{"__ignoreMap":7},[113661],{"type":23,"value":74170},{"type":17,"tag":68,"props":113663,"children":113665},{"id":113664},"connecting-customer-calendars",[113666],{"type":23,"value":113667},"Connecting Customer Calendars",{"type":17,"tag":29,"props":113669,"children":113670},{},[113671],{"type":23,"value":113672},"Customers authorize their calendars using Unified Connect.",{"type":17,"tag":29,"props":113674,"children":113675},{},[113676],{"type":23,"value":25009},{"type":17,"tag":6154,"props":113678,"children":113679},{},[113680,113684,113689,113693],{"type":17,"tag":84,"props":113681,"children":113682},{},[113683],{"type":23,"value":25017},{"type":17,"tag":84,"props":113685,"children":113686},{},[113687],{"type":23,"value":113688},"The user selects Google Calendar, Outlook, or another provider.",{"type":17,"tag":84,"props":113690,"children":113691},{},[113692],{"type":23,"value":25027},{"type":17,"tag":84,"props":113694,"children":113695},{},[113696,113697,113701],{"type":23,"value":25032},{"type":17,"tag":48,"props":113698,"children":113699},{},[113700],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":113703,"children":113704},{},[113705],{"type":23,"value":25043},{"type":17,"tag":6893,"props":113707,"children":113709},{"className":113708,"code":25047,"language":20901,"meta":23},[20899],[113710],{"type":17,"tag":6121,"props":113711,"children":113712},{"__ignoreMap":7},[113713],{"type":23,"value":25047},{"type":17,"tag":29,"props":113715,"children":113716},{},[113717],{"type":23,"value":113718},"All subsequent API calls reference this identifier.",{"type":17,"tag":68,"props":113720,"children":113722},{"id":113721},"checking-availability-freebusy",[113723],{"type":23,"value":113724},"Checking Availability (Free/Busy)",{"type":17,"tag":29,"props":113726,"children":113727},{},[113728],{"type":23,"value":113729},"Scheduling requires checking calendar availability before creating events.",{"type":17,"tag":29,"props":113731,"children":113732},{},[113733],{"type":23,"value":113734},"Unified provides a busy endpoint:",{"type":17,"tag":6893,"props":113736,"children":113739},{"className":113737,"code":113738,"language":20901,"meta":23},[20899],"GET /calendar/{connection_id}/busy\n",[113740],{"type":17,"tag":6121,"props":113741,"children":113742},{"__ignoreMap":7},[113743],{"type":23,"value":113738},{"type":17,"tag":239,"props":113745,"children":113747},{"id":113746},"key-query-parameters",[113748],{"type":23,"value":113749},"Key query parameters",{"type":17,"tag":7231,"props":113751,"children":113752},{},[113753,113767],{"type":17,"tag":7235,"props":113754,"children":113755},{},[113756],{"type":17,"tag":7239,"props":113757,"children":113758},{},[113759,113763],{"type":17,"tag":7243,"props":113760,"children":113761},{},[113762],{"type":23,"value":48293},{"type":17,"tag":7243,"props":113764,"children":113765},{},[113766],{"type":23,"value":20787},{"type":17,"tag":7259,"props":113768,"children":113769},{},[113770,113782,113794,113807],{"type":17,"tag":7239,"props":113771,"children":113772},{},[113773,113777],{"type":17,"tag":7266,"props":113774,"children":113775},{},[113776],{"type":23,"value":109144},{"type":17,"tag":7266,"props":113778,"children":113779},{},[113780],{"type":23,"value":113781},"Start of the time window",{"type":17,"tag":7239,"props":113783,"children":113784},{},[113785,113789],{"type":17,"tag":7266,"props":113786,"children":113787},{},[113788],{"type":23,"value":109151},{"type":17,"tag":7266,"props":113790,"children":113791},{},[113792],{"type":23,"value":113793},"End of the time window",{"type":17,"tag":7239,"props":113795,"children":113796},{},[113797,113802],{"type":17,"tag":7266,"props":113798,"children":113799},{},[113800],{"type":23,"value":113801},"calendar_id",{"type":17,"tag":7266,"props":113803,"children":113804},{},[113805],{"type":23,"value":113806},"Filter by calendar",{"type":17,"tag":7239,"props":113808,"children":113809},{},[113810,113814],{"type":17,"tag":7266,"props":113811,"children":113812},{},[113813],{"type":23,"value":62582},{"type":17,"tag":7266,"props":113815,"children":113816},{},[113817],{"type":23,"value":113818},"Filter by user",{"type":17,"tag":239,"props":113820,"children":113822},{"id":113821},"response-structure",[113823],{"type":23,"value":113824},"Response structure",{"type":17,"tag":29,"props":113826,"children":113827},{},[113828],{"type":23,"value":113829},"The API returns busy time blocks:",{"type":17,"tag":80,"props":113831,"children":113832},{},[113833,113843,113853,113864],{"type":17,"tag":84,"props":113834,"children":113835},{},[113836,113841],{"type":17,"tag":6121,"props":113837,"children":113839},{"className":113838},[],[113840],{"type":23,"value":21051},{"type":23,"value":113842}," – beginning of busy interval",{"type":17,"tag":84,"props":113844,"children":113845},{},[113846,113851],{"type":17,"tag":6121,"props":113847,"children":113849},{"className":113848},[],[113850],{"type":23,"value":21060},{"type":23,"value":113852}," – end of busy interval",{"type":17,"tag":84,"props":113854,"children":113855},{},[113856,113862],{"type":17,"tag":6121,"props":113857,"children":113859},{"className":113858},[],[113860],{"type":23,"value":113861},"time_zone",{"type":23,"value":113863}," – time zone of the interval",{"type":17,"tag":84,"props":113865,"children":113866},{},[113867,113873],{"type":17,"tag":6121,"props":113868,"children":113870},{"className":113869},[],[113871],{"type":23,"value":113872},"busy[]",{"type":23,"value":113874}," – list of unavailable time slots",{"type":17,"tag":239,"props":113876,"children":113878},{"id":113877},"how-to-compute-availability",[113879],{"type":23,"value":113880},"How to compute availability",{"type":17,"tag":6154,"props":113882,"children":113883},{},[113884,113889,113894,113899],{"type":17,"tag":84,"props":113885,"children":113886},{},[113887],{"type":23,"value":113888},"Request busy intervals within a time window",{"type":17,"tag":84,"props":113890,"children":113891},{},[113892],{"type":23,"value":113893},"Identify all busy slots",{"type":17,"tag":84,"props":113895,"children":113896},{},[113897],{"type":23,"value":113898},"Compute the gaps between them",{"type":17,"tag":84,"props":113900,"children":113901},{},[113902],{"type":23,"value":113903},"Use those gaps as available time slots",{"type":17,"tag":29,"props":113905,"children":113906},{},[113907],{"type":23,"value":113908},"For multi-participant scheduling:",{"type":17,"tag":80,"props":113910,"children":113911},{},[113912,113917,113922],{"type":17,"tag":84,"props":113913,"children":113914},{},[113915],{"type":23,"value":113916},"retrieve busy intervals for each participant",{"type":17,"tag":84,"props":113918,"children":113919},{},[113920],{"type":23,"value":113921},"intersect available slots",{"type":17,"tag":84,"props":113923,"children":113924},{},[113925],{"type":23,"value":113926},"return mutually available times",{"type":17,"tag":29,"props":113928,"children":113929},{},[113930],{"type":23,"value":113931},"This allows your product to generate booking options across multiple calendars.",{"type":17,"tag":68,"props":113933,"children":113935},{"id":113934},"creating-calendar-events",[113936],{"type":23,"value":113937},"Creating Calendar Events",{"type":17,"tag":29,"props":113939,"children":113940},{},[113941],{"type":23,"value":113942},"Once a time slot is selected, create a meeting using:",{"type":17,"tag":6893,"props":113944,"children":113947},{"className":113945,"code":113946,"language":20901,"meta":23},[20899],"POST /calendar/{connection_id}/event\n",[113948],{"type":17,"tag":6121,"props":113949,"children":113950},{"__ignoreMap":7},[113951],{"type":23,"value":113946},{"type":17,"tag":239,"props":113953,"children":113955},{"id":113954},"key-fields-for-scheduling",[113956],{"type":23,"value":113957},"Key fields for scheduling",{"type":17,"tag":7231,"props":113959,"children":113960},{},[113961,113975],{"type":17,"tag":7235,"props":113962,"children":113963},{},[113964],{"type":17,"tag":7239,"props":113965,"children":113966},{},[113967,113971],{"type":17,"tag":7243,"props":113968,"children":113969},{},[113970],{"type":23,"value":24651},{"type":17,"tag":7243,"props":113972,"children":113973},{},[113974],{"type":23,"value":20787},{"type":17,"tag":7259,"props":113976,"children":113977},{},[113978,113990,114001,114012,114024,114036,114048],{"type":17,"tag":7239,"props":113979,"children":113980},{},[113981,113985],{"type":17,"tag":7266,"props":113982,"children":113983},{},[113984],{"type":23,"value":62346},{"type":17,"tag":7266,"props":113986,"children":113987},{},[113988],{"type":23,"value":113989},"Meeting subject",{"type":17,"tag":7239,"props":113991,"children":113992},{},[113993,113997],{"type":17,"tag":7266,"props":113994,"children":113995},{},[113996],{"type":23,"value":21051},{"type":17,"tag":7266,"props":113998,"children":113999},{},[114000],{"type":23,"value":113566},{"type":17,"tag":7239,"props":114002,"children":114003},{},[114004,114008],{"type":17,"tag":7266,"props":114005,"children":114006},{},[114007],{"type":23,"value":21060},{"type":17,"tag":7266,"props":114009,"children":114010},{},[114011],{"type":23,"value":113578},{"type":17,"tag":7239,"props":114013,"children":114014},{},[114015,114019],{"type":17,"tag":7266,"props":114016,"children":114017},{},[114018],{"type":23,"value":74080},{"type":17,"tag":7266,"props":114020,"children":114021},{},[114022],{"type":23,"value":114023},"Participants",{"type":17,"tag":7239,"props":114025,"children":114026},{},[114027,114031],{"type":17,"tag":7266,"props":114028,"children":114029},{},[114030],{"type":23,"value":74098},{"type":17,"tag":7266,"props":114032,"children":114033},{},[114034],{"type":23,"value":114035},"Video meeting details",{"type":17,"tag":7239,"props":114037,"children":114038},{},[114039,114043],{"type":17,"tag":7266,"props":114040,"children":114041},{},[114042],{"type":23,"value":74134},{"type":17,"tag":7266,"props":114044,"children":114045},{},[114046],{"type":23,"value":114047},"Physical location",{"type":17,"tag":7239,"props":114049,"children":114050},{},[114051,114055],{"type":17,"tag":7266,"props":114052,"children":114053},{},[114054],{"type":23,"value":24679},{"type":17,"tag":7266,"props":114056,"children":114057},{},[114058],{"type":23,"value":114059},"Notes or agenda",{"type":17,"tag":29,"props":114061,"children":114062},{},[114063],{"type":23,"value":114064},"Example title:",{"type":17,"tag":6893,"props":114066,"children":114069},{"className":114067,"code":114068,"language":20901,"meta":23},[20899],"Product Demo – Acme Corp\n",[114070],{"type":17,"tag":6121,"props":114071,"children":114072},{"__ignoreMap":7},[114073],{"type":23,"value":114068},{"type":17,"tag":29,"props":114075,"children":114076},{},[114077,114078,114083],{"type":23,"value":6712},{"type":17,"tag":6121,"props":114079,"children":114081},{"className":114080},[],[114082],{"type":23,"value":74080},{"type":23,"value":114084}," field ensures all participants receive invites.",{"type":17,"tag":68,"props":114086,"children":114088},{"id":114087},"adding-video-conferencing",[114089],{"type":23,"value":114090},"Adding Video Conferencing",{"type":17,"tag":29,"props":114092,"children":114093},{},[114094,114095,114100],{"type":23,"value":6712},{"type":17,"tag":6121,"props":114096,"children":114098},{"className":114097},[],[114099],{"type":23,"value":74098},{"type":23,"value":114101}," field allows you to include meeting links.",{"type":17,"tag":29,"props":114103,"children":114104},{},[114105],{"type":23,"value":114106},"Typical values include:",{"type":17,"tag":80,"props":114108,"children":114109},{},[114110,114114,114118],{"type":17,"tag":84,"props":114111,"children":114112},{},[114113],{"type":23,"value":14472},{"type":17,"tag":84,"props":114115,"children":114116},{},[114117],{"type":23,"value":14045},{"type":17,"tag":84,"props":114119,"children":114120},{},[114121],{"type":23,"value":14066},{"type":17,"tag":29,"props":114123,"children":114124},{},[114125],{"type":23,"value":114126},"The API returns:",{"type":17,"tag":80,"props":114128,"children":114129},{},[114130,114139,114148],{"type":17,"tag":84,"props":114131,"children":114132},{},[114133],{"type":17,"tag":6121,"props":114134,"children":114136},{"className":114135},[],[114137],{"type":23,"value":114138},"join_url",{"type":17,"tag":84,"props":114140,"children":114141},{},[114142],{"type":17,"tag":6121,"props":114143,"children":114145},{"className":114144},[],[114146],{"type":23,"value":114147},"meeting_id",{"type":17,"tag":84,"props":114149,"children":114150},{},[114151],{"type":23,"value":114152},"dial-in details (when supported)",{"type":17,"tag":29,"props":114154,"children":114155},{},[114156],{"type":23,"value":114157},"This allows meetings to be scheduled with conferencing automatically attached.",{"type":17,"tag":68,"props":114159,"children":114161},{"id":114160},"handling-rescheduling-and-cancellations",[114162],{"type":23,"value":114163},"Handling Rescheduling and Cancellations",{"type":17,"tag":29,"props":114165,"children":114166},{},[114167],{"type":23,"value":114168},"Scheduling features must respond to changes.",{"type":17,"tag":29,"props":114170,"children":114171},{},[114172],{"type":23,"value":114173},"Unified provides webhook events for calendar updates:",{"type":17,"tag":80,"props":114175,"children":114176},{},[114177,114185,114193],{"type":17,"tag":84,"props":114178,"children":114179},{},[114180],{"type":17,"tag":6121,"props":114181,"children":114183},{"className":114182},[],[114184],{"type":23,"value":74863},{"type":17,"tag":84,"props":114186,"children":114187},{},[114188],{"type":17,"tag":6121,"props":114189,"children":114191},{"className":114190},[],[114192],{"type":23,"value":74876},{"type":17,"tag":84,"props":114194,"children":114195},{},[114196],{"type":17,"tag":6121,"props":114197,"children":114199},{"className":114198},[],[114200],{"type":23,"value":74889},{"type":17,"tag":29,"props":114202,"children":114203},{},[114204],{"type":23,"value":114205},"Additional lifecycle events may include:",{"type":17,"tag":80,"props":114207,"children":114208},{},[114209,114217],{"type":17,"tag":84,"props":114210,"children":114211},{},[114212],{"type":17,"tag":6121,"props":114213,"children":114215},{"className":114214},[],[114216],{"type":23,"value":74902},{"type":17,"tag":84,"props":114218,"children":114219},{},[114220],{"type":17,"tag":6121,"props":114221,"children":114223},{"className":114222},[],[114224],{"type":23,"value":74915},{"type":17,"tag":29,"props":114226,"children":114227},{},[114228],{"type":23,"value":114229},"These events allow your product to:",{"type":17,"tag":80,"props":114231,"children":114232},{},[114233,114238,114243,114248],{"type":17,"tag":84,"props":114234,"children":114235},{},[114236],{"type":23,"value":114237},"update meeting times",{"type":17,"tag":84,"props":114239,"children":114240},{},[114241],{"type":23,"value":114242},"notify participants",{"type":17,"tag":84,"props":114244,"children":114245},{},[114246],{"type":23,"value":114247},"cancel meetings",{"type":17,"tag":84,"props":114249,"children":114250},{},[114251],{"type":23,"value":114252},"synchronize UI state",{"type":17,"tag":68,"props":114254,"children":114255},{"id":25342},[114256],{"type":23,"value":25345},{"type":17,"tag":29,"props":114258,"children":114259},{},[114260],{"type":23,"value":114261},"Unified supports a wide range of calendar and meeting integrations.",{"type":17,"tag":29,"props":114263,"children":114264},{},[114265],{"type":23,"value":24364},{"type":17,"tag":80,"props":114267,"children":114268},{},[114269,114273,114277,114281,114285,114289],{"type":17,"tag":84,"props":114270,"children":114271},{},[114272],{"type":23,"value":13669},{"type":17,"tag":84,"props":114274,"children":114275},{},[114276],{"type":23,"value":14455},{"type":17,"tag":84,"props":114278,"children":114279},{},[114280],{"type":23,"value":14472},{"type":17,"tag":84,"props":114282,"children":114283},{},[114284],{"type":23,"value":14066},{"type":17,"tag":84,"props":114286,"children":114287},{},[114288],{"type":23,"value":13678},{"type":17,"tag":84,"props":114290,"children":114291},{},[114292],{"type":23,"value":14108},{"type":17,"tag":29,"props":114294,"children":114295},{},[114296,114298,114303],{"type":23,"value":114297},"In total, the Calendar & Meetings category supports ",{"type":17,"tag":48,"props":114299,"children":114300},{},[114301],{"type":23,"value":114302},"27 integrations",{"type":23,"value":114304},", allowing your product to support many customer environments.",{"type":17,"tag":68,"props":114306,"children":114307},{"id":883},[114308],{"type":23,"value":19178},{"type":17,"tag":29,"props":114310,"children":114311},{},[114312],{"type":23,"value":114313},"Scheduling features require coordination across multiple platforms.",{"type":17,"tag":29,"props":114315,"children":114316},{},[114317],{"type":23,"value":114318},"Without a unified approach, developers must build separate integrations for each calendar provider and manage differences in availability, events, and conferencing.",{"type":17,"tag":29,"props":114320,"children":114321},{},[114322],{"type":23,"value":25437},{"type":17,"tag":80,"props":114324,"children":114325},{},[114326,114331,114336,114341],{"type":17,"tag":84,"props":114327,"children":114328},{},[114329],{"type":23,"value":114330},"consistent calendar event models",{"type":17,"tag":84,"props":114332,"children":114333},{},[114334],{"type":23,"value":114335},"availability retrieval across providers",{"type":17,"tag":84,"props":114337,"children":114338},{},[114339],{"type":23,"value":114340},"unified event creation",{"type":17,"tag":84,"props":114342,"children":114343},{},[114344,114345],{"type":23,"value":34285},{"type":17,"tag":133,"props":114346,"children":114347},{"href":4999},[114348],{"type":23,"value":5002},{"type":17,"tag":29,"props":114350,"children":114351},{},[114352],{"type":23,"value":114353},"This allows product teams to build scheduling features quickly while avoiding integration complexity.",{"type":17,"tag":29,"props":114355,"children":114356},{},[114357],{"type":23,"value":114358},"Start building scheduling features across Google Calendar, Outlook, Zoom, and many other platforms today.",{"type":17,"tag":29,"props":114360,"children":114361},{},[114362],{"type":17,"tag":133,"props":114363,"children":114365},{"href":1612,"rel":114364},[214],[114366],{"type":23,"value":44481},{"type":17,"tag":29,"props":114368,"children":114369},{},[114370],{"type":17,"tag":133,"props":114371,"children":114373},{"href":1623,"rel":114372},[214],[114374],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":114376},[114377,114378,114379,114380,114381,114382,114387,114390,114391,114392,114393],{"id":113262,"depth":1629,"text":113265},{"id":113363,"depth":1629,"text":113366},{"id":113439,"depth":1629,"text":113442},{"id":113495,"depth":1629,"text":113498},{"id":113664,"depth":1629,"text":113667},{"id":113721,"depth":1629,"text":113724,"children":114383},[114384,114385,114386],{"id":113746,"depth":1635,"text":113749},{"id":113821,"depth":1635,"text":113824},{"id":113877,"depth":1635,"text":113880},{"id":113934,"depth":1629,"text":113937,"children":114388},[114389],{"id":113954,"depth":1635,"text":113957},{"id":114087,"depth":1629,"text":114090},{"id":114160,"depth":1629,"text":114163},{"id":25342,"depth":1629,"text":25345},{"id":883,"depth":1629,"text":19178},"content:blog:how_to_build_scheduling_into_your_product_across_google_calendar_outlook_and_zoom.md","blog/how_to_build_scheduling_into_your_product_across_google_calendar_outlook_and_zoom.md","blog/how_to_build_scheduling_into_your_product_across_google_calendar_outlook_and_zoom",{"_path":114398,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":114399,"description":114400,"img":114401,"date":114402,"tag":12,"body":114403,"_type":1677,"_id":115703,"_source":1679,"_file":115704,"_stem":115705,"_extension":1682},"/blog/how_to_build_lead_capture_pipelines_across_typeform_hubspot_and_salesforce","How to Build Lead Capture Pipelines Across Typeform, HubSpot, and Salesforce","Lead capture is the starting point for most customer acquisition workflows. Prospects fill out forms on landing pages, event registrations, demo requests, or...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_lead_capture_pipelines_across_typeform_hubspot_and_salesforce-icon.png","2026-03-04T15:57:00.000Z",{"type":14,"children":114404,"toc":115686},[114405,114410,114413,114420,114425,114430,114447,114453,114458,114486,114491,114496,114539,114544,114550,114555,114563,114568,114576,114581,114589,114594,114602,114607,114615,114620,114626,114636,114703,114708,114712,114717,114723,114781,114792,114796,114869,114874,114880,114890,114894,114919,114923,114931,114936,114942,114953,114961,114970,114978,114987,114995,115004,115012,115021,115026,115082,115093,115098,115127,115132,115138,115143,115148,115156,115161,115180,115185,115193,115205,115210,115227,115235,115240,115244,115277,115285,115290,115313,115318,115324,115329,115334,115343,115348,115353,115362,115367,115373,115378,115385,115390,115398,115403,115411,115416,115424,115429,115437,115442,115450,115455,115461,115466,115471,115501,115512,115517,115522,115526,115531,115543,115547,115562,115574,115589,115620,115625,115629,115634,115638,115660,115665,115670,115678],{"type":17,"tag":18,"props":114406,"children":114408},{"id":114407},"how-to-build-lead-capture-pipelines-across-typeform-hubspot-and-salesforce",[114409],{"type":23,"value":114399},{"type":17,"tag":25,"props":114411,"children":114412},{},[],{"type":17,"tag":29,"props":114414,"children":114415},{},[114416],{"type":17,"tag":33,"props":114417,"children":114418},{},[114419],{"type":23,"value":106378},{"type":17,"tag":29,"props":114421,"children":114422},{},[114423],{"type":23,"value":114424},"Lead capture is the starting point for most customer acquisition workflows. Prospects fill out forms on landing pages, event registrations, demo requests, or surveys. That data then needs to flow into CRM systems where sales and marketing teams can follow up.",{"type":17,"tag":29,"props":114426,"children":114427},{},[114428],{"type":23,"value":114429},"Many SaaS products build features that ingest leads from forms and push them into systems like HubSpot or Salesforce. The challenge is that form providers and CRMs all expose different APIs, schemas, and authentication models. Integrating Typeform, Google Forms, HubSpot, and Salesforce individually quickly becomes complex to maintain.",{"type":17,"tag":29,"props":114431,"children":114432},{},[114433,114435,114440,114441,114445],{"type":23,"value":114434},"Unified simplifies this process by providing normalized APIs for both ",{"type":17,"tag":48,"props":114436,"children":114437},{},[114438],{"type":23,"value":114439},"Forms",{"type":23,"value":34435},{"type":17,"tag":48,"props":114442,"children":114443},{},[114444],{"type":23,"value":25731},{"type":23,"value":114446}," platforms. Developers can retrieve form submissions and write leads into CRM systems using consistent objects and endpoints, enabling reliable lead capture pipelines across many providers.",{"type":17,"tag":68,"props":114448,"children":114450},{"id":114449},"why-saas-products-need-lead-capture-pipelines",[114451],{"type":23,"value":114452},"Why SaaS Products Need Lead Capture Pipelines",{"type":17,"tag":29,"props":114454,"children":114455},{},[114456],{"type":23,"value":114457},"Lead capture pipelines are common in many SaaS products, including:",{"type":17,"tag":80,"props":114459,"children":114460},{},[114461,114466,114471,114476,114481],{"type":17,"tag":84,"props":114462,"children":114463},{},[114464],{"type":23,"value":114465},"Marketing automation platforms",{"type":17,"tag":84,"props":114467,"children":114468},{},[114469],{"type":23,"value":114470},"Customer data platforms",{"type":17,"tag":84,"props":114472,"children":114473},{},[114474],{"type":23,"value":114475},"RevOps tools",{"type":17,"tag":84,"props":114477,"children":114478},{},[114479],{"type":23,"value":114480},"Event and webinar platforms",{"type":17,"tag":84,"props":114482,"children":114483},{},[114484],{"type":23,"value":114485},"AI lead qualification products",{"type":17,"tag":29,"props":114487,"children":114488},{},[114489],{"type":23,"value":114490},"These products ingest leads from form platforms and route them to CRM systems so that sales teams can follow up.",{"type":17,"tag":29,"props":114492,"children":114493},{},[114494],{"type":23,"value":114495},"A typical lead pipeline involves:",{"type":17,"tag":80,"props":114497,"children":114498},{},[114499,114509,114519,114529],{"type":17,"tag":84,"props":114500,"children":114501},{},[114502,114507],{"type":17,"tag":48,"props":114503,"children":114504},{},[114505],{"type":23,"value":114506},"Form submissions",{"type":23,"value":114508}," from platforms like Typeform",{"type":17,"tag":84,"props":114510,"children":114511},{},[114512,114517],{"type":17,"tag":48,"props":114513,"children":114514},{},[114515],{"type":23,"value":114516},"Lead enrichment or validation",{"type":23,"value":114518}," in the application",{"type":17,"tag":84,"props":114520,"children":114521},{},[114522,114527],{"type":17,"tag":48,"props":114523,"children":114524},{},[114525],{"type":23,"value":114526},"CRM record creation",{"type":23,"value":114528}," in HubSpot, Salesforce, or other systems",{"type":17,"tag":84,"props":114530,"children":114531},{},[114532,114537],{"type":17,"tag":48,"props":114533,"children":114534},{},[114535],{"type":23,"value":114536},"Automated routing",{"type":23,"value":114538}," to sales representatives",{"type":17,"tag":29,"props":114540,"children":114541},{},[114542],{"type":23,"value":114543},"Building this pipeline reliably requires consistent access to both form submission data and CRM write endpoints.",{"type":17,"tag":68,"props":114545,"children":114547},{"id":114546},"common-lead-capture-workflows",[114548],{"type":23,"value":114549},"Common Lead Capture Workflows",{"type":17,"tag":29,"props":114551,"children":114552},{},[114553],{"type":23,"value":114554},"Lead capture pipelines typically support several workflows.",{"type":17,"tag":29,"props":114556,"children":114557},{},[114558],{"type":17,"tag":48,"props":114559,"children":114560},{},[114561],{"type":23,"value":114562},"Landing page lead capture",{"type":17,"tag":29,"props":114564,"children":114565},{},[114566],{"type":23,"value":114567},"Marketing teams collect contact information from demo request or newsletter forms.",{"type":17,"tag":29,"props":114569,"children":114570},{},[114571],{"type":17,"tag":48,"props":114572,"children":114573},{},[114574],{"type":23,"value":114575},"Event registrations",{"type":17,"tag":29,"props":114577,"children":114578},{},[114579],{"type":23,"value":114580},"Conference or webinar registrations are submitted through forms and routed to CRM systems.",{"type":17,"tag":29,"props":114582,"children":114583},{},[114584],{"type":17,"tag":48,"props":114585,"children":114586},{},[114587],{"type":23,"value":114588},"Product sign-up forms",{"type":17,"tag":29,"props":114590,"children":114591},{},[114592],{"type":23,"value":114593},"Applications capture new users and create corresponding CRM leads.",{"type":17,"tag":29,"props":114595,"children":114596},{},[114597],{"type":17,"tag":48,"props":114598,"children":114599},{},[114600],{"type":23,"value":114601},"Qualification surveys",{"type":17,"tag":29,"props":114603,"children":114604},{},[114605],{"type":23,"value":114606},"Prospects submit information about company size, budget, or use case through structured forms.",{"type":17,"tag":29,"props":114608,"children":114609},{},[114610],{"type":17,"tag":48,"props":114611,"children":114612},{},[114613],{"type":23,"value":114614},"Lead enrichment pipelines",{"type":17,"tag":29,"props":114616,"children":114617},{},[114618],{"type":23,"value":114619},"Submitted data is enriched before being pushed into CRM systems.",{"type":17,"tag":68,"props":114621,"children":114623},{"id":114622},"unified-categories-used-in-lead-capture-pipelines",[114624],{"type":23,"value":114625},"Unified Categories Used in Lead Capture Pipelines",{"type":17,"tag":29,"props":114627,"children":114628},{},[114629,114631,114635],{"type":23,"value":114630},"A lead capture pipeline typically connects two ",{"type":17,"tag":133,"props":114632,"children":114633},{"href":7691},[114634],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":114637,"children":114638},{},[114639,114657],{"type":17,"tag":7235,"props":114640,"children":114641},{},[114642],{"type":17,"tag":7239,"props":114643,"children":114644},{},[114645,114649,114653],{"type":17,"tag":7243,"props":114646,"children":114647},{},[114648],{"type":23,"value":7247},{"type":17,"tag":7243,"props":114650,"children":114651},{},[114652],{"type":23,"value":24525},{"type":17,"tag":7243,"props":114654,"children":114655},{},[114656],{"type":23,"value":24530},{"type":17,"tag":7259,"props":114658,"children":114659},{},[114660,114682],{"type":17,"tag":7239,"props":114661,"children":114662},{},[114663,114672,114677],{"type":17,"tag":7266,"props":114664,"children":114665},{},[114666],{"type":17,"tag":133,"props":114667,"children":114670},{"href":114668,"rel":114669},"https://docs.unified.to/forms/overview",[214],[114671],{"type":23,"value":114439},{"type":17,"tag":7266,"props":114673,"children":114674},{},[114675],{"type":23,"value":114676},"Form templates and submission data from platforms like Typeform and Google Forms",{"type":17,"tag":7266,"props":114678,"children":114679},{},[114680],{"type":23,"value":114681},"form, submission",{"type":17,"tag":7239,"props":114683,"children":114684},{},[114685,114693,114698],{"type":17,"tag":7266,"props":114686,"children":114687},{},[114688],{"type":17,"tag":133,"props":114689,"children":114691},{"href":107049,"rel":114690},[214],[114692],{"type":23,"value":25731},{"type":17,"tag":7266,"props":114694,"children":114695},{},[114696],{"type":23,"value":114697},"Lead and contact records stored in platforms like HubSpot or Salesforce",{"type":17,"tag":7266,"props":114699,"children":114700},{},[114701],{"type":23,"value":114702},"contact, lead, company",{"type":17,"tag":29,"props":114704,"children":114705},{},[114706],{"type":23,"value":114707},"Using normalized APIs across these categories allows developers to ingest leads from many form providers and route them into CRM systems without writing vendor-specific integrations.",{"type":17,"tag":68,"props":114709,"children":114710},{"id":24613},[114711],{"type":23,"value":24616},{"type":17,"tag":29,"props":114713,"children":114714},{},[114715],{"type":23,"value":114716},"Unified standardizes the core objects required to build lead pipelines.",{"type":17,"tag":239,"props":114718,"children":114720},{"id":114719},"forms-objects",[114721],{"type":23,"value":114722},"Forms Objects",{"type":17,"tag":7231,"props":114724,"children":114725},{},[114726,114744],{"type":17,"tag":7235,"props":114727,"children":114728},{},[114729],{"type":17,"tag":7239,"props":114730,"children":114731},{},[114732,114736,114740],{"type":17,"tag":7243,"props":114733,"children":114734},{},[114735],{"type":23,"value":18594},{"type":17,"tag":7243,"props":114737,"children":114738},{},[114739],{"type":23,"value":22096},{"type":17,"tag":7243,"props":114741,"children":114742},{},[114743],{"type":23,"value":20787},{"type":17,"tag":7259,"props":114745,"children":114746},{},[114747,114764],{"type":17,"tag":7239,"props":114748,"children":114749},{},[114750,114754,114759],{"type":17,"tag":7266,"props":114751,"children":114752},{},[114753],{"type":23,"value":40001},{"type":17,"tag":7266,"props":114755,"children":114756},{},[114757],{"type":23,"value":114758},"id, name, fields, description, active status",{"type":17,"tag":7266,"props":114760,"children":114761},{},[114762],{"type":23,"value":114763},"Defines the structure of a form and its questions",{"type":17,"tag":7239,"props":114765,"children":114766},{},[114767,114771,114776],{"type":17,"tag":7266,"props":114768,"children":114769},{},[114770],{"type":23,"value":40044},{"type":17,"tag":7266,"props":114772,"children":114773},{},[114774],{"type":23,"value":114775},"id, created_at, form_id, respondent_email, respondent_name, answers",{"type":17,"tag":7266,"props":114777,"children":114778},{},[114779],{"type":23,"value":114780},"Represents a completed form submission",{"type":17,"tag":29,"props":114782,"children":114783},{},[114784,114786,114790],{"type":23,"value":114785},"Each form contains a list of ",{"type":17,"tag":48,"props":114787,"children":114788},{},[114789],{"type":23,"value":39759},{"type":23,"value":114791},", which define the questions presented to the user.",{"type":17,"tag":239,"props":114793,"children":114794},{"id":25770},[114795],{"type":23,"value":25773},{"type":17,"tag":7231,"props":114797,"children":114798},{},[114799,114817],{"type":17,"tag":7235,"props":114800,"children":114801},{},[114802],{"type":17,"tag":7239,"props":114803,"children":114804},{},[114805,114809,114813],{"type":17,"tag":7243,"props":114806,"children":114807},{},[114808],{"type":23,"value":18594},{"type":17,"tag":7243,"props":114810,"children":114811},{},[114812],{"type":23,"value":22096},{"type":17,"tag":7243,"props":114814,"children":114815},{},[114816],{"type":23,"value":20787},{"type":17,"tag":7259,"props":114818,"children":114819},{},[114820,114836,114853],{"type":17,"tag":7239,"props":114821,"children":114822},{},[114823,114827,114831],{"type":17,"tag":7266,"props":114824,"children":114825},{},[114826],{"type":23,"value":25828},{"type":17,"tag":7266,"props":114828,"children":114829},{},[114830],{"type":23,"value":27013},{"type":17,"tag":7266,"props":114832,"children":114833},{},[114834],{"type":23,"value":114835},"Represents an individual in the CRM",{"type":17,"tag":7239,"props":114837,"children":114838},{},[114839,114843,114848],{"type":17,"tag":7266,"props":114840,"children":114841},{},[114842],{"type":23,"value":62749},{"type":17,"tag":7266,"props":114844,"children":114845},{},[114846],{"type":23,"value":114847},"name, email, company_name, source",{"type":17,"tag":7266,"props":114849,"children":114850},{},[114851],{"type":23,"value":114852},"Represents a potential customer",{"type":17,"tag":7239,"props":114854,"children":114855},{},[114856,114860,114864],{"type":17,"tag":7266,"props":114857,"children":114858},{},[114859],{"type":23,"value":25846},{"type":17,"tag":7266,"props":114861,"children":114862},{},[114863],{"type":23,"value":25851},{"type":17,"tag":7266,"props":114865,"children":114866},{},[114867],{"type":23,"value":114868},"Represents an organization associated with leads",{"type":17,"tag":29,"props":114870,"children":114871},{},[114872],{"type":23,"value":114873},"These CRM objects allow applications to create or update customer records when new leads are captured.",{"type":17,"tag":68,"props":114875,"children":114877},{"id":114876},"connecting-form-providers-and-crm-systems",[114878],{"type":23,"value":114879},"Connecting Form Providers and CRM Systems",{"type":17,"tag":29,"props":114881,"children":114882},{},[114883,114885,114889],{"type":23,"value":114884},"Customers authorize their form platforms and CRM systems through ",{"type":17,"tag":48,"props":114886,"children":114887},{},[114888],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":114891,"children":114892},{},[114893],{"type":23,"value":25009},{"type":17,"tag":6154,"props":114895,"children":114896},{},[114897,114901,114906,114910],{"type":17,"tag":84,"props":114898,"children":114899},{},[114900],{"type":23,"value":75678},{"type":17,"tag":84,"props":114902,"children":114903},{},[114904],{"type":23,"value":114905},"The user selects integrations such as Typeform, HubSpot, or Salesforce.",{"type":17,"tag":84,"props":114907,"children":114908},{},[114909],{"type":23,"value":107456},{"type":17,"tag":84,"props":114911,"children":114912},{},[114913,114914,114918],{"type":23,"value":73306},{"type":17,"tag":48,"props":114915,"children":114916},{},[114917],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":114920,"children":114921},{},[114922],{"type":23,"value":73316},{"type":17,"tag":6893,"props":114924,"children":114926},{"className":114925,"code":25047,"language":20901,"meta":23},[20899],[114927],{"type":17,"tag":6121,"props":114928,"children":114929},{"__ignoreMap":7},[114930],{"type":23,"value":25047},{"type":17,"tag":29,"props":114932,"children":114933},{},[114934],{"type":23,"value":114935},"All subsequent API requests use the connection_id to retrieve submissions or write CRM records.",{"type":17,"tag":68,"props":114937,"children":114939},{"id":114938},"retrieving-form-submissions",[114940],{"type":23,"value":114941},"Retrieving Form Submissions",{"type":17,"tag":29,"props":114943,"children":114944},{},[114945,114947,114952],{"type":23,"value":114946},"Form submissions are retrieved through the ",{"type":17,"tag":133,"props":114948,"children":114949},{"href":39304},[114950],{"type":23,"value":114951},"Forms API",{"type":23,"value":54},{"type":17,"tag":29,"props":114954,"children":114955},{},[114956],{"type":17,"tag":48,"props":114957,"children":114958},{},[114959],{"type":23,"value":114960},"List forms",{"type":17,"tag":6893,"props":114962,"children":114965},{"className":114963,"code":114964,"language":20901,"meta":23},[20899],"GET /forms/{connection_id}/form\n",[114966],{"type":17,"tag":6121,"props":114967,"children":114968},{"__ignoreMap":7},[114969],{"type":23,"value":114964},{"type":17,"tag":29,"props":114971,"children":114972},{},[114973],{"type":17,"tag":48,"props":114974,"children":114975},{},[114976],{"type":23,"value":114977},"Retrieve a form",{"type":17,"tag":6893,"props":114979,"children":114982},{"className":114980,"code":114981,"language":20901,"meta":23},[20899],"GET /forms/{connection_id}/form/{id}\n",[114983],{"type":17,"tag":6121,"props":114984,"children":114985},{"__ignoreMap":7},[114986],{"type":23,"value":114981},{"type":17,"tag":29,"props":114988,"children":114989},{},[114990],{"type":17,"tag":48,"props":114991,"children":114992},{},[114993],{"type":23,"value":114994},"List submissions",{"type":17,"tag":6893,"props":114996,"children":114999},{"className":114997,"code":114998,"language":20901,"meta":23},[20899],"GET /forms/{connection_id}/submission\n",[115000],{"type":17,"tag":6121,"props":115001,"children":115002},{"__ignoreMap":7},[115003],{"type":23,"value":114998},{"type":17,"tag":29,"props":115005,"children":115006},{},[115007],{"type":17,"tag":48,"props":115008,"children":115009},{},[115010],{"type":23,"value":115011},"Retrieve a single submission",{"type":17,"tag":6893,"props":115013,"children":115016},{"className":115014,"code":115015,"language":20901,"meta":23},[20899],"GET /forms/{connection_id}/submission/{id}\n",[115017],{"type":17,"tag":6121,"props":115018,"children":115019},{"__ignoreMap":7},[115020],{"type":23,"value":115015},{"type":17,"tag":29,"props":115022,"children":115023},{},[115024],{"type":23,"value":115025},"Submissions contain structured data including:",{"type":17,"tag":80,"props":115027,"children":115028},{},[115029,115048,115059,115071],{"type":17,"tag":84,"props":115030,"children":115031},{},[115032,115034,115040,115041,115047],{"type":23,"value":115033},"respondent identifiers (",{"type":17,"tag":6121,"props":115035,"children":115037},{"className":115036},[],[115038],{"type":23,"value":115039},"respondent_email",{"type":23,"value":11826},{"type":17,"tag":6121,"props":115042,"children":115044},{"className":115043},[],[115045],{"type":23,"value":115046},"respondent_name",{"type":23,"value":12034},{"type":17,"tag":84,"props":115049,"children":115050},{},[115051,115053,115058],{"type":23,"value":115052},"submission timestamps (",{"type":17,"tag":6121,"props":115054,"children":115056},{"className":115055},[],[115057],{"type":23,"value":33446},{"type":23,"value":12034},{"type":17,"tag":84,"props":115060,"children":115061},{},[115062,115064,115070],{"type":23,"value":115063},"the associated form (",{"type":17,"tag":6121,"props":115065,"children":115067},{"className":115066},[],[115068],{"type":23,"value":115069},"form_id",{"type":23,"value":12034},{"type":17,"tag":84,"props":115072,"children":115073},{},[115074,115076,115081],{"type":23,"value":115075},"an array of responses (",{"type":17,"tag":6121,"props":115077,"children":115079},{"className":115078},[],[115080],{"type":23,"value":39871},{"type":23,"value":12034},{"type":17,"tag":29,"props":115083,"children":115084},{},[115085,115086,115091],{"type":23,"value":6712},{"type":17,"tag":6121,"props":115087,"children":115089},{"className":115088},[],[115090],{"type":23,"value":39871},{"type":23,"value":115092}," array contains each response submitted by the user.",{"type":17,"tag":29,"props":115094,"children":115095},{},[115096],{"type":23,"value":115097},"Each answer includes:",{"type":17,"tag":80,"props":115099,"children":115100},{},[115101,115110,115119],{"type":17,"tag":84,"props":115102,"children":115103},{},[115104],{"type":17,"tag":6121,"props":115105,"children":115107},{"className":115106},[],[115108],{"type":23,"value":115109},"field_id",{"type":17,"tag":84,"props":115111,"children":115112},{},[115113],{"type":17,"tag":6121,"props":115114,"children":115116},{"className":115115},[],[115117],{"type":23,"value":115118},"field_name",{"type":17,"tag":84,"props":115120,"children":115121},{},[115122],{"type":17,"tag":6121,"props":115123,"children":115125},{"className":115124},[],[115126],{"type":23,"value":18792},{"type":17,"tag":29,"props":115128,"children":115129},{},[115130],{"type":23,"value":115131},"This structure allows developers to extract and transform form responses for CRM ingestion.",{"type":17,"tag":68,"props":115133,"children":115135},{"id":115134},"mapping-form-responses-to-crm-leads",[115136],{"type":23,"value":115137},"Mapping Form Responses to CRM Leads",{"type":17,"tag":29,"props":115139,"children":115140},{},[115141],{"type":23,"value":115142},"When building a lead pipeline, form responses must be mapped to CRM fields.",{"type":17,"tag":29,"props":115144,"children":115145},{},[115146],{"type":23,"value":115147},"A typical mapping process includes several steps.",{"type":17,"tag":29,"props":115149,"children":115150},{},[115151],{"type":17,"tag":48,"props":115152,"children":115153},{},[115154],{"type":23,"value":115155},"Identify the lead",{"type":17,"tag":29,"props":115157,"children":115158},{},[115159],{"type":23,"value":115160},"Use the submission fields:",{"type":17,"tag":80,"props":115162,"children":115163},{},[115164,115172],{"type":17,"tag":84,"props":115165,"children":115166},{},[115167],{"type":17,"tag":6121,"props":115168,"children":115170},{"className":115169},[],[115171],{"type":23,"value":115039},{"type":17,"tag":84,"props":115173,"children":115174},{},[115175],{"type":17,"tag":6121,"props":115176,"children":115178},{"className":115177},[],[115179],{"type":23,"value":115046},{"type":17,"tag":29,"props":115181,"children":115182},{},[115183],{"type":23,"value":115184},"These values often correspond directly to CRM lead fields.",{"type":17,"tag":29,"props":115186,"children":115187},{},[115188],{"type":17,"tag":48,"props":115189,"children":115190},{},[115191],{"type":23,"value":115192},"Match answers to form questions",{"type":17,"tag":29,"props":115194,"children":115195},{},[115196,115198,115203],{"type":23,"value":115197},"Each answer includes a ",{"type":17,"tag":6121,"props":115199,"children":115201},{"className":115200},[],[115202],{"type":23,"value":115109},{"type":23,"value":115204},". This identifier matches the corresponding question in the form definition.",{"type":17,"tag":29,"props":115206,"children":115207},{},[115208],{"type":23,"value":115209},"By retrieving the form schema, developers can determine:",{"type":17,"tag":80,"props":115211,"children":115212},{},[115213,115218,115223],{"type":17,"tag":84,"props":115214,"children":115215},{},[115216],{"type":23,"value":115217},"question label",{"type":17,"tag":84,"props":115219,"children":115220},{},[115221],{"type":23,"value":115222},"field type",{"type":17,"tag":84,"props":115224,"children":115225},{},[115226],{"type":23,"value":89551},{"type":17,"tag":29,"props":115228,"children":115229},{},[115230],{"type":17,"tag":48,"props":115231,"children":115232},{},[115233],{"type":23,"value":115234},"Convert values based on field type",{"type":17,"tag":29,"props":115236,"children":115237},{},[115238],{"type":23,"value":115239},"Different form field types map to different CRM fields.",{"type":17,"tag":29,"props":115241,"children":115242},{},[115243],{"type":23,"value":377},{"type":17,"tag":80,"props":115245,"children":115246},{},[115247,115252,115257,115262,115267,115272],{"type":17,"tag":84,"props":115248,"children":115249},{},[115250],{"type":23,"value":115251},"TEXT or TEXTAREA → CRM notes or text fields",{"type":17,"tag":84,"props":115253,"children":115254},{},[115255],{"type":23,"value":115256},"EMAIL → lead email field",{"type":17,"tag":84,"props":115258,"children":115259},{},[115260],{"type":23,"value":115261},"PHONE → phone number field",{"type":17,"tag":84,"props":115263,"children":115264},{},[115265],{"type":23,"value":115266},"NUMBER → numeric CRM field",{"type":17,"tag":84,"props":115268,"children":115269},{},[115270],{"type":23,"value":115271},"SINGLE_SELECT / MULTIPLE_SELECT → CRM picklists or tags",{"type":17,"tag":84,"props":115273,"children":115274},{},[115275],{"type":23,"value":115276},"FILE_UPLOAD → attachments",{"type":17,"tag":29,"props":115278,"children":115279},{},[115280],{"type":17,"tag":48,"props":115281,"children":115282},{},[115283],{"type":23,"value":115284},"Track submission metadata",{"type":17,"tag":29,"props":115286,"children":115287},{},[115288],{"type":23,"value":115289},"Include submission metadata such as:",{"type":17,"tag":80,"props":115291,"children":115292},{},[115293,115303],{"type":17,"tag":84,"props":115294,"children":115295},{},[115296,115301],{"type":17,"tag":6121,"props":115297,"children":115299},{"className":115298},[],[115300],{"type":23,"value":33446},{"type":23,"value":115302}," for lead capture time",{"type":17,"tag":84,"props":115304,"children":115305},{},[115306,115311],{"type":17,"tag":6121,"props":115307,"children":115309},{"className":115308},[],[115310],{"type":23,"value":115069},{"type":23,"value":115312}," to associate leads with campaigns",{"type":17,"tag":29,"props":115314,"children":115315},{},[115316],{"type":23,"value":115317},"Because Unified normalizes form structures across providers, the same mapping logic works across Typeform, Google Forms, and other supported platforms.",{"type":17,"tag":68,"props":115319,"children":115321},{"id":115320},"writing-leads-to-crm-systems",[115322],{"type":23,"value":115323},"Writing Leads to CRM Systems",{"type":17,"tag":29,"props":115325,"children":115326},{},[115327],{"type":23,"value":115328},"Once submissions are mapped to CRM fields, the application can create or update lead records.",{"type":17,"tag":29,"props":115330,"children":115331},{},[115332],{"type":23,"value":115333},"Example CRM write endpoints include:",{"type":17,"tag":6893,"props":115335,"children":115338},{"className":115336,"code":115337,"language":20901,"meta":23},[20899],"POST /crm/{connection_id}/lead\nPOST /crm/{connection_id}/contact\n",[115339],{"type":17,"tag":6121,"props":115340,"children":115341},{"__ignoreMap":7},[115342],{"type":23,"value":115337},{"type":17,"tag":29,"props":115344,"children":115345},{},[115346],{"type":23,"value":115347},"These endpoints allow developers to create new leads or contacts directly in systems like HubSpot or Salesforce.",{"type":17,"tag":29,"props":115349,"children":115350},{},[115351],{"type":23,"value":115352},"Applications can also update existing CRM records.",{"type":17,"tag":6893,"props":115354,"children":115357},{"className":115355,"code":115356,"language":20901,"meta":23},[20899],"PUT /crm/{connection_id}/lead/{id}\nPUT /crm/{connection_id}/contact/{id}\n",[115358],{"type":17,"tag":6121,"props":115359,"children":115360},{"__ignoreMap":7},[115361],{"type":23,"value":115356},{"type":17,"tag":29,"props":115363,"children":115364},{},[115365],{"type":23,"value":115366},"This allows pipelines to update leads with additional information or enrichment data.",{"type":17,"tag":68,"props":115368,"children":115370},{"id":115369},"data-flow-for-lead-capture-pipelines",[115371],{"type":23,"value":115372},"Data Flow for Lead Capture Pipelines",{"type":17,"tag":29,"props":115374,"children":115375},{},[115376],{"type":23,"value":115377},"A typical lead ingestion pipeline follows this pattern.",{"type":17,"tag":29,"props":115379,"children":115380},{},[115381],{"type":17,"tag":48,"props":115382,"children":115383},{},[115384],{"type":23,"value":107583},{"type":17,"tag":29,"props":115386,"children":115387},{},[115388],{"type":23,"value":115389},"Customers authorize their form platform and CRM through Unified Connect.",{"type":17,"tag":29,"props":115391,"children":115392},{},[115393],{"type":17,"tag":48,"props":115394,"children":115395},{},[115396],{"type":23,"value":115397},"2. Retrieve form definitions",{"type":17,"tag":29,"props":115399,"children":115400},{},[115401],{"type":23,"value":115402},"Fetch forms and field definitions to understand the question schema.",{"type":17,"tag":29,"props":115404,"children":115405},{},[115406],{"type":17,"tag":48,"props":115407,"children":115408},{},[115409],{"type":23,"value":115410},"3. Ingest submissions",{"type":17,"tag":29,"props":115412,"children":115413},{},[115414],{"type":23,"value":115415},"Retrieve form submissions using the Forms API.",{"type":17,"tag":29,"props":115417,"children":115418},{},[115419],{"type":17,"tag":48,"props":115420,"children":115421},{},[115422],{"type":23,"value":115423},"4. Map responses to CRM fields",{"type":17,"tag":29,"props":115425,"children":115426},{},[115427],{"type":23,"value":115428},"Transform submission answers into structured lead data.",{"type":17,"tag":29,"props":115430,"children":115431},{},[115432],{"type":17,"tag":48,"props":115433,"children":115434},{},[115435],{"type":23,"value":115436},"5. Create CRM records",{"type":17,"tag":29,"props":115438,"children":115439},{},[115440],{"type":23,"value":115441},"Use CRM write endpoints to create new leads or contacts.",{"type":17,"tag":29,"props":115443,"children":115444},{},[115445],{"type":17,"tag":48,"props":115446,"children":115447},{},[115448],{"type":23,"value":115449},"6. Store data locally",{"type":17,"tag":29,"props":115451,"children":115452},{},[115453],{"type":23,"value":115454},"Persist normalized records in your database for analytics or reporting.",{"type":17,"tag":68,"props":115456,"children":115458},{"id":115457},"real-time-lead-capture-with-webhooks",[115459],{"type":23,"value":115460},"Real-Time Lead Capture with Webhooks",{"type":17,"tag":29,"props":115462,"children":115463},{},[115464],{"type":23,"value":115465},"Unified supports webhook events for form submissions.",{"type":17,"tag":29,"props":115467,"children":115468},{},[115469],{"type":23,"value":115470},"The primary events include:",{"type":17,"tag":80,"props":115472,"children":115473},{},[115474,115483,115492],{"type":17,"tag":84,"props":115475,"children":115476},{},[115477],{"type":17,"tag":6121,"props":115478,"children":115480},{"className":115479},[],[115481],{"type":23,"value":115482},"form.created",{"type":17,"tag":84,"props":115484,"children":115485},{},[115486],{"type":17,"tag":6121,"props":115487,"children":115489},{"className":115488},[],[115490],{"type":23,"value":115491},"form.updated",{"type":17,"tag":84,"props":115493,"children":115494},{},[115495],{"type":17,"tag":6121,"props":115496,"children":115498},{"className":115497},[],[115499],{"type":23,"value":115500},"submission.created",{"type":17,"tag":29,"props":115502,"children":115503},{},[115504,115506,115510],{"type":23,"value":115505},"The most important event for lead capture pipelines is ",{"type":17,"tag":48,"props":115507,"children":115508},{},[115509],{"type":23,"value":115500},{"type":23,"value":115511},", which fires whenever a respondent completes a form.",{"type":17,"tag":29,"props":115513,"children":115514},{},[115515],{"type":23,"value":115516},"Applications can subscribe to this webhook and trigger lead creation immediately when new submissions occur.",{"type":17,"tag":29,"props":115518,"children":115519},{},[115520],{"type":23,"value":115521},"This allows pipelines to process leads in real time rather than polling APIs repeatedly.",{"type":17,"tag":68,"props":115523,"children":115524},{"id":25342},[115525],{"type":23,"value":25345},{"type":17,"tag":29,"props":115527,"children":115528},{},[115529],{"type":23,"value":115530},"Unified supports a wide range of form and CRM integrations.",{"type":17,"tag":29,"props":115532,"children":115533},{},[115534],{"type":17,"tag":133,"props":115535,"children":115537},{"href":39954,"rel":115536},[214],[115538],{"type":17,"tag":48,"props":115539,"children":115540},{},[115541],{"type":23,"value":115542},"Form integrations",{"type":17,"tag":29,"props":115544,"children":115545},{},[115546],{"type":23,"value":24364},{"type":17,"tag":80,"props":115548,"children":115549},{},[115550,115554,115558],{"type":17,"tag":84,"props":115551,"children":115552},{},[115553],{"type":23,"value":39982},{"type":17,"tag":84,"props":115555,"children":115556},{},[115557],{"type":23,"value":39973},{"type":17,"tag":84,"props":115559,"children":115560},{},[115561],{"type":23,"value":39623},{"type":17,"tag":29,"props":115563,"children":115564},{},[115565],{"type":17,"tag":133,"props":115566,"children":115568},{"href":76501,"rel":115567},[214],[115569],{"type":17,"tag":48,"props":115570,"children":115571},{},[115572],{"type":23,"value":115573},"CRM integrations",{"type":17,"tag":29,"props":115575,"children":115576},{},[115577,115578,115582,115584,115588],{"type":23,"value":25244},{"type":17,"tag":133,"props":115579,"children":115580},{"href":61562},[115581],{"type":23,"value":61565},{"type":23,"value":115583}," supports ",{"type":17,"tag":48,"props":115585,"children":115586},{},[115587],{"type":23,"value":63279},{"type":23,"value":109313},{"type":17,"tag":80,"props":115590,"children":115591},{},[115592,115596,115600,115604,115608,115612,115616],{"type":17,"tag":84,"props":115593,"children":115594},{},[115595],{"type":23,"value":3179},{"type":17,"tag":84,"props":115597,"children":115598},{},[115599],{"type":23,"value":3184},{"type":17,"tag":84,"props":115601,"children":115602},{},[115603],{"type":23,"value":26530},{"type":17,"tag":84,"props":115605,"children":115606},{},[115607],{"type":23,"value":26535},{"type":17,"tag":84,"props":115609,"children":115610},{},[115611],{"type":23,"value":61598},{"type":17,"tag":84,"props":115613,"children":115614},{},[115615],{"type":23,"value":61628},{"type":17,"tag":84,"props":115617,"children":115618},{},[115619],{"type":23,"value":61620},{"type":17,"tag":29,"props":115621,"children":115622},{},[115623],{"type":23,"value":115624},"This allows lead capture pipelines to support many customer environments without building separate integrations.",{"type":17,"tag":68,"props":115626,"children":115627},{"id":73613},[115628],{"type":23,"value":73616},{"type":17,"tag":29,"props":115630,"children":115631},{},[115632],{"type":23,"value":115633},"Building lead pipelines across form providers and CRM systems requires multiple integrations.",{"type":17,"tag":29,"props":115635,"children":115636},{},[115637],{"type":23,"value":34257},{"type":17,"tag":80,"props":115639,"children":115640},{},[115641,115646,115651,115655],{"type":17,"tag":84,"props":115642,"children":115643},{},[115644],{"type":23,"value":115645},"normalized APIs across forms and CRM platforms",{"type":17,"tag":84,"props":115647,"children":115648},{},[115649],{"type":23,"value":115650},"consistent data models for submissions and leads",{"type":17,"tag":84,"props":115652,"children":115653},{},[115654],{"type":23,"value":51938},{"type":17,"tag":84,"props":115656,"children":115657},{},[115658],{"type":23,"value":115659},"webhook events for real-time ingestion",{"type":17,"tag":29,"props":115661,"children":115662},{},[115663],{"type":23,"value":115664},"Instead of maintaining dozens of integrations, product teams can focus on building lead qualification, enrichment, and routing workflows.",{"type":17,"tag":29,"props":115666,"children":115667},{},[115668],{"type":23,"value":115669},"Start building lead capture pipelines across Typeform, HubSpot, Salesforce, and many other platforms today.",{"type":17,"tag":29,"props":115671,"children":115672},{},[115673],{"type":17,"tag":133,"props":115674,"children":115676},{"href":1612,"rel":115675},[214],[115677],{"type":23,"value":44481},{"type":17,"tag":29,"props":115679,"children":115680},{},[115681],{"type":17,"tag":133,"props":115682,"children":115684},{"href":1623,"rel":115683},[214],[115685],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":115687},[115688,115689,115690,115691,115695,115696,115697,115698,115699,115700,115701,115702],{"id":114449,"depth":1629,"text":114452},{"id":114546,"depth":1629,"text":114549},{"id":114622,"depth":1629,"text":114625},{"id":24613,"depth":1629,"text":24616,"children":115692},[115693,115694],{"id":114719,"depth":1635,"text":114722},{"id":25770,"depth":1635,"text":25773},{"id":114876,"depth":1629,"text":114879},{"id":114938,"depth":1629,"text":114941},{"id":115134,"depth":1629,"text":115137},{"id":115320,"depth":1629,"text":115323},{"id":115369,"depth":1629,"text":115372},{"id":115457,"depth":1629,"text":115460},{"id":25342,"depth":1629,"text":25345},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_lead_capture_pipelines_across_typeform_hubspot_and_salesforce.md","blog/how_to_build_lead_capture_pipelines_across_typeform_hubspot_and_salesforce.md","blog/how_to_build_lead_capture_pipelines_across_typeform_hubspot_and_salesforce",{"_path":115707,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":115708,"description":115709,"img":115710,"date":114402,"tag":12,"body":115711,"_type":1677,"_id":116892,"_source":1679,"_file":116893,"_stem":116894,"_extension":1682},"/blog/how_to_build_revenue_analytics_across_stripe_salesforce_and_hubspot_with_crm_and_payments_apis","How to Build Revenue Analytics Across Stripe, Salesforce, and HubSpot with CRM and Payments APIs","Revenue analytics features are common in many B2B SaaS products. Customers want dashboards that combine sales pipeline data, subscription revenue, and payment...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_revenue_analytics_across_stripe_salesforce_and_hubspot_with_crm_and_payments_apis-icon.png",{"type":14,"children":115712,"toc":116873},[115713,115718,115721,115728,115733,115738,115743,115748,115752,115757,115761,115786,115791,115823,115828,115832,115837,115844,115849,115856,115861,115868,115873,115881,115886,115894,115899,115903,115913,115976,115981,115985,115990,115994,116083,116088,116092,116125,116130,116134,116192,116197,116201,116274,116279,116283,116288,116295,116300,116308,116313,116320,116325,116333,116338,116346,116351,116360,116365,116373,116382,116387,116392,116396,116400,116405,116429,116433,116441,116446,116452,116457,116461,116469,116474,116479,116487,116492,116497,116520,116525,116529,116534,116541,116546,116554,116559,116567,116572,116579,116589,116600,116605,116613,116618,116623,116627,116631,116636,116643,116659,116667,116685,116702,116707,116712,116716,116721,116732,116736,116767,116779,116783,116806,116811,116815,116820,116824,116847,116852,116857,116865],{"type":17,"tag":18,"props":115714,"children":115716},{"id":115715},"how-to-build-revenue-analytics-across-stripe-salesforce-and-hubspot-with-crm-and-payments-apis",[115717],{"type":23,"value":115708},{"type":17,"tag":25,"props":115719,"children":115720},{},[],{"type":17,"tag":29,"props":115722,"children":115723},{},[115724],{"type":17,"tag":33,"props":115725,"children":115726},{},[115727],{"type":23,"value":106378},{"type":17,"tag":29,"props":115729,"children":115730},{},[115731],{"type":23,"value":115732},"Revenue analytics features are common in many B2B SaaS products. Customers want dashboards that combine sales pipeline data, subscription revenue, and payment activity in one place so their teams can understand performance across the entire customer lifecycle.",{"type":17,"tag":29,"props":115734,"children":115735},{},[115736],{"type":23,"value":115737},"For example, a RevOps platform might show pipeline forecasts from Salesforce alongside subscription revenue from Stripe. A customer success analytics tool might correlate deal activity from HubSpot with recurring revenue metrics to identify high-value accounts or churn risk.",{"type":17,"tag":29,"props":115739,"children":115740},{},[115741],{"type":23,"value":115742},"The challenge is that this data typically lives in separate systems. Salesforce and HubSpot store CRM pipeline data, while Stripe manages subscriptions and payments. Each system exposes different APIs, authentication flows, and data models.",{"type":17,"tag":29,"props":115744,"children":115745},{},[115746],{"type":23,"value":115747},"Unified simplifies this by providing normalized APIs across CRM and payment platforms. Developers can retrieve pipeline, subscription, and payment data through consistent objects and endpoints, allowing their product to build revenue analytics features for customers without maintaining dozens of integrations.",{"type":17,"tag":68,"props":115749,"children":115750},{"id":112132},[115751],{"type":23,"value":112135},{"type":17,"tag":29,"props":115753,"children":115754},{},[115755],{"type":23,"value":115756},"Revenue analytics is a core capability in many SaaS platforms built for sales, RevOps, or finance teams.",{"type":17,"tag":29,"props":115758,"children":115759},{},[115760],{"type":23,"value":24364},{"type":17,"tag":80,"props":115762,"children":115763},{},[115764,115769,115773,115777,115782],{"type":17,"tag":84,"props":115765,"children":115766},{},[115767],{"type":23,"value":115768},"RevOps analytics platforms",{"type":17,"tag":84,"props":115770,"children":115771},{},[115772],{"type":23,"value":112158},{"type":17,"tag":84,"props":115774,"children":115775},{},[115776],{"type":23,"value":27776},{"type":17,"tag":84,"props":115778,"children":115779},{},[115780],{"type":23,"value":115781},"Customer success analytics platforms",{"type":17,"tag":84,"props":115783,"children":115784},{},[115785],{"type":23,"value":25587},{"type":17,"tag":29,"props":115787,"children":115788},{},[115789],{"type":23,"value":115790},"These products combine multiple sources of data:",{"type":17,"tag":80,"props":115792,"children":115793},{},[115794,115803,115813],{"type":17,"tag":84,"props":115795,"children":115796},{},[115797,115801],{"type":17,"tag":48,"props":115798,"children":115799},{},[115800],{"type":23,"value":106865},{"type":23,"value":115802}," from platforms like Salesforce and HubSpot",{"type":17,"tag":84,"props":115804,"children":115805},{},[115806,115811],{"type":17,"tag":48,"props":115807,"children":115808},{},[115809],{"type":23,"value":115810},"Subscription billing data",{"type":23,"value":115812}," from payment systems like Stripe",{"type":17,"tag":84,"props":115814,"children":115815},{},[115816,115821],{"type":17,"tag":48,"props":115817,"children":115818},{},[115819],{"type":23,"value":115820},"Payment transactions and collections",{"type":23,"value":115822}," across billing platforms",{"type":17,"tag":29,"props":115824,"children":115825},{},[115826],{"type":23,"value":115827},"When these data sources are connected, SaaS products can deliver dashboards that show the full lifecycle of revenue—from opportunity creation to recurring subscription revenue.",{"type":17,"tag":68,"props":115829,"children":115830},{"id":112214},[115831],{"type":23,"value":112217},{"type":17,"tag":29,"props":115833,"children":115834},{},[115835],{"type":23,"value":115836},"Revenue analytics dashboards typically support several common workflows.",{"type":17,"tag":29,"props":115838,"children":115839},{},[115840],{"type":17,"tag":48,"props":115841,"children":115842},{},[115843],{"type":23,"value":112230},{"type":17,"tag":29,"props":115845,"children":115846},{},[115847],{"type":23,"value":115848},"Sales teams estimate expected revenue using deal values and probability of closing.",{"type":17,"tag":29,"props":115850,"children":115851},{},[115852],{"type":17,"tag":48,"props":115853,"children":115854},{},[115855],{"type":23,"value":112282},{"type":17,"tag":29,"props":115857,"children":115858},{},[115859],{"type":23,"value":115860},"Products connect pipeline opportunities with subscription and payment data to measure conversion from deals to revenue.",{"type":17,"tag":29,"props":115862,"children":115863},{},[115864],{"type":17,"tag":48,"props":115865,"children":115866},{},[115867],{"type":23,"value":112269},{"type":17,"tag":29,"props":115869,"children":115870},{},[115871],{"type":23,"value":115872},"Subscription platforms track metrics such as MRR, ARR, renewals, and churn.",{"type":17,"tag":29,"props":115874,"children":115875},{},[115876],{"type":17,"tag":48,"props":115877,"children":115878},{},[115879],{"type":23,"value":115880},"Collections monitoring",{"type":17,"tag":29,"props":115882,"children":115883},{},[115884],{"type":23,"value":115885},"Finance teams analyze payments received against subscriptions and billing cycles.",{"type":17,"tag":29,"props":115887,"children":115888},{},[115889],{"type":17,"tag":48,"props":115890,"children":115891},{},[115892],{"type":23,"value":115893},"Customer revenue segmentation",{"type":17,"tag":29,"props":115895,"children":115896},{},[115897],{"type":23,"value":115898},"Analytics tools group customers by plan, revenue contribution, or contract size.",{"type":17,"tag":68,"props":115900,"children":115901},{"id":112290},[115902],{"type":23,"value":112293},{"type":17,"tag":29,"props":115904,"children":115905},{},[115906,115908,115912],{"type":23,"value":115907},"Revenue analytics products typically combine data from two ",{"type":17,"tag":133,"props":115909,"children":115910},{"href":7691},[115911],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":115914,"children":115915},{},[115916,115934],{"type":17,"tag":7235,"props":115917,"children":115918},{},[115919],{"type":17,"tag":7239,"props":115920,"children":115921},{},[115922,115926,115930],{"type":17,"tag":7243,"props":115923,"children":115924},{},[115925],{"type":23,"value":7247},{"type":17,"tag":7243,"props":115927,"children":115928},{},[115929],{"type":23,"value":24525},{"type":17,"tag":7243,"props":115931,"children":115932},{},[115933],{"type":23,"value":24530},{"type":17,"tag":7259,"props":115935,"children":115936},{},[115937,115956],{"type":17,"tag":7239,"props":115938,"children":115939},{},[115940,115948,115952],{"type":17,"tag":7266,"props":115941,"children":115942},{},[115943],{"type":17,"tag":133,"props":115944,"children":115946},{"href":107049,"rel":115945},[214],[115947],{"type":23,"value":25731},{"type":17,"tag":7266,"props":115949,"children":115950},{},[115951],{"type":23,"value":112343},{"type":17,"tag":7266,"props":115953,"children":115954},{},[115955],{"type":23,"value":25741},{"type":17,"tag":7239,"props":115957,"children":115958},{},[115959,115967,115972],{"type":17,"tag":7266,"props":115960,"children":115961},{},[115962],{"type":17,"tag":133,"props":115963,"children":115965},{"href":108361,"rel":115964},[214],[115966],{"type":23,"value":11737},{"type":17,"tag":7266,"props":115968,"children":115969},{},[115970],{"type":23,"value":115971},"Subscription and transaction data from billing platforms like Stripe",{"type":17,"tag":7266,"props":115973,"children":115974},{},[115975],{"type":23,"value":112368},{"type":17,"tag":29,"props":115977,"children":115978},{},[115979],{"type":23,"value":115980},"Using normalized APIs across these categories allows SaaS products to retrieve revenue data across multiple platforms through consistent endpoints.",{"type":17,"tag":68,"props":115982,"children":115983},{"id":24613},[115984],{"type":23,"value":24616},{"type":17,"tag":29,"props":115986,"children":115987},{},[115988],{"type":23,"value":115989},"Unified standardizes the core objects required to build revenue analytics dashboards.",{"type":17,"tag":239,"props":115991,"children":115992},{"id":25770},[115993],{"type":23,"value":25773},{"type":17,"tag":7231,"props":115995,"children":115996},{},[115997,116015],{"type":17,"tag":7235,"props":115998,"children":115999},{},[116000],{"type":17,"tag":7239,"props":116001,"children":116002},{},[116003,116007,116011],{"type":17,"tag":7243,"props":116004,"children":116005},{},[116006],{"type":23,"value":18594},{"type":17,"tag":7243,"props":116008,"children":116009},{},[116010],{"type":23,"value":22096},{"type":17,"tag":7243,"props":116012,"children":116013},{},[116014],{"type":23,"value":20787},{"type":17,"tag":7259,"props":116016,"children":116017},{},[116018,116035,116051,116067],{"type":17,"tag":7239,"props":116019,"children":116020},{},[116021,116025,116030],{"type":17,"tag":7266,"props":116022,"children":116023},{},[116024],{"type":23,"value":25810},{"type":17,"tag":7266,"props":116026,"children":116027},{},[116028],{"type":23,"value":116029},"amount, currency, probability, closing_at, stage_id",{"type":17,"tag":7266,"props":116031,"children":116032},{},[116033],{"type":23,"value":116034},"Represents pipeline opportunities",{"type":17,"tag":7239,"props":116036,"children":116037},{},[116038,116042,116046],{"type":17,"tag":7266,"props":116039,"children":116040},{},[116041],{"type":23,"value":25828},{"type":17,"tag":7266,"props":116043,"children":116044},{},[116045],{"type":23,"value":27013},{"type":17,"tag":7266,"props":116047,"children":116048},{},[116049],{"type":23,"value":116050},"Customer contact records",{"type":17,"tag":7239,"props":116052,"children":116053},{},[116054,116058,116062],{"type":17,"tag":7266,"props":116055,"children":116056},{},[116057],{"type":23,"value":25846},{"type":17,"tag":7266,"props":116059,"children":116060},{},[116061],{"type":23,"value":107173},{"type":17,"tag":7266,"props":116063,"children":116064},{},[116065],{"type":23,"value":116066},"Organization associated with deals",{"type":17,"tag":7239,"props":116068,"children":116069},{},[116070,116074,116078],{"type":17,"tag":7266,"props":116071,"children":116072},{},[116073],{"type":23,"value":14528},{"type":17,"tag":7266,"props":116075,"children":116076},{},[116077],{"type":23,"value":28074},{"type":17,"tag":7266,"props":116079,"children":116080},{},[116081],{"type":23,"value":116082},"Activity history such as calls or meetings",{"type":17,"tag":29,"props":116084,"children":116085},{},[116086],{"type":23,"value":116087},"Deal fields are particularly important for forecasting revenue.",{"type":17,"tag":29,"props":116089,"children":116090},{},[116091],{"type":23,"value":3258},{"type":17,"tag":80,"props":116093,"children":116094},{},[116095,116105,116115],{"type":17,"tag":84,"props":116096,"children":116097},{},[116098,116103],{"type":17,"tag":6121,"props":116099,"children":116101},{"className":116100},[],[116102],{"type":23,"value":25890},{"type":23,"value":116104}," represents the potential value of the opportunity",{"type":17,"tag":84,"props":116106,"children":116107},{},[116108,116113],{"type":17,"tag":6121,"props":116109,"children":116111},{"className":116110},[],[116112],{"type":23,"value":25901},{"type":23,"value":116114}," represents the likelihood of closing",{"type":17,"tag":84,"props":116116,"children":116117},{},[116118,116123],{"type":17,"tag":6121,"props":116119,"children":116121},{"className":116120},[],[116122],{"type":23,"value":25912},{"type":23,"value":116124}," represents the expected close date",{"type":17,"tag":29,"props":116126,"children":116127},{},[116128],{"type":23,"value":116129},"These fields allow analytics tools to estimate expected revenue.",{"type":17,"tag":239,"props":116131,"children":116132},{"id":25933},[116133],{"type":23,"value":25936},{"type":17,"tag":7231,"props":116135,"children":116136},{},[116137,116155],{"type":17,"tag":7235,"props":116138,"children":116139},{},[116140],{"type":17,"tag":7239,"props":116141,"children":116142},{},[116143,116147,116151],{"type":17,"tag":7243,"props":116144,"children":116145},{},[116146],{"type":23,"value":18594},{"type":17,"tag":7243,"props":116148,"children":116149},{},[116150],{"type":23,"value":22096},{"type":17,"tag":7243,"props":116152,"children":116153},{},[116154],{"type":23,"value":20787},{"type":17,"tag":7259,"props":116156,"children":116157},{},[116158,116175],{"type":17,"tag":7239,"props":116159,"children":116160},{},[116161,116165,116170],{"type":17,"tag":7266,"props":116162,"children":116163},{},[116164],{"type":23,"value":25973},{"type":17,"tag":7266,"props":116166,"children":116167},{},[116168],{"type":23,"value":116169},"total_amount, currency, payment_method, invoice_id",{"type":17,"tag":7266,"props":116171,"children":116172},{},[116173],{"type":23,"value":116174},"Records financial transactions",{"type":17,"tag":7239,"props":116176,"children":116177},{},[116178,116182,116187],{"type":17,"tag":7266,"props":116179,"children":116180},{},[116181],{"type":23,"value":25991},{"type":17,"tag":7266,"props":116183,"children":116184},{},[116185],{"type":23,"value":116186},"status, interval_unit, current_period_end_at",{"type":17,"tag":7266,"props":116188,"children":116189},{},[116190],{"type":23,"value":116191},"Represents recurring billing relationships",{"type":17,"tag":29,"props":116193,"children":116194},{},[116195],{"type":23,"value":116196},"The subscription object includes detailed fields used to calculate recurring revenue metrics.",{"type":17,"tag":29,"props":116198,"children":116199},{},[116200],{"type":23,"value":24637},{"type":17,"tag":80,"props":116202,"children":116203},{},[116204,116214,116230,116246,116256],{"type":17,"tag":84,"props":116205,"children":116206},{},[116207,116212],{"type":17,"tag":6121,"props":116208,"children":116210},{"className":116209},[],[116211],{"type":23,"value":19949},{"type":23,"value":116213}," – indicates whether the subscription is active, canceled, or paused",{"type":17,"tag":84,"props":116215,"children":116216},{},[116217,116222,116223,116228],{"type":17,"tag":6121,"props":116218,"children":116220},{"className":116219},[],[116221],{"type":23,"value":26028},{"type":23,"value":34435},{"type":17,"tag":6121,"props":116224,"children":116226},{"className":116225},[],[116227],{"type":23,"value":26036},{"type":23,"value":116229}," – define the billing cycle",{"type":17,"tag":84,"props":116231,"children":116232},{},[116233,116238,116239,116244],{"type":17,"tag":6121,"props":116234,"children":116236},{"className":116235},[],[116237],{"type":23,"value":26047},{"type":23,"value":34435},{"type":17,"tag":6121,"props":116240,"children":116242},{"className":116241},[],[116243],{"type":23,"value":26054},{"type":23,"value":116245}," – define billing frequency (monthly, yearly, etc.)",{"type":17,"tag":84,"props":116247,"children":116248},{},[116249,116254],{"type":17,"tag":6121,"props":116250,"children":116252},{"className":116251},[],[116253],{"type":23,"value":26065},{"type":23,"value":116255}," – subscription plan pricing information",{"type":17,"tag":84,"props":116257,"children":116258},{},[116259,116265,116266,116272],{"type":17,"tag":6121,"props":116260,"children":116262},{"className":116261},[],[116263],{"type":23,"value":116264},"unit_amount",{"type":23,"value":34435},{"type":17,"tag":6121,"props":116267,"children":116269},{"className":116268},[],[116270],{"type":23,"value":116271},"unit_quantity",{"type":23,"value":116273}," – pricing details used to compute recurring revenue",{"type":17,"tag":29,"props":116275,"children":116276},{},[116277],{"type":23,"value":116278},"These fields allow SaaS platforms to calculate metrics like MRR and ARR.",{"type":17,"tag":68,"props":116280,"children":116281},{"id":112504},[116282],{"type":23,"value":112507},{"type":17,"tag":29,"props":116284,"children":116285},{},[116286],{"type":23,"value":116287},"Revenue analytics platforms derive key metrics from CRM and payment data.",{"type":17,"tag":29,"props":116289,"children":116290},{},[116291],{"type":17,"tag":48,"props":116292,"children":116293},{},[116294],{"type":23,"value":26091},{"type":17,"tag":29,"props":116296,"children":116297},{},[116298],{"type":23,"value":116299},"Calculated using CRM deal data.",{"type":17,"tag":6893,"props":116301,"children":116303},{"className":116302,"code":26095,"language":20901,"meta":23},[20899],[116304],{"type":17,"tag":6121,"props":116305,"children":116306},{"__ignoreMap":7},[116307],{"type":23,"value":26095},{"type":17,"tag":29,"props":116309,"children":116310},{},[116311],{"type":23,"value":116312},"This estimates expected revenue based on opportunity probability.",{"type":17,"tag":29,"props":116314,"children":116315},{},[116316],{"type":17,"tag":48,"props":116317,"children":116318},{},[116319],{"type":23,"value":25983},{"type":17,"tag":29,"props":116321,"children":116322},{},[116323],{"type":23,"value":116324},"Calculated from payment transactions.",{"type":17,"tag":6893,"props":116326,"children":116328},{"className":116327,"code":112570,"language":20901,"meta":23},[20899],[116329],{"type":17,"tag":6121,"props":116330,"children":116331},{"__ignoreMap":7},[116332],{"type":23,"value":112570},{"type":17,"tag":29,"props":116334,"children":116335},{},[116336],{"type":23,"value":116337},"This metric tracks actual cash received from customers.",{"type":17,"tag":29,"props":116339,"children":116340},{},[116341],{"type":17,"tag":48,"props":116342,"children":116343},{},[116344],{"type":23,"value":116345},"Monthly recurring revenue (MRR)",{"type":17,"tag":29,"props":116347,"children":116348},{},[116349],{"type":23,"value":116350},"Calculated using active subscriptions.",{"type":17,"tag":6893,"props":116352,"children":116355},{"className":116353,"code":116354,"language":20901,"meta":23},[20899],"MRR = sum(active subscription monthly value)\n",[116356],{"type":17,"tag":6121,"props":116357,"children":116358},{"__ignoreMap":7},[116359],{"type":23,"value":116354},{"type":17,"tag":29,"props":116361,"children":116362},{},[116363],{"type":23,"value":116364},"Subscription billing cadence determines the conversion of revenue into monthly values.",{"type":17,"tag":29,"props":116366,"children":116367},{},[116368],{"type":17,"tag":48,"props":116369,"children":116370},{},[116371],{"type":23,"value":116372},"Annual recurring revenue (ARR)",{"type":17,"tag":6893,"props":116374,"children":116377},{"className":116375,"code":116376,"language":20901,"meta":23},[20899],"ARR = MRR * 12\n",[116378],{"type":17,"tag":6121,"props":116379,"children":116380},{"__ignoreMap":7},[116381],{"type":23,"value":116376},{"type":17,"tag":29,"props":116383,"children":116384},{},[116385],{"type":23,"value":116386},"ARR measures total recurring revenue across the customer base.",{"type":17,"tag":29,"props":116388,"children":116389},{},[116390],{"type":23,"value":116391},"These metrics allow analytics platforms to compare pipeline forecasts with actual subscription revenue.",{"type":17,"tag":68,"props":116393,"children":116394},{"id":112603},[116395],{"type":23,"value":112606},{"type":17,"tag":29,"props":116397,"children":116398},{},[116399],{"type":23,"value":26184},{"type":17,"tag":29,"props":116401,"children":116402},{},[116403],{"type":23,"value":116404},"Typical authorization flow:",{"type":17,"tag":6154,"props":116406,"children":116407},{},[116408,116412,116416,116420],{"type":17,"tag":84,"props":116409,"children":116410},{},[116411],{"type":23,"value":75678},{"type":17,"tag":84,"props":116413,"children":116414},{},[116415],{"type":23,"value":26201},{"type":17,"tag":84,"props":116417,"children":116418},{},[116419],{"type":23,"value":107456},{"type":17,"tag":84,"props":116421,"children":116422},{},[116423,116424,116428],{"type":23,"value":73306},{"type":17,"tag":48,"props":116425,"children":116426},{},[116427],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":116430,"children":116431},{},[116432],{"type":23,"value":73316},{"type":17,"tag":6893,"props":116434,"children":116436},{"className":116435,"code":25047,"language":20901,"meta":23},[20899],[116437],{"type":17,"tag":6121,"props":116438,"children":116439},{"__ignoreMap":7},[116440],{"type":23,"value":25047},{"type":17,"tag":29,"props":116442,"children":116443},{},[116444],{"type":23,"value":116445},"All Unified API requests reference this identifier to access customer integrations.",{"type":17,"tag":68,"props":116447,"children":116449},{"id":116448},"retrieving-crm-and-revenue-data",[116450],{"type":23,"value":116451},"Retrieving CRM and Revenue Data",{"type":17,"tag":29,"props":116453,"children":116454},{},[116455],{"type":23,"value":116456},"Revenue analytics dashboards retrieve data from CRM and payment APIs.",{"type":17,"tag":239,"props":116458,"children":116459},{"id":107496},[116460],{"type":23,"value":107499},{"type":17,"tag":6893,"props":116462,"children":116464},{"className":116463,"code":112688,"language":20901,"meta":23},[20899],[116465],{"type":17,"tag":6121,"props":116466,"children":116467},{"__ignoreMap":7},[116468],{"type":23,"value":112688},{"type":17,"tag":29,"props":116470,"children":116471},{},[116472],{"type":23,"value":116473},"These endpoints provide pipeline information and account context.",{"type":17,"tag":239,"props":116475,"children":116477},{"id":116476},"payments-endpoints",[116478],{"type":23,"value":112728},{"type":17,"tag":6893,"props":116480,"children":116482},{"className":116481,"code":26264,"language":20901,"meta":23},[20899],[116483],{"type":17,"tag":6121,"props":116484,"children":116485},{"__ignoreMap":7},[116486],{"type":23,"value":26264},{"type":17,"tag":29,"props":116488,"children":116489},{},[116490],{"type":23,"value":116491},"These endpoints return payment transactions and recurring subscription data.",{"type":17,"tag":29,"props":116493,"children":116494},{},[116495],{"type":23,"value":116496},"Applications typically use filters such as:",{"type":17,"tag":80,"props":116498,"children":116499},{},[116500,116510],{"type":17,"tag":84,"props":116501,"children":116502},{},[116503,116508],{"type":17,"tag":6121,"props":116504,"children":116506},{"className":116505},[],[116507],{"type":23,"value":26291},{"type":23,"value":116509}," to retrieve records updated after a given timestamp",{"type":17,"tag":84,"props":116511,"children":116512},{},[116513,116518],{"type":17,"tag":6121,"props":116514,"children":116516},{"className":116515},[],[116517],{"type":23,"value":26302},{"type":23,"value":116519}," to retrieve payments for specific customers",{"type":17,"tag":29,"props":116521,"children":116522},{},[116523],{"type":23,"value":116524},"This allows analytics pipelines to retrieve incremental updates efficiently.",{"type":17,"tag":68,"props":116526,"children":116527},{"id":112787},[116528],{"type":23,"value":112790},{"type":17,"tag":29,"props":116530,"children":116531},{},[116532],{"type":23,"value":116533},"A typical revenue analytics architecture follows this pattern.",{"type":17,"tag":29,"props":116535,"children":116536},{},[116537],{"type":17,"tag":48,"props":116538,"children":116539},{},[116540],{"type":23,"value":112803},{"type":17,"tag":29,"props":116542,"children":116543},{},[116544],{"type":23,"value":116545},"Customers authorize Salesforce, HubSpot, and Stripe through Unified Connect.",{"type":17,"tag":29,"props":116547,"children":116548},{},[116549],{"type":17,"tag":48,"props":116550,"children":116551},{},[116552],{"type":23,"value":116553},"2. Backfill CRM and subscription data",{"type":17,"tag":29,"props":116555,"children":116556},{},[116557],{"type":23,"value":116558},"Retrieve deals, payments, and subscriptions through paginated API requests.",{"type":17,"tag":29,"props":116560,"children":116561},{},[116562],{"type":17,"tag":48,"props":116563,"children":116564},{},[116565],{"type":23,"value":116566},"3. Store normalized records",{"type":17,"tag":29,"props":116568,"children":116569},{},[116570],{"type":23,"value":116571},"Persist CRM and payment data in your analytics database.",{"type":17,"tag":29,"props":116573,"children":116574},{},[116575],{"type":17,"tag":48,"props":116576,"children":116577},{},[116578],{"type":23,"value":112842},{"type":17,"tag":29,"props":116580,"children":116581},{},[116582,116583,116588],{"type":23,"value":48249},{"type":17,"tag":6121,"props":116584,"children":116586},{"className":116585},[],[116587],{"type":23,"value":26291},{"type":23,"value":112853},{"type":17,"tag":29,"props":116590,"children":116591},{},[116592],{"type":17,"tag":48,"props":116593,"children":116594},{},[116595,116596],{"type":23,"value":112861},{"type":17,"tag":133,"props":116597,"children":116598},{"href":4999},[116599],{"type":23,"value":5002},{"type":17,"tag":29,"props":116601,"children":116602},{},[116603],{"type":23,"value":116604},"Register webhook subscriptions to detect changes in CRM and payment records.",{"type":17,"tag":29,"props":116606,"children":116607},{},[116608],{"type":17,"tag":48,"props":116609,"children":116610},{},[116611],{"type":23,"value":116612},"6. Update analytics dashboards",{"type":17,"tag":29,"props":116614,"children":116615},{},[116616],{"type":23,"value":116617},"Recalculate revenue metrics and refresh dashboards in real time.",{"type":17,"tag":29,"props":116619,"children":116620},{},[116621],{"type":23,"value":116622},"This architecture keeps revenue dashboards synchronized with customer systems.",{"type":17,"tag":68,"props":116624,"children":116625},{"id":112891},[116626],{"type":23,"value":112894},{"type":17,"tag":29,"props":116628,"children":116629},{},[116630],{"type":23,"value":112899},{"type":17,"tag":29,"props":116632,"children":116633},{},[116634],{"type":23,"value":116635},"Common webhook events include:",{"type":17,"tag":29,"props":116637,"children":116638},{},[116639],{"type":17,"tag":48,"props":116640,"children":116641},{},[116642],{"type":23,"value":107795},{"type":17,"tag":80,"props":116644,"children":116645},{},[116646,116650,116654],{"type":17,"tag":84,"props":116647,"children":116648},{},[116649],{"type":23,"value":27531},{"type":17,"tag":84,"props":116651,"children":116652},{},[116653],{"type":23,"value":27536},{"type":17,"tag":84,"props":116655,"children":116656},{},[116657],{"type":23,"value":116658},"contact updated",{"type":17,"tag":29,"props":116660,"children":116661},{},[116662],{"type":17,"tag":48,"props":116663,"children":116664},{},[116665],{"type":23,"value":116666},"Payment events",{"type":17,"tag":80,"props":116668,"children":116669},{},[116670,116675,116680],{"type":17,"tag":84,"props":116671,"children":116672},{},[116673],{"type":23,"value":116674},"payment created",{"type":17,"tag":84,"props":116676,"children":116677},{},[116678],{"type":23,"value":116679},"subscription updated",{"type":17,"tag":84,"props":116681,"children":116682},{},[116683],{"type":23,"value":116684},"subscription canceled",{"type":17,"tag":29,"props":116686,"children":116687},{},[116688,116689,116693,116694,116701],{"type":23,"value":107847},{"type":17,"tag":48,"props":116690,"children":116691},{},[116692],{"type":23,"value":107852},{"type":23,"value":34435},{"type":17,"tag":48,"props":116695,"children":116696},{},[116697],{"type":17,"tag":133,"props":116698,"children":116699},{"href":9007},[116700],{"type":23,"value":46572},{"type":23,"value":54},{"type":17,"tag":29,"props":116703,"children":116704},{},[116705],{"type":23,"value":116706},"Native webhooks deliver immediate push notifications when supported by the provider. Virtual webhooks simulate real-time updates through managed polling when native webhooks are unavailable.",{"type":17,"tag":29,"props":116708,"children":116709},{},[116710],{"type":23,"value":116711},"These events ensure that revenue analytics dashboards always reflect the latest pipeline and subscription data.",{"type":17,"tag":68,"props":116713,"children":116714},{"id":25342},[116715],{"type":23,"value":25345},{"type":17,"tag":29,"props":116717,"children":116718},{},[116719],{"type":23,"value":116720},"Unified provides broad integration coverage across CRM and payment systems.",{"type":17,"tag":29,"props":116722,"children":116723},{},[116724],{"type":17,"tag":133,"props":116725,"children":116727},{"href":76501,"rel":116726},[214],[116728],{"type":17,"tag":48,"props":116729,"children":116730},{},[116731],{"type":23,"value":107885},{"type":17,"tag":29,"props":116733,"children":116734},{},[116735],{"type":23,"value":24364},{"type":17,"tag":80,"props":116737,"children":116738},{},[116739,116743,116747,116751,116755,116759,116763],{"type":17,"tag":84,"props":116740,"children":116741},{},[116742],{"type":23,"value":3179},{"type":17,"tag":84,"props":116744,"children":116745},{},[116746],{"type":23,"value":3184},{"type":17,"tag":84,"props":116748,"children":116749},{},[116750],{"type":23,"value":26530},{"type":17,"tag":84,"props":116752,"children":116753},{},[116754],{"type":23,"value":26535},{"type":17,"tag":84,"props":116756,"children":116757},{},[116758],{"type":23,"value":61598},{"type":17,"tag":84,"props":116760,"children":116761},{},[116762],{"type":23,"value":61628},{"type":17,"tag":84,"props":116764,"children":116765},{},[116766],{"type":23,"value":61620},{"type":17,"tag":29,"props":116768,"children":116769},{},[116770],{"type":17,"tag":133,"props":116771,"children":116773},{"href":37034,"rel":116772},[214],[116774],{"type":17,"tag":48,"props":116775,"children":116776},{},[116777],{"type":23,"value":116778},"Payment platforms (16 integrations)",{"type":17,"tag":29,"props":116780,"children":116781},{},[116782],{"type":23,"value":24364},{"type":17,"tag":80,"props":116784,"children":116785},{},[116786,116790,116794,116798,116802],{"type":17,"tag":84,"props":116787,"children":116788},{},[116789],{"type":23,"value":26548},{"type":17,"tag":84,"props":116791,"children":116792},{},[116793],{"type":23,"value":26553},{"type":17,"tag":84,"props":116795,"children":116796},{},[116797],{"type":23,"value":14193},{"type":17,"tag":84,"props":116799,"children":116800},{},[116801],{"type":23,"value":37078},{"type":17,"tag":84,"props":116803,"children":116804},{},[116805],{"type":23,"value":37073},{"type":17,"tag":29,"props":116807,"children":116808},{},[116809],{"type":23,"value":116810},"This allows revenue analytics products to support many customer environments without building individual integrations.",{"type":17,"tag":68,"props":116812,"children":116813},{"id":73613},[116814],{"type":23,"value":73616},{"type":17,"tag":29,"props":116816,"children":116817},{},[116818],{"type":23,"value":116819},"Building revenue analytics features across CRM and billing systems typically requires multiple integrations.",{"type":17,"tag":29,"props":116821,"children":116822},{},[116823],{"type":23,"value":34257},{"type":17,"tag":80,"props":116825,"children":116826},{},[116827,116832,116837,116842],{"type":17,"tag":84,"props":116828,"children":116829},{},[116830],{"type":23,"value":116831},"normalized APIs across CRM and payments platforms",{"type":17,"tag":84,"props":116833,"children":116834},{},[116835],{"type":23,"value":116836},"consistent data models for pipeline and subscription records",{"type":17,"tag":84,"props":116838,"children":116839},{},[116840],{"type":23,"value":116841},"unified authorization flows",{"type":17,"tag":84,"props":116843,"children":116844},{},[116845],{"type":23,"value":116846},"webhook events for real-time updates",{"type":17,"tag":29,"props":116848,"children":116849},{},[116850],{"type":23,"value":116851},"Instead of maintaining complex integration infrastructure, product teams can focus on building revenue insights and analytics features for their customers.",{"type":17,"tag":29,"props":116853,"children":116854},{},[116855],{"type":23,"value":116856},"Start building revenue analytics across Stripe, Salesforce, HubSpot, and dozens of other platforms today.",{"type":17,"tag":29,"props":116858,"children":116859},{},[116860],{"type":17,"tag":133,"props":116861,"children":116863},{"href":1612,"rel":116862},[214],[116864],{"type":23,"value":44481},{"type":17,"tag":29,"props":116866,"children":116867},{},[116868],{"type":17,"tag":133,"props":116869,"children":116871},{"href":1623,"rel":116870},[214],[116872],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":116874},[116875,116876,116877,116878,116882,116883,116884,116888,116889,116890,116891],{"id":112132,"depth":1629,"text":112135},{"id":112214,"depth":1629,"text":112217},{"id":112290,"depth":1629,"text":112293},{"id":24613,"depth":1629,"text":24616,"children":116879},[116880,116881],{"id":25770,"depth":1635,"text":25773},{"id":25933,"depth":1635,"text":25936},{"id":112504,"depth":1629,"text":112507},{"id":112603,"depth":1629,"text":112606},{"id":116448,"depth":1629,"text":116451,"children":116885},[116886,116887],{"id":107496,"depth":1635,"text":107499},{"id":116476,"depth":1635,"text":112728},{"id":112787,"depth":1629,"text":112790},{"id":112891,"depth":1629,"text":112894},{"id":25342,"depth":1629,"text":25345},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_revenue_analytics_across_stripe_salesforce_and_hubspot_with_crm_and_payments_apis.md","blog/how_to_build_revenue_analytics_across_stripe_salesforce_and_hubspot_with_crm_and_payments_apis.md","blog/how_to_build_revenue_analytics_across_stripe_salesforce_and_hubspot_with_crm_and_payments_apis",{"_path":116896,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":116897,"description":116898,"img":116899,"date":116900,"tag":12,"body":116901,"_type":1677,"_id":118203,"_source":1679,"_file":118204,"_stem":118205,"_extension":1682},"/blog/how_to_build_interview_coordination_across_ats_and_calendar_platforms_with_ats_and_calendar_apis","How to Build Interview Coordination Across ATS and Calendar Platforms with ATS and Calendar APIs","Recruiting platforms often provide interview coordination tools that help hiring teams schedule, manage, and track candidate interviews. These tools allow...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_interview_coordination_across_ats_and_calendar_platforms_with_ats_and_calendar_apis-icon.png","2026-03-04T15:56:00.000Z",{"type":14,"children":116902,"toc":118184},[116903,116908,116911,116918,116923,116928,116933,116938,116944,116949,116953,116980,116985,116989,117038,117043,117049,117059,117116,117121,117127,117132,117138,117148,117152,117233,117238,117243,117253,117257,117353,117358,117381,117387,117397,117401,117555,117560,117566,117576,117580,117606,117610,117618,117623,117629,117634,117639,117648,117653,117676,117681,117687,117692,117697,117705,117710,117811,117816,117825,117836,117847,117853,117858,117863,117872,117877,117886,117891,117950,117955,117959,117964,117969,117973,118000,118005,118022,118026,118031,118037,118041,118080,118086,118090,118118,118123,118127,118132,118136,118158,118163,118168,118176],{"type":17,"tag":18,"props":116904,"children":116906},{"id":116905},"how-to-build-interview-coordination-across-ats-and-calendar-platforms-with-ats-and-calendar-apis",[116907],{"type":23,"value":116897},{"type":17,"tag":25,"props":116909,"children":116910},{},[],{"type":17,"tag":29,"props":116912,"children":116913},{},[116914],{"type":17,"tag":33,"props":116915,"children":116916},{},[116917],{"type":23,"value":106378},{"type":17,"tag":29,"props":116919,"children":116920},{},[116921],{"type":23,"value":116922},"Recruiting platforms often provide interview coordination tools that help hiring teams schedule, manage, and track candidate interviews. These tools allow recruiters to coordinate availability across interviewers, schedule meetings with candidates, and automatically update hiring systems.",{"type":17,"tag":29,"props":116924,"children":116925},{},[116926],{"type":23,"value":116927},"Many SaaS products build these capabilities directly into their platforms. Instead of manually coordinating interviews across email, calendars, and ATS systems, recruiters can manage the entire workflow in one place.",{"type":17,"tag":29,"props":116929,"children":116930},{},[116931],{"type":23,"value":116932},"The challenge is that interview data and scheduling systems live in different tools. Applicant tracking systems (ATS) such as Greenhouse or Lever store candidate and application data, while calendar systems like Outlook or Google Calendar manage availability and meeting scheduling.",{"type":17,"tag":29,"props":116934,"children":116935},{},[116936],{"type":23,"value":116937},"Unified simplifies this process by providing normalized APIs across ATS and calendar platforms. Developers can retrieve candidate and application data from ATS systems and create interview events in calendar platforms using a consistent API.",{"type":17,"tag":68,"props":116939,"children":116941},{"id":116940},"why-saas-products-build-interview-coordination-features",[116942],{"type":23,"value":116943},"Why SaaS Products Build Interview Coordination Features",{"type":17,"tag":29,"props":116945,"children":116946},{},[116947],{"type":23,"value":116948},"Interview coordination is a common feature in many recruiting products.",{"type":17,"tag":29,"props":116950,"children":116951},{},[116952],{"type":23,"value":24364},{"type":17,"tag":80,"props":116954,"children":116955},{},[116956,116961,116966,116971,116976],{"type":17,"tag":84,"props":116957,"children":116958},{},[116959],{"type":23,"value":116960},"Recruiting workflow platforms",{"type":17,"tag":84,"props":116962,"children":116963},{},[116964],{"type":23,"value":116965},"Candidate scheduling tools",{"type":17,"tag":84,"props":116967,"children":116968},{},[116969],{"type":23,"value":116970},"Hiring coordination platforms",{"type":17,"tag":84,"props":116972,"children":116973},{},[116974],{"type":23,"value":116975},"Interview management software",{"type":17,"tag":84,"props":116977,"children":116978},{},[116979],{"type":23,"value":55874},{"type":17,"tag":29,"props":116981,"children":116982},{},[116983],{"type":23,"value":116984},"These products help their customers manage interview workflows more efficiently.",{"type":17,"tag":29,"props":116986,"children":116987},{},[116988],{"type":23,"value":12607},{"type":17,"tag":80,"props":116990,"children":116991},{},[116992,117002,117012,117022,117030],{"type":17,"tag":84,"props":116993,"children":116994},{},[116995,117000],{"type":17,"tag":48,"props":116996,"children":116997},{},[116998],{"type":23,"value":116999},"Recruiter-scheduled interviews",{"type":23,"value":117001}," where recruiters choose available time slots",{"type":17,"tag":84,"props":117003,"children":117004},{},[117005,117010],{"type":17,"tag":48,"props":117006,"children":117007},{},[117008],{"type":23,"value":117009},"Candidate self-scheduling links",{"type":23,"value":117011}," that allow candidates to select interview times",{"type":17,"tag":84,"props":117013,"children":117014},{},[117015,117020],{"type":17,"tag":48,"props":117016,"children":117017},{},[117018],{"type":23,"value":117019},"Panel interview coordination",{"type":23,"value":117021}," with multiple interviewers",{"type":17,"tag":84,"props":117023,"children":117024},{},[117025],{"type":17,"tag":48,"props":117026,"children":117027},{},[117028],{"type":23,"value":117029},"Automatic rescheduling and cancellations",{"type":17,"tag":84,"props":117031,"children":117032},{},[117033],{"type":17,"tag":48,"props":117034,"children":117035},{},[117036],{"type":23,"value":117037},"Interview feedback collection workflows",{"type":17,"tag":29,"props":117039,"children":117040},{},[117041],{"type":23,"value":117042},"By integrating with customer ATS and calendar systems, SaaS products can automate these workflows without requiring recruiters to manage them manually.",{"type":17,"tag":68,"props":117044,"children":117046},{"id":117045},"unified-categories-used-for-interview-coordination",[117047],{"type":23,"value":117048},"Unified Categories Used for Interview Coordination",{"type":17,"tag":29,"props":117050,"children":117051},{},[117052,117054,117058],{"type":23,"value":117053},"Interview coordination combines data from two ",{"type":17,"tag":133,"props":117055,"children":117056},{"href":7691},[117057],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":117060,"children":117061},{},[117062,117080],{"type":17,"tag":7235,"props":117063,"children":117064},{},[117065],{"type":17,"tag":7239,"props":117066,"children":117067},{},[117068,117072,117076],{"type":17,"tag":7243,"props":117069,"children":117070},{},[117071],{"type":23,"value":7247},{"type":17,"tag":7243,"props":117073,"children":117074},{},[117075],{"type":23,"value":24525},{"type":17,"tag":7243,"props":117077,"children":117078},{},[117079],{"type":23,"value":24530},{"type":17,"tag":7259,"props":117081,"children":117082},{},[117083,117100],{"type":17,"tag":7239,"props":117084,"children":117085},{},[117086,117090,117095],{"type":17,"tag":7266,"props":117087,"children":117088},{},[117089],{"type":23,"value":11756},{"type":17,"tag":7266,"props":117091,"children":117092},{},[117093],{"type":23,"value":117094},"Candidate and application workflow data from platforms like Greenhouse or Lever",{"type":17,"tag":7266,"props":117096,"children":117097},{},[117098],{"type":23,"value":117099},"candidate, application, interview",{"type":17,"tag":7239,"props":117101,"children":117102},{},[117103,117107,117112],{"type":17,"tag":7266,"props":117104,"children":117105},{},[117106],{"type":23,"value":73899},{"type":17,"tag":7266,"props":117108,"children":117109},{},[117110],{"type":23,"value":117111},"Calendar events used to schedule interviews",{"type":17,"tag":7266,"props":117113,"children":117114},{},[117115],{"type":23,"value":73973},{"type":17,"tag":29,"props":117117,"children":117118},{},[117119],{"type":23,"value":117120},"Using normalized APIs across these categories allows SaaS platforms to coordinate interview scheduling without building separate integrations for each ATS or calendar provider.",{"type":17,"tag":68,"props":117122,"children":117124},{"id":117123},"unified-ats-objects-and-key-fields",[117125],{"type":23,"value":117126},"Unified ATS Objects and Key Fields",{"type":17,"tag":29,"props":117128,"children":117129},{},[117130],{"type":23,"value":117131},"Interview scheduling relies on several ATS objects.",{"type":17,"tag":239,"props":117133,"children":117135},{"id":117134},"candidate",[117136],{"type":23,"value":117137},"Candidate",{"type":17,"tag":29,"props":117139,"children":117140},{},[117141,117142,117146],{"type":23,"value":6712},{"type":17,"tag":48,"props":117143,"children":117144},{},[117145],{"type":23,"value":117134},{"type":23,"value":117147}," object represents the person being interviewed.",{"type":17,"tag":29,"props":117149,"children":117150},{},[117151],{"type":23,"value":24637},{"type":17,"tag":7231,"props":117153,"children":117154},{},[117155,117169],{"type":17,"tag":7235,"props":117156,"children":117157},{},[117158],{"type":17,"tag":7239,"props":117159,"children":117160},{},[117161,117165],{"type":17,"tag":7243,"props":117162,"children":117163},{},[117164],{"type":23,"value":24651},{"type":17,"tag":7243,"props":117166,"children":117167},{},[117168],{"type":23,"value":20787},{"type":17,"tag":7259,"props":117170,"children":117171},{},[117172,117184,117197,117209,117221],{"type":17,"tag":7239,"props":117173,"children":117174},{},[117175,117179],{"type":17,"tag":7266,"props":117176,"children":117177},{},[117178],{"type":23,"value":18766},{"type":17,"tag":7266,"props":117180,"children":117181},{},[117182],{"type":23,"value":117183},"Unique identifier for the candidate",{"type":17,"tag":7239,"props":117185,"children":117186},{},[117187,117192],{"type":17,"tag":7266,"props":117188,"children":117189},{},[117190],{"type":23,"value":117191},"first_name / last_name",{"type":17,"tag":7266,"props":117193,"children":117194},{},[117195],{"type":23,"value":117196},"Candidate name",{"type":17,"tag":7239,"props":117198,"children":117199},{},[117200,117204],{"type":17,"tag":7266,"props":117201,"children":117202},{},[117203],{"type":23,"value":50735},{"type":17,"tag":7266,"props":117205,"children":117206},{},[117207],{"type":23,"value":117208},"Used to send calendar invitations",{"type":17,"tag":7239,"props":117210,"children":117211},{},[117212,117216],{"type":17,"tag":7266,"props":117213,"children":117214},{},[117215],{"type":23,"value":62355},{"type":17,"tag":7266,"props":117217,"children":117218},{},[117219],{"type":23,"value":117220},"Candidate contact information",{"type":17,"tag":7239,"props":117222,"children":117223},{},[117224,117228],{"type":17,"tag":7266,"props":117225,"children":117226},{},[117227],{"type":23,"value":24743},{"type":17,"tag":7266,"props":117229,"children":117230},{},[117231],{"type":23,"value":117232},"Record timestamps",{"type":17,"tag":29,"props":117234,"children":117235},{},[117236],{"type":23,"value":117237},"These fields allow scheduling systems to identify the candidate and send interview notifications.",{"type":17,"tag":239,"props":117239,"children":117240},{"id":97116},[117241],{"type":23,"value":117242},"Application",{"type":17,"tag":29,"props":117244,"children":117245},{},[117246,117247,117251],{"type":23,"value":6712},{"type":17,"tag":48,"props":117248,"children":117249},{},[117250],{"type":23,"value":97116},{"type":23,"value":117252}," object connects a candidate to a specific job.",{"type":17,"tag":29,"props":117254,"children":117255},{},[117256],{"type":23,"value":24637},{"type":17,"tag":7231,"props":117258,"children":117259},{},[117260,117274],{"type":17,"tag":7235,"props":117261,"children":117262},{},[117263],{"type":17,"tag":7239,"props":117264,"children":117265},{},[117266,117270],{"type":17,"tag":7243,"props":117267,"children":117268},{},[117269],{"type":23,"value":24651},{"type":17,"tag":7243,"props":117271,"children":117272},{},[117273],{"type":23,"value":20787},{"type":17,"tag":7259,"props":117275,"children":117276},{},[117277,117289,117302,117315,117327,117340],{"type":17,"tag":7239,"props":117278,"children":117279},{},[117280,117284],{"type":17,"tag":7266,"props":117281,"children":117282},{},[117283],{"type":23,"value":18766},{"type":17,"tag":7266,"props":117285,"children":117286},{},[117287],{"type":23,"value":117288},"Unique identifier for the application",{"type":17,"tag":7239,"props":117290,"children":117291},{},[117292,117297],{"type":17,"tag":7266,"props":117293,"children":117294},{},[117295],{"type":23,"value":117296},"candidate_id",{"type":17,"tag":7266,"props":117298,"children":117299},{},[117300],{"type":23,"value":117301},"Candidate associated with the application",{"type":17,"tag":7239,"props":117303,"children":117304},{},[117305,117310],{"type":17,"tag":7266,"props":117306,"children":117307},{},[117308],{"type":23,"value":117309},"job_id",{"type":17,"tag":7266,"props":117311,"children":117312},{},[117313],{"type":23,"value":117314},"Job being applied for",{"type":17,"tag":7239,"props":117316,"children":117317},{},[117318,117322],{"type":17,"tag":7266,"props":117319,"children":117320},{},[117321],{"type":23,"value":19949},{"type":17,"tag":7266,"props":117323,"children":117324},{},[117325],{"type":23,"value":117326},"Current stage in the hiring pipeline",{"type":17,"tag":7239,"props":117328,"children":117329},{},[117330,117335],{"type":17,"tag":7266,"props":117331,"children":117332},{},[117333],{"type":23,"value":117334},"original_status",{"type":17,"tag":7266,"props":117336,"children":117337},{},[117338],{"type":23,"value":117339},"Provider-specific stage label",{"type":17,"tag":7239,"props":117341,"children":117342},{},[117343,117348],{"type":17,"tag":7266,"props":117344,"children":117345},{},[117346],{"type":23,"value":117347},"applied_at",{"type":17,"tag":7266,"props":117349,"children":117350},{},[117351],{"type":23,"value":117352},"Application timestamp",{"type":17,"tag":29,"props":117354,"children":117355},{},[117356],{"type":23,"value":117357},"Application stages often determine when interviews should be scheduled.",{"type":17,"tag":29,"props":117359,"children":117360},{},[117361,117363,117368,117369,117374,117375,117380],{"type":23,"value":117362},"For example, interviews may be triggered when a candidate enters stages such as ",{"type":17,"tag":48,"props":117364,"children":117365},{},[117366],{"type":23,"value":117367},"SCREENING",{"type":23,"value":11826},{"type":17,"tag":48,"props":117370,"children":117371},{},[117372],{"type":23,"value":117373},"INTERVIEW",{"type":23,"value":27293},{"type":17,"tag":48,"props":117376,"children":117377},{},[117378],{"type":23,"value":117379},"FINAL_INTERVIEW",{"type":23,"value":54},{"type":17,"tag":239,"props":117382,"children":117384},{"id":117383},"interview",[117385],{"type":23,"value":117386},"Interview",{"type":17,"tag":29,"props":117388,"children":117389},{},[117390,117391,117395],{"type":23,"value":6712},{"type":17,"tag":48,"props":117392,"children":117393},{},[117394],{"type":23,"value":117383},{"type":23,"value":117396}," object stores interview scheduling information.",{"type":17,"tag":29,"props":117398,"children":117399},{},[117400],{"type":23,"value":24637},{"type":17,"tag":7231,"props":117402,"children":117403},{},[117404,117418],{"type":17,"tag":7235,"props":117405,"children":117406},{},[117407],{"type":17,"tag":7239,"props":117408,"children":117409},{},[117410,117414],{"type":17,"tag":7243,"props":117411,"children":117412},{},[117413],{"type":23,"value":24651},{"type":17,"tag":7243,"props":117415,"children":117416},{},[117417],{"type":23,"value":20787},{"type":17,"tag":7259,"props":117419,"children":117420},{},[117421,117433,117445,117458,117470,117482,117494,117506,117518,117530,117543],{"type":17,"tag":7239,"props":117422,"children":117423},{},[117424,117428],{"type":17,"tag":7266,"props":117425,"children":117426},{},[117427],{"type":23,"value":18766},{"type":17,"tag":7266,"props":117429,"children":117430},{},[117431],{"type":23,"value":117432},"Unique interview identifier",{"type":17,"tag":7239,"props":117434,"children":117435},{},[117436,117440],{"type":17,"tag":7266,"props":117437,"children":117438},{},[117439],{"type":23,"value":117296},{"type":17,"tag":7266,"props":117441,"children":117442},{},[117443],{"type":23,"value":117444},"Candidate being interviewed",{"type":17,"tag":7239,"props":117446,"children":117447},{},[117448,117453],{"type":17,"tag":7266,"props":117449,"children":117450},{},[117451],{"type":23,"value":117452},"application_id",{"type":17,"tag":7266,"props":117454,"children":117455},{},[117456],{"type":23,"value":117457},"Application associated with the interview",{"type":17,"tag":7239,"props":117459,"children":117460},{},[117461,117465],{"type":17,"tag":7266,"props":117462,"children":117463},{},[117464],{"type":23,"value":117309},{"type":17,"tag":7266,"props":117466,"children":117467},{},[117468],{"type":23,"value":117469},"Job associated with the interview",{"type":17,"tag":7239,"props":117471,"children":117472},{},[117473,117477],{"type":17,"tag":7266,"props":117474,"children":117475},{},[117476],{"type":23,"value":111357},{"type":17,"tag":7266,"props":117478,"children":117479},{},[117480],{"type":23,"value":117481},"Interviewers participating in the interview",{"type":17,"tag":7239,"props":117483,"children":117484},{},[117485,117489],{"type":17,"tag":7266,"props":117486,"children":117487},{},[117488],{"type":23,"value":19949},{"type":17,"tag":7266,"props":117490,"children":117491},{},[117492],{"type":23,"value":117493},"Interview state (SCHEDULED, COMPLETE, CANCELED, etc.)",{"type":17,"tag":7239,"props":117495,"children":117496},{},[117497,117501],{"type":17,"tag":7266,"props":117498,"children":117499},{},[117500],{"type":23,"value":21051},{"type":17,"tag":7266,"props":117502,"children":117503},{},[117504],{"type":23,"value":117505},"Interview start time",{"type":17,"tag":7239,"props":117507,"children":117508},{},[117509,117513],{"type":17,"tag":7266,"props":117510,"children":117511},{},[117512],{"type":23,"value":21060},{"type":17,"tag":7266,"props":117514,"children":117515},{},[117516],{"type":23,"value":117517},"Interview end time",{"type":17,"tag":7239,"props":117519,"children":117520},{},[117521,117525],{"type":17,"tag":7266,"props":117522,"children":117523},{},[117524],{"type":23,"value":74134},{"type":17,"tag":7266,"props":117526,"children":117527},{},[117528],{"type":23,"value":117529},"Meeting location or virtual meeting link",{"type":17,"tag":7239,"props":117531,"children":117532},{},[117533,117538],{"type":17,"tag":7266,"props":117534,"children":117535},{},[117536],{"type":23,"value":117537},"external_event_xref",{"type":17,"tag":7266,"props":117539,"children":117540},{},[117541],{"type":23,"value":117542},"ID of the associated calendar event",{"type":17,"tag":7239,"props":117544,"children":117545},{},[117546,117550],{"type":17,"tag":7266,"props":117547,"children":117548},{},[117549],{"type":23,"value":24743},{"type":17,"tag":7266,"props":117551,"children":117552},{},[117553],{"type":23,"value":117554},"Interview timestamps",{"type":17,"tag":29,"props":117556,"children":117557},{},[117558],{"type":23,"value":117559},"These fields allow interview coordination tools to track interview schedules and participants.",{"type":17,"tag":68,"props":117561,"children":117563},{"id":117562},"connecting-customer-ats-and-calendars",[117564],{"type":23,"value":117565},"Connecting Customer ATS and Calendars",{"type":17,"tag":29,"props":117567,"children":117568},{},[117569,117571,117575],{"type":23,"value":117570},"Customers authorize their ATS and calendar platforms using ",{"type":17,"tag":48,"props":117572,"children":117573},{},[117574],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":117577,"children":117578},{},[117579],{"type":23,"value":26189},{"type":17,"tag":6154,"props":117581,"children":117582},{},[117583,117587,117592,117596],{"type":17,"tag":84,"props":117584,"children":117585},{},[117586],{"type":23,"value":73291},{"type":17,"tag":84,"props":117588,"children":117589},{},[117590],{"type":23,"value":117591},"The user selects integrations such as Greenhouse, Outlook, or Google Calendar.",{"type":17,"tag":84,"props":117593,"children":117594},{},[117595],{"type":23,"value":74599},{"type":17,"tag":84,"props":117597,"children":117598},{},[117599,117601,117605],{"type":23,"value":117600},"Unified redirects back with a ",{"type":17,"tag":48,"props":117602,"children":117603},{},[117604],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":117607,"children":117608},{},[117609],{"type":23,"value":73316},{"type":17,"tag":6893,"props":117611,"children":117613},{"className":117612,"code":25047,"language":20901,"meta":23},[20899],[117614],{"type":17,"tag":6121,"props":117615,"children":117616},{"__ignoreMap":7},[117617],{"type":23,"value":25047},{"type":17,"tag":29,"props":117619,"children":117620},{},[117621],{"type":23,"value":117622},"All subsequent API requests reference this identifier.",{"type":17,"tag":68,"props":117624,"children":117626},{"id":117625},"retrieving-candidate-and-application-data",[117627],{"type":23,"value":117628},"Retrieving Candidate and Application Data",{"type":17,"tag":29,"props":117630,"children":117631},{},[117632],{"type":23,"value":117633},"Interview coordination begins by retrieving candidate and application data from the ATS.",{"type":17,"tag":29,"props":117635,"children":117636},{},[117637],{"type":23,"value":117638},"Example endpoints include:",{"type":17,"tag":6893,"props":117640,"children":117643},{"className":117641,"code":117642,"language":20901,"meta":23},[20899],"GET /ats/{connection_id}/candidate\nGET /ats/{connection_id}/application\nGET /ats/{connection_id}/interview\nGET /ats/{connection_id}/job\n",[117644],{"type":17,"tag":6121,"props":117645,"children":117646},{"__ignoreMap":7},[117647],{"type":23,"value":117642},{"type":17,"tag":29,"props":117649,"children":117650},{},[117651],{"type":23,"value":117652},"These endpoints allow the application to:",{"type":17,"tag":80,"props":117654,"children":117655},{},[117656,117661,117666,117671],{"type":17,"tag":84,"props":117657,"children":117658},{},[117659],{"type":23,"value":117660},"retrieve candidate contact details",{"type":17,"tag":84,"props":117662,"children":117663},{},[117664],{"type":23,"value":117665},"identify the job associated with the interview",{"type":17,"tag":84,"props":117667,"children":117668},{},[117669],{"type":23,"value":117670},"determine the application stage",{"type":17,"tag":84,"props":117672,"children":117673},{},[117674],{"type":23,"value":117675},"view existing interviews",{"type":17,"tag":29,"props":117677,"children":117678},{},[117679],{"type":23,"value":117680},"This data provides the context needed for scheduling.",{"type":17,"tag":68,"props":117682,"children":117684},{"id":117683},"scheduling-interviews-in-calendars",[117685],{"type":23,"value":117686},"Scheduling Interviews in Calendars",{"type":17,"tag":29,"props":117688,"children":117689},{},[117690],{"type":23,"value":117691},"Once interview details are determined, the system schedules a meeting in the interviewer calendars.",{"type":17,"tag":29,"props":117693,"children":117694},{},[117695],{"type":23,"value":117696},"Unified supports creating calendar events using:",{"type":17,"tag":6893,"props":117698,"children":117700},{"className":117699,"code":113946,"language":20901,"meta":23},[20899],[117701],{"type":17,"tag":6121,"props":117702,"children":117703},{"__ignoreMap":7},[117704],{"type":23,"value":113946},{"type":17,"tag":29,"props":117706,"children":117707},{},[117708],{"type":23,"value":117709},"Important writable fields include:",{"type":17,"tag":7231,"props":117711,"children":117712},{},[117713,117727],{"type":17,"tag":7235,"props":117714,"children":117715},{},[117716],{"type":17,"tag":7239,"props":117717,"children":117718},{},[117719,117723],{"type":17,"tag":7243,"props":117720,"children":117721},{},[117722],{"type":23,"value":24651},{"type":17,"tag":7243,"props":117724,"children":117725},{},[117726],{"type":23,"value":20787},{"type":17,"tag":7259,"props":117728,"children":117729},{},[117730,117742,117753,117764,117776,117787,117799],{"type":17,"tag":7239,"props":117731,"children":117732},{},[117733,117737],{"type":17,"tag":7266,"props":117734,"children":117735},{},[117736],{"type":23,"value":62346},{"type":17,"tag":7266,"props":117738,"children":117739},{},[117740],{"type":23,"value":117741},"Descriptive subject for the interview",{"type":17,"tag":7239,"props":117743,"children":117744},{},[117745,117749],{"type":17,"tag":7266,"props":117746,"children":117747},{},[117748],{"type":23,"value":21051},{"type":17,"tag":7266,"props":117750,"children":117751},{},[117752],{"type":23,"value":117505},{"type":17,"tag":7239,"props":117754,"children":117755},{},[117756,117760],{"type":17,"tag":7266,"props":117757,"children":117758},{},[117759],{"type":23,"value":21060},{"type":17,"tag":7266,"props":117761,"children":117762},{},[117763],{"type":23,"value":117517},{"type":17,"tag":7239,"props":117765,"children":117766},{},[117767,117771],{"type":17,"tag":7266,"props":117768,"children":117769},{},[117770],{"type":23,"value":74080},{"type":17,"tag":7266,"props":117772,"children":117773},{},[117774],{"type":23,"value":117775},"Candidate and interviewers",{"type":17,"tag":7239,"props":117777,"children":117778},{},[117779,117783],{"type":17,"tag":7266,"props":117780,"children":117781},{},[117782],{"type":23,"value":74098},{"type":17,"tag":7266,"props":117784,"children":117785},{},[117786],{"type":23,"value":114035},{"type":17,"tag":7239,"props":117788,"children":117789},{},[117790,117794],{"type":17,"tag":7266,"props":117791,"children":117792},{},[117793],{"type":23,"value":74134},{"type":17,"tag":7266,"props":117795,"children":117796},{},[117797],{"type":23,"value":117798},"Physical meeting location",{"type":17,"tag":7239,"props":117800,"children":117801},{},[117802,117806],{"type":17,"tag":7266,"props":117803,"children":117804},{},[117805],{"type":23,"value":24679},{"type":17,"tag":7266,"props":117807,"children":117808},{},[117809],{"type":23,"value":117810},"Interview agenda or preparation notes",{"type":17,"tag":29,"props":117812,"children":117813},{},[117814],{"type":23,"value":117815},"Example event title:",{"type":17,"tag":6893,"props":117817,"children":117820},{"className":117818,"code":117819,"language":20901,"meta":23},[20899],"Frontend Engineer Interview – Round 2\n",[117821],{"type":17,"tag":6121,"props":117822,"children":117823},{"__ignoreMap":7},[117824],{"type":23,"value":117819},{"type":17,"tag":29,"props":117826,"children":117827},{},[117828,117829,117834],{"type":23,"value":6712},{"type":17,"tag":6121,"props":117830,"children":117832},{"className":117831},[],[117833],{"type":23,"value":74080},{"type":23,"value":117835}," field ensures interviewers and candidates receive invitations.",{"type":17,"tag":29,"props":117837,"children":117838},{},[117839,117840,117845],{"type":23,"value":6712},{"type":17,"tag":6121,"props":117841,"children":117843},{"className":117842},[],[117844],{"type":23,"value":74098},{"type":23,"value":117846}," field allows adding Zoom, Google Meet, or Teams meeting links.",{"type":17,"tag":68,"props":117848,"children":117850},{"id":117849},"creating-and-updating-ats-interview-records",[117851],{"type":23,"value":117852},"Creating and Updating ATS Interview Records",{"type":17,"tag":29,"props":117854,"children":117855},{},[117856],{"type":23,"value":117857},"Unified also allows creating or updating interview records in the ATS.",{"type":17,"tag":29,"props":117859,"children":117860},{},[117861],{"type":23,"value":117862},"Create an interview:",{"type":17,"tag":6893,"props":117864,"children":117867},{"className":117865,"code":117866,"language":20901,"meta":23},[20899],"POST /ats/{connection_id}/interview\n",[117868],{"type":17,"tag":6121,"props":117869,"children":117870},{"__ignoreMap":7},[117871],{"type":23,"value":117866},{"type":17,"tag":29,"props":117873,"children":117874},{},[117875],{"type":23,"value":117876},"Update an interview:",{"type":17,"tag":6893,"props":117878,"children":117881},{"className":117879,"code":117880,"language":20901,"meta":23},[20899],"PUT /ats/{connection_id}/interview/{id}\n",[117882],{"type":17,"tag":6121,"props":117883,"children":117884},{"__ignoreMap":7},[117885],{"type":23,"value":117880},{"type":17,"tag":29,"props":117887,"children":117888},{},[117889],{"type":23,"value":117890},"Writable fields include:",{"type":17,"tag":80,"props":117892,"children":117893},{},[117894,117902,117910,117918,117926,117934,117942],{"type":17,"tag":84,"props":117895,"children":117896},{},[117897],{"type":17,"tag":6121,"props":117898,"children":117900},{"className":117899},[],[117901],{"type":23,"value":117296},{"type":17,"tag":84,"props":117903,"children":117904},{},[117905],{"type":17,"tag":6121,"props":117906,"children":117908},{"className":117907},[],[117909],{"type":23,"value":117452},{"type":17,"tag":84,"props":117911,"children":117912},{},[117913],{"type":17,"tag":6121,"props":117914,"children":117916},{"className":117915},[],[117917],{"type":23,"value":111357},{"type":17,"tag":84,"props":117919,"children":117920},{},[117921],{"type":17,"tag":6121,"props":117922,"children":117924},{"className":117923},[],[117925],{"type":23,"value":19949},{"type":17,"tag":84,"props":117927,"children":117928},{},[117929],{"type":17,"tag":6121,"props":117930,"children":117932},{"className":117931},[],[117933],{"type":23,"value":21051},{"type":17,"tag":84,"props":117935,"children":117936},{},[117937],{"type":17,"tag":6121,"props":117938,"children":117940},{"className":117939},[],[117941],{"type":23,"value":21060},{"type":17,"tag":84,"props":117943,"children":117944},{},[117945],{"type":17,"tag":6121,"props":117946,"children":117948},{"className":117947},[],[117949],{"type":23,"value":74134},{"type":17,"tag":29,"props":117951,"children":117952},{},[117953],{"type":23,"value":117954},"These endpoints ensure the ATS remains synchronized with scheduled interviews.",{"type":17,"tag":68,"props":117956,"children":117957},{"id":114160},[117958],{"type":23,"value":114163},{"type":17,"tag":29,"props":117960,"children":117961},{},[117962],{"type":23,"value":117963},"Interview coordination tools must react to scheduling changes.",{"type":17,"tag":29,"props":117965,"children":117966},{},[117967],{"type":23,"value":117968},"Unified provides webhook events that notify applications when calendar events change.",{"type":17,"tag":29,"props":117970,"children":117971},{},[117972],{"type":23,"value":74835},{"type":17,"tag":80,"props":117974,"children":117975},{},[117976,117984,117992],{"type":17,"tag":84,"props":117977,"children":117978},{},[117979],{"type":17,"tag":6121,"props":117980,"children":117982},{"className":117981},[],[117983],{"type":23,"value":74863},{"type":17,"tag":84,"props":117985,"children":117986},{},[117987],{"type":17,"tag":6121,"props":117988,"children":117990},{"className":117989},[],[117991],{"type":23,"value":74876},{"type":17,"tag":84,"props":117993,"children":117994},{},[117995],{"type":17,"tag":6121,"props":117996,"children":117998},{"className":117997},[],[117999],{"type":23,"value":74889},{"type":17,"tag":29,"props":118001,"children":118002},{},[118003],{"type":23,"value":118004},"These events allow scheduling systems to:",{"type":17,"tag":80,"props":118006,"children":118007},{},[118008,118013,118017],{"type":17,"tag":84,"props":118009,"children":118010},{},[118011],{"type":23,"value":118012},"update interview times",{"type":17,"tag":84,"props":118014,"children":118015},{},[118016],{"type":23,"value":114242},{"type":17,"tag":84,"props":118018,"children":118019},{},[118020],{"type":23,"value":118021},"cancel interviews when necessary",{"type":17,"tag":68,"props":118023,"children":118024},{"id":25342},[118025],{"type":23,"value":25345},{"type":17,"tag":29,"props":118027,"children":118028},{},[118029],{"type":23,"value":118030},"Unified supports a wide range of hiring and scheduling integrations.",{"type":17,"tag":239,"props":118032,"children":118034},{"id":118033},"ats-platforms-73-integrations",[118035],{"type":23,"value":118036},"ATS Platforms (73 integrations)",{"type":17,"tag":29,"props":118038,"children":118039},{},[118040],{"type":23,"value":24364},{"type":17,"tag":80,"props":118042,"children":118043},{},[118044,118048,118052,118056,118060,118064,118068,118072,118076],{"type":17,"tag":84,"props":118045,"children":118046},{},[118047],{"type":23,"value":3189},{"type":17,"tag":84,"props":118049,"children":118050},{},[118051],{"type":23,"value":56545},{"type":17,"tag":84,"props":118053,"children":118054},{},[118055],{"type":23,"value":75326},{"type":17,"tag":84,"props":118057,"children":118058},{},[118059],{"type":23,"value":75321},{"type":17,"tag":84,"props":118061,"children":118062},{},[118063],{"type":23,"value":75316},{"type":17,"tag":84,"props":118065,"children":118066},{},[118067],{"type":23,"value":59319},{"type":17,"tag":84,"props":118069,"children":118070},{},[118071],{"type":23,"value":75331},{"type":17,"tag":84,"props":118073,"children":118074},{},[118075],{"type":23,"value":3194},{"type":17,"tag":84,"props":118077,"children":118078},{},[118079],{"type":23,"value":56564},{"type":17,"tag":239,"props":118081,"children":118083},{"id":118082},"calendar-platforms-27-integrations",[118084],{"type":23,"value":118085},"Calendar Platforms (27 integrations)",{"type":17,"tag":29,"props":118087,"children":118088},{},[118089],{"type":23,"value":24364},{"type":17,"tag":80,"props":118091,"children":118092},{},[118093,118097,118101,118106,118110,118114],{"type":17,"tag":84,"props":118094,"children":118095},{},[118096],{"type":23,"value":13669},{"type":17,"tag":84,"props":118098,"children":118099},{},[118100],{"type":23,"value":14455},{"type":17,"tag":84,"props":118102,"children":118103},{},[118104],{"type":23,"value":118105},"Zoom Calendar",{"type":17,"tag":84,"props":118107,"children":118108},{},[118109],{"type":23,"value":13678},{"type":17,"tag":84,"props":118111,"children":118112},{},[118113],{"type":23,"value":14108},{"type":17,"tag":84,"props":118115,"children":118116},{},[118117],{"type":23,"value":14129},{"type":17,"tag":29,"props":118119,"children":118120},{},[118121],{"type":23,"value":118122},"This allows recruiting platforms to support many customer environments without building separate integrations.",{"type":17,"tag":68,"props":118124,"children":118125},{"id":73613},[118126],{"type":23,"value":73616},{"type":17,"tag":29,"props":118128,"children":118129},{},[118130],{"type":23,"value":118131},"Building interview coordination features typically requires integrating with multiple ATS platforms and calendar systems.",{"type":17,"tag":29,"props":118133,"children":118134},{},[118135],{"type":23,"value":34257},{"type":17,"tag":80,"props":118137,"children":118138},{},[118139,118144,118149,118154],{"type":17,"tag":84,"props":118140,"children":118141},{},[118142],{"type":23,"value":118143},"normalized ATS objects for candidates, applications, and interviews",{"type":17,"tag":84,"props":118145,"children":118146},{},[118147],{"type":23,"value":118148},"unified calendar APIs for scheduling events",{"type":17,"tag":84,"props":118150,"children":118151},{},[118152],{"type":23,"value":118153},"consistent authentication through Unified Connect",{"type":17,"tag":84,"props":118155,"children":118156},{},[118157],{"type":23,"value":116846},{"type":17,"tag":29,"props":118159,"children":118160},{},[118161],{"type":23,"value":118162},"Instead of maintaining dozens of integrations, product teams can focus on building recruiting workflows that help hiring teams schedule and manage interviews efficiently.",{"type":17,"tag":29,"props":118164,"children":118165},{},[118166],{"type":23,"value":118167},"Start building interview coordination across Greenhouse, Outlook, Google Calendar, and dozens of other platforms today.",{"type":17,"tag":29,"props":118169,"children":118170},{},[118171],{"type":17,"tag":133,"props":118172,"children":118174},{"href":1612,"rel":118173},[214],[118175],{"type":23,"value":44481},{"type":17,"tag":29,"props":118177,"children":118178},{},[118179],{"type":17,"tag":133,"props":118180,"children":118182},{"href":1623,"rel":118181},[214],[118183],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":118185},[118186,118187,118188,118193,118194,118195,118196,118197,118198,118202],{"id":116940,"depth":1629,"text":116943},{"id":117045,"depth":1629,"text":117048},{"id":117123,"depth":1629,"text":117126,"children":118189},[118190,118191,118192],{"id":117134,"depth":1635,"text":117137},{"id":97116,"depth":1635,"text":117242},{"id":117383,"depth":1635,"text":117386},{"id":117562,"depth":1629,"text":117565},{"id":117625,"depth":1629,"text":117628},{"id":117683,"depth":1629,"text":117686},{"id":117849,"depth":1629,"text":117852},{"id":114160,"depth":1629,"text":114163},{"id":25342,"depth":1629,"text":25345,"children":118199},[118200,118201],{"id":118033,"depth":1635,"text":118036},{"id":118082,"depth":1635,"text":118085},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_interview_coordination_across_ats_and_calendar_platforms_with_ats_and_calendar_apis.md","blog/how_to_build_interview_coordination_across_ats_and_calendar_platforms_with_ats_and_calendar_apis.md","blog/how_to_build_interview_coordination_across_ats_and_calendar_platforms_with_ats_and_calendar_apis",{"_path":118207,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":118208,"description":118209,"img":118210,"date":116900,"tag":12,"body":118211,"_type":1677,"_id":119560,"_source":1679,"_file":119561,"_stem":119562,"_extension":1682},"/blog/how_to_build_sales_activity_tracking_across_salesforce_hubspot_gmail_and_slack","How to Build Sales Activity Tracking Across Salesforce, HubSpot, Gmail, and Slack","Sales teams generate activity across many platforms. Customer conversations happen in Gmail, internal discussions occur in Slack, and deal updates and meeting...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_sales_activity_tracking_across_salesforce_hubspot_gmail_and_slack-icon.png",{"type":14,"children":118212,"toc":119544},[118213,118218,118221,118228,118233,118238,118243,118248,118254,118259,118263,118288,118293,118298,118339,118344,118350,118355,118363,118368,118376,118381,118389,118394,118402,118407,118414,118419,118425,118435,118499,118504,118508,118513,118519,118608,118618,118630,118635,118713,118718,118722,118812,118816,118871,118876,118880,118889,118893,118919,118923,118931,118936,118942,118947,118955,118963,118974,119060,119065,119073,119082,119087,119109,119115,119120,119127,119136,119144,119153,119158,119166,119171,119177,119182,119187,119267,119272,119290,119295,119301,119306,119310,119317,119334,119341,119362,119367,119379,119383,119390,119395,119400,119404,119409,119416,119420,119451,119458,119462,119477,119482,119486,119491,119495,119518,119523,119528,119536],{"type":17,"tag":18,"props":118214,"children":118216},{"id":118215},"how-to-build-sales-activity-tracking-across-salesforce-hubspot-gmail-and-slack",[118217],{"type":23,"value":118208},{"type":17,"tag":25,"props":118219,"children":118220},{},[],{"type":17,"tag":29,"props":118222,"children":118223},{},[118224],{"type":17,"tag":33,"props":118225,"children":118226},{},[118227],{"type":23,"value":106378},{"type":17,"tag":29,"props":118229,"children":118230},{},[118231],{"type":23,"value":118232},"Sales teams generate activity across many platforms. Customer conversations happen in Gmail, internal discussions occur in Slack, and deal updates and meeting logs are recorded in CRM systems like Salesforce or HubSpot.",{"type":17,"tag":29,"props":118234,"children":118235},{},[118236],{"type":23,"value":118237},"Many SaaS products build features that unify this activity so sales teams can see a complete engagement timeline. Instead of switching between tools, users can view calls, meetings, emails, notes, and messages in a single activity feed tied to each account or deal.",{"type":17,"tag":29,"props":118239,"children":118240},{},[118241],{"type":23,"value":118242},"The challenge is that each platform exposes different APIs, schemas, and authentication models. Retrieving CRM activities from Salesforce and email conversations from Gmail requires separate integrations and vendor-specific logic.",{"type":17,"tag":29,"props":118244,"children":118245},{},[118246],{"type":23,"value":118247},"Unified simplifies this by providing normalized APIs across CRM and messaging platforms. Developers can retrieve activities, conversations, and engagement signals through consistent objects and endpoints and combine them into a unified sales activity timeline for their customers.",{"type":17,"tag":68,"props":118249,"children":118251},{"id":118250},"why-saas-products-need-sales-activity-tracking",[118252],{"type":23,"value":118253},"Why SaaS Products Need Sales Activity Tracking",{"type":17,"tag":29,"props":118255,"children":118256},{},[118257],{"type":23,"value":118258},"Sales activity tracking is a core capability in many B2B SaaS products.",{"type":17,"tag":29,"props":118260,"children":118261},{},[118262],{"type":23,"value":24364},{"type":17,"tag":80,"props":118264,"children":118265},{},[118266,118271,118275,118279,118284],{"type":17,"tag":84,"props":118267,"children":118268},{},[118269],{"type":23,"value":118270},"Sales productivity platforms",{"type":17,"tag":84,"props":118272,"children":118273},{},[118274],{"type":23,"value":27776},{"type":17,"tag":84,"props":118276,"children":118277},{},[118278],{"type":23,"value":112163},{"type":17,"tag":84,"props":118280,"children":118281},{},[118282],{"type":23,"value":118283},"Account intelligence dashboards",{"type":17,"tag":84,"props":118285,"children":118286},{},[118287],{"type":23,"value":25587},{"type":17,"tag":29,"props":118289,"children":118290},{},[118291],{"type":23,"value":118292},"These products help sales teams understand what interactions have occurred with each prospect or customer.",{"type":17,"tag":29,"props":118294,"children":118295},{},[118296],{"type":23,"value":118297},"Typical activity sources include:",{"type":17,"tag":80,"props":118299,"children":118300},{},[118301,118311,118320,118329],{"type":17,"tag":84,"props":118302,"children":118303},{},[118304,118309],{"type":17,"tag":48,"props":118305,"children":118306},{},[118307],{"type":23,"value":118308},"CRM activities",{"type":23,"value":118310}," such as calls, meetings, notes, and tasks",{"type":17,"tag":84,"props":118312,"children":118313},{},[118314,118318],{"type":17,"tag":48,"props":118315,"children":118316},{},[118317],{"type":23,"value":106875},{"type":23,"value":118319}," between sales representatives and prospects",{"type":17,"tag":84,"props":118321,"children":118322},{},[118323,118327],{"type":17,"tag":48,"props":118324,"children":118325},{},[118326],{"type":23,"value":106885},{"type":23,"value":118328}," related to deals or accounts",{"type":17,"tag":84,"props":118330,"children":118331},{},[118332,118337],{"type":17,"tag":48,"props":118333,"children":118334},{},[118335],{"type":23,"value":118336},"Website and form engagement signals",{"type":23,"value":118338}," captured in CRM events",{"type":17,"tag":29,"props":118340,"children":118341},{},[118342],{"type":23,"value":118343},"By combining these sources, SaaS products can build timelines that show the complete history of customer engagement.",{"type":17,"tag":68,"props":118345,"children":118347},{"id":118346},"common-sales-activity-tracking-use-cases",[118348],{"type":23,"value":118349},"Common Sales Activity Tracking Use Cases",{"type":17,"tag":29,"props":118351,"children":118352},{},[118353],{"type":23,"value":118354},"Sales activity tracking typically powers several product features.",{"type":17,"tag":29,"props":118356,"children":118357},{},[118358],{"type":17,"tag":48,"props":118359,"children":118360},{},[118361],{"type":23,"value":118362},"Account activity timelines",{"type":17,"tag":29,"props":118364,"children":118365},{},[118366],{"type":23,"value":118367},"Show all interactions related to a specific customer or company.",{"type":17,"tag":29,"props":118369,"children":118370},{},[118371],{"type":17,"tag":48,"props":118372,"children":118373},{},[118374],{"type":23,"value":118375},"Deal engagement analysis",{"type":17,"tag":29,"props":118377,"children":118378},{},[118379],{"type":23,"value":118380},"Track activity across deals to identify stalled opportunities or inactive accounts.",{"type":17,"tag":29,"props":118382,"children":118383},{},[118384],{"type":17,"tag":48,"props":118385,"children":118386},{},[118387],{"type":23,"value":118388},"Sales productivity dashboards",{"type":17,"tag":29,"props":118390,"children":118391},{},[118392],{"type":23,"value":118393},"Measure how often sales teams interact with prospects.",{"type":17,"tag":29,"props":118395,"children":118396},{},[118397],{"type":17,"tag":48,"props":118398,"children":118399},{},[118400],{"type":23,"value":118401},"Customer engagement insights",{"type":17,"tag":29,"props":118403,"children":118404},{},[118405],{"type":23,"value":118406},"Identify accounts with declining activity or strong engagement signals.",{"type":17,"tag":29,"props":118408,"children":118409},{},[118410],{"type":17,"tag":48,"props":118411,"children":118412},{},[118413],{"type":23,"value":25587},{"type":17,"tag":29,"props":118415,"children":118416},{},[118417],{"type":23,"value":118418},"Provide context for copilots that summarize conversations and recommend next actions.",{"type":17,"tag":68,"props":118420,"children":118422},{"id":118421},"unified-categories-used-in-sales-activity-tracking",[118423],{"type":23,"value":118424},"Unified Categories Used in Sales Activity Tracking",{"type":17,"tag":29,"props":118426,"children":118427},{},[118428,118430,118434],{"type":23,"value":118429},"Sales activity tracking typically combines two ",{"type":17,"tag":133,"props":118431,"children":118432},{"href":7691},[118433],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":118436,"children":118437},{},[118438,118456],{"type":17,"tag":7235,"props":118439,"children":118440},{},[118441],{"type":17,"tag":7239,"props":118442,"children":118443},{},[118444,118448,118452],{"type":17,"tag":7243,"props":118445,"children":118446},{},[118447],{"type":23,"value":7247},{"type":17,"tag":7243,"props":118449,"children":118450},{},[118451],{"type":23,"value":24525},{"type":17,"tag":7243,"props":118453,"children":118454},{},[118455],{"type":23,"value":24530},{"type":17,"tag":7259,"props":118457,"children":118458},{},[118459,118479],{"type":17,"tag":7239,"props":118460,"children":118461},{},[118462,118470,118475],{"type":17,"tag":7266,"props":118463,"children":118464},{},[118465],{"type":17,"tag":133,"props":118466,"children":118468},{"href":107049,"rel":118467},[214],[118469],{"type":23,"value":25731},{"type":17,"tag":7266,"props":118471,"children":118472},{},[118473],{"type":23,"value":118474},"Sales pipeline and activity records from platforms like Salesforce and HubSpot",{"type":17,"tag":7266,"props":118476,"children":118477},{},[118478],{"type":23,"value":25741},{"type":17,"tag":7239,"props":118480,"children":118481},{},[118482,118490,118495],{"type":17,"tag":7266,"props":118483,"children":118484},{},[118485],{"type":17,"tag":133,"props":118486,"children":118488},{"href":107070,"rel":118487},[214],[118489],{"type":23,"value":24559},{"type":17,"tag":7266,"props":118491,"children":118492},{},[118493],{"type":23,"value":118494},"Email and chat conversations from platforms like Gmail and Slack",{"type":17,"tag":7266,"props":118496,"children":118497},{},[118498],{"type":23,"value":24569},{"type":17,"tag":29,"props":118500,"children":118501},{},[118502],{"type":23,"value":118503},"Using normalized APIs across these categories allows SaaS products to build activity feeds without writing separate integrations for each platform.",{"type":17,"tag":68,"props":118505,"children":118506},{"id":24613},[118507],{"type":23,"value":24616},{"type":17,"tag":29,"props":118509,"children":118510},{},[118511],{"type":23,"value":118512},"Unified standardizes the objects needed to build activity timelines.",{"type":17,"tag":239,"props":118514,"children":118516},{"id":118515},"crm-activity-objects",[118517],{"type":23,"value":118518},"CRM Activity Objects",{"type":17,"tag":7231,"props":118520,"children":118521},{},[118522,118540],{"type":17,"tag":7235,"props":118523,"children":118524},{},[118525],{"type":17,"tag":7239,"props":118526,"children":118527},{},[118528,118532,118536],{"type":17,"tag":7243,"props":118529,"children":118530},{},[118531],{"type":23,"value":18594},{"type":17,"tag":7243,"props":118533,"children":118534},{},[118535],{"type":23,"value":22096},{"type":17,"tag":7243,"props":118537,"children":118538},{},[118539],{"type":23,"value":20787},{"type":17,"tag":7259,"props":118541,"children":118542},{},[118543,118560,118576,118591],{"type":17,"tag":7239,"props":118544,"children":118545},{},[118546,118550,118555],{"type":17,"tag":7266,"props":118547,"children":118548},{},[118549],{"type":23,"value":14528},{"type":17,"tag":7266,"props":118551,"children":118552},{},[118553],{"type":23,"value":118554},"type, created_at, updated_at, contact_ids, company_ids, deal_ids, user_id",{"type":17,"tag":7266,"props":118556,"children":118557},{},[118558],{"type":23,"value":118559},"Represents sales activities such as calls or meetings",{"type":17,"tag":7239,"props":118561,"children":118562},{},[118563,118567,118571],{"type":17,"tag":7266,"props":118564,"children":118565},{},[118566],{"type":23,"value":25828},{"type":17,"tag":7266,"props":118568,"children":118569},{},[118570],{"type":23,"value":27013},{"type":17,"tag":7266,"props":118572,"children":118573},{},[118574],{"type":23,"value":118575},"Customer contact information",{"type":17,"tag":7239,"props":118577,"children":118578},{},[118579,118583,118587],{"type":17,"tag":7266,"props":118580,"children":118581},{},[118582],{"type":23,"value":25846},{"type":17,"tag":7266,"props":118584,"children":118585},{},[118586],{"type":23,"value":25851},{"type":17,"tag":7266,"props":118588,"children":118589},{},[118590],{"type":23,"value":116066},{"type":17,"tag":7239,"props":118592,"children":118593},{},[118594,118598,118603],{"type":17,"tag":7266,"props":118595,"children":118596},{},[118597],{"type":23,"value":25810},{"type":17,"tag":7266,"props":118599,"children":118600},{},[118601],{"type":23,"value":118602},"amount, stage_id, probability",{"type":17,"tag":7266,"props":118604,"children":118605},{},[118606],{"type":23,"value":118607},"Opportunity context",{"type":17,"tag":29,"props":118609,"children":118610},{},[118611,118612,118616],{"type":23,"value":6712},{"type":17,"tag":48,"props":118613,"children":118614},{},[118615],{"type":23,"value":62633},{"type":23,"value":118617}," object represents CRM activities.",{"type":17,"tag":29,"props":118619,"children":118620},{},[118621,118622,118628],{"type":23,"value":6712},{"type":17,"tag":6121,"props":118623,"children":118625},{"className":118624},[],[118626],{"type":23,"value":118627},"event.type",{"type":23,"value":118629}," field identifies the activity category.",{"type":17,"tag":29,"props":118631,"children":118632},{},[118633],{"type":23,"value":118634},"Supported values include:",{"type":17,"tag":80,"props":118636,"children":118637},{},[118638,118647,118656,118665,118674,118683,118693,118703],{"type":17,"tag":84,"props":118639,"children":118640},{},[118641,118645],{"type":17,"tag":48,"props":118642,"children":118643},{},[118644],{"type":23,"value":27047},{"type":23,"value":118646}," – unstructured notes attached to CRM records",{"type":17,"tag":84,"props":118648,"children":118649},{},[118650,118654],{"type":17,"tag":48,"props":118651,"children":118652},{},[118653],{"type":23,"value":27052},{"type":23,"value":118655}," – one-to-one email communication",{"type":17,"tag":84,"props":118657,"children":118658},{},[118659,118663],{"type":17,"tag":48,"props":118660,"children":118661},{},[118662],{"type":23,"value":27067},{"type":23,"value":118664}," – follow-up reminders or to-do items",{"type":17,"tag":84,"props":118666,"children":118667},{},[118668,118672],{"type":17,"tag":48,"props":118669,"children":118670},{},[118671],{"type":23,"value":27062},{"type":23,"value":118673}," – scheduled meetings or demos",{"type":17,"tag":84,"props":118675,"children":118676},{},[118677,118681],{"type":17,"tag":48,"props":118678,"children":118679},{},[118680],{"type":23,"value":27057},{"type":23,"value":118682}," – logged phone calls",{"type":17,"tag":84,"props":118684,"children":118685},{},[118686,118691],{"type":17,"tag":48,"props":118687,"children":118688},{},[118689],{"type":23,"value":118690},"MARKETING_EMAIL",{"type":23,"value":118692}," – marketing campaign emails",{"type":17,"tag":84,"props":118694,"children":118695},{},[118696,118701],{"type":17,"tag":48,"props":118697,"children":118698},{},[118699],{"type":23,"value":118700},"FORM",{"type":23,"value":118702}," – inbound form submissions",{"type":17,"tag":84,"props":118704,"children":118705},{},[118706,118711],{"type":17,"tag":48,"props":118707,"children":118708},{},[118709],{"type":23,"value":118710},"PAGE_VIEW",{"type":23,"value":118712}," – web activity events",{"type":17,"tag":29,"props":118714,"children":118715},{},[118716],{"type":23,"value":118717},"These standardized values allow activity tracking across different CRM platforms.",{"type":17,"tag":239,"props":118719,"children":118720},{"id":24756},[118721],{"type":23,"value":24759},{"type":17,"tag":7231,"props":118723,"children":118724},{},[118725,118743],{"type":17,"tag":7235,"props":118726,"children":118727},{},[118728],{"type":17,"tag":7239,"props":118729,"children":118730},{},[118731,118735,118739],{"type":17,"tag":7243,"props":118732,"children":118733},{},[118734],{"type":23,"value":18594},{"type":17,"tag":7243,"props":118736,"children":118737},{},[118738],{"type":23,"value":22096},{"type":17,"tag":7243,"props":118740,"children":118741},{},[118742],{"type":23,"value":20787},{"type":17,"tag":7259,"props":118744,"children":118745},{},[118746,118762,118778,118794],{"type":17,"tag":7239,"props":118747,"children":118748},{},[118749,118753,118757],{"type":17,"tag":7266,"props":118750,"children":118751},{},[118752],{"type":23,"value":15800},{"type":17,"tag":7266,"props":118754,"children":118755},{},[118756],{"type":23,"value":27119},{"type":17,"tag":7266,"props":118758,"children":118759},{},[118760],{"type":23,"value":118761},"Email or Slack message content",{"type":17,"tag":7239,"props":118763,"children":118764},{},[118765,118769,118773],{"type":17,"tag":7266,"props":118766,"children":118767},{},[118768],{"type":23,"value":15787},{"type":17,"tag":7266,"props":118770,"children":118771},{},[118772],{"type":23,"value":24817},{"type":17,"tag":7266,"props":118774,"children":118775},{},[118776],{"type":23,"value":118777},"Messaging context such as Slack channels",{"type":17,"tag":7239,"props":118779,"children":118780},{},[118781,118785,118789],{"type":17,"tag":7266,"props":118782,"children":118783},{},[118784],{"type":23,"value":107279},{"type":17,"tag":7266,"props":118786,"children":118787},{},[118788],{"type":23,"value":107284},{"type":17,"tag":7266,"props":118790,"children":118791},{},[118792],{"type":23,"value":118793},"Conversation threads",{"type":17,"tag":7239,"props":118795,"children":118796},{},[118797,118802,118807],{"type":17,"tag":7266,"props":118798,"children":118799},{},[118800],{"type":23,"value":118801},"User",{"type":17,"tag":7266,"props":118803,"children":118804},{},[118805],{"type":23,"value":118806},"name, email, role",{"type":17,"tag":7266,"props":118808,"children":118809},{},[118810],{"type":23,"value":118811},"Sender and recipient information",{"type":17,"tag":29,"props":118813,"children":118814},{},[118815],{"type":23,"value":24827},{"type":17,"tag":80,"props":118817,"children":118818},{},[118819,118829,118845,118862,118866],{"type":17,"tag":84,"props":118820,"children":118821},{},[118822,118823,118828],{"type":23,"value":107302},{"type":17,"tag":6121,"props":118824,"children":118826},{"className":118825},[],[118827],{"type":23,"value":24841},{"type":23,"value":12034},{"type":17,"tag":84,"props":118830,"children":118831},{},[118832,118833,118838,118839,118844],{"type":23,"value":24847},{"type":17,"tag":6121,"props":118834,"children":118836},{"className":118835},[],[118837],{"type":23,"value":24853},{"type":23,"value":11826},{"type":17,"tag":6121,"props":118840,"children":118842},{"className":118841},[],[118843],{"type":23,"value":24860},{"type":23,"value":12034},{"type":17,"tag":84,"props":118846,"children":118847},{},[118848,118850,118855,118856,118861],{"type":23,"value":118849},"message body (",{"type":17,"tag":6121,"props":118851,"children":118853},{"className":118852},[],[118854],{"type":23,"value":24872},{"type":23,"value":11826},{"type":17,"tag":6121,"props":118857,"children":118859},{"className":118858},[],[118860],{"type":23,"value":76790},{"type":23,"value":12034},{"type":17,"tag":84,"props":118863,"children":118864},{},[118865],{"type":23,"value":73184},{"type":17,"tag":84,"props":118867,"children":118868},{},[118869],{"type":23,"value":118870},"timestamps and thread identifiers",{"type":17,"tag":29,"props":118872,"children":118873},{},[118874],{"type":23,"value":118875},"These fields provide the conversation context used in activity feeds.",{"type":17,"tag":68,"props":118877,"children":118878},{"id":73265},[118879],{"type":23,"value":73268},{"type":17,"tag":29,"props":118881,"children":118882},{},[118883,118884,118888],{"type":23,"value":107430},{"type":17,"tag":48,"props":118885,"children":118886},{},[118887],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":118890,"children":118891},{},[118892],{"type":23,"value":116404},{"type":17,"tag":6154,"props":118894,"children":118895},{},[118896,118901,118906,118910],{"type":17,"tag":84,"props":118897,"children":118898},{},[118899],{"type":23,"value":118900},"Your application launches the Unified Connect component.",{"type":17,"tag":84,"props":118902,"children":118903},{},[118904],{"type":23,"value":118905},"The user selects integrations such as Salesforce, HubSpot, Gmail, or Slack.",{"type":17,"tag":84,"props":118907,"children":118908},{},[118909],{"type":23,"value":74599},{"type":17,"tag":84,"props":118911,"children":118912},{},[118913,118914,118918],{"type":23,"value":73306},{"type":17,"tag":48,"props":118915,"children":118916},{},[118917],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":118920,"children":118921},{},[118922],{"type":23,"value":73316},{"type":17,"tag":6893,"props":118924,"children":118926},{"className":118925,"code":25047,"language":20901,"meta":23},[20899],[118927],{"type":17,"tag":6121,"props":118928,"children":118929},{"__ignoreMap":7},[118930],{"type":23,"value":25047},{"type":17,"tag":29,"props":118932,"children":118933},{},[118934],{"type":23,"value":118935},"All subsequent Unified API calls reference this identifier to retrieve activity data.",{"type":17,"tag":68,"props":118937,"children":118939},{"id":118938},"retrieving-crm-activity-data",[118940],{"type":23,"value":118941},"Retrieving CRM Activity Data",{"type":17,"tag":29,"props":118943,"children":118944},{},[118945],{"type":23,"value":118946},"CRM activities are retrieved through the event endpoints.",{"type":17,"tag":29,"props":118948,"children":118949},{},[118950],{"type":17,"tag":48,"props":118951,"children":118952},{},[118953],{"type":23,"value":118954},"List CRM events",{"type":17,"tag":6893,"props":118956,"children":118958},{"className":118957,"code":27254,"language":20901,"meta":23},[20899],[118959],{"type":17,"tag":6121,"props":118960,"children":118961},{"__ignoreMap":7},[118962],{"type":23,"value":27254},{"type":17,"tag":29,"props":118964,"children":118965},{},[118966,118968,118972],{"type":23,"value":118967},"The endpoint supports filters and ",{"type":17,"tag":133,"props":118969,"children":118970},{"href":1857},[118971],{"type":23,"value":1860},{"type":23,"value":118973}," including:",{"type":17,"tag":80,"props":118975,"children":118976},{},[118977,118993,119002,119030,119040,119050],{"type":17,"tag":84,"props":118978,"children":118979},{},[118980,118985,118986,118991],{"type":17,"tag":6121,"props":118981,"children":118983},{"className":118982},[],[118984],{"type":23,"value":48389},{"type":23,"value":34435},{"type":17,"tag":6121,"props":118987,"children":118989},{"className":118988},[],[118990],{"type":23,"value":48411},{"type":23,"value":118992}," for pagination",{"type":17,"tag":84,"props":118994,"children":118995},{},[118996,119001],{"type":17,"tag":6121,"props":118997,"children":118999},{"className":118998},[],[119000],{"type":23,"value":26291},{"type":23,"value":26293},{"type":17,"tag":84,"props":119003,"children":119004},{},[119005,119010,119011,119016,119017,119022,119023,119028],{"type":17,"tag":6121,"props":119006,"children":119008},{"className":119007},[],[119009],{"type":23,"value":27285},{"type":23,"value":11826},{"type":17,"tag":6121,"props":119012,"children":119014},{"className":119013},[],[119015],{"type":23,"value":26302},{"type":23,"value":11826},{"type":17,"tag":6121,"props":119018,"children":119020},{"className":119019},[],[119021],{"type":23,"value":27299},{"type":23,"value":27293},{"type":17,"tag":6121,"props":119024,"children":119026},{"className":119025},[],[119027],{"type":23,"value":62582},{"type":23,"value":119029}," for relationship filtering",{"type":17,"tag":84,"props":119031,"children":119032},{},[119033,119038],{"type":17,"tag":6121,"props":119034,"children":119036},{"className":119035},[],[119037],{"type":23,"value":27310},{"type":23,"value":119039}," to filter by activity type",{"type":17,"tag":84,"props":119041,"children":119042},{},[119043,119048],{"type":17,"tag":6121,"props":119044,"children":119046},{"className":119045},[],[119047],{"type":23,"value":48368},{"type":23,"value":119049}," for text search",{"type":17,"tag":84,"props":119051,"children":119052},{},[119053,119058],{"type":17,"tag":6121,"props":119054,"children":119056},{"className":119055},[],[119057],{"type":23,"value":39759},{"type":23,"value":119059}," to limit returned properties",{"type":17,"tag":29,"props":119061,"children":119062},{},[119063],{"type":23,"value":119064},"These filters allow applications to retrieve activities related to specific deals, contacts, or companies.",{"type":17,"tag":29,"props":119066,"children":119067},{},[119068],{"type":17,"tag":48,"props":119069,"children":119070},{},[119071],{"type":23,"value":119072},"Retrieve a single event",{"type":17,"tag":6893,"props":119074,"children":119077},{"className":119075,"code":119076,"language":20901,"meta":23},[20899],"GET /crm/{connection_id}/event/{id}\n",[119078],{"type":17,"tag":6121,"props":119079,"children":119080},{"__ignoreMap":7},[119081],{"type":23,"value":119076},{"type":17,"tag":29,"props":119083,"children":119084},{},[119085],{"type":23,"value":119086},"This endpoint returns a single activity record including fields such as:",{"type":17,"tag":80,"props":119088,"children":119089},{},[119090,119095,119099,119104],{"type":17,"tag":84,"props":119091,"children":119092},{},[119093],{"type":23,"value":119094},"activity type",{"type":17,"tag":84,"props":119096,"children":119097},{},[119098],{"type":23,"value":19954},{"type":17,"tag":84,"props":119100,"children":119101},{},[119102],{"type":23,"value":119103},"associated contacts or deals",{"type":17,"tag":84,"props":119105,"children":119106},{},[119107],{"type":23,"value":119108},"activity details such as notes, calls, or meetings",{"type":17,"tag":68,"props":119110,"children":119112},{"id":119111},"retrieving-messaging-activity",[119113],{"type":23,"value":119114},"Retrieving Messaging Activity",{"type":17,"tag":29,"props":119116,"children":119117},{},[119118],{"type":23,"value":119119},"Messaging data is retrieved through the messaging endpoints.",{"type":17,"tag":29,"props":119121,"children":119122},{},[119123],{"type":17,"tag":48,"props":119124,"children":119125},{},[119126],{"type":23,"value":97438},{"type":17,"tag":6893,"props":119128,"children":119131},{"className":119129,"code":119130,"language":20901,"meta":23},[20899],"GET /messaging/{connection_id}/message\n",[119132],{"type":17,"tag":6121,"props":119133,"children":119134},{"__ignoreMap":7},[119135],{"type":23,"value":119130},{"type":17,"tag":29,"props":119137,"children":119138},{},[119139],{"type":17,"tag":48,"props":119140,"children":119141},{},[119142],{"type":23,"value":119143},"List channels",{"type":17,"tag":6893,"props":119145,"children":119148},{"className":119146,"code":119147,"language":20901,"meta":23},[20899],"GET /messaging/{connection_id}/channel\n",[119149],{"type":17,"tag":6121,"props":119150,"children":119151},{"__ignoreMap":7},[119152],{"type":23,"value":119147},{"type":17,"tag":29,"props":119154,"children":119155},{},[119156],{"type":23,"value":119157},"Threads can be retrieved by filtering messages using the parent identifier.",{"type":17,"tag":6893,"props":119159,"children":119161},{"className":119160,"code":33699,"language":20901,"meta":23},[20899],[119162],{"type":17,"tag":6121,"props":119163,"children":119164},{"__ignoreMap":7},[119165],{"type":23,"value":33699},{"type":17,"tag":29,"props":119167,"children":119168},{},[119169],{"type":23,"value":119170},"This allows applications to reconstruct full email threads or Slack conversations associated with deals or accounts.",{"type":17,"tag":68,"props":119172,"children":119174},{"id":119173},"building-an-activity-timeline",[119175],{"type":23,"value":119176},"Building an Activity Timeline",{"type":17,"tag":29,"props":119178,"children":119179},{},[119180],{"type":23,"value":119181},"A sales activity timeline typically combines data from multiple sources.",{"type":17,"tag":29,"props":119183,"children":119184},{},[119185],{"type":23,"value":119186},"Example timeline:",{"type":17,"tag":7231,"props":119188,"children":119189},{},[119190,119204],{"type":17,"tag":7235,"props":119191,"children":119192},{},[119193],{"type":17,"tag":7239,"props":119194,"children":119195},{},[119196,119200],{"type":17,"tag":7243,"props":119197,"children":119198},{},[119199],{"type":23,"value":33994},{"type":17,"tag":7243,"props":119201,"children":119202},{},[119203],{"type":23,"value":33999},{"type":17,"tag":7259,"props":119205,"children":119206},{},[119207,119219,119231,119243,119255],{"type":17,"tag":7239,"props":119208,"children":119209},{},[119210,119214],{"type":17,"tag":7266,"props":119211,"children":119212},{},[119213],{"type":23,"value":25731},{"type":17,"tag":7266,"props":119215,"children":119216},{},[119217],{"type":23,"value":119218},"Deal stage updated",{"type":17,"tag":7239,"props":119220,"children":119221},{},[119222,119226],{"type":17,"tag":7266,"props":119223,"children":119224},{},[119225],{"type":23,"value":25731},{"type":17,"tag":7266,"props":119227,"children":119228},{},[119229],{"type":23,"value":119230},"Demo meeting logged",{"type":17,"tag":7239,"props":119232,"children":119233},{},[119234,119238],{"type":17,"tag":7266,"props":119235,"children":119236},{},[119237],{"type":23,"value":14878},{"type":17,"tag":7266,"props":119239,"children":119240},{},[119241],{"type":23,"value":119242},"Sales rep sends follow-up email",{"type":17,"tag":7239,"props":119244,"children":119245},{},[119246,119250],{"type":17,"tag":7266,"props":119247,"children":119248},{},[119249],{"type":23,"value":3204},{"type":17,"tag":7266,"props":119251,"children":119252},{},[119253],{"type":23,"value":119254},"Internal deal discussion",{"type":17,"tag":7239,"props":119256,"children":119257},{},[119258,119262],{"type":17,"tag":7266,"props":119259,"children":119260},{},[119261],{"type":23,"value":25731},{"type":17,"tag":7266,"props":119263,"children":119264},{},[119265],{"type":23,"value":119266},"Call logged with customer",{"type":17,"tag":29,"props":119268,"children":119269},{},[119270],{"type":23,"value":119271},"Applications usually:",{"type":17,"tag":6154,"props":119273,"children":119274},{},[119275,119280,119285],{"type":17,"tag":84,"props":119276,"children":119277},{},[119278],{"type":23,"value":119279},"Retrieve CRM events for the account or deal.",{"type":17,"tag":84,"props":119281,"children":119282},{},[119283],{"type":23,"value":119284},"Retrieve email and messaging activity associated with contacts.",{"type":17,"tag":84,"props":119286,"children":119287},{},[119288],{"type":23,"value":119289},"Merge these records into a single chronological timeline.",{"type":17,"tag":29,"props":119291,"children":119292},{},[119293],{"type":23,"value":119294},"Because Unified normalizes activity objects across platforms, developers can combine these events without vendor-specific mapping logic.",{"type":17,"tag":68,"props":119296,"children":119298},{"id":119297},"keeping-activity-feeds-updated",[119299],{"type":23,"value":119300},"Keeping Activity Feeds Updated",{"type":17,"tag":29,"props":119302,"children":119303},{},[119304],{"type":23,"value":119305},"Unified provides webhook support to keep activity timelines synchronized.",{"type":17,"tag":29,"props":119307,"children":119308},{},[119309],{"type":23,"value":107787},{"type":17,"tag":29,"props":119311,"children":119312},{},[119313],{"type":17,"tag":48,"props":119314,"children":119315},{},[119316],{"type":23,"value":107795},{"type":17,"tag":80,"props":119318,"children":119319},{},[119320,119325,119329],{"type":17,"tag":84,"props":119321,"children":119322},{},[119323],{"type":23,"value":119324},"contact created or updated",{"type":17,"tag":84,"props":119326,"children":119327},{},[119328],{"type":23,"value":27536},{"type":17,"tag":84,"props":119330,"children":119331},{},[119332],{"type":23,"value":119333},"event created or updated",{"type":17,"tag":29,"props":119335,"children":119336},{},[119337],{"type":17,"tag":48,"props":119338,"children":119339},{},[119340],{"type":23,"value":107821},{"type":17,"tag":80,"props":119342,"children":119343},{},[119344,119348,119352,119357],{"type":17,"tag":84,"props":119345,"children":119346},{},[119347],{"type":23,"value":27554},{"type":17,"tag":84,"props":119349,"children":119350},{},[119351],{"type":23,"value":27559},{"type":17,"tag":84,"props":119353,"children":119354},{},[119355],{"type":23,"value":119356},"message deleted",{"type":17,"tag":84,"props":119358,"children":119359},{},[119360],{"type":23,"value":119361},"interaction events such as mentions or reactions",{"type":17,"tag":29,"props":119363,"children":119364},{},[119365],{"type":23,"value":119366},"Unified supports two webhook delivery methods.",{"type":17,"tag":29,"props":119368,"children":119369},{},[119370],{"type":17,"tag":48,"props":119371,"children":119372},{},[119373,119375],{"type":23,"value":119374},"Native ",{"type":17,"tag":133,"props":119376,"children":119377},{"href":4999},[119378],{"type":23,"value":5002},{"type":17,"tag":29,"props":119380,"children":119381},{},[119382],{"type":23,"value":112965},{"type":17,"tag":29,"props":119384,"children":119385},{},[119386],{"type":17,"tag":48,"props":119387,"children":119388},{},[119389],{"type":23,"value":9256},{"type":17,"tag":29,"props":119391,"children":119392},{},[119393],{"type":23,"value":119394},"Managed polling that simulates real-time updates when native webhooks are unavailable.",{"type":17,"tag":29,"props":119396,"children":119397},{},[119398],{"type":23,"value":119399},"These events allow activity feeds to update automatically whenever new interactions occur.",{"type":17,"tag":68,"props":119401,"children":119402},{"id":25342},[119403],{"type":23,"value":25345},{"type":17,"tag":29,"props":119405,"children":119406},{},[119407],{"type":23,"value":119408},"Unified provides broad integration coverage across CRM and messaging platforms.",{"type":17,"tag":29,"props":119410,"children":119411},{},[119412],{"type":17,"tag":48,"props":119413,"children":119414},{},[119415],{"type":23,"value":107885},{"type":17,"tag":29,"props":119417,"children":119418},{},[119419],{"type":23,"value":24364},{"type":17,"tag":80,"props":119421,"children":119422},{},[119423,119427,119431,119435,119439,119443,119447],{"type":17,"tag":84,"props":119424,"children":119425},{},[119426],{"type":23,"value":3179},{"type":17,"tag":84,"props":119428,"children":119429},{},[119430],{"type":23,"value":3184},{"type":17,"tag":84,"props":119432,"children":119433},{},[119434],{"type":23,"value":26530},{"type":17,"tag":84,"props":119436,"children":119437},{},[119438],{"type":23,"value":26535},{"type":17,"tag":84,"props":119440,"children":119441},{},[119442],{"type":23,"value":61598},{"type":17,"tag":84,"props":119444,"children":119445},{},[119446],{"type":23,"value":61628},{"type":17,"tag":84,"props":119448,"children":119449},{},[119450],{"type":23,"value":61620},{"type":17,"tag":29,"props":119452,"children":119453},{},[119454],{"type":17,"tag":48,"props":119455,"children":119456},{},[119457],{"type":23,"value":107928},{"type":17,"tag":29,"props":119459,"children":119460},{},[119461],{"type":23,"value":24364},{"type":17,"tag":80,"props":119463,"children":119464},{},[119465,119469,119473],{"type":17,"tag":84,"props":119466,"children":119467},{},[119468],{"type":23,"value":14878},{"type":17,"tag":84,"props":119470,"children":119471},{},[119472],{"type":23,"value":3204},{"type":17,"tag":84,"props":119474,"children":119475},{},[119476],{"type":23,"value":14066},{"type":17,"tag":29,"props":119478,"children":119479},{},[119480],{"type":23,"value":119481},"This allows activity tracking features to support many customer environments without building separate integrations.",{"type":17,"tag":68,"props":119483,"children":119484},{"id":73613},[119485],{"type":23,"value":73616},{"type":17,"tag":29,"props":119487,"children":119488},{},[119489],{"type":23,"value":119490},"Building sales activity tracking across CRM and messaging platforms normally requires multiple integrations.",{"type":17,"tag":29,"props":119492,"children":119493},{},[119494],{"type":23,"value":34257},{"type":17,"tag":80,"props":119496,"children":119497},{},[119498,119503,119508,119513],{"type":17,"tag":84,"props":119499,"children":119500},{},[119501],{"type":23,"value":119502},"normalized activity objects across CRM and messaging platforms",{"type":17,"tag":84,"props":119504,"children":119505},{},[119506],{"type":23,"value":119507},"consistent API endpoints for retrieving events and messages",{"type":17,"tag":84,"props":119509,"children":119510},{},[119511],{"type":23,"value":119512},"unified authentication flows through Unified Connect",{"type":17,"tag":84,"props":119514,"children":119515},{},[119516],{"type":23,"value":119517},"webhook support for real-time activity updates",{"type":17,"tag":29,"props":119519,"children":119520},{},[119521],{"type":23,"value":119522},"Instead of maintaining dozens of integrations, product teams can focus on building features like activity timelines, engagement analytics, and AI sales assistants.",{"type":17,"tag":29,"props":119524,"children":119525},{},[119526],{"type":23,"value":119527},"Start building sales activity tracking across Salesforce, HubSpot, Gmail, Slack, and many other platforms today.",{"type":17,"tag":29,"props":119529,"children":119530},{},[119531],{"type":17,"tag":133,"props":119532,"children":119534},{"href":1612,"rel":119533},[214],[119535],{"type":23,"value":44481},{"type":17,"tag":29,"props":119537,"children":119538},{},[119539],{"type":17,"tag":133,"props":119540,"children":119542},{"href":1623,"rel":119541},[214],[119543],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":119545},[119546,119547,119548,119549,119553,119554,119555,119556,119557,119558,119559],{"id":118250,"depth":1629,"text":118253},{"id":118346,"depth":1629,"text":118349},{"id":118421,"depth":1629,"text":118424},{"id":24613,"depth":1629,"text":24616,"children":119550},[119551,119552],{"id":118515,"depth":1635,"text":118518},{"id":24756,"depth":1635,"text":24759},{"id":73265,"depth":1629,"text":73268},{"id":118938,"depth":1629,"text":118941},{"id":119111,"depth":1629,"text":119114},{"id":119173,"depth":1629,"text":119176},{"id":119297,"depth":1629,"text":119300},{"id":25342,"depth":1629,"text":25345},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_sales_activity_tracking_across_salesforce_hubspot_gmail_and_slack.md","blog/how_to_build_sales_activity_tracking_across_salesforce_hubspot_gmail_and_slack.md","blog/how_to_build_sales_activity_tracking_across_salesforce_hubspot_gmail_and_slack",{"_path":119564,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":119565,"description":119566,"img":119567,"date":119568,"tag":12,"body":119569,"_type":1677,"_id":120711,"_source":1679,"_file":120712,"_stem":120713,"_extension":1682},"/blog/how_to_build_interview_scheduling_across_greenhouse_outlook_and_google_calendar_with_ats_and_calendar_apis","How to Build Interview Scheduling Across Greenhouse, Outlook, and Google Calendar with ATS and Calendar APIs","Recruiting platforms often need to coordinate interviews between candidates, recruiters, and hiring managers. Many SaaS products build scheduling features so...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_interview_scheduling_across_greenhouse_outlook_and_google_calendar_with_ats_and_calendar_apis-icon.png","2026-03-04T15:55:00.000Z",{"type":14,"children":119570,"toc":120692},[119571,119576,119579,119586,119591,119596,119601,119606,119612,119617,119621,119647,119652,119657,119691,119696,119702,119712,119767,119772,119776,119780,119784,119793,119797,119874,119879,119883,119892,119896,119984,119988,120004,120008,120018,120022,120157,120162,120168,120179,120183,120203,120208,120214,120224,120228,120253,120257,120265,120269,120273,120278,120283,120291,120296,120317,120321,120326,120331,120339,120344,120443,120447,120455,120460,120465,120469,120474,120485,120489,120516,120520,120535,120539,120544,120549,120553,120592,120597,120601,120628,120633,120637,120642,120646,120666,120671,120676,120684],{"type":17,"tag":18,"props":119572,"children":119574},{"id":119573},"how-to-build-interview-scheduling-across-greenhouse-outlook-and-google-calendar-with-ats-and-calendar-apis",[119575],{"type":23,"value":119565},{"type":17,"tag":25,"props":119577,"children":119578},{},[],{"type":17,"tag":29,"props":119580,"children":119581},{},[119582],{"type":17,"tag":33,"props":119583,"children":119584},{},[119585],{"type":23,"value":106378},{"type":17,"tag":29,"props":119587,"children":119588},{},[119589],{"type":23,"value":119590},"Recruiting platforms often need to coordinate interviews between candidates, recruiters, and hiring managers. Many SaaS products build scheduling features so their customers can automatically schedule interviews using their existing ATS and calendar systems.",{"type":17,"tag":29,"props":119592,"children":119593},{},[119594],{"type":23,"value":119595},"For example, a recruiting platform may allow hiring teams to schedule interviews for candidates in Greenhouse while automatically creating calendar events in Outlook or Google Calendar.",{"type":17,"tag":29,"props":119597,"children":119598},{},[119599],{"type":23,"value":119600},"The challenge is that interview data and calendar scheduling live in different systems. Applicant tracking systems store candidate and application data, while calendars manage meeting availability and scheduling. Each platform exposes different APIs and schemas.",{"type":17,"tag":29,"props":119602,"children":119603},{},[119604],{"type":23,"value":119605},"Unified simplifies this process by providing normalized APIs across ATS and calendar platforms. Developers can retrieve candidates, applications, and interview stages from an ATS and create interview events in calendar systems using a consistent API.",{"type":17,"tag":68,"props":119607,"children":119609},{"id":119608},"why-saas-products-build-interview-scheduling-features",[119610],{"type":23,"value":119611},"Why SaaS Products Build Interview Scheduling Features",{"type":17,"tag":29,"props":119613,"children":119614},{},[119615],{"type":23,"value":119616},"Many recruiting and hiring platforms provide interview scheduling capabilities for their customers.",{"type":17,"tag":29,"props":119618,"children":119619},{},[119620],{"type":23,"value":24364},{"type":17,"tag":80,"props":119622,"children":119623},{},[119624,119628,119633,119638,119643],{"type":17,"tag":84,"props":119625,"children":119626},{},[119627],{"type":23,"value":116960},{"type":17,"tag":84,"props":119629,"children":119630},{},[119631],{"type":23,"value":119632},"Interview coordination tools",{"type":17,"tag":84,"props":119634,"children":119635},{},[119636],{"type":23,"value":119637},"Candidate scheduling assistants",{"type":17,"tag":84,"props":119639,"children":119640},{},[119641],{"type":23,"value":119642},"Hiring analytics platforms",{"type":17,"tag":84,"props":119644,"children":119645},{},[119646],{"type":23,"value":55874},{"type":17,"tag":29,"props":119648,"children":119649},{},[119650],{"type":23,"value":119651},"These products allow customers to connect their ATS and calendars so interviews can be scheduled automatically.",{"type":17,"tag":29,"props":119653,"children":119654},{},[119655],{"type":23,"value":119656},"Typical scheduling workflows include:",{"type":17,"tag":80,"props":119658,"children":119659},{},[119660,119668,119675,119683],{"type":17,"tag":84,"props":119661,"children":119662},{},[119663],{"type":17,"tag":48,"props":119664,"children":119665},{},[119666],{"type":23,"value":119667},"Recruiter scheduling interviews with candidates",{"type":17,"tag":84,"props":119669,"children":119670},{},[119671],{"type":17,"tag":48,"props":119672,"children":119673},{},[119674],{"type":23,"value":117009},{"type":17,"tag":84,"props":119676,"children":119677},{},[119678],{"type":17,"tag":48,"props":119679,"children":119680},{},[119681],{"type":23,"value":119682},"Panel interviews with multiple interviewers",{"type":17,"tag":84,"props":119684,"children":119685},{},[119686],{"type":17,"tag":48,"props":119687,"children":119688},{},[119689],{"type":23,"value":119690},"Automated rescheduling and cancellations",{"type":17,"tag":29,"props":119692,"children":119693},{},[119694],{"type":23,"value":119695},"Connecting ATS and calendar data enables these workflows to operate automatically.",{"type":17,"tag":68,"props":119697,"children":119699},{"id":119698},"unified-categories-used-in-interview-scheduling",[119700],{"type":23,"value":119701},"Unified Categories Used in Interview Scheduling",{"type":17,"tag":29,"props":119703,"children":119704},{},[119705,119707,119711],{"type":23,"value":119706},"Interview scheduling combines two ",{"type":17,"tag":133,"props":119708,"children":119709},{"href":7691},[119710],{"type":23,"value":7806},{"type":23,"value":72369},{"type":17,"tag":7231,"props":119713,"children":119714},{},[119715,119733],{"type":17,"tag":7235,"props":119716,"children":119717},{},[119718],{"type":17,"tag":7239,"props":119719,"children":119720},{},[119721,119725,119729],{"type":17,"tag":7243,"props":119722,"children":119723},{},[119724],{"type":23,"value":7247},{"type":17,"tag":7243,"props":119726,"children":119727},{},[119728],{"type":23,"value":24525},{"type":17,"tag":7243,"props":119730,"children":119731},{},[119732],{"type":23,"value":24530},{"type":17,"tag":7259,"props":119734,"children":119735},{},[119736,119752],{"type":17,"tag":7239,"props":119737,"children":119738},{},[119739,119743,119748],{"type":17,"tag":7266,"props":119740,"children":119741},{},[119742],{"type":23,"value":11756},{"type":17,"tag":7266,"props":119744,"children":119745},{},[119746],{"type":23,"value":119747},"Candidate, application, and interview workflow data from platforms like Greenhouse or Lever",{"type":17,"tag":7266,"props":119749,"children":119750},{},[119751],{"type":23,"value":117099},{"type":17,"tag":7239,"props":119753,"children":119754},{},[119755,119759,119763],{"type":17,"tag":7266,"props":119756,"children":119757},{},[119758],{"type":23,"value":73899},{"type":17,"tag":7266,"props":119760,"children":119761},{},[119762],{"type":23,"value":117111},{"type":17,"tag":7266,"props":119764,"children":119765},{},[119766],{"type":23,"value":73973},{"type":17,"tag":29,"props":119768,"children":119769},{},[119770],{"type":23,"value":119771},"By normalizing these objects across providers, Unified allows SaaS platforms to coordinate interview workflows without building separate integrations.",{"type":17,"tag":68,"props":119773,"children":119774},{"id":117123},[119775],{"type":23,"value":117126},{"type":17,"tag":29,"props":119777,"children":119778},{},[119779],{"type":23,"value":117131},{"type":17,"tag":239,"props":119781,"children":119782},{"id":117134},[119783],{"type":23,"value":117137},{"type":17,"tag":29,"props":119785,"children":119786},{},[119787,119788,119792],{"type":23,"value":6712},{"type":17,"tag":48,"props":119789,"children":119790},{},[119791],{"type":23,"value":117134},{"type":23,"value":117147},{"type":17,"tag":29,"props":119794,"children":119795},{},[119796],{"type":23,"value":24637},{"type":17,"tag":7231,"props":119798,"children":119799},{},[119800,119814],{"type":17,"tag":7235,"props":119801,"children":119802},{},[119803],{"type":17,"tag":7239,"props":119804,"children":119805},{},[119806,119810],{"type":17,"tag":7243,"props":119807,"children":119808},{},[119809],{"type":23,"value":24651},{"type":17,"tag":7243,"props":119811,"children":119812},{},[119813],{"type":23,"value":20787},{"type":17,"tag":7259,"props":119815,"children":119816},{},[119817,119828,119839,119851,119863],{"type":17,"tag":7239,"props":119818,"children":119819},{},[119820,119824],{"type":17,"tag":7266,"props":119821,"children":119822},{},[119823],{"type":23,"value":18766},{"type":17,"tag":7266,"props":119825,"children":119826},{},[119827],{"type":23,"value":117183},{"type":17,"tag":7239,"props":119829,"children":119830},{},[119831,119835],{"type":17,"tag":7266,"props":119832,"children":119833},{},[119834],{"type":23,"value":117191},{"type":17,"tag":7266,"props":119836,"children":119837},{},[119838],{"type":23,"value":117196},{"type":17,"tag":7239,"props":119840,"children":119841},{},[119842,119846],{"type":17,"tag":7266,"props":119843,"children":119844},{},[119845],{"type":23,"value":50735},{"type":17,"tag":7266,"props":119847,"children":119848},{},[119849],{"type":23,"value":119850},"Used for calendar invitations",{"type":17,"tag":7239,"props":119852,"children":119853},{},[119854,119858],{"type":17,"tag":7266,"props":119855,"children":119856},{},[119857],{"type":23,"value":62355},{"type":17,"tag":7266,"props":119859,"children":119860},{},[119861],{"type":23,"value":119862},"Contact information",{"type":17,"tag":7239,"props":119864,"children":119865},{},[119866,119870],{"type":17,"tag":7266,"props":119867,"children":119868},{},[119869],{"type":23,"value":24743},{"type":17,"tag":7266,"props":119871,"children":119872},{},[119873],{"type":23,"value":117232},{"type":17,"tag":29,"props":119875,"children":119876},{},[119877],{"type":23,"value":119878},"These fields allow scheduling systems to identify the candidate and send interview invitations.",{"type":17,"tag":239,"props":119880,"children":119881},{"id":97116},[119882],{"type":23,"value":117242},{"type":17,"tag":29,"props":119884,"children":119885},{},[119886,119887,119891],{"type":23,"value":6712},{"type":17,"tag":48,"props":119888,"children":119889},{},[119890],{"type":23,"value":97116},{"type":23,"value":117252},{"type":17,"tag":29,"props":119893,"children":119894},{},[119895],{"type":23,"value":24637},{"type":17,"tag":7231,"props":119897,"children":119898},{},[119899,119913],{"type":17,"tag":7235,"props":119900,"children":119901},{},[119902],{"type":17,"tag":7239,"props":119903,"children":119904},{},[119905,119909],{"type":17,"tag":7243,"props":119906,"children":119907},{},[119908],{"type":23,"value":24651},{"type":17,"tag":7243,"props":119910,"children":119911},{},[119912],{"type":23,"value":20787},{"type":17,"tag":7259,"props":119914,"children":119915},{},[119916,119927,119938,119949,119960,119972],{"type":17,"tag":7239,"props":119917,"children":119918},{},[119919,119923],{"type":17,"tag":7266,"props":119920,"children":119921},{},[119922],{"type":23,"value":18766},{"type":17,"tag":7266,"props":119924,"children":119925},{},[119926],{"type":23,"value":117288},{"type":17,"tag":7239,"props":119928,"children":119929},{},[119930,119934],{"type":17,"tag":7266,"props":119931,"children":119932},{},[119933],{"type":23,"value":117296},{"type":17,"tag":7266,"props":119935,"children":119936},{},[119937],{"type":23,"value":117301},{"type":17,"tag":7239,"props":119939,"children":119940},{},[119941,119945],{"type":17,"tag":7266,"props":119942,"children":119943},{},[119944],{"type":23,"value":117309},{"type":17,"tag":7266,"props":119946,"children":119947},{},[119948],{"type":23,"value":117314},{"type":17,"tag":7239,"props":119950,"children":119951},{},[119952,119956],{"type":17,"tag":7266,"props":119953,"children":119954},{},[119955],{"type":23,"value":19949},{"type":17,"tag":7266,"props":119957,"children":119958},{},[119959],{"type":23,"value":117326},{"type":17,"tag":7239,"props":119961,"children":119962},{},[119963,119967],{"type":17,"tag":7266,"props":119964,"children":119965},{},[119966],{"type":23,"value":117334},{"type":17,"tag":7266,"props":119968,"children":119969},{},[119970],{"type":23,"value":119971},"Raw stage label from the ATS",{"type":17,"tag":7239,"props":119973,"children":119974},{},[119975,119979],{"type":17,"tag":7266,"props":119976,"children":119977},{},[119978],{"type":23,"value":117347},{"type":17,"tag":7266,"props":119980,"children":119981},{},[119982],{"type":23,"value":119983},"Date the candidate applied",{"type":17,"tag":29,"props":119985,"children":119986},{},[119987],{"type":23,"value":117357},{"type":17,"tag":29,"props":119989,"children":119990},{},[119991,119993,119998,119999,120003],{"type":23,"value":119992},"For example, interviews may be scheduled when a candidate reaches a stage such as ",{"type":17,"tag":48,"props":119994,"children":119995},{},[119996],{"type":23,"value":119997},"INTERVIEW_SCHEDULED",{"type":23,"value":75890},{"type":17,"tag":48,"props":120000,"children":120001},{},[120002],{"type":23,"value":117379},{"type":23,"value":54},{"type":17,"tag":239,"props":120005,"children":120006},{"id":117383},[120007],{"type":23,"value":117386},{"type":17,"tag":29,"props":120009,"children":120010},{},[120011,120012,120016],{"type":23,"value":6712},{"type":17,"tag":48,"props":120013,"children":120014},{},[120015],{"type":23,"value":117383},{"type":23,"value":120017}," object contains scheduling information.",{"type":17,"tag":29,"props":120019,"children":120020},{},[120021],{"type":23,"value":24637},{"type":17,"tag":7231,"props":120023,"children":120024},{},[120025,120039],{"type":17,"tag":7235,"props":120026,"children":120027},{},[120028],{"type":17,"tag":7239,"props":120029,"children":120030},{},[120031,120035],{"type":17,"tag":7243,"props":120032,"children":120033},{},[120034],{"type":23,"value":24651},{"type":17,"tag":7243,"props":120036,"children":120037},{},[120038],{"type":23,"value":20787},{"type":17,"tag":7259,"props":120040,"children":120041},{},[120042,120053,120064,120075,120087,120099,120110,120122,120134,120146],{"type":17,"tag":7239,"props":120043,"children":120044},{},[120045,120049],{"type":17,"tag":7266,"props":120046,"children":120047},{},[120048],{"type":23,"value":18766},{"type":17,"tag":7266,"props":120050,"children":120051},{},[120052],{"type":23,"value":117432},{"type":17,"tag":7239,"props":120054,"children":120055},{},[120056,120060],{"type":17,"tag":7266,"props":120057,"children":120058},{},[120059],{"type":23,"value":117296},{"type":17,"tag":7266,"props":120061,"children":120062},{},[120063],{"type":23,"value":117444},{"type":17,"tag":7239,"props":120065,"children":120066},{},[120067,120071],{"type":17,"tag":7266,"props":120068,"children":120069},{},[120070],{"type":23,"value":117309},{"type":17,"tag":7266,"props":120072,"children":120073},{},[120074],{"type":23,"value":117469},{"type":17,"tag":7239,"props":120076,"children":120077},{},[120078,120082],{"type":17,"tag":7266,"props":120079,"children":120080},{},[120081],{"type":23,"value":117452},{"type":17,"tag":7266,"props":120083,"children":120084},{},[120085],{"type":23,"value":120086},"Application context",{"type":17,"tag":7239,"props":120088,"children":120089},{},[120090,120094],{"type":17,"tag":7266,"props":120091,"children":120092},{},[120093],{"type":23,"value":111357},{"type":17,"tag":7266,"props":120095,"children":120096},{},[120097],{"type":23,"value":120098},"Interviewers participating in the meeting",{"type":17,"tag":7239,"props":120100,"children":120101},{},[120102,120106],{"type":17,"tag":7266,"props":120103,"children":120104},{},[120105],{"type":23,"value":19949},{"type":17,"tag":7266,"props":120107,"children":120108},{},[120109],{"type":23,"value":117493},{"type":17,"tag":7239,"props":120111,"children":120112},{},[120113,120117],{"type":17,"tag":7266,"props":120114,"children":120115},{},[120116],{"type":23,"value":74267},{"type":17,"tag":7266,"props":120118,"children":120119},{},[120120],{"type":23,"value":120121},"Interview time window",{"type":17,"tag":7239,"props":120123,"children":120124},{},[120125,120129],{"type":17,"tag":7266,"props":120126,"children":120127},{},[120128],{"type":23,"value":74134},{"type":17,"tag":7266,"props":120130,"children":120131},{},[120132],{"type":23,"value":120133},"Meeting location or remote link",{"type":17,"tag":7239,"props":120135,"children":120136},{},[120137,120141],{"type":17,"tag":7266,"props":120138,"children":120139},{},[120140],{"type":23,"value":117537},{"type":17,"tag":7266,"props":120142,"children":120143},{},[120144],{"type":23,"value":120145},"Reference to the calendar event",{"type":17,"tag":7239,"props":120147,"children":120148},{},[120149,120153],{"type":17,"tag":7266,"props":120150,"children":120151},{},[120152],{"type":23,"value":24743},{"type":17,"tag":7266,"props":120154,"children":120155},{},[120156],{"type":23,"value":117554},{"type":17,"tag":29,"props":120158,"children":120159},{},[120160],{"type":23,"value":120161},"These fields define when the interview occurs and who participates.",{"type":17,"tag":239,"props":120163,"children":120165},{"id":120164},"job-context",[120166],{"type":23,"value":120167},"Job (Context)",{"type":17,"tag":29,"props":120169,"children":120170},{},[120171,120172,120177],{"type":23,"value":6712},{"type":17,"tag":48,"props":120173,"children":120174},{},[120175],{"type":23,"value":120176},"job",{"type":23,"value":120178}," object provides context for the interview.",{"type":17,"tag":29,"props":120180,"children":120181},{},[120182],{"type":23,"value":24637},{"type":17,"tag":80,"props":120184,"children":120185},{},[120186,120190,120194,120198],{"type":17,"tag":84,"props":120187,"children":120188},{},[120189],{"type":23,"value":49556},{"type":17,"tag":84,"props":120191,"children":120192},{},[120193],{"type":23,"value":62375},{"type":17,"tag":84,"props":120195,"children":120196},{},[120197],{"type":23,"value":74134},{"type":17,"tag":84,"props":120199,"children":120200},{},[120201],{"type":23,"value":120202},"hiring manager",{"type":17,"tag":29,"props":120204,"children":120205},{},[120206],{"type":23,"value":120207},"These details can be included in calendar invitations and candidate communications.",{"type":17,"tag":68,"props":120209,"children":120211},{"id":120210},"connecting-customer-ats-and-calendar-systems",[120212],{"type":23,"value":120213},"Connecting Customer ATS and Calendar Systems",{"type":17,"tag":29,"props":120215,"children":120216},{},[120217,120219,120223],{"type":23,"value":120218},"Customers authorize their ATS and calendar integrations using ",{"type":17,"tag":48,"props":120220,"children":120221},{},[120222],{"type":23,"value":73278},{"type":23,"value":54},{"type":17,"tag":29,"props":120225,"children":120226},{},[120227],{"type":23,"value":26189},{"type":17,"tag":6154,"props":120229,"children":120230},{},[120231,120235,120239,120244],{"type":17,"tag":84,"props":120232,"children":120233},{},[120234],{"type":23,"value":73291},{"type":17,"tag":84,"props":120236,"children":120237},{},[120238],{"type":23,"value":117591},{"type":17,"tag":84,"props":120240,"children":120241},{},[120242],{"type":23,"value":120243},"The user authorizes access to their systems.",{"type":17,"tag":84,"props":120245,"children":120246},{},[120247,120248,120252],{"type":23,"value":117600},{"type":17,"tag":48,"props":120249,"children":120250},{},[120251],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":120254,"children":120255},{},[120256],{"type":23,"value":73316},{"type":17,"tag":6893,"props":120258,"children":120260},{"className":120259,"code":25047,"language":20901,"meta":23},[20899],[120261],{"type":17,"tag":6121,"props":120262,"children":120263},{"__ignoreMap":7},[120264],{"type":23,"value":25047},{"type":17,"tag":29,"props":120266,"children":120267},{},[120268],{"type":23,"value":117622},{"type":17,"tag":68,"props":120270,"children":120271},{"id":117625},[120272],{"type":23,"value":117628},{"type":17,"tag":29,"props":120274,"children":120275},{},[120276],{"type":23,"value":120277},"Interview scheduling begins by retrieving candidate and application information from the ATS.",{"type":17,"tag":29,"props":120279,"children":120280},{},[120281],{"type":23,"value":120282},"Example ATS endpoints:",{"type":17,"tag":6893,"props":120284,"children":120286},{"className":120285,"code":117642,"language":20901,"meta":23},[20899],[120287],{"type":17,"tag":6121,"props":120288,"children":120289},{"__ignoreMap":7},[120290],{"type":23,"value":117642},{"type":17,"tag":29,"props":120292,"children":120293},{},[120294],{"type":23,"value":120295},"This allows scheduling tools to:",{"type":17,"tag":80,"props":120297,"children":120298},{},[120299,120303,120307,120312],{"type":17,"tag":84,"props":120300,"children":120301},{},[120302],{"type":23,"value":117660},{"type":17,"tag":84,"props":120304,"children":120305},{},[120306],{"type":23,"value":117665},{"type":17,"tag":84,"props":120308,"children":120309},{},[120310],{"type":23,"value":120311},"determine the current application stage",{"type":17,"tag":84,"props":120313,"children":120314},{},[120315],{"type":23,"value":120316},"list existing interview schedules",{"type":17,"tag":68,"props":120318,"children":120319},{"id":117683},[120320],{"type":23,"value":117686},{"type":17,"tag":29,"props":120322,"children":120323},{},[120324],{"type":23,"value":120325},"Once candidate and interview details are known, the scheduling system creates a calendar event.",{"type":17,"tag":29,"props":120327,"children":120328},{},[120329],{"type":23,"value":120330},"Unified supports creating events using:",{"type":17,"tag":6893,"props":120332,"children":120334},{"className":120333,"code":113946,"language":20901,"meta":23},[20899],[120335],{"type":17,"tag":6121,"props":120336,"children":120337},{"__ignoreMap":7},[120338],{"type":23,"value":113946},{"type":17,"tag":29,"props":120340,"children":120341},{},[120342],{"type":23,"value":120343},"Important fields used when scheduling interviews include:",{"type":17,"tag":7231,"props":120345,"children":120346},{},[120347,120361],{"type":17,"tag":7235,"props":120348,"children":120349},{},[120350],{"type":17,"tag":7239,"props":120351,"children":120352},{},[120353,120357],{"type":17,"tag":7243,"props":120354,"children":120355},{},[120356],{"type":23,"value":24651},{"type":17,"tag":7243,"props":120358,"children":120359},{},[120360],{"type":23,"value":20787},{"type":17,"tag":7259,"props":120362,"children":120363},{},[120364,120375,120386,120397,120408,120419,120431],{"type":17,"tag":7239,"props":120365,"children":120366},{},[120367,120371],{"type":17,"tag":7266,"props":120368,"children":120369},{},[120370],{"type":23,"value":62346},{"type":17,"tag":7266,"props":120372,"children":120373},{},[120374],{"type":23,"value":117741},{"type":17,"tag":7239,"props":120376,"children":120377},{},[120378,120382],{"type":17,"tag":7266,"props":120379,"children":120380},{},[120381],{"type":23,"value":21051},{"type":17,"tag":7266,"props":120383,"children":120384},{},[120385],{"type":23,"value":117505},{"type":17,"tag":7239,"props":120387,"children":120388},{},[120389,120393],{"type":17,"tag":7266,"props":120390,"children":120391},{},[120392],{"type":23,"value":21060},{"type":17,"tag":7266,"props":120394,"children":120395},{},[120396],{"type":23,"value":117517},{"type":17,"tag":7239,"props":120398,"children":120399},{},[120400,120404],{"type":17,"tag":7266,"props":120401,"children":120402},{},[120403],{"type":23,"value":74080},{"type":17,"tag":7266,"props":120405,"children":120406},{},[120407],{"type":23,"value":117775},{"type":17,"tag":7239,"props":120409,"children":120410},{},[120411,120415],{"type":17,"tag":7266,"props":120412,"children":120413},{},[120414],{"type":23,"value":74098},{"type":17,"tag":7266,"props":120416,"children":120417},{},[120418],{"type":23,"value":114035},{"type":17,"tag":7239,"props":120420,"children":120421},{},[120422,120426],{"type":17,"tag":7266,"props":120423,"children":120424},{},[120425],{"type":23,"value":74134},{"type":17,"tag":7266,"props":120427,"children":120428},{},[120429],{"type":23,"value":120430},"Physical location if in-person",{"type":17,"tag":7239,"props":120432,"children":120433},{},[120434,120438],{"type":17,"tag":7266,"props":120435,"children":120436},{},[120437],{"type":23,"value":24679},{"type":17,"tag":7266,"props":120439,"children":120440},{},[120441],{"type":23,"value":120442},"Interview agenda or instructions",{"type":17,"tag":29,"props":120444,"children":120445},{},[120446],{"type":23,"value":114064},{"type":17,"tag":6893,"props":120448,"children":120450},{"className":120449,"code":117819,"language":20901,"meta":23},[20899],[120451],{"type":17,"tag":6121,"props":120452,"children":120453},{"__ignoreMap":7},[120454],{"type":23,"value":117819},{"type":17,"tag":29,"props":120456,"children":120457},{},[120458],{"type":23,"value":120459},"The attendees field ensures both interviewers and candidates receive calendar invitations.",{"type":17,"tag":29,"props":120461,"children":120462},{},[120463],{"type":23,"value":120464},"The conference field can include links for Zoom, Google Meet, or Teams meetings.",{"type":17,"tag":68,"props":120466,"children":120467},{"id":114160},[120468],{"type":23,"value":114163},{"type":17,"tag":29,"props":120470,"children":120471},{},[120472],{"type":23,"value":120473},"Scheduling systems must handle calendar changes automatically.",{"type":17,"tag":29,"props":120475,"children":120476},{},[120477,120479,120483],{"type":23,"value":120478},"Unified calendar ",{"type":17,"tag":133,"props":120480,"children":120481},{"href":4999},[120482],{"type":23,"value":5002},{"type":23,"value":120484}," notify applications when meetings change.",{"type":17,"tag":29,"props":120486,"children":120487},{},[120488],{"type":23,"value":74835},{"type":17,"tag":80,"props":120490,"children":120491},{},[120492,120500,120508],{"type":17,"tag":84,"props":120493,"children":120494},{},[120495],{"type":17,"tag":6121,"props":120496,"children":120498},{"className":120497},[],[120499],{"type":23,"value":74863},{"type":17,"tag":84,"props":120501,"children":120502},{},[120503],{"type":17,"tag":6121,"props":120504,"children":120506},{"className":120505},[],[120507],{"type":23,"value":74876},{"type":17,"tag":84,"props":120509,"children":120510},{},[120511],{"type":17,"tag":6121,"props":120512,"children":120514},{"className":120513},[],[120515],{"type":23,"value":74889},{"type":17,"tag":29,"props":120517,"children":120518},{},[120519],{"type":23,"value":118004},{"type":17,"tag":80,"props":120521,"children":120522},{},[120523,120527,120531],{"type":17,"tag":84,"props":120524,"children":120525},{},[120526],{"type":23,"value":118012},{"type":17,"tag":84,"props":120528,"children":120529},{},[120530],{"type":23,"value":114242},{"type":17,"tag":84,"props":120532,"children":120533},{},[120534],{"type":23,"value":118021},{"type":17,"tag":68,"props":120536,"children":120537},{"id":25342},[120538],{"type":23,"value":25345},{"type":17,"tag":29,"props":120540,"children":120541},{},[120542],{"type":23,"value":120543},"Unified provides extensive coverage across hiring and scheduling platforms.",{"type":17,"tag":239,"props":120545,"children":120546},{"id":118033},[120547],{"type":23,"value":120548},"ATS platforms (73 integrations)",{"type":17,"tag":29,"props":120550,"children":120551},{},[120552],{"type":23,"value":24364},{"type":17,"tag":80,"props":120554,"children":120555},{},[120556,120560,120564,120568,120572,120576,120580,120584,120588],{"type":17,"tag":84,"props":120557,"children":120558},{},[120559],{"type":23,"value":3189},{"type":17,"tag":84,"props":120561,"children":120562},{},[120563],{"type":23,"value":56545},{"type":17,"tag":84,"props":120565,"children":120566},{},[120567],{"type":23,"value":75326},{"type":17,"tag":84,"props":120569,"children":120570},{},[120571],{"type":23,"value":75321},{"type":17,"tag":84,"props":120573,"children":120574},{},[120575],{"type":23,"value":75316},{"type":17,"tag":84,"props":120577,"children":120578},{},[120579],{"type":23,"value":59319},{"type":17,"tag":84,"props":120581,"children":120582},{},[120583],{"type":23,"value":75331},{"type":17,"tag":84,"props":120585,"children":120586},{},[120587],{"type":23,"value":3194},{"type":17,"tag":84,"props":120589,"children":120590},{},[120591],{"type":23,"value":56564},{"type":17,"tag":239,"props":120593,"children":120594},{"id":118082},[120595],{"type":23,"value":120596},"Calendar platforms (27 integrations)",{"type":17,"tag":29,"props":120598,"children":120599},{},[120600],{"type":23,"value":24364},{"type":17,"tag":80,"props":120602,"children":120603},{},[120604,120608,120612,120616,120620,120624],{"type":17,"tag":84,"props":120605,"children":120606},{},[120607],{"type":23,"value":13669},{"type":17,"tag":84,"props":120609,"children":120610},{},[120611],{"type":23,"value":14455},{"type":17,"tag":84,"props":120613,"children":120614},{},[120615],{"type":23,"value":118105},{"type":17,"tag":84,"props":120617,"children":120618},{},[120619],{"type":23,"value":13678},{"type":17,"tag":84,"props":120621,"children":120622},{},[120623],{"type":23,"value":14108},{"type":17,"tag":84,"props":120625,"children":120626},{},[120627],{"type":23,"value":14129},{"type":17,"tag":29,"props":120629,"children":120630},{},[120631],{"type":23,"value":120632},"This allows scheduling tools to support a wide range of customer environments.",{"type":17,"tag":68,"props":120634,"children":120635},{"id":73613},[120636],{"type":23,"value":73616},{"type":17,"tag":29,"props":120638,"children":120639},{},[120640],{"type":23,"value":120641},"Building interview scheduling features normally requires integrating with multiple ATS platforms and calendar systems.",{"type":17,"tag":29,"props":120643,"children":120644},{},[120645],{"type":23,"value":34257},{"type":17,"tag":80,"props":120647,"children":120648},{},[120649,120653,120657,120662],{"type":17,"tag":84,"props":120650,"children":120651},{},[120652],{"type":23,"value":118143},{"type":17,"tag":84,"props":120654,"children":120655},{},[120656],{"type":23,"value":118148},{"type":17,"tag":84,"props":120658,"children":120659},{},[120660],{"type":23,"value":120661},"consistent authentication via Unified Connect",{"type":17,"tag":84,"props":120663,"children":120664},{},[120665],{"type":23,"value":116846},{"type":17,"tag":29,"props":120667,"children":120668},{},[120669],{"type":23,"value":120670},"Instead of maintaining dozens of integrations, product teams can focus on building better recruiting workflows for their customers.",{"type":17,"tag":29,"props":120672,"children":120673},{},[120674],{"type":23,"value":120675},"Start building interview scheduling across Greenhouse, Outlook, Google Calendar, and dozens of other platforms today.",{"type":17,"tag":29,"props":120677,"children":120678},{},[120679],{"type":17,"tag":133,"props":120680,"children":120682},{"href":1612,"rel":120681},[214],[120683],{"type":23,"value":44481},{"type":17,"tag":29,"props":120685,"children":120686},{},[120687],{"type":17,"tag":133,"props":120688,"children":120690},{"href":1623,"rel":120689},[214],[120691],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":120693},[120694,120695,120696,120702,120703,120704,120705,120706,120710],{"id":119608,"depth":1629,"text":119611},{"id":119698,"depth":1629,"text":119701},{"id":117123,"depth":1629,"text":117126,"children":120697},[120698,120699,120700,120701],{"id":117134,"depth":1635,"text":117137},{"id":97116,"depth":1635,"text":117242},{"id":117383,"depth":1635,"text":117386},{"id":120164,"depth":1635,"text":120167},{"id":120210,"depth":1629,"text":120213},{"id":117625,"depth":1629,"text":117628},{"id":117683,"depth":1629,"text":117686},{"id":114160,"depth":1629,"text":114163},{"id":25342,"depth":1629,"text":25345,"children":120707},[120708,120709],{"id":118033,"depth":1635,"text":120548},{"id":118082,"depth":1635,"text":120596},{"id":73613,"depth":1629,"text":73616},"content:blog:how_to_build_interview_scheduling_across_greenhouse_outlook_and_google_calendar_with_ats_and_calendar_apis.md","blog/how_to_build_interview_scheduling_across_greenhouse_outlook_and_google_calendar_with_ats_and_calendar_apis.md","blog/how_to_build_interview_scheduling_across_greenhouse_outlook_and_google_calendar_with_ats_and_calendar_apis",{"_path":120715,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":120716,"description":120717,"img":120718,"date":120719,"tag":12,"body":120720,"_type":1677,"_id":121699,"_source":1679,"_file":121700,"_stem":121701,"_extension":1682},"/blog/february_2026_product_update","February 2026 product update","In February, we launched the Unified Assessment API, expanded our LMS API with Content and Activity, added Google Campaign Manager 360 and The Trade Desk to...","https://s3.us-east-2.amazonaws.com/unified-article-images/february_2026_product_update-icon.png","2026-03-03T14:07:00.000Z",{"type":14,"children":120721,"toc":121667},[120722,120727,120730,120738,120790,120806,120812,120817,120822,120828,120861,120867,120900,120906,120911,120929,120934,120939,120962,120968,120973,120984,120990,120995,121028,121032,121037,121042,121047,121090,121096,121101,121122,121127,121133,121138,121202,121207,121212,121235,121241,121252,121257,121263,121283,121289,121307,121311,121317,121379,121385,121398,121404,121422,121428,121436,121442,121447,121453,121460,121478,121485,121508,121515,121532,121539,121557,121565,121578,121585,121603,121609,121614,121637,121641,121646,121651,121659],{"type":17,"tag":18,"props":120723,"children":120725},{"id":120724},"february-2026-product-update",[120726],{"type":23,"value":120716},{"type":17,"tag":25,"props":120728,"children":120729},{},[],{"type":17,"tag":29,"props":120731,"children":120732},{},[120733],{"type":17,"tag":33,"props":120734,"children":120735},{},[120736],{"type":23,"value":120737},"March 3, 2026",{"type":17,"tag":29,"props":120739,"children":120740},{},[120741,120743,120751,120753,120760,120762,120766,120767,120771,120773,120777,120778,120782,120784,120788],{"type":23,"value":120742},"In February, we launched the ",{"type":17,"tag":133,"props":120744,"children":120746},{"href":53006,"rel":120745},[214],[120747],{"type":17,"tag":48,"props":120748,"children":120749},{},[120750],{"type":23,"value":52991},{"type":23,"value":120752},", expanded our ",{"type":17,"tag":48,"props":120754,"children":120755},{},[120756],{"type":17,"tag":133,"props":120757,"children":120758},{"href":54426},[120759],{"type":23,"value":54429},{"type":23,"value":120761}," with ",{"type":17,"tag":48,"props":120763,"children":120764},{},[120765],{"type":23,"value":55314},{"type":23,"value":34435},{"type":17,"tag":48,"props":120768,"children":120769},{},[120770],{"type":23,"value":33999},{"type":23,"value":120772},", added ",{"type":17,"tag":48,"props":120774,"children":120775},{},[120776],{"type":23,"value":41676},{"type":23,"value":34435},{"type":17,"tag":48,"props":120779,"children":120780},{},[120781],{"type":23,"value":11387},{"type":23,"value":120783}," to Advertising, and introduced a dedicated ",{"type":17,"tag":48,"props":120785,"children":120786},{},[120787],{"type":23,"value":14580},{"type":23,"value":120789}," object in Calendar.",{"type":17,"tag":29,"props":120791,"children":120792},{},[120793,120795,120799,120800,120804],{"type":23,"value":120794},"We also shipped a large set of depth improvements across methods, ",{"type":17,"tag":133,"props":120796,"children":120797},{"href":4999},[120798],{"type":23,"value":5002},{"type":23,"value":11107},{"type":17,"tag":133,"props":120801,"children":120802},{"href":1857},[120803],{"type":23,"value":1860},{"type":23,"value":120805}," parameters across CRM, ATS, messaging, finance, and support systems.",{"type":17,"tag":68,"props":120807,"children":120809},{"id":120808},"new-unified-assessment-api",[120810],{"type":23,"value":120811},"New: Unified Assessment API",{"type":17,"tag":29,"props":120813,"children":120814},{},[120815],{"type":23,"value":120816},"The Unified Assessment API is built for assessment providers that want their packages listed directly inside ATS platforms that support embedded assessment integrations.",{"type":17,"tag":29,"props":120818,"children":120819},{},[120820],{"type":23,"value":120821},"This differs from status-triggered assessment triggers. In this model, a recruiter orders an assessment from inside the ATS, and results are written back into the ATS.",{"type":17,"tag":239,"props":120823,"children":120825},{"id":120824},"supported-ats-platforms-embedded-assessment",[120826],{"type":23,"value":120827},"Supported ATS platforms (embedded assessment)",{"type":17,"tag":80,"props":120829,"children":120830},{},[120831,120841,120851],{"type":17,"tag":84,"props":120832,"children":120833},{},[120834],{"type":17,"tag":133,"props":120835,"children":120838},{"href":120836,"rel":120837},"https://unified.to/integrations/greenhouseassessment",[214],[120839],{"type":23,"value":120840},"Greenhouse Assessment",{"type":17,"tag":84,"props":120842,"children":120843},{},[120844],{"type":17,"tag":133,"props":120845,"children":120848},{"href":120846,"rel":120847},"https://unified.to/integrations/ashbyassessment",[214],[120849],{"type":23,"value":120850},"Ashby Assessment",{"type":17,"tag":84,"props":120852,"children":120853},{},[120854],{"type":17,"tag":133,"props":120855,"children":120858},{"href":120856,"rel":120857},"https://unified.to/integrations/workableassessment",[214],[120859],{"type":23,"value":120860},"Workable Assessment",{"type":17,"tag":239,"props":120862,"children":120864},{"id":120863},"new-assessment-integrations",[120865],{"type":23,"value":120866},"New Assessment integrations",{"type":17,"tag":80,"props":120868,"children":120869},{},[120870,120880,120890],{"type":17,"tag":84,"props":120871,"children":120872},{},[120873],{"type":17,"tag":133,"props":120874,"children":120877},{"href":120875,"rel":120876},"https://unified.to/integrations/cornerstoneassessment",[214],[120878],{"type":23,"value":120879},"Cornerstone Assessment",{"type":17,"tag":84,"props":120881,"children":120882},{},[120883],{"type":17,"tag":133,"props":120884,"children":120887},{"href":120885,"rel":120886},"https://unified.to/integrations/recruiteeassessment",[214],[120888],{"type":23,"value":120889},"Recruitee Assessment",{"type":17,"tag":84,"props":120891,"children":120892},{},[120893],{"type":17,"tag":133,"props":120894,"children":120897},{"href":120895,"rel":120896},"https://unified.to/integrations/talentlyftassessment",[214],[120898],{"type":23,"value":120899},"TalentLyft Assessment",{"type":17,"tag":239,"props":120901,"children":120903},{"id":120902},"what-shipped-object-method-coverage",[120904],{"type":23,"value":120905},"What shipped (object + method coverage)",{"type":17,"tag":29,"props":120907,"children":120908},{},[120909],{"type":23,"value":120910},"Across supported assessment ATS integrations, we added support for core objects and lifecycle operations:",{"type":17,"tag":80,"props":120912,"children":120913},{},[120914,120919,120924],{"type":17,"tag":84,"props":120915,"children":120916},{},[120917],{"type":23,"value":120918},"Package: list, get, create, update, remove (Workable Assessment, Recruitee Assessment, Greenhouse Assessment)",{"type":17,"tag":84,"props":120920,"children":120921},{},[120922],{"type":23,"value":120923},"Order: update (Workable Assessment, Recruitee Assessment, TalentLyft Assessment, Ashby Assessment)",{"type":17,"tag":84,"props":120925,"children":120926},{},[120927],{"type":23,"value":120928},"Pagination: Order limit/offset support across multiple assessment ATS integrations (Greenhouse, Ashby, Workable, TalentLyft)",{"type":17,"tag":29,"props":120930,"children":120931},{},[120932],{"type":23,"value":120933},"If you're an assessment provider, this closes the embedded integration gap that exists in a subset of ATS platforms and complements the broader ATS API approach for the rest of the market.",{"type":17,"tag":239,"props":120935,"children":120937},{"id":120936},"from-the-blog",[120938],{"type":23,"value":11536},{"type":17,"tag":80,"props":120940,"children":120941},{},[120942,120952],{"type":17,"tag":84,"props":120943,"children":120944},{},[120945],{"type":17,"tag":133,"props":120946,"children":120949},{"href":120947,"rel":120948},"https://unified.to/blog/how_to_use_the_unified_assessment_api",[214],[120950],{"type":23,"value":120951},"How to Use the Unified Assessment API",{"type":17,"tag":84,"props":120953,"children":120954},{},[120955],{"type":17,"tag":133,"props":120956,"children":120959},{"href":120957,"rel":120958},"https://unified.to/blog/how_to_offer_assessment_packages_and_receive_orders_with_unified_assessment_api",[214],[120960],{"type":23,"value":120961},"How to Offer Assessment Packages and Receive Orders with Unified's Assessment API",{"type":17,"tag":68,"props":120963,"children":120965},{"id":120964},"lms-api-content-and-activity",[120966],{"type":23,"value":120967},"LMS API: Content and Activity",{"type":17,"tag":29,"props":120969,"children":120970},{},[120971],{"type":23,"value":120972},"We expanded LMS beyond enrollment and course tracking by adding two core objects:",{"type":17,"tag":80,"props":120974,"children":120975},{},[120976,120980],{"type":17,"tag":84,"props":120977,"children":120978},{},[120979],{"type":23,"value":55314},{"type":17,"tag":84,"props":120981,"children":120982},{},[120983],{"type":23,"value":33999},{"type":17,"tag":239,"props":120985,"children":120987},{"id":120986},"content-activity-now-supported-across-multiple-lms-providers",[120988],{"type":23,"value":120989},"Content + Activity now supported across multiple LMS providers",{"type":17,"tag":29,"props":120991,"children":120992},{},[120993],{"type":23,"value":120994},"Content and Activity support shipped across providers including:",{"type":17,"tag":80,"props":120996,"children":120997},{},[120998,121003,121008,121013,121018,121023],{"type":17,"tag":84,"props":120999,"children":121000},{},[121001],{"type":23,"value":121002},"SAP SuccessFactors (LMS): Content + Activity objects, list/get coverage for Content, list coverage for Activity, plus created/updated virtual webhooks",{"type":17,"tag":84,"props":121004,"children":121005},{},[121006],{"type":23,"value":121007},"LearnUpon: Content + Activity objects and list/get coverage",{"type":17,"tag":84,"props":121009,"children":121010},{},[121011],{"type":23,"value":121012},"LinkedIn Learning: Content object and list/get coverage",{"type":17,"tag":84,"props":121014,"children":121015},{},[121016],{"type":23,"value":121017},"Google Classroom: Content, Collection, Activity objects (list coverage)",{"type":17,"tag":84,"props":121019,"children":121020},{},[121021],{"type":23,"value":121022},"D2L Brightspace: Content, Collection, Activity objects (list coverage)",{"type":17,"tag":84,"props":121024,"children":121025},{},[121026],{"type":23,"value":121027},"Coursera: Content, Collection, Activity objects (Content list/get; Activity list/get; Collection list)",{"type":17,"tag":239,"props":121029,"children":121030},{"id":883},[121031],{"type":23,"value":886},{"type":17,"tag":29,"props":121033,"children":121034},{},[121035],{"type":23,"value":121036},"Content access is the major unlock. It enables teams to pull actual learning materials (including media and content payloads where supported), not just enrollment metadata.",{"type":17,"tag":29,"props":121038,"children":121039},{},[121040],{"type":23,"value":121041},"Activity adds the completion/progress layer: started/completed timestamps, duration, progress percentage, and completion state (where supported).",{"type":17,"tag":239,"props":121043,"children":121045},{"id":121044},"from-the-blog-1",[121046],{"type":23,"value":11536},{"type":17,"tag":80,"props":121048,"children":121049},{},[121050,121060,121070,121080],{"type":17,"tag":84,"props":121051,"children":121052},{},[121053],{"type":17,"tag":133,"props":121054,"children":121057},{"href":121055,"rel":121056},"https://unified.to/blog/how_to_track_learner_progress_completion_status_and_course_activity_with_unified_lms_api",[214],[121058],{"type":23,"value":121059},"How to Track Learner Progress, Completion Status, and Course Activity with Unified's LMS API",{"type":17,"tag":84,"props":121061,"children":121062},{},[121063],{"type":17,"tag":133,"props":121064,"children":121067},{"href":121065,"rel":121066},"https://unified.to/blog/how_to_sync_course_content_between_lms_platforms_with_unified_lms_api",[214],[121068],{"type":23,"value":121069},"How to Sync Course Content Between LMS Platforms with Unified's LMS API",{"type":17,"tag":84,"props":121071,"children":121072},{},[121073],{"type":17,"tag":133,"props":121074,"children":121077},{"href":121075,"rel":121076},"https://unified.to/blog/how_to_access_courses_modules_and_content_from_lms_platforms_with_unified_lms_api",[214],[121078],{"type":23,"value":121079},"How to Access Courses, Modules, and Content from LMS Platforms with Unified's LMS API",{"type":17,"tag":84,"props":121081,"children":121082},{},[121083],{"type":17,"tag":133,"props":121084,"children":121087},{"href":121085,"rel":121086},"https://unified.to/blog/how_to_sync_enrollment_rosters_across_lms_platforms_with_unified_lms_api",[214],[121088],{"type":23,"value":121089},"How to Sync Enrollment Rosters Across LMS Platforms with Unified's LMS API",{"type":17,"tag":68,"props":121091,"children":121093},{"id":121092},"advertising-api-agency-campaign-systems",[121094],{"type":23,"value":121095},"Advertising API: Agency campaign systems",{"type":17,"tag":29,"props":121097,"children":121098},{},[121099],{"type":23,"value":121100},"February added two significant Advertising integrations:",{"type":17,"tag":80,"props":121102,"children":121103},{},[121104,121113],{"type":17,"tag":84,"props":121105,"children":121106},{},[121107],{"type":17,"tag":133,"props":121108,"children":121111},{"href":121109,"rel":121110},"https://unified.to/integrations/googlecampaignmanager360",[214],[121112],{"type":23,"value":41676},{"type":17,"tag":84,"props":121114,"children":121115},{},[121116],{"type":17,"tag":133,"props":121117,"children":121120},{"href":121118,"rel":121119},"https://unified.to/integrations/thetradedesk",[214],[121121],{"type":23,"value":11387},{"type":17,"tag":29,"props":121123,"children":121124},{},[121125],{"type":23,"value":121126},"These matter because they expand Advertising beyond ad networks into systems used by agencies and media buyers.",{"type":17,"tag":239,"props":121128,"children":121130},{"id":121129},"advertising-depth-improvements",[121131],{"type":23,"value":121132},"Advertising depth improvements",{"type":17,"tag":29,"props":121134,"children":121135},{},[121136],{"type":23,"value":121137},"We also continued expanding campaign and creative control across advertising platforms:",{"type":17,"tag":80,"props":121139,"children":121140},{},[121141,121146,121184],{"type":17,"tag":84,"props":121142,"children":121143},{},[121144],{"type":23,"value":121145},"Google Ads: create, update, remove for Creative",{"type":17,"tag":84,"props":121147,"children":121148},{},[121149,121151],{"type":23,"value":121150},"Creative writable fields expanded across multiple networks:\n",{"type":17,"tag":80,"props":121152,"children":121153},{},[121154,121159,121164,121169,121174,121179],{"type":17,"tag":84,"props":121155,"children":121156},{},[121157],{"type":23,"value":121158},"LinkedIn Creative: status",{"type":17,"tag":84,"props":121160,"children":121161},{},[121162],{"type":23,"value":121163},"Pinterest Ads Creative: status",{"type":17,"tag":84,"props":121165,"children":121166},{},[121167],{"type":23,"value":121168},"Reddit Ads Creative: status, campaign_id",{"type":17,"tag":84,"props":121170,"children":121171},{},[121172],{"type":23,"value":121173},"X Ads Creative: status, item_id",{"type":17,"tag":84,"props":121175,"children":121176},{},[121177],{"type":23,"value":121178},"Microsoft Advertising Creative: status, hosting_source, creative_type",{"type":17,"tag":84,"props":121180,"children":121181},{},[121182],{"type":23,"value":121183},"Google Ads Creative: status, organization_id, name, group_id, asset_urls",{"type":17,"tag":84,"props":121185,"children":121186},{},[121187,121189],{"type":23,"value":121188},"Currency field support added:\n",{"type":17,"tag":80,"props":121190,"children":121191},{},[121192,121197],{"type":17,"tag":84,"props":121193,"children":121194},{},[121195],{"type":23,"value":121196},"The Trade Desk Campaign + Group: currency",{"type":17,"tag":84,"props":121198,"children":121199},{},[121200],{"type":23,"value":121201},"LinkedIn Campaign + Group: currency",{"type":17,"tag":29,"props":121203,"children":121204},{},[121205],{"type":23,"value":121206},"This combination (agency systems + broader creative control + field coverage) expands what teams can build in Advertising without per-vendor payload work.",{"type":17,"tag":239,"props":121208,"children":121210},{"id":121209},"from-the-blog-2",[121211],{"type":23,"value":11536},{"type":17,"tag":80,"props":121213,"children":121214},{},[121215,121225],{"type":17,"tag":84,"props":121216,"children":121217},{},[121218],{"type":17,"tag":133,"props":121219,"children":121222},{"href":121220,"rel":121221},"https://unified.to/blog/how_to_pull_cross_platform_ad_performance_reports_using_unified_advertising_api",[214],[121223],{"type":23,"value":121224},"How to Pull Cross-Platform Ad Performance Reports Using Unified's Advertising API",{"type":17,"tag":84,"props":121226,"children":121227},{},[121228],{"type":17,"tag":133,"props":121229,"children":121232},{"href":121230,"rel":121231},"https://unified.to/blog/build_cross_platform_campaign_controls_status_budgets_flight_dates_with_unified_advertising_api",[214],[121233],{"type":23,"value":121234},"Build Cross-Platform Campaign Controls (Status, Budgets, Flight Dates) with Unified Advertising API",{"type":17,"tag":68,"props":121236,"children":121238},{"id":121237},"calendar-meetings-webinar-object",[121239],{"type":23,"value":121240},"Calendar & Meetings: Webinar object",{"type":17,"tag":29,"props":121242,"children":121243},{},[121244,121246,121250],{"type":23,"value":121245},"We expanded Calendar with a dedicated ",{"type":17,"tag":48,"props":121247,"children":121248},{},[121249],{"type":23,"value":14580},{"type":23,"value":121251}," data model and API surface.",{"type":17,"tag":29,"props":121253,"children":121254},{},[121255],{"type":23,"value":121256},"Webinars are structurally different from meetings (registrants, panelists, join/access, capacity, recurrence), so treating them as standard events limits what teams can support.",{"type":17,"tag":239,"props":121258,"children":121260},{"id":121259},"initial-webinar-platform-support",[121261],{"type":23,"value":121262},"Initial webinar platform support",{"type":17,"tag":80,"props":121264,"children":121265},{},[121266,121270,121274,121278],{"type":17,"tag":84,"props":121267,"children":121268},{},[121269],{"type":23,"value":14472},{"type":17,"tag":84,"props":121271,"children":121272},{},[121273],{"type":23,"value":14129},{"type":17,"tag":84,"props":121275,"children":121276},{},[121277],{"type":23,"value":14045},{"type":17,"tag":84,"props":121279,"children":121280},{},[121281],{"type":23,"value":121282},"GoToMeeting",{"type":17,"tag":239,"props":121284,"children":121286},{"id":121285},"related-depth-improvements",[121287],{"type":23,"value":121288},"Related depth improvements",{"type":17,"tag":80,"props":121290,"children":121291},{},[121292,121297,121302],{"type":17,"tag":84,"props":121293,"children":121294},{},[121295],{"type":23,"value":121296},"Webex Webinar: additional pagination/performance support (slow_fields)",{"type":17,"tag":84,"props":121298,"children":121299},{},[121300],{"type":23,"value":121301},"Microsoft Teams Webinar: additional pagination/performance support (slow_fields)",{"type":17,"tag":84,"props":121303,"children":121304},{},[121305],{"type":23,"value":121306},"GoTo Webinar: additional pagination/performance support (slow_fields)",{"type":17,"tag":68,"props":121308,"children":121309},{"id":11629},[121310],{"type":23,"value":11632},{"type":17,"tag":239,"props":121312,"children":121314},{"id":121313},"human-resources",[121315],{"type":23,"value":121316},"Human Resources",{"type":17,"tag":80,"props":121318,"children":121319},{},[121320,121325,121330,121335,121340,121345,121350,121354,121358,121362,121366,121370,121374],{"type":17,"tag":84,"props":121321,"children":121322},{},[121323],{"type":23,"value":121324},"Stardex (ATS)",{"type":17,"tag":84,"props":121326,"children":121327},{},[121328],{"type":23,"value":121329},"Eightfold (ATS)",{"type":17,"tag":84,"props":121331,"children":121332},{},[121333],{"type":23,"value":121334},"Exelare (ATS)",{"type":17,"tag":84,"props":121336,"children":121337},{},[121338],{"type":23,"value":121339},"TalentLyft (ATS)",{"type":17,"tag":84,"props":121341,"children":121342},{},[121343],{"type":23,"value":121344},"Go1 (Learning Management)",{"type":17,"tag":84,"props":121346,"children":121347},{},[121348],{"type":23,"value":121349},"LearnUpon (Learning Management)",{"type":17,"tag":84,"props":121351,"children":121352},{},[121353],{"type":23,"value":120879},{"type":17,"tag":84,"props":121355,"children":121356},{},[121357],{"type":23,"value":120889},{"type":17,"tag":84,"props":121359,"children":121360},{},[121361],{"type":23,"value":120899},{"type":17,"tag":84,"props":121363,"children":121364},{},[121365],{"type":23,"value":120850},{"type":17,"tag":84,"props":121367,"children":121368},{},[121369],{"type":23,"value":120840},{"type":17,"tag":84,"props":121371,"children":121372},{},[121373],{"type":23,"value":120860},{"type":17,"tag":84,"props":121375,"children":121376},{},[121377],{"type":23,"value":121378},"BoondManager (HR & Directory)",{"type":17,"tag":239,"props":121380,"children":121382},{"id":121381},"finance-commerce",[121383],{"type":23,"value":121384},"Finance & Commerce",{"type":17,"tag":80,"props":121386,"children":121387},{},[121388,121393],{"type":17,"tag":84,"props":121389,"children":121390},{},[121391],{"type":23,"value":121392},"SAP S/4HANA Cloud (Accounting)",{"type":17,"tag":84,"props":121394,"children":121395},{},[121396],{"type":23,"value":121397},"Amazon Seller Central (E-Commerce)",{"type":17,"tag":239,"props":121399,"children":121401},{"id":121400},"sales-marketing",[121402],{"type":23,"value":121403},"Sales & Marketing",{"type":17,"tag":80,"props":121405,"children":121406},{},[121407,121412,121417],{"type":17,"tag":84,"props":121408,"children":121409},{},[121410],{"type":23,"value":121411},"DealCloud (CRM)",{"type":17,"tag":84,"props":121413,"children":121414},{},[121415],{"type":23,"value":121416},"Google Campaign Manager 360 (Advertising)",{"type":17,"tag":84,"props":121418,"children":121419},{},[121420],{"type":23,"value":121421},"The Trade Desk (Advertising)",{"type":17,"tag":239,"props":121423,"children":121425},{"id":121424},"productivity",[121426],{"type":23,"value":121427},"Productivity",{"type":17,"tag":80,"props":121429,"children":121430},{},[121431],{"type":17,"tag":84,"props":121432,"children":121433},{},[121434],{"type":23,"value":121435},"Granola (Calendar & Meetings)",{"type":17,"tag":68,"props":121437,"children":121439},{"id":121438},"method-coverage-webhooks-and-field-expansions",[121440],{"type":23,"value":121441},"Method coverage, webhooks, and field expansions",{"type":17,"tag":29,"props":121443,"children":121444},{},[121445],{"type":23,"value":121446},"February included a broad set of depth improvements across categories.",{"type":17,"tag":239,"props":121448,"children":121450},{"id":121449},"new-objects-and-expanded-method-coverage",[121451],{"type":23,"value":121452},"New objects and expanded method coverage",{"type":17,"tag":29,"props":121454,"children":121455},{},[121456],{"type":17,"tag":48,"props":121457,"children":121458},{},[121459],{"type":23,"value":11367},{"type":17,"tag":80,"props":121461,"children":121462},{},[121463,121468,121473],{"type":17,"tag":84,"props":121464,"children":121465},{},[121466],{"type":23,"value":121467},"Added Organization, Campaign, Group, Ad, Creative, Report objects",{"type":17,"tag":84,"props":121469,"children":121470},{},[121471],{"type":23,"value":121472},"Added full lifecycle methods (Campaign/Group/Ad CRUD; Organization list/get; Creative list/get; Report list)",{"type":17,"tag":84,"props":121474,"children":121475},{},[121476],{"type":23,"value":121477},"Added created/updated virtual webhooks for Campaign, Group, Creative",{"type":17,"tag":29,"props":121479,"children":121480},{},[121481],{"type":17,"tag":48,"props":121482,"children":121483},{},[121484],{"type":23,"value":11357},{"type":17,"tag":80,"props":121486,"children":121487},{},[121488,121493,121498,121503],{"type":17,"tag":84,"props":121489,"children":121490},{},[121491],{"type":23,"value":121492},"Added Message, Channel, Event, Employee objects",{"type":17,"tag":84,"props":121494,"children":121495},{},[121496],{"type":23,"value":121497},"Added create for Message",{"type":17,"tag":84,"props":121499,"children":121500},{},[121501],{"type":23,"value":121502},"Added list/get for Channel and Employee",{"type":17,"tag":84,"props":121504,"children":121505},{},[121506],{"type":23,"value":121507},"Added created native webhooks for Event",{"type":17,"tag":29,"props":121509,"children":121510},{},[121511],{"type":17,"tag":48,"props":121512,"children":121513},{},[121514],{"type":23,"value":13006},{"type":17,"tag":80,"props":121516,"children":121517},{},[121518,121522,121527],{"type":17,"tag":84,"props":121519,"children":121520},{},[121521],{"type":23,"value":11814},{"type":17,"tag":84,"props":121523,"children":121524},{},[121525],{"type":23,"value":121526},"Added list/get for Metadata",{"type":17,"tag":84,"props":121528,"children":121529},{},[121530],{"type":23,"value":121531},"Added create/update/remove for Contact",{"type":17,"tag":29,"props":121533,"children":121534},{},[121535],{"type":17,"tag":48,"props":121536,"children":121537},{},[121538],{"type":23,"value":59319},{"type":17,"tag":80,"props":121540,"children":121541},{},[121542,121547,121552],{"type":17,"tag":84,"props":121543,"children":121544},{},[121545],{"type":23,"value":121546},"Added list/get methods for Invoice",{"type":17,"tag":84,"props":121548,"children":121549},{},[121550],{"type":23,"value":121551},"Added full method coverage for Contact (list/get/create/update/remove)",{"type":17,"tag":84,"props":121553,"children":121554},{},[121555],{"type":23,"value":121556},"Added Content object coverage (list/get)",{"type":17,"tag":29,"props":121558,"children":121559},{},[121560],{"type":17,"tag":48,"props":121561,"children":121562},{},[121563],{"type":23,"value":121564},"Toast",{"type":17,"tag":80,"props":121566,"children":121567},{},[121568,121573],{"type":17,"tag":84,"props":121569,"children":121570},{},[121571],{"type":23,"value":121572},"Added list/get for Order and Salesorder",{"type":17,"tag":84,"props":121574,"children":121575},{},[121576],{"type":23,"value":121577},"Added created/updated virtual webhooks for Order and Salesorder",{"type":17,"tag":29,"props":121579,"children":121580},{},[121581],{"type":17,"tag":48,"props":121582,"children":121583},{},[121584],{"type":23,"value":3199},{"type":17,"tag":80,"props":121586,"children":121587},{},[121588,121593,121598],{"type":17,"tag":84,"props":121589,"children":121590},{},[121591],{"type":23,"value":121592},"Added full method coverage for Expense (get/create/update/remove)",{"type":17,"tag":84,"props":121594,"children":121595},{},[121596],{"type":23,"value":121597},"Added created/updated virtual webhooks for Expense",{"type":17,"tag":84,"props":121599,"children":121600},{},[121601],{"type":23,"value":121602},"Expanded readable/writable fields for Expense",{"type":17,"tag":68,"props":121604,"children":121606},{"id":121605},"pagination-and-performance-improvements",[121607],{"type":23,"value":121608},"Pagination and performance improvements",{"type":17,"tag":29,"props":121610,"children":121611},{},[121612],{"type":23,"value":121613},"February included widespread pagination expansions and performance parameters across many integrations and objects. Patterns shipped include:",{"type":17,"tag":80,"props":121615,"children":121616},{},[121617,121622,121627,121632],{"type":17,"tag":84,"props":121618,"children":121619},{},[121620],{"type":23,"value":121621},"limit/offset pagination added across high-volume objects",{"type":17,"tag":84,"props":121623,"children":121624},{},[121625],{"type":23,"value":121626},"query / updated_gte / sort ordering support added where relevant",{"type":17,"tag":84,"props":121628,"children":121629},{},[121630],{"type":23,"value":121631},"slow_fields support added across a large set of objects to improve reliability on heavier payloads",{"type":17,"tag":84,"props":121633,"children":121634},{},[121635],{"type":23,"value":121636},"expanded virtual webhook pagination controls in messaging/support systems (notably Zendesk Message/Page/Space patterns)",{"type":17,"tag":68,"props":121638,"children":121639},{"id":2316},[121640],{"type":23,"value":8829},{"type":17,"tag":29,"props":121642,"children":121643},{},[121644],{"type":23,"value":121645},"February added a new category surface (Assessment), expanded LMS into Content and Activity, widened Advertising into agency campaign systems, and introduced a dedicated Webinar object in Calendar.",{"type":17,"tag":29,"props":121647,"children":121648},{},[121649],{"type":23,"value":121650},"On top of that, we continued expanding method coverage, eventing, writable fields, and pagination support across core platforms so teams can ship deeper integrations without vendor-specific rewrites.",{"type":17,"tag":29,"props":121652,"children":121653},{},[121654],{"type":17,"tag":133,"props":121655,"children":121657},{"href":1612,"rel":121656},[214],[121658],{"type":23,"value":44481},{"type":17,"tag":29,"props":121660,"children":121661},{},[121662],{"type":17,"tag":133,"props":121663,"children":121665},{"href":1623,"rel":121664},[214],[121666],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":121668},[121669,121675,121680,121684,121688,121694,121697,121698],{"id":120808,"depth":1629,"text":120811,"children":121670},[121671,121672,121673,121674],{"id":120824,"depth":1635,"text":120827},{"id":120863,"depth":1635,"text":120866},{"id":120902,"depth":1635,"text":120905},{"id":120936,"depth":1635,"text":11536},{"id":120964,"depth":1629,"text":120967,"children":121676},[121677,121678,121679],{"id":120986,"depth":1635,"text":120989},{"id":883,"depth":1635,"text":886},{"id":121044,"depth":1635,"text":11536},{"id":121092,"depth":1629,"text":121095,"children":121681},[121682,121683],{"id":121129,"depth":1635,"text":121132},{"id":121209,"depth":1635,"text":11536},{"id":121237,"depth":1629,"text":121240,"children":121685},[121686,121687],{"id":121259,"depth":1635,"text":121262},{"id":121285,"depth":1635,"text":121288},{"id":11629,"depth":1629,"text":11632,"children":121689},[121690,121691,121692,121693],{"id":121313,"depth":1635,"text":121316},{"id":121381,"depth":1635,"text":121384},{"id":121400,"depth":1635,"text":121403},{"id":121424,"depth":1635,"text":121427},{"id":121438,"depth":1629,"text":121441,"children":121695},[121696],{"id":121449,"depth":1635,"text":121452},{"id":121605,"depth":1629,"text":121608},{"id":2316,"depth":1629,"text":8829},"content:blog:february_2026_product_update.md","blog/february_2026_product_update.md","blog/february_2026_product_update",{"_path":121703,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":121704,"description":121705,"img":121706,"date":121707,"tag":12,"body":121708,"_type":1677,"_id":123070,"_source":1679,"_file":123071,"_stem":123072,"_extension":1682},"/blog/how_to_integrate_with_asana","How to Integrate with Asana","An Asana API integration lets your product read and write tasks, projects, teams, users, and custom fields inside Asana workspaces. For SaaS companies building...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with_asana-icon.png","2026-02-26T00:39:00.000Z",{"type":14,"children":121709,"toc":123045},[121710,121715,121718,121726,121737,121762,121766,121787,121798,121804,121810,121822,121833,121838,121847,121851,121860,121865,121874,121879,121885,121890,121900,121911,121916,121934,121950,121961,121967,121977,121982,121991,121996,122039,122044,122049,122058,122062,122090,122095,122106,122112,122117,122122,122131,122136,122141,122150,122161,122167,122178,122183,122191,122195,122204,122209,122218,122223,122232,122237,122246,122257,122262,122271,122283,122289,122294,122299,122318,122322,122331,122344,122349,122360,122366,122371,122376,122385,122390,122415,122428,122439,122445,122450,122455,122474,122479,122492,122497,122505,122517,122528,122534,122539,122572,122577,122582,122588,122593,122610,122616,122621,122629,122634,122646,122652,122657,122689,122694,122722,122728,122733,122742,122747,122756,122760,122769,122774,122783,122787,122796,122801,122810,122815,122824,122830,122845,122858,122863,122881,122886,122892,122897,122902,122924,122929,122933,122939,122957,122961,122983,122987,122992,122997,123019,123024,123029,123037],{"type":17,"tag":18,"props":121711,"children":121713},{"id":121712},"how-to-integrate-with-asana",[121714],{"type":23,"value":121704},{"type":17,"tag":25,"props":121716,"children":121717},{},[],{"type":17,"tag":29,"props":121719,"children":121720},{},[121721],{"type":17,"tag":33,"props":121722,"children":121723},{},[121724],{"type":23,"value":121725},"February 26, 2026",{"type":17,"tag":29,"props":121727,"children":121728},{},[121729,121730,121735],{"type":23,"value":40437},{"type":17,"tag":48,"props":121731,"children":121732},{},[121733],{"type":23,"value":121734},"Asana API integration",{"type":23,"value":121736}," lets your product read and write tasks, projects, teams, users, and custom fields inside Asana workspaces. For SaaS companies building project management automation, reporting tools, or workflow integrations, that often means creating tasks, syncing project data, or triggering actions when work changes.",{"type":17,"tag":29,"props":121738,"children":121739},{},[121740,121742,121748,121750,121754,121756,121760],{"type":23,"value":121741},"But a production-grade Asana integration involves more than generating a personal access token and calling ",{"type":17,"tag":6121,"props":121743,"children":121745},{"className":121744},[],[121746],{"type":23,"value":121747},"/tasks",{"type":23,"value":121749},". You need to implement authentication correctly, paginate large datasets, design around ",{"type":17,"tag":133,"props":121751,"children":121752},{"href":135},[121753],{"type":23,"value":138},{"type":23,"value":121755},", and use ",{"type":17,"tag":133,"props":121757,"children":121758},{"href":4999},[121759],{"type":23,"value":5002},{"type":23,"value":121761}," instead of polling.",{"type":17,"tag":29,"props":121763,"children":121764},{},[121765],{"type":23,"value":70164},{"type":17,"tag":6154,"props":121767,"children":121768},{},[121769,121774,121778,121783],{"type":17,"tag":84,"props":121770,"children":121771},{},[121772],{"type":23,"value":121773},"How to integrate directly with the Asana API",{"type":17,"tag":84,"props":121775,"children":121776},{},[121777],{"type":23,"value":70177},{"type":17,"tag":84,"props":121779,"children":121780},{},[121781],{"type":23,"value":121782},"How to integrate Asana using Unified's Task and HR APIs",{"type":17,"tag":84,"props":121784,"children":121785},{},[121786],{"type":23,"value":70187},{"type":17,"tag":29,"props":121788,"children":121789},{},[121790,121792,121797],{"type":23,"value":121791},"If you're exploring how task management integrations fit into a broader integration strategy, see our overview of ",{"type":17,"tag":48,"props":121793,"children":121794},{},[121795],{"type":23,"value":121796},"unified APIs for SaaS integrations",{"type":23,"value":54},{"type":17,"tag":68,"props":121799,"children":121801},{"id":121800},"direct-asana-api-integration",[121802],{"type":23,"value":121803},"Direct Asana API integration",{"type":17,"tag":239,"props":121805,"children":121807},{"id":121806},"step-1-understand-the-asana-api-architecture",[121808],{"type":23,"value":121809},"Step 1: Understand the Asana API architecture",{"type":17,"tag":29,"props":121811,"children":121812},{},[121813,121815,121820],{"type":23,"value":121814},"The Asana API is a ",{"type":17,"tag":48,"props":121816,"children":121817},{},[121818],{"type":23,"value":121819},"REST interface with predictable resource-oriented URLs, JSON request bodies, and standard HTTP verbs",{"type":23,"value":121821},". It supports create, read, update, and delete operations across objects like tasks, projects, and teams.",{"type":17,"tag":29,"props":121823,"children":121824},{},[121825,121827,121832],{"type":23,"value":121826},"Asana's documentation explains the API structure and request format in its ",{"type":17,"tag":48,"props":121828,"children":121829},{},[121830],{"type":23,"value":121831},"API quick start guide",{"type":23,"value":54},{"type":17,"tag":29,"props":121834,"children":121835},{},[121836],{"type":23,"value":121837},"All endpoints are relative to the base API URL:",{"type":17,"tag":6893,"props":121839,"children":121842},{"className":121840,"code":121841,"language":20901,"meta":23},[20899],"https://app.asana.com/api/1.0\n",[121843],{"type":17,"tag":6121,"props":121844,"children":121845},{"__ignoreMap":7},[121846],{"type":23,"value":121841},{"type":17,"tag":29,"props":121848,"children":121849},{},[121850],{"type":23,"value":3258},{"type":17,"tag":6893,"props":121852,"children":121855},{"className":121853,"code":121854,"language":20901,"meta":23},[20899],"POST /tasks\n",[121856],{"type":17,"tag":6121,"props":121857,"children":121858},{"__ignoreMap":7},[121859],{"type":23,"value":121854},{"type":17,"tag":29,"props":121861,"children":121862},{},[121863],{"type":23,"value":121864},"expands to:",{"type":17,"tag":6893,"props":121866,"children":121869},{"className":121867,"code":121868,"language":20901,"meta":23},[20899],"https://app.asana.com/api/1.0/tasks\n",[121870],{"type":17,"tag":6121,"props":121871,"children":121872},{"__ignoreMap":7},[121873],{"type":23,"value":121868},{"type":17,"tag":29,"props":121875,"children":121876},{},[121877],{"type":23,"value":121878},"Requests can be JSON or form-encoded, and all responses are returned in JSON format.",{"type":17,"tag":239,"props":121880,"children":121882},{"id":121881},"step-2-authenticate-your-application",[121883],{"type":23,"value":121884},"Step 2: Authenticate your application",{"type":17,"tag":29,"props":121886,"children":121887},{},[121888],{"type":23,"value":121889},"Asana supports several authentication methods.",{"type":17,"tag":29,"props":121891,"children":121892},{},[121893,121898],{"type":17,"tag":48,"props":121894,"children":121895},{},[121896],{"type":23,"value":121897},"Personal Access Tokens (PATs)",{"type":23,"value":121899}," are the quickest way to start using the API. PATs behave like long-lived API keys and inherit the permissions of the user who created them.",{"type":17,"tag":29,"props":121901,"children":121902},{},[121903,121905,121910],{"type":23,"value":121904},"You can generate a PAT in the developer console as described in the ",{"type":17,"tag":48,"props":121906,"children":121907},{},[121908],{"type":23,"value":121909},"personal access token documentation",{"type":23,"value":54},{"type":17,"tag":29,"props":121912,"children":121913},{},[121914],{"type":23,"value":121915},"PATs are best suited for:",{"type":17,"tag":80,"props":121917,"children":121918},{},[121919,121924,121929],{"type":17,"tag":84,"props":121920,"children":121921},{},[121922],{"type":23,"value":121923},"internal scripts",{"type":17,"tag":84,"props":121925,"children":121926},{},[121927],{"type":23,"value":121928},"automation jobs",{"type":17,"tag":84,"props":121930,"children":121931},{},[121932],{"type":23,"value":121933},"single-user integrations",{"type":17,"tag":29,"props":121935,"children":121936},{},[121937,121939,121948],{"type":23,"value":121938},"For multi-user SaaS integrations, ",{"type":17,"tag":48,"props":121940,"children":121941},{},[121942,121946],{"type":17,"tag":133,"props":121943,"children":121944},{"href":779},[121945],{"type":23,"value":782},{"type":23,"value":121947}," 2.0",{"type":23,"value":121949}," is the recommended approach. OAuth allows each user to authorize your application without sharing credentials.",{"type":17,"tag":29,"props":121951,"children":121952},{},[121953,121955,121960],{"type":23,"value":121954},"Asana's OAuth implementation is documented in the ",{"type":17,"tag":48,"props":121956,"children":121957},{},[121958],{"type":23,"value":121959},"OAuth guide",{"type":23,"value":54},{"type":17,"tag":239,"props":121962,"children":121964},{"id":121963},"step-3-implement-oauth-for-multi-user-integrations",[121965],{"type":23,"value":121966},"Step 3: Implement OAuth for multi-user integrations",{"type":17,"tag":29,"props":121968,"children":121969},{},[121970,121972,121976],{"type":23,"value":121971},"OAuth follows the ",{"type":17,"tag":48,"props":121973,"children":121974},{},[121975],{"type":23,"value":97233},{"type":23,"value":54},{"type":17,"tag":29,"props":121978,"children":121979},{},[121980],{"type":23,"value":121981},"Your application redirects the user to:",{"type":17,"tag":6893,"props":121983,"children":121986},{"className":121984,"code":121985,"language":20901,"meta":23},[20899],"https://app.asana.com/-/oauth_authorize\n",[121987],{"type":17,"tag":6121,"props":121988,"children":121989},{"__ignoreMap":7},[121990],{"type":23,"value":121985},{"type":17,"tag":29,"props":121992,"children":121993},{},[121994],{"type":23,"value":121995},"with parameters including:",{"type":17,"tag":80,"props":121997,"children":121998},{},[121999,122007,122015,122023,122031],{"type":17,"tag":84,"props":122000,"children":122001},{},[122002],{"type":17,"tag":6121,"props":122003,"children":122005},{"className":122004},[],[122006],{"type":23,"value":97251},{"type":17,"tag":84,"props":122008,"children":122009},{},[122010],{"type":17,"tag":6121,"props":122011,"children":122013},{"className":122012},[],[122014],{"type":23,"value":97269},{"type":17,"tag":84,"props":122016,"children":122017},{},[122018],{"type":17,"tag":6121,"props":122019,"children":122021},{"className":122020},[],[122022],{"type":23,"value":97260},{"type":17,"tag":84,"props":122024,"children":122025},{},[122026],{"type":17,"tag":6121,"props":122027,"children":122029},{"className":122028},[],[122030],{"type":23,"value":97278},{"type":17,"tag":84,"props":122032,"children":122033},{},[122034],{"type":17,"tag":6121,"props":122035,"children":122037},{"className":122036},[],[122038],{"type":23,"value":77758},{"type":17,"tag":29,"props":122040,"children":122041},{},[122042],{"type":23,"value":122043},"After the user approves access, Asana redirects back with an authorization code.",{"type":17,"tag":29,"props":122045,"children":122046},{},[122047],{"type":23,"value":122048},"You then exchange the code for tokens by sending a request to:",{"type":17,"tag":6893,"props":122050,"children":122053},{"className":122051,"code":122052,"language":20901,"meta":23},[20899],"POST https://app.asana.com/-/oauth_token\n",[122054],{"type":17,"tag":6121,"props":122055,"children":122056},{"__ignoreMap":7},[122057],{"type":23,"value":122052},{"type":17,"tag":29,"props":122059,"children":122060},{},[122061],{"type":23,"value":19936},{"type":17,"tag":80,"props":122063,"children":122064},{},[122065,122073,122081],{"type":17,"tag":84,"props":122066,"children":122067},{},[122068],{"type":17,"tag":6121,"props":122069,"children":122071},{"className":122070},[],[122072],{"type":23,"value":77598},{"type":17,"tag":84,"props":122074,"children":122075},{},[122076],{"type":17,"tag":6121,"props":122077,"children":122079},{"className":122078},[],[122080],{"type":23,"value":77603},{"type":17,"tag":84,"props":122082,"children":122083},{},[122084],{"type":17,"tag":6121,"props":122085,"children":122087},{"className":122086},[],[122088],{"type":23,"value":122089},"expires_in",{"type":17,"tag":29,"props":122091,"children":122092},{},[122093],{"type":23,"value":122094},"Access tokens typically expire after one hour. Refresh tokens are used to generate new access tokens when needed.",{"type":17,"tag":29,"props":122096,"children":122097},{},[122098,122100,122105],{"type":23,"value":122099},"Full OAuth implementation details are documented in the ",{"type":17,"tag":48,"props":122101,"children":122102},{},[122103],{"type":23,"value":122104},"authorization code grant documentation",{"type":23,"value":54},{"type":17,"tag":239,"props":122107,"children":122109},{"id":122108},"step-4-retrieve-workspace-information",[122110],{"type":23,"value":122111},"Step 4: Retrieve workspace information",{"type":17,"tag":29,"props":122113,"children":122114},{},[122115],{"type":23,"value":122116},"Before creating tasks or projects, your application usually needs the workspace identifier.",{"type":17,"tag":29,"props":122118,"children":122119},{},[122120],{"type":23,"value":122121},"To list workspaces:",{"type":17,"tag":6893,"props":122123,"children":122126},{"className":122124,"code":122125,"language":20901,"meta":23},[20899],"GET /workspaces\n",[122127],{"type":17,"tag":6121,"props":122128,"children":122129},{"__ignoreMap":7},[122130],{"type":23,"value":122125},{"type":17,"tag":29,"props":122132,"children":122133},{},[122134],{"type":23,"value":122135},"This returns the workspaces available to the authenticated user.",{"type":17,"tag":29,"props":122137,"children":122138},{},[122139],{"type":23,"value":122140},"To retrieve a specific workspace:",{"type":17,"tag":6893,"props":122142,"children":122145},{"className":122143,"code":122144,"language":20901,"meta":23},[20899],"GET /workspaces/{workspace_gid}\n",[122146],{"type":17,"tag":6121,"props":122147,"children":122148},{"__ignoreMap":7},[122149],{"type":23,"value":122144},{"type":17,"tag":29,"props":122151,"children":122152},{},[122153,122155,122160],{"type":23,"value":122154},"Workspace APIs are described in the ",{"type":17,"tag":48,"props":122156,"children":122157},{},[122158],{"type":23,"value":122159},"workspace API reference",{"type":23,"value":54},{"type":17,"tag":239,"props":122162,"children":122164},{"id":122163},"step-5-work-with-tasks-and-projects",[122165],{"type":23,"value":122166},"Step 5: Work with tasks and projects",{"type":17,"tag":29,"props":122168,"children":122169},{},[122170,122172,122177],{"type":23,"value":122171},"The most common integration surface in Asana is the ",{"type":17,"tag":48,"props":122173,"children":122174},{},[122175],{"type":23,"value":122176},"task resource",{"type":23,"value":54},{"type":17,"tag":29,"props":122179,"children":122180},{},[122181],{"type":23,"value":122182},"Create a task:",{"type":17,"tag":6893,"props":122184,"children":122186},{"className":122185,"code":121854,"language":20901,"meta":23},[20899],[122187],{"type":17,"tag":6121,"props":122188,"children":122189},{"__ignoreMap":7},[122190],{"type":23,"value":121854},{"type":17,"tag":29,"props":122192,"children":122193},{},[122194],{"type":23,"value":25256},{"type":17,"tag":6893,"props":122196,"children":122199},{"className":122197,"code":122198,"language":22503,"meta":7},[22501],"{\n  \"data\": {\n    \"workspace\": \"WORKSPACE_GID\",\n    \"name\": \"Sample task\",\n    \"assignee\": \"me\"\n  }\n}\n",[122200],{"type":17,"tag":6121,"props":122201,"children":122202},{"__ignoreMap":7},[122203],{"type":23,"value":122198},{"type":17,"tag":29,"props":122205,"children":122206},{},[122207],{"type":23,"value":122208},"Retrieve a task:",{"type":17,"tag":6893,"props":122210,"children":122213},{"className":122211,"code":122212,"language":20901,"meta":23},[20899],"GET /tasks/{task_gid}\n",[122214],{"type":17,"tag":6121,"props":122215,"children":122216},{"__ignoreMap":7},[122217],{"type":23,"value":122212},{"type":17,"tag":29,"props":122219,"children":122220},{},[122221],{"type":23,"value":122222},"Update a task:",{"type":17,"tag":6893,"props":122224,"children":122227},{"className":122225,"code":122226,"language":20901,"meta":23},[20899],"PUT /tasks/{task_gid}\n",[122228],{"type":17,"tag":6121,"props":122229,"children":122230},{"__ignoreMap":7},[122231],{"type":23,"value":122226},{"type":17,"tag":29,"props":122233,"children":122234},{},[122235],{"type":23,"value":122236},"Delete a task:",{"type":17,"tag":6893,"props":122238,"children":122241},{"className":122239,"code":122240,"language":20901,"meta":23},[20899],"DELETE /tasks/{task_gid}\n",[122242],{"type":17,"tag":6121,"props":122243,"children":122244},{"__ignoreMap":7},[122245],{"type":23,"value":122240},{"type":17,"tag":29,"props":122247,"children":122248},{},[122249,122251,122256],{"type":23,"value":122250},"These operations are documented in the ",{"type":17,"tag":48,"props":122252,"children":122253},{},[122254],{"type":23,"value":122255},"Asana task API reference",{"type":23,"value":54},{"type":17,"tag":29,"props":122258,"children":122259},{},[122260],{"type":23,"value":122261},"Projects organize tasks and support similar operations:",{"type":17,"tag":6893,"props":122263,"children":122266},{"className":122264,"code":122265,"language":20901,"meta":23},[20899],"GET /projects\nGET /projects/{project_gid}\nPOST /projects\n",[122267],{"type":17,"tag":6121,"props":122268,"children":122269},{"__ignoreMap":7},[122270],{"type":23,"value":122265},{"type":17,"tag":29,"props":122272,"children":122273},{},[122274,122276,122281],{"type":23,"value":122275},"See the ",{"type":17,"tag":48,"props":122277,"children":122278},{},[122279],{"type":23,"value":122280},"projects API reference",{"type":23,"value":122282}," for full request parameters.",{"type":17,"tag":239,"props":122284,"children":122286},{"id":122285},"step-6-implement-pagination",[122287],{"type":23,"value":122288},"Step 6: Implement pagination",{"type":17,"tag":29,"props":122290,"children":122291},{},[122292],{"type":23,"value":122293},"Large result sets must be paginated.",{"type":17,"tag":29,"props":122295,"children":122296},{},[122297],{"type":23,"value":122298},"Asana supports pagination using:",{"type":17,"tag":80,"props":122300,"children":122301},{},[122302,122310],{"type":17,"tag":84,"props":122303,"children":122304},{},[122305],{"type":17,"tag":6121,"props":122306,"children":122308},{"className":122307},[],[122309],{"type":23,"value":48389},{"type":17,"tag":84,"props":122311,"children":122312},{},[122313],{"type":17,"tag":6121,"props":122314,"children":122316},{"className":122315},[],[122317],{"type":23,"value":48411},{"type":17,"tag":29,"props":122319,"children":122320},{},[122321],{"type":23,"value":19878},{"type":17,"tag":6893,"props":122323,"children":122326},{"className":122324,"code":122325,"language":20901,"meta":23},[20899],"GET /tasks?limit=50\n",[122327],{"type":17,"tag":6121,"props":122328,"children":122329},{"__ignoreMap":7},[122330],{"type":23,"value":122325},{"type":17,"tag":29,"props":122332,"children":122333},{},[122334,122336,122342],{"type":23,"value":122335},"Responses include a ",{"type":17,"tag":6121,"props":122337,"children":122339},{"className":122338},[],[122340],{"type":23,"value":122341},"next_page",{"type":23,"value":122343}," object containing the offset token for the next page.",{"type":17,"tag":29,"props":122345,"children":122346},{},[122347],{"type":23,"value":122348},"Asana strongly recommends paginating requests to avoid truncated results or timeouts.",{"type":17,"tag":29,"props":122350,"children":122351},{},[122352,122354,122359],{"type":23,"value":122353},"Pagination behavior is documented in the ",{"type":17,"tag":48,"props":122355,"children":122356},{},[122357],{"type":23,"value":122358},"pagination guide",{"type":23,"value":54},{"type":17,"tag":239,"props":122361,"children":122363},{"id":122362},"step-7-use-webhooks-instead-of-polling",[122364],{"type":23,"value":122365},"Step 7: Use webhooks instead of polling",{"type":17,"tag":29,"props":122367,"children":122368},{},[122369],{"type":23,"value":122370},"Webhooks allow your integration to react to changes without repeatedly polling the API.",{"type":17,"tag":29,"props":122372,"children":122373},{},[122374],{"type":23,"value":122375},"To create a webhook:",{"type":17,"tag":6893,"props":122377,"children":122380},{"className":122378,"code":122379,"language":20901,"meta":23},[20899],"POST /webhooks\n",[122381],{"type":17,"tag":6121,"props":122382,"children":122383},{"__ignoreMap":7},[122384],{"type":23,"value":122379},{"type":17,"tag":29,"props":122386,"children":122387},{},[122388],{"type":23,"value":122389},"Required fields include:",{"type":17,"tag":80,"props":122391,"children":122392},{},[122393,122404],{"type":17,"tag":84,"props":122394,"children":122395},{},[122396,122402],{"type":17,"tag":6121,"props":122397,"children":122399},{"className":122398},[],[122400],{"type":23,"value":122401},"resource",{"type":23,"value":122403}," (the resource being monitored)",{"type":17,"tag":84,"props":122405,"children":122406},{},[122407,122413],{"type":17,"tag":6121,"props":122408,"children":122410},{"className":122409},[],[122411],{"type":23,"value":122412},"target",{"type":23,"value":122414}," (your webhook endpoint)",{"type":17,"tag":29,"props":122416,"children":122417},{},[122418,122420,122426],{"type":23,"value":122419},"Asana sends a handshake request with an ",{"type":17,"tag":6121,"props":122421,"children":122423},{"className":122422},[],[122424],{"type":23,"value":122425},"X-Hook-Secret",{"type":23,"value":122427}," header, which your endpoint must return to complete verification.",{"type":17,"tag":29,"props":122429,"children":122430},{},[122431,122433,122438],{"type":23,"value":122432},"Webhook behavior, retry logic, and limits are documented in the ",{"type":17,"tag":48,"props":122434,"children":122435},{},[122436],{"type":23,"value":122437},"webhooks guide",{"type":23,"value":54},{"type":17,"tag":239,"props":122440,"children":122442},{"id":122441},"step-8-design-around-rate-limits",[122443],{"type":23,"value":122444},"Step 8: Design around rate limits",{"type":17,"tag":29,"props":122446,"children":122447},{},[122448],{"type":23,"value":122449},"Asana enforces both request and concurrency limits.",{"type":17,"tag":29,"props":122451,"children":122452},{},[122453],{"type":23,"value":122454},"Typical request limits include:",{"type":17,"tag":80,"props":122456,"children":122457},{},[122458,122466],{"type":17,"tag":84,"props":122459,"children":122460},{},[122461],{"type":17,"tag":48,"props":122462,"children":122463},{},[122464],{"type":23,"value":122465},"150 requests per minute for free domains",{"type":17,"tag":84,"props":122467,"children":122468},{},[122469],{"type":17,"tag":48,"props":122470,"children":122471},{},[122472],{"type":23,"value":122473},"1,500 requests per minute for paid domains",{"type":17,"tag":29,"props":122475,"children":122476},{},[122477],{"type":23,"value":122478},"Concurrent request limits include:",{"type":17,"tag":80,"props":122480,"children":122481},{},[122482,122487],{"type":17,"tag":84,"props":122483,"children":122484},{},[122485],{"type":23,"value":122486},"50 concurrent GET requests",{"type":17,"tag":84,"props":122488,"children":122489},{},[122490],{"type":23,"value":122491},"15 concurrent write requests",{"type":17,"tag":29,"props":122493,"children":122494},{},[122495],{"type":23,"value":122496},"If limits are exceeded, the API returns:",{"type":17,"tag":6893,"props":122498,"children":122500},{"className":122499,"code":22743,"language":20901,"meta":23},[20899],[122501],{"type":17,"tag":6121,"props":122502,"children":122503},{"__ignoreMap":7},[122504],{"type":23,"value":22743},{"type":17,"tag":29,"props":122506,"children":122507},{},[122508,122510,122515],{"type":23,"value":122509},"along with a ",{"type":17,"tag":6121,"props":122511,"children":122513},{"className":122512},[],[122514],{"type":23,"value":97924},{"type":23,"value":122516}," header specifying how long to wait before retrying.",{"type":17,"tag":29,"props":122518,"children":122519},{},[122520,122522,122527],{"type":23,"value":122521},"These limits are described in the ",{"type":17,"tag":48,"props":122523,"children":122524},{},[122525],{"type":23,"value":122526},"rate limit documentation",{"type":23,"value":54},{"type":17,"tag":68,"props":122529,"children":122531},{"id":122530},"where-asana-integrations-become-operationally-complex",[122532],{"type":23,"value":122533},"Where Asana integrations become operationally complex",{"type":17,"tag":29,"props":122535,"children":122536},{},[122537],{"type":23,"value":122538},"A direct Asana integration means you own:",{"type":17,"tag":80,"props":122540,"children":122541},{},[122542,122547,122552,122557,122562,122567],{"type":17,"tag":84,"props":122543,"children":122544},{},[122545],{"type":23,"value":122546},"OAuth implementation and token refresh logic",{"type":17,"tag":84,"props":122548,"children":122549},{},[122550],{"type":23,"value":122551},"workspace and user identity mapping",{"type":17,"tag":84,"props":122553,"children":122554},{},[122555],{"type":23,"value":122556},"webhook lifecycle management and retries",{"type":17,"tag":84,"props":122558,"children":122559},{},[122560],{"type":23,"value":122561},"pagination for large task and project datasets",{"type":17,"tag":84,"props":122563,"children":122564},{},[122565],{"type":23,"value":122566},"rate-limit handling and concurrency control",{"type":17,"tag":84,"props":122568,"children":122569},{},[122570],{"type":23,"value":122571},"custom field mapping and task metadata handling",{"type":17,"tag":29,"props":122573,"children":122574},{},[122575],{"type":23,"value":122576},"For small automation scripts this is manageable.",{"type":17,"tag":29,"props":122578,"children":122579},{},[122580],{"type":23,"value":122581},"For a multi-tenant SaaS product supporting many organizations, it becomes integration infrastructure.",{"type":17,"tag":68,"props":122583,"children":122585},{"id":122584},"integrating-asana-via-unified",[122586],{"type":23,"value":122587},"Integrating Asana via Unified",{"type":17,"tag":29,"props":122589,"children":122590},{},[122591],{"type":23,"value":122592},"Unified provides normalized APIs across task management platforms, including Asana.",{"type":17,"tag":29,"props":122594,"children":122595},{},[122596,122598,122603,122604,122609],{"type":23,"value":122597},"Instead of integrating with Asana's API directly, you integrate with Unified's ",{"type":17,"tag":48,"props":122599,"children":122600},{},[122601],{"type":23,"value":122602},"Task API",{"type":23,"value":34435},{"type":17,"tag":48,"props":122605,"children":122606},{},[122607],{"type":23,"value":122608},"HR API",{"type":23,"value":54},{"type":17,"tag":239,"props":122611,"children":122613},{"id":122612},"step-1-register-oauth-through-unified",[122614],{"type":23,"value":122615},"Step 1: Register OAuth through Unified",{"type":17,"tag":29,"props":122617,"children":122618},{},[122619],{"type":23,"value":122620},"When integrating through Unified, configure the OAuth redirect URI as:",{"type":17,"tag":6893,"props":122622,"children":122624},{"className":122623,"code":71416,"language":20901,"meta":23},[20899],[122625],{"type":17,"tag":6121,"props":122626,"children":122627},{"__ignoreMap":7},[122628],{"type":23,"value":71416},{"type":17,"tag":29,"props":122630,"children":122631},{},[122632],{"type":23,"value":122633},"Regional variants are also available for EU and AU environments.",{"type":17,"tag":29,"props":122635,"children":122636},{},[122637,122639,122644],{"type":23,"value":122638},"Users authorize their Asana account through Unified's authorization flow, and Unified returns a ",{"type":17,"tag":6121,"props":122640,"children":122642},{"className":122641},[],[122643],{"type":23,"value":25037},{"type":23,"value":122645}," that identifies the connected account.",{"type":17,"tag":239,"props":122647,"children":122649},{"id":122648},"step-2-use-normalized-unified-objects",[122650],{"type":23,"value":122651},"Step 2: Use normalized Unified objects",{"type":17,"tag":29,"props":122653,"children":122654},{},[122655],{"type":23,"value":122656},"Based on the Asana coverage provided in Unified documentation, the integration supports normalized objects including:",{"type":17,"tag":80,"props":122658,"children":122659},{},[122660,122664,122669,122674,122679,122684],{"type":17,"tag":84,"props":122661,"children":122662},{},[122663],{"type":23,"value":13357},{"type":17,"tag":84,"props":122665,"children":122666},{},[122667],{"type":23,"value":122668},"Task Project",{"type":17,"tag":84,"props":122670,"children":122671},{},[122672],{"type":23,"value":122673},"Task Comment",{"type":17,"tag":84,"props":122675,"children":122676},{},[122677],{"type":23,"value":122678},"HRIS Employee",{"type":17,"tag":84,"props":122680,"children":122681},{},[122682],{"type":23,"value":122683},"HRIS Group",{"type":17,"tag":84,"props":122685,"children":122686},{},[122687],{"type":23,"value":122688},"Custom field metadata",{"type":17,"tag":29,"props":122690,"children":122691},{},[122692],{"type":23,"value":122693},"These objects normalize Asana resources such as:",{"type":17,"tag":80,"props":122695,"children":122696},{},[122697,122702,122707,122712,122717],{"type":17,"tag":84,"props":122698,"children":122699},{},[122700],{"type":23,"value":122701},"tasks",{"type":17,"tag":84,"props":122703,"children":122704},{},[122705],{"type":23,"value":122706},"projects",{"type":17,"tag":84,"props":122708,"children":122709},{},[122710],{"type":23,"value":122711},"comments (stories)",{"type":17,"tag":84,"props":122713,"children":122714},{},[122715],{"type":23,"value":122716},"users",{"type":17,"tag":84,"props":122718,"children":122719},{},[122720],{"type":23,"value":122721},"teams",{"type":17,"tag":239,"props":122723,"children":122725},{"id":122724},"step-3-make-your-first-unified-api-calls",[122726],{"type":23,"value":122727},"Step 3: Make your first Unified API calls",{"type":17,"tag":29,"props":122729,"children":122730},{},[122731],{"type":23,"value":122732},"List projects:",{"type":17,"tag":6893,"props":122734,"children":122737},{"className":122735,"code":122736,"language":20901,"meta":23},[20899],"GET /task/{connection_id}/project\n",[122738],{"type":17,"tag":6121,"props":122739,"children":122740},{"__ignoreMap":7},[122741],{"type":23,"value":122736},{"type":17,"tag":29,"props":122743,"children":122744},{},[122745],{"type":23,"value":122746},"List tasks in a project:",{"type":17,"tag":6893,"props":122748,"children":122751},{"className":122749,"code":122750,"language":20901,"meta":23},[20899],"GET /task/{connection_id}/task?project_id={project_id}\n",[122752],{"type":17,"tag":6121,"props":122753,"children":122754},{"__ignoreMap":7},[122755],{"type":23,"value":122750},{"type":17,"tag":29,"props":122757,"children":122758},{},[122759],{"type":23,"value":122182},{"type":17,"tag":6893,"props":122761,"children":122764},{"className":122762,"code":122763,"language":20901,"meta":23},[20899],"POST /task/{connection_id}/task\n",[122765],{"type":17,"tag":6121,"props":122766,"children":122767},{"__ignoreMap":7},[122768],{"type":23,"value":122763},{"type":17,"tag":29,"props":122770,"children":122771},{},[122772],{"type":23,"value":122773},"Example payload:",{"type":17,"tag":6893,"props":122775,"children":122778},{"className":122776,"code":122777,"language":22503,"meta":7},[22501],"{\n  \"name\": \"New task from Unified\",\n  \"project_id\": \"PROJECT_ID\",\n  \"notes\": \"Created via Unified API\"\n}\n",[122779],{"type":17,"tag":6121,"props":122780,"children":122781},{"__ignoreMap":7},[122782],{"type":23,"value":122777},{"type":17,"tag":29,"props":122784,"children":122785},{},[122786],{"type":23,"value":122222},{"type":17,"tag":6893,"props":122788,"children":122791},{"className":122789,"code":122790,"language":20901,"meta":23},[20899],"PUT /task/{connection_id}/task/{task_id}\n",[122792],{"type":17,"tag":6121,"props":122793,"children":122794},{"__ignoreMap":7},[122795],{"type":23,"value":122790},{"type":17,"tag":29,"props":122797,"children":122798},{},[122799],{"type":23,"value":122800},"List users:",{"type":17,"tag":6893,"props":122802,"children":122805},{"className":122803,"code":122804,"language":20901,"meta":23},[20899],"GET /hris/{connection_id}/employee\n",[122806],{"type":17,"tag":6121,"props":122807,"children":122808},{"__ignoreMap":7},[122809],{"type":23,"value":122804},{"type":17,"tag":29,"props":122811,"children":122812},{},[122813],{"type":23,"value":122814},"List teams:",{"type":17,"tag":6893,"props":122816,"children":122819},{"className":122817,"code":122818,"language":20901,"meta":23},[20899],"GET /hris/{connection_id}/group\n",[122820],{"type":17,"tag":6121,"props":122821,"children":122822},{"__ignoreMap":7},[122823],{"type":23,"value":122818},{"type":17,"tag":239,"props":122825,"children":122827},{"id":122826},"step-4-use-unified-webhooks",[122828],{"type":23,"value":122829},"Step 4: Use Unified webhooks",{"type":17,"tag":29,"props":122831,"children":122832},{},[122833,122834,122838,122839,122843],{"type":23,"value":107847},{"type":17,"tag":48,"props":122835,"children":122836},{},[122837],{"type":23,"value":98503},{"type":23,"value":34435},{"type":17,"tag":48,"props":122840,"children":122841},{},[122842],{"type":23,"value":98509},{"type":23,"value":122844}," webhook models.",{"type":17,"tag":80,"props":122846,"children":122847},{},[122848,122853],{"type":17,"tag":84,"props":122849,"children":122850},{},[122851],{"type":23,"value":122852},"Native webhooks use Asana's native webhook system.",{"type":17,"tag":84,"props":122854,"children":122855},{},[122856],{"type":23,"value":122857},"Virtual webhooks simulate real-time events by polling the provider API and emitting events when changes occur.",{"type":17,"tag":29,"props":122859,"children":122860},{},[122861],{"type":23,"value":122862},"This approach allows applications to receive normalized events such as:",{"type":17,"tag":80,"props":122864,"children":122865},{},[122866,122871,122876],{"type":17,"tag":84,"props":122867,"children":122868},{},[122869],{"type":23,"value":122870},"task created",{"type":17,"tag":84,"props":122872,"children":122873},{},[122874],{"type":23,"value":122875},"task updated",{"type":17,"tag":84,"props":122877,"children":122878},{},[122879],{"type":23,"value":122880},"project updated",{"type":17,"tag":29,"props":122882,"children":122883},{},[122884],{"type":23,"value":122885},"without implementing provider-specific webhook infrastructure.",{"type":17,"tag":239,"props":122887,"children":122889},{"id":122888},"step-5-use-passthrough-for-unsupported-endpoints",[122890],{"type":23,"value":122891},"Step 5: Use passthrough for unsupported endpoints",{"type":17,"tag":29,"props":122893,"children":122894},{},[122895],{"type":23,"value":122896},"If an Asana endpoint is not covered by Unified's normalized model, you can use the passthrough API.",{"type":17,"tag":29,"props":122898,"children":122899},{},[122900],{"type":23,"value":122901},"Passthrough supports:",{"type":17,"tag":80,"props":122903,"children":122904},{},[122905,122910,122915,122919],{"type":17,"tag":84,"props":122906,"children":122907},{},[122908],{"type":23,"value":122909},"GET",{"type":17,"tag":84,"props":122911,"children":122912},{},[122913],{"type":23,"value":122914},"POST",{"type":17,"tag":84,"props":122916,"children":122917},{},[122918],{"type":23,"value":110111},{"type":17,"tag":84,"props":122920,"children":122921},{},[122922],{"type":23,"value":122923},"DELETE",{"type":17,"tag":29,"props":122925,"children":122926},{},[122927],{"type":23,"value":122928},"This allows direct calls to Asana's API while still using Unified's authentication and connection model.",{"type":17,"tag":68,"props":122930,"children":122931},{"id":72006},[122932],{"type":23,"value":72009},{"type":17,"tag":239,"props":122934,"children":122936},{"id":122935},"build-directly-with-asana-if",[122937],{"type":23,"value":122938},"Build directly with Asana if:",{"type":17,"tag":80,"props":122940,"children":122941},{},[122942,122947,122952],{"type":17,"tag":84,"props":122943,"children":122944},{},[122945],{"type":23,"value":122946},"Asana is a core feature of your product",{"type":17,"tag":84,"props":122948,"children":122949},{},[122950],{"type":23,"value":122951},"you need full control over tasks, projects, teams, and custom fields",{"type":17,"tag":84,"props":122953,"children":122954},{},[122955],{"type":23,"value":122956},"you want direct access to Asana's API capabilities",{"type":17,"tag":239,"props":122958,"children":122959},{"id":72041},[122960],{"type":23,"value":98574},{"type":17,"tag":80,"props":122962,"children":122963},{},[122964,122969,122974,122978],{"type":17,"tag":84,"props":122965,"children":122966},{},[122967],{"type":23,"value":122968},"you plan to support multiple task management systems",{"type":17,"tag":84,"props":122970,"children":122971},{},[122972],{"type":23,"value":122973},"you want one integration layer across providers",{"type":17,"tag":84,"props":122975,"children":122976},{},[122977],{"type":23,"value":72062},{"type":17,"tag":84,"props":122979,"children":122980},{},[122981],{"type":23,"value":122982},"you want normalized objects across integrations",{"type":17,"tag":68,"props":122984,"children":122985},{"id":1552},[122986],{"type":23,"value":1555},{"type":17,"tag":29,"props":122988,"children":122989},{},[122990],{"type":23,"value":122991},"Building a basic Asana integration is relatively straightforward.",{"type":17,"tag":29,"props":122993,"children":122994},{},[122995],{"type":23,"value":122996},"Running a production integration across many organizations requires:",{"type":17,"tag":80,"props":122998,"children":122999},{},[123000,123005,123009,123014],{"type":17,"tag":84,"props":123001,"children":123002},{},[123003],{"type":23,"value":123004},"reliable authentication",{"type":17,"tag":84,"props":123006,"children":123007},{},[123008],{"type":23,"value":1260},{"type":17,"tag":84,"props":123010,"children":123011},{},[123012],{"type":23,"value":123013},"pagination strategies",{"type":17,"tag":84,"props":123015,"children":123016},{},[123017],{"type":23,"value":123018},"rate-limit protection",{"type":17,"tag":29,"props":123020,"children":123021},{},[123022],{"type":23,"value":123023},"If Asana is a core system for your customers, investing in a direct integration makes sense.",{"type":17,"tag":29,"props":123025,"children":123026},{},[123027],{"type":23,"value":123028},"If task management is just one of many integrations your product needs, a unified API approach can significantly reduce engineering overhead and accelerate delivery.",{"type":17,"tag":29,"props":123030,"children":123031},{},[123032],{"type":17,"tag":133,"props":123033,"children":123035},{"href":1612,"rel":123034},[214],[123036],{"type":23,"value":44481},{"type":17,"tag":29,"props":123038,"children":123039},{},[123040],{"type":17,"tag":133,"props":123041,"children":123043},{"href":1623,"rel":123042},[214],[123044],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":123046},[123047,123057,123058,123065,123069],{"id":121800,"depth":1629,"text":121803,"children":123048},[123049,123050,123051,123052,123053,123054,123055,123056],{"id":121806,"depth":1635,"text":121809},{"id":121881,"depth":1635,"text":121884},{"id":121963,"depth":1635,"text":121966},{"id":122108,"depth":1635,"text":122111},{"id":122163,"depth":1635,"text":122166},{"id":122285,"depth":1635,"text":122288},{"id":122362,"depth":1635,"text":122365},{"id":122441,"depth":1635,"text":122444},{"id":122530,"depth":1629,"text":122533},{"id":122584,"depth":1629,"text":122587,"children":123059},[123060,123061,123062,123063,123064],{"id":122612,"depth":1635,"text":122615},{"id":122648,"depth":1635,"text":122651},{"id":122724,"depth":1635,"text":122727},{"id":122826,"depth":1635,"text":122829},{"id":122888,"depth":1635,"text":122891},{"id":72006,"depth":1629,"text":72009,"children":123066},[123067,123068],{"id":122935,"depth":1635,"text":122938},{"id":72041,"depth":1635,"text":98574},{"id":1552,"depth":1629,"text":1555},"content:blog:how_to_integrate_with_asana.md","blog/how_to_integrate_with_asana.md","blog/how_to_integrate_with_asana",{"_path":123074,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":123075,"description":123076,"img":123077,"date":121707,"tag":12,"body":123078,"_type":1677,"_id":125248,"_source":1679,"_file":125249,"_stem":125250,"_extension":1682},"/blog/how_to_integrate_with_atlassian_jira","How to Integrate with Atlassian Jira","A Jira API integration lets your product create issues, sync project data, update comments, transition workflows, and pull structured task data from the system...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with_atlassian_jira-icon.png",{"type":14,"children":123079,"toc":125211},[123080,123085,123088,123095,123106,123111,123133,123137,123158,123164,123170,123175,123210,123229,123233,123268,123274,123309,123314,123375,123387,123392,123401,123407,123420,123425,123434,123439,123448,123458,123464,123482,123487,123523,123528,123534,123540,123545,123554,123559,123568,123587,123593,123598,123607,123633,123639,123644,123653,123665,123671,123676,123685,123697,123703,123708,123727,123732,123741,123746,123755,123760,123766,123771,123776,123785,123797,123802,123811,123817,123822,123827,123836,123841,123850,123855,123864,123876,123882,123887,123896,123908,123914,123918,123923,123962,123987,124000,124005,124017,124022,124069,124074,124107,124111,124116,124127,124132,124165,124170,124176,124181,124249,124254,124259,124264,124276,124296,124308,124314,124319,124324,124414,124420,124425,124433,124451,124456,124570,124575,124581,124593,124598,124604,124608,124616,124621,124630,124635,124644,124648,124656,124660,124669,124674,124683,124688,124784,124789,124857,124862,124868,124873,124923,124928,124956,124962,124967,125002,125007,125012,125018,125023,125028,125033,125068,125073,125077,125083,125106,125110,125138,125142,125147,125152,125185,125190,125195,125203],{"type":17,"tag":18,"props":123081,"children":123083},{"id":123082},"how-to-integrate-with-atlassian-jira",[123084],{"type":23,"value":123075},{"type":17,"tag":25,"props":123086,"children":123087},{},[],{"type":17,"tag":29,"props":123089,"children":123090},{},[123091],{"type":17,"tag":33,"props":123092,"children":123093},{},[123094],{"type":23,"value":121725},{"type":17,"tag":29,"props":123096,"children":123097},{},[123098,123099,123104],{"type":23,"value":9619},{"type":17,"tag":48,"props":123100,"children":123101},{},[123102],{"type":23,"value":123103},"Jira API integration",{"type":23,"value":123105}," lets your product create issues, sync project data, update comments, transition workflows, and pull structured task data from the system many engineering, product, and IT teams already use to run work.",{"type":17,"tag":29,"props":123107,"children":123108},{},[123109],{"type":23,"value":123110},"For B2B SaaS teams, that usually means pushing tickets into Jira from your app, syncing issue status back into your product, surfacing project or sprint context, or automating workflows that would otherwise require manual updates.",{"type":17,"tag":29,"props":123112,"children":123113},{},[123114,123116,123120,123122,123126,123127,123131],{"type":23,"value":123115},"But a production-grade Jira integration involves more than sending a request to create an issue. You need to choose the right authentication model, understand Jira Cloud's REST patterns, handle JQL search and ",{"type":17,"tag":133,"props":123117,"children":123118},{"href":1857},[123119],{"type":23,"value":1860},{"type":23,"value":123121}," correctly, design around ",{"type":17,"tag":133,"props":123123,"children":123124},{"href":135},[123125],{"type":23,"value":138},{"type":23,"value":121755},{"type":17,"tag":133,"props":123128,"children":123129},{"href":4999},[123130],{"type":23,"value":5002},{"type":23,"value":123132}," where real-time updates matter.",{"type":17,"tag":29,"props":123134,"children":123135},{},[123136],{"type":23,"value":70164},{"type":17,"tag":6154,"props":123138,"children":123139},{},[123140,123145,123149,123154],{"type":17,"tag":84,"props":123141,"children":123142},{},[123143],{"type":23,"value":123144},"How to integrate directly with the Jira API",{"type":17,"tag":84,"props":123146,"children":123147},{},[123148],{"type":23,"value":70177},{"type":17,"tag":84,"props":123150,"children":123151},{},[123152],{"type":23,"value":123153},"How to integrate Jira using Unified's Task, HRIS, Metadata, and Storage APIs",{"type":17,"tag":84,"props":123155,"children":123156},{},[123157],{"type":23,"value":70187},{"type":17,"tag":68,"props":123159,"children":123161},{"id":123160},"direct-jira-api-integration",[123162],{"type":23,"value":123163},"Direct Jira API integration",{"type":17,"tag":239,"props":123165,"children":123167},{"id":123166},"step-1-choose-the-right-authentication-model",[123168],{"type":23,"value":123169},"Step 1: Choose the right authentication model",{"type":17,"tag":29,"props":123171,"children":123172},{},[123173],{"type":23,"value":123174},"For Jira Cloud, there are two practical paths for most developers.",{"type":17,"tag":29,"props":123176,"children":123177},{},[123178,123180,123185,123187,123193,123195,123202,123203],{"type":23,"value":123179},"For simple internal scripts or one-off admin tooling, ",{"type":17,"tag":48,"props":123181,"children":123182},{},[123183],{"type":23,"value":123184},"basic authentication with an Atlassian API token",{"type":23,"value":123186}," is still the fastest option. Atlassian documents creating an API token, combining it with the user's email, and sending it in the ",{"type":17,"tag":6121,"props":123188,"children":123190},{"className":123189},[],[123191],{"type":23,"value":123192},"Authorization: Basic",{"type":23,"value":123194}," header for REST requests. ",{"type":17,"tag":133,"props":123196,"children":123199},{"href":123197,"rel":123198},"https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/",[214],[123200],{"type":23,"value":123201},"Manage API tokens",{"type":23,"value":34435},{"type":17,"tag":133,"props":123204,"children":123207},{"href":123205,"rel":123206},"https://developer.atlassian.com/cloud/jira/platform/basic-auth-for-rest-apis/",[214],[123208],{"type":23,"value":123209},"Basic auth for REST APIs",{"type":17,"tag":29,"props":123211,"children":123212},{},[123213,123215,123220,123222],{"type":23,"value":123214},"For customer-facing SaaS integrations, ",{"type":17,"tag":48,"props":123216,"children":123217},{},[123218],{"type":23,"value":123219},"OAuth 2.0 (3LO)",{"type":23,"value":123221}," is the better fit. It lets users authorize your app without sharing credentials, supports scoped access, and is the right pattern when each customer connects their own Jira tenant. Atlassian documents the 3LO flow in its OAuth guide. ",{"type":17,"tag":133,"props":123223,"children":123226},{"href":123224,"rel":123225},"https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/",[214],[123227],{"type":23,"value":123228},"OAuth 2.0 (3LO) apps",{"type":17,"tag":29,"props":123230,"children":123231},{},[123232],{"type":23,"value":105205},{"type":17,"tag":80,"props":123234,"children":123235},{},[123236,123247,123257],{"type":17,"tag":84,"props":123237,"children":123238},{},[123239,123240,123245],{"type":23,"value":33722},{"type":17,"tag":48,"props":123241,"children":123242},{},[123243],{"type":23,"value":123244},"API token auth",{"type":23,"value":123246}," for internal tools and testing",{"type":17,"tag":84,"props":123248,"children":123249},{},[123250,123251,123255],{"type":23,"value":33722},{"type":17,"tag":48,"props":123252,"children":123253},{},[123254],{"type":23,"value":123219},{"type":23,"value":123256}," for multi-user SaaS integrations",{"type":17,"tag":84,"props":123258,"children":123259},{},[123260,123261,123266],{"type":23,"value":33722},{"type":17,"tag":48,"props":123262,"children":123263},{},[123264],{"type":23,"value":123265},"refresh tokens",{"type":23,"value":123267}," when you need long-lived delegated access",{"type":17,"tag":239,"props":123269,"children":123271},{"id":123270},"step-2-register-an-oauth-20-app-if-you-are-building-a-saas-integration",[123272],{"type":23,"value":123273},"Step 2: Register an OAuth 2.0 app if you are building a SaaS integration",{"type":17,"tag":29,"props":123275,"children":123276},{},[123277,123279,123286,123288,123294,123296,123302,123304],{"type":23,"value":123278},"In the ",{"type":17,"tag":133,"props":123280,"children":123283},{"href":123281,"rel":123282},"https://developer.atlassian.com/console/myapps/",[214],[123284],{"type":23,"value":123285},"Atlassian developer console",{"type":23,"value":123287},", create an app, configure OAuth 2.0, and add your callback URL. Atlassian's flow uses an authorization endpoint at ",{"type":17,"tag":6121,"props":123289,"children":123291},{"className":123290},[],[123292],{"type":23,"value":123293},"https://auth.atlassian.com/authorize",{"type":23,"value":123295},", followed by token exchange at ",{"type":17,"tag":6121,"props":123297,"children":123299},{"className":123298},[],[123300],{"type":23,"value":123301},"https://auth.atlassian.com/oauth/token",{"type":23,"value":123303},". ",{"type":17,"tag":133,"props":123305,"children":123307},{"href":123224,"rel":123306},[214],[123308],{"type":23,"value":123228},{"type":17,"tag":29,"props":123310,"children":123311},{},[123312],{"type":23,"value":123313},"The authorization request includes:",{"type":17,"tag":80,"props":123315,"children":123316},{},[123317,123326,123334,123342,123350,123358,123366],{"type":17,"tag":84,"props":123318,"children":123319},{},[123320],{"type":17,"tag":6121,"props":123321,"children":123323},{"className":123322},[],[123324],{"type":23,"value":123325},"audience=api.atlassian.com",{"type":17,"tag":84,"props":123327,"children":123328},{},[123329],{"type":17,"tag":6121,"props":123330,"children":123332},{"className":123331},[],[123333],{"type":23,"value":97251},{"type":17,"tag":84,"props":123335,"children":123336},{},[123337],{"type":17,"tag":6121,"props":123338,"children":123340},{"className":123339},[],[123341],{"type":23,"value":97278},{"type":17,"tag":84,"props":123343,"children":123344},{},[123345],{"type":17,"tag":6121,"props":123346,"children":123348},{"className":123347},[],[123349],{"type":23,"value":97269},{"type":17,"tag":84,"props":123351,"children":123352},{},[123353],{"type":17,"tag":6121,"props":123354,"children":123356},{"className":123355},[],[123357],{"type":23,"value":77758},{"type":17,"tag":84,"props":123359,"children":123360},{},[123361],{"type":17,"tag":6121,"props":123362,"children":123364},{"className":123363},[],[123365],{"type":23,"value":97260},{"type":17,"tag":84,"props":123367,"children":123368},{},[123369],{"type":17,"tag":6121,"props":123370,"children":123372},{"className":123371},[],[123373],{"type":23,"value":123374},"prompt=consent",{"type":17,"tag":29,"props":123376,"children":123377},{},[123378,123380,123385],{"type":23,"value":123379},"After the user approves access, Atlassian redirects back with a ",{"type":17,"tag":6121,"props":123381,"children":123383},{"className":123382},[],[123384],{"type":23,"value":6121},{"type":23,"value":123386},". Your backend exchanges that code for an access token and, if requested, a refresh token.",{"type":17,"tag":29,"props":123388,"children":123389},{},[123390],{"type":23,"value":123391},"A direct token exchange looks like this:",{"type":17,"tag":6893,"props":123393,"children":123396},{"className":123394,"code":123395,"language":22503,"meta":7},[22501],"POST https://auth.atlassian.com/oauth/token\n{\n  \"grant_type\": \"authorization_code\",\n  \"client_id\": \"YOUR_CLIENT_ID\",\n  \"client_secret\": \"YOUR_CLIENT_SECRET\",\n  \"code\": \"AUTHORIZATION_CODE\",\n  \"redirect_uri\": \"YOUR_REDIRECT_URI\"\n}\n",[123397],{"type":17,"tag":6121,"props":123398,"children":123399},{"__ignoreMap":7},[123400],{"type":23,"value":123395},{"type":17,"tag":239,"props":123402,"children":123404},{"id":123403},"step-3-resolve-the-tenant-before-calling-jira-apis",[123405],{"type":23,"value":123406},"Step 3: Resolve the tenant before calling Jira APIs",{"type":17,"tag":29,"props":123408,"children":123409},{},[123410,123412,123418],{"type":23,"value":123411},"With Atlassian OAuth, getting an access token is not the final step. You also need the site's ",{"type":17,"tag":6121,"props":123413,"children":123415},{"className":123414},[],[123416],{"type":23,"value":123417},"cloudId",{"type":23,"value":123419}," so you can address the correct Jira tenant.",{"type":17,"tag":29,"props":123421,"children":123422},{},[123423],{"type":23,"value":123424},"Atlassian documents calling the accessible resources endpoint:",{"type":17,"tag":6893,"props":123426,"children":123429},{"className":123427,"code":123428,"language":20901,"meta":23},[20899],"GET https://api.atlassian.com/oauth/token/accessible-resources\nAuthorization: Bearer ACCESS_TOKEN\n",[123430],{"type":17,"tag":6121,"props":123431,"children":123432},{"__ignoreMap":7},[123433],{"type":23,"value":123428},{"type":17,"tag":29,"props":123435,"children":123436},{},[123437],{"type":23,"value":123438},"Then you call Jira REST APIs using this pattern:",{"type":17,"tag":6893,"props":123440,"children":123443},{"className":123441,"code":123442,"language":20901,"meta":23},[20899],"https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/...\n",[123444],{"type":17,"tag":6121,"props":123445,"children":123446},{"__ignoreMap":7},[123447],{"type":23,"value":123442},{"type":17,"tag":29,"props":123449,"children":123450},{},[123451,123453],{"type":23,"value":123452},"That tenant-resolution step is easy to miss if you are used to simpler OAuth flows. ",{"type":17,"tag":133,"props":123454,"children":123456},{"href":123224,"rel":123455},[214],[123457],{"type":23,"value":123228},{"type":17,"tag":239,"props":123459,"children":123461},{"id":123460},"step-4-understand-the-core-jira-rest-model",[123462],{"type":23,"value":123463},"Step 4: Understand the core Jira REST model",{"type":17,"tag":29,"props":123465,"children":123466},{},[123467,123469,123474,123476],{"type":23,"value":123468},"Jira Cloud's main public API surface is ",{"type":17,"tag":48,"props":123470,"children":123471},{},[123472],{"type":23,"value":123473},"REST",{"type":23,"value":123475},", not GraphQL. Atlassian's platform docs position the Jira Cloud REST API as the core path for reading and writing issues, projects, users, comments, workflows, and related resources. ",{"type":17,"tag":133,"props":123477,"children":123479},{"href":12555,"rel":123478},[214],[123480],{"type":23,"value":123481},"Jira Cloud platform REST API",{"type":17,"tag":29,"props":123483,"children":123484},{},[123485],{"type":23,"value":123486},"At a minimum, most integrations work with:",{"type":17,"tag":80,"props":123488,"children":123489},{},[123490,123495,123500,123504,123509,123514,123519],{"type":17,"tag":84,"props":123491,"children":123492},{},[123493],{"type":23,"value":123494},"Issues",{"type":17,"tag":84,"props":123496,"children":123497},{},[123498],{"type":23,"value":123499},"Projects",{"type":17,"tag":84,"props":123501,"children":123502},{},[123503],{"type":23,"value":31629},{"type":17,"tag":84,"props":123505,"children":123506},{},[123507],{"type":23,"value":123508},"Users",{"type":17,"tag":84,"props":123510,"children":123511},{},[123512],{"type":23,"value":123513},"Transitions",{"type":17,"tag":84,"props":123515,"children":123516},{},[123517],{"type":23,"value":123518},"Search via JQL",{"type":17,"tag":84,"props":123520,"children":123521},{},[123522],{"type":23,"value":43896},{"type":17,"tag":29,"props":123524,"children":123525},{},[123526],{"type":23,"value":123527},"If your use case is customer support escalation, bug tracking, incident management, or product planning sync, these are the objects that matter first.",{"type":17,"tag":68,"props":123529,"children":123531},{"id":123530},"core-jira-operations",[123532],{"type":23,"value":123533},"Core Jira operations",{"type":17,"tag":239,"props":123535,"children":123537},{"id":123536},"create-an-issue",[123538],{"type":23,"value":123539},"Create an issue",{"type":17,"tag":29,"props":123541,"children":123542},{},[123543],{"type":23,"value":123544},"Creating issues is usually the first meaningful integration step. In Jira Cloud, the endpoint is:",{"type":17,"tag":6893,"props":123546,"children":123549},{"className":123547,"code":123548,"language":20901,"meta":23},[20899],"POST /rest/api/3/issue\n",[123550],{"type":17,"tag":6121,"props":123551,"children":123552},{"__ignoreMap":7},[123553],{"type":23,"value":123548},{"type":17,"tag":29,"props":123555,"children":123556},{},[123557],{"type":23,"value":123558},"A minimal request body includes fields like project, issue type, and summary:",{"type":17,"tag":6893,"props":123560,"children":123563},{"className":123561,"code":123562,"language":22503,"meta":7},[22501],"{\n  \"fields\": {\n    \"project\": { \"key\": \"PROJ\" },\n    \"issuetype\": { \"name\": \"Bug\" },\n    \"summary\": \"Something is broken\",\n    \"description\": {\n      \"type\": \"doc\",\n      \"version\": 1,\n      \"content\": [\n        {\n          \"type\": \"paragraph\",\n          \"content\": [\n            { \"type\": \"text\", \"text\": \"Detailed bug report goes here.\" }\n          ]\n        }\n      ]\n    }\n  }\n}\n",[123564],{"type":17,"tag":6121,"props":123565,"children":123566},{"__ignoreMap":7},[123567],{"type":23,"value":123562},{"type":17,"tag":29,"props":123569,"children":123570},{},[123571,123573,123578,123580],{"type":23,"value":123572},"Atlassian's current Jira Cloud examples use ",{"type":17,"tag":48,"props":123574,"children":123575},{},[123576],{"type":23,"value":123577},"Atlassian Document Format",{"type":23,"value":123579}," for rich-text fields like description and comment bodies, so you should not assume plain strings everywhere. ",{"type":17,"tag":133,"props":123581,"children":123584},{"href":123582,"rel":123583},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/",[214],[123585],{"type":23,"value":123586},"Issues API group",{"type":17,"tag":239,"props":123588,"children":123590},{"id":123589},"get-an-issue",[123591],{"type":23,"value":123592},"Get an issue",{"type":17,"tag":29,"props":123594,"children":123595},{},[123596],{"type":23,"value":123597},"To retrieve a single issue:",{"type":17,"tag":6893,"props":123599,"children":123602},{"className":123600,"code":123601,"language":20901,"meta":23},[20899],"GET /rest/api/3/issue/{issueIdOrKey}\n",[123603],{"type":17,"tag":6121,"props":123604,"children":123605},{"__ignoreMap":7},[123606],{"type":23,"value":123601},{"type":17,"tag":29,"props":123608,"children":123609},{},[123610,123612,123617,123618,123624,123626],{"type":23,"value":123611},"You can also control the response with parameters like ",{"type":17,"tag":6121,"props":123613,"children":123615},{"className":123614},[],[123616],{"type":23,"value":39759},{"type":23,"value":34435},{"type":17,"tag":6121,"props":123619,"children":123621},{"className":123620},[],[123622],{"type":23,"value":123623},"expand",{"type":23,"value":123625}," to avoid over-fetching. ",{"type":17,"tag":133,"props":123627,"children":123630},{"href":123628,"rel":123629},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-get",[214],[123631],{"type":23,"value":123632},"Get issue",{"type":17,"tag":239,"props":123634,"children":123636},{"id":123635},"update-an-issue",[123637],{"type":23,"value":123638},"Update an issue",{"type":17,"tag":29,"props":123640,"children":123641},{},[123642],{"type":23,"value":123643},"To update an issue:",{"type":17,"tag":6893,"props":123645,"children":123648},{"className":123646,"code":123647,"language":20901,"meta":23},[20899],"PUT /rest/api/3/issue/{issueIdOrKey}\n",[123649],{"type":17,"tag":6121,"props":123650,"children":123651},{"__ignoreMap":7},[123652],{"type":23,"value":123647},{"type":17,"tag":29,"props":123654,"children":123655},{},[123656,123658],{"type":23,"value":123657},"You send only the fields you want to change. A typical example is updating summary, description, assignee, due date, or custom fields. ",{"type":17,"tag":133,"props":123659,"children":123662},{"href":123660,"rel":123661},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-put",[214],[123663],{"type":23,"value":123664},"Edit issue",{"type":17,"tag":239,"props":123666,"children":123668},{"id":123667},"delete-an-issue",[123669],{"type":23,"value":123670},"Delete an issue",{"type":17,"tag":29,"props":123672,"children":123673},{},[123674],{"type":23,"value":123675},"To delete an issue:",{"type":17,"tag":6893,"props":123677,"children":123680},{"className":123678,"code":123679,"language":20901,"meta":23},[20899],"DELETE /rest/api/3/issue/{issueIdOrKey}\n",[123681],{"type":17,"tag":6121,"props":123682,"children":123683},{"__ignoreMap":7},[123684],{"type":23,"value":123679},{"type":17,"tag":29,"props":123686,"children":123687},{},[123688,123690],{"type":23,"value":123689},"This should be used carefully, especially in customer-facing integrations, because deleting records can break auditability and downstream sync assumptions. ",{"type":17,"tag":133,"props":123691,"children":123694},{"href":123692,"rel":123693},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-delete",[214],[123695],{"type":23,"value":123696},"Delete issue",{"type":17,"tag":239,"props":123698,"children":123700},{"id":123699},"search-issues-with-jql",[123701],{"type":23,"value":123702},"Search issues with JQL",{"type":17,"tag":29,"props":123704,"children":123705},{},[123706],{"type":23,"value":123707},"For real integrations, direct issue CRUD is only part of the story. Search matters just as much.",{"type":17,"tag":29,"props":123709,"children":123710},{},[123711,123713,123718,123720],{"type":23,"value":123712},"Jira's query language, ",{"type":17,"tag":48,"props":123714,"children":123715},{},[123716],{"type":23,"value":123717},"JQL",{"type":23,"value":123719},", is how you find issues by project, status, assignee, priority, labels, custom fields, and date conditions. Atlassian documents the current search endpoints under the Jira REST API. ",{"type":17,"tag":133,"props":123721,"children":123724},{"href":123722,"rel":123723},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-search/",[214],[123725],{"type":23,"value":123726},"Issue search",{"type":17,"tag":29,"props":123728,"children":123729},{},[123730],{"type":23,"value":123731},"A typical search request looks like:",{"type":17,"tag":6893,"props":123733,"children":123736},{"className":123734,"code":123735,"language":20901,"meta":23},[20899],"GET /rest/api/3/search/jql?jql=project=PROJ AND status=\"In Progress\"\n",[123737],{"type":17,"tag":6121,"props":123738,"children":123739},{"__ignoreMap":7},[123740],{"type":23,"value":123735},{"type":17,"tag":29,"props":123742,"children":123743},{},[123744],{"type":23,"value":123745},"Or via POST when the query is larger or more structured:",{"type":17,"tag":6893,"props":123747,"children":123750},{"className":123748,"code":123749,"language":22503,"meta":7},[22501],"POST /rest/api/3/search/jql\n{\n  \"jql\": \"project = PROJ AND assignee = currentUser()\",\n  \"maxResults\": 50,\n  \"fields\": [\"summary\", \"status\", \"assignee\"]\n}\n",[123751],{"type":17,"tag":6121,"props":123752,"children":123753},{"__ignoreMap":7},[123754],{"type":23,"value":123749},{"type":17,"tag":29,"props":123756,"children":123757},{},[123758],{"type":23,"value":123759},"If your integration needs to mirror tickets into your product, generate dashboards, or filter subsets of work, JQL is a core part of the design.",{"type":17,"tag":239,"props":123761,"children":123763},{"id":123762},"add-and-read-comments",[123764],{"type":23,"value":123765},"Add and read comments",{"type":17,"tag":29,"props":123767,"children":123768},{},[123769],{"type":23,"value":123770},"Comments are another common integration surface, especially in support and collaboration workflows.",{"type":17,"tag":29,"props":123772,"children":123773},{},[123774],{"type":23,"value":123775},"To add a comment:",{"type":17,"tag":6893,"props":123777,"children":123780},{"className":123778,"code":123779,"language":20901,"meta":23},[20899],"POST /rest/api/3/issue/{issueIdOrKey}/comment\n",[123781],{"type":17,"tag":6121,"props":123782,"children":123783},{"__ignoreMap":7},[123784],{"type":23,"value":123779},{"type":17,"tag":29,"props":123786,"children":123787},{},[123788,123790],{"type":23,"value":123789},"Like descriptions, comment bodies use Atlassian Document Format. ",{"type":17,"tag":133,"props":123791,"children":123794},{"href":123792,"rel":123793},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comments/",[214],[123795],{"type":23,"value":123796},"Issue comments",{"type":17,"tag":29,"props":123798,"children":123799},{},[123800],{"type":23,"value":123801},"To list comments:",{"type":17,"tag":6893,"props":123803,"children":123806},{"className":123804,"code":123805,"language":20901,"meta":23},[20899],"GET /rest/api/3/issue/{issueIdOrKey}/comment\n",[123807],{"type":17,"tag":6121,"props":123808,"children":123809},{"__ignoreMap":7},[123810],{"type":23,"value":123805},{"type":17,"tag":239,"props":123812,"children":123814},{"id":123813},"read-transitions-and-move-issues-through-a-workflow",[123815],{"type":23,"value":123816},"Read transitions and move issues through a workflow",{"type":17,"tag":29,"props":123818,"children":123819},{},[123820],{"type":23,"value":123821},"Jira workflows are not just labels. They govern how work moves through statuses.",{"type":17,"tag":29,"props":123823,"children":123824},{},[123825],{"type":23,"value":123826},"To get the available transitions for an issue:",{"type":17,"tag":6893,"props":123828,"children":123831},{"className":123829,"code":123830,"language":20901,"meta":23},[20899],"GET /rest/api/3/issue/{issueIdOrKey}/transitions\n",[123832],{"type":17,"tag":6121,"props":123833,"children":123834},{"__ignoreMap":7},[123835],{"type":23,"value":123830},{"type":17,"tag":29,"props":123837,"children":123838},{},[123839],{"type":23,"value":123840},"To perform a transition:",{"type":17,"tag":6893,"props":123842,"children":123845},{"className":123843,"code":123844,"language":20901,"meta":23},[20899],"POST /rest/api/3/issue/{issueIdOrKey}/transitions\n",[123846],{"type":17,"tag":6121,"props":123847,"children":123848},{"__ignoreMap":7},[123849],{"type":23,"value":123844},{"type":17,"tag":29,"props":123851,"children":123852},{},[123853],{"type":23,"value":123854},"With a body like:",{"type":17,"tag":6893,"props":123856,"children":123859},{"className":123857,"code":123858,"language":22503,"meta":7},[22501],"{\n  \"transition\": {\n    \"id\": \"31\"\n  }\n}\n",[123860],{"type":17,"tag":6121,"props":123861,"children":123862},{"__ignoreMap":7},[123863],{"type":23,"value":123858},{"type":17,"tag":29,"props":123865,"children":123866},{},[123867,123869],{"type":23,"value":123868},"This is the API pattern you use when your product needs to move work to 'In Progress,' 'In Review,' or 'Done' based on events in your own system. ",{"type":17,"tag":133,"props":123870,"children":123873},{"href":123871,"rel":123872},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-transitions-get",[214],[123874],{"type":23,"value":123875},"Issue transitions",{"type":17,"tag":239,"props":123877,"children":123879},{"id":123878},"list-projects",[123880],{"type":23,"value":123881},"List projects",{"type":17,"tag":29,"props":123883,"children":123884},{},[123885],{"type":23,"value":123886},"Projects are another foundational object. To search or list projects:",{"type":17,"tag":6893,"props":123888,"children":123891},{"className":123889,"code":123890,"language":20901,"meta":23},[20899],"GET /rest/api/3/project/search\n",[123892],{"type":17,"tag":6121,"props":123893,"children":123894},{"__ignoreMap":7},[123895],{"type":23,"value":123890},{"type":17,"tag":29,"props":123897,"children":123898},{},[123899,123901],{"type":23,"value":123900},"This is useful for setup flows where you need customers to pick a Jira project before issue creation begins. ",{"type":17,"tag":133,"props":123902,"children":123905},{"href":123903,"rel":123904},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-projects/",[214],[123906],{"type":23,"value":123907},"Project API group",{"type":17,"tag":68,"props":123909,"children":123911},{"id":123910},"pagination-rate-limits-and-webhooks",[123912],{"type":23,"value":123913},"Pagination, rate limits, and webhooks",{"type":17,"tag":239,"props":123915,"children":123916},{"id":1860},[123917],{"type":23,"value":2409},{"type":17,"tag":29,"props":123919,"children":123920},{},[123921],{"type":23,"value":123922},"Jira REST responses commonly include:",{"type":17,"tag":80,"props":123924,"children":123925},{},[123926,123935,123944,123953],{"type":17,"tag":84,"props":123927,"children":123928},{},[123929],{"type":17,"tag":6121,"props":123930,"children":123932},{"className":123931},[],[123933],{"type":23,"value":123934},"startAt",{"type":17,"tag":84,"props":123936,"children":123937},{},[123938],{"type":17,"tag":6121,"props":123939,"children":123941},{"className":123940},[],[123942],{"type":23,"value":123943},"maxResults",{"type":17,"tag":84,"props":123945,"children":123946},{},[123947],{"type":17,"tag":6121,"props":123948,"children":123950},{"className":123949},[],[123951],{"type":23,"value":123952},"total",{"type":17,"tag":84,"props":123954,"children":123955},{},[123956],{"type":17,"tag":6121,"props":123957,"children":123959},{"className":123958},[],[123960],{"type":23,"value":123961},"isLast",{"type":17,"tag":29,"props":123963,"children":123964},{},[123965,123967,123972,123973,123978,123980],{"type":23,"value":123966},"You page through large result sets by adjusting ",{"type":17,"tag":6121,"props":123968,"children":123970},{"className":123969},[],[123971],{"type":23,"value":123934},{"type":23,"value":34435},{"type":17,"tag":6121,"props":123974,"children":123976},{"className":123975},[],[123977],{"type":23,"value":123943},{"type":23,"value":123979},". Atlassian documents this pagination model across Jira Cloud REST resources. ",{"type":17,"tag":133,"props":123981,"children":123984},{"href":123982,"rel":123983},"https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/#expansion",[214],[123985],{"type":23,"value":123986},"Expansion, pagination, and ordering",{"type":17,"tag":29,"props":123988,"children":123989},{},[123990,123992,123998],{"type":23,"value":123991},"For some newer search flows, Atlassian also uses ",{"type":17,"tag":6121,"props":123993,"children":123995},{"className":123994},[],[123996],{"type":23,"value":123997},"nextPageToken",{"type":23,"value":123999},", so you should design your client code to follow the response shape of the specific endpoint rather than assuming a single pagination style everywhere.",{"type":17,"tag":239,"props":124001,"children":124003},{"id":124002},"rate-limits",[124004],{"type":23,"value":3279},{"type":17,"tag":29,"props":124006,"children":124007},{},[124008,124010],{"type":23,"value":124009},"Jira Cloud enforces rate limits, and Atlassian documents both burst-based and resource-specific limits. ",{"type":17,"tag":133,"props":124011,"children":124014},{"href":124012,"rel":124013},"https://developer.atlassian.com/cloud/jira/platform/rate-limiting/",[214],[124015],{"type":23,"value":124016},"Rate limiting",{"type":17,"tag":29,"props":124018,"children":124019},{},[124020],{"type":23,"value":124021},"Important practical points:",{"type":17,"tag":80,"props":124023,"children":124024},{},[124025,124035,124046,124064],{"type":17,"tag":84,"props":124026,"children":124027},{},[124028,124033],{"type":17,"tag":6121,"props":124029,"children":124031},{"className":124030},[],[124032],{"type":23,"value":97917},{"type":23,"value":124034}," is the signal that you hit a limit",{"type":17,"tag":84,"props":124036,"children":124037},{},[124038,124039,124044],{"type":23,"value":6712},{"type":17,"tag":6121,"props":124040,"children":124042},{"className":124041},[],[124043],{"type":23,"value":97924},{"type":23,"value":124045}," header tells you how long to wait",{"type":17,"tag":84,"props":124047,"children":124048},{},[124049,124051,124057,124058],{"type":23,"value":124050},"Atlassian may also return headers like ",{"type":17,"tag":6121,"props":124052,"children":124054},{"className":124053},[],[124055],{"type":23,"value":124056},"X-RateLimit-Limit",{"type":23,"value":34435},{"type":17,"tag":6121,"props":124059,"children":124061},{"className":124060},[],[124062],{"type":23,"value":124063},"X-RateLimit-Remaining",{"type":17,"tag":84,"props":124065,"children":124066},{},[124067],{"type":23,"value":124068},"Some write-heavy patterns are additionally constrained on a per-issue basis",{"type":17,"tag":29,"props":124070,"children":124071},{},[124072],{"type":23,"value":124073},"For production integrations, you should:",{"type":17,"tag":80,"props":124075,"children":124076},{},[124077,124087,124092,124097,124102],{"type":17,"tag":84,"props":124078,"children":124079},{},[124080,124082],{"type":23,"value":124081},"respect ",{"type":17,"tag":6121,"props":124083,"children":124085},{"className":124084},[],[124086],{"type":23,"value":97924},{"type":17,"tag":84,"props":124088,"children":124089},{},[124090],{"type":23,"value":124091},"implement exponential backoff",{"type":17,"tag":84,"props":124093,"children":124094},{},[124095],{"type":23,"value":124096},"avoid bursty sync behavior",{"type":17,"tag":84,"props":124098,"children":124099},{},[124100],{"type":23,"value":124101},"reduce unnecessary polling",{"type":17,"tag":84,"props":124103,"children":124104},{},[124105],{"type":23,"value":124106},"batch work where appropriate",{"type":17,"tag":239,"props":124108,"children":124109},{"id":5002},[124110],{"type":23,"value":43896},{"type":17,"tag":29,"props":124112,"children":124113},{},[124114],{"type":23,"value":124115},"Webhooks are the right model when you need near real-time changes without constant polling.",{"type":17,"tag":29,"props":124117,"children":124118},{},[124119,124121],{"type":23,"value":124120},"Atlassian documents Jira Cloud webhooks for issue, comment, project, sprint, version, and related events. ",{"type":17,"tag":133,"props":124122,"children":124125},{"href":124123,"rel":124124},"https://developer.atlassian.com/cloud/jira/platform/webhooks/",[214],[124126],{"type":23,"value":43896},{"type":17,"tag":29,"props":124128,"children":124129},{},[124130],{"type":23,"value":124131},"Important webhook behavior:",{"type":17,"tag":80,"props":124133,"children":124134},{},[124135,124140,124145,124150,124155,124160],{"type":17,"tag":84,"props":124136,"children":124137},{},[124138],{"type":23,"value":124139},"webhook deliveries are sent to your HTTPS endpoint",{"type":17,"tag":84,"props":124141,"children":124142},{},[124143],{"type":23,"value":124144},"failures are retried",{"type":17,"tag":84,"props":124146,"children":124147},{},[124148],{"type":23,"value":124149},"duplicate deliveries are possible",{"type":17,"tag":84,"props":124151,"children":124152},{},[124153],{"type":23,"value":124154},"ordering is not guaranteed",{"type":17,"tag":84,"props":124156,"children":124157},{},[124158],{"type":23,"value":124159},"you should treat deliveries as idempotent",{"type":17,"tag":84,"props":124161,"children":124162},{},[124163],{"type":23,"value":124164},"you should secure your endpoint and validate origin/signature details where applicable",{"type":17,"tag":29,"props":124166,"children":124167},{},[124168],{"type":23,"value":124169},"For most SaaS products, the key reason to use webhooks is simple: they let you update your system when Jira changes, instead of repeatedly asking Jira whether anything changed.",{"type":17,"tag":68,"props":124171,"children":124173},{"id":124172},"where-jira-integrations-become-operationally-complex",[124174],{"type":23,"value":124175},"Where Jira integrations become operationally complex",{"type":17,"tag":29,"props":124177,"children":124178},{},[124179],{"type":23,"value":124180},"A direct Jira integration means you own:",{"type":17,"tag":80,"props":124182,"children":124183},{},[124184,124189,124194,124199,124209,124214,124219,124224,124229,124234,124239,124244],{"type":17,"tag":84,"props":124185,"children":124186},{},[124187],{"type":23,"value":124188},"API token vs OAuth architecture",{"type":17,"tag":84,"props":124190,"children":124191},{},[124192],{"type":23,"value":124193},"multi-tenant OAuth flows",{"type":17,"tag":84,"props":124195,"children":124196},{},[124197],{"type":23,"value":124198},"token refresh and secure storage",{"type":17,"tag":84,"props":124200,"children":124201},{},[124202,124204],{"type":23,"value":124203},"tenant discovery via ",{"type":17,"tag":6121,"props":124205,"children":124207},{"className":124206},[],[124208],{"type":23,"value":123417},{"type":17,"tag":84,"props":124210,"children":124211},{},[124212],{"type":23,"value":124213},"issue field mapping",{"type":17,"tag":84,"props":124215,"children":124216},{},[124217],{"type":23,"value":124218},"custom field handling",{"type":17,"tag":84,"props":124220,"children":124221},{},[124222],{"type":23,"value":124223},"JQL query construction",{"type":17,"tag":84,"props":124225,"children":124226},{},[124227],{"type":23,"value":124228},"pagination logic",{"type":17,"tag":84,"props":124230,"children":124231},{},[124232],{"type":23,"value":124233},"retry and throttling controls",{"type":17,"tag":84,"props":124235,"children":124236},{},[124237],{"type":23,"value":124238},"webhook registration and delivery handling",{"type":17,"tag":84,"props":124240,"children":124241},{},[124242],{"type":23,"value":124243},"workflow transition logic",{"type":17,"tag":84,"props":124245,"children":124246},{},[124247],{"type":23,"value":124248},"project and user sync behavior",{"type":17,"tag":29,"props":124250,"children":124251},{},[124252],{"type":23,"value":124253},"For a simple internal script, this is manageable.",{"type":17,"tag":29,"props":124255,"children":124256},{},[124257],{"type":23,"value":124258},"For a multi-tenant B2B SaaS product supporting many customer Jira instances, this becomes real infrastructure.",{"type":17,"tag":29,"props":124260,"children":124261},{},[124262],{"type":23,"value":124263},"The complexity tends to show up in three places:",{"type":17,"tag":29,"props":124265,"children":124266},{},[124267,124269,124274],{"type":23,"value":124268},"First, ",{"type":17,"tag":48,"props":124270,"children":124271},{},[124272],{"type":23,"value":124273},"field variability",{"type":23,"value":124275},". Jira issue types, custom fields, statuses, and workflow transitions differ across tenants.",{"type":17,"tag":29,"props":124277,"children":124278},{},[124279,124281,124286,124288,124294],{"type":23,"value":124280},"Second, ",{"type":17,"tag":48,"props":124282,"children":124283},{},[124284],{"type":23,"value":124285},"auth and tenancy",{"type":23,"value":124287},". OAuth in Atlassian Cloud is not just 'get a token and call ",{"type":17,"tag":6121,"props":124289,"children":124291},{"className":124290},[],[124292],{"type":23,"value":124293},"/me",{"type":23,"value":124295},".' You need to resolve accessible resources and persist tenant context.",{"type":17,"tag":29,"props":124297,"children":124298},{},[124299,124301,124306],{"type":23,"value":124300},"Third, ",{"type":17,"tag":48,"props":124302,"children":124303},{},[124304],{"type":23,"value":124305},"operational reliability",{"type":23,"value":124307},". Search, webhooks, retries, backfills, and partial failure handling all become part of the integration surface.",{"type":17,"tag":68,"props":124309,"children":124311},{"id":124310},"integrating-jira-via-unified",[124312],{"type":23,"value":124313},"Integrating Jira via Unified",{"type":17,"tag":29,"props":124315,"children":124316},{},[124317],{"type":23,"value":124318},"Unified gives you a normalized Jira path across Task, HRIS, Storage, Metadata, and Passthrough APIs.",{"type":17,"tag":29,"props":124320,"children":124321},{},[124322],{"type":23,"value":124323},"From the Jira integration details you shared, Unified supports objects such as:",{"type":17,"tag":80,"props":124325,"children":124326},{},[124327,124337,124348,124359,124370,124381,124392,124403],{"type":17,"tag":84,"props":124328,"children":124329},{},[124330,124335],{"type":17,"tag":6121,"props":124331,"children":124333},{"className":124332},[],[124334],{"type":23,"value":62676},{"type":23,"value":124336}," for Jira issues",{"type":17,"tag":84,"props":124338,"children":124339},{},[124340,124346],{"type":17,"tag":6121,"props":124341,"children":124343},{"className":124342},[],[124344],{"type":23,"value":124345},"task_project",{"type":23,"value":124347}," for Jira projects",{"type":17,"tag":84,"props":124349,"children":124350},{},[124351,124357],{"type":17,"tag":6121,"props":124352,"children":124354},{"className":124353},[],[124355],{"type":23,"value":124356},"task_comment",{"type":23,"value":124358}," for issue comments",{"type":17,"tag":84,"props":124360,"children":124361},{},[124362,124368],{"type":17,"tag":6121,"props":124363,"children":124365},{"className":124364},[],[124366],{"type":23,"value":124367},"task_change",{"type":23,"value":124369}," for issue changelog/change history",{"type":17,"tag":84,"props":124371,"children":124372},{},[124373,124379],{"type":17,"tag":6121,"props":124374,"children":124376},{"className":124375},[],[124377],{"type":23,"value":124378},"storage_file",{"type":23,"value":124380}," for attachments",{"type":17,"tag":84,"props":124382,"children":124383},{},[124384,124390],{"type":17,"tag":6121,"props":124385,"children":124387},{"className":124386},[],[124388],{"type":23,"value":124389},"hris_group",{"type":23,"value":124391}," for Jira groups",{"type":17,"tag":84,"props":124393,"children":124394},{},[124395,124401],{"type":17,"tag":6121,"props":124396,"children":124398},{"className":124397},[],[124399],{"type":23,"value":124400},"hris_employee",{"type":23,"value":124402}," for users",{"type":17,"tag":84,"props":124404,"children":124405},{},[124406,124412],{"type":17,"tag":6121,"props":124407,"children":124409},{"className":124408},[],[124410],{"type":23,"value":124411},"passthrough",{"type":23,"value":124413}," for unsupported Jira-specific endpoints",{"type":17,"tag":239,"props":124415,"children":124417},{"id":124416},"step-1-register-jira-oauth-for-unified",[124418],{"type":23,"value":124419},"Step 1: Register Jira OAuth for Unified",{"type":17,"tag":29,"props":124421,"children":124422},{},[124423],{"type":23,"value":124424},"When integrating Jira through Unified, set the callback URL to:",{"type":17,"tag":6893,"props":124426,"children":124428},{"className":124427,"code":71416,"language":20901,"meta":23},[20899],[124429],{"type":17,"tag":6121,"props":124430,"children":124431},{"__ignoreMap":7},[124432],{"type":23,"value":71416},{"type":17,"tag":29,"props":124434,"children":124435},{},[124436,124438,124443,124444],{"type":23,"value":124437},"Unified's Jira integration page also indicates OAuth 2.0 credentials should be registered through the Atlassian developer console. ",{"type":17,"tag":133,"props":124439,"children":124441},{"href":123281,"rel":124440},[214],[124442],{"type":23,"value":123285},{"type":23,"value":34435},{"type":17,"tag":133,"props":124445,"children":124448},{"href":124446,"rel":124447},"https://unified.to/blog/how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials",[214],[124449],{"type":23,"value":124450},"Unified guide to registering an Atlassian developer app",{"type":17,"tag":29,"props":124452,"children":124453},{},[124454],{"type":23,"value":124455},"Unified scope mappings for Jira, based on the integration details you shared, include examples like:",{"type":17,"tag":80,"props":124457,"children":124458},{},[124459,124475,124491,124507,124523,124538,124554],{"type":17,"tag":84,"props":124460,"children":124461},{},[124462,124468,124469],{"type":17,"tag":6121,"props":124463,"children":124465},{"className":124464},[],[124466],{"type":23,"value":124467},"task_task_read",{"type":23,"value":98082},{"type":17,"tag":6121,"props":124470,"children":124472},{"className":124471},[],[124473],{"type":23,"value":124474},"offline_access, read:jira-work, read:jira-user",{"type":17,"tag":84,"props":124476,"children":124477},{},[124478,124484,124485],{"type":17,"tag":6121,"props":124479,"children":124481},{"className":124480},[],[124482],{"type":23,"value":124483},"task_task_write",{"type":23,"value":98082},{"type":17,"tag":6121,"props":124486,"children":124488},{"className":124487},[],[124489],{"type":23,"value":124490},"offline_access, read:jira-work, read:jira-user, write:jira-work",{"type":17,"tag":84,"props":124492,"children":124493},{},[124494,124500,124501],{"type":17,"tag":6121,"props":124495,"children":124497},{"className":124496},[],[124498],{"type":23,"value":124499},"task_project_read",{"type":23,"value":98082},{"type":17,"tag":6121,"props":124502,"children":124504},{"className":124503},[],[124505],{"type":23,"value":124506},"offline_access, read:jira-user, read:jira-work",{"type":17,"tag":84,"props":124508,"children":124509},{},[124510,124516,124517],{"type":17,"tag":6121,"props":124511,"children":124513},{"className":124512},[],[124514],{"type":23,"value":124515},"task_project_write",{"type":23,"value":98082},{"type":17,"tag":6121,"props":124518,"children":124520},{"className":124519},[],[124521],{"type":23,"value":124522},"offline_access, read:jira-user, manage:jira-configuration, manage:jira-project, write:project:jira",{"type":17,"tag":84,"props":124524,"children":124525},{},[124526,124532,124533],{"type":17,"tag":6121,"props":124527,"children":124529},{"className":124528},[],[124530],{"type":23,"value":124531},"task_comment_read",{"type":23,"value":98082},{"type":17,"tag":6121,"props":124534,"children":124536},{"className":124535},[],[124537],{"type":23,"value":124506},{"type":17,"tag":84,"props":124539,"children":124540},{},[124541,124547,124548],{"type":17,"tag":6121,"props":124542,"children":124544},{"className":124543},[],[124545],{"type":23,"value":124546},"task_comment_write",{"type":23,"value":98082},{"type":17,"tag":6121,"props":124549,"children":124551},{"className":124550},[],[124552],{"type":23,"value":124553},"offline_access, read:jira-user, write:jira-work",{"type":17,"tag":84,"props":124555,"children":124556},{},[124557,124563,124564],{"type":17,"tag":6121,"props":124558,"children":124560},{"className":124559},[],[124561],{"type":23,"value":124562},"webhook",{"type":23,"value":98082},{"type":17,"tag":6121,"props":124565,"children":124567},{"className":124566},[],[124568],{"type":23,"value":124569},"offline_access, read:jira-work, manage:jira-webhook",{"type":17,"tag":29,"props":124571,"children":124572},{},[124573],{"type":23,"value":124574},"That gives you a much cleaner way to request what you need without hand-building Atlassian scope combinations from scratch.",{"type":17,"tag":239,"props":124576,"children":124578},{"id":124577},"step-2-authorize-a-jira-connection",[124579],{"type":23,"value":124580},"Step 2: Authorize a Jira connection",{"type":17,"tag":29,"props":124582,"children":124583},{},[124584,124586,124591],{"type":23,"value":124585},"With Unified, the end result of authorization is a ",{"type":17,"tag":6121,"props":124587,"children":124589},{"className":124588},[],[124590],{"type":23,"value":25037},{"type":23,"value":124592},". That connection represents one customer's Jira account and is what you use in future API calls.",{"type":17,"tag":29,"props":124594,"children":124595},{},[124596],{"type":23,"value":124597},"This is materially simpler than managing raw tenant auth and provider-specific request setup yourself.",{"type":17,"tag":239,"props":124599,"children":124601},{"id":124600},"step-3-use-unifieds-normalized-task-apis",[124602],{"type":23,"value":124603},"Step 3: Use Unified's normalized task APIs",{"type":17,"tag":29,"props":124605,"children":124606},{},[124607],{"type":23,"value":122732},{"type":17,"tag":6893,"props":124609,"children":124611},{"className":124610,"code":122736,"language":20901,"meta":23},[20899],[124612],{"type":17,"tag":6121,"props":124613,"children":124614},{"__ignoreMap":7},[124615],{"type":23,"value":122736},{"type":17,"tag":29,"props":124617,"children":124618},{},[124619],{"type":23,"value":124620},"List tasks:",{"type":17,"tag":6893,"props":124622,"children":124625},{"className":124623,"code":124624,"language":20901,"meta":23},[20899],"GET /task/{connection_id}/task\n",[124626],{"type":17,"tag":6121,"props":124627,"children":124628},{"__ignoreMap":7},[124629],{"type":23,"value":124624},{"type":17,"tag":29,"props":124631,"children":124632},{},[124633],{"type":23,"value":124634},"Get a task:",{"type":17,"tag":6893,"props":124636,"children":124639},{"className":124637,"code":124638,"language":20901,"meta":23},[20899],"GET /task/{connection_id}/task/{id}\n",[124640],{"type":17,"tag":6121,"props":124641,"children":124642},{"__ignoreMap":7},[124643],{"type":23,"value":124638},{"type":17,"tag":29,"props":124645,"children":124646},{},[124647],{"type":23,"value":122182},{"type":17,"tag":6893,"props":124649,"children":124651},{"className":124650,"code":122763,"language":20901,"meta":23},[20899],[124652],{"type":17,"tag":6121,"props":124653,"children":124654},{"__ignoreMap":7},[124655],{"type":23,"value":122763},{"type":17,"tag":29,"props":124657,"children":124658},{},[124659],{"type":23,"value":122222},{"type":17,"tag":6893,"props":124661,"children":124664},{"className":124662,"code":124663,"language":20901,"meta":23},[20899],"PUT /task/{connection_id}/task/{id}\n",[124665],{"type":17,"tag":6121,"props":124666,"children":124667},{"__ignoreMap":7},[124668],{"type":23,"value":124663},{"type":17,"tag":29,"props":124670,"children":124671},{},[124672],{"type":23,"value":124673},"Remove a task:",{"type":17,"tag":6893,"props":124675,"children":124678},{"className":124676,"code":124677,"language":20901,"meta":23},[20899],"DELETE /task/{connection_id}/task/{id}\n",[124679],{"type":17,"tag":6121,"props":124680,"children":124681},{"__ignoreMap":7},[124682],{"type":23,"value":124677},{"type":17,"tag":29,"props":124684,"children":124685},{},[124686],{"type":23,"value":124687},"From the coverage you shared, Unified's Jira task object includes readable fields like:",{"type":17,"tag":80,"props":124689,"children":124690},{},[124691,124699,124707,124716,124724,124732,124740,124749,124758,124767,124775],{"type":17,"tag":84,"props":124692,"children":124693},{},[124694],{"type":17,"tag":6121,"props":124695,"children":124697},{"className":124696},[],[124698],{"type":23,"value":18766},{"type":17,"tag":84,"props":124700,"children":124701},{},[124702],{"type":17,"tag":6121,"props":124703,"children":124705},{"className":124704},[],[124706],{"type":23,"value":18781},{"type":17,"tag":84,"props":124708,"children":124709},{},[124710],{"type":17,"tag":6121,"props":124711,"children":124713},{"className":124712},[],[124714],{"type":23,"value":124715},"project_id",{"type":17,"tag":84,"props":124717,"children":124718},{},[124719],{"type":17,"tag":6121,"props":124720,"children":124722},{"className":124721},[],[124723],{"type":23,"value":19949},{"type":17,"tag":84,"props":124725,"children":124726},{},[124727],{"type":17,"tag":6121,"props":124728,"children":124730},{"className":124729},[],[124731],{"type":23,"value":24704},{"type":17,"tag":84,"props":124733,"children":124734},{},[124735],{"type":17,"tag":6121,"props":124736,"children":124738},{"className":124737},[],[124739],{"type":23,"value":62478},{"type":17,"tag":84,"props":124741,"children":124742},{},[124743],{"type":17,"tag":6121,"props":124744,"children":124746},{"className":124745},[],[124747],{"type":23,"value":124748},"assigned_user_ids",{"type":17,"tag":84,"props":124750,"children":124751},{},[124752],{"type":17,"tag":6121,"props":124753,"children":124755},{"className":124754},[],[124756],{"type":23,"value":124757},"creator_user_id",{"type":17,"tag":84,"props":124759,"children":124760},{},[124761],{"type":17,"tag":6121,"props":124762,"children":124764},{"className":124763},[],[124765],{"type":23,"value":124766},"due_at",{"type":17,"tag":84,"props":124768,"children":124769},{},[124770],{"type":17,"tag":6121,"props":124771,"children":124773},{"className":124772},[],[124774],{"type":23,"value":25337},{"type":17,"tag":84,"props":124776,"children":124777},{},[124778],{"type":17,"tag":6121,"props":124779,"children":124781},{"className":124780},[],[124782],{"type":23,"value":124783},"url",{"type":17,"tag":29,"props":124785,"children":124786},{},[124787],{"type":23,"value":124788},"And writable fields include practical ones such as:",{"type":17,"tag":80,"props":124790,"children":124791},{},[124792,124800,124808,124816,124825,124833,124841,124849],{"type":17,"tag":84,"props":124793,"children":124794},{},[124795],{"type":17,"tag":6121,"props":124796,"children":124798},{"className":124797},[],[124799],{"type":23,"value":18781},{"type":17,"tag":84,"props":124801,"children":124802},{},[124803],{"type":17,"tag":6121,"props":124804,"children":124806},{"className":124805},[],[124807],{"type":23,"value":124715},{"type":17,"tag":84,"props":124809,"children":124810},{},[124811],{"type":17,"tag":6121,"props":124812,"children":124814},{"className":124813},[],[124815],{"type":23,"value":124748},{"type":17,"tag":84,"props":124817,"children":124818},{},[124819],{"type":17,"tag":6121,"props":124820,"children":124822},{"className":124821},[],[124823],{"type":23,"value":124824},"completed_at",{"type":17,"tag":84,"props":124826,"children":124827},{},[124828],{"type":17,"tag":6121,"props":124829,"children":124831},{"className":124830},[],[124832],{"type":23,"value":124766},{"type":17,"tag":84,"props":124834,"children":124835},{},[124836],{"type":17,"tag":6121,"props":124837,"children":124839},{"className":124838},[],[124840],{"type":23,"value":6698},{"type":17,"tag":84,"props":124842,"children":124843},{},[124844],{"type":17,"tag":6121,"props":124845,"children":124847},{"className":124846},[],[124848],{"type":23,"value":15863},{"type":17,"tag":84,"props":124850,"children":124851},{},[124852],{"type":17,"tag":6121,"props":124853,"children":124855},{"className":124854},[],[124856],{"type":23,"value":62478},{"type":17,"tag":29,"props":124858,"children":124859},{},[124860],{"type":23,"value":124861},"That means the common issue creation and update path can be handled through one normalized object instead of raw Jira field payloads.",{"type":17,"tag":239,"props":124863,"children":124865},{"id":124864},"step-4-use-unified-comments-users-groups-and-change-history",[124866],{"type":23,"value":124867},"Step 4: Use Unified comments, users, groups, and change history",{"type":17,"tag":29,"props":124869,"children":124870},{},[124871],{"type":23,"value":124872},"Unified's Jira coverage also gives you:",{"type":17,"tag":80,"props":124874,"children":124875},{},[124876,124885,124895,124905,124914],{"type":17,"tag":84,"props":124877,"children":124878},{},[124879,124884],{"type":17,"tag":6121,"props":124880,"children":124882},{"className":124881},[],[124883],{"type":23,"value":124356},{"type":23,"value":124358},{"type":17,"tag":84,"props":124886,"children":124887},{},[124888,124893],{"type":17,"tag":6121,"props":124889,"children":124891},{"className":124890},[],[124892],{"type":23,"value":124367},{"type":23,"value":124894}," for issue changelog/history",{"type":17,"tag":84,"props":124896,"children":124897},{},[124898,124903],{"type":17,"tag":6121,"props":124899,"children":124901},{"className":124900},[],[124902],{"type":23,"value":124400},{"type":23,"value":124904}," for Jira users",{"type":17,"tag":84,"props":124906,"children":124907},{},[124908,124913],{"type":17,"tag":6121,"props":124909,"children":124911},{"className":124910},[],[124912],{"type":23,"value":124389},{"type":23,"value":124391},{"type":17,"tag":84,"props":124915,"children":124916},{},[124917,124922],{"type":17,"tag":6121,"props":124918,"children":124920},{"className":124919},[],[124921],{"type":23,"value":124378},{"type":23,"value":124380},{"type":17,"tag":29,"props":124924,"children":124925},{},[124926],{"type":23,"value":124927},"That is useful when your app needs not just issue creation, but also:",{"type":17,"tag":80,"props":124929,"children":124930},{},[124931,124936,124941,124946,124951],{"type":17,"tag":84,"props":124932,"children":124933},{},[124934],{"type":23,"value":124935},"comment sync",{"type":17,"tag":84,"props":124937,"children":124938},{},[124939],{"type":23,"value":124940},"user assignment flows",{"type":17,"tag":84,"props":124942,"children":124943},{},[124944],{"type":23,"value":124945},"audit/change tracking",{"type":17,"tag":84,"props":124947,"children":124948},{},[124949],{"type":23,"value":124950},"attachment retrieval",{"type":17,"tag":84,"props":124952,"children":124953},{},[124954],{"type":23,"value":124955},"group-aware routing or permissions logic",{"type":17,"tag":239,"props":124957,"children":124959},{"id":124958},"step-5-use-unified-webhooks",[124960],{"type":23,"value":124961},"Step 5: Use Unified webhooks",{"type":17,"tag":29,"props":124963,"children":124964},{},[124965],{"type":23,"value":124966},"From the Jira integration details you shared:",{"type":17,"tag":80,"props":124968,"children":124969},{},[124970,124984,124997],{"type":17,"tag":84,"props":124971,"children":124972},{},[124973,124978,124979],{"type":17,"tag":6121,"props":124974,"children":124976},{"className":124975},[],[124977],{"type":23,"value":62676},{"type":23,"value":115583},{"type":17,"tag":48,"props":124980,"children":124981},{},[124982],{"type":23,"value":124983},"virtual and native webhooks",{"type":17,"tag":84,"props":124985,"children":124986},{},[124987,124992,124993],{"type":17,"tag":6121,"props":124988,"children":124990},{"className":124989},[],[124991],{"type":23,"value":124356},{"type":23,"value":115583},{"type":17,"tag":48,"props":124994,"children":124995},{},[124996],{"type":23,"value":107852},{"type":17,"tag":84,"props":124998,"children":124999},{},[125000],{"type":23,"value":125001},"other objects vary in support",{"type":17,"tag":29,"props":125003,"children":125004},{},[125005],{"type":23,"value":125006},"This matters because it means you can receive issue and comment updates without building the raw Jira webhook management flow yourself.",{"type":17,"tag":29,"props":125008,"children":125009},{},[125010],{"type":23,"value":125011},"Unified's virtual webhook model also gives you fallback coverage in cases where native event behavior is limited or inconsistent across providers.",{"type":17,"tag":239,"props":125013,"children":125015},{"id":125014},"step-6-use-passthrough-for-jira-specific-gaps",[125016],{"type":23,"value":125017},"Step 6: Use passthrough for Jira-specific gaps",{"type":17,"tag":29,"props":125019,"children":125020},{},[125021],{"type":23,"value":125022},"Jira is broad. Boards, sprints, agile endpoints, specialized metadata, or tenant-specific features may not always fit perfectly into normalized models.",{"type":17,"tag":29,"props":125024,"children":125025},{},[125026],{"type":23,"value":125027},"That is why passthrough matters.",{"type":17,"tag":29,"props":125029,"children":125030},{},[125031],{"type":23,"value":125032},"Unified's Jira integration supports passthrough methods:",{"type":17,"tag":80,"props":125034,"children":125035},{},[125036,125044,125052,125060],{"type":17,"tag":84,"props":125037,"children":125038},{},[125039],{"type":17,"tag":6121,"props":125040,"children":125042},{"className":125041},[],[125043],{"type":23,"value":122909},{"type":17,"tag":84,"props":125045,"children":125046},{},[125047],{"type":17,"tag":6121,"props":125048,"children":125050},{"className":125049},[],[125051],{"type":23,"value":122914},{"type":17,"tag":84,"props":125053,"children":125054},{},[125055],{"type":17,"tag":6121,"props":125056,"children":125058},{"className":125057},[],[125059],{"type":23,"value":110111},{"type":17,"tag":84,"props":125061,"children":125062},{},[125063],{"type":17,"tag":6121,"props":125064,"children":125066},{"className":125065},[],[125067],{"type":23,"value":122923},{"type":17,"tag":29,"props":125069,"children":125070},{},[125071],{"type":23,"value":125072},"So if you need a Jira-specific endpoint not yet normalized, you can still call it through Unified while keeping the same auth and connection model.",{"type":17,"tag":68,"props":125074,"children":125075},{"id":72006},[125076],{"type":23,"value":72009},{"type":17,"tag":239,"props":125078,"children":125080},{"id":125079},"build-directly-with-jira-if",[125081],{"type":23,"value":125082},"Build directly with Jira if:",{"type":17,"tag":80,"props":125084,"children":125085},{},[125086,125091,125096,125101],{"type":17,"tag":84,"props":125087,"children":125088},{},[125089],{"type":23,"value":125090},"Jira is a strategic core integration for your product",{"type":17,"tag":84,"props":125092,"children":125093},{},[125094],{"type":23,"value":125095},"you need deep Jira-specific behavior, including custom field logic and workflow nuance",{"type":17,"tag":84,"props":125097,"children":125098},{},[125099],{"type":23,"value":125100},"you need direct control over Atlassian auth, tenant routing, and webhook handling",{"type":17,"tag":84,"props":125102,"children":125103},{},[125104],{"type":23,"value":125105},"you are comfortable owning Jira's operational complexity long term",{"type":17,"tag":239,"props":125107,"children":125108},{"id":72041},[125109],{"type":23,"value":98574},{"type":17,"tag":80,"props":125111,"children":125112},{},[125113,125118,125123,125128,125133],{"type":17,"tag":84,"props":125114,"children":125115},{},[125116],{"type":23,"value":125117},"Jira is one of several task or work-management integrations on your roadmap",{"type":17,"tag":84,"props":125119,"children":125120},{},[125121],{"type":23,"value":125122},"your core use cases are issues, projects, comments, users, groups, and attachments",{"type":17,"tag":84,"props":125124,"children":125125},{},[125126],{"type":23,"value":125127},"you want normalized APIs and simpler auth flows",{"type":17,"tag":84,"props":125129,"children":125130},{},[125131],{"type":23,"value":125132},"you want built-in webhook coverage where possible",{"type":17,"tag":84,"props":125134,"children":125135},{},[125136],{"type":23,"value":125137},"you still want passthrough for provider-specific gaps",{"type":17,"tag":68,"props":125139,"children":125140},{"id":1552},[125141],{"type":23,"value":1555},{"type":17,"tag":29,"props":125143,"children":125144},{},[125145],{"type":23,"value":125146},"A Jira API integration looks straightforward at the first-request level.",{"type":17,"tag":29,"props":125148,"children":125149},{},[125150],{"type":23,"value":125151},"The real complexity shows up in:",{"type":17,"tag":80,"props":125153,"children":125154},{},[125155,125160,125165,125170,125175,125180],{"type":17,"tag":84,"props":125156,"children":125157},{},[125158],{"type":23,"value":125159},"choosing the right auth model",{"type":17,"tag":84,"props":125161,"children":125162},{},[125163],{"type":23,"value":125164},"handling tenant resolution correctly",{"type":17,"tag":84,"props":125166,"children":125167},{},[125168],{"type":23,"value":125169},"working with Jira's field and workflow variability",{"type":17,"tag":84,"props":125171,"children":125172},{},[125173],{"type":23,"value":125174},"using search and pagination efficiently",{"type":17,"tag":84,"props":125176,"children":125177},{},[125178],{"type":23,"value":125179},"dealing with rate limits",{"type":17,"tag":84,"props":125181,"children":125182},{},[125183],{"type":23,"value":125184},"keeping data in sync through webhooks",{"type":17,"tag":29,"props":125186,"children":125187},{},[125188],{"type":23,"value":125189},"If Jira is central to your product, building directly can make sense. You get maximum flexibility and full access to the platform's native model.",{"type":17,"tag":29,"props":125191,"children":125192},{},[125193],{"type":23,"value":125194},"If Jira is one integration among many, a normalized integration layer can reduce engineering drag, shorten time to launch, and still leave you an escape hatch for Jira-specific endpoints when you need them.",{"type":17,"tag":29,"props":125196,"children":125197},{},[125198],{"type":17,"tag":133,"props":125199,"children":125201},{"href":1612,"rel":125200},[214],[125202],{"type":23,"value":1616},{"type":17,"tag":29,"props":125204,"children":125205},{},[125206],{"type":17,"tag":133,"props":125207,"children":125209},{"href":1623,"rel":125208},[214],[125210],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":125212},[125213,125219,125229,125234,125235,125243,125247],{"id":123160,"depth":1629,"text":123163,"children":125214},[125215,125216,125217,125218],{"id":123166,"depth":1635,"text":123169},{"id":123270,"depth":1635,"text":123273},{"id":123403,"depth":1635,"text":123406},{"id":123460,"depth":1635,"text":123463},{"id":123530,"depth":1629,"text":123533,"children":125220},[125221,125222,125223,125224,125225,125226,125227,125228],{"id":123536,"depth":1635,"text":123539},{"id":123589,"depth":1635,"text":123592},{"id":123635,"depth":1635,"text":123638},{"id":123667,"depth":1635,"text":123670},{"id":123699,"depth":1635,"text":123702},{"id":123762,"depth":1635,"text":123765},{"id":123813,"depth":1635,"text":123816},{"id":123878,"depth":1635,"text":123881},{"id":123910,"depth":1629,"text":123913,"children":125230},[125231,125232,125233],{"id":1860,"depth":1635,"text":2409},{"id":124002,"depth":1635,"text":3279},{"id":5002,"depth":1635,"text":43896},{"id":124172,"depth":1629,"text":124175},{"id":124310,"depth":1629,"text":124313,"children":125236},[125237,125238,125239,125240,125241,125242],{"id":124416,"depth":1635,"text":124419},{"id":124577,"depth":1635,"text":124580},{"id":124600,"depth":1635,"text":124603},{"id":124864,"depth":1635,"text":124867},{"id":124958,"depth":1635,"text":124961},{"id":125014,"depth":1635,"text":125017},{"id":72006,"depth":1629,"text":72009,"children":125244},[125245,125246],{"id":125079,"depth":1635,"text":125082},{"id":72041,"depth":1635,"text":98574},{"id":1552,"depth":1629,"text":1555},"content:blog:how_to_integrate_with_atlassian_jira.md","blog/how_to_integrate_with_atlassian_jira.md","blog/how_to_integrate_with_atlassian_jira",{"_path":125252,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":125253,"description":125254,"img":125255,"date":121707,"tag":12,"body":125256,"_type":1677,"_id":127052,"_source":1679,"_file":127053,"_stem":127054,"_extension":1682},"/blog/how_to_integrate_with_shopify","How to Integrate with Shopify","A Shopify API integration lets your product sync products, orders, customers, inventory, collections, and store data with Shopify merchants. For SaaS companies...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with_shopify-icon.png",{"type":14,"children":125257,"toc":127017},[125258,125263,125266,125273,125284,125314,125318,125339,125345,125351,125370,125381,125386,125404,125410,125415,125420,125453,125465,125476,125482,125487,125514,125526,125532,125537,125548,125553,125562,125566,125647,125684,125690,125695,125704,125709,125736,125741,125787,125798,125804,125822,125826,125849,125861,125867,125872,125884,125889,125900,125928,125932,125943,125948,125957,125977,125981,125992,125997,126006,126010,126045,126050,126075,126081,126108,126134,126140,126144,126149,126154,126216,126228,126232,126242,126247,126268,126273,126294,126349,126353,126365,126370,126393,126405,126424,126430,126435,126488,126493,126498,126504,126509,126530,126536,126541,126549,126554,126575,126587,126593,126598,126701,126706,126712,126717,126726,126731,126740,126744,126753,126758,126767,126772,126781,126785,126790,126823,126828,126834,126839,126850,126855,126874,126879,126883,126889,126912,126916,126944,126948,126953,126958,126991,126996,127001,127009],{"type":17,"tag":18,"props":125259,"children":125261},{"id":125260},"how-to-integrate-with-shopify",[125262],{"type":23,"value":125253},{"type":17,"tag":25,"props":125264,"children":125265},{},[],{"type":17,"tag":29,"props":125267,"children":125268},{},[125269],{"type":17,"tag":33,"props":125270,"children":125271},{},[125272],{"type":23,"value":121725},{"type":17,"tag":29,"props":125274,"children":125275},{},[125276,125277,125282],{"type":23,"value":9619},{"type":17,"tag":48,"props":125278,"children":125279},{},[125280],{"type":23,"value":125281},"Shopify API integration",{"type":23,"value":125283}," lets your product sync products, orders, customers, inventory, collections, and store data with Shopify merchants. For SaaS companies selling into ecommerce, that often means importing orders, updating inventory, creating draft orders, or pushing product data into downstream systems.",{"type":17,"tag":29,"props":125285,"children":125286},{},[125287,125289,125295,125297,125301,125303,125307,125309,125313],{"type":23,"value":125288},"But a production-grade Shopify integration involves more than getting an API token and calling ",{"type":17,"tag":6121,"props":125290,"children":125292},{"className":125291},[],[125293],{"type":23,"value":125294},"/products",{"type":23,"value":125296},". You need to choose the right app distribution model, implement ",{"type":17,"tag":133,"props":125298,"children":125299},{"href":779},[125300],{"type":23,"value":782},{"type":23,"value":125302}," correctly, use the current Admin API strategy, design around ",{"type":17,"tag":133,"props":125304,"children":125305},{"href":135},[125306],{"type":23,"value":138},{"type":23,"value":125308},", and keep data in sync with ",{"type":17,"tag":133,"props":125310,"children":125311},{"href":4999},[125312],{"type":23,"value":5002},{"type":23,"value":121761},{"type":17,"tag":29,"props":125315,"children":125316},{},[125317],{"type":23,"value":70164},{"type":17,"tag":6154,"props":125319,"children":125320},{},[125321,125326,125330,125335],{"type":17,"tag":84,"props":125322,"children":125323},{},[125324],{"type":23,"value":125325},"How to integrate directly with the Shopify API",{"type":17,"tag":84,"props":125327,"children":125328},{},[125329],{"type":23,"value":70177},{"type":17,"tag":84,"props":125331,"children":125332},{},[125333],{"type":23,"value":125334},"How to integrate Shopify using Unified's Commerce and Accounting APIs",{"type":17,"tag":84,"props":125336,"children":125337},{},[125338],{"type":23,"value":70187},{"type":17,"tag":68,"props":125340,"children":125342},{"id":125341},"direct-shopify-api-integration",[125343],{"type":23,"value":125344},"Direct Shopify API integration",{"type":17,"tag":239,"props":125346,"children":125348},{"id":125347},"step-1-use-the-graphql-admin-api-not-the-rest-admin-api",[125349],{"type":23,"value":125350},"Step 1: Use the GraphQL Admin API, not the REST Admin API",{"type":17,"tag":29,"props":125352,"children":125353},{},[125354,125356,125361,125363,125368],{"type":23,"value":125355},"For new Shopify integrations, use the ",{"type":17,"tag":48,"props":125357,"children":125358},{},[125359],{"type":23,"value":125360},"GraphQL Admin API",{"type":23,"value":125362},". Shopify states that the ",{"type":17,"tag":48,"props":125364,"children":125365},{},[125366],{"type":23,"value":125367},"REST Admin API became legacy on October 1, 2024",{"type":23,"value":125369},", and instructs developers to build all new apps and integrations using GraphQL. Shopify also notes that new features ship in GraphQL first, while REST is in maintenance mode.",{"type":17,"tag":29,"props":125371,"children":125372},{},[125373,125374],{"type":23,"value":1609},{"type":17,"tag":133,"props":125375,"children":125378},{"href":125376,"rel":125377},"https://shopify.dev/docs/apps/build/graphql/migrate/new-product-model",[214],[125379],{"type":23,"value":125380},"About REST to GraphQL migration",{"type":17,"tag":29,"props":125382,"children":125383},{},[125384],{"type":23,"value":125385},"This matters for architecture right away:",{"type":17,"tag":80,"props":125387,"children":125388},{},[125389,125394,125399],{"type":17,"tag":84,"props":125390,"children":125391},{},[125392],{"type":23,"value":125393},"GraphQL is the primary API for new Shopify work",{"type":17,"tag":84,"props":125395,"children":125396},{},[125397],{"type":23,"value":125398},"REST can still matter for legacy integrations or passthrough edge cases",{"type":17,"tag":84,"props":125400,"children":125401},{},[125402],{"type":23,"value":125403},"Bulk operations, pagination, and rate limits should be designed with GraphQL in mind",{"type":17,"tag":239,"props":125405,"children":125407},{"id":125406},"step-2-choose-the-right-app-distribution-method",[125408],{"type":23,"value":125409},"Step 2: Choose the right app distribution method",{"type":17,"tag":29,"props":125411,"children":125412},{},[125413],{"type":23,"value":125414},"Shopify requires you to choose an app distribution type when you create the app, and that choice cannot be changed later.",{"type":17,"tag":29,"props":125416,"children":125417},{},[125418],{"type":23,"value":125419},"The important distinction for SaaS teams is:",{"type":17,"tag":80,"props":125421,"children":125422},{},[125423,125433,125443],{"type":17,"tag":84,"props":125424,"children":125425},{},[125426,125431],{"type":17,"tag":48,"props":125427,"children":125428},{},[125429],{"type":23,"value":125430},"Public apps",{"type":23,"value":125432}," are for multi-merchant SaaS products and can be installed by many merchants",{"type":17,"tag":84,"props":125434,"children":125435},{},[125436,125441],{"type":17,"tag":48,"props":125437,"children":125438},{},[125439],{"type":23,"value":125440},"Custom apps",{"type":23,"value":125442}," are for a single store or a limited Shopify Plus organization",{"type":17,"tag":84,"props":125444,"children":125445},{},[125446,125451],{"type":17,"tag":48,"props":125447,"children":125448},{},[125449],{"type":23,"value":125450},"Admin-created custom apps",{"type":23,"value":125452}," are created directly inside one merchant's admin and are not the right fit for a multi-merchant SaaS product",{"type":17,"tag":29,"props":125454,"children":125455},{},[125456,125458,125463],{"type":23,"value":125457},"If your product will be installed by many Shopify merchants, you want a ",{"type":17,"tag":48,"props":125459,"children":125460},{},[125461],{"type":23,"value":125462},"public app",{"type":23,"value":125464},". Shopify's app distribution docs explain these tradeoffs clearly.",{"type":17,"tag":29,"props":125466,"children":125467},{},[125468,125469],{"type":23,"value":1609},{"type":17,"tag":133,"props":125470,"children":125473},{"href":125471,"rel":125472},"https://shopify.dev/docs/apps/distribution",[214],[125474],{"type":23,"value":125475},"About app distribution",{"type":17,"tag":239,"props":125477,"children":125479},{"id":125478},"step-3-create-the-app-and-configure-allowed-redirect-uris",[125480],{"type":23,"value":125481},"Step 3: Create the app and configure allowed redirect URIs",{"type":17,"tag":29,"props":125483,"children":125484},{},[125485],{"type":23,"value":125486},"You can create the app in the Shopify Dev Dashboard or with the Shopify CLI. Shopify documents both approaches, and the app configuration includes:",{"type":17,"tag":80,"props":125488,"children":125489},{},[125490,125495,125500,125504,125509],{"type":17,"tag":84,"props":125491,"children":125492},{},[125493],{"type":23,"value":125494},"App URL",{"type":17,"tag":84,"props":125496,"children":125497},{},[125498],{"type":23,"value":125499},"Allowed redirection URLs",{"type":17,"tag":84,"props":125501,"children":125502},{},[125503],{"type":23,"value":6040},{"type":17,"tag":84,"props":125505,"children":125506},{},[125507],{"type":23,"value":125508},"Client secret",{"type":17,"tag":84,"props":125510,"children":125511},{},[125512],{"type":23,"value":125513},"Requested scopes",{"type":17,"tag":29,"props":125515,"children":125516},{},[125517,125519],{"type":23,"value":125518},"The redirect URIs used during OAuth must exactly match one of the allowed redirection URLs configured in the app. ",{"type":17,"tag":133,"props":125520,"children":125523},{"href":125521,"rel":125522},"https://shopify.dev/docs/apps/build/cli-for-apps/app-configuration",[214],[125524],{"type":23,"value":125525},"Create apps using the Dev Dashboard",{"type":17,"tag":239,"props":125527,"children":125529},{"id":125528},"step-4-implement-oauth-for-multi-merchant-installs",[125530],{"type":23,"value":125531},"Step 4: Implement OAuth for multi-merchant installs",{"type":17,"tag":29,"props":125533,"children":125534},{},[125535],{"type":23,"value":125536},"For a B2B SaaS integration, Shopify requires OAuth. The client credentials flow is only for stores you own, not for public multi-merchant apps. Shopify's authentication docs make that distinction explicit.",{"type":17,"tag":29,"props":125538,"children":125539},{},[125540,125541],{"type":23,"value":1609},{"type":17,"tag":133,"props":125542,"children":125545},{"href":125543,"rel":125544},"https://shopify.dev/docs/apps/build/authentication-authorization",[214],[125546],{"type":23,"value":125547},"Authentication overview",{"type":17,"tag":29,"props":125549,"children":125550},{},[125551],{"type":23,"value":125552},"The authorization URL pattern looks like this:",{"type":17,"tag":6893,"props":125554,"children":125557},{"className":125555,"code":125556,"language":20901,"meta":23},[20899],"GET https://{shop}/admin/oauth/authorize?client_id={client_id}&scope={scopes}&redirect_uri={redirect_uri}&state={nonce}&grant_options[]={access_mode}\n",[125558],{"type":17,"tag":6121,"props":125559,"children":125560},{"__ignoreMap":7},[125561],{"type":23,"value":125556},{"type":17,"tag":29,"props":125563,"children":125564},{},[125565],{"type":23,"value":70758},{"type":17,"tag":80,"props":125567,"children":125568},{},[125569,125588,125598,125608,125618,125628],{"type":17,"tag":84,"props":125570,"children":125571},{},[125572,125578,125580,125586],{"type":17,"tag":6121,"props":125573,"children":125575},{"className":125574},[],[125576],{"type":23,"value":125577},"shop",{"type":23,"value":125579},": the merchant's ",{"type":17,"tag":6121,"props":125581,"children":125583},{"className":125582},[],[125584],{"type":23,"value":125585},".myshopify.com",{"type":23,"value":125587}," domain",{"type":17,"tag":84,"props":125589,"children":125590},{},[125591,125596],{"type":17,"tag":6121,"props":125592,"children":125594},{"className":125593},[],[125595],{"type":23,"value":97251},{"type":23,"value":125597},": your app's API key",{"type":17,"tag":84,"props":125599,"children":125600},{},[125601,125606],{"type":17,"tag":6121,"props":125602,"children":125604},{"className":125603},[],[125605],{"type":23,"value":97278},{"type":23,"value":125607},": comma-separated scopes",{"type":17,"tag":84,"props":125609,"children":125610},{},[125611,125616],{"type":17,"tag":6121,"props":125612,"children":125614},{"className":125613},[],[125615],{"type":23,"value":97269},{"type":23,"value":125617},": must exactly match an allowed redirect URI",{"type":17,"tag":84,"props":125619,"children":125620},{},[125621,125626],{"type":17,"tag":6121,"props":125622,"children":125624},{"className":125623},[],[125625],{"type":23,"value":77758},{"type":23,"value":125627},": random nonce for CSRF protection",{"type":17,"tag":84,"props":125629,"children":125630},{},[125631,125637,125639,125645],{"type":17,"tag":6121,"props":125632,"children":125634},{"className":125633},[],[125635],{"type":23,"value":125636},"grant_options[]",{"type":23,"value":125638},": use ",{"type":17,"tag":6121,"props":125640,"children":125642},{"className":125641},[],[125643],{"type":23,"value":125644},"per-user",{"type":23,"value":125646}," for online tokens; omit it for offline tokens",{"type":17,"tag":29,"props":125648,"children":125649},{},[125650,125652,125657,125658,125664,125665,125670,125671,125676,125677],{"type":23,"value":125651},"After approval, Shopify redirects back with parameters including ",{"type":17,"tag":6121,"props":125653,"children":125655},{"className":125654},[],[125656],{"type":23,"value":6121},{"type":23,"value":11826},{"type":17,"tag":6121,"props":125659,"children":125661},{"className":125660},[],[125662],{"type":23,"value":125663},"hmac",{"type":23,"value":11826},{"type":17,"tag":6121,"props":125666,"children":125668},{"className":125667},[],[125669],{"type":23,"value":125577},{"type":23,"value":12561},{"type":17,"tag":6121,"props":125672,"children":125674},{"className":125673},[],[125675],{"type":23,"value":77758},{"type":23,"value":123303},{"type":17,"tag":133,"props":125678,"children":125681},{"href":125679,"rel":125680},"https://shopify.dev/docs/apps/build/authentication-authorization/access-tokens/authorization-code-grant",[214],[125682],{"type":23,"value":125683},"Implement authorization code grant manually",{"type":17,"tag":239,"props":125685,"children":125687},{"id":125686},"step-5-exchange-the-code-for-an-access-token",[125688],{"type":23,"value":125689},"Step 5: Exchange the code for an access token",{"type":17,"tag":29,"props":125691,"children":125692},{},[125693],{"type":23,"value":125694},"Exchange the authorization code at:",{"type":17,"tag":6893,"props":125696,"children":125699},{"className":125697,"code":125698,"language":20901,"meta":23},[20899],"POST https://{shop}.myshopify.com/admin/oauth/access_token\n",[125700],{"type":17,"tag":6121,"props":125701,"children":125702},{"__ignoreMap":7},[125703],{"type":23,"value":125698},{"type":17,"tag":29,"props":125705,"children":125706},{},[125707],{"type":23,"value":125708},"The body includes:",{"type":17,"tag":80,"props":125710,"children":125711},{},[125712,125720,125728],{"type":17,"tag":84,"props":125713,"children":125714},{},[125715],{"type":17,"tag":6121,"props":125716,"children":125718},{"className":125717},[],[125719],{"type":23,"value":97251},{"type":17,"tag":84,"props":125721,"children":125722},{},[125723],{"type":17,"tag":6121,"props":125724,"children":125726},{"className":125725},[],[125727],{"type":23,"value":97318},{"type":17,"tag":84,"props":125729,"children":125730},{},[125731],{"type":17,"tag":6121,"props":125732,"children":125734},{"className":125733},[],[125735],{"type":23,"value":6121},{"type":17,"tag":29,"props":125737,"children":125738},{},[125739],{"type":23,"value":125740},"Shopify responds with an access token and the granted scopes. Depending on token mode, the response may also include:",{"type":17,"tag":80,"props":125742,"children":125743},{},[125744,125752,125761,125770,125778],{"type":17,"tag":84,"props":125745,"children":125746},{},[125747],{"type":17,"tag":6121,"props":125748,"children":125750},{"className":125749},[],[125751],{"type":23,"value":122089},{"type":17,"tag":84,"props":125753,"children":125754},{},[125755],{"type":17,"tag":6121,"props":125756,"children":125758},{"className":125757},[],[125759],{"type":23,"value":125760},"associated_user",{"type":17,"tag":84,"props":125762,"children":125763},{},[125764],{"type":17,"tag":6121,"props":125765,"children":125767},{"className":125766},[],[125768],{"type":23,"value":125769},"associated_user_scope",{"type":17,"tag":84,"props":125771,"children":125772},{},[125773],{"type":17,"tag":6121,"props":125774,"children":125776},{"className":125775},[],[125777],{"type":23,"value":77603},{"type":17,"tag":84,"props":125779,"children":125780},{},[125781],{"type":17,"tag":6121,"props":125782,"children":125784},{"className":125783},[],[125785],{"type":23,"value":125786},"refresh_token_expires_in",{"type":17,"tag":29,"props":125788,"children":125789},{},[125790,125792],{"type":23,"value":125791},"Store both the merchant's shop domain and the token, because the shop domain becomes part of future API requests. ",{"type":17,"tag":133,"props":125793,"children":125795},{"href":125679,"rel":125794},[214],[125796],{"type":23,"value":125797},"Authorization code grant",{"type":17,"tag":239,"props":125799,"children":125801},{"id":125800},"step-6-choose-offline-vs-online-tokens-carefully",[125802],{"type":23,"value":125803},"Step 6: Choose offline vs online tokens carefully",{"type":17,"tag":29,"props":125805,"children":125806},{},[125807,125809,125814,125815,125820],{"type":23,"value":125808},"Shopify supports both ",{"type":17,"tag":48,"props":125810,"children":125811},{},[125812],{"type":23,"value":125813},"offline",{"type":23,"value":34435},{"type":17,"tag":48,"props":125816,"children":125817},{},[125818],{"type":23,"value":125819},"online",{"type":23,"value":125821}," access tokens.",{"type":17,"tag":29,"props":125823,"children":125824},{},[125825],{"type":23,"value":105205},{"type":17,"tag":80,"props":125827,"children":125828},{},[125829,125839],{"type":17,"tag":84,"props":125830,"children":125831},{},[125832,125837],{"type":17,"tag":48,"props":125833,"children":125834},{},[125835],{"type":23,"value":125836},"Offline tokens",{"type":23,"value":125838}," are for background jobs, syncs, webhook processing, and long-lived app behavior",{"type":17,"tag":84,"props":125840,"children":125841},{},[125842,125847],{"type":17,"tag":48,"props":125843,"children":125844},{},[125845],{"type":23,"value":125846},"Online tokens",{"type":23,"value":125848}," are tied to a user session and user permissions",{"type":17,"tag":29,"props":125850,"children":125851},{},[125852,125854],{"type":23,"value":125853},"Shopify documents that online tokens expire after logout or after 24 hours, while offline tokens are meant for long-lived service access. For a SaaS integration that runs background sync or webhook processing, offline tokens are usually the right default. ",{"type":17,"tag":133,"props":125855,"children":125858},{"href":125856,"rel":125857},"https://shopify.dev/docs/apps/build/authentication-authorization/access-tokens/offline-access-tokens",[214],[125859],{"type":23,"value":125860},"Offline and online access tokens",{"type":17,"tag":68,"props":125862,"children":125864},{"id":125863},"core-shopify-operations",[125865],{"type":23,"value":125866},"Core Shopify operations",{"type":17,"tag":239,"props":125868,"children":125869},{"id":38575},[125870],{"type":23,"value":125871},"Products",{"type":17,"tag":29,"props":125873,"children":125874},{},[125875,125877,125882],{"type":23,"value":125876},"To list products, use the ",{"type":17,"tag":6121,"props":125878,"children":125880},{"className":125879},[],[125881],{"type":23,"value":38575},{"type":23,"value":125883}," connection in GraphQL. Shopify's GraphQL Admin API supports cursor-based pagination and lets you request exactly the fields you need.",{"type":17,"tag":29,"props":125885,"children":125886},{},[125887],{"type":23,"value":125888},"A minimal product query looks like:",{"type":17,"tag":6893,"props":125890,"children":125895},{"className":125891,"code":125893,"language":125894,"meta":7},[125892],"language-graphql","query GetProducts($cursor: String) {\n  products(first: 10, after: $cursor) {\n    edges {\n      cursor\n      node {\n        id\n        title\n        handle\n      }\n    }\n    pageInfo {\n      hasNextPage\n    }\n  }\n}\n","graphql",[125896],{"type":17,"tag":6121,"props":125897,"children":125898},{"__ignoreMap":7},[125899],{"type":23,"value":125893},{"type":17,"tag":29,"props":125901,"children":125902},{},[125903,125905,125911,125913,125919,125921],{"type":23,"value":125904},"To update a product, use ",{"type":17,"tag":6121,"props":125906,"children":125908},{"className":125907},[],[125909],{"type":23,"value":125910},"productUpdate",{"type":23,"value":125912},". Shopify documents this mutation and notes that product updates require the ",{"type":17,"tag":6121,"props":125914,"children":125916},{"className":125915},[],[125917],{"type":23,"value":125918},"write_products",{"type":23,"value":125920}," scope. ",{"type":17,"tag":133,"props":125922,"children":125925},{"href":125923,"rel":125924},"https://shopify.dev/docs/api/admin-graphql/latest/mutations/productUpdate",[214],[125926],{"type":23,"value":125927},"productUpdate mutation",{"type":17,"tag":239,"props":125929,"children":125930},{"id":83346},[125931],{"type":23,"value":83842},{"type":17,"tag":29,"props":125933,"children":125934},{},[125935,125936,125941],{"type":23,"value":48249},{"type":17,"tag":6121,"props":125937,"children":125939},{"className":125938},[],[125940],{"type":23,"value":83346},{"type":23,"value":125942}," connection to list orders. Shopify supports query filters and pagination through GraphQL.",{"type":17,"tag":29,"props":125944,"children":125945},{},[125946],{"type":23,"value":125947},"A minimal query:",{"type":17,"tag":6893,"props":125949,"children":125952},{"className":125950,"code":125951,"language":125894,"meta":7},[125892],"query GetOrders($cursor: String) {\n  orders(first: 25, after: $cursor) {\n    edges {\n      cursor\n      node {\n        id\n        name\n        createdAt\n      }\n    }\n    pageInfo {\n      hasNextPage\n    }\n  }\n}\n",[125953],{"type":17,"tag":6121,"props":125954,"children":125955},{"__ignoreMap":7},[125956],{"type":23,"value":125951},{"type":17,"tag":29,"props":125958,"children":125959},{},[125960,125962,125968,125970],{"type":23,"value":125961},"One important operational note: by default, Shopify order access is typically limited to the most recent 60 days. If you need older orders, you must request ",{"type":17,"tag":6121,"props":125963,"children":125965},{"className":125964},[],[125966],{"type":23,"value":125967},"read_all_orders",{"type":23,"value":125969}," in addition to the normal order scopes, and Shopify requires approval for that scope. ",{"type":17,"tag":133,"props":125971,"children":125974},{"href":125972,"rel":125973},"https://shopify.dev/docs/api/usage/access-scopes",[214],[125975],{"type":23,"value":125976},"API access scopes",{"type":17,"tag":239,"props":125978,"children":125979},{"id":70514},[125980],{"type":23,"value":32745},{"type":17,"tag":29,"props":125982,"children":125983},{},[125984,125985,125990],{"type":23,"value":48249},{"type":17,"tag":6121,"props":125986,"children":125988},{"className":125987},[],[125989],{"type":23,"value":70514},{"type":23,"value":125991}," connection to retrieve customer data. Shopify supports filtering and search in GraphQL, including email and marketing-related criteria.",{"type":17,"tag":29,"props":125993,"children":125994},{},[125995],{"type":23,"value":125996},"A typical customer query:",{"type":17,"tag":6893,"props":125998,"children":126001},{"className":125999,"code":126000,"language":125894,"meta":7},[125892],"query GetCustomers($cursor: String) {\n  customers(first: 50, after: $cursor, query: \"accepts_marketing:true\") {\n    edges {\n      cursor\n      node {\n        id\n        displayName\n        email\n      }\n    }\n    pageInfo {\n      hasNextPage\n    }\n  }\n}\n",[126002],{"type":17,"tag":6121,"props":126003,"children":126004},{"__ignoreMap":7},[126005],{"type":23,"value":126000},{"type":17,"tag":239,"props":126007,"children":126008},{"id":101911},[126009],{"type":23,"value":38946},{"type":17,"tag":29,"props":126011,"children":126012},{},[126013,126015,126021,126022,126028,126030,126036,126038],{"type":23,"value":126014},"Shopify separates inventory concepts into ",{"type":17,"tag":6121,"props":126016,"children":126018},{"className":126017},[],[126019],{"type":23,"value":126020},"InventoryItem",{"type":23,"value":34435},{"type":17,"tag":6121,"props":126023,"children":126025},{"className":126024},[],[126026],{"type":23,"value":126027},"InventoryLevel",{"type":23,"value":126029},". For stock updates, the key mutation is ",{"type":17,"tag":6121,"props":126031,"children":126033},{"className":126032},[],[126034],{"type":23,"value":126035},"inventoryAdjustQuantities",{"type":23,"value":126037},", which applies delta-based adjustments rather than setting raw quantities in the simplest form. ",{"type":17,"tag":133,"props":126039,"children":126042},{"href":126040,"rel":126041},"https://shopify.dev/docs/api/admin-graphql/latest/mutations/inventoryAdjustQuantities",[214],[126043],{"type":23,"value":126044},"inventoryAdjustQuantities mutation",{"type":17,"tag":29,"props":126046,"children":126047},{},[126048],{"type":23,"value":126049},"You will typically need:",{"type":17,"tag":80,"props":126051,"children":126052},{},[126053,126064],{"type":17,"tag":84,"props":126054,"children":126055},{},[126056,126062],{"type":17,"tag":6121,"props":126057,"children":126059},{"className":126058},[],[126060],{"type":23,"value":126061},"read_inventory",{"type":23,"value":126063}," to read stock state",{"type":17,"tag":84,"props":126065,"children":126066},{},[126067,126073],{"type":17,"tag":6121,"props":126068,"children":126070},{"className":126069},[],[126071],{"type":23,"value":126072},"write_inventory",{"type":23,"value":126074}," to adjust stock",{"type":17,"tag":239,"props":126076,"children":126078},{"id":126077},"fulfillment-and-returns",[126079],{"type":23,"value":126080},"Fulfillment and returns",{"type":17,"tag":29,"props":126082,"children":126083},{},[126084,126086,126091,126093,126099,126101],{"type":23,"value":126085},"Shopify fulfillment workflows are based on ",{"type":17,"tag":48,"props":126087,"children":126088},{},[126089],{"type":23,"value":126090},"fulfillment orders",{"type":23,"value":126092},". Shopify automatically creates fulfillment orders when an order is placed; your app does not create them manually. To fulfill work, you use fulfillment-related queries and mutations such as ",{"type":17,"tag":6121,"props":126094,"children":126096},{"className":126095},[],[126097],{"type":23,"value":126098},"fulfillmentCreate",{"type":23,"value":126100},", depending on your app's scopes and permissions. ",{"type":17,"tag":133,"props":126102,"children":126105},{"href":126103,"rel":126104},"https://shopify.dev/docs/api/admin-graphql/latest/mutations/fulfillmentCreate",[214],[126106],{"type":23,"value":126107},"fulfillmentCreate mutation",{"type":17,"tag":29,"props":126109,"children":126110},{},[126111,126113,126119,126120,126126,126128],{"type":23,"value":126112},"Shopify also has return objects and return-related scopes, including ",{"type":17,"tag":6121,"props":126114,"children":126116},{"className":126115},[],[126117],{"type":23,"value":126118},"read_returns",{"type":23,"value":34435},{"type":17,"tag":6121,"props":126121,"children":126123},{"className":126122},[],[126124],{"type":23,"value":126125},"write_returns",{"type":23,"value":126127},", for apps that manage returns workflows. ",{"type":17,"tag":133,"props":126129,"children":126131},{"href":125972,"rel":126130},[214],[126132],{"type":23,"value":126133},"Returns scope reference",{"type":17,"tag":68,"props":126135,"children":126137},{"id":126136},"shopify-webhooks-pagination-and-rate-limits",[126138],{"type":23,"value":126139},"Shopify webhooks, pagination, and rate limits",{"type":17,"tag":239,"props":126141,"children":126142},{"id":5002},[126143],{"type":23,"value":43896},{"type":17,"tag":29,"props":126145,"children":126146},{},[126147],{"type":23,"value":126148},"Shopify webhooks are the right way to stay in sync with store changes. Shopify explicitly positions webhooks as the alternative to continuous polling.",{"type":17,"tag":29,"props":126150,"children":126151},{},[126152],{"type":23,"value":126153},"Key webhook characteristics:",{"type":17,"tag":80,"props":126155,"children":126156},{},[126157,126162,126206,126211],{"type":17,"tag":84,"props":126158,"children":126159},{},[126160],{"type":23,"value":126161},"Shopify sends HTTP POST requests with a JSON payload",{"type":17,"tag":84,"props":126163,"children":126164},{},[126165,126167],{"type":23,"value":126166},"Webhooks include headers like:\n",{"type":17,"tag":80,"props":126168,"children":126169},{},[126170,126179,126188,126197],{"type":17,"tag":84,"props":126171,"children":126172},{},[126173],{"type":17,"tag":6121,"props":126174,"children":126176},{"className":126175},[],[126177],{"type":23,"value":126178},"X-Shopify-Topic",{"type":17,"tag":84,"props":126180,"children":126181},{},[126182],{"type":17,"tag":6121,"props":126183,"children":126185},{"className":126184},[],[126186],{"type":23,"value":126187},"X-Shopify-Shop-Domain",{"type":17,"tag":84,"props":126189,"children":126190},{},[126191],{"type":17,"tag":6121,"props":126192,"children":126194},{"className":126193},[],[126195],{"type":23,"value":126196},"X-Shopify-Hmac-Sha256",{"type":17,"tag":84,"props":126198,"children":126199},{},[126200],{"type":17,"tag":6121,"props":126201,"children":126203},{"className":126202},[],[126204],{"type":23,"value":126205},"X-Shopify-Webhook-Id",{"type":17,"tag":84,"props":126207,"children":126208},{},[126209],{"type":23,"value":126210},"Your app should validate the HMAC using your app secret",{"type":17,"tag":84,"props":126212,"children":126213},{},[126214],{"type":23,"value":126215},"Shopify expects fast responses and recommends queueing work if processing takes longer than a few seconds",{"type":17,"tag":29,"props":126217,"children":126218},{},[126219,126221],{"type":23,"value":126220},"Shopify does not guarantee event ordering, and duplicate deliveries can happen, so idempotency is required. ",{"type":17,"tag":133,"props":126222,"children":126225},{"href":126223,"rel":126224},"https://shopify.dev/docs/apps/build/webhooks",[214],[126226],{"type":23,"value":126227},"Webhooks overview",{"type":17,"tag":239,"props":126229,"children":126230},{"id":1860},[126231],{"type":23,"value":2409},{"type":17,"tag":29,"props":126233,"children":126234},{},[126235,126237,126241],{"type":23,"value":126236},"For GraphQL Admin API, Shopify uses ",{"type":17,"tag":48,"props":126238,"children":126239},{},[126240],{"type":23,"value":71014},{"type":23,"value":54},{"type":17,"tag":29,"props":126243,"children":126244},{},[126245],{"type":23,"value":126246},"You paginate forward with:",{"type":17,"tag":80,"props":126248,"children":126249},{},[126250,126259],{"type":17,"tag":84,"props":126251,"children":126252},{},[126253],{"type":17,"tag":6121,"props":126254,"children":126256},{"className":126255},[],[126257],{"type":23,"value":126258},"first",{"type":17,"tag":84,"props":126260,"children":126261},{},[126262],{"type":17,"tag":6121,"props":126263,"children":126265},{"className":126264},[],[126266],{"type":23,"value":126267},"after",{"type":17,"tag":29,"props":126269,"children":126270},{},[126271],{"type":23,"value":126272},"And backward with:",{"type":17,"tag":80,"props":126274,"children":126275},{},[126276,126285],{"type":17,"tag":84,"props":126277,"children":126278},{},[126279],{"type":17,"tag":6121,"props":126280,"children":126282},{"className":126281},[],[126283],{"type":23,"value":126284},"last",{"type":17,"tag":84,"props":126286,"children":126287},{},[126288],{"type":17,"tag":6121,"props":126289,"children":126291},{"className":126290},[],[126292],{"type":23,"value":126293},"before",{"type":17,"tag":29,"props":126295,"children":126296},{},[126297,126299,126305,126306,126312,126313,126319,126320,126326,126327,126333,126335,126340,126342],{"type":23,"value":126298},"Each response includes ",{"type":17,"tag":6121,"props":126300,"children":126302},{"className":126301},[],[126303],{"type":23,"value":126304},"pageInfo",{"type":23,"value":120761},{"type":17,"tag":6121,"props":126307,"children":126309},{"className":126308},[],[126310],{"type":23,"value":126311},"hasNextPage",{"type":23,"value":11826},{"type":17,"tag":6121,"props":126314,"children":126316},{"className":126315},[],[126317],{"type":23,"value":126318},"hasPreviousPage",{"type":23,"value":11826},{"type":17,"tag":6121,"props":126321,"children":126323},{"className":126322},[],[126324],{"type":23,"value":126325},"startCursor",{"type":23,"value":12561},{"type":17,"tag":6121,"props":126328,"children":126330},{"className":126329},[],[126331],{"type":23,"value":126332},"endCursor",{"type":23,"value":126334},". Shopify documents a maximum of 250 nodes per page and recommends ",{"type":17,"tag":48,"props":126336,"children":126337},{},[126338],{"type":23,"value":126339},"bulk operations",{"type":23,"value":126341}," for very large data retrievals. ",{"type":17,"tag":133,"props":126343,"children":126346},{"href":126344,"rel":126345},"https://shopify.dev/docs/api/usage/pagination-graphql",[214],[126347],{"type":23,"value":126348},"GraphQL pagination",{"type":17,"tag":239,"props":126350,"children":126351},{"id":124002},[126352],{"type":23,"value":3279},{"type":17,"tag":29,"props":126354,"children":126355},{},[126356,126358,126363],{"type":23,"value":126357},"For the GraphQL Admin API, Shopify uses ",{"type":17,"tag":48,"props":126359,"children":126360},{},[126361],{"type":23,"value":126362},"cost-based throttling",{"type":23,"value":126364},", not plain request counts.",{"type":17,"tag":29,"props":126366,"children":126367},{},[126368],{"type":23,"value":126369},"Important points from Shopify's docs:",{"type":17,"tag":80,"props":126371,"children":126372},{},[126373,126378,126383,126388],{"type":17,"tag":84,"props":126374,"children":126375},{},[126376],{"type":23,"value":126377},"A single query's requested cost must stay within the allowed limits",{"type":17,"tag":84,"props":126379,"children":126380},{},[126381],{"type":23,"value":126382},"Rate limits are scoped per app and store",{"type":17,"tag":84,"props":126384,"children":126385},{},[126386],{"type":23,"value":126387},"The response includes cost metadata and throttle status",{"type":17,"tag":84,"props":126389,"children":126390},{},[126391],{"type":23,"value":126392},"Bulk operations are the preferred path for large exports",{"type":17,"tag":29,"props":126394,"children":126395},{},[126396,126398],{"type":23,"value":126397},"Shopify also documents plan-based restore rates, so available throughput depends on the merchant's plan tier. ",{"type":17,"tag":133,"props":126399,"children":126402},{"href":126400,"rel":126401},"https://shopify.dev/docs/api/usage/limits",[214],[126403],{"type":23,"value":126404},"API limits",{"type":17,"tag":29,"props":126406,"children":126407},{},[126408,126410,126415,126417,126422],{"type":23,"value":126409},"If you still work with legacy REST endpoints, Shopify uses a leaky bucket algorithm there, and ",{"type":17,"tag":6121,"props":126411,"children":126413},{"className":126412},[],[126414],{"type":23,"value":97917},{"type":23,"value":126416}," plus ",{"type":17,"tag":6121,"props":126418,"children":126420},{"className":126419},[],[126421],{"type":23,"value":97924},{"type":23,"value":126423}," handling still matter. But for new development, design around GraphQL cost and bulk operations.",{"type":17,"tag":68,"props":126425,"children":126427},{"id":126426},"where-shopify-integrations-become-operationally-complex",[126428],{"type":23,"value":126429},"Where Shopify integrations become operationally complex",{"type":17,"tag":29,"props":126431,"children":126432},{},[126433],{"type":23,"value":126434},"A direct Shopify integration means you own:",{"type":17,"tag":80,"props":126436,"children":126437},{},[126438,126443,126448,126453,126458,126463,126473,126478,126483],{"type":17,"tag":84,"props":126439,"children":126440},{},[126441],{"type":23,"value":126442},"App distribution strategy",{"type":17,"tag":84,"props":126444,"children":126445},{},[126446],{"type":23,"value":126447},"OAuth installation flow per merchant",{"type":17,"tag":84,"props":126449,"children":126450},{},[126451],{"type":23,"value":126452},"Online vs offline token decisions",{"type":17,"tag":84,"props":126454,"children":126455},{},[126456],{"type":23,"value":126457},"GraphQL query design and cost management",{"type":17,"tag":84,"props":126459,"children":126460},{},[126461],{"type":23,"value":126462},"Scope management for products, orders, customers, inventory, returns, and fulfillment",{"type":17,"tag":84,"props":126464,"children":126465},{},[126466,126468],{"type":23,"value":126467},"Historical order access approval for ",{"type":17,"tag":6121,"props":126469,"children":126471},{"className":126470},[],[126472],{"type":23,"value":125967},{"type":17,"tag":84,"props":126474,"children":126475},{},[126476],{"type":23,"value":126477},"Webhook verification and idempotency",{"type":17,"tag":84,"props":126479,"children":126480},{},[126481],{"type":23,"value":126482},"Cursor pagination and large export workflows",{"type":17,"tag":84,"props":126484,"children":126485},{},[126486],{"type":23,"value":126487},"Bulk operation orchestration",{"type":17,"tag":29,"props":126489,"children":126490},{},[126491],{"type":23,"value":126492},"For a single internal app or one-off store integration, this can be manageable.",{"type":17,"tag":29,"props":126494,"children":126495},{},[126496],{"type":23,"value":126497},"For a multi-merchant SaaS product, this becomes real integration infrastructure.",{"type":17,"tag":68,"props":126499,"children":126501},{"id":126500},"integrating-shopify-via-unified",[126502],{"type":23,"value":126503},"Integrating Shopify via Unified",{"type":17,"tag":29,"props":126505,"children":126506},{},[126507],{"type":23,"value":126508},"From the Unified Shopify integration details you shared, Shopify spans multiple Unified categories, including:",{"type":17,"tag":80,"props":126510,"children":126511},{},[126512,126516,126520,126525],{"type":17,"tag":84,"props":126513,"children":126514},{},[126515],{"type":23,"value":11638},{"type":17,"tag":84,"props":126517,"children":126518},{},[126519],{"type":23,"value":104365},{"type":17,"tag":84,"props":126521,"children":126522},{},[126523],{"type":23,"value":126524},"Metadata",{"type":17,"tag":84,"props":126526,"children":126527},{},[126528],{"type":23,"value":126529},"Passthrough",{"type":17,"tag":239,"props":126531,"children":126533},{"id":126532},"step-1-register-oauth-for-unified",[126534],{"type":23,"value":126535},"Step 1: Register OAuth for Unified",{"type":17,"tag":29,"props":126537,"children":126538},{},[126539],{"type":23,"value":126540},"When integrating Shopify through Unified, set the Shopify callback URL to:",{"type":17,"tag":6893,"props":126542,"children":126544},{"className":126543,"code":71416,"language":20901,"meta":23},[20899],[126545],{"type":17,"tag":6121,"props":126546,"children":126547},{"__ignoreMap":7},[126548],{"type":23,"value":71416},{"type":17,"tag":29,"props":126550,"children":126551},{},[126552],{"type":23,"value":126553},"Unified also provides regional variants:",{"type":17,"tag":80,"props":126555,"children":126556},{},[126557,126566],{"type":17,"tag":84,"props":126558,"children":126559},{},[126560],{"type":17,"tag":6121,"props":126561,"children":126563},{"className":126562},[],[126564],{"type":23,"value":126565},"https://api-eu.unified.to/oauth/code",{"type":17,"tag":84,"props":126567,"children":126568},{},[126569],{"type":17,"tag":6121,"props":126570,"children":126572},{"className":126571},[],[126573],{"type":23,"value":126574},"https://api-au.unified.to/oauth/code",{"type":17,"tag":29,"props":126576,"children":126577},{},[126578,126580,126585],{"type":23,"value":126579},"The merchant authorizes through Unified's embedded authorization flow, and Unified returns a ",{"type":17,"tag":6121,"props":126581,"children":126583},{"className":126582},[],[126584],{"type":23,"value":25037},{"type":23,"value":126586}," that you store for later API calls.",{"type":17,"tag":239,"props":126588,"children":126590},{"id":126589},"step-2-use-unifieds-normalized-objects",[126591],{"type":23,"value":126592},"Step 2: Use Unified's normalized objects",{"type":17,"tag":29,"props":126594,"children":126595},{},[126596],{"type":23,"value":126597},"Based on the Shopify coverage you shared, Unified supports Shopify through normalized objects such as:",{"type":17,"tag":80,"props":126599,"children":126600},{},[126601,126612,126623,126634,126645,126654,126665,126683,126692],{"type":17,"tag":84,"props":126602,"children":126603},{},[126604,126610],{"type":17,"tag":6121,"props":126605,"children":126607},{"className":126606},[],[126608],{"type":23,"value":126609},"Commerce Item",{"type":23,"value":126611}," for products",{"type":17,"tag":84,"props":126613,"children":126614},{},[126615,126621],{"type":17,"tag":6121,"props":126616,"children":126618},{"className":126617},[],[126619],{"type":23,"value":126620},"Commerce ItemVariant",{"type":23,"value":126622}," for product variants",{"type":17,"tag":84,"props":126624,"children":126625},{},[126626,126632],{"type":17,"tag":6121,"props":126627,"children":126629},{"className":126628},[],[126630],{"type":23,"value":126631},"Commerce Inventory",{"type":23,"value":126633}," for inventory levels",{"type":17,"tag":84,"props":126635,"children":126636},{},[126637,126643],{"type":17,"tag":6121,"props":126638,"children":126640},{"className":126639},[],[126641],{"type":23,"value":126642},"Commerce Collection",{"type":23,"value":126644}," for collections/categories",{"type":17,"tag":84,"props":126646,"children":126647},{},[126648],{"type":17,"tag":6121,"props":126649,"children":126651},{"className":126650},[],[126652],{"type":23,"value":126653},"Commerce Location",{"type":17,"tag":84,"props":126655,"children":126656},{},[126657,126663],{"type":17,"tag":6121,"props":126658,"children":126660},{"className":126659},[],[126661],{"type":23,"value":126662},"Accounting Contact",{"type":23,"value":126664}," for customers",{"type":17,"tag":84,"props":126666,"children":126667},{},[126668,126674,126675,126681],{"type":17,"tag":6121,"props":126669,"children":126671},{"className":126670},[],[126672],{"type":23,"value":126673},"Accounting Invoice",{"type":23,"value":34435},{"type":17,"tag":6121,"props":126676,"children":126678},{"className":126677},[],[126679],{"type":23,"value":126680},"Accounting Salesorder",{"type":23,"value":126682}," for orders",{"type":17,"tag":84,"props":126684,"children":126685},{},[126686],{"type":17,"tag":6121,"props":126687,"children":126689},{"className":126688},[],[126690],{"type":23,"value":126691},"Accounting CreditMemo",{"type":17,"tag":84,"props":126693,"children":126694},{},[126695],{"type":17,"tag":6121,"props":126696,"children":126698},{"className":126697},[],[126699],{"type":23,"value":126700},"Metadata Metadata",{"type":17,"tag":29,"props":126702,"children":126703},{},[126704],{"type":23,"value":126705},"That means a single integration surface can cover common product, order, customer, and inventory use cases without building directly against Shopify GraphQL.",{"type":17,"tag":239,"props":126707,"children":126709},{"id":126708},"step-3-make-first-api-calls-through-unified",[126710],{"type":23,"value":126711},"Step 3: Make first API calls through Unified",{"type":17,"tag":29,"props":126713,"children":126714},{},[126715],{"type":23,"value":126716},"List products:",{"type":17,"tag":6893,"props":126718,"children":126721},{"className":126719,"code":126720,"language":48432,"meta":7},[48430],"curl -X GET \"https://api.unified.to/commerce/{connection_id}/item?limit=100&offset=0\" \\\n  -H \"Authorization: Bearer YOUR_UNIFIED_API_KEY\"\n",[126722],{"type":17,"tag":6121,"props":126723,"children":126724},{"__ignoreMap":7},[126725],{"type":23,"value":126720},{"type":17,"tag":29,"props":126727,"children":126728},{},[126729],{"type":23,"value":126730},"List orders:",{"type":17,"tag":6893,"props":126732,"children":126735},{"className":126733,"code":126734,"language":48432,"meta":7},[48430],"curl -X GET \"https://api.unified.to/accounting/{connection_id}/salesorder?limit=100\" \\\n  -H \"Authorization: Bearer YOUR_UNIFIED_API_KEY\"\n",[126736],{"type":17,"tag":6121,"props":126737,"children":126738},{"__ignoreMap":7},[126739],{"type":23,"value":126734},{"type":17,"tag":29,"props":126741,"children":126742},{},[126743],{"type":23,"value":71796},{"type":17,"tag":6893,"props":126745,"children":126748},{"className":126746,"code":126747,"language":48432,"meta":7},[48430],"curl -X GET \"https://api.unified.to/accounting/{connection_id}/contact?limit=100\" \\\n  -H \"Authorization: Bearer YOUR_UNIFIED_API_KEY\"\n",[126749],{"type":17,"tag":6121,"props":126750,"children":126751},{"__ignoreMap":7},[126752],{"type":23,"value":126747},{"type":17,"tag":29,"props":126754,"children":126755},{},[126756],{"type":23,"value":126757},"Update inventory:",{"type":17,"tag":6893,"props":126759,"children":126762},{"className":126760,"code":126761,"language":48432,"meta":7},[48430],"curl -X PUT \"https://api.unified.to/commerce/{connection_id}/inventory/{inventory_id}\" \\\n  -H \"Authorization: Bearer YOUR_UNIFIED_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"available\": 5,\n    \"item_variant_id\": \"VARIANT_ID\",\n    \"location_id\": \"LOCATION_ID\"\n  }'\n",[126763],{"type":17,"tag":6121,"props":126764,"children":126765},{"__ignoreMap":7},[126766],{"type":23,"value":126761},{"type":17,"tag":29,"props":126768,"children":126769},{},[126770],{"type":23,"value":126771},"Create a sales order:",{"type":17,"tag":6893,"props":126773,"children":126776},{"className":126774,"code":126775,"language":48432,"meta":7},[48430],"curl -X POST \"https://api.unified.to/accounting/{connection_id}/salesorder\" \\\n  -H \"Authorization: Bearer YOUR_UNIFIED_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"contact_id\": \"CONTACT_ID\",\n    \"currency\": \"USD\",\n    \"lineitems\": [\n      { \"item_id\": \"ITEM_ID\", \"quantity\": 2, \"unit_price\": \"10.00\" }\n    ],\n    \"status\": \"draft\"\n  }'\n",[126777],{"type":17,"tag":6121,"props":126778,"children":126779},{"__ignoreMap":7},[126780],{"type":23,"value":126775},{"type":17,"tag":239,"props":126782,"children":126783},{"id":122826},[126784],{"type":23,"value":122829},{"type":17,"tag":29,"props":126786,"children":126787},{},[126788],{"type":23,"value":126789},"From the Shopify integration details you shared:",{"type":17,"tag":80,"props":126791,"children":126792},{},[126793,126803,126813,126818],{"type":17,"tag":84,"props":126794,"children":126795},{},[126796,126798],{"type":23,"value":126797},"Some Shopify-backed Unified objects support ",{"type":17,"tag":48,"props":126799,"children":126800},{},[126801],{"type":23,"value":126802},"virtual webhooks only",{"type":17,"tag":84,"props":126804,"children":126805},{},[126806,126808],{"type":23,"value":126807},"Some support ",{"type":17,"tag":48,"props":126809,"children":126810},{},[126811],{"type":23,"value":126812},"native webhooks with virtual fallback",{"type":17,"tag":84,"props":126814,"children":126815},{},[126816],{"type":23,"value":126817},"Products, collections, inventory, locations, and customers all have webhook coverage in some form",{"type":17,"tag":84,"props":126819,"children":126820},{},[126821],{"type":23,"value":126822},"Orders are handled through Unified's webhook system rather than requiring you to build Shopify topic subscriptions directly",{"type":17,"tag":29,"props":126824,"children":126825},{},[126826],{"type":23,"value":126827},"This is useful if you want normalized change notifications without implementing your own Shopify webhook ingestion and HMAC verification pipeline.",{"type":17,"tag":239,"props":126829,"children":126831},{"id":126830},"step-5-use-passthrough-for-unsupported-shopify-resources",[126832],{"type":23,"value":126833},"Step 5: Use passthrough for unsupported Shopify resources",{"type":17,"tag":29,"props":126835,"children":126836},{},[126837],{"type":23,"value":126838},"Your research also shows that not every Shopify resource is normalized in Unified yet. In particular, fulfillments and returns are not broadly normalized in the current Shopify mapping you shared.",{"type":17,"tag":29,"props":126840,"children":126841},{},[126842,126844,126848],{"type":23,"value":126843},"That is where ",{"type":17,"tag":48,"props":126845,"children":126846},{},[126847],{"type":23,"value":124411},{"type":23,"value":126849}," matters.",{"type":17,"tag":29,"props":126851,"children":126852},{},[126853],{"type":23,"value":126854},"Unified supports passthrough methods like:",{"type":17,"tag":80,"props":126856,"children":126857},{},[126858,126862,126866,126870],{"type":17,"tag":84,"props":126859,"children":126860},{},[126861],{"type":23,"value":122909},{"type":17,"tag":84,"props":126863,"children":126864},{},[126865],{"type":23,"value":122914},{"type":17,"tag":84,"props":126867,"children":126868},{},[126869],{"type":23,"value":110111},{"type":17,"tag":84,"props":126871,"children":126872},{},[126873],{"type":23,"value":122923},{"type":17,"tag":29,"props":126875,"children":126876},{},[126877],{"type":23,"value":126878},"So if you need Shopify-specific endpoints not covered by Unified objects, you can still call them through Unified's passthrough layer while keeping the same connection model.",{"type":17,"tag":68,"props":126880,"children":126881},{"id":72006},[126882],{"type":23,"value":72009},{"type":17,"tag":239,"props":126884,"children":126886},{"id":126885},"build-directly-with-shopify-if",[126887],{"type":23,"value":126888},"Build directly with Shopify if:",{"type":17,"tag":80,"props":126890,"children":126891},{},[126892,126897,126902,126907],{"type":17,"tag":84,"props":126893,"children":126894},{},[126895],{"type":23,"value":126896},"Shopify is a core surface of your product",{"type":17,"tag":84,"props":126898,"children":126899},{},[126900],{"type":23,"value":126901},"You need deep Shopify-specific GraphQL capabilities",{"type":17,"tag":84,"props":126903,"children":126904},{},[126905],{"type":23,"value":126906},"You need full control over scopes, bulk operations, webhooks, and fulfillment workflows",{"type":17,"tag":84,"props":126908,"children":126909},{},[126910],{"type":23,"value":126911},"You are comfortable managing GraphQL query cost and Shopify-specific operational details",{"type":17,"tag":239,"props":126913,"children":126914},{"id":72041},[126915],{"type":23,"value":98574},{"type":17,"tag":80,"props":126917,"children":126918},{},[126919,126924,126929,126934,126939],{"type":17,"tag":84,"props":126920,"children":126921},{},[126922],{"type":23,"value":126923},"You want one normalized API across Shopify and other commerce platforms",{"type":17,"tag":84,"props":126925,"children":126926},{},[126927],{"type":23,"value":126928},"Your common use cases are products, orders, customers, inventory, and collections",{"type":17,"tag":84,"props":126930,"children":126931},{},[126932],{"type":23,"value":126933},"You want a simpler auth and connection model",{"type":17,"tag":84,"props":126935,"children":126936},{},[126937],{"type":23,"value":126938},"You want webhook handling abstracted",{"type":17,"tag":84,"props":126940,"children":126941},{},[126942],{"type":23,"value":126943},"You still want a passthrough escape hatch for unsupported resources",{"type":17,"tag":68,"props":126945,"children":126946},{"id":1552},[126947],{"type":23,"value":1555},{"type":17,"tag":29,"props":126949,"children":126950},{},[126951],{"type":23,"value":126952},"A Shopify API integration is straightforward at the 'hello world' level.",{"type":17,"tag":29,"props":126954,"children":126955},{},[126956],{"type":23,"value":126957},"The complexity shows up in:",{"type":17,"tag":80,"props":126959,"children":126960},{},[126961,126966,126971,126976,126981,126986],{"type":17,"tag":84,"props":126962,"children":126963},{},[126964],{"type":23,"value":126965},"choosing the right app type",{"type":17,"tag":84,"props":126967,"children":126968},{},[126969],{"type":23,"value":126970},"implementing merchant install flows",{"type":17,"tag":84,"props":126972,"children":126973},{},[126974],{"type":23,"value":126975},"using GraphQL well",{"type":17,"tag":84,"props":126977,"children":126978},{},[126979],{"type":23,"value":126980},"designing for webhook-first sync",{"type":17,"tag":84,"props":126982,"children":126983},{},[126984],{"type":23,"value":126985},"managing scopes and bulk operations",{"type":17,"tag":84,"props":126987,"children":126988},{},[126989],{"type":23,"value":126990},"handling high-volume stores safely",{"type":17,"tag":29,"props":126992,"children":126993},{},[126994],{"type":23,"value":126995},"If Shopify is a strategic integration for your product, build with GraphQL Admin API first, use webhooks instead of polling, and design for multi-merchant behavior from the beginning.",{"type":17,"tag":29,"props":126997,"children":126998},{},[126999],{"type":23,"value":127000},"If Shopify is one of several ecommerce integrations on your roadmap, a normalized integration layer can reduce engineering overhead and accelerate delivery.",{"type":17,"tag":29,"props":127002,"children":127003},{},[127004],{"type":17,"tag":133,"props":127005,"children":127007},{"href":1612,"rel":127006},[214],[127008],{"type":23,"value":44481},{"type":17,"tag":29,"props":127010,"children":127011},{},[127012],{"type":17,"tag":133,"props":127013,"children":127015},{"href":1623,"rel":127014},[214],[127016],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":127018},[127019,127027,127034,127039,127040,127047,127051],{"id":125341,"depth":1629,"text":125344,"children":127020},[127021,127022,127023,127024,127025,127026],{"id":125347,"depth":1635,"text":125350},{"id":125406,"depth":1635,"text":125409},{"id":125478,"depth":1635,"text":125481},{"id":125528,"depth":1635,"text":125531},{"id":125686,"depth":1635,"text":125689},{"id":125800,"depth":1635,"text":125803},{"id":125863,"depth":1629,"text":125866,"children":127028},[127029,127030,127031,127032,127033],{"id":38575,"depth":1635,"text":125871},{"id":83346,"depth":1635,"text":83842},{"id":70514,"depth":1635,"text":32745},{"id":101911,"depth":1635,"text":38946},{"id":126077,"depth":1635,"text":126080},{"id":126136,"depth":1629,"text":126139,"children":127035},[127036,127037,127038],{"id":5002,"depth":1635,"text":43896},{"id":1860,"depth":1635,"text":2409},{"id":124002,"depth":1635,"text":3279},{"id":126426,"depth":1629,"text":126429},{"id":126500,"depth":1629,"text":126503,"children":127041},[127042,127043,127044,127045,127046],{"id":126532,"depth":1635,"text":126535},{"id":126589,"depth":1635,"text":126592},{"id":126708,"depth":1635,"text":126711},{"id":122826,"depth":1635,"text":122829},{"id":126830,"depth":1635,"text":126833},{"id":72006,"depth":1629,"text":72009,"children":127048},[127049,127050],{"id":126885,"depth":1635,"text":126888},{"id":72041,"depth":1635,"text":98574},{"id":1552,"depth":1629,"text":1555},"content:blog:how_to_integrate_with_shopify.md","blog/how_to_integrate_with_shopify.md","blog/how_to_integrate_with_shopify",{"_path":127056,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":127057,"description":127058,"img":127059,"date":127060,"tag":12,"body":127061,"_type":1677,"_id":128536,"_source":1679,"_file":128537,"_stem":128538,"_extension":1682},"/blog/how_to_integrate_with_google_calendar_api_a_step_by_step_guide_for_developers","How to Integrate with Google Calendar API: A Step-by-Step Guide for Developers","If you only need Google Calendar, you can integrate it directly.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with_google_calendar_api_a_step_by_step_guide_for_developers-icon.png","2026-02-26T00:38:00.000Z",{"type":14,"children":127062,"toc":128513},[127063,127068,127071,127078,127082,127107,127112,127135,127141,127152,127157,127190,127202,127208,127213,127241,127267,127273,127278,127315,127326,127332,127337,127342,127387,127398,127404,127409,127471,127482,127488,127493,127505,127510,127528,127533,127542,127547,127553,127558,127567,127579,127585,127590,127601,127635,127641,127653,127665,127674,127693,127697,127706,127712,127731,127764,127769,127778,127783,127792,127798,127811,127816,127825,127837,127841,127850,127862,127868,127873,127878,127887,127899,127903,127912,127924,127930,127935,127971,127976,127982,127987,127992,128061,128066,128071,128077,128082,128105,128110,128116,128129,128134,128139,128166,128178,128184,128189,128237,128242,128282,128287,128293,128298,128303,128336,128341,128347,128352,128370,128375,128379,128407,128412,128417,128422,128426,128497,128505],{"type":17,"tag":18,"props":127064,"children":127066},{"id":127065},"how-to-integrate-with-google-calendar-api-a-step-by-step-guide-for-developers",[127067],{"type":23,"value":127057},{"type":17,"tag":25,"props":127069,"children":127070},{},[],{"type":17,"tag":29,"props":127072,"children":127073},{},[127074],{"type":17,"tag":33,"props":127075,"children":127076},{},[127077],{"type":23,"value":121725},{"type":17,"tag":29,"props":127079,"children":127080},{},[127081],{"type":23,"value":127058},{"type":17,"tag":29,"props":127083,"children":127084},{},[127085,127087,127091,127093,127097,127099,127106],{"type":23,"value":127086},"If your roadmap includes Outlook, iCloud, Calendly, Teams, Zoom, recordings, or broader workflows across CRM, ATS, and AI features, direct integration becomes much more expensive over time. The Google ",{"type":17,"tag":133,"props":127088,"children":127089},{"href":13708},[127090],{"type":23,"value":98258},{"type":23,"value":127092}," itself is powerful, but you still have to set up Google Cloud, configure ",{"type":17,"tag":133,"props":127094,"children":127095},{"href":779},[127096],{"type":23,"value":782},{"type":23,"value":127098},", manage scopes, refresh tokens, renew webhook channels, handle incremental sync, and then repeat similar work for every other calendar and meeting integration you support. Google's Calendar API is REST-based, supports client libraries, and exposes core resources like Events and Freebusy. (",{"type":17,"tag":133,"props":127100,"children":127103},{"href":127101,"rel":127102},"https://developers.google.com/workspace/calendar/api/guides/overview?utm_source=chatgpt.com",[214],[127104],{"type":23,"value":127105},"Google for Developers",{"type":23,"value":12034},{"type":17,"tag":29,"props":127108,"children":127109},{},[127110],{"type":23,"value":127111},"This guide walks through both paths:",{"type":17,"tag":80,"props":127113,"children":127114},{},[127115,127120,127125,127130],{"type":17,"tag":84,"props":127116,"children":127117},{},[127118],{"type":23,"value":127119},"how to integrate Google Calendar directly",{"type":17,"tag":84,"props":127121,"children":127122},{},[127123],{"type":23,"value":127124},"where direct integration gets harder in production",{"type":17,"tag":84,"props":127126,"children":127127},{},[127128],{"type":23,"value":127129},"how to support Google Calendar through Unified",{"type":17,"tag":84,"props":127131,"children":127132},{},[127133],{"type":23,"value":127134},"why Unified becomes easier once you need more than one calendar or meeting integration",{"type":17,"tag":68,"props":127136,"children":127138},{"id":127137},"what-the-google-calendar-api-lets-you-do",[127139],{"type":23,"value":127140},"What the Google Calendar API lets you do",{"type":17,"tag":29,"props":127142,"children":127143},{},[127144,127146,127151],{"type":23,"value":127145},"Google Calendar gives you programmatic access to common calendar operations, including reading events, creating and updating events, checking free/busy availability, and subscribing to change notifications. Google documents the API as RESTful and available through both direct HTTP calls and official client libraries. (",{"type":17,"tag":133,"props":127147,"children":127149},{"href":127101,"rel":127148},[214],[127150],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":29,"props":127153,"children":127154},{},[127155],{"type":23,"value":127156},"For most product teams, the core operations are:",{"type":17,"tag":80,"props":127158,"children":127159},{},[127160,127165,127170,127175,127180,127185],{"type":17,"tag":84,"props":127161,"children":127162},{},[127163],{"type":23,"value":127164},"list upcoming events",{"type":17,"tag":84,"props":127166,"children":127167},{},[127168],{"type":23,"value":127169},"create events with attendees",{"type":17,"tag":84,"props":127171,"children":127172},{},[127173],{"type":23,"value":127174},"update or delete events",{"type":17,"tag":84,"props":127176,"children":127177},{},[127178],{"type":23,"value":127179},"query availability",{"type":17,"tag":84,"props":127181,"children":127182},{},[127183],{"type":23,"value":127184},"watch for changes",{"type":17,"tag":84,"props":127186,"children":127187},{},[127188],{"type":23,"value":127189},"retrieve only changed records using sync tokens",{"type":17,"tag":29,"props":127191,"children":127192},{},[127193,127195,127201],{"type":23,"value":127194},"Google supports all of those directly. (",{"type":17,"tag":133,"props":127196,"children":127199},{"href":127197,"rel":127198},"https://developers.google.com/workspace/calendar/api/v3/reference/events/list?utm_source=chatgpt.com",[214],[127200],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":68,"props":127203,"children":127205},{"id":127204},"before-you-start",[127206],{"type":23,"value":127207},"Before you start",{"type":17,"tag":29,"props":127209,"children":127210},{},[127211],{"type":23,"value":127212},"For a direct integration, you need:",{"type":17,"tag":80,"props":127214,"children":127215},{},[127216,127221,127226,127231,127236],{"type":17,"tag":84,"props":127217,"children":127218},{},[127219],{"type":23,"value":127220},"a Google Cloud project",{"type":17,"tag":84,"props":127222,"children":127223},{},[127224],{"type":23,"value":127225},"the Google Calendar API enabled",{"type":17,"tag":84,"props":127227,"children":127228},{},[127229],{"type":23,"value":127230},"an OAuth consent screen configured",{"type":17,"tag":84,"props":127232,"children":127233},{},[127234],{"type":23,"value":127235},"OAuth client credentials for your app type",{"type":17,"tag":84,"props":127237,"children":127238},{},[127239],{"type":23,"value":127240},"the right scopes for your use case",{"type":17,"tag":29,"props":127242,"children":127243},{},[127244,127246,127251,127253,127258,127260,127266],{"type":23,"value":127245},"Google's current quickstarts route setup through ",{"type":17,"tag":48,"props":127247,"children":127248},{},[127249],{"type":23,"value":127250},"Google Auth platform > Branding",{"type":23,"value":127252}," for the consent screen and ",{"type":17,"tag":48,"props":127254,"children":127255},{},[127256],{"type":23,"value":127257},"Google Auth platform > Clients",{"type":23,"value":127259}," for client credentials. (",{"type":17,"tag":133,"props":127261,"children":127264},{"href":127262,"rel":127263},"https://developers.google.com/workspace/calendar/api/quickstart/js?utm_source=chatgpt.com",[214],[127265],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":68,"props":127268,"children":127270},{"id":127269},"step-1-create-a-google-cloud-project-and-enable-the-api",[127271],{"type":23,"value":127272},"Step 1: Create a Google Cloud project and enable the API",{"type":17,"tag":29,"props":127274,"children":127275},{},[127276],{"type":23,"value":127277},"In Google Cloud Console:",{"type":17,"tag":6154,"props":127279,"children":127280},{},[127281,127286,127296,127306],{"type":17,"tag":84,"props":127282,"children":127283},{},[127284],{"type":23,"value":127285},"Create a new project.",{"type":17,"tag":84,"props":127287,"children":127288},{},[127289,127290,127295],{"type":23,"value":6661},{"type":17,"tag":48,"props":127291,"children":127292},{},[127293],{"type":23,"value":127294},"APIs & Services > Library",{"type":23,"value":54},{"type":17,"tag":84,"props":127297,"children":127298},{},[127299,127301,127305],{"type":23,"value":127300},"Search for ",{"type":17,"tag":48,"props":127302,"children":127303},{},[127304],{"type":23,"value":13873},{"type":23,"value":54},{"type":17,"tag":84,"props":127307,"children":127308},{},[127309,127310,127314],{"type":23,"value":6629},{"type":17,"tag":48,"props":127311,"children":127312},{},[127313],{"type":23,"value":42181},{"type":23,"value":54},{"type":17,"tag":29,"props":127316,"children":127317},{},[127318,127320,127325],{"type":23,"value":127319},"Google's overview and quickstarts still use this setup flow. (",{"type":17,"tag":133,"props":127321,"children":127323},{"href":127101,"rel":127322},[214],[127324],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":68,"props":127327,"children":127329},{"id":127328},"step-2-configure-the-oauth-consent-screen",[127330],{"type":23,"value":127331},"Step 2: Configure the OAuth consent screen",{"type":17,"tag":29,"props":127333,"children":127334},{},[127335],{"type":23,"value":127336},"Google requires an OAuth consent screen before you can issue OAuth client credentials for end-user access.",{"type":17,"tag":29,"props":127338,"children":127339},{},[127340],{"type":23,"value":127341},"In the current console flow:",{"type":17,"tag":6154,"props":127343,"children":127344},{},[127345,127354,127359,127377,127382],{"type":17,"tag":84,"props":127346,"children":127347},{},[127348,127349,127353],{"type":23,"value":6661},{"type":17,"tag":48,"props":127350,"children":127351},{},[127352],{"type":23,"value":127250},{"type":23,"value":54},{"type":17,"tag":84,"props":127355,"children":127356},{},[127357],{"type":23,"value":127358},"Enter your app name and support email.",{"type":17,"tag":84,"props":127360,"children":127361},{},[127362,127364,127369,127371,127375],{"type":23,"value":127363},"Choose your audience, typically ",{"type":17,"tag":48,"props":127365,"children":127366},{},[127367],{"type":23,"value":127368},"Internal",{"type":23,"value":127370}," for Workspace-only apps or ",{"type":17,"tag":48,"props":127372,"children":127373},{},[127374],{"type":23,"value":42218},{"type":23,"value":127376}," for public apps.",{"type":17,"tag":84,"props":127378,"children":127379},{},[127380],{"type":23,"value":127381},"Add contact information.",{"type":17,"tag":84,"props":127383,"children":127384},{},[127385],{"type":23,"value":127386},"Configure data access and scopes as needed.",{"type":17,"tag":29,"props":127388,"children":127389},{},[127390,127392,127397],{"type":23,"value":127391},"Google's quickstarts now explicitly reference the Google Auth platform setup flow, including Branding, Audience, and Data Access. (",{"type":17,"tag":133,"props":127393,"children":127395},{"href":127262,"rel":127394},[214],[127396],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":68,"props":127399,"children":127401},{"id":127400},"step-3-create-oauth-client-credentials",[127402],{"type":23,"value":127403},"Step 3: Create OAuth client credentials",{"type":17,"tag":29,"props":127405,"children":127406},{},[127407],{"type":23,"value":127408},"Next:",{"type":17,"tag":6154,"props":127410,"children":127411},{},[127412,127421,127426,127453],{"type":17,"tag":84,"props":127413,"children":127414},{},[127415,127416,127420],{"type":23,"value":6661},{"type":17,"tag":48,"props":127417,"children":127418},{},[127419],{"type":23,"value":127257},{"type":23,"value":54},{"type":17,"tag":84,"props":127422,"children":127423},{},[127424],{"type":23,"value":127425},"Create an OAuth client.",{"type":17,"tag":84,"props":127427,"children":127428},{},[127429,127431],{"type":23,"value":127430},"Choose the application type:\n",{"type":17,"tag":80,"props":127432,"children":127433},{},[127434,127438,127443,127448],{"type":17,"tag":84,"props":127435,"children":127436},{},[127437],{"type":23,"value":42383},{"type":17,"tag":84,"props":127439,"children":127440},{},[127441],{"type":23,"value":127442},"Desktop app",{"type":17,"tag":84,"props":127444,"children":127445},{},[127446],{"type":23,"value":127447},"Android",{"type":17,"tag":84,"props":127449,"children":127450},{},[127451],{"type":23,"value":127452},"iOS",{"type":17,"tag":84,"props":127454,"children":127455},{},[127456,127458],{"type":23,"value":127457},"For web apps, add:\n",{"type":17,"tag":80,"props":127459,"children":127460},{},[127461,127466],{"type":17,"tag":84,"props":127462,"children":127463},{},[127464],{"type":23,"value":127465},"authorized JavaScript origins",{"type":17,"tag":84,"props":127467,"children":127468},{},[127469],{"type":23,"value":127470},"authorized redirect URIs",{"type":17,"tag":29,"props":127472,"children":127473},{},[127474,127476,127481],{"type":23,"value":127475},"Google's quickstarts and OAuth docs confirm that each platform should have its own OAuth client ID. (",{"type":17,"tag":133,"props":127477,"children":127479},{"href":127262,"rel":127478},[214],[127480],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":68,"props":127483,"children":127485},{"id":127484},"step-4-choose-the-right-scopes",[127486],{"type":23,"value":127487},"Step 4: Choose the right scopes",{"type":17,"tag":29,"props":127489,"children":127490},{},[127491],{"type":23,"value":127492},"Scopes are where many integrations go wrong.",{"type":17,"tag":29,"props":127494,"children":127495},{},[127496,127498,127504],{"type":23,"value":127497},"Google's Calendar auth guide recommends configuring OAuth carefully and choosing scopes that match the exact level of access you need. Google also notes that some scopes are sensitive and can trigger a more involved review process. (",{"type":17,"tag":133,"props":127499,"children":127502},{"href":127500,"rel":127501},"https://developers.google.com/workspace/calendar/api/auth?utm_source=chatgpt.com",[214],[127503],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":29,"props":127506,"children":127507},{},[127508],{"type":23,"value":127509},"A practical way to think about scopes:",{"type":17,"tag":80,"props":127511,"children":127512},{},[127513,127518,127523],{"type":17,"tag":84,"props":127514,"children":127515},{},[127516],{"type":23,"value":127517},"use a read-only scope if you only need to show events or availability",{"type":17,"tag":84,"props":127519,"children":127520},{},[127521],{"type":23,"value":127522},"use an event write scope if you create or modify events",{"type":17,"tag":84,"props":127524,"children":127525},{},[127526],{"type":23,"value":127527},"use broader calendar scopes only when you truly need them",{"type":17,"tag":29,"props":127529,"children":127530},{},[127531],{"type":23,"value":127532},"For this guide, a simple starting point is:",{"type":17,"tag":6893,"props":127534,"children":127537},{"className":127535,"code":127536,"language":20901,"meta":23},[20899],"https://www.googleapis.com/auth/calendar.readonly\n",[127538],{"type":17,"tag":6121,"props":127539,"children":127540},{"__ignoreMap":7},[127541],{"type":23,"value":127536},{"type":17,"tag":29,"props":127543,"children":127544},{},[127545],{"type":23,"value":127546},"for reading events, then expand later if you need writes.",{"type":17,"tag":68,"props":127548,"children":127550},{"id":127549},"step-5-install-the-client-library",[127551],{"type":23,"value":127552},"Step 5: Install the client library",{"type":17,"tag":29,"props":127554,"children":127555},{},[127556],{"type":23,"value":127557},"For Python, Google's quickstart uses the official client libraries.",{"type":17,"tag":6893,"props":127559,"children":127562},{"className":127560,"code":127561,"language":48432,"meta":7},[48430],"pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib\n",[127563],{"type":17,"tag":6121,"props":127564,"children":127565},{"__ignoreMap":7},[127566],{"type":23,"value":127561},{"type":17,"tag":29,"props":127568,"children":127569},{},[127570,127572,127578],{"type":23,"value":127571},"Google's Python quickstart and related examples use those packages for desktop-style OAuth and API calls. (",{"type":17,"tag":133,"props":127573,"children":127576},{"href":127574,"rel":127575},"https://developers.google.com/workspace/calendar/api/quickstart/python?utm_source=chatgpt.com",[214],[127577],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":68,"props":127580,"children":127582},{"id":127581},"step-6-authenticate-and-list-events",[127583],{"type":23,"value":127584},"Step 6: Authenticate and list events",{"type":17,"tag":29,"props":127586,"children":127587},{},[127588],{"type":23,"value":127589},"A minimal Python example looks like this:",{"type":17,"tag":6893,"props":127591,"children":127596},{"className":127592,"code":127594,"language":127595,"meta":7},[127593],"language-python","import datetime\nimport os.path\n\nfrom google.auth.transport.requests import Request\nfrom google.oauth2.credentials import Credentials\nfrom google_auth_oauthlib.flow import InstalledAppFlow\nfrom googleapiclient.discovery import build\n\nSCOPES = [\"https://www.googleapis.com/auth/calendar.readonly\"]\n\ndef main():\n    creds = None\n\n    if os.path.exists(\"token.json\"):\n        creds = Credentials.from_authorized_user_file(\"token.json\", SCOPES)\n\n    if not creds or not creds.valid:\n        if creds and creds.expired and creds.refresh_token:\n            creds.refresh(Request())\n        else:\n            flow = InstalledAppFlow.from_client_secrets_file(\n                \"credentials.json\", SCOPES\n            )\n            creds = flow.run_local_server(port=0)\n\n        with open(\"token.json\", \"w\") as token:\n            token.write(creds.to_json())\n\n    service = build(\"calendar\", \"v3\", credentials=creds)\n\n    now = datetime.datetime.utcnow().isoformat() + \"Z\"\n    events_result = service.events().list(\n        calendarId=\"primary\",\n        timeMin=now,\n        maxResults=10,\n        singleEvents=True,\n        orderBy=\"startTime\"\n    ).execute()\n\n    events = events_result.get(\"items\", [])\n\n    for event in events:\n        start = event[\"start\"].get(\"dateTime\", event[\"start\"].get(\"date\"))\n        print(start, event.get(\"summary\", \"(no title)\"))\n\nif __name__ == \"__main__\":\n    main()\n","python",[127597],{"type":17,"tag":6121,"props":127598,"children":127599},{"__ignoreMap":7},[127600],{"type":23,"value":127594},{"type":17,"tag":29,"props":127602,"children":127603},{},[127604,127606,127612,127614,127619,127621,127627,127629,127634],{"type":23,"value":127605},"This pattern matches Google's quickstart flow: obtain OAuth credentials, build the Calendar service, then call ",{"type":17,"tag":6121,"props":127607,"children":127609},{"className":127608},[],[127610],{"type":23,"value":127611},"events.list",{"type":23,"value":127613},". Google's reference confirms the ",{"type":17,"tag":6121,"props":127615,"children":127617},{"className":127616},[],[127618],{"type":23,"value":127611},{"type":23,"value":127620}," endpoint and the ",{"type":17,"tag":6121,"props":127622,"children":127624},{"className":127623},[],[127625],{"type":23,"value":127626},"primary",{"type":23,"value":127628}," calendar keyword. (",{"type":17,"tag":133,"props":127630,"children":127632},{"href":127574,"rel":127631},[214],[127633],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":68,"props":127636,"children":127638},{"id":127637},"step-7-create-an-event",[127639],{"type":23,"value":127640},"Step 7: Create an event",{"type":17,"tag":29,"props":127642,"children":127643},{},[127644,127646,127652],{"type":23,"value":127645},"To create an event, use ",{"type":17,"tag":6121,"props":127647,"children":127649},{"className":127648},[],[127650],{"type":23,"value":127651},"events.insert",{"type":23,"value":54},{"type":17,"tag":29,"props":127654,"children":127655},{},[127656,127658,127663],{"type":23,"value":127657},"Google's reference documents ",{"type":17,"tag":6121,"props":127659,"children":127661},{"className":127660},[],[127662],{"type":23,"value":127651},{"type":23,"value":127664}," on:",{"type":17,"tag":6893,"props":127666,"children":127669},{"className":127667,"code":127668,"language":20901,"meta":23},[20899],"POST https://www.googleapis.com/calendar/v3/calendars/{calendarId}/events\n",[127670],{"type":17,"tag":6121,"props":127671,"children":127672},{"__ignoreMap":7},[127673],{"type":23,"value":127668},{"type":17,"tag":29,"props":127675,"children":127676},{},[127677,127679,127684,127686,127692],{"type":23,"value":127678},"and allows ",{"type":17,"tag":6121,"props":127680,"children":127682},{"className":127681},[],[127683],{"type":23,"value":127626},{"type":23,"value":127685}," as the calendar ID for the currently logged-in user's primary calendar. (",{"type":17,"tag":133,"props":127687,"children":127690},{"href":127688,"rel":127689},"https://developers.google.com/workspace/calendar/api/v3/reference/events/insert?utm_source=chatgpt.com",[214],[127691],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":29,"props":127694,"children":127695},{},[127696],{"type":23,"value":19878},{"type":17,"tag":6893,"props":127698,"children":127701},{"className":127699,"code":127700,"language":127595,"meta":7},[127593],"event_body = {\n    \"summary\": \"Customer Onboarding Call\",\n    \"description\": \"Kickoff with the customer success team.\",\n    \"start\": {\n        \"dateTime\": \"2026-04-02T10:00:00-04:00\",\n        \"timeZone\": \"America/New_York\"\n    },\n    \"end\": {\n        \"dateTime\": \"2026-04-02T10:30:00-04:00\",\n        \"timeZone\": \"America/New_York\"\n    },\n    \"attendees\": [\n        {\"email\": \"customer@example.com\"}\n    ]\n}\n\ncreated = service.events().insert(\n    calendarId=\"primary\",\n    body=event_body,\n    sendUpdates=\"all\"\n).execute()\n\nprint(created[\"id\"])\n",[127702],{"type":17,"tag":6121,"props":127703,"children":127704},{"__ignoreMap":7},[127705],{"type":23,"value":127700},{"type":17,"tag":68,"props":127707,"children":127709},{"id":127708},"step-8-update-or-delete-an-event",[127710],{"type":23,"value":127711},"Step 8: Update or delete an event",{"type":17,"tag":29,"props":127713,"children":127714},{},[127715,127717,127723,127724,127730],{"type":23,"value":127716},"For updates, Google supports both ",{"type":17,"tag":6121,"props":127718,"children":127720},{"className":127719},[],[127721],{"type":23,"value":127722},"events.update",{"type":23,"value":34435},{"type":17,"tag":6121,"props":127725,"children":127727},{"className":127726},[],[127728],{"type":23,"value":127729},"events.patch",{"type":23,"value":54},{"type":17,"tag":29,"props":127732,"children":127733},{},[127734,127736,127741,127743,127748,127750,127755,127757,127763],{"type":23,"value":127735},"The important nuance is that ",{"type":17,"tag":6121,"props":127737,"children":127739},{"className":127738},[],[127740],{"type":23,"value":11845},{"type":23,"value":127742}," replaces the full resource, while ",{"type":17,"tag":6121,"props":127744,"children":127746},{"className":127745},[],[127747],{"type":23,"value":98470},{"type":23,"value":127749}," supports partial updates. Google also notes that ",{"type":17,"tag":6121,"props":127751,"children":127753},{"className":127752},[],[127754],{"type":23,"value":98470},{"type":23,"value":127756}," consumes more quota units than a normal update. (",{"type":17,"tag":133,"props":127758,"children":127761},{"href":127759,"rel":127760},"https://developers.google.com/workspace/calendar/api/v3/reference/events/update?utm_source=chatgpt.com",[214],[127762],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":29,"props":127765,"children":127766},{},[127767],{"type":23,"value":127768},"Partial update example:",{"type":17,"tag":6893,"props":127770,"children":127773},{"className":127771,"code":127772,"language":127595,"meta":7},[127593],"service.events().patch(\n    calendarId=\"primary\",\n    eventId=event_id,\n    body={\"summary\": \"Updated Onboarding Call\"}\n).execute()\n",[127774],{"type":17,"tag":6121,"props":127775,"children":127776},{"__ignoreMap":7},[127777],{"type":23,"value":127772},{"type":17,"tag":29,"props":127779,"children":127780},{},[127781],{"type":23,"value":127782},"Delete example:",{"type":17,"tag":6893,"props":127784,"children":127787},{"className":127785,"code":127786,"language":127595,"meta":7},[127593],"service.events().delete(\n    calendarId=\"primary\",\n    eventId=event_id,\n    sendUpdates=\"all\"\n).execute()\n",[127788],{"type":17,"tag":6121,"props":127789,"children":127790},{"__ignoreMap":7},[127791],{"type":23,"value":127786},{"type":17,"tag":68,"props":127793,"children":127795},{"id":127794},"step-9-query-freebusy-availability",[127796],{"type":23,"value":127797},"Step 9: Query free/busy availability",{"type":17,"tag":29,"props":127799,"children":127800},{},[127801,127803,127809],{"type":23,"value":127802},"For scheduling products, ",{"type":17,"tag":6121,"props":127804,"children":127806},{"className":127805},[],[127807],{"type":23,"value":127808},"freebusy.query",{"type":23,"value":127810}," is often more important than raw event reads.",{"type":17,"tag":29,"props":127812,"children":127813},{},[127814],{"type":23,"value":127815},"Google documents the free/busy endpoint as:",{"type":17,"tag":6893,"props":127817,"children":127820},{"className":127818,"code":127819,"language":20901,"meta":23},[20899],"POST https://www.googleapis.com/calendar/v3/freeBusy\n",[127821],{"type":17,"tag":6121,"props":127822,"children":127823},{"__ignoreMap":7},[127824],{"type":23,"value":127819},{"type":17,"tag":29,"props":127826,"children":127827},{},[127828,127830,127836],{"type":23,"value":127829},"It returns busy intervals for a set of calendars. (",{"type":17,"tag":133,"props":127831,"children":127834},{"href":127832,"rel":127833},"https://developers.google.com/workspace/calendar/api/v3/reference/freebusy/query?utm_source=chatgpt.com",[214],[127835],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":29,"props":127838,"children":127839},{},[127840],{"type":23,"value":19878},{"type":17,"tag":6893,"props":127842,"children":127845},{"className":127843,"code":127844,"language":127595,"meta":7},[127593],"body = {\n    \"timeMin\": \"2026-04-02T00:00:00Z\",\n    \"timeMax\": \"2026-04-03T00:00:00Z\",\n    \"timeZone\": \"America/New_York\",\n    \"items\": [{\"id\": \"primary\"}]\n}\n\navailability = service.freebusy().query(body=body).execute()\nprint(availability)\n",[127846],{"type":17,"tag":6121,"props":127847,"children":127848},{"__ignoreMap":7},[127849],{"type":23,"value":127844},{"type":17,"tag":29,"props":127851,"children":127852},{},[127853,127855,127860],{"type":23,"value":127854},"One subtle point: free/busy gives you ",{"type":17,"tag":48,"props":127856,"children":127857},{},[127858],{"type":23,"value":127859},"busy blocks",{"type":23,"value":127861},", not ready-made free slots. Your application still has to compute the complement and then rank candidate windows.",{"type":17,"tag":68,"props":127863,"children":127865},{"id":127864},"step-10-subscribe-to-changes-with-webhooks",[127866],{"type":23,"value":127867},"Step 10: Subscribe to changes with webhooks",{"type":17,"tag":29,"props":127869,"children":127870},{},[127871],{"type":23,"value":127872},"Google supports change notifications through watch channels.",{"type":17,"tag":29,"props":127874,"children":127875},{},[127876],{"type":23,"value":127877},"For events, the reference endpoint is:",{"type":17,"tag":6893,"props":127879,"children":127882},{"className":127880,"code":127881,"language":20901,"meta":23},[20899],"POST https://www.googleapis.com/calendar/v3/calendars/{calendarId}/events/watch\n",[127883],{"type":17,"tag":6121,"props":127884,"children":127885},{"__ignoreMap":7},[127886],{"type":23,"value":127881},{"type":17,"tag":29,"props":127888,"children":127889},{},[127890,127892,127898],{"type":23,"value":127891},"Google's watch method lets you register a webhook endpoint to receive notifications when event resources change. (",{"type":17,"tag":133,"props":127893,"children":127896},{"href":127894,"rel":127895},"https://developers.google.com/workspace/calendar/api/v3/reference/events/watch?utm_source=chatgpt.com",[214],[127897],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":29,"props":127900,"children":127901},{},[127902],{"type":23,"value":33980},{"type":17,"tag":6893,"props":127904,"children":127907},{"className":127905,"code":127906,"language":127595,"meta":7},[127593],"channel = {\n    \"id\": \"your-unique-channel-id\",\n    \"type\": \"web_hook\",\n    \"address\": \"https://yourdomain.com/webhooks/google-calendar\"\n}\n\nresponse = service.events().watch(\n    calendarId=\"primary\",\n    body=channel\n).execute()\n",[127908],{"type":17,"tag":6121,"props":127909,"children":127910},{"__ignoreMap":7},[127911],{"type":23,"value":127906},{"type":17,"tag":29,"props":127913,"children":127914},{},[127915,127917,127922],{"type":23,"value":127916},"Important caveat: Google's webhook notifications tell you ",{"type":17,"tag":48,"props":127918,"children":127919},{},[127920],{"type":23,"value":127921},"that something changed",{"type":23,"value":127923},", not the full changed event payload. In practice, your webhook handler usually triggers a follow-up read or incremental sync.",{"type":17,"tag":68,"props":127925,"children":127927},{"id":127926},"step-11-use-sync-tokens-for-incremental-sync",[127928],{"type":23,"value":127929},"Step 11: Use sync tokens for incremental sync",{"type":17,"tag":29,"props":127931,"children":127932},{},[127933],{"type":23,"value":127934},"If you are maintaining local state, full re-downloads are wasteful.",{"type":17,"tag":29,"props":127936,"children":127937},{},[127938,127940,127946,127948,127954,127956,127962,127964,127970],{"type":23,"value":127939},"Google's incremental sync guide explains that you should store the ",{"type":17,"tag":6121,"props":127941,"children":127943},{"className":127942},[],[127944],{"type":23,"value":127945},"nextSyncToken",{"type":23,"value":127947}," returned by a list request and then pass it back as ",{"type":17,"tag":6121,"props":127949,"children":127951},{"className":127950},[],[127952],{"type":23,"value":127953},"syncToken",{"type":23,"value":127955}," on later requests to retrieve only changed resources. Google also notes that deleted entries are always included in incremental sync so clients can remove them locally. If a sync token expires, Google returns ",{"type":17,"tag":6121,"props":127957,"children":127959},{"className":127958},[],[127960],{"type":23,"value":127961},"410 GONE",{"type":23,"value":127963}," and you must perform a fresh full sync. (",{"type":17,"tag":133,"props":127965,"children":127968},{"href":127966,"rel":127967},"https://developers.google.com/workspace/calendar/api/guides/sync?utm_source=chatgpt.com",[214],[127969],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":29,"props":127972,"children":127973},{},[127974],{"type":23,"value":127975},"This is one of the main reasons a direct integration gets more complex in production than it looks in a quickstart.",{"type":17,"tag":68,"props":127977,"children":127979},{"id":127978},"common-production-issues-with-direct-google-calendar-integrations",[127980],{"type":23,"value":127981},"Common production issues with direct Google Calendar integrations",{"type":17,"tag":29,"props":127983,"children":127984},{},[127985],{"type":23,"value":127986},"The Google Calendar API is workable. The real challenge is everything around it.",{"type":17,"tag":29,"props":127988,"children":127989},{},[127990],{"type":23,"value":127991},"In production, you usually end up owning:",{"type":17,"tag":80,"props":127993,"children":127994},{},[127995,128000,128005,128010,128015,128020,128030,128042,128047,128052],{"type":17,"tag":84,"props":127996,"children":127997},{},[127998],{"type":23,"value":127999},"OAuth client setup and redirect management",{"type":17,"tag":84,"props":128001,"children":128002},{},[128003],{"type":23,"value":128004},"scope selection and reauthorization",{"type":17,"tag":84,"props":128006,"children":128007},{},[128008],{"type":23,"value":128009},"secure storage of access and refresh tokens",{"type":17,"tag":84,"props":128011,"children":128012},{},[128013],{"type":23,"value":128014},"automatic token refresh",{"type":17,"tag":84,"props":128016,"children":128017},{},[128018],{"type":23,"value":128019},"webhook subscription creation and renewal",{"type":17,"tag":84,"props":128021,"children":128022},{},[128023,128025],{"type":23,"value":128024},"incremental sync logic with ",{"type":17,"tag":6121,"props":128026,"children":128028},{"className":128027},[],[128029],{"type":23,"value":127953},{"type":17,"tag":84,"props":128031,"children":128032},{},[128033,128035,128040],{"type":23,"value":128034},"handling ",{"type":17,"tag":6121,"props":128036,"children":128038},{"className":128037},[],[128039],{"type":23,"value":127961},{"type":23,"value":128041}," and other edge cases",{"type":17,"tag":84,"props":128043,"children":128044},{},[128045],{"type":23,"value":128046},"free/busy computation on top of raw busy blocks",{"type":17,"tag":84,"props":128048,"children":128049},{},[128050],{"type":23,"value":128051},"recurring-event complexity",{"type":17,"tag":84,"props":128053,"children":128054},{},[128055,128059],{"type":17,"tag":133,"props":128056,"children":128057},{"href":1857},[128058],{"type":23,"value":1860},{"type":23,"value":128060},", retries, and rate-limit handling",{"type":17,"tag":29,"props":128062,"children":128063},{},[128064],{"type":23,"value":128065},"None of that is unusual. It is just the cost of a direct integration.",{"type":17,"tag":29,"props":128067,"children":128068},{},[128069],{"type":23,"value":128070},"And if you later add Outlook, iCloud, Calendly, Teams, or Zoom, you repeat the same pattern with different auth models, object structures, webhook behavior, and availability rules.",{"type":17,"tag":68,"props":128072,"children":128074},{"id":128073},"when-direct-integration-makes-sense",[128075],{"type":23,"value":128076},"When direct integration makes sense",{"type":17,"tag":29,"props":128078,"children":128079},{},[128080],{"type":23,"value":128081},"A direct Google integration is a good choice when:",{"type":17,"tag":80,"props":128083,"children":128084},{},[128085,128090,128095,128100],{"type":17,"tag":84,"props":128086,"children":128087},{},[128088],{"type":23,"value":128089},"you only need Google Calendar",{"type":17,"tag":84,"props":128091,"children":128092},{},[128093],{"type":23,"value":128094},"you want full control over implementation details",{"type":17,"tag":84,"props":128096,"children":128097},{},[128098],{"type":23,"value":128099},"you have engineering time to own ongoing maintenance",{"type":17,"tag":84,"props":128101,"children":128102},{},[128103],{"type":23,"value":128104},"calendar is a narrow feature, not a broad integration requirement",{"type":17,"tag":29,"props":128106,"children":128107},{},[128108],{"type":23,"value":128109},"If that describes your product, direct integration can be a perfectly good decision.",{"type":17,"tag":68,"props":128111,"children":128113},{"id":128112},"how-to-do-it-with-unified-instead",[128114],{"type":23,"value":128115},"How to do it with Unified instead",{"type":17,"tag":29,"props":128117,"children":128118},{},[128119,128121,128127],{"type":23,"value":128120},"The calculus changes when ",{"type":17,"tag":133,"props":128122,"children":128125},{"href":128123,"rel":128124},"https://unified.to/integrations/googlecalendar",[214],[128126],{"type":23,"value":13669},{"type":23,"value":128128}," is just one of several integrations you need to support.",{"type":17,"tag":29,"props":128130,"children":128131},{},[128132],{"type":23,"value":128133},"Unified's Calendar and Meetings category is built for products that need real-time access to events, availability, recordings, and transcripts across multiple integrations, with one connection model and a normalized API surface. Across the broader platform, Unified is positioned around real-time execution against source APIs, no end-customer data stored at rest, and category-scoped unified APIs.",{"type":17,"tag":29,"props":128135,"children":128136},{},[128137],{"type":23,"value":128138},"For Calendar and Meetings specifically, the working category model you assembled in this chat includes normalized access to:",{"type":17,"tag":80,"props":128140,"children":128141},{},[128142,128150,128158],{"type":17,"tag":84,"props":128143,"children":128144},{},[128145],{"type":17,"tag":6121,"props":128146,"children":128148},{"className":128147},[],[128149],{"type":23,"value":73973},{"type":17,"tag":84,"props":128151,"children":128152},{},[128153],{"type":17,"tag":6121,"props":128154,"children":128156},{"className":128155},[],[128157],{"type":23,"value":99360},{"type":17,"tag":84,"props":128159,"children":128160},{},[128161],{"type":17,"tag":6121,"props":128162,"children":128164},{"className":128163},[],[128165],{"type":23,"value":74195},{"type":17,"tag":29,"props":128167,"children":128168},{},[128169,128171,128176],{"type":23,"value":128170},"along with broader scheduling, recordings, and meeting workflows across ",{"type":17,"tag":48,"props":128172,"children":128173},{},[128174],{"type":23,"value":128175},"27 Calendar & Meetings integrations",{"type":23,"value":128177},". That means you are not building a Google Calendar integration in isolation. You are building one calendar integration layer that can also support other calendar and meeting integrations through the same product architecture.",{"type":17,"tag":239,"props":128179,"children":128181},{"id":128180},"the-direct-google-path-vs-unified",[128182],{"type":23,"value":128183},"The direct Google path vs Unified",{"type":17,"tag":29,"props":128185,"children":128186},{},[128187],{"type":23,"value":128188},"With direct Google integration, you:",{"type":17,"tag":6154,"props":128190,"children":128191},{},[128192,128197,128202,128207,128212,128217,128222,128227,128232],{"type":17,"tag":84,"props":128193,"children":128194},{},[128195],{"type":23,"value":128196},"create a Google Cloud project",{"type":17,"tag":84,"props":128198,"children":128199},{},[128200],{"type":23,"value":128201},"enable the API",{"type":17,"tag":84,"props":128203,"children":128204},{},[128205],{"type":23,"value":128206},"configure OAuth consent",{"type":17,"tag":84,"props":128208,"children":128209},{},[128210],{"type":23,"value":128211},"issue OAuth client credentials",{"type":17,"tag":84,"props":128213,"children":128214},{},[128215],{"type":23,"value":128216},"implement token storage and refresh",{"type":17,"tag":84,"props":128218,"children":128219},{},[128220],{"type":23,"value":128221},"build event reads and writes",{"type":17,"tag":84,"props":128223,"children":128224},{},[128225],{"type":23,"value":128226},"build free/busy logic",{"type":17,"tag":84,"props":128228,"children":128229},{},[128230],{"type":23,"value":128231},"build webhook lifecycle handling",{"type":17,"tag":84,"props":128233,"children":128234},{},[128235],{"type":23,"value":128236},"build incremental sync handling",{"type":17,"tag":29,"props":128238,"children":128239},{},[128240],{"type":23,"value":128241},"With Unified, the model shifts:",{"type":17,"tag":6154,"props":128243,"children":128244},{},[128245,128250,128255,128265,128277],{"type":17,"tag":84,"props":128246,"children":128247},{},[128248],{"type":23,"value":128249},"enable the Calendar and Meetings category",{"type":17,"tag":84,"props":128251,"children":128252},{},[128253],{"type":23,"value":128254},"authorize the customer through Unified Connect",{"type":17,"tag":84,"props":128256,"children":128257},{},[128258,128260],{"type":23,"value":128259},"receive a ",{"type":17,"tag":6121,"props":128261,"children":128263},{"className":128262},[],[128264],{"type":23,"value":25037},{"type":17,"tag":84,"props":128266,"children":128267},{},[128268,128270,128275],{"type":23,"value":128269},"use that ",{"type":17,"tag":6121,"props":128271,"children":128273},{"className":128272},[],[128274],{"type":23,"value":25037},{"type":23,"value":128276}," for calendar API calls",{"type":17,"tag":84,"props":128278,"children":128279},{},[128280],{"type":23,"value":128281},"use the same approach later for Outlook, Calendly, Zoom, Teams, and other meeting integrations",{"type":17,"tag":29,"props":128283,"children":128284},{},[128285],{"type":23,"value":128286},"That same connection-centric model is a documented part of Unified's broader platform positioning.",{"type":17,"tag":239,"props":128288,"children":128290},{"id":128289},"what-gets-easier-with-unified",[128291],{"type":23,"value":128292},"What gets easier with Unified",{"type":17,"tag":29,"props":128294,"children":128295},{},[128296],{"type":23,"value":128297},"Unified does not eliminate product logic. You still own your app's scheduling rules, UI, and business workflows. But it does remove a large amount of per-integration work.",{"type":17,"tag":29,"props":128299,"children":128300},{},[128301],{"type":23,"value":128302},"Instead of rebuilding Google-specific, Microsoft-specific, and Zoom-specific integration code, you get:",{"type":17,"tag":80,"props":128304,"children":128305},{},[128306,128311,128316,128321,128326,128331],{"type":17,"tag":84,"props":128307,"children":128308},{},[128309],{"type":23,"value":128310},"one authorization pattern",{"type":17,"tag":84,"props":128312,"children":128313},{},[128314],{"type":23,"value":128315},"one connection identifier",{"type":17,"tag":84,"props":128317,"children":128318},{},[128319],{"type":23,"value":128320},"one category-scoped API surface",{"type":17,"tag":84,"props":128322,"children":128323},{},[128324],{"type":23,"value":128325},"normalized calendar and meeting objects",{"type":17,"tag":84,"props":128327,"children":128328},{},[128329],{"type":23,"value":128330},"real-time data access patterns across integrations",{"type":17,"tag":84,"props":128332,"children":128333},{},[128334],{"type":23,"value":128335},"a consistent webhook story, including native and virtual webhooks in the broader platform model where supported",{"type":17,"tag":29,"props":128337,"children":128338},{},[128339],{"type":23,"value":128340},"Unified's positioning materials also emphasize usage-based pricing, no per-connection pricing, and a no-storage architecture, which matters for calendar and meeting data because those records often contain sensitive business context.",{"type":17,"tag":68,"props":128342,"children":128344},{"id":128343},"a-practical-way-to-frame-the-tradeoff",[128345],{"type":23,"value":128346},"A practical way to frame the tradeoff",{"type":17,"tag":29,"props":128348,"children":128349},{},[128350],{"type":23,"value":128351},"If your roadmap is:",{"type":17,"tag":80,"props":128353,"children":128354},{},[128355,128360,128365],{"type":17,"tag":84,"props":128356,"children":128357},{},[128358],{"type":23,"value":128359},"Google Calendar only",{"type":17,"tag":84,"props":128361,"children":128362},{},[128363],{"type":23,"value":128364},"simple event reads or writes",{"type":17,"tag":84,"props":128366,"children":128367},{},[128368],{"type":23,"value":128369},"one-off internal tooling",{"type":17,"tag":29,"props":128371,"children":128372},{},[128373],{"type":23,"value":128374},"direct integration is reasonable.",{"type":17,"tag":29,"props":128376,"children":128377},{},[128378],{"type":23,"value":128351},{"type":17,"tag":80,"props":128380,"children":128381},{},[128382,128387,128392,128397,128402],{"type":17,"tag":84,"props":128383,"children":128384},{},[128385],{"type":23,"value":128386},"Google Calendar now",{"type":17,"tag":84,"props":128388,"children":128389},{},[128390],{"type":23,"value":128391},"Outlook next quarter",{"type":17,"tag":84,"props":128393,"children":128394},{},[128395],{"type":23,"value":128396},"Calendly or Zoom after that",{"type":17,"tag":84,"props":128398,"children":128399},{},[128400],{"type":23,"value":128401},"interview scheduling with ATS later",{"type":17,"tag":84,"props":128403,"children":128404},{},[128405],{"type":23,"value":128406},"AI meeting summaries after that",{"type":17,"tag":29,"props":128408,"children":128409},{},[128410],{"type":23,"value":128411},"then direct integration is usually the expensive path. You are not really building 'a Google Calendar integration.' You are starting a long series of integration projects.",{"type":17,"tag":29,"props":128413,"children":128414},{},[128415],{"type":23,"value":128416},"That is where Unified is easier.",{"type":17,"tag":29,"props":128418,"children":128419},{},[128420],{"type":23,"value":128421},"Instead of building integrations one by one, you integrate once at the category level and then support Google Calendar as part of a broader calendar and meetings architecture. That is exactly the product posture Unified's positioning and comparison materials describe: real-time, category-scoped integration infrastructure for SaaS teams building customer-facing features and AI workflows.",{"type":17,"tag":68,"props":128423,"children":128424},{"id":7672},[128425],{"type":23,"value":7675},{"type":17,"tag":80,"props":128427,"children":128428},{},[128429,128440,128482,128487,128492],{"type":17,"tag":84,"props":128430,"children":128431},{},[128432,128434,128439],{"type":23,"value":128433},"Google Calendar direct integration is straightforward at the prototype level, but production complexity expands quickly because you own OAuth, token refresh, watch channels, incremental sync, and recurring-event edge cases. (",{"type":17,"tag":133,"props":128435,"children":128437},{"href":127262,"rel":128436},[214],[128438],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":84,"props":128441,"children":128442},{},[128443,128445,128450,128451,128456,128457,128462,128463,128468,128469,128474,128476,128481],{"type":23,"value":128444},"Google supports the core operations you need: ",{"type":17,"tag":6121,"props":128446,"children":128448},{"className":128447},[],[128449],{"type":23,"value":127611},{"type":23,"value":11826},{"type":17,"tag":6121,"props":128452,"children":128454},{"className":128453},[],[128455],{"type":23,"value":127651},{"type":23,"value":11826},{"type":17,"tag":6121,"props":128458,"children":128460},{"className":128459},[],[128461],{"type":23,"value":127729},{"type":23,"value":11826},{"type":17,"tag":6121,"props":128464,"children":128466},{"className":128465},[],[128467],{"type":23,"value":127722},{"type":23,"value":11826},{"type":17,"tag":6121,"props":128470,"children":128472},{"className":128471},[],[128473],{"type":23,"value":127808},{"type":23,"value":128475},", and watch channels. (",{"type":17,"tag":133,"props":128477,"children":128479},{"href":127197,"rel":128478},[214],[128480],{"type":23,"value":127105},{"type":23,"value":12034},{"type":17,"tag":84,"props":128483,"children":128484},{},[128485],{"type":23,"value":128486},"Direct integration makes sense when Google Calendar is the only integration you need.",{"type":17,"tag":84,"props":128488,"children":128489},{},[128490],{"type":23,"value":128491},"Unified becomes the easier path when Google Calendar is one of several calendar or meeting integrations your product needs to support.",{"type":17,"tag":84,"props":128493,"children":128494},{},[128495],{"type":23,"value":128496},"Unified's advantage is not just that it supports calendar. It is that it gives you a broader real-time Calendar and Meetings integration layer, with one connection model and no end-customer data stored at rest.",{"type":17,"tag":29,"props":128498,"children":128499},{},[128500],{"type":17,"tag":133,"props":128501,"children":128503},{"href":1612,"rel":128502},[214],[128504],{"type":23,"value":44481},{"type":17,"tag":29,"props":128506,"children":128507},{},[128508],{"type":17,"tag":133,"props":128509,"children":128511},{"href":1623,"rel":128510},[214],[128512],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":128514},[128515,128516,128517,128518,128519,128520,128521,128522,128523,128524,128525,128526,128527,128528,128529,128530,128534,128535],{"id":127137,"depth":1629,"text":127140},{"id":127204,"depth":1629,"text":127207},{"id":127269,"depth":1629,"text":127272},{"id":127328,"depth":1629,"text":127331},{"id":127400,"depth":1629,"text":127403},{"id":127484,"depth":1629,"text":127487},{"id":127549,"depth":1629,"text":127552},{"id":127581,"depth":1629,"text":127584},{"id":127637,"depth":1629,"text":127640},{"id":127708,"depth":1629,"text":127711},{"id":127794,"depth":1629,"text":127797},{"id":127864,"depth":1629,"text":127867},{"id":127926,"depth":1629,"text":127929},{"id":127978,"depth":1629,"text":127981},{"id":128073,"depth":1629,"text":128076},{"id":128112,"depth":1629,"text":128115,"children":128531},[128532,128533],{"id":128180,"depth":1635,"text":128183},{"id":128289,"depth":1635,"text":128292},{"id":128343,"depth":1629,"text":128346},{"id":7672,"depth":1629,"text":7675},"content:blog:how_to_integrate_with_google_calendar_api_a_step_by_step_guide_for_developers.md","blog/how_to_integrate_with_google_calendar_api_a_step_by_step_guide_for_developers.md","blog/how_to_integrate_with_google_calendar_api_a_step_by_step_guide_for_developers",{"_path":128540,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":128541,"description":128542,"img":128543,"date":128544,"tag":12,"body":128545,"_type":1677,"_id":129681,"_source":1679,"_file":129682,"_stem":129683,"_extension":1682},"/blog/quickbooks_api_integration_a_step_by_step_guide_for_b2b_saas_teams_2026","QuickBooks API Integration: A Step-by-Step Guide for B2B SaaS Teams (2026)","QuickBooks Online (QBO) is one of the most widely used accounting platforms among SMBs and mid-market companies. If your SaaS touches invoicing, billing,...","https://s3.us-east-2.amazonaws.com/unified-article-images/quickbooks_api_integration_a_step_by_step_guide_for_b2b_saas_teams_2026-icon.png","2026-02-26T00:33:00.000Z",{"type":14,"children":128546,"toc":129656},[128547,128552,128555,128562,128574,128591,128595,128621,128638,128644,128650,128662,128667,128692,128697,128702,128725,128730,128736,128741,128746,128755,128760,128782,128786,128795,128800,128806,128811,128835,128840,128882,128887,128893,128898,128907,128912,128921,128926,128935,128940,128949,128955,128960,128969,128974,128980,128985,129006,129018,129023,129046,129052,129057,129066,129071,129077,129082,129086,129109,129114,129119,129136,129142,129147,129170,129175,129193,129199,129204,129249,129254,129259,129265,129270,129281,129285,129290,129298,129329,129335,129340,129368,129374,129379,129388,129393,129402,129407,129462,129467,129473,129478,129483,129501,129506,129511,129517,129535,129540,129568,129585,129589,129594,129599,129604,129635,129640,129648],{"type":17,"tag":18,"props":128548,"children":128550},{"id":128549},"quickbooks-api-integration-a-step-by-step-guide-for-b2b-saas-teams-2026",[128551],{"type":23,"value":128541},{"type":17,"tag":25,"props":128553,"children":128554},{},[],{"type":17,"tag":29,"props":128556,"children":128557},{},[128558],{"type":17,"tag":33,"props":128559,"children":128560},{},[128561],{"type":23,"value":121725},{"type":17,"tag":29,"props":128563,"children":128564},{},[128565,128567,128572],{"type":23,"value":128566},"QuickBooks Online (QBO) is one of the most widely used accounting platforms among SMBs and mid-market companies. If your SaaS touches invoicing, billing, expenses, payments, or financial reporting, a reliable ",{"type":17,"tag":48,"props":128568,"children":128569},{},[128570],{"type":23,"value":128571},"QuickBooks API integration",{"type":23,"value":128573}," is often essential.",{"type":17,"tag":29,"props":128575,"children":128576},{},[128577,128579,128583,128585,128589],{"type":23,"value":128578},"But building a production-grade integration involves more than creating invoices. You must handle ",{"type":17,"tag":133,"props":128580,"children":128581},{"href":779},[128582],{"type":23,"value":782},{"type":23,"value":128584}," correctly, manage token lifecycles, design for multi-tenant behavior, implement incremental sync, and respect ",{"type":17,"tag":133,"props":128586,"children":128587},{"href":135},[128588],{"type":23,"value":138},{"type":23,"value":128590}," per company.",{"type":17,"tag":29,"props":128592,"children":128593},{},[128594],{"type":23,"value":70164},{"type":17,"tag":6154,"props":128596,"children":128597},{},[128598,128603,128607,128617],{"type":17,"tag":84,"props":128599,"children":128600},{},[128601],{"type":23,"value":128602},"How to integrate directly with the QuickBooks Online API",{"type":17,"tag":84,"props":128604,"children":128605},{},[128606],{"type":23,"value":70177},{"type":17,"tag":84,"props":128608,"children":128609},{},[128610,128612],{"type":23,"value":128611},"How to integrate QuickBooks using Unified's ",{"type":17,"tag":133,"props":128613,"children":128614},{"href":82425},[128615],{"type":23,"value":128616},"Accounting API",{"type":17,"tag":84,"props":128618,"children":128619},{},[128620],{"type":23,"value":70187},{"type":17,"tag":29,"props":128622,"children":128623},{},[128624,128626,128636],{"type":23,"value":128625},"If your product needs to support multiple accounting platforms, it helps to understand how accounting data models work across systems like QuickBooks, Xero, and NetSuite. Our guide on ",{"type":17,"tag":133,"props":128627,"children":128630},{"href":128628,"rel":128629},"https://unified.to/blog/accounting_api_integration_invoices_bills_transactions_and_financial_reporting_across_platforms",[214],[128631],{"type":17,"tag":48,"props":128632,"children":128633},{},[128634],{"type":23,"value":128635},"Accounting API Integration: Invoices, Bills, Transactions, and Financial Reporting Across Platforms",{"type":23,"value":128637}," explains the common objects and patterns used across accounting APIs.",{"type":17,"tag":68,"props":128639,"children":128641},{"id":128640},"direct-quickbooks-online-api-integration",[128642],{"type":23,"value":128643},"Direct QuickBooks Online API Integration",{"type":17,"tag":239,"props":128645,"children":128647},{"id":128646},"step-1-create-an-intuit-developer-account-and-app",[128648],{"type":23,"value":128649},"Step 1: Create an Intuit Developer Account and App",{"type":17,"tag":29,"props":128651,"children":128652},{},[128653,128655,128661],{"type":23,"value":128654},"Start at the ",{"type":17,"tag":133,"props":128656,"children":128658},{"href":13076,"rel":128657},[214],[128659],{"type":23,"value":128660},"Intuit Developer Portal",{"type":23,"value":54},{"type":17,"tag":29,"props":128663,"children":128664},{},[128665],{"type":23,"value":128666},"Create an app and select the appropriate scope:",{"type":17,"tag":80,"props":128668,"children":128669},{},[128670,128681],{"type":17,"tag":84,"props":128671,"children":128672},{},[128673,128679],{"type":17,"tag":6121,"props":128674,"children":128676},{"className":128675},[],[128677],{"type":23,"value":128678},"com.intuit.quickbooks.accounting",{"type":23,"value":128680}," (Accounting data: invoices, customers, payments, etc.)",{"type":17,"tag":84,"props":128682,"children":128683},{},[128684,128690],{"type":17,"tag":6121,"props":128685,"children":128687},{"className":128686},[],[128688],{"type":23,"value":128689},"com.intuit.quickbooks.payment",{"type":23,"value":128691}," (QuickBooks Payments)",{"type":17,"tag":29,"props":128693,"children":128694},{},[128695],{"type":23,"value":128696},"Most SaaS products require the Accounting scope at minimum.",{"type":17,"tag":29,"props":128698,"children":128699},{},[128700],{"type":23,"value":128701},"When you create your app, Intuit provides:",{"type":17,"tag":80,"props":128703,"children":128704},{},[128705,128709,128713],{"type":17,"tag":84,"props":128706,"children":128707},{},[128708],{"type":23,"value":6040},{"type":17,"tag":84,"props":128710,"children":128711},{},[128712],{"type":23,"value":6045},{"type":17,"tag":84,"props":128714,"children":128715},{},[128716,128718,128723],{"type":23,"value":128717},"Access to a ",{"type":17,"tag":48,"props":128719,"children":128720},{},[128721],{"type":23,"value":128722},"sandbox company",{"type":23,"value":128724}," for testing",{"type":17,"tag":29,"props":128726,"children":128727},{},[128728],{"type":23,"value":128729},"Intuit documents sandbox environments and base URLs in its official sandbox guide.",{"type":17,"tag":239,"props":128731,"children":128733},{"id":128732},"step-2-implement-oauth-20-authorization-code-flow",[128734],{"type":23,"value":128735},"Step 2: Implement OAuth 2.0 (Authorization Code Flow)",{"type":17,"tag":29,"props":128737,"children":128738},{},[128739],{"type":23,"value":128740},"QuickBooks Online uses OAuth 2.0 Authorization Code Flow.",{"type":17,"tag":29,"props":128742,"children":128743},{},[128744],{"type":23,"value":128745},"Authorization URL pattern:",{"type":17,"tag":6893,"props":128747,"children":128750},{"className":128748,"code":128749,"language":20901,"meta":23},[20899],"https://appcenter.intuit.com/connect/oauth2\n  ?client_id=YOUR_CLIENT_ID\n  &redirect_uri=YOUR_REDIRECT_URI\n  &response_type=code\n  &scope=com.intuit.quickbooks.accounting\n  &state=RANDOM_STRING\n",[128751],{"type":17,"tag":6121,"props":128752,"children":128753},{"__ignoreMap":7},[128754],{"type":23,"value":128749},{"type":17,"tag":29,"props":128756,"children":128757},{},[128758],{"type":23,"value":128759},"After approval, Intuit redirects back with:",{"type":17,"tag":80,"props":128761,"children":128762},{},[128763,128771],{"type":17,"tag":84,"props":128764,"children":128765},{},[128766],{"type":17,"tag":6121,"props":128767,"children":128769},{"className":128768},[],[128770],{"type":23,"value":6121},{"type":17,"tag":84,"props":128772,"children":128773},{},[128774,128780],{"type":17,"tag":6121,"props":128775,"children":128777},{"className":128776},[],[128778],{"type":23,"value":128779},"realmId",{"type":23,"value":128781}," (company ID — store this immediately)",{"type":17,"tag":29,"props":128783,"children":128784},{},[128785],{"type":23,"value":125694},{"type":17,"tag":6893,"props":128787,"children":128790},{"className":128788,"code":128789,"language":20901,"meta":23},[20899],"https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer\n",[128791],{"type":17,"tag":6121,"props":128792,"children":128793},{"__ignoreMap":7},[128794],{"type":23,"value":128789},{"type":17,"tag":29,"props":128796,"children":128797},{},[128798],{"type":23,"value":128799},"Intuit's OAuth documentation outlines this flow and required headers.",{"type":17,"tag":239,"props":128801,"children":128803},{"id":128802},"step-3-token-lifecycle-management",[128804],{"type":23,"value":128805},"Step 3: Token Lifecycle Management",{"type":17,"tag":29,"props":128807,"children":128808},{},[128809],{"type":23,"value":128810},"QuickBooks token behavior:",{"type":17,"tag":80,"props":128812,"children":128813},{},[128814,128823],{"type":17,"tag":84,"props":128815,"children":128816},{},[128817,128819],{"type":23,"value":128818},"Access tokens expire in ",{"type":17,"tag":48,"props":128820,"children":128821},{},[128822],{"type":23,"value":96223},{"type":17,"tag":84,"props":128824,"children":128825},{},[128826,128828,128833],{"type":23,"value":128827},"Refresh tokens are valid up to ",{"type":17,"tag":48,"props":128829,"children":128830},{},[128831],{"type":23,"value":128832},"100 days",{"type":23,"value":128834}," (rolling expiration)",{"type":17,"tag":29,"props":128836,"children":128837},{},[128838],{"type":23,"value":128839},"Operational requirements:",{"type":17,"tag":80,"props":128841,"children":128842},{},[128843,128867,128872,128877],{"type":17,"tag":84,"props":128844,"children":128845},{},[128846,128848,128853,128854,128859,128860,128865],{"type":23,"value":128847},"Store ",{"type":17,"tag":6121,"props":128849,"children":128851},{"className":128850},[],[128852],{"type":23,"value":128779},{"type":23,"value":11826},{"type":17,"tag":6121,"props":128855,"children":128857},{"className":128856},[],[128858],{"type":23,"value":77598},{"type":23,"value":11826},{"type":17,"tag":6121,"props":128861,"children":128863},{"className":128862},[],[128864],{"type":23,"value":77603},{"type":23,"value":128866},", and expiry timestamps per connected company",{"type":17,"tag":84,"props":128868,"children":128869},{},[128870],{"type":23,"value":128871},"Refresh access tokens automatically",{"type":17,"tag":84,"props":128873,"children":128874},{},[128875],{"type":23,"value":128876},"Always store the latest refresh token returned",{"type":17,"tag":84,"props":128878,"children":128879},{},[128880],{"type":23,"value":128881},"If refresh fails, require customer re-authorization",{"type":17,"tag":29,"props":128883,"children":128884},{},[128885],{"type":23,"value":128886},"Token handling must be multi-tenant and encrypted at rest.",{"type":17,"tag":239,"props":128888,"children":128890},{"id":128889},"step-4-base-urls-and-core-request-pattern",[128891],{"type":23,"value":128892},"Step 4: Base URLs and Core Request Pattern",{"type":17,"tag":29,"props":128894,"children":128895},{},[128896],{"type":23,"value":128897},"Production base URL:",{"type":17,"tag":6893,"props":128899,"children":128902},{"className":128900,"code":128901,"language":20901,"meta":23},[20899],"https://quickbooks.api.intuit.com/v3/company/{realmId}/\n",[128903],{"type":17,"tag":6121,"props":128904,"children":128905},{"__ignoreMap":7},[128906],{"type":23,"value":128901},{"type":17,"tag":29,"props":128908,"children":128909},{},[128910],{"type":23,"value":128911},"Sandbox base URL:",{"type":17,"tag":6893,"props":128913,"children":128916},{"className":128914,"code":128915,"language":20901,"meta":23},[20899],"https://sandbox-quickbooks.api.intuit.com/v3/company/{realmId}/\n",[128917],{"type":17,"tag":6121,"props":128918,"children":128919},{"__ignoreMap":7},[128920],{"type":23,"value":128915},{"type":17,"tag":29,"props":128922,"children":128923},{},[128924],{"type":23,"value":128925},"All requests require:",{"type":17,"tag":6893,"props":128927,"children":128930},{"className":128928,"code":128929,"language":20901,"meta":23},[20899],"Authorization: Bearer {access_token}\nAccept: application/json\n",[128931],{"type":17,"tag":6121,"props":128932,"children":128933},{"__ignoreMap":7},[128934],{"type":23,"value":128929},{"type":17,"tag":29,"props":128936,"children":128937},{},[128938],{"type":23,"value":128939},"Example: Fetch a customer",{"type":17,"tag":6893,"props":128941,"children":128944},{"className":128942,"code":128943,"language":20901,"meta":23},[20899],"GET /v3/company/{realmId}/customer/{customerId}\n",[128945],{"type":17,"tag":6121,"props":128946,"children":128947},{"__ignoreMap":7},[128948],{"type":23,"value":128943},{"type":17,"tag":239,"props":128950,"children":128952},{"id":128951},"step-5-sql-like-query-endpoint",[128953],{"type":23,"value":128954},"Step 5: SQL-Like Query Endpoint",{"type":17,"tag":29,"props":128956,"children":128957},{},[128958],{"type":23,"value":128959},"QuickBooks uses a SQL-like query syntax:",{"type":17,"tag":6893,"props":128961,"children":128964},{"className":128962,"code":128963,"language":20901,"meta":23},[20899],"GET /v3/company/{realmId}/query?query=SELECT * FROM Customer ORDERBY FamilyName MAXRESULTS 100\n",[128965],{"type":17,"tag":6121,"props":128966,"children":128967},{"__ignoreMap":7},[128968],{"type":23,"value":128963},{"type":17,"tag":29,"props":128970,"children":128971},{},[128972],{"type":23,"value":128973},"This allows filtering and pagination using familiar SQL constructs.",{"type":17,"tag":239,"props":128975,"children":128977},{"id":128976},"step-6-synctoken-optimistic-locking",[128978],{"type":23,"value":128979},"Step 6: SyncToken (Optimistic Locking)",{"type":17,"tag":29,"props":128981,"children":128982},{},[128983],{"type":23,"value":128984},"Every writable entity includes:",{"type":17,"tag":80,"props":128986,"children":128987},{},[128988,128997],{"type":17,"tag":84,"props":128989,"children":128990},{},[128991],{"type":17,"tag":6121,"props":128992,"children":128994},{"className":128993},[],[128995],{"type":23,"value":128996},"Id",{"type":17,"tag":84,"props":128998,"children":128999},{},[129000],{"type":17,"tag":6121,"props":129001,"children":129003},{"className":129002},[],[129004],{"type":23,"value":129005},"SyncToken",{"type":17,"tag":29,"props":129007,"children":129008},{},[129009,129011,129016],{"type":23,"value":129010},"When updating an object, you must include the current ",{"type":17,"tag":6121,"props":129012,"children":129014},{"className":129013},[],[129015],{"type":23,"value":129005},{"type":23,"value":129017},". If stale, QuickBooks rejects the update.",{"type":17,"tag":29,"props":129019,"children":129020},{},[129021],{"type":23,"value":129022},"Practical pattern:",{"type":17,"tag":6154,"props":129024,"children":129025},{},[129026,129031,129041],{"type":17,"tag":84,"props":129027,"children":129028},{},[129029],{"type":23,"value":129030},"Retrieve object",{"type":17,"tag":84,"props":129032,"children":129033},{},[129034,129036],{"type":23,"value":129035},"Update with latest ",{"type":17,"tag":6121,"props":129037,"children":129039},{"className":129038},[],[129040],{"type":23,"value":129005},{"type":17,"tag":84,"props":129042,"children":129043},{},[129044],{"type":23,"value":129045},"Retry on version conflict",{"type":17,"tag":239,"props":129047,"children":129049},{"id":129048},"step-7-change-data-capture-cdc",[129050],{"type":23,"value":129051},"Step 7: Change Data Capture (CDC)",{"type":17,"tag":29,"props":129053,"children":129054},{},[129055],{"type":23,"value":129056},"Instead of polling entire datasets, use CDC:",{"type":17,"tag":6893,"props":129058,"children":129061},{"className":129059,"code":129060,"language":20901,"meta":23},[20899],"GET /v3/company/{realmId}/cdc?entities=Customer,Invoice,Payment&changedSince=2024-01-01T00:00:00Z\n",[129062],{"type":17,"tag":6121,"props":129063,"children":129064},{"__ignoreMap":7},[129065],{"type":23,"value":129060},{"type":17,"tag":29,"props":129067,"children":129068},{},[129069],{"type":23,"value":129070},"CDC returns only changed records and is the recommended incremental sync pattern.",{"type":17,"tag":239,"props":129072,"children":129074},{"id":129073},"step-8-webhooks",[129075],{"type":23,"value":129076},"Step 8: Webhooks",{"type":17,"tag":29,"props":129078,"children":129079},{},[129080],{"type":23,"value":129081},"QuickBooks supports webhooks per app environment.",{"type":17,"tag":29,"props":129083,"children":129084},{},[129085],{"type":23,"value":65343},{"type":17,"tag":80,"props":129087,"children":129088},{},[129089,129094,129104],{"type":17,"tag":84,"props":129090,"children":129091},{},[129092],{"type":23,"value":129093},"One webhook endpoint per app",{"type":17,"tag":84,"props":129095,"children":129096},{},[129097,129099],{"type":23,"value":129098},"Payload includes changed entities and affected ",{"type":17,"tag":6121,"props":129100,"children":129102},{"className":129101},[],[129103],{"type":23,"value":128779},{"type":17,"tag":84,"props":129105,"children":129106},{},[129107],{"type":23,"value":129108},"Must validate webhook signature using verifier token",{"type":17,"tag":29,"props":129110,"children":129111},{},[129112],{"type":23,"value":129113},"Common architecture:",{"type":17,"tag":29,"props":129115,"children":129116},{},[129117],{"type":23,"value":129118},"Webhook → queue job → call CDC → update internal data store",{"type":17,"tag":29,"props":129120,"children":129121},{},[129122,129124,129134],{"type":23,"value":129123},"If you are deciding between polling and event-driven updates, our article ",{"type":17,"tag":133,"props":129125,"children":129128},{"href":129126,"rel":129127},"https://unified.to/blog/polling_vs_webhooks_when_to_use_one_over_the_other",[214],[129129],{"type":17,"tag":48,"props":129130,"children":129131},{},[129132],{"type":23,"value":129133},"Polling vs Webhooks: When to Use One Over the Other",{"type":23,"value":129135}," explains the operational trade-offs between periodic API reads and real-time event delivery.",{"type":17,"tag":239,"props":129137,"children":129139},{"id":129138},"step-9-rate-limits",[129140],{"type":23,"value":129141},"Step 9: Rate Limits",{"type":17,"tag":29,"props":129143,"children":129144},{},[129145],{"type":23,"value":129146},"Production limits:",{"type":17,"tag":80,"props":129148,"children":129149},{},[129150,129160],{"type":17,"tag":84,"props":129151,"children":129152},{},[129153,129155],{"type":23,"value":129154},"500 requests per minute per ",{"type":17,"tag":6121,"props":129156,"children":129158},{"className":129157},[],[129159],{"type":23,"value":128779},{"type":17,"tag":84,"props":129161,"children":129162},{},[129163,129165],{"type":23,"value":129164},"10 concurrent requests per ",{"type":17,"tag":6121,"props":129166,"children":129168},{"className":129167},[],[129169],{"type":23,"value":128779},{"type":17,"tag":29,"props":129171,"children":129172},{},[129173],{"type":23,"value":129174},"Design implications:",{"type":17,"tag":80,"props":129176,"children":129177},{},[129178,129183,129188],{"type":17,"tag":84,"props":129179,"children":129180},{},[129181],{"type":23,"value":129182},"Queue per company",{"type":17,"tag":84,"props":129184,"children":129185},{},[129186],{"type":23,"value":129187},"Isolate failures per tenant",{"type":17,"tag":84,"props":129189,"children":129190},{},[129191],{"type":23,"value":129192},"Exponential backoff on 429 responses",{"type":17,"tag":68,"props":129194,"children":129196},{"id":129195},"where-quickbooks-integrations-become-complex",[129197],{"type":23,"value":129198},"Where QuickBooks Integrations Become Complex",{"type":17,"tag":29,"props":129200,"children":129201},{},[129202],{"type":23,"value":129203},"Direct QuickBooks integrations require you to own:",{"type":17,"tag":80,"props":129205,"children":129206},{},[129207,129212,129224,129229,129234,129239,129244],{"type":17,"tag":84,"props":129208,"children":129209},{},[129210],{"type":23,"value":129211},"OAuth lifecycle and refresh token rotation",{"type":17,"tag":84,"props":129213,"children":129214},{},[129215,129217,129222],{"type":23,"value":129216},"Multi-tenant ",{"type":17,"tag":6121,"props":129218,"children":129220},{"className":129219},[],[129221],{"type":23,"value":128779},{"type":23,"value":129223}," scoping",{"type":17,"tag":84,"props":129225,"children":129226},{},[129227],{"type":23,"value":129228},"SyncToken versioning",{"type":17,"tag":84,"props":129230,"children":129231},{},[129232],{"type":23,"value":129233},"CDC incremental sync design",{"type":17,"tag":84,"props":129235,"children":129236},{},[129237],{"type":23,"value":129238},"Webhook validation",{"type":17,"tag":84,"props":129240,"children":129241},{},[129242],{"type":23,"value":129243},"Chart-of-accounts mapping per customer",{"type":17,"tag":84,"props":129245,"children":129246},{},[129247],{"type":23,"value":129248},"Rate limit management per company",{"type":17,"tag":29,"props":129250,"children":129251},{},[129252],{"type":23,"value":129253},"For a single internal workflow, this is manageable.",{"type":17,"tag":29,"props":129255,"children":129256},{},[129257],{"type":23,"value":129258},"For a SaaS serving hundreds or thousands of QuickBooks companies, this becomes sustained infrastructure.",{"type":17,"tag":68,"props":129260,"children":129262},{"id":129261},"integrating-quickbooks-via-unifieds-accounting-api",[129263],{"type":23,"value":129264},"Integrating QuickBooks via Unified's Accounting API",{"type":17,"tag":29,"props":129266,"children":129267},{},[129268],{"type":23,"value":129269},"If your roadmap includes QuickBooks plus other accounting platforms (Xero, Sage, NetSuite), maintaining provider-specific logic multiplies engineering overhead.",{"type":17,"tag":29,"props":129271,"children":129272},{},[129273,129275,129279],{"type":23,"value":129274},"Unified provides a category-level ",{"type":17,"tag":48,"props":129276,"children":129277},{},[129278],{"type":23,"value":128616},{"type":23,"value":129280}," that standardizes common financial objects.",{"type":17,"tag":239,"props":129282,"children":129283},{"id":126532},[129284],{"type":23,"value":126535},{"type":17,"tag":29,"props":129286,"children":129287},{},[129288],{"type":23,"value":129289},"When integrating through Unified, configure your OAuth redirect URI in Intuit as:",{"type":17,"tag":6893,"props":129291,"children":129293},{"className":129292,"code":71416,"language":20901,"meta":23},[20899],[129294],{"type":17,"tag":6121,"props":129295,"children":129296},{"__ignoreMap":7},[129297],{"type":23,"value":71416},{"type":17,"tag":29,"props":129299,"children":129300},{},[129301,129303,129308,129310,129315,129316,129321,129322,129327],{"type":23,"value":129302},"Unified's QuickBooks integration uses the same Accounting scope (",{"type":17,"tag":6121,"props":129304,"children":129306},{"className":129305},[],[129307],{"type":23,"value":128678},{"type":23,"value":129309},") alongside identity scopes (",{"type":17,"tag":6121,"props":129311,"children":129313},{"className":129312},[],[129314],{"type":23,"value":98191},{"type":23,"value":11826},{"type":17,"tag":6121,"props":129317,"children":129319},{"className":129318},[],[129320],{"type":23,"value":62666},{"type":23,"value":11826},{"type":17,"tag":6121,"props":129323,"children":129325},{"className":129324},[],[129326],{"type":23,"value":98204},{"type":23,"value":129328},").",{"type":17,"tag":239,"props":129330,"children":129332},{"id":129331},"step-2-activate-quickbooks-in-unified",[129333],{"type":23,"value":129334},"Step 2: Activate QuickBooks in Unified",{"type":17,"tag":29,"props":129336,"children":129337},{},[129338],{"type":23,"value":129339},"In your Unified workspace:",{"type":17,"tag":6154,"props":129341,"children":129342},{},[129343,129348,129353,129358],{"type":17,"tag":84,"props":129344,"children":129345},{},[129346],{"type":23,"value":129347},"Activate QuickBooks",{"type":17,"tag":84,"props":129349,"children":129350},{},[129351],{"type":23,"value":129352},"Enter Client ID and Client Secret",{"type":17,"tag":84,"props":129354,"children":129355},{},[129356],{"type":23,"value":129357},"Authorize the company",{"type":17,"tag":84,"props":129359,"children":129360},{},[129361,129363],{"type":23,"value":129362},"Store the ",{"type":17,"tag":6121,"props":129364,"children":129366},{"className":129365},[],[129367],{"type":23,"value":25037},{"type":17,"tag":239,"props":129369,"children":129371},{"id":129370},"step-3-call-unifieds-accounting-api",[129372],{"type":23,"value":129373},"Step 3: Call Unified's Accounting API",{"type":17,"tag":29,"props":129375,"children":129376},{},[129377],{"type":23,"value":129378},"Example: List invoices",{"type":17,"tag":6893,"props":129380,"children":129383},{"className":129381,"code":129382,"language":48432,"meta":7},[48430],"GET https://api.unified.to/accounting/invoice/{connection_id}?limit=50\nAuthorization: Bearer YOUR_API_KEY\n",[129384],{"type":17,"tag":6121,"props":129385,"children":129386},{"__ignoreMap":7},[129387],{"type":23,"value":129382},{"type":17,"tag":29,"props":129389,"children":129390},{},[129391],{"type":23,"value":129392},"Example: Create invoice",{"type":17,"tag":6893,"props":129394,"children":129397},{"className":129395,"code":129396,"language":48432,"meta":7},[48430],"POST https://api.unified.to/accounting/invoice/{connection_id}\nAuthorization: Bearer YOUR_API_KEY\nContent-Type: application/json\n",[129398],{"type":17,"tag":6121,"props":129399,"children":129400},{"__ignoreMap":7},[129401],{"type":23,"value":129396},{"type":17,"tag":29,"props":129403,"children":129404},{},[129405],{"type":23,"value":129406},"Unified supports Accounting objects including:",{"type":17,"tag":80,"props":129408,"children":129409},{},[129410,129415,129420,129425,129429,129433,129438,129443,129447,129452,129457],{"type":17,"tag":84,"props":129411,"children":129412},{},[129413],{"type":23,"value":129414},"Invoice (list, get, create, update, remove)",{"type":17,"tag":84,"props":129416,"children":129417},{},[129418],{"type":23,"value":129419},"Bill",{"type":17,"tag":84,"props":129421,"children":129422},{},[129423],{"type":23,"value":129424},"CreditMemo",{"type":17,"tag":84,"props":129426,"children":129427},{},[129428],{"type":23,"value":25973},{"type":17,"tag":84,"props":129430,"children":129431},{},[129432],{"type":23,"value":47619},{"type":17,"tag":84,"props":129434,"children":129435},{},[129436],{"type":23,"value":129437},"Journal",{"type":17,"tag":84,"props":129439,"children":129440},{},[129441],{"type":23,"value":129442},"Transaction",{"type":17,"tag":84,"props":129444,"children":129445},{},[129446],{"type":23,"value":25828},{"type":17,"tag":84,"props":129448,"children":129449},{},[129450],{"type":23,"value":129451},"PurchaseOrder",{"type":17,"tag":84,"props":129453,"children":129454},{},[129455],{"type":23,"value":129456},"Expense",{"type":17,"tag":84,"props":129458,"children":129459},{},[129460],{"type":23,"value":129461},"Reports (BalanceSheet, TrialBalance, ProfitLoss, CashFlow)",{"type":17,"tag":29,"props":129463,"children":129464},{},[129465],{"type":23,"value":129466},"Unified also supports passthrough calls when you need provider-specific endpoints.",{"type":17,"tag":239,"props":129468,"children":129470},{"id":129469},"step-4-webhooks-via-unified",[129471],{"type":23,"value":129472},"Step 4: Webhooks via Unified",{"type":17,"tag":29,"props":129474,"children":129475},{},[129476],{"type":23,"value":129477},"Unified manages webhook handling and delivers standardized change events.",{"type":17,"tag":29,"props":129479,"children":129480},{},[129481],{"type":23,"value":129482},"Instead of implementing QuickBooks webhook signature validation and CDC manually, you receive:",{"type":17,"tag":80,"props":129484,"children":129485},{},[129486,129491,129496],{"type":17,"tag":84,"props":129487,"children":129488},{},[129489],{"type":23,"value":129490},"Created events",{"type":17,"tag":84,"props":129492,"children":129493},{},[129494],{"type":23,"value":129495},"Updated events",{"type":17,"tag":84,"props":129497,"children":129498},{},[129499],{"type":23,"value":129500},"Deleted events",{"type":17,"tag":29,"props":129502,"children":129503},{},[129504],{"type":23,"value":129505},"Using a consistent webhook payload model across providers.",{"type":17,"tag":68,"props":129507,"children":129508},{"id":72006},[129509],{"type":23,"value":129510},"Direct vs Unified — When to Choose Each",{"type":17,"tag":239,"props":129512,"children":129514},{"id":129513},"build-directly-if",[129515],{"type":23,"value":129516},"Build Directly If",{"type":17,"tag":80,"props":129518,"children":129519},{},[129520,129525,129530],{"type":17,"tag":84,"props":129521,"children":129522},{},[129523],{"type":23,"value":129524},"QuickBooks Online is your only accounting integration",{"type":17,"tag":84,"props":129526,"children":129527},{},[129528],{"type":23,"value":129529},"You require full provider-specific flexibility",{"type":17,"tag":84,"props":129531,"children":129532},{},[129533],{"type":23,"value":129534},"You want complete control over OAuth, CDC, and webhooks",{"type":17,"tag":239,"props":129536,"children":129537},{"id":72041},[129538],{"type":23,"value":129539},"Use Unified If",{"type":17,"tag":80,"props":129541,"children":129542},{},[129543,129548,129553,129558,129563],{"type":17,"tag":84,"props":129544,"children":129545},{},[129546],{"type":23,"value":129547},"You plan to support multiple accounting platforms",{"type":17,"tag":84,"props":129549,"children":129550},{},[129551],{"type":23,"value":129552},"You want standardized accounting objects",{"type":17,"tag":84,"props":129554,"children":129555},{},[129556],{"type":23,"value":129557},"You prefer not to manage OAuth lifecycle logic per provider",{"type":17,"tag":84,"props":129559,"children":129560},{},[129561],{"type":23,"value":129562},"You want consistent webhook handling across systems",{"type":17,"tag":84,"props":129564,"children":129565},{},[129566],{"type":23,"value":129567},"You want usage-based pricing instead of per-connection fees",{"type":17,"tag":29,"props":129569,"children":129570},{},[129571,129573,129583],{"type":23,"value":129572},"Teams evaluating integration architecture often compare ETL pipelines, workflow platforms, and unified APIs. The article ",{"type":17,"tag":133,"props":129574,"children":129577},{"href":129575,"rel":129576},"https://unified.to/blog/etl_vs_ipaas_vs_unified_api_which_integration_platform_requires_the_least_maintenance",[214],[129578],{"type":17,"tag":48,"props":129579,"children":129580},{},[129581],{"type":23,"value":129582},"ETL vs iPaaS vs Unified API: Which Integration Platform Requires the Least Maintenance?",{"type":23,"value":129584}," breaks down how each approach affects long-term engineering overhead.",{"type":17,"tag":68,"props":129586,"children":129587},{"id":1552},[129588],{"type":23,"value":44411},{"type":17,"tag":29,"props":129590,"children":129591},{},[129592],{"type":23,"value":129593},"A QuickBooks API integration is often a purchasing requirement for SMB-focused SaaS products.",{"type":17,"tag":29,"props":129595,"children":129596},{},[129597],{"type":23,"value":129598},"At the endpoint level, the API is straightforward.",{"type":17,"tag":29,"props":129600,"children":129601},{},[129602],{"type":23,"value":129603},"At scale, the complexity lies in:",{"type":17,"tag":80,"props":129605,"children":129606},{},[129607,129611,129616,129620,129625,129630],{"type":17,"tag":84,"props":129608,"children":129609},{},[129610],{"type":23,"value":93493},{"type":17,"tag":84,"props":129612,"children":129613},{},[129614],{"type":23,"value":129615},"Multi-tenant isolation",{"type":17,"tag":84,"props":129617,"children":129618},{},[129619],{"type":23,"value":129228},{"type":17,"tag":84,"props":129621,"children":129622},{},[129623],{"type":23,"value":129624},"CDC incremental sync",{"type":17,"tag":84,"props":129626,"children":129627},{},[129628],{"type":23,"value":129629},"Rate limit compliance",{"type":17,"tag":84,"props":129631,"children":129632},{},[129633],{"type":23,"value":129634},"Data mapping per customer",{"type":17,"tag":29,"props":129636,"children":129637},{},[129638],{"type":23,"value":129639},"Choosing your integration architecture early determines how fast you ship and how much maintenance you own long term.",{"type":17,"tag":29,"props":129641,"children":129642},{},[129643],{"type":17,"tag":133,"props":129644,"children":129646},{"href":1612,"rel":129645},[214],[129647],{"type":23,"value":44481},{"type":17,"tag":29,"props":129649,"children":129650},{},[129651],{"type":17,"tag":133,"props":129652,"children":129654},{"href":1623,"rel":129653},[214],[129655],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":129657},[129658,129669,129670,129676,129680],{"id":128640,"depth":1629,"text":128643,"children":129659},[129660,129661,129662,129663,129664,129665,129666,129667,129668],{"id":128646,"depth":1635,"text":128649},{"id":128732,"depth":1635,"text":128735},{"id":128802,"depth":1635,"text":128805},{"id":128889,"depth":1635,"text":128892},{"id":128951,"depth":1635,"text":128954},{"id":128976,"depth":1635,"text":128979},{"id":129048,"depth":1635,"text":129051},{"id":129073,"depth":1635,"text":129076},{"id":129138,"depth":1635,"text":129141},{"id":129195,"depth":1629,"text":129198},{"id":129261,"depth":1629,"text":129264,"children":129671},[129672,129673,129674,129675],{"id":126532,"depth":1635,"text":126535},{"id":129331,"depth":1635,"text":129334},{"id":129370,"depth":1635,"text":129373},{"id":129469,"depth":1635,"text":129472},{"id":72006,"depth":1629,"text":129510,"children":129677},[129678,129679],{"id":129513,"depth":1635,"text":129516},{"id":72041,"depth":1635,"text":129539},{"id":1552,"depth":1629,"text":44411},"content:blog:quickbooks_api_integration_a_step_by_step_guide_for_b2b_saas_teams_2026.md","blog/quickbooks_api_integration_a_step_by_step_guide_for_b2b_saas_teams_2026.md","blog/quickbooks_api_integration_a_step_by_step_guide_for_b2b_saas_teams_2026",{"_path":129685,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":129686,"description":129687,"img":129688,"date":129689,"tag":12,"body":129690,"_type":1677,"_id":131134,"_source":1679,"_file":131135,"_stem":131136,"_extension":1682},"/blog/how_to_integrate_with_gmail_api_a_step_by_step_guide_for_developers","How to Integrate with Gmail API: A Step-by-Step Guide for Developers","A Gmail API integration lets your SaaS read messages, send mail, manage labels, and stay in sync with users' inbox activity. But building a production-grade...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with_gmail_api_a_step_by_step_guide_for_developers-icon.png","2026-02-26T00:19:00.000Z",{"type":14,"children":129691,"toc":131101},[129692,129697,129700,129707,129723,129727,129753,129759,129765,129777,129813,129834,129839,129849,129900,129913,129918,129924,129929,129934,129973,129993,129998,130043,130055,130061,130071,130098,130107,130112,130123,130128,130134,130139,130175,130187,130192,130198,130202,130211,130217,130226,130231,130240,130244,130275,130287,130293,130302,130307,130335,130346,130352,130361,130366,130377,130383,130388,130393,130399,130404,130416,130421,130430,130435,130446,130450,130470,130476,130481,130506,130515,130526,130531,130554,130559,130565,130570,130574,130587,130599,130603,130621,130633,130639,130644,130696,130708,130713,130718,130724,130729,130734,130738,130743,130751,130764,130769,130829,130835,130839,130867,130871,130875,130884,130888,130911,130916,130957,130961,130984,130989,131004,131009,131013,131017,131035,131039,131066,131070,131075,131080,131085,131093],{"type":17,"tag":18,"props":129693,"children":129695},{"id":129694},"how-to-integrate-with-gmail-api-a-step-by-step-guide-for-developers",[129696],{"type":23,"value":129686},{"type":17,"tag":25,"props":129698,"children":129699},{},[],{"type":17,"tag":29,"props":129701,"children":129702},{},[129703],{"type":17,"tag":33,"props":129704,"children":129705},{},[129706],{"type":23,"value":121725},{"type":17,"tag":29,"props":129708,"children":129709},{},[129710,129711,129715,129717,129721],{"type":23,"value":9619},{"type":17,"tag":48,"props":129712,"children":129713},{},[129714],{"type":23,"value":96996},{"type":23,"value":129716}," lets your SaaS read messages, send mail, manage labels, and stay in sync with users' inbox activity. But building a production-grade integration requires more than sending a few REST requests. You must implement ",{"type":17,"tag":133,"props":129718,"children":129719},{"href":779},[129720],{"type":23,"value":782},{"type":23,"value":129722}," correctly, choose scopes carefully, handle token rotation, design for quota limits, and build reliable change detection.",{"type":17,"tag":29,"props":129724,"children":129725},{},[129726],{"type":23,"value":70164},{"type":17,"tag":6154,"props":129728,"children":129729},{},[129730,129735,129740,129749],{"type":17,"tag":84,"props":129731,"children":129732},{},[129733],{"type":23,"value":129734},"How to integrate directly with the Gmail API",{"type":17,"tag":84,"props":129736,"children":129737},{},[129738],{"type":23,"value":129739},"The operational complexity you'll own in production",{"type":17,"tag":84,"props":129741,"children":129742},{},[129743,129745],{"type":23,"value":129744},"How to integrate Gmail using Unified's ",{"type":17,"tag":133,"props":129746,"children":129747},{"href":14913},[129748],{"type":23,"value":27356},{"type":17,"tag":84,"props":129750,"children":129751},{},[129752],{"type":23,"value":70187},{"type":17,"tag":68,"props":129754,"children":129756},{"id":129755},"direct-gmail-api-integration",[129757],{"type":23,"value":129758},"Direct Gmail API Integration",{"type":17,"tag":239,"props":129760,"children":129762},{"id":129761},"step-1-create-a-google-cloud-project-and-enable-gmail-api",[129763],{"type":23,"value":129764},"Step 1: Create a Google Cloud Project and Enable Gmail API",{"type":17,"tag":29,"props":129766,"children":129767},{},[129768,129770,129776],{"type":23,"value":129769},"Start in the ",{"type":17,"tag":133,"props":129771,"children":129773},{"href":42075,"rel":129772},[214],[129774],{"type":23,"value":129775},"Google Cloud Console",{"type":23,"value":54},{"type":17,"tag":6154,"props":129778,"children":129779},{},[129780,129785,129795,129804],{"type":17,"tag":84,"props":129781,"children":129782},{},[129783],{"type":23,"value":129784},"Create or select a project.",{"type":17,"tag":84,"props":129786,"children":129787},{},[129788,129789,129794],{"type":23,"value":42939},{"type":17,"tag":48,"props":129790,"children":129791},{},[129792],{"type":23,"value":129793},"APIs & Services → Library",{"type":23,"value":54},{"type":17,"tag":84,"props":129796,"children":129797},{},[129798,129799,129803],{"type":23,"value":127300},{"type":17,"tag":48,"props":129800,"children":129801},{},[129802],{"type":23,"value":15162},{"type":23,"value":54},{"type":17,"tag":84,"props":129805,"children":129806},{},[129807,129808,129812],{"type":23,"value":6629},{"type":17,"tag":48,"props":129809,"children":129810},{},[129811],{"type":23,"value":42181},{"type":23,"value":54},{"type":17,"tag":29,"props":129814,"children":129815},{},[129816,129818,129824,129826,129833],{"type":23,"value":129817},"Google's official Gmail ",{"type":17,"tag":133,"props":129819,"children":129821},{"href":129820},"/docs/intro",[129822],{"type":23,"value":129823},"API documentation",{"type":23,"value":129825}," is available in the ",{"type":17,"tag":133,"props":129827,"children":129830},{"href":129828,"rel":129829},"https://developers.google.com/workspace/gmail/api/guides",[214],[129831],{"type":23,"value":129832},"Gmail API overview",{"type":23,"value":54},{"type":17,"tag":239,"props":129835,"children":129836},{"id":127328},[129837],{"type":23,"value":129838},"Step 2: Configure the OAuth Consent Screen",{"type":17,"tag":29,"props":129840,"children":129841},{},[129842,129843,129848],{"type":23,"value":42829},{"type":17,"tag":48,"props":129844,"children":129845},{},[129846],{"type":23,"value":129847},"APIs & Services → OAuth consent screen",{"type":23,"value":20456},{"type":17,"tag":6154,"props":129850,"children":129851},{},[129852,129868,129890,129895],{"type":17,"tag":84,"props":129853,"children":129854},{},[129855,129856,129860,129862,129866],{"type":23,"value":44311},{"type":17,"tag":48,"props":129857,"children":129858},{},[129859],{"type":23,"value":127368},{"type":23,"value":129861}," (Workspace-only) or ",{"type":17,"tag":48,"props":129863,"children":129864},{},[129865],{"type":23,"value":42218},{"type":23,"value":129867}," (public SaaS).",{"type":17,"tag":84,"props":129869,"children":129870},{},[129871,129873],{"type":23,"value":129872},"Provide:\n",{"type":17,"tag":80,"props":129874,"children":129875},{},[129876,129880,129885],{"type":17,"tag":84,"props":129877,"children":129878},{},[129879],{"type":23,"value":6418},{"type":17,"tag":84,"props":129881,"children":129882},{},[129883],{"type":23,"value":129884},"Support email",{"type":17,"tag":84,"props":129886,"children":129887},{},[129888],{"type":23,"value":129889},"Developer contact email",{"type":17,"tag":84,"props":129891,"children":129892},{},[129893],{"type":23,"value":129894},"Add authorized domains.",{"type":17,"tag":84,"props":129896,"children":129897},{},[129898],{"type":23,"value":129899},"Add links to your privacy policy and terms.",{"type":17,"tag":29,"props":129901,"children":129902},{},[129903,129905,129912],{"type":23,"value":129904},"Google documents OAuth for web server applications in the ",{"type":17,"tag":133,"props":129906,"children":129909},{"href":129907,"rel":129908},"https://developers.google.com/identity/protocols/oauth2/web-server",[214],[129910],{"type":23,"value":129911},"OAuth 2.0 Web Server Applications guide",{"type":23,"value":54},{"type":17,"tag":29,"props":129914,"children":129915},{},[129916],{"type":23,"value":129917},"If your app requests sensitive or restricted scopes, Google requires additional verification.",{"type":17,"tag":239,"props":129919,"children":129921},{"id":129920},"step-3-choose-the-correct-gmail-scopes",[129922],{"type":23,"value":129923},"Step 3: Choose the Correct Gmail Scopes",{"type":17,"tag":29,"props":129925,"children":129926},{},[129927],{"type":23,"value":129928},"Scopes determine what your application can do.",{"type":17,"tag":29,"props":129930,"children":129931},{},[129932],{"type":23,"value":129933},"Common Gmail scopes include:",{"type":17,"tag":80,"props":129935,"children":129936},{},[129937,129946,129955,129964],{"type":17,"tag":84,"props":129938,"children":129939},{},[129940],{"type":17,"tag":6121,"props":129941,"children":129943},{"className":129942},[],[129944],{"type":23,"value":129945},"https://www.googleapis.com/auth/gmail.readonly",{"type":17,"tag":84,"props":129947,"children":129948},{},[129949],{"type":17,"tag":6121,"props":129950,"children":129952},{"className":129951},[],[129953],{"type":23,"value":129954},"https://www.googleapis.com/auth/gmail.modify",{"type":17,"tag":84,"props":129956,"children":129957},{},[129958],{"type":17,"tag":6121,"props":129959,"children":129961},{"className":129960},[],[129962],{"type":23,"value":129963},"https://www.googleapis.com/auth/gmail.send",{"type":17,"tag":84,"props":129965,"children":129966},{},[129967],{"type":17,"tag":6121,"props":129968,"children":129970},{"className":129969},[],[129971],{"type":23,"value":129972},"https://mail.google.com/",{"type":17,"tag":29,"props":129974,"children":129975},{},[129976,129978,129983,129985,129992],{"type":23,"value":129977},"Google categorizes Gmail scopes as ",{"type":17,"tag":48,"props":129979,"children":129980},{},[129981],{"type":23,"value":129982},"non-sensitive, sensitive, or restricted",{"type":23,"value":129984},". You can review scope classifications in the ",{"type":17,"tag":133,"props":129986,"children":129989},{"href":129987,"rel":129988},"https://developers.google.com/workspace/gmail/api/auth/scopes",[214],[129990],{"type":23,"value":129991},"Gmail API scope reference",{"type":23,"value":54},{"type":17,"tag":29,"props":129994,"children":129995},{},[129996],{"type":23,"value":129997},"Key considerations:",{"type":17,"tag":80,"props":129999,"children":130000},{},[130001,130012,130030],{"type":17,"tag":84,"props":130002,"children":130003},{},[130004,130010],{"type":17,"tag":6121,"props":130005,"children":130007},{"className":130006},[],[130008],{"type":23,"value":130009},"gmail.send",{"type":23,"value":130011}," is typically categorized as Sensitive.",{"type":17,"tag":84,"props":130013,"children":130014},{},[130015,130021,130022,130028],{"type":17,"tag":6121,"props":130016,"children":130018},{"className":130017},[],[130019],{"type":23,"value":130020},"gmail.readonly",{"type":23,"value":34435},{"type":17,"tag":6121,"props":130023,"children":130025},{"className":130024},[],[130026],{"type":23,"value":130027},"gmail.modify",{"type":23,"value":130029}," are Restricted scopes.",{"type":17,"tag":84,"props":130031,"children":130032},{},[130033,130035,130042],{"type":23,"value":130034},"Restricted scopes require passing Google's restricted scope verification process, including a third-party security assessment as documented in the ",{"type":17,"tag":133,"props":130036,"children":130039},{"href":130037,"rel":130038},"https://developers.google.com/identity/protocols/oauth2/production-readiness/restricted-scope-verification",[214],[130040],{"type":23,"value":130041},"Restricted Scope Verification guide",{"type":23,"value":54},{"type":17,"tag":29,"props":130044,"children":130045},{},[130046,130048,130053],{"type":23,"value":130047},"If your SaaS only needs to send email, prefer ",{"type":17,"tag":6121,"props":130049,"children":130051},{"className":130050},[],[130052],{"type":23,"value":130009},{"type":23,"value":130054},". Reading inbox content triggers stricter compliance requirements.",{"type":17,"tag":239,"props":130056,"children":130058},{"id":130057},"step-4-create-oauth-credentials",[130059],{"type":23,"value":130060},"Step 4: Create OAuth Credentials",{"type":17,"tag":29,"props":130062,"children":130063},{},[130064,130065,130070],{"type":23,"value":42829},{"type":17,"tag":48,"props":130066,"children":130067},{},[130068],{"type":23,"value":130069},"APIs & Services → Credentials",{"type":23,"value":20456},{"type":17,"tag":6154,"props":130072,"children":130073},{},[130074,130084,130093],{"type":17,"tag":84,"props":130075,"children":130076},{},[130077,130078,130083],{"type":23,"value":6629},{"type":17,"tag":48,"props":130079,"children":130080},{},[130081],{"type":23,"value":130082},"Create Credentials → OAuth client ID",{"type":23,"value":54},{"type":17,"tag":84,"props":130085,"children":130086},{},[130087,130088,130092],{"type":23,"value":42950},{"type":17,"tag":48,"props":130089,"children":130090},{},[130091],{"type":23,"value":42383},{"type":23,"value":54},{"type":17,"tag":84,"props":130094,"children":130095},{},[130096],{"type":23,"value":130097},"Provide an authorized redirect URI, for example:",{"type":17,"tag":6893,"props":130099,"children":130102},{"className":130100,"code":130101,"language":20901,"meta":23},[20899],"https://app.your-saas.com/oauth/google/callback\n",[130103],{"type":17,"tag":6121,"props":130104,"children":130105},{"__ignoreMap":7},[130106],{"type":23,"value":130101},{"type":17,"tag":29,"props":130108,"children":130109},{},[130110],{"type":23,"value":130111},"After creation, Google provides:",{"type":17,"tag":80,"props":130113,"children":130114},{},[130115,130119],{"type":17,"tag":84,"props":130116,"children":130117},{},[130118],{"type":23,"value":6040},{"type":17,"tag":84,"props":130120,"children":130121},{},[130122],{"type":23,"value":6045},{"type":17,"tag":29,"props":130124,"children":130125},{},[130126],{"type":23,"value":130127},"These credentials are required to implement the OAuth authorization code flow.",{"type":17,"tag":239,"props":130129,"children":130131},{"id":130130},"step-5-implement-the-oauth-20-authorization-code-flow",[130132],{"type":23,"value":130133},"Step 5: Implement the OAuth 2.0 Authorization Code Flow",{"type":17,"tag":29,"props":130135,"children":130136},{},[130137],{"type":23,"value":130138},"Typical SaaS flow:",{"type":17,"tag":6154,"props":130140,"children":130141},{},[130142,130147,130152,130157],{"type":17,"tag":84,"props":130143,"children":130144},{},[130145],{"type":23,"value":130146},"Redirect user to Google's authorization endpoint.",{"type":17,"tag":84,"props":130148,"children":130149},{},[130150],{"type":23,"value":130151},"User consents to requested scopes.",{"type":17,"tag":84,"props":130153,"children":130154},{},[130155],{"type":23,"value":130156},"Google redirects back with an authorization code.",{"type":17,"tag":84,"props":130158,"children":130159},{},[130160,130162],{"type":23,"value":130161},"Backend exchanges the code for:\n",{"type":17,"tag":80,"props":130163,"children":130164},{},[130165,130170],{"type":17,"tag":84,"props":130166,"children":130167},{},[130168],{"type":23,"value":130169},"Access token",{"type":17,"tag":84,"props":130171,"children":130172},{},[130173],{"type":23,"value":130174},"Refresh token",{"type":17,"tag":29,"props":130176,"children":130177},{},[130178,130180,130186],{"type":23,"value":130179},"Google documents the complete process in the ",{"type":17,"tag":133,"props":130181,"children":130183},{"href":129907,"rel":130182},[214],[130184],{"type":23,"value":130185},"OAuth Web Server Flow documentation",{"type":23,"value":54},{"type":17,"tag":29,"props":130188,"children":130189},{},[130190],{"type":23,"value":130191},"Access tokens are short-lived. Your backend must securely store refresh tokens and automatically rotate access tokens when expired.",{"type":17,"tag":68,"props":130193,"children":130195},{"id":130194},"core-gmail-api-endpoints",[130196],{"type":23,"value":130197},"Core Gmail API Endpoints",{"type":17,"tag":29,"props":130199,"children":130200},{},[130201],{"type":23,"value":128925},{"type":17,"tag":6893,"props":130203,"children":130206},{"className":130204,"code":130205,"language":20901,"meta":23},[20899],"Authorization: Bearer {access_token}\n",[130207],{"type":17,"tag":6121,"props":130208,"children":130209},{"__ignoreMap":7},[130210],{"type":23,"value":130205},{"type":17,"tag":239,"props":130212,"children":130214},{"id":130213},"list-labels",[130215],{"type":23,"value":130216},"List Labels",{"type":17,"tag":6893,"props":130218,"children":130221},{"className":130219,"code":130220,"language":20901,"meta":23},[20899],"GET https://gmail.googleapis.com/gmail/v1/users/me/labels\n",[130222],{"type":17,"tag":6121,"props":130223,"children":130224},{"__ignoreMap":7},[130225],{"type":23,"value":130220},{"type":17,"tag":239,"props":130227,"children":130228},{"id":97435},[130229],{"type":23,"value":130230},"List Messages",{"type":17,"tag":6893,"props":130232,"children":130235},{"className":130233,"code":130234,"language":20901,"meta":23},[20899],"GET https://gmail.googleapis.com/gmail/v1/users/me/messages\n",[130236],{"type":17,"tag":6121,"props":130237,"children":130238},{"__ignoreMap":7},[130239],{"type":23,"value":130234},{"type":17,"tag":29,"props":130241,"children":130242},{},[130243],{"type":23,"value":70541},{"type":17,"tag":80,"props":130245,"children":130246},{},[130247,130258,130266],{"type":17,"tag":84,"props":130248,"children":130249},{},[130250,130256],{"type":17,"tag":6121,"props":130251,"children":130253},{"className":130252},[],[130254],{"type":23,"value":130255},"q",{"type":23,"value":130257}," (search query)",{"type":17,"tag":84,"props":130259,"children":130260},{},[130261],{"type":17,"tag":6121,"props":130262,"children":130264},{"className":130263},[],[130265],{"type":23,"value":123943},{"type":17,"tag":84,"props":130267,"children":130268},{},[130269],{"type":17,"tag":6121,"props":130270,"children":130272},{"className":130271},[],[130273],{"type":23,"value":130274},"pageToken",{"type":17,"tag":29,"props":130276,"children":130277},{},[130278,130280],{"type":23,"value":130279},"Reference: ",{"type":17,"tag":133,"props":130281,"children":130284},{"href":130282,"rel":130283},"https://developers.google.com/workspace/gmail/api/reference/rest/v1/users.messages/list",[214],[130285],{"type":23,"value":130286},"users.messages.list documentation",{"type":17,"tag":239,"props":130288,"children":130290},{"id":130289},"get-message",[130291],{"type":23,"value":130292},"Get Message",{"type":17,"tag":6893,"props":130294,"children":130297},{"className":130295,"code":130296,"language":20901,"meta":23},[20899],"GET https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}\n",[130298],{"type":17,"tag":6121,"props":130299,"children":130300},{"__ignoreMap":7},[130301],{"type":23,"value":130296},{"type":17,"tag":29,"props":130303,"children":130304},{},[130305],{"type":23,"value":130306},"You can request different formats:",{"type":17,"tag":80,"props":130308,"children":130309},{},[130310,130318,130327],{"type":17,"tag":84,"props":130311,"children":130312},{},[130313],{"type":17,"tag":6121,"props":130314,"children":130316},{"className":130315},[],[130317],{"type":23,"value":23792},{"type":17,"tag":84,"props":130319,"children":130320},{},[130321],{"type":17,"tag":6121,"props":130322,"children":130324},{"className":130323},[],[130325],{"type":23,"value":130326},"full",{"type":17,"tag":84,"props":130328,"children":130329},{},[130330],{"type":17,"tag":6121,"props":130331,"children":130333},{"className":130332},[],[130334],{"type":23,"value":62389},{"type":17,"tag":29,"props":130336,"children":130337},{},[130338,130339],{"type":23,"value":130279},{"type":17,"tag":133,"props":130340,"children":130343},{"href":130341,"rel":130342},"https://developers.google.com/workspace/gmail/api/reference/rest/v1/users.messages/get",[214],[130344],{"type":23,"value":130345},"users.messages.get documentation",{"type":17,"tag":239,"props":130347,"children":130349},{"id":130348},"send-email",[130350],{"type":23,"value":130351},"Send Email",{"type":17,"tag":6893,"props":130353,"children":130356},{"className":130354,"code":130355,"language":20901,"meta":23},[20899],"POST https://gmail.googleapis.com/gmail/v1/users/me/messages/send\n",[130357],{"type":17,"tag":6121,"props":130358,"children":130359},{"__ignoreMap":7},[130360],{"type":23,"value":130355},{"type":17,"tag":29,"props":130362,"children":130363},{},[130364],{"type":23,"value":130365},"Sending mail requires constructing a properly encoded MIME message and base64url encoding it before submission.",{"type":17,"tag":29,"props":130367,"children":130368},{},[130369,130370],{"type":23,"value":130279},{"type":17,"tag":133,"props":130371,"children":130374},{"href":130372,"rel":130373},"https://developers.google.com/workspace/gmail/api/reference/rest/v1/users.messages/send",[214],[130375],{"type":23,"value":130376},"users.messages.send documentation",{"type":17,"tag":68,"props":130378,"children":130380},{"id":130379},"real-time-sync-stop-polling",[130381],{"type":23,"value":130382},"Real-Time Sync: Stop Polling",{"type":17,"tag":29,"props":130384,"children":130385},{},[130386],{"type":23,"value":130387},"Polling Gmail every 30 seconds will exhaust quota.",{"type":17,"tag":29,"props":130389,"children":130390},{},[130391],{"type":23,"value":130392},"Google provides push-based notifications via Pub/Sub.",{"type":17,"tag":239,"props":130394,"children":130396},{"id":130395},"step-1-configure-pubsub-topic",[130397],{"type":23,"value":130398},"Step 1: Configure Pub/Sub Topic",{"type":17,"tag":29,"props":130400,"children":130401},{},[130402],{"type":23,"value":130403},"Create a Google Cloud Pub/Sub topic.",{"type":17,"tag":239,"props":130405,"children":130407},{"id":130406},"step-2-call-watch",[130408,130410],{"type":23,"value":130409},"Step 2: Call ",{"type":17,"tag":6121,"props":130411,"children":130413},{"className":130412},[],[130414],{"type":23,"value":130415},"watch()",{"type":17,"tag":29,"props":130417,"children":130418},{},[130419],{"type":23,"value":130420},"When a user connects, call:",{"type":17,"tag":6893,"props":130422,"children":130425},{"className":130423,"code":130424,"language":20901,"meta":23},[20899],"POST https://gmail.googleapis.com/gmail/v1/users/me/watch\n",[130426],{"type":17,"tag":6121,"props":130427,"children":130428},{"__ignoreMap":7},[130429],{"type":23,"value":130424},{"type":17,"tag":29,"props":130431,"children":130432},{},[130433],{"type":23,"value":130434},"You must supply your Pub/Sub topic name.",{"type":17,"tag":29,"props":130436,"children":130437},{},[130438,130439],{"type":23,"value":130279},{"type":17,"tag":133,"props":130440,"children":130443},{"href":130441,"rel":130442},"https://developers.google.com/workspace/gmail/api/guides/push",[214],[130444],{"type":23,"value":130445},"Gmail Push Notifications guide",{"type":17,"tag":29,"props":130447,"children":130448},{},[130449],{"type":23,"value":19907},{"type":17,"tag":80,"props":130451,"children":130452},{},[130453,130465],{"type":17,"tag":84,"props":130454,"children":130455},{},[130456,130458,130463],{"type":23,"value":130457},"You must renew ",{"type":17,"tag":6121,"props":130459,"children":130461},{"className":130460},[],[130462],{"type":23,"value":130415},{"type":23,"value":130464}," at least every 7 days.",{"type":17,"tag":84,"props":130466,"children":130467},{},[130468],{"type":23,"value":130469},"Notifications only contain history IDs, not full message content.",{"type":17,"tag":68,"props":130471,"children":130473},{"id":130472},"delta-sync-with-the-history-api",[130474],{"type":23,"value":130475},"Delta Sync with the History API",{"type":17,"tag":29,"props":130477,"children":130478},{},[130479],{"type":23,"value":130480},"For reliable incremental sync:",{"type":17,"tag":6154,"props":130482,"children":130483},{},[130484,130489,130501],{"type":17,"tag":84,"props":130485,"children":130486},{},[130487],{"type":23,"value":130488},"Perform initial full sync.",{"type":17,"tag":84,"props":130490,"children":130491},{},[130492,130494,130500],{"type":23,"value":130493},"Store the returned ",{"type":17,"tag":6121,"props":130495,"children":130497},{"className":130496},[],[130498],{"type":23,"value":130499},"historyId",{"type":23,"value":54},{"type":17,"tag":84,"props":130502,"children":130503},{},[130504],{"type":23,"value":130505},"On notification, call:",{"type":17,"tag":6893,"props":130507,"children":130510},{"className":130508,"code":130509,"language":20901,"meta":23},[20899],"GET https://gmail.googleapis.com/gmail/v1/users/me/history?startHistoryId={id}\n",[130511],{"type":17,"tag":6121,"props":130512,"children":130513},{"__ignoreMap":7},[130514],{"type":23,"value":130509},{"type":17,"tag":29,"props":130516,"children":130517},{},[130518,130519],{"type":23,"value":130279},{"type":17,"tag":133,"props":130520,"children":130523},{"href":130521,"rel":130522},"https://developers.google.com/workspace/gmail/api/reference/rest/v1/users.history/list",[214],[130524],{"type":23,"value":130525},"users.history.list documentation",{"type":17,"tag":29,"props":130527,"children":130528},{},[130529],{"type":23,"value":130530},"The History API returns only deltas:",{"type":17,"tag":80,"props":130532,"children":130533},{},[130534,130539,130544,130549],{"type":17,"tag":84,"props":130535,"children":130536},{},[130537],{"type":23,"value":130538},"messagesAdded",{"type":17,"tag":84,"props":130540,"children":130541},{},[130542],{"type":23,"value":130543},"messagesDeleted",{"type":17,"tag":84,"props":130545,"children":130546},{},[130547],{"type":23,"value":130548},"labelsAdded",{"type":17,"tag":84,"props":130550,"children":130551},{},[130552],{"type":23,"value":130553},"labelsRemoved",{"type":17,"tag":29,"props":130555,"children":130556},{},[130557],{"type":23,"value":130558},"This is essential for high-scale SaaS integrations.",{"type":17,"tag":68,"props":130560,"children":130562},{"id":130561},"quotas-and-rate-limits",[130563],{"type":23,"value":130564},"Quotas and Rate Limits",{"type":17,"tag":29,"props":130566,"children":130567},{},[130568],{"type":23,"value":130569},"Gmail API uses quota units per method.",{"type":17,"tag":29,"props":130571,"children":130572},{},[130573],{"type":23,"value":3258},{"type":17,"tag":80,"props":130575,"children":130576},{},[130577,130582],{"type":17,"tag":84,"props":130578,"children":130579},{},[130580],{"type":23,"value":130581},"Reading a message consumes quota units.",{"type":17,"tag":84,"props":130583,"children":130584},{},[130585],{"type":23,"value":130586},"Sending mail consumes more quota units.",{"type":17,"tag":29,"props":130588,"children":130589},{},[130590,130592],{"type":23,"value":130591},"Quota reference: ",{"type":17,"tag":133,"props":130593,"children":130596},{"href":130594,"rel":130595},"https://developers.google.com/workspace/gmail/api/reference/quota",[214],[130597],{"type":23,"value":130598},"Gmail API Usage Limits",{"type":17,"tag":29,"props":130600,"children":130601},{},[130602],{"type":23,"value":77618},{"type":17,"tag":80,"props":130604,"children":130605},{},[130606,130611,130616],{"type":17,"tag":84,"props":130607,"children":130608},{},[130609],{"type":23,"value":130610},"Implement exponential backoff.",{"type":17,"tag":84,"props":130612,"children":130613},{},[130614],{"type":23,"value":130615},"Use batch requests for large imports.",{"type":17,"tag":84,"props":130617,"children":130618},{},[130619],{"type":23,"value":130620},"Avoid tight polling loops.",{"type":17,"tag":29,"props":130622,"children":130623},{},[130624,130626],{"type":23,"value":130625},"Batch request documentation: ",{"type":17,"tag":133,"props":130627,"children":130630},{"href":130628,"rel":130629},"https://developers.google.com/workspace/gmail/api/guides/batch",[214],[130631],{"type":23,"value":130632},"Gmail API batching guide",{"type":17,"tag":68,"props":130634,"children":130636},{"id":130635},"operational-complexity-of-direct-gmail-integration",[130637],{"type":23,"value":130638},"Operational Complexity of Direct Gmail Integration",{"type":17,"tag":29,"props":130640,"children":130641},{},[130642],{"type":23,"value":130643},"A production-ready Gmail integration requires:",{"type":17,"tag":80,"props":130645,"children":130646},{},[130647,130651,130656,130661,130666,130671,130676,130681,130686,130691],{"type":17,"tag":84,"props":130648,"children":130649},{},[130650],{"type":23,"value":93493},{"type":17,"tag":84,"props":130652,"children":130653},{},[130654],{"type":23,"value":130655},"Secure token encryption at rest",{"type":17,"tag":84,"props":130657,"children":130658},{},[130659],{"type":23,"value":130660},"Refresh token rotation logic",{"type":17,"tag":84,"props":130662,"children":130663},{},[130664],{"type":23,"value":130665},"Handling revoked credentials",{"type":17,"tag":84,"props":130667,"children":130668},{},[130669],{"type":23,"value":130670},"Scope compliance and verification",{"type":17,"tag":84,"props":130672,"children":130673},{},[130674],{"type":23,"value":130675},"Pub/Sub infrastructure",{"type":17,"tag":84,"props":130677,"children":130678},{},[130679],{"type":23,"value":130680},"Delta sync via History API",{"type":17,"tag":84,"props":130682,"children":130683},{},[130684],{"type":23,"value":130685},"MIME parsing and message threading logic",{"type":17,"tag":84,"props":130687,"children":130688},{},[130689],{"type":23,"value":130690},"Rate limit backoff",{"type":17,"tag":84,"props":130692,"children":130693},{},[130694],{"type":23,"value":130695},"Multi-tenant token storage",{"type":17,"tag":29,"props":130697,"children":130698},{},[130699,130701,130707],{"type":23,"value":130700},"If you request Restricted scopes, you must complete Google's security assessment process as outlined in the ",{"type":17,"tag":133,"props":130702,"children":130704},{"href":130037,"rel":130703},[214],[130705],{"type":23,"value":130706},"Restricted Scope Verification documentation",{"type":23,"value":54},{"type":17,"tag":29,"props":130709,"children":130710},{},[130711],{"type":23,"value":130712},"For internal tools, this may be manageable.",{"type":17,"tag":29,"props":130714,"children":130715},{},[130716],{"type":23,"value":130717},"For a multi-tenant SaaS serving thousands of Gmail users, this becomes infrastructure and compliance engineering.",{"type":17,"tag":68,"props":130719,"children":130721},{"id":130720},"integrating-gmail-via-unifieds-messaging-api",[130722],{"type":23,"value":130723},"Integrating Gmail via Unified's Messaging API",{"type":17,"tag":29,"props":130725,"children":130726},{},[130727],{"type":23,"value":130728},"If your product supports Gmail alongside other messaging platforms, maintaining separate OAuth, Pub/Sub, and delta sync logic increases long-term complexity.",{"type":17,"tag":29,"props":130730,"children":130731},{},[130732],{"type":23,"value":130733},"Unified provides a Messaging category integration that standardizes email access.",{"type":17,"tag":239,"props":130735,"children":130736},{"id":126532},[130737],{"type":23,"value":126535},{"type":17,"tag":29,"props":130739,"children":130740},{},[130741],{"type":23,"value":130742},"When integrating Gmail through Unified, configure your redirect URI as:",{"type":17,"tag":6893,"props":130744,"children":130746},{"className":130745,"code":71416,"language":20901,"meta":23},[20899],[130747],{"type":17,"tag":6121,"props":130748,"children":130749},{"__ignoreMap":7},[130750],{"type":23,"value":71416},{"type":17,"tag":29,"props":130752,"children":130753},{},[130754,130756,130763],{"type":23,"value":130755},"Unified's Gmail OAuth guide is available in the ",{"type":17,"tag":133,"props":130757,"children":130760},{"href":130758,"rel":130759},"https://docs.unified.to/guides/how_to_get_your_oauth_2_credentials_for_gmail",[214],[130761],{"type":23,"value":130762},"Gmail OAuth credentials guide",{"type":23,"value":54},{"type":17,"tag":29,"props":130765,"children":130766},{},[130767],{"type":23,"value":130768},"Unified scope mapping includes:",{"type":17,"tag":80,"props":130770,"children":130771},{},[130772,130786,130807],{"type":17,"tag":84,"props":130773,"children":130774},{},[130775,130780,130781],{"type":17,"tag":6121,"props":130776,"children":130778},{"className":130777},[],[130779],{"type":23,"value":98096},{"type":23,"value":98082},{"type":17,"tag":6121,"props":130782,"children":130784},{"className":130783},[],[130785],{"type":23,"value":130020},{"type":17,"tag":84,"props":130787,"children":130788},{},[130789,130794,130795,130801,130802],{"type":17,"tag":6121,"props":130790,"children":130792},{"className":130791},[],[130793],{"type":23,"value":98111},{"type":23,"value":98082},{"type":17,"tag":6121,"props":130796,"children":130798},{"className":130797},[],[130799],{"type":23,"value":130800},"gmail.compose",{"type":23,"value":11826},{"type":17,"tag":6121,"props":130803,"children":130805},{"className":130804},[],[130806],{"type":23,"value":130027},{"type":17,"tag":84,"props":130808,"children":130809},{},[130810,130812,130817,130818,130823,130824],{"type":23,"value":130811},"Identity scopes: ",{"type":17,"tag":6121,"props":130813,"children":130815},{"className":130814},[],[130816],{"type":23,"value":98191},{"type":23,"value":11826},{"type":17,"tag":6121,"props":130819,"children":130821},{"className":130820},[],[130822],{"type":23,"value":98204},{"type":23,"value":11826},{"type":17,"tag":6121,"props":130825,"children":130827},{"className":130826},[],[130828],{"type":23,"value":62666},{"type":17,"tag":239,"props":130830,"children":130832},{"id":130831},"step-2-activate-gmail-in-unified",[130833],{"type":23,"value":130834},"Step 2: Activate Gmail in Unified",{"type":17,"tag":29,"props":130836,"children":130837},{},[130838],{"type":23,"value":129339},{"type":17,"tag":6154,"props":130840,"children":130841},{},[130842,130847,130852,130857],{"type":17,"tag":84,"props":130843,"children":130844},{},[130845],{"type":23,"value":130846},"Activate Gmail.",{"type":17,"tag":84,"props":130848,"children":130849},{},[130850],{"type":23,"value":130851},"Enter Client ID and Client Secret.",{"type":17,"tag":84,"props":130853,"children":130854},{},[130855],{"type":23,"value":130856},"Authorize a user.",{"type":17,"tag":84,"props":130858,"children":130859},{},[130860,130861,130866],{"type":23,"value":98241},{"type":17,"tag":6121,"props":130862,"children":130864},{"className":130863},[],[130865],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":239,"props":130868,"children":130869},{"id":98263},[130870],{"type":23,"value":98266},{"type":17,"tag":29,"props":130872,"children":130873},{},[130874],{"type":23,"value":19878},{"type":17,"tag":6893,"props":130876,"children":130879},{"className":130877,"code":130878,"language":48432,"meta":7},[48430],"GET https://api.unified.to/messaging/message/{connection_id}?limit=50\nAuthorization: Bearer YOUR_API_KEY\n",[130880],{"type":17,"tag":6121,"props":130881,"children":130882},{"__ignoreMap":7},[130883],{"type":23,"value":130878},{"type":17,"tag":29,"props":130885,"children":130886},{},[130887],{"type":23,"value":71967},{"type":17,"tag":80,"props":130889,"children":130890},{},[130891,130895,130899,130903,130907],{"type":17,"tag":84,"props":130892,"children":130893},{},[130894],{"type":23,"value":11243},{"type":17,"tag":84,"props":130896,"children":130897},{},[130898],{"type":23,"value":11832},{"type":17,"tag":84,"props":130900,"children":130901},{},[130902],{"type":23,"value":11254},{"type":17,"tag":84,"props":130904,"children":130905},{},[130906],{"type":23,"value":11845},{"type":17,"tag":84,"props":130908,"children":130909},{},[130910],{"type":23,"value":11852},{"type":17,"tag":29,"props":130912,"children":130913},{},[130914],{"type":23,"value":130915},"Readable fields include:",{"type":17,"tag":80,"props":130917,"children":130918},{},[130919,130923,130927,130931,130935,130939,130943,130948,130952],{"type":17,"tag":84,"props":130920,"children":130921},{},[130922],{"type":23,"value":18766},{"type":17,"tag":84,"props":130924,"children":130925},{},[130926],{"type":23,"value":24666},{"type":17,"tag":84,"props":130928,"children":130929},{},[130930],{"type":23,"value":24872},{"type":17,"tag":84,"props":130932,"children":130933},{},[130934],{"type":23,"value":76790},{"type":17,"tag":84,"props":130936,"children":130937},{},[130938],{"type":23,"value":33472},{"type":17,"tag":84,"props":130940,"children":130941},{},[130942],{"type":23,"value":33446},{"type":17,"tag":84,"props":130944,"children":130945},{},[130946],{"type":23,"value":130947},"channel_id",{"type":17,"tag":84,"props":130949,"children":130950},{},[130951],{"type":23,"value":15863},{"type":17,"tag":84,"props":130953,"children":130954},{},[130955],{"type":23,"value":130956},"root_message_id",{"type":17,"tag":29,"props":130958,"children":130959},{},[130960],{"type":23,"value":117890},{"type":17,"tag":80,"props":130962,"children":130963},{},[130964,130968,130972,130976,130980],{"type":17,"tag":84,"props":130965,"children":130966},{},[130967],{"type":23,"value":24666},{"type":17,"tag":84,"props":130969,"children":130970},{},[130971],{"type":23,"value":24872},{"type":17,"tag":84,"props":130973,"children":130974},{},[130975],{"type":23,"value":76790},{"type":17,"tag":84,"props":130977,"children":130978},{},[130979],{"type":23,"value":33472},{"type":17,"tag":84,"props":130981,"children":130982},{},[130983],{"type":23,"value":24853},{"type":17,"tag":29,"props":130985,"children":130986},{},[130987],{"type":23,"value":130988},"Unified delivers change events using virtual webhooks:",{"type":17,"tag":80,"props":130990,"children":130991},{},[130992,130996,131000],{"type":17,"tag":84,"props":130993,"children":130994},{},[130995],{"type":23,"value":109207},{"type":17,"tag":84,"props":130997,"children":130998},{},[130999],{"type":23,"value":109214},{"type":17,"tag":84,"props":131001,"children":131002},{},[131003],{"type":23,"value":109221},{"type":17,"tag":29,"props":131005,"children":131006},{},[131007],{"type":23,"value":131008},"This allows webhook-style behavior without requiring you to build Pub/Sub consumers directly.",{"type":17,"tag":68,"props":131010,"children":131011},{"id":72006},[131012],{"type":23,"value":129510},{"type":17,"tag":239,"props":131014,"children":131015},{"id":129513},[131016],{"type":23,"value":129516},{"type":17,"tag":80,"props":131018,"children":131019},{},[131020,131025,131030],{"type":17,"tag":84,"props":131021,"children":131022},{},[131023],{"type":23,"value":131024},"Gmail is your only messaging integration",{"type":17,"tag":84,"props":131026,"children":131027},{},[131028],{"type":23,"value":131029},"You need deep Gmail-specific functionality",{"type":17,"tag":84,"props":131031,"children":131032},{},[131033],{"type":23,"value":131034},"You want full control over OAuth and Pub/Sub infrastructure",{"type":17,"tag":239,"props":131036,"children":131037},{"id":72041},[131038],{"type":23,"value":129539},{"type":17,"tag":80,"props":131040,"children":131041},{},[131042,131047,131052,131057,131062],{"type":17,"tag":84,"props":131043,"children":131044},{},[131045],{"type":23,"value":131046},"You support multiple messaging platforms",{"type":17,"tag":84,"props":131048,"children":131049},{},[131050],{"type":23,"value":131051},"You want standardized message models",{"type":17,"tag":84,"props":131053,"children":131054},{},[131055],{"type":23,"value":131056},"You prefer not to maintain OAuth lifecycle logic",{"type":17,"tag":84,"props":131058,"children":131059},{},[131060],{"type":23,"value":131061},"You want webhook-style delivery without managing Pub/Sub",{"type":17,"tag":84,"props":131063,"children":131064},{},[131065],{"type":23,"value":129567},{"type":17,"tag":68,"props":131067,"children":131068},{"id":1552},[131069],{"type":23,"value":44411},{"type":17,"tag":29,"props":131071,"children":131072},{},[131073],{"type":23,"value":131074},"A Gmail API integration can add enormous value to a B2B SaaS product.",{"type":17,"tag":29,"props":131076,"children":131077},{},[131078],{"type":23,"value":131079},"The complexity lies not in listing messages, but in managing authentication, compliance, delta sync, real-time change detection, and multi-tenant reliability.",{"type":17,"tag":29,"props":131081,"children":131082},{},[131083],{"type":23,"value":131084},"Choosing the right architecture early determines how quickly you ship — and how much infrastructure you own over time.",{"type":17,"tag":29,"props":131086,"children":131087},{},[131088],{"type":17,"tag":133,"props":131089,"children":131091},{"href":1612,"rel":131090},[214],[131092],{"type":23,"value":44481},{"type":17,"tag":29,"props":131094,"children":131095},{},[131096],{"type":17,"tag":133,"props":131097,"children":131099},{"href":1623,"rel":131098},[214],[131100],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":131102},[131103,131110,131116,131121,131122,131123,131124,131129,131133],{"id":129755,"depth":1629,"text":129758,"children":131104},[131105,131106,131107,131108,131109],{"id":129761,"depth":1635,"text":129764},{"id":127328,"depth":1635,"text":129838},{"id":129920,"depth":1635,"text":129923},{"id":130057,"depth":1635,"text":130060},{"id":130130,"depth":1635,"text":130133},{"id":130194,"depth":1629,"text":130197,"children":131111},[131112,131113,131114,131115],{"id":130213,"depth":1635,"text":130216},{"id":97435,"depth":1635,"text":130230},{"id":130289,"depth":1635,"text":130292},{"id":130348,"depth":1635,"text":130351},{"id":130379,"depth":1629,"text":130382,"children":131117},[131118,131119],{"id":130395,"depth":1635,"text":130398},{"id":130406,"depth":1635,"text":131120},"Step 2: Call watch()",{"id":130472,"depth":1629,"text":130475},{"id":130561,"depth":1629,"text":130564},{"id":130635,"depth":1629,"text":130638},{"id":130720,"depth":1629,"text":130723,"children":131125},[131126,131127,131128],{"id":126532,"depth":1635,"text":126535},{"id":130831,"depth":1635,"text":130834},{"id":98263,"depth":1635,"text":98266},{"id":72006,"depth":1629,"text":129510,"children":131130},[131131,131132],{"id":129513,"depth":1635,"text":129516},{"id":72041,"depth":1635,"text":129539},{"id":1552,"depth":1629,"text":44411},"content:blog:how_to_integrate_with_gmail_api_a_step_by_step_guide_for_developers.md","blog/how_to_integrate_with_gmail_api_a_step_by_step_guide_for_developers.md","blog/how_to_integrate_with_gmail_api_a_step_by_step_guide_for_developers",{"_path":131138,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":131139,"description":131140,"img":131141,"date":131142,"tag":12,"body":131143,"_type":1677,"_id":131917,"_source":1679,"_file":131918,"_stem":131919,"_extension":1682},"/blog/how_to_build_an_ai_sdr_agent_with_unified_mcp","How to Build an AI SDR Agent with Unified MCP","Modern B2B SaaS products don't just display CRM data. They qualify leads, enrich accounts, draft outreach, log activity, schedule meetings, and update pipeline...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_ai_sdr_agent_with_unified_mcp-icon.png","2026-02-25T23:59:00.000Z",{"type":14,"children":131144,"toc":131905},[131145,131150,131153,131161,131166,131171,131182,131187,131192,131198,131203,131226,131234,131245,131250,131255,131261,131266,131271,131289,131294,131299,131305,131310,131314,131327,131332,131355,131360,131373,131378,131384,131389,131393,131411,131416,131444,131449,131467,131472,131478,131483,131501,131506,131524,131529,131552,131557,131563,131568,131573,131578,131613,131618,131624,131629,131634,131639,131662,131667,131673,131678,131706,131718,131746,131751,131757,131762,131780,131785,131813,131823,131828,131834,131839,131884,131889,131897],{"type":17,"tag":18,"props":131146,"children":131148},{"id":131147},"how-to-build-an-ai-sdr-agent-with-unified-mcp",[131149],{"type":23,"value":131139},{"type":17,"tag":25,"props":131151,"children":131152},{},[],{"type":17,"tag":29,"props":131154,"children":131155},{},[131156],{"type":17,"tag":33,"props":131157,"children":131158},{},[131159],{"type":23,"value":131160},"February 25, 2026",{"type":17,"tag":29,"props":131162,"children":131163},{},[131164],{"type":23,"value":131165},"Modern B2B SaaS products don't just display CRM data. They qualify leads, enrich accounts, draft outreach, log activity, schedule meetings, and update pipeline stages.",{"type":17,"tag":29,"props":131167,"children":131168},{},[131169],{"type":23,"value":131170},"If you're embedding AI into a revenue workflow inside your product, your agent must read and write across CRM, Enrichment, Messaging, Calendar, and Task systems — without building and maintaining each integration separately.",{"type":17,"tag":29,"props":131172,"children":131173},{},[131174,131176,131180],{"type":23,"value":131175},"This is where [Unified ",{"type":17,"tag":133,"props":131177,"children":131178},{"href":326},[131179],{"type":23,"value":329},{"type":23,"value":131181},"](/mcp) comes in.",{"type":17,"tag":29,"props":131183,"children":131184},{},[131185],{"type":23,"value":131186},"Unified's category APIs provide normalized, real-time access to CRM, Enrichment, Messaging, Calendar & Meetings, and Task Management platforms. Unified MCP allows LLMs to call those operations as structured tools.",{"type":17,"tag":29,"props":131188,"children":131189},{},[131190],{"type":23,"value":131191},"This guide explains how to architect a production-safe AI SDR agent using Unified MCP.",{"type":17,"tag":68,"props":131193,"children":131195},{"id":131194},"what-an-sdr-agent-actually-does",[131196],{"type":23,"value":131197},"What an SDR Agent Actually Does",{"type":17,"tag":29,"props":131199,"children":131200},{},[131201],{"type":23,"value":131202},"An embedded AI SDR agent typically performs four stages:",{"type":17,"tag":6154,"props":131204,"children":131205},{},[131206,131211,131216,131221],{"type":17,"tag":84,"props":131207,"children":131208},{},[131209],{"type":23,"value":131210},"Lead research and enrichment",{"type":17,"tag":84,"props":131212,"children":131213},{},[131214],{"type":23,"value":131215},"Outreach and activity logging",{"type":17,"tag":84,"props":131217,"children":131218},{},[131219],{"type":23,"value":131220},"Meeting scheduling",{"type":17,"tag":84,"props":131222,"children":131223},{},[131224],{"type":23,"value":131225},"Follow-up and pipeline updates",{"type":17,"tag":29,"props":131227,"children":131228},{},[131229],{"type":17,"tag":48,"props":131230,"children":131231},{},[131232],{"type":23,"value":131233},"Execution model:",{"type":17,"tag":29,"props":131235,"children":131236},{},[131237,131239,131243],{"type":23,"value":131238},"Webhook or user trigger → LLM reasoning → MCP tool calls → ",{"type":17,"tag":133,"props":131240,"children":131241},{"href":7691},[131242],{"type":23,"value":7806},{"type":23,"value":131244}," → Source systems",{"type":17,"tag":29,"props":131246,"children":131247},{},[131248],{"type":23,"value":131249},"Unified MCP executes structured tool calls. Webhooks trigger the agent. All calls are real-time pass-through requests to the underlying provider.",{"type":17,"tag":29,"props":131251,"children":131252},{},[131253],{"type":23,"value":131254},"No CRM, email, or meeting data is cached or stored.",{"type":17,"tag":68,"props":131256,"children":131258},{"id":131257},"stage-1-lead-research-and-enrichment",[131259],{"type":23,"value":131260},"Stage 1: Lead Research and Enrichment",{"type":17,"tag":29,"props":131262,"children":131263},{},[131264],{"type":23,"value":131265},"This stage gathers account and contact context before outreach.",{"type":17,"tag":29,"props":131267,"children":131268},{},[131269],{"type":23,"value":131270},"Typical tools:",{"type":17,"tag":80,"props":131272,"children":131273},{},[131274,131279,131284],{"type":17,"tag":84,"props":131275,"children":131276},{},[131277],{"type":23,"value":131278},"CRM company and contact retrieval",{"type":17,"tag":84,"props":131280,"children":131281},{},[131282],{"type":23,"value":131283},"CRM deal or lead listing",{"type":17,"tag":84,"props":131285,"children":131286},{},[131287],{"type":23,"value":131288},"Enrichment company and person lookup",{"type":17,"tag":29,"props":131290,"children":131291},{},[131292],{"type":23,"value":131293},"Enrichment is read-only. The Enrichment API exposes only person and company retrieval endpoints and does not support writes. It augments CRM data without mutating customer systems.",{"type":17,"tag":29,"props":131295,"children":131296},{},[131297],{"type":23,"value":131298},"CRM objects support full CRUD in the unified specification, but stage and status semantics vary by provider. At this stage, the agent performs only reads.",{"type":17,"tag":68,"props":131300,"children":131302},{"id":131301},"stage-2-outreach-and-activity-logging",[131303],{"type":23,"value":131304},"Stage 2: Outreach and Activity Logging",{"type":17,"tag":29,"props":131306,"children":131307},{},[131308],{"type":23,"value":131309},"Once a lead is qualified, the agent drafts and sends outreach.",{"type":17,"tag":29,"props":131311,"children":131312},{},[131313],{"type":23,"value":131270},{"type":17,"tag":80,"props":131315,"children":131316},{},[131317,131322],{"type":17,"tag":84,"props":131318,"children":131319},{},[131320],{"type":23,"value":131321},"Messaging message create",{"type":17,"tag":84,"props":131323,"children":131324},{},[131325],{"type":23,"value":131326},"CRM event (activity) create",{"type":17,"tag":29,"props":131328,"children":131329},{},[131330],{"type":23,"value":131331},"Messaging provider constraints matter:",{"type":17,"tag":80,"props":131333,"children":131334},{},[131335,131340,131345,131350],{"type":17,"tag":84,"props":131336,"children":131337},{},[131338],{"type":23,"value":131339},"Slack supports create/update/delete but only for messages authored by the bot or user.",{"type":17,"tag":84,"props":131341,"children":131342},{},[131343],{"type":23,"value":131344},"Teams supports create and limited update; delete is not supported via Unified.",{"type":17,"tag":84,"props":131346,"children":131347},{},[131348],{"type":23,"value":131349},"Gmail supports send and delete; sent content cannot be edited.",{"type":17,"tag":84,"props":131351,"children":131352},{},[131353],{"type":23,"value":131354},"Outlook supports editing drafts; sent body and subject are immutable.",{"type":17,"tag":29,"props":131356,"children":131357},{},[131358],{"type":23,"value":131359},"CRM activity logging varies by provider:",{"type":17,"tag":80,"props":131361,"children":131362},{},[131363,131368],{"type":17,"tag":84,"props":131364,"children":131365},{},[131366],{"type":23,"value":131367},"HubSpot, Salesforce, and Pipedrive support rich activity logging.",{"type":17,"tag":84,"props":131369,"children":131370},{},[131371],{"type":23,"value":131372},"Some providers do not expose an event object.",{"type":17,"tag":29,"props":131374,"children":131375},{},[131376],{"type":23,"value":131377},"Write behavior must respect provider capability.",{"type":17,"tag":68,"props":131379,"children":131381},{"id":131380},"stage-3-meeting-scheduling",[131382],{"type":23,"value":131383},"Stage 3: Meeting Scheduling",{"type":17,"tag":29,"props":131385,"children":131386},{},[131387],{"type":23,"value":131388},"When a prospect responds positively, the agent schedules a meeting.",{"type":17,"tag":29,"props":131390,"children":131391},{},[131392],{"type":23,"value":131270},{"type":17,"tag":80,"props":131394,"children":131395},{},[131396,131401,131406],{"type":17,"tag":84,"props":131397,"children":131398},{},[131399],{"type":23,"value":131400},"Calendar free/busy lookup",{"type":17,"tag":84,"props":131402,"children":131403},{},[131404],{"type":23,"value":131405},"Calendar event create",{"type":17,"tag":84,"props":131407,"children":131408},{},[131409],{"type":23,"value":131410},"CRM event create (to log the meeting)",{"type":17,"tag":29,"props":131412,"children":131413},{},[131414],{"type":23,"value":131415},"Calendar supports:",{"type":17,"tag":80,"props":131417,"children":131418},{},[131419,131424,131429,131434,131439],{"type":17,"tag":84,"props":131420,"children":131421},{},[131422],{"type":23,"value":131423},"Free/busy retrieval",{"type":17,"tag":84,"props":131425,"children":131426},{},[131427],{"type":23,"value":131428},"Event create/update/delete",{"type":17,"tag":84,"props":131430,"children":131431},{},[131432],{"type":23,"value":131433},"Recurrence patterns",{"type":17,"tag":84,"props":131435,"children":131436},{},[131437],{"type":23,"value":131438},"Attendee lists and RSVP status",{"type":17,"tag":84,"props":131440,"children":131441},{},[131442],{"type":23,"value":131443},"Cancellation via status or delete",{"type":17,"tag":29,"props":131445,"children":131446},{},[131447],{"type":23,"value":131448},"Provider variability applies:",{"type":17,"tag":80,"props":131450,"children":131451},{},[131452,131457,131462],{"type":17,"tag":84,"props":131453,"children":131454},{},[131455],{"type":23,"value":131456},"Some providers are read-only for events.",{"type":17,"tag":84,"props":131458,"children":131459},{},[131460],{"type":23,"value":131461},"Some lack free/busy endpoints.",{"type":17,"tag":84,"props":131463,"children":131464},{},[131465],{"type":23,"value":131466},"Recurrence modification support differs.",{"type":17,"tag":29,"props":131468,"children":131469},{},[131470],{"type":23,"value":131471},"Scheduling logic must check provider capability before attempting writes.",{"type":17,"tag":68,"props":131473,"children":131475},{"id":131474},"stage-4-follow-up-and-pipeline-updates",[131476],{"type":23,"value":131477},"Stage 4: Follow-Up and Pipeline Updates",{"type":17,"tag":29,"props":131479,"children":131480},{},[131481],{"type":23,"value":131482},"After the meeting, the agent may:",{"type":17,"tag":80,"props":131484,"children":131485},{},[131486,131491,131496],{"type":17,"tag":84,"props":131487,"children":131488},{},[131489],{"type":23,"value":131490},"Update deal stage",{"type":17,"tag":84,"props":131492,"children":131493},{},[131494],{"type":23,"value":131495},"Update lead status",{"type":17,"tag":84,"props":131497,"children":131498},{},[131499],{"type":23,"value":131500},"Create a follow-up task",{"type":17,"tag":29,"props":131502,"children":131503},{},[131504],{"type":23,"value":131505},"CRM write support varies:",{"type":17,"tag":80,"props":131507,"children":131508},{},[131509,131514,131519],{"type":17,"tag":84,"props":131510,"children":131511},{},[131512],{"type":23,"value":131513},"Some providers allow stage and status mutation.",{"type":17,"tag":84,"props":131515,"children":131516},{},[131517],{"type":23,"value":131518},"Some expose stage as read-only.",{"type":17,"tag":84,"props":131520,"children":131521},{},[131522],{"type":23,"value":131523},"Custom field support differs by provider.",{"type":17,"tag":29,"props":131525,"children":131526},{},[131527],{"type":23,"value":131528},"Task write behavior also varies:",{"type":17,"tag":80,"props":131530,"children":131531},{},[131532,131537,131542,131547],{"type":17,"tag":84,"props":131533,"children":131534},{},[131535],{"type":23,"value":131536},"Some providers require status on create.",{"type":17,"tag":84,"props":131538,"children":131539},{},[131540],{"type":23,"value":131541},"Some restrict status updates.",{"type":17,"tag":84,"props":131543,"children":131544},{},[131545],{"type":23,"value":131546},"Assignment is broadly supported.",{"type":17,"tag":84,"props":131548,"children":131549},{},[131550],{"type":23,"value":131551},"Deletion semantics differ.",{"type":17,"tag":29,"props":131553,"children":131554},{},[131555],{"type":23,"value":131556},"Unified normalizes schema. Provider constraints still apply at execution time.",{"type":17,"tag":68,"props":131558,"children":131560},{"id":131559},"model-tool-limits-and-production-design",[131561],{"type":23,"value":131562},"Model Tool Limits and Production Design",{"type":17,"tag":29,"props":131564,"children":131565},{},[131566],{"type":23,"value":131567},"Most LLM providers impose strict limits on how many tools can be loaded at once.",{"type":17,"tag":29,"props":131569,"children":131570},{},[131571],{"type":23,"value":131572},"Exposing the full CRM, Calendar, Messaging, Enrichment, and Task categories simultaneously will exceed those limits.",{"type":17,"tag":29,"props":131574,"children":131575},{},[131576],{"type":23,"value":131577},"In production, restrict tool exposure using:",{"type":17,"tag":80,"props":131579,"children":131580},{},[131581,131591,131602],{"type":17,"tag":84,"props":131582,"children":131583},{},[131584,131589],{"type":17,"tag":6121,"props":131585,"children":131587},{"className":131586},[],[131588],{"type":23,"value":24204},{"type":23,"value":131590}," to scope allowed operations",{"type":17,"tag":84,"props":131592,"children":131593},{},[131594,131600],{"type":17,"tag":6121,"props":131595,"children":131597},{"className":131596},[],[131598],{"type":23,"value":131599},"tools",{"type":23,"value":131601}," to allowlist specific tool IDs",{"type":17,"tag":84,"props":131603,"children":131604},{},[131605,131611],{"type":17,"tag":6121,"props":131606,"children":131608},{"className":131607},[],[131609],{"type":23,"value":131610},"defer_tools",{"type":23,"value":131612}," to reduce initial tool tokenization where supported",{"type":17,"tag":29,"props":131614,"children":131615},{},[131616],{"type":23,"value":131617},"Design the SDR agent in stage-based bundles. Only load the tools required for the current workflow.",{"type":17,"tag":68,"props":131619,"children":131621},{"id":131620},"webhooks-and-event-triggers",[131622],{"type":23,"value":131623},"Webhooks and Event Triggers",{"type":17,"tag":29,"props":131625,"children":131626},{},[131627],{"type":23,"value":131628},"Native and virtual webhooks are available across CRM and Messaging integrations, depending on provider.",{"type":17,"tag":29,"props":131630,"children":131631},{},[131632],{"type":23,"value":131633},"CRM providers may emit created and updated events for deals, contacts, and leads. Stage changes are treated as update events.",{"type":17,"tag":29,"props":131635,"children":131636},{},[131637],{"type":23,"value":131638},"Messaging providers vary:",{"type":17,"tag":80,"props":131640,"children":131641},{},[131642,131647,131652,131657],{"type":17,"tag":84,"props":131643,"children":131644},{},[131645],{"type":23,"value":131646},"Slack supports native events for new messages.",{"type":17,"tag":84,"props":131648,"children":131649},{},[131650],{"type":23,"value":131651},"LinkedIn supports reactions, comments, edits, and deletions.",{"type":17,"tag":84,"props":131653,"children":131654},{},[131655],{"type":23,"value":131656},"Teams supports created and updated events.",{"type":17,"tag":84,"props":131658,"children":131659},{},[131660],{"type":23,"value":131661},"Many providers rely on virtual webhooks (poll-based).",{"type":17,"tag":29,"props":131663,"children":131664},{},[131665],{"type":23,"value":131666},"Webhooks trigger the SDR agent. MCP executes the resulting actions.",{"type":17,"tag":68,"props":131668,"children":131670},{"id":131669},"compliance-and-data-handling",[131671],{"type":23,"value":131672},"Compliance and Data Handling",{"type":17,"tag":29,"props":131674,"children":131675},{},[131676],{"type":23,"value":131677},"Unified operates a zero-storage, stateless architecture.",{"type":17,"tag":80,"props":131679,"children":131680},{},[131681,131686,131691,131696,131701],{"type":17,"tag":84,"props":131682,"children":131683},{},[131684],{"type":23,"value":131685},"All API calls are real-time pass-through.",{"type":17,"tag":84,"props":131687,"children":131688},{},[131689],{"type":23,"value":131690},"Customer data is not stored at rest.",{"type":17,"tag":84,"props":131692,"children":131693},{},[131694],{"type":23,"value":131695},"Minimal operational metadata is encrypted.",{"type":17,"tag":84,"props":131697,"children":131698},{},[131699],{"type":23,"value":131700},"Logs are retained for 60 days.",{"type":17,"tag":84,"props":131702,"children":131703},{},[131704],{"type":23,"value":131705},"Regional routing (US/EU/AU) supports data residency requirements.",{"type":17,"tag":29,"props":131707,"children":131708},{},[131709,131710,131716],{"type":23,"value":6712},{"type":17,"tag":6121,"props":131711,"children":131713},{"className":131712},[],[131714],{"type":23,"value":131715},"hide_sensitive",{"type":23,"value":131717}," parameter redacts:",{"type":17,"tag":80,"props":131719,"children":131720},{},[131721,131726,131731,131736,131741],{"type":17,"tag":84,"props":131722,"children":131723},{},[131724],{"type":23,"value":131725},"Names",{"type":17,"tag":84,"props":131727,"children":131728},{},[131729],{"type":23,"value":131730},"Email addresses",{"type":17,"tag":84,"props":131732,"children":131733},{},[131734],{"type":23,"value":131735},"Telephone numbers",{"type":17,"tag":84,"props":131737,"children":131738},{},[131739],{"type":23,"value":131740},"Social security numbers",{"type":17,"tag":84,"props":131742,"children":131743},{},[131744],{"type":23,"value":131745},"Financial data",{"type":17,"tag":29,"props":131747,"children":131748},{},[131749],{"type":23,"value":131750},"Message bodies and document URLs are not documented as redacted. Agents should avoid exposing unnecessary PII to the model.",{"type":17,"tag":68,"props":131752,"children":131754},{"id":131753},"api-vs-mcp-for-sdr-agents",[131755],{"type":23,"value":131756},"API vs MCP for SDR Agents",{"type":17,"tag":29,"props":131758,"children":131759},{},[131760],{"type":23,"value":131761},"Use Unified APIs directly when:",{"type":17,"tag":80,"props":131763,"children":131764},{},[131765,131770,131775],{"type":17,"tag":84,"props":131766,"children":131767},{},[131768],{"type":23,"value":131769},"Your backend runs deterministic scoring logic.",{"type":17,"tag":84,"props":131771,"children":131772},{},[131773],{"type":23,"value":131774},"You batch-process enrichment.",{"type":17,"tag":84,"props":131776,"children":131777},{},[131778],{"type":23,"value":131779},"You orchestrate CRM updates without model decision-making.",{"type":17,"tag":29,"props":131781,"children":131782},{},[131783],{"type":23,"value":131784},"Use Unified MCP when:",{"type":17,"tag":80,"props":131786,"children":131787},{},[131788,131793,131798,131803,131808],{"type":17,"tag":84,"props":131789,"children":131790},{},[131791],{"type":23,"value":131792},"The LLM decides which action to take.",{"type":17,"tag":84,"props":131794,"children":131795},{},[131796],{"type":23,"value":131797},"The agent drafts and sends outreach.",{"type":17,"tag":84,"props":131799,"children":131800},{},[131801],{"type":23,"value":131802},"The model advances deal stages.",{"type":17,"tag":84,"props":131804,"children":131805},{},[131806],{"type":23,"value":131807},"The assistant schedules meetings.",{"type":17,"tag":84,"props":131809,"children":131810},{},[131811],{"type":23,"value":131812},"The agent creates follow-up tasks.",{"type":17,"tag":29,"props":131814,"children":131815},{},[131816,131821],{"type":17,"tag":48,"props":131817,"children":131818},{},[131819],{"type":23,"value":131820},"Execution remains:",{"type":23,"value":131822}," User → LLM → Tool call → Unified API → Source system",{"type":17,"tag":29,"props":131824,"children":131825},{},[131826],{"type":23,"value":131827},"The difference is who selects the action.",{"type":17,"tag":68,"props":131829,"children":131831},{"id":131830},"production-checklist",[131832],{"type":23,"value":131833},"Production Checklist",{"type":17,"tag":29,"props":131835,"children":131836},{},[131837],{"type":23,"value":131838},"A production-ready AI SDR agent should:",{"type":17,"tag":80,"props":131840,"children":131841},{},[131842,131847,131852,131857,131862,131867,131879],{"type":17,"tag":84,"props":131843,"children":131844},{},[131845],{"type":23,"value":131846},"Use stage-specific tool bundles.",{"type":17,"tag":84,"props":131848,"children":131849},{},[131850],{"type":23,"value":131851},"Restrict tool exposure per workflow.",{"type":17,"tag":84,"props":131853,"children":131854},{},[131855],{"type":23,"value":131856},"Respect CRM and messaging provider variability.",{"type":17,"tag":84,"props":131858,"children":131859},{},[131860],{"type":23,"value":131861},"Handle rate limits and pagination.",{"type":17,"tag":84,"props":131863,"children":131864},{},[131865],{"type":23,"value":131866},"Use webhooks for event triggers.",{"type":17,"tag":84,"props":131868,"children":131869},{},[131870,131872,131877],{"type":23,"value":131871},"Apply ",{"type":17,"tag":6121,"props":131873,"children":131875},{"className":131874},[],[131876],{"type":23,"value":131715},{"type":23,"value":131878}," where required.",{"type":17,"tag":84,"props":131880,"children":131881},{},[131882],{"type":23,"value":131883},"Require human approval for high-impact changes.",{"type":17,"tag":29,"props":131885,"children":131886},{},[131887],{"type":23,"value":131888},"When designed this way, Unified MCP enables real-time, agent-executable SDR workflows across CRM, Enrichment, Messaging, Calendar, and Task systems — without building per-provider integrations and without storing customer data.",{"type":17,"tag":29,"props":131890,"children":131891},{},[131892],{"type":17,"tag":133,"props":131893,"children":131895},{"href":1612,"rel":131894},[214],[131896],{"type":23,"value":44481},{"type":17,"tag":29,"props":131898,"children":131899},{},[131900],{"type":17,"tag":133,"props":131901,"children":131903},{"href":1623,"rel":131902},[214],[131904],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":131906},[131907,131908,131909,131910,131911,131912,131913,131914,131915,131916],{"id":131194,"depth":1629,"text":131197},{"id":131257,"depth":1629,"text":131260},{"id":131301,"depth":1629,"text":131304},{"id":131380,"depth":1629,"text":131383},{"id":131474,"depth":1629,"text":131477},{"id":131559,"depth":1629,"text":131562},{"id":131620,"depth":1629,"text":131623},{"id":131669,"depth":1629,"text":131672},{"id":131753,"depth":1629,"text":131756},{"id":131830,"depth":1629,"text":131833},"content:blog:how_to_build_an_ai_sdr_agent_with_unified_mcp.md","blog/how_to_build_an_ai_sdr_agent_with_unified_mcp.md","blog/how_to_build_an_ai_sdr_agent_with_unified_mcp",{"_path":131921,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":131922,"description":131923,"img":131924,"date":131925,"tag":12,"body":131926,"_type":1677,"_id":133048,"_source":1679,"_file":133049,"_stem":133050,"_extension":1682},"/blog/how_to_build_a_candidate_portal_showing_real_time_interview_stages_using_unified_ats_api","How to Build a Candidate Portal Showing Real-Time Interview Stages Using Unified's ATS API","Candidates increasingly expect visibility into their application progress.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_candidate_portal_showing_real_time_interview_stages_using_unified_ats_api-icon.png","2026-02-25T19:16:00.000Z",{"type":14,"children":131927,"toc":133024},[131928,131933,131936,131943,131947,131952,131980,131985,132008,132018,132023,132045,132050,132056,132061,132112,132123,132128,132134,132139,132145,132154,132159,132168,132181,132234,132240,132245,132254,132259,132268,132273,132285,132291,132296,132305,132311,132320,132330,132357,132362,132380,132385,132391,132396,132401,132406,132415,132420,132429,132440,132475,132481,132486,132494,132515,132523,132535,132543,132555,132560,132578,132583,132589,132594,132612,132617,132623,132632,132638,132647,132652,132675,132680,132686,132691,132700,132721,132725,132734,132739,132755,132760,132766,132771,132780,132784,132797,132803,132808,132816,132834,132842,132858,132866,132892,132897,132903,132931,132936,132942,132947,132969,132974,133003,133008,133016],{"type":17,"tag":18,"props":131929,"children":131931},{"id":131930},"how-to-build-a-candidate-portal-showing-real-time-interview-stages-using-unifieds-ats-api",[131932],{"type":23,"value":131922},{"type":17,"tag":25,"props":131934,"children":131935},{},[],{"type":17,"tag":29,"props":131937,"children":131938},{},[131939],{"type":17,"tag":33,"props":131940,"children":131941},{},[131942],{"type":23,"value":131160},{"type":17,"tag":29,"props":131944,"children":131945},{},[131946],{"type":23,"value":131923},{"type":17,"tag":29,"props":131948,"children":131949},{},[131950],{"type":23,"value":131951},"If you're building:",{"type":17,"tag":80,"props":131953,"children":131954},{},[131955,131960,131965,131970,131975],{"type":17,"tag":84,"props":131956,"children":131957},{},[131958],{"type":23,"value":131959},"A candidate portal",{"type":17,"tag":84,"props":131961,"children":131962},{},[131963],{"type":23,"value":131964},"A recruiting automation layer",{"type":17,"tag":84,"props":131966,"children":131967},{},[131968],{"type":23,"value":131969},"A branded apply experience",{"type":17,"tag":84,"props":131971,"children":131972},{},[131973],{"type":23,"value":131974},"A talent CRM with applicant login",{"type":17,"tag":84,"props":131976,"children":131977},{},[131978],{"type":23,"value":131979},"A hiring marketplace",{"type":17,"tag":29,"props":131981,"children":131982},{},[131983],{"type":23,"value":131984},"You may need to display:",{"type":17,"tag":80,"props":131986,"children":131987},{},[131988,131993,131998,132003],{"type":17,"tag":84,"props":131989,"children":131990},{},[131991],{"type":23,"value":131992},"Current application stage",{"type":17,"tag":84,"props":131994,"children":131995},{},[131996],{"type":23,"value":131997},"Upcoming interviews",{"type":17,"tag":84,"props":131999,"children":132000},{},[132001],{"type":23,"value":132002},"Interview outcomes",{"type":17,"tag":84,"props":132004,"children":132005},{},[132006],{"type":23,"value":132007},"Rejection or hire status",{"type":17,"tag":29,"props":132009,"children":132010},{},[132011,132013,132017],{"type":23,"value":132012},"This guide walks through how to build a candidate-facing portal that reflects real-time ATS data using Unified's ",{"type":17,"tag":133,"props":132014,"children":132015},{"href":55696},[132016],{"type":23,"value":55699},{"type":23,"value":54},{"type":17,"tag":29,"props":132019,"children":132020},{},[132021],{"type":23,"value":132022},"The focus is:",{"type":17,"tag":80,"props":132024,"children":132025},{},[132026,132031,132036,132040],{"type":17,"tag":84,"props":132027,"children":132028},{},[132029],{"type":23,"value":132030},"Current stage visibility",{"type":17,"tag":84,"props":132032,"children":132033},{},[132034],{"type":23,"value":132035},"Interview scheduling visibility",{"type":17,"tag":84,"props":132037,"children":132038},{},[132039],{"type":23,"value":13156},{"type":17,"tag":84,"props":132041,"children":132042},{},[132043],{"type":23,"value":132044},"Safe synchronization",{"type":17,"tag":29,"props":132046,"children":132047},{},[132048],{"type":23,"value":132049},"Unified exposes the current state of applications and interviews. It does not reconstruct stage history or enforce stage ordering.",{"type":17,"tag":68,"props":132051,"children":132053},{"id":132052},"the-mental-model",[132054],{"type":23,"value":132055},"The Mental Model",{"type":17,"tag":29,"props":132057,"children":132058},{},[132059],{"type":23,"value":132060},"A candidate portal should reflect three layers:",{"type":17,"tag":6154,"props":132062,"children":132063},{},[132064,132080,132096],{"type":17,"tag":84,"props":132065,"children":132066},{},[132067,132072,132073,132079],{"type":17,"tag":48,"props":132068,"children":132069},{},[132070],{"type":23,"value":132071},"Application status",{"type":23,"value":44573},{"type":17,"tag":6121,"props":132074,"children":132076},{"className":132075},[],[132077],{"type":23,"value":132078},"AtsApplication.status",{"type":23,"value":12034},{"type":17,"tag":84,"props":132081,"children":132082},{},[132083,132088,132089,132095],{"type":17,"tag":48,"props":132084,"children":132085},{},[132086],{"type":23,"value":132087},"Interview schedule",{"type":23,"value":44573},{"type":17,"tag":6121,"props":132090,"children":132092},{"className":132091},[],[132093],{"type":23,"value":132094},"AtsInterview",{"type":23,"value":12034},{"type":17,"tag":84,"props":132097,"children":132098},{},[132099,132104,132105,132111],{"type":17,"tag":48,"props":132100,"children":132101},{},[132102],{"type":23,"value":132103},"Stage vocabulary",{"type":23,"value":44573},{"type":17,"tag":6121,"props":132106,"children":132108},{"className":132107},[],[132109],{"type":23,"value":132110},"AtsStatus",{"type":23,"value":12034},{"type":17,"tag":29,"props":132113,"children":132114},{},[132115,132117,132121],{"type":23,"value":132116},"All data should be synced into your own database and updated via ",{"type":17,"tag":133,"props":132118,"children":132119},{"href":4999},[132120],{"type":23,"value":5002},{"type":23,"value":132122}," or incremental refresh.",{"type":17,"tag":29,"props":132124,"children":132125},{},[132126],{"type":23,"value":132127},"The ATS remains the source of truth. Your portal becomes a read-only projection layer.",{"type":17,"tag":68,"props":132129,"children":132131},{"id":132130},"step-1-retrieve-the-candidates-application",[132132],{"type":23,"value":132133},"Step 1: Retrieve the Candidate's Application",{"type":17,"tag":29,"props":132135,"children":132136},{},[132137],{"type":23,"value":132138},"You need the application associated with the candidate and job.",{"type":17,"tag":239,"props":132140,"children":132142},{"id":132141},"endpoint",[132143],{"type":23,"value":132144},"Endpoint",{"type":17,"tag":6893,"props":132146,"children":132149},{"className":132147,"code":132148,"language":20901,"meta":23},[20899],"GET /ats/{connection_id}/application\n",[132150],{"type":17,"tag":6121,"props":132151,"children":132152},{"__ignoreMap":7},[132153],{"type":23,"value":132148},{"type":17,"tag":29,"props":132155,"children":132156},{},[132157],{"type":23,"value":132158},"Filter by candidate:",{"type":17,"tag":6893,"props":132160,"children":132163},{"className":132161,"code":132162,"language":18718,"meta":7},[18716],"const applications = await sdk.ats.listAtsApplications({\n  connectionId,\n  candidate_id: candidateId,\n  limit: 50,\n  offset: 0,\n  sort: 'updated_at',\n  order: 'asc',\n});\n",[132164],{"type":17,"tag":6121,"props":132165,"children":132166},{"__ignoreMap":7},[132167],{"type":23,"value":132162},{"type":17,"tag":29,"props":132169,"children":132170},{},[132171,132173,132179],{"type":23,"value":132172},"From each ",{"type":17,"tag":6121,"props":132174,"children":132176},{"className":132175},[],[132177],{"type":23,"value":132178},"AtsApplication",{"type":23,"value":132180},", extract:",{"type":17,"tag":80,"props":132182,"children":132183},{},[132184,132192,132200,132208,132216,132225],{"type":17,"tag":84,"props":132185,"children":132186},{},[132187],{"type":17,"tag":6121,"props":132188,"children":132190},{"className":132189},[],[132191],{"type":23,"value":18766},{"type":17,"tag":84,"props":132193,"children":132194},{},[132195],{"type":17,"tag":6121,"props":132196,"children":132198},{"className":132197},[],[132199],{"type":23,"value":19949},{"type":17,"tag":84,"props":132201,"children":132202},{},[132203],{"type":17,"tag":6121,"props":132204,"children":132206},{"className":132205},[],[132207],{"type":23,"value":117334},{"type":17,"tag":84,"props":132209,"children":132210},{},[132211],{"type":17,"tag":6121,"props":132212,"children":132214},{"className":132213},[],[132215],{"type":23,"value":117347},{"type":17,"tag":84,"props":132217,"children":132218},{},[132219],{"type":17,"tag":6121,"props":132220,"children":132222},{"className":132221},[],[132223],{"type":23,"value":132224},"rejected_at",{"type":17,"tag":84,"props":132226,"children":132227},{},[132228],{"type":17,"tag":6121,"props":132229,"children":132231},{"className":132230},[],[132232],{"type":23,"value":132233},"hired_at",{"type":17,"tag":239,"props":132235,"children":132237},{"id":132236},"current-stage-display",[132238],{"type":23,"value":132239},"Current Stage Display",{"type":17,"tag":29,"props":132241,"children":132242},{},[132243],{"type":23,"value":132244},"The primary stage to show in a portal is:",{"type":17,"tag":6893,"props":132246,"children":132249},{"className":132247,"code":132248,"language":18718,"meta":7},[18716],"application.status\n",[132250],{"type":17,"tag":6121,"props":132251,"children":132252},{"__ignoreMap":7},[132253],{"type":23,"value":132248},{"type":17,"tag":29,"props":132255,"children":132256},{},[132257],{"type":23,"value":132258},"Optionally display:",{"type":17,"tag":6893,"props":132260,"children":132263},{"className":132261,"code":132262,"language":18718,"meta":7},[18716],"application.original_status\n",[132264],{"type":17,"tag":6121,"props":132265,"children":132266},{"__ignoreMap":7},[132267],{"type":23,"value":132262},{"type":17,"tag":29,"props":132269,"children":132270},{},[132271],{"type":23,"value":132272},"This allows you to show the recruiter-defined stage label exactly as configured inside the ATS.",{"type":17,"tag":29,"props":132274,"children":132275},{},[132276,132278,132283],{"type":23,"value":132277},"Important: Unified exposes the ",{"type":17,"tag":48,"props":132279,"children":132280},{},[132281],{"type":23,"value":132282},"current status only",{"type":23,"value":132284},". It does not provide a stage transition history timeline.",{"type":17,"tag":68,"props":132286,"children":132288},{"id":132287},"step-2-retrieve-stage-vocabulary",[132289],{"type":23,"value":132290},"Step 2: Retrieve Stage Vocabulary",{"type":17,"tag":29,"props":132292,"children":132293},{},[132294],{"type":23,"value":132295},"To render consistent labels and descriptions, retrieve available statuses:",{"type":17,"tag":6893,"props":132297,"children":132300},{"className":132298,"code":132299,"language":20901,"meta":23},[20899],"GET /ats/{connection_id}/applicationstatus\n",[132301],{"type":17,"tag":6121,"props":132302,"children":132303},{"__ignoreMap":7},[132304],{"type":23,"value":132299},{"type":17,"tag":239,"props":132306,"children":132308},{"id":132307},"node-sdk",[132309],{"type":23,"value":132310},"Node SDK",{"type":17,"tag":6893,"props":132312,"children":132315},{"className":132313,"code":132314,"language":18718,"meta":7},[18716],"const statuses = await sdk.ats.listAtsApplicationstatuses({\n  connectionId,\n  limit: 50,\n  offset: 0,\n});\n",[132316],{"type":17,"tag":6121,"props":132317,"children":132318},{"__ignoreMap":7},[132319],{"type":23,"value":132314},{"type":17,"tag":29,"props":132321,"children":132322},{},[132323,132328],{"type":17,"tag":6121,"props":132324,"children":132326},{"className":132325},[],[132327],{"type":23,"value":132110},{"type":23,"value":132329}," includes:",{"type":17,"tag":80,"props":132331,"children":132332},{},[132333,132341,132349],{"type":17,"tag":84,"props":132334,"children":132335},{},[132336],{"type":17,"tag":6121,"props":132337,"children":132339},{"className":132338},[],[132340],{"type":23,"value":19949},{"type":17,"tag":84,"props":132342,"children":132343},{},[132344],{"type":17,"tag":6121,"props":132345,"children":132347},{"className":132346},[],[132348],{"type":23,"value":117334},{"type":17,"tag":84,"props":132350,"children":132351},{},[132352],{"type":17,"tag":6121,"props":132353,"children":132355},{"className":132354},[],[132356],{"type":23,"value":24679},{"type":17,"tag":29,"props":132358,"children":132359},{},[132360],{"type":23,"value":132361},"Use this to:",{"type":17,"tag":80,"props":132363,"children":132364},{},[132365,132370,132375],{"type":17,"tag":84,"props":132366,"children":132367},{},[132368],{"type":23,"value":132369},"Display friendly stage names",{"type":17,"tag":84,"props":132371,"children":132372},{},[132373],{"type":23,"value":132374},"Show stage descriptions in your UI",{"type":17,"tag":84,"props":132376,"children":132377},{},[132378],{"type":23,"value":132379},"Handle unknown raw statuses safely",{"type":17,"tag":29,"props":132381,"children":132382},{},[132383],{"type":23,"value":132384},"Note: The API does not define stage ordering or progression logic. If you want ordered stages, you must define ordering in your own application layer.",{"type":17,"tag":68,"props":132386,"children":132388},{"id":132387},"step-3-retrieve-interviews",[132389],{"type":23,"value":132390},"Step 3: Retrieve Interviews",{"type":17,"tag":29,"props":132392,"children":132393},{},[132394],{"type":23,"value":132395},"If the ATS integration supports interviews, you can surface scheduling data.",{"type":17,"tag":29,"props":132397,"children":132398},{},[132399],{"type":23,"value":132400},"Interview visibility depends on provider support.",{"type":17,"tag":239,"props":132402,"children":132404},{"id":132403},"endpoint-1",[132405],{"type":23,"value":132144},{"type":17,"tag":6893,"props":132407,"children":132410},{"className":132408,"code":132409,"language":20901,"meta":23},[20899],"GET /ats/{connection_id}/interview\n",[132411],{"type":17,"tag":6121,"props":132412,"children":132413},{"__ignoreMap":7},[132414],{"type":23,"value":132409},{"type":17,"tag":29,"props":132416,"children":132417},{},[132418],{"type":23,"value":132419},"Filter by application:",{"type":17,"tag":6893,"props":132421,"children":132424},{"className":132422,"code":132423,"language":18718,"meta":7},[18716],"const interviews = await sdk.ats.listAtsInterviews({\n  connectionId,\n  application_id: application.id,\n  limit: 50,\n  offset: 0,\n  sort: 'updated_at',\n  order: 'asc',\n});\n",[132425],{"type":17,"tag":6121,"props":132426,"children":132427},{"__ignoreMap":7},[132428],{"type":23,"value":132423},{"type":17,"tag":29,"props":132430,"children":132431},{},[132432,132434,132439],{"type":23,"value":132433},"From ",{"type":17,"tag":6121,"props":132435,"children":132437},{"className":132436},[],[132438],{"type":23,"value":132094},{"type":23,"value":132180},{"type":17,"tag":80,"props":132441,"children":132442},{},[132443,132451,132459,132467],{"type":17,"tag":84,"props":132444,"children":132445},{},[132446],{"type":17,"tag":6121,"props":132447,"children":132449},{"className":132448},[],[132450],{"type":23,"value":19949},{"type":17,"tag":84,"props":132452,"children":132453},{},[132454],{"type":17,"tag":6121,"props":132455,"children":132457},{"className":132456},[],[132458],{"type":23,"value":21051},{"type":17,"tag":84,"props":132460,"children":132461},{},[132462],{"type":17,"tag":6121,"props":132463,"children":132465},{"className":132464},[],[132466],{"type":23,"value":21060},{"type":17,"tag":84,"props":132468,"children":132469},{},[132470],{"type":17,"tag":6121,"props":132471,"children":132473},{"className":132472},[],[132474],{"type":23,"value":74134},{"type":17,"tag":239,"props":132476,"children":132478},{"id":132477},"interview-display-logic",[132479],{"type":23,"value":132480},"Interview Display Logic",{"type":17,"tag":29,"props":132482,"children":132483},{},[132484],{"type":23,"value":132485},"A practical portal layout:",{"type":17,"tag":29,"props":132487,"children":132488},{},[132489],{"type":17,"tag":48,"props":132490,"children":132491},{},[132492],{"type":23,"value":132493},"Upcoming Interviews",{"type":17,"tag":80,"props":132495,"children":132496},{},[132497,132506],{"type":17,"tag":84,"props":132498,"children":132499},{},[132500],{"type":17,"tag":6121,"props":132501,"children":132503},{"className":132502},[],[132504],{"type":23,"value":132505},"status === 'SCHEDULED'",{"type":17,"tag":84,"props":132507,"children":132508},{},[132509],{"type":17,"tag":6121,"props":132510,"children":132512},{"className":132511},[],[132513],{"type":23,"value":132514},"start_at > now",{"type":17,"tag":29,"props":132516,"children":132517},{},[132518],{"type":17,"tag":48,"props":132519,"children":132520},{},[132521],{"type":23,"value":132522},"Completed Interviews",{"type":17,"tag":80,"props":132524,"children":132525},{},[132526],{"type":17,"tag":84,"props":132527,"children":132528},{},[132529],{"type":17,"tag":6121,"props":132530,"children":132532},{"className":132531},[],[132533],{"type":23,"value":132534},"status === 'COMPLETE'",{"type":17,"tag":29,"props":132536,"children":132537},{},[132538],{"type":17,"tag":48,"props":132539,"children":132540},{},[132541],{"type":23,"value":132542},"Awaiting Feedback",{"type":17,"tag":80,"props":132544,"children":132545},{},[132546],{"type":17,"tag":84,"props":132547,"children":132548},{},[132549],{"type":17,"tag":6121,"props":132550,"children":132552},{"className":132551},[],[132553],{"type":23,"value":132554},"status === 'AWAITING_FEEDBACK'",{"type":17,"tag":29,"props":132556,"children":132557},{},[132558],{"type":23,"value":132559},"Display:",{"type":17,"tag":80,"props":132561,"children":132562},{},[132563,132568,132573],{"type":17,"tag":84,"props":132564,"children":132565},{},[132566],{"type":23,"value":132567},"Date and time",{"type":17,"tag":84,"props":132569,"children":132570},{},[132571],{"type":23,"value":132572},"Location (or virtual indicator)",{"type":17,"tag":84,"props":132574,"children":132575},{},[132576],{"type":23,"value":132577},"Interview status",{"type":17,"tag":29,"props":132579,"children":132580},{},[132581],{"type":23,"value":132582},"Do not assume stage transitions based on interview count. The ATS controls stage progression.",{"type":17,"tag":68,"props":132584,"children":132586},{"id":132585},"step-4-handle-real-time-updates",[132587],{"type":23,"value":132588},"Step 4: Handle Real-Time Updates",{"type":17,"tag":29,"props":132590,"children":132591},{},[132592],{"type":23,"value":132593},"A 'real-time' portal requires updates when:",{"type":17,"tag":80,"props":132595,"children":132596},{},[132597,132602,132607],{"type":17,"tag":84,"props":132598,"children":132599},{},[132600],{"type":23,"value":132601},"Application status changes",{"type":17,"tag":84,"props":132603,"children":132604},{},[132605],{"type":23,"value":132606},"Interviews are scheduled",{"type":17,"tag":84,"props":132608,"children":132609},{},[132610],{"type":23,"value":132611},"Interviews are updated or cancelled",{"type":17,"tag":29,"props":132613,"children":132614},{},[132615],{"type":23,"value":132616},"Use Unified webhooks.",{"type":17,"tag":239,"props":132618,"children":132620},{"id":132619},"subscribe-to-application-updates",[132621],{"type":23,"value":132622},"Subscribe to Application Updates",{"type":17,"tag":6893,"props":132624,"children":132627},{"className":132625,"code":132626,"language":22503,"meta":7},[22501],"{\n  \"hook_url\": \"https://your-app.com/webhooks\",\n  \"connection_id\": \"\u003Cconnection_id>\",\n  \"object_type\": \"ats_application\",\n  \"event\": \"updated\"\n}\n",[132628],{"type":17,"tag":6121,"props":132629,"children":132630},{"__ignoreMap":7},[132631],{"type":23,"value":132626},{"type":17,"tag":239,"props":132633,"children":132635},{"id":132634},"subscribe-to-interview-updates",[132636],{"type":23,"value":132637},"Subscribe to Interview Updates",{"type":17,"tag":6893,"props":132639,"children":132642},{"className":132640,"code":132641,"language":22503,"meta":7},[22501],"{\n  \"hook_url\": \"https://your-app.com/webhooks\",\n  \"connection_id\": \"\u003Cconnection_id>\",\n  \"object_type\": \"ats_interview\",\n  \"event\": \"updated\"\n}\n",[132643],{"type":17,"tag":6121,"props":132644,"children":132645},{"__ignoreMap":7},[132646],{"type":23,"value":132641},{"type":17,"tag":29,"props":132648,"children":132649},{},[132650],{"type":23,"value":132651},"When a webhook fires:",{"type":17,"tag":6154,"props":132653,"children":132654},{},[132655,132660,132665,132670],{"type":17,"tag":84,"props":132656,"children":132657},{},[132658],{"type":23,"value":132659},"Validate signature",{"type":17,"tag":84,"props":132661,"children":132662},{},[132663],{"type":23,"value":132664},"Upsert record into your database",{"type":17,"tag":84,"props":132666,"children":132667},{},[132668],{"type":23,"value":132669},"Recompute portal state",{"type":17,"tag":84,"props":132671,"children":132672},{},[132673],{"type":23,"value":132674},"Notify candidate UI (if needed)",{"type":17,"tag":29,"props":132676,"children":132677},{},[132678],{"type":23,"value":132679},"Unified retries failed webhook deliveries and uses backoff strategies. Your webhook handler should be idempotent.",{"type":17,"tag":68,"props":132681,"children":132683},{"id":132682},"step-5-initial-sync-strategy",[132684],{"type":23,"value":132685},"Step 5: Initial Sync Strategy",{"type":17,"tag":29,"props":132687,"children":132688},{},[132689],{"type":23,"value":132690},"Before enabling webhooks, perform an initial sync.",{"type":17,"tag":29,"props":132692,"children":132693},{},[132694,132695,132699],{"type":23,"value":33722},{"type":17,"tag":133,"props":132696,"children":132697},{"href":1857},[132698],{"type":23,"value":1860},{"type":23,"value":20456},{"type":17,"tag":80,"props":132701,"children":132702},{},[132703,132713],{"type":17,"tag":84,"props":132704,"children":132705},{},[132706,132711],{"type":17,"tag":6121,"props":132707,"children":132709},{"className":132708},[],[132710],{"type":23,"value":48389},{"type":23,"value":132712}," (default 100)",{"type":17,"tag":84,"props":132714,"children":132715},{},[132716],{"type":17,"tag":6121,"props":132717,"children":132719},{"className":132718},[],[132720],{"type":23,"value":48411},{"type":17,"tag":29,"props":132722,"children":132723},{},[132724],{"type":23,"value":19878},{"type":17,"tag":6893,"props":132726,"children":132729},{"className":132727,"code":132728,"language":18718,"meta":7},[18716],"const page = await sdk.ats.listAtsApplications({\n  connectionId,\n  limit: 100,\n  offset: 0,\n});\n",[132730],{"type":17,"tag":6121,"props":132731,"children":132732},{"__ignoreMap":7},[132733],{"type":23,"value":132728},{"type":17,"tag":29,"props":132735,"children":132736},{},[132737],{"type":23,"value":132738},"Then store:",{"type":17,"tag":80,"props":132740,"children":132741},{},[132742,132746,132750],{"type":17,"tag":84,"props":132743,"children":132744},{},[132745],{"type":23,"value":56878},{"type":17,"tag":84,"props":132747,"children":132748},{},[132749],{"type":23,"value":56891},{"type":17,"tag":84,"props":132751,"children":132752},{},[132753],{"type":23,"value":132754},"Status vocabulary",{"type":17,"tag":29,"props":132756,"children":132757},{},[132758],{"type":23,"value":132759},"After initial sync, rely on webhooks for updates.",{"type":17,"tag":239,"props":132761,"children":132763},{"id":132762},"optional-polling-fallback",[132764],{"type":23,"value":132765},"Optional: Polling Fallback",{"type":17,"tag":29,"props":132767,"children":132768},{},[132769],{"type":23,"value":132770},"If webhooks are unavailable, use incremental polling:",{"type":17,"tag":6893,"props":132772,"children":132775},{"className":132773,"code":132774,"language":18718,"meta":7},[18716],"updated_gte: lastSyncTimestamp\n",[132776],{"type":17,"tag":6121,"props":132777,"children":132778},{"__ignoreMap":7},[132779],{"type":23,"value":132774},{"type":17,"tag":29,"props":132781,"children":132782},{},[132783],{"type":23,"value":22801},{"type":17,"tag":80,"props":132785,"children":132786},{},[132787,132792],{"type":17,"tag":84,"props":132788,"children":132789},{},[132790],{"type":23,"value":132791},"Retrieve only records updated since your last sync",{"type":17,"tag":84,"props":132793,"children":132794},{},[132795],{"type":23,"value":132796},"Avoid reloading full datasets",{"type":17,"tag":68,"props":132798,"children":132800},{"id":132799},"portal-ui-design-recommendations",[132801],{"type":23,"value":132802},"Portal UI Design Recommendations",{"type":17,"tag":29,"props":132804,"children":132805},{},[132806],{"type":23,"value":132807},"Keep the portal simple and state-based:",{"type":17,"tag":29,"props":132809,"children":132810},{},[132811],{"type":17,"tag":48,"props":132812,"children":132813},{},[132814],{"type":23,"value":132815},"Application Overview",{"type":17,"tag":80,"props":132817,"children":132818},{},[132819,132824,132829],{"type":17,"tag":84,"props":132820,"children":132821},{},[132822],{"type":23,"value":132823},"Applied date",{"type":17,"tag":84,"props":132825,"children":132826},{},[132827],{"type":23,"value":132828},"Current stage",{"type":17,"tag":84,"props":132830,"children":132831},{},[132832],{"type":23,"value":132833},"Stage description",{"type":17,"tag":29,"props":132835,"children":132836},{},[132837],{"type":17,"tag":48,"props":132838,"children":132839},{},[132840],{"type":23,"value":132841},"Interview Section",{"type":17,"tag":80,"props":132843,"children":132844},{},[132845,132849,132854],{"type":17,"tag":84,"props":132846,"children":132847},{},[132848],{"type":23,"value":131997},{"type":17,"tag":84,"props":132850,"children":132851},{},[132852],{"type":23,"value":132853},"Past interviews",{"type":17,"tag":84,"props":132855,"children":132856},{},[132857],{"type":23,"value":132577},{"type":17,"tag":29,"props":132859,"children":132860},{},[132861],{"type":17,"tag":48,"props":132862,"children":132863},{},[132864],{"type":23,"value":132865},"Outcome",{"type":17,"tag":80,"props":132867,"children":132868},{},[132869,132881],{"type":17,"tag":84,"props":132870,"children":132871},{},[132872,132874,132879],{"type":23,"value":132873},"If ",{"type":17,"tag":6121,"props":132875,"children":132877},{"className":132876},[],[132878],{"type":23,"value":132233},{"type":23,"value":132880}," exists → show 'Offer Accepted'",{"type":17,"tag":84,"props":132882,"children":132883},{},[132884,132885,132890],{"type":23,"value":132873},{"type":17,"tag":6121,"props":132886,"children":132888},{"className":132887},[],[132889],{"type":23,"value":132224},{"type":23,"value":132891}," exists → show 'Application Closed'",{"type":17,"tag":29,"props":132893,"children":132894},{},[132895],{"type":23,"value":132896},"Avoid exposing internal recruiter notes or metadata unless intentionally supported.",{"type":17,"tag":68,"props":132898,"children":132900},{"id":132899},"recommended-architecture",[132901],{"type":23,"value":132902},"Recommended Architecture",{"type":17,"tag":6154,"props":132904,"children":132905},{},[132906,132911,132916,132921,132926],{"type":17,"tag":84,"props":132907,"children":132908},{},[132909],{"type":23,"value":132910},"Initial full sync",{"type":17,"tag":84,"props":132912,"children":132913},{},[132914],{"type":23,"value":132915},"Store ATS records in your database",{"type":17,"tag":84,"props":132917,"children":132918},{},[132919],{"type":23,"value":132920},"Subscribe to webhooks",{"type":17,"tag":84,"props":132922,"children":132923},{},[132924],{"type":23,"value":132925},"Update records on webhook events",{"type":17,"tag":84,"props":132927,"children":132928},{},[132929],{"type":23,"value":132930},"Render portal off your internal DB",{"type":17,"tag":29,"props":132932,"children":132933},{},[132934],{"type":23,"value":132935},"Do not render directly from live ATS API calls for each page load.",{"type":17,"tag":68,"props":132937,"children":132939},{"id":132938},"closing-thoughts",[132940],{"type":23,"value":132941},"Closing Thoughts",{"type":17,"tag":29,"props":132943,"children":132944},{},[132945],{"type":23,"value":132946},"A candidate portal showing real-time interview stages requires:",{"type":17,"tag":80,"props":132948,"children":132949},{},[132950,132955,132959,132964],{"type":17,"tag":84,"props":132951,"children":132952},{},[132953],{"type":23,"value":132954},"Current application status",{"type":17,"tag":84,"props":132956,"children":132957},{},[132958],{"type":23,"value":132035},{"type":17,"tag":84,"props":132960,"children":132961},{},[132962],{"type":23,"value":132963},"Webhook-driven updates",{"type":17,"tag":84,"props":132965,"children":132966},{},[132967],{"type":23,"value":132968},"Defensive handling of provider variability",{"type":17,"tag":29,"props":132970,"children":132971},{},[132972],{"type":23,"value":132973},"Unified's ATS API provides:",{"type":17,"tag":80,"props":132975,"children":132976},{},[132977,132982,132993,132998],{"type":17,"tag":84,"props":132978,"children":132979},{},[132980],{"type":23,"value":132981},"Normalized application and interview models",{"type":17,"tag":84,"props":132983,"children":132984},{},[132985,132987],{"type":23,"value":132986},"Stage vocabulary via ",{"type":17,"tag":6121,"props":132988,"children":132990},{"className":132989},[],[132991],{"type":23,"value":132992},"applicationstatus",{"type":17,"tag":84,"props":132994,"children":132995},{},[132996],{"type":23,"value":132997},"Webhook support for real-time updates",{"type":17,"tag":84,"props":132999,"children":133000},{},[133001],{"type":23,"value":133002},"Incremental sync support",{"type":17,"tag":29,"props":133004,"children":133005},{},[133006],{"type":23,"value":133007},"The portal layer is your responsibility. Unified ensures you have consistent, structured ATS data to power it.",{"type":17,"tag":29,"props":133009,"children":133010},{},[133011],{"type":17,"tag":133,"props":133012,"children":133014},{"href":1612,"rel":133013},[214],[133015],{"type":23,"value":44481},{"type":17,"tag":29,"props":133017,"children":133018},{},[133019],{"type":17,"tag":133,"props":133020,"children":133022},{"href":1623,"rel":133021},[214],[133023],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":133025},[133026,133027,133031,133034,133038,133042,133045,133046,133047],{"id":132052,"depth":1629,"text":132055},{"id":132130,"depth":1629,"text":132133,"children":133028},[133029,133030],{"id":132141,"depth":1635,"text":132144},{"id":132236,"depth":1635,"text":132239},{"id":132287,"depth":1629,"text":132290,"children":133032},[133033],{"id":132307,"depth":1635,"text":132310},{"id":132387,"depth":1629,"text":132390,"children":133035},[133036,133037],{"id":132403,"depth":1635,"text":132144},{"id":132477,"depth":1635,"text":132480},{"id":132585,"depth":1629,"text":132588,"children":133039},[133040,133041],{"id":132619,"depth":1635,"text":132622},{"id":132634,"depth":1635,"text":132637},{"id":132682,"depth":1629,"text":132685,"children":133043},[133044],{"id":132762,"depth":1635,"text":132765},{"id":132799,"depth":1629,"text":132802},{"id":132899,"depth":1629,"text":132902},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_build_a_candidate_portal_showing_real_time_interview_stages_using_unified_ats_api.md","blog/how_to_build_a_candidate_portal_showing_real_time_interview_stages_using_unified_ats_api.md","blog/how_to_build_a_candidate_portal_showing_real_time_interview_stages_using_unified_ats_api",{"_path":133052,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":133053,"description":133054,"img":133055,"date":131925,"tag":12,"body":133056,"_type":1677,"_id":134299,"_source":1679,"_file":134300,"_stem":134301,"_extension":1682},"/blog/how_to_deduplicate_and_visualize_talent_pools_across_ats_platforms_using_unified_ats_api","How to Deduplicate and Visualize Talent Pools Across ATS Platforms Using Unified's ATS API","Recruiting teams rarely operate in a single system.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_deduplicate_and_visualize_talent_pools_across_ats_platforms_using_unified_ats_api-icon.png",{"type":14,"children":133057,"toc":134275},[133058,133063,133066,133073,133077,133082,133105,133110,133133,133138,133146,133156,133161,133165,133176,133181,133214,133219,133224,133242,133248,133253,133257,133266,133272,133281,133293,133395,133400,133406,133411,133416,133422,133432,133441,133446,133464,133469,133475,133484,133492,133497,133510,133515,133521,133532,133545,133550,133556,133561,133570,133575,133600,133605,133623,133629,133634,133638,133646,133650,133659,133670,133713,133718,133724,133735,133740,133748,133758,133785,133790,133813,133818,133905,133910,133916,133927,133932,133950,133954,133963,133968,133986,133991,133997,134002,134020,134025,134042,134047,134065,134070,134076,134126,134131,134137,134142,134170,134175,134179,134184,134189,134193,134221,134226,134254,134259,134267],{"type":17,"tag":18,"props":133059,"children":133061},{"id":133060},"how-to-deduplicate-and-visualize-talent-pools-across-ats-platforms-using-unifieds-ats-api",[133062],{"type":23,"value":133053},{"type":17,"tag":25,"props":133064,"children":133065},{},[],{"type":17,"tag":29,"props":133067,"children":133068},{},[133069],{"type":17,"tag":33,"props":133070,"children":133071},{},[133072],{"type":23,"value":131160},{"type":17,"tag":29,"props":133074,"children":133075},{},[133076],{"type":23,"value":133054},{"type":17,"tag":29,"props":133078,"children":133079},{},[133080],{"type":23,"value":133081},"They may use:",{"type":17,"tag":80,"props":133083,"children":133084},{},[133085,133090,133095,133100],{"type":17,"tag":84,"props":133086,"children":133087},{},[133088],{"type":23,"value":133089},"Different ATS platforms across regions",{"type":17,"tag":84,"props":133091,"children":133092},{},[133093],{"type":23,"value":133094},"Multiple ATS instances for separate business units",{"type":17,"tag":84,"props":133096,"children":133097},{},[133098],{"type":23,"value":133099},"An ATS plus an internal talent CRM",{"type":17,"tag":84,"props":133101,"children":133102},{},[133103],{"type":23,"value":133104},"A sourcing database layered on top",{"type":17,"tag":29,"props":133106,"children":133107},{},[133108],{"type":23,"value":133109},"From the recruiter's perspective, this creates blind spots:",{"type":17,"tag":80,"props":133111,"children":133112},{},[133113,133118,133123,133128],{"type":17,"tag":84,"props":133114,"children":133115},{},[133116],{"type":23,"value":133117},"Are we sourcing candidates who already exist in another system?",{"type":17,"tag":84,"props":133119,"children":133120},{},[133121],{"type":23,"value":133122},"How many unique candidates do we actually have?",{"type":17,"tag":84,"props":133124,"children":133125},{},[133126],{"type":23,"value":133127},"How many are active vs stale?",{"type":17,"tag":84,"props":133129,"children":133130},{},[133131],{"type":23,"value":133132},"Where are candidates getting stuck in the funnel?",{"type":17,"tag":29,"props":133134,"children":133135},{},[133136],{"type":23,"value":133137},"If you're building a recruiting product, this is a customer-facing feature:",{"type":17,"tag":3414,"props":133139,"children":133140},{},[133141],{"type":17,"tag":29,"props":133142,"children":133143},{},[133144],{"type":23,"value":133145},"A unified talent pool view across ATS platforms.",{"type":17,"tag":29,"props":133147,"children":133148},{},[133149,133151,133155],{"type":23,"value":133150},"This guide walks through how to implement talent pool deduplication and visibility using Unified's ",{"type":17,"tag":133,"props":133152,"children":133153},{"href":55696},[133154],{"type":23,"value":55699},{"type":23,"value":54},{"type":17,"tag":29,"props":133157,"children":133158},{},[133159],{"type":23,"value":133160},"This is a read + analytics workflow. No write-back required.",{"type":17,"tag":68,"props":133162,"children":133163},{"id":132052},[133164],{"type":23,"value":132055},{"type":17,"tag":29,"props":133166,"children":133167},{},[133168,133170,133175],{"type":23,"value":133169},"Your product becomes a ",{"type":17,"tag":48,"props":133171,"children":133172},{},[133173],{"type":23,"value":133174},"candidate identity layer",{"type":23,"value":54},{"type":17,"tag":29,"props":133177,"children":133178},{},[133179],{"type":23,"value":133180},"It:",{"type":17,"tag":6154,"props":133182,"children":133183},{},[133184,133189,133194,133199,133204,133209],{"type":17,"tag":84,"props":133185,"children":133186},{},[133187],{"type":23,"value":133188},"Pulls candidates from one or more ATS connections",{"type":17,"tag":84,"props":133190,"children":133191},{},[133192],{"type":23,"value":133193},"Normalizes the candidate object",{"type":17,"tag":84,"props":133195,"children":133196},{},[133197],{"type":23,"value":133198},"Deduplicates across systems",{"type":17,"tag":84,"props":133200,"children":133201},{},[133202],{"type":23,"value":133203},"Aggregates application stages",{"type":17,"tag":84,"props":133205,"children":133206},{},[133207],{"type":23,"value":133208},"Computes recency and stale metrics",{"type":17,"tag":84,"props":133210,"children":133211},{},[133212],{"type":23,"value":133213},"Visualizes funnel distribution",{"type":17,"tag":29,"props":133215,"children":133216},{},[133217],{"type":23,"value":133218},"Unified provides normalized candidate and application models across supported ATS integrations.",{"type":17,"tag":29,"props":133220,"children":133221},{},[133222],{"type":23,"value":133223},"You provide:",{"type":17,"tag":80,"props":133225,"children":133226},{},[133227,133232,133237],{"type":17,"tag":84,"props":133228,"children":133229},{},[133230],{"type":23,"value":133231},"Identity resolution logic",{"type":17,"tag":84,"props":133233,"children":133234},{},[133235],{"type":23,"value":133236},"Cross-system merging",{"type":17,"tag":84,"props":133238,"children":133239},{},[133240],{"type":23,"value":133241},"Analytics and visualization",{"type":17,"tag":68,"props":133243,"children":133245},{"id":133244},"step-1-pull-candidates-from-each-ats-connection",[133246],{"type":23,"value":133247},"Step 1: Pull Candidates from Each ATS Connection",{"type":17,"tag":29,"props":133249,"children":133250},{},[133251],{"type":23,"value":133252},"Start by listing candidates for each connected ATS.",{"type":17,"tag":239,"props":133254,"children":133255},{"id":132141},[133256],{"type":23,"value":132144},{"type":17,"tag":6893,"props":133258,"children":133261},{"className":133259,"code":133260,"language":20901,"meta":23},[20899],"GET /ats/{connection_id}/candidate\n",[133262],{"type":17,"tag":6121,"props":133263,"children":133264},{"__ignoreMap":7},[133265],{"type":23,"value":133260},{"type":17,"tag":239,"props":133267,"children":133269},{"id":133268},"node-sdk-example",[133270],{"type":23,"value":133271},"Node SDK Example",{"type":17,"tag":6893,"props":133273,"children":133276},{"className":133274,"code":133275,"language":18718,"meta":7},[18716],"const candidates = await sdk.ats.listAtsCandidates({\n  connectionId,\n  limit: 100,\n  offset: 0,\n  sort: 'updated_at',\n  order: 'asc',\n});\n",[133277],{"type":17,"tag":6121,"props":133278,"children":133279},{"__ignoreMap":7},[133280],{"type":23,"value":133275},{"type":17,"tag":29,"props":133282,"children":133283},{},[133284,133286,133292],{"type":23,"value":133285},"Important fields from ",{"type":17,"tag":6121,"props":133287,"children":133289},{"className":133288},[],[133290],{"type":23,"value":133291},"AtsCandidate",{"type":23,"value":20456},{"type":17,"tag":80,"props":133294,"children":133295},{},[133296,133304,133313,133322,133331,133345,133353,133361,133370,133379,133387],{"type":17,"tag":84,"props":133297,"children":133298},{},[133299],{"type":17,"tag":6121,"props":133300,"children":133302},{"className":133301},[],[133303],{"type":23,"value":18766},{"type":17,"tag":84,"props":133305,"children":133306},{},[133307],{"type":17,"tag":6121,"props":133308,"children":133310},{"className":133309},[],[133311],{"type":23,"value":133312},"emails[]",{"type":17,"tag":84,"props":133314,"children":133315},{},[133316],{"type":17,"tag":6121,"props":133317,"children":133319},{"className":133318},[],[133320],{"type":23,"value":133321},"telephones[]",{"type":17,"tag":84,"props":133323,"children":133324},{},[133325],{"type":17,"tag":6121,"props":133326,"children":133328},{"className":133327},[],[133329],{"type":23,"value":133330},"link_urls[]",{"type":17,"tag":84,"props":133332,"children":133333},{},[133334,133339,133340],{"type":17,"tag":6121,"props":133335,"children":133337},{"className":133336},[],[133338],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":133341,"children":133343},{"className":133342},[],[133344],{"type":23,"value":62341},{"type":17,"tag":84,"props":133346,"children":133347},{},[133348],{"type":17,"tag":6121,"props":133349,"children":133351},{"className":133350},[],[133352],{"type":23,"value":62786},{"type":17,"tag":84,"props":133354,"children":133355},{},[133356],{"type":17,"tag":6121,"props":133357,"children":133359},{"className":133358},[],[133360],{"type":23,"value":62346},{"type":17,"tag":84,"props":133362,"children":133363},{},[133364],{"type":17,"tag":6121,"props":133365,"children":133367},{"className":133366},[],[133368],{"type":23,"value":133369},"tags[]",{"type":17,"tag":84,"props":133371,"children":133372},{},[133373],{"type":17,"tag":6121,"props":133374,"children":133376},{"className":133375},[],[133377],{"type":23,"value":133378},"metadata[]",{"type":17,"tag":84,"props":133380,"children":133381},{},[133382],{"type":17,"tag":6121,"props":133383,"children":133385},{"className":133384},[],[133386],{"type":23,"value":25337},{"type":17,"tag":84,"props":133388,"children":133389},{},[133390],{"type":17,"tag":6121,"props":133391,"children":133393},{"className":133392},[],[133394],{"type":23,"value":33446},{"type":17,"tag":29,"props":133396,"children":133397},{},[133398],{"type":23,"value":133399},"Store candidates in your own database. Do not run analytics directly off live API calls.",{"type":17,"tag":68,"props":133401,"children":133403},{"id":133402},"step-2-normalize-candidate-identity",[133404],{"type":23,"value":133405},"Step 2: Normalize Candidate Identity",{"type":17,"tag":29,"props":133407,"children":133408},{},[133409],{"type":23,"value":133410},"You need a canonical identity key across systems.",{"type":17,"tag":29,"props":133412,"children":133413},{},[133414],{"type":23,"value":133415},"Use the following priority order:",{"type":17,"tag":239,"props":133417,"children":133419},{"id":133418},"_1️⃣-email-primary-key",[133420],{"type":23,"value":133421},"1️⃣ Email (primary key)",{"type":17,"tag":29,"props":133423,"children":133424},{},[133425,133430],{"type":17,"tag":6121,"props":133426,"children":133428},{"className":133427},[],[133429],{"type":23,"value":133312},{"type":23,"value":133431}," contains structured email objects:",{"type":17,"tag":6893,"props":133433,"children":133436},{"className":133434,"code":133435,"language":22503,"meta":7},[22501],"{\n  \"name\": \"Jane Doe\",\n  \"email\": \"jane@example.com\",\n  \"type\": \"WORK\"\n}\n",[133437],{"type":17,"tag":6121,"props":133438,"children":133439},{"__ignoreMap":7},[133440],{"type":23,"value":133435},{"type":17,"tag":29,"props":133442,"children":133443},{},[133444],{"type":23,"value":133445},"Deduplicate primarily on normalized email address:",{"type":17,"tag":80,"props":133447,"children":133448},{},[133449,133454,133459],{"type":17,"tag":84,"props":133450,"children":133451},{},[133452],{"type":23,"value":133453},"Lowercase",{"type":17,"tag":84,"props":133455,"children":133456},{},[133457],{"type":23,"value":133458},"Trim whitespace",{"type":17,"tag":84,"props":133460,"children":133461},{},[133462],{"type":23,"value":133463},"Remove aliasing patterns if appropriate (e.g., Gmail dots)",{"type":17,"tag":29,"props":133465,"children":133466},{},[133467],{"type":23,"value":133468},"Email is the most reliable cross-system identifier.",{"type":17,"tag":239,"props":133470,"children":133472},{"id":133471},"_2️⃣-linkedin-url",[133473],{"type":23,"value":133474},"2️⃣ LinkedIn URL",{"type":17,"tag":29,"props":133476,"children":133477},{},[133478,133483],{"type":17,"tag":6121,"props":133479,"children":133481},{"className":133480},[],[133482],{"type":23,"value":133330},{"type":23,"value":132329},{"type":17,"tag":3414,"props":133485,"children":133486},{},[133487],{"type":17,"tag":29,"props":133488,"children":133489},{},[133490],{"type":23,"value":133491},"URLs for web pages containing additional material about the candidate (LinkedIn, other social media, articles, etc.)",{"type":17,"tag":29,"props":133493,"children":133494},{},[133495],{"type":23,"value":133496},"Extract LinkedIn URLs and normalize:",{"type":17,"tag":80,"props":133498,"children":133499},{},[133500,133505],{"type":17,"tag":84,"props":133501,"children":133502},{},[133503],{"type":23,"value":133504},"Remove tracking parameters",{"type":17,"tag":84,"props":133506,"children":133507},{},[133508],{"type":23,"value":133509},"Standardize domain variants",{"type":17,"tag":29,"props":133511,"children":133512},{},[133513],{"type":23,"value":133514},"This becomes your secondary dedupe key when email is missing.",{"type":17,"tag":239,"props":133516,"children":133518},{"id":133517},"_3️⃣-phone-number-fallback",[133519],{"type":23,"value":133520},"3️⃣ Phone Number (fallback)",{"type":17,"tag":29,"props":133522,"children":133523},{},[133524,133525,133530],{"type":23,"value":132433},{"type":17,"tag":6121,"props":133526,"children":133528},{"className":133527},[],[133529],{"type":23,"value":133321},{"type":23,"value":133531},", normalize:",{"type":17,"tag":80,"props":133533,"children":133534},{},[133535,133540],{"type":17,"tag":84,"props":133536,"children":133537},{},[133538],{"type":23,"value":133539},"Strip formatting",{"type":17,"tag":84,"props":133541,"children":133542},{},[133543],{"type":23,"value":133544},"Standardize country codes",{"type":17,"tag":29,"props":133546,"children":133547},{},[133548],{"type":23,"value":133549},"Phone numbers are useful but less consistent.",{"type":17,"tag":68,"props":133551,"children":133553},{"id":133552},"step-3-build-a-canonical-candidate-record",[133554],{"type":23,"value":133555},"Step 3: Build a Canonical Candidate Record",{"type":17,"tag":29,"props":133557,"children":133558},{},[133559],{"type":23,"value":133560},"After dedupe, merge candidate records into a single canonical entity:",{"type":17,"tag":6893,"props":133562,"children":133565},{"className":133563,"code":133564,"language":20901,"meta":23},[20899],"CanonicalCandidate\n  - primary_email\n  - linkedin_url\n  - phones[]\n  - first_seen_at\n  - last_updated_at\n  - ats_sources[]\n  - candidate_ids_by_connection\n",[133566],{"type":17,"tag":6121,"props":133567,"children":133568},{"__ignoreMap":7},[133569],{"type":23,"value":133564},{"type":17,"tag":29,"props":133571,"children":133572},{},[133573],{"type":23,"value":133574},"Store:",{"type":17,"tag":80,"props":133576,"children":133577},{},[133578,133583,133588],{"type":17,"tag":84,"props":133579,"children":133580},{},[133581],{"type":23,"value":133582},"All ATS candidate IDs",{"type":17,"tag":84,"props":133584,"children":133585},{},[133586],{"type":23,"value":133587},"Which connection they belong to",{"type":17,"tag":84,"props":133589,"children":133590},{},[133591,133593,133598],{"type":23,"value":133592},"The most recent ",{"type":17,"tag":6121,"props":133594,"children":133596},{"className":133595},[],[133597],{"type":23,"value":25337},{"type":23,"value":133599}," across systems",{"type":17,"tag":29,"props":133601,"children":133602},{},[133603],{"type":23,"value":133604},"This lets you:",{"type":17,"tag":80,"props":133606,"children":133607},{},[133608,133613,133618],{"type":17,"tag":84,"props":133609,"children":133610},{},[133611],{"type":23,"value":133612},"Avoid re-sourcing known candidates",{"type":17,"tag":84,"props":133614,"children":133615},{},[133616],{"type":23,"value":133617},"Show a unified profile",{"type":17,"tag":84,"props":133619,"children":133620},{},[133621],{"type":23,"value":133622},"Link back to each ATS record",{"type":17,"tag":68,"props":133624,"children":133626},{"id":133625},"step-4-merge-applications-for-funnel-visibility",[133627],{"type":23,"value":133628},"Step 4: Merge Applications for Funnel Visibility",{"type":17,"tag":29,"props":133630,"children":133631},{},[133632],{"type":23,"value":133633},"Now pull applications.",{"type":17,"tag":239,"props":133635,"children":133636},{"id":132403},[133637],{"type":23,"value":132144},{"type":17,"tag":6893,"props":133639,"children":133641},{"className":133640,"code":132148,"language":20901,"meta":23},[20899],[133642],{"type":17,"tag":6121,"props":133643,"children":133644},{"__ignoreMap":7},[133645],{"type":23,"value":132148},{"type":17,"tag":239,"props":133647,"children":133648},{"id":21023},[133649],{"type":23,"value":7377},{"type":17,"tag":6893,"props":133651,"children":133654},{"className":133652,"code":133653,"language":18718,"meta":7},[18716],"const applications = await sdk.ats.listAtsApplications({\n  connectionId,\n  limit: 100,\n  offset: 0,\n});\n",[133655],{"type":17,"tag":6121,"props":133656,"children":133657},{"__ignoreMap":7},[133658],{"type":23,"value":133653},{"type":17,"tag":29,"props":133660,"children":133661},{},[133662,133663,133668],{"type":23,"value":132433},{"type":17,"tag":6121,"props":133664,"children":133666},{"className":133665},[],[133667],{"type":23,"value":132178},{"type":23,"value":133669},", use:",{"type":17,"tag":80,"props":133671,"children":133672},{},[133673,133681,133689,133697,133705],{"type":17,"tag":84,"props":133674,"children":133675},{},[133676],{"type":17,"tag":6121,"props":133677,"children":133679},{"className":133678},[],[133680],{"type":23,"value":117296},{"type":17,"tag":84,"props":133682,"children":133683},{},[133684],{"type":17,"tag":6121,"props":133685,"children":133687},{"className":133686},[],[133688],{"type":23,"value":19949},{"type":17,"tag":84,"props":133690,"children":133691},{},[133692],{"type":17,"tag":6121,"props":133693,"children":133695},{"className":133694},[],[133696],{"type":23,"value":117347},{"type":17,"tag":84,"props":133698,"children":133699},{},[133700],{"type":17,"tag":6121,"props":133701,"children":133703},{"className":133702},[],[133704],{"type":23,"value":132224},{"type":17,"tag":84,"props":133706,"children":133707},{},[133708],{"type":17,"tag":6121,"props":133709,"children":133711},{"className":133710},[],[133712],{"type":23,"value":132233},{"type":17,"tag":29,"props":133714,"children":133715},{},[133716],{"type":23,"value":133717},"Map each application to your canonical candidate record.",{"type":17,"tag":68,"props":133719,"children":133721},{"id":133720},"step-5-visualize-stage-distribution",[133722],{"type":23,"value":133723},"Step 5: Visualize Stage Distribution",{"type":17,"tag":29,"props":133725,"children":133726},{},[133727,133728,133733],{"type":23,"value":33722},{"type":17,"tag":6121,"props":133729,"children":133731},{"className":133730},[],[133732],{"type":23,"value":19949},{"type":23,"value":133734}," for stage aggregation.",{"type":17,"tag":29,"props":133736,"children":133737},{},[133738],{"type":23,"value":133739},"To retrieve available stage vocabulary:",{"type":17,"tag":6893,"props":133741,"children":133743},{"className":133742,"code":132299,"language":20901,"meta":23},[20899],[133744],{"type":17,"tag":6121,"props":133745,"children":133746},{"__ignoreMap":7},[133747],{"type":23,"value":132299},{"type":17,"tag":29,"props":133749,"children":133750},{},[133751,133752,133757],{"type":23,"value":132433},{"type":17,"tag":6121,"props":133753,"children":133755},{"className":133754},[],[133756],{"type":23,"value":132110},{"type":23,"value":20456},{"type":17,"tag":80,"props":133759,"children":133760},{},[133761,133769,133777],{"type":17,"tag":84,"props":133762,"children":133763},{},[133764],{"type":17,"tag":6121,"props":133765,"children":133767},{"className":133766},[],[133768],{"type":23,"value":19949},{"type":17,"tag":84,"props":133770,"children":133771},{},[133772],{"type":17,"tag":6121,"props":133773,"children":133775},{"className":133774},[],[133776],{"type":23,"value":117334},{"type":17,"tag":84,"props":133778,"children":133779},{},[133780],{"type":17,"tag":6121,"props":133781,"children":133783},{"className":133782},[],[133784],{"type":23,"value":24679},{"type":17,"tag":29,"props":133786,"children":133787},{},[133788],{"type":23,"value":133789},"Now compute:",{"type":17,"tag":80,"props":133791,"children":133792},{},[133793,133803,133808],{"type":17,"tag":84,"props":133794,"children":133795},{},[133796,133798],{"type":23,"value":133797},"Count of candidates per ",{"type":17,"tag":6121,"props":133799,"children":133801},{"className":133800},[],[133802],{"type":23,"value":19949},{"type":17,"tag":84,"props":133804,"children":133805},{},[133806],{"type":23,"value":133807},"Count per ATS connection",{"type":17,"tag":84,"props":133809,"children":133810},{},[133811],{"type":23,"value":133812},"Cross-ATS aggregated funnel",{"type":17,"tag":29,"props":133814,"children":133815},{},[133816],{"type":23,"value":133817},"Example output:",{"type":17,"tag":7231,"props":133819,"children":133820},{},[133821,133837],{"type":17,"tag":7235,"props":133822,"children":133823},{},[133824],{"type":17,"tag":7239,"props":133825,"children":133826},{},[133827,133832],{"type":17,"tag":7243,"props":133828,"children":133829},{},[133830],{"type":23,"value":133831},"Stage",{"type":17,"tag":7243,"props":133833,"children":133834},{},[133835],{"type":23,"value":133836},"Count",{"type":17,"tag":7259,"props":133838,"children":133839},{},[133840,133853,133866,133879,133892],{"type":17,"tag":7239,"props":133841,"children":133842},{},[133843,133848],{"type":17,"tag":7266,"props":133844,"children":133845},{},[133846],{"type":23,"value":133847},"NEW",{"type":17,"tag":7266,"props":133849,"children":133850},{},[133851],{"type":23,"value":133852},"125",{"type":17,"tag":7239,"props":133854,"children":133855},{},[133856,133861],{"type":17,"tag":7266,"props":133857,"children":133858},{},[133859],{"type":23,"value":133860},"REVIEWING",{"type":17,"tag":7266,"props":133862,"children":133863},{},[133864],{"type":23,"value":133865},"82",{"type":17,"tag":7239,"props":133867,"children":133868},{},[133869,133874],{"type":17,"tag":7266,"props":133870,"children":133871},{},[133872],{"type":23,"value":133873},"FIRST_INTERVIEW",{"type":17,"tag":7266,"props":133875,"children":133876},{},[133877],{"type":23,"value":133878},"34",{"type":17,"tag":7239,"props":133880,"children":133881},{},[133882,133887],{"type":17,"tag":7266,"props":133883,"children":133884},{},[133885],{"type":23,"value":133886},"OFFERED",{"type":17,"tag":7266,"props":133888,"children":133889},{},[133890],{"type":23,"value":133891},"9",{"type":17,"tag":7239,"props":133893,"children":133894},{},[133895,133900],{"type":17,"tag":7266,"props":133896,"children":133897},{},[133898],{"type":23,"value":133899},"HIRED",{"type":17,"tag":7266,"props":133901,"children":133902},{},[133903],{"type":23,"value":133904},"6",{"type":17,"tag":29,"props":133906,"children":133907},{},[133908],{"type":23,"value":133909},"This becomes a funnel visualization in your product.",{"type":17,"tag":68,"props":133911,"children":133913},{"id":133912},"step-6-highlight-stale-candidates",[133914],{"type":23,"value":133915},"Step 6: Highlight Stale Candidates",{"type":17,"tag":29,"props":133917,"children":133918},{},[133919,133920,133925],{"type":23,"value":33722},{"type":17,"tag":6121,"props":133921,"children":133923},{"className":133922},[],[133924],{"type":23,"value":25337},{"type":23,"value":133926}," on the candidate object.",{"type":17,"tag":29,"props":133928,"children":133929},{},[133930],{"type":23,"value":133931},"Define stale logic, for example:",{"type":17,"tag":80,"props":133933,"children":133934},{},[133935,133940,133945],{"type":17,"tag":84,"props":133936,"children":133937},{},[133938],{"type":23,"value":133939},"No updates in 90 days",{"type":17,"tag":84,"props":133941,"children":133942},{},[133943],{"type":23,"value":133944},"No active applications",{"type":17,"tag":84,"props":133946,"children":133947},{},[133948],{"type":23,"value":133949},"No interview scheduled",{"type":17,"tag":29,"props":133951,"children":133952},{},[133953],{"type":23,"value":19878},{"type":17,"tag":6893,"props":133955,"children":133958},{"className":133956,"code":133957,"language":18718,"meta":7},[18716],"const isStale = daysSince(candidate.updated_at) > 90;\n",[133959],{"type":17,"tag":6121,"props":133960,"children":133961},{"__ignoreMap":7},[133962],{"type":23,"value":133957},{"type":17,"tag":29,"props":133964,"children":133965},{},[133966],{"type":23,"value":133967},"You can also compute:",{"type":17,"tag":80,"props":133969,"children":133970},{},[133971,133976,133981],{"type":17,"tag":84,"props":133972,"children":133973},{},[133974],{"type":23,"value":133975},"Days since last application",{"type":17,"tag":84,"props":133977,"children":133978},{},[133979],{"type":23,"value":133980},"Days since last interview",{"type":17,"tag":84,"props":133982,"children":133983},{},[133984],{"type":23,"value":133985},"Days since stage change (if you track it yourself)",{"type":17,"tag":29,"props":133987,"children":133988},{},[133989],{"type":23,"value":133990},"Unified does not expose historical stage transitions, so you must track changes over time if you need them.",{"type":17,"tag":68,"props":133992,"children":133994},{"id":133993},"step-7-merge-internal-ats-data",[133995],{"type":23,"value":133996},"Step 7: Merge Internal + ATS Data",{"type":17,"tag":29,"props":133998,"children":133999},{},[134000],{"type":23,"value":134001},"If your product also has:",{"type":17,"tag":80,"props":134003,"children":134004},{},[134005,134010,134015],{"type":17,"tag":84,"props":134006,"children":134007},{},[134008],{"type":23,"value":134009},"Internal CRM candidates",{"type":17,"tag":84,"props":134011,"children":134012},{},[134013],{"type":23,"value":134014},"Sourced prospects",{"type":17,"tag":84,"props":134016,"children":134017},{},[134018],{"type":23,"value":134019},"Event leads",{"type":17,"tag":29,"props":134021,"children":134022},{},[134023],{"type":23,"value":134024},"You can unify them using the same identity logic:",{"type":17,"tag":80,"props":134026,"children":134027},{},[134028,134033,134037],{"type":17,"tag":84,"props":134029,"children":134030},{},[134031],{"type":23,"value":134032},"Email",{"type":17,"tag":84,"props":134034,"children":134035},{},[134036],{"type":23,"value":11357},{"type":17,"tag":84,"props":134038,"children":134039},{},[134040],{"type":23,"value":134041},"Phone",{"type":17,"tag":29,"props":134043,"children":134044},{},[134045],{"type":23,"value":134046},"Then show:",{"type":17,"tag":80,"props":134048,"children":134049},{},[134050,134055,134060],{"type":17,"tag":84,"props":134051,"children":134052},{},[134053],{"type":23,"value":134054},"'Already in ATS (Greenhouse)'",{"type":17,"tag":84,"props":134056,"children":134057},{},[134058],{"type":23,"value":134059},"'Previously applied in EMEA instance'",{"type":17,"tag":84,"props":134061,"children":134062},{},[134063],{"type":23,"value":134064},"'Rejected 6 months ago'",{"type":17,"tag":29,"props":134066,"children":134067},{},[134068],{"type":23,"value":134069},"This prevents duplicate outreach and improves recruiter efficiency.",{"type":17,"tag":239,"props":134071,"children":134073},{"id":134072},"architecture-recommendation",[134074],{"type":23,"value":134075},"Architecture Recommendation",{"type":17,"tag":6154,"props":134077,"children":134078},{},[134079,134084,134089,134094,134099],{"type":17,"tag":84,"props":134080,"children":134081},{},[134082],{"type":23,"value":134083},"Initial full sync of candidates and applications",{"type":17,"tag":84,"props":134085,"children":134086},{},[134087],{"type":23,"value":134088},"Store in internal database",{"type":17,"tag":84,"props":134090,"children":134091},{},[134092],{"type":23,"value":134093},"Deduplicate into canonical identities",{"type":17,"tag":84,"props":134095,"children":134096},{},[134097],{"type":23,"value":134098},"Compute analytics from your own DB",{"type":17,"tag":84,"props":134100,"children":134101},{},[134102,134104],{"type":23,"value":134103},"Refresh via:\n",{"type":17,"tag":80,"props":134105,"children":134106},{},[134107,134116],{"type":17,"tag":84,"props":134108,"children":134109},{},[134110,134114],{"type":17,"tag":133,"props":134111,"children":134112},{"href":4999},[134113],{"type":23,"value":43896},{"type":23,"value":134115}," (if enabled)",{"type":17,"tag":84,"props":134117,"children":134118},{},[134119,134121],{"type":23,"value":134120},"Or incremental polling using ",{"type":17,"tag":6121,"props":134122,"children":134124},{"className":134123},[],[134125],{"type":23,"value":26291},{"type":17,"tag":29,"props":134127,"children":134128},{},[134129],{"type":23,"value":134130},"Do not recompute dedupe in real time on every page load.",{"type":17,"tag":239,"props":134132,"children":134134},{"id":134133},"why-this-matters-to-your-customers",[134135],{"type":23,"value":134136},"Why This Matters to Your Customers",{"type":17,"tag":29,"props":134138,"children":134139},{},[134140],{"type":23,"value":134141},"Talent pool visibility helps customers:",{"type":17,"tag":80,"props":134143,"children":134144},{},[134145,134150,134155,134160,134165],{"type":17,"tag":84,"props":134146,"children":134147},{},[134148],{"type":23,"value":134149},"Avoid sourcing duplicates",{"type":17,"tag":84,"props":134151,"children":134152},{},[134153],{"type":23,"value":134154},"Reduce recruiter fatigue",{"type":17,"tag":84,"props":134156,"children":134157},{},[134158],{"type":23,"value":134159},"Understand true funnel size",{"type":17,"tag":84,"props":134161,"children":134162},{},[134163],{"type":23,"value":134164},"Identify pipeline bottlenecks",{"type":17,"tag":84,"props":134166,"children":134167},{},[134168],{"type":23,"value":134169},"Re-engage dormant candidates",{"type":17,"tag":29,"props":134171,"children":134172},{},[134173],{"type":23,"value":134174},"By using Unified's normalized ATS API as a read layer, you can provide cross-platform visibility without building custom integrations for every ATS.",{"type":17,"tag":68,"props":134176,"children":134177},{"id":132938},[134178],{"type":23,"value":132941},{"type":17,"tag":29,"props":134180,"children":134181},{},[134182],{"type":23,"value":134183},"Deduplicating and visualizing talent pools across ATS platforms is not an integration problem.",{"type":17,"tag":29,"props":134185,"children":134186},{},[134187],{"type":23,"value":134188},"It's an identity and analytics problem.",{"type":17,"tag":29,"props":134190,"children":134191},{},[134192],{"type":23,"value":25437},{"type":17,"tag":80,"props":134194,"children":134195},{},[134196,134201,134206,134210],{"type":17,"tag":84,"props":134197,"children":134198},{},[134199],{"type":23,"value":134200},"Structured candidate models",{"type":17,"tag":84,"props":134202,"children":134203},{},[134204],{"type":23,"value":134205},"Standardized application objects",{"type":17,"tag":84,"props":134207,"children":134208},{},[134209],{"type":23,"value":132103},{"type":17,"tag":84,"props":134211,"children":134212},{},[134213,134215,134219],{"type":23,"value":134214},"Consistent ",{"type":17,"tag":133,"props":134216,"children":134217},{"href":1857},[134218],{"type":23,"value":1860},{"type":23,"value":134220}," and incremental updates",{"type":17,"tag":29,"props":134222,"children":134223},{},[134224],{"type":23,"value":134225},"Your product layers on:",{"type":17,"tag":80,"props":134227,"children":134228},{},[134229,134234,134239,134244,134249],{"type":17,"tag":84,"props":134230,"children":134231},{},[134232],{"type":23,"value":134233},"Identity resolution",{"type":17,"tag":84,"props":134235,"children":134236},{},[134237],{"type":23,"value":134238},"Canonical merging",{"type":17,"tag":84,"props":134240,"children":134241},{},[134242],{"type":23,"value":134243},"Funnel analytics",{"type":17,"tag":84,"props":134245,"children":134246},{},[134247],{"type":23,"value":134248},"Staleness detection",{"type":17,"tag":84,"props":134250,"children":134251},{},[134252],{"type":23,"value":134253},"Recruiter-facing insights",{"type":17,"tag":29,"props":134255,"children":134256},{},[134257],{"type":23,"value":134258},"That combination turns fragmented ATS data into actionable talent intelligence.",{"type":17,"tag":29,"props":134260,"children":134261},{},[134262],{"type":17,"tag":133,"props":134263,"children":134265},{"href":1612,"rel":134264},[214],[134266],{"type":23,"value":44481},{"type":17,"tag":29,"props":134268,"children":134269},{},[134270],{"type":17,"tag":133,"props":134271,"children":134273},{"href":1623,"rel":134272},[214],[134274],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":134276},[134277,134278,134282,134287,134288,134292,134293,134294,134298],{"id":132052,"depth":1629,"text":132055},{"id":133244,"depth":1629,"text":133247,"children":134279},[134280,134281],{"id":132141,"depth":1635,"text":132144},{"id":133268,"depth":1635,"text":133271},{"id":133402,"depth":1629,"text":133405,"children":134283},[134284,134285,134286],{"id":133418,"depth":1635,"text":133421},{"id":133471,"depth":1635,"text":133474},{"id":133517,"depth":1635,"text":133520},{"id":133552,"depth":1629,"text":133555},{"id":133625,"depth":1629,"text":133628,"children":134289},[134290,134291],{"id":132403,"depth":1635,"text":132144},{"id":21023,"depth":1635,"text":7377},{"id":133720,"depth":1629,"text":133723},{"id":133912,"depth":1629,"text":133915},{"id":133993,"depth":1629,"text":133996,"children":134295},[134296,134297],{"id":134072,"depth":1635,"text":134075},{"id":134133,"depth":1635,"text":134136},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_deduplicate_and_visualize_talent_pools_across_ats_platforms_using_unified_ats_api.md","blog/how_to_deduplicate_and_visualize_talent_pools_across_ats_platforms_using_unified_ats_api.md","blog/how_to_deduplicate_and_visualize_talent_pools_across_ats_platforms_using_unified_ats_api",{"_path":134303,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":134304,"description":134305,"img":134306,"date":131925,"tag":12,"body":134307,"_type":1677,"_id":135402,"_source":1679,"_file":135403,"_stem":135404,"_extension":1682},"/blog/how_to_pull_screening_questions_from_an_ats_and_embed_them_in_your_product_using_unified_ats_api","How to Pull Screening Questions from an ATS and Embed Them in Your Product Using Unified's ATS API","Screening questions are often defined inside the ATS.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_pull_screening_questions_from_an_ats_and_embed_them_in_your_product_using_unified_ats_api-icon.png",{"type":14,"children":134308,"toc":135379},[134309,134314,134317,134324,134328,134332,134359,134364,134392,134402,134406,134411,134463,134468,134473,134479,134484,134488,134497,134501,134510,134516,134528,134537,134548,134568,134574,134579,134584,134749,134754,134785,134790,134796,134801,134810,134814,134844,134850,134861,134866,134875,134880,134893,134898,134928,134934,134943,134947,134956,134961,134970,134975,134984,134989,134995,135000,135009,135014,135023,135029,135034,135038,135047,135051,135060,135065,135074,135080,135085,135090,135124,135136,135142,135147,135182,135188,135244,135249,135255,135260,135294,135299,135303,135308,135331,135335,135358,135363,135371],{"type":17,"tag":18,"props":134310,"children":134312},{"id":134311},"how-to-pull-screening-questions-from-an-ats-and-embed-them-in-your-product-using-unifieds-ats-api",[134313],{"type":23,"value":134304},{"type":17,"tag":25,"props":134315,"children":134316},{},[],{"type":17,"tag":29,"props":134318,"children":134319},{},[134320],{"type":17,"tag":33,"props":134321,"children":134322},{},[134323],{"type":23,"value":131160},{"type":17,"tag":29,"props":134325,"children":134326},{},[134327],{"type":23,"value":134305},{"type":17,"tag":29,"props":134329,"children":134330},{},[134331],{"type":23,"value":131951},{"type":17,"tag":80,"props":134333,"children":134334},{},[134335,134340,134345,134350,134354],{"type":17,"tag":84,"props":134336,"children":134337},{},[134338],{"type":23,"value":134339},"A custom apply flow",{"type":17,"tag":84,"props":134341,"children":134342},{},[134343],{"type":23,"value":134344},"A sourcing portal",{"type":17,"tag":84,"props":134346,"children":134347},{},[134348],{"type":23,"value":134349},"A talent CRM",{"type":17,"tag":84,"props":134351,"children":134352},{},[134353],{"type":23,"value":131964},{"type":17,"tag":84,"props":134355,"children":134356},{},[134357],{"type":23,"value":134358},"A candidate engagement product",{"type":17,"tag":29,"props":134360,"children":134361},{},[134362],{"type":23,"value":134363},"…you need to:",{"type":17,"tag":6154,"props":134365,"children":134366},{},[134367,134372,134377,134382,134387],{"type":17,"tag":84,"props":134368,"children":134369},{},[134370],{"type":23,"value":134371},"Pull screening questions from the ATS",{"type":17,"tag":84,"props":134373,"children":134374},{},[134375],{"type":23,"value":134376},"Render them dynamically in your product",{"type":17,"tag":84,"props":134378,"children":134379},{},[134380],{"type":23,"value":134381},"Collect structured responses",{"type":17,"tag":84,"props":134383,"children":134384},{},[134385],{"type":23,"value":134386},"Push those responses back into the ATS",{"type":17,"tag":84,"props":134388,"children":134389},{},[134390],{"type":23,"value":134391},"Attach them to the correct application",{"type":17,"tag":29,"props":134393,"children":134394},{},[134395,134397,134401],{"type":23,"value":134396},"This guide walks through that full read + structured write-back workflow using Unified's ",{"type":17,"tag":133,"props":134398,"children":134399},{"href":55696},[134400],{"type":23,"value":55699},{"type":23,"value":54},{"type":17,"tag":68,"props":134403,"children":134404},{"id":132052},[134405],{"type":23,"value":132055},{"type":17,"tag":29,"props":134407,"children":134408},{},[134409],{"type":23,"value":134410},"The workflow looks like this:",{"type":17,"tag":6154,"props":134412,"children":134413},{},[134414,134419,134430,134435,134440,134445,134450],{"type":17,"tag":84,"props":134415,"children":134416},{},[134417],{"type":23,"value":134418},"Retrieve the job from the ATS",{"type":17,"tag":84,"props":134420,"children":134421},{},[134422,134424],{"type":23,"value":134423},"Extract ",{"type":17,"tag":6121,"props":134425,"children":134427},{"className":134426},[],[134428],{"type":23,"value":134429},"job.questions[]",{"type":17,"tag":84,"props":134431,"children":134432},{},[134433],{"type":23,"value":134434},"Normalize question types",{"type":17,"tag":84,"props":134436,"children":134437},{},[134438],{"type":23,"value":134439},"Render a dynamic form in your UI",{"type":17,"tag":84,"props":134441,"children":134442},{},[134443],{"type":23,"value":134444},"Create (or retrieve) the candidate",{"type":17,"tag":84,"props":134446,"children":134447},{},[134448],{"type":23,"value":134449},"Create the application",{"type":17,"tag":84,"props":134451,"children":134452},{},[134453,134455,134461],{"type":23,"value":134454},"Attach ",{"type":17,"tag":6121,"props":134456,"children":134458},{"className":134457},[],[134459],{"type":23,"value":134460},"answers[]",{"type":23,"value":134462}," to the application",{"type":17,"tag":29,"props":134464,"children":134465},{},[134466],{"type":23,"value":134467},"The ATS remains the system of record.",{"type":17,"tag":29,"props":134469,"children":134470},{},[134471],{"type":23,"value":134472},"Your product becomes a structured front-end for screening.",{"type":17,"tag":68,"props":134474,"children":134476},{"id":134475},"step-1-retrieve-the-job-object",[134477],{"type":23,"value":134478},"Step 1: Retrieve the Job Object",{"type":17,"tag":29,"props":134480,"children":134481},{},[134482],{"type":23,"value":134483},"Screening questions live on the job object.",{"type":17,"tag":239,"props":134485,"children":134486},{"id":132141},[134487],{"type":23,"value":132144},{"type":17,"tag":6893,"props":134489,"children":134492},{"className":134490,"code":134491,"language":20901,"meta":23},[20899],"GET /ats/{connection_id}/job/{id}\n",[134493],{"type":17,"tag":6121,"props":134494,"children":134495},{"__ignoreMap":7},[134496],{"type":23,"value":134491},{"type":17,"tag":239,"props":134498,"children":134499},{"id":133268},[134500],{"type":23,"value":133271},{"type":17,"tag":6893,"props":134502,"children":134505},{"className":134503,"code":134504,"language":18718,"meta":7},[18716],"const job = await sdk.ats.getAtsJob({\n  connectionId,\n  id: jobId,\n  fields: '',\n  raw: '',\n});\n",[134506],{"type":17,"tag":6121,"props":134507,"children":134508},{"__ignoreMap":7},[134509],{"type":23,"value":134504},{"type":17,"tag":68,"props":134511,"children":134513},{"id":134512},"screening-question-structure",[134514],{"type":23,"value":134515},"Screening Question Structure",{"type":17,"tag":29,"props":134517,"children":134518},{},[134519,134521,134526],{"type":23,"value":134520},"From the ",{"type":17,"tag":6121,"props":134522,"children":134524},{"className":134523},[],[134525],{"type":23,"value":75743},{"type":23,"value":134527}," model:",{"type":17,"tag":6893,"props":134529,"children":134532},{"className":134530,"code":134531,"language":18718,"meta":7},[18716],"questions: [\n  {\n    id: string,\n    question: string,\n    required: boolean,\n    description?: string,\n    prompt?: string,\n    type:\n      'TEXT' |\n      'NUMBER' |\n      'DATE' |\n      'BOOLEAN' |\n      'MULTIPLE_CHOICE' |\n      'FILE' |\n      'TEXTAREA' |\n      'MULTIPLE_SELECT' |\n      'UNIVERSITY' |\n      'YES_NO' |\n      'CURRENCY' |\n      'URL',\n    options?: string[]\n  }\n]\n",[134533],{"type":17,"tag":6121,"props":134534,"children":134535},{"__ignoreMap":7},[134536],{"type":23,"value":134531},{"type":17,"tag":29,"props":134538,"children":134539},{},[134540,134542,134547],{"type":23,"value":134541},"Each question includes a unique ",{"type":17,"tag":6121,"props":134543,"children":134545},{"className":134544},[],[134546],{"type":23,"value":18766},{"type":23,"value":54},{"type":17,"tag":29,"props":134549,"children":134550},{},[134551,134553,134558,134560,134566],{"type":23,"value":134552},"That ",{"type":17,"tag":6121,"props":134554,"children":134556},{"className":134555},[],[134557],{"type":23,"value":18766},{"type":23,"value":134559}," is what you will later use as ",{"type":17,"tag":6121,"props":134561,"children":134563},{"className":134562},[],[134564],{"type":23,"value":134565},"question_id",{"type":23,"value":134567}," when writing answers back to the application.",{"type":17,"tag":68,"props":134569,"children":134571},{"id":134570},"step-2-normalize-question-types",[134572],{"type":23,"value":134573},"Step 2: Normalize Question Types",{"type":17,"tag":29,"props":134575,"children":134576},{},[134577],{"type":23,"value":134578},"Your frontend should normalize ATS question types into your own UI schema.",{"type":17,"tag":29,"props":134580,"children":134581},{},[134582],{"type":23,"value":134583},"Example mapping:",{"type":17,"tag":7231,"props":134585,"children":134586},{},[134587,134603],{"type":17,"tag":7235,"props":134588,"children":134589},{},[134590],{"type":17,"tag":7239,"props":134591,"children":134592},{},[134593,134598],{"type":17,"tag":7243,"props":134594,"children":134595},{},[134596],{"type":23,"value":134597},"ATS Type",{"type":17,"tag":7243,"props":134599,"children":134600},{},[134601],{"type":23,"value":134602},"UI Component",{"type":17,"tag":7259,"props":134604,"children":134605},{},[134606,134619,134632,134645,134658,134671,134684,134697,134710,134723,134736],{"type":17,"tag":7239,"props":134607,"children":134608},{},[134609,134614],{"type":17,"tag":7266,"props":134610,"children":134611},{},[134612],{"type":23,"value":134613},"TEXT",{"type":17,"tag":7266,"props":134615,"children":134616},{},[134617],{"type":23,"value":134618},"Single-line input",{"type":17,"tag":7239,"props":134620,"children":134621},{},[134622,134627],{"type":17,"tag":7266,"props":134623,"children":134624},{},[134625],{"type":23,"value":134626},"TEXTAREA",{"type":17,"tag":7266,"props":134628,"children":134629},{},[134630],{"type":23,"value":134631},"Multi-line input",{"type":17,"tag":7239,"props":134633,"children":134634},{},[134635,134640],{"type":17,"tag":7266,"props":134636,"children":134637},{},[134638],{"type":23,"value":134639},"NUMBER",{"type":17,"tag":7266,"props":134641,"children":134642},{},[134643],{"type":23,"value":134644},"Numeric input",{"type":17,"tag":7239,"props":134646,"children":134647},{},[134648,134653],{"type":17,"tag":7266,"props":134649,"children":134650},{},[134651],{"type":23,"value":134652},"DATE",{"type":17,"tag":7266,"props":134654,"children":134655},{},[134656],{"type":23,"value":134657},"Date picker",{"type":17,"tag":7239,"props":134659,"children":134660},{},[134661,134666],{"type":17,"tag":7266,"props":134662,"children":134663},{},[134664],{"type":23,"value":134665},"BOOLEAN",{"type":17,"tag":7266,"props":134667,"children":134668},{},[134669],{"type":23,"value":134670},"Checkbox",{"type":17,"tag":7239,"props":134672,"children":134673},{},[134674,134679],{"type":17,"tag":7266,"props":134675,"children":134676},{},[134677],{"type":23,"value":134678},"YES_NO",{"type":17,"tag":7266,"props":134680,"children":134681},{},[134682],{"type":23,"value":134683},"Radio buttons",{"type":17,"tag":7239,"props":134685,"children":134686},{},[134687,134692],{"type":17,"tag":7266,"props":134688,"children":134689},{},[134690],{"type":23,"value":134691},"MULTIPLE_CHOICE",{"type":17,"tag":7266,"props":134693,"children":134694},{},[134695],{"type":23,"value":134696},"Single select dropdown",{"type":17,"tag":7239,"props":134698,"children":134699},{},[134700,134705],{"type":17,"tag":7266,"props":134701,"children":134702},{},[134703],{"type":23,"value":134704},"MULTIPLE_SELECT",{"type":17,"tag":7266,"props":134706,"children":134707},{},[134708],{"type":23,"value":134709},"Multi-select control",{"type":17,"tag":7239,"props":134711,"children":134712},{},[134713,134718],{"type":17,"tag":7266,"props":134714,"children":134715},{},[134716],{"type":23,"value":134717},"FILE",{"type":17,"tag":7266,"props":134719,"children":134720},{},[134721],{"type":23,"value":134722},"File upload",{"type":17,"tag":7239,"props":134724,"children":134725},{},[134726,134731],{"type":17,"tag":7266,"props":134727,"children":134728},{},[134729],{"type":23,"value":134730},"URL",{"type":17,"tag":7266,"props":134732,"children":134733},{},[134734],{"type":23,"value":134735},"URL input",{"type":17,"tag":7239,"props":134737,"children":134738},{},[134739,134744],{"type":17,"tag":7266,"props":134740,"children":134741},{},[134742],{"type":23,"value":134743},"CURRENCY",{"type":17,"tag":7266,"props":134745,"children":134746},{},[134747],{"type":23,"value":134748},"Currency field",{"type":17,"tag":29,"props":134750,"children":134751},{},[134752],{"type":23,"value":134753},"Render dynamically based on:",{"type":17,"tag":80,"props":134755,"children":134756},{},[134757,134765,134774],{"type":17,"tag":84,"props":134758,"children":134759},{},[134760],{"type":17,"tag":6121,"props":134761,"children":134763},{"className":134762},[],[134764],{"type":23,"value":27310},{"type":17,"tag":84,"props":134766,"children":134767},{},[134768],{"type":17,"tag":6121,"props":134769,"children":134771},{"className":134770},[],[134772],{"type":23,"value":134773},"required",{"type":17,"tag":84,"props":134775,"children":134776},{},[134777,134783],{"type":17,"tag":6121,"props":134778,"children":134780},{"className":134779},[],[134781],{"type":23,"value":134782},"options[]",{"type":23,"value":134784}," (when applicable)",{"type":17,"tag":29,"props":134786,"children":134787},{},[134788],{"type":23,"value":134789},"Do not hardcode question definitions. Always trust the job object.",{"type":17,"tag":68,"props":134791,"children":134793},{"id":134792},"step-3-collect-candidate-responses",[134794],{"type":23,"value":134795},"Step 3: Collect Candidate Responses",{"type":17,"tag":29,"props":134797,"children":134798},{},[134799],{"type":23,"value":134800},"Your form should produce a structured payload like:",{"type":17,"tag":6893,"props":134802,"children":134805},{"className":134803,"code":134804,"language":22503,"meta":7},[22501],"[\n  {\n    \"question_id\": \"q_123\",\n    \"answers\": [\"Yes\"]\n  },\n  {\n    \"question_id\": \"q_456\",\n    \"answers\": [\"5\"]\n  }\n]\n",[134806],{"type":17,"tag":6121,"props":134807,"children":134808},{"__ignoreMap":7},[134809],{"type":23,"value":134804},{"type":17,"tag":29,"props":134811,"children":134812},{},[134813],{"type":23,"value":19907},{"type":17,"tag":80,"props":134815,"children":134816},{},[134817,134827,134832],{"type":17,"tag":84,"props":134818,"children":134819},{},[134820,134825],{"type":17,"tag":6121,"props":134821,"children":134823},{"className":134822},[],[134824],{"type":23,"value":39871},{"type":23,"value":134826}," is always an array of strings",{"type":17,"tag":84,"props":134828,"children":134829},{},[134830],{"type":23,"value":134831},"Even for single-value questions",{"type":17,"tag":84,"props":134833,"children":134834},{},[134835,134837,134842],{"type":23,"value":134836},"Maintain order but rely on ",{"type":17,"tag":6121,"props":134838,"children":134840},{"className":134839},[],[134841],{"type":23,"value":134565},{"type":23,"value":134843}," for mapping",{"type":17,"tag":68,"props":134845,"children":134847},{"id":134846},"step-4-handle-file-type-questions",[134848],{"type":23,"value":134849},"Step 4: Handle FILE-Type Questions",{"type":17,"tag":29,"props":134851,"children":134852},{},[134853,134854,134859],{"type":23,"value":71363},{"type":17,"tag":6121,"props":134855,"children":134857},{"className":134856},[],[134858],{"type":23,"value":134717},{"type":23,"value":134860}," questions, responses must be represented as a string.",{"type":17,"tag":29,"props":134862,"children":134863},{},[134864],{"type":23,"value":134865},"Unified's ATS Application model expects:",{"type":17,"tag":6893,"props":134867,"children":134870},{"className":134868,"code":134869,"language":20901,"meta":23},[20899],"answers[].answers[]: string[]\n",[134871],{"type":17,"tag":6121,"props":134872,"children":134873},{"__ignoreMap":7},[134874],{"type":23,"value":134869},{"type":17,"tag":29,"props":134876,"children":134877},{},[134878],{"type":23,"value":134879},"For file-based questions, supply:",{"type":17,"tag":80,"props":134881,"children":134882},{},[134883,134888],{"type":17,"tag":84,"props":134884,"children":134885},{},[134886],{"type":23,"value":134887},"A publicly accessible file URL (recommended), or",{"type":17,"tag":84,"props":134889,"children":134890},{},[134891],{"type":23,"value":134892},"A document ID if the downstream ATS requires pre-upload",{"type":17,"tag":29,"props":134894,"children":134895},{},[134896],{"type":23,"value":134897},"Typical workflow:",{"type":17,"tag":6154,"props":134899,"children":134900},{},[134901,134906,134923],{"type":17,"tag":84,"props":134902,"children":134903},{},[134904],{"type":23,"value":134905},"Upload the file via the Document endpoint",{"type":17,"tag":84,"props":134907,"children":134908},{},[134909,134911,134917,134918],{"type":23,"value":134910},"Capture the returned ",{"type":17,"tag":6121,"props":134912,"children":134914},{"className":134913},[],[134915],{"type":23,"value":134916},"document_url",{"type":23,"value":75890},{"type":17,"tag":6121,"props":134919,"children":134921},{"className":134920},[],[134922],{"type":23,"value":18766},{"type":17,"tag":84,"props":134924,"children":134925},{},[134926],{"type":23,"value":134927},"Use that value as the answer",{"type":17,"tag":239,"props":134929,"children":134931},{"id":134930},"upload-file",[134932],{"type":23,"value":134933},"Upload File",{"type":17,"tag":6893,"props":134935,"children":134938},{"className":134936,"code":134937,"language":20901,"meta":23},[20899],"POST /ats/{connection_id}/document\n",[134939],{"type":17,"tag":6121,"props":134940,"children":134941},{"__ignoreMap":7},[134942],{"type":23,"value":134937},{"type":17,"tag":29,"props":134944,"children":134945},{},[134946],{"type":23,"value":19878},{"type":17,"tag":6893,"props":134948,"children":134951},{"className":134949,"code":134950,"language":18718,"meta":7},[18716],"const doc = await sdk.ats.createAtsDocument({\n  connectionId,\n  atsDocument: {\n    filename: 'resume.pdf',\n    type: 'RESUME',\n    candidate_id: candidateId,\n    document_data: base64EncodedFile,\n  },\n});\n",[134952],{"type":17,"tag":6121,"props":134953,"children":134954},{"__ignoreMap":7},[134955],{"type":23,"value":134950},{"type":17,"tag":29,"props":134957,"children":134958},{},[134959],{"type":23,"value":134960},"Then in your answers:",{"type":17,"tag":6893,"props":134962,"children":134965},{"className":134963,"code":134964,"language":22503,"meta":7},[22501],"{\n  \"question_id\": \"file_q_001\",\n  \"answers\": [\"https://your-storage.com/file.pdf\"]\n}\n",[134966],{"type":17,"tag":6121,"props":134967,"children":134968},{"__ignoreMap":7},[134969],{"type":23,"value":134964},{"type":17,"tag":29,"props":134971,"children":134972},{},[134973],{"type":23,"value":134974},"or:",{"type":17,"tag":6893,"props":134976,"children":134979},{"className":134977,"code":134978,"language":22503,"meta":7},[22501],"{\n  \"question_id\": \"file_q_001\",\n  \"answers\": [\"document_id_789\"]\n}\n",[134980],{"type":17,"tag":6121,"props":134981,"children":134982},{"__ignoreMap":7},[134983],{"type":23,"value":134978},{"type":17,"tag":29,"props":134985,"children":134986},{},[134987],{"type":23,"value":134988},"File handling requirements vary by integration. Always confirm provider expectations.",{"type":17,"tag":68,"props":134990,"children":134992},{"id":134991},"step-5-create-the-candidate-if-needed",[134993],{"type":23,"value":134994},"Step 5: Create the Candidate (If Needed)",{"type":17,"tag":29,"props":134996,"children":134997},{},[134998],{"type":23,"value":134999},"Before attaching answers, ensure the candidate exists.",{"type":17,"tag":6893,"props":135001,"children":135004},{"className":135002,"code":135003,"language":18718,"meta":7},[18716],"const candidate = await sdk.ats.createAtsCandidate({\n  connectionId,\n  atsCandidate: {\n    first_name: 'Jane',\n    last_name: 'Doe',\n    emails: [{ email: 'jane@example.com', type: 'WORK' }]\n  },\n});\n",[135005],{"type":17,"tag":6121,"props":135006,"children":135007},{"__ignoreMap":7},[135008],{"type":23,"value":135003},{"type":17,"tag":29,"props":135010,"children":135011},{},[135012],{"type":23,"value":135013},"Or dedupe first using:",{"type":17,"tag":6893,"props":135015,"children":135018},{"className":135016,"code":135017,"language":18718,"meta":7},[18716],"query: 'jane@example.com'\n",[135019],{"type":17,"tag":6121,"props":135020,"children":135021},{"__ignoreMap":7},[135022],{"type":23,"value":135017},{"type":17,"tag":68,"props":135024,"children":135026},{"id":135025},"step-6-create-the-application-with-answers",[135027],{"type":23,"value":135028},"Step 6: Create the Application With Answers",{"type":17,"tag":29,"props":135030,"children":135031},{},[135032],{"type":23,"value":135033},"You can attach screening responses during application creation.",{"type":17,"tag":239,"props":135035,"children":135036},{"id":132403},[135037],{"type":23,"value":132144},{"type":17,"tag":6893,"props":135039,"children":135042},{"className":135040,"code":135041,"language":20901,"meta":23},[20899],"POST /ats/{connection_id}/application\n",[135043],{"type":17,"tag":6121,"props":135044,"children":135045},{"__ignoreMap":7},[135046],{"type":23,"value":135041},{"type":17,"tag":239,"props":135048,"children":135049},{"id":21023},[135050],{"type":23,"value":7377},{"type":17,"tag":6893,"props":135052,"children":135055},{"className":135053,"code":135054,"language":18718,"meta":7},[18716],"const application = await sdk.ats.createAtsApplication({\n  connectionId,\n  atsApplication: {\n    candidate_id: candidate.id,\n    job_id: job.id,\n    answers: [\n      {\n        question_id: \"q_123\",\n        answers: [\"Yes\"]\n      },\n      {\n        question_id: \"q_456\",\n        answers: [\"5\"]\n      }\n    ],\n    status: \"NEW\"\n  },\n});\n",[135056],{"type":17,"tag":6121,"props":135057,"children":135058},{"__ignoreMap":7},[135059],{"type":23,"value":135054},{"type":17,"tag":29,"props":135061,"children":135062},{},[135063],{"type":23,"value":135064},"Alternatively, you can update answers after application creation:",{"type":17,"tag":6893,"props":135066,"children":135069},{"className":135067,"code":135068,"language":18718,"meta":7},[18716],"await sdk.ats.updateAtsApplication({\n  connectionId,\n  id: application.id,\n  atsApplication: {\n    answers: [\n      {\n        question_id: \"q_123\",\n        answers: [\"Yes\"]\n      }\n    ]\n  }\n});\n",[135070],{"type":17,"tag":6121,"props":135071,"children":135072},{"__ignoreMap":7},[135073],{"type":23,"value":135068},{"type":17,"tag":68,"props":135075,"children":135077},{"id":135076},"mapping-questions-to-answers",[135078],{"type":23,"value":135079},"Mapping Questions to Answers",{"type":17,"tag":29,"props":135081,"children":135082},{},[135083],{"type":23,"value":135084},"There is no explicit documentation stating that Unified automatically resolves mappings between job questions and application answers.",{"type":17,"tag":29,"props":135086,"children":135087},{},[135088],{"type":23,"value":135089},"The intended implementation pattern is:",{"type":17,"tag":80,"props":135091,"children":135092},{},[135093,135103,135113],{"type":17,"tag":84,"props":135094,"children":135095},{},[135096,135098],{"type":23,"value":135097},"Retrieve ",{"type":17,"tag":6121,"props":135099,"children":135101},{"className":135100},[],[135102],{"type":23,"value":134429},{"type":17,"tag":84,"props":135104,"children":135105},{},[135106,135107],{"type":23,"value":33722},{"type":17,"tag":6121,"props":135108,"children":135110},{"className":135109},[],[135111],{"type":23,"value":135112},"job.questions[].id",{"type":17,"tag":84,"props":135114,"children":135115},{},[135116,135118],{"type":23,"value":135117},"Submit that same ID as ",{"type":17,"tag":6121,"props":135119,"children":135121},{"className":135120},[],[135122],{"type":23,"value":135123},"answers[].question_id",{"type":17,"tag":29,"props":135125,"children":135126},{},[135127,135129,135134],{"type":23,"value":135128},"If provider-native IDs are needed, use the ",{"type":17,"tag":6121,"props":135130,"children":135132},{"className":135131},[],[135133],{"type":23,"value":62389},{"type":23,"value":135135}," field to inspect vendor-specific structures.",{"type":17,"tag":68,"props":135137,"children":135139},{"id":135138},"step-7-handling-custom-fields",[135140],{"type":23,"value":135141},"Step 7: Handling Custom Fields",{"type":17,"tag":29,"props":135143,"children":135144},{},[135145],{"type":23,"value":135146},"If your product captures additional metadata:",{"type":17,"tag":80,"props":135148,"children":135149},{},[135150,135172,135177],{"type":17,"tag":84,"props":135151,"children":135152},{},[135153,135154,135159,135161,135166,135167],{"type":23,"value":33722},{"type":17,"tag":6121,"props":135155,"children":135157},{"className":135156},[],[135158],{"type":23,"value":133378},{"type":23,"value":135160}," on ",{"type":17,"tag":6121,"props":135162,"children":135164},{"className":135163},[],[135165],{"type":23,"value":132178},{"type":23,"value":75890},{"type":17,"tag":6121,"props":135168,"children":135170},{"className":135169},[],[135171],{"type":23,"value":133291},{"type":17,"tag":84,"props":135173,"children":135174},{},[135175],{"type":23,"value":135176},"Confirm writable support for your integration",{"type":17,"tag":84,"props":135178,"children":135179},{},[135180],{"type":23,"value":135181},"Avoid assuming universal custom-field availability",{"type":17,"tag":68,"props":135183,"children":135185},{"id":135184},"full-workflow-summary",[135186],{"type":23,"value":135187},"Full Workflow Summary",{"type":17,"tag":6154,"props":135189,"children":135190},{},[135191,135200,135209,135214,135219,135224,135239],{"type":17,"tag":84,"props":135192,"children":135193},{},[135194],{"type":17,"tag":6121,"props":135195,"children":135197},{"className":135196},[],[135198],{"type":23,"value":135199},"GET job",{"type":17,"tag":84,"props":135201,"children":135202},{},[135203,135204],{"type":23,"value":134423},{"type":17,"tag":6121,"props":135205,"children":135207},{"className":135206},[],[135208],{"type":23,"value":134429},{"type":17,"tag":84,"props":135210,"children":135211},{},[135212],{"type":23,"value":135213},"Render dynamic form",{"type":17,"tag":84,"props":135215,"children":135216},{},[135217],{"type":23,"value":135218},"Upload files if needed",{"type":17,"tag":84,"props":135220,"children":135221},{},[135222],{"type":23,"value":135223},"Create candidate (or dedupe)",{"type":17,"tag":84,"props":135225,"children":135226},{},[135227,135233,135234],{"type":17,"tag":6121,"props":135228,"children":135230},{"className":135229},[],[135231],{"type":23,"value":135232},"POST application",{"type":23,"value":120761},{"type":17,"tag":6121,"props":135235,"children":135237},{"className":135236},[],[135238],{"type":23,"value":134460},{"type":17,"tag":84,"props":135240,"children":135241},{},[135242],{"type":23,"value":135243},"Optionally update stage",{"type":17,"tag":29,"props":135245,"children":135246},{},[135247],{"type":23,"value":135248},"All structured responses remain inside the ATS.",{"type":17,"tag":68,"props":135250,"children":135252},{"id":135251},"what-unified-does-not-guarantee",[135253],{"type":23,"value":135254},"What Unified Does Not Guarantee",{"type":17,"tag":29,"props":135256,"children":135257},{},[135258],{"type":23,"value":135259},"Unified documentation does not explicitly guarantee:",{"type":17,"tag":80,"props":135261,"children":135262},{},[135263,135274,135284,135289],{"type":17,"tag":84,"props":135264,"children":135265},{},[135266,135268],{"type":23,"value":135267},"That all ATS integrations expose ",{"type":17,"tag":6121,"props":135269,"children":135271},{"className":135270},[],[135272],{"type":23,"value":135273},"questions[]",{"type":17,"tag":84,"props":135275,"children":135276},{},[135277,135279],{"type":23,"value":135278},"That all integrations support writing ",{"type":17,"tag":6121,"props":135280,"children":135282},{"className":135281},[],[135283],{"type":23,"value":134460},{"type":17,"tag":84,"props":135285,"children":135286},{},[135287],{"type":23,"value":135288},"That question ID formats are consistent across providers",{"type":17,"tag":84,"props":135290,"children":135291},{},[135292],{"type":23,"value":135293},"That file-answer semantics are identical across providers",{"type":17,"tag":29,"props":135295,"children":135296},{},[135297],{"type":23,"value":135298},"Always consult integration-specific field support before deploying.",{"type":17,"tag":68,"props":135300,"children":135301},{"id":132938},[135302],{"type":23,"value":132941},{"type":17,"tag":29,"props":135304,"children":135305},{},[135306],{"type":23,"value":135307},"Pulling screening questions from the ATS and embedding them into your product allows you to:",{"type":17,"tag":80,"props":135309,"children":135310},{},[135311,135316,135321,135326],{"type":17,"tag":84,"props":135312,"children":135313},{},[135314],{"type":23,"value":135315},"Build fully custom apply experiences",{"type":17,"tag":84,"props":135317,"children":135318},{},[135319],{"type":23,"value":135320},"Control candidate UX",{"type":17,"tag":84,"props":135322,"children":135323},{},[135324],{"type":23,"value":135325},"Preserve structured screening logic",{"type":17,"tag":84,"props":135327,"children":135328},{},[135329],{"type":23,"value":135330},"Keep the ATS as the source of truth",{"type":17,"tag":29,"props":135332,"children":135333},{},[135334],{"type":23,"value":132973},{"type":17,"tag":80,"props":135336,"children":135337},{},[135338,135343,135348,135353],{"type":17,"tag":84,"props":135339,"children":135340},{},[135341],{"type":23,"value":135342},"Normalized job question definitions",{"type":17,"tag":84,"props":135344,"children":135345},{},[135346],{"type":23,"value":135347},"Structured answer submission",{"type":17,"tag":84,"props":135349,"children":135350},{},[135351],{"type":23,"value":135352},"File upload support",{"type":17,"tag":84,"props":135354,"children":135355},{},[135356],{"type":23,"value":135357},"Application-level write-back",{"type":17,"tag":29,"props":135359,"children":135360},{},[135361],{"type":23,"value":135362},"The rest is orchestration: render dynamically, validate locally, and write back cleanly.",{"type":17,"tag":29,"props":135364,"children":135365},{},[135366],{"type":17,"tag":133,"props":135367,"children":135369},{"href":1612,"rel":135368},[214],[135370],{"type":23,"value":44481},{"type":17,"tag":29,"props":135372,"children":135373},{},[135374],{"type":17,"tag":133,"props":135375,"children":135377},{"href":1623,"rel":135376},[214],[135378],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":135380},[135381,135382,135386,135387,135388,135389,135392,135393,135397,135398,135399,135400,135401],{"id":132052,"depth":1629,"text":132055},{"id":134475,"depth":1629,"text":134478,"children":135383},[135384,135385],{"id":132141,"depth":1635,"text":132144},{"id":133268,"depth":1635,"text":133271},{"id":134512,"depth":1629,"text":134515},{"id":134570,"depth":1629,"text":134573},{"id":134792,"depth":1629,"text":134795},{"id":134846,"depth":1629,"text":134849,"children":135390},[135391],{"id":134930,"depth":1635,"text":134933},{"id":134991,"depth":1629,"text":134994},{"id":135025,"depth":1629,"text":135028,"children":135394},[135395,135396],{"id":132403,"depth":1635,"text":132144},{"id":21023,"depth":1635,"text":7377},{"id":135076,"depth":1629,"text":135079},{"id":135138,"depth":1629,"text":135141},{"id":135184,"depth":1629,"text":135187},{"id":135251,"depth":1629,"text":135254},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_pull_screening_questions_from_an_ats_and_embed_them_in_your_product_using_unified_ats_api.md","blog/how_to_pull_screening_questions_from_an_ats_and_embed_them_in_your_product_using_unified_ats_api.md","blog/how_to_pull_screening_questions_from_an_ats_and_embed_them_in_your_product_using_unified_ats_api",{"_path":135406,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":135407,"description":135408,"img":135409,"date":131925,"tag":12,"body":135410,"_type":1677,"_id":136254,"_source":1679,"_file":136255,"_stem":136256,"_extension":1682},"/blog/how_to_source_candidates_externally_and_push_them_into_an_ats_using_unified_ats_api","How to Source Candidates Externally and Push Them into an ATS Using Unified's ATS API","Recruiters pull from internal talent databases, enrichment providers, sourcing tools, and external pipelines. The integration work starts after sourcing,...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_source_candidates_externally_and_push_them_into_an_ats_using_unified_ats_api-icon.png",{"type":14,"children":135411,"toc":136234},[135412,135417,135420,135427,135432,135437,135447,135490,135496,135501,135524,135529,135535,135541,135559,135568,135574,135585,135652,135665,135671,135676,135694,135699,135717,135723,135728,135745,135753,135758,135767,135779,135785,135794,135798,135816,135822,135831,135835,135875,135881,135886,135917,135923,135932,135938,135947,135966,135972,135977,135986,135990,136008,136014,136019,136028,136032,136045,136051,136098,136103,136124,136130,136135,136158,136163,136168,136173,136213,136218,136226],{"type":17,"tag":18,"props":135413,"children":135415},{"id":135414},"how-to-source-candidates-externally-and-push-them-into-an-ats-using-unifieds-ats-api",[135416],{"type":23,"value":135407},{"type":17,"tag":25,"props":135418,"children":135419},{},[],{"type":17,"tag":29,"props":135421,"children":135422},{},[135423],{"type":17,"tag":33,"props":135424,"children":135425},{},[135426],{"type":23,"value":131160},{"type":17,"tag":29,"props":135428,"children":135429},{},[135430],{"type":23,"value":135431},"Sourcing candidates outside the ATS is common.",{"type":17,"tag":29,"props":135433,"children":135434},{},[135435],{"type":23,"value":135436},"Recruiters pull from internal talent databases, enrichment providers, sourcing tools, and external pipelines. The integration work starts after sourcing: pushing candidates into the ATS cleanly, without duplicates, and with enough metadata for recruiters to act.",{"type":17,"tag":29,"props":135438,"children":135439},{},[135440,135442,135446],{"type":23,"value":135441},"This guide walks through a full write-back workflow using Unified's ",{"type":17,"tag":133,"props":135443,"children":135444},{"href":55696},[135445],{"type":23,"value":55699},{"type":23,"value":20456},{"type":17,"tag":6154,"props":135448,"children":135449},{},[135450,135455,135460,135465,135470,135475,135480,135485],{"type":17,"tag":84,"props":135451,"children":135452},{},[135453],{"type":23,"value":135454},"Read job requirements from the ATS",{"type":17,"tag":84,"props":135456,"children":135457},{},[135458],{"type":23,"value":135459},"Match against an external talent source",{"type":17,"tag":84,"props":135461,"children":135462},{},[135463],{"type":23,"value":135464},"De-duplicate candidates",{"type":17,"tag":84,"props":135466,"children":135467},{},[135468],{"type":23,"value":135469},"Create candidate",{"type":17,"tag":84,"props":135471,"children":135472},{},[135473],{"type":23,"value":135474},"Create application",{"type":17,"tag":84,"props":135476,"children":135477},{},[135478],{"type":23,"value":135479},"Attach resume",{"type":17,"tag":84,"props":135481,"children":135482},{},[135483],{"type":23,"value":135484},"Set stage",{"type":17,"tag":84,"props":135486,"children":135487},{},[135488],{"type":23,"value":135489},"Add tags and source metadata",{"type":17,"tag":68,"props":135491,"children":135493},{"id":135492},"the-mental-model-your-sourcing-engine-is-external-the-ats-is-the-system-of-record",[135494],{"type":23,"value":135495},"The mental model: your sourcing engine is external, the ATS is the system of record",{"type":17,"tag":29,"props":135497,"children":135498},{},[135499],{"type":23,"value":135500},"Your matching pipeline lives outside the ATS. But the ATS remains the operational system recruiters use. Your integration must:",{"type":17,"tag":80,"props":135502,"children":135503},{},[135504,135509,135514,135519],{"type":17,"tag":84,"props":135505,"children":135506},{},[135507],{"type":23,"value":135508},"Avoid creating duplicate candidates",{"type":17,"tag":84,"props":135510,"children":135511},{},[135512],{"type":23,"value":135513},"Sequence writes predictably",{"type":17,"tag":84,"props":135515,"children":135516},{},[135517],{"type":23,"value":135518},"Handle provider variability (documents, stages, custom fields)",{"type":17,"tag":84,"props":135520,"children":135521},{},[135522],{"type":23,"value":135523},"Be idempotent in your own application logic",{"type":17,"tag":29,"props":135525,"children":135526},{},[135527],{"type":23,"value":135528},"Unified provides normalized objects and consistent endpoints. It does not enforce upserts or de-dupe for you.",{"type":17,"tag":68,"props":135530,"children":135532},{"id":135531},"step-1-pull-job-requirements-from-the-ats",[135533],{"type":23,"value":135534},"Step 1: Pull job requirements from the ATS",{"type":17,"tag":239,"props":135536,"children":135538},{"id":135537},"list-jobs-and-filter-to-open-roles",[135539],{"type":23,"value":135540},"List jobs and filter to open roles",{"type":17,"tag":29,"props":135542,"children":135543},{},[135544,135550,135552,135557],{"type":17,"tag":6121,"props":135545,"children":135547},{"className":135546},[],[135548],{"type":23,"value":135549},"listAtsJobs",{"type":23,"value":135551}," supports a ",{"type":17,"tag":6121,"props":135553,"children":135555},{"className":135554},[],[135556],{"type":23,"value":19949},{"type":23,"value":135558}," filter. Use it when the integration returns status reliably; otherwise, pull jobs and filter locally.",{"type":17,"tag":6893,"props":135560,"children":135563},{"className":135561,"code":135562,"language":18718,"meta":7},[18716],"const jobs = await sdk.ats.listAtsJobs({\n  connectionId,\n  status: 'OPEN', // if supported by the integration's job model\n  limit: 100,\n  offset: 0,\n  sort: 'updated_at',\n  order: 'asc',\n  fields: '',\n  raw: '',\n});\n",[135564],{"type":17,"tag":6121,"props":135565,"children":135566},{"__ignoreMap":7},[135567],{"type":23,"value":135562},{"type":17,"tag":239,"props":135569,"children":135571},{"id":135570},"what-to-extract-for-matching",[135572],{"type":23,"value":135573},"What to extract for matching",{"type":17,"tag":29,"props":135575,"children":135576},{},[135577,135578,135583],{"type":23,"value":132433},{"type":17,"tag":6121,"props":135579,"children":135581},{"className":135580},[],[135582],{"type":23,"value":75743},{"type":23,"value":135584},", the most useful matching signals are:",{"type":17,"tag":80,"props":135586,"children":135587},{},[135588,135602,135618,135632,135642],{"type":17,"tag":84,"props":135589,"children":135590},{},[135591,135596,135597],{"type":17,"tag":6121,"props":135592,"children":135594},{"className":135593},[],[135595],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":135598,"children":135600},{"className":135599},[],[135601],{"type":23,"value":24679},{"type":17,"tag":84,"props":135603,"children":135604},{},[135605,135611,135612],{"type":17,"tag":6121,"props":135606,"children":135608},{"className":135607},[],[135609],{"type":23,"value":135610},"minimum_experience_years",{"type":23,"value":11826},{"type":17,"tag":6121,"props":135613,"children":135615},{"className":135614},[],[135616],{"type":23,"value":135617},"minimum_degree",{"type":17,"tag":84,"props":135619,"children":135620},{},[135621,135626,135627],{"type":17,"tag":6121,"props":135622,"children":135624},{"className":135623},[],[135625],{"type":23,"value":75514},{"type":23,"value":11826},{"type":17,"tag":6121,"props":135628,"children":135630},{"className":135629},[],[135631],{"type":23,"value":75550},{"type":17,"tag":84,"props":135633,"children":135634},{},[135635,135640],{"type":17,"tag":6121,"props":135636,"children":135638},{"className":135637},[],[135639],{"type":23,"value":135273},{"type":23,"value":135641}," (screening criteria)",{"type":17,"tag":84,"props":135643,"children":135644},{},[135645,135650],{"type":17,"tag":6121,"props":135646,"children":135648},{"className":135647},[],[135649],{"type":23,"value":133378},{"type":23,"value":135651}," (customer-specific requirements)",{"type":17,"tag":29,"props":135653,"children":135654},{},[135655,135657,135663],{"type":23,"value":135656},"Do not rely on ",{"type":17,"tag":6121,"props":135658,"children":135660},{"className":135659},[],[135661],{"type":23,"value":135662},"skills[]",{"type":23,"value":135664}," as a primary requirement signal. It exists in the normalized schema but is not consistently populated across ATS integrations.",{"type":17,"tag":68,"props":135666,"children":135668},{"id":135667},"step-2-match-candidates-externally",[135669],{"type":23,"value":135670},"Step 2: Match candidates externally",{"type":17,"tag":29,"props":135672,"children":135673},{},[135674],{"type":23,"value":135675},"This is your product's logic. A practical baseline is a hybrid approach:",{"type":17,"tag":80,"props":135677,"children":135678},{},[135679,135684,135689],{"type":17,"tag":84,"props":135680,"children":135681},{},[135682],{"type":23,"value":135683},"Hard filters: degree, minimum years, location/remote, work authorization (if you track it)",{"type":17,"tag":84,"props":135685,"children":135686},{},[135687],{"type":23,"value":135688},"Retrieval: embeddings over job description vs resume / experience text",{"type":17,"tag":84,"props":135690,"children":135691},{},[135692],{"type":23,"value":135693},"Reranking: rules + model score",{"type":17,"tag":29,"props":135695,"children":135696},{},[135697],{"type":23,"value":135698},"The key output from this step should be:",{"type":17,"tag":80,"props":135700,"children":135701},{},[135702,135707,135712],{"type":17,"tag":84,"props":135703,"children":135704},{},[135705],{"type":23,"value":135706},"The external candidate record",{"type":17,"tag":84,"props":135708,"children":135709},{},[135710],{"type":23,"value":135711},"A match score + explanation (for auditability)",{"type":17,"tag":84,"props":135713,"children":135714},{},[135715],{"type":23,"value":135716},"A normalized candidate payload to write into the ATS",{"type":17,"tag":68,"props":135718,"children":135720},{"id":135719},"step-3-handle-duplicate-candidates-email-based-matching",[135721],{"type":23,"value":135722},"Step 3: Handle duplicate candidates (email-based matching)",{"type":17,"tag":29,"props":135724,"children":135725},{},[135726],{"type":23,"value":135727},"Unified does not provide idempotency keys or upsert semantics for ATS writes. You must avoid duplicates explicitly.",{"type":17,"tag":29,"props":135729,"children":135730},{},[135731,135737,135738,135743],{"type":17,"tag":6121,"props":135732,"children":135734},{"className":135733},[],[135735],{"type":23,"value":135736},"listAtsCandidates",{"type":23,"value":135551},{"type":17,"tag":6121,"props":135739,"children":135741},{"className":135740},[],[135742],{"type":23,"value":48368},{"type":23,"value":135744}," parameter documented as:",{"type":17,"tag":3414,"props":135746,"children":135747},{},[135748],{"type":17,"tag":29,"props":135749,"children":135750},{},[135751],{"type":23,"value":135752},"'Query string to search. eg. email address or name'",{"type":17,"tag":29,"props":135754,"children":135755},{},[135756],{"type":23,"value":135757},"Use it for email-based matching.",{"type":17,"tag":6893,"props":135759,"children":135762},{"className":135760,"code":135761,"language":18718,"meta":7},[18716],"const existing = await sdk.ats.listAtsCandidates({\n  connectionId,\n  query: 'candidate@example.com',\n  limit: 10,\n  offset: 0,\n  sort: 'updated_at',\n  order: 'asc',\n  fields: '',\n  raw: '',\n});\n",[135763],{"type":17,"tag":6121,"props":135764,"children":135765},{"__ignoreMap":7},[135766],{"type":23,"value":135761},{"type":17,"tag":29,"props":135768,"children":135769},{},[135770,135772,135777],{"type":23,"value":135771},"If you find a match, reuse that candidate ",{"type":17,"tag":6121,"props":135773,"children":135775},{"className":135774},[],[135776],{"type":23,"value":18766},{"type":23,"value":135778},". If not, create a new candidate.",{"type":17,"tag":68,"props":135780,"children":135782},{"id":135781},"step-4-create-a-candidate",[135783],{"type":23,"value":135784},"Step 4: Create a candidate",{"type":17,"tag":6893,"props":135786,"children":135789},{"className":135787,"code":135788,"language":18718,"meta":7},[18716],"const candidate = await sdk.ats.createAtsCandidate({\n  connectionId,\n  atsCandidate: {\n    first_name: 'Jane',\n    last_name: 'Doe',\n    emails: [{ email: 'jane@example.com', type: 'WORK' }],\n    title: 'Senior Backend Engineer',\n    company_name: 'Previous Co',\n    origin: 'SOURCED',\n    tags: ['SOURCED', 'EXTERNAL_MATCH'],\n    metadata: [\n      { slug: 'source_system', value: 'external_db' },\n      { slug: 'match_score', value: 0.87 },\n    ],\n  },\n  fields: '',\n  raw: '',\n});\n",[135790],{"type":17,"tag":6121,"props":135791,"children":135792},{"__ignoreMap":7},[135793],{"type":23,"value":135788},{"type":17,"tag":29,"props":135795,"children":135796},{},[135797],{"type":23,"value":21128},{"type":17,"tag":80,"props":135799,"children":135800},{},[135801,135806,135811],{"type":17,"tag":84,"props":135802,"children":135803},{},[135804],{"type":23,"value":135805},"Required fields vary by ATS integration.",{"type":17,"tag":84,"props":135807,"children":135808},{},[135809],{"type":23,"value":135810},"Some providers may require email/name.",{"type":17,"tag":84,"props":135812,"children":135813},{},[135814],{"type":23,"value":135815},"Treat tags and metadata as provider-dependent fields (they are part of the model, but field-level write support varies).",{"type":17,"tag":68,"props":135817,"children":135819},{"id":135818},"step-5-create-an-application-link-candidate-job",[135820],{"type":23,"value":135821},"Step 5: Create an application (link candidate → job)",{"type":17,"tag":6893,"props":135823,"children":135826},{"className":135824,"code":135825,"language":18718,"meta":7},[18716],"const application = await sdk.ats.createAtsApplication({\n  connectionId,\n  atsApplication: {\n    candidate_id: candidate.id,\n    job_id: job.id,\n    status: 'NEW',\n    source: 'External sourcing pipeline',\n  },\n  fields: '',\n  raw: '',\n});\n",[135827],{"type":17,"tag":6121,"props":135828,"children":135829},{"__ignoreMap":7},[135830],{"type":23,"value":135825},{"type":17,"tag":29,"props":135832,"children":135833},{},[135834],{"type":23,"value":21128},{"type":17,"tag":80,"props":135836,"children":135837},{},[135838,135854,135864],{"type":17,"tag":84,"props":135839,"children":135840},{},[135841,135846,135847,135852],{"type":17,"tag":6121,"props":135842,"children":135844},{"className":135843},[],[135845],{"type":23,"value":117296},{"type":23,"value":34435},{"type":17,"tag":6121,"props":135848,"children":135850},{"className":135849},[],[135851],{"type":23,"value":117309},{"type":23,"value":135853}," are typically required (integration-specific).",{"type":17,"tag":84,"props":135855,"children":135856},{},[135857,135862],{"type":17,"tag":6121,"props":135858,"children":135860},{"className":135859},[],[135861],{"type":23,"value":19949},{"type":23,"value":135863}," is writable on create for many integrations.",{"type":17,"tag":84,"props":135865,"children":135866},{},[135867,135873],{"type":17,"tag":6121,"props":135868,"children":135870},{"className":135869},[],[135871],{"type":23,"value":135872},"offers[]",{"type":23,"value":135874}," is not writable via the ATS unified application object.",{"type":17,"tag":68,"props":135876,"children":135878},{"id":135877},"step-6-attach-the-resume",[135879],{"type":23,"value":135880},"Step 6: Attach the resume",{"type":17,"tag":29,"props":135882,"children":135883},{},[135884],{"type":23,"value":135885},"You can attach resumes using the unified Document object. The key variability is:",{"type":17,"tag":80,"props":135887,"children":135888},{},[135889,135902,135912],{"type":17,"tag":84,"props":135890,"children":135891},{},[135892,135894,135900],{"type":23,"value":135893},"Some integrations accept ",{"type":17,"tag":6121,"props":135895,"children":135897},{"className":135896},[],[135898],{"type":23,"value":135899},"document_data",{"type":23,"value":135901}," (base64)",{"type":17,"tag":84,"props":135903,"children":135904},{},[135905,135907],{"type":23,"value":135906},"Some accept ",{"type":17,"tag":6121,"props":135908,"children":135910},{"className":135909},[],[135911],{"type":23,"value":134916},{"type":17,"tag":84,"props":135913,"children":135914},{},[135915],{"type":23,"value":135916},"Attachments may be candidate-bound or application-bound depending on the ATS integration",{"type":17,"tag":239,"props":135918,"children":135920},{"id":135919},"variant-a-base64-resume-upload",[135921],{"type":23,"value":135922},"Variant A: Base64 resume upload",{"type":17,"tag":6893,"props":135924,"children":135927},{"className":135925,"code":135926,"language":18718,"meta":7},[18716],"await sdk.ats.createAtsDocument({\n  connectionId,\n  atsDocument: {\n    filename: 'resume.pdf',\n    type: 'RESUME',\n    candidate_id: candidate.id,\n    document_data: base64EncodedResume,\n  },\n  fields: '',\n  raw: '',\n});\n",[135928],{"type":17,"tag":6121,"props":135929,"children":135930},{"__ignoreMap":7},[135931],{"type":23,"value":135926},{"type":17,"tag":239,"props":135933,"children":135935},{"id":135934},"variant-b-url-based-resume-attachment",[135936],{"type":23,"value":135937},"Variant B: URL-based resume attachment",{"type":17,"tag":6893,"props":135939,"children":135942},{"className":135940,"code":135941,"language":18718,"meta":7},[18716],"await sdk.ats.createAtsDocument({\n  connectionId,\n  atsDocument: {\n    filename: 'resume.pdf',\n    type: 'RESUME',\n    application_id: application.id,\n    document_url: 'https://your-storage.com/resumes/jane-doe.pdf',\n  },\n  fields: '',\n  raw: '',\n});\n",[135943],{"type":17,"tag":6121,"props":135944,"children":135945},{"__ignoreMap":7},[135946],{"type":23,"value":135941},{"type":17,"tag":29,"props":135948,"children":135949},{},[135950,135952,135957,135959,135964],{"type":23,"value":135951},"Important detail: ",{"type":17,"tag":6121,"props":135953,"children":135955},{"className":135954},[],[135956],{"type":23,"value":134916},{"type":23,"value":135958}," values returned by Unified for reading often expire after one hour. For write flows, if you are providing ",{"type":17,"tag":6121,"props":135960,"children":135962},{"className":135961},[],[135963],{"type":23,"value":134916},{"type":23,"value":135965},", ensure it is accessible to the ATS integration.",{"type":17,"tag":68,"props":135967,"children":135969},{"id":135968},"step-7-set-stage-update-the-application-status",[135970],{"type":23,"value":135971},"Step 7: Set stage (update the application status)",{"type":17,"tag":29,"props":135973,"children":135974},{},[135975],{"type":23,"value":135976},"You can update the application status via:",{"type":17,"tag":6893,"props":135978,"children":135981},{"className":135979,"code":135980,"language":18718,"meta":7},[18716],"await sdk.ats.updateAtsApplication({\n  connectionId,\n  id: application.id,\n  atsApplication: {\n    status: 'REVIEWING',\n  },\n  fields: '',\n  raw: '',\n});\n",[135982],{"type":17,"tag":6121,"props":135983,"children":135984},{"__ignoreMap":7},[135985],{"type":23,"value":135980},{"type":17,"tag":29,"props":135987,"children":135988},{},[135989],{"type":23,"value":21128},{"type":17,"tag":80,"props":135991,"children":135992},{},[135993,135998,136003],{"type":17,"tag":84,"props":135994,"children":135995},{},[135996],{"type":23,"value":135997},"Stage transition rules are not documented as a Unified-wide model.",{"type":17,"tag":84,"props":135999,"children":136000},{},[136001],{"type":23,"value":136002},"Some providers classify status/original_status as 'slow fields.'",{"type":17,"tag":84,"props":136004,"children":136005},{},[136006],{"type":23,"value":136007},"Handle 429/5XX with backoff and retry.",{"type":17,"tag":68,"props":136009,"children":136011},{"id":136010},"step-8-add-tags-and-source-metadata",[136012],{"type":23,"value":136013},"Step 8: Add tags and source metadata",{"type":17,"tag":29,"props":136015,"children":136016},{},[136017],{"type":23,"value":136018},"If you didn't apply tags at create time or want to add more context:",{"type":17,"tag":6893,"props":136020,"children":136023},{"className":136021,"code":136022,"language":18718,"meta":7},[18716],"await sdk.ats.updateAtsCandidate({\n  connectionId,\n  id: candidate.id,\n  atsCandidate: {\n    tags: ['SOURCED', 'AI_MATCHED', 'HIGH_CONFIDENCE'],\n    metadata: [\n      { slug: 'source_system', value: 'external_db' },\n      { slug: 'source_run_id', value: 'run_2026_02_25_001' },\n    ],\n  },\n  fields: '',\n  raw: '',\n});\n",[136024],{"type":17,"tag":6121,"props":136025,"children":136026},{"__ignoreMap":7},[136027],{"type":23,"value":136022},{"type":17,"tag":29,"props":136029,"children":136030},{},[136031],{"type":23,"value":21128},{"type":17,"tag":80,"props":136033,"children":136034},{},[136035,136040],{"type":17,"tag":84,"props":136036,"children":136037},{},[136038],{"type":23,"value":136039},"Tags and metadata are part of the normalized model.",{"type":17,"tag":84,"props":136041,"children":136042},{},[136043],{"type":23,"value":136044},"Actual write support may vary by provider; consult integration field support before relying on specific custom fields.",{"type":17,"tag":68,"props":136046,"children":136048},{"id":136047},"recommended-write-sequencing",[136049],{"type":23,"value":136050},"Recommended write sequencing",{"type":17,"tag":6154,"props":136052,"children":136053},{},[136054,136059,136064,136075,136080,136084,136088,136093],{"type":17,"tag":84,"props":136055,"children":136056},{},[136057],{"type":23,"value":136058},"Read job",{"type":17,"tag":84,"props":136060,"children":136061},{},[136062],{"type":23,"value":136063},"Run external matching",{"type":17,"tag":84,"props":136065,"children":136066},{},[136067,136069,136074],{"type":23,"value":136068},"Search ATS candidates by email (",{"type":17,"tag":6121,"props":136070,"children":136072},{"className":136071},[],[136073],{"type":23,"value":48368},{"type":23,"value":12034},{"type":17,"tag":84,"props":136076,"children":136077},{},[136078],{"type":23,"value":136079},"Create candidate if needed",{"type":17,"tag":84,"props":136081,"children":136082},{},[136083],{"type":23,"value":135474},{"type":17,"tag":84,"props":136085,"children":136086},{},[136087],{"type":23,"value":135479},{"type":17,"tag":84,"props":136089,"children":136090},{},[136091],{"type":23,"value":136092},"Update stage",{"type":17,"tag":84,"props":136094,"children":136095},{},[136096],{"type":23,"value":136097},"Update tags/metadata",{"type":17,"tag":29,"props":136099,"children":136100},{},[136101],{"type":23,"value":136102},"Persist intermediate IDs after each step:",{"type":17,"tag":80,"props":136104,"children":136105},{},[136106,136115],{"type":17,"tag":84,"props":136107,"children":136108},{},[136109],{"type":17,"tag":6121,"props":136110,"children":136112},{"className":136111},[],[136113],{"type":23,"value":136114},"candidate.id",{"type":17,"tag":84,"props":136116,"children":136117},{},[136118],{"type":17,"tag":6121,"props":136119,"children":136121},{"className":136120},[],[136122],{"type":23,"value":136123},"application.id",{"type":17,"tag":68,"props":136125,"children":136127},{"id":136126},"handling-retries-and-safety",[136128],{"type":23,"value":136129},"Handling retries and safety",{"type":17,"tag":29,"props":136131,"children":136132},{},[136133],{"type":23,"value":136134},"Unified does not provide atomic multi-step transactions across these calls. Your application should:",{"type":17,"tag":80,"props":136136,"children":136137},{},[136138,136143,136148,136153],{"type":17,"tag":84,"props":136139,"children":136140},{},[136141],{"type":23,"value":136142},"Retry idempotently on 429/5XX",{"type":17,"tag":84,"props":136144,"children":136145},{},[136146],{"type":23,"value":136147},"Avoid duplicate candidate creation by always searching first",{"type":17,"tag":84,"props":136149,"children":136150},{},[136151],{"type":23,"value":136152},"Log every provider response",{"type":17,"tag":84,"props":136154,"children":136155},{},[136156],{"type":23,"value":136157},"Store 'write state' checkpoints so you can resume after a failure",{"type":17,"tag":68,"props":136159,"children":136160},{"id":132938},[136161],{"type":23,"value":136162},"Closing thoughts",{"type":17,"tag":29,"props":136164,"children":136165},{},[136166],{"type":23,"value":136167},"External sourcing only matters if recruiters can act on it inside their ATS.",{"type":17,"tag":29,"props":136169,"children":136170},{},[136171],{"type":23,"value":136172},"Unified's ATS API gives you:",{"type":17,"tag":80,"props":136174,"children":136175},{},[136176,136181,136193,136198,136203,136208],{"type":17,"tag":84,"props":136177,"children":136178},{},[136179],{"type":23,"value":136180},"A normalized job model to pull requirements",{"type":17,"tag":84,"props":136182,"children":136183},{},[136184,136186,136191],{"type":23,"value":136185},"Candidate search via ",{"type":17,"tag":6121,"props":136187,"children":136189},{"className":136188},[],[136190],{"type":23,"value":48368},{"type":23,"value":136192}," to dedupe by email/name",{"type":17,"tag":84,"props":136194,"children":136195},{},[136196],{"type":23,"value":136197},"Candidate and application write endpoints",{"type":17,"tag":84,"props":136199,"children":136200},{},[136201],{"type":23,"value":136202},"Document attachment endpoints",{"type":17,"tag":84,"props":136204,"children":136205},{},[136206],{"type":23,"value":136207},"Application status updates",{"type":17,"tag":84,"props":136209,"children":136210},{},[136211],{"type":23,"value":136212},"Tags and metadata support",{"type":17,"tag":29,"props":136214,"children":136215},{},[136216],{"type":23,"value":136217},"From there, a reliable sourcing write-back workflow is mostly orchestration: sequencing, dedupe, retries, and provider-aware fallbacks.",{"type":17,"tag":29,"props":136219,"children":136220},{},[136221],{"type":17,"tag":133,"props":136222,"children":136224},{"href":1612,"rel":136223},[214],[136225],{"type":23,"value":44481},{"type":17,"tag":29,"props":136227,"children":136228},{},[136229],{"type":17,"tag":133,"props":136230,"children":136232},{"href":1623,"rel":136231},[214],[136233],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":136235},[136236,136237,136241,136242,136243,136244,136245,136249,136250,136251,136252,136253],{"id":135492,"depth":1629,"text":135495},{"id":135531,"depth":1629,"text":135534,"children":136238},[136239,136240],{"id":135537,"depth":1635,"text":135540},{"id":135570,"depth":1635,"text":135573},{"id":135667,"depth":1629,"text":135670},{"id":135719,"depth":1629,"text":135722},{"id":135781,"depth":1629,"text":135784},{"id":135818,"depth":1629,"text":135821},{"id":135877,"depth":1629,"text":135880,"children":136246},[136247,136248],{"id":135919,"depth":1635,"text":135922},{"id":135934,"depth":1635,"text":135937},{"id":135968,"depth":1629,"text":135971},{"id":136010,"depth":1629,"text":136013},{"id":136047,"depth":1629,"text":136050},{"id":136126,"depth":1629,"text":136129},{"id":132938,"depth":1629,"text":136162},"content:blog:how_to_source_candidates_externally_and_push_them_into_an_ats_using_unified_ats_api.md","blog/how_to_source_candidates_externally_and_push_them_into_an_ats_using_unified_ats_api.md","blog/how_to_source_candidates_externally_and_push_them_into_an_ats_using_unified_ats_api",{"_path":136258,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":136259,"description":136260,"img":136261,"date":136262,"tag":12,"body":136263,"_type":1677,"_id":137064,"_source":1679,"_file":137065,"_stem":137066,"_extension":1682},"/blog/how_to_build_an_ai_recruiter_agent_with_unified_mcp","How to Build an AI Recruiter Agent with Unified MCP","Modern SaaS products don't just display candidate data. They screen resumes, update application stages, schedule interviews, send communications, collect...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_ai_recruiter_agent_with_unified_mcp-icon.png","2026-02-20T23:25:00.000Z",{"type":14,"children":136264,"toc":137051},[136265,136270,136273,136281,136286,136295,136300,136311,136317,136322,136345,136349,136354,136359,136364,136370,136375,136380,136403,136428,136433,136438,136443,136448,136453,136459,136464,136468,136491,136496,136523,136528,136550,136554,136559,136564,136569,136575,136580,136587,136592,136597,136602,136608,136613,136617,136645,136650,136655,136660,136664,136668,136672,136678,136683,136688,136706,136711,136715,136748,136753,136759,136764,136769,136808,136813,136818,136824,136848,136853,136858,136864,136869,136880,136885,136890,136896,136900,136923,136927,136950,136955,136960,136965,136969,136974,137030,137035,137043],{"type":17,"tag":18,"props":136266,"children":136268},{"id":136267},"how-to-build-an-ai-recruiter-agent-with-unified-mcp",[136269],{"type":23,"value":136259},{"type":17,"tag":25,"props":136271,"children":136272},{},[],{"type":17,"tag":29,"props":136274,"children":136275},{},[136276],{"type":17,"tag":33,"props":136277,"children":136278},{},[136279],{"type":23,"value":136280},"February 20, 2026",{"type":17,"tag":29,"props":136282,"children":136283},{},[136284],{"type":23,"value":136285},"Modern SaaS products don't just display candidate data. They screen resumes, update application stages, schedule interviews, send communications, collect feedback, and create follow-up tasks. If you're embedding AI into a recruiting workflow, your agent must read and write across ATS, Calendar, Messaging, HR, and Task systems — safely and in real time — without building and maintaining each integration separately.",{"type":17,"tag":29,"props":136287,"children":136288},{},[136289,136290,136294],{"type":23,"value":131175},{"type":17,"tag":133,"props":136291,"children":136292},{"href":326},[136293],{"type":23,"value":329},{"type":23,"value":131181},{"type":17,"tag":29,"props":136296,"children":136297},{},[136298],{"type":23,"value":136299},"Unified's category APIs provide normalized, real-time access to ATS, Calendar & Meetings, Messaging, HR & Directory, and Task Management systems. Unified MCP allows LLMs to call those operations as structured tools.",{"type":17,"tag":29,"props":136301,"children":136302},{},[136303,136305,136309],{"type":23,"value":136304},"This guide explains how to architect a production-safe AI recruiter agent using Unified MCP, while respecting provider variability, ",{"type":17,"tag":133,"props":136306,"children":136307},{"href":135},[136308],{"type":23,"value":138},{"type":23,"value":136310},", tool limits, and PII boundaries.",{"type":17,"tag":68,"props":136312,"children":136314},{"id":136313},"recruiter-agent-architecture",[136315],{"type":23,"value":136316},"Recruiter Agent Architecture",{"type":17,"tag":29,"props":136318,"children":136319},{},[136320],{"type":23,"value":136321},"A recruiter agent typically performs four stages:",{"type":17,"tag":6154,"props":136323,"children":136324},{},[136325,136330,136335,136340],{"type":17,"tag":84,"props":136326,"children":136327},{},[136328],{"type":23,"value":136329},"Candidate screening",{"type":17,"tag":84,"props":136331,"children":136332},{},[136333],{"type":23,"value":136334},"Interview scheduling",{"type":17,"tag":84,"props":136336,"children":136337},{},[136338],{"type":23,"value":136339},"Candidate communication",{"type":17,"tag":84,"props":136341,"children":136342},{},[136343],{"type":23,"value":136344},"Post-interview evaluation",{"type":17,"tag":29,"props":136346,"children":136347},{},[136348],{"type":23,"value":131233},{"type":17,"tag":29,"props":136350,"children":136351},{},[136352],{"type":23,"value":136353},"Trigger (webhook or user action) → LLM reasoning → MCP tool calls → Unified API → Source systems",{"type":17,"tag":29,"props":136355,"children":136356},{},[136357],{"type":23,"value":136358},"Unified MCP executes structured tool calls. It does not deliver events. Webhooks (native or virtual) may trigger the agent, but MCP performs the reads and writes.",{"type":17,"tag":29,"props":136360,"children":136361},{},[136362],{"type":23,"value":136363},"All tool calls are real-time pass-through requests to the underlying provider. No customer data is cached or stored.",{"type":17,"tag":68,"props":136365,"children":136367},{"id":136366},"stage-1-candidate-screening",[136368],{"type":23,"value":136369},"Stage 1: Candidate Screening",{"type":17,"tag":29,"props":136371,"children":136372},{},[136373],{"type":23,"value":136374},"This stage requires read-only access to ATS data.",{"type":17,"tag":29,"props":136376,"children":136377},{},[136378],{"type":23,"value":136379},"Minimal tools:",{"type":17,"tag":80,"props":136381,"children":136382},{},[136383,136388,136393,136398],{"type":17,"tag":84,"props":136384,"children":136385},{},[136386],{"type":23,"value":136387},"ats-candidate:list → GET /ats/{connection_id}/candidate",{"type":17,"tag":84,"props":136389,"children":136390},{},[136391],{"type":23,"value":136392},"ats-candidate:retrieve → GET /ats/{connection_id}/candidate/{id}",{"type":17,"tag":84,"props":136394,"children":136395},{},[136396],{"type":23,"value":136397},"ats-document:list → GET /ats/{connection_id}/document",{"type":17,"tag":84,"props":136399,"children":136400},{},[136401],{"type":23,"value":136402},"ats-document:retrieve → GET /ats/{connection_id}/document/{id}",{"type":17,"tag":29,"props":136404,"children":136405},{},[136406,136408,136413,136414,136419,136421,136426],{"type":23,"value":136407},"ATS documents include both ",{"type":17,"tag":6121,"props":136409,"children":136411},{"className":136410},[],[136412],{"type":23,"value":134916},{"type":23,"value":34435},{"type":17,"tag":6121,"props":136415,"children":136417},{"className":136416},[],[136418],{"type":23,"value":135899},{"type":23,"value":136420}," in the unified schema. Documents can be filtered by ",{"type":17,"tag":6121,"props":136422,"children":136424},{"className":136423},[],[136425],{"type":23,"value":27310},{"type":23,"value":136427}," (e.g., RESUME, COVER_LETTER). Provider support for these fields varies, so agents must handle missing URLs or payloads gracefully.",{"type":17,"tag":29,"props":136429,"children":136430},{},[136431],{"type":23,"value":136432},"Tool count: 4",{"type":17,"tag":29,"props":136434,"children":136435},{},[136436],{"type":23,"value":136437},"Groq (10) → safe",{"type":17,"tag":29,"props":136439,"children":136440},{},[136441],{"type":23,"value":136442},"OpenAI (20) → safe",{"type":17,"tag":29,"props":136444,"children":136445},{},[136446],{"type":23,"value":136447},"Cohere (50) → safe",{"type":17,"tag":29,"props":136449,"children":136450},{},[136451],{"type":23,"value":136452},"No writes are required at this stage.",{"type":17,"tag":68,"props":136454,"children":136456},{"id":136455},"stage-2-interview-scheduling",[136457],{"type":23,"value":136458},"Stage 2: Interview Scheduling",{"type":17,"tag":29,"props":136460,"children":136461},{},[136462],{"type":23,"value":136463},"This stage requires Calendar + HR + optional Messaging tools.",{"type":17,"tag":29,"props":136465,"children":136466},{},[136467],{"type":23,"value":136379},{"type":17,"tag":80,"props":136469,"children":136470},{},[136471,136476,136481,136486],{"type":17,"tag":84,"props":136472,"children":136473},{},[136474],{"type":23,"value":136475},"calendar-busy:list → GET /calendar/{connection_id}/busy",{"type":17,"tag":84,"props":136477,"children":136478},{},[136479],{"type":23,"value":136480},"calendar-event:create → POST /calendar/{connection_id}/event",{"type":17,"tag":84,"props":136482,"children":136483},{},[136484],{"type":23,"value":136485},"hr-employee:list → GET /hris/{connection_id}/employee",{"type":17,"tag":84,"props":136487,"children":136488},{},[136489],{"type":23,"value":136490},"messaging-message:create → POST /messaging/{connection_id}/message",{"type":17,"tag":29,"props":136492,"children":136493},{},[136494],{"type":23,"value":136495},"Calendar supports full event CRUD in the unified model, including recurrence, attendee lists, RSVP status, and cancellation via status or delete. Provider capability varies: some providers are read-only for events, and some lack busy endpoints. The agent must check provider support before attempting writes.",{"type":17,"tag":29,"props":136497,"children":136498},{},[136499,136501,136507,136508,136514,136516,136522],{"type":23,"value":136500},"HR & Directory provides full CRUD for employees and groups. Manager relationships are fields (",{"type":17,"tag":6121,"props":136502,"children":136504},{"className":136503},[],[136505],{"type":23,"value":136506},"manager_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":136509,"children":136511},{"className":136510},[],[136512],{"type":23,"value":136513},"manager_ids",{"type":23,"value":136515},") — there is no separate Manager object. Employee roles are enum values inside ",{"type":17,"tag":6121,"props":136517,"children":136519},{"className":136518},[],[136520],{"type":23,"value":136521},"employee_roles",{"type":23,"value":54},{"type":17,"tag":29,"props":136524,"children":136525},{},[136526],{"type":23,"value":136527},"Messaging support depends on provider:",{"type":17,"tag":80,"props":136529,"children":136530},{},[136531,136536,136540,136545],{"type":17,"tag":84,"props":136532,"children":136533},{},[136534],{"type":23,"value":136535},"Slack supports create/update/delete but only for messages authored by the bot/user.",{"type":17,"tag":84,"props":136537,"children":136538},{},[136539],{"type":23,"value":131344},{"type":17,"tag":84,"props":136541,"children":136542},{},[136543],{"type":23,"value":136544},"Gmail allows send and delete but cannot edit sent content.",{"type":17,"tag":84,"props":136546,"children":136547},{},[136548],{"type":23,"value":136549},"Outlook allows editing drafts; sent message body/subject are immutable.",{"type":17,"tag":29,"props":136551,"children":136552},{},[136553],{"type":23,"value":136432},{"type":17,"tag":29,"props":136555,"children":136556},{},[136557],{"type":23,"value":136558},"Groq → safe",{"type":17,"tag":29,"props":136560,"children":136561},{},[136562],{"type":23,"value":136563},"OpenAI → safe",{"type":17,"tag":29,"props":136565,"children":136566},{},[136567],{"type":23,"value":136568},"Cohere → safe",{"type":17,"tag":68,"props":136570,"children":136572},{"id":136571},"stage-3-candidate-communication",[136573],{"type":23,"value":136574},"Stage 3: Candidate Communication",{"type":17,"tag":29,"props":136576,"children":136577},{},[136578],{"type":23,"value":136579},"Minimal tool:",{"type":17,"tag":80,"props":136581,"children":136582},{},[136583],{"type":17,"tag":84,"props":136584,"children":136585},{},[136586],{"type":23,"value":136490},{"type":17,"tag":29,"props":136588,"children":136589},{},[136590],{"type":23,"value":136591},"Provider restrictions apply (see above). Attachments are supported for Slack, Gmail, and Outlook; Teams attachments are read-only in Unified.",{"type":17,"tag":29,"props":136593,"children":136594},{},[136595],{"type":23,"value":136596},"Tool count: 1",{"type":17,"tag":29,"props":136598,"children":136599},{},[136600],{"type":23,"value":136601},"Safe for all models.",{"type":17,"tag":68,"props":136603,"children":136605},{"id":136604},"stage-4-post-interview-evaluation",[136606],{"type":23,"value":136607},"Stage 4: Post-Interview Evaluation",{"type":17,"tag":29,"props":136609,"children":136610},{},[136611],{"type":23,"value":136612},"This stage writes back into ATS and optionally creates tasks.",{"type":17,"tag":29,"props":136614,"children":136615},{},[136616],{"type":23,"value":136379},{"type":17,"tag":80,"props":136618,"children":136619},{},[136620,136625,136630,136635,136640],{"type":17,"tag":84,"props":136621,"children":136622},{},[136623],{"type":23,"value":136624},"ats-candidate:update → PUT /ats/{connection_id}/candidate/{id}",{"type":17,"tag":84,"props":136626,"children":136627},{},[136628],{"type":23,"value":136629},"ats-application:update → PUT /ats/{connection_id}/application/{id}",{"type":17,"tag":84,"props":136631,"children":136632},{},[136633],{"type":23,"value":136634},"ats-scorecard:create → POST /ats/{connection_id}/scorecard",{"type":17,"tag":84,"props":136636,"children":136637},{},[136638],{"type":23,"value":136639},"ats-scorecard:update → PUT /ats/{connection_id}/scorecard/{id}",{"type":17,"tag":84,"props":136641,"children":136642},{},[136643],{"type":23,"value":136644},"task-task:create → POST /task/{connection_id}/task",{"type":17,"tag":29,"props":136646,"children":136647},{},[136648],{"type":23,"value":136649},"ATS supports full CRUD for Candidate, Job, Application, Interview, Document, and Scorecard objects. Stage/ApplicationStatus is read-only (list only). Provider variability applies: some ATS platforms expose scorecards as read-only; some treat stage transitions differently; some do not provide structured interview objects.",{"type":17,"tag":29,"props":136651,"children":136652},{},[136653],{"type":23,"value":136654},"Task Management exposes Project, Task, Comment, and Change objects. Change is read-only (audit history). Task writes vary by provider: some do not allow status updates; some require status on write; some restrict deletion semantics.",{"type":17,"tag":29,"props":136656,"children":136657},{},[136658],{"type":23,"value":136659},"Tool count: 5",{"type":17,"tag":29,"props":136661,"children":136662},{},[136663],{"type":23,"value":136558},{"type":17,"tag":29,"props":136665,"children":136666},{},[136667],{"type":23,"value":136563},{"type":17,"tag":29,"props":136669,"children":136670},{},[136671],{"type":23,"value":136568},{"type":17,"tag":68,"props":136673,"children":136675},{"id":136674},"combined-tool-surface",[136676],{"type":23,"value":136677},"Combined Tool Surface",{"type":17,"tag":29,"props":136679,"children":136680},{},[136681],{"type":23,"value":136682},"If you expose all ATS (37 tools), Calendar (23), Messaging (8), and Task (17) tools simultaneously, you reach 89 tools. This exceeds Groq (10), OpenAI (20), and Cohere (50) limits.",{"type":17,"tag":29,"props":136684,"children":136685},{},[136686],{"type":23,"value":136687},"Unified MCP documentation states:",{"type":17,"tag":80,"props":136689,"children":136690},{},[136691,136696,136701],{"type":17,"tag":84,"props":136692,"children":136693},{},[136694],{"type":23,"value":136695},"Groq models can only handle 10 tools.",{"type":17,"tag":84,"props":136697,"children":136698},{},[136699],{"type":23,"value":136700},"Most OpenAI models can handle 20 tools.",{"type":17,"tag":84,"props":136702,"children":136703},{},[136704],{"type":23,"value":136705},"Cohere models can handle 50 tools.",{"type":17,"tag":29,"props":136707,"children":136708},{},[136709],{"type":23,"value":136710},"Tool restriction is mandatory.",{"type":17,"tag":29,"props":136712,"children":136713},{},[136714],{"type":23,"value":95512},{"type":17,"tag":80,"props":136716,"children":136717},{},[136718,136728,136738],{"type":17,"tag":84,"props":136719,"children":136720},{},[136721,136726],{"type":17,"tag":6121,"props":136722,"children":136724},{"className":136723},[],[136725],{"type":23,"value":24204},{"type":23,"value":136727}," → limit allowed operations",{"type":17,"tag":84,"props":136729,"children":136730},{},[136731,136736],{"type":17,"tag":6121,"props":136732,"children":136734},{"className":136733},[],[136735],{"type":23,"value":131599},{"type":23,"value":136737}," → allowlist specific tool IDs",{"type":17,"tag":84,"props":136739,"children":136740},{},[136741,136746],{"type":17,"tag":6121,"props":136742,"children":136744},{"className":136743},[],[136745],{"type":23,"value":131610},{"type":23,"value":136747}," → defer loading where supported",{"type":17,"tag":29,"props":136749,"children":136750},{},[136751],{"type":23,"value":136752},"Each recruiter workflow stage above remains within limits when configured independently.",{"type":17,"tag":68,"props":136754,"children":136756},{"id":136755},"provider-variability-matters",[136757],{"type":23,"value":136758},"Provider Variability Matters",{"type":17,"tag":29,"props":136760,"children":136761},{},[136762],{"type":23,"value":136763},"Recruiter agents must not assume uniform capabilities.",{"type":17,"tag":29,"props":136765,"children":136766},{},[136767],{"type":23,"value":136768},"Examples documented in Unified sources:",{"type":17,"tag":80,"props":136770,"children":136771},{},[136772,136783,136788,136793,136798,136803],{"type":17,"tag":84,"props":136773,"children":136774},{},[136775,136777,136782],{"type":23,"value":136776},"Some ATS providers do not allow writing ",{"type":17,"tag":6121,"props":136778,"children":136780},{"className":136779},[],[136781],{"type":23,"value":19949},{"type":23,"value":54},{"type":17,"tag":84,"props":136784,"children":136785},{},[136786],{"type":23,"value":136787},"Some do not support scorecard writes.",{"type":17,"tag":84,"props":136789,"children":136790},{},[136791],{"type":23,"value":136792},"Resume retrieval varies by provider.",{"type":17,"tag":84,"props":136794,"children":136795},{},[136796],{"type":23,"value":136797},"Task status writes vary across platforms.",{"type":17,"tag":84,"props":136799,"children":136800},{},[136801],{"type":23,"value":136802},"Comment editing/deletion varies by provider.",{"type":17,"tag":84,"props":136804,"children":136805},{},[136806],{"type":23,"value":136807},"Deletion events may not be emitted by virtual webhooks.",{"type":17,"tag":29,"props":136809,"children":136810},{},[136811],{"type":23,"value":136812},"Unified normalizes schema, not provider behavior.",{"type":17,"tag":29,"props":136814,"children":136815},{},[136816],{"type":23,"value":136817},"Agents must handle validation failures and permission mismatches safely.",{"type":17,"tag":68,"props":136819,"children":136821},{"id":136820},"rate-limits-and-webhooks",[136822],{"type":23,"value":136823},"Rate Limits and Webhooks",{"type":17,"tag":29,"props":136825,"children":136826},{},[136827,136829,136834,136835,136840,136841,136846],{"type":23,"value":136828},"Provider rate limits apply to all real-time calls. List endpoints return a maximum of 100 records per page. Filters like ",{"type":17,"tag":6121,"props":136830,"children":136832},{"className":136831},[],[136833],{"type":23,"value":26291},{"type":23,"value":11826},{"type":17,"tag":6121,"props":136836,"children":136838},{"className":136837},[],[136839],{"type":23,"value":124715},{"type":23,"value":12561},{"type":17,"tag":6121,"props":136842,"children":136844},{"className":136843},[],[136845],{"type":23,"value":19949},{"type":23,"value":136847}," should be used to reduce volume. Exponential backoff with jitter should be implemented for 429 responses.",{"type":17,"tag":29,"props":136849,"children":136850},{},[136851],{"type":23,"value":136852},"Native webhooks are available for certain ATS, Calendar, Messaging, and Task integrations. Virtual webhooks provide polling-based change detection when native push events are unavailable. Virtual webhooks emit created and updated events; deletion events depend on provider support.",{"type":17,"tag":29,"props":136854,"children":136855},{},[136856],{"type":23,"value":136857},"Webhooks trigger the agent. MCP executes actions.",{"type":17,"tag":68,"props":136859,"children":136861},{"id":136860},"compliance-and-pii-controls",[136862],{"type":23,"value":136863},"Compliance and PII Controls",{"type":17,"tag":29,"props":136865,"children":136866},{},[136867],{"type":23,"value":136868},"Unified uses a zero-storage, stateless architecture. API calls are real-time pass-through. Customer data is not stored at rest; only minimal operational metadata is retained and encrypted.",{"type":17,"tag":29,"props":136870,"children":136871},{},[136872,136873,136878],{"type":23,"value":6712},{"type":17,"tag":6121,"props":136874,"children":136876},{"className":136875},[],[136877],{"type":23,"value":131715},{"type":23,"value":136879}," parameter removes sensitive fields (e.g., names, emails, telephone numbers) from MCP responses.",{"type":17,"tag":29,"props":136881,"children":136882},{},[136883],{"type":23,"value":136884},"API call logs are retained for 60 days. Regional routing (US/EU/AU) supports data residency requirements. Access is controlled via scoped API keys, SAML/OIDC SSO, and IP allow-listing.",{"type":17,"tag":29,"props":136886,"children":136887},{},[136888],{"type":23,"value":136889},"MCP tool exposure should be limited to only the required operations for the recruiter workflow.",{"type":17,"tag":68,"props":136891,"children":136893},{"id":136892},"api-vs-mcp-for-recruiter-agents",[136894],{"type":23,"value":136895},"API vs MCP for Recruiter Agents",{"type":17,"tag":29,"props":136897,"children":136898},{},[136899],{"type":23,"value":131761},{"type":17,"tag":80,"props":136901,"children":136902},{},[136903,136908,136913,136918],{"type":17,"tag":84,"props":136904,"children":136905},{},[136906],{"type":23,"value":136907},"Your backend orchestrates screening logic.",{"type":17,"tag":84,"props":136909,"children":136910},{},[136911],{"type":23,"value":136912},"You batch-process resumes.",{"type":17,"tag":84,"props":136914,"children":136915},{},[136916],{"type":23,"value":136917},"You build analytics dashboards.",{"type":17,"tag":84,"props":136919,"children":136920},{},[136921],{"type":23,"value":136922},"You control deterministic stage transitions.",{"type":17,"tag":29,"props":136924,"children":136925},{},[136926],{"type":23,"value":131784},{"type":17,"tag":80,"props":136928,"children":136929},{},[136930,136935,136940,136945],{"type":17,"tag":84,"props":136931,"children":136932},{},[136933],{"type":23,"value":136934},"The LLM decides which candidate to advance.",{"type":17,"tag":84,"props":136936,"children":136937},{},[136938],{"type":23,"value":136939},"The agent schedules interviews.",{"type":17,"tag":84,"props":136941,"children":136942},{},[136943],{"type":23,"value":136944},"The model writes scorecards.",{"type":17,"tag":84,"props":136946,"children":136947},{},[136948],{"type":23,"value":136949},"The assistant posts updates or creates follow-up tasks.",{"type":17,"tag":29,"props":136951,"children":136952},{},[136953],{"type":23,"value":136954},"Execution path remains:",{"type":17,"tag":29,"props":136956,"children":136957},{},[136958],{"type":23,"value":136959},"User → LLM → Tool call → Unified API → Source system",{"type":17,"tag":29,"props":136961,"children":136962},{},[136963],{"type":23,"value":136964},"The only difference is who selects the action.",{"type":17,"tag":68,"props":136966,"children":136967},{"id":131830},[136968],{"type":23,"value":131833},{"type":17,"tag":29,"props":136970,"children":136971},{},[136972],{"type":23,"value":136973},"A production-ready recruiter agent must:",{"type":17,"tag":80,"props":136975,"children":136976},{},[136977,136994,136999,137004,137009,137014,137025],{"type":17,"tag":84,"props":136978,"children":136979},{},[136980,136982,136987,136988,136993],{"type":23,"value":136981},"Restrict tool surface via ",{"type":17,"tag":6121,"props":136983,"children":136985},{"className":136984},[],[136986],{"type":23,"value":24204},{"type":23,"value":75890},{"type":17,"tag":6121,"props":136989,"children":136991},{"className":136990},[],[136992],{"type":23,"value":131599},{"type":23,"value":54},{"type":17,"tag":84,"props":136995,"children":136996},{},[136997],{"type":23,"value":136998},"Avoid exposing all categories at once.",{"type":17,"tag":84,"props":137000,"children":137001},{},[137002],{"type":23,"value":137003},"Handle provider-specific write restrictions.",{"type":17,"tag":84,"props":137005,"children":137006},{},[137007],{"type":23,"value":137008},"Implement idempotency for webhook processing.",{"type":17,"tag":84,"props":137010,"children":137011},{},[137012],{"type":23,"value":137013},"Respect provider rate limits and pagination.",{"type":17,"tag":84,"props":137015,"children":137016},{},[137017,137018,137023],{"type":23,"value":33722},{"type":17,"tag":6121,"props":137019,"children":137021},{"className":137020},[],[137022],{"type":23,"value":131715},{"type":23,"value":137024}," when PII redaction is required.",{"type":17,"tag":84,"props":137026,"children":137027},{},[137028],{"type":23,"value":137029},"Design human-approval checkpoints for high-risk actions.",{"type":17,"tag":29,"props":137031,"children":137032},{},[137033],{"type":23,"value":137034},"When configured this way, Unified MCP enables real-time, agent-executable recruiting workflows across ATS, Calendar, Messaging, HR, and Task systems — without building per-provider integrations or storing customer data.",{"type":17,"tag":29,"props":137036,"children":137037},{},[137038],{"type":17,"tag":133,"props":137039,"children":137041},{"href":1612,"rel":137040},[214],[137042],{"type":23,"value":44481},{"type":17,"tag":29,"props":137044,"children":137045},{},[137046],{"type":17,"tag":133,"props":137047,"children":137049},{"href":1623,"rel":137048},[214],[137050],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":137052},[137053,137054,137055,137056,137057,137058,137059,137060,137061,137062,137063],{"id":136313,"depth":1629,"text":136316},{"id":136366,"depth":1629,"text":136369},{"id":136455,"depth":1629,"text":136458},{"id":136571,"depth":1629,"text":136574},{"id":136604,"depth":1629,"text":136607},{"id":136674,"depth":1629,"text":136677},{"id":136755,"depth":1629,"text":136758},{"id":136820,"depth":1629,"text":136823},{"id":136860,"depth":1629,"text":136863},{"id":136892,"depth":1629,"text":136895},{"id":131830,"depth":1629,"text":131833},"content:blog:how_to_build_an_ai_recruiter_agent_with_unified_mcp.md","blog/how_to_build_an_ai_recruiter_agent_with_unified_mcp.md","blog/how_to_build_an_ai_recruiter_agent_with_unified_mcp",{"_path":137068,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":137069,"description":137070,"img":137071,"date":137072,"tag":12,"body":137073,"_type":1677,"_id":138101,"_source":1679,"_file":138102,"_stem":138103,"_extension":1682},"/blog/how_to_get_a_cohere_api_key_and_connect_it_to_your_product","How to Get a Cohere API Key — and Connect It to Your Product","Cohere provides enterprise-grade language and embedding models, including Command (text generation), Embed (vector embeddings), Rerank, and Classify endpoints.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_a_cohere_api_key_and_connect_it_to_your_product-icon.png","2026-02-20T20:36:00.000Z",{"type":14,"children":137074,"toc":138080},[137075,137080,137083,137090,137094,137105,137109,137153,137159,137164,137173,137178,137193,137198,137204,137216,137221,137229,137234,137239,137244,137250,137255,137285,137290,137298,137303,137309,137314,137320,137343,137349,137372,137377,137385,137391,137396,137402,137411,137416,137434,137439,137445,137450,137459,137464,137499,137505,137510,137515,137542,137547,137572,137582,137588,137593,137620,137625,137631,137638,137654,137661,137691,137698,137722,137726,137749,137754,137760,137765,137770,137775,137803,137813,137819,137824,137832,137841,137862,137871,137879,137884,137902,137908,137913,137941,137946,137968,137974,137979,137984,138012,138017,138022,138049,138054,138059,138064,138072],{"type":17,"tag":18,"props":137076,"children":137078},{"id":137077},"how-to-get-a-cohere-api-key-and-connect-it-to-your-product",[137079],{"type":23,"value":137069},{"type":17,"tag":25,"props":137081,"children":137082},{},[],{"type":17,"tag":29,"props":137084,"children":137085},{},[137086],{"type":17,"tag":33,"props":137087,"children":137088},{},[137089],{"type":23,"value":136280},{"type":17,"tag":29,"props":137091,"children":137092},{},[137093],{"type":23,"value":137070},{"type":17,"tag":29,"props":137095,"children":137096},{},[137097,137099,137104],{"type":23,"value":137098},"If you're building an AI-native SaaS product, internal assistant, or retrieval system, you'll need a ",{"type":17,"tag":48,"props":137100,"children":137101},{},[137102],{"type":23,"value":137103},"Cohere API key",{"type":23,"value":54},{"type":17,"tag":29,"props":137106,"children":137107},{},[137108],{"type":23,"value":70164},{"type":17,"tag":6154,"props":137110,"children":137111},{},[137112,137117,137122,137127,137132,137142],{"type":17,"tag":84,"props":137113,"children":137114},{},[137115],{"type":23,"value":137116},"Creating your Cohere account",{"type":17,"tag":84,"props":137118,"children":137119},{},[137120],{"type":23,"value":137121},"Generating a trial or production API key",{"type":17,"tag":84,"props":137123,"children":137124},{},[137125],{"type":23,"value":137126},"Configuring billing",{"type":17,"tag":84,"props":137128,"children":137129},{},[137130],{"type":23,"value":137131},"Testing your first API call",{"type":17,"tag":84,"props":137133,"children":137134},{},[137135,137137],{"type":23,"value":137136},"Using Cohere through Unified's ",{"type":17,"tag":133,"props":137138,"children":137139},{"href":16186},[137140],{"type":23,"value":137141},"Generative AI API",{"type":17,"tag":84,"props":137143,"children":137144},{},[137145,137147,137151],{"type":23,"value":137146},"Connecting Cohere to SaaS platforms via [Unified ",{"type":17,"tag":133,"props":137148,"children":137149},{"href":326},[137150],{"type":23,"value":329},{"type":23,"value":137152},"](/mcp)",{"type":17,"tag":68,"props":137154,"children":137156},{"id":137155},"step-1-create-a-cohere-account",[137157],{"type":23,"value":137158},"Step 1: Create a Cohere Account",{"type":17,"tag":29,"props":137160,"children":137161},{},[137162],{"type":23,"value":137163},"Go to:",{"type":17,"tag":6893,"props":137165,"children":137168},{"className":137166,"code":137167,"language":20901,"meta":23},[20899],"https://dashboard.cohere.com\n",[137169],{"type":17,"tag":6121,"props":137170,"children":137171},{"__ignoreMap":7},[137172],{"type":23,"value":137167},{"type":17,"tag":29,"props":137174,"children":137175},{},[137176],{"type":23,"value":137177},"Sign up using:",{"type":17,"tag":80,"props":137179,"children":137180},{},[137181,137185,137189],{"type":17,"tag":84,"props":137182,"children":137183},{},[137184],{"type":23,"value":134032},{"type":17,"tag":84,"props":137186,"children":137187},{},[137188],{"type":23,"value":22466},{"type":17,"tag":84,"props":137190,"children":137191},{},[137192],{"type":23,"value":13311},{"type":17,"tag":29,"props":137194,"children":137195},{},[137196],{"type":23,"value":137197},"After verifying your email, you'll be redirected to your dashboard.",{"type":17,"tag":68,"props":137199,"children":137201},{"id":137200},"step-2-locate-your-api-key",[137202],{"type":23,"value":137203},"Step 2: Locate Your API Key",{"type":17,"tag":29,"props":137205,"children":137206},{},[137207,137209,137214],{"type":23,"value":137208},"Cohere automatically generates a ",{"type":17,"tag":48,"props":137210,"children":137211},{},[137212],{"type":23,"value":137213},"trial API key",{"type":23,"value":137215}," when you create an account.",{"type":17,"tag":29,"props":137217,"children":137218},{},[137219],{"type":23,"value":137220},"In the sidebar:",{"type":17,"tag":29,"props":137222,"children":137223},{},[137224],{"type":17,"tag":48,"props":137225,"children":137226},{},[137227],{"type":23,"value":137228},"API Keys",{"type":17,"tag":29,"props":137230,"children":137231},{},[137232],{"type":23,"value":137233},"Your trial key will be visible there.",{"type":17,"tag":29,"props":137235,"children":137236},{},[137237],{"type":23,"value":137238},"Copy it immediately and store it securely.",{"type":17,"tag":29,"props":137240,"children":137241},{},[137242],{"type":23,"value":137243},"Important: The full key is shown only once.",{"type":17,"tag":68,"props":137245,"children":137247},{"id":137246},"step-3-create-additional-keys-optional",[137248],{"type":23,"value":137249},"Step 3: Create Additional Keys (Optional)",{"type":17,"tag":29,"props":137251,"children":137252},{},[137253],{"type":23,"value":137254},"You can generate additional keys for different environments:",{"type":17,"tag":80,"props":137256,"children":137257},{},[137258,137267,137276],{"type":17,"tag":84,"props":137259,"children":137260},{},[137261],{"type":17,"tag":6121,"props":137262,"children":137264},{"className":137263},[],[137265],{"type":23,"value":137266},"development",{"type":17,"tag":84,"props":137268,"children":137269},{},[137270],{"type":17,"tag":6121,"props":137271,"children":137273},{"className":137272},[],[137274],{"type":23,"value":137275},"staging",{"type":17,"tag":84,"props":137277,"children":137278},{},[137279],{"type":17,"tag":6121,"props":137280,"children":137282},{"className":137281},[],[137283],{"type":23,"value":137284},"production",{"type":17,"tag":29,"props":137286,"children":137287},{},[137288],{"type":23,"value":137289},"Click:",{"type":17,"tag":29,"props":137291,"children":137292},{},[137293],{"type":17,"tag":48,"props":137294,"children":137295},{},[137296],{"type":23,"value":137297},"Create API Key",{"type":17,"tag":29,"props":137299,"children":137300},{},[137301],{"type":23,"value":137302},"Name each key clearly to avoid confusion.",{"type":17,"tag":68,"props":137304,"children":137306},{"id":137305},"step-4-understand-trial-vs-production-keys",[137307],{"type":23,"value":137308},"Step 4: Understand Trial vs Production Keys",{"type":17,"tag":29,"props":137310,"children":137311},{},[137312],{"type":23,"value":137313},"Cohere provides:",{"type":17,"tag":239,"props":137315,"children":137317},{"id":137316},"trial-key",[137318],{"type":23,"value":137319},"Trial Key",{"type":17,"tag":80,"props":137321,"children":137322},{},[137323,137328,137333,137338],{"type":17,"tag":84,"props":137324,"children":137325},{},[137326],{"type":23,"value":137327},"Automatically generated",{"type":17,"tag":84,"props":137329,"children":137330},{},[137331],{"type":23,"value":137332},"Free",{"type":17,"tag":84,"props":137334,"children":137335},{},[137336],{"type":23,"value":137337},"Limited to ~1,000 API calls per month (across endpoints)",{"type":17,"tag":84,"props":137339,"children":137340},{},[137341],{"type":23,"value":137342},"Lower per-minute rate limits",{"type":17,"tag":239,"props":137344,"children":137346},{"id":137345},"production-key",[137347],{"type":23,"value":137348},"Production Key",{"type":17,"tag":80,"props":137350,"children":137351},{},[137352,137357,137362,137367],{"type":17,"tag":84,"props":137353,"children":137354},{},[137355],{"type":23,"value":137356},"Requires billing setup",{"type":17,"tag":84,"props":137358,"children":137359},{},[137360],{"type":23,"value":137361},"Higher rate limits",{"type":17,"tag":84,"props":137363,"children":137364},{},[137365],{"type":23,"value":137366},"No strict monthly call cap",{"type":17,"tag":84,"props":137368,"children":137369},{},[137370],{"type":23,"value":137371},"Pay-per-token pricing",{"type":17,"tag":29,"props":137373,"children":137374},{},[137375],{"type":23,"value":137376},"When you're ready for production workloads, go to:",{"type":17,"tag":29,"props":137378,"children":137379},{},[137380],{"type":17,"tag":48,"props":137381,"children":137382},{},[137383],{"type":23,"value":137384},"Billing → Add payment method",{"type":17,"tag":68,"props":137386,"children":137388},{"id":137387},"step-5-store-your-api-key-securely",[137389],{"type":23,"value":137390},"Step 5: Store Your API Key Securely",{"type":17,"tag":29,"props":137392,"children":137393},{},[137394],{"type":23,"value":137395},"Recommended: environment variable.",{"type":17,"tag":239,"props":137397,"children":137399},{"id":137398},"macos-linux",[137400],{"type":23,"value":137401},"macOS / Linux",{"type":17,"tag":6893,"props":137403,"children":137406},{"className":137404,"code":137405,"language":48432,"meta":7},[48430],"export COHERE_API_KEY=\"\u003Cyour_key>\"\n",[137407],{"type":17,"tag":6121,"props":137408,"children":137409},{"__ignoreMap":7},[137410],{"type":23,"value":137405},{"type":17,"tag":29,"props":137412,"children":137413},{},[137414],{"type":23,"value":137415},"Never:",{"type":17,"tag":80,"props":137417,"children":137418},{},[137419,137424,137429],{"type":17,"tag":84,"props":137420,"children":137421},{},[137422],{"type":23,"value":137423},"Commit keys to Git",{"type":17,"tag":84,"props":137425,"children":137426},{},[137427],{"type":23,"value":137428},"Store keys in frontend apps",{"type":17,"tag":84,"props":137430,"children":137431},{},[137432],{"type":23,"value":137433},"Share keys in public repos",{"type":17,"tag":29,"props":137435,"children":137436},{},[137437],{"type":23,"value":137438},"Use a secret manager in production.",{"type":17,"tag":68,"props":137440,"children":137442},{"id":137441},"step-6-test-your-api-key",[137443],{"type":23,"value":137444},"Step 6: Test Your API Key",{"type":17,"tag":29,"props":137446,"children":137447},{},[137448],{"type":23,"value":137449},"Example using Python:",{"type":17,"tag":6893,"props":137451,"children":137454},{"className":137452,"code":137453,"language":127595,"meta":7},[127593],"import cohere\n\nco = cohere.Client(\"YOUR_API_KEY\")\n\nresponse = co.generate(\n    model=\"command\",\n    prompt=\"Explain what an API key is in two sentences.\",\n    max_tokens=50\n)\n\nprint(response.generations[0].text)\n",[137455],{"type":17,"tag":6121,"props":137456,"children":137457},{"__ignoreMap":7},[137458],{"type":23,"value":137453},{"type":17,"tag":29,"props":137460,"children":137461},{},[137462],{"type":23,"value":137463},"Common errors:",{"type":17,"tag":80,"props":137465,"children":137466},{},[137467,137478,137488],{"type":17,"tag":84,"props":137468,"children":137469},{},[137470,137476],{"type":17,"tag":6121,"props":137471,"children":137473},{"className":137472},[],[137474],{"type":23,"value":137475},"401 Unauthorized",{"type":23,"value":137477}," → incorrect key",{"type":17,"tag":84,"props":137479,"children":137480},{},[137481,137486],{"type":17,"tag":6121,"props":137482,"children":137484},{"className":137483},[],[137485],{"type":23,"value":97917},{"type":23,"value":137487}," → rate limit exceeded",{"type":17,"tag":84,"props":137489,"children":137490},{},[137491,137497],{"type":17,"tag":6121,"props":137492,"children":137494},{"className":137493},[],[137495],{"type":23,"value":137496},"400 Bad Request",{"type":23,"value":137498}," → malformed payload",{"type":17,"tag":68,"props":137500,"children":137502},{"id":137501},"using-cohere-in-a-multi-model-architecture",[137503],{"type":23,"value":137504},"Using Cohere in a Multi-Model Architecture",{"type":17,"tag":29,"props":137506,"children":137507},{},[137508],{"type":23,"value":137509},"Calling Cohere directly works if you plan to use only one provider.",{"type":17,"tag":29,"props":137511,"children":137512},{},[137513],{"type":23,"value":137514},"Most AI-native SaaS teams need:",{"type":17,"tag":80,"props":137516,"children":137517},{},[137518,137523,137527,137532,137537],{"type":17,"tag":84,"props":137519,"children":137520},{},[137521],{"type":23,"value":137522},"Provider fallback",{"type":17,"tag":84,"props":137524,"children":137525},{},[137526],{"type":23,"value":17110},{"type":17,"tag":84,"props":137528,"children":137529},{},[137530],{"type":23,"value":137531},"Embedding portability",{"type":17,"tag":84,"props":137533,"children":137534},{},[137535],{"type":23,"value":137536},"Cost routing",{"type":17,"tag":84,"props":137538,"children":137539},{},[137540],{"type":23,"value":137541},"Enterprise flexibility",{"type":17,"tag":29,"props":137543,"children":137544},{},[137545],{"type":23,"value":137546},"Instead of building separate integrations for:",{"type":17,"tag":80,"props":137548,"children":137549},{},[137550,137554,137558,137563,137568],{"type":17,"tag":84,"props":137551,"children":137552},{},[137553],{"type":23,"value":16525},{"type":17,"tag":84,"props":137555,"children":137556},{},[137557],{"type":23,"value":16104},{"type":17,"tag":84,"props":137559,"children":137560},{},[137561],{"type":23,"value":137562},"Anthropic",{"type":17,"tag":84,"props":137564,"children":137565},{},[137566],{"type":23,"value":137567},"Gemini",{"type":17,"tag":84,"props":137569,"children":137570},{},[137571],{"type":23,"value":16567},{"type":17,"tag":29,"props":137573,"children":137574},{},[137575,137577,137581],{"type":23,"value":137576},"…you can integrate once using Unified's ",{"type":17,"tag":48,"props":137578,"children":137579},{},[137580],{"type":23,"value":137141},{"type":23,"value":54},{"type":17,"tag":68,"props":137583,"children":137585},{"id":137584},"build-once-across-cohere-and-other-llm-providers",[137586],{"type":23,"value":137587},"Build Once Across Cohere and Other LLM Providers",{"type":17,"tag":29,"props":137589,"children":137590},{},[137591],{"type":23,"value":137592},"Unified's Generative AI API standardizes:",{"type":17,"tag":80,"props":137594,"children":137595},{},[137596,137604,137612],{"type":17,"tag":84,"props":137597,"children":137598},{},[137599],{"type":17,"tag":48,"props":137600,"children":137601},{},[137602],{"type":23,"value":137603},"Models",{"type":17,"tag":84,"props":137605,"children":137606},{},[137607],{"type":17,"tag":48,"props":137608,"children":137609},{},[137610],{"type":23,"value":137611},"Prompts",{"type":17,"tag":84,"props":137613,"children":137614},{},[137615],{"type":17,"tag":48,"props":137616,"children":137617},{},[137618],{"type":23,"value":137619},"Embeddings",{"type":17,"tag":29,"props":137621,"children":137622},{},[137623],{"type":23,"value":137624},"Across supported providers, including Cohere.",{"type":17,"tag":239,"props":137626,"children":137628},{"id":137627},"standardized-objects",[137629],{"type":23,"value":137630},"Standardized objects",{"type":17,"tag":29,"props":137632,"children":137633},{},[137634],{"type":17,"tag":48,"props":137635,"children":137636},{},[137637],{"type":23,"value":16997},{"type":17,"tag":80,"props":137639,"children":137640},{},[137641,137645,137649],{"type":17,"tag":84,"props":137642,"children":137643},{},[137644],{"type":23,"value":18766},{"type":17,"tag":84,"props":137646,"children":137647},{},[137648],{"type":23,"value":74702},{"type":17,"tag":84,"props":137650,"children":137651},{},[137652],{"type":23,"value":137653},"temperature support",{"type":17,"tag":29,"props":137655,"children":137656},{},[137657],{"type":17,"tag":48,"props":137658,"children":137659},{},[137660],{"type":23,"value":17010},{"type":17,"tag":80,"props":137662,"children":137663},{},[137664,137668,137673,137677,137681,137686],{"type":17,"tag":84,"props":137665,"children":137666},{},[137667],{"type":23,"value":74684},{"type":17,"tag":84,"props":137669,"children":137670},{},[137671],{"type":23,"value":137672},"messages",{"type":17,"tag":84,"props":137674,"children":137675},{},[137676],{"type":23,"value":74693},{"type":17,"tag":84,"props":137678,"children":137679},{},[137680],{"type":23,"value":74702},{"type":17,"tag":84,"props":137682,"children":137683},{},[137684],{"type":23,"value":137685},"responses",{"type":17,"tag":84,"props":137687,"children":137688},{},[137689],{"type":23,"value":137690},"tokens_used",{"type":17,"tag":29,"props":137692,"children":137693},{},[137694],{"type":17,"tag":48,"props":137695,"children":137696},{},[137697],{"type":23,"value":17023},{"type":17,"tag":80,"props":137699,"children":137700},{},[137701,137705,137709,137714,137718],{"type":17,"tag":84,"props":137702,"children":137703},{},[137704],{"type":23,"value":74684},{"type":17,"tag":84,"props":137706,"children":137707},{},[137708],{"type":23,"value":1679},{"type":17,"tag":84,"props":137710,"children":137711},{},[137712],{"type":23,"value":137713},"dimension",{"type":17,"tag":84,"props":137715,"children":137716},{},[137717],{"type":23,"value":16213},{"type":17,"tag":84,"props":137719,"children":137720},{},[137721],{"type":23,"value":137690},{"type":17,"tag":29,"props":137723,"children":137724},{},[137725],{"type":23,"value":79138},{"type":17,"tag":80,"props":137727,"children":137728},{},[137729,137734,137739,137744],{"type":17,"tag":84,"props":137730,"children":137731},{},[137732],{"type":23,"value":137733},"Switching between Cohere and other providers without rewriting integration logic",{"type":17,"tag":84,"props":137735,"children":137736},{},[137737],{"type":23,"value":137738},"Running the same prompt across providers for comparison",{"type":17,"tag":84,"props":137740,"children":137741},{},[137742],{"type":23,"value":137743},"Routing requests dynamically",{"type":17,"tag":84,"props":137745,"children":137746},{},[137747],{"type":23,"value":137748},"Keeping product architecture provider-agnostic",{"type":17,"tag":29,"props":137750,"children":137751},{},[137752],{"type":23,"value":137753},"You integrate once at the GenAI layer.",{"type":17,"tag":68,"props":137755,"children":137757},{"id":137756},"let-cohere-take-action-via-unified-mcp",[137758],{"type":23,"value":137759},"Let Cohere Take Action via Unified MCP",{"type":17,"tag":29,"props":137761,"children":137762},{},[137763],{"type":23,"value":137764},"Cohere supports tool-based interactions similar to other modern LLM APIs.",{"type":17,"tag":29,"props":137766,"children":137767},{},[137768],{"type":23,"value":137769},"Text generation alone isn't enough for production AI features.",{"type":17,"tag":29,"props":137771,"children":137772},{},[137773],{"type":23,"value":137774},"Real AI products require structured, authorized reads and writes against customer SaaS platforms:",{"type":17,"tag":80,"props":137776,"children":137777},{},[137778,137783,137788,137793,137798],{"type":17,"tag":84,"props":137779,"children":137780},{},[137781],{"type":23,"value":137782},"Retrieve CRM records",{"type":17,"tag":84,"props":137784,"children":137785},{},[137786],{"type":23,"value":137787},"Fetch ATS candidates",{"type":17,"tag":84,"props":137789,"children":137790},{},[137791],{"type":23,"value":137792},"Access storage",{"type":17,"tag":84,"props":137794,"children":137795},{},[137796],{"type":23,"value":137797},"Update tickets",{"type":17,"tag":84,"props":137799,"children":137800},{},[137801],{"type":23,"value":137802},"Write back notes",{"type":17,"tag":29,"props":137804,"children":137805},{},[137806,137807,137811],{"type":23,"value":25244},{"type":17,"tag":48,"props":137808,"children":137809},{},[137810],{"type":23,"value":1067},{"type":23,"value":137812}," connects Cohere to customer integrations through tool-calling.",{"type":17,"tag":68,"props":137814,"children":137816},{"id":137815},"cohere-unified-mcp-tool-calling-flow",[137817],{"type":23,"value":137818},"Cohere + Unified MCP (Tool-Calling Flow)",{"type":17,"tag":29,"props":137820,"children":137821},{},[137822],{"type":23,"value":137823},"High-level architecture:",{"type":17,"tag":6154,"props":137825,"children":137826},{},[137827],{"type":17,"tag":84,"props":137828,"children":137829},{},[137830],{"type":23,"value":137831},"Fetch tools formatted for Cohere:",{"type":17,"tag":6893,"props":137833,"children":137836},{"className":137834,"code":137835,"language":20901,"meta":23},[20899],"GET /tools?type=cohere\n",[137837],{"type":17,"tag":6121,"props":137838,"children":137839},{"__ignoreMap":7},[137840],{"type":23,"value":137835},{"type":17,"tag":6154,"props":137842,"children":137843},{},[137844,137857],{"type":17,"tag":84,"props":137845,"children":137846},{},[137847,137849,137855],{"type":23,"value":137848},"Include tools in your ",{"type":17,"tag":6121,"props":137850,"children":137852},{"className":137851},[],[137853],{"type":23,"value":137854},"co.chat()",{"type":23,"value":137856}," request",{"type":17,"tag":84,"props":137858,"children":137859},{},[137860],{"type":23,"value":137861},"When Cohere returns a tool request:",{"type":17,"tag":6893,"props":137863,"children":137866},{"className":137864,"code":137865,"language":20901,"meta":23},[20899],"POST /tools/{id}/call\n",[137867],{"type":17,"tag":6121,"props":137868,"children":137869},{"__ignoreMap":7},[137870],{"type":23,"value":137865},{"type":17,"tag":6154,"props":137872,"children":137873},{},[137874],{"type":17,"tag":84,"props":137875,"children":137876},{},[137877],{"type":23,"value":137878},"Return the result back to the model",{"type":17,"tag":29,"props":137880,"children":137881},{},[137882],{"type":23,"value":137883},"Responsibilities remain clean:",{"type":17,"tag":80,"props":137885,"children":137886},{},[137887,137892,137897],{"type":17,"tag":84,"props":137888,"children":137889},{},[137890],{"type":23,"value":137891},"Cohere → reasoning and tool selection",{"type":17,"tag":84,"props":137893,"children":137894},{},[137895],{"type":23,"value":137896},"Unified → authorized API execution",{"type":17,"tag":84,"props":137898,"children":137899},{},[137900],{"type":23,"value":137901},"Your application → UX, state management, approvals",{"type":17,"tag":68,"props":137903,"children":137905},{"id":137904},"production-controls-you-should-use",[137906],{"type":23,"value":137907},"Production Controls You Should Use",{"type":17,"tag":29,"props":137909,"children":137910},{},[137911],{"type":23,"value":137912},"When deploying Cohere in production:",{"type":17,"tag":80,"props":137914,"children":137915},{},[137916,137921,137926,137931,137936],{"type":17,"tag":84,"props":137917,"children":137918},{},[137919],{"type":23,"value":137920},"Restrict tool scope to avoid model overload",{"type":17,"tag":84,"props":137922,"children":137923},{},[137924],{"type":23,"value":137925},"Limit permissions per connection",{"type":17,"tag":84,"props":137927,"children":137928},{},[137929],{"type":23,"value":137930},"Monitor token and request volume",{"type":17,"tag":84,"props":137932,"children":137933},{},[137934],{"type":23,"value":137935},"Keep API keys server-side",{"type":17,"tag":84,"props":137937,"children":137938},{},[137939],{"type":23,"value":137940},"Rotate keys periodically",{"type":17,"tag":29,"props":137942,"children":137943},{},[137944],{"type":23,"value":137945},"Unified's infrastructure is:",{"type":17,"tag":80,"props":137947,"children":137948},{},[137949,137954,137958,137963],{"type":17,"tag":84,"props":137950,"children":137951},{},[137952],{"type":23,"value":137953},"Real-time (data fetched directly from source APIs)",{"type":17,"tag":84,"props":137955,"children":137956},{},[137957],{"type":23,"value":9909},{"type":17,"tag":84,"props":137959,"children":137960},{},[137961],{"type":23,"value":137962},"Zero storage of customer payloads",{"type":17,"tag":84,"props":137964,"children":137965},{},[137966],{"type":23,"value":137967},"Usage-based pricing aligned with API volume",{"type":17,"tag":68,"props":137969,"children":137971},{"id":137970},"why-this-matters-for-ai-native-saas-teams",[137972],{"type":23,"value":137973},"Why This Matters for AI-Native SaaS Teams",{"type":17,"tag":29,"props":137975,"children":137976},{},[137977],{"type":23,"value":137978},"Calling Cohere is simple.",{"type":17,"tag":29,"props":137980,"children":137981},{},[137982],{"type":23,"value":137983},"Shipping:",{"type":17,"tag":80,"props":137985,"children":137986},{},[137987,137992,137997,138002,138007],{"type":17,"tag":84,"props":137988,"children":137989},{},[137990],{"type":23,"value":137991},"Retrieval-augmented generation",{"type":17,"tag":84,"props":137993,"children":137994},{},[137995],{"type":23,"value":137996},"Embedding pipelines",{"type":17,"tag":84,"props":137998,"children":137999},{},[138000],{"type":23,"value":138001},"Agent-based write actions",{"type":17,"tag":84,"props":138003,"children":138004},{},[138005],{"type":23,"value":138006},"Multi-provider routing",{"type":17,"tag":84,"props":138008,"children":138009},{},[138010],{"type":23,"value":138011},"Enterprise SaaS integrations",{"type":17,"tag":29,"props":138013,"children":138014},{},[138015],{"type":23,"value":138016},"…requires integration infrastructure.",{"type":17,"tag":29,"props":138018,"children":138019},{},[138020],{"type":23,"value":138021},"Unified was built for:",{"type":17,"tag":80,"props":138023,"children":138024},{},[138025,138030,138035,138039,138044],{"type":17,"tag":84,"props":138026,"children":138027},{},[138028],{"type":23,"value":138029},"Real-time integration access",{"type":17,"tag":84,"props":138031,"children":138032},{},[138033],{"type":23,"value":138034},"Pass-through architecture",{"type":17,"tag":84,"props":138036,"children":138037},{},[138038],{"type":23,"value":43670},{"type":17,"tag":84,"props":138040,"children":138041},{},[138042],{"type":23,"value":138043},"MCP-compatible AI agents",{"type":17,"tag":84,"props":138045,"children":138046},{},[138047],{"type":23,"value":138048},"Usage-based scaling",{"type":17,"tag":29,"props":138050,"children":138051},{},[138052],{"type":23,"value":138053},"Cohere generates intelligence.",{"type":17,"tag":29,"props":138055,"children":138056},{},[138057],{"type":23,"value":138058},"Unified connects that intelligence to structured SaaS data and authorized actions.",{"type":17,"tag":29,"props":138060,"children":138061},{},[138062],{"type":23,"value":138063},"That's how AI features move from experimentation to production.",{"type":17,"tag":29,"props":138065,"children":138066},{},[138067],{"type":17,"tag":133,"props":138068,"children":138070},{"href":1612,"rel":138069},[214],[138071],{"type":23,"value":44481},{"type":17,"tag":29,"props":138073,"children":138074},{},[138075],{"type":17,"tag":133,"props":138076,"children":138078},{"href":1623,"rel":138077},[214],[138079],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":138081},[138082,138083,138084,138085,138089,138092,138093,138094,138097,138098,138099,138100],{"id":137155,"depth":1629,"text":137158},{"id":137200,"depth":1629,"text":137203},{"id":137246,"depth":1629,"text":137249},{"id":137305,"depth":1629,"text":137308,"children":138086},[138087,138088],{"id":137316,"depth":1635,"text":137319},{"id":137345,"depth":1635,"text":137348},{"id":137387,"depth":1629,"text":137390,"children":138090},[138091],{"id":137398,"depth":1635,"text":137401},{"id":137441,"depth":1629,"text":137444},{"id":137501,"depth":1629,"text":137504},{"id":137584,"depth":1629,"text":137587,"children":138095},[138096],{"id":137627,"depth":1635,"text":137630},{"id":137756,"depth":1629,"text":137759},{"id":137815,"depth":1629,"text":137818},{"id":137904,"depth":1629,"text":137907},{"id":137970,"depth":1629,"text":137973},"content:blog:how_to_get_a_cohere_api_key_and_connect_it_to_your_product.md","blog/how_to_get_a_cohere_api_key_and_connect_it_to_your_product.md","blog/how_to_get_a_cohere_api_key_and_connect_it_to_your_product",{"_path":138105,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":138106,"description":138107,"img":138108,"date":138109,"tag":12,"body":138110,"_type":1677,"_id":138846,"_source":1679,"_file":138847,"_stem":138848,"_extension":1682},"/blog/how_to_get_a_mistral_ai_api_key","How to Get a Mistral AI API Key","Mistral AI is a European LLM provider offering models like Mistral Large and Mistral Small through its API platform.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_a_mistral_ai_api_key-icon.png","2026-02-20T20:33:00.000Z",{"type":14,"children":138111,"toc":138831},[138112,138117,138120,138127,138131,138142,138146,138176,138182,138186,138195,138200,138205,138223,138233,138239,138244,138253,138258,138267,138273,138277,138285,138290,138316,138321,138325,138330,138336,138340,138344,138353,138357,138375,138380,138386,138391,138395,138403,138408,138426,138431,138435,138439,138448,138452,138495,138501,138506,138510,138533,138537,138560,138569,138575,138579,138603,138608,138612,138619,138634,138641,138668,138675,138698,138702,138725,138729,138733,138738,138742,138766,138770,138774,138802,138807,138811,138815,138823],{"type":17,"tag":18,"props":138113,"children":138115},{"id":138114},"how-to-get-a-mistral-ai-api-key",[138116],{"type":23,"value":138106},{"type":17,"tag":25,"props":138118,"children":138119},{},[],{"type":17,"tag":29,"props":138121,"children":138122},{},[138123],{"type":17,"tag":33,"props":138124,"children":138125},{},[138126],{"type":23,"value":136280},{"type":17,"tag":29,"props":138128,"children":138129},{},[138130],{"type":23,"value":138107},{"type":17,"tag":29,"props":138132,"children":138133},{},[138134,138136,138141],{"type":23,"value":138135},"If you're building an AI-native SaaS product, internal assistant, or agent system, you'll need a ",{"type":17,"tag":48,"props":138137,"children":138138},{},[138139],{"type":23,"value":138140},"Mistral API key",{"type":23,"value":54},{"type":17,"tag":29,"props":138143,"children":138144},{},[138145],{"type":23,"value":70164},{"type":17,"tag":6154,"props":138147,"children":138148},{},[138149,138154,138159,138163,138167],{"type":17,"tag":84,"props":138150,"children":138151},{},[138152],{"type":23,"value":138153},"Creating your Mistral account",{"type":17,"tag":84,"props":138155,"children":138156},{},[138157],{"type":23,"value":138158},"Generating your API key",{"type":17,"tag":84,"props":138160,"children":138161},{},[138162],{"type":23,"value":137126},{"type":17,"tag":84,"props":138164,"children":138165},{},[138166],{"type":23,"value":137131},{"type":17,"tag":84,"props":138168,"children":138169},{},[138170,138172],{"type":23,"value":138171},"Using Mistral via Unified's ",{"type":17,"tag":133,"props":138173,"children":138174},{"href":16186},[138175],{"type":23,"value":137141},{"type":17,"tag":68,"props":138177,"children":138179},{"id":138178},"step-1-create-or-log-in-to-your-mistral-account",[138180],{"type":23,"value":138181},"Step 1: Create or Log In to Your Mistral Account",{"type":17,"tag":29,"props":138183,"children":138184},{},[138185],{"type":23,"value":137163},{"type":17,"tag":6893,"props":138187,"children":138190},{"className":138188,"code":138189,"language":20901,"meta":23},[20899],"https://console.mistral.ai\n",[138191],{"type":17,"tag":6121,"props":138192,"children":138193},{"__ignoreMap":7},[138194],{"type":23,"value":138189},{"type":17,"tag":29,"props":138196,"children":138197},{},[138198],{"type":23,"value":138199},"Sign in or create a new account.",{"type":17,"tag":29,"props":138201,"children":138202},{},[138203],{"type":23,"value":138204},"If you're creating a new account, you'll need to:",{"type":17,"tag":80,"props":138206,"children":138207},{},[138208,138213,138218],{"type":17,"tag":84,"props":138209,"children":138210},{},[138211],{"type":23,"value":138212},"Set up a workspace",{"type":17,"tag":84,"props":138214,"children":138215},{},[138216],{"type":23,"value":138217},"Name it",{"type":17,"tag":84,"props":138219,"children":138220},{},[138221],{"type":23,"value":138222},"Accept terms",{"type":17,"tag":29,"props":138224,"children":138225},{},[138226,138228,138232],{"type":23,"value":138227},"Workspaces determine billing and ",{"type":17,"tag":133,"props":138229,"children":138230},{"href":135},[138231],{"type":23,"value":138},{"type":23,"value":54},{"type":17,"tag":68,"props":138234,"children":138236},{"id":138235},"step-2-navigate-to-api-keys",[138237],{"type":23,"value":138238},"Step 2: Navigate to API Keys",{"type":17,"tag":29,"props":138240,"children":138241},{},[138242],{"type":23,"value":138243},"In the console:",{"type":17,"tag":29,"props":138245,"children":138246},{},[138247,138249],{"type":23,"value":138248},"Left sidebar → ",{"type":17,"tag":48,"props":138250,"children":138251},{},[138252],{"type":23,"value":137228},{"type":17,"tag":29,"props":138254,"children":138255},{},[138256],{"type":23,"value":138257},"Direct URL:",{"type":17,"tag":6893,"props":138259,"children":138262},{"className":138260,"code":138261,"language":20901,"meta":23},[20899],"https://console.mistral.ai/api-keys\n",[138263],{"type":17,"tag":6121,"props":138264,"children":138265},{"__ignoreMap":7},[138266],{"type":23,"value":138261},{"type":17,"tag":68,"props":138268,"children":138270},{"id":138269},"step-3-create-a-new-api-key",[138271],{"type":23,"value":138272},"Step 3: Create a New API Key",{"type":17,"tag":29,"props":138274,"children":138275},{},[138276],{"type":23,"value":137289},{"type":17,"tag":29,"props":138278,"children":138279},{},[138280],{"type":17,"tag":48,"props":138281,"children":138282},{},[138283],{"type":23,"value":138284},"Create new key",{"type":17,"tag":29,"props":138286,"children":138287},{},[138288],{"type":23,"value":138289},"You'll be prompted to:",{"type":17,"tag":80,"props":138291,"children":138292},{},[138293,138311],{"type":17,"tag":84,"props":138294,"children":138295},{},[138296,138298,138304,138305,138310],{"type":23,"value":138297},"Assign a name (e.g., ",{"type":17,"tag":6121,"props":138299,"children":138301},{"className":138300},[],[138302],{"type":23,"value":138303},"prod-backend",{"type":23,"value":11826},{"type":17,"tag":6121,"props":138306,"children":138308},{"className":138307},[],[138309],{"type":23,"value":137275},{"type":23,"value":12034},{"type":17,"tag":84,"props":138312,"children":138313},{},[138314],{"type":23,"value":138315},"Optionally set an expiration date",{"type":17,"tag":29,"props":138317,"children":138318},{},[138319],{"type":23,"value":138320},"Once created, the key will be displayed once.",{"type":17,"tag":29,"props":138322,"children":138323},{},[138324],{"type":23,"value":137238},{"type":17,"tag":29,"props":138326,"children":138327},{},[138328],{"type":23,"value":138329},"Note: The key may take a few minutes to become active.",{"type":17,"tag":68,"props":138331,"children":138333},{"id":138332},"step-4-store-your-key-securely",[138334],{"type":23,"value":138335},"Step 4: Store Your Key Securely",{"type":17,"tag":29,"props":138337,"children":138338},{},[138339],{"type":23,"value":137395},{"type":17,"tag":239,"props":138341,"children":138342},{"id":137398},[138343],{"type":23,"value":137401},{"type":17,"tag":6893,"props":138345,"children":138348},{"className":138346,"code":138347,"language":48432,"meta":7},[48430],"export MISTRAL_API_KEY=\"\u003Cyour_key>\"\n",[138349],{"type":17,"tag":6121,"props":138350,"children":138351},{"__ignoreMap":7},[138352],{"type":23,"value":138347},{"type":17,"tag":29,"props":138354,"children":138355},{},[138356],{"type":23,"value":137415},{"type":17,"tag":80,"props":138358,"children":138359},{},[138360,138365,138370],{"type":17,"tag":84,"props":138361,"children":138362},{},[138363],{"type":23,"value":138364},"Commit API keys to version control",{"type":17,"tag":84,"props":138366,"children":138367},{},[138368],{"type":23,"value":138369},"Embed them in client-side code",{"type":17,"tag":84,"props":138371,"children":138372},{},[138373],{"type":23,"value":138374},"Share them publicly",{"type":17,"tag":29,"props":138376,"children":138377},{},[138378],{"type":23,"value":138379},"Treat API keys like credentials.",{"type":17,"tag":68,"props":138381,"children":138383},{"id":138382},"step-5-configure-billing",[138384],{"type":23,"value":138385},"Step 5: Configure Billing",{"type":17,"tag":29,"props":138387,"children":138388},{},[138389],{"type":23,"value":138390},"Mistral offers a limited free tier for experimentation, but production usage typically requires billing.",{"type":17,"tag":29,"props":138392,"children":138393},{},[138394],{"type":23,"value":138243},{"type":17,"tag":29,"props":138396,"children":138397},{},[138398],{"type":17,"tag":48,"props":138399,"children":138400},{},[138401],{"type":23,"value":138402},"Billing",{"type":17,"tag":29,"props":138404,"children":138405},{},[138406],{"type":23,"value":138407},"You may need to:",{"type":17,"tag":80,"props":138409,"children":138410},{},[138411,138416,138421],{"type":17,"tag":84,"props":138412,"children":138413},{},[138414],{"type":23,"value":138415},"Add a payment method",{"type":17,"tag":84,"props":138417,"children":138418},{},[138419],{"type":23,"value":138420},"Purchase initial credits",{"type":17,"tag":84,"props":138422,"children":138423},{},[138424],{"type":23,"value":138425},"Configure auto-reload",{"type":17,"tag":29,"props":138427,"children":138428},{},[138429],{"type":23,"value":138430},"Rate limits depend on usage tier and model.",{"type":17,"tag":68,"props":138432,"children":138433},{"id":137441},[138434],{"type":23,"value":137444},{"type":17,"tag":29,"props":138436,"children":138437},{},[138438],{"type":23,"value":25256},{"type":17,"tag":6893,"props":138440,"children":138443},{"className":138441,"code":138442,"language":48432,"meta":7},[48430],"curl https://api.mistral.ai/v1/chat/completions \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer $MISTRAL_API_KEY\" \\\n  -d '{\n    \"model\": \"mistral-large-latest\",\n    \"messages\": [\n      {\"role\": \"user\", \"content\": \"Explain what an API key is in two sentences.\"}\n    ]\n  }'\n",[138444],{"type":17,"tag":6121,"props":138445,"children":138446},{"__ignoreMap":7},[138447],{"type":23,"value":138442},{"type":17,"tag":29,"props":138449,"children":138450},{},[138451],{"type":23,"value":137463},{"type":17,"tag":80,"props":138453,"children":138454},{},[138455,138465,138475,138486],{"type":17,"tag":84,"props":138456,"children":138457},{},[138458,138463],{"type":17,"tag":6121,"props":138459,"children":138461},{"className":138460},[],[138462],{"type":23,"value":137475},{"type":23,"value":138464}," → incorrect or inactive key",{"type":17,"tag":84,"props":138466,"children":138467},{},[138468,138473],{"type":17,"tag":6121,"props":138469,"children":138471},{"className":138470},[],[138472],{"type":23,"value":137496},{"type":23,"value":138474}," → malformed request payload",{"type":17,"tag":84,"props":138476,"children":138477},{},[138478,138484],{"type":17,"tag":6121,"props":138479,"children":138481},{"className":138480},[],[138482],{"type":23,"value":138483},"404 Not Found",{"type":23,"value":138485}," → incorrect model name",{"type":17,"tag":84,"props":138487,"children":138488},{},[138489,138494],{"type":17,"tag":6121,"props":138490,"children":138492},{"className":138491},[],[138493],{"type":23,"value":97917},{"type":23,"value":137487},{"type":17,"tag":68,"props":138496,"children":138498},{"id":138497},"using-mistral-in-a-multi-model-ai-architecture",[138499],{"type":23,"value":138500},"Using Mistral in a Multi-Model AI Architecture",{"type":17,"tag":29,"props":138502,"children":138503},{},[138504],{"type":23,"value":138505},"Calling Mistral directly works if you only plan to use one LLM provider.",{"type":17,"tag":29,"props":138507,"children":138508},{},[138509],{"type":23,"value":137514},{"type":17,"tag":80,"props":138511,"children":138512},{},[138513,138517,138521,138525,138529],{"type":17,"tag":84,"props":138514,"children":138515},{},[138516],{"type":23,"value":137522},{"type":17,"tag":84,"props":138518,"children":138519},{},[138520],{"type":23,"value":137536},{"type":17,"tag":84,"props":138522,"children":138523},{},[138524],{"type":23,"value":17110},{"type":17,"tag":84,"props":138526,"children":138527},{},[138528],{"type":23,"value":137531},{"type":17,"tag":84,"props":138530,"children":138531},{},[138532],{"type":23,"value":137541},{"type":17,"tag":29,"props":138534,"children":138535},{},[138536],{"type":23,"value":137546},{"type":17,"tag":80,"props":138538,"children":138539},{},[138540,138544,138548,138552,138556],{"type":17,"tag":84,"props":138541,"children":138542},{},[138543],{"type":23,"value":16567},{"type":17,"tag":84,"props":138545,"children":138546},{},[138547],{"type":23,"value":16104},{"type":17,"tag":84,"props":138549,"children":138550},{},[138551],{"type":23,"value":137562},{"type":17,"tag":84,"props":138553,"children":138554},{},[138555],{"type":23,"value":137567},{"type":17,"tag":84,"props":138557,"children":138558},{},[138559],{"type":23,"value":16648},{"type":17,"tag":29,"props":138561,"children":138562},{},[138563,138564,138568],{"type":23,"value":137576},{"type":17,"tag":48,"props":138565,"children":138566},{},[138567],{"type":23,"value":137141},{"type":23,"value":54},{"type":17,"tag":68,"props":138570,"children":138572},{"id":138571},"build-once-across-llm-providers",[138573],{"type":23,"value":138574},"Build Once Across LLM Providers",{"type":17,"tag":29,"props":138576,"children":138577},{},[138578],{"type":23,"value":137592},{"type":17,"tag":80,"props":138580,"children":138581},{},[138582,138589,138596],{"type":17,"tag":84,"props":138583,"children":138584},{},[138585],{"type":17,"tag":48,"props":138586,"children":138587},{},[138588],{"type":23,"value":137603},{"type":17,"tag":84,"props":138590,"children":138591},{},[138592],{"type":17,"tag":48,"props":138593,"children":138594},{},[138595],{"type":23,"value":137611},{"type":17,"tag":84,"props":138597,"children":138598},{},[138599],{"type":17,"tag":48,"props":138600,"children":138601},{},[138602],{"type":23,"value":137619},{"type":17,"tag":29,"props":138604,"children":138605},{},[138606],{"type":23,"value":138607},"Across supported providers, including Mistral.",{"type":17,"tag":239,"props":138609,"children":138610},{"id":137627},[138611],{"type":23,"value":137630},{"type":17,"tag":29,"props":138613,"children":138614},{},[138615],{"type":17,"tag":48,"props":138616,"children":138617},{},[138618],{"type":23,"value":16997},{"type":17,"tag":80,"props":138620,"children":138621},{},[138622,138626,138630],{"type":17,"tag":84,"props":138623,"children":138624},{},[138625],{"type":23,"value":18766},{"type":17,"tag":84,"props":138627,"children":138628},{},[138629],{"type":23,"value":74702},{"type":17,"tag":84,"props":138631,"children":138632},{},[138633],{"type":23,"value":137653},{"type":17,"tag":29,"props":138635,"children":138636},{},[138637],{"type":17,"tag":48,"props":138638,"children":138639},{},[138640],{"type":23,"value":17010},{"type":17,"tag":80,"props":138642,"children":138643},{},[138644,138648,138652,138656,138660,138664],{"type":17,"tag":84,"props":138645,"children":138646},{},[138647],{"type":23,"value":74684},{"type":17,"tag":84,"props":138649,"children":138650},{},[138651],{"type":23,"value":137672},{"type":17,"tag":84,"props":138653,"children":138654},{},[138655],{"type":23,"value":74693},{"type":17,"tag":84,"props":138657,"children":138658},{},[138659],{"type":23,"value":74702},{"type":17,"tag":84,"props":138661,"children":138662},{},[138663],{"type":23,"value":137685},{"type":17,"tag":84,"props":138665,"children":138666},{},[138667],{"type":23,"value":137690},{"type":17,"tag":29,"props":138669,"children":138670},{},[138671],{"type":17,"tag":48,"props":138672,"children":138673},{},[138674],{"type":23,"value":17023},{"type":17,"tag":80,"props":138676,"children":138677},{},[138678,138682,138686,138690,138694],{"type":17,"tag":84,"props":138679,"children":138680},{},[138681],{"type":23,"value":74684},{"type":17,"tag":84,"props":138683,"children":138684},{},[138685],{"type":23,"value":1679},{"type":17,"tag":84,"props":138687,"children":138688},{},[138689],{"type":23,"value":137713},{"type":17,"tag":84,"props":138691,"children":138692},{},[138693],{"type":23,"value":16213},{"type":17,"tag":84,"props":138695,"children":138696},{},[138697],{"type":23,"value":137690},{"type":17,"tag":29,"props":138699,"children":138700},{},[138701],{"type":23,"value":22801},{"type":17,"tag":80,"props":138703,"children":138704},{},[138705,138710,138715,138720],{"type":17,"tag":84,"props":138706,"children":138707},{},[138708],{"type":23,"value":138709},"Switch between Mistral and other providers without rewriting integration logic",{"type":17,"tag":84,"props":138711,"children":138712},{},[138713],{"type":23,"value":138714},"Compare outputs across models",{"type":17,"tag":84,"props":138716,"children":138717},{},[138718],{"type":23,"value":138719},"Route requests based on cost or availability",{"type":17,"tag":84,"props":138721,"children":138722},{},[138723],{"type":23,"value":138724},"Keep your product architecture provider-agnostic",{"type":17,"tag":29,"props":138726,"children":138727},{},[138728],{"type":23,"value":137753},{"type":17,"tag":68,"props":138730,"children":138731},{"id":137970},[138732],{"type":23,"value":137973},{"type":17,"tag":29,"props":138734,"children":138735},{},[138736],{"type":23,"value":138737},"Calling Mistral is straightforward.",{"type":17,"tag":29,"props":138739,"children":138740},{},[138741],{"type":23,"value":137983},{"type":17,"tag":80,"props":138743,"children":138744},{},[138745,138749,138753,138757,138761],{"type":17,"tag":84,"props":138746,"children":138747},{},[138748],{"type":23,"value":15895},{"type":17,"tag":84,"props":138750,"children":138751},{},[138752],{"type":23,"value":138001},{"type":17,"tag":84,"props":138754,"children":138755},{},[138756],{"type":23,"value":138006},{"type":17,"tag":84,"props":138758,"children":138759},{},[138760],{"type":23,"value":137996},{"type":17,"tag":84,"props":138762,"children":138763},{},[138764],{"type":23,"value":138765},"Enterprise-grade SaaS integrations",{"type":17,"tag":29,"props":138767,"children":138768},{},[138769],{"type":23,"value":138016},{"type":17,"tag":29,"props":138771,"children":138772},{},[138773],{"type":23,"value":138021},{"type":17,"tag":80,"props":138775,"children":138776},{},[138777,138781,138785,138789,138798],{"type":17,"tag":84,"props":138778,"children":138779},{},[138780],{"type":23,"value":138029},{"type":17,"tag":84,"props":138782,"children":138783},{},[138784],{"type":23,"value":138034},{"type":17,"tag":84,"props":138786,"children":138787},{},[138788],{"type":23,"value":43670},{"type":17,"tag":84,"props":138790,"children":138791},{},[138792,138796],{"type":17,"tag":133,"props":138793,"children":138794},{"href":326},[138795],{"type":23,"value":329},{"type":23,"value":138797},"-compatible AI agents",{"type":17,"tag":84,"props":138799,"children":138800},{},[138801],{"type":23,"value":138048},{"type":17,"tag":29,"props":138803,"children":138804},{},[138805],{"type":23,"value":138806},"Mistral generates intelligence.",{"type":17,"tag":29,"props":138808,"children":138809},{},[138810],{"type":23,"value":138058},{"type":17,"tag":29,"props":138812,"children":138813},{},[138814],{"type":23,"value":138063},{"type":17,"tag":29,"props":138816,"children":138817},{},[138818],{"type":17,"tag":133,"props":138819,"children":138821},{"href":1612,"rel":138820},[214],[138822],{"type":23,"value":44481},{"type":17,"tag":29,"props":138824,"children":138825},{},[138826],{"type":17,"tag":133,"props":138827,"children":138829},{"href":1623,"rel":138828},[214],[138830],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":138832},[138833,138834,138835,138836,138839,138840,138841,138842,138845],{"id":138178,"depth":1629,"text":138181},{"id":138235,"depth":1629,"text":138238},{"id":138269,"depth":1629,"text":138272},{"id":138332,"depth":1629,"text":138335,"children":138837},[138838],{"id":137398,"depth":1635,"text":137401},{"id":138382,"depth":1629,"text":138385},{"id":137441,"depth":1629,"text":137444},{"id":138497,"depth":1629,"text":138500},{"id":138571,"depth":1629,"text":138574,"children":138843},[138844],{"id":137627,"depth":1635,"text":137630},{"id":137970,"depth":1629,"text":137973},"content:blog:how_to_get_a_mistral_ai_api_key.md","blog/how_to_get_a_mistral_ai_api_key.md","blog/how_to_get_a_mistral_ai_api_key",{"_path":138850,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":138851,"description":138852,"img":138853,"date":138854,"tag":12,"body":138855,"_type":1677,"_id":139769,"_source":1679,"_file":139770,"_stem":139771,"_extension":1682},"/blog/how_to_get_a_claude_anthropic_api_key_and_connect_it_to_your_product","How to Get a Claude (Anthropic) API Key — and Connect It to Your Product","Claude is Anthropic's family of large language models (Claude 3 Opus, Sonnet, Haiku, etc.).","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_a_claude_anthropic_api_key_and_connect_it_to_your_product-icon.png","2026-02-20T20:30:00.000Z",{"type":14,"children":138856,"toc":139753},[138857,138862,138865,138872,138876,138887,138891,138933,138939,138943,138952,138957,138962,138968,138973,139015,139020,139025,139029,139038,139042,139059,139078,139084,139089,139093,139101,139106,139123,139128,139134,139139,139148,139153,139157,139192,139198,139203,139207,139230,139235,139258,139267,139273,139277,139301,139306,139310,139317,139332,139339,139366,139373,139396,139400,139423,139427,139433,139438,139443,139470,139480,139486,139499,139504,139512,139521,139541,139550,139558,139566,139574,139579,139596,139600,139605,139631,139635,139654,139658,139663,139667,139692,139696,139700,139724,139729,139733,139737,139745],{"type":17,"tag":18,"props":138858,"children":138860},{"id":138859},"how-to-get-a-claude-anthropic-api-key-and-connect-it-to-your-product",[138861],{"type":23,"value":138851},{"type":17,"tag":25,"props":138863,"children":138864},{},[],{"type":17,"tag":29,"props":138866,"children":138867},{},[138868],{"type":17,"tag":33,"props":138869,"children":138870},{},[138871],{"type":23,"value":136280},{"type":17,"tag":29,"props":138873,"children":138874},{},[138875],{"type":23,"value":138852},{"type":17,"tag":29,"props":138877,"children":138878},{},[138879,138881,138886],{"type":23,"value":138880},"If you're building an AI-powered SaaS product, internal assistant, or agent system, you'll need an ",{"type":17,"tag":48,"props":138882,"children":138883},{},[138884],{"type":23,"value":138885},"Anthropic API key",{"type":23,"value":54},{"type":17,"tag":29,"props":138888,"children":138889},{},[138890],{"type":23,"value":70164},{"type":17,"tag":6154,"props":138892,"children":138893},{},[138894,138899,138904,138909,138914,138923],{"type":17,"tag":84,"props":138895,"children":138896},{},[138897],{"type":23,"value":138898},"Creating your Anthropic account",{"type":17,"tag":84,"props":138900,"children":138901},{},[138902],{"type":23,"value":138903},"Generating and securing your API key",{"type":17,"tag":84,"props":138905,"children":138906},{},[138907],{"type":23,"value":138908},"Setting up billing",{"type":17,"tag":84,"props":138910,"children":138911},{},[138912],{"type":23,"value":138913},"Testing your first request",{"type":17,"tag":84,"props":138915,"children":138916},{},[138917,138919],{"type":23,"value":138918},"Using Claude through Unified's ",{"type":17,"tag":133,"props":138920,"children":138921},{"href":16186},[138922],{"type":23,"value":137141},{"type":17,"tag":84,"props":138924,"children":138925},{},[138926,138928,138932],{"type":23,"value":138927},"Connecting Claude to SaaS platforms via [Unified ",{"type":17,"tag":133,"props":138929,"children":138930},{"href":326},[138931],{"type":23,"value":329},{"type":23,"value":137152},{"type":17,"tag":68,"props":138934,"children":138936},{"id":138935},"step-1-create-an-anthropic-account",[138937],{"type":23,"value":138938},"Step 1: Create an Anthropic Account",{"type":17,"tag":29,"props":138940,"children":138941},{},[138942],{"type":23,"value":137163},{"type":17,"tag":6893,"props":138944,"children":138947},{"className":138945,"code":138946,"language":20901,"meta":23},[20899],"https://console.anthropic.com\n",[138948],{"type":17,"tag":6121,"props":138949,"children":138950},{"__ignoreMap":7},[138951],{"type":23,"value":138946},{"type":17,"tag":29,"props":138953,"children":138954},{},[138955],{"type":23,"value":138956},"Sign up using your email.",{"type":17,"tag":29,"props":138958,"children":138959},{},[138960],{"type":23,"value":138961},"Depending on region or use case, your account may require approval before API access is enabled.",{"type":17,"tag":68,"props":138963,"children":138965},{"id":138964},"step-2-generate-an-api-key",[138966],{"type":23,"value":138967},"Step 2: Generate an API Key",{"type":17,"tag":29,"props":138969,"children":138970},{},[138971],{"type":23,"value":138972},"Once logged in:",{"type":17,"tag":80,"props":138974,"children":138975},{},[138976,138981,138989,138998],{"type":17,"tag":84,"props":138977,"children":138978},{},[138979],{"type":23,"value":138980},"Click your profile (top right)",{"type":17,"tag":84,"props":138982,"children":138983},{},[138984,138985],{"type":23,"value":42939},{"type":17,"tag":48,"props":138986,"children":138987},{},[138988],{"type":23,"value":137228},{"type":17,"tag":84,"props":138990,"children":138991},{},[138992,138993],{"type":23,"value":6629},{"type":17,"tag":48,"props":138994,"children":138995},{},[138996],{"type":23,"value":138997},"Create Key",{"type":17,"tag":84,"props":138999,"children":139000},{},[139001,139003,139008,139009,139014],{"type":23,"value":139002},"Name your key clearly (e.g., ",{"type":17,"tag":6121,"props":139004,"children":139006},{"className":139005},[],[139007],{"type":23,"value":138303},{"type":23,"value":11826},{"type":17,"tag":6121,"props":139010,"children":139012},{"className":139011},[],[139013],{"type":23,"value":137275},{"type":23,"value":12034},{"type":17,"tag":29,"props":139016,"children":139017},{},[139018],{"type":23,"value":139019},"Your key will be shown once. Copy and store it securely.",{"type":17,"tag":29,"props":139021,"children":139022},{},[139023],{"type":23,"value":139024},"Recommended: set it as an environment variable.",{"type":17,"tag":239,"props":139026,"children":139027},{"id":137398},[139028],{"type":23,"value":137401},{"type":17,"tag":6893,"props":139030,"children":139033},{"className":139031,"code":139032,"language":48432,"meta":7},[48430],"export ANTHROPIC_API_KEY=\"\u003Cyour_key>\"\n",[139034],{"type":17,"tag":6121,"props":139035,"children":139036},{"__ignoreMap":7},[139037],{"type":23,"value":139032},{"type":17,"tag":29,"props":139039,"children":139040},{},[139041],{"type":23,"value":137415},{"type":17,"tag":80,"props":139043,"children":139044},{},[139045,139050,139054],{"type":17,"tag":84,"props":139046,"children":139047},{},[139048],{"type":23,"value":139049},"Embed keys in frontend code",{"type":17,"tag":84,"props":139051,"children":139052},{},[139053],{"type":23,"value":137423},{"type":17,"tag":84,"props":139055,"children":139056},{},[139057],{"type":23,"value":139058},"Share keys in logs or screenshots",{"type":17,"tag":29,"props":139060,"children":139061},{},[139062,139064,139070,139072,139077],{"type":23,"value":139063},"Claude API calls use the ",{"type":17,"tag":6121,"props":139065,"children":139067},{"className":139066},[],[139068],{"type":23,"value":139069},"x-api-key",{"type":23,"value":139071}," header, not ",{"type":17,"tag":6121,"props":139073,"children":139075},{"className":139074},[],[139076],{"type":23,"value":7306},{"type":23,"value":54},{"type":17,"tag":68,"props":139079,"children":139081},{"id":139080},"step-3-set-up-billing",[139082],{"type":23,"value":139083},"Step 3: Set Up Billing",{"type":17,"tag":29,"props":139085,"children":139086},{},[139087],{"type":23,"value":139088},"Anthropic uses a prepaid credit system.",{"type":17,"tag":29,"props":139090,"children":139091},{},[139092],{"type":23,"value":138243},{"type":17,"tag":29,"props":139094,"children":139095},{},[139096],{"type":17,"tag":48,"props":139097,"children":139098},{},[139099],{"type":23,"value":139100},"Plans & Billing",{"type":17,"tag":29,"props":139102,"children":139103},{},[139104],{"type":23,"value":139105},"Options:",{"type":17,"tag":80,"props":139107,"children":139108},{},[139109,139114,139119],{"type":17,"tag":84,"props":139110,"children":139111},{},[139112],{"type":23,"value":139113},"Use trial credits (if available)",{"type":17,"tag":84,"props":139115,"children":139116},{},[139117],{"type":23,"value":139118},"Upgrade to a paid plan and purchase credits",{"type":17,"tag":84,"props":139120,"children":139121},{},[139122],{"type":23,"value":138425},{"type":17,"tag":29,"props":139124,"children":139125},{},[139126],{"type":23,"value":139127},"Without credits, your API key will not process requests.",{"type":17,"tag":68,"props":139129,"children":139131},{"id":139130},"step-4-test-your-api-key",[139132],{"type":23,"value":139133},"Step 4: Test Your API Key",{"type":17,"tag":29,"props":139135,"children":139136},{},[139137],{"type":23,"value":139138},"Example test request:",{"type":17,"tag":6893,"props":139140,"children":139143},{"className":139141,"code":139142,"language":48432,"meta":7},[48430],"curl https://api.anthropic.com/v1/messages \\\n  -H \"x-api-key: $ANTHROPIC_API_KEY\" \\\n  -H \"anthropic-version: 2023-06-01\" \\\n  -H \"content-type: application/json\" \\\n  -d '{\n    \"model\": \"claude-3-sonnet-20240229\",\n    \"max_tokens\": 512,\n    \"messages\": [\n      {\"role\": \"user\", \"content\": \"Explain what an API key is in two sentences.\"}\n    ]\n  }'\n",[139144],{"type":17,"tag":6121,"props":139145,"children":139146},{"__ignoreMap":7},[139147],{"type":23,"value":139142},{"type":17,"tag":29,"props":139149,"children":139150},{},[139151],{"type":23,"value":139152},"If successful, you'll receive a JSON response containing Claude's output.",{"type":17,"tag":29,"props":139154,"children":139155},{},[139156],{"type":23,"value":137463},{"type":17,"tag":80,"props":139158,"children":139159},{},[139160,139171,139181],{"type":17,"tag":84,"props":139161,"children":139162},{},[139163,139169],{"type":17,"tag":6121,"props":139164,"children":139166},{"className":139165},[],[139167],{"type":23,"value":139168},"401",{"type":23,"value":139170}," → invalid key",{"type":17,"tag":84,"props":139172,"children":139173},{},[139174,139180],{"type":17,"tag":6121,"props":139175,"children":139177},{"className":139176},[],[139178],{"type":23,"value":139179},"429",{"type":23,"value":137487},{"type":17,"tag":84,"props":139182,"children":139183},{},[139184,139190],{"type":17,"tag":6121,"props":139185,"children":139187},{"className":139186},[],[139188],{"type":23,"value":139189},"400",{"type":23,"value":139191}," → malformed request",{"type":17,"tag":68,"props":139193,"children":139195},{"id":139194},"using-claude-in-a-multi-model-architecture",[139196],{"type":23,"value":139197},"Using Claude in a Multi-Model Architecture",{"type":17,"tag":29,"props":139199,"children":139200},{},[139201],{"type":23,"value":139202},"Calling Claude directly works if you only plan to use Anthropic.",{"type":17,"tag":29,"props":139204,"children":139205},{},[139206],{"type":23,"value":137514},{"type":17,"tag":80,"props":139208,"children":139209},{},[139210,139214,139218,139222,139226],{"type":17,"tag":84,"props":139211,"children":139212},{},[139213],{"type":23,"value":137522},{"type":17,"tag":84,"props":139215,"children":139216},{},[139217],{"type":23,"value":137536},{"type":17,"tag":84,"props":139219,"children":139220},{},[139221],{"type":23,"value":17110},{"type":17,"tag":84,"props":139223,"children":139224},{},[139225],{"type":23,"value":137531},{"type":17,"tag":84,"props":139227,"children":139228},{},[139229],{"type":23,"value":137541},{"type":17,"tag":29,"props":139231,"children":139232},{},[139233],{"type":23,"value":139234},"Instead of maintaining separate integrations for:",{"type":17,"tag":80,"props":139236,"children":139237},{},[139238,139242,139246,139250,139254],{"type":17,"tag":84,"props":139239,"children":139240},{},[139241],{"type":23,"value":137562},{"type":17,"tag":84,"props":139243,"children":139244},{},[139245],{"type":23,"value":16104},{"type":17,"tag":84,"props":139247,"children":139248},{},[139249],{"type":23,"value":137567},{"type":17,"tag":84,"props":139251,"children":139252},{},[139253],{"type":23,"value":16648},{"type":17,"tag":84,"props":139255,"children":139256},{},[139257],{"type":23,"value":16525},{"type":17,"tag":29,"props":139259,"children":139260},{},[139261,139262,139266],{"type":23,"value":137576},{"type":17,"tag":48,"props":139263,"children":139264},{},[139265],{"type":23,"value":137141},{"type":23,"value":54},{"type":17,"tag":68,"props":139268,"children":139270},{"id":139269},"build-once-across-claude-and-other-llm-providers",[139271],{"type":23,"value":139272},"Build Once Across Claude and Other LLM Providers",{"type":17,"tag":29,"props":139274,"children":139275},{},[139276],{"type":23,"value":137592},{"type":17,"tag":80,"props":139278,"children":139279},{},[139280,139287,139294],{"type":17,"tag":84,"props":139281,"children":139282},{},[139283],{"type":17,"tag":48,"props":139284,"children":139285},{},[139286],{"type":23,"value":137603},{"type":17,"tag":84,"props":139288,"children":139289},{},[139290],{"type":17,"tag":48,"props":139291,"children":139292},{},[139293],{"type":23,"value":137611},{"type":17,"tag":84,"props":139295,"children":139296},{},[139297],{"type":17,"tag":48,"props":139298,"children":139299},{},[139300],{"type":23,"value":137619},{"type":17,"tag":29,"props":139302,"children":139303},{},[139304],{"type":23,"value":139305},"Across supported providers, including Anthropic.",{"type":17,"tag":239,"props":139307,"children":139308},{"id":137627},[139309],{"type":23,"value":137630},{"type":17,"tag":29,"props":139311,"children":139312},{},[139313],{"type":17,"tag":48,"props":139314,"children":139315},{},[139316],{"type":23,"value":16997},{"type":17,"tag":80,"props":139318,"children":139319},{},[139320,139324,139328],{"type":17,"tag":84,"props":139321,"children":139322},{},[139323],{"type":23,"value":18766},{"type":17,"tag":84,"props":139325,"children":139326},{},[139327],{"type":23,"value":74702},{"type":17,"tag":84,"props":139329,"children":139330},{},[139331],{"type":23,"value":137653},{"type":17,"tag":29,"props":139333,"children":139334},{},[139335],{"type":17,"tag":48,"props":139336,"children":139337},{},[139338],{"type":23,"value":17010},{"type":17,"tag":80,"props":139340,"children":139341},{},[139342,139346,139350,139354,139358,139362],{"type":17,"tag":84,"props":139343,"children":139344},{},[139345],{"type":23,"value":74684},{"type":17,"tag":84,"props":139347,"children":139348},{},[139349],{"type":23,"value":137672},{"type":17,"tag":84,"props":139351,"children":139352},{},[139353],{"type":23,"value":74693},{"type":17,"tag":84,"props":139355,"children":139356},{},[139357],{"type":23,"value":74702},{"type":17,"tag":84,"props":139359,"children":139360},{},[139361],{"type":23,"value":137685},{"type":17,"tag":84,"props":139363,"children":139364},{},[139365],{"type":23,"value":137690},{"type":17,"tag":29,"props":139367,"children":139368},{},[139369],{"type":17,"tag":48,"props":139370,"children":139371},{},[139372],{"type":23,"value":17023},{"type":17,"tag":80,"props":139374,"children":139375},{},[139376,139380,139384,139388,139392],{"type":17,"tag":84,"props":139377,"children":139378},{},[139379],{"type":23,"value":74684},{"type":17,"tag":84,"props":139381,"children":139382},{},[139383],{"type":23,"value":1679},{"type":17,"tag":84,"props":139385,"children":139386},{},[139387],{"type":23,"value":137713},{"type":17,"tag":84,"props":139389,"children":139390},{},[139391],{"type":23,"value":16213},{"type":17,"tag":84,"props":139393,"children":139394},{},[139395],{"type":23,"value":137690},{"type":17,"tag":29,"props":139397,"children":139398},{},[139399],{"type":23,"value":79138},{"type":17,"tag":80,"props":139401,"children":139402},{},[139403,139408,139413,139418],{"type":17,"tag":84,"props":139404,"children":139405},{},[139406],{"type":23,"value":139407},"Switching between Claude and other providers without rewriting integration code",{"type":17,"tag":84,"props":139409,"children":139410},{},[139411],{"type":23,"value":139412},"Comparing outputs across models",{"type":17,"tag":84,"props":139414,"children":139415},{},[139416],{"type":23,"value":139417},"Routing requests based on cost or availability",{"type":17,"tag":84,"props":139419,"children":139420},{},[139421],{"type":23,"value":139422},"Keeping product logic provider-agnostic",{"type":17,"tag":29,"props":139424,"children":139425},{},[139426],{"type":23,"value":137753},{"type":17,"tag":68,"props":139428,"children":139430},{"id":139429},"let-claude-take-action-via-unified-mcp",[139431],{"type":23,"value":139432},"Let Claude Take Action via Unified MCP",{"type":17,"tag":29,"props":139434,"children":139435},{},[139436],{"type":23,"value":139437},"Text generation is only part of a production AI feature.",{"type":17,"tag":29,"props":139439,"children":139440},{},[139441],{"type":23,"value":139442},"Real AI products require structured reads and writes against customer SaaS platforms:",{"type":17,"tag":80,"props":139444,"children":139445},{},[139446,139451,139456,139461,139466],{"type":17,"tag":84,"props":139447,"children":139448},{},[139449],{"type":23,"value":139450},"Retrieve candidates from an ATS",{"type":17,"tag":84,"props":139452,"children":139453},{},[139454],{"type":23,"value":139455},"Update CRM deals",{"type":17,"tag":84,"props":139457,"children":139458},{},[139459],{"type":23,"value":139460},"Fetch documents",{"type":17,"tag":84,"props":139462,"children":139463},{},[139464],{"type":23,"value":139465},"Create tickets",{"type":17,"tag":84,"props":139467,"children":139468},{},[139469],{"type":23,"value":137802},{"type":17,"tag":29,"props":139471,"children":139472},{},[139473,139474,139478],{"type":23,"value":25244},{"type":17,"tag":48,"props":139475,"children":139476},{},[139477],{"type":23,"value":1067},{"type":23,"value":139479}," connects Claude to customer integrations using Anthropic's tool-use flow.",{"type":17,"tag":68,"props":139481,"children":139483},{"id":139482},"claude-tool-use-with-unified-mcp",[139484],{"type":23,"value":139485},"Claude Tool-Use with Unified MCP",{"type":17,"tag":29,"props":139487,"children":139488},{},[139489,139491,139497],{"type":23,"value":139490},"Claude returns ",{"type":17,"tag":6121,"props":139492,"children":139494},{"className":139493},[],[139495],{"type":23,"value":139496},"tool_use",{"type":23,"value":139498}," blocks when it decides to call a tool.",{"type":17,"tag":29,"props":139500,"children":139501},{},[139502],{"type":23,"value":139503},"High-level flow:",{"type":17,"tag":6154,"props":139505,"children":139506},{},[139507],{"type":17,"tag":84,"props":139508,"children":139509},{},[139510],{"type":23,"value":139511},"Fetch tools formatted for Anthropic:",{"type":17,"tag":6893,"props":139513,"children":139516},{"className":139514,"code":139515,"language":20901,"meta":23},[20899],"GET /tools?type=anthropic\n",[139517],{"type":17,"tag":6121,"props":139518,"children":139519},{"__ignoreMap":7},[139520],{"type":23,"value":139515},{"type":17,"tag":6154,"props":139522,"children":139523},{},[139524,139529],{"type":17,"tag":84,"props":139525,"children":139526},{},[139527],{"type":23,"value":139528},"Include tools in your Claude API request",{"type":17,"tag":84,"props":139530,"children":139531},{},[139532,139534,139539],{"type":23,"value":139533},"Claude responds with a ",{"type":17,"tag":6121,"props":139535,"children":139537},{"className":139536},[],[139538],{"type":23,"value":139496},{"type":23,"value":139540}," object:",{"type":17,"tag":6893,"props":139542,"children":139545},{"className":139543,"code":139544,"language":22503,"meta":7},[22501],"{\n  \"type\": \"tool_use\",\n  \"id\": \"toolu_123\",\n  \"name\": \"list_candidates\",\n  \"input\": { \"limit\": 100 }\n}\n",[139546],{"type":17,"tag":6121,"props":139547,"children":139548},{"__ignoreMap":7},[139549],{"type":23,"value":139544},{"type":17,"tag":6154,"props":139551,"children":139552},{},[139553],{"type":17,"tag":84,"props":139554,"children":139555},{},[139556],{"type":23,"value":139557},"Call Unified:",{"type":17,"tag":6893,"props":139559,"children":139561},{"className":139560,"code":137865,"language":20901,"meta":23},[20899],[139562],{"type":17,"tag":6121,"props":139563,"children":139564},{"__ignoreMap":7},[139565],{"type":23,"value":137865},{"type":17,"tag":6154,"props":139567,"children":139568},{},[139569],{"type":17,"tag":84,"props":139570,"children":139571},{},[139572],{"type":23,"value":139573},"Return the tool result back to Claude",{"type":17,"tag":29,"props":139575,"children":139576},{},[139577],{"type":23,"value":139578},"This architecture cleanly separates responsibilities:",{"type":17,"tag":80,"props":139580,"children":139581},{},[139582,139587,139591],{"type":17,"tag":84,"props":139583,"children":139584},{},[139585],{"type":23,"value":139586},"Claude → reasoning and tool selection",{"type":17,"tag":84,"props":139588,"children":139589},{},[139590],{"type":23,"value":137896},{"type":17,"tag":84,"props":139592,"children":139593},{},[139594],{"type":23,"value":139595},"Your app → UX, approvals, orchestration logic",{"type":17,"tag":68,"props":139597,"children":139598},{"id":137904},[139599],{"type":23,"value":137907},{"type":17,"tag":29,"props":139601,"children":139602},{},[139603],{"type":23,"value":139604},"When deploying Claude with MCP:",{"type":17,"tag":80,"props":139606,"children":139607},{},[139608,139612,139616,139621,139626],{"type":17,"tag":84,"props":139609,"children":139610},{},[139611],{"type":23,"value":137920},{"type":17,"tag":84,"props":139613,"children":139614},{},[139615],{"type":23,"value":137925},{"type":17,"tag":84,"props":139617,"children":139618},{},[139619],{"type":23,"value":139620},"Use regional MCP endpoints when required",{"type":17,"tag":84,"props":139622,"children":139623},{},[139624],{"type":23,"value":139625},"Monitor usage and token consumption",{"type":17,"tag":84,"props":139627,"children":139628},{},[139629],{"type":23,"value":139630},"Keep all API keys server-side",{"type":17,"tag":29,"props":139632,"children":139633},{},[139634],{"type":23,"value":137945},{"type":17,"tag":80,"props":139636,"children":139637},{},[139638,139642,139646,139650],{"type":17,"tag":84,"props":139639,"children":139640},{},[139641],{"type":23,"value":137953},{"type":17,"tag":84,"props":139643,"children":139644},{},[139645],{"type":23,"value":9909},{"type":17,"tag":84,"props":139647,"children":139648},{},[139649],{"type":23,"value":137962},{"type":17,"tag":84,"props":139651,"children":139652},{},[139653],{"type":23,"value":137967},{"type":17,"tag":68,"props":139655,"children":139656},{"id":137970},[139657],{"type":23,"value":137973},{"type":17,"tag":29,"props":139659,"children":139660},{},[139661],{"type":23,"value":139662},"Calling Claude is straightforward.",{"type":17,"tag":29,"props":139664,"children":139665},{},[139666],{"type":23,"value":137983},{"type":17,"tag":80,"props":139668,"children":139669},{},[139670,139674,139678,139683,139687],{"type":17,"tag":84,"props":139671,"children":139672},{},[139673],{"type":23,"value":15895},{"type":17,"tag":84,"props":139675,"children":139676},{},[139677],{"type":23,"value":138001},{"type":17,"tag":84,"props":139679,"children":139680},{},[139681],{"type":23,"value":139682},"SaaS data integrations",{"type":17,"tag":84,"props":139684,"children":139685},{},[139686],{"type":23,"value":137996},{"type":17,"tag":84,"props":139688,"children":139689},{},[139690],{"type":23,"value":139691},"Enterprise-grade controls",{"type":17,"tag":29,"props":139693,"children":139694},{},[139695],{"type":23,"value":138016},{"type":17,"tag":29,"props":139697,"children":139698},{},[139699],{"type":23,"value":138021},{"type":17,"tag":80,"props":139701,"children":139702},{},[139703,139707,139711,139715,139720],{"type":17,"tag":84,"props":139704,"children":139705},{},[139706],{"type":23,"value":4711},{"type":17,"tag":84,"props":139708,"children":139709},{},[139710],{"type":23,"value":138034},{"type":17,"tag":84,"props":139712,"children":139713},{},[139714],{"type":23,"value":43670},{"type":17,"tag":84,"props":139716,"children":139717},{},[139718],{"type":23,"value":139719},"MCP-compatible agent systems",{"type":17,"tag":84,"props":139721,"children":139722},{},[139723],{"type":23,"value":138048},{"type":17,"tag":29,"props":139725,"children":139726},{},[139727],{"type":23,"value":139728},"Claude generates intelligence.",{"type":17,"tag":29,"props":139730,"children":139731},{},[139732],{"type":23,"value":138058},{"type":17,"tag":29,"props":139734,"children":139735},{},[139736],{"type":23,"value":138063},{"type":17,"tag":29,"props":139738,"children":139739},{},[139740],{"type":17,"tag":133,"props":139741,"children":139743},{"href":1612,"rel":139742},[214],[139744],{"type":23,"value":44481},{"type":17,"tag":29,"props":139746,"children":139747},{},[139748],{"type":17,"tag":133,"props":139749,"children":139751},{"href":1623,"rel":139750},[214],[139752],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":139754},[139755,139756,139759,139760,139761,139762,139765,139766,139767,139768],{"id":138935,"depth":1629,"text":138938},{"id":138964,"depth":1629,"text":138967,"children":139757},[139758],{"id":137398,"depth":1635,"text":137401},{"id":139080,"depth":1629,"text":139083},{"id":139130,"depth":1629,"text":139133},{"id":139194,"depth":1629,"text":139197},{"id":139269,"depth":1629,"text":139272,"children":139763},[139764],{"id":137627,"depth":1635,"text":137630},{"id":139429,"depth":1629,"text":139432},{"id":139482,"depth":1629,"text":139485},{"id":137904,"depth":1629,"text":137907},{"id":137970,"depth":1629,"text":137973},"content:blog:how_to_get_a_claude_anthropic_api_key_and_connect_it_to_your_product.md","blog/how_to_get_a_claude_anthropic_api_key_and_connect_it_to_your_product.md","blog/how_to_get_a_claude_anthropic_api_key_and_connect_it_to_your_product",{"_path":139773,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":139774,"description":139775,"img":139776,"date":139777,"tag":12,"body":139778,"_type":1677,"_id":140638,"_source":1679,"_file":140639,"_stem":140640,"_extension":1682},"/blog/how_to_get_a_chatgpt_api_key_openai_and_connect_it_to_your_product","How to Get a ChatGPT API Key (OpenAI)  — and Connect It to Your Product","If you're building with ChatGPT (OpenAI's models like GPT-4.1), you'll need an OpenAI API key.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_a_chatgpt_api_key_openai_and_connect_it_to_your_product-icon.png","2026-02-20T20:26:00.000Z",{"type":14,"children":139779,"toc":140620},[139780,139785,139788,139795,139799,139810,139815,139851,139857,139861,139870,139875,139880,139884,139889,139897,139915,139919,139924,139928,139937,139943,139954,139958,139976,139980,139985,139990,139998,140003,140021,140026,140032,140037,140045,140050,140063,140068,140074,140085,140089,140098,140103,140109,140114,140119,140139,140143,140166,140175,140179,140183,140207,140212,140218,140225,140240,140247,140274,140281,140304,140308,140331,140336,140342,140347,140352,140380,140390,140396,140401,140405,140414,140419,140443,140448,140465,140469,140474,140502,140507,140526,140530,140535,140539,140558,140563,140567,140590,140595,140599,140604,140612],{"type":17,"tag":18,"props":139781,"children":139783},{"id":139782},"how-to-get-a-chatgpt-api-key-openai-and-connect-it-to-your-product",[139784],{"type":23,"value":139774},{"type":17,"tag":25,"props":139786,"children":139787},{},[],{"type":17,"tag":29,"props":139789,"children":139790},{},[139791],{"type":17,"tag":33,"props":139792,"children":139793},{},[139794],{"type":23,"value":136280},{"type":17,"tag":11616,"props":139796,"children":139798},{"width":11618,"height":11619,"src":139797,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/LMf7RZDNvZk",[],{"type":17,"tag":29,"props":139800,"children":139801},{},[139802,139804,139809],{"type":23,"value":139803},"If you're building with ChatGPT (OpenAI's models like GPT-4.1), you'll need an ",{"type":17,"tag":48,"props":139805,"children":139806},{},[139807],{"type":23,"value":139808},"OpenAI API key",{"type":23,"value":54},{"type":17,"tag":29,"props":139811,"children":139812},{},[139813],{"type":23,"value":139814},"This guide walks through:",{"type":17,"tag":6154,"props":139816,"children":139817},{},[139818,139823,139828,139832,139841],{"type":17,"tag":84,"props":139819,"children":139820},{},[139821],{"type":23,"value":139822},"Creating your OpenAI API key",{"type":17,"tag":84,"props":139824,"children":139825},{},[139826],{"type":23,"value":139827},"Setting up billing and usage limits",{"type":17,"tag":84,"props":139829,"children":139830},{},[139831],{"type":23,"value":137131},{"type":17,"tag":84,"props":139833,"children":139834},{},[139835,139837],{"type":23,"value":139836},"Using OpenAI through Unified's ",{"type":17,"tag":133,"props":139838,"children":139839},{"href":16186},[139840],{"type":23,"value":137141},{"type":17,"tag":84,"props":139842,"children":139843},{},[139844,139846,139850],{"type":23,"value":139845},"Connecting OpenAI to customer SaaS tools via [Unified ",{"type":17,"tag":133,"props":139847,"children":139848},{"href":326},[139849],{"type":23,"value":329},{"type":23,"value":137152},{"type":17,"tag":68,"props":139852,"children":139854},{"id":139853},"step-1-create-an-openai-account",[139855],{"type":23,"value":139856},"Step 1: Create an OpenAI Account",{"type":17,"tag":29,"props":139858,"children":139859},{},[139860],{"type":23,"value":137163},{"type":17,"tag":6893,"props":139862,"children":139865},{"className":139863,"code":139864,"language":20901,"meta":23},[20899],"https://platform.openai.com\n",[139866],{"type":17,"tag":6121,"props":139867,"children":139868},{"__ignoreMap":7},[139869],{"type":23,"value":139864},{"type":17,"tag":29,"props":139871,"children":139872},{},[139873],{"type":23,"value":139874},"Sign up or log in.",{"type":17,"tag":29,"props":139876,"children":139877},{},[139878],{"type":23,"value":139879},"You must create an organization before generating API keys.",{"type":17,"tag":68,"props":139881,"children":139882},{"id":138964},[139883],{"type":23,"value":138967},{"type":17,"tag":29,"props":139885,"children":139886},{},[139887],{"type":23,"value":139888},"In the left sidebar:",{"type":17,"tag":29,"props":139890,"children":139891},{},[139892],{"type":17,"tag":48,"props":139893,"children":139894},{},[139895],{"type":23,"value":139896},"API Keys → Create new secret key",{"type":17,"tag":29,"props":139898,"children":139899},{},[139900,139902,139907,139908,139914],{"type":23,"value":139901},"Name it clearly (e.g., ",{"type":17,"tag":6121,"props":139903,"children":139905},{"className":139904},[],[139906],{"type":23,"value":138303},{"type":23,"value":11826},{"type":17,"tag":6121,"props":139909,"children":139911},{"className":139910},[],[139912],{"type":23,"value":139913},"dev-testing",{"type":23,"value":129328},{"type":17,"tag":29,"props":139916,"children":139917},{},[139918],{"type":23,"value":139019},{"type":17,"tag":29,"props":139920,"children":139921},{},[139922],{"type":23,"value":139923},"Best practice: use environment variables.",{"type":17,"tag":239,"props":139925,"children":139926},{"id":137398},[139927],{"type":23,"value":137401},{"type":17,"tag":6893,"props":139929,"children":139932},{"className":139930,"code":139931,"language":48432,"meta":7},[48430],"export OPENAI_API_KEY=\"\u003Cyour_key>\"\n",[139933],{"type":17,"tag":6121,"props":139934,"children":139935},{"__ignoreMap":7},[139936],{"type":23,"value":139931},{"type":17,"tag":239,"props":139938,"children":139940},{"id":139939},"windows-powershell",[139941],{"type":23,"value":139942},"Windows (PowerShell)",{"type":17,"tag":6893,"props":139944,"children":139949},{"className":139945,"code":139947,"language":139948,"meta":7},[139946],"language-powershell","setx OPENAI_API_KEY \"\u003Cyour_key>\"\n","powershell",[139950],{"type":17,"tag":6121,"props":139951,"children":139952},{"__ignoreMap":7},[139953],{"type":23,"value":139947},{"type":17,"tag":29,"props":139955,"children":139956},{},[139957],{"type":23,"value":137415},{"type":17,"tag":80,"props":139959,"children":139960},{},[139961,139966,139971],{"type":17,"tag":84,"props":139962,"children":139963},{},[139964],{"type":23,"value":139965},"Commit API keys to Git",{"type":17,"tag":84,"props":139967,"children":139968},{},[139969],{"type":23,"value":139970},"Embed them in frontend code",{"type":17,"tag":84,"props":139972,"children":139973},{},[139974],{"type":23,"value":139975},"Share them in logs or screenshots",{"type":17,"tag":68,"props":139977,"children":139978},{"id":139080},[139979],{"type":23,"value":139083},{"type":17,"tag":29,"props":139981,"children":139982},{},[139983],{"type":23,"value":139984},"OpenAI's API uses usage-based pricing.",{"type":17,"tag":29,"props":139986,"children":139987},{},[139988],{"type":23,"value":139989},"In the dashboard:",{"type":17,"tag":29,"props":139991,"children":139992},{},[139993],{"type":17,"tag":48,"props":139994,"children":139995},{},[139996],{"type":23,"value":139997},"Settings → Billing",{"type":17,"tag":29,"props":139999,"children":140000},{},[140001],{"type":23,"value":140002},"Add a payment method and configure:",{"type":17,"tag":80,"props":140004,"children":140005},{},[140006,140011,140016],{"type":17,"tag":84,"props":140007,"children":140008},{},[140009],{"type":23,"value":140010},"Initial credits",{"type":17,"tag":84,"props":140012,"children":140013},{},[140014],{"type":23,"value":140015},"Auto-recharge (optional)",{"type":17,"tag":84,"props":140017,"children":140018},{},[140019],{"type":23,"value":140020},"Usage limits",{"type":17,"tag":29,"props":140022,"children":140023},{},[140024],{"type":23,"value":140025},"Without billing configured, your key may be inactive.",{"type":17,"tag":68,"props":140027,"children":140029},{"id":140028},"step-4-set-usage-limits",[140030],{"type":23,"value":140031},"Step 4: Set Usage Limits",{"type":17,"tag":29,"props":140033,"children":140034},{},[140035],{"type":23,"value":140036},"To avoid unexpected charges:",{"type":17,"tag":29,"props":140038,"children":140039},{},[140040],{"type":17,"tag":48,"props":140041,"children":140042},{},[140043],{"type":23,"value":140044},"Settings → Limits",{"type":17,"tag":29,"props":140046,"children":140047},{},[140048],{"type":23,"value":140049},"Configure:",{"type":17,"tag":80,"props":140051,"children":140052},{},[140053,140058],{"type":17,"tag":84,"props":140054,"children":140055},{},[140056],{"type":23,"value":140057},"Soft limit (email warning)",{"type":17,"tag":84,"props":140059,"children":140060},{},[140061],{"type":23,"value":140062},"Hard limit (automatic cut-off)",{"type":17,"tag":29,"props":140064,"children":140065},{},[140066],{"type":23,"value":140067},"This is critical for early-stage AI features where usage can spike unexpectedly.",{"type":17,"tag":68,"props":140069,"children":140071},{"id":140070},"step-5-test-your-api-key",[140072],{"type":23,"value":140073},"Step 5: Test Your API Key",{"type":17,"tag":29,"props":140075,"children":140076},{},[140077,140079,140084],{"type":23,"value":140078},"OpenAI's current standard endpoint is the ",{"type":17,"tag":48,"props":140080,"children":140081},{},[140082],{"type":23,"value":140083},"Responses API",{"type":23,"value":54},{"type":17,"tag":29,"props":140086,"children":140087},{},[140088],{"type":23,"value":19878},{"type":17,"tag":6893,"props":140090,"children":140093},{"className":140091,"code":140092,"language":48432,"meta":7},[48430],"curl https://api.openai.com/v1/responses \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer $OPENAI_API_KEY\" \\\n  -d '{\n    \"model\": \"gpt-4.1-mini\",\n    \"input\": \"Write a two sentence summary of what an API key is.\"\n  }'\n",[140094],{"type":17,"tag":6121,"props":140095,"children":140096},{"__ignoreMap":7},[140097],{"type":23,"value":140092},{"type":17,"tag":29,"props":140099,"children":140100},{},[140101],{"type":23,"value":140102},"If successful, you'll receive a JSON response containing the model output.",{"type":17,"tag":68,"props":140104,"children":140106},{"id":140105},"using-openai-in-a-multi-model-ai-architecture",[140107],{"type":23,"value":140108},"Using OpenAI in a Multi-Model AI Architecture",{"type":17,"tag":29,"props":140110,"children":140111},{},[140112],{"type":23,"value":140113},"Calling OpenAI directly works if you only plan to use one provider.",{"type":17,"tag":29,"props":140115,"children":140116},{},[140117],{"type":23,"value":140118},"Most AI-native SaaS teams eventually need:",{"type":17,"tag":80,"props":140120,"children":140121},{},[140122,140127,140131,140135],{"type":17,"tag":84,"props":140123,"children":140124},{},[140125],{"type":23,"value":140126},"Fallback between providers",{"type":17,"tag":84,"props":140128,"children":140129},{},[140130],{"type":23,"value":137536},{"type":17,"tag":84,"props":140132,"children":140133},{},[140134],{"type":23,"value":137531},{"type":17,"tag":84,"props":140136,"children":140137},{},[140138],{"type":23,"value":137541},{"type":17,"tag":29,"props":140140,"children":140141},{},[140142],{"type":23,"value":139234},{"type":17,"tag":80,"props":140144,"children":140145},{},[140146,140150,140154,140158,140162],{"type":17,"tag":84,"props":140147,"children":140148},{},[140149],{"type":23,"value":16104},{"type":17,"tag":84,"props":140151,"children":140152},{},[140153],{"type":23,"value":137567},{"type":17,"tag":84,"props":140155,"children":140156},{},[140157],{"type":23,"value":137562},{"type":17,"tag":84,"props":140159,"children":140160},{},[140161],{"type":23,"value":16648},{"type":17,"tag":84,"props":140163,"children":140164},{},[140165],{"type":23,"value":16525},{"type":17,"tag":29,"props":140167,"children":140168},{},[140169,140170,140174],{"type":23,"value":137576},{"type":17,"tag":48,"props":140171,"children":140172},{},[140173],{"type":23,"value":137141},{"type":23,"value":54},{"type":17,"tag":68,"props":140176,"children":140177},{"id":138571},[140178],{"type":23,"value":138574},{"type":17,"tag":29,"props":140180,"children":140181},{},[140182],{"type":23,"value":137592},{"type":17,"tag":80,"props":140184,"children":140185},{},[140186,140193,140200],{"type":17,"tag":84,"props":140187,"children":140188},{},[140189],{"type":17,"tag":48,"props":140190,"children":140191},{},[140192],{"type":23,"value":137603},{"type":17,"tag":84,"props":140194,"children":140195},{},[140196],{"type":17,"tag":48,"props":140197,"children":140198},{},[140199],{"type":23,"value":137611},{"type":17,"tag":84,"props":140201,"children":140202},{},[140203],{"type":17,"tag":48,"props":140204,"children":140205},{},[140206],{"type":23,"value":137619},{"type":17,"tag":29,"props":140208,"children":140209},{},[140210],{"type":23,"value":140211},"Across supported providers — including OpenAI.",{"type":17,"tag":239,"props":140213,"children":140215},{"id":140214},"core-standardized-objects",[140216],{"type":23,"value":140217},"Core standardized objects",{"type":17,"tag":29,"props":140219,"children":140220},{},[140221],{"type":17,"tag":48,"props":140222,"children":140223},{},[140224],{"type":23,"value":16997},{"type":17,"tag":80,"props":140226,"children":140227},{},[140228,140232,140236],{"type":17,"tag":84,"props":140229,"children":140230},{},[140231],{"type":23,"value":18766},{"type":17,"tag":84,"props":140233,"children":140234},{},[140235],{"type":23,"value":74702},{"type":17,"tag":84,"props":140237,"children":140238},{},[140239],{"type":23,"value":137653},{"type":17,"tag":29,"props":140241,"children":140242},{},[140243],{"type":17,"tag":48,"props":140244,"children":140245},{},[140246],{"type":23,"value":17010},{"type":17,"tag":80,"props":140248,"children":140249},{},[140250,140254,140258,140262,140266,140270],{"type":17,"tag":84,"props":140251,"children":140252},{},[140253],{"type":23,"value":74684},{"type":17,"tag":84,"props":140255,"children":140256},{},[140257],{"type":23,"value":137672},{"type":17,"tag":84,"props":140259,"children":140260},{},[140261],{"type":23,"value":74693},{"type":17,"tag":84,"props":140263,"children":140264},{},[140265],{"type":23,"value":74702},{"type":17,"tag":84,"props":140267,"children":140268},{},[140269],{"type":23,"value":137685},{"type":17,"tag":84,"props":140271,"children":140272},{},[140273],{"type":23,"value":137690},{"type":17,"tag":29,"props":140275,"children":140276},{},[140277],{"type":17,"tag":48,"props":140278,"children":140279},{},[140280],{"type":23,"value":17023},{"type":17,"tag":80,"props":140282,"children":140283},{},[140284,140288,140292,140296,140300],{"type":17,"tag":84,"props":140285,"children":140286},{},[140287],{"type":23,"value":74684},{"type":17,"tag":84,"props":140289,"children":140290},{},[140291],{"type":23,"value":1679},{"type":17,"tag":84,"props":140293,"children":140294},{},[140295],{"type":23,"value":137713},{"type":17,"tag":84,"props":140297,"children":140298},{},[140299],{"type":23,"value":16213},{"type":17,"tag":84,"props":140301,"children":140302},{},[140303],{"type":23,"value":137690},{"type":17,"tag":29,"props":140305,"children":140306},{},[140307],{"type":23,"value":22801},{"type":17,"tag":80,"props":140309,"children":140310},{},[140311,140316,140321,140326],{"type":17,"tag":84,"props":140312,"children":140313},{},[140314],{"type":23,"value":140315},"Route requests between OpenAI and other providers",{"type":17,"tag":84,"props":140317,"children":140318},{},[140319],{"type":23,"value":140320},"Run the same prompt across models and compare output",{"type":17,"tag":84,"props":140322,"children":140323},{},[140324],{"type":23,"value":140325},"Generate embeddings consistently",{"type":17,"tag":84,"props":140327,"children":140328},{},[140329],{"type":23,"value":140330},"Keep your product logic stable",{"type":17,"tag":29,"props":140332,"children":140333},{},[140334],{"type":23,"value":140335},"You write your GenAI integration once.",{"type":17,"tag":68,"props":140337,"children":140339},{"id":140338},"let-gpt-take-action-with-unified-mcp",[140340],{"type":23,"value":140341},"Let GPT Take Action with Unified MCP",{"type":17,"tag":29,"props":140343,"children":140344},{},[140345],{"type":23,"value":140346},"Text generation is only half the system.",{"type":17,"tag":29,"props":140348,"children":140349},{},[140350],{"type":23,"value":140351},"Production AI features require structured, authorized reads and writes against customer SaaS platforms:",{"type":17,"tag":80,"props":140353,"children":140354},{},[140355,140360,140365,140370,140375],{"type":17,"tag":84,"props":140356,"children":140357},{},[140358],{"type":23,"value":140359},"List CRM deals",{"type":17,"tag":84,"props":140361,"children":140362},{},[140363],{"type":23,"value":140364},"Retrieve ATS candidates",{"type":17,"tag":84,"props":140366,"children":140367},{},[140368],{"type":23,"value":140369},"Fetch files",{"type":17,"tag":84,"props":140371,"children":140372},{},[140373],{"type":23,"value":140374},"Update records",{"type":17,"tag":84,"props":140376,"children":140377},{},[140378],{"type":23,"value":140379},"Write notes",{"type":17,"tag":29,"props":140381,"children":140382},{},[140383,140384,140388],{"type":23,"value":25244},{"type":17,"tag":48,"props":140385,"children":140386},{},[140387],{"type":23,"value":1067},{"type":23,"value":140389}," connects OpenAI models to customer integrations in a controlled, authorized way.",{"type":17,"tag":68,"props":140391,"children":140393},{"id":140392},"openai-unified-mcp-remote-mcp-example",[140394],{"type":23,"value":140395},"OpenAI + Unified MCP (Remote MCP Example)",{"type":17,"tag":29,"props":140397,"children":140398},{},[140399],{"type":23,"value":140400},"OpenAI supports remote MCP servers through the Responses API.",{"type":17,"tag":29,"props":140402,"children":140403},{},[140404],{"type":23,"value":19878},{"type":17,"tag":6893,"props":140406,"children":140409},{"className":140407,"code":140408,"language":127595,"meta":7},[127593],"resp = client.responses.create(\n    model=\"gpt-4.1\",\n    tools=[{\n        \"type\": \"mcp\",\n        \"server_label\": \"unifiedMCP\",\n        \"server_url\": \"https://mcp-api.unified.to/mcp?token=TOKEN&connection=CONNECTION\",\n        \"require_approval\": \"never\"\n    }],\n    input=\"List candidates and summarize their resumes.\"\n)\n",[140410],{"type":17,"tag":6121,"props":140411,"children":140412},{"__ignoreMap":7},[140413],{"type":23,"value":140408},{"type":17,"tag":29,"props":140415,"children":140416},{},[140417],{"type":23,"value":140418},"When the model requests a tool:",{"type":17,"tag":6154,"props":140420,"children":140421},{},[140422,140433,140438],{"type":17,"tag":84,"props":140423,"children":140424},{},[140425,140427],{"type":23,"value":140426},"Call Unified's ",{"type":17,"tag":6121,"props":140428,"children":140430},{"className":140429},[],[140431],{"type":23,"value":140432},"/tools/{id}/call",{"type":17,"tag":84,"props":140434,"children":140435},{},[140436],{"type":23,"value":140437},"Return the result to OpenAI",{"type":17,"tag":84,"props":140439,"children":140440},{},[140441],{"type":23,"value":140442},"Continue the response",{"type":17,"tag":29,"props":140444,"children":140445},{},[140446],{"type":23,"value":140447},"This architecture separates responsibilities:",{"type":17,"tag":80,"props":140449,"children":140450},{},[140451,140456,140460],{"type":17,"tag":84,"props":140452,"children":140453},{},[140454],{"type":23,"value":140455},"OpenAI → reasoning",{"type":17,"tag":84,"props":140457,"children":140458},{},[140459],{"type":23,"value":137896},{"type":17,"tag":84,"props":140461,"children":140462},{},[140463],{"type":23,"value":140464},"Your app → product logic and UX",{"type":17,"tag":68,"props":140466,"children":140467},{"id":137904},[140468],{"type":23,"value":137907},{"type":17,"tag":29,"props":140470,"children":140471},{},[140472],{"type":23,"value":140473},"When deploying OpenAI with MCP:",{"type":17,"tag":80,"props":140475,"children":140476},{},[140477,140482,140487,140492,140497],{"type":17,"tag":84,"props":140478,"children":140479},{},[140480],{"type":23,"value":140481},"Scope tools to avoid model overload",{"type":17,"tag":84,"props":140483,"children":140484},{},[140485],{"type":23,"value":140486},"Restrict permissions per connection",{"type":17,"tag":84,"props":140488,"children":140489},{},[140490],{"type":23,"value":140491},"Use regional MCP endpoints (US/EU/AU)",{"type":17,"tag":84,"props":140493,"children":140494},{},[140495],{"type":23,"value":140496},"Monitor usage and API volume",{"type":17,"tag":84,"props":140498,"children":140499},{},[140500],{"type":23,"value":140501},"Keep tokens server-side only",{"type":17,"tag":29,"props":140503,"children":140504},{},[140505],{"type":23,"value":140506},"Unified's architecture is:",{"type":17,"tag":80,"props":140508,"children":140509},{},[140510,140514,140518,140522],{"type":17,"tag":84,"props":140511,"children":140512},{},[140513],{"type":23,"value":137953},{"type":17,"tag":84,"props":140515,"children":140516},{},[140517],{"type":23,"value":9909},{"type":17,"tag":84,"props":140519,"children":140520},{},[140521],{"type":23,"value":137962},{"type":17,"tag":84,"props":140523,"children":140524},{},[140525],{"type":23,"value":100392},{"type":17,"tag":68,"props":140527,"children":140528},{"id":137970},[140529],{"type":23,"value":137973},{"type":17,"tag":29,"props":140531,"children":140532},{},[140533],{"type":23,"value":140534},"Calling GPT-4.1 is simple.",{"type":17,"tag":29,"props":140536,"children":140537},{},[140538],{"type":23,"value":137983},{"type":17,"tag":80,"props":140540,"children":140541},{},[140542,140546,140550,140554],{"type":17,"tag":84,"props":140543,"children":140544},{},[140545],{"type":23,"value":15895},{"type":17,"tag":84,"props":140547,"children":140548},{},[140549],{"type":23,"value":138001},{"type":17,"tag":84,"props":140551,"children":140552},{},[140553],{"type":23,"value":137996},{"type":17,"tag":84,"props":140555,"children":140556},{},[140557],{"type":23,"value":138765},{"type":17,"tag":29,"props":140559,"children":140560},{},[140561],{"type":23,"value":140562},"…requires infrastructure.",{"type":17,"tag":29,"props":140564,"children":140565},{},[140566],{"type":23,"value":138021},{"type":17,"tag":80,"props":140568,"children":140569},{},[140570,140574,140578,140582,140586],{"type":17,"tag":84,"props":140571,"children":140572},{},[140573],{"type":23,"value":138029},{"type":17,"tag":84,"props":140575,"children":140576},{},[140577],{"type":23,"value":138034},{"type":17,"tag":84,"props":140579,"children":140580},{},[140581],{"type":23,"value":43670},{"type":17,"tag":84,"props":140583,"children":140584},{},[140585],{"type":23,"value":138043},{"type":17,"tag":84,"props":140587,"children":140588},{},[140589],{"type":23,"value":138048},{"type":17,"tag":29,"props":140591,"children":140592},{},[140593],{"type":23,"value":140594},"OpenAI generates intelligence.",{"type":17,"tag":29,"props":140596,"children":140597},{},[140598],{"type":23,"value":138058},{"type":17,"tag":29,"props":140600,"children":140601},{},[140602],{"type":23,"value":140603},"That's how AI features move from demo to production.",{"type":17,"tag":29,"props":140605,"children":140606},{},[140607],{"type":17,"tag":133,"props":140608,"children":140610},{"href":1612,"rel":140609},[214],[140611],{"type":23,"value":44481},{"type":17,"tag":29,"props":140613,"children":140614},{},[140615],{"type":17,"tag":133,"props":140616,"children":140618},{"href":1623,"rel":140617},[214],[140619],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":140621},[140622,140623,140627,140628,140629,140630,140631,140634,140635,140636,140637],{"id":139853,"depth":1629,"text":139856},{"id":138964,"depth":1629,"text":138967,"children":140624},[140625,140626],{"id":137398,"depth":1635,"text":137401},{"id":139939,"depth":1635,"text":139942},{"id":139080,"depth":1629,"text":139083},{"id":140028,"depth":1629,"text":140031},{"id":140070,"depth":1629,"text":140073},{"id":140105,"depth":1629,"text":140108},{"id":138571,"depth":1629,"text":138574,"children":140632},[140633],{"id":140214,"depth":1635,"text":140217},{"id":140338,"depth":1629,"text":140341},{"id":140392,"depth":1629,"text":140395},{"id":137904,"depth":1629,"text":137907},{"id":137970,"depth":1629,"text":137973},"content:blog:how_to_get_a_chatgpt_api_key_openai_and_connect_it_to_your_product.md","blog/how_to_get_a_chatgpt_api_key_openai_and_connect_it_to_your_product.md","blog/how_to_get_a_chatgpt_api_key_openai_and_connect_it_to_your_product",{"_path":140642,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":140643,"description":140644,"img":140645,"date":140646,"tag":12,"body":140647,"_type":1677,"_id":141717,"_source":1679,"_file":141718,"_stem":141719,"_extension":1682},"/blog/how_to_get_a_gemini_api_key_and_connect_it_to_your_product","How to Get a Gemini API Key  — and Connect It to Your Product","Gemini is Google's large language model family available via Google AI Studio and Google Cloud (Vertex AI).","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_a_gemini_api_key_and_connect_it_to_your_product-icon.png","2026-02-20T20:17:00.000Z",{"type":14,"children":140648,"toc":141697},[140649,140654,140657,140664,140668,140673,140696,140701,140705,140741,140747,140751,140760,140765,140770,140788,140793,140798,140804,140809,140817,140822,140827,140840,140845,140851,140855,140863,140867,140880,140885,140894,140898,140904,140909,140915,140924,140929,140938,140943,140967,140971,140987,140992,140998,141003,141012,141017,141023,141028,141051,141056,141079,141085,141090,141095,141117,141121,141144,141154,141160,141164,141188,141193,141198,141205,141224,141231,141258,141265,141288,141292,141315,141320,141325,141331,141336,141341,141345,141371,141381,141387,141400,141404,141412,141421,141434,141443,141450,141458,141466,141471,141489,141495,141500,141539,141544,141550,141555,141586,141591,141595,141600,141605,141631,141636,141641,141666,141671,141676,141681,141689],{"type":17,"tag":18,"props":140650,"children":140652},{"id":140651},"how-to-get-a-gemini-api-key-and-connect-it-to-your-product",[140653],{"type":23,"value":140643},{"type":17,"tag":25,"props":140655,"children":140656},{},[],{"type":17,"tag":29,"props":140658,"children":140659},{},[140660],{"type":17,"tag":33,"props":140661,"children":140662},{},[140663],{"type":23,"value":136280},{"type":17,"tag":29,"props":140665,"children":140666},{},[140667],{"type":23,"value":140644},{"type":17,"tag":29,"props":140669,"children":140670},{},[140671],{"type":23,"value":140672},"If you want to use Gemini inside:",{"type":17,"tag":80,"props":140674,"children":140675},{},[140676,140681,140686,140691],{"type":17,"tag":84,"props":140677,"children":140678},{},[140679],{"type":23,"value":140680},"a SaaS product",{"type":17,"tag":84,"props":140682,"children":140683},{},[140684],{"type":23,"value":140685},"an internal AI tool",{"type":17,"tag":84,"props":140687,"children":140688},{},[140689],{"type":23,"value":140690},"an AI agent with tool-calling",{"type":17,"tag":84,"props":140692,"children":140693},{},[140694],{"type":23,"value":140695},"or a multi-model GenAI system",{"type":17,"tag":29,"props":140697,"children":140698},{},[140699],{"type":23,"value":140700},"…you'll need a Gemini API key.",{"type":17,"tag":29,"props":140702,"children":140703},{},[140704],{"type":23,"value":139814},{"type":17,"tag":6154,"props":140706,"children":140707},{},[140708,140713,140718,140722,140731],{"type":17,"tag":84,"props":140709,"children":140710},{},[140711],{"type":23,"value":140712},"Creating a Gemini API key in Google AI Studio",{"type":17,"tag":84,"props":140714,"children":140715},{},[140716],{"type":23,"value":140717},"Configuring environment variables securely",{"type":17,"tag":84,"props":140719,"children":140720},{},[140721],{"type":23,"value":138913},{"type":17,"tag":84,"props":140723,"children":140724},{},[140725,140727],{"type":23,"value":140726},"Connecting Gemini to Unified's ",{"type":17,"tag":133,"props":140728,"children":140729},{"href":16186},[140730],{"type":23,"value":137141},{"type":17,"tag":84,"props":140732,"children":140733},{},[140734,140736,140740],{"type":23,"value":140735},"Enabling Gemini tool-calling via [Unified ",{"type":17,"tag":133,"props":140737,"children":140738},{"href":326},[140739],{"type":23,"value":329},{"type":23,"value":137152},{"type":17,"tag":68,"props":140742,"children":140744},{"id":140743},"step-1-access-google-ai-studio",[140745],{"type":23,"value":140746},"Step 1: Access Google AI Studio",{"type":17,"tag":29,"props":140748,"children":140749},{},[140750],{"type":23,"value":137163},{"type":17,"tag":6893,"props":140752,"children":140755},{"className":140753,"code":140754,"language":20901,"meta":23},[20899],"https://aistudio.google.com\n",[140756],{"type":17,"tag":6121,"props":140757,"children":140758},{"__ignoreMap":7},[140759],{"type":23,"value":140754},{"type":17,"tag":29,"props":140761,"children":140762},{},[140763],{"type":23,"value":140764},"Sign in with your Google account.",{"type":17,"tag":29,"props":140766,"children":140767},{},[140768],{"type":23,"value":140769},"On first access, you'll need to:",{"type":17,"tag":80,"props":140771,"children":140772},{},[140773,140778,140783],{"type":17,"tag":84,"props":140774,"children":140775},{},[140776],{"type":23,"value":140777},"Accept the Generative AI terms",{"type":17,"tag":84,"props":140779,"children":140780},{},[140781],{"type":23,"value":140782},"Confirm region availability",{"type":17,"tag":84,"props":140784,"children":140785},{},[140786],{"type":23,"value":140787},"Review data usage policies",{"type":17,"tag":29,"props":140789,"children":140790},{},[140791],{"type":23,"value":140792},"For development, AI Studio is the fastest path.",{"type":17,"tag":29,"props":140794,"children":140795},{},[140796],{"type":23,"value":140797},"For enterprise production, you may later migrate to Google Cloud Vertex AI.",{"type":17,"tag":68,"props":140799,"children":140801},{"id":140800},"step-2-navigate-to-get-api-key",[140802],{"type":23,"value":140803},"Step 2: Navigate to 'Get API Key'",{"type":17,"tag":29,"props":140805,"children":140806},{},[140807],{"type":23,"value":140808},"In the left sidebar, click:",{"type":17,"tag":29,"props":140810,"children":140811},{},[140812],{"type":17,"tag":48,"props":140813,"children":140814},{},[140815],{"type":23,"value":140816},"Get API key",{"type":17,"tag":29,"props":140818,"children":140819},{},[140820],{"type":23,"value":140821},"This opens the API key management page.",{"type":17,"tag":29,"props":140823,"children":140824},{},[140825],{"type":23,"value":140826},"If you're new:",{"type":17,"tag":80,"props":140828,"children":140829},{},[140830,140835],{"type":17,"tag":84,"props":140831,"children":140832},{},[140833],{"type":23,"value":140834},"Google may auto-create a default Google Cloud project",{"type":17,"tag":84,"props":140836,"children":140837},{},[140838],{"type":23,"value":140839},"Or you can import or create a project manually",{"type":17,"tag":29,"props":140841,"children":140842},{},[140843],{"type":23,"value":140844},"Each Gemini API key is tied to a Google Cloud project.",{"type":17,"tag":68,"props":140846,"children":140848},{"id":140847},"step-3-create-your-api-key",[140849],{"type":23,"value":140850},"Step 3: Create Your API Key",{"type":17,"tag":29,"props":140852,"children":140853},{},[140854],{"type":23,"value":137289},{"type":17,"tag":29,"props":140856,"children":140857},{},[140858],{"type":17,"tag":48,"props":140859,"children":140860},{},[140861],{"type":23,"value":140862},"Create API key",{"type":17,"tag":29,"props":140864,"children":140865},{},[140866],{"type":23,"value":138289},{"type":17,"tag":80,"props":140868,"children":140869},{},[140870,140875],{"type":17,"tag":84,"props":140871,"children":140872},{},[140873],{"type":23,"value":140874},"Create in a new project",{"type":17,"tag":84,"props":140876,"children":140877},{},[140878],{"type":23,"value":140879},"Or select an existing project",{"type":17,"tag":29,"props":140881,"children":140882},{},[140883],{"type":23,"value":140884},"Once created, the key will look like:",{"type":17,"tag":6893,"props":140886,"children":140889},{"className":140887,"code":140888,"language":20901,"meta":23},[20899],"AIza...\n",[140890],{"type":17,"tag":6121,"props":140891,"children":140892},{"__ignoreMap":7},[140893],{"type":23,"value":140888},{"type":17,"tag":29,"props":140895,"children":140896},{},[140897],{"type":23,"value":137238},{"type":17,"tag":68,"props":140899,"children":140901},{"id":140900},"step-4-store-the-key-securely",[140902],{"type":23,"value":140903},"Step 4: Store the Key Securely",{"type":17,"tag":29,"props":140905,"children":140906},{},[140907],{"type":23,"value":140908},"Best practice: set it as an environment variable.",{"type":17,"tag":239,"props":140910,"children":140912},{"id":140911},"macos-linux-bash",[140913],{"type":23,"value":140914},"macOS / Linux (bash)",{"type":17,"tag":6893,"props":140916,"children":140919},{"className":140917,"code":140918,"language":48432,"meta":7},[48430],"export GEMINI_API_KEY=\u003CYOUR_KEY>\n",[140920],{"type":17,"tag":6121,"props":140921,"children":140922},{"__ignoreMap":7},[140923],{"type":23,"value":140918},{"type":17,"tag":29,"props":140925,"children":140926},{},[140927],{"type":23,"value":140928},"Then:",{"type":17,"tag":6893,"props":140930,"children":140933},{"className":140931,"code":140932,"language":48432,"meta":7},[48430],"source ~/.bashrc\n",[140934],{"type":17,"tag":6121,"props":140935,"children":140936},{"__ignoreMap":7},[140937],{"type":23,"value":140932},{"type":17,"tag":29,"props":140939,"children":140940},{},[140941],{"type":23,"value":140942},"Gemini SDKs automatically detect:",{"type":17,"tag":80,"props":140944,"children":140945},{},[140946,140955],{"type":17,"tag":84,"props":140947,"children":140948},{},[140949],{"type":17,"tag":6121,"props":140950,"children":140952},{"className":140951},[],[140953],{"type":23,"value":140954},"GEMINI_API_KEY",{"type":17,"tag":84,"props":140956,"children":140957},{},[140958,140959,140965],{"type":23,"value":33669},{"type":17,"tag":6121,"props":140960,"children":140962},{"className":140961},[],[140963],{"type":23,"value":140964},"GOOGLE_API_KEY",{"type":23,"value":140966}," (takes precedence if both are set)",{"type":17,"tag":29,"props":140968,"children":140969},{},[140970],{"type":23,"value":137415},{"type":17,"tag":80,"props":140972,"children":140973},{},[140974,140978,140982],{"type":17,"tag":84,"props":140975,"children":140976},{},[140977],{"type":23,"value":137423},{"type":17,"tag":84,"props":140979,"children":140980},{},[140981],{"type":23,"value":139970},{"type":17,"tag":84,"props":140983,"children":140984},{},[140985],{"type":23,"value":140986},"Share them in screenshots",{"type":17,"tag":29,"props":140988,"children":140989},{},[140990],{"type":23,"value":140991},"For production, use a secret manager.",{"type":17,"tag":68,"props":140993,"children":140995},{"id":140994},"step-5-test-your-gemini-api-key",[140996],{"type":23,"value":140997},"Step 5: Test Your Gemini API Key",{"type":17,"tag":29,"props":140999,"children":141000},{},[141001],{"type":23,"value":141002},"Example using REST:",{"type":17,"tag":6893,"props":141004,"children":141007},{"className":141005,"code":141006,"language":48432,"meta":7},[48430],"curl \"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=$GEMINI_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -X POST \\\n  -d '{\n    \"contents\": [{\n      \"parts\": [{\n        \"text\": \"Explain how AI works in a few words\"\n      }]\n    }]\n  }'\n",[141008],{"type":17,"tag":6121,"props":141009,"children":141010},{"__ignoreMap":7},[141011],{"type":23,"value":141006},{"type":17,"tag":29,"props":141013,"children":141014},{},[141015],{"type":23,"value":141016},"If successful, you'll receive a generated response from Gemini.",{"type":17,"tag":68,"props":141018,"children":141020},{"id":141019},"understanding-gemini-pricing-and-limits",[141021],{"type":23,"value":141022},"Understanding Gemini Pricing and Limits",{"type":17,"tag":29,"props":141024,"children":141025},{},[141026],{"type":23,"value":141027},"Gemini offers a free tier with rate limits. Limits vary by:",{"type":17,"tag":80,"props":141029,"children":141030},{},[141031,141036,141041,141046],{"type":17,"tag":84,"props":141032,"children":141033},{},[141034],{"type":23,"value":141035},"Model (e.g., Flash vs Pro)",{"type":17,"tag":84,"props":141037,"children":141038},{},[141039],{"type":23,"value":141040},"Requests per minute",{"type":17,"tag":84,"props":141042,"children":141043},{},[141044],{"type":23,"value":141045},"Tokens per minute",{"type":17,"tag":84,"props":141047,"children":141048},{},[141049],{"type":23,"value":141050},"Requests per day",{"type":17,"tag":29,"props":141052,"children":141053},{},[141054],{"type":23,"value":141055},"For production systems:",{"type":17,"tag":80,"props":141057,"children":141058},{},[141059,141064,141069,141074],{"type":17,"tag":84,"props":141060,"children":141061},{},[141062],{"type":23,"value":141063},"Monitor usage in Google AI Studio",{"type":17,"tag":84,"props":141065,"children":141066},{},[141067],{"type":23,"value":141068},"Set quota alerts",{"type":17,"tag":84,"props":141070,"children":141071},{},[141072],{"type":23,"value":141073},"Implement retry/backoff logic",{"type":17,"tag":84,"props":141075,"children":141076},{},[141077],{"type":23,"value":141078},"Avoid sending excessive prompt context",{"type":17,"tag":68,"props":141080,"children":141082},{"id":141081},"using-gemini-in-a-multi-model-ai-architecture",[141083],{"type":23,"value":141084},"Using Gemini in a Multi-Model AI Architecture",{"type":17,"tag":29,"props":141086,"children":141087},{},[141088],{"type":23,"value":141089},"Most AI-native SaaS teams do not rely on a single provider long-term.",{"type":17,"tag":29,"props":141091,"children":141092},{},[141093],{"type":23,"value":141094},"Common reasons:",{"type":17,"tag":80,"props":141096,"children":141097},{},[141098,141102,141107,141112],{"type":17,"tag":84,"props":141099,"children":141100},{},[141101],{"type":23,"value":16288},{"type":17,"tag":84,"props":141103,"children":141104},{},[141105],{"type":23,"value":141106},"Fallback if one provider degrades",{"type":17,"tag":84,"props":141108,"children":141109},{},[141110],{"type":23,"value":141111},"Model specialization",{"type":17,"tag":84,"props":141113,"children":141114},{},[141115],{"type":23,"value":141116},"Enterprise procurement requirements",{"type":17,"tag":29,"props":141118,"children":141119},{},[141120],{"type":23,"value":137546},{"type":17,"tag":80,"props":141122,"children":141123},{},[141124,141128,141132,141136,141140],{"type":17,"tag":84,"props":141125,"children":141126},{},[141127],{"type":23,"value":137567},{"type":17,"tag":84,"props":141129,"children":141130},{},[141131],{"type":23,"value":16104},{"type":17,"tag":84,"props":141133,"children":141134},{},[141135],{"type":23,"value":137562},{"type":17,"tag":84,"props":141137,"children":141138},{},[141139],{"type":23,"value":16648},{"type":17,"tag":84,"props":141141,"children":141142},{},[141143],{"type":23,"value":16525},{"type":17,"tag":29,"props":141145,"children":141146},{},[141147,141149,141153],{"type":23,"value":141148},"…you can integrate once against Unified's ",{"type":17,"tag":48,"props":141150,"children":141151},{},[141152],{"type":23,"value":137141},{"type":23,"value":54},{"type":17,"tag":68,"props":141155,"children":141157},{"id":141156},"build-once-across-gemini-and-other-llm-providers",[141158],{"type":23,"value":141159},"Build Once Across Gemini and Other LLM Providers",{"type":17,"tag":29,"props":141161,"children":141162},{},[141163],{"type":23,"value":137592},{"type":17,"tag":80,"props":141165,"children":141166},{},[141167,141174,141181],{"type":17,"tag":84,"props":141168,"children":141169},{},[141170],{"type":17,"tag":48,"props":141171,"children":141172},{},[141173],{"type":23,"value":137603},{"type":17,"tag":84,"props":141175,"children":141176},{},[141177],{"type":17,"tag":48,"props":141178,"children":141179},{},[141180],{"type":23,"value":137611},{"type":17,"tag":84,"props":141182,"children":141183},{},[141184],{"type":17,"tag":48,"props":141185,"children":141186},{},[141187],{"type":23,"value":137619},{"type":17,"tag":29,"props":141189,"children":141190},{},[141191],{"type":23,"value":141192},"Across supported LLM providers, including Gemini.",{"type":17,"tag":239,"props":141194,"children":141196},{"id":141195},"core-objects",[141197],{"type":23,"value":20702},{"type":17,"tag":29,"props":141199,"children":141200},{},[141201],{"type":17,"tag":48,"props":141202,"children":141203},{},[141204],{"type":23,"value":16997},{"type":17,"tag":80,"props":141206,"children":141207},{},[141208,141212,141216,141220],{"type":17,"tag":84,"props":141209,"children":141210},{},[141211],{"type":23,"value":18766},{"type":17,"tag":84,"props":141213,"children":141214},{},[141215],{"type":23,"value":18781},{"type":17,"tag":84,"props":141217,"children":141218},{},[141219],{"type":23,"value":74702},{"type":17,"tag":84,"props":141221,"children":141222},{},[141223],{"type":23,"value":137653},{"type":17,"tag":29,"props":141225,"children":141226},{},[141227],{"type":17,"tag":48,"props":141228,"children":141229},{},[141230],{"type":23,"value":17010},{"type":17,"tag":80,"props":141232,"children":141233},{},[141234,141238,141242,141246,141250,141254],{"type":17,"tag":84,"props":141235,"children":141236},{},[141237],{"type":23,"value":74684},{"type":17,"tag":84,"props":141239,"children":141240},{},[141241],{"type":23,"value":137672},{"type":17,"tag":84,"props":141243,"children":141244},{},[141245],{"type":23,"value":74693},{"type":17,"tag":84,"props":141247,"children":141248},{},[141249],{"type":23,"value":74702},{"type":17,"tag":84,"props":141251,"children":141252},{},[141253],{"type":23,"value":137685},{"type":17,"tag":84,"props":141255,"children":141256},{},[141257],{"type":23,"value":137690},{"type":17,"tag":29,"props":141259,"children":141260},{},[141261],{"type":17,"tag":48,"props":141262,"children":141263},{},[141264],{"type":23,"value":17023},{"type":17,"tag":80,"props":141266,"children":141267},{},[141268,141272,141276,141280,141284],{"type":17,"tag":84,"props":141269,"children":141270},{},[141271],{"type":23,"value":74684},{"type":17,"tag":84,"props":141273,"children":141274},{},[141275],{"type":23,"value":1679},{"type":17,"tag":84,"props":141277,"children":141278},{},[141279],{"type":23,"value":137713},{"type":17,"tag":84,"props":141281,"children":141282},{},[141283],{"type":23,"value":16213},{"type":17,"tag":84,"props":141285,"children":141286},{},[141287],{"type":23,"value":137690},{"type":17,"tag":29,"props":141289,"children":141290},{},[141291],{"type":23,"value":22801},{"type":17,"tag":80,"props":141293,"children":141294},{},[141295,141300,141305,141310],{"type":17,"tag":84,"props":141296,"children":141297},{},[141298],{"type":23,"value":141299},"Switch between Gemini and other providers without rewriting integration code",{"type":17,"tag":84,"props":141301,"children":141302},{},[141303],{"type":23,"value":141304},"Run the same prompt across providers and compare outputs",{"type":17,"tag":84,"props":141306,"children":141307},{},[141308],{"type":23,"value":141309},"Route requests dynamically based on cost or availability",{"type":17,"tag":84,"props":141311,"children":141312},{},[141313],{"type":23,"value":141314},"Generate embeddings consistently across providers",{"type":17,"tag":29,"props":141316,"children":141317},{},[141318],{"type":23,"value":141319},"Your product logic stays stable.",{"type":17,"tag":29,"props":141321,"children":141322},{},[141323],{"type":23,"value":141324},"Provider differences are abstracted at the integration layer.",{"type":17,"tag":68,"props":141326,"children":141328},{"id":141327},"let-gemini-take-action-via-unified-mcp",[141329],{"type":23,"value":141330},"Let Gemini Take Action via Unified MCP",{"type":17,"tag":29,"props":141332,"children":141333},{},[141334],{"type":23,"value":141335},"Text generation is one layer.",{"type":17,"tag":29,"props":141337,"children":141338},{},[141339],{"type":23,"value":141340},"Production AI features require structured, authorized reads and writes against customer SaaS platforms.",{"type":17,"tag":29,"props":141342,"children":141343},{},[141344],{"type":23,"value":377},{"type":17,"tag":80,"props":141346,"children":141347},{},[141348,141352,141356,141361,141366],{"type":17,"tag":84,"props":141349,"children":141350},{},[141351],{"type":23,"value":140359},{"type":17,"tag":84,"props":141353,"children":141354},{},[141355],{"type":23,"value":140364},{"type":17,"tag":84,"props":141357,"children":141358},{},[141359],{"type":23,"value":141360},"Fetch a file from storage",{"type":17,"tag":84,"props":141362,"children":141363},{},[141364],{"type":23,"value":141365},"Update a ticket",{"type":17,"tag":84,"props":141367,"children":141368},{},[141369],{"type":23,"value":141370},"Write back a note",{"type":17,"tag":29,"props":141372,"children":141373},{},[141374,141375,141379],{"type":23,"value":25244},{"type":17,"tag":48,"props":141376,"children":141377},{},[141378],{"type":23,"value":1067},{"type":23,"value":141380}," connects Gemini (and other LLMs) to customer integrations through tool-calling.",{"type":17,"tag":68,"props":141382,"children":141384},{"id":141383},"gemini-tool-calling-with-unified-mcp",[141385],{"type":23,"value":141386},"Gemini Tool-Calling with Unified MCP",{"type":17,"tag":29,"props":141388,"children":141389},{},[141390,141392,141398],{"type":23,"value":141391},"Gemini uses ",{"type":17,"tag":6121,"props":141393,"children":141395},{"className":141394},[],[141396],{"type":23,"value":141397},"function_declarations",{"type":23,"value":141399}," for tool calling.",{"type":17,"tag":29,"props":141401,"children":141402},{},[141403],{"type":23,"value":139503},{"type":17,"tag":6154,"props":141405,"children":141406},{},[141407],{"type":17,"tag":84,"props":141408,"children":141409},{},[141410],{"type":23,"value":141411},"Fetch tools in Gemini format:",{"type":17,"tag":6893,"props":141413,"children":141416},{"className":141414,"code":141415,"language":20901,"meta":23},[20899],"GET /tools?type=gemini\n",[141417],{"type":17,"tag":6121,"props":141418,"children":141419},{"__ignoreMap":7},[141420],{"type":23,"value":141415},{"type":17,"tag":6154,"props":141422,"children":141423},{},[141424,141429],{"type":17,"tag":84,"props":141425,"children":141426},{},[141427],{"type":23,"value":141428},"Provide tools to the Gemini API call",{"type":17,"tag":84,"props":141430,"children":141431},{},[141432],{"type":23,"value":141433},"Gemini returns a function call request:",{"type":17,"tag":6893,"props":141435,"children":141438},{"className":141436,"code":141437,"language":22503,"meta":7},[22501],"{\n  \"function_call\": {\n    \"name\": \"list_candidates\",\n    \"args\": {\n      \"limit\": \"100\"\n    }\n  }\n}\n",[141439],{"type":17,"tag":6121,"props":141440,"children":141441},{"__ignoreMap":7},[141442],{"type":23,"value":141437},{"type":17,"tag":6154,"props":141444,"children":141445},{},[141446],{"type":17,"tag":84,"props":141447,"children":141448},{},[141449],{"type":23,"value":139557},{"type":17,"tag":6893,"props":141451,"children":141453},{"className":141452,"code":137865,"language":20901,"meta":23},[20899],[141454],{"type":17,"tag":6121,"props":141455,"children":141456},{"__ignoreMap":7},[141457],{"type":23,"value":137865},{"type":17,"tag":6154,"props":141459,"children":141460},{},[141461],{"type":17,"tag":84,"props":141462,"children":141463},{},[141464],{"type":23,"value":141465},"Return the tool result back to Gemini",{"type":17,"tag":29,"props":141467,"children":141468},{},[141469],{"type":23,"value":141470},"This keeps responsibilities clean:",{"type":17,"tag":80,"props":141472,"children":141473},{},[141474,141479,141484],{"type":17,"tag":84,"props":141475,"children":141476},{},[141477],{"type":23,"value":141478},"Gemini decides which tool to call",{"type":17,"tag":84,"props":141480,"children":141481},{},[141482],{"type":23,"value":141483},"Unified executes the authorized call against the source API",{"type":17,"tag":84,"props":141485,"children":141486},{},[141487],{"type":23,"value":141488},"Your app controls UX, approvals, and logging",{"type":17,"tag":239,"props":141490,"children":141492},{"id":141491},"important-mcp-controls-for-production",[141493],{"type":23,"value":141494},"Important MCP Controls for Production",{"type":17,"tag":29,"props":141496,"children":141497},{},[141498],{"type":23,"value":141499},"MCP includes controls you should use intentionally:",{"type":17,"tag":80,"props":141501,"children":141502},{},[141503,141513,141523,141534],{"type":17,"tag":84,"props":141504,"children":141505},{},[141506,141511],{"type":17,"tag":6121,"props":141507,"children":141509},{"className":141508},[],[141510],{"type":23,"value":24204},{"type":23,"value":141512}," → restrict what tools can do",{"type":17,"tag":84,"props":141514,"children":141515},{},[141516,141521],{"type":17,"tag":6121,"props":141517,"children":141519},{"className":141518},[],[141520],{"type":23,"value":131599},{"type":23,"value":141522}," → limit available tools to reduce model overload",{"type":17,"tag":84,"props":141524,"children":141525},{},[141526,141532],{"type":17,"tag":6121,"props":141527,"children":141529},{"className":141528},[],[141530],{"type":23,"value":141531},"hide_sensitive=true",{"type":23,"value":141533}," → remove PII fields from responses",{"type":17,"tag":84,"props":141535,"children":141536},{},[141537],{"type":23,"value":141538},"Regional endpoints (US/EU/AU)",{"type":17,"tag":29,"props":141540,"children":141541},{},[141542],{"type":23,"value":141543},"LLMs have tool limits. Scoping is not optional — it's required for stable deployments.",{"type":17,"tag":239,"props":141545,"children":141547},{"id":141546},"security-best-practices-for-gemini-mcp",[141548],{"type":23,"value":141549},"Security Best Practices for Gemini + MCP",{"type":17,"tag":29,"props":141551,"children":141552},{},[141553],{"type":23,"value":141554},"When deploying Gemini in production:",{"type":17,"tag":80,"props":141556,"children":141557},{},[141558,141562,141566,141571,141576,141581],{"type":17,"tag":84,"props":141559,"children":141560},{},[141561],{"type":23,"value":137935},{"type":17,"tag":84,"props":141563,"children":141564},{},[141565],{"type":23,"value":137940},{"type":17,"tag":84,"props":141567,"children":141568},{},[141569],{"type":23,"value":141570},"Use restricted API keys",{"type":17,"tag":84,"props":141572,"children":141573},{},[141574],{"type":23,"value":141575},"Separate dev/staging/prod keys",{"type":17,"tag":84,"props":141577,"children":141578},{},[141579],{"type":23,"value":141580},"Monitor request patterns",{"type":17,"tag":84,"props":141582,"children":141583},{},[141584],{"type":23,"value":141585},"Log tool calls and responses",{"type":17,"tag":29,"props":141587,"children":141588},{},[141589],{"type":23,"value":141590},"If the model can write to external platforms, treat that as privileged access.",{"type":17,"tag":68,"props":141592,"children":141593},{"id":137970},[141594],{"type":23,"value":137973},{"type":17,"tag":29,"props":141596,"children":141597},{},[141598],{"type":23,"value":141599},"Calling Gemini directly is simple.",{"type":17,"tag":29,"props":141601,"children":141602},{},[141603],{"type":23,"value":141604},"Building:",{"type":17,"tag":80,"props":141606,"children":141607},{},[141608,141612,141616,141621,141626],{"type":17,"tag":84,"props":141609,"children":141610},{},[141611],{"type":23,"value":17078},{"type":17,"tag":84,"props":141613,"children":141614},{},[141615],{"type":23,"value":137996},{"type":17,"tag":84,"props":141617,"children":141618},{},[141619],{"type":23,"value":141620},"Agent-based actions",{"type":17,"tag":84,"props":141622,"children":141623},{},[141624],{"type":23,"value":141625},"SaaS write-backs",{"type":17,"tag":84,"props":141627,"children":141628},{},[141629],{"type":23,"value":141630},"Enterprise-grade integration security",{"type":17,"tag":29,"props":141632,"children":141633},{},[141634],{"type":23,"value":141635},"…is not.",{"type":17,"tag":29,"props":141637,"children":141638},{},[141639],{"type":23,"value":141640},"Unified was built for AI-native SaaS teams that need:",{"type":17,"tag":80,"props":141642,"children":141643},{},[141644,141648,141652,141657,141661],{"type":17,"tag":84,"props":141645,"children":141646},{},[141647],{"type":23,"value":4711},{"type":17,"tag":84,"props":141649,"children":141650},{},[141651],{"type":23,"value":138034},{"type":17,"tag":84,"props":141653,"children":141654},{},[141655],{"type":23,"value":141656},"Zero storage of customer data",{"type":17,"tag":84,"props":141658,"children":141659},{},[141660],{"type":23,"value":137967},{"type":17,"tag":84,"props":141662,"children":141663},{},[141664],{"type":23,"value":141665},"MCP-compatible integration infrastructure",{"type":17,"tag":29,"props":141667,"children":141668},{},[141669],{"type":23,"value":141670},"Gemini generates reasoning.",{"type":17,"tag":29,"props":141672,"children":141673},{},[141674],{"type":23,"value":141675},"Unified connects that reasoning to structured SaaS data and authorized actions.",{"type":17,"tag":29,"props":141677,"children":141678},{},[141679],{"type":23,"value":141680},"That's the difference between experimenting with an LLM and shipping AI features inside a real product.",{"type":17,"tag":29,"props":141682,"children":141683},{},[141684],{"type":17,"tag":133,"props":141685,"children":141687},{"href":1612,"rel":141686},[214],[141688],{"type":23,"value":44481},{"type":17,"tag":29,"props":141690,"children":141691},{},[141692],{"type":17,"tag":133,"props":141693,"children":141695},{"href":1623,"rel":141694},[214],[141696],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":141698},[141699,141700,141701,141702,141705,141706,141707,141708,141711,141712,141716],{"id":140743,"depth":1629,"text":140746},{"id":140800,"depth":1629,"text":140803},{"id":140847,"depth":1629,"text":140850},{"id":140900,"depth":1629,"text":140903,"children":141703},[141704],{"id":140911,"depth":1635,"text":140914},{"id":140994,"depth":1629,"text":140997},{"id":141019,"depth":1629,"text":141022},{"id":141081,"depth":1629,"text":141084},{"id":141156,"depth":1629,"text":141159,"children":141709},[141710],{"id":141195,"depth":1635,"text":20702},{"id":141327,"depth":1629,"text":141330},{"id":141383,"depth":1629,"text":141386,"children":141713},[141714,141715],{"id":141491,"depth":1635,"text":141494},{"id":141546,"depth":1635,"text":141549},{"id":137970,"depth":1629,"text":137973},"content:blog:how_to_get_a_gemini_api_key_and_connect_it_to_your_product.md","blog/how_to_get_a_gemini_api_key_and_connect_it_to_your_product.md","blog/how_to_get_a_gemini_api_key_and_connect_it_to_your_product",{"_path":141721,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":141722,"description":141723,"img":141724,"date":141725,"tag":12,"body":141726,"_type":1677,"_id":142540,"_source":1679,"_file":142541,"_stem":142542,"_extension":1682},"/blog/how_to_get_a_grok_groq_xai_api_key_and_connect_it_to_your_product","How to Get a Grok / Groq (xAI) API Key  — and Connect It to Your Product","Grok (Groq) is xAI's family of LLMs. To use it in an application, you'll first generate an xAI API key, then decide how you want to run it,","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_a_grok_groq_xai_api_key_and_connect_it_to_your_product-icon.png","2026-02-20T20:13:00.000Z",{"type":14,"children":141727,"toc":142526},[141728,141733,141736,141743,141748,141781,141796,141802,141835,141841,141848,141857,141865,141870,141876,141925,141930,141936,141941,141959,141964,141970,141974,141983,141988,141994,141999,142004,142027,142052,142058,142063,142093,142098,142104,142127,142132,142138,142143,142148,142171,142181,142187,142216,142221,142227,142232,142237,142277,142283,142288,142292,142300,142309,142337,142346,142362,142367,142390,142396,142401,142406,142441,142446,142450,142455,142460,142473,142478,142505,142510,142518],{"type":17,"tag":18,"props":141729,"children":141731},{"id":141730},"how-to-get-a-grok-groq-xai-api-key-and-connect-it-to-your-product",[141732],{"type":23,"value":141722},{"type":17,"tag":25,"props":141734,"children":141735},{},[],{"type":17,"tag":29,"props":141737,"children":141738},{},[141739],{"type":17,"tag":33,"props":141740,"children":141741},{},[141742],{"type":23,"value":136280},{"type":17,"tag":29,"props":141744,"children":141745},{},[141746],{"type":23,"value":141747},"Grok (Groq) is xAI's family of LLMs. To use it in an application, you'll first generate an xAI API key, then decide how you want to run it:",{"type":17,"tag":80,"props":141749,"children":141750},{},[141751,141756,141770],{"type":17,"tag":84,"props":141752,"children":141753},{},[141754],{"type":23,"value":141755},"Call Grok directly via xAI's API",{"type":17,"tag":84,"props":141757,"children":141758},{},[141759,141761,141768],{"type":23,"value":141760},"Or call Grok through a unified ",{"type":17,"tag":48,"props":141762,"children":141763},{},[141764],{"type":17,"tag":133,"props":141765,"children":141766},{"href":16186},[141767],{"type":23,"value":137141},{"type":23,"value":141769}," (so you can support multiple model providers without maintaining separate integrations)",{"type":17,"tag":84,"props":141771,"children":141772},{},[141773,141775,141779],{"type":23,"value":141774},"Or connect Grok to your customers' SaaS platforms through ",{"type":17,"tag":133,"props":141776,"children":141777},{"href":326},[141778],{"type":23,"value":329},{"type":23,"value":141780},", so the model can perform authorized reads and writes",{"type":17,"tag":29,"props":141782,"children":141783},{},[141784,141786,141795],{"type":23,"value":141785},"This guide covers the key setup steps, then shows the Unified path: ",{"type":17,"tag":48,"props":141787,"children":141788},{},[141789,141793],{"type":17,"tag":133,"props":141790,"children":141791},{"href":16186},[141792],{"type":23,"value":25249},{"type":23,"value":141794}," + MCP server",{"type":23,"value":54},{"type":17,"tag":68,"props":141797,"children":141799},{"id":141798},"prerequisites",[141800],{"type":23,"value":141801},"Prerequisites",{"type":17,"tag":80,"props":141803,"children":141804},{},[141805,141823],{"type":17,"tag":84,"props":141806,"children":141807},{},[141808,141810,141815,141816,141821],{"type":23,"value":141809},"Active ",{"type":17,"tag":48,"props":141811,"children":141812},{},[141813],{"type":23,"value":141814},"X Premium",{"type":23,"value":75890},{"type":17,"tag":48,"props":141817,"children":141818},{},[141819],{"type":23,"value":141820},"X Premium+",{"type":23,"value":141822}," subscription (required for Grok API access)",{"type":17,"tag":84,"props":141824,"children":141825},{},[141826,141828,141833],{"type":23,"value":141827},"API access may take ",{"type":17,"tag":48,"props":141829,"children":141830},{},[141831],{"type":23,"value":141832},"24–48 hours",{"type":23,"value":141834}," to activate after subscribing",{"type":17,"tag":68,"props":141836,"children":141838},{"id":141837},"step-1-sign-in-to-the-xai-console",[141839],{"type":23,"value":141840},"Step 1: Sign in to the xAI Console",{"type":17,"tag":6154,"props":141842,"children":141843},{},[141844],{"type":17,"tag":84,"props":141845,"children":141846},{},[141847],{"type":23,"value":137163},{"type":17,"tag":6893,"props":141849,"children":141852},{"className":141850,"code":141851,"language":20901,"meta":23},[20899],"https://console.x.ai\n",[141853],{"type":17,"tag":6121,"props":141854,"children":141855},{"__ignoreMap":7},[141856],{"type":23,"value":141851},{"type":17,"tag":6154,"props":141858,"children":141859},{},[141860],{"type":17,"tag":84,"props":141861,"children":141862},{},[141863],{"type":23,"value":141864},"Sign in with your X credentials",{"type":17,"tag":29,"props":141866,"children":141867},{},[141868],{"type":23,"value":141869},"If it's your first time, complete onboarding (developer info, use case, terms).",{"type":17,"tag":68,"props":141871,"children":141873},{"id":141872},"step-2-create-an-api-key",[141874],{"type":23,"value":141875},"Step 2: Create an API key",{"type":17,"tag":6154,"props":141877,"children":141878},{},[141879,141888,141896,141915,141920],{"type":17,"tag":84,"props":141880,"children":141881},{},[141882,141884],{"type":23,"value":141883},"In the xAI console, open ",{"type":17,"tag":48,"props":141885,"children":141886},{},[141887],{"type":23,"value":137228},{"type":17,"tag":84,"props":141889,"children":141890},{},[141891,141892],{"type":23,"value":6629},{"type":17,"tag":48,"props":141893,"children":141894},{},[141895],{"type":23,"value":140862},{"type":17,"tag":84,"props":141897,"children":141898},{},[141899,141901,141907,141908,141914],{"type":23,"value":141900},"Name it (e.g., ",{"type":17,"tag":6121,"props":141902,"children":141904},{"className":141903},[],[141905],{"type":23,"value":141906},"prod-grok",{"type":23,"value":11826},{"type":17,"tag":6121,"props":141909,"children":141911},{"className":141910},[],[141912],{"type":23,"value":141913},"dev-grok",{"type":23,"value":12034},{"type":17,"tag":84,"props":141916,"children":141917},{},[141918],{"type":23,"value":141919},"Select permissions and model access",{"type":17,"tag":84,"props":141921,"children":141922},{},[141923],{"type":23,"value":141924},"Create the key",{"type":17,"tag":29,"props":141926,"children":141927},{},[141928],{"type":23,"value":141929},"Your API key is shown once. Store it securely (environment variable, vault).",{"type":17,"tag":68,"props":141931,"children":141933},{"id":141932},"step-3-configure-billing-and-rate-limits",[141934],{"type":23,"value":141935},"Step 3: Configure billing and rate limits",{"type":17,"tag":29,"props":141937,"children":141938},{},[141939],{"type":23,"value":141940},"In the console, configure:",{"type":17,"tag":80,"props":141942,"children":141943},{},[141944,141949,141954],{"type":17,"tag":84,"props":141945,"children":141946},{},[141947],{"type":23,"value":141948},"Usage caps (daily/monthly)",{"type":17,"tag":84,"props":141950,"children":141951},{},[141952],{"type":23,"value":141953},"Alert thresholds",{"type":17,"tag":84,"props":141955,"children":141956},{},[141957],{"type":23,"value":141958},"Overage behavior",{"type":17,"tag":29,"props":141960,"children":141961},{},[141962],{"type":23,"value":141963},"Then confirm your current rate limits and quotas for your plan.",{"type":17,"tag":68,"props":141965,"children":141967},{"id":141966},"step-4-test-the-grok-api-key",[141968],{"type":23,"value":141969},"Step 4: Test the Grok API key",{"type":17,"tag":29,"props":141971,"children":141972},{},[141973],{"type":23,"value":25256},{"type":17,"tag":6893,"props":141975,"children":141978},{"className":141976,"code":141977,"language":48432,"meta":7},[48430],"curl https://api.x.ai/v1/chat/completions \\\n  -H \"Authorization: Bearer $GROK_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"model\": \"grok-1\",\n    \"messages\": [\n      { \"role\": \"user\", \"content\": \"What is happening on X today?\" }\n    ],\n    \"temperature\": 0.7,\n    \"stream\": false\n  }'\n",[141979],{"type":17,"tag":6121,"props":141980,"children":141981},{"__ignoreMap":7},[141982],{"type":23,"value":141977},{"type":17,"tag":29,"props":141984,"children":141985},{},[141986],{"type":23,"value":141987},"If successful, you'll get a JSON response with the model output.",{"type":17,"tag":18,"props":141989,"children":141991},{"id":141990},"option-a-call-grok-through-unifieds-generative-ai-api",[141992],{"type":23,"value":141993},"Option A: Call Grok through Unified's Generative AI API",{"type":17,"tag":29,"props":141995,"children":141996},{},[141997],{"type":23,"value":141998},"If you're building an AI product, Grok is rarely your only model provider long term.",{"type":17,"tag":29,"props":142000,"children":142001},{},[142002],{"type":23,"value":142003},"Most teams end up supporting multiple providers for:",{"type":17,"tag":80,"props":142005,"children":142006},{},[142007,142012,142017,142022],{"type":17,"tag":84,"props":142008,"children":142009},{},[142010],{"type":23,"value":142011},"fallback when a provider is down",{"type":17,"tag":84,"props":142013,"children":142014},{},[142015],{"type":23,"value":142016},"cost/performance tradeoffs",{"type":17,"tag":84,"props":142018,"children":142019},{},[142020],{"type":23,"value":142021},"embedding portability",{"type":17,"tag":84,"props":142023,"children":142024},{},[142025],{"type":23,"value":142026},"customer preference (enterprise procurement often drives this)",{"type":17,"tag":29,"props":142028,"children":142029},{},[142030,142031,142035,142037,142041,142042,142046,142047,142051],{"type":23,"value":25244},{"type":17,"tag":48,"props":142032,"children":142033},{},[142034],{"type":23,"value":137141},{"type":23,"value":142036}," gives you a standardized interface across supported LLM providers (including Grok), with consistent objects for ",{"type":17,"tag":48,"props":142038,"children":142039},{},[142040],{"type":23,"value":137603},{"type":23,"value":11826},{"type":17,"tag":48,"props":142043,"children":142044},{},[142045],{"type":23,"value":137611},{"type":23,"value":12561},{"type":17,"tag":48,"props":142048,"children":142049},{},[142050],{"type":23,"value":137619},{"type":23,"value":54},{"type":17,"tag":239,"props":142053,"children":142055},{"id":142054},"what-you-build-against",[142056],{"type":23,"value":142057},"What you build against",{"type":17,"tag":29,"props":142059,"children":142060},{},[142061],{"type":23,"value":142062},"Conceptually, the GenAI API is three core objects:",{"type":17,"tag":80,"props":142064,"children":142065},{},[142066,142075,142084],{"type":17,"tag":84,"props":142067,"children":142068},{},[142069,142073],{"type":17,"tag":48,"props":142070,"children":142071},{},[142072],{"type":23,"value":16997},{"type":23,"value":142074}," (capabilities like max tokens, temperature support)",{"type":17,"tag":84,"props":142076,"children":142077},{},[142078,142082],{"type":17,"tag":48,"props":142079,"children":142080},{},[142081],{"type":23,"value":17010},{"type":23,"value":142083}," (messages, temperature/max_tokens, responses/tokens_used)",{"type":17,"tag":84,"props":142085,"children":142086},{},[142087,142091],{"type":17,"tag":48,"props":142088,"children":142089},{},[142090],{"type":23,"value":17023},{"type":23,"value":142092}," (content, dimensions, embeddings array, tokens_used)",{"type":17,"tag":29,"props":142094,"children":142095},{},[142096],{"type":23,"value":142097},"This is the 'build once' path for GenAI providers (not just Grok).",{"type":17,"tag":239,"props":142099,"children":142101},{"id":142100},"common-genai-product-patterns-this-unlocks",[142102],{"type":23,"value":142103},"Common GenAI product patterns this unlocks",{"type":17,"tag":80,"props":142105,"children":142106},{},[142107,142112,142117,142122],{"type":17,"tag":84,"props":142108,"children":142109},{},[142110],{"type":23,"value":142111},"Run the same prompt across providers to compare responses",{"type":17,"tag":84,"props":142113,"children":142114},{},[142115],{"type":23,"value":142116},"Route requests across providers based on availability/config",{"type":17,"tag":84,"props":142118,"children":142119},{},[142120],{"type":23,"value":142121},"Generate embeddings across providers for RAG and semantic search",{"type":17,"tag":84,"props":142123,"children":142124},{},[142125],{"type":23,"value":142126},"Keep your app code stable while swapping model providers underneath",{"type":17,"tag":29,"props":142128,"children":142129},{},[142130],{"type":23,"value":142131},"(Keep the provider-specific key management where it belongs: auth + secret storage, not in your business logic.)",{"type":17,"tag":18,"props":142133,"children":142135},{"id":142134},"option-b-use-grok-as-the-brain-unified-mcp-as-the-action-layer",[142136],{"type":23,"value":142137},"Option B: Use Grok as the 'brain,' Unified MCP as the action layer",{"type":17,"tag":29,"props":142139,"children":142140},{},[142141],{"type":23,"value":142142},"LLM calls are only one piece.",{"type":17,"tag":29,"props":142144,"children":142145},{},[142146],{"type":23,"value":142147},"The harder part is letting the model take action against customer SaaS tools safely:",{"type":17,"tag":80,"props":142149,"children":142150},{},[142151,142156,142161,142166],{"type":17,"tag":84,"props":142152,"children":142153},{},[142154],{"type":23,"value":142155},"list candidates from an ATS",{"type":17,"tag":84,"props":142157,"children":142158},{},[142159],{"type":23,"value":142160},"update a CRM deal",{"type":17,"tag":84,"props":142162,"children":142163},{},[142164],{"type":23,"value":142165},"fetch a file from Google Drive",{"type":17,"tag":84,"props":142167,"children":142168},{},[142169],{"type":23,"value":142170},"write a comment into HubSpot",{"type":17,"tag":29,"props":142172,"children":142173},{},[142174,142175,142179],{"type":23,"value":25244},{"type":17,"tag":48,"props":142176,"children":142177},{},[142178],{"type":23,"value":1067},{"type":23,"value":142180}," connects any Unified connection to LLM providers and clients that support MCP (Claude, OpenAI, Gemini, Cohere, Grok, Groq, Cursor, etc.). The tools available depend on the integration's support and the connection's requested permissions.",{"type":17,"tag":239,"props":142182,"children":142184},{"id":142183},"mcp-urls-regional",[142185],{"type":23,"value":142186},"MCP URLs (regional)",{"type":17,"tag":80,"props":142188,"children":142189},{},[142190],{"type":17,"tag":84,"props":142191,"children":142192},{},[142193,142195],{"type":23,"value":142194},"Streamable HTTP:\n",{"type":17,"tag":80,"props":142196,"children":142197},{},[142198,142207],{"type":17,"tag":84,"props":142199,"children":142200},{},[142201],{"type":17,"tag":6121,"props":142202,"children":142204},{"className":142203},[],[142205],{"type":23,"value":142206},"https://mcp-api.unified.to/mcp",{"type":17,"tag":84,"props":142208,"children":142209},{},[142210],{"type":17,"tag":6121,"props":142211,"children":142213},{"className":142212},[],[142214],{"type":23,"value":142215},"https://mcp-api-eu.unified.to/mcp",{"type":17,"tag":29,"props":142217,"children":142218},{},[142219],{"type":23,"value":142220},"(You can keep traffic regionalized; Unified is designed as a pass-through, zero-storage platform.)",{"type":17,"tag":239,"props":142222,"children":142224},{"id":142223},"tool-limits-are-real",[142225],{"type":23,"value":142226},"Tool limits are real",{"type":17,"tag":29,"props":142228,"children":142229},{},[142230],{"type":23,"value":142231},"Most LLMs cap how many tools they can reliably handle. The practical implication: you must restrict tool scope using permissions and tool filters, or you'll hit model limits fast.",{"type":17,"tag":29,"props":142233,"children":142234},{},[142235],{"type":23,"value":142236},"Unified supports scoping with:",{"type":17,"tag":80,"props":142238,"children":142239},{},[142240,142248,142256,142266],{"type":17,"tag":84,"props":142241,"children":142242},{},[142243],{"type":17,"tag":6121,"props":142244,"children":142246},{"className":142245},[],[142247],{"type":23,"value":24204},{"type":17,"tag":84,"props":142249,"children":142250},{},[142251],{"type":17,"tag":6121,"props":142252,"children":142254},{"className":142253},[],[142255],{"type":23,"value":131599},{"type":17,"tag":84,"props":142257,"children":142258},{},[142259,142264],{"type":17,"tag":6121,"props":142260,"children":142262},{"className":142261},[],[142263],{"type":23,"value":131610},{"type":23,"value":142265}," (for lowering tool token usage)",{"type":17,"tag":84,"props":142267,"children":142268},{},[142269,142275],{"type":17,"tag":6121,"props":142270,"children":142272},{"className":142271},[],[142273],{"type":23,"value":142274},"include_external_tools=true",{"type":23,"value":142276}," (when you explicitly want broader endpoint coverage)",{"type":17,"tag":68,"props":142278,"children":142280},{"id":142279},"using-grok-tool-calling-with-unified-mcp",[142281],{"type":23,"value":142282},"Using Grok tool-calling with Unified MCP",{"type":17,"tag":29,"props":142284,"children":142285},{},[142286],{"type":23,"value":142287},"Grok supports tool calling in a pattern similar to other tool-based LLM APIs.",{"type":17,"tag":29,"props":142289,"children":142290},{},[142291],{"type":23,"value":139503},{"type":17,"tag":6154,"props":142293,"children":142294},{},[142295],{"type":17,"tag":84,"props":142296,"children":142297},{},[142298],{"type":23,"value":142299},"Fetch tools in Grok's expected format:",{"type":17,"tag":6893,"props":142301,"children":142304},{"className":142302,"code":142303,"language":20901,"meta":23},[20899],"GET /tools?type=grok\n",[142305],{"type":17,"tag":6121,"props":142306,"children":142307},{"__ignoreMap":7},[142308],{"type":23,"value":142303},{"type":17,"tag":6154,"props":142310,"children":142311},{},[142312,142324],{"type":17,"tag":84,"props":142313,"children":142314},{},[142315,142317,142323],{"type":23,"value":142316},"Send those tools to Grok's chat completion call (",{"type":17,"tag":6121,"props":142318,"children":142320},{"className":142319},[],[142321],{"type":23,"value":142322},"tool_choice: \"auto\"",{"type":23,"value":12034},{"type":17,"tag":84,"props":142325,"children":142326},{},[142327,142329,142335],{"type":23,"value":142328},"When Grok returns ",{"type":17,"tag":6121,"props":142330,"children":142332},{"className":142331},[],[142333],{"type":23,"value":142334},"tool_calls",{"type":23,"value":142336},", call Unified:",{"type":17,"tag":6893,"props":142338,"children":142341},{"className":142339,"code":142340,"language":20901,"meta":23},[20899],"POST /tools/{tool_id}/call\n",[142342],{"type":17,"tag":6121,"props":142343,"children":142344},{"__ignoreMap":7},[142345],{"type":23,"value":142340},{"type":17,"tag":6154,"props":142347,"children":142348},{},[142349],{"type":17,"tag":84,"props":142350,"children":142351},{},[142352,142354,142360],{"type":23,"value":142353},"Return the tool results back to Grok as ",{"type":17,"tag":6121,"props":142355,"children":142357},{"className":142356},[],[142358],{"type":23,"value":142359},"role: \"tool\"",{"type":23,"value":142361}," messages",{"type":17,"tag":29,"props":142363,"children":142364},{},[142365],{"type":23,"value":142366},"This keeps the LLM's role clear:",{"type":17,"tag":80,"props":142368,"children":142369},{},[142370,142380,142385],{"type":17,"tag":84,"props":142371,"children":142372},{},[142373,142375],{"type":23,"value":142374},"Grok decides ",{"type":17,"tag":33,"props":142376,"children":142377},{},[142378],{"type":23,"value":142379},"what to do next",{"type":17,"tag":84,"props":142381,"children":142382},{},[142383],{"type":23,"value":142384},"Unified executes the authorized tool call against the underlying platform API",{"type":17,"tag":84,"props":142386,"children":142387},{},[142388],{"type":23,"value":142389},"Your app owns the product logic around approvals, UI, audit, and retries",{"type":17,"tag":68,"props":142391,"children":142393},{"id":142392},"mcp-safety-controls-you-should-use",[142394],{"type":23,"value":142395},"MCP safety controls you should use",{"type":17,"tag":29,"props":142397,"children":142398},{},[142399],{"type":23,"value":142400},"When you ship this in a product, the defaults matter.",{"type":17,"tag":29,"props":142402,"children":142403},{},[142404],{"type":23,"value":142405},"Unified MCP supports controls like:",{"type":17,"tag":80,"props":142407,"children":142408},{},[142409,142419,142430],{"type":17,"tag":84,"props":142410,"children":142411},{},[142412,142417],{"type":17,"tag":6121,"props":142413,"children":142415},{"className":142414},[],[142416],{"type":23,"value":141531},{"type":23,"value":142418}," to reduce PII in tool results (names, emails, phone numbers, etc.)",{"type":17,"tag":84,"props":142420,"children":142421},{},[142422,142428],{"type":17,"tag":6121,"props":142423,"children":142425},{"className":142424},[],[142426],{"type":23,"value":142427},"permissions=...",{"type":23,"value":142429}," to restrict what the connection is allowed to do",{"type":17,"tag":84,"props":142431,"children":142432},{},[142433,142439],{"type":17,"tag":6121,"props":142434,"children":142436},{"className":142435},[],[142437],{"type":23,"value":142438},"tools=...",{"type":23,"value":142440}," to limit the tool set the model can access",{"type":17,"tag":29,"props":142442,"children":142443},{},[142444],{"type":23,"value":142445},"This is how you keep tool calling usable, auditable, and constrained.",{"type":17,"tag":18,"props":142447,"children":142448},{"id":45643},[142449],{"type":23,"value":45646},{"type":17,"tag":29,"props":142451,"children":142452},{},[142453],{"type":23,"value":142454},"If all you need is an LLM response, calling Grok directly is fine.",{"type":17,"tag":29,"props":142456,"children":142457},{},[142458],{"type":23,"value":142459},"If you're building an AI product that needs:",{"type":17,"tag":80,"props":142461,"children":142462},{},[142463,142468],{"type":17,"tag":84,"props":142464,"children":142465},{},[142466],{"type":23,"value":142467},"multiple model providers (fallback, routing, comparison, embeddings)",{"type":17,"tag":84,"props":142469,"children":142470},{},[142471],{"type":23,"value":142472},"and real SaaS actions (read/write) across customer integrations",{"type":17,"tag":29,"props":142474,"children":142475},{},[142476],{"type":23,"value":142477},"…then the clean architecture is:",{"type":17,"tag":80,"props":142479,"children":142480},{},[142481,142490,142500],{"type":17,"tag":84,"props":142482,"children":142483},{},[142484,142488],{"type":17,"tag":48,"props":142485,"children":142486},{},[142487],{"type":23,"value":16874},{"type":23,"value":142489}," for model access across providers",{"type":17,"tag":84,"props":142491,"children":142492},{},[142493,142498],{"type":17,"tag":48,"props":142494,"children":142495},{},[142496],{"type":23,"value":142497},"Unified MCP server",{"type":23,"value":142499}," for authorized tool calling into customer integrations",{"type":17,"tag":84,"props":142501,"children":142502},{},[142503],{"type":23,"value":142504},"Your app for product logic and user experience",{"type":17,"tag":29,"props":142506,"children":142507},{},[142508],{"type":23,"value":142509},"That's the difference between 'LLM demo' and 'AI feature shipped.'",{"type":17,"tag":29,"props":142511,"children":142512},{},[142513],{"type":17,"tag":133,"props":142514,"children":142516},{"href":1612,"rel":142515},[214],[142517],{"type":23,"value":44481},{"type":17,"tag":29,"props":142519,"children":142520},{},[142521],{"type":17,"tag":133,"props":142522,"children":142524},{"href":1623,"rel":142523},[214],[142525],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":142527},[142528,142529,142530,142531,142532,142538,142539],{"id":141798,"depth":1629,"text":141801},{"id":141837,"depth":1629,"text":141840},{"id":141872,"depth":1629,"text":141875},{"id":141932,"depth":1629,"text":141935},{"id":141966,"depth":1629,"text":141969,"children":142533},[142534,142535,142536,142537],{"id":142054,"depth":1635,"text":142057},{"id":142100,"depth":1635,"text":142103},{"id":142183,"depth":1635,"text":142186},{"id":142223,"depth":1635,"text":142226},{"id":142279,"depth":1629,"text":142282},{"id":142392,"depth":1629,"text":142395},"content:blog:how_to_get_a_grok_groq_xai_api_key_and_connect_it_to_your_product.md","blog/how_to_get_a_grok_groq_xai_api_key_and_connect_it_to_your_product.md","blog/how_to_get_a_grok_groq_xai_api_key_and_connect_it_to_your_product",{"_path":142544,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":142545,"description":142546,"img":142547,"date":142548,"tag":12,"body":142549,"_type":1677,"_id":143885,"_source":1679,"_file":143886,"_stem":143887,"_extension":1682},"/blog/how_to_integrate_with","How to Integrate with","Google Drive is one of the most widely adopted file storage platforms in the enterprise. A production-grade Google Drive API integration allows your product to...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with-icon.png","2026-02-20T19:58:00.000Z",{"type":14,"children":142550,"toc":143854},[142551,142556,142559,142566,142578,142595,142599,142627,142633,142639,142650,142686,142699,142703,142708,142759,142771,142776,142782,142787,142792,142842,142856,142861,142886,142890,142899,142938,142943,142952,142956,142967,142972,142976,142981,142986,143018,143030,143035,143041,143046,143054,143060,143069,143073,143128,143146,143157,143163,143172,143183,143189,143198,143203,143212,143223,143227,143236,143241,143259,143270,143276,143281,143287,143292,143303,143308,143314,143326,143337,143342,143359,143365,143370,143381,143386,143392,143397,143445,143450,143455,143461,143466,143471,143477,143482,143490,143503,143508,143578,143584,143588,143616,143622,143626,143635,143639,143662,143666,143705,143709,143729,143734,143749,143754,143767,143771,143775,143793,143797,143824,143828,143833,143838,143846],{"type":17,"tag":18,"props":142552,"children":142554},{"id":142553},"how-to-integrate-with",[142555],{"type":23,"value":142545},{"type":17,"tag":25,"props":142557,"children":142558},{},[],{"type":17,"tag":29,"props":142560,"children":142561},{},[142562],{"type":17,"tag":33,"props":142563,"children":142564},{},[142565],{"type":23,"value":136280},{"type":17,"tag":29,"props":142567,"children":142568},{},[142569,142571,142576],{"type":23,"value":142570},"Google Drive is one of the most widely adopted file storage platforms in the enterprise. A production-grade ",{"type":17,"tag":48,"props":142572,"children":142573},{},[142574],{"type":23,"value":142575},"Google Drive API integration",{"type":23,"value":142577}," allows your product to upload, download, search, and manage files within your customers' Drive environments securely and at scale.",{"type":17,"tag":29,"props":142579,"children":142580},{},[142581,142583,142587,142589,142593],{"type":23,"value":142582},"However, integrating Google Drive in a multi-tenant B2B SaaS application involves more than enabling an API and sending REST requests. You must implement ",{"type":17,"tag":133,"props":142584,"children":142585},{"href":779},[142586],{"type":23,"value":782},{"type":23,"value":142588}," correctly, choose least-privilege scopes, manage ",{"type":17,"tag":133,"props":142590,"children":142591},{"href":1857},[142592],{"type":23,"value":1860},{"type":23,"value":142594}," and large file transfers, and design for reliable change detection.",{"type":17,"tag":29,"props":142596,"children":142597},{},[142598],{"type":23,"value":70164},{"type":17,"tag":6154,"props":142600,"children":142601},{},[142602,142607,142612,142622],{"type":17,"tag":84,"props":142603,"children":142604},{},[142605],{"type":23,"value":142606},"How to integrate directly with the Google Drive API",{"type":17,"tag":84,"props":142608,"children":142609},{},[142610],{"type":23,"value":142611},"The operational considerations you will own",{"type":17,"tag":84,"props":142613,"children":142614},{},[142615,142617],{"type":23,"value":142616},"How to integrate Google Drive using Unified's ",{"type":17,"tag":133,"props":142618,"children":142619},{"href":28977},[142620],{"type":23,"value":142621},"File Storage API",{"type":17,"tag":84,"props":142623,"children":142624},{},[142625],{"type":23,"value":142626},"When to build directly vs use an integration layer",{"type":17,"tag":68,"props":142628,"children":142630},{"id":142629},"direct-google-drive-api-integration",[142631],{"type":23,"value":142632},"Direct Google Drive API Integration",{"type":17,"tag":239,"props":142634,"children":142636},{"id":142635},"step-1-create-a-google-cloud-project-and-enable-the-drive-api",[142637],{"type":23,"value":142638},"Step 1: Create a Google Cloud Project and Enable the Drive API",{"type":17,"tag":29,"props":142640,"children":142641},{},[142642,142644,142649],{"type":23,"value":142643},"Begin in the ",{"type":17,"tag":133,"props":142645,"children":142647},{"href":42075,"rel":142646},[214],[142648],{"type":23,"value":129775},{"type":23,"value":54},{"type":17,"tag":6154,"props":142651,"children":142652},{},[142653,142658,142667,142677],{"type":17,"tag":84,"props":142654,"children":142655},{},[142656],{"type":23,"value":142657},"Create a new project (or select an existing one).",{"type":17,"tag":84,"props":142659,"children":142660},{},[142661,142662,142666],{"type":23,"value":42939},{"type":17,"tag":48,"props":142663,"children":142664},{},[142665],{"type":23,"value":129793},{"type":23,"value":54},{"type":17,"tag":84,"props":142668,"children":142669},{},[142670,142671,142676],{"type":23,"value":127300},{"type":17,"tag":48,"props":142672,"children":142673},{},[142674],{"type":23,"value":142675},"Google Drive API",{"type":23,"value":54},{"type":17,"tag":84,"props":142678,"children":142679},{},[142680,142681,142685],{"type":23,"value":6629},{"type":17,"tag":48,"props":142682,"children":142683},{},[142684],{"type":23,"value":42181},{"type":23,"value":54},{"type":17,"tag":29,"props":142687,"children":142688},{},[142689,142691,142698],{"type":23,"value":142690},"Google documents this process in the official ",{"type":17,"tag":133,"props":142692,"children":142695},{"href":142693,"rel":142694},"https://developers.google.com/workspace/drive/api/quickstart/js",[214],[142696],{"type":23,"value":142697},"Drive API quickstart guide",{"type":23,"value":54},{"type":17,"tag":239,"props":142700,"children":142701},{"id":127328},[142702],{"type":23,"value":129838},{"type":17,"tag":29,"props":142704,"children":142705},{},[142706],{"type":23,"value":142707},"Before creating credentials, configure the OAuth consent screen:",{"type":17,"tag":6154,"props":142709,"children":142710},{},[142711,142720,142734,142754],{"type":17,"tag":84,"props":142712,"children":142713},{},[142714,142715,142719],{"type":23,"value":6661},{"type":17,"tag":48,"props":142716,"children":142717},{},[142718],{"type":23,"value":129847},{"type":23,"value":54},{"type":17,"tag":84,"props":142721,"children":142722},{},[142723,142724,142728,142729,142733],{"type":23,"value":44311},{"type":17,"tag":48,"props":142725,"children":142726},{},[142727],{"type":23,"value":127368},{"type":23,"value":129861},{"type":17,"tag":48,"props":142730,"children":142731},{},[142732],{"type":23,"value":42218},{"type":23,"value":129867},{"type":17,"tag":84,"props":142735,"children":142736},{},[142737,142738],{"type":23,"value":129872},{"type":17,"tag":80,"props":142739,"children":142740},{},[142741,142745,142749],{"type":17,"tag":84,"props":142742,"children":142743},{},[142744],{"type":23,"value":6418},{"type":17,"tag":84,"props":142746,"children":142747},{},[142748],{"type":23,"value":129884},{"type":17,"tag":84,"props":142750,"children":142751},{},[142752],{"type":23,"value":142753},"Developer contact information",{"type":17,"tag":84,"props":142755,"children":142756},{},[142757],{"type":23,"value":142758},"Add authorized domains and privacy policy links if required.",{"type":17,"tag":29,"props":142760,"children":142761},{},[142762,142764,142770],{"type":23,"value":142763},"Google explains OAuth setup for web server applications in its ",{"type":17,"tag":133,"props":142765,"children":142767},{"href":129907,"rel":142766},[214],[142768],{"type":23,"value":142769},"OAuth 2.0 Web Server Applications documentation",{"type":23,"value":54},{"type":17,"tag":29,"props":142772,"children":142773},{},[142774],{"type":23,"value":142775},"If your app requests sensitive or restricted scopes, Google may require verification before production release.",{"type":17,"tag":239,"props":142777,"children":142779},{"id":142778},"step-3-select-the-correct-oauth-scopes",[142780],{"type":23,"value":142781},"Step 3: Select the Correct OAuth Scopes",{"type":17,"tag":29,"props":142783,"children":142784},{},[142785],{"type":23,"value":142786},"Scopes define what your application can access.",{"type":17,"tag":29,"props":142788,"children":142789},{},[142790],{"type":23,"value":142791},"Common Google Drive scopes include:",{"type":17,"tag":80,"props":142793,"children":142794},{},[142795,142804,142813,142822],{"type":17,"tag":84,"props":142796,"children":142797},{},[142798],{"type":17,"tag":6121,"props":142799,"children":142801},{"className":142800},[],[142802],{"type":23,"value":142803},"https://www.googleapis.com/auth/drive.readonly",{"type":17,"tag":84,"props":142805,"children":142806},{},[142807],{"type":17,"tag":6121,"props":142808,"children":142810},{"className":142809},[],[142811],{"type":23,"value":142812},"https://www.googleapis.com/auth/drive.file",{"type":17,"tag":84,"props":142814,"children":142815},{},[142816],{"type":17,"tag":6121,"props":142817,"children":142819},{"className":142818},[],[142820],{"type":23,"value":142821},"https://www.googleapis.com/auth/drive",{"type":17,"tag":84,"props":142823,"children":142824},{},[142825,142830,142831,142836,142837],{"type":17,"tag":6121,"props":142826,"children":142828},{"className":142827},[],[142829],{"type":23,"value":98191},{"type":23,"value":11826},{"type":17,"tag":6121,"props":142832,"children":142834},{"className":142833},[],[142835],{"type":23,"value":98204},{"type":23,"value":11826},{"type":17,"tag":6121,"props":142838,"children":142840},{"className":142839},[],[142841],{"type":23,"value":62666},{"type":17,"tag":29,"props":142843,"children":142844},{},[142845,142847,142854],{"type":23,"value":142846},"Google recommends selecting the least permissive scope possible. The official ",{"type":17,"tag":133,"props":142848,"children":142851},{"href":142849,"rel":142850},"https://developers.google.com/workspace/drive/api/guides/api-specific-auth",[214],[142852],{"type":23,"value":142853},"Drive API scope reference",{"type":23,"value":142855}," explains the differences between metadata access, per-file access, and full Drive access.",{"type":17,"tag":29,"props":142857,"children":142858},{},[142859],{"type":23,"value":142860},"For most SaaS integrations:",{"type":17,"tag":80,"props":142862,"children":142863},{},[142864,142875],{"type":17,"tag":84,"props":142865,"children":142866},{},[142867,142873],{"type":17,"tag":6121,"props":142868,"children":142870},{"className":142869},[],[142871],{"type":23,"value":142872},"drive.file",{"type":23,"value":142874}," is preferred for write access limited to files created or opened by your app.",{"type":17,"tag":84,"props":142876,"children":142877},{},[142878,142884],{"type":17,"tag":6121,"props":142879,"children":142881},{"className":142880},[],[142882],{"type":23,"value":142883},"drive.readonly",{"type":23,"value":142885}," is appropriate for ingestion and indexing use cases.",{"type":17,"tag":239,"props":142887,"children":142888},{"id":130057},[142889],{"type":23,"value":130060},{"type":17,"tag":29,"props":142891,"children":142892},{},[142893,142894,142898],{"type":23,"value":42829},{"type":17,"tag":48,"props":142895,"children":142896},{},[142897],{"type":23,"value":130069},{"type":23,"value":20456},{"type":17,"tag":6154,"props":142900,"children":142901},{},[142902,142911,142921],{"type":17,"tag":84,"props":142903,"children":142904},{},[142905,142906,142910],{"type":23,"value":6629},{"type":17,"tag":48,"props":142907,"children":142908},{},[142909],{"type":23,"value":130082},{"type":23,"value":54},{"type":17,"tag":84,"props":142912,"children":142913},{},[142914,142915,142919],{"type":23,"value":42950},{"type":17,"tag":48,"props":142916,"children":142917},{},[142918],{"type":23,"value":42383},{"type":23,"value":142920}," for server-side SaaS integrations.",{"type":17,"tag":84,"props":142922,"children":142923},{},[142924,142925],{"type":23,"value":129872},{"type":17,"tag":80,"props":142926,"children":142927},{},[142928,142933],{"type":17,"tag":84,"props":142929,"children":142930},{},[142931],{"type":23,"value":142932},"Authorized redirect URI",{"type":17,"tag":84,"props":142934,"children":142935},{},[142936],{"type":23,"value":142937},"Authorized JavaScript origins (if applicable)",{"type":17,"tag":29,"props":142939,"children":142940},{},[142941],{"type":23,"value":142942},"Example redirect URI:",{"type":17,"tag":6893,"props":142944,"children":142947},{"className":142945,"code":142946,"language":20901,"meta":23},[20899],"https://yourapp.com/oauth/google/callback\n",[142948],{"type":17,"tag":6121,"props":142949,"children":142950},{"__ignoreMap":7},[142951],{"type":23,"value":142946},{"type":17,"tag":29,"props":142953,"children":142954},{},[142955],{"type":23,"value":130111},{"type":17,"tag":80,"props":142957,"children":142958},{},[142959,142963],{"type":17,"tag":84,"props":142960,"children":142961},{},[142962],{"type":23,"value":6040},{"type":17,"tag":84,"props":142964,"children":142965},{},[142966],{"type":23,"value":6045},{"type":17,"tag":29,"props":142968,"children":142969},{},[142970],{"type":23,"value":142971},"These are required for implementing the OAuth authorization code flow.",{"type":17,"tag":239,"props":142973,"children":142974},{"id":130130},[142975],{"type":23,"value":130133},{"type":17,"tag":29,"props":142977,"children":142978},{},[142979],{"type":23,"value":142980},"For SaaS products, the standard approach is the OAuth 2.0 authorization code flow.",{"type":17,"tag":29,"props":142982,"children":142983},{},[142984],{"type":23,"value":142985},"High-level sequence:",{"type":17,"tag":6154,"props":142987,"children":142988},{},[142989,142993,142998,143002],{"type":17,"tag":84,"props":142990,"children":142991},{},[142992],{"type":23,"value":130146},{"type":17,"tag":84,"props":142994,"children":142995},{},[142996],{"type":23,"value":142997},"User grants requested scopes.",{"type":17,"tag":84,"props":142999,"children":143000},{},[143001],{"type":23,"value":130156},{"type":17,"tag":84,"props":143003,"children":143004},{},[143005,143007],{"type":23,"value":143006},"Your backend exchanges the code for:\n",{"type":17,"tag":80,"props":143008,"children":143009},{},[143010,143014],{"type":17,"tag":84,"props":143011,"children":143012},{},[143013],{"type":23,"value":130169},{"type":17,"tag":84,"props":143015,"children":143016},{},[143017],{"type":23,"value":130174},{"type":17,"tag":29,"props":143019,"children":143020},{},[143021,143023,143029],{"type":23,"value":143022},"Google documents the full token exchange process in the ",{"type":17,"tag":133,"props":143024,"children":143026},{"href":129907,"rel":143025},[214],[143027],{"type":23,"value":143028},"OAuth 2.0 Web Server Flow guide",{"type":23,"value":54},{"type":17,"tag":29,"props":143031,"children":143032},{},[143033],{"type":23,"value":143034},"Access tokens expire (typically within one hour). Your application must securely store refresh tokens and implement automatic refresh logic.",{"type":17,"tag":68,"props":143036,"children":143038},{"id":143037},"core-google-drive-api-v3-endpoints",[143039],{"type":23,"value":143040},"Core Google Drive API v3 Endpoints",{"type":17,"tag":29,"props":143042,"children":143043},{},[143044],{"type":23,"value":143045},"All authenticated requests require:",{"type":17,"tag":6893,"props":143047,"children":143049},{"className":143048,"code":130205,"language":20901,"meta":23},[20899],[143050],{"type":17,"tag":6121,"props":143051,"children":143052},{"__ignoreMap":7},[143053],{"type":23,"value":130205},{"type":17,"tag":239,"props":143055,"children":143057},{"id":143056},"list-files",[143058],{"type":23,"value":143059},"List Files",{"type":17,"tag":6893,"props":143061,"children":143064},{"className":143062,"code":143063,"language":20901,"meta":23},[20899],"GET https://www.googleapis.com/drive/v3/files\n",[143065],{"type":17,"tag":6121,"props":143066,"children":143067},{"__ignoreMap":7},[143068],{"type":23,"value":143063},{"type":17,"tag":29,"props":143070,"children":143071},{},[143072],{"type":23,"value":70541},{"type":17,"tag":80,"props":143074,"children":143075},{},[143076,143085,143094,143102,143110,143119],{"type":17,"tag":84,"props":143077,"children":143078},{},[143079,143084],{"type":17,"tag":6121,"props":143080,"children":143082},{"className":143081},[],[143083],{"type":23,"value":130255},{"type":23,"value":130257},{"type":17,"tag":84,"props":143086,"children":143087},{},[143088],{"type":17,"tag":6121,"props":143089,"children":143091},{"className":143090},[],[143092],{"type":23,"value":143093},"pageSize",{"type":17,"tag":84,"props":143095,"children":143096},{},[143097],{"type":17,"tag":6121,"props":143098,"children":143100},{"className":143099},[],[143101],{"type":23,"value":130274},{"type":17,"tag":84,"props":143103,"children":143104},{},[143105],{"type":17,"tag":6121,"props":143106,"children":143108},{"className":143107},[],[143109],{"type":23,"value":39759},{"type":17,"tag":84,"props":143111,"children":143112},{},[143113],{"type":17,"tag":6121,"props":143114,"children":143116},{"className":143115},[],[143117],{"type":23,"value":143118},"supportsAllDrives",{"type":17,"tag":84,"props":143120,"children":143121},{},[143122],{"type":17,"tag":6121,"props":143123,"children":143125},{"className":143124},[],[143126],{"type":23,"value":143127},"includeItemsFromAllDrives",{"type":17,"tag":29,"props":143129,"children":143130},{},[143131,143133,143138,143139,143144],{"type":23,"value":143132},"Pagination uses ",{"type":17,"tag":6121,"props":143134,"children":143136},{"className":143135},[],[143137],{"type":23,"value":143093},{"type":23,"value":34435},{"type":17,"tag":6121,"props":143140,"children":143142},{"className":143141},[],[143143],{"type":23,"value":123997},{"type":23,"value":143145},", not offset-based paging.",{"type":17,"tag":29,"props":143147,"children":143148},{},[143149,143150],{"type":23,"value":130279},{"type":17,"tag":133,"props":143151,"children":143154},{"href":143152,"rel":143153},"https://developers.google.com/workspace/drive/api/reference/rest/v3/files/list",[214],[143155],{"type":23,"value":143156},"Drive files.list documentation",{"type":17,"tag":239,"props":143158,"children":143160},{"id":143159},"get-file-metadata",[143161],{"type":23,"value":143162},"Get File Metadata",{"type":17,"tag":6893,"props":143164,"children":143167},{"className":143165,"code":143166,"language":20901,"meta":23},[20899],"GET https://www.googleapis.com/drive/v3/files/{fileId}\n",[143168],{"type":17,"tag":6121,"props":143169,"children":143170},{"__ignoreMap":7},[143171],{"type":23,"value":143166},{"type":17,"tag":29,"props":143173,"children":143174},{},[143175,143176],{"type":23,"value":130279},{"type":17,"tag":133,"props":143177,"children":143180},{"href":143178,"rel":143179},"https://developers.google.com/workspace/drive/api/reference/rest/v3/files/get",[214],[143181],{"type":23,"value":143182},"Drive files.get documentation",{"type":17,"tag":239,"props":143184,"children":143186},{"id":143185},"download-file-content",[143187],{"type":23,"value":143188},"Download File Content",{"type":17,"tag":6893,"props":143190,"children":143193},{"className":143191,"code":143192,"language":20901,"meta":23},[20899],"GET https://www.googleapis.com/drive/v3/files/{fileId}?alt=media\n",[143194],{"type":17,"tag":6121,"props":143195,"children":143196},{"__ignoreMap":7},[143197],{"type":23,"value":143192},{"type":17,"tag":29,"props":143199,"children":143200},{},[143201],{"type":23,"value":143202},"Google Workspace documents (Docs, Sheets, Slides) must be exported instead:",{"type":17,"tag":6893,"props":143204,"children":143207},{"className":143205,"code":143206,"language":20901,"meta":23},[20899],"GET https://www.googleapis.com/drive/v3/files/{fileId}/export?mimeType=application/pdf\n",[143208],{"type":17,"tag":6121,"props":143209,"children":143210},{"__ignoreMap":7},[143211],{"type":23,"value":143206},{"type":17,"tag":29,"props":143213,"children":143214},{},[143215,143216],{"type":23,"value":130279},{"type":17,"tag":133,"props":143217,"children":143220},{"href":143218,"rel":143219},"https://developers.google.com/workspace/drive/api/guides/manage-downloads",[214],[143221],{"type":23,"value":143222},"Download and export files guide",{"type":17,"tag":239,"props":143224,"children":143225},{"id":134930},[143226],{"type":23,"value":134933},{"type":17,"tag":6893,"props":143228,"children":143231},{"className":143229,"code":143230,"language":20901,"meta":23},[20899],"POST https://www.googleapis.com/upload/drive/v3/files\n",[143232],{"type":17,"tag":6121,"props":143233,"children":143234},{"__ignoreMap":7},[143235],{"type":23,"value":143230},{"type":17,"tag":29,"props":143237,"children":143238},{},[143239],{"type":23,"value":143240},"Upload types:",{"type":17,"tag":80,"props":143242,"children":143243},{},[143244,143249,143254],{"type":17,"tag":84,"props":143245,"children":143246},{},[143247],{"type":23,"value":143248},"Simple upload",{"type":17,"tag":84,"props":143250,"children":143251},{},[143252],{"type":23,"value":143253},"Multipart upload",{"type":17,"tag":84,"props":143255,"children":143256},{},[143257],{"type":23,"value":143258},"Resumable upload (recommended for large files)",{"type":17,"tag":29,"props":143260,"children":143261},{},[143262,143263],{"type":23,"value":130279},{"type":17,"tag":133,"props":143264,"children":143267},{"href":143265,"rel":143266},"https://developers.google.com/workspace/drive/api/guides/manage-uploads",[214],[143268],{"type":23,"value":143269},"Drive upload documentation",{"type":17,"tag":68,"props":143271,"children":143273},{"id":143272},"change-signals-in-google-drive",[143274],{"type":23,"value":143275},"Change Signals in Google Drive",{"type":17,"tag":29,"props":143277,"children":143278},{},[143279],{"type":23,"value":143280},"Google Drive provides multiple ways to detect changes.",{"type":17,"tag":239,"props":143282,"children":143284},{"id":143283},"push-notifications-watch-channels",[143285],{"type":23,"value":143286},"Push Notifications (Watch Channels)",{"type":17,"tag":29,"props":143288,"children":143289},{},[143290],{"type":23,"value":143291},"Drive can send HTTPS notifications to your endpoint when a watched file or folder changes.",{"type":17,"tag":29,"props":143293,"children":143294},{},[143295,143296],{"type":23,"value":130279},{"type":17,"tag":133,"props":143297,"children":143300},{"href":143298,"rel":143299},"https://developers.google.com/workspace/drive/api/guides/push",[214],[143301],{"type":23,"value":143302},"Drive Push Notifications guide",{"type":17,"tag":29,"props":143304,"children":143305},{},[143306],{"type":23,"value":143307},"This approach requires maintaining channel IDs and expiration handling.",{"type":17,"tag":239,"props":143309,"children":143311},{"id":143310},"changes-feed-polling",[143312],{"type":23,"value":143313},"Changes Feed (Polling)",{"type":17,"tag":29,"props":143315,"children":143316},{},[143317,143318,143324],{"type":23,"value":6712},{"type":17,"tag":6121,"props":143319,"children":143321},{"className":143320},[],[143322],{"type":23,"value":143323},"changes",{"type":23,"value":143325}," resource enables incremental synchronization via page tokens.",{"type":17,"tag":29,"props":143327,"children":143328},{},[143329,143330],{"type":23,"value":130279},{"type":17,"tag":133,"props":143331,"children":143334},{"href":143332,"rel":143333},"https://developers.google.com/workspace/drive/api/reference/rest/v3/changes/list",[214],[143335],{"type":23,"value":143336},"Drive changes.list documentation",{"type":17,"tag":29,"props":143338,"children":143339},{},[143340],{"type":23,"value":143341},"This is often used for:",{"type":17,"tag":80,"props":143343,"children":143344},{},[143345,143349,143354],{"type":17,"tag":84,"props":143346,"children":143347},{},[143348],{"type":23,"value":132910},{"type":17,"tag":84,"props":143350,"children":143351},{},[143352],{"type":23,"value":143353},"Catch-up processing",{"type":17,"tag":84,"props":143355,"children":143356},{},[143357],{"type":23,"value":143358},"Recovery after downtime",{"type":17,"tag":239,"props":143360,"children":143362},{"id":143361},"pubsub-events",[143363],{"type":23,"value":143364},"Pub/Sub Events",{"type":17,"tag":29,"props":143366,"children":143367},{},[143368],{"type":23,"value":143369},"Google Drive can publish events to Google Cloud Pub/Sub for scalable, asynchronous processing.",{"type":17,"tag":29,"props":143371,"children":143372},{},[143373,143374],{"type":23,"value":130279},{"type":17,"tag":133,"props":143375,"children":143378},{"href":143376,"rel":143377},"https://developers.google.com/workspace/drive/api/guides/events-overview",[214],[143379],{"type":23,"value":143380},"Drive Events overview",{"type":17,"tag":29,"props":143382,"children":143383},{},[143384],{"type":23,"value":143385},"Pub/Sub is recommended for high-volume or distributed architectures.",{"type":17,"tag":68,"props":143387,"children":143389},{"id":143388},"operational-complexity-of-direct-google-drive-integration",[143390],{"type":23,"value":143391},"Operational Complexity of Direct Google Drive Integration",{"type":17,"tag":29,"props":143393,"children":143394},{},[143395],{"type":23,"value":143396},"A production-ready integration requires:",{"type":17,"tag":80,"props":143398,"children":143399},{},[143400,143404,143409,143414,143419,143424,143435,143440],{"type":17,"tag":84,"props":143401,"children":143402},{},[143403],{"type":23,"value":93493},{"type":17,"tag":84,"props":143405,"children":143406},{},[143407],{"type":23,"value":143408},"Secure token storage and rotation",{"type":17,"tag":84,"props":143410,"children":143411},{},[143412],{"type":23,"value":143413},"Scope verification compliance",{"type":17,"tag":84,"props":143415,"children":143416},{},[143417],{"type":23,"value":143418},"Handling shared drives vs My Drive",{"type":17,"tag":84,"props":143420,"children":143421},{},[143422],{"type":23,"value":143423},"Export logic for Google-native document formats",{"type":17,"tag":84,"props":143425,"children":143426},{},[143427,143429,143434],{"type":23,"value":143428},"Pagination management (",{"type":17,"tag":6121,"props":143430,"children":143432},{"className":143431},[],[143433],{"type":23,"value":123997},{"type":23,"value":12034},{"type":17,"tag":84,"props":143436,"children":143437},{},[143438],{"type":23,"value":143439},"Retry logic with exponential backoff",{"type":17,"tag":84,"props":143441,"children":143442},{},[143443],{"type":23,"value":143444},"Change detection architecture",{"type":17,"tag":29,"props":143446,"children":143447},{},[143448],{"type":23,"value":143449},"For a single internal workflow, this may be manageable.",{"type":17,"tag":29,"props":143451,"children":143452},{},[143453],{"type":23,"value":143454},"For a multi-tenant SaaS platform serving many Google Drive customers, this becomes sustained infrastructure work.",{"type":17,"tag":68,"props":143456,"children":143458},{"id":143457},"integrating-google-drive-via-unifieds-file-storage-api",[143459],{"type":23,"value":143460},"Integrating Google Drive via Unified's File Storage API",{"type":17,"tag":29,"props":143462,"children":143463},{},[143464],{"type":23,"value":143465},"If your roadmap includes Google Drive plus other storage providers (Box, Dropbox, OneDrive), maintaining separate OAuth logic and change detection flows increases long-term complexity.",{"type":17,"tag":29,"props":143467,"children":143468},{},[143469],{"type":23,"value":143470},"Unified provides a File Storage API that standardizes file operations across providers.",{"type":17,"tag":239,"props":143472,"children":143474},{"id":143473},"step-1-register-google-oauth-for-unified",[143475],{"type":23,"value":143476},"Step 1: Register Google OAuth for Unified",{"type":17,"tag":29,"props":143478,"children":143479},{},[143480],{"type":23,"value":143481},"When integrating via Unified, configure your Google OAuth redirect URI as:",{"type":17,"tag":6893,"props":143483,"children":143485},{"className":143484,"code":71416,"language":20901,"meta":23},[20899],[143486],{"type":17,"tag":6121,"props":143487,"children":143488},{"__ignoreMap":7},[143489],{"type":23,"value":71416},{"type":17,"tag":29,"props":143491,"children":143492},{},[143493,143495,143502],{"type":23,"value":143494},"Unified's setup guide is available in the ",{"type":17,"tag":133,"props":143496,"children":143499},{"href":143497,"rel":143498},"https://docs.unified.to/guides/how_to_register_a_google_developer_app_and_get_oauth_2_credentials",[214],[143500],{"type":23,"value":143501},"Google OAuth credentials guide",{"type":23,"value":54},{"type":17,"tag":29,"props":143504,"children":143505},{},[143506],{"type":23,"value":143507},"Unified scope mapping for Google Drive includes:",{"type":17,"tag":80,"props":143509,"children":143510},{},[143511,143544],{"type":17,"tag":84,"props":143512,"children":143513},{},[143514,143520,143521,143526,143527,143532,143533,143538,143539],{"type":17,"tag":6121,"props":143515,"children":143517},{"className":143516},[],[143518],{"type":23,"value":143519},"storage_file_read",{"type":23,"value":98082},{"type":17,"tag":6121,"props":143522,"children":143524},{"className":143523},[],[143525],{"type":23,"value":98191},{"type":23,"value":11826},{"type":17,"tag":6121,"props":143528,"children":143530},{"className":143529},[],[143531],{"type":23,"value":98204},{"type":23,"value":11826},{"type":17,"tag":6121,"props":143534,"children":143536},{"className":143535},[],[143537],{"type":23,"value":62666},{"type":23,"value":11826},{"type":17,"tag":6121,"props":143540,"children":143542},{"className":143541},[],[143543],{"type":23,"value":142883},{"type":17,"tag":84,"props":143545,"children":143546},{},[143547,143553,143554,143559,143560,143565,143566,143571,143572],{"type":17,"tag":6121,"props":143548,"children":143550},{"className":143549},[],[143551],{"type":23,"value":143552},"storage_file_write",{"type":23,"value":98082},{"type":17,"tag":6121,"props":143555,"children":143557},{"className":143556},[],[143558],{"type":23,"value":98191},{"type":23,"value":11826},{"type":17,"tag":6121,"props":143561,"children":143563},{"className":143562},[],[143564],{"type":23,"value":98204},{"type":23,"value":11826},{"type":17,"tag":6121,"props":143567,"children":143569},{"className":143568},[],[143570],{"type":23,"value":62666},{"type":23,"value":11826},{"type":17,"tag":6121,"props":143573,"children":143575},{"className":143574},[],[143576],{"type":23,"value":143577},"drive",{"type":17,"tag":239,"props":143579,"children":143581},{"id":143580},"step-2-activate-google-drive-in-unified",[143582],{"type":23,"value":143583},"Step 2: Activate Google Drive in Unified",{"type":17,"tag":29,"props":143585,"children":143586},{},[143587],{"type":23,"value":129339},{"type":17,"tag":6154,"props":143589,"children":143590},{},[143591,143596,143601,143606],{"type":17,"tag":84,"props":143592,"children":143593},{},[143594],{"type":23,"value":143595},"Activate Google Drive.",{"type":17,"tag":84,"props":143597,"children":143598},{},[143599],{"type":23,"value":143600},"Enter your Client ID and Client Secret.",{"type":17,"tag":84,"props":143602,"children":143603},{},[143604],{"type":23,"value":143605},"Authorize a user account.",{"type":17,"tag":84,"props":143607,"children":143608},{},[143609,143610,143615],{"type":23,"value":98241},{"type":17,"tag":6121,"props":143611,"children":143613},{"className":143612},[],[143614],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":239,"props":143617,"children":143619},{"id":143618},"step-3-call-unifieds-file-storage-api",[143620],{"type":23,"value":143621},"Step 3: Call Unified's File Storage API",{"type":17,"tag":29,"props":143623,"children":143624},{},[143625],{"type":23,"value":19878},{"type":17,"tag":6893,"props":143627,"children":143630},{"className":143628,"code":143629,"language":48432,"meta":7},[48430],"GET https://api.unified.to/storage/file/{connection_id}?limit=100\nAuthorization: Bearer YOUR_UNIFIED_API_KEY\n",[143631],{"type":17,"tag":6121,"props":143632,"children":143633},{"__ignoreMap":7},[143634],{"type":23,"value":143629},{"type":17,"tag":29,"props":143636,"children":143637},{},[143638],{"type":23,"value":71967},{"type":17,"tag":80,"props":143640,"children":143641},{},[143642,143646,143650,143654,143658],{"type":17,"tag":84,"props":143643,"children":143644},{},[143645],{"type":23,"value":11243},{"type":17,"tag":84,"props":143647,"children":143648},{},[143649],{"type":23,"value":11832},{"type":17,"tag":84,"props":143651,"children":143652},{},[143653],{"type":23,"value":11254},{"type":17,"tag":84,"props":143655,"children":143656},{},[143657],{"type":23,"value":11845},{"type":17,"tag":84,"props":143659,"children":143660},{},[143661],{"type":23,"value":11852},{"type":17,"tag":29,"props":143663,"children":143664},{},[143665],{"type":23,"value":130915},{"type":17,"tag":80,"props":143667,"children":143668},{},[143669,143673,143677,143681,143685,143689,143693,143697,143701],{"type":17,"tag":84,"props":143670,"children":143671},{},[143672],{"type":23,"value":18766},{"type":17,"tag":84,"props":143674,"children":143675},{},[143676],{"type":23,"value":18781},{"type":17,"tag":84,"props":143678,"children":143679},{},[143680],{"type":23,"value":72581},{"type":17,"tag":84,"props":143682,"children":143683},{},[143684],{"type":23,"value":20181},{"type":17,"tag":84,"props":143686,"children":143687},{},[143688],{"type":23,"value":15863},{"type":17,"tag":84,"props":143690,"children":143691},{},[143692],{"type":23,"value":24204},{"type":17,"tag":84,"props":143694,"children":143695},{},[143696],{"type":23,"value":24978},{"type":17,"tag":84,"props":143698,"children":143699},{},[143700],{"type":23,"value":33446},{"type":17,"tag":84,"props":143702,"children":143703},{},[143704],{"type":23,"value":25337},{"type":17,"tag":29,"props":143706,"children":143707},{},[143708],{"type":23,"value":117890},{"type":17,"tag":80,"props":143710,"children":143711},{},[143712,143716,143720,143724],{"type":17,"tag":84,"props":143713,"children":143714},{},[143715],{"type":23,"value":18781},{"type":17,"tag":84,"props":143717,"children":143718},{},[143719],{"type":23,"value":15863},{"type":17,"tag":84,"props":143721,"children":143722},{},[143723],{"type":23,"value":72581},{"type":17,"tag":84,"props":143725,"children":143726},{},[143727],{"type":23,"value":143728},"data",{"type":17,"tag":29,"props":143730,"children":143731},{},[143732],{"type":23,"value":143733},"Unified delivers change events for Google Drive using virtual webhooks:",{"type":17,"tag":80,"props":143735,"children":143736},{},[143737,143741,143745],{"type":17,"tag":84,"props":143738,"children":143739},{},[143740],{"type":23,"value":109207},{"type":17,"tag":84,"props":143742,"children":143743},{},[143744],{"type":23,"value":109214},{"type":17,"tag":84,"props":143746,"children":143747},{},[143748],{"type":23,"value":109221},{"type":17,"tag":29,"props":143750,"children":143751},{},[143752],{"type":23,"value":143753},"This provides webhook-style notifications without requiring you to build Pub/Sub consumers.",{"type":17,"tag":29,"props":143755,"children":143756},{},[143757,143759,143766],{"type":23,"value":143758},"If you're evaluating broader integration architecture, review our overview of ",{"type":17,"tag":133,"props":143760,"children":143763},{"href":143761,"rel":143762},"https://unified.to/blog/unified-apis-unlocking-seamless-saas-integrations-and-ai-copilots",[214],[143764],{"type":23,"value":143765},"Unified APIs for SaaS integrations and AI copilots",{"type":23,"value":54},{"type":17,"tag":68,"props":143768,"children":143769},{"id":72006},[143770],{"type":23,"value":129510},{"type":17,"tag":239,"props":143772,"children":143773},{"id":129513},[143774],{"type":23,"value":129516},{"type":17,"tag":80,"props":143776,"children":143777},{},[143778,143783,143788],{"type":17,"tag":84,"props":143779,"children":143780},{},[143781],{"type":23,"value":143782},"Google Drive is your only storage integration",{"type":17,"tag":84,"props":143784,"children":143785},{},[143786],{"type":23,"value":143787},"You require deep Drive-specific capabilities",{"type":17,"tag":84,"props":143789,"children":143790},{},[143791],{"type":23,"value":143792},"You want full control over OAuth and event infrastructure",{"type":17,"tag":239,"props":143794,"children":143795},{"id":72041},[143796],{"type":23,"value":129539},{"type":17,"tag":80,"props":143798,"children":143799},{},[143800,143805,143810,143815,143819],{"type":17,"tag":84,"props":143801,"children":143802},{},[143803],{"type":23,"value":143804},"You support multiple storage providers",{"type":17,"tag":84,"props":143806,"children":143807},{},[143808],{"type":23,"value":143809},"You want one normalized file storage surface",{"type":17,"tag":84,"props":143811,"children":143812},{},[143813],{"type":23,"value":143814},"You prefer not to build OAuth lifecycle logic",{"type":17,"tag":84,"props":143816,"children":143817},{},[143818],{"type":23,"value":131061},{"type":17,"tag":84,"props":143820,"children":143821},{},[143822],{"type":23,"value":143823},"You want usage-based pricing rather than per-connection billing",{"type":17,"tag":68,"props":143825,"children":143826},{"id":1552},[143827],{"type":23,"value":44411},{"type":17,"tag":29,"props":143829,"children":143830},{},[143831],{"type":23,"value":143832},"Google Drive API integration is straightforward at the endpoint level. The engineering complexity lies in authentication, pagination, change detection, and secure multi-tenant architecture.",{"type":17,"tag":29,"props":143834,"children":143835},{},[143836],{"type":23,"value":143837},"If file storage is part of your core product surface, designing your integration architecture carefully will determine how quickly you can ship and how reliably you can scale.",{"type":17,"tag":29,"props":143839,"children":143840},{},[143841],{"type":17,"tag":133,"props":143842,"children":143844},{"href":1612,"rel":143843},[214],[143845],{"type":23,"value":44481},{"type":17,"tag":29,"props":143847,"children":143848},{},[143849],{"type":17,"tag":133,"props":143850,"children":143852},{"href":1623,"rel":143851},[214],[143853],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":143855},[143856,143863,143869,143874,143875,143880,143884],{"id":142629,"depth":1629,"text":142632,"children":143857},[143858,143859,143860,143861,143862],{"id":142635,"depth":1635,"text":142638},{"id":127328,"depth":1635,"text":129838},{"id":142778,"depth":1635,"text":142781},{"id":130057,"depth":1635,"text":130060},{"id":130130,"depth":1635,"text":130133},{"id":143037,"depth":1629,"text":143040,"children":143864},[143865,143866,143867,143868],{"id":143056,"depth":1635,"text":143059},{"id":143159,"depth":1635,"text":143162},{"id":143185,"depth":1635,"text":143188},{"id":134930,"depth":1635,"text":134933},{"id":143272,"depth":1629,"text":143275,"children":143870},[143871,143872,143873],{"id":143283,"depth":1635,"text":143286},{"id":143310,"depth":1635,"text":143313},{"id":143361,"depth":1635,"text":143364},{"id":143388,"depth":1629,"text":143391},{"id":143457,"depth":1629,"text":143460,"children":143876},[143877,143878,143879],{"id":143473,"depth":1635,"text":143476},{"id":143580,"depth":1635,"text":143583},{"id":143618,"depth":1635,"text":143621},{"id":72006,"depth":1629,"text":129510,"children":143881},[143882,143883],{"id":129513,"depth":1635,"text":129516},{"id":72041,"depth":1635,"text":129539},{"id":1552,"depth":1629,"text":44411},"content:blog:how_to_integrate_with.md","blog/how_to_integrate_with.md","blog/how_to_integrate_with",{"_path":143889,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":143890,"description":143891,"img":143892,"date":143893,"tag":12,"body":143894,"_type":1677,"_id":144737,"_source":1679,"_file":144738,"_stem":144739,"_extension":1682},"/blog/task_management_mcp_servers_real_time_project_and_task_actions_for_ai_agents","Task Management MCP Servers: Real-Time Project & Task Actions for AI Agents","Modern SaaS products don't just read task data. They create tasks, update status, assign owners, add comments, and analyze change history across systems like...","https://s3.us-east-2.amazonaws.com/unified-article-images/task_management_mcp_servers_real_time_project_and_task_actions_for_ai_agents-icon.png","2026-02-20T15:13:00.000Z",{"type":14,"children":143895,"toc":144726},[143896,143901,143904,143911,143916,143921,143932,143943,143948,143985,143991,143996,144001,144048,144053,144058,144063,144068,144073,144078,144086,144091,144099,144104,144112,144117,144125,144130,144138,144143,144148,144154,144159,144164,144169,144174,144179,144184,144189,144194,144199,144204,144209,144222,144228,144233,144238,144243,144311,144316,144321,144344,144350,144355,144359,144412,144417,144422,144428,144432,144447,144452,144457,144475,144480,144507,144512,144518,144523,144528,144533,144556,144561,144566,144571,144594,144598,144603,144608,144613,144619,144624,144629,144634,144639,144644,144662,144667,144673,144678,144705,144710,144718],{"type":17,"tag":18,"props":143897,"children":143899},{"id":143898},"task-management-mcp-servers-real-time-project-task-actions-for-ai-agents",[143900],{"type":23,"value":143890},{"type":17,"tag":25,"props":143902,"children":143903},{},[],{"type":17,"tag":29,"props":143905,"children":143906},{},[143907],{"type":17,"tag":33,"props":143908,"children":143909},{},[143910],{"type":23,"value":136280},{"type":17,"tag":29,"props":143912,"children":143913},{},[143914],{"type":23,"value":143915},"Modern SaaS products don't just read task data. They create tasks, update status, assign owners, add comments, and analyze change history across systems like Asana, Jira, ClickUp, GitHub, Linear, and more.",{"type":17,"tag":29,"props":143917,"children":143918},{},[143919],{"type":23,"value":143920},"If your product embeds AI features that interact with project and task data, you need authorized reads and writes across task platforms — without building and maintaining each integration separately.",{"type":17,"tag":29,"props":143922,"children":143923},{},[143924,143926,143930],{"type":23,"value":143925},"This is where Task / Project Management + ",{"type":17,"tag":133,"props":143927,"children":143928},{"href":326},[143929],{"type":23,"value":329},{"type":23,"value":143931}," come together.",{"type":17,"tag":29,"props":143933,"children":143934},{},[143935,143937,143941],{"type":23,"value":143936},"Unified's Task Management category provides a normalized, real-time API across 21+ task management integrations. ",{"type":17,"tag":133,"props":143938,"children":143939},{"href":326},[143940],{"type":23,"value":45418},{"type":23,"value":143942}," allows LLMs to call those task operations as structured tools.",{"type":17,"tag":29,"props":143944,"children":143945},{},[143946],{"type":23,"value":143947},"This post explains:",{"type":17,"tag":80,"props":143949,"children":143950},{},[143951,143956,143961,143966,143975,143980],{"type":17,"tag":84,"props":143952,"children":143953},{},[143954],{"type":23,"value":143955},"What Task Management MCP is",{"type":17,"tag":84,"props":143957,"children":143958},{},[143959],{"type":23,"value":143960},"What tools are available",{"type":17,"tag":84,"props":143962,"children":143963},{},[143964],{"type":23,"value":143965},"Provider write variability",{"type":17,"tag":84,"props":143967,"children":143968},{},[143969,143973],{"type":17,"tag":133,"props":143970,"children":143971},{"href":135},[143972],{"type":23,"value":3279},{"type":23,"value":143974}," and execution behavior",{"type":17,"tag":84,"props":143976,"children":143977},{},[143978],{"type":23,"value":143979},"Model tool limits",{"type":17,"tag":84,"props":143981,"children":143982},{},[143983],{"type":23,"value":143984},"When to use the Task API vs MCP",{"type":17,"tag":68,"props":143986,"children":143988},{"id":143987},"what-task-management-mcp-is",[143989],{"type":23,"value":143990},"What Task Management MCP Is",{"type":17,"tag":29,"props":143992,"children":143993},{},[143994],{"type":23,"value":143995},"Task Management MCP is the structured tool-calling layer built on top of the Unified Task Management API.",{"type":17,"tag":29,"props":143997,"children":143998},{},[143999],{"type":23,"value":144000},"In our architecture:",{"type":17,"tag":80,"props":144002,"children":144003},{},[144004,144028,144033,144038,144043],{"type":17,"tag":84,"props":144005,"children":144006},{},[144007,144009],{"type":23,"value":144008},"The Task Management category defines normalized objects:\n",{"type":17,"tag":80,"props":144010,"children":144011},{},[144012,144016,144020,144024],{"type":17,"tag":84,"props":144013,"children":144014},{},[144015],{"type":23,"value":13344},{"type":17,"tag":84,"props":144017,"children":144018},{},[144019],{"type":23,"value":13357},{"type":17,"tag":84,"props":144021,"children":144022},{},[144023],{"type":23,"value":13370},{"type":17,"tag":84,"props":144025,"children":144026},{},[144027],{"type":23,"value":13383},{"type":17,"tag":84,"props":144029,"children":144030},{},[144031],{"type":23,"value":144032},"Each object exposes documented operations.",{"type":17,"tag":84,"props":144034,"children":144035},{},[144036],{"type":23,"value":144037},"The MCP server sits on top of the Task API.",{"type":17,"tag":84,"props":144039,"children":144040},{},[144041],{"type":23,"value":144042},"Each tool call maps to one API request.",{"type":17,"tag":84,"props":144044,"children":144045},{},[144046],{"type":23,"value":144047},"Each API request is routed directly to the source provider.",{"type":17,"tag":29,"props":144049,"children":144050},{},[144051],{"type":23,"value":144052},"Execution path:",{"type":17,"tag":29,"props":144054,"children":144055},{},[144056],{"type":23,"value":144057},"User → LLM → Task tool call → Unified Task API → Source platform",{"type":17,"tag":29,"props":144059,"children":144060},{},[144061],{"type":23,"value":144062},"There is no caching layer.",{"type":17,"tag":29,"props":144064,"children":144065},{},[144066],{"type":23,"value":144067},"There is no stored task database.",{"type":17,"tag":29,"props":144069,"children":144070},{},[144071],{"type":23,"value":144072},"Each tool call executes directly against the connected provider at call time.",{"type":17,"tag":68,"props":144074,"children":144075},{"id":950},[144076],{"type":23,"value":144077},"Use Cases",{"type":17,"tag":29,"props":144079,"children":144080},{},[144081],{"type":17,"tag":48,"props":144082,"children":144083},{},[144084],{"type":23,"value":144085},"Create task",{"type":17,"tag":29,"props":144087,"children":144088},{},[144089],{"type":23,"value":144090},"An AI assistant converts meeting notes into structured tasks.",{"type":17,"tag":29,"props":144092,"children":144093},{},[144094],{"type":17,"tag":48,"props":144095,"children":144096},{},[144097],{"type":23,"value":144098},"Update task status",{"type":17,"tag":29,"props":144100,"children":144101},{},[144102],{"type":23,"value":144103},"The model adjusts status based on progress signals where provider workflows allow it.",{"type":17,"tag":29,"props":144105,"children":144106},{},[144107],{"type":17,"tag":48,"props":144108,"children":144109},{},[144110],{"type":23,"value":144111},"Assign task",{"type":17,"tag":29,"props":144113,"children":144114},{},[144115],{"type":23,"value":144116},"The agent updates assigned users when the provider supports assignment writes.",{"type":17,"tag":29,"props":144118,"children":144119},{},[144120],{"type":17,"tag":48,"props":144121,"children":144122},{},[144123],{"type":23,"value":144124},"Comment on task",{"type":17,"tag":29,"props":144126,"children":144127},{},[144128],{"type":23,"value":144129},"The model posts contextual summaries or follow-ups.",{"type":17,"tag":29,"props":144131,"children":144132},{},[144133],{"type":17,"tag":48,"props":144134,"children":144135},{},[144136],{"type":23,"value":144137},"Analyze change history",{"type":17,"tag":29,"props":144139,"children":144140},{},[144141],{"type":23,"value":144142},"The agent retrieves Change objects to summarize how a task evolved over time.",{"type":17,"tag":29,"props":144144,"children":144145},{},[144146],{"type":23,"value":144147},"These are embedded product features — not automation scripts.",{"type":17,"tag":68,"props":144149,"children":144151},{"id":144150},"unified-task-tool-surface",[144152],{"type":23,"value":144153},"Unified Task Tool Surface",{"type":17,"tag":29,"props":144155,"children":144156},{},[144157],{"type":23,"value":144158},"The Task Management API defines four object types.",{"type":17,"tag":29,"props":144160,"children":144161},{},[144162],{"type":23,"value":144163},"Projects support:",{"type":17,"tag":29,"props":144165,"children":144166},{},[144167],{"type":23,"value":144168},"Create, List, Retrieve, Update (PUT), Delete. PATCH operations are defined in the OpenAPI specification.",{"type":17,"tag":29,"props":144170,"children":144171},{},[144172],{"type":23,"value":144173},"Tasks support:",{"type":17,"tag":29,"props":144175,"children":144176},{},[144177],{"type":23,"value":144178},"Create, List, Retrieve, Update (PUT), Delete. PATCH operations are also defined in OpenAPI.",{"type":17,"tag":29,"props":144180,"children":144181},{},[144182],{"type":23,"value":144183},"Comments support:",{"type":17,"tag":29,"props":144185,"children":144186},{},[144187],{"type":23,"value":144188},"Create, List, Retrieve, Update (PUT), Delete. PATCH is defined in OpenAPI.",{"type":17,"tag":29,"props":144190,"children":144191},{},[144192],{"type":23,"value":144193},"Change objects are read-only:",{"type":17,"tag":29,"props":144195,"children":144196},{},[144197],{"type":23,"value":144198},"List and Retrieve only. They represent task-level audit events including field-level diffs and timestamps.",{"type":17,"tag":29,"props":144200,"children":144201},{},[144202],{"type":23,"value":144203},"Across these objects, the category exposes 21 unified tools.",{"type":17,"tag":29,"props":144205,"children":144206},{},[144207],{"type":23,"value":144208},"Tool availability at runtime depends on:",{"type":17,"tag":80,"props":144210,"children":144211},{},[144212,144217],{"type":17,"tag":84,"props":144213,"children":144214},{},[144215],{"type":23,"value":144216},"Provider feature support",{"type":17,"tag":84,"props":144218,"children":144219},{},[144220],{"type":23,"value":144221},"Connection permissions",{"type":17,"tag":68,"props":144223,"children":144225},{"id":144224},"provider-variability",[144226],{"type":23,"value":144227},"Provider Variability",{"type":17,"tag":29,"props":144229,"children":144230},{},[144231],{"type":23,"value":144232},"The schema is normalized. Capability is not.",{"type":17,"tag":29,"props":144234,"children":144235},{},[144236],{"type":23,"value":144237},"Write behavior varies significantly by provider.",{"type":17,"tag":29,"props":144239,"children":144240},{},[144241],{"type":23,"value":144242},"Examples documented in the integration matrix:",{"type":17,"tag":80,"props":144244,"children":144245},{},[144246,144257,144268,144279,144296,144301,144306],{"type":17,"tag":84,"props":144247,"children":144248},{},[144249,144251,144256],{"type":23,"value":144250},"Some providers do not allow updating ",{"type":17,"tag":6121,"props":144252,"children":144254},{"className":144253},[],[144255],{"type":23,"value":19949},{"type":23,"value":54},{"type":17,"tag":84,"props":144258,"children":144259},{},[144260,144262,144267],{"type":23,"value":144261},"Some do not allow writing ",{"type":17,"tag":6121,"props":144263,"children":144265},{"className":144264},[],[144266],{"type":23,"value":124824},{"type":23,"value":54},{"type":17,"tag":84,"props":144269,"children":144270},{},[144271,144273,144278],{"type":23,"value":144272},"Some do not allow setting ",{"type":17,"tag":6121,"props":144274,"children":144276},{"className":144275},[],[144277],{"type":23,"value":124748},{"type":23,"value":54},{"type":17,"tag":84,"props":144280,"children":144281},{},[144282,144284,144289,144290,144295],{"type":23,"value":144283},"Some do not expose writable ",{"type":17,"tag":6121,"props":144285,"children":144287},{"className":144286},[],[144288],{"type":23,"value":24704},{"type":23,"value":75890},{"type":17,"tag":6121,"props":144291,"children":144293},{"className":144292},[],[144294],{"type":23,"value":124766},{"type":23,"value":54},{"type":17,"tag":84,"props":144297,"children":144298},{},[144299],{"type":23,"value":144300},"Some integrations are effectively read-only for tasks.",{"type":17,"tag":84,"props":144302,"children":144303},{},[144304],{"type":23,"value":144305},"Comment editing and deletion vary by provider.",{"type":17,"tag":84,"props":144307,"children":144308},{},[144309],{"type":23,"value":144310},"Task deletion is not universally supported.",{"type":17,"tag":29,"props":144312,"children":144313},{},[144314],{"type":23,"value":144315},"Because Unified executes in pass-through mode, provider constraints apply at execution time.",{"type":17,"tag":29,"props":144317,"children":144318},{},[144319],{"type":23,"value":144320},"Agents must:",{"type":17,"tag":80,"props":144322,"children":144323},{},[144324,144329,144334,144339],{"type":17,"tag":84,"props":144325,"children":144326},{},[144327],{"type":23,"value":144328},"Handle validation failures",{"type":17,"tag":84,"props":144330,"children":144331},{},[144332],{"type":23,"value":144333},"Not assume universal deletion support",{"type":17,"tag":84,"props":144335,"children":144336},{},[144337],{"type":23,"value":144338},"Not assume universal status mutation",{"type":17,"tag":84,"props":144340,"children":144341},{},[144342],{"type":23,"value":144343},"Respect provider-specific workflow semantics",{"type":17,"tag":68,"props":144345,"children":144347},{"id":144346},"rate-limits-and-execution-behavior",[144348],{"type":23,"value":144349},"Rate Limits and Execution Behavior",{"type":17,"tag":29,"props":144351,"children":144352},{},[144353],{"type":23,"value":144354},"Each Task MCP tool call is a direct API request to the underlying provider.",{"type":17,"tag":29,"props":144356,"children":144357},{},[144358],{"type":23,"value":7403},{"type":17,"tag":80,"props":144360,"children":144361},{},[144362,144367,144372,144377,144407],{"type":17,"tag":84,"props":144363,"children":144364},{},[144365],{"type":23,"value":144366},"Provider rate limits apply.",{"type":17,"tag":84,"props":144368,"children":144369},{},[144370],{"type":23,"value":144371},"List endpoints return a maximum of 100 records per page.",{"type":17,"tag":84,"props":144373,"children":144374},{},[144375],{"type":23,"value":144376},"Pagination via offset is required.",{"type":17,"tag":84,"props":144378,"children":144379},{},[144380,144382,144387,144388,144393,144394,144399,144400,144405],{"type":23,"value":144381},"Filters such as ",{"type":17,"tag":6121,"props":144383,"children":144385},{"className":144384},[],[144386],{"type":23,"value":26291},{"type":23,"value":11826},{"type":17,"tag":6121,"props":144389,"children":144391},{"className":144390},[],[144392],{"type":23,"value":124715},{"type":23,"value":11826},{"type":17,"tag":6121,"props":144395,"children":144397},{"className":144396},[],[144398],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":144401,"children":144403},{"className":144402},[],[144404],{"type":23,"value":62582},{"type":23,"value":144406},", and date ranges reduce call volume.",{"type":17,"tag":84,"props":144408,"children":144409},{},[144410],{"type":23,"value":144411},"Exponential backoff with jitter should be implemented for 429 responses.",{"type":17,"tag":29,"props":144413,"children":144414},{},[144415],{"type":23,"value":144416},"Webhook retry and backoff logic is handled by Unified for webhook-based event delivery.",{"type":17,"tag":29,"props":144418,"children":144419},{},[144420],{"type":23,"value":144421},"No Task-specific rate-limit behavior is documented beyond general provider constraints.",{"type":17,"tag":68,"props":144423,"children":144425},{"id":144424},"model-tool-limits",[144426],{"type":23,"value":144427},"Model Tool Limits",{"type":17,"tag":29,"props":144429,"children":144430},{},[144431],{"type":23,"value":136687},{"type":17,"tag":80,"props":144433,"children":144434},{},[144435,144439,144443],{"type":17,"tag":84,"props":144436,"children":144437},{},[144438],{"type":23,"value":136695},{"type":17,"tag":84,"props":144440,"children":144441},{},[144442],{"type":23,"value":136700},{"type":17,"tag":84,"props":144444,"children":144445},{},[144446],{"type":23,"value":136705},{"type":17,"tag":29,"props":144448,"children":144449},{},[144450],{"type":23,"value":144451},"The Task Management category exposes 21 unified tools.",{"type":17,"tag":29,"props":144453,"children":144454},{},[144455],{"type":23,"value":144456},"Arithmetic comparison:",{"type":17,"tag":80,"props":144458,"children":144459},{},[144460,144465,144470],{"type":17,"tag":84,"props":144461,"children":144462},{},[144463],{"type":23,"value":144464},"21 > 10 → exceeds Groq by 11 tools.",{"type":17,"tag":84,"props":144466,"children":144467},{},[144468],{"type":23,"value":144469},"21 > 20 → exceeds OpenAI by 1 tool.",{"type":17,"tag":84,"props":144471,"children":144472},{},[144473],{"type":23,"value":144474},"21 \u003C 50 → within Cohere limit.",{"type":17,"tag":29,"props":144476,"children":144477},{},[144478],{"type":23,"value":144479},"Tool surface must therefore be restricted in production using:",{"type":17,"tag":80,"props":144481,"children":144482},{},[144483,144491,144499],{"type":17,"tag":84,"props":144484,"children":144485},{},[144486],{"type":17,"tag":6121,"props":144487,"children":144489},{"className":144488},[],[144490],{"type":23,"value":24204},{"type":17,"tag":84,"props":144492,"children":144493},{},[144494],{"type":17,"tag":6121,"props":144495,"children":144497},{"className":144496},[],[144498],{"type":23,"value":131599},{"type":17,"tag":84,"props":144500,"children":144501},{},[144502],{"type":17,"tag":6121,"props":144503,"children":144505},{"className":144504},[],[144506],{"type":23,"value":131610},{"type":17,"tag":29,"props":144508,"children":144509},{},[144510],{"type":23,"value":144511},"Tool restriction is required, not optional.",{"type":17,"tag":68,"props":144513,"children":144515},{"id":144514},"task-api-vs-task-mcp",[144516],{"type":23,"value":144517},"Task API vs Task MCP",{"type":17,"tag":29,"props":144519,"children":144520},{},[144521],{"type":23,"value":144522},"Both rely on the same real-time Task Management infrastructure.",{"type":17,"tag":29,"props":144524,"children":144525},{},[144526],{"type":23,"value":144527},"The difference is who decides which action to execute.",{"type":17,"tag":29,"props":144529,"children":144530},{},[144531],{"type":23,"value":144532},"Use the Unified Task API when:",{"type":17,"tag":80,"props":144534,"children":144535},{},[144536,144541,144546,144551],{"type":17,"tag":84,"props":144537,"children":144538},{},[144539],{"type":23,"value":144540},"Your backend controls business logic.",{"type":17,"tag":84,"props":144542,"children":144543},{},[144544],{"type":23,"value":144545},"You fetch tasks for analytics.",{"type":17,"tag":84,"props":144547,"children":144548},{},[144549],{"type":23,"value":144550},"You generate embeddings.",{"type":17,"tag":84,"props":144552,"children":144553},{},[144554],{"type":23,"value":144555},"You orchestrate deterministic updates.",{"type":17,"tag":29,"props":144557,"children":144558},{},[144559],{"type":23,"value":144560},"Execution:",{"type":17,"tag":29,"props":144562,"children":144563},{},[144564],{"type":23,"value":144565},"App → Unified Task API → Source platform",{"type":17,"tag":29,"props":144567,"children":144568},{},[144569],{"type":23,"value":144570},"Use Task MCP when:",{"type":17,"tag":80,"props":144572,"children":144573},{},[144574,144579,144584,144589],{"type":17,"tag":84,"props":144575,"children":144576},{},[144577],{"type":23,"value":144578},"The LLM decides which task action to execute.",{"type":17,"tag":84,"props":144580,"children":144581},{},[144582],{"type":23,"value":144583},"You are embedding an AI copilot inside your product.",{"type":17,"tag":84,"props":144585,"children":144586},{},[144587],{"type":23,"value":144588},"You need structured function-calling.",{"type":17,"tag":84,"props":144590,"children":144591},{},[144592],{"type":23,"value":144593},"You want strict authorization boundaries.",{"type":17,"tag":29,"props":144595,"children":144596},{},[144597],{"type":23,"value":144560},{"type":17,"tag":29,"props":144599,"children":144600},{},[144601],{"type":23,"value":144602},"User → LLM → Tool call → Unified Task API → Source platform",{"type":17,"tag":29,"props":144604,"children":144605},{},[144606],{"type":23,"value":144607},"The infrastructure remains the same.",{"type":17,"tag":29,"props":144609,"children":144610},{},[144611],{"type":23,"value":144612},"The decision-maker changes.",{"type":17,"tag":68,"props":144614,"children":144616},{"id":144615},"why-task-management-is-a-strong-mcp-category",[144617],{"type":23,"value":144618},"Why Task Management Is a Strong MCP Category",{"type":17,"tag":29,"props":144620,"children":144621},{},[144622],{"type":23,"value":144623},"Task data is operational and structured.",{"type":17,"tag":29,"props":144625,"children":144626},{},[144627],{"type":23,"value":144628},"Writes are bounded to project and task objects.",{"type":17,"tag":29,"props":144630,"children":144631},{},[144632],{"type":23,"value":144633},"Most actions are reversible.",{"type":17,"tag":29,"props":144635,"children":144636},{},[144637],{"type":23,"value":144638},"The object model maps cleanly to LLM reasoning patterns.",{"type":17,"tag":29,"props":144640,"children":144641},{},[144642],{"type":23,"value":144643},"And it pairs naturally with:",{"type":17,"tag":80,"props":144645,"children":144646},{},[144647,144652,144657],{"type":17,"tag":84,"props":144648,"children":144649},{},[144650],{"type":23,"value":144651},"Calendar (create follow-up task from meeting)",{"type":17,"tag":84,"props":144653,"children":144654},{},[144655],{"type":23,"value":144656},"CRM (create task from deal update)",{"type":17,"tag":84,"props":144658,"children":144659},{},[144660],{"type":23,"value":144661},"Messaging (convert Slack thread into task)",{"type":17,"tag":29,"props":144663,"children":144664},{},[144665],{"type":23,"value":144666},"Task Management MCP enables agent-executable productivity features without building per-provider integrations.",{"type":17,"tag":68,"props":144668,"children":144670},{"id":144669},"build-real-time-task-agents",[144671],{"type":23,"value":144672},"Build Real-Time Task Agents",{"type":17,"tag":29,"props":144674,"children":144675},{},[144676],{"type":23,"value":144677},"With Task Management MCP, your agents can:",{"type":17,"tag":80,"props":144679,"children":144680},{},[144681,144686,144690,144695,144700],{"type":17,"tag":84,"props":144682,"children":144683},{},[144684],{"type":23,"value":144685},"Create tasks",{"type":17,"tag":84,"props":144687,"children":144688},{},[144689],{"type":23,"value":144098},{"type":17,"tag":84,"props":144691,"children":144692},{},[144693],{"type":23,"value":144694},"Assign users",{"type":17,"tag":84,"props":144696,"children":144697},{},[144698],{"type":23,"value":144699},"Add comments",{"type":17,"tag":84,"props":144701,"children":144702},{},[144703],{"type":23,"value":144704},"Retrieve change history",{"type":17,"tag":29,"props":144706,"children":144707},{},[144708],{"type":23,"value":144709},"All directly against the connected provider.",{"type":17,"tag":29,"props":144711,"children":144712},{},[144713],{"type":17,"tag":133,"props":144714,"children":144716},{"href":1612,"rel":144715},[214],[144717],{"type":23,"value":44481},{"type":17,"tag":29,"props":144719,"children":144720},{},[144721],{"type":17,"tag":133,"props":144722,"children":144724},{"href":1623,"rel":144723},[214],[144725],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":144727},[144728,144729,144730,144731,144732,144733,144734,144735,144736],{"id":143987,"depth":1629,"text":143990},{"id":950,"depth":1629,"text":144077},{"id":144150,"depth":1629,"text":144153},{"id":144224,"depth":1629,"text":144227},{"id":144346,"depth":1629,"text":144349},{"id":144424,"depth":1629,"text":144427},{"id":144514,"depth":1629,"text":144517},{"id":144615,"depth":1629,"text":144618},{"id":144669,"depth":1629,"text":144672},"content:blog:task_management_mcp_servers_real_time_project_and_task_actions_for_ai_agents.md","blog/task_management_mcp_servers_real_time_project_and_task_actions_for_ai_agents.md","blog/task_management_mcp_servers_real_time_project_and_task_actions_for_ai_agents",{"_path":144741,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":144742,"description":144743,"img":144744,"date":144745,"tag":12,"body":144746,"_type":1677,"_id":145452,"_source":1679,"_file":145453,"_stem":145454,"_extension":1682},"/blog/how_to_integrate_with_the_salesforce_api_a_step_by_step_guide_for_b2b_saas_teams","How to Integrate with the Salesforce API: A Step-by-Step Guide for B2B SaaS Teams","Salesforce provides a comprehensive set of APIs that allow you to read, write, query, and subscribe to CRM data programmatically. But integrating Salesforce...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with_the_salesforce_api_a_step_by_step_guide_for_b2b_saas_teams-icon.png","2026-02-20T13:18:00.000Z",{"type":14,"children":144747,"toc":145435},[144748,144753,144756,144763,144768,144785,144789,144815,144828,144834,144840,144845,144850,144884,144893,144915,144920,144925,144938,144943,144949,144954,144959,144982,144987,144992,145022,145027,145033,145044,145049,145058,145063,145068,145077,145082,145088,145093,145098,145107,145112,145117,145123,145128,145132,145137,145142,145148,145153,145158,145164,145169,145174,145179,145185,145190,145228,145233,145238,145244,145249,145254,145287,145292,145300,145311,145316,145325,145330,145342,145346,145351,145368,145372,145400,145404,145409,145414,145419,145427],{"type":17,"tag":18,"props":144749,"children":144751},{"id":144750},"how-to-integrate-with-the-salesforce-api-a-step-by-step-guide-for-b2b-saas-teams",[144752],{"type":23,"value":144742},{"type":17,"tag":25,"props":144754,"children":144755},{},[],{"type":17,"tag":29,"props":144757,"children":144758},{},[144759],{"type":17,"tag":33,"props":144760,"children":144761},{},[144762],{"type":23,"value":136280},{"type":17,"tag":29,"props":144764,"children":144765},{},[144766],{"type":23,"value":144767},"Salesforce provides a comprehensive set of APIs that allow you to read, write, query, and subscribe to CRM data programmatically. But integrating Salesforce into a production B2B SaaS product involves more than sending a single REST request.",{"type":17,"tag":29,"props":144769,"children":144770},{},[144771,144773,144777,144779,144783],{"type":23,"value":144772},"You must handle ",{"type":17,"tag":133,"props":144774,"children":144775},{"href":779},[144776],{"type":23,"value":782},{"type":23,"value":144778}," 2.0 authentication, token lifecycle management, API limits, ",{"type":17,"tag":133,"props":144780,"children":144781},{"href":1857},[144782],{"type":23,"value":1860},{"type":23,"value":144784},", and real-time change notifications.",{"type":17,"tag":29,"props":144786,"children":144787},{},[144788],{"type":23,"value":70164},{"type":17,"tag":6154,"props":144790,"children":144791},{},[144792,144797,144802,144811],{"type":17,"tag":84,"props":144793,"children":144794},{},[144795],{"type":23,"value":144796},"How to integrate directly with the Salesforce REST API",{"type":17,"tag":84,"props":144798,"children":144799},{},[144800],{"type":23,"value":144801},"What you'll own in production",{"type":17,"tag":84,"props":144803,"children":144804},{},[144805,144807],{"type":23,"value":144806},"How to integrate Salesforce using Unified's ",{"type":17,"tag":133,"props":144808,"children":144809},{"href":61562},[144810],{"type":23,"value":61565},{"type":17,"tag":84,"props":144812,"children":144813},{},[144814],{"type":23,"value":70187},{"type":17,"tag":29,"props":144816,"children":144817},{},[144818,144820,144827],{"type":23,"value":144819},"If you're also evaluating other CRMs, you can compare this with our guide on ",{"type":17,"tag":133,"props":144821,"children":144824},{"href":144822,"rel":144823},"https://chatgpt.com/blog/how-to-integrate-with-hubspot-api",[214],[144825],{"type":23,"value":144826},"how to integrate with the HubSpot API",{"type":23,"value":54},{"type":17,"tag":68,"props":144829,"children":144831},{"id":144830},"direct-salesforce-rest-api-integration",[144832],{"type":23,"value":144833},"Direct Salesforce REST API Integration",{"type":17,"tag":239,"props":144835,"children":144837},{"id":144836},"step-1-create-an-oauth-client-in-salesforce",[144838],{"type":23,"value":144839},"Step 1: Create an OAuth Client in Salesforce",{"type":17,"tag":29,"props":144841,"children":144842},{},[144843],{"type":23,"value":144844},"Before calling Salesforce APIs, you must register an OAuth-enabled application.",{"type":17,"tag":29,"props":144846,"children":144847},{},[144848],{"type":23,"value":144849},"In Salesforce Setup:",{"type":17,"tag":6154,"props":144851,"children":144852},{},[144853,144862,144867,144872],{"type":17,"tag":84,"props":144854,"children":144855},{},[144856,144857],{"type":23,"value":42939},{"type":17,"tag":48,"props":144858,"children":144859},{},[144860],{"type":23,"value":144861},"App Manager",{"type":17,"tag":84,"props":144863,"children":144864},{},[144865],{"type":23,"value":144866},"Create a new OAuth-enabled app (Connected App or External Client App, depending on your org configuration)",{"type":17,"tag":84,"props":144868,"children":144869},{},[144870],{"type":23,"value":144871},"Enable OAuth settings",{"type":17,"tag":84,"props":144873,"children":144874},{},[144875,144877,144882],{"type":23,"value":144876},"Provide a ",{"type":17,"tag":48,"props":144878,"children":144879},{},[144880],{"type":23,"value":144881},"Callback URL",{"type":23,"value":144883},", for example:",{"type":17,"tag":6893,"props":144885,"children":144888},{"className":144886,"code":144887,"language":20901,"meta":23},[20899],"https://yourapp.com/oauth/salesforce/callback\n",[144889],{"type":17,"tag":6121,"props":144890,"children":144891},{"__ignoreMap":7},[144892],{"type":23,"value":144887},{"type":17,"tag":6154,"props":144894,"children":144895},{},[144896],{"type":17,"tag":84,"props":144897,"children":144898},{},[144899,144901,144907,144908,144913],{"type":23,"value":144900},"Select required OAuth scopes such as ",{"type":17,"tag":6121,"props":144902,"children":144904},{"className":144903},[],[144905],{"type":23,"value":144906},"api",{"type":23,"value":34435},{"type":17,"tag":6121,"props":144909,"children":144911},{"className":144910},[],[144912],{"type":23,"value":77603},{"type":23,"value":144914}," if your integration requires offline access.",{"type":17,"tag":29,"props":144916,"children":144917},{},[144918],{"type":23,"value":144919},"Salesforce documents this setup process in their guide on creating OAuth-enabled apps in Setup.",{"type":17,"tag":29,"props":144921,"children":144922},{},[144923],{"type":23,"value":144924},"After saving, Salesforce provides:",{"type":17,"tag":80,"props":144926,"children":144927},{},[144928,144933],{"type":17,"tag":84,"props":144929,"children":144930},{},[144931],{"type":23,"value":144932},"Consumer Key (client_id)",{"type":17,"tag":84,"props":144934,"children":144935},{},[144936],{"type":23,"value":144937},"Consumer Secret (client_secret)",{"type":17,"tag":29,"props":144939,"children":144940},{},[144941],{"type":23,"value":144942},"These credentials are required for authentication.",{"type":17,"tag":239,"props":144944,"children":144946},{"id":144945},"step-2-implement-the-oauth-20-web-server-flow",[144947],{"type":23,"value":144948},"Step 2: Implement the OAuth 2.0 Web Server Flow",{"type":17,"tag":29,"props":144950,"children":144951},{},[144952],{"type":23,"value":144953},"For customer-facing SaaS products, Salesforce documents the Web Server Flow (authorization code grant) as the standard OAuth pattern.",{"type":17,"tag":29,"props":144955,"children":144956},{},[144957],{"type":23,"value":144958},"The high-level flow works as follows:",{"type":17,"tag":6154,"props":144960,"children":144961},{},[144962,144967,144972,144977],{"type":17,"tag":84,"props":144963,"children":144964},{},[144965],{"type":23,"value":144966},"Redirect the user to Salesforce's authorization endpoint",{"type":17,"tag":84,"props":144968,"children":144969},{},[144970],{"type":23,"value":144971},"The user logs in and grants consent",{"type":17,"tag":84,"props":144973,"children":144974},{},[144975],{"type":23,"value":144976},"Salesforce redirects back to your callback URL with an authorization code",{"type":17,"tag":84,"props":144978,"children":144979},{},[144980],{"type":23,"value":144981},"Your backend exchanges that code for an access token at Salesforce's token endpoint",{"type":17,"tag":29,"props":144983,"children":144984},{},[144985],{"type":23,"value":144986},"Salesforce provides full documentation for the Web Server Flow and OAuth endpoints in their official OAuth guide.",{"type":17,"tag":29,"props":144988,"children":144989},{},[144990],{"type":23,"value":144991},"The token response includes:",{"type":17,"tag":80,"props":144993,"children":144994},{},[144995,145003,145012],{"type":17,"tag":84,"props":144996,"children":144997},{},[144998],{"type":17,"tag":6121,"props":144999,"children":145001},{"className":145000},[],[145002],{"type":23,"value":77598},{"type":17,"tag":84,"props":145004,"children":145005},{},[145006],{"type":17,"tag":6121,"props":145007,"children":145009},{"className":145008},[],[145010],{"type":23,"value":145011},"instance_url",{"type":17,"tag":84,"props":145013,"children":145014},{},[145015,145017],{"type":23,"value":145016},"Optionally ",{"type":17,"tag":6121,"props":145018,"children":145020},{"className":145019},[],[145021],{"type":23,"value":77603},{"type":17,"tag":29,"props":145023,"children":145024},{},[145025],{"type":23,"value":145026},"You are responsible for securely storing tokens and implementing refresh logic when needed.",{"type":17,"tag":239,"props":145028,"children":145030},{"id":145029},"step-3-make-rest-api-requests",[145031],{"type":23,"value":145032},"Step 3: Make REST API Requests",{"type":17,"tag":29,"props":145034,"children":145035},{},[145036,145037,145042],{"type":23,"value":48249},{"type":17,"tag":6121,"props":145038,"children":145040},{"className":145039},[],[145041],{"type":23,"value":145011},{"type":23,"value":145043}," returned from the token exchange as your base URL.",{"type":17,"tag":29,"props":145045,"children":145046},{},[145047],{"type":23,"value":145048},"Example SOQL query:",{"type":17,"tag":6893,"props":145050,"children":145053},{"className":145051,"code":145052,"language":48432,"meta":7},[48430],"GET {instance_url}/services/data/vXX.X/query?q=SELECT+Id,Name+FROM+Account\nAuthorization: Bearer ACCESS_TOKEN\n",[145054],{"type":17,"tag":6121,"props":145055,"children":145056},{"__ignoreMap":7},[145057],{"type":23,"value":145052},{"type":17,"tag":29,"props":145059,"children":145060},{},[145061],{"type":23,"value":145062},"SOQL query behavior is documented in Salesforce's REST API Query resource reference.",{"type":17,"tag":29,"props":145064,"children":145065},{},[145066],{"type":23,"value":145067},"To inspect object metadata:",{"type":17,"tag":6893,"props":145069,"children":145072},{"className":145070,"code":145071,"language":48432,"meta":7},[48430],"GET {instance_url}/services/data/vXX.X/sobjects/Account/describe\nAuthorization: Bearer ACCESS_TOKEN\n",[145073],{"type":17,"tag":6121,"props":145074,"children":145075},{"__ignoreMap":7},[145076],{"type":23,"value":145071},{"type":17,"tag":29,"props":145078,"children":145079},{},[145080],{"type":23,"value":145081},"The Describe resource allows you to retrieve fields, relationships, and required field information for an object.",{"type":17,"tag":239,"props":145083,"children":145085},{"id":145084},"step-4-monitor-api-usage",[145086],{"type":23,"value":145087},"Step 4: Monitor API Usage",{"type":17,"tag":29,"props":145089,"children":145090},{},[145091],{"type":23,"value":145092},"Salesforce enforces per-org API limits. Production integrations should actively monitor usage.",{"type":17,"tag":29,"props":145094,"children":145095},{},[145096],{"type":23,"value":145097},"You can retrieve current allocations and remaining capacity using the REST Limits resource:",{"type":17,"tag":6893,"props":145099,"children":145102},{"className":145100,"code":145101,"language":48432,"meta":7},[48430],"GET {instance_url}/services/data/vXX.X/limits\nAuthorization: Bearer ACCESS_TOKEN\n",[145103],{"type":17,"tag":6121,"props":145104,"children":145105},{"__ignoreMap":7},[145106],{"type":23,"value":145101},{"type":17,"tag":29,"props":145108,"children":145109},{},[145110],{"type":23,"value":145111},"Salesforce documents the Limits resource and overall API allocation model in their API Limits reference.",{"type":17,"tag":29,"props":145113,"children":145114},{},[145115],{"type":23,"value":145116},"Monitoring limits is essential when running batch imports, background sync jobs, or large SOQL queries.",{"type":17,"tag":68,"props":145118,"children":145120},{"id":145119},"real-time-change-signals-in-salesforce",[145121],{"type":23,"value":145122},"Real-Time Change Signals in Salesforce",{"type":17,"tag":29,"props":145124,"children":145125},{},[145126],{"type":23,"value":145127},"Salesforce does not use traditional webhook endpoints by default. Instead, it provides event-driven change signals through its event bus.",{"type":17,"tag":239,"props":145129,"children":145130},{"id":96320},[145131],{"type":23,"value":96323},{"type":17,"tag":29,"props":145133,"children":145134},{},[145135],{"type":23,"value":145136},"Change Data Capture publishes events when supported records are created, updated, deleted, or undeleted.",{"type":17,"tag":29,"props":145138,"children":145139},{},[145140],{"type":23,"value":145141},"CDC subscription is supported through the Pub/Sub API. Salesforce documents CDC behavior in their Change Data Capture guide.",{"type":17,"tag":239,"props":145143,"children":145145},{"id":145144},"platform-events",[145146],{"type":23,"value":145147},"Platform Events",{"type":17,"tag":29,"props":145149,"children":145150},{},[145151],{"type":23,"value":145152},"Platform Events allow you to define custom event schemas and publish business events from Salesforce or external systems.",{"type":17,"tag":29,"props":145154,"children":145155},{},[145156],{"type":23,"value":145157},"Salesforce documents Platform Events in their official Platform Events overview.",{"type":17,"tag":239,"props":145159,"children":145161},{"id":145160},"pubsub-api",[145162],{"type":23,"value":145163},"Pub/Sub API",{"type":17,"tag":29,"props":145165,"children":145166},{},[145167],{"type":23,"value":145168},"Salesforce recommends the Pub/Sub API for subscribing to CDC and Platform Events.",{"type":17,"tag":29,"props":145170,"children":145171},{},[145172],{"type":23,"value":145173},"The Pub/Sub API uses gRPC over HTTP/2 and Apache Avro for event payload encoding. Salesforce provides an overview of Pub/Sub and a comparison with the legacy Streaming API in their developer documentation.",{"type":17,"tag":29,"props":145175,"children":145176},{},[145177],{"type":23,"value":145178},"Implementing event-driven integration in Salesforce requires additional setup compared to simple REST-based polling.",{"type":17,"tag":68,"props":145180,"children":145182},{"id":145181},"where-salesforce-integrations-become-operationally-complex",[145183],{"type":23,"value":145184},"Where Salesforce Integrations Become Operationally Complex",{"type":17,"tag":29,"props":145186,"children":145187},{},[145188],{"type":23,"value":145189},"A direct Salesforce integration requires you to manage:",{"type":17,"tag":80,"props":145191,"children":145192},{},[145193,145198,145203,145208,145213,145218,145223],{"type":17,"tag":84,"props":145194,"children":145195},{},[145196],{"type":23,"value":145197},"OAuth lifecycle and refresh logic",{"type":17,"tag":84,"props":145199,"children":145200},{},[145201],{"type":23,"value":145202},"Per-tenant token storage",{"type":17,"tag":84,"props":145204,"children":145205},{},[145206],{"type":23,"value":145207},"API limit monitoring and alerting",{"type":17,"tag":84,"props":145209,"children":145210},{},[145211],{"type":23,"value":145212},"SOQL pagination and query locator handling",{"type":17,"tag":84,"props":145214,"children":145215},{},[145216],{"type":23,"value":145217},"Object-level required fields that vary across customer orgs",{"type":17,"tag":84,"props":145219,"children":145220},{},[145221],{"type":23,"value":145222},"CDC or Platform Events infrastructure",{"type":17,"tag":84,"props":145224,"children":145225},{},[145226],{"type":23,"value":145227},"Regional login endpoints and sandbox vs production environments",{"type":17,"tag":29,"props":145229,"children":145230},{},[145231],{"type":23,"value":145232},"For a single internal integration, this may be manageable.",{"type":17,"tag":29,"props":145234,"children":145235},{},[145236],{"type":23,"value":145237},"For a multi-tenant SaaS product supporting many Salesforce customers, this becomes long-term infrastructure work.",{"type":17,"tag":68,"props":145239,"children":145241},{"id":145240},"integrating-salesforce-via-unifieds-crm-api",[145242],{"type":23,"value":145243},"Integrating Salesforce via Unified's CRM API",{"type":17,"tag":29,"props":145245,"children":145246},{},[145247],{"type":23,"value":145248},"If your roadmap includes multiple CRM platforms, maintaining separate OAuth, rate-limit handling, and event infrastructure for each provider increases complexity quickly.",{"type":17,"tag":29,"props":145250,"children":145251},{},[145252],{"type":23,"value":145253},"Unified provides a CRM-focused integration layer that abstracts:",{"type":17,"tag":80,"props":145255,"children":145256},{},[145257,145262,145267,145272,145277,145282],{"type":17,"tag":84,"props":145258,"children":145259},{},[145260],{"type":23,"value":145261},"OAuth exchange",{"type":17,"tag":84,"props":145263,"children":145264},{},[145265],{"type":23,"value":145266},"Token refresh",{"type":17,"tag":84,"props":145268,"children":145269},{},[145270],{"type":23,"value":145271},"Scope mapping",{"type":17,"tag":84,"props":145273,"children":145274},{},[145275],{"type":23,"value":145276},"Multi-tenant connection isolation",{"type":17,"tag":84,"props":145278,"children":145279},{},[145280],{"type":23,"value":145281},"Standardized CRM object models",{"type":17,"tag":84,"props":145283,"children":145284},{},[145285],{"type":23,"value":145286},"Webhook-style event delivery",{"type":17,"tag":29,"props":145288,"children":145289},{},[145290],{"type":23,"value":145291},"When integrating Salesforce through Unified, your Salesforce OAuth client's callback URL is set to:",{"type":17,"tag":6893,"props":145293,"children":145295},{"className":145294,"code":71416,"language":20901,"meta":23},[20899],[145296],{"type":17,"tag":6121,"props":145297,"children":145298},{"__ignoreMap":7},[145299],{"type":23,"value":71416},{"type":17,"tag":29,"props":145301,"children":145302},{},[145303,145305,145310],{"type":23,"value":145304},"After activating Salesforce in your Unified workspace and entering your client credentials, you authorize a customer account and receive a ",{"type":17,"tag":6121,"props":145306,"children":145308},{"className":145307},[],[145309],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":145312,"children":145313},{},[145314],{"type":23,"value":145315},"Example Unified CRM request:",{"type":17,"tag":6893,"props":145317,"children":145320},{"className":145318,"code":145319,"language":48432,"meta":7},[48430],"GET https://api.unified.to/crm/{connection_id}/company?limit=100\nAuthorization: Bearer YOUR_UNIFIED_API_KEY\n",[145321],{"type":17,"tag":6121,"props":145322,"children":145323},{"__ignoreMap":7},[145324],{"type":23,"value":145319},{"type":17,"tag":29,"props":145326,"children":145327},{},[145328],{"type":23,"value":145329},"Unified routes requests directly to Salesforce in real time and does not cache customer records.",{"type":17,"tag":29,"props":145331,"children":145332},{},[145333,145335,145341],{"type":23,"value":145334},"If you want to understand how this unified CRM approach works across multiple providers, see our ",{"type":17,"tag":133,"props":145336,"children":145338},{"href":143761,"rel":145337},[214],[145339],{"type":23,"value":145340},"Unified APIs overview for SaaS integrations and AI copilots",{"type":23,"value":54},{"type":17,"tag":68,"props":145343,"children":145344},{"id":72006},[145345],{"type":23,"value":129510},{"type":17,"tag":29,"props":145347,"children":145348},{},[145349],{"type":23,"value":145350},"Build directly with Salesforce if:",{"type":17,"tag":80,"props":145352,"children":145353},{},[145354,145359,145364],{"type":17,"tag":84,"props":145355,"children":145356},{},[145357],{"type":23,"value":145358},"Salesforce is your only CRM target",{"type":17,"tag":84,"props":145360,"children":145361},{},[145362],{"type":23,"value":145363},"You need deep Salesforce-specific platform capabilities",{"type":17,"tag":84,"props":145365,"children":145366},{},[145367],{"type":23,"value":143792},{"type":17,"tag":29,"props":145369,"children":145370},{},[145371],{"type":23,"value":98574},{"type":17,"tag":80,"props":145373,"children":145374},{},[145375,145380,145385,145390,145395],{"type":17,"tag":84,"props":145376,"children":145377},{},[145378],{"type":23,"value":145379},"You plan to support multiple CRM platforms",{"type":17,"tag":84,"props":145381,"children":145382},{},[145383],{"type":23,"value":145384},"You want a single CRM integration surface",{"type":17,"tag":84,"props":145386,"children":145387},{},[145388],{"type":23,"value":145389},"You prefer not to build and maintain OAuth infrastructure",{"type":17,"tag":84,"props":145391,"children":145392},{},[145393],{"type":23,"value":145394},"You want consistent CRUD patterns across providers",{"type":17,"tag":84,"props":145396,"children":145397},{},[145398],{"type":23,"value":145399},"You want usage-based pricing instead of per-connection billing",{"type":17,"tag":68,"props":145401,"children":145402},{"id":1552},[145403],{"type":23,"value":44411},{"type":17,"tag":29,"props":145405,"children":145406},{},[145407],{"type":23,"value":145408},"Integrating with the Salesforce API is straightforward at the endpoint level.",{"type":17,"tag":29,"props":145410,"children":145411},{},[145412],{"type":23,"value":145413},"Operating a production-grade Salesforce integration across many customer orgs is where complexity appears: authentication, limits, schema variability, and event-driven synchronization.",{"type":17,"tag":29,"props":145415,"children":145416},{},[145417],{"type":23,"value":145418},"Choosing the right integration architecture early determines how quickly you can ship, how safely you can scale, and how much infrastructure you'll maintain over time.",{"type":17,"tag":29,"props":145420,"children":145421},{},[145422],{"type":17,"tag":133,"props":145423,"children":145425},{"href":1612,"rel":145424},[214],[145426],{"type":23,"value":44481},{"type":17,"tag":29,"props":145428,"children":145429},{},[145430],{"type":17,"tag":133,"props":145431,"children":145433},{"href":1623,"rel":145432},[214],[145434],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":145436},[145437,145443,145448,145449,145450,145451],{"id":144830,"depth":1629,"text":144833,"children":145438},[145439,145440,145441,145442],{"id":144836,"depth":1635,"text":144839},{"id":144945,"depth":1635,"text":144948},{"id":145029,"depth":1635,"text":145032},{"id":145084,"depth":1635,"text":145087},{"id":145119,"depth":1629,"text":145122,"children":145444},[145445,145446,145447],{"id":96320,"depth":1635,"text":96323},{"id":145144,"depth":1635,"text":145147},{"id":145160,"depth":1635,"text":145163},{"id":145181,"depth":1629,"text":145184},{"id":145240,"depth":1629,"text":145243},{"id":72006,"depth":1629,"text":129510},{"id":1552,"depth":1629,"text":44411},"content:blog:how_to_integrate_with_the_salesforce_api_a_step_by_step_guide_for_b2b_saas_teams.md","blog/how_to_integrate_with_the_salesforce_api_a_step_by_step_guide_for_b2b_saas_teams.md","blog/how_to_integrate_with_the_salesforce_api_a_step_by_step_guide_for_b2b_saas_teams",{"_path":145456,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":145457,"description":145458,"img":145459,"date":145460,"tag":12,"body":145461,"_type":1677,"_id":146578,"_source":1679,"_file":146579,"_stem":146580,"_extension":1682},"/blog/calendar_and_meetings_mcp_servers_real_time_scheduling_actions_for_ai_agents","Calendar & Meetings MCP Servers: Real-Time Scheduling Actions for AI Agents","Modern SaaS products don't just display meeting data. They schedule meetings, retrieve context, update details, analyze availability, and increasingly — act on...","https://s3.us-east-2.amazonaws.com/unified-article-images/calendar_and_meetings_mcp_servers_real_time_scheduling_actions_for_ai_agents-icon.png","2026-02-20T13:03:00.000Z",{"type":14,"children":145462,"toc":146548},[145463,145468,145471,145478,145483,145488,145498,145509,145513,145553,145559,145564,145570,145588,145594,145607,145613,145636,145642,145660,145665,145671,145676,145680,145735,145739,145744,145748,145753,145758,145764,145769,145773,145804,145808,145835,145841,145849,145853,145881,145886,145897,145902,145929,145934,145940,145945,145957,145980,145985,146017,146022,146034,146040,146045,146081,146086,146091,146109,146115,146120,146129,146134,146139,146144,146162,146166,146171,146176,146181,146185,146213,146218,146222,146227,146231,146253,146258,146276,146282,146287,146292,146298,146321,146325,146330,146336,146358,146362,146367,146371,146375,146379,146384,146402,146407,146412,146439,146444,146450,146455,146483,146488,146493,146498,146503,146509,146532,146540],{"type":17,"tag":18,"props":145464,"children":145466},{"id":145465},"calendar-meetings-mcp-servers-real-time-scheduling-actions-for-ai-agents",[145467],{"type":23,"value":145457},{"type":17,"tag":25,"props":145469,"children":145470},{},[],{"type":17,"tag":29,"props":145472,"children":145473},{},[145474],{"type":17,"tag":33,"props":145475,"children":145476},{},[145477],{"type":23,"value":136280},{"type":17,"tag":29,"props":145479,"children":145480},{},[145481],{"type":23,"value":145482},"Modern SaaS products don't just display meeting data. They schedule meetings, retrieve context, update details, analyze availability, and increasingly — act on calendar events directly.",{"type":17,"tag":29,"props":145484,"children":145485},{},[145486],{"type":23,"value":145487},"If your product embeds AI features that depend on scheduling data, you need authorized reads and writes across Google Calendar, Microsoft Outlook, Microsoft Teams, Zoom, Calendly, and others — without building and maintaining each integration separately.",{"type":17,"tag":29,"props":145489,"children":145490},{},[145491,145493,145497],{"type":23,"value":145492},"This is where Calendar & Meetings + ",{"type":17,"tag":133,"props":145494,"children":145495},{"href":326},[145496],{"type":23,"value":329},{"type":23,"value":143931},{"type":17,"tag":29,"props":145499,"children":145500},{},[145501,145503,145507],{"type":23,"value":145502},"Unified's Calendar & Meetings category provides a normalized, real-time API across supported providers. ",{"type":17,"tag":133,"props":145504,"children":145505},{"href":326},[145506],{"type":23,"value":45418},{"type":23,"value":145508}," allows LLMs to call those calendar operations as structured tools.",{"type":17,"tag":29,"props":145510,"children":145511},{},[145512],{"type":23,"value":143947},{"type":17,"tag":80,"props":145514,"children":145515},{},[145516,145521,145526,145531,145536,145544,145548],{"type":17,"tag":84,"props":145517,"children":145518},{},[145519],{"type":23,"value":145520},"What Calendar & Meetings MCP is",{"type":17,"tag":84,"props":145522,"children":145523},{},[145524],{"type":23,"value":145525},"What tools and objects are available",{"type":17,"tag":84,"props":145527,"children":145528},{},[145529],{"type":23,"value":145530},"Recurring event and attendee support",{"type":17,"tag":84,"props":145532,"children":145533},{},[145534],{"type":23,"value":145535},"Provider variability",{"type":17,"tag":84,"props":145537,"children":145538},{},[145539,145543],{"type":17,"tag":133,"props":145540,"children":145541},{"href":135},[145542],{"type":23,"value":3279},{"type":23,"value":143974},{"type":17,"tag":84,"props":145545,"children":145546},{},[145547],{"type":23,"value":143979},{"type":17,"tag":84,"props":145549,"children":145550},{},[145551],{"type":23,"value":145552},"When to use the Calendar API vs MCP",{"type":17,"tag":68,"props":145554,"children":145556},{"id":145555},"ai-native-calendar-use-cases",[145557],{"type":23,"value":145558},"AI-Native Calendar Use Cases",{"type":17,"tag":29,"props":145560,"children":145561},{},[145562],{"type":23,"value":145563},"Calendar & Meetings MCP enables:",{"type":17,"tag":239,"props":145565,"children":145567},{"id":145566},"schedule-meetings",[145568],{"type":23,"value":145569},"Schedule Meetings",{"type":17,"tag":80,"props":145571,"children":145572},{},[145573,145578,145583],{"type":17,"tag":84,"props":145574,"children":145575},{},[145576],{"type":23,"value":145577},"Create events",{"type":17,"tag":84,"props":145579,"children":145580},{},[145581],{"type":23,"value":145582},"Add attendees",{"type":17,"tag":84,"props":145584,"children":145585},{},[145586],{"type":23,"value":145587},"Configure recurrence",{"type":17,"tag":239,"props":145589,"children":145591},{"id":145590},"find-availability",[145592],{"type":23,"value":145593},"Find Availability",{"type":17,"tag":80,"props":145595,"children":145596},{},[145597,145602],{"type":17,"tag":84,"props":145598,"children":145599},{},[145600],{"type":23,"value":145601},"Retrieve free/busy",{"type":17,"tag":84,"props":145603,"children":145604},{},[145605],{"type":23,"value":145606},"Analyze time windows",{"type":17,"tag":239,"props":145608,"children":145610},{"id":145609},"update-event-details",[145611],{"type":23,"value":145612},"Update Event Details",{"type":17,"tag":80,"props":145614,"children":145615},{},[145616,145621,145626,145631],{"type":17,"tag":84,"props":145617,"children":145618},{},[145619],{"type":23,"value":145620},"Modify title",{"type":17,"tag":84,"props":145622,"children":145623},{},[145624],{"type":23,"value":145625},"Update time",{"type":17,"tag":84,"props":145627,"children":145628},{},[145629],{"type":23,"value":145630},"Adjust attendees",{"type":17,"tag":84,"props":145632,"children":145633},{},[145634],{"type":23,"value":145635},"Change recurrence",{"type":17,"tag":239,"props":145637,"children":145639},{"id":145638},"retrieve-past-meetings",[145640],{"type":23,"value":145641},"Retrieve Past Meetings",{"type":17,"tag":80,"props":145643,"children":145644},{},[145645,145650,145655],{"type":17,"tag":84,"props":145646,"children":145647},{},[145648],{"type":23,"value":145649},"List historical events",{"type":17,"tag":84,"props":145651,"children":145652},{},[145653],{"type":23,"value":145654},"Expand recurring series",{"type":17,"tag":84,"props":145656,"children":145657},{},[145658],{"type":23,"value":145659},"Retrieve recordings (where supported)",{"type":17,"tag":29,"props":145661,"children":145662},{},[145663],{"type":23,"value":145664},"These features can be embedded directly into SaaS products without building separate integrations per calendar provider.",{"type":17,"tag":68,"props":145666,"children":145668},{"id":145667},"what-calendar-meetings-mcp-is",[145669],{"type":23,"value":145670},"What Calendar & Meetings MCP Is",{"type":17,"tag":29,"props":145672,"children":145673},{},[145674],{"type":23,"value":145675},"Calendar & Meetings MCP is the structured tool-calling layer built on top of the Unified Calendar & Meetings API.",{"type":17,"tag":29,"props":145677,"children":145678},{},[145679],{"type":23,"value":144000},{"type":17,"tag":80,"props":145681,"children":145682},{},[145683,145716,145721,145726,145730],{"type":17,"tag":84,"props":145684,"children":145685},{},[145686,145688],{"type":23,"value":145687},"The Calendar & Meetings category defines normalized objects such as:\n",{"type":17,"tag":80,"props":145689,"children":145690},{},[145691,145695,145699,145704,145708,145712],{"type":17,"tag":84,"props":145692,"children":145693},{},[145694],{"type":23,"value":14515},{"type":17,"tag":84,"props":145696,"children":145697},{},[145698],{"type":23,"value":14528},{"type":17,"tag":84,"props":145700,"children":145701},{},[145702],{"type":23,"value":145703},"Busy (availability)",{"type":17,"tag":84,"props":145705,"children":145706},{},[145707],{"type":23,"value":14554},{"type":17,"tag":84,"props":145709,"children":145710},{},[145711],{"type":23,"value":14567},{"type":17,"tag":84,"props":145713,"children":145714},{},[145715],{"type":23,"value":14580},{"type":17,"tag":84,"props":145717,"children":145718},{},[145719],{"type":23,"value":145720},"Each object exposes documented operations via the unified API.",{"type":17,"tag":84,"props":145722,"children":145723},{},[145724],{"type":23,"value":145725},"The MCP server sits on top of that API.",{"type":17,"tag":84,"props":145727,"children":145728},{},[145729],{"type":23,"value":144042},{"type":17,"tag":84,"props":145731,"children":145732},{},[145733],{"type":23,"value":145734},"Each request is routed directly to the connected provider.",{"type":17,"tag":29,"props":145736,"children":145737},{},[145738],{"type":23,"value":144052},{"type":17,"tag":29,"props":145740,"children":145741},{},[145742],{"type":23,"value":145743},"User → LLM → Calendar tool call → Unified Calendar API → Source platform",{"type":17,"tag":29,"props":145745,"children":145746},{},[145747],{"type":23,"value":144062},{"type":17,"tag":29,"props":145749,"children":145750},{},[145751],{"type":23,"value":145752},"There is no stored calendar database.",{"type":17,"tag":29,"props":145754,"children":145755},{},[145756],{"type":23,"value":145757},"Each tool call executes against the live state of the connected system at the time of execution.",{"type":17,"tag":68,"props":145759,"children":145761},{"id":145760},"unified-calendar-meetings-objects-and-operations",[145762],{"type":23,"value":145763},"Unified Calendar & Meetings Objects and Operations",{"type":17,"tag":29,"props":145765,"children":145766},{},[145767],{"type":23,"value":145768},"The OpenAPI specification defines the following objects and operations:",{"type":17,"tag":239,"props":145770,"children":145771},{"id":99093},[145772],{"type":23,"value":14515},{"type":17,"tag":80,"props":145774,"children":145775},{},[145776,145780,145785,145790,145795,145800],{"type":17,"tag":84,"props":145777,"children":145778},{},[145779],{"type":23,"value":42125},{"type":17,"tag":84,"props":145781,"children":145782},{},[145783],{"type":23,"value":145784},"List",{"type":17,"tag":84,"props":145786,"children":145787},{},[145788],{"type":23,"value":145789},"Retrieve",{"type":17,"tag":84,"props":145791,"children":145792},{},[145793],{"type":23,"value":145794},"Update (PUT)",{"type":17,"tag":84,"props":145796,"children":145797},{},[145798],{"type":23,"value":145799},"Patch (PATCH)",{"type":17,"tag":84,"props":145801,"children":145802},{},[145803],{"type":23,"value":109987},{"type":17,"tag":239,"props":145805,"children":145806},{"id":62633},[145807],{"type":23,"value":14528},{"type":17,"tag":80,"props":145809,"children":145810},{},[145811,145815,145819,145823,145827,145831],{"type":17,"tag":84,"props":145812,"children":145813},{},[145814],{"type":23,"value":42125},{"type":17,"tag":84,"props":145816,"children":145817},{},[145818],{"type":23,"value":145784},{"type":17,"tag":84,"props":145820,"children":145821},{},[145822],{"type":23,"value":145789},{"type":17,"tag":84,"props":145824,"children":145825},{},[145826],{"type":23,"value":145794},{"type":17,"tag":84,"props":145828,"children":145829},{},[145830],{"type":23,"value":145799},{"type":17,"tag":84,"props":145832,"children":145833},{},[145834],{"type":23,"value":109987},{"type":17,"tag":239,"props":145836,"children":145838},{"id":145837},"busy-freebusy",[145839],{"type":23,"value":145840},"Busy (Free/Busy)",{"type":17,"tag":80,"props":145842,"children":145843},{},[145844],{"type":17,"tag":84,"props":145845,"children":145846},{},[145847],{"type":23,"value":145848},"List only",{"type":17,"tag":239,"props":145850,"children":145851},{"id":42710},[145852],{"type":23,"value":14554},{"type":17,"tag":80,"props":145854,"children":145855},{},[145856,145860,145864,145868,145872,145877],{"type":17,"tag":84,"props":145857,"children":145858},{},[145859],{"type":23,"value":42125},{"type":17,"tag":84,"props":145861,"children":145862},{},[145863],{"type":23,"value":145784},{"type":17,"tag":84,"props":145865,"children":145866},{},[145867],{"type":23,"value":145789},{"type":17,"tag":84,"props":145869,"children":145870},{},[145871],{"type":23,"value":109982},{"type":17,"tag":84,"props":145873,"children":145874},{},[145875],{"type":23,"value":145876},"Patch",{"type":17,"tag":84,"props":145878,"children":145879},{},[145880],{"type":23,"value":109987},{"type":17,"tag":239,"props":145882,"children":145884},{"id":145883},"recording",[145885],{"type":23,"value":14567},{"type":17,"tag":80,"props":145887,"children":145888},{},[145889,145893],{"type":17,"tag":84,"props":145890,"children":145891},{},[145892],{"type":23,"value":145784},{"type":17,"tag":84,"props":145894,"children":145895},{},[145896],{"type":23,"value":145789},{"type":17,"tag":239,"props":145898,"children":145900},{"id":145899},"webinar",[145901],{"type":23,"value":14580},{"type":17,"tag":80,"props":145903,"children":145904},{},[145905,145909,145913,145917,145921,145925],{"type":17,"tag":84,"props":145906,"children":145907},{},[145908],{"type":23,"value":42125},{"type":17,"tag":84,"props":145910,"children":145911},{},[145912],{"type":23,"value":145784},{"type":17,"tag":84,"props":145914,"children":145915},{},[145916],{"type":23,"value":145789},{"type":17,"tag":84,"props":145918,"children":145919},{},[145920],{"type":23,"value":109982},{"type":17,"tag":84,"props":145922,"children":145923},{},[145924],{"type":23,"value":145876},{"type":17,"tag":84,"props":145926,"children":145927},{},[145928],{"type":23,"value":109987},{"type":17,"tag":29,"props":145930,"children":145931},{},[145932],{"type":23,"value":145933},"Not every integration exposes every object or every operation. Tool availability depends on provider feature support and connection permissions.",{"type":17,"tag":68,"props":145935,"children":145937},{"id":145936},"recurring-events-support",[145938],{"type":23,"value":145939},"Recurring Events Support",{"type":17,"tag":29,"props":145941,"children":145942},{},[145943],{"type":23,"value":145944},"Recurring events are part of the unified data model.",{"type":17,"tag":29,"props":145946,"children":145947},{},[145948,145949,145955],{"type":23,"value":6712},{"type":17,"tag":6121,"props":145950,"children":145952},{"className":145951},[],[145953],{"type":23,"value":145954},"CalendarEvent",{"type":23,"value":145956}," object includes:",{"type":17,"tag":80,"props":145958,"children":145959},{},[145960,145969],{"type":17,"tag":84,"props":145961,"children":145962},{},[145963],{"type":17,"tag":6121,"props":145964,"children":145966},{"className":145965},[],[145967],{"type":23,"value":145968},"recurring_event_id",{"type":17,"tag":84,"props":145970,"children":145971},{},[145972,145978],{"type":17,"tag":6121,"props":145973,"children":145975},{"className":145974},[],[145976],{"type":23,"value":145977},"recurrence",{"type":23,"value":145979}," configuration",{"type":17,"tag":29,"props":145981,"children":145982},{},[145983],{"type":23,"value":145984},"The recurrence schema supports:",{"type":17,"tag":80,"props":145986,"children":145987},{},[145988,145993,145998,146002,146007,146012],{"type":17,"tag":84,"props":145989,"children":145990},{},[145991],{"type":23,"value":145992},"Frequency: DAILY, WEEKLY, MONTHLY, YEARLY",{"type":17,"tag":84,"props":145994,"children":145995},{},[145996],{"type":23,"value":145997},"Interval",{"type":17,"tag":84,"props":145999,"children":146000},{},[146001],{"type":23,"value":133836},{"type":17,"tag":84,"props":146003,"children":146004},{},[146005],{"type":23,"value":146006},"End date",{"type":17,"tag":84,"props":146008,"children":146009},{},[146010],{"type":23,"value":146011},"Specific day/month/week/year constraints",{"type":17,"tag":84,"props":146013,"children":146014},{},[146015],{"type":23,"value":146016},"Inclusion and exclusion dates",{"type":17,"tag":29,"props":146018,"children":146019},{},[146020],{"type":23,"value":146021},"Recurring patterns can be created and updated where the provider supports event updates.",{"type":17,"tag":29,"props":146023,"children":146024},{},[146025,146027,146032],{"type":23,"value":146026},"When listing events, the ",{"type":17,"tag":6121,"props":146028,"children":146030},{"className":146029},[],[146031],{"type":23,"value":123623},{"type":23,"value":146033}," parameter allows recurring series to be flattened into individual instances. This is especially useful for availability analysis and historical meeting summaries.",{"type":17,"tag":68,"props":146035,"children":146037},{"id":146036},"attendee-and-rsvp-support",[146038],{"type":23,"value":146039},"Attendee and RSVP Support",{"type":17,"tag":29,"props":146041,"children":146042},{},[146043],{"type":23,"value":146044},"The unified attendee model includes:",{"type":17,"tag":80,"props":146046,"children":146047},{},[146048,146053],{"type":17,"tag":84,"props":146049,"children":146050},{},[146051],{"type":23,"value":146052},"Attendee objects",{"type":17,"tag":84,"props":146054,"children":146055},{},[146056,146061,146063],{"type":17,"tag":6121,"props":146057,"children":146059},{"className":146058},[],[146060],{"type":23,"value":19949},{"type":23,"value":146062}," field with enum values:\n",{"type":17,"tag":80,"props":146064,"children":146065},{},[146066,146071,146076],{"type":17,"tag":84,"props":146067,"children":146068},{},[146069],{"type":23,"value":146070},"ACCEPTED",{"type":17,"tag":84,"props":146072,"children":146073},{},[146074],{"type":23,"value":146075},"REJECTED",{"type":17,"tag":84,"props":146077,"children":146078},{},[146079],{"type":23,"value":146080},"TENTATIVE",{"type":17,"tag":29,"props":146082,"children":146083},{},[146084],{"type":23,"value":146085},"The event model allows attendees to be updated where provider event updates are supported.",{"type":17,"tag":29,"props":146087,"children":146088},{},[146089],{"type":23,"value":146090},"This enables AI features such as:",{"type":17,"tag":80,"props":146092,"children":146093},{},[146094,146099,146104],{"type":17,"tag":84,"props":146095,"children":146096},{},[146097],{"type":23,"value":146098},"Modifying attendee lists",{"type":17,"tag":84,"props":146100,"children":146101},{},[146102],{"type":23,"value":146103},"Updating RSVP status",{"type":17,"tag":84,"props":146105,"children":146106},{},[146107],{"type":23,"value":146108},"Coordinating availability-based scheduling",{"type":17,"tag":68,"props":146110,"children":146112},{"id":146111},"freebusy-availability",[146113],{"type":23,"value":146114},"Free/Busy Availability",{"type":17,"tag":29,"props":146116,"children":146117},{},[146118],{"type":23,"value":146119},"Availability is accessed through a unified endpoint:",{"type":17,"tag":29,"props":146121,"children":146122},{},[146123],{"type":17,"tag":6121,"props":146124,"children":146126},{"className":146125},[],[146127],{"type":23,"value":146128},"/calendar/{connection_id}/busy",{"type":17,"tag":29,"props":146130,"children":146131},{},[146132],{"type":23,"value":146133},"This provides normalized free/busy data across providers.",{"type":17,"tag":29,"props":146135,"children":146136},{},[146137],{"type":23,"value":146138},"Busy endpoints are read-only and support time filtering, limit, and offset parameters.",{"type":17,"tag":29,"props":146140,"children":146141},{},[146142],{"type":23,"value":146143},"AI use cases include:",{"type":17,"tag":80,"props":146145,"children":146146},{},[146147,146152,146157],{"type":17,"tag":84,"props":146148,"children":146149},{},[146150],{"type":23,"value":146151},"Finding availability",{"type":17,"tag":84,"props":146153,"children":146154},{},[146155],{"type":23,"value":146156},"Conflict detection",{"type":17,"tag":84,"props":146158,"children":146159},{},[146160],{"type":23,"value":146161},"Suggesting meeting times",{"type":17,"tag":68,"props":146163,"children":146164},{"id":144224},[146165],{"type":23,"value":144227},{"type":17,"tag":29,"props":146167,"children":146168},{},[146169],{"type":23,"value":146170},"Calendar integrations vary significantly in write support.",{"type":17,"tag":29,"props":146172,"children":146173},{},[146174],{"type":23,"value":146175},"Some providers support full CRUD for events (create, update, delete).",{"type":17,"tag":29,"props":146177,"children":146178},{},[146179],{"type":23,"value":146180},"Others are read-only for events.",{"type":17,"tag":29,"props":146182,"children":146183},{},[146184],{"type":23,"value":377},{"type":17,"tag":80,"props":146186,"children":146187},{},[146188,146193,146198,146203,146208],{"type":17,"tag":84,"props":146189,"children":146190},{},[146191],{"type":23,"value":146192},"Google Calendar, Microsoft Outlook, Microsoft Teams support event create/update/delete.",{"type":17,"tag":84,"props":146194,"children":146195},{},[146196],{"type":23,"value":146197},"Some providers expose only list/get for events.",{"type":17,"tag":84,"props":146199,"children":146200},{},[146201],{"type":23,"value":146202},"Certain integrations support webinars or bookings but not general event mutation.",{"type":17,"tag":84,"props":146204,"children":146205},{},[146206],{"type":23,"value":146207},"Some integrations do not expose event deletion.",{"type":17,"tag":84,"props":146209,"children":146210},{},[146211],{"type":23,"value":146212},"Recurring event modification depends on provider support for event updates.",{"type":17,"tag":29,"props":146214,"children":146215},{},[146216],{"type":23,"value":146217},"Write operations must always be scoped as 'where supported.'",{"type":17,"tag":68,"props":146219,"children":146220},{"id":144346},[146221],{"type":23,"value":144349},{"type":17,"tag":29,"props":146223,"children":146224},{},[146225],{"type":23,"value":146226},"Each Calendar MCP tool call executes directly against the source API.",{"type":17,"tag":29,"props":146228,"children":146229},{},[146230],{"type":23,"value":7403},{"type":17,"tag":80,"props":146232,"children":146233},{},[146234,146238,146243,146248],{"type":17,"tag":84,"props":146235,"children":146236},{},[146237],{"type":23,"value":144366},{"type":17,"tag":84,"props":146239,"children":146240},{},[146241],{"type":23,"value":146242},"High-frequency scheduling updates may trigger throttling.",{"type":17,"tag":84,"props":146244,"children":146245},{},[146246],{"type":23,"value":146247},"Bulk listing operations should be paginated.",{"type":17,"tag":84,"props":146249,"children":146250},{},[146251],{"type":23,"value":146252},"Retry and backoff logic should be implemented for 429 responses.",{"type":17,"tag":29,"props":146254,"children":146255},{},[146256],{"type":23,"value":146257},"Because execution is pass-through:",{"type":17,"tag":80,"props":146259,"children":146260},{},[146261,146266,146271],{"type":17,"tag":84,"props":146262,"children":146263},{},[146264],{"type":23,"value":146265},"Updates persist immediately in the source platform.",{"type":17,"tag":84,"props":146267,"children":146268},{},[146269],{"type":23,"value":146270},"There is no intermediate storage.",{"type":17,"tag":84,"props":146272,"children":146273},{},[146274],{"type":23,"value":146275},"There is no delayed sync.",{"type":17,"tag":68,"props":146277,"children":146279},{"id":146278},"calendar-api-vs-calendar-mcp",[146280],{"type":23,"value":146281},"Calendar API vs Calendar MCP",{"type":17,"tag":29,"props":146283,"children":146284},{},[146285],{"type":23,"value":146286},"Both use the same underlying real-time Calendar API.",{"type":17,"tag":29,"props":146288,"children":146289},{},[146290],{"type":23,"value":146291},"The difference is who determines which operation to execute.",{"type":17,"tag":239,"props":146293,"children":146295},{"id":146294},"use-the-calendar-api-directly-when",[146296],{"type":23,"value":146297},"Use the Calendar API directly when:",{"type":17,"tag":80,"props":146299,"children":146300},{},[146301,146306,146311,146316],{"type":17,"tag":84,"props":146302,"children":146303},{},[146304],{"type":23,"value":146305},"Your backend controls scheduling logic.",{"type":17,"tag":84,"props":146307,"children":146308},{},[146309],{"type":23,"value":146310},"You build availability dashboards.",{"type":17,"tag":84,"props":146312,"children":146313},{},[146314],{"type":23,"value":146315},"You generate analytics over meeting history.",{"type":17,"tag":84,"props":146317,"children":146318},{},[146319],{"type":23,"value":146320},"You persist derived state or embeddings.",{"type":17,"tag":29,"props":146322,"children":146323},{},[146324],{"type":23,"value":144560},{"type":17,"tag":29,"props":146326,"children":146327},{},[146328],{"type":23,"value":146329},"App → Unified Calendar API → Source platform",{"type":17,"tag":239,"props":146331,"children":146333},{"id":146332},"use-calendar-mcp-when",[146334],{"type":23,"value":146335},"Use Calendar MCP when:",{"type":17,"tag":80,"props":146337,"children":146338},{},[146339,146344,146349,146353],{"type":17,"tag":84,"props":146340,"children":146341},{},[146342],{"type":23,"value":146343},"The LLM decides which calendar action to execute.",{"type":17,"tag":84,"props":146345,"children":146346},{},[146347],{"type":23,"value":146348},"You are embedding AI scheduling assistants inside your product.",{"type":17,"tag":84,"props":146350,"children":146351},{},[146352],{"type":23,"value":144588},{"type":17,"tag":84,"props":146354,"children":146355},{},[146356],{"type":23,"value":146357},"You want to restrict tool access via scoped permissions.",{"type":17,"tag":29,"props":146359,"children":146360},{},[146361],{"type":23,"value":144560},{"type":17,"tag":29,"props":146363,"children":146364},{},[146365],{"type":23,"value":146366},"User → LLM → Tool call → Unified Calendar API → Source platform",{"type":17,"tag":29,"props":146368,"children":146369},{},[146370],{"type":23,"value":144607},{"type":17,"tag":29,"props":146372,"children":146373},{},[146374],{"type":23,"value":144612},{"type":17,"tag":68,"props":146376,"children":146377},{"id":144424},[146378],{"type":23,"value":144427},{"type":17,"tag":29,"props":146380,"children":146381},{},[146382],{"type":23,"value":146383},"Current model limits:",{"type":17,"tag":80,"props":146385,"children":146386},{},[146387,146392,146397],{"type":17,"tag":84,"props":146388,"children":146389},{},[146390],{"type":23,"value":146391},"Groq: up to 10 tools",{"type":17,"tag":84,"props":146393,"children":146394},{},[146395],{"type":23,"value":146396},"OpenAI: up to 20 tools",{"type":17,"tag":84,"props":146398,"children":146399},{},[146400],{"type":23,"value":146401},"Cohere: up to 50 tools",{"type":17,"tag":29,"props":146403,"children":146404},{},[146405],{"type":23,"value":146406},"Calendar integrations expose varying tool counts depending on objects supported.",{"type":17,"tag":29,"props":146408,"children":146409},{},[146410],{"type":23,"value":146411},"You should restrict the tool surface using:",{"type":17,"tag":80,"props":146413,"children":146414},{},[146415,146423,146431],{"type":17,"tag":84,"props":146416,"children":146417},{},[146418],{"type":17,"tag":6121,"props":146419,"children":146421},{"className":146420},[],[146422],{"type":23,"value":24204},{"type":17,"tag":84,"props":146424,"children":146425},{},[146426],{"type":17,"tag":6121,"props":146427,"children":146429},{"className":146428},[],[146430],{"type":23,"value":131599},{"type":17,"tag":84,"props":146432,"children":146433},{},[146434],{"type":17,"tag":6121,"props":146435,"children":146437},{"className":146436},[],[146438],{"type":23,"value":131610},{"type":17,"tag":29,"props":146440,"children":146441},{},[146442],{"type":23,"value":146443},"Tool restriction is required for production deployments.",{"type":17,"tag":68,"props":146445,"children":146447},{"id":146446},"build-real-time-scheduling-agents",[146448],{"type":23,"value":146449},"Build Real-Time Scheduling Agents",{"type":17,"tag":29,"props":146451,"children":146452},{},[146453],{"type":23,"value":146454},"With Calendar & Meetings MCP, your agents can:",{"type":17,"tag":80,"props":146456,"children":146457},{},[146458,146463,146468,146473,146478],{"type":17,"tag":84,"props":146459,"children":146460},{},[146461],{"type":23,"value":146462},"Create meetings",{"type":17,"tag":84,"props":146464,"children":146465},{},[146466],{"type":23,"value":146467},"Modify recurring events",{"type":17,"tag":84,"props":146469,"children":146470},{},[146471],{"type":23,"value":146472},"Update RSVP status",{"type":17,"tag":84,"props":146474,"children":146475},{},[146476],{"type":23,"value":146477},"Retrieve availability",{"type":17,"tag":84,"props":146479,"children":146480},{},[146481],{"type":23,"value":146482},"Act across Google Calendar, Outlook, Teams, Zoom, Calendly, and others",{"type":17,"tag":29,"props":146484,"children":146485},{},[146486],{"type":23,"value":146487},"Each action executes directly against the connected provider.",{"type":17,"tag":29,"props":146489,"children":146490},{},[146491],{"type":23,"value":146492},"No caching.",{"type":17,"tag":29,"props":146494,"children":146495},{},[146496],{"type":23,"value":146497},"No sync layer.",{"type":17,"tag":29,"props":146499,"children":146500},{},[146501],{"type":23,"value":146502},"No stored calendar replica.",{"type":17,"tag":239,"props":146504,"children":146506},{"id":146505},"start-building-with-unified-mcp",[146507],{"type":23,"value":146508},"Start building with Unified MCP",{"type":17,"tag":80,"props":146510,"children":146511},{},[146512,146517,146522,146527],{"type":17,"tag":84,"props":146513,"children":146514},{},[146515],{"type":23,"value":146516},"Enable Calendar integrations",{"type":17,"tag":84,"props":146518,"children":146519},{},[146520],{"type":23,"value":146521},"Restrict tool surface per model",{"type":17,"tag":84,"props":146523,"children":146524},{},[146525],{"type":23,"value":146526},"Connect Google Calendar, Outlook, Zoom, and others",{"type":17,"tag":84,"props":146528,"children":146529},{},[146530],{"type":23,"value":146531},"Ship AI-driven scheduling features inside your product",{"type":17,"tag":29,"props":146533,"children":146534},{},[146535],{"type":17,"tag":133,"props":146536,"children":146538},{"href":1612,"rel":146537},[214],[146539],{"type":23,"value":44481},{"type":17,"tag":29,"props":146541,"children":146542},{},[146543],{"type":17,"tag":133,"props":146544,"children":146546},{"href":1623,"rel":146545},[214],[146547],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":146549},[146550,146556,146557,146565,146566,146567,146568,146569,146570,146574,146575],{"id":145555,"depth":1629,"text":145558,"children":146551},[146552,146553,146554,146555],{"id":145566,"depth":1635,"text":145569},{"id":145590,"depth":1635,"text":145593},{"id":145609,"depth":1635,"text":145612},{"id":145638,"depth":1635,"text":145641},{"id":145667,"depth":1629,"text":145670},{"id":145760,"depth":1629,"text":145763,"children":146558},[146559,146560,146561,146562,146563,146564],{"id":99093,"depth":1635,"text":14515},{"id":62633,"depth":1635,"text":14528},{"id":145837,"depth":1635,"text":145840},{"id":42710,"depth":1635,"text":14554},{"id":145883,"depth":1635,"text":14567},{"id":145899,"depth":1635,"text":14580},{"id":145936,"depth":1629,"text":145939},{"id":146036,"depth":1629,"text":146039},{"id":146111,"depth":1629,"text":146114},{"id":144224,"depth":1629,"text":144227},{"id":144346,"depth":1629,"text":144349},{"id":146278,"depth":1629,"text":146281,"children":146571},[146572,146573],{"id":146294,"depth":1635,"text":146297},{"id":146332,"depth":1635,"text":146335},{"id":144424,"depth":1629,"text":144427},{"id":146446,"depth":1629,"text":146449,"children":146576},[146577],{"id":146505,"depth":1635,"text":146508},"content:blog:calendar_and_meetings_mcp_servers_real_time_scheduling_actions_for_ai_agents.md","blog/calendar_and_meetings_mcp_servers_real_time_scheduling_actions_for_ai_agents.md","blog/calendar_and_meetings_mcp_servers_real_time_scheduling_actions_for_ai_agents",{"_path":146582,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":146583,"description":146584,"img":146585,"date":146586,"tag":12,"body":146587,"_type":1677,"_id":147890,"_source":1679,"_file":147891,"_stem":147892,"_extension":1682},"/blog/how_to_integrate_with_the_hubspot_api_a_step_by_step_guide_for_b2b_saas_teams","How to Integrate with the HubSpot API: A Step-by-Step Guide for B2B SaaS Teams","HubSpot provides a powerful CRM API. You can read and write contacts, companies, deals, pipelines, and engagements. You can subscribe to webhook events. You...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_integrate_with_the_hubspot_api_a_step_by_step_guide_for_b2b_saas_teams-icon.png","2026-02-20T00:53:00.000Z",{"type":14,"children":146588,"toc":147864},[146589,146594,146597,146604,146615,146627,146631,146654,146659,146665,146671,146676,146682,146687,146735,146744,146749,146755,146760,146765,146807,146812,146821,146826,146831,146837,146842,146877,146882,146894,146900,146905,146923,146928,146937,146942,146976,146982,146986,146995,147000,147028,147033,147042,147047,147076,147082,147087,147091,147119,147124,147148,147157,147165,147169,147197,147202,147208,147213,147271,147276,147281,147287,147292,147297,147303,147307,147350,147355,147363,147369,147375,147380,147389,147394,147419,147425,147430,147451,147456,147468,147473,147479,147483,147492,147497,147520,147525,147552,147557,147562,147586,147591,147597,147602,147611,147616,147656,147661,147667,147672,147710,147715,147720,147724,147730,147753,147759,147792,147796,147801,147806,147811,147828,147833,147838,147843,147848,147856],{"type":17,"tag":18,"props":146590,"children":146592},{"id":146591},"how-to-integrate-with-the-hubspot-api-a-step-by-step-guide-for-b2b-saas-teams",[146593],{"type":23,"value":146583},{"type":17,"tag":25,"props":146595,"children":146596},{},[],{"type":17,"tag":29,"props":146598,"children":146599},{},[146600],{"type":17,"tag":33,"props":146601,"children":146602},{},[146603],{"type":23,"value":136280},{"type":17,"tag":29,"props":146605,"children":146606},{},[146607,146609,146613],{"type":23,"value":146608},"HubSpot provides a powerful ",{"type":17,"tag":133,"props":146610,"children":146611},{"href":61562},[146612],{"type":23,"value":61565},{"type":23,"value":146614},". You can read and write contacts, companies, deals, pipelines, and engagements. You can subscribe to webhook events. You can search and filter data across objects.",{"type":17,"tag":29,"props":146616,"children":146617},{},[146618,146620,146626],{"type":23,"value":146619},"But integrating HubSpot in a production B2B SaaS product involves more than just calling ",{"type":17,"tag":6121,"props":146621,"children":146623},{"className":146622},[],[146624],{"type":23,"value":146625},"GET /contacts",{"type":23,"value":54},{"type":17,"tag":29,"props":146628,"children":146629},{},[146630],{"type":23,"value":70164},{"type":17,"tag":6154,"props":146632,"children":146633},{},[146634,146639,146644,146649],{"type":17,"tag":84,"props":146635,"children":146636},{},[146637],{"type":23,"value":146638},"How to integrate directly with the HubSpot API",{"type":17,"tag":84,"props":146640,"children":146641},{},[146642],{"type":23,"value":146643},"The operational complexity you'll own",{"type":17,"tag":84,"props":146645,"children":146646},{},[146647],{"type":23,"value":146648},"How to integrate HubSpot using Unified's CRM API",{"type":17,"tag":84,"props":146650,"children":146651},{},[146652],{"type":23,"value":146653},"When to build direct vs when to use Unified",{"type":17,"tag":29,"props":146655,"children":146656},{},[146657],{"type":23,"value":146658},"This is written for product teams building customer-facing CRM integrations.",{"type":17,"tag":68,"props":146660,"children":146662},{"id":146661},"direct-hubspot-api-integration",[146663],{"type":23,"value":146664},"Direct HubSpot API Integration",{"type":17,"tag":239,"props":146666,"children":146668},{"id":146667},"step-1-create-a-hubspot-developer-account",[146669],{"type":23,"value":146670},"Step 1: Create a HubSpot Developer Account",{"type":17,"tag":29,"props":146672,"children":146673},{},[146674],{"type":23,"value":146675},"HubSpot offers a free CMS developer sandbox account for building and testing.",{"type":17,"tag":239,"props":146677,"children":146679},{"id":146678},"step-2-create-a-public-app-oauth-20",[146680],{"type":23,"value":146681},"Step 2: Create a Public App (OAuth 2.0)",{"type":17,"tag":29,"props":146683,"children":146684},{},[146685],{"type":23,"value":146686},"Inside the HubSpot Developer Dashboard:",{"type":17,"tag":6154,"props":146688,"children":146689},{},[146690,146699,146711],{"type":17,"tag":84,"props":146691,"children":146692},{},[146693,146694],{"type":23,"value":6661},{"type":17,"tag":48,"props":146695,"children":146696},{},[146697],{"type":23,"value":146698},"Development → Legacy Apps → Create Legacy App → Public App",{"type":17,"tag":84,"props":146700,"children":146701},{},[146702,146704,146709],{"type":23,"value":146703},"Open the ",{"type":17,"tag":48,"props":146705,"children":146706},{},[146707],{"type":23,"value":146708},"Auth",{"type":23,"value":146710}," tab",{"type":17,"tag":84,"props":146712,"children":146713},{},[146714,146716,146721,146723,146734],{"type":23,"value":146715},"Under ",{"type":17,"tag":48,"props":146717,"children":146718},{},[146719],{"type":23,"value":146720},"Redirect URLs",{"type":23,"value":146722},", add ",{"type":17,"tag":48,"props":146724,"children":146725},{},[146726,146728,146732],{"type":23,"value":146727},"your application's ",{"type":17,"tag":133,"props":146729,"children":146730},{"href":779},[146731],{"type":23,"value":782},{"type":23,"value":146733}," callback URL",{"type":23,"value":144883},{"type":17,"tag":6893,"props":146736,"children":146739},{"className":146737,"code":146738,"language":20901,"meta":23},[20899],"https://yourapp.com/oauth/hubspot/callback\n",[146740],{"type":17,"tag":6121,"props":146741,"children":146742},{"__ignoreMap":7},[146743],{"type":23,"value":146738},{"type":17,"tag":29,"props":146745,"children":146746},{},[146747],{"type":23,"value":146748},"This must be a URL controlled by your backend. HubSpot will redirect users to this URL after they approve access.",{"type":17,"tag":239,"props":146750,"children":146752},{"id":146751},"step-3-configure-oauth-scopes",[146753],{"type":23,"value":146754},"Step 3: Configure OAuth Scopes",{"type":17,"tag":29,"props":146756,"children":146757},{},[146758],{"type":23,"value":146759},"HubSpot requires you to explicitly configure scopes in your app.",{"type":17,"tag":29,"props":146761,"children":146762},{},[146763],{"type":23,"value":146764},"Important rules:",{"type":17,"tag":80,"props":146766,"children":146767},{},[146768,146780,146791,146796],{"type":17,"tag":84,"props":146769,"children":146770},{},[146771,146772,146778],{"type":23,"value":6712},{"type":17,"tag":6121,"props":146773,"children":146775},{"className":146774},[],[146776],{"type":23,"value":146777},"oauth",{"type":23,"value":146779}," scope must be included.",{"type":17,"tag":84,"props":146781,"children":146782},{},[146783,146785,146789],{"type":23,"value":146784},"If a scope is marked as ",{"type":17,"tag":48,"props":146786,"children":146787},{},[146788],{"type":23,"value":47953},{"type":23,"value":146790},", it must be present in every authorization request.",{"type":17,"tag":84,"props":146792,"children":146793},{},[146794],{"type":23,"value":146795},"If a scope is not configured in the app, it cannot be requested later.",{"type":17,"tag":84,"props":146797,"children":146798},{},[146799,146801,146805],{"type":23,"value":146800},"When using ",{"type":17,"tag":133,"props":146802,"children":146803},{"href":4999},[146804],{"type":23,"value":5002},{"type":23,"value":146806},", read scopes for subscribed objects typically need to be marked as Required.",{"type":17,"tag":29,"props":146808,"children":146809},{},[146810],{"type":23,"value":146811},"Example configuration for reading and writing Deals:",{"type":17,"tag":6893,"props":146813,"children":146816},{"className":146814,"code":146815,"language":20901,"meta":23},[20899],"{\n  \"requiredScopes\": [\n\"oauth\",\n\"crm.objects.deals.read\"\n  ],\n  \"optionalScopes\": [\n\"crm.objects.deals.write\"\n  ]\n}\n",[146817],{"type":17,"tag":6121,"props":146818,"children":146819},{"__ignoreMap":7},[146820],{"type":23,"value":146815},{"type":17,"tag":29,"props":146822,"children":146823},{},[146824],{"type":23,"value":146825},"Your OAuth authorization request must request the same scopes you configure here.",{"type":17,"tag":29,"props":146827,"children":146828},{},[146829],{"type":23,"value":146830},"Scope mismatches will result in authorization failures.",{"type":17,"tag":239,"props":146832,"children":146834},{"id":146833},"step-4-retrieve-oauth-credentials",[146835],{"type":23,"value":146836},"Step 4: Retrieve OAuth Credentials",{"type":17,"tag":29,"props":146838,"children":146839},{},[146840],{"type":23,"value":146841},"After creating the app:",{"type":17,"tag":80,"props":146843,"children":146844},{},[146845,146855],{"type":17,"tag":84,"props":146846,"children":146847},{},[146848,146850,146854],{"type":23,"value":146849},"Go to the ",{"type":17,"tag":48,"props":146851,"children":146852},{},[146853],{"type":23,"value":146708},{"type":23,"value":146710},{"type":17,"tag":84,"props":146856,"children":146857},{},[146858,146860],{"type":23,"value":146859},"Copy:\n",{"type":17,"tag":80,"props":146861,"children":146862},{},[146863,146870],{"type":17,"tag":84,"props":146864,"children":146865},{},[146866],{"type":17,"tag":48,"props":146867,"children":146868},{},[146869],{"type":23,"value":6040},{"type":17,"tag":84,"props":146871,"children":146872},{},[146873],{"type":17,"tag":48,"props":146874,"children":146875},{},[146876],{"type":23,"value":6045},{"type":17,"tag":29,"props":146878,"children":146879},{},[146880],{"type":23,"value":146881},"You will use these values in your OAuth flow.",{"type":17,"tag":29,"props":146883,"children":146884},{},[146885,146887,146892],{"type":23,"value":146886},"If you plan to manage webhook subscriptions or other developer features, you may also need a ",{"type":17,"tag":48,"props":146888,"children":146889},{},[146890],{"type":23,"value":146891},"Developer API Key",{"type":23,"value":146893}," from the developer dashboard.",{"type":17,"tag":239,"props":146895,"children":146897},{"id":146896},"step-5-implement-the-oauth-flow",[146898],{"type":23,"value":146899},"Step 5: Implement the OAuth Flow",{"type":17,"tag":29,"props":146901,"children":146902},{},[146903],{"type":23,"value":146904},"A direct HubSpot OAuth flow requires:",{"type":17,"tag":6154,"props":146906,"children":146907},{},[146908,146913,146918],{"type":17,"tag":84,"props":146909,"children":146910},{},[146911],{"type":23,"value":146912},"Redirect the user to HubSpot's authorization URL",{"type":17,"tag":84,"props":146914,"children":146915},{},[146916],{"type":23,"value":146917},"Receive an authorization code at your redirect URI",{"type":17,"tag":84,"props":146919,"children":146920},{},[146921],{"type":23,"value":146922},"Exchange that code for access and refresh tokens",{"type":17,"tag":29,"props":146924,"children":146925},{},[146926],{"type":23,"value":146927},"Example token exchange:",{"type":17,"tag":6893,"props":146929,"children":146932},{"className":146930,"code":146931,"language":20901,"meta":23},[20899],"POST https://api.hubapi.com/oauth/v1/token\ngrant_type=authorization_code\nclient_id=YOUR_CLIENT_ID\nclient_secret=YOUR_CLIENT_SECRET\ncode=AUTH_CODE\nredirect_uri=https://yourapp.com/oauth/hubspot/callback\n",[146933],{"type":17,"tag":6121,"props":146934,"children":146935},{"__ignoreMap":7},[146936],{"type":23,"value":146931},{"type":17,"tag":29,"props":146938,"children":146939},{},[146940],{"type":23,"value":146941},"Operational considerations:",{"type":17,"tag":80,"props":146943,"children":146944},{},[146945,146950,146955,146960,146965],{"type":17,"tag":84,"props":146946,"children":146947},{},[146948],{"type":23,"value":146949},"Access tokens are short-lived.",{"type":17,"tag":84,"props":146951,"children":146952},{},[146953],{"type":23,"value":146954},"You must securely store refresh tokens.",{"type":17,"tag":84,"props":146956,"children":146957},{},[146958],{"type":23,"value":146959},"You must refresh access tokens before expiration.",{"type":17,"tag":84,"props":146961,"children":146962},{},[146963],{"type":23,"value":146964},"You must handle revoked tokens.",{"type":17,"tag":84,"props":146966,"children":146967},{},[146968,146969,146974],{"type":23,"value":144772},{"type":17,"tag":6121,"props":146970,"children":146972},{"className":146971},[],[146973],{"type":23,"value":137475},{"type":23,"value":146975}," responses cleanly.",{"type":17,"tag":239,"props":146977,"children":146979},{"id":146978},"step-6-call-the-crm-api",[146980],{"type":23,"value":146981},"Step 6: Call the CRM API",{"type":17,"tag":29,"props":146983,"children":146984},{},[146985],{"type":23,"value":19878},{"type":17,"tag":6893,"props":146987,"children":146990},{"className":146988,"code":146989,"language":20901,"meta":23},[20899],"GET https://api.hubapi.com/crm/v3/objects/contacts?limit=100\nAuthorization: Bearer ACCESS_TOKEN\n",[146991],{"type":17,"tag":6121,"props":146992,"children":146993},{"__ignoreMap":7},[146994],{"type":23,"value":146989},{"type":17,"tag":29,"props":146996,"children":146997},{},[146998],{"type":23,"value":146999},"HubSpot CRM supports:",{"type":17,"tag":80,"props":147001,"children":147002},{},[147003,147007,147011,147015,147019,147023],{"type":17,"tag":84,"props":147004,"children":147005},{},[147006],{"type":23,"value":31619},{"type":17,"tag":84,"props":147008,"children":147009},{},[147010],{"type":23,"value":56943},{"type":17,"tag":84,"props":147012,"children":147013},{},[147014],{"type":23,"value":63113},{"type":17,"tag":84,"props":147016,"children":147017},{},[147018],{"type":23,"value":63128},{"type":17,"tag":84,"props":147020,"children":147021},{},[147022],{"type":23,"value":32740},{"type":17,"tag":84,"props":147024,"children":147025},{},[147026],{"type":23,"value":147027},"Custom objects",{"type":17,"tag":29,"props":147029,"children":147030},{},[147031],{"type":23,"value":147032},"Search endpoint example:",{"type":17,"tag":6893,"props":147034,"children":147037},{"className":147035,"code":147036,"language":20901,"meta":23},[20899],"POST https://api.hubapi.com/crm/v3/objects/contacts/search\n",[147038],{"type":17,"tag":6121,"props":147039,"children":147040},{"__ignoreMap":7},[147041],{"type":23,"value":147036},{"type":17,"tag":29,"props":147043,"children":147044},{},[147045],{"type":23,"value":147046},"Constraints to be aware of:",{"type":17,"tag":80,"props":147048,"children":147049},{},[147050,147055,147060,147071],{"type":17,"tag":84,"props":147051,"children":147052},{},[147053],{"type":23,"value":147054},"Search endpoints are rate limited per account.",{"type":17,"tag":84,"props":147056,"children":147057},{},[147058],{"type":23,"value":147059},"Search results are capped (10,000 results per query).",{"type":17,"tag":84,"props":147061,"children":147062},{},[147063,147065,147070],{"type":23,"value":147064},"Pagination uses cursor-based tokens (",{"type":17,"tag":6121,"props":147066,"children":147068},{"className":147067},[],[147069],{"type":23,"value":126267},{"type":23,"value":129328},{"type":17,"tag":84,"props":147072,"children":147073},{},[147074],{"type":23,"value":147075},"Newly updated records may take a short time to appear in search results.",{"type":17,"tag":239,"props":147077,"children":147079},{"id":147078},"step-7-configure-webhooks",[147080],{"type":23,"value":147081},"Step 7: Configure Webhooks",{"type":17,"tag":29,"props":147083,"children":147084},{},[147085],{"type":23,"value":147086},"HubSpot webhooks allow you to receive change notifications.",{"type":17,"tag":29,"props":147088,"children":147089},{},[147090],{"type":23,"value":44729},{"type":17,"tag":80,"props":147092,"children":147093},{},[147094,147099,147104,147109,147114],{"type":17,"tag":84,"props":147095,"children":147096},{},[147097],{"type":23,"value":147098},"Batch delivery (up to ~100 events)",{"type":17,"tag":84,"props":147100,"children":147101},{},[147102],{"type":23,"value":147103},"Not guaranteed ordered",{"type":17,"tag":84,"props":147105,"children":147106},{},[147107],{"type":23,"value":147108},"At-least-once delivery",{"type":17,"tag":84,"props":147110,"children":147111},{},[147112],{"type":23,"value":147113},"Duplicate events possible",{"type":17,"tag":84,"props":147115,"children":147116},{},[147117],{"type":23,"value":147118},"Retries for failed deliveries",{"type":17,"tag":29,"props":147120,"children":147121},{},[147122],{"type":23,"value":147123},"To configure webhooks:",{"type":17,"tag":6154,"props":147125,"children":147126},{},[147127,147136],{"type":17,"tag":84,"props":147128,"children":147129},{},[147130,147132],{"type":23,"value":147131},"In your HubSpot developer app, go to ",{"type":17,"tag":48,"props":147133,"children":147134},{},[147135],{"type":23,"value":43896},{"type":17,"tag":84,"props":147137,"children":147138},{},[147139,147141,147146],{"type":23,"value":147140},"Set the ",{"type":17,"tag":48,"props":147142,"children":147143},{},[147144],{"type":23,"value":147145},"Target URL",{"type":23,"value":147147}," to your webhook receiver, for example:",{"type":17,"tag":6893,"props":147149,"children":147152},{"className":147150,"code":147151,"language":20901,"meta":23},[20899],"https://yourapp.com/webhooks/hubspot\n",[147153],{"type":17,"tag":6121,"props":147154,"children":147155},{"__ignoreMap":7},[147156],{"type":23,"value":147151},{"type":17,"tag":6154,"props":147158,"children":147159},{},[147160],{"type":17,"tag":84,"props":147161,"children":147162},{},[147163],{"type":23,"value":147164},"Subscribe to the object events you need (e.g., contact.propertyChange, deal.propertyChange)",{"type":17,"tag":29,"props":147166,"children":147167},{},[147168],{"type":23,"value":19088},{"type":17,"tag":80,"props":147170,"children":147171},{},[147172,147177,147182,147187,147192],{"type":17,"tag":84,"props":147173,"children":147174},{},[147175],{"type":23,"value":147176},"Verify webhook signatures",{"type":17,"tag":84,"props":147178,"children":147179},{},[147180],{"type":23,"value":147181},"Respond quickly (return 2xx promptly)",{"type":17,"tag":84,"props":147183,"children":147184},{},[147185],{"type":23,"value":147186},"Deduplicate events",{"type":17,"tag":84,"props":147188,"children":147189},{},[147190],{"type":23,"value":147191},"Handle out-of-order delivery",{"type":17,"tag":84,"props":147193,"children":147194},{},[147195],{"type":23,"value":147196},"Implement idempotent writes",{"type":17,"tag":29,"props":147198,"children":147199},{},[147200],{"type":23,"value":147201},"Webhook subscriptions are app-level, meaning they apply to every account that installs your app.",{"type":17,"tag":68,"props":147203,"children":147205},{"id":147204},"where-hubspot-integrations-become-operationally-expensive",[147206],{"type":23,"value":147207},"Where HubSpot Integrations Become Operationally Expensive",{"type":17,"tag":29,"props":147209,"children":147210},{},[147211],{"type":23,"value":147212},"Direct HubSpot integration means you own:",{"type":17,"tag":80,"props":147214,"children":147215},{},[147216,147221,147226,147231,147236,147241,147246,147251,147256,147261,147266],{"type":17,"tag":84,"props":147217,"children":147218},{},[147219],{"type":23,"value":147220},"OAuth scope drift",{"type":17,"tag":84,"props":147222,"children":147223},{},[147224],{"type":23,"value":147225},"Token refresh logic",{"type":17,"tag":84,"props":147227,"children":147228},{},[147229],{"type":23,"value":147230},"Retry logic for 429 responses",{"type":17,"tag":84,"props":147232,"children":147233},{},[147234],{"type":23,"value":147235},"Burst limits (110–190 per 10 seconds depending on plan)",{"type":17,"tag":84,"props":147237,"children":147238},{},[147239],{"type":23,"value":147240},"Daily limits (250K–1M per account depending on tier)",{"type":17,"tag":84,"props":147242,"children":147243},{},[147244],{"type":23,"value":147245},"Webhook subscription management",{"type":17,"tag":84,"props":147247,"children":147248},{},[147249],{"type":23,"value":147250},"Webhook retries + dead-letter handling",{"type":17,"tag":84,"props":147252,"children":147253},{},[147254],{"type":23,"value":147255},"Deduplication logic",{"type":17,"tag":84,"props":147257,"children":147258},{},[147259],{"type":23,"value":147260},"Search window partitioning to avoid 10K cap",{"type":17,"tag":84,"props":147262,"children":147263},{},[147264],{"type":23,"value":147265},"Multi-account authorization storage",{"type":17,"tag":84,"props":147267,"children":147268},{},[147269],{"type":23,"value":147270},"Region handling (US vs EU)",{"type":17,"tag":29,"props":147272,"children":147273},{},[147274],{"type":23,"value":147275},"For a single internal tool, this may be manageable.",{"type":17,"tag":29,"props":147277,"children":147278},{},[147279],{"type":23,"value":147280},"For a multi-tenant SaaS product supporting hundreds of HubSpot customers, this becomes infrastructure.",{"type":17,"tag":68,"props":147282,"children":147284},{"id":147283},"integrating-hubspot-via-unifieds-crm-api",[147285],{"type":23,"value":147286},"Integrating HubSpot via Unified's CRM API",{"type":17,"tag":29,"props":147288,"children":147289},{},[147290],{"type":23,"value":147291},"Unified provides a CRM-specific unified API surface.",{"type":17,"tag":29,"props":147293,"children":147294},{},[147295],{"type":23,"value":147296},"Instead of implementing per-vendor OAuth, retries, and schema handling, you integrate once against the CRM category.",{"type":17,"tag":239,"props":147298,"children":147300},{"id":147299},"step-1-activate-hubspot-in-unified",[147301],{"type":23,"value":147302},"Step 1: Activate HubSpot in Unified",{"type":17,"tag":29,"props":147304,"children":147305},{},[147306],{"type":23,"value":129339},{"type":17,"tag":80,"props":147308,"children":147309},{},[147310,147318,147326,147346],{"type":17,"tag":84,"props":147311,"children":147312},{},[147313,147314],{"type":23,"value":6661},{"type":17,"tag":48,"props":147315,"children":147316},{},[147317],{"type":23,"value":42944},{"type":17,"tag":84,"props":147319,"children":147320},{},[147321,147322],{"type":23,"value":42950},{"type":17,"tag":48,"props":147323,"children":147324},{},[147325],{"type":23,"value":3184},{"type":17,"tag":84,"props":147327,"children":147328},{},[147329,147331],{"type":23,"value":147330},"Enter:\n",{"type":17,"tag":80,"props":147332,"children":147333},{},[147334,147338,147342],{"type":17,"tag":84,"props":147335,"children":147336},{},[147337],{"type":23,"value":6040},{"type":17,"tag":84,"props":147339,"children":147340},{},[147341],{"type":23,"value":6045},{"type":17,"tag":84,"props":147343,"children":147344},{},[147345],{"type":23,"value":146891},{"type":17,"tag":84,"props":147347,"children":147348},{},[147349],{"type":23,"value":6634},{"type":17,"tag":29,"props":147351,"children":147352},{},[147353],{"type":23,"value":147354},"Unified uses the same redirect URI:",{"type":17,"tag":6893,"props":147356,"children":147358},{"className":147357,"code":71416,"language":20901,"meta":23},[20899],[147359],{"type":17,"tag":6121,"props":147360,"children":147361},{"__ignoreMap":7},[147362],{"type":23,"value":71416},{"type":17,"tag":239,"props":147364,"children":147366},{"id":147365},"step-2-authorize-a-customer",[147367],{"type":23,"value":147368},"Step 2: Authorize a Customer",{"type":17,"tag":239,"props":147370,"children":147372},{"id":147371},"option-a-embedded-authorization-component",[147373],{"type":23,"value":147374},"Option A — Embedded Authorization Component",{"type":17,"tag":29,"props":147376,"children":147377},{},[147378],{"type":23,"value":147379},"Minimal React example:",{"type":17,"tag":6893,"props":147381,"children":147384},{"className":147382,"code":147383,"language":6898,"meta":7},[6896],"import UnifiedDirectory from '@unified-api/react-directory';\n\nfunction App() {\n  return (\n    \u003CUnifiedDirectory\n      workspaceId=\"{WORKSPACE_ID}\"\n      environmentId=\"production\"\n      success_redirect=\"https://yourapp.com/success\"\n    />\n  );\n}\n",[147385],{"type":17,"tag":6121,"props":147386,"children":147387},{"__ignoreMap":7},[147388],{"type":23,"value":147383},{"type":17,"tag":29,"props":147390,"children":147391},{},[147392],{"type":23,"value":147393},"When a user authorizes HubSpot:",{"type":17,"tag":80,"props":147395,"children":147396},{},[147397,147402,147407],{"type":17,"tag":84,"props":147398,"children":147399},{},[147400],{"type":23,"value":147401},"Unified handles the OAuth exchange.",{"type":17,"tag":84,"props":147403,"children":147404},{},[147405],{"type":23,"value":147406},"Tokens are stored securely.",{"type":17,"tag":84,"props":147408,"children":147409},{},[147410,147412,147417],{"type":23,"value":147411},"You receive a ",{"type":17,"tag":6121,"props":147413,"children":147415},{"className":147414},[],[147416],{"type":23,"value":25037},{"type":23,"value":147418}," in the callback URL.",{"type":17,"tag":239,"props":147420,"children":147422},{"id":147421},"option-b-custom-authorization-url",[147423],{"type":23,"value":147424},"Option B — Custom Authorization URL",{"type":17,"tag":29,"props":147426,"children":147427},{},[147428],{"type":23,"value":147429},"You can build your own UI and redirect to Unified's authorization endpoint with:",{"type":17,"tag":80,"props":147431,"children":147432},{},[147433,147438,147443,147447],{"type":17,"tag":84,"props":147434,"children":147435},{},[147436],{"type":23,"value":147437},"success_redirect",{"type":17,"tag":84,"props":147439,"children":147440},{},[147441],{"type":23,"value":147442},"failure_redirect",{"type":17,"tag":84,"props":147444,"children":147445},{},[147446],{"type":23,"value":77613},{"type":17,"tag":84,"props":147448,"children":147449},{},[147450],{"type":23,"value":77758},{"type":17,"tag":29,"props":147452,"children":147453},{},[147454],{"type":23,"value":147455},"After authorization, Unified returns:",{"type":17,"tag":80,"props":147457,"children":147458},{},[147459,147463],{"type":17,"tag":84,"props":147460,"children":147461},{},[147462],{"type":23,"value":25037},{"type":17,"tag":84,"props":147464,"children":147465},{},[147466],{"type":23,"value":147467},"state (if provided)",{"type":17,"tag":29,"props":147469,"children":147470},{},[147471],{"type":23,"value":147472},"No per-vendor token exchange logic required.",{"type":17,"tag":239,"props":147474,"children":147476},{"id":147475},"step-3-call-the-crm-api",[147477],{"type":23,"value":147478},"Step 3: Call the CRM API",{"type":17,"tag":29,"props":147480,"children":147481},{},[147482],{"type":23,"value":19878},{"type":17,"tag":6893,"props":147484,"children":147487},{"className":147485,"code":147486,"language":48432,"meta":7},[48430],"GET https://api.unified.to/crm/{connection_id}/contact?limit=100\nAuthorization: Bearer YOUR_API_KEY\n",[147488],{"type":17,"tag":6121,"props":147489,"children":147490},{"__ignoreMap":7},[147491],{"type":23,"value":147486},{"type":17,"tag":29,"props":147493,"children":147494},{},[147495],{"type":23,"value":147496},"Unified CRM supports:",{"type":17,"tag":80,"props":147498,"children":147499},{},[147500,147504,147508,147512,147516],{"type":17,"tag":84,"props":147501,"children":147502},{},[147503],{"type":23,"value":11243},{"type":17,"tag":84,"props":147505,"children":147506},{},[147507],{"type":23,"value":11832},{"type":17,"tag":84,"props":147509,"children":147510},{},[147511],{"type":23,"value":11254},{"type":17,"tag":84,"props":147513,"children":147514},{},[147515],{"type":23,"value":11845},{"type":17,"tag":84,"props":147517,"children":147518},{},[147519],{"type":23,"value":11852},{"type":17,"tag":29,"props":147521,"children":147522},{},[147523],{"type":23,"value":147524},"Across:",{"type":17,"tag":80,"props":147526,"children":147527},{},[147528,147532,147536,147540,147544,147548],{"type":17,"tag":84,"props":147529,"children":147530},{},[147531],{"type":23,"value":25846},{"type":17,"tag":84,"props":147533,"children":147534},{},[147535],{"type":23,"value":25828},{"type":17,"tag":84,"props":147537,"children":147538},{},[147539],{"type":23,"value":25810},{"type":17,"tag":84,"props":147541,"children":147542},{},[147543],{"type":23,"value":14528},{"type":17,"tag":84,"props":147545,"children":147546},{},[147547],{"type":23,"value":62749},{"type":17,"tag":84,"props":147549,"children":147550},{},[147551],{"type":23,"value":62847},{"type":17,"tag":29,"props":147553,"children":147554},{},[147555],{"type":23,"value":147556},"Readable and writable fields are validated, and writable fields are always a subset of readable fields.",{"type":17,"tag":29,"props":147558,"children":147559},{},[147560],{"type":23,"value":147561},"Pagination:",{"type":17,"tag":80,"props":147563,"children":147564},{},[147565,147569,147573,147577,147581],{"type":17,"tag":84,"props":147566,"children":147567},{},[147568],{"type":23,"value":48389},{"type":17,"tag":84,"props":147570,"children":147571},{},[147572],{"type":23,"value":48411},{"type":17,"tag":84,"props":147574,"children":147575},{},[147576],{"type":23,"value":26291},{"type":17,"tag":84,"props":147578,"children":147579},{},[147580],{"type":23,"value":48368},{"type":17,"tag":84,"props":147582,"children":147583},{},[147584],{"type":23,"value":147585},"object-specific filters",{"type":17,"tag":29,"props":147587,"children":147588},{},[147589],{"type":23,"value":147590},"If you need provider-specific fields, you can request original provider fields when required.",{"type":17,"tag":239,"props":147592,"children":147594},{"id":147593},"step-4-webhooks",[147595],{"type":23,"value":147596},"Step 4: Webhooks",{"type":17,"tag":29,"props":147598,"children":147599},{},[147600],{"type":23,"value":147601},"Create webhook:",{"type":17,"tag":6893,"props":147603,"children":147606},{"className":147604,"code":147605,"language":48432,"meta":7},[48430],"POST /unified/webhook\n{\n  hook_url: \"https://yourapp.com/webhook\",\n  connection_id: \"{CONNECTION_ID}\",\n  object_type: \"crm_contact\",\n  event: \"updated\"\n}\n",[147607],{"type":17,"tag":6121,"props":147608,"children":147609},{"__ignoreMap":7},[147610],{"type":23,"value":147605},{"type":17,"tag":29,"props":147612,"children":147613},{},[147614],{"type":23,"value":147615},"Webhook behavior:",{"type":17,"tag":80,"props":147617,"children":147618},{},[147619,147624,147629,147647,147651],{"type":17,"tag":84,"props":147620,"children":147621},{},[147622],{"type":23,"value":147623},"Native when provider supports it (HubSpot does)",{"type":17,"tag":84,"props":147625,"children":147626},{},[147627],{"type":23,"value":147628},"Virtual when provider lacks webhooks",{"type":17,"tag":84,"props":147630,"children":147631},{},[147632,147634],{"type":23,"value":147633},"Automatic retry:\n",{"type":17,"tag":80,"props":147635,"children":147636},{},[147637,147642],{"type":17,"tag":84,"props":147638,"children":147639},{},[147640],{"type":23,"value":147641},"3 immediate retries (1 second apart)",{"type":17,"tag":84,"props":147643,"children":147644},{},[147645],{"type":23,"value":147646},"Then Fibonacci backoff (1 min, 2 min, 3 min, 5 min, 8 min…)",{"type":17,"tag":84,"props":147648,"children":147649},{},[147650],{"type":23,"value":147108},{"type":17,"tag":84,"props":147652,"children":147653},{},[147654],{"type":23,"value":147655},"Duplicates possible → use atomic writes",{"type":17,"tag":29,"props":147657,"children":147658},{},[147659],{"type":23,"value":147660},"Webhook failures do not block API calls.",{"type":17,"tag":239,"props":147662,"children":147664},{"id":147663},"step-5-what-unified-handles",[147665],{"type":23,"value":147666},"Step 5: What Unified Handles",{"type":17,"tag":29,"props":147668,"children":147669},{},[147670],{"type":23,"value":147671},"Using Unified's CRM API means you do not build:",{"type":17,"tag":80,"props":147673,"children":147674},{},[147675,147680,147685,147690,147695,147700,147705],{"type":17,"tag":84,"props":147676,"children":147677},{},[147678],{"type":23,"value":147679},"OAuth token refresh logic",{"type":17,"tag":84,"props":147681,"children":147682},{},[147683],{"type":23,"value":147684},"Scope mapping logic",{"type":17,"tag":84,"props":147686,"children":147687},{},[147688],{"type":23,"value":147689},"Webhook subscription registration",{"type":17,"tag":84,"props":147691,"children":147692},{},[147693],{"type":23,"value":147694},"Retry backoff for webhook delivery",{"type":17,"tag":84,"props":147696,"children":147697},{},[147698],{"type":23,"value":147699},"Virtual polling fallback",{"type":17,"tag":84,"props":147701,"children":147702},{},[147703],{"type":23,"value":147704},"Per-provider schema mapping",{"type":17,"tag":84,"props":147706,"children":147707},{},[147708],{"type":23,"value":147709},"Per-provider rate-limit modeling",{"type":17,"tag":29,"props":147711,"children":147712},{},[147713],{"type":23,"value":147714},"Unified routes every request directly to the source API in real time and does not cache customer data.",{"type":17,"tag":29,"props":147716,"children":147717},{},[147718],{"type":23,"value":147719},"Pricing is usage-based, not per-connection.",{"type":17,"tag":68,"props":147721,"children":147722},{"id":72006},[147723],{"type":23,"value":129510},{"type":17,"tag":239,"props":147725,"children":147727},{"id":147726},"build-directly-with-hubspot-if",[147728],{"type":23,"value":147729},"Build Directly with HubSpot If:",{"type":17,"tag":80,"props":147731,"children":147732},{},[147733,147738,147743,147748],{"type":17,"tag":84,"props":147734,"children":147735},{},[147736],{"type":23,"value":147737},"You only support HubSpot",{"type":17,"tag":84,"props":147739,"children":147740},{},[147741],{"type":23,"value":147742},"You need deep HubSpot-only features",{"type":17,"tag":84,"props":147744,"children":147745},{},[147746],{"type":23,"value":147747},"You want full control of vendor logic",{"type":17,"tag":84,"props":147749,"children":147750},{},[147751],{"type":23,"value":147752},"You are building internal tooling",{"type":17,"tag":239,"props":147754,"children":147756},{"id":147755},"use-unifieds-crm-api-if",[147757],{"type":23,"value":147758},"Use Unified's CRM API If:",{"type":17,"tag":80,"props":147760,"children":147761},{},[147762,147767,147772,147777,147782,147787],{"type":17,"tag":84,"props":147763,"children":147764},{},[147765],{"type":23,"value":147766},"You support multiple CRMs (HubSpot + Salesforce + others)",{"type":17,"tag":84,"props":147768,"children":147769},{},[147770],{"type":23,"value":147771},"You want one CRM API surface across providers",{"type":17,"tag":84,"props":147773,"children":147774},{},[147775],{"type":23,"value":147776},"You want to avoid maintaining OAuth logic",{"type":17,"tag":84,"props":147778,"children":147779},{},[147780],{"type":23,"value":147781},"You want webhook retry handled",{"type":17,"tag":84,"props":147783,"children":147784},{},[147785],{"type":23,"value":147786},"You want consistent object schemas",{"type":17,"tag":84,"props":147788,"children":147789},{},[147790],{"type":23,"value":147791},"You want usage-based pricing without per-connection fees",{"type":17,"tag":68,"props":147793,"children":147794},{"id":883},[147795],{"type":23,"value":19178},{"type":17,"tag":29,"props":147797,"children":147798},{},[147799],{"type":23,"value":147800},"Integrating with HubSpot is not difficult.",{"type":17,"tag":29,"props":147802,"children":147803},{},[147804],{"type":23,"value":147805},"Operating a production-grade HubSpot integration across hundreds of customer accounts is.",{"type":17,"tag":29,"props":147807,"children":147808},{},[147809],{"type":23,"value":147810},"The difference between:",{"type":17,"tag":80,"props":147812,"children":147813},{},[147814,147823],{"type":17,"tag":84,"props":147815,"children":147816},{},[147817,147819,147822],{"type":23,"value":147818},"Fetching a contact",{"type":17,"tag":3891,"props":147820,"children":147821},{},[],{"type":23,"value":48975},{"type":17,"tag":84,"props":147824,"children":147825},{},[147826],{"type":23,"value":147827},"Running a multi-tenant, webhook-driven CRM integration layer",{"type":17,"tag":29,"props":147829,"children":147830},{},[147831],{"type":23,"value":147832},"is infrastructure.",{"type":17,"tag":29,"props":147834,"children":147835},{},[147836],{"type":23,"value":147837},"If HubSpot is your only CRM target and you have a dedicated integration team, build direct.",{"type":17,"tag":29,"props":147839,"children":147840},{},[147841],{"type":23,"value":147842},"If CRM integrations are a requirement—not your core product—using a CRM-specific unified API surface reduces long-term maintenance and accelerates delivery.",{"type":17,"tag":29,"props":147844,"children":147845},{},[147846],{"type":23,"value":147847},"And that tradeoff compounds over time.",{"type":17,"tag":29,"props":147849,"children":147850},{},[147851],{"type":17,"tag":133,"props":147852,"children":147854},{"href":1612,"rel":147853},[214],[147855],{"type":23,"value":44481},{"type":17,"tag":29,"props":147857,"children":147858},{},[147859],{"type":17,"tag":133,"props":147860,"children":147862},{"href":1623,"rel":147861},[214],[147863],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":147865},[147866,147875,147876,147885,147889],{"id":146661,"depth":1629,"text":146664,"children":147867},[147868,147869,147870,147871,147872,147873,147874],{"id":146667,"depth":1635,"text":146670},{"id":146678,"depth":1635,"text":146681},{"id":146751,"depth":1635,"text":146754},{"id":146833,"depth":1635,"text":146836},{"id":146896,"depth":1635,"text":146899},{"id":146978,"depth":1635,"text":146981},{"id":147078,"depth":1635,"text":147081},{"id":147204,"depth":1629,"text":147207},{"id":147283,"depth":1629,"text":147286,"children":147877},[147878,147879,147880,147881,147882,147883,147884],{"id":147299,"depth":1635,"text":147302},{"id":147365,"depth":1635,"text":147368},{"id":147371,"depth":1635,"text":147374},{"id":147421,"depth":1635,"text":147424},{"id":147475,"depth":1635,"text":147478},{"id":147593,"depth":1635,"text":147596},{"id":147663,"depth":1635,"text":147666},{"id":72006,"depth":1629,"text":129510,"children":147886},[147887,147888],{"id":147726,"depth":1635,"text":147729},{"id":147755,"depth":1635,"text":147758},{"id":883,"depth":1629,"text":19178},"content:blog:how_to_integrate_with_the_hubspot_api_a_step_by_step_guide_for_b2b_saas_teams.md","blog/how_to_integrate_with_the_hubspot_api_a_step_by_step_guide_for_b2b_saas_teams.md","blog/how_to_integrate_with_the_hubspot_api_a_step_by_step_guide_for_b2b_saas_teams",{"_path":147894,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":147895,"description":147896,"img":147897,"date":147898,"tag":12,"body":147899,"_type":1677,"_id":149234,"_source":1679,"_file":149235,"_stem":149236,"_extension":1682},"/blog/vertical_ai_for_b2b_saas_real_use_cases_across_fintech_sales_and_commerce","Vertical AI for B2B SaaS: Real Use Cases Across FinTech, Sales, and Commerce","Most discussions about vertical AI focus on investors or startup trends.","https://s3.us-east-2.amazonaws.com/unified-article-images/vertical_ai_for_b2b_saas_real_use_cases_across_fintech_sales_and_commerce-icon.png","2026-02-19T23:59:00.000Z",{"type":14,"children":147900,"toc":149204},[147901,147906,147909,147917,147921,147926,147934,147939,147966,147971,147976,147982,147987,147995,148000,148004,148032,148037,148061,148066,148071,148077,148083,148088,148111,148117,148122,148127,148146,148151,148172,148177,148195,148200,148206,148211,148234,148239,148257,148263,148268,148273,148278,148283,148288,148293,148319,148324,148330,148335,148340,148363,148368,148372,148399,148404,148421,148425,148433,148438,148443,148448,148471,148477,148482,148502,148507,148512,148535,148540,148546,148551,148556,148579,148584,148589,148610,148614,148632,148637,148642,148647,148670,148676,148681,148686,148691,148696,148701,148724,148729,148735,148740,148745,148768,148773,148778,148803,148807,148822,148826,148833,148838,148843,148848,148871,148877,148882,148887,148892,148897,148902,148908,148913,148917,148922,148927,148950,148955,148963,148968,148995,149000,149006,149011,149034,149039,149062,149067,149075,149080,149086,149090,149113,149118,149122,149145,149150,149155,149183,149188,149196],{"type":17,"tag":18,"props":147902,"children":147904},{"id":147903},"vertical-ai-for-b2b-saas-real-use-cases-across-fintech-sales-and-commerce",[147905],{"type":23,"value":147895},{"type":17,"tag":25,"props":147907,"children":147908},{},[],{"type":17,"tag":29,"props":147910,"children":147911},{},[147912],{"type":17,"tag":33,"props":147913,"children":147914},{},[147915],{"type":23,"value":147916},"February 19, 2026",{"type":17,"tag":29,"props":147918,"children":147919},{},[147920],{"type":23,"value":147896},{"type":17,"tag":29,"props":147922,"children":147923},{},[147924],{"type":23,"value":147925},"But if you're building B2B SaaS, the real question is:",{"type":17,"tag":29,"props":147927,"children":147928},{},[147929],{"type":17,"tag":48,"props":147930,"children":147931},{},[147932],{"type":23,"value":147933},"How do you power vertical AI features inside your product using real customer data?",{"type":17,"tag":29,"props":147935,"children":147936},{},[147937],{"type":23,"value":147938},"Vertical AI only works when it has:",{"type":17,"tag":80,"props":147940,"children":147941},{},[147942,147947,147952,147956,147961],{"type":17,"tag":84,"props":147943,"children":147944},{},[147945],{"type":23,"value":147946},"Structured objects",{"type":17,"tag":84,"props":147948,"children":147949},{},[147950],{"type":23,"value":147951},"Cross-category joins",{"type":17,"tag":84,"props":147953,"children":147954},{},[147955],{"type":23,"value":13156},{"type":17,"tag":84,"props":147957,"children":147958},{},[147959],{"type":23,"value":147960},"Reliable write support",{"type":17,"tag":84,"props":147962,"children":147963},{},[147964],{"type":23,"value":147965},"Consistent schemas across vendors",{"type":17,"tag":29,"props":147967,"children":147968},{},[147969],{"type":23,"value":147970},"That's where most teams hit friction.",{"type":17,"tag":29,"props":147972,"children":147973},{},[147974],{"type":23,"value":147975},"This article walks through concrete B2B SaaS use cases across FinTech, Sales, Lead Gen, and Commerce — using the exact data categories vertical AI systems depend on.",{"type":17,"tag":68,"props":147977,"children":147979},{"id":147978},"what-vertical-ai-actually-means-for-b2b-saas",[147980],{"type":23,"value":147981},"What Vertical AI Actually Means for B2B SaaS",{"type":17,"tag":29,"props":147983,"children":147984},{},[147985],{"type":23,"value":147986},"For a SaaS product, vertical AI means:",{"type":17,"tag":3414,"props":147988,"children":147989},{},[147990],{"type":17,"tag":29,"props":147991,"children":147992},{},[147993],{"type":23,"value":147994},"Using normalized, real-time data from multiple customer platforms to power industry-specific AI features.",{"type":17,"tag":29,"props":147996,"children":147997},{},[147998],{"type":23,"value":147999},"It is not just adding a chatbot.",{"type":17,"tag":29,"props":148001,"children":148002},{},[148003],{"type":23,"value":104074},{"type":17,"tag":80,"props":148005,"children":148006},{},[148007,148012,148017,148022,148027],{"type":17,"tag":84,"props":148008,"children":148009},{},[148010],{"type":23,"value":148011},"Pulling invoices from accounting platforms",{"type":17,"tag":84,"props":148013,"children":148014},{},[148015],{"type":23,"value":148016},"Joining them with payment activity",{"type":17,"tag":84,"props":148018,"children":148019},{},[148020],{"type":23,"value":148021},"Linking to CRM records",{"type":17,"tag":84,"props":148023,"children":148024},{},[148025],{"type":23,"value":148026},"Scoring risk or opportunity",{"type":17,"tag":84,"props":148028,"children":148029},{},[148030],{"type":23,"value":148031},"Writing results back",{"type":17,"tag":29,"props":148033,"children":148034},{},[148035],{"type":23,"value":148036},"That requires clean data across:",{"type":17,"tag":80,"props":148038,"children":148039},{},[148040,148044,148048,148052,148057],{"type":17,"tag":84,"props":148041,"children":148042},{},[148043],{"type":23,"value":104365},{"type":17,"tag":84,"props":148045,"children":148046},{},[148047],{"type":23,"value":11737},{"type":17,"tag":84,"props":148049,"children":148050},{},[148051],{"type":23,"value":25731},{"type":17,"tag":84,"props":148053,"children":148054},{},[148055],{"type":23,"value":148056},"Forms & Marketing",{"type":17,"tag":84,"props":148058,"children":148059},{},[148060],{"type":23,"value":11638},{"type":17,"tag":29,"props":148062,"children":148063},{},[148064],{"type":23,"value":148065},"As outlined in Unified's vertical AI use case definition , vertical AI depends on normalized category APIs that let you join records across systems without building and maintaining dozens of integrations.",{"type":17,"tag":29,"props":148067,"children":148068},{},[148069],{"type":23,"value":148070},"Let's make this concrete.",{"type":17,"tag":68,"props":148072,"children":148074},{"id":148073},"use-case-1-fintech-risk-scoring-revenue-intelligence",[148075],{"type":23,"value":148076},"Use Case 1: FinTech Risk Scoring & Revenue Intelligence",{"type":17,"tag":239,"props":148078,"children":148080},{"id":148079},"the-saas-product",[148081],{"type":23,"value":148082},"The SaaS Product",{"type":17,"tag":29,"props":148084,"children":148085},{},[148086],{"type":23,"value":148087},"A B2B FinTech platform that offers:",{"type":17,"tag":80,"props":148089,"children":148090},{},[148091,148096,148101,148106],{"type":17,"tag":84,"props":148092,"children":148093},{},[148094],{"type":23,"value":148095},"Credit underwriting",{"type":17,"tag":84,"props":148097,"children":148098},{},[148099],{"type":23,"value":148100},"Revenue-based financing",{"type":17,"tag":84,"props":148102,"children":148103},{},[148104],{"type":23,"value":148105},"Fraud detection",{"type":17,"tag":84,"props":148107,"children":148108},{},[148109],{"type":23,"value":148110},"Cash flow forecasting",{"type":17,"tag":239,"props":148112,"children":148114},{"id":148113},"the-data-required",[148115],{"type":23,"value":148116},"The Data Required",{"type":17,"tag":29,"props":148118,"children":148119},{},[148120],{"type":23,"value":148121},"To score risk properly, the system needs:",{"type":17,"tag":29,"props":148123,"children":148124},{},[148125],{"type":23,"value":148126},"From Accounting:",{"type":17,"tag":80,"props":148128,"children":148129},{},[148130,148134,148138,148142],{"type":17,"tag":84,"props":148131,"children":148132},{},[148133],{"type":23,"value":83801},{"type":17,"tag":84,"props":148135,"children":148136},{},[148137],{"type":23,"value":70733},{"type":17,"tag":84,"props":148139,"children":148140},{},[148141],{"type":23,"value":83823},{"type":17,"tag":84,"props":148143,"children":148144},{},[148145],{"type":23,"value":83810},{"type":17,"tag":29,"props":148147,"children":148148},{},[148149],{"type":23,"value":148150},"From Payments:",{"type":17,"tag":80,"props":148152,"children":148153},{},[148154,148159,148163,148168],{"type":17,"tag":84,"props":148155,"children":148156},{},[148157],{"type":23,"value":148158},"Payment transactions",{"type":17,"tag":84,"props":148160,"children":148161},{},[148162],{"type":23,"value":70859},{"type":17,"tag":84,"props":148164,"children":148165},{},[148166],{"type":23,"value":148167},"Payouts",{"type":17,"tag":84,"props":148169,"children":148170},{},[148171],{"type":23,"value":70796},{"type":17,"tag":29,"props":148173,"children":148174},{},[148175],{"type":23,"value":148176},"From CRM:",{"type":17,"tag":80,"props":148178,"children":148179},{},[148180,148185,148190],{"type":17,"tag":84,"props":148181,"children":148182},{},[148183],{"type":23,"value":148184},"Customer records",{"type":17,"tag":84,"props":148186,"children":148187},{},[148188],{"type":23,"value":148189},"Deal history",{"type":17,"tag":84,"props":148191,"children":148192},{},[148193],{"type":23,"value":148194},"Company metadata",{"type":17,"tag":29,"props":148196,"children":148197},{},[148198],{"type":23,"value":148199},"As defined in the one-pager , these objects live across categories.",{"type":17,"tag":239,"props":148201,"children":148203},{"id":148202},"the-ai-layer",[148204],{"type":23,"value":148205},"The AI Layer",{"type":17,"tag":29,"props":148207,"children":148208},{},[148209],{"type":23,"value":148210},"The platform joins:",{"type":17,"tag":80,"props":148212,"children":148213},{},[148214,148219,148224,148229],{"type":17,"tag":84,"props":148215,"children":148216},{},[148217],{"type":23,"value":148218},"Invoice volume",{"type":17,"tag":84,"props":148220,"children":148221},{},[148222],{"type":23,"value":148223},"Payment timing",{"type":17,"tag":84,"props":148225,"children":148226},{},[148227],{"type":23,"value":148228},"Refund patterns",{"type":17,"tag":84,"props":148230,"children":148231},{},[148232],{"type":23,"value":148233},"CRM account tenure",{"type":17,"tag":29,"props":148235,"children":148236},{},[148237],{"type":23,"value":148238},"It feeds this into:",{"type":17,"tag":80,"props":148240,"children":148241},{},[148242,148247,148252],{"type":17,"tag":84,"props":148243,"children":148244},{},[148245],{"type":23,"value":148246},"Default risk models",{"type":17,"tag":84,"props":148248,"children":148249},{},[148250],{"type":23,"value":148251},"Revenue prediction models",{"type":17,"tag":84,"props":148253,"children":148254},{},[148255],{"type":23,"value":148256},"Fraud anomaly detection",{"type":17,"tag":239,"props":148258,"children":148260},{"id":148259},"why-infrastructure-matters",[148261],{"type":23,"value":148262},"Why Infrastructure Matters",{"type":17,"tag":29,"props":148264,"children":148265},{},[148266],{"type":23,"value":148267},"If invoices are stale",{"type":17,"tag":29,"props":148269,"children":148270},{},[148271],{"type":23,"value":148272},"If payment events are delayed",{"type":17,"tag":29,"props":148274,"children":148275},{},[148276],{"type":23,"value":148277},"If custom fields aren't accessible",{"type":17,"tag":29,"props":148279,"children":148280},{},[148281],{"type":23,"value":148282},"If write-back isn't supported",{"type":17,"tag":29,"props":148284,"children":148285},{},[148286],{"type":23,"value":148287},"The model becomes unreliable.",{"type":17,"tag":29,"props":148289,"children":148290},{},[148291],{"type":23,"value":148292},"Vertical AI in FinTech requires:",{"type":17,"tag":80,"props":148294,"children":148295},{},[148296,148301,148305,148314],{"type":17,"tag":84,"props":148297,"children":148298},{},[148299],{"type":23,"value":148300},"Real-time read access",{"type":17,"tag":84,"props":148302,"children":148303},{},[148304],{"type":23,"value":147951},{"type":17,"tag":84,"props":148306,"children":148307},{},[148308,148312],{"type":17,"tag":133,"props":148309,"children":148310},{"href":4999},[148311],{"type":23,"value":43896},{"type":23,"value":148313}," for transaction updates",{"type":17,"tag":84,"props":148315,"children":148316},{},[148317],{"type":23,"value":148318},"Write support for flags, tags, risk scores",{"type":17,"tag":29,"props":148320,"children":148321},{},[148322],{"type":23,"value":148323},"Without normalized schemas, every vendor becomes a separate build.",{"type":17,"tag":68,"props":148325,"children":148327},{"id":148326},"use-case-2-sales-ai-opportunity-scoring-deal-acceleration",[148328],{"type":23,"value":148329},"Use Case 2: Sales AI – Opportunity Scoring & Deal Acceleration",{"type":17,"tag":239,"props":148331,"children":148333},{"id":148332},"the-saas-product-1",[148334],{"type":23,"value":148082},{"type":17,"tag":29,"props":148336,"children":148337},{},[148338],{"type":23,"value":148339},"A sales enablement or RevOps platform that provides:",{"type":17,"tag":80,"props":148341,"children":148342},{},[148343,148348,148353,148358],{"type":17,"tag":84,"props":148344,"children":148345},{},[148346],{"type":23,"value":148347},"Deal scoring",{"type":17,"tag":84,"props":148349,"children":148350},{},[148351],{"type":23,"value":148352},"Forecast prediction",{"type":17,"tag":84,"props":148354,"children":148355},{},[148356],{"type":23,"value":148357},"Pipeline risk detection",{"type":17,"tag":84,"props":148359,"children":148360},{},[148361],{"type":23,"value":148362},"Rep performance insights",{"type":17,"tag":239,"props":148364,"children":148366},{"id":148365},"the-data-required-1",[148367],{"type":23,"value":148116},{"type":17,"tag":29,"props":148369,"children":148370},{},[148371],{"type":23,"value":148176},{"type":17,"tag":80,"props":148373,"children":148374},{},[148375,148379,148383,148387,148391,148395],{"type":17,"tag":84,"props":148376,"children":148377},{},[148378],{"type":23,"value":31619},{"type":17,"tag":84,"props":148380,"children":148381},{},[148382],{"type":23,"value":63123},{"type":17,"tag":84,"props":148384,"children":148385},{},[148386],{"type":23,"value":56943},{"type":17,"tag":84,"props":148388,"children":148389},{},[148390],{"type":23,"value":63113},{"type":17,"tag":84,"props":148392,"children":148393},{},[148394],{"type":23,"value":56904},{"type":17,"tag":84,"props":148396,"children":148397},{},[148398],{"type":23,"value":6701},{"type":17,"tag":29,"props":148400,"children":148401},{},[148402],{"type":23,"value":148403},"From Marketing & Forms:",{"type":17,"tag":80,"props":148405,"children":148406},{},[148407,148411,148416],{"type":17,"tag":84,"props":148408,"children":148409},{},[148410],{"type":23,"value":114506},{"type":17,"tag":84,"props":148412,"children":148413},{},[148414],{"type":23,"value":148415},"Campaign membership",{"type":17,"tag":84,"props":148417,"children":148418},{},[148419],{"type":23,"value":148420},"Lead source",{"type":17,"tag":29,"props":148422,"children":148423},{},[148424],{"type":23,"value":148150},{"type":17,"tag":80,"props":148426,"children":148427},{},[148428],{"type":17,"tag":84,"props":148429,"children":148430},{},[148431],{"type":23,"value":148432},"Closed-won billing confirmation",{"type":17,"tag":29,"props":148434,"children":148435},{},[148436],{"type":23,"value":148437},"outlines these CRM and marketing objects as core vertical data for sales AI.",{"type":17,"tag":239,"props":148439,"children":148441},{"id":148440},"the-ai-layer-1",[148442],{"type":23,"value":148205},{"type":17,"tag":29,"props":148444,"children":148445},{},[148446],{"type":23,"value":148447},"The system:",{"type":17,"tag":80,"props":148449,"children":148450},{},[148451,148456,148461,148466],{"type":17,"tag":84,"props":148452,"children":148453},{},[148454],{"type":23,"value":148455},"Scores leads based on form behavior",{"type":17,"tag":84,"props":148457,"children":148458},{},[148459],{"type":23,"value":148460},"Evaluates deal health from activity cadence",{"type":17,"tag":84,"props":148462,"children":148463},{},[148464],{"type":23,"value":148465},"Predicts close probability",{"type":17,"tag":84,"props":148467,"children":148468},{},[148469],{"type":23,"value":148470},"Flags stalled accounts",{"type":17,"tag":239,"props":148472,"children":148474},{"id":148473},"the-critical-requirement",[148475],{"type":23,"value":148476},"The Critical Requirement",{"type":17,"tag":29,"props":148478,"children":148479},{},[148480],{"type":23,"value":148481},"Deal objects must be normalized across:",{"type":17,"tag":80,"props":148483,"children":148484},{},[148485,148489,148493,148497],{"type":17,"tag":84,"props":148486,"children":148487},{},[148488],{"type":23,"value":3179},{"type":17,"tag":84,"props":148490,"children":148491},{},[148492],{"type":23,"value":3184},{"type":17,"tag":84,"props":148494,"children":148495},{},[148496],{"type":23,"value":91064},{"type":17,"tag":84,"props":148498,"children":148499},{},[148500],{"type":23,"value":148501},"Other CRMs",{"type":17,"tag":29,"props":148503,"children":148504},{},[148505],{"type":23,"value":148506},"If each vendor uses different structures and fields, you cannot build a reusable AI model.",{"type":17,"tag":29,"props":148508,"children":148509},{},[148510],{"type":23,"value":148511},"You need:",{"type":17,"tag":80,"props":148513,"children":148514},{},[148515,148520,148525,148530],{"type":17,"tag":84,"props":148516,"children":148517},{},[148518],{"type":23,"value":148519},"A consistent deal schema",{"type":17,"tag":84,"props":148521,"children":148522},{},[148523],{"type":23,"value":148524},"Unified association logic",{"type":17,"tag":84,"props":148526,"children":148527},{},[148528],{"type":23,"value":148529},"Real-time updates via webhooks",{"type":17,"tag":84,"props":148531,"children":148532},{},[148533],{"type":23,"value":148534},"Access to provider-specific custom fields",{"type":17,"tag":29,"props":148536,"children":148537},{},[148538],{"type":23,"value":148539},"Vertical AI in sales fails if integration logic explodes per CRM.",{"type":17,"tag":68,"props":148541,"children":148543},{"id":148542},"use-case-3-lead-generation-ai-lead-quality-routing",[148544],{"type":23,"value":148545},"Use Case 3: Lead Generation AI – Lead Quality & Routing",{"type":17,"tag":239,"props":148547,"children":148549},{"id":148548},"the-saas-product-2",[148550],{"type":23,"value":148082},{"type":17,"tag":29,"props":148552,"children":148553},{},[148554],{"type":23,"value":148555},"A B2B lead intelligence platform that:",{"type":17,"tag":80,"props":148557,"children":148558},{},[148559,148564,148569,148574],{"type":17,"tag":84,"props":148560,"children":148561},{},[148562],{"type":23,"value":148563},"Captures inbound forms",{"type":17,"tag":84,"props":148565,"children":148566},{},[148567],{"type":23,"value":148568},"Scores lead intent",{"type":17,"tag":84,"props":148570,"children":148571},{},[148572],{"type":23,"value":148573},"Routes leads to reps",{"type":17,"tag":84,"props":148575,"children":148576},{},[148577],{"type":23,"value":148578},"Enriches prospect data",{"type":17,"tag":239,"props":148580,"children":148582},{"id":148581},"the-data-required-2",[148583],{"type":23,"value":148116},{"type":17,"tag":29,"props":148585,"children":148586},{},[148587],{"type":23,"value":148588},"From Forms & Marketing:",{"type":17,"tag":80,"props":148590,"children":148591},{},[148592,148596,148600,148605],{"type":17,"tag":84,"props":148593,"children":148594},{},[148595],{"type":23,"value":114506},{"type":17,"tag":84,"props":148597,"children":148598},{},[148599],{"type":23,"value":41708},{"type":17,"tag":84,"props":148601,"children":148602},{},[148603],{"type":23,"value":148604},"Marketing lists",{"type":17,"tag":84,"props":148606,"children":148607},{},[148608],{"type":23,"value":148609},"Messages",{"type":17,"tag":29,"props":148611,"children":148612},{},[148613],{"type":23,"value":148176},{"type":17,"tag":80,"props":148615,"children":148616},{},[148617,148622,148627],{"type":17,"tag":84,"props":148618,"children":148619},{},[148620],{"type":23,"value":148621},"Lead conversion status",{"type":17,"tag":84,"props":148623,"children":148624},{},[148625],{"type":23,"value":148626},"Account ownership",{"type":17,"tag":84,"props":148628,"children":148629},{},[148630],{"type":23,"value":148631},"Opportunity creation",{"type":17,"tag":29,"props":148633,"children":148634},{},[148635],{"type":23,"value":148636},"As defined in , these objects power vertical AI for lead generation.",{"type":17,"tag":239,"props":148638,"children":148640},{"id":148639},"the-ai-layer-2",[148641],{"type":23,"value":148205},{"type":17,"tag":29,"props":148643,"children":148644},{},[148645],{"type":23,"value":148646},"The model:",{"type":17,"tag":80,"props":148648,"children":148649},{},[148650,148655,148660,148665],{"type":17,"tag":84,"props":148651,"children":148652},{},[148653],{"type":23,"value":148654},"Scores lead quality",{"type":17,"tag":84,"props":148656,"children":148657},{},[148658],{"type":23,"value":148659},"Predicts conversion probability",{"type":17,"tag":84,"props":148661,"children":148662},{},[148663],{"type":23,"value":148664},"Assigns routing",{"type":17,"tag":84,"props":148666,"children":148667},{},[148668],{"type":23,"value":148669},"Personalizes outreach",{"type":17,"tag":239,"props":148671,"children":148673},{"id":148672},"what-breaks-it",[148674],{"type":23,"value":148675},"What Breaks It",{"type":17,"tag":29,"props":148677,"children":148678},{},[148679],{"type":23,"value":148680},"If form submissions sync only every few hours",{"type":17,"tag":29,"props":148682,"children":148683},{},[148684],{"type":23,"value":148685},"If campaign membership isn't normalized",{"type":17,"tag":29,"props":148687,"children":148688},{},[148689],{"type":23,"value":148690},"If CRM updates lag",{"type":17,"tag":29,"props":148692,"children":148693},{},[148694],{"type":23,"value":148695},"Routing becomes inconsistent.",{"type":17,"tag":29,"props":148697,"children":148698},{},[148699],{"type":23,"value":148700},"Vertical AI here requires:",{"type":17,"tag":80,"props":148702,"children":148703},{},[148704,148709,148714,148719],{"type":17,"tag":84,"props":148705,"children":148706},{},[148707],{"type":23,"value":148708},"Real-time ingestion",{"type":17,"tag":84,"props":148710,"children":148711},{},[148712],{"type":23,"value":148713},"Normalized contact and lead objects",{"type":17,"tag":84,"props":148715,"children":148716},{},[148717],{"type":23,"value":148718},"Write-back support to update routing fields",{"type":17,"tag":84,"props":148720,"children":148721},{},[148722],{"type":23,"value":148723},"Event-driven triggers",{"type":17,"tag":29,"props":148725,"children":148726},{},[148727],{"type":23,"value":148728},"Not periodic exports.",{"type":17,"tag":68,"props":148730,"children":148732},{"id":148731},"use-case-4-e-commerce-ai-product-revenue-intelligence",[148733],{"type":23,"value":148734},"Use Case 4: E-Commerce AI – Product & Revenue Intelligence",{"type":17,"tag":239,"props":148736,"children":148738},{"id":148737},"the-saas-product-3",[148739],{"type":23,"value":148082},{"type":17,"tag":29,"props":148741,"children":148742},{},[148743],{"type":23,"value":148744},"A commerce analytics platform that provides:",{"type":17,"tag":80,"props":148746,"children":148747},{},[148748,148753,148758,148763],{"type":17,"tag":84,"props":148749,"children":148750},{},[148751],{"type":23,"value":148752},"Inventory forecasting",{"type":17,"tag":84,"props":148754,"children":148755},{},[148756],{"type":23,"value":148757},"Product recommendation engines",{"type":17,"tag":84,"props":148759,"children":148760},{},[148761],{"type":23,"value":148762},"Revenue optimization",{"type":17,"tag":84,"props":148764,"children":148765},{},[148766],{"type":23,"value":148767},"Multi-channel attribution",{"type":17,"tag":239,"props":148769,"children":148771},{"id":148770},"the-data-required-3",[148772],{"type":23,"value":148116},{"type":17,"tag":29,"props":148774,"children":148775},{},[148776],{"type":23,"value":148777},"From Commerce:",{"type":17,"tag":80,"props":148779,"children":148780},{},[148781,148786,148790,148794,148798],{"type":17,"tag":84,"props":148782,"children":148783},{},[148784],{"type":23,"value":148785},"Products (items / SKUs / variants)",{"type":17,"tag":84,"props":148787,"children":148788},{},[148789],{"type":23,"value":38946},{"type":17,"tag":84,"props":148791,"children":148792},{},[148793],{"type":23,"value":38941},{"type":17,"tag":84,"props":148795,"children":148796},{},[148797],{"type":23,"value":38956},{"type":17,"tag":84,"props":148799,"children":148800},{},[148801],{"type":23,"value":148802},"Sales channels",{"type":17,"tag":29,"props":148804,"children":148805},{},[148806],{"type":23,"value":148150},{"type":17,"tag":80,"props":148808,"children":148809},{},[148810,148814,148818],{"type":17,"tag":84,"props":148811,"children":148812},{},[148813],{"type":23,"value":83810},{"type":17,"tag":84,"props":148815,"children":148816},{},[148817],{"type":23,"value":70859},{"type":17,"tag":84,"props":148819,"children":148820},{},[148821],{"type":23,"value":70796},{"type":17,"tag":29,"props":148823,"children":148824},{},[148825],{"type":23,"value":148176},{"type":17,"tag":80,"props":148827,"children":148828},{},[148829],{"type":17,"tag":84,"props":148830,"children":148831},{},[148832],{"type":23,"value":148184},{"type":17,"tag":29,"props":148834,"children":148835},{},[148836],{"type":23,"value":148837},"defines these as core commerce vertical objects.",{"type":17,"tag":239,"props":148839,"children":148841},{"id":148840},"the-ai-layer-3",[148842],{"type":23,"value":148205},{"type":17,"tag":29,"props":148844,"children":148845},{},[148846],{"type":23,"value":148847},"The platform:",{"type":17,"tag":80,"props":148849,"children":148850},{},[148851,148856,148861,148866],{"type":17,"tag":84,"props":148852,"children":148853},{},[148854],{"type":23,"value":148855},"Predicts stockouts",{"type":17,"tag":84,"props":148857,"children":148858},{},[148859],{"type":23,"value":148860},"Recommends cross-sell bundles",{"type":17,"tag":84,"props":148862,"children":148863},{},[148864],{"type":23,"value":148865},"Scores customer LTV",{"type":17,"tag":84,"props":148867,"children":148868},{},[148869],{"type":23,"value":148870},"Detects refund anomalies",{"type":17,"tag":239,"props":148872,"children":148874},{"id":148873},"the-architectural-requirement",[148875],{"type":23,"value":148876},"The Architectural Requirement",{"type":17,"tag":29,"props":148878,"children":148879},{},[148880],{"type":23,"value":148881},"Inventory must be current.",{"type":17,"tag":29,"props":148883,"children":148884},{},[148885],{"type":23,"value":148886},"Transactions must update immediately.",{"type":17,"tag":29,"props":148888,"children":148889},{},[148890],{"type":23,"value":148891},"Customer records must join cleanly across categories.",{"type":17,"tag":29,"props":148893,"children":148894},{},[148895],{"type":23,"value":148896},"If data is cached or delayed, recommendations become wrong.",{"type":17,"tag":29,"props":148898,"children":148899},{},[148900],{"type":23,"value":148901},"Vertical AI in commerce is real-time or it fails.",{"type":17,"tag":68,"props":148903,"children":148905},{"id":148904},"the-cross-category-join-is-the-real-unlock",[148906],{"type":23,"value":148907},"The Cross-Category Join Is the Real Unlock",{"type":17,"tag":29,"props":148909,"children":148910},{},[148911],{"type":23,"value":148912},"The most powerful vertical AI use cases require joining records across categories.",{"type":17,"tag":29,"props":148914,"children":148915},{},[148916],{"type":23,"value":19878},{"type":17,"tag":29,"props":148918,"children":148919},{},[148920],{"type":23,"value":148921},"Customer_ID → Invoice → Payment → CRM Account → Campaign Source",{"type":17,"tag":29,"props":148923,"children":148924},{},[148925],{"type":23,"value":148926},"This is not possible if:",{"type":17,"tag":80,"props":148928,"children":148929},{},[148930,148935,148940,148945],{"type":17,"tag":84,"props":148931,"children":148932},{},[148933],{"type":23,"value":148934},"Schemas differ per vendor",{"type":17,"tag":84,"props":148936,"children":148937},{},[148938],{"type":23,"value":148939},"Foreign keys aren't consistent",{"type":17,"tag":84,"props":148941,"children":148942},{},[148943],{"type":23,"value":148944},"Custom fields aren't accessible",{"type":17,"tag":84,"props":148946,"children":148947},{},[148948],{"type":23,"value":148949},"Updates require manual polling",{"type":17,"tag":29,"props":148951,"children":148952},{},[148953],{"type":23,"value":148954},"specifically highlights:",{"type":17,"tag":3414,"props":148956,"children":148957},{},[148958],{"type":17,"tag":29,"props":148959,"children":148960},{},[148961],{"type":23,"value":148962},"Join records across categories using foreign key fields to create unified views of customers, transactions, leads, and products.",{"type":17,"tag":29,"props":148964,"children":148965},{},[148966],{"type":23,"value":148967},"That unified view is what enables:",{"type":17,"tag":80,"props":148969,"children":148970},{},[148971,148976,148981,148986,148991],{"type":17,"tag":84,"props":148972,"children":148973},{},[148974],{"type":23,"value":148975},"Risk scoring",{"type":17,"tag":84,"props":148977,"children":148978},{},[148979],{"type":23,"value":148980},"Forecasting",{"type":17,"tag":84,"props":148982,"children":148983},{},[148984],{"type":23,"value":148985},"Personalization",{"type":17,"tag":84,"props":148987,"children":148988},{},[148989],{"type":23,"value":148990},"Cross-sell",{"type":17,"tag":84,"props":148992,"children":148993},{},[148994],{"type":23,"value":148105},{"type":17,"tag":29,"props":148996,"children":148997},{},[148998],{"type":23,"value":148999},"Vertical AI depends on that layer.",{"type":17,"tag":68,"props":149001,"children":149003},{"id":149002},"the-hidden-constraint-real-time-execution",[149004],{"type":23,"value":149005},"The Hidden Constraint: Real-Time Execution",{"type":17,"tag":29,"props":149007,"children":149008},{},[149009],{"type":23,"value":149010},"Vertical AI models degrade quickly if:",{"type":17,"tag":80,"props":149012,"children":149013},{},[149014,149019,149024,149029],{"type":17,"tag":84,"props":149015,"children":149016},{},[149017],{"type":23,"value":149018},"Data syncs every 24 hours",{"type":17,"tag":84,"props":149020,"children":149021},{},[149022],{"type":23,"value":149023},"Webhooks are unreliable",{"type":17,"tag":84,"props":149025,"children":149026},{},[149027],{"type":23,"value":149028},"Writes are delayed",{"type":17,"tag":84,"props":149030,"children":149031},{},[149032],{"type":23,"value":149033},"Associations break",{"type":17,"tag":29,"props":149035,"children":149036},{},[149037],{"type":23,"value":149038},"The infrastructure must support:",{"type":17,"tag":80,"props":149040,"children":149041},{},[149042,149047,149052,149057],{"type":17,"tag":84,"props":149043,"children":149044},{},[149045],{"type":23,"value":149046},"Real-time read",{"type":17,"tag":84,"props":149048,"children":149049},{},[149050],{"type":23,"value":149051},"Real-time write",{"type":17,"tag":84,"props":149053,"children":149054},{},[149055],{"type":23,"value":149056},"Webhooks for created and updated events",{"type":17,"tag":84,"props":149058,"children":149059},{},[149060],{"type":23,"value":149061},"Support for provider-specific custom fields",{"type":17,"tag":29,"props":149063,"children":149064},{},[149065],{"type":23,"value":149066},"The one-pager explicitly notes:",{"type":17,"tag":3414,"props":149068,"children":149069},{},[149070],{"type":17,"tag":29,"props":149071,"children":149072},{},[149073],{"type":23,"value":149074},"Real-time read/write means data is fetched live; there is no caching",{"type":17,"tag":29,"props":149076,"children":149077},{},[149078],{"type":23,"value":149079},"That architecture is not optional for serious vertical AI.",{"type":17,"tag":68,"props":149081,"children":149083},{"id":149082},"why-this-matters-for-b2b-saas-builders",[149084],{"type":23,"value":149085},"Why This Matters for B2B SaaS Builders",{"type":17,"tag":29,"props":149087,"children":149088},{},[149089],{"type":23,"value":131951},{"type":17,"tag":80,"props":149091,"children":149092},{},[149093,149098,149103,149108],{"type":17,"tag":84,"props":149094,"children":149095},{},[149096],{"type":23,"value":149097},"FinTech AI",{"type":17,"tag":84,"props":149099,"children":149100},{},[149101],{"type":23,"value":149102},"Sales AI",{"type":17,"tag":84,"props":149104,"children":149105},{},[149106],{"type":23,"value":149107},"Marketing AI",{"type":17,"tag":84,"props":149109,"children":149110},{},[149111],{"type":23,"value":149112},"E-commerce AI",{"type":17,"tag":29,"props":149114,"children":149115},{},[149116],{"type":23,"value":149117},"Your competitive advantage is not just the model.",{"type":17,"tag":29,"props":149119,"children":149120},{},[149121],{"type":23,"value":104074},{"type":17,"tag":80,"props":149123,"children":149124},{},[149125,149130,149135,149140],{"type":17,"tag":84,"props":149126,"children":149127},{},[149128],{"type":23,"value":149129},"How clean your data is",{"type":17,"tag":84,"props":149131,"children":149132},{},[149133],{"type":23,"value":149134},"How consistent your object model is",{"type":17,"tag":84,"props":149136,"children":149137},{},[149138],{"type":23,"value":149139},"How fast your data updates",{"type":17,"tag":84,"props":149141,"children":149142},{},[149143],{"type":23,"value":149144},"How reliably you can write back into customer platforms",{"type":17,"tag":29,"props":149146,"children":149147},{},[149148],{"type":23,"value":149149},"Vertical AI is an integration architecture problem.",{"type":17,"tag":29,"props":149151,"children":149152},{},[149153],{"type":23,"value":149154},"The companies that win:",{"type":17,"tag":80,"props":149156,"children":149157},{},[149158,149163,149168,149173,149178],{"type":17,"tag":84,"props":149159,"children":149160},{},[149161],{"type":23,"value":149162},"Normalize objects per category",{"type":17,"tag":84,"props":149164,"children":149165},{},[149166],{"type":23,"value":149167},"Join records across categories",{"type":17,"tag":84,"props":149169,"children":149170},{},[149171],{"type":23,"value":149172},"Avoid storing third-party data unnecessarily",{"type":17,"tag":84,"props":149174,"children":149175},{},[149176],{"type":23,"value":149177},"Deliver real-time reads and writes",{"type":17,"tag":84,"props":149179,"children":149180},{},[149181],{"type":23,"value":149182},"Remove per-vendor integration logic",{"type":17,"tag":29,"props":149184,"children":149185},{},[149186],{"type":23,"value":149187},"That is how you build defensible AI features inside B2B SaaS.",{"type":17,"tag":29,"props":149189,"children":149190},{},[149191],{"type":17,"tag":133,"props":149192,"children":149194},{"href":1612,"rel":149193},[214],[149195],{"type":23,"value":44481},{"type":17,"tag":29,"props":149197,"children":149198},{},[149199],{"type":17,"tag":133,"props":149200,"children":149202},{"href":1623,"rel":149201},[214],[149203],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":149205},[149206,149207,149213,149219,149225,149231,149232,149233],{"id":147978,"depth":1629,"text":147981},{"id":148073,"depth":1629,"text":148076,"children":149208},[149209,149210,149211,149212],{"id":148079,"depth":1635,"text":148082},{"id":148113,"depth":1635,"text":148116},{"id":148202,"depth":1635,"text":148205},{"id":148259,"depth":1635,"text":148262},{"id":148326,"depth":1629,"text":148329,"children":149214},[149215,149216,149217,149218],{"id":148332,"depth":1635,"text":148082},{"id":148365,"depth":1635,"text":148116},{"id":148440,"depth":1635,"text":148205},{"id":148473,"depth":1635,"text":148476},{"id":148542,"depth":1629,"text":148545,"children":149220},[149221,149222,149223,149224],{"id":148548,"depth":1635,"text":148082},{"id":148581,"depth":1635,"text":148116},{"id":148639,"depth":1635,"text":148205},{"id":148672,"depth":1635,"text":148675},{"id":148731,"depth":1629,"text":148734,"children":149226},[149227,149228,149229,149230],{"id":148737,"depth":1635,"text":148082},{"id":148770,"depth":1635,"text":148116},{"id":148840,"depth":1635,"text":148205},{"id":148873,"depth":1635,"text":148876},{"id":148904,"depth":1629,"text":148907},{"id":149002,"depth":1629,"text":149005},{"id":149082,"depth":1629,"text":149085},"content:blog:vertical_ai_for_b2b_saas_real_use_cases_across_fintech_sales_and_commerce.md","blog/vertical_ai_for_b2b_saas_real_use_cases_across_fintech_sales_and_commerce.md","blog/vertical_ai_for_b2b_saas_real_use_cases_across_fintech_sales_and_commerce",{"_path":149238,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":120961,"description":149239,"img":149240,"date":149241,"tag":12,"body":149242,"_type":1677,"_id":150539,"_source":1679,"_file":150540,"_stem":150541,"_extension":1682},"/blog/how_to_offer_assessment_packages_and_receive_orders_with_unified_assessment_api","Assessment providers increasingly need to integrate directly into Applicant Tracking Systems (ATS) so recruiters can request assessments without leaving their...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_offer_assessment_packages_and_receive_orders_with_unified_assessment_api-icon.png","2026-02-19T23:32:00.000Z",{"type":14,"children":149243,"toc":150513},[149244,149249,149252,149259,149263,149268,149280,149307,149312,149317,149323,149328,149356,149361,149388,149398,149404,149409,149455,149460,149466,149477,149482,149514,149519,149528,149533,149539,149544,149550,149559,149565,149592,149604,149661,149667,149676,149682,149687,149758,149763,149769,149778,149783,149805,149811,149816,149821,149830,149835,149844,149849,149855,149868,149877,149882,149935,149940,149981,149987,149992,150015,150020,150066,150072,150077,150086,150090,150099,150104,150132,150138,150149,150197,150202,150208,150213,150236,150241,150247,150252,150270,150275,150293,150297,150302,150320,150325,150331,150365,150371,150381,150399,150409,150422,150427,150440,150444,150449,150472,150477,150482,150487,150492,150497,150505],{"type":17,"tag":18,"props":149245,"children":149247},{"id":149246},"how-to-offer-assessment-packages-and-receive-orders-with-unifieds-assessment-api",[149248],{"type":23,"value":120961},{"type":17,"tag":25,"props":149250,"children":149251},{},[],{"type":17,"tag":29,"props":149253,"children":149254},{},[149255],{"type":17,"tag":33,"props":149256,"children":149257},{},[149258],{"type":23,"value":147916},{"type":17,"tag":11616,"props":149260,"children":149262},{"width":11618,"height":11619,"src":149261,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/m9vlaZdv7GM",[],{"type":17,"tag":29,"props":149264,"children":149265},{},[149266],{"type":23,"value":149267},"Assessment providers increasingly need to integrate directly into Applicant Tracking Systems (ATS) so recruiters can request assessments without leaving their hiring workflow.",{"type":17,"tag":29,"props":149269,"children":149270},{},[149271,149273,149278],{"type":23,"value":149272},"The Unified ",{"type":17,"tag":133,"props":149274,"children":149275},{"href":52325},[149276],{"type":23,"value":149277},"Assessment API",{"type":23,"value":149279}," allows you to:",{"type":17,"tag":80,"props":149281,"children":149282},{},[149283,149288,149297,149302],{"type":17,"tag":84,"props":149284,"children":149285},{},[149286],{"type":23,"value":149287},"Publish assessment packages into supported ATS platforms",{"type":17,"tag":84,"props":149289,"children":149290},{},[149291,149293],{"type":23,"value":149292},"Receive recruiter-initiated assessment orders via ",{"type":17,"tag":133,"props":149294,"children":149295},{"href":4999},[149296],{"type":23,"value":5002},{"type":17,"tag":84,"props":149298,"children":149299},{},[149300],{"type":23,"value":149301},"Submit structured results back to the ATS",{"type":17,"tag":84,"props":149303,"children":149304},{},[149305],{"type":23,"value":149306},"Support multiple ATS platforms through a single integration",{"type":17,"tag":29,"props":149308,"children":149309},{},[149310],{"type":23,"value":149311},"This is not a status-trigger workflow.",{"type":17,"tag":29,"props":149313,"children":149314},{},[149315],{"type":23,"value":149316},"This is a recruiter-initiated, embedded integration model.",{"type":17,"tag":68,"props":149318,"children":149320},{"id":149319},"what-this-use-case-covers",[149321],{"type":23,"value":149322},"What This Use Case Covers",{"type":17,"tag":29,"props":149324,"children":149325},{},[149326],{"type":23,"value":149327},"This guide explains how to:",{"type":17,"tag":6154,"props":149329,"children":149330},{},[149331,149336,149341,149346,149351],{"type":17,"tag":84,"props":149332,"children":149333},{},[149334],{"type":23,"value":149335},"Create an assessment integration connection",{"type":17,"tag":84,"props":149337,"children":149338},{},[149339],{"type":23,"value":149340},"Publish assessment packages",{"type":17,"tag":84,"props":149342,"children":149343},{},[149344],{"type":23,"value":149345},"Receive recruiter-initiated assessment orders",{"type":17,"tag":84,"props":149347,"children":149348},{},[149349],{"type":23,"value":149350},"Process and update assessment results",{"type":17,"tag":84,"props":149352,"children":149353},{},[149354],{"type":23,"value":149355},"Handle order lifecycle events",{"type":17,"tag":29,"props":149357,"children":149358},{},[149359],{"type":23,"value":149360},"Supported ATS platforms (assessment integrations):",{"type":17,"tag":80,"props":149362,"children":149363},{},[149364,149368,149372,149376,149380,149384],{"type":17,"tag":84,"props":149365,"children":149366},{},[149367],{"type":23,"value":120850},{"type":17,"tag":84,"props":149369,"children":149370},{},[149371],{"type":23,"value":120879},{"type":17,"tag":84,"props":149373,"children":149374},{},[149375],{"type":23,"value":120840},{"type":17,"tag":84,"props":149377,"children":149378},{},[149379],{"type":23,"value":120889},{"type":17,"tag":84,"props":149381,"children":149382},{},[149383],{"type":23,"value":120899},{"type":17,"tag":84,"props":149385,"children":149386},{},[149387],{"type":23,"value":120860},{"type":17,"tag":29,"props":149389,"children":149390},{},[149391,149393,149397],{"type":23,"value":149392},"Each of these uses an assessment-specific integration type that is separate from the standard ",{"type":17,"tag":133,"props":149394,"children":149395},{"href":55696},[149396],{"type":23,"value":55699},{"type":23,"value":54},{"type":17,"tag":68,"props":149399,"children":149401},{"id":149400},"mental-model-embedded-assessment-integration",[149402],{"type":23,"value":149403},"Mental Model: Embedded Assessment Integration",{"type":17,"tag":29,"props":149405,"children":149406},{},[149407],{"type":23,"value":149408},"With the Assessment API:",{"type":17,"tag":6154,"props":149410,"children":149411},{},[149412,149417,149422,149427,149440,149445,149450],{"type":17,"tag":84,"props":149413,"children":149414},{},[149415],{"type":23,"value":149416},"You create assessment packages via Unified.",{"type":17,"tag":84,"props":149418,"children":149419},{},[149420],{"type":23,"value":149421},"The ATS lists your packages inside its interface.",{"type":17,"tag":84,"props":149423,"children":149424},{},[149425],{"type":23,"value":149426},"A recruiter selects a package and orders an assessment for a candidate.",{"type":17,"tag":84,"props":149428,"children":149429},{},[149430,149432,149438],{"type":23,"value":149431},"Unified sends you an ",{"type":17,"tag":6121,"props":149433,"children":149435},{"className":149434},[],[149436],{"type":23,"value":149437},"assessment_order",{"type":23,"value":149439}," webhook.",{"type":17,"tag":84,"props":149441,"children":149442},{},[149443],{"type":23,"value":149444},"You process the assessment.",{"type":17,"tag":84,"props":149446,"children":149447},{},[149448],{"type":23,"value":149449},"You submit results via the order update endpoint.",{"type":17,"tag":84,"props":149451,"children":149452},{},[149453],{"type":23,"value":149454},"The results appear inside the ATS.",{"type":17,"tag":29,"props":149456,"children":149457},{},[149458],{"type":23,"value":149459},"The recruiter never leaves the ATS.",{"type":17,"tag":68,"props":149461,"children":149463},{"id":149462},"step-1-create-an-assessment-connection",[149464],{"type":23,"value":149465},"Step 1: Create an Assessment Connection",{"type":17,"tag":29,"props":149467,"children":149468},{},[149469,149471,149476],{"type":23,"value":149470},"Unlike ATS OAuth connections, Assessment connections are manually created and authenticated using a ",{"type":17,"tag":48,"props":149472,"children":149473},{},[149474],{"type":23,"value":149475},"Partner API Key",{"type":23,"value":54},{"type":17,"tag":29,"props":149478,"children":149479},{},[149480],{"type":23,"value":149481},"You create a connection with:",{"type":17,"tag":80,"props":149483,"children":149484},{},[149485,149503],{"type":17,"tag":84,"props":149486,"children":149487},{},[149488,149494,149496,149502],{"type":17,"tag":6121,"props":149489,"children":149491},{"className":149490},[],[149492],{"type":23,"value":149493},"integration_type",{"type":23,"value":149495}," (e.g., ",{"type":17,"tag":6121,"props":149497,"children":149499},{"className":149498},[],[149500],{"type":23,"value":149501},"greenhouseassessment",{"type":23,"value":12034},{"type":17,"tag":84,"props":149504,"children":149505},{},[149506,149512],{"type":17,"tag":6121,"props":149507,"children":149509},{"className":149508},[],[149510],{"type":23,"value":149511},"auth.token",{"type":23,"value":149513}," (your Partner API Key)",{"type":17,"tag":29,"props":149515,"children":149516},{},[149517],{"type":23,"value":149518},"Your customer configures their ATS using:",{"type":17,"tag":6893,"props":149520,"children":149523},{"className":149521,"code":149522,"language":20901,"meta":23},[20899],"Base URL: https://api.unified.to/assessment/{connection_id}\nPartner API Key: \u003Cyour token>\n",[149524],{"type":17,"tag":6121,"props":149525,"children":149526},{"__ignoreMap":7},[149527],{"type":23,"value":149522},{"type":17,"tag":29,"props":149529,"children":149530},{},[149531],{"type":23,"value":149532},"Each assessment integration may have additional authentication requirements (for example, Ashby may require additional identifiers). Always verify integration-specific auth requirements before onboarding customers.",{"type":17,"tag":68,"props":149534,"children":149536},{"id":149535},"step-2-publish-assessment-packages",[149537],{"type":23,"value":149538},"Step 2: Publish Assessment Packages",{"type":17,"tag":29,"props":149540,"children":149541},{},[149542],{"type":23,"value":149543},"Recruiters cannot order an assessment unless you first publish packages.",{"type":17,"tag":239,"props":149545,"children":149547},{"id":149546},"create-a-package",[149548],{"type":23,"value":149549},"Create a Package",{"type":17,"tag":6893,"props":149551,"children":149554},{"className":149552,"code":149553,"language":20901,"meta":23},[20899],"POST /assessment/{connection_id}/package\n",[149555],{"type":17,"tag":6121,"props":149556,"children":149557},{"__ignoreMap":7},[149558],{"type":23,"value":149553},{"type":17,"tag":239,"props":149560,"children":149562},{"id":149561},"required-fields",[149563],{"type":23,"value":149564},"Required fields",{"type":17,"tag":80,"props":149566,"children":149567},{},[149568,149576,149584],{"type":17,"tag":84,"props":149569,"children":149570},{},[149571],{"type":17,"tag":6121,"props":149572,"children":149574},{"className":149573},[],[149575],{"type":23,"value":18766},{"type":17,"tag":84,"props":149577,"children":149578},{},[149579],{"type":17,"tag":6121,"props":149580,"children":149582},{"className":149581},[],[149583],{"type":23,"value":18781},{"type":17,"tag":84,"props":149585,"children":149586},{},[149587],{"type":17,"tag":6121,"props":149588,"children":149590},{"className":149589},[],[149591],{"type":23,"value":27310},{"type":17,"tag":29,"props":149593,"children":149594},{},[149595,149597,149602],{"type":23,"value":149596},"Valid ",{"type":17,"tag":6121,"props":149598,"children":149600},{"className":149599},[],[149601],{"type":23,"value":27310},{"type":23,"value":149603}," values:",{"type":17,"tag":80,"props":149605,"children":149606},{},[149607,149616,149625,149634,149643,149652],{"type":17,"tag":84,"props":149608,"children":149609},{},[149610],{"type":17,"tag":6121,"props":149611,"children":149613},{"className":149612},[],[149614],{"type":23,"value":149615},"SKILLS_TEST",{"type":17,"tag":84,"props":149617,"children":149618},{},[149619],{"type":17,"tag":6121,"props":149620,"children":149622},{"className":149621},[],[149623],{"type":23,"value":149624},"BEHAVIORAL_ASSESSMENT",{"type":17,"tag":84,"props":149626,"children":149627},{},[149628],{"type":17,"tag":6121,"props":149629,"children":149631},{"className":149630},[],[149632],{"type":23,"value":149633},"VIDEO_INTERVIEW",{"type":17,"tag":84,"props":149635,"children":149636},{},[149637],{"type":17,"tag":6121,"props":149638,"children":149640},{"className":149639},[],[149641],{"type":23,"value":149642},"BACKGROUND_CHECK",{"type":17,"tag":84,"props":149644,"children":149645},{},[149646],{"type":17,"tag":6121,"props":149647,"children":149649},{"className":149648},[],[149650],{"type":23,"value":149651},"REFERENCE_CHECK",{"type":17,"tag":84,"props":149653,"children":149654},{},[149655],{"type":17,"tag":6121,"props":149656,"children":149658},{"className":149657},[],[149659],{"type":23,"value":149660},"OTHER",{"type":17,"tag":239,"props":149662,"children":149664},{"id":149663},"example-node-sdk",[149665],{"type":23,"value":149666},"Example (Node SDK)",{"type":17,"tag":6893,"props":149668,"children":149671},{"className":149669,"code":149670,"language":18718,"meta":7},[18716],"const results = await sdk.assessment.createAssessmentPackage({\n  connectionId,\n  assessmentPackage: {\n    id: 'engineering_skills_v1',\n    name: 'Engineering Skills Test',\n    type: 'SKILLS_TEST',\n    description: 'Backend engineering evaluation',\n    max_score: 100,\n  },\n});\n",[149672],{"type":17,"tag":6121,"props":149673,"children":149674},{"__ignoreMap":7},[149675],{"type":23,"value":149670},{"type":17,"tag":239,"props":149677,"children":149679},{"id":149678},"package-configuration-fields",[149680],{"type":23,"value":149681},"Package Configuration Fields",{"type":17,"tag":29,"props":149683,"children":149684},{},[149685],{"type":23,"value":149686},"Key configuration fields include:",{"type":17,"tag":80,"props":149688,"children":149689},{},[149690,149701,149712,149723,149734,149749],{"type":17,"tag":84,"props":149691,"children":149692},{},[149693,149699],{"type":17,"tag":6121,"props":149694,"children":149696},{"className":149695},[],[149697],{"type":23,"value":149698},"parameters[]",{"type":23,"value":149700}," — assessment input fields (TEXT, NUMBER, FILE, etc.)",{"type":17,"tag":84,"props":149702,"children":149703},{},[149704,149710],{"type":17,"tag":6121,"props":149705,"children":149707},{"className":149706},[],[149708],{"type":23,"value":149709},"has_redirect_url",{"type":23,"value":149711}," — whether candidate is redirected externally",{"type":17,"tag":84,"props":149713,"children":149714},{},[149715,149721],{"type":17,"tag":6121,"props":149716,"children":149718},{"className":149717},[],[149719],{"type":23,"value":149720},"needs_ip_address",{"type":23,"value":149722}," — whether IP address is required",{"type":17,"tag":84,"props":149724,"children":149725},{},[149726,149732],{"type":17,"tag":6121,"props":149727,"children":149729},{"className":149728},[],[149730],{"type":23,"value":149731},"regions[]",{"type":23,"value":149733}," — availability restrictions",{"type":17,"tag":84,"props":149735,"children":149736},{},[149737,149743,149744],{"type":17,"tag":6121,"props":149738,"children":149740},{"className":149739},[],[149741],{"type":23,"value":149742},"cost_amount",{"type":23,"value":34435},{"type":17,"tag":6121,"props":149745,"children":149747},{"className":149746},[],[149748],{"type":23,"value":22296},{"type":17,"tag":84,"props":149750,"children":149751},{},[149752],{"type":17,"tag":6121,"props":149753,"children":149755},{"className":149754},[],[149756],{"type":23,"value":149757},"processing_time",{"type":17,"tag":29,"props":149759,"children":149760},{},[149761],{"type":23,"value":149762},"These determine how the ATS displays your package and what information it collects.",{"type":17,"tag":239,"props":149764,"children":149766},{"id":149765},"list-packages",[149767],{"type":23,"value":149768},"List Packages",{"type":17,"tag":6893,"props":149770,"children":149773},{"className":149771,"code":149772,"language":20901,"meta":23},[20899],"GET /assessment/{connection_id}/package\n",[149774],{"type":17,"tag":6121,"props":149775,"children":149776},{"__ignoreMap":7},[149777],{"type":23,"value":149772},{"type":17,"tag":29,"props":149779,"children":149780},{},[149781],{"type":23,"value":149782},"Default pagination:",{"type":17,"tag":80,"props":149784,"children":149785},{},[149786,149795],{"type":17,"tag":84,"props":149787,"children":149788},{},[149789,149794],{"type":17,"tag":6121,"props":149790,"children":149792},{"className":149791},[],[149793],{"type":23,"value":48389},{"type":23,"value":132712},{"type":17,"tag":84,"props":149796,"children":149797},{},[149798,149803],{"type":17,"tag":6121,"props":149799,"children":149801},{"className":149800},[],[149802],{"type":23,"value":48411},{"type":23,"value":149804}," (default 0)",{"type":17,"tag":68,"props":149806,"children":149808},{"id":149807},"step-3-configure-webhook-to-receive-orders",[149809],{"type":23,"value":149810},"Step 3: Configure Webhook to Receive Orders",{"type":17,"tag":29,"props":149812,"children":149813},{},[149814],{"type":23,"value":149815},"Assessment orders are delivered through the standard Unified webhook system.",{"type":17,"tag":29,"props":149817,"children":149818},{},[149819],{"type":23,"value":149820},"Create a webhook:",{"type":17,"tag":6893,"props":149822,"children":149825},{"className":149823,"code":149824,"language":20901,"meta":23},[20899],"POST /unified/webhook\n",[149826],{"type":17,"tag":6121,"props":149827,"children":149828},{"__ignoreMap":7},[149829],{"type":23,"value":149824},{"type":17,"tag":29,"props":149831,"children":149832},{},[149833],{"type":23,"value":149834},"Example configuration:",{"type":17,"tag":6893,"props":149836,"children":149839},{"className":149837,"code":149838,"language":22503,"meta":7},[22501],"{\n  \"hook_url\": \"https://your-platform.com/webhooks\",\n  \"connection_id\": \"\u003Cconnection_id>\",\n  \"object_type\": \"assessment_order\",\n  \"event\": \"created\"\n}\n",[149840],{"type":17,"tag":6121,"props":149841,"children":149842},{"__ignoreMap":7},[149843],{"type":23,"value":149838},{"type":17,"tag":29,"props":149845,"children":149846},{},[149847],{"type":23,"value":149848},"This webhook fires when a recruiter orders an assessment in the ATS.",{"type":17,"tag":239,"props":149850,"children":149852},{"id":149851},"webhook-payload",[149853],{"type":23,"value":149854},"Webhook Payload",{"type":17,"tag":29,"props":149856,"children":149857},{},[149858,149860,149866],{"type":23,"value":149859},"You receive an ",{"type":17,"tag":6121,"props":149861,"children":149863},{"className":149862},[],[149864],{"type":23,"value":149865},"AssessmentOrder",{"type":23,"value":149867}," payload:",{"type":17,"tag":6893,"props":149869,"children":149872},{"className":149870,"code":149871,"language":22503,"meta":7},[22501],"{\n  \"id\": \"123\",\n  \"package_id\": \"engineering_skills_v1\",\n  \"candidate_id\": \"candidate_456\",\n  \"application_id\": \"application_789\",\n  \"job_id\": \"job_012\",\n  \"status\": \"OPEN\"\n}\n",[149873],{"type":17,"tag":6121,"props":149874,"children":149875},{"__ignoreMap":7},[149876],{"type":23,"value":149871},{"type":17,"tag":29,"props":149878,"children":149879},{},[149880],{"type":23,"value":149881},"Additional profile fields may be included:",{"type":17,"tag":80,"props":149883,"children":149884},{},[149885,149894,149903,149912,149921,149930],{"type":17,"tag":84,"props":149886,"children":149887},{},[149888],{"type":17,"tag":6121,"props":149889,"children":149891},{"className":149890},[],[149892],{"type":23,"value":149893},"profile_name",{"type":17,"tag":84,"props":149895,"children":149896},{},[149897],{"type":17,"tag":6121,"props":149898,"children":149900},{"className":149899},[],[149901],{"type":23,"value":149902},"profile_emails",{"type":17,"tag":84,"props":149904,"children":149905},{},[149906],{"type":17,"tag":6121,"props":149907,"children":149909},{"className":149908},[],[149910],{"type":23,"value":149911},"profile_resume_url",{"type":17,"tag":84,"props":149913,"children":149914},{},[149915],{"type":17,"tag":6121,"props":149916,"children":149918},{"className":149917},[],[149919],{"type":23,"value":149920},"profile_ip_address",{"type":17,"tag":84,"props":149922,"children":149923},{},[149924],{"type":17,"tag":6121,"props":149925,"children":149927},{"className":149926},[],[149928],{"type":23,"value":149929},"profile_date_of_birth",{"type":17,"tag":84,"props":149931,"children":149932},{},[149933],{"type":23,"value":149934},"etc.",{"type":17,"tag":29,"props":149936,"children":149937},{},[149938],{"type":23,"value":149939},"Webhook delivery includes:",{"type":17,"tag":80,"props":149941,"children":149942},{},[149943,149948,149956,149961],{"type":17,"tag":84,"props":149944,"children":149945},{},[149946],{"type":23,"value":149947},"HMAC signature",{"type":17,"tag":84,"props":149949,"children":149950},{},[149951],{"type":17,"tag":6121,"props":149952,"children":149954},{"className":149953},[],[149955],{"type":23,"value":77777},{"type":17,"tag":84,"props":149957,"children":149958},{},[149959],{"type":23,"value":149960},"Retry mechanism (3 immediate retries + Fibonacci backoff)",{"type":17,"tag":84,"props":149962,"children":149963},{},[149964,149966,149972,149973,149979],{"type":23,"value":149965},"Event type indicators (",{"type":17,"tag":6121,"props":149967,"children":149969},{"className":149968},[],[149970],{"type":23,"value":149971},"INITIAL-PARTIAL",{"type":23,"value":11826},{"type":17,"tag":6121,"props":149974,"children":149976},{"className":149975},[],[149977],{"type":23,"value":149978},"INITIAL-COMPLETE",{"type":23,"value":149980},", etc.)",{"type":17,"tag":68,"props":149982,"children":149984},{"id":149983},"step-4-process-the-assessment",[149985],{"type":23,"value":149986},"Step 4: Process the Assessment",{"type":17,"tag":29,"props":149988,"children":149989},{},[149990],{"type":23,"value":149991},"After receiving the order:",{"type":17,"tag":6154,"props":149993,"children":149994},{},[149995,150000,150005,150010],{"type":17,"tag":84,"props":149996,"children":149997},{},[149998],{"type":23,"value":149999},"Validate webhook signature",{"type":17,"tag":84,"props":150001,"children":150002},{},[150003],{"type":23,"value":150004},"Store the order in your system",{"type":17,"tag":84,"props":150006,"children":150007},{},[150008],{"type":23,"value":150009},"Issue the assessment to the candidate",{"type":17,"tag":84,"props":150011,"children":150012},{},[150013],{"type":23,"value":150014},"Track completion",{"type":17,"tag":29,"props":150016,"children":150017},{},[150018],{"type":23,"value":150019},"Order status lifecycle:",{"type":17,"tag":80,"props":150021,"children":150022},{},[150023,150032,150041,150049,150058],{"type":17,"tag":84,"props":150024,"children":150025},{},[150026],{"type":17,"tag":6121,"props":150027,"children":150029},{"className":150028},[],[150030],{"type":23,"value":150031},"OPEN",{"type":17,"tag":84,"props":150033,"children":150034},{},[150035],{"type":17,"tag":6121,"props":150036,"children":150038},{"className":150037},[],[150039],{"type":23,"value":150040},"IN_PROGRESS",{"type":17,"tag":84,"props":150042,"children":150043},{},[150044],{"type":17,"tag":6121,"props":150045,"children":150047},{"className":150046},[],[150048],{"type":23,"value":20396},{"type":17,"tag":84,"props":150050,"children":150051},{},[150052],{"type":17,"tag":6121,"props":150053,"children":150055},{"className":150054},[],[150056],{"type":23,"value":150057},"FAILED",{"type":17,"tag":84,"props":150059,"children":150060},{},[150061],{"type":17,"tag":6121,"props":150062,"children":150064},{"className":150063},[],[150065],{"type":23,"value":146075},{"type":17,"tag":68,"props":150067,"children":150069},{"id":150068},"step-5-submit-results-back-to-ats",[150070],{"type":23,"value":150071},"Step 5: Submit Results Back to ATS",{"type":17,"tag":29,"props":150073,"children":150074},{},[150075],{"type":23,"value":150076},"When assessment is complete:",{"type":17,"tag":6893,"props":150078,"children":150081},{"className":150079,"code":150080,"language":20901,"meta":23},[20899],"PUT /assessment/{connection_id}/order/{order_id}\n",[150082],{"type":17,"tag":6121,"props":150083,"children":150084},{"__ignoreMap":7},[150085],{"type":23,"value":150080},{"type":17,"tag":239,"props":150087,"children":150088},{"id":21023},[150089],{"type":23,"value":7377},{"type":17,"tag":6893,"props":150091,"children":150094},{"className":150092,"code":150093,"language":18718,"meta":7},[18716],"const results = await sdk.assessment.updateAssessmentOrder({\n  connectionId,\n  id: 'order_123',\n  assessmentOrder: {\n    status: 'COMPLETED',\n    response_score: 85,\n    response_max_score: 100,\n    response_url: 'https://your-platform.com/results/order_123',\n    response_completed_at: '2026-02-19T10:30:00Z',\n    response_attributes: [\n      {\n        type: 'TEXT',\n        label: 'Overall Assessment',\n        value: 'Strong technical proficiency'\n      }\n    ]\n  }\n});\n",[150095],{"type":17,"tag":6121,"props":150096,"children":150097},{"__ignoreMap":7},[150098],{"type":23,"value":150093},{"type":17,"tag":29,"props":150100,"children":150101},{},[150102],{"type":23,"value":150103},"The ATS displays:",{"type":17,"tag":80,"props":150105,"children":150106},{},[150107,150112,150117,150122,150127],{"type":17,"tag":84,"props":150108,"children":150109},{},[150110],{"type":23,"value":150111},"Score",{"type":17,"tag":84,"props":150113,"children":150114},{},[150115],{"type":23,"value":150116},"Completion status",{"type":17,"tag":84,"props":150118,"children":150119},{},[150120],{"type":23,"value":150121},"Result link",{"type":17,"tag":84,"props":150123,"children":150124},{},[150125],{"type":23,"value":150126},"Structured attributes",{"type":17,"tag":84,"props":150128,"children":150129},{},[150130],{"type":23,"value":150131},"Download URLs (if provided)",{"type":17,"tag":68,"props":150133,"children":150135},{"id":150134},"order-update-considerations",[150136],{"type":23,"value":150137},"Order Update Considerations",{"type":17,"tag":29,"props":150139,"children":150140},{},[150141,150142,150147],{"type":23,"value":6712},{"type":17,"tag":6121,"props":150143,"children":150145},{"className":150144},[],[150146],{"type":23,"value":149865},{"type":23,"value":150148}," model supports:",{"type":17,"tag":80,"props":150150,"children":150151},{},[150152,150157,150161,150173,150185],{"type":17,"tag":84,"props":150153,"children":150154},{},[150155],{"type":23,"value":150156},"Structured score fields",{"type":17,"tag":84,"props":150158,"children":150159},{},[150160],{"type":23,"value":146720},{"type":17,"tag":84,"props":150162,"children":150163},{},[150164,150166,150172],{"type":23,"value":150165},"Detailed result breakdown (",{"type":17,"tag":6121,"props":150167,"children":150169},{"className":150168},[],[150170],{"type":23,"value":150171},"response_details",{"type":23,"value":12034},{"type":17,"tag":84,"props":150174,"children":150175},{},[150176,150178,150184],{"type":23,"value":150177},"Additional attributes (",{"type":17,"tag":6121,"props":150179,"children":150181},{"className":150180},[],[150182],{"type":23,"value":150183},"response_attributes",{"type":23,"value":12034},{"type":17,"tag":84,"props":150186,"children":150187},{},[150188,150190,150196],{"type":23,"value":150189},"Downloadable reports (",{"type":17,"tag":6121,"props":150191,"children":150193},{"className":150192},[],[150194],{"type":23,"value":150195},"response_download_urls",{"type":23,"value":12034},{"type":17,"tag":29,"props":150198,"children":150199},{},[150200],{"type":23,"value":150201},"Writable fields vary slightly by integration (per your writable field matrix). Required fields are marked per integration and must be respected.",{"type":17,"tag":68,"props":150203,"children":150205},{"id":150204},"handling-order-lifecycle-events",[150206],{"type":23,"value":150207},"Handling Order Lifecycle Events",{"type":17,"tag":29,"props":150209,"children":150210},{},[150211],{"type":23,"value":150212},"If supported, some ATS integrations may issue cancellation events. If your system receives a cancellation:",{"type":17,"tag":80,"props":150214,"children":150215},{},[150216,150226,150231],{"type":17,"tag":84,"props":150217,"children":150218},{},[150219,150221],{"type":23,"value":150220},"Mark order as ",{"type":17,"tag":6121,"props":150222,"children":150224},{"className":150223},[],[150225],{"type":23,"value":146075},{"type":17,"tag":84,"props":150227,"children":150228},{},[150229],{"type":23,"value":150230},"Stop processing",{"type":17,"tag":84,"props":150232,"children":150233},{},[150234],{"type":23,"value":150235},"Avoid duplicate fulfillment",{"type":17,"tag":29,"props":150237,"children":150238},{},[150239],{"type":23,"value":150240},"Always design your webhook handler to be idempotent.",{"type":17,"tag":68,"props":150242,"children":150244},{"id":150243},"real-time-architecture",[150245],{"type":23,"value":150246},"Real-Time Architecture",{"type":17,"tag":29,"props":150248,"children":150249},{},[150250],{"type":23,"value":150251},"The Assessment API is real-time and stateless:",{"type":17,"tag":80,"props":150253,"children":150254},{},[150255,150260,150265],{"type":17,"tag":84,"props":150256,"children":150257},{},[150258],{"type":23,"value":150259},"Unified does not store your assessment results.",{"type":17,"tag":84,"props":150261,"children":150262},{},[150263],{"type":23,"value":150264},"Orders are delivered via webhook immediately.",{"type":17,"tag":84,"props":150266,"children":150267},{},[150268],{"type":23,"value":150269},"Result updates are written directly back to the ATS.",{"type":17,"tag":29,"props":150271,"children":150272},{},[150273],{"type":23,"value":150274},"This allows:",{"type":17,"tag":80,"props":150276,"children":150277},{},[150278,150283,150288],{"type":17,"tag":84,"props":150279,"children":150280},{},[150281],{"type":23,"value":150282},"Immediate recruiter visibility",{"type":17,"tag":84,"props":150284,"children":150285},{},[150286],{"type":23,"value":150287},"Automated downstream workflows",{"type":17,"tag":84,"props":150289,"children":150290},{},[150291],{"type":23,"value":150292},"Reduced recruiter friction",{"type":17,"tag":68,"props":150294,"children":150295},{"id":144224},[150296],{"type":23,"value":144227},{"type":17,"tag":29,"props":150298,"children":150299},{},[150300],{"type":23,"value":150301},"While the API is normalized:",{"type":17,"tag":80,"props":150303,"children":150304},{},[150305,150310,150315],{"type":17,"tag":84,"props":150306,"children":150307},{},[150308],{"type":23,"value":150309},"Writable fields vary by integration.",{"type":17,"tag":84,"props":150311,"children":150312},{},[150313],{"type":23,"value":150314},"Some integrations require specific fields when updating results.",{"type":17,"tag":84,"props":150316,"children":150317},{},[150318],{"type":23,"value":150319},"Always consult the integration's writable field matrix before deploying.",{"type":17,"tag":29,"props":150321,"children":150322},{},[150323],{"type":23,"value":150324},"Your CSV matrices provide authoritative per-provider field support.",{"type":17,"tag":68,"props":150326,"children":150328},{"id":150327},"security-best-practices",[150329],{"type":23,"value":150330},"Security Best Practices",{"type":17,"tag":80,"props":150332,"children":150333},{},[150334,150339,150344,150349,150360],{"type":17,"tag":84,"props":150335,"children":150336},{},[150337],{"type":23,"value":150338},"Treat Partner API Keys as sensitive.",{"type":17,"tag":84,"props":150340,"children":150341},{},[150342],{"type":23,"value":150343},"Validate webhook signatures.",{"type":17,"tag":84,"props":150345,"children":150346},{},[150347],{"type":23,"value":150348},"Implement idempotent webhook processing.",{"type":17,"tag":84,"props":150350,"children":150351},{},[150352,150353,150358],{"type":23,"value":128847},{"type":17,"tag":6121,"props":150354,"children":150356},{"className":150355},[],[150357],{"type":23,"value":25037},{"type":23,"value":150359}," securely.",{"type":17,"tag":84,"props":150361,"children":150362},{},[150363],{"type":23,"value":150364},"Handle retries gracefully.",{"type":17,"tag":68,"props":150366,"children":150368},{"id":150367},"when-to-use-the-assessment-api-vs-ats-api",[150369],{"type":23,"value":150370},"When to Use the Assessment API vs ATS API",{"type":17,"tag":29,"props":150372,"children":150373},{},[150374,150375,150379],{"type":23,"value":48249},{"type":17,"tag":48,"props":150376,"children":150377},{},[150378],{"type":23,"value":149277},{"type":23,"value":150380}," when:",{"type":17,"tag":80,"props":150382,"children":150383},{},[150384,150389,150394],{"type":17,"tag":84,"props":150385,"children":150386},{},[150387],{"type":23,"value":150388},"The ATS supports embedded assessment listings.",{"type":17,"tag":84,"props":150390,"children":150391},{},[150392],{"type":23,"value":150393},"You want recruiters to initiate assessments inside the ATS.",{"type":17,"tag":84,"props":150395,"children":150396},{},[150397],{"type":23,"value":150398},"You have a partnership-style integration.",{"type":17,"tag":29,"props":150400,"children":150401},{},[150402,150403,150408],{"type":23,"value":48249},{"type":17,"tag":48,"props":150404,"children":150405},{},[150406],{"type":23,"value":150407},"ATS API fallback",{"type":23,"value":150380},{"type":17,"tag":80,"props":150410,"children":150411},{},[150412,150417],{"type":17,"tag":84,"props":150413,"children":150414},{},[150415],{"type":23,"value":150416},"The ATS does not support embedded assessment integrations.",{"type":17,"tag":84,"props":150418,"children":150419},{},[150420],{"type":23,"value":150421},"You trigger assessments based on status changes.",{"type":17,"tag":29,"props":150423,"children":150424},{},[150425],{"type":23,"value":150426},"Most providers will use both:",{"type":17,"tag":80,"props":150428,"children":150429},{},[150430,150435],{"type":17,"tag":84,"props":150431,"children":150432},{},[150433],{"type":23,"value":150434},"Assessment API for supported ATS platforms.",{"type":17,"tag":84,"props":150436,"children":150437},{},[150438],{"type":23,"value":150439},"ATS API for broader coverage.",{"type":17,"tag":68,"props":150441,"children":150442},{"id":132938},[150443],{"type":23,"value":132941},{"type":17,"tag":29,"props":150445,"children":150446},{},[150447],{"type":23,"value":150448},"The Unified Assessment API allows assessment providers to integrate once and support multiple ATS platforms without:",{"type":17,"tag":80,"props":150450,"children":150451},{},[150452,150457,150462,150467],{"type":17,"tag":84,"props":150453,"children":150454},{},[150455],{"type":23,"value":150456},"Maintaining separate authentication systems",{"type":17,"tag":84,"props":150458,"children":150459},{},[150460],{"type":23,"value":150461},"Supporting multiple webhook formats",{"type":17,"tag":84,"props":150463,"children":150464},{},[150465],{"type":23,"value":150466},"Managing platform-specific order models",{"type":17,"tag":84,"props":150468,"children":150469},{},[150470],{"type":23,"value":150471},"Tracking API deprecations per ATS",{"type":17,"tag":29,"props":150473,"children":150474},{},[150475],{"type":23,"value":150476},"You publish packages once.",{"type":17,"tag":29,"props":150478,"children":150479},{},[150480],{"type":23,"value":150481},"Recruiters order from within their ATS.",{"type":17,"tag":29,"props":150483,"children":150484},{},[150485],{"type":23,"value":150486},"You receive orders in real time.",{"type":17,"tag":29,"props":150488,"children":150489},{},[150490],{"type":23,"value":150491},"You push results back through a single endpoint.",{"type":17,"tag":29,"props":150493,"children":150494},{},[150495],{"type":23,"value":150496},"One integration. Multiple ATS platforms. Embedded recruiter workflow.",{"type":17,"tag":29,"props":150498,"children":150499},{},[150500],{"type":17,"tag":133,"props":150501,"children":150503},{"href":1612,"rel":150502},[214],[150504],{"type":23,"value":44481},{"type":17,"tag":29,"props":150506,"children":150507},{},[150508],{"type":17,"tag":133,"props":150509,"children":150511},{"href":1623,"rel":150510},[214],[150512],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":150514},[150515,150516,150517,150518,150525,150528,150529,150532,150533,150534,150535,150536,150537,150538],{"id":149319,"depth":1629,"text":149322},{"id":149400,"depth":1629,"text":149403},{"id":149462,"depth":1629,"text":149465},{"id":149535,"depth":1629,"text":149538,"children":150519},[150520,150521,150522,150523,150524],{"id":149546,"depth":1635,"text":149549},{"id":149561,"depth":1635,"text":149564},{"id":149663,"depth":1635,"text":149666},{"id":149678,"depth":1635,"text":149681},{"id":149765,"depth":1635,"text":149768},{"id":149807,"depth":1629,"text":149810,"children":150526},[150527],{"id":149851,"depth":1635,"text":149854},{"id":149983,"depth":1629,"text":149986},{"id":150068,"depth":1629,"text":150071,"children":150530},[150531],{"id":21023,"depth":1635,"text":7377},{"id":150134,"depth":1629,"text":150137},{"id":150204,"depth":1629,"text":150207},{"id":150243,"depth":1629,"text":150246},{"id":144224,"depth":1629,"text":144227},{"id":150327,"depth":1629,"text":150330},{"id":150367,"depth":1629,"text":150370},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_offer_assessment_packages_and_receive_orders_with_unified_assessment_api.md","blog/how_to_offer_assessment_packages_and_receive_orders_with_unified_assessment_api.md","blog/how_to_offer_assessment_packages_and_receive_orders_with_unified_assessment_api",{"_path":150543,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":150544,"description":150545,"img":150546,"date":150547,"tag":12,"body":150548,"_type":1677,"_id":151527,"_source":1679,"_file":151528,"_stem":151529,"_extension":1682},"/blog/ticketing_mcp_servers_real_time_issue_actions_for_ai_agents","Ticketing MCP Servers: Real-Time Issue Actions for AI Agents","Ticketing platforms are one of the most natural surfaces for AI agents.","https://s3.us-east-2.amazonaws.com/unified-article-images/ticketing_mcp_servers_real_time_issue_actions_for_ai_agents-icon.png","2026-02-19T23:31:00.000Z",{"type":14,"children":150549,"toc":151503},[150550,150555,150558,150565,150569,150574,150579,150584,150589,150594,150599,150609,150614,150618,150659,150665,150670,150676,150699,150705,150723,150729,150747,150753,150771,150776,150782,150788,150793,150798,150821,150826,150831,150836,150841,150846,150850,150856,150861,150889,150894,150899,150904,150924,150929,150953,150958,150966,150971,150976,150981,150987,150992,150997,151020,151025,151043,151048,151054,151069,151074,151079,151097,151102,151138,151143,151149,151154,151176,151180,151185,151191,151196,151201,151207,151224,151230,151253,151258,151263,151268,151273,151278,151283,151288,151294,151299,151327,151332,151360,151365,151371,151376,151409,151414,151441,151446,151451,151456,151461,151465,151487,151495],{"type":17,"tag":18,"props":150551,"children":150553},{"id":150552},"ticketing-mcp-servers-real-time-issue-actions-for-ai-agents",[150554],{"type":23,"value":150544},{"type":17,"tag":25,"props":150556,"children":150557},{},[],{"type":17,"tag":29,"props":150559,"children":150560},{},[150561],{"type":17,"tag":33,"props":150562,"children":150563},{},[150564],{"type":23,"value":147916},{"type":17,"tag":29,"props":150566,"children":150567},{},[150568],{"type":23,"value":150545},{"type":17,"tag":29,"props":150570,"children":150571},{},[150572],{"type":23,"value":150573},"Tickets are created.",{"type":17,"tag":29,"props":150575,"children":150576},{},[150577],{"type":23,"value":150578},"Statuses change.",{"type":17,"tag":29,"props":150580,"children":150581},{},[150582],{"type":23,"value":150583},"Owners are reassigned.",{"type":17,"tag":29,"props":150585,"children":150586},{},[150587],{"type":23,"value":150588},"Internal notes are added.",{"type":17,"tag":29,"props":150590,"children":150591},{},[150592],{"type":23,"value":150593},"Issues are resolved.",{"type":17,"tag":29,"props":150595,"children":150596},{},[150597],{"type":23,"value":150598},"If you're building AI features inside a SaaS product, your model may need to read and update tickets directly inside systems like Zendesk, Freshdesk, ServiceNow, Intercom, Jira Service Desk, Gorgias, or HubSpot.",{"type":17,"tag":29,"props":150600,"children":150601},{},[150602,150604,150608],{"type":23,"value":150603},"This is where Ticketing + ",{"type":17,"tag":133,"props":150605,"children":150606},{"href":326},[150607],{"type":23,"value":329},{"type":23,"value":143931},{"type":17,"tag":29,"props":150610,"children":150611},{},[150612],{"type":23,"value":150613},"Unified's Ticketing category provides a normalized, real-time API across ticketing platforms. Unified's MCP server allows LLMs to call those ticketing operations as structured tools.",{"type":17,"tag":29,"props":150615,"children":150616},{},[150617],{"type":23,"value":143947},{"type":17,"tag":80,"props":150619,"children":150620},{},[150621,150626,150630,150634,150638,150647],{"type":17,"tag":84,"props":150622,"children":150623},{},[150624],{"type":23,"value":150625},"What Ticketing MCP is (and what it is not)",{"type":17,"tag":84,"props":150627,"children":150628},{},[150629],{"type":23,"value":143960},{"type":17,"tag":84,"props":150631,"children":150632},{},[150633],{"type":23,"value":143965},{"type":17,"tag":84,"props":150635,"children":150636},{},[150637],{"type":23,"value":143979},{"type":17,"tag":84,"props":150639,"children":150640},{},[150641,150643],{"type":23,"value":150642},"How MCP relates to ",{"type":17,"tag":133,"props":150644,"children":150645},{"href":4999},[150646],{"type":23,"value":5002},{"type":17,"tag":84,"props":150648,"children":150649},{},[150650,150652,150657],{"type":23,"value":150651},"When to use the ",{"type":17,"tag":133,"props":150653,"children":150654},{"href":31987},[150655],{"type":23,"value":150656},"Ticketing API",{"type":23,"value":150658}," vs MCP",{"type":17,"tag":68,"props":150660,"children":150662},{"id":150661},"what-ai-agents-can-do-with-ticketing-mcp",[150663],{"type":23,"value":150664},"What AI Agents Can Do with Ticketing MCP",{"type":17,"tag":29,"props":150666,"children":150667},{},[150668],{"type":23,"value":150669},"Because MCP enables real-time writes, agents can safely perform bounded support actions such as:",{"type":17,"tag":239,"props":150671,"children":150673},{"id":150672},"intelligent-triage",[150674],{"type":23,"value":150675},"Intelligent Triage",{"type":17,"tag":80,"props":150677,"children":150678},{},[150679,150684,150689,150694],{"type":17,"tag":84,"props":150680,"children":150681},{},[150682],{"type":23,"value":150683},"List incoming tickets",{"type":17,"tag":84,"props":150685,"children":150686},{},[150687],{"type":23,"value":150688},"Update priority",{"type":17,"tag":84,"props":150690,"children":150691},{},[150692],{"type":23,"value":150693},"Assign owner",{"type":17,"tag":84,"props":150695,"children":150696},{},[150697],{"type":23,"value":150698},"Add internal note",{"type":17,"tag":239,"props":150700,"children":150702},{"id":150701},"escalation",[150703],{"type":23,"value":150704},"Escalation",{"type":17,"tag":80,"props":150706,"children":150707},{},[150708,150713,150718],{"type":17,"tag":84,"props":150709,"children":150710},{},[150711],{"type":23,"value":150712},"Update status",{"type":17,"tag":84,"props":150714,"children":150715},{},[150716],{"type":23,"value":150717},"Reassign ticket",{"type":17,"tag":84,"props":150719,"children":150720},{},[150721],{"type":23,"value":150722},"Add escalation context",{"type":17,"tag":239,"props":150724,"children":150726},{"id":150725},"summarization",[150727],{"type":23,"value":150728},"Summarization",{"type":17,"tag":80,"props":150730,"children":150731},{},[150732,150737,150742],{"type":17,"tag":84,"props":150733,"children":150734},{},[150735],{"type":23,"value":150736},"Retrieve ticket history",{"type":17,"tag":84,"props":150738,"children":150739},{},[150740],{"type":23,"value":150741},"Retrieve notes",{"type":17,"tag":84,"props":150743,"children":150744},{},[150745],{"type":23,"value":150746},"Add summarized note",{"type":17,"tag":239,"props":150748,"children":150750},{"id":150749},"resolution",[150751],{"type":23,"value":150752},"Resolution",{"type":17,"tag":80,"props":150754,"children":150755},{},[150756,150761,150766],{"type":17,"tag":84,"props":150757,"children":150758},{},[150759],{"type":23,"value":150760},"Update status to resolved",{"type":17,"tag":84,"props":150762,"children":150763},{},[150764],{"type":23,"value":150765},"Add final internal note",{"type":17,"tag":84,"props":150767,"children":150768},{},[150769],{"type":23,"value":150770},"Remove ticket (where provider allows)",{"type":17,"tag":29,"props":150772,"children":150773},{},[150774],{"type":23,"value":150775},"These are operational updates to issue records — not financial transactions or HR mutations.",{"type":17,"tag":68,"props":150777,"children":150779},{"id":150778},"what-ticketing-mcp-is-and-is-not",[150780],{"type":23,"value":150781},"What Ticketing MCP Is (and Is Not)",{"type":17,"tag":239,"props":150783,"children":150785},{"id":150784},"what-it-is",[150786],{"type":23,"value":150787},"What it is",{"type":17,"tag":29,"props":150789,"children":150790},{},[150791],{"type":23,"value":150792},"Unified MCP is a structured tool-calling interface layered on top of Unified's category APIs.",{"type":17,"tag":29,"props":150794,"children":150795},{},[150796],{"type":23,"value":150797},"For Ticketing:",{"type":17,"tag":80,"props":150799,"children":150800},{},[150801,150806,150811,150816],{"type":17,"tag":84,"props":150802,"children":150803},{},[150804],{"type":23,"value":150805},"The MCP server sits on top of the Unified Ticketing API.",{"type":17,"tag":84,"props":150807,"children":150808},{},[150809],{"type":23,"value":150810},"Each tool call maps to one Unified API request.",{"type":17,"tag":84,"props":150812,"children":150813},{},[150814],{"type":23,"value":150815},"Each Unified API request is routed directly to the source platform in real time.",{"type":17,"tag":84,"props":150817,"children":150818},{},[150819],{"type":23,"value":150820},"No ticket data is stored or cached inside Unified.",{"type":17,"tag":29,"props":150822,"children":150823},{},[150824],{"type":23,"value":150825},"Execution flow:",{"type":17,"tag":29,"props":150827,"children":150828},{},[150829],{"type":23,"value":150830},"User → LLM → MCP tool call → Unified Ticketing API → Source ticketing system",{"type":17,"tag":29,"props":150832,"children":150833},{},[150834],{"type":23,"value":150835},"The model selects a tool.",{"type":17,"tag":29,"props":150837,"children":150838},{},[150839],{"type":23,"value":150840},"The MCP server executes that tool.",{"type":17,"tag":29,"props":150842,"children":150843},{},[150844],{"type":23,"value":150845},"The result is returned to the model.",{"type":17,"tag":29,"props":150847,"children":150848},{},[150849],{"type":23,"value":103026},{"type":17,"tag":239,"props":150851,"children":150853},{"id":150852},"what-it-is-not",[150854],{"type":23,"value":150855},"What it is not",{"type":17,"tag":29,"props":150857,"children":150858},{},[150859],{"type":23,"value":150860},"MCP is not:",{"type":17,"tag":80,"props":150862,"children":150863},{},[150864,150869,150874,150879,150884],{"type":17,"tag":84,"props":150865,"children":150866},{},[150867],{"type":23,"value":150868},"A sync engine",{"type":17,"tag":84,"props":150870,"children":150871},{},[150872],{"type":23,"value":150873},"A background polling system",{"type":17,"tag":84,"props":150875,"children":150876},{},[150877],{"type":23,"value":150878},"A webhook delivery mechanism",{"type":17,"tag":84,"props":150880,"children":150881},{},[150882],{"type":23,"value":150883},"A storage layer",{"type":17,"tag":84,"props":150885,"children":150886},{},[150887],{"type":23,"value":150888},"A data warehouse",{"type":17,"tag":29,"props":150890,"children":150891},{},[150892],{"type":23,"value":150893},"It is strictly request/response tool execution.",{"type":17,"tag":68,"props":150895,"children":150897},{"id":150896},"unified-ticketing-api",[150898],{"type":23,"value":32677},{"type":17,"tag":29,"props":150900,"children":150901},{},[150902],{"type":23,"value":150903},"The Ticketing category provides four normalized objects:",{"type":17,"tag":80,"props":150905,"children":150906},{},[150907,150911,150915,150920],{"type":17,"tag":84,"props":150908,"children":150909},{},[150910],{"type":23,"value":28124},{"type":17,"tag":84,"props":150912,"children":150913},{},[150914],{"type":23,"value":47609},{"type":17,"tag":84,"props":150916,"children":150917},{},[150918],{"type":23,"value":150919},"Note",{"type":17,"tag":84,"props":150921,"children":150922},{},[150923],{"type":23,"value":7247},{"type":17,"tag":29,"props":150925,"children":150926},{},[150927],{"type":23,"value":150928},"Each object supports the following operations:",{"type":17,"tag":80,"props":150930,"children":150931},{},[150932,150936,150940,150944,150948],{"type":17,"tag":84,"props":150933,"children":150934},{},[150935],{"type":23,"value":42125},{"type":17,"tag":84,"props":150937,"children":150938},{},[150939],{"type":23,"value":145784},{"type":17,"tag":84,"props":150941,"children":150942},{},[150943],{"type":23,"value":145789},{"type":17,"tag":84,"props":150945,"children":150946},{},[150947],{"type":23,"value":109982},{"type":17,"tag":84,"props":150949,"children":150950},{},[150951],{"type":23,"value":150952},"Remove",{"type":17,"tag":29,"props":150954,"children":150955},{},[150956],{"type":23,"value":150957},"That results in:",{"type":17,"tag":29,"props":150959,"children":150960},{},[150961],{"type":17,"tag":48,"props":150962,"children":150963},{},[150964],{"type":23,"value":150965},"20 unified tools per Ticketing integration",{"type":17,"tag":29,"props":150967,"children":150968},{},[150969],{"type":23,"value":150970},"(4 objects × 5 operations)",{"type":17,"tag":29,"props":150972,"children":150973},{},[150974],{"type":23,"value":150975},"There is no documented PATCH endpoint in the Ticketing category.",{"type":17,"tag":29,"props":150977,"children":150978},{},[150979],{"type":23,"value":150980},"Because the object model is normalized, the same tools exist whether the customer connects Zendesk, Freshdesk, ServiceNow, or another supported provider.",{"type":17,"tag":68,"props":150982,"children":150984},{"id":150983},"provider-variability-for-writes",[150985],{"type":23,"value":150986},"Provider Variability for Writes",{"type":17,"tag":29,"props":150988,"children":150989},{},[150990],{"type":23,"value":150991},"Write support can vary by provider.",{"type":17,"tag":29,"props":150993,"children":150994},{},[150995],{"type":23,"value":150996},"Documented variability includes:",{"type":17,"tag":80,"props":150998,"children":150999},{},[151000,151005,151010,151015],{"type":17,"tag":84,"props":151001,"children":151002},{},[151003],{"type":23,"value":151004},"Status updates may not be uniformly supported.",{"type":17,"tag":84,"props":151006,"children":151007},{},[151008],{"type":23,"value":151009},"Priority fields may not be writable across all integrations.",{"type":17,"tag":84,"props":151011,"children":151012},{},[151013],{"type":23,"value":151014},"Category support can differ.",{"type":17,"tag":84,"props":151016,"children":151017},{},[151018],{"type":23,"value":151019},"Deletion may not be supported for every provider.",{"type":17,"tag":29,"props":151021,"children":151022},{},[151023],{"type":23,"value":151024},"Because Unified is pass-through:",{"type":17,"tag":80,"props":151026,"children":151027},{},[151028,151033,151038],{"type":17,"tag":84,"props":151029,"children":151030},{},[151031],{"type":23,"value":151032},"Provider API constraints still apply.",{"type":17,"tag":84,"props":151034,"children":151035},{},[151036],{"type":23,"value":151037},"Validation errors may occur per provider.",{"type":17,"tag":84,"props":151039,"children":151040},{},[151041],{"type":23,"value":151042},"Not all operations are guaranteed across all integrations.",{"type":17,"tag":29,"props":151044,"children":151045},{},[151046],{"type":23,"value":151047},"Agents must handle write failures gracefully.",{"type":17,"tag":68,"props":151049,"children":151051},{"id":151050},"model-tool-limits-important-for-ticketing-mcp",[151052],{"type":23,"value":151053},"Model Tool Limits (Important for Ticketing MCP)",{"type":17,"tag":80,"props":151055,"children":151056},{},[151057,151061,151065],{"type":17,"tag":84,"props":151058,"children":151059},{},[151060],{"type":23,"value":136695},{"type":17,"tag":84,"props":151062,"children":151063},{},[151064],{"type":23,"value":136700},{"type":17,"tag":84,"props":151066,"children":151067},{},[151068],{"type":23,"value":136705},{"type":17,"tag":29,"props":151070,"children":151071},{},[151072],{"type":23,"value":151073},"Ticketing exposes 20 unified tools.",{"type":17,"tag":29,"props":151075,"children":151076},{},[151077],{"type":23,"value":151078},"Comparison:",{"type":17,"tag":80,"props":151080,"children":151081},{},[151082,151087,151092],{"type":17,"tag":84,"props":151083,"children":151084},{},[151085],{"type":23,"value":151086},"Groq → 20 exceeds 10 → tool surface must be restricted.",{"type":17,"tag":84,"props":151088,"children":151089},{},[151090],{"type":23,"value":151091},"OpenAI → 20 equals 20 → no headroom.",{"type":17,"tag":84,"props":151093,"children":151094},{},[151095],{"type":23,"value":151096},"Cohere → 20 below 50 → within limit.",{"type":17,"tag":29,"props":151098,"children":151099},{},[151100],{"type":23,"value":151101},"To mitigate:",{"type":17,"tag":80,"props":151103,"children":151104},{},[151105,151116,151127],{"type":17,"tag":84,"props":151106,"children":151107},{},[151108,151109,151114],{"type":23,"value":48249},{"type":17,"tag":6121,"props":151110,"children":151112},{"className":151111},[],[151113],{"type":23,"value":24204},{"type":23,"value":151115}," parameter to restrict category scope.",{"type":17,"tag":84,"props":151117,"children":151118},{},[151119,151120,151125],{"type":23,"value":48249},{"type":17,"tag":6121,"props":151121,"children":151123},{"className":151122},[],[151124],{"type":23,"value":131599},{"type":23,"value":151126}," parameter to allowlist specific tool IDs.",{"type":17,"tag":84,"props":151128,"children":151129},{},[151130,151131,151136],{"type":23,"value":33722},{"type":17,"tag":6121,"props":151132,"children":151134},{"className":151133},[],[151135],{"type":23,"value":131610},{"type":23,"value":151137}," to reduce initial tool tokenization (where supported).",{"type":17,"tag":29,"props":151139,"children":151140},{},[151141],{"type":23,"value":151142},"MCP deployments should intentionally restrict the tool surface.",{"type":17,"tag":68,"props":151144,"children":151146},{"id":151145},"rate-limits-real-time-behavior",[151147],{"type":23,"value":151148},"Rate Limits & Real-Time Behavior",{"type":17,"tag":29,"props":151150,"children":151151},{},[151152],{"type":23,"value":151153},"Because each MCP tool call hits the source API directly:",{"type":17,"tag":80,"props":151155,"children":151156},{},[151157,151161,151166,151171],{"type":17,"tag":84,"props":151158,"children":151159},{},[151160],{"type":23,"value":144366},{"type":17,"tag":84,"props":151162,"children":151163},{},[151164],{"type":23,"value":151165},"High-volume list or update operations can trigger 429 errors.",{"type":17,"tag":84,"props":151167,"children":151168},{},[151169],{"type":23,"value":151170},"Unified SDKs implement retry and backoff.",{"type":17,"tag":84,"props":151172,"children":151173},{},[151174],{"type":23,"value":151175},"Webhooks are recommended over polling to reduce unnecessary API calls.",{"type":17,"tag":29,"props":151177,"children":151178},{},[151179],{"type":23,"value":144062},{"type":17,"tag":29,"props":151181,"children":151182},{},[151183],{"type":23,"value":151184},"Ticket state is always fetched from the source system at call time.",{"type":17,"tag":68,"props":151186,"children":151188},{"id":151187},"ticketing-api-vs-ticketing-mcp",[151189],{"type":23,"value":151190},"Ticketing API vs Ticketing MCP",{"type":17,"tag":29,"props":151192,"children":151193},{},[151194],{"type":23,"value":151195},"Both use the same underlying Ticketing API.",{"type":17,"tag":29,"props":151197,"children":151198},{},[151199],{"type":23,"value":151200},"The difference is who decides the action.",{"type":17,"tag":239,"props":151202,"children":151204},{"id":151203},"use-the-ticketing-api-directly-when",[151205],{"type":23,"value":151206},"Use the Ticketing API directly when:",{"type":17,"tag":80,"props":151208,"children":151209},{},[151210,151214,151219],{"type":17,"tag":84,"props":151211,"children":151212},{},[151213],{"type":23,"value":144540},{"type":17,"tag":84,"props":151215,"children":151216},{},[151217],{"type":23,"value":151218},"You are ingesting tickets for analytics.",{"type":17,"tag":84,"props":151220,"children":151221},{},[151222],{"type":23,"value":151223},"You manage update rules deterministically.",{"type":17,"tag":239,"props":151225,"children":151227},{"id":151226},"use-ticketing-mcp-when",[151228],{"type":23,"value":151229},"Use Ticketing MCP when:",{"type":17,"tag":80,"props":151231,"children":151232},{},[151233,151238,151243,151248],{"type":17,"tag":84,"props":151234,"children":151235},{},[151236],{"type":23,"value":151237},"The model chooses which action to execute.",{"type":17,"tag":84,"props":151239,"children":151240},{},[151241],{"type":23,"value":151242},"You are embedding AI inside your product.",{"type":17,"tag":84,"props":151244,"children":151245},{},[151246],{"type":23,"value":151247},"You need structured function-calling with permission control.",{"type":17,"tag":84,"props":151249,"children":151250},{},[151251],{"type":23,"value":151252},"You want LLM-driven ticket updates.",{"type":17,"tag":29,"props":151254,"children":151255},{},[151256],{"type":23,"value":151257},"Execution paths:",{"type":17,"tag":29,"props":151259,"children":151260},{},[151261],{"type":23,"value":151262},"API:",{"type":17,"tag":29,"props":151264,"children":151265},{},[151266],{"type":23,"value":151267},"App → Unified Ticketing API → Provider",{"type":17,"tag":29,"props":151269,"children":151270},{},[151271],{"type":23,"value":151272},"MCP:",{"type":17,"tag":29,"props":151274,"children":151275},{},[151276],{"type":23,"value":151277},"User → LLM → Tool call → Unified Ticketing API → Provider",{"type":17,"tag":29,"props":151279,"children":151280},{},[151281],{"type":23,"value":151282},"The infrastructure is the same.",{"type":17,"tag":29,"props":151284,"children":151285},{},[151286],{"type":23,"value":151287},"The decision-maker differs.",{"type":17,"tag":68,"props":151289,"children":151291},{"id":151290},"why-ticketing-is-a-strong-mcp-category",[151292],{"type":23,"value":151293},"Why Ticketing Is a Strong MCP Category",{"type":17,"tag":29,"props":151295,"children":151296},{},[151297],{"type":23,"value":151298},"Ticketing is well-suited for MCP because:",{"type":17,"tag":80,"props":151300,"children":151301},{},[151302,151307,151312,151317,151322],{"type":17,"tag":84,"props":151303,"children":151304},{},[151305],{"type":23,"value":151306},"Writes are operational and bounded.",{"type":17,"tag":84,"props":151308,"children":151309},{},[151310],{"type":23,"value":151311},"Status and assignment changes are reversible.",{"type":17,"tag":84,"props":151313,"children":151314},{},[151315],{"type":23,"value":151316},"Risk surface is lower than CRM revenue mutations.",{"type":17,"tag":84,"props":151318,"children":151319},{},[151320],{"type":23,"value":151321},"Provider scopes constrain write permissions.",{"type":17,"tag":84,"props":151323,"children":151324},{},[151325],{"type":23,"value":151326},"AI copilots in support products are common and high-impact.",{"type":17,"tag":29,"props":151328,"children":151329},{},[151330],{"type":23,"value":151331},"Ticketing MCP enables:",{"type":17,"tag":80,"props":151333,"children":151334},{},[151335,151340,151345,151350,151355],{"type":17,"tag":84,"props":151336,"children":151337},{},[151338],{"type":23,"value":151339},"AI triage agents",{"type":17,"tag":84,"props":151341,"children":151342},{},[151343],{"type":23,"value":151344},"Escalation assistants",{"type":17,"tag":84,"props":151346,"children":151347},{},[151348],{"type":23,"value":151349},"SLA monitoring copilots",{"type":17,"tag":84,"props":151351,"children":151352},{},[151353],{"type":23,"value":151354},"Support summarization features",{"type":17,"tag":84,"props":151356,"children":151357},{},[151358],{"type":23,"value":151359},"Embedded AI inside customer support platforms",{"type":17,"tag":29,"props":151361,"children":151362},{},[151363],{"type":23,"value":151364},"Without building per-provider integrations.",{"type":17,"tag":68,"props":151366,"children":151368},{"id":151367},"build-real-time-ticketing-agents-with-unified-mcp",[151369],{"type":23,"value":151370},"Build Real-Time Ticketing Agents with Unified MCP",{"type":17,"tag":29,"props":151372,"children":151373},{},[151374],{"type":23,"value":151375},"Unified's Ticketing category provides:",{"type":17,"tag":80,"props":151377,"children":151378},{},[151379,151384,151389,151394,151399,151404],{"type":17,"tag":84,"props":151380,"children":151381},{},[151382],{"type":23,"value":151383},"7+ major ticketing integrations",{"type":17,"tag":84,"props":151385,"children":151386},{},[151387],{"type":23,"value":151388},"20 unified tools per integration",{"type":17,"tag":84,"props":151390,"children":151391},{},[151392],{"type":23,"value":151393},"Real-time pass-through execution",{"type":17,"tag":84,"props":151395,"children":151396},{},[151397],{"type":23,"value":151398},"Optional native or virtual webhooks for event delivery",{"type":17,"tag":84,"props":151400,"children":151401},{},[151402],{"type":23,"value":151403},"No storage of customer ticket data",{"type":17,"tag":84,"props":151405,"children":151406},{},[151407],{"type":23,"value":151408},"Scoped tool access via permissions",{"type":17,"tag":29,"props":151410,"children":151411},{},[151412],{"type":23,"value":151413},"With Unified MCP, your agents can:",{"type":17,"tag":80,"props":151415,"children":151416},{},[151417,151421,151426,151431,151436],{"type":17,"tag":84,"props":151418,"children":151419},{},[151420],{"type":23,"value":139465},{"type":17,"tag":84,"props":151422,"children":151423},{},[151424],{"type":23,"value":151425},"Update status and priority",{"type":17,"tag":84,"props":151427,"children":151428},{},[151429],{"type":23,"value":151430},"Assign owners",{"type":17,"tag":84,"props":151432,"children":151433},{},[151434],{"type":23,"value":151435},"Add notes",{"type":17,"tag":84,"props":151437,"children":151438},{},[151439],{"type":23,"value":151440},"Remove tickets (where supported)",{"type":17,"tag":29,"props":151442,"children":151443},{},[151444],{"type":23,"value":151445},"All directly against the source platform.",{"type":17,"tag":29,"props":151447,"children":151448},{},[151449],{"type":23,"value":151450},"No background sync engine.",{"type":17,"tag":29,"props":151452,"children":151453},{},[151454],{"type":23,"value":151455},"No replication database.",{"type":17,"tag":29,"props":151457,"children":151458},{},[151459],{"type":23,"value":151460},"No stored ticket history.",{"type":17,"tag":239,"props":151462,"children":151463},{"id":146505},[151464],{"type":23,"value":146508},{"type":17,"tag":80,"props":151466,"children":151467},{},[151468,151473,151477,151482],{"type":17,"tag":84,"props":151469,"children":151470},{},[151471],{"type":23,"value":151472},"Enable Ticketing integrations",{"type":17,"tag":84,"props":151474,"children":151475},{},[151476],{"type":23,"value":146521},{"type":17,"tag":84,"props":151478,"children":151479},{},[151480],{"type":23,"value":151481},"Connect Zendesk, Freshdesk, ServiceNow, and more",{"type":17,"tag":84,"props":151483,"children":151484},{},[151485],{"type":23,"value":151486},"Ship AI-driven support features inside your product",{"type":17,"tag":29,"props":151488,"children":151489},{},[151490],{"type":17,"tag":133,"props":151491,"children":151493},{"href":1612,"rel":151492},[214],[151494],{"type":23,"value":44481},{"type":17,"tag":29,"props":151496,"children":151497},{},[151498],{"type":17,"tag":133,"props":151499,"children":151501},{"href":1623,"rel":151500},[214],[151502],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":151504},[151505,151511,151515,151516,151517,151518,151519,151523,151524],{"id":150661,"depth":1629,"text":150664,"children":151506},[151507,151508,151509,151510],{"id":150672,"depth":1635,"text":150675},{"id":150701,"depth":1635,"text":150704},{"id":150725,"depth":1635,"text":150728},{"id":150749,"depth":1635,"text":150752},{"id":150778,"depth":1629,"text":150781,"children":151512},[151513,151514],{"id":150784,"depth":1635,"text":150787},{"id":150852,"depth":1635,"text":150855},{"id":150896,"depth":1629,"text":32677},{"id":150983,"depth":1629,"text":150986},{"id":151050,"depth":1629,"text":151053},{"id":151145,"depth":1629,"text":151148},{"id":151187,"depth":1629,"text":151190,"children":151520},[151521,151522],{"id":151203,"depth":1635,"text":151206},{"id":151226,"depth":1635,"text":151229},{"id":151290,"depth":1629,"text":151293},{"id":151367,"depth":1629,"text":151370,"children":151525},[151526],{"id":146505,"depth":1635,"text":146508},"content:blog:ticketing_mcp_servers_real_time_issue_actions_for_ai_agents.md","blog/ticketing_mcp_servers_real_time_issue_actions_for_ai_agents.md","blog/ticketing_mcp_servers_real_time_issue_actions_for_ai_agents",{"_path":151531,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":121069,"description":151532,"img":151533,"date":151534,"tag":12,"body":151535,"_type":1677,"_id":152574,"_source":1679,"_file":152575,"_stem":152576,"_extension":1682},"/blog/how_to_sync_course_content_between_lms_platforms_with_unified_lms_api","Syncing course content between LMS platforms is harder than it sounds.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_sync_course_content_between_lms_platforms_with_unified_lms_api-icon.png","2026-02-19T23:17:00.000Z",{"type":14,"children":151536,"toc":152550},[151537,151542,151545,151552,151556,151561,151566,151576,151599,151604,151610,151615,151638,151643,151661,151666,151672,151677,151690,151695,151699,151769,151782,151787,151791,151888,151893,151906,151911,151915,151950,151955,151968,151973,151978,151984,151989,151998,152004,152009,152018,152036,152042,152051,152062,152067,152075,152081,152086,152095,152100,152108,152114,152119,152124,152133,152137,152172,152177,152193,152199,152204,152269,152274,152304,152309,152315,152320,152338,152343,152349,152354,152377,152382,152395,152401,152434,152439,152445,152450,152490,152495,152499,152504,152509,152532,152542],{"type":17,"tag":18,"props":151538,"children":151540},{"id":151539},"how-to-sync-course-content-between-lms-platforms-with-unifieds-lms-api",[151541],{"type":23,"value":121069},{"type":17,"tag":25,"props":151543,"children":151544},{},[],{"type":17,"tag":29,"props":151546,"children":151547},{},[151548],{"type":17,"tag":33,"props":151549,"children":151550},{},[151551],{"type":23,"value":147916},{"type":17,"tag":29,"props":151553,"children":151554},{},[151555],{"type":23,"value":151532},{"type":17,"tag":29,"props":151557,"children":151558},{},[151559],{"type":23,"value":151560},"Every LMS models courses and content differently. Some expose full course catalogs and lesson metadata. Others expose only partial structure. Some support module hierarchies. Others flatten everything under a course. And while unified schemas may suggest writable fields, provider-level capabilities often limit what can actually be created or updated.",{"type":17,"tag":29,"props":151562,"children":151563},{},[151564],{"type":23,"value":151565},"When teams build 'content sync' logic assuming universal write support, the result is brittle integrations and inconsistent replication.",{"type":17,"tag":29,"props":151567,"children":151568},{},[151569,151570,151574],{"type":23,"value":25244},{"type":17,"tag":133,"props":151571,"children":151572},{"href":54426},[151573],{"type":23,"value":54429},{"type":23,"value":151575}," does not invent structure or simulate unsupported writes. It exposes course and content data exactly as the underlying LMS provides it. Syncing course content becomes a disciplined process of:",{"type":17,"tag":80,"props":151577,"children":151578},{},[151579,151584,151589,151594],{"type":17,"tag":84,"props":151580,"children":151581},{},[151582],{"type":23,"value":151583},"Reading and normalizing structure",{"type":17,"tag":84,"props":151585,"children":151586},{},[151587],{"type":23,"value":151588},"Detecting changes via polling",{"type":17,"tag":84,"props":151590,"children":151591},{},[151592],{"type":23,"value":151593},"Propagating updates only where provider write support exists",{"type":17,"tag":84,"props":151595,"children":151596},{},[151597],{"type":23,"value":151598},"Falling back to mirror-only mode when it does not",{"type":17,"tag":29,"props":151600,"children":151601},{},[151602],{"type":23,"value":151603},"This guide shows how to sync course content safely and accurately using Unified's LMS API.",{"type":17,"tag":68,"props":151605,"children":151607},{"id":151606},"what-sync-course-content-means-here",[151608],{"type":23,"value":151609},"What 'Sync Course Content' Means Here",{"type":17,"tag":29,"props":151611,"children":151612},{},[151613],{"type":23,"value":151614},"In this context, syncing content means:",{"type":17,"tag":80,"props":151616,"children":151617},{},[151618,151623,151628,151633],{"type":17,"tag":84,"props":151619,"children":151620},{},[151621],{"type":23,"value":151622},"Ingesting course catalogs and content structures from LMS platforms",{"type":17,"tag":84,"props":151624,"children":151625},{},[151626],{"type":23,"value":151627},"Maintaining a canonical internal representation",{"type":17,"tag":84,"props":151629,"children":151630},{},[151631],{"type":23,"value":151632},"Detecting structural changes over time",{"type":17,"tag":84,"props":151634,"children":151635},{},[151636],{"type":23,"value":151637},"Propagating updates to destination LMS platforms where supported",{"type":17,"tag":29,"props":151639,"children":151640},{},[151641],{"type":23,"value":151642},"It does not mean:",{"type":17,"tag":80,"props":151644,"children":151645},{},[151646,151651,151656],{"type":17,"tag":84,"props":151647,"children":151648},{},[151649],{"type":23,"value":151650},"Guaranteed cross-LMS replication",{"type":17,"tag":84,"props":151652,"children":151653},{},[151654],{"type":23,"value":151655},"Universal module hierarchy writes",{"type":17,"tag":84,"props":151657,"children":151658},{},[151659],{"type":23,"value":151660},"Event-driven real-time structural updates",{"type":17,"tag":29,"props":151662,"children":151663},{},[151664],{"type":23,"value":151665},"Unified preserves provider capabilities instead of abstracting them away.",{"type":17,"tag":68,"props":151667,"children":151669},{"id":151668},"the-unified-lms-content-model",[151670],{"type":23,"value":151671},"The Unified LMS Content Model",{"type":17,"tag":29,"props":151673,"children":151674},{},[151675],{"type":23,"value":151676},"Unified exposes the following core objects relevant to content syncing:",{"type":17,"tag":239,"props":151678,"children":151680},{"id":151679},"course-lmscourse",[151681,151683,151689],{"type":23,"value":151682},"Course (",{"type":17,"tag":6121,"props":151684,"children":151686},{"className":151685},[],[151687],{"type":23,"value":151688},"LmsCourse",{"type":23,"value":12034},{"type":17,"tag":29,"props":151691,"children":151692},{},[151693],{"type":23,"value":151694},"Represents a course catalog entry.",{"type":17,"tag":29,"props":151696,"children":151697},{},[151698],{"type":23,"value":111468},{"type":17,"tag":80,"props":151700,"children":151701},{},[151702,151710,151718,151726,151734,151743,151752,151760],{"type":17,"tag":84,"props":151703,"children":151704},{},[151705],{"type":17,"tag":6121,"props":151706,"children":151708},{"className":151707},[],[151709],{"type":23,"value":18766},{"type":17,"tag":84,"props":151711,"children":151712},{},[151713],{"type":17,"tag":6121,"props":151714,"children":151716},{"className":151715},[],[151717],{"type":23,"value":18781},{"type":17,"tag":84,"props":151719,"children":151720},{},[151721],{"type":17,"tag":6121,"props":151722,"children":151724},{"className":151723},[],[151725],{"type":23,"value":24679},{"type":17,"tag":84,"props":151727,"children":151728},{},[151729],{"type":17,"tag":6121,"props":151730,"children":151732},{"className":151731},[],[151733],{"type":23,"value":62868},{"type":17,"tag":84,"props":151735,"children":151736},{},[151737],{"type":17,"tag":6121,"props":151738,"children":151740},{"className":151739},[],[151741],{"type":23,"value":151742},"languages",{"type":17,"tag":84,"props":151744,"children":151745},{},[151746],{"type":17,"tag":6121,"props":151747,"children":151749},{"className":151748},[],[151750],{"type":23,"value":151751},"categories",{"type":17,"tag":84,"props":151753,"children":151754},{},[151755],{"type":17,"tag":6121,"props":151756,"children":151758},{"className":151757},[],[151759],{"type":23,"value":38590},{"type":17,"tag":84,"props":151761,"children":151762},{},[151763],{"type":17,"tag":6121,"props":151764,"children":151766},{"className":151765},[],[151767],{"type":23,"value":151768},"instructor_ids",{"type":17,"tag":239,"props":151770,"children":151772},{"id":151771},"content-lmscontent",[151773,151775,151781],{"type":23,"value":151774},"Content (",{"type":17,"tag":6121,"props":151776,"children":151778},{"className":151777},[],[151779],{"type":23,"value":151780},"LmsContent",{"type":23,"value":12034},{"type":17,"tag":29,"props":151783,"children":151784},{},[151785],{"type":23,"value":151786},"Represents individual learning items.",{"type":17,"tag":29,"props":151788,"children":151789},{},[151790],{"type":23,"value":111468},{"type":17,"tag":80,"props":151792,"children":151793},{},[151794,151802,151810,151818,151827,151836,151845,151854,151862,151871,151880],{"type":17,"tag":84,"props":151795,"children":151796},{},[151797],{"type":17,"tag":6121,"props":151798,"children":151800},{"className":151799},[],[151801],{"type":23,"value":18766},{"type":17,"tag":84,"props":151803,"children":151804},{},[151805],{"type":17,"tag":6121,"props":151806,"children":151808},{"className":151807},[],[151809],{"type":23,"value":18781},{"type":17,"tag":84,"props":151811,"children":151812},{},[151813],{"type":17,"tag":6121,"props":151814,"children":151816},{"className":151815},[],[151817],{"type":23,"value":24679},{"type":17,"tag":84,"props":151819,"children":151820},{},[151821],{"type":17,"tag":6121,"props":151822,"children":151824},{"className":151823},[],[151825],{"type":23,"value":151826},"course_ids",{"type":17,"tag":84,"props":151828,"children":151829},{},[151830],{"type":17,"tag":6121,"props":151831,"children":151833},{"className":151832},[],[151834],{"type":23,"value":151835},"collection_ids",{"type":17,"tag":84,"props":151837,"children":151838},{},[151839],{"type":17,"tag":6121,"props":151840,"children":151842},{"className":151841},[],[151843],{"type":23,"value":151844},"duration_minutes",{"type":17,"tag":84,"props":151846,"children":151847},{},[151848],{"type":17,"tag":6121,"props":151849,"children":151851},{"className":151850},[],[151852],{"type":23,"value":151853},"sort_order",{"type":17,"tag":84,"props":151855,"children":151856},{},[151857],{"type":17,"tag":6121,"props":151858,"children":151860},{"className":151859},[],[151861],{"type":23,"value":151742},{"type":17,"tag":84,"props":151863,"children":151864},{},[151865],{"type":17,"tag":6121,"props":151866,"children":151868},{"className":151867},[],[151869],{"type":23,"value":151870},"localizations",{"type":17,"tag":84,"props":151872,"children":151873},{},[151874],{"type":17,"tag":6121,"props":151875,"children":151877},{"className":151876},[],[151878],{"type":23,"value":151879},"skills",{"type":17,"tag":84,"props":151881,"children":151882},{},[151883],{"type":17,"tag":6121,"props":151884,"children":151886},{"className":151885},[],[151887],{"type":23,"value":62868},{"type":17,"tag":29,"props":151889,"children":151890},{},[151891],{"type":23,"value":151892},"Content may belong to multiple courses and multiple collections, depending on provider support.",{"type":17,"tag":239,"props":151894,"children":151896},{"id":151895},"collection-lmscollection",[151897,151899,151905],{"type":23,"value":151898},"Collection (",{"type":17,"tag":6121,"props":151900,"children":151902},{"className":151901},[],[151903],{"type":23,"value":151904},"LmsCollection",{"type":23,"value":12034},{"type":17,"tag":29,"props":151907,"children":151908},{},[151909],{"type":23,"value":151910},"Represents module or grouping hierarchy.",{"type":17,"tag":29,"props":151912,"children":151913},{},[151914],{"type":23,"value":111468},{"type":17,"tag":80,"props":151916,"children":151917},{},[151918,151926,151934,151942],{"type":17,"tag":84,"props":151919,"children":151920},{},[151921],{"type":17,"tag":6121,"props":151922,"children":151924},{"className":151923},[],[151925],{"type":23,"value":18766},{"type":17,"tag":84,"props":151927,"children":151928},{},[151929],{"type":17,"tag":6121,"props":151930,"children":151932},{"className":151931},[],[151933],{"type":23,"value":18781},{"type":17,"tag":84,"props":151935,"children":151936},{},[151937],{"type":17,"tag":6121,"props":151938,"children":151940},{"className":151939},[],[151941],{"type":23,"value":15863},{"type":17,"tag":84,"props":151943,"children":151944},{},[151945],{"type":17,"tag":6121,"props":151946,"children":151948},{"className":151947},[],[151949],{"type":23,"value":62868},{"type":17,"tag":29,"props":151951,"children":151952},{},[151953],{"type":23,"value":151954},"Collections are optional and provider-dependent.",{"type":17,"tag":239,"props":151956,"children":151958},{"id":151957},"class-lmsclass",[151959,151961,151967],{"type":23,"value":151960},"Class (",{"type":17,"tag":6121,"props":151962,"children":151964},{"className":151963},[],[151965],{"type":23,"value":151966},"LmsClass",{"type":23,"value":12034},{"type":17,"tag":29,"props":151969,"children":151970},{},[151971],{"type":23,"value":151972},"Represents sections or sessions of a course.",{"type":17,"tag":29,"props":151974,"children":151975},{},[151976],{"type":23,"value":151977},"Optional structural layer depending on provider.",{"type":17,"tag":68,"props":151979,"children":151981},{"id":151980},"step-1-ingest-the-source-lms-catalog",[151982],{"type":23,"value":151983},"Step 1: Ingest the Source LMS Catalog",{"type":17,"tag":29,"props":151985,"children":151986},{},[151987],{"type":23,"value":151988},"Start by fetching courses.",{"type":17,"tag":6893,"props":151990,"children":151993},{"className":151991,"code":151992,"language":18718,"meta":7},[18716],"async function fetchCourses(connectionId: string) {\n  return await sdk.lms.listLmsCourses({\n    connectionId,\n    limit: 100,\n    sort: 'updated_at',\n    order: 'asc',\n    fields: 'id,name,description,is_active,updated_at',\n  });\n}\n",[151994],{"type":17,"tag":6121,"props":151995,"children":151996},{"__ignoreMap":7},[151997],{"type":23,"value":151992},{"type":17,"tag":68,"props":151999,"children":152001},{"id":152000},"step-2-fetch-course-content",[152002],{"type":23,"value":152003},"Step 2: Fetch Course Content",{"type":17,"tag":29,"props":152005,"children":152006},{},[152007],{"type":23,"value":152008},"Fetch content items linked to each course.",{"type":17,"tag":6893,"props":152010,"children":152013},{"className":152011,"code":152012,"language":18718,"meta":7},[18716],"async function fetchCourseContent(connectionId: string, courseId: string) {\n  return await sdk.lms.listLmsContents({\n    connectionId,\n    course_id: courseId,\n    sort: 'sort_order',\n    order: 'asc',\n    fields: 'id,name,description,collection_ids,duration_minutes,sort_order,is_active',\n  });\n}\n",[152014],{"type":17,"tag":6121,"props":152015,"children":152016},{"__ignoreMap":7},[152017],{"type":23,"value":152012},{"type":17,"tag":29,"props":152019,"children":152020},{},[152021,152023,152028,152029,152034],{"type":23,"value":152022},"Not all providers support ",{"type":17,"tag":6121,"props":152024,"children":152026},{"className":152025},[],[152027],{"type":23,"value":151853},{"type":23,"value":75890},{"type":17,"tag":6121,"props":152030,"children":152032},{"className":152031},[],[152033],{"type":23,"value":151835},{"type":23,"value":152035},". Always build structure dynamically.",{"type":17,"tag":68,"props":152037,"children":152039},{"id":152038},"step-3-fetch-module-hierarchy-if-supported",[152040],{"type":23,"value":152041},"Step 3: Fetch Module Hierarchy (If Supported)",{"type":17,"tag":6893,"props":152043,"children":152046},{"className":152044,"code":152045,"language":18718,"meta":7},[18716],"async function fetchCollections(connectionId: string, courseId: string) {\n  return await sdk.lms.listLmsCollections({\n    connectionId,\n    course_id: courseId,\n    fields: 'id,name,parent_id,is_active',\n  });\n}\n",[152047],{"type":17,"tag":6121,"props":152048,"children":152049},{"__ignoreMap":7},[152050],{"type":23,"value":152045},{"type":17,"tag":29,"props":152052,"children":152053},{},[152054,152056,152061],{"type":23,"value":152055},"Reconstruct module trees using ",{"type":17,"tag":6121,"props":152057,"children":152059},{"className":152058},[],[152060],{"type":23,"value":15863},{"type":23,"value":54},{"type":17,"tag":29,"props":152063,"children":152064},{},[152065],{"type":23,"value":152066},"If Collections are not supported:",{"type":17,"tag":80,"props":152068,"children":152069},{},[152070],{"type":17,"tag":84,"props":152071,"children":152072},{},[152073],{"type":23,"value":152074},"Treat content as flat under Course.",{"type":17,"tag":68,"props":152076,"children":152078},{"id":152077},"step-4-build-a-canonical-content-tree",[152079],{"type":23,"value":152080},"Step 4: Build a Canonical Content Tree",{"type":17,"tag":29,"props":152082,"children":152083},{},[152084],{"type":23,"value":152085},"Combine Course, Collection, and Content objects into an internal model.",{"type":17,"tag":6893,"props":152087,"children":152090},{"className":152088,"code":152089,"language":18718,"meta":7},[18716],"function buildContentTree(course, collections, contents) {\n  const modules = buildCollectionTree(collections);\n\n  const contentByCollection = {};\n  contents.forEach(c => {\n    (c.collection_ids ?? []).forEach(colId => {\n      if (!contentByCollection[colId]) contentByCollection[colId] = [];\n      contentByCollection[colId].push(c);\n    });\n  });\n\n  return { course, modules, contentByCollection };\n}\n",[152091],{"type":17,"tag":6121,"props":152092,"children":152093},{"__ignoreMap":7},[152094],{"type":23,"value":152089},{"type":17,"tag":29,"props":152096,"children":152097},{},[152098],{"type":23,"value":152099},"Fallback strategy:",{"type":17,"tag":80,"props":152101,"children":152102},{},[152103],{"type":17,"tag":84,"props":152104,"children":152105},{},[152106],{"type":23,"value":152107},"If no collections → attach contents directly to course.",{"type":17,"tag":68,"props":152109,"children":152111},{"id":152110},"step-5-detect-structural-changes",[152112],{"type":23,"value":152113},"Step 5: Detect Structural Changes",{"type":17,"tag":29,"props":152115,"children":152116},{},[152117],{"type":23,"value":152118},"LMS integrations do not provide webhook notifications for structural changes.",{"type":17,"tag":29,"props":152120,"children":152121},{},[152122],{"type":23,"value":152123},"Use polling:",{"type":17,"tag":6893,"props":152125,"children":152128},{"className":152126,"code":152127,"language":18718,"meta":7},[18716],"await sdk.lms.listLmsCourses({\n  connectionId,\n  updated_gte: lastSync,\n});\n",[152129],{"type":17,"tag":6121,"props":152130,"children":152131},{"__ignoreMap":7},[152132],{"type":23,"value":152127},{"type":17,"tag":29,"props":152134,"children":152135},{},[152136],{"type":23,"value":19907},{"type":17,"tag":80,"props":152138,"children":152139},{},[152140,152150,152155],{"type":17,"tag":84,"props":152141,"children":152142},{},[152143,152148],{"type":17,"tag":6121,"props":152144,"children":152146},{"className":152145},[],[152147],{"type":23,"value":26291},{"type":23,"value":152149}," support varies by provider.",{"type":17,"tag":84,"props":152151,"children":152152},{},[152153],{"type":23,"value":152154},"Where unsupported, perform periodic full scans.",{"type":17,"tag":84,"props":152156,"children":152157},{},[152158,152160,152165,152166,152171],{"type":23,"value":152159},"Reconcile by ",{"type":17,"tag":6121,"props":152161,"children":152163},{"className":152162},[],[152164],{"type":23,"value":18766},{"type":23,"value":34435},{"type":17,"tag":6121,"props":152167,"children":152169},{"className":152168},[],[152170],{"type":23,"value":25337},{"type":23,"value":54},{"type":17,"tag":29,"props":152173,"children":152174},{},[152175],{"type":23,"value":152176},"Repeat for:",{"type":17,"tag":80,"props":152178,"children":152179},{},[152180,152184,152188],{"type":17,"tag":84,"props":152181,"children":152182},{},[152183],{"type":23,"value":55314},{"type":17,"tag":84,"props":152185,"children":152186},{},[152187],{"type":23,"value":38941},{"type":17,"tag":84,"props":152189,"children":152190},{},[152191],{"type":23,"value":152192},"Classes (if used)",{"type":17,"tag":68,"props":152194,"children":152196},{"id":152195},"step-6-determine-write-capability",[152197],{"type":23,"value":152198},"Step 6: Determine Write Capability",{"type":17,"tag":29,"props":152200,"children":152201},{},[152202],{"type":23,"value":152203},"Before propagating content to another LMS:",{"type":17,"tag":6154,"props":152205,"children":152206},{},[152207,152212],{"type":17,"tag":84,"props":152208,"children":152209},{},[152210],{"type":23,"value":152211},"Check provider-level writable field support.",{"type":17,"tag":84,"props":152213,"children":152214},{},[152215,152217],{"type":23,"value":152216},"Confirm whether:\n",{"type":17,"tag":80,"props":152218,"children":152219},{},[152220,152237,152253],{"type":17,"tag":84,"props":152221,"children":152222},{},[152223,152229,152230,152235],{"type":17,"tag":6121,"props":152224,"children":152226},{"className":152225},[],[152227],{"type":23,"value":152228},"lms_course_create",{"type":23,"value":26030},{"type":17,"tag":6121,"props":152231,"children":152233},{"className":152232},[],[152234],{"type":23,"value":11845},{"type":23,"value":152236}," are supported",{"type":17,"tag":84,"props":152238,"children":152239},{},[152240,152246,152247,152252],{"type":17,"tag":6121,"props":152241,"children":152243},{"className":152242},[],[152244],{"type":23,"value":152245},"lms_content_create",{"type":23,"value":26030},{"type":17,"tag":6121,"props":152248,"children":152250},{"className":152249},[],[152251],{"type":23,"value":11845},{"type":23,"value":152236},{"type":17,"tag":84,"props":152254,"children":152255},{},[152256,152262,152263,152268],{"type":17,"tag":6121,"props":152257,"children":152259},{"className":152258},[],[152260],{"type":23,"value":152261},"lms_collection_create",{"type":23,"value":26030},{"type":17,"tag":6121,"props":152264,"children":152266},{"className":152265},[],[152267],{"type":23,"value":11845},{"type":23,"value":152236},{"type":17,"tag":29,"props":152270,"children":152271},{},[152272],{"type":23,"value":152273},"Many LMS providers:",{"type":17,"tag":80,"props":152275,"children":152276},{},[152277,152294,152299],{"type":17,"tag":84,"props":152278,"children":152279},{},[152280,152282,152287,152288,152293],{"type":23,"value":152281},"Allow limited Course updates (e.g., ",{"type":17,"tag":6121,"props":152283,"children":152285},{"className":152284},[],[152286],{"type":23,"value":62868},{"type":23,"value":11826},{"type":17,"tag":6121,"props":152289,"children":152291},{"className":152290},[],[152292],{"type":23,"value":24679},{"type":23,"value":12034},{"type":17,"tag":84,"props":152295,"children":152296},{},[152297],{"type":23,"value":152298},"Do not support deep content or module creation",{"type":17,"tag":84,"props":152300,"children":152301},{},[152302],{"type":23,"value":152303},"Do not support structural writes",{"type":17,"tag":29,"props":152305,"children":152306},{},[152307],{"type":23,"value":152308},"Only propagate content when write support exists. Otherwise operate in mirror-only mode.",{"type":17,"tag":68,"props":152310,"children":152312},{"id":152311},"mirror-only-mode-safe-default",[152313],{"type":23,"value":152314},"Mirror-Only Mode (Safe Default)",{"type":17,"tag":29,"props":152316,"children":152317},{},[152318],{"type":23,"value":152319},"For providers without write support:",{"type":17,"tag":80,"props":152321,"children":152322},{},[152323,152328,152333],{"type":17,"tag":84,"props":152324,"children":152325},{},[152326],{"type":23,"value":152327},"Sync source LMS structure into your internal system",{"type":17,"tag":84,"props":152329,"children":152330},{},[152331],{"type":23,"value":152332},"Use your system as a unified catalog layer",{"type":17,"tag":84,"props":152334,"children":152335},{},[152336],{"type":23,"value":152337},"Do not attempt to replicate content into the destination LMS",{"type":17,"tag":29,"props":152339,"children":152340},{},[152341],{"type":23,"value":152342},"This avoids 501 Not Implemented responses and inconsistent state.",{"type":17,"tag":68,"props":152344,"children":152346},{"id":152345},"controlled-propagation-mode-when-supported",[152347],{"type":23,"value":152348},"Controlled Propagation Mode (When Supported)",{"type":17,"tag":29,"props":152350,"children":152351},{},[152352],{"type":23,"value":152353},"Where provider write support exists:",{"type":17,"tag":80,"props":152355,"children":152356},{},[152357,152362,152367,152372],{"type":17,"tag":84,"props":152358,"children":152359},{},[152360],{"type":23,"value":152361},"Create missing Courses in destination LMS",{"type":17,"tag":84,"props":152363,"children":152364},{},[152365],{"type":23,"value":152366},"Create or update Content items",{"type":17,"tag":84,"props":152368,"children":152369},{},[152370],{"type":23,"value":152371},"Rebuild module relationships (if writable)",{"type":17,"tag":84,"props":152373,"children":152374},{},[152375],{"type":23,"value":152376},"Respect provider field constraints",{"type":17,"tag":29,"props":152378,"children":152379},{},[152380],{"type":23,"value":152381},"Always:",{"type":17,"tag":80,"props":152383,"children":152384},{},[152385,152390],{"type":17,"tag":84,"props":152386,"children":152387},{},[152388],{"type":23,"value":152389},"Validate writable fields via Supported Integrations matrix",{"type":17,"tag":84,"props":152391,"children":152392},{},[152393],{"type":23,"value":152394},"Handle 403 (scope errors) and 501 (unsupported operations)",{"type":17,"tag":68,"props":152396,"children":152398},{"id":152397},"recommended-sync-architecture",[152399],{"type":23,"value":152400},"Recommended Sync Architecture",{"type":17,"tag":6154,"props":152402,"children":152403},{},[152404,152409,152414,152419,152424,152429],{"type":17,"tag":84,"props":152405,"children":152406},{},[152407],{"type":23,"value":152408},"Ingest source LMS structure",{"type":17,"tag":84,"props":152410,"children":152411},{},[152412],{"type":23,"value":152413},"Normalize to canonical model",{"type":17,"tag":84,"props":152415,"children":152416},{},[152417],{"type":23,"value":152418},"Detect structural deltas via polling",{"type":17,"tag":84,"props":152420,"children":152421},{},[152422],{"type":23,"value":152423},"Evaluate destination write capability",{"type":17,"tag":84,"props":152425,"children":152426},{},[152427],{"type":23,"value":152428},"Propagate only supported fields",{"type":17,"tag":84,"props":152430,"children":152431},{},[152432],{"type":23,"value":152433},"Fallback to mirror-only when unsupported",{"type":17,"tag":29,"props":152435,"children":152436},{},[152437],{"type":23,"value":152438},"This architecture works across heterogeneous LMS ecosystems.",{"type":17,"tag":68,"props":152440,"children":152442},{"id":152441},"provider-variability-reality",[152443],{"type":23,"value":152444},"Provider Variability Reality",{"type":17,"tag":29,"props":152446,"children":152447},{},[152448],{"type":23,"value":152449},"Across LMS providers:",{"type":17,"tag":80,"props":152451,"children":152452},{},[152453,152458,152463,152468,152473,152478],{"type":17,"tag":84,"props":152454,"children":152455},{},[152456],{"type":23,"value":152457},"Course read support is common",{"type":17,"tag":84,"props":152459,"children":152460},{},[152461],{"type":23,"value":152462},"Content read support varies",{"type":17,"tag":84,"props":152464,"children":152465},{},[152466],{"type":23,"value":152467},"Collection/module support is inconsistent",{"type":17,"tag":84,"props":152469,"children":152470},{},[152471],{"type":23,"value":152472},"Write support is limited and provider-specific",{"type":17,"tag":84,"props":152474,"children":152475},{},[152476],{"type":23,"value":152477},"No webhook support for structure changes",{"type":17,"tag":84,"props":152479,"children":152480},{},[152481,152483,152488],{"type":23,"value":152482},"Incremental filtering (",{"type":17,"tag":6121,"props":152484,"children":152486},{"className":152485},[],[152487],{"type":23,"value":26291},{"type":23,"value":152489},") varies by provider",{"type":17,"tag":29,"props":152491,"children":152492},{},[152493],{"type":23,"value":152494},"Design for variability.",{"type":17,"tag":68,"props":152496,"children":152497},{"id":132938},[152498],{"type":23,"value":132941},{"type":17,"tag":29,"props":152500,"children":152501},{},[152502],{"type":23,"value":152503},"Syncing course content across LMS platforms is not about forcing parity between systems. It is about respecting provider capabilities while maintaining a consistent internal representation.",{"type":17,"tag":29,"props":152505,"children":152506},{},[152507],{"type":23,"value":152508},"Unified's LMS API gives you:",{"type":17,"tag":80,"props":152510,"children":152511},{},[152512,152517,152522,152527],{"type":17,"tag":84,"props":152513,"children":152514},{},[152515],{"type":23,"value":152516},"A normalized content model",{"type":17,"tag":84,"props":152518,"children":152519},{},[152520],{"type":23,"value":152521},"Consistent parameter semantics",{"type":17,"tag":84,"props":152523,"children":152524},{},[152525],{"type":23,"value":152526},"Polling-based structural sync",{"type":17,"tag":84,"props":152528,"children":152529},{},[152530],{"type":23,"value":152531},"Explicit provider-level support boundaries",{"type":17,"tag":29,"props":152533,"children":152534},{},[152535,152537],{"type":23,"value":152536},"With a disciplined mirror-first approach and controlled propagation where supported, you can build reliable cross-LMS content workflows without overclaiming or relying on unsupported behavior.\n",{"type":17,"tag":133,"props":152538,"children":152540},{"href":1612,"rel":152539},[214],[152541],{"type":23,"value":44481},{"type":17,"tag":29,"props":152543,"children":152544},{},[152545],{"type":17,"tag":133,"props":152546,"children":152548},{"href":1623,"rel":152547},[214],[152549],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":152551},[152552,152553,152563,152564,152565,152566,152567,152568,152569,152570,152571,152572,152573],{"id":151606,"depth":1629,"text":151609},{"id":151668,"depth":1629,"text":151671,"children":152554},[152555,152557,152559,152561],{"id":151679,"depth":1635,"text":152556},"Course (LmsCourse)",{"id":151771,"depth":1635,"text":152558},"Content (LmsContent)",{"id":151895,"depth":1635,"text":152560},"Collection (LmsCollection)",{"id":151957,"depth":1635,"text":152562},"Class (LmsClass)",{"id":151980,"depth":1629,"text":151983},{"id":152000,"depth":1629,"text":152003},{"id":152038,"depth":1629,"text":152041},{"id":152077,"depth":1629,"text":152080},{"id":152110,"depth":1629,"text":152113},{"id":152195,"depth":1629,"text":152198},{"id":152311,"depth":1629,"text":152314},{"id":152345,"depth":1629,"text":152348},{"id":152397,"depth":1629,"text":152400},{"id":152441,"depth":1629,"text":152444},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_sync_course_content_between_lms_platforms_with_unified_lms_api.md","blog/how_to_sync_course_content_between_lms_platforms_with_unified_lms_api.md","blog/how_to_sync_course_content_between_lms_platforms_with_unified_lms_api",{"_path":152578,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":121059,"description":152579,"img":152580,"date":152581,"tag":12,"body":152582,"_type":1677,"_id":153552,"_source":1679,"_file":153553,"_stem":153554,"_extension":1682},"/blog/how_to_track_learner_progress_completion_status_and_course_activity_with_unified_lms_api","Tracking learner progress across LMS platforms is harder than it should be.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_track_learner_progress_completion_status_and_course_activity_with_unified_lms_api-icon.png","2026-02-19T23:10:00.000Z",{"type":14,"children":152583,"toc":153529},[152584,152589,152592,152599,152603,152608,152613,152623,152628,152634,152639,152667,152672,152696,152701,152707,152718,152724,152821,152826,152830,152848,152854,152859,152868,152873,152940,152946,152951,152957,152966,152972,152981,152985,153008,153014,153019,153024,153077,153082,153087,153096,153102,153107,153118,153131,153137,153150,153156,153161,153190,153195,153215,153221,153226,153280,153285,153294,153300,153305,153310,153343,153347,153356,153360,153378,153384,153389,153412,153416,153429,153434,153440,153444,153467,153472,153476,153481,153485,153508,153513,153521],{"type":17,"tag":18,"props":152585,"children":152587},{"id":152586},"how-to-track-learner-progress-completion-status-and-course-activity-with-unifieds-lms-api",[152588],{"type":23,"value":121059},{"type":17,"tag":25,"props":152590,"children":152591},{},[],{"type":17,"tag":29,"props":152593,"children":152594},{},[152595],{"type":17,"tag":33,"props":152596,"children":152597},{},[152598],{"type":23,"value":147916},{"type":17,"tag":29,"props":152600,"children":152601},{},[152602],{"type":23,"value":152579},{"type":17,"tag":29,"props":152604,"children":152605},{},[152606],{"type":23,"value":152607},"Every LMS models progress differently. Some expose percent completion. Others only track a completion flag. Some provide timestamps and time spent. Others provide minimal signals. Very few emit webhook notifications when progress changes.",{"type":17,"tag":29,"props":152609,"children":152610},{},[152611],{"type":23,"value":152612},"If you build progress tracking assuming every LMS behaves the same way, your dashboards will drift, your compliance reporting will break, and your 'real-time' claims will collapse under provider variability.",{"type":17,"tag":29,"props":152614,"children":152615},{},[152616,152617,152621],{"type":23,"value":25244},{"type":17,"tag":133,"props":152618,"children":152619},{"href":54426},[152620],{"type":23,"value":54429},{"type":23,"value":152622}," does not invent a universal progress model. It exposes what the underlying LMS provides through a normalized Activity object, with consistent endpoints and filtering semantics. Progress tracking becomes a matter of structured polling, reconciliation, and provider-aware fallbacks—not brittle event streams.",{"type":17,"tag":29,"props":152624,"children":152625},{},[152626],{"type":23,"value":152627},"This guide shows how to track learner progress, completion status, and course activity using Unified's LMS API, while staying aligned with actual provider capabilities.",{"type":17,"tag":68,"props":152629,"children":152631},{"id":152630},"what-track-progress-means-here",[152632],{"type":23,"value":152633},"What 'Track Progress' Means Here",{"type":17,"tag":29,"props":152635,"children":152636},{},[152637],{"type":23,"value":152638},"This use case focuses on:",{"type":17,"tag":80,"props":152640,"children":152641},{},[152642,152647,152652,152657,152662],{"type":17,"tag":84,"props":152643,"children":152644},{},[152645],{"type":23,"value":152646},"Fetching learner activity records",{"type":17,"tag":84,"props":152648,"children":152649},{},[152650],{"type":23,"value":152651},"Monitoring completion status",{"type":17,"tag":84,"props":152653,"children":152654},{},[152655],{"type":23,"value":152656},"Tracking percent progress",{"type":17,"tag":84,"props":152658,"children":152659},{},[152660],{"type":23,"value":152661},"Measuring engagement duration",{"type":17,"tag":84,"props":152663,"children":152664},{},[152665],{"type":23,"value":152666},"Updating dashboards and compliance reports",{"type":17,"tag":29,"props":152668,"children":152669},{},[152670],{"type":23,"value":152671},"It does not assume:",{"type":17,"tag":80,"props":152673,"children":152674},{},[152675,152686,152691],{"type":17,"tag":84,"props":152676,"children":152677},{},[152678,152680,152684],{"type":23,"value":152679},"Real-time ",{"type":17,"tag":133,"props":152681,"children":152682},{"href":4999},[152683],{"type":23,"value":5002},{"type":23,"value":152685}," across all LMS providers",{"type":17,"tag":84,"props":152687,"children":152688},{},[152689],{"type":23,"value":152690},"Uniform availability of progress fields",{"type":17,"tag":84,"props":152692,"children":152693},{},[152694],{"type":23,"value":152695},"Guaranteed incremental filtering support",{"type":17,"tag":29,"props":152697,"children":152698},{},[152699],{"type":23,"value":152700},"Progress is tracked through observable activity records—not inferred enrollment or vendor-specific signals.",{"type":17,"tag":68,"props":152702,"children":152704},{"id":152703},"the-canonical-progress-object-activity",[152705],{"type":23,"value":152706},"The Canonical Progress Object: Activity",{"type":17,"tag":29,"props":152708,"children":152709},{},[152710,152712,152717],{"type":23,"value":152711},"Unified represents learner progress through the ",{"type":17,"tag":48,"props":152713,"children":152714},{},[152715],{"type":23,"value":152716},"LmsActivity",{"type":23,"value":74653},{"type":17,"tag":239,"props":152719,"children":152721},{"id":152720},"key-fields",[152722],{"type":23,"value":152723},"Key fields",{"type":17,"tag":80,"props":152725,"children":152726},{},[152727,152735,152744,152753,152762,152771,152780,152788,152797,152805,152813],{"type":17,"tag":84,"props":152728,"children":152729},{},[152730],{"type":17,"tag":6121,"props":152731,"children":152733},{"className":152732},[],[152734],{"type":23,"value":18766},{"type":17,"tag":84,"props":152736,"children":152737},{},[152738],{"type":17,"tag":6121,"props":152739,"children":152741},{"className":152740},[],[152742],{"type":23,"value":152743},"course_id",{"type":17,"tag":84,"props":152745,"children":152746},{},[152747],{"type":17,"tag":6121,"props":152748,"children":152750},{"className":152749},[],[152751],{"type":23,"value":152752},"student_id",{"type":17,"tag":84,"props":152754,"children":152755},{},[152756],{"type":17,"tag":6121,"props":152757,"children":152759},{"className":152758},[],[152760],{"type":23,"value":152761},"content_id",{"type":17,"tag":84,"props":152763,"children":152764},{},[152765],{"type":17,"tag":6121,"props":152766,"children":152768},{"className":152767},[],[152769],{"type":23,"value":152770},"is_completed",{"type":17,"tag":84,"props":152772,"children":152773},{},[152774],{"type":17,"tag":6121,"props":152775,"children":152777},{"className":152776},[],[152778],{"type":23,"value":152779},"progress_percentage",{"type":17,"tag":84,"props":152781,"children":152782},{},[152783],{"type":17,"tag":6121,"props":152784,"children":152786},{"className":152785},[],[152787],{"type":23,"value":151844},{"type":17,"tag":84,"props":152789,"children":152790},{},[152791],{"type":17,"tag":6121,"props":152792,"children":152794},{"className":152793},[],[152795],{"type":23,"value":152796},"started_at",{"type":17,"tag":84,"props":152798,"children":152799},{},[152800],{"type":17,"tag":6121,"props":152801,"children":152803},{"className":152802},[],[152804],{"type":23,"value":124824},{"type":17,"tag":84,"props":152806,"children":152807},{},[152808],{"type":17,"tag":6121,"props":152809,"children":152811},{"className":152810},[],[152812],{"type":23,"value":33446},{"type":17,"tag":84,"props":152814,"children":152815},{},[152816],{"type":17,"tag":6121,"props":152817,"children":152819},{"className":152818},[],[152820],{"type":23,"value":25337},{"type":17,"tag":29,"props":152822,"children":152823},{},[152824],{"type":23,"value":152825},"Activity records capture interactions with content or courses. They are the authoritative source for tracking progress and completion.",{"type":17,"tag":29,"props":152827,"children":152828},{},[152829],{"type":23,"value":19907},{"type":17,"tag":80,"props":152831,"children":152832},{},[152833,152838,152843],{"type":17,"tag":84,"props":152834,"children":152835},{},[152836],{"type":23,"value":152837},"Enrollment is not inferred from Activity.",{"type":17,"tag":84,"props":152839,"children":152840},{},[152841],{"type":23,"value":152842},"Absence of an Activity does not imply absence of enrollment.",{"type":17,"tag":84,"props":152844,"children":152845},{},[152846],{"type":23,"value":152847},"Activity reflects engagement, not membership.",{"type":17,"tag":68,"props":152849,"children":152851},{"id":152850},"step-1-fetch-activity-records",[152852],{"type":23,"value":152853},"Step 1: Fetch Activity Records",{"type":17,"tag":29,"props":152855,"children":152856},{},[152857],{"type":23,"value":152858},"Use the list endpoint to retrieve progress data.",{"type":17,"tag":6893,"props":152860,"children":152863},{"className":152861,"code":152862,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function fetchActivities(connectionId: string) {\n  const activities = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.lms.listLmsActivities({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: [\n        'id',\n        'course_id',\n        'student_id',\n        'content_id',\n        'is_completed',\n        'progress_percentage',\n        'duration_minutes',\n        'started_at',\n        'completed_at',\n      ].join(','),\n    });\n\n    if (!page || page.length === 0) break;\n\n    activities.push(...page);\n    offset += limit;\n  }\n\n  return activities;\n}\n",[152864],{"type":17,"tag":6121,"props":152865,"children":152866},{"__ignoreMap":7},[152867],{"type":23,"value":152862},{"type":17,"tag":29,"props":152869,"children":152870},{},[152871],{"type":23,"value":152872},"Supported filters:",{"type":17,"tag":80,"props":152874,"children":152875},{},[152876,152884,152892,152900,152908,152916,152924,152932],{"type":17,"tag":84,"props":152877,"children":152878},{},[152879],{"type":17,"tag":6121,"props":152880,"children":152882},{"className":152881},[],[152883],{"type":23,"value":152752},{"type":17,"tag":84,"props":152885,"children":152886},{},[152887],{"type":17,"tag":6121,"props":152888,"children":152890},{"className":152889},[],[152891],{"type":23,"value":152743},{"type":17,"tag":84,"props":152893,"children":152894},{},[152895],{"type":17,"tag":6121,"props":152896,"children":152898},{"className":152897},[],[152899],{"type":23,"value":152761},{"type":17,"tag":84,"props":152901,"children":152902},{},[152903],{"type":17,"tag":6121,"props":152904,"children":152906},{"className":152905},[],[152907],{"type":23,"value":48368},{"type":17,"tag":84,"props":152909,"children":152910},{},[152911],{"type":17,"tag":6121,"props":152912,"children":152914},{"className":152913},[],[152915],{"type":23,"value":48389},{"type":17,"tag":84,"props":152917,"children":152918},{},[152919],{"type":17,"tag":6121,"props":152920,"children":152922},{"className":152921},[],[152923],{"type":23,"value":48411},{"type":17,"tag":84,"props":152925,"children":152926},{},[152927],{"type":17,"tag":6121,"props":152928,"children":152930},{"className":152929},[],[152931],{"type":23,"value":39759},{"type":17,"tag":84,"props":152933,"children":152934},{},[152935],{"type":17,"tag":6121,"props":152936,"children":152938},{"className":152937},[],[152939],{"type":23,"value":62389},{"type":17,"tag":68,"props":152941,"children":152943},{"id":152942},"step-2-segment-by-student-or-course",[152944],{"type":23,"value":152945},"Step 2: Segment by Student or Course",{"type":17,"tag":29,"props":152947,"children":152948},{},[152949],{"type":23,"value":152950},"You can filter progress by student or course directly in the API.",{"type":17,"tag":239,"props":152952,"children":152954},{"id":152953},"per-student-progress",[152955],{"type":23,"value":152956},"Per-student progress",{"type":17,"tag":6893,"props":152958,"children":152961},{"className":152959,"code":152960,"language":18718,"meta":7},[18716],"await sdk.lms.listLmsActivities({\n  connectionId,\n  student_id: studentId,\n});\n",[152962],{"type":17,"tag":6121,"props":152963,"children":152964},{"__ignoreMap":7},[152965],{"type":23,"value":152960},{"type":17,"tag":239,"props":152967,"children":152969},{"id":152968},"per-course-progress",[152970],{"type":23,"value":152971},"Per-course progress",{"type":17,"tag":6893,"props":152973,"children":152976},{"className":152974,"code":152975,"language":18718,"meta":7},[18716],"await sdk.lms.listLmsActivities({\n  connectionId,\n  course_id: courseId,\n});\n",[152977],{"type":17,"tag":6121,"props":152978,"children":152979},{"__ignoreMap":7},[152980],{"type":23,"value":152975},{"type":17,"tag":29,"props":152982,"children":152983},{},[152984],{"type":23,"value":79138},{"type":17,"tag":80,"props":152986,"children":152987},{},[152988,152993,152998,153003],{"type":17,"tag":84,"props":152989,"children":152990},{},[152991],{"type":23,"value":152992},"Learner dashboards",{"type":17,"tag":84,"props":152994,"children":152995},{},[152996],{"type":23,"value":152997},"Instructor dashboards",{"type":17,"tag":84,"props":152999,"children":153000},{},[153001],{"type":23,"value":153002},"Compliance tracking",{"type":17,"tag":84,"props":153004,"children":153005},{},[153006],{"type":23,"value":153007},"Cohort analytics",{"type":17,"tag":68,"props":153009,"children":153011},{"id":153010},"step-3-understand-provider-variability",[153012],{"type":23,"value":153013},"Step 3: Understand Provider Variability",{"type":17,"tag":29,"props":153015,"children":153016},{},[153017],{"type":23,"value":153018},"Not all LMS providers expose all progress fields.",{"type":17,"tag":29,"props":153020,"children":153021},{},[153022],{"type":23,"value":153023},"From field-level support:",{"type":17,"tag":80,"props":153025,"children":153026},{},[153027,153037,153047,153057,153067],{"type":17,"tag":84,"props":153028,"children":153029},{},[153030,153035],{"type":17,"tag":6121,"props":153031,"children":153033},{"className":153032},[],[153034],{"type":23,"value":152770},{"type":23,"value":153036}," is widely supported.",{"type":17,"tag":84,"props":153038,"children":153039},{},[153040,153045],{"type":17,"tag":6121,"props":153041,"children":153043},{"className":153042},[],[153044],{"type":23,"value":152779},{"type":23,"value":153046}," is supported by some providers (e.g., Coursera, Go1, LearnUpon), but not universally.",{"type":17,"tag":84,"props":153048,"children":153049},{},[153050,153055],{"type":17,"tag":6121,"props":153051,"children":153053},{"className":153052},[],[153054],{"type":23,"value":151844},{"type":23,"value":153056}," is supported by some providers (e.g., Coursera, D2L, SAP), but not all.",{"type":17,"tag":84,"props":153058,"children":153059},{},[153060,153065],{"type":17,"tag":6121,"props":153061,"children":153063},{"className":153062},[],[153064],{"type":23,"value":152761},{"type":23,"value":153066}," may be absent for some providers.",{"type":17,"tag":84,"props":153068,"children":153069},{},[153070,153075],{"type":17,"tag":6121,"props":153071,"children":153073},{"className":153072},[],[153074],{"type":23,"value":25337},{"type":23,"value":153076}," on Activity is not universally populated.",{"type":17,"tag":29,"props":153078,"children":153079},{},[153080],{"type":23,"value":153081},"Your implementation must treat missing fields as legitimate absence—not errors.",{"type":17,"tag":29,"props":153083,"children":153084},{},[153085],{"type":23,"value":153086},"Example fallback logic:",{"type":17,"tag":6893,"props":153088,"children":153091},{"className":153089,"code":153090,"language":18718,"meta":7},[18716],"function normalizeProgress(activity) {\n  return {\n    completed: activity.is_completed ?? false,\n    progress: activity.progress_percentage ?? null,\n    duration: activity.duration_minutes ?? null,\n  };\n}\n",[153092],{"type":17,"tag":6121,"props":153093,"children":153094},{"__ignoreMap":7},[153095],{"type":23,"value":153090},{"type":17,"tag":68,"props":153097,"children":153099},{"id":153098},"step-4-incremental-sync-strategy",[153100],{"type":23,"value":153101},"Step 4: Incremental Sync Strategy",{"type":17,"tag":29,"props":153103,"children":153104},{},[153105],{"type":23,"value":153106},"Unlike many HR categories, LMS integrations do not universally support incremental filtering for Activity.",{"type":17,"tag":239,"props":153108,"children":153110},{"id":153109},"updated_gte-support",[153111,153116],{"type":17,"tag":6121,"props":153112,"children":153114},{"className":153113},[],[153115],{"type":23,"value":26291},{"type":23,"value":153117}," support:",{"type":17,"tag":80,"props":153119,"children":153120},{},[153121,153126],{"type":17,"tag":84,"props":153122,"children":153123},{},[153124],{"type":23,"value":153125},"Supported: SAP SuccessFactors (LMS)",{"type":17,"tag":84,"props":153127,"children":153128},{},[153129],{"type":23,"value":153130},"Not supported: most other LMS providers",{"type":17,"tag":239,"props":153132,"children":153134},{"id":153133},"webhook-support",[153135],{"type":23,"value":153136},"Webhook support:",{"type":17,"tag":80,"props":153138,"children":153139},{},[153140,153145],{"type":17,"tag":84,"props":153141,"children":153142},{},[153143],{"type":23,"value":153144},"Only SAP exposes LMS webhook events.",{"type":17,"tag":84,"props":153146,"children":153147},{},[153148],{"type":23,"value":153149},"No other provider supports LMS webhooks.",{"type":17,"tag":239,"props":153151,"children":153153},{"id":153152},"implication",[153154],{"type":23,"value":153155},"Implication",{"type":17,"tag":29,"props":153157,"children":153158},{},[153159],{"type":23,"value":153160},"For most providers:",{"type":17,"tag":80,"props":153162,"children":153163},{},[153164,153169,153180,153185],{"type":17,"tag":84,"props":153165,"children":153166},{},[153167],{"type":23,"value":153168},"You must poll the Activity endpoint.",{"type":17,"tag":84,"props":153170,"children":153171},{},[153172,153174,153179],{"type":23,"value":153173},"Deduplicate by ",{"type":17,"tag":6121,"props":153175,"children":153177},{"className":153176},[],[153178],{"type":23,"value":18766},{"type":23,"value":54},{"type":17,"tag":84,"props":153181,"children":153182},{},[153183],{"type":23,"value":153184},"Compare stored values for changes.",{"type":17,"tag":84,"props":153186,"children":153187},{},[153188],{"type":23,"value":153189},"Recompute progress aggregates.",{"type":17,"tag":29,"props":153191,"children":153192},{},[153193],{"type":23,"value":153194},"For SAP:",{"type":17,"tag":80,"props":153196,"children":153197},{},[153198,153210],{"type":17,"tag":84,"props":153199,"children":153200},{},[153201,153203,153208],{"type":23,"value":153202},"You may use ",{"type":17,"tag":6121,"props":153204,"children":153206},{"className":153205},[],[153207],{"type":23,"value":26291},{"type":23,"value":153209}," for incremental polling.",{"type":17,"tag":84,"props":153211,"children":153212},{},[153213],{"type":23,"value":153214},"You may use webhooks if available.",{"type":17,"tag":68,"props":153216,"children":153218},{"id":153217},"step-5-recommended-polling-loop",[153219],{"type":23,"value":153220},"Step 5: Recommended Polling Loop",{"type":17,"tag":29,"props":153222,"children":153223},{},[153224],{"type":23,"value":153225},"A safe polling loop:",{"type":17,"tag":6154,"props":153227,"children":153228},{},[153229,153234,153239],{"type":17,"tag":84,"props":153230,"children":153231},{},[153232],{"type":23,"value":153233},"Fetch activities (filtered by student_id or course_id if needed).",{"type":17,"tag":84,"props":153235,"children":153236},{},[153237],{"type":23,"value":153238},"Store activity IDs and progress values.",{"type":17,"tag":84,"props":153240,"children":153241},{},[153242,153244],{"type":23,"value":153243},"On next poll:\n",{"type":17,"tag":80,"props":153245,"children":153246},{},[153247,153252,153275],{"type":17,"tag":84,"props":153248,"children":153249},{},[153250],{"type":23,"value":153251},"Re-fetch.",{"type":17,"tag":84,"props":153253,"children":153254},{},[153255,153257,153262,153263,153268,153269,153274],{"type":23,"value":153256},"Compare ",{"type":17,"tag":6121,"props":153258,"children":153260},{"className":153259},[],[153261],{"type":23,"value":152770},{"type":23,"value":11826},{"type":17,"tag":6121,"props":153264,"children":153266},{"className":153265},[],[153267],{"type":23,"value":152779},{"type":23,"value":11826},{"type":17,"tag":6121,"props":153270,"children":153272},{"className":153271},[],[153273],{"type":23,"value":124824},{"type":23,"value":54},{"type":17,"tag":84,"props":153276,"children":153277},{},[153278],{"type":23,"value":153279},"Update downstream dashboards accordingly.",{"type":17,"tag":29,"props":153281,"children":153282},{},[153283],{"type":23,"value":153284},"Example high-level pattern:",{"type":17,"tag":6893,"props":153286,"children":153289},{"className":153287,"code":153288,"language":18718,"meta":7},[18716],"function reconcileActivities(previousMap, currentList) {\n  const updates = [];\n\n  for (const activity of currentList) {\n    const prev = previousMap.get(activity.id);\n\n    if (!prev || prev.progress_percentage !== activity.progress_percentage ||\n        prev.is_completed !== activity.is_completed) {\n      updates.push(activity);\n    }\n  }\n\n  return updates;\n}\n",[153290],{"type":17,"tag":6121,"props":153291,"children":153292},{"__ignoreMap":7},[153293],{"type":23,"value":153288},{"type":17,"tag":68,"props":153295,"children":153297},{"id":153296},"step-6-enrich-with-course-and-content-context",[153298],{"type":23,"value":153299},"Step 6: Enrich with Course and Content Context",{"type":17,"tag":29,"props":153301,"children":153302},{},[153303],{"type":23,"value":153304},"Progress alone is not meaningful without context.",{"type":17,"tag":29,"props":153306,"children":153307},{},[153308],{"type":23,"value":153309},"Join Activity with:",{"type":17,"tag":80,"props":153311,"children":153312},{},[153313,153323,153333],{"type":17,"tag":84,"props":153314,"children":153315},{},[153316,153321],{"type":17,"tag":6121,"props":153317,"children":153319},{"className":153318},[],[153320],{"type":23,"value":55275},{"type":23,"value":153322}," for catalog metadata",{"type":17,"tag":84,"props":153324,"children":153325},{},[153326,153331],{"type":17,"tag":6121,"props":153327,"children":153329},{"className":153328},[],[153330],{"type":23,"value":55314},{"type":23,"value":153332}," for lesson/module info",{"type":17,"tag":84,"props":153334,"children":153335},{},[153336,153341],{"type":17,"tag":6121,"props":153337,"children":153339},{"className":153338},[],[153340],{"type":23,"value":55327},{"type":23,"value":153342}," for module hierarchy",{"type":17,"tag":29,"props":153344,"children":153345},{},[153346],{"type":23,"value":19878},{"type":17,"tag":6893,"props":153348,"children":153351},{"className":153349,"code":153350,"language":18718,"meta":7},[18716],"await sdk.lms.getLmsCourse({ connectionId, id: activity.course_id });\nawait sdk.lms.getLmsContent({ connectionId, id: activity.content_id });\n",[153352],{"type":17,"tag":6121,"props":153353,"children":153354},{"__ignoreMap":7},[153355],{"type":23,"value":153350},{"type":17,"tag":29,"props":153357,"children":153358},{},[153359],{"type":23,"value":79138},{"type":17,"tag":80,"props":153361,"children":153362},{},[153363,153368,153373],{"type":17,"tag":84,"props":153364,"children":153365},{},[153366],{"type":23,"value":153367},"Module-level completion views",{"type":17,"tag":84,"props":153369,"children":153370},{},[153371],{"type":23,"value":153372},"Time-to-completion metrics",{"type":17,"tag":84,"props":153374,"children":153375},{},[153376],{"type":23,"value":153377},"Content-level engagement insights",{"type":17,"tag":68,"props":153379,"children":153381},{"id":153380},"what-real-time-means-here",[153382],{"type":23,"value":153383},"What 'Real-Time' Means Here",{"type":17,"tag":29,"props":153385,"children":153386},{},[153387],{"type":23,"value":153388},"In LMS integrations, 'real-time' means:",{"type":17,"tag":80,"props":153390,"children":153391},{},[153392,153397,153402,153407],{"type":17,"tag":84,"props":153393,"children":153394},{},[153395],{"type":23,"value":153396},"On-demand, pass-through reads",{"type":17,"tag":84,"props":153398,"children":153399},{},[153400],{"type":23,"value":153401},"No caching",{"type":17,"tag":84,"props":153403,"children":153404},{},[153405],{"type":23,"value":153406},"Polling-based updates where required",{"type":17,"tag":84,"props":153408,"children":153409},{},[153410],{"type":23,"value":153411},"Webhooks only where supported (SAP)",{"type":17,"tag":29,"props":153413,"children":153414},{},[153415],{"type":23,"value":151642},{"type":17,"tag":80,"props":153417,"children":153418},{},[153419,153424],{"type":17,"tag":84,"props":153420,"children":153421},{},[153422],{"type":23,"value":153423},"Universal event-driven notifications",{"type":17,"tag":84,"props":153425,"children":153426},{},[153427],{"type":23,"value":153428},"Instant push updates across all LMS providers",{"type":17,"tag":29,"props":153430,"children":153431},{},[153432],{"type":23,"value":153433},"Unified preserves provider realities instead of simulating them.",{"type":17,"tag":68,"props":153435,"children":153437},{"id":153436},"what-unified-does-not-assume",[153438],{"type":23,"value":153439},"What Unified Does Not Assume",{"type":17,"tag":29,"props":153441,"children":153442},{},[153443],{"type":23,"value":104494},{"type":17,"tag":80,"props":153445,"children":153446},{},[153447,153452,153457,153462],{"type":17,"tag":84,"props":153448,"children":153449},{},[153450],{"type":23,"value":153451},"Infer progress from enrollment",{"type":17,"tag":84,"props":153453,"children":153454},{},[153455],{"type":23,"value":153456},"Guarantee incremental filtering across all LMS providers",{"type":17,"tag":84,"props":153458,"children":153459},{},[153460],{"type":23,"value":153461},"Emit synthetic webhook streams for LMS",{"type":17,"tag":84,"props":153463,"children":153464},{},[153465],{"type":23,"value":153466},"Normalize missing progress fields",{"type":17,"tag":29,"props":153468,"children":153469},{},[153470],{"type":23,"value":153471},"It exposes the data the LMS provides, consistently and transparently.",{"type":17,"tag":68,"props":153473,"children":153474},{"id":132938},[153475],{"type":23,"value":132941},{"type":17,"tag":29,"props":153477,"children":153478},{},[153479],{"type":23,"value":153480},"Tracking learner progress across LMS platforms requires discipline, not assumptions.",{"type":17,"tag":29,"props":153482,"children":153483},{},[153484],{"type":23,"value":152508},{"type":17,"tag":80,"props":153486,"children":153487},{},[153488,153493,153498,153503],{"type":17,"tag":84,"props":153489,"children":153490},{},[153491],{"type":23,"value":153492},"A normalized Activity model",{"type":17,"tag":84,"props":153494,"children":153495},{},[153496],{"type":23,"value":153497},"Consistent list endpoints",{"type":17,"tag":84,"props":153499,"children":153500},{},[153501],{"type":23,"value":153502},"Flexible filtering",{"type":17,"tag":84,"props":153504,"children":153505},{},[153506],{"type":23,"value":153507},"Clear provider variability boundaries",{"type":17,"tag":29,"props":153509,"children":153510},{},[153511],{"type":23,"value":153512},"With the right polling strategy and provider-aware fallbacks, you can build accurate, portable progress dashboards across heterogeneous LMS ecosystems—without overclaiming real-time behavior or inventing missing data.",{"type":17,"tag":29,"props":153514,"children":153515},{},[153516],{"type":17,"tag":133,"props":153517,"children":153519},{"href":1612,"rel":153518},[214],[153520],{"type":23,"value":44481},{"type":17,"tag":29,"props":153522,"children":153523},{},[153524],{"type":17,"tag":133,"props":153525,"children":153527},{"href":1623,"rel":153526},[214],[153528],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":153530},[153531,153532,153535,153536,153540,153541,153547,153548,153549,153550,153551],{"id":152630,"depth":1629,"text":152633},{"id":152703,"depth":1629,"text":152706,"children":153533},[153534],{"id":152720,"depth":1635,"text":152723},{"id":152850,"depth":1629,"text":152853},{"id":152942,"depth":1629,"text":152945,"children":153537},[153538,153539],{"id":152953,"depth":1635,"text":152956},{"id":152968,"depth":1635,"text":152971},{"id":153010,"depth":1629,"text":153013},{"id":153098,"depth":1629,"text":153101,"children":153542},[153543,153545,153546],{"id":153109,"depth":1635,"text":153544},"updated_gte support:",{"id":153133,"depth":1635,"text":153136},{"id":153152,"depth":1635,"text":153155},{"id":153217,"depth":1629,"text":153220},{"id":153296,"depth":1629,"text":153299},{"id":153380,"depth":1629,"text":153383},{"id":153436,"depth":1629,"text":153439},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_track_learner_progress_completion_status_and_course_activity_with_unified_lms_api.md","blog/how_to_track_learner_progress_completion_status_and_course_activity_with_unified_lms_api.md","blog/how_to_track_learner_progress_completion_status_and_course_activity_with_unified_lms_api",{"_path":153556,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":121079,"description":153557,"img":153558,"date":153559,"tag":12,"body":153560,"_type":1677,"_id":154428,"_source":1679,"_file":154429,"_stem":154430,"_extension":1682},"/blog/how_to_access_courses_modules_and_content_from_lms_platforms_with_unified_lms_api","Accessing course structure across LMS platforms is harder than it looks.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_access_courses_modules_and_content_from_lms_platforms_with_unified_lms_api-icon.png","2026-02-19T22:59:00.000Z",{"type":14,"children":153561,"toc":154411},[153562,153567,153570,153577,153581,153586,153591,153601,153606,153612,153617,153666,153671,153677,153682,153691,153696,153772,153776,153800,153806,153811,153820,153832,153838,153843,153852,153856,153880,153886,153891,153900,153911,153920,153926,153931,153936,153949,153954,153960,153965,153974,153978,154031,154043,154054,154062,154079,154085,154090,154099,154103,154121,154127,154132,154137,154148,154156,154161,154194,154199,154215,154219,154224,154266,154271,154294,154299,154305,154310,154319,154324,154328,154333,154337,154390,154395,154403],{"type":17,"tag":18,"props":153563,"children":153565},{"id":153564},"how-to-access-courses-modules-and-content-from-lms-platforms-with-unifieds-lms-api",[153566],{"type":23,"value":121079},{"type":17,"tag":25,"props":153568,"children":153569},{},[],{"type":17,"tag":29,"props":153571,"children":153572},{},[153573],{"type":17,"tag":33,"props":153574,"children":153575},{},[153576],{"type":23,"value":147916},{"type":17,"tag":29,"props":153578,"children":153579},{},[153580],{"type":23,"value":153557},{"type":17,"tag":29,"props":153582,"children":153583},{},[153584],{"type":23,"value":153585},"Some LMS providers model courses as flat catalogs. Others introduce sections or sessions. Some expose module hierarchies. Others only return content items attached to courses. Structure depth, field availability, and filtering support vary widely across providers.",{"type":17,"tag":29,"props":153587,"children":153588},{},[153589],{"type":23,"value":153590},"When teams build LMS integrations assuming consistent structure, course browsing breaks. Modules disappear. Sections are ignored. Content trees flatten unexpectedly.",{"type":17,"tag":29,"props":153592,"children":153593},{},[153594,153595,153599],{"type":23,"value":25244},{"type":17,"tag":133,"props":153596,"children":153597},{"href":54426},[153598],{"type":23,"value":54429},{"type":23,"value":153600}," provides a normalized interface to fetch courses, classes, modules, and content — while preserving provider-specific realities. You get a consistent object model and parameter surface, without inventing structure that doesn't exist upstream.",{"type":17,"tag":29,"props":153602,"children":153603},{},[153604],{"type":23,"value":153605},"This guide shows how to fetch course catalogs, reconstruct module hierarchies, retrieve learning items, and keep structure in sync across LMS platforms — safely and provider-aware.",{"type":17,"tag":68,"props":153607,"children":153609},{"id":153608},"the-unified-lms-structure-model",[153610],{"type":23,"value":153611},"The Unified LMS Structure Model",{"type":17,"tag":29,"props":153613,"children":153614},{},[153615],{"type":23,"value":153616},"Unified exposes the following core objects:",{"type":17,"tag":80,"props":153618,"children":153619},{},[153620,153629,153639,153648,153657],{"type":17,"tag":84,"props":153621,"children":153622},{},[153623,153627],{"type":17,"tag":48,"props":153624,"children":153625},{},[153626],{"type":23,"value":55275},{"type":23,"value":153628}," → catalog-level course entry",{"type":17,"tag":84,"props":153630,"children":153631},{},[153632,153637],{"type":17,"tag":48,"props":153633,"children":153634},{},[153635],{"type":23,"value":153636},"Class",{"type":23,"value":153638}," → section/session of a course (optional per provider)",{"type":17,"tag":84,"props":153640,"children":153641},{},[153642,153646],{"type":17,"tag":48,"props":153643,"children":153644},{},[153645],{"type":23,"value":55327},{"type":23,"value":153647}," → module or content grouping (optional per provider)",{"type":17,"tag":84,"props":153649,"children":153650},{},[153651,153655],{"type":17,"tag":48,"props":153652,"children":153653},{},[153654],{"type":23,"value":55314},{"type":23,"value":153656}," → learning item (lesson, video, document, etc.)",{"type":17,"tag":84,"props":153658,"children":153659},{},[153660,153664],{"type":17,"tag":48,"props":153661,"children":153662},{},[153663],{"type":23,"value":33999},{"type":23,"value":153665}," → learner progress (optional enrichment)",{"type":17,"tag":29,"props":153667,"children":153668},{},[153669],{"type":23,"value":153670},"Structure is reconstructed by joining these objects. Unified does not assume all providers support every layer.",{"type":17,"tag":68,"props":153672,"children":153674},{"id":153673},"step-1-fetch-the-course-catalog",[153675],{"type":23,"value":153676},"Step 1: Fetch the Course Catalog",{"type":17,"tag":29,"props":153678,"children":153679},{},[153680],{"type":23,"value":153681},"Start by listing courses.",{"type":17,"tag":6893,"props":153683,"children":153686},{"className":153684,"code":153685,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function fetchCourses(connectionId: string) {\n  return await sdk.lms.listLmsCourses({\n    connectionId,\n    limit: 100,\n    sort: 'updated_at',\n    order: 'asc',\n    fields: 'id,name,is_active,is_private,updated_at',\n  });\n}\n",[153687],{"type":17,"tag":6121,"props":153688,"children":153689},{"__ignoreMap":7},[153690],{"type":23,"value":153685},{"type":17,"tag":29,"props":153692,"children":153693},{},[153694],{"type":23,"value":153695},"Supported parameters include:",{"type":17,"tag":80,"props":153697,"children":153698},{},[153699,153719,153729,153737,153746,153754,153762],{"type":17,"tag":84,"props":153700,"children":153701},{},[153702,153707,153708,153713,153714,153718],{"type":17,"tag":6121,"props":153703,"children":153705},{"className":153704},[],[153706],{"type":23,"value":48389},{"type":23,"value":26030},{"type":17,"tag":6121,"props":153709,"children":153711},{"className":153710},[],[153712],{"type":23,"value":48411},{"type":23,"value":44573},{"type":17,"tag":133,"props":153715,"children":153716},{"href":1857},[153717],{"type":23,"value":1860},{"type":23,"value":12034},{"type":17,"tag":84,"props":153720,"children":153721},{},[153722,153727],{"type":17,"tag":6121,"props":153723,"children":153725},{"className":153724},[],[153726],{"type":23,"value":26291},{"type":23,"value":153728}," (where supported)",{"type":17,"tag":84,"props":153730,"children":153731},{},[153732],{"type":17,"tag":6121,"props":153733,"children":153735},{"className":153734},[],[153736],{"type":23,"value":48368},{"type":17,"tag":84,"props":153738,"children":153739},{},[153740],{"type":17,"tag":6121,"props":153741,"children":153743},{"className":153742},[],[153744],{"type":23,"value":153745},"class_id",{"type":17,"tag":84,"props":153747,"children":153748},{},[153749],{"type":17,"tag":6121,"props":153750,"children":153752},{"className":153751},[],[153753],{"type":23,"value":27299},{"type":17,"tag":84,"props":153755,"children":153756},{},[153757],{"type":17,"tag":6121,"props":153758,"children":153760},{"className":153759},[],[153761],{"type":23,"value":39759},{"type":17,"tag":84,"props":153763,"children":153764},{},[153765,153770],{"type":17,"tag":6121,"props":153766,"children":153768},{"className":153767},[],[153769],{"type":23,"value":62389},{"type":23,"value":153771}," (provider passthrough)",{"type":17,"tag":239,"props":153773,"children":153774},{"id":18741},[153775],{"type":23,"value":18744},{"type":17,"tag":29,"props":153777,"children":153778},{},[153779,153781,153786,153788,153793,153794,153799],{"type":23,"value":153780},"Not all LMS providers support incremental filtering (",{"type":17,"tag":6121,"props":153782,"children":153784},{"className":153783},[],[153785],{"type":23,"value":26291},{"type":23,"value":153787},"). Where supported, you can use it for incremental sync. Where it is not supported, perform periodic full scans and reconcile changes by ",{"type":17,"tag":6121,"props":153789,"children":153791},{"className":153790},[],[153792],{"type":23,"value":18766},{"type":23,"value":34435},{"type":17,"tag":6121,"props":153795,"children":153797},{"className":153796},[],[153798],{"type":23,"value":25337},{"type":23,"value":54},{"type":17,"tag":68,"props":153801,"children":153803},{"id":153802},"step-2-retrieve-course-details",[153804],{"type":23,"value":153805},"Step 2: Retrieve Course Details",{"type":17,"tag":29,"props":153807,"children":153808},{},[153809],{"type":23,"value":153810},"For a detailed course view:",{"type":17,"tag":6893,"props":153812,"children":153815},{"className":153813,"code":153814,"language":18718,"meta":7},[18716],"async function fetchCourse(connectionId: string, id: string) {\n  return await sdk.lms.getLmsCourse({\n    connectionId,\n    id,\n    fields: 'id,name,description,languages,categories,media,instructor_ids',\n  });\n}\n",[153816],{"type":17,"tag":6121,"props":153817,"children":153818},{"__ignoreMap":7},[153819],{"type":23,"value":153814},{"type":17,"tag":29,"props":153821,"children":153822},{},[153823,153825,153830],{"type":23,"value":153824},"Using ",{"type":17,"tag":6121,"props":153826,"children":153828},{"className":153827},[],[153829],{"type":23,"value":39759},{"type":23,"value":153831}," prevents over-fetching large media payloads in list views.",{"type":17,"tag":68,"props":153833,"children":153835},{"id":153834},"step-3-fetch-sections-classes-where-supported",[153836],{"type":23,"value":153837},"Step 3: Fetch Sections (Classes) Where Supported",{"type":17,"tag":29,"props":153839,"children":153840},{},[153841],{"type":23,"value":153842},"Some LMS providers model courses through sections or sessions.",{"type":17,"tag":6893,"props":153844,"children":153847},{"className":153845,"code":153846,"language":18718,"meta":7},[18716],"async function fetchCourseClasses(connectionId: string, courseId: string) {\n  return await sdk.lms.listLmsClasses({\n    connectionId,\n    course_id: courseId,\n    fields: 'id,name,course_id,languages',\n  });\n}\n",[153848],{"type":17,"tag":6121,"props":153849,"children":153850},{"__ignoreMap":7},[153851],{"type":23,"value":153846},{"type":17,"tag":29,"props":153853,"children":153854},{},[153855],{"type":23,"value":21128},{"type":17,"tag":80,"props":153857,"children":153858},{},[153859,153870,153875],{"type":17,"tag":84,"props":153860,"children":153861},{},[153862,153868],{"type":17,"tag":6121,"props":153863,"children":153865},{"className":153864},[],[153866],{"type":23,"value":153867},"class.course_id",{"type":23,"value":153869}," is required and is the canonical join to Course.",{"type":17,"tag":84,"props":153871,"children":153872},{},[153873],{"type":23,"value":153874},"Not all providers expose Classes.",{"type":17,"tag":84,"props":153876,"children":153877},{},[153878],{"type":23,"value":153879},"If Classes are absent, treat Course as the primary container.",{"type":17,"tag":68,"props":153881,"children":153883},{"id":153882},"step-4-fetch-module-hierarchy-collections",[153884],{"type":23,"value":153885},"Step 4: Fetch Module Hierarchy (Collections)",{"type":17,"tag":29,"props":153887,"children":153888},{},[153889],{"type":23,"value":153890},"Collections represent module groupings when supported.",{"type":17,"tag":6893,"props":153892,"children":153895},{"className":153893,"code":153894,"language":18718,"meta":7},[18716],"async function fetchCourseCollections(connectionId: string, courseId: string) {\n  return await sdk.lms.listLmsCollections({\n    connectionId,\n    course_id: courseId,\n    fields: 'id,name,parent_id,is_active',\n  });\n}\n",[153896],{"type":17,"tag":6121,"props":153897,"children":153898},{"__ignoreMap":7},[153899],{"type":23,"value":153894},{"type":17,"tag":29,"props":153901,"children":153902},{},[153903,153905,153910],{"type":23,"value":153904},"Reconstruct the hierarchy using ",{"type":17,"tag":6121,"props":153906,"children":153908},{"className":153907},[],[153909],{"type":23,"value":15863},{"type":23,"value":20456},{"type":17,"tag":6893,"props":153912,"children":153915},{"className":153913,"code":153914,"language":18718,"meta":7},[18716],"function buildCollectionTree(collections) {\n  const map = new Map();\n  const roots = [];\n\n  collections.forEach(c => map.set(c.id, { ...c, children: [] }));\n\n  collections.forEach(c => {\n    if (c.parent_id && map.has(c.parent_id)) {\n      map.get(c.parent_id).children.push(map.get(c.id));\n    } else {\n      roots.push(map.get(c.id));\n    }\n  });\n\n  return roots;\n}\n",[153916],{"type":17,"tag":6121,"props":153917,"children":153918},{"__ignoreMap":7},[153919],{"type":23,"value":153914},{"type":17,"tag":239,"props":153921,"children":153923},{"id":153922},"if-collections-are-not-supported",[153924],{"type":23,"value":153925},"If Collections Are Not Supported",{"type":17,"tag":29,"props":153927,"children":153928},{},[153929],{"type":23,"value":153930},"Some LMS integrations do not expose module hierarchies.",{"type":17,"tag":29,"props":153932,"children":153933},{},[153934],{"type":23,"value":153935},"In that case:",{"type":17,"tag":80,"props":153937,"children":153938},{},[153939,153944],{"type":17,"tag":84,"props":153940,"children":153941},{},[153942],{"type":23,"value":153943},"Skip the Collection layer",{"type":17,"tag":84,"props":153945,"children":153946},{},[153947],{"type":23,"value":153948},"Group Content directly under the Course",{"type":17,"tag":29,"props":153950,"children":153951},{},[153952],{"type":23,"value":153953},"Unified preserves provider capabilities rather than simulating missing structure.",{"type":17,"tag":68,"props":153955,"children":153957},{"id":153956},"step-5-fetch-course-content",[153958],{"type":23,"value":153959},"Step 5: Fetch Course Content",{"type":17,"tag":29,"props":153961,"children":153962},{},[153963],{"type":23,"value":153964},"Content represents the actual learning items.",{"type":17,"tag":6893,"props":153966,"children":153969},{"className":153967,"code":153968,"language":18718,"meta":7},[18716],"async function fetchCourseContent(connectionId: string, courseId: string) {\n  return await sdk.lms.listLmsContents({\n    connectionId,\n    course_id: courseId,\n    sort: 'sort_order',\n    order: 'asc',\n    fields: 'id,name,duration_minutes,collection_ids,sort_order,is_active',\n  });\n}\n",[153970],{"type":17,"tag":6121,"props":153971,"children":153972},{"__ignoreMap":7},[153973],{"type":23,"value":153968},{"type":17,"tag":29,"props":153975,"children":153976},{},[153977],{"type":23,"value":152872},{"type":17,"tag":80,"props":153979,"children":153980},{},[153981,153989,153998,154007,154015,154023],{"type":17,"tag":84,"props":153982,"children":153983},{},[153984],{"type":17,"tag":6121,"props":153985,"children":153987},{"className":153986},[],[153988],{"type":23,"value":152743},{"type":17,"tag":84,"props":153990,"children":153991},{},[153992],{"type":17,"tag":6121,"props":153993,"children":153995},{"className":153994},[],[153996],{"type":23,"value":153997},"collection_id",{"type":17,"tag":84,"props":153999,"children":154000},{},[154001,154006],{"type":17,"tag":6121,"props":154002,"children":154004},{"className":154003},[],[154005],{"type":23,"value":26291},{"type":23,"value":153728},{"type":17,"tag":84,"props":154008,"children":154009},{},[154010],{"type":17,"tag":6121,"props":154011,"children":154013},{"className":154012},[],[154014],{"type":23,"value":48368},{"type":17,"tag":84,"props":154016,"children":154017},{},[154018],{"type":17,"tag":6121,"props":154019,"children":154021},{"className":154020},[],[154022],{"type":23,"value":39759},{"type":17,"tag":84,"props":154024,"children":154025},{},[154026],{"type":17,"tag":6121,"props":154027,"children":154029},{"className":154028},[],[154030],{"type":23,"value":62389},{"type":17,"tag":29,"props":154032,"children":154033},{},[154034,154036,154041],{"type":23,"value":154035},"Where ",{"type":17,"tag":6121,"props":154037,"children":154039},{"className":154038},[],[154040],{"type":23,"value":151835},{"type":23,"value":154042}," are populated, attach content to modules.",{"type":17,"tag":29,"props":154044,"children":154045},{},[154046,154047,154052],{"type":23,"value":132873},{"type":17,"tag":6121,"props":154048,"children":154050},{"className":154049},[],[154051],{"type":23,"value":151835},{"type":23,"value":154053}," are absent:",{"type":17,"tag":80,"props":154055,"children":154056},{},[154057],{"type":17,"tag":84,"props":154058,"children":154059},{},[154060],{"type":23,"value":154061},"Treat content as flat under the course.",{"type":17,"tag":29,"props":154063,"children":154064},{},[154065,154066,154071,154072,154077],{"type":23,"value":152022},{"type":17,"tag":6121,"props":154067,"children":154069},{"className":154068},[],[154070],{"type":23,"value":151853},{"type":23,"value":11826},{"type":17,"tag":6121,"props":154073,"children":154075},{"className":154074},[],[154076],{"type":23,"value":151835},{"type":23,"value":154078},", or deep module metadata. Always build structure dynamically.",{"type":17,"tag":68,"props":154080,"children":154082},{"id":154081},"step-6-retrieve-individual-content-items",[154083],{"type":23,"value":154084},"Step 6: Retrieve Individual Content Items",{"type":17,"tag":29,"props":154086,"children":154087},{},[154088],{"type":23,"value":154089},"For a detailed lesson view:",{"type":17,"tag":6893,"props":154091,"children":154094},{"className":154092,"code":154093,"language":18718,"meta":7},[18716],"async function fetchContent(connectionId: string, id: string) {\n  return await sdk.lms.getLmsContent({\n    connectionId,\n    id,\n    fields: 'id,name,description,media,languages,duration_minutes,localizations',\n  });\n}\n",[154095],{"type":17,"tag":6121,"props":154096,"children":154097},{"__ignoreMap":7},[154098],{"type":23,"value":154093},{"type":17,"tag":29,"props":154100,"children":154101},{},[154102],{"type":23,"value":79138},{"type":17,"tag":80,"props":154104,"children":154105},{},[154106,154111,154116],{"type":17,"tag":84,"props":154107,"children":154108},{},[154109],{"type":23,"value":154110},"Full lesson rendering",{"type":17,"tag":84,"props":154112,"children":154113},{},[154114],{"type":23,"value":154115},"Multilingual display",{"type":17,"tag":84,"props":154117,"children":154118},{},[154119],{"type":23,"value":154120},"Media asset loading",{"type":17,"tag":68,"props":154122,"children":154124},{"id":154123},"step-7-keep-structure-in-sync",[154125],{"type":23,"value":154126},"Step 7: Keep Structure in Sync",{"type":17,"tag":29,"props":154128,"children":154129},{},[154130],{"type":23,"value":154131},"LMS integrations do not provide webhook notifications for structural changes (courses, classes, collections, content).",{"type":17,"tag":29,"props":154133,"children":154134},{},[154135],{"type":23,"value":154136},"Structure sync must be polling-based.",{"type":17,"tag":29,"props":154138,"children":154139},{},[154140,154141,154146],{"type":23,"value":154035},{"type":17,"tag":6121,"props":154142,"children":154144},{"className":154143},[],[154145],{"type":23,"value":26291},{"type":23,"value":154147}," is supported:",{"type":17,"tag":6893,"props":154149,"children":154151},{"className":154150,"code":152127,"language":18718,"meta":7},[18716],[154152],{"type":17,"tag":6121,"props":154153,"children":154154},{"__ignoreMap":7},[154155],{"type":23,"value":152127},{"type":17,"tag":29,"props":154157,"children":154158},{},[154159],{"type":23,"value":154160},"Where it is not supported:",{"type":17,"tag":80,"props":154162,"children":154163},{},[154164,154169,154178,154189],{"type":17,"tag":84,"props":154165,"children":154166},{},[154167],{"type":23,"value":154168},"Perform periodic full scans",{"type":17,"tag":84,"props":154170,"children":154171},{},[154172,154173],{"type":23,"value":152159},{"type":17,"tag":6121,"props":154174,"children":154176},{"className":154175},[],[154177],{"type":23,"value":18766},{"type":17,"tag":84,"props":154179,"children":154180},{},[154181,154182,154187],{"type":23,"value":153256},{"type":17,"tag":6121,"props":154183,"children":154185},{"className":154184},[],[154186],{"type":23,"value":25337},{"type":23,"value":154188}," values",{"type":17,"tag":84,"props":154190,"children":154191},{},[154192],{"type":23,"value":154193},"Deduplicate changes",{"type":17,"tag":29,"props":154195,"children":154196},{},[154197],{"type":23,"value":154198},"Repeat the same approach for:",{"type":17,"tag":80,"props":154200,"children":154201},{},[154202,154207,154211],{"type":17,"tag":84,"props":154203,"children":154204},{},[154205],{"type":23,"value":154206},"Classes",{"type":17,"tag":84,"props":154208,"children":154209},{},[154210],{"type":23,"value":38941},{"type":17,"tag":84,"props":154212,"children":154213},{},[154214],{"type":23,"value":55314},{"type":17,"tag":68,"props":154216,"children":154217},{"id":144224},[154218],{"type":23,"value":144227},{"type":17,"tag":29,"props":154220,"children":154221},{},[154222],{"type":23,"value":154223},"Not all LMS providers expose:",{"type":17,"tag":80,"props":154225,"children":154226},{},[154227,154231,154235,154240,154248,154256],{"type":17,"tag":84,"props":154228,"children":154229},{},[154230],{"type":23,"value":154206},{"type":17,"tag":84,"props":154232,"children":154233},{},[154234],{"type":23,"value":38941},{"type":17,"tag":84,"props":154236,"children":154237},{},[154238],{"type":23,"value":154239},"Deep module hierarchies",{"type":17,"tag":84,"props":154241,"children":154242},{},[154243],{"type":17,"tag":6121,"props":154244,"children":154246},{"className":154245},[],[154247],{"type":23,"value":151853},{"type":17,"tag":84,"props":154249,"children":154250},{},[154251],{"type":17,"tag":6121,"props":154252,"children":154254},{"className":154253},[],[154255],{"type":23,"value":151870},{"type":17,"tag":84,"props":154257,"children":154258},{},[154259,154264],{"type":17,"tag":6121,"props":154260,"children":154262},{"className":154261},[],[154263],{"type":23,"value":26291},{"type":23,"value":154265}," support for incremental sync",{"type":17,"tag":29,"props":154267,"children":154268},{},[154269],{"type":23,"value":154270},"Best practice:",{"type":17,"tag":80,"props":154272,"children":154273},{},[154274,154279,154284,154289],{"type":17,"tag":84,"props":154275,"children":154276},{},[154277],{"type":23,"value":154278},"Check object availability dynamically",{"type":17,"tag":84,"props":154280,"children":154281},{},[154282],{"type":23,"value":154283},"Do not assume hierarchy depth",{"type":17,"tag":84,"props":154285,"children":154286},{},[154287],{"type":23,"value":154288},"Fallback to flat course + content rendering",{"type":17,"tag":84,"props":154290,"children":154291},{},[154292],{"type":23,"value":154293},"Treat parameter support as provider-dependent",{"type":17,"tag":29,"props":154295,"children":154296},{},[154297],{"type":23,"value":154298},"Unified provides a consistent parameter model, while transparently reflecting provider-level support.",{"type":17,"tag":68,"props":154300,"children":154302},{"id":154301},"optional-enrich-with-progress-data",[154303],{"type":23,"value":154304},"Optional: Enrich with Progress Data",{"type":17,"tag":29,"props":154306,"children":154307},{},[154308],{"type":23,"value":154309},"To attach learner progress to course views:",{"type":17,"tag":6893,"props":154311,"children":154314},{"className":154312,"code":154313,"language":18718,"meta":7},[18716],"await sdk.lms.listLmsActivities({\n  connectionId,\n  course_id: courseId,\n  student_id: studentId,\n});\n",[154315],{"type":17,"tag":6121,"props":154316,"children":154317},{"__ignoreMap":7},[154318],{"type":23,"value":154313},{"type":17,"tag":29,"props":154320,"children":154321},{},[154322],{"type":23,"value":154323},"Activity enriches structure but is not part of the structure itself.",{"type":17,"tag":68,"props":154325,"children":154326},{"id":132938},[154327],{"type":23,"value":132941},{"type":17,"tag":29,"props":154329,"children":154330},{},[154331],{"type":23,"value":154332},"Accessing LMS course structure is not about assuming parity across platforms. It's about building provider-aware integrations on top of a normalized API surface.",{"type":17,"tag":29,"props":154334,"children":154335},{},[154336],{"type":23,"value":152508},{"type":17,"tag":80,"props":154338,"children":154339},{},[154340,154345,154380,154385],{"type":17,"tag":84,"props":154341,"children":154342},{},[154343],{"type":23,"value":154344},"A consistent Course, Class, Collection, and Content model",{"type":17,"tag":84,"props":154346,"children":154347},{},[154348,154350,154355,154356,154361,154362,154367,154368,154373,154374,154379],{"type":23,"value":154349},"A stable parameter surface (",{"type":17,"tag":6121,"props":154351,"children":154353},{"className":154352},[],[154354],{"type":23,"value":48389},{"type":23,"value":11826},{"type":17,"tag":6121,"props":154357,"children":154359},{"className":154358},[],[154360],{"type":23,"value":48411},{"type":23,"value":11826},{"type":17,"tag":6121,"props":154363,"children":154365},{"className":154364},[],[154366],{"type":23,"value":26291},{"type":23,"value":11826},{"type":17,"tag":6121,"props":154369,"children":154371},{"className":154370},[],[154372],{"type":23,"value":39759},{"type":23,"value":11826},{"type":17,"tag":6121,"props":154375,"children":154377},{"className":154376},[],[154378],{"type":23,"value":62389},{"type":23,"value":12034},{"type":17,"tag":84,"props":154381,"children":154382},{},[154383],{"type":23,"value":154384},"Polling-based structure synchronization",{"type":17,"tag":84,"props":154386,"children":154387},{},[154388],{"type":23,"value":154389},"Transparent provider-level support",{"type":17,"tag":29,"props":154391,"children":154392},{},[154393],{"type":23,"value":154394},"With careful joins and explicit fallbacks, you can build a portable course browser across heterogeneous LMS ecosystems — without hardcoding vendor-specific logic or inventing missing structure.",{"type":17,"tag":29,"props":154396,"children":154397},{},[154398],{"type":17,"tag":133,"props":154399,"children":154401},{"href":1612,"rel":154400},[214],[154402],{"type":23,"value":44481},{"type":17,"tag":29,"props":154404,"children":154405},{},[154406],{"type":17,"tag":133,"props":154407,"children":154409},{"href":1623,"rel":154408},[214],[154410],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":154412},[154413,154414,154417,154418,154419,154422,154423,154424,154425,154426,154427],{"id":153608,"depth":1629,"text":153611},{"id":153673,"depth":1629,"text":153676,"children":154415},[154416],{"id":18741,"depth":1635,"text":18744},{"id":153802,"depth":1629,"text":153805},{"id":153834,"depth":1629,"text":153837},{"id":153882,"depth":1629,"text":153885,"children":154420},[154421],{"id":153922,"depth":1635,"text":153925},{"id":153956,"depth":1629,"text":153959},{"id":154081,"depth":1629,"text":154084},{"id":154123,"depth":1629,"text":154126},{"id":144224,"depth":1629,"text":144227},{"id":154301,"depth":1629,"text":154304},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_access_courses_modules_and_content_from_lms_platforms_with_unified_lms_api.md","blog/how_to_access_courses_modules_and_content_from_lms_platforms_with_unified_lms_api.md","blog/how_to_access_courses_modules_and_content_from_lms_platforms_with_unified_lms_api",{"_path":154432,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":121089,"description":154433,"img":154434,"date":154435,"tag":12,"body":154436,"_type":1677,"_id":155048,"_source":1679,"_file":155049,"_stem":155050,"_extension":1682},"/blog/how_to_sync_enrollment_rosters_across_lms_platforms_with_unified_lms_api","Enrollment syncing breaks when products assume every LMS exposes the same roster model.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_sync_enrollment_rosters_across_lms_platforms_with_unified_lms_api-icon.png","2026-02-19T22:57:00.000Z",{"type":14,"children":154437,"toc":155036},[154438,154443,154446,154453,154457,154462,154467,154485,154490,154496,154501,154524,154528,154546,154551,154557,154569,154574,154610,154622,154652,154658,154663,154672,154683,154689,154698,154703,154712,154717,154723,154728,154771,154776,154801,154807,154812,154823,154832,154837,154869,154875,154884,154888,154906,154912,154921,154925,154938,154942,154975,154980,154984,154989,154993,155015,155020,155028],{"type":17,"tag":18,"props":154439,"children":154441},{"id":154440},"how-to-sync-enrollment-rosters-across-lms-platforms-with-unifieds-lms-api",[154442],{"type":23,"value":121089},{"type":17,"tag":25,"props":154444,"children":154445},{},[],{"type":17,"tag":29,"props":154447,"children":154448},{},[154449],{"type":17,"tag":33,"props":154450,"children":154451},{},[154452],{"type":23,"value":147916},{"type":17,"tag":29,"props":154454,"children":154455},{},[154456],{"type":23,"value":154433},{"type":17,"tag":29,"props":154458,"children":154459},{},[154460],{"type":23,"value":154461},"Some platforms provide course-level membership lists. Others expose section-level rosters. Some do not expose enrollment lists at all. Few support webhook notifications for roster changes. And despite generic update payloads, most providers do not allow writing enrollment state through unified APIs.",{"type":17,"tag":29,"props":154463,"children":154464},{},[154465],{"type":23,"value":154466},"When teams build enrollment sync logic on top of assumptions instead of documented capabilities, the result is fragile integrations, incomplete rosters, and inconsistent reporting.",{"type":17,"tag":29,"props":154468,"children":154469},{},[154470,154471,154475,154477,154483],{"type":23,"value":25244},{"type":17,"tag":133,"props":154472,"children":154473},{"href":54426},[154474],{"type":23,"value":54429},{"type":23,"value":154476}," takes a more explicit approach. It does not invent an Enrollment object. It does not simulate real-time events where none exist. Instead, it exposes enrollment as it exists in the underlying LMS — primarily through ",{"type":17,"tag":6121,"props":154478,"children":154480},{"className":154479},[],[154481],{"type":23,"value":154482},"student_ids",{"type":23,"value":154484}," arrays on Course objects (and, where supported, Class objects). Syncing enrollment becomes a disciplined polling and reconciliation process, not a black-box event stream.",{"type":17,"tag":29,"props":154486,"children":154487},{},[154488],{"type":23,"value":154489},"This guide shows how to mirror enrollment rosters across LMS platforms using Unified's LMS API — accurately, incrementally, and with full awareness of provider variability.",{"type":17,"tag":68,"props":154491,"children":154493},{"id":154492},"what-sync-enrollments-means-here",[154494],{"type":23,"value":154495},"What 'Sync Enrollments' Means Here",{"type":17,"tag":29,"props":154497,"children":154498},{},[154499],{"type":23,"value":154500},"In this context, syncing enrollments means:",{"type":17,"tag":80,"props":154502,"children":154503},{},[154504,154509,154514,154519],{"type":17,"tag":84,"props":154505,"children":154506},{},[154507],{"type":23,"value":154508},"Reading roster data from LMS platforms",{"type":17,"tag":84,"props":154510,"children":154511},{},[154512],{"type":23,"value":154513},"Building a canonical enrollment graph in your system",{"type":17,"tag":84,"props":154515,"children":154516},{},[154517],{"type":23,"value":154518},"Updating your system when enrollment changes occur",{"type":17,"tag":84,"props":154520,"children":154521},{},[154522],{"type":23,"value":154523},"Enriching rosters with course, content, and progress data",{"type":17,"tag":29,"props":154525,"children":154526},{},[154527],{"type":23,"value":151642},{"type":17,"tag":80,"props":154529,"children":154530},{},[154531,154536,154541],{"type":17,"tag":84,"props":154532,"children":154533},{},[154534],{"type":23,"value":154535},"Writing enrollments back into LMS platforms",{"type":17,"tag":84,"props":154537,"children":154538},{},[154539],{"type":23,"value":154540},"Bi-directional enrollment propagation",{"type":17,"tag":84,"props":154542,"children":154543},{},[154544],{"type":23,"value":154545},"Real-time webhook-based event syncing",{"type":17,"tag":29,"props":154547,"children":154548},{},[154549],{"type":23,"value":154550},"Unified supports read-based roster mirroring. Write support for enrollment state is not broadly available across LMS providers.",{"type":17,"tag":68,"props":154552,"children":154554},{"id":154553},"the-canonical-enrollment-model-in-unified",[154555],{"type":23,"value":154556},"The Canonical Enrollment Model in Unified",{"type":17,"tag":29,"props":154558,"children":154559},{},[154560,154562,154568],{"type":23,"value":154561},"Unified does not expose a standalone ",{"type":17,"tag":6121,"props":154563,"children":154565},{"className":154564},[],[154566],{"type":23,"value":154567},"Enrollment",{"type":23,"value":74653},{"type":17,"tag":29,"props":154570,"children":154571},{},[154572],{"type":23,"value":154573},"Enrollment is represented through relationships:",{"type":17,"tag":80,"props":154575,"children":154576},{},[154577,154588,154599],{"type":17,"tag":84,"props":154578,"children":154579},{},[154580,154586],{"type":17,"tag":6121,"props":154581,"children":154583},{"className":154582},[],[154584],{"type":23,"value":154585},"Course.student_ids",{"type":23,"value":154587}," → array of enrolled student IDs (where supported)",{"type":17,"tag":84,"props":154589,"children":154590},{},[154591,154597],{"type":17,"tag":6121,"props":154592,"children":154594},{"className":154593},[],[154595],{"type":23,"value":154596},"Class.course_id",{"type":23,"value":154598}," → required link to parent Course",{"type":17,"tag":84,"props":154600,"children":154601},{},[154602,154608],{"type":17,"tag":6121,"props":154603,"children":154605},{"className":154604},[],[154606],{"type":23,"value":154607},"Class.student_ids",{"type":23,"value":154609}," → optional and rarely populated across providers",{"type":17,"tag":29,"props":154611,"children":154612},{},[154613,154615,154620],{"type":23,"value":154614},"The Student object does not list course memberships. Enrollment must be derived by querying Courses or Classes and inspecting their ",{"type":17,"tag":6121,"props":154616,"children":154618},{"className":154617},[],[154619],{"type":23,"value":154482},{"type":23,"value":154621}," arrays.",{"type":17,"tag":29,"props":154623,"children":154624},{},[154625,154627,154632,154633,154638,154639,154644,154645,154650],{"type":23,"value":154626},"Activity objects track progress (e.g., ",{"type":17,"tag":6121,"props":154628,"children":154630},{"className":154629},[],[154631],{"type":23,"value":152770},{"type":23,"value":11826},{"type":17,"tag":6121,"props":154634,"children":154636},{"className":154635},[],[154637],{"type":23,"value":152779},{"type":23,"value":11826},{"type":17,"tag":6121,"props":154640,"children":154642},{"className":154641},[],[154643],{"type":23,"value":152796},{"type":23,"value":11826},{"type":17,"tag":6121,"props":154646,"children":154648},{"className":154647},[],[154649],{"type":23,"value":124824},{"type":23,"value":154651},"), but they are not the source of truth for membership.",{"type":17,"tag":68,"props":154653,"children":154655},{"id":154654},"step-1-fetch-courses",[154656],{"type":23,"value":154657},"Step 1: Fetch Courses",{"type":17,"tag":29,"props":154659,"children":154660},{},[154661],{"type":23,"value":154662},"Where supported, Courses are the primary roster source.",{"type":17,"tag":6893,"props":154664,"children":154667},{"className":154665,"code":154666,"language":18718,"meta":7},[18716],"async function fetchCourses(connectionId: string) {\n  const results = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.lms.listLmsCourses({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: 'id,name,is_active,student_ids,updated_at',\n    });\n\n    if (!page || page.length === 0) break;\n\n    results.push(...page);\n    offset += limit;\n  }\n\n  return results;\n}\n",[154668],{"type":17,"tag":6121,"props":154669,"children":154670},{"__ignoreMap":7},[154671],{"type":23,"value":154666},{"type":17,"tag":29,"props":154673,"children":154674},{},[154675,154676,154681],{"type":23,"value":132873},{"type":17,"tag":6121,"props":154677,"children":154679},{"className":154678},[],[154680],{"type":23,"value":154482},{"type":23,"value":154682}," is empty or unsupported for a provider, roster data may not be available.",{"type":17,"tag":68,"props":154684,"children":154686},{"id":154685},"step-2-build-the-enrollment-graph",[154687],{"type":23,"value":154688},"Step 2: Build the Enrollment Graph",{"type":17,"tag":6893,"props":154690,"children":154693},{"className":154691,"code":154692,"language":18718,"meta":7},[18716],"function buildEnrollmentGraph(courses: any[]) {\n  const graph: Record\u003Cstring, string[]> = {};\n\n  for (const course of courses) {\n    graph[course.id] = course.student_ids ?? [];\n  }\n\n  return graph;\n}\n",[154694],{"type":17,"tag":6121,"props":154695,"children":154696},{"__ignoreMap":7},[154697],{"type":23,"value":154692},{"type":17,"tag":29,"props":154699,"children":154700},{},[154701],{"type":23,"value":154702},"This creates:",{"type":17,"tag":6893,"props":154704,"children":154707},{"className":154705,"code":154706,"language":20901,"meta":23},[20899],"Course ID → [Student IDs]\n",[154708],{"type":17,"tag":6121,"props":154709,"children":154710},{"__ignoreMap":7},[154711],{"type":23,"value":154706},{"type":17,"tag":29,"props":154713,"children":154714},{},[154715],{"type":23,"value":154716},"Where roster data is unavailable, the graph will be empty for that provider.",{"type":17,"tag":68,"props":154718,"children":154720},{"id":154719},"step-3-handle-provider-variability",[154721],{"type":23,"value":154722},"Step 3: Handle Provider Variability",{"type":17,"tag":29,"props":154724,"children":154725},{},[154726],{"type":23,"value":154727},"Current patterns across providers:",{"type":17,"tag":80,"props":154729,"children":154730},{},[154731,154744,154755,154760],{"type":17,"tag":84,"props":154732,"children":154733},{},[154734,154736,154742],{"type":23,"value":154735},"Google Classroom → ",{"type":17,"tag":6121,"props":154737,"children":154739},{"className":154738},[],[154740],{"type":23,"value":154741},"course.student_ids",{"type":23,"value":154743}," populated",{"type":17,"tag":84,"props":154745,"children":154746},{},[154747,154749,154754],{"type":23,"value":154748},"LearnUpon → ",{"type":17,"tag":6121,"props":154750,"children":154752},{"className":154751},[],[154753],{"type":23,"value":154741},{"type":23,"value":154743},{"type":17,"tag":84,"props":154756,"children":154757},{},[154758],{"type":23,"value":154759},"Many others → roster fields empty or unavailable",{"type":17,"tag":84,"props":154761,"children":154762},{},[154763,154769],{"type":17,"tag":6121,"props":154764,"children":154766},{"className":154765},[],[154767],{"type":23,"value":154768},"class.student_ids",{"type":23,"value":154770}," → rarely populated across providers",{"type":17,"tag":29,"props":154772,"children":154773},{},[154774],{"type":23,"value":154775},"Your sync logic should:",{"type":17,"tag":80,"props":154777,"children":154778},{},[154779,154791,154796],{"type":17,"tag":84,"props":154780,"children":154781},{},[154782,154784,154789],{"type":23,"value":154783},"Check for ",{"type":17,"tag":6121,"props":154785,"children":154787},{"className":154786},[],[154788],{"type":23,"value":154482},{"type":23,"value":154790}," presence",{"type":17,"tag":84,"props":154792,"children":154793},{},[154794],{"type":23,"value":154795},"Treat missing arrays as 'roster not exposed'",{"type":17,"tag":84,"props":154797,"children":154798},{},[154799],{"type":23,"value":154800},"Avoid assuming section-level rosters exist",{"type":17,"tag":68,"props":154802,"children":154804},{"id":154803},"step-4-detect-enrollment-changes",[154805],{"type":23,"value":154806},"Step 4: Detect Enrollment Changes",{"type":17,"tag":29,"props":154808,"children":154809},{},[154810],{"type":23,"value":154811},"Because LMS integrations do not provide webhook notifications for roster changes, polling is required.",{"type":17,"tag":29,"props":154813,"children":154814},{},[154815,154816,154821],{"type":23,"value":154035},{"type":17,"tag":6121,"props":154817,"children":154819},{"className":154818},[],[154820],{"type":23,"value":26291},{"type":23,"value":154822}," is supported by the provider:",{"type":17,"tag":6893,"props":154824,"children":154827},{"className":154825,"code":154826,"language":18718,"meta":7},[18716],"await sdk.lms.listLmsCourses({\n  connectionId,\n  updated_gte: lastSync,\n  sort: 'updated_at',\n  order: 'asc',\n  fields: 'id,student_ids,updated_at',\n});\n",[154828],{"type":17,"tag":6121,"props":154829,"children":154830},{"__ignoreMap":7},[154831],{"type":23,"value":154826},{"type":17,"tag":29,"props":154833,"children":154834},{},[154835],{"type":23,"value":154836},"Where incremental filtering is not supported:",{"type":17,"tag":80,"props":154838,"children":154839},{},[154840,154844,154853,154864],{"type":17,"tag":84,"props":154841,"children":154842},{},[154843],{"type":23,"value":154168},{"type":17,"tag":84,"props":154845,"children":154846},{},[154847,154848],{"type":23,"value":152159},{"type":17,"tag":6121,"props":154849,"children":154851},{"className":154850},[],[154852],{"type":23,"value":18766},{"type":17,"tag":84,"props":154854,"children":154855},{},[154856,154857,154862],{"type":23,"value":153256},{"type":17,"tag":6121,"props":154858,"children":154860},{"className":154859},[],[154861],{"type":23,"value":154482},{"type":23,"value":154863}," arrays",{"type":17,"tag":84,"props":154865,"children":154866},{},[154867],{"type":23,"value":154868},"Deduplicate changes client-side",{"type":17,"tag":68,"props":154870,"children":154872},{"id":154871},"step-5-optional-enrich-with-content",[154873],{"type":23,"value":154874},"Step 5: Optional — Enrich with Content",{"type":17,"tag":6893,"props":154876,"children":154879},{"className":154877,"code":154878,"language":18718,"meta":7},[18716],"await sdk.lms.listLmsContents({\n  connectionId,\n  course_id: courseId,\n  fields: 'id,name,duration_minutes,is_active',\n});\n",[154880],{"type":17,"tag":6121,"props":154881,"children":154882},{"__ignoreMap":7},[154883],{"type":23,"value":154878},{"type":17,"tag":29,"props":154885,"children":154886},{},[154887],{"type":23,"value":79138},{"type":17,"tag":80,"props":154889,"children":154890},{},[154891,154896,154901],{"type":17,"tag":84,"props":154892,"children":154893},{},[154894],{"type":23,"value":154895},"Enrollment dashboards",{"type":17,"tag":84,"props":154897,"children":154898},{},[154899],{"type":23,"value":154900},"Course structure display",{"type":17,"tag":84,"props":154902,"children":154903},{},[154904],{"type":23,"value":154905},"Completion tracking alignment",{"type":17,"tag":68,"props":154907,"children":154909},{"id":154908},"step-6-optional-attach-progress-data",[154910],{"type":23,"value":154911},"Step 6: Optional — Attach Progress Data",{"type":17,"tag":6893,"props":154913,"children":154916},{"className":154914,"code":154915,"language":18718,"meta":7},[18716],"await sdk.lms.listLmsActivities({\n  connectionId,\n  course_id: courseId,\n  student_id: studentId,\n  fields: 'id,is_completed,progress_percentage,completed_at',\n});\n",[154917],{"type":17,"tag":6121,"props":154918,"children":154919},{"__ignoreMap":7},[154920],{"type":23,"value":154915},{"type":17,"tag":29,"props":154922,"children":154923},{},[154924],{"type":23,"value":19907},{"type":17,"tag":80,"props":154926,"children":154927},{},[154928,154933],{"type":17,"tag":84,"props":154929,"children":154930},{},[154931],{"type":23,"value":154932},"Activity existence does not imply enrollment.",{"type":17,"tag":84,"props":154934,"children":154935},{},[154936],{"type":23,"value":154937},"Progress tracking is separate from roster state.",{"type":17,"tag":68,"props":154939,"children":154940},{"id":152397},[154941],{"type":23,"value":152400},{"type":17,"tag":6154,"props":154943,"children":154944},{},[154945,154950,154955,154960,154970],{"type":17,"tag":84,"props":154946,"children":154947},{},[154948],{"type":23,"value":154949},"Perform initial full sync",{"type":17,"tag":84,"props":154951,"children":154952},{},[154953],{"type":23,"value":154954},"Persist roster snapshot",{"type":17,"tag":84,"props":154956,"children":154957},{},[154958],{"type":23,"value":154959},"Poll periodically",{"type":17,"tag":84,"props":154961,"children":154962},{},[154963,154965],{"type":23,"value":154964},"Reconcile ",{"type":17,"tag":6121,"props":154966,"children":154968},{"className":154967},[],[154969],{"type":23,"value":154482},{"type":17,"tag":84,"props":154971,"children":154972},{},[154973],{"type":23,"value":154974},"Deduplicate and handle ordering client-side",{"type":17,"tag":29,"props":154976,"children":154977},{},[154978],{"type":23,"value":154979},"This provides consistent, provider-aware roster mirroring without relying on unsupported event streams.",{"type":17,"tag":68,"props":154981,"children":154982},{"id":132938},[154983],{"type":23,"value":132941},{"type":17,"tag":29,"props":154985,"children":154986},{},[154987],{"type":23,"value":154988},"Enrollment syncing is not about pushing data between platforms. It is about maintaining a reliable mirror of roster state across LMS systems — within the boundaries each provider exposes.",{"type":17,"tag":29,"props":154990,"children":154991},{},[154992],{"type":23,"value":152508},{"type":17,"tag":80,"props":154994,"children":154995},{},[154996,155001,155005,155010],{"type":17,"tag":84,"props":154997,"children":154998},{},[154999],{"type":23,"value":155000},"A normalized roster model",{"type":17,"tag":84,"props":155002,"children":155003},{},[155004],{"type":23,"value":152521},{"type":17,"tag":84,"props":155006,"children":155007},{},[155008],{"type":23,"value":155009},"Polling-based synchronization",{"type":17,"tag":84,"props":155011,"children":155012},{},[155013],{"type":23,"value":155014},"Transparent provider-level variability",{"type":17,"tag":29,"props":155016,"children":155017},{},[155018],{"type":23,"value":155019},"When sync logic is built on documented capabilities instead of assumptions, enrollment management becomes predictable — even across heterogeneous LMS ecosystems.",{"type":17,"tag":29,"props":155021,"children":155022},{},[155023],{"type":17,"tag":133,"props":155024,"children":155026},{"href":1612,"rel":155025},[214],[155027],{"type":23,"value":44481},{"type":17,"tag":29,"props":155029,"children":155030},{},[155031],{"type":17,"tag":133,"props":155032,"children":155034},{"href":1623,"rel":155033},[214],[155035],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":155037},[155038,155039,155040,155041,155042,155043,155044,155045,155046,155047],{"id":154492,"depth":1629,"text":154495},{"id":154553,"depth":1629,"text":154556},{"id":154654,"depth":1629,"text":154657},{"id":154685,"depth":1629,"text":154688},{"id":154719,"depth":1629,"text":154722},{"id":154803,"depth":1629,"text":154806},{"id":154871,"depth":1629,"text":154874},{"id":154908,"depth":1629,"text":154911},{"id":152397,"depth":1629,"text":152400},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_sync_enrollment_rosters_across_lms_platforms_with_unified_lms_api.md","blog/how_to_sync_enrollment_rosters_across_lms_platforms_with_unified_lms_api.md","blog/how_to_sync_enrollment_rosters_across_lms_platforms_with_unified_lms_api",{"_path":155052,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":155053,"description":155054,"img":155055,"date":155056,"tag":12,"body":155057,"_type":1677,"_id":155918,"_source":1679,"_file":155919,"_stem":155920,"_extension":1682},"/blog/messaging_mcp_servers_overview_real_time_use_cases_and_agent_execution","Messaging MCP Servers: Overview, Real-Time Use Cases, and Agent Execution","If you're building AI features inside a SaaS product, your agent doesn't just need to read messages — it needs to respond, update, react, and coordinate across...","https://s3.us-east-2.amazonaws.com/unified-article-images/messaging_mcp_servers_overview_real_time_use_cases_and_agent_execution-icon.png","2026-02-19T19:58:00.000Z",{"type":14,"children":155058,"toc":155898},[155059,155064,155067,155074,155079,155084,155089,155094,155099,155104,155109,155119,155136,155140,155171,155177,155182,155186,155229,155233,155238,155243,155248,155253,155259,155264,155318,155323,155329,155334,155338,155343,155371,155376,155387,155392,155415,155420,155443,155448,155466,155471,155508,155513,155517,155522,155526,155548,155553,155558,155564,155569,155573,155579,155602,155606,155611,155617,155638,155642,155647,155651,155655,155659,155664,155682,155687,155716,155721,155727,155732,155760,155765,155792,155797,155803,155808,155836,155841,155846,155851,155856,155860,155882,155890],{"type":17,"tag":18,"props":155060,"children":155062},{"id":155061},"messaging-mcp-servers-overview-real-time-use-cases-and-agent-execution",[155063],{"type":23,"value":155053},{"type":17,"tag":25,"props":155065,"children":155066},{},[],{"type":17,"tag":29,"props":155068,"children":155069},{},[155070],{"type":17,"tag":33,"props":155071,"children":155072},{},[155073],{"type":23,"value":147916},{"type":17,"tag":29,"props":155075,"children":155076},{},[155077],{"type":23,"value":155078},"Messaging platforms are where work happens.",{"type":17,"tag":29,"props":155080,"children":155081},{},[155082],{"type":23,"value":155083},"Slack threads.",{"type":17,"tag":29,"props":155085,"children":155086},{},[155087],{"type":23,"value":155088},"Microsoft Teams channels.",{"type":17,"tag":29,"props":155090,"children":155091},{},[155092],{"type":23,"value":155093},"Gmail conversations.",{"type":17,"tag":29,"props":155095,"children":155096},{},[155097],{"type":23,"value":155098},"Intercom messages.",{"type":17,"tag":29,"props":155100,"children":155101},{},[155102],{"type":23,"value":155103},"Circle communities.",{"type":17,"tag":29,"props":155105,"children":155106},{},[155107],{"type":23,"value":155108},"If you're building AI features inside a SaaS product, your agent doesn't just need to read messages — it needs to respond, update, react, and coordinate across platforms.",{"type":17,"tag":29,"props":155110,"children":155111},{},[155112,155114,155118],{"type":23,"value":155113},"This is where Messaging + ",{"type":17,"tag":133,"props":155115,"children":155116},{"href":326},[155117],{"type":23,"value":329},{"type":23,"value":143931},{"type":17,"tag":29,"props":155120,"children":155121},{},[155122,155124,155128,155130,155134],{"type":23,"value":155123},"Unified's Messaging category provides a normalized ",{"type":17,"tag":133,"props":155125,"children":155126},{"href":14913},[155127],{"type":23,"value":27356},{"type":23,"value":155129}," across providers like Slack, Microsoft Teams, Gmail, Discord, Webex, RingCentral, Zoho Mail, IMAP, Circle.so, and more. ",{"type":17,"tag":133,"props":155131,"children":155132},{"href":326},[155133],{"type":23,"value":45418},{"type":23,"value":155135}," allows LLMs to call those messaging operations as structured tools.",{"type":17,"tag":29,"props":155137,"children":155138},{},[155139],{"type":23,"value":143947},{"type":17,"tag":80,"props":155141,"children":155142},{},[155143,155148,155152,155157,155162,155166],{"type":17,"tag":84,"props":155144,"children":155145},{},[155146],{"type":23,"value":155147},"What Messaging MCP is",{"type":17,"tag":84,"props":155149,"children":155150},{},[155151],{"type":23,"value":143960},{"type":17,"tag":84,"props":155153,"children":155154},{},[155155],{"type":23,"value":155156},"Provider write constraints",{"type":17,"tag":84,"props":155158,"children":155159},{},[155160],{"type":23,"value":155161},"Rate limits and execution behavior",{"type":17,"tag":84,"props":155163,"children":155164},{},[155165],{"type":23,"value":143979},{"type":17,"tag":84,"props":155167,"children":155168},{},[155169],{"type":23,"value":155170},"When to use the Messaging API vs MCP",{"type":17,"tag":68,"props":155172,"children":155174},{"id":155173},"what-messaging-mcp-is",[155175],{"type":23,"value":155176},"What Messaging MCP Is",{"type":17,"tag":29,"props":155178,"children":155179},{},[155180],{"type":23,"value":155181},"Messaging MCP is the structured tool-calling layer on top of the Unified Messaging API.",{"type":17,"tag":29,"props":155183,"children":155184},{},[155185],{"type":23,"value":144000},{"type":17,"tag":80,"props":155187,"children":155188},{},[155189,155194,155215,155220,155224],{"type":17,"tag":84,"props":155190,"children":155191},{},[155192],{"type":23,"value":155193},"Each category exposes its own unified API surface.",{"type":17,"tag":84,"props":155195,"children":155196},{},[155197,155199],{"type":23,"value":155198},"The Messaging category provides normalized objects such as:\n",{"type":17,"tag":80,"props":155200,"children":155201},{},[155202,155206,155210],{"type":17,"tag":84,"props":155203,"children":155204},{},[155205],{"type":23,"value":15800},{"type":17,"tag":84,"props":155207,"children":155208},{},[155209],{"type":23,"value":15787},{"type":17,"tag":84,"props":155211,"children":155212},{},[155213],{"type":23,"value":155214},"Event (e.g., reactions)",{"type":17,"tag":84,"props":155216,"children":155217},{},[155218],{"type":23,"value":155219},"The MCP server sits on top of the Messaging API.",{"type":17,"tag":84,"props":155221,"children":155222},{},[155223],{"type":23,"value":144042},{"type":17,"tag":84,"props":155225,"children":155226},{},[155227],{"type":23,"value":155228},"Each API request is routed directly to the connected source platform.",{"type":17,"tag":29,"props":155230,"children":155231},{},[155232],{"type":23,"value":144052},{"type":17,"tag":29,"props":155234,"children":155235},{},[155236],{"type":23,"value":155237},"User → LLM → Messaging tool call → Unified Messaging API → Source platform",{"type":17,"tag":29,"props":155239,"children":155240},{},[155241],{"type":23,"value":155242},"There is no message caching layer.",{"type":17,"tag":29,"props":155244,"children":155245},{},[155246],{"type":23,"value":155247},"There is no stored message database.",{"type":17,"tag":29,"props":155249,"children":155250},{},[155251],{"type":23,"value":155252},"Each tool call executes directly against the connected messaging system at call time.",{"type":17,"tag":68,"props":155254,"children":155256},{"id":155255},"supported-messaging-integrations",[155257],{"type":23,"value":155258},"Supported Messaging Integrations",{"type":17,"tag":29,"props":155260,"children":155261},{},[155262],{"type":23,"value":155263},"The Messaging category includes integrations such as:",{"type":17,"tag":80,"props":155265,"children":155266},{},[155267,155271,155276,155280,155285,155289,155293,155297,155301,155305,155309,155313],{"type":17,"tag":84,"props":155268,"children":155269},{},[155270],{"type":23,"value":3204},{"type":17,"tag":84,"props":155272,"children":155273},{},[155274],{"type":23,"value":155275},"Slack (bot)",{"type":17,"tag":84,"props":155277,"children":155278},{},[155279],{"type":23,"value":14066},{"type":17,"tag":84,"props":155281,"children":155282},{},[155283],{"type":23,"value":155284},"Microsoft Teams (bot)",{"type":17,"tag":84,"props":155286,"children":155287},{},[155288],{"type":23,"value":14878},{"type":17,"tag":84,"props":155290,"children":155291},{},[155292],{"type":23,"value":15763},{"type":17,"tag":84,"props":155294,"children":155295},{},[155296],{"type":23,"value":15409},{"type":17,"tag":84,"props":155298,"children":155299},{},[155300],{"type":23,"value":15720},{"type":17,"tag":84,"props":155302,"children":155303},{},[155304],{"type":23,"value":15729},{"type":17,"tag":84,"props":155306,"children":155307},{},[155308],{"type":23,"value":14150},{"type":17,"tag":84,"props":155310,"children":155311},{},[155312],{"type":23,"value":14129},{"type":17,"tag":84,"props":155314,"children":155315},{},[155316],{"type":23,"value":155317},"Circle.so",{"type":17,"tag":29,"props":155319,"children":155320},{},[155321],{"type":23,"value":155322},"Some providers appear in multiple categories (for example, Teams also supports Calendar; Intercom also appears in Ticketing), but Messaging operations are modeled within the Messaging category.",{"type":17,"tag":68,"props":155324,"children":155326},{"id":155325},"messaging-mcp-tool-surface",[155327],{"type":23,"value":155328},"Messaging MCP Tool Surface",{"type":17,"tag":29,"props":155330,"children":155331},{},[155332],{"type":23,"value":155333},"Messaging MCP makes documented Messaging API operations callable by LLMs.",{"type":17,"tag":239,"props":155335,"children":155336},{"id":24872},[155337],{"type":23,"value":15800},{"type":17,"tag":29,"props":155339,"children":155340},{},[155341],{"type":23,"value":155342},"Typical operations include:",{"type":17,"tag":80,"props":155344,"children":155345},{},[155346,155351,155356,155361,155366],{"type":17,"tag":84,"props":155347,"children":155348},{},[155349],{"type":23,"value":155350},"list_messages",{"type":17,"tag":84,"props":155352,"children":155353},{},[155354],{"type":23,"value":155355},"get_message",{"type":17,"tag":84,"props":155357,"children":155358},{},[155359],{"type":23,"value":155360},"create_message",{"type":17,"tag":84,"props":155362,"children":155363},{},[155364],{"type":23,"value":155365},"update_message",{"type":17,"tag":84,"props":155367,"children":155368},{},[155369],{"type":23,"value":155370},"delete_message",{"type":17,"tag":29,"props":155372,"children":155373},{},[155374],{"type":23,"value":155375},"Tool availability depends on:",{"type":17,"tag":80,"props":155377,"children":155378},{},[155379,155383],{"type":17,"tag":84,"props":155380,"children":155381},{},[155382],{"type":23,"value":144216},{"type":17,"tag":84,"props":155384,"children":155385},{},[155386],{"type":23,"value":144221},{"type":17,"tag":29,"props":155388,"children":155389},{},[155390],{"type":23,"value":155391},"Write behavior varies by provider:",{"type":17,"tag":80,"props":155393,"children":155394},{},[155395,155400,155405,155410],{"type":17,"tag":84,"props":155396,"children":155397},{},[155398],{"type":23,"value":155399},"Slack supports posting, updating, and deleting bot-authored messages.",{"type":17,"tag":84,"props":155401,"children":155402},{},[155403],{"type":23,"value":155404},"Teams supports POST, PATCH, and DELETE via Microsoft Graph, subject to scope.",{"type":17,"tag":84,"props":155406,"children":155407},{},[155408],{"type":23,"value":155409},"Gmail and IMAP support sending messages but do not allow editing sent mail.",{"type":17,"tag":84,"props":155411,"children":155412},{},[155413],{"type":23,"value":155414},"Some providers restrict edits or deletes to messages created by the app.",{"type":17,"tag":239,"props":155416,"children":155417},{"id":33472},[155418],{"type":23,"value":155419},"Attachments",{"type":17,"tag":80,"props":155421,"children":155422},{},[155423,155428,155433,155438],{"type":17,"tag":84,"props":155424,"children":155425},{},[155426],{"type":23,"value":155427},"Slack supports file uploads and message attachments.",{"type":17,"tag":84,"props":155429,"children":155430},{},[155431],{"type":23,"value":155432},"Teams supports attachments via OneDrive or SharePoint references.",{"type":17,"tag":84,"props":155434,"children":155435},{},[155436],{"type":23,"value":155437},"Gmail supports attachments.",{"type":17,"tag":84,"props":155439,"children":155440},{},[155441],{"type":23,"value":155442},"Attachment limits and formats vary by provider.",{"type":17,"tag":239,"props":155444,"children":155445},{"id":34160},[155446],{"type":23,"value":155447},"Reactions",{"type":17,"tag":80,"props":155449,"children":155450},{},[155451,155456,155461],{"type":17,"tag":84,"props":155452,"children":155453},{},[155454],{"type":23,"value":155455},"Slack supports add and remove reactions.",{"type":17,"tag":84,"props":155457,"children":155458},{},[155459],{"type":23,"value":155460},"Teams supports reactions via Graph.",{"type":17,"tag":84,"props":155462,"children":155463},{},[155464],{"type":23,"value":155465},"Email-style providers do not support reactions.",{"type":17,"tag":239,"props":155467,"children":155468},{"id":32533},[155469],{"type":23,"value":155470},"Threads",{"type":17,"tag":80,"props":155472,"children":155473},{},[155474,155486,155498,155503],{"type":17,"tag":84,"props":155475,"children":155476},{},[155477,155479,155485],{"type":23,"value":155478},"Slack uses ",{"type":17,"tag":6121,"props":155480,"children":155482},{"className":155481},[],[155483],{"type":23,"value":155484},"thread_ts",{"type":23,"value":54},{"type":17,"tag":84,"props":155487,"children":155488},{},[155489,155491,155497],{"type":23,"value":155490},"Teams uses ",{"type":17,"tag":6121,"props":155492,"children":155494},{"className":155493},[],[155495],{"type":23,"value":155496},"/replies",{"type":23,"value":54},{"type":17,"tag":84,"props":155499,"children":155500},{},[155501],{"type":23,"value":155502},"Discord supports threaded channels.",{"type":17,"tag":84,"props":155504,"children":155505},{},[155506],{"type":23,"value":155507},"Email threads are derived from message identifiers.",{"type":17,"tag":29,"props":155509,"children":155510},{},[155511],{"type":23,"value":155512},"Messaging MCP does not introduce new capabilities. It allows models to call the Messaging API operations that providers already support.",{"type":17,"tag":68,"props":155514,"children":155515},{"id":144346},[155516],{"type":23,"value":144349},{"type":17,"tag":29,"props":155518,"children":155519},{},[155520],{"type":23,"value":155521},"Each Messaging MCP tool call is a direct API request to the underlying provider.",{"type":17,"tag":29,"props":155523,"children":155524},{},[155525],{"type":23,"value":7403},{"type":17,"tag":80,"props":155527,"children":155528},{},[155529,155533,155538,155543],{"type":17,"tag":84,"props":155530,"children":155531},{},[155532],{"type":23,"value":144366},{"type":17,"tag":84,"props":155534,"children":155535},{},[155536],{"type":23,"value":155537},"Slack enforces per-token and per-app limits.",{"type":17,"tag":84,"props":155539,"children":155540},{},[155541],{"type":23,"value":155542},"Teams enforces request limits per application.",{"type":17,"tag":84,"props":155544,"children":155545},{},[155546],{"type":23,"value":155547},"High-volume writes can result in 429 responses.",{"type":17,"tag":29,"props":155549,"children":155550},{},[155551],{"type":23,"value":155552},"Retry and backoff logic should be implemented to handle provider rate limits.",{"type":17,"tag":29,"props":155554,"children":155555},{},[155556],{"type":23,"value":155557},"Because there is no caching layer, tool calls operate against the live state of the source system at the time of execution.",{"type":17,"tag":68,"props":155559,"children":155561},{"id":155560},"messaging-api-vs-messaging-mcp",[155562],{"type":23,"value":155563},"Messaging API vs Messaging MCP",{"type":17,"tag":29,"props":155565,"children":155566},{},[155567],{"type":23,"value":155568},"Both use the same underlying Messaging API.",{"type":17,"tag":29,"props":155570,"children":155571},{},[155572],{"type":23,"value":151200},{"type":17,"tag":239,"props":155574,"children":155576},{"id":155575},"use-the-messaging-api-directly-when",[155577],{"type":23,"value":155578},"Use the Messaging API directly when:",{"type":17,"tag":80,"props":155580,"children":155581},{},[155582,155587,155592,155597],{"type":17,"tag":84,"props":155583,"children":155584},{},[155585],{"type":23,"value":155586},"Your backend controls execution logic.",{"type":17,"tag":84,"props":155588,"children":155589},{},[155590],{"type":23,"value":155591},"You fetch messages for analytics.",{"type":17,"tag":84,"props":155593,"children":155594},{},[155595],{"type":23,"value":155596},"You generate embeddings or store derived state.",{"type":17,"tag":84,"props":155598,"children":155599},{},[155600],{"type":23,"value":155601},"You manage deterministic business rules.",{"type":17,"tag":29,"props":155603,"children":155604},{},[155605],{"type":23,"value":144560},{"type":17,"tag":29,"props":155607,"children":155608},{},[155609],{"type":23,"value":155610},"App → Unified Messaging API → Source platform",{"type":17,"tag":239,"props":155612,"children":155614},{"id":155613},"use-messaging-mcp-when",[155615],{"type":23,"value":155616},"Use Messaging MCP when:",{"type":17,"tag":80,"props":155618,"children":155619},{},[155620,155625,155629,155633],{"type":17,"tag":84,"props":155621,"children":155622},{},[155623],{"type":23,"value":155624},"The LLM decides which action to execute.",{"type":17,"tag":84,"props":155626,"children":155627},{},[155628],{"type":23,"value":144583},{"type":17,"tag":84,"props":155630,"children":155631},{},[155632],{"type":23,"value":144588},{"type":17,"tag":84,"props":155634,"children":155635},{},[155636],{"type":23,"value":155637},"You want to restrict model access using scoped tools and permissions.",{"type":17,"tag":29,"props":155639,"children":155640},{},[155641],{"type":23,"value":144560},{"type":17,"tag":29,"props":155643,"children":155644},{},[155645],{"type":23,"value":155646},"User → LLM → Tool call → Unified Messaging API → Source platform",{"type":17,"tag":29,"props":155648,"children":155649},{},[155650],{"type":23,"value":151282},{"type":17,"tag":29,"props":155652,"children":155653},{},[155654],{"type":23,"value":144612},{"type":17,"tag":68,"props":155656,"children":155657},{"id":144424},[155658],{"type":23,"value":144427},{"type":17,"tag":29,"props":155660,"children":155661},{},[155662],{"type":23,"value":155663},"Current LLM models impose limits on the number of tools they can handle.",{"type":17,"tag":80,"props":155665,"children":155666},{},[155667,155672,155677],{"type":17,"tag":84,"props":155668,"children":155669},{},[155670],{"type":23,"value":155671},"Groq models support up to 10 tools.",{"type":17,"tag":84,"props":155673,"children":155674},{},[155675],{"type":23,"value":155676},"Most OpenAI models support up to 20 tools.",{"type":17,"tag":84,"props":155678,"children":155679},{},[155680],{"type":23,"value":155681},"Cohere models support up to 50 tools.",{"type":17,"tag":29,"props":155683,"children":155684},{},[155685],{"type":23,"value":155686},"A Messaging integration may expose many tools across message, channel, and event operations. Tool surface should be intentionally restricted using:",{"type":17,"tag":80,"props":155688,"children":155689},{},[155690,155698,155708],{"type":17,"tag":84,"props":155691,"children":155692},{},[155693],{"type":17,"tag":6121,"props":155694,"children":155696},{"className":155695},[],[155697],{"type":23,"value":24204},{"type":17,"tag":84,"props":155699,"children":155700},{},[155701,155706],{"type":17,"tag":6121,"props":155702,"children":155704},{"className":155703},[],[155705],{"type":23,"value":131599},{"type":23,"value":155707}," allowlisting",{"type":17,"tag":84,"props":155709,"children":155710},{},[155711],{"type":17,"tag":6121,"props":155712,"children":155714},{"className":155713},[],[155715],{"type":23,"value":131610},{"type":17,"tag":29,"props":155717,"children":155718},{},[155719],{"type":23,"value":155720},"Tool restriction is part of production MCP design.",{"type":17,"tag":68,"props":155722,"children":155724},{"id":155723},"why-messaging-is-a-strong-mcp-category",[155725],{"type":23,"value":155726},"Why Messaging Is a Strong MCP Category",{"type":17,"tag":29,"props":155728,"children":155729},{},[155730],{"type":23,"value":155731},"Messaging is particularly well-suited for MCP because:",{"type":17,"tag":80,"props":155733,"children":155734},{},[155735,155740,155745,155750,155755],{"type":17,"tag":84,"props":155736,"children":155737},{},[155738],{"type":23,"value":155739},"It is high-frequency and conversational.",{"type":17,"tag":84,"props":155741,"children":155742},{},[155743],{"type":23,"value":155744},"Writes are bounded to messages, reactions, and edits.",{"type":17,"tag":84,"props":155746,"children":155747},{},[155748],{"type":23,"value":155749},"Provider scopes constrain risk.",{"type":17,"tag":84,"props":155751,"children":155752},{},[155753],{"type":23,"value":155754},"Edits are typically limited to app-authored messages.",{"type":17,"tag":84,"props":155756,"children":155757},{},[155758],{"type":23,"value":155759},"It pairs naturally with CRM, Ticketing, and Calendar.",{"type":17,"tag":29,"props":155761,"children":155762},{},[155763],{"type":23,"value":155764},"Messaging MCP enables:",{"type":17,"tag":80,"props":155766,"children":155767},{},[155768,155772,155777,155782,155787],{"type":17,"tag":84,"props":155769,"children":155770},{},[155771],{"type":23,"value":32045},{"type":17,"tag":84,"props":155773,"children":155774},{},[155775],{"type":23,"value":155776},"Incident notification agents",{"type":17,"tag":84,"props":155778,"children":155779},{},[155780],{"type":23,"value":155781},"Sales copilots posting summaries",{"type":17,"tag":84,"props":155783,"children":155784},{},[155785],{"type":23,"value":155786},"Internal escalation helpers",{"type":17,"tag":84,"props":155788,"children":155789},{},[155790],{"type":23,"value":155791},"Embedded AI features inside SaaS products",{"type":17,"tag":29,"props":155793,"children":155794},{},[155795],{"type":23,"value":155796},"All without building separate integrations per provider.",{"type":17,"tag":68,"props":155798,"children":155800},{"id":155799},"build-real-time-messaging-agents",[155801],{"type":23,"value":155802},"Build Real-Time Messaging Agents",{"type":17,"tag":29,"props":155804,"children":155805},{},[155806],{"type":23,"value":155807},"With Messaging MCP, your agents can:",{"type":17,"tag":80,"props":155809,"children":155810},{},[155811,155816,155821,155826,155831],{"type":17,"tag":84,"props":155812,"children":155813},{},[155814],{"type":23,"value":155815},"Post messages",{"type":17,"tag":84,"props":155817,"children":155818},{},[155819],{"type":23,"value":155820},"Edit bot-authored messages",{"type":17,"tag":84,"props":155822,"children":155823},{},[155824],{"type":23,"value":155825},"Add reactions",{"type":17,"tag":84,"props":155827,"children":155828},{},[155829],{"type":23,"value":155830},"Retrieve threaded context",{"type":17,"tag":84,"props":155832,"children":155833},{},[155834],{"type":23,"value":155835},"Act across Slack, Teams, Gmail, Discord, and more",{"type":17,"tag":29,"props":155837,"children":155838},{},[155839],{"type":23,"value":155840},"Every action executes directly against the source platform.",{"type":17,"tag":29,"props":155842,"children":155843},{},[155844],{"type":23,"value":155845},"No cached message store.",{"type":17,"tag":29,"props":155847,"children":155848},{},[155849],{"type":23,"value":155850},"No sync jobs.",{"type":17,"tag":29,"props":155852,"children":155853},{},[155854],{"type":23,"value":155855},"No background replication.",{"type":17,"tag":239,"props":155857,"children":155858},{"id":146505},[155859],{"type":23,"value":146508},{"type":17,"tag":80,"props":155861,"children":155862},{},[155863,155868,155872,155877],{"type":17,"tag":84,"props":155864,"children":155865},{},[155866],{"type":23,"value":155867},"Enable Messaging integrations",{"type":17,"tag":84,"props":155869,"children":155870},{},[155871],{"type":23,"value":146521},{"type":17,"tag":84,"props":155873,"children":155874},{},[155875],{"type":23,"value":155876},"Connect Slack, Teams, Gmail, and others",{"type":17,"tag":84,"props":155878,"children":155879},{},[155880],{"type":23,"value":155881},"Ship AI-driven messaging features inside your product",{"type":17,"tag":29,"props":155883,"children":155884},{},[155885],{"type":17,"tag":133,"props":155886,"children":155888},{"href":1612,"rel":155887},[214],[155889],{"type":23,"value":44481},{"type":17,"tag":29,"props":155891,"children":155892},{},[155893],{"type":17,"tag":133,"props":155894,"children":155896},{"href":1623,"rel":155895},[214],[155897],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":155899},[155900,155901,155902,155908,155909,155913,155914,155915],{"id":155173,"depth":1629,"text":155176},{"id":155255,"depth":1629,"text":155258},{"id":155325,"depth":1629,"text":155328,"children":155903},[155904,155905,155906,155907],{"id":24872,"depth":1635,"text":15800},{"id":33472,"depth":1635,"text":155419},{"id":34160,"depth":1635,"text":155447},{"id":32533,"depth":1635,"text":155470},{"id":144346,"depth":1629,"text":144349},{"id":155560,"depth":1629,"text":155563,"children":155910},[155911,155912],{"id":155575,"depth":1635,"text":155578},{"id":155613,"depth":1635,"text":155616},{"id":144424,"depth":1629,"text":144427},{"id":155723,"depth":1629,"text":155726},{"id":155799,"depth":1629,"text":155802,"children":155916},[155917],{"id":146505,"depth":1635,"text":146508},"content:blog:messaging_mcp_servers_overview_real_time_use_cases_and_agent_execution.md","blog/messaging_mcp_servers_overview_real_time_use_cases_and_agent_execution.md","blog/messaging_mcp_servers_overview_real_time_use_cases_and_agent_execution",{"_path":155922,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":155923,"description":155924,"img":155925,"date":155926,"tag":12,"body":155927,"_type":1677,"_id":157241,"_source":1679,"_file":157242,"_stem":157243,"_extension":1682},"/blog/how_to_match_candidates_to_jobs_using_ats_data_with_unified_ats_api","How to Match Candidates to Jobs Using ATS Data with Unified's ATS API","Matching candidates to jobs sounds like an algorithm problem.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_match_candidates_to_jobs_using_ats_data_with_unified_ats_api-icon.png","2026-02-18T21:23:00.000Z",{"type":14,"children":155928,"toc":157226},[155929,155934,155937,155945,155949,155954,155959,155982,155987,155998,156004,156009,156101,156106,156112,156117,156121,156129,156134,156143,156149,156160,156243,156254,156266,156278,156285,156296,156302,156307,156315,156319,156328,156334,156344,156429,156435,156446,156453,156465,156471,156476,156480,156489,156495,156541,156547,156552,156561,156573,156580,156585,156591,156596,156604,156608,156667,156672,156681,156686,156704,156710,156715,156721,156772,156778,156807,156813,156826,156831,156854,156859,156865,156870,156882,156918,156922,156985,156992,156997,157002,157011,157016,157022,157027,157036,157041,157050,157061,157100,157110,157116,157121,157159,157164,157169,157173,157178,157183,157205,157210,157218],{"type":17,"tag":18,"props":155930,"children":155932},{"id":155931},"how-to-match-candidates-to-jobs-using-ats-data-with-unifieds-ats-api",[155933],{"type":23,"value":155923},{"type":17,"tag":25,"props":155935,"children":155936},{},[],{"type":17,"tag":29,"props":155938,"children":155939},{},[155940],{"type":17,"tag":33,"props":155941,"children":155942},{},[155943],{"type":23,"value":155944},"February 18, 2026",{"type":17,"tag":29,"props":155946,"children":155947},{},[155948],{"type":23,"value":155924},{"type":17,"tag":29,"props":155950,"children":155951},{},[155952],{"type":23,"value":155953},"In practice, it's a data modeling problem first.",{"type":17,"tag":29,"props":155955,"children":155956},{},[155957],{"type":23,"value":155958},"Before you can score candidates, rank applicants, or train historical models, you need consistent access to:",{"type":17,"tag":80,"props":155960,"children":155961},{},[155962,155967,155972,155977],{"type":17,"tag":84,"props":155963,"children":155964},{},[155965],{"type":23,"value":155966},"Open job requirements",{"type":17,"tag":84,"props":155968,"children":155969},{},[155970],{"type":23,"value":155971},"Candidate qualifications",{"type":17,"tag":84,"props":155973,"children":155974},{},[155975],{"type":23,"value":155976},"Application relationships",{"type":17,"tag":84,"props":155978,"children":155979},{},[155980],{"type":23,"value":155981},"Outcome signals",{"type":17,"tag":29,"props":155983,"children":155984},{},[155985],{"type":23,"value":155986},"Across ATS systems, those elements are structured differently — and not always fully available.",{"type":17,"tag":29,"props":155988,"children":155989},{},[155990,155992,155996],{"type":23,"value":155991},"This guide explains how to match candidates to jobs using Unified's ",{"type":17,"tag":133,"props":155993,"children":155994},{"href":55696},[155995],{"type":23,"value":55699},{"type":23,"value":155997},", grounded strictly in what the API exposes and where provider variability applies.",{"type":17,"tag":18,"props":155999,"children":156001},{"id":156000},"the-matching-mental-model",[156002],{"type":23,"value":156003},"The Matching Mental Model",{"type":17,"tag":29,"props":156005,"children":156006},{},[156007],{"type":23,"value":156008},"Candidate-job matching depends on four data layers:",{"type":17,"tag":6154,"props":156010,"children":156011},{},[156012,156034,156056,156078],{"type":17,"tag":84,"props":156013,"children":156014},{},[156015,156032],{"type":17,"tag":48,"props":156016,"children":156017},{},[156018,156020,156031],{"type":23,"value":156019},"Jobs (",{"type":17,"tag":48,"props":156021,"children":156022},{},[156023],{"type":17,"tag":48,"props":156024,"children":156025},{},[156026],{"type":17,"tag":6121,"props":156027,"children":156029},{"className":156028},[],[156030],{"type":23,"value":75743},{"type":23,"value":12034},{"type":23,"value":156033}," – requirements and context",{"type":17,"tag":84,"props":156035,"children":156036},{},[156037,156054],{"type":17,"tag":48,"props":156038,"children":156039},{},[156040,156042,156053],{"type":23,"value":156041},"Candidates (",{"type":17,"tag":48,"props":156043,"children":156044},{},[156045],{"type":17,"tag":48,"props":156046,"children":156047},{},[156048],{"type":17,"tag":6121,"props":156049,"children":156051},{"className":156050},[],[156052],{"type":23,"value":133291},{"type":23,"value":12034},{"type":23,"value":156055}," – qualifications and profile data",{"type":17,"tag":84,"props":156057,"children":156058},{},[156059,156076],{"type":17,"tag":48,"props":156060,"children":156061},{},[156062,156064,156075],{"type":23,"value":156063},"Applications (",{"type":17,"tag":48,"props":156065,"children":156066},{},[156067],{"type":17,"tag":48,"props":156068,"children":156069},{},[156070],{"type":17,"tag":6121,"props":156071,"children":156073},{"className":156072},[],[156074],{"type":23,"value":132178},{"type":23,"value":12034},{"type":23,"value":156077}," – pipeline relationships",{"type":17,"tag":84,"props":156079,"children":156080},{},[156081,156099],{"type":17,"tag":48,"props":156082,"children":156083},{},[156084,156086,156098],{"type":23,"value":156085},"Documents (",{"type":17,"tag":48,"props":156087,"children":156088},{},[156089],{"type":17,"tag":48,"props":156090,"children":156091},{},[156092],{"type":17,"tag":6121,"props":156093,"children":156095},{"className":156094},[],[156096],{"type":23,"value":156097},"AtsDocument",{"type":23,"value":12034},{"type":23,"value":156100}," – resumes and attachments",{"type":17,"tag":29,"props":156102,"children":156103},{},[156104],{"type":23,"value":156105},"Unified provides normalized models for each of these objects. However, field availability varies by integration and must be handled defensively.",{"type":17,"tag":18,"props":156107,"children":156109},{"id":156108},"step-1-ingest-open-jobs",[156110],{"type":23,"value":156111},"Step 1: Ingest Open Jobs",{"type":17,"tag":29,"props":156113,"children":156114},{},[156115],{"type":23,"value":156116},"Open jobs are your target set for matching.",{"type":17,"tag":239,"props":156118,"children":156119},{"id":132141},[156120],{"type":23,"value":132144},{"type":17,"tag":6893,"props":156122,"children":156124},{"className":156123,"code":75728,"language":20901,"meta":23},[20899],[156125],{"type":17,"tag":6121,"props":156126,"children":156127},{"__ignoreMap":7},[156128],{"type":23,"value":75728},{"type":17,"tag":29,"props":156130,"children":156131},{},[156132],{"type":23,"value":156133},"SDK example:",{"type":17,"tag":6893,"props":156135,"children":156138},{"className":156136,"code":156137,"language":18718,"meta":7},[18716],"const jobs = await sdk.ats.listAtsJobs({\n  connectionId,\n  status: 'OPEN',\n  sort: 'updated_at',\n  order: 'asc',\n  limit: 100,\n  offset: 0,\n  fields: '',\n  raw: '',\n});\n",[156139],{"type":17,"tag":6121,"props":156140,"children":156141},{"__ignoreMap":7},[156142],{"type":23,"value":156137},{"type":17,"tag":239,"props":156144,"children":156146},{"id":156145},"key-job-fields",[156147],{"type":23,"value":156148},"Key Job Fields",{"type":17,"tag":29,"props":156150,"children":156151},{},[156152,156154,156159],{"type":23,"value":156153},"From the normalized ",{"type":17,"tag":6121,"props":156155,"children":156157},{"className":156156},[],[156158],{"type":23,"value":75743},{"type":23,"value":134527},{"type":17,"tag":80,"props":156161,"children":156162},{},[156163,156171,156179,156187,156195,156203,156211,156219,156227,156235],{"type":17,"tag":84,"props":156164,"children":156165},{},[156166],{"type":17,"tag":6121,"props":156167,"children":156169},{"className":156168},[],[156170],{"type":23,"value":18766},{"type":17,"tag":84,"props":156172,"children":156173},{},[156174],{"type":17,"tag":6121,"props":156175,"children":156177},{"className":156176},[],[156178],{"type":23,"value":18781},{"type":17,"tag":84,"props":156180,"children":156181},{},[156182],{"type":17,"tag":6121,"props":156183,"children":156185},{"className":156184},[],[156186],{"type":23,"value":24679},{"type":17,"tag":84,"props":156188,"children":156189},{},[156190],{"type":17,"tag":6121,"props":156191,"children":156193},{"className":156192},[],[156194],{"type":23,"value":19949},{"type":17,"tag":84,"props":156196,"children":156197},{},[156198],{"type":17,"tag":6121,"props":156199,"children":156201},{"className":156200},[],[156202],{"type":23,"value":135610},{"type":17,"tag":84,"props":156204,"children":156205},{},[156206],{"type":17,"tag":6121,"props":156207,"children":156209},{"className":156208},[],[156210],{"type":23,"value":135617},{"type":17,"tag":84,"props":156212,"children":156213},{},[156214],{"type":17,"tag":6121,"props":156215,"children":156217},{"className":156216},[],[156218],{"type":23,"value":75514},{"type":17,"tag":84,"props":156220,"children":156221},{},[156222],{"type":17,"tag":6121,"props":156223,"children":156225},{"className":156224},[],[156226],{"type":23,"value":75550},{"type":17,"tag":84,"props":156228,"children":156229},{},[156230],{"type":17,"tag":6121,"props":156231,"children":156233},{"className":156232},[],[156234],{"type":23,"value":135273},{"type":17,"tag":84,"props":156236,"children":156237},{},[156238],{"type":17,"tag":6121,"props":156239,"children":156241},{"className":156240},[],[156242],{"type":23,"value":133378},{"type":17,"tag":239,"props":156244,"children":156246},{"id":156245},"important-caveat-skills",[156247,156249],{"type":23,"value":156248},"Important Caveat: ",{"type":17,"tag":6121,"props":156250,"children":156252},{"className":156251},[],[156253],{"type":23,"value":135662},{"type":17,"tag":29,"props":156255,"children":156256},{},[156257,156259,156264],{"type":23,"value":156258},"Although ",{"type":17,"tag":6121,"props":156260,"children":156262},{"className":156261},[],[156263],{"type":23,"value":135662},{"type":23,"value":156265}," exists in the normalized job schema, most ATS integrations do not expose it in readable fields.",{"type":17,"tag":29,"props":156267,"children":156268},{},[156269,156271,156276],{"type":23,"value":156270},"Only a small subset of integrations (e.g., Vincere for candidates) expose structured skills. Many integrations omit ",{"type":17,"tag":6121,"props":156272,"children":156274},{"className":156273},[],[156275],{"type":23,"value":135662},{"type":23,"value":156277}," entirely for both candidates and jobs.",{"type":17,"tag":29,"props":156279,"children":156280},{},[156281],{"type":17,"tag":48,"props":156282,"children":156283},{},[156284],{"type":23,"value":20076},{"type":17,"tag":29,"props":156286,"children":156287},{},[156288,156289,156294],{"type":23,"value":135656},{"type":17,"tag":6121,"props":156290,"children":156292},{"className":156291},[],[156293],{"type":23,"value":135662},{"type":23,"value":156295}," as your primary matching signal. Treat it as optional structured enrichment when available.",{"type":17,"tag":18,"props":156297,"children":156299},{"id":156298},"step-2-ingest-candidate-profiles",[156300],{"type":23,"value":156301},"Step 2: Ingest Candidate Profiles",{"type":17,"tag":29,"props":156303,"children":156304},{},[156305],{"type":23,"value":156306},"Candidates are ingested via:",{"type":17,"tag":6893,"props":156308,"children":156310},{"className":156309,"code":133260,"language":20901,"meta":23},[20899],[156311],{"type":17,"tag":6121,"props":156312,"children":156313},{"__ignoreMap":7},[156314],{"type":23,"value":133260},{"type":17,"tag":29,"props":156316,"children":156317},{},[156318],{"type":23,"value":156133},{"type":17,"tag":6893,"props":156320,"children":156323},{"className":156321,"code":156322,"language":18718,"meta":7},[18716],"const candidates = await sdk.ats.listAtsCandidates({\n  connectionId,\n  sort: 'updated_at',\n  order: 'asc',\n  limit: 100,\n  offset: 0,\n  fields: '',\n  raw: '',\n});\n",[156324],{"type":17,"tag":6121,"props":156325,"children":156326},{"__ignoreMap":7},[156327],{"type":23,"value":156322},{"type":17,"tag":239,"props":156329,"children":156331},{"id":156330},"key-candidate-fields",[156332],{"type":23,"value":156333},"Key Candidate Fields",{"type":17,"tag":29,"props":156335,"children":156336},{},[156337,156338,156343],{"type":23,"value":132433},{"type":17,"tag":6121,"props":156339,"children":156341},{"className":156340},[],[156342],{"type":23,"value":133291},{"type":23,"value":20456},{"type":17,"tag":80,"props":156345,"children":156346},{},[156347,156361,156369,156377,156386,156395,156405,156413,156421],{"type":17,"tag":84,"props":156348,"children":156349},{},[156350,156355,156356],{"type":17,"tag":6121,"props":156351,"children":156353},{"className":156352},[],[156354],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":156357,"children":156359},{"className":156358},[],[156360],{"type":23,"value":62341},{"type":17,"tag":84,"props":156362,"children":156363},{},[156364],{"type":17,"tag":6121,"props":156365,"children":156367},{"className":156366},[],[156368],{"type":23,"value":62346},{"type":17,"tag":84,"props":156370,"children":156371},{},[156372],{"type":17,"tag":6121,"props":156373,"children":156375},{"className":156374},[],[156376],{"type":23,"value":62786},{"type":17,"tag":84,"props":156378,"children":156379},{},[156380],{"type":17,"tag":6121,"props":156381,"children":156383},{"className":156382},[],[156384],{"type":23,"value":156385},"experiences[]",{"type":17,"tag":84,"props":156387,"children":156388},{},[156389],{"type":17,"tag":6121,"props":156390,"children":156392},{"className":156391},[],[156393],{"type":23,"value":156394},"education[]",{"type":17,"tag":84,"props":156396,"children":156397},{},[156398,156403],{"type":17,"tag":6121,"props":156399,"children":156401},{"className":156400},[],[156402],{"type":23,"value":135662},{"type":23,"value":156404}," (rarely populated)",{"type":17,"tag":84,"props":156406,"children":156407},{},[156408],{"type":17,"tag":6121,"props":156409,"children":156411},{"className":156410},[],[156412],{"type":23,"value":133369},{"type":17,"tag":84,"props":156414,"children":156415},{},[156416],{"type":17,"tag":6121,"props":156417,"children":156419},{"className":156418},[],[156420],{"type":23,"value":133378},{"type":17,"tag":84,"props":156422,"children":156423},{},[156424],{"type":17,"tag":6121,"props":156425,"children":156427},{"className":156426},[],[156428],{"type":23,"value":133330},{"type":17,"tag":239,"props":156430,"children":156432},{"id":156431},"skills-field-variability",[156433],{"type":23,"value":156434},"Skills Field Variability",{"type":17,"tag":29,"props":156436,"children":156437},{},[156438,156439,156444],{"type":23,"value":6712},{"type":17,"tag":6121,"props":156440,"children":156442},{"className":156441},[],[156443],{"type":23,"value":135662},{"type":23,"value":156445}," field exists in the normalized schema, but most integrations do not populate it. Only certain providers (e.g., Vincere) provide candidate skills reliably.",{"type":17,"tag":29,"props":156447,"children":156448},{},[156449],{"type":17,"tag":48,"props":156450,"children":156451},{},[156452],{"type":23,"value":20076},{"type":17,"tag":29,"props":156454,"children":156455},{},[156456,156458,156463],{"type":23,"value":156457},"Treat ",{"type":17,"tag":6121,"props":156459,"children":156461},{"className":156460},[],[156462],{"type":23,"value":135662},{"type":23,"value":156464}," as opportunistic data, not guaranteed data.",{"type":17,"tag":18,"props":156466,"children":156468},{"id":156467},"step-3-retrieve-resume-documents-when-available",[156469],{"type":23,"value":156470},"Step 3: Retrieve Resume Documents (When Available)",{"type":17,"tag":29,"props":156472,"children":156473},{},[156474],{"type":23,"value":156475},"Resumes provide the richest unstructured matching signal.",{"type":17,"tag":239,"props":156477,"children":156478},{"id":132403},[156479],{"type":23,"value":132144},{"type":17,"tag":6893,"props":156481,"children":156484},{"className":156482,"code":156483,"language":20901,"meta":23},[20899],"GET /ats/{connection_id}/document\n",[156485],{"type":17,"tag":6121,"props":156486,"children":156487},{"__ignoreMap":7},[156488],{"type":23,"value":156483},{"type":17,"tag":239,"props":156490,"children":156492},{"id":156491},"important-facts",[156493],{"type":23,"value":156494},"Important Facts",{"type":17,"tag":80,"props":156496,"children":156497},{},[156498,156509,156519,156531,156536],{"type":17,"tag":84,"props":156499,"children":156500},{},[156501,156503,156508],{"type":23,"value":156502},"Most integrations return a short-lived ",{"type":17,"tag":6121,"props":156504,"children":156506},{"className":156505},[],[156507],{"type":23,"value":134916},{"type":23,"value":54},{"type":17,"tag":84,"props":156510,"children":156511},{},[156512,156517],{"type":17,"tag":6121,"props":156513,"children":156515},{"className":156514},[],[156516],{"type":23,"value":134916},{"type":23,"value":156518}," typically expires after one hour.",{"type":17,"tag":84,"props":156520,"children":156521},{},[156522,156524,156529],{"type":23,"value":156523},"Only a small subset of integrations (e.g., Workable, Vincere) return ",{"type":17,"tag":6121,"props":156525,"children":156527},{"className":156526},[],[156528],{"type":23,"value":135899},{"type":23,"value":156530}," (base64) on read.",{"type":17,"tag":84,"props":156532,"children":156533},{},[156534],{"type":23,"value":156535},"Some integrations (e.g., Workday) do not expose document URLs or document data.",{"type":17,"tag":84,"props":156537,"children":156538},{},[156539],{"type":23,"value":156540},"Some ATS integrations do not expose document objects at all.",{"type":17,"tag":239,"props":156542,"children":156544},{"id":156543},"resume-identification",[156545],{"type":23,"value":156546},"Resume Identification",{"type":17,"tag":29,"props":156548,"children":156549},{},[156550],{"type":23,"value":156551},"The normalized document schema includes:",{"type":17,"tag":6893,"props":156553,"children":156556},{"className":156554,"code":156555,"language":20901,"meta":23},[20899],"type: 'RESUME' | 'COVER_LETTER' | ...\n",[156557],{"type":17,"tag":6121,"props":156558,"children":156559},{"__ignoreMap":7},[156560],{"type":23,"value":156555},{"type":17,"tag":29,"props":156562,"children":156563},{},[156564,156566,156572],{"type":23,"value":156565},"However, documentation does not guarantee that all providers consistently label resumes as ",{"type":17,"tag":6121,"props":156567,"children":156569},{"className":156568},[],[156570],{"type":23,"value":156571},"RESUME",{"type":23,"value":54},{"type":17,"tag":29,"props":156574,"children":156575},{},[156576],{"type":17,"tag":48,"props":156577,"children":156578},{},[156579],{"type":23,"value":20076},{"type":17,"tag":29,"props":156581,"children":156582},{},[156583],{"type":23,"value":156584},"Resume retrieval depends on integration capability. Always check each provider's 'Readable Fields' list and handle missing documents gracefully.",{"type":17,"tag":18,"props":156586,"children":156588},{"id":156587},"step-4-join-candidates-to-jobs-via-applications",[156589],{"type":23,"value":156590},"Step 4: Join Candidates to Jobs via Applications",{"type":17,"tag":29,"props":156592,"children":156593},{},[156594],{"type":23,"value":156595},"Applications link candidates to jobs.",{"type":17,"tag":6893,"props":156597,"children":156599},{"className":156598,"code":132148,"language":20901,"meta":23},[20899],[156600],{"type":17,"tag":6121,"props":156601,"children":156602},{"__ignoreMap":7},[156603],{"type":23,"value":132148},{"type":17,"tag":29,"props":156605,"children":156606},{},[156607],{"type":23,"value":111468},{"type":17,"tag":80,"props":156609,"children":156610},{},[156611,156619,156627,156635,156643,156651,156659],{"type":17,"tag":84,"props":156612,"children":156613},{},[156614],{"type":17,"tag":6121,"props":156615,"children":156617},{"className":156616},[],[156618],{"type":23,"value":117296},{"type":17,"tag":84,"props":156620,"children":156621},{},[156622],{"type":17,"tag":6121,"props":156623,"children":156625},{"className":156624},[],[156626],{"type":23,"value":117309},{"type":17,"tag":84,"props":156628,"children":156629},{},[156630],{"type":17,"tag":6121,"props":156631,"children":156633},{"className":156632},[],[156634],{"type":23,"value":19949},{"type":17,"tag":84,"props":156636,"children":156637},{},[156638],{"type":17,"tag":6121,"props":156639,"children":156641},{"className":156640},[],[156642],{"type":23,"value":117347},{"type":17,"tag":84,"props":156644,"children":156645},{},[156646],{"type":17,"tag":6121,"props":156647,"children":156649},{"className":156648},[],[156650],{"type":23,"value":132224},{"type":17,"tag":84,"props":156652,"children":156653},{},[156654],{"type":17,"tag":6121,"props":156655,"children":156657},{"className":156656},[],[156658],{"type":23,"value":132233},{"type":17,"tag":84,"props":156660,"children":156661},{},[156662],{"type":17,"tag":6121,"props":156663,"children":156665},{"className":156664},[],[156666],{"type":23,"value":135872},{"type":17,"tag":29,"props":156668,"children":156669},{},[156670],{"type":23,"value":156671},"Your internal model should reflect:",{"type":17,"tag":6893,"props":156673,"children":156676},{"className":156674,"code":156675,"language":20901,"meta":23},[20899],"Candidate\n  ↳ Applications[]\n      ↳ Job\n",[156677],{"type":17,"tag":6121,"props":156678,"children":156679},{"__ignoreMap":7},[156680],{"type":23,"value":156675},{"type":17,"tag":29,"props":156682,"children":156683},{},[156684],{"type":23,"value":156685},"Matching may occur:",{"type":17,"tag":80,"props":156687,"children":156688},{},[156689,156694,156699],{"type":17,"tag":84,"props":156690,"children":156691},{},[156692],{"type":23,"value":156693},"Before application (proactive sourcing)",{"type":17,"tag":84,"props":156695,"children":156696},{},[156697],{"type":23,"value":156698},"After application (ranking within pipeline)",{"type":17,"tag":84,"props":156700,"children":156701},{},[156702],{"type":23,"value":156703},"Post-interview (scoring finalists)",{"type":17,"tag":18,"props":156705,"children":156707},{"id":156706},"step-5-feature-extraction-strategy",[156708],{"type":23,"value":156709},"Step 5: Feature Extraction Strategy",{"type":17,"tag":29,"props":156711,"children":156712},{},[156713],{"type":23,"value":156714},"Because structured skills are inconsistently available, matching should combine:",{"type":17,"tag":239,"props":156716,"children":156718},{"id":156717},"structured-signals-when-available",[156719],{"type":23,"value":156720},"Structured signals (when available)",{"type":17,"tag":80,"props":156722,"children":156723},{},[156724,156732,156740,156748,156756,156764],{"type":17,"tag":84,"props":156725,"children":156726},{},[156727],{"type":17,"tag":6121,"props":156728,"children":156730},{"className":156729},[],[156731],{"type":23,"value":135610},{"type":17,"tag":84,"props":156733,"children":156734},{},[156735],{"type":17,"tag":6121,"props":156736,"children":156738},{"className":156737},[],[156739],{"type":23,"value":135617},{"type":17,"tag":84,"props":156741,"children":156742},{},[156743],{"type":17,"tag":6121,"props":156744,"children":156746},{"className":156745},[],[156747],{"type":23,"value":75514},{"type":17,"tag":84,"props":156749,"children":156750},{},[156751],{"type":17,"tag":6121,"props":156752,"children":156754},{"className":156753},[],[156755],{"type":23,"value":75550},{"type":17,"tag":84,"props":156757,"children":156758},{},[156759],{"type":17,"tag":6121,"props":156760,"children":156762},{"className":156761},[],[156763],{"type":23,"value":133369},{"type":17,"tag":84,"props":156765,"children":156766},{},[156767],{"type":17,"tag":6121,"props":156768,"children":156770},{"className":156769},[],[156771],{"type":23,"value":133378},{"type":17,"tag":239,"props":156773,"children":156775},{"id":156774},"semi-structured-signals",[156776],{"type":23,"value":156777},"Semi-structured signals",{"type":17,"tag":80,"props":156779,"children":156780},{},[156781,156789,156797],{"type":17,"tag":84,"props":156782,"children":156783},{},[156784],{"type":17,"tag":6121,"props":156785,"children":156787},{"className":156786},[],[156788],{"type":23,"value":156385},{"type":17,"tag":84,"props":156790,"children":156791},{},[156792],{"type":17,"tag":6121,"props":156793,"children":156795},{"className":156794},[],[156796],{"type":23,"value":156394},{"type":17,"tag":84,"props":156798,"children":156799},{},[156800,156805],{"type":17,"tag":6121,"props":156801,"children":156803},{"className":156802},[],[156804],{"type":23,"value":134460},{"type":23,"value":156806}," (from applications)",{"type":17,"tag":239,"props":156808,"children":156810},{"id":156809},"unstructured-signals",[156811],{"type":23,"value":156812},"Unstructured signals",{"type":17,"tag":80,"props":156814,"children":156815},{},[156816,156821],{"type":17,"tag":84,"props":156817,"children":156818},{},[156819],{"type":23,"value":156820},"Resume text (if retrievable via document_url or document_data)",{"type":17,"tag":84,"props":156822,"children":156823},{},[156824],{"type":23,"value":156825},"Job description text",{"type":17,"tag":29,"props":156827,"children":156828},{},[156829],{"type":23,"value":156830},"Your matching pipeline may include:",{"type":17,"tag":80,"props":156832,"children":156833},{},[156834,156839,156844,156849],{"type":17,"tag":84,"props":156835,"children":156836},{},[156837],{"type":23,"value":156838},"Keyword overlap",{"type":17,"tag":84,"props":156840,"children":156841},{},[156842],{"type":23,"value":156843},"Embedding similarity",{"type":17,"tag":84,"props":156845,"children":156846},{},[156847],{"type":23,"value":156848},"Rule-based scoring",{"type":17,"tag":84,"props":156850,"children":156851},{},[156852],{"type":23,"value":156853},"ML model scoring",{"type":17,"tag":29,"props":156855,"children":156856},{},[156857],{"type":23,"value":156858},"Unified provides the ingestion layer. The scoring layer lives in your system.",{"type":17,"tag":18,"props":156860,"children":156862},{"id":156861},"step-6-use-historical-outcomes-for-training",[156863],{"type":23,"value":156864},"Step 6: Use Historical Outcomes for Training",{"type":17,"tag":29,"props":156866,"children":156867},{},[156868],{"type":23,"value":156869},"If building supervised models, you need labels.",{"type":17,"tag":29,"props":156871,"children":156872},{},[156873,156875,156880],{"type":23,"value":156874},"Outcome-related fields in ",{"type":17,"tag":6121,"props":156876,"children":156878},{"className":156877},[],[156879],{"type":23,"value":132178},{"type":23,"value":156881}," include:",{"type":17,"tag":80,"props":156883,"children":156884},{},[156885,156893,156901,156909],{"type":17,"tag":84,"props":156886,"children":156887},{},[156888],{"type":17,"tag":6121,"props":156889,"children":156891},{"className":156890},[],[156892],{"type":23,"value":132233},{"type":17,"tag":84,"props":156894,"children":156895},{},[156896],{"type":17,"tag":6121,"props":156897,"children":156899},{"className":156898},[],[156900],{"type":23,"value":132224},{"type":17,"tag":84,"props":156902,"children":156903},{},[156904],{"type":17,"tag":6121,"props":156905,"children":156907},{"className":156906},[],[156908],{"type":23,"value":135872},{"type":17,"tag":84,"props":156910,"children":156911},{},[156912],{"type":17,"tag":6121,"props":156913,"children":156915},{"className":156914},[],[156916],{"type":23,"value":156917},"offers[].accepted_at",{"type":17,"tag":239,"props":156919,"children":156920},{"id":144224},[156921],{"type":23,"value":144227},{"type":17,"tag":80,"props":156923,"children":156924},{},[156925,156935,156945,156957,156967,156980],{"type":17,"tag":84,"props":156926,"children":156927},{},[156928,156933],{"type":17,"tag":6121,"props":156929,"children":156931},{"className":156930},[],[156932],{"type":23,"value":132233},{"type":23,"value":156934}," is not universally exposed.",{"type":17,"tag":84,"props":156936,"children":156937},{},[156938,156943],{"type":17,"tag":6121,"props":156939,"children":156941},{"className":156940},[],[156942],{"type":23,"value":132224},{"type":23,"value":156944}," is inconsistently exposed.",{"type":17,"tag":84,"props":156946,"children":156947},{},[156948,156950,156956],{"type":23,"value":156949},"Some providers return only ",{"type":17,"tag":6121,"props":156951,"children":156953},{"className":156952},[],[156954],{"type":23,"value":156955},"rejected_reason",{"type":23,"value":54},{"type":17,"tag":84,"props":156958,"children":156959},{},[156960,156965],{"type":17,"tag":6121,"props":156961,"children":156963},{"className":156962},[],[156964],{"type":23,"value":135872},{"type":23,"value":156966}," is supported only in certain integrations.",{"type":17,"tag":84,"props":156968,"children":156969},{},[156970,156972,156978],{"type":23,"value":156971},"When supported, ",{"type":17,"tag":6121,"props":156973,"children":156975},{"className":156974},[],[156976],{"type":23,"value":156977},"offers",{"type":23,"value":156979}," is often marked as a slow field.",{"type":17,"tag":84,"props":156981,"children":156982},{},[156983],{"type":23,"value":156984},"Documentation does not guarantee that outcome fields are populated across integrations.",{"type":17,"tag":29,"props":156986,"children":156987},{},[156988],{"type":17,"tag":48,"props":156989,"children":156990},{},[156991],{"type":23,"value":20076},{"type":17,"tag":29,"props":156993,"children":156994},{},[156995],{"type":23,"value":156996},"Always design training pipelines to handle missing outcome data.",{"type":17,"tag":29,"props":156998,"children":156999},{},[157000],{"type":23,"value":157001},"Example labeling logic:",{"type":17,"tag":6893,"props":157003,"children":157006},{"className":157004,"code":157005,"language":18718,"meta":7},[18716],"if (application.hired_at) label = 'HIRED';\nelse if (application.rejected_at) label = 'REJECTED';\nelse label = 'IN_PROGRESS';\n",[157007],{"type":17,"tag":6121,"props":157008,"children":157009},{"__ignoreMap":7},[157010],{"type":23,"value":157005},{"type":17,"tag":29,"props":157012,"children":157013},{},[157014],{"type":23,"value":157015},"But only when those fields are supported by the integration.",{"type":17,"tag":18,"props":157017,"children":157019},{"id":157018},"step-7-keep-matching-data-up-to-date",[157020],{"type":23,"value":157021},"Step 7: Keep Matching Data Up to Date",{"type":17,"tag":29,"props":157023,"children":157024},{},[157025],{"type":23,"value":157026},"All list endpoints support:",{"type":17,"tag":6893,"props":157028,"children":157031},{"className":157029,"code":157030,"language":20901,"meta":23},[20899],"updated_gte\n",[157032],{"type":17,"tag":6121,"props":157033,"children":157034},{"__ignoreMap":7},[157035],{"type":23,"value":157030},{"type":17,"tag":29,"props":157037,"children":157038},{},[157039],{"type":23,"value":157040},"This enables incremental refresh:",{"type":17,"tag":6893,"props":157042,"children":157045},{"className":157043,"code":157044,"language":18718,"meta":7},[18716],"await sdk.ats.listAtsCandidates({\n  connectionId,\n  updated_gte: lastSyncTimestamp,\n  sort: 'updated_at',\n  order: 'asc',\n});\n",[157046],{"type":17,"tag":6121,"props":157047,"children":157048},{"__ignoreMap":7},[157049],{"type":23,"value":157044},{"type":17,"tag":29,"props":157051,"children":157052},{},[157053,157055,157059],{"type":23,"value":157054},"For near-real-time scoring updates, ATS ",{"type":17,"tag":133,"props":157056,"children":157057},{"href":4999},[157058],{"type":23,"value":5002},{"type":23,"value":157060}," can be subscribed to for:",{"type":17,"tag":80,"props":157062,"children":157063},{},[157064,157073,157082,157091],{"type":17,"tag":84,"props":157065,"children":157066},{},[157067],{"type":17,"tag":6121,"props":157068,"children":157070},{"className":157069},[],[157071],{"type":23,"value":157072},"ats_candidate",{"type":17,"tag":84,"props":157074,"children":157075},{},[157076],{"type":17,"tag":6121,"props":157077,"children":157079},{"className":157078},[],[157080],{"type":23,"value":157081},"ats_application",{"type":17,"tag":84,"props":157083,"children":157084},{},[157085],{"type":17,"tag":6121,"props":157086,"children":157088},{"className":157087},[],[157089],{"type":23,"value":157090},"ats_job",{"type":17,"tag":84,"props":157092,"children":157093},{},[157094],{"type":17,"tag":6121,"props":157095,"children":157097},{"className":157096},[],[157098],{"type":23,"value":157099},"ats_document",{"type":17,"tag":29,"props":157101,"children":157102},{},[157103,157105,157109],{"type":23,"value":157104},"Filter availability varies by integration and applies only to ",{"type":17,"tag":133,"props":157106,"children":157107},{"href":9007},[157108],{"type":23,"value":46572},{"type":23,"value":54},{"type":17,"tag":18,"props":157111,"children":157113},{"id":157112},"putting-it-together",[157114],{"type":23,"value":157115},"Putting It Together",{"type":17,"tag":29,"props":157117,"children":157118},{},[157119],{"type":23,"value":157120},"A defensible candidate-job matching pipeline looks like:",{"type":17,"tag":6154,"props":157122,"children":157123},{},[157124,157129,157134,157139,157144,157149,157154],{"type":17,"tag":84,"props":157125,"children":157126},{},[157127],{"type":23,"value":157128},"Ingest open jobs.",{"type":17,"tag":84,"props":157130,"children":157131},{},[157132],{"type":23,"value":157133},"Ingest candidates.",{"type":17,"tag":84,"props":157135,"children":157136},{},[157137],{"type":23,"value":157138},"Retrieve documents when supported.",{"type":17,"tag":84,"props":157140,"children":157141},{},[157142],{"type":23,"value":157143},"Join via applications.",{"type":17,"tag":84,"props":157145,"children":157146},{},[157147],{"type":23,"value":157148},"Extract structured and unstructured features.",{"type":17,"tag":84,"props":157150,"children":157151},{},[157152],{"type":23,"value":157153},"Train or score candidates.",{"type":17,"tag":84,"props":157155,"children":157156},{},[157157],{"type":23,"value":157158},"Update scores incrementally.",{"type":17,"tag":29,"props":157160,"children":157161},{},[157162],{"type":23,"value":157163},"Unified's ATS API provides the normalized data foundation. It does not impose a scoring model, dedupe logic, or cross-provider guarantees.",{"type":17,"tag":29,"props":157165,"children":157166},{},[157167],{"type":23,"value":157168},"That separation is what makes it safe to build algorithmic matching across heterogeneous ATS systems.",{"type":17,"tag":18,"props":157170,"children":157171},{"id":132938},[157172],{"type":23,"value":132941},{"type":17,"tag":29,"props":157174,"children":157175},{},[157176],{"type":23,"value":157177},"Matching candidates to jobs is not about having perfect data. It's about building resilient models on top of imperfect, provider-variable systems.",{"type":17,"tag":29,"props":157179,"children":157180},{},[157181],{"type":23,"value":157182},"Unified gives you:",{"type":17,"tag":80,"props":157184,"children":157185},{},[157186,157191,157195,157200],{"type":17,"tag":84,"props":157187,"children":157188},{},[157189],{"type":23,"value":157190},"Consistent job and candidate objects",{"type":17,"tag":84,"props":157192,"children":157193},{},[157194],{"type":23,"value":155976},{"type":17,"tag":84,"props":157196,"children":157197},{},[157198],{"type":23,"value":157199},"Resume access when supported",{"type":17,"tag":84,"props":157201,"children":157202},{},[157203],{"type":23,"value":157204},"Incremental sync",{"type":17,"tag":29,"props":157206,"children":157207},{},[157208],{"type":23,"value":157209},"From there, your algorithm determines the match — not the integration layer.",{"type":17,"tag":29,"props":157211,"children":157212},{},[157213],{"type":17,"tag":133,"props":157214,"children":157216},{"href":1612,"rel":157215},[214],[157217],{"type":23,"value":44481},{"type":17,"tag":29,"props":157219,"children":157220},{},[157221],{"type":17,"tag":133,"props":157222,"children":157224},{"href":1623,"rel":157223},[214],[157225],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":157227},[157228,157229,157230,157232,157233,157234,157235,157236,157237,157238,157239,157240],{"id":132141,"depth":1635,"text":132144},{"id":156145,"depth":1635,"text":156148},{"id":156245,"depth":1635,"text":157231},"Important Caveat: skills[]",{"id":156330,"depth":1635,"text":156333},{"id":156431,"depth":1635,"text":156434},{"id":132403,"depth":1635,"text":132144},{"id":156491,"depth":1635,"text":156494},{"id":156543,"depth":1635,"text":156546},{"id":156717,"depth":1635,"text":156720},{"id":156774,"depth":1635,"text":156777},{"id":156809,"depth":1635,"text":156812},{"id":144224,"depth":1635,"text":144227},"content:blog:how_to_match_candidates_to_jobs_using_ats_data_with_unified_ats_api.md","blog/how_to_match_candidates_to_jobs_using_ats_data_with_unified_ats_api.md","blog/how_to_match_candidates_to_jobs_using_ats_data_with_unified_ats_api",{"_path":157245,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":157246,"description":157247,"img":157248,"date":157249,"tag":12,"body":157250,"_type":1677,"_id":158398,"_source":1679,"_file":158399,"_stem":158400,"_extension":1682},"/blog/crm_mcp_servers_overview_use_cases_and_real_time_architecture","CRM MCP Servers: Overview, Use Cases, and Real-Time Architecture","Modern SaaS products don't just read CRM data. They reason over it, summarize it, score it, and increasingly act on it.","https://s3.us-east-2.amazonaws.com/unified-article-images/crm_mcp_servers_overview_use_cases_and_real_time_architecture-icon.png","2026-02-18T21:02:00.000Z",{"type":14,"children":157251,"toc":158374},[157252,157257,157260,157267,157271,157276,157286,157303,157307,157340,157346,157351,157355,157373,157378,157417,157422,157427,157432,157438,157443,157465,157470,157475,157481,157486,157513,157518,157550,157555,157560,157572,157578,157584,157589,157604,157609,157613,157631,157636,157664,157669,157673,157678,157701,157706,157712,157717,157735,157740,157746,157751,157757,157762,157780,157785,157823,157828,157834,157839,157855,157859,157878,157883,157889,157894,157898,157918,157923,157929,157933,157954,157958,157994,157999,158005,158010,158028,158032,158051,158056,158062,158067,158085,158089,158118,158123,158129,158134,158138,158144,158148,158152,158175,158179,158184,158189,158195,158200,158204,158227,158231,158236,158241,158247,158252,158270,158275,158298,158302,158307,158325,158330,158353,158358,158366],{"type":17,"tag":18,"props":157253,"children":157255},{"id":157254},"crm-mcp-servers-overview-use-cases-and-real-time-architecture",[157256],{"type":23,"value":157246},{"type":17,"tag":25,"props":157258,"children":157259},{},[],{"type":17,"tag":29,"props":157261,"children":157262},{},[157263],{"type":17,"tag":33,"props":157264,"children":157265},{},[157266],{"type":23,"value":155944},{"type":17,"tag":29,"props":157268,"children":157269},{},[157270],{"type":23,"value":157247},{"type":17,"tag":29,"props":157272,"children":157273},{},[157274],{"type":23,"value":157275},"If your product embeds AI features that depend on customer CRM data, you need more than static context. You need authorized reads and writes across Salesforce, HubSpot, Pipedrive, and other CRM systems — without building and maintaining each integration separately.",{"type":17,"tag":29,"props":157277,"children":157278},{},[157279,157281,157285],{"type":23,"value":157280},"This is where CRM + ",{"type":17,"tag":133,"props":157282,"children":157283},{"href":326},[157284],{"type":23,"value":329},{"type":23,"value":143931},{"type":17,"tag":29,"props":157287,"children":157288},{},[157289,157291,157295,157297,157301],{"type":23,"value":157290},"Unified's CRM category provides a normalized, real-time ",{"type":17,"tag":133,"props":157292,"children":157293},{"href":61562},[157294],{"type":23,"value":61565},{"type":23,"value":157296}," across supported providers. ",{"type":17,"tag":133,"props":157298,"children":157299},{"href":326},[157300],{"type":23,"value":45418},{"type":23,"value":157302}," allows LLMs to call those CRM operations as structured tools.",{"type":17,"tag":29,"props":157304,"children":157305},{},[157306],{"type":23,"value":143947},{"type":17,"tag":80,"props":157308,"children":157309},{},[157310,157315,157320,157325,157330,157335],{"type":17,"tag":84,"props":157311,"children":157312},{},[157313],{"type":23,"value":157314},"What a CRM MCP server is",{"type":17,"tag":84,"props":157316,"children":157317},{},[157318],{"type":23,"value":157319},"How it executes technically",{"type":17,"tag":84,"props":157321,"children":157322},{},[157323],{"type":23,"value":157324},"What CRM tools are available",{"type":17,"tag":84,"props":157326,"children":157327},{},[157328],{"type":23,"value":157329},"Practical constraints engineers must plan for",{"type":17,"tag":84,"props":157331,"children":157332},{},[157333],{"type":23,"value":157334},"AI-native CRM use cases",{"type":17,"tag":84,"props":157336,"children":157337},{},[157338],{"type":23,"value":157339},"When to use the CRM API vs MCP",{"type":17,"tag":68,"props":157341,"children":157343},{"id":157342},"what-is-a-crm-mcp-server",[157344],{"type":23,"value":157345},"What Is a CRM MCP Server?",{"type":17,"tag":29,"props":157347,"children":157348},{},[157349],{"type":23,"value":157350},"A CRM MCP server is the MCP layer built on top of the Unified CRM category API.",{"type":17,"tag":29,"props":157352,"children":157353},{},[157354],{"type":23,"value":144000},{"type":17,"tag":80,"props":157356,"children":157357},{},[157358,157363,157368],{"type":17,"tag":84,"props":157359,"children":157360},{},[157361],{"type":23,"value":157362},"The CRM category provides consistent objects such as Contact, Company, Deal, Lead, Event, and Pipeline across CRM providers.",{"type":17,"tag":84,"props":157364,"children":157365},{},[157366],{"type":23,"value":157367},"Each object supports documented read and write operations.",{"type":17,"tag":84,"props":157369,"children":157370},{},[157371],{"type":23,"value":157372},"The MCP server sits on top of the Unified API, and each tool call maps to one API request.",{"type":17,"tag":29,"props":157374,"children":157375},{},[157376],{"type":23,"value":157377},"In practice, an LLM sees CRM actions as structured tools like:",{"type":17,"tag":80,"props":157379,"children":157380},{},[157381,157390,157399,157408],{"type":17,"tag":84,"props":157382,"children":157383},{},[157384],{"type":17,"tag":6121,"props":157385,"children":157387},{"className":157386},[],[157388],{"type":23,"value":157389},"listCrmDeals",{"type":17,"tag":84,"props":157391,"children":157392},{},[157393],{"type":17,"tag":6121,"props":157394,"children":157396},{"className":157395},[],[157397],{"type":23,"value":157398},"getCrmContact",{"type":17,"tag":84,"props":157400,"children":157401},{},[157402],{"type":17,"tag":6121,"props":157403,"children":157405},{"className":157404},[],[157406],{"type":23,"value":157407},"patchCrmDeal",{"type":17,"tag":84,"props":157409,"children":157410},{},[157411],{"type":17,"tag":6121,"props":157412,"children":157414},{"className":157413},[],[157415],{"type":23,"value":157416},"createCrmLead",{"type":17,"tag":29,"props":157418,"children":157419},{},[157420],{"type":23,"value":157421},"When invoked:",{"type":17,"tag":29,"props":157423,"children":157424},{},[157425],{"type":23,"value":157426},"User → LLM → CRM tool call → Unified CRM API → Source CRM",{"type":17,"tag":29,"props":157428,"children":157429},{},[157430],{"type":23,"value":157431},"Each tool call executes directly against the connected CRM system. There is no caching layer and no replicated CRM database inside Unified. Every read or write reflects the current state of the source system.",{"type":17,"tag":68,"props":157433,"children":157435},{"id":157434},"how-crm-mcp-executes",[157436],{"type":23,"value":157437},"How CRM MCP Executes",{"type":17,"tag":29,"props":157439,"children":157440},{},[157441],{"type":23,"value":157442},"Execution is straightforward:",{"type":17,"tag":80,"props":157444,"children":157445},{},[157446,157450,157455,157460],{"type":17,"tag":84,"props":157447,"children":157448},{},[157449],{"type":23,"value":150835},{"type":17,"tag":84,"props":157451,"children":157452},{},[157453],{"type":23,"value":157454},"The MCP server executes the corresponding Unified CRM API endpoint.",{"type":17,"tag":84,"props":157456,"children":157457},{},[157458],{"type":23,"value":157459},"The request is routed directly to the source CRM.",{"type":17,"tag":84,"props":157461,"children":157462},{},[157463],{"type":23,"value":157464},"The structured result is returned to the model.",{"type":17,"tag":29,"props":157466,"children":157467},{},[157468],{"type":23,"value":157469},"Each tool call counts as one Unified API request. Provider rate limits still apply because requests are passed through to the underlying CRM system.",{"type":17,"tag":29,"props":157471,"children":157472},{},[157473],{"type":23,"value":157474},"There is no background sync process and no intermediate storage of customer CRM data.",{"type":17,"tag":68,"props":157476,"children":157478},{"id":157477},"unified-crm-tool-surface",[157479],{"type":23,"value":157480},"Unified CRM Tool Surface",{"type":17,"tag":29,"props":157482,"children":157483},{},[157484],{"type":23,"value":157485},"The CRM category provides six normalized objects:",{"type":17,"tag":80,"props":157487,"children":157488},{},[157489,157493,157497,157501,157505,157509],{"type":17,"tag":84,"props":157490,"children":157491},{},[157492],{"type":23,"value":25810},{"type":17,"tag":84,"props":157494,"children":157495},{},[157496],{"type":23,"value":25828},{"type":17,"tag":84,"props":157498,"children":157499},{},[157500],{"type":23,"value":25846},{"type":17,"tag":84,"props":157502,"children":157503},{},[157504],{"type":23,"value":62749},{"type":17,"tag":84,"props":157506,"children":157507},{},[157508],{"type":23,"value":14528},{"type":17,"tag":84,"props":157510,"children":157511},{},[157512],{"type":23,"value":62847},{"type":17,"tag":29,"props":157514,"children":157515},{},[157516],{"type":23,"value":157517},"Each object supports:",{"type":17,"tag":80,"props":157519,"children":157520},{},[157521,157526,157531,157536,157540,157545],{"type":17,"tag":84,"props":157522,"children":157523},{},[157524],{"type":23,"value":157525},"Create (POST)",{"type":17,"tag":84,"props":157527,"children":157528},{},[157529],{"type":23,"value":157530},"List (GET collection)",{"type":17,"tag":84,"props":157532,"children":157533},{},[157534],{"type":23,"value":157535},"Retrieve (GET by ID)",{"type":17,"tag":84,"props":157537,"children":157538},{},[157539],{"type":23,"value":145794},{"type":17,"tag":84,"props":157541,"children":157542},{},[157543],{"type":23,"value":157544},"Partial update (PATCH)",{"type":17,"tag":84,"props":157546,"children":157547},{},[157548],{"type":23,"value":157549},"Delete (DELETE)",{"type":17,"tag":29,"props":157551,"children":157552},{},[157553],{"type":23,"value":157554},"That results in 36 unified tools per CRM integration.",{"type":17,"tag":29,"props":157556,"children":157557},{},[157558],{"type":23,"value":157559},"Unified currently supports dozens of CRM integrations. The object model and operation set remain consistent across providers.",{"type":17,"tag":29,"props":157561,"children":157562},{},[157563,157565,157570],{"type":23,"value":157564},"If you enable ",{"type":17,"tag":6121,"props":157566,"children":157568},{"className":157567},[],[157569],{"type":23,"value":142274},{"type":23,"value":157571},", vendor-specific endpoints can also be made available, which expands the tool surface beyond the unified object model. In production deployments, tool surface should be intentionally restricted.",{"type":17,"tag":68,"props":157573,"children":157575},{"id":157574},"practical-constraints-engineers-must-plan-for",[157576],{"type":23,"value":157577},"Practical Constraints Engineers Must Plan For",{"type":17,"tag":239,"props":157579,"children":157581},{"id":157580},"llm-tool-limits",[157582],{"type":23,"value":157583},"LLM Tool Limits",{"type":17,"tag":29,"props":157585,"children":157586},{},[157587],{"type":23,"value":157588},"Current LLM models impose limits on the number of tools they can handle:",{"type":17,"tag":80,"props":157590,"children":157591},{},[157592,157596,157600],{"type":17,"tag":84,"props":157593,"children":157594},{},[157595],{"type":23,"value":155671},{"type":17,"tag":84,"props":157597,"children":157598},{},[157599],{"type":23,"value":155676},{"type":17,"tag":84,"props":157601,"children":157602},{},[157603],{"type":23,"value":155681},{"type":17,"tag":29,"props":157605,"children":157606},{},[157607],{"type":23,"value":157608},"A single CRM integration exposes 36 unified tools.",{"type":17,"tag":29,"props":157610,"children":157611},{},[157612],{"type":23,"value":7403},{"type":17,"tag":80,"props":157614,"children":157615},{},[157616,157621,157626],{"type":17,"tag":84,"props":157617,"children":157618},{},[157619],{"type":23,"value":157620},"Groq → 36 exceeds the limit.",{"type":17,"tag":84,"props":157622,"children":157623},{},[157624],{"type":23,"value":157625},"OpenAI → 36 exceeds the limit.",{"type":17,"tag":84,"props":157627,"children":157628},{},[157629],{"type":23,"value":157630},"Cohere → 36 fits within the limit.",{"type":17,"tag":29,"props":157632,"children":157633},{},[157634],{"type":23,"value":157635},"CRM MCP deployments must restrict the tool surface using:",{"type":17,"tag":80,"props":157637,"children":157638},{},[157639,157647,157655],{"type":17,"tag":84,"props":157640,"children":157641},{},[157642],{"type":17,"tag":6121,"props":157643,"children":157645},{"className":157644},[],[157646],{"type":23,"value":24204},{"type":17,"tag":84,"props":157648,"children":157649},{},[157650],{"type":17,"tag":6121,"props":157651,"children":157653},{"className":157652},[],[157654],{"type":23,"value":131599},{"type":17,"tag":84,"props":157656,"children":157657},{},[157658,157663],{"type":17,"tag":6121,"props":157659,"children":157661},{"className":157660},[],[157662],{"type":23,"value":131610},{"type":23,"value":153728},{"type":17,"tag":29,"props":157665,"children":157666},{},[157667],{"type":23,"value":157668},"Tool restriction is part of production design, not an afterthought.",{"type":17,"tag":239,"props":157670,"children":157671},{"id":144224},[157672],{"type":23,"value":144227},{"type":17,"tag":29,"props":157674,"children":157675},{},[157676],{"type":23,"value":157677},"CRM behavior differs by provider:",{"type":17,"tag":80,"props":157679,"children":157680},{},[157681,157686,157691,157696],{"type":17,"tag":84,"props":157682,"children":157683},{},[157684],{"type":23,"value":157685},"Stage semantics vary.",{"type":17,"tag":84,"props":157687,"children":157688},{},[157689],{"type":23,"value":157690},"Lead conversion logic varies.",{"type":17,"tag":84,"props":157692,"children":157693},{},[157694],{"type":23,"value":157695},"Custom fields vary.",{"type":17,"tag":84,"props":157697,"children":157698},{},[157699],{"type":23,"value":157700},"Rate limits vary.",{"type":17,"tag":29,"props":157702,"children":157703},{},[157704],{"type":23,"value":157705},"The unified object model standardizes structure, but provider-specific constraints still apply at execution time. Agents must handle validation failures, permission mismatches, and rate limits gracefully.",{"type":17,"tag":239,"props":157707,"children":157709},{"id":157708},"real-time-execution-means-provider-limits-apply",[157710],{"type":23,"value":157711},"Real-Time Execution Means Provider Limits Apply",{"type":17,"tag":29,"props":157713,"children":157714},{},[157715],{"type":23,"value":157716},"Because each tool call hits the source CRM directly:",{"type":17,"tag":80,"props":157718,"children":157719},{},[157720,157725,157730],{"type":17,"tag":84,"props":157721,"children":157722},{},[157723],{"type":23,"value":157724},"Provider rate limits still apply.",{"type":17,"tag":84,"props":157726,"children":157727},{},[157728],{"type":23,"value":157729},"High-volume listing or update patterns must be managed carefully.",{"type":17,"tag":84,"props":157731,"children":157732},{},[157733],{"type":23,"value":157734},"Bulk mutations should be avoided inside a single agent loop.",{"type":17,"tag":29,"props":157736,"children":157737},{},[157738],{"type":23,"value":157739},"CRM MCP does not buffer or batch writes — it executes them.",{"type":17,"tag":68,"props":157741,"children":157743},{"id":157742},"crm-mcp-use-cases-for-ai-native-saas-products",[157744],{"type":23,"value":157745},"CRM MCP Use Cases for AI-Native SaaS Products",{"type":17,"tag":29,"props":157747,"children":157748},{},[157749],{"type":23,"value":157750},"These are embedded AI features inside your product — not external automation scripts.",{"type":17,"tag":239,"props":157752,"children":157754},{"id":157753},"in-product-sales-copilot",[157755],{"type":23,"value":157756},"In-Product Sales Copilot",{"type":17,"tag":29,"props":157758,"children":157759},{},[157760],{"type":23,"value":157761},"Surface:",{"type":17,"tag":80,"props":157763,"children":157764},{},[157765,157770,157775],{"type":17,"tag":84,"props":157766,"children":157767},{},[157768],{"type":23,"value":157769},"Open deals",{"type":17,"tag":84,"props":157771,"children":157772},{},[157773],{"type":23,"value":157774},"Recent contact activity",{"type":17,"tag":84,"props":157776,"children":157777},{},[157778],{"type":23,"value":157779},"Company history",{"type":17,"tag":29,"props":157781,"children":157782},{},[157783],{"type":23,"value":157784},"Tools:",{"type":17,"tag":80,"props":157786,"children":157787},{},[157788,157796,157805,157814],{"type":17,"tag":84,"props":157789,"children":157790},{},[157791],{"type":17,"tag":6121,"props":157792,"children":157794},{"className":157793},[],[157795],{"type":23,"value":157389},{"type":17,"tag":84,"props":157797,"children":157798},{},[157799],{"type":17,"tag":6121,"props":157800,"children":157802},{"className":157801},[],[157803],{"type":23,"value":157804},"getCrmDeal",{"type":17,"tag":84,"props":157806,"children":157807},{},[157808],{"type":17,"tag":6121,"props":157809,"children":157811},{"className":157810},[],[157812],{"type":23,"value":157813},"listCrmContacts",{"type":17,"tag":84,"props":157815,"children":157816},{},[157817],{"type":17,"tag":6121,"props":157818,"children":157820},{"className":157819},[],[157821],{"type":23,"value":157822},"listCrmEvents",{"type":17,"tag":29,"props":157824,"children":157825},{},[157826],{"type":23,"value":157827},"Real-time reads ensure the copilot reflects the current deal stage and latest activity.",{"type":17,"tag":239,"props":157829,"children":157831},{"id":157830},"ai-driven-deal-stage-assistant",[157832],{"type":23,"value":157833},"AI-Driven Deal Stage Assistant",{"type":17,"tag":29,"props":157835,"children":157836},{},[157837],{"type":23,"value":157838},"During a call, the model can:",{"type":17,"tag":80,"props":157840,"children":157841},{},[157842,157846,157851],{"type":17,"tag":84,"props":157843,"children":157844},{},[157845],{"type":23,"value":136092},{"type":17,"tag":84,"props":157847,"children":157848},{},[157849],{"type":23,"value":157850},"Update amount",{"type":17,"tag":84,"props":157852,"children":157853},{},[157854],{"type":23,"value":151435},{"type":17,"tag":29,"props":157856,"children":157857},{},[157858],{"type":23,"value":157784},{"type":17,"tag":80,"props":157860,"children":157861},{},[157862,157870],{"type":17,"tag":84,"props":157863,"children":157864},{},[157865],{"type":17,"tag":6121,"props":157866,"children":157868},{"className":157867},[],[157869],{"type":23,"value":157804},{"type":17,"tag":84,"props":157871,"children":157872},{},[157873],{"type":17,"tag":6121,"props":157874,"children":157876},{"className":157875},[],[157877],{"type":23,"value":157407},{"type":17,"tag":29,"props":157879,"children":157880},{},[157881],{"type":23,"value":157882},"Updates execute immediately against the source CRM.",{"type":17,"tag":239,"props":157884,"children":157886},{"id":157885},"revenue-forecasting-module",[157887],{"type":23,"value":157888},"Revenue Forecasting Module",{"type":17,"tag":29,"props":157890,"children":157891},{},[157892],{"type":23,"value":157893},"Aggregate open deals and pipeline definitions inside your product.",{"type":17,"tag":29,"props":157895,"children":157896},{},[157897],{"type":23,"value":157784},{"type":17,"tag":80,"props":157899,"children":157900},{},[157901,157909],{"type":17,"tag":84,"props":157902,"children":157903},{},[157904],{"type":17,"tag":6121,"props":157905,"children":157907},{"className":157906},[],[157908],{"type":23,"value":157389},{"type":17,"tag":84,"props":157910,"children":157911},{},[157912],{"type":17,"tag":6121,"props":157913,"children":157915},{"className":157914},[],[157916],{"type":23,"value":157917},"listCrmPipelines",{"type":17,"tag":29,"props":157919,"children":157920},{},[157921],{"type":23,"value":157922},"Forecasts are based on live pipeline state.",{"type":17,"tag":239,"props":157924,"children":157926},{"id":157925},"account-360-view",[157927],{"type":23,"value":157928},"Account 360 View",{"type":17,"tag":29,"props":157930,"children":157931},{},[157932],{"type":23,"value":132559},{"type":17,"tag":80,"props":157934,"children":157935},{},[157936,157940,157944,157949],{"type":17,"tag":84,"props":157937,"children":157938},{},[157939],{"type":23,"value":31619},{"type":17,"tag":84,"props":157941,"children":157942},{},[157943],{"type":23,"value":56943},{"type":17,"tag":84,"props":157945,"children":157946},{},[157947],{"type":23,"value":157948},"Active deals",{"type":17,"tag":84,"props":157950,"children":157951},{},[157952],{"type":23,"value":157953},"Recent events",{"type":17,"tag":29,"props":157955,"children":157956},{},[157957],{"type":23,"value":157784},{"type":17,"tag":80,"props":157959,"children":157960},{},[157961,157970,157978,157986],{"type":17,"tag":84,"props":157962,"children":157963},{},[157964],{"type":17,"tag":6121,"props":157965,"children":157967},{"className":157966},[],[157968],{"type":23,"value":157969},"listCrmCompanies",{"type":17,"tag":84,"props":157971,"children":157972},{},[157973],{"type":17,"tag":6121,"props":157974,"children":157976},{"className":157975},[],[157977],{"type":23,"value":157813},{"type":17,"tag":84,"props":157979,"children":157980},{},[157981],{"type":17,"tag":6121,"props":157982,"children":157984},{"className":157983},[],[157985],{"type":23,"value":157389},{"type":17,"tag":84,"props":157987,"children":157988},{},[157989],{"type":17,"tag":6121,"props":157990,"children":157992},{"className":157991},[],[157993],{"type":23,"value":157822},{"type":17,"tag":29,"props":157995,"children":157996},{},[157997],{"type":23,"value":157998},"The same logic works across Salesforce, HubSpot, Pipedrive, and others because the object model is normalized.",{"type":17,"tag":239,"props":158000,"children":158002},{"id":158001},"churn-risk-detection",[158003],{"type":23,"value":158004},"Churn Risk Detection",{"type":17,"tag":29,"props":158006,"children":158007},{},[158008],{"type":23,"value":158009},"Detect:",{"type":17,"tag":80,"props":158011,"children":158012},{},[158013,158018,158023],{"type":17,"tag":84,"props":158014,"children":158015},{},[158016],{"type":23,"value":158017},"Stalled deals",{"type":17,"tag":84,"props":158019,"children":158020},{},[158021],{"type":23,"value":158022},"Reduced engagement",{"type":17,"tag":84,"props":158024,"children":158025},{},[158026],{"type":23,"value":158027},"Declining pipeline movement",{"type":17,"tag":29,"props":158029,"children":158030},{},[158031],{"type":23,"value":157784},{"type":17,"tag":80,"props":158033,"children":158034},{},[158035,158043],{"type":17,"tag":84,"props":158036,"children":158037},{},[158038],{"type":17,"tag":6121,"props":158039,"children":158041},{"className":158040},[],[158042],{"type":23,"value":157389},{"type":17,"tag":84,"props":158044,"children":158045},{},[158046],{"type":17,"tag":6121,"props":158047,"children":158049},{"className":158048},[],[158050],{"type":23,"value":157822},{"type":17,"tag":29,"props":158052,"children":158053},{},[158054],{"type":23,"value":158055},"Risk scoring reflects current CRM state.",{"type":17,"tag":239,"props":158057,"children":158059},{"id":158058},"ai-assisted-lead-qualification",[158060],{"type":23,"value":158061},"AI-Assisted Lead Qualification",{"type":17,"tag":29,"props":158063,"children":158064},{},[158065],{"type":23,"value":158066},"Analyze:",{"type":17,"tag":80,"props":158068,"children":158069},{},[158070,158075,158080],{"type":17,"tag":84,"props":158071,"children":158072},{},[158073],{"type":23,"value":158074},"Lead records",{"type":17,"tag":84,"props":158076,"children":158077},{},[158078],{"type":23,"value":158079},"Associated company data",{"type":17,"tag":84,"props":158081,"children":158082},{},[158083],{"type":23,"value":158084},"Related deal history",{"type":17,"tag":29,"props":158086,"children":158087},{},[158088],{"type":23,"value":157784},{"type":17,"tag":80,"props":158090,"children":158091},{},[158092,158101,158110],{"type":17,"tag":84,"props":158093,"children":158094},{},[158095],{"type":17,"tag":6121,"props":158096,"children":158098},{"className":158097},[],[158099],{"type":23,"value":158100},"listCrmLeads",{"type":17,"tag":84,"props":158102,"children":158103},{},[158104],{"type":17,"tag":6121,"props":158105,"children":158107},{"className":158106},[],[158108],{"type":23,"value":158109},"getCrmLead",{"type":17,"tag":84,"props":158111,"children":158112},{},[158113],{"type":17,"tag":6121,"props":158114,"children":158116},{"className":158115},[],[158117],{"type":23,"value":157969},{"type":17,"tag":29,"props":158119,"children":158120},{},[158121],{"type":23,"value":158122},"Lead updates can be written directly back to the CRM.",{"type":17,"tag":68,"props":158124,"children":158126},{"id":158125},"unified-crm-api-or-crm-mcp",[158127],{"type":23,"value":158128},"Unified CRM API or CRM MCP?",{"type":17,"tag":29,"props":158130,"children":158131},{},[158132],{"type":23,"value":158133},"Both use the same real-time, pass-through CRM category infrastructure.",{"type":17,"tag":29,"props":158135,"children":158136},{},[158137],{"type":23,"value":151200},{"type":17,"tag":239,"props":158139,"children":158141},{"id":158140},"use-the-unified-crm-api-when",[158142],{"type":23,"value":158143},"Use the Unified CRM API when:",{"type":17,"tag":29,"props":158145,"children":158146},{},[158147],{"type":23,"value":144540},{"type":17,"tag":29,"props":158149,"children":158150},{},[158151],{"type":23,"value":377},{"type":17,"tag":80,"props":158153,"children":158154},{},[158155,158160,158165,158170],{"type":17,"tag":84,"props":158156,"children":158157},{},[158158],{"type":23,"value":158159},"Building revenue dashboards",{"type":17,"tag":84,"props":158161,"children":158162},{},[158163],{"type":23,"value":158164},"Training internal ML models",{"type":17,"tag":84,"props":158166,"children":158167},{},[158168],{"type":23,"value":158169},"Running enrichment jobs",{"type":17,"tag":84,"props":158171,"children":158172},{},[158173],{"type":23,"value":158174},"Feeding data into your own RAG pipeline",{"type":17,"tag":29,"props":158176,"children":158177},{},[158178],{"type":23,"value":144560},{"type":17,"tag":29,"props":158180,"children":158181},{},[158182],{"type":23,"value":158183},"App → Unified CRM API → Source CRM",{"type":17,"tag":29,"props":158185,"children":158186},{},[158187],{"type":23,"value":158188},"You decide which operations run and when.",{"type":17,"tag":239,"props":158190,"children":158192},{"id":158191},"use-crm-mcp-when",[158193],{"type":23,"value":158194},"Use CRM MCP when:",{"type":17,"tag":29,"props":158196,"children":158197},{},[158198],{"type":23,"value":158199},"An LLM decides which CRM action to execute.",{"type":17,"tag":29,"props":158201,"children":158202},{},[158203],{"type":23,"value":377},{"type":17,"tag":80,"props":158205,"children":158206},{},[158207,158212,158217,158222],{"type":17,"tag":84,"props":158208,"children":158209},{},[158210],{"type":23,"value":158211},"An in-product copilot updates deal stage",{"type":17,"tag":84,"props":158213,"children":158214},{},[158215],{"type":23,"value":158216},"An AI assistant creates a lead",{"type":17,"tag":84,"props":158218,"children":158219},{},[158220],{"type":23,"value":158221},"A chatbot retrieves contact data",{"type":17,"tag":84,"props":158223,"children":158224},{},[158225],{"type":23,"value":158226},"A model posts notes into CRM",{"type":17,"tag":29,"props":158228,"children":158229},{},[158230],{"type":23,"value":144560},{"type":17,"tag":29,"props":158232,"children":158233},{},[158234],{"type":23,"value":158235},"User → LLM → Tool call → Unified CRM API → Source CRM",{"type":17,"tag":29,"props":158237,"children":158238},{},[158239],{"type":23,"value":158240},"The model selects the tool. The MCP server executes it.",{"type":17,"tag":68,"props":158242,"children":158244},{"id":158243},"architectural-difference",[158245],{"type":23,"value":158246},"Architectural Difference",{"type":17,"tag":29,"props":158248,"children":158249},{},[158250],{"type":23,"value":158251},"Unified CRM API:",{"type":17,"tag":80,"props":158253,"children":158254},{},[158255,158260,158265],{"type":17,"tag":84,"props":158256,"children":158257},{},[158258],{"type":23,"value":158259},"Your application controls execution.",{"type":17,"tag":84,"props":158261,"children":158262},{},[158263],{"type":23,"value":158264},"You manage orchestration.",{"type":17,"tag":84,"props":158266,"children":158267},{},[158268],{"type":23,"value":158269},"The model consumes data after your system processes it.",{"type":17,"tag":29,"props":158271,"children":158272},{},[158273],{"type":23,"value":158274},"CRM MCP:",{"type":17,"tag":80,"props":158276,"children":158277},{},[158278,158283,158288,158293],{"type":17,"tag":84,"props":158279,"children":158280},{},[158281],{"type":23,"value":158282},"The model selects structured tools.",{"type":17,"tag":84,"props":158284,"children":158285},{},[158286],{"type":23,"value":158287},"Each tool call maps directly to a CRM API request.",{"type":17,"tag":84,"props":158289,"children":158290},{},[158291],{"type":23,"value":158292},"Tool availability is restricted by connection permissions.",{"type":17,"tag":84,"props":158294,"children":158295},{},[158296],{"type":23,"value":158297},"Execution remains real-time and pass-through.",{"type":17,"tag":68,"props":158299,"children":158300},{"id":883},[158301],{"type":23,"value":19178},{"type":17,"tag":29,"props":158303,"children":158304},{},[158305],{"type":23,"value":158306},"If you're embedding AI features inside a B2B SaaS product:",{"type":17,"tag":80,"props":158308,"children":158309},{},[158310,158315,158320],{"type":17,"tag":84,"props":158311,"children":158312},{},[158313],{"type":23,"value":158314},"You cannot rely on stale CRM snapshots.",{"type":17,"tag":84,"props":158316,"children":158317},{},[158318],{"type":23,"value":158319},"You cannot maintain separate integrations per CRM.",{"type":17,"tag":84,"props":158321,"children":158322},{},[158323],{"type":23,"value":158324},"You cannot expose 36 tools to a model that only supports 20.",{"type":17,"tag":29,"props":158326,"children":158327},{},[158328],{"type":23,"value":158329},"CRM MCP works when:",{"type":17,"tag":80,"props":158331,"children":158332},{},[158333,158338,158343,158348],{"type":17,"tag":84,"props":158334,"children":158335},{},[158336],{"type":23,"value":158337},"Tool surface is intentionally restricted.",{"type":17,"tag":84,"props":158339,"children":158340},{},[158341],{"type":23,"value":158342},"Authorization boundaries are enforced.",{"type":17,"tag":84,"props":158344,"children":158345},{},[158346],{"type":23,"value":158347},"Reads and writes execute in real time.",{"type":17,"tag":84,"props":158349,"children":158350},{},[158351],{"type":23,"value":158352},"CRM objects are normalized at the category level.",{"type":17,"tag":29,"props":158354,"children":158355},{},[158356],{"type":23,"value":158357},"CRM + MCP makes CRM data agent-executable — without building per-provider integrations and without storing customer CRM data.",{"type":17,"tag":29,"props":158359,"children":158360},{},[158361],{"type":17,"tag":133,"props":158362,"children":158364},{"href":1612,"rel":158363},[214],[158365],{"type":23,"value":44481},{"type":17,"tag":29,"props":158367,"children":158368},{},[158369],{"type":17,"tag":133,"props":158370,"children":158372},{"href":1623,"rel":158371},[214],[158373],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":158375},[158376,158377,158378,158379,158384,158392,158396,158397],{"id":157342,"depth":1629,"text":157345},{"id":157434,"depth":1629,"text":157437},{"id":157477,"depth":1629,"text":157480},{"id":157574,"depth":1629,"text":157577,"children":158380},[158381,158382,158383],{"id":157580,"depth":1635,"text":157583},{"id":144224,"depth":1635,"text":144227},{"id":157708,"depth":1635,"text":157711},{"id":157742,"depth":1629,"text":157745,"children":158385},[158386,158387,158388,158389,158390,158391],{"id":157753,"depth":1635,"text":157756},{"id":157830,"depth":1635,"text":157833},{"id":157885,"depth":1635,"text":157888},{"id":157925,"depth":1635,"text":157928},{"id":158001,"depth":1635,"text":158004},{"id":158058,"depth":1635,"text":158061},{"id":158125,"depth":1629,"text":158128,"children":158393},[158394,158395],{"id":158140,"depth":1635,"text":158143},{"id":158191,"depth":1635,"text":158194},{"id":158243,"depth":1629,"text":158246},{"id":883,"depth":1629,"text":19178},"content:blog:crm_mcp_servers_overview_use_cases_and_real_time_architecture.md","blog/crm_mcp_servers_overview_use_cases_and_real_time_architecture.md","blog/crm_mcp_servers_overview_use_cases_and_real_time_architecture",{"_path":158402,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":158403,"description":158404,"img":158405,"date":158406,"tag":6341,"body":158407,"_type":1677,"_id":159273,"_source":1679,"_file":159274,"_stem":159275,"_extension":1682},"/blog/how_to_set_up_linkedin_webhooks_with_unified","How to Set Up LinkedIn Webhooks with Unified","LinkedIn's Organization Social Action Notifications let you receive real-time updates when people interact with your company page -- likes, comments, shares,...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_linkedin_webhooks_with_unified-icon.png","2026-02-14T23:04:00.000Z",{"type":14,"children":158408,"toc":159264},[158409,158414,158417,158425,158430,158439,158453,158471,158480,158485,158493,158560,158568,158573,158633,158644,158658,158663,158722,158730,158735,158772,158777,158786,158806,158814,158819,158824,158838,158843,158851,158909,158914,158923,158944,158949,158954,158959,158967,158972,158981,158993,159094,159128,159137,159142,159151,159178,159185,159210,159227,159243,159248,159256],{"type":17,"tag":18,"props":158410,"children":158412},{"id":158411},"how-to-set-up-linkedin-webhooks-with-unified",[158413],{"type":23,"value":158403},{"type":17,"tag":25,"props":158415,"children":158416},{},[],{"type":17,"tag":29,"props":158418,"children":158419},{},[158420],{"type":17,"tag":33,"props":158421,"children":158422},{},[158423],{"type":23,"value":158424},"February 14, 2026",{"type":17,"tag":29,"props":158426,"children":158427},{},[158428],{"type":23,"value":158429},"LinkedIn's Organization Social Action Notifications let you receive real-time updates when people interact with your company page -- likes, comments, shares, and mentions. With Unified, you can subscribe to these events through the same webhook API you use for every other integration, so there's no need to learn LinkedIn's proprietary webhook protocol.",{"type":17,"tag":68,"props":158431,"children":158433},{"id":158432},"what-youll-need",[158434],{"type":17,"tag":48,"props":158435,"children":158436},{},[158437],{"type":23,"value":158438},"What You'll Need",{"type":17,"tag":29,"props":158440,"children":158441},{},[158442,158444,158451],{"type":23,"value":158443},"Before starting, review the ",{"type":17,"tag":133,"props":158445,"children":158448},{"href":158446,"rel":158447},"https://docs.unified.to/guides/getting_started_with_unified",[214],[158449],{"type":23,"value":158450},"Getting Started with Unified",{"type":23,"value":158452}," article if you haven't already. You'll also need:",{"type":17,"tag":80,"props":158454,"children":158455},{},[158456,158461,158466],{"type":17,"tag":84,"props":158457,"children":158458},{},[158459],{"type":23,"value":158460},"A LinkedIn developer app (see setup instructions below)",{"type":17,"tag":84,"props":158462,"children":158463},{},[158464],{"type":23,"value":158465},"A LinkedIn connection created through Unified's embedded auth flow",{"type":17,"tag":84,"props":158467,"children":158468},{},[158469],{"type":23,"value":158470},"A publicly accessible URL to receive webhook events",{"type":17,"tag":68,"props":158472,"children":158474},{"id":158473},"setting-up-your-linkedin-developer-app",[158475],{"type":17,"tag":48,"props":158476,"children":158477},{},[158478],{"type":23,"value":158479},"Setting Up Your LinkedIn Developer App",{"type":17,"tag":29,"props":158481,"children":158482},{},[158483],{"type":23,"value":158484},"Before you can receive webhook events, you need a LinkedIn app configured with the right products and permissions.",{"type":17,"tag":29,"props":158486,"children":158487},{},[158488],{"type":17,"tag":48,"props":158489,"children":158490},{},[158491],{"type":23,"value":158492},"Creating the App",{"type":17,"tag":6154,"props":158494,"children":158495},{},[158496,158513,158550],{"type":17,"tag":84,"props":158497,"children":158498},{},[158499,158500,158507,158509],{"type":23,"value":42072},{"type":17,"tag":133,"props":158501,"children":158504},{"href":158502,"rel":158503},"https://www.linkedin.com/developers/apps",[214],[158505],{"type":23,"value":158506},"linkedin.com/developers/apps",{"type":23,"value":158508},"and click ",{"type":17,"tag":48,"props":158510,"children":158511},{},[158512],{"type":23,"value":6525},{"type":17,"tag":84,"props":158514,"children":158515},{},[158516,158518],{"type":23,"value":158517},"Fill in the required fields:\n",{"type":17,"tag":80,"props":158519,"children":158520},{},[158521,158530,158540],{"type":17,"tag":84,"props":158522,"children":158523},{},[158524,158528],{"type":17,"tag":48,"props":158525,"children":158526},{},[158527],{"type":23,"value":6418},{"type":23,"value":158529},": Your application's name",{"type":17,"tag":84,"props":158531,"children":158532},{},[158533,158538],{"type":17,"tag":48,"props":158534,"children":158535},{},[158536],{"type":23,"value":158537},"LinkedIn Page",{"type":23,"value":158539},": Select the LinkedIn company page you want to monitor (you must be an admin of the page)",{"type":17,"tag":84,"props":158541,"children":158542},{},[158543,158548],{"type":17,"tag":48,"props":158544,"children":158545},{},[158546],{"type":23,"value":158547},"App logo",{"type":23,"value":158549},": Upload a logo for your app",{"type":17,"tag":84,"props":158551,"children":158552},{},[158553,158555],{"type":23,"value":158554},"Accept the legal terms and click ",{"type":17,"tag":48,"props":158556,"children":158557},{},[158558],{"type":23,"value":158559},"Create app",{"type":17,"tag":29,"props":158561,"children":158562},{},[158563],{"type":17,"tag":48,"props":158564,"children":158565},{},[158566],{"type":23,"value":158567},"Requesting API Products",{"type":17,"tag":29,"props":158569,"children":158570},{},[158571],{"type":23,"value":158572},"LinkedIn gates webhook access behind specific API products. From your app's settings page:",{"type":17,"tag":6154,"props":158574,"children":158575},{},[158576,158587,158607],{"type":17,"tag":84,"props":158577,"children":158578},{},[158579,158581,158585],{"type":23,"value":158580},"Navigate to the ",{"type":17,"tag":48,"props":158582,"children":158583},{},[158584],{"type":23,"value":125871},{"type":23,"value":158586}," tab",{"type":17,"tag":84,"props":158588,"children":158589},{},[158590,158592,158597,158599,158605],{"type":23,"value":158591},"Request access to ",{"type":17,"tag":48,"props":158593,"children":158594},{},[158595],{"type":23,"value":158596},"Community Management API",{"type":23,"value":158598}," -- this grants the ",{"type":17,"tag":6121,"props":158600,"children":158602},{"className":158601},[],[158603],{"type":23,"value":158604},"r_organization_social",{"type":23,"value":158606}," scope needed for social action notifications",{"type":17,"tag":84,"props":158608,"children":158609},{},[158610,158612,158623,158625,158631],{"type":23,"value":158611},"If you also want to send messages, request ",{"type":17,"tag":48,"props":158613,"children":158614},{},[158615,158617,158621],{"type":23,"value":158616},"LinkedIn ",{"type":17,"tag":133,"props":158618,"children":158619},{"href":106471},[158620],{"type":23,"value":106474},{"type":23,"value":158622}," Partner Program",{"type":23,"value":158624}," for the ",{"type":17,"tag":6121,"props":158626,"children":158628},{"className":158627},[],[158629],{"type":23,"value":158630},"w_messages",{"type":23,"value":158632}," scope",{"type":17,"tag":29,"props":158634,"children":158635},{},[158636,158638,158642],{"type":23,"value":158637},"Product approvals can take a few business days. You can check the status on the ",{"type":17,"tag":48,"props":158639,"children":158640},{},[158641],{"type":23,"value":125871},{"type":23,"value":158643}," tab.",{"type":17,"tag":29,"props":158645,"children":158646},{},[158647],{"type":17,"tag":48,"props":158648,"children":158649},{},[158650,158652,158656],{"type":23,"value":158651},"Configuring ",{"type":17,"tag":133,"props":158653,"children":158654},{"href":779},[158655],{"type":23,"value":782},{"type":23,"value":158657}," Scopes",{"type":17,"tag":29,"props":158659,"children":158660},{},[158661],{"type":23,"value":158662},"Once your products are approved:",{"type":17,"tag":6154,"props":158664,"children":158665},{},[158666,158677,158695,158711],{"type":17,"tag":84,"props":158667,"children":158668},{},[158669,158671,158675],{"type":23,"value":158670},"Go to the ",{"type":17,"tag":48,"props":158672,"children":158673},{},[158674],{"type":23,"value":146708},{"type":23,"value":158676}," tab in your app settings",{"type":17,"tag":84,"props":158678,"children":158679},{},[158680,158681,158686,158688,158693],{"type":23,"value":42395},{"type":17,"tag":48,"props":158682,"children":158683},{},[158684],{"type":23,"value":158685},"OAuth 2.0 scopes",{"type":23,"value":158687},", verify that ",{"type":17,"tag":6121,"props":158689,"children":158691},{"className":158690},[],[158692],{"type":23,"value":158604},{"type":23,"value":158694}," is listed",{"type":17,"tag":84,"props":158696,"children":158697},{},[158698,158700,158704,158705,158709],{"type":23,"value":158699},"Copy your ",{"type":17,"tag":48,"props":158701,"children":158702},{},[158703],{"type":23,"value":6040},{"type":23,"value":42442},{"type":17,"tag":48,"props":158706,"children":158707},{},[158708],{"type":23,"value":6045},{"type":23,"value":158710}," -- you'll need these when creating a connection in Unified",{"type":17,"tag":84,"props":158712,"children":158713},{},[158714,158715,158720],{"type":23,"value":42395},{"type":17,"tag":48,"props":158716,"children":158717},{},[158718],{"type":23,"value":158719},"Authorized redirect URLs",{"type":23,"value":158721},", add your Unified OAuth callback URL",{"type":17,"tag":29,"props":158723,"children":158724},{},[158725],{"type":17,"tag":48,"props":158726,"children":158727},{},[158728],{"type":23,"value":158729},"Verifying Your Company Page",{"type":17,"tag":29,"props":158731,"children":158732},{},[158733],{"type":23,"value":158734},"LinkedIn requires that your developer app is associated with a verified company page:",{"type":17,"tag":6154,"props":158736,"children":158737},{},[158738,158749,158760],{"type":17,"tag":84,"props":158739,"children":158740},{},[158741,158742,158747],{"type":23,"value":158670},{"type":17,"tag":48,"props":158743,"children":158744},{},[158745],{"type":23,"value":158746},"Settings",{"type":23,"value":158748}," tab in your app",{"type":17,"tag":84,"props":158750,"children":158751},{},[158752,158753,158758],{"type":23,"value":42395},{"type":17,"tag":48,"props":158754,"children":158755},{},[158756],{"type":23,"value":158757},"App Settings",{"type":23,"value":158759},", confirm the correct LinkedIn Page is linked",{"type":17,"tag":84,"props":158761,"children":158762},{},[158763,158765,158770],{"type":23,"value":158764},"A page admin must verify the app -- click ",{"type":17,"tag":48,"props":158766,"children":158767},{},[158768],{"type":23,"value":158769},"Generate URL",{"type":23,"value":158771}," next to the verification prompt and share it with a page admin if needed",{"type":17,"tag":29,"props":158773,"children":158774},{},[158775],{"type":23,"value":158776},"Once the page is verified and the products are approved, your app is ready to receive social action notifications.",{"type":17,"tag":68,"props":158778,"children":158780},{"id":158779},"creating-a-webhook-for-linkedin-events",[158781],{"type":17,"tag":48,"props":158782,"children":158783},{},[158784],{"type":23,"value":158785},"Creating a Webhook for LinkedIn Events",{"type":17,"tag":29,"props":158787,"children":158788},{},[158789,158791,158797,158799,158804],{"type":23,"value":158790},"You can create a webhook subscription through the API or the Unified dashboard. The webhook will listen for ",{"type":17,"tag":6121,"props":158792,"children":158794},{"className":158793},[],[158795],{"type":23,"value":158796},"messaging_event",{"type":23,"value":158798}," objects with the ",{"type":17,"tag":6121,"props":158800,"children":158802},{"className":158801},[],[158803],{"type":23,"value":109207},{"type":23,"value":158805}," event, which is how LinkedIn's social action notifications are surfaced.",{"type":17,"tag":29,"props":158807,"children":158808},{},[158809],{"type":17,"tag":48,"props":158810,"children":158811},{},[158812],{"type":23,"value":158813},"Via the API",{"type":17,"tag":29,"props":158815,"children":158816},{},[158817],{"type":23,"value":158818},"`import { UnifiedTo } from '@unified-api/typescript-sdk';",{"type":17,"tag":29,"props":158820,"children":158821},{},[158822],{"type":23,"value":158823},"const sdk = new UnifiedTo({\nsecurity: {\njwt: process.env.UNIFIED_API_KEY!,\n},\n});",{"type":17,"tag":29,"props":158825,"children":158826},{},[158827,158829,158836],{"type":23,"value":158828},"const webhook = await sdk.unified.createUnifiedWebhook({\nwebhook: {\nhookUrl: '",{"type":17,"tag":133,"props":158830,"children":158833},{"href":158831,"rel":158832},"https://your-app.com/%5Bwebhooks",[214],[158834],{"type":23,"value":158835},"https://your-app.com/[webhooks",{"type":23,"value":158837},"](/blog/replacing_polling_with_unified_webhooks_and_virtual_streams)/linkedin',\nconnectionId: process.env.LINKEDIN_CONNECTION_ID!,\nobjectType: 'messaging_event',\nevent: 'created',\n},\n});",{"type":17,"tag":29,"props":158839,"children":158840},{},[158841],{"type":23,"value":158842},"console.log('Webhook created:', webhook.webhook?.id);`",{"type":17,"tag":29,"props":158844,"children":158845},{},[158846],{"type":17,"tag":48,"props":158847,"children":158848},{},[158849],{"type":23,"value":158850},"Via the Dashboard",{"type":17,"tag":6154,"props":158852,"children":158853},{},[158854,158867,158882,158887,158904],{"type":17,"tag":84,"props":158855,"children":158856},{},[158857,158859,158865],{"type":23,"value":158858},"Open ",{"type":17,"tag":133,"props":158860,"children":158863},{"href":158861,"rel":158862},"https://app.unified.to/",[214],[158864],{"type":23,"value":106701},{"type":23,"value":158866}," and navigate to your workspace",{"type":17,"tag":84,"props":158868,"children":158869},{},[158870,158871,158875,158877],{"type":23,"value":42072},{"type":17,"tag":48,"props":158872,"children":158873},{},[158874],{"type":23,"value":43896},{"type":23,"value":158876}," and click ",{"type":17,"tag":48,"props":158878,"children":158879},{},[158880],{"type":23,"value":158881},"Create Webhook",{"type":17,"tag":84,"props":158883,"children":158884},{},[158885],{"type":23,"value":158886},"Select your LinkedIn connection",{"type":17,"tag":84,"props":158888,"children":158889},{},[158890,158892,158897,158899],{"type":23,"value":158891},"Set the object type to ",{"type":17,"tag":6121,"props":158893,"children":158895},{"className":158894},[],[158896],{"type":23,"value":158796},{"type":23,"value":158898}," and the event to ",{"type":17,"tag":6121,"props":158900,"children":158902},{"className":158901},[],[158903],{"type":23,"value":109207},{"type":17,"tag":84,"props":158905,"children":158906},{},[158907],{"type":23,"value":158908},"Enter your webhook URL and save",{"type":17,"tag":29,"props":158910,"children":158911},{},[158912],{"type":23,"value":158913},"Once the webhook is active, Unified registers your endpoint with LinkedIn's event subscription API using the organization URN from your connection.",{"type":17,"tag":68,"props":158915,"children":158917},{"id":158916},"receiving-events",[158918],{"type":17,"tag":48,"props":158919,"children":158920},{},[158921],{"type":23,"value":158922},"Receiving Events",{"type":17,"tag":29,"props":158924,"children":158925},{},[158926,158928,158934,158936,158942],{"type":23,"value":158927},"When someone interacts with your LinkedIn company page, Unified converts the raw LinkedIn notification into a standard ",{"type":17,"tag":6121,"props":158929,"children":158931},{"className":158930},[],[158932],{"type":23,"value":158933},"MessagingEvent",{"type":23,"value":158935}," object and POSTs it to your ",{"type":17,"tag":6121,"props":158937,"children":158939},{"className":158938},[],[158940],{"type":23,"value":158941},"hook_url",{"type":23,"value":158943},". Here's what that looks like:",{"type":17,"tag":29,"props":158945,"children":158946},{},[158947],{"type":23,"value":158948},"`import express from 'express';",{"type":17,"tag":29,"props":158950,"children":158951},{},[158952],{"type":23,"value":158953},"const app = express();\napp.use(express.json());",{"type":17,"tag":29,"props":158955,"children":158956},{},[158957],{"type":23,"value":158958},"app.post('/webhooks/linkedin', (req, res) => {\nconst event = req.body;",{"type":17,"tag":6893,"props":158960,"children":158962},{"code":158961},"switch (event.type) {\n    case 'MESSAGE_RECEIVED':\n        // Someone commented on a company post, shared it, or edited/deleted a comment\n        console.log('Comment or share from:', event.user?.id);\n        console.log('On organization:', event.channel?.id);\n        break;\n\n    case 'REACTION_ADDED':\n        // Someone liked a company post\n        console.log('Like from:', event.user?.id);\n        break;\n\n    case 'APP_MENTION':\n        // Your company was mentioned in a share\n        console.log('Mentioned by:', event.user?.id);\n        break;\n}\n\nres.sendStatus(200);\n",[158963],{"type":17,"tag":6121,"props":158964,"children":158965},{"__ignoreMap":7},[158966],{"type":23,"value":158961},{"type":17,"tag":29,"props":158968,"children":158969},{},[158970],{"type":23,"value":158971},"});`",{"type":17,"tag":68,"props":158973,"children":158975},{"id":158974},"event-type-mapping",[158976],{"type":17,"tag":48,"props":158977,"children":158978},{},[158979],{"type":23,"value":158980},"Event Type Mapping",{"type":17,"tag":29,"props":158982,"children":158983},{},[158984,158986,158991],{"type":23,"value":158985},"LinkedIn's social action types are mapped to Unified's standard ",{"type":17,"tag":6121,"props":158987,"children":158989},{"className":158988},[],[158990],{"type":23,"value":158933},{"type":23,"value":158992},"types:",{"type":17,"tag":80,"props":158994,"children":158995},{},[158996,159020,159038,159054,159071],{"type":17,"tag":84,"props":158997,"children":158998},{},[158999,159004,159005,159010,159012,159018],{"type":17,"tag":48,"props":159000,"children":159001},{},[159002],{"type":23,"value":159003},"COMMENT",{"type":23,"value":42442},{"type":17,"tag":48,"props":159006,"children":159007},{},[159008],{"type":23,"value":159009},"ADMIN_COMMENT",{"type":23,"value":159011},"become ",{"type":17,"tag":6121,"props":159013,"children":159015},{"className":159014},[],[159016],{"type":23,"value":159017},"MESSAGE_RECEIVED",{"type":23,"value":159019}," -- a new comment was posted on your organization's content",{"type":17,"tag":84,"props":159021,"children":159022},{},[159023,159028,159030,159036],{"type":17,"tag":48,"props":159024,"children":159025},{},[159026],{"type":23,"value":159027},"LIKE",{"type":23,"value":159029}," becomes ",{"type":17,"tag":6121,"props":159031,"children":159033},{"className":159032},[],[159034],{"type":23,"value":159035},"REACTION_ADDED",{"type":23,"value":159037}," -- someone liked your organization's post",{"type":17,"tag":84,"props":159039,"children":159040},{},[159041,159046,159047,159052],{"type":17,"tag":48,"props":159042,"children":159043},{},[159044],{"type":23,"value":159045},"SHARE",{"type":23,"value":159029},{"type":17,"tag":6121,"props":159048,"children":159050},{"className":159049},[],[159051],{"type":23,"value":159017},{"type":23,"value":159053}," -- someone shared your organization's content",{"type":17,"tag":84,"props":159055,"children":159056},{},[159057,159062,159063,159069],{"type":17,"tag":48,"props":159058,"children":159059},{},[159060],{"type":23,"value":159061},"SHARE_MENTION",{"type":23,"value":159029},{"type":17,"tag":6121,"props":159064,"children":159066},{"className":159065},[],[159067],{"type":23,"value":159068},"APP_MENTION",{"type":23,"value":159070}," -- your organization was mentioned in a share",{"type":17,"tag":84,"props":159072,"children":159073},{},[159074,159079,159080,159085,159087,159092],{"type":17,"tag":48,"props":159075,"children":159076},{},[159077],{"type":23,"value":159078},"COMMENT_EDIT",{"type":23,"value":42442},{"type":17,"tag":48,"props":159081,"children":159082},{},[159083],{"type":23,"value":159084},"COMMENT_DELETE",{"type":23,"value":159086}," become ",{"type":17,"tag":6121,"props":159088,"children":159090},{"className":159089},[],[159091],{"type":23,"value":159017},{"type":23,"value":159093}," -- an existing comment was modified or removed",{"type":17,"tag":29,"props":159095,"children":159096},{},[159097,159099,159104,159106,159112,159114,159119,159121,159126],{"type":23,"value":159098},"Each event includes the ",{"type":17,"tag":6121,"props":159100,"children":159102},{"className":159101},[],[159103],{"type":23,"value":73113},{"type":23,"value":159105}," field set to your organization's ID, the ",{"type":17,"tag":6121,"props":159107,"children":159109},{"className":159108},[],[159110],{"type":23,"value":159111},"user",{"type":23,"value":159113},"field with the actor's person ID, and a ",{"type":17,"tag":6121,"props":159115,"children":159117},{"className":159116},[],[159118],{"type":23,"value":33446},{"type":23,"value":159120}," timestamp. The original LinkedIn payload is always available in the ",{"type":17,"tag":6121,"props":159122,"children":159124},{"className":159123},[],[159125],{"type":23,"value":62389},{"type":23,"value":159127}," field if you need additional detail.",{"type":17,"tag":68,"props":159129,"children":159131},{"id":159130},"sending-messages-alongside-webhooks",[159132],{"type":17,"tag":48,"props":159133,"children":159134},{},[159135],{"type":23,"value":159136},"Sending Messages Alongside Webhooks",{"type":17,"tag":29,"props":159138,"children":159139},{},[159140],{"type":23,"value":159141},"While webhooks cover inbound events, you can also send outbound messages through LinkedIn's Messages API using the same connection. This is useful for responding to engagement by reaching out to the people interacting with your content.",{"type":17,"tag":29,"props":159143,"children":159144},{},[159145],{"type":17,"tag":6121,"props":159146,"children":159148},{"className":159147},[],[159149],{"type":23,"value":159150},"const message = await sdk.messaging.createMessagingMessage({     messagingMessage: {         message: 'Thanks for engaging with our content!',         destinationMembers: [             { userId: 'urn:li:person:ABC123' },         ],     },     connectionId: process.env.LINKEDIN_CONNECTION_ID!, });",{"type":17,"tag":29,"props":159152,"children":159153},{},[159154,159156,159161,159163,159169,159171,159177],{"type":23,"value":159155},"Note that LinkedIn's Messages API requires partner-level access with the ",{"type":17,"tag":6121,"props":159157,"children":159159},{"className":159158},[],[159160],{"type":23,"value":158630},{"type":23,"value":159162}," scope. Message creation supports new conversations (via ",{"type":17,"tag":6121,"props":159164,"children":159166},{"className":159165},[],[159167],{"type":23,"value":159168},"destinationMembers",{"type":23,"value":159170},") or replies to existing threads (via ",{"type":17,"tag":6121,"props":159172,"children":159174},{"className":159173},[],[159175],{"type":23,"value":159176},"channelId",{"type":23,"value":129328},{"type":17,"tag":68,"props":159179,"children":159180},{"id":6769},[159181],{"type":17,"tag":48,"props":159182,"children":159183},{},[159184],{"type":23,"value":6772},{"type":17,"tag":29,"props":159186,"children":159187},{},[159188,159193,159195,159200,159202,159208],{"type":17,"tag":48,"props":159189,"children":159190},{},[159191],{"type":23,"value":159192},"Webhook not receiving events?",{"type":23,"value":159194}," LinkedIn requires the ",{"type":17,"tag":6121,"props":159196,"children":159198},{"className":159197},[],[159199],{"type":23,"value":158604},{"type":23,"value":159201},"OAuth scope, which is granted through the Community Management API product. Verify your app has this product approved on the ",{"type":17,"tag":133,"props":159203,"children":159205},{"href":158502,"rel":159204},[214],[159206],{"type":23,"value":159207},"LinkedIn Developer Portal",{"type":23,"value":159209},", and that your connection has the scope by checking the connection details in the Unified dashboard.",{"type":17,"tag":29,"props":159211,"children":159212},{},[159213,159218,159220,159225],{"type":17,"tag":48,"props":159214,"children":159215},{},[159216],{"type":23,"value":159217},"Events arriving for the wrong organization?",{"type":23,"value":159219}," The webhook subscription is tied to the ",{"type":17,"tag":6121,"props":159221,"children":159223},{"className":159222},[],[159224],{"type":23,"value":22399},{"type":23,"value":159226}," stored in your connection metadata, which is set during the initial OAuth flow. If you manage multiple LinkedIn organizations, create separate connections for each one.",{"type":17,"tag":29,"props":159228,"children":159229},{},[159230,159235,159237,159241],{"type":17,"tag":48,"props":159231,"children":159232},{},[159233],{"type":23,"value":159234},"LinkedIn Page not verified?",{"type":23,"value":159236}," Your developer app must be associated with a verified company page. Go to your app's ",{"type":17,"tag":48,"props":159238,"children":159239},{},[159240],{"type":23,"value":158746},{"type":23,"value":159242}," tab on the LinkedIn Developer Portal and complete the page verification process. A page admin must approve the association.",{"type":17,"tag":29,"props":159244,"children":159245},{},[159246],{"type":23,"value":159247},"With just a few lines of code, you're now receiving real-time LinkedIn engagement data through the same webhook infrastructure you use for Slack, Discord, and every other messaging integration on Unified. No custom protocol handling required.",{"type":17,"tag":29,"props":159249,"children":159250},{},[159251],{"type":17,"tag":133,"props":159252,"children":159254},{"href":1612,"rel":159253},[214],[159255],{"type":23,"value":44481},{"type":17,"tag":29,"props":159257,"children":159258},{},[159259],{"type":17,"tag":133,"props":159260,"children":159262},{"href":1623,"rel":159261},[214],[159263],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":159265},[159266,159267,159268,159269,159270,159271,159272],{"id":158432,"depth":1629,"text":158438},{"id":158473,"depth":1629,"text":158479},{"id":158779,"depth":1629,"text":158785},{"id":158916,"depth":1629,"text":158922},{"id":158974,"depth":1629,"text":158980},{"id":159130,"depth":1629,"text":159136},{"id":6769,"depth":1629,"text":6772},"content:blog:how_to_set_up_linkedin_webhooks_with_unified.md","blog/how_to_set_up_linkedin_webhooks_with_unified.md","blog/how_to_set_up_linkedin_webhooks_with_unified",{"_path":159277,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":121234,"description":159278,"img":159279,"date":159280,"tag":12,"body":159281,"_type":1677,"_id":160211,"_source":1679,"_file":160212,"_stem":160213,"_extension":1682},"/blog/build_cross_platform_campaign_controls_status_budgets_flight_dates_with_unified_advertising_api","Most advertising control features break at the same point, provider inconsistency.","https://s3.us-east-2.amazonaws.com/unified-article-images/build_cross_platform_campaign_controls_status_budgets_flight_dates_with_unified_advertising_api-icon.png","2026-02-13T17:32:00.000Z",{"type":14,"children":159282,"toc":160182},[159283,159288,159291,159299,159304,159309,159337,159342,159353,159358,159386,159391,159395,159401,159406,159455,159460,159466,159483,159488,159496,159507,159542,159554,159560,159568,159578,159584,159589,159598,159603,159615,159621,159630,159635,159644,159650,159655,159660,159669,159674,159680,159685,159694,159700,159709,159713,159718,159723,159741,159746,159752,159757,159766,159772,159781,159786,159791,159796,159814,159820,159825,159831,159836,159854,159860,159865,159878,159884,159888,159901,159906,159929,159934,159940,159944,159952,159957,159963,159968,159995,160000,160006,160011,160034,160039,160062,160067,160072,160095,160101,160110,160115,160119,160124,160129,160156,160161,160166,160174],{"type":17,"tag":18,"props":159284,"children":159286},{"id":159285},"build-cross-platform-campaign-controls-status-budgets-flight-dates-with-unified-advertising-api",[159287],{"type":23,"value":121234},{"type":17,"tag":25,"props":159289,"children":159290},{},[],{"type":17,"tag":29,"props":159292,"children":159293},{},[159294],{"type":17,"tag":33,"props":159295,"children":159296},{},[159297],{"type":23,"value":159298},"February 13, 2026",{"type":17,"tag":29,"props":159300,"children":159301},{},[159302],{"type":23,"value":159303},"Most advertising control features break at the same point: provider inconsistency.",{"type":17,"tag":29,"props":159305,"children":159306},{},[159307],{"type":23,"value":159308},"Pausing a campaign, increasing a budget, or extending a flight window should be straightforward. In practice, each advertising platform differs:",{"type":17,"tag":80,"props":159310,"children":159311},{},[159312,159317,159322,159327,159332],{"type":17,"tag":84,"props":159313,"children":159314},{},[159315],{"type":23,"value":159316},"Which campaign fields are writable",{"type":17,"tag":84,"props":159318,"children":159319},{},[159320],{"type":23,"value":159321},"Whether budgets can be changed after launch",{"type":17,"tag":84,"props":159323,"children":159324},{},[159325],{"type":23,"value":159326},"Whether start and end dates are editable",{"type":17,"tag":84,"props":159328,"children":159329},{},[159330],{"type":23,"value":159331},"How errors are returned",{"type":17,"tag":84,"props":159333,"children":159334},{},[159335],{"type":23,"value":159336},"Which scopes are required",{"type":17,"tag":29,"props":159338,"children":159339},{},[159340],{"type":23,"value":159341},"If you integrate directly against Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, and DV360, you maintain separate code paths per provider.",{"type":17,"tag":29,"props":159343,"children":159344},{},[159345,159347,159351],{"type":23,"value":159346},"Unified's Advertising category provides a ",{"type":17,"tag":133,"props":159348,"children":159349},{"href":7691},[159350],{"type":23,"value":7459},{"type":23,"value":159352}," surface for campaign control across supported platforms, while maintaining a real-time, pass-through architecture with no data storage .",{"type":17,"tag":29,"props":159354,"children":159355},{},[159356],{"type":23,"value":159357},"This guide shows how to implement:",{"type":17,"tag":80,"props":159359,"children":159360},{},[159361,159366,159371,159376,159381],{"type":17,"tag":84,"props":159362,"children":159363},{},[159364],{"type":23,"value":159365},"Pause / resume",{"type":17,"tag":84,"props":159367,"children":159368},{},[159369],{"type":23,"value":159370},"Budget adjustments",{"type":17,"tag":84,"props":159372,"children":159373},{},[159374],{"type":23,"value":159375},"Flight date updates",{"type":17,"tag":84,"props":159377,"children":159378},{},[159379],{"type":23,"value":159380},"Provider-safe error handling",{"type":17,"tag":84,"props":159382,"children":159383},{},[159384],{"type":23,"value":159385},"Production-safe retry logic",{"type":17,"tag":29,"props":159387,"children":159388},{},[159389],{"type":23,"value":159390},"Using the official TypeScript SDK.",{"type":17,"tag":68,"props":159392,"children":159393},{"id":141798},[159394],{"type":23,"value":141801},{"type":17,"tag":239,"props":159396,"children":159398},{"id":159397},"_1-advertising-connection",[159399],{"type":23,"value":159400},"1. Advertising connection",{"type":17,"tag":29,"props":159402,"children":159403},{},[159404],{"type":23,"value":159405},"Create an Advertising connection with:",{"type":17,"tag":80,"props":159407,"children":159408},{},[159409,159420],{"type":17,"tag":84,"props":159410,"children":159411},{},[159412,159414],{"type":23,"value":159413},"Category: ",{"type":17,"tag":6121,"props":159415,"children":159417},{"className":159416},[],[159418],{"type":23,"value":159419},"ADS",{"type":17,"tag":84,"props":159421,"children":159422},{},[159423,159425],{"type":23,"value":159424},"Required scopes:\n",{"type":17,"tag":80,"props":159426,"children":159427},{},[159428,159437,159446],{"type":17,"tag":84,"props":159429,"children":159430},{},[159431],{"type":17,"tag":6121,"props":159432,"children":159434},{"className":159433},[],[159435],{"type":23,"value":159436},"ads_campaign_read",{"type":17,"tag":84,"props":159438,"children":159439},{},[159440],{"type":17,"tag":6121,"props":159441,"children":159443},{"className":159442},[],[159444],{"type":23,"value":159445},"ads_campaign_write",{"type":17,"tag":84,"props":159447,"children":159448},{},[159449],{"type":17,"tag":6121,"props":159450,"children":159452},{"className":159451},[],[159453],{"type":23,"value":159454},"ads_organization_read",{"type":17,"tag":29,"props":159456,"children":159457},{},[159458],{"type":23,"value":159459},"Unified allows requesting scopes via the Authorization component or via an auth URL. If scopes are omitted, Unified attempts to request all available scopes, but explicit scope selection is recommended .",{"type":17,"tag":239,"props":159461,"children":159463},{"id":159462},"_2-discover-ad-accounts-organizations",[159464],{"type":23,"value":159465},"2. Discover ad accounts (Organizations)",{"type":17,"tag":29,"props":159467,"children":159468},{},[159469,159471,159476,159478,159482],{"type":23,"value":159470},"Ad account selection does ",{"type":17,"tag":48,"props":159472,"children":159473},{},[159474],{"type":23,"value":159475},"not",{"type":23,"value":159477}," occur during ",{"type":17,"tag":133,"props":159479,"children":159480},{"href":779},[159481],{"type":23,"value":782},{"type":23,"value":54},{"type":17,"tag":29,"props":159484,"children":159485},{},[159486],{"type":23,"value":159487},"After connecting:",{"type":17,"tag":6893,"props":159489,"children":159491},{"className":159490,"code":22258,"language":18718,"meta":7},[18716],[159492],{"type":17,"tag":6121,"props":159493,"children":159494},{"__ignoreMap":7},[159495],{"type":23,"value":22258},{"type":17,"tag":29,"props":159497,"children":159498},{},[159499,159501,159506],{"type":23,"value":159500},"Each ",{"type":17,"tag":6121,"props":159502,"children":159504},{"className":159503},[],[159505],{"type":23,"value":22253},{"type":23,"value":132329},{"type":17,"tag":80,"props":159508,"children":159509},{},[159510,159518,159526,159534],{"type":17,"tag":84,"props":159511,"children":159512},{},[159513],{"type":17,"tag":6121,"props":159514,"children":159516},{"className":159515},[],[159517],{"type":23,"value":18766},{"type":17,"tag":84,"props":159519,"children":159520},{},[159521],{"type":17,"tag":6121,"props":159522,"children":159524},{"className":159523},[],[159525],{"type":23,"value":18781},{"type":17,"tag":84,"props":159527,"children":159528},{},[159529],{"type":17,"tag":6121,"props":159530,"children":159532},{"className":159531},[],[159533],{"type":23,"value":22296},{"type":17,"tag":84,"props":159535,"children":159536},{},[159537],{"type":17,"tag":6121,"props":159538,"children":159540},{"className":159539},[],[159541],{"type":23,"value":22305},{"type":17,"tag":29,"props":159543,"children":159544},{},[159545,159547,159552],{"type":23,"value":159546},"You may optionally pass ",{"type":17,"tag":6121,"props":159548,"children":159550},{"className":159549},[],[159551],{"type":23,"value":22355},{"type":23,"value":159553}," when listing campaigns to filter by ad account.",{"type":17,"tag":239,"props":159555,"children":159557},{"id":159556},"_3-list-campaigns",[159558],{"type":23,"value":159559},"3. List campaigns",{"type":17,"tag":6893,"props":159561,"children":159563},{"className":159562,"code":22334,"language":18718,"meta":7},[18716],[159564],{"type":17,"tag":6121,"props":159565,"children":159566},{"__ignoreMap":7},[159567],{"type":23,"value":22334},{"type":17,"tag":29,"props":159569,"children":159570},{},[159571,159576],{"type":17,"tag":6121,"props":159572,"children":159574},{"className":159573},[],[159575],{"type":23,"value":22355},{"type":23,"value":159577}," is a filter parameter. It is not required for updates.",{"type":17,"tag":68,"props":159579,"children":159581},{"id":159580},"campaign-control-pattern-put-semantics",[159582],{"type":23,"value":159583},"Campaign Control Pattern (PUT Semantics)",{"type":17,"tag":29,"props":159585,"children":159586},{},[159587],{"type":23,"value":159588},"The SDK exposes:",{"type":17,"tag":6893,"props":159590,"children":159593},{"className":159591,"code":159592,"language":20901,"meta":23},[20899],"updateAdsCampaign\n",[159594],{"type":17,"tag":6121,"props":159595,"children":159596},{"__ignoreMap":7},[159597],{"type":23,"value":159592},{"type":17,"tag":29,"props":159599,"children":159600},{},[159601],{"type":23,"value":159602},"This performs a PUT operation.",{"type":17,"tag":29,"props":159604,"children":159605},{},[159606,159608,159613],{"type":23,"value":159607},"To avoid unintentionally clearing fields, use a ",{"type":17,"tag":48,"props":159609,"children":159610},{},[159611],{"type":23,"value":159612},"read → merge → update",{"type":23,"value":159614}," pattern.",{"type":17,"tag":68,"props":159616,"children":159618},{"id":159617},"_1-pause-or-resume-a-campaign",[159619],{"type":23,"value":159620},"1. Pause or Resume a Campaign",{"type":17,"tag":6893,"props":159622,"children":159625},{"className":159623,"code":159624,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nconst connectionId = '5de520f96e439b002043d8dc';\nconst id = '1234'; // campaign id\n\n// 1) Retrieve current campaign\nconst current = await sdk.ads.getAdsCampaign({ connectionId, id });\n\n// 2) Update status\nawait sdk.ads.updateAdsCampaign({\n  connectionId,\n  id,\n  adsCampaign: {\n    ...current,\n    status: 'PAUSED',\n  },\n});\n",[159626],{"type":17,"tag":6121,"props":159627,"children":159628},{"__ignoreMap":7},[159629],{"type":23,"value":159624},{"type":17,"tag":29,"props":159631,"children":159632},{},[159633],{"type":23,"value":159634},"To resume:",{"type":17,"tag":6893,"props":159636,"children":159639},{"className":159637,"code":159638,"language":18718,"meta":7},[18716],"await sdk.ads.updateAdsCampaign({\n  connectionId,\n  id,\n  adsCampaign: {\n    ...current,\n    status: 'ACTIVE',\n  },\n});\n",[159640],{"type":17,"tag":6121,"props":159641,"children":159642},{"__ignoreMap":7},[159643],{"type":23,"value":159638},{"type":17,"tag":239,"props":159645,"children":159647},{"id":159646},"provider-support",[159648],{"type":23,"value":159649},"Provider support",{"type":17,"tag":29,"props":159651,"children":159652},{},[159653],{"type":23,"value":159654},"Campaign status updates are supported across major advertising integrations.",{"type":17,"tag":29,"props":159656,"children":159657},{},[159658],{"type":23,"value":159659},"If unsupported for a provider, Unified returns:",{"type":17,"tag":6893,"props":159661,"children":159664},{"className":159662,"code":159663,"language":20901,"meta":23},[20899],"501 Not Implemented\n\"The requested functionality is not supported by this integration\"\n",[159665],{"type":17,"tag":6121,"props":159666,"children":159667},{"__ignoreMap":7},[159668],{"type":23,"value":159663},{"type":17,"tag":29,"props":159670,"children":159671},{},[159672],{"type":23,"value":159673},"Unsupported fields are rejected, not ignored.",{"type":17,"tag":68,"props":159675,"children":159677},{"id":159676},"_2-update-campaign-budgets",[159678],{"type":23,"value":159679},"2. Update Campaign Budgets",{"type":17,"tag":29,"props":159681,"children":159682},{},[159683],{"type":23,"value":159684},"Budget fields:",{"type":17,"tag":6893,"props":159686,"children":159689},{"className":159687,"code":159688,"language":18718,"meta":7},[18716],"budgetAmount?: number;\nbudgetPeriod?: 'DAILY' | 'MONTHLY' | 'TOTAL' | 'LIFETIME';\n",[159690],{"type":17,"tag":6121,"props":159691,"children":159692},{"__ignoreMap":7},[159693],{"type":23,"value":159688},{"type":17,"tag":239,"props":159695,"children":159697},{"id":159696},"example-increase-daily-budget",[159698],{"type":23,"value":159699},"Example: Increase daily budget",{"type":17,"tag":6893,"props":159701,"children":159704},{"className":159702,"code":159703,"language":18718,"meta":7},[18716],"const current = await sdk.ads.getAdsCampaign({ connectionId, id });\n\nawait sdk.ads.updateAdsCampaign({\n  connectionId,\n  id,\n  adsCampaign: {\n    ...current,\n    budgetAmount: 5000,\n    budgetPeriod: 'DAILY',\n  },\n});\n",[159705],{"type":17,"tag":6121,"props":159706,"children":159707},{"__ignoreMap":7},[159708],{"type":23,"value":159703},{"type":17,"tag":239,"props":159710,"children":159711},{"id":144224},[159712],{"type":23,"value":145535},{"type":17,"tag":29,"props":159714,"children":159715},{},[159716],{"type":23,"value":159717},"Budget write support differs by platform.",{"type":17,"tag":29,"props":159719,"children":159720},{},[159721],{"type":23,"value":159722},"Before enabling budget controls in your UI:",{"type":17,"tag":80,"props":159724,"children":159725},{},[159726,159731,159736],{"type":17,"tag":84,"props":159727,"children":159728},{},[159729],{"type":23,"value":159730},"Detect provider type",{"type":17,"tag":84,"props":159732,"children":159733},{},[159734],{"type":23,"value":159735},"Confirm writable fields",{"type":17,"tag":84,"props":159737,"children":159738},{},[159739],{"type":23,"value":159740},"Disable unsupported controls",{"type":17,"tag":29,"props":159742,"children":159743},{},[159744],{"type":23,"value":159745},"Attempting to update unsupported fields results in a 501 response.",{"type":17,"tag":68,"props":159747,"children":159749},{"id":159748},"_3-update-flight-dates",[159750],{"type":23,"value":159751},"3. Update Flight Dates",{"type":17,"tag":29,"props":159753,"children":159754},{},[159755],{"type":23,"value":159756},"Date fields must be ISO-8601:",{"type":17,"tag":6893,"props":159758,"children":159761},{"className":159759,"code":159760,"language":20901,"meta":23},[20899],"YYYY-MM-DDTHH:MM:SSZ\n",[159762],{"type":17,"tag":6121,"props":159763,"children":159764},{"__ignoreMap":7},[159765],{"type":23,"value":159760},{"type":17,"tag":239,"props":159767,"children":159769},{"id":159768},"example-extend-campaign-end-date",[159770],{"type":23,"value":159771},"Example: Extend campaign end date",{"type":17,"tag":6893,"props":159773,"children":159776},{"className":159774,"code":159775,"language":18718,"meta":7},[18716],"const current = await sdk.ads.getAdsCampaign({ connectionId, id });\n\nawait sdk.ads.updateAdsCampaign({\n  connectionId,\n  id,\n  adsCampaign: {\n    ...current,\n    endAt: '2026-03-31T23:59:59Z',\n  },\n});\n",[159777],{"type":17,"tag":6121,"props":159778,"children":159779},{"__ignoreMap":7},[159780],{"type":23,"value":159775},{"type":17,"tag":239,"props":159782,"children":159784},{"id":159783},"provider-variability-1",[159785],{"type":23,"value":145535},{"type":17,"tag":29,"props":159787,"children":159788},{},[159789],{"type":23,"value":159790},"Some platforms do not allow modifying flight dates after launch.",{"type":17,"tag":29,"props":159792,"children":159793},{},[159794],{"type":23,"value":159795},"Your application should:",{"type":17,"tag":80,"props":159797,"children":159798},{},[159799,159804,159809],{"type":17,"tag":84,"props":159800,"children":159801},{},[159802],{"type":23,"value":159803},"Catch 501 errors",{"type":17,"tag":84,"props":159805,"children":159806},{},[159807],{"type":23,"value":159808},"Surface clear UI messaging",{"type":17,"tag":84,"props":159810,"children":159811},{},[159812],{"type":23,"value":159813},"Avoid retrying unsupported operations",{"type":17,"tag":68,"props":159815,"children":159817},{"id":159816},"error-handling-in-production",[159818],{"type":23,"value":159819},"Error Handling in Production",{"type":17,"tag":29,"props":159821,"children":159822},{},[159823],{"type":23,"value":159824},"Unified returns standard HTTP codes.",{"type":17,"tag":239,"props":159826,"children":159828},{"id":159827},"_400-validation-error",[159829],{"type":23,"value":159830},"400 — Validation error",{"type":17,"tag":29,"props":159832,"children":159833},{},[159834],{"type":23,"value":159835},"Returned when:",{"type":17,"tag":80,"props":159837,"children":159838},{},[159839,159844,159849],{"type":17,"tag":84,"props":159840,"children":159841},{},[159842],{"type":23,"value":159843},"Required fields missing",{"type":17,"tag":84,"props":159845,"children":159846},{},[159847],{"type":23,"value":159848},"Invalid date format",{"type":17,"tag":84,"props":159850,"children":159851},{},[159852],{"type":23,"value":159853},"Invalid enum value",{"type":17,"tag":239,"props":159855,"children":159857},{"id":159856},"_401-403-scope-or-authorization-error",[159858],{"type":23,"value":159859},"401 / 403 — Scope or authorization error",{"type":17,"tag":29,"props":159861,"children":159862},{},[159863],{"type":23,"value":159864},"Occurs when:",{"type":17,"tag":80,"props":159866,"children":159867},{},[159868,159873],{"type":17,"tag":84,"props":159869,"children":159870},{},[159871],{"type":23,"value":159872},"OAuth token invalid",{"type":17,"tag":84,"props":159874,"children":159875},{},[159876],{"type":23,"value":159877},"Required write scope not granted",{"type":17,"tag":239,"props":159879,"children":159881},{"id":159880},"_429-rate-limit-exceeded",[159882],{"type":23,"value":159883},"429 — Rate limit exceeded",{"type":17,"tag":29,"props":159885,"children":159886},{},[159887],{"type":23,"value":159835},{"type":17,"tag":80,"props":159889,"children":159890},{},[159891,159896],{"type":17,"tag":84,"props":159892,"children":159893},{},[159894],{"type":23,"value":159895},"Provider limit reached",{"type":17,"tag":84,"props":159897,"children":159898},{},[159899],{"type":23,"value":159900},"Unified platform limit reached",{"type":17,"tag":29,"props":159902,"children":159903},{},[159904],{"type":23,"value":159905},"Implement exponential backoff:",{"type":17,"tag":80,"props":159907,"children":159908},{},[159909,159914,159919,159924],{"type":17,"tag":84,"props":159910,"children":159911},{},[159912],{"type":23,"value":159913},"Retry only on 429",{"type":17,"tag":84,"props":159915,"children":159916},{},[159917],{"type":23,"value":159918},"Add jitter",{"type":17,"tag":84,"props":159920,"children":159921},{},[159922],{"type":23,"value":159923},"Cap retries",{"type":17,"tag":84,"props":159925,"children":159926},{},[159927],{"type":23,"value":159928},"Log failures",{"type":17,"tag":29,"props":159930,"children":159931},{},[159932],{"type":23,"value":159933},"The SDK does not automatically retry write calls.",{"type":17,"tag":239,"props":159935,"children":159937},{"id":159936},"_501-unsupported-functionality",[159938],{"type":23,"value":159939},"501 — Unsupported functionality",{"type":17,"tag":29,"props":159941,"children":159942},{},[159943],{"type":23,"value":159835},{"type":17,"tag":80,"props":159945,"children":159946},{},[159947],{"type":17,"tag":84,"props":159948,"children":159949},{},[159950],{"type":23,"value":159951},"Field is not writable for the provider",{"type":17,"tag":29,"props":159953,"children":159954},{},[159955],{"type":23,"value":159956},"Do not retry 501 responses.",{"type":17,"tag":68,"props":159958,"children":159960},{"id":159959},"provider-safe-update-pattern",[159961],{"type":23,"value":159962},"Provider-Safe Update Pattern",{"type":17,"tag":29,"props":159964,"children":159965},{},[159966],{"type":23,"value":159967},"In production:",{"type":17,"tag":6154,"props":159969,"children":159970},{},[159971,159976,159981,159986,159991],{"type":17,"tag":84,"props":159972,"children":159973},{},[159974],{"type":23,"value":159975},"Retrieve campaign",{"type":17,"tag":84,"props":159977,"children":159978},{},[159979],{"type":23,"value":159980},"Merge only intended changes",{"type":17,"tag":84,"props":159982,"children":159983},{},[159984],{"type":23,"value":159985},"Submit update",{"type":17,"tag":84,"props":159987,"children":159988},{},[159989],{"type":23,"value":159990},"Catch and classify errors",{"type":17,"tag":84,"props":159992,"children":159993},{},[159994],{"type":23,"value":159913},{"type":17,"tag":29,"props":159996,"children":159997},{},[159998],{"type":23,"value":159999},"This prevents accidental field overwrites and avoids unsafe retry behavior.",{"type":17,"tag":68,"props":160001,"children":160003},{"id":160002},"why-this-architecture-matters",[160004],{"type":23,"value":160005},"Why This Architecture Matters",{"type":17,"tag":29,"props":160007,"children":160008},{},[160009],{"type":23,"value":160010},"Unified's Advertising category operates with:",{"type":17,"tag":80,"props":160012,"children":160013},{},[160014,160019,160024,160029],{"type":17,"tag":84,"props":160015,"children":160016},{},[160017],{"type":23,"value":160018},"Real-time reads and writes",{"type":17,"tag":84,"props":160020,"children":160021},{},[160022],{"type":23,"value":160023},"Pass-through requests",{"type":17,"tag":84,"props":160025,"children":160026},{},[160027],{"type":23,"value":160028},"No storage or caching",{"type":17,"tag":84,"props":160030,"children":160031},{},[160032],{"type":23,"value":160033},"Usage-based pricing aligned with scale",{"type":17,"tag":29,"props":160035,"children":160036},{},[160037],{"type":23,"value":160038},"This eliminates:",{"type":17,"tag":80,"props":160040,"children":160041},{},[160042,160047,160052,160057],{"type":17,"tag":84,"props":160043,"children":160044},{},[160045],{"type":23,"value":160046},"Per-provider integration logic",{"type":17,"tag":84,"props":160048,"children":160049},{},[160050],{"type":23,"value":160051},"Separate OAuth implementations",{"type":17,"tag":84,"props":160053,"children":160054},{},[160055],{"type":23,"value":160056},"Separate retry pipelines",{"type":17,"tag":84,"props":160058,"children":160059},{},[160060],{"type":23,"value":160061},"Cached or delayed state",{"type":17,"tag":29,"props":160063,"children":160064},{},[160065],{"type":23,"value":160066},"Normalized campaign objects remove per-provider mapping logic and reduce maintenance overhead .",{"type":17,"tag":29,"props":160068,"children":160069},{},[160070],{"type":23,"value":160071},"For product teams, this means:",{"type":17,"tag":80,"props":160073,"children":160074},{},[160075,160080,160085,160090],{"type":17,"tag":84,"props":160076,"children":160077},{},[160078],{"type":23,"value":160079},"Faster delivery of campaign controls",{"type":17,"tag":84,"props":160081,"children":160082},{},[160083],{"type":23,"value":160084},"Cleaner UI consistency",{"type":17,"tag":84,"props":160086,"children":160087},{},[160088],{"type":23,"value":160089},"Reduced engineering maintenance",{"type":17,"tag":84,"props":160091,"children":160092},{},[160093],{"type":23,"value":160094},"Predictable infrastructure cost",{"type":17,"tag":68,"props":160096,"children":160098},{"id":160097},"complete-example-flow",[160099],{"type":23,"value":160100},"Complete Example Flow",{"type":17,"tag":6893,"props":160102,"children":160105},{"className":160103,"code":160104,"language":18718,"meta":7},[18716],"// 1. List organizations\nconst orgs = await sdk.ads.listAdsOrganizations({ connectionId });\n\n// 2. Select organization\nconst orgId = orgs[0].id;\n\n// 3. List campaigns\nconst campaigns = await sdk.ads.listAdsCampaigns({\n  connectionId,\n  orgId,\n});\n\n// 4. Retrieve campaign\nconst campaign = await sdk.ads.getAdsCampaign({\n  connectionId,\n  id: campaigns[0].id!,\n});\n\n// 5. Pause campaign\nawait sdk.ads.updateAdsCampaign({\n  connectionId,\n  id: campaign.id!,\n  adsCampaign: {\n    ...campaign,\n    status: 'PAUSED',\n  },\n});\n",[160106],{"type":17,"tag":6121,"props":160107,"children":160108},{"__ignoreMap":7},[160109],{"type":23,"value":160104},{"type":17,"tag":29,"props":160111,"children":160112},{},[160113],{"type":23,"value":160114},"No per-provider branching required in your integration logic. Only provider capability checks for writable fields.",{"type":17,"tag":68,"props":160116,"children":160117},{"id":883},[160118],{"type":23,"value":19178},{"type":17,"tag":29,"props":160120,"children":160121},{},[160122],{"type":23,"value":160123},"Campaign controls appear simple but become complex at scale.",{"type":17,"tag":29,"props":160125,"children":160126},{},[160127],{"type":23,"value":160128},"Unified's Advertising category gives you:",{"type":17,"tag":80,"props":160130,"children":160131},{},[160132,160137,160142,160147,160152],{"type":17,"tag":84,"props":160133,"children":160134},{},[160135],{"type":23,"value":160136},"A unified API surface per category",{"type":17,"tag":84,"props":160138,"children":160139},{},[160140],{"type":23,"value":160141},"Real-time read/write behavior",{"type":17,"tag":84,"props":160143,"children":160144},{},[160145],{"type":23,"value":160146},"Explicit provider capability handling",{"type":17,"tag":84,"props":160148,"children":160149},{},[160150],{"type":23,"value":160151},"Production-safe error semantics",{"type":17,"tag":84,"props":160153,"children":160154},{},[160155],{"type":23,"value":46580},{"type":17,"tag":29,"props":160157,"children":160158},{},[160159],{"type":23,"value":160160},"You can implement pause/resume, budget updates, and flight adjustments across supported advertising platforms without maintaining separate integrations per provider.",{"type":17,"tag":29,"props":160162,"children":160163},{},[160164],{"type":23,"value":160165},"That is infrastructure, not integration maintenance.",{"type":17,"tag":29,"props":160167,"children":160168},{},[160169],{"type":17,"tag":133,"props":160170,"children":160172},{"href":1612,"rel":160171},[214],[160173],{"type":23,"value":44481},{"type":17,"tag":29,"props":160175,"children":160176},{},[160177],{"type":17,"tag":133,"props":160178,"children":160180},{"href":1623,"rel":160179},[214],[160181],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":160183},[160184,160189,160190,160193,160197,160201,160207,160208,160209,160210],{"id":141798,"depth":1629,"text":141801,"children":160185},[160186,160187,160188],{"id":159397,"depth":1635,"text":159400},{"id":159462,"depth":1635,"text":159465},{"id":159556,"depth":1635,"text":159559},{"id":159580,"depth":1629,"text":159583},{"id":159617,"depth":1629,"text":159620,"children":160191},[160192],{"id":159646,"depth":1635,"text":159649},{"id":159676,"depth":1629,"text":159679,"children":160194},[160195,160196],{"id":159696,"depth":1635,"text":159699},{"id":144224,"depth":1635,"text":145535},{"id":159748,"depth":1629,"text":159751,"children":160198},[160199,160200],{"id":159768,"depth":1635,"text":159771},{"id":159783,"depth":1635,"text":145535},{"id":159816,"depth":1629,"text":159819,"children":160202},[160203,160204,160205,160206],{"id":159827,"depth":1635,"text":159830},{"id":159856,"depth":1635,"text":159859},{"id":159880,"depth":1635,"text":159883},{"id":159936,"depth":1635,"text":159939},{"id":159959,"depth":1629,"text":159962},{"id":160002,"depth":1629,"text":160005},{"id":160097,"depth":1629,"text":160100},{"id":883,"depth":1629,"text":19178},"content:blog:build_cross_platform_campaign_controls_status_budgets_flight_dates_with_unified_advertising_api.md","blog/build_cross_platform_campaign_controls_status_budgets_flight_dates_with_unified_advertising_api.md","blog/build_cross_platform_campaign_controls_status_budgets_flight_dates_with_unified_advertising_api",{"_path":160215,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":160216,"description":160217,"img":160218,"date":160219,"tag":12,"body":160220,"_type":1677,"_id":161630,"_source":1679,"_file":161631,"_stem":161632,"_extension":1682},"/blog/how_to_build_legal_contract_search_and_insights_with_rag_using_unified_storage_and_kms_apis","How to Build Legal Contract Search and Insights with RAG Using Unified's Storage and KMS APIs","Retrieval-Augmented Generation (RAG) is one of the most common patterns for building AI systems grounded in enterprise data.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_legal_contract_search_and_insights_with_rag_using_unified_storage_and_kms_apis-icon.png","2026-02-13T13:59:00.000Z",{"type":14,"children":160221,"toc":161614},[160222,160227,160230,160237,160247,160252,160275,160280,160303,160308,160320,160326,160331,160336,160354,160359,160382,160387,160410,160421,160426,160432,160437,160450,160455,160461,160472,160477,160608,160613,160695,160700,160706,160718,160722,160857,160861,160891,160896,160902,160907,160918,160936,160948,160959,160965,160970,160974,160992,160997,161020,161031,161036,161042,161047,161056,161061,161070,161075,161080,161086,161091,161100,161105,161114,161125,161130,161136,161141,161146,161169,161174,161235,161240,161246,161250,161268,161273,161278,161301,161307,161312,161365,161370,161375,161380,161386,161391,161395,161418,161423,161428,161434,161439,161466,161471,161476,161482,161487,161491,161514,161519,161542,161547,161552,161556,161561,161566,161593,161598,161606],{"type":17,"tag":18,"props":160223,"children":160225},{"id":160224},"how-to-build-legal-contract-search-and-insights-with-rag-using-unifieds-storage-and-kms-apis",[160226],{"type":23,"value":160216},{"type":17,"tag":25,"props":160228,"children":160229},{},[],{"type":17,"tag":29,"props":160231,"children":160232},{},[160233],{"type":17,"tag":33,"props":160234,"children":160235},{},[160236],{"type":23,"value":159298},{"type":17,"tag":29,"props":160238,"children":160239},{},[160240,160245],{"type":17,"tag":133,"props":160241,"children":160242},{"href":77021},[160243],{"type":23,"value":160244},"Retrieval-Augmented Generation",{"type":23,"value":160246}," (RAG) is one of the most common patterns for building AI systems grounded in enterprise data.",{"type":17,"tag":29,"props":160248,"children":160249},{},[160250],{"type":23,"value":160251},"In legal teams, RAG is often used to:",{"type":17,"tag":80,"props":160253,"children":160254},{},[160255,160260,160265,160270],{"type":17,"tag":84,"props":160256,"children":160257},{},[160258],{"type":23,"value":160259},"Search contracts across multiple repositories",{"type":17,"tag":84,"props":160261,"children":160262},{},[160263],{"type":23,"value":160264},"Answer clause-level questions",{"type":17,"tag":84,"props":160266,"children":160267},{},[160268],{"type":23,"value":160269},"Surface renewal terms and termination language",{"type":17,"tag":84,"props":160271,"children":160272},{},[160273],{"type":23,"value":160274},"Ground AI responses in actual agreement text",{"type":17,"tag":29,"props":160276,"children":160277},{},[160278],{"type":23,"value":160279},"But legal RAG systems fail when they:",{"type":17,"tag":80,"props":160281,"children":160282},{},[160283,160288,160293,160298],{"type":17,"tag":84,"props":160284,"children":160285},{},[160286],{"type":23,"value":160287},"Index documents without respecting permissions",{"type":17,"tag":84,"props":160289,"children":160290},{},[160291],{"type":23,"value":160292},"Mix tenant data",{"type":17,"tag":84,"props":160294,"children":160295},{},[160296],{"type":23,"value":160297},"Ignore document structure",{"type":17,"tag":84,"props":160299,"children":160300},{},[160301],{"type":23,"value":160302},"Treat legal insight as inference instead of retrieval",{"type":17,"tag":29,"props":160304,"children":160305},{},[160306],{"type":23,"value":160307},"Unified's Storage and Knowledge Management (KMS) APIs provide the normalized, real-time data layer required to implement contract RAG pipelines correctly.",{"type":17,"tag":29,"props":160309,"children":160310},{},[160311,160313,160318],{"type":23,"value":160312},"This guide shows how to build a ",{"type":17,"tag":48,"props":160314,"children":160315},{},[160316],{"type":23,"value":160317},"permission-aware, tenant-isolated, incrementally synchronized RAG pipeline for legal contracts",{"type":23,"value":160319}," using Unified.",{"type":17,"tag":68,"props":160321,"children":160323},{"id":160322},"what-rag-means-in-a-legal-context",[160324],{"type":23,"value":160325},"What RAG Means in a Legal Context",{"type":17,"tag":29,"props":160327,"children":160328},{},[160329],{"type":23,"value":160330},"RAG (Retrieval-Augmented Generation) is not model training.",{"type":17,"tag":29,"props":160332,"children":160333},{},[160334],{"type":23,"value":160335},"It is a pattern:",{"type":17,"tag":6154,"props":160337,"children":160338},{},[160339,160344,160349],{"type":17,"tag":84,"props":160340,"children":160341},{},[160342],{"type":23,"value":160343},"Retrieve relevant contract content.",{"type":17,"tag":84,"props":160345,"children":160346},{},[160347],{"type":23,"value":160348},"Provide that content as context.",{"type":17,"tag":84,"props":160350,"children":160351},{},[160352],{"type":23,"value":160353},"Generate a response grounded in the retrieved text.",{"type":17,"tag":29,"props":160355,"children":160356},{},[160357],{"type":23,"value":160358},"For legal use cases, RAG must be:",{"type":17,"tag":80,"props":160360,"children":160361},{},[160362,160367,160372,160377],{"type":17,"tag":84,"props":160363,"children":160364},{},[160365],{"type":23,"value":160366},"Deterministic",{"type":17,"tag":84,"props":160368,"children":160369},{},[160370],{"type":23,"value":160371},"Permission-aware",{"type":17,"tag":84,"props":160373,"children":160374},{},[160375],{"type":23,"value":160376},"Metadata-driven",{"type":17,"tag":84,"props":160378,"children":160379},{},[160380],{"type":23,"value":160381},"Non-inferential",{"type":17,"tag":29,"props":160383,"children":160384},{},[160385],{"type":23,"value":160386},"Legal RAG answers questions like:",{"type":17,"tag":80,"props":160388,"children":160389},{},[160390,160395,160400,160405],{"type":17,"tag":84,"props":160391,"children":160392},{},[160393],{"type":23,"value":160394},"Which contracts include indemnification clauses?",{"type":17,"tag":84,"props":160396,"children":160397},{},[160398],{"type":23,"value":160399},"Which agreements auto-renew?",{"type":17,"tag":84,"props":160401,"children":160402},{},[160403],{"type":23,"value":160404},"Which vendor contracts expire next quarter?",{"type":17,"tag":84,"props":160406,"children":160407},{},[160408],{"type":23,"value":160409},"Where is termination for convenience defined?",{"type":17,"tag":29,"props":160411,"children":160412},{},[160413,160415,160419],{"type":23,"value":160414},"It does ",{"type":17,"tag":48,"props":160416,"children":160417},{},[160418],{"type":23,"value":159475},{"type":23,"value":160420}," determine compliance or legal validity.",{"type":17,"tag":29,"props":160422,"children":160423},{},[160424],{"type":23,"value":160425},"Unified provides the data retrieval layer for this architecture. You own embeddings, vector storage, and model behavior.",{"type":17,"tag":18,"props":160427,"children":160429},{"id":160428},"where-legal-contracts-live-in-saas-systems",[160430],{"type":23,"value":160431},"Where Legal Contracts Live in SaaS Systems",{"type":17,"tag":29,"props":160433,"children":160434},{},[160435],{"type":23,"value":160436},"Enterprise contracts typically exist in:",{"type":17,"tag":80,"props":160438,"children":160439},{},[160440,160445],{"type":17,"tag":84,"props":160441,"children":160442},{},[160443],{"type":23,"value":160444},"File Storage (PDF contracts)",{"type":17,"tag":84,"props":160446,"children":160447},{},[160448],{"type":23,"value":160449},"Knowledge Management systems (Notion, Confluence contract pages)",{"type":17,"tag":29,"props":160451,"children":160452},{},[160453],{"type":23,"value":160454},"Unified normalizes both.",{"type":17,"tag":68,"props":160456,"children":160458},{"id":160457},"storagefile-file-storage-api",[160459],{"type":23,"value":160460},"StorageFile (File Storage API)",{"type":17,"tag":29,"props":160462,"children":160463},{},[160464,160466,160471],{"type":23,"value":160465},"Contracts stored as files are represented as ",{"type":17,"tag":6121,"props":160467,"children":160469},{"className":160468},[],[160470],{"type":23,"value":72411},{"type":23,"value":54},{"type":17,"tag":29,"props":160473,"children":160474},{},[160475],{"type":23,"value":160476},"Relevant fields:",{"type":17,"tag":80,"props":160478,"children":160479},{},[160480,160488,160496,160504,160512,160520,160528,160536,160558,160566,160575,160583,160592,160600],{"type":17,"tag":84,"props":160481,"children":160482},{},[160483],{"type":17,"tag":6121,"props":160484,"children":160486},{"className":160485},[],[160487],{"type":23,"value":18766},{"type":17,"tag":84,"props":160489,"children":160490},{},[160491],{"type":17,"tag":6121,"props":160492,"children":160494},{"className":160493},[],[160495],{"type":23,"value":33446},{"type":17,"tag":84,"props":160497,"children":160498},{},[160499],{"type":17,"tag":6121,"props":160500,"children":160502},{"className":160501},[],[160503],{"type":23,"value":25337},{"type":17,"tag":84,"props":160505,"children":160506},{},[160507],{"type":17,"tag":6121,"props":160508,"children":160510},{"className":160509},[],[160511],{"type":23,"value":18781},{"type":17,"tag":84,"props":160513,"children":160514},{},[160515],{"type":17,"tag":6121,"props":160516,"children":160518},{"className":160517},[],[160519],{"type":23,"value":15863},{"type":17,"tag":84,"props":160521,"children":160522},{},[160523],{"type":17,"tag":6121,"props":160524,"children":160526},{"className":160525},[],[160527],{"type":23,"value":62582},{"type":17,"tag":84,"props":160529,"children":160530},{},[160531],{"type":17,"tag":6121,"props":160532,"children":160534},{"className":160533},[],[160535],{"type":23,"value":20181},{"type":17,"tag":84,"props":160537,"children":160538},{},[160539,160544,160545,160550,160551,160557],{"type":17,"tag":6121,"props":160540,"children":160542},{"className":160541},[],[160543],{"type":23,"value":27310},{"type":23,"value":44573},{"type":17,"tag":6121,"props":160546,"children":160548},{"className":160547},[],[160549],{"type":23,"value":134717},{"type":23,"value":75890},{"type":17,"tag":6121,"props":160552,"children":160554},{"className":160553},[],[160555],{"type":23,"value":160556},"FOLDER",{"type":23,"value":12034},{"type":17,"tag":84,"props":160559,"children":160560},{},[160561],{"type":17,"tag":6121,"props":160562,"children":160564},{"className":160563},[],[160565],{"type":23,"value":72581},{"type":17,"tag":84,"props":160567,"children":160568},{},[160569],{"type":17,"tag":6121,"props":160570,"children":160572},{"className":160571},[],[160573],{"type":23,"value":160574},"permissions[]",{"type":17,"tag":84,"props":160576,"children":160577},{},[160578],{"type":17,"tag":6121,"props":160579,"children":160581},{"className":160580},[],[160582],{"type":23,"value":24978},{"type":17,"tag":84,"props":160584,"children":160585},{},[160586],{"type":17,"tag":6121,"props":160587,"children":160589},{"className":160588},[],[160590],{"type":23,"value":160591},"hash",{"type":17,"tag":84,"props":160593,"children":160594},{},[160595],{"type":17,"tag":6121,"props":160596,"children":160598},{"className":160597},[],[160599],{"type":23,"value":72684},{"type":17,"tag":84,"props":160601,"children":160602},{},[160603],{"type":17,"tag":6121,"props":160604,"children":160606},{"className":160605},[],[160607],{"type":23,"value":12107},{"type":17,"tag":29,"props":160609,"children":160610},{},[160611],{"type":23,"value":160612},"Important RAG implications:",{"type":17,"tag":80,"props":160614,"children":160615},{},[160616,160626,160685,160690],{"type":17,"tag":84,"props":160617,"children":160618},{},[160619,160624],{"type":17,"tag":6121,"props":160620,"children":160622},{"className":160621},[],[160623],{"type":23,"value":24978},{"type":23,"value":160625}," expires after 1 hour (must re-fetch when reprocessing)",{"type":17,"tag":84,"props":160627,"children":160628},{},[160629,160634,160636],{"type":17,"tag":6121,"props":160630,"children":160632},{"className":160631},[],[160633],{"type":23,"value":160574},{"type":23,"value":160635}," includes:\n",{"type":17,"tag":80,"props":160637,"children":160638},{},[160639,160647,160655],{"type":17,"tag":84,"props":160640,"children":160641},{},[160642],{"type":17,"tag":6121,"props":160643,"children":160645},{"className":160644},[],[160646],{"type":23,"value":62582},{"type":17,"tag":84,"props":160648,"children":160649},{},[160650],{"type":17,"tag":6121,"props":160651,"children":160653},{"className":160652},[],[160654],{"type":23,"value":47281},{"type":17,"tag":84,"props":160656,"children":160657},{},[160658,160663,160664,160670,160671,160677,160678,160684],{"type":17,"tag":6121,"props":160659,"children":160661},{"className":160660},[],[160662],{"type":23,"value":29819},{"type":23,"value":44573},{"type":17,"tag":6121,"props":160665,"children":160667},{"className":160666},[],[160668],{"type":23,"value":160669},"OWNER",{"type":23,"value":11826},{"type":17,"tag":6121,"props":160672,"children":160674},{"className":160673},[],[160675],{"type":23,"value":160676},"READ",{"type":23,"value":11826},{"type":17,"tag":6121,"props":160679,"children":160681},{"className":160680},[],[160682],{"type":23,"value":160683},"WRITE",{"type":23,"value":12034},{"type":17,"tag":84,"props":160686,"children":160687},{},[160688],{"type":23,"value":160689},"Explicit permission metadata is available only for file objects",{"type":17,"tag":84,"props":160691,"children":160692},{},[160693],{"type":23,"value":160694},"Unified does not enforce access — your RAG system must",{"type":17,"tag":29,"props":160696,"children":160697},{},[160698],{"type":23,"value":160699},"This makes StorageFile ideal for embedding contract PDFs with permission metadata attached.",{"type":17,"tag":68,"props":160701,"children":160703},{"id":160702},"kmspage-knowledge-management-api",[160704],{"type":23,"value":160705},"KmsPage (Knowledge Management API)",{"type":17,"tag":29,"props":160707,"children":160708},{},[160709,160711,160717],{"type":23,"value":160710},"Contracts stored as structured pages use ",{"type":17,"tag":6121,"props":160712,"children":160714},{"className":160713},[],[160715],{"type":23,"value":160716},"KmsPage",{"type":23,"value":54},{"type":17,"tag":29,"props":160719,"children":160720},{},[160721],{"type":23,"value":160476},{"type":17,"tag":80,"props":160723,"children":160724},{},[160725,160733,160741,160749,160757,160792,160800,160808,160816,160824,160832,160840,160849],{"type":17,"tag":84,"props":160726,"children":160727},{},[160728],{"type":17,"tag":6121,"props":160729,"children":160731},{"className":160730},[],[160732],{"type":23,"value":18766},{"type":17,"tag":84,"props":160734,"children":160735},{},[160736],{"type":17,"tag":6121,"props":160737,"children":160739},{"className":160738},[],[160740],{"type":23,"value":33446},{"type":17,"tag":84,"props":160742,"children":160743},{},[160744],{"type":17,"tag":6121,"props":160745,"children":160747},{"className":160746},[],[160748],{"type":23,"value":25337},{"type":17,"tag":84,"props":160750,"children":160751},{},[160752],{"type":17,"tag":6121,"props":160753,"children":160755},{"className":160754},[],[160756],{"type":23,"value":62346},{"type":17,"tag":84,"props":160758,"children":160759},{},[160760,160765,160766,160772,160773,160779,160780,160785,160786,160791],{"type":17,"tag":6121,"props":160761,"children":160763},{"className":160762},[],[160764],{"type":23,"value":27310},{"type":23,"value":44573},{"type":17,"tag":6121,"props":160767,"children":160769},{"className":160768},[],[160770],{"type":23,"value":160771},"HTML",{"type":23,"value":11826},{"type":17,"tag":6121,"props":160774,"children":160776},{"className":160775},[],[160777],{"type":23,"value":160778},"MARKDOWN",{"type":23,"value":11826},{"type":17,"tag":6121,"props":160781,"children":160783},{"className":160782},[],[160784],{"type":23,"value":134613},{"type":23,"value":11826},{"type":17,"tag":6121,"props":160787,"children":160789},{"className":160788},[],[160790],{"type":23,"value":149660},{"type":23,"value":12034},{"type":17,"tag":84,"props":160793,"children":160794},{},[160795],{"type":17,"tag":6121,"props":160796,"children":160798},{"className":160797},[],[160799],{"type":23,"value":72943},{"type":17,"tag":84,"props":160801,"children":160802},{},[160803],{"type":17,"tag":6121,"props":160804,"children":160806},{"className":160805},[],[160807],{"type":23,"value":15863},{"type":17,"tag":84,"props":160809,"children":160810},{},[160811],{"type":17,"tag":6121,"props":160812,"children":160814},{"className":160813},[],[160815],{"type":23,"value":62868},{"type":17,"tag":84,"props":160817,"children":160818},{},[160819],{"type":17,"tag":6121,"props":160820,"children":160822},{"className":160821},[],[160823],{"type":23,"value":62582},{"type":17,"tag":84,"props":160825,"children":160826},{},[160827],{"type":17,"tag":6121,"props":160828,"children":160830},{"className":160829},[],[160831],{"type":23,"value":24978},{"type":17,"tag":84,"props":160833,"children":160834},{},[160835],{"type":17,"tag":6121,"props":160836,"children":160838},{"className":160837},[],[160839],{"type":23,"value":133378},{"type":17,"tag":84,"props":160841,"children":160842},{},[160843],{"type":17,"tag":6121,"props":160844,"children":160846},{"className":160845},[],[160847],{"type":23,"value":160848},"has_children",{"type":17,"tag":84,"props":160850,"children":160851},{},[160852],{"type":17,"tag":6121,"props":160853,"children":160855},{"className":160854},[],[160856],{"type":23,"value":12107},{"type":17,"tag":29,"props":160858,"children":160859},{},[160860],{"type":23,"value":160612},{"type":17,"tag":80,"props":160862,"children":160863},{},[160864,160876,160881],{"type":17,"tag":84,"props":160865,"children":160866},{},[160867,160869,160874],{"type":23,"value":160868},"No explicit ",{"type":17,"tag":6121,"props":160870,"children":160872},{"className":160871},[],[160873],{"type":23,"value":160574},{"type":23,"value":160875}," structure",{"type":17,"tag":84,"props":160877,"children":160878},{},[160879],{"type":23,"value":160880},"Access must be enforced at the application layer",{"type":17,"tag":84,"props":160882,"children":160883},{},[160884,160886],{"type":23,"value":160885},"Content must be fetched via ",{"type":17,"tag":6121,"props":160887,"children":160889},{"className":160888},[],[160890],{"type":23,"value":24978},{"type":17,"tag":29,"props":160892,"children":160893},{},[160894],{"type":23,"value":160895},"RAG pipelines must treat KMS content differently than file storage content.",{"type":17,"tag":68,"props":160897,"children":160899},{"id":160898},"step-1-connect-contract-data-sources",[160900],{"type":23,"value":160901},"Step 1: Connect Contract Data Sources",{"type":17,"tag":29,"props":160903,"children":160904},{},[160905],{"type":23,"value":160906},"Authorize integrations using Embedded Auth.",{"type":17,"tag":29,"props":160908,"children":160909},{},[160910,160912,160917],{"type":23,"value":160911},"Each integration produces a ",{"type":17,"tag":6121,"props":160913,"children":160915},{"className":160914},[],[160916],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":160919,"children":160920},{},[160921,160923,160928,160930,160935],{"type":23,"value":160922},"In RAG systems, ",{"type":17,"tag":6121,"props":160924,"children":160926},{"className":160925},[],[160927],{"type":23,"value":25037},{"type":23,"value":160929}," must be treated as the ",{"type":17,"tag":48,"props":160931,"children":160932},{},[160933],{"type":23,"value":160934},"tenant boundary",{"type":23,"value":54},{"type":17,"tag":29,"props":160937,"children":160938},{},[160939,160941,160946],{"type":23,"value":160940},"All Unified endpoints require ",{"type":17,"tag":6121,"props":160942,"children":160944},{"className":160943},[],[160945],{"type":23,"value":25037},{"type":23,"value":160947},". Unified enforces isolation at the connection level.",{"type":17,"tag":29,"props":160949,"children":160950},{},[160951,160953,160958],{"type":23,"value":160952},"Your vector database must also filter by ",{"type":17,"tag":6121,"props":160954,"children":160956},{"className":160955},[],[160957],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":68,"props":160960,"children":160962},{"id":160961},"step-2-subscribe-to-contract-updates",[160963],{"type":23,"value":160964},"Step 2: Subscribe to Contract Updates",{"type":17,"tag":29,"props":160966,"children":160967},{},[160968],{"type":23,"value":160969},"RAG systems require freshness.",{"type":17,"tag":29,"props":160971,"children":160972},{},[160973],{"type":23,"value":95391},{"type":17,"tag":80,"props":160975,"children":160976},{},[160977,160987],{"type":17,"tag":84,"props":160978,"children":160979},{},[160980,160981,160985],{"type":23,"value":119374},{"type":17,"tag":133,"props":160982,"children":160983},{"href":4999},[160984],{"type":23,"value":5002},{"type":23,"value":160986}," (push-based)",{"type":17,"tag":84,"props":160988,"children":160989},{},[160990],{"type":23,"value":160991},"Virtual webhooks (polling-based)",{"type":17,"tag":29,"props":160993,"children":160994},{},[160995],{"type":23,"value":160996},"Subscribe to:",{"type":17,"tag":80,"props":160998,"children":160999},{},[161000,161005,161010,161015],{"type":17,"tag":84,"props":161001,"children":161002},{},[161003],{"type":23,"value":161004},"File created",{"type":17,"tag":84,"props":161006,"children":161007},{},[161008],{"type":23,"value":161009},"File updated",{"type":17,"tag":84,"props":161011,"children":161012},{},[161013],{"type":23,"value":161014},"Page created",{"type":17,"tag":84,"props":161016,"children":161017},{},[161018],{"type":23,"value":161019},"Page updated",{"type":17,"tag":29,"props":161021,"children":161022},{},[161023,161025,161030],{"type":23,"value":161024},"Deletion event support varies by provider. If unavailable, use incremental sync via ",{"type":17,"tag":6121,"props":161026,"children":161028},{"className":161027},[],[161029],{"type":23,"value":26291},{"type":23,"value":54},{"type":17,"tag":29,"props":161032,"children":161033},{},[161034],{"type":23,"value":161035},"For legal RAG, webhook-driven indexing is strongly preferred over polling.",{"type":17,"tag":68,"props":161037,"children":161039},{"id":161038},"step-3-retrieve-metadata-first",[161040],{"type":23,"value":161041},"Step 3: Retrieve Metadata First",{"type":17,"tag":29,"props":161043,"children":161044},{},[161045],{"type":23,"value":161046},"Example (Storage):",{"type":17,"tag":6893,"props":161048,"children":161051},{"className":161049,"code":161050,"language":18718,"meta":7},[18716],"const files = await sdk.storage.listStorageFiles({\n  connectionId,\n  limit: 100,\n  fields: 'id,name,type,mime_type,updated_at,permissions'\n});\n",[161052],{"type":17,"tag":6121,"props":161053,"children":161054},{"__ignoreMap":7},[161055],{"type":23,"value":161050},{"type":17,"tag":29,"props":161057,"children":161058},{},[161059],{"type":23,"value":161060},"Example (KMS):",{"type":17,"tag":6893,"props":161062,"children":161065},{"className":161063,"code":161064,"language":18718,"meta":7},[18716],"const pages = await sdk.kms.listKmsPages({\n  connectionId,\n  limit: 100,\n  fields: 'id,title,space_id,updated_at'\n});\n",[161066],{"type":17,"tag":6121,"props":161067,"children":161068},{"__ignoreMap":7},[161069],{"type":23,"value":161064},{"type":17,"tag":29,"props":161071,"children":161072},{},[161073],{"type":23,"value":161074},"List endpoints return metadata only.",{"type":17,"tag":29,"props":161076,"children":161077},{},[161078],{"type":23,"value":161079},"Full content must be retrieved explicitly.",{"type":17,"tag":68,"props":161081,"children":161083},{"id":161082},"step-4-retrieve-full-contract-content",[161084],{"type":23,"value":161085},"Step 4: Retrieve Full Contract Content",{"type":17,"tag":29,"props":161087,"children":161088},{},[161089],{"type":23,"value":161090},"Storage:",{"type":17,"tag":6893,"props":161092,"children":161095},{"className":161093,"code":161094,"language":18718,"meta":7},[18716],"const file = await sdk.storage.getStorageFile({\n  connectionId,\n  id: fileId,\n  fields: 'download_url'\n});\n",[161096],{"type":17,"tag":6121,"props":161097,"children":161098},{"__ignoreMap":7},[161099],{"type":23,"value":161094},{"type":17,"tag":29,"props":161101,"children":161102},{},[161103],{"type":23,"value":161104},"KMS:",{"type":17,"tag":6893,"props":161106,"children":161109},{"className":161107,"code":161108,"language":18718,"meta":7},[18716],"const page = await sdk.kms.getKmsPage({\n  connectionId,\n  id: pageId,\n  fields: 'download_url'\n});\n",[161110],{"type":17,"tag":6121,"props":161111,"children":161112},{"__ignoreMap":7},[161113],{"type":23,"value":161108},{"type":17,"tag":29,"props":161115,"children":161116},{},[161117,161119,161124],{"type":23,"value":161118},"Fetch the content using the returned ",{"type":17,"tag":6121,"props":161120,"children":161122},{"className":161121},[],[161123],{"type":23,"value":24978},{"type":23,"value":54},{"type":17,"tag":29,"props":161126,"children":161127},{},[161128],{"type":23,"value":161129},"Unified does not inline contract bodies.",{"type":17,"tag":68,"props":161131,"children":161133},{"id":161132},"step-5-chunk-contracts-for-rag",[161134],{"type":23,"value":161135},"Step 5: Chunk Contracts for RAG",{"type":17,"tag":29,"props":161137,"children":161138},{},[161139],{"type":23,"value":161140},"Legal RAG quality depends on chunking.",{"type":17,"tag":29,"props":161142,"children":161143},{},[161144],{"type":23,"value":161145},"Chunk by:",{"type":17,"tag":80,"props":161147,"children":161148},{},[161149,161154,161159,161164],{"type":17,"tag":84,"props":161150,"children":161151},{},[161152],{"type":23,"value":161153},"Section headings",{"type":17,"tag":84,"props":161155,"children":161156},{},[161157],{"type":23,"value":161158},"Clause boundaries",{"type":17,"tag":84,"props":161160,"children":161161},{},[161162],{"type":23,"value":161163},"Defined term groupings",{"type":17,"tag":84,"props":161165,"children":161166},{},[161167],{"type":23,"value":161168},"Structured paragraphs",{"type":17,"tag":29,"props":161170,"children":161171},{},[161172],{"type":23,"value":161173},"Attach metadata to each chunk:",{"type":17,"tag":80,"props":161175,"children":161176},{},[161177,161185,161194,161203,161211,161221],{"type":17,"tag":84,"props":161178,"children":161179},{},[161180],{"type":17,"tag":6121,"props":161181,"children":161183},{"className":161182},[],[161184],{"type":23,"value":25037},{"type":17,"tag":84,"props":161186,"children":161187},{},[161188],{"type":17,"tag":6121,"props":161189,"children":161191},{"className":161190},[],[161192],{"type":23,"value":161193},"object_type",{"type":17,"tag":84,"props":161195,"children":161196},{},[161197],{"type":17,"tag":6121,"props":161198,"children":161200},{"className":161199},[],[161201],{"type":23,"value":161202},"object_id",{"type":17,"tag":84,"props":161204,"children":161205},{},[161206],{"type":17,"tag":6121,"props":161207,"children":161209},{"className":161208},[],[161210],{"type":23,"value":25337},{"type":17,"tag":84,"props":161212,"children":161213},{},[161214,161219],{"type":17,"tag":6121,"props":161215,"children":161217},{"className":161216},[],[161218],{"type":23,"value":24204},{"type":23,"value":161220}," (for files)",{"type":17,"tag":84,"props":161222,"children":161223},{},[161224,161229,161230],{"type":17,"tag":6121,"props":161225,"children":161227},{"className":161226},[],[161228],{"type":23,"value":72943},{"type":23,"value":26030},{"type":17,"tag":6121,"props":161231,"children":161233},{"className":161232},[],[161234],{"type":23,"value":15863},{"type":17,"tag":29,"props":161236,"children":161237},{},[161238],{"type":23,"value":161239},"Unified normalizes the schema. You manage embedding and vector storage.",{"type":17,"tag":68,"props":161241,"children":161243},{"id":161242},"step-6-store-in-your-vector-database",[161244],{"type":23,"value":161245},"Step 6: Store in Your Vector Database",{"type":17,"tag":29,"props":161247,"children":161248},{},[161249],{"type":23,"value":104494},{"type":17,"tag":80,"props":161251,"children":161252},{},[161253,161258,161263],{"type":17,"tag":84,"props":161254,"children":161255},{},[161256],{"type":23,"value":161257},"Store embeddings",{"type":17,"tag":84,"props":161259,"children":161260},{},[161261],{"type":23,"value":161262},"Cache payloads",{"type":17,"tag":84,"props":161264,"children":161265},{},[161266],{"type":23,"value":161267},"Maintain vector indexes",{"type":17,"tag":29,"props":161269,"children":161270},{},[161271],{"type":23,"value":161272},"Store embeddings in your infrastructure.",{"type":17,"tag":29,"props":161274,"children":161275},{},[161276],{"type":23,"value":161277},"Use metadata to support:",{"type":17,"tag":80,"props":161279,"children":161280},{},[161281,161286,161291,161296],{"type":17,"tag":84,"props":161282,"children":161283},{},[161284],{"type":23,"value":161285},"Tenant isolation",{"type":17,"tag":84,"props":161287,"children":161288},{},[161289],{"type":23,"value":161290},"Permission enforcement",{"type":17,"tag":84,"props":161292,"children":161293},{},[161294],{"type":23,"value":161295},"Update replacement",{"type":17,"tag":84,"props":161297,"children":161298},{},[161299],{"type":23,"value":161300},"Space/folder scoping",{"type":17,"tag":68,"props":161302,"children":161304},{"id":161303},"step-7-permission-aware-rag-retrieval",[161305],{"type":23,"value":161306},"Step 7: Permission-Aware RAG Retrieval",{"type":17,"tag":29,"props":161308,"children":161309},{},[161310],{"type":23,"value":161311},"When a user queries:",{"type":17,"tag":6154,"props":161313,"children":161314},{},[161315,161320,161325,161355,161360],{"type":17,"tag":84,"props":161316,"children":161317},{},[161318],{"type":23,"value":161319},"Embed the query.",{"type":17,"tag":84,"props":161321,"children":161322},{},[161323],{"type":23,"value":161324},"Retrieve top-matching chunks.",{"type":17,"tag":84,"props":161326,"children":161327},{},[161328,161330],{"type":23,"value":161329},"Filter by:\n",{"type":17,"tag":80,"props":161331,"children":161332},{},[161333,161341,161350],{"type":17,"tag":84,"props":161334,"children":161335},{},[161336],{"type":17,"tag":6121,"props":161337,"children":161339},{"className":161338},[],[161340],{"type":23,"value":25037},{"type":17,"tag":84,"props":161342,"children":161343},{},[161344,161349],{"type":17,"tag":6121,"props":161345,"children":161347},{"className":161346},[],[161348],{"type":23,"value":160574},{"type":23,"value":161220},{"type":17,"tag":84,"props":161351,"children":161352},{},[161353],{"type":23,"value":161354},"Application-level user rules (for pages)",{"type":17,"tag":84,"props":161356,"children":161357},{},[161358],{"type":23,"value":161359},"Pass filtered context to the model.",{"type":17,"tag":84,"props":161361,"children":161362},{},[161363],{"type":23,"value":161364},"Generate response.",{"type":17,"tag":29,"props":161366,"children":161367},{},[161368],{"type":23,"value":161369},"File objects include explicit permission metadata.",{"type":17,"tag":29,"props":161371,"children":161372},{},[161373],{"type":23,"value":161374},"KMS objects do not.",{"type":17,"tag":29,"props":161376,"children":161377},{},[161378],{"type":23,"value":161379},"Your RAG system must enforce access before generation.",{"type":17,"tag":68,"props":161381,"children":161383},{"id":161382},"real-time-rag-vs-static-indexing",[161384],{"type":23,"value":161385},"Real-Time RAG vs Static Indexing",{"type":17,"tag":29,"props":161387,"children":161388},{},[161389],{"type":23,"value":161390},"Legal RAG systems require up-to-date contracts.",{"type":17,"tag":29,"props":161392,"children":161393},{},[161394],{"type":23,"value":95512},{"type":17,"tag":80,"props":161396,"children":161397},{},[161398,161403,161413],{"type":17,"tag":84,"props":161399,"children":161400},{},[161401],{"type":23,"value":161402},"Webhooks for real-time ingestion",{"type":17,"tag":84,"props":161404,"children":161405},{},[161406,161411],{"type":17,"tag":6121,"props":161407,"children":161409},{"className":161408},[],[161410],{"type":23,"value":26291},{"type":23,"value":161412}," for incremental sync",{"type":17,"tag":84,"props":161414,"children":161415},{},[161416],{"type":23,"value":161417},"Re-chunking and re-embedding on updates",{"type":17,"tag":29,"props":161419,"children":161420},{},[161421],{"type":23,"value":161422},"RAG without synchronization leads to stale contract answers.",{"type":17,"tag":29,"props":161424,"children":161425},{},[161426],{"type":23,"value":161427},"Unified supports event-driven ingestion but does not manage embeddings.",{"type":17,"tag":68,"props":161429,"children":161431},{"id":161430},"when-to-use-rag-for-legal-contracts",[161432],{"type":23,"value":161433},"When to Use RAG for Legal Contracts",{"type":17,"tag":29,"props":161435,"children":161436},{},[161437],{"type":23,"value":161438},"Use RAG when you need:",{"type":17,"tag":80,"props":161440,"children":161441},{},[161442,161447,161451,161456,161461],{"type":17,"tag":84,"props":161443,"children":161444},{},[161445],{"type":23,"value":161446},"Clause-level search",{"type":17,"tag":84,"props":161448,"children":161449},{},[161450],{"type":23,"value":27876},{"type":17,"tag":84,"props":161452,"children":161453},{},[161454],{"type":23,"value":161455},"Cross-repository contract discovery",{"type":17,"tag":84,"props":161457,"children":161458},{},[161459],{"type":23,"value":161460},"AI assistants grounded in agreement text",{"type":17,"tag":84,"props":161462,"children":161463},{},[161464],{"type":23,"value":161465},"Permission-aware contract Q&A",{"type":17,"tag":29,"props":161467,"children":161468},{},[161469],{"type":23,"value":161470},"RAG is appropriate when retrieval is required.",{"type":17,"tag":29,"props":161472,"children":161473},{},[161474],{"type":23,"value":161475},"It is not a substitute for legal interpretation.",{"type":17,"tag":68,"props":161477,"children":161479},{"id":161478},"why-unified-is-the-right-data-layer-for-legal-rag",[161480],{"type":23,"value":161481},"Why Unified Is the Right Data Layer for Legal RAG",{"type":17,"tag":29,"props":161483,"children":161484},{},[161485],{"type":23,"value":161486},"Unified is not 'a RAG tool.'",{"type":17,"tag":29,"props":161488,"children":161489},{},[161490],{"type":23,"value":104074},{"type":17,"tag":80,"props":161492,"children":161493},{},[161494,161499,161504,161509],{"type":17,"tag":84,"props":161495,"children":161496},{},[161497],{"type":23,"value":161498},"The normalized retrieval layer",{"type":17,"tag":84,"props":161500,"children":161501},{},[161502],{"type":23,"value":161503},"The tenant-isolated connection layer",{"type":17,"tag":84,"props":161505,"children":161506},{},[161507],{"type":23,"value":161508},"The webhook-driven synchronization layer",{"type":17,"tag":84,"props":161510,"children":161511},{},[161512],{"type":23,"value":161513},"The permission-aware file metadata layer",{"type":17,"tag":29,"props":161515,"children":161516},{},[161517],{"type":23,"value":161518},"Legal RAG systems require:",{"type":17,"tag":80,"props":161520,"children":161521},{},[161522,161527,161532,161537],{"type":17,"tag":84,"props":161523,"children":161524},{},[161525],{"type":23,"value":161526},"Real-time SaaS access",{"type":17,"tag":84,"props":161528,"children":161529},{},[161530],{"type":23,"value":161531},"Stable schemas across providers",{"type":17,"tag":84,"props":161533,"children":161534},{},[161535],{"type":23,"value":161536},"Explicit permission metadata",{"type":17,"tag":84,"props":161538,"children":161539},{},[161540],{"type":23,"value":161541},"Deterministic tenant scoping",{"type":17,"tag":29,"props":161543,"children":161544},{},[161545],{"type":23,"value":161546},"Unified provides those foundations.",{"type":17,"tag":29,"props":161548,"children":161549},{},[161550],{"type":23,"value":161551},"You own embeddings, indexing, and generation.",{"type":17,"tag":68,"props":161553,"children":161554},{"id":132938},[161555],{"type":23,"value":132941},{"type":17,"tag":29,"props":161557,"children":161558},{},[161559],{"type":23,"value":161560},"RAG is powerful for legal insight — but only when retrieval boundaries are clear.",{"type":17,"tag":29,"props":161562,"children":161563},{},[161564],{"type":23,"value":161565},"Unified's Storage and Knowledge Management APIs provide:",{"type":17,"tag":80,"props":161567,"children":161568},{},[161569,161574,161578,161583,161588],{"type":17,"tag":84,"props":161570,"children":161571},{},[161572],{"type":23,"value":161573},"Normalized contract objects",{"type":17,"tag":84,"props":161575,"children":161576},{},[161577],{"type":23,"value":161526},{"type":17,"tag":84,"props":161579,"children":161580},{},[161581],{"type":23,"value":161582},"Webhook-driven synchronization",{"type":17,"tag":84,"props":161584,"children":161585},{},[161586],{"type":23,"value":161587},"Explicit file permission metadata",{"type":17,"tag":84,"props":161589,"children":161590},{},[161591],{"type":23,"value":161592},"Connection-level tenant isolation",{"type":17,"tag":29,"props":161594,"children":161595},{},[161596],{"type":23,"value":161597},"That clarity makes RAG defensible.",{"type":17,"tag":29,"props":161599,"children":161600},{},[161601],{"type":17,"tag":133,"props":161602,"children":161604},{"href":1612,"rel":161603},[214],[161605],{"type":23,"value":44481},{"type":17,"tag":29,"props":161607,"children":161608},{},[161609],{"type":17,"tag":133,"props":161610,"children":161612},{"href":1623,"rel":161611},[214],[161613],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":161615},[161616,161617,161618,161619,161620,161621,161622,161623,161624,161625,161626,161627,161628,161629],{"id":160322,"depth":1629,"text":160325},{"id":160457,"depth":1629,"text":160460},{"id":160702,"depth":1629,"text":160705},{"id":160898,"depth":1629,"text":160901},{"id":160961,"depth":1629,"text":160964},{"id":161038,"depth":1629,"text":161041},{"id":161082,"depth":1629,"text":161085},{"id":161132,"depth":1629,"text":161135},{"id":161242,"depth":1629,"text":161245},{"id":161303,"depth":1629,"text":161306},{"id":161382,"depth":1629,"text":161385},{"id":161430,"depth":1629,"text":161433},{"id":161478,"depth":1629,"text":161481},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_build_legal_contract_search_and_insights_with_rag_using_unified_storage_and_kms_apis.md","blog/how_to_build_legal_contract_search_and_insights_with_rag_using_unified_storage_and_kms_apis.md","blog/how_to_build_legal_contract_search_and_insights_with_rag_using_unified_storage_and_kms_apis",{"_path":161634,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":161635,"description":161636,"img":161637,"date":161638,"tag":12,"body":161639,"_type":1677,"_id":162866,"_source":1679,"_file":162867,"_stem":162868,"_extension":1682},"/blog/from_rag_to_agentic_systems_when_retrieval_isnt_enough","From RAG to Agentic Systems: When Retrieval Isn't Enough","Retrieval-augmented generation (RAG) solved a real problem.","https://s3.us-east-2.amazonaws.com/unified-article-images/from_rag_to_agentic_systems_when_retrieval_isnt_enough-icon.png","2026-02-13T01:46:00.000Z",{"type":14,"children":161640,"toc":162850},[161641,161646,161649,161656,161665,161670,161675,161680,161685,161696,161707,161712,161718,161723,161751,161756,161779,161784,161792,161797,161802,161824,161829,161834,161840,161845,161851,161856,161861,161866,161874,161879,161884,161890,161895,161900,161913,161918,161923,161929,161934,161939,161957,161962,161967,161972,161978,161983,161988,162016,162021,162034,162038,162061,162066,162089,162094,162099,162105,162110,162115,162143,162147,162152,162175,162180,162185,162208,162213,162231,162236,162242,162247,162252,162285,162290,162313,162318,162326,162331,162339,162344,162349,162354,162360,162365,162378,162383,162405,162410,162431,162436,162449,162454,162458,162463,162468,162473,162500,162505,162528,162533,162538,162543,162548,162553,162558,162564,162705,162710,162715,162720,162725,162731,162759,162764,162768,162773,162778,162783,162809,162814,162819,162824,162829,162834,162842],{"type":17,"tag":18,"props":161642,"children":161644},{"id":161643},"from-rag-to-agentic-systems-when-retrieval-isnt-enough",[161645],{"type":23,"value":161635},{"type":17,"tag":25,"props":161647,"children":161648},{},[],{"type":17,"tag":29,"props":161650,"children":161651},{},[161652],{"type":17,"tag":33,"props":161653,"children":161654},{},[161655],{"type":23,"value":159298},{"type":17,"tag":29,"props":161657,"children":161658},{},[161659,161663],{"type":17,"tag":133,"props":161660,"children":161661},{"href":77021},[161662],{"type":23,"value":137991},{"type":23,"value":161664}," (RAG) solved a real problem.",{"type":17,"tag":29,"props":161666,"children":161667},{},[161668],{"type":23,"value":161669},"Instead of asking a large language model to guess, we gave it context.",{"type":17,"tag":29,"props":161671,"children":161672},{},[161673],{"type":23,"value":161674},"Instead of relying on training data, we retrieved internal documents.",{"type":17,"tag":29,"props":161676,"children":161677},{},[161678],{"type":23,"value":161679},"Instead of hallucinating, we grounded responses.",{"type":17,"tag":29,"props":161681,"children":161682},{},[161683],{"type":23,"value":161684},"But in enterprise SaaS environments, retrieval is only half the story.",{"type":17,"tag":29,"props":161686,"children":161687},{},[161688,161690,161695],{"type":23,"value":161689},"RAG can ",{"type":17,"tag":48,"props":161691,"children":161692},{},[161693],{"type":23,"value":161694},"read",{"type":23,"value":54},{"type":17,"tag":29,"props":161697,"children":161698},{},[161699,161701,161706],{"type":23,"value":161700},"Agents must ",{"type":17,"tag":48,"props":161702,"children":161703},{},[161704],{"type":23,"value":161705},"read and act",{"type":23,"value":54},{"type":17,"tag":29,"props":161708,"children":161709},{},[161710],{"type":23,"value":161711},"This article explains where RAG stops, how agentic systems build on retrieval, and why live, authorized API access becomes critical once AI moves from answering questions to executing workflows.",{"type":17,"tag":68,"props":161713,"children":161715},{"id":161714},"what-rag-does-well",[161716],{"type":23,"value":161717},"What RAG Does Well",{"type":17,"tag":29,"props":161719,"children":161720},{},[161721],{"type":23,"value":161722},"RAG is excellent at:",{"type":17,"tag":80,"props":161724,"children":161725},{},[161726,161731,161736,161741,161746],{"type":17,"tag":84,"props":161727,"children":161728},{},[161729],{"type":23,"value":161730},"Answering questions across documentation",{"type":17,"tag":84,"props":161732,"children":161733},{},[161734],{"type":23,"value":161735},"Summarizing knowledge bases",{"type":17,"tag":84,"props":161737,"children":161738},{},[161739],{"type":23,"value":161740},"Surfacing relevant tickets or CRM notes",{"type":17,"tag":84,"props":161742,"children":161743},{},[161744],{"type":23,"value":161745},"Providing contextual support responses",{"type":17,"tag":84,"props":161747,"children":161748},{},[161749],{"type":23,"value":161750},"Generating grounded explanations",{"type":17,"tag":29,"props":161752,"children":161753},{},[161754],{"type":23,"value":161755},"It works best when:",{"type":17,"tag":80,"props":161757,"children":161758},{},[161759,161764,161769,161774],{"type":17,"tag":84,"props":161760,"children":161761},{},[161762],{"type":23,"value":161763},"The data is relatively static",{"type":17,"tag":84,"props":161765,"children":161766},{},[161767],{"type":23,"value":161768},"The objective is informational",{"type":17,"tag":84,"props":161770,"children":161771},{},[161772],{"type":23,"value":161773},"The answer can be constructed from retrieved context",{"type":17,"tag":84,"props":161775,"children":161776},{},[161777],{"type":23,"value":161778},"No system state needs to change",{"type":17,"tag":29,"props":161780,"children":161781},{},[161782],{"type":23,"value":161783},"In other words:",{"type":17,"tag":3414,"props":161785,"children":161786},{},[161787],{"type":17,"tag":29,"props":161788,"children":161789},{},[161790],{"type":23,"value":161791},"RAG is a retrieval system with language generation layered on top.",{"type":17,"tag":29,"props":161793,"children":161794},{},[161795],{"type":23,"value":161796},"It retrieves documents or records, injects them into a prompt, and lets the LLM synthesize a response.",{"type":17,"tag":29,"props":161798,"children":161799},{},[161800],{"type":23,"value":161801},"That works well for:",{"type":17,"tag":80,"props":161803,"children":161804},{},[161805,161809,161814,161819],{"type":17,"tag":84,"props":161806,"children":161807},{},[161808],{"type":23,"value":23217},{"type":17,"tag":84,"props":161810,"children":161811},{},[161812],{"type":23,"value":161813},"Internal knowledge bots",{"type":17,"tag":84,"props":161815,"children":161816},{},[161817],{"type":23,"value":161818},"Customer support summarization",{"type":17,"tag":84,"props":161820,"children":161821},{},[161822],{"type":23,"value":161823},"Context-aware content generation",{"type":17,"tag":29,"props":161825,"children":161826},{},[161827],{"type":23,"value":161828},"But retrieval alone cannot close a ticket, update a CRM record, or approve a reimbursement.",{"type":17,"tag":29,"props":161830,"children":161831},{},[161832],{"type":23,"value":161833},"That's where agents enter.",{"type":17,"tag":68,"props":161835,"children":161837},{"id":161836},"where-rag-stops",[161838],{"type":23,"value":161839},"Where RAG Stops",{"type":17,"tag":29,"props":161841,"children":161842},{},[161843],{"type":23,"value":161844},"RAG has three structural limits:",{"type":17,"tag":239,"props":161846,"children":161848},{"id":161847},"_1-it-does-not-execute-actions",[161849],{"type":23,"value":161850},"1. It Does Not Execute Actions",{"type":17,"tag":29,"props":161852,"children":161853},{},[161854],{"type":23,"value":161855},"RAG retrieves content.",{"type":17,"tag":29,"props":161857,"children":161858},{},[161859],{"type":23,"value":161860},"It does not call APIs or write to systems.",{"type":17,"tag":29,"props":161862,"children":161863},{},[161864],{"type":23,"value":161865},"If a user asks:",{"type":17,"tag":3414,"props":161867,"children":161868},{},[161869],{"type":17,"tag":29,"props":161870,"children":161871},{},[161872],{"type":23,"value":161873},"'Close this ticket and notify the customer.'",{"type":17,"tag":29,"props":161875,"children":161876},{},[161877],{"type":23,"value":161878},"RAG can explain how to do it.",{"type":17,"tag":29,"props":161880,"children":161881},{},[161882],{"type":23,"value":161883},"It cannot perform the action.",{"type":17,"tag":239,"props":161885,"children":161887},{"id":161886},"_2-it-operates-on-snapshots",[161888],{"type":23,"value":161889},"2. It Operates on Snapshots",{"type":17,"tag":29,"props":161891,"children":161892},{},[161893],{"type":23,"value":161894},"Embeddings represent indexed state.",{"type":17,"tag":29,"props":161896,"children":161897},{},[161898],{"type":23,"value":161899},"Even with webhook-driven updates, there is always a distinction between:",{"type":17,"tag":80,"props":161901,"children":161902},{},[161903,161908],{"type":17,"tag":84,"props":161904,"children":161905},{},[161906],{"type":23,"value":161907},"Stored representations (vector index)",{"type":17,"tag":84,"props":161909,"children":161910},{},[161911],{"type":23,"value":161912},"Current system state (live API)",{"type":17,"tag":29,"props":161914,"children":161915},{},[161916],{"type":23,"value":161917},"For operational systems — CRM, billing, HRIS — correctness depends on real-time state.",{"type":17,"tag":29,"props":161919,"children":161920},{},[161921],{"type":23,"value":161922},"Embeddings are not transactional.",{"type":17,"tag":239,"props":161924,"children":161926},{"id":161925},"_3-it-does-not-enforce-tool-level-authorization",[161927],{"type":23,"value":161928},"3. It Does Not Enforce Tool-Level Authorization",{"type":17,"tag":29,"props":161930,"children":161931},{},[161932],{"type":23,"value":161933},"Vector search engines optimize for semantic similarity.",{"type":17,"tag":29,"props":161935,"children":161936},{},[161937],{"type":23,"value":161938},"They do not natively enforce:",{"type":17,"tag":80,"props":161940,"children":161941},{},[161942,161947,161952],{"type":17,"tag":84,"props":161943,"children":161944},{},[161945],{"type":23,"value":161946},"Document-level permissions",{"type":17,"tag":84,"props":161948,"children":161949},{},[161950],{"type":23,"value":161951},"Role-based execution policies",{"type":17,"tag":84,"props":161953,"children":161954},{},[161955],{"type":23,"value":161956},"Tenant-scoped tool access",{"type":17,"tag":29,"props":161958,"children":161959},{},[161960],{"type":23,"value":161961},"If you move from answering questions to executing actions, permission enforcement becomes significantly more complex.",{"type":17,"tag":29,"props":161963,"children":161964},{},[161965],{"type":23,"value":161966},"Retrieval must be authorized.",{"type":17,"tag":29,"props":161968,"children":161969},{},[161970],{"type":23,"value":161971},"Execution must be authorized separately.",{"type":17,"tag":68,"props":161973,"children":161975},{"id":161974},"what-changes-in-agentic-systems",[161976],{"type":23,"value":161977},"What Changes in Agentic Systems",{"type":17,"tag":29,"props":161979,"children":161980},{},[161981],{"type":23,"value":161982},"An agent is not just an LLM with memory.",{"type":17,"tag":29,"props":161984,"children":161985},{},[161986],{"type":23,"value":161987},"In B2B SaaS contexts, an agent typically includes:",{"type":17,"tag":80,"props":161989,"children":161990},{},[161991,161996,162001,162006,162011],{"type":17,"tag":84,"props":161992,"children":161993},{},[161994],{"type":23,"value":161995},"A reasoning loop",{"type":17,"tag":84,"props":161997,"children":161998},{},[161999],{"type":23,"value":162000},"Tool-calling capability",{"type":17,"tag":84,"props":162002,"children":162003},{},[162004],{"type":23,"value":162005},"Structured API access",{"type":17,"tag":84,"props":162007,"children":162008},{},[162009],{"type":23,"value":162010},"Multi-step execution",{"type":17,"tag":84,"props":162012,"children":162013},{},[162014],{"type":23,"value":162015},"State awareness",{"type":17,"tag":29,"props":162017,"children":162018},{},[162019],{"type":23,"value":162020},"The key shift:",{"type":17,"tag":3414,"props":162022,"children":162023},{},[162024,162029],{"type":17,"tag":29,"props":162025,"children":162026},{},[162027],{"type":23,"value":162028},"RAG retrieves information.",{"type":17,"tag":29,"props":162030,"children":162031},{},[162032],{"type":23,"value":162033},"Agents retrieve information and perform operations.",{"type":17,"tag":29,"props":162035,"children":162036},{},[162037],{"type":23,"value":377},{"type":17,"tag":80,"props":162039,"children":162040},{},[162041,162046,162051,162056],{"type":17,"tag":84,"props":162042,"children":162043},{},[162044],{"type":23,"value":162045},"Retrieve deal data → update pipeline stage",{"type":17,"tag":84,"props":162047,"children":162048},{},[162049],{"type":23,"value":162050},"Retrieve ticket → post comment → close ticket",{"type":17,"tag":84,"props":162052,"children":162053},{},[162054],{"type":23,"value":162055},"Retrieve candidate → schedule interview",{"type":17,"tag":84,"props":162057,"children":162058},{},[162059],{"type":23,"value":162060},"Retrieve invoice → initiate payment workflow",{"type":17,"tag":29,"props":162062,"children":162063},{},[162064],{"type":23,"value":162065},"Once actions are involved, the system must guarantee:",{"type":17,"tag":80,"props":162067,"children":162068},{},[162069,162074,162079,162084],{"type":17,"tag":84,"props":162070,"children":162071},{},[162072],{"type":23,"value":162073},"The user is authorized to perform the action",{"type":17,"tag":84,"props":162075,"children":162076},{},[162077],{"type":23,"value":162078},"The data is current",{"type":17,"tag":84,"props":162080,"children":162081},{},[162082],{"type":23,"value":162083},"The tool call respects tenant isolation",{"type":17,"tag":84,"props":162085,"children":162086},{},[162087],{"type":23,"value":162088},"The operation is logged",{"type":17,"tag":29,"props":162090,"children":162091},{},[162092],{"type":23,"value":162093},"This is no longer just retrieval.",{"type":17,"tag":29,"props":162095,"children":162096},{},[162097],{"type":23,"value":162098},"This is controlled system mutation.",{"type":17,"tag":68,"props":162100,"children":162102},{"id":162101},"why-tool-access-must-be-explicitly-authorized",[162103],{"type":23,"value":162104},"Why Tool Access Must Be Explicitly Authorized",{"type":17,"tag":29,"props":162106,"children":162107},{},[162108],{"type":23,"value":162109},"In retrieval-only systems, the main risk is exposing unauthorized documents.",{"type":17,"tag":29,"props":162111,"children":162112},{},[162113],{"type":23,"value":162114},"In agentic systems, the risk expands:",{"type":17,"tag":80,"props":162116,"children":162117},{},[162118,162123,162128,162133,162138],{"type":17,"tag":84,"props":162119,"children":162120},{},[162121],{"type":23,"value":162122},"Unauthorized writes",{"type":17,"tag":84,"props":162124,"children":162125},{},[162126],{"type":23,"value":162127},"Cross-tenant data mutation",{"type":17,"tag":84,"props":162129,"children":162130},{},[162131],{"type":23,"value":162132},"Permission drift",{"type":17,"tag":84,"props":162134,"children":162135},{},[162136],{"type":23,"value":162137},"API misuse",{"type":17,"tag":84,"props":162139,"children":162140},{},[162141],{"type":23,"value":162142},"Tool escalation",{"type":17,"tag":29,"props":162144,"children":162145},{},[162146],{"type":23,"value":3258},{"type":17,"tag":29,"props":162148,"children":162149},{},[162150],{"type":23,"value":162151},"If an agent retrieves a CRM record but infers tool access without verifying ownership, it could:",{"type":17,"tag":80,"props":162153,"children":162154},{},[162155,162160,162165,162170],{"type":17,"tag":84,"props":162156,"children":162157},{},[162158],{"type":23,"value":162159},"Modify a deal owned by another team",{"type":17,"tag":84,"props":162161,"children":162162},{},[162163],{"type":23,"value":162164},"Reassign tickets improperly",{"type":17,"tag":84,"props":162166,"children":162167},{},[162168],{"type":23,"value":162169},"Access payroll data",{"type":17,"tag":84,"props":162171,"children":162172},{},[162173],{"type":23,"value":162174},"Trigger financial transactions",{"type":17,"tag":29,"props":162176,"children":162177},{},[162178],{"type":23,"value":162179},"Tool execution must not be inferred from retrieval context.",{"type":17,"tag":29,"props":162181,"children":162182},{},[162183],{"type":23,"value":162184},"It must be verified against:",{"type":17,"tag":80,"props":162186,"children":162187},{},[162188,162193,162198,162203],{"type":17,"tag":84,"props":162189,"children":162190},{},[162191],{"type":23,"value":162192},"Ownership fields",{"type":17,"tag":84,"props":162194,"children":162195},{},[162196],{"type":23,"value":162197},"Tenant identifiers",{"type":17,"tag":84,"props":162199,"children":162200},{},[162201],{"type":23,"value":162202},"Role-based policies",{"type":17,"tag":84,"props":162204,"children":162205},{},[162206],{"type":23,"value":162207},"Relationship-based access models",{"type":17,"tag":29,"props":162209,"children":162210},{},[162211],{"type":23,"value":162212},"Authorization must occur at:",{"type":17,"tag":80,"props":162214,"children":162215},{},[162216,162221,162226],{"type":17,"tag":84,"props":162217,"children":162218},{},[162219],{"type":23,"value":162220},"Retrieval time",{"type":17,"tag":84,"props":162222,"children":162223},{},[162224],{"type":23,"value":162225},"Tool invocation time",{"type":17,"tag":84,"props":162227,"children":162228},{},[162229],{"type":23,"value":162230},"Post-execution logging",{"type":17,"tag":29,"props":162232,"children":162233},{},[162234],{"type":23,"value":162235},"Retrieval and action authorization are separate concerns.",{"type":17,"tag":68,"props":162237,"children":162239},{"id":162238},"when-live-apis-outperform-embeddings",[162240],{"type":23,"value":162241},"When Live APIs Outperform Embeddings",{"type":17,"tag":29,"props":162243,"children":162244},{},[162245],{"type":23,"value":162246},"Embeddings are useful for semantic understanding.",{"type":17,"tag":29,"props":162248,"children":162249},{},[162250],{"type":23,"value":162251},"They are not ideal for:",{"type":17,"tag":80,"props":162253,"children":162254},{},[162255,162260,162265,162270,162275,162280],{"type":17,"tag":84,"props":162256,"children":162257},{},[162258],{"type":23,"value":162259},"Financial balances",{"type":17,"tag":84,"props":162261,"children":162262},{},[162263],{"type":23,"value":162264},"Inventory counts",{"type":17,"tag":84,"props":162266,"children":162267},{},[162268],{"type":23,"value":162269},"Ticket status transitions",{"type":17,"tag":84,"props":162271,"children":162272},{},[162273],{"type":23,"value":162274},"Approval workflows",{"type":17,"tag":84,"props":162276,"children":162277},{},[162278],{"type":23,"value":162279},"Ownership changes",{"type":17,"tag":84,"props":162281,"children":162282},{},[162283],{"type":23,"value":162284},"Transactional operations",{"type":17,"tag":29,"props":162286,"children":162287},{},[162288],{"type":23,"value":162289},"In these cases, live API reads are superior because they:",{"type":17,"tag":80,"props":162291,"children":162292},{},[162293,162298,162303,162308],{"type":17,"tag":84,"props":162294,"children":162295},{},[162296],{"type":23,"value":162297},"Reflect real-time system state",{"type":17,"tag":84,"props":162299,"children":162300},{},[162301],{"type":23,"value":162302},"Enforce provider-level permissions",{"type":17,"tag":84,"props":162304,"children":162305},{},[162306],{"type":23,"value":162307},"Respect workflow rules",{"type":17,"tag":84,"props":162309,"children":162310},{},[162311],{"type":23,"value":162312},"Avoid stale representations",{"type":17,"tag":29,"props":162314,"children":162315},{},[162316],{"type":23,"value":162317},"RAG is excellent for answering:",{"type":17,"tag":3414,"props":162319,"children":162320},{},[162321],{"type":17,"tag":29,"props":162322,"children":162323},{},[162324],{"type":23,"value":162325},"'What happened in this deal?'",{"type":17,"tag":29,"props":162327,"children":162328},{},[162329],{"type":23,"value":162330},"Agents require live APIs to answer:",{"type":17,"tag":3414,"props":162332,"children":162333},{},[162334],{"type":17,"tag":29,"props":162335,"children":162336},{},[162337],{"type":23,"value":162338},"'What is the current deal stage, and update it.'",{"type":17,"tag":29,"props":162340,"children":162341},{},[162342],{"type":23,"value":162343},"Embedding-based retrieval is a snapshot.",{"type":17,"tag":29,"props":162345,"children":162346},{},[162347],{"type":23,"value":162348},"Operational systems are dynamic.",{"type":17,"tag":29,"props":162350,"children":162351},{},[162352],{"type":23,"value":162353},"Agentic systems must bridge that gap.",{"type":17,"tag":68,"props":162355,"children":162357},{"id":162356},"the-bridge-retrieval-authorized-tool-access",[162358],{"type":23,"value":162359},"The Bridge: Retrieval + Authorized Tool Access",{"type":17,"tag":29,"props":162361,"children":162362},{},[162363],{"type":23,"value":162364},"Agentic systems require two layers:",{"type":17,"tag":6154,"props":162366,"children":162367},{},[162368,162373],{"type":17,"tag":84,"props":162369,"children":162370},{},[162371],{"type":23,"value":162372},"Retrieval layer",{"type":17,"tag":84,"props":162374,"children":162375},{},[162376],{"type":23,"value":162377},"Action layer",{"type":17,"tag":29,"props":162379,"children":162380},{},[162381],{"type":23,"value":162382},"The retrieval layer provides:",{"type":17,"tag":80,"props":162384,"children":162385},{},[162386,162391,162395,162400],{"type":17,"tag":84,"props":162387,"children":162388},{},[162389],{"type":23,"value":162390},"Normalized access to SaaS data",{"type":17,"tag":84,"props":162392,"children":162393},{},[162394],{"type":23,"value":46560},{"type":17,"tag":84,"props":162396,"children":162397},{},[162398],{"type":23,"value":162399},"Structured object models",{"type":17,"tag":84,"props":162401,"children":162402},{},[162403],{"type":23,"value":162404},"Tenant scoping",{"type":17,"tag":29,"props":162406,"children":162407},{},[162408],{"type":23,"value":162409},"The action layer provides:",{"type":17,"tag":80,"props":162411,"children":162412},{},[162413,162418,162422,162427],{"type":17,"tag":84,"props":162414,"children":162415},{},[162416],{"type":23,"value":162417},"Authenticated API writes",{"type":17,"tag":84,"props":162419,"children":162420},{},[162421],{"type":23,"value":4751},{"type":17,"tag":84,"props":162423,"children":162424},{},[162425],{"type":23,"value":162426},"Multi-step tool orchestration",{"type":17,"tag":84,"props":162428,"children":162429},{},[162430],{"type":23,"value":67347},{"type":17,"tag":29,"props":162432,"children":162433},{},[162434],{"type":23,"value":162435},"Without both, agents either:",{"type":17,"tag":80,"props":162437,"children":162438},{},[162439,162444],{"type":17,"tag":84,"props":162440,"children":162441},{},[162442],{"type":23,"value":162443},"Only answer questions",{"type":17,"tag":84,"props":162445,"children":162446},{},[162447],{"type":23,"value":162448},"Or execute actions unsafely",{"type":17,"tag":29,"props":162450,"children":162451},{},[162452],{"type":23,"value":162453},"This is where infrastructure matters.",{"type":17,"tag":68,"props":162455,"children":162456},{"id":1051},[162457],{"type":23,"value":4247},{"type":17,"tag":29,"props":162459,"children":162460},{},[162461],{"type":23,"value":162462},"Unified is not another RAG tool.",{"type":17,"tag":29,"props":162464,"children":162465},{},[162466],{"type":23,"value":162467},"It is a data access layer across SaaS categories — CRM, ticketing, file storage, ATS, HRIS, accounting, and more.",{"type":17,"tag":29,"props":162469,"children":162470},{},[162471],{"type":23,"value":162472},"In RAG systems:",{"type":17,"tag":80,"props":162474,"children":162475},{},[162476,162481,162490,162495],{"type":17,"tag":84,"props":162477,"children":162478},{},[162479],{"type":23,"value":162480},"Unified retrieves SaaS data in normalized object models.",{"type":17,"tag":84,"props":162482,"children":162483},{},[162484,162488],{"type":17,"tag":133,"props":162485,"children":162486},{"href":4999},[162487],{"type":23,"value":43896},{"type":23,"value":162489}," can keep indexed representations current.",{"type":17,"tag":84,"props":162491,"children":162492},{},[162493],{"type":23,"value":162494},"Customers store derived embeddings in their own infrastructure.",{"type":17,"tag":84,"props":162496,"children":162497},{},[162498],{"type":23,"value":162499},"Unified does not store end-customer payloads.",{"type":17,"tag":29,"props":162501,"children":162502},{},[162503],{"type":23,"value":162504},"In agentic systems:",{"type":17,"tag":80,"props":162506,"children":162507},{},[162508,162513,162518,162523],{"type":17,"tag":84,"props":162509,"children":162510},{},[162511],{"type":23,"value":162512},"The same APIs used for retrieval can be used for authorized write operations.",{"type":17,"tag":84,"props":162514,"children":162515},{},[162516],{"type":23,"value":162517},"Object-level ownership fields support row-level filtering.",{"type":17,"tag":84,"props":162519,"children":162520},{},[162521],{"type":23,"value":162522},"File objects expose explicit permission metadata.",{"type":17,"tag":84,"props":162524,"children":162525},{},[162526],{"type":23,"value":162527},"Other categories require application-level enforcement of row-level policies.",{"type":17,"tag":29,"props":162529,"children":162530},{},[162531],{"type":23,"value":162532},"Unified provides the structured, category-aware API surface that agents rely on — both for reading and for acting.",{"type":17,"tag":29,"props":162534,"children":162535},{},[162536],{"type":23,"value":162537},"It is the retrieval and action layer.",{"type":17,"tag":29,"props":162539,"children":162540},{},[162541],{"type":23,"value":162542},"Not the model.",{"type":17,"tag":29,"props":162544,"children":162545},{},[162546],{"type":23,"value":162547},"Not the embedding store.",{"type":17,"tag":29,"props":162549,"children":162550},{},[162551],{"type":23,"value":162552},"Not the orchestration logic.",{"type":17,"tag":29,"props":162554,"children":162555},{},[162556],{"type":23,"value":162557},"The secure interface to SaaS platforms.",{"type":17,"tag":68,"props":162559,"children":162561},{"id":162560},"rag-vs-agentic-systems-clear-boundary",[162562],{"type":23,"value":162563},"RAG vs Agentic Systems (Clear Boundary)",{"type":17,"tag":7231,"props":162565,"children":162566},{},[162567,162586],{"type":17,"tag":7235,"props":162568,"children":162569},{},[162570],{"type":17,"tag":7239,"props":162571,"children":162572},{},[162573,162577,162581],{"type":17,"tag":7243,"props":162574,"children":162575},{},[162576],{"type":23,"value":69360},{"type":17,"tag":7243,"props":162578,"children":162579},{},[162580],{"type":23,"value":5204},{"type":17,"tag":7243,"props":162582,"children":162583},{},[162584],{"type":23,"value":162585},"Agentic System",{"type":17,"tag":7259,"props":162587,"children":162588},{},[162589,162606,162622,162639,162656,162672,162689],{"type":17,"tag":7239,"props":162590,"children":162591},{},[162592,162597,162602],{"type":17,"tag":7266,"props":162593,"children":162594},{},[162595],{"type":23,"value":162596},"Semantic retrieval",{"type":17,"tag":7266,"props":162598,"children":162599},{},[162600],{"type":23,"value":162601},"✔",{"type":17,"tag":7266,"props":162603,"children":162604},{},[162605],{"type":23,"value":162601},{"type":17,"tag":7239,"props":162607,"children":162608},{},[162609,162614,162618],{"type":17,"tag":7266,"props":162610,"children":162611},{},[162612],{"type":23,"value":162613},"Context grounding",{"type":17,"tag":7266,"props":162615,"children":162616},{},[162617],{"type":23,"value":162601},{"type":17,"tag":7266,"props":162619,"children":162620},{},[162621],{"type":23,"value":162601},{"type":17,"tag":7239,"props":162623,"children":162624},{},[162625,162630,162635],{"type":17,"tag":7266,"props":162626,"children":162627},{},[162628],{"type":23,"value":162629},"Multi-step reasoning",{"type":17,"tag":7266,"props":162631,"children":162632},{},[162633],{"type":23,"value":162634},"Limited",{"type":17,"tag":7266,"props":162636,"children":162637},{},[162638],{"type":23,"value":162601},{"type":17,"tag":7239,"props":162640,"children":162641},{},[162642,162647,162652],{"type":17,"tag":7266,"props":162643,"children":162644},{},[162645],{"type":23,"value":162646},"API tool calls",{"type":17,"tag":7266,"props":162648,"children":162649},{},[162650],{"type":23,"value":162651},"✖",{"type":17,"tag":7266,"props":162653,"children":162654},{},[162655],{"type":23,"value":162601},{"type":17,"tag":7239,"props":162657,"children":162658},{},[162659,162664,162668],{"type":17,"tag":7266,"props":162660,"children":162661},{},[162662],{"type":23,"value":162663},"Data mutation",{"type":17,"tag":7266,"props":162665,"children":162666},{},[162667],{"type":23,"value":162651},{"type":17,"tag":7266,"props":162669,"children":162670},{},[162671],{"type":23,"value":162601},{"type":17,"tag":7239,"props":162673,"children":162674},{},[162675,162680,162685],{"type":17,"tag":7266,"props":162676,"children":162677},{},[162678],{"type":23,"value":162679},"Permission enforcement at execution",{"type":17,"tag":7266,"props":162681,"children":162682},{},[162683],{"type":23,"value":162684},"N/A",{"type":17,"tag":7266,"props":162686,"children":162687},{},[162688],{"type":23,"value":47953},{"type":17,"tag":7239,"props":162690,"children":162691},{},[162692,162697,162701],{"type":17,"tag":7266,"props":162693,"children":162694},{},[162695],{"type":23,"value":162696},"Transactional state awareness",{"type":17,"tag":7266,"props":162698,"children":162699},{},[162700],{"type":23,"value":162634},{"type":17,"tag":7266,"props":162702,"children":162703},{},[162704],{"type":23,"value":47953},{"type":17,"tag":29,"props":162706,"children":162707},{},[162708],{"type":23,"value":162709},"The mistake many vendors make is collapsing these concepts.",{"type":17,"tag":29,"props":162711,"children":162712},{},[162713],{"type":23,"value":162714},"Retrieval is not action.",{"type":17,"tag":29,"props":162716,"children":162717},{},[162718],{"type":23,"value":162719},"Embedding is not authorization.",{"type":17,"tag":29,"props":162721,"children":162722},{},[162723],{"type":23,"value":162724},"Similarity search is not workflow execution.",{"type":17,"tag":68,"props":162726,"children":162728},{"id":162727},"the-practical-progression",[162729],{"type":23,"value":162730},"The Practical Progression",{"type":17,"tag":6154,"props":162732,"children":162733},{},[162734,162739,162744,162749,162754],{"type":17,"tag":84,"props":162735,"children":162736},{},[162737],{"type":23,"value":162738},"Start with RAG to answer questions.",{"type":17,"tag":84,"props":162740,"children":162741},{},[162742],{"type":23,"value":162743},"Add live API retrieval for correctness.",{"type":17,"tag":84,"props":162745,"children":162746},{},[162747],{"type":23,"value":162748},"Introduce tool-calling for execution.",{"type":17,"tag":84,"props":162750,"children":162751},{},[162752],{"type":23,"value":162753},"Enforce authorization at retrieval and execution.",{"type":17,"tag":84,"props":162755,"children":162756},{},[162757],{"type":23,"value":162758},"Implement audit logging for traceability.",{"type":17,"tag":29,"props":162760,"children":162761},{},[162762],{"type":23,"value":162763},"That progression turns a chatbot into an operational AI system.",{"type":17,"tag":68,"props":162765,"children":162766},{"id":2316},[162767],{"type":23,"value":2319},{"type":17,"tag":29,"props":162769,"children":162770},{},[162771],{"type":23,"value":162772},"RAG is a powerful starting point.",{"type":17,"tag":29,"props":162774,"children":162775},{},[162776],{"type":23,"value":162777},"But retrieval is not enough once AI begins modifying enterprise systems.",{"type":17,"tag":29,"props":162779,"children":162780},{},[162781],{"type":23,"value":162782},"Agentic systems require:",{"type":17,"tag":80,"props":162784,"children":162785},{},[162786,162790,162795,162800,162804],{"type":17,"tag":84,"props":162787,"children":162788},{},[162789],{"type":23,"value":4711},{"type":17,"tag":84,"props":162791,"children":162792},{},[162793],{"type":23,"value":162794},"Structured SaaS APIs",{"type":17,"tag":84,"props":162796,"children":162797},{},[162798],{"type":23,"value":162799},"Explicit authorization checks",{"type":17,"tag":84,"props":162801,"children":162802},{},[162803],{"type":23,"value":129615},{"type":17,"tag":84,"props":162805,"children":162806},{},[162807],{"type":23,"value":162808},"Deterministic audit logging",{"type":17,"tag":29,"props":162810,"children":162811},{},[162812],{"type":23,"value":162813},"Embeddings cannot replace live APIs.",{"type":17,"tag":29,"props":162815,"children":162816},{},[162817],{"type":23,"value":162818},"Similarity search cannot replace permission models.",{"type":17,"tag":29,"props":162820,"children":162821},{},[162822],{"type":23,"value":162823},"LLMs cannot infer authority.",{"type":17,"tag":29,"props":162825,"children":162826},{},[162827],{"type":23,"value":162828},"To move from RAG to agents safely, you need a secure, normalized, real-time data layer.",{"type":17,"tag":29,"props":162830,"children":162831},{},[162832],{"type":23,"value":162833},"That's the layer enterprise AI systems depend on.",{"type":17,"tag":29,"props":162835,"children":162836},{},[162837],{"type":17,"tag":133,"props":162838,"children":162840},{"href":1612,"rel":162839},[214],[162841],{"type":23,"value":44481},{"type":17,"tag":29,"props":162843,"children":162844},{},[162845],{"type":17,"tag":133,"props":162846,"children":162848},{"href":1623,"rel":162847},[214],[162849],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":162851},[162852,162853,162858,162859,162860,162861,162862,162863,162864,162865],{"id":161714,"depth":1629,"text":161717},{"id":161836,"depth":1629,"text":161839,"children":162854},[162855,162856,162857],{"id":161847,"depth":1635,"text":161850},{"id":161886,"depth":1635,"text":161889},{"id":161925,"depth":1635,"text":161928},{"id":161974,"depth":1629,"text":161977},{"id":162101,"depth":1629,"text":162104},{"id":162238,"depth":1629,"text":162241},{"id":162356,"depth":1629,"text":162359},{"id":1051,"depth":1629,"text":4247},{"id":162560,"depth":1629,"text":162563},{"id":162727,"depth":1629,"text":162730},{"id":2316,"depth":1629,"text":2319},"content:blog:from_rag_to_agentic_systems_when_retrieval_isnt_enough.md","blog/from_rag_to_agentic_systems_when_retrieval_isnt_enough.md","blog/from_rag_to_agentic_systems_when_retrieval_isnt_enough",{"_path":162870,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":162871,"description":162872,"img":162873,"date":162874,"tag":6341,"body":162875,"_type":1677,"_id":163651,"_source":1679,"_file":163652,"_stem":163653,"_extension":1682},"/blog/retrieval_augmented_generation_rag","Retrieval-Augmented Generation (RAG)","This page explains how to implement a RAG pipeline using Unified.","https://s3.us-east-2.amazonaws.com/unified-article-images/retrieval_augmented_generation_rag-icon.png","2026-02-13T01:40:00.000Z",{"type":14,"children":162876,"toc":163638},[162877,162882,162885,162892,162903,162908,162913,162956,162961,162967,162972,162977,162995,163000,163018,163023,163029,163033,163038,163065,163076,163088,163094,163099,163104,163129,163134,163139,163148,163153,163159,163164,163169,163204,163209,163214,163219,163225,163230,163235,163276,163280,163297,163302,163308,163313,163347,163364,163369,163374,163379,163384,163389,163395,163400,163424,163429,163447,163453,163458,163486,163491,163497,163502,163558,163563,163569,163622,163630],{"type":17,"tag":18,"props":162878,"children":162880},{"id":162879},"retrieval-augmented-generation-rag",[162881],{"type":23,"value":162871},{"type":17,"tag":25,"props":162883,"children":162884},{},[],{"type":17,"tag":29,"props":162886,"children":162887},{},[162888],{"type":17,"tag":33,"props":162889,"children":162890},{},[162891],{"type":23,"value":159298},{"type":17,"tag":29,"props":162893,"children":162894},{},[162895,162897,162901],{"type":23,"value":162896},"This page explains how to implement a ",{"type":17,"tag":133,"props":162898,"children":162899},{"href":5201},[162900],{"type":23,"value":5204},{"type":23,"value":162902}," pipeline using Unified.",{"type":17,"tag":29,"props":162904,"children":162905},{},[162906],{"type":23,"value":162907},"RAG is an implementation pattern built on top of Unified APIs. Unified provides real-time data access and normalized objects. You are responsible for embeddings, vector storage, and retrieval.",{"type":17,"tag":29,"props":162909,"children":162910},{},[162911],{"type":23,"value":162912},"At a high level, RAG with Unified follows this sequence:",{"type":17,"tag":6154,"props":162914,"children":162915},{},[162916,162926,162931,162936,162941,162946,162951],{"type":17,"tag":84,"props":162917,"children":162918},{},[162919,162921,162925],{"type":23,"value":162920},"Subscribe to ",{"type":17,"tag":133,"props":162922,"children":162923},{"href":4999},[162924],{"type":23,"value":5002},{"type":23,"value":54},{"type":17,"tag":84,"props":162927,"children":162928},{},[162929],{"type":23,"value":162930},"Receive created or updated objects.",{"type":17,"tag":84,"props":162932,"children":162933},{},[162934],{"type":23,"value":162935},"Retrieve full content from the source API.",{"type":17,"tag":84,"props":162937,"children":162938},{},[162939],{"type":23,"value":162940},"Chunk the content.",{"type":17,"tag":84,"props":162942,"children":162943},{},[162944],{"type":23,"value":162945},"Generate embeddings.",{"type":17,"tag":84,"props":162947,"children":162948},{},[162949],{"type":23,"value":162950},"Store embeddings in your vector database.",{"type":17,"tag":84,"props":162952,"children":162953},{},[162954],{"type":23,"value":162955},"On query, retrieve relevant chunks and generate a response.",{"type":17,"tag":29,"props":162957,"children":162958},{},[162959],{"type":23,"value":162960},"The pattern is the same across categories.",{"type":17,"tag":68,"props":162962,"children":162964},{"id":162963},"what-rag-means-in-practice",[162965],{"type":23,"value":162966},"What RAG Means in Practice",{"type":17,"tag":29,"props":162968,"children":162969},{},[162970],{"type":23,"value":162971},"RAG allows you to answer questions using customer data from connected SaaS platforms.",{"type":17,"tag":29,"props":162973,"children":162974},{},[162975],{"type":23,"value":162976},"Instead of relying only on model training data, your application:",{"type":17,"tag":80,"props":162978,"children":162979},{},[162980,162985,162990],{"type":17,"tag":84,"props":162981,"children":162982},{},[162983],{"type":23,"value":162984},"Retrieves relevant customer records.",{"type":17,"tag":84,"props":162986,"children":162987},{},[162988],{"type":23,"value":162989},"Supplies those records as context.",{"type":17,"tag":84,"props":162991,"children":162992},{},[162993],{"type":23,"value":162994},"Generates a response grounded in that context.",{"type":17,"tag":29,"props":162996,"children":162997},{},[162998],{"type":23,"value":162999},"Unified enables real-time retrieval directly from source APIs and supports event-driven synchronization.",{"type":17,"tag":80,"props":163001,"children":163002},{},[163003,163008,163013],{"type":17,"tag":84,"props":163004,"children":163005},{},[163006],{"type":23,"value":163007},"Normalized across providers.",{"type":17,"tag":84,"props":163009,"children":163010},{},[163011],{"type":23,"value":163012},"Fetched in real time.",{"type":17,"tag":84,"props":163014,"children":163015},{},[163016],{"type":23,"value":163017},"Consistent in schema.",{"type":17,"tag":29,"props":163019,"children":163020},{},[163021],{"type":23,"value":163022},"Unified does not store embeddings or maintain a vector index\nUnified Use Case RAG Pipelines.",{"type":17,"tag":68,"props":163024,"children":163026},{"id":163025},"step-1-connect-data-sources",[163027],{"type":23,"value":163028},"Step 1: Connect Data Sources",{"type":17,"tag":29,"props":163030,"children":163031},{},[163032],{"type":23,"value":160906},{"type":17,"tag":29,"props":163034,"children":163035},{},[163036],{"type":23,"value":163037},"Common RAG source categories include:",{"type":17,"tag":80,"props":163039,"children":163040},{},[163041,163045,163049,163053,163057,163061],{"type":17,"tag":84,"props":163042,"children":163043},{},[163044],{"type":23,"value":72401},{"type":17,"tag":84,"props":163046,"children":163047},{},[163048],{"type":23,"value":24577},{"type":17,"tag":84,"props":163050,"children":163051},{},[163052],{"type":23,"value":25731},{"type":17,"tag":84,"props":163054,"children":163055},{},[163056],{"type":23,"value":24541},{"type":17,"tag":84,"props":163058,"children":163059},{},[163060],{"type":23,"value":11756},{"type":17,"tag":84,"props":163062,"children":163063},{},[163064],{"type":23,"value":24559},{"type":17,"tag":29,"props":163066,"children":163067},{},[163068,163070,163075],{"type":23,"value":163069},"Each authorized integration returns a ",{"type":17,"tag":6121,"props":163071,"children":163073},{"className":163072},[],[163074],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":29,"props":163077,"children":163078},{},[163079,163081,163086],{"type":23,"value":163080},"RAG pipelines should treat ",{"type":17,"tag":6121,"props":163082,"children":163084},{"className":163083},[],[163085],{"type":23,"value":25037},{"type":23,"value":163087}," as the tenant boundary.",{"type":17,"tag":68,"props":163089,"children":163091},{"id":163090},"step-2-subscribe-to-object-updates",[163092],{"type":23,"value":163093},"Step 2: Subscribe to Object Updates",{"type":17,"tag":29,"props":163095,"children":163096},{},[163097],{"type":23,"value":163098},"Create webhook subscriptions for the objects you want to index.",{"type":17,"tag":29,"props":163100,"children":163101},{},[163102],{"type":23,"value":163103},"On created or updated events:",{"type":17,"tag":80,"props":163105,"children":163106},{},[163107,163112,163117],{"type":17,"tag":84,"props":163108,"children":163109},{},[163110],{"type":23,"value":163111},"Your endpoint receives the event.",{"type":17,"tag":84,"props":163113,"children":163114},{},[163115],{"type":23,"value":163116},"You call the appropriate retrieve endpoint to fetch the latest version of the object.",{"type":17,"tag":84,"props":163118,"children":163119},{},[163120,163122,163127],{"type":23,"value":163121},"If the object contains a ",{"type":17,"tag":6121,"props":163123,"children":163125},{"className":163124},[],[163126],{"type":23,"value":24978},{"type":23,"value":163128},", fetch the content from that URL.",{"type":17,"tag":29,"props":163130,"children":163131},{},[163132],{"type":23,"value":163133},"List endpoints often return metadata but not full content. For RAG, you must explicitly retrieve full text before chunking.",{"type":17,"tag":29,"props":163135,"children":163136},{},[163137],{"type":23,"value":163138},"Native webhooks deliver real-time updates.",{"type":17,"tag":29,"props":163140,"children":163141},{},[163142,163146],{"type":17,"tag":133,"props":163143,"children":163144},{"href":9007},[163145],{"type":23,"value":9256},{"type":23,"value":163147}," provide the same interface using managed polling and may introduce short delays\nUnified Use Case RAG Pipelines.",{"type":17,"tag":29,"props":163149,"children":163150},{},[163151],{"type":23,"value":163152},"Webhooks are recommended over polling for RAG ingestion.",{"type":17,"tag":68,"props":163154,"children":163156},{"id":163155},"step-3-chunk-and-embed",[163157],{"type":23,"value":163158},"Step 3: Chunk and Embed",{"type":17,"tag":29,"props":163160,"children":163161},{},[163162],{"type":23,"value":163163},"Large text (files, pages, tickets, resumes, notes, transcripts) should be split into chunks before embedding.",{"type":17,"tag":29,"props":163165,"children":163166},{},[163167],{"type":23,"value":163168},"Each chunk should include stable metadata such as:",{"type":17,"tag":80,"props":163170,"children":163171},{},[163172,163180,163188,163196],{"type":17,"tag":84,"props":163173,"children":163174},{},[163175],{"type":17,"tag":6121,"props":163176,"children":163178},{"className":163177},[],[163179],{"type":23,"value":25037},{"type":17,"tag":84,"props":163181,"children":163182},{},[163183],{"type":17,"tag":6121,"props":163184,"children":163186},{"className":163185},[],[163187],{"type":23,"value":161193},{"type":17,"tag":84,"props":163189,"children":163190},{},[163191],{"type":17,"tag":6121,"props":163192,"children":163194},{"className":163193},[],[163195],{"type":23,"value":161202},{"type":17,"tag":84,"props":163197,"children":163198},{},[163199],{"type":17,"tag":6121,"props":163200,"children":163202},{"className":163201},[],[163203],{"type":23,"value":25337},{"type":17,"tag":29,"props":163205,"children":163206},{},[163207],{"type":23,"value":163208},"You may also include additional normalized fields as metadata filters.",{"type":17,"tag":29,"props":163210,"children":163211},{},[163212],{"type":23,"value":163213},"Unified normalizes objects across providers. All normalized fields returned by Unified can be stored as metadata in your vector index and used for filtering at retrieval time.\nUnified Use Case RAG Pipelines.",{"type":17,"tag":29,"props":163215,"children":163216},{},[163217],{"type":23,"value":163218},"You generate embeddings using the embedding model of your choice. Unified may provide access to embedding models, but embeddings and indexes are stored in your infrastructure.",{"type":17,"tag":68,"props":163220,"children":163222},{"id":163221},"step-4-store-in-a-vector-database",[163223],{"type":23,"value":163224},"Step 4: Store in a Vector Database",{"type":17,"tag":29,"props":163226,"children":163227},{},[163228],{"type":23,"value":163229},"Store embeddings in your vector database (for example, Pinecone or pgvector).",{"type":17,"tag":29,"props":163231,"children":163232},{},[163233],{"type":23,"value":163234},"Include metadata to support:",{"type":17,"tag":80,"props":163236,"children":163237},{},[163238,163249,163260,163271],{"type":17,"tag":84,"props":163239,"children":163240},{},[163241,163243,163248],{"type":23,"value":163242},"Tenant isolation (",{"type":17,"tag":6121,"props":163244,"children":163246},{"className":163245},[],[163247],{"type":23,"value":25037},{"type":23,"value":12034},{"type":17,"tag":84,"props":163250,"children":163251},{},[163252,163254,163259],{"type":23,"value":163253},"Object filtering (",{"type":17,"tag":6121,"props":163255,"children":163257},{"className":163256},[],[163258],{"type":23,"value":161193},{"type":23,"value":12034},{"type":17,"tag":84,"props":163261,"children":163262},{},[163263,163265,163270],{"type":23,"value":163264},"Update replacement (",{"type":17,"tag":6121,"props":163266,"children":163268},{"className":163267},[],[163269],{"type":23,"value":25337},{"type":23,"value":12034},{"type":17,"tag":84,"props":163272,"children":163273},{},[163274],{"type":23,"value":163275},"Permission enforcement (see below)",{"type":17,"tag":29,"props":163277,"children":163278},{},[163279],{"type":23,"value":104494},{"type":17,"tag":80,"props":163281,"children":163282},{},[163283,163288,163292],{"type":17,"tag":84,"props":163284,"children":163285},{},[163286],{"type":23,"value":163287},"Cache end-customer payloads",{"type":17,"tag":84,"props":163289,"children":163290},{},[163291],{"type":23,"value":161257},{"type":17,"tag":84,"props":163293,"children":163294},{},[163295],{"type":23,"value":163296},"Maintain a vector index Unified Use Case RAG Pipelines",{"type":17,"tag":29,"props":163298,"children":163299},{},[163300],{"type":23,"value":163301},"Unified does not persist customer payloads or maintain your embedding index.",{"type":17,"tag":68,"props":163303,"children":163305},{"id":163304},"step-5-retrieve-and-generate",[163306],{"type":23,"value":163307},"Step 5: Retrieve and Generate",{"type":17,"tag":29,"props":163309,"children":163310},{},[163311],{"type":23,"value":163312},"When a user submits a query:",{"type":17,"tag":6154,"props":163314,"children":163315},{},[163316,163320,163325,163337,163342],{"type":17,"tag":84,"props":163317,"children":163318},{},[163319],{"type":23,"value":161319},{"type":17,"tag":84,"props":163321,"children":163322},{},[163323],{"type":23,"value":163324},"Retrieve the top matching chunks from your vector database.",{"type":17,"tag":84,"props":163326,"children":163327},{},[163328,163330,163335],{"type":23,"value":163329},"Filter by ",{"type":17,"tag":6121,"props":163331,"children":163333},{"className":163332},[],[163334],{"type":23,"value":25037},{"type":23,"value":163336}," and any relevant metadata.",{"type":17,"tag":84,"props":163338,"children":163339},{},[163340],{"type":23,"value":163341},"Pass retrieved context to your model.",{"type":17,"tag":84,"props":163343,"children":163344},{},[163345],{"type":23,"value":163346},"Return the generated answer.",{"type":17,"tag":29,"props":163348,"children":163349},{},[163350,163352,163357,163358,163363],{"type":23,"value":163351},"If required, include citations that map back to ",{"type":17,"tag":6121,"props":163353,"children":163355},{"className":163354},[],[163356],{"type":23,"value":161202},{"type":23,"value":75890},{"type":17,"tag":6121,"props":163359,"children":163361},{"className":163360},[],[163362],{"type":23,"value":12107},{"type":23,"value":54},{"type":17,"tag":29,"props":163365,"children":163366},{},[163367],{"type":23,"value":163368},"Unified does not perform retrieval. Unified ensures the indexed data remains synchronized with source APIs.",{"type":17,"tag":68,"props":163370,"children":163371},{"id":24204},[163372],{"type":23,"value":163373},"Permissions",{"type":17,"tag":29,"props":163375,"children":163376},{},[163377],{"type":23,"value":163378},"File objects include explicit permissions metadata.",{"type":17,"tag":29,"props":163380,"children":163381},{},[163382],{"type":23,"value":163383},"Other objects (CRM, ATS, ticketing, messaging) do not return user- or group-level permission structures. If row-level enforcement is required, implement that logic in your application layer before returning retrieved results\nUnified Use Case RAG Pipelines.",{"type":17,"tag":29,"props":163385,"children":163386},{},[163387],{"type":23,"value":163388},"Always filter retrieval results by tenant and permission constraints before generation.",{"type":17,"tag":68,"props":163390,"children":163392},{"id":163391},"real-time-behavior",[163393],{"type":23,"value":163394},"Real-Time Behavior",{"type":17,"tag":29,"props":163396,"children":163397},{},[163398],{"type":23,"value":163399},"For RAG pipelines, freshness depends on update propagation:",{"type":17,"tag":80,"props":163401,"children":163402},{},[163403,163407,163412],{"type":17,"tag":84,"props":163404,"children":163405},{},[163406],{"type":23,"value":163138},{"type":17,"tag":84,"props":163408,"children":163409},{},[163410],{"type":23,"value":163411},"Virtual webhooks use managed polling and typically operate with short delays.",{"type":17,"tag":84,"props":163413,"children":163414},{},[163415,163417,163422],{"type":23,"value":163416},"Most list endpoints support pagination and incremental filtering via ",{"type":17,"tag":6121,"props":163418,"children":163420},{"className":163419},[],[163421],{"type":23,"value":26291},{"type":23,"value":163423}," Unified Use Case RAG Pipelines.",{"type":17,"tag":29,"props":163425,"children":163426},{},[163427],{"type":23,"value":163428},"To keep embeddings current:",{"type":17,"tag":80,"props":163430,"children":163431},{},[163432,163437,163442],{"type":17,"tag":84,"props":163433,"children":163434},{},[163435],{"type":23,"value":163436},"Re-fetch objects on update events.",{"type":17,"tag":84,"props":163438,"children":163439},{},[163440],{"type":23,"value":163441},"Re-chunk and re-embed.",{"type":17,"tag":84,"props":163443,"children":163444},{},[163445],{"type":23,"value":163446},"Replace outdated vectors in your index.",{"type":17,"tag":68,"props":163448,"children":163450},{"id":163449},"when-to-use-rag",[163451],{"type":23,"value":163452},"When to Use RAG",{"type":17,"tag":29,"props":163454,"children":163455},{},[163456],{"type":23,"value":163457},"Use this pattern when you need to:",{"type":17,"tag":80,"props":163459,"children":163460},{},[163461,163466,163471,163476,163481],{"type":17,"tag":84,"props":163462,"children":163463},{},[163464],{"type":23,"value":163465},"Build enterprise search across connected platforms.",{"type":17,"tag":84,"props":163467,"children":163468},{},[163469],{"type":23,"value":163470},"Ground AI responses in customer documents or records.",{"type":17,"tag":84,"props":163472,"children":163473},{},[163474],{"type":23,"value":163475},"Enable resume or candidate search.",{"type":17,"tag":84,"props":163477,"children":163478},{},[163479],{"type":23,"value":163480},"Support contract or document Q&A.",{"type":17,"tag":84,"props":163482,"children":163483},{},[163484],{"type":23,"value":163485},"Build account-level CRM assistants.",{"type":17,"tag":29,"props":163487,"children":163488},{},[163489],{"type":23,"value":163490},"The ingestion architecture is consistent across categories. Object models and content retrieval methods vary by API.",{"type":17,"tag":68,"props":163492,"children":163494},{"id":163493},"related-apis",[163495],{"type":23,"value":163496},"Related APIs",{"type":17,"tag":29,"props":163498,"children":163499},{},[163500],{"type":23,"value":163501},"RAG pipelines commonly use:",{"type":17,"tag":80,"props":163503,"children":163504},{},[163505,163514,163524,163532,163541,163550],{"type":17,"tag":84,"props":163506,"children":163507},{},[163508],{"type":17,"tag":133,"props":163509,"children":163512},{"href":163510,"rel":163511},"https://docs.unified.to/storage/overview",[214],[163513],{"type":23,"value":142621},{"type":17,"tag":84,"props":163515,"children":163516},{},[163517],{"type":17,"tag":133,"props":163518,"children":163521},{"href":163519,"rel":163520},"https://docs.unified.to/kms/overview",[214],[163522],{"type":23,"value":163523},"Knowledge Management API",{"type":17,"tag":84,"props":163525,"children":163526},{},[163527],{"type":17,"tag":133,"props":163528,"children":163530},{"href":107049,"rel":163529},[214],[163531],{"type":23,"value":61565},{"type":17,"tag":84,"props":163533,"children":163534},{},[163535],{"type":17,"tag":133,"props":163536,"children":163539},{"href":163537,"rel":163538},"https://docs.unified.to/ticketing/overview",[214],[163540],{"type":23,"value":150656},{"type":17,"tag":84,"props":163542,"children":163543},{},[163544],{"type":17,"tag":133,"props":163545,"children":163548},{"href":163546,"rel":163547},"https://docs.unified.to/ats/overview",[214],[163549],{"type":23,"value":55699},{"type":17,"tag":84,"props":163551,"children":163552},{},[163553],{"type":17,"tag":133,"props":163554,"children":163556},{"href":107070,"rel":163555},[214],[163557],{"type":23,"value":27356},{"type":17,"tag":29,"props":163559,"children":163560},{},[163561],{"type":23,"value":163562},"Refer to category documentation for supported objects and webhook availability.",{"type":17,"tag":68,"props":163564,"children":163566},{"id":163565},"related-guides",[163567],{"type":23,"value":163568},"Related Guides",{"type":17,"tag":80,"props":163570,"children":163571},{},[163572,163582,163592,163602,163612],{"type":17,"tag":84,"props":163573,"children":163574},{},[163575],{"type":17,"tag":133,"props":163576,"children":163579},{"href":163577,"rel":163578},"https://unified.to/blog/how_to_build_enterprise_search_using_rag",[214],[163580],{"type":23,"value":163581},"How to build Enterprise Search using RAG",{"type":17,"tag":84,"props":163583,"children":163584},{},[163585],{"type":17,"tag":133,"props":163586,"children":163589},{"href":163587,"rel":163588},"https://unified.to/blog/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data",[214],[163590],{"type":23,"value":163591},"ATS to Vector DB: How to Power Talent Intelligence with Real-Time Data",{"type":17,"tag":84,"props":163593,"children":163594},{},[163595],{"type":17,"tag":133,"props":163596,"children":163599},{"href":163597,"rel":163598},"https://unified.to/blog/how_to_build_an_ai_powered_meeting_recording_summarization_with_unified",[214],[163600],{"type":23,"value":163601},"How to Build an AI-Powered Meeting Recording Summarization",{"type":17,"tag":84,"props":163603,"children":163604},{},[163605],{"type":17,"tag":133,"props":163606,"children":163609},{"href":163607,"rel":163608},"https://unified.to/blog/how_to_train_ai_with_crm_data_using_unified_crm_api",[214],[163610],{"type":23,"value":163611},"How to Train AI with CRM Data using Unified's CRM API",{"type":17,"tag":84,"props":163613,"children":163614},{},[163615],{"type":17,"tag":133,"props":163616,"children":163619},{"href":163617,"rel":163618},"https://unified.to/blog/how_to_train_ai_with_hris_data_with_unified_hr_and_directory_api",[214],[163620],{"type":23,"value":163621},"How to Train AI with HRIS Data with Unified's HR & Directory API",{"type":17,"tag":29,"props":163623,"children":163624},{},[163625],{"type":17,"tag":133,"props":163626,"children":163628},{"href":1612,"rel":163627},[214],[163629],{"type":23,"value":44481},{"type":17,"tag":29,"props":163631,"children":163632},{},[163633],{"type":17,"tag":133,"props":163634,"children":163636},{"href":1623,"rel":163635},[214],[163637],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":163639},[163640,163641,163642,163643,163644,163645,163646,163647,163648,163649,163650],{"id":162963,"depth":1629,"text":162966},{"id":163025,"depth":1629,"text":163028},{"id":163090,"depth":1629,"text":163093},{"id":163155,"depth":1629,"text":163158},{"id":163221,"depth":1629,"text":163224},{"id":163304,"depth":1629,"text":163307},{"id":24204,"depth":1629,"text":163373},{"id":163391,"depth":1629,"text":163394},{"id":163449,"depth":1629,"text":163452},{"id":163493,"depth":1629,"text":163496},{"id":163565,"depth":1629,"text":163568},"content:blog:retrieval_augmented_generation_rag.md","blog/retrieval_augmented_generation_rag.md","blog/retrieval_augmented_generation_rag",{"_path":163655,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":163656,"description":163657,"img":163658,"date":163659,"tag":12,"body":163660,"_type":1677,"_id":165299,"_source":1679,"_file":165300,"_stem":165301,"_extension":1682},"/blog/task_management_api_integration_projects_tasks_comments_and_change_history_across_platforms","Task Management API Integration: Projects, Tasks, Comments, and Change History Across Platforms","Task systems sit at the intersection of execution and accountability. Projects shift, work gets reassigned, statuses change, and comments evolve into the real...","https://s3.us-east-2.amazonaws.com/unified-article-images/task_management_api_integration_projects_tasks_comments_and_change_history_across_platforms-icon.png","2026-02-13T01:04:00.000Z",{"type":14,"children":163661,"toc":165249},[163662,163667,163670,163677,163682,163687,163692,163698,163703,163708,163736,163741,163746,163751,163774,163779,163785,163790,163866,163871,163877,163883,163888,163894,163899,163928,163939,163945,163950,163954,163959,163964,164041,164046,164051,164056,164060,164189,164194,164199,164204,164208,164262,164267,164272,164277,164281,164330,164335,164341,164346,164352,164375,164394,164400,164405,164423,164428,164433,164438,164461,164466,164472,164477,164505,164522,164528,164533,164539,164544,164598,164603,164609,164614,164627,164638,164644,164649,164687,164692,164698,164703,164708,164713,164741,164746,164751,164756,164762,164767,164803,164808,164814,164819,164842,164847,164853,164858,164863,164869,164906,164911,164917,164923,164928,164934,164939,164944,164949,164954,164959,164964,164969,164975,164980,165008,165013,165019,165025,165048,165054,165082,165088,165121,165127,165132,165137,165145,165152,165156,165163,165168,165176,165181,165189,165194,165202,165207,165215,165220,165228,165233,165241],{"type":17,"tag":18,"props":163663,"children":163665},{"id":163664},"task-management-api-integration-projects-tasks-comments-and-change-history-across-platforms",[163666],{"type":23,"value":163656},{"type":17,"tag":25,"props":163668,"children":163669},{},[],{"type":17,"tag":29,"props":163671,"children":163672},{},[163673],{"type":17,"tag":33,"props":163674,"children":163675},{},[163676],{"type":23,"value":159298},{"type":17,"tag":29,"props":163678,"children":163679},{},[163680],{"type":23,"value":163681},"Task systems sit at the intersection of execution and accountability. Projects shift, work gets reassigned, statuses change, and comments evolve into the real record of why decisions were made. When task data is fragmented across tools—or stitched together with batch sync jobs—reporting drifts, automations fire late, and teams lose a reliable view of what is actually in progress.",{"type":17,"tag":29,"props":163683,"children":163684},{},[163685],{"type":23,"value":163686},"Task Management API integration exists to solve this problem.",{"type":17,"tag":29,"props":163688,"children":163689},{},[163690],{"type":23,"value":163691},"In this guide, we'll explain what a Task Management API covers, which objects matter in practice, how task lifecycles behave across providers, how updates are delivered, and how Unified's Task Management API fits alongside Ticketing, CRM, Repository, KMS, Messaging, Calendar, and Storage across Unified's broader platform.",{"type":17,"tag":68,"props":163693,"children":163695},{"id":163694},"introduction-to-task-management-api-integrations",[163696],{"type":23,"value":163697},"Introduction to Task Management API Integrations",{"type":17,"tag":29,"props":163699,"children":163700},{},[163701],{"type":23,"value":163702},"Project and issue tools such as Asana, Jira, ClickUp, Linear, GitHub, GitLab, Monday, Trello, Wrike, Notion, Teamwork, and others all expose APIs, but they don't behave the same way.",{"type":17,"tag":29,"props":163704,"children":163705},{},[163706],{"type":23,"value":163707},"Teams that support multiple tools run into predictable friction:",{"type":17,"tag":80,"props":163709,"children":163710},{},[163711,163716,163721,163726,163731],{"type":17,"tag":84,"props":163712,"children":163713},{},[163714],{"type":23,"value":163715},"Status and priority don't mean the same thing across providers",{"type":17,"tag":84,"props":163717,"children":163718},{},[163719],{"type":23,"value":163720},"Due dates and completion behavior vary",{"type":17,"tag":84,"props":163722,"children":163723},{},[163724],{"type":23,"value":163725},"Comments may be editable in some tools and immutable in others",{"type":17,"tag":84,"props":163727,"children":163728},{},[163729],{"type":23,"value":163730},"Deletion can mean 'deleted,' 'archived,' or 'closed,' depending on the system",{"type":17,"tag":84,"props":163732,"children":163733},{},[163734],{"type":23,"value":163735},"Webhook and delta-sync support is uneven",{"type":17,"tag":29,"props":163737,"children":163738},{},[163739],{"type":23,"value":163740},"A Task Management API provides a consistent way to read and write task data across platforms without maintaining separate integrations per provider.",{"type":17,"tag":68,"props":163742,"children":163743},{"id":12594},[163744],{"type":23,"value":163745},"What Is a Task Management API?",{"type":17,"tag":29,"props":163747,"children":163748},{},[163749],{"type":23,"value":163750},"A Task Management API allows applications to programmatically access and manage work items, including:",{"type":17,"tag":80,"props":163752,"children":163753},{},[163754,163759,163764,163769],{"type":17,"tag":84,"props":163755,"children":163756},{},[163757],{"type":23,"value":163758},"Projects or boards used to group work",{"type":17,"tag":84,"props":163760,"children":163761},{},[163762],{"type":23,"value":163763},"Tasks and issues that represent work to be completed",{"type":17,"tag":84,"props":163765,"children":163766},{},[163767],{"type":23,"value":163768},"Comments that capture discussion and decisions",{"type":17,"tag":84,"props":163770,"children":163771},{},[163772],{"type":23,"value":163773},"Change history that records what changed and when",{"type":17,"tag":29,"props":163775,"children":163776},{},[163777],{"type":23,"value":163778},"Task APIs are about work-state, assignment, and collaboration context. They are not customer-support systems, sales systems, calendars, or chat archives.",{"type":17,"tag":68,"props":163780,"children":163782},{"id":163781},"task-management-api-vs-ticketing-crm-repository-kms-messaging-calendar-and-storage",[163783],{"type":23,"value":163784},"Task Management API vs Ticketing, CRM, Repository, KMS, Messaging, Calendar, and Storage",{"type":17,"tag":29,"props":163786,"children":163787},{},[163788],{"type":23,"value":163789},"Unified treats Task Management as one category with clear boundaries:",{"type":17,"tag":80,"props":163791,"children":163792},{},[163793,163802,163811,163820,163829,163839,163848,163857],{"type":17,"tag":84,"props":163794,"children":163795},{},[163796,163800],{"type":17,"tag":48,"props":163797,"children":163798},{},[163799],{"type":23,"value":110979},{"type":23,"value":163801}," manages projects, tasks, comments, and change history.",{"type":17,"tag":84,"props":163803,"children":163804},{},[163805,163809],{"type":17,"tag":48,"props":163806,"children":163807},{},[163808],{"type":23,"value":24541},{"type":23,"value":163810}," manages support tickets, support customers, notes, and categories.",{"type":17,"tag":84,"props":163812,"children":163813},{},[163814,163818],{"type":17,"tag":48,"props":163815,"children":163816},{},[163817],{"type":23,"value":25731},{"type":23,"value":163819}," manages contacts, companies, deals, pipelines, and leads.",{"type":17,"tag":84,"props":163821,"children":163822},{},[163823,163827],{"type":17,"tag":48,"props":163824,"children":163825},{},[163826],{"type":23,"value":18059},{"type":23,"value":163828}," manages repositories, branches, commits, and pull requests.",{"type":17,"tag":84,"props":163830,"children":163831},{},[163832,163837],{"type":17,"tag":48,"props":163833,"children":163834},{},[163835],{"type":23,"value":163836},"KMS",{"type":23,"value":163838}," manages spaces, pages, and page comments.",{"type":17,"tag":84,"props":163840,"children":163841},{},[163842,163846],{"type":17,"tag":48,"props":163843,"children":163844},{},[163845],{"type":23,"value":24559},{"type":23,"value":163847}," manages channels, messages, and messaging events.",{"type":17,"tag":84,"props":163849,"children":163850},{},[163851,163855],{"type":17,"tag":48,"props":163852,"children":163853},{},[163854],{"type":23,"value":14515},{"type":23,"value":163856}," manages calendars, events, free/busy, scheduling links, recordings, and webinars.",{"type":17,"tag":84,"props":163858,"children":163859},{},[163860,163864],{"type":17,"tag":48,"props":163861,"children":163862},{},[163863],{"type":23,"value":96511},{"type":23,"value":163865}," manages files and folders across cloud storage providers.",{"type":17,"tag":29,"props":163867,"children":163868},{},[163869],{"type":23,"value":163870},"Tasks can be connected to these domains in your product, but the linkage is application-controlled.",{"type":17,"tag":68,"props":163872,"children":163874},{"id":163873},"real-time-access-vs-sync-jobs",[163875],{"type":23,"value":163876},"Real-Time Access vs Sync Jobs",{"type":17,"tag":239,"props":163878,"children":163880},{"id":163879},"live-access-to-source-platforms",[163881],{"type":23,"value":163882},"Live Access to Source Platforms",{"type":17,"tag":29,"props":163884,"children":163885},{},[163886],{"type":23,"value":163887},"Unified's Task Management API is a real-time, pass-through layer. Each request goes to the source system directly. There is no replica and no cached task database.",{"type":17,"tag":239,"props":163889,"children":163891},{"id":163890},"updates-native-webhooks-virtual-webhooks-and-polling",[163892],{"type":23,"value":163893},"Updates: Native Webhooks, Virtual Webhooks, and Polling",{"type":17,"tag":29,"props":163895,"children":163896},{},[163897],{"type":23,"value":163898},"Providers differ in how they deliver updates:",{"type":17,"tag":80,"props":163900,"children":163901},{},[163902,163913,163918,163923],{"type":17,"tag":84,"props":163903,"children":163904},{},[163905,163907,163911],{"type":23,"value":163906},"Some offer native ",{"type":17,"tag":133,"props":163908,"children":163909},{"href":4999},[163910],{"type":23,"value":5002},{"type":23,"value":163912}," for tasks and comments (created, updated, deleted).",{"type":17,"tag":84,"props":163914,"children":163915},{},[163916],{"type":23,"value":163917},"Some offer partial events (created/updated but no delete).",{"type":17,"tag":84,"props":163919,"children":163920},{},[163921],{"type":23,"value":163922},"Some require polling with 'updated since' style filters.",{"type":17,"tag":84,"props":163924,"children":163925},{},[163926],{"type":23,"value":163927},"Some require custom subscriptions per field (for example, column-level change subscriptions).",{"type":17,"tag":29,"props":163929,"children":163930},{},[163931,163933,163937],{"type":23,"value":163932},"Unified supports native webhooks when a provider offers them and ",{"type":17,"tag":133,"props":163934,"children":163935},{"href":9007},[163936],{"type":23,"value":46572},{"type":23,"value":163938}," when it doesn't. Virtual webhooks are change detection built on polling, delivered through the same webhook interface.",{"type":17,"tag":68,"props":163940,"children":163942},{"id":163941},"core-task-management-data-models",[163943],{"type":23,"value":163944},"Core Task Management Data Models",{"type":17,"tag":29,"props":163946,"children":163947},{},[163948],{"type":23,"value":163949},"Unified normalizes Task Management into four objects.",{"type":17,"tag":239,"props":163951,"children":163952},{"id":122706},[163953],{"type":23,"value":123499},{"type":17,"tag":29,"props":163955,"children":163956},{},[163957],{"type":23,"value":163958},"Projects represent boards, workspaces, portfolios, or task groupings.",{"type":17,"tag":29,"props":163960,"children":163961},{},[163962],{"type":23,"value":163963},"Common fields include:",{"type":17,"tag":80,"props":163965,"children":163966},{},[163967,163987,164001,164011,164026],{"type":17,"tag":84,"props":163968,"children":163969},{},[163970,163975,163976,163981,163982],{"type":17,"tag":6121,"props":163971,"children":163973},{"className":163972},[],[163974],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":163977,"children":163979},{"className":163978},[],[163980],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":163983,"children":163985},{"className":163984},[],[163986],{"type":23,"value":25337},{"type":17,"tag":84,"props":163988,"children":163989},{},[163990,163995,163996],{"type":17,"tag":6121,"props":163991,"children":163993},{"className":163992},[],[163994],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":163997,"children":163999},{"className":163998},[],[164000],{"type":23,"value":24679},{"type":17,"tag":84,"props":164002,"children":164003},{},[164004,164009],{"type":17,"tag":6121,"props":164005,"children":164007},{"className":164006},[],[164008],{"type":23,"value":15863},{"type":23,"value":164010}," for hierarchical grouping",{"type":17,"tag":84,"props":164012,"children":164013},{},[164014,164019,164020],{"type":17,"tag":6121,"props":164015,"children":164017},{"className":164016},[],[164018],{"type":23,"value":111357},{"type":23,"value":34435},{"type":17,"tag":6121,"props":164021,"children":164023},{"className":164022},[],[164024],{"type":23,"value":164025},"group_ids",{"type":17,"tag":84,"props":164027,"children":164028},{},[164029,164035,164036],{"type":17,"tag":6121,"props":164030,"children":164032},{"className":164031},[],[164033],{"type":23,"value":164034},"has_tasks",{"type":23,"value":11826},{"type":17,"tag":6121,"props":164037,"children":164039},{"className":164038},[],[164040],{"type":23,"value":160848},{"type":17,"tag":29,"props":164042,"children":164043},{},[164044],{"type":23,"value":164045},"Projects are generally writable (create, update, remove), but provider support varies.",{"type":17,"tag":239,"props":164047,"children":164048},{"id":122701},[164049],{"type":23,"value":164050},"Tasks",{"type":17,"tag":29,"props":164052,"children":164053},{},[164054],{"type":23,"value":164055},"Tasks are the core work item. Unified's model is intentionally broad: tasks, issues, to-dos, and work items all map here.",{"type":17,"tag":29,"props":164057,"children":164058},{},[164059],{"type":23,"value":163963},{"type":17,"tag":80,"props":164061,"children":164062},{},[164063,164083,164097,164111,164125,164146,164166,164181],{"type":17,"tag":84,"props":164064,"children":164065},{},[164066,164071,164072,164077,164078],{"type":17,"tag":6121,"props":164067,"children":164069},{"className":164068},[],[164070],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164073,"children":164075},{"className":164074},[],[164076],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164079,"children":164081},{"className":164080},[],[164082],{"type":23,"value":25337},{"type":17,"tag":84,"props":164084,"children":164085},{},[164086,164091,164092],{"type":17,"tag":6121,"props":164087,"children":164089},{"className":164088},[],[164090],{"type":23,"value":124715},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164093,"children":164095},{"className":164094},[],[164096],{"type":23,"value":15863},{"type":17,"tag":84,"props":164098,"children":164099},{},[164100,164105,164106],{"type":17,"tag":6121,"props":164101,"children":164103},{"className":164102},[],[164104],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164107,"children":164109},{"className":164108},[],[164110],{"type":23,"value":124824},{"type":17,"tag":84,"props":164112,"children":164113},{},[164114,164119,164120],{"type":17,"tag":6121,"props":164115,"children":164117},{"className":164116},[],[164118],{"type":23,"value":124766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164121,"children":164123},{"className":164122},[],[164124],{"type":23,"value":24704},{"type":17,"tag":84,"props":164126,"children":164127},{},[164128,164133,164134,164139,164140],{"type":17,"tag":6121,"props":164129,"children":164131},{"className":164130},[],[164132],{"type":23,"value":124748},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164135,"children":164137},{"className":164136},[],[164138],{"type":23,"value":124757},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164141,"children":164143},{"className":164142},[],[164144],{"type":23,"value":164145},"follower_user_ids",{"type":17,"tag":84,"props":164147,"children":164148},{},[164149,164154,164155,164160,164161],{"type":17,"tag":6121,"props":164150,"children":164152},{"className":164151},[],[164153],{"type":23,"value":164025},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164156,"children":164158},{"className":164157},[],[164159],{"type":23,"value":62478},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164162,"children":164164},{"className":164163},[],[164165],{"type":23,"value":124783},{"type":17,"tag":84,"props":164167,"children":164168},{},[164169,164175,164176],{"type":17,"tag":6121,"props":164170,"children":164172},{"className":164171},[],[164173],{"type":23,"value":164174},"attachment_ids",{"type":23,"value":11826},{"type":17,"tag":6121,"props":164177,"children":164179},{"className":164178},[],[164180],{"type":23,"value":23792},{"type":17,"tag":84,"props":164182,"children":164183},{},[164184],{"type":17,"tag":6121,"props":164185,"children":164187},{"className":164186},[],[164188],{"type":23,"value":160848},{"type":17,"tag":29,"props":164190,"children":164191},{},[164192],{"type":23,"value":164193},"The schema supports full lifecycle workflows, but some fields are provider-dependent. Priority is a good example: some providers have a native priority field, some encode it with labels, and some require a custom field.",{"type":17,"tag":239,"props":164195,"children":164197},{"id":164196},"comments",[164198],{"type":23,"value":31629},{"type":17,"tag":29,"props":164200,"children":164201},{},[164202],{"type":23,"value":164203},"Comments capture discussion attached to a task.",{"type":17,"tag":29,"props":164205,"children":164206},{},[164207],{"type":23,"value":163963},{"type":17,"tag":80,"props":164209,"children":164210},{},[164211,164231,164239,164248],{"type":17,"tag":84,"props":164212,"children":164213},{},[164214,164219,164220,164225,164226],{"type":17,"tag":6121,"props":164215,"children":164217},{"className":164216},[],[164218],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164221,"children":164223},{"className":164222},[],[164224],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164227,"children":164229},{"className":164228},[],[164230],{"type":23,"value":25337},{"type":17,"tag":84,"props":164232,"children":164233},{},[164234],{"type":17,"tag":6121,"props":164235,"children":164237},{"className":164236},[],[164238],{"type":23,"value":23},{"type":17,"tag":84,"props":164240,"children":164241},{},[164242],{"type":17,"tag":6121,"props":164243,"children":164245},{"className":164244},[],[164246],{"type":23,"value":164247},"task_id",{"type":17,"tag":84,"props":164249,"children":164250},{},[164251,164256,164257],{"type":17,"tag":6121,"props":164252,"children":164254},{"className":164253},[],[164255],{"type":23,"value":62582},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164258,"children":164260},{"className":164259},[],[164261],{"type":23,"value":12092},{"type":17,"tag":29,"props":164263,"children":164264},{},[164265],{"type":23,"value":164266},"Comment write behavior varies more than task write behavior. Some providers allow editing and deletion, some allow creation only, and some treat comments as immutable after creation.",{"type":17,"tag":239,"props":164268,"children":164269},{"id":143323},[164270],{"type":23,"value":164271},"Changes",{"type":17,"tag":29,"props":164273,"children":164274},{},[164275],{"type":23,"value":164276},"Changes are a read-only audit log of task updates.",{"type":17,"tag":29,"props":164278,"children":164279},{},[164280],{"type":23,"value":163963},{"type":17,"tag":80,"props":164282,"children":164283},{},[164284,164304,164312,164320],{"type":17,"tag":84,"props":164285,"children":164286},{},[164287,164292,164293,164298,164299],{"type":17,"tag":6121,"props":164288,"children":164290},{"className":164289},[],[164291],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164294,"children":164296},{"className":164295},[],[164297],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164300,"children":164302},{"className":164301},[],[164303],{"type":23,"value":25337},{"type":17,"tag":84,"props":164305,"children":164306},{},[164307],{"type":17,"tag":6121,"props":164308,"children":164310},{"className":164309},[],[164311],{"type":23,"value":164247},{"type":17,"tag":84,"props":164313,"children":164314},{},[164315],{"type":17,"tag":6121,"props":164316,"children":164318},{"className":164317},[],[164319],{"type":23,"value":62582},{"type":17,"tag":84,"props":164321,"children":164322},{},[164323,164328],{"type":17,"tag":6121,"props":164324,"children":164326},{"className":164325},[],[164327],{"type":23,"value":83121},{"type":23,"value":164329}," describing what changed (field name plus old/new values)",{"type":17,"tag":29,"props":164331,"children":164332},{},[164333],{"type":23,"value":164334},"Changes are used for synchronization and history, not for writes.",{"type":17,"tag":68,"props":164336,"children":164338},{"id":164337},"lifecycle-semantics-across-providers",[164339],{"type":23,"value":164340},"Lifecycle Semantics Across Providers",{"type":17,"tag":29,"props":164342,"children":164343},{},[164344],{"type":23,"value":164345},"Task tools agree on the basic concept of 'open → in progress → done,' but they encode it differently.",{"type":17,"tag":239,"props":164347,"children":164349},{"id":164348},"status-and-completion",[164350],{"type":23,"value":164351},"Status and Completion",{"type":17,"tag":80,"props":164353,"children":164354},{},[164355,164360,164365,164370],{"type":17,"tag":84,"props":164356,"children":164357},{},[164358],{"type":23,"value":164359},"Some providers use workflow states (Jira).",{"type":17,"tag":84,"props":164361,"children":164362},{},[164363],{"type":23,"value":164364},"Some use status groups (ClickUp: Active/Done/Closed).",{"type":17,"tag":84,"props":164366,"children":164367},{},[164368],{"type":23,"value":164369},"Some use a completion boolean and timestamp (Asana completed/completed_at).",{"type":17,"tag":84,"props":164371,"children":164372},{},[164373],{"type":23,"value":164374},"Some use open/closed plus timestamps (GitHub and GitLab issues).",{"type":17,"tag":29,"props":164376,"children":164377},{},[164378,164380,164385,164387,164392],{"type":23,"value":164379},"Unified exposes a normalized ",{"type":17,"tag":6121,"props":164381,"children":164383},{"className":164382},[],[164384],{"type":23,"value":19949},{"type":23,"value":164386}," field plus ",{"type":17,"tag":6121,"props":164388,"children":164390},{"className":164389},[],[164391],{"type":23,"value":124824},{"type":23,"value":164393}," when available, but the meaning of 'done' still comes from the source system.",{"type":17,"tag":239,"props":164395,"children":164397},{"id":164396},"due-dates",[164398],{"type":23,"value":164399},"Due Dates",{"type":17,"tag":29,"props":164401,"children":164402},{},[164403],{"type":23,"value":164404},"Due date handling differs:",{"type":17,"tag":80,"props":164406,"children":164407},{},[164408,164413,164418],{"type":17,"tag":84,"props":164409,"children":164410},{},[164411],{"type":23,"value":164412},"Some providers support both date and time.",{"type":17,"tag":84,"props":164414,"children":164415},{},[164416],{"type":23,"value":164417},"Some support only a date.",{"type":17,"tag":84,"props":164419,"children":164420},{},[164421],{"type":23,"value":164422},"Some rely on milestones rather than a due date field.",{"type":17,"tag":29,"props":164424,"children":164425},{},[164426],{"type":23,"value":164427},"Design your integration so due dates are optional and provider-specific behaviors don't break your workflow.",{"type":17,"tag":239,"props":164429,"children":164430},{"id":24704},[164431],{"type":23,"value":164432},"Priority",{"type":17,"tag":29,"props":164434,"children":164435},{},[164436],{"type":23,"value":164437},"Priority is not universal:",{"type":17,"tag":80,"props":164439,"children":164440},{},[164441,164446,164451,164456],{"type":17,"tag":84,"props":164442,"children":164443},{},[164444],{"type":23,"value":164445},"Jira supports configurable priority schemes.",{"type":17,"tag":84,"props":164447,"children":164448},{},[164449],{"type":23,"value":164450},"ClickUp and Linear have numeric priorities.",{"type":17,"tag":84,"props":164452,"children":164453},{},[164454],{"type":23,"value":164455},"GitHub and GitLab often use labels or weight.",{"type":17,"tag":84,"props":164457,"children":164458},{},[164459],{"type":23,"value":164460},"Asana typically uses a custom field.",{"type":17,"tag":29,"props":164462,"children":164463},{},[164464],{"type":23,"value":164465},"Treat priority as a normalized convenience field, not a guarantee.",{"type":17,"tag":239,"props":164467,"children":164469},{"id":164468},"parentchild-relationships",[164470],{"type":23,"value":164471},"Parent/Child Relationships",{"type":17,"tag":29,"props":164473,"children":164474},{},[164475],{"type":23,"value":164476},"Subtasks exist across most platforms, but the mechanics differ:",{"type":17,"tag":80,"props":164478,"children":164479},{},[164480,164485,164490,164495,164500],{"type":17,"tag":84,"props":164481,"children":164482},{},[164483],{"type":23,"value":164484},"Asana uses subtasks under a parent task.",{"type":17,"tag":84,"props":164486,"children":164487},{},[164488],{"type":23,"value":164489},"ClickUp has explicit parent and child handling plus dependencies.",{"type":17,"tag":84,"props":164491,"children":164492},{},[164493],{"type":23,"value":164494},"Jira and GitLab support subtasks.",{"type":17,"tag":84,"props":164496,"children":164497},{},[164498],{"type":23,"value":164499},"GitHub supports sub-issues.",{"type":17,"tag":84,"props":164501,"children":164502},{},[164503],{"type":23,"value":164504},"Linear supports parent/child issue modeling.",{"type":17,"tag":29,"props":164506,"children":164507},{},[164508,164509,164514,164515,164520],{"type":23,"value":58218},{"type":17,"tag":6121,"props":164510,"children":164512},{"className":164511},[],[164513],{"type":23,"value":15863},{"type":23,"value":34435},{"type":17,"tag":6121,"props":164516,"children":164518},{"className":164517},[],[164519],{"type":23,"value":160848},{"type":23,"value":164521}," so you can build hierarchical work models consistently.",{"type":17,"tag":68,"props":164523,"children":164525},{"id":164524},"identity-model-and-cross-category-isolation",[164526],{"type":23,"value":164527},"Identity Model and Cross-Category Isolation",{"type":17,"tag":29,"props":164529,"children":164530},{},[164531],{"type":23,"value":164532},"Task objects remain task-domain objects.",{"type":17,"tag":239,"props":164534,"children":164536},{"id":164535},"hr-identity-references",[164537],{"type":23,"value":164538},"HR Identity References",{"type":17,"tag":29,"props":164540,"children":164541},{},[164542],{"type":23,"value":164543},"Task Management objects reference HR identities:",{"type":17,"tag":80,"props":164545,"children":164546},{},[164547,164570,164587],{"type":17,"tag":84,"props":164548,"children":164549},{},[164550,164552,164557,164558,164563,164564,164569],{"type":23,"value":164551},"Tasks include employee references through ",{"type":17,"tag":6121,"props":164553,"children":164555},{"className":164554},[],[164556],{"type":23,"value":124748},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164559,"children":164561},{"className":164560},[],[164562],{"type":23,"value":124757},{"type":23,"value":11826},{"type":17,"tag":6121,"props":164565,"children":164567},{"className":164566},[],[164568],{"type":23,"value":164145},{"type":23,"value":54},{"type":17,"tag":84,"props":164571,"children":164572},{},[164573,164575,164580,164581,164586],{"type":23,"value":164574},"Projects can include ",{"type":17,"tag":6121,"props":164576,"children":164578},{"className":164577},[],[164579],{"type":23,"value":111357},{"type":23,"value":34435},{"type":17,"tag":6121,"props":164582,"children":164584},{"className":164583},[],[164585],{"type":23,"value":164025},{"type":23,"value":54},{"type":17,"tag":84,"props":164588,"children":164589},{},[164590,164592,164597],{"type":23,"value":164591},"Comments and changes reference ",{"type":17,"tag":6121,"props":164593,"children":164595},{"className":164594},[],[164596],{"type":23,"value":62582},{"type":23,"value":54},{"type":17,"tag":29,"props":164599,"children":164600},{},[164601],{"type":23,"value":164602},"These reference HR directory identities (HrisEmployee/HrisGroup) rather than CRM contacts or ticketing customers.",{"type":17,"tag":239,"props":164604,"children":164606},{"id":164605},"attachments-and-storage",[164607],{"type":23,"value":164608},"Attachments and Storage",{"type":17,"tag":29,"props":164610,"children":164611},{},[164612],{"type":23,"value":164613},"Tasks can reference file attachments using:",{"type":17,"tag":80,"props":164615,"children":164616},{},[164617],{"type":17,"tag":84,"props":164618,"children":164619},{},[164620,164625],{"type":17,"tag":6121,"props":164621,"children":164623},{"className":164622},[],[164624],{"type":23,"value":164174},{"type":23,"value":164626}," pointing to Storage file IDs.",{"type":17,"tag":29,"props":164628,"children":164629},{},[164630,164631,164636],{"type":23,"value":6712},{"type":17,"tag":133,"props":164632,"children":164634},{"href":164633},"/task",[164635],{"type":23,"value":122602},{"type":23,"value":164637}," does not manage file storage itself. Files are handled through the Storage API.",{"type":17,"tag":239,"props":164639,"children":164641},{"id":164640},"what-task-objects-do-not-reference",[164642],{"type":23,"value":164643},"What Task Objects Do Not Reference",{"type":17,"tag":29,"props":164645,"children":164646},{},[164647],{"type":23,"value":164648},"Task objects do not include built-in references to:",{"type":17,"tag":80,"props":164650,"children":164651},{},[164652,164657,164662,164667,164672,164677,164682],{"type":17,"tag":84,"props":164653,"children":164654},{},[164655],{"type":23,"value":164656},"CRM contacts, companies, deals, leads",{"type":17,"tag":84,"props":164658,"children":164659},{},[164660],{"type":23,"value":164661},"Support tickets or ticket customers",{"type":17,"tag":84,"props":164663,"children":164664},{},[164665],{"type":23,"value":164666},"Repository objects (repos, commits, pull requests)",{"type":17,"tag":84,"props":164668,"children":164669},{},[164670],{"type":23,"value":164671},"KMS pages or spaces",{"type":17,"tag":84,"props":164673,"children":164674},{},[164675],{"type":23,"value":164676},"Messaging threads or channels",{"type":17,"tag":84,"props":164678,"children":164679},{},[164680],{"type":23,"value":164681},"Calendar events or recordings",{"type":17,"tag":84,"props":164683,"children":164684},{},[164685],{"type":23,"value":164686},"GenAI prompts, embeddings, or models",{"type":17,"tag":29,"props":164688,"children":164689},{},[164690],{"type":23,"value":164691},"If you want cross-domain linkage, you attach it in your own product (for example, storing external IDs in metadata or maintaining your own mapping table).",{"type":17,"tag":68,"props":164693,"children":164695},{"id":164694},"updates-webhooks-and-provider-variability",[164696],{"type":23,"value":164697},"Updates, Webhooks, and Provider Variability",{"type":17,"tag":29,"props":164699,"children":164700},{},[164701],{"type":23,"value":164702},"Task data changes constantly: status changes, assignments, due dates, comments, and metadata updates.",{"type":17,"tag":239,"props":164704,"children":164705},{"id":9021},[164706],{"type":23,"value":164707},"Native Webhooks",{"type":17,"tag":29,"props":164709,"children":164710},{},[164711],{"type":23,"value":164712},"Many providers support native webhooks for task lifecycle events. These can include:",{"type":17,"tag":80,"props":164714,"children":164715},{},[164716,164721,164726,164731,164736],{"type":17,"tag":84,"props":164717,"children":164718},{},[164719],{"type":23,"value":164720},"Task created and updated",{"type":17,"tag":84,"props":164722,"children":164723},{},[164724],{"type":23,"value":164725},"Status transitions",{"type":17,"tag":84,"props":164727,"children":164728},{},[164729],{"type":23,"value":164730},"Assignment changes",{"type":17,"tag":84,"props":164732,"children":164733},{},[164734],{"type":23,"value":164735},"Comment creation and edits",{"type":17,"tag":84,"props":164737,"children":164738},{},[164739],{"type":23,"value":164740},"Deletion or archival events (provider-dependent)",{"type":17,"tag":239,"props":164742,"children":164744},{"id":164743},"virtual-webhooks",[164745],{"type":23,"value":9010},{"type":17,"tag":29,"props":164747,"children":164748},{},[164749],{"type":23,"value":164750},"When native webhooks aren't available or aren't practical to configure, Unified can deliver virtual webhooks by polling and emitting created/updated events.",{"type":17,"tag":29,"props":164752,"children":164753},{},[164754],{"type":23,"value":164755},"Virtual webhooks are best when near-real-time behavior matters but strict 'push everything immediately' isn't required.",{"type":17,"tag":239,"props":164757,"children":164759},{"id":164758},"polling-and-incremental-sync",[164760],{"type":23,"value":164761},"Polling and Incremental Sync",{"type":17,"tag":29,"props":164763,"children":164764},{},[164765],{"type":23,"value":164766},"Many providers support incremental sync patterns through query filters such as:",{"type":17,"tag":80,"props":164768,"children":164769},{},[164770,164793,164798],{"type":17,"tag":84,"props":164771,"children":164772},{},[164773,164779,164780,164786,164787],{"type":17,"tag":6121,"props":164774,"children":164776},{"className":164775},[],[164777],{"type":23,"value":164778},"since",{"type":23,"value":11826},{"type":17,"tag":6121,"props":164781,"children":164783},{"className":164782},[],[164784],{"type":23,"value":164785},"updated_after",{"type":23,"value":11826},{"type":17,"tag":6121,"props":164788,"children":164790},{"className":164789},[],[164791],{"type":23,"value":164792},"modified_since",{"type":17,"tag":84,"props":164794,"children":164795},{},[164796],{"type":23,"value":164797},"provider-specific date filters",{"type":17,"tag":84,"props":164799,"children":164800},{},[164801],{"type":23,"value":164802},"field-level subscriptions",{"type":17,"tag":29,"props":164804,"children":164805},{},[164806],{"type":23,"value":164807},"Where these exist, use them. Where they don't, polling must rely on sorted lists and state checkpoints.",{"type":17,"tag":239,"props":164809,"children":164811},{"id":164810},"deletions-and-archiving",[164812],{"type":23,"value":164813},"Deletions and Archiving",{"type":17,"tag":29,"props":164815,"children":164816},{},[164817],{"type":23,"value":164818},"Deletion semantics vary widely:",{"type":17,"tag":80,"props":164820,"children":164821},{},[164822,164827,164832,164837],{"type":17,"tag":84,"props":164823,"children":164824},{},[164825],{"type":23,"value":164826},"Some providers emit explicit delete events.",{"type":17,"tag":84,"props":164828,"children":164829},{},[164830],{"type":23,"value":164831},"Some treat deletion as archiving.",{"type":17,"tag":84,"props":164833,"children":164834},{},[164835],{"type":23,"value":164836},"Some never emit deletion events and require reconciliation.",{"type":17,"tag":84,"props":164838,"children":164839},{},[164840],{"type":23,"value":164841},"Some treat closure as the terminal state rather than deletion.",{"type":17,"tag":29,"props":164843,"children":164844},{},[164845],{"type":23,"value":164846},"Design your system so 'removed' is handled as provider-specific behavior, not a universal assumption.",{"type":17,"tag":68,"props":164848,"children":164850},{"id":164849},"security-privacy-and-data-handling",[164851],{"type":23,"value":164852},"Security, Privacy, and Data Handling",{"type":17,"tag":29,"props":164854,"children":164855},{},[164856],{"type":23,"value":164857},"Task data often includes sensitive internal context: incident details, customer references, credentials pasted into comments, and attachments.",{"type":17,"tag":29,"props":164859,"children":164860},{},[164861],{"type":23,"value":164862},"Unified's platform is designed around real-time pass-through with no customer data stored at rest. Your system remains the place where retention and access controls are implemented.",{"type":17,"tag":239,"props":164864,"children":164866},{"id":164865},"sensitive-fields-to-treat-carefully",[164867],{"type":23,"value":164868},"Sensitive Fields to Treat Carefully",{"type":17,"tag":80,"props":164870,"children":164871},{},[164872,164891,164896,164901],{"type":17,"tag":84,"props":164873,"children":164874},{},[164875,164877,164882,164884,164889],{"type":23,"value":164876},"Free-text fields: task ",{"type":17,"tag":6121,"props":164878,"children":164880},{"className":164879},[],[164881],{"type":23,"value":6698},{"type":23,"value":164883},", comment ",{"type":17,"tag":6121,"props":164885,"children":164887},{"className":164886},[],[164888],{"type":23,"value":23},{"type":23,"value":164890},", change-history values",{"type":17,"tag":84,"props":164892,"children":164893},{},[164894],{"type":23,"value":164895},"Employee identifiers: assignees, creators, followers, groups",{"type":17,"tag":84,"props":164897,"children":164898},{},[164899],{"type":23,"value":164900},"Attachments: often the highest sensitivity",{"type":17,"tag":84,"props":164902,"children":164903},{},[164904],{"type":23,"value":164905},"Metadata: arbitrary key/value fields that can include unexpected personal or internal data",{"type":17,"tag":29,"props":164907,"children":164908},{},[164909],{"type":23,"value":164910},"If you store task content downstream, you own retention, access controls, and redaction decisions.",{"type":17,"tag":68,"props":164912,"children":164914},{"id":164913},"common-task-management-api-use-cases",[164915],{"type":23,"value":164916},"Common Task Management API Use Cases",{"type":17,"tag":239,"props":164918,"children":164920},{"id":164919},"cross-platform-task-sync",[164921],{"type":23,"value":164922},"Cross-Platform Task Sync",{"type":17,"tag":29,"props":164924,"children":164925},{},[164926],{"type":23,"value":164927},"Mirror tasks between systems (for example, Jira ↔ Asana), including status, assignees, and due dates.",{"type":17,"tag":239,"props":164929,"children":164931},{"id":164930},"project-reporting-and-analytics",[164932],{"type":23,"value":164933},"Project Reporting and Analytics",{"type":17,"tag":29,"props":164935,"children":164936},{},[164937],{"type":23,"value":164938},"Compute throughput, cycle time, completion rates, and workload across multiple providers.",{"type":17,"tag":239,"props":164940,"children":164941},{"id":13496},[164942],{"type":23,"value":164943},"Workflow Automation",{"type":17,"tag":29,"props":164945,"children":164946},{},[164947],{"type":23,"value":164948},"Trigger actions when a task changes status, when a due date moves, or when a comment appears.",{"type":17,"tag":239,"props":164950,"children":164951},{"id":13527},[164952],{"type":23,"value":164953},"Resource Planning",{"type":17,"tag":29,"props":164955,"children":164956},{},[164957],{"type":23,"value":164958},"Build workload views using assignments, due dates, and project structure.",{"type":17,"tag":239,"props":164960,"children":164961},{"id":13517},[164962],{"type":23,"value":164963},"AI Project Assistants",{"type":17,"tag":29,"props":164965,"children":164966},{},[164967],{"type":23,"value":164968},"Feed tasks and comments into AI systems for summarization and prioritization while keeping the source platforms authoritative.",{"type":17,"tag":68,"props":164970,"children":164972},{"id":164971},"constraints-to-design-around",[164973],{"type":23,"value":164974},"Constraints to Design Around",{"type":17,"tag":29,"props":164976,"children":164977},{},[164978],{"type":23,"value":164979},"Task providers are not uniform. Build defensively.",{"type":17,"tag":80,"props":164981,"children":164982},{},[164983,164988,164993,164998,165003],{"type":17,"tag":84,"props":164984,"children":164985},{},[164986],{"type":23,"value":164987},"Priority may not exist as a native field.",{"type":17,"tag":84,"props":164989,"children":164990},{},[164991],{"type":23,"value":164992},"Comments may be immutable in some systems.",{"type":17,"tag":84,"props":164994,"children":164995},{},[164996],{"type":23,"value":164997},"Deletion may mean archive, close, or permanent removal.",{"type":17,"tag":84,"props":164999,"children":165000},{},[165001],{"type":23,"value":165002},"Some platforms emit granular change events; others do not.",{"type":17,"tag":84,"props":165004,"children":165005},{},[165006],{"type":23,"value":165007},"Incremental sync support differs significantly by provider.",{"type":17,"tag":29,"props":165009,"children":165010},{},[165011],{"type":23,"value":165012},"Unified normalizes schema and access patterns. Provider behavior still matters.",{"type":17,"tag":68,"props":165014,"children":165016},{"id":165015},"build-vs-maintain-task-integrations",[165017],{"type":23,"value":165018},"Build vs Maintain Task Integrations",{"type":17,"tag":239,"props":165020,"children":165022},{"id":165021},"building-in-house",[165023],{"type":23,"value":165024},"Building In-House",{"type":17,"tag":80,"props":165026,"children":165027},{},[165028,165033,165038,165043],{"type":17,"tag":84,"props":165029,"children":165030},{},[165031],{"type":23,"value":165032},"Separate integrations per provider",{"type":17,"tag":84,"props":165034,"children":165035},{},[165036],{"type":23,"value":165037},"Provider-specific status, priority, and comment semantics",{"type":17,"tag":84,"props":165039,"children":165040},{},[165041],{"type":23,"value":165042},"Different webhook implementations",{"type":17,"tag":84,"props":165044,"children":165045},{},[165046],{"type":23,"value":165047},"Ongoing changes as platforms evolve",{"type":17,"tag":239,"props":165049,"children":165051},{"id":165050},"using-a-unified-task-management-api",[165052],{"type":23,"value":165053},"Using a Unified Task Management API",{"type":17,"tag":80,"props":165055,"children":165056},{},[165057,165062,165067,165072,165077],{"type":17,"tag":84,"props":165058,"children":165059},{},[165060],{"type":23,"value":165061},"One task-specific API surface",{"type":17,"tag":84,"props":165063,"children":165064},{},[165065],{"type":23,"value":165066},"Normalized projects, tasks, comments, and change history",{"type":17,"tag":84,"props":165068,"children":165069},{},[165070],{"type":23,"value":165071},"Live access to source platforms",{"type":17,"tag":84,"props":165073,"children":165074},{},[165075],{"type":23,"value":165076},"Standard webhook interface with fallback options",{"type":17,"tag":84,"props":165078,"children":165079},{},[165080],{"type":23,"value":165081},"Clear separation from ticketing, CRM, storage, and repository domains",{"type":17,"tag":68,"props":165083,"children":165085},{"id":165084},"best-practices-for-task-integrations",[165086],{"type":23,"value":165087},"Best Practices for Task Integrations",{"type":17,"tag":80,"props":165089,"children":165090},{},[165091,165096,165101,165106,165111,165116],{"type":17,"tag":84,"props":165092,"children":165093},{},[165094],{"type":23,"value":165095},"Treat status and priority as provider-dependent",{"type":17,"tag":84,"props":165097,"children":165098},{},[165099],{"type":23,"value":165100},"Use change history when you need a reliable update stream",{"type":17,"tag":84,"props":165102,"children":165103},{},[165104],{"type":23,"value":165105},"Don't assume delete semantics are consistent",{"type":17,"tag":84,"props":165107,"children":165108},{},[165109],{"type":23,"value":165110},"Keep attachments and file handling in the Storage API",{"type":17,"tag":84,"props":165112,"children":165113},{},[165114],{"type":23,"value":165115},"Build a small mapping layer for cross-category linkage",{"type":17,"tag":84,"props":165117,"children":165118},{},[165119],{"type":23,"value":165120},"Expect provider variability and handle unsupported fields gracefully",{"type":17,"tag":68,"props":165122,"children":165124},{"id":165123},"build-task-integrations-that-stay-accurate-under-change",[165125],{"type":23,"value":165126},"Build task integrations that stay accurate under change",{"type":17,"tag":29,"props":165128,"children":165129},{},[165130],{"type":23,"value":165131},"Task systems are where work changes hour by hour. If your product needs to unify task execution across multiple platforms, brittle integrations create immediate drift.",{"type":17,"tag":29,"props":165133,"children":165134},{},[165135],{"type":23,"value":165136},"Unified's Task Management API provides a consistent way to work with projects, tasks, comments, and change history across providers—without storing task data or collapsing category boundaries.",{"type":17,"tag":29,"props":165138,"children":165139},{},[165140],{"type":17,"tag":133,"props":165141,"children":165143},{"href":165142},"/3066207b838480cd81a0e2a4ca430543",[165144],{"type":23,"value":44481},{"type":17,"tag":29,"props":165146,"children":165147},{},[165148],{"type":17,"tag":133,"props":165149,"children":165150},{"href":165142},[165151],{"type":23,"value":44490},{"type":17,"tag":68,"props":165153,"children":165154},{"id":95759},[165155],{"type":23,"value":95762},{"type":17,"tag":29,"props":165157,"children":165158},{},[165159],{"type":17,"tag":48,"props":165160,"children":165161},{},[165162],{"type":23,"value":12597},{"type":17,"tag":29,"props":165164,"children":165165},{},[165166],{"type":23,"value":165167},"An API that exposes projects, tasks, task comments, and task change history so applications can manage work items programmatically.",{"type":17,"tag":29,"props":165169,"children":165170},{},[165171],{"type":17,"tag":48,"props":165172,"children":165173},{},[165174],{"type":23,"value":165175},"Which platforms are supported?",{"type":17,"tag":29,"props":165177,"children":165178},{},[165179],{"type":23,"value":165180},"Unified supports task and issue tools including Asana, Jira, ClickUp, Linear, GitHub, GitLab, and others.",{"type":17,"tag":29,"props":165182,"children":165183},{},[165184],{"type":17,"tag":48,"props":165185,"children":165186},{},[165187],{"type":23,"value":165188},"Are task updates real time?",{"type":17,"tag":29,"props":165190,"children":165191},{},[165192],{"type":23,"value":165193},"Direct reads are live. Update delivery depends on provider support for native webhooks, virtual webhooks, and incremental sync filters.",{"type":17,"tag":29,"props":165195,"children":165196},{},[165197],{"type":17,"tag":48,"props":165198,"children":165199},{},[165200],{"type":23,"value":165201},"Does the Task Management API store task data?",{"type":17,"tag":29,"props":165203,"children":165204},{},[165205],{"type":23,"value":165206},"No. Unified does not store end-customer task data at rest.",{"type":17,"tag":29,"props":165208,"children":165209},{},[165210],{"type":17,"tag":48,"props":165211,"children":165212},{},[165213],{"type":23,"value":165214},"How do tasks differ from tickets?",{"type":17,"tag":29,"props":165216,"children":165217},{},[165218],{"type":23,"value":165219},"Tasks represent internal work items. Tickets represent customer-support requests. They are separate objects in separate categories.",{"type":17,"tag":29,"props":165221,"children":165222},{},[165223],{"type":17,"tag":48,"props":165224,"children":165225},{},[165226],{"type":23,"value":165227},"Can I attach files to tasks?",{"type":17,"tag":29,"props":165229,"children":165230},{},[165231],{"type":23,"value":165232},"Tasks can reference attachment IDs, and file retrieval is handled through the Storage API.",{"type":17,"tag":29,"props":165234,"children":165235},{},[165236],{"type":17,"tag":133,"props":165237,"children":165239},{"href":1612,"rel":165238},[214],[165240],{"type":23,"value":44481},{"type":17,"tag":29,"props":165242,"children":165243},{},[165244],{"type":17,"tag":133,"props":165245,"children":165247},{"href":1623,"rel":165246},[214],[165248],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":165250},[165251,165252,165253,165254,165258,165264,165270,165275,165281,165284,165291,165292,165296,165297,165298],{"id":163694,"depth":1629,"text":163697},{"id":12594,"depth":1629,"text":163745},{"id":163781,"depth":1629,"text":163784},{"id":163873,"depth":1629,"text":163876,"children":165255},[165256,165257],{"id":163879,"depth":1635,"text":163882},{"id":163890,"depth":1635,"text":163893},{"id":163941,"depth":1629,"text":163944,"children":165259},[165260,165261,165262,165263],{"id":122706,"depth":1635,"text":123499},{"id":122701,"depth":1635,"text":164050},{"id":164196,"depth":1635,"text":31629},{"id":143323,"depth":1635,"text":164271},{"id":164337,"depth":1629,"text":164340,"children":165265},[165266,165267,165268,165269],{"id":164348,"depth":1635,"text":164351},{"id":164396,"depth":1635,"text":164399},{"id":24704,"depth":1635,"text":164432},{"id":164468,"depth":1635,"text":164471},{"id":164524,"depth":1629,"text":164527,"children":165271},[165272,165273,165274],{"id":164535,"depth":1635,"text":164538},{"id":164605,"depth":1635,"text":164608},{"id":164640,"depth":1635,"text":164643},{"id":164694,"depth":1629,"text":164697,"children":165276},[165277,165278,165279,165280],{"id":9021,"depth":1635,"text":164707},{"id":164743,"depth":1635,"text":9010},{"id":164758,"depth":1635,"text":164761},{"id":164810,"depth":1635,"text":164813},{"id":164849,"depth":1629,"text":164852,"children":165282},[165283],{"id":164865,"depth":1635,"text":164868},{"id":164913,"depth":1629,"text":164916,"children":165285},[165286,165287,165288,165289,165290],{"id":164919,"depth":1635,"text":164922},{"id":164930,"depth":1635,"text":164933},{"id":13496,"depth":1635,"text":164943},{"id":13527,"depth":1635,"text":164953},{"id":13517,"depth":1635,"text":164963},{"id":164971,"depth":1629,"text":164974},{"id":165015,"depth":1629,"text":165018,"children":165293},[165294,165295],{"id":165021,"depth":1635,"text":165024},{"id":165050,"depth":1635,"text":165053},{"id":165084,"depth":1629,"text":165087},{"id":165123,"depth":1629,"text":165126},{"id":95759,"depth":1629,"text":95762},"content:blog:task_management_api_integration_projects_tasks_comments_and_change_history_across_platforms.md","blog/task_management_api_integration_projects_tasks_comments_and_change_history_across_platforms.md","blog/task_management_api_integration_projects_tasks_comments_and_change_history_across_platforms",{"_path":165303,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":165304,"description":165305,"img":165306,"date":165307,"tag":12,"body":165308,"_type":1677,"_id":167109,"_source":1679,"_file":167110,"_stem":167111,"_extension":1682},"/blog/calendar_api_integration_real_time_events_free_busy_scheduling_links_and_meeting_recordings_across_platforms","Calendar API Integration: Real-Time Events, Free/Busy, Scheduling Links & Meeting Recordings Across Platforms","Calendar systems sit at the center of how teams coordinate time.","https://s3.us-east-2.amazonaws.com/unified-article-images/calendar_api_integration_real_time_events_free_busy_scheduling_links_and_meeting_recordings_across_platforms-icon.png","2026-02-12T21:05:00.000Z",{"type":14,"children":165309,"toc":167083},[165310,165315,165318,165326,165330,165335,165340,165349,165354,165360,165365,165422,165427,165459,165464,165469,165475,165480,165486,165491,165498,165550,165557,165580,165585,165591,165596,165603,165738,165745,165768,165773,165796,165801,165807,165812,165819,165862,165869,165876,165881,165886,165892,165897,165904,165966,165973,165996,166001,166006,166012,166017,166024,166085,166092,166103,166108,166113,166119,166124,166131,166234,166241,166264,166269,166274,166280,166285,166290,166325,166330,166336,166373,166378,166384,166418,166423,166429,166434,166438,166443,166478,166488,166516,166521,166527,166532,166537,166563,166571,166594,166599,166605,166610,166615,166643,166648,166667,166672,166677,166693,166698,166710,166723,166729,166734,166740,166768,166773,166796,166801,166824,166829,166833,166841,166846,166854,166859,166867,166872,166880,166885,166893,166898,166924,166929,166937,166942,166948,166953,166986,166991,167014,167019,167024,167062,167067,167075],{"type":17,"tag":18,"props":165311,"children":165313},{"id":165312},"calendar-api-integration-real-time-events-freebusy-scheduling-links-meeting-recordings-across-platforms",[165314],{"type":23,"value":165304},{"type":17,"tag":25,"props":165316,"children":165317},{},[],{"type":17,"tag":29,"props":165319,"children":165320},{},[165321],{"type":17,"tag":33,"props":165322,"children":165323},{},[165324],{"type":23,"value":165325},"February 12, 2026",{"type":17,"tag":29,"props":165327,"children":165328},{},[165329],{"type":23,"value":165305},{"type":17,"tag":29,"props":165331,"children":165332},{},[165333],{"type":23,"value":165334},"Meetings are created, rescheduled, canceled, converted into webinars, enriched with video links, and sometimes recorded with transcripts. Availability shifts constantly as new events are added. Recurring series split, single instances are edited, and conference links are regenerated.",{"type":17,"tag":29,"props":165336,"children":165337},{},[165338],{"type":23,"value":165339},"When calendar data is stitched together with batch sync jobs or cached replicas, availability drifts, deleted events linger, and meeting links break.",{"type":17,"tag":29,"props":165341,"children":165342},{},[165343,165347],{"type":17,"tag":133,"props":165344,"children":165345},{"href":13708},[165346],{"type":23,"value":98258},{"type":23,"value":165348}," integration exists to solve this problem.",{"type":17,"tag":29,"props":165350,"children":165351},{},[165352],{"type":23,"value":165353},"In this guide, we'll define exactly what the Unified Calendar API covers, how its objects behave in practice, how real-time updates are delivered, how recurrence and deletions work across providers, and how the Calendar category differs from Messaging, Call Center, KMS, Storage, CRM, and GenAI.",{"type":17,"tag":68,"props":165355,"children":165357},{"id":165356},"what-is-the-unified-calendar-api",[165358],{"type":23,"value":165359},"What Is the Unified Calendar API?",{"type":17,"tag":29,"props":165361,"children":165362},{},[165363],{"type":23,"value":165364},"The Unified Calendar API provides a normalized interface for accessing scheduling data across providers such as:",{"type":17,"tag":80,"props":165366,"children":165367},{},[165368,165372,165377,165381,165385,165389,165393,165398,165402,165406,165410,165414,165418],{"type":17,"tag":84,"props":165369,"children":165370},{},[165371],{"type":23,"value":13669},{"type":17,"tag":84,"props":165373,"children":165374},{},[165375],{"type":23,"value":165376},"Microsoft Outlook / Office 365",{"type":17,"tag":84,"props":165378,"children":165379},{},[165380],{"type":23,"value":14108},{"type":17,"tag":84,"props":165382,"children":165383},{},[165384],{"type":23,"value":13678},{"type":17,"tag":84,"props":165386,"children":165387},{},[165388],{"type":23,"value":14004},{"type":17,"tag":84,"props":165390,"children":165391},{},[165392],{"type":23,"value":14087},{"type":17,"tag":84,"props":165394,"children":165395},{},[165396],{"type":23,"value":165397},"Zoom (meetings & webinars)",{"type":17,"tag":84,"props":165399,"children":165400},{},[165401],{"type":23,"value":14045},{"type":17,"tag":84,"props":165403,"children":165404},{},[165405],{"type":23,"value":14269},{"type":17,"tag":84,"props":165407,"children":165408},{},[165409],{"type":23,"value":31550},{"type":17,"tag":84,"props":165411,"children":165412},{},[165413],{"type":23,"value":14259},{"type":17,"tag":84,"props":165415,"children":165416},{},[165417],{"type":23,"value":14249},{"type":17,"tag":84,"props":165419,"children":165420},{},[165421],{"type":23,"value":15768},{"type":17,"tag":29,"props":165423,"children":165424},{},[165425],{"type":23,"value":165426},"Instead of building separate integrations for each platform, you use one API surface to:",{"type":17,"tag":80,"props":165428,"children":165429},{},[165430,165434,165439,165444,165449,165454],{"type":17,"tag":84,"props":165431,"children":165432},{},[165433],{"type":23,"value":97582},{"type":17,"tag":84,"props":165435,"children":165436},{},[165437],{"type":23,"value":165438},"Create, update, and delete events",{"type":17,"tag":84,"props":165440,"children":165441},{},[165442],{"type":23,"value":165443},"Check free/busy availability",{"type":17,"tag":84,"props":165445,"children":165446},{},[165447],{"type":23,"value":165448},"Generate scheduling links",{"type":17,"tag":84,"props":165450,"children":165451},{},[165452],{"type":23,"value":165453},"Retrieve meeting recordings and transcripts",{"type":17,"tag":84,"props":165455,"children":165456},{},[165457],{"type":23,"value":165458},"Create and manage webinars",{"type":17,"tag":29,"props":165460,"children":165461},{},[165462],{"type":23,"value":165463},"Every request is real-time and pass-through. Unified does not cache or store calendar data. Calls are executed directly against the source platform, and results are returned immediately.",{"type":17,"tag":29,"props":165465,"children":165466},{},[165467],{"type":23,"value":165468},"There is no replica database. No background sync jobs. No stale state.",{"type":17,"tag":68,"props":165470,"children":165472},{"id":165471},"core-calendar-data-objects",[165473],{"type":23,"value":165474},"Core Calendar Data Objects",{"type":17,"tag":29,"props":165476,"children":165477},{},[165478],{"type":23,"value":165479},"The Unified Calendar API standardizes six primary objects.",{"type":17,"tag":239,"props":165481,"children":165483},{"id":165482},"_1-calendar",[165484],{"type":23,"value":165485},"1. Calendar",{"type":17,"tag":29,"props":165487,"children":165488},{},[165489],{"type":23,"value":165490},"Represents a calendar container (e.g., a Google calendar or Outlook calendar).",{"type":17,"tag":29,"props":165492,"children":165493},{},[165494],{"type":17,"tag":48,"props":165495,"children":165496},{},[165497],{"type":23,"value":152723},{"type":17,"tag":80,"props":165499,"children":165500},{},[165501,165509,165517,165525,165533,165541],{"type":17,"tag":84,"props":165502,"children":165503},{},[165504],{"type":17,"tag":6121,"props":165505,"children":165507},{"className":165506},[],[165508],{"type":23,"value":18766},{"type":17,"tag":84,"props":165510,"children":165511},{},[165512],{"type":17,"tag":6121,"props":165513,"children":165515},{"className":165514},[],[165516],{"type":23,"value":33446},{"type":17,"tag":84,"props":165518,"children":165519},{},[165520],{"type":17,"tag":6121,"props":165521,"children":165523},{"className":165522},[],[165524],{"type":23,"value":25337},{"type":17,"tag":84,"props":165526,"children":165527},{},[165528],{"type":17,"tag":6121,"props":165529,"children":165531},{"className":165530},[],[165532],{"type":23,"value":18781},{"type":17,"tag":84,"props":165534,"children":165535},{},[165536],{"type":17,"tag":6121,"props":165537,"children":165539},{"className":165538},[],[165540],{"type":23,"value":22305},{"type":17,"tag":84,"props":165542,"children":165543},{},[165544],{"type":17,"tag":6121,"props":165545,"children":165547},{"className":165546},[],[165548],{"type":23,"value":165549},"is_primary",{"type":17,"tag":29,"props":165551,"children":165552},{},[165553],{"type":17,"tag":48,"props":165554,"children":165555},{},[165556],{"type":23,"value":71599},{"type":17,"tag":80,"props":165558,"children":165559},{},[165560,165564,165568,165572,165576],{"type":17,"tag":84,"props":165561,"children":165562},{},[165563],{"type":23,"value":42125},{"type":17,"tag":84,"props":165565,"children":165566},{},[165567],{"type":23,"value":145784},{"type":17,"tag":84,"props":165569,"children":165570},{},[165571],{"type":23,"value":145789},{"type":17,"tag":84,"props":165573,"children":165574},{},[165575],{"type":23,"value":109982},{"type":17,"tag":84,"props":165577,"children":165578},{},[165579],{"type":23,"value":150952},{"type":17,"tag":29,"props":165581,"children":165582},{},[165583],{"type":23,"value":165584},"Calendars group events. They do not link to CRM contacts, tickets, storage files, repository objects, or GenAI artifacts.",{"type":17,"tag":239,"props":165586,"children":165588},{"id":165587},"_2-event",[165589],{"type":23,"value":165590},"2. Event",{"type":17,"tag":29,"props":165592,"children":165593},{},[165594],{"type":23,"value":165595},"Represents a scheduled meeting or appointment.",{"type":17,"tag":29,"props":165597,"children":165598},{},[165599],{"type":17,"tag":48,"props":165600,"children":165601},{},[165602],{"type":23,"value":152723},{"type":17,"tag":80,"props":165604,"children":165605},{},[165606,165614,165622,165630,165638,165646,165654,165664,165672,165680,165688,165696,165705,165713,165721,165729],{"type":17,"tag":84,"props":165607,"children":165608},{},[165609],{"type":17,"tag":6121,"props":165610,"children":165612},{"className":165611},[],[165613],{"type":23,"value":18766},{"type":17,"tag":84,"props":165615,"children":165616},{},[165617],{"type":17,"tag":6121,"props":165618,"children":165620},{"className":165619},[],[165621],{"type":23,"value":113801},{"type":17,"tag":84,"props":165623,"children":165624},{},[165625],{"type":17,"tag":6121,"props":165626,"children":165628},{"className":165627},[],[165629],{"type":23,"value":24666},{"type":17,"tag":84,"props":165631,"children":165632},{},[165633],{"type":17,"tag":6121,"props":165634,"children":165636},{"className":165635},[],[165637],{"type":23,"value":21051},{"type":17,"tag":84,"props":165639,"children":165640},{},[165641],{"type":17,"tag":6121,"props":165642,"children":165644},{"className":165643},[],[165645],{"type":23,"value":21060},{"type":17,"tag":84,"props":165647,"children":165648},{},[165649],{"type":17,"tag":6121,"props":165650,"children":165652},{"className":165651},[],[165653],{"type":23,"value":22305},{"type":17,"tag":84,"props":165655,"children":165656},{},[165657,165662],{"type":17,"tag":6121,"props":165658,"children":165660},{"className":165659},[],[165661],{"type":23,"value":19949},{"type":23,"value":165663}," (CONFIRMED / TENTATIVE / CANCELED)",{"type":17,"tag":84,"props":165665,"children":165666},{},[165667],{"type":17,"tag":6121,"props":165668,"children":165670},{"className":165669},[],[165671],{"type":23,"value":74116},{"type":17,"tag":84,"props":165673,"children":165674},{},[165675],{"type":17,"tag":6121,"props":165676,"children":165678},{"className":165677},[],[165679],{"type":23,"value":74080},{"type":17,"tag":84,"props":165681,"children":165682},{},[165683],{"type":17,"tag":6121,"props":165684,"children":165686},{"className":165685},[],[165687],{"type":23,"value":145968},{"type":17,"tag":84,"props":165689,"children":165690},{},[165691],{"type":17,"tag":6121,"props":165692,"children":165694},{"className":165693},[],[165695],{"type":23,"value":145977},{"type":17,"tag":84,"props":165697,"children":165698},{},[165699],{"type":17,"tag":6121,"props":165700,"children":165702},{"className":165701},[],[165703],{"type":23,"value":165704},"has_conference",{"type":17,"tag":84,"props":165706,"children":165707},{},[165708],{"type":17,"tag":6121,"props":165709,"children":165711},{"className":165710},[],[165712],{"type":23,"value":74098},{"type":17,"tag":84,"props":165714,"children":165715},{},[165716],{"type":17,"tag":6121,"props":165717,"children":165719},{"className":165718},[],[165720],{"type":23,"value":33472},{"type":17,"tag":84,"props":165722,"children":165723},{},[165724],{"type":17,"tag":6121,"props":165725,"children":165727},{"className":165726},[],[165728],{"type":23,"value":12107},{"type":17,"tag":84,"props":165730,"children":165731},{},[165732],{"type":17,"tag":6121,"props":165733,"children":165735},{"className":165734},[],[165736],{"type":23,"value":165737},"send_notifications",{"type":17,"tag":29,"props":165739,"children":165740},{},[165741],{"type":17,"tag":48,"props":165742,"children":165743},{},[165744],{"type":23,"value":71599},{"type":17,"tag":80,"props":165746,"children":165747},{},[165748,165752,165756,165760,165764],{"type":17,"tag":84,"props":165749,"children":165750},{},[165751],{"type":23,"value":42125},{"type":17,"tag":84,"props":165753,"children":165754},{},[165755],{"type":23,"value":145784},{"type":17,"tag":84,"props":165757,"children":165758},{},[165759],{"type":23,"value":145789},{"type":17,"tag":84,"props":165761,"children":165762},{},[165763],{"type":23,"value":109982},{"type":17,"tag":84,"props":165765,"children":165766},{},[165767],{"type":23,"value":150952},{"type":17,"tag":29,"props":165769,"children":165770},{},[165771],{"type":23,"value":165772},"Events support:",{"type":17,"tag":80,"props":165774,"children":165775},{},[165776,165781,165786,165791],{"type":17,"tag":84,"props":165777,"children":165778},{},[165779],{"type":23,"value":165780},"Single meetings",{"type":17,"tag":84,"props":165782,"children":165783},{},[165784],{"type":23,"value":165785},"Recurring series",{"type":17,"tag":84,"props":165787,"children":165788},{},[165789],{"type":23,"value":165790},"Single-instance edits",{"type":17,"tag":84,"props":165792,"children":165793},{},[165794],{"type":23,"value":165795},"Conference link generation (Google Meet, Teams, etc.)",{"type":17,"tag":29,"props":165797,"children":165798},{},[165799],{"type":23,"value":165800},"Organizer and attendee objects contain names and emails only. They are not CRM contacts and do not reference HR, Ticketing, or other Unified categories.",{"type":17,"tag":239,"props":165802,"children":165804},{"id":165803},"_3-busy-freebusy",[165805],{"type":23,"value":165806},"3. Busy (Free/Busy)",{"type":17,"tag":29,"props":165808,"children":165809},{},[165810],{"type":23,"value":165811},"Represents blocks of unavailable time.",{"type":17,"tag":29,"props":165813,"children":165814},{},[165815],{"type":17,"tag":48,"props":165816,"children":165817},{},[165818],{"type":23,"value":152723},{"type":17,"tag":80,"props":165820,"children":165821},{},[165822,165830,165838,165846,165854],{"type":17,"tag":84,"props":165823,"children":165824},{},[165825],{"type":17,"tag":6121,"props":165826,"children":165828},{"className":165827},[],[165829],{"type":23,"value":18766},{"type":17,"tag":84,"props":165831,"children":165832},{},[165833],{"type":17,"tag":6121,"props":165834,"children":165836},{"className":165835},[],[165837],{"type":23,"value":21051},{"type":17,"tag":84,"props":165839,"children":165840},{},[165841],{"type":17,"tag":6121,"props":165842,"children":165844},{"className":165843},[],[165845],{"type":23,"value":21060},{"type":17,"tag":84,"props":165847,"children":165848},{},[165849],{"type":17,"tag":6121,"props":165850,"children":165852},{"className":165851},[],[165853],{"type":23,"value":22305},{"type":17,"tag":84,"props":165855,"children":165856},{},[165857],{"type":17,"tag":6121,"props":165858,"children":165860},{"className":165859},[],[165861],{"type":23,"value":24679},{"type":17,"tag":29,"props":165863,"children":165864},{},[165865],{"type":17,"tag":48,"props":165866,"children":165867},{},[165868],{"type":23,"value":71599},{"type":17,"tag":80,"props":165870,"children":165871},{},[165872],{"type":17,"tag":84,"props":165873,"children":165874},{},[165875],{"type":23,"value":145848},{"type":17,"tag":29,"props":165877,"children":165878},{},[165879],{"type":23,"value":165880},"Busy objects are derived from provider free/busy endpoints. They cannot be created or modified.",{"type":17,"tag":29,"props":165882,"children":165883},{},[165884],{"type":23,"value":165885},"There is no separate 'FreeBusy' object — Busy is the normalized representation.",{"type":17,"tag":239,"props":165887,"children":165889},{"id":165888},"_4-link-scheduling-link",[165890],{"type":23,"value":165891},"4. Link (Scheduling Link)",{"type":17,"tag":29,"props":165893,"children":165894},{},[165895],{"type":23,"value":165896},"Represents booking links (e.g., Calendly or Cal.com links).",{"type":17,"tag":29,"props":165898,"children":165899},{},[165900],{"type":17,"tag":48,"props":165901,"children":165902},{},[165903],{"type":23,"value":152723},{"type":17,"tag":80,"props":165905,"children":165906},{},[165907,165915,165923,165931,165940,165948,165957],{"type":17,"tag":84,"props":165908,"children":165909},{},[165910],{"type":17,"tag":6121,"props":165911,"children":165913},{"className":165912},[],[165914],{"type":23,"value":18766},{"type":17,"tag":84,"props":165916,"children":165917},{},[165918],{"type":17,"tag":6121,"props":165919,"children":165921},{"className":165920},[],[165922],{"type":23,"value":18781},{"type":17,"tag":84,"props":165924,"children":165925},{},[165926],{"type":17,"tag":6121,"props":165927,"children":165929},{"className":165928},[],[165930],{"type":23,"value":124783},{"type":17,"tag":84,"props":165932,"children":165933},{},[165934],{"type":17,"tag":6121,"props":165935,"children":165937},{"className":165936},[],[165938],{"type":23,"value":165939},"duration",{"type":17,"tag":84,"props":165941,"children":165942},{},[165943],{"type":17,"tag":6121,"props":165944,"children":165946},{"className":165945},[],[165947],{"type":23,"value":62868},{"type":17,"tag":84,"props":165949,"children":165950},{},[165951],{"type":17,"tag":6121,"props":165952,"children":165954},{"className":165953},[],[165955],{"type":23,"value":165956},"price_amount",{"type":17,"tag":84,"props":165958,"children":165959},{},[165960],{"type":17,"tag":6121,"props":165961,"children":165963},{"className":165962},[],[165964],{"type":23,"value":165965},"price_currency",{"type":17,"tag":29,"props":165967,"children":165968},{},[165969],{"type":17,"tag":48,"props":165970,"children":165971},{},[165972],{"type":23,"value":71599},{"type":17,"tag":80,"props":165974,"children":165975},{},[165976,165980,165984,165988,165992],{"type":17,"tag":84,"props":165977,"children":165978},{},[165979],{"type":23,"value":42125},{"type":17,"tag":84,"props":165981,"children":165982},{},[165983],{"type":23,"value":145784},{"type":17,"tag":84,"props":165985,"children":165986},{},[165987],{"type":23,"value":145789},{"type":17,"tag":84,"props":165989,"children":165990},{},[165991],{"type":23,"value":109982},{"type":17,"tag":84,"props":165993,"children":165994},{},[165995],{"type":23,"value":150952},{"type":17,"tag":29,"props":165997,"children":165998},{},[165999],{"type":23,"value":166000},"A Link defines availability rules and booking metadata.",{"type":17,"tag":29,"props":166002,"children":166003},{},[166004],{"type":23,"value":166005},"It does not represent an actual meeting. An Event is only created after someone books through the link.",{"type":17,"tag":239,"props":166007,"children":166009},{"id":166008},"_5-recording",[166010],{"type":23,"value":166011},"5. Recording",{"type":17,"tag":29,"props":166013,"children":166014},{},[166015],{"type":23,"value":166016},"Represents metadata about a meeting recording.",{"type":17,"tag":29,"props":166018,"children":166019},{},[166020],{"type":17,"tag":48,"props":166021,"children":166022},{},[166023],{"type":23,"value":152723},{"type":17,"tag":80,"props":166025,"children":166026},{},[166027,166035,166043,166051,166059,166067,166075],{"type":17,"tag":84,"props":166028,"children":166029},{},[166030],{"type":17,"tag":6121,"props":166031,"children":166033},{"className":166032},[],[166034],{"type":23,"value":18766},{"type":17,"tag":84,"props":166036,"children":166037},{},[166038],{"type":17,"tag":6121,"props":166039,"children":166041},{"className":166040},[],[166042],{"type":23,"value":74249},{"type":17,"tag":84,"props":166044,"children":166045},{},[166046],{"type":17,"tag":6121,"props":166047,"children":166049},{"className":166048},[],[166050],{"type":23,"value":21051},{"type":17,"tag":84,"props":166052,"children":166053},{},[166054],{"type":17,"tag":6121,"props":166055,"children":166057},{"className":166056},[],[166058],{"type":23,"value":21060},{"type":17,"tag":84,"props":166060,"children":166061},{},[166062],{"type":17,"tag":6121,"props":166063,"children":166065},{"className":166064},[],[166066],{"type":23,"value":77608},{"type":17,"tag":84,"props":166068,"children":166069},{},[166070],{"type":17,"tag":6121,"props":166071,"children":166073},{"className":166072},[],[166074],{"type":23,"value":12107},{"type":17,"tag":84,"props":166076,"children":166077},{},[166078,166083],{"type":17,"tag":6121,"props":166079,"children":166081},{"className":166080},[],[166082],{"type":23,"value":38590},{"type":23,"value":166084}," (recording + transcript descriptors)",{"type":17,"tag":29,"props":166086,"children":166087},{},[166088],{"type":17,"tag":48,"props":166089,"children":166090},{},[166091],{"type":23,"value":71599},{"type":17,"tag":80,"props":166093,"children":166094},{},[166095,166099],{"type":17,"tag":84,"props":166096,"children":166097},{},[166098],{"type":23,"value":145784},{"type":17,"tag":84,"props":166100,"children":166101},{},[166102],{"type":23,"value":145789},{"type":17,"tag":29,"props":166104,"children":166105},{},[166106],{"type":23,"value":166107},"Recordings are read-only. Unified does not store audio, video, or transcript files. It returns metadata and provider-hosted URLs.",{"type":17,"tag":29,"props":166109,"children":166110},{},[166111],{"type":23,"value":166112},"There is no cross-link to Call Center recordings.",{"type":17,"tag":239,"props":166114,"children":166116},{"id":166115},"_6-webinar",[166117],{"type":23,"value":166118},"6. Webinar",{"type":17,"tag":29,"props":166120,"children":166121},{},[166122],{"type":23,"value":166123},"Represents webinar sessions (e.g., Zoom Webinars).",{"type":17,"tag":29,"props":166125,"children":166126},{},[166127],{"type":17,"tag":48,"props":166128,"children":166129},{},[166130],{"type":23,"value":152723},{"type":17,"tag":80,"props":166132,"children":166133},{},[166134,166142,166150,166158,166166,166174,166182,166190,166199,166208,166216,166225],{"type":17,"tag":84,"props":166135,"children":166136},{},[166137],{"type":17,"tag":6121,"props":166138,"children":166140},{"className":166139},[],[166141],{"type":23,"value":18766},{"type":17,"tag":84,"props":166143,"children":166144},{},[166145],{"type":17,"tag":6121,"props":166146,"children":166148},{"className":166147},[],[166149],{"type":23,"value":113801},{"type":17,"tag":84,"props":166151,"children":166152},{},[166153],{"type":17,"tag":6121,"props":166154,"children":166156},{"className":166155},[],[166157],{"type":23,"value":24666},{"type":17,"tag":84,"props":166159,"children":166160},{},[166161],{"type":17,"tag":6121,"props":166162,"children":166164},{"className":166163},[],[166165],{"type":23,"value":21051},{"type":17,"tag":84,"props":166167,"children":166168},{},[166169],{"type":17,"tag":6121,"props":166170,"children":166172},{"className":166171},[],[166173],{"type":23,"value":21060},{"type":17,"tag":84,"props":166175,"children":166176},{},[166177],{"type":17,"tag":6121,"props":166178,"children":166180},{"className":166179},[],[166181],{"type":23,"value":19949},{"type":17,"tag":84,"props":166183,"children":166184},{},[166185],{"type":17,"tag":6121,"props":166186,"children":166188},{"className":166187},[],[166189],{"type":23,"value":114138},{"type":17,"tag":84,"props":166191,"children":166192},{},[166193],{"type":17,"tag":6121,"props":166194,"children":166196},{"className":166195},[],[166197],{"type":23,"value":166198},"panelists",{"type":17,"tag":84,"props":166200,"children":166201},{},[166202],{"type":17,"tag":6121,"props":166203,"children":166205},{"className":166204},[],[166206],{"type":23,"value":166207},"registrants",{"type":17,"tag":84,"props":166209,"children":166210},{},[166211],{"type":17,"tag":6121,"props":166212,"children":166214},{"className":166213},[],[166215],{"type":23,"value":145977},{"type":17,"tag":84,"props":166217,"children":166218},{},[166219],{"type":17,"tag":6121,"props":166220,"children":166222},{"className":166221},[],[166223],{"type":23,"value":166224},"capacity",{"type":17,"tag":84,"props":166226,"children":166227},{},[166228],{"type":17,"tag":6121,"props":166229,"children":166231},{"className":166230},[],[166232],{"type":23,"value":166233},"has_recording",{"type":17,"tag":29,"props":166235,"children":166236},{},[166237],{"type":17,"tag":48,"props":166238,"children":166239},{},[166240],{"type":23,"value":71599},{"type":17,"tag":80,"props":166242,"children":166243},{},[166244,166248,166252,166256,166260],{"type":17,"tag":84,"props":166245,"children":166246},{},[166247],{"type":23,"value":42125},{"type":17,"tag":84,"props":166249,"children":166250},{},[166251],{"type":23,"value":145784},{"type":17,"tag":84,"props":166253,"children":166254},{},[166255],{"type":23,"value":145789},{"type":17,"tag":84,"props":166257,"children":166258},{},[166259],{"type":23,"value":109982},{"type":17,"tag":84,"props":166261,"children":166262},{},[166263],{"type":23,"value":150952},{"type":17,"tag":29,"props":166265,"children":166266},{},[166267],{"type":23,"value":166268},"Webinars differ from events in structure and scale. They include panelists, registrants, registration requirements, and optional Q&A/polling features.",{"type":17,"tag":29,"props":166270,"children":166271},{},[166272],{"type":23,"value":166273},"They do not reference CRM contacts or storage files.",{"type":17,"tag":68,"props":166275,"children":166277},{"id":166276},"recurrence-instance-behavior",[166278],{"type":23,"value":166279},"Recurrence & Instance Behavior",{"type":17,"tag":29,"props":166281,"children":166282},{},[166283],{"type":23,"value":166284},"Recurring events are handled differently by each provider, but Unified normalizes the structure.",{"type":17,"tag":239,"props":166286,"children":166288},{"id":166287},"google-calendar",[166289],{"type":23,"value":13669},{"type":17,"tag":80,"props":166291,"children":166292},{},[166293,166304,166315,166320],{"type":17,"tag":84,"props":166294,"children":166295},{},[166296,166302],{"type":17,"tag":6121,"props":166297,"children":166299},{"className":166298},[],[166300],{"type":23,"value":166301},"recurringEventId",{"type":23,"value":166303}," links instances to the series master",{"type":17,"tag":84,"props":166305,"children":166306},{},[166307,166313],{"type":17,"tag":6121,"props":166308,"children":166310},{"className":166309},[],[166311],{"type":23,"value":166312},"originalStartTime",{"type":23,"value":166314}," identifies an occurrence",{"type":17,"tag":84,"props":166316,"children":166317},{},[166318],{"type":23,"value":166319},"Updating one instance requires patching the instance ID",{"type":17,"tag":84,"props":166321,"children":166322},{},[166323],{"type":23,"value":166324},"Updating 'this and following' requires splitting the series",{"type":17,"tag":29,"props":166326,"children":166327},{},[166328],{"type":23,"value":166329},"Canceled events return minimal stubs and eventually disappear.",{"type":17,"tag":239,"props":166331,"children":166333},{"id":166332},"microsoft-graph-outlook",[166334],{"type":23,"value":166335},"Microsoft Graph (Outlook)",{"type":17,"tag":80,"props":166337,"children":166338},{},[166339,166344,166355,166368],{"type":17,"tag":84,"props":166340,"children":166341},{},[166342],{"type":23,"value":166343},"Series master and occurrence objects are separate",{"type":17,"tag":84,"props":166345,"children":166346},{},[166347,166353],{"type":17,"tag":6121,"props":166348,"children":166350},{"className":166349},[],[166351],{"type":23,"value":166352},"seriesMasterId",{"type":23,"value":166354}," links occurrences to the master",{"type":17,"tag":84,"props":166356,"children":166357},{},[166358,166360,166366],{"type":23,"value":166359},"Deletions appear as ",{"type":17,"tag":6121,"props":166361,"children":166363},{"className":166362},[],[166364],{"type":23,"value":166365},"@removed",{"type":23,"value":166367}," entries in delta queries",{"type":17,"tag":84,"props":166369,"children":166370},{},[166371],{"type":23,"value":166372},"Single-instance edits may not trigger distinct notifications",{"type":17,"tag":29,"props":166374,"children":166375},{},[166376],{"type":23,"value":166377},"Developers must reconcile instance changes carefully.",{"type":17,"tag":239,"props":166379,"children":166381},{"id":166380},"zoom-meetings",[166382],{"type":23,"value":166383},"Zoom Meetings",{"type":17,"tag":80,"props":166385,"children":166386},{},[166387,166392,166403,166413],{"type":17,"tag":84,"props":166388,"children":166389},{},[166390],{"type":23,"value":166391},"Recurrence is defined at creation",{"type":17,"tag":84,"props":166393,"children":166394},{},[166395,166397],{"type":23,"value":166396},"Occurrences are referenced by ",{"type":17,"tag":6121,"props":166398,"children":166400},{"className":166399},[],[166401],{"type":23,"value":166402},"occurrence_id",{"type":17,"tag":84,"props":166404,"children":166405},{},[166406,166408],{"type":23,"value":166407},"Deleting one occurrence requires passing ",{"type":17,"tag":6121,"props":166409,"children":166411},{"className":166410},[],[166412],{"type":23,"value":166402},{"type":17,"tag":84,"props":166414,"children":166415},{},[166416],{"type":23,"value":166417},"Meeting IDs expire (30 days for non-recurring, 365 days for recurring)",{"type":17,"tag":29,"props":166419,"children":166420},{},[166421],{"type":23,"value":166422},"Zoom does not expose a 'completed' meeting state via API.",{"type":17,"tag":68,"props":166424,"children":166426},{"id":166425},"real-time-updates-native-vs-virtual-webhooks",[166427],{"type":23,"value":166428},"Real-Time Updates: Native vs Virtual Webhooks",{"type":17,"tag":29,"props":166430,"children":166431},{},[166432],{"type":23,"value":166433},"Calendar systems differ widely in event delivery support.",{"type":17,"tag":239,"props":166435,"children":166436},{"id":9021},[166437],{"type":23,"value":164707},{"type":17,"tag":29,"props":166439,"children":166440},{},[166441],{"type":23,"value":166442},"Available for:",{"type":17,"tag":80,"props":166444,"children":166445},{},[166446,166458,166463,166468,166473],{"type":17,"tag":84,"props":166447,"children":166448},{},[166449,166451,166457],{"type":23,"value":166450},"Google Calendar (",{"type":17,"tag":6121,"props":166452,"children":166454},{"className":166453},[],[166455],{"type":23,"value":166456},"events.watch",{"type":23,"value":12034},{"type":17,"tag":84,"props":166459,"children":166460},{},[166461],{"type":23,"value":166462},"Microsoft Graph change notifications",{"type":17,"tag":84,"props":166464,"children":166465},{},[166466],{"type":23,"value":166467},"Zoom meeting/webinar events",{"type":17,"tag":84,"props":166469,"children":166470},{},[166471],{"type":23,"value":166472},"Calendly invitee events",{"type":17,"tag":84,"props":166474,"children":166475},{},[166476],{"type":23,"value":166477},"Cal.com booking lifecycle events",{"type":17,"tag":29,"props":166479,"children":166480},{},[166481,166482,166486],{"type":23,"value":119374},{"type":17,"tag":133,"props":166483,"children":166484},{"href":4999},[166485],{"type":23,"value":5002},{"type":23,"value":166487}," deliver:",{"type":17,"tag":80,"props":166489,"children":166490},{},[166491,166496,166501,166506,166511],{"type":17,"tag":84,"props":166492,"children":166493},{},[166494],{"type":23,"value":166495},"Created",{"type":17,"tag":84,"props":166497,"children":166498},{},[166499],{"type":23,"value":166500},"Updated",{"type":17,"tag":84,"props":166502,"children":166503},{},[166504],{"type":23,"value":166505},"Deleted",{"type":17,"tag":84,"props":166507,"children":166508},{},[166509],{"type":23,"value":166510},"Started / Ended (Zoom, Cal.com)",{"type":17,"tag":84,"props":166512,"children":166513},{},[166514],{"type":23,"value":166515},"Recording completed",{"type":17,"tag":29,"props":166517,"children":166518},{},[166519],{"type":23,"value":166520},"These are true push events from the provider.",{"type":17,"tag":239,"props":166522,"children":166524},{"id":166523},"virtual-webhooks-polling",[166525],{"type":23,"value":166526},"Virtual Webhooks (Polling)",{"type":17,"tag":29,"props":166528,"children":166529},{},[166530],{"type":23,"value":166531},"Used when providers lack push notifications.",{"type":17,"tag":29,"props":166533,"children":166534},{},[166535],{"type":23,"value":166536},"Unified polls:",{"type":17,"tag":80,"props":166538,"children":166539},{},[166540,166553,166558],{"type":17,"tag":84,"props":166541,"children":166542},{},[166543,166545,166551],{"type":23,"value":166544},"Event lists (using ",{"type":17,"tag":6121,"props":166546,"children":166548},{"className":166547},[],[166549],{"type":23,"value":166550},"updatedMin",{"type":23,"value":166552},", delta tokens, etc.)",{"type":17,"tag":84,"props":166554,"children":166555},{},[166556],{"type":23,"value":166557},"Free/busy endpoints",{"type":17,"tag":84,"props":166559,"children":166560},{},[166561],{"type":23,"value":166562},"Booking endpoints",{"type":17,"tag":29,"props":166564,"children":166565},{},[166566,166570],{"type":17,"tag":133,"props":166567,"children":166568},{"href":9007},[166569],{"type":23,"value":9256},{"type":23,"value":20456},{"type":17,"tag":80,"props":166572,"children":166573},{},[166574,166579,166584,166589],{"type":17,"tag":84,"props":166575,"children":166576},{},[166577],{"type":23,"value":166578},"Support created and updated events",{"type":17,"tag":84,"props":166580,"children":166581},{},[166582],{"type":23,"value":166583},"Do not emit deletion events unless provider supports them",{"type":17,"tag":84,"props":166585,"children":166586},{},[166587],{"type":23,"value":166588},"Respect rate limits",{"type":17,"tag":84,"props":166590,"children":166591},{},[166592],{"type":23,"value":166593},"Can be configured by interval",{"type":17,"tag":29,"props":166595,"children":166596},{},[166597],{"type":23,"value":166598},"Deletion detection often requires full list reconciliation.",{"type":17,"tag":68,"props":166600,"children":166602},{"id":166601},"identity-cross-category-isolation",[166603],{"type":23,"value":166604},"Identity & Cross-Category Isolation",{"type":17,"tag":29,"props":166606,"children":166607},{},[166608],{"type":23,"value":166609},"Calendar objects are isolated from other Unified categories.",{"type":17,"tag":29,"props":166611,"children":166612},{},[166613],{"type":23,"value":166614},"There are:",{"type":17,"tag":80,"props":166616,"children":166617},{},[166618,166623,166628,166633,166638],{"type":17,"tag":84,"props":166619,"children":166620},{},[166621],{"type":23,"value":166622},"No CRM contact IDs",{"type":17,"tag":84,"props":166624,"children":166625},{},[166626],{"type":23,"value":166627},"No Ticketing IDs",{"type":17,"tag":84,"props":166629,"children":166630},{},[166631],{"type":23,"value":166632},"No StorageFile references",{"type":17,"tag":84,"props":166634,"children":166635},{},[166636],{"type":23,"value":166637},"No Repository IDs",{"type":17,"tag":84,"props":166639,"children":166640},{},[166641],{"type":23,"value":166642},"No GenAI model references",{"type":17,"tag":29,"props":166644,"children":166645},{},[166646],{"type":23,"value":166647},"Organizer and attendee objects contain:",{"type":17,"tag":80,"props":166649,"children":166650},{},[166651,166659],{"type":17,"tag":84,"props":166652,"children":166653},{},[166654],{"type":17,"tag":6121,"props":166655,"children":166657},{"className":166656},[],[166658],{"type":23,"value":18781},{"type":17,"tag":84,"props":166660,"children":166661},{},[166662],{"type":17,"tag":6121,"props":166663,"children":166665},{"className":166664},[],[166666],{"type":23,"value":62666},{"type":17,"tag":29,"props":166668,"children":166669},{},[166670],{"type":23,"value":166671},"They are not linked to CRM or HR records.",{"type":17,"tag":29,"props":166673,"children":166674},{},[166675],{"type":23,"value":166676},"Recording objects include:",{"type":17,"tag":80,"props":166678,"children":166679},{},[166680,166688],{"type":17,"tag":84,"props":166681,"children":166682},{},[166683],{"type":17,"tag":6121,"props":166684,"children":166686},{"className":166685},[],[166687],{"type":23,"value":74249},{"type":17,"tag":84,"props":166689,"children":166690},{},[166691],{"type":23,"value":166692},"provider-hosted URLs",{"type":17,"tag":29,"props":166694,"children":166695},{},[166696],{"type":23,"value":166697},"They are not Storage API objects.",{"type":17,"tag":29,"props":166699,"children":166700},{},[166701,166703,166709],{"type":23,"value":166702},"Unified may transform provider IDs internally. If the exact upstream identifier is needed, it is available in ",{"type":17,"tag":6121,"props":166704,"children":166706},{"className":166705},[],[166707],{"type":23,"value":166708},"raw.__id",{"type":23,"value":54},{"type":17,"tag":29,"props":166711,"children":166712},{},[166713,166715,166721],{"type":23,"value":166714},"The combination of ",{"type":17,"tag":6121,"props":166716,"children":166718},{"className":166717},[],[166719],{"type":23,"value":166720},"connection_id + id",{"type":23,"value":166722}," uniquely identifies a calendar object.",{"type":17,"tag":68,"props":166724,"children":166726},{"id":166725},"security-data-handling",[166727],{"type":23,"value":166728},"Security & Data Handling",{"type":17,"tag":29,"props":166730,"children":166731},{},[166732],{"type":23,"value":166733},"Unified operates under a zero-storage model.",{"type":17,"tag":239,"props":166735,"children":166737},{"id":166736},"what-that-means",[166738],{"type":23,"value":166739},"What that means",{"type":17,"tag":80,"props":166741,"children":166742},{},[166743,166748,166753,166758,166763],{"type":17,"tag":84,"props":166744,"children":166745},{},[166746],{"type":23,"value":166747},"No calendar data is stored at rest",{"type":17,"tag":84,"props":166749,"children":166750},{},[166751],{"type":23,"value":166752},"No event bodies are written to logs",{"type":17,"tag":84,"props":166754,"children":166755},{},[166756],{"type":23,"value":166757},"No transcripts are cached",{"type":17,"tag":84,"props":166759,"children":166760},{},[166761],{"type":23,"value":166762},"No meeting media is stored",{"type":17,"tag":84,"props":166764,"children":166765},{},[166766],{"type":23,"value":166767},"No attendee data is persisted",{"type":17,"tag":29,"props":166769,"children":166770},{},[166771],{"type":23,"value":166772},"All requests are:",{"type":17,"tag":80,"props":166774,"children":166775},{},[166776,166781,166786,166791],{"type":17,"tag":84,"props":166777,"children":166778},{},[166779],{"type":23,"value":166780},"Encrypted in transit (TLS 1.2+)",{"type":17,"tag":84,"props":166782,"children":166783},{},[166784],{"type":23,"value":166785},"Operational metadata encrypted at rest (AES-256)",{"type":17,"tag":84,"props":166787,"children":166788},{},[166789],{"type":23,"value":166790},"Scoped to region (US / EU / AU)",{"type":17,"tag":84,"props":166792,"children":166793},{},[166794],{"type":23,"value":166795},"Executed in memory only",{"type":17,"tag":29,"props":166797,"children":166798},{},[166799],{"type":23,"value":166800},"Customers may use:",{"type":17,"tag":80,"props":166802,"children":166803},{},[166804,166809,166814,166819],{"type":17,"tag":84,"props":166805,"children":166806},{},[166807],{"type":23,"value":166808},"SAML / OIDC SSO",{"type":17,"tag":84,"props":166810,"children":166811},{},[166812],{"type":23,"value":166813},"IP allow-listing",{"type":17,"tag":84,"props":166815,"children":166816},{},[166817],{"type":23,"value":166818},"Environment-scoped API keys",{"type":17,"tag":84,"props":166820,"children":166821},{},[166822],{"type":23,"value":166823},"Bring-your-own secrets vault",{"type":17,"tag":29,"props":166825,"children":166826},{},[166827],{"type":23,"value":166828},"Unified is SOC 2 Type II certified and positions itself for GDPR, CCPA/CPRA, HIPAA and PIPEDA alignment.",{"type":17,"tag":68,"props":166830,"children":166831},{"id":95759},[166832],{"type":23,"value":95762},{"type":17,"tag":29,"props":166834,"children":166835},{},[166836],{"type":17,"tag":48,"props":166837,"children":166838},{},[166839],{"type":23,"value":166840},"What's the difference between Free/Busy and Events?",{"type":17,"tag":29,"props":166842,"children":166843},{},[166844],{"type":23,"value":166845},"Busy returns minimal availability blocks. Event returns full meeting objects. Busy is read-only. Events support full lifecycle management.",{"type":17,"tag":29,"props":166847,"children":166848},{},[166849],{"type":17,"tag":48,"props":166850,"children":166851},{},[166852],{"type":23,"value":166853},"How does a booking link differ from an event?",{"type":17,"tag":29,"props":166855,"children":166856},{},[166857],{"type":23,"value":166858},"A Link defines availability rules and a shareable booking URL. An Event represents a confirmed meeting. A booking link does not create an event until someone selects a time.",{"type":17,"tag":29,"props":166860,"children":166861},{},[166862],{"type":17,"tag":48,"props":166863,"children":166864},{},[166865],{"type":23,"value":166866},"How is a webinar different from an event?",{"type":17,"tag":29,"props":166868,"children":166869},{},[166870],{"type":23,"value":166871},"Events are typically interactive meetings. Webinars are broadcast-oriented sessions with registrants and panelists. Webinars include join URLs, passwords, capacity controls, and optional Q&A/polls.",{"type":17,"tag":29,"props":166873,"children":166874},{},[166875],{"type":17,"tag":48,"props":166876,"children":166877},{},[166878],{"type":23,"value":166879},"Does Unified store recordings or transcripts?",{"type":17,"tag":29,"props":166881,"children":166882},{},[166883],{"type":23,"value":166884},"No. Recording objects return metadata and provider URLs only. Media remains hosted by the meeting provider.",{"type":17,"tag":29,"props":166886,"children":166887},{},[166888],{"type":17,"tag":48,"props":166889,"children":166890},{},[166891],{"type":23,"value":166892},"Can I sync Google and Outlook calendars?",{"type":17,"tag":29,"props":166894,"children":166895},{},[166896],{"type":23,"value":166897},"Yes. Unified normalizes both platforms. You can:",{"type":17,"tag":80,"props":166899,"children":166900},{},[166901,166905,166909,166914,166919],{"type":17,"tag":84,"props":166902,"children":166903},{},[166904],{"type":23,"value":97607},{"type":17,"tag":84,"props":166906,"children":166907},{},[166908],{"type":23,"value":145577},{"type":17,"tag":84,"props":166910,"children":166911},{},[166912],{"type":23,"value":166913},"Update events",{"type":17,"tag":84,"props":166915,"children":166916},{},[166917],{"type":23,"value":166918},"Delete events",{"type":17,"tag":84,"props":166920,"children":166921},{},[166922],{"type":23,"value":166923},"Subscribe to changes",{"type":17,"tag":29,"props":166925,"children":166926},{},[166927],{"type":23,"value":166928},"Across both providers using one schema.",{"type":17,"tag":29,"props":166930,"children":166931},{},[166932],{"type":17,"tag":48,"props":166933,"children":166934},{},[166935],{"type":23,"value":166936},"Can I feed meeting transcripts into AI?",{"type":17,"tag":29,"props":166938,"children":166939},{},[166940],{"type":23,"value":166941},"Yes. Use the Calendar Recording object to retrieve transcript metadata, then send transcript text into the GenAI API for summarization or embedding. Calendar does not run inference itself.",{"type":17,"tag":68,"props":166943,"children":166945},{"id":166944},"build-scheduling-features-without-owning-calendar-complexity",[166946],{"type":23,"value":166947},"Build Scheduling Features Without Owning Calendar Complexity",{"type":17,"tag":29,"props":166949,"children":166950},{},[166951],{"type":23,"value":166952},"Calendar systems are deceptively complex:",{"type":17,"tag":80,"props":166954,"children":166955},{},[166956,166961,166966,166971,166976,166981],{"type":17,"tag":84,"props":166957,"children":166958},{},[166959],{"type":23,"value":166960},"Recurring instance edits",{"type":17,"tag":84,"props":166962,"children":166963},{},[166964],{"type":23,"value":166965},"Conference link immutability",{"type":17,"tag":84,"props":166967,"children":166968},{},[166969],{"type":23,"value":166970},"Deletion semantics",{"type":17,"tag":84,"props":166972,"children":166973},{},[166974],{"type":23,"value":166975},"Provider-specific lifecycle states",{"type":17,"tag":84,"props":166977,"children":166978},{},[166979],{"type":23,"value":166980},"Recording retention policies",{"type":17,"tag":84,"props":166982,"children":166983},{},[166984],{"type":23,"value":166985},"Busy polling vs push updates",{"type":17,"tag":29,"props":166987,"children":166988},{},[166989],{"type":23,"value":166990},"Unified abstracts this into:",{"type":17,"tag":80,"props":166992,"children":166993},{},[166994,166999,167004,167009],{"type":17,"tag":84,"props":166995,"children":166996},{},[166997],{"type":23,"value":166998},"One event model",{"type":17,"tag":84,"props":167000,"children":167001},{},[167002],{"type":23,"value":167003},"One free/busy object",{"type":17,"tag":84,"props":167005,"children":167006},{},[167007],{"type":23,"value":167008},"One recording object",{"type":17,"tag":84,"props":167010,"children":167011},{},[167012],{"type":23,"value":167013},"One webhook interface",{"type":17,"tag":29,"props":167015,"children":167016},{},[167017],{"type":23,"value":167018},"All real-time. All pass-through. No storage layer.",{"type":17,"tag":29,"props":167020,"children":167021},{},[167022],{"type":23,"value":167023},"If your product needs:",{"type":17,"tag":80,"props":167025,"children":167026},{},[167027,167032,167037,167042,167047,167052,167057],{"type":17,"tag":84,"props":167028,"children":167029},{},[167030],{"type":23,"value":167031},"Cross-platform scheduling",{"type":17,"tag":84,"props":167033,"children":167034},{},[167035],{"type":23,"value":167036},"Real-time availability checks",{"type":17,"tag":84,"props":167038,"children":167039},{},[167040],{"type":23,"value":167041},"Calendar sync",{"type":17,"tag":84,"props":167043,"children":167044},{},[167045],{"type":23,"value":167046},"Booking links",{"type":17,"tag":84,"props":167048,"children":167049},{},[167050],{"type":23,"value":167051},"Meeting recording retrieval",{"type":17,"tag":84,"props":167053,"children":167054},{},[167055],{"type":23,"value":167056},"Webinar creation",{"type":17,"tag":84,"props":167058,"children":167059},{},[167060],{"type":23,"value":167061},"Or AI-powered meeting workflows",{"type":17,"tag":29,"props":167063,"children":167064},{},[167065],{"type":23,"value":167066},"You can build it once.",{"type":17,"tag":29,"props":167068,"children":167069},{},[167070],{"type":17,"tag":133,"props":167071,"children":167073},{"href":1612,"rel":167072},[214],[167074],{"type":23,"value":44481},{"type":17,"tag":29,"props":167076,"children":167077},{},[167078],{"type":17,"tag":133,"props":167079,"children":167081},{"href":1623,"rel":167080},[214],[167082],{"type":23,"value":44490},{"title":7,"searchDepth":1629,"depth":1629,"links":167084},[167085,167086,167094,167099,167103,167104,167107,167108],{"id":165356,"depth":1629,"text":165359},{"id":165471,"depth":1629,"text":165474,"children":167087},[167088,167089,167090,167091,167092,167093],{"id":165482,"depth":1635,"text":165485},{"id":165587,"depth":1635,"text":165590},{"id":165803,"depth":1635,"text":165806},{"id":165888,"depth":1635,"text":165891},{"id":166008,"depth":1635,"text":166011},{"id":166115,"depth":1635,"text":166118},{"id":166276,"depth":1629,"text":166279,"children":167095},[167096,167097,167098],{"id":166287,"depth":1635,"text":13669},{"id":166332,"depth":1635,"text":166335},{"id":166380,"depth":1635,"text":166383},{"id":166425,"depth":1629,"text":166428,"children":167100},[167101,167102],{"id":9021,"depth":1635,"text":164707},{"id":166523,"depth":1635,"text":166526},{"id":166601,"depth":1629,"text":166604},{"id":166725,"depth":1629,"text":166728,"children":167105},[167106],{"id":166736,"depth":1635,"text":166739},{"id":95759,"depth":1629,"text":95762},{"id":166944,"depth":1629,"text":166947},"content:blog:calendar_api_integration_real_time_events_free_busy_scheduling_links_and_meeting_recordings_across_platforms.md","blog/calendar_api_integration_real_time_events_free_busy_scheduling_links_and_meeting_recordings_across_platforms.md","blog/calendar_api_integration_real_time_events_free_busy_scheduling_links_and_meeting_recordings_across_platforms",{"_path":167113,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":167114,"description":167115,"img":167116,"date":167117,"tag":12,"body":167118,"_type":1677,"_id":167849,"_source":1679,"_file":167850,"_stem":167851,"_extension":1682},"/blog/messaging_api_integration_real_time_channels_messages_threads_and_events_across_platforms","Messaging API Integration: Real-Time Channels, Messages, Threads, and Events Across Platforms","Messaging tools are where decisions get made and where customer context shows up first. Channels change, threads branch, reactions and button clicks carry...","https://s3.us-east-2.amazonaws.com/unified-article-images/messaging_api_integration_real_time_channels_messages_threads_and_events_across_platforms-icon.png","2026-02-12T21:03:00.000Z",{"type":14,"children":167119,"toc":167821},[167120,167125,167128,167135,167140,167149,167154,167160,167165,167170,167175,167180,167185,167190,167195,167200,167205,167210,167215,167220,167225,167230,167235,167240,167245,167251,167256,167261,167270,167280,167285,167290,167295,167300,167306,167312,167317,167323,167328,167333,167338,167343,167348,167354,167359,167364,167369,167373,167378,167383,167388,167393,167398,167403,167407,167412,167416,167420,167425,167430,167435,167440,167445,167450,167455,167459,167464,167469,167474,167479,167484,167489,167494,167500,167505,167510,167515,167520,167525,167530,167536,167541,167546,167552,167557,167562,167566,167571,167576,167581,167586,167591,167596,167601,167606,167612,167618,167623,167629,167634,167640,167645,167651,167656,167662,167667,167671,167676,167681,167686,167691,167696,167701,167706,167712,167717,167722,167731,167740,167744,167751,167756,167764,167769,167777,167782,167790,167795,167803,167808,167816],{"type":17,"tag":18,"props":167121,"children":167123},{"id":167122},"messaging-api-integration-real-time-channels-messages-threads-and-events-across-platforms",[167124],{"type":23,"value":167114},{"type":17,"tag":25,"props":167126,"children":167127},{},[],{"type":17,"tag":29,"props":167129,"children":167130},{},[167131],{"type":17,"tag":33,"props":167132,"children":167133},{},[167134],{"type":23,"value":165325},{"type":17,"tag":29,"props":167136,"children":167137},{},[167138],{"type":23,"value":167139},"Messaging tools are where decisions get made and where customer context shows up first. Channels change, threads branch, reactions and button clicks carry intent, and attachments move alongside the conversation. When messaging data is stitched together with polling loops or platform-specific logic, bots miss events, threading breaks, and teams end up with inconsistent behavior across Slack, Teams, email, and community platforms.",{"type":17,"tag":29,"props":167141,"children":167142},{},[167143,167147],{"type":17,"tag":133,"props":167144,"children":167145},{"href":14913},[167146],{"type":23,"value":27356},{"type":23,"value":167148}," integration exists to solve that problem.",{"type":17,"tag":29,"props":167150,"children":167151},{},[167152],{"type":23,"value":167153},"In this guide, we'll explain what a Messaging API covers, which objects matter in practice, how threads work, how updates are delivered, and how Unified's Messaging API fits alongside Ticketing, Call Center, KMS, Storage, and GenAI in the broader platform.",{"type":17,"tag":68,"props":167155,"children":167157},{"id":167156},"introduction-to-messaging-api-integrations",[167158],{"type":23,"value":167159},"Introduction to Messaging API Integrations",{"type":17,"tag":29,"props":167161,"children":167162},{},[167163],{"type":23,"value":167164},"Messaging platforms such as Slack, Microsoft Teams, Discord, Gmail, Outlook, IMAP mailboxes, Intercom, and community tools expose very different models:",{"type":17,"tag":29,"props":167166,"children":167167},{},[167168],{"type":23,"value":167169},"Some are channel-based chat, some are email-style conversations, some have rich interactive events, and some have limited change notifications.",{"type":17,"tag":29,"props":167171,"children":167172},{},[167173],{"type":23,"value":167174},"Products that need to support multiple providers quickly run into:",{"type":17,"tag":29,"props":167176,"children":167177},{},[167178],{"type":23,"value":167179},"Inconsistent threading and reply mechanics",{"type":17,"tag":29,"props":167181,"children":167182},{},[167183],{"type":23,"value":167184},"Different event and webhook behavior across platforms",{"type":17,"tag":29,"props":167186,"children":167187},{},[167188],{"type":23,"value":167189},"Different message formats (plain text, HTML, markdown)",{"type":17,"tag":29,"props":167191,"children":167192},{},[167193],{"type":23,"value":167194},"Attachments that require separate handling and access control",{"type":17,"tag":29,"props":167196,"children":167197},{},[167198],{"type":23,"value":167199},"A Messaging API provides a consistent way to read and write communication data across providers without building and maintaining separate implementations per platform.",{"type":17,"tag":68,"props":167201,"children":167202},{"id":14903},[167203],{"type":23,"value":167204},"What Is a Messaging API?",{"type":17,"tag":29,"props":167206,"children":167207},{},[167208],{"type":23,"value":167209},"A Messaging API allows applications to programmatically access and manage communication data.",{"type":17,"tag":29,"props":167211,"children":167212},{},[167213],{"type":23,"value":167214},"In practice, this includes:",{"type":17,"tag":29,"props":167216,"children":167217},{},[167218],{"type":23,"value":167219},"Listing and retrieving channels or conversation containers",{"type":17,"tag":29,"props":167221,"children":167222},{},[167223],{"type":23,"value":167224},"Reading messages and thread structures",{"type":17,"tag":29,"props":167226,"children":167227},{},[167228],{"type":23,"value":167229},"Sending messages and replies",{"type":17,"tag":29,"props":167231,"children":167232},{},[167233],{"type":23,"value":167234},"Updating messages where the provider allows edits",{"type":17,"tag":29,"props":167236,"children":167237},{},[167238],{"type":23,"value":167239},"Receiving interaction events (reactions, mentions, button clicks) where supported",{"type":17,"tag":29,"props":167241,"children":167242},{},[167243],{"type":23,"value":167244},"Messaging APIs focus on conversation data and interaction signals. They are not support-ticket systems, telephony APIs, knowledge bases, file drives, or model-inference endpoints.",{"type":17,"tag":68,"props":167246,"children":167248},{"id":167247},"messaging-api-vs-ticketing-call-center-kms-storage-and-genai",[167249],{"type":23,"value":167250},"Messaging API vs Ticketing, Call Center, KMS, Storage, and GenAI",{"type":17,"tag":29,"props":167252,"children":167253},{},[167254],{"type":23,"value":167255},"Unified treats Messaging as its own category with clear boundaries.",{"type":17,"tag":29,"props":167257,"children":167258},{},[167259],{"type":23,"value":167260},"Messaging API: channels, messages, and interaction events.",{"type":17,"tag":29,"props":167262,"children":167263},{},[167264,167268],{"type":17,"tag":133,"props":167265,"children":167266},{"href":31987},[167267],{"type":23,"value":150656},{"type":23,"value":167269},": tickets, customers, notes, and categories.",{"type":17,"tag":29,"props":167271,"children":167272},{},[167273,167278],{"type":17,"tag":133,"props":167274,"children":167275},{"href":30386},[167276],{"type":23,"value":167277},"Call Center API",{"type":23,"value":167279},": calls, call contacts, call notes, and recordings.",{"type":17,"tag":29,"props":167281,"children":167282},{},[167283],{"type":23,"value":167284},"KMS API: spaces, pages, and comments for knowledge content.",{"type":17,"tag":29,"props":167286,"children":167287},{},[167288],{"type":23,"value":167289},"Storage API: files and folders across cloud drives.",{"type":17,"tag":29,"props":167291,"children":167292},{},[167293],{"type":23,"value":167294},"GenAI API: models, prompts, and embeddings.",{"type":17,"tag":29,"props":167296,"children":167297},{},[167298],{"type":23,"value":167299},"Messaging data can feed those other categories (for example, creating a ticket from a message, or summarizing a thread using a model), but those actions are handled explicitly by your application using the appropriate APIs.",{"type":17,"tag":68,"props":167301,"children":167303},{"id":167302},"real-time-vs-polling-in-messaging-platforms",[167304],{"type":23,"value":167305},"Real-Time vs Polling in Messaging Platforms",{"type":17,"tag":239,"props":167307,"children":167309},{"id":167308},"live-access-to-source-providers",[167310],{"type":23,"value":167311},"Live Access to Source Providers",{"type":17,"tag":29,"props":167313,"children":167314},{},[167315],{"type":23,"value":167316},"Unified's Messaging API sends every request to the connected provider at request time. There is no cached replica. Reads reflect the provider's current state, subject to provider rate limits and availability.",{"type":17,"tag":239,"props":167318,"children":167320},{"id":167319},"updates-webhooks-and-provider-reality",[167321],{"type":23,"value":167322},"Updates: Webhooks and Provider Reality",{"type":17,"tag":29,"props":167324,"children":167325},{},[167326],{"type":23,"value":167327},"Update delivery varies by provider and by object:",{"type":17,"tag":29,"props":167329,"children":167330},{},[167331],{"type":23,"value":167332},"Some providers deliver rich, immediate event notifications.",{"type":17,"tag":29,"props":167334,"children":167335},{},[167336],{"type":23,"value":167337},"Some providers only support 'new message' notifications.",{"type":17,"tag":29,"props":167339,"children":167340},{},[167341],{"type":23,"value":167342},"Some providers rely on scheduled checks behind the scenes.",{"type":17,"tag":29,"props":167344,"children":167345},{},[167346],{"type":23,"value":167347},"Unified supports provider-native webhook delivery where available and scheduled change detection where it isn't. For providers where deletion events are not delivered, delete handling must be based on provider behavior and your own reconciliation logic.",{"type":17,"tag":68,"props":167349,"children":167351},{"id":167350},"core-messaging-data-models",[167352],{"type":23,"value":167353},"Core Messaging Data Models",{"type":17,"tag":29,"props":167355,"children":167356},{},[167357],{"type":23,"value":167358},"Unified standardizes messaging data into three objects.",{"type":17,"tag":239,"props":167360,"children":167361},{"id":33459},[167362],{"type":23,"value":167363},"Channels",{"type":17,"tag":29,"props":167365,"children":167366},{},[167367],{"type":23,"value":167368},"Channels represent rooms, groups, inbox-like containers, or conversation spaces.",{"type":17,"tag":29,"props":167370,"children":167371},{},[167372],{"type":23,"value":62324},{"type":17,"tag":29,"props":167374,"children":167375},{},[167376],{"type":23,"value":167377},"id, created_at, updated_at",{"type":17,"tag":29,"props":167379,"children":167380},{},[167381],{"type":23,"value":167382},"name, description",{"type":17,"tag":29,"props":167384,"children":167385},{},[167386],{"type":23,"value":167387},"parent_id for hierarchical channel structures",{"type":17,"tag":29,"props":167389,"children":167390},{},[167391],{"type":23,"value":167392},"has_subchannels",{"type":17,"tag":29,"props":167394,"children":167395},{},[167396],{"type":23,"value":167397},"members, is_active, is_private, web_url",{"type":17,"tag":29,"props":167399,"children":167400},{},[167401],{"type":23,"value":167402},"Channels are generally read-only through the API. Providers own channel creation and configuration.",{"type":17,"tag":239,"props":167404,"children":167405},{"id":137672},[167406],{"type":23,"value":148609},{"type":17,"tag":29,"props":167408,"children":167409},{},[167410],{"type":23,"value":167411},"Messages are the main unit of communication.",{"type":17,"tag":29,"props":167413,"children":167414},{},[167415],{"type":23,"value":163963},{"type":17,"tag":29,"props":167417,"children":167418},{},[167419],{"type":23,"value":167377},{"type":17,"tag":29,"props":167421,"children":167422},{},[167423],{"type":23,"value":167424},"channels (destination containers)",{"type":17,"tag":29,"props":167426,"children":167427},{},[167428],{"type":23,"value":167429},"subject and message bodies (plain text plus formatted variants)",{"type":17,"tag":29,"props":167431,"children":167432},{},[167433],{"type":23,"value":167434},"mentioned members, destination members, and hidden members (email-style recipients)",{"type":17,"tag":29,"props":167436,"children":167437},{},[167438],{"type":23,"value":167439},"reactions, attachments, buttons",{"type":17,"tag":29,"props":167441,"children":167442},{},[167443],{"type":23,"value":167444},"web_url, reference",{"type":17,"tag":29,"props":167446,"children":167447},{},[167448],{"type":23,"value":167449},"has_children and is_unread where supported",{"type":17,"tag":29,"props":167451,"children":167452},{},[167453],{"type":23,"value":167454},"Messages support create, list, retrieve, update, and remove operations depending on provider capability.",{"type":17,"tag":239,"props":167456,"children":167457},{"id":99198},[167458],{"type":23,"value":63118},{"type":17,"tag":29,"props":167460,"children":167461},{},[167462],{"type":23,"value":167463},"Events represent interaction signals and activity notifications.",{"type":17,"tag":29,"props":167465,"children":167466},{},[167467],{"type":23,"value":167468},"Events typically include:",{"type":17,"tag":29,"props":167470,"children":167471},{},[167472],{"type":23,"value":167473},"type (such as message received, reaction added/removed, app mention, button click)",{"type":17,"tag":29,"props":167475,"children":167476},{},[167477],{"type":23,"value":167478},"channel context",{"type":17,"tag":29,"props":167480,"children":167481},{},[167482],{"type":23,"value":167483},"message context",{"type":17,"tag":29,"props":167485,"children":167486},{},[167487],{"type":23,"value":167488},"the user who triggered the event",{"type":17,"tag":29,"props":167490,"children":167491},{},[167492],{"type":23,"value":167493},"Events are the foundation for bots and automation because they let you react without polling message lists.",{"type":17,"tag":68,"props":167495,"children":167497},{"id":167496},"threading-and-replies",[167498],{"type":23,"value":167499},"Threading and Replies",{"type":17,"tag":29,"props":167501,"children":167502},{},[167503],{"type":23,"value":167504},"Threading is standardized with a single field: parent_id.",{"type":17,"tag":29,"props":167506,"children":167507},{},[167508],{"type":23,"value":167509},"parent_id is the immediate predecessor message in a thread.",{"type":17,"tag":29,"props":167511,"children":167512},{},[167513],{"type":23,"value":167514},"A message with no parent_id is either a standalone message or the root of a thread.",{"type":17,"tag":29,"props":167516,"children":167517},{},[167518],{"type":23,"value":167519},"Replies are created by posting a new message with parent_id set to the message being replied to.",{"type":17,"tag":29,"props":167521,"children":167522},{},[167523],{"type":23,"value":167524},"Some integrations also expose message_thread_identifier for identifying the root of a thread. It's informational. You do not set it.",{"type":17,"tag":29,"props":167526,"children":167527},{},[167528],{"type":23,"value":167529},"When listing messages, expand=true can return the full set of descendants, not just immediate children. This is useful for reconstructing an entire thread tree in one query.",{"type":17,"tag":68,"props":167531,"children":167533},{"id":167532},"attachments-in-messages",[167534],{"type":23,"value":167535},"Attachments in Messages",{"type":17,"tag":29,"props":167537,"children":167538},{},[167539],{"type":23,"value":167540},"Messages can include attachment metadata. Attachment retrieval and storage is still your responsibility.",{"type":17,"tag":29,"props":167542,"children":167543},{},[167544],{"type":23,"value":167545},"If your product needs persistent file management (folders, versioning, file-level permissions, long-term retrieval), use the Storage API for file operations. Messaging is optimized for communication objects, not file management.",{"type":17,"tag":68,"props":167547,"children":167549},{"id":167548},"identity-in-messaging",[167550],{"type":23,"value":167551},"Identity in Messaging",{"type":17,"tag":29,"props":167553,"children":167554},{},[167555],{"type":23,"value":167556},"Messaging objects contain messaging-native participant structures (authors, recipients, mentions, reactions).",{"type":17,"tag":29,"props":167558,"children":167559},{},[167560],{"type":23,"value":167561},"They do not reference CRM contacts, ticket IDs, or knowledge pages. If you want to link a message thread to a CRM record or a support case, that mapping should be maintained by your application based on stable identifiers you control (for example, email address, external IDs, or links stored in your own database).",{"type":17,"tag":68,"props":167563,"children":167564},{"id":164849},[167565],{"type":23,"value":164852},{"type":17,"tag":29,"props":167567,"children":167568},{},[167569],{"type":23,"value":167570},"Messaging data often contains personally identifiable information and sensitive content.",{"type":17,"tag":29,"props":167572,"children":167573},{},[167574],{"type":23,"value":167575},"Unified's architecture is pass-through and does not store message content at rest. Requests are stateless and processed in-region.",{"type":17,"tag":29,"props":167577,"children":167578},{},[167579],{"type":23,"value":167580},"On your side, treat these fields as sensitive:",{"type":17,"tag":29,"props":167582,"children":167583},{},[167584],{"type":23,"value":167585},"Message bodies (plain text and formatted variants)",{"type":17,"tag":29,"props":167587,"children":167588},{},[167589],{"type":23,"value":167590},"Participant identity fields (names, emails)",{"type":17,"tag":29,"props":167592,"children":167593},{},[167594],{"type":23,"value":167595},"Attachment metadata and download URLs",{"type":17,"tag":29,"props":167597,"children":167598},{},[167599],{"type":23,"value":167600},"Reaction and mention data, which can reveal behavior and intent",{"type":17,"tag":29,"props":167602,"children":167603},{},[167604],{"type":23,"value":167605},"If you are feeding messaging content into model calls, make sure your product enforces least-privilege access and limits what you store and log.",{"type":17,"tag":68,"props":167607,"children":167609},{"id":167608},"common-messaging-api-use-cases",[167610],{"type":23,"value":167611},"Common Messaging API Use Cases",{"type":17,"tag":239,"props":167613,"children":167615},{"id":167614},"bots-and-assistants",[167616],{"type":23,"value":167617},"Bots and Assistants",{"type":17,"tag":29,"props":167619,"children":167620},{},[167621],{"type":23,"value":167622},"React to events and respond in-thread using parent_id for consistent threading.",{"type":17,"tag":239,"props":167624,"children":167626},{"id":167625},"cross-platform-routing",[167627],{"type":23,"value":167628},"Cross-Platform Routing",{"type":17,"tag":29,"props":167630,"children":167631},{},[167632],{"type":23,"value":167633},"Read from one provider and write to another using the same message shape, handling provider-specific limits where necessary.",{"type":17,"tag":239,"props":167635,"children":167637},{"id":167636},"compliance-and-archiving",[167638],{"type":23,"value":167639},"Compliance and Archiving",{"type":17,"tag":29,"props":167641,"children":167642},{},[167643],{"type":23,"value":167644},"Pull messages and store them in your own environment for retention requirements. Messaging access is separate from long-term storage.",{"type":17,"tag":239,"props":167646,"children":167648},{"id":167647},"ticket-creation-from-conversations",[167649],{"type":23,"value":167650},"Ticket Creation from Conversations",{"type":17,"tag":29,"props":167652,"children":167653},{},[167654],{"type":23,"value":167655},"Detect an issue in a message, then create a ticket in the Ticketing API with a link back to the original thread.",{"type":17,"tag":239,"props":167657,"children":167659},{"id":167658},"summarization-and-analysis",[167660],{"type":23,"value":167661},"Summarization and Analysis",{"type":17,"tag":29,"props":167663,"children":167664},{},[167665],{"type":23,"value":167666},"Use the GenAI API to summarize threads or classify sentiment after retrieving the underlying messages.",{"type":17,"tag":68,"props":167668,"children":167669},{"id":164971},[167670],{"type":23,"value":164974},{"type":17,"tag":29,"props":167672,"children":167673},{},[167674],{"type":23,"value":167675},"Provider capabilities differ across:",{"type":17,"tag":29,"props":167677,"children":167678},{},[167679],{"type":23,"value":167680},"Which event types exist",{"type":17,"tag":29,"props":167682,"children":167683},{},[167684],{"type":23,"value":167685},"Whether message updates are supported",{"type":17,"tag":29,"props":167687,"children":167688},{},[167689],{"type":23,"value":167690},"Whether deletions are available",{"type":17,"tag":29,"props":167692,"children":167693},{},[167694],{"type":23,"value":167695},"How threads are represented",{"type":17,"tag":29,"props":167697,"children":167698},{},[167699],{"type":23,"value":167700},"Whether efficient incremental retrieval is available",{"type":17,"tag":29,"props":167702,"children":167703},{},[167704],{"type":23,"value":167705},"A messaging integration should be designed to handle these differences cleanly, while keeping thread structure consistent through parent_id.",{"type":17,"tag":68,"props":167707,"children":167709},{"id":167708},"build-messaging-integrations-without-platform-specific-rewrites",[167710],{"type":23,"value":167711},"Build messaging integrations without platform-specific rewrites",{"type":17,"tag":29,"props":167713,"children":167714},{},[167715],{"type":23,"value":167716},"If your product relies on conversation data across multiple providers, maintaining separate messaging integrations quickly becomes brittle.",{"type":17,"tag":29,"props":167718,"children":167719},{},[167720],{"type":23,"value":167721},"Unified's Messaging API provides a consistent way to read channels, send and update messages, reconstruct threads, and react to events across supported platforms.",{"type":17,"tag":29,"props":167723,"children":167724},{},[167725,167726],{"type":23,"value":1609},{"type":17,"tag":133,"props":167727,"children":167729},{"href":1612,"rel":167728},[214],[167730],{"type":23,"value":1616},{"type":17,"tag":29,"props":167732,"children":167733},{},[167734,167735],{"type":23,"value":1609},{"type":17,"tag":133,"props":167736,"children":167738},{"href":1623,"rel":167737},[214],[167739],{"type":23,"value":1627},{"type":17,"tag":68,"props":167741,"children":167742},{"id":95759},[167743],{"type":23,"value":95762},{"type":17,"tag":29,"props":167745,"children":167746},{},[167747],{"type":17,"tag":48,"props":167748,"children":167749},{},[167750],{"type":23,"value":14906},{"type":17,"tag":29,"props":167752,"children":167753},{},[167754],{"type":23,"value":167755},"An API that lets applications work with channels, messages, threads, and interaction events programmatically.",{"type":17,"tag":29,"props":167757,"children":167758},{},[167759],{"type":17,"tag":48,"props":167760,"children":167761},{},[167762],{"type":23,"value":167763},"How does threading work across providers?",{"type":17,"tag":29,"props":167765,"children":167766},{},[167767],{"type":23,"value":167768},"Replies are represented using parent_id, where each reply points to the message it responds to.",{"type":17,"tag":29,"props":167770,"children":167771},{},[167772],{"type":17,"tag":48,"props":167773,"children":167774},{},[167775],{"type":23,"value":167776},"Can I receive real-time updates?",{"type":17,"tag":29,"props":167778,"children":167779},{},[167780],{"type":23,"value":167781},"Yes, via webhook delivery where supported. Event coverage varies by provider.",{"type":17,"tag":29,"props":167783,"children":167784},{},[167785],{"type":17,"tag":48,"props":167786,"children":167787},{},[167788],{"type":23,"value":167789},"Does the Messaging API store message content?",{"type":17,"tag":29,"props":167791,"children":167792},{},[167793],{"type":23,"value":167794},"No. Message data is not stored at rest.",{"type":17,"tag":29,"props":167796,"children":167797},{},[167798],{"type":17,"tag":48,"props":167799,"children":167800},{},[167801],{"type":23,"value":167802},"Can I build bots with this?",{"type":17,"tag":29,"props":167804,"children":167805},{},[167806],{"type":23,"value":167807},"Yes. Use event delivery plus message creation with parent_id to reply in-thread where appropriate.",{"type":17,"tag":29,"props":167809,"children":167810},{},[167811],{"type":17,"tag":48,"props":167812,"children":167813},{},[167814],{"type":23,"value":167815},"How does Messaging differ from Ticketing or Call Center?",{"type":17,"tag":29,"props":167817,"children":167818},{},[167819],{"type":23,"value":167820},"Messaging is conversation data. Ticketing is support cases. Call Center is voice call records and recordings.",{"title":7,"searchDepth":1629,"depth":1629,"links":167822},[167823,167824,167825,167826,167830,167835,167836,167837,167838,167839,167846,167847,167848],{"id":167156,"depth":1629,"text":167159},{"id":14903,"depth":1629,"text":167204},{"id":167247,"depth":1629,"text":167250},{"id":167302,"depth":1629,"text":167305,"children":167827},[167828,167829],{"id":167308,"depth":1635,"text":167311},{"id":167319,"depth":1635,"text":167322},{"id":167350,"depth":1629,"text":167353,"children":167831},[167832,167833,167834],{"id":33459,"depth":1635,"text":167363},{"id":137672,"depth":1635,"text":148609},{"id":99198,"depth":1635,"text":63118},{"id":167496,"depth":1629,"text":167499},{"id":167532,"depth":1629,"text":167535},{"id":167548,"depth":1629,"text":167551},{"id":164849,"depth":1629,"text":164852},{"id":167608,"depth":1629,"text":167611,"children":167840},[167841,167842,167843,167844,167845],{"id":167614,"depth":1635,"text":167617},{"id":167625,"depth":1635,"text":167628},{"id":167636,"depth":1635,"text":167639},{"id":167647,"depth":1635,"text":167650},{"id":167658,"depth":1635,"text":167661},{"id":164971,"depth":1629,"text":164974},{"id":167708,"depth":1629,"text":167711},{"id":95759,"depth":1629,"text":95762},"content:blog:messaging_api_integration_real_time_channels_messages_threads_and_events_across_platforms.md","blog/messaging_api_integration_real_time_channels_messages_threads_and_events_across_platforms.md","blog/messaging_api_integration_real_time_channels_messages_threads_and_events_across_platforms",{"_path":167853,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":167854,"description":167855,"img":167856,"date":167857,"tag":12,"body":167858,"_type":1677,"_id":168886,"_source":1679,"_file":168887,"_stem":168888,"_extension":1682},"/blog/permissions_security_and_compliance_in_rag_pipelines","Permissions, Security, and Compliance in RAG Pipelines","Retrieval-augmented generation (RAG) changes how enterprise software answers questions.","https://s3.us-east-2.amazonaws.com/unified-article-images/permissions_security_and_compliance_in_rag_pipelines-icon.png","2026-02-12T21:00:00.000Z",{"type":14,"children":167859,"toc":168868},[167860,167865,167868,167875,167884,167889,167894,167902,167907,167912,167918,167923,167928,167933,167956,167961,167967,167972,167978,167983,168018,168023,168028,168033,168039,168044,168082,168087,168105,168110,168143,168148,168154,168159,168164,168170,168175,168180,168188,168201,168207,168219,168226,168244,168249,168255,168260,168264,168284,168289,168294,168300,168305,168323,168328,168346,168351,168357,168362,168367,168385,168390,168413,168418,168424,168429,168447,168452,168470,168475,168480,168485,168503,168509,168514,168519,168537,168542,168547,168575,168580,168586,168591,168644,168649,168677,168682,168688,168693,168698,168724,168729,168750,168755,168760,168765,168783,168787,168792,168797,168835,168840,168845,168850,168859],{"type":17,"tag":18,"props":167861,"children":167863},{"id":167862},"permissions-security-and-compliance-in-rag-pipelines",[167864],{"type":23,"value":167854},{"type":17,"tag":25,"props":167866,"children":167867},{},[],{"type":17,"tag":29,"props":167869,"children":167870},{},[167871],{"type":17,"tag":33,"props":167872,"children":167873},{},[167874],{"type":23,"value":165325},{"type":17,"tag":29,"props":167876,"children":167877},{},[167878,167882],{"type":17,"tag":133,"props":167879,"children":167880},{"href":77021},[167881],{"type":23,"value":137991},{"type":23,"value":167883}," (RAG) changes how enterprise software answers questions.",{"type":17,"tag":29,"props":167885,"children":167886},{},[167887],{"type":23,"value":167888},"Instead of relying only on model training data, a RAG system retrieves internal content — CRM records, support tickets, contracts, knowledge base articles, HR files — and injects that context into the prompt.",{"type":17,"tag":29,"props":167890,"children":167891},{},[167892],{"type":23,"value":167893},"That power introduces a new surface area:",{"type":17,"tag":3414,"props":167895,"children":167896},{},[167897],{"type":17,"tag":29,"props":167898,"children":167899},{},[167900],{"type":23,"value":167901},"Who is allowed to retrieve what — and how do you prove it?",{"type":17,"tag":29,"props":167903,"children":167904},{},[167905],{"type":23,"value":167906},"In enterprise environments, permissions, tenant isolation, and auditability are not optional layers added after the model works. They are architectural requirements.",{"type":17,"tag":29,"props":167908,"children":167909},{},[167910],{"type":23,"value":167911},"This article explains how production RAG systems enforce authorization, where security checks must occur, and what compliance teams expect to see.",{"type":17,"tag":68,"props":167913,"children":167915},{"id":167914},"why-permissions-become-harder-in-rag",[167916],{"type":23,"value":167917},"Why Permissions Become Harder in RAG",{"type":17,"tag":29,"props":167919,"children":167920},{},[167921],{"type":23,"value":167922},"Traditional SaaS applications enforce permissions at the UI and API layers.",{"type":17,"tag":29,"props":167924,"children":167925},{},[167926],{"type":23,"value":167927},"RAG introduces a new layer: a vector store that contains embedded representations of content.",{"type":17,"tag":29,"props":167929,"children":167930},{},[167931],{"type":23,"value":167932},"Vector search engines optimize for semantic similarity, not authorization. Without additional controls:",{"type":17,"tag":80,"props":167934,"children":167935},{},[167936,167941,167946,167951],{"type":17,"tag":84,"props":167937,"children":167938},{},[167939],{"type":23,"value":167940},"A user could retrieve content they should not see.",{"type":17,"tag":84,"props":167942,"children":167943},{},[167944],{"type":23,"value":167945},"Multi-tenant data could leak across customers.",{"type":17,"tag":84,"props":167947,"children":167948},{},[167949],{"type":23,"value":167950},"Stale permissions could persist in embeddings.",{"type":17,"tag":84,"props":167952,"children":167953},{},[167954],{"type":23,"value":167955},"Sensitive data could be included in model context unintentionally.",{"type":17,"tag":29,"props":167957,"children":167958},{},[167959],{"type":23,"value":167960},"RAG pipelines must treat authorization as a first-class concern across ingestion, indexing, retrieval, and generation.",{"type":17,"tag":68,"props":167962,"children":167964},{"id":167963},"authorization-checkpoints-in-a-production-rag-pipeline",[167965],{"type":23,"value":167966},"Authorization Checkpoints in a Production RAG Pipeline",{"type":17,"tag":29,"props":167968,"children":167969},{},[167970],{"type":23,"value":167971},"In practice, permission enforcement happens at multiple stages.",{"type":17,"tag":239,"props":167973,"children":167975},{"id":167974},"_1-ingestion-capture-access-rules-from-the-source",[167976],{"type":23,"value":167977},"1. Ingestion: Capture Access Rules From the Source",{"type":17,"tag":29,"props":167979,"children":167980},{},[167981],{"type":23,"value":167982},"When ingesting data from systems like Google Drive, Salesforce, Zendesk, or an ATS, the pipeline must capture:",{"type":17,"tag":80,"props":167984,"children":167985},{},[167986,168004,168008,168013],{"type":17,"tag":84,"props":167987,"children":167988},{},[167989,167991,167997,167998,168003],{"type":23,"value":167990},"Ownership identifiers (e.g., ",{"type":17,"tag":6121,"props":167992,"children":167994},{"className":167993},[],[167995],{"type":23,"value":167996},"owner_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":167999,"children":168001},{"className":168000},[],[168002],{"type":23,"value":62582},{"type":23,"value":12034},{"type":17,"tag":84,"props":168005,"children":168006},{},[168007],{"type":23,"value":162197},{"type":17,"tag":84,"props":168009,"children":168010},{},[168011],{"type":23,"value":168012},"Access control lists (ACLs), where available",{"type":17,"tag":84,"props":168014,"children":168015},{},[168016],{"type":23,"value":168017},"Sensitivity labels or classification fields",{"type":17,"tag":29,"props":168019,"children":168020},{},[168021],{"type":23,"value":168022},"If these attributes are not captured at ingestion, the retrieval layer has nothing to evaluate later.",{"type":17,"tag":29,"props":168024,"children":168025},{},[168026],{"type":23,"value":168027},"For example, file storage APIs typically return explicit permission objects. Other categories — CRM, ticketing, ATS — often return ownership fields but not user/group-level permissions.",{"type":17,"tag":29,"props":168029,"children":168030},{},[168031],{"type":23,"value":168032},"That distinction matters.",{"type":17,"tag":239,"props":168034,"children":168036},{"id":168035},"_2-indexing-attach-metadata-and-enforce-isolation",[168037],{"type":23,"value":168038},"2. Indexing: Attach Metadata and Enforce Isolation",{"type":17,"tag":29,"props":168040,"children":168041},{},[168042],{"type":23,"value":168043},"Once content is embedded, it must carry structured attributes alongside the vector:",{"type":17,"tag":80,"props":168045,"children":168046},{},[168047,168055,168064,168072,168077],{"type":17,"tag":84,"props":168048,"children":168049},{},[168050],{"type":17,"tag":6121,"props":168051,"children":168053},{"className":168052},[],[168054],{"type":23,"value":77772},{"type":17,"tag":84,"props":168056,"children":168057},{},[168058],{"type":17,"tag":6121,"props":168059,"children":168061},{"className":168060},[],[168062],{"type":23,"value":168063},"document_id",{"type":17,"tag":84,"props":168065,"children":168066},{},[168067],{"type":17,"tag":6121,"props":168068,"children":168070},{"className":168069},[],[168071],{"type":23,"value":167996},{"type":17,"tag":84,"props":168073,"children":168074},{},[168075],{"type":23,"value":168076},"classification or sensitivity level",{"type":17,"tag":84,"props":168078,"children":168079},{},[168080],{"type":23,"value":168081},"object type (file, ticket, deal, candidate, etc.)",{"type":17,"tag":29,"props":168083,"children":168084},{},[168085],{"type":23,"value":168086},"Without structured metadata:",{"type":17,"tag":80,"props":168088,"children":168089},{},[168090,168095,168100],{"type":17,"tag":84,"props":168091,"children":168092},{},[168093],{"type":23,"value":168094},"You cannot filter results by tenant.",{"type":17,"tag":84,"props":168096,"children":168097},{},[168098],{"type":23,"value":168099},"You cannot enforce row-level security.",{"type":17,"tag":84,"props":168101,"children":168102},{},[168103],{"type":23,"value":168104},"You cannot perform deterministic audit logging.",{"type":17,"tag":29,"props":168106,"children":168107},{},[168108],{"type":23,"value":168109},"Multi-tenant SaaS deployments typically use one of these isolation patterns:",{"type":17,"tag":80,"props":168111,"children":168112},{},[168113,168123,168133],{"type":17,"tag":84,"props":168114,"children":168115},{},[168116,168121],{"type":17,"tag":48,"props":168117,"children":168118},{},[168119],{"type":23,"value":168120},"Namespace per tenant",{"type":23,"value":168122}," — physical or logical partitioning in the vector store.",{"type":17,"tag":84,"props":168124,"children":168125},{},[168126,168131],{"type":17,"tag":48,"props":168127,"children":168128},{},[168129],{"type":23,"value":168130},"Per-tenant index",{"type":23,"value":168132}," — stronger isolation, higher operational overhead.",{"type":17,"tag":84,"props":168134,"children":168135},{},[168136,168141],{"type":17,"tag":48,"props":168137,"children":168138},{},[168139],{"type":23,"value":168140},"Shared index + tenant metadata filter",{"type":23,"value":168142}," — flexible but requires strict query-time filtering.",{"type":17,"tag":29,"props":168144,"children":168145},{},[168146],{"type":23,"value":168147},"Each pattern trades operational complexity against isolation guarantees.",{"type":17,"tag":239,"props":168149,"children":168151},{"id":168150},"_3-query-time-pre-filter-vs-post-filter-authorization",[168152],{"type":23,"value":168153},"3. Query Time: Pre-Filter vs Post-Filter Authorization",{"type":17,"tag":29,"props":168155,"children":168156},{},[168157],{"type":23,"value":168158},"When a user issues a query, the system must ensure that only authorized documents are considered.",{"type":17,"tag":29,"props":168160,"children":168161},{},[168162],{"type":23,"value":168163},"Two common patterns exist:",{"type":17,"tag":239,"props":168165,"children":168167},{"id":168166},"pre-filter-authorization",[168168],{"type":23,"value":168169},"Pre-Filter Authorization",{"type":17,"tag":29,"props":168171,"children":168172},{},[168173],{"type":23,"value":168174},"The application first determines which documents the user is allowed to access — for example, by consulting a permission service or evaluating ownership fields.",{"type":17,"tag":29,"props":168176,"children":168177},{},[168178],{"type":23,"value":168179},"Only those document IDs are included in the vector search filter.",{"type":17,"tag":29,"props":168181,"children":168182},{},[168183],{"type":17,"tag":48,"props":168184,"children":168185},{},[168186],{"type":23,"value":168187},"Tradeoff:",{"type":17,"tag":80,"props":168189,"children":168190},{},[168191,168196],{"type":17,"tag":84,"props":168192,"children":168193},{},[168194],{"type":23,"value":168195},"Strong security guarantees.",{"type":17,"tag":84,"props":168197,"children":168198},{},[168199],{"type":23,"value":168200},"Higher computation cost when users have broad access.",{"type":17,"tag":239,"props":168202,"children":168204},{"id":168203},"post-filter-authorization",[168205],{"type":23,"value":168206},"Post-Filter Authorization",{"type":17,"tag":29,"props":168208,"children":168209},{},[168210,168212,168217],{"type":23,"value":168211},"The system performs vector search first, retrieves the top ",{"type":17,"tag":33,"props":168213,"children":168214},{},[168215],{"type":23,"value":168216},"k",{"type":23,"value":168218}," results, then checks each document against authorization rules and discards unauthorized results.",{"type":17,"tag":29,"props":168220,"children":168221},{},[168222],{"type":17,"tag":48,"props":168223,"children":168224},{},[168225],{"type":23,"value":168187},{"type":17,"tag":80,"props":168227,"children":168228},{},[168229,168234,168239],{"type":17,"tag":84,"props":168230,"children":168231},{},[168232],{"type":23,"value":168233},"Lower upfront cost.",{"type":17,"tag":84,"props":168235,"children":168236},{},[168237],{"type":23,"value":168238},"May over-fetch and increase latency.",{"type":17,"tag":84,"props":168240,"children":168241},{},[168242],{"type":23,"value":168243},"Requires careful filtering before constructing the LLM prompt.",{"type":17,"tag":29,"props":168245,"children":168246},{},[168247],{"type":23,"value":168248},"Both approaches are valid. The choice depends on corpus size, permission shape, and expected hit rate.",{"type":17,"tag":239,"props":168250,"children":168252},{"id":168251},"_4-row-level-security-in-hybrid-architectures",[168253],{"type":23,"value":168254},"4. Row-Level Security in Hybrid Architectures",{"type":17,"tag":29,"props":168256,"children":168257},{},[168258],{"type":23,"value":168259},"When embeddings live in relational databases (e.g., PostgreSQL with pgvector), row-level security (RLS) policies can enforce per-row visibility.",{"type":17,"tag":29,"props":168261,"children":168262},{},[168263],{"type":23,"value":3258},{"type":17,"tag":80,"props":168265,"children":168266},{},[168267,168279],{"type":17,"tag":84,"props":168268,"children":168269},{},[168270,168272,168277],{"type":23,"value":168271},"Only return rows where ",{"type":17,"tag":6121,"props":168273,"children":168275},{"className":168274},[],[168276],{"type":23,"value":167996},{"type":23,"value":168278}," matches the authenticated user.",{"type":17,"tag":84,"props":168280,"children":168281},{},[168282],{"type":23,"value":168283},"Automatically enforce tenant scoping via session variables.",{"type":17,"tag":29,"props":168285,"children":168286},{},[168287],{"type":23,"value":168288},"This centralizes authorization logic inside the database rather than the application layer.",{"type":17,"tag":29,"props":168290,"children":168291},{},[168292],{"type":23,"value":168293},"The tradeoff is performance sensitivity. RLS must be tested carefully to avoid query latency spikes.",{"type":17,"tag":239,"props":168295,"children":168297},{"id":168296},"_5-post-retrieval-guardrails",[168298],{"type":23,"value":168299},"5. Post-Retrieval Guardrails",{"type":17,"tag":29,"props":168301,"children":168302},{},[168303],{"type":23,"value":168304},"Even after retrieval:",{"type":17,"tag":80,"props":168306,"children":168307},{},[168308,168313,168318],{"type":17,"tag":84,"props":168309,"children":168310},{},[168311],{"type":23,"value":168312},"Unauthorized chunks must be removed.",{"type":17,"tag":84,"props":168314,"children":168315},{},[168316],{"type":23,"value":168317},"Sensitive fields may need masking.",{"type":17,"tag":84,"props":168319,"children":168320},{},[168321],{"type":23,"value":168322},"The LLM should be instructed to answer only from provided context.",{"type":17,"tag":29,"props":168324,"children":168325},{},[168326],{"type":23,"value":168327},"Logging must capture:",{"type":17,"tag":80,"props":168329,"children":168330},{},[168331,168336,168341],{"type":17,"tag":84,"props":168332,"children":168333},{},[168334],{"type":23,"value":168335},"Which documents were retrieved.",{"type":17,"tag":84,"props":168337,"children":168338},{},[168339],{"type":23,"value":168340},"Which were filtered out.",{"type":17,"tag":84,"props":168342,"children":168343},{},[168344],{"type":23,"value":168345},"What context was passed to the model.",{"type":17,"tag":29,"props":168347,"children":168348},{},[168349],{"type":23,"value":168350},"This ensures deterministic behavior and auditability.",{"type":17,"tag":68,"props":168352,"children":168354},{"id":168353},"multi-tenant-isolation-preventing-cross-customer-leakage",[168355],{"type":23,"value":168356},"Multi-Tenant Isolation: Preventing Cross-Customer Leakage",{"type":17,"tag":29,"props":168358,"children":168359},{},[168360],{"type":23,"value":168361},"For B2B SaaS products, tenant isolation is critical.",{"type":17,"tag":29,"props":168363,"children":168364},{},[168365],{"type":23,"value":168366},"Common patterns include:",{"type":17,"tag":80,"props":168368,"children":168369},{},[168370,168375,168380],{"type":17,"tag":84,"props":168371,"children":168372},{},[168373],{"type":23,"value":168374},"Namespace-per-tenant vector segmentation.",{"type":17,"tag":84,"props":168376,"children":168377},{},[168378],{"type":23,"value":168379},"Tenant ID prefixes in vector identifiers.",{"type":17,"tag":84,"props":168381,"children":168382},{},[168383],{"type":23,"value":168384},"Metadata-based tenant filters at query time.",{"type":17,"tag":29,"props":168386,"children":168387},{},[168388],{"type":23,"value":168389},"Failure to enforce tenant scoping consistently can result in:",{"type":17,"tag":80,"props":168391,"children":168392},{},[168393,168398,168403,168408],{"type":17,"tag":84,"props":168394,"children":168395},{},[168396],{"type":23,"value":168397},"Cross-tenant data exposure.",{"type":17,"tag":84,"props":168399,"children":168400},{},[168401],{"type":23,"value":168402},"Cache bleed-through.",{"type":17,"tag":84,"props":168404,"children":168405},{},[168406],{"type":23,"value":168407},"Retrieval ambiguity.",{"type":17,"tag":84,"props":168409,"children":168410},{},[168411],{"type":23,"value":168412},"Regulatory exposure.",{"type":17,"tag":29,"props":168414,"children":168415},{},[168416],{"type":23,"value":168417},"Isolation must be enforced consistently at ingestion and query time — not only at the UI layer.",{"type":17,"tag":68,"props":168419,"children":168421},{"id":168420},"permission-drift-the-silent-risk",[168422],{"type":23,"value":168423},"Permission Drift: The Silent Risk",{"type":17,"tag":29,"props":168425,"children":168426},{},[168427],{"type":23,"value":168428},"Permissions change over time:",{"type":17,"tag":80,"props":168430,"children":168431},{},[168432,168437,168442],{"type":17,"tag":84,"props":168433,"children":168434},{},[168435],{"type":23,"value":168436},"A user leaves a team.",{"type":17,"tag":84,"props":168438,"children":168439},{},[168440],{"type":23,"value":168441},"A CRM deal changes owner.",{"type":17,"tag":84,"props":168443,"children":168444},{},[168445],{"type":23,"value":168446},"A document is reclassified as confidential.",{"type":17,"tag":29,"props":168448,"children":168449},{},[168450],{"type":23,"value":168451},"If embeddings are not updated or authorization is not evaluated dynamically:",{"type":17,"tag":80,"props":168453,"children":168454},{},[168455,168460,168465],{"type":17,"tag":84,"props":168456,"children":168457},{},[168458],{"type":23,"value":168459},"Users may retain access to outdated vectors.",{"type":17,"tag":84,"props":168461,"children":168462},{},[168463],{"type":23,"value":168464},"Reassigned records may still appear in search.",{"type":17,"tag":84,"props":168466,"children":168467},{},[168468],{"type":23,"value":168469},"Sensitive reclassified documents may remain retrievable.",{"type":17,"tag":29,"props":168471,"children":168472},{},[168473],{"type":23,"value":168474},"For permission changes alone, re-embedding is not required if query-time filtering is correct.",{"type":17,"tag":29,"props":168476,"children":168477},{},[168478],{"type":23,"value":168479},"For content changes or reclassification, re-embedding is required to align vectors with updated content.",{"type":17,"tag":29,"props":168481,"children":168482},{},[168483],{"type":23,"value":168484},"Architecturally, this means:",{"type":17,"tag":80,"props":168486,"children":168487},{},[168488,168493,168498],{"type":17,"tag":84,"props":168489,"children":168490},{},[168491],{"type":23,"value":168492},"Use event-driven updates.",{"type":17,"tag":84,"props":168494,"children":168495},{},[168496],{"type":23,"value":168497},"Avoid embedding once and assuming permanence.",{"type":17,"tag":84,"props":168499,"children":168500},{},[168501],{"type":23,"value":168502},"Treat permission metadata as dynamic, not static.",{"type":17,"tag":68,"props":168504,"children":168506},{"id":168505},"are-embeddings-themselves-sensitive",[168507],{"type":23,"value":168508},"Are Embeddings Themselves Sensitive?",{"type":17,"tag":29,"props":168510,"children":168511},{},[168512],{"type":23,"value":168513},"Embeddings are numeric vectors — but they are derived from source data.",{"type":17,"tag":29,"props":168515,"children":168516},{},[168517],{"type":23,"value":168518},"Security researchers and standards bodies have documented:",{"type":17,"tag":80,"props":168520,"children":168521},{},[168522,168527,168532],{"type":17,"tag":84,"props":168523,"children":168524},{},[168525],{"type":23,"value":168526},"Membership inference risks.",{"type":17,"tag":84,"props":168528,"children":168529},{},[168530],{"type":23,"value":168531},"Model inversion risks.",{"type":17,"tag":84,"props":168533,"children":168534},{},[168535],{"type":23,"value":168536},"Potential reconstruction of sensitive content from vectors.",{"type":17,"tag":29,"props":168538,"children":168539},{},[168540],{"type":23,"value":168541},"This means embeddings should not be treated as harmless metadata.",{"type":17,"tag":29,"props":168543,"children":168544},{},[168545],{"type":23,"value":168546},"They require:",{"type":17,"tag":80,"props":168548,"children":168549},{},[168550,168555,168560,168565,168570],{"type":17,"tag":84,"props":168551,"children":168552},{},[168553],{"type":23,"value":168554},"Encryption at rest and in transit.",{"type":17,"tag":84,"props":168556,"children":168557},{},[168558],{"type":23,"value":168559},"Access control equal to source data.",{"type":17,"tag":84,"props":168561,"children":168562},{},[168563],{"type":23,"value":168564},"Retention and deletion policies.",{"type":17,"tag":84,"props":168566,"children":168567},{},[168568],{"type":23,"value":168569},"Audit logging.",{"type":17,"tag":84,"props":168571,"children":168572},{},[168573],{"type":23,"value":168574},"Tenant isolation.",{"type":17,"tag":29,"props":168576,"children":168577},{},[168578],{"type":23,"value":168579},"Derived data does not eliminate compliance obligations.",{"type":17,"tag":68,"props":168581,"children":168583},{"id":168582},"minimum-viable-audit-trail-for-rag",[168584],{"type":23,"value":168585},"Minimum Viable Audit Trail for RAG",{"type":17,"tag":29,"props":168587,"children":168588},{},[168589],{"type":23,"value":168590},"Enterprise security teams expect to see structured, tamper-evident logs that capture:",{"type":17,"tag":80,"props":168592,"children":168593},{},[168594,168599,168604,168609,168614,168619,168624,168629,168634,168639],{"type":17,"tag":84,"props":168595,"children":168596},{},[168597],{"type":23,"value":168598},"Authenticated user identity.",{"type":17,"tag":84,"props":168600,"children":168601},{},[168602],{"type":23,"value":168603},"Timestamp and request ID.",{"type":17,"tag":84,"props":168605,"children":168606},{},[168607],{"type":23,"value":168608},"Sanitized user prompt.",{"type":17,"tag":84,"props":168610,"children":168611},{},[168612],{"type":23,"value":168613},"Retrieval filters applied (tenant, owner, classification).",{"type":17,"tag":84,"props":168615,"children":168616},{},[168617],{"type":23,"value":168618},"Document IDs retrieved.",{"type":17,"tag":84,"props":168620,"children":168621},{},[168622],{"type":23,"value":168623},"Authorization decisions (allowed/denied).",{"type":17,"tag":84,"props":168625,"children":168626},{},[168627],{"type":23,"value":168628},"Context passed to the model.",{"type":17,"tag":84,"props":168630,"children":168631},{},[168632],{"type":23,"value":168633},"Model version and configuration.",{"type":17,"tag":84,"props":168635,"children":168636},{},[168637],{"type":23,"value":168638},"Generated response.",{"type":17,"tag":84,"props":168640,"children":168641},{},[168642],{"type":23,"value":168643},"Any post-processing steps.",{"type":17,"tag":29,"props":168645,"children":168646},{},[168647],{"type":23,"value":168648},"Logs themselves must be:",{"type":17,"tag":80,"props":168650,"children":168651},{},[168652,168657,168662,168667,168672],{"type":17,"tag":84,"props":168653,"children":168654},{},[168655],{"type":23,"value":168656},"Access controlled.",{"type":17,"tag":84,"props":168658,"children":168659},{},[168660],{"type":23,"value":168661},"Encrypted.",{"type":17,"tag":84,"props":168663,"children":168664},{},[168665],{"type":23,"value":168666},"Append-only.",{"type":17,"tag":84,"props":168668,"children":168669},{},[168670],{"type":23,"value":168671},"Subject to retention policies.",{"type":17,"tag":84,"props":168673,"children":168674},{},[168675],{"type":23,"value":168676},"Capable of supporting deletion requests.",{"type":17,"tag":29,"props":168678,"children":168679},{},[168680],{"type":23,"value":168681},"RAG systems that cannot trace an answer back to specific documents will struggle in regulated environments.",{"type":17,"tag":68,"props":168683,"children":168685},{"id":168684},"power-rag-pipelines-with-unified",[168686],{"type":23,"value":168687},"Power RAG Pipelines with Unified",{"type":17,"tag":29,"props":168689,"children":168690},{},[168691],{"type":23,"value":168692},"Unified is a data access layer for SaaS categories such as file storage, CRM, ticketing, and ATS.",{"type":17,"tag":29,"props":168694,"children":168695},{},[168696],{"type":23,"value":168697},"In RAG pipelines:",{"type":17,"tag":80,"props":168699,"children":168700},{},[168701,168706,168715,168720],{"type":17,"tag":84,"props":168702,"children":168703},{},[168704],{"type":23,"value":168705},"Unified retrieves content across categories.",{"type":17,"tag":84,"props":168707,"children":168708},{},[168709,168713],{"type":17,"tag":133,"props":168710,"children":168711},{"href":4999},[168712],{"type":23,"value":43896},{"type":23,"value":168714}," can keep indexes current.",{"type":17,"tag":84,"props":168716,"children":168717},{},[168718],{"type":23,"value":168719},"Customers store derived embeddings and vector indexes in their own infrastructure.",{"type":17,"tag":84,"props":168721,"children":168722},{},[168723],{"type":23,"value":162499},{"type":17,"tag":29,"props":168725,"children":168726},{},[168727],{"type":23,"value":168728},"Crucially:",{"type":17,"tag":80,"props":168730,"children":168731},{},[168732,168740,168745],{"type":17,"tag":84,"props":168733,"children":168734},{},[168735],{"type":17,"tag":48,"props":168736,"children":168737},{},[168738],{"type":23,"value":168739},"Only file objects include explicit permissions metadata.",{"type":17,"tag":84,"props":168741,"children":168742},{},[168743],{"type":23,"value":168744},"Other categories do not return user/group-level permissions.",{"type":17,"tag":84,"props":168746,"children":168747},{},[168748],{"type":23,"value":168749},"Row-level filtering must be implemented in the consuming application.",{"type":17,"tag":29,"props":168751,"children":168752},{},[168753],{"type":23,"value":168754},"This boundary is intentional.",{"type":17,"tag":29,"props":168756,"children":168757},{},[168758],{"type":23,"value":168759},"Unified normalizes data across providers, but it does not replace your authorization layer. Permission enforcement belongs in your application or authorization service.",{"type":17,"tag":29,"props":168761,"children":168762},{},[168763],{"type":23,"value":168764},"That separation allows:",{"type":17,"tag":80,"props":168766,"children":168767},{},[168768,168773,168778],{"type":17,"tag":84,"props":168769,"children":168770},{},[168771],{"type":23,"value":168772},"Real-time retrieval directly from source APIs.",{"type":17,"tag":84,"props":168774,"children":168775},{},[168776],{"type":23,"value":168777},"Reduced data-at-rest footprint outside source platforms.",{"type":17,"tag":84,"props":168779,"children":168780},{},[168781],{"type":23,"value":168782},"Clear scoping of responsibility between data access and authorization logic.",{"type":17,"tag":68,"props":168784,"children":168785},{"id":2316},[168786],{"type":23,"value":2319},{"type":17,"tag":29,"props":168788,"children":168789},{},[168790],{"type":23,"value":168791},"RAG pipelines in enterprise SaaS environments are not just retrieval systems. They are data governance systems.",{"type":17,"tag":29,"props":168793,"children":168794},{},[168795],{"type":23,"value":168796},"To build secure RAG:",{"type":17,"tag":80,"props":168798,"children":168799},{},[168800,168805,168810,168815,168820,168825,168830],{"type":17,"tag":84,"props":168801,"children":168802},{},[168803],{"type":23,"value":168804},"Capture permissions at ingestion.",{"type":17,"tag":84,"props":168806,"children":168807},{},[168808],{"type":23,"value":168809},"Attach structured attributes to embeddings.",{"type":17,"tag":84,"props":168811,"children":168812},{},[168813],{"type":23,"value":168814},"Enforce tenant isolation.",{"type":17,"tag":84,"props":168816,"children":168817},{},[168818],{"type":23,"value":168819},"Apply authorization at query time.",{"type":17,"tag":84,"props":168821,"children":168822},{},[168823],{"type":23,"value":168824},"Log retrieval provenance.",{"type":17,"tag":84,"props":168826,"children":168827},{},[168828],{"type":23,"value":168829},"Govern embeddings like sensitive data.",{"type":17,"tag":84,"props":168831,"children":168832},{},[168833],{"type":23,"value":168834},"Update vectors when content changes.",{"type":17,"tag":29,"props":168836,"children":168837},{},[168838],{"type":23,"value":168839},"Most RAG failures in enterprise settings are not model failures.",{"type":17,"tag":29,"props":168841,"children":168842},{},[168843],{"type":23,"value":168844},"They are authorization failures.",{"type":17,"tag":29,"props":168846,"children":168847},{},[168848],{"type":23,"value":168849},"Designing for permissions, security, and compliance from the start is what separates a demo from a production system.",{"type":17,"tag":29,"props":168851,"children":168852},{},[168853,168854],{"type":23,"value":1609},{"type":17,"tag":133,"props":168855,"children":168857},{"href":1612,"rel":168856},[214],[168858],{"type":23,"value":1616},{"type":17,"tag":29,"props":168860,"children":168861},{},[168862,168863],{"type":23,"value":1609},{"type":17,"tag":133,"props":168864,"children":168866},{"href":1623,"rel":168865},[214],[168867],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":168869},[168870,168871,168880,168881,168882,168883,168884,168885],{"id":167914,"depth":1629,"text":167917},{"id":167963,"depth":1629,"text":167966,"children":168872},[168873,168874,168875,168876,168877,168878,168879],{"id":167974,"depth":1635,"text":167977},{"id":168035,"depth":1635,"text":168038},{"id":168150,"depth":1635,"text":168153},{"id":168166,"depth":1635,"text":168169},{"id":168203,"depth":1635,"text":168206},{"id":168251,"depth":1635,"text":168254},{"id":168296,"depth":1635,"text":168299},{"id":168353,"depth":1629,"text":168356},{"id":168420,"depth":1629,"text":168423},{"id":168505,"depth":1629,"text":168508},{"id":168582,"depth":1629,"text":168585},{"id":168684,"depth":1629,"text":168687},{"id":2316,"depth":1629,"text":2319},"content:blog:permissions_security_and_compliance_in_rag_pipelines.md","blog/permissions_security_and_compliance_in_rag_pipelines.md","blog/permissions_security_and_compliance_in_rag_pipelines",{"_path":168890,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":168891,"description":168892,"img":168893,"date":168894,"tag":6341,"body":168895,"_type":1677,"_id":170684,"_source":1679,"_file":170685,"_stem":170686,"_extension":1682},"/blog/netsuite_token_based_authentication_setup_for_unified","NetSuite Token-Based Authentication Setup for Unified","Unified connects to NetSuite using Token-Based Authentication (TBA) (OAuth 1.0a style). You will provide 5 values,","https://s3.us-east-2.amazonaws.com/unified-article-images/netsuite_token_based_authentication_setup_for_unified-icon.svg","2026-02-12T19:38:00.000Z",{"type":14,"children":168896,"toc":170663},[168897,168902,168905,168912,168936,168981,168995,168998,169004,169024,169027,169033,169039,169044,169091,169102,169108,169127,169150,169155,169158,169164,169174,169180,169185,169189,169209,169215,169236,169257,169260,169266,169271,169288,169293,169348,169360,169376,169381,169402,169405,169411,169424,169430,169435,169453,169458,169481,169484,169490,169495,169498,169504,169516,169524,169527,169533,169843,169846,169852,169884,169887,169893,170076,170079,170085,170200,170203,170209,170233,170236,170242,170254,170258,170307,170310,170316,170321,170340,170346,170351,170367,170372,170408,170424,170428,170449,170464,170467,170473,170478,170524,170527,170533,170544,170549,170606,170618,170634,170640,170645],{"type":17,"tag":18,"props":168898,"children":168900},{"id":168899},"netsuite-token-based-authentication-setup-for-unified",[168901],{"type":23,"value":168891},{"type":17,"tag":25,"props":168903,"children":168904},{},[],{"type":17,"tag":29,"props":168906,"children":168907},{},[168908],{"type":17,"tag":33,"props":168909,"children":168910},{},[168911],{"type":23,"value":165325},{"type":17,"tag":29,"props":168913,"children":168914},{},[168915,168917,168922,168924,168928,168930,168935],{"type":23,"value":168916},"Unified connects to NetSuite using ",{"type":17,"tag":48,"props":168918,"children":168919},{},[168920],{"type":23,"value":168921},"Token-Based Authentication (TBA)",{"type":23,"value":168923}," (",{"type":17,"tag":133,"props":168925,"children":168926},{"href":779},[168927],{"type":23,"value":782},{"type":23,"value":168929}," 1.0a style). You will provide ",{"type":17,"tag":48,"props":168931,"children":168932},{},[168933],{"type":23,"value":168934},"5 values",{"type":23,"value":20456},{"type":17,"tag":6154,"props":168937,"children":168938},{},[168939,168947,168955,168963,168973],{"type":17,"tag":84,"props":168940,"children":168941},{},[168942],{"type":17,"tag":48,"props":168943,"children":168944},{},[168945],{"type":23,"value":168946},"Realm / Account ID",{"type":17,"tag":84,"props":168948,"children":168949},{},[168950],{"type":17,"tag":48,"props":168951,"children":168952},{},[168953],{"type":23,"value":168954},"Consumer Key",{"type":17,"tag":84,"props":168956,"children":168957},{},[168958],{"type":17,"tag":48,"props":168959,"children":168960},{},[168961],{"type":23,"value":168962},"Consumer Secret",{"type":17,"tag":84,"props":168964,"children":168965},{},[168966,168971],{"type":17,"tag":48,"props":168967,"children":168968},{},[168969],{"type":23,"value":168970},"Token ID",{"type":23,"value":168972}," (a.k.a. Token Key)",{"type":17,"tag":84,"props":168974,"children":168975},{},[168976],{"type":17,"tag":48,"props":168977,"children":168978},{},[168979],{"type":23,"value":168980},"Token Secret",{"type":17,"tag":3414,"props":168982,"children":168983},{},[168984],{"type":17,"tag":29,"props":168985,"children":168986},{},[168987,168989,168994],{"type":23,"value":168988},"'Realm' in most client libraries/connectors refers to the ",{"type":17,"tag":48,"props":168990,"children":168991},{},[168992],{"type":23,"value":168993},"NetSuite Account ID",{"type":23,"value":54},{"type":17,"tag":25,"props":168996,"children":168997},{},[],{"type":17,"tag":68,"props":168999,"children":169001},{"id":169000},"what-you-need-before-starting",[169002],{"type":23,"value":169003},"What you need before starting",{"type":17,"tag":80,"props":169005,"children":169006},{},[169007,169012],{"type":17,"tag":84,"props":169008,"children":169009},{},[169010],{"type":23,"value":169011},"Admin access (recommended) OR a NetSuite admin to perform the enablement + token creation.",{"type":17,"tag":84,"props":169013,"children":169014},{},[169015,169017,169022],{"type":23,"value":169016},"The user you create the token for must have the ",{"type":17,"tag":48,"props":169018,"children":169019},{},[169020],{"type":23,"value":169021},"correct role assigned",{"type":23,"value":169023},", and the token must be generated against that role.",{"type":17,"tag":25,"props":169025,"children":169026},{},[],{"type":17,"tag":18,"props":169028,"children":169030},{"id":169029},"_1-enable-the-required-netsuite-features",[169031],{"type":23,"value":169032},"1) Enable the required NetSuite features",{"type":17,"tag":68,"props":169034,"children":169036},{"id":169035},"_11-enable-token-based-authentication-tba",[169037],{"type":23,"value":169038},"1.1 Enable Token-Based Authentication (TBA)",{"type":17,"tag":29,"props":169040,"children":169041},{},[169042],{"type":23,"value":169043},"In NetSuite:",{"type":17,"tag":80,"props":169045,"children":169046},{},[169047,169056,169066],{"type":17,"tag":84,"props":169048,"children":169049},{},[169050,169051],{"type":23,"value":42072},{"type":17,"tag":48,"props":169052,"children":169053},{},[169054],{"type":23,"value":169055},"Setup → Company → Enable Features",{"type":17,"tag":84,"props":169057,"children":169058},{},[169059,169060,169065],{"type":23,"value":106524},{"type":17,"tag":48,"props":169061,"children":169062},{},[169063],{"type":23,"value":169064},"SuiteCloud",{"type":23,"value":158586},{"type":17,"tag":84,"props":169067,"children":169068},{},[169069,169071,169076,169078],{"type":23,"value":169070},"In ",{"type":17,"tag":48,"props":169072,"children":169073},{},[169074],{"type":23,"value":169075},"Manage Authentication",{"type":23,"value":169077},", enable:\n",{"type":17,"tag":80,"props":169079,"children":169080},{},[169081],{"type":17,"tag":84,"props":169082,"children":169083},{},[169084,169086],{"type":23,"value":169085},"✅ ",{"type":17,"tag":48,"props":169087,"children":169088},{},[169089],{"type":23,"value":169090},"Token-Based Authentication",{"type":17,"tag":29,"props":169092,"children":169093},{},[169094,169096,169100],{"type":23,"value":169095},"(Depending on your NetSuite setup, you may also see toggles for OAuth; for Unified's TBA flow, the key requirement is ",{"type":17,"tag":48,"props":169097,"children":169098},{},[169099],{"type":23,"value":169090},{"type":23,"value":169101},".)",{"type":17,"tag":68,"props":169103,"children":169105},{"id":169104},"_12-enable-rest-web-services-if-youre-using-suitetalk-rest-endpoints",[169106],{"type":23,"value":169107},"1.2 Enable REST Web Services (if you're using SuiteTalk REST endpoints)",{"type":17,"tag":29,"props":169109,"children":169110},{},[169111,169113,169118,169120,169125],{"type":23,"value":169112},"Ensure ",{"type":17,"tag":48,"props":169114,"children":169115},{},[169116],{"type":23,"value":169117},"REST Web Services",{"type":23,"value":169119}," is enabled in ",{"type":17,"tag":48,"props":169121,"children":169122},{},[169123],{"type":23,"value":169124},"Enable Features",{"type":23,"value":169126}," (commonly under SuiteCloud)",{"type":17,"tag":80,"props":169128,"children":169129},{},[169130,169141],{"type":17,"tag":84,"props":169131,"children":169132},{},[169133,169134,169139],{"type":23,"value":169070},{"type":17,"tag":48,"props":169135,"children":169136},{},[169137],{"type":23,"value":169138},"Setup → Company → Enable Features",{"type":23,"value":169140}," → SuiteCloud tab",{"type":17,"tag":84,"props":169142,"children":169143},{},[169144,169146],{"type":23,"value":169145},"Enable ",{"type":17,"tag":48,"props":169147,"children":169148},{},[169149],{"type":23,"value":169117},{"type":17,"tag":29,"props":169151,"children":169152},{},[169153],{"type":23,"value":169154},"Without this, the account cannot use the REST API and you will get 401 errors even with correct credentials.",{"type":17,"tag":25,"props":169156,"children":169157},{},[],{"type":17,"tag":18,"props":169159,"children":169161},{"id":169160},"_2-find-your-realm-account-id",[169162],{"type":23,"value":169163},"2) Find your 'Realm' / Account ID",{"type":17,"tag":29,"props":169165,"children":169166},{},[169167,169169,169173],{"type":23,"value":169168},"Unified's 'Realm ID' is your ",{"type":17,"tag":48,"props":169170,"children":169171},{},[169172],{"type":23,"value":168993},{"type":23,"value":54},{"type":17,"tag":239,"props":169175,"children":169177},{"id":169176},"option-a-fast-from-the-url",[169178],{"type":23,"value":169179},"Option A (fast): from the URL",{"type":17,"tag":29,"props":169181,"children":169182},{},[169183],{"type":23,"value":169184},"When logged into NetSuite, your account ID is visible in the URL. Oracle describes this approach.",{"type":17,"tag":29,"props":169186,"children":169187},{},[169188],{"type":23,"value":19878},{"type":17,"tag":80,"props":169190,"children":169191},{},[169192],{"type":17,"tag":84,"props":169193,"children":169194},{},[169195,169201,169203],{"type":17,"tag":6121,"props":169196,"children":169198},{"className":169197},[],[169199],{"type":23,"value":169200},"https://1234567.app.netsuite.com/...",{"type":23,"value":169202}," → Account ID = ",{"type":17,"tag":6121,"props":169204,"children":169206},{"className":169205},[],[169207],{"type":23,"value":169208},"1234567",{"type":17,"tag":239,"props":169210,"children":169212},{"id":169211},"option-b-from-company-information",[169213],{"type":23,"value":169214},"Option B: from Company Information",{"type":17,"tag":80,"props":169216,"children":169217},{},[169218,169226],{"type":17,"tag":84,"props":169219,"children":169220},{},[169221],{"type":17,"tag":48,"props":169222,"children":169223},{},[169224],{"type":23,"value":169225},"Setup → Company → Company Information",{"type":17,"tag":84,"props":169227,"children":169228},{},[169229,169231],{"type":23,"value":169230},"Find ",{"type":17,"tag":48,"props":169232,"children":169233},{},[169234],{"type":23,"value":169235},"Account ID",{"type":17,"tag":3414,"props":169237,"children":169238},{},[169239],{"type":17,"tag":29,"props":169240,"children":169241},{},[169242,169247,169249,169255],{"type":17,"tag":48,"props":169243,"children":169244},{},[169245],{"type":23,"value":169246},"Sandbox note:",{"type":23,"value":169248}," your account ID may include a sandbox suffix like ",{"type":17,"tag":6121,"props":169250,"children":169252},{"className":169251},[],[169253],{"type":23,"value":169254},"-SB1",{"type":23,"value":169256}," (format varies by account).",{"type":17,"tag":25,"props":169258,"children":169259},{},[],{"type":17,"tag":18,"props":169261,"children":169263},{"id":169262},"_3-create-the-integration-record-consumer-key-secret",[169264],{"type":23,"value":169265},"3) Create the Integration Record (Consumer Key / Secret)",{"type":17,"tag":29,"props":169267,"children":169268},{},[169269],{"type":23,"value":169270},"This is where you generate:",{"type":17,"tag":80,"props":169272,"children":169273},{},[169274,169281],{"type":17,"tag":84,"props":169275,"children":169276},{},[169277],{"type":17,"tag":48,"props":169278,"children":169279},{},[169280],{"type":23,"value":168954},{"type":17,"tag":84,"props":169282,"children":169283},{},[169284],{"type":17,"tag":48,"props":169285,"children":169286},{},[169287],{"type":23,"value":168962},{"type":17,"tag":29,"props":169289,"children":169290},{},[169291],{"type":23,"value":169292},"Steps:",{"type":17,"tag":6154,"props":169294,"children":169295},{},[169296,169305,169315,169325,169334,169343],{"type":17,"tag":84,"props":169297,"children":169298},{},[169299,169300],{"type":23,"value":42072},{"type":17,"tag":48,"props":169301,"children":169302},{},[169303],{"type":23,"value":169304},"Setup → Integration → Manage Integrations → New",{"type":17,"tag":84,"props":169306,"children":169307},{},[169308,169310],{"type":23,"value":169309},"Give it a name like ",{"type":17,"tag":48,"props":169311,"children":169312},{},[169313],{"type":23,"value":169314},"'Unified Integration'",{"type":17,"tag":84,"props":169316,"children":169317},{},[169318,169320],{"type":23,"value":169319},"Set ",{"type":17,"tag":48,"props":169321,"children":169322},{},[169323],{"type":23,"value":169324},"State = Enabled",{"type":17,"tag":84,"props":169326,"children":169327},{},[169328,169329,169333],{"type":23,"value":158670},{"type":17,"tag":48,"props":169330,"children":169331},{},[169332],{"type":23,"value":97048},{"type":23,"value":158586},{"type":17,"tag":84,"props":169335,"children":169336},{},[169337,169339],{"type":23,"value":169338},"✅ Check ",{"type":17,"tag":48,"props":169340,"children":169341},{},[169342],{"type":23,"value":169090},{"type":17,"tag":84,"props":169344,"children":169345},{},[169346],{"type":23,"value":169347},"Save",{"type":17,"tag":29,"props":169349,"children":169350},{},[169351,169353,169358],{"type":23,"value":169352},"Oracle's help doc explicitly calls out checking ",{"type":17,"tag":48,"props":169354,"children":169355},{},[169356],{"type":23,"value":169357},"Token-based Authentication",{"type":23,"value":169359}," on the Integration Record.",{"type":17,"tag":29,"props":169361,"children":169362},{},[169363,169365,169369,169370,169374],{"type":23,"value":169364},"After saving, NetSuite will display the ",{"type":17,"tag":48,"props":169366,"children":169367},{},[169368],{"type":23,"value":168954},{"type":23,"value":42442},{"type":17,"tag":48,"props":169371,"children":169372},{},[169373],{"type":23,"value":168962},{"type":23,"value":169375},". Copy them somewhere safe (you may not be able to view the secret again).",{"type":17,"tag":29,"props":169377,"children":169378},{},[169379],{"type":23,"value":169380},"✅ Provide these to Unified as:",{"type":17,"tag":80,"props":169382,"children":169383},{},[169384,169393],{"type":17,"tag":84,"props":169385,"children":169386},{},[169387],{"type":17,"tag":6121,"props":169388,"children":169390},{"className":169389},[],[169391],{"type":23,"value":169392},"consumer_key",{"type":17,"tag":84,"props":169394,"children":169395},{},[169396],{"type":17,"tag":6121,"props":169397,"children":169399},{"className":169398},[],[169400],{"type":23,"value":169401},"consumer_secret",{"type":17,"tag":25,"props":169403,"children":169404},{},[],{"type":17,"tag":18,"props":169406,"children":169408},{"id":169407},"_4-create-configure-the-role-used-for-the-token",[169409],{"type":23,"value":169410},"4) Create / Configure the Role used for the token",{"type":17,"tag":29,"props":169412,"children":169413},{},[169414,169416,169422],{"type":23,"value":169415},"This is the most important part for avoiding ",{"type":17,"tag":6121,"props":169417,"children":169419},{"className":169418},[],[169420],{"type":23,"value":169421},"401 INVALID_LOGIN",{"type":23,"value":169423}," and permission issues.",{"type":17,"tag":68,"props":169425,"children":169427},{"id":169426},"recommended-use-administrator-role",[169428],{"type":23,"value":169429},"Recommended: Use Administrator Role",{"type":17,"tag":29,"props":169431,"children":169432},{},[169433],{"type":23,"value":169434},"The simplest and most reliable method:",{"type":17,"tag":80,"props":169436,"children":169437},{},[169438,169448],{"type":17,"tag":84,"props":169439,"children":169440},{},[169441,169443],{"type":23,"value":169442},"Use ",{"type":17,"tag":48,"props":169444,"children":169445},{},[169446],{"type":23,"value":169447},"Administrator role",{"type":17,"tag":84,"props":169449,"children":169450},{},[169451],{"type":23,"value":169452},"Create the access token under Administrator",{"type":17,"tag":29,"props":169454,"children":169455},{},[169456],{"type":23,"value":169457},"This ensures:",{"type":17,"tag":80,"props":169459,"children":169460},{},[169461,169466,169471,169476],{"type":17,"tag":84,"props":169462,"children":169463},{},[169464],{"type":23,"value":169465},"All record access works",{"type":17,"tag":84,"props":169467,"children":169468},{},[169469],{"type":23,"value":169470},"All subsidiaries are accessible",{"type":17,"tag":84,"props":169472,"children":169473},{},[169474],{"type":23,"value":169475},"No hidden permission failures",{"type":17,"tag":84,"props":169477,"children":169478},{},[169479],{"type":23,"value":169480},"Faster setup",{"type":17,"tag":25,"props":169482,"children":169483},{},[],{"type":17,"tag":68,"props":169485,"children":169487},{"id":169486},"optional-create-a-dedicated-unified-api-role",[169488],{"type":23,"value":169489},"Optional: Create a Dedicated Unified API Role",{"type":17,"tag":29,"props":169491,"children":169492},{},[169493],{"type":23,"value":169494},"If your security policy requires a restricted role, create a custom role and assign the following permissions.",{"type":17,"tag":25,"props":169496,"children":169497},{},[],{"type":17,"tag":68,"props":169499,"children":169501},{"id":169500},"required-permissions-if-using-custom-role",[169502],{"type":23,"value":169503},"Required Permissions (If Using Custom Role)",{"type":17,"tag":29,"props":169505,"children":169506},{},[169507,169509,169514],{"type":23,"value":169508},"Below is the ",{"type":17,"tag":48,"props":169510,"children":169511},{},[169512],{"type":23,"value":169513},"complete permission set",{"type":23,"value":169515}," required for full accounting integration support.",{"type":17,"tag":3414,"props":169517,"children":169518},{},[169519],{"type":17,"tag":29,"props":169520,"children":169521},{},[169522],{"type":23,"value":169523},"⚠ NOTE: This list may be adjusted depending on your Unified workflows.\n⚠ NOTE:  In some cases, user-level restrictions can override role-level permissions. Please ensure that the user account itself is explicitly granted the following permissions as well.",{"type":17,"tag":25,"props":169525,"children":169526},{},[],{"type":17,"tag":68,"props":169528,"children":169530},{"id":169529},"transaction-permissions",[169531],{"type":23,"value":169532},"Transaction Permissions",{"type":17,"tag":7231,"props":169534,"children":169535},{},[169536,169552],{"type":17,"tag":7235,"props":169537,"children":169538},{},[169539],{"type":17,"tag":7239,"props":169540,"children":169541},{},[169542,169547],{"type":17,"tag":7243,"props":169543,"children":169544},{},[169545],{"type":23,"value":169546},"Permission",{"type":17,"tag":7243,"props":169548,"children":169549},{},[169550],{"type":23,"value":169551},"Level",{"type":17,"tag":7259,"props":169553,"children":169554},{},[169555,169568,169580,169591,169603,169615,169627,169640,169652,169664,169676,169688,169700,169712,169723,169735,169747,169759,169771,169783,169795,169807,169819,169831],{"type":17,"tag":7239,"props":169556,"children":169557},{},[169558,169563],{"type":17,"tag":7266,"props":169559,"children":169560},{},[169561],{"type":23,"value":169562},"Access Payment Audit Log",{"type":17,"tag":7266,"props":169564,"children":169565},{},[169566],{"type":23,"value":169567},"Full",{"type":17,"tag":7239,"props":169569,"children":169570},{},[169571,169576],{"type":17,"tag":7266,"props":169572,"children":169573},{},[169574],{"type":23,"value":169575},"Bill Purchase Orders",{"type":17,"tag":7266,"props":169577,"children":169578},{},[169579],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169581,"children":169582},{},[169583,169587],{"type":17,"tag":7266,"props":169584,"children":169585},{},[169586],{"type":23,"value":83823},{"type":17,"tag":7266,"props":169588,"children":169589},{},[169590],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169592,"children":169593},{},[169594,169599],{"type":17,"tag":7266,"props":169595,"children":169596},{},[169597],{"type":23,"value":169598},"Cash Sale",{"type":17,"tag":7266,"props":169600,"children":169601},{},[169602],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169604,"children":169605},{},[169606,169611],{"type":17,"tag":7266,"props":169607,"children":169608},{},[169609],{"type":23,"value":169610},"Cash Sale Refund",{"type":17,"tag":7266,"props":169612,"children":169613},{},[169614],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169616,"children":169617},{},[169618,169623],{"type":17,"tag":7266,"props":169619,"children":169620},{},[169621],{"type":23,"value":169622},"Credit Memo",{"type":17,"tag":7266,"props":169624,"children":169625},{},[169626],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169628,"children":169629},{},[169630,169635],{"type":17,"tag":7266,"props":169631,"children":169632},{},[169633],{"type":23,"value":169634},"Cross Charge Journal",{"type":17,"tag":7266,"props":169636,"children":169637},{},[169638],{"type":23,"value":169639},"View",{"type":17,"tag":7239,"props":169641,"children":169642},{},[169643,169648],{"type":17,"tag":7266,"props":169644,"children":169645},{},[169646],{"type":23,"value":169647},"Customer Deposit",{"type":17,"tag":7266,"props":169649,"children":169650},{},[169651],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169653,"children":169654},{},[169655,169660],{"type":17,"tag":7266,"props":169656,"children":169657},{},[169658],{"type":23,"value":169659},"Customer Payment",{"type":17,"tag":7266,"props":169661,"children":169662},{},[169663],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169665,"children":169666},{},[169667,169672],{"type":17,"tag":7266,"props":169668,"children":169669},{},[169670],{"type":23,"value":169671},"Customer Refund",{"type":17,"tag":7266,"props":169673,"children":169674},{},[169675],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169677,"children":169678},{},[169679,169684],{"type":17,"tag":7266,"props":169680,"children":169681},{},[169682],{"type":23,"value":169683},"Enter Vendor Credits",{"type":17,"tag":7266,"props":169685,"children":169686},{},[169687],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169689,"children":169690},{},[169691,169696],{"type":17,"tag":7266,"props":169692,"children":169693},{},[169694],{"type":23,"value":169695},"Find Transaction",{"type":17,"tag":7266,"props":169697,"children":169698},{},[169699],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169701,"children":169702},{},[169703,169708],{"type":17,"tag":7266,"props":169704,"children":169705},{},[169706],{"type":23,"value":169707},"Intercompany Adjustments",{"type":17,"tag":7266,"props":169709,"children":169710},{},[169711],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169713,"children":169714},{},[169715,169719],{"type":17,"tag":7266,"props":169716,"children":169717},{},[169718],{"type":23,"value":71559},{"type":17,"tag":7266,"props":169720,"children":169721},{},[169722],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169724,"children":169725},{},[169726,169731],{"type":17,"tag":7266,"props":169727,"children":169728},{},[169729],{"type":23,"value":169730},"Invoice Approval",{"type":17,"tag":7266,"props":169732,"children":169733},{},[169734],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169736,"children":169737},{},[169738,169743],{"type":17,"tag":7266,"props":169739,"children":169740},{},[169741],{"type":23,"value":169742},"Invoice Sales Orders",{"type":17,"tag":7266,"props":169744,"children":169745},{},[169746],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169748,"children":169749},{},[169750,169755],{"type":17,"tag":7266,"props":169751,"children":169752},{},[169753],{"type":23,"value":169754},"Item Receipt",{"type":17,"tag":7266,"props":169756,"children":169757},{},[169758],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169760,"children":169761},{},[169762,169767],{"type":17,"tag":7266,"props":169763,"children":169764},{},[169765],{"type":23,"value":169766},"Item Shipment",{"type":17,"tag":7266,"props":169768,"children":169769},{},[169770],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169772,"children":169773},{},[169774,169779],{"type":17,"tag":7266,"props":169775,"children":169776},{},[169777],{"type":23,"value":169778},"Journal Approval",{"type":17,"tag":7266,"props":169780,"children":169781},{},[169782],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169784,"children":169785},{},[169786,169791],{"type":17,"tag":7266,"props":169787,"children":169788},{},[169789],{"type":23,"value":169790},"Make Journal Entry",{"type":17,"tag":7266,"props":169792,"children":169793},{},[169794],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169796,"children":169797},{},[169798,169803],{"type":17,"tag":7266,"props":169799,"children":169800},{},[169801],{"type":23,"value":169802},"Opportunity",{"type":17,"tag":7266,"props":169804,"children":169805},{},[169806],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169808,"children":169809},{},[169810,169815],{"type":17,"tag":7266,"props":169811,"children":169812},{},[169813],{"type":23,"value":169814},"Paycheck Journal",{"type":17,"tag":7266,"props":169816,"children":169817},{},[169818],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169820,"children":169821},{},[169822,169827],{"type":17,"tag":7266,"props":169823,"children":169824},{},[169825],{"type":23,"value":169826},"Receive Order",{"type":17,"tag":7266,"props":169828,"children":169829},{},[169830],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169832,"children":169833},{},[169834,169839],{"type":17,"tag":7266,"props":169835,"children":169836},{},[169837],{"type":23,"value":169838},"System Journal",{"type":17,"tag":7266,"props":169840,"children":169841},{},[169842],{"type":23,"value":169567},{"type":17,"tag":25,"props":169844,"children":169845},{},[],{"type":17,"tag":68,"props":169847,"children":169849},{"id":169848},"reports-permissions",[169850],{"type":23,"value":169851},"Reports Permissions",{"type":17,"tag":7231,"props":169853,"children":169854},{},[169855,169869],{"type":17,"tag":7235,"props":169856,"children":169857},{},[169858],{"type":17,"tag":7239,"props":169859,"children":169860},{},[169861,169865],{"type":17,"tag":7243,"props":169862,"children":169863},{},[169864],{"type":23,"value":169546},{"type":17,"tag":7243,"props":169866,"children":169867},{},[169868],{"type":23,"value":169551},{"type":17,"tag":7259,"props":169870,"children":169871},{},[169872],{"type":17,"tag":7239,"props":169873,"children":169874},{},[169875,169880],{"type":17,"tag":7266,"props":169876,"children":169877},{},[169878],{"type":23,"value":169879},"Transaction Detail",{"type":17,"tag":7266,"props":169881,"children":169882},{},[169883],{"type":23,"value":169639},{"type":17,"tag":25,"props":169885,"children":169886},{},[],{"type":17,"tag":68,"props":169888,"children":169890},{"id":169889},"lists-permissions",[169891],{"type":23,"value":169892},"Lists Permissions",{"type":17,"tag":7231,"props":169894,"children":169895},{},[169896,169910],{"type":17,"tag":7235,"props":169897,"children":169898},{},[169899],{"type":17,"tag":7239,"props":169900,"children":169901},{},[169902,169906],{"type":17,"tag":7243,"props":169903,"children":169904},{},[169905],{"type":23,"value":169546},{"type":17,"tag":7243,"props":169907,"children":169908},{},[169909],{"type":23,"value":169551},{"type":17,"tag":7259,"props":169911,"children":169912},{},[169913,169924,169936,169948,169959,169970,169982,169993,170005,170016,170028,170040,170052,170064],{"type":17,"tag":7239,"props":169914,"children":169915},{},[169916,169920],{"type":17,"tag":7266,"props":169917,"children":169918},{},[169919],{"type":23,"value":83801},{"type":17,"tag":7266,"props":169921,"children":169922},{},[169923],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169925,"children":169926},{},[169927,169932],{"type":17,"tag":7266,"props":169928,"children":169929},{},[169930],{"type":23,"value":169931},"Address List in Search",{"type":17,"tag":7266,"props":169933,"children":169934},{},[169935],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169937,"children":169938},{},[169939,169944],{"type":17,"tag":7266,"props":169940,"children":169941},{},[169942],{"type":23,"value":169943},"Contact-Subsidiary Relationship",{"type":17,"tag":7266,"props":169945,"children":169946},{},[169947],{"type":23,"value":169639},{"type":17,"tag":7239,"props":169949,"children":169950},{},[169951,169955],{"type":17,"tag":7266,"props":169952,"children":169953},{},[169954],{"type":23,"value":31619},{"type":17,"tag":7266,"props":169956,"children":169957},{},[169958],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169960,"children":169961},{},[169962,169966],{"type":17,"tag":7266,"props":169963,"children":169964},{},[169965],{"type":23,"value":32745},{"type":17,"tag":7266,"props":169967,"children":169968},{},[169969],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169971,"children":169972},{},[169973,169978],{"type":17,"tag":7266,"props":169974,"children":169975},{},[169976],{"type":23,"value":169977},"Employee Record",{"type":17,"tag":7266,"props":169979,"children":169980},{},[169981],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169983,"children":169984},{},[169985,169989],{"type":17,"tag":7266,"props":169986,"children":169987},{},[169988],{"type":23,"value":58244},{"type":17,"tag":7266,"props":169990,"children":169991},{},[169992],{"type":23,"value":169567},{"type":17,"tag":7239,"props":169994,"children":169995},{},[169996,170001],{"type":17,"tag":7266,"props":169997,"children":169998},{},[169999],{"type":23,"value":170000},"Inventory Cost Template",{"type":17,"tag":7266,"props":170002,"children":170003},{},[170004],{"type":23,"value":169639},{"type":17,"tag":7239,"props":170006,"children":170007},{},[170008,170012],{"type":17,"tag":7266,"props":170009,"children":170010},{},[170011],{"type":23,"value":38951},{"type":17,"tag":7266,"props":170013,"children":170014},{},[170015],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170017,"children":170018},{},[170019,170024],{"type":17,"tag":7266,"props":170020,"children":170021},{},[170022],{"type":23,"value":170023},"Partners",{"type":17,"tag":7266,"props":170025,"children":170026},{},[170027],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170029,"children":170030},{},[170031,170036],{"type":17,"tag":7266,"props":170032,"children":170033},{},[170034],{"type":23,"value":170035},"Perform Search",{"type":17,"tag":7266,"props":170037,"children":170038},{},[170039],{"type":23,"value":169639},{"type":17,"tag":7239,"props":170041,"children":170042},{},[170043,170048],{"type":17,"tag":7266,"props":170044,"children":170045},{},[170046],{"type":23,"value":170047},"Subsidiaries",{"type":17,"tag":7266,"props":170049,"children":170050},{},[170051],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170053,"children":170054},{},[170055,170060],{"type":17,"tag":7266,"props":170056,"children":170057},{},[170058],{"type":23,"value":170059},"Vendors",{"type":17,"tag":7266,"props":170061,"children":170062},{},[170063],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170065,"children":170066},{},[170067,170072],{"type":17,"tag":7266,"props":170068,"children":170069},{},[170070],{"type":23,"value":170071},"Currency",{"type":17,"tag":7266,"props":170073,"children":170074},{},[170075],{"type":23,"value":169567},{"type":17,"tag":25,"props":170077,"children":170078},{},[],{"type":17,"tag":68,"props":170080,"children":170082},{"id":170081},"setup-permissions",[170083],{"type":23,"value":170084},"Setup Permissions",{"type":17,"tag":7231,"props":170086,"children":170087},{},[170088,170102],{"type":17,"tag":7235,"props":170089,"children":170090},{},[170091],{"type":17,"tag":7239,"props":170092,"children":170093},{},[170094,170098],{"type":17,"tag":7243,"props":170095,"children":170096},{},[170097],{"type":23,"value":169546},{"type":17,"tag":7243,"props":170099,"children":170100},{},[170101],{"type":23,"value":169551},{"type":17,"tag":7259,"props":170103,"children":170104},{},[170105,170117,170129,170141,170153,170165,170176,170188],{"type":17,"tag":7239,"props":170106,"children":170107},{},[170108,170113],{"type":17,"tag":7266,"props":170109,"children":170110},{},[170111],{"type":23,"value":170112},"Access Token Management",{"type":17,"tag":7266,"props":170114,"children":170115},{},[170116],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170118,"children":170119},{},[170120,170125],{"type":17,"tag":7266,"props":170121,"children":170122},{},[170123],{"type":23,"value":170124},"Integration Application",{"type":17,"tag":7266,"props":170126,"children":170127},{},[170128],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170130,"children":170131},{},[170132,170137],{"type":17,"tag":7266,"props":170133,"children":170134},{},[170135],{"type":23,"value":170136},"Log in using Access Tokens",{"type":17,"tag":7266,"props":170138,"children":170139},{},[170140],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170142,"children":170143},{},[170144,170149],{"type":17,"tag":7266,"props":170145,"children":170146},{},[170147],{"type":23,"value":170148},"Log in using OAuth 2.0 Access Tokens",{"type":17,"tag":7266,"props":170150,"children":170151},{},[170152],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170154,"children":170155},{},[170156,170161],{"type":17,"tag":7266,"props":170157,"children":170158},{},[170159],{"type":23,"value":170160},"OAuth 2.0 Authorized Applications Management",{"type":17,"tag":7266,"props":170162,"children":170163},{},[170164],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170166,"children":170167},{},[170168,170172],{"type":17,"tag":7266,"props":170169,"children":170170},{},[170171],{"type":23,"value":169117},{"type":17,"tag":7266,"props":170173,"children":170174},{},[170175],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170177,"children":170178},{},[170179,170184],{"type":17,"tag":7266,"props":170180,"children":170181},{},[170182],{"type":23,"value":170183},"Two-Factor Authentication Base",{"type":17,"tag":7266,"props":170185,"children":170186},{},[170187],{"type":23,"value":169567},{"type":17,"tag":7239,"props":170189,"children":170190},{},[170191,170196],{"type":17,"tag":7266,"props":170192,"children":170193},{},[170194],{"type":23,"value":170195},"User Access Tokens",{"type":17,"tag":7266,"props":170197,"children":170198},{},[170199],{"type":23,"value":169567},{"type":17,"tag":25,"props":170201,"children":170202},{},[],{"type":17,"tag":239,"props":170204,"children":170206},{"id":170205},"important-notes",[170207],{"type":23,"value":170208},"Important Notes",{"type":17,"tag":80,"props":170210,"children":170211},{},[170212,170223,170228],{"type":17,"tag":84,"props":170213,"children":170214},{},[170215,170217,170222],{"type":23,"value":170216},"The token inherits permissions from the ",{"type":17,"tag":48,"props":170218,"children":170219},{},[170220],{"type":23,"value":170221},"role selected when creating the token",{"type":23,"value":54},{"type":17,"tag":84,"props":170224,"children":170225},{},[170226],{"type":23,"value":170227},"If you create the token under the wrong role, API calls will fail.",{"type":17,"tag":84,"props":170229,"children":170230},{},[170231],{"type":23,"value":170232},"Subsidiary access is controlled by role restrictions — ensure the role has access to all relevant subsidiaries.",{"type":17,"tag":25,"props":170234,"children":170235},{},[],{"type":17,"tag":18,"props":170237,"children":170239},{"id":170238},"_5-assign-the-role-to-the-user-who-will-own-the-token",[170240],{"type":23,"value":170241},"5) Assign the Role to the User who will own the token",{"type":17,"tag":29,"props":170243,"children":170244},{},[170245,170247,170252],{"type":23,"value":170246},"Tokens are created for a ",{"type":17,"tag":48,"props":170248,"children":170249},{},[170250],{"type":23,"value":170251},"User + Role + Integration Record",{"type":23,"value":170253}," combination.",{"type":17,"tag":29,"props":170255,"children":170256},{},[170257],{"type":23,"value":169292},{"type":17,"tag":6154,"props":170259,"children":170260},{},[170261,170270,170282,170292,170303],{"type":17,"tag":84,"props":170262,"children":170263},{},[170264,170265],{"type":23,"value":42072},{"type":17,"tag":48,"props":170266,"children":170267},{},[170268],{"type":23,"value":170269},"Lists → Employees → Employees",{"type":17,"tag":84,"props":170271,"children":170272},{},[170273,170275,170281],{"type":23,"value":170274},"Select the user (or create an 'API User' like ",{"type":17,"tag":6121,"props":170276,"children":170278},{"className":170277},[],[170279],{"type":23,"value":170280},"unified-api@yourcompany.com",{"type":23,"value":12034},{"type":17,"tag":84,"props":170283,"children":170284},{},[170285,170286,170291],{"type":23,"value":106524},{"type":17,"tag":48,"props":170287,"children":170288},{},[170289],{"type":23,"value":170290},"Access",{"type":23,"value":158586},{"type":17,"tag":84,"props":170293,"children":170294},{},[170295,170297,170301],{"type":23,"value":170296},"Ensure the Administrator role (recommended) OR ",{"type":17,"tag":133,"props":170298,"children":170299},{"href":7691},[170300],{"type":23,"value":7806},{"type":23,"value":170302}," Role (if custom) is assigned to this user",{"type":17,"tag":84,"props":170304,"children":170305},{},[170306],{"type":23,"value":169347},{"type":17,"tag":25,"props":170308,"children":170309},{},[],{"type":17,"tag":18,"props":170311,"children":170313},{"id":170312},"_6-create-the-access-token-token-id-token-secret",[170314],{"type":23,"value":170315},"6) Create the Access Token (Token ID / Token Secret)",{"type":17,"tag":29,"props":170317,"children":170318},{},[170319],{"type":23,"value":170320},"This generates:",{"type":17,"tag":80,"props":170322,"children":170323},{},[170324,170333],{"type":17,"tag":84,"props":170325,"children":170326},{},[170327,170331],{"type":17,"tag":48,"props":170328,"children":170329},{},[170330],{"type":23,"value":168970},{"type":23,"value":170332}," (Token Key)",{"type":17,"tag":84,"props":170334,"children":170335},{},[170336],{"type":17,"tag":48,"props":170337,"children":170338},{},[170339],{"type":23,"value":168980},{"type":17,"tag":239,"props":170341,"children":170343},{"id":170342},"where-to-create-it",[170344],{"type":23,"value":170345},"Where to create it",{"type":17,"tag":29,"props":170347,"children":170348},{},[170349],{"type":23,"value":170350},"Typically:",{"type":17,"tag":80,"props":170352,"children":170353},{},[170354],{"type":17,"tag":84,"props":170355,"children":170356},{},[170357,170362,170365],{"type":17,"tag":48,"props":170358,"children":170359},{},[170360],{"type":23,"value":170361},"Setup → Users/Roles → Access Tokens → New",{"type":17,"tag":3891,"props":170363,"children":170364},{},[],{"type":23,"value":170366},"(or 'Manage Access Tokens' depending on your NetSuite UI)",{"type":17,"tag":29,"props":170368,"children":170369},{},[170370],{"type":23,"value":170371},"You will select:",{"type":17,"tag":80,"props":170373,"children":170374},{},[170375,170385,170394,170403],{"type":17,"tag":84,"props":170376,"children":170377},{},[170378,170383],{"type":17,"tag":48,"props":170379,"children":170380},{},[170381],{"type":23,"value":170382},"Application / Integration Record",{"type":23,"value":170384}," = the integration you created ('Unified Integration')",{"type":17,"tag":84,"props":170386,"children":170387},{},[170388,170392],{"type":17,"tag":48,"props":170389,"children":170390},{},[170391],{"type":23,"value":118801},{"type":23,"value":170393}," = the user you assigned the role to",{"type":17,"tag":84,"props":170395,"children":170396},{},[170397,170401],{"type":17,"tag":48,"props":170398,"children":170399},{},[170400],{"type":23,"value":18599},{"type":23,"value":170402}," = Administrator (recommended) OR Unified API Role",{"type":17,"tag":84,"props":170404,"children":170405},{},[170406],{"type":23,"value":170407},"Token name (optional but recommended)",{"type":17,"tag":29,"props":170409,"children":170410},{},[170411,170413,170417,170418,170422],{"type":23,"value":170412},"Save → NetSuite displays ",{"type":17,"tag":48,"props":170414,"children":170415},{},[170416],{"type":23,"value":168970},{"type":23,"value":42442},{"type":17,"tag":48,"props":170419,"children":170420},{},[170421],{"type":23,"value":168980},{"type":23,"value":170423},". Copy them immediately.",{"type":17,"tag":29,"props":170425,"children":170426},{},[170427],{"type":23,"value":169380},{"type":17,"tag":80,"props":170429,"children":170430},{},[170431,170440],{"type":17,"tag":84,"props":170432,"children":170433},{},[170434],{"type":17,"tag":6121,"props":170435,"children":170437},{"className":170436},[],[170438],{"type":23,"value":170439},"token_id",{"type":17,"tag":84,"props":170441,"children":170442},{},[170443],{"type":17,"tag":6121,"props":170444,"children":170446},{"className":170445},[],[170447],{"type":23,"value":170448},"token_secret",{"type":17,"tag":3414,"props":170450,"children":170451},{},[170452],{"type":17,"tag":29,"props":170453,"children":170454},{},[170455,170457,170462],{"type":23,"value":170456},"Important: the ",{"type":17,"tag":48,"props":170458,"children":170459},{},[170460],{"type":23,"value":170461},"role you select when creating the token",{"type":23,"value":170463}," is the role whose permissions will be enforced on all API calls made with that token.",{"type":17,"tag":25,"props":170465,"children":170466},{},[],{"type":17,"tag":18,"props":170468,"children":170470},{"id":170469},"_7-what-to-provide-to-unified-the-5-inputs",[170471],{"type":23,"value":170472},"7) What to provide to Unified (the 5 inputs)",{"type":17,"tag":29,"props":170474,"children":170475},{},[170476],{"type":23,"value":170477},"When connecting NetSuite in Unified, enter:",{"type":17,"tag":6154,"props":170479,"children":170480},{},[170481,170492,170500,170508,170516],{"type":17,"tag":84,"props":170482,"children":170483},{},[170484,170490],{"type":17,"tag":6121,"props":170485,"children":170487},{"className":170486},[],[170488],{"type":23,"value":170489},"realm_id",{"type":23,"value":170491}," (NetSuite Account ID)",{"type":17,"tag":84,"props":170493,"children":170494},{},[170495],{"type":17,"tag":6121,"props":170496,"children":170498},{"className":170497},[],[170499],{"type":23,"value":169392},{"type":17,"tag":84,"props":170501,"children":170502},{},[170503],{"type":17,"tag":6121,"props":170504,"children":170506},{"className":170505},[],[170507],{"type":23,"value":169401},{"type":17,"tag":84,"props":170509,"children":170510},{},[170511],{"type":17,"tag":6121,"props":170512,"children":170514},{"className":170513},[],[170515],{"type":23,"value":170439},{"type":17,"tag":84,"props":170517,"children":170518},{},[170519],{"type":17,"tag":6121,"props":170520,"children":170522},{"className":170521},[],[170523],{"type":23,"value":170448},{"type":17,"tag":25,"props":170525,"children":170526},{},[],{"type":17,"tag":18,"props":170528,"children":170530},{"id":170529},"_8-validation-troubleshooting-checklist",[170531],{"type":23,"value":170532},"8) Validation & troubleshooting checklist",{"type":17,"tag":68,"props":170534,"children":170536},{"id":170535},"_81-if-you-get401-invalid_login",[170537,170539],{"type":23,"value":170538},"8.1 If you get ",{"type":17,"tag":6121,"props":170540,"children":170542},{"className":170541},[],[170543],{"type":23,"value":169421},{"type":17,"tag":29,"props":170545,"children":170546},{},[170547],{"type":23,"value":170548},"This almost always means one of:",{"type":17,"tag":80,"props":170550,"children":170551},{},[170552,170562,170578,170590,170601],{"type":17,"tag":84,"props":170553,"children":170554},{},[170555,170557],{"type":23,"value":170556},"Token created under the wrong ",{"type":17,"tag":48,"props":170558,"children":170559},{},[170560],{"type":23,"value":170561},"role",{"type":17,"tag":84,"props":170563,"children":170564},{},[170565,170567,170571,170573,170577],{"type":23,"value":170566},"Token/user not permitted to use tokens (missing ",{"type":17,"tag":48,"props":170568,"children":170569},{},[170570],{"type":23,"value":170195},{"type":23,"value":170572}," / ",{"type":17,"tag":48,"props":170574,"children":170575},{},[170576],{"type":23,"value":170112},{"type":23,"value":12034},{"type":17,"tag":84,"props":170579,"children":170580},{},[170581,170583,170588],{"type":23,"value":170582},"Wrong ",{"type":17,"tag":48,"props":170584,"children":170585},{},[170586],{"type":23,"value":170587},"realm/account id",{"type":23,"value":170589}," (especially sandbox vs prod)",{"type":17,"tag":84,"props":170591,"children":170592},{},[170593,170594,170599],{"type":23,"value":170582},{"type":17,"tag":48,"props":170595,"children":170596},{},[170597],{"type":23,"value":170598},"consumer key/secret",{"type":23,"value":170600}," paired with the token",{"type":17,"tag":84,"props":170602,"children":170603},{},[170604],{"type":23,"value":170605},"Integration record disabled",{"type":17,"tag":29,"props":170607,"children":170608},{},[170609,170611,170616],{"type":23,"value":170610},"NetSuite's error message itself suggests checking the ",{"type":17,"tag":48,"props":170612,"children":170613},{},[170614],{"type":23,"value":170615},"Login Audit Trail",{"type":23,"value":170617},", which is the best source of truth:",{"type":17,"tag":80,"props":170619,"children":170620},{},[170621],{"type":17,"tag":84,"props":170622,"children":170623},{},[170624,170629,170632],{"type":17,"tag":48,"props":170625,"children":170626},{},[170627],{"type":23,"value":170628},"Setup → Users/Roles → User Management → View Login Audit Trail",{"type":17,"tag":3891,"props":170630,"children":170631},{},[],{"type":23,"value":170633},"Look for token-based login details.",{"type":17,"tag":68,"props":170635,"children":170637},{"id":170636},"_82-sandbox-vs-production",[170638],{"type":23,"value":170639},"8.2 Sandbox vs Production",{"type":17,"tag":29,"props":170641,"children":170642},{},[170643],{"type":23,"value":170644},"Make sure:",{"type":17,"tag":80,"props":170646,"children":170647},{},[170648,170653,170658],{"type":17,"tag":84,"props":170649,"children":170650},{},[170651],{"type":23,"value":170652},"Sandbox token is used only for sandbox",{"type":17,"tag":84,"props":170654,"children":170655},{},[170656],{"type":23,"value":170657},"Production token only for production",{"type":17,"tag":84,"props":170659,"children":170660},{},[170661],{"type":23,"value":170662},"Realm/account ID matches the environment",{"title":7,"searchDepth":1629,"depth":1629,"links":170664},[170665,170666,170667,170671,170672,170673,170674,170675,170676,170677,170681,170683],{"id":169000,"depth":1629,"text":169003},{"id":169035,"depth":1629,"text":169038},{"id":169104,"depth":1629,"text":169107,"children":170668},[170669,170670],{"id":169176,"depth":1635,"text":169179},{"id":169211,"depth":1635,"text":169214},{"id":169426,"depth":1629,"text":169429},{"id":169486,"depth":1629,"text":169489},{"id":169500,"depth":1629,"text":169503},{"id":169529,"depth":1629,"text":169532},{"id":169848,"depth":1629,"text":169851},{"id":169889,"depth":1629,"text":169892},{"id":170081,"depth":1629,"text":170084,"children":170678},[170679,170680],{"id":170205,"depth":1635,"text":170208},{"id":170342,"depth":1635,"text":170345},{"id":170535,"depth":1629,"text":170682},"8.1 If you get 401 INVALID_LOGIN",{"id":170636,"depth":1629,"text":170639},"content:blog:netsuite_token_based_authentication_setup_for_unified.md","blog/netsuite_token_based_authentication_setup_for_unified.md","blog/netsuite_token_based_authentication_setup_for_unified",{"_path":170688,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":170689,"description":170690,"img":170691,"date":170692,"tag":12,"body":170693,"_type":1677,"_id":171466,"_source":1679,"_file":171467,"_stem":171468,"_extension":1682},"/blog/generative_ai_api_integration_multi_model_prompts_routing_and_embeddings_across_providers","Generative AI API Integration: Multi-Model Prompts, Routing, and Embeddings Across Providers","Generative AI systems sit at the point where your product turns text into outputs your users rely on. Providers change model names, feature flags differ, and...","https://s3.us-east-2.amazonaws.com/unified-article-images/generative_ai_api_integration_multi_model_prompts_routing_and_embeddings_across_providers-icon.png","2026-02-12T19:00:00.000Z",{"type":14,"children":170694,"toc":171436},[170695,170700,170703,170710,170721,170738,170744,170749,170754,170782,170787,170792,170815,170821,170826,170864,170870,170876,170881,170887,170892,170915,170921,170926,170931,170936,170940,170966,170971,170976,170981,171040,171045,171050,171054,171091,171097,171102,171125,171131,171136,171154,171160,171166,171171,171175,171180,171186,171191,171197,171202,171208,171213,171236,171242,171247,171270,171276,171299,171305,171333,171339,171344,171349,171358,171367,171371,171379,171384,171392,171397,171405,171410,171418,171423,171431],{"type":17,"tag":18,"props":170696,"children":170698},{"id":170697},"generative-ai-api-integration-multi-model-prompts-routing-and-embeddings-across-providers",[170699],{"type":23,"value":170689},{"type":17,"tag":25,"props":170701,"children":170702},{},[],{"type":17,"tag":29,"props":170704,"children":170705},{},[170706],{"type":17,"tag":33,"props":170707,"children":170708},{},[170709],{"type":23,"value":165325},{"type":17,"tag":29,"props":170711,"children":170712},{},[170713,170715,170719],{"type":23,"value":170714},"Generative AI systems sit at the point where your product turns text into outputs your users rely on. Providers change model names, feature flags differ, and teams end up maintaining multiple SDKs, model lists, and request shapes just to keep inference working across OpenAI, Anthropic, Gemini, and others. ",{"type":17,"tag":133,"props":170716,"children":170717},{"href":16186},[170718],{"type":23,"value":137141},{"type":23,"value":170720}," integration exists to reduce that integration surface area.",{"type":17,"tag":29,"props":170722,"children":170723},{},[170724,170726,170730,170732,170736],{"type":23,"value":170725},"In this guide, we'll explain what a Generative AI API covers, which objects matter in practice, how requests behave in production, and how Unified's ",{"type":17,"tag":133,"props":170727,"children":170728},{"href":16186},[170729],{"type":23,"value":25249},{"type":23,"value":170731}," fits alongside Storage, KMS, Repository, Messaging, and ",{"type":17,"tag":133,"props":170733,"children":170734},{"href":326},[170735],{"type":23,"value":329},{"type":23,"value":170737}," in the broader platform.",{"type":17,"tag":68,"props":170739,"children":170741},{"id":170740},"introduction-to-generative-ai-api-integrations",[170742],{"type":23,"value":170743},"Introduction to Generative AI API Integrations",{"type":17,"tag":29,"props":170745,"children":170746},{},[170747],{"type":23,"value":170748},"Generative AI providers such as OpenAI, Anthropic Claude, Google Gemini, Cohere, MistralAI, Groq, Hugging Face, Azure OpenAI, DeepSeek, and others each ship their own APIs, auth patterns, and request/response formats.",{"type":17,"tag":29,"props":170750,"children":170751},{},[170752],{"type":23,"value":170753},"Products that support multiple model providers usually run into:",{"type":17,"tag":80,"props":170755,"children":170756},{},[170757,170762,170767,170772],{"type":17,"tag":84,"props":170758,"children":170759},{},[170760],{"type":23,"value":170761},"Different chat message formats and response shapes",{"type":17,"tag":84,"props":170763,"children":170764},{},[170765],{"type":23,"value":170766},"Provider-specific model catalogs and capability flags (temperature, max token behavior, tool support)",{"type":17,"tag":84,"props":170768,"children":170769},{},[170770],{"type":23,"value":170771},"Separate embedding endpoints with inconsistent vector formats and dimensionality options",{"type":17,"tag":84,"props":170773,"children":170774},{},[170775,170777,170780],{"type":23,"value":170776},"Provider-specific failure modes when a model is unavailable or rate-limited",{"type":17,"tag":3891,"props":170778,"children":170779},{},[],{"type":23,"value":170781},"A Generative AI API provides a category-scoped interface for model discovery, prompt execution, and embedding generation across providers.",{"type":17,"tag":68,"props":170783,"children":170784},{"id":16176},[170785],{"type":23,"value":170786},"What Is a Generative AI API?",{"type":17,"tag":29,"props":170788,"children":170789},{},[170790],{"type":23,"value":170791},"A Generative AI API allows applications to programmatically:",{"type":17,"tag":80,"props":170793,"children":170794},{},[170795,170800,170805],{"type":17,"tag":84,"props":170796,"children":170797},{},[170798],{"type":23,"value":170799},"List available models and model capabilities",{"type":17,"tag":84,"props":170801,"children":170802},{},[170803],{"type":23,"value":170804},"Send prompts/messages to an LLM and receive responses",{"type":17,"tag":84,"props":170806,"children":170807},{},[170808,170810,170813],{"type":23,"value":170809},"Generate embeddings for text inputs",{"type":17,"tag":3891,"props":170811,"children":170812},{},[],{"type":23,"value":170814},"It focuses on model calls and embedding generation. It is not a chat product, a vector database, or a place to store prompt history.",{"type":17,"tag":68,"props":170816,"children":170818},{"id":170817},"generative-ai-api-vs-storage-kms-repository-messaging-and-mcp",[170819],{"type":23,"value":170820},"Generative AI API vs Storage, KMS, Repository, Messaging, and MCP",{"type":17,"tag":29,"props":170822,"children":170823},{},[170824],{"type":23,"value":170825},"Unified keeps clear boundaries between categories:",{"type":17,"tag":80,"props":170827,"children":170828},{},[170829,170834,170839,170844,170849,170854],{"type":17,"tag":84,"props":170830,"children":170831},{},[170832],{"type":23,"value":170833},"GenAI handles Model, Prompt, and Embedding objects across LLM providers.",{"type":17,"tag":84,"props":170835,"children":170836},{},[170837],{"type":23,"value":170838},"Storage handles files and folders (download URLs, hierarchical traversal, metadata).",{"type":17,"tag":84,"props":170840,"children":170841},{},[170842],{"type":23,"value":170843},"KMS handles spaces, pages, and comments in knowledge platforms (Confluence, Notion, Guru, etc.).",{"type":17,"tag":84,"props":170845,"children":170846},{},[170847],{"type":23,"value":170848},"Repository handles orgs, repos, branches, commits, and pull requests in version control systems.",{"type":17,"tag":84,"props":170850,"children":170851},{},[170852],{"type":23,"value":170853},"Messaging handles channels, messages, and events in chat platforms.",{"type":17,"tag":84,"props":170855,"children":170856},{},[170857,170859,170862],{"type":23,"value":170858},"MCP is the tool execution layer. It makes Unified integrations callable as tools inside LLM workflows.",{"type":17,"tag":3891,"props":170860,"children":170861},{},[],{"type":23,"value":170863},"GenAI can be used alongside these categories (for example, embedding KMS pages or summarizing storage files), but those objects remain in their own APIs.",{"type":17,"tag":68,"props":170865,"children":170867},{"id":170866},"real-time-behavior-and-request-state",[170868],{"type":23,"value":170869},"Real-Time Behavior and Request State",{"type":17,"tag":239,"props":170871,"children":170873},{"id":170872},"live-requests-to-model-providers",[170874],{"type":23,"value":170875},"Live requests to model providers",{"type":17,"tag":29,"props":170877,"children":170878},{},[170879],{"type":23,"value":170880},"GenAI requests are executed against the selected provider in real time. Unified does not run sync jobs or maintain stored copies of prompt inputs, outputs, or embeddings.",{"type":17,"tag":239,"props":170882,"children":170884},{"id":170883},"stateless-execution-for-prompt-and-embedding",[170885],{"type":23,"value":170886},"Stateless execution for Prompt and Embedding",{"type":17,"tag":29,"props":170888,"children":170889},{},[170890],{"type":23,"value":170891},"Prompts and embeddings are one-shot operations:",{"type":17,"tag":80,"props":170893,"children":170894},{},[170895,170900,170905],{"type":17,"tag":84,"props":170896,"children":170897},{},[170898],{"type":23,"value":170899},"There is no prompt ID.",{"type":17,"tag":84,"props":170901,"children":170902},{},[170903],{"type":23,"value":170904},"There are no list or retrieve endpoints for prompts or embeddings.",{"type":17,"tag":84,"props":170906,"children":170907},{},[170908,170910,170913],{"type":23,"value":170909},"If you need history, you include it yourself in the messages array or store it in your system.",{"type":17,"tag":3891,"props":170911,"children":170912},{},[],{"type":23,"value":170914},"Models are different: they can be listed and retrieved as catalog metadata.",{"type":17,"tag":68,"props":170916,"children":170918},{"id":170917},"core-genai-data-models",[170919],{"type":23,"value":170920},"Core GenAI Data Models",{"type":17,"tag":29,"props":170922,"children":170923},{},[170924],{"type":23,"value":170925},"Unified normalizes three objects in the GenAI category.",{"type":17,"tag":239,"props":170927,"children":170929},{"id":170928},"model",[170930],{"type":23,"value":16997},{"type":17,"tag":29,"props":170932,"children":170933},{},[170934],{"type":23,"value":170935},"Models represent provider model metadata.",{"type":17,"tag":29,"props":170937,"children":170938},{},[170939],{"type":23,"value":72497},{"type":17,"tag":80,"props":170941,"children":170942},{},[170943,170948,170952,170957],{"type":17,"tag":84,"props":170944,"children":170945},{},[170946],{"type":23,"value":170947},"id, name, description",{"type":17,"tag":84,"props":170949,"children":170950},{},[170951],{"type":23,"value":74702},{"type":17,"tag":84,"props":170953,"children":170954},{},[170955],{"type":23,"value":170956},"has_temperature",{"type":17,"tag":84,"props":170958,"children":170959},{},[170960,170961,170964],{"type":23,"value":12107},{"type":17,"tag":3891,"props":170962,"children":170963},{},[],{"type":23,"value":170965},"Models are read-only. Your application lists models to discover what's available and to understand capability flags (for example, whether temperature is supported).",{"type":17,"tag":239,"props":170967,"children":170969},{"id":170968},"prompt",[170970],{"type":23,"value":17010},{"type":17,"tag":29,"props":170972,"children":170973},{},[170974],{"type":23,"value":170975},"Prompts represent a single inference request and its response.",{"type":17,"tag":29,"props":170977,"children":170978},{},[170979],{"type":23,"value":170980},"Key request fields include:",{"type":17,"tag":80,"props":170982,"children":170983},{},[170984,170988,170995,171000,171009,171016,171025,171030],{"type":17,"tag":84,"props":170985,"children":170986},{},[170987],{"type":23,"value":74684},{"type":17,"tag":84,"props":170989,"children":170990},{},[170991,170992],{"type":23,"value":137672},{"type":17,"tag":22203,"props":170993,"children":170994},{},[],{"type":17,"tag":84,"props":170996,"children":170997},{},[170998],{"type":23,"value":170999},"temperature (when supported by the model)",{"type":17,"tag":84,"props":171001,"children":171002},{},[171003,171004,171007],{"type":23,"value":74702},{"type":17,"tag":3891,"props":171005,"children":171006},{},[],{"type":23,"value":171008},"Key response fields include:",{"type":17,"tag":84,"props":171010,"children":171011},{},[171012,171013],{"type":23,"value":137685},{"type":17,"tag":22203,"props":171014,"children":171015},{},[],{"type":17,"tag":84,"props":171017,"children":171018},{},[171019,171020,171023],{"type":23,"value":137690},{"type":17,"tag":3891,"props":171021,"children":171022},{},[],{"type":23,"value":171024},"MCP-related fields exist on the Prompt object:",{"type":17,"tag":84,"props":171026,"children":171027},{},[171028],{"type":23,"value":171029},"mcp_url (optional)",{"type":17,"tag":84,"props":171031,"children":171032},{},[171033,171035,171038],{"type":23,"value":171034},"mcp_deferred_tools (optional)",{"type":17,"tag":3891,"props":171036,"children":171037},{},[],{"type":23,"value":171039},"These support workflows where a model call needs to reference MCP tooling, but GenAI itself does not create conversation threads or retain state between calls.",{"type":17,"tag":239,"props":171041,"children":171043},{"id":171042},"embedding",[171044],{"type":23,"value":17023},{"type":17,"tag":29,"props":171046,"children":171047},{},[171048],{"type":23,"value":171049},"Embeddings represent a single embedding request and its returned vector.",{"type":17,"tag":29,"props":171051,"children":171052},{},[171053],{"type":23,"value":72497},{"type":17,"tag":80,"props":171055,"children":171056},{},[171057,171061,171065,171070,171074,171078,171082],{"type":17,"tag":84,"props":171058,"children":171059},{},[171060],{"type":23,"value":74684},{"type":17,"tag":84,"props":171062,"children":171063},{},[171064],{"type":23,"value":1679},{"type":17,"tag":84,"props":171066,"children":171067},{},[171068],{"type":23,"value":171069},"encoding_format",{"type":17,"tag":84,"props":171071,"children":171072},{},[171073],{"type":23,"value":137713},{"type":17,"tag":84,"props":171075,"children":171076},{},[171077],{"type":23,"value":27310},{"type":17,"tag":84,"props":171079,"children":171080},{},[171081],{"type":23,"value":16213},{"type":17,"tag":84,"props":171083,"children":171084},{},[171085,171086,171089],{"type":23,"value":137690},{"type":17,"tag":3891,"props":171087,"children":171088},{},[],{"type":23,"value":171090},"Embeddings are returned to your application. Unified does not provide a vector index or vector search layer. If you need retrieval, you store vectors in your own database and handle similarity search there.",{"type":17,"tag":68,"props":171092,"children":171094},{"id":171093},"identity-and-cross-category-isolation",[171095],{"type":23,"value":171096},"Identity and Cross-Category Isolation",{"type":17,"tag":29,"props":171098,"children":171099},{},[171100],{"type":23,"value":171101},"GenAI objects do not reference Storage files, KMS pages, Repository objects, CRM entities, or Ticketing objects.",{"type":17,"tag":80,"props":171103,"children":171104},{},[171105,171110,171115],{"type":17,"tag":84,"props":171106,"children":171107},{},[171108],{"type":23,"value":171109},"Model identifiers map to LLM providers' model naming.",{"type":17,"tag":84,"props":171111,"children":171112},{},[171113],{"type":23,"value":171114},"Prompts reference a model_id and carry messages and responses for that request only.",{"type":17,"tag":84,"props":171116,"children":171117},{},[171118,171120,171123],{"type":23,"value":171119},"Embeddings reference a model_id and return vectors for that request only.",{"type":17,"tag":3891,"props":171121,"children":171122},{},[],{"type":23,"value":171124},"If you want to connect GenAI outputs to other systems, you do it explicitly in your application (for example, store an embedding alongside the KMS page ID you generated it from).",{"type":17,"tag":68,"props":171126,"children":171128},{"id":171127},"updates-events-and-polling",[171129],{"type":23,"value":171130},"Updates, Events, and Polling",{"type":17,"tag":29,"props":171132,"children":171133},{},[171134],{"type":23,"value":171135},"GenAI does not behave like event-driven SaaS categories (Ticketing, Shipping, CRM) because prompts and embeddings are terminal operations.",{"type":17,"tag":80,"props":171137,"children":171138},{},[171139,171144,171149],{"type":17,"tag":84,"props":171140,"children":171141},{},[171142],{"type":23,"value":171143},"No webhooks are emitted for Prompt or Embedding objects.",{"type":17,"tag":84,"props":171145,"children":171146},{},[171147],{"type":23,"value":171148},"There is nothing to poll for prompts or embeddings because there are no list endpoints.",{"type":17,"tag":84,"props":171150,"children":171151},{},[171152],{"type":23,"value":171153},"Models can be polled via the models list endpoint (including updated_gte support) to detect catalog changes over time.",{"type":17,"tag":68,"props":171155,"children":171157},{"id":171156},"common-genai-api-integration-use-cases",[171158],{"type":23,"value":171159},"Common GenAI API Integration Use Cases",{"type":17,"tag":239,"props":171161,"children":171163},{"id":171162},"multi-model-inference",[171164],{"type":23,"value":171165},"Multi-model inference",{"type":17,"tag":29,"props":171167,"children":171168},{},[171169],{"type":23,"value":171170},"Route prompt execution across multiple providers without rewriting request formats per vendor. This is useful for provider fallback, latency-sensitive workloads, and controlled rollout across models.",{"type":17,"tag":239,"props":171172,"children":171173},{"id":17107},[171174],{"type":23,"value":17110},{"type":17,"tag":29,"props":171176,"children":171177},{},[171178],{"type":23,"value":171179},"Send the same prompt to multiple model IDs and compare responses, token usage, and output differences. Useful for evaluation workflows and regression testing.",{"type":17,"tag":239,"props":171181,"children":171183},{"id":171182},"embedding-generation-for-retrieval",[171184],{"type":23,"value":171185},"Embedding generation for retrieval",{"type":17,"tag":29,"props":171187,"children":171188},{},[171189],{"type":23,"value":171190},"Generate embeddings using the provider you want, store vectors in your own system, and build retrieval on top of your stored vectors.",{"type":17,"tag":239,"props":171192,"children":171194},{"id":171193},"prompt-testing-and-management",[171195],{"type":23,"value":171196},"Prompt testing and management",{"type":17,"tag":29,"props":171198,"children":171199},{},[171200],{"type":23,"value":171201},"Standardize how your team defines prompt payloads and model selection logic so prompt changes don't require per-provider rewrites.",{"type":17,"tag":68,"props":171203,"children":171205},{"id":171204},"security-and-data-handling",[171206],{"type":23,"value":171207},"Security and Data Handling",{"type":17,"tag":29,"props":171209,"children":171210},{},[171211],{"type":23,"value":171212},"GenAI requests and responses can include sensitive content. Unified's architecture is designed to avoid creating a data store of prompt content.",{"type":17,"tag":80,"props":171214,"children":171215},{},[171216,171221,171226],{"type":17,"tag":84,"props":171217,"children":171218},{},[171219],{"type":23,"value":171220},"Requests are executed in real time.",{"type":17,"tag":84,"props":171222,"children":171223},{},[171224],{"type":23,"value":171225},"Prompt payloads, responses, and embedding vectors are returned to your application.",{"type":17,"tag":84,"props":171227,"children":171228},{},[171229,171231,171234],{"type":23,"value":171230},"If you need persistence, you store the data in your own infrastructure.",{"type":17,"tag":3891,"props":171232,"children":171233},{},[],{"type":23,"value":171235},"Provider retention policies still apply at the model provider layer. Your compliance posture depends on both your own retention decisions and the provider configuration you choose.",{"type":17,"tag":68,"props":171237,"children":171239},{"id":171238},"build-vs-maintain-multi-provider-genai-integrations",[171240],{"type":23,"value":171241},"Build vs Maintain Multi-Provider GenAI Integrations",{"type":17,"tag":239,"props":171243,"children":171244},{"id":165021},[171245],{"type":23,"value":171246},"Building in-house",{"type":17,"tag":80,"props":171248,"children":171249},{},[171250,171255,171260,171265],{"type":17,"tag":84,"props":171251,"children":171252},{},[171253],{"type":23,"value":171254},"Multiple provider SDKs and auth patterns",{"type":17,"tag":84,"props":171256,"children":171257},{},[171258],{"type":23,"value":171259},"Different request/response shapes per provider",{"type":17,"tag":84,"props":171261,"children":171262},{},[171263],{"type":23,"value":171264},"Separate model catalogs and capability flags",{"type":17,"tag":84,"props":171266,"children":171267},{},[171268],{"type":23,"value":171269},"Extra work to implement routing and fallback consistently",{"type":17,"tag":239,"props":171271,"children":171273},{"id":171272},"using-unifieds-genai-api",[171274],{"type":23,"value":171275},"Using Unified's GenAI API",{"type":17,"tag":80,"props":171277,"children":171278},{},[171279,171284,171289,171294],{"type":17,"tag":84,"props":171280,"children":171281},{},[171282],{"type":23,"value":171283},"A category-scoped API surface for models, prompts, and embeddings",{"type":17,"tag":84,"props":171285,"children":171286},{},[171287],{"type":23,"value":171288},"Unified request shapes across providers",{"type":17,"tag":84,"props":171290,"children":171291},{},[171292],{"type":23,"value":171293},"Clear separation from content categories (Storage, KMS, Repository) and execution tooling (MCP)",{"type":17,"tag":84,"props":171295,"children":171296},{},[171297],{"type":23,"value":171298},"Direct control over what your application stores",{"type":17,"tag":68,"props":171300,"children":171302},{"id":171301},"best-practices-for-genai-integrations",[171303],{"type":23,"value":171304},"Best Practices for GenAI Integrations",{"type":17,"tag":80,"props":171306,"children":171307},{},[171308,171313,171318,171323,171328],{"type":17,"tag":84,"props":171309,"children":171310},{},[171311],{"type":23,"value":171312},"Treat Prompt and Embedding as execution calls, not stored objects.",{"type":17,"tag":84,"props":171314,"children":171315},{},[171316],{"type":23,"value":171317},"Persist only what you need (and decide retention explicitly).",{"type":17,"tag":84,"props":171319,"children":171320},{},[171321],{"type":23,"value":171322},"Use Model metadata to drive feature flags (temperature support, token limits).",{"type":17,"tag":84,"props":171324,"children":171325},{},[171326],{"type":23,"value":171327},"Store embeddings in your own vector store, keep model_id and dimension alongside them.",{"type":17,"tag":84,"props":171329,"children":171330},{},[171331],{"type":23,"value":171332},"Keep category boundaries clean: retrieve content via Storage/KMS/Repository, generate via GenAI, execute tools via MCP.",{"type":17,"tag":68,"props":171334,"children":171336},{"id":171335},"build-genai-integrations-that-stay-portable",[171337],{"type":23,"value":171338},"Build GenAI integrations that stay portable",{"type":17,"tag":29,"props":171340,"children":171341},{},[171342],{"type":23,"value":171343},"If your product supports multiple model providers, you need consistent request shapes, predictable model discovery, and a clean separation between model execution and the data your application stores.",{"type":17,"tag":29,"props":171345,"children":171346},{},[171347],{"type":23,"value":171348},"Unified's GenAI API gives you normalized Model, Prompt, and Embedding objects across providers, while keeping execution stateless and category boundaries intact.",{"type":17,"tag":29,"props":171350,"children":171351},{},[171352,171353],{"type":23,"value":1609},{"type":17,"tag":133,"props":171354,"children":171356},{"href":1612,"rel":171355},[214],[171357],{"type":23,"value":1616},{"type":17,"tag":29,"props":171359,"children":171360},{},[171361,171362],{"type":23,"value":1609},{"type":17,"tag":133,"props":171363,"children":171365},{"href":1623,"rel":171364},[214],[171366],{"type":23,"value":1627},{"type":17,"tag":68,"props":171368,"children":171369},{"id":95759},[171370],{"type":23,"value":95762},{"type":17,"tag":29,"props":171372,"children":171373},{},[171374],{"type":17,"tag":48,"props":171375,"children":171376},{},[171377],{"type":23,"value":171378},"What does the GenAI API cover?",{"type":17,"tag":29,"props":171380,"children":171381},{},[171382],{"type":23,"value":171383},"Models, prompt execution, and embedding generation across multiple LLM providers.",{"type":17,"tag":29,"props":171385,"children":171386},{},[171387],{"type":17,"tag":48,"props":171388,"children":171389},{},[171390],{"type":23,"value":171391},"Does Unified store prompt history or embeddings?",{"type":17,"tag":29,"props":171393,"children":171394},{},[171395],{"type":23,"value":171396},"No. Prompts and embeddings are returned in the response. Persistence is handled by your application.",{"type":17,"tag":29,"props":171398,"children":171399},{},[171400],{"type":17,"tag":48,"props":171401,"children":171402},{},[171403],{"type":23,"value":171404},"Is there a vector database included?",{"type":17,"tag":29,"props":171406,"children":171407},{},[171408],{"type":23,"value":171409},"No. The API returns embedding vectors only. Vector storage and retrieval are handled externally.",{"type":17,"tag":29,"props":171411,"children":171412},{},[171413],{"type":17,"tag":48,"props":171414,"children":171415},{},[171416],{"type":23,"value":171417},"How does this relate to MCP?",{"type":17,"tag":29,"props":171419,"children":171420},{},[171421],{"type":23,"value":171422},"GenAI handles model calls and embeddings. MCP is the tool execution layer that makes Unified integrations callable inside LLM workflows.",{"type":17,"tag":29,"props":171424,"children":171425},{},[171426],{"type":17,"tag":48,"props":171427,"children":171428},{},[171429],{"type":23,"value":171430},"Which providers are supported?",{"type":17,"tag":29,"props":171432,"children":171433},{},[171434],{"type":23,"value":171435},"Unified's GenAI category includes providers such as OpenAI, Anthropic, Google Gemini, Cohere, MistralAI, Groq, Hugging Face, Azure OpenAI, DeepSeek, AnyScale, and X.ai Grok.",{"title":7,"searchDepth":1629,"depth":1629,"links":171437},[171438,171439,171440,171441,171445,171450,171451,171452,171458,171459,171463,171464,171465],{"id":170740,"depth":1629,"text":170743},{"id":16176,"depth":1629,"text":170786},{"id":170817,"depth":1629,"text":170820},{"id":170866,"depth":1629,"text":170869,"children":171442},[171443,171444],{"id":170872,"depth":1635,"text":170875},{"id":170883,"depth":1635,"text":170886},{"id":170917,"depth":1629,"text":170920,"children":171446},[171447,171448,171449],{"id":170928,"depth":1635,"text":16997},{"id":170968,"depth":1635,"text":17010},{"id":171042,"depth":1635,"text":17023},{"id":171093,"depth":1629,"text":171096},{"id":171127,"depth":1629,"text":171130},{"id":171156,"depth":1629,"text":171159,"children":171453},[171454,171455,171456,171457],{"id":171162,"depth":1635,"text":171165},{"id":17107,"depth":1635,"text":17110},{"id":171182,"depth":1635,"text":171185},{"id":171193,"depth":1635,"text":171196},{"id":171204,"depth":1629,"text":171207},{"id":171238,"depth":1629,"text":171241,"children":171460},[171461,171462],{"id":165021,"depth":1635,"text":171246},{"id":171272,"depth":1635,"text":171275},{"id":171301,"depth":1629,"text":171304},{"id":171335,"depth":1629,"text":171338},{"id":95759,"depth":1629,"text":95762},"content:blog:generative_ai_api_integration_multi_model_prompts_routing_and_embeddings_across_providers.md","blog/generative_ai_api_integration_multi_model_prompts_routing_and_embeddings_across_providers.md","blog/generative_ai_api_integration_multi_model_prompts_routing_and_embeddings_across_providers",{"_path":171470,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":171471,"description":171472,"img":171473,"date":170692,"tag":12,"body":171474,"_type":1677,"_id":172820,"_source":1679,"_file":172821,"_stem":172822,"_extension":1682},"/blog/repository_api_integration_repositories_pull_requests_and_commit_activity_across_git_platforms","Repository API Integration: Repositories, Pull Requests, and Commit Activity Across Git Platforms","Repository data is where software delivery becomes observable. Repositories change, commits land, branches move, pull requests shift state, and ownership lives...","https://s3.us-east-2.amazonaws.com/unified-article-images/repository_api_integration_repositories_pull_requests_and_commit_activity_across_git_platforms-icon.png",{"type":14,"children":171475,"toc":172781},[171476,171481,171484,171491,171496,171501,171506,171512,171517,171545,171550,171555,171560,171565,171592,171597,171603,171608,171665,171670,171676,171687,171692,171698,171703,171708,171713,171717,171777,171781,171786,171790,171857,171861,171866,171870,171909,171914,171919,171923,171980,171985,171991,171996,172000,172073,172079,172084,172136,172141,172147,172152,172182,172206,172212,172217,172245,172250,172256,172261,172265,172270,172297,172302,172307,172312,172351,172356,172386,172392,172397,172403,172408,172412,172417,172435,172441,172446,172469,172474,172480,172515,172521,172527,172532,172538,172543,172549,172554,172560,172565,172569,172608,172613,172619,172623,172646,172652,172675,172681,172686,172691,172702,172712,172716,172724,172729,172737,172742,172750,172755,172763,172768,172776],{"type":17,"tag":18,"props":171477,"children":171479},{"id":171478},"repository-api-integration-repositories-pull-requests-and-commit-activity-across-git-platforms",[171480],{"type":23,"value":171471},{"type":17,"tag":25,"props":171482,"children":171483},{},[],{"type":17,"tag":29,"props":171485,"children":171486},{},[171487],{"type":17,"tag":33,"props":171488,"children":171489},{},[171490],{"type":23,"value":165325},{"type":17,"tag":29,"props":171492,"children":171493},{},[171494],{"type":23,"value":171495},"Repository data is where software delivery becomes observable. Repositories change, commits land, branches move, pull requests shift state, and ownership lives in review queues. When repo data is fragmented across GitHub, GitLab, and Bitbucket—or pulled through delayed sync—teams lose visibility into review bottlenecks, contribution patterns, and release readiness.",{"type":17,"tag":29,"props":171497,"children":171498},{},[171499],{"type":23,"value":171500},"Repository API integration exists to solve this problem.",{"type":17,"tag":29,"props":171502,"children":171503},{},[171504],{"type":23,"value":171505},"In this guide, we'll explain what a Repository API covers, which objects matter in practice, how repo lifecycles behave, how updates are delivered, and how Unified's Repository API fits alongside Tasks, Ticketing, Knowledge Management, and File Storage in the Knowledge & Development group.",{"type":17,"tag":68,"props":171507,"children":171509},{"id":171508},"introduction-to-repository-api-integrations",[171510],{"type":23,"value":171511},"Introduction to Repository API Integrations",{"type":17,"tag":29,"props":171513,"children":171514},{},[171515],{"type":23,"value":171516},"Version control platforms such as GitHub, GitLab, and Bitbucket store the core objects behind modern development:",{"type":17,"tag":80,"props":171518,"children":171519},{},[171520,171525,171530,171535,171540],{"type":17,"tag":84,"props":171521,"children":171522},{},[171523],{"type":23,"value":171524},"Organizations and workspaces",{"type":17,"tag":84,"props":171526,"children":171527},{},[171528],{"type":23,"value":171529},"Repositories",{"type":17,"tag":84,"props":171531,"children":171532},{},[171533],{"type":23,"value":171534},"Branches and commit history",{"type":17,"tag":84,"props":171536,"children":171537},{},[171538],{"type":23,"value":171539},"Pull requests and merge requests",{"type":17,"tag":84,"props":171541,"children":171542},{},[171543],{"type":23,"value":171544},"Review state, labels, and closure timestamps",{"type":17,"tag":29,"props":171546,"children":171547},{},[171548],{"type":23,"value":171549},"Each provider models these objects differently. Even basic concepts—what counts as an organization, how PR status is represented, which list filters exist—vary enough that supporting multiple providers becomes ongoing maintenance.",{"type":17,"tag":29,"props":171551,"children":171552},{},[171553],{"type":23,"value":171554},"A Repository API provides a consistent way to read repository metadata and activity across providers without building separate integrations.",{"type":17,"tag":68,"props":171556,"children":171557},{"id":17403},[171558],{"type":23,"value":171559},"What Is a Repository API?",{"type":17,"tag":29,"props":171561,"children":171562},{},[171563],{"type":23,"value":171564},"A Repository API allows applications to programmatically access repository and code review metadata, including:",{"type":17,"tag":80,"props":171566,"children":171567},{},[171568,171573,171577,171582,171587],{"type":17,"tag":84,"props":171569,"children":171570},{},[171571],{"type":23,"value":171572},"Organizations (orgs, groups, workspaces)",{"type":17,"tag":84,"props":171574,"children":171575},{},[171576],{"type":23,"value":171529},{"type":17,"tag":84,"props":171578,"children":171579},{},[171580],{"type":23,"value":171581},"Branches",{"type":17,"tag":84,"props":171583,"children":171584},{},[171585],{"type":23,"value":171586},"Commits (metadata and authorship)",{"type":17,"tag":84,"props":171588,"children":171589},{},[171590],{"type":23,"value":171591},"Pull requests (state, labels, closure)",{"type":17,"tag":29,"props":171593,"children":171594},{},[171595],{"type":23,"value":171596},"Repository APIs focus on version control objects and review state. They do not replace task tracking, support ticketing, file storage, documentation systems, or generative model execution.",{"type":17,"tag":68,"props":171598,"children":171600},{"id":171599},"repository-api-vs-tasks-ticketing-kms-storage-and-genai",[171601],{"type":23,"value":171602},"Repository API vs Tasks, Ticketing, KMS, Storage, and GenAI",{"type":17,"tag":29,"props":171604,"children":171605},{},[171606],{"type":23,"value":171607},"Unified keeps category boundaries explicit.",{"type":17,"tag":80,"props":171609,"children":171610},{},[171611,171620,171629,171638,171647,171656],{"type":17,"tag":84,"props":171612,"children":171613},{},[171614,171618],{"type":17,"tag":48,"props":171615,"children":171616},{},[171617],{"type":23,"value":18059},{"type":23,"value":171619}," covers organizations, repositories, branches, commits, and pull requests.",{"type":17,"tag":84,"props":171621,"children":171622},{},[171623,171627],{"type":17,"tag":48,"props":171624,"children":171625},{},[171626],{"type":23,"value":164050},{"type":23,"value":171628}," covers tasks, projects, and work tracking objects.",{"type":17,"tag":84,"props":171630,"children":171631},{},[171632,171636],{"type":17,"tag":48,"props":171633,"children":171634},{},[171635],{"type":23,"value":24541},{"type":23,"value":171637}," covers tickets, customers, notes, and categories.",{"type":17,"tag":84,"props":171639,"children":171640},{},[171641,171645],{"type":17,"tag":48,"props":171642,"children":171643},{},[171644],{"type":23,"value":163836},{"type":23,"value":171646}," covers spaces, pages, and comments for knowledge content.",{"type":17,"tag":84,"props":171648,"children":171649},{},[171650,171654],{"type":17,"tag":48,"props":171651,"children":171652},{},[171653],{"type":23,"value":96511},{"type":23,"value":171655}," covers files and folders across cloud storage providers.",{"type":17,"tag":84,"props":171657,"children":171658},{},[171659,171663],{"type":17,"tag":48,"props":171660,"children":171661},{},[171662],{"type":23,"value":24595},{"type":23,"value":171664}," covers models, embeddings, prompts, and generation.",{"type":17,"tag":29,"props":171666,"children":171667},{},[171668],{"type":23,"value":171669},"Repository objects don't embed task IDs, ticket IDs, page IDs, or file IDs. If your product needs cross-domain views, you compose categories intentionally.",{"type":17,"tag":68,"props":171671,"children":171673},{"id":171672},"real-time-access-to-repository-data",[171674],{"type":23,"value":171675},"Real-Time Access to Repository Data",{"type":17,"tag":29,"props":171677,"children":171678},{},[171679,171681,171685],{"type":23,"value":171680},"Unified routes each Repository API request directly to the source provider. There is no cached replica. Reads reflect the provider's current state, subject to ",{"type":17,"tag":133,"props":171682,"children":171683},{"href":135},[171684],{"type":23,"value":138},{"type":23,"value":171686}," and availability.",{"type":17,"tag":29,"props":171688,"children":171689},{},[171690],{"type":23,"value":171691},"Update delivery depends on provider support. Some objects can be monitored through virtual webhook delivery; others require polling.",{"type":17,"tag":68,"props":171693,"children":171695},{"id":171694},"core-repository-data-models",[171696],{"type":23,"value":171697},"Core Repository Data Models",{"type":17,"tag":29,"props":171699,"children":171700},{},[171701],{"type":23,"value":171702},"Unified normalizes repository data into five objects: Organization, Repository, Branch, Commit, and Pullrequest.",{"type":17,"tag":239,"props":171704,"children":171706},{"id":171705},"organizations",[171707],{"type":23,"value":41703},{"type":17,"tag":29,"props":171709,"children":171710},{},[171711],{"type":23,"value":171712},"Organizations represent top-level containers like GitHub orgs or GitLab groups.",{"type":17,"tag":29,"props":171714,"children":171715},{},[171716],{"type":23,"value":163963},{"type":17,"tag":80,"props":171718,"children":171719},{},[171720,171740,171754,171769],{"type":17,"tag":84,"props":171721,"children":171722},{},[171723,171728,171729,171734,171735],{"type":17,"tag":6121,"props":171724,"children":171726},{"className":171725},[],[171727],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171730,"children":171732},{"className":171731},[],[171733],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171736,"children":171738},{"className":171737},[],[171739],{"type":23,"value":25337},{"type":17,"tag":84,"props":171741,"children":171742},{},[171743,171748,171749],{"type":17,"tag":6121,"props":171744,"children":171746},{"className":171745},[],[171747],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171750,"children":171752},{"className":171751},[],[171753],{"type":23,"value":24679},{"type":17,"tag":84,"props":171755,"children":171756},{},[171757,171763,171764],{"type":17,"tag":6121,"props":171758,"children":171760},{"className":171759},[],[171761],{"type":23,"value":171762},"avatar_url",{"type":23,"value":11826},{"type":17,"tag":6121,"props":171765,"children":171767},{"className":171766},[],[171768],{"type":23,"value":12107},{"type":17,"tag":84,"props":171770,"children":171771},{},[171772],{"type":17,"tag":6121,"props":171773,"children":171775},{"className":171774},[],[171776],{"type":23,"value":111357},{"type":17,"tag":239,"props":171778,"children":171779},{"id":17424},[171780],{"type":23,"value":171529},{"type":17,"tag":29,"props":171782,"children":171783},{},[171784],{"type":23,"value":171785},"Repositories represent code repositories inside an organization.",{"type":17,"tag":29,"props":171787,"children":171788},{},[171789],{"type":23,"value":163963},{"type":17,"tag":80,"props":171791,"children":171792},{},[171793,171813,171827,171841,171849],{"type":17,"tag":84,"props":171794,"children":171795},{},[171796,171801,171802,171807,171808],{"type":17,"tag":6121,"props":171797,"children":171799},{"className":171798},[],[171800],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171803,"children":171805},{"className":171804},[],[171806],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171809,"children":171811},{"className":171810},[],[171812],{"type":23,"value":25337},{"type":17,"tag":84,"props":171814,"children":171815},{},[171816,171821,171822],{"type":17,"tag":6121,"props":171817,"children":171819},{"className":171818},[],[171820],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171823,"children":171825},{"className":171824},[],[171826],{"type":23,"value":24679},{"type":17,"tag":84,"props":171828,"children":171829},{},[171830,171835,171836],{"type":17,"tag":6121,"props":171831,"children":171833},{"className":171832},[],[171834],{"type":23,"value":111073},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171837,"children":171839},{"className":171838},[],[171840],{"type":23,"value":111086},{"type":17,"tag":84,"props":171842,"children":171843},{},[171844],{"type":17,"tag":6121,"props":171845,"children":171847},{"className":171846},[],[171848],{"type":23,"value":12107},{"type":17,"tag":84,"props":171850,"children":171851},{},[171852],{"type":17,"tag":6121,"props":171853,"children":171855},{"className":171854},[],[171856],{"type":23,"value":11980},{"type":17,"tag":239,"props":171858,"children":171859},{"id":17434},[171860],{"type":23,"value":171581},{"type":17,"tag":29,"props":171862,"children":171863},{},[171864],{"type":23,"value":171865},"Branches represent Git branches.",{"type":17,"tag":29,"props":171867,"children":171868},{},[171869],{"type":23,"value":163963},{"type":17,"tag":80,"props":171871,"children":171872},{},[171873,171893,171901],{"type":17,"tag":84,"props":171874,"children":171875},{},[171876,171881,171882,171887,171888],{"type":17,"tag":6121,"props":171877,"children":171879},{"className":171878},[],[171880],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171883,"children":171885},{"className":171884},[],[171886],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171889,"children":171891},{"className":171890},[],[171892],{"type":23,"value":25337},{"type":17,"tag":84,"props":171894,"children":171895},{},[171896],{"type":17,"tag":6121,"props":171897,"children":171899},{"className":171898},[],[171900],{"type":23,"value":18781},{"type":17,"tag":84,"props":171902,"children":171903},{},[171904],{"type":17,"tag":6121,"props":171905,"children":171907},{"className":171906},[],[171908],{"type":23,"value":111176},{"type":17,"tag":239,"props":171910,"children":171911},{"id":17439},[171912],{"type":23,"value":171913},"Commits",{"type":17,"tag":29,"props":171915,"children":171916},{},[171917],{"type":23,"value":171918},"Commits represent Git commits.",{"type":17,"tag":29,"props":171920,"children":171921},{},[171922],{"type":23,"value":163963},{"type":17,"tag":80,"props":171924,"children":171925},{},[171926,171936,171950,171958,171972],{"type":17,"tag":84,"props":171927,"children":171928},{},[171929,171934],{"type":17,"tag":6121,"props":171930,"children":171932},{"className":171931},[],[171933],{"type":23,"value":18766},{"type":23,"value":171935}," (commit hash)",{"type":17,"tag":84,"props":171937,"children":171938},{},[171939,171944,171945],{"type":17,"tag":6121,"props":171940,"children":171942},{"className":171941},[],[171943],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171946,"children":171948},{"className":171947},[],[171949],{"type":23,"value":25337},{"type":17,"tag":84,"props":171951,"children":171952},{},[171953],{"type":17,"tag":6121,"props":171954,"children":171956},{"className":171955},[],[171957],{"type":23,"value":62582},{"type":17,"tag":84,"props":171959,"children":171960},{},[171961,171966,171967],{"type":17,"tag":6121,"props":171962,"children":171964},{"className":171963},[],[171965],{"type":23,"value":111176},{"type":23,"value":11826},{"type":17,"tag":6121,"props":171968,"children":171970},{"className":171969},[],[171971],{"type":23,"value":111278},{"type":17,"tag":84,"props":171973,"children":171974},{},[171975],{"type":17,"tag":6121,"props":171976,"children":171978},{"className":171977},[],[171979],{"type":23,"value":24872},{"type":17,"tag":29,"props":171981,"children":171982},{},[171983],{"type":23,"value":171984},"Unified returns commit metadata. Code diffs and file contents are not part of the normalized commit object.",{"type":17,"tag":239,"props":171986,"children":171988},{"id":171987},"pull-requests",[171989],{"type":23,"value":171990},"Pull Requests",{"type":17,"tag":29,"props":171992,"children":171993},{},[171994],{"type":23,"value":171995},"Pull requests represent pull requests or merge requests.",{"type":17,"tag":29,"props":171997,"children":171998},{},[171999],{"type":23,"value":163963},{"type":17,"tag":80,"props":172001,"children":172002},{},[172003,172023,172031,172039,172049,172057,172065],{"type":17,"tag":84,"props":172004,"children":172005},{},[172006,172011,172012,172017,172018],{"type":17,"tag":6121,"props":172007,"children":172009},{"className":172008},[],[172010],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":172013,"children":172015},{"className":172014},[],[172016],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":172019,"children":172021},{"className":172020},[],[172022],{"type":23,"value":25337},{"type":17,"tag":84,"props":172024,"children":172025},{},[172026],{"type":17,"tag":6121,"props":172027,"children":172029},{"className":172028},[],[172030],{"type":23,"value":111176},{"type":17,"tag":84,"props":172032,"children":172033},{},[172034],{"type":17,"tag":6121,"props":172035,"children":172037},{"className":172036},[],[172038],{"type":23,"value":111357},{"type":17,"tag":84,"props":172040,"children":172041},{},[172042,172047],{"type":17,"tag":6121,"props":172043,"children":172045},{"className":172044},[],[172046],{"type":23,"value":19949},{"type":23,"value":172048}," (PENDING, APPROVED, REJECTED)",{"type":17,"tag":84,"props":172050,"children":172051},{},[172052],{"type":17,"tag":6121,"props":172053,"children":172055},{"className":172054},[],[172056],{"type":23,"value":34502},{"type":17,"tag":84,"props":172058,"children":172059},{},[172060],{"type":17,"tag":6121,"props":172061,"children":172063},{"className":172062},[],[172064],{"type":23,"value":62569},{"type":17,"tag":84,"props":172066,"children":172067},{},[172068],{"type":17,"tag":6121,"props":172069,"children":172071},{"className":172070},[],[172072],{"type":23,"value":111381},{"type":17,"tag":68,"props":172074,"children":172076},{"id":172075},"identity-and-ownership-in-repository-data",[172077],{"type":23,"value":172078},"Identity and Ownership in Repository Data",{"type":17,"tag":29,"props":172080,"children":172081},{},[172082],{"type":23,"value":172083},"Repository objects are provider-scoped and connection-scoped.",{"type":17,"tag":80,"props":172085,"children":172086},{},[172087,172115,172120],{"type":17,"tag":84,"props":172088,"children":172089},{},[172090,172095,172096,172101,172102,172107,172108,172113],{"type":17,"tag":6121,"props":172091,"children":172093},{"className":172092},[],[172094],{"type":23,"value":11980},{"type":23,"value":11826},{"type":17,"tag":6121,"props":172097,"children":172099},{"className":172098},[],[172100],{"type":23,"value":111176},{"type":23,"value":11826},{"type":17,"tag":6121,"props":172103,"children":172105},{"className":172104},[],[172106],{"type":23,"value":111278},{"type":23,"value":12561},{"type":17,"tag":6121,"props":172109,"children":172111},{"className":172110},[],[172112],{"type":23,"value":111381},{"type":23,"value":172114}," link objects within the repository domain.",{"type":17,"tag":84,"props":172116,"children":172117},{},[172118],{"type":23,"value":172119},"Commit and pull request IDs are stable within the provider namespace.",{"type":17,"tag":84,"props":172121,"children":172122},{},[172123,172128,172129,172134],{"type":17,"tag":6121,"props":172124,"children":172126},{"className":172125},[],[172127],{"type":23,"value":62582},{"type":23,"value":34435},{"type":17,"tag":6121,"props":172130,"children":172132},{"className":172131},[],[172133],{"type":23,"value":111357},{"type":23,"value":172135}," identify participants and can be mapped to employee identity where applicable.",{"type":17,"tag":29,"props":172137,"children":172138},{},[172139],{"type":23,"value":172140},"Repository objects do not reference tasks, tickets, knowledge pages, storage files, CRM contacts, or GenAI artifacts.",{"type":17,"tag":68,"props":172142,"children":172144},{"id":172143},"object-behavior-and-lifecycle-semantics",[172145],{"type":23,"value":172146},"Object Behavior and Lifecycle Semantics",{"type":17,"tag":29,"props":172148,"children":172149},{},[172150],{"type":23,"value":172151},"Repository objects behave like the underlying Git model:",{"type":17,"tag":80,"props":172153,"children":172154},{},[172155,172160,172172,172177],{"type":17,"tag":84,"props":172156,"children":172157},{},[172158],{"type":23,"value":172159},"Commits are immutable snapshots. Updating or deleting a commit generally implies rewriting history, which is destructive and not a standard integration pattern.",{"type":17,"tag":84,"props":172161,"children":172162},{},[172163,172165,172170],{"type":23,"value":172164},"Pull requests become terminal once closed. ",{"type":17,"tag":6121,"props":172166,"children":172168},{"className":172167},[],[172169],{"type":23,"value":62569},{"type":23,"value":172171}," captures closure time and status transitions stop.",{"type":17,"tag":84,"props":172173,"children":172174},{},[172175],{"type":23,"value":172176},"Branch deletion removes the branch reference but not the commits.",{"type":17,"tag":84,"props":172178,"children":172179},{},[172180],{"type":23,"value":172181},"Repository deletion is irreversible.",{"type":17,"tag":29,"props":172183,"children":172184},{},[172185,172187,172192,172193,172198,172199,172204],{"type":23,"value":172186},"Unified surfaces lifecycle timestamps (",{"type":17,"tag":6121,"props":172188,"children":172190},{"className":172189},[],[172191],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":172194,"children":172196},{"className":172195},[],[172197],{"type":23,"value":25337},{"type":23,"value":12561},{"type":17,"tag":6121,"props":172200,"children":172202},{"className":172201},[],[172203],{"type":23,"value":62569},{"type":23,"value":172205}," where applicable) as recorded by the provider.",{"type":17,"tag":68,"props":172207,"children":172209},{"id":172208},"write-support-and-provider-behavior",[172210],{"type":23,"value":172211},"Write Support and Provider Behavior",{"type":17,"tag":29,"props":172213,"children":172214},{},[172215],{"type":23,"value":172216},"Unified's Repository API defines CRUD-style endpoints for repository objects. In practice, the GitHub, GitLab, and Bitbucket integrations currently operate as read-focused surfaces for core objects:",{"type":17,"tag":80,"props":172218,"children":172219},{},[172220,172225,172230,172235,172240],{"type":17,"tag":84,"props":172221,"children":172222},{},[172223],{"type":23,"value":172224},"Organizations: list and retrieve",{"type":17,"tag":84,"props":172226,"children":172227},{},[172228],{"type":23,"value":172229},"Repositories: list and retrieve",{"type":17,"tag":84,"props":172231,"children":172232},{},[172233],{"type":23,"value":172234},"Branches: list and retrieve",{"type":17,"tag":84,"props":172236,"children":172237},{},[172238],{"type":23,"value":172239},"Commits: list and retrieve",{"type":17,"tag":84,"props":172241,"children":172242},{},[172243],{"type":23,"value":172244},"Pull requests: list and retrieve",{"type":17,"tag":29,"props":172246,"children":172247},{},[172248],{"type":23,"value":172249},"If your use case requires creating repositories, managing branches, or closing pull requests through an API, confirm provider-level support before building workflows around writes.",{"type":17,"tag":68,"props":172251,"children":172253},{"id":172252},"updates-webhooks-and-polling",[172254],{"type":23,"value":172255},"Updates, Webhooks, and Polling",{"type":17,"tag":29,"props":172257,"children":172258},{},[172259],{"type":23,"value":172260},"Repository platforms differ in what can be monitored efficiently.",{"type":17,"tag":239,"props":172262,"children":172263},{"id":5002},[172264],{"type":23,"value":43896},{"type":17,"tag":29,"props":172266,"children":172267},{},[172268],{"type":23,"value":172269},"For repository integrations, webhook delivery is virtual-only.",{"type":17,"tag":80,"props":172271,"children":172272},{},[172273,172283,172292],{"type":17,"tag":84,"props":172274,"children":172275},{},[172276,172281],{"type":17,"tag":48,"props":172277,"children":172278},{},[172279],{"type":23,"value":172280},"Commit events",{"type":23,"value":172282},": created and updated are supported through virtual webhook delivery.",{"type":17,"tag":84,"props":172284,"children":172285},{},[172286,172291],{"type":17,"tag":48,"props":172287,"children":172288},{},[172289],{"type":23,"value":172290},"Repository events",{"type":23,"value":172282},{"type":17,"tag":84,"props":172293,"children":172294},{},[172295],{"type":23,"value":172296},"Branch, pull request, and organization objects do not emit webhook events.",{"type":17,"tag":29,"props":172298,"children":172299},{},[172300],{"type":23,"value":172301},"Virtual webhook delivery does not include delete events. Deletion detection requires periodic reconciliation.",{"type":17,"tag":239,"props":172303,"children":172304},{"id":31656},[172305],{"type":23,"value":172306},"Polling",{"type":17,"tag":29,"props":172308,"children":172309},{},[172310],{"type":23,"value":172311},"Polling support varies by provider and object.",{"type":17,"tag":80,"props":172313,"children":172314},{},[172315,172327,172339],{"type":17,"tag":84,"props":172316,"children":172317},{},[172318,172320,172325],{"type":23,"value":172319},"Commit lists: ",{"type":17,"tag":6121,"props":172321,"children":172323},{"className":172322},[],[172324],{"type":23,"value":26291},{"type":23,"value":172326}," is available for GitHub and GitLab, not available for Bitbucket.",{"type":17,"tag":84,"props":172328,"children":172329},{},[172330,172332,172337],{"type":23,"value":172331},"Repository and pull request lists: ",{"type":17,"tag":6121,"props":172333,"children":172335},{"className":172334},[],[172336],{"type":23,"value":26291},{"type":23,"value":172338}," is not available, so polling requires full list reads with sorting by update time.",{"type":17,"tag":84,"props":172340,"children":172341},{},[172342,172344,172349],{"type":23,"value":172343},"Branch lists: ",{"type":17,"tag":6121,"props":172345,"children":172347},{"className":172346},[],[172348],{"type":23,"value":26291},{"type":23,"value":172350}," exists for GitHub branch lists, not for GitLab and Bitbucket.",{"type":17,"tag":29,"props":172352,"children":172353},{},[172354],{"type":23,"value":172355},"When incremental filters aren't available, polling relies on:",{"type":17,"tag":80,"props":172357,"children":172358},{},[172359,172369,172381],{"type":17,"tag":84,"props":172360,"children":172361},{},[172362,172364],{"type":23,"value":172363},"sorting by ",{"type":17,"tag":6121,"props":172365,"children":172367},{"className":172366},[],[172368],{"type":23,"value":25337},{"type":17,"tag":84,"props":172370,"children":172371},{},[172372,172374,172379],{"type":23,"value":172373},"storing the newest ",{"type":17,"tag":6121,"props":172375,"children":172377},{"className":172376},[],[172378],{"type":23,"value":25337},{"type":23,"value":172380}," you've processed",{"type":17,"tag":84,"props":172382,"children":172383},{},[172384],{"type":23,"value":172385},"deduplicating by stable IDs",{"type":17,"tag":239,"props":172387,"children":172389},{"id":172388},"deletions",[172390],{"type":23,"value":172391},"Deletions",{"type":17,"tag":29,"props":172393,"children":172394},{},[172395],{"type":23,"value":172396},"Virtual webhook delivery does not emit delete events. If you need deletion visibility (e.g., repository removed), periodically list and reconcile IDs against your stored state.",{"type":17,"tag":68,"props":172398,"children":172400},{"id":172399},"security-data-handling-and-compliance",[172401],{"type":23,"value":172402},"Security, Data Handling, and Compliance",{"type":17,"tag":29,"props":172404,"children":172405},{},[172406],{"type":23,"value":172407},"Repository data is sensitive even when you are not fetching source code.",{"type":17,"tag":239,"props":172409,"children":172410},{"id":90302},[172411],{"type":23,"value":43670},{"type":17,"tag":29,"props":172413,"children":172414},{},[172415],{"type":23,"value":172416},"Unified does not store end-customer repository payloads at rest.",{"type":17,"tag":80,"props":172418,"children":172419},{},[172420,172425,172430],{"type":17,"tag":84,"props":172421,"children":172422},{},[172423],{"type":23,"value":172424},"Requests are routed directly to the provider",{"type":17,"tag":84,"props":172426,"children":172427},{},[172428],{"type":23,"value":172429},"No cached replica",{"type":17,"tag":84,"props":172431,"children":172432},{},[172433],{"type":23,"value":172434},"No stored repository payload database",{"type":17,"tag":239,"props":172436,"children":172438},{"id":172437},"what-is-returned",[172439],{"type":23,"value":172440},"What is returned",{"type":17,"tag":29,"props":172442,"children":172443},{},[172444],{"type":23,"value":172445},"The normalized schema focuses on metadata:",{"type":17,"tag":80,"props":172447,"children":172448},{},[172449,172454,172459,172464],{"type":17,"tag":84,"props":172450,"children":172451},{},[172452],{"type":23,"value":172453},"repository names and visibility flags",{"type":17,"tag":84,"props":172455,"children":172456},{},[172457],{"type":23,"value":172458},"commit messages and authorship references",{"type":17,"tag":84,"props":172460,"children":172461},{},[172462],{"type":23,"value":172463},"pull request state, labels, and closure timestamps",{"type":17,"tag":84,"props":172465,"children":172466},{},[172467],{"type":23,"value":172468},"organization metadata and membership IDs",{"type":17,"tag":29,"props":172470,"children":172471},{},[172472],{"type":23,"value":172473},"Code diffs and file contents are not returned in the normalized objects.",{"type":17,"tag":239,"props":172475,"children":172477},{"id":172476},"sensitivity-considerations",[172478],{"type":23,"value":172479},"Sensitivity considerations",{"type":17,"tag":80,"props":172481,"children":172482},{},[172483,172488,172493,172505],{"type":17,"tag":84,"props":172484,"children":172485},{},[172486],{"type":23,"value":172487},"Commit messages can contain secrets or internal context.",{"type":17,"tag":84,"props":172489,"children":172490},{},[172491],{"type":23,"value":172492},"Labels can reveal internal workflow classification.",{"type":17,"tag":84,"props":172494,"children":172495},{},[172496,172498,172503],{"type":23,"value":172497},"Repository visibility (",{"type":17,"tag":6121,"props":172499,"children":172501},{"className":172500},[],[172502],{"type":23,"value":111086},{"type":23,"value":172504},") reflects access boundaries.",{"type":17,"tag":84,"props":172506,"children":172507},{},[172508,172513],{"type":17,"tag":6121,"props":172509,"children":172511},{"className":172510},[],[172512],{"type":23,"value":62389},{"type":23,"value":172514}," can include provider-specific fields and should be requested only when needed.",{"type":17,"tag":68,"props":172516,"children":172518},{"id":172517},"common-repository-api-integration-use-cases",[172519],{"type":23,"value":172520},"Common Repository API Integration Use Cases",{"type":17,"tag":239,"props":172522,"children":172524},{"id":172523},"development-analytics",[172525],{"type":23,"value":172526},"Development analytics",{"type":17,"tag":29,"props":172528,"children":172529},{},[172530],{"type":23,"value":172531},"Track commit volume, pull request velocity, review state distribution, and closure trends across providers.",{"type":17,"tag":239,"props":172533,"children":172535},{"id":172534},"cross-platform-code-review-tools",[172536],{"type":23,"value":172537},"Cross-platform code review tools",{"type":17,"tag":29,"props":172539,"children":172540},{},[172541],{"type":23,"value":172542},"Display PR state, participants, labels, and closure timestamps across GitHub, GitLab, and Bitbucket.",{"type":17,"tag":239,"props":172544,"children":172546},{"id":172545},"repository-inventory",[172547],{"type":23,"value":172548},"Repository inventory",{"type":17,"tag":29,"props":172550,"children":172551},{},[172552],{"type":23,"value":172553},"Aggregate repository lists across organizations and surface visibility, ownership, and metadata.",{"type":17,"tag":239,"props":172555,"children":172557},{"id":172556},"release-readiness-signals",[172558],{"type":23,"value":172559},"Release readiness signals",{"type":17,"tag":29,"props":172561,"children":172562},{},[172563],{"type":23,"value":172564},"Use commit and PR activity as inputs to release dashboards, without building per-provider logic.",{"type":17,"tag":68,"props":172566,"children":172567},{"id":164971},[172568],{"type":23,"value":164974},{"type":17,"tag":80,"props":172570,"children":172571},{},[172572,172577,172582,172587,172592,172603],{"type":17,"tag":84,"props":172573,"children":172574},{},[172575],{"type":23,"value":172576},"Provider parity is uneven across objects.",{"type":17,"tag":84,"props":172578,"children":172579},{},[172580],{"type":23,"value":172581},"Commits are effectively immutable.",{"type":17,"tag":84,"props":172583,"children":172584},{},[172585],{"type":23,"value":172586},"Pull requests become terminal on close.",{"type":17,"tag":84,"props":172588,"children":172589},{},[172590],{"type":23,"value":172591},"Only commits and repositories emit webhook events.",{"type":17,"tag":84,"props":172593,"children":172594},{},[172595,172597,172601],{"type":23,"value":172596},"[Virtual ",{"type":17,"tag":133,"props":172598,"children":172599},{"href":4999},[172600],{"type":23,"value":5002},{"type":23,"value":172602},"](/blog/unlock_real_time_data_with_virtual_webhooks) do not include delete events.",{"type":17,"tag":84,"props":172604,"children":172605},{},[172606],{"type":23,"value":172607},"Incremental polling support varies by object and provider.",{"type":17,"tag":29,"props":172609,"children":172610},{},[172611],{"type":23,"value":172612},"These are provider realities and should be incorporated into system design.",{"type":17,"tag":68,"props":172614,"children":172616},{"id":172615},"build-vs-maintain-repository-integrations",[172617],{"type":23,"value":172618},"Build vs Maintain Repository Integrations",{"type":17,"tag":239,"props":172620,"children":172621},{"id":165021},[172622],{"type":23,"value":171246},{"type":17,"tag":80,"props":172624,"children":172625},{},[172626,172631,172636,172641],{"type":17,"tag":84,"props":172627,"children":172628},{},[172629],{"type":23,"value":172630},"Separate provider APIs",{"type":17,"tag":84,"props":172632,"children":172633},{},[172634],{"type":23,"value":172635},"Different object shapes and filters",{"type":17,"tag":84,"props":172637,"children":172638},{},[172639],{"type":23,"value":172640},"Provider-specific event delivery and pagination behavior",{"type":17,"tag":84,"props":172642,"children":172643},{},[172644],{"type":23,"value":172645},"Ongoing maintenance as providers evolve",{"type":17,"tag":239,"props":172647,"children":172649},{"id":172648},"using-a-unified-repository-api",[172650],{"type":23,"value":172651},"Using a Unified Repository API",{"type":17,"tag":80,"props":172653,"children":172654},{},[172655,172660,172665,172670],{"type":17,"tag":84,"props":172656,"children":172657},{},[172658],{"type":23,"value":172659},"One category-scoped API for repository objects",{"type":17,"tag":84,"props":172661,"children":172662},{},[172663],{"type":23,"value":172664},"Standard fields for orgs, repos, branches, commits, and pull requests",{"type":17,"tag":84,"props":172666,"children":172667},{},[172668],{"type":23,"value":172669},"Live reads from source providers",{"type":17,"tag":84,"props":172671,"children":172672},{},[172673],{"type":23,"value":172674},"Clear boundaries with tasks, tickets, knowledge, and storage",{"type":17,"tag":68,"props":172676,"children":172678},{"id":172677},"build-repository-integrations-without-duplicate-provider-logic",[172679],{"type":23,"value":172680},"Build repository integrations without duplicate provider logic",{"type":17,"tag":29,"props":172682,"children":172683},{},[172684],{"type":23,"value":172685},"If your product needs repository visibility across GitHub, GitLab, and Bitbucket, maintaining separate integrations becomes expensive quickly.",{"type":17,"tag":29,"props":172687,"children":172688},{},[172689],{"type":23,"value":172690},"Unified's Repository API provides a consistent way to access repositories, branches, commits, and pull request state across providers without storing repository data at rest.",{"type":17,"tag":29,"props":172692,"children":172693},{},[172694],{"type":17,"tag":133,"props":172695,"children":172697},{"href":172696},"/3056207b83848056a627e2c0236e083a",[172698],{"type":17,"tag":48,"props":172699,"children":172700},{},[172701],{"type":23,"value":44481},{"type":17,"tag":29,"props":172703,"children":172704},{},[172705],{"type":17,"tag":133,"props":172706,"children":172707},{"href":172696},[172708],{"type":17,"tag":48,"props":172709,"children":172710},{},[172711],{"type":23,"value":44490},{"type":17,"tag":68,"props":172713,"children":172714},{"id":95759},[172715],{"type":23,"value":95762},{"type":17,"tag":29,"props":172717,"children":172718},{},[172719],{"type":17,"tag":48,"props":172720,"children":172721},{},[172722],{"type":23,"value":172723},"What objects does the Repository API expose?",{"type":17,"tag":29,"props":172725,"children":172726},{},[172727],{"type":23,"value":172728},"Organizations, repositories, branches, commits, and pull requests.",{"type":17,"tag":29,"props":172730,"children":172731},{},[172732],{"type":17,"tag":48,"props":172733,"children":172734},{},[172735],{"type":23,"value":172736},"Does the API return code diffs or file contents?",{"type":17,"tag":29,"props":172738,"children":172739},{},[172740],{"type":23,"value":172741},"No. The normalized objects return metadata, not repository file content.",{"type":17,"tag":29,"props":172743,"children":172744},{},[172745],{"type":17,"tag":48,"props":172746,"children":172747},{},[172748],{"type":23,"value":172749},"Can I create repositories or pull requests through the API?",{"type":17,"tag":29,"props":172751,"children":172752},{},[172753],{"type":23,"value":172754},"Provider support varies. For GitHub, GitLab, and Bitbucket, core repository objects are currently read-focused.",{"type":17,"tag":29,"props":172756,"children":172757},{},[172758],{"type":17,"tag":48,"props":172759,"children":172760},{},[172761],{"type":23,"value":172762},"How are updates delivered?",{"type":17,"tag":29,"props":172764,"children":172765},{},[172766],{"type":23,"value":172767},"Commits and repositories support virtual webhook delivery. Other objects rely on polling.",{"type":17,"tag":29,"props":172769,"children":172770},{},[172771],{"type":17,"tag":48,"props":172772,"children":172773},{},[172774],{"type":23,"value":172775},"Does Unified store repository data at rest?",{"type":17,"tag":29,"props":172777,"children":172778},{},[172779],{"type":23,"value":172780},"No. Repository payloads are not stored at rest.",{"title":7,"searchDepth":1629,"depth":1629,"links":172782},[172783,172784,172785,172786,172787,172794,172795,172796,172797,172802,172807,172813,172814,172818,172819],{"id":171508,"depth":1629,"text":171511},{"id":17403,"depth":1629,"text":171559},{"id":171599,"depth":1629,"text":171602},{"id":171672,"depth":1629,"text":171675},{"id":171694,"depth":1629,"text":171697,"children":172788},[172789,172790,172791,172792,172793],{"id":171705,"depth":1635,"text":41703},{"id":17424,"depth":1635,"text":171529},{"id":17434,"depth":1635,"text":171581},{"id":17439,"depth":1635,"text":171913},{"id":171987,"depth":1635,"text":171990},{"id":172075,"depth":1629,"text":172078},{"id":172143,"depth":1629,"text":172146},{"id":172208,"depth":1629,"text":172211},{"id":172252,"depth":1629,"text":172255,"children":172798},[172799,172800,172801],{"id":5002,"depth":1635,"text":43896},{"id":31656,"depth":1635,"text":172306},{"id":172388,"depth":1635,"text":172391},{"id":172399,"depth":1629,"text":172402,"children":172803},[172804,172805,172806],{"id":90302,"depth":1635,"text":43670},{"id":172437,"depth":1635,"text":172440},{"id":172476,"depth":1635,"text":172479},{"id":172517,"depth":1629,"text":172520,"children":172808},[172809,172810,172811,172812],{"id":172523,"depth":1635,"text":172526},{"id":172534,"depth":1635,"text":172537},{"id":172545,"depth":1635,"text":172548},{"id":172556,"depth":1635,"text":172559},{"id":164971,"depth":1629,"text":164974},{"id":172615,"depth":1629,"text":172618,"children":172815},[172816,172817],{"id":165021,"depth":1635,"text":171246},{"id":172648,"depth":1635,"text":172651},{"id":172677,"depth":1629,"text":172680},{"id":95759,"depth":1629,"text":95762},"content:blog:repository_api_integration_repositories_pull_requests_and_commit_activity_across_git_platforms.md","blog/repository_api_integration_repositories_pull_requests_and_commit_activity_across_git_platforms.md","blog/repository_api_integration_repositories_pull_requests_and_commit_activity_across_git_platforms",{"_path":172824,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":172825,"description":172826,"img":172827,"date":172828,"tag":12,"body":172829,"_type":1677,"_id":174218,"_source":1679,"_file":174219,"_stem":174220,"_extension":1682},"/blog/knowledge_management_api_integration_spaces_pages_comments_and_real_time_knowledge_content_across_platforms","Knowledge Management API Integration: Spaces, Pages, Comments, and Real-Time Knowledge Content Across Platforms","Knowledge content is where teams document decisions, processes, and customer-facing guidance. Pages evolve over time, spaces and hierarchies shift, and...","https://s3.us-east-2.amazonaws.com/unified-article-images/knowledge_management_api_integration_spaces_pages_comments_and_real_time_knowledge_content_across_platforms-icon.png","2026-02-12T01:54:00.000Z",{"type":14,"children":172830,"toc":174177},[172831,172836,172839,172846,172851,172859,172870,172876,172881,172886,172909,172914,172920,172925,172929,172962,172967,172973,172978,173051,173063,173069,173075,173085,173091,173096,173100,173130,173135,173156,173162,173183,173189,173194,173231,173235,173302,173307,173312,173341,173345,173440,173452,173456,173461,173484,173488,173555,173561,173566,173610,173615,173628,173633,173639,173644,173667,173679,173685,173690,173695,173720,173731,173736,173741,173765,173770,173775,173800,173804,173809,173813,173831,173837,173857,173863,173875,173881,173886,173892,173898,173903,173909,173914,173920,173925,173930,173935,173941,173946,173950,173955,173978,173983,173989,173993,174015,174021,174044,174050,174055,174066,174073,174081,174088,174096,174100,174108,174113,174121,174126,174134,174139,174146,174151,174159,174164,174172],{"type":17,"tag":18,"props":172832,"children":172834},{"id":172833},"knowledge-management-api-integration-spaces-pages-comments-and-real-time-knowledge-content-across-platforms",[172835],{"type":23,"value":172825},{"type":17,"tag":25,"props":172837,"children":172838},{},[],{"type":17,"tag":29,"props":172840,"children":172841},{},[172842],{"type":17,"tag":33,"props":172843,"children":172844},{},[172845],{"type":23,"value":165325},{"type":17,"tag":29,"props":172847,"children":172848},{},[172849],{"type":23,"value":172850},"Knowledge content is where teams document decisions, processes, and customer-facing guidance. Pages evolve over time, spaces and hierarchies shift, and comments capture the context that rarely makes it into the final doc. When knowledge data is fragmented across platforms—or stitched together with periodic sync—search breaks, migration projects balloon, and AI assistants answer from outdated material.",{"type":17,"tag":29,"props":172852,"children":172853},{},[172854,172858],{"type":17,"tag":133,"props":172855,"children":172856},{"href":24227},[172857],{"type":23,"value":163523},{"type":23,"value":165348},{"type":17,"tag":29,"props":172860,"children":172861},{},[172862,172864,172868],{"type":23,"value":172863},"In this guide, we'll explain what a KMS & Help Center API actually covers, which objects matter in practice, how knowledge lifecycles behave, how updates are delivered across providers, and how Unified's ",{"type":17,"tag":133,"props":172865,"children":172866},{"href":24227},[172867],{"type":23,"value":24230},{"type":23,"value":172869}," fits alongside File Storage, Ticketing, CRM, Messaging, Tasks, and GenAI in the broader platform.",{"type":17,"tag":68,"props":172871,"children":172873},{"id":172872},"introduction-to-knowledge-management-api-integrations",[172874],{"type":23,"value":172875},"Introduction to Knowledge Management API Integrations",{"type":17,"tag":29,"props":172877,"children":172878},{},[172879],{"type":23,"value":172880},"Knowledge platforms such as Confluence, Notion, Guru, Coda, ClickUp, Freshdesk, Helpscout, Intercom, Salesforce, and ServiceNow manage structured knowledge content through spaces, pages, and discussions.",{"type":17,"tag":29,"props":172882,"children":172883},{},[172884],{"type":23,"value":172885},"Each platform exposes different data shapes and capabilities:",{"type":17,"tag":80,"props":172887,"children":172888},{},[172889,172894,172899,172904],{"type":17,"tag":84,"props":172890,"children":172891},{},[172892],{"type":23,"value":172893},"Different hierarchy models (space trees vs page trees)",{"type":17,"tag":84,"props":172895,"children":172896},{},[172897],{"type":23,"value":172898},"Different page types and content formats",{"type":17,"tag":84,"props":172900,"children":172901},{},[172902],{"type":23,"value":172903},"Different comment threading behavior",{"type":17,"tag":84,"props":172905,"children":172906},{},[172907],{"type":23,"value":172908},"Uneven write, webhook, and incremental polling support",{"type":17,"tag":29,"props":172910,"children":172911},{},[172912],{"type":23,"value":172913},"A KMS API provides a consistent way to read, write, and synchronize knowledge content across providers without maintaining separate integrations for each platform.",{"type":17,"tag":68,"props":172915,"children":172917},{"id":172916},"what-is-a-knowledge-management-kms-api",[172918],{"type":23,"value":172919},"What Is a Knowledge Management (KMS) API?",{"type":17,"tag":29,"props":172921,"children":172922},{},[172923],{"type":23,"value":172924},"A KMS API allows applications to programmatically access and manage knowledge content.",{"type":17,"tag":29,"props":172926,"children":172927},{},[172928],{"type":23,"value":167214},{"type":17,"tag":80,"props":172930,"children":172931},{},[172932,172937,172942,172947,172952,172957],{"type":17,"tag":84,"props":172933,"children":172934},{},[172935],{"type":23,"value":172936},"Listing and retrieving spaces and their hierarchies",{"type":17,"tag":84,"props":172938,"children":172939},{},[172940],{"type":23,"value":172941},"Creating, updating, and archiving pages",{"type":17,"tag":84,"props":172943,"children":172944},{},[172945],{"type":23,"value":172946},"Retrieving page metadata such as authorship and structure",{"type":17,"tag":84,"props":172948,"children":172949},{},[172950],{"type":23,"value":172951},"Reading and managing page comments and threaded replies",{"type":17,"tag":84,"props":172953,"children":172954},{},[172955],{"type":23,"value":172956},"Migrating or syncing documentation between platforms",{"type":17,"tag":84,"props":172958,"children":172959},{},[172960],{"type":23,"value":172961},"Searching across knowledge sources",{"type":17,"tag":29,"props":172963,"children":172964},{},[172965],{"type":23,"value":172966},"KMS APIs focus on structured documentation and knowledge articles. They do not manage binary file storage, support tickets, sales pipelines, messaging threads, or generative model execution.",{"type":17,"tag":68,"props":172968,"children":172970},{"id":172969},"kms-api-vs-file-storage-ticketing-crm-messaging-tasks-and-genai",[172971],{"type":23,"value":172972},"KMS API vs File Storage, Ticketing, CRM, Messaging, Tasks, and GenAI",{"type":17,"tag":29,"props":172974,"children":172975},{},[172976],{"type":23,"value":172977},"Unified treats KMS & Help Center as a distinct category with clear boundaries.",{"type":17,"tag":80,"props":172979,"children":172980},{},[172981,172991,173001,173011,173021,173031,173041],{"type":17,"tag":84,"props":172982,"children":172983},{},[172984,172989],{"type":17,"tag":48,"props":172985,"children":172986},{},[172987],{"type":23,"value":172988},"KMS APIs",{"type":23,"value":172990}," manage spaces, pages, and comments across documentation platforms.",{"type":17,"tag":84,"props":172992,"children":172993},{},[172994,172999],{"type":17,"tag":48,"props":172995,"children":172996},{},[172997],{"type":23,"value":172998},"File Storage APIs",{"type":23,"value":173000}," manage files and folders across cloud storage providers.",{"type":17,"tag":84,"props":173002,"children":173003},{},[173004,173009],{"type":17,"tag":48,"props":173005,"children":173006},{},[173007],{"type":23,"value":173008},"Ticketing APIs",{"type":23,"value":173010}," manage tickets, customers, notes, and categories.",{"type":17,"tag":84,"props":173012,"children":173013},{},[173014,173019],{"type":17,"tag":48,"props":173015,"children":173016},{},[173017],{"type":23,"value":173018},"CRM APIs",{"type":23,"value":173020}," manage contacts, companies, deals, pipelines, and leads.",{"type":17,"tag":84,"props":173022,"children":173023},{},[173024,173029],{"type":17,"tag":48,"props":173025,"children":173026},{},[173027],{"type":23,"value":173028},"Messaging APIs",{"type":23,"value":173030}," manage channels, messages, and real-time chat events.",{"type":17,"tag":84,"props":173032,"children":173033},{},[173034,173039],{"type":17,"tag":48,"props":173035,"children":173036},{},[173037],{"type":23,"value":173038},"Tasks APIs",{"type":23,"value":173040}," manage tasks, projects, and work tracking objects.",{"type":17,"tag":84,"props":173042,"children":173043},{},[173044,173049],{"type":17,"tag":48,"props":173045,"children":173046},{},[173047],{"type":23,"value":173048},"GenAI APIs",{"type":23,"value":173050}," manage models, embeddings, prompts, and generation.",{"type":17,"tag":29,"props":173052,"children":173053},{},[173054,173056,173061],{"type":23,"value":173055},"KMS pages may reference attachments via metadata, and some providers expose a page ",{"type":17,"tag":6121,"props":173057,"children":173059},{"className":173058},[],[173060],{"type":23,"value":24978},{"type":23,"value":173062}," for export. File binaries themselves are handled through File Storage.",{"type":17,"tag":68,"props":173064,"children":173066},{"id":173065},"real-time-access-to-knowledge-content",[173067],{"type":23,"value":173068},"Real-Time Access to Knowledge Content",{"type":17,"tag":239,"props":173070,"children":173072},{"id":173071},"direct-reads-from-source-platforms",[173073],{"type":23,"value":173074},"Direct reads from source platforms",{"type":17,"tag":29,"props":173076,"children":173077},{},[173078,173080,173084],{"type":23,"value":173079},"Unified routes KMS requests directly to the underlying provider. There is no cached replica. Reads reflect the provider's current state, subject to ",{"type":17,"tag":133,"props":173081,"children":173082},{"href":135},[173083],{"type":23,"value":138},{"type":23,"value":171686},{"type":17,"tag":239,"props":173086,"children":173088},{"id":173087},"updates-native-events-virtual-events-and-polling",[173089],{"type":23,"value":173090},"Updates: native events, virtual events, and polling",{"type":17,"tag":29,"props":173092,"children":173093},{},[173094],{"type":23,"value":173095},"Update delivery varies by object and provider.",{"type":17,"tag":29,"props":173097,"children":173098},{},[173099],{"type":23,"value":95391},{"type":17,"tag":80,"props":173101,"children":173102},{},[173103,173112,173121],{"type":17,"tag":84,"props":173104,"children":173105},{},[173106,173110],{"type":17,"tag":48,"props":173107,"children":173108},{},[173109],{"type":23,"value":9024},{"type":23,"value":173111}," when a provider emits events.",{"type":17,"tag":84,"props":173113,"children":173114},{},[173115,173119],{"type":17,"tag":48,"props":173116,"children":173117},{},[173118],{"type":23,"value":9256},{"type":23,"value":173120}," when change detection is performed via polling.",{"type":17,"tag":84,"props":173122,"children":173123},{},[173124,173128],{"type":17,"tag":48,"props":173125,"children":173126},{},[173127],{"type":23,"value":172306},{"type":23,"value":173129}," through list endpoints, using incremental filters where available.",{"type":17,"tag":29,"props":173131,"children":173132},{},[173133],{"type":23,"value":173134},"Event semantics are consistent:",{"type":17,"tag":80,"props":173136,"children":173137},{},[173138,173147],{"type":17,"tag":84,"props":173139,"children":173140},{},[173141,173145],{"type":17,"tag":48,"props":173142,"children":173143},{},[173144],{"type":23,"value":166495},{"type":23,"value":173146}," events fire for newly created records.",{"type":17,"tag":84,"props":173148,"children":173149},{},[173150,173154],{"type":17,"tag":48,"props":173151,"children":173152},{},[173153],{"type":23,"value":166500},{"type":23,"value":173155}," events fire for newly created and modified records.",{"type":17,"tag":68,"props":173157,"children":173159},{"id":173158},"core-kms-data-models",[173160],{"type":23,"value":173161},"Core KMS Data Models",{"type":17,"tag":29,"props":173163,"children":173164},{},[173165,173167,173172,173173,173177,173178,173182],{"type":23,"value":173166},"Unified normalizes KMS data into three objects: ",{"type":17,"tag":48,"props":173168,"children":173169},{},[173170],{"type":23,"value":173171},"Space",{"type":23,"value":11826},{"type":17,"tag":48,"props":173174,"children":173175},{},[173176],{"type":23,"value":24932},{"type":23,"value":12561},{"type":17,"tag":48,"props":173179,"children":173180},{},[173181],{"type":23,"value":13370},{"type":23,"value":54},{"type":17,"tag":239,"props":173184,"children":173186},{"id":173185},"spaces",[173187],{"type":23,"value":173188},"Spaces",{"type":17,"tag":29,"props":173190,"children":173191},{},[173192],{"type":23,"value":173193},"Spaces represent workspaces or knowledge areas.",{"type":17,"tag":80,"props":173195,"children":173196},{},[173197,173202,173207,173218],{"type":17,"tag":84,"props":173198,"children":173199},{},[173200],{"type":23,"value":173201},"Support list and retrieve operations across providers.",{"type":17,"tag":84,"props":173203,"children":173204},{},[173205],{"type":23,"value":173206},"Create/update/remove support varies by provider.",{"type":17,"tag":84,"props":173208,"children":173209},{},[173210,173212,173217],{"type":23,"value":173211},"Support hierarchy through ",{"type":17,"tag":6121,"props":173213,"children":173215},{"className":173214},[],[173216],{"type":23,"value":15863},{"type":23,"value":54},{"type":17,"tag":84,"props":173219,"children":173220},{},[173221,173223,173229],{"type":23,"value":173222},"Can link to a page through ",{"type":17,"tag":6121,"props":173224,"children":173226},{"className":173225},[],[173227],{"type":23,"value":173228},"parent_page_id",{"type":23,"value":173230}," when providers model spaces under page structures.",{"type":17,"tag":29,"props":173232,"children":173233},{},[173234],{"type":23,"value":72497},{"type":17,"tag":80,"props":173236,"children":173237},{},[173238,173258,173272,173286,173294],{"type":17,"tag":84,"props":173239,"children":173240},{},[173241,173246,173247,173252,173253],{"type":17,"tag":6121,"props":173242,"children":173244},{"className":173243},[],[173245],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173248,"children":173250},{"className":173249},[],[173251],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173254,"children":173256},{"className":173255},[],[173257],{"type":23,"value":25337},{"type":17,"tag":84,"props":173259,"children":173260},{},[173261,173266,173267],{"type":17,"tag":6121,"props":173262,"children":173264},{"className":173263},[],[173265],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173268,"children":173270},{"className":173269},[],[173271],{"type":23,"value":24679},{"type":17,"tag":84,"props":173273,"children":173274},{},[173275,173280,173281],{"type":17,"tag":6121,"props":173276,"children":173278},{"className":173277},[],[173279],{"type":23,"value":15863},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173282,"children":173284},{"className":173283},[],[173285],{"type":23,"value":173228},{"type":17,"tag":84,"props":173287,"children":173288},{},[173289],{"type":17,"tag":6121,"props":173290,"children":173292},{"className":173291},[],[173293],{"type":23,"value":62868},{"type":17,"tag":84,"props":173295,"children":173296},{},[173297],{"type":17,"tag":6121,"props":173298,"children":173300},{"className":173299},[],[173301],{"type":23,"value":62582},{"type":17,"tag":239,"props":173303,"children":173304},{"id":23777},[173305],{"type":23,"value":173306},"Pages",{"type":17,"tag":29,"props":173308,"children":173309},{},[173310],{"type":23,"value":173311},"Pages represent articles or documents within a space.",{"type":17,"tag":80,"props":173313,"children":173314},{},[173315,173319,173323],{"type":17,"tag":84,"props":173316,"children":173317},{},[173318],{"type":23,"value":173201},{"type":17,"tag":84,"props":173320,"children":173321},{},[173322],{"type":23,"value":173206},{"type":17,"tag":84,"props":173324,"children":173325},{},[173326,173328,173333,173335,173340],{"type":23,"value":173327},"Support hierarchy via ",{"type":17,"tag":6121,"props":173329,"children":173331},{"className":173330},[],[173332],{"type":23,"value":15863},{"type":23,"value":173334}," and structure via ",{"type":17,"tag":6121,"props":173336,"children":173338},{"className":173337},[],[173339],{"type":23,"value":160848},{"type":23,"value":54},{"type":17,"tag":29,"props":173342,"children":173343},{},[173344],{"type":23,"value":72497},{"type":17,"tag":80,"props":173346,"children":173347},{},[173348,173368,173382,173396,173410,173418,173432],{"type":17,"tag":84,"props":173349,"children":173350},{},[173351,173356,173357,173362,173363],{"type":17,"tag":6121,"props":173352,"children":173354},{"className":173353},[],[173355],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173358,"children":173360},{"className":173359},[],[173361],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173364,"children":173366},{"className":173365},[],[173367],{"type":23,"value":25337},{"type":17,"tag":84,"props":173369,"children":173370},{},[173371,173376,173377],{"type":17,"tag":6121,"props":173372,"children":173374},{"className":173373},[],[173375],{"type":23,"value":62346},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173378,"children":173380},{"className":173379},[],[173381],{"type":23,"value":27310},{"type":17,"tag":84,"props":173383,"children":173384},{},[173385,173390,173391],{"type":17,"tag":6121,"props":173386,"children":173388},{"className":173387},[],[173389],{"type":23,"value":72943},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173392,"children":173394},{"className":173393},[],[173395],{"type":23,"value":15863},{"type":17,"tag":84,"props":173397,"children":173398},{},[173399,173404,173405],{"type":17,"tag":6121,"props":173400,"children":173402},{"className":173401},[],[173403],{"type":23,"value":62868},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173406,"children":173408},{"className":173407},[],[173409],{"type":23,"value":160848},{"type":17,"tag":84,"props":173411,"children":173412},{},[173413],{"type":17,"tag":6121,"props":173414,"children":173416},{"className":173415},[],[173417],{"type":23,"value":62582},{"type":17,"tag":84,"props":173419,"children":173420},{},[173421,173426,173427],{"type":17,"tag":6121,"props":173422,"children":173424},{"className":173423},[],[173425],{"type":23,"value":24978},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173428,"children":173430},{"className":173429},[],[173431],{"type":23,"value":12107},{"type":17,"tag":84,"props":173433,"children":173434},{},[173435],{"type":17,"tag":6121,"props":173436,"children":173438},{"className":173437},[],[173439],{"type":23,"value":23792},{"type":17,"tag":29,"props":173441,"children":173442},{},[173443,173445,173450],{"type":23,"value":173444},"Page exports are accessed through ",{"type":17,"tag":6121,"props":173446,"children":173448},{"className":173447},[],[173449],{"type":23,"value":24978},{"type":23,"value":173451}," when supported by the provider. This is not a StorageFile object and does not imply file storage within KMS.",{"type":17,"tag":239,"props":173453,"children":173454},{"id":164196},[173455],{"type":23,"value":31629},{"type":17,"tag":29,"props":173457,"children":173458},{},[173459],{"type":23,"value":173460},"Comments represent discussion threads attached to pages.",{"type":17,"tag":80,"props":173462,"children":173463},{},[173464,173468,173472],{"type":17,"tag":84,"props":173465,"children":173466},{},[173467],{"type":23,"value":173201},{"type":17,"tag":84,"props":173469,"children":173470},{},[173471],{"type":23,"value":173206},{"type":17,"tag":84,"props":173473,"children":173474},{},[173475,173477,173482],{"type":23,"value":173476},"Support nested replies via ",{"type":17,"tag":6121,"props":173478,"children":173480},{"className":173479},[],[173481],{"type":23,"value":15863},{"type":23,"value":173483}," when the provider supports threading.",{"type":17,"tag":29,"props":173485,"children":173486},{},[173487],{"type":23,"value":72497},{"type":17,"tag":80,"props":173489,"children":173490},{},[173491,173511,173525,173533,173547],{"type":17,"tag":84,"props":173492,"children":173493},{},[173494,173499,173500,173505,173506],{"type":17,"tag":6121,"props":173495,"children":173497},{"className":173496},[],[173498],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173501,"children":173503},{"className":173502},[],[173504],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173507,"children":173509},{"className":173508},[],[173510],{"type":23,"value":25337},{"type":17,"tag":84,"props":173512,"children":173513},{},[173514,173519,173520],{"type":17,"tag":6121,"props":173515,"children":173517},{"className":173516},[],[173518],{"type":23,"value":73053},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173521,"children":173523},{"className":173522},[],[173524],{"type":23,"value":15863},{"type":17,"tag":84,"props":173526,"children":173527},{},[173528],{"type":17,"tag":6121,"props":173529,"children":173531},{"className":173530},[],[173532],{"type":23,"value":27310},{"type":17,"tag":84,"props":173534,"children":173535},{},[173536,173541,173542],{"type":17,"tag":6121,"props":173537,"children":173539},{"className":173538},[],[173540],{"type":23,"value":73020},{"type":23,"value":11826},{"type":17,"tag":6121,"props":173543,"children":173545},{"className":173544},[],[173546],{"type":23,"value":1679},{"type":17,"tag":84,"props":173548,"children":173549},{},[173550],{"type":17,"tag":6121,"props":173551,"children":173553},{"className":173552},[],[173554],{"type":23,"value":62582},{"type":17,"tag":68,"props":173556,"children":173558},{"id":173557},"identity-and-ownership-in-kms",[173559],{"type":23,"value":173560},"Identity and Ownership in KMS",{"type":17,"tag":29,"props":173562,"children":173563},{},[173564],{"type":23,"value":173565},"KMS identities are category-scoped and intentionally simple:",{"type":17,"tag":80,"props":173567,"children":173568},{},[173569,173580,173590,173600],{"type":17,"tag":84,"props":173570,"children":173571},{},[173572,173574,173579],{"type":23,"value":173573},"Spaces, pages, and comments each have their own ",{"type":17,"tag":6121,"props":173575,"children":173577},{"className":173576},[],[173578],{"type":23,"value":18766},{"type":23,"value":54},{"type":17,"tag":84,"props":173581,"children":173582},{},[173583,173588],{"type":17,"tag":6121,"props":173584,"children":173586},{"className":173585},[],[173587],{"type":23,"value":72943},{"type":23,"value":173589}," links pages to spaces.",{"type":17,"tag":84,"props":173591,"children":173592},{},[173593,173598],{"type":17,"tag":6121,"props":173594,"children":173596},{"className":173595},[],[173597],{"type":23,"value":73053},{"type":23,"value":173599}," links comments to pages.",{"type":17,"tag":84,"props":173601,"children":173602},{},[173603,173608],{"type":17,"tag":6121,"props":173604,"children":173606},{"className":173605},[],[173607],{"type":23,"value":15863},{"type":23,"value":173609}," expresses hierarchy for pages and threaded replies for comments.",{"type":17,"tag":29,"props":173611,"children":173612},{},[173613],{"type":23,"value":173614},"KMS also supports consistent internal attribution:",{"type":17,"tag":80,"props":173616,"children":173617},{},[173618],{"type":17,"tag":84,"props":173619,"children":173620},{},[173621,173626],{"type":17,"tag":6121,"props":173622,"children":173624},{"className":173623},[],[173625],{"type":23,"value":62582},{"type":23,"value":173627}," references an HR employee record.",{"type":17,"tag":29,"props":173629,"children":173630},{},[173631],{"type":23,"value":173632},"KMS objects do not embed identifiers for StorageFile, tickets, CRM records, messaging threads, tasks, or embeddings.",{"type":17,"tag":68,"props":173634,"children":173636},{"id":173635},"provider-variability-to-design-for",[173637],{"type":23,"value":173638},"Provider Variability to Design For",{"type":17,"tag":29,"props":173640,"children":173641},{},[173642],{"type":23,"value":173643},"Write support differs by provider:",{"type":17,"tag":80,"props":173645,"children":173646},{},[173647,173652,173657,173662],{"type":17,"tag":84,"props":173648,"children":173649},{},[173650],{"type":23,"value":173651},"Some providers support full CRUD for spaces and pages (for example, Coda).",{"type":17,"tag":84,"props":173653,"children":173654},{},[173655],{"type":23,"value":173656},"Some providers are read-only for spaces and pages (for example, Confluence and Notion).",{"type":17,"tag":84,"props":173658,"children":173659},{},[173660],{"type":23,"value":173661},"Some providers allow create/update but do not support remove operations for pages (provider-dependent).",{"type":17,"tag":84,"props":173663,"children":173664},{},[173665],{"type":23,"value":173666},"Comment write support is less common and varies by provider.",{"type":17,"tag":29,"props":173668,"children":173669},{},[173670,173672,173677],{"type":23,"value":173671},"Where remove operations exist, archival behavior is generally represented through ",{"type":17,"tag":6121,"props":173673,"children":173675},{"className":173674},[],[173676],{"type":23,"value":62868},{"type":23,"value":173678}," on spaces and pages.",{"type":17,"tag":68,"props":173680,"children":173682},{"id":173681},"updates-events-and-polling-behavior",[173683],{"type":23,"value":173684},"Updates, Events, and Polling Behavior",{"type":17,"tag":239,"props":173686,"children":173688},{"id":173687},"pages-1",[173689],{"type":23,"value":173306},{"type":17,"tag":29,"props":173691,"children":173692},{},[173693],{"type":23,"value":173694},"Pages have the strongest event coverage:",{"type":17,"tag":80,"props":173696,"children":173697},{},[173698,173703,173708],{"type":17,"tag":84,"props":173699,"children":173700},{},[173701],{"type":23,"value":173702},"Some providers support native events for page creation and updates.",{"type":17,"tag":84,"props":173704,"children":173705},{},[173706],{"type":23,"value":173707},"Virtual events are widely supported for pages across providers.",{"type":17,"tag":84,"props":173709,"children":173710},{},[173711,173713,173718],{"type":23,"value":173712},"Incremental polling via ",{"type":17,"tag":6121,"props":173714,"children":173716},{"className":173715},[],[173717],{"type":23,"value":26291},{"type":23,"value":173719}," is supported for pages on some providers and not on others.",{"type":17,"tag":29,"props":173721,"children":173722},{},[173723,173724,173729],{"type":23,"value":22733},{"type":17,"tag":6121,"props":173725,"children":173727},{"className":173726},[],[173728],{"type":23,"value":26291},{"type":23,"value":173730}," is unavailable, polling relies on pagination with sorting by timestamps.",{"type":17,"tag":239,"props":173732,"children":173734},{"id":173733},"spaces-1",[173735],{"type":23,"value":173188},{"type":17,"tag":29,"props":173737,"children":173738},{},[173739],{"type":23,"value":173740},"Space event coverage is limited by provider:",{"type":17,"tag":80,"props":173742,"children":173743},{},[173744,173749,173754],{"type":17,"tag":84,"props":173745,"children":173746},{},[173747],{"type":23,"value":173748},"Some providers support events for spaces.",{"type":17,"tag":84,"props":173750,"children":173751},{},[173752],{"type":23,"value":173753},"Many rely on polling for changes.",{"type":17,"tag":84,"props":173755,"children":173756},{},[173757,173758,173763],{"type":23,"value":173712},{"type":17,"tag":6121,"props":173759,"children":173761},{"className":173760},[],[173762],{"type":23,"value":26291},{"type":23,"value":173764}," is not generally available for spaces, so polling often relies on sorting by update time.",{"type":17,"tag":239,"props":173766,"children":173768},{"id":173767},"comments-1",[173769],{"type":23,"value":31629},{"type":17,"tag":29,"props":173771,"children":173772},{},[173773],{"type":23,"value":173774},"Comment update delivery is provider-dependent:",{"type":17,"tag":80,"props":173776,"children":173777},{},[173778,173783,173788],{"type":17,"tag":84,"props":173779,"children":173780},{},[173781],{"type":23,"value":173782},"Event support is limited.",{"type":17,"tag":84,"props":173784,"children":173785},{},[173786],{"type":23,"value":173787},"Polling is the standard method for comments using page-scoped filters.",{"type":17,"tag":84,"props":173789,"children":173790},{},[173791,173793,173798],{"type":23,"value":173792},"Threading is modeled via ",{"type":17,"tag":6121,"props":173794,"children":173796},{"className":173795},[],[173797],{"type":23,"value":15863},{"type":23,"value":173799}," when supported by the provider.",{"type":17,"tag":68,"props":173801,"children":173802},{"id":164849},[173803],{"type":23,"value":164852},{"type":17,"tag":29,"props":173805,"children":173806},{},[173807],{"type":23,"value":173808},"Knowledge content frequently contains sensitive operational detail. Unified's architecture minimizes exposure.",{"type":17,"tag":239,"props":173810,"children":173811},{"id":90302},[173812],{"type":23,"value":43670},{"type":17,"tag":80,"props":173814,"children":173815},{},[173816,173821,173826],{"type":17,"tag":84,"props":173817,"children":173818},{},[173819],{"type":23,"value":173820},"No KMS content is stored at rest.",{"type":17,"tag":84,"props":173822,"children":173823},{},[173824],{"type":23,"value":173825},"Requests are processed in transit and returned directly.",{"type":17,"tag":84,"props":173827,"children":173828},{},[173829],{"type":23,"value":173830},"Operational logs are minimized and redacted.",{"type":17,"tag":239,"props":173832,"children":173834},{"id":173833},"download-urls-and-attachments",[173835],{"type":23,"value":173836},"Download URLs and attachments",{"type":17,"tag":80,"props":173838,"children":173839},{},[173840,173852],{"type":17,"tag":84,"props":173841,"children":173842},{},[173843,173845,173850],{"type":23,"value":173844},"Page ",{"type":17,"tag":6121,"props":173846,"children":173848},{"className":173847},[],[173849],{"type":23,"value":24978},{"type":23,"value":173851}," values point back to the underlying provider's export behavior.",{"type":17,"tag":84,"props":173853,"children":173854},{},[173855],{"type":23,"value":173856},"Attachments are represented as metadata. File content is handled through File Storage.",{"type":17,"tag":239,"props":173858,"children":173860},{"id":173859},"raw-payload-support",[173861],{"type":23,"value":173862},"Raw payload support",{"type":17,"tag":29,"props":173864,"children":173865},{},[173866,173868,173873],{"type":23,"value":173867},"Every object can include a ",{"type":17,"tag":6121,"props":173869,"children":173871},{"className":173870},[],[173872],{"type":23,"value":62389},{"type":23,"value":173874}," payload for provider-specific fields. This payload is passed through as returned by the provider and should be handled with the same care as the normalized fields.",{"type":17,"tag":239,"props":173876,"children":173878},{"id":173877},"data-residency-and-access-controls",[173879],{"type":23,"value":173880},"Data residency and access controls",{"type":17,"tag":29,"props":173882,"children":173883},{},[173884],{"type":23,"value":173885},"Unified supports region-aware processing and standard enterprise controls including SSO, environment-scoped keys, and IP restrictions. Customers can store credentials in customer-managed secret vaults.",{"type":17,"tag":68,"props":173887,"children":173889},{"id":173888},"common-kms-api-integration-use-cases",[173890],{"type":23,"value":173891},"Common KMS API Integration Use Cases",{"type":17,"tag":239,"props":173893,"children":173895},{"id":173894},"cross-platform-knowledge-search",[173896],{"type":23,"value":173897},"Cross-platform knowledge search",{"type":17,"tag":29,"props":173899,"children":173900},{},[173901],{"type":23,"value":173902},"Build search that spans Confluence, Notion, Guru, and help centers through one schema.",{"type":17,"tag":239,"props":173904,"children":173906},{"id":173905},"documentation-portals-and-aggregation",[173907],{"type":23,"value":173908},"Documentation portals and aggregation",{"type":17,"tag":29,"props":173910,"children":173911},{},[173912],{"type":23,"value":173913},"Aggregate multiple knowledge sources into a unified portal without duplicating object models.",{"type":17,"tag":239,"props":173915,"children":173917},{"id":173916},"content-migration-and-synchronization",[173918],{"type":23,"value":173919},"Content migration and synchronization",{"type":17,"tag":29,"props":173921,"children":173922},{},[173923],{"type":23,"value":173924},"Migrate documentation from one platform to another or keep multiple sources aligned.",{"type":17,"tag":239,"props":173926,"children":173928},{"id":173927},"ai-knowledge-assistants",[173929],{"type":23,"value":23230},{"type":17,"tag":29,"props":173931,"children":173932},{},[173933],{"type":23,"value":173934},"Retrieve pages and comments as the source of truth for retrieval workflows, then combine with GenAI for embeddings and generation.",{"type":17,"tag":239,"props":173936,"children":173938},{"id":173937},"knowledge-analytics",[173939],{"type":23,"value":173940},"Knowledge analytics",{"type":17,"tag":29,"props":173942,"children":173943},{},[173944],{"type":23,"value":173945},"Track knowledge structure and update patterns across sources to identify gaps and outdated content.",{"type":17,"tag":68,"props":173947,"children":173948},{"id":164971},[173949],{"type":23,"value":164974},{"type":17,"tag":29,"props":173951,"children":173952},{},[173953],{"type":23,"value":173954},"KMS platforms behave differently, and integrations should be designed around:",{"type":17,"tag":80,"props":173956,"children":173957},{},[173958,173963,173968,173973],{"type":17,"tag":84,"props":173959,"children":173960},{},[173961],{"type":23,"value":173962},"Provider-specific write support",{"type":17,"tag":84,"props":173964,"children":173965},{},[173966],{"type":23,"value":173967},"Differences in comment threading",{"type":17,"tag":84,"props":173969,"children":173970},{},[173971],{"type":23,"value":173972},"Differences in event support across objects",{"type":17,"tag":84,"props":173974,"children":173975},{},[173976],{"type":23,"value":173977},"Differences in incremental polling support",{"type":17,"tag":29,"props":173979,"children":173980},{},[173981],{"type":23,"value":173982},"These are platform realities and are surfaced transparently through the unified model.",{"type":17,"tag":68,"props":173984,"children":173986},{"id":173985},"build-vs-maintain-kms-integrations",[173987],{"type":23,"value":173988},"Build vs Maintain KMS Integrations",{"type":17,"tag":239,"props":173990,"children":173991},{"id":165021},[173992],{"type":23,"value":171246},{"type":17,"tag":80,"props":173994,"children":173995},{},[173996,174001,174006,174011],{"type":17,"tag":84,"props":173997,"children":173998},{},[173999],{"type":23,"value":174000},"Multiple APIs to maintain",{"type":17,"tag":84,"props":174002,"children":174003},{},[174004],{"type":23,"value":174005},"Different hierarchy and content models",{"type":17,"tag":84,"props":174007,"children":174008},{},[174009],{"type":23,"value":174010},"Provider-specific event logic",{"type":17,"tag":84,"props":174012,"children":174013},{},[174014],{"type":23,"value":172645},{"type":17,"tag":239,"props":174016,"children":174018},{"id":174017},"using-a-unified-kms-api",[174019],{"type":23,"value":174020},"Using a unified KMS API",{"type":17,"tag":80,"props":174022,"children":174023},{},[174024,174029,174034,174039],{"type":17,"tag":84,"props":174025,"children":174026},{},[174027],{"type":23,"value":174028},"One normalized surface for spaces, pages, and comments",{"type":17,"tag":84,"props":174030,"children":174031},{},[174032],{"type":23,"value":174033},"Provider-aware write support",{"type":17,"tag":84,"props":174035,"children":174036},{},[174037],{"type":23,"value":174038},"Event delivery where providers support it",{"type":17,"tag":84,"props":174040,"children":174041},{},[174042],{"type":23,"value":174043},"Direct access to source platforms without a replica layer",{"type":17,"tag":68,"props":174045,"children":174047},{"id":174046},"build-knowledge-integrations-that-stay-current",[174048],{"type":23,"value":174049},"Build knowledge integrations that stay current",{"type":17,"tag":29,"props":174051,"children":174052},{},[174053],{"type":23,"value":174054},"If your product relies on knowledge content across multiple platforms, maintaining separate integrations becomes difficult to scale.",{"type":17,"tag":29,"props":174056,"children":174057},{},[174058,174059,174064],{"type":23,"value":25244},{"type":17,"tag":48,"props":174060,"children":174061},{},[174062],{"type":23,"value":174063},"KMS & Help Center API",{"type":23,"value":174065}," provides a consistent way to access spaces, pages, and comments across providers, without storing knowledge content at rest or collapsing boundaries with files, tickets, CRM, or messaging.",{"type":17,"tag":29,"props":174067,"children":174068},{},[174069],{"type":17,"tag":48,"props":174070,"children":174071},{},[174072],{"type":23,"value":44481},{"type":17,"tag":29,"props":174074,"children":174075},{},[174076],{"type":17,"tag":133,"props":174077,"children":174079},{"href":1612,"rel":174078},[214],[174080],{"type":23,"value":1612},{"type":17,"tag":29,"props":174082,"children":174083},{},[174084],{"type":17,"tag":48,"props":174085,"children":174086},{},[174087],{"type":23,"value":44490},{"type":17,"tag":29,"props":174089,"children":174090},{},[174091],{"type":17,"tag":133,"props":174092,"children":174094},{"href":1623,"rel":174093},[214],[174095],{"type":23,"value":1623},{"type":17,"tag":68,"props":174097,"children":174098},{"id":95759},[174099],{"type":23,"value":95762},{"type":17,"tag":29,"props":174101,"children":174102},{},[174103],{"type":17,"tag":48,"props":174104,"children":174105},{},[174106],{"type":23,"value":174107},"What objects does the KMS API expose?",{"type":17,"tag":29,"props":174109,"children":174110},{},[174111],{"type":23,"value":174112},"Spaces, pages, and comments.",{"type":17,"tag":29,"props":174114,"children":174115},{},[174116],{"type":17,"tag":48,"props":174117,"children":174118},{},[174119],{"type":23,"value":174120},"How does KMS differ from File Storage?",{"type":17,"tag":29,"props":174122,"children":174123},{},[174124],{"type":23,"value":174125},"KMS manages structured knowledge pages and comments. File Storage manages files and folders.",{"type":17,"tag":29,"props":174127,"children":174128},{},[174129],{"type":17,"tag":48,"props":174130,"children":174131},{},[174132],{"type":23,"value":174133},"Can I create or update knowledge pages through the API?",{"type":17,"tag":29,"props":174135,"children":174136},{},[174137],{"type":23,"value":174138},"Yes, subject to provider support.",{"type":17,"tag":29,"props":174140,"children":174141},{},[174142],{"type":17,"tag":48,"props":174143,"children":174144},{},[174145],{"type":23,"value":172762},{"type":17,"tag":29,"props":174147,"children":174148},{},[174149],{"type":23,"value":174150},"Through native events, virtual events, or polling depending on provider and object support.",{"type":17,"tag":29,"props":174152,"children":174153},{},[174154],{"type":17,"tag":48,"props":174155,"children":174156},{},[174157],{"type":23,"value":174158},"Does Unified store knowledge content?",{"type":17,"tag":29,"props":174160,"children":174161},{},[174162],{"type":23,"value":174163},"No. Knowledge content is not stored at rest.",{"type":17,"tag":29,"props":174165,"children":174166},{},[174167],{"type":17,"tag":48,"props":174168,"children":174169},{},[174170],{"type":23,"value":174171},"How do I build an AI knowledge assistant?",{"type":17,"tag":29,"props":174173,"children":174174},{},[174175],{"type":23,"value":174176},"Use KMS to retrieve knowledge content and GenAI to run embeddings and generation.",{"title":7,"searchDepth":1629,"depth":1629,"links":174178},[174179,174180,174181,174182,174186,174191,174192,174193,174198,174204,174211,174212,174216,174217],{"id":172872,"depth":1629,"text":172875},{"id":172916,"depth":1629,"text":172919},{"id":172969,"depth":1629,"text":172972},{"id":173065,"depth":1629,"text":173068,"children":174183},[174184,174185],{"id":173071,"depth":1635,"text":173074},{"id":173087,"depth":1635,"text":173090},{"id":173158,"depth":1629,"text":173161,"children":174187},[174188,174189,174190],{"id":173185,"depth":1635,"text":173188},{"id":23777,"depth":1635,"text":173306},{"id":164196,"depth":1635,"text":31629},{"id":173557,"depth":1629,"text":173560},{"id":173635,"depth":1629,"text":173638},{"id":173681,"depth":1629,"text":173684,"children":174194},[174195,174196,174197],{"id":173687,"depth":1635,"text":173306},{"id":173733,"depth":1635,"text":173188},{"id":173767,"depth":1635,"text":31629},{"id":164849,"depth":1629,"text":164852,"children":174199},[174200,174201,174202,174203],{"id":90302,"depth":1635,"text":43670},{"id":173833,"depth":1635,"text":173836},{"id":173859,"depth":1635,"text":173862},{"id":173877,"depth":1635,"text":173880},{"id":173888,"depth":1629,"text":173891,"children":174205},[174206,174207,174208,174209,174210],{"id":173894,"depth":1635,"text":173897},{"id":173905,"depth":1635,"text":173908},{"id":173916,"depth":1635,"text":173919},{"id":173927,"depth":1635,"text":23230},{"id":173937,"depth":1635,"text":173940},{"id":164971,"depth":1629,"text":164974},{"id":173985,"depth":1629,"text":173988,"children":174213},[174214,174215],{"id":165021,"depth":1635,"text":171246},{"id":174017,"depth":1635,"text":174020},{"id":174046,"depth":1629,"text":174049},{"id":95759,"depth":1629,"text":95762},"content:blog:knowledge_management_api_integration_spaces_pages_comments_and_real_time_knowledge_content_across_platforms.md","blog/knowledge_management_api_integration_spaces_pages_comments_and_real_time_knowledge_content_across_platforms.md","blog/knowledge_management_api_integration_spaces_pages_comments_and_real_time_knowledge_content_across_platforms",{"_path":174222,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":174223,"description":174224,"img":174225,"date":174226,"tag":12,"body":174227,"_type":1677,"_id":175173,"_source":1679,"_file":175174,"_stem":175175,"_extension":1682},"/blog/rag_with_saas_data_files_tickets_crm_and_why_normalization_matters","RAG with SaaS Data: Files, Tickets, CRM, and Why Normalization Matters","Retrieval-augmented generation (RAG) works well in controlled demos.","https://s3.us-east-2.amazonaws.com/unified-article-images/rag_with_saas_data_files_tickets_crm_and_why_normalization_matters-icon.png","2026-02-11T22:54:00.000Z",{"type":14,"children":174228,"toc":175152},[174229,174234,174237,174245,174254,174259,174264,174276,174281,174287,174292,174297,174302,174307,174312,174317,174322,174350,174355,174360,174366,174371,174377,174382,174429,174434,174452,174457,174462,174468,174473,174478,174486,174491,174499,174504,174512,174517,174522,174528,174533,174577,174582,174588,174593,174631,174636,174644,174649,174655,174660,174665,174688,174693,174699,174704,174710,174729,174735,174740,174745,174751,174756,174761,174766,174772,174777,174810,174815,174820,174826,174837,174842,174875,174879,174887,174892,174897,174903,174908,174941,174946,174952,174957,175000,175005,175016,175021,175027,175032,175059,175064,175069,175087,175092,175097,175101,175106,175111,175119,175124,175129,175134,175143],{"type":17,"tag":18,"props":174230,"children":174232},{"id":174231},"rag-with-saas-data-files-tickets-crm-and-why-normalization-matters",[174233],{"type":23,"value":174223},{"type":17,"tag":25,"props":174235,"children":174236},{},[],{"type":17,"tag":29,"props":174238,"children":174239},{},[174240],{"type":17,"tag":33,"props":174241,"children":174242},{},[174243],{"type":23,"value":174244},"February 11, 2026",{"type":17,"tag":29,"props":174246,"children":174247},{},[174248,174252],{"type":17,"tag":133,"props":174249,"children":174250},{"href":77021},[174251],{"type":23,"value":137991},{"type":23,"value":174253}," (RAG) works well in controlled demos.",{"type":17,"tag":29,"props":174255,"children":174256},{},[174257],{"type":23,"value":174258},"A clean documentation corpus. Well-formatted markdown. Consistent fields. Single source.",{"type":17,"tag":29,"props":174260,"children":174261},{},[174262],{"type":23,"value":174263},"Enterprise SaaS data is nothing like that.",{"type":17,"tag":29,"props":174265,"children":174266},{},[174267,174269,174274],{"type":23,"value":174268},"If you're building AI features that pull from CRM records, support tickets, file storage, and applicant tracking systems, your RAG pipeline isn't retrieving 'documents.' It's retrieving ",{"type":17,"tag":48,"props":174270,"children":174271},{},[174272],{"type":23,"value":174273},"heterogeneous SaaS objects",{"type":23,"value":174275}," — each with different schemas, naming conventions, enums, relationships, and custom fields.",{"type":17,"tag":29,"props":174277,"children":174278},{},[174279],{"type":23,"value":174280},"This article explains why that matters — and why normalization is not optional when building production RAG systems on top of SaaS data.",{"type":17,"tag":68,"props":174282,"children":174284},{"id":174283},"saas-data-was-built-for-humans-not-embedding-models",[174285],{"type":23,"value":174286},"SaaS Data Was Built for Humans, Not Embedding Models",{"type":17,"tag":29,"props":174288,"children":174289},{},[174290],{"type":23,"value":174291},"Enterprise SaaS platforms evolved independently.",{"type":17,"tag":29,"props":174293,"children":174294},{},[174295],{"type":23,"value":174296},"Salesforce optimized for account-centric workflows.",{"type":17,"tag":29,"props":174298,"children":174299},{},[174300],{"type":23,"value":174301},"HubSpot optimized for contact-centric engagement.",{"type":17,"tag":29,"props":174303,"children":174304},{},[174305],{"type":23,"value":174306},"Zendesk optimized for ticket resolution.",{"type":17,"tag":29,"props":174308,"children":174309},{},[174310],{"type":23,"value":174311},"Google Drive optimized for file storage and sharing.",{"type":17,"tag":29,"props":174313,"children":174314},{},[174315],{"type":23,"value":174316},"Greenhouse optimized for hiring pipelines.",{"type":17,"tag":29,"props":174318,"children":174319},{},[174320],{"type":23,"value":174321},"Each platform made different design choices:",{"type":17,"tag":80,"props":174323,"children":174324},{},[174325,174330,174335,174340,174345],{"type":17,"tag":84,"props":174326,"children":174327},{},[174328],{"type":23,"value":174329},"Different object hierarchies",{"type":17,"tag":84,"props":174331,"children":174332},{},[174333],{"type":23,"value":174334},"Different required fields",{"type":17,"tag":84,"props":174336,"children":174337},{},[174338],{"type":23,"value":174339},"Different enum values",{"type":17,"tag":84,"props":174341,"children":174342},{},[174343],{"type":23,"value":174344},"Different timestamp semantics",{"type":17,"tag":84,"props":174346,"children":174347},{},[174348],{"type":23,"value":174349},"Different customization mechanisms",{"type":17,"tag":29,"props":174351,"children":174352},{},[174353],{"type":23,"value":174354},"Those differences are invisible to human users inside each product.",{"type":17,"tag":29,"props":174356,"children":174357},{},[174358],{"type":23,"value":174359},"They are not invisible to a RAG pipeline.",{"type":17,"tag":68,"props":174361,"children":174363},{"id":174362},"the-structural-reality-across-categories",[174364],{"type":23,"value":174365},"The Structural Reality Across Categories",{"type":17,"tag":29,"props":174367,"children":174368},{},[174369],{"type":23,"value":174370},"Let's look at how structural heterogeneity appears across categories.",{"type":17,"tag":239,"props":174372,"children":174374},{"id":174373},"crm-same-concept-different-model",[174375],{"type":23,"value":174376},"CRM: Same Concept, Different Model",{"type":17,"tag":29,"props":174378,"children":174379},{},[174380],{"type":23,"value":174381},"Across major CRM platforms:",{"type":17,"tag":80,"props":174383,"children":174384},{},[174385,174409,174414,174419,174424],{"type":17,"tag":84,"props":174386,"children":174387},{},[174388,174390,174396,174397,174403,174404],{"type":23,"value":174389},"Deal stage may be ",{"type":17,"tag":6121,"props":174391,"children":174393},{"className":174392},[],[174394],{"type":23,"value":174395},"StageName",{"type":23,"value":11826},{"type":17,"tag":6121,"props":174398,"children":174400},{"className":174399},[],[174401],{"type":23,"value":174402},"dealstage",{"type":23,"value":27293},{"type":17,"tag":6121,"props":174405,"children":174407},{"className":174406},[],[174408],{"type":23,"value":25923},{"type":17,"tag":84,"props":174410,"children":174411},{},[174412],{"type":23,"value":174413},"Probability may be derived automatically, explicitly set, or absent",{"type":17,"tag":84,"props":174415,"children":174416},{},[174417],{"type":23,"value":174418},"Relationships between deal → contact → company differ",{"type":17,"tag":84,"props":174420,"children":174421},{},[174422],{"type":23,"value":174423},"Custom objects may be unlimited or tightly constrained",{"type":17,"tag":84,"props":174425,"children":174426},{},[174427],{"type":23,"value":174428},"Status semantics vary per pipeline",{"type":17,"tag":29,"props":174430,"children":174431},{},[174432],{"type":23,"value":174433},"Even the core object hierarchy differs:",{"type":17,"tag":80,"props":174435,"children":174436},{},[174437,174442,174447],{"type":17,"tag":84,"props":174438,"children":174439},{},[174440],{"type":23,"value":174441},"Some CRMs center around accounts",{"type":17,"tag":84,"props":174443,"children":174444},{},[174445],{"type":23,"value":174446},"Others center around contacts",{"type":17,"tag":84,"props":174448,"children":174449},{},[174450],{"type":23,"value":174451},"Others link deals primarily to persons and organizations",{"type":17,"tag":29,"props":174453,"children":174454},{},[174455],{"type":23,"value":174456},"If you embed raw CRM payloads across providers without alignment, you are embedding structurally different concepts into the same vector space.",{"type":17,"tag":29,"props":174458,"children":174459},{},[174460],{"type":23,"value":174461},"That fragments similarity.",{"type":17,"tag":239,"props":174463,"children":174465},{"id":174464},"ticketing-status-is-not-portable",[174466],{"type":23,"value":174467},"Ticketing: Status Is Not Portable",{"type":17,"tag":29,"props":174469,"children":174470},{},[174471],{"type":23,"value":174472},"'Status' is not a universal concept.",{"type":17,"tag":29,"props":174474,"children":174475},{},[174476],{"type":23,"value":174477},"One system may use:",{"type":17,"tag":80,"props":174479,"children":174480},{},[174481],{"type":17,"tag":84,"props":174482,"children":174483},{},[174484],{"type":23,"value":174485},"New, Open, Pending, Solved, Closed",{"type":17,"tag":29,"props":174487,"children":174488},{},[174489],{"type":23,"value":174490},"Another may use:",{"type":17,"tag":80,"props":174492,"children":174493},{},[174494],{"type":17,"tag":84,"props":174495,"children":174496},{},[174497],{"type":23,"value":174498},"To Do, In Review, Approved, Cancelled",{"type":17,"tag":29,"props":174500,"children":174501},{},[174502],{"type":23,"value":174503},"Another:",{"type":17,"tag":80,"props":174505,"children":174506},{},[174507],{"type":17,"tag":84,"props":174508,"children":174509},{},[174510],{"type":23,"value":174511},"Open, Snoozed, Closed",{"type":17,"tag":29,"props":174513,"children":174514},{},[174515],{"type":23,"value":174516},"Without normalization, a filter for 'open issues' silently misses data across providers because enum values are inconsistent.",{"type":17,"tag":29,"props":174518,"children":174519},{},[174520],{"type":23,"value":174521},"Worse: if you concatenate ticket metadata directly into embedding text, those inconsistencies distort semantic meaning.",{"type":17,"tag":239,"props":174523,"children":174525},{"id":174524},"file-storage-object-types-are-modeled-differently",[174526],{"type":23,"value":174527},"File Storage: Object Types Are Modeled Differently",{"type":17,"tag":29,"props":174529,"children":174530},{},[174531],{"type":23,"value":174532},"In file storage platforms:",{"type":17,"tag":80,"props":174534,"children":174535},{},[174536,174547,174558,174567,174572],{"type":17,"tag":84,"props":174537,"children":174538},{},[174539,174541],{"type":23,"value":174540},"A folder may be identified by ",{"type":17,"tag":6121,"props":174542,"children":174544},{"className":174543},[],[174545],{"type":23,"value":174546},"mimeType",{"type":17,"tag":84,"props":174548,"children":174549},{},[174550,174552],{"type":23,"value":174551},"Or by ",{"type":17,"tag":6121,"props":174553,"children":174555},{"className":174554},[],[174556],{"type":23,"value":174557},".tag",{"type":17,"tag":84,"props":174559,"children":174560},{},[174561,174562],{"type":23,"value":174551},{"type":17,"tag":6121,"props":174563,"children":174565},{"className":174564},[],[174566],{"type":23,"value":27310},{"type":17,"tag":84,"props":174568,"children":174569},{},[174570],{"type":23,"value":174571},"Parent relationships may be single IDs or full breadcrumb paths",{"type":17,"tag":84,"props":174573,"children":174574},{},[174575],{"type":23,"value":174576},"Permissions may be embedded differently per provider",{"type":17,"tag":29,"props":174578,"children":174579},{},[174580],{"type":23,"value":174581},"If your RAG pipeline indexes files and folders in the same vector collection without type normalization, retrieval may surface folder metadata when you intended file content — or vice versa.",{"type":17,"tag":239,"props":174583,"children":174585},{"id":174584},"ats-pipeline-state-is-vendor-specific",[174586],{"type":23,"value":174587},"ATS: Pipeline State Is Vendor-Specific",{"type":17,"tag":29,"props":174589,"children":174590},{},[174591],{"type":23,"value":174592},"In ATS platforms:",{"type":17,"tag":80,"props":174594,"children":174595},{},[174596,174621,174626],{"type":17,"tag":84,"props":174597,"children":174598},{},[174599,174601,174607,174608,174614,174615],{"type":23,"value":174600},"Candidate status might be ",{"type":17,"tag":6121,"props":174602,"children":174604},{"className":174603},[],[174605],{"type":23,"value":174606},"active",{"type":23,"value":11826},{"type":17,"tag":6121,"props":174609,"children":174611},{"className":174610},[],[174612],{"type":23,"value":174613},"rejected",{"type":23,"value":11826},{"type":17,"tag":6121,"props":174616,"children":174618},{"className":174617},[],[174619],{"type":23,"value":174620},"hired",{"type":17,"tag":84,"props":174622,"children":174623},{},[174624],{"type":23,"value":174625},"Or it may be represented via opportunity 'archived' states",{"type":17,"tag":84,"props":174627,"children":174628},{},[174629],{"type":23,"value":174630},"Or split across multiple workflow stages and steps",{"type":17,"tag":29,"props":174632,"children":174633},{},[174634],{"type":23,"value":174635},"A cross-system query like:",{"type":17,"tag":3414,"props":174637,"children":174638},{},[174639],{"type":17,"tag":29,"props":174640,"children":174641},{},[174642],{"type":23,"value":174643},"'Show candidates still in process for enterprise accounts'",{"type":17,"tag":29,"props":174645,"children":174646},{},[174647],{"type":23,"value":174648},"cannot be answered reliably unless status semantics are aligned first.",{"type":17,"tag":68,"props":174650,"children":174652},{"id":174651},"why-raw-saas-payloads-break-vector-retrieval",[174653],{"type":23,"value":174654},"Why Raw SaaS Payloads Break Vector Retrieval",{"type":17,"tag":29,"props":174656,"children":174657},{},[174658],{"type":23,"value":174659},"Embedding models are trained on natural language.",{"type":17,"tag":29,"props":174661,"children":174662},{},[174663],{"type":23,"value":174664},"They are not trained on:",{"type":17,"tag":80,"props":174666,"children":174667},{},[174668,174673,174678,174683],{"type":17,"tag":84,"props":174669,"children":174670},{},[174671],{"type":23,"value":174672},"Nested JSON blobs",{"type":17,"tag":84,"props":174674,"children":174675},{},[174676],{"type":23,"value":174677},"Provider-specific field names",{"type":17,"tag":84,"props":174679,"children":174680},{},[174681],{"type":23,"value":174682},"Mixed enum vocabularies",{"type":17,"tag":84,"props":174684,"children":174685},{},[174686],{"type":23,"value":174687},"Or orphaned relational IDs",{"type":17,"tag":29,"props":174689,"children":174690},{},[174691],{"type":23,"value":174692},"When you embed raw SaaS objects directly:",{"type":17,"tag":239,"props":174694,"children":174696},{"id":174695},"_1-structural-noise-dilutes-semantics",[174697],{"type":23,"value":174698},"1. Structural Noise Dilutes Semantics",{"type":17,"tag":29,"props":174700,"children":174701},{},[174702],{"type":23,"value":174703},"JSON syntax, internal IDs, and unrelated fields become part of the token stream. That shifts vector representations away from meaningful content.",{"type":17,"tag":239,"props":174705,"children":174707},{"id":174706},"_2-field-name-fragmentation-scatters-similar-records",[174708],{"type":23,"value":174709},"2. Field Name Fragmentation Scatters Similar Records",{"type":17,"tag":29,"props":174711,"children":174712},{},[174713,174715,174720,174722,174727],{"type":23,"value":174714},"If one provider uses ",{"type":17,"tag":6121,"props":174716,"children":174718},{"className":174717},[],[174719],{"type":23,"value":174402},{"type":23,"value":174721}," and another uses ",{"type":17,"tag":6121,"props":174723,"children":174725},{"className":174724},[],[174726],{"type":23,"value":174395},{"type":23,"value":174728},", embeddings for semantically identical records will not cluster as expected.",{"type":17,"tag":239,"props":174730,"children":174732},{"id":174731},"_3-missing-relationships-force-the-model-to-guess",[174733],{"type":23,"value":174734},"3. Missing Relationships Force the Model to Guess",{"type":17,"tag":29,"props":174736,"children":174737},{},[174738],{"type":23,"value":174739},"Vector retrieval does not understand relational joins.",{"type":17,"tag":29,"props":174741,"children":174742},{},[174743],{"type":23,"value":174744},"If relationships (e.g., ticket belongs to customer) are not made explicit before embedding, the LLM must infer connections. That increases hallucination risk.",{"type":17,"tag":239,"props":174746,"children":174748},{"id":174747},"_4-custom-fields-introduce-drift",[174749],{"type":23,"value":174750},"4. Custom Fields Introduce Drift",{"type":17,"tag":29,"props":174752,"children":174753},{},[174754],{"type":23,"value":174755},"Enterprise tenants create custom fields and picklists.",{"type":17,"tag":29,"props":174757,"children":174758},{},[174759],{"type":23,"value":174760},"If those fields are embedded inconsistently or without validation, the vector space gradually fragments.",{"type":17,"tag":29,"props":174762,"children":174763},{},[174764],{"type":23,"value":174765},"Schema drift upstream silently degrades retrieval quality.",{"type":17,"tag":68,"props":174767,"children":174769},{"id":174768},"rag-failure-modes-in-multi-source-pipelines",[174770],{"type":23,"value":174771},"RAG Failure Modes in Multi-Source Pipelines",{"type":17,"tag":29,"props":174773,"children":174774},{},[174775],{"type":23,"value":174776},"When normalization boundaries are unclear, several brittle behaviors emerge:",{"type":17,"tag":80,"props":174778,"children":174779},{},[174780,174785,174790,174795,174800,174805],{"type":17,"tag":84,"props":174781,"children":174782},{},[174783],{"type":23,"value":174784},"Duplicate records retrieved because identity resolution was not enforced",{"type":17,"tag":84,"props":174786,"children":174787},{},[174788],{"type":23,"value":174789},"Filters missing records due to inconsistent enum mapping",{"type":17,"tag":84,"props":174791,"children":174792},{},[174793],{"type":23,"value":174794},"Mis-joined context across systems (e.g., wrong customer linked to ticket)",{"type":17,"tag":84,"props":174796,"children":174797},{},[174798],{"type":23,"value":174799},"Embeddings that blend unrelated object types",{"type":17,"tag":84,"props":174801,"children":174802},{},[174803],{"type":23,"value":174804},"Retrieval ambiguity when object IDs collide across providers",{"type":17,"tag":84,"props":174806,"children":174807},{},[174808],{"type":23,"value":174809},"Cross-tenant leakage if identifiers are not consistently scoped",{"type":17,"tag":29,"props":174811,"children":174812},{},[174813],{"type":23,"value":174814},"These are not model problems.",{"type":17,"tag":29,"props":174816,"children":174817},{},[174818],{"type":23,"value":174819},"They are data modeling problems.",{"type":17,"tag":68,"props":174821,"children":174823},{"id":174822},"what-normalization-actually-means-in-ai-infrastructure",[174824],{"type":23,"value":174825},"What Normalization Actually Means (In AI Infrastructure)",{"type":17,"tag":29,"props":174827,"children":174828},{},[174829,174831,174835],{"type":23,"value":174830},"Normalization here does ",{"type":17,"tag":48,"props":174832,"children":174833},{},[174834],{"type":23,"value":159475},{"type":23,"value":174836}," mean database third normal form.",{"type":17,"tag":29,"props":174838,"children":174839},{},[174840],{"type":23,"value":174841},"It means:",{"type":17,"tag":80,"props":174843,"children":174844},{},[174845,174850,174855,174860,174865,174870],{"type":17,"tag":84,"props":174846,"children":174847},{},[174848],{"type":23,"value":174849},"Defining consistent object models per category",{"type":17,"tag":84,"props":174851,"children":174852},{},[174853],{"type":23,"value":174854},"Aligning field names across providers",{"type":17,"tag":84,"props":174856,"children":174857},{},[174858],{"type":23,"value":174859},"Standardizing enum values",{"type":17,"tag":84,"props":174861,"children":174862},{},[174863],{"type":23,"value":174864},"Enforcing consistent timestamp formats",{"type":17,"tag":84,"props":174866,"children":174867},{},[174868],{"type":23,"value":174869},"Explicitly modeling relationships",{"type":17,"tag":84,"props":174871,"children":174872},{},[174873],{"type":23,"value":174874},"Separating provider-specific fields from core fields",{"type":17,"tag":29,"props":174876,"children":174877},{},[174878],{"type":23,"value":161783},{"type":17,"tag":3414,"props":174880,"children":174881},{},[174882],{"type":17,"tag":29,"props":174883,"children":174884},{},[174885],{"type":23,"value":174886},"Removing per-provider mapping logic from the embedding layer.",{"type":17,"tag":29,"props":174888,"children":174889},{},[174890],{"type":23,"value":174891},"Normalization ensures that when two records represent the same concept, they share the same semantic structure before embedding.",{"type":17,"tag":29,"props":174893,"children":174894},{},[174895],{"type":23,"value":174896},"That is what allows vector retrieval to behave deterministically.",{"type":17,"tag":68,"props":174898,"children":174900},{"id":174899},"why-this-matters-for-rag-quality",[174901],{"type":23,"value":174902},"Why This Matters for RAG Quality",{"type":17,"tag":29,"props":174904,"children":174905},{},[174906],{"type":23,"value":174907},"When SaaS data is normalized before embedding:",{"type":17,"tag":80,"props":174909,"children":174910},{},[174911,174916,174921,174926,174931,174936],{"type":17,"tag":84,"props":174912,"children":174913},{},[174914],{"type":23,"value":174915},"Similar records cluster correctly",{"type":17,"tag":84,"props":174917,"children":174918},{},[174919],{"type":23,"value":174920},"Filters operate consistently",{"type":17,"tag":84,"props":174922,"children":174923},{},[174924],{"type":23,"value":174925},"Cross-provider queries return complete results",{"type":17,"tag":84,"props":174927,"children":174928},{},[174929],{"type":23,"value":174930},"Relationship traversal becomes possible",{"type":17,"tag":84,"props":174932,"children":174933},{},[174934],{"type":23,"value":174935},"Schema drift is controlled instead of silently corrupting embeddings",{"type":17,"tag":84,"props":174937,"children":174938},{},[174939],{"type":23,"value":174940},"Multi-tenant scoping becomes enforceable",{"type":17,"tag":29,"props":174942,"children":174943},{},[174944],{"type":23,"value":174945},"Without normalization, retrieval quality degrades gradually and unpredictably.",{"type":17,"tag":68,"props":174947,"children":174949},{"id":174948},"what-this-looks-like-in-a-production-architecture",[174950],{"type":23,"value":174951},"What This Looks Like in a Production Architecture",{"type":17,"tag":29,"props":174953,"children":174954},{},[174955],{"type":23,"value":174956},"In production SaaS AI systems, teams typically:",{"type":17,"tag":6154,"props":174958,"children":174959},{},[174960,174965,174970,174975,174980,174985,174990,174995],{"type":17,"tag":84,"props":174961,"children":174962},{},[174963],{"type":23,"value":174964},"Retrieve SaaS data via category-specific APIs",{"type":17,"tag":84,"props":174966,"children":174967},{},[174968],{"type":23,"value":174969},"Transform provider payloads into consistent object models",{"type":17,"tag":84,"props":174971,"children":174972},{},[174973],{"type":23,"value":174974},"Validate and attach standardized fields",{"type":17,"tag":84,"props":174976,"children":174977},{},[174978],{"type":23,"value":174979},"Preserve provider-specific fields separately",{"type":17,"tag":84,"props":174981,"children":174982},{},[174983],{"type":23,"value":174984},"Chunk and embed normalized content",{"type":17,"tag":84,"props":174986,"children":174987},{},[174988],{"type":23,"value":174989},"Store embeddings in their own vector infrastructure",{"type":17,"tag":84,"props":174991,"children":174992},{},[174993],{"type":23,"value":174994},"Use event-driven updates to keep the index current",{"type":17,"tag":84,"props":174996,"children":174997},{},[174998],{"type":23,"value":174999},"Filter at query time by tenant and object type",{"type":17,"tag":29,"props":175001,"children":175002},{},[175003],{"type":23,"value":175004},"Unified is designed to support this model.",{"type":17,"tag":29,"props":175006,"children":175007},{},[175008,175010,175014],{"type":23,"value":175009},"Teams use Unified to retrieve data across CRM, ticketing, file storage, knowledge systems, and ATS platforms through consistent object models. Indexed content can be kept current via native or ",{"type":17,"tag":133,"props":175011,"children":175012},{"href":9007},[175013],{"type":23,"value":46572},{"type":23,"value":175015},", while operational data is fetched directly from source APIs in real time. Unified does not store end-customer payloads; customers store derived embeddings and indexes in their own infrastructure.\na4abf82b-cc9f-4eb2-b19a-c080ab7…",{"type":17,"tag":29,"props":175017,"children":175018},{},[175019],{"type":23,"value":175020},"This architecture allows normalization to occur before embedding, without introducing additional data-at-rest exposure.",{"type":17,"tag":68,"props":175022,"children":175024},{"id":175023},"why-this-is-especially-important-for-enterprise-buyers",[175025],{"type":23,"value":175026},"Why This Is Especially Important for Enterprise Buyers",{"type":17,"tag":29,"props":175028,"children":175029},{},[175030],{"type":23,"value":175031},"Enterprise SaaS customers care about:",{"type":17,"tag":80,"props":175033,"children":175034},{},[175035,175040,175045,175049,175054],{"type":17,"tag":84,"props":175036,"children":175037},{},[175038],{"type":23,"value":175039},"Predictable AI behavior",{"type":17,"tag":84,"props":175041,"children":175042},{},[175043],{"type":23,"value":175044},"Correctness across CRM and support data",{"type":17,"tag":84,"props":175046,"children":175047},{},[175048],{"type":23,"value":161285},{"type":17,"tag":84,"props":175050,"children":175051},{},[175052],{"type":23,"value":175053},"Compliance review simplicity",{"type":17,"tag":84,"props":175055,"children":175056},{},[175057],{"type":23,"value":175058},"Clear audit trails",{"type":17,"tag":29,"props":175060,"children":175061},{},[175062],{"type":23,"value":175063},"Normalization simplifies those conversations.",{"type":17,"tag":29,"props":175065,"children":175066},{},[175067],{"type":23,"value":175068},"When object models are consistent:",{"type":17,"tag":80,"props":175070,"children":175071},{},[175072,175077,175082],{"type":17,"tag":84,"props":175073,"children":175074},{},[175075],{"type":23,"value":175076},"Platform teams build integration logic once per category",{"type":17,"tag":84,"props":175078,"children":175079},{},[175080],{"type":23,"value":175081},"Security reviewers evaluate one documented schema instead of dozens of vendor payloads",{"type":17,"tag":84,"props":175083,"children":175084},{},[175085],{"type":23,"value":175086},"AI features operate on aligned data rather than stitched fragments",{"type":17,"tag":29,"props":175088,"children":175089},{},[175090],{"type":23,"value":175091},"Normalization is not a performance optimization.",{"type":17,"tag":29,"props":175093,"children":175094},{},[175095],{"type":23,"value":175096},"It is a reliability prerequisite.",{"type":17,"tag":68,"props":175098,"children":175099},{"id":2316},[175100],{"type":23,"value":2319},{"type":17,"tag":29,"props":175102,"children":175103},{},[175104],{"type":23,"value":175105},"RAG tutorials focus on embeddings, chunking, and vector databases.",{"type":17,"tag":29,"props":175107,"children":175108},{},[175109],{"type":23,"value":175110},"In enterprise SaaS, the harder problem is upstream:",{"type":17,"tag":3414,"props":175112,"children":175113},{},[175114],{"type":17,"tag":29,"props":175115,"children":175116},{},[175117],{"type":23,"value":175118},"Aligning heterogeneous SaaS data into consistent object models before embedding.",{"type":17,"tag":29,"props":175120,"children":175121},{},[175122],{"type":23,"value":175123},"Without that layer, vector retrieval fragments, filters fail, relationships break, and AI features become brittle.",{"type":17,"tag":29,"props":175125,"children":175126},{},[175127],{"type":23,"value":175128},"If you are building AI on top of CRM records, support tickets, file storage, or ATS platforms, normalization is the foundation.",{"type":17,"tag":29,"props":175130,"children":175131},{},[175132],{"type":23,"value":175133},"Everything else sits on top of it.",{"type":17,"tag":29,"props":175135,"children":175136},{},[175137,175138],{"type":23,"value":1609},{"type":17,"tag":133,"props":175139,"children":175141},{"href":1612,"rel":175140},[214],[175142],{"type":23,"value":1616},{"type":17,"tag":29,"props":175144,"children":175145},{},[175146,175147],{"type":23,"value":1609},{"type":17,"tag":133,"props":175148,"children":175150},{"href":1623,"rel":175149},[214],[175151],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":175153},[175154,175155,175161,175167,175168,175169,175170,175171,175172],{"id":174283,"depth":1629,"text":174286},{"id":174362,"depth":1629,"text":174365,"children":175156},[175157,175158,175159,175160],{"id":174373,"depth":1635,"text":174376},{"id":174464,"depth":1635,"text":174467},{"id":174524,"depth":1635,"text":174527},{"id":174584,"depth":1635,"text":174587},{"id":174651,"depth":1629,"text":174654,"children":175162},[175163,175164,175165,175166],{"id":174695,"depth":1635,"text":174698},{"id":174706,"depth":1635,"text":174709},{"id":174731,"depth":1635,"text":174734},{"id":174747,"depth":1635,"text":174750},{"id":174768,"depth":1629,"text":174771},{"id":174822,"depth":1629,"text":174825},{"id":174899,"depth":1629,"text":174902},{"id":174948,"depth":1629,"text":174951},{"id":175023,"depth":1629,"text":175026},{"id":2316,"depth":1629,"text":2319},"content:blog:rag_with_saas_data_files_tickets_crm_and_why_normalization_matters.md","blog/rag_with_saas_data_files_tickets_crm_and_why_normalization_matters.md","blog/rag_with_saas_data_files_tickets_crm_and_why_normalization_matters",{"_path":175177,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":175178,"description":175179,"img":175180,"date":175181,"tag":12,"body":175182,"_type":1677,"_id":176006,"_source":1679,"_file":176007,"_stem":176008,"_extension":1682},"/blog/erp_api_integration_cross_category_financial_hr_and_operations_data_across_platforms","ERP API Integration: Cross-Category Financial, HR, and Operations Data Across Platforms","ERP systems sit at the center of how companies operate. Finance, payroll, procurement, inventory, sometimes commerce, sometimes CRM — all converge inside...","https://s3.us-east-2.amazonaws.com/unified-article-images/erp_api_integration_cross_category_financial_hr_and_operations_data_across_platforms-icon.png","2026-02-10T16:12:00.000Z",{"type":14,"children":175183,"toc":175988},[175184,175189,175192,175200,175220,175225,175230,175235,175258,175264,175269,175307,175312,175317,175322,175327,175332,175337,175343,175348,175353,175411,175416,175439,175444,175449,175455,175460,175465,175469,175487,175492,175497,175502,175507,175512,175517,175522,175527,175532,175538,175543,175600,175605,175617,175622,175627,175632,175638,175643,175648,175670,175675,175680,175685,175691,175696,175719,175724,175729,175734,175752,175757,175762,175768,175774,175779,175785,175790,175796,175801,175807,175812,175818,175823,175829,175834,175862,175867,175873,175878,175883,175888,175893,175898,175907,175916,175919,175923,175931,175936,175944,175949,175957,175962,175970,175975,175983],{"type":17,"tag":18,"props":175185,"children":175187},{"id":175186},"erp-api-integration-cross-category-financial-hr-and-operations-data-across-platforms",[175188],{"type":23,"value":175178},{"type":17,"tag":25,"props":175190,"children":175191},{},[],{"type":17,"tag":29,"props":175193,"children":175194},{},[175195],{"type":17,"tag":33,"props":175196,"children":175197},{},[175198],{"type":23,"value":175199},"February 10, 2026",{"type":17,"tag":29,"props":175201,"children":175202},{},[175203,175205,175209,175210,175214,175215,175219],{"type":23,"value":175204},"ERP systems sit at the center of how companies operate. Finance, payroll, procurement, inventory, sometimes commerce, sometimes CRM — all converge inside platforms like ",{"type":17,"tag":48,"props":175206,"children":175207},{},[175208],{"type":23,"value":13070},{"type":23,"value":11826},{"type":17,"tag":48,"props":175211,"children":175212},{},[175213],{"type":23,"value":61598},{"type":23,"value":12561},{"type":17,"tag":48,"props":175216,"children":175217},{},[175218],{"type":23,"value":3199},{"type":23,"value":54},{"type":17,"tag":29,"props":175221,"children":175222},{},[175223],{"type":23,"value":175224},"From a buyer's perspective, that's an 'ERP integration.'",{"type":17,"tag":29,"props":175226,"children":175227},{},[175228],{"type":23,"value":175229},"From an architectural perspective, ERP is not a single domain.",{"type":17,"tag":29,"props":175231,"children":175232},{},[175233],{"type":23,"value":175234},"In this guide, we'll explain:",{"type":17,"tag":80,"props":175236,"children":175237},{},[175238,175243,175248,175253],{"type":17,"tag":84,"props":175239,"children":175240},{},[175241],{"type":23,"value":175242},"What ERP integrations actually require",{"type":17,"tag":84,"props":175244,"children":175245},{},[175246],{"type":23,"value":175247},"Why ERP spans multiple API domains",{"type":17,"tag":84,"props":175249,"children":175250},{},[175251],{"type":23,"value":175252},"How Unified supports ERP platforms without fragmenting objects",{"type":17,"tag":84,"props":175254,"children":175255},{},[175256],{"type":23,"value":175257},"And how this approach differs from traditional 'ERP API' categories",{"type":17,"tag":68,"props":175259,"children":175261},{"id":175260},"what-is-an-erp-api",[175262],{"type":23,"value":175263},"What Is an ERP API?",{"type":17,"tag":29,"props":175265,"children":175266},{},[175267],{"type":23,"value":175268},"An ERP API typically exposes:",{"type":17,"tag":80,"props":175270,"children":175271},{},[175272,175277,175282,175287,175292,175297,175302],{"type":17,"tag":84,"props":175273,"children":175274},{},[175275],{"type":23,"value":175276},"General ledger and financial records",{"type":17,"tag":84,"props":175278,"children":175279},{},[175280],{"type":23,"value":175281},"Invoices and bills",{"type":17,"tag":84,"props":175283,"children":175284},{},[175285],{"type":23,"value":175286},"Purchase and sales orders",{"type":17,"tag":84,"props":175288,"children":175289},{},[175290],{"type":23,"value":175291},"Inventory and items",{"type":17,"tag":84,"props":175293,"children":175294},{},[175295],{"type":23,"value":175296},"Employees and departments",{"type":17,"tag":84,"props":175298,"children":175299},{},[175300],{"type":23,"value":175301},"Vendor and customer master data",{"type":17,"tag":84,"props":175303,"children":175304},{},[175305],{"type":23,"value":175306},"Sometimes payments or subscriptions",{"type":17,"tag":29,"props":175308,"children":175309},{},[175310],{"type":23,"value":175311},"The challenge is that these objects belong to different functional domains.",{"type":17,"tag":29,"props":175313,"children":175314},{},[175315],{"type":23,"value":175316},"Accounting is not HR.",{"type":17,"tag":29,"props":175318,"children":175319},{},[175320],{"type":23,"value":175321},"HR is not Commerce.",{"type":17,"tag":29,"props":175323,"children":175324},{},[175325],{"type":23,"value":175326},"Commerce is not Payments.",{"type":17,"tag":29,"props":175328,"children":175329},{},[175330],{"type":23,"value":175331},"But ERP platforms contain all of them.",{"type":17,"tag":29,"props":175333,"children":175334},{},[175335],{"type":23,"value":175336},"That's why ERP integration is inherently cross-category.",{"type":17,"tag":68,"props":175338,"children":175340},{"id":175339},"erp-inside-unified",[175341],{"type":23,"value":175342},"ERP Inside Unified",{"type":17,"tag":29,"props":175344,"children":175345},{},[175346],{"type":23,"value":175347},"Unified absolutely supports ERP integrations.",{"type":17,"tag":29,"props":175349,"children":175350},{},[175351],{"type":23,"value":175352},"We simply model ERP platforms through the categories they actually represent:",{"type":17,"tag":80,"props":175354,"children":175355},{},[175356,175368,175377,175389,175402],{"type":17,"tag":84,"props":175357,"children":175358},{},[175359,175366],{"type":17,"tag":48,"props":175360,"children":175361},{},[175362],{"type":17,"tag":133,"props":175363,"children":175364},{"href":82425},[175365],{"type":23,"value":128616},{"type":23,"value":175367}," → invoices, bills, journal entries, orders, reports",{"type":17,"tag":84,"props":175369,"children":175370},{},[175371,175375],{"type":17,"tag":48,"props":175372,"children":175373},{},[175374],{"type":23,"value":122608},{"type":23,"value":175376}," → employees, departments, payroll entities",{"type":17,"tag":84,"props":175378,"children":175379},{},[175380,175387],{"type":17,"tag":48,"props":175381,"children":175382},{},[175383],{"type":17,"tag":133,"props":175384,"children":175385},{"href":20451},[175386],{"type":23,"value":20454},{"type":23,"value":175388}," → items, inventory, product structures",{"type":17,"tag":84,"props":175390,"children":175391},{},[175392,175400],{"type":17,"tag":48,"props":175393,"children":175394},{},[175395],{"type":17,"tag":133,"props":175396,"children":175397},{"href":35809},[175398],{"type":23,"value":175399},"Payment API",{"type":23,"value":175401}," → transactions, refunds, subscriptions",{"type":17,"tag":84,"props":175403,"children":175404},{},[175405,175409],{"type":17,"tag":48,"props":175406,"children":175407},{},[175408],{"type":23,"value":61565},{"type":23,"value":175410}," (where applicable) → contacts, companies, deal data",{"type":17,"tag":29,"props":175412,"children":175413},{},[175414],{"type":23,"value":175415},"If a customer connects NetSuite, for example, they may activate:",{"type":17,"tag":80,"props":175417,"children":175418},{},[175419,175424,175429,175434],{"type":17,"tag":84,"props":175420,"children":175421},{},[175422],{"type":23,"value":175423},"Accounting for financial modules",{"type":17,"tag":84,"props":175425,"children":175426},{},[175427],{"type":23,"value":175428},"HR for workforce data",{"type":17,"tag":84,"props":175430,"children":175431},{},[175432],{"type":23,"value":175433},"Commerce for inventory",{"type":17,"tag":84,"props":175435,"children":175436},{},[175437],{"type":23,"value":175438},"Payments for money movement",{"type":17,"tag":29,"props":175440,"children":175441},{},[175442],{"type":23,"value":175443},"From the customer's perspective, that's an ERP integration.",{"type":17,"tag":29,"props":175445,"children":175446},{},[175447],{"type":23,"value":175448},"Under the hood, it's domain-correct access across categories.",{"type":17,"tag":68,"props":175450,"children":175452},{"id":175451},"why-not-create-a-separate-erp-object-model",[175453],{"type":23,"value":175454},"Why Not Create a Separate ERP Object Model?",{"type":17,"tag":29,"props":175456,"children":175457},{},[175458],{"type":23,"value":175459},"Many integration platforms create a standalone 'ERP' category.",{"type":17,"tag":29,"props":175461,"children":175462},{},[175463],{"type":23,"value":175464},"The problem appears when object models start duplicating across categories.",{"type":17,"tag":29,"props":175466,"children":175467},{},[175468],{"type":23,"value":3258},{"type":17,"tag":80,"props":175470,"children":175471},{},[175472,175477,175482],{"type":17,"tag":84,"props":175473,"children":175474},{},[175475],{"type":23,"value":175476},"An ERP 'User' object",{"type":17,"tag":84,"props":175478,"children":175479},{},[175480],{"type":23,"value":175481},"A CRM 'User' object",{"type":17,"tag":84,"props":175483,"children":175484},{},[175485],{"type":23,"value":175486},"An HR 'User' object",{"type":17,"tag":29,"props":175488,"children":175489},{},[175490],{"type":23,"value":175491},"Each with slightly different fields.",{"type":17,"tag":29,"props":175493,"children":175494},{},[175495],{"type":23,"value":175496},"If a customer activates multiple categories — which they almost always do — they must map multiple user models that represent the same real-world person.",{"type":17,"tag":29,"props":175498,"children":175499},{},[175500],{"type":23,"value":175501},"That adds friction without adding capability.",{"type":17,"tag":29,"props":175503,"children":175504},{},[175505],{"type":23,"value":175506},"Unified avoids this duplication.",{"type":17,"tag":29,"props":175508,"children":175509},{},[175510],{"type":23,"value":175511},"We expose ERP data through its correct domain model.",{"type":17,"tag":29,"props":175513,"children":175514},{},[175515],{"type":23,"value":175516},"Accounting contacts remain accounting contacts.",{"type":17,"tag":29,"props":175518,"children":175519},{},[175520],{"type":23,"value":175521},"HR employees remain HR employees.",{"type":17,"tag":29,"props":175523,"children":175524},{},[175525],{"type":23,"value":175526},"CRM contacts remain CRM contacts.",{"type":17,"tag":29,"props":175528,"children":175529},{},[175530],{"type":23,"value":175531},"No extra ERP abstraction layer on top.",{"type":17,"tag":68,"props":175533,"children":175535},{"id":175534},"identity-across-erp-surfaces",[175536],{"type":23,"value":175537},"Identity Across ERP Surfaces",{"type":17,"tag":29,"props":175539,"children":175540},{},[175541],{"type":23,"value":175542},"Unified defines person-like objects inside their domains:",{"type":17,"tag":80,"props":175544,"children":175545},{},[175546,175555,175564,175573,175582,175591],{"type":17,"tag":84,"props":175547,"children":175548},{},[175549,175551],{"type":23,"value":175550},"HR → ",{"type":17,"tag":48,"props":175552,"children":175553},{},[175554],{"type":23,"value":61210},{"type":17,"tag":84,"props":175556,"children":175557},{},[175558,175560],{"type":23,"value":175559},"CRM → ",{"type":17,"tag":48,"props":175561,"children":175562},{},[175563],{"type":23,"value":25828},{"type":17,"tag":84,"props":175565,"children":175566},{},[175567,175569],{"type":23,"value":175568},"Accounting → ",{"type":17,"tag":48,"props":175570,"children":175571},{},[175572],{"type":23,"value":25828},{"type":17,"tag":84,"props":175574,"children":175575},{},[175576,175578],{"type":23,"value":175577},"Ticketing → ",{"type":17,"tag":48,"props":175579,"children":175580},{},[175581],{"type":23,"value":47609},{"type":17,"tag":84,"props":175583,"children":175584},{},[175585,175587],{"type":23,"value":175586},"Call Center → ",{"type":17,"tag":48,"props":175588,"children":175589},{},[175590],{"type":23,"value":25828},{"type":17,"tag":84,"props":175592,"children":175593},{},[175594,175596],{"type":23,"value":175595},"SCIM → ",{"type":17,"tag":48,"props":175597,"children":175598},{},[175599],{"type":23,"value":118801},{"type":17,"tag":29,"props":175601,"children":175602},{},[175603],{"type":23,"value":175604},"These are domain-specific by design.",{"type":17,"tag":29,"props":175606,"children":175607},{},[175608,175610,175615],{"type":23,"value":175609},"Many operational objects include a ",{"type":17,"tag":6121,"props":175611,"children":175613},{"className":175612},[],[175614],{"type":23,"value":62582},{"type":23,"value":175616}," that references an HR Employee for internal attribution. That allows consistent internal user tracking across categories without collapsing all external identities into one artificial model.",{"type":17,"tag":29,"props":175618,"children":175619},{},[175620],{"type":23,"value":175621},"There is no separate ERP-only 'User' object.",{"type":17,"tag":29,"props":175623,"children":175624},{},[175625],{"type":23,"value":175626},"ERP platforms are represented through the objects that already exist in the relevant categories.",{"type":17,"tag":29,"props":175628,"children":175629},{},[175630],{"type":23,"value":175631},"That keeps mappings consistent when multiple modules are active.",{"type":17,"tag":68,"props":175633,"children":175635},{"id":175634},"real-time-erp-data-access",[175636],{"type":23,"value":175637},"Real-Time ERP Data Access",{"type":17,"tag":29,"props":175639,"children":175640},{},[175641],{"type":23,"value":175642},"ERP integrations are often assumed to be batch-oriented.",{"type":17,"tag":29,"props":175644,"children":175645},{},[175646],{"type":23,"value":175647},"Unified's architecture remains:",{"type":17,"tag":80,"props":175649,"children":175650},{},[175651,175655,175660,175665],{"type":17,"tag":84,"props":175652,"children":175653},{},[175654],{"type":23,"value":87550},{"type":17,"tag":84,"props":175656,"children":175657},{},[175658],{"type":23,"value":175659},"No cached replicas",{"type":17,"tag":84,"props":175661,"children":175662},{},[175663],{"type":23,"value":175664},"No shadow ERP database",{"type":17,"tag":84,"props":175666,"children":175667},{},[175668],{"type":23,"value":175669},"No system-of-record duplication",{"type":17,"tag":29,"props":175671,"children":175672},{},[175673],{"type":23,"value":175674},"If you retrieve an invoice from NetSuite via the Accounting API, it comes directly from NetSuite.",{"type":17,"tag":29,"props":175676,"children":175677},{},[175678],{"type":23,"value":175679},"If you retrieve employees from Dynamics via the HR API, it comes directly from Dynamics.",{"type":17,"tag":29,"props":175681,"children":175682},{},[175683],{"type":23,"value":175684},"ERP is treated as a composition of real-time domain integrations.",{"type":17,"tag":68,"props":175686,"children":175688},{"id":175687},"where-this-differs-from-other-erp-apis",[175689],{"type":23,"value":175690},"Where This Differs From Other 'ERP APIs'",{"type":17,"tag":29,"props":175692,"children":175693},{},[175694],{"type":23,"value":175695},"Some vendors advertise an ERP API category that includes:",{"type":17,"tag":80,"props":175697,"children":175698},{},[175699,175704,175709,175714],{"type":17,"tag":84,"props":175700,"children":175701},{},[175702],{"type":23,"value":175703},"ERP-specific Users",{"type":17,"tag":84,"props":175705,"children":175706},{},[175707],{"type":23,"value":175708},"ERP-specific Customers",{"type":17,"tag":84,"props":175710,"children":175711},{},[175712],{"type":23,"value":175713},"ERP-specific Orders",{"type":17,"tag":84,"props":175715,"children":175716},{},[175717],{"type":23,"value":175718},"ERP-specific Items",{"type":17,"tag":29,"props":175720,"children":175721},{},[175722],{"type":23,"value":175723},"Those objects often overlap with CRM, HR, or Commerce models in slightly different forms.",{"type":17,"tag":29,"props":175725,"children":175726},{},[175727],{"type":23,"value":175728},"It can look like broader coverage.",{"type":17,"tag":29,"props":175730,"children":175731},{},[175732],{"type":23,"value":175733},"In practice, it means:",{"type":17,"tag":80,"props":175735,"children":175736},{},[175737,175742,175747],{"type":17,"tag":84,"props":175738,"children":175739},{},[175740],{"type":23,"value":175741},"More object duplication",{"type":17,"tag":84,"props":175743,"children":175744},{},[175745],{"type":23,"value":175746},"More schema mapping",{"type":17,"tag":84,"props":175748,"children":175749},{},[175750],{"type":23,"value":175751},"More complexity when activating multiple categories",{"type":17,"tag":29,"props":175753,"children":175754},{},[175755],{"type":23,"value":175756},"Unified's approach is to categorize by business domain, not by vendor packaging.",{"type":17,"tag":29,"props":175758,"children":175759},{},[175760],{"type":23,"value":175761},"ERP systems simply surface through the domains they contain.",{"type":17,"tag":68,"props":175763,"children":175765},{"id":175764},"typical-erp-integration-use-cases",[175766],{"type":23,"value":175767},"Typical ERP Integration Use Cases",{"type":17,"tag":239,"props":175769,"children":175771},{"id":175770},"financial-consolidation",[175772],{"type":23,"value":175773},"Financial Consolidation",{"type":17,"tag":29,"props":175775,"children":175776},{},[175777],{"type":23,"value":175778},"Pull invoices, bills, and journal entries through the Accounting API across ERP platforms.",{"type":17,"tag":239,"props":175780,"children":175782},{"id":175781},"workforce-synchronization",[175783],{"type":23,"value":175784},"Workforce Synchronization",{"type":17,"tag":29,"props":175786,"children":175787},{},[175788],{"type":23,"value":175789},"Access employee and department data through the HR API.",{"type":17,"tag":239,"props":175791,"children":175793},{"id":175792},"inventory-procurement",[175794],{"type":23,"value":175795},"Inventory & Procurement",{"type":17,"tag":29,"props":175797,"children":175798},{},[175799],{"type":23,"value":175800},"Sync items and stock levels via Commerce, and purchase orders via Accounting.",{"type":17,"tag":239,"props":175802,"children":175804},{"id":175803},"revenue-subscription-reporting",[175805],{"type":23,"value":175806},"Revenue & Subscription Reporting",{"type":17,"tag":29,"props":175808,"children":175809},{},[175810],{"type":23,"value":175811},"Combine Accounting and Payment APIs to reconcile ERP financial flows.",{"type":17,"tag":239,"props":175813,"children":175815},{"id":175814},"cross-system-workflows",[175816],{"type":23,"value":175817},"Cross-System Workflows",{"type":17,"tag":29,"props":175819,"children":175820},{},[175821],{"type":23,"value":175822},"Link CRM deals to ERP invoices without introducing a separate ERP contact layer.",{"type":17,"tag":68,"props":175824,"children":175826},{"id":175825},"designing-erp-integrations-cleanly",[175827],{"type":23,"value":175828},"Designing ERP Integrations Cleanly",{"type":17,"tag":29,"props":175830,"children":175831},{},[175832],{"type":23,"value":175833},"When integrating ERP systems:",{"type":17,"tag":80,"props":175835,"children":175836},{},[175837,175842,175847,175852,175857],{"type":17,"tag":84,"props":175838,"children":175839},{},[175840],{"type":23,"value":175841},"Activate only the relevant domains",{"type":17,"tag":84,"props":175843,"children":175844},{},[175845],{"type":23,"value":175846},"Avoid introducing redundant identity models",{"type":17,"tag":84,"props":175848,"children":175849},{},[175850],{"type":23,"value":175851},"Keep HR, Accounting, Commerce, and Payments distinct",{"type":17,"tag":84,"props":175853,"children":175854},{},[175855],{"type":23,"value":175856},"Link internal attribution through HR where needed",{"type":17,"tag":84,"props":175858,"children":175859},{},[175860],{"type":23,"value":175861},"Treat ERP as a cross-category surface, not a separate abstraction",{"type":17,"tag":29,"props":175863,"children":175864},{},[175865],{"type":23,"value":175866},"This reduces mapping complexity while preserving flexibility.",{"type":17,"tag":68,"props":175868,"children":175870},{"id":175869},"erp-integrations-without-erp-duplication",[175871],{"type":23,"value":175872},"ERP Integrations Without ERP Duplication",{"type":17,"tag":29,"props":175874,"children":175875},{},[175876],{"type":23,"value":175877},"Unified supports ERP platforms fully.",{"type":17,"tag":29,"props":175879,"children":175880},{},[175881],{"type":23,"value":175882},"We simply don't create a redundant ERP object layer on top of Accounting, HR, Commerce, and Payments.",{"type":17,"tag":29,"props":175884,"children":175885},{},[175886],{"type":23,"value":175887},"That decision keeps schemas aligned with real business domains and prevents unnecessary duplication when customers use multiple modules.",{"type":17,"tag":29,"props":175889,"children":175890},{},[175891],{"type":23,"value":175892},"ERP is cross-category.",{"type":17,"tag":29,"props":175894,"children":175895},{},[175896],{"type":23,"value":175897},"Unified models it that way.",{"type":17,"tag":29,"props":175899,"children":175900},{},[175901,175902],{"type":23,"value":1609},{"type":17,"tag":133,"props":175903,"children":175905},{"href":1612,"rel":175904},[214],[175906],{"type":23,"value":1616},{"type":17,"tag":29,"props":175908,"children":175909},{},[175910,175911],{"type":23,"value":1609},{"type":17,"tag":133,"props":175912,"children":175914},{"href":1623,"rel":175913},[214],[175915],{"type":23,"value":1627},{"type":17,"tag":25,"props":175917,"children":175918},{},[],{"type":17,"tag":68,"props":175920,"children":175921},{"id":95759},[175922],{"type":23,"value":95762},{"type":17,"tag":29,"props":175924,"children":175925},{},[175926],{"type":17,"tag":48,"props":175927,"children":175928},{},[175929],{"type":23,"value":175930},"Does Unified support ERP integrations?",{"type":17,"tag":29,"props":175932,"children":175933},{},[175934],{"type":23,"value":175935},"Yes. ERP platforms are supported through Accounting, HR, Commerce, and Payment categories.",{"type":17,"tag":29,"props":175937,"children":175938},{},[175939],{"type":17,"tag":48,"props":175940,"children":175941},{},[175942],{"type":23,"value":175943},"Why isn't ERP a separate category?",{"type":17,"tag":29,"props":175945,"children":175946},{},[175947],{"type":23,"value":175948},"Because ERP systems span multiple domains. Modeling them inside one artificial category introduces redundant object models.",{"type":17,"tag":29,"props":175950,"children":175951},{},[175952],{"type":17,"tag":48,"props":175953,"children":175954},{},[175955],{"type":23,"value":175956},"Can I integrate NetSuite or Dynamics 365?",{"type":17,"tag":29,"props":175958,"children":175959},{},[175960],{"type":23,"value":175961},"Yes. Activate the relevant categories based on which modules you use.",{"type":17,"tag":29,"props":175963,"children":175964},{},[175965],{"type":17,"tag":48,"props":175966,"children":175967},{},[175968],{"type":23,"value":175969},"Is there a single ERP user model?",{"type":17,"tag":29,"props":175971,"children":175972},{},[175973],{"type":23,"value":175974},"No. Person-like objects remain domain-specific. Internal attribution can reference HR Employees where applicable.",{"type":17,"tag":29,"props":175976,"children":175977},{},[175978],{"type":17,"tag":48,"props":175979,"children":175980},{},[175981],{"type":23,"value":175982},"Does this reduce ERP capability?",{"type":17,"tag":29,"props":175984,"children":175985},{},[175986],{"type":23,"value":175987},"No. It reduces schema duplication while preserving full ERP coverage.",{"title":7,"searchDepth":1629,"depth":1629,"links":175989},[175990,175991,175992,175993,175994,175995,175996,176003,176004,176005],{"id":175260,"depth":1629,"text":175263},{"id":175339,"depth":1629,"text":175342},{"id":175451,"depth":1629,"text":175454},{"id":175534,"depth":1629,"text":175537},{"id":175634,"depth":1629,"text":175637},{"id":175687,"depth":1629,"text":175690},{"id":175764,"depth":1629,"text":175767,"children":175997},[175998,175999,176000,176001,176002],{"id":175770,"depth":1635,"text":175773},{"id":175781,"depth":1635,"text":175784},{"id":175792,"depth":1635,"text":175795},{"id":175803,"depth":1635,"text":175806},{"id":175814,"depth":1635,"text":175817},{"id":175825,"depth":1629,"text":175828},{"id":175869,"depth":1629,"text":175872},{"id":95759,"depth":1629,"text":95762},"content:blog:erp_api_integration_cross_category_financial_hr_and_operations_data_across_platforms.md","blog/erp_api_integration_cross_category_financial_hr_and_operations_data_across_platforms.md","blog/erp_api_integration_cross_category_financial_hr_and_operations_data_across_platforms",{"_path":176010,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":176011,"description":176012,"img":176013,"date":176014,"tag":12,"body":176015,"_type":1677,"_id":176965,"_source":1679,"_file":176966,"_stem":176967,"_extension":1682},"/blog/index_time_rag_vs_real_time_rag_choosing_the_right_retrieval_strategy","Index-Time RAG vs Real-Time RAG: Choosing the Right Retrieval Strategy","As retrieval-augmented generation (RAG) moves from demos into production SaaS products, teams eventually face a fundamental architectural decision,","https://s3.us-east-2.amazonaws.com/unified-article-images/index_time_rag_vs_real_time_rag_choosing_the_right_retrieval_strategy-icon.png","2026-02-10T14:37:00.000Z",{"type":14,"children":176016,"toc":176943},[176017,176022,176025,176032,176043,176070,176075,176080,176098,176104,176115,176120,176143,176148,176153,176159,176170,176175,176203,176208,176214,176219,176252,176257,176263,176274,176279,176302,176313,176318,176336,176342,176347,176359,176382,176388,176393,176424,176429,176447,176453,176458,176476,176481,176487,176491,176512,176517,176538,176544,176565,176571,176592,176597,176603,176608,176619,176642,176647,176652,176670,176675,176681,176686,176719,176724,176729,176734,176740,176745,176750,176773,176778,176789,176794,176800,176805,176810,176815,176820,176825,176830,176836,176847,176852,176875,176880,176885,176890,176913,176918,176931],{"type":17,"tag":18,"props":176018,"children":176020},{"id":176019},"index-time-rag-vs-real-time-rag-choosing-the-right-retrieval-strategy",[176021],{"type":23,"value":176011},{"type":17,"tag":25,"props":176023,"children":176024},{},[],{"type":17,"tag":29,"props":176026,"children":176027},{},[176028],{"type":17,"tag":33,"props":176029,"children":176030},{},[176031],{"type":23,"value":175199},{"type":17,"tag":29,"props":176033,"children":176034},{},[176035,176037,176041],{"type":23,"value":176036},"As ",{"type":17,"tag":133,"props":176038,"children":176039},{"href":77021},[176040],{"type":23,"value":77024},{"type":23,"value":176042}," (RAG) moves from demos into production SaaS products, teams eventually face a fundamental architectural decision:",{"type":17,"tag":80,"props":176044,"children":176045},{},[176046,176058],{"type":17,"tag":84,"props":176047,"children":176048},{},[176049,176051,176056],{"type":23,"value":176050},"Do you ",{"type":17,"tag":48,"props":176052,"children":176053},{},[176054],{"type":23,"value":176055},"pre-index everything",{"type":23,"value":176057}," ahead of time?",{"type":17,"tag":84,"props":176059,"children":176060},{},[176061,176063,176068],{"type":23,"value":176062},"Or do you ",{"type":17,"tag":48,"props":176064,"children":176065},{},[176066],{"type":23,"value":176067},"retrieve data live",{"type":23,"value":176069}," when a user asks a question?",{"type":17,"tag":29,"props":176071,"children":176072},{},[176073],{"type":23,"value":176074},"Most RAG content glosses over this choice. Tools are compared, frameworks are debated, but the underlying retrieval strategy is rarely made explicit.",{"type":17,"tag":29,"props":176076,"children":176077},{},[176078],{"type":23,"value":176079},"That omission matters. Retrieval timing shapes latency, cost, correctness, and compliance. It determines whether AI features quietly drift out of sync with reality—or stay aligned with how the business actually operates.",{"type":17,"tag":29,"props":176081,"children":176082},{},[176083,176085,176090,176091,176096],{"type":23,"value":176084},"This article breaks down the two dominant RAG retrieval strategies—",{"type":17,"tag":48,"props":176086,"children":176087},{},[176088],{"type":23,"value":176089},"index-time RAG",{"type":23,"value":34435},{"type":17,"tag":48,"props":176092,"children":176093},{},[176094],{"type":23,"value":176095},"real-time RAG",{"type":23,"value":176097},"—and explains when each makes sense, when hybrid models emerge, and why enterprise SaaS teams increasingly need real-time reads.",{"type":17,"tag":68,"props":176099,"children":176101},{"id":176100},"the-fork-every-production-rag-system-hits",[176102],{"type":23,"value":176103},"The Fork Every Production RAG System Hits",{"type":17,"tag":29,"props":176105,"children":176106},{},[176107,176109,176114],{"type":23,"value":176108},"At a high level, RAG systems combine a language model with external context. The question is ",{"type":17,"tag":48,"props":176110,"children":176111},{},[176112],{"type":23,"value":176113},"when that context is prepared and retrieved",{"type":23,"value":54},{"type":17,"tag":29,"props":176116,"children":176117},{},[176118],{"type":23,"value":176119},"In production, this usually resolves into two approaches:",{"type":17,"tag":80,"props":176121,"children":176122},{},[176123,176133],{"type":17,"tag":84,"props":176124,"children":176125},{},[176126,176131],{"type":17,"tag":48,"props":176127,"children":176128},{},[176129],{"type":23,"value":176130},"Index-time RAG",{"type":23,"value":176132}," (vector-first): prepare and embed data before users query it",{"type":17,"tag":84,"props":176134,"children":176135},{},[176136,176141],{"type":17,"tag":48,"props":176137,"children":176138},{},[176139],{"type":23,"value":176140},"Real-time RAG",{"type":23,"value":176142}," (API-first): retrieve data directly from source systems at inference",{"type":17,"tag":29,"props":176144,"children":176145},{},[176146],{"type":23,"value":176147},"Both approaches work. Both have tradeoffs. And neither is universally 'better.'",{"type":17,"tag":29,"props":176149,"children":176150},{},[176151],{"type":23,"value":176152},"What matters is how well the strategy matches the shape of your data and the expectations of your users.",{"type":17,"tag":68,"props":176154,"children":176156},{"id":176155},"index-time-rag-vector-first-retrieval",[176157],{"type":23,"value":176158},"Index-Time RAG (Vector-First Retrieval)",{"type":17,"tag":29,"props":176160,"children":176161},{},[176162,176164,176168],{"type":23,"value":176163},"In index-time RAG, most of the work happens ",{"type":17,"tag":33,"props":176165,"children":176166},{},[176167],{"type":23,"value":126293},{"type":23,"value":176169}," a user ever asks a question.",{"type":17,"tag":29,"props":176171,"children":176172},{},[176173],{"type":23,"value":176174},"Teams ingest content from internal systems—documents, knowledge pages, ticket histories, CRM notes—and run it through a preprocessing pipeline:",{"type":17,"tag":80,"props":176176,"children":176177},{},[176178,176183,176188,176193,176198],{"type":17,"tag":84,"props":176179,"children":176180},{},[176181],{"type":23,"value":176182},"Chunking content into retrievable units",{"type":17,"tag":84,"props":176184,"children":176185},{},[176186],{"type":23,"value":176187},"Cleaning and deduplicating text",{"type":17,"tag":84,"props":176189,"children":176190},{},[176191],{"type":23,"value":176192},"Adding metadata such as object type, timestamps, or ownership",{"type":17,"tag":84,"props":176194,"children":176195},{},[176196],{"type":23,"value":176197},"Generating embeddings",{"type":17,"tag":84,"props":176199,"children":176200},{},[176201],{"type":23,"value":176202},"Storing those embeddings in a vector database or hybrid search index",{"type":17,"tag":29,"props":176204,"children":176205},{},[176206],{"type":23,"value":176207},"At query time, the system embeds the user's question and performs a similarity search against the prebuilt index.",{"type":17,"tag":239,"props":176209,"children":176211},{"id":176210},"why-teams-choose-index-time-rag",[176212],{"type":23,"value":176213},"Why teams choose index-time RAG",{"type":17,"tag":29,"props":176215,"children":176216},{},[176217],{"type":23,"value":176218},"Index-time RAG offers clear benefits:",{"type":17,"tag":80,"props":176220,"children":176221},{},[176222,176232,176242],{"type":17,"tag":84,"props":176223,"children":176224},{},[176225,176230],{"type":17,"tag":48,"props":176226,"children":176227},{},[176228],{"type":23,"value":176229},"Low and predictable latency",{"type":23,"value":176231}," at inference",{"type":17,"tag":84,"props":176233,"children":176234},{},[176235,176240],{"type":17,"tag":48,"props":176236,"children":176237},{},[176238],{"type":23,"value":176239},"Lower per-query compute cost",{"type":23,"value":176241},", since embeddings are precomputed",{"type":17,"tag":84,"props":176243,"children":176244},{},[176245,176250],{"type":17,"tag":48,"props":176246,"children":176247},{},[176248],{"type":23,"value":176249},"Good fit for large, relatively static corpora",{"type":23,"value":176251}," like documentation or policy content",{"type":17,"tag":29,"props":176253,"children":176254},{},[176255],{"type":23,"value":176256},"For enterprise search over stable knowledge bases, this model works well.",{"type":17,"tag":239,"props":176258,"children":176260},{"id":176259},"where-index-time-rag-breaks-down",[176261],{"type":23,"value":176262},"Where index-time RAG breaks down",{"type":17,"tag":29,"props":176264,"children":176265},{},[176266,176268,176273],{"type":23,"value":176267},"The downside is that the index represents a ",{"type":17,"tag":48,"props":176269,"children":176270},{},[176271],{"type":23,"value":176272},"snapshot in time",{"type":23,"value":54},{"type":17,"tag":29,"props":176275,"children":176276},{},[176277],{"type":23,"value":176278},"In SaaS environments, data changes constantly:",{"type":17,"tag":80,"props":176280,"children":176281},{},[176282,176287,176292,176297],{"type":17,"tag":84,"props":176283,"children":176284},{},[176285],{"type":23,"value":176286},"Tickets are updated or closed",{"type":17,"tag":84,"props":176288,"children":176289},{},[176290],{"type":23,"value":176291},"CRM records change ownership or stage",{"type":17,"tag":84,"props":176293,"children":176294},{},[176295],{"type":23,"value":176296},"Files are modified or removed",{"type":17,"tag":84,"props":176298,"children":176299},{},[176300],{"type":23,"value":176301},"Permissions are updated",{"type":17,"tag":29,"props":176303,"children":176304},{},[176305,176307,176311],{"type":23,"value":176306},"Keeping an index accurate requires background jobs, ",{"type":17,"tag":133,"props":176308,"children":176309},{"href":4999},[176310],{"type":23,"value":5002},{"type":23,"value":176312},", re-embedding, and careful change detection. When those systems lag or fail, the RAG layer continues to answer questions—confidently, but incorrectly.",{"type":17,"tag":29,"props":176314,"children":176315},{},[176316],{"type":23,"value":176317},"The cost of index-time RAG is not just storage. It includes:",{"type":17,"tag":80,"props":176319,"children":176320},{},[176321,176326,176331],{"type":17,"tag":84,"props":176322,"children":176323},{},[176324],{"type":23,"value":176325},"Re-indexing pipelines",{"type":17,"tag":84,"props":176327,"children":176328},{},[176329],{"type":23,"value":176330},"Embedding drift management",{"type":17,"tag":84,"props":176332,"children":176333},{},[176334],{"type":23,"value":176335},"Debugging stale answers after the fact",{"type":17,"tag":68,"props":176337,"children":176339},{"id":176338},"real-time-rag-api-first-retrieval",[176340],{"type":23,"value":176341},"Real-Time RAG (API-First Retrieval)",{"type":17,"tag":29,"props":176343,"children":176344},{},[176345],{"type":23,"value":176346},"Real-time RAG shifts more work to inference.",{"type":17,"tag":29,"props":176348,"children":176349},{},[176350,176352,176357],{"type":23,"value":176351},"Instead of relying solely on a prebuilt index, the system retrieves data ",{"type":17,"tag":48,"props":176353,"children":176354},{},[176355],{"type":23,"value":176356},"directly from source systems",{"type":23,"value":176358}," when a user asks a question. This often involves:",{"type":17,"tag":80,"props":176360,"children":176361},{},[176362,176367,176372,176377],{"type":17,"tag":84,"props":176363,"children":176364},{},[176365],{"type":23,"value":176366},"Fetching live records via APIs or databases",{"type":17,"tag":84,"props":176368,"children":176369},{},[176370],{"type":23,"value":176371},"Applying filters and authorization checks at request time",{"type":17,"tag":84,"props":176373,"children":176374},{},[176375],{"type":23,"value":176376},"Optionally embedding or reranking results dynamically",{"type":17,"tag":84,"props":176378,"children":176379},{},[176380],{"type":23,"value":176381},"Passing current state to the language model",{"type":17,"tag":239,"props":176383,"children":176385},{"id":176384},"why-teams-choose-real-time-rag",[176386],{"type":23,"value":176387},"Why teams choose real-time RAG",{"type":17,"tag":29,"props":176389,"children":176390},{},[176391],{"type":23,"value":176392},"Real-time RAG is attractive when correctness matters more than raw speed:",{"type":17,"tag":80,"props":176394,"children":176395},{},[176396,176406,176414],{"type":17,"tag":84,"props":176397,"children":176398},{},[176399,176404],{"type":17,"tag":48,"props":176400,"children":176401},{},[176402],{"type":23,"value":176403},"Answers reflect current state",{"type":23,"value":176405},", not a cached snapshot",{"type":17,"tag":84,"props":176407,"children":176408},{},[176409],{"type":17,"tag":48,"props":176410,"children":176411},{},[176412],{"type":23,"value":176413},"Permission changes are respected immediately",{"type":17,"tag":84,"props":176415,"children":176416},{},[176417,176422],{"type":17,"tag":48,"props":176418,"children":176419},{},[176420],{"type":23,"value":176421},"Compliance surface area is reduced",{"type":23,"value":176423},", since data remains in the source system",{"type":17,"tag":29,"props":176425,"children":176426},{},[176427],{"type":23,"value":176428},"This approach is common for operational use cases:",{"type":17,"tag":80,"props":176430,"children":176431},{},[176432,176437,176442],{"type":17,"tag":84,"props":176433,"children":176434},{},[176435],{"type":23,"value":176436},"'What's the status of this ticket?'",{"type":17,"tag":84,"props":176438,"children":176439},{},[176440],{"type":23,"value":176441},"'Which deals moved stages today?'",{"type":17,"tag":84,"props":176443,"children":176444},{},[176445],{"type":23,"value":176446},"'What files does this user currently have access to?'",{"type":17,"tag":239,"props":176448,"children":176450},{"id":176449},"tradeoffs-to-consider",[176451],{"type":23,"value":176452},"Tradeoffs to consider",{"type":17,"tag":29,"props":176454,"children":176455},{},[176456],{"type":23,"value":176457},"Real-time retrieval introduces variability:",{"type":17,"tag":80,"props":176459,"children":176460},{},[176461,176466,176471],{"type":17,"tag":84,"props":176462,"children":176463},{},[176464],{"type":23,"value":176465},"API calls add latency",{"type":17,"tag":84,"props":176467,"children":176468},{},[176469],{"type":23,"value":176470},"Rate limits and pagination must be handled",{"type":17,"tag":84,"props":176472,"children":176473},{},[176474],{"type":23,"value":176475},"Per-query cost can be higher",{"type":17,"tag":29,"props":176477,"children":176478},{},[176479],{"type":23,"value":176480},"As a result, real-time RAG requires careful system design, caching strategies, and clear expectations around response times.",{"type":17,"tag":68,"props":176482,"children":176484},{"id":176483},"latency-cost-accuracy-and-compliance-how-the-tradeoffs-differ",[176485],{"type":23,"value":176486},"Latency, Cost, Accuracy, and Compliance: How the Tradeoffs Differ",{"type":17,"tag":239,"props":176488,"children":176489},{"id":838},[176490],{"type":23,"value":9978},{"type":17,"tag":80,"props":176492,"children":176493},{},[176494,176503],{"type":17,"tag":84,"props":176495,"children":176496},{},[176497,176501],{"type":17,"tag":48,"props":176498,"children":176499},{},[176500],{"type":23,"value":176130},{"type":23,"value":176502},": fast and predictable at query time",{"type":17,"tag":84,"props":176504,"children":176505},{},[176506,176510],{"type":17,"tag":48,"props":176507,"children":176508},{},[176509],{"type":23,"value":176140},{"type":23,"value":176511},": variable latency depending on downstream systems",{"type":17,"tag":239,"props":176513,"children":176514},{"id":17091},[176515],{"type":23,"value":176516},"Cost",{"type":17,"tag":80,"props":176518,"children":176519},{},[176520,176529],{"type":17,"tag":84,"props":176521,"children":176522},{},[176523,176527],{"type":17,"tag":48,"props":176524,"children":176525},{},[176526],{"type":23,"value":176130},{"type":23,"value":176528},": higher upfront ingestion and maintenance cost, lower marginal cost per query",{"type":17,"tag":84,"props":176530,"children":176531},{},[176532,176536],{"type":17,"tag":48,"props":176533,"children":176534},{},[176535],{"type":23,"value":176140},{"type":23,"value":176537},": lower ingestion overhead, higher per-query cost",{"type":17,"tag":239,"props":176539,"children":176541},{"id":176540},"accuracy",[176542],{"type":23,"value":176543},"Accuracy",{"type":17,"tag":80,"props":176545,"children":176546},{},[176547,176556],{"type":17,"tag":84,"props":176548,"children":176549},{},[176550,176554],{"type":17,"tag":48,"props":176551,"children":176552},{},[176553],{"type":23,"value":176130},{"type":23,"value":176555},": accuracy depends on index freshness",{"type":17,"tag":84,"props":176557,"children":176558},{},[176559,176563],{"type":17,"tag":48,"props":176560,"children":176561},{},[176562],{"type":23,"value":176140},{"type":23,"value":176564},": accuracy aligns with current system state",{"type":17,"tag":239,"props":176566,"children":176568},{"id":176567},"compliance-and-security",[176569],{"type":23,"value":176570},"Compliance and security",{"type":17,"tag":80,"props":176572,"children":176573},{},[176574,176583],{"type":17,"tag":84,"props":176575,"children":176576},{},[176577,176581],{"type":17,"tag":48,"props":176578,"children":176579},{},[176580],{"type":23,"value":176130},{"type":23,"value":176582}," duplicates data into new stores, requiring permission propagation and retention controls",{"type":17,"tag":84,"props":176584,"children":176585},{},[176586,176590],{"type":17,"tag":48,"props":176587,"children":176588},{},[176589],{"type":23,"value":176140},{"type":23,"value":176591}," relies on existing authorization and audit mechanisms in source systems",{"type":17,"tag":29,"props":176593,"children":176594},{},[176595],{"type":23,"value":176596},"These are not theoretical differences. They show up in SOC 2 reviews, GDPR assessments, and enterprise procurement conversations.",{"type":17,"tag":68,"props":176598,"children":176600},{"id":176599},"why-hybrid-rag-architectures-emerge-in-practice",[176601],{"type":23,"value":176602},"Why Hybrid RAG Architectures Emerge in Practice",{"type":17,"tag":29,"props":176604,"children":176605},{},[176606],{"type":23,"value":176607},"Most production systems don't choose one strategy exclusively.",{"type":17,"tag":29,"props":176609,"children":176610},{},[176611,176613,176618],{"type":23,"value":176612},"Instead, they adopt ",{"type":17,"tag":48,"props":176614,"children":176615},{},[176616],{"type":23,"value":176617},"hybrid RAG",{"type":23,"value":20456},{"type":17,"tag":80,"props":176620,"children":176621},{},[176622,176632],{"type":17,"tag":84,"props":176623,"children":176624},{},[176625,176630],{"type":17,"tag":48,"props":176626,"children":176627},{},[176628],{"type":23,"value":176629},"Index-time retrieval",{"type":23,"value":176631}," for static or slow-changing content (docs, policies, knowledge bases)",{"type":17,"tag":84,"props":176633,"children":176634},{},[176635,176640],{"type":17,"tag":48,"props":176636,"children":176637},{},[176638],{"type":23,"value":176639},"Real-time retrieval",{"type":23,"value":176641}," for dynamic, permission-sensitive data (CRM records, tickets, files, candidates)",{"type":17,"tag":29,"props":176643,"children":176644},{},[176645],{"type":23,"value":176646},"The key is being explicit about the boundary.",{"type":17,"tag":29,"props":176648,"children":176649},{},[176650],{"type":23,"value":176651},"Hybrid systems fail when teams blur responsibilities:",{"type":17,"tag":80,"props":176653,"children":176654},{},[176655,176660,176665],{"type":17,"tag":84,"props":176656,"children":176657},{},[176658],{"type":23,"value":176659},"Indexing data that should be fetched live",{"type":17,"tag":84,"props":176661,"children":176662},{},[176663],{"type":23,"value":176664},"Relying on real-time reads for large static corpora",{"type":17,"tag":84,"props":176666,"children":176667},{},[176668],{"type":23,"value":176669},"Losing track of which source is authoritative",{"type":17,"tag":29,"props":176671,"children":176672},{},[176673],{"type":23,"value":176674},"Successful teams define retrieval rules up front and design their pipelines accordingly.",{"type":17,"tag":68,"props":176676,"children":176678},{"id":176677},"why-enterprise-saas-often-requires-real-time-reads",[176679],{"type":23,"value":176680},"Why Enterprise SaaS Often Requires Real-Time Reads",{"type":17,"tag":29,"props":176682,"children":176683},{},[176684],{"type":23,"value":176685},"Enterprise SaaS data has characteristics that make full pre-indexing difficult:",{"type":17,"tag":80,"props":176687,"children":176688},{},[176689,176699,176709],{"type":17,"tag":84,"props":176690,"children":176691},{},[176692,176697],{"type":17,"tag":48,"props":176693,"children":176694},{},[176695],{"type":23,"value":176696},"High churn",{"type":23,"value":176698},": records change frequently",{"type":17,"tag":84,"props":176700,"children":176701},{},[176702,176707],{"type":17,"tag":48,"props":176703,"children":176704},{},[176705],{"type":23,"value":176706},"Fine-grained permissions",{"type":23,"value":176708},": access varies by user and time",{"type":17,"tag":84,"props":176710,"children":176711},{},[176712,176717],{"type":17,"tag":48,"props":176713,"children":176714},{},[176715],{"type":23,"value":176716},"Operational risk",{"type":23,"value":176718},": stale answers can lead to incorrect actions",{"type":17,"tag":29,"props":176720,"children":176721},{},[176722],{"type":23,"value":176723},"Users don't experience AI features as 'experimental.' They expect them to reflect reality.",{"type":17,"tag":29,"props":176725,"children":176726},{},[176727],{"type":23,"value":176728},"When an AI assistant answers with outdated information, trust erodes quickly—even if the system is technically 'working.'",{"type":17,"tag":29,"props":176730,"children":176731},{},[176732],{"type":23,"value":176733},"For many enterprise use cases, real-time retrieval is not an optimization. It's a requirement.",{"type":17,"tag":68,"props":176735,"children":176737},{"id":176736},"putting-the-architecture-into-practice",[176738],{"type":23,"value":176739},"Putting the Architecture Into Practice",{"type":17,"tag":29,"props":176741,"children":176742},{},[176743],{"type":23,"value":176744},"In real SaaS systems, these principles translate into concrete design choices.",{"type":17,"tag":29,"props":176746,"children":176747},{},[176748],{"type":23,"value":176749},"Teams often:",{"type":17,"tag":80,"props":176751,"children":176752},{},[176753,176758,176763,176768],{"type":17,"tag":84,"props":176754,"children":176755},{},[176756],{"type":23,"value":176757},"Index documents and knowledge pages into a vector database",{"type":17,"tag":84,"props":176759,"children":176760},{},[176761],{"type":23,"value":176762},"Subscribe to change events to keep that index current",{"type":17,"tag":84,"props":176764,"children":176765},{},[176766],{"type":23,"value":176767},"Retrieve operational data directly from source APIs at query time",{"type":17,"tag":84,"props":176769,"children":176770},{},[176771],{"type":23,"value":176772},"Apply authorization and filtering before the model sees the data",{"type":17,"tag":29,"props":176774,"children":176775},{},[176776],{"type":23,"value":176777},"This hybrid model allows AI features to balance performance with correctness.",{"type":17,"tag":29,"props":176779,"children":176780},{},[176781,176783,176787],{"type":23,"value":176782},"One example of a platform built around this approach is ",{"type":17,"tag":48,"props":176784,"children":176785},{},[176786],{"type":23,"value":87523},{"type":23,"value":176788},". Unified provides category-specific SaaS APIs and supports event-driven updates for indexed content, while performing real-time, authorized reads from source systems at inference. Customer data is fetched directly from the source and is not stored at rest.",{"type":17,"tag":29,"props":176790,"children":176791},{},[176792],{"type":23,"value":176793},"In this model, RAG is treated as a retrieval architecture—not a prompt or vector database feature.",{"type":17,"tag":68,"props":176795,"children":176797},{"id":176796},"choosing-the-right-retrieval-strategy",[176798],{"type":23,"value":176799},"Choosing the Right Retrieval Strategy",{"type":17,"tag":29,"props":176801,"children":176802},{},[176803],{"type":23,"value":176804},"There is no single 'correct' RAG strategy.",{"type":17,"tag":29,"props":176806,"children":176807},{},[176808],{"type":23,"value":176809},"Index-time RAG works well for static knowledge.",{"type":17,"tag":29,"props":176811,"children":176812},{},[176813],{"type":23,"value":176814},"Real-time RAG is essential for operational correctness.",{"type":17,"tag":29,"props":176816,"children":176817},{},[176818],{"type":23,"value":176819},"Hybrid models are the norm in enterprise SaaS.",{"type":17,"tag":29,"props":176821,"children":176822},{},[176823],{"type":23,"value":176824},"The important step is making the choice explicit.",{"type":17,"tag":29,"props":176826,"children":176827},{},[176828],{"type":23,"value":176829},"Teams that understand retrieval timing—and design for it—ship AI features that stay accurate, compliant, and trusted as systems evolve.",{"type":17,"tag":68,"props":176831,"children":176833},{"id":176832},"retrieval-strategy-in-real-systems",[176834],{"type":23,"value":176835},"Retrieval Strategy in Real Systems",{"type":17,"tag":29,"props":176837,"children":176838},{},[176839,176841,176846],{"type":23,"value":176840},"Choosing between index-time and real-time RAG is not a tooling decision. It's a ",{"type":17,"tag":48,"props":176842,"children":176843},{},[176844],{"type":23,"value":176845},"data access decision",{"type":23,"value":54},{"type":17,"tag":29,"props":176848,"children":176849},{},[176850],{"type":23,"value":176851},"Once teams recognize retrieval timing as an architectural concern, a few requirements become clear:",{"type":17,"tag":80,"props":176853,"children":176854},{},[176855,176860,176865,176870],{"type":17,"tag":84,"props":176856,"children":176857},{},[176858],{"type":23,"value":176859},"Access to SaaS data must reflect current state",{"type":17,"tag":84,"props":176861,"children":176862},{},[176863],{"type":23,"value":176864},"Authorization must be enforced at retrieval time",{"type":17,"tag":84,"props":176866,"children":176867},{},[176868],{"type":23,"value":176869},"Static and dynamic data require different handling",{"type":17,"tag":84,"props":176871,"children":176872},{},[176873],{"type":23,"value":176874},"Indexes need to stay in sync without creating new compliance risk",{"type":17,"tag":29,"props":176876,"children":176877},{},[176878],{"type":23,"value":176879},"This is where the retrieval layer matters more than the model.",{"type":17,"tag":29,"props":176881,"children":176882},{},[176883],{"type":23,"value":176884},"Unified is designed to support these realities. Teams use Unified to access SaaS data across categories—CRM, ticketing, file storage, knowledge systems, and ATS—through authorized, real-time API calls. Indexed content can be kept current through event-driven updates, while operational data is fetched directly from the source system at inference, without storing customer payloads at rest.",{"type":17,"tag":29,"props":176886,"children":176887},{},[176888],{"type":23,"value":176889},"That architecture allows teams to:",{"type":17,"tag":80,"props":176891,"children":176892},{},[176893,176898,176903,176908],{"type":17,"tag":84,"props":176894,"children":176895},{},[176896],{"type":23,"value":176897},"Combine index-time and real-time RAG intentionally",{"type":17,"tag":84,"props":176899,"children":176900},{},[176901],{"type":23,"value":176902},"Avoid stale answers caused by delayed indexing",{"type":17,"tag":84,"props":176904,"children":176905},{},[176906],{"type":23,"value":176907},"Respect permission changes immediately",{"type":17,"tag":84,"props":176909,"children":176910},{},[176911],{"type":23,"value":176912},"Reduce the compliance surface area of AI features",{"type":17,"tag":29,"props":176914,"children":176915},{},[176916],{"type":23,"value":176917},"If you're building AI features on top of SaaS data and want retrieval to reflect how enterprise systems actually behave, Unified provides the data access layer to make that possible.",{"type":17,"tag":29,"props":176919,"children":176920},{},[176921],{"type":17,"tag":133,"props":176922,"children":176925},{"href":176923,"rel":176924},"https://docs.unified.to/intro",[214],[176926],{"type":17,"tag":48,"props":176927,"children":176928},{},[176929],{"type":23,"value":176930},"Learn more about Unified's RAG pipelines →",{"type":17,"tag":29,"props":176932,"children":176933},{},[176934],{"type":17,"tag":133,"props":176935,"children":176937},{"href":1623,"rel":176936},[214],[176938],{"type":17,"tag":48,"props":176939,"children":176940},{},[176941],{"type":23,"value":176942},"Talk to us about real-time retrieval for AI features →",{"title":7,"searchDepth":1629,"depth":1629,"links":176944},[176945,176946,176950,176954,176960,176961,176962,176963,176964],{"id":176100,"depth":1629,"text":176103},{"id":176155,"depth":1629,"text":176158,"children":176947},[176948,176949],{"id":176210,"depth":1635,"text":176213},{"id":176259,"depth":1635,"text":176262},{"id":176338,"depth":1629,"text":176341,"children":176951},[176952,176953],{"id":176384,"depth":1635,"text":176387},{"id":176449,"depth":1635,"text":176452},{"id":176483,"depth":1629,"text":176486,"children":176955},[176956,176957,176958,176959],{"id":838,"depth":1635,"text":9978},{"id":17091,"depth":1635,"text":176516},{"id":176540,"depth":1635,"text":176543},{"id":176567,"depth":1635,"text":176570},{"id":176599,"depth":1629,"text":176602},{"id":176677,"depth":1629,"text":176680},{"id":176736,"depth":1629,"text":176739},{"id":176796,"depth":1629,"text":176799},{"id":176832,"depth":1629,"text":176835},"content:blog:index_time_rag_vs_real_time_rag_choosing_the_right_retrieval_strategy.md","blog/index_time_rag_vs_real_time_rag_choosing_the_right_retrieval_strategy.md","blog/index_time_rag_vs_real_time_rag_choosing_the_right_retrieval_strategy",{"_path":176969,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":176970,"description":176971,"img":176972,"date":176973,"tag":12,"body":176974,"_type":1677,"_id":178471,"_source":1679,"_file":178472,"_stem":178473,"_extension":1682},"/blog/how_to_build_a_messaging_bot_with_unified_slack_microsoft_teams_discord","How to Build a Messaging Bot with Unified (Slack, Microsoft Teams, Discord)","Most bots break in production for the same reason,","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_messaging_bot_with_unified_slack_microsoft_teams_discord-icon.png","2026-02-10T02:23:00.000Z",{"type":14,"children":176975,"toc":178442},[176976,176981,176984,176991,176996,177001,177019,177029,177041,177046,177051,177069,177073,177078,177139,177144,177150,177154,177189,177194,177203,177209,177220,177226,177370,177378,177427,177433,177438,177447,177459,177465,177470,177577,177582,177649,177655,177680,177685,177691,177696,177705,177710,177719,177724,177730,177742,177751,177755,177797,177803,177815,177821,177826,177834,177839,177866,177871,177894,177899,177905,177910,177922,177943,177948,177953,177959,177964,177987,177999,178010,178016,178021,178053,178059,178069,178078,178083,178118,178131,178137,178143,178152,178158,178167,178173,178178,178187,178199,178208,178213,178222,178228,178264,178270,178317,178323,178334,178339,178367,178379,178384,178407,178419,178431],{"type":17,"tag":18,"props":176977,"children":176979},{"id":176978},"how-to-build-a-messaging-bot-with-unified-slack-microsoft-teams-discord",[176980],{"type":23,"value":176970},{"type":17,"tag":25,"props":176982,"children":176983},{},[],{"type":17,"tag":29,"props":176985,"children":176986},{},[176987],{"type":17,"tag":33,"props":176988,"children":176989},{},[176990],{"type":23,"value":175199},{"type":17,"tag":29,"props":176992,"children":176993},{},[176994],{"type":23,"value":176995},"Building bots on messaging platforms is complex.",{"type":17,"tag":29,"props":176997,"children":176998},{},[176999],{"type":23,"value":177000},"Most bots break in production for the same reason:",{"type":17,"tag":80,"props":177002,"children":177003},{},[177004,177009,177014],{"type":17,"tag":84,"props":177005,"children":177006},{},[177007],{"type":23,"value":177008},"They poll for messages instead of reacting to real-time events.",{"type":17,"tag":84,"props":177010,"children":177011},{},[177012],{"type":23,"value":177013},"They assume every platform behaves the same.",{"type":17,"tag":84,"props":177015,"children":177016},{},[177017],{"type":23,"value":177018},"They treat chat systems like databases instead of live systems.",{"type":17,"tag":29,"props":177020,"children":177021},{},[177022,177023,177027],{"type":23,"value":25244},{"type":17,"tag":133,"props":177024,"children":177025},{"href":14913},[177026],{"type":23,"value":27356},{"type":23,"value":177028}," is designed for the model bots actually need.",{"type":17,"tag":29,"props":177030,"children":177031},{},[177032,177034,177039],{"type":23,"value":177033},"It lets you build ",{"type":17,"tag":48,"props":177035,"children":177036},{},[177037],{"type":23,"value":177038},"event-driven messaging bots",{"type":23,"value":177040}," that react to live activity in Slack, Microsoft Teams, and Discord — without polling loops, without storing message history, and without maintaining separate implementations per provider.",{"type":17,"tag":29,"props":177042,"children":177043},{},[177044],{"type":23,"value":177045},"This guide shows the production-safe way to build a messaging bot using Unified.",{"type":17,"tag":29,"props":177047,"children":177048},{},[177049],{"type":23,"value":177050},"It reflects how bots need to be built today:",{"type":17,"tag":80,"props":177052,"children":177053},{},[177054,177059,177064],{"type":17,"tag":84,"props":177055,"children":177056},{},[177057],{"type":23,"value":177058},"driven by real-time events",{"type":17,"tag":84,"props":177060,"children":177061},{},[177062],{"type":23,"value":177063},"aware of provider differences",{"type":17,"tag":84,"props":177065,"children":177066},{},[177067],{"type":23,"value":177068},"and safe to operate at scale",{"type":17,"tag":68,"props":177070,"children":177071},{"id":42649},[177072],{"type":23,"value":42652},{"type":17,"tag":29,"props":177074,"children":177075},{},[177076],{"type":23,"value":177077},"You'll build a production-ready messaging bot that:",{"type":17,"tag":6154,"props":177079,"children":177080},{},[177081,177086,177118,177129,177134],{"type":17,"tag":84,"props":177082,"children":177083},{},[177084],{"type":23,"value":177085},"Authorizes a user's Slack, Microsoft Teams, or Discord account",{"type":17,"tag":84,"props":177087,"children":177088},{},[177089,177091],{"type":23,"value":177090},"Subscribes to real-time activity using:\n",{"type":17,"tag":80,"props":177092,"children":177093},{},[177094,177104],{"type":17,"tag":84,"props":177095,"children":177096},{},[177097,177102],{"type":17,"tag":48,"props":177098,"children":177099},{},[177100],{"type":23,"value":177101},"Messaging Events",{"type":23,"value":177103}," (mentions, reactions, button clicks — where supported)",{"type":17,"tag":84,"props":177105,"children":177106},{},[177107,177108,177113,177114],{"type":23,"value":33669},{"type":17,"tag":48,"props":177109,"children":177110},{},[177111],{"type":23,"value":177112},"Message Created",{"type":23,"value":18757},{"type":17,"tag":133,"props":177115,"children":177116},{"href":4999},[177117],{"type":23,"value":5002},{"type":17,"tag":84,"props":177119,"children":177120},{},[177121,177123],{"type":23,"value":177122},"Receives webhook payloads and validates them using ",{"type":17,"tag":6121,"props":177124,"children":177126},{"className":177125},[],[177127],{"type":23,"value":177128},"sig256",{"type":17,"tag":84,"props":177130,"children":177131},{},[177132],{"type":23,"value":177133},"Applies your bot logic to each incoming event or message",{"type":17,"tag":84,"props":177135,"children":177136},{},[177137],{"type":23,"value":177138},"Sends a reply — either in-thread or directly in the channel",{"type":17,"tag":29,"props":177140,"children":177141},{},[177142],{"type":23,"value":177143},"This flow keeps the bot event-driven, provider-aware, and safe to run in production.",{"type":17,"tag":68,"props":177145,"children":177147},{"id":177146},"before-you-begin",[177148],{"type":23,"value":177149},"Before you begin",{"type":17,"tag":29,"props":177151,"children":177152},{},[177153],{"type":23,"value":148511},{"type":17,"tag":80,"props":177155,"children":177156},{},[177157,177162,177167,177179,177184],{"type":17,"tag":84,"props":177158,"children":177159},{},[177160],{"type":23,"value":177161},"A Unified workspace API key",{"type":17,"tag":84,"props":177163,"children":177164},{},[177165],{"type":23,"value":177166},"Your workspace secret (for webhook verification)",{"type":17,"tag":84,"props":177168,"children":177169},{},[177170,177172,177177],{"type":23,"value":177171},"A messaging ",{"type":17,"tag":6121,"props":177173,"children":177175},{"className":177174},[],[177176],{"type":23,"value":25037},{"type":23,"value":177178}," from an authorized account",{"type":17,"tag":84,"props":177180,"children":177181},{},[177182],{"type":23,"value":177183},"A public webhook URL (ngrok, Cloudflare Tunnel, etc.)",{"type":17,"tag":84,"props":177185,"children":177186},{},[177187],{"type":23,"value":177188},"Node.js 18+ (examples use TypeScript + Express)",{"type":17,"tag":29,"props":177190,"children":177191},{},[177192],{"type":23,"value":177193},"Environment variables used below:",{"type":17,"tag":6893,"props":177195,"children":177198},{"className":177196,"code":177197,"language":48432,"meta":7},[48430],"UNIFIED_API_KEY=...\nUNIFIED_WORKSPACE_SECRET=...\nCONNECTION_ID=...\nPUBLIC_WEBHOOK_URL=https://your-domain.com/webhook\n",[177199],{"type":17,"tag":6121,"props":177200,"children":177201},{"__ignoreMap":7},[177202],{"type":23,"value":177197},{"type":17,"tag":68,"props":177204,"children":177206},{"id":177205},"provider-capability-matrix",[177207],{"type":23,"value":177208},"Provider capability matrix",{"type":17,"tag":29,"props":177210,"children":177211},{},[177212,177218],{"type":17,"tag":6121,"props":177213,"children":177215},{"className":177214},[],[177216],{"type":23,"value":177217},"X",{"type":23,"value":177219}," means supported, blank means not.",{"type":17,"tag":239,"props":177221,"children":177223},{"id":177222},"inbound-webhook-availability",[177224],{"type":23,"value":177225},"Inbound webhook availability",{"type":17,"tag":7231,"props":177227,"children":177228},{},[177229,177253],{"type":17,"tag":7235,"props":177230,"children":177231},{},[177232],{"type":17,"tag":7239,"props":177233,"children":177234},{},[177235,177240,177245,177249],{"type":17,"tag":7243,"props":177236,"children":177237},{},[177238],{"type":23,"value":177239},"Webhook event",{"type":17,"tag":7243,"props":177241,"children":177242},{},[177243],{"type":23,"value":177244},"Teams (bot)",{"type":17,"tag":7243,"props":177246,"children":177247},{},[177248],{"type":23,"value":3204},{"type":17,"tag":7243,"props":177250,"children":177251},{},[177252],{"type":23,"value":155275},{"type":17,"tag":7259,"props":177254,"children":177255},{},[177256,177279,177301,177324,177347],{"type":17,"tag":7239,"props":177257,"children":177258},{},[177259,177268,177272,177275],{"type":17,"tag":7266,"props":177260,"children":177261},{},[177262],{"type":17,"tag":6121,"props":177263,"children":177265},{"className":177264},[],[177266],{"type":23,"value":177267},"messaging_event_created",{"type":17,"tag":7266,"props":177269,"children":177270},{},[177271],{"type":23,"value":177217},{"type":17,"tag":7266,"props":177273,"children":177274},{},[],{"type":17,"tag":7266,"props":177276,"children":177277},{},[177278],{"type":23,"value":177217},{"type":17,"tag":7239,"props":177280,"children":177281},{},[177282,177291,177295,177298],{"type":17,"tag":7266,"props":177283,"children":177284},{},[177285],{"type":17,"tag":6121,"props":177286,"children":177288},{"className":177287},[],[177289],{"type":23,"value":177290},"messaging_event_updated",{"type":17,"tag":7266,"props":177292,"children":177293},{},[177294],{"type":23,"value":177217},{"type":17,"tag":7266,"props":177296,"children":177297},{},[],{"type":17,"tag":7266,"props":177299,"children":177300},{},[],{"type":17,"tag":7239,"props":177302,"children":177303},{},[177304,177313,177316,177320],{"type":17,"tag":7266,"props":177305,"children":177306},{},[177307],{"type":17,"tag":6121,"props":177308,"children":177310},{"className":177309},[],[177311],{"type":23,"value":177312},"messaging_channel_created",{"type":17,"tag":7266,"props":177314,"children":177315},{},[],{"type":17,"tag":7266,"props":177317,"children":177318},{},[177319],{"type":23,"value":177217},{"type":17,"tag":7266,"props":177321,"children":177322},{},[177323],{"type":23,"value":177217},{"type":17,"tag":7239,"props":177325,"children":177326},{},[177327,177336,177339,177343],{"type":17,"tag":7266,"props":177328,"children":177329},{},[177330],{"type":17,"tag":6121,"props":177331,"children":177333},{"className":177332},[],[177334],{"type":23,"value":177335},"messaging_channel_updated",{"type":17,"tag":7266,"props":177337,"children":177338},{},[],{"type":17,"tag":7266,"props":177340,"children":177341},{},[177342],{"type":23,"value":177217},{"type":17,"tag":7266,"props":177344,"children":177345},{},[177346],{"type":23,"value":177217},{"type":17,"tag":7239,"props":177348,"children":177349},{},[177350,177359,177362,177366],{"type":17,"tag":7266,"props":177351,"children":177352},{},[177353],{"type":17,"tag":6121,"props":177354,"children":177356},{"className":177355},[],[177357],{"type":23,"value":177358},"messaging_channel_deleted",{"type":17,"tag":7266,"props":177360,"children":177361},{},[],{"type":17,"tag":7266,"props":177363,"children":177364},{},[177365],{"type":23,"value":177217},{"type":17,"tag":7266,"props":177367,"children":177368},{},[177369],{"type":23,"value":177217},{"type":17,"tag":29,"props":177371,"children":177372},{},[177373],{"type":17,"tag":48,"props":177374,"children":177375},{},[177376],{"type":23,"value":177377},"Implications",{"type":17,"tag":80,"props":177379,"children":177380},{},[177381,177416],{"type":17,"tag":84,"props":177382,"children":177383},{},[177384,177385,177390,177391,177397,177399,177403,177405],{"type":23,"value":88938},{"type":17,"tag":6121,"props":177386,"children":177388},{"className":177387},[],[177389],{"type":23,"value":159068},{"type":23,"value":11826},{"type":17,"tag":6121,"props":177392,"children":177394},{"className":177393},[],[177395],{"type":23,"value":177396},"BUTTON_CLICK",{"type":23,"value":177398},", reactions, or other interaction types, you must use ",{"type":17,"tag":48,"props":177400,"children":177401},{},[177402],{"type":23,"value":177101},{"type":23,"value":177404},", which are available only for:\n",{"type":17,"tag":80,"props":177406,"children":177407},{},[177408,177412],{"type":17,"tag":84,"props":177409,"children":177410},{},[177411],{"type":23,"value":155275},{"type":17,"tag":84,"props":177413,"children":177414},{},[177415],{"type":23,"value":155284},{"type":17,"tag":84,"props":177417,"children":177418},{},[177419,177421,177425],{"type":23,"value":177420},"Discord does ",{"type":17,"tag":48,"props":177422,"children":177423},{},[177424],{"type":23,"value":159475},{"type":23,"value":177426}," support Messaging Events. Use message-created webhooks instead.",{"type":17,"tag":68,"props":177428,"children":177430},{"id":177429},"threaded-replies",[177431],{"type":23,"value":177432},"Threaded replies",{"type":17,"tag":29,"props":177434,"children":177435},{},[177436],{"type":23,"value":177437},"Threading is standardized across supported messaging integrations using a single field:",{"type":17,"tag":6893,"props":177439,"children":177442},{"className":177440,"code":177441,"language":20901,"meta":23},[20899],"parent_id\n",[177443],{"type":17,"tag":6121,"props":177444,"children":177445},{"__ignoreMap":7},[177446],{"type":23,"value":177441},{"type":17,"tag":29,"props":177448,"children":177449},{},[177450,177452,177457],{"type":23,"value":177451},"All messaging providers supported by Unified use ",{"type":17,"tag":6121,"props":177453,"children":177455},{"className":177454},[],[177456],{"type":23,"value":15863},{"type":23,"value":177458}," to denote the immediate predecessor message in a thread.",{"type":17,"tag":68,"props":177460,"children":177462},{"id":177461},"messaging-events-model",[177463],{"type":23,"value":177464},"Messaging Events model",{"type":17,"tag":29,"props":177466,"children":177467},{},[177468],{"type":23,"value":177469},"Messaging Events include an explicit type enum:",{"type":17,"tag":80,"props":177471,"children":177472},{},[177473,177481,177489,177498,177506,177514,177523,177532,177541,177550,177559,177568],{"type":17,"tag":84,"props":177474,"children":177475},{},[177476],{"type":17,"tag":6121,"props":177477,"children":177479},{"className":177478},[],[177480],{"type":23,"value":159017},{"type":17,"tag":84,"props":177482,"children":177483},{},[177484],{"type":17,"tag":6121,"props":177485,"children":177487},{"className":177486},[],[177488],{"type":23,"value":159035},{"type":17,"tag":84,"props":177490,"children":177491},{},[177492],{"type":17,"tag":6121,"props":177493,"children":177495},{"className":177494},[],[177496],{"type":23,"value":177497},"REACTION_REMOVED",{"type":17,"tag":84,"props":177499,"children":177500},{},[177501],{"type":17,"tag":6121,"props":177502,"children":177504},{"className":177503},[],[177505],{"type":23,"value":177396},{"type":17,"tag":84,"props":177507,"children":177508},{},[177509],{"type":17,"tag":6121,"props":177510,"children":177512},{"className":177511},[],[177513],{"type":23,"value":159068},{"type":17,"tag":84,"props":177515,"children":177516},{},[177517],{"type":17,"tag":6121,"props":177518,"children":177520},{"className":177519},[],[177521],{"type":23,"value":177522},"CHANNEL_JOINED",{"type":17,"tag":84,"props":177524,"children":177525},{},[177526],{"type":17,"tag":6121,"props":177527,"children":177529},{"className":177528},[],[177530],{"type":23,"value":177531},"CHANNEL_LEFT",{"type":17,"tag":84,"props":177533,"children":177534},{},[177535],{"type":17,"tag":6121,"props":177536,"children":177538},{"className":177537},[],[177539],{"type":23,"value":177540},"CHANNEL_CREATED",{"type":17,"tag":84,"props":177542,"children":177543},{},[177544],{"type":17,"tag":6121,"props":177545,"children":177547},{"className":177546},[],[177548],{"type":23,"value":177549},"CHANNEL_DELETED",{"type":17,"tag":84,"props":177551,"children":177552},{},[177553],{"type":17,"tag":6121,"props":177554,"children":177556},{"className":177555},[],[177557],{"type":23,"value":177558},"USER_CREATED",{"type":17,"tag":84,"props":177560,"children":177561},{},[177562],{"type":17,"tag":6121,"props":177563,"children":177565},{"className":177564},[],[177566],{"type":23,"value":177567},"USER_DELETED",{"type":17,"tag":84,"props":177569,"children":177570},{},[177571],{"type":17,"tag":6121,"props":177572,"children":177574},{"className":177573},[],[177575],{"type":23,"value":177576},"USER_UPDATED",{"type":17,"tag":29,"props":177578,"children":177579},{},[177580],{"type":23,"value":177581},"Event payloads may include:",{"type":17,"tag":80,"props":177583,"children":177584},{},[177585,177593,177611,177620,177629,177638],{"type":17,"tag":84,"props":177586,"children":177587},{},[177588],{"type":17,"tag":6121,"props":177589,"children":177591},{"className":177590},[],[177592],{"type":23,"value":118627},{"type":17,"tag":84,"props":177594,"children":177595},{},[177596,177602,177604,177610],{"type":17,"tag":6121,"props":177597,"children":177599},{"className":177598},[],[177600],{"type":23,"value":177601},"event.message",{"type":23,"value":177603}," (including ",{"type":17,"tag":6121,"props":177605,"children":177607},{"className":177606},[],[177608],{"type":23,"value":177609},"event.message.id",{"type":23,"value":12034},{"type":17,"tag":84,"props":177612,"children":177613},{},[177614],{"type":17,"tag":6121,"props":177615,"children":177617},{"className":177616},[],[177618],{"type":23,"value":177619},"event.channel",{"type":17,"tag":84,"props":177621,"children":177622},{},[177623],{"type":17,"tag":6121,"props":177624,"children":177626},{"className":177625},[],[177627],{"type":23,"value":177628},"event.user",{"type":17,"tag":84,"props":177630,"children":177631},{},[177632],{"type":17,"tag":6121,"props":177633,"children":177635},{"className":177634},[],[177636],{"type":23,"value":177637},"event.button",{"type":17,"tag":84,"props":177639,"children":177640},{},[177641,177647],{"type":17,"tag":6121,"props":177642,"children":177644},{"className":177643},[],[177645],{"type":23,"value":177646},"event.is_replacing_original",{"type":23,"value":177648}," (Slack (bot) context)",{"type":17,"tag":68,"props":177650,"children":177652},{"id":177651},"reply-mechanics-threaded-replies",[177653],{"type":23,"value":177654},"Reply mechanics (threaded replies)",{"type":17,"tag":29,"props":177656,"children":177657},{},[177658,177660,177665,177667,177672,177674,177679],{"type":23,"value":177659},"When your bot receives a ",{"type":17,"tag":6121,"props":177661,"children":177663},{"className":177662},[],[177664],{"type":23,"value":158933},{"type":23,"value":177666}," or a ",{"type":17,"tag":6121,"props":177668,"children":177670},{"className":177669},[],[177671],{"type":23,"value":177112},{"type":23,"value":177673}," webhook, replying is done by creating a ",{"type":17,"tag":48,"props":177675,"children":177676},{},[177677],{"type":23,"value":177678},"new message",{"type":23,"value":54},{"type":17,"tag":29,"props":177681,"children":177682},{},[177683],{"type":23,"value":177684},"There is no separate 'reply' endpoint. A reply is simply a message that references a parent message.",{"type":17,"tag":239,"props":177686,"children":177688},{"id":177687},"step-1-extract-the-parent-message-id",[177689],{"type":23,"value":177690},"Step 1 — Extract the parent message ID",{"type":17,"tag":29,"props":177692,"children":177693},{},[177694],{"type":23,"value":177695},"From a Messaging Event payload:",{"type":17,"tag":6893,"props":177697,"children":177700},{"className":177698,"code":177699,"language":18718,"meta":7},[18716],"event.message.id\n",[177701],{"type":17,"tag":6121,"props":177702,"children":177703},{"__ignoreMap":7},[177704],{"type":23,"value":177699},{"type":17,"tag":29,"props":177706,"children":177707},{},[177708],{"type":23,"value":177709},"From a Message Created webhook payload:",{"type":17,"tag":6893,"props":177711,"children":177714},{"className":177712,"code":177713,"language":18718,"meta":7},[18716],"message.id\n",[177715],{"type":17,"tag":6121,"props":177716,"children":177717},{"__ignoreMap":7},[177718],{"type":23,"value":177713},{"type":17,"tag":29,"props":177720,"children":177721},{},[177722],{"type":23,"value":177723},"That ID represents the message you are replying to.",{"type":17,"tag":239,"props":177725,"children":177727},{"id":177726},"step-2-create-the-reply",[177728],{"type":23,"value":177729},"Step 2 — Create the reply",{"type":17,"tag":29,"props":177731,"children":177732},{},[177733,177735,177740],{"type":23,"value":177734},"All providers use ",{"type":17,"tag":6121,"props":177736,"children":177738},{"className":177737},[],[177739],{"type":23,"value":15863},{"type":23,"value":177741}," for threading.",{"type":17,"tag":6893,"props":177743,"children":177746},{"className":177744,"code":177745,"language":18718,"meta":7},[18716],"const parentMessageId = message.id;\nconst channels = message.channels ?? [];\n\nawait fetch(`https://api.unified.to/messaging/${connectionId}/message`, {\n  method: \"POST\",\n  headers: {\n    Authorization: `Bearer ${process.env.UNIFIED_API_KEY}`,\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\n    message: \"Got it.\",\n    channels,\n    parent_id: parentMessageId,\n  }),\n});\n",[177747],{"type":17,"tag":6121,"props":177748,"children":177749},{"__ignoreMap":7},[177750],{"type":23,"value":177745},{"type":17,"tag":29,"props":177752,"children":177753},{},[177754],{"type":23,"value":19907},{"type":17,"tag":80,"props":177756,"children":177757},{},[177758,177769,177786],{"type":17,"tag":84,"props":177759,"children":177760},{},[177761,177762,177767],{"type":23,"value":33722},{"type":17,"tag":6121,"props":177763,"children":177765},{"className":177764},[],[177766],{"type":23,"value":33459},{"type":23,"value":177768}," (the normalized field).",{"type":17,"tag":84,"props":177770,"children":177771},{},[177772,177777,177778,177784],{"type":17,"tag":6121,"props":177773,"children":177775},{"className":177774},[],[177776],{"type":23,"value":130947},{"type":23,"value":34435},{"type":17,"tag":6121,"props":177779,"children":177781},{"className":177780},[],[177782],{"type":23,"value":177783},"channel_ids",{"type":23,"value":177785}," are deprecated in the unified model.",{"type":17,"tag":84,"props":177787,"children":177788},{},[177789,177791,177796],{"type":23,"value":177790},"Threading is controlled by remembering the parent message and setting ",{"type":17,"tag":6121,"props":177792,"children":177794},{"className":177793},[],[177795],{"type":23,"value":15863},{"type":23,"value":54},{"type":17,"tag":68,"props":177798,"children":177800},{"id":177799},"updating-vs-replying-when-an-event-arrives",[177801],{"type":23,"value":177802},"Updating vs replying (when an event arrives)",{"type":17,"tag":29,"props":177804,"children":177805},{},[177806,177808,177813],{"type":23,"value":177807},"When your webhook receives a ",{"type":17,"tag":6121,"props":177809,"children":177811},{"className":177810},[],[177812],{"type":23,"value":158933},{"type":23,"value":177814},", you must decide between two actions:",{"type":17,"tag":239,"props":177816,"children":177818},{"id":177817},"_1-post-a-new-message-default-behavior",[177819],{"type":23,"value":177820},"1. Post a new message (default behavior)",{"type":17,"tag":29,"props":177822,"children":177823},{},[177824],{"type":23,"value":177825},"Create a new message using:",{"type":17,"tag":6893,"props":177827,"children":177829},{"className":177828,"code":27361,"language":20901,"meta":23},[20899],[177830],{"type":17,"tag":6121,"props":177831,"children":177832},{"__ignoreMap":7},[177833],{"type":23,"value":27361},{"type":17,"tag":29,"props":177835,"children":177836},{},[177837],{"type":23,"value":177838},"With:",{"type":17,"tag":80,"props":177840,"children":177841},{},[177842,177850,177858],{"type":17,"tag":84,"props":177843,"children":177844},{},[177845],{"type":17,"tag":6121,"props":177846,"children":177848},{"className":177847},[],[177849],{"type":23,"value":24872},{"type":17,"tag":84,"props":177851,"children":177852},{},[177853],{"type":17,"tag":6121,"props":177854,"children":177856},{"className":177855},[],[177857],{"type":23,"value":33459},{"type":17,"tag":84,"props":177859,"children":177860},{},[177861],{"type":17,"tag":6121,"props":177862,"children":177864},{"className":177863},[],[177865],{"type":23,"value":15863},{"type":17,"tag":29,"props":177867,"children":177868},{},[177869],{"type":23,"value":177870},"This is how bots:",{"type":17,"tag":80,"props":177872,"children":177873},{},[177874,177879,177884,177889],{"type":17,"tag":84,"props":177875,"children":177876},{},[177877],{"type":23,"value":177878},"respond to mentions",{"type":17,"tag":84,"props":177880,"children":177881},{},[177882],{"type":23,"value":177883},"acknowledge commands",{"type":17,"tag":84,"props":177885,"children":177886},{},[177887],{"type":23,"value":177888},"follow up after reactions",{"type":17,"tag":84,"props":177890,"children":177891},{},[177892],{"type":23,"value":177893},"continue threaded conversations",{"type":17,"tag":29,"props":177895,"children":177896},{},[177897],{"type":23,"value":177898},"This behavior works across all supported messaging integrations.",{"type":17,"tag":239,"props":177900,"children":177902},{"id":177901},"_2-replace-the-original-interactive-message-slack-bot-only",[177903],{"type":23,"value":177904},"2. Replace the original interactive message (Slack (bot) only)",{"type":17,"tag":29,"props":177906,"children":177907},{},[177908],{"type":23,"value":177909},"Slack (bot) integrations support updating interactive messages.",{"type":17,"tag":29,"props":177911,"children":177912},{},[177913,177915,177920],{"type":23,"value":177914},"When handling events like ",{"type":17,"tag":6121,"props":177916,"children":177918},{"className":177917},[],[177919],{"type":23,"value":177396},{"type":23,"value":177921},", Slack (bot) supports writing:",{"type":17,"tag":80,"props":177923,"children":177924},{},[177925,177934],{"type":17,"tag":84,"props":177926,"children":177927},{},[177928],{"type":17,"tag":6121,"props":177929,"children":177931},{"className":177930},[],[177932],{"type":23,"value":177933},"messaging_event_message",{"type":17,"tag":84,"props":177935,"children":177936},{},[177937],{"type":17,"tag":6121,"props":177938,"children":177940},{"className":177939},[],[177941],{"type":23,"value":177942},"messaging_event_is_replacing_original",{"type":17,"tag":29,"props":177944,"children":177945},{},[177946],{"type":23,"value":177947},"This allows you to overwrite the original message instead of posting a new one.",{"type":17,"tag":29,"props":177949,"children":177950},{},[177951],{"type":23,"value":177952},"Other providers require posting a new message instead of replacing the original.",{"type":17,"tag":68,"props":177954,"children":177956},{"id":177955},"thread-traversal-behavior",[177957],{"type":23,"value":177958},"Thread traversal behavior",{"type":17,"tag":29,"props":177960,"children":177961},{},[177962],{"type":23,"value":177963},"Unified also provides:",{"type":17,"tag":80,"props":177965,"children":177966},{},[177967,177977],{"type":17,"tag":84,"props":177968,"children":177969},{},[177970,177975],{"type":17,"tag":6121,"props":177971,"children":177973},{"className":177972},[],[177974],{"type":23,"value":33497},{"type":23,"value":177976}," — identifies the root of a thread (read-only)",{"type":17,"tag":84,"props":177978,"children":177979},{},[177980,177985],{"type":17,"tag":6121,"props":177981,"children":177983},{"className":177982},[],[177984],{"type":23,"value":160848},{"type":23,"value":177986}," — indicates whether a message has replies",{"type":17,"tag":29,"props":177988,"children":177989},{},[177990,177992,177997],{"type":23,"value":177991},"You do not need to set ",{"type":17,"tag":6121,"props":177993,"children":177995},{"className":177994},[],[177996],{"type":23,"value":33497},{"type":23,"value":177998},". It is informational.",{"type":17,"tag":29,"props":178000,"children":178001},{},[178002,178004,178009],{"type":23,"value":178003},"Threads are defined by parent relationships, using ",{"type":17,"tag":6121,"props":178005,"children":178007},{"className":178006},[],[178008],{"type":23,"value":15863},{"type":23,"value":54},{"type":17,"tag":68,"props":178011,"children":178013},{"id":178012},"webhook-security-required",[178014],{"type":23,"value":178015},"Webhook security (required)",{"type":17,"tag":29,"props":178017,"children":178018},{},[178019],{"type":23,"value":178020},"Unified webhook payloads include:",{"type":17,"tag":80,"props":178022,"children":178023},{},[178024,178034,178044],{"type":17,"tag":84,"props":178025,"children":178026},{},[178027,178032],{"type":17,"tag":6121,"props":178028,"children":178030},{"className":178029},[],[178031],{"type":23,"value":143728},{"type":23,"value":178033}," (array)",{"type":17,"tag":84,"props":178035,"children":178036},{},[178037,178042],{"type":17,"tag":6121,"props":178038,"children":178040},{"className":178039},[],[178041],{"type":23,"value":77777},{"type":23,"value":178043}," (string)",{"type":17,"tag":84,"props":178045,"children":178046},{},[178047,178052],{"type":17,"tag":6121,"props":178048,"children":178050},{"className":178049},[],[178051],{"type":23,"value":177128},{"type":23,"value":135901},{"type":17,"tag":239,"props":178054,"children":178056},{"id":178055},"signature-verification",[178057],{"type":23,"value":178058},"Signature verification",{"type":17,"tag":29,"props":178060,"children":178061},{},[178062,178067],{"type":17,"tag":6121,"props":178063,"children":178065},{"className":178064},[],[178066],{"type":23,"value":177128},{"type":23,"value":178068}," is generated as:",{"type":17,"tag":6893,"props":178070,"children":178073},{"className":178071,"code":178072,"language":20901,"meta":23},[20899],"base64( HMAC-SHA256( workspace_secret, serialized(data) + nonce ) )\n",[178074],{"type":17,"tag":6121,"props":178075,"children":178076},{"__ignoreMap":7},[178077],{"type":23,"value":178072},{"type":17,"tag":29,"props":178079,"children":178080},{},[178081],{"type":23,"value":178082},"Rules that matter in practice:",{"type":17,"tag":80,"props":178084,"children":178085},{},[178086,178103,178108,178113],{"type":17,"tag":84,"props":178087,"children":178088},{},[178089,178091,178096,178097],{"type":23,"value":178090},"Verify ",{"type":17,"tag":48,"props":178092,"children":178093},{},[178094],{"type":23,"value":178095},"only",{"type":23,"value":18757},{"type":17,"tag":6121,"props":178098,"children":178100},{"className":178099},[],[178101],{"type":23,"value":178102},"data + nonce",{"type":17,"tag":84,"props":178104,"children":178105},{},[178106],{"type":23,"value":178107},"Do not add whitespace",{"type":17,"tag":84,"props":178109,"children":178110},{},[178111],{"type":23,"value":178112},"Do not reorder fields",{"type":17,"tag":84,"props":178114,"children":178115},{},[178116],{"type":23,"value":178117},"Use a timing-safe comparison",{"type":17,"tag":29,"props":178119,"children":178120},{},[178121,178123,178129],{"type":23,"value":178122},"The legacy ",{"type":17,"tag":6121,"props":178124,"children":178126},{"className":178125},[],[178127],{"type":23,"value":178128},"sig",{"type":23,"value":178130}," (HMAC-SHA1) field is deprecated and should not be used.",{"type":17,"tag":68,"props":178132,"children":178134},{"id":178133},"step-1-create-webhook-subscriptions",[178135],{"type":23,"value":178136},"Step 1: Create webhook subscriptions",{"type":17,"tag":239,"props":178138,"children":178140},{"id":178139},"option-a-messaging-events-slack-bot-teams-bot",[178141],{"type":23,"value":178142},"Option A — Messaging Events (Slack (bot), Teams (bot))",{"type":17,"tag":6893,"props":178144,"children":178147},{"className":178145,"code":178146,"language":18718,"meta":7},[18716],"await fetch(\"https://api.unified.to/unified/webhook\", {\n  method: \"POST\",\n  headers: {\n    Authorization: `Bearer ${process.env.UNIFIED_API_KEY}`,\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\n    connection_id: process.env.CONNECTION_ID,\n    hook_url: process.env.PUBLIC_WEBHOOK_URL + \"/events\",\n    object_type: \"messaging_event\",\n    event: \"created\",\n  }),\n});\n",[178148],{"type":17,"tag":6121,"props":178149,"children":178150},{"__ignoreMap":7},[178151],{"type":23,"value":178146},{"type":17,"tag":239,"props":178153,"children":178155},{"id":178154},"option-b-message-created-slack-teams-discord",[178156],{"type":23,"value":178157},"Option B — Message created (Slack, Teams, Discord)",{"type":17,"tag":6893,"props":178159,"children":178162},{"className":178160,"code":178161,"language":18718,"meta":7},[18716],"await fetch(\"https://api.unified.to/unified/webhook\", {\n  method: \"POST\",\n  headers: {\n    Authorization: `Bearer ${process.env.UNIFIED_API_KEY}`,\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\n    connection_id: process.env.CONNECTION_ID,\n    hook_url: process.env.PUBLIC_WEBHOOK_URL + \"/messages\",\n    object_type: \"messaging_message\",\n    event: \"created\",\n  }),\n});\n",[178163],{"type":17,"tag":6121,"props":178164,"children":178165},{"__ignoreMap":7},[178166],{"type":23,"value":178161},{"type":17,"tag":68,"props":178168,"children":178170},{"id":178169},"step-2-build-the-webhook-receiver-typescript-express",[178171],{"type":23,"value":178172},"Step 2: Build the webhook receiver (TypeScript + Express)",{"type":17,"tag":29,"props":178174,"children":178175},{},[178176],{"type":23,"value":178177},"Install:",{"type":17,"tag":6893,"props":178179,"children":178182},{"className":178180,"code":178181,"language":48432,"meta":7},[48430],"npm init -y\nnpm install express\nnpm install -D typescript ts-node @types/node @types/express\n",[178183],{"type":17,"tag":6121,"props":178184,"children":178185},{"__ignoreMap":7},[178186],{"type":23,"value":178181},{"type":17,"tag":29,"props":178188,"children":178189},{},[178190,178192,178198],{"type":23,"value":178191},"Create ",{"type":17,"tag":6121,"props":178193,"children":178195},{"className":178194},[],[178196],{"type":23,"value":178197},"server.ts",{"type":23,"value":20456},{"type":17,"tag":6893,"props":178200,"children":178203},{"className":178201,"code":178202,"language":18718,"meta":7},[18716],"import express from \"express\";\nimport crypto from \"crypto\";\n\ntype UnifiedWebhookEnvelope\u003CT> = {\n  data: T[];\n  webhook: unknown;\n  nonce: string;\n  sig256: string;\n  external_xref?: string;\n  type?: \"INITIAL-PARTIAL\" | \"INITIAL-COMPLETE\" | \"VIRTUAL\" | \"NATIVE\";\n};\n\ntype MessagingEvent = {\n  type?:\n    | \"MESSAGE_RECEIVED\"\n    | \"REACTION_ADDED\"\n    | \"REACTION_REMOVED\"\n    | \"BUTTON_CLICK\"\n    | \"APP_MENTION\"\n    | \"CHANNEL_JOINED\"\n    | \"CHANNEL_LEFT\"\n    | \"CHANNEL_CREATED\"\n    | \"CHANNEL_DELETED\"\n    | \"USER_CREATED\"\n    | \"USER_DELETED\"\n    | \"USER_UPDATED\";\n  message?: {\n    id?: string;\n    message?: string;\n    channels?: { id?: string; name?: string }[];\n  };\n  button?: { id?: string; text?: string; icon?: string };\n};\n\ntype MessagingMessage = {\n  id?: string;\n  message?: string;\n  channels?: { id?: string; name?: string }[];\n};\n\nconst app = express();\napp.use(express.json());\n\nfunction timingSafeEq(a: string, b: string) {\n  const ba = Buffer.from(a, \"utf8\");\n  const bb = Buffer.from(b, \"utf8\");\n  return ba.length === bb.length && crypto.timingSafeEqual(ba, bb);\n}\n\nfunction verifySig256(envelope: UnifiedWebhookEnvelope\u003Cany>, workspaceSecret: string) {\n  if (!envelope?.sig256 || !envelope?.nonce || envelope?.data == null) return false;\n\n  // Signature covers only `data + nonce`\n  const serializedData = JSON.stringify(envelope.data);\n  const nonce = String(envelope.nonce);\n\n  const computed = crypto\n    .createHmac(\"sha256\", workspaceSecret)\n    .update(serializedData, \"utf8\")\n    .update(nonce, \"utf8\")\n    .digest(\"base64\");\n\n  return timingSafeEq(computed, envelope.sig256);\n}\n\nasync function unifiedCreateMessage(connectionId: string, body: Record\u003Cstring, any>) {\n  const res = await fetch(`https://api.unified.to/messaging/${connectionId}/message`, {\n    method: \"POST\",\n    headers: {\n      Authorization: `Bearer ${process.env.UNIFIED_API_KEY}`,\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify(body),\n  });\n\n  if (!res.ok) {\n    throw new Error(`Create message failed: ${res.statusText}`);\n  }\n\n  return res.json();\n}\n\nfunction buildReply(parentMessageId: string, channels: any[], text: string) {\n  return {\n    message: text,\n    channels,\n    parent_id: parentMessageId,\n  };\n}\n\n// Messaging Events handler\napp.post(\"/events\", async (req, res) => {\n  const connectionId = process.env.CONNECTION_ID!;\n  const secret = process.env.UNIFIED_WORKSPACE_SECRET!;\n\n  const envelope = req.body as UnifiedWebhookEnvelope\u003CMessagingEvent>;\n  if (!verifySig256(envelope, secret)) return res.status(401).send(\"Invalid signature\");\n\n  for (const event of envelope.data ?? []) {\n    if (!event.message?.id) continue;\n\n    if (event.type === \"MESSAGE_RECEIVED\" || event.type === \"APP_MENTION\") {\n      await unifiedCreateMessage(\n        connectionId,\n        buildReply(event.message.id, event.message.channels ?? [], \"Got it.\")\n      );\n    }\n  }\n\n  res.send(\"ok\");\n});\n\n// Message-created handler (Discord / fallback)\napp.post(\"/messages\", async (req, res) => {\n  const connectionId = process.env.CONNECTION_ID!;\n  const secret = process.env.UNIFIED_WORKSPACE_SECRET!;\n\n  const envelope = req.body as UnifiedWebhookEnvelope\u003CMessagingMessage>;\n  if (!verifySig256(envelope, secret)) return res.status(401).send(\"Invalid signature\");\n\n  for (const msg of envelope.data ?? []) {\n    if (!msg.id) continue;\n\n    await unifiedCreateMessage(\n      connectionId,\n      buildReply(msg.id, msg.channels ?? [], \"Got it.\")\n    );\n  }\n\n  res.send(\"ok\");\n});\n\napp.listen(3000, () => {\n  console.log(\"Listening on http://localhost:3000\");\n});\n",[178204],{"type":17,"tag":6121,"props":178205,"children":178206},{"__ignoreMap":7},[178207],{"type":23,"value":178202},{"type":17,"tag":29,"props":178209,"children":178210},{},[178211],{"type":23,"value":178212},"Run:",{"type":17,"tag":6893,"props":178214,"children":178217},{"className":178215,"code":178216,"language":48432,"meta":7},[48430],"npx ts-node server.ts\nngrok http 3000\n",[178218],{"type":17,"tag":6121,"props":178219,"children":178220},{"__ignoreMap":7},[178221],{"type":23,"value":178216},{"type":17,"tag":68,"props":178223,"children":178225},{"id":178224},"step-3-test-the-bot",[178226],{"type":23,"value":178227},"Step 3: Test the bot",{"type":17,"tag":6154,"props":178229,"children":178230},{},[178231,178249,178254,178259],{"type":17,"tag":84,"props":178232,"children":178233},{},[178234,178236,178242,178243],{"type":23,"value":178235},"Ensure webhooks point to ",{"type":17,"tag":6121,"props":178237,"children":178239},{"className":178238},[],[178240],{"type":23,"value":178241},"/events",{"type":23,"value":75890},{"type":17,"tag":6121,"props":178244,"children":178246},{"className":178245},[],[178247],{"type":23,"value":178248},"/messages",{"type":17,"tag":84,"props":178250,"children":178251},{},[178252],{"type":23,"value":178253},"Send a message or mention the bot",{"type":17,"tag":84,"props":178255,"children":178256},{},[178257],{"type":23,"value":178258},"Verify the webhook signature",{"type":17,"tag":84,"props":178260,"children":178261},{},[178262],{"type":23,"value":178263},"Confirm a threaded reply appears",{"type":17,"tag":68,"props":178265,"children":178267},{"id":178266},"what-to-avoid",[178268],{"type":23,"value":178269},"What to avoid",{"type":17,"tag":80,"props":178271,"children":178272},{},[178273,178278,178283,178306],{"type":17,"tag":84,"props":178274,"children":178275},{},[178276],{"type":23,"value":178277},"Polling list endpoints to detect new messages",{"type":17,"tag":84,"props":178279,"children":178280},{},[178281],{"type":23,"value":178282},"Treating Unified as a message store",{"type":17,"tag":84,"props":178284,"children":178285},{},[178286,178288,178293,178294,178299,178300,178305],{"type":23,"value":178287},"Using deprecated fields (",{"type":17,"tag":6121,"props":178289,"children":178291},{"className":178290},[],[178292],{"type":23,"value":130947},{"type":23,"value":11826},{"type":17,"tag":6121,"props":178295,"children":178297},{"className":178296},[],[178298],{"type":23,"value":177783},{"type":23,"value":11826},{"type":17,"tag":6121,"props":178301,"children":178303},{"className":178302},[],[178304],{"type":23,"value":130956},{"type":23,"value":12034},{"type":17,"tag":84,"props":178307,"children":178308},{},[178309,178310,178315],{"type":23,"value":153824},{"type":17,"tag":6121,"props":178311,"children":178313},{"className":178312},[],[178314],{"type":23,"value":178128},{"type":23,"value":178316}," (SHA-1)",{"type":17,"tag":68,"props":178318,"children":178320},{"id":178319},"why-teams-build-messaging-bots-on-unified",[178321],{"type":23,"value":178322},"Why teams build messaging bots on Unified",{"type":17,"tag":29,"props":178324,"children":178325},{},[178326,178328,178333],{"type":23,"value":178327},"Teams build messaging bots on Unified to deliver ",{"type":17,"tag":48,"props":178329,"children":178330},{},[178331],{"type":23,"value":178332},"real-time experiences inside the tools their customers already use",{"type":23,"value":54},{"type":17,"tag":29,"props":178335,"children":178336},{},[178337],{"type":23,"value":178338},"That includes bots that:",{"type":17,"tag":80,"props":178340,"children":178341},{},[178342,178347,178352,178357,178362],{"type":17,"tag":84,"props":178343,"children":178344},{},[178345],{"type":23,"value":178346},"answer customer questions directly inside Slack or Teams",{"type":17,"tag":84,"props":178348,"children":178349},{},[178350],{"type":23,"value":178351},"escalate issues the moment a message, mention, or reaction occurs",{"type":17,"tag":84,"props":178353,"children":178354},{},[178355],{"type":23,"value":178356},"guide users through workflows without leaving the conversation",{"type":17,"tag":84,"props":178358,"children":178359},{},[178360],{"type":23,"value":178361},"trigger actions when something meaningful happens in chat",{"type":17,"tag":84,"props":178363,"children":178364},{},[178365],{"type":23,"value":178366},"support AI assistants that need live context, not stale message history",{"type":17,"tag":29,"props":178368,"children":178369},{},[178370,178372,178377],{"type":23,"value":178371},"Unified handles the real-time delivery, provider differences, and security boundaries so teams can focus on ",{"type":17,"tag":48,"props":178373,"children":178374},{},[178375],{"type":23,"value":178376},"what the bot does",{"type":23,"value":178378},", not how each messaging platform behaves.",{"type":17,"tag":29,"props":178380,"children":178381},{},[178382],{"type":23,"value":178383},"Whether you're building:",{"type":17,"tag":80,"props":178385,"children":178386},{},[178387,178392,178397,178402],{"type":17,"tag":84,"props":178388,"children":178389},{},[178390],{"type":23,"value":178391},"a customer support bot that responds in real time",{"type":17,"tag":84,"props":178393,"children":178394},{},[178395],{"type":23,"value":178396},"a product assistant embedded in Slack or Teams",{"type":17,"tag":84,"props":178398,"children":178399},{},[178400],{"type":23,"value":178401},"automated workflows triggered by conversation activity",{"type":17,"tag":84,"props":178403,"children":178404},{},[178405],{"type":23,"value":178406},"or AI systems that need live messaging context",{"type":17,"tag":29,"props":178408,"children":178409},{},[178410,178412,178417],{"type":23,"value":178411},"Unified gives you a ",{"type":17,"tag":48,"props":178413,"children":178414},{},[178415],{"type":23,"value":178416},"single, real-time messaging surface",{"type":23,"value":178418}," that behaves predictably across platforms.",{"type":17,"tag":29,"props":178420,"children":178421},{},[178422,178423],{"type":23,"value":1609},{"type":17,"tag":133,"props":178424,"children":178426},{"href":178425},"/2fb6207b8384804493d4c04c7e2d0734",[178427],{"type":17,"tag":48,"props":178428,"children":178429},{},[178430],{"type":23,"value":1616},{"type":17,"tag":29,"props":178432,"children":178433},{},[178434,178435],{"type":23,"value":1609},{"type":17,"tag":133,"props":178436,"children":178437},{"href":178425},[178438],{"type":17,"tag":48,"props":178439,"children":178440},{},[178441],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":178443},[178444,178445,178446,178449,178450,178451,178455,178459,178460,178463,178467,178468,178469,178470],{"id":42649,"depth":1629,"text":42652},{"id":177146,"depth":1629,"text":177149},{"id":177205,"depth":1629,"text":177208,"children":178447},[178448],{"id":177222,"depth":1635,"text":177225},{"id":177429,"depth":1629,"text":177432},{"id":177461,"depth":1629,"text":177464},{"id":177651,"depth":1629,"text":177654,"children":178452},[178453,178454],{"id":177687,"depth":1635,"text":177690},{"id":177726,"depth":1635,"text":177729},{"id":177799,"depth":1629,"text":177802,"children":178456},[178457,178458],{"id":177817,"depth":1635,"text":177820},{"id":177901,"depth":1635,"text":177904},{"id":177955,"depth":1629,"text":177958},{"id":178012,"depth":1629,"text":178015,"children":178461},[178462],{"id":178055,"depth":1635,"text":178058},{"id":178133,"depth":1629,"text":178136,"children":178464},[178465,178466],{"id":178139,"depth":1635,"text":178142},{"id":178154,"depth":1635,"text":178157},{"id":178169,"depth":1629,"text":178172},{"id":178224,"depth":1629,"text":178227},{"id":178266,"depth":1629,"text":178269},{"id":178319,"depth":1629,"text":178322},"content:blog:how_to_build_a_messaging_bot_with_unified_slack_microsoft_teams_discord.md","blog/how_to_build_a_messaging_bot_with_unified_slack_microsoft_teams_discord.md","blog/how_to_build_a_messaging_bot_with_unified_slack_microsoft_teams_discord",{"_path":178475,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":178476,"description":178477,"img":178478,"date":178479,"tag":12,"body":178480,"_type":1677,"_id":179782,"_source":1679,"_file":179783,"_stem":179784,"_extension":1682},"/blog/file_storage_api_integration_real_time_files_hierarchies_and_secure_access_across_platforms","File Storage API Integration: Real-Time Files, Hierarchies, and Secure Access Across Platforms","File storage sits underneath almost every modern product. Contracts live in drives, attachments sit alongside tickets, documents feed AI pipelines, and...","https://s3.us-east-2.amazonaws.com/unified-article-images/file_storage_api_integration_real_time_files_hierarchies_and_secure_access_across_platforms-icon.png","2026-02-10T01:26:00.000Z",{"type":14,"children":178481,"toc":179732},[178482,178487,178490,178497,178502,178513,178524,178530,178535,178540,178568,178573,178585,178590,178600,178604,178637,178649,178655,178660,178720,178725,178731,178737,178742,178760,178765,178771,178781,178806,178811,178817,178822,178828,178861,178867,178916,178921,178927,178957,178962,178967,178995,179001,179005,179023,179027,179045,179049,179067,179071,179089,179093,179111,179117,179150,179156,179161,179179,179184,179190,179196,179201,179207,179211,179236,179241,179247,179277,179282,179288,179293,179318,179322,179327,179350,179356,179374,179379,179385,179407,179413,179418,179424,179430,179435,179441,179446,179452,179457,179463,179468,179474,179479,179485,179513,179518,179524,179528,179550,179556,179584,179590,179595,179605,179621,179626,179642,179647,179650,179654,179662,179667,179675,179680,179688,179693,179701,179706,179714,179719,179727],{"type":17,"tag":18,"props":178483,"children":178485},{"id":178484},"file-storage-api-integration-real-time-files-hierarchies-and-secure-access-across-platforms",[178486],{"type":23,"value":178476},{"type":17,"tag":25,"props":178488,"children":178489},{},[],{"type":17,"tag":29,"props":178491,"children":178492},{},[178493],{"type":17,"tag":33,"props":178494,"children":178495},{},[178496],{"type":23,"value":175199},{"type":17,"tag":29,"props":178498,"children":178499},{},[178500],{"type":23,"value":178501},"File storage sits underneath almost every modern product. Contracts live in drives, attachments sit alongside tickets, documents feed AI pipelines, and internal teams collaborate across folders that span providers. Files change constantly—new versions replace old ones, folders are reorganized, permissions shift, and links expire.",{"type":17,"tag":29,"props":178503,"children":178504},{},[178505,178507,178511],{"type":23,"value":178506},"When storage data is stitched together with background syncs or cached mirrors, applications drift out of alignment with reality. Users see outdated documents, broken links, or incomplete search results. ",{"type":17,"tag":133,"props":178508,"children":178509},{"href":28977},[178510],{"type":23,"value":72479},{"type":23,"value":178512}," integration exists to avoid that failure mode.",{"type":17,"tag":29,"props":178514,"children":178515},{},[178516,178518,178522],{"type":23,"value":178517},"In this guide, we'll explain what a ",{"type":17,"tag":133,"props":178519,"children":178520},{"href":28977},[178521],{"type":23,"value":142621},{"type":23,"value":178523}," actually does, how file and folder lifecycles behave in practice, how updates and events are delivered, and how Unified's Storage API fits alongside Knowledge Management, Ticketing, CRM, Commerce, and Generative AI within the Knowledge & Development group.",{"type":17,"tag":68,"props":178525,"children":178527},{"id":178526},"introduction-to-file-storage-api-integrations",[178528],{"type":23,"value":178529},"Introduction to File Storage API Integrations",{"type":17,"tag":29,"props":178531,"children":178532},{},[178533],{"type":23,"value":178534},"Cloud storage platforms such as Google Drive, Dropbox, Box, OneDrive, SharePoint, and Amazon S3 each expose their own APIs, object models, and permission systems.",{"type":17,"tag":29,"props":178536,"children":178537},{},[178538],{"type":23,"value":178539},"Across providers, you'll encounter:",{"type":17,"tag":80,"props":178541,"children":178542},{},[178543,178548,178553,178558,178563],{"type":17,"tag":84,"props":178544,"children":178545},{},[178546],{"type":23,"value":178547},"Different representations for files vs folders",{"type":17,"tag":84,"props":178549,"children":178550},{},[178551],{"type":23,"value":178552},"Provider-specific versioning and revision rules",{"type":17,"tag":84,"props":178554,"children":178555},{},[178556],{"type":23,"value":178557},"Temporary download links with expiration semantics",{"type":17,"tag":84,"props":178559,"children":178560},{},[178561],{"type":23,"value":178562},"Inconsistent webhook and change-event support",{"type":17,"tag":84,"props":178564,"children":178565},{},[178566],{"type":23,"value":178567},"Deeply nested hierarchies with no common traversal model",{"type":17,"tag":29,"props":178569,"children":178570},{},[178571],{"type":23,"value":178572},"Products that need to work across multiple storage providers quickly run into complexity around synchronization, permissions, and freshness.",{"type":17,"tag":29,"props":178574,"children":178575},{},[178576,178578,178583],{"type":23,"value":178577},"A File Storage API provides a consistent way to ",{"type":17,"tag":48,"props":178579,"children":178580},{},[178581],{"type":23,"value":178582},"read and write files and folders in real time",{"type":23,"value":178584},", without building and maintaining separate integrations for every provider.",{"type":17,"tag":68,"props":178586,"children":178587},{"id":28966},[178588],{"type":23,"value":178589},"What Is a File Storage API?",{"type":17,"tag":29,"props":178591,"children":178592},{},[178593,178594,178598],{"type":23,"value":9619},{"type":17,"tag":48,"props":178595,"children":178596},{},[178597],{"type":23,"value":142621},{"type":23,"value":178599}," allows applications to programmatically access and manage files stored in cloud storage platforms.",{"type":17,"tag":29,"props":178601,"children":178602},{},[178603],{"type":23,"value":167214},{"type":17,"tag":80,"props":178605,"children":178606},{},[178607,178612,178617,178622,178627,178632],{"type":17,"tag":84,"props":178608,"children":178609},{},[178610],{"type":23,"value":178611},"Listing files and folders",{"type":17,"tag":84,"props":178613,"children":178614},{},[178615],{"type":23,"value":178616},"Traversing hierarchical directory trees",{"type":17,"tag":84,"props":178618,"children":178619},{},[178620],{"type":23,"value":178621},"Retrieving file metadata and contents",{"type":17,"tag":84,"props":178623,"children":178624},{},[178625],{"type":23,"value":178626},"Creating, updating, and deleting files or folders",{"type":17,"tag":84,"props":178628,"children":178629},{},[178630],{"type":23,"value":178631},"Managing permissions and ownership metadata",{"type":17,"tag":84,"props":178633,"children":178634},{},[178635],{"type":23,"value":178636},"Monitoring changes to files and directories",{"type":17,"tag":29,"props":178638,"children":178639},{},[178640,178642,178647],{"type":23,"value":178641},"File Storage APIs focus exclusively on ",{"type":17,"tag":48,"props":178643,"children":178644},{},[178645],{"type":23,"value":178646},"documents and folders",{"type":23,"value":178648},". They are not responsible for tickets, CRM records, knowledge pages, or AI generation.",{"type":17,"tag":68,"props":178650,"children":178652},{"id":178651},"file-storage-api-vs-knowledge-ticketing-crm-commerce-and-genai",[178653],{"type":23,"value":178654},"File Storage API vs Knowledge, Ticketing, CRM, Commerce, and GenAI",{"type":17,"tag":29,"props":178656,"children":178657},{},[178658],{"type":23,"value":178659},"Unified treats File Storage as a foundational category with clear boundaries.",{"type":17,"tag":80,"props":178661,"children":178662},{},[178663,178672,178682,178691,178700,178710],{"type":17,"tag":84,"props":178664,"children":178665},{},[178666,178670],{"type":17,"tag":48,"props":178667,"children":178668},{},[178669],{"type":23,"value":172998},{"type":23,"value":178671}," manage files, folders, permissions, and content retrieval.",{"type":17,"tag":84,"props":178673,"children":178674},{},[178675,178680],{"type":17,"tag":48,"props":178676,"children":178677},{},[178678],{"type":23,"value":178679},"Knowledge Management APIs",{"type":23,"value":178681}," manage structured pages, spaces, and articles.",{"type":17,"tag":84,"props":178683,"children":178684},{},[178685,178689],{"type":17,"tag":48,"props":178686,"children":178687},{},[178688],{"type":23,"value":173008},{"type":23,"value":178690}," manage issues, tickets, notes, and customers.",{"type":17,"tag":84,"props":178692,"children":178693},{},[178694,178698],{"type":17,"tag":48,"props":178695,"children":178696},{},[178697],{"type":23,"value":173018},{"type":23,"value":178699}," manage contacts, companies, deals, and pipelines.",{"type":17,"tag":84,"props":178701,"children":178702},{},[178703,178708],{"type":17,"tag":48,"props":178704,"children":178705},{},[178706],{"type":23,"value":178707},"Commerce APIs",{"type":23,"value":178709}," manage products, inventory, and catalogs.",{"type":17,"tag":84,"props":178711,"children":178712},{},[178713,178718],{"type":17,"tag":48,"props":178714,"children":178715},{},[178716],{"type":23,"value":178717},"Generative AI APIs",{"type":23,"value":178719}," manage prompts, models, embeddings, and responses.",{"type":17,"tag":29,"props":178721,"children":178722},{},[178723],{"type":23,"value":178724},"Storage supplies raw content. Other categories consume or reference that content. Identity and lifecycle ownership remain separate.",{"type":17,"tag":68,"props":178726,"children":178728},{"id":178727},"real-time-storage-access-no-sync-jobs",[178729],{"type":23,"value":178730},"Real-Time Storage Access (No Sync Jobs)",{"type":17,"tag":239,"props":178732,"children":178734},{"id":178733},"live-reads-from-source-providers",[178735],{"type":23,"value":178736},"Live Reads from Source Providers",{"type":17,"tag":29,"props":178738,"children":178739},{},[178740],{"type":23,"value":178741},"Unified's Storage API routes every request directly to the underlying provider. There is no cached replica, no periodic sync, and no shadow database.",{"type":17,"tag":80,"props":178743,"children":178744},{},[178745,178750,178755],{"type":17,"tag":84,"props":178746,"children":178747},{},[178748],{"type":23,"value":178749},"Listings reflect the provider's current state",{"type":17,"tag":84,"props":178751,"children":178752},{},[178753],{"type":23,"value":178754},"Metadata is always fresh",{"type":17,"tag":84,"props":178756,"children":178757},{},[178758],{"type":23,"value":178759},"Version identifiers come directly from the source system",{"type":17,"tag":29,"props":178761,"children":178762},{},[178763],{"type":23,"value":178764},"If persistence is required, applications store data themselves.",{"type":17,"tag":239,"props":178766,"children":178768},{"id":178767},"files-and-folders-as-one-object",[178769],{"type":23,"value":178770},"Files and Folders as One Object",{"type":17,"tag":29,"props":178772,"children":178773},{},[178774,178776,178780],{"type":23,"value":178775},"Unified represents both files and folders using a single object: ",{"type":17,"tag":48,"props":178777,"children":178778},{},[178779],{"type":23,"value":72411},{"type":23,"value":54},{"type":17,"tag":80,"props":178782,"children":178783},{},[178784,178795],{"type":17,"tag":84,"props":178785,"children":178786},{},[178787,178793],{"type":17,"tag":6121,"props":178788,"children":178790},{"className":178789},[],[178791],{"type":23,"value":178792},"type = FILE",{"type":23,"value":178794}," represents a file",{"type":17,"tag":84,"props":178796,"children":178797},{},[178798,178804],{"type":17,"tag":6121,"props":178799,"children":178801},{"className":178800},[],[178802],{"type":23,"value":178803},"type = FOLDER",{"type":23,"value":178805}," represents a folder",{"type":17,"tag":29,"props":178807,"children":178808},{},[178809],{"type":23,"value":178810},"There are no separate folder endpoints. The same operations apply to both.",{"type":17,"tag":68,"props":178812,"children":178814},{"id":178813},"core-storagefile-data-model",[178815],{"type":23,"value":178816},"Core StorageFile Data Model",{"type":17,"tag":29,"props":178818,"children":178819},{},[178820],{"type":23,"value":178821},"The StorageFile object standardizes file and folder behavior across providers.",{"type":17,"tag":239,"props":178823,"children":178825},{"id":178824},"identity-and-hierarchy",[178826],{"type":23,"value":178827},"Identity and Hierarchy",{"type":17,"tag":80,"props":178829,"children":178830},{},[178831,178841,178851,178856],{"type":17,"tag":84,"props":178832,"children":178833},{},[178834,178839],{"type":17,"tag":6121,"props":178835,"children":178837},{"className":178836},[],[178838],{"type":23,"value":18766},{"type":23,"value":178840}," uniquely identifies a file or folder within a connection",{"type":17,"tag":84,"props":178842,"children":178843},{},[178844,178849],{"type":17,"tag":6121,"props":178845,"children":178847},{"className":178846},[],[178848],{"type":23,"value":15863},{"type":23,"value":178850}," defines the folder hierarchy",{"type":17,"tag":84,"props":178852,"children":178853},{},[178854],{"type":23,"value":178855},"Root-level items have no parent_id",{"type":17,"tag":84,"props":178857,"children":178858},{},[178859],{"type":23,"value":178860},"Hierarchies are traversed by listing children via parent_id",{"type":17,"tag":239,"props":178862,"children":178864},{"id":178863},"metadata-and-ownership",[178865],{"type":23,"value":178866},"Metadata and Ownership",{"type":17,"tag":80,"props":178868,"children":178869},{},[178870,178896,178906],{"type":17,"tag":84,"props":178871,"children":178872},{},[178873,178878,178879,178884,178885,178890,178891],{"type":17,"tag":6121,"props":178874,"children":178876},{"className":178875},[],[178877],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":178880,"children":178882},{"className":178881},[],[178883],{"type":23,"value":24679},{"type":23,"value":11826},{"type":17,"tag":6121,"props":178886,"children":178888},{"className":178887},[],[178889],{"type":23,"value":72581},{"type":23,"value":11826},{"type":17,"tag":6121,"props":178892,"children":178894},{"className":178893},[],[178895],{"type":23,"value":20181},{"type":17,"tag":84,"props":178897,"children":178898},{},[178899,178904],{"type":17,"tag":6121,"props":178900,"children":178902},{"className":178901},[],[178903],{"type":23,"value":62582},{"type":23,"value":178905}," references an HR employee who owns or created the item",{"type":17,"tag":84,"props":178907,"children":178908},{},[178909,178914],{"type":17,"tag":6121,"props":178910,"children":178912},{"className":178911},[],[178913],{"type":23,"value":24204},{"type":23,"value":178915}," define access using HR users and groups",{"type":17,"tag":29,"props":178917,"children":178918},{},[178919],{"type":23,"value":178920},"There are no CRM contacts, ticket IDs, or knowledge page references embedded in storage objects.",{"type":17,"tag":239,"props":178922,"children":178924},{"id":178923},"file-content-access",[178925],{"type":23,"value":178926},"File Content Access",{"type":17,"tag":80,"props":178928,"children":178929},{},[178930,178942,178947,178952],{"type":17,"tag":84,"props":178931,"children":178932},{},[178933,178935,178940],{"type":23,"value":178934},"Files expose a ",{"type":17,"tag":6121,"props":178936,"children":178938},{"className":178937},[],[178939],{"type":23,"value":24978},{"type":23,"value":178941}," for retrieving contents",{"type":17,"tag":84,"props":178943,"children":178944},{},[178945],{"type":23,"value":178946},"The download URL is temporary and expires after approximately one hour",{"type":17,"tag":84,"props":178948,"children":178949},{},[178950],{"type":23,"value":178951},"To refresh the link, retrieve the file again",{"type":17,"tag":84,"props":178953,"children":178954},{},[178955],{"type":23,"value":178956},"Unified does not proxy or store file contents",{"type":17,"tag":29,"props":178958,"children":178959},{},[178960],{"type":23,"value":178961},"Uploads and updates send base64-encoded file data directly to the provider.",{"type":17,"tag":239,"props":178963,"children":178964},{"id":29012},[178965],{"type":23,"value":178966},"Versioning",{"type":17,"tag":80,"props":178968,"children":178969},{},[178970,178980,178985,178990],{"type":17,"tag":84,"props":178971,"children":178972},{},[178973,178978],{"type":17,"tag":6121,"props":178974,"children":178976},{"className":178975},[],[178977],{"type":23,"value":72684},{"type":23,"value":178979}," is a provider-assigned revision identifier",{"type":17,"tag":84,"props":178981,"children":178982},{},[178983],{"type":23,"value":178984},"Updating file contents creates a new version",{"type":17,"tag":84,"props":178986,"children":178987},{},[178988],{"type":23,"value":178989},"Unified always returns the latest version",{"type":17,"tag":84,"props":178991,"children":178992},{},[178993],{"type":23,"value":178994},"Historical versions are not exposed at the unified layer",{"type":17,"tag":68,"props":178996,"children":178998},{"id":178997},"object-behavior-and-lifecycle",[178999],{"type":23,"value":179000},"Object Behavior and Lifecycle",{"type":17,"tag":239,"props":179002,"children":179003},{"id":11254},[179004],{"type":23,"value":42125},{"type":17,"tag":80,"props":179006,"children":179007},{},[179008,179013,179018],{"type":17,"tag":84,"props":179009,"children":179010},{},[179011],{"type":23,"value":179012},"Files are created by supplying metadata and base64-encoded contents",{"type":17,"tag":84,"props":179014,"children":179015},{},[179016],{"type":23,"value":179017},"Folders are created with metadata only",{"type":17,"tag":84,"props":179019,"children":179020},{},[179021],{"type":23,"value":179022},"Write support depends on the provider",{"type":17,"tag":239,"props":179024,"children":179025},{"id":11243},[179026],{"type":23,"value":145784},{"type":17,"tag":80,"props":179028,"children":179029},{},[179030,179035,179040],{"type":17,"tag":84,"props":179031,"children":179032},{},[179033],{"type":23,"value":179034},"Listing without parameters returns root contents",{"type":17,"tag":84,"props":179036,"children":179037},{},[179038],{"type":23,"value":179039},"Supplying parent_id returns folder contents",{"type":17,"tag":84,"props":179041,"children":179042},{},[179043],{"type":23,"value":179044},"Files and folders are returned together",{"type":17,"tag":239,"props":179046,"children":179047},{"id":24038},[179048],{"type":23,"value":145789},{"type":17,"tag":80,"props":179050,"children":179051},{},[179052,179057,179062],{"type":17,"tag":84,"props":179053,"children":179054},{},[179055],{"type":23,"value":179056},"Returns metadata",{"type":17,"tag":84,"props":179058,"children":179059},{},[179060],{"type":23,"value":179061},"Files include a temporary download URL",{"type":17,"tag":84,"props":179063,"children":179064},{},[179065],{"type":23,"value":179066},"Folders return metadata only",{"type":17,"tag":239,"props":179068,"children":179069},{"id":11845},[179070],{"type":23,"value":109982},{"type":17,"tag":80,"props":179072,"children":179073},{},[179074,179079,179084],{"type":17,"tag":84,"props":179075,"children":179076},{},[179077],{"type":23,"value":179078},"Metadata updates rename or move items",{"type":17,"tag":84,"props":179080,"children":179081},{},[179082],{"type":23,"value":179083},"File updates replace contents and increment version",{"type":17,"tag":84,"props":179085,"children":179086},{},[179087],{"type":23,"value":179088},"Folder updates never include file data",{"type":17,"tag":239,"props":179090,"children":179091},{"id":11852},[179092],{"type":23,"value":150952},{"type":17,"tag":80,"props":179094,"children":179095},{},[179096,179101,179106],{"type":17,"tag":84,"props":179097,"children":179098},{},[179099],{"type":23,"value":179100},"Deleting a file or folder removes it",{"type":17,"tag":84,"props":179102,"children":179103},{},[179104],{"type":23,"value":179105},"Folder deletion cascades to all nested contents",{"type":17,"tag":84,"props":179107,"children":179108},{},[179109],{"type":23,"value":179110},"Unified does not expose restore or trash semantics",{"type":17,"tag":239,"props":179112,"children":179114},{"id":179113},"irreversible-states",[179115],{"type":23,"value":179116},"Irreversible States",{"type":17,"tag":80,"props":179118,"children":179119},{},[179120,179130,179140,179145],{"type":17,"tag":84,"props":179121,"children":179122},{},[179123,179128],{"type":17,"tag":6121,"props":179124,"children":179126},{"className":179125},[],[179127],{"type":23,"value":33446},{"type":23,"value":179129}," is immutable",{"type":17,"tag":84,"props":179131,"children":179132},{},[179133,179138],{"type":17,"tag":6121,"props":179134,"children":179136},{"className":179135},[],[179137],{"type":23,"value":72684},{"type":23,"value":179139}," is provider-controlled",{"type":17,"tag":84,"props":179141,"children":179142},{},[179143],{"type":23,"value":179144},"Expired download URLs cannot be reused",{"type":17,"tag":84,"props":179146,"children":179147},{},[179148],{"type":23,"value":179149},"Deletions are permanent at the unified layer",{"type":17,"tag":68,"props":179151,"children":179153},{"id":179152},"provider-variability-to-expect",[179154],{"type":23,"value":179155},"Provider Variability to Expect",{"type":17,"tag":29,"props":179157,"children":179158},{},[179159],{"type":23,"value":179160},"Write support differs by provider.",{"type":17,"tag":80,"props":179162,"children":179163},{},[179164,179169,179174],{"type":17,"tag":84,"props":179165,"children":179166},{},[179167],{"type":23,"value":179168},"Google Drive and Box support full create, update, and delete operations",{"type":17,"tag":84,"props":179170,"children":179171},{},[179172],{"type":23,"value":179173},"Dropbox supports listing, retrieval, and deletion, but not creation or updates",{"type":17,"tag":84,"props":179175,"children":179176},{},[179177],{"type":23,"value":179178},"Amazon S3 is read-only through Unified",{"type":17,"tag":29,"props":179180,"children":179181},{},[179182],{"type":23,"value":179183},"Applications should treat write operations as conditional and handle provider errors gracefully.",{"type":17,"tag":68,"props":179185,"children":179187},{"id":179186},"updates-events-and-change-detection",[179188],{"type":23,"value":179189},"Updates, Events, and Change Detection",{"type":17,"tag":239,"props":179191,"children":179193},{"id":179192},"file-level-events-only",[179194],{"type":23,"value":179195},"File-Level Events Only",{"type":17,"tag":29,"props":179197,"children":179198},{},[179199],{"type":23,"value":179200},"Storage events are emitted only for files and folders (StorageFile). There are no account-level or drive-level events.",{"type":17,"tag":239,"props":179202,"children":179204},{"id":179203},"webhook-delivery",[179205],{"type":23,"value":179206},"Webhook Delivery",{"type":17,"tag":29,"props":179208,"children":179209},{},[179210],{"type":23,"value":95391},{"type":17,"tag":80,"props":179212,"children":179213},{},[179214,179227],{"type":17,"tag":84,"props":179215,"children":179216},{},[179217,179225],{"type":17,"tag":48,"props":179218,"children":179219},{},[179220,179221],{"type":23,"value":119374},{"type":17,"tag":133,"props":179222,"children":179223},{"href":4999},[179224],{"type":23,"value":5002},{"type":23,"value":179226}," when providers expose file events",{"type":17,"tag":84,"props":179228,"children":179229},{},[179230,179234],{"type":17,"tag":48,"props":179231,"children":179232},{},[179233],{"type":23,"value":9256},{"type":23,"value":179235}," when providers do not",{"type":17,"tag":29,"props":179237,"children":179238},{},[179239],{"type":23,"value":179240},"Virtual webhooks poll the provider on a configurable interval and emit change events only when differences are detected.",{"type":17,"tag":239,"props":179242,"children":179244},{"id":179243},"event-semantics",[179245],{"type":23,"value":179246},"Event Semantics",{"type":17,"tag":80,"props":179248,"children":179249},{},[179250,179259,179268],{"type":17,"tag":84,"props":179251,"children":179252},{},[179253,179257],{"type":17,"tag":48,"props":179254,"children":179255},{},[179256],{"type":23,"value":166495},{"type":23,"value":179258}," events fire only for new files or folders",{"type":17,"tag":84,"props":179260,"children":179261},{},[179262,179266],{"type":17,"tag":48,"props":179263,"children":179264},{},[179265],{"type":23,"value":166500},{"type":23,"value":179267}," events fire for both new and modified items",{"type":17,"tag":84,"props":179269,"children":179270},{},[179271,179275],{"type":17,"tag":48,"props":179272,"children":179273},{},[179274],{"type":23,"value":166505},{"type":23,"value":179276}," events are available only when providers expose them",{"type":17,"tag":29,"props":179278,"children":179279},{},[179280],{"type":23,"value":179281},"Webhook payloads include the updated StorageFile objects directly.",{"type":17,"tag":239,"props":179283,"children":179285},{"id":179284},"polling-fallback",[179286],{"type":23,"value":179287},"Polling Fallback",{"type":17,"tag":29,"props":179289,"children":179290},{},[179291],{"type":23,"value":179292},"When webhooks are unavailable, applications poll the list endpoint.",{"type":17,"tag":80,"props":179294,"children":179295},{},[179296,179308,179313],{"type":17,"tag":84,"props":179297,"children":179298},{},[179299,179301,179306],{"type":23,"value":179300},"Many providers support ",{"type":17,"tag":6121,"props":179302,"children":179304},{"className":179303},[],[179305],{"type":23,"value":26291},{"type":23,"value":179307}," for incremental polling",{"type":17,"tag":84,"props":179309,"children":179310},{},[179311],{"type":23,"value":179312},"Others require full listings with local timestamp comparison",{"type":17,"tag":84,"props":179314,"children":179315},{},[179316],{"type":23,"value":179317},"Polling frequency balances freshness and API usage",{"type":17,"tag":68,"props":179319,"children":179320},{"id":164849},[179321],{"type":23,"value":164852},{"type":17,"tag":239,"props":179323,"children":179324},{"id":90302},[179325],{"type":23,"value":179326},"Zero-Storage Design",{"type":17,"tag":80,"props":179328,"children":179329},{},[179330,179335,179340,179345],{"type":17,"tag":84,"props":179331,"children":179332},{},[179333],{"type":23,"value":179334},"No files are stored at rest",{"type":17,"tag":84,"props":179336,"children":179337},{},[179338],{"type":23,"value":179339},"No payloads are cached",{"type":17,"tag":84,"props":179341,"children":179342},{},[179343],{"type":23,"value":179344},"All operations are stateless and real time",{"type":17,"tag":84,"props":179346,"children":179347},{},[179348],{"type":23,"value":179349},"Processing environments are region-aware (US, EU, AU)",{"type":17,"tag":239,"props":179351,"children":179353},{"id":179352},"sensitive-data-considerations",[179354],{"type":23,"value":179355},"Sensitive Data Considerations",{"type":17,"tag":80,"props":179357,"children":179358},{},[179359,179364,179369],{"type":17,"tag":84,"props":179360,"children":179361},{},[179362],{"type":23,"value":179363},"File names and metadata may contain confidential information",{"type":17,"tag":84,"props":179365,"children":179366},{},[179367],{"type":23,"value":179368},"File contents are retrieved via expiring links",{"type":17,"tag":84,"props":179370,"children":179371},{},[179372],{"type":23,"value":179373},"Permissions reference HR identities only",{"type":17,"tag":29,"props":179375,"children":179376},{},[179377],{"type":23,"value":179378},"Unified passes data through without persistence. Downstream storage and access control are the application's responsibility.",{"type":17,"tag":239,"props":179380,"children":179382},{"id":179381},"access-controls",[179383],{"type":23,"value":179384},"Access Controls",{"type":17,"tag":80,"props":179386,"children":179387},{},[179388,179392,179397,179402],{"type":17,"tag":84,"props":179389,"children":179390},{},[179391],{"type":23,"value":93426},{"type":17,"tag":84,"props":179393,"children":179394},{},[179395],{"type":23,"value":179396},"Minimal operational metadata encrypted at rest",{"type":17,"tag":84,"props":179398,"children":179399},{},[179400],{"type":23,"value":179401},"OAuth credentials can be stored in customer-managed secrets",{"type":17,"tag":84,"props":179403,"children":179404},{},[179405],{"type":23,"value":179406},"SAML/OIDC SSO, IP allowlisting, and scoped API keys supported",{"type":17,"tag":239,"props":179408,"children":179410},{"id":179409},"compliance-posture",[179411],{"type":23,"value":179412},"Compliance Posture",{"type":17,"tag":29,"props":179414,"children":179415},{},[179416],{"type":23,"value":179417},"Unified aligns with SOC 2 Type II, GDPR, CCPA/CPRA, HIPAA, and PIPEDA. Zero storage reduces audit scope and exposure.",{"type":17,"tag":68,"props":179419,"children":179421},{"id":179420},"common-file-storage-api-use-cases",[179422],{"type":23,"value":179423},"Common File Storage API Use Cases",{"type":17,"tag":239,"props":179425,"children":179427},{"id":179426},"enterprise-search",[179428],{"type":23,"value":179429},"Enterprise Search",{"type":17,"tag":29,"props":179431,"children":179432},{},[179433],{"type":23,"value":179434},"Index documents across drives and platforms.",{"type":17,"tag":239,"props":179436,"children":179438},{"id":179437},"contract-and-document-management",[179439],{"type":23,"value":179440},"Contract and Document Management",{"type":17,"tag":29,"props":179442,"children":179443},{},[179444],{"type":23,"value":179445},"Access contracts regardless of where they are stored.",{"type":17,"tag":239,"props":179447,"children":179449},{"id":179448},"ai-and-rag-pipelines",[179450],{"type":23,"value":179451},"AI and RAG Pipelines",{"type":17,"tag":29,"props":179453,"children":179454},{},[179455],{"type":23,"value":179456},"Feed documents into embedding and retrieval workflows.",{"type":17,"tag":239,"props":179458,"children":179460},{"id":179459},"backup-and-sync",[179461],{"type":23,"value":179462},"Backup and Sync",{"type":17,"tag":29,"props":179464,"children":179465},{},[179466],{"type":23,"value":179467},"Mirror files across providers without bespoke integrations.",{"type":17,"tag":239,"props":179469,"children":179471},{"id":179470},"collaboration-tools",[179472],{"type":23,"value":179473},"Collaboration Tools",{"type":17,"tag":29,"props":179475,"children":179476},{},[179477],{"type":23,"value":179478},"Build unified file browsers and sharing experiences.",{"type":17,"tag":68,"props":179480,"children":179482},{"id":179481},"design-constraints-to-plan-for",[179483],{"type":23,"value":179484},"Design Constraints to Plan For",{"type":17,"tag":80,"props":179486,"children":179487},{},[179488,179493,179498,179503,179508],{"type":17,"tag":84,"props":179489,"children":179490},{},[179491],{"type":23,"value":179492},"Download links expire",{"type":17,"tag":84,"props":179494,"children":179495},{},[179496],{"type":23,"value":179497},"Write support is provider-dependent",{"type":17,"tag":84,"props":179499,"children":179500},{},[179501],{"type":23,"value":179502},"Deletions are permanent",{"type":17,"tag":84,"props":179504,"children":179505},{},[179506],{"type":23,"value":179507},"Not all providers emit change events",{"type":17,"tag":84,"props":179509,"children":179510},{},[179511],{"type":23,"value":179512},"Hierarchies must be traversed explicitly",{"type":17,"tag":29,"props":179514,"children":179515},{},[179516],{"type":23,"value":179517},"These constraints reflect how storage systems work in practice.",{"type":17,"tag":68,"props":179519,"children":179521},{"id":179520},"build-vs-maintain-storage-integrations",[179522],{"type":23,"value":179523},"Build vs Maintain Storage Integrations",{"type":17,"tag":239,"props":179525,"children":179526},{"id":165021},[179527],{"type":23,"value":165024},{"type":17,"tag":80,"props":179529,"children":179530},{},[179531,179535,179540,179545],{"type":17,"tag":84,"props":179532,"children":179533},{},[179534],{"type":23,"value":174000},{"type":17,"tag":84,"props":179536,"children":179537},{},[179538],{"type":23,"value":179539},"Different hierarchy models",{"type":17,"tag":84,"props":179541,"children":179542},{},[179543],{"type":23,"value":179544},"Provider-specific change detection",{"type":17,"tag":84,"props":179546,"children":179547},{},[179548],{"type":23,"value":179549},"Ongoing maintenance as APIs evolve",{"type":17,"tag":239,"props":179551,"children":179553},{"id":179552},"using-a-unified-storage-api",[179554],{"type":23,"value":179555},"Using a Unified Storage API",{"type":17,"tag":80,"props":179557,"children":179558},{},[179559,179564,179569,179574,179579],{"type":17,"tag":84,"props":179560,"children":179561},{},[179562],{"type":23,"value":179563},"One normalized StorageFile model",{"type":17,"tag":84,"props":179565,"children":179566},{},[179567],{"type":23,"value":179568},"Live access to providers",{"type":17,"tag":84,"props":179570,"children":179571},{},[179572],{"type":23,"value":179573},"Unified hierarchy traversal",{"type":17,"tag":84,"props":179575,"children":179576},{},[179577],{"type":23,"value":179578},"Centralized authentication",{"type":17,"tag":84,"props":179580,"children":179581},{},[179582],{"type":23,"value":179583},"Clear boundaries with adjacent categories",{"type":17,"tag":68,"props":179585,"children":179587},{"id":179586},"build-file-integrations-without-sync-drift",[179588],{"type":23,"value":179589},"Build file integrations without sync drift",{"type":17,"tag":29,"props":179591,"children":179592},{},[179593],{"type":23,"value":179594},"If your product relies on documents across cloud storage platforms, maintaining separate integrations quickly becomes brittle.",{"type":17,"tag":29,"props":179596,"children":179597},{},[179598,179599,179603],{"type":23,"value":25244},{"type":17,"tag":48,"props":179600,"children":179601},{},[179602],{"type":23,"value":142621},{"type":23,"value":179604}," provides a real-time, normalized way to list, retrieve, create, update, and monitor files and folders—without storing data or collapsing category boundaries.",{"type":17,"tag":29,"props":179606,"children":179607},{},[179608,179612,179613],{"type":17,"tag":48,"props":179609,"children":179610},{},[179611],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":179614,"children":179616},{"href":1612,"rel":179615},[214],[179617],{"type":17,"tag":48,"props":179618,"children":179619},{},[179620],{"type":23,"value":1616},{"type":17,"tag":29,"props":179622,"children":179623},{},[179624],{"type":23,"value":179625},"Connect file storage providers and work with live document data.",{"type":17,"tag":29,"props":179627,"children":179628},{},[179629,179633,179634],{"type":17,"tag":48,"props":179630,"children":179631},{},[179632],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":179635,"children":179637},{"href":1623,"rel":179636},[214],[179638],{"type":17,"tag":48,"props":179639,"children":179640},{},[179641],{"type":23,"value":1627},{"type":17,"tag":29,"props":179643,"children":179644},{},[179645],{"type":23,"value":179646},"Discuss storage, knowledge, AI, or cross-category workflows with the team that built the platform.",{"type":17,"tag":25,"props":179648,"children":179649},{},[],{"type":17,"tag":68,"props":179651,"children":179652},{"id":95759},[179653],{"type":23,"value":95762},{"type":17,"tag":29,"props":179655,"children":179656},{},[179657],{"type":17,"tag":48,"props":179658,"children":179659},{},[179660],{"type":23,"value":179661},"What is a File Storage API?",{"type":17,"tag":29,"props":179663,"children":179664},{},[179665],{"type":23,"value":179666},"An API that allows applications to manage files and folders programmatically across cloud storage platforms.",{"type":17,"tag":29,"props":179668,"children":179669},{},[179670],{"type":17,"tag":48,"props":179671,"children":179672},{},[179673],{"type":23,"value":179674},"Does the Storage API handle folders separately from files?",{"type":17,"tag":29,"props":179676,"children":179677},{},[179678],{"type":23,"value":179679},"No. Both are represented by the same StorageFile object.",{"type":17,"tag":29,"props":179681,"children":179682},{},[179683],{"type":17,"tag":48,"props":179684,"children":179685},{},[179686],{"type":23,"value":179687},"Are file downloads permanent?",{"type":17,"tag":29,"props":179689,"children":179690},{},[179691],{"type":23,"value":179692},"No. Download URLs are temporary and must be refreshed.",{"type":17,"tag":29,"props":179694,"children":179695},{},[179696],{"type":17,"tag":48,"props":179697,"children":179698},{},[179699],{"type":23,"value":179700},"Does Unified store file contents?",{"type":17,"tag":29,"props":179702,"children":179703},{},[179704],{"type":23,"value":179705},"No. File contents are never stored at rest.",{"type":17,"tag":29,"props":179707,"children":179708},{},[179709],{"type":17,"tag":48,"props":179710,"children":179711},{},[179712],{"type":23,"value":179713},"How are changes detected?",{"type":17,"tag":29,"props":179715,"children":179716},{},[179717],{"type":23,"value":179718},"Through native webhooks, virtual webhooks, or polling depending on provider support.",{"type":17,"tag":29,"props":179720,"children":179721},{},[179722],{"type":17,"tag":48,"props":179723,"children":179724},{},[179725],{"type":23,"value":179726},"How does Storage differ from Knowledge or Ticketing?",{"type":17,"tag":29,"props":179728,"children":179729},{},[179730],{"type":23,"value":179731},"Storage manages raw files. Knowledge manages structured pages. Ticketing manages issues and notes.",{"title":7,"searchDepth":1629,"depth":1629,"links":179733},[179734,179735,179736,179737,179741,179747,179755,179756,179762,179768,179775,179776,179780,179781],{"id":178526,"depth":1629,"text":178529},{"id":28966,"depth":1629,"text":178589},{"id":178651,"depth":1629,"text":178654},{"id":178727,"depth":1629,"text":178730,"children":179738},[179739,179740],{"id":178733,"depth":1635,"text":178736},{"id":178767,"depth":1635,"text":178770},{"id":178813,"depth":1629,"text":178816,"children":179742},[179743,179744,179745,179746],{"id":178824,"depth":1635,"text":178827},{"id":178863,"depth":1635,"text":178866},{"id":178923,"depth":1635,"text":178926},{"id":29012,"depth":1635,"text":178966},{"id":178997,"depth":1629,"text":179000,"children":179748},[179749,179750,179751,179752,179753,179754],{"id":11254,"depth":1635,"text":42125},{"id":11243,"depth":1635,"text":145784},{"id":24038,"depth":1635,"text":145789},{"id":11845,"depth":1635,"text":109982},{"id":11852,"depth":1635,"text":150952},{"id":179113,"depth":1635,"text":179116},{"id":179152,"depth":1629,"text":179155},{"id":179186,"depth":1629,"text":179189,"children":179757},[179758,179759,179760,179761],{"id":179192,"depth":1635,"text":179195},{"id":179203,"depth":1635,"text":179206},{"id":179243,"depth":1635,"text":179246},{"id":179284,"depth":1635,"text":179287},{"id":164849,"depth":1629,"text":164852,"children":179763},[179764,179765,179766,179767],{"id":90302,"depth":1635,"text":179326},{"id":179352,"depth":1635,"text":179355},{"id":179381,"depth":1635,"text":179384},{"id":179409,"depth":1635,"text":179412},{"id":179420,"depth":1629,"text":179423,"children":179769},[179770,179771,179772,179773,179774],{"id":179426,"depth":1635,"text":179429},{"id":179437,"depth":1635,"text":179440},{"id":179448,"depth":1635,"text":179451},{"id":179459,"depth":1635,"text":179462},{"id":179470,"depth":1635,"text":179473},{"id":179481,"depth":1629,"text":179484},{"id":179520,"depth":1629,"text":179523,"children":179777},[179778,179779],{"id":165021,"depth":1635,"text":165024},{"id":179552,"depth":1635,"text":179555},{"id":179586,"depth":1629,"text":179589},{"id":95759,"depth":1629,"text":95762},"content:blog:file_storage_api_integration_real_time_files_hierarchies_and_secure_access_across_platforms.md","blog/file_storage_api_integration_real_time_files_hierarchies_and_secure_access_across_platforms.md","blog/file_storage_api_integration_real_time_files_hierarchies_and_secure_access_across_platforms",{"_path":179786,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":179787,"description":179788,"img":179789,"date":179790,"tag":12,"body":179791,"_type":1677,"_id":180961,"_source":1679,"_file":180962,"_stem":180963,"_extension":1682},"/blog/call_center_api_integration_calls_contacts_recordings_and_real_time_voice_activity_across_platforms","Call Center API Integration: Calls, Contacts, Recordings, and Real-Time Voice Activity Across Platforms","Call center systems sit at the moment where customer conversations actually happen. Calls begin and end in real time, agents add notes during or after...","https://s3.us-east-2.amazonaws.com/unified-article-images/call_center_api_integration_calls_contacts_recordings_and_real_time_voice_activity_across_platforms-icon.png","2026-02-10T00:49:00.000Z",{"type":14,"children":179792,"toc":180922},[179793,179798,179801,179808,179813,179821,179826,179832,179884,179889,179912,179917,179940,179952,179958,179974,179978,180001,180013,180019,180024,180073,180078,180084,180089,180093,180103,180109,180114,180138,180150,180156,180161,180165,180170,180188,180193,180197,180202,180220,180225,180229,180234,180252,180257,180261,180266,180284,180289,180295,180306,180339,180351,180368,180373,180379,180385,180389,180426,180431,180437,180476,180481,180485,180490,180494,180517,180522,180528,180533,180561,180566,180572,180578,180583,180589,180594,180600,180605,180611,180616,180622,180627,180633,180638,180666,180671,180677,180681,180704,180710,180736,180742,180775,180781,180786,180796,180812,180817,180833,180838,180841,180845,180853,180858,180866,180871,180879,180884,180892,180897,180905,180910,180917],{"type":17,"tag":18,"props":179794,"children":179796},{"id":179795},"call-center-api-integration-calls-contacts-recordings-and-real-time-voice-activity-across-platforms",[179797],{"type":23,"value":179787},{"type":17,"tag":25,"props":179799,"children":179800},{},[],{"type":17,"tag":29,"props":179802,"children":179803},{},[179804],{"type":17,"tag":33,"props":179805,"children":179806},{},[179807],{"type":23,"value":175199},{"type":17,"tag":29,"props":179809,"children":179810},{},[179811],{"type":23,"value":179812},"Call center systems sit at the moment where customer conversations actually happen. Calls begin and end in real time, agents add notes during or after conversations, recordings are generated asynchronously, and provider rules determine what can be edited, replayed, or accessed later. When call data is stitched together with brittle integrations or delayed sync jobs, teams lose visibility into what actually happened, when it happened, and who was involved.",{"type":17,"tag":29,"props":179814,"children":179815},{},[179816,179820],{"type":17,"tag":133,"props":179817,"children":179818},{"href":30386},[179819],{"type":23,"value":167277},{"type":23,"value":165348},{"type":17,"tag":29,"props":179822,"children":179823},{},[179824],{"type":23,"value":179825},"In this guide, we'll explain what a Call Center (Unified Communications) API actually covers, which objects matter in practice, how call and recording lifecycles behave, how real-time updates are delivered (and where they aren't), and how Unified's Call Center API fits alongside Ticketing, CRM, Messaging, and Marketing within the broader platform.",{"type":17,"tag":68,"props":179827,"children":179829},{"id":179828},"introduction-to-call-center-api-integrations",[179830],{"type":23,"value":179831},"Introduction to Call Center API Integrations",{"type":17,"tag":29,"props":179833,"children":179834},{},[179835,179837,179841,179842,179846,179847,179851,179852,179857,179858,179862,179863,179867,179868,179872,179873,179877,179878,179882],{"type":23,"value":179836},"Call center and unified communications platforms such as ",{"type":17,"tag":48,"props":179838,"children":179839},{},[179840],{"type":23,"value":31531},{"type":23,"value":11826},{"type":17,"tag":48,"props":179843,"children":179844},{},[179845],{"type":23,"value":31540},{"type":23,"value":11826},{"type":17,"tag":48,"props":179848,"children":179849},{},[179850],{"type":23,"value":31550},{"type":23,"value":11826},{"type":17,"tag":48,"props":179853,"children":179854},{},[179855],{"type":23,"value":179856},"Cloudtalk",{"type":23,"value":11826},{"type":17,"tag":48,"props":179859,"children":179860},{},[179861],{"type":23,"value":14150},{"type":23,"value":11826},{"type":17,"tag":48,"props":179864,"children":179865},{},[179866],{"type":23,"value":14066},{"type":23,"value":11826},{"type":17,"tag":48,"props":179869,"children":179870},{},[179871],{"type":23,"value":31559},{"type":23,"value":11826},{"type":17,"tag":48,"props":179874,"children":179875},{},[179876],{"type":23,"value":31572},{"type":23,"value":11826},{"type":17,"tag":48,"props":179879,"children":179880},{},[179881],{"type":23,"value":31581},{"type":23,"value":179883},", and others manage voice communication, call routing, agent activity, and recordings.",{"type":17,"tag":29,"props":179885,"children":179886},{},[179887],{"type":23,"value":179888},"Each provider exposes a different API surface:",{"type":17,"tag":80,"props":179890,"children":179891},{},[179892,179897,179902,179907],{"type":17,"tag":84,"props":179893,"children":179894},{},[179895],{"type":23,"value":179896},"Some platforms treat calls as immutable logs",{"type":17,"tag":84,"props":179898,"children":179899},{},[179900],{"type":23,"value":179901},"Others expose partial update mechanisms through polling",{"type":17,"tag":84,"props":179903,"children":179904},{},[179905],{"type":23,"value":179906},"Recording access is often time-limited",{"type":17,"tag":84,"props":179908,"children":179909},{},[179910],{"type":23,"value":179911},"Webhook support varies widely by object",{"type":17,"tag":29,"props":179913,"children":179914},{},[179915],{"type":23,"value":179916},"Products that need to work across multiple call center platforms quickly run into:",{"type":17,"tag":80,"props":179918,"children":179919},{},[179920,179925,179930,179935],{"type":17,"tag":84,"props":179921,"children":179922},{},[179923],{"type":23,"value":179924},"Inconsistent call and recording schemas",{"type":17,"tag":84,"props":179926,"children":179927},{},[179928],{"type":23,"value":179929},"Uneven webhook and polling support",{"type":17,"tag":84,"props":179931,"children":179932},{},[179933],{"type":23,"value":179934},"Provider-specific retention and expiry rules",{"type":17,"tag":84,"props":179936,"children":179937},{},[179938],{"type":23,"value":179939},"Fragmented agent and contact models",{"type":17,"tag":29,"props":179941,"children":179942},{},[179943,179945,179950],{"type":23,"value":179944},"A Call Center API provides a consistent way to ",{"type":17,"tag":48,"props":179946,"children":179947},{},[179948],{"type":23,"value":179949},"read and write voice-communication data",{"type":23,"value":179951}," across platforms—without building and maintaining separate integrations for each provider.",{"type":17,"tag":68,"props":179953,"children":179955},{"id":179954},"what-is-a-call-center-unified-communications-api",[179956],{"type":23,"value":179957},"What Is a Call Center (Unified Communications) API?",{"type":17,"tag":29,"props":179959,"children":179960},{},[179961,179962,179966,179968,179973],{"type":23,"value":9619},{"type":17,"tag":48,"props":179963,"children":179964},{},[179965],{"type":23,"value":167277},{"type":23,"value":179967}," allows applications to programmatically access and manage ",{"type":17,"tag":48,"props":179969,"children":179970},{},[179971],{"type":23,"value":179972},"voice-call data",{"type":23,"value":54},{"type":17,"tag":29,"props":179975,"children":179976},{},[179977],{"type":23,"value":167214},{"type":17,"tag":80,"props":179979,"children":179980},{},[179981,179986,179991,179996],{"type":17,"tag":84,"props":179982,"children":179983},{},[179984],{"type":23,"value":179985},"Retrieving call logs and call metadata",{"type":17,"tag":84,"props":179987,"children":179988},{},[179989],{"type":23,"value":179990},"Managing phone contacts and directories",{"type":17,"tag":84,"props":179992,"children":179993},{},[179994],{"type":23,"value":179995},"Adding comments or annotations to calls",{"type":17,"tag":84,"props":179997,"children":179998},{},[179999],{"type":23,"value":180000},"Accessing call recordings and voicemail",{"type":17,"tag":29,"props":180002,"children":180003},{},[180004,180006,180011],{"type":23,"value":180005},"Call Center APIs focus exclusively on ",{"type":17,"tag":48,"props":180007,"children":180008},{},[180009],{"type":23,"value":180010},"voice communication and call activity",{"type":23,"value":180012},". They are not responsible for support tickets, chat messages, sales pipelines, or marketing campaigns.",{"type":17,"tag":68,"props":180014,"children":180016},{"id":180015},"call-center-api-vs-ticketing-crm-messaging-and-marketing",[180017],{"type":23,"value":180018},"Call Center API vs Ticketing, CRM, Messaging, and Marketing",{"type":17,"tag":29,"props":180020,"children":180021},{},[180022],{"type":23,"value":180023},"Unified treats Call Center (UC) as its own category, with clear boundaries.",{"type":17,"tag":80,"props":180025,"children":180026},{},[180027,180037,180046,180054,180063],{"type":17,"tag":84,"props":180028,"children":180029},{},[180030,180035],{"type":17,"tag":48,"props":180031,"children":180032},{},[180033],{"type":23,"value":180034},"Call Center APIs",{"type":23,"value":180036}," manage calls, contacts, comments, and recordings.",{"type":17,"tag":84,"props":180038,"children":180039},{},[180040,180044],{"type":17,"tag":48,"props":180041,"children":180042},{},[180043],{"type":23,"value":173008},{"type":23,"value":180045}," manage support issues, tickets, notes, and categories.",{"type":17,"tag":84,"props":180047,"children":180048},{},[180049,180053],{"type":17,"tag":48,"props":180050,"children":180051},{},[180052],{"type":23,"value":173018},{"type":23,"value":178699},{"type":17,"tag":84,"props":180055,"children":180056},{},[180057,180061],{"type":17,"tag":48,"props":180058,"children":180059},{},[180060],{"type":23,"value":173028},{"type":23,"value":180062}," manage chat channels, messages, and events.",{"type":17,"tag":84,"props":180064,"children":180065},{},[180066,180071],{"type":17,"tag":48,"props":180067,"children":180068},{},[180069],{"type":23,"value":180070},"Marketing APIs",{"type":23,"value":180072}," manage audiences, campaigns, and engagement.",{"type":17,"tag":29,"props":180074,"children":180075},{},[180076],{"type":23,"value":180077},"Although call data is often logged into CRM records or used to trigger ticket creation, those relationships are handled explicitly by the application. The Call Center API itself does not own tickets, deals, or conversations outside of voice calls.",{"type":17,"tag":68,"props":180079,"children":180081},{"id":180080},"real-time-vs-polling-in-call-center-systems",[180082],{"type":23,"value":180083},"Real-Time vs Polling in Call Center Systems",{"type":17,"tag":29,"props":180085,"children":180086},{},[180087],{"type":23,"value":180088},"Call center data behaves very differently depending on the object and provider.",{"type":17,"tag":239,"props":180090,"children":180091},{"id":163879},[180092],{"type":23,"value":163882},{"type":17,"tag":29,"props":180094,"children":180095},{},[180096,180098,180102],{"type":23,"value":180097},"Unified's Call Center API routes every request directly to the underlying UC platform. There is no cached replica and no background sync job. Reads always reflect the provider's current state, subject to ",{"type":17,"tag":133,"props":180099,"children":180100},{"href":135},[180101],{"type":23,"value":138},{"type":23,"value":171686},{"type":17,"tag":239,"props":180104,"children":180106},{"id":180105},"event-delivery-is-uneven-by-object",[180107],{"type":23,"value":180108},"Event Delivery Is Uneven by Object",{"type":17,"tag":29,"props":180110,"children":180111},{},[180112],{"type":23,"value":180113},"Voice platforms vary significantly in event support:",{"type":17,"tag":80,"props":180115,"children":180116},{},[180117,180128,180133],{"type":17,"tag":84,"props":180118,"children":180119},{},[180120,180122,180126],{"type":23,"value":180121},"Some providers emit native ",{"type":17,"tag":133,"props":180123,"children":180124},{"href":4999},[180125],{"type":23,"value":5002},{"type":23,"value":180127}," for recordings or contacts",{"type":17,"tag":84,"props":180129,"children":180130},{},[180131],{"type":23,"value":180132},"Many rely on polling behind the scenes (virtual webhooks)",{"type":17,"tag":84,"props":180134,"children":180135},{},[180136],{"type":23,"value":180137},"Some call objects cannot be monitored at all after creation",{"type":17,"tag":29,"props":180139,"children":180140},{},[180141,180143,180148],{"type":23,"value":180142},"Because of this, 'real-time' in call center systems is usually ",{"type":17,"tag":48,"props":180144,"children":180145},{},[180146],{"type":23,"value":180147},"recording-driven",{"type":23,"value":180149},", not call-driven.",{"type":17,"tag":68,"props":180151,"children":180153},{"id":180152},"core-call-center-data-models-and-how-they-behave",[180154],{"type":23,"value":180155},"Core Call Center Data Models (and How They Behave)",{"type":17,"tag":29,"props":180157,"children":180158},{},[180159],{"type":23,"value":180160},"Unified normalizes call-center data into four standardized objects. Provider behavior still varies and should be handled defensively.",{"type":17,"tag":239,"props":180162,"children":180163},{"id":30409},[180164],{"type":23,"value":31624},{"type":17,"tag":29,"props":180166,"children":180167},{},[180168],{"type":23,"value":180169},"Calls represent completed or in-progress voice interactions.",{"type":17,"tag":80,"props":180171,"children":180172},{},[180173,180178,180183],{"type":17,"tag":84,"props":180174,"children":180175},{},[180176],{"type":23,"value":180177},"Read-only across all providers",{"type":17,"tag":84,"props":180179,"children":180180},{},[180181],{"type":23,"value":180182},"Support list and retrieve operations only",{"type":17,"tag":84,"props":180184,"children":180185},{},[180186],{"type":23,"value":180187},"Include phone numbers, start and end timestamps, and agent references",{"type":17,"tag":29,"props":180189,"children":180190},{},[180191],{"type":23,"value":180192},"Calls behave as immutable logs. Once a call ends, its record cannot be edited or removed through the API.",{"type":17,"tag":239,"props":180194,"children":180195},{"id":30404},[180196],{"type":23,"value":31619},{"type":17,"tag":29,"props":180198,"children":180199},{},[180200],{"type":23,"value":180201},"Contacts represent external people involved in calls.",{"type":17,"tag":80,"props":180203,"children":180204},{},[180205,180210,180215],{"type":17,"tag":84,"props":180206,"children":180207},{},[180208],{"type":23,"value":180209},"Support create, update, and delete operations where providers allow",{"type":17,"tag":84,"props":180211,"children":180212},{},[180213],{"type":23,"value":180214},"Store names, company, emails, and phone numbers",{"type":17,"tag":84,"props":180216,"children":180217},{},[180218],{"type":23,"value":180219},"Are scoped to the call center domain, not CRM",{"type":17,"tag":29,"props":180221,"children":180222},{},[180223],{"type":23,"value":180224},"Some providers expose contacts as read-only; others allow full directory management.",{"type":17,"tag":239,"props":180226,"children":180227},{"id":164196},[180228],{"type":23,"value":31629},{"type":17,"tag":29,"props":180230,"children":180231},{},[180232],{"type":23,"value":180233},"Comments represent notes or annotations attached to calls.",{"type":17,"tag":80,"props":180235,"children":180236},{},[180237,180242,180247],{"type":17,"tag":84,"props":180238,"children":180239},{},[180240],{"type":23,"value":180241},"Support create operations broadly",{"type":17,"tag":84,"props":180243,"children":180244},{},[180245],{"type":23,"value":180246},"Update and delete support varies by provider",{"type":17,"tag":84,"props":180248,"children":180249},{},[180250],{"type":23,"value":180251},"Reference both the call and the employee who authored the note",{"type":17,"tag":29,"props":180253,"children":180254},{},[180255],{"type":23,"value":180256},"Comments are often used for agent notes, quality review, or internal context.",{"type":17,"tag":239,"props":180258,"children":180259},{"id":30419},[180260],{"type":23,"value":31634},{"type":17,"tag":29,"props":180262,"children":180263},{},[180264],{"type":23,"value":180265},"Recordings represent call audio or voicemail.",{"type":17,"tag":80,"props":180267,"children":180268},{},[180269,180274,180279],{"type":17,"tag":84,"props":180270,"children":180271},{},[180272],{"type":23,"value":180273},"Usually read-only",{"type":17,"tag":84,"props":180275,"children":180276},{},[180277],{"type":23,"value":180278},"Include access URLs and expiration timestamps",{"type":17,"tag":84,"props":180280,"children":180281},{},[180282],{"type":23,"value":180283},"May expose media metadata and segments",{"type":17,"tag":29,"props":180285,"children":180286},{},[180287],{"type":23,"value":180288},"Recording access is typically time-limited. Providers control expiry and availability.",{"type":17,"tag":68,"props":180290,"children":180292},{"id":180291},"identity-and-ownership-in-call-center-data",[180293],{"type":23,"value":180294},"Identity and Ownership in Call Center Data",{"type":17,"tag":29,"props":180296,"children":180297},{},[180298,180300,180305],{"type":23,"value":180299},"Call Center objects use ",{"type":17,"tag":48,"props":180301,"children":180302},{},[180303],{"type":23,"value":180304},"call-center–specific identities",{"type":23,"value":54},{"type":17,"tag":80,"props":180307,"children":180308},{},[180309,180319,180329],{"type":17,"tag":84,"props":180310,"children":180311},{},[180312,180317],{"type":17,"tag":6121,"props":180313,"children":180315},{"className":180314},[],[180316],{"type":23,"value":12102},{"type":23,"value":180318}," links comments and recordings to a call",{"type":17,"tag":84,"props":180320,"children":180321},{},[180322,180327],{"type":17,"tag":6121,"props":180323,"children":180325},{"className":180324},[],[180326],{"type":23,"value":26302},{"type":23,"value":180328}," references a call-center contact",{"type":17,"tag":84,"props":180330,"children":180331},{},[180332,180337],{"type":17,"tag":6121,"props":180333,"children":180335},{"className":180334},[],[180336],{"type":23,"value":62582},{"type":23,"value":180338}," references an employee from the HR/Directory category",{"type":17,"tag":29,"props":180340,"children":180341},{},[180342,180344,180349],{"type":23,"value":180343},"There are ",{"type":17,"tag":48,"props":180345,"children":180346},{},[180347],{"type":23,"value":180348},"no embedded references",{"type":23,"value":180350}," to:",{"type":17,"tag":80,"props":180352,"children":180353},{},[180354,180359,180364],{"type":17,"tag":84,"props":180355,"children":180356},{},[180357],{"type":23,"value":180358},"Tickets or ticket IDs",{"type":17,"tag":84,"props":180360,"children":180361},{},[180362],{"type":23,"value":180363},"CRM contacts or deals",{"type":17,"tag":84,"props":180365,"children":180366},{},[180367],{"type":23,"value":164676},{"type":17,"tag":29,"props":180369,"children":180370},{},[180371],{"type":23,"value":180372},"Any linkage to CRM or Ticketing must be performed explicitly by the application.",{"type":17,"tag":68,"props":180374,"children":180376},{"id":180375},"updates-events-and-provider-variability",[180377],{"type":23,"value":180378},"Updates, Events, and Provider Variability",{"type":17,"tag":239,"props":180380,"children":180382},{"id":180381},"native-vs-virtual-webhooks",[180383],{"type":23,"value":180384},"Native vs Virtual Webhooks",{"type":17,"tag":29,"props":180386,"children":180387},{},[180388],{"type":23,"value":95391},{"type":17,"tag":80,"props":180390,"children":180391},{},[180392,180401,180410],{"type":17,"tag":84,"props":180393,"children":180394},{},[180395,180399],{"type":17,"tag":48,"props":180396,"children":180397},{},[180398],{"type":23,"value":9024},{"type":23,"value":180400}," when the provider emits events",{"type":17,"tag":84,"props":180402,"children":180403},{},[180404,180408],{"type":17,"tag":48,"props":180405,"children":180406},{},[180407],{"type":23,"value":9256},{"type":23,"value":180409}," when Unified polls provider APIs",{"type":17,"tag":84,"props":180411,"children":180412},{},[180413,180418,180420,180425],{"type":17,"tag":48,"props":180414,"children":180415},{},[180416],{"type":23,"value":180417},"Manual polling",{"type":23,"value":180419}," using list endpoints and ",{"type":17,"tag":6121,"props":180421,"children":180423},{"className":180422},[],[180424],{"type":23,"value":26291},{"type":23,"value":105838},{"type":17,"tag":29,"props":180427,"children":180428},{},[180429],{"type":23,"value":180430},"Virtual webhooks introduce delay based on polling interval. Native webhooks deliver updates immediately but are provider-dependent.",{"type":17,"tag":239,"props":180432,"children":180434},{"id":180433},"object-level-differences",[180435],{"type":23,"value":180436},"Object-Level Differences",{"type":17,"tag":80,"props":180438,"children":180439},{},[180440,180449,180458,180467],{"type":17,"tag":84,"props":180441,"children":180442},{},[180443,180447],{"type":17,"tag":48,"props":180444,"children":180445},{},[180446],{"type":23,"value":31624},{"type":23,"value":180448}," often do not emit events and may not support polling",{"type":17,"tag":84,"props":180450,"children":180451},{},[180452,180456],{"type":17,"tag":48,"props":180453,"children":180454},{},[180455],{"type":23,"value":31634},{"type":23,"value":180457}," are the most reliable source of updates",{"type":17,"tag":84,"props":180459,"children":180460},{},[180461,180465],{"type":17,"tag":48,"props":180462,"children":180463},{},[180464],{"type":23,"value":31619},{"type":23,"value":180466}," frequently support polling and virtual webhooks",{"type":17,"tag":84,"props":180468,"children":180469},{},[180470,180474],{"type":17,"tag":48,"props":180471,"children":180472},{},[180473],{"type":23,"value":31629},{"type":23,"value":180475}," have limited event coverage",{"type":17,"tag":29,"props":180477,"children":180478},{},[180479],{"type":23,"value":180480},"Some providers do not expose list endpoints for calls, which makes polling impossible. In those cases, recording updates become the only signal that a call occurred or ended.",{"type":17,"tag":68,"props":180482,"children":180483},{"id":164849},[180484],{"type":23,"value":164852},{"type":17,"tag":29,"props":180486,"children":180487},{},[180488],{"type":23,"value":180489},"Call center data often includes sensitive personal and operational information. Unified's architecture minimizes exposure.",{"type":17,"tag":239,"props":180491,"children":180492},{"id":90302},[180493],{"type":23,"value":179326},{"type":17,"tag":80,"props":180495,"children":180496},{},[180497,180502,180507,180512],{"type":17,"tag":84,"props":180498,"children":180499},{},[180500],{"type":23,"value":180501},"No call data is stored at rest",{"type":17,"tag":84,"props":180503,"children":180504},{},[180505],{"type":23,"value":180506},"Recording files are accessed via provider-hosted URLs",{"type":17,"tag":84,"props":180508,"children":180509},{},[180510],{"type":23,"value":180511},"No customer payloads are written to logs",{"type":17,"tag":84,"props":180513,"children":180514},{},[180515],{"type":23,"value":180516},"Requests are stateless and region-aware (US, EU, AU)",{"type":17,"tag":29,"props":180518,"children":180519},{},[180520],{"type":23,"value":180521},"If long-term storage is required, applications must persist data themselves.",{"type":17,"tag":239,"props":180523,"children":180525},{"id":180524},"pii-considerations",[180526],{"type":23,"value":180527},"PII Considerations",{"type":17,"tag":29,"props":180529,"children":180530},{},[180531],{"type":23,"value":180532},"Call center payloads may include:",{"type":17,"tag":80,"props":180534,"children":180535},{},[180536,180541,180546,180551,180556],{"type":17,"tag":84,"props":180537,"children":180538},{},[180539],{"type":23,"value":180540},"Names, emails, and phone numbers",{"type":17,"tag":84,"props":180542,"children":180543},{},[180544],{"type":23,"value":180545},"Call timestamps and durations",{"type":17,"tag":84,"props":180547,"children":180548},{},[180549],{"type":23,"value":180550},"Agent identifiers",{"type":17,"tag":84,"props":180552,"children":180553},{},[180554],{"type":23,"value":180555},"Recording URLs and metadata",{"type":17,"tag":84,"props":180557,"children":180558},{},[180559],{"type":23,"value":180560},"Free-text call notes",{"type":17,"tag":29,"props":180562,"children":180563},{},[180564],{"type":23,"value":180565},"Unified passes this data through without persistence. Applications are responsible for downstream access control and compliance.",{"type":17,"tag":68,"props":180567,"children":180569},{"id":180568},"common-call-center-api-integration-use-cases",[180570],{"type":23,"value":180571},"Common Call Center API Integration Use Cases",{"type":17,"tag":239,"props":180573,"children":180575},{"id":180574},"call-analytics-reporting",[180576],{"type":23,"value":180577},"Call Analytics & Reporting",{"type":17,"tag":29,"props":180579,"children":180580},{},[180581],{"type":23,"value":180582},"Aggregate call volume, duration, and agent activity across platforms.",{"type":17,"tag":239,"props":180584,"children":180586},{"id":180585},"crm-call-logging",[180587],{"type":23,"value":180588},"CRM Call Logging",{"type":17,"tag":29,"props":180590,"children":180591},{},[180592],{"type":23,"value":180593},"Attach call records and recordings to CRM contacts or deals.",{"type":17,"tag":239,"props":180595,"children":180597},{"id":180596},"call-recording-analysis",[180598],{"type":23,"value":180599},"Call Recording Analysis",{"type":17,"tag":29,"props":180601,"children":180602},{},[180603],{"type":23,"value":180604},"Feed recordings into transcription, sentiment analysis, or QA workflows.",{"type":17,"tag":239,"props":180606,"children":180608},{"id":180607},"agent-productivity-tools",[180609],{"type":23,"value":180610},"Agent Productivity Tools",{"type":17,"tag":29,"props":180612,"children":180613},{},[180614],{"type":23,"value":180615},"Build dashboards for agent performance, activity, and call outcomes.",{"type":17,"tag":239,"props":180617,"children":180619},{"id":180618},"ai-call-intelligence",[180620],{"type":23,"value":180621},"AI Call Intelligence",{"type":17,"tag":29,"props":180623,"children":180624},{},[180625],{"type":23,"value":180626},"Analyze call patterns and recordings to surface insights and recommendations.",{"type":17,"tag":68,"props":180628,"children":180630},{"id":180629},"constraints-to-plan-for",[180631],{"type":23,"value":180632},"Constraints to Plan For",{"type":17,"tag":29,"props":180634,"children":180635},{},[180636],{"type":23,"value":180637},"Call center platforms impose real-world limits:",{"type":17,"tag":80,"props":180639,"children":180640},{},[180641,180646,180651,180656,180661],{"type":17,"tag":84,"props":180642,"children":180643},{},[180644],{"type":23,"value":180645},"Calls are immutable after completion",{"type":17,"tag":84,"props":180647,"children":180648},{},[180649],{"type":23,"value":180650},"Recording access may expire",{"type":17,"tag":84,"props":180652,"children":180653},{},[180654],{"type":23,"value":180655},"Event coverage is inconsistent",{"type":17,"tag":84,"props":180657,"children":180658},{},[180659],{"type":23,"value":180660},"Write support varies by provider",{"type":17,"tag":84,"props":180662,"children":180663},{},[180664],{"type":23,"value":180665},"Polling is not always possible",{"type":17,"tag":29,"props":180667,"children":180668},{},[180669],{"type":23,"value":180670},"These are provider constraints, not platform limitations.",{"type":17,"tag":68,"props":180672,"children":180674},{"id":180673},"build-vs-maintain-call-center-integrations",[180675],{"type":23,"value":180676},"Build vs Maintain Call Center Integrations",{"type":17,"tag":239,"props":180678,"children":180679},{"id":165021},[180680],{"type":23,"value":165024},{"type":17,"tag":80,"props":180682,"children":180683},{},[180684,180689,180694,180699],{"type":17,"tag":84,"props":180685,"children":180686},{},[180687],{"type":23,"value":180688},"Multiple UC APIs to maintain",{"type":17,"tag":84,"props":180690,"children":180691},{},[180692],{"type":23,"value":180693},"Inconsistent call and recording models",{"type":17,"tag":84,"props":180695,"children":180696},{},[180697],{"type":23,"value":180698},"Provider-specific webhook logic",{"type":17,"tag":84,"props":180700,"children":180701},{},[180702],{"type":23,"value":180703},"Ongoing maintenance as vendors evolve",{"type":17,"tag":239,"props":180705,"children":180707},{"id":180706},"using-a-unified-call-center-api",[180708],{"type":23,"value":180709},"Using a Unified Call Center API",{"type":17,"tag":80,"props":180711,"children":180712},{},[180713,180718,180722,180727,180732],{"type":17,"tag":84,"props":180714,"children":180715},{},[180716],{"type":23,"value":180717},"One normalized UC surface",{"type":17,"tag":84,"props":180719,"children":180720},{},[180721],{"type":23,"value":165071},{"type":17,"tag":84,"props":180723,"children":180724},{},[180725],{"type":23,"value":180726},"Standardized call, contact, comment, and recording objects",{"type":17,"tag":84,"props":180728,"children":180729},{},[180730],{"type":23,"value":180731},"Centralized authentication and maintenance",{"type":17,"tag":84,"props":180733,"children":180734},{},[180735],{"type":23,"value":137967},{"type":17,"tag":68,"props":180737,"children":180739},{"id":180738},"best-practices-for-call-center-integrations",[180740],{"type":23,"value":180741},"Best Practices for Call Center Integrations",{"type":17,"tag":80,"props":180743,"children":180744},{},[180745,180750,180755,180760,180765,180770],{"type":17,"tag":84,"props":180746,"children":180747},{},[180748],{"type":23,"value":180749},"Treat calls as immutable logs",{"type":17,"tag":84,"props":180751,"children":180752},{},[180753],{"type":23,"value":180754},"Use recordings as the primary update signal",{"type":17,"tag":84,"props":180756,"children":180757},{},[180758],{"type":23,"value":180759},"Expect provider variability",{"type":17,"tag":84,"props":180761,"children":180762},{},[180763],{"type":23,"value":180764},"Do not assume webhook coverage",{"type":17,"tag":84,"props":180766,"children":180767},{},[180768],{"type":23,"value":180769},"Keep Call Center distinct from Ticketing and Messaging",{"type":17,"tag":84,"props":180771,"children":180772},{},[180773],{"type":23,"value":180774},"Plan for recording expiry",{"type":17,"tag":68,"props":180776,"children":180778},{"id":180777},"build-call-center-integrations-with-realistic-expectations",[180779],{"type":23,"value":180780},"Build call center integrations with realistic expectations",{"type":17,"tag":29,"props":180782,"children":180783},{},[180784],{"type":23,"value":180785},"Voice systems are inherently uneven because providers are uneven.",{"type":17,"tag":29,"props":180787,"children":180788},{},[180789,180790,180794],{"type":23,"value":25244},{"type":17,"tag":48,"props":180791,"children":180792},{},[180793],{"type":23,"value":167277},{"type":23,"value":180795}," provides a normalized way to access calls, contacts, comments, and recordings across UC platforms—without storing call data or collapsing category boundaries.",{"type":17,"tag":29,"props":180797,"children":180798},{},[180799,180803,180804],{"type":17,"tag":48,"props":180800,"children":180801},{},[180802],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":180805,"children":180807},{"href":1612,"rel":180806},[214],[180808],{"type":17,"tag":48,"props":180809,"children":180810},{},[180811],{"type":23,"value":1616},{"type":17,"tag":29,"props":180813,"children":180814},{},[180815],{"type":23,"value":180816},"Test call center integrations with live provider data.",{"type":17,"tag":29,"props":180818,"children":180819},{},[180820,180824,180825],{"type":17,"tag":48,"props":180821,"children":180822},{},[180823],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":180826,"children":180828},{"href":1623,"rel":180827},[214],[180829],{"type":17,"tag":48,"props":180830,"children":180831},{},[180832],{"type":23,"value":1627},{"type":17,"tag":29,"props":180834,"children":180835},{},[180836],{"type":23,"value":180837},"Walk through call center, ticketing, CRM, or cross-category workflows with the team that built the platform.",{"type":17,"tag":25,"props":180839,"children":180840},{},[],{"type":17,"tag":68,"props":180842,"children":180843},{"id":95759},[180844],{"type":23,"value":95762},{"type":17,"tag":29,"props":180846,"children":180847},{},[180848],{"type":17,"tag":48,"props":180849,"children":180850},{},[180851],{"type":23,"value":180852},"What is a Call Center API?",{"type":17,"tag":29,"props":180854,"children":180855},{},[180856],{"type":23,"value":180857},"An API that exposes voice-call data such as calls, contacts, comments, and recordings programmatically.",{"type":17,"tag":29,"props":180859,"children":180860},{},[180861],{"type":17,"tag":48,"props":180862,"children":180863},{},[180864],{"type":23,"value":180865},"Does the Call Center API manage tickets?",{"type":17,"tag":29,"props":180867,"children":180868},{},[180869],{"type":23,"value":180870},"No. Tickets belong to the Ticketing API.",{"type":17,"tag":29,"props":180872,"children":180873},{},[180874],{"type":17,"tag":48,"props":180875,"children":180876},{},[180877],{"type":23,"value":180878},"Are call updates real time?",{"type":17,"tag":29,"props":180880,"children":180881},{},[180882],{"type":23,"value":180883},"Recording updates may be delivered via native or virtual webhooks. Call objects are often read-only.",{"type":17,"tag":29,"props":180885,"children":180886},{},[180887],{"type":17,"tag":48,"props":180888,"children":180889},{},[180890],{"type":23,"value":180891},"Can I access call recordings?",{"type":17,"tag":29,"props":180893,"children":180894},{},[180895],{"type":23,"value":180896},"Yes, subject to provider access rules and expiration.",{"type":17,"tag":29,"props":180898,"children":180899},{},[180900],{"type":17,"tag":48,"props":180901,"children":180902},{},[180903],{"type":23,"value":180904},"Does the Call Center API store call data?",{"type":17,"tag":29,"props":180906,"children":180907},{},[180908],{"type":23,"value":180909},"No. Call data is not stored at rest.",{"type":17,"tag":29,"props":180911,"children":180912},{},[180913],{"type":17,"tag":48,"props":180914,"children":180915},{},[180916],{"type":23,"value":165175},{"type":17,"tag":29,"props":180918,"children":180919},{},[180920],{"type":23,"value":180921},"Unified supports platforms including 8x8, Aircall, Dialpad, Cloudtalk, RingCentral, Microsoft Teams, Gong, and others.",{"title":7,"searchDepth":1629,"depth":1629,"links":180923},[180924,180925,180926,180927,180931,180937,180938,180942,180946,180953,180954,180958,180959,180960],{"id":179828,"depth":1629,"text":179831},{"id":179954,"depth":1629,"text":179957},{"id":180015,"depth":1629,"text":180018},{"id":180080,"depth":1629,"text":180083,"children":180928},[180929,180930],{"id":163879,"depth":1635,"text":163882},{"id":180105,"depth":1635,"text":180108},{"id":180152,"depth":1629,"text":180155,"children":180932},[180933,180934,180935,180936],{"id":30409,"depth":1635,"text":31624},{"id":30404,"depth":1635,"text":31619},{"id":164196,"depth":1635,"text":31629},{"id":30419,"depth":1635,"text":31634},{"id":180291,"depth":1629,"text":180294},{"id":180375,"depth":1629,"text":180378,"children":180939},[180940,180941],{"id":180381,"depth":1635,"text":180384},{"id":180433,"depth":1635,"text":180436},{"id":164849,"depth":1629,"text":164852,"children":180943},[180944,180945],{"id":90302,"depth":1635,"text":179326},{"id":180524,"depth":1635,"text":180527},{"id":180568,"depth":1629,"text":180571,"children":180947},[180948,180949,180950,180951,180952],{"id":180574,"depth":1635,"text":180577},{"id":180585,"depth":1635,"text":180588},{"id":180596,"depth":1635,"text":180599},{"id":180607,"depth":1635,"text":180610},{"id":180618,"depth":1635,"text":180621},{"id":180629,"depth":1629,"text":180632},{"id":180673,"depth":1629,"text":180676,"children":180955},[180956,180957],{"id":165021,"depth":1635,"text":165024},{"id":180706,"depth":1635,"text":180709},{"id":180738,"depth":1629,"text":180741},{"id":180777,"depth":1629,"text":180780},{"id":95759,"depth":1629,"text":95762},"content:blog:call_center_api_integration_calls_contacts_recordings_and_real_time_voice_activity_across_platforms.md","blog/call_center_api_integration_calls_contacts_recordings_and_real_time_voice_activity_across_platforms.md","blog/call_center_api_integration_calls_contacts_recordings_and_real_time_voice_activity_across_platforms",{"_path":180965,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":180966,"description":180967,"img":180968,"date":180969,"tag":12,"body":180970,"_type":1677,"_id":182005,"_source":1679,"_file":182006,"_stem":182007,"_extension":1682},"/blog/what_is_retrieval_augmented_generation_rag_and_why_most_implementations_break_in_production","What Is Retrieval-Augmented Generation (RAG) — And Why Most Implementations Break in Production","Retrieval-augmented generation (RAG) is often described as a simple pattern, embed your data, store it in a vector database, retrieve the most similar chunks,...","https://s3.us-east-2.amazonaws.com/unified-article-images/what_is_retrieval_augmented_generation_rag_and_why_most_implementations_break_in_production-icon.png","2026-02-10T00:42:00.000Z",{"type":14,"children":180971,"toc":181984},[180972,180977,180980,180987,180996,181001,181024,181029,181035,181045,181058,181063,181074,181079,181097,181102,181112,181118,181123,181128,181133,181156,181161,181184,181189,181198,181202,181208,181219,181225,181230,181237,181250,181257,181275,181281,181286,181293,181306,181313,181326,181332,181337,181342,181351,181357,181362,181367,181390,181395,181400,181409,181415,181420,181426,181444,181450,181473,181478,181487,181493,181498,181503,181521,181526,181531,181540,181546,181551,181559,181577,181585,181603,181608,181617,181623,181628,181633,181638,181661,181666,181671,181677,181682,181687,181710,181715,181723,181751,181756,181764,181787,181798,181806,181829,181834,181843,181849,181854,181859,181864,181892,181897,181910,181923,181926,181932,181940,181945,181953,181958,181966,181971,181979],{"type":17,"tag":18,"props":180973,"children":180975},{"id":180974},"what-is-retrieval-augmented-generation-rag-and-why-most-implementations-break-in-production",[180976],{"type":23,"value":180966},{"type":17,"tag":25,"props":180978,"children":180979},{},[],{"type":17,"tag":29,"props":180981,"children":180982},{},[180983],{"type":17,"tag":33,"props":180984,"children":180985},{},[180986],{"type":23,"value":175199},{"type":17,"tag":29,"props":180988,"children":180989},{},[180990,180994],{"type":17,"tag":133,"props":180991,"children":180992},{"href":77021},[180993],{"type":23,"value":137991},{"type":23,"value":180995}," (RAG) is often described as a simple pattern: embed your data, store it in a vector database, retrieve the most similar chunks, and pass them to a language model.",{"type":17,"tag":29,"props":180997,"children":180998},{},[180999],{"type":23,"value":181000},"That framing works for demos. It breaks down in production.",{"type":17,"tag":29,"props":181002,"children":181003},{},[181004,181006,181011,181012,181017,181018,181023],{"type":23,"value":181005},"In real B2B SaaS products, RAG is not a shortcut to better answers. It is an architectural decision about ",{"type":17,"tag":48,"props":181007,"children":181008},{},[181009],{"type":23,"value":181010},"how context is retrieved",{"type":23,"value":11826},{"type":17,"tag":48,"props":181013,"children":181014},{},[181015],{"type":23,"value":181016},"when it is retrieved",{"type":23,"value":12561},{"type":17,"tag":48,"props":181019,"children":181020},{},[181021],{"type":23,"value":181022},"whether that context is correct for the user requesting it",{"type":23,"value":54},{"type":17,"tag":29,"props":181025,"children":181026},{},[181027],{"type":23,"value":181028},"This article defines what RAG actually is, explains why many implementations fail in production, and outlines the architectural choices that matter when building AI features on top of real SaaS data.",{"type":17,"tag":68,"props":181030,"children":181032},{"id":181031},"what-is-retrieval-augmented-generation-rag",[181033],{"type":23,"value":181034},"What Is Retrieval-Augmented Generation (RAG)?",{"type":17,"tag":29,"props":181036,"children":181037},{},[181038,181043],{"type":17,"tag":48,"props":181039,"children":181040},{},[181041],{"type":23,"value":181042},"Retrieval-augmented generation (RAG)",{"type":23,"value":181044}," is an architecture that combines:",{"type":17,"tag":80,"props":181046,"children":181047},{},[181048,181053],{"type":17,"tag":84,"props":181049,"children":181050},{},[181051],{"type":23,"value":181052},"A generative model, which contains parametric knowledge learned during training",{"type":17,"tag":84,"props":181054,"children":181055},{},[181056],{"type":23,"value":181057},"An external retrieval mechanism, which supplies non-parametric context at request time",{"type":17,"tag":29,"props":181059,"children":181060},{},[181061],{"type":23,"value":181062},"Instead of relying solely on what a model 'knows,' RAG retrieves relevant external information and uses it as context when generating a response.",{"type":17,"tag":29,"props":181064,"children":181065},{},[181066,181068,181073],{"type":23,"value":181067},"The defining characteristic of RAG is ",{"type":17,"tag":48,"props":181069,"children":181070},{},[181071],{"type":23,"value":181072},"retrieval",{"type":23,"value":54},{"type":17,"tag":29,"props":181075,"children":181076},{},[181077],{"type":23,"value":181078},"RAG is not:",{"type":17,"tag":80,"props":181080,"children":181081},{},[181082,181087,181092],{"type":17,"tag":84,"props":181083,"children":181084},{},[181085],{"type":23,"value":181086},"Fine-tuning (which changes model behavior)",{"type":17,"tag":84,"props":181088,"children":181089},{},[181090],{"type":23,"value":181091},"Prompt stuffing (which manually injects context)",{"type":17,"tag":84,"props":181093,"children":181094},{},[181095],{"type":23,"value":181096},"A database replacement",{"type":17,"tag":29,"props":181098,"children":181099},{},[181100],{"type":23,"value":181101},"If a system cannot retrieve external context dynamically, it is not practicing retrieval-augmented generation.",{"type":17,"tag":29,"props":181103,"children":181104},{},[181105,181110],{"type":17,"tag":48,"props":181106,"children":181107},{},[181108],{"type":23,"value":181109},"Key takeaway:",{"type":23,"value":181111}," RAG is defined by retrieval, not by embeddings, vector databases, or frameworks.",{"type":17,"tag":68,"props":181113,"children":181115},{"id":181114},"rag-is-a-retrieval-problem-not-a-vector-database-problem",[181116],{"type":23,"value":181117},"RAG Is a Retrieval Problem, Not a Vector Database Problem",{"type":17,"tag":29,"props":181119,"children":181120},{},[181121],{"type":23,"value":181122},"Many discussions of RAG start with vector databases. That focus is understandable, but incomplete.",{"type":17,"tag":29,"props":181124,"children":181125},{},[181126],{"type":23,"value":181127},"Vector databases are one way to implement retrieval. They are not the definition of retrieval.",{"type":17,"tag":29,"props":181129,"children":181130},{},[181131],{"type":23,"value":181132},"In production SaaS environments, retrieval must work across:",{"type":17,"tag":80,"props":181134,"children":181135},{},[181136,181141,181146,181151],{"type":17,"tag":84,"props":181137,"children":181138},{},[181139],{"type":23,"value":181140},"Unstructured content such as documents and notes",{"type":17,"tag":84,"props":181142,"children":181143},{},[181144],{"type":23,"value":181145},"Structured records such as tickets, deals, or users",{"type":17,"tag":84,"props":181147,"children":181148},{},[181149],{"type":23,"value":181150},"Time-sensitive state such as status changes",{"type":17,"tag":84,"props":181152,"children":181153},{},[181154],{"type":23,"value":181155},"Authorization-scoped data that varies by user",{"type":17,"tag":29,"props":181157,"children":181158},{},[181159],{"type":23,"value":181160},"Treating RAG as 'semantic search plus a language model' hides the hardest problems:",{"type":17,"tag":80,"props":181162,"children":181163},{},[181164,181169,181174,181179],{"type":17,"tag":84,"props":181165,"children":181166},{},[181167],{"type":23,"value":181168},"What data should be retrieved",{"type":17,"tag":84,"props":181170,"children":181171},{},[181172],{"type":23,"value":181173},"Whether that data is still valid",{"type":17,"tag":84,"props":181175,"children":181176},{},[181177],{"type":23,"value":181178},"Whether the user is authorized to see it",{"type":17,"tag":84,"props":181180,"children":181181},{},[181182],{"type":23,"value":181183},"Whether the data reflects current state",{"type":17,"tag":29,"props":181185,"children":181186},{},[181187],{"type":23,"value":181188},"Most RAG failures originate in retrieval design, not in generation quality.",{"type":17,"tag":29,"props":181190,"children":181191},{},[181192,181196],{"type":17,"tag":48,"props":181193,"children":181194},{},[181195],{"type":23,"value":181109},{"type":23,"value":181197}," When RAG fails in production, retrieval is usually the root cause.",{"type":17,"tag":11616,"props":181199,"children":181201},{"width":11618,"height":11619,"src":181200,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/4bN8GObU7e4",[],{"type":17,"tag":68,"props":181203,"children":181205},{"id":181204},"index-time-vs-query-time-retrieval-in-rag-architecture",[181206],{"type":23,"value":181207},"Index-Time vs Query-Time Retrieval in RAG Architecture",{"type":17,"tag":29,"props":181209,"children":181210},{},[181211,181213,181218],{"type":23,"value":181212},"One of the first architectural decisions in a RAG system is ",{"type":17,"tag":48,"props":181214,"children":181215},{},[181216],{"type":23,"value":181217},"when retrieval happens",{"type":23,"value":54},{"type":17,"tag":239,"props":181220,"children":181222},{"id":181221},"index-time-retrieval",[181223],{"type":23,"value":181224},"Index-Time Retrieval",{"type":17,"tag":29,"props":181226,"children":181227},{},[181228],{"type":23,"value":181229},"Data is processed, embedded, and stored ahead of time.",{"type":17,"tag":29,"props":181231,"children":181232},{},[181233],{"type":17,"tag":48,"props":181234,"children":181235},{},[181236],{"type":23,"value":43788},{"type":17,"tag":80,"props":181238,"children":181239},{},[181240,181245],{"type":17,"tag":84,"props":181241,"children":181242},{},[181243],{"type":23,"value":181244},"Fast lookups",{"type":17,"tag":84,"props":181246,"children":181247},{},[181248],{"type":23,"value":181249},"Works well for static or slow-changing content",{"type":17,"tag":29,"props":181251,"children":181252},{},[181253],{"type":17,"tag":48,"props":181254,"children":181255},{},[181256],{"type":23,"value":440},{"type":17,"tag":80,"props":181258,"children":181259},{},[181260,181265,181270],{"type":17,"tag":84,"props":181261,"children":181262},{},[181263],{"type":23,"value":181264},"Becomes stale",{"type":17,"tag":84,"props":181266,"children":181267},{},[181268],{"type":23,"value":181269},"Requires re-indexing",{"type":17,"tag":84,"props":181271,"children":181272},{},[181273],{"type":23,"value":181274},"Difficult to reconcile with changing permissions or state",{"type":17,"tag":239,"props":181276,"children":181278},{"id":181277},"query-time-retrieval",[181279],{"type":23,"value":181280},"Query-Time Retrieval",{"type":17,"tag":29,"props":181282,"children":181283},{},[181284],{"type":23,"value":181285},"Data is retrieved on demand when a request is made.",{"type":17,"tag":29,"props":181287,"children":181288},{},[181289],{"type":17,"tag":48,"props":181290,"children":181291},{},[181292],{"type":23,"value":43788},{"type":17,"tag":80,"props":181294,"children":181295},{},[181296,181301],{"type":17,"tag":84,"props":181297,"children":181298},{},[181299],{"type":23,"value":181300},"Reflects current state",{"type":17,"tag":84,"props":181302,"children":181303},{},[181304],{"type":23,"value":181305},"Better suited for operational SaaS data",{"type":17,"tag":29,"props":181307,"children":181308},{},[181309],{"type":17,"tag":48,"props":181310,"children":181311},{},[181312],{"type":23,"value":440},{"type":17,"tag":80,"props":181314,"children":181315},{},[181316,181321],{"type":17,"tag":84,"props":181317,"children":181318},{},[181319],{"type":23,"value":181320},"Higher latency",{"type":17,"tag":84,"props":181322,"children":181323},{},[181324],{"type":23,"value":181325},"Requires careful authorization handling",{"type":17,"tag":239,"props":181327,"children":181329},{"id":181328},"hybrid-approaches",[181330],{"type":23,"value":181331},"Hybrid Approaches",{"type":17,"tag":29,"props":181333,"children":181334},{},[181335],{"type":23,"value":181336},"Many production systems combine both approaches, indexing static content while retrieving dynamic data on demand.",{"type":17,"tag":29,"props":181338,"children":181339},{},[181340],{"type":23,"value":181341},"This can work, but only when boundaries are explicit.",{"type":17,"tag":29,"props":181343,"children":181344},{},[181345,181349],{"type":17,"tag":48,"props":181346,"children":181347},{},[181348],{"type":23,"value":181109},{"type":23,"value":181350}," Retrieval timing should be chosen for correctness, not convenience.",{"type":17,"tag":68,"props":181352,"children":181354},{"id":181353},"why-stale-data-breaks-rag-in-production",[181355],{"type":23,"value":181356},"Why Stale Data Breaks RAG in Production",{"type":17,"tag":29,"props":181358,"children":181359},{},[181360],{"type":23,"value":181361},"Stale data is not a minor issue. It is a correctness issue.",{"type":17,"tag":29,"props":181363,"children":181364},{},[181365],{"type":23,"value":181366},"When data is embedded and stored, it represents a snapshot in time. In SaaS environments, that snapshot can become invalid quickly due to:",{"type":17,"tag":80,"props":181368,"children":181369},{},[181370,181375,181380,181385],{"type":17,"tag":84,"props":181371,"children":181372},{},[181373],{"type":23,"value":181374},"Record updates",{"type":17,"tag":84,"props":181376,"children":181377},{},[181378],{"type":23,"value":181379},"State changes",{"type":17,"tag":84,"props":181381,"children":181382},{},[181383],{"type":23,"value":181384},"Permission changes",{"type":17,"tag":84,"props":181386,"children":181387},{},[181388],{"type":23,"value":181389},"Deletions or reassignments",{"type":17,"tag":29,"props":181391,"children":181392},{},[181393],{"type":23,"value":181394},"A language model has no way to detect stale context. The result is a response that sounds correct but is wrong.",{"type":17,"tag":29,"props":181396,"children":181397},{},[181398],{"type":23,"value":181399},"Re-embedding data more frequently helps, but does not eliminate the problem. Detecting changes, reprocessing content, and maintaining alignment introduces lag and operational overhead.",{"type":17,"tag":29,"props":181401,"children":181402},{},[181403,181407],{"type":17,"tag":48,"props":181404,"children":181405},{},[181406],{"type":23,"value":181109},{"type":23,"value":181408}," If a RAG system cannot account for data freshness, it cannot guarantee correct answers.",{"type":17,"tag":68,"props":181410,"children":181412},{"id":181411},"where-embeddings-help-and-where-they-dont",[181413],{"type":23,"value":181414},"Where Embeddings Help — And Where They Don't",{"type":17,"tag":29,"props":181416,"children":181417},{},[181418],{"type":23,"value":181419},"Embeddings are a powerful retrieval tool, but they are not universal.",{"type":17,"tag":239,"props":181421,"children":181423},{"id":181422},"where-embeddings-work-well",[181424],{"type":23,"value":181425},"Where embeddings work well",{"type":17,"tag":80,"props":181427,"children":181428},{},[181429,181434,181439],{"type":17,"tag":84,"props":181430,"children":181431},{},[181432],{"type":23,"value":181433},"Semantic similarity",{"type":17,"tag":84,"props":181435,"children":181436},{},[181437],{"type":23,"value":181438},"Natural language variation",{"type":17,"tag":84,"props":181440,"children":181441},{},[181442],{"type":23,"value":181443},"Unstructured text such as documents or notes",{"type":17,"tag":239,"props":181445,"children":181447},{"id":181446},"where-embeddings-struggle",[181448],{"type":23,"value":181449},"Where embeddings struggle",{"type":17,"tag":80,"props":181451,"children":181452},{},[181453,181458,181463,181468],{"type":17,"tag":84,"props":181454,"children":181455},{},[181456],{"type":23,"value":181457},"Exact values",{"type":17,"tag":84,"props":181459,"children":181460},{},[181461],{"type":23,"value":181462},"Relationships between records",{"type":17,"tag":84,"props":181464,"children":181465},{},[181466],{"type":23,"value":181467},"Time-sensitive state",{"type":17,"tag":84,"props":181469,"children":181470},{},[181471],{"type":23,"value":181472},"User-specific authorization",{"type":17,"tag":29,"props":181474,"children":181475},{},[181476],{"type":23,"value":181477},"Embeddings do not encode whether information is current or valid for a specific user.",{"type":17,"tag":29,"props":181479,"children":181480},{},[181481,181485],{"type":17,"tag":48,"props":181482,"children":181483},{},[181484],{"type":23,"value":181109},{"type":23,"value":181486}," Embeddings are one retrieval mechanism, not a complete retrieval strategy.",{"type":17,"tag":68,"props":181488,"children":181490},{"id":181489},"up-to-date-data-vs-real-time-retrieval",[181491],{"type":23,"value":181492},"'Up-to-Date' Data vs Real-Time Retrieval",{"type":17,"tag":29,"props":181494,"children":181495},{},[181496],{"type":23,"value":181497},"The phrase 'up-to-date data' is ambiguous.",{"type":17,"tag":29,"props":181499,"children":181500},{},[181501],{"type":23,"value":181502},"In practice, it often means:",{"type":17,"tag":80,"props":181504,"children":181505},{},[181506,181511,181516],{"type":17,"tag":84,"props":181507,"children":181508},{},[181509],{"type":23,"value":181510},"Periodic refresh",{"type":17,"tag":84,"props":181512,"children":181513},{},[181514],{"type":23,"value":181515},"Eventual consistency",{"type":17,"tag":84,"props":181517,"children":181518},{},[181519],{"type":23,"value":181520},"Data that may be minutes or hours old",{"type":17,"tag":29,"props":181522,"children":181523},{},[181524],{"type":23,"value":181525},"Real-time retrieval means data is fetched when the request is made and reflects current state.",{"type":17,"tag":29,"props":181527,"children":181528},{},[181529],{"type":23,"value":181530},"This distinction matters for AI features used in decision-making or automation, where outdated context can lead to incorrect outcomes.",{"type":17,"tag":29,"props":181532,"children":181533},{},[181534,181538],{"type":17,"tag":48,"props":181535,"children":181536},{},[181537],{"type":23,"value":181109},{"type":23,"value":181539}," Near real-time data may be sufficient for analytics, but not always for AI-driven decisions.",{"type":17,"tag":68,"props":181541,"children":181543},{"id":181542},"rag-vs-fine-tuning-different-tools-for-different-problems",[181544],{"type":23,"value":181545},"RAG vs Fine-Tuning: Different Tools for Different Problems",{"type":17,"tag":29,"props":181547,"children":181548},{},[181549],{"type":23,"value":181550},"RAG and fine-tuning solve different problems.",{"type":17,"tag":29,"props":181552,"children":181553},{},[181554],{"type":17,"tag":48,"props":181555,"children":181556},{},[181557],{"type":23,"value":181558},"Fine-tuning is effective for:",{"type":17,"tag":80,"props":181560,"children":181561},{},[181562,181567,181572],{"type":17,"tag":84,"props":181563,"children":181564},{},[181565],{"type":23,"value":181566},"Behavioral alignment",{"type":17,"tag":84,"props":181568,"children":181569},{},[181570],{"type":23,"value":181571},"Tone and style",{"type":17,"tag":84,"props":181573,"children":181574},{},[181575],{"type":23,"value":181576},"Domain-specific reasoning",{"type":17,"tag":29,"props":181578,"children":181579},{},[181580],{"type":17,"tag":48,"props":181581,"children":181582},{},[181583],{"type":23,"value":181584},"RAG is effective for:",{"type":17,"tag":80,"props":181586,"children":181587},{},[181588,181593,181598],{"type":17,"tag":84,"props":181589,"children":181590},{},[181591],{"type":23,"value":181592},"Accessing current data",{"type":17,"tag":84,"props":181594,"children":181595},{},[181596],{"type":23,"value":181597},"User-specific context",{"type":17,"tag":84,"props":181599,"children":181600},{},[181601],{"type":23,"value":181602},"Private or changing information",{"type":17,"tag":29,"props":181604,"children":181605},{},[181606],{"type":23,"value":181607},"Most production systems use both: fine-tuning to shape behavior, retrieval to supply knowledge and state.",{"type":17,"tag":29,"props":181609,"children":181610},{},[181611,181615],{"type":17,"tag":48,"props":181612,"children":181613},{},[181614],{"type":23,"value":181109},{"type":23,"value":181616}," RAG and fine-tuning are complementary, not interchangeable.",{"type":17,"tag":68,"props":181618,"children":181620},{"id":181619},"why-this-matters-for-b2b-saas-teams",[181621],{"type":23,"value":181622},"Why This Matters for B2B SaaS Teams",{"type":17,"tag":29,"props":181624,"children":181625},{},[181626],{"type":23,"value":181627},"B2B SaaS products operate on real, permission-scoped data. AI features are judged on correctness, reliability, and trust — not novelty.",{"type":17,"tag":29,"props":181629,"children":181630},{},[181631],{"type":23,"value":181632},"In this environment, retrieval-augmented generation is not a prompt design exercise. It is an infrastructure decision.",{"type":17,"tag":29,"props":181634,"children":181635},{},[181636],{"type":23,"value":181637},"Retrieval choices determine:",{"type":17,"tag":80,"props":181639,"children":181640},{},[181641,181646,181651,181656],{"type":17,"tag":84,"props":181642,"children":181643},{},[181644],{"type":23,"value":181645},"Whether answers reflect current reality",{"type":17,"tag":84,"props":181647,"children":181648},{},[181649],{"type":23,"value":181650},"Whether authorization boundaries are respected",{"type":17,"tag":84,"props":181652,"children":181653},{},[181654],{"type":23,"value":181655},"Whether automation is safe to run",{"type":17,"tag":84,"props":181657,"children":181658},{},[181659],{"type":23,"value":181660},"Whether users trust AI-powered features",{"type":17,"tag":29,"props":181662,"children":181663},{},[181664],{"type":23,"value":181665},"Many issues described as 'hallucinations' are actually retrieval failures: stale context, incomplete data, or incorrect access assumptions.",{"type":17,"tag":29,"props":181667,"children":181668},{},[181669],{"type":23,"value":181670},"Teams that treat RAG as a retrieval architecture — rather than a vector database feature — are better positioned to ship AI features that hold up in production.",{"type":17,"tag":68,"props":181672,"children":181674},{"id":181673},"how-these-rag-principles-show-up-in-real-saas-architectures",[181675],{"type":23,"value":181676},"How These RAG Principles Show Up in Real SaaS Architectures",{"type":17,"tag":29,"props":181678,"children":181679},{},[181680],{"type":23,"value":181681},"Understanding RAG as a retrieval problem has practical consequences for how SaaS teams design their infrastructure.",{"type":17,"tag":29,"props":181683,"children":181684},{},[181685],{"type":23,"value":181686},"In production environments, teams often need to retrieve context from multiple categories of SaaS data, including:",{"type":17,"tag":80,"props":181688,"children":181689},{},[181690,181695,181700,181705],{"type":17,"tag":84,"props":181691,"children":181692},{},[181693],{"type":23,"value":181694},"Files and knowledge pages",{"type":17,"tag":84,"props":181696,"children":181697},{},[181698],{"type":23,"value":181699},"Tickets and conversations",{"type":17,"tag":84,"props":181701,"children":181702},{},[181703],{"type":23,"value":181704},"CRM activities and records",{"type":17,"tag":84,"props":181706,"children":181707},{},[181708],{"type":23,"value":181709},"ATS resumes and candidate profiles",{"type":17,"tag":29,"props":181711,"children":181712},{},[181713],{"type":23,"value":181714},"Each of these data sources behaves differently. They change at different rates, expose different permission models, and require different retrieval strategies. Treating them all as static text to be embedded once and stored indefinitely is rarely sufficient.",{"type":17,"tag":29,"props":181716,"children":181717},{},[181718],{"type":17,"tag":48,"props":181719,"children":181720},{},[181721],{"type":23,"value":181722},"A common production pattern looks like this:",{"type":17,"tag":80,"props":181724,"children":181725},{},[181726,181731,181736,181741,181746],{"type":17,"tag":84,"props":181727,"children":181728},{},[181729],{"type":23,"value":181730},"Structured and unstructured data is fetched from source APIs",{"type":17,"tag":84,"props":181732,"children":181733},{},[181734],{"type":23,"value":181735},"Content is chunked and embedded where semantic search is appropriate",{"type":17,"tag":84,"props":181737,"children":181738},{},[181739],{"type":23,"value":181740},"Embeddings are stored in a vector database owned by the application team",{"type":17,"tag":84,"props":181742,"children":181743},{},[181744],{"type":23,"value":181745},"Retrieval combines indexed context with real-time reads when current state matters",{"type":17,"tag":84,"props":181747,"children":181748},{},[181749],{"type":23,"value":181750},"Authorization is enforced at retrieval time, not after generation",{"type":17,"tag":29,"props":181752,"children":181753},{},[181754],{"type":23,"value":181755},"In practice, this means RAG pipelines are tightly coupled to integration infrastructure.",{"type":17,"tag":29,"props":181757,"children":181758},{},[181759],{"type":17,"tag":48,"props":181760,"children":181761},{},[181762],{"type":23,"value":181763},"Retrieval quality depends on:",{"type":17,"tag":80,"props":181765,"children":181766},{},[181767,181772,181777,181782],{"type":17,"tag":84,"props":181768,"children":181769},{},[181770],{"type":23,"value":181771},"How reliably data can be fetched from source platforms",{"type":17,"tag":84,"props":181773,"children":181774},{},[181775],{"type":23,"value":181776},"Whether updates are detected and propagated quickly",{"type":17,"tag":84,"props":181778,"children":181779},{},[181780],{"type":23,"value":181781},"Whether retrieval respects tenant and user boundaries",{"type":17,"tag":84,"props":181783,"children":181784},{},[181785],{"type":23,"value":181786},"Whether data is accessed in real time or via stored snapshots",{"type":17,"tag":29,"props":181788,"children":181789},{},[181790,181792,181796],{"type":23,"value":181791},"This is where many teams run into operational complexity: maintaining dozens of direct integrations, handling ",{"type":17,"tag":133,"props":181793,"children":181794},{"href":779},[181795],{"type":23,"value":782},{"type":23,"value":181797}," edge cases, managing retries and pagination, and keeping indexes in sync as data changes.",{"type":17,"tag":29,"props":181799,"children":181800},{},[181801],{"type":17,"tag":48,"props":181802,"children":181803},{},[181804],{"type":23,"value":181805},"Some teams address this by introducing an integration layer that provides:",{"type":17,"tag":80,"props":181807,"children":181808},{},[181809,181814,181819,181824],{"type":17,"tag":84,"props":181810,"children":181811},{},[181812],{"type":23,"value":181813},"Authorized, real-time access to SaaS APIs",{"type":17,"tag":84,"props":181815,"children":181816},{},[181817],{"type":23,"value":181818},"Normalized objects across categories like CRM, ticketing, file storage, and ATS",{"type":17,"tag":84,"props":181820,"children":181821},{},[181822],{"type":23,"value":181823},"Native and virtual webhooks to detect changes",{"type":17,"tag":84,"props":181825,"children":181826},{},[181827],{"type":23,"value":181828},"A stateless, pass-through model that avoids storing end-customer data",{"type":17,"tag":29,"props":181830,"children":181831},{},[181832],{"type":23,"value":181833},"In these architectures, RAG is no longer 'just' an AI problem. It becomes a data access and retrieval discipline that spans integrations, permissions, and real-time delivery.",{"type":17,"tag":29,"props":181835,"children":181836},{},[181837,181841],{"type":17,"tag":48,"props":181838,"children":181839},{},[181840],{"type":23,"value":181109},{"type":23,"value":181842}," Production RAG systems succeed or fail based on the quality of their data access layer, not just their embeddings or models.",{"type":17,"tag":239,"props":181844,"children":181846},{"id":181845},"building-rag-on-real-saas-data",[181847],{"type":23,"value":181848},"Building RAG on Real SaaS Data",{"type":17,"tag":29,"props":181850,"children":181851},{},[181852],{"type":23,"value":181853},"If you're building AI features that rely on customer data from SaaS platforms, retrieval architecture matters as much as model choice.",{"type":17,"tag":29,"props":181855,"children":181856},{},[181857],{"type":23,"value":181858},"Unified is SaaS data infrastructure built for this reality. We provide authorized, real-time access to SaaS APIs across key categories — including CRM, ticketing, file storage, knowledge platforms, and ATS — without storing end-customer payloads.",{"type":17,"tag":29,"props":181860,"children":181861},{},[181862],{"type":23,"value":181863},"Teams use Unified to:",{"type":17,"tag":80,"props":181865,"children":181866},{},[181867,181872,181877,181882,181887],{"type":17,"tag":84,"props":181868,"children":181869},{},[181870],{"type":23,"value":181871},"Retrieve current SaaS data directly from source APIs",{"type":17,"tag":84,"props":181873,"children":181874},{},[181875],{"type":23,"value":181876},"Normalize objects across providers to reduce per-platform logic",{"type":17,"tag":84,"props":181878,"children":181879},{},[181880],{"type":23,"value":181881},"Keep vector indexes up to date using native and virtual webhooks",{"type":17,"tag":84,"props":181883,"children":181884},{},[181885],{"type":23,"value":181886},"Enforce authorization boundaries at retrieval time",{"type":17,"tag":84,"props":181888,"children":181889},{},[181890],{"type":23,"value":181891},"Power RAG pipelines and AI agents with real-time context",{"type":17,"tag":29,"props":181893,"children":181894},{},[181895],{"type":23,"value":181896},"If you're designing RAG pipelines for a production SaaS product and want retrieval to reflect current state — not cached snapshots — you can learn more about how teams use Unified for AI-ready data access.",{"type":17,"tag":29,"props":181898,"children":181899},{},[181900,181901],{"type":23,"value":1609},{"type":17,"tag":133,"props":181902,"children":181904},{"href":176923,"rel":181903},[214],[181905],{"type":17,"tag":48,"props":181906,"children":181907},{},[181908],{"type":23,"value":181909},"Explore Unified's docs",{"type":17,"tag":29,"props":181911,"children":181912},{},[181913,181914],{"type":23,"value":1609},{"type":17,"tag":133,"props":181915,"children":181917},{"href":1623,"rel":181916},[214],[181918],{"type":17,"tag":48,"props":181919,"children":181920},{},[181921],{"type":23,"value":181922},"Talk to us about real-time retrieval for AI features",{"type":17,"tag":25,"props":181924,"children":181925},{},[],{"type":17,"tag":68,"props":181927,"children":181929},{"id":181928},"frequently-asked-questions-about-rag",[181930],{"type":23,"value":181931},"Frequently Asked Questions About RAG",{"type":17,"tag":29,"props":181933,"children":181934},{},[181935],{"type":17,"tag":48,"props":181936,"children":181937},{},[181938],{"type":23,"value":181939},"What is retrieval-augmented generation (RAG)?",{"type":17,"tag":29,"props":181941,"children":181942},{},[181943],{"type":23,"value":181944},"RAG is an architecture where a language model retrieves external context at request time and uses it to generate responses.",{"type":17,"tag":29,"props":181946,"children":181947},{},[181948],{"type":17,"tag":48,"props":181949,"children":181950},{},[181951],{"type":23,"value":181952},"How does RAG work in production?",{"type":17,"tag":29,"props":181954,"children":181955},{},[181956],{"type":23,"value":181957},"Production RAG systems combine retrieval mechanisms with language models, often using a mix of indexed and on-demand data retrieval.",{"type":17,"tag":29,"props":181959,"children":181960},{},[181961],{"type":17,"tag":48,"props":181962,"children":181963},{},[181964],{"type":23,"value":181965},"Why do RAG systems fail?",{"type":17,"tag":29,"props":181967,"children":181968},{},[181969],{"type":23,"value":181970},"Most failures stem from retrieval issues such as stale data, incorrect permissions, or incomplete context.",{"type":17,"tag":29,"props":181972,"children":181973},{},[181974],{"type":17,"tag":48,"props":181975,"children":181976},{},[181977],{"type":23,"value":181978},"Is RAG better than fine-tuning?",{"type":17,"tag":29,"props":181980,"children":181981},{},[181982],{"type":23,"value":181983},"They solve different problems. RAG handles changing knowledge; fine-tuning shapes behavior.",{"title":7,"searchDepth":1629,"depth":1629,"links":181985},[181986,181987,181988,181993,181994,181998,181999,182000,182001,182004],{"id":181031,"depth":1629,"text":181034},{"id":181114,"depth":1629,"text":181117},{"id":181204,"depth":1629,"text":181207,"children":181989},[181990,181991,181992],{"id":181221,"depth":1635,"text":181224},{"id":181277,"depth":1635,"text":181280},{"id":181328,"depth":1635,"text":181331},{"id":181353,"depth":1629,"text":181356},{"id":181411,"depth":1629,"text":181414,"children":181995},[181996,181997],{"id":181422,"depth":1635,"text":181425},{"id":181446,"depth":1635,"text":181449},{"id":181489,"depth":1629,"text":181492},{"id":181542,"depth":1629,"text":181545},{"id":181619,"depth":1629,"text":181622},{"id":181673,"depth":1629,"text":181676,"children":182002},[182003],{"id":181845,"depth":1635,"text":181848},{"id":181928,"depth":1629,"text":181931},"content:blog:what_is_retrieval_augmented_generation_rag_and_why_most_implementations_break_in_production.md","blog/what_is_retrieval_augmented_generation_rag_and_why_most_implementations_break_in_production.md","blog/what_is_retrieval_augmented_generation_rag_and_why_most_implementations_break_in_production",{"_path":182009,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":182010,"description":182011,"img":182012,"date":182013,"tag":6341,"body":182014,"_type":1677,"_id":183332,"_source":1679,"_file":183333,"_stem":183334,"_extension":1682},"/blog/unified_assessment_api_embed_assessments_inside_ats_platforms","Unified Assessment API: Embed Assessments Inside ATS Platforms","Most assessment integrations rely on application status changes or external tools. Recruiters switch systems, and providers handle fragmented integration...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_assessment_api_embed_assessments_inside_ats_platforms-icon.png","2026-02-09T21:10:00.000Z",{"type":14,"children":182015,"toc":183296},[182016,182021,182024,182032,182037,182053,182058,182063,182075,182081,182086,182092,182100,182113,182126,182139,182152,182165,182170,182175,182180,182185,182190,182195,182201,182232,182237,182243,182248,182266,182278,182287,182292,182315,182321,182349,182355,182360,182365,182388,182397,182407,182412,182430,182435,182440,182445,182451,182461,182466,182471,182476,182513,182518,182523,182528,182534,182539,182562,182566,182578,182583,182589,182612,182618,182641,182647,182652,182681,182686,182691,182696,182702,182708,182713,182732,182752,182760,182769,182775,182780,182786,182791,182820,182825,182831,182836,182865,182870,182876,182881,182929,182934,182943,182948,183034,183040,183045,183050,183108,183113,183118,183132,183136,183147,183156,183162,183167,183175,183183,183192,183197,183203,183208,183258,183264,183276,183281,183286,183291],{"type":17,"tag":18,"props":182017,"children":182019},{"id":182018},"unified-assessment-api-embed-assessments-inside-ats-platforms",[182020],{"type":23,"value":182010},{"type":17,"tag":25,"props":182022,"children":182023},{},[],{"type":17,"tag":29,"props":182025,"children":182026},{},[182027],{"type":17,"tag":33,"props":182028,"children":182029},{},[182030],{"type":23,"value":182031},"February 9, 2026",{"type":17,"tag":29,"props":182033,"children":182034},{},[182035],{"type":23,"value":182036},"Most assessment integrations rely on application status changes or external tools. Recruiters switch systems, and providers handle fragmented integration logic. Some ATS platforms now support embedded assessment listings, where recruiters select and order assessments directly inside the ATS.",{"type":17,"tag":29,"props":182038,"children":182039},{},[182040,182042,182046,182048],{"type":23,"value":182041},"Unlike traditional integrations that rely on polling or status changes, the ",{"type":17,"tag":133,"props":182043,"children":182044},{"href":52325},[182045],{"type":23,"value":149277},{"type":23,"value":182047}," enables ",{"type":17,"tag":48,"props":182049,"children":182050},{},[182051],{"type":23,"value":182052},"real-time, recruiter-initiated assessment requests executed directly inside ATS platforms.",{"type":17,"tag":68,"props":182054,"children":182055},{"id":52312},[182056],{"type":23,"value":182057},"What is an Assessment API?",{"type":17,"tag":29,"props":182059,"children":182060},{},[182061],{"type":23,"value":182062},"An assessment API allows assessment providers to integrate directly into ATS platforms so recruiters can request candidate assessments without leaving the ATS. Instead of triggering assessments based on status changes, recruiters select assessment packages inside the hiring process, and the request is routed to the provider in real time.",{"type":17,"tag":29,"props":182064,"children":182065},{},[182066,182068,182073],{"type":23,"value":182067},"The Assessment API supports both ",{"type":17,"tag":48,"props":182069,"children":182070},{},[182071],{"type":23,"value":182072},"embedded ATS integrations and",{"type":23,"value":182074}," including package management, order handling, and result submission.",{"type":17,"tag":68,"props":182076,"children":182078},{"id":182077},"why-ats-native-assessment-integrations-matter",[182079],{"type":23,"value":182080},"Why ATS-native assessment integrations matter",{"type":17,"tag":29,"props":182082,"children":182083},{},[182084],{"type":23,"value":182085},"Embedded assessment integrations increase completion rates and reduce friction because recruiters take action at the point of decision. There is no context switching, and results are written back to the system where hiring decisions are made.",{"type":17,"tag":68,"props":182087,"children":182089},{"id":182088},"three-ways-to-integrate-assessments-with-unified",[182090],{"type":23,"value":182091},"Three ways to integrate assessments with Unified",{"type":17,"tag":29,"props":182093,"children":182094},{},[182095],{"type":17,"tag":48,"props":182096,"children":182097},{},[182098],{"type":23,"value":182099},"1. Embedded (Assessment API)",{"type":17,"tag":80,"props":182101,"children":182102},{},[182103,182108],{"type":17,"tag":84,"props":182104,"children":182105},{},[182106],{"type":23,"value":182107},"Recruiter selects assessment inside ATS",{"type":17,"tag":84,"props":182109,"children":182110},{},[182111],{"type":23,"value":182112},"Best UX, requires ATS support",{"type":17,"tag":29,"props":182114,"children":182115},{},[182116],{"type":17,"tag":48,"props":182117,"children":182118},{},[182119,182121,182125],{"type":23,"value":182120},"2. Triggered (",{"type":17,"tag":133,"props":182122,"children":182123},{"href":55696},[182124],{"type":23,"value":55699},{"type":23,"value":12034},{"type":17,"tag":80,"props":182127,"children":182128},{},[182129,182134],{"type":17,"tag":84,"props":182130,"children":182131},{},[182132],{"type":23,"value":182133},"Trigger on status change",{"type":17,"tag":84,"props":182135,"children":182136},{},[182137],{"type":23,"value":182138},"Works across all ATS",{"type":17,"tag":29,"props":182140,"children":182141},{},[182142],{"type":17,"tag":48,"props":182143,"children":182144},{},[182145,182147,182151],{"type":23,"value":182146},"3. Verification-style (",{"type":17,"tag":133,"props":182148,"children":182149},{"href":53443},[182150],{"type":23,"value":54031},{"type":23,"value":12034},{"type":17,"tag":80,"props":182153,"children":182154},{},[182155,182160],{"type":17,"tag":84,"props":182156,"children":182157},{},[182158],{"type":23,"value":182159},"ATS/HRIS calls provider directly",{"type":17,"tag":84,"props":182161,"children":182162},{},[182163],{"type":23,"value":182164},"No marketplace required",{"type":17,"tag":29,"props":182166,"children":182167},{},[182168],{"type":23,"value":182169},"Most assessment providers use a combination of all three to balance coverage and user experience.",{"type":17,"tag":68,"props":182171,"children":182173},{"id":182172},"unified-assessment-api",[182174],{"type":23,"value":52991},{"type":17,"tag":29,"props":182176,"children":182177},{},[182178],{"type":23,"value":182179},"The Unified Assessment API allows assessment and background check providers to integrate directly with Applicant Tracking Systems (ATS) platforms that support embedded assessment listings.",{"type":17,"tag":29,"props":182181,"children":182182},{},[182183],{"type":23,"value":182184},"This API enables recruiters to request assessments for candidates directly from within their ATS. The recruiter does not need to log into a separate assessment platform or use a separate system.",{"type":17,"tag":29,"props":182186,"children":182187},{},[182188],{"type":23,"value":182189},"Instead, the assessment package is selected inside the ATS, and the request is routed to your platform through Unified.",{"type":17,"tag":29,"props":182191,"children":182192},{},[182193],{"type":23,"value":182194},"This is different from triggering assessments based on status changes. It is a recruiter-initiated flow inside the ATS itself.",{"type":17,"tag":239,"props":182196,"children":182198},{"id":182197},"core-objects-in-the-assessment-api",[182199],{"type":23,"value":182200},"Core objects in the Assessment API",{"type":17,"tag":80,"props":182202,"children":182203},{},[182204,182213,182222],{"type":17,"tag":84,"props":182205,"children":182206},{},[182207,182211],{"type":17,"tag":48,"props":182208,"children":182209},{},[182210],{"type":23,"value":54055},{"type":23,"value":182212},": define assessment offerings, metadata, scoring, and configuration",{"type":17,"tag":84,"props":182214,"children":182215},{},[182216,182220],{"type":17,"tag":48,"props":182217,"children":182218},{},[182219],{"type":23,"value":83842},{"type":23,"value":182221},": represent assessment requests, candidate context, and lifecycle state",{"type":17,"tag":84,"props":182223,"children":182224},{},[182225,182230],{"type":17,"tag":48,"props":182226,"children":182227},{},[182228],{"type":23,"value":182229},"Responses",{"type":23,"value":182231},": structured results including scores, attributes, and artifacts",{"type":17,"tag":29,"props":182233,"children":182234},{},[182235],{"type":23,"value":182236},"Orders include rich candidate, job, and application context, allowing providers to tailor assessments and return structured results directly into the ATS.",{"type":17,"tag":239,"props":182238,"children":182240},{"id":182239},"real-time-readwrite-assessment-workflows",[182241],{"type":23,"value":182242},"Real-time, read/write assessment workflows",{"type":17,"tag":29,"props":182244,"children":182245},{},[182246],{"type":23,"value":182247},"The Assessment API supports both:",{"type":17,"tag":80,"props":182249,"children":182250},{},[182251,182256,182261],{"type":17,"tag":84,"props":182252,"children":182253},{},[182254],{"type":23,"value":182255},"Creating and managing assessment packages",{"type":17,"tag":84,"props":182257,"children":182258},{},[182259],{"type":23,"value":182260},"Receiving assessment orders in real time",{"type":17,"tag":84,"props":182262,"children":182263},{},[182264],{"type":23,"value":182265},"Updating orders with structured results and scores",{"type":17,"tag":29,"props":182267,"children":182268},{},[182269,182271,182276],{"type":23,"value":182270},"All requests are ",{"type":17,"tag":48,"props":182272,"children":182273},{},[182274],{"type":23,"value":182275},"stateless and routed directly to the source system",{"type":23,"value":182277},"—no caching, no sync jobs, no stored records.",{"type":17,"tag":239,"props":182279,"children":182281},{"id":182280},"using-assessment-data-in-ai-systems",[182282],{"type":17,"tag":48,"props":182283,"children":182284},{},[182285],{"type":23,"value":182286},"Using assessment data in AI systems",{"type":17,"tag":29,"props":182288,"children":182289},{},[182290],{"type":23,"value":182291},"Because assessment results are structured and returned in real time, they can be used to:",{"type":17,"tag":80,"props":182293,"children":182294},{},[182295,182300,182305,182310],{"type":17,"tag":84,"props":182296,"children":182297},{},[182298],{"type":23,"value":182299},"Generate candidate summaries and scoring insights",{"type":17,"tag":84,"props":182301,"children":182302},{},[182303],{"type":23,"value":182304},"Feed structured evaluation data into copilots or hiring assistants",{"type":17,"tag":84,"props":182306,"children":182307},{},[182308],{"type":23,"value":182309},"Trigger automated follow-ups or recommendations",{"type":17,"tag":84,"props":182311,"children":182312},{},[182313],{"type":23,"value":182314},"Train models on hiring outcomes and performance signals",{"type":17,"tag":68,"props":182316,"children":182318},{"id":182317},"what-you-can-build-with-the-assessment-api",[182319],{"type":23,"value":182320},"What you can build with the Assessment API",{"type":17,"tag":80,"props":182322,"children":182323},{},[182324,182329,182334,182339,182344],{"type":17,"tag":84,"props":182325,"children":182326},{},[182327],{"type":23,"value":182328},"Embedded assessment marketplaces inside ATS platforms",{"type":17,"tag":84,"props":182330,"children":182331},{},[182332],{"type":23,"value":182333},"Partner integrations with ATS vendors (Greenhouse, Ashby, Workable)",{"type":17,"tag":84,"props":182335,"children":182336},{},[182337],{"type":23,"value":182338},"Recruiter-driven assessment workflows",{"type":17,"tag":84,"props":182340,"children":182341},{},[182342],{"type":23,"value":182343},"Real-time candidate evaluation pipelines",{"type":17,"tag":84,"props":182345,"children":182346},{},[182347],{"type":23,"value":182348},"AI scoring and feedback workflows tied to ATS activity",{"type":17,"tag":239,"props":182350,"children":182352},{"id":182351},"embedded-assessment-marketplaces-inside-ats",[182353],{"type":23,"value":182354},"Embedded assessment marketplaces inside ATS",{"type":17,"tag":29,"props":182356,"children":182357},{},[182358],{"type":23,"value":182359},"Some ATS platforms support native assessment marketplaces, where providers can list assessment packages directly inside the product.",{"type":17,"tag":29,"props":182361,"children":182362},{},[182363],{"type":23,"value":182364},"The Assessment API enables this model by:",{"type":17,"tag":80,"props":182366,"children":182367},{},[182368,182373,182378,182383],{"type":17,"tag":84,"props":182369,"children":182370},{},[182371],{"type":23,"value":182372},"Listing your packages inside the ATS",{"type":17,"tag":84,"props":182374,"children":182375},{},[182376],{"type":23,"value":182377},"Allowing recruiters to select assessments directly",{"type":17,"tag":84,"props":182379,"children":182380},{},[182381],{"type":23,"value":182382},"Sending orders in real time",{"type":17,"tag":84,"props":182384,"children":182385},{},[182386],{"type":23,"value":182387},"Returning results back into the same flow",{"type":17,"tag":68,"props":182389,"children":182391},{"id":182390},"how-the-assessment-api-differs-from-other-unified-apis",[182392],{"type":17,"tag":48,"props":182393,"children":182394},{},[182395],{"type":23,"value":182396},"How the Assessment API differs from other Unified APIs",{"type":17,"tag":29,"props":182398,"children":182399},{},[182400,182401,182405],{"type":23,"value":6712},{"type":17,"tag":48,"props":182402,"children":182403},{},[182404],{"type":23,"value":54014},{"type":23,"value":182406}," is used by ATS or HRIS platforms to call verification or assessment providers in a unified way.",{"type":17,"tag":29,"props":182408,"children":182409},{},[182410],{"type":23,"value":182411},"In that flow:",{"type":17,"tag":80,"props":182413,"children":182414},{},[182415,182420,182425],{"type":17,"tag":84,"props":182416,"children":182417},{},[182418],{"type":23,"value":182419},"The ATS or HRIS platform initiates the request.",{"type":17,"tag":84,"props":182421,"children":182422},{},[182423],{"type":23,"value":182424},"They do not need a direct partnership with the assessment provider.",{"type":17,"tag":84,"props":182426,"children":182427},{},[182428],{"type":23,"value":182429},"The call is routed through Unified using the unified verification data models.",{"type":17,"tag":29,"props":182431,"children":182432},{},[182433],{"type":23,"value":182434},"The Assessment API is different.",{"type":17,"tag":29,"props":182436,"children":182437},{},[182438],{"type":23,"value":182439},"It is designed for assessment providers who want their assessment packages listed directly inside an ATS that supports embedded assessment integrations.",{"type":17,"tag":29,"props":182441,"children":182442},{},[182443],{"type":23,"value":182444},"The integration is initiated by the recruiter inside the ATS, not by the assessment provider or backend workflow.",{"type":17,"tag":239,"props":182446,"children":182448},{"id":182447},"how-this-differs-from-the-unified-ats-api",[182449],{"type":23,"value":182450},"How This Differs from the Unified ATS API",{"type":17,"tag":29,"props":182452,"children":182453},{},[182454,182455,182459],{"type":23,"value":6712},{"type":17,"tag":48,"props":182456,"children":182457},{},[182458],{"type":23,"value":56819},{"type":23,"value":182460}," allows assessment providers to listen for job application changes and trigger an assessment when an application reaches a specific status.",{"type":17,"tag":29,"props":182462,"children":182463},{},[182464],{"type":23,"value":182465},"That flow works across most ATS platforms supported by Unified and does not require a special assessment marketplace integration.",{"type":17,"tag":29,"props":182467,"children":182468},{},[182469],{"type":23,"value":182470},"It is best suited for ATS platforms that do not support embedded assessment listings.",{"type":17,"tag":29,"props":182472,"children":182473},{},[182474],{"type":23,"value":182475},"The new Unified Assessment API works in a different way:",{"type":17,"tag":80,"props":182477,"children":182478},{},[182479,182484,182489,182494,182499,182503,182508],{"type":17,"tag":84,"props":182480,"children":182481},{},[182482],{"type":23,"value":182483},"It connects directly to ATS platforms that have a dedicated 'assessment API.'",{"type":17,"tag":84,"props":182485,"children":182486},{},[182487],{"type":23,"value":182488},"Your assessment packages are listed inside the ATS.",{"type":17,"tag":84,"props":182490,"children":182491},{},[182492],{"type":23,"value":182493},"A recruiter manually selects a package for a candidate.",{"type":17,"tag":84,"props":182495,"children":182496},{},[182497],{"type":23,"value":182498},"The ATS sends an assessment order through Unified.",{"type":17,"tag":84,"props":182500,"children":182501},{},[182502],{"type":23,"value":149444},{"type":17,"tag":84,"props":182504,"children":182505},{},[182506],{"type":23,"value":182507},"You update the order.",{"type":17,"tag":84,"props":182509,"children":182510},{},[182511],{"type":23,"value":182512},"The results are written back into the ATS.",{"type":17,"tag":29,"props":182514,"children":182515},{},[182516],{"type":23,"value":182517},"The key difference:",{"type":17,"tag":29,"props":182519,"children":182520},{},[182521],{"type":23,"value":182522},"The recruiter stays inside the ATS the entire time.",{"type":17,"tag":29,"props":182524,"children":182525},{},[182526],{"type":23,"value":182527},"There is no external trigger based on status change. The recruiter explicitly orders the assessment.",{"type":17,"tag":239,"props":182529,"children":182531},{"id":182530},"when-should-you-use-each",[182532],{"type":23,"value":182533},"When Should You Use Each?",{"type":17,"tag":29,"props":182535,"children":182536},{},[182537],{"type":23,"value":182538},"For assessment providers:",{"type":17,"tag":80,"props":182540,"children":182541},{},[182542,182552],{"type":17,"tag":84,"props":182543,"children":182544},{},[182545,182546,182550],{"type":23,"value":48249},{"type":17,"tag":48,"props":182547,"children":182548},{},[182549],{"type":23,"value":149277},{"type":23,"value":182551}," when the ATS supports embedded assessment listings and you have a partnership with that ATS.",{"type":17,"tag":84,"props":182553,"children":182554},{},[182555,182556,182560],{"type":23,"value":48249},{"type":17,"tag":48,"props":182557,"children":182558},{},[182559],{"type":23,"value":55699},{"type":23,"value":182561}," for all other ATS platforms.",{"type":17,"tag":29,"props":182563,"children":182564},{},[182565],{"type":23,"value":150426},{"type":17,"tag":80,"props":182567,"children":182568},{},[182569,182573],{"type":17,"tag":84,"props":182570,"children":182571},{},[182572],{"type":23,"value":150434},{"type":17,"tag":84,"props":182574,"children":182575},{},[182576],{"type":23,"value":182577},"ATS API as the broad coverage fallback.",{"type":17,"tag":29,"props":182579,"children":182580},{},[182581],{"type":23,"value":182582},"The Assessment API reduces recruiter friction but is limited to ATS platforms that expose this functionality.",{"type":17,"tag":239,"props":182584,"children":182586},{"id":182585},"who-this-is-for",[182587],{"type":23,"value":182588},"Who this is for",{"type":17,"tag":80,"props":182590,"children":182591},{},[182592,182597,182602,182607],{"type":17,"tag":84,"props":182593,"children":182594},{},[182595],{"type":23,"value":182596},"Assessment providers (coding tests, behavioral, psychometric, etc.)",{"type":17,"tag":84,"props":182598,"children":182599},{},[182600],{"type":23,"value":182601},"Background check and verification providers",{"type":17,"tag":84,"props":182603,"children":182604},{},[182605],{"type":23,"value":182606},"AI-based candidate evaluation platforms",{"type":17,"tag":84,"props":182608,"children":182609},{},[182610],{"type":23,"value":182611},"Hiring infrastructure tools integrating into ATS ecosystems",{"type":17,"tag":68,"props":182613,"children":182615},{"id":182614},"why-this-matters-for-assessment-providers",[182616],{"type":23,"value":182617},"Why this matters for assessment providers",{"type":17,"tag":80,"props":182619,"children":182620},{},[182621,182626,182631,182636],{"type":17,"tag":84,"props":182622,"children":182623},{},[182624],{"type":23,"value":182625},"Higher completion rates (recruiter intent is explicit)",{"type":17,"tag":84,"props":182627,"children":182628},{},[182629],{"type":23,"value":182630},"Less friction (no external tools)",{"type":17,"tag":84,"props":182632,"children":182633},{},[182634],{"type":23,"value":182635},"Stronger ATS partnerships",{"type":17,"tag":84,"props":182637,"children":182638},{},[182639],{"type":23,"value":182640},"Better UX for hiring teams",{"type":17,"tag":68,"props":182642,"children":182644},{"id":182643},"supported-ats-integrations",[182645],{"type":23,"value":182646},"Supported ATS Integrations",{"type":17,"tag":29,"props":182648,"children":182649},{},[182650],{"type":23,"value":182651},"Currently, the Unified Assessment API supports the following ATS platforms:",{"type":17,"tag":80,"props":182653,"children":182654},{},[182655,182659,182664,182668,182672,182677],{"type":17,"tag":84,"props":182656,"children":182657},{},[182658],{"type":23,"value":75326},{"type":17,"tag":84,"props":182660,"children":182661},{},[182662],{"type":23,"value":182663},"Cornerstone",{"type":17,"tag":84,"props":182665,"children":182666},{},[182667],{"type":23,"value":3189},{"type":17,"tag":84,"props":182669,"children":182670},{},[182671],{"type":23,"value":56584},{"type":17,"tag":84,"props":182673,"children":182674},{},[182675],{"type":23,"value":182676},"TalentLyft",{"type":17,"tag":84,"props":182678,"children":182679},{},[182680],{"type":23,"value":56564},{"type":17,"tag":29,"props":182682,"children":182683},{},[182684],{"type":23,"value":182685},"Each of these has a dedicated assessment integration that is separate from the standard ATS integration.",{"type":17,"tag":29,"props":182687,"children":182688},{},[182689],{"type":23,"value":182690},"Only ATS platforms that support embedded assessment listings can be supported through this API.",{"type":17,"tag":29,"props":182692,"children":182693},{},[182694],{"type":23,"value":182695},"Expansion to additional supported ATS platforms is ongoing.",{"type":17,"tag":68,"props":182697,"children":182699},{"id":182698},"getting-started",[182700],{"type":23,"value":182701},"Getting Started",{"type":17,"tag":239,"props":182703,"children":182705},{"id":182704},"step-1-create-a-connection",[182706],{"type":23,"value":182707},"Step 1: Create a Connection",{"type":17,"tag":29,"props":182709,"children":182710},{},[182711],{"type":23,"value":182712},"First, you need to manually create a connection for your assessment integration. This connection will be used to authenticate requests from the ATS.",{"type":17,"tag":29,"props":182714,"children":182715},{},[182716,182718,182722,182724,182730],{"type":23,"value":182717},"When creating the connection, you must supply a ",{"type":17,"tag":48,"props":182719,"children":182720},{},[182721],{"type":23,"value":149475},{"type":23,"value":182723}," in the ",{"type":17,"tag":6121,"props":182725,"children":182727},{"className":182726},[],[182728],{"type":23,"value":182729},"connection.auth.token",{"type":23,"value":182731}," field that you generate yourself. You will then share this API key with your end-customer to configure the integration in their ATS.",{"type":17,"tag":29,"props":182733,"children":182734},{},[182735,182737,182743,182745,182751],{"type":23,"value":182736},"Always check the authentication requirements for each assessment integration as some will require additional authentication information.  For example, Ashby also requires a ",{"type":17,"tag":6121,"props":182738,"children":182740},{"className":182739},[],[182741],{"type":23,"value":182742},"Customer API Key",{"type":23,"value":182744}," and a ",{"type":17,"tag":6121,"props":182746,"children":182748},{"className":182747},[],[182749],{"type":23,"value":182750},"Partner ID",{"type":23,"value":54},{"type":17,"tag":29,"props":182753,"children":182754},{},[182755],{"type":17,"tag":48,"props":182756,"children":182757},{},[182758],{"type":23,"value":182759},"Example Connection Creation:",{"type":17,"tag":6893,"props":182761,"children":182764},{"className":182762,"code":182763,"language":22503,"meta":7},[22501],"{\n  \"integration_type\": \"greenhouseassessment\",\n  \"auth\": {\n    \"token\": \"YOUR_PARTNER_API_KEY\"\n  },\n}\n",[182765],{"type":17,"tag":6121,"props":182766,"children":182767},{"__ignoreMap":7},[182768],{"type":23,"value":182763},{"type":17,"tag":239,"props":182770,"children":182772},{"id":182771},"step-2-configure-webhooks",[182773],{"type":23,"value":182774},"Step 2: Configure Webhooks",{"type":17,"tag":29,"props":182776,"children":182777},{},[182778],{"type":23,"value":182779},"You also need to set up webhooks to receive assessment orders from the ATS systems.",{"type":17,"tag":239,"props":182781,"children":182783},{"id":182782},"required-webhook",[182784],{"type":23,"value":182785},"Required Webhook",{"type":17,"tag":29,"props":182787,"children":182788},{},[182789],{"type":23,"value":182790},"Create a webhook with the following configuration:",{"type":17,"tag":80,"props":182792,"children":182793},{},[182794,182807],{"type":17,"tag":84,"props":182795,"children":182796},{},[182797,182801,182802],{"type":17,"tag":48,"props":182798,"children":182799},{},[182800],{"type":23,"value":161193},{"type":23,"value":49318},{"type":17,"tag":6121,"props":182803,"children":182805},{"className":182804},[],[182806],{"type":23,"value":149437},{"type":17,"tag":84,"props":182808,"children":182809},{},[182810,182814,182815],{"type":17,"tag":48,"props":182811,"children":182812},{},[182813],{"type":23,"value":62633},{"type":23,"value":49318},{"type":17,"tag":6121,"props":182816,"children":182818},{"className":182817},[],[182819],{"type":23,"value":109207},{"type":17,"tag":29,"props":182821,"children":182822},{},[182823],{"type":23,"value":182824},"This webhook will be triggered whenever a recruiter requests an assessment for a candidate in the ATS.",{"type":17,"tag":239,"props":182826,"children":182828},{"id":182827},"optional-webhook",[182829],{"type":23,"value":182830},"Optional Webhook",{"type":17,"tag":29,"props":182832,"children":182833},{},[182834],{"type":23,"value":182835},"Some ATS vendors (like Ashby) also send order cancellation events. You can optionally create an additional webhook:",{"type":17,"tag":80,"props":182837,"children":182838},{},[182839,182852],{"type":17,"tag":84,"props":182840,"children":182841},{},[182842,182846,182847],{"type":17,"tag":48,"props":182843,"children":182844},{},[182845],{"type":23,"value":161193},{"type":23,"value":49318},{"type":17,"tag":6121,"props":182848,"children":182850},{"className":182849},[],[182851],{"type":23,"value":149437},{"type":17,"tag":84,"props":182853,"children":182854},{},[182855,182859,182860],{"type":17,"tag":48,"props":182856,"children":182857},{},[182858],{"type":23,"value":62633},{"type":23,"value":49318},{"type":17,"tag":6121,"props":182861,"children":182863},{"className":182862},[],[182864],{"type":23,"value":109221},{"type":17,"tag":29,"props":182866,"children":182867},{},[182868],{"type":23,"value":182869},"This webhook will notify you when an assessment order is cancelled.",{"type":17,"tag":239,"props":182871,"children":182873},{"id":182872},"step-3-provide-configuration-to-your-end-customer",[182874],{"type":23,"value":182875},"Step 3: Provide Configuration to Your End-Customer",{"type":17,"tag":29,"props":182877,"children":182878},{},[182879],{"type":23,"value":182880},"Once you've created the connection and webhook, provide the following information to your end-customer:",{"type":17,"tag":6154,"props":182882,"children":182883},{},[182884,182915],{"type":17,"tag":84,"props":182885,"children":182886},{},[182887,182892,182893,182899],{"type":17,"tag":48,"props":182888,"children":182889},{},[182890],{"type":23,"value":182891},"Base URL",{"type":23,"value":49318},{"type":17,"tag":6121,"props":182894,"children":182896},{"className":182895},[],[182897],{"type":23,"value":182898},"https://api.unified.to/assessments/{connection_id}",{"type":17,"tag":80,"props":182900,"children":182901},{},[182902],{"type":17,"tag":84,"props":182903,"children":182904},{},[182905,182907,182913],{"type":23,"value":182906},"Replace ",{"type":17,"tag":6121,"props":182908,"children":182910},{"className":182909},[],[182911],{"type":23,"value":182912},"{connection_id}",{"type":23,"value":182914}," with the actual connection ID from Step 1",{"type":17,"tag":84,"props":182916,"children":182917},{},[182918,182922,182924],{"type":17,"tag":48,"props":182919,"children":182920},{},[182921],{"type":23,"value":149475},{"type":23,"value":182923},": The token value you set in ",{"type":17,"tag":6121,"props":182925,"children":182927},{"className":182926},[],[182928],{"type":23,"value":182729},{"type":17,"tag":29,"props":182930,"children":182931},{},[182932],{"type":23,"value":182933},"Your end-customer will then input these credentials into their ATS software to enable the integration.",{"type":17,"tag":68,"props":182935,"children":182937},{"id":182936},"how-the-assessment-flow-works",[182938],{"type":17,"tag":48,"props":182939,"children":182940},{},[182941],{"type":23,"value":182942},"How the assessment flow works",{"type":17,"tag":29,"props":182944,"children":182945},{},[182946],{"type":23,"value":182947},"Here's how the assessment flow works:",{"type":17,"tag":6154,"props":182949,"children":182950},{},[182951,182961,182971,182981,182997,183007,183024],{"type":17,"tag":84,"props":182952,"children":182953},{},[182954,182959],{"type":17,"tag":48,"props":182955,"children":182956},{},[182957],{"type":23,"value":182958},"Package Configuration",{"type":23,"value":182960},": You create assessment packages via the Unified API (w/ assessment packages API endpoints)",{"type":17,"tag":84,"props":182962,"children":182963},{},[182964,182969],{"type":17,"tag":48,"props":182965,"children":182966},{},[182967],{"type":23,"value":182968},"ATS Lists Packages",{"type":23,"value":182970},": The ATS queries your available packages",{"type":17,"tag":84,"props":182972,"children":182973},{},[182974,182979],{"type":17,"tag":48,"props":182975,"children":182976},{},[182977],{"type":23,"value":182978},"Recruiter Orders Assessment",{"type":23,"value":182980},": A recruiter selects a package and orders an assessment for a candidate",{"type":17,"tag":84,"props":182982,"children":182983},{},[182984,182989,182990,182995],{"type":17,"tag":48,"props":182985,"children":182986},{},[182987],{"type":23,"value":182988},"Webhook Notification",{"type":23,"value":49318},{"type":17,"tag":133,"props":182991,"children":182993},{"href":42620,"rel":182992},[214],[182994],{"type":23,"value":217},{"type":23,"value":182996}," sends you a webhook with the order details",{"type":17,"tag":84,"props":182998,"children":182999},{},[183000,183005],{"type":17,"tag":48,"props":183001,"children":183002},{},[183003],{"type":23,"value":183004},"Process Assessment",{"type":23,"value":183006},": You send the assessment to the candidate and process their response",{"type":17,"tag":84,"props":183008,"children":183009},{},[183010,183015,183017,183022],{"type":17,"tag":48,"props":183011,"children":183012},{},[183013],{"type":23,"value":183014},"Submit Results",{"type":23,"value":183016},": You submit the assessment results back to ",{"type":17,"tag":133,"props":183018,"children":183020},{"href":42620,"rel":183019},[214],[183021],{"type":23,"value":217},{"type":23,"value":183023}," (w/ assessment order update API endpoint)",{"type":17,"tag":84,"props":183025,"children":183026},{},[183027,183032],{"type":17,"tag":48,"props":183028,"children":183029},{},[183030],{"type":23,"value":183031},"Results in ATS",{"type":23,"value":183033},": The results appear in the ATS for the recruiter to review",{"type":17,"tag":68,"props":183035,"children":183037},{"id":183036},"api-endpoints",[183038],{"type":23,"value":183039},"API Endpoints",{"type":17,"tag":239,"props":183041,"children":183043},{"id":183042},"assessment-packages",[183044],{"type":23,"value":53033},{"type":17,"tag":29,"props":183046,"children":183047},{},[183048],{"type":23,"value":183049},"Manage your available assessment packages:",{"type":17,"tag":80,"props":183051,"children":183052},{},[183053,183064,183075,183086,183097],{"type":17,"tag":84,"props":183054,"children":183055},{},[183056,183062],{"type":17,"tag":6121,"props":183057,"children":183059},{"className":183058},[],[183060],{"type":23,"value":183061},"POST /assessment/{connection_id}/package",{"type":23,"value":183063}," - Create a new package",{"type":17,"tag":84,"props":183065,"children":183066},{},[183067,183073],{"type":17,"tag":6121,"props":183068,"children":183070},{"className":183069},[],[183071],{"type":23,"value":183072},"GET /assessment/{connection_id}/package",{"type":23,"value":183074}," - List all packages",{"type":17,"tag":84,"props":183076,"children":183077},{},[183078,183084],{"type":17,"tag":6121,"props":183079,"children":183081},{"className":183080},[],[183082],{"type":23,"value":183083},"GET /assessment/{connection_id}/package/{id}",{"type":23,"value":183085}," - Get a specific package",{"type":17,"tag":84,"props":183087,"children":183088},{},[183089,183095],{"type":17,"tag":6121,"props":183090,"children":183092},{"className":183091},[],[183093],{"type":23,"value":183094},"PUT /assessment/{connection_id}/package/{id}",{"type":23,"value":183096}," - Update a package",{"type":17,"tag":84,"props":183098,"children":183099},{},[183100,183106],{"type":17,"tag":6121,"props":183101,"children":183103},{"className":183102},[],[183104],{"type":23,"value":183105},"DELETE /assessment/{connection_id}/package/{id}",{"type":23,"value":183107}," - Delete a package",{"type":17,"tag":239,"props":183109,"children":183111},{"id":183110},"assessment-orders",[183112],{"type":23,"value":53046},{"type":17,"tag":29,"props":183114,"children":183115},{},[183116],{"type":23,"value":183117},"Update assessment order results:",{"type":17,"tag":80,"props":183119,"children":183120},{},[183121],{"type":17,"tag":84,"props":183122,"children":183123},{},[183124,183130],{"type":17,"tag":6121,"props":183125,"children":183127},{"className":183126},[],[183128],{"type":23,"value":183129},"PUT /assessment/{connection_id}/order/{id}",{"type":23,"value":183131}," - Update an order with results",{"type":17,"tag":68,"props":183133,"children":183134},{"id":149851},[183135],{"type":23,"value":149854},{"type":17,"tag":29,"props":183137,"children":183138},{},[183139,183141,183146],{"type":23,"value":183140},"When an assessment order is created, you'll receive a webhook with an ",{"type":17,"tag":6121,"props":183142,"children":183144},{"className":183143},[],[183145],{"type":23,"value":149865},{"type":23,"value":149867},{"type":17,"tag":6893,"props":183148,"children":183151},{"className":183149,"code":183150,"language":22503,"meta":7},[22501],"{\n  \"id\": \"123\",\n  \"package_id\": \"your_package_id\",\n  \"candidate\": {\n    \"candidate_id\": \"candidate_456\",\n    \"email\": \"candidate@example.com\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"phone\": \"+1 123 456 7890\"\n  },\n  \"application\": {\n    \"id\": \"application_789\"\n  },\n  \"job\": {\n    \"id\": \"job_012\",\n    \"name\": \"Software Engineer\",\n  },\n  \"status\": \"OPEN\"\n}\n",[183152],{"type":17,"tag":6121,"props":183153,"children":183154},{"__ignoreMap":7},[183155],{"type":23,"value":183150},{"type":17,"tag":68,"props":183157,"children":183159},{"id":183158},"submitting-results",[183160],{"type":23,"value":183161},"Submitting Results",{"type":17,"tag":29,"props":183163,"children":183164},{},[183165],{"type":23,"value":183166},"Once a candidate completes an assessment, submit the results using the update order endpoint:",{"type":17,"tag":6893,"props":183168,"children":183170},{"className":183169,"code":150080,"language":48432,"meta":7},[48430],[183171],{"type":17,"tag":6121,"props":183172,"children":183173},{"__ignoreMap":7},[183174],{"type":23,"value":150080},{"type":17,"tag":29,"props":183176,"children":183177},{},[183178],{"type":17,"tag":48,"props":183179,"children":183180},{},[183181],{"type":23,"value":183182},"Example Request:",{"type":17,"tag":6893,"props":183184,"children":183187},{"className":183185,"code":183186,"language":22503,"meta":7},[22501],"{\n  \"status\": \"COMPLETED\",\n  \"score\": 85,\n  \"max_score\": 100,\n  \"result_url\": \"\u003Chttps://your-platform.com/results/order_123>\",\n  \"completed_at\": \"2024-01-15T10:30:00Z\",\n  \"attributes\": [\n    {\n      \"type\": \"TEXT\",\n      \"label\": \"Overall Assessment\",\n      \"value\": \"Strong candidate\"\n    }\n  ]\n}\n",[183188],{"type":17,"tag":6121,"props":183189,"children":183190},{"__ignoreMap":7},[183191],{"type":23,"value":183186},{"type":17,"tag":29,"props":183193,"children":183194},{},[183195],{"type":23,"value":183196},"The results will then be written back to the ATS system, where recruiters can view them directly.",{"type":17,"tag":68,"props":183198,"children":183200},{"id":183199},"best-practices",[183201],{"type":23,"value":183202},"Best Practices",{"type":17,"tag":29,"props":183204,"children":183205},{},[183206],{"type":23,"value":183207},"Unlike traditional integrations that rely on polling or status changes, the Assessment API enables real-time, recruiter-initiated workflows directly within ATS platforms.",{"type":17,"tag":6154,"props":183209,"children":183210},{},[183211,183221,183231,183241],{"type":17,"tag":84,"props":183212,"children":183213},{},[183214,183219],{"type":17,"tag":48,"props":183215,"children":183216},{},[183217],{"type":23,"value":183218},"Secure Your API Key",{"type":23,"value":183220},": Treat your Partner API Key as sensitive information. Only share it with trusted end-customers.",{"type":17,"tag":84,"props":183222,"children":183223},{},[183224,183229],{"type":17,"tag":48,"props":183225,"children":183226},{},[183227],{"type":23,"value":183228},"Handle Webhooks Reliably",{"type":23,"value":183230},": Implement retry logic and idempotency checks in your webhook handler to ensure you don't miss or duplicate orders.",{"type":17,"tag":84,"props":183232,"children":183233},{},[183234,183239],{"type":17,"tag":48,"props":183235,"children":183236},{},[183237],{"type":23,"value":183238},"Validate Webhook Data",{"type":23,"value":183240},": Always validate the webhook payload to ensure it contains the expected candidate and job information before processing.",{"type":17,"tag":84,"props":183242,"children":183243},{},[183244,183249,183251,183256],{"type":17,"tag":48,"props":183245,"children":183246},{},[183247],{"type":23,"value":183248},"Monitor Order Status",{"type":23,"value":183250},": Track the status of assessment orders and handle cancellations appropriately when the ",{"type":17,"tag":6121,"props":183252,"children":183254},{"className":183253},[],[183255],{"type":23,"value":109221},{"type":23,"value":183257}," event webhook is received.",{"type":17,"tag":68,"props":183259,"children":183261},{"id":183260},"support",[183262],{"type":23,"value":183263},"Support",{"type":17,"tag":29,"props":183265,"children":183266},{},[183267,183269,183275],{"type":23,"value":183268},"For questions or issues with the Unified Assessment API, please contact our support team or refer to the ",{"type":17,"tag":133,"props":183270,"children":183272},{"href":43547,"rel":183271},[214],[183273],{"type":23,"value":183274},"Unified.to Documentation",{"type":23,"value":54},{"type":17,"tag":29,"props":183277,"children":183278},{},[183279],{"type":23,"value":183280},"What is an assessment API for recruiting platforms?",{"type":17,"tag":29,"props":183282,"children":183283},{},[183284],{"type":23,"value":183285},"An assessment API allows providers to integrate directly with ATS platforms so recruiters can request, manage, and review candidate assessments without leaving the ATS. It enables real-time order handling and structured results returned to the same system.",{"type":17,"tag":29,"props":183287,"children":183288},{},[183289],{"type":23,"value":183290},"How do assessment providers integrate with ATS platforms?",{"type":17,"tag":29,"props":183292,"children":183293},{},[183294],{"type":23,"value":183295},"Assessment providers integrate with ATS platforms either through embedded assessment APIs or through status-based triggers. Embedded integrations allow recruiters to select and order assessments directly inside the ATS, while triggered integrations operate based on application state changes.",{"title":7,"searchDepth":1629,"depth":1629,"links":183297},[183298,183299,183300,183301,183306,183309,183314,183315,183316,183323,183324,183328,183329,183330,183331],{"id":52312,"depth":1629,"text":182057},{"id":182077,"depth":1629,"text":182080},{"id":182088,"depth":1629,"text":182091},{"id":182172,"depth":1629,"text":52991,"children":183302},[183303,183304,183305],{"id":182197,"depth":1635,"text":182200},{"id":182239,"depth":1635,"text":182242},{"id":182280,"depth":1635,"text":182286},{"id":182317,"depth":1629,"text":182320,"children":183307},[183308],{"id":182351,"depth":1635,"text":182354},{"id":182390,"depth":1629,"text":182396,"children":183310},[183311,183312,183313],{"id":182447,"depth":1635,"text":182450},{"id":182530,"depth":1635,"text":182533},{"id":182585,"depth":1635,"text":182588},{"id":182614,"depth":1629,"text":182617},{"id":182643,"depth":1629,"text":182646},{"id":182698,"depth":1629,"text":182701,"children":183317},[183318,183319,183320,183321,183322],{"id":182704,"depth":1635,"text":182707},{"id":182771,"depth":1635,"text":182774},{"id":182782,"depth":1635,"text":182785},{"id":182827,"depth":1635,"text":182830},{"id":182872,"depth":1635,"text":182875},{"id":182936,"depth":1629,"text":182942},{"id":183036,"depth":1629,"text":183039,"children":183325},[183326,183327],{"id":183042,"depth":1635,"text":53033},{"id":183110,"depth":1635,"text":53046},{"id":149851,"depth":1629,"text":149854},{"id":183158,"depth":1629,"text":183161},{"id":183199,"depth":1629,"text":183202},{"id":183260,"depth":1629,"text":183263},"content:blog:unified_assessment_api_embed_assessments_inside_ats_platforms.md","blog/unified_assessment_api_embed_assessments_inside_ats_platforms.md","blog/unified_assessment_api_embed_assessments_inside_ats_platforms",{"_path":183336,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":183337,"description":183338,"img":183339,"date":183340,"tag":12,"body":183341,"_type":1677,"_id":184308,"_source":1679,"_file":184309,"_stem":184310,"_extension":1682},"/blog/ticketing_api_integration_tickets_customers_notes_and_categories_across_support_platforms","Ticketing API Integration: Tickets, Customers, Notes, and Categories Across Support Platforms","Support systems sit at the intersection of customer trust, operational efficiency, and product quality. Tickets arrive from multiple channels, move through...","https://s3.us-east-2.amazonaws.com/unified-article-images/ticketing_api_integration_tickets_customers_notes_and_categories_across_support_platforms-icon.png","2026-02-09T21:00:00.000Z",{"type":14,"children":183342,"toc":184270},[183343,183348,183351,183358,183363,183371,183376,183382,183387,183392,183415,183420,183425,183435,183439,183467,183479,183485,183490,183537,183542,183548,183553,183559,183569,183575,183580,183603,183619,183625,183651,183655,183660,183678,183686,183691,183714,183719,183723,183728,183745,183750,183754,183759,183776,183780,183785,183802,183808,183813,183836,183848,183853,183859,183863,183868,183889,183894,183900,183918,183923,183927,183932,183936,183941,183947,183965,183971,183976,183982,183988,183993,183999,184004,184010,184015,184021,184026,184032,184055,184060,184066,184070,184093,184099,184126,184132,184137,184147,184163,184168,184184,184189,184193,184201,184206,184213,184218,184226,184231,184239,184244,184252,184257,184265],{"type":17,"tag":18,"props":183344,"children":183346},{"id":183345},"ticketing-api-integration-tickets-customers-notes-and-categories-across-support-platforms",[183347],{"type":23,"value":183337},{"type":17,"tag":25,"props":183349,"children":183350},{},[],{"type":17,"tag":29,"props":183352,"children":183353},{},[183354],{"type":17,"tag":33,"props":183355,"children":183356},{},[183357],{"type":23,"value":182031},{"type":17,"tag":29,"props":183359,"children":183360},{},[183361],{"type":23,"value":183362},"Support systems sit at the intersection of customer trust, operational efficiency, and product quality. Tickets arrive from multiple channels, move through triage and resolution, and accumulate long comment threads over time. When that data is fragmented across platforms, support teams lose context, analytics drift, and automation becomes brittle.",{"type":17,"tag":29,"props":183364,"children":183365},{},[183366,183370],{"type":17,"tag":133,"props":183367,"children":183368},{"href":31987},[183369],{"type":23,"value":150656},{"type":23,"value":165348},{"type":17,"tag":29,"props":183372,"children":183373},{},[183374],{"type":23,"value":183375},"In this guide, we'll cover what a Ticketing API actually does, which objects matter in practice, how ticket lifecycles behave, how updates are delivered in real time, and how Unified's Ticketing API fits alongside CRM, Call Center, Messaging, and Marketing within the Unified platform.",{"type":17,"tag":68,"props":183377,"children":183379},{"id":183378},"introduction-to-ticketing-api-integrations",[183380],{"type":23,"value":183381},"Introduction to Ticketing API Integrations",{"type":17,"tag":29,"props":183383,"children":183384},{},[183385],{"type":23,"value":183386},"Ticketing systems such as Zendesk, Freshdesk, Intercom, ServiceNow, Jira Service Management, Gorgias, and HubSpot Service Hub manage customer issues as structured records—tickets, customers, comments, and classifications.",{"type":17,"tag":29,"props":183388,"children":183389},{},[183390],{"type":23,"value":183391},"Each platform exposes its own API conventions, status models, and event mechanisms. Products that support multiple help desks typically face:",{"type":17,"tag":80,"props":183393,"children":183394},{},[183395,183400,183405,183410],{"type":17,"tag":84,"props":183396,"children":183397},{},[183398],{"type":23,"value":183399},"Inconsistent ticket status definitions",{"type":17,"tag":84,"props":183401,"children":183402},{},[183403],{"type":23,"value":183404},"Different customer and requester representations",{"type":17,"tag":84,"props":183406,"children":183407},{},[183408],{"type":23,"value":183409},"Provider-specific comment and note handling",{"type":17,"tag":84,"props":183411,"children":183412},{},[183413],{"type":23,"value":183414},"Uneven event and webhook coverage",{"type":17,"tag":29,"props":183416,"children":183417},{},[183418],{"type":23,"value":183419},"A Ticketing API provides a consistent way to read and write support data across platforms without maintaining separate integrations for each provider.",{"type":17,"tag":68,"props":183421,"children":183422},{"id":31977},[183423],{"type":23,"value":183424},"What Is a Ticketing API?",{"type":17,"tag":29,"props":183426,"children":183427},{},[183428,183429,183433],{"type":23,"value":9619},{"type":17,"tag":48,"props":183430,"children":183431},{},[183432],{"type":23,"value":150656},{"type":23,"value":183434}," allows applications to programmatically access and manage customer support data.",{"type":17,"tag":29,"props":183436,"children":183437},{},[183438],{"type":23,"value":167214},{"type":17,"tag":80,"props":183440,"children":183441},{},[183442,183447,183452,183457,183462],{"type":17,"tag":84,"props":183443,"children":183444},{},[183445],{"type":23,"value":183446},"Creating and updating support tickets",{"type":17,"tag":84,"props":183448,"children":183449},{},[183450],{"type":23,"value":183451},"Retrieving ticket lists and ticket details",{"type":17,"tag":84,"props":183453,"children":183454},{},[183455],{"type":23,"value":183456},"Managing support customers (end users)",{"type":17,"tag":84,"props":183458,"children":183459},{},[183460],{"type":23,"value":183461},"Adding notes or comments to tickets",{"type":17,"tag":84,"props":183463,"children":183464},{},[183465],{"type":23,"value":183466},"Managing ticket categories and classifications",{"type":17,"tag":29,"props":183468,"children":183469},{},[183470,183472,183477],{"type":23,"value":183471},"Ticketing APIs focus on ",{"type":17,"tag":48,"props":183473,"children":183474},{},[183475],{"type":23,"value":183476},"asynchronous support records",{"type":23,"value":183478},". They do not manage revenue pipelines, telephony, live chat streams, or marketing campaigns.",{"type":17,"tag":68,"props":183480,"children":183482},{"id":183481},"ticketing-api-vs-crm-call-center-messaging-and-marketing",[183483],{"type":23,"value":183484},"Ticketing API vs CRM, Call Center, Messaging, and Marketing",{"type":17,"tag":29,"props":183486,"children":183487},{},[183488],{"type":23,"value":183489},"Unified treats Ticketing as a dedicated category with clear boundaries.",{"type":17,"tag":80,"props":183491,"children":183492},{},[183493,183501,183509,183518,183527],{"type":17,"tag":84,"props":183494,"children":183495},{},[183496,183500],{"type":17,"tag":48,"props":183497,"children":183498},{},[183499],{"type":23,"value":173008},{"type":23,"value":173010},{"type":17,"tag":84,"props":183502,"children":183503},{},[183504,183508],{"type":17,"tag":48,"props":183505,"children":183506},{},[183507],{"type":23,"value":173018},{"type":23,"value":173020},{"type":17,"tag":84,"props":183510,"children":183511},{},[183512,183516],{"type":17,"tag":48,"props":183513,"children":183514},{},[183515],{"type":23,"value":180034},{"type":23,"value":183517}," manage calls, recordings, and voice-related events.",{"type":17,"tag":84,"props":183519,"children":183520},{},[183521,183525],{"type":17,"tag":48,"props":183522,"children":183523},{},[183524],{"type":23,"value":173028},{"type":23,"value":183526}," manage channels, messages, and real-time chat activity.",{"type":17,"tag":84,"props":183528,"children":183529},{},[183530,183535],{"type":17,"tag":48,"props":183531,"children":183532},{},[183533],{"type":23,"value":183534},"Marketing and Advertising APIs",{"type":23,"value":183536}," manage campaigns, audiences, and performance metrics.",{"type":17,"tag":29,"props":183538,"children":183539},{},[183540],{"type":23,"value":183541},"Ticketing data can be combined with these categories to build customer context, but Ticketing itself is focused strictly on issue tracking and resolution.",{"type":17,"tag":68,"props":183543,"children":183545},{"id":183544},"real-time-access-to-ticketing-data",[183546],{"type":23,"value":183547},"Real-Time Access to Ticketing Data",{"type":17,"tag":29,"props":183549,"children":183550},{},[183551],{"type":23,"value":183552},"Support data changes continuously. Tickets are created, reassigned, updated, commented on, and eventually closed.",{"type":17,"tag":239,"props":183554,"children":183556},{"id":183555},"live-reads-from-source-systems",[183557],{"type":23,"value":183558},"Live Reads from Source Systems",{"type":17,"tag":29,"props":183560,"children":183561},{},[183562,183564,183568],{"type":23,"value":183563},"Unified routes every Ticketing API request directly to the underlying platform. There is no cached copy of tickets or customers. Reads always reflect the current state of the source system, subject to provider ",{"type":17,"tag":133,"props":183565,"children":183566},{"href":135},[183567],{"type":23,"value":138},{"type":23,"value":171686},{"type":17,"tag":239,"props":183570,"children":183572},{"id":183571},"update-delivery-native-virtual-or-polling",[183573],{"type":23,"value":183574},"Update Delivery: Native, Virtual, or Polling",{"type":17,"tag":29,"props":183576,"children":183577},{},[183578],{"type":23,"value":183579},"Update delivery depends on provider capabilities:",{"type":17,"tag":80,"props":183581,"children":183582},{},[183583,183593,183598],{"type":17,"tag":84,"props":183584,"children":183585},{},[183586,183587,183591],{"type":23,"value":119374},{"type":17,"tag":133,"props":183588,"children":183589},{"href":4999},[183590],{"type":23,"value":5002},{"type":23,"value":183592}," are used when the platform supports them.",{"type":17,"tag":84,"props":183594,"children":183595},{},[183596],{"type":23,"value":183597},"Virtual webhooks are used when providers lack native event support.",{"type":17,"tag":84,"props":183599,"children":183600},{},[183601],{"type":23,"value":183602},"Polling is available for objects or providers without webhook coverage.",{"type":17,"tag":29,"props":183604,"children":183605},{},[183606,183608,183612,183613,183617],{"type":23,"value":183607},"Unified delivers ",{"type":17,"tag":48,"props":183609,"children":183610},{},[183611],{"type":23,"value":109207},{"type":23,"value":34435},{"type":17,"tag":48,"props":183614,"children":183615},{},[183616],{"type":23,"value":109214},{"type":23,"value":183618}," events. Ticket closure is treated as an update because it changes status and closed_at fields.",{"type":17,"tag":68,"props":183620,"children":183622},{"id":183621},"core-ticketing-data-models",[183623],{"type":23,"value":183624},"Core Ticketing Data Models",{"type":17,"tag":29,"props":183626,"children":183627},{},[183628,183630,183634,183635,183639,183640,183644,183645,183649],{"type":23,"value":183629},"Unified normalizes ticketing data into four objects: ",{"type":17,"tag":48,"props":183631,"children":183632},{},[183633],{"type":23,"value":28124},{"type":23,"value":11826},{"type":17,"tag":48,"props":183636,"children":183637},{},[183638],{"type":23,"value":47609},{"type":23,"value":11826},{"type":17,"tag":48,"props":183641,"children":183642},{},[183643],{"type":23,"value":150919},{"type":23,"value":12561},{"type":17,"tag":48,"props":183646,"children":183647},{},[183648],{"type":23,"value":7247},{"type":23,"value":183650},". Provider support varies, but the behavior is consistent.",{"type":17,"tag":239,"props":183652,"children":183653},{"id":32523},[183654],{"type":23,"value":32740},{"type":17,"tag":29,"props":183656,"children":183657},{},[183658],{"type":23,"value":183659},"Tickets represent individual support issues.",{"type":17,"tag":80,"props":183661,"children":183662},{},[183663,183668,183673],{"type":17,"tag":84,"props":183664,"children":183665},{},[183666],{"type":23,"value":183667},"Support create, list, retrieve, update, and remove operations.",{"type":17,"tag":84,"props":183669,"children":183670},{},[183671],{"type":23,"value":183672},"Include subject, description, customer linkage, tags, priority, and routing fields.",{"type":17,"tag":84,"props":183674,"children":183675},{},[183676],{"type":23,"value":183677},"Track lifecycle timestamps such as created_at, updated_at, and closed_at.",{"type":17,"tag":29,"props":183679,"children":183680},{},[183681],{"type":17,"tag":48,"props":183682,"children":183683},{},[183684],{"type":23,"value":183685},"Status behavior",{"type":17,"tag":29,"props":183687,"children":183688},{},[183689],{"type":23,"value":183690},"Unified normalizes ticket status into two states:",{"type":17,"tag":80,"props":183692,"children":183693},{},[183694,183704],{"type":17,"tag":84,"props":183695,"children":183696},{},[183697,183702],{"type":17,"tag":48,"props":183698,"children":183699},{},[183700],{"type":23,"value":183701},"ACTIVE",{"type":23,"value":183703}," — tickets that still require action",{"type":17,"tag":84,"props":183705,"children":183706},{},[183707,183712],{"type":17,"tag":48,"props":183708,"children":183709},{},[183710],{"type":23,"value":183711},"CLOSED",{"type":23,"value":183713}," — tickets that are completed or archived",{"type":17,"tag":29,"props":183715,"children":183716},{},[183717],{"type":23,"value":183718},"Underlying systems often expose more granular statuses (open, pending, resolved, spam, archived). These are normalized into ACTIVE or CLOSED while preserving provider-specific values where needed.",{"type":17,"tag":239,"props":183720,"children":183721},{"id":70514},[183722],{"type":23,"value":32745},{"type":17,"tag":29,"props":183724,"children":183725},{},[183726],{"type":23,"value":183727},"Customers represent the requester or end user.",{"type":17,"tag":80,"props":183729,"children":183730},{},[183731,183735,183740],{"type":17,"tag":84,"props":183732,"children":183733},{},[183734],{"type":23,"value":183667},{"type":17,"tag":84,"props":183736,"children":183737},{},[183738],{"type":23,"value":183739},"Store name, email addresses, phone numbers, and tags.",{"type":17,"tag":84,"props":183741,"children":183742},{},[183743],{"type":23,"value":183744},"Do not have an open/closed lifecycle.",{"type":17,"tag":29,"props":183746,"children":183747},{},[183748],{"type":23,"value":183749},"Customer records are scoped to ticketing. They are not CRM contacts by default.",{"type":17,"tag":239,"props":183751,"children":183752},{"id":6698},[183753],{"type":23,"value":6701},{"type":17,"tag":29,"props":183755,"children":183756},{},[183757],{"type":23,"value":183758},"Notes represent comments or internal messages attached to tickets.",{"type":17,"tag":80,"props":183760,"children":183761},{},[183762,183766,183771],{"type":17,"tag":84,"props":183763,"children":183764},{},[183765],{"type":23,"value":183667},{"type":17,"tag":84,"props":183767,"children":183768},{},[183769],{"type":23,"value":183770},"Link to a ticket via ticket_id and often to an author via user_id.",{"type":17,"tag":84,"props":183772,"children":183773},{},[183774],{"type":23,"value":183775},"Carry free-text content that reflects the support conversation.",{"type":17,"tag":239,"props":183777,"children":183778},{"id":151751},[183779],{"type":23,"value":32754},{"type":17,"tag":29,"props":183781,"children":183782},{},[183783],{"type":23,"value":183784},"Categories classify tickets.",{"type":17,"tag":80,"props":183786,"children":183787},{},[183788,183792,183797],{"type":17,"tag":84,"props":183789,"children":183790},{},[183791],{"type":23,"value":183667},{"type":17,"tag":84,"props":183793,"children":183794},{},[183795],{"type":23,"value":183796},"Support hierarchies via parent_id and activation via is_active.",{"type":17,"tag":84,"props":183798,"children":183799},{},[183800],{"type":23,"value":183801},"Availability varies by provider.",{"type":17,"tag":68,"props":183803,"children":183805},{"id":183804},"identity-and-ownership-in-ticketing",[183806],{"type":23,"value":183807},"Identity and Ownership in Ticketing",{"type":17,"tag":29,"props":183809,"children":183810},{},[183811],{"type":23,"value":183812},"Ticketing identity is intentionally scoped.",{"type":17,"tag":80,"props":183814,"children":183815},{},[183816,183826,183831],{"type":17,"tag":84,"props":183817,"children":183818},{},[183819,183824],{"type":17,"tag":6121,"props":183820,"children":183822},{"className":183821},[],[183823],{"type":23,"value":108877},{"type":23,"value":183825}," links a Ticket to a ticketing Customer record.",{"type":17,"tag":84,"props":183827,"children":183828},{},[183829],{"type":23,"value":183830},"Ticketing Customers are not CRM Contacts.",{"type":17,"tag":84,"props":183832,"children":183833},{},[183834],{"type":23,"value":183835},"Matching customers across systems is handled at the application level, commonly via email.",{"type":17,"tag":29,"props":183837,"children":183838},{},[183839,183841,183846],{"type":23,"value":183840},"Agent identity is represented through ",{"type":17,"tag":6121,"props":183842,"children":183844},{"className":183843},[],[183845],{"type":23,"value":62582},{"type":23,"value":183847}," fields on Tickets and Notes. These reference employees from Unified's HR/Directory category rather than maintaining a separate agent model inside ticketing.",{"type":17,"tag":29,"props":183849,"children":183850},{},[183851],{"type":23,"value":183852},"Ticketing objects do not reference deals, campaigns, calls, or messaging threads.",{"type":17,"tag":68,"props":183854,"children":183856},{"id":183855},"updates-and-provider-variability",[183857],{"type":23,"value":183858},"Updates and Provider Variability",{"type":17,"tag":239,"props":183860,"children":183861},{"id":179243},[183862],{"type":23,"value":179246},{"type":17,"tag":29,"props":183864,"children":183865},{},[183866],{"type":23,"value":183867},"Unified delivers two event types:",{"type":17,"tag":80,"props":183869,"children":183870},{},[183871,183880],{"type":17,"tag":84,"props":183872,"children":183873},{},[183874,183878],{"type":17,"tag":48,"props":183875,"children":183876},{},[183877],{"type":23,"value":166495},{"type":23,"value":183879}," — fires only when a new record is created",{"type":17,"tag":84,"props":183881,"children":183882},{},[183883,183887],{"type":17,"tag":48,"props":183884,"children":183885},{},[183886],{"type":23,"value":166500},{"type":23,"value":183888}," — fires for both creation and subsequent changes",{"type":17,"tag":29,"props":183890,"children":183891},{},[183892],{"type":23,"value":183893},"Closing a ticket triggers an updated event because it modifies status and closed_at.",{"type":17,"tag":239,"props":183895,"children":183897},{"id":183896},"provider-differences",[183898],{"type":23,"value":183899},"Provider Differences",{"type":17,"tag":80,"props":183901,"children":183902},{},[183903,183908,183913],{"type":17,"tag":84,"props":183904,"children":183905},{},[183906],{"type":23,"value":183907},"Some providers support native webhooks for certain objects.",{"type":17,"tag":84,"props":183909,"children":183910},{},[183911],{"type":23,"value":183912},"Many rely on virtual webhooks for tickets and notes.",{"type":17,"tag":84,"props":183914,"children":183915},{},[183916],{"type":23,"value":183917},"Some objects require polling via list endpoints.",{"type":17,"tag":29,"props":183919,"children":183920},{},[183921],{"type":23,"value":183922},"Unified abstracts this complexity so applications receive consistent event payloads regardless of the provider.",{"type":17,"tag":68,"props":183924,"children":183925},{"id":171204},[183926],{"type":23,"value":171207},{"type":17,"tag":29,"props":183928,"children":183929},{},[183930],{"type":23,"value":183931},"Support data often contains sensitive information. Unified's architecture is designed to minimize exposure.",{"type":17,"tag":239,"props":183933,"children":183934},{"id":17064},[183935],{"type":23,"value":53239},{"type":17,"tag":29,"props":183937,"children":183938},{},[183939],{"type":23,"value":183940},"Unified does not store ticketing payloads at rest. All requests are pass-through to the source platform, processed in memory, and returned immediately.",{"type":17,"tag":239,"props":183942,"children":183944},{"id":183943},"encryption-and-access-controls",[183945],{"type":23,"value":183946},"Encryption and Access Controls",{"type":17,"tag":80,"props":183948,"children":183949},{},[183950,183955,183960],{"type":17,"tag":84,"props":183951,"children":183952},{},[183953],{"type":23,"value":183954},"TLS 1.2+ for data in transit",{"type":17,"tag":84,"props":183956,"children":183957},{},[183958],{"type":23,"value":183959},"Encrypted operational metadata",{"type":17,"tag":84,"props":183961,"children":183962},{},[183963],{"type":23,"value":183964},"Optional customer-managed secrets for credentials",{"type":17,"tag":239,"props":183966,"children":183968},{"id":183967},"log-retention",[183969],{"type":23,"value":183970},"Log Retention",{"type":17,"tag":29,"props":183972,"children":183973},{},[183974],{"type":23,"value":183975},"Unified retains operational logs for platform observability and troubleshooting, with retention windows aligned to plan tier. Ticketing payloads are not persisted as data stores.",{"type":17,"tag":68,"props":183977,"children":183979},{"id":183978},"common-ticketing-api-use-cases",[183980],{"type":23,"value":183981},"Common Ticketing API Use Cases",{"type":17,"tag":239,"props":183983,"children":183985},{"id":183984},"support-analytics",[183986],{"type":23,"value":183987},"Support Analytics",{"type":17,"tag":29,"props":183989,"children":183990},{},[183991],{"type":23,"value":183992},"Aggregate ticket volume, resolution time, and category trends across platforms.",{"type":17,"tag":239,"props":183994,"children":183996},{"id":183995},"unified-customer-context",[183997],{"type":23,"value":183998},"Unified Customer Context",{"type":17,"tag":29,"props":184000,"children":184001},{},[184002],{"type":23,"value":184003},"Present a complete view of a customer's support history across multiple tools.",{"type":17,"tag":239,"props":184005,"children":184007},{"id":184006},"ai-support-assistants",[184008],{"type":23,"value":184009},"AI Support Assistants",{"type":17,"tag":29,"props":184011,"children":184012},{},[184013],{"type":23,"value":184014},"Analyze historical tickets and notes to classify issues, suggest responses, or summarize prior interactions.",{"type":17,"tag":239,"props":184016,"children":184018},{"id":184017},"ticket-routing-and-automation",[184019],{"type":23,"value":184020},"Ticket Routing and Automation",{"type":17,"tag":29,"props":184022,"children":184023},{},[184024],{"type":23,"value":184025},"Create and update tickets programmatically to support routing, escalation, and workflow automation.",{"type":17,"tag":68,"props":184027,"children":184029},{"id":184028},"constraints-to-design-for",[184030],{"type":23,"value":184031},"Constraints to Design For",{"type":17,"tag":80,"props":184033,"children":184034},{},[184035,184040,184045,184050],{"type":17,"tag":84,"props":184036,"children":184037},{},[184038],{"type":23,"value":184039},"Write support varies by provider and object.",{"type":17,"tag":84,"props":184041,"children":184042},{},[184043],{"type":23,"value":184044},"Status normalization is intentionally coarse.",{"type":17,"tag":84,"props":184046,"children":184047},{},[184048],{"type":23,"value":184049},"Category support is provider-dependent.",{"type":17,"tag":84,"props":184051,"children":184052},{},[184053],{"type":23,"value":184054},"Deletion events depend on webhook capabilities.",{"type":17,"tag":29,"props":184056,"children":184057},{},[184058],{"type":23,"value":184059},"These constraints reflect the realities of the underlying platforms and are surfaced transparently through the unified model.",{"type":17,"tag":68,"props":184061,"children":184063},{"id":184062},"build-vs-buy-ticketing-integrations",[184064],{"type":23,"value":184065},"Build vs Buy Ticketing Integrations",{"type":17,"tag":239,"props":184067,"children":184068},{"id":165021},[184069],{"type":23,"value":165024},{"type":17,"tag":80,"props":184071,"children":184072},{},[184073,184078,184083,184088],{"type":17,"tag":84,"props":184074,"children":184075},{},[184076],{"type":23,"value":184077},"Multiple help-desk APIs to maintain",{"type":17,"tag":84,"props":184079,"children":184080},{},[184081],{"type":23,"value":184082},"Provider-specific status logic",{"type":17,"tag":84,"props":184084,"children":184085},{},[184086],{"type":23,"value":184087},"Custom polling and retry handling",{"type":17,"tag":84,"props":184089,"children":184090},{},[184091],{"type":23,"value":184092},"Ongoing schema drift",{"type":17,"tag":239,"props":184094,"children":184096},{"id":184095},"using-a-unified-ticketing-api",[184097],{"type":23,"value":184098},"Using a Unified Ticketing API",{"type":17,"tag":80,"props":184100,"children":184101},{},[184102,184107,184112,184117,184121],{"type":17,"tag":84,"props":184103,"children":184104},{},[184105],{"type":23,"value":184106},"One category-scoped API surface",{"type":17,"tag":84,"props":184108,"children":184109},{},[184110],{"type":23,"value":184111},"Normalized Tickets, Customers, Notes, and Categories",{"type":17,"tag":84,"props":184113,"children":184114},{},[184115],{"type":23,"value":184116},"Provider-aware event delivery",{"type":17,"tag":84,"props":184118,"children":184119},{},[184120],{"type":23,"value":180731},{"type":17,"tag":84,"props":184122,"children":184123},{},[184124],{"type":23,"value":184125},"Usage-based pricing aligned with volume",{"type":17,"tag":68,"props":184127,"children":184129},{"id":184128},"build-support-integrations-with-clear-boundaries",[184130],{"type":23,"value":184131},"Build Support Integrations with Clear Boundaries",{"type":17,"tag":29,"props":184133,"children":184134},{},[184135],{"type":23,"value":184136},"If your product relies on support data across multiple platforms, maintaining separate ticketing integrations quickly becomes fragile.",{"type":17,"tag":29,"props":184138,"children":184139},{},[184140,184141,184145],{"type":23,"value":25244},{"type":17,"tag":48,"props":184142,"children":184143},{},[184144],{"type":23,"value":150656},{"type":23,"value":184146}," provides a consistent way to access tickets, customers, notes, and categories across providers—without storing ticket data at rest or collapsing boundaries with CRM, call center, or messaging systems.",{"type":17,"tag":29,"props":184148,"children":184149},{},[184150,184154,184155],{"type":17,"tag":48,"props":184151,"children":184152},{},[184153],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":184156,"children":184158},{"href":1612,"rel":184157},[214],[184159],{"type":17,"tag":48,"props":184160,"children":184161},{},[184162],{"type":23,"value":1616},{"type":17,"tag":29,"props":184164,"children":184165},{},[184166],{"type":23,"value":184167},"Test ticketing integrations against live provider data.",{"type":17,"tag":29,"props":184169,"children":184170},{},[184171,184175,184176],{"type":17,"tag":48,"props":184172,"children":184173},{},[184174],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":184177,"children":184179},{"href":1623,"rel":184178},[214],[184180],{"type":17,"tag":48,"props":184181,"children":184182},{},[184183],{"type":23,"value":1627},{"type":17,"tag":29,"props":184185,"children":184186},{},[184187],{"type":23,"value":184188},"Walk through support workflows and cross-category context with the team.",{"type":17,"tag":68,"props":184190,"children":184191},{"id":95759},[184192],{"type":23,"value":95762},{"type":17,"tag":29,"props":184194,"children":184195},{},[184196],{"type":17,"tag":48,"props":184197,"children":184198},{},[184199],{"type":23,"value":184200},"What objects does the Ticketing API cover?",{"type":17,"tag":29,"props":184202,"children":184203},{},[184204],{"type":23,"value":184205},"Tickets, customers, notes, and categories.",{"type":17,"tag":29,"props":184207,"children":184208},{},[184209],{"type":17,"tag":48,"props":184210,"children":184211},{},[184212],{"type":23,"value":165175},{"type":17,"tag":29,"props":184214,"children":184215},{},[184216],{"type":23,"value":184217},"Zendesk, Freshdesk, Intercom, ServiceNow, Jira Service Management, Gorgias, and others.",{"type":17,"tag":29,"props":184219,"children":184220},{},[184221],{"type":17,"tag":48,"props":184222,"children":184223},{},[184224],{"type":23,"value":184225},"Are ticket updates real time?",{"type":17,"tag":29,"props":184227,"children":184228},{},[184229],{"type":23,"value":184230},"Direct reads are live. Event delivery depends on provider support.",{"type":17,"tag":29,"props":184232,"children":184233},{},[184234],{"type":17,"tag":48,"props":184235,"children":184236},{},[184237],{"type":23,"value":184238},"Can I create or update tickets through the API?",{"type":17,"tag":29,"props":184240,"children":184241},{},[184242],{"type":23,"value":184243},"Yes, subject to provider capabilities.",{"type":17,"tag":29,"props":184245,"children":184246},{},[184247],{"type":17,"tag":48,"props":184248,"children":184249},{},[184250],{"type":23,"value":184251},"Does the Ticketing API include calls or recordings?",{"type":17,"tag":29,"props":184253,"children":184254},{},[184255],{"type":23,"value":184256},"No. Voice data belongs to the Call Center category.",{"type":17,"tag":29,"props":184258,"children":184259},{},[184260],{"type":17,"tag":48,"props":184261,"children":184262},{},[184263],{"type":23,"value":184264},"Does Unified store ticket content?",{"type":17,"tag":29,"props":184266,"children":184267},{},[184268],{"type":23,"value":184269},"No. Ticketing data is not stored at rest.",{"title":7,"searchDepth":1629,"depth":1629,"links":184271},[184272,184273,184274,184275,184279,184285,184286,184290,184295,184301,184302,184306,184307],{"id":183378,"depth":1629,"text":183381},{"id":31977,"depth":1629,"text":183424},{"id":183481,"depth":1629,"text":183484},{"id":183544,"depth":1629,"text":183547,"children":184276},[184277,184278],{"id":183555,"depth":1635,"text":183558},{"id":183571,"depth":1635,"text":183574},{"id":183621,"depth":1629,"text":183624,"children":184280},[184281,184282,184283,184284],{"id":32523,"depth":1635,"text":32740},{"id":70514,"depth":1635,"text":32745},{"id":6698,"depth":1635,"text":6701},{"id":151751,"depth":1635,"text":32754},{"id":183804,"depth":1629,"text":183807},{"id":183855,"depth":1629,"text":183858,"children":184287},[184288,184289],{"id":179243,"depth":1635,"text":179246},{"id":183896,"depth":1635,"text":183899},{"id":171204,"depth":1629,"text":171207,"children":184291},[184292,184293,184294],{"id":17064,"depth":1635,"text":53239},{"id":183943,"depth":1635,"text":183946},{"id":183967,"depth":1635,"text":183970},{"id":183978,"depth":1629,"text":183981,"children":184296},[184297,184298,184299,184300],{"id":183984,"depth":1635,"text":183987},{"id":183995,"depth":1635,"text":183998},{"id":184006,"depth":1635,"text":184009},{"id":184017,"depth":1635,"text":184020},{"id":184028,"depth":1629,"text":184031},{"id":184062,"depth":1629,"text":184065,"children":184303},[184304,184305],{"id":165021,"depth":1635,"text":165024},{"id":184095,"depth":1635,"text":184098},{"id":184128,"depth":1629,"text":184131},{"id":95759,"depth":1629,"text":95762},"content:blog:ticketing_api_integration_tickets_customers_notes_and_categories_across_support_platforms.md","blog/ticketing_api_integration_tickets_customers_notes_and_categories_across_support_platforms.md","blog/ticketing_api_integration_tickets_customers_notes_and_categories_across_support_platforms",{"_path":184312,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":184313,"description":184314,"img":184315,"date":184316,"tag":12,"body":184317,"_type":1677,"_id":185278,"_source":1679,"_file":185279,"_stem":185280,"_extension":1682},"/blog/payment_api_integration_transactions_refunds_payouts_and_subscriptions_across_providers","Payment API Integration: Transactions, Refunds, Payouts, and Subscriptions Across Providers","Payment systems sit at the point where money actually moves. Transactions settle, refunds reverse funds, payouts disburse balances, and subscriptions advance...","https://s3.us-east-2.amazonaws.com/unified-article-images/payment_api_integration_transactions_refunds_payouts_and_subscriptions_across_providers-icon.png","2026-02-09T16:54:00.000Z",{"type":14,"children":184318,"toc":185243},[184319,184324,184327,184334,184346,184357,184362,184368,184373,184378,184401,184413,184418,184428,184456,184468,184474,184479,184529,184534,184540,184544,184554,184558,184563,184587,184603,184608,184614,184626,184630,184635,184653,184658,184664,184669,184701,184705,184710,184728,184733,184737,184742,184760,184764,184769,184787,184792,184798,184809,184843,184848,184853,184859,184864,184893,184898,184903,184907,184913,184918,184936,184941,184945,184950,184954,184958,184975,184980,184984,184996,185002,185007,185013,185018,185023,185028,185033,185037,185041,185046,185051,185056,185061,185067,185071,185076,185081,185086,185090,185096,185100,185105,185109,185113,185118,185124,185129,185139,185150,185160,185163,185167,185175,185180,185187,185192,185200,185204,185212,185217,185225,185230,185238],{"type":17,"tag":18,"props":184320,"children":184322},{"id":184321},"payment-api-integration-transactions-refunds-payouts-and-subscriptions-across-providers",[184323],{"type":23,"value":184313},{"type":17,"tag":25,"props":184325,"children":184326},{},[],{"type":17,"tag":29,"props":184328,"children":184329},{},[184330],{"type":17,"tag":33,"props":184331,"children":184332},{},[184333],{"type":23,"value":182031},{"type":17,"tag":29,"props":184335,"children":184336},{},[184337,184339,184344],{"type":23,"value":184338},"Payment systems sit at the point where money actually moves. Transactions settle, refunds reverse funds, payouts disburse balances, and subscriptions advance on fixed billing schedules. Unlike product, marketing, or CRM data, payment objects often enter ",{"type":17,"tag":48,"props":184340,"children":184341},{},[184342],{"type":23,"value":184343},"terminal states",{"type":23,"value":184345}," that cannot be modified, and provider rules vary sharply once funds are captured or released.",{"type":17,"tag":29,"props":184347,"children":184348},{},[184349,184351,184355],{"type":23,"value":184350},"When payment data is pulled through background sync jobs or loosely normalized abstractions, discrepancies surface quickly—duplicate charges, missed refunds, broken reconciliation, or outdated subscription state. For products that require accurate, real-time visibility into payment activity across providers, ",{"type":17,"tag":133,"props":184352,"children":184353},{"href":35809},[184354],{"type":23,"value":35812},{"type":23,"value":184356}," integration must be precise, provider-aware, and clearly scoped.",{"type":17,"tag":29,"props":184358,"children":184359},{},[184360],{"type":23,"value":184361},"This article explains what a Payment API does in practice, which objects it exposes, how payment lifecycles behave, how real-time updates are delivered, and how Unified's Payment API fits alongside Accounting, Commerce, CRM, and Marketing within the Finance & Commerce group.",{"type":17,"tag":68,"props":184363,"children":184365},{"id":184364},"introduction-to-payment-api-integrations",[184366],{"type":23,"value":184367},"Introduction to Payment API Integrations",{"type":17,"tag":29,"props":184369,"children":184370},{},[184371],{"type":23,"value":184372},"Payment platforms such as Stripe, PayPal, GoCardless, Brex, and Chargebee are responsible for collecting funds, issuing refunds, managing payouts, and advancing recurring billing schedules.",{"type":17,"tag":29,"props":184374,"children":184375},{},[184376],{"type":23,"value":184377},"Each provider exposes its own APIs, authentication models, lifecycle rules, and operational constraints. Products that support multiple payment processors typically encounter:",{"type":17,"tag":80,"props":184379,"children":184380},{},[184381,184386,184391,184396],{"type":17,"tag":84,"props":184382,"children":184383},{},[184384],{"type":23,"value":184385},"Provider-specific transaction and refund behavior",{"type":17,"tag":84,"props":184387,"children":184388},{},[184389],{"type":23,"value":184390},"Different subscription timing and renewal semantics",{"type":17,"tag":84,"props":184392,"children":184393},{},[184394],{"type":23,"value":184395},"Uneven webhook coverage across objects",{"type":17,"tag":84,"props":184397,"children":184398},{},[184399],{"type":23,"value":184400},"Strict write restrictions once funds are finalized",{"type":17,"tag":29,"props":184402,"children":184403},{},[184404,184406,184411],{"type":23,"value":184405},"A Payment API provides a consistent way to ",{"type":17,"tag":48,"props":184407,"children":184408},{},[184409],{"type":23,"value":184410},"read and, where supported, write payment data",{"type":23,"value":184412}," across providers without maintaining separate integrations for each system.",{"type":17,"tag":68,"props":184414,"children":184415},{"id":35835},[184416],{"type":23,"value":184417},"What Is a Payment API?",{"type":17,"tag":29,"props":184419,"children":184420},{},[184421,184422,184426],{"type":23,"value":9619},{"type":17,"tag":48,"props":184423,"children":184424},{},[184425],{"type":23,"value":175399},{"type":23,"value":184427}," allows applications to programmatically access and manage payment-system data, including:",{"type":17,"tag":80,"props":184429,"children":184430},{},[184431,184436,184441,184446,184451],{"type":17,"tag":84,"props":184432,"children":184433},{},[184434],{"type":23,"value":184435},"One-time payment transactions",{"type":17,"tag":84,"props":184437,"children":184438},{},[184439],{"type":23,"value":184440},"Hosted checkout and payment links",{"type":17,"tag":84,"props":184442,"children":184443},{},[184444],{"type":23,"value":184445},"Refunds and reversals",{"type":17,"tag":84,"props":184447,"children":184448},{},[184449],{"type":23,"value":184450},"Payouts and disbursements",{"type":17,"tag":84,"props":184452,"children":184453},{},[184454],{"type":23,"value":184455},"Subscriptions and recurring billing schedules",{"type":17,"tag":29,"props":184457,"children":184458},{},[184459,184461,184466],{"type":23,"value":184460},"Payment APIs focus on ",{"type":17,"tag":48,"props":184462,"children":184463},{},[184464],{"type":23,"value":184465},"money movement and payment system state",{"type":23,"value":184467},". They do not function as financial ledgers, product catalogs, customer databases, or fulfillment systems.",{"type":17,"tag":68,"props":184469,"children":184471},{"id":184470},"payment-api-vs-accounting-commerce-crm-and-marketing",[184472],{"type":23,"value":184473},"Payment API vs Accounting, Commerce, CRM, and Marketing",{"type":17,"tag":29,"props":184475,"children":184476},{},[184477],{"type":23,"value":184478},"Unified treats Payment as a distinct category within the Finance & Commerce surface, with strict boundaries.",{"type":17,"tag":80,"props":184480,"children":184481},{},[184482,184492,184502,184511,184520],{"type":17,"tag":84,"props":184483,"children":184484},{},[184485,184490],{"type":17,"tag":48,"props":184486,"children":184487},{},[184488],{"type":23,"value":184489},"Payment APIs",{"type":23,"value":184491}," manage transactions, refunds, payouts, and subscriptions inside payment processors.",{"type":17,"tag":84,"props":184493,"children":184494},{},[184495,184500],{"type":17,"tag":48,"props":184496,"children":184497},{},[184498],{"type":23,"value":184499},"Accounting APIs",{"type":23,"value":184501}," manage ledger records such as invoices, bills, journal entries, balances, and reports.",{"type":17,"tag":84,"props":184503,"children":184504},{},[184505,184509],{"type":17,"tag":48,"props":184506,"children":184507},{},[184508],{"type":23,"value":178707},{"type":23,"value":184510}," manage products, inventory, collections, locations, and reviews.",{"type":17,"tag":84,"props":184512,"children":184513},{},[184514,184518],{"type":17,"tag":48,"props":184515,"children":184516},{},[184517],{"type":23,"value":173018},{"type":23,"value":184519}," manage contacts, companies, deals, pipelines, and sales activity.",{"type":17,"tag":84,"props":184521,"children":184522},{},[184523,184527],{"type":17,"tag":48,"props":184524,"children":184525},{},[184526],{"type":23,"value":180070},{"type":23,"value":184528}," manage audiences, campaigns, and engagement metrics.",{"type":17,"tag":29,"props":184530,"children":184531},{},[184532],{"type":23,"value":184533},"Although payment data is often reconciled against accounting records, the Payment API does not act as a ledger and does not replace accounting systems.",{"type":17,"tag":68,"props":184535,"children":184537},{"id":184536},"real-time-access-to-payment-data",[184538],{"type":23,"value":184539},"Real-Time Access to Payment Data",{"type":17,"tag":239,"props":184541,"children":184542},{"id":178733},[184543],{"type":23,"value":178736},{"type":17,"tag":29,"props":184545,"children":184546},{},[184547,184549,184553],{"type":23,"value":184548},"Unified's Payment API routes every request directly to the connected payment provider. There is no cached replica and no background synchronization layer. Reads always reflect the current provider state, subject to availability and ",{"type":17,"tag":133,"props":184550,"children":184551},{"href":135},[184552],{"type":23,"value":138},{"type":23,"value":54},{"type":17,"tag":239,"props":184555,"children":184556},{"id":167319},[184557],{"type":23,"value":167322},{"type":17,"tag":29,"props":184559,"children":184560},{},[184561],{"type":23,"value":184562},"Payment providers differ widely in event support.",{"type":17,"tag":80,"props":184564,"children":184565},{},[184566,184577,184582],{"type":17,"tag":84,"props":184567,"children":184568},{},[184569,184571,184575],{"type":23,"value":184570},"Some emit native ",{"type":17,"tag":133,"props":184572,"children":184573},{"href":4999},[184574],{"type":23,"value":5002},{"type":23,"value":184576}," for payments, refunds, or subscriptions.",{"type":17,"tag":84,"props":184578,"children":184579},{},[184580],{"type":23,"value":184581},"Others expose limited or partial webhook coverage.",{"type":17,"tag":84,"props":184583,"children":184584},{},[184585],{"type":23,"value":184586},"Not all payment objects generate events across all providers.",{"type":17,"tag":29,"props":184588,"children":184589},{},[184590,184591,184595,184597,184601],{"type":23,"value":107847},{"type":17,"tag":48,"props":184592,"children":184593},{},[184594],{"type":23,"value":107852},{"type":23,"value":184596}," (forwarded when available) and ",{"type":17,"tag":48,"props":184598,"children":184599},{},[184600],{"type":23,"value":46572},{"type":23,"value":184602}," (generated via polling). Event availability depends on the provider and object.",{"type":17,"tag":29,"props":184604,"children":184605},{},[184606],{"type":23,"value":184607},"There are no aggregate or reporting objects in the Payment category. All updates are object-level.",{"type":17,"tag":68,"props":184609,"children":184611},{"id":184610},"core-payment-data-models",[184612],{"type":23,"value":184613},"Core Payment Data Models",{"type":17,"tag":29,"props":184615,"children":184616},{},[184617,184619,184624],{"type":23,"value":184618},"Unified normalizes payment data ",{"type":17,"tag":48,"props":184620,"children":184621},{},[184622],{"type":23,"value":184623},"within the Payment category",{"type":23,"value":184625},". All objects are provider-scoped and connection-scoped.",{"type":17,"tag":239,"props":184627,"children":184628},{"id":11734},[184629],{"type":23,"value":11737},{"type":17,"tag":29,"props":184631,"children":184632},{},[184633],{"type":23,"value":184634},"Payments represent individual transaction records.",{"type":17,"tag":80,"props":184636,"children":184637},{},[184638,184643,184648],{"type":17,"tag":84,"props":184639,"children":184640},{},[184641],{"type":23,"value":184642},"Support create, list, retrieve, update, and remove operations at the API surface",{"type":17,"tag":84,"props":184644,"children":184645},{},[184646],{"type":23,"value":184647},"Include amount, currency, payment method descriptor, and provider references",{"type":17,"tag":84,"props":184649,"children":184650},{},[184651],{"type":23,"value":184652},"Do not expose a normalized status field in the unified schema",{"type":17,"tag":29,"props":184654,"children":184655},{},[184656],{"type":23,"value":184657},"Provider behavior varies. Some providers allow payment creation via API, others do not. Once a payment is completed or settled, most providers restrict further modification.",{"type":17,"tag":239,"props":184659,"children":184661},{"id":184660},"payment-links",[184662],{"type":23,"value":184663},"Payment Links",{"type":17,"tag":29,"props":184665,"children":184666},{},[184667],{"type":23,"value":184668},"Links represent hosted checkout or payment URLs.",{"type":17,"tag":80,"props":184670,"children":184671},{},[184672,184677,184682],{"type":17,"tag":84,"props":184673,"children":184674},{},[184675],{"type":23,"value":184676},"Support create, list, retrieve, update, and remove operations where supported",{"type":17,"tag":84,"props":184678,"children":184679},{},[184680],{"type":23,"value":184681},"Include amount, currency, line items, and redirect URLs",{"type":17,"tag":84,"props":184683,"children":184684},{},[184685,184687,184692,184693,184699],{"type":23,"value":184686},"Use booleans such as ",{"type":17,"tag":6121,"props":184688,"children":184690},{"className":184689},[],[184691],{"type":23,"value":62868},{"type":23,"value":34435},{"type":17,"tag":6121,"props":184694,"children":184696},{"className":184695},[],[184697],{"type":23,"value":184698},"is_chargeable_now",{"type":23,"value":184700}," rather than a status enum",{"type":17,"tag":239,"props":184702,"children":184703},{"id":36719},[184704],{"type":23,"value":70859},{"type":17,"tag":29,"props":184706,"children":184707},{},[184708],{"type":23,"value":184709},"Refunds represent funds returned to the payer.",{"type":17,"tag":80,"props":184711,"children":184712},{},[184713,184718,184723],{"type":17,"tag":84,"props":184714,"children":184715},{},[184716],{"type":23,"value":184717},"Exposed as read-only objects",{"type":17,"tag":84,"props":184719,"children":184720},{},[184721],{"type":23,"value":184722},"Retrieved for visibility and reconciliation",{"type":17,"tag":84,"props":184724,"children":184725},{},[184726],{"type":23,"value":184727},"Initiated through the provider or passthrough workflows",{"type":17,"tag":29,"props":184729,"children":184730},{},[184731],{"type":23,"value":184732},"Refund objects include amount, currency, status, and references to the original payment.",{"type":17,"tag":239,"props":184734,"children":184735},{"id":36724},[184736],{"type":23,"value":148167},{"type":17,"tag":29,"props":184738,"children":184739},{},[184740],{"type":23,"value":184741},"Payouts represent transfers from the payment provider to the merchant.",{"type":17,"tag":80,"props":184743,"children":184744},{},[184745,184750,184755],{"type":17,"tag":84,"props":184746,"children":184747},{},[184748],{"type":23,"value":184749},"Exposed as read-only",{"type":17,"tag":84,"props":184751,"children":184752},{},[184753],{"type":23,"value":184754},"Retrieved for observability and reconciliation",{"type":17,"tag":84,"props":184756,"children":184757},{},[184758],{"type":23,"value":184759},"Include amount, currency, and status fields",{"type":17,"tag":239,"props":184761,"children":184762},{"id":36138},[184763],{"type":23,"value":70796},{"type":17,"tag":29,"props":184765,"children":184766},{},[184767],{"type":23,"value":184768},"Subscriptions represent recurring billing agreements.",{"type":17,"tag":80,"props":184770,"children":184771},{},[184772,184777,184782],{"type":17,"tag":84,"props":184773,"children":184774},{},[184775],{"type":23,"value":184776},"Include detailed lifecycle timing fields",{"type":17,"tag":84,"props":184778,"children":184779},{},[184780],{"type":23,"value":184781},"Support create, update, and remove operations at the API surface",{"type":17,"tag":84,"props":184783,"children":184784},{},[184785],{"type":23,"value":184786},"Provider write support varies",{"type":17,"tag":29,"props":184788,"children":184789},{},[184790],{"type":23,"value":184791},"Subscription objects capture start dates, billing periods, cancellation timing, and recurrence configuration.",{"type":17,"tag":68,"props":184793,"children":184795},{"id":184794},"identity-and-ownership-in-payment",[184796],{"type":23,"value":184797},"Identity and Ownership in Payment",{"type":17,"tag":29,"props":184799,"children":184800},{},[184801,184803,184808],{"type":23,"value":184802},"Payment objects use ",{"type":17,"tag":48,"props":184804,"children":184805},{},[184806],{"type":23,"value":184807},"provider-scoped identity models",{"type":23,"value":54},{"type":17,"tag":80,"props":184810,"children":184811},{},[184812,184822,184832],{"type":17,"tag":84,"props":184813,"children":184814},{},[184815,184820],{"type":17,"tag":6121,"props":184816,"children":184818},{"className":184817},[],[184819],{"type":23,"value":26302},{"type":23,"value":184821}," references a customer inside the payment provider, not a CRM contact",{"type":17,"tag":84,"props":184823,"children":184824},{},[184825,184830],{"type":17,"tag":6121,"props":184826,"children":184828},{"className":184827},[],[184829],{"type":23,"value":109123},{"type":23,"value":184831}," references a provider-native invoice, not an accounting invoice",{"type":17,"tag":84,"props":184833,"children":184834},{},[184835,184841],{"type":17,"tag":6121,"props":184836,"children":184838},{"className":184837},[],[184839],{"type":23,"value":184840},"account_id",{"type":23,"value":184842}," references a provider-specific account concept",{"type":17,"tag":29,"props":184844,"children":184845},{},[184846],{"type":23,"value":184847},"There is no automatic cross-category identity resolution. Linking payment records to accounting invoices, CRM contacts, or commerce orders is handled explicitly by the application.",{"type":17,"tag":29,"props":184849,"children":184850},{},[184851],{"type":23,"value":184852},"Each connection is isolated to a single provider within the Payment category.",{"type":17,"tag":68,"props":184854,"children":184856},{"id":184855},"lifecycle-semantics-and-terminal-states",[184857],{"type":23,"value":184858},"Lifecycle Semantics and Terminal States",{"type":17,"tag":29,"props":184860,"children":184861},{},[184862],{"type":23,"value":184863},"Payment systems enforce strict lifecycle rules.",{"type":17,"tag":80,"props":184865,"children":184866},{},[184867,184883,184888],{"type":17,"tag":84,"props":184868,"children":184869},{},[184870,184875,184876,184881],{"type":17,"tag":6121,"props":184871,"children":184873},{"className":184872},[],[184874],{"type":23,"value":33446},{"type":23,"value":34435},{"type":17,"tag":6121,"props":184877,"children":184879},{"className":184878},[],[184880],{"type":23,"value":25337},{"type":23,"value":184882}," are system-managed timestamps",{"type":17,"tag":84,"props":184884,"children":184885},{},[184886],{"type":23,"value":184887},"Many provider states cannot be reversed once reached",{"type":17,"tag":84,"props":184889,"children":184890},{},[184891],{"type":23,"value":184892},"Completed payments, finalized refunds, and settled payouts are immutable",{"type":17,"tag":29,"props":184894,"children":184895},{},[184896],{"type":23,"value":184897},"Subscriptions introduce additional lifecycle complexity through billing periods and cancellation timing. These fields advance automatically according to provider rules.",{"type":17,"tag":29,"props":184899,"children":184900},{},[184901],{"type":23,"value":184902},"Unified surfaces provider behavior directly rather than abstracting it away.",{"type":17,"tag":68,"props":184904,"children":184905},{"id":172252},[184906],{"type":23,"value":172255},{"type":17,"tag":239,"props":184908,"children":184910},{"id":184909},"event-delivery",[184911],{"type":23,"value":184912},"Event Delivery",{"type":17,"tag":29,"props":184914,"children":184915},{},[184916],{"type":23,"value":184917},"Unified provides a consistent webhook interface across categories, with Payment event coverage determined by provider capabilities.",{"type":17,"tag":80,"props":184919,"children":184920},{},[184921,184926,184931],{"type":17,"tag":84,"props":184922,"children":184923},{},[184924],{"type":23,"value":184925},"Native webhooks deliver updates as providers emit them",{"type":17,"tag":84,"props":184927,"children":184928},{},[184929],{"type":23,"value":184930},"Virtual webhooks poll providers and emit created or updated events",{"type":17,"tag":84,"props":184932,"children":184933},{},[184934],{"type":23,"value":184935},"Not all objects emit events on all providers",{"type":17,"tag":29,"props":184937,"children":184938},{},[184939],{"type":23,"value":184940},"Webhook payloads include event markers and signatures for verification.",{"type":17,"tag":239,"props":184942,"children":184943},{"id":31656},[184944],{"type":23,"value":172306},{"type":17,"tag":29,"props":184946,"children":184947},{},[184948],{"type":23,"value":184949},"When webhooks are unavailable or insufficient, applications poll list endpoints. Polling frequency should balance data freshness against rate limits and operational cost.",{"type":17,"tag":68,"props":184951,"children":184952},{"id":172399},[184953],{"type":23,"value":172402},{"type":17,"tag":239,"props":184955,"children":184956},{"id":90302},[184957],{"type":23,"value":179326},{"type":17,"tag":80,"props":184959,"children":184960},{},[184961,184966,184971],{"type":17,"tag":84,"props":184962,"children":184963},{},[184964],{"type":23,"value":184965},"Payment data is routed directly to source providers",{"type":17,"tag":84,"props":184967,"children":184968},{},[184969],{"type":23,"value":184970},"No payment payloads are stored at rest",{"type":17,"tag":84,"props":184972,"children":184973},{},[184974],{"type":23,"value":180516},{"type":17,"tag":29,"props":184976,"children":184977},{},[184978],{"type":23,"value":184979},"If long-term persistence is required, applications store data themselves.",{"type":17,"tag":239,"props":184981,"children":184982},{"id":179352},[184983],{"type":23,"value":179355},{"type":17,"tag":29,"props":184985,"children":184986},{},[184987,184989,184994],{"type":23,"value":184988},"Unified's normalized schemas do not expose card numbers or security codes. All Payment objects include a ",{"type":17,"tag":6121,"props":184990,"children":184992},{"className":184991},[],[184993],{"type":23,"value":62389},{"type":23,"value":184995}," field containing provider-native payloads. The contents of this field depend on the provider and should be treated as sensitive.",{"type":17,"tag":239,"props":184997,"children":184999},{"id":184998},"compliance-positioning",[185000],{"type":23,"value":185001},"Compliance Positioning",{"type":17,"tag":29,"props":185003,"children":185004},{},[185005],{"type":23,"value":185006},"Unified maintains SOC 2 Type II, GDPR, CCPA/CPRA, HIPAA, and PIPEDA compliance. The platform's architecture minimizes exposure by avoiding data storage while leaving downstream compliance decisions to the integrating application.",{"type":17,"tag":68,"props":185008,"children":185010},{"id":185009},"common-payment-api-use-cases",[185011],{"type":23,"value":185012},"Common Payment API Use Cases",{"type":17,"tag":29,"props":185014,"children":185015},{},[185016],{"type":23,"value":185017},"Payment analytics across providers",{"type":17,"tag":29,"props":185019,"children":185020},{},[185021],{"type":23,"value":185022},"Subscription lifecycle monitoring",{"type":17,"tag":29,"props":185024,"children":185025},{},[185026],{"type":23,"value":185027},"Payment and refund reconciliation",{"type":17,"tag":29,"props":185029,"children":185030},{},[185031],{"type":23,"value":185032},"Checkout and payment-link management",{"type":17,"tag":68,"props":185034,"children":185035},{"id":164971},[185036],{"type":23,"value":164974},{"type":17,"tag":29,"props":185038,"children":185039},{},[185040],{"type":23,"value":184786},{"type":17,"tag":29,"props":185042,"children":185043},{},[185044],{"type":23,"value":185045},"Refunds and payouts are read-only",{"type":17,"tag":29,"props":185047,"children":185048},{},[185049],{"type":23,"value":185050},"Payment state transitions are often irreversible",{"type":17,"tag":29,"props":185052,"children":185053},{},[185054],{"type":23,"value":185055},"Identity resolution across categories is application-level",{"type":17,"tag":29,"props":185057,"children":185058},{},[185059],{"type":23,"value":185060},"These constraints reflect provider realities and should be incorporated into system design.",{"type":17,"tag":68,"props":185062,"children":185064},{"id":185063},"build-vs-maintain-payment-integrations",[185065],{"type":23,"value":185066},"Build vs Maintain Payment Integrations",{"type":17,"tag":239,"props":185068,"children":185069},{"id":165021},[185070],{"type":23,"value":165024},{"type":17,"tag":29,"props":185072,"children":185073},{},[185074],{"type":23,"value":185075},"Multiple provider APIs",{"type":17,"tag":29,"props":185077,"children":185078},{},[185079],{"type":23,"value":185080},"Divergent webhook semantics",{"type":17,"tag":29,"props":185082,"children":185083},{},[185084],{"type":23,"value":185085},"Provider-specific retries and errors",{"type":17,"tag":29,"props":185087,"children":185088},{},[185089],{"type":23,"value":31417},{"type":17,"tag":239,"props":185091,"children":185093},{"id":185092},"using-a-unified-payment-api",[185094],{"type":23,"value":185095},"Using a Unified Payment API",{"type":17,"tag":29,"props":185097,"children":185098},{},[185099],{"type":23,"value":184106},{"type":17,"tag":29,"props":185101,"children":185102},{},[185103],{"type":23,"value":185104},"Normalized payment, refund, payout, and subscription objects",{"type":17,"tag":29,"props":185106,"children":185107},{},[185108],{"type":23,"value":179568},{"type":17,"tag":29,"props":185110,"children":185111},{},[185112],{"type":23,"value":180731},{"type":17,"tag":29,"props":185114,"children":185115},{},[185116],{"type":23,"value":185117},"Clear separation from accounting and commerce",{"type":17,"tag":68,"props":185119,"children":185121},{"id":185120},"build-payment-integrations-with-clear-boundaries",[185122],{"type":23,"value":185123},"Build payment integrations with clear boundaries",{"type":17,"tag":29,"props":185125,"children":185126},{},[185127],{"type":23,"value":185128},"If your product requires real-time visibility into payment activity across providers, maintaining separate integrations quickly becomes fragile.",{"type":17,"tag":29,"props":185130,"children":185131},{},[185132,185133,185137],{"type":23,"value":25244},{"type":17,"tag":48,"props":185134,"children":185135},{},[185136],{"type":23,"value":175399},{"type":23,"value":185138}," provides a consistent way to access transactions, refunds, payouts, and subscriptions without storing payment data or collapsing category boundaries.",{"type":17,"tag":29,"props":185140,"children":185141},{},[185142],{"type":17,"tag":133,"props":185143,"children":185145},{"href":185144},"/3026207b838480f38a05c90f975efbba",[185146],{"type":17,"tag":48,"props":185147,"children":185148},{},[185149],{"type":23,"value":44481},{"type":17,"tag":29,"props":185151,"children":185152},{},[185153],{"type":17,"tag":133,"props":185154,"children":185155},{"href":185144},[185156],{"type":17,"tag":48,"props":185157,"children":185158},{},[185159],{"type":23,"value":44490},{"type":17,"tag":25,"props":185161,"children":185162},{},[],{"type":17,"tag":68,"props":185164,"children":185165},{"id":95759},[185166],{"type":23,"value":95762},{"type":17,"tag":29,"props":185168,"children":185169},{},[185170],{"type":17,"tag":48,"props":185171,"children":185172},{},[185173],{"type":23,"value":185174},"What is a Payment API?",{"type":17,"tag":29,"props":185176,"children":185177},{},[185178],{"type":23,"value":185179},"An API that exposes payment-provider data such as transactions, refunds, payouts, and subscriptions.",{"type":17,"tag":29,"props":185181,"children":185182},{},[185183],{"type":17,"tag":48,"props":185184,"children":185185},{},[185186],{"type":23,"value":171430},{"type":17,"tag":29,"props":185188,"children":185189},{},[185190],{"type":23,"value":185191},"Unified supports Stripe, PayPal, GoCardless, Brex, Chargebee, and others.",{"type":17,"tag":29,"props":185193,"children":185194},{},[185195],{"type":17,"tag":48,"props":185196,"children":185197},{},[185198],{"type":23,"value":185199},"Are payment updates real time?",{"type":17,"tag":29,"props":185201,"children":185202},{},[185203],{"type":23,"value":184230},{"type":17,"tag":29,"props":185205,"children":185206},{},[185207],{"type":17,"tag":48,"props":185208,"children":185209},{},[185210],{"type":23,"value":185211},"Can I create payments via the API?",{"type":17,"tag":29,"props":185213,"children":185214},{},[185215],{"type":23,"value":185216},"Create support depends on the provider.",{"type":17,"tag":29,"props":185218,"children":185219},{},[185220],{"type":17,"tag":48,"props":185221,"children":185222},{},[185223],{"type":23,"value":185224},"Does the Payment API store financial data?",{"type":17,"tag":29,"props":185226,"children":185227},{},[185228],{"type":23,"value":185229},"No. Data is not stored at rest.",{"type":17,"tag":29,"props":185231,"children":185232},{},[185233],{"type":17,"tag":48,"props":185234,"children":185235},{},[185236],{"type":23,"value":185237},"How does Payment differ from Accounting?",{"type":17,"tag":29,"props":185239,"children":185240},{},[185241],{"type":23,"value":185242},"Payment tracks money movement. Accounting tracks ledger records and financial reporting.",{"title":7,"searchDepth":1629,"depth":1629,"links":185244},[185245,185246,185247,185248,185252,185259,185260,185261,185265,185270,185271,185272,185276,185277],{"id":184364,"depth":1629,"text":184367},{"id":35835,"depth":1629,"text":184417},{"id":184470,"depth":1629,"text":184473},{"id":184536,"depth":1629,"text":184539,"children":185249},[185250,185251],{"id":178733,"depth":1635,"text":178736},{"id":167319,"depth":1635,"text":167322},{"id":184610,"depth":1629,"text":184613,"children":185253},[185254,185255,185256,185257,185258],{"id":11734,"depth":1635,"text":11737},{"id":184660,"depth":1635,"text":184663},{"id":36719,"depth":1635,"text":70859},{"id":36724,"depth":1635,"text":148167},{"id":36138,"depth":1635,"text":70796},{"id":184794,"depth":1629,"text":184797},{"id":184855,"depth":1629,"text":184858},{"id":172252,"depth":1629,"text":172255,"children":185262},[185263,185264],{"id":184909,"depth":1635,"text":184912},{"id":31656,"depth":1635,"text":172306},{"id":172399,"depth":1629,"text":172402,"children":185266},[185267,185268,185269],{"id":90302,"depth":1635,"text":179326},{"id":179352,"depth":1635,"text":179355},{"id":184998,"depth":1635,"text":185001},{"id":185009,"depth":1629,"text":185012},{"id":164971,"depth":1629,"text":164974},{"id":185063,"depth":1629,"text":185066,"children":185273},[185274,185275],{"id":165021,"depth":1635,"text":165024},{"id":185092,"depth":1635,"text":185095},{"id":185120,"depth":1629,"text":185123},{"id":95759,"depth":1629,"text":95762},"content:blog:payment_api_integration_transactions_refunds_payouts_and_subscriptions_across_providers.md","blog/payment_api_integration_transactions_refunds_payouts_and_subscriptions_across_providers.md","blog/payment_api_integration_transactions_refunds_payouts_and_subscriptions_across_providers",{"_path":185282,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":185283,"description":185284,"img":185285,"date":185286,"tag":12,"body":185287,"_type":1677,"_id":186477,"_source":1679,"_file":186478,"_stem":186479,"_extension":1682},"/blog/shipping_api_integration_labels_rates_tracking_and_fulfillment_data_across_carriers","Shipping API Integration: Labels, Rates, Tracking, and Fulfillment Data Across Carriers","Shipping systems sit at the point where digital orders turn into physical movement. Rates change by carrier and service, labels trigger irreversible actions,...","https://s3.us-east-2.amazonaws.com/unified-article-images/shipping_api_integration_labels_rates_tracking_and_fulfillment_data_across_carriers-icon.png","2026-02-09T16:17:00.000Z",{"type":14,"children":185288,"toc":186437},[185289,185294,185297,185304,185309,185318,185323,185329,185334,185339,185362,185374,185379,185389,185393,185421,185432,185438,185443,185491,185496,185502,185507,185511,185521,185525,185530,185553,185565,185571,185576,185580,185585,185617,185622,185627,185632,185636,185641,185685,185690,185694,185699,185722,185727,185731,185736,185754,185759,185763,185768,185785,185791,185796,185846,185856,185881,185891,185908,185913,185917,185921,185925,185959,185964,185968,186008,186013,186017,186022,186026,186047,186051,186056,186084,186089,186095,186101,186106,186112,186117,186123,186128,186134,186139,186145,186150,186154,186159,186187,186192,186198,186202,186224,186230,186255,186261,186293,186299,186304,186314,186330,186335,186351,186356,186360,186368,186373,186381,186386,186394,186399,186407,186412,186420,186425,186432],{"type":17,"tag":18,"props":185290,"children":185292},{"id":185291},"shipping-api-integration-labels-rates-tracking-and-fulfillment-data-across-carriers",[185293],{"type":23,"value":185283},{"type":17,"tag":25,"props":185295,"children":185296},{},[],{"type":17,"tag":29,"props":185298,"children":185299},{},[185300],{"type":17,"tag":33,"props":185301,"children":185302},{},[185303],{"type":23,"value":182031},{"type":17,"tag":29,"props":185305,"children":185306},{},[185307],{"type":23,"value":185308},"Shipping systems sit at the point where digital orders turn into physical movement. Rates change by carrier and service, labels trigger irreversible actions, and tracking updates arrive asynchronously and unevenly across providers. When shipping data is stitched together with brittle integrations or batch syncs, teams end up with delayed tracking, inconsistent fulfillment states, and limited visibility across carriers.",{"type":17,"tag":29,"props":185310,"children":185311},{},[185312,185317],{"type":17,"tag":133,"props":185313,"children":185314},{"href":34475},[185315],{"type":23,"value":185316},"Shipping API",{"type":23,"value":165348},{"type":17,"tag":29,"props":185319,"children":185320},{},[185321],{"type":23,"value":185322},"In this guide, we'll explain what a Shipping API actually covers, which objects matter in practice, how shipment and tracking lifecycles behave, how real-time updates are delivered (and where they aren't), and how Unified's Shipping API fits alongside Commerce, Accounting, Payments, and CRM in the broader platform.",{"type":17,"tag":68,"props":185324,"children":185326},{"id":185325},"introduction-to-shipping-api-integrations",[185327],{"type":23,"value":185328},"Introduction to Shipping API Integrations",{"type":17,"tag":29,"props":185330,"children":185331},{},[185332],{"type":23,"value":185333},"Shipping platforms such as ShipStation, Shippo, EasyPost, FedEx, UPS, DHL, USPS, Canada Post, and Sendcloud handle carrier connectivity, label creation, rate shopping, and tracking.",{"type":17,"tag":29,"props":185335,"children":185336},{},[185337],{"type":23,"value":185338},"Each platform exposes its own API surface with different assumptions:",{"type":17,"tag":80,"props":185340,"children":185341},{},[185342,185347,185352,185357],{"type":17,"tag":84,"props":185343,"children":185344},{},[185345],{"type":23,"value":185346},"Carrier-native APIs often lack list endpoints or webhook support",{"type":17,"tag":84,"props":185348,"children":185349},{},[185350],{"type":23,"value":185351},"Aggregators normalize some data but still vary by object",{"type":17,"tag":84,"props":185353,"children":185354},{},[185355],{"type":23,"value":185356},"Label creation and voiding rules differ by carrier",{"type":17,"tag":84,"props":185358,"children":185359},{},[185360],{"type":23,"value":185361},"Tracking updates arrive at different cadences",{"type":17,"tag":29,"props":185363,"children":185364},{},[185365,185367,185372],{"type":23,"value":185366},"A Shipping API provides a way to ",{"type":17,"tag":48,"props":185368,"children":185369},{},[185370],{"type":23,"value":185371},"standardize logistics data and actions",{"type":23,"value":185373}," across these systems, without building and maintaining separate integrations for each carrier or aggregator.",{"type":17,"tag":68,"props":185375,"children":185376},{"id":34465},[185377],{"type":23,"value":185378},"What Is a Shipping API?",{"type":17,"tag":29,"props":185380,"children":185381},{},[185382,185383,185387],{"type":23,"value":9619},{"type":17,"tag":48,"props":185384,"children":185385},{},[185386],{"type":23,"value":185316},{"type":23,"value":185388}," allows applications to programmatically access and manage shipping and logistics data.",{"type":17,"tag":29,"props":185390,"children":185391},{},[185392],{"type":23,"value":167214},{"type":17,"tag":80,"props":185394,"children":185395},{},[185396,185401,185406,185411,185416],{"type":17,"tag":84,"props":185397,"children":185398},{},[185399],{"type":23,"value":185400},"Creating shipments and return shipments",{"type":17,"tag":84,"props":185402,"children":185403},{},[185404],{"type":23,"value":185405},"Calculating and comparing shipping rates",{"type":17,"tag":84,"props":185407,"children":185408},{},[185409],{"type":23,"value":185410},"Purchasing and managing shipping labels",{"type":17,"tag":84,"props":185412,"children":185413},{},[185414],{"type":23,"value":185415},"Tracking shipments and delivery events",{"type":17,"tag":84,"props":185417,"children":185418},{},[185419],{"type":23,"value":185420},"Retrieving carrier metadata",{"type":17,"tag":29,"props":185422,"children":185423},{},[185424,185426,185430],{"type":23,"value":185425},"Shipping APIs focus exclusively on ",{"type":17,"tag":48,"props":185427,"children":185428},{},[185429],{"type":23,"value":104823},{"type":23,"value":185431},". They are not systems of record for orders, payments, products, or customers.",{"type":17,"tag":68,"props":185433,"children":185435},{"id":185434},"shipping-api-vs-commerce-accounting-payments-and-crm",[185436],{"type":23,"value":185437},"Shipping API vs Commerce, Accounting, Payments, and CRM",{"type":17,"tag":29,"props":185439,"children":185440},{},[185441],{"type":23,"value":185442},"Unified treats Shipping as one category within a broader Finance & Commerce surface, with explicit boundaries.",{"type":17,"tag":80,"props":185444,"children":185445},{},[185446,185456,185465,185474,185483],{"type":17,"tag":84,"props":185447,"children":185448},{},[185449,185454],{"type":17,"tag":48,"props":185450,"children":185451},{},[185452],{"type":23,"value":185453},"Shipping APIs",{"type":23,"value":185455}," manage shipments, labels, rates, tracking, and carriers.",{"type":17,"tag":84,"props":185457,"children":185458},{},[185459,185463],{"type":17,"tag":48,"props":185460,"children":185461},{},[185462],{"type":23,"value":178707},{"type":23,"value":185464}," manage product catalogs, variants, inventory, collections, and locations.",{"type":17,"tag":84,"props":185466,"children":185467},{},[185468,185472],{"type":17,"tag":48,"props":185469,"children":185470},{},[185471],{"type":23,"value":184499},{"type":23,"value":185473}," manage orders, invoices, bills, ledger entries, and financial reports.",{"type":17,"tag":84,"props":185475,"children":185476},{},[185477,185481],{"type":17,"tag":48,"props":185478,"children":185479},{},[185480],{"type":23,"value":184489},{"type":23,"value":185482}," manage transactions, payouts, refunds, and subscriptions.",{"type":17,"tag":84,"props":185484,"children":185485},{},[185486,185490],{"type":17,"tag":48,"props":185487,"children":185488},{},[185489],{"type":23,"value":173018},{"type":23,"value":178699},{"type":17,"tag":29,"props":185492,"children":185493},{},[185494],{"type":23,"value":185495},"Shipping often consumes identifiers from Commerce or Accounting (for example, an order ID), but it does not own those records. Any synchronization across categories must be handled intentionally by the application.",{"type":17,"tag":68,"props":185497,"children":185499},{"id":185498},"real-time-vs-polling-in-shipping-systems",[185500],{"type":23,"value":185501},"Real-Time vs Polling in Shipping Systems",{"type":17,"tag":29,"props":185503,"children":185504},{},[185505],{"type":23,"value":185506},"Shipping data behaves very differently depending on the object and provider.",{"type":17,"tag":239,"props":185508,"children":185509},{"id":163879},[185510],{"type":23,"value":163882},{"type":17,"tag":29,"props":185512,"children":185513},{},[185514,185516,185520],{"type":23,"value":185515},"Unified's Shipping API routes each request directly to the connected shipping platform. There is no cached replica or background sync. Reads always reflect the provider's current state, subject to their availability and ",{"type":17,"tag":133,"props":185517,"children":185518},{"href":135},[185519],{"type":23,"value":138},{"type":23,"value":54},{"type":17,"tag":239,"props":185522,"children":185523},{"id":180105},[185524],{"type":23,"value":180108},{"type":17,"tag":29,"props":185526,"children":185527},{},[185528],{"type":23,"value":185529},"Shipping platforms differ widely in event support:",{"type":17,"tag":80,"props":185531,"children":185532},{},[185533,185543,185548],{"type":17,"tag":84,"props":185534,"children":185535},{},[185536,185537,185541],{"type":23,"value":180121},{"type":17,"tag":133,"props":185538,"children":185539},{"href":4999},[185540],{"type":23,"value":5002},{"type":23,"value":185542}," for shipments or tracking",{"type":17,"tag":84,"props":185544,"children":185545},{},[185546],{"type":23,"value":185547},"Others require polling behind the scenes (virtual webhooks)",{"type":17,"tag":84,"props":185549,"children":185550},{},[185551],{"type":23,"value":185552},"Some objects cannot be monitored at all through list or event APIs",{"type":17,"tag":29,"props":185554,"children":185555},{},[185556,185558,185563],{"type":23,"value":185557},"Because of this, 'real-time' in shipping almost always means ",{"type":17,"tag":48,"props":185559,"children":185560},{},[185561],{"type":23,"value":185562},"tracking-driven",{"type":23,"value":185564},", not shipment-driven.",{"type":17,"tag":68,"props":185566,"children":185568},{"id":185567},"core-shipping-data-models-and-how-they-behave",[185569],{"type":23,"value":185570},"Core Shipping Data Models (and How They Behave)",{"type":17,"tag":29,"props":185572,"children":185573},{},[185574],{"type":23,"value":185575},"Unified normalizes shipping data into a small set of objects. Provider behavior still varies and must be handled defensively.",{"type":17,"tag":239,"props":185577,"children":185578},{"id":34492},[185579],{"type":23,"value":35464},{"type":17,"tag":29,"props":185581,"children":185582},{},[185583],{"type":23,"value":185584},"Shipments represent the physical movement of goods.",{"type":17,"tag":80,"props":185586,"children":185587},{},[185588,185593,185598],{"type":17,"tag":84,"props":185589,"children":185590},{},[185591],{"type":23,"value":185592},"Support create, list, retrieve, update, and remove operations (provider-dependent)",{"type":17,"tag":84,"props":185594,"children":185595},{},[185596],{"type":23,"value":185597},"Include from/to addresses, packages, carrier selection, service codes, and pricing",{"type":17,"tag":84,"props":185599,"children":185600},{},[185601,185603,185608,185609,185615],{"type":23,"value":185602},"Carry lifecycle fields such as ",{"type":17,"tag":6121,"props":185604,"children":185606},{"className":185605},[],[185607],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":185610,"children":185612},{"className":185611},[],[185613],{"type":23,"value":185614},"shipped_at",{"type":23,"value":185616},", and return indicators",{"type":17,"tag":29,"props":185618,"children":185619},{},[185620],{"type":23,"value":185621},"Shipment status typically progresses in one direction:",{"type":17,"tag":29,"props":185623,"children":185624},{},[185625],{"type":23,"value":185626},"PENDING → PROCESSING → IN_TRANSIT → DELIVERED or EXCEPTION",{"type":17,"tag":29,"props":185628,"children":185629},{},[185630],{"type":23,"value":185631},"Once a shipment is in transit, most real-world updates are delivered via tracking, not shipment updates.",{"type":17,"tag":239,"props":185633,"children":185634},{"id":34502},[185635],{"type":23,"value":35469},{"type":17,"tag":29,"props":185637,"children":185638},{},[185639],{"type":23,"value":185640},"Labels represent purchased postage.",{"type":17,"tag":80,"props":185642,"children":185643},{},[185644,185648,185680],{"type":17,"tag":84,"props":185645,"children":185646},{},[185647],{"type":23,"value":185592},{"type":17,"tag":84,"props":185649,"children":185650},{},[185651,185653,185659,185660,185666,185667,185673,185674],{"type":23,"value":185652},"Include ",{"type":17,"tag":6121,"props":185654,"children":185656},{"className":185655},[],[185657],{"type":23,"value":185658},"label_url",{"type":23,"value":11826},{"type":17,"tag":6121,"props":185661,"children":185663},{"className":185662},[],[185664],{"type":23,"value":185665},"tracking_number",{"type":23,"value":11826},{"type":17,"tag":6121,"props":185668,"children":185670},{"className":185669},[],[185671],{"type":23,"value":185672},"label_cost",{"type":23,"value":12561},{"type":17,"tag":6121,"props":185675,"children":185677},{"className":185676},[],[185678],{"type":23,"value":185679},"is_voided",{"type":17,"tag":84,"props":185681,"children":185682},{},[185683],{"type":23,"value":185684},"Creating a label usually purchases postage and is often irreversible",{"type":17,"tag":29,"props":185686,"children":185687},{},[185688],{"type":23,"value":185689},"Although Unified exposes deletion and voiding endpoints, carrier refund rules still apply. A voided label cannot be un-voided.",{"type":17,"tag":239,"props":185691,"children":185692},{"id":34719},[185693],{"type":23,"value":35474},{"type":17,"tag":29,"props":185695,"children":185696},{},[185697],{"type":23,"value":185698},"Tracking objects represent delivery progress.",{"type":17,"tag":80,"props":185700,"children":185701},{},[185702,185707,185712],{"type":17,"tag":84,"props":185703,"children":185704},{},[185705],{"type":23,"value":185706},"Read-only",{"type":17,"tag":84,"props":185708,"children":185709},{},[185710],{"type":23,"value":185711},"Include status, carrier events, estimated delivery, and actual delivery timestamps",{"type":17,"tag":84,"props":185713,"children":185714},{},[185715,185717],{"type":23,"value":185716},"Serve as the ",{"type":17,"tag":48,"props":185718,"children":185719},{},[185720],{"type":23,"value":185721},"primary source of shipment updates",{"type":17,"tag":29,"props":185723,"children":185724},{},[185725],{"type":23,"value":185726},"For many providers, tracking is the only object that reliably emits update events.",{"type":17,"tag":239,"props":185728,"children":185729},{"id":35158},[185730],{"type":23,"value":35479},{"type":17,"tag":29,"props":185732,"children":185733},{},[185734],{"type":23,"value":185735},"Rates represent quoted shipping options.",{"type":17,"tag":80,"props":185737,"children":185738},{},[185739,185744,185749],{"type":17,"tag":84,"props":185740,"children":185741},{},[185742],{"type":23,"value":185743},"Generated on demand",{"type":17,"tag":84,"props":185745,"children":185746},{},[185747],{"type":23,"value":185748},"Read-only snapshots",{"type":17,"tag":84,"props":185750,"children":185751},{},[185752],{"type":23,"value":185753},"Must be regenerated to reflect pricing changes",{"type":17,"tag":29,"props":185755,"children":185756},{},[185757],{"type":23,"value":185758},"Rates are not long-lived objects and should not be monitored for updates.",{"type":17,"tag":239,"props":185760,"children":185761},{"id":105133},[185762],{"type":23,"value":35484},{"type":17,"tag":29,"props":185764,"children":185765},{},[185766],{"type":23,"value":185767},"Carriers represent shipping services.",{"type":17,"tag":80,"props":185769,"children":185770},{},[185771,185775,185780],{"type":17,"tag":84,"props":185772,"children":185773},{},[185774],{"type":23,"value":185706},{"type":17,"tag":84,"props":185776,"children":185777},{},[185778],{"type":23,"value":185779},"Include name, code, logo, and active status",{"type":17,"tag":84,"props":185781,"children":185782},{},[185783],{"type":23,"value":185784},"Maintained by Unified based on provider availability",{"type":17,"tag":68,"props":185786,"children":185788},{"id":185787},"identity-and-relationships-in-shipping",[185789],{"type":23,"value":185790},"Identity and Relationships in Shipping",{"type":17,"tag":29,"props":185792,"children":185793},{},[185794],{"type":23,"value":185795},"Shipping objects use provider-scoped identifiers.",{"type":17,"tag":80,"props":185797,"children":185798},{},[185799,185810,185835],{"type":17,"tag":84,"props":185800,"children":185801},{},[185802,185808],{"type":17,"tag":6121,"props":185803,"children":185805},{"className":185804},[],[185806],{"type":23,"value":185807},"shipment_id",{"type":23,"value":185809}," identifies a shipment within a shipping provider",{"type":17,"tag":84,"props":185811,"children":185812},{},[185813,185819,185820,185826,185827,185833],{"type":17,"tag":6121,"props":185814,"children":185816},{"className":185815},[],[185817],{"type":23,"value":185818},"label_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":185821,"children":185823},{"className":185822},[],[185824],{"type":23,"value":185825},"rate_id",{"type":23,"value":12561},{"type":17,"tag":6121,"props":185828,"children":185830},{"className":185829},[],[185831],{"type":23,"value":185832},"tracking_id",{"type":23,"value":185834}," link shipping objects internally",{"type":17,"tag":84,"props":185836,"children":185837},{},[185838,185844],{"type":17,"tag":6121,"props":185839,"children":185841},{"className":185840},[],[185842],{"type":23,"value":185843},"carrier_id",{"type":23,"value":185845}," references a shipping carrier",{"type":17,"tag":29,"props":185847,"children":185848},{},[185849,185850,185855],{"type":23,"value":180343},{"type":17,"tag":48,"props":185851,"children":185852},{},[185853],{"type":23,"value":185854},"two intentional cross-category references",{"type":23,"value":20456},{"type":17,"tag":80,"props":185857,"children":185858},{},[185859,185870],{"type":17,"tag":84,"props":185860,"children":185861},{},[185862,185868],{"type":17,"tag":6121,"props":185863,"children":185865},{"className":185864},[],[185866],{"type":23,"value":185867},"order_id",{"type":23,"value":185869}," may reference a Commerce or Accounting order",{"type":17,"tag":84,"props":185871,"children":185872},{},[185873,185879],{"type":17,"tag":6121,"props":185874,"children":185876},{"className":185875},[],[185877],{"type":23,"value":185878},"warehouse_location_id",{"type":23,"value":185880}," may reference a Commerce location",{"type":17,"tag":29,"props":185882,"children":185883},{},[185884,185885,185890],{"type":23,"value":180343},{"type":17,"tag":48,"props":185886,"children":185887},{},[185888],{"type":23,"value":185889},"no references",{"type":23,"value":180350},{"type":17,"tag":80,"props":185892,"children":185893},{},[185894,185898,185903],{"type":17,"tag":84,"props":185895,"children":185896},{},[185897],{"type":23,"value":148158},{"type":17,"tag":84,"props":185899,"children":185900},{},[185901],{"type":23,"value":185902},"Accounting invoices or bills",{"type":17,"tag":84,"props":185904,"children":185905},{},[185906],{"type":23,"value":185907},"CRM contacts or companies",{"type":17,"tag":29,"props":185909,"children":185910},{},[185911],{"type":23,"value":185912},"Addresses are plain objects, not linked to CRM records.",{"type":17,"tag":68,"props":185914,"children":185915},{"id":180375},[185916],{"type":23,"value":180378},{"type":17,"tag":239,"props":185918,"children":185919},{"id":180381},[185920],{"type":23,"value":180384},{"type":17,"tag":29,"props":185922,"children":185923},{},[185924],{"type":23,"value":95391},{"type":17,"tag":80,"props":185926,"children":185927},{},[185928,185936,185945],{"type":17,"tag":84,"props":185929,"children":185930},{},[185931,185935],{"type":17,"tag":48,"props":185932,"children":185933},{},[185934],{"type":23,"value":9024},{"type":23,"value":180400},{"type":17,"tag":84,"props":185937,"children":185938},{},[185939,185943],{"type":17,"tag":48,"props":185940,"children":185941},{},[185942],{"type":23,"value":9256},{"type":23,"value":185944}," when Unified polls the provider and emits change events",{"type":17,"tag":84,"props":185946,"children":185947},{},[185948,185952,185953,185958],{"type":17,"tag":48,"props":185949,"children":185950},{},[185951],{"type":23,"value":172306},{"type":23,"value":180419},{"type":17,"tag":6121,"props":185954,"children":185956},{"className":185955},[],[185957],{"type":23,"value":26291},{"type":23,"value":105838},{"type":17,"tag":29,"props":185960,"children":185961},{},[185962],{"type":23,"value":185963},"Virtual webhooks introduce inherent delay based on polling interval. Free plans poll infrequently; paid plans can poll as often as every minute.",{"type":17,"tag":239,"props":185965,"children":185966},{"id":180433},[185967],{"type":23,"value":180436},{"type":17,"tag":80,"props":185969,"children":185970},{},[185971,185980,185989,185998],{"type":17,"tag":84,"props":185972,"children":185973},{},[185974,185978],{"type":17,"tag":48,"props":185975,"children":185976},{},[185977],{"type":23,"value":35474},{"type":23,"value":185979}," is the most consistently updated object",{"type":17,"tag":84,"props":185981,"children":185982},{},[185983,185987],{"type":17,"tag":48,"props":185984,"children":185985},{},[185986],{"type":23,"value":35464},{"type":23,"value":185988}," may or may not emit events depending on provider",{"type":17,"tag":84,"props":185990,"children":185991},{},[185992,185996],{"type":17,"tag":48,"props":185993,"children":185994},{},[185995],{"type":23,"value":35469},{"type":23,"value":185997}," rarely emit update events",{"type":17,"tag":84,"props":185999,"children":186000},{},[186001,186006],{"type":17,"tag":48,"props":186002,"children":186003},{},[186004],{"type":23,"value":186005},"Rates and carriers",{"type":23,"value":186007}," do not emit events",{"type":17,"tag":29,"props":186009,"children":186010},{},[186011],{"type":23,"value":186012},"Some providers do not expose list endpoints for shipments or labels, which makes polling impossible. In those cases, tracking is the only reliable update mechanism.",{"type":17,"tag":68,"props":186014,"children":186015},{"id":164849},[186016],{"type":23,"value":164852},{"type":17,"tag":29,"props":186018,"children":186019},{},[186020],{"type":23,"value":186021},"Shipping data often contains sensitive information. Unified's architecture minimizes exposure.",{"type":17,"tag":239,"props":186023,"children":186024},{"id":90302},[186025],{"type":23,"value":179326},{"type":17,"tag":80,"props":186027,"children":186028},{},[186029,186034,186039,186043],{"type":17,"tag":84,"props":186030,"children":186031},{},[186032],{"type":23,"value":186033},"No shipping data is stored at rest",{"type":17,"tag":84,"props":186035,"children":186036},{},[186037],{"type":23,"value":186038},"Label files are retrieved on demand",{"type":17,"tag":84,"props":186040,"children":186041},{},[186042],{"type":23,"value":180511},{"type":17,"tag":84,"props":186044,"children":186045},{},[186046],{"type":23,"value":180516},{"type":17,"tag":239,"props":186048,"children":186049},{"id":180524},[186050],{"type":23,"value":180527},{"type":17,"tag":29,"props":186052,"children":186053},{},[186054],{"type":23,"value":186055},"Shipping payloads may include:",{"type":17,"tag":80,"props":186057,"children":186058},{},[186059,186064,186069,186074,186079],{"type":17,"tag":84,"props":186060,"children":186061},{},[186062],{"type":23,"value":186063},"Full sender and recipient addresses",{"type":17,"tag":84,"props":186065,"children":186066},{},[186067],{"type":23,"value":186068},"Names, phone numbers, and emails inside address objects",{"type":17,"tag":84,"props":186070,"children":186071},{},[186072],{"type":23,"value":186073},"Tracking numbers and delivery status",{"type":17,"tag":84,"props":186075,"children":186076},{},[186077],{"type":23,"value":186078},"Customs declarations for international shipments",{"type":17,"tag":84,"props":186080,"children":186081},{},[186082],{"type":23,"value":186083},"Label PDFs containing recipient details",{"type":17,"tag":29,"props":186085,"children":186086},{},[186087],{"type":23,"value":186088},"Unified passes this data through without persistence. Applications are responsible for downstream storage, access controls, and compliance.",{"type":17,"tag":68,"props":186090,"children":186092},{"id":186091},"common-shipping-api-integration-use-cases",[186093],{"type":23,"value":186094},"Common Shipping API Integration Use Cases",{"type":17,"tag":239,"props":186096,"children":186098},{"id":186097},"multi-carrier-fulfillment",[186099],{"type":23,"value":186100},"Multi-Carrier Fulfillment",{"type":17,"tag":29,"props":186102,"children":186103},{},[186104],{"type":23,"value":186105},"Create labels and track shipments across FedEx, UPS, USPS, DHL, and others through one interface.",{"type":17,"tag":239,"props":186107,"children":186109},{"id":186108},"rate-shopping",[186110],{"type":23,"value":186111},"Rate Shopping",{"type":17,"tag":29,"props":186113,"children":186114},{},[186115],{"type":23,"value":186116},"Compare rates across carriers before committing to a shipment.",{"type":17,"tag":239,"props":186118,"children":186120},{"id":186119},"e-commerce-fulfillment",[186121],{"type":23,"value":186122},"E-commerce Fulfillment",{"type":17,"tag":29,"props":186124,"children":186125},{},[186126],{"type":23,"value":186127},"Turn commerce or accounting orders into shipments and labels.",{"type":17,"tag":239,"props":186129,"children":186131},{"id":186130},"returns-management",[186132],{"type":23,"value":186133},"Returns Management",{"type":17,"tag":29,"props":186135,"children":186136},{},[186137],{"type":23,"value":186138},"Generate return shipments and labels tied to original shipments.",{"type":17,"tag":239,"props":186140,"children":186142},{"id":186141},"tracking-notifications",[186143],{"type":23,"value":186144},"Tracking & Notifications",{"type":17,"tag":29,"props":186146,"children":186147},{},[186148],{"type":23,"value":186149},"Subscribe to tracking updates to notify customers or update internal systems.",{"type":17,"tag":68,"props":186151,"children":186152},{"id":180629},[186153],{"type":23,"value":180632},{"type":17,"tag":29,"props":186155,"children":186156},{},[186157],{"type":23,"value":186158},"Shipping systems impose real-world limits:",{"type":17,"tag":80,"props":186160,"children":186161},{},[186162,186167,186172,186177,186182],{"type":17,"tag":84,"props":186163,"children":186164},{},[186165],{"type":23,"value":186166},"Not all objects support events or polling",{"type":17,"tag":84,"props":186168,"children":186169},{},[186170],{"type":23,"value":186171},"Label creation is often irreversible",{"type":17,"tag":84,"props":186173,"children":186174},{},[186175],{"type":23,"value":186176},"Shipment status updates are usually indirect",{"type":17,"tag":84,"props":186178,"children":186179},{},[186180],{"type":23,"value":186181},"Provider feature parity is uneven",{"type":17,"tag":84,"props":186183,"children":186184},{},[186185],{"type":23,"value":186186},"Some carriers expose minimal APIs",{"type":17,"tag":29,"props":186188,"children":186189},{},[186190],{"type":23,"value":186191},"These are carrier constraints, not platform limitations.",{"type":17,"tag":68,"props":186193,"children":186195},{"id":186194},"build-vs-buy-shipping-integrations",[186196],{"type":23,"value":186197},"Build vs Buy Shipping Integrations",{"type":17,"tag":239,"props":186199,"children":186200},{"id":165021},[186201],{"type":23,"value":165024},{"type":17,"tag":80,"props":186203,"children":186204},{},[186205,186210,186215,186219],{"type":17,"tag":84,"props":186206,"children":186207},{},[186208],{"type":23,"value":186209},"Multiple carrier APIs to maintain",{"type":17,"tag":84,"props":186211,"children":186212},{},[186213],{"type":23,"value":186214},"Inconsistent rate, label, and tracking models",{"type":17,"tag":84,"props":186216,"children":186217},{},[186218],{"type":23,"value":180698},{"type":17,"tag":84,"props":186220,"children":186221},{},[186222],{"type":23,"value":186223},"Ongoing maintenance as carriers evolve",{"type":17,"tag":239,"props":186225,"children":186227},{"id":186226},"using-a-unified-shipping-api",[186228],{"type":23,"value":186229},"Using a Unified Shipping API",{"type":17,"tag":80,"props":186231,"children":186232},{},[186233,186238,186242,186247,186251],{"type":17,"tag":84,"props":186234,"children":186235},{},[186236],{"type":23,"value":186237},"One normalized shipping surface",{"type":17,"tag":84,"props":186239,"children":186240},{},[186241],{"type":23,"value":165071},{"type":17,"tag":84,"props":186243,"children":186244},{},[186245],{"type":23,"value":186246},"Standardized objects for shipments, labels, rates, and tracking",{"type":17,"tag":84,"props":186248,"children":186249},{},[186250],{"type":23,"value":180731},{"type":17,"tag":84,"props":186252,"children":186253},{},[186254],{"type":23,"value":137967},{"type":17,"tag":68,"props":186256,"children":186258},{"id":186257},"best-practices-for-shipping-integrations",[186259],{"type":23,"value":186260},"Best Practices for Shipping Integrations",{"type":17,"tag":80,"props":186262,"children":186263},{},[186264,186269,186273,186278,186283,186288],{"type":17,"tag":84,"props":186265,"children":186266},{},[186267],{"type":23,"value":186268},"Treat tracking as the primary update source",{"type":17,"tag":84,"props":186270,"children":186271},{},[186272],{"type":23,"value":180759},{"type":17,"tag":84,"props":186274,"children":186275},{},[186276],{"type":23,"value":186277},"Use webhooks when available, poll when necessary",{"type":17,"tag":84,"props":186279,"children":186280},{},[186281],{"type":23,"value":186282},"Do not assume label voids emit events",{"type":17,"tag":84,"props":186284,"children":186285},{},[186286],{"type":23,"value":186287},"Keep Shipping distinct from Orders, Payments, and CRM",{"type":17,"tag":84,"props":186289,"children":186290},{},[186291],{"type":23,"value":186292},"Design for one-way lifecycle transitions",{"type":17,"tag":68,"props":186294,"children":186296},{"id":186295},"build-shipping-integrations-with-realistic-expectations",[186297],{"type":23,"value":186298},"Build shipping integrations with realistic expectations",{"type":17,"tag":29,"props":186300,"children":186301},{},[186302],{"type":23,"value":186303},"Shipping APIs are inherently inconsistent because carriers are inconsistent.",{"type":17,"tag":29,"props":186305,"children":186306},{},[186307,186308,186312],{"type":23,"value":25244},{"type":17,"tag":48,"props":186309,"children":186310},{},[186311],{"type":23,"value":185316},{"type":23,"value":186313}," provides a normalized way to create shipments, purchase labels, compare rates, and track deliveries across providers — without storing shipping data or collapsing category boundaries.",{"type":17,"tag":29,"props":186315,"children":186316},{},[186317,186321,186322],{"type":17,"tag":48,"props":186318,"children":186319},{},[186320],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":186323,"children":186325},{"href":1612,"rel":186324},[214],[186326],{"type":17,"tag":48,"props":186327,"children":186328},{},[186329],{"type":23,"value":1616},{"type":17,"tag":29,"props":186331,"children":186332},{},[186333],{"type":23,"value":186334},"Test shipping integrations with live carrier data.",{"type":17,"tag":29,"props":186336,"children":186337},{},[186338,186342,186343],{"type":17,"tag":48,"props":186339,"children":186340},{},[186341],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":186344,"children":186346},{"href":1623,"rel":186345},[214],[186347],{"type":17,"tag":48,"props":186348,"children":186349},{},[186350],{"type":23,"value":1627},{"type":17,"tag":29,"props":186352,"children":186353},{},[186354],{"type":23,"value":186355},"Walk through fulfillment, returns, and cross-category workflows with the team that built the platform.",{"type":17,"tag":68,"props":186357,"children":186358},{"id":95759},[186359],{"type":23,"value":95762},{"type":17,"tag":29,"props":186361,"children":186362},{},[186363],{"type":17,"tag":48,"props":186364,"children":186365},{},[186366],{"type":23,"value":186367},"What is a Shipping API?",{"type":17,"tag":29,"props":186369,"children":186370},{},[186371],{"type":23,"value":186372},"An API that allows applications to create labels, calculate rates, track shipments, and manage fulfillment programmatically.",{"type":17,"tag":29,"props":186374,"children":186375},{},[186376],{"type":17,"tag":48,"props":186377,"children":186378},{},[186379],{"type":23,"value":186380},"Does the Shipping API handle orders or payments?",{"type":17,"tag":29,"props":186382,"children":186383},{},[186384],{"type":23,"value":186385},"No. Orders live in Accounting or Commerce. Payments live in the Payment API.",{"type":17,"tag":29,"props":186387,"children":186388},{},[186389],{"type":17,"tag":48,"props":186390,"children":186391},{},[186392],{"type":23,"value":186393},"Are shipping updates real time?",{"type":17,"tag":29,"props":186395,"children":186396},{},[186397],{"type":23,"value":186398},"Tracking updates may be delivered via native or virtual webhooks. Other objects often require polling or have no update mechanism.",{"type":17,"tag":29,"props":186400,"children":186401},{},[186402],{"type":17,"tag":48,"props":186403,"children":186404},{},[186405],{"type":23,"value":186406},"Can I create return shipments?",{"type":17,"tag":29,"props":186408,"children":186409},{},[186410],{"type":23,"value":186411},"Yes. Shipments support return indicators and references to original shipments.",{"type":17,"tag":29,"props":186413,"children":186414},{},[186415],{"type":17,"tag":48,"props":186416,"children":186417},{},[186418],{"type":23,"value":186419},"Does the Shipping API store shipping data?",{"type":17,"tag":29,"props":186421,"children":186422},{},[186423],{"type":23,"value":186424},"No. Shipping data is never stored at rest.",{"type":17,"tag":29,"props":186426,"children":186427},{},[186428],{"type":17,"tag":48,"props":186429,"children":186430},{},[186431],{"type":23,"value":165175},{"type":17,"tag":29,"props":186433,"children":186434},{},[186435],{"type":23,"value":186436},"Unified supports ShipStation, Shippo, EasyPost, FedEx, UPS, USPS, DHL, Canada Post, Sendcloud, and others.",{"title":7,"searchDepth":1629,"depth":1629,"links":186438},[186439,186440,186441,186442,186446,186453,186454,186458,186462,186469,186470,186474,186475,186476],{"id":185325,"depth":1629,"text":185328},{"id":34465,"depth":1629,"text":185378},{"id":185434,"depth":1629,"text":185437},{"id":185498,"depth":1629,"text":185501,"children":186443},[186444,186445],{"id":163879,"depth":1635,"text":163882},{"id":180105,"depth":1635,"text":180108},{"id":185567,"depth":1629,"text":185570,"children":186447},[186448,186449,186450,186451,186452],{"id":34492,"depth":1635,"text":35464},{"id":34502,"depth":1635,"text":35469},{"id":34719,"depth":1635,"text":35474},{"id":35158,"depth":1635,"text":35479},{"id":105133,"depth":1635,"text":35484},{"id":185787,"depth":1629,"text":185790},{"id":180375,"depth":1629,"text":180378,"children":186455},[186456,186457],{"id":180381,"depth":1635,"text":180384},{"id":180433,"depth":1635,"text":180436},{"id":164849,"depth":1629,"text":164852,"children":186459},[186460,186461],{"id":90302,"depth":1635,"text":179326},{"id":180524,"depth":1635,"text":180527},{"id":186091,"depth":1629,"text":186094,"children":186463},[186464,186465,186466,186467,186468],{"id":186097,"depth":1635,"text":186100},{"id":186108,"depth":1635,"text":186111},{"id":186119,"depth":1635,"text":186122},{"id":186130,"depth":1635,"text":186133},{"id":186141,"depth":1635,"text":186144},{"id":180629,"depth":1629,"text":180632},{"id":186194,"depth":1629,"text":186197,"children":186471},[186472,186473],{"id":165021,"depth":1635,"text":165024},{"id":186226,"depth":1635,"text":186229},{"id":186257,"depth":1629,"text":186260},{"id":186295,"depth":1629,"text":186298},{"id":95759,"depth":1629,"text":95762},"content:blog:shipping_api_integration_labels_rates_tracking_and_fulfillment_data_across_carriers.md","blog/shipping_api_integration_labels_rates_tracking_and_fulfillment_data_across_carriers.md","blog/shipping_api_integration_labels_rates_tracking_and_fulfillment_data_across_carriers",{"_path":186481,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":186482,"description":186483,"img":186484,"date":186485,"tag":12,"body":186486,"_type":1677,"_id":187459,"_source":1679,"_file":187460,"_stem":187461,"_extension":1682},"/blog/e_commerce_api_integration_products_inventory_catalogs_and_sales_channels_across_platforms","E-Commerce API Integration: Products, Inventory, Catalogs, and Sales Channels Across Platforms","Commerce systems sit at the center of how products are created, priced, stocked, and presented across digital storefronts. Catalogs change constantly, variants...","https://s3.us-east-2.amazonaws.com/unified-article-images/e_commerce_api_integration_products_inventory_catalogs_and_sales_channels_across_platforms-icon.png","2026-02-09T14:56:00.000Z",{"type":14,"children":186487,"toc":187416},[186488,186493,186496,186503,186508,186516,186521,186527,186532,186537,186542,186565,186570,186576,186581,186585,186613,186618,186624,186629,186662,186667,186673,186678,186682,186692,186698,186703,186727,186732,186738,186743,186749,186754,186772,186777,186782,186787,186805,186810,186814,186819,186837,186842,186846,186851,186869,186874,186878,186883,186896,186901,186905,186910,186928,186933,186938,186943,186961,186967,186972,186990,186995,187001,187007,187012,187018,187023,187029,187034,187038,187043,187047,187064,187068,187072,187090,187095,187101,187107,187112,187118,187123,187129,187134,187140,187145,187151,187156,187160,187187,187192,187198,187202,187224,187230,187255,187261,187289,187295,187300,187305,187312,187320,187327,187335,187339,187347,187352,187359,187364,187372,187377,187385,187390,187398,187403,187411],{"type":17,"tag":18,"props":186489,"children":186491},{"id":186490},"e-commerce-api-integration-products-inventory-catalogs-and-sales-channels-across-platforms",[186492],{"type":23,"value":186482},{"type":17,"tag":25,"props":186494,"children":186495},{},[],{"type":17,"tag":29,"props":186497,"children":186498},{},[186499],{"type":17,"tag":33,"props":186500,"children":186501},{},[186502],{"type":23,"value":182031},{"type":17,"tag":29,"props":186504,"children":186505},{},[186506],{"type":23,"value":186507},"Commerce systems sit at the center of how products are created, priced, stocked, and presented across digital storefronts. Catalogs change constantly, variants move in and out of stock, collections are reorganized, reviews are moderated, and sales channels are added or removed. When commerce data is fragmented across platforms—or stitched together with batch sync jobs—inventory drifts, catalogs fall out of date, and downstream systems make decisions on stale information.",{"type":17,"tag":29,"props":186509,"children":186510},{},[186511,186515],{"type":17,"tag":133,"props":186512,"children":186513},{"href":20451},[186514],{"type":23,"value":20454},{"type":23,"value":165348},{"type":17,"tag":29,"props":186517,"children":186518},{},[186519],{"type":23,"value":186520},"In this guide, we explain what a Commerce API actually does, which data models matter in practice, how real-time updates are delivered, and how Unified's Commerce API fits alongside Accounting, Payments, Shipping, CRM, and Marketing within Unified's broader platform.",{"type":17,"tag":68,"props":186522,"children":186524},{"id":186523},"introduction-to-commerce-api-integrations",[186525],{"type":23,"value":186526},"Introduction to Commerce API Integrations",{"type":17,"tag":29,"props":186528,"children":186529},{},[186530],{"type":23,"value":186531},"E-commerce platforms such as Shopify, WooCommerce, and BigCommerce power online catalogs, inventory, and storefront presentation.",{"type":17,"tag":29,"props":186533,"children":186534},{},[186535],{"type":23,"value":186536},"Each platform exposes its own APIs, object models, and update mechanisms. Products may be structured differently, inventory may be tracked at variant or location level, and collections or categories behave inconsistently across systems.",{"type":17,"tag":29,"props":186538,"children":186539},{},[186540],{"type":23,"value":186541},"Products that need to support multiple commerce platforms quickly encounter:",{"type":17,"tag":80,"props":186543,"children":186544},{},[186545,186550,186555,186560],{"type":17,"tag":84,"props":186546,"children":186547},{},[186548],{"type":23,"value":186549},"Incompatible product and variant schemas",{"type":17,"tag":84,"props":186551,"children":186552},{},[186553],{"type":23,"value":186554},"Platform-specific inventory models",{"type":17,"tag":84,"props":186556,"children":186557},{},[186558],{"type":23,"value":186559},"Inconsistent collection and category hierarchies",{"type":17,"tag":84,"props":186561,"children":186562},{},[186563],{"type":23,"value":186564},"Uneven webhook support for catalog and stock changes",{"type":17,"tag":29,"props":186566,"children":186567},{},[186568],{"type":23,"value":186569},"A Commerce API provides a consistent way to read and write catalog and inventory data across platforms, without building and maintaining separate integrations for each provider.",{"type":17,"tag":68,"props":186571,"children":186573},{"id":186572},"what-is-a-commerce-api",[186574],{"type":23,"value":186575},"What Is a Commerce API?",{"type":17,"tag":29,"props":186577,"children":186578},{},[186579],{"type":23,"value":186580},"A Commerce API allows applications to programmatically manage and consume product-side e-commerce data.",{"type":17,"tag":29,"props":186582,"children":186583},{},[186584],{"type":23,"value":167214},{"type":17,"tag":80,"props":186586,"children":186587},{},[186588,186593,186598,186603,186608],{"type":17,"tag":84,"props":186589,"children":186590},{},[186591],{"type":23,"value":186592},"Creating and updating products and variants",{"type":17,"tag":84,"props":186594,"children":186595},{},[186596],{"type":23,"value":186597},"Synchronizing inventory across locations and channels",{"type":17,"tag":84,"props":186599,"children":186600},{},[186601],{"type":23,"value":186602},"Managing collections, categories, and catalogs",{"type":17,"tag":84,"props":186604,"children":186605},{},[186606],{"type":23,"value":186607},"Retrieving storefront metadata and sales-channel configuration",{"type":17,"tag":84,"props":186609,"children":186610},{},[186611],{"type":23,"value":186612},"Aggregating product reviews and ratings",{"type":17,"tag":29,"props":186614,"children":186615},{},[186616],{"type":23,"value":186617},"Commerce APIs focus on what is being sold and how it is stocked and presented. They are deliberately not responsible for orders, payments, customers, or fulfillment.",{"type":17,"tag":68,"props":186619,"children":186621},{"id":186620},"commerce-api-vs-accounting-payments-crm-marketing-and-shipping",[186622],{"type":23,"value":186623},"Commerce API vs Accounting, Payments, CRM, Marketing, and Shipping",{"type":17,"tag":29,"props":186625,"children":186626},{},[186627],{"type":23,"value":186628},"Unified treats Commerce as one category within the Finance & Commerce group, with strict boundaries.",{"type":17,"tag":80,"props":186630,"children":186631},{},[186632,186637,186642,186647,186652,186657],{"type":17,"tag":84,"props":186633,"children":186634},{},[186635],{"type":23,"value":186636},"Commerce APIs manage product catalogs: items, variants, inventory, collections, locations, reviews, and sales channels",{"type":17,"tag":84,"props":186638,"children":186639},{},[186640],{"type":23,"value":186641},"Accounting APIs manage financial records: orders, invoices, bills, journal entries, tax rates, and reports",{"type":17,"tag":84,"props":186643,"children":186644},{},[186645],{"type":23,"value":186646},"Payment APIs manage money movement: payments, refunds, payouts, subscriptions",{"type":17,"tag":84,"props":186648,"children":186649},{},[186650],{"type":23,"value":186651},"Shipping APIs manage logistics: shipments, labels, carriers, tracking, and rates",{"type":17,"tag":84,"props":186653,"children":186654},{},[186655],{"type":23,"value":186656},"CRM APIs manage people and relationships: contacts, companies, deals, and pipelines",{"type":17,"tag":84,"props":186658,"children":186659},{},[186660],{"type":23,"value":186661},"Marketing APIs manage audiences and campaigns: lists, members, and engagement data",{"type":17,"tag":29,"props":186663,"children":186664},{},[186665],{"type":23,"value":186666},"Commerce data often feeds these systems, but Commerce itself never becomes the source of truth for finance, customers, or fulfillment. Any handoff across categories is explicit and application-controlled.",{"type":17,"tag":68,"props":186668,"children":186670},{"id":186669},"real-time-vs-batch-commerce-data",[186671],{"type":23,"value":186672},"Real-Time vs Batch Commerce Data",{"type":17,"tag":29,"props":186674,"children":186675},{},[186676],{"type":23,"value":186677},"Commerce systems are highly dynamic. Inventory levels change with every sale, catalogs update throughout the day, and reviews are constantly added or moderated.",{"type":17,"tag":239,"props":186679,"children":186680},{"id":163879},[186681],{"type":23,"value":163882},{"type":17,"tag":29,"props":186683,"children":186684},{},[186685,186687,186691],{"type":23,"value":186686},"Unified's Commerce API routes every request directly to the underlying commerce platform. There is no cached replica and no background sync job. Reads reflect the current state of the source system, subject to provider ",{"type":17,"tag":133,"props":186688,"children":186689},{"href":135},[186690],{"type":23,"value":138},{"type":23,"value":171686},{"type":17,"tag":239,"props":186693,"children":186695},{"id":186694},"update-delivery-with-webhooks-and-polling",[186696],{"type":23,"value":186697},"Update Delivery with Webhooks and Polling",{"type":17,"tag":29,"props":186699,"children":186700},{},[186701],{"type":23,"value":186702},"Commerce platforms vary widely in event support.",{"type":17,"tag":80,"props":186704,"children":186705},{},[186706,186717,186722],{"type":17,"tag":84,"props":186707,"children":186708},{},[186709,186711,186715],{"type":23,"value":186710},"Some platforms emit native ",{"type":17,"tag":133,"props":186712,"children":186713},{"href":4999},[186714],{"type":23,"value":5002},{"type":23,"value":186716}," for product, inventory, or collection changes",{"type":17,"tag":84,"props":186718,"children":186719},{},[186720],{"type":23,"value":186721},"Others provide no webhooks at all",{"type":17,"tag":84,"props":186723,"children":186724},{},[186725],{"type":23,"value":186726},"Certain objects support polling only",{"type":17,"tag":29,"props":186728,"children":186729},{},[186730],{"type":23,"value":186731},"Unified supports both native webhooks, forwarded when available, and virtual webhooks, which use polling-based change detection. For objects or providers without webhook support, applications poll list endpoints using incremental filters such as updated_gte.",{"type":17,"tag":68,"props":186733,"children":186735},{"id":186734},"core-commerce-data-models",[186736],{"type":23,"value":186737},"Core Commerce Data Models",{"type":17,"tag":29,"props":186739,"children":186740},{},[186741],{"type":23,"value":186742},"Unified normalizes commerce data into seven standardized objects. Provider behavior varies, and integrations should be designed defensively.",{"type":17,"tag":239,"props":186744,"children":186746},{"id":186745},"items-products",[186747],{"type":23,"value":186748},"Items (Products)",{"type":17,"tag":29,"props":186750,"children":186751},{},[186752],{"type":23,"value":186753},"Items represent products in the catalog.",{"type":17,"tag":80,"props":186755,"children":186756},{},[186757,186762,186767],{"type":17,"tag":84,"props":186758,"children":186759},{},[186760],{"type":23,"value":186761},"Support create, read, update, and remove operations where providers allow",{"type":17,"tag":84,"props":186763,"children":186764},{},[186765],{"type":23,"value":186766},"Store internal and public names, descriptions, tax flags, vendor names, and metadata",{"type":17,"tag":84,"props":186768,"children":186769},{},[186770],{"type":23,"value":186771},"Contain embedded variants and collection relationships",{"type":17,"tag":29,"props":186773,"children":186774},{},[186775],{"type":23,"value":186776},"Some platforms restrict deletion or treat it as archiving rather than removal.",{"type":17,"tag":239,"props":186778,"children":186780},{"id":186779},"item-variants",[186781],{"type":23,"value":38931},{"type":17,"tag":29,"props":186783,"children":186784},{},[186785],{"type":23,"value":186786},"Variants represent sellable SKUs such as sizes or colors.",{"type":17,"tag":80,"props":186788,"children":186789},{},[186790,186795,186800],{"type":17,"tag":84,"props":186791,"children":186792},{},[186793],{"type":23,"value":186794},"Support full CRUD where providers allow",{"type":17,"tag":84,"props":186796,"children":186797},{},[186798],{"type":23,"value":186799},"Include SKU, pricing, options, physical dimensions, and visibility flags",{"type":17,"tag":84,"props":186801,"children":186802},{},[186803],{"type":23,"value":186804},"Track availability timing and shipping requirements",{"type":17,"tag":29,"props":186806,"children":186807},{},[186808],{"type":23,"value":186809},"Stock is not stored on the variant itself. Inventory is tracked separately.",{"type":17,"tag":239,"props":186811,"children":186812},{"id":101911},[186813],{"type":23,"value":38946},{"type":17,"tag":29,"props":186815,"children":186816},{},[186817],{"type":23,"value":186818},"Inventory represents stock levels at specific locations.",{"type":17,"tag":80,"props":186820,"children":186821},{},[186822,186827,186832],{"type":17,"tag":84,"props":186823,"children":186824},{},[186825],{"type":23,"value":186826},"Links items or variants to locations",{"type":17,"tag":84,"props":186828,"children":186829},{},[186830],{"type":23,"value":186831},"Stores current available quantity",{"type":17,"tag":84,"props":186833,"children":186834},{},[186835],{"type":23,"value":186836},"Updates frequently and is often latency-sensitive",{"type":17,"tag":29,"props":186838,"children":186839},{},[186840],{"type":23,"value":186841},"Many platforms restrict inventory writes or expose only a single default location.",{"type":17,"tag":239,"props":186843,"children":186844},{"id":38595},[186845],{"type":23,"value":38941},{"type":17,"tag":29,"props":186847,"children":186848},{},[186849],{"type":23,"value":186850},"Collections group products into categories or catalogs.",{"type":17,"tag":80,"props":186852,"children":186853},{},[186854,186859,186864],{"type":17,"tag":84,"props":186855,"children":186856},{},[186857],{"type":23,"value":186858},"Support hierarchical structures via parent_id",{"type":17,"tag":84,"props":186860,"children":186861},{},[186862],{"type":23,"value":186863},"Control storefront visibility and merchandising",{"type":17,"tag":84,"props":186865,"children":186866},{},[186867],{"type":23,"value":186868},"May be read-only on some platforms",{"type":17,"tag":29,"props":186870,"children":186871},{},[186872],{"type":23,"value":186873},"Removing a collection does not delete items, only the association.",{"type":17,"tag":239,"props":186875,"children":186876},{"id":101916},[186877],{"type":23,"value":38951},{"type":17,"tag":29,"props":186879,"children":186880},{},[186881],{"type":23,"value":186882},"Locations represent warehouses, stores, or fulfillment points.",{"type":17,"tag":80,"props":186884,"children":186885},{},[186886,186891],{"type":17,"tag":84,"props":186887,"children":186888},{},[186889],{"type":23,"value":186890},"Store address, currency, locale, and hierarchy",{"type":17,"tag":84,"props":186892,"children":186893},{},[186894],{"type":23,"value":186895},"Control where inventory is stocked and sold",{"type":17,"tag":29,"props":186897,"children":186898},{},[186899],{"type":23,"value":186900},"Location creation or modification is often restricted by providers.",{"type":17,"tag":239,"props":186902,"children":186903},{"id":38673},[186904],{"type":23,"value":38956},{"type":17,"tag":29,"props":186906,"children":186907},{},[186908],{"type":23,"value":186909},"Reviews represent customer feedback.",{"type":17,"tag":80,"props":186911,"children":186912},{},[186913,186918,186923],{"type":17,"tag":84,"props":186914,"children":186915},{},[186916],{"type":23,"value":186917},"Include rating, title, content, author details, and moderation status",{"type":17,"tag":84,"props":186919,"children":186920},{},[186921],{"type":23,"value":186922},"Support creation and moderation only where platforms allow",{"type":17,"tag":84,"props":186924,"children":186925},{},[186926],{"type":23,"value":186927},"Expose verification and vote counts as read-only fields",{"type":17,"tag":29,"props":186929,"children":186930},{},[186931],{"type":23,"value":186932},"Reviews may contain customer-generated content and should be handled carefully downstream.",{"type":17,"tag":239,"props":186934,"children":186936},{"id":186935},"sales-channels",[186937],{"type":23,"value":38970},{"type":17,"tag":29,"props":186939,"children":186940},{},[186941],{"type":23,"value":186942},"Sales channels define where products are distributed.",{"type":17,"tag":80,"props":186944,"children":186945},{},[186946,186951,186956],{"type":17,"tag":84,"props":186947,"children":186948},{},[186949],{"type":23,"value":186950},"Use a stable slug as the channel identifier",{"type":17,"tag":84,"props":186952,"children":186953},{},[186954],{"type":23,"value":186955},"Reference collections to control catalog exposure",{"type":17,"tag":84,"props":186957,"children":186958},{},[186959],{"type":23,"value":186960},"Are often fixed or read-only on marketplaces",{"type":17,"tag":68,"props":186962,"children":186964},{"id":186963},"identity-and-ownership-in-commerce",[186965],{"type":23,"value":186966},"Identity and Ownership in Commerce",{"type":17,"tag":29,"props":186968,"children":186969},{},[186970],{"type":23,"value":186971},"Commerce objects use commerce-scoped identities only.",{"type":17,"tag":80,"props":186973,"children":186974},{},[186975,186980,186985],{"type":17,"tag":84,"props":186976,"children":186977},{},[186978],{"type":23,"value":186979},"No CRM contact or company identifiers",{"type":17,"tag":84,"props":186981,"children":186982},{},[186983],{"type":23,"value":186984},"No payment or transaction references",{"type":17,"tag":84,"props":186986,"children":186987},{},[186988],{"type":23,"value":186989},"No marketing list or member linkage",{"type":17,"tag":29,"props":186991,"children":186992},{},[186993],{"type":23,"value":186994},"The only cross-category reference is an optional account_id on items, linking to an Accounting account. All other relationships remain strictly within the Commerce domain.",{"type":17,"tag":68,"props":186996,"children":186998},{"id":186997},"inventory-and-catalog-updates-in-practice",[186999],{"type":23,"value":187000},"Inventory and Catalog Updates in Practice",{"type":17,"tag":239,"props":187002,"children":187004},{"id":187003},"inventory-changes",[187005],{"type":23,"value":187006},"Inventory Changes",{"type":17,"tag":29,"props":187008,"children":187009},{},[187010],{"type":23,"value":187011},"Inventory updates are delivered through native or virtual webhooks where available, or retrieved via polling with updated_gte. Latency depends on provider capabilities and polling configuration.",{"type":17,"tag":239,"props":187013,"children":187015},{"id":187014},"catalog-changes",[187016],{"type":23,"value":187017},"Catalog Changes",{"type":17,"tag":29,"props":187019,"children":187020},{},[187021],{"type":23,"value":187022},"Item, variant, and collection updates follow the same pattern. Native webhooks provide immediate updates when supported. Virtual webhooks introduce short delays.",{"type":17,"tag":239,"props":187024,"children":187026},{"id":187025},"reviews-and-moderation",[187027],{"type":23,"value":187028},"Reviews and Moderation",{"type":17,"tag":29,"props":187030,"children":187031},{},[187032],{"type":23,"value":187033},"Review creation and moderation behavior varies by platform. Many providers require polling to detect changes.",{"type":17,"tag":68,"props":187035,"children":187036},{"id":164849},[187037],{"type":23,"value":164852},{"type":17,"tag":29,"props":187039,"children":187040},{},[187041],{"type":23,"value":187042},"Commerce data includes both business-sensitive and customer-generated information. Unified's architecture minimizes exposure.",{"type":17,"tag":239,"props":187044,"children":187045},{"id":90302},[187046],{"type":23,"value":179326},{"type":17,"tag":80,"props":187048,"children":187049},{},[187050,187055,187060],{"type":17,"tag":84,"props":187051,"children":187052},{},[187053],{"type":23,"value":187054},"No commerce data is stored at rest",{"type":17,"tag":84,"props":187056,"children":187057},{},[187058],{"type":23,"value":187059},"No payloads are written to logs",{"type":17,"tag":84,"props":187061,"children":187062},{},[187063],{"type":23,"value":180516},{"type":17,"tag":29,"props":187065,"children":187066},{},[187067],{"type":23,"value":178764},{"type":17,"tag":239,"props":187069,"children":187070},{"id":179352},[187071],{"type":23,"value":179355},{"type":17,"tag":80,"props":187073,"children":187074},{},[187075,187080,187085],{"type":17,"tag":84,"props":187076,"children":187077},{},[187078],{"type":23,"value":187079},"Reviews may include names, emails, avatars, and free-text content",{"type":17,"tag":84,"props":187081,"children":187082},{},[187083],{"type":23,"value":187084},"Media assets may include embedded metadata",{"type":17,"tag":84,"props":187086,"children":187087},{},[187088],{"type":23,"value":187089},"Pricing, cost, and inventory levels are commercially sensitive",{"type":17,"tag":29,"props":187091,"children":187092},{},[187093],{"type":23,"value":187094},"For AI-driven workflows, MCP-based integrations can remove sensitive fields before data reaches downstream systems.",{"type":17,"tag":68,"props":187096,"children":187098},{"id":187097},"common-commerce-api-use-cases",[187099],{"type":23,"value":187100},"Common Commerce API Use Cases",{"type":17,"tag":239,"props":187102,"children":187104},{"id":187103},"unified-catalog-management",[187105],{"type":23,"value":187106},"Unified Catalog Management",{"type":17,"tag":29,"props":187108,"children":187109},{},[187110],{"type":23,"value":187111},"Manage products and variants across multiple platforms from a single integration.",{"type":17,"tag":239,"props":187113,"children":187115},{"id":187114},"inventory-synchronization",[187116],{"type":23,"value":187117},"Inventory Synchronization",{"type":17,"tag":29,"props":187119,"children":187120},{},[187121],{"type":23,"value":187122},"Keep stock levels aligned across sellers, channels, and locations to prevent overselling.",{"type":17,"tag":239,"props":187124,"children":187126},{"id":187125},"marketplace-and-channel-enablement",[187127],{"type":23,"value":187128},"Marketplace and Channel Enablement",{"type":17,"tag":29,"props":187130,"children":187131},{},[187132],{"type":23,"value":187133},"Expose product catalogs consistently across storefronts and marketplaces.",{"type":17,"tag":239,"props":187135,"children":187137},{"id":187136},"review-aggregation",[187138],{"type":23,"value":187139},"Review Aggregation",{"type":17,"tag":29,"props":187141,"children":187142},{},[187143],{"type":23,"value":187144},"Collect and analyze product feedback across platforms.",{"type":17,"tag":239,"props":187146,"children":187148},{"id":187147},"commerce-analytics",[187149],{"type":23,"value":187150},"Commerce Analytics",{"type":17,"tag":29,"props":187152,"children":187153},{},[187154],{"type":23,"value":187155},"Combine catalog, inventory, and channel data for reporting and forecasting.",{"type":17,"tag":68,"props":187157,"children":187158},{"id":164971},[187159],{"type":23,"value":164974},{"type":17,"tag":80,"props":187161,"children":187162},{},[187163,187167,187172,187177,187182],{"type":17,"tag":84,"props":187164,"children":187165},{},[187166],{"type":23,"value":180660},{"type":17,"tag":84,"props":187168,"children":187169},{},[187170],{"type":23,"value":187171},"Inventory updates may lag on polling-only platforms",{"type":17,"tag":84,"props":187173,"children":187174},{},[187175],{"type":23,"value":187176},"Reviews often have moderation and write restrictions",{"type":17,"tag":84,"props":187178,"children":187179},{},[187180],{"type":23,"value":187181},"Deletions may be soft-deletes or archives",{"type":17,"tag":84,"props":187183,"children":187184},{},[187185],{"type":23,"value":187186},"Platform feature parity is uneven",{"type":17,"tag":29,"props":187188,"children":187189},{},[187190],{"type":23,"value":187191},"These constraints reflect real commerce platform behavior and should inform system design.",{"type":17,"tag":68,"props":187193,"children":187195},{"id":187194},"build-vs-buy-commerce-integrations",[187196],{"type":23,"value":187197},"Build vs Buy Commerce Integrations",{"type":17,"tag":239,"props":187199,"children":187200},{"id":165021},[187201],{"type":23,"value":165024},{"type":17,"tag":80,"props":187203,"children":187204},{},[187205,187209,187214,187219],{"type":17,"tag":84,"props":187206,"children":187207},{},[187208],{"type":23,"value":174000},{"type":17,"tag":84,"props":187210,"children":187211},{},[187212],{"type":23,"value":187213},"Inconsistent product and inventory models",{"type":17,"tag":84,"props":187215,"children":187216},{},[187217],{"type":23,"value":187218},"Custom polling and retry logic",{"type":17,"tag":84,"props":187220,"children":187221},{},[187222],{"type":23,"value":187223},"Ongoing maintenance as platforms evolve",{"type":17,"tag":239,"props":187225,"children":187227},{"id":187226},"using-a-unified-commerce-api",[187228],{"type":23,"value":187229},"Using a Unified Commerce API",{"type":17,"tag":80,"props":187231,"children":187232},{},[187233,187238,187243,187247,187251],{"type":17,"tag":84,"props":187234,"children":187235},{},[187236],{"type":23,"value":187237},"One category-specific API surface",{"type":17,"tag":84,"props":187239,"children":187240},{},[187241],{"type":23,"value":187242},"Normalized catalog and inventory models",{"type":17,"tag":84,"props":187244,"children":187245},{},[187246],{"type":23,"value":165071},{"type":17,"tag":84,"props":187248,"children":187249},{},[187250],{"type":23,"value":180731},{"type":17,"tag":84,"props":187252,"children":187253},{},[187254],{"type":23,"value":137967},{"type":17,"tag":68,"props":187256,"children":187258},{"id":187257},"best-practices-for-commerce-integrations",[187259],{"type":23,"value":187260},"Best Practices for Commerce Integrations",{"type":17,"tag":80,"props":187262,"children":187263},{},[187264,187269,187274,187279,187284],{"type":17,"tag":84,"props":187265,"children":187266},{},[187267],{"type":23,"value":187268},"Treat Commerce as product-side data only",{"type":17,"tag":84,"props":187270,"children":187271},{},[187272],{"type":23,"value":187273},"Design for provider variability and partial write support",{"type":17,"tag":84,"props":187275,"children":187276},{},[187277],{"type":23,"value":187278},"Use webhooks where available and poll selectively",{"type":17,"tag":84,"props":187280,"children":187281},{},[187282],{"type":23,"value":187283},"Keep catalog concerns separate from orders and payments",{"type":17,"tag":84,"props":187285,"children":187286},{},[187287],{"type":23,"value":187288},"Restrict access to sensitive pricing and review data",{"type":17,"tag":68,"props":187290,"children":187292},{"id":187291},"build-commerce-integrations-with-clean-boundaries",[187293],{"type":23,"value":187294},"Build commerce integrations with clean boundaries",{"type":17,"tag":29,"props":187296,"children":187297},{},[187298],{"type":23,"value":187299},"If your product relies on product catalogs, inventory levels, and storefront configuration across multiple platforms, maintaining separate commerce integrations quickly becomes complex and error-prone.",{"type":17,"tag":29,"props":187301,"children":187302},{},[187303],{"type":23,"value":187304},"Unified's Commerce API provides a consistent way to manage items, variants, inventory, collections, locations, reviews, and sales channels, without storing commerce data or collapsing category boundaries.",{"type":17,"tag":29,"props":187306,"children":187307},{},[187308],{"type":17,"tag":48,"props":187309,"children":187310},{},[187311],{"type":23,"value":44481},{"type":17,"tag":29,"props":187313,"children":187314},{},[187315],{"type":17,"tag":133,"props":187316,"children":187318},{"href":1612,"rel":187317},[214],[187319],{"type":23,"value":1612},{"type":17,"tag":29,"props":187321,"children":187322},{},[187323],{"type":17,"tag":48,"props":187324,"children":187325},{},[187326],{"type":23,"value":44490},{"type":17,"tag":29,"props":187328,"children":187329},{},[187330],{"type":17,"tag":133,"props":187331,"children":187333},{"href":1623,"rel":187332},[214],[187334],{"type":23,"value":1623},{"type":17,"tag":68,"props":187336,"children":187337},{"id":95759},[187338],{"type":23,"value":95762},{"type":17,"tag":29,"props":187340,"children":187341},{},[187342],{"type":17,"tag":48,"props":187343,"children":187344},{},[187345],{"type":23,"value":187346},"What is a Commerce API?",{"type":17,"tag":29,"props":187348,"children":187349},{},[187350],{"type":23,"value":187351},"An API that allows applications to manage product catalogs, variants, inventory, collections, locations, reviews, and sales channels programmatically.",{"type":17,"tag":29,"props":187353,"children":187354},{},[187355],{"type":17,"tag":48,"props":187356,"children":187357},{},[187358],{"type":23,"value":165175},{"type":17,"tag":29,"props":187360,"children":187361},{},[187362],{"type":23,"value":187363},"Unified supports platforms including Shopify, WooCommerce, BigCommerce, and many others.",{"type":17,"tag":29,"props":187365,"children":187366},{},[187367],{"type":17,"tag":48,"props":187368,"children":187369},{},[187370],{"type":23,"value":187371},"Does the Commerce API handle orders or payments?",{"type":17,"tag":29,"props":187373,"children":187374},{},[187375],{"type":23,"value":187376},"No. Orders belong to Accounting, and payments belong to the Payment API.",{"type":17,"tag":29,"props":187378,"children":187379},{},[187380],{"type":17,"tag":48,"props":187381,"children":187382},{},[187383],{"type":23,"value":187384},"Are inventory updates real time?",{"type":17,"tag":29,"props":187386,"children":187387},{},[187388],{"type":23,"value":187389},"Yes, subject to provider capabilities. Native or virtual webhooks are used where available, and polling is used otherwise.",{"type":17,"tag":29,"props":187391,"children":187392},{},[187393],{"type":17,"tag":48,"props":187394,"children":187395},{},[187396],{"type":23,"value":187397},"Does the Commerce API store product data?",{"type":17,"tag":29,"props":187399,"children":187400},{},[187401],{"type":23,"value":187402},"No. Commerce data is never stored at rest.",{"type":17,"tag":29,"props":187404,"children":187405},{},[187406],{"type":17,"tag":48,"props":187407,"children":187408},{},[187409],{"type":23,"value":187410},"How does Commerce differ from CRM or Marketing?",{"type":17,"tag":29,"props":187412,"children":187413},{},[187414],{"type":23,"value":187415},"Commerce manages products and inventory. CRM manages people and deals. Marketing manages audiences and campaigns.",{"title":7,"searchDepth":1629,"depth":1629,"links":187417},[187418,187419,187420,187421,187425,187434,187435,187440,187444,187451,187452,187456,187457,187458],{"id":186523,"depth":1629,"text":186526},{"id":186572,"depth":1629,"text":186575},{"id":186620,"depth":1629,"text":186623},{"id":186669,"depth":1629,"text":186672,"children":187422},[187423,187424],{"id":163879,"depth":1635,"text":163882},{"id":186694,"depth":1635,"text":186697},{"id":186734,"depth":1629,"text":186737,"children":187426},[187427,187428,187429,187430,187431,187432,187433],{"id":186745,"depth":1635,"text":186748},{"id":186779,"depth":1635,"text":38931},{"id":101911,"depth":1635,"text":38946},{"id":38595,"depth":1635,"text":38941},{"id":101916,"depth":1635,"text":38951},{"id":38673,"depth":1635,"text":38956},{"id":186935,"depth":1635,"text":38970},{"id":186963,"depth":1629,"text":186966},{"id":186997,"depth":1629,"text":187000,"children":187436},[187437,187438,187439],{"id":187003,"depth":1635,"text":187006},{"id":187014,"depth":1635,"text":187017},{"id":187025,"depth":1635,"text":187028},{"id":164849,"depth":1629,"text":164852,"children":187441},[187442,187443],{"id":90302,"depth":1635,"text":179326},{"id":179352,"depth":1635,"text":179355},{"id":187097,"depth":1629,"text":187100,"children":187445},[187446,187447,187448,187449,187450],{"id":187103,"depth":1635,"text":187106},{"id":187114,"depth":1635,"text":187117},{"id":187125,"depth":1635,"text":187128},{"id":187136,"depth":1635,"text":187139},{"id":187147,"depth":1635,"text":187150},{"id":164971,"depth":1629,"text":164974},{"id":187194,"depth":1629,"text":187197,"children":187453},[187454,187455],{"id":165021,"depth":1635,"text":165024},{"id":187226,"depth":1635,"text":187229},{"id":187257,"depth":1629,"text":187260},{"id":187291,"depth":1629,"text":187294},{"id":95759,"depth":1629,"text":95762},"content:blog:e_commerce_api_integration_products_inventory_catalogs_and_sales_channels_across_platforms.md","blog/e_commerce_api_integration_products_inventory_catalogs_and_sales_channels_across_platforms.md","blog/e_commerce_api_integration_products_inventory_catalogs_and_sales_channels_across_platforms",{"_path":187463,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":128635,"description":187464,"img":187465,"date":187466,"tag":12,"body":187467,"_type":1677,"_id":188792,"_source":1679,"_file":188793,"_stem":188794,"_extension":1682},"/blog/accounting_api_integration_invoices_bills_transactions_and_financial_reporting_across_platforms","Accounting systems sit at the core of every business. Invoices move from draft to paid. Bills accrue, settle, or get voided. Transactions post to the ledger....","https://s3.us-east-2.amazonaws.com/unified-article-images/accounting_api_integration_invoices_bills_transactions_and_financial_reporting_across_platforms-icon.png","2026-02-09T02:36:00.000Z",{"type":14,"children":187468,"toc":188750},[187469,187474,187477,187484,187489,187498,187504,187509,187514,187546,187551,187556,187566,187570,187593,187605,187610,187616,187621,187671,187676,187682,187688,187693,187711,187716,187722,187734,187740,187751,187776,187781,187787,187792,187854,187859,187907,187912,187918,187923,187951,187956,187961,187966,187988,187992,187997,188052,188057,188063,188068,188090,188102,188108,188113,188131,188150,188156,188161,188184,188194,188199,188205,188210,188238,188243,188249,188255,188265,188283,188288,188294,188299,188304,188322,188328,188332,188349,188354,188360,188365,188388,188393,188398,188404,188410,188415,188421,188426,188432,188437,188443,188448,188454,188459,188465,188493,188498,188504,188508,188531,188537,188565,188571,188604,188610,188615,188625,188641,188646,188661,188666,188669,188673,188681,188686,188693,188698,188706,188711,188719,188724,188732,188737,188745],{"type":17,"tag":18,"props":187470,"children":187472},{"id":187471},"accounting-api-integration-invoices-bills-transactions-and-financial-reporting-across-platforms",[187473],{"type":23,"value":128635},{"type":17,"tag":25,"props":187475,"children":187476},{},[],{"type":17,"tag":29,"props":187478,"children":187479},{},[187480],{"type":17,"tag":33,"props":187481,"children":187482},{},[187483],{"type":23,"value":182031},{"type":17,"tag":29,"props":187485,"children":187486},{},[187487],{"type":23,"value":187488},"Accounting systems sit at the core of every business. Invoices move from draft to paid. Bills accrue, settle, or get voided. Transactions post to the ledger. Reports shift as new activity lands. When accounting data is fragmented across platforms—or accessed through delayed sync jobs—financial visibility degrades, reconciliation breaks, and downstream analytics drift.",{"type":17,"tag":29,"props":187490,"children":187491},{},[187492,187496],{"type":17,"tag":133,"props":187493,"children":187494},{"href":82425},[187495],{"type":23,"value":128616},{"type":23,"value":187497}," integration exists to solve this problem. In this guide, we'll explain what an Accounting API actually does, which financial objects matter in practice, how accounting lifecycles behave, how real-time updates are delivered, and how Unified's Accounting API fits alongside Payments, Commerce, CRM, and HR within the Finance & Commerce group.",{"type":17,"tag":68,"props":187499,"children":187501},{"id":187500},"introduction-to-accounting-api-integrations",[187502],{"type":23,"value":187503},"Introduction to Accounting API Integrations",{"type":17,"tag":29,"props":187505,"children":187506},{},[187507],{"type":23,"value":187508},"Accounting platforms are systems of record for financial data. They track money owed, money paid, balances, taxes, and ledger activity. Popular platforms vary widely in structure, terminology, and behavior.",{"type":17,"tag":29,"props":187510,"children":187511},{},[187512],{"type":23,"value":187513},"Common challenges when integrating accounting systems include:",{"type":17,"tag":80,"props":187515,"children":187516},{},[187517,187522,187527,187532,187541],{"type":17,"tag":84,"props":187518,"children":187519},{},[187520],{"type":23,"value":187521},"Inconsistent invoice, bill, and transaction models",{"type":17,"tag":84,"props":187523,"children":187524},{},[187525],{"type":23,"value":187526},"Provider-specific lifecycle rules (posting, authorization, voiding)",{"type":17,"tag":84,"props":187528,"children":187529},{},[187530],{"type":23,"value":187531},"Fragmented charts of accounts and tax handling",{"type":17,"tag":84,"props":187533,"children":187534},{},[187535,187537],{"type":23,"value":187536},"Uneven support for real-time updates and ",{"type":17,"tag":133,"props":187538,"children":187539},{"href":4999},[187540],{"type":23,"value":5002},{"type":17,"tag":84,"props":187542,"children":187543},{},[187544],{"type":23,"value":187545},"Strict constraints around mutability once records are finalized",{"type":17,"tag":29,"props":187547,"children":187548},{},[187549],{"type":23,"value":187550},"An Accounting API provides a consistent interface to read and write financial data across providers—without building and maintaining one-off integrations per platform.",{"type":17,"tag":68,"props":187552,"children":187553},{"id":82451},[187554],{"type":23,"value":187555},"What Is an Accounting API?",{"type":17,"tag":29,"props":187557,"children":187558},{},[187559,187560,187564],{"type":23,"value":40437},{"type":17,"tag":48,"props":187561,"children":187562},{},[187563],{"type":23,"value":128616},{"type":23,"value":187565}," allows applications to programmatically access and manage financial records stored in accounting systems.",{"type":17,"tag":29,"props":187567,"children":187568},{},[187569],{"type":23,"value":167214},{"type":17,"tag":80,"props":187571,"children":187572},{},[187573,187578,187583,187588],{"type":17,"tag":84,"props":187574,"children":187575},{},[187576],{"type":23,"value":187577},"Creating and updating invoices, bills, credit memos, expenses, and journal entries",{"type":17,"tag":84,"props":187579,"children":187580},{},[187581],{"type":23,"value":187582},"Reading transactions and ledger data",{"type":17,"tag":84,"props":187584,"children":187585},{},[187586],{"type":23,"value":187587},"Managing customers, vendors, and accounting contacts",{"type":17,"tag":84,"props":187589,"children":187590},{},[187591],{"type":23,"value":187592},"Retrieving financial reports such as profit & loss, balance sheets, trial balances, and cash-flow statements",{"type":17,"tag":29,"props":187594,"children":187595},{},[187596,187598,187603],{"type":23,"value":187597},"Accounting APIs are ",{"type":17,"tag":48,"props":187599,"children":187600},{},[187601],{"type":23,"value":187602},"ledger-centric",{"type":23,"value":187604},". They reflect what has been recorded in the accounting system—not what is planned, marketed, or paid in a gateway.",{"type":17,"tag":29,"props":187606,"children":187607},{},[187608],{"type":23,"value":187609},"They are not payment processors, CRMs, or analytics warehouses.",{"type":17,"tag":68,"props":187611,"children":187613},{"id":187612},"accounting-api-vs-payments-commerce-crm-and-hr",[187614],{"type":23,"value":187615},"Accounting API vs Payments, Commerce, CRM, and HR",{"type":17,"tag":29,"props":187617,"children":187618},{},[187619],{"type":23,"value":187620},"Unified treats Accounting as one category within a broader Finance & Commerce surface, with clear boundaries.",{"type":17,"tag":80,"props":187622,"children":187623},{},[187624,187633,187643,187652,187661],{"type":17,"tag":84,"props":187625,"children":187626},{},[187627,187631],{"type":17,"tag":48,"props":187628,"children":187629},{},[187630],{"type":23,"value":184499},{"type":23,"value":187632}," manage financial records: invoices, bills, transactions, journals, reports.",{"type":17,"tag":84,"props":187634,"children":187635},{},[187636,187641],{"type":17,"tag":48,"props":187637,"children":187638},{},[187639],{"type":23,"value":187640},"Payments APIs",{"type":23,"value":187642}," manage payment gateways: charges, payouts, refunds, subscriptions.",{"type":17,"tag":84,"props":187644,"children":187645},{},[187646,187650],{"type":17,"tag":48,"props":187647,"children":187648},{},[187649],{"type":23,"value":178707},{"type":23,"value":187651}," manage products, catalogs, orders, and inventory.",{"type":17,"tag":84,"props":187653,"children":187654},{},[187655,187659],{"type":17,"tag":48,"props":187656,"children":187657},{},[187658],{"type":23,"value":173018},{"type":23,"value":187660}," manage customers, deals, and sales pipelines.",{"type":17,"tag":84,"props":187662,"children":187663},{},[187664,187669],{"type":17,"tag":48,"props":187665,"children":187666},{},[187667],{"type":23,"value":187668},"HR APIs",{"type":23,"value":187670}," manage employees, payroll, and reimbursements.",{"type":17,"tag":29,"props":187672,"children":187673},{},[187674],{"type":23,"value":187675},"Accounting may ingest data from these systems, but it remains the financial system of record. No automatic identity linkage exists between Accounting and other categories.",{"type":17,"tag":68,"props":187677,"children":187679},{"id":187678},"real-time-accounting-data-without-sync-jobs",[187680],{"type":23,"value":187681},"Real-Time Accounting Data (Without Sync Jobs)",{"type":17,"tag":239,"props":187683,"children":187685},{"id":187684},"live-access-to-source-systems",[187686],{"type":23,"value":187687},"Live Access to Source Systems",{"type":17,"tag":29,"props":187689,"children":187690},{},[187691],{"type":23,"value":187692},"Unified's Accounting API routes every request directly to the connected accounting platform. There is no caching layer and no background synchronization.",{"type":17,"tag":80,"props":187694,"children":187695},{},[187696,187701,187706],{"type":17,"tag":84,"props":187697,"children":187698},{},[187699],{"type":23,"value":187700},"Reads always reflect the current state of the source system.",{"type":17,"tag":84,"props":187702,"children":187703},{},[187704],{"type":23,"value":187705},"Writes mutate the upstream ledger immediately (subject to provider rules).",{"type":17,"tag":84,"props":187707,"children":187708},{},[187709],{"type":23,"value":187710},"Unified does not store or replicate accounting data.",{"type":17,"tag":29,"props":187712,"children":187713},{},[187714],{"type":23,"value":187715},"This architecture ensures accuracy while keeping the accounting platform authoritative.",{"type":17,"tag":68,"props":187717,"children":187719},{"id":187718},"core-accounting-data-models-and-how-they-behave",[187720],{"type":23,"value":187721},"Core Accounting Data Models (and How They Behave)",{"type":17,"tag":29,"props":187723,"children":187724},{},[187725,187727,187732],{"type":23,"value":187726},"Unified normalizes accounting objects ",{"type":17,"tag":48,"props":187728,"children":187729},{},[187730],{"type":23,"value":187731},"within the Accounting category",{"type":23,"value":187733},". Provider behavior still varies and must be handled defensively.",{"type":17,"tag":239,"props":187735,"children":187737},{"id":187736},"accounting-contacts",[187738],{"type":23,"value":187739},"Accounting Contacts",{"type":17,"tag":29,"props":187741,"children":187742},{},[187743,187745,187750],{"type":23,"value":187744},"Accounting contacts represent customers, vendors, or suppliers ",{"type":17,"tag":48,"props":187746,"children":187747},{},[187748],{"type":23,"value":187749},"inside the accounting system",{"type":23,"value":54},{"type":17,"tag":80,"props":187752,"children":187753},{},[187754,187759,187771],{"type":17,"tag":84,"props":187755,"children":187756},{},[187757],{"type":23,"value":187758},"Separate identity from CRM contacts",{"type":17,"tag":84,"props":187760,"children":187761},{},[187762,187764,187769],{"type":23,"value":187763},"Referenced by ",{"type":17,"tag":6121,"props":187765,"children":187767},{"className":187766},[],[187768],{"type":23,"value":26302},{"type":23,"value":187770}," on invoices, bills, expenses, and orders",{"type":17,"tag":84,"props":187772,"children":187773},{},[187774],{"type":23,"value":187775},"May include payment method descriptors (ACH, card, wire), but not payment objects",{"type":17,"tag":29,"props":187777,"children":187778},{},[187779],{"type":23,"value":187780},"Accounting contacts are not unified across categories.",{"type":17,"tag":239,"props":187782,"children":187784},{"id":187783},"invoices-accounts-receivable",[187785],{"type":23,"value":187786},"Invoices (Accounts Receivable)",{"type":17,"tag":29,"props":187788,"children":187789},{},[187790],{"type":23,"value":187791},"Invoices represent money owed by customers.",{"type":17,"tag":80,"props":187793,"children":187794},{},[187795,187800,187837,187842],{"type":17,"tag":84,"props":187796,"children":187797},{},[187798],{"type":23,"value":187799},"Support create, list, retrieve, update, and remove operations",{"type":17,"tag":84,"props":187801,"children":187802},{},[187803,187805,187810,187811,187816,187817,187823,187824,187830,187831],{"type":23,"value":187804},"Include lifecycle fields such as ",{"type":17,"tag":6121,"props":187806,"children":187808},{"className":187807},[],[187809],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":187812,"children":187814},{"className":187813},[],[187815],{"type":23,"value":124766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":187818,"children":187820},{"className":187819},[],[187821],{"type":23,"value":187822},"paid_at",{"type":23,"value":11826},{"type":17,"tag":6121,"props":187825,"children":187827},{"className":187826},[],[187828],{"type":23,"value":187829},"cancelled_at",{"type":23,"value":12561},{"type":17,"tag":6121,"props":187832,"children":187834},{"className":187833},[],[187835],{"type":23,"value":187836},"posted_at",{"type":17,"tag":84,"props":187838,"children":187839},{},[187840],{"type":23,"value":187841},"Track amounts, taxes, discounts, balances, and line items",{"type":17,"tag":84,"props":187843,"children":187844},{},[187845,187847,187852],{"type":23,"value":187846},"Include a normalized ",{"type":17,"tag":6121,"props":187848,"children":187850},{"className":187849},[],[187851],{"type":23,"value":19949},{"type":23,"value":187853}," field",{"type":17,"tag":29,"props":187855,"children":187856},{},[187857],{"type":23,"value":187858},"Common status values include:",{"type":17,"tag":80,"props":187860,"children":187861},{},[187862,187871,187880,187889,187898],{"type":17,"tag":84,"props":187863,"children":187864},{},[187865],{"type":17,"tag":6121,"props":187866,"children":187868},{"className":187867},[],[187869],{"type":23,"value":187870},"DRAFT",{"type":17,"tag":84,"props":187872,"children":187873},{},[187874],{"type":17,"tag":6121,"props":187875,"children":187877},{"className":187876},[],[187878],{"type":23,"value":187879},"AUTHORIZED",{"type":17,"tag":84,"props":187881,"children":187882},{},[187883],{"type":17,"tag":6121,"props":187884,"children":187886},{"className":187885},[],[187887],{"type":23,"value":187888},"PARTIALLY_PAID",{"type":17,"tag":84,"props":187890,"children":187891},{},[187892],{"type":17,"tag":6121,"props":187893,"children":187895},{"className":187894},[],[187896],{"type":23,"value":187897},"PAID",{"type":17,"tag":84,"props":187899,"children":187900},{},[187901],{"type":17,"tag":6121,"props":187902,"children":187904},{"className":187903},[],[187905],{"type":23,"value":187906},"VOIDED",{"type":17,"tag":29,"props":187908,"children":187909},{},[187910],{"type":23,"value":187911},"Once an invoice is posted or paid, most providers restrict edits. Removal operations may result in voiding rather than deletion.",{"type":17,"tag":239,"props":187913,"children":187915},{"id":187914},"bills-accounts-payable",[187916],{"type":23,"value":187917},"Bills (Accounts Payable)",{"type":17,"tag":29,"props":187919,"children":187920},{},[187921],{"type":23,"value":187922},"Bills represent obligations owed to vendors.",{"type":17,"tag":80,"props":187924,"children":187925},{},[187926,187931,187936,187946],{"type":17,"tag":84,"props":187927,"children":187928},{},[187929],{"type":23,"value":187930},"Full CRUD support",{"type":17,"tag":84,"props":187932,"children":187933},{},[187934],{"type":23,"value":187935},"Similar lifecycle semantics to invoices",{"type":17,"tag":84,"props":187937,"children":187938},{},[187939,187941],{"type":23,"value":187940},"Referenced by vendor ",{"type":17,"tag":6121,"props":187942,"children":187944},{"className":187943},[],[187945],{"type":23,"value":26302},{"type":17,"tag":84,"props":187947,"children":187948},{},[187949],{"type":23,"value":187950},"Settled via ledger transactions rather than payment objects",{"type":17,"tag":29,"props":187952,"children":187953},{},[187954],{"type":23,"value":187955},"There is no guaranteed foreign key linking a bill to its payment transaction. Reconciliation relies on balances and posted amounts.",{"type":17,"tag":239,"props":187957,"children":187959},{"id":187958},"credit-memos",[187960],{"type":23,"value":83828},{"type":17,"tag":29,"props":187962,"children":187963},{},[187964],{"type":23,"value":187965},"Credit memos represent customer credits or refunds.",{"type":17,"tag":80,"props":187967,"children":187968},{},[187969,187973,187978,187983],{"type":17,"tag":84,"props":187970,"children":187971},{},[187972],{"type":23,"value":187930},{"type":17,"tag":84,"props":187974,"children":187975},{},[187976],{"type":23,"value":187977},"Used to offset invoices rather than directly issuing refunds",{"type":17,"tag":84,"props":187979,"children":187980},{},[187981],{"type":23,"value":187982},"Status and lifecycle mirror invoices and bills",{"type":17,"tag":84,"props":187984,"children":187985},{},[187986],{"type":23,"value":187987},"Provider behavior varies around partial refunds",{"type":17,"tag":239,"props":187989,"children":187990},{"id":82484},[187991],{"type":23,"value":83880},{"type":17,"tag":29,"props":187993,"children":187994},{},[187995],{"type":23,"value":187996},"Expenses record employee or business spending.",{"type":17,"tag":80,"props":187998,"children":187999},{},[188000,188004,188009,188033],{"type":17,"tag":84,"props":188001,"children":188002},{},[188003],{"type":23,"value":187930},{"type":17,"tag":84,"props":188005,"children":188006},{},[188007],{"type":23,"value":188008},"No unified status field",{"type":17,"tag":84,"props":188010,"children":188011},{},[188012,188014,188019,188020,188026,188027],{"type":23,"value":188013},"Lifecycle tracked via timestamps such as ",{"type":17,"tag":6121,"props":188015,"children":188017},{"className":188016},[],[188018],{"type":23,"value":187836},{"type":23,"value":11826},{"type":17,"tag":6121,"props":188021,"children":188023},{"className":188022},[],[188024],{"type":23,"value":188025},"approved_at",{"type":23,"value":12561},{"type":17,"tag":6121,"props":188028,"children":188030},{"className":188029},[],[188031],{"type":23,"value":188032},"reimbursed_at",{"type":17,"tag":84,"props":188034,"children":188035},{},[188036,188038,188043,188044,188050],{"type":23,"value":188037},"Optional ",{"type":17,"tag":6121,"props":188039,"children":188041},{"className":188040},[],[188042],{"type":23,"value":62582},{"type":23,"value":34435},{"type":17,"tag":6121,"props":188045,"children":188047},{"className":188046},[],[188048],{"type":23,"value":188049},"approver_user_id",{"type":23,"value":188051}," reference HR employees",{"type":17,"tag":29,"props":188053,"children":188054},{},[188055],{"type":23,"value":188056},"Expenses are the primary point of intersection between Accounting and HR.",{"type":17,"tag":239,"props":188058,"children":188060},{"id":188059},"transactions-and-journals",[188061],{"type":23,"value":188062},"Transactions and Journals",{"type":17,"tag":29,"props":188064,"children":188065},{},[188066],{"type":23,"value":188067},"Transactions and journals represent general-ledger activity.",{"type":17,"tag":80,"props":188069,"children":188070},{},[188071,188075,188080,188085],{"type":17,"tag":84,"props":188072,"children":188073},{},[188074],{"type":23,"value":187930},{"type":17,"tag":84,"props":188076,"children":188077},{},[188078],{"type":23,"value":188079},"Include account references, amounts, currencies, and transaction types",{"type":17,"tag":84,"props":188081,"children":188082},{},[188083],{"type":23,"value":188084},"No status field; lifecycle is implicit in posting",{"type":17,"tag":84,"props":188086,"children":188087},{},[188088],{"type":23,"value":188089},"Deletion may be restricted by provider rules",{"type":17,"tag":29,"props":188091,"children":188092},{},[188093,188095,188100],{"type":23,"value":188094},"Transaction ",{"type":17,"tag":6121,"props":188096,"children":188098},{"className":188097},[],[188099],{"type":23,"value":27310},{"type":23,"value":188101}," values are provider-specific and should be treated as an open set.",{"type":17,"tag":239,"props":188103,"children":188105},{"id":188104},"orders-sales-purchase-general",[188106],{"type":23,"value":188107},"Orders (Sales, Purchase, General)",{"type":17,"tag":29,"props":188109,"children":188110},{},[188111],{"type":23,"value":188112},"Accounting orders represent commercial intent recorded in the accounting system.",{"type":17,"tag":80,"props":188114,"children":188115},{},[188116,188121,188126],{"type":17,"tag":84,"props":188117,"children":188118},{},[188119],{"type":23,"value":188120},"Sales orders",{"type":17,"tag":84,"props":188122,"children":188123},{},[188124],{"type":23,"value":188125},"Purchase orders",{"type":17,"tag":84,"props":188127,"children":188128},{},[188129],{"type":23,"value":188130},"General orders",{"type":17,"tag":29,"props":188132,"children":188133},{},[188134,188136,188140,188142,188148],{"type":23,"value":188135},"These objects include contacts, addresses, totals, and statuses—but do ",{"type":17,"tag":48,"props":188137,"children":188138},{},[188139],{"type":23,"value":159475},{"type":23,"value":188141}," link to Commerce or Payments identities. A ",{"type":17,"tag":6121,"props":188143,"children":188145},{"className":188144},[],[188146],{"type":23,"value":188147},"sales_channel",{"type":23,"value":188149}," field may exist as a string, not a foreign key.",{"type":17,"tag":239,"props":188151,"children":188153},{"id":188152},"financial-reports",[188154],{"type":23,"value":188155},"Financial Reports",{"type":17,"tag":29,"props":188157,"children":188158},{},[188159],{"type":23,"value":188160},"Reports provide aggregated financial views.",{"type":17,"tag":80,"props":188162,"children":188163},{},[188164,188169,188174,188179],{"type":17,"tag":84,"props":188165,"children":188166},{},[188167],{"type":23,"value":188168},"Balance sheets",{"type":17,"tag":84,"props":188170,"children":188171},{},[188172],{"type":23,"value":188173},"Profit & loss statements",{"type":17,"tag":84,"props":188175,"children":188176},{},[188177],{"type":23,"value":188178},"Trial balances",{"type":17,"tag":84,"props":188180,"children":188181},{},[188182],{"type":23,"value":188183},"Cash-flow statements",{"type":17,"tag":29,"props":188185,"children":188186},{},[188187,188189,188193],{"type":23,"value":188188},"Reports are ",{"type":17,"tag":48,"props":188190,"children":188191},{},[188192],{"type":23,"value":19834},{"type":23,"value":54},{"type":17,"tag":29,"props":188195,"children":188196},{},[188197],{"type":23,"value":188198},"They do not emit webhook events and must be retrieved via polling. Refresh cadence depends on the provider's internal recalculation behavior.",{"type":17,"tag":68,"props":188200,"children":188202},{"id":188201},"identity-and-ownership-in-accounting",[188203],{"type":23,"value":188204},"Identity and Ownership in Accounting",{"type":17,"tag":29,"props":188206,"children":188207},{},[188208],{"type":23,"value":188209},"Accounting uses its own identity model.",{"type":17,"tag":80,"props":188211,"children":188212},{},[188213,188223,188228,188233],{"type":17,"tag":84,"props":188214,"children":188215},{},[188216,188221],{"type":17,"tag":6121,"props":188217,"children":188219},{"className":188218},[],[188220],{"type":23,"value":26302},{"type":23,"value":188222}," always refers to an AccountingContact",{"type":17,"tag":84,"props":188224,"children":188225},{},[188226],{"type":23,"value":188227},"No CRM contact IDs are present",{"type":17,"tag":84,"props":188229,"children":188230},{},[188231],{"type":23,"value":188232},"No payment IDs or e-commerce order references exist",{"type":17,"tag":84,"props":188234,"children":188235},{},[188236],{"type":23,"value":188237},"HR users appear only on expense records",{"type":17,"tag":29,"props":188239,"children":188240},{},[188241],{"type":23,"value":188242},"Accounting identity is intentionally isolated.",{"type":17,"tag":68,"props":188244,"children":188246},{"id":188245},"updates-webhooks-and-reporting",[188247],{"type":23,"value":188248},"Updates, Webhooks, and Reporting",{"type":17,"tag":239,"props":188250,"children":188252},{"id":188251},"object-updates",[188253],{"type":23,"value":188254},"Object Updates",{"type":17,"tag":29,"props":188256,"children":188257},{},[188258,188259,188263],{"type":23,"value":110546},{"type":17,"tag":133,"props":188260,"children":188261},{"href":9007},[188262],{"type":23,"value":46572},{"type":23,"value":188264}," for many accounting objects.",{"type":17,"tag":80,"props":188266,"children":188267},{},[188268,188273,188278],{"type":17,"tag":84,"props":188269,"children":188270},{},[188271],{"type":23,"value":188272},"Native webhooks are forwarded when providers support them",{"type":17,"tag":84,"props":188274,"children":188275},{},[188276],{"type":23,"value":188277},"Virtual webhooks poll providers and emit updates on change",{"type":17,"tag":84,"props":188279,"children":188280},{},[188281],{"type":23,"value":188282},"Events include created and updated notifications",{"type":17,"tag":29,"props":188284,"children":188285},{},[188286],{"type":23,"value":188287},"Objects commonly supporting webhooks include invoices, bills, contacts, expenses, journals, and transactions.",{"type":17,"tag":239,"props":188289,"children":188291},{"id":188290},"reporting-updates",[188292],{"type":23,"value":188293},"Reporting Updates",{"type":17,"tag":29,"props":188295,"children":188296},{},[188297],{"type":23,"value":188298},"Aggregated reports do not emit events.",{"type":17,"tag":29,"props":188300,"children":188301},{},[188302],{"type":23,"value":188303},"To keep reports current:",{"type":17,"tag":80,"props":188305,"children":188306},{},[188307,188312,188317],{"type":17,"tag":84,"props":188308,"children":188309},{},[188310],{"type":23,"value":188311},"Poll report endpoints periodically",{"type":17,"tag":84,"props":188313,"children":188314},{},[188315],{"type":23,"value":188316},"Use date-range filters to limit scope",{"type":17,"tag":84,"props":188318,"children":188319},{},[188320],{"type":23,"value":188321},"Expect provider-specific refresh delays",{"type":17,"tag":68,"props":188323,"children":188325},{"id":188324},"security-privacy-and-financial-data-handling",[188326],{"type":23,"value":188327},"Security, Privacy, and Financial Data Handling",{"type":17,"tag":239,"props":188329,"children":188330},{"id":90302},[188331],{"type":23,"value":179326},{"type":17,"tag":80,"props":188333,"children":188334},{},[188335,188340,188345],{"type":17,"tag":84,"props":188336,"children":188337},{},[188338],{"type":23,"value":188339},"No accounting payloads are stored at rest",{"type":17,"tag":84,"props":188341,"children":188342},{},[188343],{"type":23,"value":188344},"No financial data is written to logs",{"type":17,"tag":84,"props":188346,"children":188347},{},[188348],{"type":23,"value":180516},{"type":17,"tag":29,"props":188350,"children":188351},{},[188352],{"type":23,"value":188353},"Unified is not a database or ledger replica.",{"type":17,"tag":239,"props":188355,"children":188357},{"id":188356},"sensitive-financial-data",[188358],{"type":23,"value":188359},"Sensitive Financial Data",{"type":17,"tag":29,"props":188361,"children":188362},{},[188363],{"type":23,"value":188364},"Accounting objects may expose:",{"type":17,"tag":80,"props":188366,"children":188367},{},[188368,188373,188378,188383],{"type":17,"tag":84,"props":188369,"children":188370},{},[188371],{"type":23,"value":188372},"Invoice and bill amounts",{"type":17,"tag":84,"props":188374,"children":188375},{},[188376],{"type":23,"value":188377},"Tax rates and balances",{"type":17,"tag":84,"props":188379,"children":188380},{},[188381],{"type":23,"value":188382},"Expense details",{"type":17,"tag":84,"props":188384,"children":188385},{},[188386],{"type":23,"value":188387},"Attachments such as receipts or invoices",{"type":17,"tag":29,"props":188389,"children":188390},{},[188391],{"type":23,"value":188392},"Developers are responsible for access control, storage, and compliance in downstream systems.",{"type":17,"tag":29,"props":188394,"children":188395},{},[188396],{"type":23,"value":188397},"Attachments are retrieved via a dedicated storage endpoint and remain tied to the source platform.",{"type":17,"tag":68,"props":188399,"children":188401},{"id":188400},"common-accounting-api-use-cases",[188402],{"type":23,"value":188403},"Common Accounting API Use Cases",{"type":17,"tag":239,"props":188405,"children":188407},{"id":188406},"financial-dashboards",[188408],{"type":23,"value":188409},"Financial Dashboards",{"type":17,"tag":29,"props":188411,"children":188412},{},[188413],{"type":23,"value":188414},"Build real-time views of invoices, expenses, and balances across multiple accounting platforms.",{"type":17,"tag":239,"props":188416,"children":188418},{"id":188417},"billing-and-ar-automation",[188419],{"type":23,"value":188420},"Billing and AR Automation",{"type":17,"tag":29,"props":188422,"children":188423},{},[188424],{"type":23,"value":188425},"Create, send, track, and reconcile invoices programmatically.",{"type":17,"tag":239,"props":188427,"children":188429},{"id":188428},"ap-reconciliation",[188430],{"type":23,"value":188431},"AP Reconciliation",{"type":17,"tag":29,"props":188433,"children":188434},{},[188435],{"type":23,"value":188436},"Track vendor bills and reconcile them against ledger transactions.",{"type":17,"tag":239,"props":188438,"children":188440},{"id":188439},"expense-management",[188441],{"type":23,"value":188442},"Expense Management",{"type":17,"tag":29,"props":188444,"children":188445},{},[188446],{"type":23,"value":188447},"Ingest expenses, approvals, and reimbursements tied to HR employees.",{"type":17,"tag":239,"props":188449,"children":188451},{"id":188450},"financial-analytics-and-ai",[188452],{"type":23,"value":188453},"Financial Analytics and AI",{"type":17,"tag":29,"props":188455,"children":188456},{},[188457],{"type":23,"value":188458},"Analyze transaction data, classify expenses, and generate financial insights using live accounting data.",{"type":17,"tag":68,"props":188460,"children":188462},{"id":188461},"challenges-and-constraints-to-plan-for",[188463],{"type":23,"value":188464},"Challenges and Constraints to Plan For",{"type":17,"tag":80,"props":188466,"children":188467},{},[188468,188473,188478,188483,188488],{"type":17,"tag":84,"props":188469,"children":188470},{},[188471],{"type":23,"value":188472},"Provider-specific restrictions on edits and deletions",{"type":17,"tag":84,"props":188474,"children":188475},{},[188476],{"type":23,"value":188477},"Posting behavior differs across platforms",{"type":17,"tag":84,"props":188479,"children":188480},{},[188481],{"type":23,"value":188482},"Reconciliation is ledger-based, not payment-based",{"type":17,"tag":84,"props":188484,"children":188485},{},[188486],{"type":23,"value":188487},"Reports must be polled",{"type":17,"tag":84,"props":188489,"children":188490},{},[188491],{"type":23,"value":188492},"Status values may extend beyond normalized enums",{"type":17,"tag":29,"props":188494,"children":188495},{},[188496],{"type":23,"value":188497},"These constraints reflect real accounting behavior and should inform system design.",{"type":17,"tag":68,"props":188499,"children":188501},{"id":188500},"build-vs-buy-accounting-integrations",[188502],{"type":23,"value":188503},"Build vs Buy Accounting Integrations",{"type":17,"tag":239,"props":188505,"children":188506},{"id":165021},[188507],{"type":23,"value":165024},{"type":17,"tag":80,"props":188509,"children":188510},{},[188511,188516,188521,188526],{"type":17,"tag":84,"props":188512,"children":188513},{},[188514],{"type":23,"value":188515},"Multiple accounting APIs to maintain",{"type":17,"tag":84,"props":188517,"children":188518},{},[188519],{"type":23,"value":188520},"Provider-specific ledger rules",{"type":17,"tag":84,"props":188522,"children":188523},{},[188524],{"type":23,"value":188525},"Custom webhook and polling logic",{"type":17,"tag":84,"props":188527,"children":188528},{},[188529],{"type":23,"value":188530},"Ongoing maintenance and compliance risk",{"type":17,"tag":239,"props":188532,"children":188534},{"id":188533},"using-a-unified-accounting-api",[188535],{"type":23,"value":188536},"Using a Unified Accounting API",{"type":17,"tag":80,"props":188538,"children":188539},{},[188540,188545,188550,188555,188560],{"type":17,"tag":84,"props":188541,"children":188542},{},[188543],{"type":23,"value":188544},"One normalized financial data surface",{"type":17,"tag":84,"props":188546,"children":188547},{},[188548],{"type":23,"value":188549},"Real-time access to source systems",{"type":17,"tag":84,"props":188551,"children":188552},{},[188553],{"type":23,"value":188554},"Built-in webhook handling",{"type":17,"tag":84,"props":188556,"children":188557},{},[188558],{"type":23,"value":188559},"No data storage or sync infrastructure",{"type":17,"tag":84,"props":188561,"children":188562},{},[188563],{"type":23,"value":188564},"Clear separation from Payments and Commerce",{"type":17,"tag":68,"props":188566,"children":188568},{"id":188567},"best-practices-for-accounting-api-integrations",[188569],{"type":23,"value":188570},"Best Practices for Accounting API Integrations",{"type":17,"tag":80,"props":188572,"children":188573},{},[188574,188579,188584,188589,188594,188599],{"type":17,"tag":84,"props":188575,"children":188576},{},[188577],{"type":23,"value":188578},"Treat accounting systems as the system of record",{"type":17,"tag":84,"props":188580,"children":188581},{},[188582],{"type":23,"value":188583},"Handle provider variability explicitly",{"type":17,"tag":84,"props":188585,"children":188586},{},[188587],{"type":23,"value":188588},"Use webhooks for lifecycle tracking",{"type":17,"tag":84,"props":188590,"children":188591},{},[188592],{"type":23,"value":188593},"Poll reports intentionally",{"type":17,"tag":84,"props":188595,"children":188596},{},[188597],{"type":23,"value":188598},"Keep accounting, payments, and commerce concerns separate",{"type":17,"tag":84,"props":188600,"children":188601},{},[188602],{"type":23,"value":188603},"Avoid assuming hard deletes exist",{"type":17,"tag":68,"props":188605,"children":188607},{"id":188606},"build-accounting-integrations-with-financial-correctness",[188608],{"type":23,"value":188609},"Build accounting integrations with financial correctness",{"type":17,"tag":29,"props":188611,"children":188612},{},[188613],{"type":23,"value":188614},"If your product relies on accurate, real-time financial data across multiple accounting platforms, maintaining individual integrations quickly becomes brittle and expensive.",{"type":17,"tag":29,"props":188616,"children":188617},{},[188618,188619,188623],{"type":23,"value":25244},{"type":17,"tag":48,"props":188620,"children":188621},{},[188622],{"type":23,"value":128616},{"type":23,"value":188624}," provides a consistent way to access invoices, bills, transactions, expenses, and reports—without storing financial data or collapsing category boundaries.",{"type":17,"tag":29,"props":188626,"children":188627},{},[188628,188632,188633],{"type":17,"tag":48,"props":188629,"children":188630},{},[188631],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":188634,"children":188636},{"href":188635},"/3026207b8384808b85a6ea0515cc4eb8",[188637],{"type":17,"tag":48,"props":188638,"children":188639},{},[188640],{"type":23,"value":1616},{"type":17,"tag":29,"props":188642,"children":188643},{},[188644],{"type":23,"value":188645},"Test accounting integrations against live source systems.",{"type":17,"tag":29,"props":188647,"children":188648},{},[188649,188653,188654],{"type":17,"tag":48,"props":188650,"children":188651},{},[188652],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":188655,"children":188656},{"href":188635},[188657],{"type":17,"tag":48,"props":188658,"children":188659},{},[188660],{"type":23,"value":1627},{"type":17,"tag":29,"props":188662,"children":188663},{},[188664],{"type":23,"value":188665},"Walk through your accounting, payments, or finance workflows with the team that built the platform.",{"type":17,"tag":25,"props":188667,"children":188668},{},[],{"type":17,"tag":68,"props":188670,"children":188671},{"id":95759},[188672],{"type":23,"value":95762},{"type":17,"tag":29,"props":188674,"children":188675},{},[188676],{"type":17,"tag":48,"props":188677,"children":188678},{},[188679],{"type":23,"value":188680},"What is an Accounting API?",{"type":17,"tag":29,"props":188682,"children":188683},{},[188684],{"type":23,"value":188685},"An API that allows applications to access and manage financial records stored in accounting systems.",{"type":17,"tag":29,"props":188687,"children":188688},{},[188689],{"type":17,"tag":48,"props":188690,"children":188691},{},[188692],{"type":23,"value":165175},{"type":17,"tag":29,"props":188694,"children":188695},{},[188696],{"type":23,"value":188697},"Unified supports major accounting platforms including QuickBooks, Xero, FreshBooks, Wave, Zoho Books, and others.",{"type":17,"tag":29,"props":188699,"children":188700},{},[188701],{"type":17,"tag":48,"props":188702,"children":188703},{},[188704],{"type":23,"value":188705},"Is accounting data real time?",{"type":17,"tag":29,"props":188707,"children":188708},{},[188709],{"type":23,"value":188710},"Yes. Every request hits the source system directly. Webhook delivery depends on provider support.",{"type":17,"tag":29,"props":188712,"children":188713},{},[188714],{"type":17,"tag":48,"props":188715,"children":188716},{},[188717],{"type":23,"value":188718},"Can I create or update invoices?",{"type":17,"tag":29,"props":188720,"children":188721},{},[188722],{"type":23,"value":188723},"Yes, subject to provider rules and invoice state.",{"type":17,"tag":29,"props":188725,"children":188726},{},[188727],{"type":17,"tag":48,"props":188728,"children":188729},{},[188730],{"type":23,"value":188731},"Does the Accounting API store financial data?",{"type":17,"tag":29,"props":188733,"children":188734},{},[188735],{"type":23,"value":188736},"No. Unified operates on a zero-storage, pass-through model.",{"type":17,"tag":29,"props":188738,"children":188739},{},[188740],{"type":17,"tag":48,"props":188741,"children":188742},{},[188743],{"type":23,"value":188744},"How does Accounting differ from Payments?",{"type":17,"tag":29,"props":188746,"children":188747},{},[188748],{"type":23,"value":188749},"Accounting records ledger entries and balances. Payments handle gateway transactions and payouts.",{"title":7,"searchDepth":1629,"depth":1629,"links":188751},[188752,188753,188754,188755,188758,188768,188769,188773,188777,188784,188785,188789,188790,188791],{"id":187500,"depth":1629,"text":187503},{"id":82451,"depth":1629,"text":187555},{"id":187612,"depth":1629,"text":187615},{"id":187678,"depth":1629,"text":187681,"children":188756},[188757],{"id":187684,"depth":1635,"text":187687},{"id":187718,"depth":1629,"text":187721,"children":188759},[188760,188761,188762,188763,188764,188765,188766,188767],{"id":187736,"depth":1635,"text":187739},{"id":187783,"depth":1635,"text":187786},{"id":187914,"depth":1635,"text":187917},{"id":187958,"depth":1635,"text":83828},{"id":82484,"depth":1635,"text":83880},{"id":188059,"depth":1635,"text":188062},{"id":188104,"depth":1635,"text":188107},{"id":188152,"depth":1635,"text":188155},{"id":188201,"depth":1629,"text":188204},{"id":188245,"depth":1629,"text":188248,"children":188770},[188771,188772],{"id":188251,"depth":1635,"text":188254},{"id":188290,"depth":1635,"text":188293},{"id":188324,"depth":1629,"text":188327,"children":188774},[188775,188776],{"id":90302,"depth":1635,"text":179326},{"id":188356,"depth":1635,"text":188359},{"id":188400,"depth":1629,"text":188403,"children":188778},[188779,188780,188781,188782,188783],{"id":188406,"depth":1635,"text":188409},{"id":188417,"depth":1635,"text":188420},{"id":188428,"depth":1635,"text":188431},{"id":188439,"depth":1635,"text":188442},{"id":188450,"depth":1635,"text":188453},{"id":188461,"depth":1629,"text":188464},{"id":188500,"depth":1629,"text":188503,"children":188786},[188787,188788],{"id":165021,"depth":1635,"text":165024},{"id":188533,"depth":1635,"text":188536},{"id":188567,"depth":1629,"text":188570},{"id":188606,"depth":1629,"text":188609},{"id":95759,"depth":1629,"text":95762},"content:blog:accounting_api_integration_invoices_bills_transactions_and_financial_reporting_across_platforms.md","blog/accounting_api_integration_invoices_bills_transactions_and_financial_reporting_across_platforms.md","blog/accounting_api_integration_invoices_bills_transactions_and_financial_reporting_across_platforms",{"_path":188796,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":188797,"description":188798,"img":188799,"date":188800,"tag":12,"body":188801,"_type":1677,"_id":190019,"_source":1679,"_file":190020,"_stem":190021,"_extension":1682},"/blog/forms_api_integration_real_time_form_submissions_normalized_responses_and_downstream_workflows","Forms API Integration: Real-Time Form Submissions, Normalized Responses, and Downstream Workflows","Job applications, contact requests, surveys, registrations, feedback, internal questionnaires — forms are the primary way people volunteer structured data. But...","https://s3.us-east-2.amazonaws.com/unified-article-images/forms_api_integration_real_time_form_submissions_normalized_responses_and_downstream_workflows-icon.png","2026-02-09T00:31:00.000Z",{"type":14,"children":188802,"toc":189977},[188803,188808,188811,188818,188823,188828,188837,188843,188864,188891,188896,188919,188924,188929,188939,188943,188966,188978,188984,188989,189048,189053,189059,189063,189073,189079,189084,189115,189131,189137,189153,189157,189162,189198,189217,189223,189228,189256,189261,189267,189273,189278,189284,189303,189309,189314,189332,189337,189343,189348,189413,189418,189424,189430,189463,189469,189509,189514,189518,189523,189527,189550,189554,189560,189565,189581,189586,189609,189614,189620,189626,189631,189637,189642,189648,189653,189659,189664,189670,189675,189679,189684,189717,189722,189728,189732,189753,189759,189789,189795,189833,189839,189844,189854,189870,189875,189891,189896,189900,189908,189913,189920,189925,189933,189938,189946,189951,189959,189964,189972],{"type":17,"tag":18,"props":188804,"children":188806},{"id":188805},"forms-api-integration-real-time-form-submissions-normalized-responses-and-downstream-workflows",[188807],{"type":23,"value":188797},{"type":17,"tag":25,"props":188809,"children":188810},{},[],{"type":17,"tag":29,"props":188812,"children":188813},{},[188814],{"type":17,"tag":33,"props":188815,"children":188816},{},[188817],{"type":23,"value":182031},{"type":17,"tag":29,"props":188819,"children":188820},{},[188821],{"type":23,"value":188822},"Forms are where intent enters your system.",{"type":17,"tag":29,"props":188824,"children":188825},{},[188826],{"type":23,"value":188827},"Job applications, contact requests, surveys, registrations, feedback, internal questionnaires — forms are the primary way people volunteer structured data. But once responses start flowing, most teams hit the same problems: inconsistent schemas, delayed access to submissions, brittle exports, and unclear ownership of identity.",{"type":17,"tag":29,"props":188829,"children":188830},{},[188831,188835],{"type":17,"tag":133,"props":188832,"children":188833},{"href":39304},[188834],{"type":23,"value":114951},{"type":23,"value":188836}," integration exists to solve this. In this guide, we'll explain what a Forms API actually does, which objects matter in practice, how submission lifecycles work, how updates are delivered, and how Unified's Forms API fits alongside CRM, Marketing, Enrichment, ATS, and HR within the broader platform.",{"type":17,"tag":68,"props":188838,"children":188840},{"id":188839},"introduction-to-forms-api-integrations",[188841],{"type":23,"value":188842},"Introduction to Forms API Integrations",{"type":17,"tag":29,"props":188844,"children":188845},{},[188846,188848,188852,188853,188857,188858,188862],{"type":23,"value":188847},"Form builders such as ",{"type":17,"tag":48,"props":188849,"children":188850},{},[188851],{"type":23,"value":39982},{"type":23,"value":11826},{"type":17,"tag":48,"props":188854,"children":188855},{},[188856],{"type":23,"value":39973},{"type":23,"value":12561},{"type":17,"tag":48,"props":188859,"children":188860},{},[188861],{"type":23,"value":39623},{"type":23,"value":188863}," are used to collect structured data across many workflows:",{"type":17,"tag":80,"props":188865,"children":188866},{},[188867,188872,188877,188882,188886],{"type":17,"tag":84,"props":188868,"children":188869},{},[188870],{"type":23,"value":188871},"Lead capture and contact requests",{"type":17,"tag":84,"props":188873,"children":188874},{},[188875],{"type":23,"value":188876},"Surveys and research",{"type":17,"tag":84,"props":188878,"children":188879},{},[188880],{"type":23,"value":188881},"Job applications",{"type":17,"tag":84,"props":188883,"children":188884},{},[188885],{"type":23,"value":114575},{"type":17,"tag":84,"props":188887,"children":188888},{},[188889],{"type":23,"value":188890},"Internal questionnaires and approvals",{"type":17,"tag":29,"props":188892,"children":188893},{},[188894],{"type":23,"value":188895},"Each platform exposes its own API, schema, and authentication model. Products that need to support multiple form tools often encounter:",{"type":17,"tag":80,"props":188897,"children":188898},{},[188899,188904,188909,188914],{"type":17,"tag":84,"props":188900,"children":188901},{},[188902],{"type":23,"value":188903},"Inconsistent question and answer formats",{"type":17,"tag":84,"props":188905,"children":188906},{},[188907],{"type":23,"value":188908},"Provider-specific submission models",{"type":17,"tag":84,"props":188910,"children":188911},{},[188912],{"type":23,"value":188913},"Uneven support for real-time delivery",{"type":17,"tag":84,"props":188915,"children":188916},{},[188917],{"type":23,"value":188918},"Fragile exports and manual workflows",{"type":17,"tag":29,"props":188920,"children":188921},{},[188922],{"type":23,"value":188923},"A Forms API provides a normalized ingestion layer that allows applications to read forms and submissions consistently across platforms — without building and maintaining separate integrations.",{"type":17,"tag":68,"props":188925,"children":188926},{"id":39294},[188927],{"type":23,"value":188928},"What Is a Forms API?",{"type":17,"tag":29,"props":188930,"children":188931},{},[188932,188933,188937],{"type":23,"value":9619},{"type":17,"tag":48,"props":188934,"children":188935},{},[188936],{"type":23,"value":114951},{"type":23,"value":188938}," allows applications to programmatically access form definitions and completed submissions from form platforms.",{"type":17,"tag":29,"props":188940,"children":188941},{},[188942],{"type":23,"value":167214},{"type":17,"tag":80,"props":188944,"children":188945},{},[188946,188951,188956,188961],{"type":17,"tag":84,"props":188947,"children":188948},{},[188949],{"type":23,"value":188950},"Listing available forms and their fields",{"type":17,"tag":84,"props":188952,"children":188953},{},[188954],{"type":23,"value":188955},"Retrieving completed submissions",{"type":17,"tag":84,"props":188957,"children":188958},{},[188959],{"type":23,"value":188960},"Reading typed answers in a consistent schema",{"type":17,"tag":84,"props":188962,"children":188963},{},[188964],{"type":23,"value":188965},"Ingesting responses into downstream systems",{"type":17,"tag":29,"props":188967,"children":188968},{},[188969,188971,188976],{"type":23,"value":188970},"Forms APIs are ",{"type":17,"tag":48,"props":188972,"children":188973},{},[188974],{"type":23,"value":188975},"event ingestion APIs",{"type":23,"value":188977},". They are not systems of record and they do not execute workflows themselves. Their role is to expose structured input data reliably and in real time.",{"type":17,"tag":68,"props":188979,"children":188981},{"id":188980},"forms-api-vs-crm-marketing-enrichment-ats-and-hr",[188982],{"type":23,"value":188983},"Forms API vs CRM, Marketing, Enrichment, ATS, and HR",{"type":17,"tag":29,"props":188985,"children":188986},{},[188987],{"type":23,"value":188988},"Unified treats Forms as one category within a broader system, with clear boundaries.",{"type":17,"tag":80,"props":188990,"children":188991},{},[188992,189002,189010,189019,189029,189039],{"type":17,"tag":84,"props":188993,"children":188994},{},[188995,189000],{"type":17,"tag":48,"props":188996,"children":188997},{},[188998],{"type":23,"value":188999},"Forms APIs",{"type":23,"value":189001}," ingest raw submissions and answers.",{"type":17,"tag":84,"props":189003,"children":189004},{},[189005,189009],{"type":17,"tag":48,"props":189006,"children":189007},{},[189008],{"type":23,"value":173018},{"type":23,"value":178699},{"type":17,"tag":84,"props":189011,"children":189012},{},[189013,189017],{"type":17,"tag":48,"props":189014,"children":189015},{},[189016],{"type":23,"value":180070},{"type":23,"value":189018}," manage lists, subscribers, campaigns, and engagement.",{"type":17,"tag":84,"props":189020,"children":189021},{},[189022,189027],{"type":17,"tag":48,"props":189023,"children":189024},{},[189025],{"type":23,"value":189026},"Enrichment APIs",{"type":23,"value":189028}," append firmographic or demographic attributes.",{"type":17,"tag":84,"props":189030,"children":189031},{},[189032,189037],{"type":17,"tag":48,"props":189033,"children":189034},{},[189035],{"type":23,"value":189036},"ATS APIs",{"type":23,"value":189038}," manage candidates, jobs, and applications.",{"type":17,"tag":84,"props":189040,"children":189041},{},[189042,189046],{"type":17,"tag":48,"props":189043,"children":189044},{},[189045],{"type":23,"value":187668},{"type":23,"value":189047}," manage employees and organizational data.",{"type":17,"tag":29,"props":189049,"children":189050},{},[189051],{"type":23,"value":189052},"Forms do not own identity. They collect inputs. Any relationship between a form response and a CRM contact, marketing subscriber, candidate, or employee must be established explicitly by the application.",{"type":17,"tag":68,"props":189054,"children":189056},{"id":189055},"real-time-vs-batch-form-data",[189057],{"type":23,"value":189058},"Real-Time vs Batch Form Data",{"type":17,"tag":239,"props":189060,"children":189061},{"id":163879},[189062],{"type":23,"value":163882},{"type":17,"tag":29,"props":189064,"children":189065},{},[189066,189068,189072],{"type":23,"value":189067},"Unified's Forms API routes every request directly to the connected form platform. There is no cached replica or background synchronization layer. Reads reflect the current state of the source system, subject to provider ",{"type":17,"tag":133,"props":189069,"children":189070},{"href":135},[189071],{"type":23,"value":138},{"type":23,"value":171686},{"type":17,"tag":239,"props":189074,"children":189076},{"id":189075},"update-delivery-webhooks-and-polling",[189077],{"type":23,"value":189078},"Update Delivery: Webhooks and Polling",{"type":17,"tag":29,"props":189080,"children":189081},{},[189082],{"type":23,"value":189083},"Form platforms vary in how they deliver updates:",{"type":17,"tag":80,"props":189085,"children":189086},{},[189087,189101,189110],{"type":17,"tag":84,"props":189088,"children":189089},{},[189090,189092],{"type":23,"value":189091},"Some providers support ",{"type":17,"tag":48,"props":189093,"children":189094},{},[189095,189097],{"type":23,"value":189096},"native submission ",{"type":17,"tag":133,"props":189098,"children":189099},{"href":4999},[189100],{"type":23,"value":5002},{"type":17,"tag":84,"props":189102,"children":189103},{},[189104,189106],{"type":23,"value":189105},"Others rely on ",{"type":17,"tag":48,"props":189107,"children":189108},{},[189109],{"type":23,"value":31656},{"type":17,"tag":84,"props":189111,"children":189112},{},[189113],{"type":23,"value":189114},"Form metadata changes rarely emit events",{"type":17,"tag":29,"props":189116,"children":189117},{},[189118,189119,189123,189125,189129],{"type":23,"value":107847},{"type":17,"tag":48,"props":189120,"children":189121},{},[189122],{"type":23,"value":107852},{"type":23,"value":189124}," (when available) and ",{"type":17,"tag":48,"props":189126,"children":189127},{},[189128],{"type":23,"value":46572},{"type":23,"value":189130}," (generated by polling). When neither is available, applications must poll submission endpoints using timestamp filters.",{"type":17,"tag":68,"props":189132,"children":189134},{"id":189133},"core-forms-data-models-and-how-they-behave",[189135],{"type":23,"value":189136},"Core Forms Data Models (and How They Behave)",{"type":17,"tag":29,"props":189138,"children":189139},{},[189140,189142,189146,189147,189151],{"type":23,"value":189141},"Unified normalizes Forms data within the Forms category, exposing two objects: ",{"type":17,"tag":48,"props":189143,"children":189144},{},[189145],{"type":23,"value":40001},{"type":23,"value":34435},{"type":17,"tag":48,"props":189148,"children":189149},{},[189150],{"type":23,"value":40044},{"type":23,"value":189152},". Provider capabilities vary and should be handled defensively.",{"type":17,"tag":239,"props":189154,"children":189155},{"id":39321},[189156],{"type":23,"value":114439},{"type":17,"tag":29,"props":189158,"children":189159},{},[189160],{"type":23,"value":189161},"Forms represent the template and structure of a survey or questionnaire.",{"type":17,"tag":80,"props":189163,"children":189164},{},[189165,189170,189175,189180],{"type":17,"tag":84,"props":189166,"children":189167},{},[189168],{"type":23,"value":189169},"Include identifiers, names, descriptions, and configuration flags",{"type":17,"tag":84,"props":189171,"children":189172},{},[189173],{"type":23,"value":189174},"Contain an array of fields describing each question",{"type":17,"tag":84,"props":189176,"children":189177},{},[189178],{"type":23,"value":189179},"Include metadata such as published URLs and response counts",{"type":17,"tag":84,"props":189181,"children":189182},{},[189183,189185,189190,189191,189196],{"type":23,"value":189184},"Expose ",{"type":17,"tag":6121,"props":189186,"children":189188},{"className":189187},[],[189189],{"type":23,"value":33446},{"type":23,"value":34435},{"type":17,"tag":6121,"props":189192,"children":189194},{"className":189193},[],[189195],{"type":23,"value":25337},{"type":23,"value":189197}," timestamps",{"type":17,"tag":29,"props":189199,"children":189200},{},[189201,189203,189208,189210,189215],{"type":23,"value":189202},"Although Unified's API surface includes create and update endpoints for forms, ",{"type":17,"tag":48,"props":189204,"children":189205},{},[189206],{"type":23,"value":189207},"Google Forms, Typeform, and Tally are read-only in practice",{"type":23,"value":189209},". Their integration capability pages show no writable fields. Forms can typically be deactivated via ",{"type":17,"tag":6121,"props":189211,"children":189213},{"className":189212},[],[189214],{"type":23,"value":62868},{"type":23,"value":189216},", but deletion is not supported.",{"type":17,"tag":239,"props":189218,"children":189220},{"id":189219},"submissions",[189221],{"type":23,"value":189222},"Submissions",{"type":17,"tag":29,"props":189224,"children":189225},{},[189226],{"type":23,"value":189227},"Submissions represent completed responses.",{"type":17,"tag":80,"props":189229,"children":189230},{},[189231,189241,189246,189251],{"type":17,"tag":84,"props":189232,"children":189233},{},[189234,189236],{"type":23,"value":189235},"Include identifiers, timestamps, and a ",{"type":17,"tag":6121,"props":189237,"children":189239},{"className":189238},[],[189240],{"type":23,"value":115069},{"type":17,"tag":84,"props":189242,"children":189243},{},[189244],{"type":23,"value":189245},"May include respondent metadata such as email or name (provider-dependent)",{"type":17,"tag":84,"props":189247,"children":189248},{},[189249],{"type":23,"value":189250},"Contain an array of typed answers",{"type":17,"tag":84,"props":189252,"children":189253},{},[189254],{"type":23,"value":189255},"Are immutable once created",{"type":17,"tag":29,"props":189257,"children":189258},{},[189259],{"type":23,"value":189260},"There are no endpoints to create, update, or delete submissions through Unified. Creation happens in the underlying form platform. Unified exposes submissions for retrieval only.",{"type":17,"tag":68,"props":189262,"children":189264},{"id":189263},"submission-lifecycle-and-answer-semantics",[189265],{"type":23,"value":189266},"Submission Lifecycle and Answer Semantics",{"type":17,"tag":239,"props":189268,"children":189270},{"id":189269},"creation",[189271],{"type":23,"value":189272},"Creation",{"type":17,"tag":29,"props":189274,"children":189275},{},[189276],{"type":23,"value":189277},"A submission is created when a respondent completes a form in the source platform. Unified does not create submissions.",{"type":17,"tag":239,"props":189279,"children":189281},{"id":189280},"immutability",[189282],{"type":23,"value":189283},"Immutability",{"type":17,"tag":29,"props":189285,"children":189286},{},[189287,189289,189294,189296,189301],{"type":23,"value":189288},"Submissions cannot be modified after creation. The ",{"type":17,"tag":6121,"props":189290,"children":189292},{"className":189291},[],[189293],{"type":23,"value":25337},{"type":23,"value":189295}," timestamp typically matches ",{"type":17,"tag":6121,"props":189297,"children":189299},{"className":189298},[],[189300],{"type":23,"value":33446},{"type":23,"value":189302},", reflecting the immutable nature of responses.",{"type":17,"tag":239,"props":189304,"children":189306},{"id":189305},"typed-answers",[189307],{"type":23,"value":189308},"Typed Answers",{"type":17,"tag":29,"props":189310,"children":189311},{},[189312],{"type":23,"value":189313},"Answers are returned as structured JSON:",{"type":17,"tag":80,"props":189315,"children":189316},{},[189317,189322,189327],{"type":17,"tag":84,"props":189318,"children":189319},{},[189320],{"type":23,"value":189321},"Strings, numbers, booleans",{"type":17,"tag":84,"props":189323,"children":189324},{},[189325],{"type":23,"value":189326},"Arrays or objects for multi-select or matrix questions",{"type":17,"tag":84,"props":189328,"children":189329},{},[189330],{"type":23,"value":189331},"Optional file identifiers for uploads",{"type":17,"tag":29,"props":189333,"children":189334},{},[189335],{"type":23,"value":189336},"This preserves semantic meaning and avoids forcing all responses into string values.",{"type":17,"tag":68,"props":189338,"children":189340},{"id":189339},"identity-and-ownership-in-forms",[189341],{"type":23,"value":189342},"Identity and Ownership in Forms",{"type":17,"tag":29,"props":189344,"children":189345},{},[189346],{"type":23,"value":189347},"Forms intentionally avoid identity coupling.",{"type":17,"tag":80,"props":189349,"children":189350},{},[189351,189360,189382],{"type":17,"tag":84,"props":189352,"children":189353},{},[189354,189358],{"type":17,"tag":48,"props":189355,"children":189356},{},[189357],{"type":23,"value":114439},{"type":23,"value":189359}," do not reference contacts, users, or employees.",{"type":17,"tag":84,"props":189361,"children":189362},{},[189363,189367,189369,189374,189375,189380],{"type":17,"tag":48,"props":189364,"children":189365},{},[189366],{"type":23,"value":189222},{"type":23,"value":189368}," may include ",{"type":17,"tag":6121,"props":189370,"children":189372},{"className":189371},[],[189373],{"type":23,"value":115039},{"type":23,"value":75890},{"type":17,"tag":6121,"props":189376,"children":189378},{"className":189377},[],[189379],{"type":23,"value":115046},{"type":23,"value":189381},", but no cross-category IDs.",{"type":17,"tag":84,"props":189383,"children":189384},{},[189385,189387,189392,189393,189399,189400,189405,189406,189412],{"type":23,"value":189386},"There is no ",{"type":17,"tag":6121,"props":189388,"children":189390},{"className":189389},[],[189391],{"type":23,"value":26302},{"type":23,"value":11826},{"type":17,"tag":6121,"props":189394,"children":189396},{"className":189395},[],[189397],{"type":23,"value":189398},"member_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":189401,"children":189403},{"className":189402},[],[189404],{"type":23,"value":117296},{"type":23,"value":27293},{"type":17,"tag":6121,"props":189407,"children":189409},{"className":189408},[],[189410],{"type":23,"value":189411},"employee_id",{"type":23,"value":54},{"type":17,"tag":29,"props":189414,"children":189415},{},[189416],{"type":23,"value":189417},"Identity resolution happens outside the Forms API. Applications typically match respondents to CRM contacts, marketing subscribers, candidates, or employees using shared attributes such as email.",{"type":17,"tag":68,"props":189419,"children":189421},{"id":189420},"update-delivery-and-polling-strategies",[189422],{"type":23,"value":189423},"Update Delivery and Polling Strategies",{"type":17,"tag":239,"props":189425,"children":189427},{"id":189426},"submission-updates",[189428],{"type":23,"value":189429},"Submission Updates",{"type":17,"tag":80,"props":189431,"children":189432},{},[189433,189442,189452],{"type":17,"tag":84,"props":189434,"children":189435},{},[189436,189440],{"type":17,"tag":48,"props":189437,"children":189438},{},[189439],{"type":23,"value":39982},{"type":23,"value":189441}," supports native submission webhooks.",{"type":17,"tag":84,"props":189443,"children":189444},{},[189445,189450],{"type":17,"tag":48,"props":189446,"children":189447},{},[189448],{"type":23,"value":189449},"Google Forms and Tally",{"type":23,"value":189451}," use virtual webhooks (polling behind the scenes).",{"type":17,"tag":84,"props":189453,"children":189454},{},[189455,189457,189462],{"type":23,"value":189456},"When webhooks are unavailable, applications must poll using ",{"type":17,"tag":6121,"props":189458,"children":189460},{"className":189459},[],[189461],{"type":23,"value":26291},{"type":23,"value":54},{"type":17,"tag":239,"props":189464,"children":189466},{"id":189465},"recommended-polling-pattern",[189467],{"type":23,"value":189468},"Recommended Polling Pattern",{"type":17,"tag":6154,"props":189470,"children":189471},{},[189472,189483,189494,189499,189504],{"type":17,"tag":84,"props":189473,"children":189474},{},[189475,189476,189481],{"type":23,"value":110410},{"type":17,"tag":6121,"props":189477,"children":189479},{"className":189478},[],[189480],{"type":23,"value":25337},{"type":23,"value":189482}," timestamp.",{"type":17,"tag":84,"props":189484,"children":189485},{},[189486,189488,189493],{"type":23,"value":189487},"Call the submissions list endpoint with ",{"type":17,"tag":6121,"props":189489,"children":189491},{"className":189490},[],[189492],{"type":23,"value":26291},{"type":23,"value":54},{"type":17,"tag":84,"props":189495,"children":189496},{},[189497],{"type":23,"value":189498},"Process returned submissions.",{"type":17,"tag":84,"props":189500,"children":189501},{},[189502],{"type":23,"value":189503},"Update the stored timestamp.",{"type":17,"tag":84,"props":189505,"children":189506},{},[189507],{"type":23,"value":189508},"Apply exponential backoff on rate-limit responses.",{"type":17,"tag":29,"props":189510,"children":189511},{},[189512],{"type":23,"value":189513},"Polling frequency should reflect urgency. Near-real-time workflows may poll every minute; analytics ingestion may poll hourly or daily.",{"type":17,"tag":68,"props":189515,"children":189516},{"id":164849},[189517],{"type":23,"value":164852},{"type":17,"tag":29,"props":189519,"children":189520},{},[189521],{"type":23,"value":189522},"Form submissions often contain sensitive data. Unified's architecture minimizes exposure.",{"type":17,"tag":239,"props":189524,"children":189525},{"id":90302},[189526],{"type":23,"value":179326},{"type":17,"tag":80,"props":189528,"children":189529},{},[189530,189535,189540,189545],{"type":17,"tag":84,"props":189531,"children":189532},{},[189533],{"type":23,"value":189534},"Form data is routed directly to source platforms.",{"type":17,"tag":84,"props":189536,"children":189537},{},[189538],{"type":23,"value":189539},"No submission payloads are stored at rest.",{"type":17,"tag":84,"props":189541,"children":189542},{},[189543],{"type":23,"value":189544},"No customer data is written to logs.",{"type":17,"tag":84,"props":189546,"children":189547},{},[189548],{"type":23,"value":189549},"Requests are stateless and region-aware (US, EU, AU).",{"type":17,"tag":29,"props":189551,"children":189552},{},[189553],{"type":23,"value":180521},{"type":17,"tag":239,"props":189555,"children":189557},{"id":189556},"pii-handling-and-compliance",[189558],{"type":23,"value":189559},"PII Handling and Compliance",{"type":17,"tag":29,"props":189561,"children":189562},{},[189563],{"type":23,"value":189564},"Submissions may include:",{"type":17,"tag":80,"props":189566,"children":189567},{},[189568,189572,189576],{"type":17,"tag":84,"props":189569,"children":189570},{},[189571],{"type":23,"value":131730},{"type":17,"tag":84,"props":189573,"children":189574},{},[189575],{"type":23,"value":131725},{"type":17,"tag":84,"props":189577,"children":189578},{},[189579],{"type":23,"value":189580},"Free-text responses containing arbitrary personal data",{"type":17,"tag":29,"props":189582,"children":189583},{},[189584],{"type":23,"value":189585},"Unified passes data through exactly as provided by the source platform. Developers are responsible for:",{"type":17,"tag":80,"props":189587,"children":189588},{},[189589,189594,189599,189604],{"type":17,"tag":84,"props":189590,"children":189591},{},[189592],{"type":23,"value":189593},"Secure storage",{"type":17,"tag":84,"props":189595,"children":189596},{},[189597],{"type":23,"value":189598},"Access controls",{"type":17,"tag":84,"props":189600,"children":189601},{},[189602],{"type":23,"value":189603},"Consent management",{"type":17,"tag":84,"props":189605,"children":189606},{},[189607],{"type":23,"value":189608},"Compliance with GDPR, CAN-SPAM, CASL, and similar regulations",{"type":17,"tag":29,"props":189610,"children":189611},{},[189612],{"type":23,"value":189613},"For AI-driven workflows, MCP-based integrations can remove sensitive fields before downstream processing.",{"type":17,"tag":68,"props":189615,"children":189617},{"id":189616},"common-forms-api-integration-use-cases",[189618],{"type":23,"value":189619},"Common Forms API Integration Use Cases",{"type":17,"tag":239,"props":189621,"children":189623},{"id":189622},"lead-capture",[189624],{"type":23,"value":189625},"Lead Capture",{"type":17,"tag":29,"props":189627,"children":189628},{},[189629],{"type":23,"value":189630},"Ingest contact requests or sign-ups and create CRM contacts or marketing subscribers explicitly.",{"type":17,"tag":239,"props":189632,"children":189634},{"id":189633},"survey-and-feedback-analytics",[189635],{"type":23,"value":189636},"Survey and Feedback Analytics",{"type":17,"tag":29,"props":189638,"children":189639},{},[189640],{"type":23,"value":189641},"Aggregate responses across multiple platforms into a unified dataset for analysis.",{"type":17,"tag":239,"props":189643,"children":189645},{"id":189644},"workflow-triggers",[189646],{"type":23,"value":189647},"Workflow Triggers",{"type":17,"tag":29,"props":189649,"children":189650},{},[189651],{"type":23,"value":189652},"Trigger downstream logic — notifications, tasks, or approvals — when new submissions arrive.",{"type":17,"tag":239,"props":189654,"children":189656},{"id":189655},"ats-and-hr-intake",[189657],{"type":23,"value":189658},"ATS and HR Intake",{"type":17,"tag":29,"props":189660,"children":189661},{},[189662],{"type":23,"value":189663},"Use forms for applications or internal surveys, then create candidates or employee records via the appropriate APIs.",{"type":17,"tag":239,"props":189665,"children":189667},{"id":189666},"ai-powered-analysis",[189668],{"type":23,"value":189669},"AI-Powered Analysis",{"type":17,"tag":29,"props":189671,"children":189672},{},[189673],{"type":23,"value":189674},"Analyze structured responses using embeddings or classification without storing raw form data in Unified.",{"type":17,"tag":68,"props":189676,"children":189677},{"id":188461},[189678],{"type":23,"value":188464},{"type":17,"tag":29,"props":189680,"children":189681},{},[189682],{"type":23,"value":189683},"Unified is explicit about Forms limitations:",{"type":17,"tag":80,"props":189685,"children":189686},{},[189687,189692,189697,189702,189707,189712],{"type":17,"tag":84,"props":189688,"children":189689},{},[189690],{"type":23,"value":189691},"Submissions are immutable",{"type":17,"tag":84,"props":189693,"children":189694},{},[189695],{"type":23,"value":189696},"Identity resolution is external",{"type":17,"tag":84,"props":189698,"children":189699},{},[189700],{"type":23,"value":189701},"Write support for forms varies by provider",{"type":17,"tag":84,"props":189703,"children":189704},{},[189705],{"type":23,"value":189706},"Form deletion is not supported",{"type":17,"tag":84,"props":189708,"children":189709},{},[189710],{"type":23,"value":189711},"Webhook support is uneven",{"type":17,"tag":84,"props":189713,"children":189714},{},[189715],{"type":23,"value":189716},"PII handling is the application's responsibility",{"type":17,"tag":29,"props":189718,"children":189719},{},[189720],{"type":23,"value":189721},"These constraints reflect real provider behavior and should be incorporated into system design.",{"type":17,"tag":68,"props":189723,"children":189725},{"id":189724},"build-vs-buy-forms-integrations",[189726],{"type":23,"value":189727},"Build vs Buy Forms Integrations",{"type":17,"tag":239,"props":189729,"children":189730},{"id":165021},[189731],{"type":23,"value":165024},{"type":17,"tag":80,"props":189733,"children":189734},{},[189735,189740,189745,189749],{"type":17,"tag":84,"props":189736,"children":189737},{},[189738],{"type":23,"value":189739},"Multiple provider schemas",{"type":17,"tag":84,"props":189741,"children":189742},{},[189743],{"type":23,"value":189744},"Inconsistent answer formats",{"type":17,"tag":84,"props":189746,"children":189747},{},[189748],{"type":23,"value":187218},{"type":17,"tag":84,"props":189750,"children":189751},{},[189752],{"type":23,"value":187223},{"type":17,"tag":239,"props":189754,"children":189756},{"id":189755},"using-a-unified-forms-api",[189757],{"type":23,"value":189758},"Using a Unified Forms API",{"type":17,"tag":80,"props":189760,"children":189761},{},[189762,189767,189772,189777,189781,189785],{"type":17,"tag":84,"props":189763,"children":189764},{},[189765],{"type":23,"value":189766},"One ingestion surface",{"type":17,"tag":84,"props":189768,"children":189769},{},[189770],{"type":23,"value":189771},"Normalized forms and submissions",{"type":17,"tag":84,"props":189773,"children":189774},{},[189775],{"type":23,"value":189776},"Typed answers",{"type":17,"tag":84,"props":189778,"children":189779},{},[189780],{"type":23,"value":165071},{"type":17,"tag":84,"props":189782,"children":189783},{},[189784],{"type":23,"value":180731},{"type":17,"tag":84,"props":189786,"children":189787},{},[189788],{"type":23,"value":137967},{"type":17,"tag":68,"props":189790,"children":189792},{"id":189791},"best-practices-for-implementing-forms-apis",[189793],{"type":23,"value":189794},"Best Practices for Implementing Forms APIs",{"type":17,"tag":80,"props":189796,"children":189797},{},[189798,189803,189808,189813,189818,189823,189828],{"type":17,"tag":84,"props":189799,"children":189800},{},[189801],{"type":23,"value":189802},"Treat forms as event sources, not records",{"type":17,"tag":84,"props":189804,"children":189805},{},[189806],{"type":23,"value":189807},"Persist submissions in your own system",{"type":17,"tag":84,"props":189809,"children":189810},{},[189811],{"type":23,"value":189812},"Design for immutable responses",{"type":17,"tag":84,"props":189814,"children":189815},{},[189816],{"type":23,"value":189817},"Match identities explicitly using email or answer data",{"type":17,"tag":84,"props":189819,"children":189820},{},[189821],{"type":23,"value":189822},"Poll incrementally using timestamps",{"type":17,"tag":84,"props":189824,"children":189825},{},[189826],{"type":23,"value":189827},"Secure free-text responses carefully",{"type":17,"tag":84,"props":189829,"children":189830},{},[189831],{"type":23,"value":189832},"Keep Forms, CRM, and Marketing responsibilities separate",{"type":17,"tag":68,"props":189834,"children":189836},{"id":189835},"ingest-form-data-with-clear-boundaries",[189837],{"type":23,"value":189838},"Ingest form data with clear boundaries",{"type":17,"tag":29,"props":189840,"children":189841},{},[189842],{"type":23,"value":189843},"If your product relies on ingesting structured input from multiple form platforms, building and maintaining those integrations independently quickly becomes complex.",{"type":17,"tag":29,"props":189845,"children":189846},{},[189847,189848,189852],{"type":23,"value":25244},{"type":17,"tag":48,"props":189849,"children":189850},{},[189851],{"type":23,"value":114951},{"type":23,"value":189853}," provides a normalized, real-time ingestion layer for forms and submissions across supported platforms — without storing form data or collapsing category boundaries.",{"type":17,"tag":29,"props":189855,"children":189856},{},[189857,189861,189862],{"type":17,"tag":48,"props":189858,"children":189859},{},[189860],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":189863,"children":189865},{"href":1612,"rel":189864},[214],[189866],{"type":17,"tag":48,"props":189867,"children":189868},{},[189869],{"type":23,"value":1616},{"type":17,"tag":29,"props":189871,"children":189872},{},[189873],{"type":23,"value":189874},"Test form ingestion with live submissions and normalized schemas.",{"type":17,"tag":29,"props":189876,"children":189877},{},[189878,189882,189883],{"type":17,"tag":48,"props":189879,"children":189880},{},[189881],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":189884,"children":189886},{"href":1623,"rel":189885},[214],[189887],{"type":17,"tag":48,"props":189888,"children":189889},{},[189890],{"type":23,"value":1627},{"type":17,"tag":29,"props":189892,"children":189893},{},[189894],{"type":23,"value":189895},"Discuss form ingestion, downstream workflows, or cross-category integrations with the team that built the platform.",{"type":17,"tag":68,"props":189897,"children":189898},{"id":95759},[189899],{"type":23,"value":95762},{"type":17,"tag":29,"props":189901,"children":189902},{},[189903],{"type":17,"tag":48,"props":189904,"children":189905},{},[189906],{"type":23,"value":189907},"What is a Forms API?",{"type":17,"tag":29,"props":189909,"children":189910},{},[189911],{"type":23,"value":189912},"An API that allows applications to read form templates and submissions programmatically.",{"type":17,"tag":29,"props":189914,"children":189915},{},[189916],{"type":17,"tag":48,"props":189917,"children":189918},{},[189919],{"type":23,"value":165175},{"type":17,"tag":29,"props":189921,"children":189922},{},[189923],{"type":23,"value":189924},"Unified supports platforms including Typeform, Google Forms, and Tally, with additional providers available.",{"type":17,"tag":29,"props":189926,"children":189927},{},[189928],{"type":17,"tag":48,"props":189929,"children":189930},{},[189931],{"type":23,"value":189932},"Are form submissions real time?",{"type":17,"tag":29,"props":189934,"children":189935},{},[189936],{"type":23,"value":189937},"Yes. Submissions are available as soon as the source platform records them, subject to provider webhook or polling behavior.",{"type":17,"tag":29,"props":189939,"children":189940},{},[189941],{"type":17,"tag":48,"props":189942,"children":189943},{},[189944],{"type":23,"value":189945},"Can I create or edit submissions via the API?",{"type":17,"tag":29,"props":189947,"children":189948},{},[189949],{"type":23,"value":189950},"No. Submissions are immutable and read-only.",{"type":17,"tag":29,"props":189952,"children":189953},{},[189954],{"type":17,"tag":48,"props":189955,"children":189956},{},[189957],{"type":23,"value":189958},"Does the Forms API store response data?",{"type":17,"tag":29,"props":189960,"children":189961},{},[189962],{"type":23,"value":189963},"No. Form data is never stored at rest.",{"type":17,"tag":29,"props":189965,"children":189966},{},[189967],{"type":17,"tag":48,"props":189968,"children":189969},{},[189970],{"type":23,"value":189971},"How does Forms differ from Marketing or CRM APIs?",{"type":17,"tag":29,"props":189973,"children":189974},{},[189975],{"type":23,"value":189976},"Forms collect input. Marketing executes campaigns. CRM manages relationships. Each category has a distinct role.",{"title":7,"searchDepth":1629,"depth":1629,"links":189978},[189979,189980,189981,189982,189986,189990,189995,189996,190000,190004,190011,190012,190016,190017,190018],{"id":188839,"depth":1629,"text":188842},{"id":39294,"depth":1629,"text":188928},{"id":188980,"depth":1629,"text":188983},{"id":189055,"depth":1629,"text":189058,"children":189983},[189984,189985],{"id":163879,"depth":1635,"text":163882},{"id":189075,"depth":1635,"text":189078},{"id":189133,"depth":1629,"text":189136,"children":189987},[189988,189989],{"id":39321,"depth":1635,"text":114439},{"id":189219,"depth":1635,"text":189222},{"id":189263,"depth":1629,"text":189266,"children":189991},[189992,189993,189994],{"id":189269,"depth":1635,"text":189272},{"id":189280,"depth":1635,"text":189283},{"id":189305,"depth":1635,"text":189308},{"id":189339,"depth":1629,"text":189342},{"id":189420,"depth":1629,"text":189423,"children":189997},[189998,189999],{"id":189426,"depth":1635,"text":189429},{"id":189465,"depth":1635,"text":189468},{"id":164849,"depth":1629,"text":164852,"children":190001},[190002,190003],{"id":90302,"depth":1635,"text":179326},{"id":189556,"depth":1635,"text":189559},{"id":189616,"depth":1629,"text":189619,"children":190005},[190006,190007,190008,190009,190010],{"id":189622,"depth":1635,"text":189625},{"id":189633,"depth":1635,"text":189636},{"id":189644,"depth":1635,"text":189647},{"id":189655,"depth":1635,"text":189658},{"id":189666,"depth":1635,"text":189669},{"id":188461,"depth":1629,"text":188464},{"id":189724,"depth":1629,"text":189727,"children":190013},[190014,190015],{"id":165021,"depth":1635,"text":165024},{"id":189755,"depth":1635,"text":189758},{"id":189791,"depth":1629,"text":189794},{"id":189835,"depth":1629,"text":189838},{"id":95759,"depth":1629,"text":95762},"content:blog:forms_api_integration_real_time_form_submissions_normalized_responses_and_downstream_workflows.md","blog/forms_api_integration_real_time_form_submissions_normalized_responses_and_downstream_workflows.md","blog/forms_api_integration_real_time_form_submissions_normalized_responses_and_downstream_workflows",{"_path":190023,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":190024,"description":190025,"img":190026,"date":190027,"tag":12,"body":190028,"_type":1677,"_id":191054,"_source":1679,"_file":191055,"_stem":191056,"_extension":1682},"/blog/advertising_api_integration_real_time_campaign_management_and_cross_platform_performance_data","Advertising API Integration: Real-Time Campaign Management & Cross-Platform Performance Data","Modern SaaS products increasingly need direct access to paid media data. Campaign performance, spend pacing, creative status, and cross-channel reporting all...","https://s3.us-east-2.amazonaws.com/unified-article-images/advertising_api_integration_real_time_campaign_management_and_cross_platform_performance_data-icon.png","2026-02-09T00:26:00.000Z",{"type":14,"children":190029,"toc":191014},[190030,190035,190038,190045,190050,190059,190065,190070,190075,190087,190092,190102,190130,190142,190147,190153,190158,190164,190188,190193,190199,190223,190228,190234,190253,190258,190264,190269,190275,190280,190285,190297,190302,190307,190311,190339,190344,190350,190355,190377,190382,190387,190392,190397,190420,190425,190430,190435,190453,190458,190464,190469,190474,190479,190489,190494,190518,190523,190529,190535,190540,190545,190551,190556,190561,190585,190590,190596,190601,190607,190619,190658,190670,190675,190681,190687,190692,190698,190703,190709,190714,190720,190725,190731,190736,190742,190746,190751,190757,190762,190783,190795,190799,190804,190810,190838,190843,190849,190857,190879,190887,190910,190916,190921,190933,190945,190949,190957,190962,190970,190975,190983,190988,190996,191001,191009],{"type":17,"tag":18,"props":190031,"children":190033},{"id":190032},"advertising-api-integration-real-time-campaign-management-cross-platform-performance-data",[190034],{"type":23,"value":190024},{"type":17,"tag":25,"props":190036,"children":190037},{},[],{"type":17,"tag":29,"props":190039,"children":190040},{},[190041],{"type":17,"tag":33,"props":190042,"children":190043},{},[190044],{"type":23,"value":182031},{"type":17,"tag":29,"props":190046,"children":190047},{},[190048],{"type":23,"value":190049},"Modern SaaS products increasingly need direct access to paid media data. Campaign performance, spend pacing, creative status, and cross-channel reporting all depend on accurate, current advertising data—pulled directly from the source platforms, not from delayed exports or nightly syncs.",{"type":17,"tag":29,"props":190051,"children":190052},{},[190053,190057],{"type":17,"tag":133,"props":190054,"children":190055},{"href":11091},[190056],{"type":23,"value":11094},{"type":23,"value":190058}," integration exists to make that possible. This guide explains what an Advertising API is, how Unified's Advertising API works, which objects and workflows it supports, and how it fits alongside CRM, Marketing, Enrichment, and other Unified categories.",{"type":17,"tag":68,"props":190060,"children":190062},{"id":190061},"introduction-to-advertising-api-integrations",[190063],{"type":23,"value":190064},"Introduction to Advertising API Integrations",{"type":17,"tag":29,"props":190066,"children":190067},{},[190068],{"type":23,"value":190069},"Advertising platforms like Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, and Amazon Advertising each expose their own APIs, authentication flows, data models, and reporting semantics. Building and maintaining individual integrations quickly becomes expensive and brittle—especially as platforms evolve their APIs and reporting rules.",{"type":17,"tag":29,"props":190071,"children":190072},{},[190073],{"type":23,"value":190074},"An Advertising API abstracts those differences. It provides a single, normalized interface to retrieve and manage campaigns, ads, creatives, budgets, and performance metrics across multiple ad networks.",{"type":17,"tag":29,"props":190076,"children":190077},{},[190078,190080,190085],{"type":23,"value":190079},"Unified's Advertising API is designed for ",{"type":17,"tag":48,"props":190081,"children":190082},{},[190083],{"type":23,"value":190084},"execution and analysis",{"type":23,"value":190086},", not storage. Every request is routed directly to the underlying ad platform in real time.",{"type":17,"tag":68,"props":190088,"children":190089},{"id":40429},[190090],{"type":23,"value":190091},"What Is an Advertising API?",{"type":17,"tag":29,"props":190093,"children":190094},{},[190095,190096,190100],{"type":23,"value":40437},{"type":17,"tag":48,"props":190097,"children":190098},{},[190099],{"type":23,"value":11094},{"type":23,"value":190101}," allows applications to programmatically access paid-media data such as:",{"type":17,"tag":80,"props":190103,"children":190104},{},[190105,190110,190115,190120,190125],{"type":17,"tag":84,"props":190106,"children":190107},{},[190108],{"type":23,"value":190109},"Ad accounts and organizations",{"type":17,"tag":84,"props":190111,"children":190112},{},[190113],{"type":23,"value":190114},"Campaigns and ad groups",{"type":17,"tag":84,"props":190116,"children":190117},{},[190118],{"type":23,"value":190119},"Ads and creatives",{"type":17,"tag":84,"props":190121,"children":190122},{},[190123],{"type":23,"value":190124},"Budgets, pacing, and frequency caps",{"type":17,"tag":84,"props":190126,"children":190127},{},[190128],{"type":23,"value":190129},"Performance reports (impressions, clicks, conversions, spend)",{"type":17,"tag":29,"props":190131,"children":190132},{},[190133,190135,190140],{"type":23,"value":190134},"Unlike CRM or Marketing APIs, advertising APIs focus on ",{"type":17,"tag":48,"props":190136,"children":190137},{},[190138],{"type":23,"value":190139},"paid media operations and performance",{"type":23,"value":190141},", not customer identity or lifecycle messaging.",{"type":17,"tag":29,"props":190143,"children":190144},{},[190145],{"type":23,"value":190146},"Unified's Advertising API normalizes these objects across platforms so you can build once and support many providers.",{"type":17,"tag":68,"props":190148,"children":190150},{"id":190149},"advertising-api-vs-marketing-crm-and-attribution",[190151],{"type":23,"value":190152},"Advertising API vs Marketing, CRM, and Attribution",{"type":17,"tag":29,"props":190154,"children":190155},{},[190156],{"type":23,"value":190157},"Advertising data is often confused with other sales and marketing systems. The boundaries matter.",{"type":17,"tag":239,"props":190159,"children":190161},{"id":190160},"advertising-vs-marketing-api",[190162],{"type":23,"value":190163},"Advertising vs Marketing API",{"type":17,"tag":80,"props":190165,"children":190166},{},[190167,190176],{"type":17,"tag":84,"props":190168,"children":190169},{},[190170,190174],{"type":17,"tag":48,"props":190171,"children":190172},{},[190173],{"type":23,"value":11094},{"type":23,"value":190175}," handles paid media: campaigns, ads, budgets, creatives, and performance metrics.",{"type":17,"tag":84,"props":190177,"children":190178},{},[190179,190186],{"type":17,"tag":48,"props":190180,"children":190181},{},[190182],{"type":17,"tag":133,"props":190183,"children":190184},{"href":106471},[190185],{"type":23,"value":106474},{"type":23,"value":190187}," handles lifecycle messaging: email lists, subscribers, campaigns, and engagement reports.",{"type":17,"tag":29,"props":190189,"children":190190},{},[190191],{"type":23,"value":190192},"There is no overlap in contacts, lists, or audience membership.",{"type":17,"tag":239,"props":190194,"children":190196},{"id":190195},"advertising-vs-crm-api",[190197],{"type":23,"value":190198},"Advertising vs CRM API",{"type":17,"tag":80,"props":190200,"children":190201},{},[190202,190214],{"type":17,"tag":84,"props":190203,"children":190204},{},[190205,190212],{"type":17,"tag":48,"props":190206,"children":190207},{},[190208],{"type":17,"tag":133,"props":190209,"children":190210},{"href":61562},[190211],{"type":23,"value":61565},{"type":23,"value":190213}," manages people and revenue: contacts, companies, deals, pipelines, and activities.",{"type":17,"tag":84,"props":190215,"children":190216},{},[190217,190221],{"type":17,"tag":48,"props":190218,"children":190219},{},[190220],{"type":23,"value":11094},{"type":23,"value":190222}," manages ad accounts and paid-media objects.",{"type":17,"tag":29,"props":190224,"children":190225},{},[190226],{"type":23,"value":190227},"Advertising campaigns do not reference CRM contacts or leads.",{"type":17,"tag":239,"props":190229,"children":190231},{"id":190230},"advertising-vs-attribution-analytics",[190232],{"type":23,"value":190233},"Advertising vs Attribution & Analytics",{"type":17,"tag":80,"props":190235,"children":190236},{},[190237,190248],{"type":17,"tag":84,"props":190238,"children":190239},{},[190240,190242,190247],{"type":23,"value":190241},"Advertising APIs expose ",{"type":17,"tag":48,"props":190243,"children":190244},{},[190245],{"type":23,"value":190246},"platform-reported metrics",{"type":23,"value":54},{"type":17,"tag":84,"props":190249,"children":190250},{},[190251],{"type":23,"value":190252},"Attribution systems combine ads data with analytics, events, and conversions from other sources.",{"type":17,"tag":29,"props":190254,"children":190255},{},[190256],{"type":23,"value":190257},"Unified's Advertising API provides the raw performance layer; attribution logic belongs downstream.",{"type":17,"tag":68,"props":190259,"children":190261},{"id":190260},"core-advertising-data-models",[190262],{"type":23,"value":190263},"Core Advertising Data Models",{"type":17,"tag":29,"props":190265,"children":190266},{},[190267],{"type":23,"value":190268},"Unified normalizes advertising platforms into a consistent object model. These objects mirror how ad platforms actually operate.",{"type":17,"tag":239,"props":190270,"children":190272},{"id":190271},"organization-ad-account",[190273],{"type":23,"value":190274},"Organization (Ad Account)",{"type":17,"tag":29,"props":190276,"children":190277},{},[190278],{"type":23,"value":190279},"Represents an advertising account.",{"type":17,"tag":29,"props":190281,"children":190282},{},[190283],{"type":23,"value":190284},"Fields include name, currency, timezone, and parent relationships for multi-account hierarchies.",{"type":17,"tag":29,"props":190286,"children":190287},{},[190288,190290,190295],{"type":23,"value":190289},"Organizations are ",{"type":17,"tag":48,"props":190291,"children":190292},{},[190293],{"type":23,"value":190294},"not CRM companies",{"type":23,"value":190296},". They represent ad accounts only.",{"type":17,"tag":239,"props":190298,"children":190300},{"id":190299},"campaign",[190301],{"type":23,"value":18610},{"type":17,"tag":29,"props":190303,"children":190304},{},[190305],{"type":23,"value":190306},"Campaigns define budgets, schedules, targeting, and high-level objectives.",{"type":17,"tag":29,"props":190308,"children":190309},{},[190310],{"type":23,"value":111468},{"type":17,"tag":80,"props":190312,"children":190313},{},[190314,190319,190324,190329,190334],{"type":17,"tag":84,"props":190315,"children":190316},{},[190317],{"type":23,"value":190318},"status, is_active",{"type":17,"tag":84,"props":190320,"children":190321},{},[190322],{"type":23,"value":190323},"start_at, end_at",{"type":17,"tag":84,"props":190325,"children":190326},{},[190327],{"type":23,"value":190328},"budget_amount, budget_period",{"type":17,"tag":84,"props":190330,"children":190331},{},[190332],{"type":23,"value":190333},"total_spend_amount, planned_spend_amount",{"type":17,"tag":84,"props":190335,"children":190336},{},[190337],{"type":23,"value":190338},"goal, pacing, frequency_cap",{"type":17,"tag":29,"props":190340,"children":190341},{},[190342],{"type":23,"value":190343},"Campaign lifecycle is controlled by status and scheduling fields, not by Unified.",{"type":17,"tag":239,"props":190345,"children":190347},{"id":190346},"group-ad-group-ad-set",[190348],{"type":23,"value":190349},"Group (Ad Group / Ad Set)",{"type":17,"tag":29,"props":190351,"children":190352},{},[190353],{"type":23,"value":190354},"Groups sit beneath campaigns and control:",{"type":17,"tag":80,"props":190356,"children":190357},{},[190358,190363,190368,190372],{"type":17,"tag":84,"props":190359,"children":190360},{},[190361],{"type":23,"value":190362},"bidding strategies",{"type":17,"tag":84,"props":190364,"children":190365},{},[190366],{"type":23,"value":190367},"budget allocation",{"type":17,"tag":84,"props":190369,"children":190370},{},[190371],{"type":23,"value":40487},{"type":17,"tag":84,"props":190373,"children":190374},{},[190375],{"type":23,"value":190376},"pacing and frequency caps",{"type":17,"tag":29,"props":190378,"children":190379},{},[190380],{"type":23,"value":190381},"Provider support varies significantly at this level.",{"type":17,"tag":239,"props":190383,"children":190385},{"id":190384},"ad",[190386],{"type":23,"value":18636},{"type":17,"tag":29,"props":190388,"children":190389},{},[190390],{"type":23,"value":190391},"Ads represent the actual deliverables shown to users.",{"type":17,"tag":29,"props":190393,"children":190394},{},[190395],{"type":23,"value":190396},"Fields include:",{"type":17,"tag":80,"props":190398,"children":190399},{},[190400,190405,190410,190415],{"type":17,"tag":84,"props":190401,"children":190402},{},[190403],{"type":23,"value":190404},"creative_ids",{"type":17,"tag":84,"props":190406,"children":190407},{},[190408],{"type":23,"value":190409},"ad_copy, headline, description, CTA",{"type":17,"tag":84,"props":190411,"children":190412},{},[190413],{"type":23,"value":190414},"final_url",{"type":17,"tag":84,"props":190416,"children":190417},{},[190418],{"type":23,"value":190419},"status and is_active",{"type":17,"tag":29,"props":190421,"children":190422},{},[190423],{"type":23,"value":190424},"Ads inherit delivery constraints from their group and campaign.",{"type":17,"tag":239,"props":190426,"children":190428},{"id":190427},"creative",[190429],{"type":23,"value":18641},{"type":17,"tag":29,"props":190431,"children":190432},{},[190433],{"type":23,"value":190434},"Creatives store media and asset references:",{"type":17,"tag":80,"props":190436,"children":190437},{},[190438,190443,190448],{"type":17,"tag":84,"props":190439,"children":190440},{},[190441],{"type":23,"value":190442},"hosted assets",{"type":17,"tag":84,"props":190444,"children":190445},{},[190446],{"type":23,"value":190447},"third-party tags",{"type":17,"tag":84,"props":190449,"children":190450},{},[190451],{"type":23,"value":190452},"video and display metadata",{"type":17,"tag":29,"props":190454,"children":190455},{},[190456],{"type":23,"value":190457},"Creatives do not track spend or performance directly.",{"type":17,"tag":239,"props":190459,"children":190461},{"id":190460},"insertion-order",[190462],{"type":23,"value":190463},"Insertion Order",{"type":17,"tag":29,"props":190465,"children":190466},{},[190467],{"type":23,"value":190468},"Used primarily by enterprise platforms (e.g., Display & Video 360).",{"type":17,"tag":29,"props":190470,"children":190471},{},[190472],{"type":23,"value":190473},"Controls segmented budgets and delivery pacing across date ranges.",{"type":17,"tag":239,"props":190475,"children":190477},{"id":190476},"report",[190478],{"type":23,"value":22191},{"type":17,"tag":29,"props":190480,"children":190481},{},[190482,190483,190487],{"type":23,"value":188188},{"type":17,"tag":48,"props":190484,"children":190485},{},[190486],{"type":23,"value":19834},{"type":23,"value":190488}," analytics objects.",{"type":17,"tag":29,"props":190490,"children":190491},{},[190492],{"type":23,"value":190493},"They return aggregated performance metrics for a time window:",{"type":17,"tag":80,"props":190495,"children":190496},{},[190497,190501,190505,190509,190513],{"type":17,"tag":84,"props":190498,"children":190499},{},[190500],{"type":23,"value":41426},{"type":17,"tag":84,"props":190502,"children":190503},{},[190504],{"type":23,"value":41431},{"type":17,"tag":84,"props":190506,"children":190507},{},[190508],{"type":23,"value":41436},{"type":17,"tag":84,"props":190510,"children":190511},{},[190512],{"type":23,"value":41441},{"type":17,"tag":84,"props":190514,"children":190515},{},[190516],{"type":23,"value":190517},"KPIs",{"type":17,"tag":29,"props":190519,"children":190520},{},[190521],{"type":23,"value":190522},"Reports do not emit events and must be retrieved on demand.",{"type":17,"tag":68,"props":190524,"children":190526},{"id":190525},"real-time-data-update-behavior",[190527],{"type":23,"value":190528},"Real-Time Data & Update Behavior",{"type":17,"tag":239,"props":190530,"children":190532},{"id":190531},"pass-through-reads",[190533],{"type":23,"value":190534},"Pass-Through Reads",{"type":17,"tag":29,"props":190536,"children":190537},{},[190538],{"type":23,"value":190539},"Every request hits the source advertising platform directly. Unified does not cache or replicate advertising data.",{"type":17,"tag":29,"props":190541,"children":190542},{},[190543],{"type":23,"value":190544},"This guarantees the most current data available from the provider.",{"type":17,"tag":239,"props":190546,"children":190548},{"id":190547},"no-advertising-webhooks-today",[190549],{"type":23,"value":190550},"No Advertising Webhooks (Today)",{"type":17,"tag":29,"props":190552,"children":190553},{},[190554],{"type":23,"value":190555},"At present, advertising objects do not emit native or virtual webhooks.",{"type":17,"tag":29,"props":190557,"children":190558},{},[190559],{"type":23,"value":190560},"To detect changes:",{"type":17,"tag":80,"props":190562,"children":190563},{},[190564,190569,190580],{"type":17,"tag":84,"props":190565,"children":190566},{},[190567],{"type":23,"value":190568},"Poll list endpoints",{"type":17,"tag":84,"props":190570,"children":190571},{},[190572,190573,190578],{"type":23,"value":33722},{"type":17,"tag":6121,"props":190574,"children":190576},{"className":190575},[],[190577],{"type":23,"value":26291},{"type":23,"value":190579}," filters",{"type":17,"tag":84,"props":190581,"children":190582},{},[190583],{"type":23,"value":190584},"Refresh reports for recent date ranges",{"type":17,"tag":29,"props":190586,"children":190587},{},[190588],{"type":23,"value":190589},"This reflects the reality of ad platforms, where metrics update on provider-defined schedules.",{"type":17,"tag":239,"props":190591,"children":190593},{"id":190592},"reporting-latency",[190594],{"type":23,"value":190595},"Reporting Latency",{"type":17,"tag":29,"props":190597,"children":190598},{},[190599],{"type":23,"value":190600},"Even though Unified is real-time, advertising platforms update metrics asynchronously. Conversions and spend may be finalized hours or days later. Best practice is to periodically re-query historical windows.",{"type":17,"tag":68,"props":190602,"children":190604},{"id":190603},"identity-model-cross-category-relationships",[190605],{"type":23,"value":190606},"Identity Model & Cross-Category Relationships",{"type":17,"tag":29,"props":190608,"children":190609},{},[190610,190612,190617],{"type":23,"value":190611},"Advertising identity is ",{"type":17,"tag":48,"props":190613,"children":190614},{},[190615],{"type":23,"value":190616},"account-centric",{"type":23,"value":190618},", not person-centric.",{"type":17,"tag":80,"props":190620,"children":190621},{},[190622,190634,190643,190648,190653],{"type":17,"tag":84,"props":190623,"children":190624},{},[190625,190627,190632],{"type":23,"value":190626},"Every object references an ",{"type":17,"tag":6121,"props":190628,"children":190630},{"className":190629},[],[190631],{"type":23,"value":22399},{"type":23,"value":190633}," (ad account)",{"type":17,"tag":84,"props":190635,"children":190636},{},[190637,190638],{"type":23,"value":180343},{"type":17,"tag":48,"props":190639,"children":190640},{},[190641],{"type":23,"value":190642},"no CRM contact IDs",{"type":17,"tag":84,"props":190644,"children":190645},{},[190646],{"type":23,"value":190647},"No marketing list or member IDs",{"type":17,"tag":84,"props":190649,"children":190650},{},[190651],{"type":23,"value":190652},"No enrichment or form submission references",{"type":17,"tag":84,"props":190654,"children":190655},{},[190656],{"type":23,"value":190657},"No HR or ATS identifiers",{"type":17,"tag":29,"props":190659,"children":190660},{},[190661,190663,190668],{"type":23,"value":190662},"The only cross-category reference is ",{"type":17,"tag":6121,"props":190664,"children":190666},{"className":190665},[],[190667],{"type":23,"value":21080},{"type":23,"value":190669},", which links ads or creatives to Commerce items.",{"type":17,"tag":29,"props":190671,"children":190672},{},[190673],{"type":23,"value":190674},"Any reconciliation with CRM, Marketing, or Analytics data must be handled externally.",{"type":17,"tag":68,"props":190676,"children":190678},{"id":190677},"common-advertising-api-use-cases",[190679],{"type":23,"value":190680},"Common Advertising API Use Cases",{"type":17,"tag":239,"props":190682,"children":190684},{"id":190683},"cross-platform-reporting",[190685],{"type":23,"value":190686},"Cross-Platform Reporting",{"type":17,"tag":29,"props":190688,"children":190689},{},[190690],{"type":23,"value":190691},"Build dashboards that compare performance across Google, Meta, TikTok, LinkedIn, and Amazon without maintaining multiple integrations.",{"type":17,"tag":239,"props":190693,"children":190695},{"id":190694},"spend-monitoring-alerts",[190696],{"type":23,"value":190697},"Spend Monitoring & Alerts",{"type":17,"tag":29,"props":190699,"children":190700},{},[190701],{"type":23,"value":190702},"Track budget usage and pacing in near real time to flag anomalies or overspend risk.",{"type":17,"tag":239,"props":190704,"children":190706},{"id":190705},"agency-white-label-reporting",[190707],{"type":23,"value":190708},"Agency & White-Label Reporting",{"type":17,"tag":29,"props":190710,"children":190711},{},[190712],{"type":23,"value":190713},"Support multiple ad accounts per customer and deliver unified reports across platforms.",{"type":17,"tag":239,"props":190715,"children":190717},{"id":190716},"ai-driven-campaign-analysis",[190718],{"type":23,"value":190719},"AI-Driven Campaign Analysis",{"type":17,"tag":29,"props":190721,"children":190722},{},[190723],{"type":23,"value":190724},"Feed normalized performance data into AI models to identify trends, anomalies, and optimization opportunities.",{"type":17,"tag":239,"props":190726,"children":190728},{"id":190727},"data-warehousing-bi",[190729],{"type":23,"value":190730},"Data Warehousing & BI",{"type":17,"tag":29,"props":190732,"children":190733},{},[190734],{"type":23,"value":190735},"Export consistent ad performance data into warehouses for long-term analysis.",{"type":17,"tag":68,"props":190737,"children":190739},{"id":190738},"security-privacy-and-compliance",[190740],{"type":23,"value":190741},"Security, Privacy, and Compliance",{"type":17,"tag":239,"props":190743,"children":190744},{"id":17064},[190745],{"type":23,"value":53239},{"type":17,"tag":29,"props":190747,"children":190748},{},[190749],{"type":23,"value":190750},"Unified never stores advertising data. Requests are stateless and routed directly to the provider.",{"type":17,"tag":239,"props":190752,"children":190754},{"id":190753},"no-pii-exposure",[190755],{"type":23,"value":190756},"No PII Exposure",{"type":17,"tag":29,"props":190758,"children":190759},{},[190760],{"type":23,"value":190761},"Advertising objects do not include:",{"type":17,"tag":80,"props":190763,"children":190764},{},[190765,190769,190773,190778],{"type":17,"tag":84,"props":190766,"children":190767},{},[190768],{"type":23,"value":50735},{"type":17,"tag":84,"props":190770,"children":190771},{},[190772],{"type":23,"value":50740},{"type":17,"tag":84,"props":190774,"children":190775},{},[190776],{"type":23,"value":190777},"user identifiers",{"type":17,"tag":84,"props":190779,"children":190780},{},[190781],{"type":23,"value":190782},"cookie or device IDs",{"type":17,"tag":29,"props":190784,"children":190785},{},[190786,190788,190793],{"type":23,"value":190787},"However, they do expose ",{"type":17,"tag":48,"props":190789,"children":190790},{},[190791],{"type":23,"value":190792},"financial and strategic data",{"type":23,"value":190794}," such as budgets, bids, targeting, and creative content.",{"type":17,"tag":239,"props":190796,"children":190797},{"id":179409},[190798],{"type":23,"value":179412},{"type":17,"tag":29,"props":190800,"children":190801},{},[190802],{"type":23,"value":190803},"Unified maintains SOC 2 Type II and supports GDPR, CCPA/CPRA, HIPAA, and PIPEDA. Traffic is processed in regional environments (US / EU / AU).",{"type":17,"tag":68,"props":190805,"children":190807},{"id":190806},"known-constraints-provider-variability",[190808],{"type":23,"value":190809},"Known Constraints & Provider Variability",{"type":17,"tag":80,"props":190811,"children":190812},{},[190813,190818,190823,190828,190833],{"type":17,"tag":84,"props":190814,"children":190815},{},[190816],{"type":23,"value":190817},"Field support varies widely by platform",{"type":17,"tag":84,"props":190819,"children":190820},{},[190821],{"type":23,"value":190822},"Some providers restrict creative or budget edits",{"type":17,"tag":84,"props":190824,"children":190825},{},[190826],{"type":23,"value":190827},"Reports are batch snapshots, not event streams",{"type":17,"tag":84,"props":190829,"children":190830},{},[190831],{"type":23,"value":190832},"Metrics definitions differ across networks",{"type":17,"tag":84,"props":190834,"children":190835},{},[190836],{"type":23,"value":190837},"Targeting structures are provider-specific",{"type":17,"tag":29,"props":190839,"children":190840},{},[190841],{"type":23,"value":190842},"Applications should expect partial field support and validate required fields per provider.",{"type":17,"tag":68,"props":190844,"children":190846},{"id":190845},"build-vs-managing-individual-ad-apis",[190847],{"type":23,"value":190848},"Build vs Managing Individual Ad APIs",{"type":17,"tag":29,"props":190850,"children":190851},{},[190852],{"type":17,"tag":48,"props":190853,"children":190854},{},[190855],{"type":23,"value":190856},"Building direct integrations means:",{"type":17,"tag":80,"props":190858,"children":190859},{},[190860,190865,190869,190874],{"type":17,"tag":84,"props":190861,"children":190862},{},[190863],{"type":23,"value":190864},"Multiple OAuth flows",{"type":17,"tag":84,"props":190866,"children":190867},{},[190868],{"type":23,"value":174329},{"type":17,"tag":84,"props":190870,"children":190871},{},[190872],{"type":23,"value":190873},"Platform-specific reporting logic",{"type":17,"tag":84,"props":190875,"children":190876},{},[190877],{"type":23,"value":190878},"Constant API maintenance",{"type":17,"tag":29,"props":190880,"children":190881},{},[190882],{"type":17,"tag":48,"props":190883,"children":190884},{},[190885],{"type":23,"value":190886},"Using a unified Advertising API means:",{"type":17,"tag":80,"props":190888,"children":190889},{},[190890,190895,190900,190905],{"type":17,"tag":84,"props":190891,"children":190892},{},[190893],{"type":23,"value":190894},"One schema",{"type":17,"tag":84,"props":190896,"children":190897},{},[190898],{"type":23,"value":190899},"One auth model",{"type":17,"tag":84,"props":190901,"children":190902},{},[190903],{"type":23,"value":190904},"Consistent reporting access",{"type":17,"tag":84,"props":190906,"children":190907},{},[190908],{"type":23,"value":190909},"Faster time-to-market",{"type":17,"tag":68,"props":190911,"children":190913},{"id":190912},"get-started-with-unified-advertising-api",[190914],{"type":23,"value":190915},"Get Started with Unified Advertising API",{"type":17,"tag":29,"props":190917,"children":190918},{},[190919],{"type":23,"value":190920},"Start building paid-media integrations without maintaining multiple ad-platform APIs.",{"type":17,"tag":29,"props":190922,"children":190923},{},[190924,190925],{"type":23,"value":1609},{"type":17,"tag":133,"props":190926,"children":190928},{"href":1612,"rel":190927},[214],[190929],{"type":17,"tag":48,"props":190930,"children":190931},{},[190932],{"type":23,"value":1616},{"type":17,"tag":29,"props":190934,"children":190935},{},[190936,190937],{"type":23,"value":1609},{"type":17,"tag":133,"props":190938,"children":190940},{"href":1623,"rel":190939},[214],[190941],{"type":17,"tag":48,"props":190942,"children":190943},{},[190944],{"type":23,"value":1627},{"type":17,"tag":68,"props":190946,"children":190947},{"id":95759},[190948],{"type":23,"value":95762},{"type":17,"tag":29,"props":190950,"children":190951},{},[190952],{"type":17,"tag":48,"props":190953,"children":190954},{},[190955],{"type":23,"value":190956},"Is the Advertising API read-only or writable?",{"type":17,"tag":29,"props":190958,"children":190959},{},[190960],{"type":23,"value":190961},"Unified supports read and write operations where providers allow it. Field availability varies.",{"type":17,"tag":29,"props":190963,"children":190964},{},[190965],{"type":17,"tag":48,"props":190966,"children":190967},{},[190968],{"type":23,"value":190969},"Does the API store ad data?",{"type":17,"tag":29,"props":190971,"children":190972},{},[190973],{"type":23,"value":190974},"No. Unified is pass-through only.",{"type":17,"tag":29,"props":190976,"children":190977},{},[190978],{"type":17,"tag":48,"props":190979,"children":190980},{},[190981],{"type":23,"value":190982},"Can I trigger ads or campaigns automatically?",{"type":17,"tag":29,"props":190984,"children":190985},{},[190986],{"type":23,"value":190987},"You can create, update, pause, or resume supported objects, subject to provider rules.",{"type":17,"tag":29,"props":190989,"children":190990},{},[190991],{"type":17,"tag":48,"props":190992,"children":190993},{},[190994],{"type":23,"value":190995},"Does the API include attribution modeling?",{"type":17,"tag":29,"props":190997,"children":190998},{},[190999],{"type":23,"value":191000},"No. It provides performance metrics only.",{"type":17,"tag":29,"props":191002,"children":191003},{},[191004],{"type":17,"tag":48,"props":191005,"children":191006},{},[191007],{"type":23,"value":191008},"How fresh is the data?",{"type":17,"tag":29,"props":191010,"children":191011},{},[191012],{"type":23,"value":191013},"As fresh as the underlying ad platform allows.",{"title":7,"searchDepth":1629,"depth":1629,"links":191015},[191016,191017,191018,191023,191032,191037,191038,191045,191050,191051,191052,191053],{"id":190061,"depth":1629,"text":190064},{"id":40429,"depth":1629,"text":190091},{"id":190149,"depth":1629,"text":190152,"children":191019},[191020,191021,191022],{"id":190160,"depth":1635,"text":190163},{"id":190195,"depth":1635,"text":190198},{"id":190230,"depth":1635,"text":190233},{"id":190260,"depth":1629,"text":190263,"children":191024},[191025,191026,191027,191028,191029,191030,191031],{"id":190271,"depth":1635,"text":190274},{"id":190299,"depth":1635,"text":18610},{"id":190346,"depth":1635,"text":190349},{"id":190384,"depth":1635,"text":18636},{"id":190427,"depth":1635,"text":18641},{"id":190460,"depth":1635,"text":190463},{"id":190476,"depth":1635,"text":22191},{"id":190525,"depth":1629,"text":190528,"children":191033},[191034,191035,191036],{"id":190531,"depth":1635,"text":190534},{"id":190547,"depth":1635,"text":190550},{"id":190592,"depth":1635,"text":190595},{"id":190603,"depth":1629,"text":190606},{"id":190677,"depth":1629,"text":190680,"children":191039},[191040,191041,191042,191043,191044],{"id":190683,"depth":1635,"text":190686},{"id":190694,"depth":1635,"text":190697},{"id":190705,"depth":1635,"text":190708},{"id":190716,"depth":1635,"text":190719},{"id":190727,"depth":1635,"text":190730},{"id":190738,"depth":1629,"text":190741,"children":191046},[191047,191048,191049],{"id":17064,"depth":1635,"text":53239},{"id":190753,"depth":1635,"text":190756},{"id":179409,"depth":1635,"text":179412},{"id":190806,"depth":1629,"text":190809},{"id":190845,"depth":1629,"text":190848},{"id":190912,"depth":1629,"text":190915},{"id":95759,"depth":1629,"text":95762},"content:blog:advertising_api_integration_real_time_campaign_management_and_cross_platform_performance_data.md","blog/advertising_api_integration_real_time_campaign_management_and_cross_platform_performance_data.md","blog/advertising_api_integration_real_time_campaign_management_and_cross_platform_performance_data",{"_path":191058,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":191059,"description":191060,"img":191061,"date":191062,"tag":12,"body":191063,"_type":1677,"_id":192216,"_source":1679,"_file":192217,"_stem":192218,"_extension":1682},"/blog/enrichment_api_integration_real_time_person_and_company_data_without_owning_records","Enrichment API Integration: Real-Time Person and Company Data Without Owning Records","Enrichment tools help teams turn partial identifiers—an email address, a domain, a name—into richer context. Job titles, firmographics, social profiles, and...","https://s3.us-east-2.amazonaws.com/unified-article-images/enrichment_api_integration_real_time_person_and_company_data_without_owning_records-icon.png","2026-02-07T13:48:00.000Z",{"type":14,"children":191064,"toc":192180},[191065,191070,191073,191081,191086,191103,191109,191139,191144,191155,191159,191176,191180,191203,191213,191236,191241,191247,191252,191310,191322,191328,191334,191339,191357,191362,191368,191379,191402,191407,191413,191425,191430,191435,191439,191478,191485,191508,191520,191524,191529,191533,191560,191567,191587,191605,191611,191616,191634,191639,191645,191649,191654,191672,191677,191683,191695,191699,191717,191723,191728,191734,191750,191755,191761,191766,191789,191794,191812,191817,191835,191840,191846,191852,191857,191863,191868,191874,191879,191885,191890,191895,191901,191906,191934,191939,191945,191949,191966,191972,191995,192001,192040,192046,192057,192073,192078,192094,192099,192103,192111,192116,192123,192128,192136,192141,192149,192154,192162,192167,192175],{"type":17,"tag":18,"props":191066,"children":191068},{"id":191067},"enrichment-api-integration-real-time-person-and-company-data-without-owning-records",[191069],{"type":23,"value":191059},{"type":17,"tag":25,"props":191071,"children":191072},{},[],{"type":17,"tag":29,"props":191074,"children":191075},{},[191076],{"type":17,"tag":33,"props":191077,"children":191078},{},[191079],{"type":23,"value":191080},"February 7, 2026",{"type":17,"tag":29,"props":191082,"children":191083},{},[191084],{"type":23,"value":191085},"Enrichment tools help teams turn partial identifiers—an email address, a domain, a name—into richer context. Job titles, firmographics, social profiles, and company attributes make sales, marketing, and recruiting workflows more effective. The risk comes when enrichment is treated like a system of record or when identity is assumed instead of matched.",{"type":17,"tag":29,"props":191087,"children":191088},{},[191089,191094,191096,191101],{"type":17,"tag":133,"props":191090,"children":191091},{"href":49533},[191092],{"type":23,"value":191093},"Enrichment API",{"type":23,"value":191095}," integration exists to deliver ",{"type":17,"tag":48,"props":191097,"children":191098},{},[191099],{"type":23,"value":191100},"on-demand context",{"type":23,"value":191102},", not to create or synchronize records. In this guide, we'll explain what an Enrichment API does, how enrichment objects behave, how identity mapping works across categories, and how Unified's Enrichment API fits alongside CRM, Marketing, Forms, ATS, and HR.",{"type":17,"tag":68,"props":191104,"children":191106},{"id":191105},"introduction-to-enrichment-api-integrations",[191107],{"type":23,"value":191108},"Introduction to Enrichment API Integrations",{"type":17,"tag":29,"props":191110,"children":191111},{},[191112,191114,191119,191120,191125,191126,191131,191132,191137],{"type":23,"value":191113},"Data enrichment platforms such as ",{"type":17,"tag":48,"props":191115,"children":191116},{},[191117],{"type":23,"value":191118},"Clearbit",{"type":23,"value":11826},{"type":17,"tag":48,"props":191121,"children":191122},{},[191123],{"type":23,"value":191124},"Apollo.io",{"type":23,"value":11826},{"type":17,"tag":48,"props":191127,"children":191128},{},[191129],{"type":23,"value":191130},"Crunchbase",{"type":23,"value":11826},{"type":17,"tag":48,"props":191133,"children":191134},{},[191135],{"type":23,"value":191136},"FullContact",{"type":23,"value":191138},", and others specialize in returning additional information about people and companies based on limited input.",{"type":17,"tag":29,"props":191140,"children":191141},{},[191142],{"type":23,"value":191143},"Each provider exposes its own API, field coverage, and sourcing methods. Building and maintaining multiple enrichment integrations quickly becomes brittle—especially when teams assume enrichment data should be persisted or linked automatically.",{"type":17,"tag":29,"props":191145,"children":191146},{},[191147,191149,191153],{"type":23,"value":191148},"An Enrichment API provides a consistent way to ",{"type":17,"tag":48,"props":191150,"children":191151},{},[191152],{"type":23,"value":24038},{"type":23,"value":191154}," person and company data from multiple providers—without storing it, mutating upstream systems, or inventing identity.",{"type":17,"tag":68,"props":191156,"children":191157},{"id":49520},[191158],{"type":23,"value":49523},{"type":17,"tag":29,"props":191160,"children":191161},{},[191162,191163,191167,191169,191174],{"type":23,"value":40437},{"type":17,"tag":48,"props":191164,"children":191165},{},[191166],{"type":23,"value":191093},{"type":23,"value":191168}," performs ",{"type":17,"tag":48,"props":191170,"children":191171},{},[191172],{"type":23,"value":191173},"real-time lookups",{"type":23,"value":191175}," against third-party data providers and returns normalized results.",{"type":17,"tag":29,"props":191177,"children":191178},{},[191179],{"type":23,"value":33125},{"type":17,"tag":80,"props":191181,"children":191182},{},[191183,191188,191193,191198],{"type":17,"tag":84,"props":191184,"children":191185},{},[191186],{"type":23,"value":191187},"Enriching a person by email, name, or social profile",{"type":17,"tag":84,"props":191189,"children":191190},{},[191191],{"type":23,"value":191192},"Enriching a company by domain or name",{"type":17,"tag":84,"props":191194,"children":191195},{},[191196],{"type":23,"value":191197},"Filling in missing attributes for leads or prospects",{"type":17,"tag":84,"props":191199,"children":191200},{},[191201],{"type":23,"value":191202},"Reducing form fields by enriching partial input",{"type":17,"tag":29,"props":191204,"children":191205},{},[191206,191208,191212],{"type":23,"value":191207},"An Enrichment API does ",{"type":17,"tag":48,"props":191209,"children":191210},{},[191211],{"type":23,"value":159475},{"type":23,"value":20456},{"type":17,"tag":80,"props":191214,"children":191215},{},[191216,191221,191226,191231],{"type":17,"tag":84,"props":191217,"children":191218},{},[191219],{"type":23,"value":191220},"Create or update CRM records",{"type":17,"tag":84,"props":191222,"children":191223},{},[191224],{"type":23,"value":191225},"Manage marketing subscriptions",{"type":17,"tag":84,"props":191227,"children":191228},{},[191229],{"type":23,"value":191230},"Track candidates or employees",{"type":17,"tag":84,"props":191232,"children":191233},{},[191234],{"type":23,"value":191235},"Act as a database or system of record",{"type":17,"tag":29,"props":191237,"children":191238},{},[191239],{"type":23,"value":191240},"It is a retrieval layer, not a synchronization layer.",{"type":17,"tag":68,"props":191242,"children":191244},{"id":191243},"enrichment-vs-crm-marketing-forms-ats-and-hr",[191245],{"type":23,"value":191246},"Enrichment vs CRM, Marketing, Forms, ATS, and HR",{"type":17,"tag":29,"props":191248,"children":191249},{},[191250],{"type":23,"value":191251},"Unified treats Enrichment as a distinct category with clear boundaries.",{"type":17,"tag":80,"props":191253,"children":191254},{},[191255,191265,191274,191283,191292,191301],{"type":17,"tag":84,"props":191256,"children":191257},{},[191258,191263],{"type":17,"tag":48,"props":191259,"children":191260},{},[191261],{"type":23,"value":191262},"Enrichment",{"type":23,"value":191264}," returns supplemental attributes for people and companies.",{"type":17,"tag":84,"props":191266,"children":191267},{},[191268,191272],{"type":17,"tag":48,"props":191269,"children":191270},{},[191271],{"type":23,"value":25731},{"type":23,"value":191273}," owns contacts, companies, deals, and pipelines.",{"type":17,"tag":84,"props":191275,"children":191276},{},[191277,191281],{"type":17,"tag":48,"props":191278,"children":191279},{},[191280],{"type":23,"value":11718},{"type":23,"value":191282}," owns lists, subscribers, campaigns, and engagement.",{"type":17,"tag":84,"props":191284,"children":191285},{},[191286,191290],{"type":17,"tag":48,"props":191287,"children":191288},{},[191289],{"type":23,"value":114439},{"type":23,"value":191291}," collect user-submitted input.",{"type":17,"tag":84,"props":191293,"children":191294},{},[191295,191299],{"type":17,"tag":48,"props":191296,"children":191297},{},[191298],{"type":23,"value":11756},{"type":23,"value":191300}," owns candidates, applications, and hiring workflows.",{"type":17,"tag":84,"props":191302,"children":191303},{},[191304,191308],{"type":17,"tag":48,"props":191305,"children":191306},{},[191307],{"type":23,"value":101761},{"type":23,"value":191309}," owns employees and organizational structure.",{"type":17,"tag":29,"props":191311,"children":191312},{},[191313,191315,191320],{"type":23,"value":191314},"Enrichment data can ",{"type":17,"tag":48,"props":191316,"children":191317},{},[191318],{"type":23,"value":191319},"augment",{"type":23,"value":191321}," records in these systems, but it never replaces them. Any persistence or updates must be performed explicitly via the appropriate API.",{"type":17,"tag":68,"props":191323,"children":191325},{"id":191324},"real-time-lookups-not-events",[191326],{"type":23,"value":191327},"Real-Time Lookups, Not Events",{"type":17,"tag":239,"props":191329,"children":191331},{"id":191330},"how-enrichment-data-is-retrieved",[191332],{"type":23,"value":191333},"How Enrichment Data Is Retrieved",{"type":17,"tag":29,"props":191335,"children":191336},{},[191337],{"type":23,"value":191338},"Unified's Enrichment API executes synchronous lookups:",{"type":17,"tag":80,"props":191340,"children":191341},{},[191342,191347,191352],{"type":17,"tag":84,"props":191343,"children":191344},{},[191345],{"type":23,"value":191346},"Each request is routed directly to the selected provider",{"type":17,"tag":84,"props":191348,"children":191349},{},[191350],{"type":23,"value":191351},"There are no list endpoints, background jobs, or stored objects",{"type":17,"tag":84,"props":191353,"children":191354},{},[191355],{"type":23,"value":191356},"Results are returned immediately and are transient",{"type":17,"tag":29,"props":191358,"children":191359},{},[191360],{"type":23,"value":191361},"Because there is no caching or storage layer, the same lookup performed later may return different data if the provider has updated their records.",{"type":17,"tag":239,"props":191363,"children":191365},{"id":191364},"no-webhooks-or-event-streams",[191366],{"type":23,"value":191367},"No Webhooks or Event Streams",{"type":17,"tag":29,"props":191369,"children":191370},{},[191371,191373,191377],{"type":23,"value":191372},"Unlike CRM or Marketing categories, Enrichment does ",{"type":17,"tag":48,"props":191374,"children":191375},{},[191376],{"type":23,"value":159475},{"type":23,"value":191378}," emit events:",{"type":17,"tag":80,"props":191380,"children":191381},{},[191382,191392,191397],{"type":17,"tag":84,"props":191383,"children":191384},{},[191385,191387,191391],{"type":23,"value":191386},"There are no native or [virtual ",{"type":17,"tag":133,"props":191388,"children":191389},{"href":4999},[191390],{"type":23,"value":5002},{"type":23,"value":88175},{"type":17,"tag":84,"props":191393,"children":191394},{},[191395],{"type":23,"value":191396},"There is no change tracking or subscription model",{"type":17,"tag":84,"props":191398,"children":191399},{},[191400],{"type":23,"value":191401},"Freshness depends entirely on provider data at lookup time",{"type":17,"tag":29,"props":191403,"children":191404},{},[191405],{"type":23,"value":191406},"If you need to refresh enrichment, you call the endpoint again.",{"type":17,"tag":68,"props":191408,"children":191410},{"id":191409},"core-enrichment-data-models",[191411],{"type":23,"value":191412},"Core Enrichment Data Models",{"type":17,"tag":29,"props":191414,"children":191415},{},[191416,191418,191423],{"type":23,"value":191417},"Unified normalizes enrichment data ",{"type":17,"tag":48,"props":191419,"children":191420},{},[191421],{"type":23,"value":191422},"within the Enrichment category",{"type":23,"value":191424},". Objects are retrieve-only.",{"type":17,"tag":239,"props":191426,"children":191428},{"id":191427},"person",[191429],{"type":23,"value":50714},{"type":17,"tag":29,"props":191431,"children":191432},{},[191433],{"type":23,"value":191434},"A Person represents an individual returned by an enrichment provider.",{"type":17,"tag":29,"props":191436,"children":191437},{},[191438],{"type":23,"value":163963},{"type":17,"tag":80,"props":191440,"children":191441},{},[191442,191447,191452,191457,191462,191467],{"type":17,"tag":84,"props":191443,"children":191444},{},[191445],{"type":23,"value":191446},"Name and title",{"type":17,"tag":84,"props":191448,"children":191449},{},[191450],{"type":23,"value":191451},"Company name and domain",{"type":17,"tag":84,"props":191453,"children":191454},{},[191455],{"type":23,"value":191456},"Email addresses and phone numbers",{"type":17,"tag":84,"props":191458,"children":191459},{},[191460],{"type":23,"value":191461},"Social profiles (LinkedIn, Twitter, GitHub, Facebook)",{"type":17,"tag":84,"props":191463,"children":191464},{},[191465],{"type":23,"value":191466},"Location, timezone, and work history",{"type":17,"tag":84,"props":191468,"children":191469},{},[191470,191472,191477],{"type":23,"value":191471},"Provider-specific attributes (via ",{"type":17,"tag":6121,"props":191473,"children":191475},{"className":191474},[],[191476],{"type":23,"value":62389},{"type":23,"value":12034},{"type":17,"tag":29,"props":191479,"children":191480},{},[191481],{"type":17,"tag":48,"props":191482,"children":191483},{},[191484],{"type":23,"value":20022},{"type":17,"tag":80,"props":191486,"children":191487},{},[191488,191493,191498,191503],{"type":17,"tag":84,"props":191489,"children":191490},{},[191491],{"type":23,"value":191492},"Retrieve-only",{"type":17,"tag":84,"props":191494,"children":191495},{},[191496],{"type":23,"value":191497},"Returned on demand",{"type":17,"tag":84,"props":191499,"children":191500},{},[191501],{"type":23,"value":191502},"Not persisted",{"type":17,"tag":84,"props":191504,"children":191505},{},[191506],{"type":23,"value":191507},"No create, update, delete, or list operations",{"type":17,"tag":29,"props":191509,"children":191510},{},[191511,191513,191518],{"type":23,"value":191512},"Provider coverage varies. Some providers return extensive social data; others return limited attributes. Certain attributes are marked as ",{"type":17,"tag":48,"props":191514,"children":191515},{},[191516],{"type":23,"value":191517},"slow fields",{"type":23,"value":191519}," and require explicit opt-in to avoid added latency.",{"type":17,"tag":239,"props":191521,"children":191522},{"id":62420},[191523],{"type":23,"value":25846},{"type":17,"tag":29,"props":191525,"children":191526},{},[191527],{"type":23,"value":191528},"A Company represents a business entity returned by an enrichment provider.",{"type":17,"tag":29,"props":191530,"children":191531},{},[191532],{"type":23,"value":163963},{"type":17,"tag":80,"props":191534,"children":191535},{},[191536,191540,191545,191550,191555],{"type":17,"tag":84,"props":191537,"children":191538},{},[191539],{"type":23,"value":191451},{"type":17,"tag":84,"props":191541,"children":191542},{},[191543],{"type":23,"value":191544},"Firmographics (employees, revenue, industry)",{"type":17,"tag":84,"props":191546,"children":191547},{},[191548],{"type":23,"value":191549},"Addresses and phone numbers",{"type":17,"tag":84,"props":191551,"children":191552},{},[191553],{"type":23,"value":191554},"Social and reference links (LinkedIn, Crunchbase, etc.)",{"type":17,"tag":84,"props":191556,"children":191557},{},[191558],{"type":23,"value":191559},"Market attributes (year founded, exchange, stock)",{"type":17,"tag":29,"props":191561,"children":191562},{},[191563],{"type":17,"tag":48,"props":191564,"children":191565},{},[191566],{"type":23,"value":20022},{"type":17,"tag":80,"props":191568,"children":191569},{},[191570,191574,191578,191582],{"type":17,"tag":84,"props":191571,"children":191572},{},[191573],{"type":23,"value":191492},{"type":17,"tag":84,"props":191575,"children":191576},{},[191577],{"type":23,"value":191497},{"type":17,"tag":84,"props":191579,"children":191580},{},[191581],{"type":23,"value":191502},{"type":17,"tag":84,"props":191583,"children":191584},{},[191585],{"type":23,"value":191586},"Field availability varies by provider",{"type":17,"tag":29,"props":191588,"children":191589},{},[191590,191592,191597,191598,191603],{"type":23,"value":191591},"As with Person enrichment, timestamps such as ",{"type":17,"tag":6121,"props":191593,"children":191595},{"className":191594},[],[191596],{"type":23,"value":33446},{"type":23,"value":34435},{"type":17,"tag":6121,"props":191599,"children":191601},{"className":191600},[],[191602],{"type":23,"value":25337},{"type":23,"value":191604},"—when present—reflect provider data, not Unified state.",{"type":17,"tag":239,"props":191606,"children":191608},{"id":191607},"matching-is-application-level",[191609],{"type":23,"value":191610},"Matching Is Application-Level",{"type":17,"tag":29,"props":191612,"children":191613},{},[191614],{"type":23,"value":191615},"To apply enrichment data:",{"type":17,"tag":80,"props":191617,"children":191618},{},[191619,191624,191629],{"type":17,"tag":84,"props":191620,"children":191621},{},[191622],{"type":23,"value":191623},"Match on email address, name, or domain",{"type":17,"tag":84,"props":191625,"children":191626},{},[191627],{"type":23,"value":191628},"Decide where enriched fields should live",{"type":17,"tag":84,"props":191630,"children":191631},{},[191632],{"type":23,"value":191633},"Write updates using CRM, Marketing, ATS, or HR APIs as appropriate",{"type":17,"tag":29,"props":191635,"children":191636},{},[191637],{"type":23,"value":191638},"Unified does not infer identity or perform cross-category linking.",{"type":17,"tag":68,"props":191640,"children":191642},{"id":191641},"performance-and-field-selection",[191643],{"type":23,"value":191644},"Performance and Field Selection",{"type":17,"tag":239,"props":191646,"children":191647},{"id":144224},[191648],{"type":23,"value":144227},{"type":17,"tag":29,"props":191650,"children":191651},{},[191652],{"type":23,"value":191653},"Enrichment providers differ widely in:",{"type":17,"tag":80,"props":191655,"children":191656},{},[191657,191662,191667],{"type":17,"tag":84,"props":191658,"children":191659},{},[191660],{"type":23,"value":191661},"Which fields they return",{"type":17,"tag":84,"props":191663,"children":191664},{},[191665],{"type":23,"value":191666},"Which identifiers they support",{"type":17,"tag":84,"props":191668,"children":191669},{},[191670],{"type":23,"value":191671},"How frequently they update records",{"type":17,"tag":29,"props":191673,"children":191674},{},[191675],{"type":23,"value":191676},"Unified exposes a normalized schema but does not guarantee field presence.",{"type":17,"tag":239,"props":191678,"children":191680},{"id":191679},"slow-fields",[191681],{"type":23,"value":191682},"Slow Fields",{"type":17,"tag":29,"props":191684,"children":191685},{},[191686,191688,191693],{"type":23,"value":191687},"Some attributes require additional upstream calls and increase response time. These fields are excluded by default and must be explicitly requested using the ",{"type":17,"tag":6121,"props":191689,"children":191691},{"className":191690},[],[191692],{"type":23,"value":39759},{"type":23,"value":191694}," parameter or enabled at the workspace level.",{"type":17,"tag":29,"props":191696,"children":191697},{},[191698],{"type":23,"value":154270},{"type":17,"tag":80,"props":191700,"children":191701},{},[191702,191707,191712],{"type":17,"tag":84,"props":191703,"children":191704},{},[191705],{"type":23,"value":191706},"Request only the fields you need",{"type":17,"tag":84,"props":191708,"children":191709},{},[191710],{"type":23,"value":191711},"Avoid slow fields in latency-sensitive paths",{"type":17,"tag":84,"props":191713,"children":191714},{},[191715],{"type":23,"value":191716},"Treat enrichment as contextual, not blocking",{"type":17,"tag":68,"props":191718,"children":191720},{"id":191719},"security-privacy-and-compliance-considerations",[191721],{"type":23,"value":191722},"Security, Privacy, and Compliance Considerations",{"type":17,"tag":29,"props":191724,"children":191725},{},[191726],{"type":23,"value":191727},"Enrichment data is often sensitive by nature.",{"type":17,"tag":239,"props":191729,"children":191731},{"id":191730},"zero-storage-pass-through-design",[191732],{"type":23,"value":191733},"Zero-Storage, Pass-Through Design",{"type":17,"tag":80,"props":191735,"children":191736},{},[191737,191742,191746],{"type":17,"tag":84,"props":191738,"children":191739},{},[191740],{"type":23,"value":191741},"Enrichment responses are not stored or cached",{"type":17,"tag":84,"props":191743,"children":191744},{},[191745],{"type":23,"value":187059},{"type":17,"tag":84,"props":191747,"children":191748},{},[191749],{"type":23,"value":180516},{"type":17,"tag":29,"props":191751,"children":191752},{},[191753],{"type":23,"value":191754},"If enriched data needs to be retained, it must be stored by your application.",{"type":17,"tag":239,"props":191756,"children":191758},{"id":191757},"pii-and-lawful-use",[191759],{"type":23,"value":191760},"PII and Lawful Use",{"type":17,"tag":29,"props":191762,"children":191763},{},[191764],{"type":23,"value":191765},"Enrichment responses may include:",{"type":17,"tag":80,"props":191767,"children":191768},{},[191769,191774,191779,191784],{"type":17,"tag":84,"props":191770,"children":191771},{},[191772],{"type":23,"value":191773},"Emails and phone numbers",{"type":17,"tag":84,"props":191775,"children":191776},{},[191777],{"type":23,"value":191778},"Social profiles",{"type":17,"tag":84,"props":191780,"children":191781},{},[191782],{"type":23,"value":191783},"Demographic attributes",{"type":17,"tag":84,"props":191785,"children":191786},{},[191787],{"type":23,"value":191788},"Work histories",{"type":17,"tag":29,"props":191790,"children":191791},{},[191792],{"type":23,"value":191793},"Unified passes through provider data but does not:",{"type":17,"tag":80,"props":191795,"children":191796},{},[191797,191802,191807],{"type":17,"tag":84,"props":191798,"children":191799},{},[191800],{"type":23,"value":191801},"Verify data provenance",{"type":17,"tag":84,"props":191803,"children":191804},{},[191805],{"type":23,"value":191806},"Enforce consent for looked-up individuals",{"type":17,"tag":84,"props":191808,"children":191809},{},[191810],{"type":23,"value":191811},"Manage opt-out across enrichment providers",{"type":17,"tag":29,"props":191813,"children":191814},{},[191815],{"type":23,"value":191816},"Developers are responsible for:",{"type":17,"tag":80,"props":191818,"children":191819},{},[191820,191825,191830],{"type":17,"tag":84,"props":191821,"children":191822},{},[191823],{"type":23,"value":191824},"Determining lawful basis",{"type":17,"tag":84,"props":191826,"children":191827},{},[191828],{"type":23,"value":191829},"Minimizing data use",{"type":17,"tag":84,"props":191831,"children":191832},{},[191833],{"type":23,"value":191834},"Avoiding misuse or profiling in regulated contexts",{"type":17,"tag":29,"props":191836,"children":191837},{},[191838],{"type":23,"value":191839},"For AI use cases, MCP-based flows can remove sensitive fields before data reaches downstream systems.",{"type":17,"tag":68,"props":191841,"children":191843},{"id":191842},"common-enrichment-api-integration-patterns",[191844],{"type":23,"value":191845},"Common Enrichment API Integration Patterns",{"type":17,"tag":239,"props":191847,"children":191849},{"id":191848},"lead-and-prospect-enrichment",[191850],{"type":23,"value":191851},"Lead and Prospect Enrichment",{"type":17,"tag":29,"props":191853,"children":191854},{},[191855],{"type":23,"value":191856},"Turn an email address into a richer profile before CRM import.",{"type":17,"tag":239,"props":191858,"children":191860},{"id":191859},"crm-data-enhancement",[191861],{"type":23,"value":191862},"CRM Data Enhancement",{"type":17,"tag":29,"props":191864,"children":191865},{},[191866],{"type":23,"value":191867},"Fill missing firmographic or role data on existing records.",{"type":17,"tag":239,"props":191869,"children":191871},{"id":191870},"marketing-personalization",[191872],{"type":23,"value":191873},"Marketing Personalization",{"type":17,"tag":29,"props":191875,"children":191876},{},[191877],{"type":23,"value":191878},"Use enriched attributes to improve segmentation and messaging.",{"type":17,"tag":239,"props":191880,"children":191882},{"id":191881},"form-simplification",[191883],{"type":23,"value":191884},"Form Simplification",{"type":17,"tag":29,"props":191886,"children":191887},{},[191888],{"type":23,"value":191889},"Capture minimal input and enrich it server-side.",{"type":17,"tag":29,"props":191891,"children":191892},{},[191893],{"type":23,"value":191894},"Each pattern relies on explicit matching and controlled write-back.",{"type":17,"tag":68,"props":191896,"children":191898},{"id":191897},"limitations-to-plan-for",[191899],{"type":23,"value":191900},"Limitations to Plan For",{"type":17,"tag":29,"props":191902,"children":191903},{},[191904],{"type":23,"value":191905},"Unified is explicit about what Enrichment does not provide:",{"type":17,"tag":80,"props":191907,"children":191908},{},[191909,191914,191919,191924,191929],{"type":17,"tag":84,"props":191910,"children":191911},{},[191912],{"type":23,"value":191913},"No bulk or batch enrichment endpoints",{"type":17,"tag":84,"props":191915,"children":191916},{},[191917],{"type":23,"value":191918},"No event notifications",{"type":17,"tag":84,"props":191920,"children":191921},{},[191922],{"type":23,"value":191923},"No persistence or deduplication",{"type":17,"tag":84,"props":191925,"children":191926},{},[191927],{"type":23,"value":191928},"No automatic CRM or Marketing updates",{"type":17,"tag":84,"props":191930,"children":191931},{},[191932],{"type":23,"value":191933},"No consent enforcement for third-party data subjects",{"type":17,"tag":29,"props":191935,"children":191936},{},[191937],{"type":23,"value":191938},"These constraints reflect provider reality and reduce risk.",{"type":17,"tag":68,"props":191940,"children":191942},{"id":191941},"build-vs-buy-enrichment-integrations",[191943],{"type":23,"value":191944},"Build vs Buy Enrichment Integrations",{"type":17,"tag":239,"props":191946,"children":191947},{"id":165021},[191948],{"type":23,"value":165024},{"type":17,"tag":80,"props":191950,"children":191951},{},[191952,191956,191961],{"type":17,"tag":84,"props":191953,"children":191954},{},[191955],{"type":23,"value":185075},{"type":17,"tag":84,"props":191957,"children":191958},{},[191959],{"type":23,"value":191960},"Different schemas and auth flows",{"type":17,"tag":84,"props":191962,"children":191963},{},[191964],{"type":23,"value":191965},"Ongoing maintenance as providers change",{"type":17,"tag":239,"props":191967,"children":191969},{"id":191968},"using-a-unified-enrichment-api",[191970],{"type":23,"value":191971},"Using a Unified Enrichment API",{"type":17,"tag":80,"props":191973,"children":191974},{},[191975,191980,191985,191990],{"type":17,"tag":84,"props":191976,"children":191977},{},[191978],{"type":23,"value":191979},"One retrieval interface across providers",{"type":17,"tag":84,"props":191981,"children":191982},{},[191983],{"type":23,"value":191984},"Normalized person and company objects",{"type":17,"tag":84,"props":191986,"children":191987},{},[191988],{"type":23,"value":191989},"No storage or sync complexity",{"type":17,"tag":84,"props":191991,"children":191992},{},[191993],{"type":23,"value":191994},"Usage-based pricing aligned with calls",{"type":17,"tag":68,"props":191996,"children":191998},{"id":191997},"best-practices-for-enrichment-apis",[191999],{"type":23,"value":192000},"Best Practices for Enrichment APIs",{"type":17,"tag":80,"props":192002,"children":192003},{},[192004,192015,192020,192025,192030,192035],{"type":17,"tag":84,"props":192005,"children":192006},{},[192007,192009,192013],{"type":23,"value":192008},"Treat enrichment as ",{"type":17,"tag":48,"props":192010,"children":192011},{},[192012],{"type":23,"value":100888},{"type":23,"value":192014},", not truth",{"type":17,"tag":84,"props":192016,"children":192017},{},[192018],{"type":23,"value":192019},"Match identities explicitly",{"type":17,"tag":84,"props":192021,"children":192022},{},[192023],{"type":23,"value":192024},"Request minimal fields",{"type":17,"tag":84,"props":192026,"children":192027},{},[192028],{"type":23,"value":192029},"Re-run enrichment when source records change",{"type":17,"tag":84,"props":192031,"children":192032},{},[192033],{"type":23,"value":192034},"Avoid persisting sensitive data unnecessarily",{"type":17,"tag":84,"props":192036,"children":192037},{},[192038],{"type":23,"value":192039},"Keep enrichment separate from system-of-record updates",{"type":17,"tag":68,"props":192041,"children":192043},{"id":192042},"use-enrichment-without-creating-data-debt",[192044],{"type":23,"value":192045},"Use enrichment without creating data debt",{"type":17,"tag":29,"props":192047,"children":192048},{},[192049,192051,192055],{"type":23,"value":192050},"If your product needs better context about people and companies—but can't afford to treat enrichment as a database—Unified's ",{"type":17,"tag":48,"props":192052,"children":192053},{},[192054],{"type":23,"value":191093},{"type":23,"value":192056}," provides real-time, normalized lookups across providers with clear boundaries.",{"type":17,"tag":29,"props":192058,"children":192059},{},[192060,192064,192065],{"type":17,"tag":48,"props":192061,"children":192062},{},[192063],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":192066,"children":192068},{"href":1612,"rel":192067},[214],[192069],{"type":17,"tag":48,"props":192070,"children":192071},{},[192072],{"type":23,"value":1616},{"type":17,"tag":29,"props":192074,"children":192075},{},[192076],{"type":23,"value":192077},"Test enrichment lookups with live provider data.",{"type":17,"tag":29,"props":192079,"children":192080},{},[192081,192085,192086],{"type":17,"tag":48,"props":192082,"children":192083},{},[192084],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":192087,"children":192089},{"href":1623,"rel":192088},[214],[192090],{"type":17,"tag":48,"props":192091,"children":192092},{},[192093],{"type":23,"value":1627},{"type":17,"tag":29,"props":192095,"children":192096},{},[192097],{"type":23,"value":192098},"Discuss enrichment, CRM augmentation, or cross-category workflows with the team.",{"type":17,"tag":68,"props":192100,"children":192101},{"id":95759},[192102],{"type":23,"value":95762},{"type":17,"tag":29,"props":192104,"children":192105},{},[192106],{"type":17,"tag":48,"props":192107,"children":192108},{},[192109],{"type":23,"value":192110},"What is an Enrichment API?",{"type":17,"tag":29,"props":192112,"children":192113},{},[192114],{"type":23,"value":192115},"An API that retrieves supplemental person and company data from external providers on demand.",{"type":17,"tag":29,"props":192117,"children":192118},{},[192119],{"type":17,"tag":48,"props":192120,"children":192121},{},[192122],{"type":23,"value":171430},{"type":17,"tag":29,"props":192124,"children":192125},{},[192126],{"type":23,"value":192127},"Unified supports 25+ enrichment providers including Clearbit, Apollo.io, Crunchbase, FullContact, ZoomInfo, and others.",{"type":17,"tag":29,"props":192129,"children":192130},{},[192131],{"type":17,"tag":48,"props":192132,"children":192133},{},[192134],{"type":23,"value":192135},"Does enrichment update my CRM automatically?",{"type":17,"tag":29,"props":192137,"children":192138},{},[192139],{"type":23,"value":192140},"No. Enrichment is retrieve-only. You must write updates using the CRM API.",{"type":17,"tag":29,"props":192142,"children":192143},{},[192144],{"type":17,"tag":48,"props":192145,"children":192146},{},[192147],{"type":23,"value":192148},"Is enrichment data real time?",{"type":17,"tag":29,"props":192150,"children":192151},{},[192152],{"type":23,"value":192153},"Each call fetches live data from the provider. There are no cached results or events.",{"type":17,"tag":29,"props":192155,"children":192156},{},[192157],{"type":17,"tag":48,"props":192158,"children":192159},{},[192160],{"type":23,"value":192161},"Are there webhooks for enrichment?",{"type":17,"tag":29,"props":192163,"children":192164},{},[192165],{"type":23,"value":192166},"No. Enrichment uses synchronous lookups only.",{"type":17,"tag":29,"props":192168,"children":192169},{},[192170],{"type":17,"tag":48,"props":192171,"children":192172},{},[192173],{"type":23,"value":192174},"Does Unified store enrichment data?",{"type":17,"tag":29,"props":192176,"children":192177},{},[192178],{"type":23,"value":192179},"No. Enrichment responses are not stored at rest.",{"title":7,"searchDepth":1629,"depth":1629,"links":192181},[192182,192183,192184,192185,192189,192194,192198,192202,192208,192209,192213,192214,192215],{"id":191105,"depth":1629,"text":191108},{"id":49520,"depth":1629,"text":49523},{"id":191243,"depth":1629,"text":191246},{"id":191324,"depth":1629,"text":191327,"children":192186},[192187,192188],{"id":191330,"depth":1635,"text":191333},{"id":191364,"depth":1635,"text":191367},{"id":191409,"depth":1629,"text":191412,"children":192190},[192191,192192,192193],{"id":191427,"depth":1635,"text":50714},{"id":62420,"depth":1635,"text":25846},{"id":191607,"depth":1635,"text":191610},{"id":191641,"depth":1629,"text":191644,"children":192195},[192196,192197],{"id":144224,"depth":1635,"text":144227},{"id":191679,"depth":1635,"text":191682},{"id":191719,"depth":1629,"text":191722,"children":192199},[192200,192201],{"id":191730,"depth":1635,"text":191733},{"id":191757,"depth":1635,"text":191760},{"id":191842,"depth":1629,"text":191845,"children":192203},[192204,192205,192206,192207],{"id":191848,"depth":1635,"text":191851},{"id":191859,"depth":1635,"text":191862},{"id":191870,"depth":1635,"text":191873},{"id":191881,"depth":1635,"text":191884},{"id":191897,"depth":1629,"text":191900},{"id":191941,"depth":1629,"text":191944,"children":192210},[192211,192212],{"id":165021,"depth":1635,"text":165024},{"id":191968,"depth":1635,"text":191971},{"id":191997,"depth":1629,"text":192000},{"id":192042,"depth":1629,"text":192045},{"id":95759,"depth":1629,"text":95762},"content:blog:enrichment_api_integration_real_time_person_and_company_data_without_owning_records.md","blog/enrichment_api_integration_real_time_person_and_company_data_without_owning_records.md","blog/enrichment_api_integration_real_time_person_and_company_data_without_owning_records",{"_path":192220,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":192221,"description":192222,"img":192223,"date":192224,"tag":12,"body":192225,"_type":1677,"_id":193356,"_source":1679,"_file":193357,"_stem":193358,"_extension":1682},"/blog/marketing_api_integration_campaign_execution_audiences_and_engagement_data_across_platforms","Marketing API Integration: Campaign Execution, Audiences, and Engagement Data Across Platforms","Marketing systems sit at the intersection of customer communication, growth, and compliance. Lists change constantly, subscribers opt in and out, campaigns...","https://s3.us-east-2.amazonaws.com/unified-article-images/marketing_api_integration_campaign_execution_audiences_and_engagement_data_across_platforms-icon.png","2026-02-07T13:22:00.000Z",{"type":14,"children":192226,"toc":193318},[192227,192232,192235,192242,192247,192256,192262,192309,192314,192337,192342,192346,192356,192360,192383,192395,192401,192406,192455,192460,192466,192471,192475,192485,192489,192494,192512,192537,192543,192555,192560,192565,192590,192595,192601,192606,192624,192636,192647,192651,192656,192707,192712,192737,192742,192746,192751,192773,192778,192784,192789,192822,192827,192833,192839,192857,192861,192866,192890,192895,192899,192904,192908,192930,192934,192938,192956,192960,192978,192983,192989,192995,193000,193006,193011,193017,193022,193028,193033,193037,193042,193069,193074,193080,193084,193105,193111,193135,193141,193174,193180,193185,193195,193211,193216,193232,193237,193241,193249,193254,193261,193266,193274,193279,193287,193292,193300,193305,193313],{"type":17,"tag":18,"props":192228,"children":192230},{"id":192229},"marketing-api-integration-campaign-execution-audiences-and-engagement-data-across-platforms",[192231],{"type":23,"value":192221},{"type":17,"tag":25,"props":192233,"children":192234},{},[],{"type":17,"tag":29,"props":192236,"children":192237},{},[192238],{"type":17,"tag":33,"props":192239,"children":192240},{},[192241],{"type":23,"value":191080},{"type":17,"tag":29,"props":192243,"children":192244},{},[192245],{"type":23,"value":192246},"Marketing systems sit at the intersection of customer communication, growth, and compliance. Lists change constantly, subscribers opt in and out, campaigns move from draft to send, and engagement metrics update over time. When marketing data is fragmented across tools—or pulled via brittle sync jobs—analytics drift, personalization breaks, and compliance risk increases.",{"type":17,"tag":29,"props":192248,"children":192249},{},[192250,192254],{"type":17,"tag":133,"props":192251,"children":192252},{"href":106471},[192253],{"type":23,"value":106474},{"type":23,"value":192255}," integration exists to solve this problem. In this guide, we'll explain what a Marketing API actually does, which objects matter in practice, how campaign and reporting lifecycles work, how real-time updates are delivered, and how Unified's Marketing API fits alongside CRM, Advertising, Forms, and Enrichment within the Sales & Marketing group.",{"type":17,"tag":68,"props":192257,"children":192259},{"id":192258},"introduction-to-marketing-api-integrations",[192260],{"type":23,"value":192261},"Introduction to Marketing API Integrations",{"type":17,"tag":29,"props":192263,"children":192264},{},[192265,192267,192272,192273,192277,192278,192283,192284,192289,192290,192295,192296,192301,192302,192307],{"type":23,"value":192266},"Marketing automation platforms such as ",{"type":17,"tag":48,"props":192268,"children":192269},{},[192270],{"type":23,"value":192271},"Mailchimp",{"type":23,"value":11826},{"type":17,"tag":48,"props":192274,"children":192275},{},[192276],{"type":23,"value":3184},{"type":23,"value":11826},{"type":17,"tag":48,"props":192279,"children":192280},{},[192281],{"type":23,"value":192282},"ActiveCampaign",{"type":23,"value":11826},{"type":17,"tag":48,"props":192285,"children":192286},{},[192287],{"type":23,"value":192288},"Klaviyo",{"type":23,"value":11826},{"type":17,"tag":48,"props":192291,"children":192292},{},[192293],{"type":23,"value":192294},"Customer.io",{"type":23,"value":11826},{"type":17,"tag":48,"props":192297,"children":192298},{},[192299],{"type":23,"value":192300},"Salesforce Marketing Cloud",{"type":23,"value":12561},{"type":17,"tag":48,"props":192303,"children":192304},{},[192305],{"type":23,"value":192306},"SendGrid",{"type":23,"value":192308}," are used to run outbound campaigns and manage audience engagement.",{"type":17,"tag":29,"props":192310,"children":192311},{},[192312],{"type":23,"value":192313},"Each platform exposes its own API conventions, authentication models, and data structures. Products that need to support multiple marketing tools often run into:",{"type":17,"tag":80,"props":192315,"children":192316},{},[192317,192322,192327,192332],{"type":17,"tag":84,"props":192318,"children":192319},{},[192320],{"type":23,"value":192321},"Inconsistent list and subscriber models",{"type":17,"tag":84,"props":192323,"children":192324},{},[192325],{"type":23,"value":192326},"Different campaign lifecycles and scheduling rules",{"type":17,"tag":84,"props":192328,"children":192329},{},[192330],{"type":23,"value":192331},"Provider-specific reporting formats",{"type":17,"tag":84,"props":192333,"children":192334},{},[192335],{"type":23,"value":192336},"Uneven support for real-time updates",{"type":17,"tag":29,"props":192338,"children":192339},{},[192340],{"type":23,"value":192341},"A Marketing API provides a consistent way to read and write campaign data across platforms—without building and maintaining separate integrations for each provider.",{"type":17,"tag":68,"props":192343,"children":192344},{"id":51039},[192345],{"type":23,"value":51042},{"type":17,"tag":29,"props":192347,"children":192348},{},[192349,192350,192354],{"type":23,"value":9619},{"type":17,"tag":48,"props":192351,"children":192352},{},[192353],{"type":23,"value":106474},{"type":23,"value":192355}," allows applications to programmatically access and manage marketing-campaign data.",{"type":17,"tag":29,"props":192357,"children":192358},{},[192359],{"type":23,"value":167214},{"type":17,"tag":80,"props":192361,"children":192362},{},[192363,192368,192373,192378],{"type":17,"tag":84,"props":192364,"children":192365},{},[192366],{"type":23,"value":192367},"Creating and managing marketing lists or audiences",{"type":17,"tag":84,"props":192369,"children":192370},{},[192371],{"type":23,"value":192372},"Adding or removing subscribers",{"type":17,"tag":84,"props":192374,"children":192375},{},[192376],{"type":23,"value":192377},"Creating, scheduling, and updating campaigns",{"type":17,"tag":84,"props":192379,"children":192380},{},[192381],{"type":23,"value":192382},"Retrieving aggregated engagement metrics such as sends, opens, clicks, bounces, and unsubscribes",{"type":17,"tag":29,"props":192384,"children":192385},{},[192386,192388,192393],{"type":23,"value":192387},"Marketing APIs focus on ",{"type":17,"tag":48,"props":192389,"children":192390},{},[192391],{"type":23,"value":192392},"campaign execution and engagement",{"type":23,"value":192394},". They are not systems of record for sales pipelines, advertising spend, form submissions, or enriched customer profiles.",{"type":17,"tag":68,"props":192396,"children":192398},{"id":192397},"marketing-api-vs-crm-advertising-forms-and-enrichment",[192399],{"type":23,"value":192400},"Marketing API vs CRM, Advertising, Forms, and Enrichment",{"type":17,"tag":29,"props":192402,"children":192403},{},[192404],{"type":23,"value":192405},"Unified treats Marketing as one category within a broader Sales & Marketing surface, with clear boundaries.",{"type":17,"tag":80,"props":192407,"children":192408},{},[192409,192418,192427,192437,192446],{"type":17,"tag":84,"props":192410,"children":192411},{},[192412,192416],{"type":17,"tag":48,"props":192413,"children":192414},{},[192415],{"type":23,"value":180070},{"type":23,"value":192417}," manage lists, subscribers, campaigns, and engagement metrics.",{"type":17,"tag":84,"props":192419,"children":192420},{},[192421,192425],{"type":17,"tag":48,"props":192422,"children":192423},{},[192424],{"type":23,"value":173018},{"type":23,"value":192426}," manage sales relationships: contacts, companies, deals, pipelines, and activities.",{"type":17,"tag":84,"props":192428,"children":192429},{},[192430,192435],{"type":17,"tag":48,"props":192431,"children":192432},{},[192433],{"type":23,"value":192434},"Advertising APIs",{"type":23,"value":192436}," manage paid media: ads, budgets, impressions, and performance metrics.",{"type":17,"tag":84,"props":192438,"children":192439},{},[192440,192444],{"type":17,"tag":48,"props":192441,"children":192442},{},[192443],{"type":23,"value":188999},{"type":23,"value":192445}," manage form templates and submission capture.",{"type":17,"tag":84,"props":192447,"children":192448},{},[192449,192453],{"type":17,"tag":48,"props":192450,"children":192451},{},[192452],{"type":23,"value":189026},{"type":23,"value":192454}," append firmographic or demographic data to people and companies.",{"type":17,"tag":29,"props":192456,"children":192457},{},[192458],{"type":23,"value":192459},"Marketing data may feed into CRM or analytics systems, but Marketing is not the source of truth for customers, leads, or revenue. Any movement of data between Marketing and other categories is handled explicitly by the application.",{"type":17,"tag":68,"props":192461,"children":192463},{"id":192462},"real-time-vs-batch-marketing-data",[192464],{"type":23,"value":192465},"Real-Time vs Batch Marketing Data",{"type":17,"tag":29,"props":192467,"children":192468},{},[192469],{"type":23,"value":192470},"Marketing platforms update data at different speeds. Some changes happen immediately (list edits, campaign status changes), while others lag (open and click metrics).",{"type":17,"tag":239,"props":192472,"children":192473},{"id":163879},[192474],{"type":23,"value":163882},{"type":17,"tag":29,"props":192476,"children":192477},{},[192478,192480,192484],{"type":23,"value":192479},"Unified's Marketing API routes each request directly to the connected marketing platform. There is no cached replica or background synchronization layer. Reads reflect the current state of the source system, subject to provider ",{"type":17,"tag":133,"props":192481,"children":192482},{"href":135},[192483],{"type":23,"value":138},{"type":23,"value":171686},{"type":17,"tag":239,"props":192486,"children":192487},{"id":189075},[192488],{"type":23,"value":189078},{"type":17,"tag":29,"props":192490,"children":192491},{},[192492],{"type":23,"value":192493},"Marketing platforms vary widely in event support:",{"type":17,"tag":80,"props":192495,"children":192496},{},[192497,192502,192507],{"type":17,"tag":84,"props":192498,"children":192499},{},[192500],{"type":23,"value":192501},"Some providers support webhook delivery for lists, members, or campaigns.",{"type":17,"tag":84,"props":192503,"children":192504},{},[192505],{"type":23,"value":192506},"Others provide no webhook support at all.",{"type":17,"tag":84,"props":192508,"children":192509},{},[192510],{"type":23,"value":192511},"Reporting metrics never emit push-based updates.",{"type":17,"tag":29,"props":192513,"children":192514},{},[192515,192516,192524,192525,192529,192531,192536],{"type":23,"value":107847},{"type":17,"tag":48,"props":192517,"children":192518},{},[192519,192520],{"type":23,"value":89673},{"type":17,"tag":133,"props":192521,"children":192522},{"href":4999},[192523],{"type":23,"value":5002},{"type":23,"value":184596},{"type":17,"tag":48,"props":192526,"children":192527},{},[192528],{"type":23,"value":46572},{"type":23,"value":192530}," (generated by polling). For objects or providers without webhook support, applications must poll list endpoints using incremental filters such as ",{"type":17,"tag":6121,"props":192532,"children":192534},{"className":192533},[],[192535],{"type":23,"value":26291},{"type":23,"value":54},{"type":17,"tag":68,"props":192538,"children":192540},{"id":192539},"core-marketing-data-models-and-how-they-behave",[192541],{"type":23,"value":192542},"Core Marketing Data Models (and How They Behave)",{"type":17,"tag":29,"props":192544,"children":192545},{},[192546,192548,192553],{"type":23,"value":192547},"Unified normalizes Marketing data ",{"type":17,"tag":48,"props":192549,"children":192550},{},[192551],{"type":23,"value":192552},"within the Marketing category",{"type":23,"value":192554},", providing consistent objects across supported platforms. Provider behavior varies and should be handled defensively.",{"type":17,"tag":239,"props":192556,"children":192558},{"id":192557},"lists",[192559],{"type":23,"value":51995},{"type":17,"tag":29,"props":192561,"children":192562},{},[192563],{"type":23,"value":192564},"Lists define audiences.",{"type":17,"tag":80,"props":192566,"children":192567},{},[192568,192573,192578],{"type":17,"tag":84,"props":192569,"children":192570},{},[192571],{"type":23,"value":192572},"Support create, read, update, and remove operations where the provider allows",{"type":17,"tag":84,"props":192574,"children":192575},{},[192576],{"type":23,"value":192577},"Include identifiers, names, optional activation windows, and an active flag",{"type":17,"tag":84,"props":192579,"children":192580},{},[192581,192583,192588],{"type":23,"value":192582},"May include a ",{"type":17,"tag":6121,"props":192584,"children":192586},{"className":192585},[],[192587],{"type":23,"value":62582},{"type":23,"value":192589}," representing the employee who created or owns the list",{"type":17,"tag":29,"props":192591,"children":192592},{},[192593],{"type":23,"value":192594},"Some providers treat lists as read-only; write attempts may return errors.",{"type":17,"tag":239,"props":192596,"children":192598},{"id":192597},"members-subscribers",[192599],{"type":23,"value":192600},"Members (Subscribers)",{"type":17,"tag":29,"props":192602,"children":192603},{},[192604],{"type":23,"value":192605},"Members represent people subscribed to one or more lists.",{"type":17,"tag":80,"props":192607,"children":192608},{},[192609,192614,192619],{"type":17,"tag":84,"props":192610,"children":192611},{},[192612],{"type":23,"value":192613},"Support create, update, and remove operations where supported",{"type":17,"tag":84,"props":192615,"children":192616},{},[192617],{"type":23,"value":192618},"Include names, email addresses, tags, and list memberships",{"type":17,"tag":84,"props":192620,"children":192621},{},[192622],{"type":23,"value":192623},"Do not include a boolean 'subscribed' field",{"type":17,"tag":29,"props":192625,"children":192626},{},[192627,192629,192634],{"type":23,"value":192628},"Subscription state is represented by ",{"type":17,"tag":48,"props":192630,"children":192631},{},[192632],{"type":23,"value":192633},"list membership",{"type":23,"value":192635},". Removing a member from a list or deleting the member unsubscribes them.",{"type":17,"tag":29,"props":192637,"children":192638},{},[192639,192641,192645],{"type":23,"value":192640},"Members are ",{"type":17,"tag":48,"props":192642,"children":192643},{},[192644],{"type":23,"value":159475},{"type":23,"value":192646}," CRM contacts or leads. Any relationship to CRM data must be established explicitly by the application.",{"type":17,"tag":239,"props":192648,"children":192649},{"id":40462},[192650],{"type":23,"value":41708},{"type":17,"tag":29,"props":192652,"children":192653},{},[192654],{"type":23,"value":192655},"Campaigns represent outbound communications.",{"type":17,"tag":80,"props":192657,"children":192658},{},[192659,192663,192691,192696],{"type":17,"tag":84,"props":192660,"children":192661},{},[192662],{"type":23,"value":192613},{"type":17,"tag":84,"props":192664,"children":192665},{},[192666,192667,192672,192673,192678,192679,192685,192686],{"type":23,"value":187804},{"type":17,"tag":6121,"props":192668,"children":192670},{"className":192669},[],[192671],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":192674,"children":192676},{"className":192675},[],[192677],{"type":23,"value":25337},{"type":23,"value":11826},{"type":17,"tag":6121,"props":192680,"children":192682},{"className":192681},[],[192683],{"type":23,"value":192684},"send_at",{"type":23,"value":12561},{"type":17,"tag":6121,"props":192687,"children":192689},{"className":192688},[],[192690],{"type":23,"value":19949},{"type":17,"tag":84,"props":192692,"children":192693},{},[192694],{"type":23,"value":192695},"Common lifecycle states include DRAFT, SCHEDULED, SENDING, SENT, and CANCELLED",{"type":17,"tag":84,"props":192697,"children":192698},{},[192699,192701],{"type":23,"value":192700},"Reference target audiences via ",{"type":17,"tag":6121,"props":192702,"children":192704},{"className":192703},[],[192705],{"type":23,"value":192706},"list_ids",{"type":17,"tag":29,"props":192708,"children":192709},{},[192710],{"type":23,"value":192711},"Provider capabilities vary:",{"type":17,"tag":80,"props":192713,"children":192714},{},[192715,192720,192725],{"type":17,"tag":84,"props":192716,"children":192717},{},[192718],{"type":23,"value":192719},"Some platforms allow editing subject lines, preview text, and sender details",{"type":17,"tag":84,"props":192721,"children":192722},{},[192723],{"type":23,"value":192724},"Others restrict which fields are writable",{"type":17,"tag":84,"props":192726,"children":192727},{},[192728,192730,192735],{"type":23,"value":192729},"Scheduling via ",{"type":17,"tag":6121,"props":192731,"children":192733},{"className":192732},[],[192734],{"type":23,"value":192684},{"type":23,"value":192736}," is not universally supported",{"type":17,"tag":29,"props":192738,"children":192739},{},[192740],{"type":23,"value":192741},"Once a campaign is sent, most providers prevent further modification.",{"type":17,"tag":239,"props":192743,"children":192744},{"id":82739},[192745],{"type":23,"value":41738},{"type":17,"tag":29,"props":192747,"children":192748},{},[192749],{"type":23,"value":192750},"Reports provide aggregated analytics.",{"type":17,"tag":80,"props":192752,"children":192753},{},[192754,192758,192763,192768],{"type":17,"tag":84,"props":192755,"children":192756},{},[192757],{"type":23,"value":185706},{"type":17,"tag":84,"props":192759,"children":192760},{},[192761],{"type":23,"value":192762},"Retrieved via list endpoints",{"type":17,"tag":84,"props":192764,"children":192765},{},[192766],{"type":23,"value":192767},"Include metrics such as emails sent, opens, clicks, bounces, and unsubscribe counts",{"type":17,"tag":84,"props":192769,"children":192770},{},[192771],{"type":23,"value":192772},"Updated incrementally as providers compute engagement metrics",{"type":17,"tag":29,"props":192774,"children":192775},{},[192776],{"type":23,"value":192777},"Reports do not emit webhook events and must be retrieved via polling.",{"type":17,"tag":68,"props":192779,"children":192781},{"id":192780},"identity-and-ownership-in-marketing",[192782],{"type":23,"value":192783},"Identity and Ownership in Marketing",{"type":17,"tag":29,"props":192785,"children":192786},{},[192787],{"type":23,"value":192788},"Marketing objects use their own identity model.",{"type":17,"tag":80,"props":192790,"children":192791},{},[192792,192801,192811],{"type":17,"tag":84,"props":192793,"children":192794},{},[192795,192799],{"type":17,"tag":48,"props":192796,"children":192797},{},[192798],{"type":23,"value":52008},{"type":23,"value":192800}," are list subscribers, not CRM contacts",{"type":17,"tag":84,"props":192802,"children":192803},{},[192804,192809],{"type":17,"tag":48,"props":192805,"children":192806},{},[192807],{"type":23,"value":192808},"Lists and Campaigns",{"type":23,"value":192810}," do not reference CRM contacts, leads, ATS candidates, or HR employees",{"type":17,"tag":84,"props":192812,"children":192813},{},[192814,192815,192820],{"type":23,"value":190662},{"type":17,"tag":6121,"props":192816,"children":192818},{"className":192817},[],[192819],{"type":23,"value":62582},{"type":23,"value":192821}," on certain objects, representing the employee who created or owns the object",{"type":17,"tag":29,"props":192823,"children":192824},{},[192825],{"type":23,"value":192826},"Identity reconciliation across Marketing, CRM, Forms, or Enrichment relies on application-level matching (for example, by email address).",{"type":17,"tag":68,"props":192828,"children":192830},{"id":192829},"updates-reporting-and-engagement-metrics",[192831],{"type":23,"value":192832},"Updates, Reporting, and Engagement Metrics",{"type":17,"tag":239,"props":192834,"children":192836},{"id":192835},"campaign-updates",[192837],{"type":23,"value":192838},"Campaign Updates",{"type":17,"tag":29,"props":192840,"children":192841},{},[192842,192844,192849,192850,192855],{"type":23,"value":192843},"Campaign send and completion events are detected through changes to campaign fields such as ",{"type":17,"tag":6121,"props":192845,"children":192847},{"className":192846},[],[192848],{"type":23,"value":19949},{"type":23,"value":34435},{"type":17,"tag":6121,"props":192851,"children":192853},{"className":192852},[],[192854],{"type":23,"value":192684},{"type":23,"value":192856},". When supported, webhook updates deliver these changes; otherwise, polling is required.",{"type":17,"tag":239,"props":192858,"children":192859},{"id":188290},[192860],{"type":23,"value":188293},{"type":17,"tag":29,"props":192862,"children":192863},{},[192864],{"type":23,"value":192865},"Engagement metrics update over time as recipients interact with messages. Because reports do not emit events:",{"type":17,"tag":80,"props":192867,"children":192868},{},[192869,192874,192885],{"type":17,"tag":84,"props":192870,"children":192871},{},[192872],{"type":23,"value":192873},"Applications should poll report endpoints periodically",{"type":17,"tag":84,"props":192875,"children":192876},{},[192877,192878,192883],{"type":23,"value":33722},{"type":17,"tag":6121,"props":192879,"children":192881},{"className":192880},[],[192882],{"type":23,"value":26291},{"type":23,"value":192884}," and date-range filters to limit results",{"type":17,"tag":84,"props":192886,"children":192887},{},[192888],{"type":23,"value":192889},"Expect lag between campaign send and metric availability",{"type":17,"tag":29,"props":192891,"children":192892},{},[192893],{"type":23,"value":192894},"For most use cases, polling hourly or a few times per day is sufficient.",{"type":17,"tag":68,"props":192896,"children":192897},{"id":164849},[192898],{"type":23,"value":164852},{"type":17,"tag":29,"props":192900,"children":192901},{},[192902],{"type":23,"value":192903},"Marketing data often contains personally identifiable information. Unified's architecture minimizes exposure.",{"type":17,"tag":239,"props":192905,"children":192906},{"id":90302},[192907],{"type":23,"value":179326},{"type":17,"tag":80,"props":192909,"children":192910},{},[192911,192916,192921,192926],{"type":17,"tag":84,"props":192912,"children":192913},{},[192914],{"type":23,"value":192915},"Marketing data is routed directly to source platforms",{"type":17,"tag":84,"props":192917,"children":192918},{},[192919],{"type":23,"value":192920},"No marketing payloads are stored at rest",{"type":17,"tag":84,"props":192922,"children":192923},{},[192924],{"type":23,"value":192925},"No customer data is written to logs",{"type":17,"tag":84,"props":192927,"children":192928},{},[192929],{"type":23,"value":180516},{"type":17,"tag":29,"props":192931,"children":192932},{},[192933],{"type":23,"value":180521},{"type":17,"tag":239,"props":192935,"children":192936},{"id":189556},[192937],{"type":23,"value":189559},{"type":17,"tag":80,"props":192939,"children":192940},{},[192941,192946,192951],{"type":17,"tag":84,"props":192942,"children":192943},{},[192944],{"type":23,"value":192945},"Members include names and email addresses",{"type":17,"tag":84,"props":192947,"children":192948},{},[192949],{"type":23,"value":192950},"Unsubscribe status and engagement metrics must be handled carefully",{"type":17,"tag":84,"props":192952,"children":192953},{},[192954],{"type":23,"value":192955},"Unified passes through provider-level unsubscribe state but does not enforce consent policies",{"type":17,"tag":29,"props":192957,"children":192958},{},[192959],{"type":23,"value":191816},{"type":17,"tag":80,"props":192961,"children":192962},{},[192963,192968,192973],{"type":17,"tag":84,"props":192964,"children":192965},{},[192966],{"type":23,"value":192967},"Honoring opt-out signals",{"type":17,"tag":84,"props":192969,"children":192970},{},[192971],{"type":23,"value":192972},"Implementing compliance logic for regulations such as GDPR, CAN-SPAM, and CASL",{"type":17,"tag":84,"props":192974,"children":192975},{},[192976],{"type":23,"value":192977},"Restricting access to marketing data appropriately",{"type":17,"tag":29,"props":192979,"children":192980},{},[192981],{"type":23,"value":192982},"For AI-driven use cases, MCP-based integrations can remove sensitive fields before data reaches downstream systems.",{"type":17,"tag":68,"props":192984,"children":192986},{"id":192985},"common-marketing-api-integration-use-cases",[192987],{"type":23,"value":192988},"Common Marketing API Integration Use Cases",{"type":17,"tag":239,"props":192990,"children":192992},{"id":192991},"campaign-analytics-dashboards",[192993],{"type":23,"value":192994},"Campaign Analytics Dashboards",{"type":17,"tag":29,"props":192996,"children":192997},{},[192998],{"type":23,"value":192999},"Aggregate performance metrics across multiple marketing platforms into unified views.",{"type":17,"tag":239,"props":193001,"children":193003},{"id":193002},"lead-nurturing-and-handoffs",[193004],{"type":23,"value":193005},"Lead Nurturing and Handoffs",{"type":17,"tag":29,"props":193007,"children":193008},{},[193009],{"type":23,"value":193010},"Synchronize subscriber data with CRM systems to support lead qualification and follow-up.",{"type":17,"tag":239,"props":193012,"children":193014},{"id":193013},"audience-and-list-management",[193015],{"type":23,"value":193016},"Audience and List Management",{"type":17,"tag":29,"props":193018,"children":193019},{},[193020],{"type":23,"value":193021},"Create tools that manage lists, segments, and unsubscribes across platforms.",{"type":17,"tag":239,"props":193023,"children":193025},{"id":193024},"ai-driven-personalization",[193026],{"type":23,"value":193027},"AI-Driven Personalization",{"type":17,"tag":29,"props":193029,"children":193030},{},[193031],{"type":23,"value":193032},"Analyze engagement history to tailor content or recommendations while keeping source systems authoritative.",{"type":17,"tag":68,"props":193034,"children":193035},{"id":188461},[193036],{"type":23,"value":188464},{"type":17,"tag":29,"props":193038,"children":193039},{},[193040],{"type":23,"value":193041},"Unified is explicit about Marketing limitations:",{"type":17,"tag":80,"props":193043,"children":193044},{},[193045,193049,193054,193059,193064],{"type":17,"tag":84,"props":193046,"children":193047},{},[193048],{"type":23,"value":180660},{"type":17,"tag":84,"props":193050,"children":193051},{},[193052],{"type":23,"value":193053},"Subscription state is list-based, not a boolean",{"type":17,"tag":84,"props":193055,"children":193056},{},[193057],{"type":23,"value":193058},"Campaign scheduling is not universal",{"type":17,"tag":84,"props":193060,"children":193061},{},[193062],{"type":23,"value":193063},"Reports update asynchronously and must be polled",{"type":17,"tag":84,"props":193065,"children":193066},{},[193067],{"type":23,"value":193068},"Consent enforcement is the application's responsibility",{"type":17,"tag":29,"props":193070,"children":193071},{},[193072],{"type":23,"value":193073},"These constraints reflect real provider behavior and should be incorporated into design decisions.",{"type":17,"tag":68,"props":193075,"children":193077},{"id":193076},"build-vs-buy-marketing-integrations",[193078],{"type":23,"value":193079},"Build vs Buy Marketing Integrations",{"type":17,"tag":239,"props":193081,"children":193082},{"id":165021},[193083],{"type":23,"value":165024},{"type":17,"tag":80,"props":193085,"children":193086},{},[193087,193092,193097,193101],{"type":17,"tag":84,"props":193088,"children":193089},{},[193090],{"type":23,"value":193091},"Multiple provider APIs to maintain",{"type":17,"tag":84,"props":193093,"children":193094},{},[193095],{"type":23,"value":193096},"Inconsistent campaign lifecycles",{"type":17,"tag":84,"props":193098,"children":193099},{},[193100],{"type":23,"value":187218},{"type":17,"tag":84,"props":193102,"children":193103},{},[193104],{"type":23,"value":187223},{"type":17,"tag":239,"props":193106,"children":193108},{"id":193107},"using-a-unified-marketing-api",[193109],{"type":23,"value":193110},"Using a Unified Marketing API",{"type":17,"tag":80,"props":193112,"children":193113},{},[193114,193118,193123,193127,193131],{"type":17,"tag":84,"props":193115,"children":193116},{},[193117],{"type":23,"value":187237},{"type":17,"tag":84,"props":193119,"children":193120},{},[193121],{"type":23,"value":193122},"Normalized lists, members, campaigns, and reports",{"type":17,"tag":84,"props":193124,"children":193125},{},[193126],{"type":23,"value":165071},{"type":17,"tag":84,"props":193128,"children":193129},{},[193130],{"type":23,"value":180731},{"type":17,"tag":84,"props":193132,"children":193133},{},[193134],{"type":23,"value":137967},{"type":17,"tag":68,"props":193136,"children":193138},{"id":193137},"best-practices-for-implementing-marketing-apis",[193139],{"type":23,"value":193140},"Best Practices for Implementing Marketing APIs",{"type":17,"tag":80,"props":193142,"children":193143},{},[193144,193149,193154,193159,193164,193169],{"type":17,"tag":84,"props":193145,"children":193146},{},[193147],{"type":23,"value":193148},"Treat members as subscribers, not customers",{"type":17,"tag":84,"props":193150,"children":193151},{},[193152],{"type":23,"value":193153},"Design for provider variability",{"type":17,"tag":84,"props":193155,"children":193156},{},[193157],{"type":23,"value":193158},"Poll reports and activities thoughtfully",{"type":17,"tag":84,"props":193160,"children":193161},{},[193162],{"type":23,"value":193163},"Respect unsubscribe and suppression signals",{"type":17,"tag":84,"props":193165,"children":193166},{},[193167],{"type":23,"value":193168},"Keep CRM and Marketing roles distinct",{"type":17,"tag":84,"props":193170,"children":193171},{},[193172],{"type":23,"value":193173},"Monitor connection health and rate-limit responses",{"type":17,"tag":68,"props":193175,"children":193177},{"id":193176},"build-marketing-integrations-with-clear-boundaries",[193178],{"type":23,"value":193179},"Build marketing integrations with clear boundaries",{"type":17,"tag":29,"props":193181,"children":193182},{},[193183],{"type":23,"value":193184},"If your product relies on campaign execution and engagement data across multiple platforms, maintaining separate marketing integrations quickly becomes complex and error-prone.",{"type":17,"tag":29,"props":193186,"children":193187},{},[193188,193189,193193],{"type":23,"value":25244},{"type":17,"tag":48,"props":193190,"children":193191},{},[193192],{"type":23,"value":106474},{"type":23,"value":193194}," provides a consistent way to manage lists, subscribers, campaigns, and reports across supported platforms—without storing marketing data or collapsing category boundaries.",{"type":17,"tag":29,"props":193196,"children":193197},{},[193198,193202,193203],{"type":17,"tag":48,"props":193199,"children":193200},{},[193201],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":193204,"children":193206},{"href":1612,"rel":193205},[214],[193207],{"type":17,"tag":48,"props":193208,"children":193209},{},[193210],{"type":23,"value":1616},{"type":17,"tag":29,"props":193212,"children":193213},{},[193214],{"type":23,"value":193215},"Test marketing integrations with live data access and normalized objects.",{"type":17,"tag":29,"props":193217,"children":193218},{},[193219,193223,193224],{"type":17,"tag":48,"props":193220,"children":193221},{},[193222],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":193225,"children":193227},{"href":1623,"rel":193226},[214],[193228],{"type":17,"tag":48,"props":193229,"children":193230},{},[193231],{"type":23,"value":1627},{"type":17,"tag":29,"props":193233,"children":193234},{},[193235],{"type":23,"value":193236},"Talk through your marketing, CRM, or cross-category use case with the team that built the platform.",{"type":17,"tag":68,"props":193238,"children":193239},{"id":95759},[193240],{"type":23,"value":95762},{"type":17,"tag":29,"props":193242,"children":193243},{},[193244],{"type":17,"tag":48,"props":193245,"children":193246},{},[193247],{"type":23,"value":193248},"What is a Marketing API?",{"type":17,"tag":29,"props":193250,"children":193251},{},[193252],{"type":23,"value":193253},"An API that allows applications to manage marketing lists, subscribers, campaigns, and engagement metrics programmatically.",{"type":17,"tag":29,"props":193255,"children":193256},{},[193257],{"type":17,"tag":48,"props":193258,"children":193259},{},[193260],{"type":23,"value":165175},{"type":17,"tag":29,"props":193262,"children":193263},{},[193264],{"type":23,"value":193265},"Unified supports platforms including Mailchimp, HubSpot Marketing, ActiveCampaign, Klaviyo, Customer.io, Salesforce Marketing Cloud, and SendGrid.",{"type":17,"tag":29,"props":193267,"children":193268},{},[193269],{"type":17,"tag":48,"props":193270,"children":193271},{},[193272],{"type":23,"value":193273},"Are marketing updates real time?",{"type":17,"tag":29,"props":193275,"children":193276},{},[193277],{"type":23,"value":193278},"List, member, and campaign changes may be delivered via webhooks where supported; reporting metrics must be polled.",{"type":17,"tag":29,"props":193280,"children":193281},{},[193282],{"type":17,"tag":48,"props":193283,"children":193284},{},[193285],{"type":23,"value":193286},"Can I create or update campaigns via the API?",{"type":17,"tag":29,"props":193288,"children":193289},{},[193290],{"type":23,"value":193291},"Yes, subject to provider support and campaign state.",{"type":17,"tag":29,"props":193293,"children":193294},{},[193295],{"type":17,"tag":48,"props":193296,"children":193297},{},[193298],{"type":23,"value":193299},"Does the Marketing API store subscriber data?",{"type":17,"tag":29,"props":193301,"children":193302},{},[193303],{"type":23,"value":193304},"No. Marketing data is not stored at rest.",{"type":17,"tag":29,"props":193306,"children":193307},{},[193308],{"type":17,"tag":48,"props":193309,"children":193310},{},[193311],{"type":23,"value":193312},"How does Marketing differ from CRM or Advertising?",{"type":17,"tag":29,"props":193314,"children":193315},{},[193316],{"type":23,"value":193317},"Marketing manages outbound campaigns and engagement. CRM manages sales relationships. Advertising manages paid media and spend.",{"title":7,"searchDepth":1629,"depth":1629,"links":193319},[193320,193321,193322,193323,193327,193333,193334,193338,193342,193348,193349,193353,193354,193355],{"id":192258,"depth":1629,"text":192261},{"id":51039,"depth":1629,"text":51042},{"id":192397,"depth":1629,"text":192400},{"id":192462,"depth":1629,"text":192465,"children":193324},[193325,193326],{"id":163879,"depth":1635,"text":163882},{"id":189075,"depth":1635,"text":189078},{"id":192539,"depth":1629,"text":192542,"children":193328},[193329,193330,193331,193332],{"id":192557,"depth":1635,"text":51995},{"id":192597,"depth":1635,"text":192600},{"id":40462,"depth":1635,"text":41708},{"id":82739,"depth":1635,"text":41738},{"id":192780,"depth":1629,"text":192783},{"id":192829,"depth":1629,"text":192832,"children":193335},[193336,193337],{"id":192835,"depth":1635,"text":192838},{"id":188290,"depth":1635,"text":188293},{"id":164849,"depth":1629,"text":164852,"children":193339},[193340,193341],{"id":90302,"depth":1635,"text":179326},{"id":189556,"depth":1635,"text":189559},{"id":192985,"depth":1629,"text":192988,"children":193343},[193344,193345,193346,193347],{"id":192991,"depth":1635,"text":192994},{"id":193002,"depth":1635,"text":193005},{"id":193013,"depth":1635,"text":193016},{"id":193024,"depth":1635,"text":193027},{"id":188461,"depth":1629,"text":188464},{"id":193076,"depth":1629,"text":193079,"children":193350},[193351,193352],{"id":165021,"depth":1635,"text":165024},{"id":193107,"depth":1635,"text":193110},{"id":193137,"depth":1629,"text":193140},{"id":193176,"depth":1629,"text":193179},{"id":95759,"depth":1629,"text":95762},"content:blog:marketing_api_integration_campaign_execution_audiences_and_engagement_data_across_platforms.md","blog/marketing_api_integration_campaign_execution_audiences_and_engagement_data_across_platforms.md","blog/marketing_api_integration_campaign_execution_audiences_and_engagement_data_across_platforms",{"_path":193360,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":193361,"description":193362,"img":193363,"date":193364,"tag":12,"body":193365,"_type":1677,"_id":194582,"_source":1679,"_file":194583,"_stem":194584,"_extension":1682},"/blog/crm_api_integration_real_time_customer_data_across_sales_pipelines","CRM API Integration: Real-Time Customer Data Across Sales Pipelines","Modern products depend on accurate customer data. Contacts change roles, deals move stages, pipelines evolve, and sales activity accumulates quickly. When CRM...","https://s3.us-east-2.amazonaws.com/unified-article-images/crm_api_integration_real_time_customer_data_across_sales_pipelines-icon.png","2026-02-07T01:50:00.000Z",{"type":14,"children":193366,"toc":194541},[193367,193372,193375,193382,193387,193396,193402,193443,193448,193471,193476,193481,193491,193495,193523,193535,193541,193546,193596,193607,193613,193618,193624,193634,193640,193645,193667,193689,193695,193707,193711,193716,193760,193765,193785,193789,193794,193812,193817,193822,193827,193845,193849,193854,193872,193877,193883,193888,193910,193915,193919,193924,193941,193947,193965,193989,193994,194000,194005,194010,194031,194049,194055,194085,194090,194094,194099,194103,194125,194130,194136,194154,194160,194165,194197,194203,194209,194214,194220,194225,194231,194236,194242,194247,194251,194256,194284,194289,194295,194299,194321,194327,194353,194359,194397,194403,194408,194418,194434,194439,194455,194460,194464,194471,194476,194484,194489,194497,194502,194510,194515,194523,194528,194536],{"type":17,"tag":18,"props":193368,"children":193370},{"id":193369},"crm-api-integration-real-time-customer-data-across-sales-pipelines",[193371],{"type":23,"value":193361},{"type":17,"tag":25,"props":193373,"children":193374},{},[],{"type":17,"tag":29,"props":193376,"children":193377},{},[193378],{"type":17,"tag":33,"props":193379,"children":193380},{},[193381],{"type":23,"value":191080},{"type":17,"tag":29,"props":193383,"children":193384},{},[193385],{"type":23,"value":193386},"Modern products depend on accurate customer data. Contacts change roles, deals move stages, pipelines evolve, and sales activity accumulates quickly. When CRM data is delayed, duplicated, or loosely mapped, downstream analytics, sales tooling, and AI features become unreliable.",{"type":17,"tag":29,"props":193388,"children":193389},{},[193390,193394],{"type":17,"tag":133,"props":193391,"children":193392},{"href":61562},[193393],{"type":23,"value":61565},{"type":23,"value":193395}," integration exists to solve this problem. In this guide, we'll explain what a CRM API does, how Unified's CRM API handles customer data across platforms, which CRM objects matter in practice, how real-time updates work, and how the CRM category fits alongside ATS, HR & Directory, Marketing Automation, and Ticketing.",{"type":17,"tag":68,"props":193397,"children":193399},{"id":193398},"introduction-to-crm-api-integrations",[193400],{"type":23,"value":193401},"Introduction to CRM API Integrations",{"type":17,"tag":29,"props":193403,"children":193404},{},[193405,193407,193411,193412,193416,193417,193421,193422,193426,193427,193431,193432,193436,193437,193441],{"type":23,"value":193406},"Customer Relationship Management (CRM) platforms such as ",{"type":17,"tag":48,"props":193408,"children":193409},{},[193410],{"type":23,"value":3179},{"type":23,"value":11826},{"type":17,"tag":48,"props":193413,"children":193414},{},[193415],{"type":23,"value":3184},{"type":23,"value":11826},{"type":17,"tag":48,"props":193418,"children":193419},{},[193420],{"type":23,"value":26530},{"type":23,"value":11826},{"type":17,"tag":48,"props":193423,"children":193424},{},[193425],{"type":23,"value":26535},{"type":23,"value":11826},{"type":17,"tag":48,"props":193428,"children":193429},{},[193430],{"type":23,"value":75058},{"type":23,"value":11826},{"type":17,"tag":48,"props":193433,"children":193434},{},[193435],{"type":23,"value":61620},{"type":23,"value":12561},{"type":17,"tag":48,"props":193438,"children":193439},{},[193440],{"type":23,"value":61628},{"type":23,"value":193442}," are used to manage customer relationships over time. They track contacts, companies, deals, pipelines, and the activities that move opportunities forward.",{"type":17,"tag":29,"props":193444,"children":193445},{},[193446],{"type":23,"value":193447},"However, each CRM has its own API conventions, authentication model, and data structures. Products that need to support multiple CRMs often face:",{"type":17,"tag":80,"props":193449,"children":193450},{},[193451,193456,193461,193466],{"type":17,"tag":84,"props":193452,"children":193453},{},[193454],{"type":23,"value":193455},"Vendor-specific schemas and custom fields",{"type":17,"tag":84,"props":193457,"children":193458},{},[193459],{"type":23,"value":193460},"Inconsistent lifecycle semantics",{"type":17,"tag":84,"props":193462,"children":193463},{},[193464],{"type":23,"value":193465},"Different limits on write operations",{"type":17,"tag":84,"props":193467,"children":193468},{},[193469],{"type":23,"value":193470},"Varying support for real-time updates",{"type":17,"tag":29,"props":193472,"children":193473},{},[193474],{"type":23,"value":193475},"CRM API integration provides a consistent way to read and write customer data across platforms—without maintaining one-off integrations for each provider.",{"type":17,"tag":68,"props":193477,"children":193478},{"id":61670},[193479],{"type":23,"value":193480},"What Is a CRM API?",{"type":17,"tag":29,"props":193482,"children":193483},{},[193484,193485,193489],{"type":23,"value":9619},{"type":17,"tag":48,"props":193486,"children":193487},{},[193488],{"type":23,"value":61565},{"type":23,"value":193490}," allows software products to programmatically access customer-relationship data stored in CRM platforms.",{"type":17,"tag":29,"props":193492,"children":193493},{},[193494],{"type":23,"value":167214},{"type":17,"tag":80,"props":193496,"children":193497},{},[193498,193503,193508,193513,193518],{"type":17,"tag":84,"props":193499,"children":193500},{},[193501],{"type":23,"value":193502},"Retrieving contacts and companies",{"type":17,"tag":84,"props":193504,"children":193505},{},[193506],{"type":23,"value":193507},"Managing deals and sales pipelines",{"type":17,"tag":84,"props":193509,"children":193510},{},[193511],{"type":23,"value":193512},"Creating and updating leads",{"type":17,"tag":84,"props":193514,"children":193515},{},[193516],{"type":23,"value":193517},"Reading customer interactions and activity",{"type":17,"tag":84,"props":193519,"children":193520},{},[193521],{"type":23,"value":193522},"Filtering, searching, and syncing records across systems",{"type":17,"tag":29,"props":193524,"children":193525},{},[193526,193528,193533],{"type":23,"value":193527},"CRM APIs focus on ",{"type":17,"tag":48,"props":193529,"children":193530},{},[193531],{"type":23,"value":193532},"sales-centric customer data",{"type":23,"value":193534},". They are not systems of record for employees, candidates, billing, or support tickets.",{"type":17,"tag":68,"props":193536,"children":193538},{"id":193537},"crm-api-vs-ats-hr-marketing-and-ticketing",[193539],{"type":23,"value":193540},"CRM API vs ATS, HR, Marketing, and Ticketing",{"type":17,"tag":29,"props":193542,"children":193543},{},[193544],{"type":23,"value":193545},"Unified treats CRM as one category within a broader integration surface, with clear boundaries.",{"type":17,"tag":80,"props":193547,"children":193548},{},[193549,193558,193567,193577,193587],{"type":17,"tag":84,"props":193550,"children":193551},{},[193552,193556],{"type":17,"tag":48,"props":193553,"children":193554},{},[193555],{"type":23,"value":173018},{"type":23,"value":193557}," manage external customer relationships: contacts, companies, deals, pipelines, leads, and activities.",{"type":17,"tag":84,"props":193559,"children":193560},{},[193561,193565],{"type":17,"tag":48,"props":193562,"children":193563},{},[193564],{"type":23,"value":189036},{"type":23,"value":193566}," manage recruiting data: jobs, candidates, applications, interviews, and hiring decisions.",{"type":17,"tag":84,"props":193568,"children":193569},{},[193570,193575],{"type":17,"tag":48,"props":193571,"children":193572},{},[193573],{"type":23,"value":193574},"HR & Directory APIs",{"type":23,"value":193576}," manage employees and internal organization data.",{"type":17,"tag":84,"props":193578,"children":193579},{},[193580,193585],{"type":17,"tag":48,"props":193581,"children":193582},{},[193583],{"type":23,"value":193584},"Marketing Automation APIs",{"type":23,"value":193586}," manage campaign execution, lists, and outbound messaging.",{"type":17,"tag":84,"props":193588,"children":193589},{},[193590,193594],{"type":17,"tag":48,"props":193591,"children":193592},{},[193593],{"type":23,"value":173008},{"type":23,"value":193595}," manage support cases and issue resolution.",{"type":17,"tag":29,"props":193597,"children":193598},{},[193599,193601,193605],{"type":23,"value":193600},"A CRM contact is ",{"type":17,"tag":48,"props":193602,"children":193603},{},[193604],{"type":23,"value":159475},{"type":23,"value":193606}," an employee or a candidate. CRM data represents prospects and customers, not workforce identity. Any relationship between CRM records and ATS or HR data must be defined explicitly by the application.",{"type":17,"tag":68,"props":193608,"children":193610},{"id":193609},"real-time-vs-batch-crm-data-access",[193611],{"type":23,"value":193612},"Real-Time vs Batch CRM Data Access",{"type":17,"tag":29,"props":193614,"children":193615},{},[193616],{"type":23,"value":193617},"Many CRM integrations rely on scheduled sync jobs or replicated databases. That approach increases complexity and introduces delay.",{"type":17,"tag":239,"props":193619,"children":193621},{"id":193620},"live-access-to-source-crms",[193622],{"type":23,"value":193623},"Live Access to Source CRMs",{"type":17,"tag":29,"props":193625,"children":193626},{},[193627,193629,193633],{"type":23,"value":193628},"Unified's CRM API routes every request directly to the connected CRM platform. There is no cached replica or background synchronization layer. This ensures that reads reflect the current state of the source CRM, subject to provider ",{"type":17,"tag":133,"props":193630,"children":193631},{"href":135},[193632],{"type":23,"value":138},{"type":23,"value":171686},{"type":17,"tag":239,"props":193635,"children":193637},{"id":193636},"event-driven-vs-polled-updates",[193638],{"type":23,"value":193639},"Event-Driven vs Polled Updates",{"type":17,"tag":29,"props":193641,"children":193642},{},[193643],{"type":23,"value":193644},"CRM platforms differ widely in how they deliver updates:",{"type":17,"tag":80,"props":193646,"children":193647},{},[193648,193658,193662],{"type":17,"tag":84,"props":193649,"children":193650},{},[193651,193652,193656],{"type":23,"value":180121},{"type":17,"tag":133,"props":193653,"children":193654},{"href":4999},[193655],{"type":23,"value":5002},{"type":23,"value":193657}," for certain objects.",{"type":17,"tag":84,"props":193659,"children":193660},{},[193661],{"type":23,"value":192506},{"type":17,"tag":84,"props":193663,"children":193664},{},[193665],{"type":23,"value":193666},"Activity records (calls, notes, emails) typically require polling.",{"type":17,"tag":29,"props":193668,"children":193669},{},[193670,193671,193675,193677,193681,193683,193688],{"type":23,"value":107847},{"type":17,"tag":48,"props":193672,"children":193673},{},[193674],{"type":23,"value":107852},{"type":23,"value":193676}," (forwarded directly when available) and ",{"type":17,"tag":48,"props":193678,"children":193679},{},[193680],{"type":23,"value":46572},{"type":23,"value":193682}," (generated via polling). For objects that do not emit events, applications must rely on list endpoints with incremental filters such as ",{"type":17,"tag":6121,"props":193684,"children":193686},{"className":193685},[],[193687],{"type":23,"value":26291},{"type":23,"value":54},{"type":17,"tag":68,"props":193690,"children":193692},{"id":193691},"core-crm-data-models-and-how-they-behave",[193693],{"type":23,"value":193694},"Core CRM Data Models (and How They Behave)",{"type":17,"tag":29,"props":193696,"children":193697},{},[193698,193700,193705],{"type":23,"value":193699},"Unified normalizes CRM data ",{"type":17,"tag":48,"props":193701,"children":193702},{},[193703],{"type":23,"value":193704},"within the CRM category",{"type":23,"value":193706},", providing consistent objects across supported platforms. Real-world behavior varies by provider and should be handled defensively.",{"type":17,"tag":239,"props":193708,"children":193709},{"id":79044},[193710],{"type":23,"value":63113},{"type":17,"tag":29,"props":193712,"children":193713},{},[193714],{"type":23,"value":193715},"Deals represent sales opportunities.",{"type":17,"tag":80,"props":193717,"children":193718},{},[193719,193723,193750,193755],{"type":17,"tag":84,"props":193720,"children":193721},{},[193722],{"type":23,"value":187799},{"type":17,"tag":84,"props":193724,"children":193725},{},[193726,193727,193732,193733,193738,193739,193744,193745],{"type":23,"value":187804},{"type":17,"tag":6121,"props":193728,"children":193730},{"className":193729},[],[193731],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":193734,"children":193736},{"className":193735},[],[193737],{"type":23,"value":25337},{"type":23,"value":11826},{"type":17,"tag":6121,"props":193740,"children":193742},{"className":193741},[],[193743],{"type":23,"value":62569},{"type":23,"value":12561},{"type":17,"tag":6121,"props":193746,"children":193748},{"className":193747},[],[193749],{"type":23,"value":25912},{"type":17,"tag":84,"props":193751,"children":193752},{},[193753],{"type":23,"value":193754},"Track amount, currency, probability, stage, and pipeline membership",{"type":17,"tag":84,"props":193756,"children":193757},{},[193758],{"type":23,"value":193759},"May infer probability from stage or allow explicit values, depending on the CRM",{"type":17,"tag":29,"props":193761,"children":193762},{},[193763],{"type":23,"value":193764},"Important notes:",{"type":17,"tag":80,"props":193766,"children":193767},{},[193768,193780],{"type":17,"tag":84,"props":193769,"children":193770},{},[193771,193773,193778],{"type":23,"value":193772},"Expected close dates (",{"type":17,"tag":6121,"props":193774,"children":193776},{"className":193775},[],[193777],{"type":23,"value":25912},{"type":23,"value":193779},") are optional and provider-dependent",{"type":17,"tag":84,"props":193781,"children":193782},{},[193783],{"type":23,"value":193784},"Stage and pipeline semantics differ across CRMs",{"type":17,"tag":239,"props":193786,"children":193787},{"id":30404},[193788],{"type":23,"value":31619},{"type":17,"tag":29,"props":193790,"children":193791},{},[193792],{"type":23,"value":193793},"Contacts represent people associated with companies or deals.",{"type":17,"tag":80,"props":193795,"children":193796},{},[193797,193802,193807],{"type":17,"tag":84,"props":193798,"children":193799},{},[193800],{"type":23,"value":193801},"Support full create, read, update, and remove operations",{"type":17,"tag":84,"props":193803,"children":193804},{},[193805],{"type":23,"value":193806},"Include names, titles, email addresses, phone numbers, and company associations",{"type":17,"tag":84,"props":193808,"children":193809},{},[193810],{"type":23,"value":193811},"Do not represent employees or candidates",{"type":17,"tag":29,"props":193813,"children":193814},{},[193815],{"type":23,"value":193816},"Some providers combine contacts and leads or restrict editing of certain fields.",{"type":17,"tag":239,"props":193818,"children":193820},{"id":193819},"companies",[193821],{"type":23,"value":56943},{"type":17,"tag":29,"props":193823,"children":193824},{},[193825],{"type":23,"value":193826},"Companies represent organizations or accounts.",{"type":17,"tag":80,"props":193828,"children":193829},{},[193830,193835,193840],{"type":17,"tag":84,"props":193831,"children":193832},{},[193833],{"type":23,"value":193834},"Support create, read, update, and remove operations",{"type":17,"tag":84,"props":193836,"children":193837},{},[193838],{"type":23,"value":193839},"Include identifiers, addresses, domains, and relationships to contacts and deals",{"type":17,"tag":84,"props":193841,"children":193842},{},[193843],{"type":23,"value":193844},"Do not have a win/loss lifecycle",{"type":17,"tag":239,"props":193846,"children":193847},{"id":61705},[193848],{"type":23,"value":63123},{"type":17,"tag":29,"props":193850,"children":193851},{},[193852],{"type":23,"value":193853},"Leads represent top-of-funnel prospects.",{"type":17,"tag":80,"props":193855,"children":193856},{},[193857,193862,193867],{"type":17,"tag":84,"props":193858,"children":193859},{},[193860],{"type":23,"value":193861},"Support full CRUD operations",{"type":17,"tag":84,"props":193863,"children":193864},{},[193865],{"type":23,"value":193866},"May be converted to contacts or companies depending on provider behavior",{"type":17,"tag":84,"props":193868,"children":193869},{},[193870],{"type":23,"value":193871},"Lifecycle semantics vary widely across CRMs",{"type":17,"tag":29,"props":193873,"children":193874},{},[193875],{"type":23,"value":193876},"Applications should not assume consistent lead conversion behavior.",{"type":17,"tag":239,"props":193878,"children":193880},{"id":193879},"events-activities",[193881],{"type":23,"value":193882},"Events (Activities)",{"type":17,"tag":29,"props":193884,"children":193885},{},[193886],{"type":23,"value":193887},"Events represent historical CRM activity such as notes, emails, calls, meetings, tasks, form submissions, or page views.",{"type":17,"tag":80,"props":193889,"children":193890},{},[193891,193895,193900,193905],{"type":17,"tag":84,"props":193892,"children":193893},{},[193894],{"type":23,"value":185706},{"type":17,"tag":84,"props":193896,"children":193897},{},[193898],{"type":23,"value":193899},"Retrieved via list endpoints with pagination and filtering",{"type":17,"tag":84,"props":193901,"children":193902},{},[193903],{"type":23,"value":193904},"No create or update operations through the API",{"type":17,"tag":84,"props":193906,"children":193907},{},[193908],{"type":23,"value":193909},"No real-time webhooks; polling is required",{"type":17,"tag":29,"props":193911,"children":193912},{},[193913],{"type":23,"value":193914},"Events are intended for consumption and analysis, not mutation.",{"type":17,"tag":239,"props":193916,"children":193917},{"id":62603},[193918],{"type":23,"value":63128},{"type":17,"tag":29,"props":193920,"children":193921},{},[193922],{"type":23,"value":193923},"Pipelines define deal stages and progression rules.",{"type":17,"tag":80,"props":193925,"children":193926},{},[193927,193931,193936],{"type":17,"tag":84,"props":193928,"children":193929},{},[193930],{"type":23,"value":185706},{"type":17,"tag":84,"props":193932,"children":193933},{},[193934],{"type":23,"value":193935},"Retrieved to understand stage ordering, probabilities, and closed/won/lost semantics",{"type":17,"tag":84,"props":193937,"children":193938},{},[193939],{"type":23,"value":193940},"Managed directly in the CRM, not via the API",{"type":17,"tag":68,"props":193942,"children":193944},{"id":193943},"identity-and-ownership-in-crm",[193945],{"type":23,"value":193946},"Identity and Ownership in CRM",{"type":17,"tag":29,"props":193948,"children":193949},{},[193950,193952,193957,193959,193964],{"type":23,"value":193951},"CRM objects include ",{"type":17,"tag":6121,"props":193953,"children":193955},{"className":193954},[],[193956],{"type":23,"value":62582},{"type":23,"value":193958}," fields that represent ",{"type":17,"tag":48,"props":193960,"children":193961},{},[193962],{"type":23,"value":193963},"ownership or attribution",{"type":23,"value":54},{"type":17,"tag":80,"props":193966,"children":193967},{},[193968,193973,193978],{"type":17,"tag":84,"props":193969,"children":193970},{},[193971],{"type":23,"value":193972},"Deal owners, contact owners, and lead owners are CRM users",{"type":17,"tag":84,"props":193974,"children":193975},{},[193976],{"type":23,"value":193977},"These user IDs may correspond to HR employees for filtering or assignment",{"type":17,"tag":84,"props":193979,"children":193980},{},[193981,193983,193987],{"type":23,"value":193982},"Contacts, leads, and companies themselves are ",{"type":17,"tag":48,"props":193984,"children":193985},{},[193986],{"type":23,"value":159475},{"type":23,"value":193988}," employees or candidates",{"type":17,"tag":29,"props":193990,"children":193991},{},[193992],{"type":23,"value":193993},"There are no CRM fields that link a contact or lead to an ATS candidate or HR employee by default.",{"type":17,"tag":68,"props":193995,"children":193997},{"id":193996},"real-time-updates-and-event-coverage",[193998],{"type":23,"value":193999},"Real-Time Updates and Event Coverage",{"type":17,"tag":239,"props":194001,"children":194002},{"id":100676},[194003],{"type":23,"value":194004},"Native and Virtual Webhooks",{"type":17,"tag":29,"props":194006,"children":194007},{},[194008],{"type":23,"value":194009},"Unified supports two update mechanisms:",{"type":17,"tag":80,"props":194011,"children":194012},{},[194013,194022],{"type":17,"tag":84,"props":194014,"children":194015},{},[194016,194020],{"type":17,"tag":48,"props":194017,"children":194018},{},[194019],{"type":23,"value":9024},{"type":23,"value":194021}," when the CRM provider supports them",{"type":17,"tag":84,"props":194023,"children":194024},{},[194025,194029],{"type":17,"tag":48,"props":194026,"children":194027},{},[194028],{"type":23,"value":9256},{"type":23,"value":194030}," that poll for changes and emit updates when records change",{"type":17,"tag":29,"props":194032,"children":194033},{},[194034,194036,194041,194042,194047],{"type":23,"value":194035},"Both methods deliver ",{"type":17,"tag":6121,"props":194037,"children":194039},{"className":194038},[],[194040],{"type":23,"value":109207},{"type":23,"value":34435},{"type":17,"tag":6121,"props":194043,"children":194045},{"className":194044},[],[194046],{"type":23,"value":109214},{"type":23,"value":194048}," events where available.",{"type":17,"tag":239,"props":194050,"children":194052},{"id":194051},"coverage-limits",[194053],{"type":23,"value":194054},"Coverage Limits",{"type":17,"tag":80,"props":194056,"children":194057},{},[194058,194063,194074],{"type":17,"tag":84,"props":194059,"children":194060},{},[194061],{"type":23,"value":194062},"Deals, contacts, companies, and leads may emit events depending on provider",{"type":17,"tag":84,"props":194064,"children":194065},{},[194066,194068,194072],{"type":23,"value":194067},"Activity events (notes, calls, emails) do ",{"type":17,"tag":48,"props":194069,"children":194070},{},[194071],{"type":23,"value":159475},{"type":23,"value":194073}," emit webhooks",{"type":17,"tag":84,"props":194075,"children":194076},{},[194077,194079,194083],{"type":23,"value":194078},"Pipeline configuration changes do ",{"type":17,"tag":48,"props":194080,"children":194081},{},[194082],{"type":23,"value":159475},{"type":23,"value":194084}," emit events",{"type":17,"tag":29,"props":194086,"children":194087},{},[194088],{"type":23,"value":194089},"Applications must poll for activities and pipeline updates using list endpoints and incremental filters.",{"type":17,"tag":68,"props":194091,"children":194092},{"id":164849},[194093],{"type":23,"value":164852},{"type":17,"tag":29,"props":194095,"children":194096},{},[194097],{"type":23,"value":194098},"CRM data frequently contains personally identifiable information. Unified's architecture minimizes risk.",{"type":17,"tag":239,"props":194100,"children":194101},{"id":90302},[194102],{"type":23,"value":179326},{"type":17,"tag":80,"props":194104,"children":194105},{},[194106,194111,194116,194120],{"type":17,"tag":84,"props":194107,"children":194108},{},[194109],{"type":23,"value":194110},"CRM data is routed directly to the source platform",{"type":17,"tag":84,"props":194112,"children":194113},{},[194114],{"type":23,"value":194115},"No CRM payloads are stored at rest",{"type":17,"tag":84,"props":194117,"children":194118},{},[194119],{"type":23,"value":192925},{"type":17,"tag":84,"props":194121,"children":194122},{},[194123],{"type":23,"value":194124},"Requests are stateless",{"type":17,"tag":29,"props":194126,"children":194127},{},[194128],{"type":23,"value":194129},"If long-term storage is required, applications must persist CRM data themselves.",{"type":17,"tag":239,"props":194131,"children":194133},{"id":194132},"pii-handling",[194134],{"type":23,"value":194135},"PII Handling",{"type":17,"tag":80,"props":194137,"children":194138},{},[194139,194144,194149],{"type":17,"tag":84,"props":194140,"children":194141},{},[194142],{"type":23,"value":194143},"Contacts, leads, and companies may include names, email addresses, phone numbers, and addresses",{"type":17,"tag":84,"props":194145,"children":194146},{},[194147],{"type":23,"value":194148},"Applications should request only required fields",{"type":17,"tag":84,"props":194150,"children":194151},{},[194152],{"type":23,"value":194153},"For AI-driven use cases, MCP-based integrations support removing sensitive fields before data reaches downstream systems",{"type":17,"tag":239,"props":194155,"children":194157},{"id":194156},"controls-and-compliance",[194158],{"type":23,"value":194159},"Controls and Compliance",{"type":17,"tag":29,"props":194161,"children":194162},{},[194163],{"type":23,"value":194164},"Unified supports standard security controls:",{"type":17,"tag":80,"props":194166,"children":194167},{},[194168,194172,194177,194182,194187,194192],{"type":17,"tag":84,"props":194169,"children":194170},{},[194171],{"type":23,"value":94139},{"type":17,"tag":84,"props":194173,"children":194174},{},[194175],{"type":23,"value":194176},"GDPR, CCPA/CPRA, HIPAA, and PIPEDA alignment",{"type":17,"tag":84,"props":194178,"children":194179},{},[194180],{"type":23,"value":194181},"TLS 1.2+ in transit",{"type":17,"tag":84,"props":194183,"children":194184},{},[194185],{"type":23,"value":194186},"AES-256 encryption for minimal diagnostic fields",{"type":17,"tag":84,"props":194188,"children":194189},{},[194190],{"type":23,"value":194191},"SAML/OIDC SSO, role-based access, and IP allow-listing",{"type":17,"tag":84,"props":194193,"children":194194},{},[194195],{"type":23,"value":194196},"Optional external log forwarding for customer-owned observability",{"type":17,"tag":68,"props":194198,"children":194200},{"id":194199},"common-crm-api-integration-use-cases",[194201],{"type":23,"value":194202},"Common CRM API Integration Use Cases",{"type":17,"tag":239,"props":194204,"children":194206},{"id":194205},"sales-enablement-tools",[194207],{"type":23,"value":194208},"Sales Enablement Tools",{"type":17,"tag":29,"props":194210,"children":194211},{},[194212],{"type":23,"value":194213},"Surface contact, deal, and pipeline data to provide sales context and prioritization.",{"type":17,"tag":239,"props":194215,"children":194217},{"id":194216},"analytics-and-reporting",[194218],{"type":23,"value":194219},"Analytics and Reporting",{"type":17,"tag":29,"props":194221,"children":194222},{},[194223],{"type":23,"value":194224},"Aggregate CRM data to build custom dashboards for pipeline health, revenue forecasting, and activity trends.",{"type":17,"tag":239,"props":194226,"children":194228},{"id":194227},"ai-assisted-sales-products",[194229],{"type":23,"value":194230},"AI-Assisted Sales Products",{"type":17,"tag":29,"props":194232,"children":194233},{},[194234],{"type":23,"value":194235},"Analyze CRM data to identify opportunities, summarize accounts, or suggest next actions—while keeping CRM as the source of truth.",{"type":17,"tag":239,"props":194237,"children":194239},{"id":194238},"marketing-and-support-context",[194240],{"type":23,"value":194241},"Marketing and Support Context",{"type":17,"tag":29,"props":194243,"children":194244},{},[194245],{"type":23,"value":194246},"Enrich communication or support tools with CRM context without duplicating CRM data.",{"type":17,"tag":68,"props":194248,"children":194249},{"id":188461},[194250],{"type":23,"value":188464},{"type":17,"tag":29,"props":194252,"children":194253},{},[194254],{"type":23,"value":194255},"Unified is explicit about CRM limitations:",{"type":17,"tag":80,"props":194257,"children":194258},{},[194259,194264,194269,194274,194279],{"type":17,"tag":84,"props":194260,"children":194261},{},[194262],{"type":23,"value":194263},"Activity and pipeline updates require polling",{"type":17,"tag":84,"props":194265,"children":194266},{},[194267],{"type":23,"value":194268},"Write capabilities vary by provider",{"type":17,"tag":84,"props":194270,"children":194271},{},[194272],{"type":23,"value":194273},"Custom fields must be requested explicitly",{"type":17,"tag":84,"props":194275,"children":194276},{},[194277],{"type":23,"value":194278},"No guarantees of event ordering or idempotency",{"type":17,"tag":84,"props":194280,"children":194281},{},[194282],{"type":23,"value":194283},"Provider rate limits still apply",{"type":17,"tag":29,"props":194285,"children":194286},{},[194287],{"type":23,"value":194288},"These constraints reflect real CRM behavior and help avoid hidden assumptions.",{"type":17,"tag":68,"props":194290,"children":194292},{"id":194291},"build-vs-buy-crm-integrations",[194293],{"type":23,"value":194294},"Build vs Buy CRM Integrations",{"type":17,"tag":239,"props":194296,"children":194297},{"id":165021},[194298],{"type":23,"value":165024},{"type":17,"tag":80,"props":194300,"children":194301},{},[194302,194307,194312,194316],{"type":17,"tag":84,"props":194303,"children":194304},{},[194305],{"type":23,"value":194306},"Multiple CRM APIs to maintain",{"type":17,"tag":84,"props":194308,"children":194309},{},[194310],{"type":23,"value":194311},"Provider-specific auth and schemas",{"type":17,"tag":84,"props":194313,"children":194314},{},[194315],{"type":23,"value":187218},{"type":17,"tag":84,"props":194317,"children":194318},{},[194319],{"type":23,"value":194320},"Ongoing maintenance as CRMs evolve",{"type":17,"tag":239,"props":194322,"children":194324},{"id":194323},"using-a-unified-crm-api",[194325],{"type":23,"value":194326},"Using a Unified CRM API",{"type":17,"tag":80,"props":194328,"children":194329},{},[194330,194335,194340,194345,194349],{"type":17,"tag":84,"props":194331,"children":194332},{},[194333],{"type":23,"value":194334},"One CRM API surface across supported platforms",{"type":17,"tag":84,"props":194336,"children":194337},{},[194338],{"type":23,"value":194339},"Normalized objects and lifecycle semantics",{"type":17,"tag":84,"props":194341,"children":194342},{},[194343],{"type":23,"value":194344},"Live reads from source CRMs",{"type":17,"tag":84,"props":194346,"children":194347},{},[194348],{"type":23,"value":180731},{"type":17,"tag":84,"props":194350,"children":194351},{},[194352],{"type":23,"value":137967},{"type":17,"tag":68,"props":194354,"children":194356},{"id":194355},"best-practices-for-implementing-crm-apis",[194357],{"type":23,"value":194358},"Best Practices for Implementing CRM APIs",{"type":17,"tag":80,"props":194360,"children":194361},{},[194362,194367,194371,194376,194381,194393],{"type":17,"tag":84,"props":194363,"children":194364},{},[194365],{"type":23,"value":194366},"Treat CRM contacts as external customers, not employees",{"type":17,"tag":84,"props":194368,"children":194369},{},[194370],{"type":23,"value":193153},{"type":17,"tag":84,"props":194372,"children":194373},{},[194374],{"type":23,"value":194375},"Poll for activities and pipeline updates",{"type":17,"tag":84,"props":194377,"children":194378},{},[194379],{"type":23,"value":194380},"Request only required fields",{"type":17,"tag":84,"props":194382,"children":194383},{},[194384,194386,194391],{"type":23,"value":194385},"Handle ownership (",{"type":17,"tag":6121,"props":194387,"children":194389},{"className":194388},[],[194390],{"type":23,"value":62582},{"type":23,"value":194392},") separately from contact identity",{"type":17,"tag":84,"props":194394,"children":194395},{},[194396],{"type":23,"value":193173},{"type":17,"tag":68,"props":194398,"children":194400},{"id":194399},"build-crm-integrations-the-right-way",[194401],{"type":23,"value":194402},"Build CRM integrations the right way",{"type":17,"tag":29,"props":194404,"children":194405},{},[194406],{"type":23,"value":194407},"If your product depends on accurate customer data across multiple CRMs, maintaining separate integrations quickly becomes expensive and brittle.",{"type":17,"tag":29,"props":194409,"children":194410},{},[194411,194412,194416],{"type":23,"value":25244},{"type":17,"tag":48,"props":194413,"children":194414},{},[194415],{"type":23,"value":61565},{"type":23,"value":194417}," provides a consistent way to access and update customer-relationship data across supported platforms—without storing customer data or tying your product to a single vendor.",{"type":17,"tag":29,"props":194419,"children":194420},{},[194421,194425,194426],{"type":17,"tag":48,"props":194422,"children":194423},{},[194424],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":194427,"children":194429},{"href":1612,"rel":194428},[214],[194430],{"type":17,"tag":48,"props":194431,"children":194432},{},[194433],{"type":23,"value":1616},{"type":17,"tag":29,"props":194435,"children":194436},{},[194437],{"type":23,"value":194438},"Test CRM integrations with live data access and standardized objects.",{"type":17,"tag":29,"props":194440,"children":194441},{},[194442,194446,194447],{"type":17,"tag":48,"props":194443,"children":194444},{},[194445],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":194448,"children":194450},{"href":1623,"rel":194449},[214],[194451],{"type":17,"tag":48,"props":194452,"children":194453},{},[194454],{"type":23,"value":1627},{"type":17,"tag":29,"props":194456,"children":194457},{},[194458],{"type":23,"value":194459},"Discuss your CRM integration or data architecture with the team that built the platform.",{"type":17,"tag":68,"props":194461,"children":194462},{"id":95759},[194463],{"type":23,"value":95762},{"type":17,"tag":29,"props":194465,"children":194466},{},[194467],{"type":17,"tag":48,"props":194468,"children":194469},{},[194470],{"type":23,"value":61673},{"type":17,"tag":29,"props":194472,"children":194473},{},[194474],{"type":23,"value":194475},"An API that allows products to read and write customer-relationship data such as contacts, companies, deals, and activities.",{"type":17,"tag":29,"props":194477,"children":194478},{},[194479],{"type":17,"tag":48,"props":194480,"children":194481},{},[194482],{"type":23,"value":194483},"Which CRM platforms are supported?",{"type":17,"tag":29,"props":194485,"children":194486},{},[194487],{"type":23,"value":194488},"Unified supports platforms including Salesforce, HubSpot, Pipedrive, Zoho CRM, Microsoft Dynamics, Close, and Copper.",{"type":17,"tag":29,"props":194490,"children":194491},{},[194492],{"type":17,"tag":48,"props":194493,"children":194494},{},[194495],{"type":23,"value":194496},"Are CRM updates real time?",{"type":17,"tag":29,"props":194498,"children":194499},{},[194500],{"type":23,"value":194501},"Live reads always hit the source CRM. Updates are delivered via native or virtual webhooks where supported; activities and pipelines require polling.",{"type":17,"tag":29,"props":194503,"children":194504},{},[194505],{"type":17,"tag":48,"props":194506,"children":194507},{},[194508],{"type":23,"value":194509},"Can I create or update CRM records?",{"type":17,"tag":29,"props":194511,"children":194512},{},[194513],{"type":23,"value":194514},"Yes, subject to provider support. Deals, contacts, companies, and leads generally support write operations.",{"type":17,"tag":29,"props":194516,"children":194517},{},[194518],{"type":17,"tag":48,"props":194519,"children":194520},{},[194521],{"type":23,"value":194522},"Does the CRM API store customer data?",{"type":17,"tag":29,"props":194524,"children":194525},{},[194526],{"type":23,"value":194527},"No. CRM data is not stored at rest.",{"type":17,"tag":29,"props":194529,"children":194530},{},[194531],{"type":17,"tag":48,"props":194532,"children":194533},{},[194534],{"type":23,"value":194535},"How does CRM differ from marketing automation or ticketing?",{"type":17,"tag":29,"props":194537,"children":194538},{},[194539],{"type":23,"value":194540},"CRM manages sales relationships. Marketing automation executes campaigns. Ticketing systems manage support issues.",{"title":7,"searchDepth":1629,"depth":1629,"links":194542},[194543,194544,194545,194546,194550,194558,194559,194563,194568,194574,194575,194579,194580,194581],{"id":193398,"depth":1629,"text":193401},{"id":61670,"depth":1629,"text":193480},{"id":193537,"depth":1629,"text":193540},{"id":193609,"depth":1629,"text":193612,"children":194547},[194548,194549],{"id":193620,"depth":1635,"text":193623},{"id":193636,"depth":1635,"text":193639},{"id":193691,"depth":1629,"text":193694,"children":194551},[194552,194553,194554,194555,194556,194557],{"id":79044,"depth":1635,"text":63113},{"id":30404,"depth":1635,"text":31619},{"id":193819,"depth":1635,"text":56943},{"id":61705,"depth":1635,"text":63123},{"id":193879,"depth":1635,"text":193882},{"id":62603,"depth":1635,"text":63128},{"id":193943,"depth":1629,"text":193946},{"id":193996,"depth":1629,"text":193999,"children":194560},[194561,194562],{"id":100676,"depth":1635,"text":194004},{"id":194051,"depth":1635,"text":194054},{"id":164849,"depth":1629,"text":164852,"children":194564},[194565,194566,194567],{"id":90302,"depth":1635,"text":179326},{"id":194132,"depth":1635,"text":194135},{"id":194156,"depth":1635,"text":194159},{"id":194199,"depth":1629,"text":194202,"children":194569},[194570,194571,194572,194573],{"id":194205,"depth":1635,"text":194208},{"id":194216,"depth":1635,"text":194219},{"id":194227,"depth":1635,"text":194230},{"id":194238,"depth":1635,"text":194241},{"id":188461,"depth":1629,"text":188464},{"id":194291,"depth":1629,"text":194294,"children":194576},[194577,194578],{"id":165021,"depth":1635,"text":165024},{"id":194323,"depth":1635,"text":194326},{"id":194355,"depth":1629,"text":194358},{"id":194399,"depth":1629,"text":194402},{"id":95759,"depth":1629,"text":95762},"content:blog:crm_api_integration_real_time_customer_data_across_sales_pipelines.md","blog/crm_api_integration_real_time_customer_data_across_sales_pipelines.md","blog/crm_api_integration_real_time_customer_data_across_sales_pipelines",{"_path":194586,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":194587,"description":194588,"img":194589,"date":194590,"tag":12,"body":194591,"_type":1677,"_id":195835,"_source":1679,"_file":195836,"_stem":195837,"_extension":1682},"/blog/learning_management_system_lms_api_integration_real_time_course_data_and_learning_platforms","Learning Management System (LMS) API Integration: Real-Time Course Data and Learning Platforms","Learning products depend on accurate, up-to-date course and enrollment information. Course catalogs change, classes are activated or deactivated, learners...","https://s3.us-east-2.amazonaws.com/unified-article-images/learning_management_system_lms_api_integration_real_time_course_data_and_learning_platforms-icon.png","2026-02-07T00:37:00.000Z",{"type":14,"children":194592,"toc":195793},[194593,194598,194601,194608,194613,194622,194628,194633,194638,194644,194654,194658,194686,194692,194704,194735,194753,194758,194764,194769,194775,194780,194798,194809,194815,194833,194838,194844,194856,194861,194879,194884,194897,194915,194920,194956,194961,194984,194990,195008,195013,195026,195038,195043,195061,195066,195079,195085,195097,195102,195108,195114,195119,195125,195130,195136,195141,195147,195152,195158,195163,195169,195173,195178,195199,195204,195242,195248,195253,195278,195283,195289,195294,195312,195324,195329,195373,195379,195384,195388,195406,195412,195430,195435,195439,195466,195471,195477,195482,195509,195514,195518,195523,195551,195556,195562,195566,195589,195595,195621,195627,195661,195667,195672,195682,195698,195703,195719,195724,195728,195736,195741,195749,195754,195762,195767,195775,195780,195788],{"type":17,"tag":18,"props":194594,"children":194596},{"id":194595},"learning-management-system-lms-api-integration-real-time-course-data-and-learning-platforms",[194597],{"type":23,"value":194587},{"type":17,"tag":25,"props":194599,"children":194600},{},[],{"type":17,"tag":29,"props":194602,"children":194603},{},[194604],{"type":17,"tag":33,"props":194605,"children":194606},{},[194607],{"type":23,"value":191080},{"type":17,"tag":29,"props":194609,"children":194610},{},[194611],{"type":23,"value":194612},"Learning products depend on accurate, up-to-date course and enrollment information. Course catalogs change, classes are activated or deactivated, learners enroll and disengage, and instructors update content over time. When this data is delayed or duplicated, downstream analytics, reporting, and learning experiences break.",{"type":17,"tag":29,"props":194614,"children":194615},{},[194616,194620],{"type":17,"tag":133,"props":194617,"children":194618},{"href":54426},[194619],{"type":23,"value":54429},{"type":23,"value":194621}," integration exists to make learning data available programmatically—without scheduled sync jobs, duplicated storage, or brittle per-provider logic. In this guide, we'll explain what LMS API integration actually means, how real-time updates work in practice, which LMS data models matter, and how Unified's LMS API fits into a broader architecture alongside HR & Directory and ATS.",{"type":17,"tag":68,"props":194623,"children":194625},{"id":194624},"introduction-to-lms-api-integrations",[194626],{"type":23,"value":194627},"Introduction to LMS API Integrations",{"type":17,"tag":29,"props":194629,"children":194630},{},[194631],{"type":23,"value":194632},"Learning Management platforms such as Canvas, Moodle, Blackboard, Coursera, Google Classroom, and enterprise LMS tools manage courses, classes, instructors, and learners. They act as the system of record for learning content and participation.",{"type":17,"tag":29,"props":194634,"children":194635},{},[194636],{"type":23,"value":194637},"However, LMS platforms rarely operate in isolation. Learning analytics tools, internal enablement platforms, content marketplaces, compliance reporting tools, and AI-driven learning products all need access to LMS data. LMS API integration enables these products to retrieve and update learning data directly from LMS platforms—without manual exports or periodic synchronization.",{"type":17,"tag":68,"props":194639,"children":194641},{"id":194640},"what-is-lms-api-integration",[194642],{"type":23,"value":194643},"What Is LMS API Integration?",{"type":17,"tag":29,"props":194645,"children":194646},{},[194647,194652],{"type":17,"tag":48,"props":194648,"children":194649},{},[194650],{"type":23,"value":194651},"LMS API integration",{"type":23,"value":194653}," is the process of connecting software products to learning-management platforms via APIs in order to programmatically access course and learner data.",{"type":17,"tag":29,"props":194655,"children":194656},{},[194657],{"type":23,"value":167214},{"type":17,"tag":80,"props":194659,"children":194660},{},[194661,194666,194671,194676,194681],{"type":17,"tag":84,"props":194662,"children":194663},{},[194664],{"type":23,"value":194665},"Retrieving courses and classes",{"type":17,"tag":84,"props":194667,"children":194668},{},[194669],{"type":23,"value":194670},"Managing learners and instructors",{"type":17,"tag":84,"props":194672,"children":194673},{},[194674],{"type":23,"value":194675},"Tracking enrollments and course activation state",{"type":17,"tag":84,"props":194677,"children":194678},{},[194679],{"type":23,"value":194680},"Monitoring course updates over time",{"type":17,"tag":84,"props":194682,"children":194683},{},[194684],{"type":23,"value":194685},"Combining learning data with analytics or reporting tools",{"type":17,"tag":68,"props":194687,"children":194689},{"id":194688},"lms-api-vs-hr-directory-api-vs-ats",[194690],{"type":23,"value":194691},"LMS API vs HR & Directory API vs ATS",{"type":17,"tag":29,"props":194693,"children":194694},{},[194695,194697,194702],{"type":23,"value":194696},"Unified treats learning, employment, and recruiting as ",{"type":17,"tag":48,"props":194698,"children":194699},{},[194700],{"type":23,"value":194701},"distinct categories",{"type":23,"value":194703},", with explicit boundaries.",{"type":17,"tag":80,"props":194705,"children":194706},{},[194707,194717,194726],{"type":17,"tag":84,"props":194708,"children":194709},{},[194710,194715],{"type":17,"tag":48,"props":194711,"children":194712},{},[194713],{"type":23,"value":194714},"LMS APIs",{"type":23,"value":194716}," handle learning content and participation: courses, classes, students, and instructors.",{"type":17,"tag":84,"props":194718,"children":194719},{},[194720,194724],{"type":17,"tag":48,"props":194721,"children":194722},{},[194723],{"type":23,"value":193574},{"type":23,"value":194725}," handle employment: employees, org structure, locations, benefits, and payroll artifacts.",{"type":17,"tag":84,"props":194727,"children":194728},{},[194729,194733],{"type":17,"tag":48,"props":194730,"children":194731},{},[194732],{"type":23,"value":189036},{"type":23,"value":194734}," handle recruiting: candidates, applications, interviews, and hiring decisions.",{"type":17,"tag":29,"props":194736,"children":194737},{},[194738,194740,194745,194746,194751],{"type":23,"value":194739},"LMS identities are ",{"type":17,"tag":48,"props":194741,"children":194742},{},[194743],{"type":23,"value":194744},"not employees",{"type":23,"value":34435},{"type":17,"tag":48,"props":194747,"children":194748},{},[194749],{"type":23,"value":194750},"not candidates",{"type":23,"value":194752},". Enrolling in a course does not imply employment or hiring status. Any relationship between learning data and HR or recruiting data must be defined explicitly by the application.",{"type":17,"tag":29,"props":194754,"children":194755},{},[194756],{"type":23,"value":194757},"This separation avoids incorrect assumptions and supports real-world use cases such as external learners, contractors, partners, and mixed audiences.",{"type":17,"tag":68,"props":194759,"children":194761},{"id":194760},"real-time-vs-batch-lms-data-access",[194762],{"type":23,"value":194763},"Real-Time vs Batch LMS Data Access",{"type":17,"tag":29,"props":194765,"children":194766},{},[194767],{"type":23,"value":194768},"Many LMS integrations rely on scheduled polling or database replication. That approach introduces delays and increases operational risk.",{"type":17,"tag":239,"props":194770,"children":194772},{"id":194771},"understanding-real-time-lms-api-architecture",[194773],{"type":23,"value":194774},"Understanding Real-Time LMS API Architecture",{"type":17,"tag":29,"props":194776,"children":194777},{},[194778],{"type":23,"value":194779},"A real-time LMS API:",{"type":17,"tag":80,"props":194781,"children":194782},{},[194783,194788,194793],{"type":17,"tag":84,"props":194784,"children":194785},{},[194786],{"type":23,"value":194787},"Routes requests directly to the source LMS",{"type":17,"tag":84,"props":194789,"children":194790},{},[194791],{"type":23,"value":194792},"Avoids cached replicas or background synchronization",{"type":17,"tag":84,"props":194794,"children":194795},{},[194796],{"type":23,"value":194797},"Reflects changes based on provider capabilities",{"type":17,"tag":29,"props":194799,"children":194800},{},[194801,194803,194807],{"type":23,"value":194802},"Unified's LMS API uses a ",{"type":17,"tag":48,"props":194804,"children":194805},{},[194806],{"type":23,"value":86921},{"type":23,"value":194808},". API calls are routed directly to the underlying LMS platforms, and Unified does not store LMS data at rest.",{"type":17,"tag":239,"props":194810,"children":194812},{"id":194811},"where-real-time-applies-today",[194813],{"type":23,"value":194814},"Where Real-Time Applies Today",{"type":17,"tag":29,"props":194816,"children":194817},{},[194818,194820,194825,194827,194831],{"type":23,"value":194819},"LMS platforms vary significantly in their support for event delivery. Unified supports real-time updates for ",{"type":17,"tag":48,"props":194821,"children":194822},{},[194823],{"type":23,"value":194824},"course objects",{"type":23,"value":194826}," via native or [virtual ",{"type":17,"tag":133,"props":194828,"children":194829},{"href":4999},[194830],{"type":23,"value":5002},{"type":23,"value":194832},"](/blog/unlock_real_time_data_with_virtual_webhooks) where the provider allows it. For other objects—such as students, instructors, classes, or enrollments—applications must rely on incremental polling using list endpoints and timestamp filters.",{"type":17,"tag":29,"props":194834,"children":194835},{},[194836],{"type":23,"value":194837},"This conservative approach ensures accuracy without overclaiming provider capabilities.",{"type":17,"tag":68,"props":194839,"children":194841},{"id":194840},"core-lms-data-models-and-how-they-behave",[194842],{"type":23,"value":194843},"Core LMS Data Models (and How They Behave)",{"type":17,"tag":29,"props":194845,"children":194846},{},[194847,194849,194854],{"type":23,"value":194848},"Unified normalizes learning data ",{"type":17,"tag":48,"props":194850,"children":194851},{},[194852],{"type":23,"value":194853},"within the LMS category",{"type":23,"value":194855},", providing consistent objects across supported platforms. Real-world behavior is constrained by provider support and should be handled defensively.",{"type":17,"tag":239,"props":194857,"children":194858},{"id":54444},[194859],{"type":23,"value":194860},"Courses",{"type":17,"tag":80,"props":194862,"children":194863},{},[194864,194869,194874],{"type":17,"tag":84,"props":194865,"children":194866},{},[194867],{"type":23,"value":194868},"Represent learning content or curricula",{"type":17,"tag":84,"props":194870,"children":194871},{},[194872],{"type":23,"value":194873},"Support create, list, retrieve, update, and remove operations at the API level",{"type":17,"tag":84,"props":194875,"children":194876},{},[194877],{"type":23,"value":194878},"Include fields such as name, description, active state, languages, categories, pricing information, and media references",{"type":17,"tag":29,"props":194880,"children":194881},{},[194882],{"type":23,"value":194883},"Important constraints:",{"type":17,"tag":80,"props":194885,"children":194886},{},[194887,194892],{"type":17,"tag":84,"props":194888,"children":194889},{},[194890],{"type":23,"value":194891},"Only a limited set of fields (such as activation status) may be writable across providers",{"type":17,"tag":84,"props":194893,"children":194894},{},[194895],{"type":23,"value":194896},"Course updates may be read-only on some LMS platforms",{"type":17,"tag":29,"props":194898,"children":194899},{},[194900,194902,194907,194908,194913],{"type":23,"value":194901},"Courses include arrays of ",{"type":17,"tag":6121,"props":194903,"children":194905},{"className":194904},[],[194906],{"type":23,"value":154482},{"type":23,"value":34435},{"type":17,"tag":6121,"props":194909,"children":194911},{"className":194910},[],[194912],{"type":23,"value":151768},{"type":23,"value":194914},", which represent enrollments implicitly.",{"type":17,"tag":239,"props":194916,"children":194918},{"id":194917},"classes",[194919],{"type":23,"value":154206},{"type":17,"tag":80,"props":194921,"children":194922},{},[194923,194928,194940],{"type":17,"tag":84,"props":194924,"children":194925},{},[194926],{"type":23,"value":194927},"Represent specific offerings or sessions of a course",{"type":17,"tag":84,"props":194929,"children":194930},{},[194931,194933,194938],{"type":23,"value":194932},"Include a required ",{"type":17,"tag":6121,"props":194934,"children":194936},{"className":194935},[],[194937],{"type":23,"value":152743},{"type":23,"value":194939}," linking them to a course",{"type":17,"tag":84,"props":194941,"children":194942},{},[194943,194945,194950,194951],{"type":23,"value":194944},"Contain arrays of ",{"type":17,"tag":6121,"props":194946,"children":194948},{"className":194947},[],[194949],{"type":23,"value":154482},{"type":23,"value":34435},{"type":17,"tag":6121,"props":194952,"children":194954},{"className":194953},[],[194955],{"type":23,"value":151768},{"type":17,"tag":29,"props":194957,"children":194958},{},[194959],{"type":23,"value":194960},"Current reality:",{"type":17,"tag":80,"props":194962,"children":194963},{},[194964,194969,194979],{"type":17,"tag":84,"props":194965,"children":194966},{},[194967],{"type":23,"value":194968},"The unified schema includes Class objects",{"type":17,"tag":84,"props":194970,"children":194971},{},[194972,194977],{"type":17,"tag":48,"props":194973,"children":194974},{},[194975],{"type":23,"value":194976},"Provider support is currently limited",{"type":23,"value":194978},", and some integrations do not support classes at all",{"type":17,"tag":84,"props":194980,"children":194981},{},[194982],{"type":23,"value":194983},"Applications should be prepared to handle unsupported-resource responses",{"type":17,"tag":239,"props":194985,"children":194987},{"id":194986},"students",[194988],{"type":23,"value":194989},"Students",{"type":17,"tag":80,"props":194991,"children":194992},{},[194993,194998,195003],{"type":17,"tag":84,"props":194994,"children":194995},{},[194996],{"type":23,"value":194997},"Represent learners within an LMS",{"type":17,"tag":84,"props":194999,"children":195000},{},[195001],{"type":23,"value":195002},"Include basic personal and contact fields (names, emails, phone numbers, address, image)",{"type":17,"tag":84,"props":195004,"children":195005},{},[195006],{"type":23,"value":195007},"Support list and retrieve operations across all providers",{"type":17,"tag":29,"props":195009,"children":195010},{},[195011],{"type":23,"value":195012},"Write support varies:",{"type":17,"tag":80,"props":195014,"children":195015},{},[195016,195021],{"type":17,"tag":84,"props":195017,"children":195018},{},[195019],{"type":23,"value":195020},"Some LMS platforms allow creating or updating students",{"type":17,"tag":84,"props":195022,"children":195023},{},[195024],{"type":23,"value":195025},"Others treat students as read-only and manage them internally",{"type":17,"tag":29,"props":195027,"children":195028},{},[195029,195031,195036],{"type":23,"value":195030},"There is ",{"type":17,"tag":48,"props":195032,"children":195033},{},[195034],{"type":23,"value":195035},"no employee or candidate identifier",{"type":23,"value":195037}," on the Student object.",{"type":17,"tag":239,"props":195039,"children":195040},{"id":54454},[195041],{"type":23,"value":195042},"Instructors",{"type":17,"tag":80,"props":195044,"children":195045},{},[195046,195051,195056],{"type":17,"tag":84,"props":195047,"children":195048},{},[195049],{"type":23,"value":195050},"Represent educators or facilitators",{"type":17,"tag":84,"props":195052,"children":195053},{},[195054],{"type":23,"value":195055},"Include profile and contact information",{"type":17,"tag":84,"props":195057,"children":195058},{},[195059],{"type":23,"value":195060},"Support list and retrieve operations across providers",{"type":17,"tag":29,"props":195062,"children":195063},{},[195064],{"type":23,"value":195065},"As with students:",{"type":17,"tag":80,"props":195067,"children":195068},{},[195069,195074],{"type":17,"tag":84,"props":195070,"children":195071},{},[195072],{"type":23,"value":195073},"Write capabilities depend on the LMS",{"type":17,"tag":84,"props":195075,"children":195076},{},[195077],{"type":23,"value":195078},"Some providers restrict external updates",{"type":17,"tag":239,"props":195080,"children":195082},{"id":195081},"provider-specific-fields",[195083],{"type":23,"value":195084},"Provider-Specific Fields",{"type":17,"tag":29,"props":195086,"children":195087},{},[195088,195090,195095],{"type":23,"value":195089},"Unified normalizes core learning fields while still making ",{"type":17,"tag":48,"props":195091,"children":195092},{},[195093],{"type":23,"value":195094},"provider-specific fields available when required",{"type":23,"value":195096},". This removes per-provider schema differences while preserving access to LMS-specific attributes.",{"type":17,"tag":29,"props":195098,"children":195099},{},[195100],{"type":23,"value":195101},"Normalization stops where providers diverge. Unified does not infer learning semantics or fabricate missing fields.",{"type":17,"tag":68,"props":195103,"children":195105},{"id":195104},"common-lms-api-integration-use-cases",[195106],{"type":23,"value":195107},"Common LMS API Integration Use Cases",{"type":17,"tag":239,"props":195109,"children":195111},{"id":195110},"learning-analytics-reporting",[195112],{"type":23,"value":195113},"Learning Analytics & Reporting",{"type":17,"tag":29,"props":195115,"children":195116},{},[195117],{"type":23,"value":195118},"Aggregate course catalogs, enrollment counts, and activation status across multiple LMS platforms to support centralized reporting.",{"type":17,"tag":239,"props":195120,"children":195122},{"id":195121},"internal-enablement-platforms",[195123],{"type":23,"value":195124},"Internal Enablement Platforms",{"type":17,"tag":29,"props":195126,"children":195127},{},[195128],{"type":23,"value":195129},"Connect LMS data to internal tools that surface available training, track participation, or recommend learning paths.",{"type":17,"tag":239,"props":195131,"children":195133},{"id":195132},"course-marketplaces-content-distribution",[195134],{"type":23,"value":195135},"Course Marketplaces & Content Distribution",{"type":17,"tag":29,"props":195137,"children":195138},{},[195139],{"type":23,"value":195140},"Integrate learning content providers with LMS platforms to provision courses, manage availability, and monitor updates.",{"type":17,"tag":239,"props":195142,"children":195144},{"id":195143},"compliance-audit-reporting",[195145],{"type":23,"value":195146},"Compliance & Audit Reporting",{"type":17,"tag":29,"props":195148,"children":195149},{},[195150],{"type":23,"value":195151},"Retrieve course and enrollment data to support audits, certifications, and training compliance requirements.",{"type":17,"tag":239,"props":195153,"children":195155},{"id":195154},"ai-assisted-learning-products",[195156],{"type":23,"value":195157},"AI-Assisted Learning Products",{"type":17,"tag":29,"props":195159,"children":195160},{},[195161],{"type":23,"value":195162},"Use course metadata and enrollment signals as inputs to AI systems that recommend content or analyze engagement—while keeping LMS data as the source of truth.",{"type":17,"tag":68,"props":195164,"children":195166},{"id":195165},"how-lms-real-time-updates-work",[195167],{"type":23,"value":195168},"How LMS Real-Time Updates Work",{"type":17,"tag":239,"props":195170,"children":195171},{"id":100676},[195172],{"type":23,"value":194004},{"type":17,"tag":29,"props":195174,"children":195175},{},[195176],{"type":23,"value":195177},"Unified uses a hybrid event-delivery model:",{"type":17,"tag":80,"props":195179,"children":195180},{},[195181,195190],{"type":17,"tag":84,"props":195182,"children":195183},{},[195184,195188],{"type":17,"tag":48,"props":195185,"children":195186},{},[195187],{"type":23,"value":9024},{"type":23,"value":195189}," are forwarded immediately when supported by the LMS provider",{"type":17,"tag":84,"props":195191,"children":195192},{},[195193,195197],{"type":17,"tag":48,"props":195194,"children":195195},{},[195196],{"type":23,"value":9256},{"type":23,"value":195198}," poll the source LMS at a configurable interval and emit events when changes are detected",{"type":17,"tag":29,"props":195200,"children":195201},{},[195202],{"type":23,"value":195203},"Today:",{"type":17,"tag":80,"props":195205,"children":195206},{},[195207,195217,195237],{"type":17,"tag":84,"props":195208,"children":195209},{},[195210,195212],{"type":23,"value":195211},"Webhooks are available ",{"type":17,"tag":48,"props":195213,"children":195214},{},[195215],{"type":23,"value":195216},"only for Course objects",{"type":17,"tag":84,"props":195218,"children":195219},{},[195220,195222,195228,195229,195235],{"type":23,"value":195221},"Only ",{"type":17,"tag":6121,"props":195223,"children":195225},{"className":195224},[],[195226],{"type":23,"value":195227},"course.created",{"type":23,"value":34435},{"type":17,"tag":6121,"props":195230,"children":195232},{"className":195231},[],[195233],{"type":23,"value":195234},"course.updated",{"type":23,"value":195236}," events are supported",{"type":17,"tag":84,"props":195238,"children":195239},{},[195240],{"type":23,"value":195241},"SAP SuccessFactors is currently the only LMS provider with course webhook support",{"type":17,"tag":239,"props":195243,"children":195245},{"id":195244},"polling-for-other-objects",[195246],{"type":23,"value":195247},"Polling for Other Objects",{"type":17,"tag":29,"props":195249,"children":195250},{},[195251],{"type":23,"value":195252},"For classes, students, instructors, enrollments, progress, or completion data:",{"type":17,"tag":80,"props":195254,"children":195255},{},[195256,195261,195273],{"type":17,"tag":84,"props":195257,"children":195258},{},[195259],{"type":23,"value":195260},"Applications must call list endpoints",{"type":17,"tag":84,"props":195262,"children":195263},{},[195264,195266,195271],{"type":23,"value":195265},"Use filters such as ",{"type":17,"tag":6121,"props":195267,"children":195269},{"className":195268},[],[195270],{"type":23,"value":26291},{"type":23,"value":195272}," to retrieve incremental changes",{"type":17,"tag":84,"props":195274,"children":195275},{},[195276],{"type":23,"value":195277},"Polling frequency determines update latency",{"type":17,"tag":29,"props":195279,"children":195280},{},[195281],{"type":23,"value":195282},"This model avoids hidden sync behavior and keeps update logic explicit.",{"type":17,"tag":68,"props":195284,"children":195286},{"id":195285},"authentication-permissions-and-connection-health",[195287],{"type":23,"value":195288},"Authentication, Permissions, and Connection Health",{"type":17,"tag":29,"props":195290,"children":195291},{},[195292],{"type":23,"value":195293},"Unified abstracts LMS authentication complexity:",{"type":17,"tag":80,"props":195295,"children":195296},{},[195297,195302,195307],{"type":17,"tag":84,"props":195298,"children":195299},{},[195300],{"type":23,"value":195301},"OAuth-based and token-based flows are handled automatically",{"type":17,"tag":84,"props":195303,"children":195304},{},[195305],{"type":23,"value":195306},"Unified scopes map to provider-specific permissions",{"type":17,"tag":84,"props":195308,"children":195309},{},[195310],{"type":23,"value":195311},"Embedded authorization components or manual flows are supported",{"type":17,"tag":29,"props":195313,"children":195314},{},[195315,195317,195322],{"type":23,"value":195316},"Connections are identified by a ",{"type":17,"tag":48,"props":195318,"children":195319},{},[195320],{"type":23,"value":195321},"connection ID",{"type":23,"value":195323},", not credentials.",{"type":17,"tag":29,"props":195325,"children":195326},{},[195327],{"type":23,"value":195328},"Unified manages:",{"type":17,"tag":80,"props":195330,"children":195331},{},[195332,195337,195342,195347],{"type":17,"tag":84,"props":195333,"children":195334},{},[195335],{"type":23,"value":195336},"Credential exchange and refresh",{"type":17,"tag":84,"props":195338,"children":195339},{},[195340],{"type":23,"value":195341},"Provider-specific authentication behavior",{"type":17,"tag":84,"props":195343,"children":195344},{},[195345],{"type":23,"value":195346},"Standardized error responses",{"type":17,"tag":84,"props":195348,"children":195349},{},[195350,195352,195358,195359,195365,195366,195372],{"type":23,"value":195351},"Connection health states (",{"type":17,"tag":6121,"props":195353,"children":195355},{"className":195354},[],[195356],{"type":23,"value":195357},"healthy",{"type":23,"value":11826},{"type":17,"tag":6121,"props":195360,"children":195362},{"className":195361},[],[195363],{"type":23,"value":195364},"unhealthy",{"type":23,"value":11826},{"type":17,"tag":6121,"props":195367,"children":195369},{"className":195368},[],[195370],{"type":23,"value":195371},"needs_reconnect",{"type":23,"value":12034},{"type":17,"tag":68,"props":195374,"children":195376},{"id":195375},"security-privacy-and-data-handling-for-lms-data",[195377],{"type":23,"value":195378},"Security, Privacy, and Data Handling for LMS Data",{"type":17,"tag":29,"props":195380,"children":195381},{},[195382],{"type":23,"value":195383},"Learning data often includes personal information. Unified's architecture minimizes exposure by design.",{"type":17,"tag":239,"props":195385,"children":195386},{"id":17064},[195387],{"type":23,"value":53239},{"type":17,"tag":80,"props":195389,"children":195390},{},[195391,195396,195401],{"type":17,"tag":84,"props":195392,"children":195393},{},[195394],{"type":23,"value":195395},"No LMS data is stored at rest",{"type":17,"tag":84,"props":195397,"children":195398},{},[195399],{"type":23,"value":195400},"No payloads are cached or mirrored",{"type":17,"tag":84,"props":195402,"children":195403},{},[195404],{"type":23,"value":195405},"Requests are stateless and routed directly to the source platform",{"type":17,"tag":239,"props":195407,"children":195409},{"id":195408},"content-and-media-handling",[195410],{"type":23,"value":195411},"Content and Media Handling",{"type":17,"tag":80,"props":195413,"children":195414},{},[195415,195420,195425],{"type":17,"tag":84,"props":195416,"children":195417},{},[195418],{"type":23,"value":195419},"Course files and media are accessed via time-limited download URLs",{"type":17,"tag":84,"props":195421,"children":195422},{},[195423],{"type":23,"value":195424},"URLs typically expire after one hour",{"type":17,"tag":84,"props":195426,"children":195427},{},[195428],{"type":23,"value":195429},"Unified does not retain or cache course content",{"type":17,"tag":29,"props":195431,"children":195432},{},[195433],{"type":23,"value":195434},"There is no evidence of media streaming through Unified infrastructure; downloads occur directly from the source provider.",{"type":17,"tag":239,"props":195436,"children":195437},{"id":194156},[195438],{"type":23,"value":194159},{"type":17,"tag":80,"props":195440,"children":195441},{},[195442,195446,195451,195456,195461],{"type":17,"tag":84,"props":195443,"children":195444},{},[195445],{"type":23,"value":94139},{"type":17,"tag":84,"props":195447,"children":195448},{},[195449],{"type":23,"value":195450},"GDPR, CCPA/CPRA, PIPEDA, HIPAA",{"type":17,"tag":84,"props":195452,"children":195453},{},[195454],{"type":23,"value":195455},"TLS 1.2+ in transit, AES-256 for minimal operational metadata",{"type":17,"tag":84,"props":195457,"children":195458},{},[195459],{"type":23,"value":195460},"SAML/OIDC SSO, role-based access, IP allowlisting",{"type":17,"tag":84,"props":195462,"children":195463},{},[195464],{"type":23,"value":195465},"Optional log streaming to customer-owned monitoring tools",{"type":17,"tag":29,"props":195467,"children":195468},{},[195469],{"type":23,"value":195470},"PII masking options (such as hiding names or contact details) are available via MCP configuration for downstream consumers.",{"type":17,"tag":68,"props":195472,"children":195474},{"id":195473},"lms-identity-distinct-from-hr-and-recruiting",[195475],{"type":23,"value":195476},"LMS Identity: Distinct from HR and Recruiting",{"type":17,"tag":29,"props":195478,"children":195479},{},[195480],{"type":23,"value":195481},"LMS identities are intentionally isolated:",{"type":17,"tag":80,"props":195483,"children":195484},{},[195485,195493,195501],{"type":17,"tag":84,"props":195486,"children":195487},{},[195488],{"type":17,"tag":48,"props":195489,"children":195490},{},[195491],{"type":23,"value":195492},"Students and instructors are not employees",{"type":17,"tag":84,"props":195494,"children":195495},{},[195496],{"type":17,"tag":48,"props":195497,"children":195498},{},[195499],{"type":23,"value":195500},"Enrollments do not imply employment or hiring status",{"type":17,"tag":84,"props":195502,"children":195503},{},[195504],{"type":17,"tag":48,"props":195505,"children":195506},{},[195507],{"type":23,"value":195508},"No HR or ATS identifiers appear in LMS objects",{"type":17,"tag":29,"props":195510,"children":195511},{},[195512],{"type":23,"value":195513},"Any linkage between learning data and HR or recruiting data must be defined explicitly by the application. This design prevents accidental coupling and supports mixed learning audiences.",{"type":17,"tag":68,"props":195515,"children":195516},{"id":188461},[195517],{"type":23,"value":188464},{"type":17,"tag":29,"props":195519,"children":195520},{},[195521],{"type":23,"value":195522},"Unified is explicit about LMS limitations:",{"type":17,"tag":80,"props":195524,"children":195525},{},[195526,195531,195536,195541,195546],{"type":17,"tag":84,"props":195527,"children":195528},{},[195529],{"type":23,"value":195530},"Provider coverage is narrower than HR or ATS today",{"type":17,"tag":84,"props":195532,"children":195533},{},[195534],{"type":23,"value":195535},"Write support varies by LMS platform",{"type":17,"tag":84,"props":195537,"children":195538},{},[195539],{"type":23,"value":195540},"Classes may be unsupported depending on provider",{"type":17,"tag":84,"props":195542,"children":195543},{},[195544],{"type":23,"value":195545},"No webhooks for enrollments, progress, or completion events",{"type":17,"tag":84,"props":195547,"children":195548},{},[195549],{"type":23,"value":195550},"Polling is required for most real-time learning signals",{"type":17,"tag":29,"props":195552,"children":195553},{},[195554],{"type":23,"value":195555},"These constraints are intentional. Unified provides reliable learning primitives without assuming provider behavior that doesn't exist.",{"type":17,"tag":68,"props":195557,"children":195559},{"id":195558},"build-vs-buy-lms-api-integrations",[195560],{"type":23,"value":195561},"Build vs Buy LMS API Integrations",{"type":17,"tag":239,"props":195563,"children":195564},{"id":165021},[195565],{"type":23,"value":165024},{"type":17,"tag":80,"props":195567,"children":195568},{},[195569,195574,195579,195584],{"type":17,"tag":84,"props":195570,"children":195571},{},[195572],{"type":23,"value":195573},"Multiple LMS APIs to learn and maintain",{"type":17,"tag":84,"props":195575,"children":195576},{},[195577],{"type":23,"value":195578},"Provider-specific authentication and schemas",{"type":17,"tag":84,"props":195580,"children":195581},{},[195582],{"type":23,"value":195583},"Custom polling and reconciliation logic",{"type":17,"tag":84,"props":195585,"children":195586},{},[195587],{"type":23,"value":195588},"Ongoing maintenance as LMS platforms evolve",{"type":17,"tag":239,"props":195590,"children":195592},{"id":195591},"using-a-unified-lms-api",[195593],{"type":23,"value":195594},"Using a Unified LMS API",{"type":17,"tag":80,"props":195596,"children":195597},{},[195598,195603,195608,195613,195617],{"type":17,"tag":84,"props":195599,"children":195600},{},[195601],{"type":23,"value":195602},"One LMS API surface across supported platforms",{"type":17,"tag":84,"props":195604,"children":195605},{},[195606],{"type":23,"value":195607},"Consistent objects and pagination patterns",{"type":17,"tag":84,"props":195609,"children":195610},{},[195611],{"type":23,"value":195612},"Real-time course updates where available",{"type":17,"tag":84,"props":195614,"children":195615},{},[195616],{"type":23,"value":180731},{"type":17,"tag":84,"props":195618,"children":195619},{},[195620],{"type":23,"value":137967},{"type":17,"tag":68,"props":195622,"children":195624},{"id":195623},"best-practices-for-implementing-lms-api-integrations",[195625],{"type":23,"value":195626},"Best Practices for Implementing LMS API Integrations",{"type":17,"tag":80,"props":195628,"children":195629},{},[195630,195635,195640,195651,195656],{"type":17,"tag":84,"props":195631,"children":195632},{},[195633],{"type":23,"value":195634},"Treat LMS identities as distinct from HR and ATS",{"type":17,"tag":84,"props":195636,"children":195637},{},[195638],{"type":23,"value":195639},"Design defensively for provider variability",{"type":17,"tag":84,"props":195641,"children":195642},{},[195643,195645,195650],{"type":23,"value":195644},"Use polling with ",{"type":17,"tag":6121,"props":195646,"children":195648},{"className":195647},[],[195649],{"type":23,"value":26291},{"type":23,"value":26293},{"type":17,"tag":84,"props":195652,"children":195653},{},[195654],{"type":23,"value":195655},"Avoid assuming enrollment or progress events exist",{"type":17,"tag":84,"props":195657,"children":195658},{},[195659],{"type":23,"value":195660},"Monitor connection health and provider support matrices",{"type":17,"tag":68,"props":195662,"children":195664},{"id":195663},"build-lms-integrations-the-right-way",[195665],{"type":23,"value":195666},"Build LMS integrations the right way",{"type":17,"tag":29,"props":195668,"children":195669},{},[195670],{"type":23,"value":195671},"If your product depends on accurate learning data—course catalogs, enrollments, or instructor profiles—scheduled syncs and per-provider LMS integrations introduce unnecessary complexity.",{"type":17,"tag":29,"props":195673,"children":195674},{},[195675,195676,195680],{"type":23,"value":25244},{"type":17,"tag":48,"props":195677,"children":195678},{},[195679],{"type":23,"value":54429},{"type":23,"value":195681}," provides real-time, authorized access to learning data across supported platforms, without storing customer data or forcing you to maintain provider-specific logic.",{"type":17,"tag":29,"props":195683,"children":195684},{},[195685,195689,195690],{"type":17,"tag":48,"props":195686,"children":195687},{},[195688],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":195691,"children":195693},{"href":1612,"rel":195692},[214],[195694],{"type":17,"tag":48,"props":195695,"children":195696},{},[195697],{"type":23,"value":1616},{"type":17,"tag":29,"props":195699,"children":195700},{},[195701],{"type":23,"value":195702},"Test LMS integrations with real-time course updates and direct API access.",{"type":17,"tag":29,"props":195704,"children":195705},{},[195706,195710,195711],{"type":17,"tag":48,"props":195707,"children":195708},{},[195709],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":195712,"children":195714},{"href":1623,"rel":195713},[214],[195715],{"type":17,"tag":48,"props":195716,"children":195717},{},[195718],{"type":23,"value":1627},{"type":17,"tag":29,"props":195720,"children":195721},{},[195722],{"type":23,"value":195723},"Talk through your LMS, HR, or learning-analytics use case with the team that built the platform.",{"type":17,"tag":68,"props":195725,"children":195726},{"id":95759},[195727],{"type":23,"value":95762},{"type":17,"tag":29,"props":195729,"children":195730},{},[195731],{"type":17,"tag":48,"props":195732,"children":195733},{},[195734],{"type":23,"value":195735},"What is LMS API integration?",{"type":17,"tag":29,"props":195737,"children":195738},{},[195739],{"type":23,"value":195740},"Connecting software to learning-management platforms via APIs to retrieve and update course and learner data programmatically.",{"type":17,"tag":29,"props":195742,"children":195743},{},[195744],{"type":17,"tag":48,"props":195745,"children":195746},{},[195747],{"type":23,"value":195748},"Which LMS platforms are supported?",{"type":17,"tag":29,"props":195750,"children":195751},{},[195752],{"type":23,"value":195753},"Unified currently supports platforms such as Coursera, D2L Brightspace, Google Classroom, LinkedIn Learning, and SAP SuccessFactors LMS.",{"type":17,"tag":29,"props":195755,"children":195756},{},[195757],{"type":17,"tag":48,"props":195758,"children":195759},{},[195760],{"type":23,"value":195761},"Is LMS data real-time?",{"type":17,"tag":29,"props":195763,"children":195764},{},[195765],{"type":23,"value":195766},"Course updates can be delivered via native or virtual webhooks where supported. Other objects require incremental polling.",{"type":17,"tag":29,"props":195768,"children":195769},{},[195770],{"type":17,"tag":48,"props":195771,"children":195772},{},[195773],{"type":23,"value":195774},"Can I create or update learners via the LMS API?",{"type":17,"tag":29,"props":195776,"children":195777},{},[195778],{"type":23,"value":195779},"Write support depends on the LMS provider. Some platforms allow updates; others are read-only.",{"type":17,"tag":29,"props":195781,"children":195782},{},[195783],{"type":17,"tag":48,"props":195784,"children":195785},{},[195786],{"type":23,"value":195787},"How does LMS data relate to HR data?",{"type":17,"tag":29,"props":195789,"children":195790},{},[195791],{"type":23,"value":195792},"LMS data is separate from HR data. Any linkage must be defined explicitly by the application.",{"title":7,"searchDepth":1629,"depth":1629,"links":195794},[195795,195796,195797,195798,195802,195809,195816,195820,195821,195826,195827,195828,195832,195833,195834],{"id":194624,"depth":1629,"text":194627},{"id":194640,"depth":1629,"text":194643},{"id":194688,"depth":1629,"text":194691},{"id":194760,"depth":1629,"text":194763,"children":195799},[195800,195801],{"id":194771,"depth":1635,"text":194774},{"id":194811,"depth":1635,"text":194814},{"id":194840,"depth":1629,"text":194843,"children":195803},[195804,195805,195806,195807,195808],{"id":54444,"depth":1635,"text":194860},{"id":194917,"depth":1635,"text":154206},{"id":194986,"depth":1635,"text":194989},{"id":54454,"depth":1635,"text":195042},{"id":195081,"depth":1635,"text":195084},{"id":195104,"depth":1629,"text":195107,"children":195810},[195811,195812,195813,195814,195815],{"id":195110,"depth":1635,"text":195113},{"id":195121,"depth":1635,"text":195124},{"id":195132,"depth":1635,"text":195135},{"id":195143,"depth":1635,"text":195146},{"id":195154,"depth":1635,"text":195157},{"id":195165,"depth":1629,"text":195168,"children":195817},[195818,195819],{"id":100676,"depth":1635,"text":194004},{"id":195244,"depth":1635,"text":195247},{"id":195285,"depth":1629,"text":195288},{"id":195375,"depth":1629,"text":195378,"children":195822},[195823,195824,195825],{"id":17064,"depth":1635,"text":53239},{"id":195408,"depth":1635,"text":195411},{"id":194156,"depth":1635,"text":194159},{"id":195473,"depth":1629,"text":195476},{"id":188461,"depth":1629,"text":188464},{"id":195558,"depth":1629,"text":195561,"children":195829},[195830,195831],{"id":165021,"depth":1635,"text":165024},{"id":195591,"depth":1635,"text":195594},{"id":195623,"depth":1629,"text":195626},{"id":195663,"depth":1629,"text":195666},{"id":95759,"depth":1629,"text":95762},"content:blog:learning_management_system_lms_api_integration_real_time_course_data_and_learning_platforms.md","blog/learning_management_system_lms_api_integration_real_time_course_data_and_learning_platforms.md","blog/learning_management_system_lms_api_integration_real_time_course_data_and_learning_platforms",{"_path":195839,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":195840,"description":195841,"img":195842,"date":194590,"tag":12,"body":195843,"_type":1677,"_id":196858,"_source":1679,"_file":196859,"_stem":196860,"_extension":1682},"/blog/verification_api_integration_real_time_background_and_identity_checks_without_data_storage","Verification API Integration: Real-Time Background and Identity Checks Without Data Storage","Verification is one of the most sensitive steps in hiring and onboarding. Identity checks, background screenings, and employment verifications all involve...","https://s3.us-east-2.amazonaws.com/unified-article-images/verification_api_integration_real_time_background_and_identity_checks_without_data_storage-icon.png",{"type":14,"children":195844,"toc":196829},[195845,195850,195853,195860,195865,195874,195880,195912,195917,195940,195945,195949,195959,195963,195986,195998,196004,196015,196046,196057,196068,196073,196079,196091,196095,196100,196104,196126,196131,196135,196140,196145,196222,196227,196233,196238,196242,196246,196274,196279,196285,196290,196313,196325,196329,196334,196352,196357,196361,196366,196370,196393,196398,196404,196422,196428,196453,196457,196462,196489,196495,196500,196505,196528,196540,196544,196549,196577,196582,196588,196592,196615,196621,196646,196652,196685,196691,196696,196706,196722,196727,196743,196748,196752,196760,196765,196772,196777,196785,196790,196798,196803,196811,196816,196824],{"type":17,"tag":18,"props":195846,"children":195848},{"id":195847},"verification-api-integration-real-time-background-and-identity-checks-without-data-storage",[195849],{"type":23,"value":195840},{"type":17,"tag":25,"props":195851,"children":195852},{},[],{"type":17,"tag":29,"props":195854,"children":195855},{},[195856],{"type":17,"tag":33,"props":195857,"children":195858},{},[195859],{"type":23,"value":191080},{"type":17,"tag":29,"props":195861,"children":195862},{},[195863],{"type":23,"value":195864},"Verification is one of the most sensitive steps in hiring and onboarding. Identity checks, background screenings, and employment verifications all involve highly personal data and strict regulatory requirements. At the same time, products that rely on verification need timely status updates and consistent behavior across providers.",{"type":17,"tag":29,"props":195866,"children":195867},{},[195868,195872],{"type":17,"tag":133,"props":195869,"children":195870},{"href":53443},[195871],{"type":23,"value":54031},{"type":23,"value":195873}," integration exists to solve this problem. In this guide, we'll explain what a Verification API actually does, how verification data differs from ATS and HR data, how real-time status updates work in practice, and how Unified's Verification API fits cleanly into hiring and onboarding architectures.",{"type":17,"tag":68,"props":195875,"children":195877},{"id":195876},"introduction-to-verification-api-integrations",[195878],{"type":23,"value":195879},"Introduction to Verification API Integrations",{"type":17,"tag":29,"props":195881,"children":195882},{},[195883,195885,195890,195891,195895,195896,195900,195901,195905,195906,195910],{"type":23,"value":195884},"Verification providers such as ",{"type":17,"tag":48,"props":195886,"children":195887},{},[195888],{"type":23,"value":195889},"Checkr",{"type":23,"value":11826},{"type":17,"tag":48,"props":195892,"children":195893},{},[195894],{"type":23,"value":53736},{"type":23,"value":11826},{"type":17,"tag":48,"props":195897,"children":195898},{},[195899],{"type":23,"value":53684},{"type":23,"value":11826},{"type":17,"tag":48,"props":195902,"children":195903},{},[195904],{"type":23,"value":53781},{"type":23,"value":12561},{"type":17,"tag":48,"props":195907,"children":195908},{},[195909],{"type":23,"value":53830},{"type":23,"value":195911}," perform point-in-time checks to confirm identity, credentials, or eligibility. Each provider offers different packages, input requirements, turnaround times, and result formats.",{"type":17,"tag":29,"props":195913,"children":195914},{},[195915],{"type":23,"value":195916},"Products that need to work with multiple verification providers face familiar challenges:",{"type":17,"tag":80,"props":195918,"children":195919},{},[195920,195925,195930,195935],{"type":17,"tag":84,"props":195921,"children":195922},{},[195923],{"type":23,"value":195924},"Provider-specific APIs and authentication",{"type":17,"tag":84,"props":195926,"children":195927},{},[195928],{"type":23,"value":195929},"Different request parameters and result schemas",{"type":17,"tag":84,"props":195931,"children":195932},{},[195933],{"type":23,"value":195934},"Inconsistent event delivery for status changes",{"type":17,"tag":84,"props":195936,"children":195937},{},[195938],{"type":23,"value":195939},"Strict privacy and data-handling expectations",{"type":17,"tag":29,"props":195941,"children":195942},{},[195943],{"type":23,"value":195944},"Verification API integration provides a consistent way to initiate checks, monitor progress, and retrieve results—without building and maintaining separate integrations for each provider.",{"type":17,"tag":68,"props":195946,"children":195947},{"id":53430},[195948],{"type":23,"value":53433},{"type":17,"tag":29,"props":195950,"children":195951},{},[195952,195953,195957],{"type":23,"value":9619},{"type":17,"tag":48,"props":195954,"children":195955},{},[195956],{"type":23,"value":54031},{"type":23,"value":195958}," allows software products to initiate and track identity or background checks programmatically.",{"type":17,"tag":29,"props":195960,"children":195961},{},[195962],{"type":23,"value":167214},{"type":17,"tag":80,"props":195964,"children":195965},{},[195966,195971,195976,195981],{"type":17,"tag":84,"props":195967,"children":195968},{},[195969],{"type":23,"value":195970},"Listing available verification packages",{"type":17,"tag":84,"props":195972,"children":195973},{},[195974],{"type":23,"value":195975},"Creating verification requests for specific individuals",{"type":17,"tag":84,"props":195977,"children":195978},{},[195979],{"type":23,"value":195980},"Monitoring request status changes",{"type":17,"tag":84,"props":195982,"children":195983},{},[195984],{"type":23,"value":195985},"Retrieving verification outcomes and reports",{"type":17,"tag":29,"props":195987,"children":195988},{},[195989,195991,195996],{"type":23,"value":195990},"Verification APIs are ",{"type":17,"tag":48,"props":195992,"children":195993},{},[195994],{"type":23,"value":195995},"transactional",{"type":23,"value":195997}," by design. They perform checks at specific moments in time and return results. They are not systems of record for candidates or employees.",{"type":17,"tag":68,"props":195999,"children":196001},{"id":196000},"verification-api-vs-ats-and-hr-apis",[196002],{"type":23,"value":196003},"Verification API vs ATS and HR APIs",{"type":17,"tag":29,"props":196005,"children":196006},{},[196007,196009,196013],{"type":23,"value":196008},"Unified treats verification, recruiting, and employment as ",{"type":17,"tag":48,"props":196010,"children":196011},{},[196012],{"type":23,"value":194701},{"type":23,"value":196014},", each with clear responsibilities.",{"type":17,"tag":80,"props":196016,"children":196017},{},[196018,196027,196036],{"type":17,"tag":84,"props":196019,"children":196020},{},[196021,196025],{"type":17,"tag":48,"props":196022,"children":196023},{},[196024],{"type":23,"value":189036},{"type":23,"value":196026}," manage recruiting data such as candidates, applications, interviews, and hiring decisions.",{"type":17,"tag":84,"props":196028,"children":196029},{},[196030,196034],{"type":17,"tag":48,"props":196031,"children":196032},{},[196033],{"type":23,"value":193574},{"type":23,"value":196035}," manage employment data such as employees, org structure, benefits, and payroll artifacts.",{"type":17,"tag":84,"props":196037,"children":196038},{},[196039,196044],{"type":17,"tag":48,"props":196040,"children":196041},{},[196042],{"type":23,"value":196043},"Verification APIs",{"type":23,"value":196045}," perform point-in-time checks and return results.",{"type":17,"tag":29,"props":196047,"children":196048},{},[196049,196051,196055],{"type":23,"value":196050},"A verification request may be associated with a candidate in an ATS, but verification data does ",{"type":17,"tag":48,"props":196052,"children":196053},{},[196054],{"type":23,"value":159475},{"type":23,"value":196056}," create or update candidate, application, or employee records automatically. Any updates to ATS or HR data must be performed explicitly by the application.",{"type":17,"tag":3414,"props":196058,"children":196059},{},[196060],{"type":17,"tag":29,"props":196061,"children":196062},{},[196063],{"type":17,"tag":48,"props":196064,"children":196065},{},[196066],{"type":23,"value":196067},"Verification data represents a point-in-time check, not an ongoing identity or employment record.",{"type":17,"tag":29,"props":196069,"children":196070},{},[196071],{"type":23,"value":196072},"This separation prevents accidental coupling and supports real-world hiring and onboarding scenarios.",{"type":17,"tag":68,"props":196074,"children":196076},{"id":196075},"core-verification-data-models-and-how-they-behave",[196077],{"type":23,"value":196078},"Core Verification Data Models (and How They Behave)",{"type":17,"tag":29,"props":196080,"children":196081},{},[196082,196084,196089],{"type":23,"value":196083},"Unified's Verification API provides access to ",{"type":17,"tag":48,"props":196085,"children":196086},{},[196087],{"type":23,"value":196088},"two objects only",{"type":23,"value":196090},". This narrow scope is intentional.",{"type":17,"tag":239,"props":196092,"children":196093},{"id":103004},[196094],{"type":23,"value":54055},{"type":17,"tag":29,"props":196096,"children":196097},{},[196098],{"type":23,"value":196099},"Packages describe the checks offered by a provider—such as identity verification, background screening, or employment verification.",{"type":17,"tag":29,"props":196101,"children":196102},{},[196103],{"type":23,"value":65343},{"type":17,"tag":80,"props":196105,"children":196106},{},[196107,196111,196116,196121],{"type":17,"tag":84,"props":196108,"children":196109},{},[196110],{"type":23,"value":185706},{"type":17,"tag":84,"props":196112,"children":196113},{},[196114],{"type":23,"value":196115},"Defined by the provider",{"type":17,"tag":84,"props":196117,"children":196118},{},[196119],{"type":23,"value":196120},"Include identifiers, descriptions, pricing information, regional applicability, and typical processing times",{"type":17,"tag":84,"props":196122,"children":196123},{},[196124],{"type":23,"value":196125},"May indicate whether a redirect-based verification step is required or whether an IP address must be supplied",{"type":17,"tag":29,"props":196127,"children":196128},{},[196129],{"type":23,"value":196130},"Applications list and retrieve packages to determine which checks are available and what data is required before submitting a request.",{"type":17,"tag":239,"props":196132,"children":196133},{"id":103014},[196134],{"type":23,"value":54068},{"type":17,"tag":29,"props":196136,"children":196137},{},[196138],{"type":23,"value":196139},"Requests represent individual verification checks initiated for a specific person.",{"type":17,"tag":29,"props":196141,"children":196142},{},[196143],{"type":23,"value":196144},"Requests support create, retrieve, list, update, and remove operations, with important lifecycle semantics:",{"type":17,"tag":80,"props":196146,"children":196147},{},[196148,196163,196173,196202,196212],{"type":17,"tag":84,"props":196149,"children":196150},{},[196151,196155,196157,196162],{"type":17,"tag":48,"props":196152,"children":196153},{},[196154],{"type":23,"value":189272},{"type":23,"value":196156},": A request is created with a selected package and required profile data. Initial status is typically ",{"type":17,"tag":6121,"props":196158,"children":196160},{"className":196159},[],[196161],{"type":23,"value":20344},{"type":23,"value":54},{"type":17,"tag":84,"props":196164,"children":196165},{},[196166,196171],{"type":17,"tag":48,"props":196167,"children":196168},{},[196169],{"type":23,"value":196170},"Processing",{"type":23,"value":196172},": Some providers require redirect-based verification for user consent; others process checks directly.",{"type":17,"tag":84,"props":196174,"children":196175},{},[196176,196181,196183,196189,196190,196195,196196,196201],{"type":17,"tag":48,"props":196177,"children":196178},{},[196179],{"type":23,"value":196180},"Completion",{"type":23,"value":196182},": When processing finishes, status transitions to values such as ",{"type":17,"tag":6121,"props":196184,"children":196186},{"className":196185},[],[196187],{"type":23,"value":196188},"PASSED",{"type":23,"value":11826},{"type":17,"tag":6121,"props":196191,"children":196193},{"className":196192},[],[196194],{"type":23,"value":150057},{"type":23,"value":27293},{"type":17,"tag":6121,"props":196197,"children":196199},{"className":196198},[],[196200],{"type":23,"value":20396},{"type":23,"value":54},{"type":17,"tag":84,"props":196203,"children":196204},{},[196205,196210],{"type":17,"tag":48,"props":196206,"children":196207},{},[196208],{"type":23,"value":196209},"Expiration",{"type":23,"value":196211},": Results may expire after a defined period, requiring a new request for future use.",{"type":17,"tag":84,"props":196213,"children":196214},{},[196215,196220],{"type":17,"tag":48,"props":196216,"children":196217},{},[196218],{"type":23,"value":196219},"Removal",{"type":23,"value":196221},": Requests can be removed once no longer needed.",{"type":17,"tag":29,"props":196223,"children":196224},{},[196225],{"type":23,"value":196226},"Only a subset of request fields can be modified while the request is pending. Result fields and timestamps are set by the provider and are not editable.",{"type":17,"tag":68,"props":196228,"children":196230},{"id":196229},"real-time-status-updates-and-event-delivery",[196231],{"type":23,"value":196232},"Real-Time Status Updates and Event Delivery",{"type":17,"tag":29,"props":196234,"children":196235},{},[196236],{"type":23,"value":196237},"Verification status changes are time-sensitive. Products often need to know as soon as a check completes or fails.",{"type":17,"tag":239,"props":196239,"children":196240},{"id":100676},[196241],{"type":23,"value":194004},{"type":17,"tag":29,"props":196243,"children":196244},{},[196245],{"type":23,"value":195177},{"type":17,"tag":80,"props":196247,"children":196248},{},[196249,196262],{"type":17,"tag":84,"props":196250,"children":196251},{},[196252,196260],{"type":17,"tag":48,"props":196253,"children":196254},{},[196255,196256],{"type":23,"value":119374},{"type":17,"tag":133,"props":196257,"children":196258},{"href":4999},[196259],{"type":23,"value":5002},{"type":23,"value":196261}," are forwarded immediately when supported by the provider.",{"type":17,"tag":84,"props":196263,"children":196264},{},[196265,196272],{"type":17,"tag":48,"props":196266,"children":196267},{},[196268],{"type":17,"tag":133,"props":196269,"children":196270},{"href":9007},[196271],{"type":23,"value":9256},{"type":23,"value":196273}," poll the provider at a configurable interval and deliver updates when changes are detected.",{"type":17,"tag":29,"props":196275,"children":196276},{},[196277],{"type":23,"value":196278},"Both delivery methods use the same subscription interface and payload format.",{"type":17,"tag":239,"props":196280,"children":196282},{"id":196281},"supported-events",[196283],{"type":23,"value":196284},"Supported Events",{"type":17,"tag":29,"props":196286,"children":196287},{},[196288],{"type":23,"value":196289},"Across providers:",{"type":17,"tag":80,"props":196291,"children":196292},{},[196293,196302],{"type":17,"tag":84,"props":196294,"children":196295},{},[196296],{"type":17,"tag":6121,"props":196297,"children":196299},{"className":196298},[],[196300],{"type":23,"value":196301},"request.created",{"type":17,"tag":84,"props":196303,"children":196304},{},[196305,196311],{"type":17,"tag":6121,"props":196306,"children":196308},{"className":196307},[],[196309],{"type":23,"value":196310},"request.updated",{"type":23,"value":196312}," (used to signal status changes and result availability)",{"type":17,"tag":29,"props":196314,"children":196315},{},[196316,196318,196323],{"type":23,"value":196317},"There is no separate status event. When a verification completes or transitions state, an ",{"type":17,"tag":6121,"props":196319,"children":196321},{"className":196320},[],[196322],{"type":23,"value":109214},{"type":23,"value":196324}," event is sent.",{"type":17,"tag":239,"props":196326,"children":196327},{"id":144224},[196328],{"type":23,"value":144227},{"type":17,"tag":29,"props":196330,"children":196331},{},[196332],{"type":23,"value":196333},"Webhook support varies by provider:",{"type":17,"tag":80,"props":196335,"children":196336},{},[196337,196342,196347],{"type":17,"tag":84,"props":196338,"children":196339},{},[196340],{"type":23,"value":196341},"Some providers support native webhooks for verification requests.",{"type":17,"tag":84,"props":196343,"children":196344},{},[196345],{"type":23,"value":196346},"Others rely entirely on virtual webhooks generated through polling.",{"type":17,"tag":84,"props":196348,"children":196349},{},[196350],{"type":23,"value":196351},"Package-level events are limited and not universally available.",{"type":17,"tag":29,"props":196353,"children":196354},{},[196355],{"type":23,"value":196356},"Applications should design event handling with provider variability in mind and avoid assuming universal webhook coverage.",{"type":17,"tag":68,"props":196358,"children":196359},{"id":164849},[196360],{"type":23,"value":164852},{"type":17,"tag":29,"props":196362,"children":196363},{},[196364],{"type":23,"value":196365},"Verification data is highly sensitive. Unified's architecture is designed to minimize risk.",{"type":17,"tag":239,"props":196367,"children":196368},{"id":17064},[196369],{"type":23,"value":53239},{"type":17,"tag":80,"props":196371,"children":196372},{},[196373,196378,196383,196388],{"type":17,"tag":84,"props":196374,"children":196375},{},[196376],{"type":23,"value":196377},"Verification data is routed directly to the source provider in real time.",{"type":17,"tag":84,"props":196379,"children":196380},{},[196381],{"type":23,"value":196382},"No verification payloads are stored at rest.",{"type":17,"tag":84,"props":196384,"children":196385},{},[196386],{"type":23,"value":196387},"No replicas or data warehouses are created.",{"type":17,"tag":84,"props":196389,"children":196390},{},[196391],{"type":23,"value":196392},"Requests are stateless.",{"type":17,"tag":29,"props":196394,"children":196395},{},[196396],{"type":23,"value":196397},"If long-term storage is required, applications must persist results in their own systems (for example, within ATS or HR platforms).",{"type":17,"tag":239,"props":196399,"children":196401},{"id":196400},"result-and-document-handling",[196402],{"type":23,"value":196403},"Result and Document Handling",{"type":17,"tag":80,"props":196405,"children":196406},{},[196407,196412,196417],{"type":17,"tag":84,"props":196408,"children":196409},{},[196410],{"type":23,"value":196411},"Verification results are returned in standardized fields such as status, score, and details.",{"type":17,"tag":84,"props":196413,"children":196414},{},[196415],{"type":23,"value":196416},"Some providers return download URLs for reports; these URLs are time-limited.",{"type":17,"tag":84,"props":196418,"children":196419},{},[196420],{"type":23,"value":196421},"Unified does not retain or cache verification reports or documents.",{"type":17,"tag":239,"props":196423,"children":196425},{"id":196424},"pii-handling-and-masking",[196426],{"type":23,"value":196427},"PII Handling and Masking",{"type":17,"tag":80,"props":196429,"children":196430},{},[196431,196436,196441],{"type":17,"tag":84,"props":196432,"children":196433},{},[196434],{"type":23,"value":196435},"Normalized fields return only the data required to complete or interpret a verification.",{"type":17,"tag":84,"props":196437,"children":196438},{},[196439],{"type":23,"value":196440},"Additional provider-specific fields are returned only when explicitly requested.",{"type":17,"tag":84,"props":196442,"children":196443},{},[196444,196446,196451],{"type":23,"value":196445},"In MCP-based integrations, a ",{"type":17,"tag":6121,"props":196447,"children":196449},{"className":196448},[],[196450],{"type":23,"value":131715},{"type":23,"value":196452}," option can remove personally identifiable information from responses before data reaches downstream systems such as LLMs.",{"type":17,"tag":239,"props":196454,"children":196455},{"id":194156},[196456],{"type":23,"value":194159},{"type":17,"tag":29,"props":196458,"children":196459},{},[196460],{"type":23,"value":196461},"Unified supports industry-standard security controls:",{"type":17,"tag":80,"props":196463,"children":196464},{},[196465,196469,196473,196477,196481,196485],{"type":17,"tag":84,"props":196466,"children":196467},{},[196468],{"type":23,"value":94139},{"type":17,"tag":84,"props":196470,"children":196471},{},[196472],{"type":23,"value":194176},{"type":17,"tag":84,"props":196474,"children":196475},{},[196476],{"type":23,"value":183954},{"type":17,"tag":84,"props":196478,"children":196479},{},[196480],{"type":23,"value":194186},{"type":17,"tag":84,"props":196482,"children":196483},{},[196484],{"type":23,"value":194191},{"type":17,"tag":84,"props":196486,"children":196487},{},[196488],{"type":23,"value":194196},{"type":17,"tag":68,"props":196490,"children":196492},{"id":196491},"verification-and-ats-integration-patterns",[196493],{"type":23,"value":196494},"Verification and ATS Integration Patterns",{"type":17,"tag":29,"props":196496,"children":196497},{},[196498],{"type":23,"value":196499},"Verification commonly sits between recruiting and employment.",{"type":17,"tag":29,"props":196501,"children":196502},{},[196503],{"type":23,"value":196504},"Typical patterns include:",{"type":17,"tag":80,"props":196506,"children":196507},{},[196508,196513,196518,196523],{"type":17,"tag":84,"props":196509,"children":196510},{},[196511],{"type":23,"value":196512},"Creating a verification request after a candidate accepts an offer",{"type":17,"tag":84,"props":196514,"children":196515},{},[196516],{"type":23,"value":196517},"Monitoring verification status via webhooks or polling",{"type":17,"tag":84,"props":196519,"children":196520},{},[196521],{"type":23,"value":196522},"Updating application status or notes in the ATS based on results",{"type":17,"tag":84,"props":196524,"children":196525},{},[196526],{"type":23,"value":196527},"Proceeding to HR onboarding only after verification completes",{"type":17,"tag":29,"props":196529,"children":196530},{},[196531,196533,196538],{"type":23,"value":196532},"These steps are coordinated through ",{"type":17,"tag":48,"props":196534,"children":196535},{},[196536],{"type":23,"value":196537},"explicit API calls",{"type":23,"value":196539},". The Verification API does not update ATS or HR records automatically.",{"type":17,"tag":68,"props":196541,"children":196542},{"id":188461},[196543],{"type":23,"value":188464},{"type":17,"tag":29,"props":196545,"children":196546},{},[196547],{"type":23,"value":196548},"Unified is explicit about Verification limitations:",{"type":17,"tag":80,"props":196550,"children":196551},{},[196552,196557,196562,196567,196572],{"type":17,"tag":84,"props":196553,"children":196554},{},[196555],{"type":23,"value":196556},"Only packages and requests are available",{"type":17,"tag":84,"props":196558,"children":196559},{},[196560],{"type":23,"value":196561},"Verification results are point-in-time and may expire",{"type":17,"tag":84,"props":196563,"children":196564},{},[196565],{"type":23,"value":196566},"Provider requirements differ by region and package",{"type":17,"tag":84,"props":196568,"children":196569},{},[196570],{"type":23,"value":196571},"Webhook coverage varies by provider",{"type":17,"tag":84,"props":196573,"children":196574},{},[196575],{"type":23,"value":196576},"Applications must handle persistence and downstream updates",{"type":17,"tag":29,"props":196578,"children":196579},{},[196580],{"type":23,"value":196581},"These constraints reflect real provider behavior and help avoid hidden assumptions.",{"type":17,"tag":68,"props":196583,"children":196585},{"id":196584},"build-vs-buy-verification-integrations",[196586],{"type":23,"value":196587},"Build vs Buy Verification Integrations",{"type":17,"tag":239,"props":196589,"children":196590},{"id":165021},[196591],{"type":23,"value":165024},{"type":17,"tag":80,"props":196593,"children":196594},{},[196595,196600,196605,196610],{"type":17,"tag":84,"props":196596,"children":196597},{},[196598],{"type":23,"value":196599},"Separate integrations for each provider",{"type":17,"tag":84,"props":196601,"children":196602},{},[196603],{"type":23,"value":196604},"Provider-specific parameters and result formats",{"type":17,"tag":84,"props":196606,"children":196607},{},[196608],{"type":23,"value":196609},"Custom polling and event handling",{"type":17,"tag":84,"props":196611,"children":196612},{},[196613],{"type":23,"value":196614},"Ongoing maintenance as providers change APIs",{"type":17,"tag":239,"props":196616,"children":196618},{"id":196617},"using-a-unified-verification-api",[196619],{"type":23,"value":196620},"Using a Unified Verification API",{"type":17,"tag":80,"props":196622,"children":196623},{},[196624,196628,196633,196638,196642],{"type":17,"tag":84,"props":196625,"children":196626},{},[196627],{"type":23,"value":187237},{"type":17,"tag":84,"props":196629,"children":196630},{},[196631],{"type":23,"value":196632},"Standardized packages and request handling",{"type":17,"tag":84,"props":196634,"children":196635},{},[196636],{"type":23,"value":196637},"Consistent event delivery model",{"type":17,"tag":84,"props":196639,"children":196640},{},[196641],{"type":23,"value":180731},{"type":17,"tag":84,"props":196643,"children":196644},{},[196645],{"type":23,"value":137967},{"type":17,"tag":68,"props":196647,"children":196649},{"id":196648},"best-practices-for-implementing-verification-apis",[196650],{"type":23,"value":196651},"Best Practices for Implementing Verification APIs",{"type":17,"tag":80,"props":196653,"children":196654},{},[196655,196660,196665,196670,196675,196680],{"type":17,"tag":84,"props":196656,"children":196657},{},[196658],{"type":23,"value":196659},"Treat verification as transactional, not persistent",{"type":17,"tag":84,"props":196661,"children":196662},{},[196663],{"type":23,"value":196664},"Initiate requests only when required by your process",{"type":17,"tag":84,"props":196666,"children":196667},{},[196668],{"type":23,"value":196669},"Design for provider-specific input requirements",{"type":17,"tag":84,"props":196671,"children":196672},{},[196673],{"type":23,"value":196674},"Handle expiration of results explicitly",{"type":17,"tag":84,"props":196676,"children":196677},{},[196678],{"type":23,"value":196679},"Keep ATS and HR updates under application control",{"type":17,"tag":84,"props":196681,"children":196682},{},[196683],{"type":23,"value":196684},"Review regional and regulatory constraints per package",{"type":17,"tag":68,"props":196686,"children":196688},{"id":196687},"build-verification-integrations-the-right-way",[196689],{"type":23,"value":196690},"Build Verification integrations the right way",{"type":17,"tag":29,"props":196692,"children":196693},{},[196694],{"type":23,"value":196695},"If your product depends on background or identity checks, maintaining separate verification integrations introduces unnecessary risk and overhead.",{"type":17,"tag":29,"props":196697,"children":196698},{},[196699,196700,196704],{"type":23,"value":25244},{"type":17,"tag":48,"props":196701,"children":196702},{},[196703],{"type":23,"value":54031},{"type":23,"value":196705}," provides a consistent way to initiate checks, monitor status, and retrieve results across multiple providers—without storing verification data or coupling verification logic to recruiting or HR records.",{"type":17,"tag":29,"props":196707,"children":196708},{},[196709,196713,196714],{"type":17,"tag":48,"props":196710,"children":196711},{},[196712],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":196715,"children":196717},{"href":1612,"rel":196716},[214],[196718],{"type":17,"tag":48,"props":196719,"children":196720},{},[196721],{"type":23,"value":1616},{"type":17,"tag":29,"props":196723,"children":196724},{},[196725],{"type":23,"value":196726},"Test verification integrations with real-time status updates and direct API access.",{"type":17,"tag":29,"props":196728,"children":196729},{},[196730,196734,196735],{"type":17,"tag":48,"props":196731,"children":196732},{},[196733],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":196736,"children":196738},{"href":1623,"rel":196737},[214],[196739],{"type":17,"tag":48,"props":196740,"children":196741},{},[196742],{"type":23,"value":1627},{"type":17,"tag":29,"props":196744,"children":196745},{},[196746],{"type":23,"value":196747},"Talk through your verification, ATS, or onboarding use case with the team that built the platform.",{"type":17,"tag":68,"props":196749,"children":196750},{"id":95759},[196751],{"type":23,"value":95762},{"type":17,"tag":29,"props":196753,"children":196754},{},[196755],{"type":17,"tag":48,"props":196756,"children":196757},{},[196758],{"type":23,"value":196759},"What is a Verification API?",{"type":17,"tag":29,"props":196761,"children":196762},{},[196763],{"type":23,"value":196764},"An API that allows products to initiate and track identity or background checks programmatically.",{"type":17,"tag":29,"props":196766,"children":196767},{},[196768],{"type":17,"tag":48,"props":196769,"children":196770},{},[196771],{"type":23,"value":171430},{"type":17,"tag":29,"props":196773,"children":196774},{},[196775],{"type":23,"value":196776},"Unified supports providers such as Certn, Checkr, First Advantage, Verifiable, and Yardstik.",{"type":17,"tag":29,"props":196778,"children":196779},{},[196780],{"type":17,"tag":48,"props":196781,"children":196782},{},[196783],{"type":23,"value":196784},"Does the Verification API store personal data?",{"type":17,"tag":29,"props":196786,"children":196787},{},[196788],{"type":23,"value":196789},"No. Verification data is not stored at rest. Applications must persist any required results themselves.",{"type":17,"tag":29,"props":196791,"children":196792},{},[196793],{"type":17,"tag":48,"props":196794,"children":196795},{},[196796],{"type":23,"value":196797},"Are verification updates real time?",{"type":17,"tag":29,"props":196799,"children":196800},{},[196801],{"type":23,"value":196802},"Status changes are delivered via native or virtual webhooks where supported, otherwise through polling.",{"type":17,"tag":29,"props":196804,"children":196805},{},[196806],{"type":17,"tag":48,"props":196807,"children":196808},{},[196809],{"type":23,"value":196810},"Does a verification request create an employee or candidate record?",{"type":17,"tag":29,"props":196812,"children":196813},{},[196814],{"type":23,"value":196815},"No. Verification requests do not create or update ATS or HR records automatically.",{"type":17,"tag":29,"props":196817,"children":196818},{},[196819],{"type":17,"tag":48,"props":196820,"children":196821},{},[196822],{"type":23,"value":196823},"How long are verification results valid?",{"type":17,"tag":29,"props":196825,"children":196826},{},[196827],{"type":23,"value":196828},"Validity depends on the provider and package. Many results include an explicit expiration timestamp.",{"title":7,"searchDepth":1629,"depth":1629,"links":196830},[196831,196832,196833,196834,196838,196843,196849,196850,196851,196855,196856,196857],{"id":195876,"depth":1629,"text":195879},{"id":53430,"depth":1629,"text":53433},{"id":196000,"depth":1629,"text":196003},{"id":196075,"depth":1629,"text":196078,"children":196835},[196836,196837],{"id":103004,"depth":1635,"text":54055},{"id":103014,"depth":1635,"text":54068},{"id":196229,"depth":1629,"text":196232,"children":196839},[196840,196841,196842],{"id":100676,"depth":1635,"text":194004},{"id":196281,"depth":1635,"text":196284},{"id":144224,"depth":1635,"text":144227},{"id":164849,"depth":1629,"text":164852,"children":196844},[196845,196846,196847,196848],{"id":17064,"depth":1635,"text":53239},{"id":196400,"depth":1635,"text":196403},{"id":196424,"depth":1635,"text":196427},{"id":194156,"depth":1635,"text":194159},{"id":196491,"depth":1629,"text":196494},{"id":188461,"depth":1629,"text":188464},{"id":196584,"depth":1629,"text":196587,"children":196852},[196853,196854],{"id":165021,"depth":1635,"text":165024},{"id":196617,"depth":1635,"text":196620},{"id":196648,"depth":1629,"text":196651},{"id":196687,"depth":1629,"text":196690},{"id":95759,"depth":1629,"text":95762},"content:blog:verification_api_integration_real_time_background_and_identity_checks_without_data_storage.md","blog/verification_api_integration_real_time_background_and_identity_checks_without_data_storage.md","blog/verification_api_integration_real_time_background_and_identity_checks_without_data_storage",{"_path":196862,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":196863,"description":196864,"img":196865,"date":196866,"tag":12,"body":196867,"_type":1677,"_id":198150,"_source":1679,"_file":198151,"_stem":198152,"_extension":1682},"/blog/ats_api_integration_real_time_recruiting_data_candidate_pipelines_and_hiring_automation","ATS API Integration: Real-Time Recruiting Data, Candidate Pipelines, and Hiring Automation","Recruiting products depend on accurate, up-to-date hiring data. Candidate stage changes, interview updates, job postings, and hiring decisions need to be...","https://s3.us-east-2.amazonaws.com/unified-article-images/ats_api_integration_real_time_recruiting_data_candidate_pipelines_and_hiring_automation-icon.png","2026-02-06T23:59:00.000Z",{"type":14,"children":196868,"toc":198103},[196869,196874,196877,196885,196890,196899,196905,196910,196915,196921,196931,196935,196968,196974,196979,197014,197038,197043,197049,197054,197060,197065,197083,197094,197100,197105,197128,197133,197139,197151,197155,197184,197188,197201,197205,197257,197261,197271,197276,197294,197299,197312,197316,197334,197339,197356,197360,197378,197383,197396,197402,197415,197419,197430,197435,197441,197447,197452,197457,197462,197468,197473,197479,197484,197490,197495,197501,197506,197512,197516,197541,197546,197552,197570,197575,197579,197584,197600,197609,197613,197652,197658,197663,197667,197685,197691,197709,197713,197737,197743,197768,197779,197804,197809,197813,197818,197845,197850,197856,197860,197883,197889,197911,197917,197958,197964,197969,197979,197995,198000,198016,198021,198025,198033,198038,198046,198051,198059,198064,198072,198077,198085,198090,198098],{"type":17,"tag":18,"props":196870,"children":196872},{"id":196871},"ats-api-integration-real-time-recruiting-data-candidate-pipelines-and-hiring-automation",[196873],{"type":23,"value":196863},{"type":17,"tag":25,"props":196875,"children":196876},{},[],{"type":17,"tag":29,"props":196878,"children":196879},{},[196880],{"type":17,"tag":33,"props":196881,"children":196882},{},[196883],{"type":23,"value":196884},"February 6, 2026",{"type":17,"tag":29,"props":196886,"children":196887},{},[196888],{"type":23,"value":196889},"Recruiting products depend on accurate, up-to-date hiring data. Candidate stage changes, interview updates, job postings, and hiring decisions need to be reflected immediately—across tools, teams, and downstream integrations.",{"type":17,"tag":29,"props":196891,"children":196892},{},[196893,196897],{"type":17,"tag":133,"props":196894,"children":196895},{"href":55696},[196896],{"type":23,"value":55699},{"type":23,"value":196898}," integration exists to make that possible. In this guide, we'll explain what ATS API integration actually means, how real-time recruiting data differs from batch syncs, which ATS data models matter in practice, and how Unified's ATS API fits into a broader architecture that includes HR & Directory, LMS, and verification tools.",{"type":17,"tag":68,"props":196900,"children":196902},{"id":196901},"introduction-to-ats-api-integrations",[196903],{"type":23,"value":196904},"Introduction to ATS API Integrations",{"type":17,"tag":29,"props":196906,"children":196907},{},[196908],{"type":23,"value":196909},"Applicant Tracking platforms such as Greenhouse, Lever, Workable, iCIMS, and SmartRecruiters act as the system of record for recruiting. They manage jobs, candidates, applications, interviews, documents, scorecards, and recruiting activity throughout the hiring process.",{"type":17,"tag":29,"props":196911,"children":196912},{},[196913],{"type":23,"value":196914},"But ATS platforms don't operate in isolation. Recruiting analytics tools, assessment platforms, interview software, background check providers, job boards, and AI screening products all need access to ATS data. ATS API integration enables those products to read from and write to recruiting platforms—without brittle exports, delayed syncs, or duplicated logic.",{"type":17,"tag":68,"props":196916,"children":196918},{"id":196917},"what-is-ats-api-integration",[196919],{"type":23,"value":196920},"What Is ATS API Integration?",{"type":17,"tag":29,"props":196922,"children":196923},{},[196924,196929],{"type":17,"tag":48,"props":196925,"children":196926},{},[196927],{"type":23,"value":196928},"ATS API integration",{"type":23,"value":196930}," is the process of connecting software products to applicant-tracking platforms via APIs in order to programmatically access recruiting data.",{"type":17,"tag":29,"props":196932,"children":196933},{},[196934],{"type":23,"value":167214},{"type":17,"tag":80,"props":196936,"children":196937},{},[196938,196943,196948,196953,196958,196963],{"type":17,"tag":84,"props":196939,"children":196940},{},[196941],{"type":23,"value":196942},"Retrieving candidates, jobs, and applications",{"type":17,"tag":84,"props":196944,"children":196945},{},[196946],{"type":23,"value":196947},"Tracking application stage changes",{"type":17,"tag":84,"props":196949,"children":196950},{},[196951],{"type":23,"value":196952},"Scheduling and updating interviews",{"type":17,"tag":84,"props":196954,"children":196955},{},[196956],{"type":23,"value":196957},"Attaching documents and scorecards",{"type":17,"tag":84,"props":196959,"children":196960},{},[196961],{"type":23,"value":196962},"Writing assessment results or status updates back to the ATS",{"type":17,"tag":84,"props":196964,"children":196965},{},[196966],{"type":23,"value":196967},"Reacting to recruiting events as they occur",{"type":17,"tag":68,"props":196969,"children":196971},{"id":196970},"ats-api-vs-hr-directory-api-and-where-the-handoff-occurs",[196972],{"type":23,"value":196973},"ATS API vs HR & Directory API (and Where the Handoff Occurs)",{"type":17,"tag":29,"props":196975,"children":196976},{},[196977],{"type":23,"value":196978},"ATS and HR platforms serve different purposes—and Unified treats that boundary explicitly.",{"type":17,"tag":80,"props":196980,"children":196981},{},[196982,196998],{"type":17,"tag":84,"props":196983,"children":196984},{},[196985,196989,196991,196996],{"type":17,"tag":48,"props":196986,"children":196987},{},[196988],{"type":23,"value":189036},{"type":23,"value":196990}," handle the ",{"type":17,"tag":33,"props":196992,"children":196993},{},[196994],{"type":23,"value":196995},"recruiting lifecycle",{"type":23,"value":196997},": candidates, applications, interviews, offers, and hiring decisions.",{"type":17,"tag":84,"props":196999,"children":197000},{},[197001,197005,197007,197012],{"type":17,"tag":48,"props":197002,"children":197003},{},[197004],{"type":23,"value":193574},{"type":23,"value":197006}," handle ",{"type":17,"tag":33,"props":197008,"children":197009},{},[197010],{"type":23,"value":197011},"employment",{"type":23,"value":197013},": employees, org structure, locations, benefits, payroll artifacts, and identity.",{"type":17,"tag":29,"props":197015,"children":197016},{},[197017,197019,197024,197026,197030,197032,197037],{"type":23,"value":197018},"An ATS may signal that a candidate was hired (for example via a ",{"type":17,"tag":6121,"props":197020,"children":197022},{"className":197021},[],[197023],{"type":23,"value":132233},{"type":23,"value":197025}," timestamp), but that does ",{"type":17,"tag":48,"props":197027,"children":197028},{},[197029],{"type":23,"value":159475},{"type":23,"value":197031}," create an employee record automatically. The application decides when and how to create or update an employee using the ",{"type":17,"tag":133,"props":197033,"children":197034},{"href":60186},[197035],{"type":23,"value":197036},"HR & Directory API",{"type":23,"value":54},{"type":17,"tag":29,"props":197039,"children":197040},{},[197041],{"type":23,"value":197042},"This explicit handoff is intentional. It prevents incorrect assumptions, supports complex hiring scenarios (contractors, rehires, multiple offers), and keeps ATS and HR responsibilities cleanly separated.",{"type":17,"tag":68,"props":197044,"children":197046},{"id":197045},"real-time-vs-batch-ats-data-sync",[197047],{"type":23,"value":197048},"Real-Time vs Batch ATS Data Sync",{"type":17,"tag":29,"props":197050,"children":197051},{},[197052],{"type":23,"value":197053},"Many ATS integrations rely on scheduled syncs—polling every few hours or copying recruiting data into a separate database. That approach introduces delay and risk.",{"type":17,"tag":239,"props":197055,"children":197057},{"id":197056},"understanding-real-time-ats-api-architecture",[197058],{"type":23,"value":197059},"Understanding Real-Time ATS API Architecture",{"type":17,"tag":29,"props":197061,"children":197062},{},[197063],{"type":23,"value":197064},"A real-time ATS API:",{"type":17,"tag":80,"props":197066,"children":197067},{},[197068,197073,197078],{"type":17,"tag":84,"props":197069,"children":197070},{},[197071],{"type":23,"value":197072},"Reads and writes data directly against the source ATS",{"type":17,"tag":84,"props":197074,"children":197075},{},[197076],{"type":23,"value":197077},"Does not rely on cached replicas",{"type":17,"tag":84,"props":197079,"children":197080},{},[197081],{"type":23,"value":197082},"Reflects recruiting changes as they occur",{"type":17,"tag":29,"props":197084,"children":197085},{},[197086,197088,197092],{"type":23,"value":197087},"Unified's ATS API uses a ",{"type":17,"tag":48,"props":197089,"children":197090},{},[197091],{"type":23,"value":86921},{"type":23,"value":197093},". Every API request is routed directly to the underlying ATS. There are no background sync jobs and no stored recruiting records sitting at rest.",{"type":17,"tag":239,"props":197095,"children":197097},{"id":197096},"why-batch-syncs-break-recruiting-products",[197098],{"type":23,"value":197099},"Why Batch Syncs Break Recruiting Products",{"type":17,"tag":29,"props":197101,"children":197102},{},[197103],{"type":23,"value":197104},"Batch-based ATS integrations lead to:",{"type":17,"tag":80,"props":197106,"children":197107},{},[197108,197113,197118,197123],{"type":17,"tag":84,"props":197109,"children":197110},{},[197111],{"type":23,"value":197112},"Delayed candidate status updates",{"type":17,"tag":84,"props":197114,"children":197115},{},[197116],{"type":23,"value":197117},"Missed interview changes",{"type":17,"tag":84,"props":197119,"children":197120},{},[197121],{"type":23,"value":197122},"Out-of-date job postings",{"type":17,"tag":84,"props":197124,"children":197125},{},[197126],{"type":23,"value":197127},"Inconsistent analytics",{"type":17,"tag":29,"props":197129,"children":197130},{},[197131],{"type":23,"value":197132},"For recruiting products—where timing matters—scheduled syncs are fundamentally limiting.",{"type":17,"tag":68,"props":197134,"children":197136},{"id":197135},"core-ats-data-models-and-how-they-behave",[197137],{"type":23,"value":197138},"Core ATS Data Models (and How They Behave)",{"type":17,"tag":29,"props":197140,"children":197141},{},[197142,197144,197149],{"type":23,"value":197143},"Unified normalizes recruiting data ",{"type":17,"tag":48,"props":197145,"children":197146},{},[197147],{"type":23,"value":197148},"within the ATS category",{"type":23,"value":197150},", providing consistent objects across dozens of applicant-tracking platforms. These objects are deeply defined, with clear lifecycle semantics and intentional constraints.",{"type":17,"tag":239,"props":197152,"children":197153},{"id":55713},[197154],{"type":23,"value":56852},{"type":17,"tag":80,"props":197156,"children":197157},{},[197158,197163,197167,197172],{"type":17,"tag":84,"props":197159,"children":197160},{},[197161],{"type":23,"value":197162},"Represent people applying for jobs",{"type":17,"tag":84,"props":197164,"children":197165},{},[197166],{"type":23,"value":187799},{"type":17,"tag":84,"props":197168,"children":197169},{},[197170],{"type":23,"value":197171},"Include personal details, tags, experience, education, skills, and provider-specific custom fields",{"type":17,"tag":84,"props":197173,"children":197174},{},[197175,197177,197182],{"type":23,"value":197176},"May include an optional ",{"type":17,"tag":6121,"props":197178,"children":197180},{"className":197179},[],[197181],{"type":23,"value":62582},{"type":23,"value":197183}," referencing an HR employee (typically the recruiter)",{"type":17,"tag":29,"props":197185,"children":197186},{},[197187],{"type":23,"value":193764},{"type":17,"tag":80,"props":197189,"children":197190},{},[197191,197196],{"type":17,"tag":84,"props":197192,"children":197193},{},[197194],{"type":23,"value":197195},"Some fields are provider-dependent",{"type":17,"tag":84,"props":197197,"children":197198},{},[197199],{"type":23,"value":197200},"Certain fields (such as experience history) may be slow or incomplete",{"type":17,"tag":239,"props":197202,"children":197203},{"id":55723},[197204],{"type":23,"value":56878},{"type":17,"tag":80,"props":197206,"children":197207},{},[197208,197213,197235,197252],{"type":17,"tag":84,"props":197209,"children":197210},{},[197211],{"type":23,"value":197212},"Link a candidate to a job",{"type":17,"tag":84,"props":197214,"children":197215},{},[197216,197218,197223,197224,197229,197230],{"type":23,"value":197217},"Include lifecycle timestamps such as ",{"type":17,"tag":6121,"props":197219,"children":197221},{"className":197220},[],[197222],{"type":23,"value":117347},{"type":23,"value":11826},{"type":17,"tag":6121,"props":197225,"children":197227},{"className":197226},[],[197228],{"type":23,"value":132233},{"type":23,"value":12561},{"type":17,"tag":6121,"props":197231,"children":197233},{"className":197232},[],[197234],{"type":23,"value":132224},{"type":17,"tag":84,"props":197236,"children":197237},{},[197238,197240,197245,197247],{"type":23,"value":197239},"Provide a normalized ",{"type":17,"tag":6121,"props":197241,"children":197243},{"className":197242},[],[197244],{"type":23,"value":19949},{"type":23,"value":197246}," and a provider-specific ",{"type":17,"tag":6121,"props":197248,"children":197250},{"className":197249},[],[197251],{"type":23,"value":117334},{"type":17,"tag":84,"props":197253,"children":197254},{},[197255],{"type":23,"value":197256},"Support write operations on many platforms, but not all",{"type":17,"tag":29,"props":197258,"children":197259},{},[197260],{"type":23,"value":20861},{"type":17,"tag":29,"props":197262,"children":197263},{},[197264,197269],{"type":17,"tag":6121,"props":197265,"children":197267},{"className":197266},[],[197268],{"type":23,"value":132233},{"type":23,"value":197270}," is a recruiting signal only. It does not create an employee automatically.",{"type":17,"tag":239,"props":197272,"children":197274},{"id":197273},"jobs",[197275],{"type":23,"value":56865},{"type":17,"tag":80,"props":197277,"children":197278},{},[197279,197284,197289],{"type":17,"tag":84,"props":197280,"children":197281},{},[197282],{"type":23,"value":197283},"Represent requisitions or open roles",{"type":17,"tag":84,"props":197285,"children":197286},{},[197287],{"type":23,"value":197288},"Include attributes such as description, compensation, employment type, location, and number of openings",{"type":17,"tag":84,"props":197290,"children":197291},{},[197292],{"type":23,"value":197293},"Support create, update, and close operations where the provider allows it",{"type":17,"tag":29,"props":197295,"children":197296},{},[197297],{"type":23,"value":197298},"Provider variability:",{"type":17,"tag":80,"props":197300,"children":197301},{},[197302,197307],{"type":17,"tag":84,"props":197303,"children":197304},{},[197305],{"type":23,"value":197306},"Some ATS platforms restrict external job creation or editing",{"type":17,"tag":84,"props":197308,"children":197309},{},[197310],{"type":23,"value":197311},"Certain fields may be unavailable depending on the provider",{"type":17,"tag":239,"props":197313,"children":197314},{"id":55728},[197315],{"type":23,"value":56891},{"type":17,"tag":80,"props":197317,"children":197318},{},[197319,197324,197329],{"type":17,"tag":84,"props":197320,"children":197321},{},[197322],{"type":23,"value":197323},"Capture scheduled interview events",{"type":17,"tag":84,"props":197325,"children":197326},{},[197327],{"type":23,"value":197328},"Link candidates, jobs, applications, and interviewers",{"type":17,"tag":84,"props":197330,"children":197331},{},[197332],{"type":23,"value":197333},"May be read-only on some ATS platforms",{"type":17,"tag":239,"props":197335,"children":197337},{"id":197336},"activities",[197338],{"type":23,"value":56904},{"type":17,"tag":80,"props":197340,"children":197341},{},[197342,197347,197352],{"type":17,"tag":84,"props":197343,"children":197344},{},[197345],{"type":23,"value":197346},"Represent recruiting events such as notes, status changes, or communications",{"type":17,"tag":84,"props":197348,"children":197349},{},[197350],{"type":23,"value":197351},"Can reference candidates, applications, jobs, documents, and employees",{"type":17,"tag":84,"props":197353,"children":197354},{},[197355],{"type":23,"value":180660},{"type":17,"tag":239,"props":197357,"children":197358},{"id":23782},[197359],{"type":23,"value":56930},{"type":17,"tag":80,"props":197361,"children":197362},{},[197363,197368,197373],{"type":17,"tag":84,"props":197364,"children":197365},{},[197366],{"type":23,"value":197367},"Store resumes, cover letters, and other attachments",{"type":17,"tag":84,"props":197369,"children":197370},{},[197371],{"type":23,"value":197372},"Uploaded via base64 and retrieved through time-limited URLs",{"type":17,"tag":84,"props":197374,"children":197375},{},[197376],{"type":23,"value":197377},"Associations to candidates, applications, jobs, or employees are provider-dependent",{"type":17,"tag":239,"props":197379,"children":197381},{"id":197380},"scorecards",[197382],{"type":23,"value":56917},{"type":17,"tag":80,"props":197384,"children":197385},{},[197386,197391],{"type":17,"tag":84,"props":197387,"children":197388},{},[197389],{"type":23,"value":197390},"Capture interview feedback and evaluations",{"type":17,"tag":84,"props":197392,"children":197393},{},[197394],{"type":23,"value":197395},"Support create, update, and retrieve operations where the ATS allows it",{"type":17,"tag":239,"props":197397,"children":197399},{"id":197398},"application-statuses",[197400],{"type":23,"value":197401},"Application Statuses",{"type":17,"tag":80,"props":197403,"children":197404},{},[197405,197410],{"type":17,"tag":84,"props":197406,"children":197407},{},[197408],{"type":23,"value":197409},"Read-only list of normalized and provider-specific recruiting stages",{"type":17,"tag":84,"props":197411,"children":197412},{},[197413],{"type":23,"value":197414},"Used to understand and map pipeline state consistently",{"type":17,"tag":239,"props":197416,"children":197417},{"id":195081},[197418],{"type":23,"value":195084},{"type":17,"tag":29,"props":197420,"children":197421},{},[197422,197424,197428],{"type":23,"value":197423},"Unified normalizes critical recruiting fields while still making ",{"type":17,"tag":48,"props":197425,"children":197426},{},[197427],{"type":23,"value":195094},{"type":23,"value":197429},". This allows teams to build against consistent objects without losing access to ATS-specific attributes.",{"type":17,"tag":29,"props":197431,"children":197432},{},[197433],{"type":23,"value":197434},"Normalization stops where providers diverge. Unified does not invent missing fields or infer recruiting semantics.",{"type":17,"tag":68,"props":197436,"children":197438},{"id":197437},"common-ats-api-integration-use-cases",[197439],{"type":23,"value":197440},"Common ATS API Integration Use Cases",{"type":17,"tag":239,"props":197442,"children":197444},{"id":197443},"recruiting-analytics-reporting",[197445],{"type":23,"value":197446},"Recruiting Analytics & Reporting",{"type":17,"tag":29,"props":197448,"children":197449},{},[197450],{"type":23,"value":197451},"Build dashboards that track pipeline velocity, time-to-hire, candidate sources, and recruiting performance across multiple ATS platforms.",{"type":17,"tag":239,"props":197453,"children":197454},{"id":55827},[197455],{"type":23,"value":197456},"Candidate Sourcing Tools",{"type":17,"tag":29,"props":197458,"children":197459},{},[197460],{"type":23,"value":197461},"Create sourcing products that add candidates directly into ATS pipelines and track engagement across platforms.",{"type":17,"tag":239,"props":197463,"children":197465},{"id":197464},"interview-scheduling-assessment-platforms",[197466],{"type":23,"value":197467},"Interview Scheduling & Assessment Platforms",{"type":17,"tag":29,"props":197469,"children":197470},{},[197471],{"type":23,"value":197472},"Coordinate interviews, attach scorecards, and write results back to the ATS in real time.",{"type":17,"tag":239,"props":197474,"children":197476},{"id":197475},"background-checks-verification",[197477],{"type":23,"value":197478},"Background Checks & Verification",{"type":17,"tag":29,"props":197480,"children":197481},{},[197482],{"type":23,"value":197483},"Initiate background checks when applications reach specific stages and store results or documents back in the ATS.",{"type":17,"tag":239,"props":197485,"children":197487},{"id":197486},"recruitment-marketing-job-distribution",[197488],{"type":23,"value":197489},"Recruitment Marketing & Job Distribution",{"type":17,"tag":29,"props":197491,"children":197492},{},[197493],{"type":23,"value":197494},"Publish jobs from ATS platforms to career sites or external channels and track application sources centrally.",{"type":17,"tag":239,"props":197496,"children":197498},{"id":197497},"ai-based-candidate-analysis",[197499],{"type":23,"value":197500},"AI-Based Candidate Analysis",{"type":17,"tag":29,"props":197502,"children":197503},{},[197504],{"type":23,"value":197505},"Analyze resumes and applications using AI while keeping ATS data as the source of truth.",{"type":17,"tag":68,"props":197507,"children":197509},{"id":197508},"how-real-time-ats-events-work",[197510],{"type":23,"value":197511},"How Real-Time ATS Events Work",{"type":17,"tag":239,"props":197513,"children":197514},{"id":100676},[197515],{"type":23,"value":194004},{"type":17,"tag":80,"props":197517,"children":197518},{},[197519,197532],{"type":17,"tag":84,"props":197520,"children":197521},{},[197522,197530],{"type":17,"tag":48,"props":197523,"children":197524},{},[197525,197526],{"type":23,"value":119374},{"type":17,"tag":133,"props":197527,"children":197528},{"href":4999},[197529],{"type":23,"value":5002},{"type":23,"value":197531}," are forwarded immediately when supported by the ATS",{"type":17,"tag":84,"props":197533,"children":197534},{},[197535,197539],{"type":17,"tag":48,"props":197536,"children":197537},{},[197538],{"type":23,"value":9256},{"type":23,"value":197540}," simulate event delivery by polling the source ATS at configurable intervals (as frequently as one minute on paid plans)",{"type":17,"tag":29,"props":197542,"children":197543},{},[197544],{"type":23,"value":197545},"Both use the same subscription interface and event schema, allowing applications to process backfills and live updates consistently.",{"type":17,"tag":239,"props":197547,"children":197549},{"id":197548},"retries-health-and-visibility",[197550],{"type":23,"value":197551},"Retries, Health, and Visibility",{"type":17,"tag":80,"props":197553,"children":197554},{},[197555,197560,197565],{"type":17,"tag":84,"props":197556,"children":197557},{},[197558],{"type":23,"value":197559},"Polling intervals are configurable",{"type":17,"tag":84,"props":197561,"children":197562},{},[197563],{"type":23,"value":197564},"Built-in retry and backoff logic handles transient failures",{"type":17,"tag":84,"props":197566,"children":197567},{},[197568],{"type":23,"value":197569},"Each webhook has an audit trail and health status",{"type":17,"tag":29,"props":197571,"children":197572},{},[197573],{"type":23,"value":197574},"Webhook execution follows usage-based pricing, and each run that checks for changes counts as an API call.",{"type":17,"tag":68,"props":197576,"children":197577},{"id":195285},[197578],{"type":23,"value":195288},{"type":17,"tag":29,"props":197580,"children":197581},{},[197582],{"type":23,"value":197583},"Unified abstracts ATS authentication complexity:",{"type":17,"tag":80,"props":197585,"children":197586},{},[197587,197592,197596],{"type":17,"tag":84,"props":197588,"children":197589},{},[197590],{"type":23,"value":197591},"OAuth2 and API-key-based flows are handled automatically",{"type":17,"tag":84,"props":197593,"children":197594},{},[197595],{"type":23,"value":195306},{"type":17,"tag":84,"props":197597,"children":197598},{},[197599],{"type":23,"value":195311},{"type":17,"tag":29,"props":197601,"children":197602},{},[197603,197604,197608],{"type":23,"value":195316},{"type":17,"tag":48,"props":197605,"children":197606},{},[197607],{"type":23,"value":195321},{"type":23,"value":195323},{"type":17,"tag":29,"props":197610,"children":197611},{},[197612],{"type":23,"value":195328},{"type":17,"tag":80,"props":197614,"children":197615},{},[197616,197621,197626,197630],{"type":17,"tag":84,"props":197617,"children":197618},{},[197619],{"type":23,"value":197620},"Token exchange and refresh",{"type":17,"tag":84,"props":197622,"children":197623},{},[197624],{"type":23,"value":197625},"Provider-specific OAuth behavior",{"type":17,"tag":84,"props":197627,"children":197628},{},[197629],{"type":23,"value":195346},{"type":17,"tag":84,"props":197631,"children":197632},{},[197633,197634,197639,197640,197645,197646,197651],{"type":23,"value":195351},{"type":17,"tag":6121,"props":197635,"children":197637},{"className":197636},[],[197638],{"type":23,"value":195357},{"type":23,"value":11826},{"type":17,"tag":6121,"props":197641,"children":197643},{"className":197642},[],[197644],{"type":23,"value":195364},{"type":23,"value":11826},{"type":17,"tag":6121,"props":197647,"children":197649},{"className":197648},[],[197650],{"type":23,"value":195371},{"type":23,"value":12034},{"type":17,"tag":68,"props":197653,"children":197655},{"id":197654},"security-privacy-and-data-handling-for-ats-data",[197656],{"type":23,"value":197657},"Security, Privacy, and Data Handling for ATS Data",{"type":17,"tag":29,"props":197659,"children":197660},{},[197661],{"type":23,"value":197662},"Recruiting data often includes sensitive information such as resumes and interview notes. Unified's architecture is designed to minimize risk.",{"type":17,"tag":239,"props":197664,"children":197665},{"id":17064},[197666],{"type":23,"value":53239},{"type":17,"tag":80,"props":197668,"children":197669},{},[197670,197675,197680],{"type":17,"tag":84,"props":197671,"children":197672},{},[197673],{"type":23,"value":197674},"No candidate or recruiting data is stored at rest",{"type":17,"tag":84,"props":197676,"children":197677},{},[197678],{"type":23,"value":197679},"No ATS payloads are cached or mirrored",{"type":17,"tag":84,"props":197681,"children":197682},{},[197683],{"type":23,"value":197684},"Requests are stateless and pass-through",{"type":17,"tag":239,"props":197686,"children":197688},{"id":197687},"document-handling",[197689],{"type":23,"value":197690},"Document Handling",{"type":17,"tag":80,"props":197692,"children":197693},{},[197694,197699,197704],{"type":17,"tag":84,"props":197695,"children":197696},{},[197697],{"type":23,"value":197698},"Documents are uploaded via base64",{"type":17,"tag":84,"props":197700,"children":197701},{},[197702],{"type":23,"value":197703},"Retrieved through time-limited URLs (typically expiring after one hour)",{"type":17,"tag":84,"props":197705,"children":197706},{},[197707],{"type":23,"value":197708},"No long-term document retention on Unified infrastructure",{"type":17,"tag":239,"props":197710,"children":197711},{"id":194156},[197712],{"type":23,"value":194159},{"type":17,"tag":80,"props":197714,"children":197715},{},[197716,197720,197724,197728,197732],{"type":17,"tag":84,"props":197717,"children":197718},{},[197719],{"type":23,"value":94139},{"type":17,"tag":84,"props":197721,"children":197722},{},[197723],{"type":23,"value":195450},{"type":17,"tag":84,"props":197725,"children":197726},{},[197727],{"type":23,"value":195455},{"type":17,"tag":84,"props":197729,"children":197730},{},[197731],{"type":23,"value":195460},{"type":17,"tag":84,"props":197733,"children":197734},{},[197735],{"type":23,"value":197736},"Optional log streaming to customer-owned Datadog instances",{"type":17,"tag":68,"props":197738,"children":197740},{"id":197739},"ats-and-hr-explicit-references-no-implicit-lifecycle",[197741],{"type":23,"value":197742},"ATS and HR: Explicit References, No Implicit Lifecycle",{"type":17,"tag":29,"props":197744,"children":197745},{},[197746,197748,197753,197754,197759,197761,197766],{"type":23,"value":197747},"Certain ATS objects include optional ",{"type":17,"tag":6121,"props":197749,"children":197751},{"className":197750},[],[197752],{"type":23,"value":62582},{"type":23,"value":75890},{"type":17,"tag":6121,"props":197755,"children":197757},{"className":197756},[],[197758],{"type":23,"value":111357},{"type":23,"value":197760}," fields that reference ",{"type":17,"tag":48,"props":197762,"children":197763},{},[197764],{"type":23,"value":197765},"HR employees",{"type":23,"value":197767}," (for example, recruiters or interviewers). These references are contextual only.",{"type":17,"tag":29,"props":197769,"children":197770},{},[197771,197773,197777],{"type":23,"value":197772},"What Unified does ",{"type":17,"tag":48,"props":197774,"children":197775},{},[197776],{"type":23,"value":159475},{"type":23,"value":197778}," do:",{"type":17,"tag":80,"props":197780,"children":197781},{},[197782,197787,197799],{"type":17,"tag":84,"props":197783,"children":197784},{},[197785],{"type":23,"value":197786},"Automatically convert candidates into employees",{"type":17,"tag":84,"props":197788,"children":197789},{},[197790,197792,197797],{"type":23,"value":197791},"Trigger HR record creation when ",{"type":17,"tag":6121,"props":197793,"children":197795},{"className":197794},[],[197796],{"type":23,"value":132233},{"type":23,"value":197798}," is set",{"type":17,"tag":84,"props":197800,"children":197801},{},[197802],{"type":23,"value":197803},"Infer employment from recruiting state",{"type":17,"tag":29,"props":197805,"children":197806},{},[197807],{"type":23,"value":197808},"Hiring ends in the ATS. Employment begins in HR & Directory—when the application decides.",{"type":17,"tag":68,"props":197810,"children":197811},{"id":188461},[197812],{"type":23,"value":188464},{"type":17,"tag":29,"props":197814,"children":197815},{},[197816],{"type":23,"value":197817},"Unified is explicit about ATS limitations:",{"type":17,"tag":80,"props":197819,"children":197820},{},[197821,197825,197830,197835,197840],{"type":17,"tag":84,"props":197822,"children":197823},{},[197824],{"type":23,"value":180660},{"type":17,"tag":84,"props":197826,"children":197827},{},[197828],{"type":23,"value":197829},"Some objects may be read-only",{"type":17,"tag":84,"props":197831,"children":197832},{},[197833],{"type":23,"value":197834},"Recruiting stages differ widely across platforms",{"type":17,"tag":84,"props":197836,"children":197837},{},[197838],{"type":23,"value":197839},"Certain fields may be slow or incomplete",{"type":17,"tag":84,"props":197841,"children":197842},{},[197843],{"type":23,"value":197844},"No inference or automation beyond what the provider supports",{"type":17,"tag":29,"props":197846,"children":197847},{},[197848],{"type":23,"value":197849},"These constraints are intentional. Unified provides reliable recruiting primitives, not opinionated hiring logic.",{"type":17,"tag":68,"props":197851,"children":197853},{"id":197852},"build-vs-buy-ats-api-integrations",[197854],{"type":23,"value":197855},"Build vs Buy ATS API Integrations",{"type":17,"tag":239,"props":197857,"children":197858},{"id":165021},[197859],{"type":23,"value":165024},{"type":17,"tag":80,"props":197861,"children":197862},{},[197863,197868,197873,197878],{"type":17,"tag":84,"props":197864,"children":197865},{},[197866],{"type":23,"value":197867},"Multiple ATS APIs to learn and maintain",{"type":17,"tag":84,"props":197869,"children":197870},{},[197871],{"type":23,"value":197872},"Provider-specific authentication, pagination, and rate limits",{"type":17,"tag":84,"props":197874,"children":197875},{},[197876],{"type":23,"value":197877},"Custom polling, retries, and reconciliation",{"type":17,"tag":84,"props":197879,"children":197880},{},[197881],{"type":23,"value":197882},"Ongoing maintenance overhead",{"type":17,"tag":239,"props":197884,"children":197886},{"id":197885},"using-a-unified-ats-api",[197887],{"type":23,"value":197888},"Using a Unified ATS API",{"type":17,"tag":80,"props":197890,"children":197891},{},[197892,197897,197902,197907],{"type":17,"tag":84,"props":197893,"children":197894},{},[197895],{"type":23,"value":197896},"One ATS API surface across dozens of platforms",{"type":17,"tag":84,"props":197898,"children":197899},{},[197900],{"type":23,"value":197901},"Real-time data access without replicas",{"type":17,"tag":84,"props":197903,"children":197904},{},[197905],{"type":23,"value":197906},"Centralized authentication, event delivery, and maintenance",{"type":17,"tag":84,"props":197908,"children":197909},{},[197910],{"type":23,"value":160033},{"type":17,"tag":68,"props":197912,"children":197914},{"id":197913},"best-practices-for-implementing-ats-api-integrations",[197915],{"type":23,"value":197916},"Best Practices for Implementing ATS API Integrations",{"type":17,"tag":80,"props":197918,"children":197919},{},[197920,197932,197943,197948,197953],{"type":17,"tag":84,"props":197921,"children":197922},{},[197923,197925,197930],{"type":23,"value":197924},"Rely on ",{"type":17,"tag":6121,"props":197926,"children":197928},{"className":197927},[],[197929],{"type":23,"value":117334},{"type":23,"value":197931}," when provider fidelity matters",{"type":17,"tag":84,"props":197933,"children":197934},{},[197935,197936,197941],{"type":23,"value":156457},{"type":17,"tag":6121,"props":197937,"children":197939},{"className":197938},[],[197940],{"type":23,"value":132233},{"type":23,"value":197942}," as a signal, not an automation",{"type":17,"tag":84,"props":197944,"children":197945},{},[197946],{"type":23,"value":197947},"Expect provider variability and partial data",{"type":17,"tag":84,"props":197949,"children":197950},{},[197951],{"type":23,"value":197952},"Monitor connection health and webhook delivery",{"type":17,"tag":84,"props":197954,"children":197955},{},[197956],{"type":23,"value":197957},"Keep recruiting and employment logic in the application layer",{"type":17,"tag":68,"props":197959,"children":197961},{"id":197960},"build-ats-integrations-the-right-way",[197962],{"type":23,"value":197963},"Build ATS integrations the right way",{"type":17,"tag":29,"props":197965,"children":197966},{},[197967],{"type":23,"value":197968},"If your product depends on accurate recruiting data—candidate pipelines, interview updates, assessments, or hiring signals—batch syncs and one-off ATS integrations won't scale.",{"type":17,"tag":29,"props":197970,"children":197971},{},[197972,197973,197977],{"type":23,"value":25244},{"type":17,"tag":48,"props":197974,"children":197975},{},[197976],{"type":23,"value":55699},{"type":23,"value":197978}," gives you real-time, authorized access to recruiting data across dozens of ATS platforms, without storing candidate data or forcing you to maintain provider-specific code paths.",{"type":17,"tag":29,"props":197980,"children":197981},{},[197982,197986,197987],{"type":17,"tag":48,"props":197983,"children":197984},{},[197985],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":197988,"children":197990},{"href":1612,"rel":197989},[214],[197991],{"type":17,"tag":48,"props":197992,"children":197993},{},[197994],{"type":23,"value":1616},{"type":17,"tag":29,"props":197996,"children":197997},{},[197998],{"type":23,"value":197999},"Test ATS integrations with real-time reads, writes, and webhooks—no setup fees during the trial.",{"type":17,"tag":29,"props":198001,"children":198002},{},[198003,198007,198008],{"type":17,"tag":48,"props":198004,"children":198005},{},[198006],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":198009,"children":198011},{"href":1623,"rel":198010},[214],[198012],{"type":17,"tag":48,"props":198013,"children":198014},{},[198015],{"type":23,"value":1627},{"type":17,"tag":29,"props":198017,"children":198018},{},[198019],{"type":23,"value":198020},"Talk through your recruiting or ATS → HR use case with the team that built the platform.",{"type":17,"tag":68,"props":198022,"children":198023},{"id":95759},[198024],{"type":23,"value":95762},{"type":17,"tag":29,"props":198026,"children":198027},{},[198028],{"type":17,"tag":48,"props":198029,"children":198030},{},[198031],{"type":23,"value":198032},"What is ATS API integration?",{"type":17,"tag":29,"props":198034,"children":198035},{},[198036],{"type":23,"value":198037},"Connecting recruiting software to applicant-tracking platforms via APIs to access and update hiring data programmatically.",{"type":17,"tag":29,"props":198039,"children":198040},{},[198041],{"type":17,"tag":48,"props":198042,"children":198043},{},[198044],{"type":23,"value":198045},"Which ATS platforms can I integrate with?",{"type":17,"tag":29,"props":198047,"children":198048},{},[198049],{"type":23,"value":198050},"Unified supports dozens of ATS platforms, including Greenhouse, Lever, Workable, iCIMS, Jobvite, SmartRecruiters, and more.",{"type":17,"tag":29,"props":198052,"children":198053},{},[198054],{"type":17,"tag":48,"props":198055,"children":198056},{},[198057],{"type":23,"value":198058},"Is ATS data real-time?",{"type":17,"tag":29,"props":198060,"children":198061},{},[198062],{"type":23,"value":198063},"All API calls are routed directly to the source ATS. Events are delivered via native or virtual webhooks.",{"type":17,"tag":29,"props":198065,"children":198066},{},[198067],{"type":17,"tag":48,"props":198068,"children":198069},{},[198070],{"type":23,"value":198071},"Can I write changes back to the ATS?",{"type":17,"tag":29,"props":198073,"children":198074},{},[198075],{"type":23,"value":198076},"Yes, subject to provider support. Many objects support create and update operations.",{"type":17,"tag":29,"props":198078,"children":198079},{},[198080],{"type":17,"tag":48,"props":198081,"children":198082},{},[198083],{"type":23,"value":198084},"Does the ATS API create employees automatically?",{"type":17,"tag":29,"props":198086,"children":198087},{},[198088],{"type":23,"value":198089},"No. Employee creation must be handled explicitly using the HR & Directory API.",{"type":17,"tag":29,"props":198091,"children":198092},{},[198093],{"type":17,"tag":48,"props":198094,"children":198095},{},[198096],{"type":23,"value":198097},"How are resumes and attachments handled?",{"type":17,"tag":29,"props":198099,"children":198100},{},[198101],{"type":23,"value":198102},"Documents are uploaded via base64 and retrieved through time-limited URLs.",{"title":7,"searchDepth":1629,"depth":1629,"links":198104},[198105,198106,198107,198108,198112,198123,198131,198135,198136,198141,198142,198143,198147,198148,198149],{"id":196901,"depth":1629,"text":196904},{"id":196917,"depth":1629,"text":196920},{"id":196970,"depth":1629,"text":196973},{"id":197045,"depth":1629,"text":197048,"children":198109},[198110,198111],{"id":197056,"depth":1635,"text":197059},{"id":197096,"depth":1635,"text":197099},{"id":197135,"depth":1629,"text":197138,"children":198113},[198114,198115,198116,198117,198118,198119,198120,198121,198122],{"id":55713,"depth":1635,"text":56852},{"id":55723,"depth":1635,"text":56878},{"id":197273,"depth":1635,"text":56865},{"id":55728,"depth":1635,"text":56891},{"id":197336,"depth":1635,"text":56904},{"id":23782,"depth":1635,"text":56930},{"id":197380,"depth":1635,"text":56917},{"id":197398,"depth":1635,"text":197401},{"id":195081,"depth":1635,"text":195084},{"id":197437,"depth":1629,"text":197440,"children":198124},[198125,198126,198127,198128,198129,198130],{"id":197443,"depth":1635,"text":197446},{"id":55827,"depth":1635,"text":197456},{"id":197464,"depth":1635,"text":197467},{"id":197475,"depth":1635,"text":197478},{"id":197486,"depth":1635,"text":197489},{"id":197497,"depth":1635,"text":197500},{"id":197508,"depth":1629,"text":197511,"children":198132},[198133,198134],{"id":100676,"depth":1635,"text":194004},{"id":197548,"depth":1635,"text":197551},{"id":195285,"depth":1629,"text":195288},{"id":197654,"depth":1629,"text":197657,"children":198137},[198138,198139,198140],{"id":17064,"depth":1635,"text":53239},{"id":197687,"depth":1635,"text":197690},{"id":194156,"depth":1635,"text":194159},{"id":197739,"depth":1629,"text":197742},{"id":188461,"depth":1629,"text":188464},{"id":197852,"depth":1629,"text":197855,"children":198144},[198145,198146],{"id":165021,"depth":1635,"text":165024},{"id":197885,"depth":1635,"text":197888},{"id":197913,"depth":1629,"text":197916},{"id":197960,"depth":1629,"text":197963},{"id":95759,"depth":1629,"text":95762},"content:blog:ats_api_integration_real_time_recruiting_data_candidate_pipelines_and_hiring_automation.md","blog/ats_api_integration_real_time_recruiting_data_candidate_pipelines_and_hiring_automation.md","blog/ats_api_integration_real_time_recruiting_data_candidate_pipelines_and_hiring_automation",{"_path":198154,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":198155,"description":198156,"img":6339,"date":198157,"tag":12,"body":198158,"_type":1677,"_id":199437,"_source":1679,"_file":199438,"_stem":199439,"_extension":1682},"/blog/hr_api_integration_real_time_employee_data_directories_and_workforce_automation","HR API Integration: Real-Time Employee Data, Directories, and Workforce Automation","Modern software increasingly depends on accurate, up-to-date workforce data. Employee directories, onboarding and offboarding workflows, access provisioning,...","2026-02-06T22:53:00.000Z",{"type":14,"children":198159,"toc":199392},[198160,198165,198168,198175,198187,198192,198198,198203,198208,198214,198224,198228,198256,198262,198267,198300,198317,198323,198328,198334,198339,198357,198368,198374,198379,198402,198407,198413,198418,198436,198441,198459,198463,198499,198504,198510,198522,198528,198573,198577,198595,198601,198623,198629,198642,198648,198671,198677,198690,198696,198701,198706,198711,198719,198725,198731,198736,198742,198747,198765,198771,198776,198782,198787,198793,198798,198804,198808,198836,198841,198847,198865,198870,198874,198879,198896,198906,198910,198949,198955,198960,198964,198980,198986,198999,199003,199029,199034,199040,199051,199063,199081,199090,199108,199113,199117,199122,199150,199155,199161,199165,199182,199188,199210,199216,199255,199261,199266,199276,199281,199297,199302,199318,199323,199327,199335,199340,199348,199353,199361,199366,199374,199379,199387],{"type":17,"tag":18,"props":198161,"children":198163},{"id":198162},"hr-api-integration-real-time-employee-data-directories-and-workforce-automation",[198164],{"type":23,"value":198155},{"type":17,"tag":25,"props":198166,"children":198167},{},[],{"type":17,"tag":29,"props":198169,"children":198170},{},[198171],{"type":17,"tag":33,"props":198172,"children":198173},{},[198174],{"type":23,"value":196884},{"type":17,"tag":29,"props":198176,"children":198177},{},[198178,198180,198185],{"type":23,"value":198179},"Modern software increasingly depends on accurate, up-to-date workforce data. Employee directories, onboarding and offboarding workflows, access provisioning, analytics, and AI copilots all rely on one thing: trustworthy HR information that reflects reality ",{"type":17,"tag":33,"props":198181,"children":198182},{},[198183],{"type":23,"value":198184},"now",{"type":23,"value":198186},", not hours or days later.",{"type":17,"tag":29,"props":198188,"children":198189},{},[198190],{"type":23,"value":198191},"HR API integration exists to solve that problem. In this guide, we'll break down what HR API integration actually means, how real-time HR data differs from batch syncs, which data models matter, and how Unified's HR & Directory (HRIS) API fits into a broader product architecture that includes ATS, LMS, and verification systems.",{"type":17,"tag":68,"props":198193,"children":198195},{"id":198194},"introduction-to-hr-api-integrations",[198196],{"type":23,"value":198197},"Introduction to HR API Integrations",{"type":17,"tag":29,"props":198199,"children":198200},{},[198201],{"type":23,"value":198202},"Human Resources Information Systems (HRIS) such as Workday, BambooHR, ADP, and Rippling act as the system of record for workforce identity. They track employees, reporting structures, locations, benefits, payroll artifacts, and employment state.",{"type":17,"tag":29,"props":198204,"children":198205},{},[198206],{"type":23,"value":198207},"But HRIS platforms don't operate in isolation. SaaS products, IT systems, analytics tools, and AI workflows all need access to this data. HR API integration is the mechanism that makes that possible—without manual exports, brittle scripts, or stale replicas.",{"type":17,"tag":68,"props":198209,"children":198211},{"id":198210},"what-is-hr-api-integration",[198212],{"type":23,"value":198213},"What Is HR API Integration?",{"type":17,"tag":29,"props":198215,"children":198216},{},[198217,198222],{"type":17,"tag":48,"props":198218,"children":198219},{},[198220],{"type":23,"value":198221},"HR API integration",{"type":23,"value":198223}," is the process of connecting software products to HR systems via application programming interfaces (APIs) in order to read and write workforce data programmatically.",{"type":17,"tag":29,"props":198225,"children":198226},{},[198227],{"type":23,"value":167214},{"type":17,"tag":80,"props":198229,"children":198230},{},[198231,198236,198241,198246,198251],{"type":17,"tag":84,"props":198232,"children":198233},{},[198234],{"type":23,"value":198235},"Retrieving employee profiles and org structure",{"type":17,"tag":84,"props":198237,"children":198238},{},[198239],{"type":23,"value":198240},"Tracking employment changes (hires, terminations, role changes)",{"type":17,"tag":84,"props":198242,"children":198243},{},[198244],{"type":23,"value":198245},"Automating onboarding and offboarding",{"type":17,"tag":84,"props":198247,"children":198248},{},[198249],{"type":23,"value":198250},"Syncing identity and access systems",{"type":17,"tag":84,"props":198252,"children":198253},{},[198254],{"type":23,"value":198255},"Powering analytics and automated API-driven behavior",{"type":17,"tag":239,"props":198257,"children":198259},{"id":198258},"hr-api-vs-hris-api-vs-hr-directory",[198260],{"type":23,"value":198261},"HR API vs HRIS API vs HR & Directory",{"type":17,"tag":29,"props":198263,"children":198264},{},[198265],{"type":23,"value":198266},"These terms are often used interchangeably, but it helps to be precise:",{"type":17,"tag":80,"props":198268,"children":198269},{},[198270,198279,198288],{"type":17,"tag":84,"props":198271,"children":198272},{},[198273,198277],{"type":17,"tag":48,"props":198274,"children":198275},{},[198276],{"type":23,"value":89846},{"type":23,"value":198278}," refers to the source systems (Workday, ADP, BambooHR).",{"type":17,"tag":84,"props":198280,"children":198281},{},[198282,198286],{"type":17,"tag":48,"props":198283,"children":198284},{},[198285],{"type":23,"value":122608},{"type":23,"value":198287}," refers to an API surface that provides access to HR data.",{"type":17,"tag":84,"props":198289,"children":198290},{},[198291,198298],{"type":17,"tag":48,"props":198292,"children":198293},{},[198294],{"type":17,"tag":133,"props":198295,"children":198296},{"href":60186},[198297],{"type":23,"value":197036},{"type":23,"value":198299}," emphasizes identity, org structure, and workforce primitives.",{"type":17,"tag":29,"props":198301,"children":198302},{},[198303,198305,198309,198311,198315],{"type":23,"value":198304},"In this guide, ",{"type":17,"tag":33,"props":198306,"children":198307},{},[198308],{"type":23,"value":89846},{"type":23,"value":198310}," refers to the upstream systems, while ",{"type":17,"tag":33,"props":198312,"children":198313},{},[198314],{"type":23,"value":122608},{"type":23,"value":198316}," refers to Unified's normalized, real-time interface across them.",{"type":17,"tag":68,"props":198318,"children":198320},{"id":198319},"real-time-vs-batch-hr-data-sync",[198321],{"type":23,"value":198322},"Real-Time vs Batch HR Data Sync",{"type":17,"tag":29,"props":198324,"children":198325},{},[198326],{"type":23,"value":198327},"Many HR integrations rely on scheduled syncs—nightly jobs, hourly polling, or ETL pipelines that copy HR data into a separate database. That approach breaks down quickly.",{"type":17,"tag":239,"props":198329,"children":198331},{"id":198330},"understanding-real-time-hr-api-architecture",[198332],{"type":23,"value":198333},"Understanding Real-Time HR API Architecture",{"type":17,"tag":29,"props":198335,"children":198336},{},[198337],{"type":23,"value":198338},"A real-time HR API:",{"type":17,"tag":80,"props":198340,"children":198341},{},[198342,198347,198352],{"type":17,"tag":84,"props":198343,"children":198344},{},[198345],{"type":23,"value":198346},"Reads and writes data directly against the source HRIS",{"type":17,"tag":84,"props":198348,"children":198349},{},[198350],{"type":23,"value":198351},"Does not maintain a cached replica or shadow database",{"type":17,"tag":84,"props":198353,"children":198354},{},[198355],{"type":23,"value":198356},"Reflects the current state of employment immediately",{"type":17,"tag":29,"props":198358,"children":198359},{},[198360,198362,198366],{"type":23,"value":198361},"Unified's HR & Directory API uses a ",{"type":17,"tag":48,"props":198363,"children":198364},{},[198365],{"type":23,"value":86921},{"type":23,"value":198367},". Every API request hits the underlying HRIS live. There are no background sync jobs, no delayed updates, and no stored employee records sitting at rest.",{"type":17,"tag":239,"props":198369,"children":198371},{"id":198370},"limitations-of-scheduled-synchronization",[198372],{"type":23,"value":198373},"Limitations of Scheduled Synchronization",{"type":17,"tag":29,"props":198375,"children":198376},{},[198377],{"type":23,"value":198378},"Batch-based HR integrations introduce:",{"type":17,"tag":80,"props":198380,"children":198381},{},[198382,198387,198392,198397],{"type":17,"tag":84,"props":198383,"children":198384},{},[198385],{"type":23,"value":198386},"Stale directories and org charts",{"type":17,"tag":84,"props":198388,"children":198389},{},[198390],{"type":23,"value":198391},"Delayed de-provisioning (a security risk)",{"type":17,"tag":84,"props":198393,"children":198394},{},[198395],{"type":23,"value":198396},"Complex retry and reconciliation logic",{"type":17,"tag":84,"props":198398,"children":198399},{},[198400],{"type":23,"value":198401},"Data drift between systems",{"type":17,"tag":29,"props":198403,"children":198404},{},[198405],{"type":23,"value":198406},"For time-sensitive workflows—identity provisioning, access revocation, AI copilots—batch syncs are fundamentally insufficient.",{"type":17,"tag":68,"props":198408,"children":198410},{"id":198409},"hr-api-vs-scim-and-when-you-need-both",[198411],{"type":23,"value":198412},"HR API vs SCIM (and When You Need Both)",{"type":17,"tag":29,"props":198414,"children":198415},{},[198416],{"type":23,"value":198417},"SCIM is commonly used for provisioning users into identity systems. It focuses on:",{"type":17,"tag":80,"props":198419,"children":198420},{},[198421,198426,198431],{"type":17,"tag":84,"props":198422,"children":198423},{},[198424],{"type":23,"value":198425},"Creating, updating, and deleting users",{"type":17,"tag":84,"props":198427,"children":198428},{},[198429],{"type":23,"value":198430},"Group membership",{"type":17,"tag":84,"props":198432,"children":198433},{},[198434],{"type":23,"value":198435},"Basic lifecycle events",{"type":17,"tag":29,"props":198437,"children":198438},{},[198439],{"type":23,"value":198440},"An HR API is broader:",{"type":17,"tag":80,"props":198442,"children":198443},{},[198444,198449,198454],{"type":17,"tag":84,"props":198445,"children":198446},{},[198447],{"type":23,"value":198448},"It shows employment state, not just accounts",{"type":17,"tag":84,"props":198450,"children":198451},{},[198452],{"type":23,"value":198453},"It includes org structure, locations, payroll artifacts, benefits, and time-based data",{"type":17,"tag":84,"props":198455,"children":198456},{},[198457],{"type":23,"value":198458},"It supports analytics, automation, and AI workflows beyond identity",{"type":17,"tag":29,"props":198460,"children":198461},{},[198462],{"type":23,"value":105205},{"type":17,"tag":80,"props":198464,"children":198465},{},[198466,198483],{"type":17,"tag":84,"props":198467,"children":198468},{},[198469,198474,198476,198481],{"type":17,"tag":48,"props":198470,"children":198471},{},[198472],{"type":23,"value":198473},"SCIM",{"type":23,"value":198475}," is useful for pushing users ",{"type":17,"tag":33,"props":198477,"children":198478},{},[198479],{"type":23,"value":198480},"into",{"type":23,"value":198482}," downstream systems",{"type":17,"tag":84,"props":198484,"children":198485},{},[198486,198490,198492,198497],{"type":17,"tag":48,"props":198487,"children":198488},{},[198489],{"type":23,"value":187668},{"type":23,"value":198491}," are used to ",{"type":17,"tag":33,"props":198493,"children":198494},{},[198495],{"type":23,"value":198496},"observe and react",{"type":23,"value":198498}," to workforce reality",{"type":17,"tag":29,"props":198500,"children":198501},{},[198502],{"type":23,"value":198503},"Many products use both. Unified's HR & Directory API complements SCIM rather than replacing it.",{"type":17,"tag":68,"props":198505,"children":198507},{"id":198506},"core-hr-data-models-and-how-they-behave",[198508],{"type":23,"value":198509},"Core HR Data Models (and How They Behave)",{"type":17,"tag":29,"props":198511,"children":198512},{},[198513,198515,198520],{"type":23,"value":198514},"Unified normalizes HR data ",{"type":17,"tag":48,"props":198516,"children":198517},{},[198518],{"type":23,"value":198519},"within the HR category",{"type":23,"value":198521},", exposing consistent primitives across hundreds of HRIS platforms. These objects are deeply defined—but intentionally limited to observable facts.",{"type":17,"tag":239,"props":198523,"children":198525},{"id":198524},"identity-org-structure",[198526],{"type":23,"value":198527},"Identity & Org Structure",{"type":17,"tag":80,"props":198529,"children":198530},{},[198531,198546,198555,198564],{"type":17,"tag":84,"props":198532,"children":198533},{},[198534,198538,198540,198545],{"type":17,"tag":48,"props":198535,"children":198536},{},[198537],{"type":23,"value":61210},{"type":23,"value":198539}," – Canonical workforce identity with profile fields, employment status, manager relationships, group and location membership, compensation snapshots and ",{"type":17,"tag":48,"props":198541,"children":198542},{},[198543],{"type":23,"value":198544},"provider-specific custom fields",{"type":23,"value":54},{"type":17,"tag":84,"props":198547,"children":198548},{},[198549,198553],{"type":17,"tag":48,"props":198550,"children":198551},{},[198552],{"type":23,"value":18623},{"type":23,"value":198554}," – Departments, teams, or divisions, represented as hierarchical graphs.",{"type":17,"tag":84,"props":198556,"children":198557},{},[198558,198562],{"type":17,"tag":48,"props":198559,"children":198560},{},[198561],{"type":23,"value":19564},{"type":23,"value":198563}," – Physical or geographic locations with optional hierarchy.",{"type":17,"tag":84,"props":198565,"children":198566},{},[198567,198571],{"type":17,"tag":48,"props":198568,"children":198569},{},[198570],{"type":23,"value":25846},{"type":23,"value":198572}," – Organizational scope for multi-entity structures.",{"type":17,"tag":29,"props":198574,"children":198575},{},[198576],{"type":23,"value":194883},{"type":17,"tag":80,"props":198578,"children":198579},{},[198580,198585,198590],{"type":17,"tag":84,"props":198581,"children":198582},{},[198583],{"type":23,"value":198584},"Manager relationships may be missing.",{"type":17,"tag":84,"props":198586,"children":198587},{},[198588],{"type":23,"value":198589},"Employees can belong to multiple groups or locations.",{"type":17,"tag":84,"props":198591,"children":198592},{},[198593],{"type":23,"value":198594},"Timestamps reflect record updates, not inferred events.",{"type":17,"tag":239,"props":198596,"children":198598},{"id":198597},"time-workforce-state",[198599],{"type":23,"value":198600},"Time & Workforce State",{"type":17,"tag":80,"props":198602,"children":198603},{},[198604,198613],{"type":17,"tag":84,"props":198605,"children":198606},{},[198607,198611],{"type":17,"tag":48,"props":198608,"children":198609},{},[198610],{"type":23,"value":59865},{"type":23,"value":198612}," – Leave events with start/end dates and approval state (read-only).",{"type":17,"tag":84,"props":198614,"children":198615},{},[198616,198621],{"type":17,"tag":48,"props":198617,"children":198618},{},[198619],{"type":23,"value":198620},"Time Shift",{"type":23,"value":198622}," – Work schedules or shift records (provider-dependent).",{"type":17,"tag":239,"props":198624,"children":198626},{"id":198625},"payroll-artifacts",[198627],{"type":23,"value":198628},"Payroll Artifacts",{"type":17,"tag":80,"props":198630,"children":198631},{},[198632],{"type":17,"tag":84,"props":198633,"children":198634},{},[198635,198640],{"type":17,"tag":48,"props":198636,"children":198637},{},[198638],{"type":23,"value":198639},"Payslip",{"type":23,"value":198641}," – Historical payroll snapshots (read-only). Not all providers support server-side filtering.",{"type":17,"tag":239,"props":198643,"children":198645},{"id":198644},"benefits-deductions",[198646],{"type":23,"value":198647},"Benefits & Deductions",{"type":17,"tag":80,"props":198649,"children":198650},{},[198651,198661],{"type":17,"tag":84,"props":198652,"children":198653},{},[198654,198659],{"type":17,"tag":48,"props":198655,"children":198656},{},[198657],{"type":23,"value":198658},"Benefit",{"type":23,"value":198660}," – Benefit plans and coverage definitions.",{"type":17,"tag":84,"props":198662,"children":198663},{},[198664,198669],{"type":17,"tag":48,"props":198665,"children":198666},{},[198667],{"type":23,"value":198668},"Deduction",{"type":23,"value":198670}," – Payroll withholdings linked to employees and benefits.",{"type":17,"tag":239,"props":198672,"children":198674},{"id":198673},"assets",[198675],{"type":23,"value":198676},"Assets",{"type":17,"tag":80,"props":198678,"children":198679},{},[198680],{"type":17,"tag":84,"props":198681,"children":198682},{},[198683,198688],{"type":17,"tag":48,"props":198684,"children":198685},{},[198686],{"type":23,"value":198687},"Device",{"type":23,"value":198689}," – Company-issued hardware assigned to employees.",{"type":17,"tag":239,"props":198691,"children":198693},{"id":198692},"normalized-vs-provider-specific-fields",[198694],{"type":23,"value":198695},"Normalized vs Provider-Specific Fields",{"type":17,"tag":29,"props":198697,"children":198698},{},[198699],{"type":23,"value":198700},"Unified normalizes critical fields across providers while still making provider-specific fields available when required.",{"type":17,"tag":29,"props":198702,"children":198703},{},[198704],{"type":23,"value":198705},"This allows teams to rely on consistent objects for common use cases, without losing access to original provider attributes that fall outside the normalized model.",{"type":17,"tag":29,"props":198707,"children":198708},{},[198709],{"type":23,"value":198710},"Normalization stops where vendors diverge. Unified does not invent missing fields or infer semantics.",{"type":17,"tag":29,"props":198712,"children":198713},{},[198714],{"type":17,"tag":33,"props":198715,"children":198716},{},[198717],{"type":23,"value":198718},"Internally, provider-specific fields are returned alongside normalized objects for teams that need full field coverage.",{"type":17,"tag":68,"props":198720,"children":198722},{"id":198721},"common-hr-api-integration-use-cases",[198723],{"type":23,"value":198724},"Common HR API Integration Use Cases",{"type":17,"tag":239,"props":198726,"children":198728},{"id":198727},"employee-directories-org-charts",[198729],{"type":23,"value":198730},"Employee Directories & Org Charts",{"type":17,"tag":29,"props":198732,"children":198733},{},[198734],{"type":23,"value":198735},"Build real-time directories that reflect current employees, reporting structures, and locations—without waiting for nightly syncs.",{"type":17,"tag":239,"props":198737,"children":198739},{"id":198738},"onboarding-offboarding-automation",[198740],{"type":23,"value":198741},"Onboarding & Offboarding Automation",{"type":17,"tag":29,"props":198743,"children":198744},{},[198745],{"type":23,"value":198746},"Trigger workflows when employees are hired or terminated:",{"type":17,"tag":80,"props":198748,"children":198749},{},[198750,198755,198760],{"type":17,"tag":84,"props":198751,"children":198752},{},[198753],{"type":23,"value":198754},"Provision accounts",{"type":17,"tag":84,"props":198756,"children":198757},{},[198758],{"type":23,"value":198759},"Assign devices",{"type":17,"tag":84,"props":198761,"children":198762},{},[198763],{"type":23,"value":198764},"Revoke access immediately",{"type":17,"tag":239,"props":198766,"children":198768},{"id":198767},"identity-access-provisioning",[198769],{"type":23,"value":198770},"Identity & Access Provisioning",{"type":17,"tag":29,"props":198772,"children":198773},{},[198774],{"type":23,"value":198775},"Use HR data as the source of truth for identity systems, while keeping provisioning logic in your application.",{"type":17,"tag":239,"props":198777,"children":198779},{"id":198778},"workforce-analytics-reporting",[198780],{"type":23,"value":198781},"Workforce Analytics & Reporting",{"type":17,"tag":29,"props":198783,"children":198784},{},[198785],{"type":23,"value":198786},"Analyze headcount, turnover, and organizational change using observable employment data—not inferred projections.",{"type":17,"tag":239,"props":198788,"children":198790},{"id":198789},"ai-copilots-and-automation",[198791],{"type":23,"value":198792},"AI Copilots and Automation",{"type":17,"tag":29,"props":198794,"children":198795},{},[198796],{"type":23,"value":198797},"Feed live HR data into AI workflows and agents, with scoped permissions and optional PII redaction.",{"type":17,"tag":68,"props":198799,"children":198801},{"id":198800},"how-real-time-hr-events-work",[198802],{"type":23,"value":198803},"How Real-Time HR Events Work",{"type":17,"tag":239,"props":198805,"children":198806},{"id":180381},[198807],{"type":23,"value":180384},{"type":17,"tag":80,"props":198809,"children":198810},{},[198811,198824],{"type":17,"tag":84,"props":198812,"children":198813},{},[198814,198822],{"type":17,"tag":48,"props":198815,"children":198816},{},[198817,198818],{"type":23,"value":119374},{"type":17,"tag":133,"props":198819,"children":198820},{"href":4999},[198821],{"type":23,"value":5002},{"type":23,"value":198823}," are forwarded directly when supported by the HRIS.",{"type":17,"tag":84,"props":198825,"children":198826},{},[198827,198834],{"type":17,"tag":48,"props":198828,"children":198829},{},[198830],{"type":17,"tag":133,"props":198831,"children":198832},{"href":9007},[198833],{"type":23,"value":9256},{"type":23,"value":198835}," simulate real-time updates by polling the source API, detecting changes, and emitting events.",{"type":17,"tag":29,"props":198837,"children":198838},{},[198839],{"type":23,"value":198840},"Both use the same subscription interface and event schema.",{"type":17,"tag":239,"props":198842,"children":198844},{"id":198843},"freshness-retries-and-health",[198845],{"type":23,"value":198846},"Freshness, Retries, and Health",{"type":17,"tag":80,"props":198848,"children":198849},{},[198850,198855,198860],{"type":17,"tag":84,"props":198851,"children":198852},{},[198853],{"type":23,"value":198854},"Polling intervals are configurable (down to 1 minute on paid plans).",{"type":17,"tag":84,"props":198856,"children":198857},{},[198858],{"type":23,"value":198859},"Built-in retry and backoff logic handles rate limits and transient failures.",{"type":17,"tag":84,"props":198861,"children":198862},{},[198863],{"type":23,"value":198864},"Each webhook has an audit trail and health status.",{"type":17,"tag":29,"props":198866,"children":198867},{},[198868],{"type":23,"value":198869},"Billing is usage-based and transparent—runs that discover data changes count as API calls.",{"type":17,"tag":68,"props":198871,"children":198872},{"id":195285},[198873],{"type":23,"value":195288},{"type":17,"tag":29,"props":198875,"children":198876},{},[198877],{"type":23,"value":198878},"Unified abstracts HRIS authentication complexity:",{"type":17,"tag":80,"props":198880,"children":198881},{},[198882,198887,198891],{"type":17,"tag":84,"props":198883,"children":198884},{},[198885],{"type":23,"value":198886},"OAuth2 and API-key flows are handled automatically",{"type":17,"tag":84,"props":198888,"children":198889},{},[198890],{"type":23,"value":195306},{"type":17,"tag":84,"props":198892,"children":198893},{},[198894],{"type":23,"value":198895},"Embedded auth components or fully manual flows are supported",{"type":17,"tag":29,"props":198897,"children":198898},{},[198899,198900,198904],{"type":23,"value":195316},{"type":17,"tag":48,"props":198901,"children":198902},{},[198903],{"type":23,"value":195321},{"type":23,"value":198905},", not raw credentials.",{"type":17,"tag":29,"props":198907,"children":198908},{},[198909],{"type":23,"value":195328},{"type":17,"tag":80,"props":198911,"children":198912},{},[198913,198917,198922,198944],{"type":17,"tag":84,"props":198914,"children":198915},{},[198916],{"type":23,"value":197620},{"type":17,"tag":84,"props":198918,"children":198919},{},[198920],{"type":23,"value":198921},"Provider-specific OAuth quirks",{"type":17,"tag":84,"props":198923,"children":198924},{},[198925,198926,198931,198932,198937,198938,198943],{"type":23,"value":195351},{"type":17,"tag":6121,"props":198927,"children":198929},{"className":198928},[],[198930],{"type":23,"value":195357},{"type":23,"value":11826},{"type":17,"tag":6121,"props":198933,"children":198935},{"className":198934},[],[198936],{"type":23,"value":195364},{"type":23,"value":11826},{"type":17,"tag":6121,"props":198939,"children":198941},{"className":198940},[],[198942],{"type":23,"value":195371},{"type":23,"value":12034},{"type":17,"tag":84,"props":198945,"children":198946},{},[198947],{"type":23,"value":198948},"Signed callbacks and standardized error codes",{"type":17,"tag":68,"props":198950,"children":198952},{"id":198951},"security-privacy-and-compliance-for-hr-data",[198953],{"type":23,"value":198954},"Security, Privacy, and Compliance for HR Data",{"type":17,"tag":29,"props":198956,"children":198957},{},[198958],{"type":23,"value":198959},"HR data is sensitive by nature. Unified's design reflects that.",{"type":17,"tag":239,"props":198961,"children":198962},{"id":17064},[198963],{"type":23,"value":53239},{"type":17,"tag":80,"props":198965,"children":198966},{},[198967,198972,198976],{"type":17,"tag":84,"props":198968,"children":198969},{},[198970],{"type":23,"value":198971},"No HR data is stored at rest",{"type":17,"tag":84,"props":198973,"children":198974},{},[198975],{"type":23,"value":195400},{"type":17,"tag":84,"props":198977,"children":198978},{},[198979],{"type":23,"value":197684},{"type":17,"tag":239,"props":198981,"children":198983},{"id":198982},"credential-ownership",[198984],{"type":23,"value":198985},"Credential Ownership",{"type":17,"tag":80,"props":198987,"children":198988},{},[198989,198994],{"type":17,"tag":84,"props":198990,"children":198991},{},[198992],{"type":23,"value":198993},"Credentials can be stored encrypted by Unified",{"type":17,"tag":84,"props":198995,"children":198996},{},[198997],{"type":23,"value":198998},"Or kept entirely in the customer's own secrets manager (AWS, Azure, GCP, Vault)",{"type":17,"tag":239,"props":199000,"children":199001},{"id":194156},[199002],{"type":23,"value":194159},{"type":17,"tag":80,"props":199004,"children":199005},{},[199006,199010,199014,199019,199024],{"type":17,"tag":84,"props":199007,"children":199008},{},[199009],{"type":23,"value":94139},{"type":17,"tag":84,"props":199011,"children":199012},{},[199013],{"type":23,"value":195450},{"type":17,"tag":84,"props":199015,"children":199016},{},[199017],{"type":23,"value":199018},"TLS 1.2+ in transit, AES-256 for minimal metadata",{"type":17,"tag":84,"props":199020,"children":199021},{},[199022],{"type":23,"value":199023},"SAML/OIDC SSO, IP allowlisting, webhook signing",{"type":17,"tag":84,"props":199025,"children":199026},{},[199027],{"type":23,"value":199028},"Optional Datadog log streaming",{"type":17,"tag":29,"props":199030,"children":199031},{},[199032],{"type":23,"value":199033},"For MCP and AI workflows, sensitive fields can be stripped before reaching LLMs.",{"type":17,"tag":68,"props":199035,"children":199037},{"id":199036},"hr-directory-and-ats-how-the-categories-connect",[199038],{"type":23,"value":199039},"HR & Directory and ATS: How the Categories Connect",{"type":17,"tag":29,"props":199041,"children":199042},{},[199043,199045,199050],{"type":23,"value":199044},"Unified's HR and ATS categories are ",{"type":17,"tag":48,"props":199046,"children":199047},{},[199048],{"type":23,"value":199049},"linked—but not coupled",{"type":23,"value":54},{"type":17,"tag":29,"props":199052,"children":199053},{},[199054,199056,199061],{"type":23,"value":199055},"ATS objects such as Candidate, Application, Document, and Interview may include optional ",{"type":17,"tag":6121,"props":199057,"children":199059},{"className":199058},[],[199060],{"type":23,"value":62582},{"type":23,"value":199062}," references to HR employees. These are used for:",{"type":17,"tag":80,"props":199064,"children":199065},{},[199066,199071,199076],{"type":17,"tag":84,"props":199067,"children":199068},{},[199069],{"type":23,"value":199070},"Recruiter or interviewer attribution",{"type":17,"tag":84,"props":199072,"children":199073},{},[199074],{"type":23,"value":199075},"Document ownership",{"type":17,"tag":84,"props":199077,"children":199078},{},[199079],{"type":23,"value":199080},"Activity filtering",{"type":17,"tag":29,"props":199082,"children":199083},{},[199084,199085,199089],{"type":23,"value":197772},{"type":17,"tag":48,"props":199086,"children":199087},{},[199088],{"type":23,"value":159475},{"type":23,"value":197778},{"type":17,"tag":80,"props":199091,"children":199092},{},[199093,199098,199103],{"type":17,"tag":84,"props":199094,"children":199095},{},[199096],{"type":23,"value":199097},"Automatically create employees when a candidate is hired",{"type":17,"tag":84,"props":199099,"children":199100},{},[199101],{"type":23,"value":199102},"Impose a candidate → employee conversion workflow",{"type":17,"tag":84,"props":199104,"children":199105},{},[199106],{"type":23,"value":199107},"Infer employment from ATS state alone",{"type":17,"tag":29,"props":199109,"children":199110},{},[199111],{"type":23,"value":199112},"The application decides when a hire becomes an employee and when to call the HR API. This explicit boundary is what allows Unified's ATS category to be powerful without polluting HR data.",{"type":17,"tag":68,"props":199114,"children":199115},{"id":188461},[199116],{"type":23,"value":188464},{"type":17,"tag":29,"props":199118,"children":199119},{},[199120],{"type":23,"value":199121},"Unified is explicit about limitations:",{"type":17,"tag":80,"props":199123,"children":199124},{},[199125,199130,199135,199140,199145],{"type":17,"tag":84,"props":199126,"children":199127},{},[199128],{"type":23,"value":199129},"Not all providers support every object",{"type":17,"tag":84,"props":199131,"children":199132},{},[199133],{"type":23,"value":199134},"Payroll artifacts are historical snapshots",{"type":17,"tag":84,"props":199136,"children":199137},{},[199138],{"type":23,"value":199139},"Compensation is current-state only",{"type":17,"tag":84,"props":199141,"children":199142},{},[199143],{"type":23,"value":199144},"Manager relationships and hierarchies may be incomplete",{"type":17,"tag":84,"props":199146,"children":199147},{},[199148],{"type":23,"value":199149},"No inference or prediction is performed",{"type":17,"tag":29,"props":199151,"children":199152},{},[199153],{"type":23,"value":199154},"These constraints are intentional. Unified provides primitives, not business logic.",{"type":17,"tag":68,"props":199156,"children":199158},{"id":199157},"build-vs-buy-hr-api-integrations",[199159],{"type":23,"value":199160},"Build vs Buy HR API Integrations",{"type":17,"tag":239,"props":199162,"children":199163},{"id":165021},[199164],{"type":23,"value":165024},{"type":17,"tag":80,"props":199166,"children":199167},{},[199168,199173,199178],{"type":17,"tag":84,"props":199169,"children":199170},{},[199171],{"type":23,"value":199172},"Multiple APIs to learn and maintain",{"type":17,"tag":84,"props":199174,"children":199175},{},[199176],{"type":23,"value":199177},"Cron jobs, polling, retries, and reconciliation",{"type":17,"tag":84,"props":199179,"children":199180},{},[199181],{"type":23,"value":91749},{"type":17,"tag":239,"props":199183,"children":199185},{"id":199184},"using-a-unified-api",[199186],{"type":23,"value":199187},"Using a Unified API",{"type":17,"tag":80,"props":199189,"children":199190},{},[199191,199196,199201,199206],{"type":17,"tag":84,"props":199192,"children":199193},{},[199194],{"type":23,"value":199195},"One integration unlocks hundreds of HRIS platforms",{"type":17,"tag":84,"props":199197,"children":199198},{},[199199],{"type":23,"value":199200},"Real-time data without replicas",{"type":17,"tag":84,"props":199202,"children":199203},{},[199204],{"type":23,"value":199205},"Centralized auth, webhooks, and maintenance",{"type":17,"tag":84,"props":199207,"children":199208},{},[199209],{"type":23,"value":160033},{"type":17,"tag":68,"props":199211,"children":199213},{"id":199212},"best-practices-for-implementing-hr-api-integrations",[199214],{"type":23,"value":199215},"Best Practices for Implementing HR API Integrations",{"type":17,"tag":80,"props":199217,"children":199218},{},[199219,199224,199241,199246,199250],{"type":17,"tag":84,"props":199220,"children":199221},{},[199222],{"type":23,"value":199223},"Request only the scopes you need",{"type":17,"tag":84,"props":199225,"children":199226},{},[199227,199228,199234,199236],{"type":23,"value":156457},{"type":17,"tag":6121,"props":199229,"children":199231},{"className":199230},[],[199232],{"type":23,"value":199233},"employee.id",{"type":23,"value":199235}," as canonical ",{"type":17,"tag":33,"props":199237,"children":199238},{},[199239],{"type":23,"value":199240},"within HR only",{"type":17,"tag":84,"props":199242,"children":199243},{},[199244],{"type":23,"value":199245},"Design for missing or partial data",{"type":17,"tag":84,"props":199247,"children":199248},{},[199249],{"type":23,"value":197952},{"type":17,"tag":84,"props":199251,"children":199252},{},[199253],{"type":23,"value":199254},"Keep business semantics in your application layer",{"type":17,"tag":68,"props":199256,"children":199258},{"id":199257},"build-hr-integrations-the-right-way",[199259],{"type":23,"value":199260},"Build HR integrations the right way",{"type":17,"tag":29,"props":199262,"children":199263},{},[199264],{"type":23,"value":199265},"If your product depends on accurate employee data—directories, onboarding, access provisioning, analytics, or AI features—batch syncs and one-off HRIS integrations won't hold up.",{"type":17,"tag":29,"props":199267,"children":199268},{},[199269,199270,199274],{"type":23,"value":25244},{"type":17,"tag":48,"props":199271,"children":199272},{},[199273],{"type":23,"value":197036},{"type":23,"value":199275}," gives you real-time, authorized access to employee data across hundreds of HRIS platforms, without storing customer data or forcing you to maintain provider-specific code paths.",{"type":17,"tag":29,"props":199277,"children":199278},{},[199279],{"type":23,"value":199280},"Build once. Ship faster. Keep control over your product logic.",{"type":17,"tag":29,"props":199282,"children":199283},{},[199284,199288,199289],{"type":17,"tag":48,"props":199285,"children":199286},{},[199287],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":199290,"children":199292},{"href":1612,"rel":199291},[214],[199293],{"type":17,"tag":48,"props":199294,"children":199295},{},[199296],{"type":23,"value":1616},{"type":17,"tag":29,"props":199298,"children":199299},{},[199300],{"type":23,"value":199301},"Test real HR integrations with live reads, writes, and webhooks—no setup fees, no limits during the trial.",{"type":17,"tag":29,"props":199303,"children":199304},{},[199305,199309,199310],{"type":17,"tag":48,"props":199306,"children":199307},{},[199308],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":199311,"children":199313},{"href":1623,"rel":199312},[214],[199314],{"type":17,"tag":48,"props":199315,"children":199316},{},[199317],{"type":23,"value":1627},{"type":17,"tag":29,"props":199319,"children":199320},{},[199321],{"type":23,"value":199322},"Talk through your HR, ATS, or identity use case with the team that built the platform.",{"type":17,"tag":68,"props":199324,"children":199325},{"id":95759},[199326],{"type":23,"value":95762},{"type":17,"tag":29,"props":199328,"children":199329},{},[199330],{"type":17,"tag":48,"props":199331,"children":199332},{},[199333],{"type":23,"value":199334},"What is HR API integration?",{"type":17,"tag":29,"props":199336,"children":199337},{},[199338],{"type":23,"value":199339},"Connecting software to HRIS platforms via APIs to access workforce data programmatically.",{"type":17,"tag":29,"props":199341,"children":199342},{},[199343],{"type":17,"tag":48,"props":199344,"children":199345},{},[199346],{"type":23,"value":199347},"How real-time is a real-time HR API?",{"type":17,"tag":29,"props":199349,"children":199350},{},[199351],{"type":23,"value":199352},"Every request hits the source HRIS live; updates are delivered via native or virtual webhooks.",{"type":17,"tag":29,"props":199354,"children":199355},{},[199356],{"type":17,"tag":48,"props":199357,"children":199358},{},[199359],{"type":23,"value":199360},"Does Unified store employee data?",{"type":17,"tag":29,"props":199362,"children":199363},{},[199364],{"type":23,"value":199365},"No. Unified uses a zero-storage, pass-through architecture.",{"type":17,"tag":29,"props":199367,"children":199368},{},[199369],{"type":17,"tag":48,"props":199370,"children":199371},{},[199372],{"type":23,"value":199373},"Can I use HR APIs for identity provisioning?",{"type":17,"tag":29,"props":199375,"children":199376},{},[199377],{"type":23,"value":199378},"Yes—HR APIs complement SCIM by providing employment context and real-time state.",{"type":17,"tag":29,"props":199380,"children":199381},{},[199382],{"type":17,"tag":48,"props":199383,"children":199384},{},[199385],{"type":23,"value":199386},"How long does HR API integration take?",{"type":17,"tag":29,"props":199388,"children":199389},{},[199390],{"type":23,"value":199391},"With a unified API, teams typically launch in days rather than months.",{"title":7,"searchDepth":1629,"depth":1629,"links":199393},[199394,199395,199398,199402,199403,199411,199418,199422,199423,199428,199429,199430,199434,199435,199436],{"id":198194,"depth":1629,"text":198197},{"id":198210,"depth":1629,"text":198213,"children":199396},[199397],{"id":198258,"depth":1635,"text":198261},{"id":198319,"depth":1629,"text":198322,"children":199399},[199400,199401],{"id":198330,"depth":1635,"text":198333},{"id":198370,"depth":1635,"text":198373},{"id":198409,"depth":1629,"text":198412},{"id":198506,"depth":1629,"text":198509,"children":199404},[199405,199406,199407,199408,199409,199410],{"id":198524,"depth":1635,"text":198527},{"id":198597,"depth":1635,"text":198600},{"id":198625,"depth":1635,"text":198628},{"id":198644,"depth":1635,"text":198647},{"id":198673,"depth":1635,"text":198676},{"id":198692,"depth":1635,"text":198695},{"id":198721,"depth":1629,"text":198724,"children":199412},[199413,199414,199415,199416,199417],{"id":198727,"depth":1635,"text":198730},{"id":198738,"depth":1635,"text":198741},{"id":198767,"depth":1635,"text":198770},{"id":198778,"depth":1635,"text":198781},{"id":198789,"depth":1635,"text":198792},{"id":198800,"depth":1629,"text":198803,"children":199419},[199420,199421],{"id":180381,"depth":1635,"text":180384},{"id":198843,"depth":1635,"text":198846},{"id":195285,"depth":1629,"text":195288},{"id":198951,"depth":1629,"text":198954,"children":199424},[199425,199426,199427],{"id":17064,"depth":1635,"text":53239},{"id":198982,"depth":1635,"text":198985},{"id":194156,"depth":1635,"text":194159},{"id":199036,"depth":1629,"text":199039},{"id":188461,"depth":1629,"text":188464},{"id":199157,"depth":1629,"text":199160,"children":199431},[199432,199433],{"id":165021,"depth":1635,"text":165024},{"id":199184,"depth":1635,"text":199187},{"id":199212,"depth":1629,"text":199215},{"id":199257,"depth":1629,"text":199260},{"id":95759,"depth":1629,"text":95762},"content:blog:hr_api_integration_real_time_employee_data_directories_and_workforce_automation.md","blog/hr_api_integration_real_time_employee_data_directories_and_workforce_automation.md","blog/hr_api_integration_real_time_employee_data_directories_and_workforce_automation",{"_path":199441,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":199442,"description":199443,"img":199444,"date":199445,"tag":12,"body":199446,"_type":1677,"_id":200778,"_source":1679,"_file":200779,"_stem":200780,"_extension":1682},"/blog/how_to_build_a_cross_platform_survey_analytics_dashboard_with_unified_forms_api","How to Build a Cross-Platform Survey Analytics Dashboard with Unified's Forms API","Survey analytics looks simple until you try to ship it as a product feature.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_cross_platform_survey_analytics_dashboard_with_unified_forms_api-icon.png","2026-02-02T22:33:00.000Z",{"type":14,"children":199447,"toc":200748},[199448,199453,199456,199464,199468,199473,199478,199496,199501,199506,199516,199527,199538,199544,199549,199572,199577,199614,199620,199630,199648,199660,199672,199676,199710,199715,199719,199728,199734,199739,199747,199760,199765,199783,199787,199796,199801,199887,199892,199898,199909,199914,199920,199956,199962,200009,200015,200070,200076,200131,200142,200148,200153,200161,200166,200215,200219,200228,200234,200243,200248,200254,200259,200268,200273,200304,200308,200317,200321,200361,200367,200372,200410,200421,200425,200434,200439,200448,200453,200459,200464,200470,200485,200491,200509,200515,200523,200529,200542,200547,200553,200558,200564,200586,200592,200617,200622,200627,200633,200638,200643,200656,200661,200665,200670,200725,200730,200739],{"type":17,"tag":18,"props":199449,"children":199451},{"id":199450},"how-to-build-a-cross-platform-survey-analytics-dashboard-with-unifieds-forms-api",[199452],{"type":23,"value":199442},{"type":17,"tag":25,"props":199454,"children":199455},{},[],{"type":17,"tag":29,"props":199457,"children":199458},{},[199459],{"type":17,"tag":33,"props":199460,"children":199461},{},[199462],{"type":23,"value":199463},"February 2, 2026",{"type":17,"tag":29,"props":199465,"children":199466},{},[199467],{"type":23,"value":199443},{"type":17,"tag":29,"props":199469,"children":199470},{},[199471],{"type":23,"value":199472},"On paper, surveys all do the same thing. Ask questions. Collect responses. Show charts.",{"type":17,"tag":29,"props":199474,"children":199475},{},[199476],{"type":23,"value":199477},"In practice, teams run surveys across multiple tools at once:",{"type":17,"tag":80,"props":199479,"children":199480},{},[199481,199486,199491],{"type":17,"tag":84,"props":199482,"children":199483},{},[199484],{"type":23,"value":199485},"Product feedback in Typeform",{"type":17,"tag":84,"props":199487,"children":199488},{},[199489],{"type":23,"value":199490},"Internal surveys in Google Forms",{"type":17,"tag":84,"props":199492,"children":199493},{},[199494],{"type":23,"value":199495},"Lightweight questionnaires in Tally",{"type":17,"tag":29,"props":199497,"children":199498},{},[199499],{"type":23,"value":199500},"Everyone wants a single dashboard. No one wants to standardize vendors first.",{"type":17,"tag":29,"props":199502,"children":199503},{},[199504],{"type":23,"value":199505},"This is where most analytics implementations break. Not because the charts are hard, but because form platforms are not designed to be analytics systems. Their APIs expose different field models, answer shapes, and event semantics. If you build against provider-specific payloads, your dashboard logic fractures immediately.",{"type":17,"tag":29,"props":199507,"children":199508},{},[199509,199510,199514],{"type":23,"value":25244},{"type":17,"tag":133,"props":199511,"children":199512},{"href":39304},[199513],{"type":23,"value":114951},{"type":23,"value":199515}," is designed to solve this exact problem.",{"type":17,"tag":29,"props":199517,"children":199518},{},[199519,199520,199525],{"type":23,"value":87287},{"type":17,"tag":48,"props":199521,"children":199522},{},[199523],{"type":23,"value":199524},"read-only, normalized ingestion layer",{"type":23,"value":199526}," for forms and submissions across multiple providers, so you can build the analytics model once and support whichever form platform your customers already use.",{"type":17,"tag":29,"props":199528,"children":199529},{},[199530,199531,199536],{"type":23,"value":160312},{"type":17,"tag":48,"props":199532,"children":199533},{},[199534],{"type":23,"value":199535},"cross-platform survey analytics pipeline",{"type":23,"value":199537}," using Unified's Forms API—accurately, defensibly, and without inventing bidirectional behavior that doesn't exist.",{"type":17,"tag":68,"props":199539,"children":199541},{"id":199540},"what-this-guide-covers",[199542],{"type":23,"value":199543},"What this guide covers",{"type":17,"tag":29,"props":199545,"children":199546},{},[199547],{"type":23,"value":199548},"We'll build the foundation for dashboards like:",{"type":17,"tag":80,"props":199550,"children":199551},{},[199552,199557,199562,199567],{"type":17,"tag":84,"props":199553,"children":199554},{},[199555],{"type":23,"value":199556},"CSAT trend over time",{"type":17,"tag":84,"props":199558,"children":199559},{},[199560],{"type":23,"value":199561},"NPS breakdown (promoters / passives / detractors)",{"type":17,"tag":84,"props":199563,"children":199564},{},[199565],{"type":23,"value":199566},"Employee engagement scores",{"type":17,"tag":84,"props":199568,"children":199569},{},[199570],{"type":23,"value":199571},"Product feedback aggregation",{"type":17,"tag":29,"props":199573,"children":199574},{},[199575],{"type":23,"value":199576},"Specifically, we'll cover:",{"type":17,"tag":6154,"props":199578,"children":199579},{},[199580,199585,199590,199595,199600,199605],{"type":17,"tag":84,"props":199581,"children":199582},{},[199583],{"type":23,"value":199584},"Discovering surveys and their fields",{"type":17,"tag":84,"props":199586,"children":199587},{},[199588],{"type":23,"value":199589},"Incrementally ingesting submissions",{"type":17,"tag":84,"props":199591,"children":199592},{},[199593],{"type":23,"value":199594},"Handling typed answers correctly",{"type":17,"tag":84,"props":199596,"children":199597},{},[199598],{"type":23,"value":199599},"Normalizing questions into canonical metrics",{"type":17,"tag":84,"props":199601,"children":199602},{},[199603],{"type":23,"value":199604},"Preparing data for analytics dashboards",{"type":17,"tag":84,"props":199606,"children":199607},{},[199608,199610],{"type":23,"value":199609},"Keeping data current with polling or ",{"type":17,"tag":133,"props":199611,"children":199612},{"href":4999},[199613],{"type":23,"value":5002},{"type":17,"tag":68,"props":199615,"children":199617},{"id":199616},"important-architectural-constraint-by-design",[199618],{"type":23,"value":199619},"Important architectural constraint (by design)",{"type":17,"tag":29,"props":199621,"children":199622},{},[199623,199625,199629],{"type":23,"value":199624},"The Forms API is ",{"type":17,"tag":48,"props":199626,"children":199627},{},[199628],{"type":23,"value":19834},{"type":23,"value":54},{"type":17,"tag":80,"props":199631,"children":199632},{},[199633,199638,199643],{"type":17,"tag":84,"props":199634,"children":199635},{},[199636],{"type":23,"value":199637},"No writable fields",{"type":17,"tag":84,"props":199639,"children":199640},{},[199641],{"type":23,"value":199642},"No form creation or mutation",{"type":17,"tag":84,"props":199644,"children":199645},{},[199646],{"type":23,"value":199647},"No submission writes",{"type":17,"tag":29,"props":199649,"children":199650},{},[199651,199653,199658],{"type":23,"value":199652},"Forms systems are ",{"type":17,"tag":48,"props":199654,"children":199655},{},[199656],{"type":23,"value":199657},"event sources",{"type":23,"value":199659},", not systems of record. Unified reflects this correctly.",{"type":17,"tag":29,"props":199661,"children":199662},{},[199663,199665,199670],{"type":23,"value":199664},"Your analytics pipeline should ingest data from Forms, store it in ",{"type":17,"tag":33,"props":199666,"children":199667},{},[199668],{"type":23,"value":199669},"your",{"type":23,"value":199671}," database or warehouse, and compute metrics there. That separation is intentional and necessary for correctness.",{"type":17,"tag":68,"props":199673,"children":199674},{"id":141798},[199675],{"type":23,"value":141801},{"type":17,"tag":80,"props":199677,"children":199678},{},[199679,199684,199689,199700],{"type":17,"tag":84,"props":199680,"children":199681},{},[199682],{"type":23,"value":199683},"Node.js v18+",{"type":17,"tag":84,"props":199685,"children":199686},{},[199687],{"type":23,"value":199688},"A Unified account",{"type":17,"tag":84,"props":199690,"children":199691},{},[199692,199694,199698],{"type":23,"value":199693},"Your ",{"type":17,"tag":133,"props":199695,"children":199696},{"href":7691},[199697],{"type":23,"value":7806},{"type":23,"value":199699}," key",{"type":17,"tag":84,"props":199701,"children":199702},{},[199703,199705],{"type":23,"value":199704},"A customer Forms ",{"type":17,"tag":6121,"props":199706,"children":199708},{"className":199707},[],[199709],{"type":23,"value":19766},{"type":17,"tag":29,"props":199711,"children":199712},{},[199713],{"type":23,"value":199714},"Supported Forms integrations include Google Forms, Tally, and Typeform.",{"type":17,"tag":68,"props":199716,"children":199717},{"id":19743},[199718],{"type":23,"value":19746},{"type":17,"tag":6893,"props":199720,"children":199723},{"className":199721,"code":199722,"language":18718,"meta":7},[18716],"import \"dotenv/config\";\nimport { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nconst CONNECTION_FORMS = process.env.CONNECTION_FORMS!;\n",[199724],{"type":17,"tag":6121,"props":199725,"children":199726},{"__ignoreMap":7},[199727],{"type":23,"value":199722},{"type":17,"tag":68,"props":199729,"children":199731},{"id":199730},"step-2-discover-surveys-forms",[199732],{"type":23,"value":199733},"Step 2: Discover surveys (forms)",{"type":17,"tag":29,"props":199735,"children":199736},{},[199737],{"type":23,"value":199738},"Unified exposes surveys via:",{"type":17,"tag":6893,"props":199740,"children":199742},{"className":199741,"code":114964,"language":20901,"meta":23},[20899],[199743],{"type":17,"tag":6121,"props":199744,"children":199745},{"__ignoreMap":7},[199746],{"type":23,"value":114964},{"type":17,"tag":29,"props":199748,"children":199749},{},[199750,199752,199758],{"type":23,"value":199751},"This endpoint returns ",{"type":17,"tag":6121,"props":199753,"children":199755},{"className":199754},[],[199756],{"type":23,"value":199757},"FormsForm",{"type":23,"value":199759}," objects with normalized metadata and field definitions.",{"type":17,"tag":29,"props":199761,"children":199762},{},[199763],{"type":23,"value":199764},"You'll use this to:",{"type":17,"tag":80,"props":199766,"children":199767},{},[199768,199773,199778],{"type":17,"tag":84,"props":199769,"children":199770},{},[199771],{"type":23,"value":199772},"list available surveys,",{"type":17,"tag":84,"props":199774,"children":199775},{},[199776],{"type":23,"value":199777},"inspect questions and field types,",{"type":17,"tag":84,"props":199779,"children":199780},{},[199781],{"type":23,"value":199782},"build a stable mapping layer for analytics.",{"type":17,"tag":29,"props":199784,"children":199785},{},[199786],{"type":23,"value":19878},{"type":17,"tag":6893,"props":199788,"children":199791},{"className":199789,"code":199790,"language":18718,"meta":7},[18716],"const forms = await sdk.forms.listFormsForms({\n  connectionId: CONNECTION_FORMS,\n  limit: 100,\n  offset: 0,\n  sort: \"updated_at\",\n  order: \"asc\",\n  fields: [\"id\", \"name\", \"updated_at\", \"fields\", \"is_active\", \"response_count\"],\n});\n",[199792],{"type":17,"tag":6121,"props":199793,"children":199794},{"__ignoreMap":7},[199795],{"type":23,"value":199790},{"type":17,"tag":29,"props":199797,"children":199798},{},[199799],{"type":23,"value":199800},"Each form includes:",{"type":17,"tag":80,"props":199802,"children":199803},{},[199804,199824,199833],{"type":17,"tag":84,"props":199805,"children":199806},{},[199807,199812,199813,199818,199819],{"type":17,"tag":6121,"props":199808,"children":199810},{"className":199809},[],[199811],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":199814,"children":199816},{"className":199815},[],[199817],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":199820,"children":199822},{"className":199821},[],[199823],{"type":23,"value":62868},{"type":17,"tag":84,"props":199825,"children":199826},{},[199827],{"type":17,"tag":6121,"props":199828,"children":199830},{"className":199829},[],[199831],{"type":23,"value":199832},"response_count",{"type":17,"tag":84,"props":199834,"children":199835},{},[199836,199842,199844],{"type":17,"tag":6121,"props":199837,"children":199839},{"className":199838},[],[199840],{"type":23,"value":199841},"fields[]",{"type":23,"value":199843}," with:\n",{"type":17,"tag":80,"props":199845,"children":199846},{},[199847,199861,199871,199882],{"type":17,"tag":84,"props":199848,"children":199849},{},[199850,199855,199856],{"type":17,"tag":6121,"props":199851,"children":199853},{"className":199852},[],[199854],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":199857,"children":199859},{"className":199858},[],[199860],{"type":23,"value":18781},{"type":17,"tag":84,"props":199862,"children":199863},{},[199864,199869],{"type":17,"tag":6121,"props":199865,"children":199867},{"className":199866},[],[199868],{"type":23,"value":27310},{"type":23,"value":199870}," (TEXT, NUMBER, RATING, SCALE, MATRIX, etc.)",{"type":17,"tag":84,"props":199872,"children":199873},{},[199874,199880],{"type":17,"tag":6121,"props":199875,"children":199877},{"className":199876},[],[199878],{"type":23,"value":199879},"choices",{"type":23,"value":199881}," (for select fields)",{"type":17,"tag":84,"props":199883,"children":199884},{},[199885],{"type":23,"value":199886},"validation metadata (min, max, required, etc.)",{"type":17,"tag":29,"props":199888,"children":199889},{},[199890],{"type":23,"value":199891},"This normalized field model is what makes cross-platform analytics possible.",{"type":17,"tag":68,"props":199893,"children":199895},{"id":199894},"step-3-define-your-internal-analytics-schema",[199896],{"type":23,"value":199897},"Step 3: Define your internal analytics schema",{"type":17,"tag":29,"props":199899,"children":199900},{},[199901,199903,199908],{"type":23,"value":199902},"Before ingesting submissions, define a schema that does ",{"type":17,"tag":48,"props":199904,"children":199905},{},[199906],{"type":23,"value":199907},"not depend on any single provider",{"type":23,"value":54},{"type":17,"tag":29,"props":199910,"children":199911},{},[199912],{"type":23,"value":199913},"A minimal, scalable structure:",{"type":17,"tag":239,"props":199915,"children":199917},{"id":199916},"forms-table",[199918],{"type":23,"value":199919},"Forms table",{"type":17,"tag":80,"props":199921,"children":199922},{},[199923,199931,199940,199948],{"type":17,"tag":84,"props":199924,"children":199925},{},[199926],{"type":17,"tag":6121,"props":199927,"children":199929},{"className":199928},[],[199930],{"type":23,"value":115069},{"type":17,"tag":84,"props":199932,"children":199933},{},[199934],{"type":17,"tag":6121,"props":199935,"children":199937},{"className":199936},[],[199938],{"type":23,"value":199939},"form_name",{"type":17,"tag":84,"props":199941,"children":199942},{},[199943],{"type":17,"tag":6121,"props":199944,"children":199946},{"className":199945},[],[199947],{"type":23,"value":25337},{"type":17,"tag":84,"props":199949,"children":199950},{},[199951],{"type":17,"tag":6121,"props":199952,"children":199954},{"className":199953},[],[199955],{"type":23,"value":62868},{"type":17,"tag":239,"props":199957,"children":199959},{"id":199958},"questions-table",[199960],{"type":23,"value":199961},"Questions table",{"type":17,"tag":80,"props":199963,"children":199964},{},[199965,199973,199981,199989,199998],{"type":17,"tag":84,"props":199966,"children":199967},{},[199968],{"type":17,"tag":6121,"props":199969,"children":199971},{"className":199970},[],[199972],{"type":23,"value":115069},{"type":17,"tag":84,"props":199974,"children":199975},{},[199976],{"type":17,"tag":6121,"props":199977,"children":199979},{"className":199978},[],[199980],{"type":23,"value":115109},{"type":17,"tag":84,"props":199982,"children":199983},{},[199984],{"type":17,"tag":6121,"props":199985,"children":199987},{"className":199986},[],[199988],{"type":23,"value":115118},{"type":17,"tag":84,"props":199990,"children":199991},{},[199992],{"type":17,"tag":6121,"props":199993,"children":199995},{"className":199994},[],[199996],{"type":23,"value":199997},"field_type",{"type":17,"tag":84,"props":199999,"children":200000},{},[200001,200007],{"type":17,"tag":6121,"props":200002,"children":200004},{"className":200003},[],[200005],{"type":23,"value":200006},"question_key",{"type":23,"value":200008}," (canonical metric identifier)",{"type":17,"tag":239,"props":200010,"children":200012},{"id":200011},"submissions-table",[200013],{"type":23,"value":200014},"Submissions table",{"type":17,"tag":80,"props":200016,"children":200017},{},[200018,200027,200035,200043,200051,200061],{"type":17,"tag":84,"props":200019,"children":200020},{},[200021],{"type":17,"tag":6121,"props":200022,"children":200024},{"className":200023},[],[200025],{"type":23,"value":200026},"submission_id",{"type":17,"tag":84,"props":200028,"children":200029},{},[200030],{"type":17,"tag":6121,"props":200031,"children":200033},{"className":200032},[],[200034],{"type":23,"value":115069},{"type":17,"tag":84,"props":200036,"children":200037},{},[200038],{"type":17,"tag":6121,"props":200039,"children":200041},{"className":200040},[],[200042],{"type":23,"value":33446},{"type":17,"tag":84,"props":200044,"children":200045},{},[200046],{"type":17,"tag":6121,"props":200047,"children":200049},{"className":200048},[],[200050],{"type":23,"value":25337},{"type":17,"tag":84,"props":200052,"children":200053},{},[200054,200059],{"type":17,"tag":6121,"props":200055,"children":200057},{"className":200056},[],[200058],{"type":23,"value":115039},{"type":23,"value":200060}," (optional)",{"type":17,"tag":84,"props":200062,"children":200063},{},[200064,200069],{"type":17,"tag":6121,"props":200065,"children":200067},{"className":200066},[],[200068],{"type":23,"value":115046},{"type":23,"value":200060},{"type":17,"tag":239,"props":200071,"children":200073},{"id":200072},"answers-table",[200074],{"type":23,"value":200075},"Answers table",{"type":17,"tag":80,"props":200077,"children":200078},{},[200079,200087,200095,200103,200112,200121],{"type":17,"tag":84,"props":200080,"children":200081},{},[200082],{"type":17,"tag":6121,"props":200083,"children":200085},{"className":200084},[],[200086],{"type":23,"value":200026},{"type":17,"tag":84,"props":200088,"children":200089},{},[200090],{"type":17,"tag":6121,"props":200091,"children":200093},{"className":200092},[],[200094],{"type":23,"value":115109},{"type":17,"tag":84,"props":200096,"children":200097},{},[200098],{"type":17,"tag":6121,"props":200099,"children":200101},{"className":200100},[],[200102],{"type":23,"value":115118},{"type":17,"tag":84,"props":200104,"children":200105},{},[200106],{"type":17,"tag":6121,"props":200107,"children":200109},{"className":200108},[],[200110],{"type":23,"value":200111},"value_json",{"type":17,"tag":84,"props":200113,"children":200114},{},[200115],{"type":17,"tag":6121,"props":200116,"children":200118},{"className":200117},[],[200119],{"type":23,"value":200120},"value_type",{"type":17,"tag":84,"props":200122,"children":200123},{},[200124,200130],{"type":17,"tag":6121,"props":200125,"children":200127},{"className":200126},[],[200128],{"type":23,"value":200129},"file_ids[]",{"type":23,"value":200060},{"type":17,"tag":29,"props":200132,"children":200133},{},[200134,200136,200140],{"type":23,"value":200135},"Do ",{"type":17,"tag":48,"props":200137,"children":200138},{},[200139],{"type":23,"value":159475},{"type":23,"value":200141}," coerce answers into strings. The API explicitly allows values to be numbers, booleans, arrays, or objects.",{"type":17,"tag":68,"props":200143,"children":200145},{"id":200144},"step-4-ingest-submissions-incrementally",[200146],{"type":23,"value":200147},"Step 4: Ingest submissions incrementally",{"type":17,"tag":29,"props":200149,"children":200150},{},[200151],{"type":23,"value":200152},"Unified exposes submissions via:",{"type":17,"tag":6893,"props":200154,"children":200156},{"className":200155,"code":114998,"language":20901,"meta":23},[20899],[200157],{"type":17,"tag":6121,"props":200158,"children":200159},{"__ignoreMap":7},[200160],{"type":23,"value":114998},{"type":17,"tag":29,"props":200162,"children":200163},{},[200164],{"type":23,"value":200165},"Key parameters for analytics ingestion:",{"type":17,"tag":80,"props":200167,"children":200168},{},[200169,200179,200189,200205],{"type":17,"tag":84,"props":200170,"children":200171},{},[200172,200177],{"type":17,"tag":6121,"props":200173,"children":200175},{"className":200174},[],[200176],{"type":23,"value":115069},{"type":23,"value":200178}," – scope to a survey",{"type":17,"tag":84,"props":200180,"children":200181},{},[200182,200187],{"type":17,"tag":6121,"props":200183,"children":200185},{"className":200184},[],[200186],{"type":23,"value":26291},{"type":23,"value":200188}," – incremental ingestion",{"type":17,"tag":84,"props":200190,"children":200191},{},[200192,200197,200198,200203],{"type":17,"tag":6121,"props":200193,"children":200195},{"className":200194},[],[200196],{"type":23,"value":48389},{"type":23,"value":26030},{"type":17,"tag":6121,"props":200199,"children":200201},{"className":200200},[],[200202],{"type":23,"value":48411},{"type":23,"value":200204}," – pagination",{"type":17,"tag":84,"props":200206,"children":200207},{},[200208,200213],{"type":17,"tag":6121,"props":200209,"children":200211},{"className":200210},[],[200212],{"type":23,"value":199841},{"type":23,"value":200214}," – payload control",{"type":17,"tag":29,"props":200216,"children":200217},{},[200218],{"type":23,"value":19878},{"type":17,"tag":6893,"props":200220,"children":200223},{"className":200221,"code":200222,"language":18718,"meta":7},[18716],"const submissions = await sdk.forms.listFormsSubmissions({\n  connectionId: CONNECTION_FORMS,\n  form_id: \"FORM_ID\",\n  updated_gte: \"2026-02-01T00:00:00.000Z\",\n  limit: 100,\n  offset: 0,\n  sort: \"updated_at\",\n  order: \"asc\",\n  fields: [\n    \"id\",\n    \"form_id\",\n    \"created_at\",\n    \"updated_at\",\n    \"respondent_email\",\n    \"respondent_name\",\n    \"answers\",\n  ],\n});\n",[200224],{"type":17,"tag":6121,"props":200225,"children":200226},{"__ignoreMap":7},[200227],{"type":23,"value":200222},{"type":17,"tag":239,"props":200229,"children":200231},{"id":200230},"pagination-loop",[200232],{"type":23,"value":200233},"Pagination loop",{"type":17,"tag":6893,"props":200235,"children":200238},{"className":200236,"code":200237,"language":18718,"meta":7},[18716],"async function ingestSubmissions(formId: string, since: string) {\n  const pageSize = 100;\n  let offset = 0;\n\n  while (true) {\n    const page = await sdk.forms.listFormsSubmissions({\n      connectionId: CONNECTION_FORMS,\n      form_id: formId,\n      updated_gte: since,\n      limit: pageSize,\n      offset,\n      sort: \"updated_at\",\n      order: \"asc\",\n    });\n\n    if (page.length === 0) break;\n\n    for (const submission of page) {\n      persistSubmission(submission);\n    }\n\n    if (page.length \u003C pageSize) break;\n    offset += pageSize;\n  }\n}\n",[200239],{"type":17,"tag":6121,"props":200240,"children":200241},{"__ignoreMap":7},[200242],{"type":23,"value":200237},{"type":17,"tag":29,"props":200244,"children":200245},{},[200246],{"type":23,"value":200247},"This pattern works across all supported providers and does not assume webhook availability.",{"type":17,"tag":68,"props":200249,"children":200251},{"id":200250},"step-5-handle-typed-answers-correctly",[200252],{"type":23,"value":200253},"Step 5: Handle typed answers correctly",{"type":17,"tag":29,"props":200255,"children":200256},{},[200257],{"type":23,"value":200258},"Each submission includes:",{"type":17,"tag":6893,"props":200260,"children":200263},{"className":200261,"code":200262,"language":18718,"meta":7},[18716],"answers: {\n  field_id?: string;\n  field_name?: string;\n  value?: unknown; // string | number | boolean | array | object\n  file_ids?: string[];\n}[];\n",[200264],{"type":17,"tag":6121,"props":200265,"children":200266},{"__ignoreMap":7},[200267],{"type":23,"value":200262},{"type":17,"tag":29,"props":200269,"children":200270},{},[200271],{"type":23,"value":200272},"Correct handling strategy:",{"type":17,"tag":6154,"props":200274,"children":200275},{},[200276,200287,200299],{"type":17,"tag":84,"props":200277,"children":200278},{},[200279,200280,200285],{"type":23,"value":128847},{"type":17,"tag":6121,"props":200281,"children":200283},{"className":200282},[],[200284],{"type":23,"value":18792},{"type":23,"value":200286}," as JSON",{"type":17,"tag":84,"props":200288,"children":200289},{},[200290,200292,200297],{"type":23,"value":200291},"Derive ",{"type":17,"tag":6121,"props":200293,"children":200295},{"className":200294},[],[200296],{"type":23,"value":200120},{"type":23,"value":200298}," at ingestion time",{"type":17,"tag":84,"props":200300,"children":200301},{},[200302],{"type":23,"value":200303},"Never assume shape based on field type alone",{"type":17,"tag":29,"props":200305,"children":200306},{},[200307],{"type":23,"value":19878},{"type":17,"tag":6893,"props":200309,"children":200312},{"className":200310,"code":200311,"language":18718,"meta":7},[18716],"function deriveValueType(v: unknown) {\n  if (Array.isArray(v)) return \"array\";\n  if (v === null) return \"null\";\n  return typeof v;\n}\n",[200313],{"type":17,"tag":6121,"props":200314,"children":200315},{"__ignoreMap":7},[200316],{"type":23,"value":200311},{"type":17,"tag":29,"props":200318,"children":200319},{},[200320],{"type":23,"value":102303},{"type":17,"tag":80,"props":200322,"children":200323},{},[200324,200332,200341,200350],{"type":17,"tag":84,"props":200325,"children":200326},{},[200327],{"type":17,"tag":6121,"props":200328,"children":200330},{"className":200329},[],[200331],{"type":23,"value":134704},{"type":17,"tag":84,"props":200333,"children":200334},{},[200335],{"type":17,"tag":6121,"props":200336,"children":200338},{"className":200337},[],[200339],{"type":23,"value":200340},"MATRIX",{"type":17,"tag":84,"props":200342,"children":200343},{},[200344],{"type":17,"tag":6121,"props":200345,"children":200347},{"className":200346},[],[200348],{"type":23,"value":200349},"FILE_UPLOAD",{"type":17,"tag":84,"props":200351,"children":200352},{},[200353,200359],{"type":17,"tag":6121,"props":200354,"children":200356},{"className":200355},[],[200357],{"type":23,"value":200358},"SCALE",{"type":23,"value":200360}," fields",{"type":17,"tag":68,"props":200362,"children":200364},{"id":200363},"step-6-normalize-questions-into-canonical-metrics",[200365],{"type":23,"value":200366},"Step 6: Normalize questions into canonical metrics",{"type":17,"tag":29,"props":200368,"children":200369},{},[200370],{"type":23,"value":200371},"Dashboards don't chart 'Field 7.' They chart metrics like:",{"type":17,"tag":80,"props":200373,"children":200374},{},[200375,200384,200393,200401],{"type":17,"tag":84,"props":200376,"children":200377},{},[200378],{"type":17,"tag":6121,"props":200379,"children":200381},{"className":200380},[],[200382],{"type":23,"value":200383},"csat_score",{"type":17,"tag":84,"props":200385,"children":200386},{},[200387],{"type":17,"tag":6121,"props":200388,"children":200390},{"className":200389},[],[200391],{"type":23,"value":200392},"nps_score",{"type":17,"tag":84,"props":200394,"children":200395},{},[200396],{"type":17,"tag":6121,"props":200397,"children":200399},{"className":200398},[],[200400],{"type":23,"value":28510},{"type":17,"tag":84,"props":200402,"children":200403},{},[200404],{"type":17,"tag":6121,"props":200405,"children":200407},{"className":200406},[],[200408],{"type":23,"value":200409},"feedback_text",{"type":17,"tag":29,"props":200411,"children":200412},{},[200413,200415,200420],{"type":23,"value":200414},"Create a mapping layer that assigns each field to a ",{"type":17,"tag":48,"props":200416,"children":200417},{},[200418],{"type":23,"value":200419},"canonical question key",{"type":23,"value":54},{"type":17,"tag":29,"props":200422,"children":200423},{},[200424],{"type":23,"value":134583},{"type":17,"tag":6893,"props":200426,"children":200429},{"className":200427,"code":200428,"language":18718,"meta":7},[18716],"const questionMapping = {\n  nps_score: [\"id:fld_123\", \"name:how likely are you to recommend\"],\n  csat_score: [\"id:fld_456\", \"name:overall satisfaction\"],\n  feedback_text: [\"type:TEXTAREA\"],\n};\n",[200430],{"type":17,"tag":6121,"props":200431,"children":200432},{"__ignoreMap":7},[200433],{"type":23,"value":200428},{"type":17,"tag":29,"props":200435,"children":200436},{},[200437],{"type":23,"value":200438},"Resolution logic:",{"type":17,"tag":6893,"props":200440,"children":200443},{"className":200441,"code":200442,"language":18718,"meta":7},[18716],"function resolveQuestionKey(answer, mapping) {\n  const keys = [];\n\n  if (answer.field_id) keys.push(`id:${answer.field_id}`);\n  if (answer.field_name)\n    keys.push(`name:${answer.field_name.toLowerCase()}`);\n\n  for (const [metric, matchers] of Object.entries(mapping)) {\n    if (matchers.some(m => keys.includes(m))) return metric;\n  }\n}\n",[200444],{"type":17,"tag":6121,"props":200445,"children":200446},{"__ignoreMap":7},[200447],{"type":23,"value":200442},{"type":17,"tag":29,"props":200449,"children":200450},{},[200451],{"type":23,"value":200452},"This is what allows you to aggregate across different forms and providers without rewriting analytics logic.",{"type":17,"tag":68,"props":200454,"children":200456},{"id":200455},"step-7-compute-dashboard-rollups",[200457],{"type":23,"value":200458},"Step 7: Compute dashboard rollups",{"type":17,"tag":29,"props":200460,"children":200461},{},[200462],{"type":23,"value":200463},"Once ingested and normalized, analytics becomes straightforward:",{"type":17,"tag":239,"props":200465,"children":200467},{"id":200466},"csat",[200468],{"type":23,"value":200469},"CSAT",{"type":17,"tag":80,"props":200471,"children":200472},{},[200473],{"type":17,"tag":84,"props":200474,"children":200475},{},[200476,200478,200483],{"type":23,"value":200477},"Average ",{"type":17,"tag":6121,"props":200479,"children":200481},{"className":200480},[],[200482],{"type":23,"value":200383},{"type":23,"value":200484}," by week/month",{"type":17,"tag":239,"props":200486,"children":200488},{"id":200487},"nps",[200489],{"type":23,"value":200490},"NPS",{"type":17,"tag":80,"props":200492,"children":200493},{},[200494,200499,200504],{"type":17,"tag":84,"props":200495,"children":200496},{},[200497],{"type":23,"value":200498},"Promoters: 9–10",{"type":17,"tag":84,"props":200500,"children":200501},{},[200502],{"type":23,"value":200503},"Passives: 7–8",{"type":17,"tag":84,"props":200505,"children":200506},{},[200507],{"type":23,"value":200508},"Detractors: 0–6",{"type":17,"tag":239,"props":200510,"children":200512},{"id":200511},"engagement",[200513],{"type":23,"value":200514},"Engagement",{"type":17,"tag":80,"props":200516,"children":200517},{},[200518],{"type":17,"tag":84,"props":200519,"children":200520},{},[200521],{"type":23,"value":200522},"Average score by team or period",{"type":17,"tag":239,"props":200524,"children":200526},{"id":200525},"feedback",[200527],{"type":23,"value":200528},"Feedback",{"type":17,"tag":80,"props":200530,"children":200531},{},[200532,200537],{"type":17,"tag":84,"props":200533,"children":200534},{},[200535],{"type":23,"value":200536},"Volume over time",{"type":17,"tag":84,"props":200538,"children":200539},{},[200540],{"type":23,"value":200541},"Optional text clustering downstream",{"type":17,"tag":29,"props":200543,"children":200544},{},[200545],{"type":23,"value":200546},"None of this logic belongs in the integration layer. It belongs in your analytics system, operating on clean, normalized data.",{"type":17,"tag":68,"props":200548,"children":200550},{"id":200549},"step-8-keeping-data-current-polling-vs-webhooks",[200551],{"type":23,"value":200552},"Step 8: Keeping data current (polling vs webhooks)",{"type":17,"tag":29,"props":200554,"children":200555},{},[200556],{"type":23,"value":200557},"There are two correct ingestion strategies:",{"type":17,"tag":239,"props":200559,"children":200561},{"id":200560},"option-1-incremental-polling-always-supported",[200562],{"type":23,"value":200563},"Option 1: Incremental polling (always supported)",{"type":17,"tag":80,"props":200565,"children":200566},{},[200567,200576,200581],{"type":17,"tag":84,"props":200568,"children":200569},{},[200570,200571],{"type":23,"value":33722},{"type":17,"tag":6121,"props":200572,"children":200574},{"className":200573},[],[200575],{"type":23,"value":26291},{"type":17,"tag":84,"props":200577,"children":200578},{},[200579],{"type":23,"value":200580},"Run ingestion on a schedule",{"type":17,"tag":84,"props":200582,"children":200583},{},[200584],{"type":23,"value":200585},"Works across all providers",{"type":17,"tag":239,"props":200587,"children":200589},{"id":200588},"option-2-webhooks-submission-only",[200590],{"type":23,"value":200591},"Option 2: Webhooks (submission-only)",{"type":17,"tag":80,"props":200593,"children":200594},{},[200595,200607,200612],{"type":17,"tag":84,"props":200596,"children":200597},{},[200598,200600,200605],{"type":23,"value":200599},"Configure Unified webhooks for ",{"type":17,"tag":48,"props":200601,"children":200602},{},[200603],{"type":23,"value":200604},"submission",{"type":23,"value":200606}," objects",{"type":17,"tag":84,"props":200608,"children":200609},{},[200610],{"type":23,"value":200611},"Use native webhooks where supported",{"type":17,"tag":84,"props":200613,"children":200614},{},[200615],{"type":23,"value":200616},"Use virtual webhooks otherwise",{"type":17,"tag":29,"props":200618,"children":200619},{},[200620],{"type":23,"value":200621},"Webhook availability and behavior varies by provider. Always check Supported Integrations before relying on them.",{"type":17,"tag":29,"props":200623,"children":200624},{},[200625],{"type":23,"value":200626},"Webhooks accelerate ingestion. They are not required for correctness.",{"type":17,"tag":68,"props":200628,"children":200630},{"id":200629},"step-9-security-and-data-handling",[200631],{"type":23,"value":200632},"Step 9: Security and data handling",{"type":17,"tag":29,"props":200634,"children":200635},{},[200636],{"type":23,"value":200637},"Survey data often includes sensitive information.",{"type":17,"tag":29,"props":200639,"children":200640},{},[200641],{"type":23,"value":200642},"Unified uses a passthrough, no-storage architecture:",{"type":17,"tag":80,"props":200644,"children":200645},{},[200646,200651],{"type":17,"tag":84,"props":200647,"children":200648},{},[200649],{"type":23,"value":200650},"Data is fetched live from source APIs",{"type":17,"tag":84,"props":200652,"children":200653},{},[200654],{"type":23,"value":200655},"No customer form data is stored at rest in Unified",{"type":17,"tag":29,"props":200657,"children":200658},{},[200659],{"type":23,"value":200660},"You store analytics data in your own environment, under your own security and retention policies. This keeps your integration layer lean and your compliance scope clear.",{"type":17,"tag":68,"props":200662,"children":200663},{"id":44585},[200664],{"type":23,"value":44588},{"type":17,"tag":29,"props":200666,"children":200667},{},[200668],{"type":23,"value":200669},"To build a cross-platform survey analytics dashboard with Unified's Forms API:",{"type":17,"tag":80,"props":200671,"children":200672},{},[200673,200683,200694,200705,200710,200715,200720],{"type":17,"tag":84,"props":200674,"children":200675},{},[200676,200678],{"type":23,"value":200677},"Treat Forms as a ",{"type":17,"tag":48,"props":200679,"children":200680},{},[200681],{"type":23,"value":200682},"read-only ingestion layer",{"type":17,"tag":84,"props":200684,"children":200685},{},[200686,200688],{"type":23,"value":200687},"Discover surveys and fields via ",{"type":17,"tag":6121,"props":200689,"children":200691},{"className":200690},[],[200692],{"type":23,"value":200693},"GET /forms/{connection_id}/form",{"type":17,"tag":84,"props":200695,"children":200696},{},[200697,200699],{"type":23,"value":200698},"Ingest submissions incrementally via ",{"type":17,"tag":6121,"props":200700,"children":200702},{"className":200701},[],[200703],{"type":23,"value":200704},"GET /forms/{connection_id}/submission",{"type":17,"tag":84,"props":200706,"children":200707},{},[200708],{"type":23,"value":200709},"Store answers as typed JSON",{"type":17,"tag":84,"props":200711,"children":200712},{},[200713],{"type":23,"value":200714},"Normalize questions into canonical metrics",{"type":17,"tag":84,"props":200716,"children":200717},{},[200718],{"type":23,"value":200719},"Compute analytics in your own system",{"type":17,"tag":84,"props":200721,"children":200722},{},[200723],{"type":23,"value":200724},"Use webhooks optionally, for submission events only",{"type":17,"tag":29,"props":200726,"children":200727},{},[200728],{"type":23,"value":200729},"The result is a dashboard that works across providers without forcing vendor standardization—and without embedding fragile, provider-specific assumptions into your product.",{"type":17,"tag":29,"props":200731,"children":200732},{},[200733,200734],{"type":23,"value":1609},{"type":17,"tag":133,"props":200735,"children":200737},{"href":1612,"rel":200736},[214],[200738],{"type":23,"value":1616},{"type":17,"tag":29,"props":200740,"children":200741},{},[200742,200743],{"type":23,"value":1609},{"type":17,"tag":133,"props":200744,"children":200746},{"href":1623,"rel":200745},[214],[200747],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":200749},[200750,200751,200752,200753,200754,200755,200761,200764,200765,200766,200772,200776,200777],{"id":199540,"depth":1629,"text":199543},{"id":199616,"depth":1629,"text":199619},{"id":141798,"depth":1629,"text":141801},{"id":19743,"depth":1629,"text":19746},{"id":199730,"depth":1629,"text":199733},{"id":199894,"depth":1629,"text":199897,"children":200756},[200757,200758,200759,200760],{"id":199916,"depth":1635,"text":199919},{"id":199958,"depth":1635,"text":199961},{"id":200011,"depth":1635,"text":200014},{"id":200072,"depth":1635,"text":200075},{"id":200144,"depth":1629,"text":200147,"children":200762},[200763],{"id":200230,"depth":1635,"text":200233},{"id":200250,"depth":1629,"text":200253},{"id":200363,"depth":1629,"text":200366},{"id":200455,"depth":1629,"text":200458,"children":200767},[200768,200769,200770,200771],{"id":200466,"depth":1635,"text":200469},{"id":200487,"depth":1635,"text":200490},{"id":200511,"depth":1635,"text":200514},{"id":200525,"depth":1635,"text":200528},{"id":200549,"depth":1629,"text":200552,"children":200773},[200774,200775],{"id":200560,"depth":1635,"text":200563},{"id":200588,"depth":1635,"text":200591},{"id":200629,"depth":1629,"text":200632},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_build_a_cross_platform_survey_analytics_dashboard_with_unified_forms_api.md","blog/how_to_build_a_cross_platform_survey_analytics_dashboard_with_unified_forms_api.md","blog/how_to_build_a_cross_platform_survey_analytics_dashboard_with_unified_forms_api",{"_path":200782,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":200783,"description":200784,"img":200785,"date":200786,"tag":12,"body":200787,"_type":1677,"_id":201929,"_source":1679,"_file":201930,"_stem":201931,"_extension":1682},"/blog/how_to_ingest_jobs_and_candidates_from_ats_systems_with_unified_ats_api","How to Ingest Jobs and Candidates from ATS Systems with Unified's ATS API","Ingesting ATS data sounds simple, pull candidates, pull jobs, store them, and move on.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_ingest_jobs_and_candidates_from_ats_systems_with_unified_ats_api-icon.png","2026-02-02T17:20:00.000Z",{"type":14,"children":200788,"toc":201915},[200789,200794,200797,200804,200808,200813,200818,200823,200828,200851,200862,200868,200873,200933,200938,200943,200949,200954,200972,200977,200985,200990,200999,201010,201079,201096,201101,201107,201112,201117,201125,201129,201138,201150,201225,201230,201236,201241,201246,201254,201258,201267,201278,201355,201360,201383,201388,201394,201399,201407,201412,201430,201435,201446,201451,201456,201464,201469,201494,201498,201507,201512,201523,201528,201534,201545,201625,201630,201657,201666,201691,201703,201709,201714,201719,201757,201762,201767,201785,201791,201796,201808,201820,201826,201830,201853,201858,201862,201867,201882,201887,201892,201897,201906],{"type":17,"tag":18,"props":200790,"children":200792},{"id":200791},"how-to-ingest-jobs-and-candidates-from-ats-systems-with-unifieds-ats-api",[200793],{"type":23,"value":200783},{"type":17,"tag":25,"props":200795,"children":200796},{},[],{"type":17,"tag":29,"props":200798,"children":200799},{},[200800],{"type":17,"tag":33,"props":200801,"children":200802},{},[200803],{"type":23,"value":199463},{"type":17,"tag":11616,"props":200805,"children":200807},{"width":11618,"height":11619,"src":200806,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/JUYir5xRiHc",[],{"type":17,"tag":29,"props":200809,"children":200810},{},[200811],{"type":23,"value":200812},"Ingesting ATS data sounds simple: pull candidates, pull jobs, store them, and move on.",{"type":17,"tag":29,"props":200814,"children":200815},{},[200816],{"type":23,"value":200817},"In practice, it's rarely that clean.",{"type":17,"tag":29,"props":200819,"children":200820},{},[200821],{"type":23,"value":200822},"Every ATS models candidates, applications, and jobs differently. Some systems treat prospects and applicants the same. Others separate them. Some expose structured offer and interview data. Others bury critical information in activity logs. Even basic fields like status, source, or ownership vary across providers.",{"type":17,"tag":29,"props":200824,"children":200825},{},[200826],{"type":23,"value":200827},"If your product depends on accurate talent pool visibility, ingestion has to be:",{"type":17,"tag":80,"props":200829,"children":200830},{},[200831,200836,200841,200846],{"type":17,"tag":84,"props":200832,"children":200833},{},[200834],{"type":23,"value":200835},"Consistent across ATS systems",{"type":17,"tag":84,"props":200837,"children":200838},{},[200839],{"type":23,"value":200840},"Incremental and efficient",{"type":17,"tag":84,"props":200842,"children":200843},{},[200844],{"type":23,"value":200845},"Explicit about identity and relationships",{"type":17,"tag":84,"props":200847,"children":200848},{},[200849],{"type":23,"value":200850},"Grounded in what the ATS actually records",{"type":17,"tag":29,"props":200852,"children":200853},{},[200854,200856,200860],{"type":23,"value":200855},"This guide shows how to ingest jobs and candidates using Unified's ",{"type":17,"tag":133,"props":200857,"children":200858},{"href":55696},[200859],{"type":23,"value":55699},{"type":23,"value":200861}," in a way that is technically sound and portable across providers.",{"type":17,"tag":68,"props":200863,"children":200865},{"id":200864},"the-ingestion-mental-model",[200866],{"type":23,"value":200867},"The ingestion mental model",{"type":17,"tag":29,"props":200869,"children":200870},{},[200871],{"type":23,"value":200872},"There are three primary entities you need to ingest:",{"type":17,"tag":6154,"props":200874,"children":200875},{},[200876,200895,200914],{"type":17,"tag":84,"props":200877,"children":200878},{},[200879],{"type":17,"tag":48,"props":200880,"children":200881},{},[200882,200883,200894],{"type":23,"value":156041},{"type":17,"tag":48,"props":200884,"children":200885},{},[200886],{"type":17,"tag":48,"props":200887,"children":200888},{},[200889],{"type":17,"tag":6121,"props":200890,"children":200892},{"className":200891},[],[200893],{"type":23,"value":133291},{"type":23,"value":12034},{"type":17,"tag":84,"props":200896,"children":200897},{},[200898],{"type":17,"tag":48,"props":200899,"children":200900},{},[200901,200902,200913],{"type":23,"value":156019},{"type":17,"tag":48,"props":200903,"children":200904},{},[200905],{"type":17,"tag":48,"props":200906,"children":200907},{},[200908],{"type":17,"tag":6121,"props":200909,"children":200911},{"className":200910},[],[200912],{"type":23,"value":75743},{"type":23,"value":12034},{"type":17,"tag":84,"props":200915,"children":200916},{},[200917],{"type":17,"tag":48,"props":200918,"children":200919},{},[200920,200921,200932],{"type":23,"value":156063},{"type":17,"tag":48,"props":200922,"children":200923},{},[200924],{"type":17,"tag":48,"props":200925,"children":200926},{},[200927],{"type":17,"tag":6121,"props":200928,"children":200930},{"className":200929},[],[200931],{"type":23,"value":132178},{"type":23,"value":12034},{"type":17,"tag":29,"props":200934,"children":200935},{},[200936],{"type":23,"value":200937},"Applications connect candidates to jobs. They carry the state and lifecycle of a candidate within a specific hiring pipeline.",{"type":17,"tag":29,"props":200939,"children":200940},{},[200941],{"type":23,"value":200942},"A correct ingestion strategy pulls these objects independently and models their relationships explicitly.",{"type":17,"tag":68,"props":200944,"children":200946},{"id":200945},"step-1-ingest-candidates",[200947],{"type":23,"value":200948},"Step 1: Ingest Candidates",{"type":17,"tag":29,"props":200950,"children":200951},{},[200952],{"type":23,"value":200953},"Candidates represent people stored in the ATS. They may include:",{"type":17,"tag":80,"props":200955,"children":200956},{},[200957,200962,200967],{"type":17,"tag":84,"props":200958,"children":200959},{},[200960],{"type":23,"value":200961},"Active applicants",{"type":17,"tag":84,"props":200963,"children":200964},{},[200965],{"type":23,"value":200966},"Past applicants",{"type":17,"tag":84,"props":200968,"children":200969},{},[200970],{"type":23,"value":200971},"General prospects not tied to a job",{"type":17,"tag":29,"props":200973,"children":200974},{},[200975],{"type":23,"value":200976},"To ingest candidates:",{"type":17,"tag":6893,"props":200978,"children":200980},{"className":200979,"code":133260,"language":20901,"meta":23},[20899],[200981],{"type":17,"tag":6121,"props":200982,"children":200983},{"__ignoreMap":7},[200984],{"type":23,"value":133260},{"type":17,"tag":29,"props":200986,"children":200987},{},[200988],{"type":23,"value":200989},"Node SDK example:",{"type":17,"tag":6893,"props":200991,"children":200994},{"className":200992,"code":200993,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function ingestCandidates(connectionId: string) {\n  const results = await sdk.ats.listAtsCandidates({\n    connectionId,\n    limit: 100,\n    offset: 0,\n    sort: 'updated_at',\n    order: 'asc',\n    fields: '',\n    raw: '',\n  });\n\n  return results;\n}\n",[200995],{"type":17,"tag":6121,"props":200996,"children":200997},{"__ignoreMap":7},[200998],{"type":23,"value":200993},{"type":17,"tag":29,"props":201000,"children":201001},{},[201002,201004,201009],{"type":23,"value":201003},"Key fields in ",{"type":17,"tag":6121,"props":201005,"children":201007},{"className":201006},[],[201008],{"type":23,"value":133291},{"type":23,"value":20456},{"type":17,"tag":80,"props":201011,"children":201012},{},[201013,201021,201035,201043,201052,201061,201069],{"type":17,"tag":84,"props":201014,"children":201015},{},[201016],{"type":17,"tag":6121,"props":201017,"children":201019},{"className":201018},[],[201020],{"type":23,"value":18766},{"type":17,"tag":84,"props":201022,"children":201023},{},[201024,201029,201030],{"type":17,"tag":6121,"props":201025,"children":201027},{"className":201026},[],[201028],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":201031,"children":201033},{"className":201032},[],[201034],{"type":23,"value":62341},{"type":17,"tag":84,"props":201036,"children":201037},{},[201038],{"type":17,"tag":6121,"props":201039,"children":201041},{"className":201040},[],[201042],{"type":23,"value":133312},{"type":17,"tag":84,"props":201044,"children":201045},{},[201046],{"type":17,"tag":6121,"props":201047,"children":201049},{"className":201048},[],[201050],{"type":23,"value":201051},"origin",{"type":17,"tag":84,"props":201053,"children":201054},{},[201055],{"type":17,"tag":6121,"props":201056,"children":201058},{"className":201057},[],[201059],{"type":23,"value":201060},"external_identifier",{"type":17,"tag":84,"props":201062,"children":201063},{},[201064],{"type":17,"tag":6121,"props":201065,"children":201067},{"className":201066},[],[201068],{"type":23,"value":27299},{"type":17,"tag":84,"props":201070,"children":201071},{},[201072,201077],{"type":17,"tag":6121,"props":201073,"children":201075},{"className":201074},[],[201076],{"type":23,"value":133378},{"type":23,"value":201078}," (custom fields)",{"type":17,"tag":29,"props":201080,"children":201081},{},[201082,201083,201088,201090,201095],{"type":23,"value":156457},{"type":17,"tag":6121,"props":201084,"children":201086},{"className":201085},[],[201087],{"type":23,"value":117296},{"type":23,"value":201089}," as the stable primary key ",{"type":17,"tag":48,"props":201091,"children":201092},{},[201093],{"type":23,"value":201094},"within a connection",{"type":23,"value":54},{"type":17,"tag":29,"props":201097,"children":201098},{},[201099],{"type":23,"value":201100},"Do not assume cross-connection identity consistency.",{"type":17,"tag":68,"props":201102,"children":201104},{"id":201103},"step-2-ingest-jobs",[201105],{"type":23,"value":201106},"Step 2: Ingest Jobs",{"type":17,"tag":29,"props":201108,"children":201109},{},[201110],{"type":23,"value":201111},"Jobs provide the context for applications and pipeline reporting.",{"type":17,"tag":29,"props":201113,"children":201114},{},[201115],{"type":23,"value":201116},"To ingest jobs:",{"type":17,"tag":6893,"props":201118,"children":201120},{"className":201119,"code":75728,"language":20901,"meta":23},[20899],[201121],{"type":17,"tag":6121,"props":201122,"children":201123},{"__ignoreMap":7},[201124],{"type":23,"value":75728},{"type":17,"tag":29,"props":201126,"children":201127},{},[201128],{"type":23,"value":156133},{"type":17,"tag":6893,"props":201130,"children":201133},{"className":201131,"code":201132,"language":18718,"meta":7},[18716],"async function ingestJobs(connectionId: string) {\n  const results = await sdk.ats.listAtsJobs({\n    connectionId,\n    limit: 100,\n    offset: 0,\n    sort: 'updated_at',\n    order: 'asc',\n    fields: '',\n    raw: '',\n  });\n\n  return results;\n}\n",[201134],{"type":17,"tag":6121,"props":201135,"children":201136},{"__ignoreMap":7},[201137],{"type":23,"value":201132},{"type":17,"tag":29,"props":201139,"children":201140},{},[201141,201143,201148],{"type":23,"value":201142},"Key ",{"type":17,"tag":6121,"props":201144,"children":201146},{"className":201145},[],[201147],{"type":23,"value":75743},{"type":23,"value":201149}," fields:",{"type":17,"tag":80,"props":201151,"children":201152},{},[201153,201161,201169,201190,201199,201208,201217],{"type":17,"tag":84,"props":201154,"children":201155},{},[201156],{"type":17,"tag":6121,"props":201157,"children":201159},{"className":201158},[],[201160],{"type":23,"value":18766},{"type":17,"tag":84,"props":201162,"children":201163},{},[201164],{"type":17,"tag":6121,"props":201165,"children":201167},{"className":201166},[],[201168],{"type":23,"value":18781},{"type":17,"tag":84,"props":201170,"children":201171},{},[201172,201177,201178,201183,201184,201189],{"type":17,"tag":6121,"props":201173,"children":201175},{"className":201174},[],[201176],{"type":23,"value":19949},{"type":23,"value":44573},{"type":17,"tag":6121,"props":201179,"children":201181},{"className":201180},[],[201182],{"type":23,"value":150031},{"type":23,"value":11826},{"type":17,"tag":6121,"props":201185,"children":201187},{"className":201186},[],[201188],{"type":23,"value":183711},{"type":23,"value":149980},{"type":17,"tag":84,"props":201191,"children":201192},{},[201193],{"type":17,"tag":6121,"props":201194,"children":201196},{"className":201195},[],[201197],{"type":23,"value":201198},"groups[]",{"type":17,"tag":84,"props":201200,"children":201201},{},[201202],{"type":17,"tag":6121,"props":201203,"children":201205},{"className":201204},[],[201206],{"type":23,"value":201207},"public_job_urls[]",{"type":17,"tag":84,"props":201209,"children":201210},{},[201211],{"type":17,"tag":6121,"props":201212,"children":201214},{"className":201213},[],[201215],{"type":23,"value":201216},"openings[]",{"type":17,"tag":84,"props":201218,"children":201219},{},[201220],{"type":17,"tag":6121,"props":201221,"children":201223},{"className":201222},[],[201224],{"type":23,"value":27299},{"type":17,"tag":29,"props":201226,"children":201227},{},[201228],{"type":23,"value":201229},"Jobs should be stored separately from candidates. Applications will connect them.",{"type":17,"tag":68,"props":201231,"children":201233},{"id":201232},"step-3-ingest-applications-the-join-layer",[201234],{"type":23,"value":201235},"Step 3: Ingest Applications (the join layer)",{"type":17,"tag":29,"props":201237,"children":201238},{},[201239],{"type":23,"value":201240},"Applications link candidates to jobs and define pipeline state.",{"type":17,"tag":29,"props":201242,"children":201243},{},[201244],{"type":23,"value":201245},"To ingest applications:",{"type":17,"tag":6893,"props":201247,"children":201249},{"className":201248,"code":132148,"language":20901,"meta":23},[20899],[201250],{"type":17,"tag":6121,"props":201251,"children":201252},{"__ignoreMap":7},[201253],{"type":23,"value":132148},{"type":17,"tag":29,"props":201255,"children":201256},{},[201257],{"type":23,"value":156133},{"type":17,"tag":6893,"props":201259,"children":201262},{"className":201260,"code":201261,"language":18718,"meta":7},[18716],"async function ingestApplications(connectionId: string) {\n  const results = await sdk.ats.listAtsApplications({\n    connectionId,\n    limit: 100,\n    offset: 0,\n    sort: 'updated_at',\n    order: 'asc',\n    fields: '',\n    raw: '',\n  });\n\n  return results;\n}\n",[201263],{"type":17,"tag":6121,"props":201264,"children":201265},{"__ignoreMap":7},[201266],{"type":23,"value":201261},{"type":17,"tag":29,"props":201268,"children":201269},{},[201270,201272,201277],{"type":23,"value":201271},"Important ",{"type":17,"tag":6121,"props":201273,"children":201275},{"className":201274},[],[201276],{"type":23,"value":132178},{"type":23,"value":201149},{"type":17,"tag":80,"props":201279,"children":201280},{},[201281,201289,201297,201305,201315,201323,201331,201339,201347],{"type":17,"tag":84,"props":201282,"children":201283},{},[201284],{"type":17,"tag":6121,"props":201285,"children":201287},{"className":201286},[],[201288],{"type":23,"value":18766},{"type":17,"tag":84,"props":201290,"children":201291},{},[201292],{"type":17,"tag":6121,"props":201293,"children":201295},{"className":201294},[],[201296],{"type":23,"value":117296},{"type":17,"tag":84,"props":201298,"children":201299},{},[201300],{"type":17,"tag":6121,"props":201301,"children":201303},{"className":201302},[],[201304],{"type":23,"value":117309},{"type":17,"tag":84,"props":201306,"children":201307},{},[201308,201313],{"type":17,"tag":6121,"props":201309,"children":201311},{"className":201310},[],[201312],{"type":23,"value":19949},{"type":23,"value":201314}," (normalized enum)",{"type":17,"tag":84,"props":201316,"children":201317},{},[201318],{"type":17,"tag":6121,"props":201319,"children":201321},{"className":201320},[],[201322],{"type":23,"value":117334},{"type":17,"tag":84,"props":201324,"children":201325},{},[201326],{"type":17,"tag":6121,"props":201327,"children":201329},{"className":201328},[],[201330],{"type":23,"value":117347},{"type":17,"tag":84,"props":201332,"children":201333},{},[201334],{"type":17,"tag":6121,"props":201335,"children":201337},{"className":201336},[],[201338],{"type":23,"value":132224},{"type":17,"tag":84,"props":201340,"children":201341},{},[201342],{"type":17,"tag":6121,"props":201343,"children":201345},{"className":201344},[],[201346],{"type":23,"value":132233},{"type":17,"tag":84,"props":201348,"children":201349},{},[201350],{"type":17,"tag":6121,"props":201351,"children":201353},{"className":201352},[],[201354],{"type":23,"value":135872},{"type":17,"tag":29,"props":201356,"children":201357},{},[201358],{"type":23,"value":201359},"This object tells you:",{"type":17,"tag":80,"props":201361,"children":201362},{},[201363,201368,201373,201378],{"type":17,"tag":84,"props":201364,"children":201365},{},[201366],{"type":23,"value":201367},"Who applied to which job",{"type":17,"tag":84,"props":201369,"children":201370},{},[201371],{"type":23,"value":201372},"What stage they're currently in",{"type":17,"tag":84,"props":201374,"children":201375},{},[201376],{"type":23,"value":201377},"When key transitions occurred",{"type":17,"tag":84,"props":201379,"children":201380},{},[201381],{"type":23,"value":201382},"Whether offers were sent or accepted",{"type":17,"tag":29,"props":201384,"children":201385},{},[201386],{"type":23,"value":201387},"Do not flatten applications into candidate records. Applications are separate lifecycle instances.",{"type":17,"tag":68,"props":201389,"children":201391},{"id":201390},"step-4-model-relationships-explicitly",[201392],{"type":23,"value":201393},"Step 4: Model Relationships Explicitly",{"type":17,"tag":29,"props":201395,"children":201396},{},[201397],{"type":23,"value":201398},"After ingestion, your internal model should reflect:",{"type":17,"tag":6893,"props":201400,"children":201402},{"className":201401,"code":156675,"language":20901,"meta":23},[20899],[201403],{"type":17,"tag":6121,"props":201404,"children":201405},{"__ignoreMap":7},[201406],{"type":23,"value":156675},{"type":17,"tag":29,"props":201408,"children":201409},{},[201410],{"type":23,"value":201411},"Important implications:",{"type":17,"tag":80,"props":201413,"children":201414},{},[201415,201420,201425],{"type":17,"tag":84,"props":201416,"children":201417},{},[201418],{"type":23,"value":201419},"A candidate can have multiple applications.",{"type":17,"tag":84,"props":201421,"children":201422},{},[201423],{"type":23,"value":201424},"A job can have many candidates.",{"type":17,"tag":84,"props":201426,"children":201427},{},[201428],{"type":23,"value":201429},"Applications carry stage and lifecycle timestamps.",{"type":17,"tag":29,"props":201431,"children":201432},{},[201433],{"type":23,"value":201434},"Keep these entities distinct to avoid corrupting reporting logic.",{"type":17,"tag":68,"props":201436,"children":201438},{"id":201437},"step-5-use-incremental-sync-with-updated_gte",[201439,201441],{"type":23,"value":201440},"Step 5: Use Incremental Sync with ",{"type":17,"tag":6121,"props":201442,"children":201444},{"className":201443},[],[201445],{"type":23,"value":26291},{"type":17,"tag":29,"props":201447,"children":201448},{},[201449],{"type":23,"value":201450},"Full resyncs do not scale.",{"type":17,"tag":29,"props":201452,"children":201453},{},[201454],{"type":23,"value":201455},"All ATS list endpoints support:",{"type":17,"tag":6893,"props":201457,"children":201459},{"className":201458,"code":157030,"language":20901,"meta":23},[20899],[201460],{"type":17,"tag":6121,"props":201461,"children":201462},{"__ignoreMap":7},[201463],{"type":23,"value":157030},{"type":17,"tag":29,"props":201465,"children":201466},{},[201467],{"type":23,"value":201468},"A safe ingestion pattern:",{"type":17,"tag":6154,"props":201470,"children":201471},{},[201472,201477,201489],{"type":17,"tag":84,"props":201473,"children":201474},{},[201475],{"type":23,"value":201476},"Perform initial full load.",{"type":17,"tag":84,"props":201478,"children":201479},{},[201480,201482,201487],{"type":23,"value":201481},"Store the latest ",{"type":17,"tag":6121,"props":201483,"children":201485},{"className":201484},[],[201486],{"type":23,"value":25337},{"type":23,"value":201488}," processed.",{"type":17,"tag":84,"props":201490,"children":201491},{},[201492],{"type":23,"value":201493},"On subsequent runs, fetch only records updated since that timestamp.",{"type":17,"tag":29,"props":201495,"children":201496},{},[201497],{"type":23,"value":19878},{"type":17,"tag":6893,"props":201499,"children":201502},{"className":201500,"code":201501,"language":18718,"meta":7},[18716],"async function ingestUpdatedCandidates(\n  connectionId: string,\n  updatedSince: string\n) {\n  return await sdk.ats.listAtsCandidates({\n    connectionId,\n    updated_gte: updatedSince,\n    sort: 'updated_at',\n    order: 'asc',\n    limit: 100,\n    offset: 0,\n    fields: '',\n    raw: '',\n  });\n}\n",[201503],{"type":17,"tag":6121,"props":201504,"children":201505},{"__ignoreMap":7},[201506],{"type":23,"value":201501},{"type":17,"tag":29,"props":201508,"children":201509},{},[201510],{"type":23,"value":201511},"Apply the same pattern to:",{"type":17,"tag":80,"props":201513,"children":201514},{},[201515,201519],{"type":17,"tag":84,"props":201516,"children":201517},{},[201518],{"type":23,"value":56865},{"type":17,"tag":84,"props":201520,"children":201521},{},[201522],{"type":23,"value":56878},{"type":17,"tag":29,"props":201524,"children":201525},{},[201526],{"type":23,"value":201527},"This keeps ingestion predictable and efficient.",{"type":17,"tag":68,"props":201529,"children":201531},{"id":201530},"optional-move-to-webhook-based-ingestion",[201532],{"type":23,"value":201533},"Optional: Move to Webhook-Based Ingestion",{"type":17,"tag":29,"props":201535,"children":201536},{},[201537,201539,201543],{"type":23,"value":201538},"If near-real-time ingestion is required, Unified supports ",{"type":17,"tag":133,"props":201540,"children":201541},{"href":4999},[201542],{"type":23,"value":5002},{"type":23,"value":201544}," for ATS objects, including:",{"type":17,"tag":80,"props":201546,"children":201547},{},[201548,201556,201564,201572,201581,201589,201598,201607,201616],{"type":17,"tag":84,"props":201549,"children":201550},{},[201551],{"type":17,"tag":6121,"props":201552,"children":201554},{"className":201553},[],[201555],{"type":23,"value":157072},{"type":17,"tag":84,"props":201557,"children":201558},{},[201559],{"type":17,"tag":6121,"props":201560,"children":201562},{"className":201561},[],[201563],{"type":23,"value":157081},{"type":17,"tag":84,"props":201565,"children":201566},{},[201567],{"type":17,"tag":6121,"props":201568,"children":201570},{"className":201569},[],[201571],{"type":23,"value":157090},{"type":17,"tag":84,"props":201573,"children":201574},{},[201575],{"type":17,"tag":6121,"props":201576,"children":201578},{"className":201577},[],[201579],{"type":23,"value":201580},"ats_activity",{"type":17,"tag":84,"props":201582,"children":201583},{},[201584],{"type":17,"tag":6121,"props":201585,"children":201587},{"className":201586},[],[201588],{"type":23,"value":157099},{"type":17,"tag":84,"props":201590,"children":201591},{},[201592],{"type":17,"tag":6121,"props":201593,"children":201595},{"className":201594},[],[201596],{"type":23,"value":201597},"ats_interview",{"type":17,"tag":84,"props":201599,"children":201600},{},[201601],{"type":17,"tag":6121,"props":201602,"children":201604},{"className":201603},[],[201605],{"type":23,"value":201606},"ats_scorecard",{"type":17,"tag":84,"props":201608,"children":201609},{},[201610],{"type":17,"tag":6121,"props":201611,"children":201613},{"className":201612},[],[201614],{"type":23,"value":201615},"ats_company",{"type":17,"tag":84,"props":201617,"children":201618},{},[201619],{"type":17,"tag":6121,"props":201620,"children":201622},{"className":201621},[],[201623],{"type":23,"value":201624},"ats_applicationstatus",{"type":17,"tag":29,"props":201626,"children":201627},{},[201628],{"type":23,"value":201629},"Webhooks support the following event types:",{"type":17,"tag":80,"props":201631,"children":201632},{},[201633,201641,201649],{"type":17,"tag":84,"props":201634,"children":201635},{},[201636],{"type":17,"tag":6121,"props":201637,"children":201639},{"className":201638},[],[201640],{"type":23,"value":109207},{"type":17,"tag":84,"props":201642,"children":201643},{},[201644],{"type":17,"tag":6121,"props":201645,"children":201647},{"className":201646},[],[201648],{"type":23,"value":109214},{"type":17,"tag":84,"props":201650,"children":201651},{},[201652],{"type":17,"tag":6121,"props":201653,"children":201655},{"className":201654},[],[201656],{"type":23,"value":109221},{"type":17,"tag":29,"props":201658,"children":201659},{},[201660,201664],{"type":17,"tag":133,"props":201661,"children":201662},{"href":9007},[201663],{"type":23,"value":9256},{"type":23,"value":201665}," commonly deliver created and updated records based on polling at a configured interval. Native webhook behavior, including whether deletion events are delivered, depends on the provider.",{"type":17,"tag":29,"props":201667,"children":201668},{},[201669,201671,201675,201677,201683,201684,201689],{"type":23,"value":201670},"Filters are supported for ",{"type":17,"tag":48,"props":201672,"children":201673},{},[201674],{"type":23,"value":46572},{"type":23,"value":201676}," and must match the object's list-endpoint parameters (for example, parameters ending in ",{"type":17,"tag":6121,"props":201678,"children":201680},{"className":201679},[],[201681],{"type":23,"value":201682},"_id",{"type":23,"value":75890},{"type":17,"tag":6121,"props":201685,"children":201687},{"className":201686},[],[201688],{"type":23,"value":27310},{"type":23,"value":201690},"). Filter availability varies by integration and object. Native webhooks do not accept filters.",{"type":17,"tag":29,"props":201692,"children":201693},{},[201694,201696,201701],{"type":23,"value":201695},"Polling via ",{"type":17,"tag":6121,"props":201697,"children":201699},{"className":201698},[],[201700],{"type":23,"value":26291},{"type":23,"value":201702}," remains universally supported and sufficient for most ingestion workflows.",{"type":17,"tag":68,"props":201704,"children":201706},{"id":201705},"modeling-identity-and-deduplication",[201707],{"type":23,"value":201708},"Modeling Identity and Deduplication",{"type":17,"tag":29,"props":201710,"children":201711},{},[201712],{"type":23,"value":201713},"Ingestion exposes duplicates. It does not eliminate them.",{"type":17,"tag":29,"props":201715,"children":201716},{},[201717],{"type":23,"value":201718},"Important considerations:",{"type":17,"tag":80,"props":201720,"children":201721},{},[201722,201732,201737,201742,201747],{"type":17,"tag":84,"props":201723,"children":201724},{},[201725,201730],{"type":17,"tag":6121,"props":201726,"children":201728},{"className":201727},[],[201729],{"type":23,"value":117296},{"type":23,"value":201731}," is unique per connection.",{"type":17,"tag":84,"props":201733,"children":201734},{},[201735],{"type":23,"value":201736},"Multiple connections create separate identity namespaces.",{"type":17,"tag":84,"props":201738,"children":201739},{},[201740],{"type":23,"value":201741},"A candidate may have multiple applications.",{"type":17,"tag":84,"props":201743,"children":201744},{},[201745],{"type":23,"value":201746},"ATS systems may contain duplicate candidates.",{"type":17,"tag":84,"props":201748,"children":201749},{},[201750,201755],{"type":17,"tag":6121,"props":201751,"children":201753},{"className":201752},[],[201754],{"type":23,"value":201060},{"type":23,"value":201756}," may assist in correlation if consistently populated.",{"type":17,"tag":29,"props":201758,"children":201759},{},[201760],{"type":23,"value":201761},"Unified does not merge identities across connections. Deduplication logic belongs in your application layer.",{"type":17,"tag":29,"props":201763,"children":201764},{},[201765],{"type":23,"value":201766},"Common approaches:",{"type":17,"tag":80,"props":201768,"children":201769},{},[201770,201775,201780],{"type":17,"tag":84,"props":201771,"children":201772},{},[201773],{"type":23,"value":201774},"Email-based matching",{"type":17,"tag":84,"props":201776,"children":201777},{},[201778],{"type":23,"value":201779},"External identifier matching",{"type":17,"tag":84,"props":201781,"children":201782},{},[201783],{"type":23,"value":201784},"Candidate + job application dedupe",{"type":17,"tag":68,"props":201786,"children":201788},{"id":201787},"handling-custom-fields",[201789],{"type":23,"value":201790},"Handling Custom Fields",{"type":17,"tag":29,"props":201792,"children":201793},{},[201794],{"type":23,"value":201795},"ATS providers often include custom fields beyond normalized objects.",{"type":17,"tag":29,"props":201797,"children":201798},{},[201799,201801,201806],{"type":23,"value":201800},"Unified exposes custom fields through ",{"type":17,"tag":6121,"props":201802,"children":201804},{"className":201803},[],[201805],{"type":23,"value":133378},{"type":23,"value":201807}," on supported objects.",{"type":17,"tag":29,"props":201809,"children":201810},{},[201811,201813,201818],{"type":23,"value":201812},"If your product depends on custom attributes, ingest and persist the ",{"type":17,"tag":6121,"props":201814,"children":201816},{"className":201815},[],[201817],{"type":23,"value":133378},{"type":23,"value":201819}," array alongside normalized fields so that custom values can be rendered or processed without depending on provider-specific schemas.",{"type":17,"tag":68,"props":201821,"children":201823},{"id":201822},"what-unified-does-not-do",[201824],{"type":23,"value":201825},"What Unified Does Not Do",{"type":17,"tag":29,"props":201827,"children":201828},{},[201829],{"type":23,"value":104494},{"type":17,"tag":80,"props":201831,"children":201832},{},[201833,201838,201843,201848],{"type":17,"tag":84,"props":201834,"children":201835},{},[201836],{"type":23,"value":201837},"Merge duplicate candidates across systems",{"type":17,"tag":84,"props":201839,"children":201840},{},[201841],{"type":23,"value":201842},"Reconstruct deleted records unless provided by the ATS",{"type":17,"tag":84,"props":201844,"children":201845},{},[201846],{"type":23,"value":201847},"Infer relationships not present in the data",{"type":17,"tag":84,"props":201849,"children":201850},{},[201851],{"type":23,"value":201852},"Enforce identical field support across all integrations",{"type":17,"tag":29,"props":201854,"children":201855},{},[201856],{"type":23,"value":201857},"It exposes what the ATS records, consistently.",{"type":17,"tag":68,"props":201859,"children":201860},{"id":132938},[201861],{"type":23,"value":132941},{"type":17,"tag":29,"props":201863,"children":201864},{},[201865],{"type":23,"value":201866},"Ingesting ATS data correctly means separating:",{"type":17,"tag":80,"props":201868,"children":201869},{},[201870,201874,201878],{"type":17,"tag":84,"props":201871,"children":201872},{},[201873],{"type":23,"value":56852},{"type":17,"tag":84,"props":201875,"children":201876},{},[201877],{"type":23,"value":56865},{"type":17,"tag":84,"props":201879,"children":201880},{},[201881],{"type":23,"value":56878},{"type":17,"tag":29,"props":201883,"children":201884},{},[201885],{"type":23,"value":201886},"And using incremental updates to keep them current.",{"type":17,"tag":29,"props":201888,"children":201889},{},[201890],{"type":23,"value":201891},"Unified's ATS API provides normalized objects and consistent list semantics so you can ingest jobs and candidates across providers without per-vendor logic.",{"type":17,"tag":29,"props":201893,"children":201894},{},[201895],{"type":23,"value":201896},"From there, talent pool visibility becomes a modeling problem, not an integration problem.",{"type":17,"tag":29,"props":201898,"children":201899},{},[201900,201901],{"type":23,"value":1609},{"type":17,"tag":133,"props":201902,"children":201904},{"href":1612,"rel":201903},[214],[201905],{"type":23,"value":1616},{"type":17,"tag":29,"props":201907,"children":201908},{},[201909,201910],{"type":23,"value":1609},{"type":17,"tag":133,"props":201911,"children":201913},{"href":1623,"rel":201912},[214],[201914],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":201916},[201917,201918,201919,201920,201921,201922,201924,201925,201926,201927,201928],{"id":200864,"depth":1629,"text":200867},{"id":200945,"depth":1629,"text":200948},{"id":201103,"depth":1629,"text":201106},{"id":201232,"depth":1629,"text":201235},{"id":201390,"depth":1629,"text":201393},{"id":201437,"depth":1629,"text":201923},"Step 5: Use Incremental Sync with updated_gte",{"id":201530,"depth":1629,"text":201533},{"id":201705,"depth":1629,"text":201708},{"id":201787,"depth":1629,"text":201790},{"id":201822,"depth":1629,"text":201825},{"id":132938,"depth":1629,"text":132941},"content:blog:how_to_ingest_jobs_and_candidates_from_ats_systems_with_unified_ats_api.md","blog/how_to_ingest_jobs_and_candidates_from_ats_systems_with_unified_ats_api.md","blog/how_to_ingest_jobs_and_candidates_from_ats_systems_with_unified_ats_api",{"_path":201933,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":201934,"description":201935,"img":201936,"date":200786,"tag":12,"body":201937,"_type":1677,"_id":203279,"_source":1679,"_file":203280,"_stem":203281,"_extension":1682},"/blog/how_to_push_candidates_and_applications_into_ats_systems_with_unified_ats_api","How to Push Candidates and Applications into ATS Systems with Unified's ATS API","The other half is write-side control, creating candidates, submitting applications, attaching documents, and updating pipeline state inside your customer's ATS.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_push_candidates_and_applications_into_ats_systems_with_unified_ats_api-icon.png",{"type":14,"children":201938,"toc":203246},[201939,201944,201947,201954,201959,201964,201969,201980,201986,201991,202037,202042,202048,202052,202061,202066,202075,202079,202097,202108,202113,202143,202151,202156,202161,202167,202172,202222,202227,202235,202240,202246,202250,202254,202262,202266,202275,202280,202285,202290,202357,202365,202383,202389,202393,202399,202546,202551,202557,202562,202570,202576,202629,202635,202802,202807,202813,202818,202827,202831,202840,202846,202851,202855,202957,202967,202972,203010,203016,203029,203034,203040,203079,203091,203097,203120,203125,203148,203154,203159,203202,203208,203213,203218,203223,203228,203237],{"type":17,"tag":18,"props":201940,"children":201942},{"id":201941},"how-to-push-candidates-and-applications-into-ats-systems-with-unifieds-ats-api",[201943],{"type":23,"value":201934},{"type":17,"tag":25,"props":201945,"children":201946},{},[],{"type":17,"tag":29,"props":201948,"children":201949},{},[201950],{"type":17,"tag":33,"props":201951,"children":201952},{},[201953],{"type":23,"value":199463},{"type":17,"tag":29,"props":201955,"children":201956},{},[201957],{"type":23,"value":201958},"Ingesting ATS data is one half of an integration.",{"type":17,"tag":29,"props":201960,"children":201961},{},[201962],{"type":23,"value":201963},"The other half is write-side control: creating candidates, submitting applications, attaching documents, and updating pipeline state inside your customer's ATS.",{"type":17,"tag":29,"props":201965,"children":201966},{},[201967],{"type":23,"value":201968},"Write operations are more complex than reads. Field requirements vary by provider. Writable fields differ across integrations. Some objects are read-only in certain ATSs. There is no global stage-transition model. And Unified does not enforce idempotency or duplicate prevention for you.",{"type":17,"tag":29,"props":201970,"children":201971},{},[201972,201974,201978],{"type":23,"value":201973},"This guide explains how to push candidates and applications into ATS systems using Unified's ",{"type":17,"tag":133,"props":201975,"children":201976},{"href":55696},[201977],{"type":23,"value":55699},{"type":23,"value":201979}," — accurately, safely, and with provider variability in mind.",{"type":17,"tag":68,"props":201981,"children":201983},{"id":201982},"the-write-mental-model",[201984],{"type":23,"value":201985},"The write mental model",{"type":17,"tag":29,"props":201987,"children":201988},{},[201989],{"type":23,"value":201990},"Write operations follow this typical flow:",{"type":17,"tag":6154,"props":201992,"children":201993},{},[201994,202002,202011,202023,202032],{"type":17,"tag":84,"props":201995,"children":201996},{},[201997],{"type":17,"tag":48,"props":201998,"children":201999},{},[202000],{"type":23,"value":202001},"Create a candidate",{"type":17,"tag":84,"props":202003,"children":202004},{},[202005,202009],{"type":17,"tag":48,"props":202006,"children":202007},{},[202008],{"type":23,"value":106404},{"type":23,"value":202010}," linking candidate to job",{"type":17,"tag":84,"props":202012,"children":202013},{},[202014,202016,202021],{"type":23,"value":202015},"(Optional) ",{"type":17,"tag":48,"props":202017,"children":202018},{},[202019],{"type":23,"value":202020},"Upload documents",{"type":23,"value":202022}," (resume, cover letter, etc.)",{"type":17,"tag":84,"props":202024,"children":202025},{},[202026,202027],{"type":23,"value":202015},{"type":17,"tag":48,"props":202028,"children":202029},{},[202030],{"type":23,"value":202031},"Update application status",{"type":17,"tag":84,"props":202033,"children":202034},{},[202035],{"type":23,"value":202036},"Handle errors and retry appropriately",{"type":17,"tag":29,"props":202038,"children":202039},{},[202040],{"type":23,"value":202041},"Everything else — deduplication, idempotency, cross-connection identity — belongs in your application layer.",{"type":17,"tag":68,"props":202043,"children":202045},{"id":202044},"step-1-create-a-candidate",[202046],{"type":23,"value":202047},"Step 1: Create a Candidate",{"type":17,"tag":239,"props":202049,"children":202050},{"id":132141},[202051],{"type":23,"value":132144},{"type":17,"tag":6893,"props":202053,"children":202056},{"className":202054,"code":202055,"language":20901,"meta":23},[20899],"POST /ats/{connection_id}/candidate\n",[202057],{"type":17,"tag":6121,"props":202058,"children":202059},{"__ignoreMap":7},[202060],{"type":23,"value":202055},{"type":17,"tag":29,"props":202062,"children":202063},{},[202064],{"type":23,"value":202065},"SDK:",{"type":17,"tag":6893,"props":202067,"children":202070},{"className":202068,"code":202069,"language":18718,"meta":7},[18716],"const result = await sdk.ats.createAtsCandidate({\n  connectionId,\n  atsCandidate: {\n    first_name: 'Jane',\n    last_name: 'Doe',\n    emails: [{ email: 'jane@example.com', type: 'WORK' }],\n  },\n  fields: '',\n  raw: '',\n});\n",[202071],{"type":17,"tag":6121,"props":202072,"children":202073},{"__ignoreMap":7},[202074],{"type":23,"value":202069},{"type":17,"tag":239,"props":202076,"children":202077},{"id":149561},[202078],{"type":23,"value":149564},{"type":17,"tag":29,"props":202080,"children":202081},{},[202082,202083,202088,202090,202095],{"type":23,"value":6712},{"type":17,"tag":48,"props":202084,"children":202085},{},[202086],{"type":23,"value":202087},"generic ATS create candidate endpoint does not document any required fields",{"type":23,"value":202089}," beyond the ",{"type":17,"tag":6121,"props":202091,"children":202093},{"className":202092},[],[202094],{"type":23,"value":25037},{"type":23,"value":202096}," path parameter.",{"type":17,"tag":29,"props":202098,"children":202099},{},[202100,202102,202107],{"type":23,"value":202101},"However, ",{"type":17,"tag":48,"props":202103,"children":202104},{},[202105],{"type":23,"value":202106},"required fields vary by integration",{"type":23,"value":54},{"type":17,"tag":29,"props":202109,"children":202110},{},[202111],{"type":23,"value":202112},"Examples documented:",{"type":17,"tag":80,"props":202114,"children":202115},{},[202116,202138],{"type":17,"tag":84,"props":202117,"children":202118},{},[202119,202123,202125,202130,202131,202136],{"type":17,"tag":48,"props":202120,"children":202121},{},[202122],{"type":23,"value":56644},{"type":23,"value":202124}," requires ",{"type":17,"tag":6121,"props":202126,"children":202128},{"className":202127},[],[202129],{"type":23,"value":50735},{"type":23,"value":34435},{"type":17,"tag":6121,"props":202132,"children":202134},{"className":202133},[],[202135],{"type":23,"value":18781},{"type":23,"value":202137}," (starred writable fields).",{"type":17,"tag":84,"props":202139,"children":202140},{},[202141],{"type":23,"value":202142},"Other providers (e.g., Greenhouse, Lever) do not mark required candidate fields in documentation.",{"type":17,"tag":29,"props":202144,"children":202145},{},[202146],{"type":17,"tag":48,"props":202147,"children":202148},{},[202149],{"type":23,"value":202150},"Conclusion:",{"type":17,"tag":29,"props":202152,"children":202153},{},[202154],{"type":23,"value":202155},"You must check the integration's 'Writable Fields' section. Starred fields are required for that provider.",{"type":17,"tag":29,"props":202157,"children":202158},{},[202159],{"type":23,"value":202160},"If no fields are starred, no required fields are documented.",{"type":17,"tag":239,"props":202162,"children":202164},{"id":202163},"duplicate-prevention-idempotency",[202165],{"type":23,"value":202166},"Duplicate prevention & idempotency",{"type":17,"tag":29,"props":202168,"children":202169},{},[202170],{"type":23,"value":202171},"Unified documentation:",{"type":17,"tag":80,"props":202173,"children":202174},{},[202175,202186,202196,202206],{"type":17,"tag":84,"props":202176,"children":202177},{},[202178,202180,202184],{"type":23,"value":202179},"Does ",{"type":17,"tag":48,"props":202181,"children":202182},{},[202183],{"type":23,"value":159475},{"type":23,"value":202185}," document idempotency key support.",{"type":17,"tag":84,"props":202187,"children":202188},{},[202189,202190,202194],{"type":23,"value":202179},{"type":17,"tag":48,"props":202191,"children":202192},{},[202193],{"type":23,"value":159475},{"type":23,"value":202195}," document upsert behavior.",{"type":17,"tag":84,"props":202197,"children":202198},{},[202199,202200,202204],{"type":23,"value":202179},{"type":17,"tag":48,"props":202201,"children":202202},{},[202203],{"type":23,"value":159475},{"type":23,"value":202205}," document duplicate candidate prevention.",{"type":17,"tag":84,"props":202207,"children":202208},{},[202209,202210,202214,202216,202221],{"type":23,"value":202179},{"type":17,"tag":48,"props":202211,"children":202212},{},[202213],{"type":23,"value":159475},{"type":23,"value":202215}," enforce uniqueness of ",{"type":17,"tag":6121,"props":202217,"children":202219},{"className":202218},[],[202220],{"type":23,"value":201060},{"type":23,"value":54},{"type":17,"tag":29,"props":202223,"children":202224},{},[202225],{"type":23,"value":202226},"Therefore:",{"type":17,"tag":3414,"props":202228,"children":202229},{},[202230],{"type":17,"tag":29,"props":202231,"children":202232},{},[202233],{"type":23,"value":202234},"Unified documentation does not describe idempotency or duplicate prevention for ATS write endpoints.",{"type":17,"tag":29,"props":202236,"children":202237},{},[202238],{"type":23,"value":202239},"If your system may send the same candidate twice, implement idempotency and dedupe logic in your own application.",{"type":17,"tag":68,"props":202241,"children":202243},{"id":202242},"step-2-create-an-application",[202244],{"type":23,"value":202245},"Step 2: Create an Application",{"type":17,"tag":29,"props":202247,"children":202248},{},[202249],{"type":23,"value":156595},{"type":17,"tag":239,"props":202251,"children":202252},{"id":132403},[202253],{"type":23,"value":132144},{"type":17,"tag":6893,"props":202255,"children":202257},{"className":202256,"code":135041,"language":20901,"meta":23},[20899],[202258],{"type":17,"tag":6121,"props":202259,"children":202260},{"__ignoreMap":7},[202261],{"type":23,"value":135041},{"type":17,"tag":29,"props":202263,"children":202264},{},[202265],{"type":23,"value":202065},{"type":17,"tag":6893,"props":202267,"children":202270},{"className":202268,"code":202269,"language":18718,"meta":7},[18716],"const result = await sdk.ats.createAtsApplication({\n  connectionId,\n  atsApplication: {\n    candidate_id: 'candidate123',\n    job_id: 'job456',\n    status: 'NEW',\n  },\n  fields: '',\n  raw: '',\n});\n",[202271],{"type":17,"tag":6121,"props":202272,"children":202273},{"__ignoreMap":7},[202274],{"type":23,"value":202269},{"type":17,"tag":68,"props":202276,"children":202278},{"id":202277},"required-fields-1",[202279],{"type":23,"value":149564},{"type":17,"tag":29,"props":202281,"children":202282},{},[202283],{"type":23,"value":202284},"The generic documentation does not mark required fields.",{"type":17,"tag":29,"props":202286,"children":202287},{},[202288],{"type":23,"value":202289},"However, integration pages show:",{"type":17,"tag":80,"props":202291,"children":202292},{},[202293,202314,202335],{"type":17,"tag":84,"props":202294,"children":202295},{},[202296,202300,202301,202306,202307,202312],{"type":17,"tag":48,"props":202297,"children":202298},{},[202299],{"type":23,"value":56644},{"type":23,"value":49318},{"type":17,"tag":6121,"props":202302,"children":202304},{"className":202303},[],[202305],{"type":23,"value":117296},{"type":23,"value":34435},{"type":17,"tag":6121,"props":202308,"children":202310},{"className":202309},[],[202311],{"type":23,"value":117309},{"type":23,"value":202313}," are required (starred).",{"type":17,"tag":84,"props":202315,"children":202316},{},[202317,202321,202322,202327,202328,202333],{"type":17,"tag":48,"props":202318,"children":202319},{},[202320],{"type":23,"value":56545},{"type":23,"value":49318},{"type":17,"tag":6121,"props":202323,"children":202325},{"className":202324},[],[202326],{"type":23,"value":117296},{"type":23,"value":34435},{"type":17,"tag":6121,"props":202329,"children":202331},{"className":202330},[],[202332],{"type":23,"value":117309},{"type":23,"value":202334}," are required.",{"type":17,"tag":84,"props":202336,"children":202337},{},[202338,202342,202344,202349,202350,202355],{"type":17,"tag":48,"props":202339,"children":202340},{},[202341],{"type":23,"value":3189},{"type":23,"value":202343},": no required fields marked, but logically ",{"type":17,"tag":6121,"props":202345,"children":202347},{"className":202346},[],[202348],{"type":23,"value":117296},{"type":23,"value":34435},{"type":17,"tag":6121,"props":202351,"children":202353},{"className":202352},[],[202354],{"type":23,"value":117309},{"type":23,"value":202356}," must exist to create a valid application.",{"type":17,"tag":29,"props":202358,"children":202359},{},[202360],{"type":17,"tag":48,"props":202361,"children":202362},{},[202363],{"type":23,"value":202364},"Safe rule:",{"type":17,"tag":29,"props":202366,"children":202367},{},[202368,202370,202375,202376,202381],{"type":23,"value":202369},"Assume ",{"type":17,"tag":6121,"props":202371,"children":202373},{"className":202372},[],[202374],{"type":23,"value":117296},{"type":23,"value":34435},{"type":17,"tag":6121,"props":202377,"children":202379},{"className":202378},[],[202380],{"type":23,"value":117309},{"type":23,"value":202382}," are required unless the integration page explicitly states otherwise.",{"type":17,"tag":68,"props":202384,"children":202386},{"id":202385},"writable-fields-on-create",[202387],{"type":23,"value":202388},"Writable fields on create",{"type":17,"tag":29,"props":202390,"children":202391},{},[202392],{"type":23,"value":150309},{"type":17,"tag":239,"props":202394,"children":202396},{"id":202395},"common-patterns",[202397],{"type":23,"value":202398},"Common patterns:",{"type":17,"tag":7231,"props":202400,"children":202401},{},[202402,202421],{"type":17,"tag":7235,"props":202403,"children":202404},{},[202405],{"type":17,"tag":7239,"props":202406,"children":202407},{},[202408,202412,202417],{"type":17,"tag":7243,"props":202409,"children":202410},{},[202411],{"type":23,"value":24651},{"type":17,"tag":7243,"props":202413,"children":202414},{},[202415],{"type":23,"value":202416},"Writable?",{"type":17,"tag":7243,"props":202418,"children":202419},{},[202420],{"type":23,"value":6701},{"type":17,"tag":7259,"props":202422,"children":202423},{},[202424,202444,202463,202484,202505,202526],{"type":17,"tag":7239,"props":202425,"children":202426},{},[202427,202435,202439],{"type":17,"tag":7266,"props":202428,"children":202429},{},[202430],{"type":17,"tag":6121,"props":202431,"children":202433},{"className":202432},[],[202434],{"type":23,"value":117296},{"type":17,"tag":7266,"props":202436,"children":202437},{},[202438],{"type":23,"value":47981},{"type":17,"tag":7266,"props":202440,"children":202441},{},[202442],{"type":23,"value":202443},"Usually required",{"type":17,"tag":7239,"props":202445,"children":202446},{},[202447,202455,202459],{"type":17,"tag":7266,"props":202448,"children":202449},{},[202450],{"type":17,"tag":6121,"props":202451,"children":202453},{"className":202452},[],[202454],{"type":23,"value":117309},{"type":17,"tag":7266,"props":202456,"children":202457},{},[202458],{"type":23,"value":47981},{"type":17,"tag":7266,"props":202460,"children":202461},{},[202462],{"type":23,"value":202443},{"type":17,"tag":7239,"props":202464,"children":202465},{},[202466,202474,202479],{"type":17,"tag":7266,"props":202467,"children":202468},{},[202469],{"type":17,"tag":6121,"props":202470,"children":202472},{"className":202471},[],[202473],{"type":23,"value":19949},{"type":17,"tag":7266,"props":202475,"children":202476},{},[202477],{"type":23,"value":202478},"Often yes",{"type":17,"tag":7266,"props":202480,"children":202481},{},[202482],{"type":23,"value":202483},"Writable in many integrations",{"type":17,"tag":7239,"props":202485,"children":202486},{},[202487,202495,202500],{"type":17,"tag":7266,"props":202488,"children":202489},{},[202490],{"type":17,"tag":6121,"props":202491,"children":202493},{"className":202492},[],[202494],{"type":23,"value":117334},{"type":17,"tag":7266,"props":202496,"children":202497},{},[202498],{"type":23,"value":202499},"Only some",{"type":17,"tag":7266,"props":202501,"children":202502},{},[202503],{"type":23,"value":202504},"Writable in some providers (e.g., Greenhouse)",{"type":17,"tag":7239,"props":202506,"children":202507},{},[202508,202516,202521],{"type":17,"tag":7266,"props":202509,"children":202510},{},[202511],{"type":17,"tag":6121,"props":202512,"children":202514},{"className":202513},[],[202515],{"type":23,"value":117347},{"type":17,"tag":7266,"props":202517,"children":202518},{},[202519],{"type":23,"value":202520},"Some",{"type":17,"tag":7266,"props":202522,"children":202523},{},[202524],{"type":23,"value":202525},"Writable in some integrations (e.g., Vincere), not others",{"type":17,"tag":7239,"props":202527,"children":202528},{},[202529,202537,202541],{"type":17,"tag":7266,"props":202530,"children":202531},{},[202532],{"type":17,"tag":6121,"props":202533,"children":202535},{"className":202534},[],[202536],{"type":23,"value":135872},{"type":17,"tag":7266,"props":202538,"children":202539},{},[202540],{"type":23,"value":48006},{"type":17,"tag":7266,"props":202542,"children":202543},{},[202544],{"type":23,"value":202545},"Not listed in writable fields in reviewed integrations",{"type":17,"tag":29,"props":202547,"children":202548},{},[202549],{"type":23,"value":202550},"If a field is not listed under 'Writable Fields' on the integration page, it should be treated as read-only.",{"type":17,"tag":68,"props":202552,"children":202554},{"id":202553},"step-3-upload-documents-resume-etc",[202555],{"type":23,"value":202556},"Step 3: Upload Documents (Resume, etc.)",{"type":17,"tag":239,"props":202558,"children":202560},{"id":202559},"endpoint-2",[202561],{"type":23,"value":132144},{"type":17,"tag":6893,"props":202563,"children":202565},{"className":202564,"code":134937,"language":20901,"meta":23},[20899],[202566],{"type":17,"tag":6121,"props":202567,"children":202568},{"__ignoreMap":7},[202569],{"type":23,"value":134937},{"type":17,"tag":239,"props":202571,"children":202573},{"id":202572},"required-behavior",[202574],{"type":23,"value":202575},"Required behavior",{"type":17,"tag":80,"props":202577,"children":202578},{},[202579,202596,202607,202612,202624],{"type":17,"tag":84,"props":202580,"children":202581},{},[202582,202587,202589,202594],{"type":17,"tag":6121,"props":202583,"children":202585},{"className":202584},[],[202586],{"type":23,"value":135899},{"type":23,"value":202588}," must be ",{"type":17,"tag":48,"props":202590,"children":202591},{},[202592],{"type":23,"value":202593},"base64 encoded",{"type":23,"value":202595}," when used.",{"type":17,"tag":84,"props":202597,"children":202598},{},[202599,202601,202606],{"type":23,"value":202600},"Some integrations support only ",{"type":17,"tag":6121,"props":202602,"children":202604},{"className":202603},[],[202605],{"type":23,"value":134916},{"type":23,"value":54},{"type":17,"tag":84,"props":202608,"children":202609},{},[202610],{"type":23,"value":202611},"Some support both.",{"type":17,"tag":84,"props":202613,"children":202614},{},[202615,202617,202622],{"type":23,"value":202616},"File size and file type limits are ",{"type":17,"tag":48,"props":202618,"children":202619},{},[202620],{"type":23,"value":202621},"not documented",{"type":23,"value":202623}," by Unified.",{"type":17,"tag":84,"props":202625,"children":202626},{},[202627],{"type":23,"value":202628},"Attachment target varies by provider.",{"type":17,"tag":239,"props":202630,"children":202632},{"id":202631},"provider-specific-attachment-behavior",[202633],{"type":23,"value":202634},"Provider-specific attachment behavior",{"type":17,"tag":7231,"props":202636,"children":202637},{},[202638,202663],{"type":17,"tag":7235,"props":202639,"children":202640},{},[202641],{"type":17,"tag":7239,"props":202642,"children":202643},{},[202644,202649,202654,202659],{"type":17,"tag":7243,"props":202645,"children":202646},{},[202647],{"type":23,"value":202648},"Provider",{"type":17,"tag":7243,"props":202650,"children":202651},{},[202652],{"type":23,"value":202653},"Attach To",{"type":17,"tag":7243,"props":202655,"children":202656},{},[202657],{"type":23,"value":202658},"Base64 Support",{"type":17,"tag":7243,"props":202660,"children":202661},{},[202662],{"type":23,"value":6701},{"type":17,"tag":7259,"props":202664,"children":202665},{},[202666,202692,202724,202760,202781],{"type":17,"tag":7239,"props":202667,"children":202668},{},[202669,202673,202678,202682],{"type":17,"tag":7266,"props":202670,"children":202671},{},[202672],{"type":23,"value":3189},{"type":17,"tag":7266,"props":202674,"children":202675},{},[202676],{"type":23,"value":202677},"application only",{"type":17,"tag":7266,"props":202679,"children":202680},{},[202681],{"type":23,"value":48006},{"type":17,"tag":7266,"props":202683,"children":202684},{},[202685,202687],{"type":23,"value":202686},"Requires ",{"type":17,"tag":6121,"props":202688,"children":202690},{"className":202689},[],[202691],{"type":23,"value":134916},{"type":17,"tag":7239,"props":202693,"children":202694},{},[202695,202699,202704,202708],{"type":17,"tag":7266,"props":202696,"children":202697},{},[202698],{"type":23,"value":56545},{"type":17,"tag":7266,"props":202700,"children":202701},{},[202702],{"type":23,"value":202703},"candidate only",{"type":17,"tag":7266,"props":202705,"children":202706},{},[202707],{"type":23,"value":47981},{"type":17,"tag":7266,"props":202709,"children":202710},{},[202711,202712,202717,202718],{"type":23,"value":202686},{"type":17,"tag":6121,"props":202713,"children":202715},{"className":202714},[],[202716],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202719,"children":202721},{"className":202720},[],[202722],{"type":23,"value":202723},"filename",{"type":17,"tag":7239,"props":202725,"children":202726},{},[202727,202731,202735,202739],{"type":17,"tag":7266,"props":202728,"children":202729},{},[202730],{"type":23,"value":56564},{"type":17,"tag":7266,"props":202732,"children":202733},{},[202734],{"type":23,"value":202677},{"type":17,"tag":7266,"props":202736,"children":202737},{},[202738],{"type":23,"value":47981},{"type":17,"tag":7266,"props":202740,"children":202741},{},[202742,202743,202748,202749,202754,202755],{"type":23,"value":202686},{"type":17,"tag":6121,"props":202744,"children":202746},{"className":202745},[],[202747],{"type":23,"value":117452},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202750,"children":202752},{"className":202751},[],[202753],{"type":23,"value":202723},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202756,"children":202758},{"className":202757},[],[202759],{"type":23,"value":27310},{"type":17,"tag":7239,"props":202761,"children":202762},{},[202763,202767,202772,202776],{"type":17,"tag":7266,"props":202764,"children":202765},{},[202766],{"type":23,"value":75321},{"type":17,"tag":7266,"props":202768,"children":202769},{},[202770],{"type":23,"value":202771},"candidate or job",{"type":17,"tag":7266,"props":202773,"children":202774},{},[202775],{"type":23,"value":48006},{"type":17,"tag":7266,"props":202777,"children":202778},{},[202779],{"type":23,"value":202780},"URL-based upload",{"type":17,"tag":7239,"props":202782,"children":202783},{},[202784,202789,202793,202797],{"type":17,"tag":7266,"props":202785,"children":202786},{},[202787],{"type":23,"value":202788},"CATS",{"type":17,"tag":7266,"props":202790,"children":202791},{},[202792],{"type":23,"value":202703},{"type":17,"tag":7266,"props":202794,"children":202795},{},[202796],{"type":23,"value":47981},{"type":17,"tag":7266,"props":202798,"children":202799},{},[202800],{"type":23,"value":202801},"Supports base64",{"type":17,"tag":29,"props":202803,"children":202804},{},[202805],{"type":23,"value":202806},"There are no documented file size or file type restrictions in Unified's docs.",{"type":17,"tag":68,"props":202808,"children":202810},{"id":202809},"step-4-update-an-application",[202811],{"type":23,"value":202812},"Step 4: Update an Application",{"type":17,"tag":239,"props":202814,"children":202816},{"id":202815},"endpoint-3",[202817],{"type":23,"value":132144},{"type":17,"tag":6893,"props":202819,"children":202822},{"className":202820,"code":202821,"language":20901,"meta":23},[20899],"PUT /ats/{connection_id}/application/{id}\n",[202823],{"type":17,"tag":6121,"props":202824,"children":202825},{"__ignoreMap":7},[202826],{"type":23,"value":202821},{"type":17,"tag":29,"props":202828,"children":202829},{},[202830],{"type":23,"value":202065},{"type":17,"tag":6893,"props":202832,"children":202835},{"className":202833,"code":202834,"language":18718,"meta":7},[18716],"const result = await sdk.ats.updateAtsApplication({\n  connectionId,\n  id: 'application123',\n  atsApplication: {\n    status: 'REVIEWING',\n  },\n  fields: '',\n  raw: '',\n});\n",[202836],{"type":17,"tag":6121,"props":202837,"children":202838},{"__ignoreMap":7},[202839],{"type":23,"value":202834},{"type":17,"tag":68,"props":202841,"children":202843},{"id":202842},"writable-fields-on-update",[202844],{"type":23,"value":202845},"Writable fields on update",{"type":17,"tag":29,"props":202847,"children":202848},{},[202849],{"type":23,"value":202850},"Writable fields depend on integration.",{"type":17,"tag":239,"props":202852,"children":202853},{"id":19014},[202854],{"type":23,"value":377},{"type":17,"tag":80,"props":202856,"children":202857},{},[202858,202889,202926],{"type":17,"tag":84,"props":202859,"children":202860},{},[202861,202865,202866,202871,202872,202877,202878,202883,202884],{"type":17,"tag":48,"props":202862,"children":202863},{},[202864],{"type":23,"value":56644},{"type":23,"value":49318},{"type":17,"tag":6121,"props":202867,"children":202869},{"className":202868},[],[202870],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202873,"children":202875},{"className":202874},[],[202876],{"type":23,"value":117309},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202879,"children":202881},{"className":202880},[],[202882],{"type":23,"value":117347},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202885,"children":202887},{"className":202886},[],[202888],{"type":23,"value":19949},{"type":17,"tag":84,"props":202890,"children":202891},{},[202892,202896,202897,202902,202903,202908,202909,202914,202915,202920,202921],{"type":17,"tag":48,"props":202893,"children":202894},{},[202895],{"type":23,"value":3189},{"type":23,"value":49318},{"type":17,"tag":6121,"props":202898,"children":202900},{"className":202899},[],[202901],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202904,"children":202906},{"className":202905},[],[202907],{"type":23,"value":117309},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202910,"children":202912},{"className":202911},[],[202913],{"type":23,"value":39871},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202916,"children":202918},{"className":202917},[],[202919],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202922,"children":202924},{"className":202923},[],[202925],{"type":23,"value":117334},{"type":17,"tag":84,"props":202927,"children":202928},{},[202929,202933,202934,202939,202940,202945,202946,202951,202952],{"type":17,"tag":48,"props":202930,"children":202931},{},[202932],{"type":23,"value":56545},{"type":23,"value":49318},{"type":17,"tag":6121,"props":202935,"children":202937},{"className":202936},[],[202938],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202941,"children":202943},{"className":202942},[],[202944],{"type":23,"value":117309},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202947,"children":202949},{"className":202948},[],[202950],{"type":23,"value":39871},{"type":23,"value":11826},{"type":17,"tag":6121,"props":202953,"children":202955},{"className":202954},[],[202956],{"type":23,"value":19949},{"type":17,"tag":29,"props":202958,"children":202959},{},[202960,202965],{"type":17,"tag":6121,"props":202961,"children":202963},{"className":202962},[],[202964],{"type":23,"value":135872},{"type":23,"value":202966}," is not writable in reviewed integrations.",{"type":17,"tag":239,"props":202968,"children":202970},{"id":202969},"status-behavior",[202971],{"type":23,"value":183685},{"type":17,"tag":80,"props":202973,"children":202974},{},[202975,202985,202990,203000,203005],{"type":17,"tag":84,"props":202976,"children":202977},{},[202978,202983],{"type":17,"tag":6121,"props":202979,"children":202981},{"className":202980},[],[202982],{"type":23,"value":19949},{"type":23,"value":202984}," is writable in the reviewed integrations.",{"type":17,"tag":84,"props":202986,"children":202987},{},[202988],{"type":23,"value":202989},"Some providers classify status as a 'slow field' (updates propagate more slowly).",{"type":17,"tag":84,"props":202991,"children":202992},{},[202993,202998],{"type":17,"tag":6121,"props":202994,"children":202996},{"className":202995},[],[202997],{"type":23,"value":117334},{"type":23,"value":202999}," is writable only if listed in writable fields.",{"type":17,"tag":84,"props":203001,"children":203002},{},[203003],{"type":23,"value":203004},"No documented stage transition rules exist at the Unified level.",{"type":17,"tag":84,"props":203006,"children":203007},{},[203008],{"type":23,"value":203009},"Provider-side constraints may apply but are not documented in Unified.",{"type":17,"tag":68,"props":203011,"children":203013},{"id":203012},"error-handling-retry",[203014],{"type":23,"value":203015},"Error Handling & Retry",{"type":17,"tag":29,"props":203017,"children":203018},{},[203019,203021,203027],{"type":23,"value":203020},"Unified's OpenAPI spec for ATS write endpoints documents only successful ",{"type":17,"tag":6121,"props":203022,"children":203024},{"className":203023},[],[203025],{"type":23,"value":203026},"200",{"type":23,"value":203028}," responses.",{"type":17,"tag":29,"props":203030,"children":203031},{},[203032],{"type":23,"value":203033},"No structured ATS-specific error schema is documented.",{"type":17,"tag":239,"props":203035,"children":203037},{"id":203036},"observations",[203038],{"type":23,"value":203039},"Observations:",{"type":17,"tag":80,"props":203041,"children":203042},{},[203043,203048,203058,203068],{"type":17,"tag":84,"props":203044,"children":203045},{},[203046],{"type":23,"value":203047},"Errors follow standard HTTP status codes.",{"type":17,"tag":84,"props":203049,"children":203050},{},[203051,203056],{"type":17,"tag":6121,"props":203052,"children":203054},{"className":203053},[],[203055],{"type":23,"value":139189},{"type":23,"value":203057}," for malformed or invalid requests.",{"type":17,"tag":84,"props":203059,"children":203060},{},[203061,203066],{"type":17,"tag":6121,"props":203062,"children":203064},{"className":203063},[],[203065],{"type":23,"value":139179},{"type":23,"value":203067}," for rate limiting (provider-driven).",{"type":17,"tag":84,"props":203069,"children":203070},{},[203071,203077],{"type":17,"tag":6121,"props":203072,"children":203074},{"className":203073},[],[203075],{"type":23,"value":203076},"5XX",{"type":23,"value":203078}," for provider outages.",{"type":17,"tag":29,"props":203080,"children":203081},{},[203082,203084,203090],{"type":23,"value":203083},"The SDK exposes generic error handling objects (e.g., ",{"type":17,"tag":6121,"props":203085,"children":203087},{"className":203086},[],[203088],{"type":23,"value":203089},"UnifiedToError",{"type":23,"value":129328},{"type":17,"tag":239,"props":203092,"children":203094},{"id":203093},"retry-behavior",[203095],{"type":23,"value":203096},"Retry behavior",{"type":17,"tag":80,"props":203098,"children":203099},{},[203100,203110,203115],{"type":17,"tag":84,"props":203101,"children":203102},{},[203103,203105,203109],{"type":23,"value":203104},"Unified recommends exponential backoff for ",{"type":17,"tag":133,"props":203106,"children":203107},{"href":135},[203108],{"type":23,"value":138},{"type":23,"value":54},{"type":17,"tag":84,"props":203111,"children":203112},{},[203113],{"type":23,"value":203114},"Python SDK includes retry/backoff utilities.",{"type":17,"tag":84,"props":203116,"children":203117},{},[203118],{"type":23,"value":203119},"No ATS-specific retry guarantees are documented.",{"type":17,"tag":29,"props":203121,"children":203122},{},[203123],{"type":23,"value":203124},"Implement:",{"type":17,"tag":80,"props":203126,"children":203127},{},[203128,203133,203138,203143],{"type":17,"tag":84,"props":203129,"children":203130},{},[203131],{"type":23,"value":203132},"Exponential backoff",{"type":17,"tag":84,"props":203134,"children":203135},{},[203136],{"type":23,"value":203137},"Retry limits",{"type":17,"tag":84,"props":203139,"children":203140},{},[203141],{"type":23,"value":203142},"Logging",{"type":17,"tag":84,"props":203144,"children":203145},{},[203146],{"type":23,"value":203147},"Provider-aware throttling",{"type":17,"tag":68,"props":203149,"children":203151},{"id":203150},"safe-write-side-architecture",[203152],{"type":23,"value":203153},"Safe Write-Side Architecture",{"type":17,"tag":29,"props":203155,"children":203156},{},[203157],{"type":23,"value":203158},"A safe pattern for pushing candidates and applications:",{"type":17,"tag":6154,"props":203160,"children":203161},{},[203162,203167,203172,203177,203182,203187,203192,203197],{"type":17,"tag":84,"props":203163,"children":203164},{},[203165],{"type":23,"value":203166},"Check whether candidate exists in your system.",{"type":17,"tag":84,"props":203168,"children":203169},{},[203170],{"type":23,"value":203171},"Create candidate in ATS.",{"type":17,"tag":84,"props":203173,"children":203174},{},[203175],{"type":23,"value":203176},"Create application linking to job.",{"type":17,"tag":84,"props":203178,"children":203179},{},[203180],{"type":23,"value":203181},"Upload documents if supported.",{"type":17,"tag":84,"props":203183,"children":203184},{},[203185],{"type":23,"value":203186},"Update status as needed.",{"type":17,"tag":84,"props":203188,"children":203189},{},[203190],{"type":23,"value":203191},"Implement idempotency in your app layer.",{"type":17,"tag":84,"props":203193,"children":203194},{},[203195],{"type":23,"value":203196},"Handle retries with exponential backoff.",{"type":17,"tag":84,"props":203198,"children":203199},{},[203200],{"type":23,"value":203201},"Validate integration-specific writable fields before sending payload.",{"type":17,"tag":68,"props":203203,"children":203205},{"id":203204},"write-side-ats-integration-requires-more-discipline-than-read-side-ingestion",[203206],{"type":23,"value":203207},"Write-side ATS integration requires more discipline than read-side ingestion",{"type":17,"tag":29,"props":203209,"children":203210},{},[203211],{"type":23,"value":203212},"Field support varies. Required fields differ. Status updates are provider-specific. Offers cannot be written at creation time. Duplicate handling is not enforced. Error contracts are not strongly typed in documentation.",{"type":17,"tag":29,"props":203214,"children":203215},{},[203216],{"type":23,"value":203217},"Unified's ATS API exposes the underlying provider capabilities through a normalized interface. It does not abstract away provider-level write constraints.",{"type":17,"tag":29,"props":203219,"children":203220},{},[203221],{"type":23,"value":203222},"Treat each integration's 'Writable Fields' section as authoritative, and build your write workflows accordingly.",{"type":17,"tag":29,"props":203224,"children":203225},{},[203226],{"type":23,"value":203227},"From there, pushing candidates and applications becomes predictable — even across multiple ATS systems.",{"type":17,"tag":29,"props":203229,"children":203230},{},[203231,203232],{"type":23,"value":1609},{"type":17,"tag":133,"props":203233,"children":203235},{"href":1612,"rel":203234},[214],[203236],{"type":23,"value":1616},{"type":17,"tag":29,"props":203238,"children":203239},{},[203240,203241],{"type":23,"value":1609},{"type":17,"tag":133,"props":203242,"children":203244},{"href":1623,"rel":203243},[214],[203245],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":203247},[203248,203249,203254,203257,203258,203261,203266,203269,203273,203277,203278],{"id":201982,"depth":1629,"text":201985},{"id":202044,"depth":1629,"text":202047,"children":203250},[203251,203252,203253],{"id":132141,"depth":1635,"text":132144},{"id":149561,"depth":1635,"text":149564},{"id":202163,"depth":1635,"text":202166},{"id":202242,"depth":1629,"text":202245,"children":203255},[203256],{"id":132403,"depth":1635,"text":132144},{"id":202277,"depth":1629,"text":149564},{"id":202385,"depth":1629,"text":202388,"children":203259},[203260],{"id":202395,"depth":1635,"text":202398},{"id":202553,"depth":1629,"text":202556,"children":203262},[203263,203264,203265],{"id":202559,"depth":1635,"text":132144},{"id":202572,"depth":1635,"text":202575},{"id":202631,"depth":1635,"text":202634},{"id":202809,"depth":1629,"text":202812,"children":203267},[203268],{"id":202815,"depth":1635,"text":132144},{"id":202842,"depth":1629,"text":202845,"children":203270},[203271,203272],{"id":19014,"depth":1635,"text":377},{"id":202969,"depth":1635,"text":183685},{"id":203012,"depth":1629,"text":203015,"children":203274},[203275,203276],{"id":203036,"depth":1635,"text":203039},{"id":203093,"depth":1635,"text":203096},{"id":203150,"depth":1629,"text":203153},{"id":203204,"depth":1629,"text":203207},"content:blog:how_to_push_candidates_and_applications_into_ats_systems_with_unified_ats_api.md","blog/how_to_push_candidates_and_applications_into_ats_systems_with_unified_ats_api.md","blog/how_to_push_candidates_and_applications_into_ats_systems_with_unified_ats_api",{"_path":203283,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":203284,"description":203285,"img":203286,"date":200786,"tag":12,"body":203287,"_type":1677,"_id":204564,"_source":1679,"_file":204565,"_stem":204566,"_extension":1682},"/blog/how_to_track_the_candidate_journey","How to Track the Candidate Journey","'Candidate journey' sounds simple until you support more than one ATS.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_track_the_candidate_journey-icon.png",{"type":14,"children":203288,"toc":204534},[203289,203294,203297,203304,203308,203313,203318,203347,203382,203387,203393,203404,203409,203436,203441,203459,203464,203470,203480,203485,203503,203508,203531,203537,203549,203554,203558,203638,203649,203661,203666,203670,203697,203702,203714,203719,203723,203807,203812,203825,203830,203834,203922,203933,203946,203951,203955,204006,204011,204023,204028,204032,204102,204107,204119,204124,204128,204182,204194,204200,204205,204214,204219,204225,204230,204239,204244,204250,204255,204264,204269,204275,204284,204289,204295,204304,204309,204315,204324,204329,204335,204344,204349,204355,204367,204372,204402,204416,204444,204449,204455,204460,204483,204488,204492,204497,204502,204507,204512,204523],{"type":17,"tag":18,"props":203290,"children":203292},{"id":203291},"how-to-track-the-candidate-journey",[203293],{"type":23,"value":203284},{"type":17,"tag":25,"props":203295,"children":203296},{},[],{"type":17,"tag":29,"props":203298,"children":203299},{},[203300],{"type":17,"tag":33,"props":203301,"children":203302},{},[203303],{"type":23,"value":199463},{"type":17,"tag":29,"props":203305,"children":203306},{},[203307],{"type":23,"value":203285},{"type":17,"tag":29,"props":203309,"children":203310},{},[203311],{"type":23,"value":203312},"Every ATS models hiring pipelines differently. Some systems expose a rich set of interview stages. Others collapse progress into a single status field. Some provide detailed event logs. Others overwrite records in place. Even basic concepts like interviews, feedback, and documents vary in structure and availability.",{"type":17,"tag":29,"props":203314,"children":203315},{},[203316],{"type":23,"value":203317},"For a product or platform team, this creates immediate challenges:",{"type":17,"tag":80,"props":203319,"children":203320},{},[203321,203332,203337,203342],{"type":17,"tag":84,"props":203322,"children":203323},{},[203324,203326,203330],{"type":23,"value":203325},"What is the candidate's ",{"type":17,"tag":48,"props":203327,"children":203328},{},[203329],{"type":23,"value":10763},{"type":23,"value":203331}," in the pipeline?",{"type":17,"tag":84,"props":203333,"children":203334},{},[203335],{"type":23,"value":203336},"What actually constitutes the 'journey' — stages, interviews, communications, artifacts?",{"type":17,"tag":84,"props":203338,"children":203339},{},[203340],{"type":23,"value":203341},"How do you show a timeline without inferring steps that were never recorded?",{"type":17,"tag":84,"props":203343,"children":203344},{},[203345],{"type":23,"value":203346},"How do you keep the view accurate without full resyncs or vendor-specific logic?",{"type":17,"tag":29,"props":203348,"children":203349},{},[203350,203351,203355,203357,203361,203363,203368,203369,203374,203375,203380],{"type":23,"value":25244},{"type":17,"tag":133,"props":203352,"children":203353},{"href":55696},[203354],{"type":23,"value":55699},{"type":23,"value":203356}," takes a strict approach. It does ",{"type":17,"tag":48,"props":203358,"children":203359},{},[203360],{"type":23,"value":159475},{"type":23,"value":203362}," reconstruct stage history or infer transitions. Instead, it exposes ",{"type":17,"tag":48,"props":203364,"children":203365},{},[203366],{"type":23,"value":203367},"observable application state",{"type":23,"value":11826},{"type":17,"tag":48,"props":203370,"children":203371},{},[203372],{"type":23,"value":203373},"explicit lifecycle timestamps",{"type":23,"value":12561},{"type":17,"tag":48,"props":203376,"children":203377},{},[203378],{"type":23,"value":203379},"linked objects",{"type":23,"value":203381}," (interviews, activities, scorecards, documents) through normalized, real-time APIs.",{"type":17,"tag":29,"props":203383,"children":203384},{},[203385],{"type":23,"value":203386},"This guide shows how to track the candidate journey through an ATS pipeline using only what the ATS actually records — in a way that is consistent, explainable, and portable across providers.",{"type":17,"tag":68,"props":203388,"children":203390},{"id":203389},"what-candidate-journey-means-here",[203391],{"type":23,"value":203392},"What 'candidate journey' means here",{"type":17,"tag":29,"props":203394,"children":203395},{},[203396,203397,203402],{"type":23,"value":20751},{"type":17,"tag":48,"props":203398,"children":203399},{},[203400],{"type":23,"value":203401},"representing",{"type":23,"value":203403}," the journey, not predicting outcomes.",{"type":17,"tag":29,"props":203405,"children":203406},{},[203407],{"type":23,"value":203408},"We will:",{"type":17,"tag":80,"props":203410,"children":203411},{},[203412,203417,203422,203427],{"type":17,"tag":84,"props":203413,"children":203414},{},[203415],{"type":23,"value":203416},"Determine the current pipeline state per application",{"type":17,"tag":84,"props":203418,"children":203419},{},[203420],{"type":23,"value":203421},"Build a timeline from explicit timestamps and linked objects",{"type":17,"tag":84,"props":203423,"children":203424},{},[203425],{"type":23,"value":203426},"Attach interviews, feedback, communications, and documents",{"type":17,"tag":84,"props":203428,"children":203429},{},[203430,203432],{"type":23,"value":203431},"Keep the journey current using incremental updates and ",{"type":17,"tag":133,"props":203433,"children":203434},{"href":4999},[203435],{"type":23,"value":5002},{"type":17,"tag":29,"props":203437,"children":203438},{},[203439],{"type":23,"value":203440},"We will not:",{"type":17,"tag":80,"props":203442,"children":203443},{},[203444,203449,203454],{"type":17,"tag":84,"props":203445,"children":203446},{},[203447],{"type":23,"value":203448},"Reconstruct stage history from overwritten fields",{"type":17,"tag":84,"props":203450,"children":203451},{},[203452],{"type":23,"value":203453},"Assume all ATSs emit the same events",{"type":17,"tag":84,"props":203455,"children":203456},{},[203457],{"type":23,"value":203458},"Infer transitions that were never recorded",{"type":17,"tag":29,"props":203460,"children":203461},{},[203462],{"type":23,"value":203463},"Those decisions belong in your product logic, not the integration layer.",{"type":17,"tag":68,"props":203465,"children":203467},{"id":203466},"the-mental-model-the-journey-lives-on-the-application",[203468],{"type":23,"value":203469},"The mental model: the journey lives on the application",{"type":17,"tag":29,"props":203471,"children":203472},{},[203473,203475],{"type":23,"value":203474},"Candidates don't move through pipelines. ",{"type":17,"tag":48,"props":203476,"children":203477},{},[203478],{"type":23,"value":203479},"Applications do.",{"type":17,"tag":29,"props":203481,"children":203482},{},[203483],{"type":23,"value":203484},"A single candidate can:",{"type":17,"tag":80,"props":203486,"children":203487},{},[203488,203493,203498],{"type":17,"tag":84,"props":203489,"children":203490},{},[203491],{"type":23,"value":203492},"Apply to multiple jobs",{"type":17,"tag":84,"props":203494,"children":203495},{},[203496],{"type":23,"value":203497},"Have applications in different states",{"type":17,"tag":84,"props":203499,"children":203500},{},[203501],{"type":23,"value":203502},"Accumulate different interviews, activities, and feedback per application",{"type":17,"tag":29,"props":203504,"children":203505},{},[203506],{"type":23,"value":203507},"A 'candidate journey' is therefore a composition of:",{"type":17,"tag":80,"props":203509,"children":203510},{},[203511,203516,203521,203526],{"type":17,"tag":84,"props":203512,"children":203513},{},[203514],{"type":23,"value":203515},"Candidate identity",{"type":17,"tag":84,"props":203517,"children":203518},{},[203519],{"type":23,"value":203520},"One or more applications",{"type":17,"tag":84,"props":203522,"children":203523},{},[203524],{"type":23,"value":203525},"Job context per application",{"type":17,"tag":84,"props":203527,"children":203528},{},[203529],{"type":23,"value":203530},"A timeline built from observable events and timestamps",{"type":17,"tag":68,"props":203532,"children":203534},{"id":203533},"core-objects-involved",[203535],{"type":23,"value":203536},"Core objects involved",{"type":17,"tag":239,"props":203538,"children":203540},{"id":203539},"application-atsapplication",[203541,203543,203548],{"type":23,"value":203542},"Application (",{"type":17,"tag":6121,"props":203544,"children":203546},{"className":203545},[],[203547],{"type":23,"value":132178},{"type":23,"value":12034},{"type":17,"tag":29,"props":203550,"children":203551},{},[203552],{"type":23,"value":203553},"The anchor for the journey.",{"type":17,"tag":29,"props":203555,"children":203556},{},[203557],{"type":23,"value":111468},{"type":17,"tag":80,"props":203559,"children":203560},{},[203561,203581,203590,203600,203620,203628],{"type":17,"tag":84,"props":203562,"children":203563},{},[203564,203569,203570,203575,203576],{"type":17,"tag":6121,"props":203565,"children":203567},{"className":203566},[],[203568],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203571,"children":203573},{"className":203572},[],[203574],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203577,"children":203579},{"className":203578},[],[203580],{"type":23,"value":117309},{"type":17,"tag":84,"props":203582,"children":203583},{},[203584,203589],{"type":17,"tag":6121,"props":203585,"children":203587},{"className":203586},[],[203588],{"type":23,"value":19949},{"type":23,"value":201314},{"type":17,"tag":84,"props":203591,"children":203592},{},[203593,203598],{"type":17,"tag":6121,"props":203594,"children":203596},{"className":203595},[],[203597],{"type":23,"value":117334},{"type":23,"value":203599}," (ATS-native value)",{"type":17,"tag":84,"props":203601,"children":203602},{},[203603,203608,203609,203614,203615],{"type":17,"tag":6121,"props":203604,"children":203606},{"className":203605},[],[203607],{"type":23,"value":117347},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203610,"children":203612},{"className":203611},[],[203613],{"type":23,"value":132224},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203616,"children":203618},{"className":203617},[],[203619],{"type":23,"value":132233},{"type":17,"tag":84,"props":203621,"children":203622},{},[203623],{"type":17,"tag":6121,"props":203624,"children":203626},{"className":203625},[],[203627],{"type":23,"value":156955},{"type":17,"tag":84,"props":203629,"children":203630},{},[203631,203636],{"type":17,"tag":6121,"props":203632,"children":203634},{"className":203633},[],[203635],{"type":23,"value":135872},{"type":23,"value":203637}," (with sent / accepted / rejected / start timestamps)",{"type":17,"tag":29,"props":203639,"children":203640},{},[203641,203643,203647],{"type":23,"value":203642},"This object defines the ",{"type":17,"tag":48,"props":203644,"children":203645},{},[203646],{"type":23,"value":10763},{"type":23,"value":203648}," and the major lifecycle milestones.",{"type":17,"tag":239,"props":203650,"children":203652},{"id":203651},"application-status-atsstatus",[203653,203655,203660],{"type":23,"value":203654},"Application Status (",{"type":17,"tag":6121,"props":203656,"children":203658},{"className":203657},[],[203659],{"type":23,"value":132110},{"type":23,"value":12034},{"type":17,"tag":29,"props":203662,"children":203663},{},[203664],{"type":23,"value":203665},"The normalized stage vocabulary.",{"type":17,"tag":29,"props":203667,"children":203668},{},[203669],{"type":23,"value":111468},{"type":17,"tag":80,"props":203671,"children":203672},{},[203673,203681,203689],{"type":17,"tag":84,"props":203674,"children":203675},{},[203676],{"type":17,"tag":6121,"props":203677,"children":203679},{"className":203678},[],[203680],{"type":23,"value":19949},{"type":17,"tag":84,"props":203682,"children":203683},{},[203684],{"type":17,"tag":6121,"props":203685,"children":203687},{"className":203686},[],[203688],{"type":23,"value":117334},{"type":17,"tag":84,"props":203690,"children":203691},{},[203692],{"type":17,"tag":6121,"props":203693,"children":203695},{"className":203694},[],[203696],{"type":23,"value":24679},{"type":17,"tag":29,"props":203698,"children":203699},{},[203700],{"type":23,"value":203701},"Use this to display consistent stages while preserving vendor-specific naming.",{"type":17,"tag":239,"props":203703,"children":203705},{"id":203704},"interview-atsinterview",[203706,203708,203713],{"type":23,"value":203707},"Interview (",{"type":17,"tag":6121,"props":203709,"children":203711},{"className":203710},[],[203712],{"type":23,"value":132094},{"type":23,"value":12034},{"type":17,"tag":29,"props":203715,"children":203716},{},[203717],{"type":23,"value":203718},"Scheduled moments in the journey.",{"type":17,"tag":29,"props":203720,"children":203721},{},[203722],{"type":23,"value":111468},{"type":17,"tag":80,"props":203724,"children":203725},{},[203726,203746,203776,203790,203799],{"type":17,"tag":84,"props":203727,"children":203728},{},[203729,203734,203735,203740,203741],{"type":17,"tag":6121,"props":203730,"children":203732},{"className":203731},[],[203733],{"type":23,"value":117452},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203736,"children":203738},{"className":203737},[],[203739],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203742,"children":203744},{"className":203743},[],[203745],{"type":23,"value":117309},{"type":17,"tag":84,"props":203747,"children":203748},{},[203749,203754,203755,203761,203762,203768,203769,203775],{"type":17,"tag":6121,"props":203750,"children":203752},{"className":203751},[],[203753],{"type":23,"value":19949},{"type":23,"value":44573},{"type":17,"tag":6121,"props":203756,"children":203758},{"className":203757},[],[203759],{"type":23,"value":203760},"SCHEDULED",{"type":23,"value":11826},{"type":17,"tag":6121,"props":203763,"children":203765},{"className":203764},[],[203766],{"type":23,"value":203767},"AWAITING_FEEDBACK",{"type":23,"value":11826},{"type":17,"tag":6121,"props":203770,"children":203772},{"className":203771},[],[203773],{"type":23,"value":203774},"COMPLETE",{"type":23,"value":149980},{"type":17,"tag":84,"props":203777,"children":203778},{},[203779,203784,203785],{"type":17,"tag":6121,"props":203780,"children":203782},{"className":203781},[],[203783],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203786,"children":203788},{"className":203787},[],[203789],{"type":23,"value":21060},{"type":17,"tag":84,"props":203791,"children":203792},{},[203793],{"type":17,"tag":6121,"props":203794,"children":203796},{"className":203795},[],[203797],{"type":23,"value":203798},"user_ids[]",{"type":17,"tag":84,"props":203800,"children":203801},{},[203802],{"type":17,"tag":6121,"props":203803,"children":203805},{"className":203804},[],[203806],{"type":23,"value":117537},{"type":17,"tag":29,"props":203808,"children":203809},{},[203810],{"type":23,"value":203811},"Interviews turn 'in interview' into something concrete and time-bound.",{"type":17,"tag":239,"props":203813,"children":203815},{"id":203814},"activity-atsactivity",[203816,203818,203824],{"type":23,"value":203817},"Activity (",{"type":17,"tag":6121,"props":203819,"children":203821},{"className":203820},[],[203822],{"type":23,"value":203823},"AtsActivity",{"type":23,"value":12034},{"type":17,"tag":29,"props":203826,"children":203827},{},[203828],{"type":23,"value":203829},"Narrative context and communication.",{"type":17,"tag":29,"props":203831,"children":203832},{},[203833],{"type":23,"value":111468},{"type":17,"tag":80,"props":203835,"children":203836},{},[203837,203864,203891,203905,203914],{"type":17,"tag":84,"props":203838,"children":203839},{},[203840,203845,203846,203851,203852,203857,203858],{"type":17,"tag":6121,"props":203841,"children":203843},{"className":203842},[],[203844],{"type":23,"value":117452},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203847,"children":203849},{"className":203848},[],[203850],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203853,"children":203855},{"className":203854},[],[203856],{"type":23,"value":117309},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203859,"children":203861},{"className":203860},[],[203862],{"type":23,"value":203863},"interview_id",{"type":17,"tag":84,"props":203865,"children":203866},{},[203867,203872,203873,203878,203879,203884,203885,203890],{"type":17,"tag":6121,"props":203868,"children":203870},{"className":203869},[],[203871],{"type":23,"value":27310},{"type":23,"value":44573},{"type":17,"tag":6121,"props":203874,"children":203876},{"className":203875},[],[203877],{"type":23,"value":27047},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203880,"children":203882},{"className":203881},[],[203883],{"type":23,"value":27067},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203886,"children":203888},{"className":203887},[],[203889],{"type":23,"value":27052},{"type":23,"value":12034},{"type":17,"tag":84,"props":203892,"children":203893},{},[203894,203899,203900],{"type":17,"tag":6121,"props":203895,"children":203897},{"className":203896},[],[203898],{"type":23,"value":62346},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203901,"children":203903},{"className":203902},[],[203904],{"type":23,"value":24679},{"type":17,"tag":84,"props":203906,"children":203907},{},[203908],{"type":17,"tag":6121,"props":203909,"children":203911},{"className":203910},[],[203912],{"type":23,"value":203913},"document_ids[]",{"type":17,"tag":84,"props":203915,"children":203916},{},[203917],{"type":17,"tag":6121,"props":203918,"children":203920},{"className":203919},[],[203921],{"type":23,"value":33446},{"type":17,"tag":29,"props":203923,"children":203924},{},[203925,203927,203931],{"type":23,"value":203926},"Activities explain ",{"type":17,"tag":33,"props":203928,"children":203929},{},[203930],{"type":23,"value":93946},{"type":23,"value":203932}," without implying state transitions.",{"type":17,"tag":239,"props":203934,"children":203936},{"id":203935},"scorecard-atsscorecard",[203937,203939,203945],{"type":23,"value":203938},"Scorecard (",{"type":17,"tag":6121,"props":203940,"children":203942},{"className":203941},[],[203943],{"type":23,"value":203944},"AtsScorecard",{"type":23,"value":12034},{"type":17,"tag":29,"props":203947,"children":203948},{},[203949],{"type":23,"value":203950},"Structured feedback.",{"type":17,"tag":29,"props":203952,"children":203953},{},[203954],{"type":23,"value":111468},{"type":17,"tag":80,"props":203956,"children":203957},{},[203958,203972,203981,203990,203998],{"type":17,"tag":84,"props":203959,"children":203960},{},[203961,203966,203967],{"type":17,"tag":6121,"props":203962,"children":203964},{"className":203963},[],[203965],{"type":23,"value":117452},{"type":23,"value":11826},{"type":17,"tag":6121,"props":203968,"children":203970},{"className":203969},[],[203971],{"type":23,"value":203863},{"type":17,"tag":84,"props":203973,"children":203974},{},[203975],{"type":17,"tag":6121,"props":203976,"children":203978},{"className":203977},[],[203979],{"type":23,"value":203980},"interviewer_id",{"type":17,"tag":84,"props":203982,"children":203983},{},[203984],{"type":17,"tag":6121,"props":203985,"children":203987},{"className":203986},[],[203988],{"type":23,"value":203989},"recommendation",{"type":17,"tag":84,"props":203991,"children":203992},{},[203993],{"type":17,"tag":6121,"props":203994,"children":203996},{"className":203995},[],[203997],{"type":23,"value":72824},{"type":17,"tag":84,"props":203999,"children":204000},{},[204001],{"type":17,"tag":6121,"props":204002,"children":204004},{"className":204003},[],[204005],{"type":23,"value":135273},{"type":17,"tag":29,"props":204007,"children":204008},{},[204009],{"type":23,"value":204010},"Scorecards are critical for internal 'awaiting feedback' logic and post-interview state.",{"type":17,"tag":239,"props":204012,"children":204014},{"id":204013},"document-atsdocument",[204015,204017,204022],{"type":23,"value":204016},"Document (",{"type":17,"tag":6121,"props":204018,"children":204020},{"className":204019},[],[204021],{"type":23,"value":156097},{"type":23,"value":12034},{"type":17,"tag":29,"props":204024,"children":204025},{},[204026],{"type":23,"value":204027},"Artifacts exchanged during the journey.",{"type":17,"tag":29,"props":204029,"children":204030},{},[204031],{"type":23,"value":111468},{"type":17,"tag":80,"props":204033,"children":204034},{},[204035,204064,204072,204082],{"type":17,"tag":84,"props":204036,"children":204037},{},[204038,204043,204044,204049,204050,204056,204057,204063],{"type":17,"tag":6121,"props":204039,"children":204041},{"className":204040},[],[204042],{"type":23,"value":27310},{"type":23,"value":44573},{"type":17,"tag":6121,"props":204045,"children":204047},{"className":204046},[],[204048],{"type":23,"value":156571},{"type":23,"value":11826},{"type":17,"tag":6121,"props":204051,"children":204053},{"className":204052},[],[204054],{"type":23,"value":204055},"OFFER_LETTER",{"type":23,"value":11826},{"type":17,"tag":6121,"props":204058,"children":204060},{"className":204059},[],[204061],{"type":23,"value":204062},"TAKE_HOME_TEST",{"type":23,"value":149980},{"type":17,"tag":84,"props":204065,"children":204066},{},[204067],{"type":17,"tag":6121,"props":204068,"children":204070},{"className":204069},[],[204071],{"type":23,"value":202723},{"type":17,"tag":84,"props":204073,"children":204074},{},[204075,204080],{"type":17,"tag":6121,"props":204076,"children":204078},{"className":204077},[],[204079],{"type":23,"value":134916},{"type":23,"value":204081}," (short-lived)",{"type":17,"tag":84,"props":204083,"children":204084},{},[204085,204090,204091,204096,204097],{"type":17,"tag":6121,"props":204086,"children":204088},{"className":204087},[],[204089],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":204092,"children":204094},{"className":204093},[],[204095],{"type":23,"value":117452},{"type":23,"value":11826},{"type":17,"tag":6121,"props":204098,"children":204100},{"className":204099},[],[204101],{"type":23,"value":117309},{"type":17,"tag":29,"props":204103,"children":204104},{},[204105],{"type":23,"value":204106},"Documents power candidate-facing portals and offer workflows.",{"type":17,"tag":239,"props":204108,"children":204110},{"id":204109},"job-atsjob",[204111,204113,204118],{"type":23,"value":204112},"Job (",{"type":17,"tag":6121,"props":204114,"children":204116},{"className":204115},[],[204117],{"type":23,"value":75743},{"type":23,"value":12034},{"type":17,"tag":29,"props":204120,"children":204121},{},[204122],{"type":23,"value":204123},"Context for the application.",{"type":17,"tag":29,"props":204125,"children":204126},{},[204127],{"type":23,"value":111468},{"type":17,"tag":80,"props":204129,"children":204130},{},[204131,204139,204160,204174],{"type":17,"tag":84,"props":204132,"children":204133},{},[204134],{"type":17,"tag":6121,"props":204135,"children":204137},{"className":204136},[],[204138],{"type":23,"value":18781},{"type":17,"tag":84,"props":204140,"children":204141},{},[204142,204147,204148,204153,204154,204159],{"type":17,"tag":6121,"props":204143,"children":204145},{"className":204144},[],[204146],{"type":23,"value":19949},{"type":23,"value":44573},{"type":17,"tag":6121,"props":204149,"children":204151},{"className":204150},[],[204152],{"type":23,"value":150031},{"type":23,"value":11826},{"type":17,"tag":6121,"props":204155,"children":204157},{"className":204156},[],[204158],{"type":23,"value":183711},{"type":23,"value":12034},{"type":17,"tag":84,"props":204161,"children":204162},{},[204163,204168,204169],{"type":17,"tag":6121,"props":204164,"children":204166},{"className":204165},[],[204167],{"type":23,"value":201198},{"type":23,"value":11826},{"type":17,"tag":6121,"props":204170,"children":204172},{"className":204171},[],[204173],{"type":23,"value":201216},{"type":17,"tag":84,"props":204175,"children":204176},{},[204177],{"type":17,"tag":6121,"props":204178,"children":204180},{"className":204179},[],[204181],{"type":23,"value":201207},{"type":17,"tag":29,"props":204183,"children":204184},{},[204185,204187,204192],{"type":23,"value":204186},"Jobs explain ",{"type":17,"tag":33,"props":204188,"children":204189},{},[204190],{"type":23,"value":204191},"where",{"type":23,"value":204193}," the candidate is in the organization's hiring process.",{"type":17,"tag":68,"props":204195,"children":204197},{"id":204196},"step-1-fetch-applications-for-a-candidate",[204198],{"type":23,"value":204199},"Step 1: Fetch applications for a candidate",{"type":17,"tag":29,"props":204201,"children":204202},{},[204203],{"type":23,"value":204204},"The journey is application-first.",{"type":17,"tag":6893,"props":204206,"children":204209},{"className":204207,"code":204208,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function listCandidateApplications(connectionId: string, candidateId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.ats.listAtsApplications({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      candidate_id: candidateId,\n      fields: '',\n      raw: '',\n    });\n\n    if (!page || page.length === 0) break;\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[204210],{"type":17,"tag":6121,"props":204211,"children":204212},{"__ignoreMap":7},[204213],{"type":23,"value":204208},{"type":17,"tag":29,"props":204215,"children":204216},{},[204217],{"type":23,"value":204218},"If the candidate is already known in your system, you do not need to list candidates at all.",{"type":17,"tag":68,"props":204220,"children":204222},{"id":204221},"step-2-determine-the-current-stage",[204223],{"type":23,"value":204224},"Step 2: Determine the current stage",{"type":17,"tag":29,"props":204226,"children":204227},{},[204228],{"type":23,"value":204229},"Use the normalized status for logic, and the original status for display if needed.",{"type":17,"tag":6893,"props":204231,"children":204234},{"className":204232,"code":204233,"language":18718,"meta":7},[18716],"function currentStage(app: any) {\n  return app.status;\n}\n\nfunction displayStage(app: any) {\n  return app.original_status ?? app.status;\n}\n",[204235],{"type":17,"tag":6121,"props":204236,"children":204237},{"__ignoreMap":7},[204238],{"type":23,"value":204233},{"type":17,"tag":29,"props":204240,"children":204241},{},[204242],{"type":23,"value":204243},"This avoids hardcoding stage names or vendor logic.",{"type":17,"tag":68,"props":204245,"children":204247},{"id":204246},"step-3-build-a-defensible-milestone-timeline",[204248],{"type":23,"value":204249},"Step 3: Build a defensible milestone timeline",{"type":17,"tag":29,"props":204251,"children":204252},{},[204253],{"type":23,"value":204254},"Only use timestamps explicitly recorded by the ATS.",{"type":17,"tag":6893,"props":204256,"children":204259},{"className":204257,"code":204258,"language":18718,"meta":7},[18716],"function applicationMilestones(app: any) {\n  const milestones = [];\n\n  if (app.applied_at) milestones.push({ type: 'APPLIED', at: app.applied_at });\n\n  if (Array.isArray(app.offers)) {\n    for (const offer of app.offers) {\n      if (offer.sent_at) milestones.push({ type: 'OFFER_SENT', at: offer.sent_at });\n      if (offer.accepted_at) milestones.push({ type: 'OFFER_ACCEPTED', at: offer.accepted_at });\n      if (offer.rejected_at) milestones.push({ type: 'OFFER_REJECTED', at: offer.rejected_at });\n      if (offer.start_at) milestones.push({ type: 'START_DATE', at: offer.start_at });\n    }\n  }\n\n  if (app.rejected_at) {\n    milestones.push({\n      type: 'REJECTED',\n      at: app.rejected_at,\n      reason: app.rejected_reason,\n    });\n  }\n\n  if (app.hired_at) milestones.push({ type: 'HIRED', at: app.hired_at });\n\n  return milestones.sort((a, b) => new Date(a.at).getTime() - new Date(b.at).getTime());\n}\n",[204260],{"type":17,"tag":6121,"props":204261,"children":204262},{"__ignoreMap":7},[204263],{"type":23,"value":204258},{"type":17,"tag":29,"props":204265,"children":204266},{},[204267],{"type":23,"value":204268},"This produces a timeline you can defend under audit.",{"type":17,"tag":68,"props":204270,"children":204272},{"id":204271},"step-4-attach-interviews",[204273],{"type":23,"value":204274},"Step 4: Attach interviews",{"type":17,"tag":6893,"props":204276,"children":204279},{"className":204277,"code":204278,"language":18718,"meta":7},[18716],"async function listApplicationInterviews(connectionId: string, applicationId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.ats.listAtsInterviews({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      application_id: applicationId,\n      fields: '',\n      raw: '',\n    });\n\n    if (!page || page.length === 0) break;\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[204280],{"type":17,"tag":6121,"props":204281,"children":204282},{"__ignoreMap":7},[204283],{"type":23,"value":204278},{"type":17,"tag":29,"props":204285,"children":204286},{},[204287],{"type":23,"value":204288},"Interviews add scheduled, real-world events to the journey.",{"type":17,"tag":68,"props":204290,"children":204292},{"id":204291},"step-5-attach-scorecards",[204293],{"type":23,"value":204294},"Step 5: Attach scorecards",{"type":17,"tag":6893,"props":204296,"children":204299},{"className":204297,"code":204298,"language":18718,"meta":7},[18716],"async function listApplicationScorecards(connectionId: string, applicationId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.ats.listAtsScorecards({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      application_id: applicationId,\n      fields: '',\n      raw: '',\n    });\n\n    if (!page || page.length === 0) break;\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[204300],{"type":17,"tag":6121,"props":204301,"children":204302},{"__ignoreMap":7},[204303],{"type":23,"value":204298},{"type":17,"tag":29,"props":204305,"children":204306},{},[204307],{"type":23,"value":204308},"Scorecards explain post-interview states without guessing.",{"type":17,"tag":68,"props":204310,"children":204312},{"id":204311},"step-6-attach-activities",[204313],{"type":23,"value":204314},"Step 6: Attach activities",{"type":17,"tag":6893,"props":204316,"children":204319},{"className":204317,"code":204318,"language":18718,"meta":7},[18716],"async function listApplicationActivities(connectionId: string, applicationId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.ats.listAtsActivities({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      application_id: applicationId,\n      fields: '',\n      raw: '',\n    });\n\n    if (!page || page.length === 0) break;\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[204320],{"type":17,"tag":6121,"props":204321,"children":204322},{"__ignoreMap":7},[204323],{"type":23,"value":204318},{"type":17,"tag":29,"props":204325,"children":204326},{},[204327],{"type":23,"value":204328},"Activities provide context, not state.",{"type":17,"tag":68,"props":204330,"children":204332},{"id":204331},"step-7-attach-documents",[204333],{"type":23,"value":204334},"Step 7: Attach documents",{"type":17,"tag":6893,"props":204336,"children":204339},{"className":204337,"code":204338,"language":18718,"meta":7},[18716],"async function listApplicationDocuments(connectionId: string, applicationId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.ats.listAtsDocuments({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      application_id: applicationId,\n      fields: '',\n      raw: '',\n    });\n\n    if (!page || page.length === 0) break;\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[204340],{"type":17,"tag":6121,"props":204341,"children":204342},{"__ignoreMap":7},[204343],{"type":23,"value":204338},{"type":17,"tag":29,"props":204345,"children":204346},{},[204347],{"type":23,"value":204348},"Document URLs are short-lived and should be fetched just-in-time.",{"type":17,"tag":68,"props":204350,"children":204352},{"id":204351},"step-8-keep-journeys-current",[204353],{"type":23,"value":204354},"Step 8: Keep journeys current",{"type":17,"tag":29,"props":204356,"children":204357},{},[204358,204360,204365],{"type":23,"value":204359},"All ATS list endpoints support ",{"type":17,"tag":6121,"props":204361,"children":204363},{"className":204362},[],[204364],{"type":23,"value":26291},{"type":23,"value":204366},", enabling incremental refresh.",{"type":17,"tag":29,"props":204368,"children":204369},{},[204370],{"type":23,"value":204371},"Typical pattern:",{"type":17,"tag":6154,"props":204373,"children":204374},{},[204375,204387,204397],{"type":17,"tag":84,"props":204376,"children":204377},{},[204378,204380,204385],{"type":23,"value":204379},"Store the last processed ",{"type":17,"tag":6121,"props":204381,"children":204383},{"className":204382},[],[204384],{"type":23,"value":25337},{"type":23,"value":204386}," per object",{"type":17,"tag":84,"props":204388,"children":204389},{},[204390,204392],{"type":23,"value":204391},"Re-fetch with ",{"type":17,"tag":6121,"props":204393,"children":204395},{"className":204394},[],[204396],{"type":23,"value":26291},{"type":17,"tag":84,"props":204398,"children":204399},{},[204400],{"type":23,"value":204401},"Recompute only impacted applications",{"type":17,"tag":29,"props":204403,"children":204404},{},[204405,204407,204414],{"type":23,"value":204406},"For near-real-time updates, Unified supports ",{"type":17,"tag":48,"props":204408,"children":204409},{},[204410],{"type":17,"tag":133,"props":204411,"children":204412},{"href":9007},[204413],{"type":23,"value":46572},{"type":23,"value":204415}," for ATS objects. Webhooks:",{"type":17,"tag":80,"props":204417,"children":204418},{},[204419,204424,204429,204434,204439],{"type":17,"tag":84,"props":204420,"children":204421},{},[204422],{"type":23,"value":204423},"Deliver created and updated records",{"type":17,"tag":84,"props":204425,"children":204426},{},[204427],{"type":23,"value":204428},"Can be filtered using list-endpoint parameters",{"type":17,"tag":84,"props":204430,"children":204431},{},[204432],{"type":23,"value":204433},"Are scoped per integration and object",{"type":17,"tag":84,"props":204435,"children":204436},{},[204437],{"type":23,"value":204438},"Use exact-match filters",{"type":17,"tag":84,"props":204440,"children":204441},{},[204442],{"type":23,"value":204443},"Are not available for native webhooks",{"type":17,"tag":29,"props":204445,"children":204446},{},[204447],{"type":23,"value":204448},"Webhook filter keys vary by integration and must be derived from each provider's Feature-Support 'List Options'.",{"type":17,"tag":68,"props":204450,"children":204452},{"id":204451},"what-unified-does-not-infer",[204453],{"type":23,"value":204454},"What Unified does not infer",{"type":17,"tag":29,"props":204456,"children":204457},{},[204458],{"type":23,"value":204459},"Unified intentionally does not:",{"type":17,"tag":80,"props":204461,"children":204462},{},[204463,204468,204473,204478],{"type":17,"tag":84,"props":204464,"children":204465},{},[204466],{"type":23,"value":204467},"Reconstruct stage history",{"type":17,"tag":84,"props":204469,"children":204470},{},[204471],{"type":23,"value":204472},"Guess transition timestamps",{"type":17,"tag":84,"props":204474,"children":204475},{},[204476],{"type":23,"value":204477},"Assume activities imply state changes",{"type":17,"tag":84,"props":204479,"children":204480},{},[204481],{"type":23,"value":204482},"Enforce a single pipeline model",{"type":17,"tag":29,"props":204484,"children":204485},{},[204486],{"type":23,"value":204487},"It exposes what the ATS records — nothing more.",{"type":17,"tag":68,"props":204489,"children":204490},{"id":132938},[204491],{"type":23,"value":136162},{"type":17,"tag":29,"props":204493,"children":204494},{},[204495],{"type":23,"value":204496},"Candidate journey tracking breaks when 'stage' is treated as the journey.",{"type":17,"tag":29,"props":204498,"children":204499},{},[204500],{"type":23,"value":204501},"Stage is a label. The journey is what actually happened: applications submitted, interviews scheduled, feedback recorded, documents exchanged, decisions made — all at timestamps you can explain.",{"type":17,"tag":29,"props":204503,"children":204504},{},[204505],{"type":23,"value":204506},"Unified's ATS API gives you the primitives to model that reality across ATSs without vendor-specific logic: normalized application state, explicit lifecycle timestamps, and linked interviews, activities, scorecards, and documents.",{"type":17,"tag":29,"props":204508,"children":204509},{},[204510],{"type":23,"value":204511},"From there, the journey your product shows is a product decision — not an integration gamble.",{"type":17,"tag":29,"props":204513,"children":204514},{},[204515,204516],{"type":23,"value":1609},{"type":17,"tag":133,"props":204517,"children":204518},{"href":178425},[204519],{"type":17,"tag":48,"props":204520,"children":204521},{},[204522],{"type":23,"value":1616},{"type":17,"tag":29,"props":204524,"children":204525},{},[204526,204527],{"type":23,"value":1609},{"type":17,"tag":133,"props":204528,"children":204529},{"href":178425},[204530],{"type":17,"tag":48,"props":204531,"children":204532},{},[204533],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":204535},[204536,204537,204538,204554,204555,204556,204557,204558,204559,204560,204561,204562,204563],{"id":203389,"depth":1629,"text":203392},{"id":203466,"depth":1629,"text":203469},{"id":203533,"depth":1629,"text":203536,"children":204539},[204540,204542,204544,204546,204548,204550,204552],{"id":203539,"depth":1635,"text":204541},"Application (AtsApplication)",{"id":203651,"depth":1635,"text":204543},"Application Status (AtsStatus)",{"id":203704,"depth":1635,"text":204545},"Interview (AtsInterview)",{"id":203814,"depth":1635,"text":204547},"Activity (AtsActivity)",{"id":203935,"depth":1635,"text":204549},"Scorecard (AtsScorecard)",{"id":204013,"depth":1635,"text":204551},"Document (AtsDocument)",{"id":204109,"depth":1635,"text":204553},"Job (AtsJob)",{"id":204196,"depth":1629,"text":204199},{"id":204221,"depth":1629,"text":204224},{"id":204246,"depth":1629,"text":204249},{"id":204271,"depth":1629,"text":204274},{"id":204291,"depth":1629,"text":204294},{"id":204311,"depth":1629,"text":204314},{"id":204331,"depth":1629,"text":204334},{"id":204351,"depth":1629,"text":204354},{"id":204451,"depth":1629,"text":204454},{"id":132938,"depth":1629,"text":136162},"content:blog:how_to_track_the_candidate_journey.md","blog/how_to_track_the_candidate_journey.md","blog/how_to_track_the_candidate_journey",{"_path":204568,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":204569,"description":204570,"img":204571,"date":200786,"tag":12,"body":204572,"_type":1677,"_id":206380,"_source":1679,"_file":206381,"_stem":206382,"_extension":1682},"/blog/how_to_train_ai_on_ats_data_with_unified_ats_api","How to Train AI on ATS Data with Unified's ATS API","Training AI on ATS data is rarely blocked by model choice.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_train_ai_on_ats_data_with_unified_ats_api-icon.png",{"type":14,"children":204573,"toc":206335},[204574,204579,204582,204589,204593,204598,204603,204626,204636,204641,204647,204652,204656,204679,204683,204706,204712,204718,204777,204783,204812,204818,204823,204852,204857,204863,204874,204879,204962,204974,204985,204989,205070,205081,205092,205096,205188,205200,205204,205245,205256,205260,205341,205345,205379,205385,205390,205398,205404,205413,205419,205428,205434,205443,205449,205454,205484,205489,205498,205503,205509,205515,205520,205602,205614,205626,205632,205637,205643,205680,205685,205694,205699,205729,205741,205747,205752,205786,205791,205848,205854,205859,205864,205873,205877,205915,205920,205926,205931,205972,205977,205995,206000,206006,206012,206017,206039,206044,206057,206063,206068,206097,206103,206107,206118,206123,206167,206172,206181,206186,206208,206213,206219,206224,206252,206257,206275,206280,206284,206289,206294,206312,206317,206326],{"type":17,"tag":18,"props":204575,"children":204577},{"id":204576},"how-to-train-ai-on-ats-data-with-unifieds-ats-api",[204578],{"type":23,"value":204569},{"type":17,"tag":25,"props":204580,"children":204581},{},[],{"type":17,"tag":29,"props":204583,"children":204584},{},[204585],{"type":17,"tag":33,"props":204586,"children":204587},{},[204588],{"type":23,"value":199463},{"type":17,"tag":29,"props":204590,"children":204591},{},[204592],{"type":23,"value":204570},{"type":17,"tag":29,"props":204594,"children":204595},{},[204596],{"type":23,"value":204597},"It's blocked by data reality.",{"type":17,"tag":29,"props":204599,"children":204600},{},[204601],{"type":23,"value":204602},"Across ATS systems, the same concepts are represented inconsistently:",{"type":17,"tag":80,"props":204604,"children":204605},{},[204606,204611,204616,204621],{"type":17,"tag":84,"props":204607,"children":204608},{},[204609],{"type":23,"value":204610},"Resumes may be downloadable in one system and unavailable in another.",{"type":17,"tag":84,"props":204612,"children":204613},{},[204614],{"type":23,"value":204615},"Skills might exist in a schema but be empty for most providers.",{"type":17,"tag":84,"props":204617,"children":204618},{},[204619],{"type":23,"value":204620},"Outcome fields (hire, reject, offer acceptance) are often missing or partially recorded.",{"type":17,"tag":84,"props":204622,"children":204623},{},[204624],{"type":23,"value":204625},"Stage progression history is usually not available as an event timeline.",{"type":17,"tag":29,"props":204627,"children":204628},{},[204629,204630,204634],{"type":23,"value":25244},{"type":17,"tag":133,"props":204631,"children":204632},{"href":55696},[204633],{"type":23,"value":55699},{"type":23,"value":204635}," gives you normalized objects and consistent retrieval semantics. It does not invent missing fields, reconstruct stage history, or guarantee that any single provider exposes complete outcomes.",{"type":17,"tag":29,"props":204637,"children":204638},{},[204639],{"type":23,"value":204640},"This guide shows how to train AI on ATS data using Unified's ATS API in a way that is defensible: build a training dataset from what's observable, handle provider variability explicitly, and keep the dataset fresh over time.",{"type":17,"tag":68,"props":204642,"children":204644},{"id":204643},"what-train-ai-on-ats-data-means-here",[204645],{"type":23,"value":204646},"What 'train AI on ATS data' means here",{"type":17,"tag":29,"props":204648,"children":204649},{},[204650],{"type":23,"value":204651},"This article focuses on building an AI-ready dataset and retraining loop using ATS primitives.",{"type":17,"tag":29,"props":204653,"children":204654},{},[204655],{"type":23,"value":203408},{"type":17,"tag":80,"props":204657,"children":204658},{},[204659,204664,204669,204674],{"type":17,"tag":84,"props":204660,"children":204661},{},[204662],{"type":23,"value":204663},"Build a dataset from normalized ATS objects (jobs, candidates, applications, interviews, documents)",{"type":17,"tag":84,"props":204665,"children":204666},{},[204667],{"type":23,"value":204668},"Extract structured and unstructured features safely",{"type":17,"tag":84,"props":204670,"children":204671},{},[204672],{"type":23,"value":204673},"Construct labels when the provider exposes them",{"type":17,"tag":84,"props":204675,"children":204676},{},[204677],{"type":23,"value":204678},"Implement incremental refresh for continuous training",{"type":17,"tag":29,"props":204680,"children":204681},{},[204682],{"type":23,"value":203440},{"type":17,"tag":80,"props":204684,"children":204685},{},[204686,204691,204696,204701],{"type":17,"tag":84,"props":204687,"children":204688},{},[204689],{"type":23,"value":204690},"Assume resumes are always retrievable",{"type":17,"tag":84,"props":204692,"children":204693},{},[204694],{"type":23,"value":204695},"Assume skills are always populated",{"type":17,"tag":84,"props":204697,"children":204698},{},[204699],{"type":23,"value":204700},"Assume hires/rejections/offers are universally available",{"type":17,"tag":84,"props":204702,"children":204703},{},[204704],{"type":23,"value":204705},"Claim stage transition history exists as a timeline",{"type":17,"tag":68,"props":204707,"children":204709},{"id":204708},"the-mental-model-ai-training-datasets-are-built-from-three-layers",[204710],{"type":23,"value":204711},"The mental model: AI training datasets are built from three layers",{"type":17,"tag":239,"props":204713,"children":204715},{"id":204714},"_1-inputs-features",[204716],{"type":23,"value":204717},"1) Inputs (features)",{"type":17,"tag":80,"props":204719,"children":204720},{},[204721,204732,204743,204755,204766],{"type":17,"tag":84,"props":204722,"children":204723},{},[204724,204726,204731],{"type":23,"value":204725},"Job requirements and context (",{"type":17,"tag":6121,"props":204727,"children":204729},{"className":204728},[],[204730],{"type":23,"value":75743},{"type":23,"value":12034},{"type":17,"tag":84,"props":204733,"children":204734},{},[204735,204737,204742],{"type":23,"value":204736},"Candidate qualifications (",{"type":17,"tag":6121,"props":204738,"children":204740},{"className":204739},[],[204741],{"type":23,"value":133291},{"type":23,"value":12034},{"type":17,"tag":84,"props":204744,"children":204745},{},[204746,204748,204754],{"type":23,"value":204747},"Application context and answers (",{"type":17,"tag":6121,"props":204749,"children":204751},{"className":204750},[],[204752],{"type":23,"value":204753},"AtsApplication.answers",{"type":23,"value":12034},{"type":17,"tag":84,"props":204756,"children":204757},{},[204758,204760,204765],{"type":23,"value":204759},"Interview cadence and status (",{"type":17,"tag":6121,"props":204761,"children":204763},{"className":204762},[],[204764],{"type":23,"value":132094},{"type":23,"value":12034},{"type":17,"tag":84,"props":204767,"children":204768},{},[204769,204771,204776],{"type":23,"value":204770},"Resume text, when available (",{"type":17,"tag":6121,"props":204772,"children":204774},{"className":204773},[],[204775],{"type":23,"value":156097},{"type":23,"value":12034},{"type":17,"tag":239,"props":204778,"children":204780},{"id":204779},"_2-relationships-joins",[204781],{"type":23,"value":204782},"2) Relationships (joins)",{"type":17,"tag":80,"props":204784,"children":204785},{},[204786],{"type":17,"tag":84,"props":204787,"children":204788},{},[204789,204791],{"type":23,"value":204790},"Candidates and jobs are linked through applications:\n",{"type":17,"tag":80,"props":204792,"children":204793},{},[204794,204803],{"type":17,"tag":84,"props":204795,"children":204796},{},[204797],{"type":17,"tag":6121,"props":204798,"children":204800},{"className":204799},[],[204801],{"type":23,"value":204802},"AtsApplication.candidate_id",{"type":17,"tag":84,"props":204804,"children":204805},{},[204806],{"type":17,"tag":6121,"props":204807,"children":204809},{"className":204808},[],[204810],{"type":23,"value":204811},"AtsApplication.job_id",{"type":17,"tag":239,"props":204813,"children":204815},{"id":204814},"_3-outcomes-labels",[204816],{"type":23,"value":204817},"3) Outcomes (labels)",{"type":17,"tag":29,"props":204819,"children":204820},{},[204821],{"type":23,"value":204822},"When available:",{"type":17,"tag":80,"props":204824,"children":204825},{},[204826,204834,204842],{"type":17,"tag":84,"props":204827,"children":204828},{},[204829],{"type":17,"tag":6121,"props":204830,"children":204832},{"className":204831},[],[204833],{"type":23,"value":132233},{"type":17,"tag":84,"props":204835,"children":204836},{},[204837],{"type":17,"tag":6121,"props":204838,"children":204840},{"className":204839},[],[204841],{"type":23,"value":132224},{"type":17,"tag":84,"props":204843,"children":204844},{},[204845,204850],{"type":17,"tag":6121,"props":204846,"children":204848},{"className":204847},[],[204849],{"type":23,"value":135872},{"type":23,"value":204851}," (nested inside application, and provider-dependent)",{"type":17,"tag":29,"props":204853,"children":204854},{},[204855],{"type":23,"value":204856},"If these are missing for a provider, you cannot pretend they exist. Train on what you have or use alternative labels (for example, 'advanced to interview stage' based on current status, if your product accepts that limitation).",{"type":17,"tag":68,"props":204858,"children":204860},{"id":204859},"objects-youll-use",[204861],{"type":23,"value":204862},"Objects you'll use",{"type":17,"tag":239,"props":204864,"children":204866},{"id":204865},"jobs-atsjob",[204867,204868,204873],{"type":23,"value":156019},{"type":17,"tag":6121,"props":204869,"children":204871},{"className":204870},[],[204872],{"type":23,"value":75743},{"type":23,"value":12034},{"type":17,"tag":29,"props":204875,"children":204876},{},[204877],{"type":23,"value":204878},"Useful fields:",{"type":17,"tag":80,"props":204880,"children":204881},{},[204882,204890,204898,204906,204914,204922,204930,204938,204946,204954],{"type":17,"tag":84,"props":204883,"children":204884},{},[204885],{"type":17,"tag":6121,"props":204886,"children":204888},{"className":204887},[],[204889],{"type":23,"value":18766},{"type":17,"tag":84,"props":204891,"children":204892},{},[204893],{"type":17,"tag":6121,"props":204894,"children":204896},{"className":204895},[],[204897],{"type":23,"value":18781},{"type":17,"tag":84,"props":204899,"children":204900},{},[204901],{"type":17,"tag":6121,"props":204902,"children":204904},{"className":204903},[],[204905],{"type":23,"value":24679},{"type":17,"tag":84,"props":204907,"children":204908},{},[204909],{"type":17,"tag":6121,"props":204910,"children":204912},{"className":204911},[],[204913],{"type":23,"value":19949},{"type":17,"tag":84,"props":204915,"children":204916},{},[204917],{"type":17,"tag":6121,"props":204918,"children":204920},{"className":204919},[],[204921],{"type":23,"value":135610},{"type":17,"tag":84,"props":204923,"children":204924},{},[204925],{"type":17,"tag":6121,"props":204926,"children":204928},{"className":204927},[],[204929],{"type":23,"value":135617},{"type":17,"tag":84,"props":204931,"children":204932},{},[204933],{"type":17,"tag":6121,"props":204934,"children":204936},{"className":204935},[],[204937],{"type":23,"value":75514},{"type":17,"tag":84,"props":204939,"children":204940},{},[204941],{"type":17,"tag":6121,"props":204942,"children":204944},{"className":204943},[],[204945],{"type":23,"value":75550},{"type":17,"tag":84,"props":204947,"children":204948},{},[204949],{"type":17,"tag":6121,"props":204950,"children":204952},{"className":204951},[],[204953],{"type":23,"value":135273},{"type":17,"tag":84,"props":204955,"children":204956},{},[204957],{"type":17,"tag":6121,"props":204958,"children":204960},{"className":204959},[],[204961],{"type":23,"value":133378},{"type":17,"tag":29,"props":204963,"children":204964},{},[204965,204967,204972],{"type":23,"value":204966},"Note: ",{"type":17,"tag":6121,"props":204968,"children":204970},{"className":204969},[],[204971],{"type":23,"value":135662},{"type":23,"value":204973}," exists in the normalized schema but is not reliably populated by most ATS integrations.",{"type":17,"tag":239,"props":204975,"children":204977},{"id":204976},"candidates-atscandidate",[204978,204979,204984],{"type":23,"value":156041},{"type":17,"tag":6121,"props":204980,"children":204982},{"className":204981},[],[204983],{"type":23,"value":133291},{"type":23,"value":12034},{"type":17,"tag":29,"props":204986,"children":204987},{},[204988],{"type":23,"value":204878},{"type":17,"tag":80,"props":204990,"children":204991},{},[204992,205000,205014,205022,205030,205038,205046,205054,205062],{"type":17,"tag":84,"props":204993,"children":204994},{},[204995],{"type":17,"tag":6121,"props":204996,"children":204998},{"className":204997},[],[204999],{"type":23,"value":18766},{"type":17,"tag":84,"props":205001,"children":205002},{},[205003,205008,205009],{"type":17,"tag":6121,"props":205004,"children":205006},{"className":205005},[],[205007],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":205010,"children":205012},{"className":205011},[],[205013],{"type":23,"value":62341},{"type":17,"tag":84,"props":205015,"children":205016},{},[205017],{"type":17,"tag":6121,"props":205018,"children":205020},{"className":205019},[],[205021],{"type":23,"value":62346},{"type":17,"tag":84,"props":205023,"children":205024},{},[205025],{"type":17,"tag":6121,"props":205026,"children":205028},{"className":205027},[],[205029],{"type":23,"value":62786},{"type":17,"tag":84,"props":205031,"children":205032},{},[205033],{"type":17,"tag":6121,"props":205034,"children":205036},{"className":205035},[],[205037],{"type":23,"value":156385},{"type":17,"tag":84,"props":205039,"children":205040},{},[205041],{"type":17,"tag":6121,"props":205042,"children":205044},{"className":205043},[],[205045],{"type":23,"value":156394},{"type":17,"tag":84,"props":205047,"children":205048},{},[205049],{"type":17,"tag":6121,"props":205050,"children":205052},{"className":205051},[],[205053],{"type":23,"value":133369},{"type":17,"tag":84,"props":205055,"children":205056},{},[205057],{"type":17,"tag":6121,"props":205058,"children":205060},{"className":205059},[],[205061],{"type":23,"value":133378},{"type":17,"tag":84,"props":205063,"children":205064},{},[205065],{"type":17,"tag":6121,"props":205066,"children":205068},{"className":205067},[],[205069],{"type":23,"value":133330},{"type":17,"tag":29,"props":205071,"children":205072},{},[205073,205074,205079],{"type":23,"value":204966},{"type":17,"tag":6121,"props":205075,"children":205077},{"className":205076},[],[205078],{"type":23,"value":135662},{"type":23,"value":205080}," exists in the normalized schema but is only exposed by a small subset of integrations.",{"type":17,"tag":239,"props":205082,"children":205084},{"id":205083},"applications-atsapplication",[205085,205086,205091],{"type":23,"value":156063},{"type":17,"tag":6121,"props":205087,"children":205089},{"className":205088},[],[205090],{"type":23,"value":132178},{"type":23,"value":12034},{"type":17,"tag":29,"props":205093,"children":205094},{},[205095],{"type":23,"value":204878},{"type":17,"tag":80,"props":205097,"children":205098},{},[205099,205107,205115,205123,205133,205143,205151,205159,205169,205178],{"type":17,"tag":84,"props":205100,"children":205101},{},[205102],{"type":17,"tag":6121,"props":205103,"children":205105},{"className":205104},[],[205106],{"type":23,"value":18766},{"type":17,"tag":84,"props":205108,"children":205109},{},[205110],{"type":17,"tag":6121,"props":205111,"children":205113},{"className":205112},[],[205114],{"type":23,"value":117296},{"type":17,"tag":84,"props":205116,"children":205117},{},[205118],{"type":17,"tag":6121,"props":205119,"children":205121},{"className":205120},[],[205122],{"type":23,"value":117309},{"type":17,"tag":84,"props":205124,"children":205125},{},[205126,205131],{"type":17,"tag":6121,"props":205127,"children":205129},{"className":205128},[],[205130],{"type":23,"value":19949},{"type":23,"value":205132}," (current normalized stage)",{"type":17,"tag":84,"props":205134,"children":205135},{},[205136,205141],{"type":17,"tag":6121,"props":205137,"children":205139},{"className":205138},[],[205140],{"type":23,"value":117334},{"type":23,"value":205142}," (provider raw stage)",{"type":17,"tag":84,"props":205144,"children":205145},{},[205146],{"type":17,"tag":6121,"props":205147,"children":205149},{"className":205148},[],[205150],{"type":23,"value":117347},{"type":17,"tag":84,"props":205152,"children":205153},{},[205154],{"type":17,"tag":6121,"props":205155,"children":205157},{"className":205156},[],[205158],{"type":23,"value":134460},{"type":17,"tag":84,"props":205160,"children":205161},{},[205162,205167],{"type":17,"tag":6121,"props":205163,"children":205165},{"className":205164},[],[205166],{"type":23,"value":132224},{"type":23,"value":205168}," (provider-dependent)",{"type":17,"tag":84,"props":205170,"children":205171},{},[205172,205177],{"type":17,"tag":6121,"props":205173,"children":205175},{"className":205174},[],[205176],{"type":23,"value":132233},{"type":23,"value":205168},{"type":17,"tag":84,"props":205179,"children":205180},{},[205181,205186],{"type":17,"tag":6121,"props":205182,"children":205184},{"className":205183},[],[205185],{"type":23,"value":135872},{"type":23,"value":205187}," (provider-dependent, nested, slow when present)",{"type":17,"tag":239,"props":205189,"children":205191},{"id":205190},"interviews-atsinterview",[205192,205194,205199],{"type":23,"value":205193},"Interviews (",{"type":17,"tag":6121,"props":205195,"children":205197},{"className":205196},[],[205198],{"type":23,"value":132094},{"type":23,"value":12034},{"type":17,"tag":29,"props":205201,"children":205202},{},[205203],{"type":23,"value":204878},{"type":17,"tag":80,"props":205205,"children":205206},{},[205207,205215,205223,205237],{"type":17,"tag":84,"props":205208,"children":205209},{},[205210],{"type":17,"tag":6121,"props":205211,"children":205213},{"className":205212},[],[205214],{"type":23,"value":117452},{"type":17,"tag":84,"props":205216,"children":205217},{},[205218],{"type":17,"tag":6121,"props":205219,"children":205221},{"className":205220},[],[205222],{"type":23,"value":19949},{"type":17,"tag":84,"props":205224,"children":205225},{},[205226,205231,205232],{"type":17,"tag":6121,"props":205227,"children":205229},{"className":205228},[],[205230],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":205233,"children":205235},{"className":205234},[],[205236],{"type":23,"value":21060},{"type":17,"tag":84,"props":205238,"children":205239},{},[205240],{"type":17,"tag":6121,"props":205241,"children":205243},{"className":205242},[],[205244],{"type":23,"value":203798},{"type":17,"tag":239,"props":205246,"children":205248},{"id":205247},"documents-atsdocument",[205249,205250,205255],{"type":23,"value":156085},{"type":17,"tag":6121,"props":205251,"children":205253},{"className":205252},[],[205254],{"type":23,"value":156097},{"type":23,"value":12034},{"type":17,"tag":29,"props":205257,"children":205258},{},[205259],{"type":23,"value":204878},{"type":17,"tag":80,"props":205261,"children":205262},{},[205263,205271,205293,205301,205311,205321],{"type":17,"tag":84,"props":205264,"children":205265},{},[205266],{"type":17,"tag":6121,"props":205267,"children":205269},{"className":205268},[],[205270],{"type":23,"value":18766},{"type":17,"tag":84,"props":205272,"children":205273},{},[205274,205279,205280,205285,205286,205292],{"type":17,"tag":6121,"props":205275,"children":205277},{"className":205276},[],[205278],{"type":23,"value":27310},{"type":23,"value":44573},{"type":17,"tag":6121,"props":205281,"children":205283},{"className":205282},[],[205284],{"type":23,"value":156571},{"type":23,"value":11826},{"type":17,"tag":6121,"props":205287,"children":205289},{"className":205288},[],[205290],{"type":23,"value":205291},"COVER_LETTER",{"type":23,"value":149980},{"type":17,"tag":84,"props":205294,"children":205295},{},[205296],{"type":17,"tag":6121,"props":205297,"children":205299},{"className":205298},[],[205300],{"type":23,"value":202723},{"type":17,"tag":84,"props":205302,"children":205303},{},[205304,205309],{"type":17,"tag":6121,"props":205305,"children":205307},{"className":205306},[],[205308],{"type":23,"value":134916},{"type":23,"value":205310}," (short-lived when present)",{"type":17,"tag":84,"props":205312,"children":205313},{},[205314,205319],{"type":17,"tag":6121,"props":205315,"children":205317},{"className":205316},[],[205318],{"type":23,"value":135899},{"type":23,"value":205320}," (rarely returned on read; provider-dependent)",{"type":17,"tag":84,"props":205322,"children":205323},{},[205324,205329,205330,205335,205336],{"type":17,"tag":6121,"props":205325,"children":205327},{"className":205326},[],[205328],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":205331,"children":205333},{"className":205332},[],[205334],{"type":23,"value":117452},{"type":23,"value":11826},{"type":17,"tag":6121,"props":205337,"children":205339},{"className":205338},[],[205340],{"type":23,"value":117309},{"type":17,"tag":29,"props":205342,"children":205343},{},[205344],{"type":23,"value":194883},{"type":17,"tag":80,"props":205346,"children":205347},{},[205348,205358,205363,205368],{"type":17,"tag":84,"props":205349,"children":205350},{},[205351,205356],{"type":17,"tag":6121,"props":205352,"children":205354},{"className":205353},[],[205355],{"type":23,"value":134916},{"type":23,"value":205357}," is not returned by all providers.",{"type":17,"tag":84,"props":205359,"children":205360},{},[205361],{"type":23,"value":205362},"Some providers return document metadata only (no URL, no base64).",{"type":17,"tag":84,"props":205364,"children":205365},{},[205366],{"type":23,"value":205367},"Some providers do not support the document object at all.",{"type":17,"tag":84,"props":205369,"children":205370},{},[205371,205377],{"type":17,"tag":6121,"props":205372,"children":205374},{"className":205373},[],[205375],{"type":23,"value":205376},"type: RESUME",{"type":23,"value":205378}," exists but resume classification is not guaranteed to be consistent across providers.",{"type":17,"tag":68,"props":205380,"children":205382},{"id":205381},"step-1-build-your-base-dataset-from-jobs-candidates-and-applications",[205383],{"type":23,"value":205384},"Step 1: Build your base dataset from jobs, candidates, and applications",{"type":17,"tag":29,"props":205386,"children":205387},{},[205388],{"type":23,"value":205389},"A safe training dataset starts with a clean join table:",{"type":17,"tag":80,"props":205391,"children":205392},{},[205393],{"type":17,"tag":84,"props":205394,"children":205395},{},[205396],{"type":23,"value":205397},"candidate ↔ application ↔ job",{"type":17,"tag":239,"props":205399,"children":205401},{"id":205400},"fetch-open-jobs-or-all-jobs",[205402],{"type":23,"value":205403},"Fetch open jobs (or all jobs)",{"type":17,"tag":6893,"props":205405,"children":205408},{"className":205406,"code":205407,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function listOpenJobs(connectionId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.ats.listAtsJobs({\n      connectionId,\n      status: 'OPEN',\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: '',\n      raw: '',\n    });\n\n    if (!page || page.length === 0) break;\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[205409],{"type":17,"tag":6121,"props":205410,"children":205411},{"__ignoreMap":7},[205412],{"type":23,"value":205407},{"type":17,"tag":239,"props":205414,"children":205416},{"id":205415},"fetch-candidates",[205417],{"type":23,"value":205418},"Fetch candidates",{"type":17,"tag":6893,"props":205420,"children":205423},{"className":205421,"code":205422,"language":18718,"meta":7},[18716],"async function listCandidates(connectionId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.ats.listAtsCandidates({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: '',\n      raw: '',\n    });\n\n    if (!page || page.length === 0) break;\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[205424],{"type":17,"tag":6121,"props":205425,"children":205426},{"__ignoreMap":7},[205427],{"type":23,"value":205422},{"type":17,"tag":239,"props":205429,"children":205431},{"id":205430},"fetch-applications-join-layer",[205432],{"type":23,"value":205433},"Fetch applications (join layer)",{"type":17,"tag":6893,"props":205435,"children":205438},{"className":205436,"code":205437,"language":18718,"meta":7},[18716],"async function listApplications(connectionId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.ats.listAtsApplications({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: '',\n      raw: '',\n    });\n\n    if (!page || page.length === 0) break;\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[205439],{"type":17,"tag":6121,"props":205440,"children":205441},{"__ignoreMap":7},[205442],{"type":23,"value":205437},{"type":17,"tag":239,"props":205444,"children":205446},{"id":205445},"join-locally",[205447],{"type":23,"value":205448},"Join locally",{"type":17,"tag":29,"props":205450,"children":205451},{},[205452],{"type":23,"value":205453},"Store everything in your database and build:",{"type":17,"tag":80,"props":205455,"children":205456},{},[205457,205466,205475],{"type":17,"tag":84,"props":205458,"children":205459},{},[205460],{"type":17,"tag":6121,"props":205461,"children":205463},{"className":205462},[],[205464],{"type":23,"value":205465},"candidates_by_id",{"type":17,"tag":84,"props":205467,"children":205468},{},[205469],{"type":17,"tag":6121,"props":205470,"children":205472},{"className":205471},[],[205473],{"type":23,"value":205474},"jobs_by_id",{"type":17,"tag":84,"props":205476,"children":205477},{},[205478],{"type":17,"tag":6121,"props":205479,"children":205481},{"className":205480},[],[205482],{"type":23,"value":205483},"applications_by_id",{"type":17,"tag":29,"props":205485,"children":205486},{},[205487],{"type":23,"value":205488},"Then create training rows by joining each application:",{"type":17,"tag":6893,"props":205490,"children":205493},{"className":205491,"code":205492,"language":18718,"meta":7},[18716],"function buildTrainingRows(applications: any[], candidatesById: Map\u003Cstring, any>, jobsById: Map\u003Cstring, any>) {\n  const rows = [];\n\n  for (const app of applications) {\n    const candidate = app.candidate_id ? candidatesById.get(app.candidate_id) : null;\n    const job = app.job_id ? jobsById.get(app.job_id) : null;\n    if (!candidate || !job) continue;\n\n    rows.push({ application: app, candidate, job });\n  }\n\n  return rows;\n}\n",[205494],{"type":17,"tag":6121,"props":205495,"children":205496},{"__ignoreMap":7},[205497],{"type":23,"value":205492},{"type":17,"tag":29,"props":205499,"children":205500},{},[205501],{"type":23,"value":205502},"This gives you a stable foundation for feature engineering and labeling.",{"type":17,"tag":68,"props":205504,"children":205506},{"id":205505},"step-2-feature-engineering-without-relying-on-fields-that-arent-reliably-populated",[205507],{"type":23,"value":205508},"Step 2: Feature engineering without relying on fields that aren't reliably populated",{"type":17,"tag":239,"props":205510,"children":205512},{"id":205511},"use-structured-signals-that-are-broadly-available",[205513],{"type":23,"value":205514},"Use structured signals that are broadly available",{"type":17,"tag":29,"props":205516,"children":205517},{},[205518],{"type":23,"value":205519},"Good candidates (no pun intended):",{"type":17,"tag":80,"props":205521,"children":205522},{},[205523,205535,205547,205559,205578,205590],{"type":17,"tag":84,"props":205524,"children":205525},{},[205526,205528,205534],{"type":23,"value":205527},"Job description text (",{"type":17,"tag":6121,"props":205529,"children":205531},{"className":205530},[],[205532],{"type":23,"value":205533},"job.description",{"type":23,"value":12034},{"type":17,"tag":84,"props":205536,"children":205537},{},[205538,205540,205546],{"type":23,"value":205539},"Candidate experiences (",{"type":17,"tag":6121,"props":205541,"children":205543},{"className":205542},[],[205544],{"type":23,"value":205545},"candidate.experiences[]",{"type":23,"value":12034},{"type":17,"tag":84,"props":205548,"children":205549},{},[205550,205552,205558],{"type":23,"value":205551},"Candidate education (",{"type":17,"tag":6121,"props":205553,"children":205555},{"className":205554},[],[205556],{"type":23,"value":205557},"candidate.education[]",{"type":23,"value":12034},{"type":17,"tag":84,"props":205560,"children":205561},{},[205562,205564,205570,205571,205577],{"type":23,"value":205563},"Candidate title + company name (",{"type":17,"tag":6121,"props":205565,"children":205567},{"className":205566},[],[205568],{"type":23,"value":205569},"candidate.title",{"type":23,"value":11826},{"type":17,"tag":6121,"props":205572,"children":205574},{"className":205573},[],[205575],{"type":23,"value":205576},"candidate.company_name",{"type":23,"value":12034},{"type":17,"tag":84,"props":205579,"children":205580},{},[205581,205583,205589],{"type":23,"value":205582},"Application answers (",{"type":17,"tag":6121,"props":205584,"children":205586},{"className":205585},[],[205587],{"type":23,"value":205588},"application.answers[]",{"type":23,"value":12034},{"type":17,"tag":84,"props":205591,"children":205592},{},[205593,205595,205600],{"type":23,"value":205594},"Metadata (",{"type":17,"tag":6121,"props":205596,"children":205598},{"className":205597},[],[205599],{"type":23,"value":133378},{"type":23,"value":205601},") when your customers use it consistently",{"type":17,"tag":239,"props":205603,"children":205605},{"id":205604},"treat-skills-as-optional-enrichment",[205606,205607,205612],{"type":23,"value":156457},{"type":17,"tag":6121,"props":205608,"children":205610},{"className":205609},[],[205611],{"type":23,"value":135662},{"type":23,"value":205613}," as optional enrichment",{"type":17,"tag":29,"props":205615,"children":205616},{},[205617,205619,205624],{"type":23,"value":205618},"Even though ",{"type":17,"tag":6121,"props":205620,"children":205622},{"className":205621},[],[205623],{"type":23,"value":135662},{"type":23,"value":205625}," exists in the normalized schema for candidates and jobs, it is not universally returned. Only a small subset of integrations expose it. Do not build your model assuming it exists.",{"type":17,"tag":68,"props":205627,"children":205629},{"id":205628},"step-3-resume-ingestion-for-embeddings-only-when-the-provider-supports-it",[205630],{"type":23,"value":205631},"Step 3: Resume ingestion for embeddings (only when the provider supports it)",{"type":17,"tag":29,"props":205633,"children":205634},{},[205635],{"type":23,"value":205636},"There is no universal 'resume always available' assumption you can make.",{"type":17,"tag":239,"props":205638,"children":205640},{"id":205639},"what-to-do-instead",[205641],{"type":23,"value":205642},"What to do instead",{"type":17,"tag":6154,"props":205644,"children":205645},{},[205646,205651,205670,205675],{"type":17,"tag":84,"props":205647,"children":205648},{},[205649],{"type":23,"value":205650},"List documents for a candidate or application",{"type":17,"tag":84,"props":205652,"children":205653},{},[205654,205656,205661,205663,205668],{"type":23,"value":205655},"Attempt to retrieve ",{"type":17,"tag":6121,"props":205657,"children":205659},{"className":205658},[],[205660],{"type":23,"value":134916},{"type":23,"value":205662}," (and/or ",{"type":17,"tag":6121,"props":205664,"children":205666},{"className":205665},[],[205667],{"type":23,"value":135899},{"type":23,"value":205669}," when available)",{"type":17,"tag":84,"props":205671,"children":205672},{},[205673],{"type":23,"value":205674},"Download within the URL lifetime (commonly short-lived)",{"type":17,"tag":84,"props":205676,"children":205677},{},[205678],{"type":23,"value":205679},"Parse text → generate embeddings → store in your own system",{"type":17,"tag":29,"props":205681,"children":205682},{},[205683],{"type":23,"value":205684},"List documents (application-level example):",{"type":17,"tag":6893,"props":205686,"children":205689},{"className":205687,"code":205688,"language":18718,"meta":7},[18716],"async function listApplicationDocuments(connectionId: string, applicationId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.ats.listAtsDocuments({\n      connectionId,\n      application_id: applicationId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: '',\n      raw: '',\n    });\n\n    if (!page || page.length === 0) break;\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[205690],{"type":17,"tag":6121,"props":205691,"children":205692},{"__ignoreMap":7},[205693],{"type":23,"value":205688},{"type":17,"tag":29,"props":205695,"children":205696},{},[205697],{"type":23,"value":205698},"Then, for each document:",{"type":17,"tag":80,"props":205700,"children":205701},{},[205702,205713,205724],{"type":17,"tag":84,"props":205703,"children":205704},{},[205705,205706,205711],{"type":23,"value":132873},{"type":17,"tag":6121,"props":205707,"children":205709},{"className":205708},[],[205710],{"type":23,"value":134916},{"type":23,"value":205712}," exists, download immediately.",{"type":17,"tag":84,"props":205714,"children":205715},{},[205716,205717,205722],{"type":23,"value":132873},{"type":17,"tag":6121,"props":205718,"children":205720},{"className":205719},[],[205721],{"type":23,"value":135899},{"type":23,"value":205723}," is present on read (provider-dependent), decode base64.",{"type":17,"tag":84,"props":205725,"children":205726},{},[205727],{"type":23,"value":205728},"If neither is present, treat resume ingestion as unavailable for that provider.",{"type":17,"tag":29,"props":205730,"children":205731},{},[205732,205734,205739],{"type":23,"value":205733},"Also: ",{"type":17,"tag":6121,"props":205735,"children":205737},{"className":205736},[],[205738],{"type":23,"value":205376},{"type":23,"value":205740}," is a valid enum, but documentation does not guarantee every provider uses it consistently. Treat it as a useful hint, not a guarantee.",{"type":17,"tag":68,"props":205742,"children":205744},{"id":205743},"step-4-labels-and-outcomes-train-on-what-you-can-actually-observe",[205745],{"type":23,"value":205746},"Step 4: Labels and outcomes (train on what you can actually observe)",{"type":17,"tag":29,"props":205748,"children":205749},{},[205750],{"type":23,"value":205751},"The normalized application schema includes:",{"type":17,"tag":80,"props":205753,"children":205754},{},[205755,205763,205771],{"type":17,"tag":84,"props":205756,"children":205757},{},[205758],{"type":17,"tag":6121,"props":205759,"children":205761},{"className":205760},[],[205762],{"type":23,"value":132233},{"type":17,"tag":84,"props":205764,"children":205765},{},[205766],{"type":17,"tag":6121,"props":205767,"children":205769},{"className":205768},[],[205770],{"type":23,"value":132224},{"type":17,"tag":84,"props":205772,"children":205773},{},[205774,205779,205780],{"type":17,"tag":6121,"props":205775,"children":205777},{"className":205776},[],[205778],{"type":23,"value":135872},{"type":23,"value":120761},{"type":17,"tag":6121,"props":205781,"children":205783},{"className":205782},[],[205784],{"type":23,"value":205785},"accepted_at",{"type":17,"tag":29,"props":205787,"children":205788},{},[205789],{"type":23,"value":205790},"But providers differ widely:",{"type":17,"tag":80,"props":205792,"children":205793},{},[205794,205806,205823,205833,205838],{"type":17,"tag":84,"props":205795,"children":205796},{},[205797,205799,205804],{"type":23,"value":205798},"Some don't return ",{"type":17,"tag":6121,"props":205800,"children":205802},{"className":205801},[],[205803],{"type":23,"value":132233},{"type":23,"value":205805}," at all.",{"type":17,"tag":84,"props":205807,"children":205808},{},[205809,205810,205815,205817,205822],{"type":23,"value":205798},{"type":17,"tag":6121,"props":205811,"children":205813},{"className":205812},[],[205814],{"type":23,"value":132224},{"type":23,"value":205816}," (or return only ",{"type":17,"tag":6121,"props":205818,"children":205820},{"className":205819},[],[205821],{"type":23,"value":156955},{"type":23,"value":129328},{"type":17,"tag":84,"props":205824,"children":205825},{},[205826,205831],{"type":17,"tag":6121,"props":205827,"children":205829},{"className":205828},[],[205830],{"type":23,"value":135872},{"type":23,"value":205832}," is only supported by certain integrations.",{"type":17,"tag":84,"props":205834,"children":205835},{},[205836],{"type":23,"value":205837},"When offers are supported, they are often marked as slow fields.",{"type":17,"tag":84,"props":205839,"children":205840},{},[205841,205846],{"type":17,"tag":6121,"props":205842,"children":205844},{"className":205843},[],[205845],{"type":23,"value":156917},{"type":23,"value":205847}," is not guaranteed to be populated even when offers exist.",{"type":17,"tag":239,"props":205849,"children":205851},{"id":205850},"practical-labeling-strategy",[205852],{"type":23,"value":205853},"Practical labeling strategy",{"type":17,"tag":29,"props":205855,"children":205856},{},[205857],{"type":23,"value":205858},"Build labels per-integration capability and treat missing values as normal.",{"type":17,"tag":29,"props":205860,"children":205861},{},[205862],{"type":23,"value":205863},"Example label logic:",{"type":17,"tag":6893,"props":205865,"children":205868},{"className":205866,"code":205867,"language":18718,"meta":7},[18716],"function labelFromApplication(app: any) {\n  if (app.hired_at) return 'HIRED';\n  if (app.rejected_at) return 'REJECTED';\n  // Optional: if offers exist and accepted_at exists, treat as HIRED-like\n  if (Array.isArray(app.offers) && app.offers.some((o: any) => o.accepted_at)) return 'OFFER_ACCEPTED';\n  return 'IN_PROGRESS';\n}\n",[205869],{"type":17,"tag":6121,"props":205870,"children":205871},{"__ignoreMap":7},[205872],{"type":23,"value":205867},{"type":17,"tag":29,"props":205874,"children":205875},{},[205876],{"type":23,"value":132738},{"type":17,"tag":80,"props":205878,"children":205879},{},[205880,205884,205889],{"type":17,"tag":84,"props":205881,"children":205882},{},[205883],{"type":23,"value":105462},{"type":17,"tag":84,"props":205885,"children":205886},{},[205887],{"type":23,"value":205888},"label_source (which field produced it)",{"type":17,"tag":84,"props":205890,"children":205891},{},[205892,205894,205900,205901,205907,205908,205914],{"type":23,"value":205893},"missingness flags (e.g., ",{"type":17,"tag":6121,"props":205895,"children":205897},{"className":205896},[],[205898],{"type":23,"value":205899},"has_hired_at",{"type":23,"value":11826},{"type":17,"tag":6121,"props":205902,"children":205904},{"className":205903},[],[205905],{"type":23,"value":205906},"has_rejected_at",{"type":23,"value":11826},{"type":17,"tag":6121,"props":205909,"children":205911},{"className":205910},[],[205912],{"type":23,"value":205913},"has_offers",{"type":23,"value":12034},{"type":17,"tag":29,"props":205916,"children":205917},{},[205918],{"type":23,"value":205919},"This makes model evaluation honest and prevents silent bias.",{"type":17,"tag":68,"props":205921,"children":205923},{"id":205922},"step-5-do-not-assume-stage-history-exists",[205924],{"type":23,"value":205925},"Step 5: Do not assume stage history exists",{"type":17,"tag":29,"props":205927,"children":205928},{},[205929],{"type":23,"value":205930},"Unified exposes:",{"type":17,"tag":80,"props":205932,"children":205933},{},[205934,205943,205954],{"type":17,"tag":84,"props":205935,"children":205936},{},[205937,205942],{"type":17,"tag":6121,"props":205938,"children":205940},{"className":205939},[],[205941],{"type":23,"value":132078},{"type":23,"value":205132},{"type":17,"tag":84,"props":205944,"children":205945},{},[205946,205952],{"type":17,"tag":6121,"props":205947,"children":205949},{"className":205948},[],[205950],{"type":23,"value":205951},"AtsApplication.original_status",{"type":23,"value":205953}," (raw provider stage)",{"type":17,"tag":84,"props":205955,"children":205956},{},[205957,205962,205964,205970],{"type":17,"tag":6121,"props":205958,"children":205960},{"className":205959},[],[205961],{"type":23,"value":132110},{"type":23,"value":205963}," via ",{"type":17,"tag":6121,"props":205965,"children":205967},{"className":205966},[],[205968],{"type":23,"value":205969},"GET /ats/{connection_id}/applicationstatus",{"type":23,"value":205971}," (stage vocabulary)",{"type":17,"tag":29,"props":205973,"children":205974},{},[205975],{"type":23,"value":205976},"It does not document:",{"type":17,"tag":80,"props":205978,"children":205979},{},[205980,205985,205990],{"type":17,"tag":84,"props":205981,"children":205982},{},[205983],{"type":23,"value":205984},"an ordered stage progression model",{"type":17,"tag":84,"props":205986,"children":205987},{},[205988],{"type":23,"value":205989},"a stage transition timeline endpoint",{"type":17,"tag":84,"props":205991,"children":205992},{},[205993],{"type":23,"value":205994},"historical stage transitions",{"type":17,"tag":29,"props":205996,"children":205997},{},[205998],{"type":23,"value":205999},"So 'sequence modeling' based on transitions is not something you can claim as universally supported. If you need detailed stage history, you must rely on provider-native data via passthrough (if the provider exposes it), or accept that you're training on current state + timestamps.",{"type":17,"tag":68,"props":206001,"children":206003},{"id":206002},"step-6-dataset-scale-and-sync-strategy-for-training",[206004],{"type":23,"value":206005},"Step 6: Dataset scale and sync strategy for training",{"type":17,"tag":239,"props":206007,"children":206009},{"id":206008},"pagination-constraints",[206010],{"type":23,"value":206011},"Pagination constraints",{"type":17,"tag":29,"props":206013,"children":206014},{},[206015],{"type":23,"value":206016},"ATS list endpoints paginate with:",{"type":17,"tag":80,"props":206018,"children":206019},{},[206020,206029],{"type":17,"tag":84,"props":206021,"children":206022},{},[206023,206028],{"type":17,"tag":6121,"props":206024,"children":206026},{"className":206025},[],[206027],{"type":23,"value":48389},{"type":23,"value":132712},{"type":17,"tag":84,"props":206030,"children":206031},{},[206032,206037],{"type":17,"tag":6121,"props":206033,"children":206035},{"className":206034},[],[206036],{"type":23,"value":48411},{"type":23,"value":206038}," (0-based)",{"type":17,"tag":29,"props":206040,"children":206041},{},[206042],{"type":23,"value":206043},"Documentation indicates:",{"type":17,"tag":80,"props":206045,"children":206046},{},[206047,206052],{"type":17,"tag":84,"props":206048,"children":206049},{},[206050],{"type":23,"value":206051},"limit cannot exceed 100 records per request",{"type":17,"tag":84,"props":206053,"children":206054},{},[206055],{"type":23,"value":206056},"no total record limit is documented",{"type":17,"tag":239,"props":206058,"children":206060},{"id":206059},"what-this-implies-for-training",[206061],{"type":23,"value":206062},"What this implies for training",{"type":17,"tag":29,"props":206064,"children":206065},{},[206066],{"type":23,"value":206067},"For any non-trivial dataset, you should:",{"type":17,"tag":6154,"props":206069,"children":206070},{},[206071,206081,206092],{"type":17,"tag":84,"props":206072,"children":206073},{},[206074,206079],{"type":17,"tag":48,"props":206075,"children":206076},{},[206077],{"type":23,"value":206078},"Sync into your own database",{"type":23,"value":206080}," (don't train directly off live list calls)",{"type":17,"tag":84,"props":206082,"children":206083},{},[206084,206086,206090],{"type":23,"value":206085},"Use incremental updates and/or ",{"type":17,"tag":133,"props":206087,"children":206088},{"href":4999},[206089],{"type":23,"value":5002},{"type":23,"value":206091}," to keep the dataset current",{"type":17,"tag":84,"props":206093,"children":206094},{},[206095],{"type":23,"value":206096},"Train from your DB snapshots",{"type":17,"tag":68,"props":206098,"children":206100},{"id":206099},"step-7-incremental-refresh-and-retraining-loop",[206101],{"type":23,"value":206102},"Step 7: Incremental refresh and retraining loop",{"type":17,"tag":29,"props":206104,"children":206105},{},[206106],{"type":23,"value":201455},{"type":17,"tag":80,"props":206108,"children":206109},{},[206110],{"type":17,"tag":84,"props":206111,"children":206112},{},[206113],{"type":17,"tag":6121,"props":206114,"children":206116},{"className":206115},[],[206117],{"type":23,"value":26291},{"type":17,"tag":29,"props":206119,"children":206120},{},[206121],{"type":23,"value":206122},"So a safe retraining loop looks like:",{"type":17,"tag":6154,"props":206124,"children":206125},{},[206126,206131,206142,206152,206157,206162],{"type":17,"tag":84,"props":206127,"children":206128},{},[206129],{"type":23,"value":206130},"Initial backfill (paginate until exhaustion)",{"type":17,"tag":84,"props":206132,"children":206133},{},[206134,206136,206141],{"type":23,"value":206135},"Store a watermark per object type (last ",{"type":17,"tag":6121,"props":206137,"children":206139},{"className":206138},[],[206140],{"type":23,"value":25337},{"type":23,"value":12034},{"type":17,"tag":84,"props":206143,"children":206144},{},[206145,206147],{"type":23,"value":206146},"Periodically fetch deltas using ",{"type":17,"tag":6121,"props":206148,"children":206150},{"className":206149},[],[206151],{"type":23,"value":26291},{"type":17,"tag":84,"props":206153,"children":206154},{},[206155],{"type":23,"value":206156},"Update your DB",{"type":17,"tag":84,"props":206158,"children":206159},{},[206160],{"type":23,"value":206161},"Recompute features for changed entities",{"type":17,"tag":84,"props":206163,"children":206164},{},[206165],{"type":23,"value":206166},"Retrain or refresh your model on schedule (or when enough data changes)",{"type":17,"tag":29,"props":206168,"children":206169},{},[206170],{"type":23,"value":206171},"Example incremental application pull:",{"type":17,"tag":6893,"props":206173,"children":206176},{"className":206174,"code":206175,"language":18718,"meta":7},[18716],"async function listUpdatedApplications(connectionId: string, updatedSince: string) {\n  return await sdk.ats.listAtsApplications({\n    connectionId,\n    updated_gte: updatedSince,\n    sort: 'updated_at',\n    order: 'asc',\n    limit: 100,\n    offset: 0,\n    fields: '',\n    raw: '',\n  });\n}\n",[206177],{"type":17,"tag":6121,"props":206178,"children":206179},{"__ignoreMap":7},[206180],{"type":23,"value":206175},{"type":17,"tag":29,"props":206182,"children":206183},{},[206184],{"type":23,"value":206185},"For near-real-time workflows, ATS webhooks exist, but:",{"type":17,"tag":80,"props":206187,"children":206188},{},[206189,206194,206203],{"type":17,"tag":84,"props":206190,"children":206191},{},[206192],{"type":23,"value":206193},"filter keys vary by integration and object",{"type":17,"tag":84,"props":206195,"children":206196},{},[206197,206199],{"type":23,"value":206198},"filters are only supported for ",{"type":17,"tag":133,"props":206200,"children":206201},{"href":9007},[206202],{"type":23,"value":46572},{"type":17,"tag":84,"props":206204,"children":206205},{},[206206],{"type":23,"value":206207},"native webhooks don't accept filters",{"type":17,"tag":29,"props":206209,"children":206210},{},[206211],{"type":23,"value":206212},"This is enough to build a continuous learning loop without polling every few minutes.",{"type":17,"tag":68,"props":206214,"children":206216},{"id":206215},"step-8-what-to-surface-as-ai-insights-without-overclaiming",[206217],{"type":23,"value":206218},"Step 8: What to surface as 'AI insights' (without overclaiming)",{"type":17,"tag":29,"props":206220,"children":206221},{},[206222],{"type":23,"value":206223},"If you're training models, your product outputs should map to observable data:",{"type":17,"tag":80,"props":206225,"children":206226},{},[206227,206232,206237,206242,206247],{"type":17,"tag":84,"props":206228,"children":206229},{},[206230],{"type":23,"value":206231},"Candidate-job match score (based on job description + experience/resume text when available)",{"type":17,"tag":84,"props":206233,"children":206234},{},[206235],{"type":23,"value":206236},"Candidate ranking for a job",{"type":17,"tag":84,"props":206238,"children":206239},{},[206240],{"type":23,"value":206241},"Similar candidate retrieval (embedding search)",{"type":17,"tag":84,"props":206243,"children":206244},{},[206245],{"type":23,"value":206246},"Pipeline conversion insights (only if outcomes exist)",{"type":17,"tag":84,"props":206248,"children":206249},{},[206250],{"type":23,"value":206251},"Suggested next actions (based on application status + interview cadence)",{"type":17,"tag":29,"props":206253,"children":206254},{},[206255],{"type":23,"value":206256},"Be explicit in UX about missing data:",{"type":17,"tag":80,"props":206258,"children":206259},{},[206260,206265,206270],{"type":17,"tag":84,"props":206261,"children":206262},{},[206263],{"type":23,"value":206264},"'Resume unavailable for this ATS integration'",{"type":17,"tag":84,"props":206266,"children":206267},{},[206268],{"type":23,"value":206269},"'Offer outcomes not returned by provider'",{"type":17,"tag":84,"props":206271,"children":206272},{},[206273],{"type":23,"value":206274},"'Hire timestamp not present'",{"type":17,"tag":29,"props":206276,"children":206277},{},[206278],{"type":23,"value":206279},"That transparency prevents trust issues.",{"type":17,"tag":68,"props":206281,"children":206282},{"id":132938},[206283],{"type":23,"value":136162},{"type":17,"tag":29,"props":206285,"children":206286},{},[206287],{"type":23,"value":206288},"Training AI on ATS data is viable when you treat ATS systems as they are: incomplete, inconsistent, and provider-dependent.",{"type":17,"tag":29,"props":206290,"children":206291},{},[206292],{"type":23,"value":206293},"Unified's ATS API gives you the right foundation:",{"type":17,"tag":80,"props":206295,"children":206296},{},[206297,206302,206307],{"type":17,"tag":84,"props":206298,"children":206299},{},[206300],{"type":23,"value":206301},"normalized candidates, jobs, applications, interviews, and documents",{"type":17,"tag":84,"props":206303,"children":206304},{},[206305],{"type":23,"value":206306},"consistent pagination and incremental update patterns",{"type":17,"tag":84,"props":206308,"children":206309},{},[206310],{"type":23,"value":206311},"optional webhooks for continuous updates",{"type":17,"tag":29,"props":206313,"children":206314},{},[206315],{"type":23,"value":206316},"From there, the difference between a useful model and a fragile one is whether your pipeline is honest about missing data, builds labels defensibly, and stores training-ready datasets in your own system.",{"type":17,"tag":29,"props":206318,"children":206319},{},[206320,206321],{"type":23,"value":1609},{"type":17,"tag":133,"props":206322,"children":206324},{"href":1612,"rel":206323},[214],[206325],{"type":23,"value":1616},{"type":17,"tag":29,"props":206327,"children":206328},{},[206329,206330],{"type":23,"value":1609},{"type":17,"tag":133,"props":206331,"children":206333},{"href":1623,"rel":206332},[214],[206334],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":206336},[206337,206338,206343,206355,206361,206366,206369,206372,206373,206377,206378,206379],{"id":204643,"depth":1629,"text":204646},{"id":204708,"depth":1629,"text":204711,"children":206339},[206340,206341,206342],{"id":204714,"depth":1635,"text":204717},{"id":204779,"depth":1635,"text":204782},{"id":204814,"depth":1635,"text":204817},{"id":204859,"depth":1629,"text":204862,"children":206344},[206345,206347,206349,206351,206353],{"id":204865,"depth":1635,"text":206346},"Jobs (AtsJob)",{"id":204976,"depth":1635,"text":206348},"Candidates (AtsCandidate)",{"id":205083,"depth":1635,"text":206350},"Applications (AtsApplication)",{"id":205190,"depth":1635,"text":206352},"Interviews (AtsInterview)",{"id":205247,"depth":1635,"text":206354},"Documents (AtsDocument)",{"id":205381,"depth":1629,"text":205384,"children":206356},[206357,206358,206359,206360],{"id":205400,"depth":1635,"text":205403},{"id":205415,"depth":1635,"text":205418},{"id":205430,"depth":1635,"text":205433},{"id":205445,"depth":1635,"text":205448},{"id":205505,"depth":1629,"text":205508,"children":206362},[206363,206364],{"id":205511,"depth":1635,"text":205514},{"id":205604,"depth":1635,"text":206365},"Treat skills[] as optional enrichment",{"id":205628,"depth":1629,"text":205631,"children":206367},[206368],{"id":205639,"depth":1635,"text":205642},{"id":205743,"depth":1629,"text":205746,"children":206370},[206371],{"id":205850,"depth":1635,"text":205853},{"id":205922,"depth":1629,"text":205925},{"id":206002,"depth":1629,"text":206005,"children":206374},[206375,206376],{"id":206008,"depth":1635,"text":206011},{"id":206059,"depth":1635,"text":206062},{"id":206099,"depth":1629,"text":206102},{"id":206215,"depth":1629,"text":206218},{"id":132938,"depth":1629,"text":136162},"content:blog:how_to_train_ai_on_ats_data_with_unified_ats_api.md","blog/how_to_train_ai_on_ats_data_with_unified_ats_api.md","blog/how_to_train_ai_on_ats_data_with_unified_ats_api",{"_path":206384,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":206385,"description":206386,"img":206387,"date":206388,"tag":12,"body":206389,"_type":1677,"_id":207285,"_source":1679,"_file":207286,"_stem":207287,"_extension":1682},"/blog/how_to_analyze_employee_population_for_compliance_and_risk_grc_with_unified_hr_and_directory_api","How to Analyze Employee Population for Compliance and Risk (GRC) with Unified's HR & Directory API","Employee population analysis for compliance and risk fails when tools blur the line between what is observable and what is inferred.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_analyze_employee_population_for_compliance_and_risk_grc_with_unified_hr_and_directory_api-icon.png","2026-02-02T17:10:00.000Z",{"type":14,"children":206390,"toc":207260},[206391,206396,206399,206406,206423,206428,206439,206456,206467,206473,206484,206488,206506,206510,206533,206538,206544,206549,206572,206584,206588,206601,206606,206610,206721,206725,206743,206756,206761,206765,206816,206821,206834,206839,206843,206896,206901,206914,206919,206923,206942,206947,206953,206958,206967,206978,206984,206995,207004,207009,207015,207021,207030,207035,207041,207050,207054,207067,207073,207082,207087,207093,207098,207102,207120,207125,207131,207154,207158,207176,207187,207191,207195,207218,207223,207227,207232,207237,207242,207251],{"type":17,"tag":18,"props":206392,"children":206394},{"id":206393},"how-to-analyze-employee-population-for-compliance-and-risk-grc-with-unifieds-hr-directory-api",[206395],{"type":23,"value":206385},{"type":17,"tag":25,"props":206397,"children":206398},{},[],{"type":17,"tag":29,"props":206400,"children":206401},{},[206402],{"type":17,"tag":33,"props":206403,"children":206404},{},[206405],{"type":23,"value":199463},{"type":17,"tag":29,"props":206407,"children":206408},{},[206409,206411,206416,206417,206422],{"type":23,"value":206410},"Employee population analysis for compliance and risk fails when tools blur the line between ",{"type":17,"tag":48,"props":206412,"children":206413},{},[206414],{"type":23,"value":206415},"what is observable",{"type":23,"value":34435},{"type":17,"tag":48,"props":206418,"children":206419},{},[206420],{"type":23,"value":206421},"what is inferred",{"type":23,"value":54},{"type":17,"tag":29,"props":206424,"children":206425},{},[206426],{"type":23,"value":206427},"Across HR systems, demographic attributes, employment classifications, and compensation data vary widely in availability and meaning. Some fields are optional. Some are self-reported. Some exist only for certain geographies or company policies. When products attempt to normalize or infer missing attributes, they introduce legal, audit, and reputational risk.",{"type":17,"tag":29,"props":206429,"children":206430},{},[206431,206433,206438],{"type":23,"value":206432},"For governance, risk, and compliance (GRC) teams, the challenge isn't lack of data. It's ",{"type":17,"tag":48,"props":206434,"children":206435},{},[206436],{"type":23,"value":206437},"trusting the analysis",{"type":23,"value":54},{"type":17,"tag":29,"props":206440,"children":206441},{},[206442,206443,206447,206449,206454],{"type":23,"value":25244},{"type":17,"tag":48,"props":206444,"children":206445},{},[206446],{"type":23,"value":11679},{"type":23,"value":206448}," API is designed to support population analysis without guessing. It exposes ",{"type":17,"tag":48,"props":206450,"children":206451},{},[206452],{"type":23,"value":206453},"only what the underlying HRIS explicitly provides",{"type":23,"value":206455},", with consistent schemas and clear boundaries around what is current-state, optional, or unavailable. Aggregation is possible. Interpretation is left to you.",{"type":17,"tag":29,"props":206457,"children":206458},{},[206459,206461,206465],{"type":23,"value":206460},"This guide shows how to analyze employee population data for compliance and risk use cases—workforce composition, demographic distribution, organizational concentration, and geographic exposure—using Unified's ",{"type":17,"tag":133,"props":206462,"children":206463},{"href":60186},[206464],{"type":23,"value":197036},{"type":23,"value":206466},", without reconstructing history or inferring protected attributes.",{"type":17,"tag":68,"props":206468,"children":206470},{"id":206469},"what-grc-analysis-means-in-this-context",[206471],{"type":23,"value":206472},"What GRC analysis means in this context",{"type":17,"tag":29,"props":206474,"children":206475},{},[206476,206477,206482],{"type":23,"value":20751},{"type":17,"tag":48,"props":206478,"children":206479},{},[206480],{"type":23,"value":206481},"population analysis",{"type":23,"value":206483},", not compliance determination.",{"type":17,"tag":29,"props":206485,"children":206486},{},[206487],{"type":23,"value":203408},{"type":17,"tag":80,"props":206489,"children":206490},{},[206491,206496,206501],{"type":17,"tag":84,"props":206492,"children":206493},{},[206494],{"type":23,"value":206495},"Analyze workforce composition and distribution",{"type":17,"tag":84,"props":206497,"children":206498},{},[206499],{"type":23,"value":206500},"Segment populations by observable attributes",{"type":17,"tag":84,"props":206502,"children":206503},{},[206504],{"type":23,"value":206505},"Surface structural risk indicators (concentration, imbalance, exposure)",{"type":17,"tag":29,"props":206507,"children":206508},{},[206509],{"type":23,"value":203440},{"type":17,"tag":80,"props":206511,"children":206512},{},[206513,206518,206523,206528],{"type":17,"tag":84,"props":206514,"children":206515},{},[206516],{"type":23,"value":206517},"Declare regulatory compliance",{"type":17,"tag":84,"props":206519,"children":206520},{},[206521],{"type":23,"value":206522},"Detect bias or discrimination",{"type":17,"tag":84,"props":206524,"children":206525},{},[206526],{"type":23,"value":206527},"Infer protected characteristics",{"type":17,"tag":84,"props":206529,"children":206530},{},[206531],{"type":23,"value":206532},"Produce legal conclusions",{"type":17,"tag":29,"props":206534,"children":206535},{},[206536],{"type":23,"value":206537},"Unified provides the data layer. Compliance interpretation belongs to your governance framework.",{"type":17,"tag":68,"props":206539,"children":206541},{"id":206540},"the-mental-model-population-analysis-is-descriptive-not-judgmental",[206542],{"type":23,"value":206543},"The mental model: population analysis is descriptive, not judgmental",{"type":17,"tag":29,"props":206545,"children":206546},{},[206547],{"type":23,"value":206548},"GRC-oriented employee analysis should answer questions like:",{"type":17,"tag":80,"props":206550,"children":206551},{},[206552,206557,206562,206567],{"type":17,"tag":84,"props":206553,"children":206554},{},[206555],{"type":23,"value":206556},"How is our workforce distributed by role, location, and employment type?",{"type":17,"tag":84,"props":206558,"children":206559},{},[206560],{"type":23,"value":206561},"Which organizational units concentrate certain demographic attributes?",{"type":17,"tag":84,"props":206563,"children":206564},{},[206565],{"type":23,"value":206566},"Where do optional or sensitive attributes cluster—or go missing?",{"type":17,"tag":84,"props":206568,"children":206569},{},[206570],{"type":23,"value":206571},"How does workforce composition differ across entities or regions?",{"type":17,"tag":29,"props":206573,"children":206574},{},[206575,206577,206582],{"type":23,"value":206576},"These are ",{"type":17,"tag":48,"props":206578,"children":206579},{},[206580],{"type":23,"value":206581},"descriptive",{"type":23,"value":206583}," questions. They rely on counts, distributions, and segmentation—not inference.",{"type":17,"tag":68,"props":206585,"children":206586},{"id":204859},[206587],{"type":23,"value":204862},{"type":17,"tag":239,"props":206589,"children":206591},{"id":206590},"employees-hrisemployee",[206592,206594,206600],{"type":23,"value":206593},"Employees (",{"type":17,"tag":6121,"props":206595,"children":206597},{"className":206596},[],[206598],{"type":23,"value":206599},"HrisEmployee",{"type":23,"value":12034},{"type":17,"tag":29,"props":206602,"children":206603},{},[206604],{"type":23,"value":206605},"Employees are the foundation of population analysis.",{"type":17,"tag":29,"props":206607,"children":206608},{},[206609],{"type":23,"value":160476},{"type":17,"tag":80,"props":206611,"children":206612},{},[206613,206621,206630,206638,206653,206662,206671,206679,206688,206696,206705,206713],{"type":17,"tag":84,"props":206614,"children":206615},{},[206616],{"type":17,"tag":6121,"props":206617,"children":206619},{"className":206618},[],[206620],{"type":23,"value":18766},{"type":17,"tag":84,"props":206622,"children":206623},{},[206624],{"type":17,"tag":6121,"props":206625,"children":206627},{"className":206626},[],[206628],{"type":23,"value":206629},"employment_status",{"type":17,"tag":84,"props":206631,"children":206632},{},[206633],{"type":17,"tag":6121,"props":206634,"children":206636},{"className":206635},[],[206637],{"type":23,"value":75514},{"type":17,"tag":84,"props":206639,"children":206640},{},[206641,206647,206648],{"type":17,"tag":6121,"props":206642,"children":206644},{"className":206643},[],[206645],{"type":23,"value":206646},"gender",{"type":23,"value":18757},{"type":17,"tag":33,"props":206649,"children":206650},{},[206651],{"type":23,"value":206652},"(optional; self-reported where supported)",{"type":17,"tag":84,"props":206654,"children":206655},{},[206656],{"type":17,"tag":6121,"props":206657,"children":206659},{"className":206658},[],[206660],{"type":23,"value":206661},"date_of_birth",{"type":17,"tag":84,"props":206663,"children":206664},{},[206665],{"type":17,"tag":6121,"props":206666,"children":206668},{"className":206667},[],[206669],{"type":23,"value":206670},"marital_status",{"type":17,"tag":84,"props":206672,"children":206673},{},[206674],{"type":17,"tag":6121,"props":206675,"children":206677},{"className":206676},[],[206678],{"type":23,"value":132233},{"type":17,"tag":84,"props":206680,"children":206681},{},[206682],{"type":17,"tag":6121,"props":206683,"children":206685},{"className":206684},[],[206686],{"type":23,"value":206687},"terminated_at",{"type":17,"tag":84,"props":206689,"children":206690},{},[206691],{"type":17,"tag":6121,"props":206692,"children":206694},{"className":206693},[],[206695],{"type":23,"value":201198},{"type":17,"tag":84,"props":206697,"children":206698},{},[206699],{"type":17,"tag":6121,"props":206700,"children":206702},{"className":206701},[],[206703],{"type":23,"value":206704},"locations[]",{"type":17,"tag":84,"props":206706,"children":206707},{},[206708],{"type":17,"tag":6121,"props":206709,"children":206711},{"className":206710},[],[206712],{"type":23,"value":27299},{"type":17,"tag":84,"props":206714,"children":206715},{},[206716],{"type":17,"tag":6121,"props":206717,"children":206719},{"className":206718},[],[206720],{"type":23,"value":25337},{"type":17,"tag":29,"props":206722,"children":206723},{},[206724],{"type":23,"value":194883},{"type":17,"tag":80,"props":206726,"children":206727},{},[206728,206733,206738],{"type":17,"tag":84,"props":206729,"children":206730},{},[206731],{"type":23,"value":206732},"Demographic fields may be missing or null.",{"type":17,"tag":84,"props":206734,"children":206735},{},[206736],{"type":23,"value":206737},"Gender values are enumerated but not required.",{"type":17,"tag":84,"props":206739,"children":206740},{},[206741],{"type":23,"value":206742},"No assumptions should be made when attributes are absent.",{"type":17,"tag":239,"props":206744,"children":206746},{"id":206745},"groups-hrisgroup",[206747,206749,206755],{"type":23,"value":206748},"Groups (",{"type":17,"tag":6121,"props":206750,"children":206752},{"className":206751},[],[206753],{"type":23,"value":206754},"HrisGroup",{"type":23,"value":12034},{"type":17,"tag":29,"props":206757,"children":206758},{},[206759],{"type":23,"value":206760},"Groups support organizational segmentation.",{"type":17,"tag":29,"props":206762,"children":206763},{},[206764],{"type":23,"value":160476},{"type":17,"tag":80,"props":206766,"children":206767},{},[206768,206776,206784,206792,206800,206808],{"type":17,"tag":84,"props":206769,"children":206770},{},[206771],{"type":17,"tag":6121,"props":206772,"children":206774},{"className":206773},[],[206775],{"type":23,"value":18766},{"type":17,"tag":84,"props":206777,"children":206778},{},[206779],{"type":17,"tag":6121,"props":206780,"children":206782},{"className":206781},[],[206783],{"type":23,"value":18781},{"type":17,"tag":84,"props":206785,"children":206786},{},[206787],{"type":17,"tag":6121,"props":206788,"children":206790},{"className":206789},[],[206791],{"type":23,"value":15863},{"type":17,"tag":84,"props":206793,"children":206794},{},[206795],{"type":17,"tag":6121,"props":206796,"children":206798},{"className":206797},[],[206799],{"type":23,"value":27310},{"type":17,"tag":84,"props":206801,"children":206802},{},[206803],{"type":17,"tag":6121,"props":206804,"children":206806},{"className":206805},[],[206807],{"type":23,"value":62868},{"type":17,"tag":84,"props":206809,"children":206810},{},[206811],{"type":17,"tag":6121,"props":206812,"children":206814},{"className":206813},[],[206815],{"type":23,"value":27299},{"type":17,"tag":29,"props":206817,"children":206818},{},[206819],{"type":23,"value":206820},"Groups allow rollups by department, division, or business unit without assuming hierarchy implies reporting structure.",{"type":17,"tag":239,"props":206822,"children":206824},{"id":206823},"locations-hrislocation",[206825,206827,206833],{"type":23,"value":206826},"Locations (",{"type":17,"tag":6121,"props":206828,"children":206830},{"className":206829},[],[206831],{"type":23,"value":206832},"HrisLocation",{"type":23,"value":12034},{"type":17,"tag":29,"props":206835,"children":206836},{},[206837],{"type":23,"value":206838},"Locations enable geographic and jurisdictional analysis.",{"type":17,"tag":29,"props":206840,"children":206841},{},[206842],{"type":23,"value":160476},{"type":17,"tag":80,"props":206844,"children":206845},{},[206846,206854,206862,206871,206880,206888],{"type":17,"tag":84,"props":206847,"children":206848},{},[206849],{"type":17,"tag":6121,"props":206850,"children":206852},{"className":206851},[],[206853],{"type":23,"value":18766},{"type":17,"tag":84,"props":206855,"children":206856},{},[206857],{"type":17,"tag":6121,"props":206858,"children":206860},{"className":206859},[],[206861],{"type":23,"value":18781},{"type":17,"tag":84,"props":206863,"children":206864},{},[206865],{"type":17,"tag":6121,"props":206866,"children":206868},{"className":206867},[],[206869],{"type":23,"value":206870},"address.region",{"type":17,"tag":84,"props":206872,"children":206873},{},[206874],{"type":17,"tag":6121,"props":206875,"children":206877},{"className":206876},[],[206878],{"type":23,"value":206879},"address.country",{"type":17,"tag":84,"props":206881,"children":206882},{},[206883],{"type":17,"tag":6121,"props":206884,"children":206886},{"className":206885},[],[206887],{"type":23,"value":62868},{"type":17,"tag":84,"props":206889,"children":206890},{},[206891],{"type":17,"tag":6121,"props":206892,"children":206894},{"className":206893},[],[206895],{"type":23,"value":27299},{"type":17,"tag":29,"props":206897,"children":206898},{},[206899],{"type":23,"value":206900},"Location data is essential for region-specific compliance and exposure reporting.",{"type":17,"tag":239,"props":206902,"children":206904},{"id":206903},"companies-hriscompany",[206905,206907,206913],{"type":23,"value":206906},"Companies (",{"type":17,"tag":6121,"props":206908,"children":206910},{"className":206909},[],[206911],{"type":23,"value":206912},"HrisCompany",{"type":23,"value":12034},{"type":17,"tag":29,"props":206915,"children":206916},{},[206917],{"type":23,"value":206918},"Companies define reporting scope.",{"type":17,"tag":29,"props":206920,"children":206921},{},[206922],{"type":23,"value":160476},{"type":17,"tag":80,"props":206924,"children":206925},{},[206926,206934],{"type":17,"tag":84,"props":206927,"children":206928},{},[206929],{"type":17,"tag":6121,"props":206930,"children":206932},{"className":206931},[],[206933],{"type":23,"value":18766},{"type":17,"tag":84,"props":206935,"children":206936},{},[206937],{"type":17,"tag":6121,"props":206938,"children":206940},{"className":206939},[],[206941],{"type":23,"value":18781},{"type":17,"tag":29,"props":206943,"children":206944},{},[206945],{"type":23,"value":206946},"This supports entity-level compliance views for multi-subsidiary organizations.",{"type":17,"tag":68,"props":206948,"children":206950},{"id":206949},"step-1-fetch-the-employee-population",[206951],{"type":23,"value":206952},"Step 1: Fetch the employee population",{"type":17,"tag":29,"props":206954,"children":206955},{},[206956],{"type":23,"value":206957},"Employee lists are paginated and support incremental refresh.",{"type":17,"tag":6893,"props":206959,"children":206962},{"className":206960,"code":206961,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function fetchEmployees(connectionId: string) {\n  const results = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.hris.listHrisEmployees({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: [\n        'id',\n        'employment_status',\n        'employment_type',\n        'gender',\n        'date_of_birth',\n        'marital_status',\n        'groups',\n        'locations',\n        'company_id',\n      ].join(','),\n    });\n\n    if (!page || page.length === 0) break;\n\n    results.push(...page);\n    offset += limit;\n  }\n\n  return results;\n}\n",[206963],{"type":17,"tag":6121,"props":206964,"children":206965},{"__ignoreMap":7},[206966],{"type":23,"value":206961},{"type":17,"tag":29,"props":206968,"children":206969},{},[206970,206971,206976],{"type":23,"value":33722},{"type":17,"tag":6121,"props":206972,"children":206974},{"className":206973},[],[206975],{"type":23,"value":26291},{"type":23,"value":206977}," to refresh only changed records in production systems.",{"type":17,"tag":68,"props":206979,"children":206981},{"id":206980},"step-2-define-the-population-baseline",[206982],{"type":23,"value":206983},"Step 2: Define the population baseline",{"type":17,"tag":29,"props":206985,"children":206986},{},[206987,206989,206994],{"type":23,"value":206988},"Most GRC analyses focus on the ",{"type":17,"tag":48,"props":206990,"children":206991},{},[206992],{"type":23,"value":206993},"current workforce",{"type":23,"value":54},{"type":17,"tag":6893,"props":206996,"children":206999},{"className":206997,"code":206998,"language":18718,"meta":7},[18716],"function activePopulation(employees: any[]) {\n  return employees.filter(\n    (e) => e.employment_status === 'ACTIVE' && !e.terminated_at\n  );\n}\n",[207000],{"type":17,"tag":6121,"props":207001,"children":207002},{"__ignoreMap":7},[207003],{"type":23,"value":206998},{"type":17,"tag":29,"props":207005,"children":207006},{},[207007],{"type":23,"value":207008},"Inclusion rules (e.g., contractors vs full-time employees) should be explicit and configurable.",{"type":17,"tag":68,"props":207010,"children":207012},{"id":207011},"step-3-segment-by-observable-attributes",[207013],{"type":23,"value":207014},"Step 3: Segment by observable attributes",{"type":17,"tag":239,"props":207016,"children":207018},{"id":207017},"employment-type-distribution",[207019],{"type":23,"value":207020},"Employment type distribution",{"type":17,"tag":6893,"props":207022,"children":207025},{"className":207023,"code":207024,"language":18718,"meta":7},[18716],"function byEmploymentType(employees: any[]) {\n  const counts: Record\u003Cstring, number> = {};\n\n  for (const e of employees) {\n    const type = e.employment_type ?? 'UNKNOWN';\n    counts[type] = (counts[type] ?? 0) + 1;\n  }\n\n  return counts;\n}\n",[207026],{"type":17,"tag":6121,"props":207027,"children":207028},{"__ignoreMap":7},[207029],{"type":23,"value":207024},{"type":17,"tag":29,"props":207031,"children":207032},{},[207033],{"type":23,"value":207034},"This is useful for identifying workforce composition risk, such as over-reliance on contractors in regulated roles.",{"type":17,"tag":239,"props":207036,"children":207038},{"id":207037},"gender-distribution-where-available",[207039],{"type":23,"value":207040},"Gender distribution (where available)",{"type":17,"tag":6893,"props":207042,"children":207045},{"className":207043,"code":207044,"language":18718,"meta":7},[18716],"function genderDistribution(employees: any[]) {\n  const counts: Record\u003Cstring, number> = {};\n\n  for (const e of employees) {\n    const gender = e.gender ?? 'UNSPECIFIED';\n    counts[gender] = (counts[gender] ?? 0) + 1;\n  }\n\n  return counts;\n}\n",[207046],{"type":17,"tag":6121,"props":207047,"children":207048},{"__ignoreMap":7},[207049],{"type":23,"value":207044},{"type":17,"tag":29,"props":207051,"children":207052},{},[207053],{"type":23,"value":19907},{"type":17,"tag":80,"props":207055,"children":207056},{},[207057,207062],{"type":17,"tag":84,"props":207058,"children":207059},{},[207060],{"type":23,"value":207061},"Missing values are preserved as a category.",{"type":17,"tag":84,"props":207063,"children":207064},{},[207065],{"type":23,"value":207066},"No assumptions are made about unspecified records.",{"type":17,"tag":239,"props":207068,"children":207070},{"id":207069},"age-bands",[207071],{"type":23,"value":207072},"Age bands",{"type":17,"tag":6893,"props":207074,"children":207077},{"className":207075,"code":207076,"language":18718,"meta":7},[18716],"function ageBands(employees: any[]) {\n  const now = new Date();\n  const bands = { '\u003C30': 0, '30–50': 0, '50+': 0, UNKNOWN: 0 };\n\n  for (const e of employees) {\n    if (!e.date_of_birth) {\n      bands.UNKNOWN++;\n      continue;\n    }\n\n    const age =\n      (now.getTime() - new Date(e.date_of_birth).getTime()) /\n      (365.25 * 24 * 60 * 60 * 1000);\n\n    if (age \u003C 30) bands['\u003C30']++;\n    else if (age \u003C= 50) bands['30–50']++;\n    else bands['50+']++;\n  }\n\n  return bands;\n}\n",[207078],{"type":17,"tag":6121,"props":207079,"children":207080},{"__ignoreMap":7},[207081],{"type":23,"value":207076},{"type":17,"tag":29,"props":207083,"children":207084},{},[207085],{"type":23,"value":207086},"Age analysis is useful for workforce planning and regulatory exposure, but should always be treated as descriptive.",{"type":17,"tag":68,"props":207088,"children":207090},{"id":207089},"step-4-segment-by-org-unit-and-location",[207091],{"type":23,"value":207092},"Step 4: Segment by org unit and location",{"type":17,"tag":29,"props":207094,"children":207095},{},[207096],{"type":23,"value":207097},"Because employees reference groups and locations directly, segmentation is straightforward.",{"type":17,"tag":29,"props":207099,"children":207100},{},[207101],{"type":23,"value":377},{"type":17,"tag":80,"props":207103,"children":207104},{},[207105,207110,207115],{"type":17,"tag":84,"props":207106,"children":207107},{},[207108],{"type":23,"value":207109},"Gender distribution by department",{"type":17,"tag":84,"props":207111,"children":207112},{},[207113],{"type":23,"value":207114},"Employment type by region",{"type":17,"tag":84,"props":207116,"children":207117},{},[207118],{"type":23,"value":207119},"Workforce concentration by company entity",{"type":17,"tag":29,"props":207121,"children":207122},{},[207123],{"type":23,"value":207124},"Rollups are performed client-side using the same joins across HRISs.",{"type":17,"tag":68,"props":207126,"children":207128},{"id":207127},"step-5-track-population-changes-over-time",[207129],{"type":23,"value":207130},"Step 5: Track population changes over time",{"type":17,"tag":29,"props":207132,"children":207133},{},[207134,207135,207140,207141,207146,207147,207152],{"type":23,"value":33722},{"type":17,"tag":6121,"props":207136,"children":207138},{"className":207137},[],[207139],{"type":23,"value":132233},{"type":23,"value":11826},{"type":17,"tag":6121,"props":207142,"children":207144},{"className":207143},[],[207145],{"type":23,"value":206687},{"type":23,"value":12561},{"type":17,"tag":6121,"props":207148,"children":207150},{"className":207149},[],[207151],{"type":23,"value":25337},{"type":23,"value":207153}," to observe change.",{"type":17,"tag":29,"props":207155,"children":207156},{},[207157],{"type":23,"value":377},{"type":17,"tag":80,"props":207159,"children":207160},{},[207161,207166,207171],{"type":17,"tag":84,"props":207162,"children":207163},{},[207164],{"type":23,"value":207165},"Net population growth by quarter",{"type":17,"tag":84,"props":207167,"children":207168},{},[207169],{"type":23,"value":207170},"Attrition concentration by department",{"type":17,"tag":84,"props":207172,"children":207173},{},[207174],{"type":23,"value":207175},"Demographic shifts by region",{"type":17,"tag":29,"props":207177,"children":207178},{},[207179,207180,207185],{"type":23,"value":206576},{"type":17,"tag":48,"props":207181,"children":207182},{},[207183],{"type":23,"value":207184},"observed trends",{"type":23,"value":207186},", not predictions.",{"type":17,"tag":68,"props":207188,"children":207189},{"id":204451},[207190],{"type":23,"value":204454},{"type":17,"tag":29,"props":207192,"children":207193},{},[207194],{"type":23,"value":204459},{"type":17,"tag":80,"props":207196,"children":207197},{},[207198,207203,207208,207213],{"type":17,"tag":84,"props":207199,"children":207200},{},[207201],{"type":23,"value":207202},"Infer ethnicity or protected attributes",{"type":17,"tag":84,"props":207204,"children":207205},{},[207206],{"type":23,"value":207207},"Reconstruct employment or pay history",{"type":17,"tag":84,"props":207209,"children":207210},{},[207211],{"type":23,"value":207212},"Normalize missing demographic data",{"type":17,"tag":84,"props":207214,"children":207215},{},[207216],{"type":23,"value":207217},"Make compliance judgments",{"type":17,"tag":29,"props":207219,"children":207220},{},[207221],{"type":23,"value":207222},"This keeps population analysis auditable and legally defensible.",{"type":17,"tag":68,"props":207224,"children":207225},{"id":132938},[207226],{"type":23,"value":136162},{"type":17,"tag":29,"props":207228,"children":207229},{},[207230],{"type":23,"value":207231},"GRC-oriented employee analysis depends on restraint as much as insight.",{"type":17,"tag":29,"props":207233,"children":207234},{},[207235],{"type":23,"value":207236},"Unified's HR & Directory API provides a clean, normalized foundation for workforce population analysis—exposing only what HR systems explicitly record, preserving missing data where it exists, and leaving interpretation to governance frameworks and human judgment.",{"type":17,"tag":29,"props":207238,"children":207239},{},[207240],{"type":23,"value":207241},"That clarity is what makes compliance analysis trustworthy.",{"type":17,"tag":29,"props":207243,"children":207244},{},[207245,207246],{"type":23,"value":1609},{"type":17,"tag":133,"props":207247,"children":207249},{"href":1612,"rel":207248},[214],[207250],{"type":23,"value":1616},{"type":17,"tag":29,"props":207252,"children":207253},{},[207254,207255],{"type":23,"value":1609},{"type":17,"tag":133,"props":207256,"children":207258},{"href":1623,"rel":207257},[214],[207259],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":207261},[207262,207263,207264,207274,207275,207276,207281,207282,207283,207284],{"id":206469,"depth":1629,"text":206472},{"id":206540,"depth":1629,"text":206543},{"id":204859,"depth":1629,"text":204862,"children":207265},[207266,207268,207270,207272],{"id":206590,"depth":1635,"text":207267},"Employees (HrisEmployee)",{"id":206745,"depth":1635,"text":207269},"Groups (HrisGroup)",{"id":206823,"depth":1635,"text":207271},"Locations (HrisLocation)",{"id":206903,"depth":1635,"text":207273},"Companies (HrisCompany)",{"id":206949,"depth":1629,"text":206952},{"id":206980,"depth":1629,"text":206983},{"id":207011,"depth":1629,"text":207014,"children":207277},[207278,207279,207280],{"id":207017,"depth":1635,"text":207020},{"id":207037,"depth":1635,"text":207040},{"id":207069,"depth":1635,"text":207072},{"id":207089,"depth":1629,"text":207092},{"id":207127,"depth":1629,"text":207130},{"id":204451,"depth":1629,"text":204454},{"id":132938,"depth":1629,"text":136162},"content:blog:how_to_analyze_employee_population_for_compliance_and_risk_grc_with_unified_hr_and_directory_api.md","blog/how_to_analyze_employee_population_for_compliance_and_risk_grc_with_unified_hr_and_directory_api.md","blog/how_to_analyze_employee_population_for_compliance_and_risk_grc_with_unified_hr_and_directory_api",{"_path":207289,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":207290,"description":207291,"img":207292,"date":206388,"tag":12,"body":207293,"_type":1677,"_id":208154,"_source":1679,"_file":208155,"_stem":208156,"_extension":1682},"/blog/how_to_assign_trainings_and_programs_based_on_employee_attributes_with_unified_hr_and_directory_api","How to Assign Trainings and Programs Based on Employee Attributes with Unified's HR & Directory API","Automated training assignment breaks when products assume employee attributes are static, complete, or universally defined.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_assign_trainings_and_programs_based_on_employee_attributes_with_unified_hr_and_directory_api-icon.png",{"type":14,"children":207294,"toc":208132},[207295,207300,207303,207310,207314,207319,207324,207341,207346,207352,207363,207367,207385,207389,207407,207412,207418,207430,207435,207458,207463,207468,207472,207482,207487,207491,207582,207586,207604,207614,207619,207623,207674,207679,207689,207694,207698,207749,207754,207764,207769,207773,207792,207797,207803,207807,207816,207827,207833,207838,207847,207852,207858,207869,207878,207883,207896,207902,207907,207911,207917,207926,207932,207941,207947,207956,207961,207967,207972,207976,207994,207999,208005,208010,208014,208047,208052,208057,208061,208084,208089,208093,208104,208109,208114,208123],{"type":17,"tag":18,"props":207296,"children":207298},{"id":207297},"how-to-assign-trainings-and-programs-based-on-employee-attributes-with-unifieds-hr-directory-api",[207299],{"type":23,"value":207290},{"type":17,"tag":25,"props":207301,"children":207302},{},[],{"type":17,"tag":29,"props":207304,"children":207305},{},[207306],{"type":17,"tag":33,"props":207307,"children":207308},{},[207309],{"type":23,"value":199463},{"type":17,"tag":29,"props":207311,"children":207312},{},[207313],{"type":23,"value":207291},{"type":17,"tag":29,"props":207315,"children":207316},{},[207317],{"type":23,"value":207318},"Across HR systems, the inputs used to assign learning and training programs—department, location, tenure, employment type—are modeled differently and change over time. Some systems treat teams as first-class objects. Others rely on loosely defined groups. Locations may represent offices, regions, or payroll entities. Start dates may be missing or overridden by rehire logic.",{"type":17,"tag":29,"props":207320,"children":207321},{},[207322],{"type":23,"value":207323},"When products hardcode rules per HRIS or assume attributes behave consistently, training assignment becomes brittle. Employees miss required programs. Former employees remain enrolled. Compliance training drifts out of sync with organizational reality.",{"type":17,"tag":29,"props":207325,"children":207326},{},[207327,207328,207332,207334,207339],{"type":23,"value":25244},{"type":17,"tag":133,"props":207329,"children":207330},{"href":60186},[207331],{"type":23,"value":197036},{"type":23,"value":207333}," avoids that failure mode. It exposes ",{"type":17,"tag":48,"props":207335,"children":207336},{},[207337],{"type":23,"value":207338},"current employee attributes through a normalized, real-time model",{"type":23,"value":207340},", without inventing structure or inferring intent. Assignment logic lives in your product, driven by observable employee state—not vendor-specific assumptions.",{"type":17,"tag":29,"props":207342,"children":207343},{},[207344],{"type":23,"value":207345},"This guide shows how to assign trainings and programs based on employee attributes using Unified's HR & Directory API—fetching employees, segmenting them by department, location, and tenure, and keeping assignments accurate as employee records change.",{"type":17,"tag":68,"props":207347,"children":207349},{"id":207348},"what-this-article-does-and-does-not-cover",[207350],{"type":23,"value":207351},"What this article does (and does not) cover",{"type":17,"tag":29,"props":207353,"children":207354},{},[207355,207356,207361],{"type":23,"value":20751},{"type":17,"tag":48,"props":207357,"children":207358},{},[207359],{"type":23,"value":207360},"assignment logic",{"type":23,"value":207362},", not learning delivery.",{"type":17,"tag":29,"props":207364,"children":207365},{},[207366],{"type":23,"value":203408},{"type":17,"tag":80,"props":207368,"children":207369},{},[207370,207375,207380],{"type":17,"tag":84,"props":207371,"children":207372},{},[207373],{"type":23,"value":207374},"Use HR attributes to determine eligibility for training programs",{"type":17,"tag":84,"props":207376,"children":207377},{},[207378],{"type":23,"value":207379},"Assign and revoke programs as employee attributes change",{"type":17,"tag":84,"props":207381,"children":207382},{},[207383],{"type":23,"value":207384},"Keep assignments aligned with current employment state",{"type":17,"tag":29,"props":207386,"children":207387},{},[207388],{"type":23,"value":203440},{"type":17,"tag":80,"props":207390,"children":207391},{},[207392,207397,207402],{"type":17,"tag":84,"props":207393,"children":207394},{},[207395],{"type":23,"value":207396},"Deliver or track course completion",{"type":17,"tag":84,"props":207398,"children":207399},{},[207400],{"type":23,"value":207401},"Store training content",{"type":17,"tag":84,"props":207403,"children":207404},{},[207405],{"type":23,"value":207406},"Infer employee intent or role criticality",{"type":17,"tag":29,"props":207408,"children":207409},{},[207410],{"type":23,"value":207411},"Unified provides the HR data layer. Training systems consume the assignments.",{"type":17,"tag":68,"props":207413,"children":207415},{"id":207414},"the-mental-model-training-eligibility-is-a-function-of-current-state",[207416],{"type":23,"value":207417},"The mental model: training eligibility is a function of current state",{"type":17,"tag":29,"props":207419,"children":207420},{},[207421,207423,207428],{"type":23,"value":207422},"Training assignment should always be based on ",{"type":17,"tag":48,"props":207424,"children":207425},{},[207426],{"type":23,"value":207427},"current employee attributes",{"type":23,"value":207429},", not historical snapshots.",{"type":17,"tag":29,"props":207431,"children":207432},{},[207433],{"type":23,"value":207434},"At any point in time, an employee has:",{"type":17,"tag":80,"props":207436,"children":207437},{},[207438,207443,207448,207453],{"type":17,"tag":84,"props":207439,"children":207440},{},[207441],{"type":23,"value":207442},"An employment status",{"type":17,"tag":84,"props":207444,"children":207445},{},[207446],{"type":23,"value":207447},"One or more organizational group memberships",{"type":17,"tag":84,"props":207449,"children":207450},{},[207451],{"type":23,"value":207452},"One or more locations",{"type":17,"tag":84,"props":207454,"children":207455},{},[207456],{"type":23,"value":207457},"A tenure relative to their start date",{"type":17,"tag":29,"props":207459,"children":207460},{},[207461],{"type":23,"value":207462},"When any of those change, eligibility must be re-evaluated.",{"type":17,"tag":29,"props":207464,"children":207465},{},[207466],{"type":23,"value":207467},"Unified exposes these attributes explicitly and consistently across HRISs.",{"type":17,"tag":68,"props":207469,"children":207470},{"id":204859},[207471],{"type":23,"value":204862},{"type":17,"tag":239,"props":207473,"children":207474},{"id":206590},[207475,207476,207481],{"type":23,"value":206593},{"type":17,"tag":6121,"props":207477,"children":207479},{"className":207478},[],[207480],{"type":23,"value":206599},{"type":23,"value":12034},{"type":17,"tag":29,"props":207483,"children":207484},{},[207485],{"type":23,"value":207486},"Employees are the decision point for training assignment.",{"type":17,"tag":29,"props":207488,"children":207489},{},[207490],{"type":23,"value":160476},{"type":17,"tag":80,"props":207492,"children":207493},{},[207494,207502,207516,207526,207534,207542,207550,207558,207566,207574],{"type":17,"tag":84,"props":207495,"children":207496},{},[207497],{"type":17,"tag":6121,"props":207498,"children":207500},{"className":207499},[],[207501],{"type":23,"value":18766},{"type":17,"tag":84,"props":207503,"children":207504},{},[207505,207510,207511],{"type":17,"tag":6121,"props":207506,"children":207508},{"className":207507},[],[207509],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":207512,"children":207514},{"className":207513},[],[207515],{"type":23,"value":62341},{"type":17,"tag":84,"props":207517,"children":207518},{},[207519,207524],{"type":17,"tag":6121,"props":207520,"children":207522},{"className":207521},[],[207523],{"type":23,"value":133312},{"type":23,"value":207525}," (work email, where available)",{"type":17,"tag":84,"props":207527,"children":207528},{},[207529],{"type":17,"tag":6121,"props":207530,"children":207532},{"className":207531},[],[207533],{"type":23,"value":206629},{"type":17,"tag":84,"props":207535,"children":207536},{},[207537],{"type":17,"tag":6121,"props":207538,"children":207540},{"className":207539},[],[207541],{"type":23,"value":75514},{"type":17,"tag":84,"props":207543,"children":207544},{},[207545],{"type":17,"tag":6121,"props":207546,"children":207548},{"className":207547},[],[207549],{"type":23,"value":132233},{"type":17,"tag":84,"props":207551,"children":207552},{},[207553],{"type":17,"tag":6121,"props":207554,"children":207556},{"className":207555},[],[207557],{"type":23,"value":201198},{"type":17,"tag":84,"props":207559,"children":207560},{},[207561],{"type":17,"tag":6121,"props":207562,"children":207564},{"className":207563},[],[207565],{"type":23,"value":206704},{"type":17,"tag":84,"props":207567,"children":207568},{},[207569],{"type":17,"tag":6121,"props":207570,"children":207572},{"className":207571},[],[207573],{"type":23,"value":27299},{"type":17,"tag":84,"props":207575,"children":207576},{},[207577],{"type":17,"tag":6121,"props":207578,"children":207580},{"className":207579},[],[207581],{"type":23,"value":25337},{"type":17,"tag":29,"props":207583,"children":207584},{},[207585],{"type":23,"value":194883},{"type":17,"tag":80,"props":207587,"children":207588},{},[207589,207594,207599],{"type":17,"tag":84,"props":207590,"children":207591},{},[207592],{"type":23,"value":207593},"Attributes may be missing or incomplete.",{"type":17,"tag":84,"props":207595,"children":207596},{},[207597],{"type":23,"value":207598},"Employees may belong to multiple groups or locations.",{"type":17,"tag":84,"props":207600,"children":207601},{},[207602],{"type":23,"value":207603},"Start dates reflect hiring, not necessarily role changes.",{"type":17,"tag":239,"props":207605,"children":207606},{"id":206745},[207607,207608,207613],{"type":23,"value":206748},{"type":17,"tag":6121,"props":207609,"children":207611},{"className":207610},[],[207612],{"type":23,"value":206754},{"type":23,"value":12034},{"type":17,"tag":29,"props":207615,"children":207616},{},[207617],{"type":23,"value":207618},"Groups define organizational affiliation.",{"type":17,"tag":29,"props":207620,"children":207621},{},[207622],{"type":23,"value":160476},{"type":17,"tag":80,"props":207624,"children":207625},{},[207626,207634,207642,207650,207658,207666],{"type":17,"tag":84,"props":207627,"children":207628},{},[207629],{"type":17,"tag":6121,"props":207630,"children":207632},{"className":207631},[],[207633],{"type":23,"value":18766},{"type":17,"tag":84,"props":207635,"children":207636},{},[207637],{"type":17,"tag":6121,"props":207638,"children":207640},{"className":207639},[],[207641],{"type":23,"value":18781},{"type":17,"tag":84,"props":207643,"children":207644},{},[207645],{"type":17,"tag":6121,"props":207646,"children":207648},{"className":207647},[],[207649],{"type":23,"value":27310},{"type":17,"tag":84,"props":207651,"children":207652},{},[207653],{"type":17,"tag":6121,"props":207654,"children":207656},{"className":207655},[],[207657],{"type":23,"value":15863},{"type":17,"tag":84,"props":207659,"children":207660},{},[207661],{"type":17,"tag":6121,"props":207662,"children":207664},{"className":207663},[],[207665],{"type":23,"value":62868},{"type":17,"tag":84,"props":207667,"children":207668},{},[207669],{"type":17,"tag":6121,"props":207670,"children":207672},{"className":207671},[],[207673],{"type":23,"value":27299},{"type":17,"tag":29,"props":207675,"children":207676},{},[207677],{"type":23,"value":207678},"Groups are used to assign department- or team-specific trainings. Their semantics are customer-defined and should not be hardcoded.",{"type":17,"tag":239,"props":207680,"children":207681},{"id":206823},[207682,207683,207688],{"type":23,"value":206826},{"type":17,"tag":6121,"props":207684,"children":207686},{"className":207685},[],[207687],{"type":23,"value":206832},{"type":23,"value":12034},{"type":17,"tag":29,"props":207690,"children":207691},{},[207692],{"type":23,"value":207693},"Locations define geographic placement.",{"type":17,"tag":29,"props":207695,"children":207696},{},[207697],{"type":23,"value":160476},{"type":17,"tag":80,"props":207699,"children":207700},{},[207701,207709,207717,207725,207733,207741],{"type":17,"tag":84,"props":207702,"children":207703},{},[207704],{"type":17,"tag":6121,"props":207705,"children":207707},{"className":207706},[],[207708],{"type":23,"value":18766},{"type":17,"tag":84,"props":207710,"children":207711},{},[207712],{"type":17,"tag":6121,"props":207713,"children":207715},{"className":207714},[],[207716],{"type":23,"value":18781},{"type":17,"tag":84,"props":207718,"children":207719},{},[207720],{"type":17,"tag":6121,"props":207721,"children":207723},{"className":207722},[],[207724],{"type":23,"value":206870},{"type":17,"tag":84,"props":207726,"children":207727},{},[207728],{"type":17,"tag":6121,"props":207729,"children":207731},{"className":207730},[],[207732],{"type":23,"value":206879},{"type":17,"tag":84,"props":207734,"children":207735},{},[207736],{"type":17,"tag":6121,"props":207737,"children":207739},{"className":207738},[],[207740],{"type":23,"value":62868},{"type":17,"tag":84,"props":207742,"children":207743},{},[207744],{"type":17,"tag":6121,"props":207745,"children":207747},{"className":207746},[],[207748],{"type":23,"value":27299},{"type":17,"tag":29,"props":207750,"children":207751},{},[207752],{"type":23,"value":207753},"Locations are commonly used for jurisdiction-specific or office-based training requirements.",{"type":17,"tag":239,"props":207755,"children":207756},{"id":206903},[207757,207758,207763],{"type":23,"value":206906},{"type":17,"tag":6121,"props":207759,"children":207761},{"className":207760},[],[207762],{"type":23,"value":206912},{"type":23,"value":12034},{"type":17,"tag":29,"props":207765,"children":207766},{},[207767],{"type":23,"value":207768},"Companies define scope.",{"type":17,"tag":29,"props":207770,"children":207771},{},[207772],{"type":23,"value":160476},{"type":17,"tag":80,"props":207774,"children":207775},{},[207776,207784],{"type":17,"tag":84,"props":207777,"children":207778},{},[207779],{"type":17,"tag":6121,"props":207780,"children":207782},{"className":207781},[],[207783],{"type":23,"value":18766},{"type":17,"tag":84,"props":207785,"children":207786},{},[207787],{"type":17,"tag":6121,"props":207788,"children":207790},{"className":207789},[],[207791],{"type":23,"value":18781},{"type":17,"tag":29,"props":207793,"children":207794},{},[207795],{"type":23,"value":207796},"This allows different training rules per entity or subsidiary.",{"type":17,"tag":68,"props":207798,"children":207800},{"id":207799},"step-1-fetch-employees-incrementally",[207801],{"type":23,"value":207802},"Step 1: Fetch employees incrementally",{"type":17,"tag":29,"props":207804,"children":207805},{},[207806],{"type":23,"value":206957},{"type":17,"tag":6893,"props":207808,"children":207811},{"className":207809,"code":207810,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function fetchEmployees(connectionId: string) {\n  const employees = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.hris.listHrisEmployees({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: [\n        'id',\n        'first_name',\n        'last_name',\n        'emails',\n        'employment_status',\n        'employment_type',\n        'hired_at',\n        'groups',\n        'locations',\n        'company_id',\n      ].join(','),\n    });\n\n    if (!page || page.length === 0) break;\n\n    employees.push(...page);\n    offset += limit;\n  }\n\n  return employees;\n}\n",[207812],{"type":17,"tag":6121,"props":207813,"children":207814},{"__ignoreMap":7},[207815],{"type":23,"value":207810},{"type":17,"tag":29,"props":207817,"children":207818},{},[207819,207820,207825],{"type":23,"value":33722},{"type":17,"tag":6121,"props":207821,"children":207823},{"className":207822},[],[207824],{"type":23,"value":26291},{"type":23,"value":207826}," in production to re-evaluate only changed employees.",{"type":17,"tag":68,"props":207828,"children":207830},{"id":207829},"step-2-filter-eligible-employees",[207831],{"type":23,"value":207832},"Step 2: Filter eligible employees",{"type":17,"tag":29,"props":207834,"children":207835},{},[207836],{"type":23,"value":207837},"Training assignments should never apply to inactive employees.",{"type":17,"tag":6893,"props":207839,"children":207842},{"className":207840,"code":207841,"language":18718,"meta":7},[18716],"function activeEmployees(employees: any[]) {\n  return employees.filter(\n    (e) => e.employment_status === 'ACTIVE'\n  );\n}\n",[207843],{"type":17,"tag":6121,"props":207844,"children":207845},{"__ignoreMap":7},[207846],{"type":23,"value":207841},{"type":17,"tag":29,"props":207848,"children":207849},{},[207850],{"type":23,"value":207851},"Whether to include contractors or interns is a policy decision, not a data constraint.",{"type":17,"tag":68,"props":207853,"children":207855},{"id":207854},"step-3-compute-tenure-based-eligibility",[207856],{"type":23,"value":207857},"Step 3: Compute tenure-based eligibility",{"type":17,"tag":29,"props":207859,"children":207860},{},[207861,207863,207868],{"type":23,"value":207862},"Tenure is derived from ",{"type":17,"tag":6121,"props":207864,"children":207866},{"className":207865},[],[207867],{"type":23,"value":132233},{"type":23,"value":54},{"type":17,"tag":6893,"props":207870,"children":207873},{"className":207871,"code":207872,"language":18718,"meta":7},[18716],"function tenureInDays(employee: any): number | null {\n  if (!employee.hired_at) return null;\n  const hired = new Date(employee.hired_at);\n  const now = new Date();\n  return Math.floor(\n    (now.getTime() - hired.getTime()) / (1000 * 60 * 60 * 24)\n  );\n}\n",[207874],{"type":17,"tag":6121,"props":207875,"children":207876},{"__ignoreMap":7},[207877],{"type":23,"value":207872},{"type":17,"tag":29,"props":207879,"children":207880},{},[207881],{"type":23,"value":207882},"This enables rules such as:",{"type":17,"tag":80,"props":207884,"children":207885},{},[207886,207891],{"type":17,"tag":84,"props":207887,"children":207888},{},[207889],{"type":23,"value":207890},"Onboarding training within first 30 days",{"type":17,"tag":84,"props":207892,"children":207893},{},[207894],{"type":23,"value":207895},"Annual compliance refresh after one year",{"type":17,"tag":68,"props":207897,"children":207899},{"id":207898},"step-4-assign-trainings-by-attribute",[207900],{"type":23,"value":207901},"Step 4: Assign trainings by attribute",{"type":17,"tag":29,"props":207903,"children":207904},{},[207905],{"type":23,"value":207906},"Assignment logic is deterministic and explicit.",{"type":17,"tag":29,"props":207908,"children":207909},{},[207910],{"type":23,"value":377},{"type":17,"tag":239,"props":207912,"children":207914},{"id":207913},"department-based-training",[207915],{"type":23,"value":207916},"Department-based training",{"type":17,"tag":6893,"props":207918,"children":207921},{"className":207919,"code":207920,"language":18718,"meta":7},[18716],"function isInGroup(employee: any, groupId: string): boolean {\n  return (employee.groups ?? []).some((g: any) => g.id === groupId);\n}\n",[207922],{"type":17,"tag":6121,"props":207923,"children":207924},{"__ignoreMap":7},[207925],{"type":23,"value":207920},{"type":17,"tag":239,"props":207927,"children":207929},{"id":207928},"location-based-training",[207930],{"type":23,"value":207931},"Location-based training",{"type":17,"tag":6893,"props":207933,"children":207936},{"className":207934,"code":207935,"language":18718,"meta":7},[18716],"function isInCountry(employee: any, countryCode: string): boolean {\n  return (employee.locations ?? []).some(\n    (l: any) => l.address?.country_code === countryCode\n  );\n}\n",[207937],{"type":17,"tag":6121,"props":207938,"children":207939},{"__ignoreMap":7},[207940],{"type":23,"value":207935},{"type":17,"tag":239,"props":207942,"children":207944},{"id":207943},"tenure-based-training",[207945],{"type":23,"value":207946},"Tenure-based training",{"type":17,"tag":6893,"props":207948,"children":207951},{"className":207949,"code":207950,"language":18718,"meta":7},[18716],"function requiresOnboarding(employee: any): boolean {\n  const days = tenureInDays(employee);\n  return days !== null && days \u003C 30;\n}\n",[207952],{"type":17,"tag":6121,"props":207953,"children":207954},{"__ignoreMap":7},[207955],{"type":23,"value":207950},{"type":17,"tag":29,"props":207957,"children":207958},{},[207959],{"type":23,"value":207960},"Your system can combine these rules to assign one or more programs.",{"type":17,"tag":68,"props":207962,"children":207964},{"id":207963},"step-5-handle-revocation-automatically",[207965],{"type":23,"value":207966},"Step 5: Handle revocation automatically",{"type":17,"tag":29,"props":207968,"children":207969},{},[207970],{"type":23,"value":207971},"Because assignments are driven by current state, revocation is just reassignment.",{"type":17,"tag":29,"props":207973,"children":207974},{},[207975],{"type":23,"value":377},{"type":17,"tag":80,"props":207977,"children":207978},{},[207979,207984,207989],{"type":17,"tag":84,"props":207980,"children":207981},{},[207982],{"type":23,"value":207983},"Employee leaves a department → remove department-specific training",{"type":17,"tag":84,"props":207985,"children":207986},{},[207987],{"type":23,"value":207988},"Employee relocates → assign new regional compliance training",{"type":17,"tag":84,"props":207990,"children":207991},{},[207992],{"type":23,"value":207993},"Employee becomes inactive → disable all assignments",{"type":17,"tag":29,"props":207995,"children":207996},{},[207997],{"type":23,"value":207998},"No HRIS-specific cleanup logic is required.",{"type":17,"tag":68,"props":208000,"children":208002},{"id":208001},"step-6-keep-assignments-in-sync",[208003],{"type":23,"value":208004},"Step 6: Keep assignments in sync",{"type":17,"tag":29,"props":208006,"children":208007},{},[208008],{"type":23,"value":208009},"Unified supports incremental refresh across all HR objects.",{"type":17,"tag":29,"props":208011,"children":208012},{},[208013],{"type":23,"value":204371},{"type":17,"tag":6154,"props":208015,"children":208016},{},[208017,208022,208032,208042],{"type":17,"tag":84,"props":208018,"children":208019},{},[208020],{"type":23,"value":208021},"Initial load",{"type":17,"tag":84,"props":208023,"children":208024},{},[208025,208027],{"type":23,"value":208026},"Persist last ",{"type":17,"tag":6121,"props":208028,"children":208030},{"className":208029},[],[208031],{"type":23,"value":25337},{"type":17,"tag":84,"props":208033,"children":208034},{},[208035,208037],{"type":23,"value":208036},"Re-fetch employees with ",{"type":17,"tag":6121,"props":208038,"children":208040},{"className":208039},[],[208041],{"type":23,"value":26291},{"type":17,"tag":84,"props":208043,"children":208044},{},[208045],{"type":23,"value":208046},"Recompute assignments for changed records only",{"type":17,"tag":29,"props":208048,"children":208049},{},[208050],{"type":23,"value":208051},"This ensures training programs stay aligned without daily full syncs.",{"type":17,"tag":68,"props":208053,"children":208054},{"id":153436},[208055],{"type":23,"value":208056},"What Unified does not assume",{"type":17,"tag":29,"props":208058,"children":208059},{},[208060],{"type":23,"value":104494},{"type":17,"tag":80,"props":208062,"children":208063},{},[208064,208069,208074,208079],{"type":17,"tag":84,"props":208065,"children":208066},{},[208067],{"type":23,"value":208068},"Decide which trainings are required",{"type":17,"tag":84,"props":208070,"children":208071},{},[208072],{"type":23,"value":208073},"Infer role criticality from titles",{"type":17,"tag":84,"props":208075,"children":208076},{},[208077],{"type":23,"value":208078},"Map custom training fields automatically",{"type":17,"tag":84,"props":208080,"children":208081},{},[208082],{"type":23,"value":208083},"Store or manage learning content",{"type":17,"tag":29,"props":208085,"children":208086},{},[208087],{"type":23,"value":208088},"It exposes employee attributes consistently so your product can apply its own rules.",{"type":17,"tag":68,"props":208090,"children":208091},{"id":132938},[208092],{"type":23,"value":136162},{"type":17,"tag":29,"props":208094,"children":208095},{},[208096,208098,208103],{"type":23,"value":208097},"Automated training assignment isn't about syncing HR data. It's about ",{"type":17,"tag":48,"props":208099,"children":208100},{},[208101],{"type":23,"value":208102},"reacting correctly to change",{"type":23,"value":54},{"type":17,"tag":29,"props":208105,"children":208106},{},[208107],{"type":23,"value":208108},"Unified's HR & Directory API gives you a stable, normalized view of employee attributes—department, location, tenure, and status—so training and program assignment stays accurate as organizations evolve.",{"type":17,"tag":29,"props":208110,"children":208111},{},[208112],{"type":23,"value":208113},"With the right rules in place, training becomes adaptive instead of manual.",{"type":17,"tag":29,"props":208115,"children":208116},{},[208117,208118],{"type":23,"value":1609},{"type":17,"tag":133,"props":208119,"children":208121},{"href":1612,"rel":208120},[214],[208122],{"type":23,"value":1616},{"type":17,"tag":29,"props":208124,"children":208125},{},[208126,208127],{"type":23,"value":1609},{"type":17,"tag":133,"props":208128,"children":208130},{"href":1623,"rel":208129},[214],[208131],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":208133},[208134,208135,208136,208142,208143,208144,208145,208150,208151,208152,208153],{"id":207348,"depth":1629,"text":207351},{"id":207414,"depth":1629,"text":207417},{"id":204859,"depth":1629,"text":204862,"children":208137},[208138,208139,208140,208141],{"id":206590,"depth":1635,"text":207267},{"id":206745,"depth":1635,"text":207269},{"id":206823,"depth":1635,"text":207271},{"id":206903,"depth":1635,"text":207273},{"id":207799,"depth":1629,"text":207802},{"id":207829,"depth":1629,"text":207832},{"id":207854,"depth":1629,"text":207857},{"id":207898,"depth":1629,"text":207901,"children":208146},[208147,208148,208149],{"id":207913,"depth":1635,"text":207916},{"id":207928,"depth":1635,"text":207931},{"id":207943,"depth":1635,"text":207946},{"id":207963,"depth":1629,"text":207966},{"id":208001,"depth":1629,"text":208004},{"id":153436,"depth":1629,"text":208056},{"id":132938,"depth":1629,"text":136162},"content:blog:how_to_assign_trainings_and_programs_based_on_employee_attributes_with_unified_hr_and_directory_api.md","blog/how_to_assign_trainings_and_programs_based_on_employee_attributes_with_unified_hr_and_directory_api.md","blog/how_to_assign_trainings_and_programs_based_on_employee_attributes_with_unified_hr_and_directory_api",{"_path":208158,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":208159,"description":208160,"img":208161,"date":206388,"tag":12,"body":208162,"_type":1677,"_id":209142,"_source":1679,"_file":209143,"_stem":209144,"_extension":1682},"/blog/how_to_build_org_charts_and_employee_directories_with_unified_hr_and_directory_api","How to Build Org Charts and Employee Directories with Unified's HR & Directory API","Org charts and employee directories seem simple—until you support more than one HR system.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_org_charts_and_employee_directories_with_unified_hr_and_directory_api-icon.png",{"type":14,"children":208163,"toc":209124},[208164,208169,208172,208179,208183,208188,208193,208216,208221,208238,208243,208249,208254,208296,208308,208312,208322,208327,208331,208434,208438,208461,208471,208476,208480,208531,208555,208560,208570,208575,208579,208649,208661,208671,208676,208680,208716,208728,208732,208736,208745,208756,208762,208767,208776,208781,208787,208799,208808,208813,208831,208837,208842,208851,208863,208869,208874,208883,208888,208894,208899,208971,208983,208989,208994,208998,209032,209042,209048,209052,209075,209087,209091,209096,209101,209106,209115],{"type":17,"tag":18,"props":208165,"children":208167},{"id":208166},"how-to-build-org-charts-and-employee-directories-with-unifieds-hr-directory-api",[208168],{"type":23,"value":208159},{"type":17,"tag":25,"props":208170,"children":208171},{},[],{"type":17,"tag":29,"props":208173,"children":208174},{},[208175],{"type":17,"tag":33,"props":208176,"children":208177},{},[208178],{"type":23,"value":199463},{"type":17,"tag":29,"props":208180,"children":208181},{},[208182],{"type":23,"value":208160},{"type":17,"tag":29,"props":208184,"children":208185},{},[208186],{"type":23,"value":208187},"Every HRIS models organizational structure differently. Some rely on manager relationships. Others emphasize departments or teams. Locations may be first-class objects, loosely attached metadata, or missing entirely. Even when the data exists, it's often incomplete, inconsistent, or encoded with vendor-specific assumptions.",{"type":17,"tag":29,"props":208189,"children":208190},{},[208191],{"type":23,"value":208192},"For a PM or platform engineer, this creates immediate questions:",{"type":17,"tag":80,"props":208194,"children":208195},{},[208196,208201,208206,208211],{"type":17,"tag":84,"props":208197,"children":208198},{},[208199],{"type":23,"value":208200},"Is reporting hierarchy defined by managers, groups, or both?",{"type":17,"tag":84,"props":208202,"children":208203},{},[208204],{"type":23,"value":208205},"Are departments hierarchical or flat?",{"type":17,"tag":84,"props":208207,"children":208208},{},[208209],{"type":23,"value":208210},"Do locations represent offices, regions, or payroll entities?",{"type":17,"tag":84,"props":208212,"children":208213},{},[208214],{"type":23,"value":208215},"How do we keep directories current without re-syncing everything?",{"type":17,"tag":29,"props":208217,"children":208218},{},[208219],{"type":23,"value":208220},"Many products solve this by hardcoding logic per HRIS or forcing a single org model onto all customers. That works early, but breaks as soon as customers expect accuracy across systems.",{"type":17,"tag":29,"props":208222,"children":208223},{},[208224,208225,208229,208231,208236],{"type":23,"value":25244},{"type":17,"tag":133,"props":208226,"children":208227},{"href":60186},[208228],{"type":23,"value":197036},{"type":23,"value":208230}," takes a different approach. It does not invent organizational structure. Instead, it exposes ",{"type":17,"tag":48,"props":208232,"children":208233},{},[208234],{"type":23,"value":208235},"explicit, normalized relationship primitives",{"type":23,"value":208237},"—employees, manager links, groups, locations, and company scope—so you can assemble org charts and directories in a way that matches your product's rules, not a vendor's quirks.",{"type":17,"tag":29,"props":208239,"children":208240},{},[208241],{"type":23,"value":208242},"This guide shows how to build org charts and employee directories using that model: fetching employees, resolving reporting hierarchy, composing group and location dimensions, and keeping everything fresh with incremental updates—without vendor-specific connectors or fragile assumptions.",{"type":17,"tag":68,"props":208244,"children":208246},{"id":208245},"the-mental-model-org-structure-is-not-one-thing",[208247],{"type":23,"value":208248},"The mental model: org structure is not one thing",{"type":17,"tag":29,"props":208250,"children":208251},{},[208252],{"type":23,"value":208253},"Before touching code, it's important to separate three independent dimensions that HR systems often blur together:",{"type":17,"tag":6154,"props":208255,"children":208256},{},[208257,208270,208283],{"type":17,"tag":84,"props":208258,"children":208259},{},[208260,208265,208268],{"type":17,"tag":48,"props":208261,"children":208262},{},[208263],{"type":23,"value":208264},"Reporting hierarchy",{"type":17,"tag":3891,"props":208266,"children":208267},{},[],{"type":23,"value":208269},"Who reports to whom.",{"type":17,"tag":84,"props":208271,"children":208272},{},[208273,208278,208281],{"type":17,"tag":48,"props":208274,"children":208275},{},[208276],{"type":23,"value":208277},"Organizational grouping",{"type":17,"tag":3891,"props":208279,"children":208280},{},[],{"type":23,"value":208282},"Teams, departments, divisions, cost centers.",{"type":17,"tag":84,"props":208284,"children":208285},{},[208286,208291,208294],{"type":17,"tag":48,"props":208287,"children":208288},{},[208289],{"type":23,"value":208290},"Physical or geographic placement",{"type":17,"tag":3891,"props":208292,"children":208293},{},[],{"type":23,"value":208295},"Offices, regions, headquarters.",{"type":17,"tag":29,"props":208297,"children":208298},{},[208299,208301,208306],{"type":23,"value":208300},"Unified keeps these dimensions distinct. Your org chart or directory is built by ",{"type":17,"tag":48,"props":208302,"children":208303},{},[208304],{"type":23,"value":208305},"composing",{"type":23,"value":208307}," them, not by assuming one implies the others.",{"type":17,"tag":68,"props":208309,"children":208310},{"id":204859},[208311],{"type":23,"value":204862},{"type":17,"tag":239,"props":208313,"children":208314},{"id":206590},[208315,208316,208321],{"type":23,"value":206593},{"type":17,"tag":6121,"props":208317,"children":208319},{"className":208318},[],[208320],{"type":23,"value":206599},{"type":23,"value":12034},{"type":17,"tag":29,"props":208323,"children":208324},{},[208325],{"type":23,"value":208326},"Employees are the anchor for all org views.",{"type":17,"tag":29,"props":208328,"children":208329},{},[208330],{"type":23,"value":160476},{"type":17,"tag":80,"props":208332,"children":208333},{},[208334,208342,208362,208370,208378,208386,208400,208408,208416,208424],{"type":17,"tag":84,"props":208335,"children":208336},{},[208337],{"type":17,"tag":6121,"props":208338,"children":208340},{"className":208339},[],[208341],{"type":23,"value":18766},{"type":17,"tag":84,"props":208343,"children":208344},{},[208345,208350,208351,208356,208357],{"type":17,"tag":6121,"props":208346,"children":208348},{"className":208347},[],[208349],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":208352,"children":208354},{"className":208353},[],[208355],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":208358,"children":208360},{"className":208359},[],[208361],{"type":23,"value":62341},{"type":17,"tag":84,"props":208363,"children":208364},{},[208365],{"type":17,"tag":6121,"props":208366,"children":208368},{"className":208367},[],[208369],{"type":23,"value":62346},{"type":17,"tag":84,"props":208371,"children":208372},{},[208373],{"type":17,"tag":6121,"props":208374,"children":208376},{"className":208375},[],[208377],{"type":23,"value":136506},{"type":17,"tag":84,"props":208379,"children":208380},{},[208381],{"type":17,"tag":6121,"props":208382,"children":208384},{"className":208383},[],[208385],{"type":23,"value":206629},{"type":17,"tag":84,"props":208387,"children":208388},{},[208389,208394,208395],{"type":17,"tag":6121,"props":208390,"children":208392},{"className":208391},[],[208393],{"type":23,"value":132233},{"type":23,"value":11826},{"type":17,"tag":6121,"props":208396,"children":208398},{"className":208397},[],[208399],{"type":23,"value":206687},{"type":17,"tag":84,"props":208401,"children":208402},{},[208403],{"type":17,"tag":6121,"props":208404,"children":208406},{"className":208405},[],[208407],{"type":23,"value":201198},{"type":17,"tag":84,"props":208409,"children":208410},{},[208411],{"type":17,"tag":6121,"props":208412,"children":208414},{"className":208413},[],[208415],{"type":23,"value":206704},{"type":17,"tag":84,"props":208417,"children":208418},{},[208419],{"type":17,"tag":6121,"props":208420,"children":208422},{"className":208421},[],[208423],{"type":23,"value":27299},{"type":17,"tag":84,"props":208425,"children":208426},{},[208427,208432],{"type":17,"tag":6121,"props":208428,"children":208430},{"className":208429},[],[208431],{"type":23,"value":62380},{"type":23,"value":208433}," (expires after one hour)",{"type":17,"tag":29,"props":208435,"children":208436},{},[208437],{"type":23,"value":194883},{"type":17,"tag":80,"props":208439,"children":208440},{},[208441,208451,208456],{"type":17,"tag":84,"props":208442,"children":208443},{},[208444,208449],{"type":17,"tag":6121,"props":208445,"children":208447},{"className":208446},[],[208448],{"type":23,"value":136506},{"type":23,"value":208450}," may be missing.",{"type":17,"tag":84,"props":208452,"children":208453},{},[208454],{"type":23,"value":208455},"Some employees belong to multiple groups or locations.",{"type":17,"tag":84,"props":208457,"children":208458},{},[208459],{"type":23,"value":208460},"Some HRISs do not enforce strict hierarchy.",{"type":17,"tag":239,"props":208462,"children":208463},{"id":206745},[208464,208465,208470],{"type":23,"value":206748},{"type":17,"tag":6121,"props":208466,"children":208468},{"className":208467},[],[208469],{"type":23,"value":206754},{"type":23,"value":12034},{"type":17,"tag":29,"props":208472,"children":208473},{},[208474],{"type":23,"value":208475},"Groups represent organizational units such as teams or departments.",{"type":17,"tag":29,"props":208477,"children":208478},{},[208479],{"type":23,"value":160476},{"type":17,"tag":80,"props":208481,"children":208482},{},[208483,208491,208499,208507,208515,208523],{"type":17,"tag":84,"props":208484,"children":208485},{},[208486],{"type":17,"tag":6121,"props":208487,"children":208489},{"className":208488},[],[208490],{"type":23,"value":18766},{"type":17,"tag":84,"props":208492,"children":208493},{},[208494],{"type":17,"tag":6121,"props":208495,"children":208497},{"className":208496},[],[208498],{"type":23,"value":18781},{"type":17,"tag":84,"props":208500,"children":208501},{},[208502],{"type":17,"tag":6121,"props":208503,"children":208505},{"className":208504},[],[208506],{"type":23,"value":15863},{"type":17,"tag":84,"props":208508,"children":208509},{},[208510],{"type":17,"tag":6121,"props":208511,"children":208513},{"className":208512},[],[208514],{"type":23,"value":27310},{"type":17,"tag":84,"props":208516,"children":208517},{},[208518],{"type":17,"tag":6121,"props":208519,"children":208521},{"className":208520},[],[208522],{"type":23,"value":62868},{"type":17,"tag":84,"props":208524,"children":208525},{},[208526],{"type":17,"tag":6121,"props":208527,"children":208529},{"className":208528},[],[208530],{"type":23,"value":27299},{"type":17,"tag":29,"props":208532,"children":208533},{},[208534,208536,208541,208542,208547,208549,208554],{"type":23,"value":208535},"Groups form a ",{"type":17,"tag":48,"props":208537,"children":208538},{},[208539],{"type":23,"value":208540},"hierarchical graph",{"type":23,"value":205963},{"type":17,"tag":6121,"props":208543,"children":208545},{"className":208544},[],[208546],{"type":23,"value":15863},{"type":23,"value":208548},". Their meaning is customer-defined. You should not hardcode 'department' semantics based on ",{"type":17,"tag":6121,"props":208550,"children":208552},{"className":208551},[],[208553],{"type":23,"value":27310},{"type":23,"value":54},{"type":17,"tag":29,"props":208556,"children":208557},{},[208558],{"type":23,"value":208559},"Employee → group membership should be treated as authoritative. Group → user backreferences may be incomplete and should not be assumed.",{"type":17,"tag":239,"props":208561,"children":208562},{"id":206823},[208563,208564,208569],{"type":23,"value":206826},{"type":17,"tag":6121,"props":208565,"children":208567},{"className":208566},[],[208568],{"type":23,"value":206832},{"type":23,"value":12034},{"type":17,"tag":29,"props":208571,"children":208572},{},[208573],{"type":23,"value":208574},"Locations represent physical or geographic placement.",{"type":17,"tag":29,"props":208576,"children":208577},{},[208578],{"type":23,"value":160476},{"type":17,"tag":80,"props":208580,"children":208581},{},[208582,208590,208598,208606,208616,208624,208632,208641],{"type":17,"tag":84,"props":208583,"children":208584},{},[208585],{"type":17,"tag":6121,"props":208586,"children":208588},{"className":208587},[],[208589],{"type":23,"value":18766},{"type":17,"tag":84,"props":208591,"children":208592},{},[208593],{"type":17,"tag":6121,"props":208594,"children":208596},{"className":208595},[],[208597],{"type":23,"value":18781},{"type":17,"tag":84,"props":208599,"children":208600},{},[208601],{"type":17,"tag":6121,"props":208602,"children":208604},{"className":208603},[],[208605],{"type":23,"value":15863},{"type":17,"tag":84,"props":208607,"children":208608},{},[208609,208614],{"type":17,"tag":6121,"props":208610,"children":208612},{"className":208611},[],[208613],{"type":23,"value":62370},{"type":23,"value":208615}," (city, region, country)",{"type":17,"tag":84,"props":208617,"children":208618},{},[208619],{"type":17,"tag":6121,"props":208620,"children":208622},{"className":208621},[],[208623],{"type":23,"value":22305},{"type":17,"tag":84,"props":208625,"children":208626},{},[208627],{"type":17,"tag":6121,"props":208628,"children":208630},{"className":208629},[],[208631],{"type":23,"value":62868},{"type":17,"tag":84,"props":208633,"children":208634},{},[208635],{"type":17,"tag":6121,"props":208636,"children":208638},{"className":208637},[],[208639],{"type":23,"value":208640},"is_hq",{"type":17,"tag":84,"props":208642,"children":208643},{},[208644],{"type":17,"tag":6121,"props":208645,"children":208647},{"className":208646},[],[208648],{"type":23,"value":27299},{"type":17,"tag":29,"props":208650,"children":208651},{},[208652,208654,208659],{"type":23,"value":208653},"Some HRISs model location hierarchies (campus → building). Others do not. Treat ",{"type":17,"tag":6121,"props":208655,"children":208657},{"className":208656},[],[208658],{"type":23,"value":15863},{"type":23,"value":208660}," as optional.",{"type":17,"tag":239,"props":208662,"children":208663},{"id":206903},[208664,208665,208670],{"type":23,"value":206906},{"type":17,"tag":6121,"props":208666,"children":208668},{"className":208667},[],[208669],{"type":23,"value":206912},{"type":23,"value":12034},{"type":17,"tag":29,"props":208672,"children":208673},{},[208674],{"type":23,"value":208675},"Companies provide scoping for multi-entity organizations.",{"type":17,"tag":29,"props":208677,"children":208678},{},[208679],{"type":23,"value":160476},{"type":17,"tag":80,"props":208681,"children":208682},{},[208683,208691,208699,208708],{"type":17,"tag":84,"props":208684,"children":208685},{},[208686],{"type":17,"tag":6121,"props":208687,"children":208689},{"className":208688},[],[208690],{"type":23,"value":18766},{"type":17,"tag":84,"props":208692,"children":208693},{},[208694],{"type":17,"tag":6121,"props":208695,"children":208697},{"className":208696},[],[208698],{"type":23,"value":18781},{"type":17,"tag":84,"props":208700,"children":208701},{},[208702],{"type":17,"tag":6121,"props":208703,"children":208705},{"className":208704},[],[208706],{"type":23,"value":208707},"legal_name",{"type":17,"tag":84,"props":208709,"children":208710},{},[208711],{"type":17,"tag":6121,"props":208712,"children":208714},{"className":208713},[],[208715],{"type":23,"value":62370},{"type":17,"tag":29,"props":208717,"children":208718},{},[208719,208721,208726],{"type":23,"value":208720},"Employees, groups, and locations all reference ",{"type":17,"tag":6121,"props":208722,"children":208724},{"className":208723},[],[208725],{"type":23,"value":27299},{"type":23,"value":208727},". This allows you to build org charts per entity without assuming a single global org.",{"type":17,"tag":68,"props":208729,"children":208730},{"id":207799},[208731],{"type":23,"value":207802},{"type":17,"tag":29,"props":208733,"children":208734},{},[208735],{"type":23,"value":206957},{"type":17,"tag":6893,"props":208737,"children":208740},{"className":208738,"code":208739,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function fetchEmployees(connectionId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.hris.listHrisEmployees({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: [\n        'id',\n        'first_name',\n        'last_name',\n        'title',\n        'manager_id',\n        'employment_status',\n        'terminated_at',\n        'groups',\n        'locations',\n        'company_id',\n        'image_url',\n      ].join(','),\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[208741],{"type":17,"tag":6121,"props":208742,"children":208743},{"__ignoreMap":7},[208744],{"type":23,"value":208739},{"type":17,"tag":29,"props":208746,"children":208747},{},[208748,208749,208754],{"type":23,"value":33722},{"type":17,"tag":6121,"props":208750,"children":208752},{"className":208751},[],[208753],{"type":23,"value":26291},{"type":23,"value":208755}," to refresh only changed records after the initial load.",{"type":17,"tag":68,"props":208757,"children":208759},{"id":208758},"step-2-filter-active-employees",[208760],{"type":23,"value":208761},"Step 2: Filter active employees",{"type":17,"tag":29,"props":208763,"children":208764},{},[208765],{"type":23,"value":208766},"Directories and org charts typically exclude terminated staff.",{"type":17,"tag":6893,"props":208768,"children":208771},{"className":208769,"code":208770,"language":18718,"meta":7},[18716],"function filterActive(employees: any[]) {\n  return employees.filter(\n    (e) => e.employment_status === 'ACTIVE' && !e.terminated_at\n  );\n}\n",[208772],{"type":17,"tag":6121,"props":208773,"children":208774},{"__ignoreMap":7},[208775],{"type":23,"value":208770},{"type":17,"tag":29,"props":208777,"children":208778},{},[208779],{"type":23,"value":208780},"Whether to include recent terminations is a product decision, not a data guarantee.",{"type":17,"tag":68,"props":208782,"children":208784},{"id":208783},"step-3-build-the-reporting-hierarchy",[208785],{"type":23,"value":208786},"Step 3: Build the reporting hierarchy",{"type":17,"tag":29,"props":208788,"children":208789},{},[208790,208792,208797],{"type":23,"value":208791},"Org charts are built from ",{"type":17,"tag":6121,"props":208793,"children":208795},{"className":208794},[],[208796],{"type":23,"value":136506},{"type":23,"value":208798}," references.",{"type":17,"tag":6893,"props":208800,"children":208803},{"className":208801,"code":208802,"language":18718,"meta":7},[18716],"function buildManagerTree(employees: any[]) {\n  const byId = new Map\u003Cstring, any>();\n  const roots: any[] = [];\n\n  for (const e of employees) {\n    if (e.id) byId.set(e.id, { ...e, reports: [] });\n  }\n\n  for (const e of byId.values()) {\n    if (e.manager_id && byId.has(e.manager_id)) {\n      byId.get(e.manager_id).reports.push(e);\n    } else {\n      roots.push(e);\n    }\n  }\n\n  return roots;\n}\n",[208804],{"type":17,"tag":6121,"props":208805,"children":208806},{"__ignoreMap":7},[208807],{"type":23,"value":208802},{"type":17,"tag":29,"props":208809,"children":208810},{},[208811],{"type":23,"value":208812},"Important guardrails:",{"type":17,"tag":80,"props":208814,"children":208815},{},[208816,208821,208826],{"type":17,"tag":84,"props":208817,"children":208818},{},[208819],{"type":23,"value":208820},"Employees without a valid manager become roots.",{"type":17,"tag":84,"props":208822,"children":208823},{},[208824],{"type":23,"value":208825},"Circular references may exist in some HRISs. Your UI should tolerate them.",{"type":17,"tag":84,"props":208827,"children":208828},{},[208829],{"type":23,"value":208830},"Do not assume a single root node.",{"type":17,"tag":68,"props":208832,"children":208834},{"id":208833},"step-4-fetch-and-index-groups",[208835],{"type":23,"value":208836},"Step 4: Fetch and index groups",{"type":17,"tag":29,"props":208838,"children":208839},{},[208840],{"type":23,"value":208841},"Groups define organizational units independent of reporting lines.",{"type":17,"tag":6893,"props":208843,"children":208846},{"className":208844,"code":208845,"language":18718,"meta":7},[18716],"async function fetchGroups(connectionId: string) {\n  return await sdk.hris.listHrisGroups({\n    connectionId,\n    limit: 100,\n    offset: 0,\n    fields: 'id,name,parent_id,type,is_active,company_id',\n  });\n}\n",[208847],{"type":17,"tag":6121,"props":208848,"children":208849},{"__ignoreMap":7},[208850],{"type":23,"value":208845},{"type":17,"tag":29,"props":208852,"children":208853},{},[208854,208856,208861],{"type":23,"value":208855},"Build a group tree using ",{"type":17,"tag":6121,"props":208857,"children":208859},{"className":208858},[],[208860],{"type":23,"value":15863},{"type":23,"value":208862}," if present. Do not assume group membership implies hierarchy.",{"type":17,"tag":68,"props":208864,"children":208866},{"id":208865},"step-5-fetch-and-index-locations",[208867],{"type":23,"value":208868},"Step 5: Fetch and index locations",{"type":17,"tag":29,"props":208870,"children":208871},{},[208872],{"type":23,"value":208873},"Locations enable directory views by geography.",{"type":17,"tag":6893,"props":208875,"children":208878},{"className":208876,"code":208877,"language":18718,"meta":7},[18716],"async function fetchLocations(connectionId: string) {\n  return await sdk.hris.listHrisLocations({\n    connectionId,\n    limit: 100,\n    offset: 0,\n    fields: 'id,name,parent_id,address,is_active,is_hq,company_id,timezone',\n  });\n}\n",[208879],{"type":17,"tag":6121,"props":208880,"children":208881},{"__ignoreMap":7},[208882],{"type":23,"value":208877},{"type":17,"tag":29,"props":208884,"children":208885},{},[208886],{"type":23,"value":208887},"Use location address fields for filters like city, region, or country. Expect missing or partial data.",{"type":17,"tag":68,"props":208889,"children":208891},{"id":208890},"step-6-assemble-directory-views",[208892],{"type":23,"value":208893},"Step 6: Assemble directory views",{"type":17,"tag":29,"props":208895,"children":208896},{},[208897],{"type":23,"value":208898},"At this point, you can construct directories by composing dimensions:",{"type":17,"tag":80,"props":208900,"children":208901},{},[208902,208921,208941,208958],{"type":17,"tag":84,"props":208903,"children":208904},{},[208905,208910,208913,208915],{"type":17,"tag":48,"props":208906,"children":208907},{},[208908],{"type":23,"value":208909},"By team or department",{"type":17,"tag":3891,"props":208911,"children":208912},{},[],{"type":23,"value":208914},"Filter employees by ",{"type":17,"tag":6121,"props":208916,"children":208918},{"className":208917},[],[208919],{"type":23,"value":208920},"groups[].id",{"type":17,"tag":84,"props":208922,"children":208923},{},[208924,208929,208932,208933,208939],{"type":17,"tag":48,"props":208925,"children":208926},{},[208927],{"type":23,"value":208928},"By location",{"type":17,"tag":3891,"props":208930,"children":208931},{},[],{"type":23,"value":208914},{"type":17,"tag":6121,"props":208934,"children":208936},{"className":208935},[],[208937],{"type":23,"value":208938},"locations[].id",{"type":23,"value":208940}," or address fields",{"type":17,"tag":84,"props":208942,"children":208943},{},[208944,208949,208952,208953],{"type":17,"tag":48,"props":208945,"children":208946},{},[208947],{"type":23,"value":208948},"By company",{"type":17,"tag":3891,"props":208950,"children":208951},{},[],{"type":23,"value":208914},{"type":17,"tag":6121,"props":208954,"children":208956},{"className":208955},[],[208957],{"type":23,"value":27299},{"type":17,"tag":84,"props":208959,"children":208960},{},[208961,208966,208969],{"type":17,"tag":48,"props":208962,"children":208963},{},[208964],{"type":23,"value":208965},"By manager",{"type":17,"tag":3891,"props":208967,"children":208968},{},[],{"type":23,"value":208970},"Use the reporting tree",{"type":17,"tag":29,"props":208972,"children":208973},{},[208974,208976,208981],{"type":23,"value":208975},"Because all list endpoints support ",{"type":17,"tag":6121,"props":208977,"children":208979},{"className":208978},[],[208980],{"type":23,"value":48368},{"type":23,"value":208982},", you can layer search on top without vendor-specific logic.",{"type":17,"tag":68,"props":208984,"children":208986},{"id":208985},"step-7-keep-directories-fresh",[208987],{"type":23,"value":208988},"Step 7: Keep directories fresh",{"type":17,"tag":29,"props":208990,"children":208991},{},[208992],{"type":23,"value":208993},"Unified supports incremental refresh across all objects.",{"type":17,"tag":29,"props":208995,"children":208996},{},[208997],{"type":23,"value":204371},{"type":17,"tag":6154,"props":208999,"children":209000},{},[209001,209006,209017,209027],{"type":17,"tag":84,"props":209002,"children":209003},{},[209004],{"type":23,"value":209005},"Initial full load",{"type":17,"tag":84,"props":209007,"children":209008},{},[209009,209010,209015],{"type":23,"value":128847},{"type":17,"tag":6121,"props":209011,"children":209013},{"className":209012},[],[209014],{"type":23,"value":25337},{"type":23,"value":209016}," watermark",{"type":17,"tag":84,"props":209018,"children":209019},{},[209020,209022],{"type":23,"value":209021},"Periodically re-fetch with ",{"type":17,"tag":6121,"props":209023,"children":209025},{"className":209024},[],[209026],{"type":23,"value":26291},{"type":17,"tag":84,"props":209028,"children":209029},{},[209030],{"type":23,"value":209031},"Update local indexes",{"type":17,"tag":29,"props":209033,"children":209034},{},[209035,209037,209041],{"type":23,"value":209036},"This avoids full resyncs and works even without ",{"type":17,"tag":133,"props":209038,"children":209039},{"href":4999},[209040],{"type":23,"value":5002},{"type":23,"value":54},{"type":17,"tag":68,"props":209043,"children":209045},{"id":209044},"what-unified-does-not-assume-by-design",[209046],{"type":23,"value":209047},"What Unified does not assume (by design)",{"type":17,"tag":29,"props":209049,"children":209050},{},[209051],{"type":23,"value":104494},{"type":17,"tag":80,"props":209053,"children":209054},{},[209055,209060,209065,209070],{"type":17,"tag":84,"props":209056,"children":209057},{},[209058],{"type":23,"value":209059},"Enforce a single org hierarchy",{"type":17,"tag":84,"props":209061,"children":209062},{},[209063],{"type":23,"value":209064},"Infer departments from titles",{"type":17,"tag":84,"props":209066,"children":209067},{},[209068],{"type":23,"value":209069},"Normalize incomplete HR data",{"type":17,"tag":84,"props":209071,"children":209072},{},[209073],{"type":23,"value":209074},"Guarantee manager relationships exist",{"type":17,"tag":29,"props":209076,"children":209077},{},[209078,209080,209085],{"type":23,"value":209079},"It exposes structure ",{"type":17,"tag":48,"props":209081,"children":209082},{},[209083],{"type":23,"value":209084},"as it exists",{"type":23,"value":209086},", with consistent shapes and relationships, so your product can apply its own rules transparently.",{"type":17,"tag":68,"props":209088,"children":209089},{"id":132938},[209090],{"type":23,"value":136162},{"type":17,"tag":29,"props":209092,"children":209093},{},[209094],{"type":23,"value":209095},"Org charts and employee directories aren't a visualization problem. They're a data modeling problem.",{"type":17,"tag":29,"props":209097,"children":209098},{},[209099],{"type":23,"value":209100},"Unified's HR & Directory API gives you the primitives to model organizational structure correctly across HRISs: explicit manager links, hierarchical groups, locations, and company scope—retrieved through a consistent, incremental, and vendor-agnostic interface.",{"type":17,"tag":29,"props":209102,"children":209103},{},[209104],{"type":23,"value":209105},"Once those semantics are stable, building org charts and directories becomes straightforward—and scalable across every HR system your customers use.",{"type":17,"tag":29,"props":209107,"children":209108},{},[209109,209110],{"type":23,"value":1609},{"type":17,"tag":133,"props":209111,"children":209113},{"href":1612,"rel":209112},[214],[209114],{"type":23,"value":1616},{"type":17,"tag":29,"props":209116,"children":209117},{},[209118,209119],{"type":23,"value":1609},{"type":17,"tag":133,"props":209120,"children":209122},{"href":1623,"rel":209121},[214],[209123],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":209125},[209126,209127,209133,209134,209135,209136,209137,209138,209139,209140,209141],{"id":208245,"depth":1629,"text":208248},{"id":204859,"depth":1629,"text":204862,"children":209128},[209129,209130,209131,209132],{"id":206590,"depth":1635,"text":207267},{"id":206745,"depth":1635,"text":207269},{"id":206823,"depth":1635,"text":207271},{"id":206903,"depth":1635,"text":207273},{"id":207799,"depth":1629,"text":207802},{"id":208758,"depth":1629,"text":208761},{"id":208783,"depth":1629,"text":208786},{"id":208833,"depth":1629,"text":208836},{"id":208865,"depth":1629,"text":208868},{"id":208890,"depth":1629,"text":208893},{"id":208985,"depth":1629,"text":208988},{"id":209044,"depth":1629,"text":209047},{"id":132938,"depth":1629,"text":136162},"content:blog:how_to_build_org_charts_and_employee_directories_with_unified_hr_and_directory_api.md","blog/how_to_build_org_charts_and_employee_directories_with_unified_hr_and_directory_api.md","blog/how_to_build_org_charts_and_employee_directories_with_unified_hr_and_directory_api",{"_path":209146,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":209147,"description":209148,"img":209149,"date":206388,"tag":12,"body":209150,"_type":1677,"_id":210091,"_source":1679,"_file":210092,"_stem":210093,"_extension":1682},"/blog/how_to_forecast_headcount_and_hiring_needs_with_unified_hr_and_directory_api","How to Forecast Headcount and Hiring Needs with Unified's HR & Directory API","Headcount forecasting fails when teams don't agree on what 'headcount' actually means.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_forecast_headcount_and_hiring_needs_with_unified_hr_and_directory_api-icon.png",{"type":14,"children":209151,"toc":210070},[209152,209157,209160,209167,209171,209176,209181,209204,209209,209226,209231,209237,209248,209252,209270,209274,209292,209297,209303,209315,209320,209333,209338,209374,209379,209383,209393,209398,209402,209477,209481,209504,209514,209519,209523,209574,209579,209589,209594,209598,209643,209648,209658,209662,209666,209685,209690,209694,209705,209714,209719,209725,209730,209735,209757,209766,209771,209789,209794,209800,209805,209809,209856,209861,209867,209872,209878,209887,209893,209902,209907,209913,209917,209921,209953,209958,209962,209966,209989,209994,210000,210005,210028,210033,210037,210042,210047,210052,210061],{"type":17,"tag":18,"props":209153,"children":209155},{"id":209154},"how-to-forecast-headcount-and-hiring-needs-with-unifieds-hr-directory-api",[209156],{"type":23,"value":209147},{"type":17,"tag":25,"props":209158,"children":209159},{},[],{"type":17,"tag":29,"props":209161,"children":209162},{},[209163],{"type":17,"tag":33,"props":209164,"children":209165},{},[209166],{"type":23,"value":199463},{"type":17,"tag":29,"props":209168,"children":209169},{},[209170],{"type":23,"value":209148},{"type":17,"tag":29,"props":209172,"children":209173},{},[209174],{"type":23,"value":209175},"Across HR systems, workforce size is modeled inconsistently. Some platforms treat contractors as employees. Others exclude interns or seasonal workers. Employment start dates, termination timing, and organizational attribution vary widely. In many systems, historical changes are reconstructed indirectly or inferred from payroll or provisioning data—often incorrectly.",{"type":17,"tag":29,"props":209177,"children":209178},{},[209179],{"type":23,"value":209180},"For a PM or FP&A team, this creates immediate risk:",{"type":17,"tag":80,"props":209182,"children":209183},{},[209184,209189,209194,209199],{"type":17,"tag":84,"props":209185,"children":209186},{},[209187],{"type":23,"value":209188},"Who counts as headcount today?",{"type":17,"tag":84,"props":209190,"children":209191},{},[209192],{"type":23,"value":209193},"When did growth or attrition actually occur?",{"type":17,"tag":84,"props":209195,"children":209196},{},[209197],{"type":23,"value":209198},"Are changes tied to departments, locations, or companies consistently?",{"type":17,"tag":84,"props":209200,"children":209201},{},[209202],{"type":23,"value":209203},"Can forecasts be explained and defended when numbers are questioned?",{"type":17,"tag":29,"props":209205,"children":209206},{},[209207],{"type":23,"value":209208},"Many products attempt to solve this by inventing 'employment history' models or extrapolating from adjacent data like payroll or benefits. That works until customers audit the numbers or compare results across HR systems.",{"type":17,"tag":29,"props":209210,"children":209211},{},[209212,209213,209217,209219,209224],{"type":23,"value":25244},{"type":17,"tag":133,"props":209214,"children":209215},{"href":60186},[209216],{"type":23,"value":197036},{"type":23,"value":209218}," takes a stricter approach. It does not predict hiring outcomes or infer workforce changes. Instead, it exposes ",{"type":17,"tag":48,"props":209220,"children":209221},{},[209222],{"type":23,"value":209223},"observable employment state and change",{"type":23,"value":209225},"—employees, employment status, start and end dates, and organizational attribution—through a normalized, real-time interface.",{"type":17,"tag":29,"props":209227,"children":209228},{},[209229],{"type":23,"value":209230},"This guide shows how to build a defensible headcount baseline and hiring trend analysis on top of that model. The output isn't a prediction engine. It's a clean, auditable foundation that forecasting tools depend on.",{"type":17,"tag":68,"props":209232,"children":209234},{"id":209233},"what-forecasting-means-in-this-context",[209235],{"type":23,"value":209236},"What 'forecasting' means in this context",{"type":17,"tag":29,"props":209238,"children":209239},{},[209240,209241,209246],{"type":23,"value":20751},{"type":17,"tag":48,"props":209242,"children":209243},{},[209244],{"type":23,"value":209245},"enabling",{"type":23,"value":209247}," forecasting, not performing it.",{"type":17,"tag":29,"props":209249,"children":209250},{},[209251],{"type":23,"value":203408},{"type":17,"tag":80,"props":209253,"children":209254},{},[209255,209260,209265],{"type":17,"tag":84,"props":209256,"children":209257},{},[209258],{"type":23,"value":209259},"Establish current headcount accurately",{"type":17,"tag":84,"props":209261,"children":209262},{},[209263],{"type":23,"value":209264},"Measure observed changes over time (hires and exits)",{"type":17,"tag":84,"props":209266,"children":209267},{},[209268],{"type":23,"value":209269},"Segment headcount by department, location, and employment type",{"type":17,"tag":29,"props":209271,"children":209272},{},[209273],{"type":23,"value":203440},{"type":17,"tag":80,"props":209275,"children":209276},{},[209277,209282,209287],{"type":17,"tag":84,"props":209278,"children":209279},{},[209280],{"type":23,"value":209281},"Predict future hires automatically",{"type":17,"tag":84,"props":209283,"children":209284},{},[209285],{"type":23,"value":209286},"Infer compensation or capacity",{"type":17,"tag":84,"props":209288,"children":209289},{},[209290],{"type":23,"value":209291},"Reconstruct undocumented employment history",{"type":17,"tag":29,"props":209293,"children":209294},{},[209295],{"type":23,"value":209296},"Those decisions belong in your planning models, not the integration layer.",{"type":17,"tag":68,"props":209298,"children":209300},{"id":209299},"the-mental-model-headcount-is-time-bound",[209301],{"type":23,"value":209302},"The mental model: headcount is time-bound",{"type":17,"tag":29,"props":209304,"children":209305},{},[209306,209308,209313],{"type":23,"value":209307},"Headcount is not a static count of records. It is a ",{"type":17,"tag":48,"props":209309,"children":209310},{},[209311],{"type":23,"value":209312},"time-bound property",{"type":23,"value":209314}," of employees.",{"type":17,"tag":29,"props":209316,"children":209317},{},[209318],{"type":23,"value":209319},"At any point in time, an employee is either:",{"type":17,"tag":80,"props":209321,"children":209322},{},[209323,209328],{"type":17,"tag":84,"props":209324,"children":209325},{},[209326],{"type":23,"value":209327},"Employed",{"type":17,"tag":84,"props":209329,"children":209330},{},[209331],{"type":23,"value":209332},"Not employed",{"type":17,"tag":29,"props":209334,"children":209335},{},[209336],{"type":23,"value":209337},"Changes occur at discrete moments:",{"type":17,"tag":80,"props":209339,"children":209340},{},[209341,209352,209363],{"type":17,"tag":84,"props":209342,"children":209343},{},[209344,209346,209351],{"type":23,"value":209345},"Hiring (",{"type":17,"tag":6121,"props":209347,"children":209349},{"className":209348},[],[209350],{"type":23,"value":132233},{"type":23,"value":12034},{"type":17,"tag":84,"props":209353,"children":209354},{},[209355,209357,209362],{"type":23,"value":209356},"Termination (",{"type":17,"tag":6121,"props":209358,"children":209360},{"className":209359},[],[209361],{"type":23,"value":206687},{"type":23,"value":12034},{"type":17,"tag":84,"props":209364,"children":209365},{},[209366,209368,209373],{"type":23,"value":209367},"Status transitions (",{"type":17,"tag":6121,"props":209369,"children":209371},{"className":209370},[],[209372],{"type":23,"value":206629},{"type":23,"value":12034},{"type":17,"tag":29,"props":209375,"children":209376},{},[209377],{"type":23,"value":209378},"Unified exposes those moments explicitly. Your forecasting logic should build on them, not guess around them.",{"type":17,"tag":68,"props":209380,"children":209381},{"id":204859},[209382],{"type":23,"value":204862},{"type":17,"tag":239,"props":209384,"children":209385},{"id":206590},[209386,209387,209392],{"type":23,"value":206593},{"type":17,"tag":6121,"props":209388,"children":209390},{"className":209389},[],[209391],{"type":23,"value":206599},{"type":23,"value":12034},{"type":17,"tag":29,"props":209394,"children":209395},{},[209396],{"type":23,"value":209397},"Employees are the source of truth for headcount state and change.",{"type":17,"tag":29,"props":209399,"children":209400},{},[209401],{"type":23,"value":160476},{"type":17,"tag":80,"props":209403,"children":209404},{},[209405,209413,209421,209429,209437,209445,209453,209461,209469],{"type":17,"tag":84,"props":209406,"children":209407},{},[209408],{"type":17,"tag":6121,"props":209409,"children":209411},{"className":209410},[],[209412],{"type":23,"value":18766},{"type":17,"tag":84,"props":209414,"children":209415},{},[209416],{"type":17,"tag":6121,"props":209417,"children":209419},{"className":209418},[],[209420],{"type":23,"value":206629},{"type":17,"tag":84,"props":209422,"children":209423},{},[209424],{"type":17,"tag":6121,"props":209425,"children":209427},{"className":209426},[],[209428],{"type":23,"value":75514},{"type":17,"tag":84,"props":209430,"children":209431},{},[209432],{"type":17,"tag":6121,"props":209433,"children":209435},{"className":209434},[],[209436],{"type":23,"value":132233},{"type":17,"tag":84,"props":209438,"children":209439},{},[209440],{"type":17,"tag":6121,"props":209441,"children":209443},{"className":209442},[],[209444],{"type":23,"value":206687},{"type":17,"tag":84,"props":209446,"children":209447},{},[209448],{"type":17,"tag":6121,"props":209449,"children":209451},{"className":209450},[],[209452],{"type":23,"value":25337},{"type":17,"tag":84,"props":209454,"children":209455},{},[209456],{"type":17,"tag":6121,"props":209457,"children":209459},{"className":209458},[],[209460],{"type":23,"value":201198},{"type":17,"tag":84,"props":209462,"children":209463},{},[209464],{"type":17,"tag":6121,"props":209465,"children":209467},{"className":209466},[],[209468],{"type":23,"value":206704},{"type":17,"tag":84,"props":209470,"children":209471},{},[209472],{"type":17,"tag":6121,"props":209473,"children":209475},{"className":209474},[],[209476],{"type":23,"value":27299},{"type":17,"tag":29,"props":209478,"children":209479},{},[209480],{"type":23,"value":194883},{"type":17,"tag":80,"props":209482,"children":209483},{},[209484,209489,209494],{"type":17,"tag":84,"props":209485,"children":209486},{},[209487],{"type":23,"value":209488},"Compensation is not required for headcount.",{"type":17,"tag":84,"props":209490,"children":209491},{},[209492],{"type":23,"value":209493},"Payroll artifacts are not used to infer employment.",{"type":17,"tag":84,"props":209495,"children":209496},{},[209497,209502],{"type":17,"tag":6121,"props":209498,"children":209500},{"className":209499},[],[209501],{"type":23,"value":25337},{"type":23,"value":209503}," reflects changes to the employee record, not necessarily employment events.",{"type":17,"tag":239,"props":209505,"children":209506},{"id":206745},[209507,209508,209513],{"type":23,"value":206748},{"type":17,"tag":6121,"props":209509,"children":209511},{"className":209510},[],[209512],{"type":23,"value":206754},{"type":23,"value":12034},{"type":17,"tag":29,"props":209515,"children":209516},{},[209517],{"type":23,"value":209518},"Groups define organizational attribution.",{"type":17,"tag":29,"props":209520,"children":209521},{},[209522],{"type":23,"value":160476},{"type":17,"tag":80,"props":209524,"children":209525},{},[209526,209534,209542,209550,209558,209566],{"type":17,"tag":84,"props":209527,"children":209528},{},[209529],{"type":17,"tag":6121,"props":209530,"children":209532},{"className":209531},[],[209533],{"type":23,"value":18766},{"type":17,"tag":84,"props":209535,"children":209536},{},[209537],{"type":17,"tag":6121,"props":209538,"children":209540},{"className":209539},[],[209541],{"type":23,"value":18781},{"type":17,"tag":84,"props":209543,"children":209544},{},[209545],{"type":17,"tag":6121,"props":209546,"children":209548},{"className":209547},[],[209549],{"type":23,"value":15863},{"type":17,"tag":84,"props":209551,"children":209552},{},[209553],{"type":17,"tag":6121,"props":209554,"children":209556},{"className":209555},[],[209557],{"type":23,"value":27310},{"type":17,"tag":84,"props":209559,"children":209560},{},[209561],{"type":17,"tag":6121,"props":209562,"children":209564},{"className":209563},[],[209565],{"type":23,"value":62868},{"type":17,"tag":84,"props":209567,"children":209568},{},[209569],{"type":17,"tag":6121,"props":209570,"children":209572},{"className":209571},[],[209573],{"type":23,"value":27299},{"type":17,"tag":29,"props":209575,"children":209576},{},[209577],{"type":23,"value":209578},"Groups enable rollups by department, division, or business unit. Their semantics are customer-defined and should not be hardcoded.",{"type":17,"tag":239,"props":209580,"children":209581},{"id":206823},[209582,209583,209588],{"type":23,"value":206826},{"type":17,"tag":6121,"props":209584,"children":209586},{"className":209585},[],[209587],{"type":23,"value":206832},{"type":23,"value":12034},{"type":17,"tag":29,"props":209590,"children":209591},{},[209592],{"type":23,"value":209593},"Locations define geographic attribution.",{"type":17,"tag":29,"props":209595,"children":209596},{},[209597],{"type":23,"value":160476},{"type":17,"tag":80,"props":209599,"children":209600},{},[209601,209609,209617,209627,209635],{"type":17,"tag":84,"props":209602,"children":209603},{},[209604],{"type":17,"tag":6121,"props":209605,"children":209607},{"className":209606},[],[209608],{"type":23,"value":18766},{"type":17,"tag":84,"props":209610,"children":209611},{},[209612],{"type":17,"tag":6121,"props":209613,"children":209615},{"className":209614},[],[209616],{"type":23,"value":18781},{"type":17,"tag":84,"props":209618,"children":209619},{},[209620,209625],{"type":17,"tag":6121,"props":209621,"children":209623},{"className":209622},[],[209624],{"type":23,"value":62370},{"type":23,"value":209626}," (region, country)",{"type":17,"tag":84,"props":209628,"children":209629},{},[209630],{"type":17,"tag":6121,"props":209631,"children":209633},{"className":209632},[],[209634],{"type":23,"value":62868},{"type":17,"tag":84,"props":209636,"children":209637},{},[209638],{"type":17,"tag":6121,"props":209639,"children":209641},{"className":209640},[],[209642],{"type":23,"value":27299},{"type":17,"tag":29,"props":209644,"children":209645},{},[209646],{"type":23,"value":209647},"Locations support regional planning and geo-based hiring analysis.",{"type":17,"tag":239,"props":209649,"children":209650},{"id":206903},[209651,209652,209657],{"type":23,"value":206906},{"type":17,"tag":6121,"props":209653,"children":209655},{"className":209654},[],[209656],{"type":23,"value":206912},{"type":23,"value":12034},{"type":17,"tag":29,"props":209659,"children":209660},{},[209661],{"type":23,"value":207768},{"type":17,"tag":29,"props":209663,"children":209664},{},[209665],{"type":23,"value":160476},{"type":17,"tag":80,"props":209667,"children":209668},{},[209669,209677],{"type":17,"tag":84,"props":209670,"children":209671},{},[209672],{"type":17,"tag":6121,"props":209673,"children":209675},{"className":209674},[],[209676],{"type":23,"value":18766},{"type":17,"tag":84,"props":209678,"children":209679},{},[209680],{"type":17,"tag":6121,"props":209681,"children":209683},{"className":209682},[],[209684],{"type":23,"value":18781},{"type":17,"tag":29,"props":209686,"children":209687},{},[209688],{"type":23,"value":209689},"This allows headcount planning across subsidiaries or legal entities without assuming a single global org.",{"type":17,"tag":68,"props":209691,"children":209692},{"id":207799},[209693],{"type":23,"value":207802},{"type":17,"tag":29,"props":209695,"children":209696},{},[209697,209699,209704],{"type":23,"value":209698},"Employee lists are paginated and support incremental refresh via ",{"type":17,"tag":6121,"props":209700,"children":209702},{"className":209701},[],[209703],{"type":23,"value":26291},{"type":23,"value":54},{"type":17,"tag":6893,"props":209706,"children":209709},{"className":209707,"code":209708,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function fetchEmployees(connectionId: string) {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.hris.listHrisEmployees({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: [\n        'id',\n        'employment_status',\n        'employment_type',\n        'hired_at',\n        'terminated_at',\n        'updated_at',\n        'groups',\n        'locations',\n        'company_id',\n      ].join(','),\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[209710],{"type":17,"tag":6121,"props":209711,"children":209712},{"__ignoreMap":7},[209713],{"type":23,"value":209708},{"type":17,"tag":29,"props":209715,"children":209716},{},[209717],{"type":23,"value":209718},"This is sufficient for both current state and change detection.",{"type":17,"tag":68,"props":209720,"children":209722},{"id":209721},"step-2-define-current-headcount",[209723],{"type":23,"value":209724},"Step 2: Define 'current headcount'",{"type":17,"tag":29,"props":209726,"children":209727},{},[209728],{"type":23,"value":209729},"Headcount definitions vary by product. Unified leaves this policy to you.",{"type":17,"tag":29,"props":209731,"children":209732},{},[209733],{"type":23,"value":209734},"A common baseline:",{"type":17,"tag":80,"props":209736,"children":209737},{},[209738,209747],{"type":17,"tag":84,"props":209739,"children":209740},{},[209741],{"type":17,"tag":6121,"props":209742,"children":209744},{"className":209743},[],[209745],{"type":23,"value":209746},"employment_status === 'ACTIVE'",{"type":17,"tag":84,"props":209748,"children":209749},{},[209750,209755],{"type":17,"tag":6121,"props":209751,"children":209753},{"className":209752},[],[209754],{"type":23,"value":206687},{"type":23,"value":209756}," is null",{"type":17,"tag":6893,"props":209758,"children":209761},{"className":209759,"code":209760,"language":18718,"meta":7},[18716],"function currentHeadcount(employees: any[]) {\n  return employees.filter(\n    (e) => e.employment_status === 'ACTIVE' && !e.terminated_at\n  );\n}\n",[209762],{"type":17,"tag":6121,"props":209763,"children":209764},{"__ignoreMap":7},[209765],{"type":23,"value":209760},{"type":17,"tag":29,"props":209767,"children":209768},{},[209769],{"type":23,"value":209770},"You may choose to:",{"type":17,"tag":80,"props":209772,"children":209773},{},[209774,209779,209784],{"type":17,"tag":84,"props":209775,"children":209776},{},[209777],{"type":23,"value":209778},"Exclude contractors",{"type":17,"tag":84,"props":209780,"children":209781},{},[209782],{"type":23,"value":209783},"Include interns",{"type":17,"tag":84,"props":209785,"children":209786},{},[209787],{"type":23,"value":209788},"Handle seasonal workers differently",{"type":17,"tag":29,"props":209790,"children":209791},{},[209792],{"type":23,"value":209793},"Those rules are explicit and configurable.",{"type":17,"tag":68,"props":209795,"children":209797},{"id":209796},"step-3-segment-headcount-by-org-and-location",[209798],{"type":23,"value":209799},"Step 3: Segment headcount by org and location",{"type":17,"tag":29,"props":209801,"children":209802},{},[209803],{"type":23,"value":209804},"Once you have the current population, segmentation is a join problem.",{"type":17,"tag":29,"props":209806,"children":209807},{},[209808],{"type":23,"value":377},{"type":17,"tag":80,"props":209810,"children":209811},{},[209812,209823,209834,209845],{"type":17,"tag":84,"props":209813,"children":209814},{},[209815,209817],{"type":23,"value":209816},"Headcount by department: ",{"type":17,"tag":6121,"props":209818,"children":209820},{"className":209819},[],[209821],{"type":23,"value":209822},"employee.groups[].id",{"type":17,"tag":84,"props":209824,"children":209825},{},[209826,209828],{"type":23,"value":209827},"Headcount by location: ",{"type":17,"tag":6121,"props":209829,"children":209831},{"className":209830},[],[209832],{"type":23,"value":209833},"employee.locations[].id",{"type":17,"tag":84,"props":209835,"children":209836},{},[209837,209839],{"type":23,"value":209838},"Headcount by company: ",{"type":17,"tag":6121,"props":209840,"children":209842},{"className":209841},[],[209843],{"type":23,"value":209844},"employee.company_id",{"type":17,"tag":84,"props":209846,"children":209847},{},[209848,209850],{"type":23,"value":209849},"Headcount by employment type: ",{"type":17,"tag":6121,"props":209851,"children":209853},{"className":209852},[],[209854],{"type":23,"value":209855},"employee.employment_type",{"type":17,"tag":29,"props":209857,"children":209858},{},[209859],{"type":23,"value":209860},"Because groups and locations are normalized objects, rollups are consistent across HRISs.",{"type":17,"tag":68,"props":209862,"children":209864},{"id":209863},"step-4-observe-hiring-and-attrition-over-time",[209865],{"type":23,"value":209866},"Step 4: Observe hiring and attrition over time",{"type":17,"tag":29,"props":209868,"children":209869},{},[209870],{"type":23,"value":209871},"Observed change is derived from dates, not inferred history.",{"type":17,"tag":239,"props":209873,"children":209875},{"id":209874},"hires",[209876],{"type":23,"value":209877},"Hires",{"type":17,"tag":6893,"props":209879,"children":209882},{"className":209880,"code":209881,"language":18718,"meta":7},[18716],"function hiresBetween(employees: any[], start: Date, end: Date) {\n  return employees.filter((e) => {\n    if (!e.hired_at) return false;\n    const hired = new Date(e.hired_at);\n    return hired >= start && hired \u003C= end;\n  });\n}\n",[209883],{"type":17,"tag":6121,"props":209884,"children":209885},{"__ignoreMap":7},[209886],{"type":23,"value":209881},{"type":17,"tag":239,"props":209888,"children":209890},{"id":209889},"terminations",[209891],{"type":23,"value":209892},"Terminations",{"type":17,"tag":6893,"props":209894,"children":209897},{"className":209895,"code":209896,"language":18718,"meta":7},[18716],"function terminationsBetween(employees: any[], start: Date, end: Date) {\n  return employees.filter((e) => {\n    if (!e.terminated_at) return false;\n    const terminated = new Date(e.terminated_at);\n    return terminated >= start && terminated \u003C= end;\n  });\n}\n",[209898],{"type":17,"tag":6121,"props":209899,"children":209900},{"__ignoreMap":7},[209901],{"type":23,"value":209896},{"type":17,"tag":29,"props":209903,"children":209904},{},[209905],{"type":23,"value":209906},"These counts can be grouped by department, location, or company using the same joins as current headcount.",{"type":17,"tag":68,"props":209908,"children":209910},{"id":209909},"step-5-track-trends-with-incremental-updates",[209911],{"type":23,"value":209912},"Step 5: Track trends with incremental updates",{"type":17,"tag":29,"props":209914,"children":209915},{},[209916],{"type":23,"value":208009},{"type":17,"tag":29,"props":209918,"children":209919},{},[209920],{"type":23,"value":134897},{"type":17,"tag":6154,"props":209922,"children":209923},{},[209924,209928,209939,209948],{"type":17,"tag":84,"props":209925,"children":209926},{},[209927],{"type":23,"value":209005},{"type":17,"tag":84,"props":209929,"children":209930},{},[209931,209933,209938],{"type":23,"value":209932},"Persist ",{"type":17,"tag":6121,"props":209934,"children":209936},{"className":209935},[],[209937],{"type":23,"value":25337},{"type":23,"value":209016},{"type":17,"tag":84,"props":209940,"children":209941},{},[209942,209943],{"type":23,"value":204391},{"type":17,"tag":6121,"props":209944,"children":209946},{"className":209945},[],[209947],{"type":23,"value":26291},{"type":17,"tag":84,"props":209949,"children":209950},{},[209951],{"type":23,"value":209952},"Recompute affected aggregates only",{"type":17,"tag":29,"props":209954,"children":209955},{},[209956],{"type":23,"value":209957},"This allows near-real-time planning dashboards without rebuilding your entire dataset.",{"type":17,"tag":68,"props":209959,"children":209960},{"id":204451},[209961],{"type":23,"value":204454},{"type":17,"tag":29,"props":209963,"children":209964},{},[209965],{"type":23,"value":204459},{"type":17,"tag":80,"props":209967,"children":209968},{},[209969,209974,209979,209984],{"type":17,"tag":84,"props":209970,"children":209971},{},[209972],{"type":23,"value":209973},"Predict future hires",{"type":17,"tag":84,"props":209975,"children":209976},{},[209977],{"type":23,"value":209978},"Infer employment from payroll or benefits",{"type":17,"tag":84,"props":209980,"children":209981},{},[209982],{"type":23,"value":209983},"Reconstruct undocumented job history",{"type":17,"tag":84,"props":209985,"children":209986},{},[209987],{"type":23,"value":209988},"Normalize customer-specific policies",{"type":17,"tag":29,"props":209990,"children":209991},{},[209992],{"type":23,"value":209993},"This keeps headcount analysis explainable and auditable.",{"type":17,"tag":68,"props":209995,"children":209997},{"id":209996},"how-this-supports-forecasting",[209998],{"type":23,"value":209999},"How this supports forecasting",{"type":17,"tag":29,"props":210001,"children":210002},{},[210003],{"type":23,"value":210004},"With a correct baseline and observed trends, your product can:",{"type":17,"tag":80,"props":210006,"children":210007},{},[210008,210013,210018,210023],{"type":17,"tag":84,"props":210009,"children":210010},{},[210011],{"type":23,"value":210012},"Model growth scenarios",{"type":17,"tag":84,"props":210014,"children":210015},{},[210016],{"type":23,"value":210017},"Compare hiring velocity across teams",{"type":17,"tag":84,"props":210019,"children":210020},{},[210021],{"type":23,"value":210022},"Plan regional expansion",{"type":17,"tag":84,"props":210024,"children":210025},{},[210026],{"type":23,"value":210027},"Benchmark attrition rates",{"type":17,"tag":29,"props":210029,"children":210030},{},[210031],{"type":23,"value":210032},"The forecasting logic lives in your application. Unified ensures the data feeding it is consistent and defensible.",{"type":17,"tag":68,"props":210034,"children":210035},{"id":132938},[210036],{"type":23,"value":136162},{"type":17,"tag":29,"props":210038,"children":210039},{},[210040],{"type":23,"value":210041},"Headcount forecasting doesn't start with prediction. It starts with a correct definition of who is employed, when changes occurred, and how people are attributed across the organization.",{"type":17,"tag":29,"props":210043,"children":210044},{},[210045],{"type":23,"value":210046},"Unified's HR & Directory API gives you that foundation: explicit employment state, observable change, and normalized organizational context—without guessing, reconstructing history, or embedding vendor-specific logic.",{"type":17,"tag":29,"props":210048,"children":210049},{},[210050],{"type":23,"value":210051},"From there, forecasting becomes a planning problem, not an integration problem.",{"type":17,"tag":29,"props":210053,"children":210054},{},[210055,210056],{"type":23,"value":1609},{"type":17,"tag":133,"props":210057,"children":210059},{"href":1612,"rel":210058},[214],[210060],{"type":23,"value":1616},{"type":17,"tag":29,"props":210062,"children":210063},{},[210064,210065],{"type":23,"value":1609},{"type":17,"tag":133,"props":210066,"children":210068},{"href":1623,"rel":210067},[214],[210069],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":210071},[210072,210073,210074,210080,210081,210082,210083,210087,210088,210089,210090],{"id":209233,"depth":1629,"text":209236},{"id":209299,"depth":1629,"text":209302},{"id":204859,"depth":1629,"text":204862,"children":210075},[210076,210077,210078,210079],{"id":206590,"depth":1635,"text":207267},{"id":206745,"depth":1635,"text":207269},{"id":206823,"depth":1635,"text":207271},{"id":206903,"depth":1635,"text":207273},{"id":207799,"depth":1629,"text":207802},{"id":209721,"depth":1629,"text":209724},{"id":209796,"depth":1629,"text":209799},{"id":209863,"depth":1629,"text":209866,"children":210084},[210085,210086],{"id":209874,"depth":1635,"text":209877},{"id":209889,"depth":1635,"text":209892},{"id":209909,"depth":1629,"text":209912},{"id":204451,"depth":1629,"text":204454},{"id":209996,"depth":1629,"text":209999},{"id":132938,"depth":1629,"text":136162},"content:blog:how_to_forecast_headcount_and_hiring_needs_with_unified_hr_and_directory_api.md","blog/how_to_forecast_headcount_and_hiring_needs_with_unified_hr_and_directory_api.md","blog/how_to_forecast_headcount_and_hiring_needs_with_unified_hr_and_directory_api",{"_path":210095,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":210096,"description":210097,"img":210098,"date":206388,"tag":12,"body":210099,"_type":1677,"_id":211092,"_source":1679,"_file":211093,"_stem":211094,"_extension":1682},"/blog/how_to_sync_employee_lifecycle_events_onboarding_and_offboarding_with_unified_hr_and_directory_api","How to Sync Employee Lifecycle Events (Onboarding & Offboarding) with Unified's HR & Directory API","Employee lifecycle automation breaks when products treat onboarding and offboarding as one-time events instead of state transitions.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_sync_employee_lifecycle_events_onboarding_and_offboarding_with_unified_hr_and_directory_api-icon.png",{"type":14,"children":210100,"toc":211073},[210101,210106,210109,210116,210127,210132,210137,210160,210165,210189,210194,210200,210211,210215,210238,210242,210271,210276,210282,210287,210298,210348,210353,210357,210367,210372,210376,210443,210447,210470,210480,210485,210489,210532,210537,210547,210552,210556,210599,210604,210614,210618,210622,210641,210646,210652,210657,210666,210671,210677,210682,210722,210731,210736,210754,210760,210765,210770,210799,210808,210813,210831,210837,210842,210846,210864,210876,210885,210890,210901,210906,210910,210942,210947,210953,210958,210963,210988,210993,210997,211001,211024,211029,211033,211045,211050,211055,211064],{"type":17,"tag":18,"props":210102,"children":210104},{"id":210103},"how-to-sync-employee-lifecycle-events-onboarding-offboarding-with-unifieds-hr-directory-api",[210105],{"type":23,"value":210096},{"type":17,"tag":25,"props":210107,"children":210108},{},[],{"type":17,"tag":29,"props":210110,"children":210111},{},[210112],{"type":17,"tag":33,"props":210113,"children":210114},{},[210115],{"type":23,"value":199463},{"type":17,"tag":29,"props":210117,"children":210118},{},[210119,210121,210126],{"type":23,"value":210120},"Employee lifecycle automation breaks when products treat onboarding and offboarding as one-time events instead of ",{"type":17,"tag":48,"props":210122,"children":210123},{},[210124],{"type":23,"value":210125},"state transitions",{"type":23,"value":54},{"type":17,"tag":29,"props":210128,"children":210129},{},[210130],{"type":23,"value":210131},"Across HR systems, employee lifecycle data is fragmented. Start dates, termination dates, employment status, and organizational attributes are updated independently and often asynchronously. Some systems emit explicit events. Others only expose current state. Many require teams to reconstruct lifecycle changes by comparing snapshots or relying on vendor-specific semantics.",{"type":17,"tag":29,"props":210133,"children":210134},{},[210135],{"type":23,"value":210136},"For product teams, this creates real operational risk:",{"type":17,"tag":80,"props":210138,"children":210139},{},[210140,210145,210150,210155],{"type":17,"tag":84,"props":210141,"children":210142},{},[210143],{"type":23,"value":210144},"New hires aren't provisioned on time",{"type":17,"tag":84,"props":210146,"children":210147},{},[210148],{"type":23,"value":210149},"Departed employees retain access longer than intended",{"type":17,"tag":84,"props":210151,"children":210152},{},[210153],{"type":23,"value":210154},"Role or team changes fail to trigger downstream updates",{"type":17,"tag":84,"props":210156,"children":210157},{},[210158],{"type":23,"value":210159},"'Joiners' and 'leavers' are detected inconsistently across HRISs",{"type":17,"tag":29,"props":210161,"children":210162},{},[210163],{"type":23,"value":210164},"Many tools attempt to solve this by inventing lifecycle event objects or relying on undocumented vendor behavior. That approach is brittle and hard to audit.",{"type":17,"tag":29,"props":210166,"children":210167},{},[210168,210169,210173,210175,210180,210182,210187],{"type":23,"value":25244},{"type":17,"tag":133,"props":210170,"children":210171},{"href":60186},[210172],{"type":23,"value":197036},{"type":23,"value":210174}," takes a more explicit stance. It does not invent lifecycle events. Instead, it exposes ",{"type":17,"tag":48,"props":210176,"children":210177},{},[210178],{"type":23,"value":210179},"observable employee state",{"type":23,"value":210181},"—employment status, start and end dates, organizational attributes—and a reliable ",{"type":17,"tag":6121,"props":210183,"children":210185},{"className":210184},[],[210186],{"type":23,"value":25337},{"type":23,"value":210188}," signal. Lifecycle events are derived by comparing state over time, using consistent semantics across HR systems.",{"type":17,"tag":29,"props":210190,"children":210191},{},[210192],{"type":23,"value":210193},"This guide shows how to sync onboarding and offboarding flows using Unified's HR & Directory API—detecting joiners, leavers, and meaningful employee changes without vendor-specific logic or inferred history.",{"type":17,"tag":68,"props":210195,"children":210197},{"id":210196},"what-lifecycle-syncing-means-in-this-article",[210198],{"type":23,"value":210199},"What lifecycle syncing means in this article",{"type":17,"tag":29,"props":210201,"children":210202},{},[210203,210204,210209],{"type":23,"value":20751},{"type":17,"tag":48,"props":210205,"children":210206},{},[210207],{"type":23,"value":210208},"detecting and reacting to employee lifecycle changes",{"type":23,"value":210210},", not performing provisioning directly.",{"type":17,"tag":29,"props":210212,"children":210213},{},[210214],{"type":23,"value":203408},{"type":17,"tag":80,"props":210216,"children":210217},{},[210218,210223,210228,210233],{"type":17,"tag":84,"props":210219,"children":210220},{},[210221],{"type":23,"value":210222},"Identify new employees (onboarding)",{"type":17,"tag":84,"props":210224,"children":210225},{},[210226],{"type":23,"value":210227},"Identify exited employees (offboarding)",{"type":17,"tag":84,"props":210229,"children":210230},{},[210231],{"type":23,"value":210232},"Detect changes to active employees that require updates",{"type":17,"tag":84,"props":210234,"children":210235},{},[210236],{"type":23,"value":210237},"Keep downstream systems in sync incrementally",{"type":17,"tag":29,"props":210239,"children":210240},{},[210241],{"type":23,"value":203440},{"type":17,"tag":80,"props":210243,"children":210244},{},[210245,210250,210255,210266],{"type":17,"tag":84,"props":210246,"children":210247},{},[210248],{"type":23,"value":210249},"Model role history or promotions",{"type":17,"tag":84,"props":210251,"children":210252},{},[210253],{"type":23,"value":210254},"Infer lifecycle events from payroll or benefits",{"type":17,"tag":84,"props":210256,"children":210257},{},[210258,210260,210264],{"type":23,"value":210259},"Require ",{"type":17,"tag":133,"props":210261,"children":210262},{"href":4999},[210263],{"type":23,"value":5002},{"type":23,"value":210265}," to function correctly",{"type":17,"tag":84,"props":210267,"children":210268},{},[210269],{"type":23,"value":210270},"Define provisioning logic for downstream systems",{"type":17,"tag":29,"props":210272,"children":210273},{},[210274],{"type":23,"value":210275},"Unified provides the lifecycle signal. Your product decides how to act on it.",{"type":17,"tag":68,"props":210277,"children":210279},{"id":210278},"the-mental-model-lifecycle-events-are-derived-not-emitted",[210280],{"type":23,"value":210281},"The mental model: lifecycle events are derived, not emitted",{"type":17,"tag":29,"props":210283,"children":210284},{},[210285],{"type":23,"value":210286},"Unified does not expose a dedicated 'lifecycle event' object.",{"type":17,"tag":29,"props":210288,"children":210289},{},[210290,210292,210297],{"type":23,"value":210291},"Instead, lifecycle events are derived from ",{"type":17,"tag":48,"props":210293,"children":210294},{},[210295],{"type":23,"value":210296},"changes in employee state",{"type":23,"value":20456},{"type":17,"tag":80,"props":210299,"children":210300},{},[210301,210320,210338],{"type":17,"tag":84,"props":210302,"children":210303},{},[210304,210306,210312,210313,210318],{"type":23,"value":210305},"Onboarding → employee appears with ",{"type":17,"tag":6121,"props":210307,"children":210309},{"className":210308},[],[210310],{"type":23,"value":210311},"employment_status = ACTIVE",{"type":23,"value":182744},{"type":17,"tag":6121,"props":210314,"children":210316},{"className":210315},[],[210317],{"type":23,"value":132233},{"type":23,"value":210319}," date",{"type":17,"tag":84,"props":210321,"children":210322},{},[210323,210325,210330,210332,210337],{"type":23,"value":210324},"Offboarding → ",{"type":17,"tag":6121,"props":210326,"children":210328},{"className":210327},[],[210329],{"type":23,"value":206629},{"type":23,"value":210331}," transitions or ",{"type":17,"tag":6121,"props":210333,"children":210335},{"className":210334},[],[210336],{"type":23,"value":206687},{"type":23,"value":197798},{"type":17,"tag":84,"props":210339,"children":210340},{},[210341,210343],{"type":23,"value":210342},"Updates → any meaningful change reflected in ",{"type":17,"tag":6121,"props":210344,"children":210346},{"className":210345},[],[210347],{"type":23,"value":25337},{"type":17,"tag":29,"props":210349,"children":210350},{},[210351],{"type":23,"value":210352},"This model is intentional. It avoids vendor-specific event semantics and keeps lifecycle detection consistent across HRISs.",{"type":17,"tag":68,"props":210354,"children":210355},{"id":204859},[210356],{"type":23,"value":204862},{"type":17,"tag":239,"props":210358,"children":210359},{"id":206590},[210360,210361,210366],{"type":23,"value":206593},{"type":17,"tag":6121,"props":210362,"children":210364},{"className":210363},[],[210365],{"type":23,"value":206599},{"type":23,"value":12034},{"type":17,"tag":29,"props":210368,"children":210369},{},[210370],{"type":23,"value":210371},"Employees are the source of truth for lifecycle state.",{"type":17,"tag":29,"props":210373,"children":210374},{},[210375],{"type":23,"value":160476},{"type":17,"tag":80,"props":210377,"children":210378},{},[210379,210387,210395,210403,210411,210419,210427,210435],{"type":17,"tag":84,"props":210380,"children":210381},{},[210382],{"type":17,"tag":6121,"props":210383,"children":210385},{"className":210384},[],[210386],{"type":23,"value":18766},{"type":17,"tag":84,"props":210388,"children":210389},{},[210390],{"type":17,"tag":6121,"props":210391,"children":210393},{"className":210392},[],[210394],{"type":23,"value":206629},{"type":17,"tag":84,"props":210396,"children":210397},{},[210398],{"type":17,"tag":6121,"props":210399,"children":210401},{"className":210400},[],[210402],{"type":23,"value":132233},{"type":17,"tag":84,"props":210404,"children":210405},{},[210406],{"type":17,"tag":6121,"props":210407,"children":210409},{"className":210408},[],[210410],{"type":23,"value":206687},{"type":17,"tag":84,"props":210412,"children":210413},{},[210414],{"type":17,"tag":6121,"props":210415,"children":210417},{"className":210416},[],[210418],{"type":23,"value":25337},{"type":17,"tag":84,"props":210420,"children":210421},{},[210422],{"type":17,"tag":6121,"props":210423,"children":210425},{"className":210424},[],[210426],{"type":23,"value":201198},{"type":17,"tag":84,"props":210428,"children":210429},{},[210430],{"type":17,"tag":6121,"props":210431,"children":210433},{"className":210432},[],[210434],{"type":23,"value":206704},{"type":17,"tag":84,"props":210436,"children":210437},{},[210438],{"type":17,"tag":6121,"props":210439,"children":210441},{"className":210440},[],[210442],{"type":23,"value":27299},{"type":17,"tag":29,"props":210444,"children":210445},{},[210446],{"type":23,"value":194883},{"type":17,"tag":80,"props":210448,"children":210449},{},[210450,210455,210465],{"type":17,"tag":84,"props":210451,"children":210452},{},[210453],{"type":23,"value":210454},"Lifecycle signals are represented as state, not events",{"type":17,"tag":84,"props":210456,"children":210457},{},[210458,210463],{"type":17,"tag":6121,"props":210459,"children":210461},{"className":210460},[],[210462],{"type":23,"value":25337},{"type":23,"value":210464}," reflects changes to the employee record",{"type":17,"tag":84,"props":210466,"children":210467},{},[210468],{"type":23,"value":210469},"Not all HRISs update all fields simultaneously",{"type":17,"tag":239,"props":210471,"children":210472},{"id":206745},[210473,210474,210479],{"type":23,"value":206748},{"type":17,"tag":6121,"props":210475,"children":210477},{"className":210476},[],[210478],{"type":23,"value":206754},{"type":23,"value":12034},{"type":17,"tag":29,"props":210481,"children":210482},{},[210483],{"type":23,"value":210484},"Groups provide organizational context.",{"type":17,"tag":29,"props":210486,"children":210487},{},[210488],{"type":23,"value":160476},{"type":17,"tag":80,"props":210490,"children":210491},{},[210492,210500,210508,210516,210524],{"type":17,"tag":84,"props":210493,"children":210494},{},[210495],{"type":17,"tag":6121,"props":210496,"children":210498},{"className":210497},[],[210499],{"type":23,"value":18766},{"type":17,"tag":84,"props":210501,"children":210502},{},[210503],{"type":17,"tag":6121,"props":210504,"children":210506},{"className":210505},[],[210507],{"type":23,"value":18781},{"type":17,"tag":84,"props":210509,"children":210510},{},[210511],{"type":17,"tag":6121,"props":210512,"children":210514},{"className":210513},[],[210515],{"type":23,"value":15863},{"type":17,"tag":84,"props":210517,"children":210518},{},[210519],{"type":17,"tag":6121,"props":210520,"children":210522},{"className":210521},[],[210523],{"type":23,"value":27310},{"type":17,"tag":84,"props":210525,"children":210526},{},[210527],{"type":17,"tag":6121,"props":210528,"children":210530},{"className":210529},[],[210531],{"type":23,"value":27299},{"type":17,"tag":29,"props":210533,"children":210534},{},[210535],{"type":23,"value":210536},"Groups are useful for assigning onboarding or offboarding workflows by department or team.",{"type":17,"tag":239,"props":210538,"children":210539},{"id":206823},[210540,210541,210546],{"type":23,"value":206826},{"type":17,"tag":6121,"props":210542,"children":210544},{"className":210543},[],[210545],{"type":23,"value":206832},{"type":23,"value":12034},{"type":17,"tag":29,"props":210548,"children":210549},{},[210550],{"type":23,"value":210551},"Locations provide geographic context.",{"type":17,"tag":29,"props":210553,"children":210554},{},[210555],{"type":23,"value":160476},{"type":17,"tag":80,"props":210557,"children":210558},{},[210559,210567,210575,210583,210591],{"type":17,"tag":84,"props":210560,"children":210561},{},[210562],{"type":17,"tag":6121,"props":210563,"children":210565},{"className":210564},[],[210566],{"type":23,"value":18766},{"type":17,"tag":84,"props":210568,"children":210569},{},[210570],{"type":17,"tag":6121,"props":210571,"children":210573},{"className":210572},[],[210574],{"type":23,"value":18781},{"type":17,"tag":84,"props":210576,"children":210577},{},[210578],{"type":17,"tag":6121,"props":210579,"children":210581},{"className":210580},[],[210582],{"type":23,"value":206870},{"type":17,"tag":84,"props":210584,"children":210585},{},[210586],{"type":17,"tag":6121,"props":210587,"children":210589},{"className":210588},[],[210590],{"type":23,"value":206879},{"type":17,"tag":84,"props":210592,"children":210593},{},[210594],{"type":17,"tag":6121,"props":210595,"children":210597},{"className":210596},[],[210598],{"type":23,"value":27299},{"type":17,"tag":29,"props":210600,"children":210601},{},[210602],{"type":23,"value":210603},"Locations are often used to trigger jurisdiction-specific onboarding or exit steps.",{"type":17,"tag":239,"props":210605,"children":210606},{"id":206903},[210607,210608,210613],{"type":23,"value":206906},{"type":17,"tag":6121,"props":210609,"children":210611},{"className":210610},[],[210612],{"type":23,"value":206912},{"type":23,"value":12034},{"type":17,"tag":29,"props":210615,"children":210616},{},[210617],{"type":23,"value":207768},{"type":17,"tag":29,"props":210619,"children":210620},{},[210621],{"type":23,"value":160476},{"type":17,"tag":80,"props":210623,"children":210624},{},[210625,210633],{"type":17,"tag":84,"props":210626,"children":210627},{},[210628],{"type":17,"tag":6121,"props":210629,"children":210631},{"className":210630},[],[210632],{"type":23,"value":18766},{"type":17,"tag":84,"props":210634,"children":210635},{},[210636],{"type":17,"tag":6121,"props":210637,"children":210639},{"className":210638},[],[210640],{"type":23,"value":18781},{"type":17,"tag":29,"props":210642,"children":210643},{},[210644],{"type":23,"value":210645},"This allows lifecycle syncing in multi-entity organizations without assuming a single global org.",{"type":17,"tag":68,"props":210647,"children":210649},{"id":210648},"step-1-perform-an-initial-employee-ingest",[210650],{"type":23,"value":210651},"Step 1: Perform an initial employee ingest",{"type":17,"tag":29,"props":210653,"children":210654},{},[210655],{"type":23,"value":210656},"Start by ingesting the current employee population.",{"type":17,"tag":6893,"props":210658,"children":210661},{"className":210659,"code":210660,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nasync function fetchEmployees(connectionId: string) {\n  const employees = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.hris.listHrisEmployees({\n      connectionId,\n      limit,\n      offset,\n      sort: 'updated_at',\n      order: 'asc',\n      fields: [\n        'id',\n        'employment_status',\n        'hired_at',\n        'terminated_at',\n        'updated_at',\n        'groups',\n        'locations',\n        'company_id',\n      ].join(','),\n    });\n\n    if (!page || page.length === 0) break;\n\n    employees.push(...page);\n    offset += limit;\n  }\n\n  return employees;\n}\n",[210662],{"type":17,"tag":6121,"props":210663,"children":210664},{"__ignoreMap":7},[210665],{"type":23,"value":210660},{"type":17,"tag":29,"props":210667,"children":210668},{},[210669],{"type":23,"value":210670},"This establishes a baseline state.",{"type":17,"tag":68,"props":210672,"children":210674},{"id":210673},"step-2-detect-onboarding-joiners",[210675],{"type":23,"value":210676},"Step 2: Detect onboarding (joiners)",{"type":17,"tag":29,"props":210678,"children":210679},{},[210680],{"type":23,"value":210681},"A new employee is typically identified by:",{"type":17,"tag":80,"props":210683,"children":210684},{},[210685,210695,210711],{"type":17,"tag":84,"props":210686,"children":210687},{},[210688,210690],{"type":23,"value":210689},"A previously unseen ",{"type":17,"tag":6121,"props":210691,"children":210693},{"className":210692},[],[210694],{"type":23,"value":18766},{"type":17,"tag":84,"props":210696,"children":210697},{},[210698,210699,210704,210706],{"type":23,"value":40437},{"type":17,"tag":6121,"props":210700,"children":210702},{"className":210701},[],[210703],{"type":23,"value":206629},{"type":23,"value":210705}," of ",{"type":17,"tag":6121,"props":210707,"children":210709},{"className":210708},[],[210710],{"type":23,"value":183701},{"type":17,"tag":84,"props":210712,"children":210713},{},[210714,210716,210721],{"type":23,"value":210715},"A populated ",{"type":17,"tag":6121,"props":210717,"children":210719},{"className":210718},[],[210720],{"type":23,"value":132233},{"type":23,"value":210319},{"type":17,"tag":6893,"props":210723,"children":210726},{"className":210724,"code":210725,"language":18718,"meta":7},[18716],"function detectJoiners(\n  previous: Map\u003Cstring, any>,\n  current: any[]\n) {\n  return current.filter(\n    (e) =>\n      !previous.has(e.id) &&\n      e.employment_status === 'ACTIVE'\n  );\n}\n",[210727],{"type":17,"tag":6121,"props":210728,"children":210729},{"__ignoreMap":7},[210730],{"type":23,"value":210725},{"type":17,"tag":29,"props":210732,"children":210733},{},[210734],{"type":23,"value":210735},"These employees can trigger onboarding workflows such as:",{"type":17,"tag":80,"props":210737,"children":210738},{},[210739,210744,210749],{"type":17,"tag":84,"props":210740,"children":210741},{},[210742],{"type":23,"value":210743},"Account creation",{"type":17,"tag":84,"props":210745,"children":210746},{},[210747],{"type":23,"value":210748},"Training assignment",{"type":17,"tag":84,"props":210750,"children":210751},{},[210752],{"type":23,"value":210753},"Welcome communications",{"type":17,"tag":68,"props":210755,"children":210757},{"id":210756},"step-3-detect-offboarding-leavers",[210758],{"type":23,"value":210759},"Step 3: Detect offboarding (leavers)",{"type":17,"tag":29,"props":210761,"children":210762},{},[210763],{"type":23,"value":210764},"Offboarding is detected through state change.",{"type":17,"tag":29,"props":210766,"children":210767},{},[210768],{"type":23,"value":210769},"Common signals:",{"type":17,"tag":80,"props":210771,"children":210772},{},[210773,210789],{"type":17,"tag":84,"props":210774,"children":210775},{},[210776,210781,210783],{"type":17,"tag":6121,"props":210777,"children":210779},{"className":210778},[],[210780],{"type":23,"value":206629},{"type":23,"value":210782}," transitions to ",{"type":17,"tag":6121,"props":210784,"children":210786},{"className":210785},[],[210787],{"type":23,"value":210788},"INACTIVE",{"type":17,"tag":84,"props":210790,"children":210791},{},[210792,210797],{"type":17,"tag":6121,"props":210793,"children":210795},{"className":210794},[],[210796],{"type":23,"value":206687},{"type":23,"value":210798}," becomes populated",{"type":17,"tag":6893,"props":210800,"children":210803},{"className":210801,"code":210802,"language":18718,"meta":7},[18716],"function detectLeavers(\n  previous: Map\u003Cstring, any>,\n  current: any[]\n) {\n  return current.filter((e) => {\n    const prev = previous.get(e.id);\n    if (!prev) return false;\n\n    return (\n      prev.employment_status === 'ACTIVE' &&\n      e.employment_status !== 'ACTIVE'\n    );\n  });\n}\n",[210804],{"type":17,"tag":6121,"props":210805,"children":210806},{"__ignoreMap":7},[210807],{"type":23,"value":210802},{"type":17,"tag":29,"props":210809,"children":210810},{},[210811],{"type":23,"value":210812},"These records can drive:",{"type":17,"tag":80,"props":210814,"children":210815},{},[210816,210821,210826],{"type":17,"tag":84,"props":210817,"children":210818},{},[210819],{"type":23,"value":210820},"Access revocation",{"type":17,"tag":84,"props":210822,"children":210823},{},[210824],{"type":23,"value":210825},"Device or account cleanup",{"type":17,"tag":84,"props":210827,"children":210828},{},[210829],{"type":23,"value":210830},"Exit workflows",{"type":17,"tag":68,"props":210832,"children":210834},{"id":210833},"step-4-detect-updates-to-active-employees",[210835],{"type":23,"value":210836},"Step 4: Detect updates to active employees",{"type":17,"tag":29,"props":210838,"children":210839},{},[210840],{"type":23,"value":210841},"Not all lifecycle-relevant changes are joiners or leavers.",{"type":17,"tag":29,"props":210843,"children":210844},{},[210845],{"type":23,"value":377},{"type":17,"tag":80,"props":210847,"children":210848},{},[210849,210854,210859],{"type":17,"tag":84,"props":210850,"children":210851},{},[210852],{"type":23,"value":210853},"Department changes",{"type":17,"tag":84,"props":210855,"children":210856},{},[210857],{"type":23,"value":210858},"Location changes",{"type":17,"tag":84,"props":210860,"children":210861},{},[210862],{"type":23,"value":210863},"Company reassignment",{"type":17,"tag":29,"props":210865,"children":210866},{},[210867,210869,210874],{"type":23,"value":210868},"Because Unified exposes ",{"type":17,"tag":6121,"props":210870,"children":210872},{"className":210871},[],[210873],{"type":23,"value":25337},{"type":23,"value":210875},", you can detect records that require re-evaluation.",{"type":17,"tag":6893,"props":210877,"children":210880},{"className":210878,"code":210879,"language":18718,"meta":7},[18716],"function detectUpdates(\n  previous: Map\u003Cstring, any>,\n  current: any[]\n) {\n  return current.filter((e) => {\n    const prev = previous.get(e.id);\n    if (!prev) return false;\n\n    return e.updated_at !== prev.updated_at;\n  });\n}\n",[210881],{"type":17,"tag":6121,"props":210882,"children":210883},{"__ignoreMap":7},[210884],{"type":23,"value":210879},{"type":17,"tag":29,"props":210886,"children":210887},{},[210888],{"type":23,"value":210889},"These updates often require partial downstream changes rather than full onboarding or offboarding.",{"type":17,"tag":68,"props":210891,"children":210893},{"id":210892},"step-5-sync-incrementally-using-updated_at",[210894,210896],{"type":23,"value":210895},"Step 5: Sync incrementally using ",{"type":17,"tag":6121,"props":210897,"children":210899},{"className":210898},[],[210900],{"type":23,"value":25337},{"type":17,"tag":29,"props":210902,"children":210903},{},[210904],{"type":23,"value":210905},"Unified supports incremental lifecycle syncing without full resyncs.",{"type":17,"tag":29,"props":210907,"children":210908},{},[210909],{"type":23,"value":204371},{"type":17,"tag":6154,"props":210911,"children":210912},{},[210913,210923,210932,210937],{"type":17,"tag":84,"props":210914,"children":210915},{},[210916,210918],{"type":23,"value":210917},"Persist last processed ",{"type":17,"tag":6121,"props":210919,"children":210921},{"className":210920},[],[210922],{"type":23,"value":25337},{"type":17,"tag":84,"props":210924,"children":210925},{},[210926,210927],{"type":23,"value":208036},{"type":17,"tag":6121,"props":210928,"children":210930},{"className":210929},[],[210931],{"type":23,"value":26291},{"type":17,"tag":84,"props":210933,"children":210934},{},[210935],{"type":23,"value":210936},"Compare state against stored snapshot",{"type":17,"tag":84,"props":210938,"children":210939},{},[210940],{"type":23,"value":210941},"Derive joiners, leavers, and updates",{"type":17,"tag":29,"props":210943,"children":210944},{},[210945],{"type":23,"value":210946},"This works consistently across HRISs and does not rely on vendor-specific events.",{"type":17,"tag":68,"props":210948,"children":210950},{"id":210949},"webhooks-optional",[210951],{"type":23,"value":210952},"Webhooks (optional)",{"type":17,"tag":29,"props":210954,"children":210955},{},[210956],{"type":23,"value":210957},"If your integration supports webhooks, lifecycle syncing can become near-real-time.",{"type":17,"tag":29,"props":210959,"children":210960},{},[210961],{"type":23,"value":210962},"However:",{"type":17,"tag":80,"props":210964,"children":210965},{},[210966,210971,210983],{"type":17,"tag":84,"props":210967,"children":210968},{},[210969],{"type":23,"value":210970},"Webhooks are an optimization, not a requirement",{"type":17,"tag":84,"props":210972,"children":210973},{},[210974,210976,210981],{"type":23,"value":210975},"Polling with ",{"type":17,"tag":6121,"props":210977,"children":210979},{"className":210978},[],[210980],{"type":23,"value":25337},{"type":23,"value":210982}," remains the baseline approach",{"type":17,"tag":84,"props":210984,"children":210985},{},[210986],{"type":23,"value":210987},"Lifecycle logic should not depend on webhook guarantees",{"type":17,"tag":29,"props":210989,"children":210990},{},[210991],{"type":23,"value":210992},"This ensures correctness even when webhooks are unavailable or delayed.",{"type":17,"tag":68,"props":210994,"children":210995},{"id":153436},[210996],{"type":23,"value":208056},{"type":17,"tag":29,"props":210998,"children":210999},{},[211000],{"type":23,"value":104494},{"type":17,"tag":80,"props":211002,"children":211003},{},[211004,211009,211014,211019],{"type":17,"tag":84,"props":211005,"children":211006},{},[211007],{"type":23,"value":211008},"Emit explicit onboarding or offboarding events",{"type":17,"tag":84,"props":211010,"children":211011},{},[211012],{"type":23,"value":211013},"Infer lifecycle changes from payroll or benefits",{"type":17,"tag":84,"props":211015,"children":211016},{},[211017],{"type":23,"value":211018},"Model role or title history",{"type":17,"tag":84,"props":211020,"children":211021},{},[211022],{"type":23,"value":211023},"Guarantee synchronous field updates across HRISs",{"type":17,"tag":29,"props":211025,"children":211026},{},[211027],{"type":23,"value":211028},"It exposes observable state changes and leaves lifecycle interpretation to your product.",{"type":17,"tag":68,"props":211030,"children":211031},{"id":132938},[211032],{"type":23,"value":136162},{"type":17,"tag":29,"props":211034,"children":211035},{},[211036,211038,211043],{"type":23,"value":211037},"Employee lifecycle syncing is about ",{"type":17,"tag":48,"props":211039,"children":211040},{},[211041],{"type":23,"value":211042},"state awareness",{"type":23,"value":211044},", not event orchestration.",{"type":17,"tag":29,"props":211046,"children":211047},{},[211048],{"type":23,"value":211049},"Unified's HR & Directory API gives you a consistent, real-time view of employee state—start dates, termination signals, organizational context, and change timestamps—so onboarding and offboarding workflows stay accurate as organizations evolve.",{"type":17,"tag":29,"props":211051,"children":211052},{},[211053],{"type":23,"value":211054},"With explicit state and incremental detection, lifecycle automation becomes reliable instead of reactive.",{"type":17,"tag":29,"props":211056,"children":211057},{},[211058,211059],{"type":23,"value":1609},{"type":17,"tag":133,"props":211060,"children":211062},{"href":1612,"rel":211061},[214],[211063],{"type":23,"value":1616},{"type":17,"tag":29,"props":211065,"children":211066},{},[211067,211068],{"type":23,"value":1609},{"type":17,"tag":133,"props":211069,"children":211071},{"href":1623,"rel":211070},[214],[211072],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":211074},[211075,211076,211077,211083,211084,211085,211086,211087,211089,211090,211091],{"id":210196,"depth":1629,"text":210199},{"id":210278,"depth":1629,"text":210281},{"id":204859,"depth":1629,"text":204862,"children":211078},[211079,211080,211081,211082],{"id":206590,"depth":1635,"text":207267},{"id":206745,"depth":1635,"text":207269},{"id":206823,"depth":1635,"text":207271},{"id":206903,"depth":1635,"text":207273},{"id":210648,"depth":1629,"text":210651},{"id":210673,"depth":1629,"text":210676},{"id":210756,"depth":1629,"text":210759},{"id":210833,"depth":1629,"text":210836},{"id":210892,"depth":1629,"text":211088},"Step 5: Sync incrementally using updated_at",{"id":210949,"depth":1629,"text":210952},{"id":153436,"depth":1629,"text":208056},{"id":132938,"depth":1629,"text":136162},"content:blog:how_to_sync_employee_lifecycle_events_onboarding_and_offboarding_with_unified_hr_and_directory_api.md","blog/how_to_sync_employee_lifecycle_events_onboarding_and_offboarding_with_unified_hr_and_directory_api.md","blog/how_to_sync_employee_lifecycle_events_onboarding_and_offboarding_with_unified_hr_and_directory_api",{"_path":211096,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":211097,"description":211098,"img":211099,"date":211100,"tag":12,"body":211101,"_type":1677,"_id":211988,"_source":1679,"_file":211989,"_stem":211990,"_extension":1682},"/blog/how_to_power_outbound_campaigns_with_crm_contact_data_using_unified_crm_api","How to Power Outbound Campaigns with CRM Contact Data Using Unified's CRM API","Outbound campaigns don't fail because of messaging. They fail because the audience isn't well defined.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_power_outbound_campaigns_with_crm_contact_data_using_unified_crm_api-icon.png","2026-02-02T17:06:00.000Z",{"type":14,"children":211102,"toc":211970},[211103,211108,211111,211118,211122,211134,211149,211161,211165,211196,211202,211211,211224,211233,211239,211248,211254,211259,211272,211277,211469,211481,211486,211491,211598,211609,211615,211620,211665,211674,211679,211697,211703,211708,211717,211723,211728,211751,211756,211765,211771,211776,211785,211790,211813,211819,211824,211828,211837,211848,211854,211859,211864,211887,211892,211896,211901,211934,211952,211961],{"type":17,"tag":18,"props":211104,"children":211106},{"id":211105},"how-to-power-outbound-campaigns-with-crm-contact-data-using-unifieds-crm-api",[211107],{"type":23,"value":211097},{"type":17,"tag":25,"props":211109,"children":211110},{},[],{"type":17,"tag":29,"props":211112,"children":211113},{},[211114],{"type":17,"tag":33,"props":211115,"children":211116},{},[211117],{"type":23,"value":199463},{"type":17,"tag":29,"props":211119,"children":211120},{},[211121],{"type":23,"value":211098},{"type":17,"tag":29,"props":211123,"children":211124},{},[211125,211127,211132],{"type":23,"value":211126},"When you support multiple CRMs, 'send an email to our contacts' quickly becomes ambiguous. Contact fields vary. Company context may or may not exist. Updates arrive at different times. If you can't explain ",{"type":17,"tag":33,"props":211128,"children":211129},{},[211130],{"type":23,"value":211131},"why",{"type":23,"value":211133}," a contact was included in a campaign, it's hard to trust the results—or debug them.",{"type":17,"tag":29,"props":211135,"children":211136},{},[211137,211138,211142,211144,211148],{"type":23,"value":25244},{"type":17,"tag":133,"props":211139,"children":211140},{"href":61562},[211141],{"type":23,"value":61565},{"type":23,"value":211143}," lets you build outbound audiences on top of a normalized contact and company model. Instead of syncing everything into a separate system or branching logic per CRM, you can fetch contacts, enrich them with company data, and produce a campaign-ready list using documented fields and predictable ",{"type":17,"tag":133,"props":211145,"children":211146},{"href":1857},[211147],{"type":23,"value":1860},{"type":23,"value":54},{"type":17,"tag":29,"props":211150,"children":211151},{},[211152,211154,211159],{"type":23,"value":211153},"This guide shows how to build a clean, reusable outbound audience using ",{"type":17,"tag":48,"props":211155,"children":211156},{},[211157],{"type":23,"value":211158},"contacts and companies only",{"type":23,"value":211160},", with Unified's CRM API and the TypeScript SDK. No campaign tools, no UI, and no assumptions about delivery channels.",{"type":17,"tag":239,"props":211162,"children":211163},{"id":141798},[211164],{"type":23,"value":141801},{"type":17,"tag":80,"props":211166,"children":211167},{},[211168,211172,211177,211186],{"type":17,"tag":84,"props":211169,"children":211170},{},[211171],{"type":23,"value":199683},{"type":17,"tag":84,"props":211173,"children":211174},{},[211175],{"type":23,"value":211176},"A Unified account with a CRM integration enabled",{"type":17,"tag":84,"props":211178,"children":211179},{},[211180,211181,211185],{"type":23,"value":199693},{"type":17,"tag":133,"props":211182,"children":211183},{"href":7691},[211184],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":211187,"children":211188},{},[211189,211191],{"type":23,"value":211190},"A customer CRM ",{"type":17,"tag":6121,"props":211192,"children":211194},{"className":211193},[],[211195],{"type":23,"value":19766},{"type":17,"tag":68,"props":211197,"children":211199},{"id":211198},"step-1-set-up-your-project",[211200],{"type":23,"value":211201},"Step 1: Set up your project",{"type":17,"tag":6893,"props":211203,"children":211206},{"className":211204,"code":211205,"language":48432,"meta":7},[48430],"mkdir crm-outbound-audience\ncd crm-outbound-audience\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[211207],{"type":17,"tag":6121,"props":211208,"children":211209},{"__ignoreMap":7},[211210],{"type":23,"value":211205},{"type":17,"tag":29,"props":211212,"children":211213},{},[211214,211216,211222],{"type":23,"value":211215},"Create a ",{"type":17,"tag":6121,"props":211217,"children":211219},{"className":211218},[],[211220],{"type":23,"value":211221},".env",{"type":23,"value":211223}," file:",{"type":17,"tag":6893,"props":211225,"children":211228},{"className":211226,"code":211227,"language":48432,"meta":7},[48430],"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_CRM=your_customer_crm_connection_id\n",[211229],{"type":17,"tag":6121,"props":211230,"children":211231},{"__ignoreMap":7},[211232],{"type":23,"value":211227},{"type":17,"tag":68,"props":211234,"children":211236},{"id":211235},"step-2-initialize-the-sdk",[211237],{"type":23,"value":211238},"Step 2: Initialize the SDK",{"type":17,"tag":6893,"props":211240,"children":211243},{"className":211241,"code":211242,"language":18718,"meta":7},[18716],"import \"dotenv/config\";\nimport { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nconst { UNIFIED_API_KEY, CONNECTION_CRM } = process.env;\n\nif (!UNIFIED_API_KEY) throw new Error(\"Missing UNIFIED_API_KEY\");\nif (!CONNECTION_CRM) throw new Error(\"Missing CONNECTION_CRM\");\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY },\n});\n\nconst connectionId = CONNECTION_CRM;\n",[211244],{"type":17,"tag":6121,"props":211245,"children":211246},{"__ignoreMap":7},[211247],{"type":23,"value":211242},{"type":17,"tag":68,"props":211249,"children":211251},{"id":211250},"step-3-understand-the-outbound-building-blocks",[211252],{"type":23,"value":211253},"Step 3: Understand the outbound building blocks",{"type":17,"tag":29,"props":211255,"children":211256},{},[211257],{"type":23,"value":211258},"For outbound audience construction, you only need two CRM objects.",{"type":17,"tag":239,"props":211260,"children":211262},{"id":211261},"contacts-crmcontact",[211263,211265,211271],{"type":23,"value":211264},"Contacts (",{"type":17,"tag":6121,"props":211266,"children":211268},{"className":211267},[],[211269],{"type":23,"value":211270},"CrmContact",{"type":23,"value":12034},{"type":17,"tag":29,"props":211273,"children":211274},{},[211275],{"type":23,"value":211276},"Contacts represent people you can reach. Useful fields include:",{"type":17,"tag":80,"props":211278,"children":211279},{},[211280,211320,211410,211427,211443,211459],{"type":17,"tag":84,"props":211281,"children":211282},{},[211283,211285,211290,211291,211296,211297,211302,211303,211308,211309,211314,211315],{"type":23,"value":211284},"identity: ",{"type":17,"tag":6121,"props":211286,"children":211288},{"className":211287},[],[211289],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211292,"children":211294},{"className":211293},[],[211295],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211298,"children":211300},{"className":211299},[],[211301],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211304,"children":211306},{"className":211305},[],[211307],{"type":23,"value":62341},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211310,"children":211312},{"className":211311},[],[211313],{"type":23,"value":62346},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211316,"children":211318},{"className":211317},[],[211319],{"type":23,"value":62375},{"type":17,"tag":84,"props":211321,"children":211322},{},[211323,211325],{"type":23,"value":211324},"contact methods:\n",{"type":17,"tag":80,"props":211326,"children":211327},{},[211328,211363],{"type":17,"tag":84,"props":211329,"children":211330},{},[211331,211336,211337,211342,211343,211349,211350,211356,211357,211362],{"type":17,"tag":6121,"props":211332,"children":211334},{"className":211333},[],[211335],{"type":23,"value":133312},{"type":23,"value":120761},{"type":17,"tag":6121,"props":211338,"children":211340},{"className":211339},[],[211341],{"type":23,"value":27310},{"type":23,"value":44573},{"type":17,"tag":6121,"props":211344,"children":211346},{"className":211345},[],[211347],{"type":23,"value":211348},"WORK",{"type":23,"value":11826},{"type":17,"tag":6121,"props":211351,"children":211353},{"className":211352},[],[211354],{"type":23,"value":211355},"HOME",{"type":23,"value":11826},{"type":17,"tag":6121,"props":211358,"children":211360},{"className":211359},[],[211361],{"type":23,"value":149660},{"type":23,"value":12034},{"type":17,"tag":84,"props":211364,"children":211365},{},[211366,211371,211372,211377,211378,211383,211384,211389,211390,211395,211396,211402,211403,211409],{"type":17,"tag":6121,"props":211367,"children":211369},{"className":211368},[],[211370],{"type":23,"value":133321},{"type":23,"value":120761},{"type":17,"tag":6121,"props":211373,"children":211375},{"className":211374},[],[211376],{"type":23,"value":27310},{"type":23,"value":44573},{"type":17,"tag":6121,"props":211379,"children":211381},{"className":211380},[],[211382],{"type":23,"value":211348},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211385,"children":211387},{"className":211386},[],[211388],{"type":23,"value":211355},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211391,"children":211393},{"className":211392},[],[211394],{"type":23,"value":149660},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211397,"children":211399},{"className":211398},[],[211400],{"type":23,"value":211401},"FAX",{"type":23,"value":11826},{"type":17,"tag":6121,"props":211404,"children":211406},{"className":211405},[],[211407],{"type":23,"value":211408},"MOBILE",{"type":23,"value":12034},{"type":17,"tag":84,"props":211411,"children":211412},{},[211413,211415,211420,211422],{"type":23,"value":211414},"company linkage: ",{"type":17,"tag":6121,"props":211416,"children":211418},{"className":211417},[],[211419],{"type":23,"value":62420},{"type":23,"value":211421}," (string), ",{"type":17,"tag":6121,"props":211423,"children":211425},{"className":211424},[],[211426],{"type":23,"value":110146},{"type":17,"tag":84,"props":211428,"children":211429},{},[211430,211432,211437,211438],{"type":23,"value":211431},"timestamps: ",{"type":17,"tag":6121,"props":211433,"children":211435},{"className":211434},[],[211436],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211439,"children":211441},{"className":211440},[],[211442],{"type":23,"value":25337},{"type":17,"tag":84,"props":211444,"children":211445},{},[211446,211448,211453,211454],{"type":23,"value":211447},"enrichment: ",{"type":17,"tag":6121,"props":211449,"children":211451},{"className":211450},[],[211452],{"type":23,"value":133330},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211455,"children":211457},{"className":211456},[],[211458],{"type":23,"value":133378},{"type":17,"tag":84,"props":211460,"children":211461},{},[211462,211467],{"type":17,"tag":6121,"props":211463,"children":211465},{"className":211464},[],[211466],{"type":23,"value":62389},{"type":23,"value":211468}," for CRM-specific data if needed",{"type":17,"tag":239,"props":211470,"children":211472},{"id":211471},"companies-crmcompany",[211473,211474,211480],{"type":23,"value":206906},{"type":17,"tag":6121,"props":211475,"children":211477},{"className":211476},[],[211478],{"type":23,"value":211479},"CrmCompany",{"type":23,"value":12034},{"type":17,"tag":29,"props":211482,"children":211483},{},[211484],{"type":23,"value":211485},"Companies provide firmographic context for targeting and personalization.",{"type":17,"tag":29,"props":211487,"children":211488},{},[211489],{"type":23,"value":211490},"Commonly used fields:",{"type":17,"tag":80,"props":211492,"children":211493},{},[211494,211509,211537,211548,211563,211573,211588],{"type":17,"tag":84,"props":211495,"children":211496},{},[211497,211498,211503,211504],{"type":23,"value":211284},{"type":17,"tag":6121,"props":211499,"children":211501},{"className":211500},[],[211502],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211505,"children":211507},{"className":211506},[],[211508],{"type":23,"value":18781},{"type":17,"tag":84,"props":211510,"children":211511},{},[211512,211514,211519,211520,211525,211526,211531,211532],{"type":23,"value":211513},"firmographics: ",{"type":17,"tag":6121,"props":211515,"children":211517},{"className":211516},[],[211518],{"type":23,"value":50783},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211521,"children":211523},{"className":211522},[],[211524],{"type":23,"value":62469},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211527,"children":211529},{"className":211528},[],[211530],{"type":23,"value":62868},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211533,"children":211535},{"className":211534},[],[211536],{"type":23,"value":22305},{"type":17,"tag":84,"props":211538,"children":211539},{},[211540,211542],{"type":23,"value":211541},"domains: ",{"type":17,"tag":6121,"props":211543,"children":211545},{"className":211544},[],[211546],{"type":23,"value":211547},"domains[]",{"type":17,"tag":84,"props":211549,"children":211550},{},[211551,211552,211557,211558],{"type":23,"value":211447},{"type":17,"tag":6121,"props":211553,"children":211555},{"className":211554},[],[211556],{"type":23,"value":133369},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211559,"children":211561},{"className":211560},[],[211562],{"type":23,"value":133378},{"type":17,"tag":84,"props":211564,"children":211565},{},[211566,211568],{"type":23,"value":211567},"relationships: ",{"type":17,"tag":6121,"props":211569,"children":211571},{"className":211570},[],[211572],{"type":23,"value":110157},{"type":17,"tag":84,"props":211574,"children":211575},{},[211576,211577,211582,211583],{"type":23,"value":211431},{"type":17,"tag":6121,"props":211578,"children":211580},{"className":211579},[],[211581],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":211584,"children":211586},{"className":211585},[],[211587],{"type":23,"value":25337},{"type":17,"tag":84,"props":211589,"children":211590},{},[211591,211596],{"type":17,"tag":6121,"props":211592,"children":211594},{"className":211593},[],[211595],{"type":23,"value":62389},{"type":23,"value":211597}," when CRM-specific data is required",{"type":17,"tag":29,"props":211599,"children":211600},{},[211601,211603,211608],{"type":23,"value":211602},"Required fields and write support vary by CRM. Always verify field support for your integration in the ",{"type":17,"tag":48,"props":211604,"children":211605},{},[211606],{"type":23,"value":211607},"Feature Support",{"type":23,"value":6557},{"type":17,"tag":68,"props":211610,"children":211612},{"id":211611},"step-4-fetch-contacts-safely-pagination-freshness",[211613],{"type":23,"value":211614},"Step 4: Fetch contacts safely (pagination + freshness)",{"type":17,"tag":29,"props":211616,"children":211617},{},[211618],{"type":23,"value":211619},"The contact list endpoint supports pagination and incremental filtering:",{"type":17,"tag":80,"props":211621,"children":211622},{},[211623,211633,211643,211653],{"type":17,"tag":84,"props":211624,"children":211625},{},[211626,211631],{"type":17,"tag":6121,"props":211627,"children":211629},{"className":211628},[],[211630],{"type":23,"value":48389},{"type":23,"value":211632}," defaults to 100",{"type":17,"tag":84,"props":211634,"children":211635},{},[211636,211641],{"type":17,"tag":6121,"props":211637,"children":211639},{"className":211638},[],[211640],{"type":23,"value":48411},{"type":23,"value":211642}," is zero-based",{"type":17,"tag":84,"props":211644,"children":211645},{},[211646,211648],{"type":23,"value":211647},"stop paging when returned results are fewer than ",{"type":17,"tag":6121,"props":211649,"children":211651},{"className":211650},[],[211652],{"type":23,"value":48389},{"type":17,"tag":84,"props":211654,"children":211655},{},[211656,211658,211663],{"type":23,"value":211657},"use ",{"type":17,"tag":6121,"props":211659,"children":211661},{"className":211660},[],[211662],{"type":23,"value":26291},{"type":23,"value":211664}," to fetch only recently changed contacts",{"type":17,"tag":6893,"props":211666,"children":211669},{"className":211667,"code":211668,"language":18718,"meta":7},[18716],"type Sort = \"name\" | \"updated_at\" | \"created_at\";\ntype Order = \"asc\" | \"desc\";\n\nasync function fetchAllContacts(opts?: {\n  pageSize?: number;\n  updated_gte?: string;\n  sort?: Sort;\n  order?: Order;\n  query?: string;\n}) {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmContacts({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte ?? \"\",\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    if (page.length \u003C pageSize) break;\n\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[211670],{"type":17,"tag":6121,"props":211671,"children":211672},{"__ignoreMap":7},[211673],{"type":23,"value":211668},{"type":17,"tag":29,"props":211675,"children":211676},{},[211677],{"type":23,"value":211678},"This pattern keeps outbound audiences:",{"type":17,"tag":80,"props":211680,"children":211681},{},[211682,211687,211692],{"type":17,"tag":84,"props":211683,"children":211684},{},[211685],{"type":23,"value":211686},"explainable",{"type":17,"tag":84,"props":211688,"children":211689},{},[211690],{"type":23,"value":211691},"reproducible",{"type":17,"tag":84,"props":211693,"children":211694},{},[211695],{"type":23,"value":211696},"incremental",{"type":17,"tag":68,"props":211698,"children":211700},{"id":211699},"step-5-fetch-companies-for-enrichment",[211701],{"type":23,"value":211702},"Step 5: Fetch companies for enrichment",{"type":17,"tag":29,"props":211704,"children":211705},{},[211706],{"type":23,"value":211707},"Contacts often reference companies by ID. To enrich your audience with firmographic data, fetch companies and build a lookup map.",{"type":17,"tag":6893,"props":211709,"children":211712},{"className":211710,"code":211711,"language":18718,"meta":7},[18716],"async function fetchAllCompanies(opts?: {\n  pageSize?: number;\n  updated_gte?: string;\n}) {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmCompanies({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte ?? \"\",\n      sort: \"updated_at\",\n      order: \"asc\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    if (page.length \u003C pageSize) break;\n\n    offset += pageSize;\n  }\n\n  return out;\n}\n\nfunction indexById(rows: any[]): Record\u003Cstring, any> {\n  const out: Record\u003Cstring, any> = {};\n  for (const r of rows) {\n    if (!r?.id) continue;\n    out[String(r.id)] = r;\n  }\n  return out;\n}\n",[211713],{"type":17,"tag":6121,"props":211714,"children":211715},{"__ignoreMap":7},[211716],{"type":23,"value":211711},{"type":17,"tag":68,"props":211718,"children":211720},{"id":211719},"step-6-define-an-outbound-audience-row",[211721],{"type":23,"value":211722},"Step 6: Define an outbound audience row",{"type":17,"tag":29,"props":211724,"children":211725},{},[211726],{"type":23,"value":211727},"An outbound audience row should be:",{"type":17,"tag":80,"props":211729,"children":211730},{},[211731,211736,211741,211746],{"type":17,"tag":84,"props":211732,"children":211733},{},[211734],{"type":23,"value":211735},"deterministic",{"type":17,"tag":84,"props":211737,"children":211738},{},[211739],{"type":23,"value":211740},"built only from documented fields",{"type":17,"tag":84,"props":211742,"children":211743},{},[211744],{"type":23,"value":211745},"explicit about missing data",{"type":17,"tag":84,"props":211747,"children":211748},{},[211749],{"type":23,"value":211750},"easy to inspect and debug",{"type":17,"tag":29,"props":211752,"children":211753},{},[211754],{"type":23,"value":211755},"Here's a conservative, campaign-ready shape:",{"type":17,"tag":6893,"props":211757,"children":211760},{"className":211758,"code":211759,"language":18718,"meta":7},[18716],"type OutboundContact = {\n  contact_id: string;\n\n  first_name?: string;\n  last_name?: string;\n  title?: string;\n  department?: string;\n\n  primary_email?: string;\n  email_type?: string;\n  primary_phone?: string;\n\n  company_id?: string;\n  company_name?: string;\n  company_industry?: string;\n  company_employees?: number;\n  company_is_active?: boolean;\n  company_domains?: string[];\n\n  last_updated_at?: string;\n};\n",[211761],{"type":17,"tag":6121,"props":211762,"children":211763},{"__ignoreMap":7},[211764],{"type":23,"value":211759},{"type":17,"tag":68,"props":211766,"children":211768},{"id":211767},"step-7-build-the-outbound-audience",[211769],{"type":23,"value":211770},"Step 7: Build the outbound audience",{"type":17,"tag":29,"props":211772,"children":211773},{},[211774],{"type":23,"value":211775},"This step joins contacts to companies and extracts the fields needed for outreach and segmentation.",{"type":17,"tag":6893,"props":211777,"children":211780},{"className":211778,"code":211779,"language":18718,"meta":7},[18716],"function buildOutboundAudience(input: {\n  contacts: any[];\n  companiesById: Record\u003Cstring, any>;\n}): OutboundContact[] {\n  const { contacts, companiesById } = input;\n  const out: OutboundContact[] = [];\n\n  for (const c of contacts) {\n    if (!c?.id) continue;\n\n    const email = c.emails?.[0];\n    const phone = c.telephones?.[0];\n\n    const companyId = c.company_ids?.[0];\n    const company = companyId ? companiesById[companyId] : undefined;\n\n    out.push({\n      contact_id: c.id,\n\n      first_name: c.first_name,\n      last_name: c.last_name,\n      title: c.title,\n      department: c.department,\n\n      primary_email: email?.email,\n      email_type: email?.type,\n      primary_phone: phone?.telephone,\n\n      company_id: companyId,\n      company_name: company?.name ?? c.company,\n      company_industry: company?.industry,\n      company_employees: company?.employees,\n      company_is_active: company?.is_active,\n      company_domains: company?.domains,\n\n      last_updated_at: c.updated_at,\n    });\n  }\n\n  return out;\n}\n",[211781],{"type":17,"tag":6121,"props":211782,"children":211783},{"__ignoreMap":7},[211784],{"type":23,"value":211779},{"type":17,"tag":29,"props":211786,"children":211787},{},[211788],{"type":23,"value":211789},"This produces an audience you can:",{"type":17,"tag":80,"props":211791,"children":211792},{},[211793,211798,211803,211808],{"type":17,"tag":84,"props":211794,"children":211795},{},[211796],{"type":23,"value":211797},"filter by firmographics",{"type":17,"tag":84,"props":211799,"children":211800},{},[211801],{"type":23,"value":211802},"segment by role or department",{"type":17,"tag":84,"props":211804,"children":211805},{},[211806],{"type":23,"value":211807},"personalize messaging",{"type":17,"tag":84,"props":211809,"children":211810},{},[211811],{"type":23,"value":211812},"audit when contacts were last updated",{"type":17,"tag":68,"props":211814,"children":211816},{"id":211815},"step-8-segment-the-audience-for-campaigns",[211817],{"type":23,"value":211818},"Step 8: Segment the audience for campaigns",{"type":17,"tag":29,"props":211820,"children":211821},{},[211822],{"type":23,"value":211823},"Once you have a normalized audience, segmentation becomes straightforward and CRM-agnostic.",{"type":17,"tag":29,"props":211825,"children":211826},{},[211827],{"type":23,"value":377},{"type":17,"tag":6893,"props":211829,"children":211832},{"className":211830,"code":211831,"language":18718,"meta":7},[18716],"const enterpriseEngineeringContacts = audience.filter(\n  (c) =>\n    c.company_employees !== undefined &&\n    c.company_employees >= 1000 &&\n    c.department === \"Engineering\"\n);\n\nconst activeCompanyContacts = audience.filter(\n  (c) => c.company_is_active === true\n);\n",[211833],{"type":17,"tag":6121,"props":211834,"children":211835},{"__ignoreMap":7},[211836],{"type":23,"value":211831},{"type":17,"tag":29,"props":211838,"children":211839},{},[211840,211842,211846],{"type":23,"value":211841},"These filters behave consistently across CRMs because they're applied ",{"type":17,"tag":33,"props":211843,"children":211844},{},[211845],{"type":23,"value":126267},{"type":23,"value":211847}," normalization.",{"type":17,"tag":68,"props":211849,"children":211851},{"id":211850},"step-9-use-the-audience-in-outbound-workflows",[211852],{"type":23,"value":211853},"Step 9: Use the audience in outbound workflows",{"type":17,"tag":29,"props":211855,"children":211856},{},[211857],{"type":23,"value":211858},"Unified provides the audience. Delivery happens elsewhere.",{"type":17,"tag":29,"props":211860,"children":211861},{},[211862],{"type":23,"value":211863},"From here, you can:",{"type":17,"tag":80,"props":211865,"children":211866},{},[211867,211872,211877,211882],{"type":17,"tag":84,"props":211868,"children":211869},{},[211870],{"type":23,"value":211871},"send contacts to an email provider",{"type":17,"tag":84,"props":211873,"children":211874},{},[211875],{"type":23,"value":211876},"sync to a sales engagement tool",{"type":17,"tag":84,"props":211878,"children":211879},{},[211880],{"type":23,"value":211881},"enqueue jobs for SMS or call workflows",{"type":17,"tag":84,"props":211883,"children":211884},{},[211885],{"type":23,"value":211886},"generate CSVs for review or approval",{"type":17,"tag":29,"props":211888,"children":211889},{},[211890],{"type":23,"value":211891},"Keep delivery concerns separate from audience construction. It makes campaigns easier to reason about and debug.",{"type":17,"tag":68,"props":211893,"children":211894},{"id":44585},[211895],{"type":23,"value":44588},{"type":17,"tag":29,"props":211897,"children":211898},{},[211899],{"type":23,"value":211900},"Using Unified's CRM API, you can power outbound campaigns with a clean, explainable audience built from normalized contact and company data:",{"type":17,"tag":80,"props":211902,"children":211903},{},[211904,211914,211919,211924,211929],{"type":17,"tag":84,"props":211905,"children":211906},{},[211907,211909],{"type":23,"value":211908},"Fetch contacts incrementally using ",{"type":17,"tag":6121,"props":211910,"children":211912},{"className":211911},[],[211913],{"type":23,"value":26291},{"type":17,"tag":84,"props":211915,"children":211916},{},[211917],{"type":23,"value":211918},"Enrich with firmographic context from companies",{"type":17,"tag":84,"props":211920,"children":211921},{},[211922],{"type":23,"value":211923},"Build deterministic, inspectable audience rows",{"type":17,"tag":84,"props":211925,"children":211926},{},[211927],{"type":23,"value":211928},"Segment without CRM-specific logic",{"type":17,"tag":84,"props":211930,"children":211931},{},[211932],{"type":23,"value":211933},"Reuse the same pipeline across customers and CRMs",{"type":17,"tag":29,"props":211935,"children":211936},{},[211937,211939,211944,211945,211950],{"type":23,"value":211938},"By separating ",{"type":17,"tag":48,"props":211940,"children":211941},{},[211942],{"type":23,"value":211943},"audience definition",{"type":23,"value":70920},{"type":17,"tag":48,"props":211946,"children":211947},{},[211948],{"type":23,"value":211949},"message delivery",{"type":23,"value":211951},", you keep outbound systems flexible, auditable, and easier to maintain as you add new CRM integrations.",{"type":17,"tag":29,"props":211953,"children":211954},{},[211955,211956],{"type":23,"value":1609},{"type":17,"tag":133,"props":211957,"children":211959},{"href":1612,"rel":211958},[214],[211960],{"type":23,"value":1616},{"type":17,"tag":29,"props":211962,"children":211963},{},[211964,211965],{"type":23,"value":1609},{"type":17,"tag":133,"props":211966,"children":211968},{"href":1623,"rel":211967},[214],[211969],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":211971},[211972,211973,211974,211975,211981,211982,211983,211984,211985,211986,211987],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":211250,"depth":1629,"text":211253,"children":211976},[211977,211979],{"id":211261,"depth":1635,"text":211978},"Contacts (CrmContact)",{"id":211471,"depth":1635,"text":211980},"Companies (CrmCompany)",{"id":211611,"depth":1629,"text":211614},{"id":211699,"depth":1629,"text":211702},{"id":211719,"depth":1629,"text":211722},{"id":211767,"depth":1629,"text":211770},{"id":211815,"depth":1629,"text":211818},{"id":211850,"depth":1629,"text":211853},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_power_outbound_campaigns_with_crm_contact_data_using_unified_crm_api.md","blog/how_to_power_outbound_campaigns_with_crm_contact_data_using_unified_crm_api.md","blog/how_to_power_outbound_campaigns_with_crm_contact_data_using_unified_crm_api",{"_path":211992,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":211993,"description":211994,"img":211995,"date":211100,"tag":12,"body":211996,"_type":1677,"_id":212786,"_source":1679,"_file":212787,"_stem":212788,"_extension":1682},"/blog/how_to_rank_and_recommend_sales_opportunities_using_unified_crm_api","How to Rank and Recommend Sales Opportunities Using Unified's CRM API","Opportunity recommendations only work if the signals behind them are consistent.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_rank_and_recommend_sales_opportunities_using_unified_crm_api-icon.png",{"type":14,"children":211997,"toc":212766},[211998,212003,212006,212013,212017,212022,212027,212037,212048,212052,212081,212085,212094,212104,212112,212116,212124,212130,212135,212148,212153,212297,212308,212321,212326,212391,212396,212410,212415,212483,212488,212494,212499,212508,212519,212525,212530,212539,212545,212550,212555,212573,212582,212587,212610,212616,212621,212630,212647,212653,212662,212667,212673,212678,212683,212706,212710,212715,212743,212748,212757],{"type":17,"tag":18,"props":211999,"children":212001},{"id":212000},"how-to-rank-and-recommend-sales-opportunities-using-unifieds-crm-api",[212002],{"type":23,"value":211993},{"type":17,"tag":25,"props":212004,"children":212005},{},[],{"type":17,"tag":29,"props":212007,"children":212008},{},[212009],{"type":17,"tag":33,"props":212010,"children":212011},{},[212012],{"type":23,"value":199463},{"type":17,"tag":29,"props":212014,"children":212015},{},[212016],{"type":23,"value":211994},{"type":17,"tag":29,"props":212018,"children":212019},{},[212020],{"type":23,"value":212021},"Across CRMs, deals don't mean the same thing. Stages imply different probabilities. Pipelines encode different business processes. Some teams update probability manually. Others rely on stage defaults. Activity may be attached to a deal directly, inferred from contacts, or logged inconsistently.",{"type":17,"tag":29,"props":212023,"children":212024},{},[212025],{"type":23,"value":212026},"If you try to rank opportunities without accounting for those differences, recommendations become hard to trust. A deal looks 'hot' in one CRM and stale in another, even when the underlying signals are similar.",{"type":17,"tag":29,"props":212028,"children":212029},{},[212030,212031,212035],{"type":23,"value":25244},{"type":17,"tag":133,"props":212032,"children":212033},{"href":61562},[212034],{"type":23,"value":61565},{"type":23,"value":212036}," gives you a normalized deal, pipeline, and event model that makes opportunity ranking explicit and explainable. You can list open deals, attach stage semantics from pipelines, incorporate recent activity from events, and produce ranked recommendations using documented fields only.",{"type":17,"tag":29,"props":212038,"children":212039},{},[212040,212042,212046],{"type":23,"value":212041},"This guide shows how to rank and recommend sales opportunities using Unified's CRM API in TypeScript. It focuses on deals and pipelines as the core ranking signal, with optional engagement signals from events. No UI assumptions, no ",{"type":17,"tag":133,"props":212043,"children":212044},{"href":4999},[212045],{"type":23,"value":5002},{"type":23,"value":212047},", and no undocumented behavior.",{"type":17,"tag":239,"props":212049,"children":212050},{"id":141798},[212051],{"type":23,"value":141801},{"type":17,"tag":80,"props":212053,"children":212054},{},[212055,212059,212063,212072],{"type":17,"tag":84,"props":212056,"children":212057},{},[212058],{"type":23,"value":199683},{"type":17,"tag":84,"props":212060,"children":212061},{},[212062],{"type":23,"value":211176},{"type":17,"tag":84,"props":212064,"children":212065},{},[212066,212067,212071],{"type":23,"value":199693},{"type":17,"tag":133,"props":212068,"children":212069},{"href":7691},[212070],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":212073,"children":212074},{},[212075,212076],{"type":23,"value":211190},{"type":17,"tag":6121,"props":212077,"children":212079},{"className":212078},[],[212080],{"type":23,"value":19766},{"type":17,"tag":68,"props":212082,"children":212083},{"id":211198},[212084],{"type":23,"value":211201},{"type":17,"tag":6893,"props":212086,"children":212089},{"className":212087,"code":212088,"language":48432,"meta":7},[48430],"mkdir crm-opportunity-ranking\ncd crm-opportunity-ranking\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[212090],{"type":17,"tag":6121,"props":212091,"children":212092},{"__ignoreMap":7},[212093],{"type":23,"value":212088},{"type":17,"tag":29,"props":212095,"children":212096},{},[212097,212098,212103],{"type":23,"value":211215},{"type":17,"tag":6121,"props":212099,"children":212101},{"className":212100},[],[212102],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":212105,"children":212107},{"className":212106,"code":211227,"language":48432,"meta":7},[48430],[212108],{"type":17,"tag":6121,"props":212109,"children":212110},{"__ignoreMap":7},[212111],{"type":23,"value":211227},{"type":17,"tag":68,"props":212113,"children":212114},{"id":211235},[212115],{"type":23,"value":211238},{"type":17,"tag":6893,"props":212117,"children":212119},{"className":212118,"code":211242,"language":18718,"meta":7},[18716],[212120],{"type":17,"tag":6121,"props":212121,"children":212122},{"__ignoreMap":7},[212123],{"type":23,"value":211242},{"type":17,"tag":68,"props":212125,"children":212127},{"id":212126},"step-3-understand-the-ranking-inputs",[212128],{"type":23,"value":212129},"Step 3: Understand the ranking inputs",{"type":17,"tag":29,"props":212131,"children":212132},{},[212133],{"type":23,"value":212134},"Opportunity ranking is built from three documented CRM objects.",{"type":17,"tag":239,"props":212136,"children":212138},{"id":212137},"deals-crmdeal",[212139,212141,212147],{"type":23,"value":212140},"Deals (",{"type":17,"tag":6121,"props":212142,"children":212144},{"className":212143},[],[212145],{"type":23,"value":212146},"CrmDeal",{"type":23,"value":12034},{"type":17,"tag":29,"props":212149,"children":212150},{},[212151],{"type":23,"value":212152},"Deals are the unit being ranked. Fields commonly used for ranking include:",{"type":17,"tag":80,"props":212154,"children":212155},{},[212156,212178,212194,212223,212239,212251,212267,212277,212287],{"type":17,"tag":84,"props":212157,"children":212158},{},[212159,212161,212166,212167,212172,212173],{"type":23,"value":212160},"identity and timing: ",{"type":17,"tag":6121,"props":212162,"children":212164},{"className":212163},[],[212165],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212168,"children":212170},{"className":212169},[],[212171],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212174,"children":212176},{"className":212175},[],[212177],{"type":23,"value":25337},{"type":17,"tag":84,"props":212179,"children":212180},{},[212181,212183,212188,212189],{"type":23,"value":212182},"value: ",{"type":17,"tag":6121,"props":212184,"children":212186},{"className":212185},[],[212187],{"type":23,"value":25890},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212190,"children":212192},{"className":212191},[],[212193],{"type":23,"value":22296},{"type":17,"tag":84,"props":212195,"children":212196},{},[212197,212199,212205,212206,212211,212212,212217,212218],{"type":23,"value":212198},"pipeline context: ",{"type":17,"tag":6121,"props":212200,"children":212202},{"className":212201},[],[212203],{"type":23,"value":212204},"stage",{"type":23,"value":11826},{"type":17,"tag":6121,"props":212207,"children":212209},{"className":212208},[],[212210],{"type":23,"value":25923},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212213,"children":212215},{"className":212214},[],[212216],{"type":23,"value":62844},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212219,"children":212221},{"className":212220},[],[212222],{"type":23,"value":109074},{"type":17,"tag":84,"props":212224,"children":212225},{},[212226,212228,212233,212234],{"type":23,"value":212227},"lifecycle: ",{"type":17,"tag":6121,"props":212229,"children":212231},{"className":212230},[],[212232],{"type":23,"value":25912},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212235,"children":212237},{"className":212236},[],[212238],{"type":23,"value":62569},{"type":17,"tag":84,"props":212240,"children":212241},{},[212242,212244,212249],{"type":23,"value":212243},"probability: ",{"type":17,"tag":6121,"props":212245,"children":212247},{"className":212246},[],[212248],{"type":23,"value":25901},{"type":23,"value":212250}," (number; range not defined)",{"type":17,"tag":84,"props":212252,"children":212253},{},[212254,212256,212261,212262],{"type":23,"value":212255},"associations: ",{"type":17,"tag":6121,"props":212257,"children":212259},{"className":212258},[],[212260],{"type":23,"value":110157},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212263,"children":212265},{"className":212264},[],[212266],{"type":23,"value":110146},{"type":17,"tag":84,"props":212268,"children":212269},{},[212270,212272],{"type":23,"value":212271},"attribution: ",{"type":17,"tag":6121,"props":212273,"children":212275},{"className":212274},[],[212276],{"type":23,"value":62582},{"type":17,"tag":84,"props":212278,"children":212279},{},[212280,212282],{"type":23,"value":212281},"custom fields: ",{"type":17,"tag":6121,"props":212283,"children":212285},{"className":212284},[],[212286],{"type":23,"value":133378},{"type":17,"tag":84,"props":212288,"children":212289},{},[212290,212295],{"type":17,"tag":6121,"props":212291,"children":212293},{"className":212292},[],[212294],{"type":23,"value":62389},{"type":23,"value":212296}," for CRM-specific context if needed",{"type":17,"tag":29,"props":212298,"children":212299},{},[212300,212302,212307],{"type":23,"value":212301},"Closed deals are identified by the presence of ",{"type":17,"tag":6121,"props":212303,"children":212305},{"className":212304},[],[212306],{"type":23,"value":62569},{"type":23,"value":54},{"type":17,"tag":239,"props":212309,"children":212311},{"id":212310},"pipelines-crmpipeline",[212312,212314,212320],{"type":23,"value":212313},"Pipelines (",{"type":17,"tag":6121,"props":212315,"children":212317},{"className":212316},[],[212318],{"type":23,"value":212319},"CrmPipeline",{"type":23,"value":12034},{"type":17,"tag":29,"props":212322,"children":212323},{},[212324],{"type":23,"value":212325},"Pipelines provide stage-level semantics:",{"type":17,"tag":80,"props":212327,"children":212328},{},[212329],{"type":17,"tag":84,"props":212330,"children":212331},{},[212332,212338,212339],{"type":17,"tag":6121,"props":212333,"children":212335},{"className":212334},[],[212336],{"type":23,"value":212337},"stages[]",{"type":23,"value":199843},{"type":17,"tag":80,"props":212340,"children":212341},{},[212342,212350,212358,212366,212375,212383],{"type":17,"tag":84,"props":212343,"children":212344},{},[212345],{"type":17,"tag":6121,"props":212346,"children":212348},{"className":212347},[],[212349],{"type":23,"value":18766},{"type":17,"tag":84,"props":212351,"children":212352},{},[212353],{"type":17,"tag":6121,"props":212354,"children":212356},{"className":212355},[],[212357],{"type":23,"value":18781},{"type":17,"tag":84,"props":212359,"children":212360},{},[212361],{"type":17,"tag":6121,"props":212362,"children":212364},{"className":212363},[],[212365],{"type":23,"value":62873},{"type":17,"tag":84,"props":212367,"children":212368},{},[212369],{"type":17,"tag":6121,"props":212370,"children":212372},{"className":212371},[],[212373],{"type":23,"value":212374},"is_closed",{"type":17,"tag":84,"props":212376,"children":212377},{},[212378],{"type":17,"tag":6121,"props":212379,"children":212381},{"className":212380},[],[212382],{"type":23,"value":174606},{"type":17,"tag":84,"props":212384,"children":212385},{},[212386],{"type":17,"tag":6121,"props":212387,"children":212389},{"className":212388},[],[212390],{"type":23,"value":62878},{"type":17,"tag":29,"props":212392,"children":212393},{},[212394],{"type":23,"value":212395},"This lets you interpret stages consistently without hardcoding CRM-specific logic.",{"type":17,"tag":239,"props":212397,"children":212399},{"id":212398},"events-crmevent-optional",[212400,212402,212408],{"type":23,"value":212401},"Events (",{"type":17,"tag":6121,"props":212403,"children":212405},{"className":212404},[],[212406],{"type":23,"value":212407},"CrmEvent",{"type":23,"value":212409},") optional",{"type":17,"tag":29,"props":212411,"children":212412},{},[212413],{"type":23,"value":212414},"Events represent recent activity tied to deals:",{"type":17,"tag":80,"props":212416,"children":212417},{},[212418,212458,212468],{"type":17,"tag":84,"props":212419,"children":212420},{},[212421,212426,212427,212432,212433,212438,212439,212444,212445,212450,212451,212456],{"type":17,"tag":6121,"props":212422,"children":212424},{"className":212423},[],[212425],{"type":23,"value":27310},{"type":23,"value":49318},{"type":17,"tag":6121,"props":212428,"children":212430},{"className":212429},[],[212431],{"type":23,"value":27057},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212434,"children":212436},{"className":212435},[],[212437],{"type":23,"value":27062},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212440,"children":212442},{"className":212441},[],[212443],{"type":23,"value":27052},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212446,"children":212448},{"className":212447},[],[212449],{"type":23,"value":27047},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212452,"children":212454},{"className":212453},[],[212455],{"type":23,"value":27067},{"type":23,"value":212457},", etc.",{"type":17,"tag":84,"props":212459,"children":212460},{},[212461,212463],{"type":23,"value":212462},"relationship field: ",{"type":17,"tag":6121,"props":212464,"children":212466},{"className":212465},[],[212467],{"type":23,"value":110168},{"type":17,"tag":84,"props":212469,"children":212470},{},[212471,212472,212477,212478],{"type":23,"value":211431},{"type":17,"tag":6121,"props":212473,"children":212475},{"className":212474},[],[212476],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":212479,"children":212481},{"className":212480},[],[212482],{"type":23,"value":25337},{"type":17,"tag":29,"props":212484,"children":212485},{},[212486],{"type":23,"value":212487},"Events can be used as a recency or engagement signal, but they are optional. The core ranking works without them.",{"type":17,"tag":68,"props":212489,"children":212491},{"id":212490},"step-4-fetch-open-deals",[212492],{"type":23,"value":212493},"Step 4: Fetch open deals",{"type":17,"tag":29,"props":212495,"children":212496},{},[212497],{"type":23,"value":212498},"Opportunity recommendations should focus on deals that are still open.",{"type":17,"tag":6893,"props":212500,"children":212503},{"className":212501,"code":212502,"language":18718,"meta":7},[18716],"async function fetchOpenDeals(opts?: {\n  pageSize?: number;\n  updated_gte?: string;\n  pipeline_id?: string;\n}) {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmDeals({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte ?? \"\",\n      pipeline_id: opts?.pipeline_id ?? \"\",\n      sort: \"updated_at\",\n      order: \"asc\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    for (const d of page) {\n      if (!d.closed_at) {\n        out.push(d);\n      }\n    }\n\n    if (page.length \u003C pageSize) break;\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[212504],{"type":17,"tag":6121,"props":212505,"children":212506},{"__ignoreMap":7},[212507],{"type":23,"value":212502},{"type":17,"tag":29,"props":212509,"children":212510},{},[212511,212513,212518],{"type":23,"value":212512},"This excludes closed deals using the documented ",{"type":17,"tag":6121,"props":212514,"children":212516},{"className":212515},[],[212517],{"type":23,"value":62569},{"type":23,"value":72754},{"type":17,"tag":68,"props":212520,"children":212522},{"id":212521},"step-5-fetch-pipelines-and-stage-metadata",[212523],{"type":23,"value":212524},"Step 5: Fetch pipelines and stage metadata",{"type":17,"tag":29,"props":212526,"children":212527},{},[212528],{"type":23,"value":212529},"Stage metadata is required to interpret where a deal sits in the sales process.",{"type":17,"tag":6893,"props":212531,"children":212534},{"className":212532,"code":212533,"language":18718,"meta":7},[18716],"async function fetchAllPipelines() {\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmPipelines({\n      connectionId,\n      limit: 100,\n      offset,\n      sort: \"updated_at\",\n      order: \"asc\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    if (page.length \u003C 100) break;\n    offset += 100;\n  }\n\n  return out;\n}\n\nfunction indexStagesByPipeline(pipelines: any[]) {\n  const out: Record\u003Cstring, Record\u003Cstring, any>> = {};\n\n  for (const p of pipelines) {\n    if (!p?.id) continue;\n    out[p.id] = {};\n    for (const s of p.stages ?? []) {\n      if (!s?.id) continue;\n      out[p.id][s.id] = s;\n    }\n  }\n\n  return out;\n}\n",[212535],{"type":17,"tag":6121,"props":212536,"children":212537},{"__ignoreMap":7},[212538],{"type":23,"value":212533},{"type":17,"tag":68,"props":212540,"children":212542},{"id":212541},"step-6-define-a-ranking-score",[212543],{"type":23,"value":212544},"Step 6: Define a ranking score",{"type":17,"tag":29,"props":212546,"children":212547},{},[212548],{"type":23,"value":212549},"Ranking should be explainable. Avoid opaque formulas that depend on undocumented behavior.",{"type":17,"tag":29,"props":212551,"children":212552},{},[212553],{"type":23,"value":212554},"Here's a conservative scoring model:",{"type":17,"tag":80,"props":212556,"children":212557},{},[212558,212563,212568],{"type":17,"tag":84,"props":212559,"children":212560},{},[212561],{"type":23,"value":212562},"Base score from deal value and probability",{"type":17,"tag":84,"props":212564,"children":212565},{},[212566],{"type":23,"value":212567},"Stage weight from pipeline stage metadata",{"type":17,"tag":84,"props":212569,"children":212570},{},[212571],{"type":23,"value":212572},"Optional boost from recent activity",{"type":17,"tag":6893,"props":212574,"children":212577},{"className":212575,"code":212576,"language":18718,"meta":7},[18716],"function scoreDeal(input: {\n  deal: any;\n  stage?: any;\n  recentEventCount?: number;\n}) {\n  const amount = Number(input.deal.amount ?? 0);\n  const probability = Number(input.deal.probability ?? 0);\n\n  const baseScore = amount * probability;\n\n  const stageProbability =\n    typeof input.stage?.deal_probability === \"number\"\n      ? input.stage.deal_probability\n      : 1;\n\n  const activityBoost =\n    typeof input.recentEventCount === \"number\"\n      ? 1 + Math.min(input.recentEventCount, 5) * 0.05\n      : 1;\n\n  return baseScore * stageProbability * activityBoost;\n}\n",[212578],{"type":17,"tag":6121,"props":212579,"children":212580},{"__ignoreMap":7},[212581],{"type":23,"value":212576},{"type":17,"tag":29,"props":212583,"children":212584},{},[212585],{"type":23,"value":212586},"This model:",{"type":17,"tag":80,"props":212588,"children":212589},{},[212590,212595,212600,212605],{"type":17,"tag":84,"props":212591,"children":212592},{},[212593],{"type":23,"value":212594},"does not assume a probability range",{"type":17,"tag":84,"props":212596,"children":212597},{},[212598],{"type":23,"value":212599},"does not mix currencies",{"type":17,"tag":84,"props":212601,"children":212602},{},[212603],{"type":23,"value":212604},"uses stage metadata only when available",{"type":17,"tag":84,"props":212606,"children":212607},{},[212608],{"type":23,"value":212609},"treats engagement as a bounded boost",{"type":17,"tag":68,"props":212611,"children":212613},{"id":212612},"step-7-optional-engagement-signal-from-events",[212614],{"type":23,"value":212615},"Step 7: Optional engagement signal from events",{"type":17,"tag":29,"props":212617,"children":212618},{},[212619],{"type":23,"value":212620},"If you want to boost deals with recent activity, fetch events tied to each deal.",{"type":17,"tag":6893,"props":212622,"children":212625},{"className":212623,"code":212624,"language":18718,"meta":7},[18716],"async function countRecentDealEvents(dealId: string, updated_gte: string) {\n  let offset = 0;\n  let count = 0;\n\n  while (true) {\n    const page = await sdk.crm.listCrmEvents({\n      connectionId,\n      limit: 100,\n      offset,\n      updated_gte,\n      deal_id: dealId,\n      sort: \"updated_at\",\n      order: \"asc\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    count += page.length;\n    if (page.length \u003C 100) break;\n    offset += 100;\n  }\n\n  return count;\n}\n",[212626],{"type":17,"tag":6121,"props":212627,"children":212628},{"__ignoreMap":7},[212629],{"type":23,"value":212624},{"type":17,"tag":29,"props":212631,"children":212632},{},[212633,212634,212639,212640,212645],{"type":23,"value":33722},{"type":17,"tag":6121,"props":212635,"children":212637},{"className":212636},[],[212638],{"type":23,"value":25337},{"type":23,"value":34435},{"type":17,"tag":6121,"props":212641,"children":212643},{"className":212642},[],[212644],{"type":23,"value":26291},{"type":23,"value":212646}," as the recency checkpoint.",{"type":17,"tag":68,"props":212648,"children":212650},{"id":212649},"step-8-rank-opportunities",[212651],{"type":23,"value":212652},"Step 8: Rank opportunities",{"type":17,"tag":6893,"props":212654,"children":212657},{"className":212655,"code":212656,"language":18718,"meta":7},[18716],"async function rankOpportunities() {\n  const deals = await fetchOpenDeals();\n  const pipelines = await fetchAllPipelines();\n  const stagesByPipeline = indexStagesByPipeline(pipelines);\n\n  const ranked = [];\n\n  for (const d of deals) {\n    const stage =\n      d.pipeline_id && d.stage_id\n        ? stagesByPipeline[d.pipeline_id]?.[d.stage_id]\n        : undefined;\n\n    const score = scoreDeal({\n      deal: d,\n      stage,\n    });\n\n    ranked.push({\n      deal_id: d.id,\n      name: d.name,\n      stage: d.stage,\n      pipeline: d.pipeline,\n      amount: d.amount,\n      currency: d.currency,\n      score,\n    });\n  }\n\n  ranked.sort((a, b) => b.score - a.score);\n  return ranked;\n}\n",[212658],{"type":17,"tag":6121,"props":212659,"children":212660},{"__ignoreMap":7},[212661],{"type":23,"value":212656},{"type":17,"tag":29,"props":212663,"children":212664},{},[212665],{"type":23,"value":212666},"This produces an ordered list of opportunities you can surface to users.",{"type":17,"tag":68,"props":212668,"children":212670},{"id":212669},"step-9-present-recommendations",[212671],{"type":23,"value":212672},"Step 9: Present recommendations",{"type":17,"tag":29,"props":212674,"children":212675},{},[212676],{"type":23,"value":212677},"Unified provides the ranking signal. Presentation happens elsewhere.",{"type":17,"tag":29,"props":212679,"children":212680},{},[212681],{"type":23,"value":212682},"You can now:",{"type":17,"tag":80,"props":212684,"children":212685},{},[212686,212691,212696,212701],{"type":17,"tag":84,"props":212687,"children":212688},{},[212689],{"type":23,"value":212690},"show the top N deals per rep",{"type":17,"tag":84,"props":212692,"children":212693},{},[212694],{"type":23,"value":212695},"trigger reminders for high-scoring opportunities",{"type":17,"tag":84,"props":212697,"children":212698},{},[212699],{"type":23,"value":212700},"generate daily or weekly follow-up queues",{"type":17,"tag":84,"props":212702,"children":212703},{},[212704],{"type":23,"value":212705},"audit why a deal was recommended using score components",{"type":17,"tag":68,"props":212707,"children":212708},{"id":44585},[212709],{"type":23,"value":44588},{"type":17,"tag":29,"props":212711,"children":212712},{},[212713],{"type":23,"value":212714},"Using Unified's CRM API, you can rank and recommend sales opportunities with a clear, explainable data model:",{"type":17,"tag":80,"props":212716,"children":212717},{},[212718,212723,212728,212733,212738],{"type":17,"tag":84,"props":212719,"children":212720},{},[212721],{"type":23,"value":212722},"Fetch open deals using documented lifecycle fields",{"type":17,"tag":84,"props":212724,"children":212725},{},[212726],{"type":23,"value":212727},"Interpret stage semantics through pipelines",{"type":17,"tag":84,"props":212729,"children":212730},{},[212731],{"type":23,"value":212732},"Optionally incorporate recent activity from events",{"type":17,"tag":84,"props":212734,"children":212735},{},[212736],{"type":23,"value":212737},"Score and sort opportunities without CRM-specific branching",{"type":17,"tag":84,"props":212739,"children":212740},{},[212741],{"type":23,"value":212742},"Keep recommendations auditable and portable across integrations",{"type":17,"tag":29,"props":212744,"children":212745},{},[212746],{"type":23,"value":212747},"By grounding recommendations in normalized CRM objects and explicit constraints, you avoid the ambiguity that makes opportunity ranking hard to trust as you support more CRMs.",{"type":17,"tag":29,"props":212749,"children":212750},{},[212751,212752],{"type":23,"value":1609},{"type":17,"tag":133,"props":212753,"children":212755},{"href":1612,"rel":212754},[214],[212756],{"type":23,"value":1616},{"type":17,"tag":29,"props":212758,"children":212759},{},[212760,212761],{"type":23,"value":1609},{"type":17,"tag":133,"props":212762,"children":212764},{"href":1623,"rel":212763},[214],[212765],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":212767},[212768,212769,212770,212771,212779,212780,212781,212782,212783,212784,212785],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":212126,"depth":1629,"text":212129,"children":212772},[212773,212775,212777],{"id":212137,"depth":1635,"text":212774},"Deals (CrmDeal)",{"id":212310,"depth":1635,"text":212776},"Pipelines (CrmPipeline)",{"id":212398,"depth":1635,"text":212778},"Events (CrmEvent) optional",{"id":212490,"depth":1629,"text":212493},{"id":212521,"depth":1629,"text":212524},{"id":212541,"depth":1629,"text":212544},{"id":212612,"depth":1629,"text":212615},{"id":212649,"depth":1629,"text":212652},{"id":212669,"depth":1629,"text":212672},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_rank_and_recommend_sales_opportunities_using_unified_crm_api.md","blog/how_to_rank_and_recommend_sales_opportunities_using_unified_crm_api.md","blog/how_to_rank_and_recommend_sales_opportunities_using_unified_crm_api",{"_path":212790,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":212791,"description":212792,"img":212793,"date":211100,"tag":12,"body":212794,"_type":1677,"_id":213723,"_source":1679,"_file":213724,"_stem":213725,"_extension":1682},"/blog/how_to_trigger_notifications_from_deal_events_using_unified_crm_api","How to Trigger Notifications from Deal Events Using Unified's CRM API","Notifications based on deal activity sound straightforward. A call happens. A meeting is scheduled. A note is added. Send a message to Slack or email the...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_trigger_notifications_from_deal_events_using_unified_crm_api-icon.png",{"type":14,"children":212795,"toc":213704},[212796,212801,212804,212811,212816,212828,212833,212838,212854,212865,212869,212898,212902,212911,212921,212929,212933,212941,212947,212958,212964,212976,213043,213054,213058,213136,213142,213147,213183,213195,213200,213205,213228,213247,213253,213258,213262,213306,213318,213324,213329,213334,213382,213391,213395,213428,213434,213446,213451,213478,213483,213492,213498,213503,213512,213517,213523,213528,213537,213557,213563,213568,213573,213582,213588,213597,213609,213615,213620,213629,213634,213638,213643,213686,213695],{"type":17,"tag":18,"props":212797,"children":212799},{"id":212798},"how-to-trigger-notifications-from-deal-events-using-unifieds-crm-api",[212800],{"type":23,"value":212791},{"type":17,"tag":25,"props":212802,"children":212803},{},[],{"type":17,"tag":29,"props":212805,"children":212806},{},[212807],{"type":17,"tag":33,"props":212808,"children":212809},{},[212810],{"type":23,"value":199463},{"type":17,"tag":29,"props":212812,"children":212813},{},[212814],{"type":23,"value":212815},"Notifications based on deal activity sound straightforward. A call happens. A meeting is scheduled. A note is added. Send a message to Slack or email the account owner.",{"type":17,"tag":29,"props":212817,"children":212818},{},[212819,212821,212826],{"type":23,"value":212820},"In practice, this only works if you have a reliable way to detect ",{"type":17,"tag":33,"props":212822,"children":212823},{},[212824],{"type":23,"value":212825},"what actually changed",{"type":23,"value":212827}," on a deal.",{"type":17,"tag":29,"props":212829,"children":212830},{},[212831],{"type":23,"value":212832},"CRMs don't represent activity the same way. Calls, meetings, emails, tasks, and form submissions all live as different objects with different timestamps and payloads. Some CRMs attach activity directly to deals. Others attach it to contacts or companies and infer deal context later. Even the idea of 'new activity' depends on which timestamp you look at.",{"type":17,"tag":29,"props":212834,"children":212835},{},[212836],{"type":23,"value":212837},"If you don't handle that carefully, notifications become noisy or incomplete. You miss important events, or you notify on the same event multiple times.",{"type":17,"tag":29,"props":212839,"children":212840},{},[212841,212842,212846,212848,212852],{"type":23,"value":25244},{"type":17,"tag":133,"props":212843,"children":212844},{"href":61562},[212845],{"type":23,"value":61565},{"type":23,"value":212847}," gives you a normalized ",{"type":17,"tag":48,"props":212849,"children":212850},{},[212851],{"type":23,"value":14528},{"type":23,"value":212853}," object that represents deal-related activity across CRMs. Instead of reacting to vendor-specific activity models, you can poll a single event stream, filter by deal, and trigger notifications based on documented event types and fields.",{"type":17,"tag":29,"props":212855,"children":212856},{},[212857,212859,212863],{"type":23,"value":212858},"This guide shows how to trigger notifications from deal events using Unified's CRM API in TypeScript. It uses polling with incremental checkpoints, event type filtering, and deal context lookup. No ",{"type":17,"tag":133,"props":212860,"children":212861},{"href":4999},[212862],{"type":23,"value":5002},{"type":23,"value":212864},", no UI assumptions, and no undocumented behavior.",{"type":17,"tag":239,"props":212866,"children":212867},{"id":141798},[212868],{"type":23,"value":141801},{"type":17,"tag":80,"props":212870,"children":212871},{},[212872,212876,212880,212889],{"type":17,"tag":84,"props":212873,"children":212874},{},[212875],{"type":23,"value":199683},{"type":17,"tag":84,"props":212877,"children":212878},{},[212879],{"type":23,"value":211176},{"type":17,"tag":84,"props":212881,"children":212882},{},[212883,212884,212888],{"type":23,"value":199693},{"type":17,"tag":133,"props":212885,"children":212886},{"href":7691},[212887],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":212890,"children":212891},{},[212892,212893],{"type":23,"value":211190},{"type":17,"tag":6121,"props":212894,"children":212896},{"className":212895},[],[212897],{"type":23,"value":19766},{"type":17,"tag":68,"props":212899,"children":212900},{"id":211198},[212901],{"type":23,"value":211201},{"type":17,"tag":6893,"props":212903,"children":212906},{"className":212904,"code":212905,"language":48432,"meta":7},[48430],"mkdir crm-deal-event-notifications\ncd crm-deal-event-notifications\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[212907],{"type":17,"tag":6121,"props":212908,"children":212909},{"__ignoreMap":7},[212910],{"type":23,"value":212905},{"type":17,"tag":29,"props":212912,"children":212913},{},[212914,212915,212920],{"type":23,"value":211215},{"type":17,"tag":6121,"props":212916,"children":212918},{"className":212917},[],[212919],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":212922,"children":212924},{"className":212923,"code":211227,"language":48432,"meta":7},[48430],[212925],{"type":17,"tag":6121,"props":212926,"children":212927},{"__ignoreMap":7},[212928],{"type":23,"value":211227},{"type":17,"tag":68,"props":212930,"children":212931},{"id":211235},[212932],{"type":23,"value":211238},{"type":17,"tag":6893,"props":212934,"children":212936},{"className":212935,"code":211242,"language":18718,"meta":7},[18716],[212937],{"type":17,"tag":6121,"props":212938,"children":212939},{"__ignoreMap":7},[212940],{"type":23,"value":211242},{"type":17,"tag":68,"props":212942,"children":212944},{"id":212943},"step-3-understand-crm-events-and-what-they-represent",[212945],{"type":23,"value":212946},"Step 3: Understand CRM events and what they represent",{"type":17,"tag":29,"props":212948,"children":212949},{},[212950,212952,212956],{"type":23,"value":212951},"Unified normalizes CRM activity into a single ",{"type":17,"tag":48,"props":212953,"children":212954},{},[212955],{"type":23,"value":14528},{"type":23,"value":212957}," object. Every event represents an activity or engagement and is always associated with at least one deal, contact, or company.",{"type":17,"tag":239,"props":212959,"children":212961},{"id":212960},"event-types",[212962],{"type":23,"value":212963},"Event types",{"type":17,"tag":29,"props":212965,"children":212966},{},[212967,212969,212974],{"type":23,"value":212968},"Each event has a ",{"type":17,"tag":6121,"props":212970,"children":212972},{"className":212971},[],[212973],{"type":23,"value":27310},{"type":23,"value":212975}," field with one of the following values:",{"type":17,"tag":80,"props":212977,"children":212978},{},[212979,212987,212995,213003,213011,213019,213027,213035],{"type":17,"tag":84,"props":212980,"children":212981},{},[212982],{"type":17,"tag":6121,"props":212983,"children":212985},{"className":212984},[],[212986],{"type":23,"value":27047},{"type":17,"tag":84,"props":212988,"children":212989},{},[212990],{"type":17,"tag":6121,"props":212991,"children":212993},{"className":212992},[],[212994],{"type":23,"value":27052},{"type":17,"tag":84,"props":212996,"children":212997},{},[212998],{"type":17,"tag":6121,"props":212999,"children":213001},{"className":213000},[],[213002],{"type":23,"value":27067},{"type":17,"tag":84,"props":213004,"children":213005},{},[213006],{"type":17,"tag":6121,"props":213007,"children":213009},{"className":213008},[],[213010],{"type":23,"value":27062},{"type":17,"tag":84,"props":213012,"children":213013},{},[213014],{"type":17,"tag":6121,"props":213015,"children":213017},{"className":213016},[],[213018],{"type":23,"value":27057},{"type":17,"tag":84,"props":213020,"children":213021},{},[213022],{"type":17,"tag":6121,"props":213023,"children":213025},{"className":213024},[],[213026],{"type":23,"value":118690},{"type":17,"tag":84,"props":213028,"children":213029},{},[213030],{"type":17,"tag":6121,"props":213031,"children":213033},{"className":213032},[],[213034],{"type":23,"value":118700},{"type":17,"tag":84,"props":213036,"children":213037},{},[213038],{"type":17,"tag":6121,"props":213039,"children":213041},{"className":213040},[],[213042],{"type":23,"value":118710},{"type":17,"tag":29,"props":213044,"children":213045},{},[213046,213047,213052],{"type":23,"value":6712},{"type":17,"tag":6121,"props":213048,"children":213050},{"className":213049},[],[213051],{"type":23,"value":27310},{"type":23,"value":213053}," determines which nested object is present on the event payload.",{"type":17,"tag":29,"props":213055,"children":213056},{},[213057],{"type":23,"value":377},{"type":17,"tag":80,"props":213059,"children":213060},{},[213061,213076,213091,213106,213121],{"type":17,"tag":84,"props":213062,"children":213063},{},[213064,213069,213070],{"type":17,"tag":6121,"props":213065,"children":213067},{"className":213066},[],[213068],{"type":23,"value":27047},{"type":23,"value":98082},{"type":17,"tag":6121,"props":213071,"children":213073},{"className":213072},[],[213074],{"type":23,"value":213075},"event.note",{"type":17,"tag":84,"props":213077,"children":213078},{},[213079,213084,213085],{"type":17,"tag":6121,"props":213080,"children":213082},{"className":213081},[],[213083],{"type":23,"value":27057},{"type":23,"value":98082},{"type":17,"tag":6121,"props":213086,"children":213088},{"className":213087},[],[213089],{"type":23,"value":213090},"event.call",{"type":17,"tag":84,"props":213092,"children":213093},{},[213094,213099,213100],{"type":17,"tag":6121,"props":213095,"children":213097},{"className":213096},[],[213098],{"type":23,"value":27062},{"type":23,"value":98082},{"type":17,"tag":6121,"props":213101,"children":213103},{"className":213102},[],[213104],{"type":23,"value":213105},"event.meeting",{"type":17,"tag":84,"props":213107,"children":213108},{},[213109,213114,213115],{"type":17,"tag":6121,"props":213110,"children":213112},{"className":213111},[],[213113],{"type":23,"value":27067},{"type":23,"value":98082},{"type":17,"tag":6121,"props":213116,"children":213118},{"className":213117},[],[213119],{"type":23,"value":213120},"event.task",{"type":17,"tag":84,"props":213122,"children":213123},{},[213124,213129,213130],{"type":17,"tag":6121,"props":213125,"children":213127},{"className":213126},[],[213128],{"type":23,"value":27052},{"type":23,"value":98082},{"type":17,"tag":6121,"props":213131,"children":213133},{"className":213132},[],[213134],{"type":23,"value":213135},"event.email",{"type":17,"tag":239,"props":213137,"children":213139},{"id":213138},"relationship-fields",[213140],{"type":23,"value":213141},"Relationship fields",{"type":17,"tag":29,"props":213143,"children":213144},{},[213145],{"type":23,"value":213146},"Events can reference multiple entities:",{"type":17,"tag":80,"props":213148,"children":213149},{},[213150,213158,213166,213174],{"type":17,"tag":84,"props":213151,"children":213152},{},[213153],{"type":17,"tag":6121,"props":213154,"children":213156},{"className":213155},[],[213157],{"type":23,"value":110168},{"type":17,"tag":84,"props":213159,"children":213160},{},[213161],{"type":17,"tag":6121,"props":213162,"children":213164},{"className":213163},[],[213165],{"type":23,"value":110146},{"type":17,"tag":84,"props":213167,"children":213168},{},[213169],{"type":17,"tag":6121,"props":213170,"children":213172},{"className":213171},[],[213173],{"type":23,"value":110157},{"type":17,"tag":84,"props":213175,"children":213176},{},[213177],{"type":17,"tag":6121,"props":213178,"children":213180},{"className":213179},[],[213181],{"type":23,"value":213182},"lead_ids[]",{"type":17,"tag":29,"props":213184,"children":213185},{},[213186,213188,213193],{"type":23,"value":213187},"For deal-based notifications, ",{"type":17,"tag":6121,"props":213189,"children":213191},{"className":213190},[],[213192],{"type":23,"value":110168},{"type":23,"value":213194}," is the primary join surface.",{"type":17,"tag":239,"props":213196,"children":213197},{"id":19954},[213198],{"type":23,"value":213199},"Timestamps",{"type":17,"tag":29,"props":213201,"children":213202},{},[213203],{"type":23,"value":213204},"Events include two timestamps:",{"type":17,"tag":80,"props":213206,"children":213207},{},[213208,213218],{"type":17,"tag":84,"props":213209,"children":213210},{},[213211,213216],{"type":17,"tag":6121,"props":213212,"children":213214},{"className":213213},[],[213215],{"type":23,"value":33446},{"type":23,"value":213217}," — when the event was created",{"type":17,"tag":84,"props":213219,"children":213220},{},[213221,213226],{"type":17,"tag":6121,"props":213222,"children":213224},{"className":213223},[],[213225],{"type":23,"value":25337},{"type":23,"value":213227}," — when the event was last updated",{"type":17,"tag":29,"props":213229,"children":213230},{},[213231,213233,213238,213240,213245],{"type":23,"value":213232},"The list endpoint supports incremental filtering using ",{"type":17,"tag":6121,"props":213234,"children":213236},{"className":213235},[],[213237],{"type":23,"value":26291},{"type":23,"value":213239},", which filters on ",{"type":17,"tag":6121,"props":213241,"children":213243},{"className":213242},[],[213244],{"type":23,"value":25337},{"type":23,"value":213246},". This is the safest checkpoint to use for polling.",{"type":17,"tag":68,"props":213248,"children":213250},{"id":213249},"step-4-decide-which-events-should-trigger-notifications",[213251],{"type":23,"value":213252},"Step 4: Decide which events should trigger notifications",{"type":17,"tag":29,"props":213254,"children":213255},{},[213256],{"type":23,"value":213257},"Before writing code, decide what actually matters.",{"type":17,"tag":29,"props":213259,"children":213260},{},[213261],{"type":23,"value":45262},{"type":17,"tag":80,"props":213263,"children":213264},{},[213265,213276,213286,213296],{"type":17,"tag":84,"props":213266,"children":213267},{},[213268,213270,213274],{"type":23,"value":213269},"Notify when a ",{"type":17,"tag":48,"props":213271,"children":213272},{},[213273],{"type":23,"value":27057},{"type":23,"value":213275}," is logged on a deal",{"type":17,"tag":84,"props":213277,"children":213278},{},[213279,213280,213284],{"type":23,"value":213269},{"type":17,"tag":48,"props":213281,"children":213282},{},[213283],{"type":23,"value":27062},{"type":23,"value":213285}," is scheduled",{"type":17,"tag":84,"props":213287,"children":213288},{},[213289,213290,213294],{"type":23,"value":213269},{"type":17,"tag":48,"props":213291,"children":213292},{},[213293],{"type":23,"value":27047},{"type":23,"value":213295}," is added",{"type":17,"tag":84,"props":213297,"children":213298},{},[213299,213301],{"type":23,"value":213300},"Ignore passive events like ",{"type":17,"tag":6121,"props":213302,"children":213304},{"className":213303},[],[213305],{"type":23,"value":118710},{"type":17,"tag":29,"props":213307,"children":213308},{},[213309,213311,213316],{"type":23,"value":213310},"Because ",{"type":17,"tag":6121,"props":213312,"children":213314},{"className":213313},[],[213315],{"type":23,"value":27310},{"type":23,"value":213317}," is a documented enum, you can filter explicitly without guessing.",{"type":17,"tag":68,"props":213319,"children":213321},{"id":213320},"step-5-poll-deal-events-incrementally",[213322],{"type":23,"value":213323},"Step 5: Poll deal events incrementally",{"type":17,"tag":29,"props":213325,"children":213326},{},[213327],{"type":23,"value":213328},"Unified does not document CRM event webhooks, so notifications should be triggered using polling.",{"type":17,"tag":29,"props":213330,"children":213331},{},[213332],{"type":23,"value":213333},"The event list endpoint supports:",{"type":17,"tag":80,"props":213335,"children":213336},{},[213337,213353,213363,213373],{"type":17,"tag":84,"props":213338,"children":213339},{},[213340,213342,213347,213348],{"type":23,"value":213341},"pagination via ",{"type":17,"tag":6121,"props":213343,"children":213345},{"className":213344},[],[213346],{"type":23,"value":48389},{"type":23,"value":34435},{"type":17,"tag":6121,"props":213349,"children":213351},{"className":213350},[],[213352],{"type":23,"value":48411},{"type":17,"tag":84,"props":213354,"children":213355},{},[213356,213358],{"type":23,"value":213357},"filtering via ",{"type":17,"tag":6121,"props":213359,"children":213361},{"className":213360},[],[213362],{"type":23,"value":26291},{"type":17,"tag":84,"props":213364,"children":213365},{},[213366,213368],{"type":23,"value":213367},"filtering by ",{"type":17,"tag":6121,"props":213369,"children":213371},{"className":213370},[],[213372],{"type":23,"value":27285},{"type":17,"tag":84,"props":213374,"children":213375},{},[213376,213377],{"type":23,"value":213367},{"type":17,"tag":6121,"props":213378,"children":213380},{"className":213379},[],[213381],{"type":23,"value":27310},{"type":17,"tag":6893,"props":213383,"children":213386},{"className":213384,"code":213385,"language":18718,"meta":7},[18716],"type Sort = \"name\" | \"updated_at\" | \"created_at\";\ntype Order = \"asc\" | \"desc\";\n\nasync function fetchDealEvents(opts: {\n  dealId: string;\n  updated_gte?: string;\n  types?: string[];\n  pageSize?: number;\n}) {\n  const pageSize = opts.pageSize ?? 100;\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmEvents({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts.updated_gte ?? \"\",\n      deal_id: opts.dealId,\n      type: opts.types && opts.types.length === 1 ? opts.types[0] : \"\",\n      sort: \"updated_at\",\n      order: \"asc\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    if (page.length \u003C pageSize) break;\n\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[213387],{"type":17,"tag":6121,"props":213388,"children":213389},{"__ignoreMap":7},[213390],{"type":23,"value":213385},{"type":17,"tag":29,"props":213392,"children":213393},{},[213394],{"type":23,"value":21128},{"type":17,"tag":80,"props":213396,"children":213397},{},[213398,213408,213418],{"type":17,"tag":84,"props":213399,"children":213400},{},[213401,213403],{"type":23,"value":213402},"Pagination stops when returned results are fewer than ",{"type":17,"tag":6121,"props":213404,"children":213406},{"className":213405},[],[213407],{"type":23,"value":48389},{"type":17,"tag":84,"props":213409,"children":213410},{},[213411,213416],{"type":17,"tag":6121,"props":213412,"children":213414},{"className":213413},[],[213415],{"type":23,"value":27310},{"type":23,"value":213417}," filtering is optional but recommended to reduce noise",{"type":17,"tag":84,"props":213419,"children":213420},{},[213421,213426],{"type":17,"tag":6121,"props":213422,"children":213424},{"className":213423},[],[213425],{"type":23,"value":26291},{"type":23,"value":213427}," should be stored and reused between runs",{"type":17,"tag":68,"props":213429,"children":213431},{"id":213430},"step-6-deduplicate-events-safely",[213432],{"type":23,"value":213433},"Step 6: Deduplicate events safely",{"type":17,"tag":29,"props":213435,"children":213436},{},[213437,213439,213445],{"type":23,"value":213438},"Unified does not document idempotency or ordering guarantees for events. The only stable identifier is ",{"type":17,"tag":6121,"props":213440,"children":213442},{"className":213441},[],[213443],{"type":23,"value":213444},"event.id",{"type":23,"value":54},{"type":17,"tag":29,"props":213447,"children":213448},{},[213449],{"type":23,"value":213450},"To avoid duplicate notifications:",{"type":17,"tag":80,"props":213452,"children":213453},{},[213454,213466],{"type":17,"tag":84,"props":213455,"children":213456},{},[213457,213459,213464],{"type":23,"value":213458},"store processed ",{"type":17,"tag":6121,"props":213460,"children":213462},{"className":213461},[],[213463],{"type":23,"value":213444},{"type":23,"value":213465}," values, or",{"type":17,"tag":84,"props":213467,"children":213468},{},[213469,213471,213476],{"type":23,"value":213470},"advance your ",{"type":17,"tag":6121,"props":213472,"children":213474},{"className":213473},[],[213475],{"type":23,"value":26291},{"type":23,"value":213477}," checkpoint after each run",{"type":17,"tag":29,"props":213479,"children":213480},{},[213481],{"type":23,"value":213482},"A simple in-memory example:",{"type":17,"tag":6893,"props":213484,"children":213487},{"className":213485,"code":213486,"language":18718,"meta":7},[18716],"const processedEventIds = new Set\u003Cstring>();\n\nfunction isNewEvent(e: any): boolean {\n  if (!e?.id) return false;\n  if (processedEventIds.has(e.id)) return false;\n  processedEventIds.add(e.id);\n  return true;\n}\n",[213488],{"type":17,"tag":6121,"props":213489,"children":213490},{"__ignoreMap":7},[213491],{"type":23,"value":213486},{"type":17,"tag":68,"props":213493,"children":213495},{"id":213494},"step-7-fetch-deal-context-for-notifications",[213496],{"type":23,"value":213497},"Step 7: Fetch deal context for notifications",{"type":17,"tag":29,"props":213499,"children":213500},{},[213501],{"type":23,"value":213502},"Events carry IDs, not human-readable deal context. To build a useful notification, retrieve the deal.",{"type":17,"tag":6893,"props":213504,"children":213507},{"className":213505,"code":213506,"language":18718,"meta":7},[18716],"async function getDealContext(dealId: string) {\n  return sdk.crm.getCrmDeal({\n    connectionId,\n    id: dealId,\n    fields: [\n      \"id\",\n      \"name\",\n      \"stage\",\n      \"pipeline\",\n      \"amount\",\n      \"currency\",\n      \"company_ids\",\n      \"contact_ids\",\n    ],\n  });\n}\n",[213508],{"type":17,"tag":6121,"props":213509,"children":213510},{"__ignoreMap":7},[213511],{"type":23,"value":213506},{"type":17,"tag":29,"props":213513,"children":213514},{},[213515],{"type":23,"value":213516},"Use only fields defined in the deal data model. Avoid assuming deal status or history.",{"type":17,"tag":68,"props":213518,"children":213520},{"id":213519},"step-8-build-notification-payloads-by-event-type",[213521],{"type":23,"value":213522},"Step 8: Build notification payloads by event type",{"type":17,"tag":29,"props":213524,"children":213525},{},[213526],{"type":23,"value":213527},"Each event type has different fields. Build messages defensively and only read fields that exist for that type.",{"type":17,"tag":6893,"props":213529,"children":213532},{"className":213530,"code":213531,"language":18718,"meta":7},[18716],"function buildNotification(event: any, deal: any) {\n  const base = {\n    dealId: deal.id,\n    dealName: deal.name,\n    stage: deal.stage,\n    pipeline: deal.pipeline,\n  };\n\n  switch (event.type) {\n    case \"CALL\":\n      return {\n        ...base,\n        message: `Call logged on deal \"${deal.name}\"`,\n        durationMinutes: event.call?.duration,\n      };\n\n    case \"MEETING\":\n      return {\n        ...base,\n        message: `Meeting scheduled for deal \"${deal.name}\"`,\n        startsAt: event.meeting?.start_at,\n      };\n\n    case \"NOTE\":\n      return {\n        ...base,\n        message: `Note added to deal \"${deal.name}\"`,\n        note: event.note?.description,\n      };\n\n    default:\n      return null;\n  }\n}\n",[213533],{"type":17,"tag":6121,"props":213534,"children":213535},{"__ignoreMap":7},[213536],{"type":23,"value":213531},{"type":17,"tag":29,"props":213538,"children":213539},{},[213540,213541,213547,213549,213555],{"type":23,"value":132873},{"type":17,"tag":6121,"props":213542,"children":213544},{"className":213543},[],[213545],{"type":23,"value":213546},"buildNotification",{"type":23,"value":213548}," returns ",{"type":17,"tag":6121,"props":213550,"children":213552},{"className":213551},[],[213553],{"type":23,"value":213554},"null",{"type":23,"value":213556},", skip sending.",{"type":17,"tag":68,"props":213558,"children":213560},{"id":213559},"step-9-send-notifications-from-your-application",[213561],{"type":23,"value":213562},"Step 9: Send notifications from your application",{"type":17,"tag":29,"props":213564,"children":213565},{},[213566],{"type":23,"value":213567},"Unified provides the event signal, not the delivery channel.",{"type":17,"tag":29,"props":213569,"children":213570},{},[213571],{"type":23,"value":213572},"At this point, hand the payload to your own notification system:",{"type":17,"tag":6893,"props":213574,"children":213577},{"className":213575,"code":213576,"language":18718,"meta":7},[18716],"function sendNotification(payload: any) {\n  // email, Slack, SMS, push, etc.\n  console.log(\"Notify:\", payload);\n}\n",[213578],{"type":17,"tag":6121,"props":213579,"children":213580},{"__ignoreMap":7},[213581],{"type":23,"value":213576},{"type":17,"tag":68,"props":213583,"children":213585},{"id":213584},"step-10-put-it-all-together",[213586],{"type":23,"value":213587},"Step 10: Put it all together",{"type":17,"tag":6893,"props":213589,"children":213592},{"className":213590,"code":213591,"language":18718,"meta":7},[18716],"async function run(dealId: string, lastCheckpoint?: string) {\n  const events = await fetchDealEvents({\n    dealId,\n    updated_gte: lastCheckpoint,\n    types: [\"CALL\", \"MEETING\", \"NOTE\"],\n  });\n\n  for (const e of events) {\n    if (!isNewEvent(e)) continue;\n\n    const deal = await getDealContext(dealId);\n    const notification = buildNotification(e, deal);\n\n    if (notification) {\n      sendNotification(notification);\n    }\n  }\n\n  const newest = events.at(-1)?.updated_at;\n  return newest ?? lastCheckpoint;\n}\n",[213593],{"type":17,"tag":6121,"props":213594,"children":213595},{"__ignoreMap":7},[213596],{"type":23,"value":213591},{"type":17,"tag":29,"props":213598,"children":213599},{},[213600,213602,213607],{"type":23,"value":213601},"Persist the returned checkpoint (",{"type":17,"tag":6121,"props":213603,"children":213605},{"className":213604},[],[213606],{"type":23,"value":25337},{"type":23,"value":213608},") and reuse it on the next run.",{"type":17,"tag":68,"props":213610,"children":213612},{"id":213611},"optional-create-an-event-after-notifying",[213613],{"type":23,"value":213614},"Optional: Create an event after notifying",{"type":17,"tag":29,"props":213616,"children":213617},{},[213618],{"type":23,"value":213619},"If your workflow logs follow-up actions, you can create a CRM event after sending a notification.",{"type":17,"tag":6893,"props":213621,"children":213624},{"className":213622,"code":213623,"language":18718,"meta":7},[18716],"await sdk.crm.createCrmEvent({\n  connectionId,\n  crmEvent: {\n    type: \"NOTE\",\n    note: {\n      description: \"Notification sent to account owner\",\n    },\n    deal_ids: [dealId],\n  },\n});\n",[213625],{"type":17,"tag":6121,"props":213626,"children":213627},{"__ignoreMap":7},[213628],{"type":23,"value":213623},{"type":17,"tag":29,"props":213630,"children":213631},{},[213632],{"type":23,"value":213633},"Event creation support varies by CRM. Verify write support in the Feature Support tab.",{"type":17,"tag":68,"props":213635,"children":213636},{"id":44585},[213637],{"type":23,"value":44588},{"type":17,"tag":29,"props":213639,"children":213640},{},[213641],{"type":23,"value":213642},"Using Unified's CRM API, you can trigger notifications from deal events in a consistent way across CRMs:",{"type":17,"tag":80,"props":213644,"children":213645},{},[213646,213656,213661,213671,213676,213681],{"type":17,"tag":84,"props":213647,"children":213648},{},[213649,213651],{"type":23,"value":213650},"Poll normalized CRM events using ",{"type":17,"tag":6121,"props":213652,"children":213654},{"className":213653},[],[213655],{"type":23,"value":26291},{"type":17,"tag":84,"props":213657,"children":213658},{},[213659],{"type":23,"value":213660},"Filter events by deal and event type",{"type":17,"tag":84,"props":213662,"children":213663},{},[213664,213666],{"type":23,"value":213665},"Deduplicate using ",{"type":17,"tag":6121,"props":213667,"children":213669},{"className":213668},[],[213670],{"type":23,"value":213444},{"type":17,"tag":84,"props":213672,"children":213673},{},[213674],{"type":23,"value":213675},"Retrieve deal context for human-readable messages",{"type":17,"tag":84,"props":213677,"children":213678},{},[213679],{"type":23,"value":213680},"Trigger notifications from your own delivery system",{"type":17,"tag":84,"props":213682,"children":213683},{},[213684],{"type":23,"value":213685},"Optionally log follow-up events back to the CRM",{"type":17,"tag":29,"props":213687,"children":213688},{},[213689,213690],{"type":23,"value":1609},{"type":17,"tag":133,"props":213691,"children":213693},{"href":1612,"rel":213692},[214],[213694],{"type":23,"value":1616},{"type":17,"tag":29,"props":213696,"children":213697},{},[213698,213699],{"type":23,"value":1609},{"type":17,"tag":133,"props":213700,"children":213702},{"href":1623,"rel":213701},[214],[213703],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":213705},[213706,213707,213708,213709,213714,213715,213716,213717,213718,213719,213720,213721,213722],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":212943,"depth":1629,"text":212946,"children":213710},[213711,213712,213713],{"id":212960,"depth":1635,"text":212963},{"id":213138,"depth":1635,"text":213141},{"id":19954,"depth":1635,"text":213199},{"id":213249,"depth":1629,"text":213252},{"id":213320,"depth":1629,"text":213323},{"id":213430,"depth":1629,"text":213433},{"id":213494,"depth":1629,"text":213497},{"id":213519,"depth":1629,"text":213522},{"id":213559,"depth":1629,"text":213562},{"id":213584,"depth":1629,"text":213587},{"id":213611,"depth":1629,"text":213614},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_trigger_notifications_from_deal_events_using_unified_crm_api.md","blog/how_to_trigger_notifications_from_deal_events_using_unified_crm_api.md","blog/how_to_trigger_notifications_from_deal_events_using_unified_crm_api",{"_path":213727,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":213728,"description":213729,"img":213730,"date":213731,"tag":12,"body":213732,"_type":1677,"_id":214669,"_source":1679,"_file":214670,"_stem":214671,"_extension":1682},"/blog/how_to_push_leads_and_contacts_into_crms_with_unified_crm_api","How to Push Leads and Contacts into CRMs with Unified's CRM API","Pushing data into a CRM sounds simple. Create a contact. Create a lead. Attach them to a company. Move on.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_push_leads_and_contacts_into_crms_with_unified_crm_api-icon.png","2026-02-02T17:04:00.000Z",{"type":14,"children":213733,"toc":214648},[213734,213739,213742,213749,213753,213758,213763,213768,213778,213783,213787,213816,213820,213829,213839,213847,213851,213859,213865,213870,213875,213893,213904,213914,213919,213924,214103,214116,214121,214125,214242,214253,214258,214264,214276,214281,214290,214309,214315,214320,214332,214341,214353,214359,214370,214375,214384,214395,214401,214412,214417,214426,214437,214443,214448,214457,214463,214475,214480,214513,214522,214527,214533,214538,214547,214552,214558,214563,214572,214577,214581,214586,214630,214639],{"type":17,"tag":18,"props":213735,"children":213737},{"id":213736},"how-to-push-leads-and-contacts-into-crms-with-unifieds-crm-api",[213738],{"type":23,"value":213728},{"type":17,"tag":25,"props":213740,"children":213741},{},[],{"type":17,"tag":29,"props":213743,"children":213744},{},[213745],{"type":17,"tag":33,"props":213746,"children":213747},{},[213748],{"type":23,"value":199463},{"type":17,"tag":29,"props":213750,"children":213751},{},[213752],{"type":23,"value":213729},{"type":17,"tag":29,"props":213754,"children":213755},{},[213756],{"type":23,"value":213757},"In practice, it only works if you understand what the CRM actually accepts.",{"type":17,"tag":29,"props":213759,"children":213760},{},[213761],{"type":23,"value":213762},"CRMs differ in how they handle identity, associations, and custom fields. Some treat contacts as primary records. Others prioritize leads. Company association may require an ID in one system and a name in another. Custom fields may exist, but only if they're written in the right format. Required fields are often integration-specific and undocumented until a write fails.",{"type":17,"tag":29,"props":213764,"children":213765},{},[213766],{"type":23,"value":213767},"If you don't design for that variability, write flows become brittle. You end up retrying failed writes blindly or hardcoding logic per CRM.",{"type":17,"tag":29,"props":213769,"children":213770},{},[213771,213772,213776],{"type":23,"value":25244},{"type":17,"tag":133,"props":213773,"children":213774},{"href":61562},[213775],{"type":23,"value":61565},{"type":23,"value":213777}," gives you a normalized write surface across CRMs. You work with a single set of CRM objects—contacts, leads, and companies—and use documented create, update, retrieve, and list operations to implement safe, portable write flows.",{"type":17,"tag":29,"props":213779,"children":213780},{},[213781],{"type":23,"value":213782},"This guide shows how to push leads and contacts into CRMs using Unified's CRM API in TypeScript. It focuses on create, find-then-update patterns, associations, and custom fields, without assuming required fields, upsert behavior, or integration-specific guarantees.",{"type":17,"tag":239,"props":213784,"children":213785},{"id":141798},[213786],{"type":23,"value":141801},{"type":17,"tag":80,"props":213788,"children":213789},{},[213790,213794,213798,213807],{"type":17,"tag":84,"props":213791,"children":213792},{},[213793],{"type":23,"value":199683},{"type":17,"tag":84,"props":213795,"children":213796},{},[213797],{"type":23,"value":211176},{"type":17,"tag":84,"props":213799,"children":213800},{},[213801,213802,213806],{"type":23,"value":199693},{"type":17,"tag":133,"props":213803,"children":213804},{"href":7691},[213805],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":213808,"children":213809},{},[213810,213811],{"type":23,"value":211190},{"type":17,"tag":6121,"props":213812,"children":213814},{"className":213813},[],[213815],{"type":23,"value":19766},{"type":17,"tag":68,"props":213817,"children":213818},{"id":211198},[213819],{"type":23,"value":211201},{"type":17,"tag":6893,"props":213821,"children":213824},{"className":213822,"code":213823,"language":48432,"meta":7},[48430],"mkdir crm-write-demo\ncd crm-write-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[213825],{"type":17,"tag":6121,"props":213826,"children":213827},{"__ignoreMap":7},[213828],{"type":23,"value":213823},{"type":17,"tag":29,"props":213830,"children":213831},{},[213832,213833,213838],{"type":23,"value":211215},{"type":17,"tag":6121,"props":213834,"children":213836},{"className":213835},[],[213837],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":213840,"children":213842},{"className":213841,"code":211227,"language":48432,"meta":7},[48430],[213843],{"type":17,"tag":6121,"props":213844,"children":213845},{"__ignoreMap":7},[213846],{"type":23,"value":211227},{"type":17,"tag":68,"props":213848,"children":213849},{"id":211235},[213850],{"type":23,"value":211238},{"type":17,"tag":6893,"props":213852,"children":213854},{"className":213853,"code":211242,"language":18718,"meta":7},[18716],[213855],{"type":17,"tag":6121,"props":213856,"children":213857},{"__ignoreMap":7},[213858],{"type":23,"value":211242},{"type":17,"tag":68,"props":213860,"children":213862},{"id":213861},"step-3-understand-what-you-can-write-and-what-varies",[213863],{"type":23,"value":213864},"Step 3: Understand what you can write (and what varies)",{"type":17,"tag":29,"props":213866,"children":213867},{},[213868],{"type":23,"value":213869},"Unified normalizes CRM objects, but write support still varies by integration. Required fields, association behavior, and custom field support can differ across CRMs.",{"type":17,"tag":29,"props":213871,"children":213872},{},[213873],{"type":23,"value":213874},"For this article, we rely only on fields that are:",{"type":17,"tag":80,"props":213876,"children":213877},{},[213878,213883,213888],{"type":17,"tag":84,"props":213879,"children":213880},{},[213881],{"type":23,"value":213882},"defined in the CRM data models",{"type":17,"tag":84,"props":213884,"children":213885},{},[213886],{"type":23,"value":213887},"accepted by create and update endpoints",{"type":17,"tag":84,"props":213889,"children":213890},{},[213891],{"type":23,"value":213892},"commonly writable across CRMs",{"type":17,"tag":29,"props":213894,"children":213895},{},[213896,213898,213902],{"type":23,"value":213897},"Anything integration-specific should be verified in the ",{"type":17,"tag":48,"props":213899,"children":213900},{},[213901],{"type":23,"value":211607},{"type":23,"value":213903}," tab for the integration you've enabled.",{"type":17,"tag":239,"props":213905,"children":213906},{"id":211261},[213907,213908,213913],{"type":23,"value":211264},{"type":17,"tag":6121,"props":213909,"children":213911},{"className":213910},[],[213912],{"type":23,"value":211270},{"type":23,"value":12034},{"type":17,"tag":29,"props":213915,"children":213916},{},[213917],{"type":23,"value":213918},"Contacts represent people and support structured fields, associations, and metadata.",{"type":17,"tag":29,"props":213920,"children":213921},{},[213922],{"type":23,"value":213923},"Commonly written fields include:",{"type":17,"tag":80,"props":213925,"children":213926},{},[213927,213960,213978,214063,214074,214083,214093],{"type":17,"tag":84,"props":213928,"children":213929},{},[213930,213931,213936,213937,213942,213943,213948,213949,213954,213955],{"type":23,"value":211284},{"type":17,"tag":6121,"props":213932,"children":213934},{"className":213933},[],[213935],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":213938,"children":213940},{"className":213939},[],[213941],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":213944,"children":213946},{"className":213945},[],[213947],{"type":23,"value":62341},{"type":23,"value":11826},{"type":17,"tag":6121,"props":213950,"children":213952},{"className":213951},[],[213953],{"type":23,"value":62346},{"type":23,"value":11826},{"type":17,"tag":6121,"props":213956,"children":213958},{"className":213957},[],[213959],{"type":23,"value":62375},{"type":17,"tag":84,"props":213961,"children":213962},{},[213963,213965,213970,213971,213976],{"type":23,"value":213964},"company context: ",{"type":17,"tag":6121,"props":213966,"children":213968},{"className":213967},[],[213969],{"type":23,"value":62420},{"type":23,"value":211421},{"type":17,"tag":6121,"props":213972,"children":213974},{"className":213973},[],[213975],{"type":23,"value":110146},{"type":23,"value":213977}," (IDs if known)",{"type":17,"tag":84,"props":213979,"children":213980},{},[213981,213982],{"type":23,"value":211324},{"type":17,"tag":80,"props":213983,"children":213984},{},[213985,214018],{"type":17,"tag":84,"props":213986,"children":213987},{},[213988,213993,213994,213999,214000,214005,214006,214011,214012,214017],{"type":17,"tag":6121,"props":213989,"children":213991},{"className":213990},[],[213992],{"type":23,"value":133312},{"type":23,"value":120761},{"type":17,"tag":6121,"props":213995,"children":213997},{"className":213996},[],[213998],{"type":23,"value":27310},{"type":23,"value":44573},{"type":17,"tag":6121,"props":214001,"children":214003},{"className":214002},[],[214004],{"type":23,"value":211348},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214007,"children":214009},{"className":214008},[],[214010],{"type":23,"value":211355},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214013,"children":214015},{"className":214014},[],[214016],{"type":23,"value":149660},{"type":23,"value":12034},{"type":17,"tag":84,"props":214019,"children":214020},{},[214021,214026,214027,214032,214033,214038,214039,214044,214045,214050,214051,214056,214057,214062],{"type":17,"tag":6121,"props":214022,"children":214024},{"className":214023},[],[214025],{"type":23,"value":133321},{"type":23,"value":120761},{"type":17,"tag":6121,"props":214028,"children":214030},{"className":214029},[],[214031],{"type":23,"value":27310},{"type":23,"value":44573},{"type":17,"tag":6121,"props":214034,"children":214036},{"className":214035},[],[214037],{"type":23,"value":211348},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214040,"children":214042},{"className":214041},[],[214043],{"type":23,"value":211355},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214046,"children":214048},{"className":214047},[],[214049],{"type":23,"value":149660},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214052,"children":214054},{"className":214053},[],[214055],{"type":23,"value":211401},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214058,"children":214060},{"className":214059},[],[214061],{"type":23,"value":211408},{"type":23,"value":12034},{"type":17,"tag":84,"props":214064,"children":214065},{},[214066,214068],{"type":23,"value":214067},"address fields with ISO-2 ",{"type":17,"tag":6121,"props":214069,"children":214071},{"className":214070},[],[214072],{"type":23,"value":214073},"country_code",{"type":17,"tag":84,"props":214075,"children":214076},{},[214077,214078],{"type":23,"value":212271},{"type":17,"tag":6121,"props":214079,"children":214081},{"className":214080},[],[214082],{"type":23,"value":62582},{"type":17,"tag":84,"props":214084,"children":214085},{},[214086,214088],{"type":23,"value":214087},"custom fields via ",{"type":17,"tag":6121,"props":214089,"children":214091},{"className":214090},[],[214092],{"type":23,"value":133378},{"type":17,"tag":84,"props":214094,"children":214095},{},[214096,214101],{"type":17,"tag":6121,"props":214097,"children":214099},{"className":214098},[],[214100],{"type":23,"value":62389},{"type":23,"value":214102}," passthrough when needed",{"type":17,"tag":239,"props":214104,"children":214106},{"id":214105},"leads-crmlead",[214107,214109,214115],{"type":23,"value":214108},"Leads (",{"type":17,"tag":6121,"props":214110,"children":214112},{"className":214111},[],[214113],{"type":23,"value":214114},"CrmLead",{"type":23,"value":12034},{"type":17,"tag":29,"props":214117,"children":214118},{},[214119],{"type":23,"value":214120},"Leads represent top-of-funnel records and can be associated to contacts and companies.",{"type":17,"tag":29,"props":214122,"children":214123},{},[214124],{"type":23,"value":213923},{"type":17,"tag":80,"props":214126,"children":214127},{},[214128,214149,214170,214192,214208,214223,214232],{"type":17,"tag":84,"props":214129,"children":214130},{},[214131,214132,214137,214138,214143,214144],{"type":23,"value":211284},{"type":17,"tag":6121,"props":214133,"children":214135},{"className":214134},[],[214136],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214139,"children":214141},{"className":214140},[],[214142],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214145,"children":214147},{"className":214146},[],[214148],{"type":23,"value":62341},{"type":17,"tag":84,"props":214150,"children":214151},{},[214152,214153,214158,214159,214164,214165],{"type":23,"value":212255},{"type":17,"tag":6121,"props":214154,"children":214156},{"className":214155},[],[214157],{"type":23,"value":26302},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214160,"children":214162},{"className":214161},[],[214163],{"type":23,"value":27299},{"type":23,"value":27293},{"type":17,"tag":6121,"props":214166,"children":214168},{"className":214167},[],[214169],{"type":23,"value":62786},{"type":17,"tag":84,"props":214171,"children":214172},{},[214173,214175,214180,214181,214186,214187],{"type":23,"value":214174},"state: ",{"type":17,"tag":6121,"props":214176,"children":214178},{"className":214177},[],[214179],{"type":23,"value":62564},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214182,"children":214184},{"className":214183},[],[214185],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214188,"children":214190},{"className":214189},[],[214191],{"type":23,"value":62868},{"type":17,"tag":84,"props":214193,"children":214194},{},[214195,214197,214202,214203],{"type":23,"value":214196},"contact methods: ",{"type":17,"tag":6121,"props":214198,"children":214200},{"className":214199},[],[214201],{"type":23,"value":133312},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214204,"children":214206},{"className":214205},[],[214207],{"type":23,"value":133321},{"type":17,"tag":84,"props":214209,"children":214210},{},[214211,214212,214217,214218],{"type":23,"value":212271},{"type":17,"tag":6121,"props":214213,"children":214215},{"className":214214},[],[214216],{"type":23,"value":62582},{"type":23,"value":11826},{"type":17,"tag":6121,"props":214219,"children":214221},{"className":214220},[],[214222],{"type":23,"value":124757},{"type":17,"tag":84,"props":214224,"children":214225},{},[214226,214227],{"type":23,"value":214087},{"type":17,"tag":6121,"props":214228,"children":214230},{"className":214229},[],[214231],{"type":23,"value":133378},{"type":17,"tag":84,"props":214233,"children":214234},{},[214235,214240],{"type":17,"tag":6121,"props":214236,"children":214238},{"className":214237},[],[214239],{"type":23,"value":62389},{"type":23,"value":214241}," passthrough",{"type":17,"tag":239,"props":214243,"children":214245},{"id":214244},"companies-crmcompany-optional",[214246,214247,214252],{"type":23,"value":206906},{"type":17,"tag":6121,"props":214248,"children":214250},{"className":214249},[],[214251],{"type":23,"value":211479},{"type":23,"value":212409},{"type":17,"tag":29,"props":214254,"children":214255},{},[214256],{"type":23,"value":214257},"If you want to create or update companies directly, Unified supports full CRUD for companies as well. For this article, company creation is optional. You can associate contacts and leads using names or IDs without creating companies explicitly.",{"type":17,"tag":68,"props":214259,"children":214261},{"id":214260},"step-4-create-a-contact",[214262],{"type":23,"value":214263},"Step 4: Create a contact",{"type":17,"tag":29,"props":214265,"children":214266},{},[214267,214269,214274],{"type":23,"value":214268},"Creating a contact uses ",{"type":17,"tag":6121,"props":214270,"children":214272},{"className":214271},[],[214273],{"type":23,"value":110002},{"type":23,"value":214275}," via the SDK.",{"type":17,"tag":29,"props":214277,"children":214278},{},[214279],{"type":23,"value":214280},"Start with a minimal payload. Required fields are integration-dependent, so avoid assuming email or name requirements unless you've verified them for your CRM.",{"type":17,"tag":6893,"props":214282,"children":214285},{"className":214283,"code":214284,"language":18718,"meta":7},[18716],"const contact = await sdk.crm.createCrmContact({\n  connectionId,\n  crmContact: {\n    first_name: \"Alex\",\n    last_name: \"Morgan\",\n    title: \"VP Engineering\",\n    emails: [\n      { email: \"alex@example.com\", type: \"WORK\" },\n    ],\n    company: \"Example Corp\",\n  },\n});\n",[214286],{"type":17,"tag":6121,"props":214287,"children":214288},{"__ignoreMap":7},[214289],{"type":23,"value":214284},{"type":17,"tag":29,"props":214291,"children":214292},{},[214293,214295,214300,214302,214307],{"type":23,"value":214294},"The call returns a ",{"type":17,"tag":6121,"props":214296,"children":214298},{"className":214297},[],[214299],{"type":23,"value":211270},{"type":23,"value":214301}," object, including the generated ",{"type":17,"tag":6121,"props":214303,"children":214305},{"className":214304},[],[214306],{"type":23,"value":18766},{"type":23,"value":214308},". Store this ID if you plan to update or associate the contact later.",{"type":17,"tag":68,"props":214310,"children":214312},{"id":214311},"step-5-find-an-existing-contact-safely",[214313],{"type":23,"value":214314},"Step 5: Find an existing contact safely",{"type":17,"tag":29,"props":214316,"children":214317},{},[214318],{"type":23,"value":214319},"Unified does not provide a true upsert endpoint. To avoid duplicates, implement a find-then-update pattern.",{"type":17,"tag":29,"props":214321,"children":214322},{},[214323,214325,214330],{"type":23,"value":214324},"The list endpoint supports a ",{"type":17,"tag":6121,"props":214326,"children":214328},{"className":214327},[],[214329],{"type":23,"value":48368},{"type":23,"value":214331}," parameter that searches by name or email, depending on the CRM.",{"type":17,"tag":6893,"props":214333,"children":214336},{"className":214334,"code":214335,"language":18718,"meta":7},[18716],"const matches = await sdk.crm.listCrmContacts({\n  connectionId,\n  limit: 1,\n  offset: 0,\n  query: \"alex@example.com\",\n});\n",[214337],{"type":17,"tag":6121,"props":214338,"children":214339},{"__ignoreMap":7},[214340],{"type":23,"value":214335},{"type":17,"tag":29,"props":214342,"children":214343},{},[214344,214345,214351],{"type":23,"value":132873},{"type":17,"tag":6121,"props":214346,"children":214348},{"className":214347},[],[214349],{"type":23,"value":214350},"matches.length > 0",{"type":23,"value":214352},", treat the first result as the existing contact. If no results are returned, create a new contact.",{"type":17,"tag":68,"props":214354,"children":214356},{"id":214355},"step-6-update-an-existing-contact",[214357],{"type":23,"value":214358},"Step 6: Update an existing contact",{"type":17,"tag":29,"props":214360,"children":214361},{},[214362,214364,214369],{"type":23,"value":214363},"Updates use ",{"type":17,"tag":6121,"props":214365,"children":214367},{"className":214366},[],[214368],{"type":23,"value":110007},{"type":23,"value":54},{"type":17,"tag":29,"props":214371,"children":214372},{},[214373],{"type":23,"value":214374},"Send only the fields you want to change. Fields not included in the payload are left unchanged.",{"type":17,"tag":6893,"props":214376,"children":214379},{"className":214377,"code":214378,"language":18718,"meta":7},[18716],"const updated = await sdk.crm.updateCrmContact({\n  connectionId,\n  id: contact.id,\n  crmContact: {\n    title: \"Chief Architect\",\n    department: \"Platform\",\n  },\n});\n",[214380],{"type":17,"tag":6121,"props":214381,"children":214382},{"__ignoreMap":7},[214383],{"type":23,"value":214378},{"type":17,"tag":29,"props":214385,"children":214386},{},[214387,214389,214394],{"type":23,"value":214388},"The response returns the updated ",{"type":17,"tag":6121,"props":214390,"children":214392},{"className":214391},[],[214393],{"type":23,"value":211270},{"type":23,"value":54},{"type":17,"tag":68,"props":214396,"children":214398},{"id":214397},"step-7-create-a-lead",[214399],{"type":23,"value":214400},"Step 7: Create a lead",{"type":17,"tag":29,"props":214402,"children":214403},{},[214404,214406,214411],{"type":23,"value":214405},"Creating a lead uses ",{"type":17,"tag":6121,"props":214407,"children":214409},{"className":214408},[],[214410],{"type":23,"value":110090},{"type":23,"value":54},{"type":17,"tag":29,"props":214413,"children":214414},{},[214415],{"type":23,"value":214416},"You can associate a lead to a company by ID or by name. Use IDs when you already have them; otherwise, pass a name and let the CRM handle matching.",{"type":17,"tag":6893,"props":214418,"children":214421},{"className":214419,"code":214420,"language":18718,"meta":7},[18716],"const lead = await sdk.crm.createCrmLead({\n  connectionId,\n  crmLead: {\n    first_name: \"Jordan\",\n    last_name: \"Lee\",\n    company_name: \"Example Corp\",\n    source: \"Website\",\n    status: \"New\",\n    emails: [\n      { email: \"jordan@example.com\", type: \"WORK\" },\n    ],\n  },\n});\n",[214422],{"type":17,"tag":6121,"props":214423,"children":214424},{"__ignoreMap":7},[214425],{"type":23,"value":214420},{"type":17,"tag":29,"props":214427,"children":214428},{},[214429,214431,214436],{"type":23,"value":214430},"As with contacts, the response includes the lead ",{"type":17,"tag":6121,"props":214432,"children":214434},{"className":214433},[],[214435],{"type":23,"value":18766},{"type":23,"value":54},{"type":17,"tag":68,"props":214438,"children":214440},{"id":214439},"step-8-find-or-update-a-lead",[214441],{"type":23,"value":214442},"Step 8: Find or update a lead",{"type":17,"tag":29,"props":214444,"children":214445},{},[214446],{"type":23,"value":214447},"Use the same find-then-update pattern for leads.",{"type":17,"tag":6893,"props":214449,"children":214452},{"className":214450,"code":214451,"language":18718,"meta":7},[18716],"const leads = await sdk.crm.listCrmLeads({\n  connectionId,\n  limit: 1,\n  offset: 0,\n  query: \"jordan@example.com\",\n});\n\nif (leads.length > 0) {\n  await sdk.crm.updateCrmLead({\n    connectionId,\n    id: leads[0].id,\n    crmLead: {\n      status: \"Qualified\",\n    },\n  });\n}\n",[214453],{"type":17,"tag":6121,"props":214454,"children":214455},{"__ignoreMap":7},[214456],{"type":23,"value":214451},{"type":17,"tag":68,"props":214458,"children":214460},{"id":214459},"step-9-write-custom-fields-with-metadata",[214461],{"type":23,"value":214462},"Step 9: Write custom fields with metadata",{"type":17,"tag":29,"props":214464,"children":214465},{},[214466,214468,214473],{"type":23,"value":214467},"Both contacts and leads support ",{"type":17,"tag":6121,"props":214469,"children":214471},{"className":214470},[],[214472],{"type":23,"value":133378},{"type":23,"value":214474}," for custom fields.",{"type":17,"tag":29,"props":214476,"children":214477},{},[214478],{"type":23,"value":214479},"Each metadata entry includes:",{"type":17,"tag":80,"props":214481,"children":214482},{},[214483,214494,214502],{"type":17,"tag":84,"props":214484,"children":214485},{},[214486,214492],{"type":17,"tag":6121,"props":214487,"children":214489},{"className":214488},[],[214490],{"type":23,"value":214491},"slug",{"type":23,"value":214493}," to identify the field",{"type":17,"tag":84,"props":214495,"children":214496},{},[214497],{"type":17,"tag":6121,"props":214498,"children":214500},{"className":214499},[],[214501],{"type":23,"value":18792},{"type":17,"tag":84,"props":214503,"children":214504},{},[214505,214511],{"type":17,"tag":6121,"props":214506,"children":214508},{"className":214507},[],[214509],{"type":23,"value":214510},"format",{"type":23,"value":214512}," to describe the data type",{"type":17,"tag":6893,"props":214514,"children":214517},{"className":214515,"code":214516,"language":18718,"meta":7},[18716],"await sdk.crm.updateCrmContact({\n  connectionId,\n  id: contact.id,\n  crmContact: {\n    metadata: [\n      {\n        slug: \"account_tier\",\n        value: \"enterprise\",\n        format: \"SINGLE_SELECT\",\n      },\n      {\n        slug: \"employee_count\",\n        value: 1200,\n        format: \"NUMBER\",\n      },\n    ],\n  },\n});\n",[214518],{"type":17,"tag":6121,"props":214519,"children":214520},{"__ignoreMap":7},[214521],{"type":23,"value":214516},{"type":17,"tag":29,"props":214523,"children":214524},{},[214525],{"type":23,"value":214526},"Custom field support varies by CRM. Always verify field availability and write support in the Feature Support tab.",{"type":17,"tag":68,"props":214528,"children":214530},{"id":214529},"step-10-verify-writes-with-retrieve",[214531],{"type":23,"value":214532},"Step 10: Verify writes with retrieve",{"type":17,"tag":29,"props":214534,"children":214535},{},[214536],{"type":23,"value":214537},"After creating or updating records, retrieve them by ID to confirm the write succeeded.",{"type":17,"tag":6893,"props":214539,"children":214542},{"className":214540,"code":214541,"language":18718,"meta":7},[18716],"const verified = await sdk.crm.getCrmContact({\n  connectionId,\n  id: contact.id,\n});\n",[214543],{"type":17,"tag":6121,"props":214544,"children":214545},{"__ignoreMap":7},[214546],{"type":23,"value":214541},{"type":17,"tag":29,"props":214548,"children":214549},{},[214550],{"type":23,"value":214551},"This is especially useful when debugging integration-specific constraints or required fields.",{"type":17,"tag":68,"props":214553,"children":214555},{"id":214554},"step-11-optional-cleanup",[214556],{"type":23,"value":214557},"Step 11: Optional cleanup",{"type":17,"tag":29,"props":214559,"children":214560},{},[214561],{"type":23,"value":214562},"Unified supports record deletion if your workflow requires it.",{"type":17,"tag":6893,"props":214564,"children":214567},{"className":214565,"code":214566,"language":18718,"meta":7},[18716],"await sdk.crm.removeCrmLead({\n  connectionId,\n  id: lead.id,\n});\n",[214568],{"type":17,"tag":6121,"props":214569,"children":214570},{"__ignoreMap":7},[214571],{"type":23,"value":214566},{"type":17,"tag":29,"props":214573,"children":214574},{},[214575],{"type":23,"value":214576},"Deletion support varies by CRM and should be used cautiously.",{"type":17,"tag":68,"props":214578,"children":214579},{"id":44585},[214580],{"type":23,"value":44588},{"type":17,"tag":29,"props":214582,"children":214583},{},[214584],{"type":23,"value":214585},"Using Unified's CRM API, you can push leads and contacts into CRMs with a single, consistent write surface:",{"type":17,"tag":80,"props":214587,"children":214588},{},[214589,214594,214599,214609,214614,214619],{"type":17,"tag":84,"props":214590,"children":214591},{},[214592],{"type":23,"value":214593},"Create and update contacts and leads using normalized schemas",{"type":17,"tag":84,"props":214595,"children":214596},{},[214597],{"type":23,"value":214598},"Associate records using IDs or names",{"type":17,"tag":84,"props":214600,"children":214601},{},[214602,214604],{"type":23,"value":214603},"Write custom fields through ",{"type":17,"tag":6121,"props":214605,"children":214607},{"className":214606},[],[214608],{"type":23,"value":133378},{"type":17,"tag":84,"props":214610,"children":214611},{},[214612],{"type":23,"value":214613},"Implement safe find-then-update flows without assuming upsert",{"type":17,"tag":84,"props":214615,"children":214616},{},[214617],{"type":23,"value":214618},"Verify writes using retrieve endpoints",{"type":17,"tag":84,"props":214620,"children":214621},{},[214622,214624,214628],{"type":23,"value":214623},"Handle ",{"type":17,"tag":133,"props":214625,"children":214626},{"href":1857},[214627],{"type":23,"value":1860},{"type":23,"value":214629},", filtering, and integration variance explicitly",{"type":17,"tag":29,"props":214631,"children":214632},{},[214633,214634],{"type":23,"value":1609},{"type":17,"tag":133,"props":214635,"children":214637},{"href":1612,"rel":214636},[214],[214638],{"type":23,"value":1616},{"type":17,"tag":29,"props":214640,"children":214641},{},[214642,214643],{"type":23,"value":1609},{"type":17,"tag":133,"props":214644,"children":214646},{"href":1623,"rel":214645},[214],[214647],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":214649},[214650,214651,214652,214653,214660,214661,214662,214663,214664,214665,214666,214667,214668],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":213861,"depth":1629,"text":213864,"children":214654},[214655,214656,214658],{"id":211261,"depth":1635,"text":211978},{"id":214105,"depth":1635,"text":214657},"Leads (CrmLead)",{"id":214244,"depth":1635,"text":214659},"Companies (CrmCompany) optional",{"id":214260,"depth":1629,"text":214263},{"id":214311,"depth":1629,"text":214314},{"id":214355,"depth":1629,"text":214358},{"id":214397,"depth":1629,"text":214400},{"id":214439,"depth":1629,"text":214442},{"id":214459,"depth":1629,"text":214462},{"id":214529,"depth":1629,"text":214532},{"id":214554,"depth":1629,"text":214557},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_push_leads_and_contacts_into_crms_with_unified_crm_api.md","blog/how_to_push_leads_and_contacts_into_crms_with_unified_crm_api.md","blog/how_to_push_leads_and_contacts_into_crms_with_unified_crm_api",{"_path":214673,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":214674,"description":214675,"img":214676,"date":214677,"tag":12,"body":214678,"_type":1677,"_id":215351,"_source":1679,"_file":215352,"_stem":215353,"_extension":1682},"/blog/credential_management_in_unified_bring_your_own_secrets_manager","Credential Management in Unified: Bring Your Own Secrets Manager","Credential management is one of the most sensitive parts of integration infrastructure. OAuth tokens, API keys, and refresh logic determine not just whether...","https://s3.us-east-2.amazonaws.com/unified-article-images/credential_management_in_unified_bring_your_own_secrets_manager-icon.png","2026-01-30T14:27:00.000Z",{"type":14,"children":214679,"toc":215337},[214680,214685,214688,214696,214713,214718,214731,214743,214749,214754,214759,214787,214792,214803,214809,214820,214824,214859,214864,214869,214875,214887,214892,214913,214918,214941,214952,214963,214969,214975,215003,215009,215032,215044,215050,215055,215077,215082,215105,215110,215115,215121,215126,215131,215136,215166,215176,215182,215187,215215,215220,215225,215230,215235,215263,215268,215280,215286,215291,215303,215308,215313,215318],{"type":17,"tag":18,"props":214681,"children":214683},{"id":214682},"credential-management-in-unified-bring-your-own-secrets-manager",[214684],{"type":23,"value":214674},{"type":17,"tag":25,"props":214686,"children":214687},{},[],{"type":17,"tag":29,"props":214689,"children":214690},{},[214691],{"type":17,"tag":33,"props":214692,"children":214693},{},[214694],{"type":23,"value":214695},"January 30, 2026",{"type":17,"tag":29,"props":214697,"children":214698},{},[214699,214701,214705,214707,214712],{"type":23,"value":214700},"Credential management is one of the most sensitive parts of integration infrastructure. ",{"type":17,"tag":133,"props":214702,"children":214703},{"href":779},[214704],{"type":23,"value":782},{"type":23,"value":214706}," tokens, API keys, and refresh logic determine not just whether integrations work, but ",{"type":17,"tag":48,"props":214708,"children":214709},{},[214710],{"type":23,"value":214711},"who controls access, how failures are handled, and where risk lives",{"type":23,"value":54},{"type":17,"tag":29,"props":214714,"children":214715},{},[214716],{"type":23,"value":214717},"Unified's approach to credential management is intentionally narrow and explicit:",{"type":17,"tag":80,"props":214719,"children":214720},{},[214721,214726],{"type":17,"tag":84,"props":214722,"children":214723},{},[214724],{"type":23,"value":214725},"Unified manages token lifecycle and integration behavior.",{"type":17,"tag":84,"props":214727,"children":214728},{},[214729],{"type":23,"value":214730},"Customers control where credentials are stored.",{"type":17,"tag":29,"props":214732,"children":214733},{},[214734,214736,214741],{"type":23,"value":214735},"This post explains ",{"type":17,"tag":48,"props":214737,"children":214738},{},[214739],{"type":23,"value":214740},"how credential management works in Unified",{"type":23,"value":214742},", why credential ownership matters, and how Unified supports customer-managed secrets managers today.",{"type":17,"tag":68,"props":214744,"children":214746},{"id":214745},"credential-management-in-unified",[214747],{"type":23,"value":214748},"Credential Management in Unified",{"type":17,"tag":29,"props":214750,"children":214751},{},[214752],{"type":23,"value":214753},"Unified handles authorization and credentials across all supported integrations, including OAuth-based platforms and API-key systems.",{"type":17,"tag":29,"props":214755,"children":214756},{},[214757],{"type":23,"value":214758},"At a high level, Unified is responsible for:",{"type":17,"tag":80,"props":214760,"children":214761},{},[214762,214767,214772,214777,214782],{"type":17,"tag":84,"props":214763,"children":214764},{},[214765],{"type":23,"value":214766},"Exchanging credentials during authorization",{"type":17,"tag":84,"props":214768,"children":214769},{},[214770],{"type":23,"value":214771},"Tracking token expiration",{"type":17,"tag":84,"props":214773,"children":214774},{},[214775],{"type":23,"value":214776},"Refreshing access and refresh tokens automatically",{"type":17,"tag":84,"props":214778,"children":214779},{},[214780],{"type":23,"value":214781},"Handling provider-specific OAuth behavior",{"type":17,"tag":84,"props":214783,"children":214784},{},[214785],{"type":23,"value":214786},"Isolating credentials per customer connection",{"type":17,"tag":29,"props":214788,"children":214789},{},[214790],{"type":23,"value":214791},"Applications integrating with Unified do not manage token refresh jobs, background schedulers, or provider-specific edge cases. Unified abstracts that complexity and exposes connection health consistently.",{"type":17,"tag":29,"props":214793,"children":214794},{},[214795,214797,214802],{"type":23,"value":214796},"Where Unified is deliberately flexible is ",{"type":17,"tag":48,"props":214798,"children":214799},{},[214800],{"type":23,"value":214801},"credential storage",{"type":23,"value":54},{"type":17,"tag":68,"props":214804,"children":214806},{"id":214805},"unified-managed-credential-storage-default",[214807],{"type":23,"value":214808},"Unified-Managed Credential Storage (Default)",{"type":17,"tag":29,"props":214810,"children":214811},{},[214812,214814,214819],{"type":23,"value":214813},"By default, Unified can store OAuth tokens and API credentials ",{"type":17,"tag":48,"props":214815,"children":214816},{},[214817],{"type":23,"value":214818},"encrypted within its infrastructure",{"type":23,"value":54},{"type":17,"tag":29,"props":214821,"children":214822},{},[214823],{"type":23,"value":3442},{"type":17,"tag":80,"props":214825,"children":214826},{},[214827,214832,214837,214842,214847],{"type":17,"tag":84,"props":214828,"children":214829},{},[214830],{"type":23,"value":214831},"Credentials are encrypted at rest (AES-256)",{"type":17,"tag":84,"props":214833,"children":214834},{},[214835],{"type":23,"value":214836},"All data in transit uses TLS 1.2+",{"type":17,"tag":84,"props":214838,"children":214839},{},[214840],{"type":23,"value":214841},"Token expiration and refresh are handled automatically",{"type":17,"tag":84,"props":214843,"children":214844},{},[214845],{"type":23,"value":214846},"Applications never interact with raw credentials",{"type":17,"tag":84,"props":214848,"children":214849},{},[214850,214852,214857],{"type":23,"value":214851},"Failed refreshes surface a consistent ",{"type":17,"tag":6121,"props":214853,"children":214855},{"className":214854},[],[214856],{"type":23,"value":139168},{"type":23,"value":214858}," and mark the connection unhealthy",{"type":17,"tag":29,"props":214860,"children":214861},{},[214862],{"type":23,"value":214863},"This option works well for many teams, especially those optimizing for speed and simplicity.",{"type":17,"tag":29,"props":214865,"children":214866},{},[214867],{"type":23,"value":214868},"However, some teams require tighter control over where credentials live.",{"type":17,"tag":68,"props":214870,"children":214872},{"id":214871},"customer-managed-secrets-bring-your-own-vault",[214873],{"type":23,"value":214874},"Customer-Managed Secrets: Bring Your Own Vault",{"type":17,"tag":29,"props":214876,"children":214877},{},[214878,214880,214885],{"type":23,"value":214879},"Unified also supports storing credentials ",{"type":17,"tag":48,"props":214881,"children":214882},{},[214883],{"type":23,"value":214884},"entirely inside customer-owned secrets infrastructure",{"type":23,"value":214886},", rather than Unified's database.",{"type":17,"tag":29,"props":214888,"children":214889},{},[214890],{"type":23,"value":214891},"Unified currently integrates with:",{"type":17,"tag":80,"props":214893,"children":214894},{},[214895,214899,214904,214909],{"type":17,"tag":84,"props":214896,"children":214897},{},[214898],{"type":23,"value":764},{"type":17,"tag":84,"props":214900,"children":214901},{},[214902],{"type":23,"value":214903},"Azure Key Vault",{"type":17,"tag":84,"props":214905,"children":214906},{},[214907],{"type":23,"value":214908},"Google Cloud Secrets Manager",{"type":17,"tag":84,"props":214910,"children":214911},{},[214912],{"type":23,"value":77646},{"type":17,"tag":29,"props":214914,"children":214915},{},[214916],{"type":23,"value":214917},"When customer-managed secrets are enabled:",{"type":17,"tag":80,"props":214919,"children":214920},{},[214921,214926,214931,214936],{"type":17,"tag":84,"props":214922,"children":214923},{},[214924],{"type":23,"value":214925},"OAuth tokens and API credentials are stored in your cloud account",{"type":17,"tag":84,"props":214927,"children":214928},{},[214929],{"type":23,"value":214930},"Unified accesses credentials only when required to make API calls or refresh tokens",{"type":17,"tag":84,"props":214932,"children":214933},{},[214934],{"type":23,"value":214935},"Credentials are not persisted in Unified's core data store",{"type":17,"tag":84,"props":214937,"children":214938},{},[214939],{"type":23,"value":214940},"Token refresh and lifecycle management remain fully automated",{"type":17,"tag":29,"props":214942,"children":214943},{},[214944,214946,214951],{"type":23,"value":214945},"Unified continues to manage ",{"type":17,"tag":48,"props":214947,"children":214948},{},[214949],{"type":23,"value":214950},"behavior and reliability",{"type":23,"value":54},{"type":17,"tag":29,"props":214953,"children":214954},{},[214955,214957,214962],{"type":23,"value":214956},"Customers retain ",{"type":17,"tag":48,"props":214958,"children":214959},{},[214960],{"type":23,"value":214961},"ownership and control of the vault",{"type":23,"value":54},{"type":17,"tag":68,"props":214964,"children":214966},{"id":214965},"what-this-changes-and-what-it-doesnt",[214967],{"type":23,"value":214968},"What This Changes — and What It Doesn't",{"type":17,"tag":239,"props":214970,"children":214972},{"id":214971},"what-changes",[214973],{"type":23,"value":214974},"What changes",{"type":17,"tag":80,"props":214976,"children":214977},{},[214978,214983,214988,214993,214998],{"type":17,"tag":84,"props":214979,"children":214980},{},[214981],{"type":23,"value":214982},"Credentials live inside your existing security boundary",{"type":17,"tag":84,"props":214984,"children":214985},{},[214986],{"type":23,"value":214987},"Vault access follows your IAM and security policies",{"type":17,"tag":84,"props":214989,"children":214990},{},[214991],{"type":23,"value":214992},"Environments can be isolated (production vs staging)",{"type":17,"tag":84,"props":214994,"children":214995},{},[214996],{"type":23,"value":214997},"Security reviews and procurement are simplified",{"type":17,"tag":84,"props":214999,"children":215000},{},[215001],{"type":23,"value":215002},"Credential portability is preserved",{"type":17,"tag":239,"props":215004,"children":215006},{"id":215005},"what-doesnt-change",[215007],{"type":23,"value":215008},"What doesn't change",{"type":17,"tag":80,"props":215010,"children":215011},{},[215012,215017,215022,215027],{"type":17,"tag":84,"props":215013,"children":215014},{},[215015],{"type":23,"value":215016},"Unified does not store customer data",{"type":17,"tag":84,"props":215018,"children":215019},{},[215020],{"type":23,"value":215021},"OAuth flows and provider requirements remain the same",{"type":17,"tag":84,"props":215023,"children":215024},{},[215025],{"type":23,"value":215026},"No caching or persistence is introduced",{"type":17,"tag":84,"props":215028,"children":215029},{},[215030],{"type":23,"value":215031},"Applications do not manage refresh logic",{"type":17,"tag":29,"props":215033,"children":215034},{},[215035,215037,215042],{"type":23,"value":215036},"This is a change in ",{"type":17,"tag":48,"props":215038,"children":215039},{},[215040],{"type":23,"value":215041},"ownership",{"type":23,"value":215043},", not architecture.",{"type":17,"tag":68,"props":215045,"children":215047},{"id":215046},"token-lifecycle-and-failure-handling",[215048],{"type":23,"value":215049},"Token Lifecycle and Failure Handling",{"type":17,"tag":29,"props":215051,"children":215052},{},[215053],{"type":23,"value":215054},"Regardless of where credentials are stored, Unified continues to handle:",{"type":17,"tag":80,"props":215056,"children":215057},{},[215058,215063,215068,215072],{"type":17,"tag":84,"props":215059,"children":215060},{},[215061],{"type":23,"value":215062},"Expiration tracking",{"type":17,"tag":84,"props":215064,"children":215065},{},[215066],{"type":23,"value":215067},"Automatic access and refresh token rotation",{"type":17,"tag":84,"props":215069,"children":215070},{},[215071],{"type":23,"value":197625},{"type":17,"tag":84,"props":215073,"children":215074},{},[215075],{"type":23,"value":215076},"Connection health monitoring",{"type":17,"tag":29,"props":215078,"children":215079},{},[215080],{"type":23,"value":215081},"If a refresh fails:",{"type":17,"tag":80,"props":215083,"children":215084},{},[215085,215090,215100],{"type":17,"tag":84,"props":215086,"children":215087},{},[215088],{"type":23,"value":215089},"The connection is flagged as unhealthy",{"type":17,"tag":84,"props":215091,"children":215092},{},[215093,215095],{"type":23,"value":215094},"API calls return a consistent ",{"type":17,"tag":6121,"props":215096,"children":215098},{"className":215097},[],[215099],{"type":23,"value":139168},{"type":17,"tag":84,"props":215101,"children":215102},{},[215103],{"type":23,"value":215104},"A connection health event is emitted so applications can respond",{"type":17,"tag":29,"props":215106,"children":215107},{},[215108],{"type":23,"value":215109},"From the application's perspective, integration behavior is unchanged.",{"type":17,"tag":29,"props":215111,"children":215112},{},[215113],{"type":23,"value":215114},"From a security perspective, responsibility is clearer.",{"type":17,"tag":68,"props":215116,"children":215118},{"id":215117},"why-credential-ownership-matters",[215119],{"type":23,"value":215120},"Why Credential Ownership Matters",{"type":17,"tag":29,"props":215122,"children":215123},{},[215124],{"type":23,"value":215125},"For many teams, vendor-managed encrypted storage is sufficient.",{"type":17,"tag":29,"props":215127,"children":215128},{},[215129],{"type":23,"value":215130},"For others, it's a blocker.",{"type":17,"tag":29,"props":215132,"children":215133},{},[215134],{"type":23,"value":215135},"Teams operating in regulated or enterprise environments consistently require:",{"type":17,"tag":80,"props":215137,"children":215138},{},[215139,215151,215156,215161],{"type":17,"tag":84,"props":215140,"children":215141},{},[215142,215144,215149],{"type":23,"value":215143},"Credentials to live in ",{"type":17,"tag":33,"props":215145,"children":215146},{},[215147],{"type":23,"value":215148},"their",{"type":23,"value":215150}," cloud",{"type":17,"tag":84,"props":215152,"children":215153},{},[215154],{"type":23,"value":215155},"Vault access governed by internal IAM policies",{"type":17,"tag":84,"props":215157,"children":215158},{},[215159],{"type":23,"value":215160},"Clear separation between environments",{"type":17,"tag":84,"props":215162,"children":215163},{},[215164],{"type":23,"value":215165},"Long-term portability and reduced vendor lock-in",{"type":17,"tag":29,"props":215167,"children":215168},{},[215169,215171],{"type":23,"value":215170},"Customer-managed secrets exist to meet those requirements ",{"type":17,"tag":48,"props":215172,"children":215173},{},[215174],{"type":23,"value":215175},"without changing how Unified operates.",{"type":17,"tag":68,"props":215177,"children":215179},{"id":215178},"how-this-fits-unifieds-architecture",[215180],{"type":23,"value":215181},"How This Fits Unified's Architecture",{"type":17,"tag":29,"props":215183,"children":215184},{},[215185],{"type":23,"value":215186},"Unified is a real-time, passthrough integration platform:",{"type":17,"tag":80,"props":215188,"children":215189},{},[215190,215195,215200,215205,215210],{"type":17,"tag":84,"props":215191,"children":215192},{},[215193],{"type":23,"value":215194},"Customer data is fetched live from source systems",{"type":17,"tag":84,"props":215196,"children":215197},{},[215198],{"type":23,"value":215199},"Nothing is cached or stored at rest",{"type":17,"tag":84,"props":215201,"children":215202},{},[215203],{"type":23,"value":215204},"Logs are minimized and redacted",{"type":17,"tag":84,"props":215206,"children":215207},{},[215208],{"type":23,"value":215209},"Operational metadata is encrypted",{"type":17,"tag":84,"props":215211,"children":215212},{},[215213],{"type":23,"value":215214},"Credential handling is isolated per connection",{"type":17,"tag":29,"props":215216,"children":215217},{},[215218],{"type":23,"value":215219},"Allowing customers to own their credential vault is a direct extension of that model.",{"type":17,"tag":29,"props":215221,"children":215222},{},[215223],{"type":23,"value":215224},"Unified avoids storing what it doesn't need to store — data or secrets.",{"type":17,"tag":68,"props":215226,"children":215227},{"id":182585},[215228],{"type":23,"value":215229},"Who This Is For",{"type":17,"tag":29,"props":215231,"children":215232},{},[215233],{"type":23,"value":215234},"Customer-managed secrets are most relevant for teams that:",{"type":17,"tag":80,"props":215236,"children":215237},{},[215238,215243,215248,215253,215258],{"type":17,"tag":84,"props":215239,"children":215240},{},[215241],{"type":23,"value":215242},"Serve enterprise customers",{"type":17,"tag":84,"props":215244,"children":215245},{},[215246],{"type":23,"value":215247},"Undergo SOC 2, HIPAA, or GDPR reviews",{"type":17,"tag":84,"props":215249,"children":215250},{},[215251],{"type":23,"value":215252},"Have internal security or platform teams",{"type":17,"tag":84,"props":215254,"children":215255},{},[215256],{"type":23,"value":215257},"Operate multi-cloud or standardized vault infrastructure",{"type":17,"tag":84,"props":215259,"children":215260},{},[215261],{"type":23,"value":215262},"Want clean exit paths and minimal vendor lock-in",{"type":17,"tag":29,"props":215264,"children":215265},{},[215266],{"type":23,"value":215267},"Unified-managed encrypted storage remains available for teams that don't need this level of control.",{"type":17,"tag":29,"props":215269,"children":215270},{},[215271,215273,215278],{"type":23,"value":215272},"This is about ",{"type":17,"tag":48,"props":215274,"children":215275},{},[215276],{"type":23,"value":215277},"choice",{"type":23,"value":215279},", not added complexity.",{"type":17,"tag":68,"props":215281,"children":215283},{"id":215282},"a-clear-security-boundary",[215284],{"type":23,"value":215285},"A Clear Security Boundary",{"type":17,"tag":29,"props":215287,"children":215288},{},[215289],{"type":23,"value":215290},"Unified doesn't try to be a database, a vault, or a security platform.",{"type":17,"tag":29,"props":215292,"children":215293},{},[215294,215296,215301],{"type":23,"value":215295},"We focus on being ",{"type":17,"tag":48,"props":215297,"children":215298},{},[215299],{"type":23,"value":215300},"real-time integration infrastructure",{"type":23,"value":215302}," — and on owning only what we need to own.",{"type":17,"tag":29,"props":215304,"children":215305},{},[215306],{"type":23,"value":215307},"Credential management is unavoidable.",{"type":17,"tag":29,"props":215309,"children":215310},{},[215311],{"type":23,"value":215312},"Credential ownership is optional.",{"type":17,"tag":29,"props":215314,"children":215315},{},[215316],{"type":23,"value":215317},"With customer-managed Secrets Manager support, that boundary is now explicit.",{"type":17,"tag":29,"props":215319,"children":215320},{},[215321,215327,215328,215335],{"type":17,"tag":133,"props":215322,"children":215324},{"href":158861,"rel":215323},[214],[215325],{"type":23,"value":215326},"Start a free trial",{"type":23,"value":75890},{"type":17,"tag":133,"props":215329,"children":215332},{"href":215330,"rel":215331},"https://unified.to/contact",[214],[215333],{"type":23,"value":215334},"talk to us",{"type":23,"value":215336}," to see your real-time use case live.",{"title":7,"searchDepth":1629,"depth":1629,"links":215338},[215339,215340,215341,215342,215346,215347,215348,215349,215350],{"id":214745,"depth":1629,"text":214748},{"id":214805,"depth":1629,"text":214808},{"id":214871,"depth":1629,"text":214874},{"id":214965,"depth":1629,"text":214968,"children":215343},[215344,215345],{"id":214971,"depth":1635,"text":214974},{"id":215005,"depth":1635,"text":215008},{"id":215046,"depth":1629,"text":215049},{"id":215117,"depth":1629,"text":215120},{"id":215178,"depth":1629,"text":215181},{"id":182585,"depth":1629,"text":215229},{"id":215282,"depth":1629,"text":215285},"content:blog:credential_management_in_unified_bring_your_own_secrets_manager.md","blog/credential_management_in_unified_bring_your_own_secrets_manager.md","blog/credential_management_in_unified_bring_your_own_secrets_manager",{"_path":215355,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":215356,"description":215357,"img":215358,"date":215359,"tag":12,"body":215360,"_type":1677,"_id":215943,"_source":1679,"_file":215944,"_stem":215945,"_extension":1682},"/blog/which_unified_api_platform_supports_real_time_webhooks","Which Unified API Platform Supports Real-Time Webhooks?","In most cases, teams are not actually asking about webhooks—they're asking how quickly changes from an integration reach their application, and how much work...","https://s3.us-east-2.amazonaws.com/unified-article-images/which_unified_api_platform_supports_real_time_webhooks-icon.png","2026-01-30T13:53:00.000Z",{"type":14,"children":215361,"toc":215926},[215362,215367,215370,215377,215385,215396,215401,215406,215429,215435,215440,215458,215463,215469,215474,215478,215483,215499,215504,215508,215513,215517,215533,215538,215543,215551,215556,215560,215565,215583,215588,215597,215601,215613,215618,215624,215629,215633,215651,215656,215662,215666,215673,215685,215692,215703,215708,215714,215719,215735,215740,215745,215750,215763,215768,215774,215779,215811,215816,215822,215827,215840,215844,215867,215872,215876,215881,215885,215900,215905,215910],{"type":17,"tag":18,"props":215363,"children":215365},{"id":215364},"which-unified-api-platform-supports-real-time-webhooks",[215366],{"type":23,"value":215356},{"type":17,"tag":25,"props":215368,"children":215369},{},[],{"type":17,"tag":29,"props":215371,"children":215372},{},[215373],{"type":17,"tag":33,"props":215374,"children":215375},{},[215376],{"type":23,"value":214695},{"type":17,"tag":29,"props":215378,"children":215379},{},[215380],{"type":17,"tag":6438,"props":215381,"children":215384},{"alt":215382,"src":215383},"unlock_real_time_data_with_virtual_webhooks-0.png","https://s3.us-east-2.amazonaws.com/unified-article-images/which_unified_api_platform_supports_real_time_webhooks-0.png",[],{"type":17,"tag":29,"props":215386,"children":215387},{},[215388,215390,215394],{"type":23,"value":215389},"Not all 'real-time ",{"type":17,"tag":133,"props":215391,"children":215392},{"href":4999},[215393],{"type":23,"value":5002},{"type":23,"value":215395},"' are the same.",{"type":17,"tag":29,"props":215397,"children":215398},{},[215399],{"type":23,"value":215400},"In most cases, teams are not actually asking about webhooks—they're asking how quickly changes from an integration reach their application, and how much work is required to process those changes.",{"type":17,"tag":29,"props":215402,"children":215403},{},[215404],{"type":23,"value":215405},"'Real-time' can describe very different event delivery models. The differences show up in latency, payload design, and whether your application still needs additional API calls after receiving an event.",{"type":17,"tag":3414,"props":215407,"children":215408},{},[215409],{"type":17,"tag":29,"props":215410,"children":215411},{},[215412,215413,215417,215419],{"type":23,"value":8993},{"type":17,"tag":133,"props":215414,"children":215415},{"href":7691},[215416],{"type":23,"value":7459},{"type":23,"value":215418}," platforms and how they implement webhook event delivery, see: ",{"type":17,"tag":48,"props":215420,"children":215421},{},[215422,215423,215427],{"type":23,"value":9004},{"type":17,"tag":133,"props":215424,"children":215425},{"href":9007},[215426],{"type":23,"value":9010},{"type":23,"value":215428}," vs Sync-Based Notifications",{"type":17,"tag":68,"props":215430,"children":215432},{"id":215431},"what-real-time-webhooks-actually-means",[215433],{"type":23,"value":215434},"What 'real-time webhooks' actually means",{"type":17,"tag":29,"props":215436,"children":215437},{},[215438],{"type":23,"value":215439},"When teams ask about real-time webhooks, they are usually trying to avoid:",{"type":17,"tag":80,"props":215441,"children":215442},{},[215443,215448,215453],{"type":17,"tag":84,"props":215444,"children":215445},{},[215446],{"type":23,"value":215447},"stale or delayed data",{"type":17,"tag":84,"props":215449,"children":215450},{},[215451],{"type":23,"value":215452},"building and maintaining polling infrastructure",{"type":17,"tag":84,"props":215454,"children":215455},{},[215456],{"type":23,"value":215457},"receiving webhook notifications that still require another API call",{"type":17,"tag":29,"props":215459,"children":215460},{},[215461],{"type":23,"value":215462},"Those outcomes depend on how changes are detected and delivered—not whether a webhook endpoint exists.",{"type":17,"tag":68,"props":215464,"children":215466},{"id":215465},"how-integrations-deliver-events",[215467],{"type":23,"value":215468},"How integrations deliver events",{"type":17,"tag":29,"props":215470,"children":215471},{},[215472],{"type":23,"value":215473},"There are two fundamentally different approaches to event delivery, plus native webhooks where available.",{"type":17,"tag":239,"props":215475,"children":215476},{"id":9021},[215477],{"type":23,"value":9024},{"type":17,"tag":29,"props":215479,"children":215480},{},[215481],{"type":23,"value":215482},"Some integrations support webhooks directly.",{"type":17,"tag":80,"props":215484,"children":215485},{},[215486,215490,215495],{"type":17,"tag":84,"props":215487,"children":215488},{},[215489],{"type":23,"value":9037},{"type":17,"tag":84,"props":215491,"children":215492},{},[215493],{"type":23,"value":215494},"An event is sent immediately",{"type":17,"tag":84,"props":215496,"children":215497},{},[215498],{"type":23,"value":9047},{"type":17,"tag":29,"props":215500,"children":215501},{},[215502],{"type":23,"value":215503},"This is the simplest model, but coverage is limited. Many APIs either don't support webhooks or only support them for specific objects.",{"type":17,"tag":239,"props":215505,"children":215506},{"id":9074},[215507],{"type":23,"value":9077},{"type":17,"tag":29,"props":215509,"children":215510},{},[215511],{"type":23,"value":215512},"When native webhooks are not available, some platforms detect changes directly from the source API and deliver them as events.",{"type":17,"tag":29,"props":215514,"children":215515},{},[215516],{"type":23,"value":9087},{"type":17,"tag":80,"props":215518,"children":215519},{},[215520,215524,215528],{"type":17,"tag":84,"props":215521,"children":215522},{},[215523],{"type":23,"value":9095},{"type":17,"tag":84,"props":215525,"children":215526},{},[215527],{"type":23,"value":9100},{"type":17,"tag":84,"props":215529,"children":215530},{},[215531],{"type":23,"value":215532},"Delivers events through a webhook endpoint",{"type":17,"tag":29,"props":215534,"children":215535},{},[215536],{"type":23,"value":215537},"Your application subscribes once and receives events without running its own polling jobs.",{"type":17,"tag":29,"props":215539,"children":215540},{},[215541],{"type":23,"value":215542},"The key detail:",{"type":17,"tag":3414,"props":215544,"children":215545},{},[215546],{"type":17,"tag":29,"props":215547,"children":215548},{},[215549],{"type":23,"value":215550},"Polling still exists—it is handled inside the integration layer instead of your application.",{"type":17,"tag":29,"props":215552,"children":215553},{},[215554],{"type":23,"value":215555},"Freshness depends on how frequently changes are detected, which can vary by platform.",{"type":17,"tag":68,"props":215557,"children":215558},{"id":9144},[215559],{"type":23,"value":9147},{"type":17,"tag":29,"props":215561,"children":215562},{},[215563],{"type":23,"value":215564},"Other platforms take a different approach.",{"type":17,"tag":80,"props":215566,"children":215567},{},[215568,215573,215578],{"type":17,"tag":84,"props":215569,"children":215570},{},[215571],{"type":23,"value":215572},"Data is retrieved on a scheduled interval",{"type":17,"tag":84,"props":215574,"children":215575},{},[215576],{"type":23,"value":215577},"Records are stored in the platform's environment",{"type":17,"tag":84,"props":215579,"children":215580},{},[215581],{"type":23,"value":215582},"A webhook notifies you after the sync completes",{"type":17,"tag":29,"props":215584,"children":215585},{},[215586],{"type":23,"value":215587},"These are not change-detection systems.",{"type":17,"tag":29,"props":215589,"children":215590},{},[215591,215592,215596],{"type":23,"value":9184},{"type":17,"tag":48,"props":215593,"children":215594},{},[215595],{"type":23,"value":9189},{"type":23,"value":54},{"type":17,"tag":29,"props":215598,"children":215599},{},[215600],{"type":23,"value":9195},{"type":17,"tag":80,"props":215602,"children":215603},{},[215604,215608],{"type":17,"tag":84,"props":215605,"children":215606},{},[215607],{"type":23,"value":9203},{"type":17,"tag":84,"props":215609,"children":215610},{},[215611],{"type":23,"value":215612},"Your application retrieves the data separately",{"type":17,"tag":29,"props":215614,"children":215615},{},[215616],{"type":23,"value":215617},"This means your application reacts after the sync completes, not when the change occurs.",{"type":17,"tag":68,"props":215619,"children":215621},{"id":215620},"why-real-time-can-be-misleading",[215622],{"type":23,"value":215623},"Why 'real-time' can be misleading",{"type":17,"tag":29,"props":215625,"children":215626},{},[215627],{"type":23,"value":215628},"Two platforms can both claim 'real-time webhooks' and behave very differently.",{"type":17,"tag":239,"props":215630,"children":215631},{"id":838},[215632],{"type":23,"value":9978},{"type":17,"tag":80,"props":215634,"children":215635},{},[215636,215641,215646],{"type":17,"tag":84,"props":215637,"children":215638},{},[215639],{"type":23,"value":215640},"Native webhooks → near immediate",{"type":17,"tag":84,"props":215642,"children":215643},{},[215644],{"type":23,"value":215645},"Virtual webhooks → depends on detection interval",{"type":17,"tag":84,"props":215647,"children":215648},{},[215649],{"type":23,"value":215650},"Sync-based systems → depends on sync schedule",{"type":17,"tag":29,"props":215652,"children":215653},{},[215654],{"type":23,"value":215655},"If your product depends on timing, this difference is visible to users.",{"type":17,"tag":239,"props":215657,"children":215659},{"id":215658},"what-the-event-actually-contains",[215660],{"type":23,"value":215661},"What the event actually contains",{"type":17,"tag":29,"props":215663,"children":215664},{},[215665],{"type":23,"value":9284},{"type":17,"tag":29,"props":215667,"children":215668},{},[215669],{"type":17,"tag":48,"props":215670,"children":215671},{},[215672],{"type":23,"value":9292},{"type":17,"tag":80,"props":215674,"children":215675},{},[215676,215681],{"type":17,"tag":84,"props":215677,"children":215678},{},[215679],{"type":23,"value":215680},"Webhook includes updated data",{"type":17,"tag":84,"props":215682,"children":215683},{},[215684],{"type":23,"value":9305},{"type":17,"tag":29,"props":215686,"children":215687},{},[215688],{"type":17,"tag":48,"props":215689,"children":215690},{},[215691],{"type":23,"value":9313},{"type":17,"tag":80,"props":215693,"children":215694},{},[215695,215699],{"type":17,"tag":84,"props":215696,"children":215697},{},[215698],{"type":23,"value":9321},{"type":17,"tag":84,"props":215700,"children":215701},{},[215702],{"type":23,"value":9208},{"type":17,"tag":29,"props":215704,"children":215705},{},[215706],{"type":23,"value":215707},"If every event requires another API call, your system still includes retrieval logic, pagination, and retries.",{"type":17,"tag":239,"props":215709,"children":215711},{"id":215710},"where-complexity-lives",[215712],{"type":23,"value":215713},"Where complexity lives",{"type":17,"tag":29,"props":215715,"children":215716},{},[215717],{"type":23,"value":215718},"Polling does not disappear—it moves.",{"type":17,"tag":80,"props":215720,"children":215721},{},[215722,215726,215730],{"type":17,"tag":84,"props":215723,"children":215724},{},[215725],{"type":23,"value":9349},{"type":17,"tag":84,"props":215727,"children":215728},{},[215729],{"type":23,"value":9354},{"type":17,"tag":84,"props":215731,"children":215732},{},[215733],{"type":23,"value":215734},"In sync systems → it runs as scheduled jobs",{"type":17,"tag":29,"props":215736,"children":215737},{},[215738],{"type":23,"value":215739},"The decision is not whether polling exists. It is where that logic lives.",{"type":17,"tag":239,"props":215741,"children":215743},{"id":215742},"data-handling",[215744],{"type":23,"value":7324},{"type":17,"tag":29,"props":215746,"children":215747},{},[215748],{"type":23,"value":215749},"Event delivery models also differ in how data is handled:",{"type":17,"tag":80,"props":215751,"children":215752},{},[215753,215758],{"type":17,"tag":84,"props":215754,"children":215755},{},[215756],{"type":23,"value":215757},"Some platforms store customer records and emit events based on that stored data",{"type":17,"tag":84,"props":215759,"children":215760},{},[215761],{"type":23,"value":215762},"Others retrieve data directly from the source API when events are generated",{"type":17,"tag":29,"props":215764,"children":215765},{},[215766],{"type":23,"value":215767},"This affects compliance scope, latency, and how tightly your application depends on the integration layer.",{"type":17,"tag":68,"props":215769,"children":215771},{"id":215770},"what-to-look-for-when-evaluating-platforms",[215772],{"type":23,"value":215773},"What to look for when evaluating platforms",{"type":17,"tag":29,"props":215775,"children":215776},{},[215777],{"type":23,"value":215778},"Instead of asking whether a platform supports real-time webhooks, ask:",{"type":17,"tag":80,"props":215780,"children":215781},{},[215782,215786,215791,215796,215801,215806],{"type":17,"tag":84,"props":215783,"children":215784},{},[215785],{"type":23,"value":179713},{"type":17,"tag":84,"props":215787,"children":215788},{},[215789],{"type":23,"value":215790},"What is the default detection or sync interval?",{"type":17,"tag":84,"props":215792,"children":215793},{},[215794],{"type":23,"value":215795},"Does the event include updated records?",{"type":17,"tag":84,"props":215797,"children":215798},{},[215799],{"type":23,"value":215800},"Will my application need another API call after the event?",{"type":17,"tag":84,"props":215802,"children":215803},{},[215804],{"type":23,"value":215805},"Is customer data stored?",{"type":17,"tag":84,"props":215807,"children":215808},{},[215809],{"type":23,"value":215810},"Is the event model consistent across integrations?",{"type":17,"tag":29,"props":215812,"children":215813},{},[215814],{"type":23,"value":215815},"These questions determine how your application behaves in production.",{"type":17,"tag":68,"props":215817,"children":215819},{"id":215818},"how-unified-approaches-event-delivery",[215820],{"type":23,"value":215821},"How Unified approaches event delivery",{"type":17,"tag":29,"props":215823,"children":215824},{},[215825],{"type":23,"value":215826},"Unified supports both native webhooks and a change-detection model for integrations that do not provide them.",{"type":17,"tag":80,"props":215828,"children":215829},{},[215830,215835],{"type":17,"tag":84,"props":215831,"children":215832},{},[215833],{"type":23,"value":215834},"Native webhooks are used when the source API supports them",{"type":17,"tag":84,"props":215836,"children":215837},{},[215838],{"type":23,"value":215839},"Virtual webhooks detect changes and deliver events through the same interface",{"type":17,"tag":29,"props":215841,"children":215842},{},[215843],{"type":23,"value":65343},{"type":17,"tag":80,"props":215845,"children":215846},{},[215847,215852,215857,215862],{"type":17,"tag":84,"props":215848,"children":215849},{},[215850],{"type":23,"value":215851},"configurable detection intervals, including minute-level polling",{"type":17,"tag":84,"props":215853,"children":215854},{},[215855],{"type":23,"value":215856},"events can include updated records directly",{"type":17,"tag":84,"props":215858,"children":215859},{},[215860],{"type":23,"value":215861},"no requirement for a second API call in many workflows",{"type":17,"tag":84,"props":215863,"children":215864},{},[215865],{"type":23,"value":215866},"no customer data stored at rest",{"type":17,"tag":29,"props":215868,"children":215869},{},[215870],{"type":23,"value":215871},"This allows applications to process changes as events, without building polling infrastructure or managing sync jobs.",{"type":17,"tag":68,"props":215873,"children":215874},{"id":45643},[215875],{"type":23,"value":45646},{"type":17,"tag":29,"props":215877,"children":215878},{},[215879],{"type":23,"value":215880},"'Real-time webhooks' is not a single capability.",{"type":17,"tag":29,"props":215882,"children":215883},{},[215884],{"type":23,"value":9504},{"type":17,"tag":80,"props":215886,"children":215887},{},[215888,215892,215896],{"type":17,"tag":84,"props":215889,"children":215890},{},[215891],{"type":23,"value":9512},{"type":17,"tag":84,"props":215893,"children":215894},{},[215895],{"type":23,"value":9517},{"type":17,"tag":84,"props":215897,"children":215898},{},[215899],{"type":23,"value":9522},{"type":17,"tag":29,"props":215901,"children":215902},{},[215903],{"type":23,"value":215904},"Some platforms notify your application after scheduled syncs. Others detect changes directly and deliver them as events.",{"type":17,"tag":29,"props":215906,"children":215907},{},[215908],{"type":23,"value":215909},"That distinction determines whether your system is built around events—or around scheduled data retrieval.",{"type":17,"tag":29,"props":215911,"children":215912},{},[215913,215918,215920,215925],{"type":17,"tag":133,"props":215914,"children":215916},{"href":158861,"rel":215915},[214],[215917],{"type":23,"value":215326},{"type":23,"value":215919}," to test real-time webhooks on your own integrations or ",{"type":17,"tag":133,"props":215921,"children":215923},{"href":1623,"rel":215922},[214],[215924],{"type":23,"value":215334},{"type":23,"value":215336},{"title":7,"searchDepth":1629,"depth":1629,"links":215927},[215928,215929,215933,215934,215940,215941,215942],{"id":215431,"depth":1629,"text":215434},{"id":215465,"depth":1629,"text":215468,"children":215930},[215931,215932],{"id":9021,"depth":1635,"text":9024},{"id":9074,"depth":1635,"text":9077},{"id":9144,"depth":1629,"text":9147},{"id":215620,"depth":1629,"text":215623,"children":215935},[215936,215937,215938,215939],{"id":838,"depth":1635,"text":9978},{"id":215658,"depth":1635,"text":215661},{"id":215710,"depth":1635,"text":215713},{"id":215742,"depth":1635,"text":7324},{"id":215770,"depth":1629,"text":215773},{"id":215818,"depth":1629,"text":215821},{"id":45643,"depth":1629,"text":45646},"content:blog:which_unified_api_platform_supports_real_time_webhooks.md","blog/which_unified_api_platform_supports_real_time_webhooks.md","blog/which_unified_api_platform_supports_real_time_webhooks",{"_path":215947,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":215948,"description":215949,"img":215950,"date":215951,"tag":12,"body":215952,"_type":1677,"_id":216953,"_source":1679,"_file":216954,"_stem":216955,"_extension":1682},"/blog/january_2026_product_update","January 2026 product update","In January, we launched two new API categories (Forms and Shipping), expanded the Advertising API to full campaign write support, added customer-managed...","https://s3.us-east-2.amazonaws.com/unified-article-images/january_2026_product_update-icon.png","2026-01-29T17:23:00.000Z",{"type":14,"children":215953,"toc":216930},[215954,215959,215962,215970,216007,216013,216018,216023,216031,216058,216066,216150,216155,216161,216166,216176,216183,216194,216201,216231,216239,216261,216267,216278,216290,216296,216316,216321,216327,216350,216355,216361,216407,216416,216421,216491,216497,216503,216508,216513,216533,216538,216544,216549,216560,216572,216577,216583,216588,216596,216645,216650,216656,216662,216675,216714,216720,216725,216753,216759,216764,216769,216774,216780,216787,216795,216803,216816,216823,216836,216843,216861,216866,216906,216910,216915],{"type":17,"tag":18,"props":215955,"children":215957},{"id":215956},"january-2026-product-update",[215958],{"type":23,"value":215948},{"type":17,"tag":25,"props":215960,"children":215961},{},[],{"type":17,"tag":29,"props":215963,"children":215964},{},[215965],{"type":17,"tag":33,"props":215966,"children":215967},{},[215968],{"type":23,"value":215969},"January 29, 2026",{"type":17,"tag":29,"props":215971,"children":215972},{},[215973,215975,215980,215981,215986,215988,215994,215996,216000,216001,216005],{"type":23,"value":215974},"In January, we launched two new API categories (",{"type":17,"tag":133,"props":215976,"children":215978},{"href":39954,"rel":215977},[214],[215979],{"type":23,"value":114439},{"type":23,"value":34435},{"type":17,"tag":133,"props":215982,"children":215984},{"href":35384,"rel":215983},[214],[215985],{"type":23,"value":105949},{"type":23,"value":215987},"), expanded the ",{"type":17,"tag":133,"props":215989,"children":215991},{"href":18452,"rel":215990},[214],[215992],{"type":23,"value":215993},"Advertising",{"type":23,"value":215995}," API to full campaign write support, added customer-managed Secrets Manager and external logging integrations, and shipped dozens of improvements across ",{"type":17,"tag":133,"props":215997,"children":215998},{"href":4999},[215999],{"type":23,"value":5002},{"type":23,"value":11826},{"type":17,"tag":133,"props":216002,"children":216003},{"href":1857},[216004],{"type":23,"value":1860},{"type":23,"value":216006},", and writable fields.",{"type":17,"tag":68,"props":216008,"children":216010},{"id":216009},"new-api-category-shipping",[216011],{"type":23,"value":216012},"New API Category: Shipping",{"type":17,"tag":29,"props":216014,"children":216015},{},[216016],{"type":23,"value":216017},"Shipping platforms provide different APIs for shipments, labels, tracking, and rates. Unified normalizes these differences so you can build once and support multiple carriers.",{"type":17,"tag":29,"props":216019,"children":216020},{},[216021],{"type":23,"value":216022},"Shipping is rarely used in isolation—it typically sits alongside orders, payments, inventory, and fulfillment—where real-time status and pricing matter.",{"type":17,"tag":29,"props":216024,"children":216025},{},[216026],{"type":17,"tag":48,"props":216027,"children":216028},{},[216029],{"type":23,"value":216030},"Normalized objects",{"type":17,"tag":80,"props":216032,"children":216033},{},[216034,216039,216044,216048,216053],{"type":17,"tag":84,"props":216035,"children":216036},{},[216037],{"type":23,"value":216038},"Shipment",{"type":17,"tag":84,"props":216040,"children":216041},{},[216042],{"type":23,"value":216043},"Label",{"type":17,"tag":84,"props":216045,"children":216046},{},[216047],{"type":23,"value":35474},{"type":17,"tag":84,"props":216049,"children":216050},{},[216051],{"type":23,"value":216052},"Rate",{"type":17,"tag":84,"props":216054,"children":216055},{},[216056],{"type":23,"value":216057},"Carrier",{"type":17,"tag":29,"props":216059,"children":216060},{},[216061],{"type":17,"tag":48,"props":216062,"children":216063},{},[216064],{"type":23,"value":216065},"Supported platforms",{"type":17,"tag":80,"props":216067,"children":216068},{},[216069,216078,216087,216096,216105,216114,216123,216132,216141],{"type":17,"tag":84,"props":216070,"children":216071},{},[216072],{"type":17,"tag":133,"props":216073,"children":216076},{"href":216074,"rel":216075},"https://unified.to/integrations/canadapost",[214],[216077],{"type":23,"value":35441},{"type":17,"tag":84,"props":216079,"children":216080},{},[216081],{"type":17,"tag":133,"props":216082,"children":216085},{"href":216083,"rel":216084},"https://unified.to/integrations/dhl",[214],[216086],{"type":23,"value":34424},{"type":17,"tag":84,"props":216088,"children":216089},{},[216090],{"type":17,"tag":133,"props":216091,"children":216094},{"href":216092,"rel":216093},"https://unified.to/integrations/fedex",[214],[216095],{"type":23,"value":34400},{"type":17,"tag":84,"props":216097,"children":216098},{},[216099],{"type":17,"tag":133,"props":216100,"children":216103},{"href":216101,"rel":216102},"https://unified.to/integrations/ups",[214],[216104],{"type":23,"value":34408},{"type":17,"tag":84,"props":216106,"children":216107},{},[216108],{"type":17,"tag":133,"props":216109,"children":216112},{"href":216110,"rel":216111},"https://unified.to/integrations/usps",[214],[216113],{"type":23,"value":34416},{"type":17,"tag":84,"props":216115,"children":216116},{},[216117],{"type":17,"tag":133,"props":216118,"children":216121},{"href":216119,"rel":216120},"https://unified.to/integrations/sendcloud",[214],[216122],{"type":23,"value":35436},{"type":17,"tag":84,"props":216124,"children":216125},{},[216126],{"type":17,"tag":133,"props":216127,"children":216130},{"href":216128,"rel":216129},"https://unified.to/integrations/easypost",[214],[216131],{"type":23,"value":35431},{"type":17,"tag":84,"props":216133,"children":216134},{},[216135],{"type":17,"tag":133,"props":216136,"children":216139},{"href":216137,"rel":216138},"https://unified.to/integrations/shippo",[214],[216140],{"type":23,"value":34433},{"type":17,"tag":84,"props":216142,"children":216143},{},[216144],{"type":17,"tag":133,"props":216145,"children":216148},{"href":216146,"rel":216147},"https://unified.to/integrations/shipstation",[214],[216149],{"type":23,"value":34442},{"type":17,"tag":29,"props":216151,"children":216152},{},[216153],{"type":23,"value":216154},"All requests are real-time and passthrough—no cached shipment or tracking data.",{"type":17,"tag":68,"props":216156,"children":216158},{"id":216157},"new-api-category-forms",[216159],{"type":23,"value":216160},"New API Category: Forms",{"type":17,"tag":29,"props":216162,"children":216163},{},[216164],{"type":23,"value":216165},"Supporting multiple form providers quickly turns into repetitive integration work.",{"type":17,"tag":29,"props":216167,"children":216168},{},[216169,216170,216174],{"type":23,"value":149272},{"type":17,"tag":133,"props":216171,"children":216172},{"href":39304},[216173],{"type":23,"value":114951},{"type":23,"value":216175}," provides a single, normalized interface for accessing form definitions and submissions across providers—without vendor-specific logic.",{"type":17,"tag":29,"props":216177,"children":216178},{},[216179],{"type":17,"tag":48,"props":216180,"children":216181},{},[216182],{"type":23,"value":216030},{"type":17,"tag":80,"props":216184,"children":216185},{},[216186,216190],{"type":17,"tag":84,"props":216187,"children":216188},{},[216189],{"type":23,"value":40001},{"type":17,"tag":84,"props":216191,"children":216192},{},[216193],{"type":23,"value":40044},{"type":17,"tag":29,"props":216195,"children":216196},{},[216197],{"type":17,"tag":48,"props":216198,"children":216199},{},[216200],{"type":23,"value":216065},{"type":17,"tag":80,"props":216202,"children":216203},{},[216204,216213,216222],{"type":17,"tag":84,"props":216205,"children":216206},{},[216207],{"type":17,"tag":133,"props":216208,"children":216211},{"href":216209,"rel":216210},"https://unified.to/integrations/googleforms",[214],[216212],{"type":23,"value":39973},{"type":17,"tag":84,"props":216214,"children":216215},{},[216216],{"type":17,"tag":133,"props":216217,"children":216220},{"href":216218,"rel":216219},"https://unified.to/integrations/typeform",[214],[216221],{"type":23,"value":39982},{"type":17,"tag":84,"props":216223,"children":216224},{},[216225],{"type":17,"tag":133,"props":216226,"children":216229},{"href":216227,"rel":216228},"https://unified.to/integrations/tally",[214],[216230],{"type":23,"value":39623},{"type":17,"tag":29,"props":216232,"children":216233},{},[216234],{"type":17,"tag":48,"props":216235,"children":216236},{},[216237],{"type":23,"value":216238},"Built for",{"type":17,"tag":80,"props":216240,"children":216241},{},[216242,216246,216251,216256],{"type":17,"tag":84,"props":216243,"children":216244},{},[216245],{"type":23,"value":39434},{"type":17,"tag":84,"props":216247,"children":216248},{},[216249],{"type":23,"value":216250},"Survey and feedback ingestion",{"type":17,"tag":84,"props":216252,"children":216253},{},[216254],{"type":23,"value":216255},"Submission-triggered automation",{"type":17,"tag":84,"props":216257,"children":216258},{},[216259],{"type":23,"value":216260},"Analytics and AI workflows on structured input",{"type":17,"tag":68,"props":216262,"children":216264},{"id":216263},"advertising-api-expanded-to-full-write-support",[216265],{"type":23,"value":216266},"Advertising API — Expanded to Full Write Support",{"type":17,"tag":29,"props":216268,"children":216269},{},[216270,216272,216277],{"type":23,"value":216271},"January completed the transition from ",{"type":17,"tag":48,"props":216273,"children":216274},{},[216275],{"type":23,"value":216276},"read-only advertising access to full campaign management",{"type":23,"value":54},{"type":17,"tag":29,"props":216279,"children":216280},{},[216281,216283,216288],{"type":23,"value":216282},"Unified Advertising now supports ",{"type":17,"tag":48,"props":216284,"children":216285},{},[216286],{"type":23,"value":216287},"create, update, and remove",{"type":23,"value":216289}," operations across campaigns, groups, ads, and creatives—so teams can manage advertising workflows directly from their product.",{"type":17,"tag":239,"props":216291,"children":216293},{"id":216292},"whats-now-writable",[216294],{"type":23,"value":216295},"What's now writable",{"type":17,"tag":80,"props":216297,"children":216298},{},[216299,216303,216308,216312],{"type":17,"tag":84,"props":216300,"children":216301},{},[216302],{"type":23,"value":18610},{"type":17,"tag":84,"props":216304,"children":216305},{},[216306],{"type":23,"value":216307},"Group (Ad Group)",{"type":17,"tag":84,"props":216309,"children":216310},{},[216311],{"type":23,"value":18636},{"type":17,"tag":84,"props":216313,"children":216314},{},[216315],{"type":23,"value":18641},{"type":17,"tag":29,"props":216317,"children":216318},{},[216319],{"type":23,"value":216320},"Across all supported advertising platforms.",{"type":17,"tag":239,"props":216322,"children":216324},{"id":216323},"what-this-unlocks",[216325],{"type":23,"value":216326},"What this unlocks",{"type":17,"tag":80,"props":216328,"children":216329},{},[216330,216335,216340,216345],{"type":17,"tag":84,"props":216331,"children":216332},{},[216333],{"type":23,"value":216334},"Launch campaigns programmatically",{"type":17,"tag":84,"props":216336,"children":216337},{},[216338],{"type":23,"value":216339},"Update budgets, schedules, targeting, and creatives",{"type":17,"tag":84,"props":216341,"children":216342},{},[216343],{"type":23,"value":216344},"Pause or terminate live campaigns",{"type":17,"tag":84,"props":216346,"children":216347},{},[216348],{"type":23,"value":216349},"Build closed-loop workflows that combine reporting and action",{"type":17,"tag":29,"props":216351,"children":216352},{},[216353],{"type":23,"value":216354},"No vendor-specific payloads. No per-platform logic.",{"type":17,"tag":239,"props":216356,"children":216358},{"id":216357},"webhooks-and-field-coverage",[216359],{"type":23,"value":216360},"Webhooks and field coverage",{"type":17,"tag":80,"props":216362,"children":216363},{},[216364,216375],{"type":17,"tag":84,"props":216365,"children":216366},{},[216367,216369,216373],{"type":23,"value":216368},"Added created/updated virtual webhooks for ",{"type":17,"tag":48,"props":216370,"children":216371},{},[216372],{"type":23,"value":18641},{"type":23,"value":216374}," (Meta Ads)",{"type":17,"tag":84,"props":216376,"children":216377},{},[216378,216380],{"type":23,"value":216379},"Expanded readable and writable fields across Campaign, Group, and Ad:\n",{"type":17,"tag":80,"props":216381,"children":216382},{},[216383,216387,216392,216397,216402],{"type":17,"tag":84,"props":216384,"children":216385},{},[216386],{"type":23,"value":19949},{"type":17,"tag":84,"props":216388,"children":216389},{},[216390],{"type":23,"value":216391},"budgets and pacing",{"type":17,"tag":84,"props":216393,"children":216394},{},[216395],{"type":23,"value":216396},"scheduling windows",{"type":17,"tag":84,"props":216398,"children":216399},{},[216400],{"type":23,"value":216401},"targeting (where supported)",{"type":17,"tag":84,"props":216403,"children":216404},{},[216405],{"type":23,"value":216406},"creative linking",{"type":17,"tag":29,"props":216408,"children":216409},{},[216410],{"type":17,"tag":133,"props":216411,"children":216413},{"href":18452,"rel":216412},[214],[216414],{"type":23,"value":216415},"All advertising integrations →",{"type":17,"tag":68,"props":216417,"children":216418},{"id":11629},[216419],{"type":23,"value":216420},"New Integrations",{"type":17,"tag":80,"props":216422,"children":216423},{},[216424,216434,216443,216453,216462,216472,216482],{"type":17,"tag":84,"props":216425,"children":216426},{},[216427],{"type":17,"tag":133,"props":216428,"children":216431},{"href":216429,"rel":216430},"https://unified.to/integrations/peoplehr",[214],[216432],{"type":23,"value":216433},"PeopleHR",{"type":17,"tag":84,"props":216435,"children":216436},{},[216437],{"type":17,"tag":133,"props":216438,"children":216441},{"href":216439,"rel":216440},"https://unified.to/integrations/harri",[214],[216442],{"type":23,"value":57970},{"type":17,"tag":84,"props":216444,"children":216445},{},[216446],{"type":17,"tag":133,"props":216447,"children":216450},{"href":216448,"rel":216449},"https://unified.to/integrations/goco",[214],[216451],{"type":23,"value":216452},"Intuit GoCo",{"type":17,"tag":84,"props":216454,"children":216455},{},[216456],{"type":17,"tag":133,"props":216457,"children":216460},{"href":216458,"rel":216459},"https://unified.to/integrations/quo",[214],[216461],{"type":23,"value":31586},{"type":17,"tag":84,"props":216463,"children":216464},{},[216465],{"type":17,"tag":133,"props":216466,"children":216469},{"href":216467,"rel":216468},"https://unified.to/integrations/wealthbox",[214],[216470],{"type":23,"value":216471},"Wealthbox",{"type":17,"tag":84,"props":216473,"children":216474},{},[216475],{"type":17,"tag":133,"props":216476,"children":216479},{"href":216477,"rel":216478},"https://unified.to/integrations/concur",[214],[216480],{"type":23,"value":216481},"Concur",{"type":17,"tag":84,"props":216483,"children":216484},{},[216485],{"type":17,"tag":133,"props":216486,"children":216489},{"href":216487,"rel":216488},"https://unified.to/integrations/zoomcalendar",[214],[216490],{"type":23,"value":118105},{"type":17,"tag":68,"props":216492,"children":216494},{"id":216493},"security-observability-enhancements",[216495],{"type":23,"value":216496},"Security & Observability Enhancements",{"type":17,"tag":239,"props":216498,"children":216500},{"id":216499},"secrets-manager-expanded-options",[216501],{"type":23,"value":216502},"Secrets Manager — Expanded Options",{"type":17,"tag":29,"props":216504,"children":216505},{},[216506],{"type":23,"value":216507},"Unified expanded Secrets Manager support, giving customers full control over where API credentials and OAuth tokens are stored.",{"type":17,"tag":29,"props":216509,"children":216510},{},[216511],{"type":23,"value":216512},"Now supported:",{"type":17,"tag":80,"props":216514,"children":216515},{},[216516,216520,216524,216529],{"type":17,"tag":84,"props":216517,"children":216518},{},[216519],{"type":23,"value":764},{"type":17,"tag":84,"props":216521,"children":216522},{},[216523],{"type":23,"value":214903},{"type":17,"tag":84,"props":216525,"children":216526},{},[216527],{"type":23,"value":216528},"Google Secret Manager",{"type":17,"tag":84,"props":216530,"children":216531},{},[216532],{"type":23,"value":77646},{"type":17,"tag":29,"props":216534,"children":216535},{},[216536],{"type":23,"value":216537},"This enables per-environment and per-customer credential isolation, without storing secrets in Unified.",{"type":17,"tag":239,"props":216539,"children":216541},{"id":216540},"external-logging-expanded-destinations",[216542],{"type":23,"value":216543},"External Logging — Expanded Destinations",{"type":17,"tag":29,"props":216545,"children":216546},{},[216547],{"type":23,"value":216548},"External logging support has been expanded.",{"type":17,"tag":29,"props":216550,"children":216551},{},[216552,216554,216559],{"type":23,"value":216553},"In addition to Datadog, detailed API logs can now be ",{"type":17,"tag":48,"props":216555,"children":216556},{},[216557],{"type":23,"value":216558},"sent directly to",{"type":23,"value":20456},{"type":17,"tag":80,"props":216561,"children":216562},{},[216563,216567],{"type":17,"tag":84,"props":216564,"children":216565},{},[216566],{"type":23,"value":870},{"type":17,"tag":84,"props":216568,"children":216569},{},[216570],{"type":23,"value":216571},"ClickHouse",{"type":17,"tag":29,"props":216573,"children":216574},{},[216575],{"type":23,"value":216576},"Sensitive request data stays in customer-controlled infrastructure. Unified retains only minimal operational logs.",{"type":17,"tag":68,"props":216578,"children":216580},{"id":216579},"webhooks-and-pagination-improvements",[216581],{"type":23,"value":216582},"Webhooks and Pagination Improvements",{"type":17,"tag":29,"props":216584,"children":216585},{},[216586],{"type":23,"value":216587},"We continued expanding real-time event coverage across CRM, HR, and commerce systems.",{"type":17,"tag":29,"props":216589,"children":216590},{},[216591],{"type":17,"tag":48,"props":216592,"children":216593},{},[216594],{"type":23,"value":216595},"Highlights",{"type":17,"tag":80,"props":216597,"children":216598},{},[216599,216604,216609],{"type":17,"tag":84,"props":216600,"children":216601},{},[216602],{"type":23,"value":216603},"Created/updated virtual webhooks added across CRM, HR, and Shipping",{"type":17,"tag":84,"props":216605,"children":216606},{},[216607],{"type":23,"value":216608},"Pagination controls expanded across high-volume objects",{"type":17,"tag":84,"props":216610,"children":216611},{},[216612,216614],{"type":23,"value":216613},"New object coverage and webhook support in platforms including:\n",{"type":17,"tag":80,"props":216615,"children":216616},{},[216617,216621,216625,216629,216633,216637,216641],{"type":17,"tag":84,"props":216618,"children":216619},{},[216620],{"type":23,"value":61644},{"type":17,"tag":84,"props":216622,"children":216623},{},[216624],{"type":23,"value":12551},{"type":17,"tag":84,"props":216626,"children":216627},{},[216628],{"type":23,"value":13006},{"type":17,"tag":84,"props":216630,"children":216631},{},[216632],{"type":23,"value":37435},{"type":17,"tag":84,"props":216634,"children":216635},{},[216636],{"type":23,"value":13060},{"type":17,"tag":84,"props":216638,"children":216639},{},[216640],{"type":23,"value":216471},{"type":17,"tag":84,"props":216642,"children":216643},{},[216644],{"type":23,"value":34442},{"type":17,"tag":29,"props":216646,"children":216647},{},[216648],{"type":23,"value":216649},"These improvements reduce polling, improve freshness, and support event-driven workflows.",{"type":17,"tag":68,"props":216651,"children":216653},{"id":216652},"hr-directory-enhancements",[216654],{"type":23,"value":216655},"HR & Directory Enhancements",{"type":17,"tag":239,"props":216657,"children":216659},{"id":216658},"termination-reason-coverage",[216660],{"type":23,"value":216661},"Termination reason coverage",{"type":17,"tag":29,"props":216663,"children":216664},{},[216665,216667,216673],{"type":23,"value":216666},"Added readable ",{"type":17,"tag":6121,"props":216668,"children":216670},{"className":216669},[],[216671],{"type":23,"value":216672},"termination_reason",{"type":23,"value":216674}," across:",{"type":17,"tag":80,"props":216676,"children":216677},{},[216678,216683,216688,216692,216696,216700,216705,216709],{"type":17,"tag":84,"props":216679,"children":216680},{},[216681],{"type":23,"value":216682},"UKG Pro HCM",{"type":17,"tag":84,"props":216684,"children":216685},{},[216686],{"type":23,"value":216687},"PrismHR",{"type":17,"tag":84,"props":216689,"children":216690},{},[216691],{"type":23,"value":58983},{"type":17,"tag":84,"props":216693,"children":216694},{},[216695],{"type":23,"value":60913},{"type":17,"tag":84,"props":216697,"children":216698},{},[216699],{"type":23,"value":60903},{"type":17,"tag":84,"props":216701,"children":216702},{},[216703],{"type":23,"value":216704},"Humi",{"type":17,"tag":84,"props":216706,"children":216707},{},[216708],{"type":23,"value":57802},{"type":17,"tag":84,"props":216710,"children":216711},{},[216712],{"type":23,"value":216713},"Employment Hero Payroll",{"type":17,"tag":239,"props":216715,"children":216717},{"id":216716},"workday-legacy-expansion",[216718],{"type":23,"value":216719},"Workday (Legacy) expansion",{"type":17,"tag":29,"props":216721,"children":216722},{},[216723],{"type":23,"value":216724},"New objects added with list/get/create support where applicable:",{"type":17,"tag":80,"props":216726,"children":216727},{},[216728,216732,216736,216740,216744,216749],{"type":17,"tag":84,"props":216729,"children":216730},{},[216731],{"type":23,"value":33999},{"type":17,"tag":84,"props":216733,"children":216734},{},[216735],{"type":23,"value":25846},{"type":17,"tag":84,"props":216737,"children":216738},{},[216739],{"type":23,"value":19564},{"type":17,"tag":84,"props":216741,"children":216742},{},[216743],{"type":23,"value":198639},{"type":17,"tag":84,"props":216745,"children":216746},{},[216747],{"type":23,"value":216748},"Timeoff",{"type":17,"tag":84,"props":216750,"children":216751},{},[216752],{"type":23,"value":18623},{"type":17,"tag":68,"props":216754,"children":216756},{"id":216755},"crm-pipeline-normalization",[216757],{"type":23,"value":216758},"CRM Pipeline Normalization",{"type":17,"tag":29,"props":216760,"children":216761},{},[216762],{"type":23,"value":216763},"Expanded pipeline and stage support across Deal objects so teams can build consistent forecasting and workflow logic across CRMs.",{"type":17,"tag":29,"props":216765,"children":216766},{},[216767],{"type":23,"value":216768},"Readable and writable support added across:",{"type":17,"tag":29,"props":216770,"children":216771},{},[216772],{"type":23,"value":216773},"Zoho CRM, Salesforce, HubSpot, Pipedrive, Insightly, Apollo.io, Attio, HighLevel, Bullhorn, and others.",{"type":17,"tag":68,"props":216775,"children":216777},{"id":216776},"commerce-accounting-enhancements",[216778],{"type":23,"value":216779},"Commerce & Accounting Enhancements",{"type":17,"tag":29,"props":216781,"children":216782},{},[216783],{"type":17,"tag":48,"props":216784,"children":216785},{},[216786],{"type":23,"value":26548},{"type":17,"tag":80,"props":216788,"children":216789},{},[216790],{"type":17,"tag":84,"props":216791,"children":216792},{},[216793],{"type":23,"value":216794},"Expanded Invoice and Contact field coverage",{"type":17,"tag":29,"props":216796,"children":216797},{},[216798],{"type":17,"tag":48,"props":216799,"children":216800},{},[216801],{"type":23,"value":216802},"Microsoft Dynamics 365 Business Central",{"type":17,"tag":80,"props":216804,"children":216805},{},[216806,216811],{"type":17,"tag":84,"props":216807,"children":216808},{},[216809],{"type":23,"value":216810},"Added Bill, Salesorder, Purchaseorder (full CRUD)",{"type":17,"tag":84,"props":216812,"children":216813},{},[216814],{"type":23,"value":216815},"Expanded Invoice fields and pagination",{"type":17,"tag":29,"props":216817,"children":216818},{},[216819],{"type":17,"tag":48,"props":216820,"children":216821},{},[216822],{"type":23,"value":13070},{"type":17,"tag":80,"props":216824,"children":216825},{},[216826,216831],{"type":17,"tag":84,"props":216827,"children":216828},{},[216829],{"type":23,"value":216830},"Added Shipment and Tracking objects",{"type":17,"tag":84,"props":216832,"children":216833},{},[216834],{"type":23,"value":216835},"Expanded list/get/create/update support",{"type":17,"tag":29,"props":216837,"children":216838},{},[216839],{"type":17,"tag":48,"props":216840,"children":216841},{},[216842],{"type":23,"value":39982},{"type":17,"tag":80,"props":216844,"children":216845},{},[216846,216851,216856],{"type":17,"tag":84,"props":216847,"children":216848},{},[216849],{"type":23,"value":216850},"Added Form and Submission objects",{"type":17,"tag":84,"props":216852,"children":216853},{},[216854],{"type":23,"value":216855},"Added Submission native webhooks",{"type":17,"tag":84,"props":216857,"children":216858},{},[216859],{"type":23,"value":216860},"Added Form virtual webhooks",{"type":17,"tag":68,"props":216862,"children":216863},{"id":120936},[216864],{"type":23,"value":216865},"From the Blog",{"type":17,"tag":80,"props":216867,"children":216868},{},[216869,216882,216895],{"type":17,"tag":84,"props":216870,"children":216871},{},[216872],{"type":17,"tag":133,"props":216873,"children":216876},{"href":216874,"rel":216875},"https://unified.to/blog/how_to_use_postman_with_unified",[214],[216877],{"type":17,"tag":48,"props":216878,"children":216879},{},[216880],{"type":23,"value":216881},"How to Use Postman with Unified.to",{"type":17,"tag":84,"props":216883,"children":216884},{},[216885],{"type":17,"tag":133,"props":216886,"children":216889},{"href":216887,"rel":216888},"https://unified.to/blog/how_to_use_supabase_with_unified",[214],[216890],{"type":17,"tag":48,"props":216891,"children":216892},{},[216893],{"type":23,"value":216894},"How to Use Supabase with Unified.to",{"type":17,"tag":84,"props":216896,"children":216897},{},[216898],{"type":17,"tag":133,"props":216899,"children":216901},{"href":121220,"rel":216900},[214],[216902],{"type":17,"tag":48,"props":216903,"children":216904},{},[216905],{"type":23,"value":121224},{"type":17,"tag":68,"props":216907,"children":216908},{"id":2316},[216909],{"type":23,"value":2319},{"type":17,"tag":29,"props":216911,"children":216912},{},[216913],{"type":23,"value":216914},"Two new API categories, full write support for Advertising, customer-controlled secrets, expanded logging, and continued investment in webhooks and pagination—so teams can ship real workflows, not just integrations.",{"type":17,"tag":29,"props":216916,"children":216917},{},[216918,216923,216924,216929],{"type":17,"tag":133,"props":216919,"children":216921},{"href":158861,"rel":216920},[214],[216922],{"type":23,"value":215326},{"type":23,"value":75890},{"type":17,"tag":133,"props":216925,"children":216927},{"href":215330,"rel":216926},[214],[216928],{"type":23,"value":215334},{"type":23,"value":215336},{"title":7,"searchDepth":1629,"depth":1629,"links":216931},[216932,216933,216934,216939,216940,216944,216945,216949,216950,216951,216952],{"id":216009,"depth":1629,"text":216012},{"id":216157,"depth":1629,"text":216160},{"id":216263,"depth":1629,"text":216266,"children":216935},[216936,216937,216938],{"id":216292,"depth":1635,"text":216295},{"id":216323,"depth":1635,"text":216326},{"id":216357,"depth":1635,"text":216360},{"id":11629,"depth":1629,"text":216420},{"id":216493,"depth":1629,"text":216496,"children":216941},[216942,216943],{"id":216499,"depth":1635,"text":216502},{"id":216540,"depth":1635,"text":216543},{"id":216579,"depth":1629,"text":216582},{"id":216652,"depth":1629,"text":216655,"children":216946},[216947,216948],{"id":216658,"depth":1635,"text":216661},{"id":216716,"depth":1635,"text":216719},{"id":216755,"depth":1629,"text":216758},{"id":216776,"depth":1629,"text":216779},{"id":120936,"depth":1629,"text":216865},{"id":2316,"depth":1629,"text":2319},"content:blog:january_2026_product_update.md","blog/january_2026_product_update.md","blog/january_2026_product_update",{"_path":216957,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":216958,"description":216959,"img":216960,"date":216961,"tag":12,"body":216962,"_type":1677,"_id":217342,"_source":1679,"_file":217343,"_stem":217344,"_extension":1682},"/blog/api_solutions_for_real_time_event_sync_across_chat_storage_and_databases","API Solutions for Real-Time Event Sync Across Chat, Storage, and Databases","For SaaS teams building AI-native products or automation-heavy workflows, real-time access to customer events isn't optional—it's the difference between fresh...","https://s3.us-east-2.amazonaws.com/unified-article-images/api_solutions_for_real_time_event_sync_across_chat_storage_and_databases-icon.png","2026-01-22T22:24:00.000Z",{"type":14,"children":216963,"toc":217332},[216964,216969,216972,216980,216985,216990,216996,217001,217019,217024,217030,217049,217055,217082,217088,217093,217111,217123,217129,217134,217140,217180,217185,217191,217205,217210,217215,217248,217253,217259,217312,217317],{"type":17,"tag":18,"props":216965,"children":216967},{"id":216966},"api-solutions-for-real-time-event-sync-across-chat-storage-and-databases",[216968],{"type":23,"value":216958},{"type":17,"tag":25,"props":216970,"children":216971},{},[],{"type":17,"tag":29,"props":216973,"children":216974},{},[216975],{"type":17,"tag":33,"props":216976,"children":216977},{},[216978],{"type":23,"value":216979},"January 22, 2026",{"type":17,"tag":29,"props":216981,"children":216982},{},[216983],{"type":23,"value":216984},"For SaaS teams building AI-native products or automation-heavy workflows, real-time access to customer events isn't optional—it's the difference between fresh intelligence and stale delays. Whether you're syncing Slack messages into a dashboard, triggering workflows from new Google Drive files, or pushing database changes into downstream tools, the architecture you choose defines your latency, cost, and reliability ceiling.",{"type":17,"tag":29,"props":216986,"children":216987},{},[216988],{"type":23,"value":216989},"This post breaks down how Unified's real-time infrastructure helps product teams ship event-driven features faster—without building polling logic, managing token refreshes, or interpreting dozens of third-party APIs. If you're evaluating how to sync events from chat, storage, or database tools, this is your technical primer.",{"type":17,"tag":239,"props":216991,"children":216993},{"id":216992},"why-real-time-sync-is-hard-and-often-misunderstood",[216994],{"type":23,"value":216995},"Why Real-Time Sync Is Hard (And Often Misunderstood)",{"type":17,"tag":29,"props":216997,"children":216998},{},[216999],{"type":23,"value":217000},"\"Real-time\" is often misused. Most platforms claiming real-time sync are masking polling jobs that run every few minutes. That's fine for reporting or low-volume data movement, but it fails for:",{"type":17,"tag":80,"props":217002,"children":217003},{},[217004,217009,217014],{"type":17,"tag":84,"props":217005,"children":217006},{},[217007],{"type":23,"value":217008},"powering product notifications",{"type":17,"tag":84,"props":217010,"children":217011},{},[217012],{"type":23,"value":217013},"syncing files to internal tools instantly",{"type":17,"tag":84,"props":217015,"children":217016},{},[217017],{"type":23,"value":217018},"embedding messages or rows into AI agents",{"type":17,"tag":29,"props":217020,"children":217021},{},[217022],{"type":23,"value":217023},"If your integration relies on polling, you're either overloading third-party APIs or you're behind. Worse: many platforms batch and cache data in the name of simplicity—which means your product sees what's convenient, not what's current.",{"type":17,"tag":239,"props":217025,"children":217027},{"id":217026},"unified-how-real-time-actually-works",[217028],{"type":23,"value":217029},"Unified: How Real-Time Actually Works",{"type":17,"tag":29,"props":217031,"children":217032},{},[217033,217035,217039,217041,217047],{"type":23,"value":217034},"Unified is a ",{"type":17,"tag":133,"props":217036,"children":217037},{"href":7691},[217038],{"type":23,"value":7459},{"type":23,"value":217040}," platform with a real-time passthrough architecture. Instead of polling on your behalf and syncing to a local copy, Unified fetches data live from the source every time. Combined with ",{"type":17,"tag":133,"props":217042,"children":217045},{"href":217043,"rel":217044},"https://docs.unified.to/guides/unlock_real_time_data_with_virtual_webhooks#unlock-real-time-data-with-virtual-webhooks",[214],[217046],{"type":23,"value":46572},{"type":23,"value":217048},", this architecture guarantees you get fresh data—even from systems that don't support push.",{"type":17,"tag":239,"props":217050,"children":217052},{"id":217051},"built-in-virtual-webhooks",[217053],{"type":23,"value":217054},"Built-in Virtual Webhooks",{"type":17,"tag":29,"props":217056,"children":217057},{},[217058,217060,217064,217066,217071,217073,217080],{"type":23,"value":217059},"Most SaaS tools don't support native ",{"type":17,"tag":133,"props":217061,"children":217062},{"href":4999},[217063],{"type":23,"value":5002},{"type":23,"value":217065},". Unified makes that irrelevant. You subscribe to an event once (e.g. ",{"type":17,"tag":6121,"props":217067,"children":217069},{"className":217068},[],[217070],{"type":23,"value":34129},{"type":23,"value":217072},"), and Unified delivers those events in real time—via ",{"type":17,"tag":133,"props":217074,"children":217077},{"href":217075,"rel":217076},"https://docs.unified.to/concepts/virtual_webhooks#virtual-vs-native-webhooks-comparison",[214],[217078],{"type":23,"value":217079},"native webhook",{"type":23,"value":217081}," if available, or virtual polling behind the scenes. No code changes required.",{"type":17,"tag":239,"props":217083,"children":217085},{"id":217084},"unified-auth-sdks",[217086],{"type":23,"value":217087},"Unified Auth & SDKs",{"type":17,"tag":29,"props":217089,"children":217090},{},[217091],{"type":23,"value":217092},"You can go from zero to working integration in a day:",{"type":17,"tag":80,"props":217094,"children":217095},{},[217096,217101,217106],{"type":17,"tag":84,"props":217097,"children":217098},{},[217099],{"type":23,"value":217100},"Drop in prebuilt React/Vue/Angular auth components",{"type":17,"tag":84,"props":217102,"children":217103},{},[217104],{"type":23,"value":217105},"Use SDKs in TypeScript, Python, Go, Java, PHP, C#, or Ruby",{"type":17,"tag":84,"props":217107,"children":217108},{},[217109],{"type":23,"value":217110},"Debug with sandbox data and inspect webhook payloads in logs",{"type":17,"tag":29,"props":217112,"children":217113},{},[217114,217121],{"type":17,"tag":133,"props":217115,"children":217118},{"href":217116,"rel":217117},"https://docs.unified.to/guides/understanding_oauth2_authorization_flows#understanding-oauth2-authorization-flows",[214],[217119],{"type":23,"value":217120},"OAuth2",{"type":23,"value":217122},", token refresh, rate limiting, and retries are fully managed.",{"type":17,"tag":239,"props":217124,"children":217126},{"id":217125},"test-locally-launch-in-days",[217127],{"type":23,"value":217128},"Test Locally, Launch in Days",{"type":17,"tag":29,"props":217130,"children":217131},{},[217132],{"type":23,"value":217133},"Unified includes a mock API server and sample payloads so PMs and devs can simulate real-world flows before connecting live accounts. Most teams go live in under 5 days.",{"type":17,"tag":239,"props":217135,"children":217137},{"id":217136},"example-slack-dashboard-sync",[217138],{"type":23,"value":217139},"Example: Slack → Dashboard Sync",{"type":17,"tag":6154,"props":217141,"children":217142},{},[217143,217148,217159,217170,217175],{"type":17,"tag":84,"props":217144,"children":217145},{},[217146],{"type":23,"value":217147},"Enable the Slack integration in Unified's admin dashboard",{"type":17,"tag":84,"props":217149,"children":217150},{},[217151,217153,217157],{"type":23,"value":217152},"Embed Unified's ",{"type":17,"tag":133,"props":217154,"children":217155},{"href":779},[217156],{"type":23,"value":782},{"type":23,"value":217158}," component to let customers connect their Slack workspace",{"type":17,"tag":84,"props":217160,"children":217161},{},[217162,217163,217168],{"type":23,"value":162920},{"type":17,"tag":6121,"props":217164,"children":217166},{"className":217165},[],[217167],{"type":23,"value":34129},{"type":23,"value":217169}," events and configure your webhook destination",{"type":17,"tag":84,"props":217171,"children":217172},{},[217173],{"type":23,"value":217174},"Unified manages OAuth scopes, token refresh, retries, and deduplication",{"type":17,"tag":84,"props":217176,"children":217177},{},[217178],{"type":23,"value":217179},"Your system receives real-time, normalized message payloads—no polling required",{"type":17,"tag":29,"props":217181,"children":217182},{},[217183],{"type":23,"value":217184},"If Slack lacked native webhook support, Unified would simulate push via virtual webhooks (internally polling for changes, emitting only when data changes). You still receive a real-time event.",{"type":17,"tag":239,"props":217186,"children":217188},{"id":217187},"bonus-powering-ai-workflows-with-mcp",[217189],{"type":23,"value":217190},"Bonus: Powering AI Workflows with MCP",{"type":17,"tag":29,"props":217192,"children":217193},{},[217194,217196,217203],{"type":23,"value":217195},"If you're building AI-native features, ",{"type":17,"tag":133,"props":217197,"children":217200},{"href":217198,"rel":217199},"https://docs.unified.to/mcp/overview",[214],[217201],{"type":23,"value":217202},"Unified's MCP Server",{"type":23,"value":217204}," (Model Context Protocol) lets LLM agents access and act on live customer data.",{"type":17,"tag":29,"props":217206,"children":217207},{},[217208],{"type":23,"value":217209},"MCP gives you a single interface to safely route agent-initiated actions—like reading a Slack message, creating a CRM note, or fetching a document—using the same authorization and audit controls you already use with Unified.",{"type":17,"tag":29,"props":217211,"children":217212},{},[217213],{"type":23,"value":217214},"Example use cases:",{"type":17,"tag":80,"props":217216,"children":217217},{},[217218,217223,217228],{"type":17,"tag":84,"props":217219,"children":217220},{},[217221],{"type":23,"value":217222},"Let a GPT agent search recent Slack messages about a customer before replying",{"type":17,"tag":84,"props":217224,"children":217225},{},[217226],{"type":23,"value":217227},"Let a Claude agent fetch a contract from Google Drive based on a deal stage",{"type":17,"tag":84,"props":217229,"children":217230},{},[217231,217233,217239,217240,217246],{"type":23,"value":217232},"Let an internal RAG workflow call ",{"type":17,"tag":6121,"props":217234,"children":217236},{"className":217235},[],[217237],{"type":23,"value":217238},"GET /candidate",{"type":23,"value":75890},{"type":17,"tag":6121,"props":217241,"children":217243},{"className":217242},[],[217244],{"type":23,"value":217245},"POST /note",{"type":23,"value":217247}," with only the fields your compliance team allows",{"type":17,"tag":29,"props":217249,"children":217250},{},[217251],{"type":23,"value":217252},"MCP gives you a single interface to share secure tools across categories (chat, storage, CRM, HR) with built-in auth, rate limits, and safety rails. The result: you can build smarter agents without hardcoding integration logic—or exposing data you shouldn't.",{"type":17,"tag":239,"props":217254,"children":217256},{"id":217255},"takeaways-for-pms",[217257],{"type":23,"value":217258},"Takeaways for PMs",{"type":17,"tag":80,"props":217260,"children":217261},{},[217262,217272,217282,217292,217302],{"type":17,"tag":84,"props":217263,"children":217264},{},[217265,217270],{"type":17,"tag":48,"props":217266,"children":217267},{},[217268],{"type":23,"value":217269},"Zero polling logic:",{"type":23,"value":217271}," Subscribe once, Unified handles event delivery",{"type":17,"tag":84,"props":217273,"children":217274},{},[217275,217280],{"type":17,"tag":48,"props":217276,"children":217277},{},[217278],{"type":23,"value":217279},"Consistent schemas:",{"type":23,"value":217281}," One payload format across vendors (e.g. Google Drive, Dropbox, OneDrive)",{"type":17,"tag":84,"props":217283,"children":217284},{},[217285,217290],{"type":17,"tag":48,"props":217286,"children":217287},{},[217288],{"type":23,"value":217289},"Fast go-live:",{"type":23,"value":217291}," Use prebuilt auth flows, mock servers, and test data",{"type":17,"tag":84,"props":217293,"children":217294},{},[217295,217300],{"type":17,"tag":48,"props":217296,"children":217297},{},[217298],{"type":23,"value":217299},"No stale data:",{"type":23,"value":217301}," Events come direct from the source—no cached syncs",{"type":17,"tag":84,"props":217303,"children":217304},{},[217305,217310],{"type":17,"tag":48,"props":217306,"children":217307},{},[217308],{"type":23,"value":217309},"AI-ready:",{"type":23,"value":217311}," MCP lets agents call real-time integration functions safely",{"type":17,"tag":29,"props":217313,"children":217314},{},[217315],{"type":23,"value":217316},"If you're tired of building brittle polling jobs or struggling with stale ETL data, it's time to try an integration layer that was built post-AI. Unified gets you to real-time, fast—no vendor docs required.",{"type":17,"tag":29,"props":217318,"children":217319},{},[217320,217325,217326,217331],{"type":17,"tag":133,"props":217321,"children":217323},{"href":158861,"rel":217322},[214],[217324],{"type":23,"value":215326},{"type":23,"value":75890},{"type":17,"tag":133,"props":217327,"children":217329},{"href":215330,"rel":217328},[214],[217330],{"type":23,"value":215334},{"type":23,"value":215336},{"title":7,"searchDepth":1629,"depth":1629,"links":217333},[217334,217335,217336,217337,217338,217339,217340,217341],{"id":216992,"depth":1635,"text":216995},{"id":217026,"depth":1635,"text":217029},{"id":217051,"depth":1635,"text":217054},{"id":217084,"depth":1635,"text":217087},{"id":217125,"depth":1635,"text":217128},{"id":217136,"depth":1635,"text":217139},{"id":217187,"depth":1635,"text":217190},{"id":217255,"depth":1635,"text":217258},"content:blog:api_solutions_for_real_time_event_sync_across_chat_storage_and_databases.md","blog/api_solutions_for_real_time_event_sync_across_chat_storage_and_databases.md","blog/api_solutions_for_real_time_event_sync_across_chat_storage_and_databases",{"_path":217346,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":217347,"description":217348,"img":217349,"date":217350,"tag":6341,"body":217351,"_type":1677,"_id":217820,"_source":1679,"_file":217821,"_stem":217822,"_extension":1682},"/blog/how_to_retrieve_microsoft_dynamics_365_business_central_credentials","How to Retrieve Microsoft Dynamics 365 Business Central Credentials","This guide walks you through creating an Azure App Registration, granting the correct permissions, and collecting the credentials required to integrate with...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-icon.png","2026-01-21T22:21:00.000Z",{"type":14,"children":217352,"toc":217812},[217353,217358,217361,217369,217379,217382,217388,217395,217451,217454,217460,217515,217518,217524,217531,217604,217607,217613,217620,217669,217674,217677,217683,217690,217701,217764,217775,217778,217784,217789,217807],{"type":17,"tag":18,"props":217354,"children":217356},{"id":217355},"how-to-retrieve-microsoft-dynamics-365-business-central-credentials",[217357],{"type":23,"value":217347},{"type":17,"tag":25,"props":217359,"children":217360},{},[],{"type":17,"tag":29,"props":217362,"children":217363},{},[217364],{"type":17,"tag":33,"props":217365,"children":217366},{},[217367],{"type":23,"value":217368},"January 21, 2026",{"type":17,"tag":29,"props":217370,"children":217371},{},[217372,217374,217378],{"type":23,"value":217373},"This guide walks you through creating an Azure App Registration, granting the correct permissions, and collecting the credentials required to integrate with ",{"type":17,"tag":48,"props":217375,"children":217376},{},[217377],{"type":23,"value":216802},{"type":23,"value":160319},{"type":17,"tag":25,"props":217380,"children":217381},{},[],{"type":17,"tag":68,"props":217383,"children":217385},{"id":217384},"_1-create-or-select-an-app-registration",[217386],{"type":23,"value":217387},"1. Create or Select an App Registration",{"type":17,"tag":29,"props":217389,"children":217390},{},[217391],{"type":17,"tag":6438,"props":217392,"children":217394},{"alt":6440,"src":217393},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-0.png",[],{"type":17,"tag":6154,"props":217396,"children":217397},{},[217398,217414,217422],{"type":17,"tag":84,"props":217399,"children":217400},{},[217401,217403,217406,217408],{"type":23,"value":217402},"Go to the Azure Portal:",{"type":17,"tag":3891,"props":217404,"children":217405},{},[],{"type":23,"value":217407},"👉 ",{"type":17,"tag":133,"props":217409,"children":217412},{"href":217410,"rel":217411},"https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",[214],[217413],{"type":23,"value":217410},{"type":17,"tag":84,"props":217415,"children":217416},{},[217417,217418],{"type":23,"value":42939},{"type":17,"tag":48,"props":217419,"children":217420},{},[217421],{"type":23,"value":97027},{"type":17,"tag":84,"props":217423,"children":217424},{},[217425,217427],{"type":23,"value":217426},"Either:",{"type":17,"tag":80,"props":217428,"children":217429},{},[217430,217440],{"type":17,"tag":84,"props":217431,"children":217432},{},[217433,217435],{"type":23,"value":217434},"Select an existing app, ",{"type":17,"tag":48,"props":217436,"children":217437},{},[217438],{"type":23,"value":217439},"or",{"type":17,"tag":84,"props":217441,"children":217442},{},[217443,217444,217449],{"type":23,"value":6629},{"type":17,"tag":48,"props":217445,"children":217446},{},[217447],{"type":23,"value":217448},"New registration",{"type":23,"value":217450}," to create a new one",{"type":17,"tag":25,"props":217452,"children":217453},{},[],{"type":17,"tag":68,"props":217455,"children":217457},{"id":217456},"_2-configure-redirect-uri",[217458],{"type":23,"value":217459},"2. Configure Redirect URI",{"type":17,"tag":6154,"props":217461,"children":217462},{},[217463,217472,217507],{"type":17,"tag":84,"props":217464,"children":217465},{},[217466,217468],{"type":23,"value":217467},"Inside your App Registration, go to ",{"type":17,"tag":48,"props":217469,"children":217470},{},[217471],{"type":23,"value":97048},{"type":17,"tag":84,"props":217473,"children":217474},{},[217475,217476,217481,217482],{"type":23,"value":146715},{"type":17,"tag":48,"props":217477,"children":217478},{},[217479],{"type":23,"value":217480},"Redirect URI (optional)",{"type":23,"value":20456},{"type":17,"tag":80,"props":217483,"children":217484},{},[217485,217494],{"type":17,"tag":84,"props":217486,"children":217487},{},[217488,217489],{"type":23,"value":42950},{"type":17,"tag":48,"props":217490,"children":217491},{},[217492],{"type":23,"value":217493},"Web",{"type":17,"tag":84,"props":217495,"children":217496},{},[217497,217499],{"type":23,"value":217498},"Enter the redirect URL provided by Unified",{"type":17,"tag":6893,"props":217500,"children":217502},{"className":217501,"code":71416,"language":20901,"meta":23},[20899],[217503],{"type":17,"tag":6121,"props":217504,"children":217505},{"__ignoreMap":7},[217506],{"type":23,"value":71416},{"type":17,"tag":84,"props":217508,"children":217509},{},[217510,217511],{"type":23,"value":6629},{"type":17,"tag":48,"props":217512,"children":217513},{},[217514],{"type":23,"value":169347},{"type":17,"tag":25,"props":217516,"children":217517},{},[],{"type":17,"tag":68,"props":217519,"children":217521},{"id":217520},"_3-grant-business-central-api-permissions",[217522],{"type":23,"value":217523},"3. Grant Business Central API Permissions",{"type":17,"tag":29,"props":217525,"children":217526},{},[217527],{"type":17,"tag":6438,"props":217528,"children":217530},{"alt":6440,"src":217529},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-1.png",[],{"type":17,"tag":6154,"props":217532,"children":217533},{},[217534,217544,217553,217562,217571,217580,217585,217594],{"type":17,"tag":84,"props":217535,"children":217536},{},[217537,217539],{"type":23,"value":217538},"In the App Registration, go to ",{"type":17,"tag":48,"props":217540,"children":217541},{},[217542],{"type":23,"value":217543},"API permissions",{"type":17,"tag":84,"props":217545,"children":217546},{},[217547,217548],{"type":23,"value":6629},{"type":17,"tag":48,"props":217549,"children":217550},{},[217551],{"type":23,"value":217552},"Add a permission",{"type":17,"tag":84,"props":217554,"children":217555},{},[217556,217557],{"type":23,"value":42950},{"type":17,"tag":48,"props":217558,"children":217559},{},[217560],{"type":23,"value":217561},"APIs my organization uses",{"type":17,"tag":84,"props":217563,"children":217564},{},[217565,217567],{"type":23,"value":217566},"Search for and select ",{"type":17,"tag":48,"props":217568,"children":217569},{},[217570],{"type":23,"value":216802},{"type":17,"tag":84,"props":217572,"children":217573},{},[217574,217575],{"type":23,"value":44311},{"type":17,"tag":48,"props":217576,"children":217577},{},[217578],{"type":23,"value":217579},"Delegated permissions",{"type":17,"tag":84,"props":217581,"children":217582},{},[217583],{"type":23,"value":217584},"Select the required permissions (typically default access)",{"type":17,"tag":84,"props":217586,"children":217587},{},[217588,217589],{"type":23,"value":6629},{"type":17,"tag":48,"props":217590,"children":217591},{},[217592],{"type":23,"value":217593},"Add permissions",{"type":17,"tag":84,"props":217595,"children":217596},{},[217597,217599],{"type":23,"value":217598},"If required, click ",{"type":17,"tag":48,"props":217600,"children":217601},{},[217602],{"type":23,"value":217603},"Grant admin consent",{"type":17,"tag":25,"props":217605,"children":217606},{},[],{"type":17,"tag":68,"props":217608,"children":217610},{"id":217609},"_4-get-client-id-and-client-secret",[217611],{"type":23,"value":217612},"4. Get Client ID and Client Secret",{"type":17,"tag":29,"props":217614,"children":217615},{},[217616],{"type":17,"tag":6438,"props":217617,"children":217619},{"alt":6440,"src":217618},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-2.png",[],{"type":17,"tag":6154,"props":217621,"children":217622},{},[217623,217632],{"type":17,"tag":84,"props":217624,"children":217625},{},[217626,217627],{"type":23,"value":217538},{"type":17,"tag":48,"props":217628,"children":217629},{},[217630],{"type":23,"value":217631},"Certificates & secrets",{"type":17,"tag":84,"props":217633,"children":217634},{},[217635,217637],{"type":23,"value":217636},"Copy the following:\n",{"type":17,"tag":80,"props":217638,"children":217639},{},[217640,217649],{"type":17,"tag":84,"props":217641,"children":217642},{},[217643,217647],{"type":17,"tag":48,"props":217644,"children":217645},{},[217646],{"type":23,"value":6040},{"type":23,"value":217648}," (from the app Overview page)",{"type":17,"tag":84,"props":217650,"children":217651},{},[217652,217656],{"type":17,"tag":48,"props":217653,"children":217654},{},[217655],{"type":23,"value":6045},{"type":17,"tag":80,"props":217657,"children":217658},{},[217659,217664],{"type":17,"tag":84,"props":217660,"children":217661},{},[217662],{"type":23,"value":217663},"Create a new client secret if one does not exist",{"type":17,"tag":84,"props":217665,"children":217666},{},[217667],{"type":23,"value":217668},"Copy it immediately (it will not be shown again)",{"type":17,"tag":29,"props":217670,"children":217671},{},[217672],{"type":23,"value":217673},"⚠️ Store the client secret securely.",{"type":17,"tag":25,"props":217675,"children":217676},{},[],{"type":17,"tag":68,"props":217678,"children":217680},{"id":217679},"_5-retrieve-business-central-company-name",[217681],{"type":23,"value":217682},"5. Retrieve Business Central Company Name",{"type":17,"tag":29,"props":217684,"children":217685},{},[217686],{"type":17,"tag":6438,"props":217687,"children":217689},{"alt":6440,"src":217688},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_retrieve_microsoft_dynamics_365_business_central_credentials-3.png",[],{"type":17,"tag":29,"props":217691,"children":217692},{},[217693,217695,217700],{"type":23,"value":217694},"Unified also requires the ",{"type":17,"tag":48,"props":217696,"children":217697},{},[217698],{"type":23,"value":217699},"Business Central company name",{"type":23,"value":54},{"type":17,"tag":6154,"props":217702,"children":217703},{},[217704,217718,217723],{"type":17,"tag":84,"props":217705,"children":217706},{},[217707,217708,217711,217712],{"type":23,"value":137163},{"type":17,"tag":3891,"props":217709,"children":217710},{},[],{"type":23,"value":217407},{"type":17,"tag":133,"props":217713,"children":217716},{"href":217714,"rel":217715},"https://businesscentral.dynamics.com/",[214],[217717],{"type":23,"value":217714},{"type":17,"tag":84,"props":217719,"children":217720},{},[217721],{"type":23,"value":217722},"Sign in to your Business Central account",{"type":17,"tag":84,"props":217724,"children":217725},{},[217726,217728,217732,217734],{"type":23,"value":217727},"Locate the ",{"type":17,"tag":48,"props":217729,"children":217730},{},[217731],{"type":23,"value":49561},{"type":23,"value":217733}," using either method:",{"type":17,"tag":80,"props":217735,"children":217736},{},[217737,217752],{"type":17,"tag":84,"props":217738,"children":217739},{},[217740,217742,217747,217748],{"type":23,"value":217741},"The company name shown in the ",{"type":17,"tag":48,"props":217743,"children":217744},{},[217745],{"type":23,"value":217746},"top-left corner",{"type":23,"value":11826},{"type":17,"tag":48,"props":217749,"children":217750},{},[217751],{"type":23,"value":217439},{"type":17,"tag":84,"props":217753,"children":217754},{},[217755,217757,217762],{"type":23,"value":217756},"Click the ",{"type":17,"tag":48,"props":217758,"children":217759},{},[217760],{"type":23,"value":217761},"building (company) icon",{"type":23,"value":217763}," in the navigation bar and copy the desired company name",{"type":17,"tag":29,"props":217765,"children":217766},{},[217767,217768,217773],{"type":23,"value":33722},{"type":17,"tag":48,"props":217769,"children":217770},{},[217771],{"type":23,"value":217772},"exactly",{"type":23,"value":217774}," the company name as shown.",{"type":17,"tag":25,"props":217776,"children":217777},{},[],{"type":17,"tag":68,"props":217779,"children":217781},{"id":217780},"_6-information-you-will-need-for-unified",[217782],{"type":23,"value":217783},"6. Information You Will Need for Unified",{"type":17,"tag":29,"props":217785,"children":217786},{},[217787],{"type":23,"value":217788},"After completing the steps above, you should have:",{"type":17,"tag":80,"props":217790,"children":217791},{},[217792,217797,217802],{"type":17,"tag":84,"props":217793,"children":217794},{},[217795],{"type":23,"value":217796},"✅ Client ID",{"type":17,"tag":84,"props":217798,"children":217799},{},[217800],{"type":23,"value":217801},"✅ Client Secret",{"type":17,"tag":84,"props":217803,"children":217804},{},[217805],{"type":23,"value":217806},"✅ Business Central Company Name",{"type":17,"tag":29,"props":217808,"children":217809},{},[217810],{"type":23,"value":217811},"These values are required to complete the Business Central connection in Unified.",{"title":7,"searchDepth":1629,"depth":1629,"links":217813},[217814,217815,217816,217817,217818,217819],{"id":217384,"depth":1629,"text":217387},{"id":217456,"depth":1629,"text":217459},{"id":217520,"depth":1629,"text":217523},{"id":217609,"depth":1629,"text":217612},{"id":217679,"depth":1629,"text":217682},{"id":217780,"depth":1629,"text":217783},"content:blog:how_to_retrieve_microsoft_dynamics_365_business_central_credentials.md","blog/how_to_retrieve_microsoft_dynamics_365_business_central_credentials.md","blog/how_to_retrieve_microsoft_dynamics_365_business_central_credentials",{"_path":217824,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":217825,"description":217826,"img":217827,"date":217828,"tag":12,"body":217829,"_type":1677,"_id":219161,"_source":1679,"_file":219162,"_stem":219163,"_extension":1682},"/blog/best_unified_api_platforms_of_2026","Best Unified API Platforms of 2026","A technical buyer's guide to architecture, tradeoffs, and real-world readiness","https://s3.us-east-2.amazonaws.com/unified-article-images/best_unified_api_platforms_of_2026-icon.png","2026-01-20T23:40:00.000Z",{"type":14,"children":217830,"toc":219141},[217831,217836,217839,217847,217854,217863,217868,217880,217888,217942,217946,217952,217973,217983,218001,218012,218018,218023,218090,218108,218114,218120,218131,218136,218142,218150,218155,218160,218168,218179,218187,218192,218217,218222,218230,218242,218250,218261,218279,218284,218292,218302,218307,218333,218339,218357,218373,218379,218391,218396,218403,218426,218433,218451,218467,218473,218478,218490,218497,218515,218522,218540,218549,218555,218566,218573,218591,218598,218621,218637,218643,218655,218662,218680,218687,218700,218709,218715,218825,218834,218840,218845,218872,218878,218922,218928,218933,218961,218969,218974,218980,219022,219027,219032,219038,219043,219102,219110,219115,219130,219133],{"type":17,"tag":18,"props":217832,"children":217834},{"id":217833},"best-unified-api-platforms-of-2026",[217835],{"type":23,"value":217825},{"type":17,"tag":25,"props":217837,"children":217838},{},[],{"type":17,"tag":29,"props":217840,"children":217841},{},[217842],{"type":17,"tag":33,"props":217843,"children":217844},{},[217845],{"type":23,"value":217846},"January 20, 2026",{"type":17,"tag":29,"props":217848,"children":217849},{},[217850],{"type":17,"tag":33,"props":217851,"children":217852},{},[217853],{"type":23,"value":217826},{"type":17,"tag":29,"props":217855,"children":217856},{},[217857,217861],{"type":17,"tag":133,"props":217858,"children":217859},{"href":7691},[217860],{"type":23,"value":7806},{"type":23,"value":217862}," platforms promise a simple idea: integrate once, support many third-party systems.",{"type":17,"tag":29,"props":217864,"children":217865},{},[217866],{"type":23,"value":217867},"In practice, platforms labeled 'unified APIs' vary widely in architecture, data handling, pricing, and operational maturity.",{"type":17,"tag":29,"props":217869,"children":217870},{},[217871,217873,217878],{"type":23,"value":217872},"This guide compares the ",{"type":17,"tag":48,"props":217874,"children":217875},{},[217876],{"type":23,"value":217877},"leading unified API platforms of 2026",{"type":23,"value":217879},", focusing on how they actually behave in production—not marketing claims. It is written for product managers, platform engineers, and technical leaders evaluating unified APIs for customer-facing integrations.",{"type":17,"tag":29,"props":217881,"children":217882},{},[217883],{"type":17,"tag":48,"props":217884,"children":217885},{},[217886],{"type":23,"value":217887},"TL;DR",{"type":17,"tag":80,"props":217889,"children":217890},{},[217891,217906,217915,217924,217933],{"type":17,"tag":84,"props":217892,"children":217893},{},[217894,217898,217900,217905],{"type":17,"tag":48,"props":217895,"children":217896},{},[217897],{"type":23,"value":217},{"type":23,"value":217899}," is the strongest choice in 2026 if you need ",{"type":17,"tag":48,"props":217901,"children":217902},{},[217903],{"type":23,"value":217904},"real-time data, pass-through architecture with no customer data stored at rest, transparent pricing, and event-driven architectures",{"type":23,"value":54},{"type":17,"tag":84,"props":217907,"children":217908},{},[217909,217913],{"type":17,"tag":48,"props":217910,"children":217911},{},[217912],{"type":23,"value":227},{"type":23,"value":217914}," is the most mature enterprise option, with deep tooling and large adoption—but relies on sync/polling for most real-time needs.",{"type":17,"tag":84,"props":217916,"children":217917},{},[217918,217922],{"type":17,"tag":48,"props":217919,"children":217920},{},[217921],{"type":23,"value":237},{"type":23,"value":217923}," offers excellent developer experience, with polling-based sync by default and limited webhook immediacy unless upgraded.",{"type":17,"tag":84,"props":217925,"children":217926},{},[217927,217931],{"type":17,"tag":48,"props":217928,"children":217929},{},[217930],{"type":23,"value":1025},{"type":23,"value":217932}," is best for teams that want to own their integration logic and accept higher implementation complexity.",{"type":17,"tag":84,"props":217934,"children":217935},{},[217936,217940],{"type":17,"tag":48,"props":217937,"children":217938},{},[217939],{"type":23,"value":7978},{"type":23,"value":217941}," is a specialist choice for HRIS/ATS/payroll, particularly in Europe.",{"type":17,"tag":11616,"props":217943,"children":217945},{"width":11618,"height":11619,"src":217944,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/BqFw1t06okA",[],{"type":17,"tag":68,"props":217947,"children":217949},{"id":217948},"what-is-a-unified-api-and-what-it-is-not",[217950],{"type":23,"value":217951},"What is a unified API (and what it is not)",{"type":17,"tag":29,"props":217953,"children":217954},{},[217955,217956,217960,217962,217966,217968,217972],{"type":23,"value":9619},{"type":17,"tag":48,"props":217957,"children":217958},{},[217959],{"type":23,"value":7459},{"type":23,"value":217961}," provides a single, normalized interface for a category of third-party APIs (for example CRM, ATS, Accounting), abstracting differences in authentication, ",{"type":17,"tag":133,"props":217963,"children":217964},{"href":1857},[217965],{"type":23,"value":1860},{"type":23,"value":217967},", schemas, and ",{"type":17,"tag":133,"props":217969,"children":217970},{"href":135},[217971],{"type":23,"value":138},{"type":23,"value":54},{"type":17,"tag":29,"props":217974,"children":217975},{},[217976,217978,217982],{"type":23,"value":217977},"Unified APIs are ",{"type":17,"tag":48,"props":217979,"children":217980},{},[217981],{"type":23,"value":159475},{"type":23,"value":20456},{"type":17,"tag":80,"props":217984,"children":217985},{},[217986,217991,217996],{"type":17,"tag":84,"props":217987,"children":217988},{},[217989],{"type":23,"value":217990},"API gateways or API management platforms",{"type":17,"tag":84,"props":217992,"children":217993},{},[217994],{"type":23,"value":217995},"iPaaS / workflow automation tools",{"type":17,"tag":84,"props":217997,"children":217998},{},[217999],{"type":23,"value":218000},"Internal data integration pipelines",{"type":17,"tag":29,"props":218002,"children":218003},{},[218004,218006,218011],{"type":23,"value":218005},"Most confusion in search results comes from mixing these categories. This article focuses exclusively on ",{"type":17,"tag":48,"props":218007,"children":218008},{},[218009],{"type":23,"value":218010},"customer-facing unified integration APIs",{"type":23,"value":54},{"type":17,"tag":68,"props":218013,"children":218015},{"id":218014},"how-we-evaluated-platforms",[218016],{"type":23,"value":218017},"How we evaluated platforms",{"type":17,"tag":29,"props":218019,"children":218020},{},[218021],{"type":23,"value":218022},"Platforms were evaluated across eight dimensions that consistently matter in real deployments:",{"type":17,"tag":6154,"props":218024,"children":218025},{},[218026,218034,218042,218050,218058,218066,218074,218082],{"type":17,"tag":84,"props":218027,"children":218028},{},[218029],{"type":17,"tag":48,"props":218030,"children":218031},{},[218032],{"type":23,"value":218033},"Architecture & data storage model",{"type":17,"tag":84,"props":218035,"children":218036},{},[218037],{"type":17,"tag":48,"props":218038,"children":218039},{},[218040],{"type":23,"value":218041},"Data freshness & real-time behavior",{"type":17,"tag":84,"props":218043,"children":218044},{},[218045],{"type":17,"tag":48,"props":218046,"children":218047},{},[218048],{"type":23,"value":218049},"Webhook semantics & delivery guarantees",{"type":17,"tag":84,"props":218051,"children":218052},{},[218053],{"type":17,"tag":48,"props":218054,"children":218055},{},[218056],{"type":23,"value":218057},"Schema depth & extensibility",{"type":17,"tag":84,"props":218059,"children":218060},{},[218061],{"type":17,"tag":48,"props":218062,"children":218063},{},[218064],{"type":23,"value":218065},"Authentication & credential handling",{"type":17,"tag":84,"props":218067,"children":218068},{},[218069],{"type":17,"tag":48,"props":218070,"children":218071},{},[218072],{"type":23,"value":218073},"Pricing model & scaling behavior",{"type":17,"tag":84,"props":218075,"children":218076},{},[218077],{"type":17,"tag":48,"props":218078,"children":218079},{},[218080],{"type":23,"value":218081},"Security, compliance & enterprise controls",{"type":17,"tag":84,"props":218083,"children":218084},{},[218085],{"type":17,"tag":48,"props":218086,"children":218087},{},[218088],{"type":23,"value":218089},"Operational maturity (reviews, uptime, incidents)",{"type":17,"tag":29,"props":218091,"children":218092},{},[218093,218095,218100,218102,218107],{"type":23,"value":218094},"All claims are based on ",{"type":17,"tag":48,"props":218096,"children":218097},{},[218098],{"type":23,"value":218099},"public documentation, pricing pages, status pages, and independent reviews",{"type":23,"value":218101},", verified as of ",{"type":17,"tag":48,"props":218103,"children":218104},{},[218105],{"type":23,"value":218106},"January 2026",{"type":23,"value":54},{"type":17,"tag":68,"props":218109,"children":218111},{"id":218110},"best-unified-api-platforms-in-2026",[218112],{"type":23,"value":218113},"Best unified API platforms in 2026",{"type":17,"tag":239,"props":218115,"children":218117},{"id":218116},"_1-unifiedto-best-overall-unified-api-platform-2026",[218118],{"type":23,"value":218119},"1. Unified.to — Best overall unified API platform (2026)",{"type":17,"tag":29,"props":218121,"children":218122},{},[218123,218125,218130],{"type":23,"value":218124},"Unified.to stands out for a clear architectural position: ",{"type":17,"tag":48,"props":218126,"children":218127},{},[218128],{"type":23,"value":218129},"real-time, pass-through integrations with zero customer data storage",{"type":23,"value":54},{"type":17,"tag":29,"props":218132,"children":218133},{},[218134],{"type":23,"value":218135},"Rather than syncing and persisting customer data, Unified.to proxies requests directly to source systems and delivers results in real time. This design has implications for security, freshness, and cost that materially differentiate it from most competitors.",{"type":17,"tag":239,"props":218137,"children":218139},{"id":218138},"why-unifiedto-ranks-first",[218140],{"type":23,"value":218141},"Why Unified.to ranks first",{"type":17,"tag":29,"props":218143,"children":218144},{},[218145],{"type":17,"tag":48,"props":218146,"children":218147},{},[218148],{"type":23,"value":218149},"Zero-data-storage architecture",{"type":17,"tag":29,"props":218151,"children":218152},{},[218153],{"type":23,"value":218154},"Unified.to is built around a pass-through model: no payloads cached, no third-party records stored, and no customer data written to logs. Data flows directly from the source system to your infrastructure.",{"type":17,"tag":29,"props":218156,"children":218157},{},[218158],{"type":23,"value":218159},"This reduces compliance scope, minimizes breach impact, and avoids stale data problems inherent in sync-and-store models.",{"type":17,"tag":29,"props":218161,"children":218162},{},[218163],{"type":17,"tag":48,"props":218164,"children":218165},{},[218166],{"type":23,"value":218167},"Real-time by default",{"type":17,"tag":29,"props":218169,"children":218170},{},[218171,218173,218177],{"type":23,"value":218172},"Every API request hits the upstream provider live. When native webhooks exist, Unified passes them through. When they do not, Unified offers ",{"type":17,"tag":48,"props":218174,"children":218175},{},[218176],{"type":23,"value":46572},{"type":23,"value":218178},"—polling-backed change detection that emits deterministic, change-based events without requiring teams to build polling infrastructure.",{"type":17,"tag":29,"props":218180,"children":218181},{},[218182],{"type":17,"tag":48,"props":218183,"children":218184},{},[218185],{"type":23,"value":218186},"Explicit webhook semantics",{"type":17,"tag":29,"props":218188,"children":218189},{},[218190],{"type":23,"value":218191},"Unified.to documents webhook behavior clearly:",{"type":17,"tag":80,"props":218193,"children":218194},{},[218195,218200,218205],{"type":17,"tag":84,"props":218196,"children":218197},{},[218198],{"type":23,"value":218199},"native events may arrive out of order or be duplicated",{"type":17,"tag":84,"props":218201,"children":218202},{},[218203],{"type":23,"value":218204},"virtual webhooks include retries and backoff",{"type":17,"tag":84,"props":218206,"children":218207},{},[218208,218210,218215],{"type":23,"value":218209},"initial backfills emit paged payloads and a final ",{"type":17,"tag":6121,"props":218211,"children":218213},{"className":218212},[],[218214],{"type":23,"value":149978},{"type":23,"value":218216}," event",{"type":17,"tag":29,"props":218218,"children":218219},{},[218220],{"type":23,"value":218221},"This clarity matters for building correct, idempotent systems.",{"type":17,"tag":29,"props":218223,"children":218224},{},[218225],{"type":17,"tag":48,"props":218226,"children":218227},{},[218228],{"type":23,"value":218229},"Flexible schema model with escape hatches",{"type":17,"tag":29,"props":218231,"children":218232},{},[218233,218235,218240],{"type":23,"value":218234},"Unified provides normalized objects (for example CRM Contacts, Companies, Deals) with full read/write support, while allowing provider-specific fields via a ",{"type":17,"tag":6121,"props":218236,"children":218238},{"className":218237},[],[218239],{"type":23,"value":62389},{"type":23,"value":218241}," passthrough mechanism. This avoids the 'lowest common denominator' trap of rigid normalization.",{"type":17,"tag":29,"props":218243,"children":218244},{},[218245],{"type":17,"tag":48,"props":218246,"children":218247},{},[218248],{"type":23,"value":218249},"Transparent pricing at scale",{"type":17,"tag":29,"props":218251,"children":218252},{},[218253,218255,218259],{"type":23,"value":218254},"Unified.to prices by ",{"type":17,"tag":48,"props":218256,"children":218257},{},[218258],{"type":23,"value":828},{"type":23,"value":218260},", not by customers or connections:",{"type":17,"tag":80,"props":218262,"children":218263},{},[218264,218269,218274],{"type":17,"tag":84,"props":218265,"children":218266},{},[218267],{"type":23,"value":218268},"unlimited customers and connections on paid plans",{"type":17,"tag":84,"props":218270,"children":218271},{},[218272],{"type":23,"value":218273},"published quotas, rate limits, and overage pricing",{"type":17,"tag":84,"props":218275,"children":218276},{},[218277],{"type":23,"value":218278},"no per-linked-account tax as adoption grows",{"type":17,"tag":29,"props":218280,"children":218281},{},[218282],{"type":23,"value":218283},"This pricing shape aligns well with PLG and long-tail integration enablement.",{"type":17,"tag":29,"props":218285,"children":218286},{},[218287],{"type":17,"tag":48,"props":218288,"children":218289},{},[218290],{"type":23,"value":218291},"Enterprise-ready controls",{"type":17,"tag":29,"props":218293,"children":218294},{},[218295,218300],{"type":17,"tag":133,"props":218296,"children":218298},{"href":42620,"rel":218297},[214],[218299],{"type":23,"value":217},{"type":23,"value":218301}," is SOC 2 Type II certified, and GDPR, CCPA/CPRA, HIPAA, and PIPEDA compliant. Our architecture eliminates customer data at rest, removing PII persistence risks and simplifying audit scope.",{"type":17,"tag":29,"props":218303,"children":218304},{},[218305],{"type":23,"value":218306},"Higher tiers include:",{"type":17,"tag":80,"props":218308,"children":218309},{},[218310,218314,218319,218323,218328],{"type":17,"tag":84,"props":218311,"children":218312},{},[218313],{"type":23,"value":166808},{"type":17,"tag":84,"props":218315,"children":218316},{},[218317],{"type":23,"value":218318},"RBAC",{"type":17,"tag":84,"props":218320,"children":218321},{},[218322],{"type":23,"value":166813},{"type":17,"tag":84,"props":218324,"children":218325},{},[218326],{"type":23,"value":218327},"AWS Secrets Manager credential storage",{"type":17,"tag":84,"props":218329,"children":218330},{},[218331],{"type":23,"value":218332},"extended log retention and Datadog streaming",{"type":17,"tag":239,"props":218334,"children":218336},{"id":218335},"tradeoffs-to-understand",[218337],{"type":23,"value":218338},"Tradeoffs to understand",{"type":17,"tag":80,"props":218340,"children":218341},{},[218342,218347,218352],{"type":17,"tag":84,"props":218343,"children":218344},{},[218345],{"type":23,"value":218346},"Onboarding requires managing a workspace ID, API token, and connection ID (more flexible, slightly more manual than hosted auth tools).",{"type":17,"tag":84,"props":218348,"children":218349},{},[218350],{"type":23,"value":218351},"Rate-limit headers are not publicly documented; limits are surfaced in the dashboard and via 429 behavior.",{"type":17,"tag":84,"props":218353,"children":218354},{},[218355],{"type":23,"value":218356},"Error payloads are less structured than some competitors, requiring more defensive handling.",{"type":17,"tag":29,"props":218358,"children":218359},{},[218360,218364,218366,218371],{"type":17,"tag":48,"props":218361,"children":218362},{},[218363],{"type":23,"value":43522},{"type":23,"value":218365}," B2B SaaS teams building ",{"type":17,"tag":48,"props":218367,"children":218368},{},[218369],{"type":23,"value":218370},"real-time features, AI-driven workflows, or event-driven products",{"type":23,"value":218372}," who want maximum control over data handling and predictable scaling economics.",{"type":17,"tag":239,"props":218374,"children":218376},{"id":218375},"_2-merge-most-mature-enterprise-unified-api",[218377],{"type":23,"value":218378},"2. Merge — Most mature enterprise unified API",{"type":17,"tag":29,"props":218380,"children":218381},{},[218382,218384,218389],{"type":23,"value":218383},"Merge has the ",{"type":17,"tag":48,"props":218385,"children":218386},{},[218387],{"type":23,"value":218388},"most established enterprise presence",{"type":23,"value":218390}," in the unified API category.",{"type":17,"tag":29,"props":218392,"children":218393},{},[218394],{"type":23,"value":218395},"It offers deep normalization across HRIS, ATS, CRM, Accounting, and Ticketing, along with robust operational tooling.",{"type":17,"tag":29,"props":218397,"children":218398},{},[218399],{"type":17,"tag":48,"props":218400,"children":218401},{},[218402],{"type":23,"value":43788},{"type":17,"tag":80,"props":218404,"children":218405},{},[218406,218411,218416,218421],{"type":17,"tag":84,"props":218407,"children":218408},{},[218409],{"type":23,"value":218410},"Extensive feature coverage and normalization",{"type":17,"tag":84,"props":218412,"children":218413},{},[218414],{"type":23,"value":218415},"Strong observability, logs, and support",{"type":17,"tag":84,"props":218417,"children":218418},{},[218419],{"type":23,"value":218420},"Enterprise-grade security controls",{"type":17,"tag":84,"props":218422,"children":218423},{},[218424],{"type":23,"value":218425},"Large, statistically reliable customer base",{"type":17,"tag":29,"props":218427,"children":218428},{},[218429],{"type":17,"tag":48,"props":218430,"children":218431},{},[218432],{"type":23,"value":621},{"type":17,"tag":80,"props":218434,"children":218435},{},[218436,218441,218446],{"type":17,"tag":84,"props":218437,"children":218438},{},[218439],{"type":23,"value":218440},"Data is synced and stored by default",{"type":17,"tag":84,"props":218442,"children":218443},{},[218444],{"type":23,"value":218445},"Normalization can obscure provider-specific capabilities",{"type":17,"tag":84,"props":218447,"children":218448},{},[218449],{"type":23,"value":218450},"Pricing scales per linked account and becomes expensive quickly",{"type":17,"tag":29,"props":218452,"children":218453},{},[218454,218458,218460,218465],{"type":17,"tag":48,"props":218455,"children":218456},{},[218457],{"type":23,"value":43522},{"type":23,"value":218459}," Mid-market and enterprise companies prioritizing ",{"type":17,"tag":48,"props":218461,"children":218462},{},[218463],{"type":23,"value":218464},"operational maturity and support",{"type":23,"value":218466}," over flexibility and cost efficiency.",{"type":17,"tag":239,"props":218468,"children":218470},{"id":218469},"_3-apideck-best-developer-experience",[218471],{"type":23,"value":218472},"3. Apideck — Best developer experience",{"type":17,"tag":29,"props":218474,"children":218475},{},[218476],{"type":23,"value":218477},"Apideck is consistently praised for documentation quality and ease of use.",{"type":17,"tag":29,"props":218479,"children":218480},{},[218481,218483,218488],{"type":23,"value":218482},"It offers unified APIs across several categories with a hybrid pricing model based on ",{"type":17,"tag":48,"props":218484,"children":218485},{},[218486],{"type":23,"value":218487},"active consumers",{"type":23,"value":218489},", with optional API-call pricing.",{"type":17,"tag":29,"props":218491,"children":218492},{},[218493],{"type":17,"tag":48,"props":218494,"children":218495},{},[218496],{"type":23,"value":43788},{"type":17,"tag":80,"props":218498,"children":218499},{},[218500,218505,218510],{"type":17,"tag":84,"props":218501,"children":218502},{},[218503],{"type":23,"value":218504},"Excellent documentation and DX",{"type":17,"tag":84,"props":218506,"children":218507},{},[218508],{"type":23,"value":218509},"Clear rate-limit headers and error contracts",{"type":17,"tag":84,"props":218511,"children":218512},{},[218513],{"type":23,"value":218514},"Consumer-based pricing works well at moderate scale",{"type":17,"tag":29,"props":218516,"children":218517},{},[218518],{"type":17,"tag":48,"props":218519,"children":218520},{},[218521],{"type":23,"value":621},{"type":17,"tag":80,"props":218523,"children":218524},{},[218525,218530,218535],{"type":17,"tag":84,"props":218526,"children":218527},{},[218528],{"type":23,"value":218529},"Pricing can feel steep as consumer counts grow",{"type":17,"tag":84,"props":218531,"children":218532},{},[218533],{"type":23,"value":218534},"Some niche integrations lack depth",{"type":17,"tag":84,"props":218536,"children":218537},{},[218538],{"type":23,"value":218539},"Advanced features gated to higher tiers",{"type":17,"tag":29,"props":218541,"children":218542},{},[218543,218547],{"type":17,"tag":48,"props":218544,"children":218545},{},[218546],{"type":23,"value":43522},{"type":23,"value":218548}," Teams that want to move fast with minimal integration friction and predictable mid-scale pricing.",{"type":17,"tag":239,"props":218550,"children":218552},{"id":218551},"_4-nango-best-for-custom-unified-apis",[218553],{"type":23,"value":218554},"4. Nango — Best for custom unified APIs",{"type":17,"tag":29,"props":218556,"children":218557},{},[218558,218560,218565],{"type":23,"value":218559},"Nango takes a different approach: instead of pre-defined unified schemas, it provides infrastructure to ",{"type":17,"tag":48,"props":218561,"children":218562},{},[218563],{"type":23,"value":218564},"build and own your own unified APIs",{"type":23,"value":54},{"type":17,"tag":29,"props":218567,"children":218568},{},[218569],{"type":17,"tag":48,"props":218570,"children":218571},{},[218572],{"type":23,"value":43788},{"type":17,"tag":80,"props":218574,"children":218575},{},[218576,218581,218586],{"type":17,"tag":84,"props":218577,"children":218578},{},[218579],{"type":23,"value":218580},"Full control over models and mappings",{"type":17,"tag":84,"props":218582,"children":218583},{},[218584],{"type":23,"value":218585},"Open-source roots and flexible architecture",{"type":17,"tag":84,"props":218587,"children":218588},{},[218589],{"type":23,"value":218590},"Usage-based pricing across infrastructure primitives",{"type":17,"tag":29,"props":218592,"children":218593},{},[218594],{"type":17,"tag":48,"props":218595,"children":218596},{},[218597],{"type":23,"value":621},{"type":17,"tag":80,"props":218599,"children":218600},{},[218601,218606,218611,218616],{"type":17,"tag":84,"props":218602,"children":218603},{},[218604],{"type":23,"value":218605},"Does not provide prebuilt connectors—teams must build and maintain all schemas internally",{"type":17,"tag":84,"props":218607,"children":218608},{},[218609],{"type":23,"value":218610},"Higher implementation complexity",{"type":17,"tag":84,"props":218612,"children":218613},{},[218614],{"type":23,"value":218615},"Steeper learning curve",{"type":17,"tag":84,"props":218617,"children":218618},{},[218619],{"type":23,"value":218620},"Documentation gaps noted in reviews",{"type":17,"tag":29,"props":218622,"children":218623},{},[218624,218628,218630,218635],{"type":17,"tag":48,"props":218625,"children":218626},{},[218627],{"type":23,"value":43522},{"type":23,"value":218629}," Teams for whom integrations are ",{"type":17,"tag":48,"props":218631,"children":218632},{},[218633],{"type":23,"value":218634},"core product IP",{"type":23,"value":218636}," and who want to own the abstraction layer.",{"type":17,"tag":239,"props":218638,"children":218640},{"id":218639},"_5-kombo-best-hr-focused-unified-api",[218641],{"type":23,"value":218642},"5. Kombo — Best HR-focused unified API",{"type":17,"tag":29,"props":218644,"children":218645},{},[218646,218648,218653],{"type":23,"value":218647},"Kombo is a specialist platform focused on ",{"type":17,"tag":48,"props":218649,"children":218650},{},[218651],{"type":23,"value":218652},"HRIS, ATS, and payroll",{"type":23,"value":218654},", with strong European coverage.",{"type":17,"tag":29,"props":218656,"children":218657},{},[218658],{"type":17,"tag":48,"props":218659,"children":218660},{},[218661],{"type":23,"value":43788},{"type":17,"tag":80,"props":218663,"children":218664},{},[218665,218670,218675],{"type":17,"tag":84,"props":218666,"children":218667},{},[218668],{"type":23,"value":218669},"Deep HR-specific schemas",{"type":17,"tag":84,"props":218671,"children":218672},{},[218673],{"type":23,"value":218674},"Excellent support reputation",{"type":17,"tag":84,"props":218676,"children":218677},{},[218678],{"type":23,"value":218679},"Strong GDPR alignment for HR data, particularly in EU contexts",{"type":17,"tag":29,"props":218681,"children":218682},{},[218683],{"type":17,"tag":48,"props":218684,"children":218685},{},[218686],{"type":23,"value":621},{"type":17,"tag":80,"props":218688,"children":218689},{},[218690,218695],{"type":17,"tag":84,"props":218691,"children":218692},{},[218693],{"type":23,"value":218694},"Narrow category focus",{"type":17,"tag":84,"props":218696,"children":218697},{},[218698],{"type":23,"value":218699},"Limited applicability outside HR/payroll",{"type":17,"tag":29,"props":218701,"children":218702},{},[218703,218707],{"type":17,"tag":48,"props":218704,"children":218705},{},[218706],{"type":23,"value":43522},{"type":23,"value":218708}," HR tech and people-ops platforms, especially those operating in Europe.",{"type":17,"tag":68,"props":218710,"children":218712},{"id":218711},"pricing-models-compared-2026-reality",[218713],{"type":23,"value":218714},"Pricing models compared (2026 reality)",{"type":17,"tag":7231,"props":218716,"children":218717},{},[218718,218738],{"type":17,"tag":7235,"props":218719,"children":218720},{},[218721],{"type":17,"tag":7239,"props":218722,"children":218723},{},[218724,218728,218733],{"type":17,"tag":7243,"props":218725,"children":218726},{},[218727],{"type":23,"value":43242},{"type":17,"tag":7243,"props":218729,"children":218730},{},[218731],{"type":23,"value":218732},"Primary pricing unit",{"type":17,"tag":7243,"props":218734,"children":218735},{},[218736],{"type":23,"value":218737},"What drives cost at scale",{"type":17,"tag":7259,"props":218739,"children":218740},{},[218741,218757,218774,218791,218808],{"type":17,"tag":7239,"props":218742,"children":218743},{},[218744,218748,218752],{"type":17,"tag":7266,"props":218745,"children":218746},{},[218747],{"type":23,"value":217},{"type":17,"tag":7266,"props":218749,"children":218750},{},[218751],{"type":23,"value":828},{"type":17,"tag":7266,"props":218753,"children":218754},{},[218755],{"type":23,"value":218756},"Actual usage volume",{"type":17,"tag":7239,"props":218758,"children":218759},{},[218760,218764,218769],{"type":17,"tag":7266,"props":218761,"children":218762},{},[218763],{"type":23,"value":227},{"type":17,"tag":7266,"props":218765,"children":218766},{},[218767],{"type":23,"value":218768},"Linked accounts",{"type":17,"tag":7266,"props":218770,"children":218771},{},[218772],{"type":23,"value":218773},"Customers × integrations",{"type":17,"tag":7239,"props":218775,"children":218776},{},[218777,218781,218786],{"type":17,"tag":7266,"props":218778,"children":218779},{},[218780],{"type":23,"value":237},{"type":17,"tag":7266,"props":218782,"children":218783},{},[218784],{"type":23,"value":218785},"Active consumers",{"type":17,"tag":7266,"props":218787,"children":218788},{},[218789],{"type":23,"value":218790},"Customers using integrations",{"type":17,"tag":7239,"props":218792,"children":218793},{},[218794,218798,218803],{"type":17,"tag":7266,"props":218795,"children":218796},{},[218797],{"type":23,"value":1025},{"type":17,"tag":7266,"props":218799,"children":218800},{},[218801],{"type":23,"value":218802},"Usage quotas",{"type":17,"tag":7266,"props":218804,"children":218805},{},[218806],{"type":23,"value":218807},"Connections, requests, compute",{"type":17,"tag":7239,"props":218809,"children":218810},{},[218811,218815,218820],{"type":17,"tag":7266,"props":218812,"children":218813},{},[218814],{"type":23,"value":7978},{"type":17,"tag":7266,"props":218816,"children":218817},{},[218818],{"type":23,"value":218819},"Contract-based",{"type":17,"tag":7266,"props":218821,"children":218822},{},[218823],{"type":23,"value":218824},"HR integration volume",{"type":17,"tag":29,"props":218826,"children":218827},{},[218828,218832],{"type":17,"tag":48,"props":218829,"children":218830},{},[218831],{"type":23,"value":181109},{"type":23,"value":218833}," Per-connection and per-consumer pricing compounds faster than most teams expect. Usage-based pricing is easier to forecast when integrations become ubiquitous across your customer base.",{"type":17,"tag":68,"props":218835,"children":218837},{"id":218836},"security-compliance-snapshot",[218838],{"type":23,"value":218839},"Security & compliance snapshot",{"type":17,"tag":29,"props":218841,"children":218842},{},[218843],{"type":23,"value":218844},"All major platforms publish SOC 2 compliance and maintain public status pages. Key architectural differences remain:",{"type":17,"tag":80,"props":218846,"children":218847},{},[218848,218857,218867],{"type":17,"tag":84,"props":218849,"children":218850},{},[218851,218855],{"type":17,"tag":48,"props":218852,"children":218853},{},[218854],{"type":23,"value":217},{"type":23,"value":218856}," minimizes audit scope by not storing customer payload data.",{"type":17,"tag":84,"props":218858,"children":218859},{},[218860,218865],{"type":17,"tag":48,"props":218861,"children":218862},{},[218863],{"type":23,"value":218864},"Merge, Apideck, Nango, Kombo",{"type":23,"value":218866}," store synced data to varying degrees and rely on stronger internal controls.",{"type":17,"tag":84,"props":218868,"children":218869},{},[218870],{"type":23,"value":218871},"SAML SSO, RBAC, extended logs, and data residency are consistently gated to higher tiers across vendors.",{"type":17,"tag":68,"props":218873,"children":218875},{"id":218874},"operational-maturity-reviews-uptime",[218876],{"type":23,"value":218877},"Operational maturity: reviews & uptime",{"type":17,"tag":80,"props":218879,"children":218880},{},[218881,218890,218904,218913],{"type":17,"tag":84,"props":218882,"children":218883},{},[218884,218888],{"type":17,"tag":48,"props":218885,"children":218886},{},[218887],{"type":23,"value":227},{"type":23,"value":218889}," shows the strongest maturity signal with 240+ reviews and consistent transparency.",{"type":17,"tag":84,"props":218891,"children":218892},{},[218893,218897,218898,218902],{"type":17,"tag":48,"props":218894,"children":218895},{},[218896],{"type":23,"value":237},{"type":23,"value":34435},{"type":17,"tag":48,"props":218899,"children":218900},{},[218901],{"type":23,"value":7978},{"type":23,"value":218903}," score extremely high with smaller but positive samples.",{"type":17,"tag":84,"props":218905,"children":218906},{},[218907,218911],{"type":17,"tag":48,"props":218908,"children":218909},{},[218910],{"type":23,"value":1025},{"type":23,"value":218912}," reviews highlight flexibility with higher cognitive load.",{"type":17,"tag":84,"props":218914,"children":218915},{},[218916,218920],{"type":17,"tag":48,"props":218917,"children":218918},{},[218919],{"type":23,"value":217},{"type":23,"value":218921}," maintains a smaller but 5 star review base, combined with a transparent status page, zero unresolved incidents, and clear operational tooling.",{"type":17,"tag":68,"props":218923,"children":218925},{"id":218924},"ai-readiness",[218926],{"type":23,"value":218927},"AI-Readiness",{"type":17,"tag":29,"props":218929,"children":218930},{},[218931],{"type":23,"value":218932},"Modern AI-native platforms require integration infrastructure designed for real-time decision-making and autonomous execution. That means:",{"type":17,"tag":80,"props":218934,"children":218935},{},[218936,218941,218946,218951,218956],{"type":17,"tag":84,"props":218937,"children":218938},{},[218939],{"type":23,"value":218940},"Live, low-latency data access",{"type":17,"tag":84,"props":218942,"children":218943},{},[218944],{"type":23,"value":218945},"Event-driven triggers (not polling)",{"type":17,"tag":84,"props":218947,"children":218948},{},[218949],{"type":23,"value":218950},"Flexible schemas with passthrough and raw access",{"type":17,"tag":84,"props":218952,"children":218953},{},[218954],{"type":23,"value":218955},"Fine-grained, permissioned control over actions",{"type":17,"tag":84,"props":218957,"children":218958},{},[218959],{"type":23,"value":218960},"Usage-based pricing that scales with agent activity",{"type":17,"tag":29,"props":218962,"children":218963},{},[218964],{"type":17,"tag":48,"props":218965,"children":218966},{},[218967],{"type":23,"value":218968},"Unified.to is the only unified API platform built for LLM-native architecture.",{"type":17,"tag":29,"props":218970,"children":218971},{},[218972],{"type":23,"value":218973},"Its pass-through engine delivers fresh, structured data in real time—no storage layers, no caching lag. Combined with native and virtual webhooks, it ensures agents react instantly to change.",{"type":17,"tag":239,"props":218975,"children":218977},{"id":218976},"unified-mcp-agent-actions-without-api-glue",[218978],{"type":23,"value":218979},"Unified MCP: Agent actions without API glue",{"type":17,"tag":29,"props":218981,"children":218982},{},[218983,218985,218991,218993,218998,219000,219006,219007,219013,219014,219020],{"type":23,"value":218984},"Unified.to powers ",{"type":17,"tag":133,"props":218986,"children":218988},{"href":217198,"rel":218987},[214],[218989],{"type":23,"value":218990},"MCP (Model Context Protocol)",{"type":23,"value":218992},", a framework to provide ",{"type":17,"tag":48,"props":218994,"children":218995},{},[218996],{"type":23,"value":218997},"20,000+ real-time, permissioned SaaS actions",{"type":23,"value":218999}," (like ",{"type":17,"tag":6121,"props":219001,"children":219003},{"className":219002},[],[219004],{"type":23,"value":219005},"send_slack_message",{"type":23,"value":11826},{"type":17,"tag":6121,"props":219008,"children":219010},{"className":219009},[],[219011],{"type":23,"value":219012},"update_crm_deal",{"type":23,"value":11826},{"type":17,"tag":6121,"props":219015,"children":219017},{"className":219016},[],[219018],{"type":23,"value":219019},"fetch_ticket_status",{"type":23,"value":219021},") to LLMs directly via a secure API surface.",{"type":17,"tag":29,"props":219023,"children":219024},{},[219025],{"type":23,"value":219026},"MCP handles OAuth, scoping, action catalogs, and secure execution—letting you build copilots and autonomous agents that observe, reason, and act across any third-party SaaS system.",{"type":17,"tag":29,"props":219028,"children":219029},{},[219030],{"type":23,"value":219031},"If you're building AI-driven products, Unified.to gives you a foundation built for agentic execution—not just data sync.",{"type":17,"tag":68,"props":219033,"children":219035},{"id":219034},"final-recommendation",[219036],{"type":23,"value":219037},"Final recommendation",{"type":17,"tag":29,"props":219039,"children":219040},{},[219041],{"type":23,"value":219042},"If you are choosing a unified API platform in 2026:",{"type":17,"tag":80,"props":219044,"children":219045},{},[219046,219062,219072,219082,219092],{"type":17,"tag":84,"props":219047,"children":219048},{},[219049,219050,219054,219056,219061],{"type":23,"value":44311},{"type":17,"tag":48,"props":219051,"children":219052},{},[219053],{"type":23,"value":217},{"type":23,"value":219055}," if you value ",{"type":17,"tag":48,"props":219057,"children":219058},{},[219059],{"type":23,"value":219060},"real-time behavior, data minimization, transparent pricing, and architectural clarity",{"type":23,"value":54},{"type":17,"tag":84,"props":219063,"children":219064},{},[219065,219066,219070],{"type":23,"value":44311},{"type":17,"tag":48,"props":219067,"children":219068},{},[219069],{"type":23,"value":227},{"type":23,"value":219071}," if enterprise maturity and support outweigh cost and rigidity.",{"type":17,"tag":84,"props":219073,"children":219074},{},[219075,219076,219080],{"type":23,"value":44311},{"type":17,"tag":48,"props":219077,"children":219078},{},[219079],{"type":23,"value":237},{"type":23,"value":219081}," for best-in-class developer experience at moderate scale.",{"type":17,"tag":84,"props":219083,"children":219084},{},[219085,219086,219090],{"type":23,"value":44311},{"type":17,"tag":48,"props":219087,"children":219088},{},[219089],{"type":23,"value":1025},{"type":23,"value":219091}," if you want to own the abstraction layer.",{"type":17,"tag":84,"props":219093,"children":219094},{},[219095,219096,219100],{"type":23,"value":44311},{"type":17,"tag":48,"props":219097,"children":219098},{},[219099],{"type":23,"value":7978},{"type":23,"value":219101}," for HR-specific depth.",{"type":17,"tag":29,"props":219103,"children":219104},{},[219105],{"type":17,"tag":48,"props":219106,"children":219107},{},[219108],{"type":23,"value":219109},"Unified.to leads in 2026 not by being the loudest, but by being the clearest about tradeoffs.",{"type":17,"tag":29,"props":219111,"children":219112},{},[219113],{"type":23,"value":219114},"That clarity is what makes it the strongest default choice for modern SaaS platforms.",{"type":17,"tag":29,"props":219116,"children":219117},{},[219118,219123,219124,219129],{"type":17,"tag":133,"props":219119,"children":219121},{"href":158861,"rel":219120},[214],[219122],{"type":23,"value":215326},{"type":23,"value":75890},{"type":17,"tag":133,"props":219125,"children":219127},{"href":215330,"rel":219126},[214],[219128],{"type":23,"value":215334},{"type":23,"value":215336},{"type":17,"tag":25,"props":219131,"children":219132},{},[],{"type":17,"tag":29,"props":219134,"children":219135},{},[219136],{"type":17,"tag":33,"props":219137,"children":219138},{},[219139],{"type":23,"value":219140},"Last verified: January 2026",{"title":7,"searchDepth":1629,"depth":1629,"links":219142},[219143,219144,219145,219154,219155,219156,219157,219160],{"id":217948,"depth":1629,"text":217951},{"id":218014,"depth":1629,"text":218017},{"id":218110,"depth":1629,"text":218113,"children":219146},[219147,219148,219149,219150,219151,219152,219153],{"id":218116,"depth":1635,"text":218119},{"id":218138,"depth":1635,"text":218141},{"id":218335,"depth":1635,"text":218338},{"id":218375,"depth":1635,"text":218378},{"id":218469,"depth":1635,"text":218472},{"id":218551,"depth":1635,"text":218554},{"id":218639,"depth":1635,"text":218642},{"id":218711,"depth":1629,"text":218714},{"id":218836,"depth":1629,"text":218839},{"id":218874,"depth":1629,"text":218877},{"id":218924,"depth":1629,"text":218927,"children":219158},[219159],{"id":218976,"depth":1635,"text":218979},{"id":219034,"depth":1629,"text":219037},"content:blog:best_unified_api_platforms_of_2026.md","blog/best_unified_api_platforms_of_2026.md","blog/best_unified_api_platforms_of_2026",{"_path":219165,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":219166,"description":219167,"img":219168,"date":219169,"tag":12,"body":219170,"_type":1677,"_id":220479,"_source":1679,"_file":220480,"_stem":220481,"_extension":1682},"/blog/how_to_build_budgets_and_forecast_runway","How to Build Budgets and Forecast Runway","Most budgeting and runway features break long before the math.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_budgets_and_forecast_runway-icon.png","2026-01-19T21:58:00.000Z",{"type":14,"children":219171,"toc":220449},[219172,219177,219180,219188,219192,219197,219202,219220,219225,219242,219247,219253,219271,219289,219304,219327,219332,219340,219344,219382,219386,219422,219426,219435,219447,219453,219465,219470,219558,219563,219569,219581,219590,219596,219656,219661,219672,219678,219690,219699,219704,219713,219718,219751,219757,219762,219768,219878,219883,219892,219898,219903,219912,219924,219930,219935,219944,219957,219974,219979,219985,219990,219999,220004,220013,220025,220031,220036,220045,220051,220059,220067,220076,220084,220092,220098,220104,220115,220124,220129,220168,220178,220184,220193,220197,220227,220233,220242,220246,220276,220288,220294,220350,220356,220376,220380,220385,220418,220423,220431,220440],{"type":17,"tag":18,"props":219173,"children":219175},{"id":219174},"how-to-build-budgets-and-forecast-runway",[219176],{"type":23,"value":219166},{"type":17,"tag":25,"props":219178,"children":219179},{},[],{"type":17,"tag":29,"props":219181,"children":219182},{},[219183],{"type":17,"tag":33,"props":219184,"children":219185},{},[219186],{"type":23,"value":219187},"January 19, 2026",{"type":17,"tag":29,"props":219189,"children":219190},{},[219191],{"type":23,"value":219167},{"type":17,"tag":29,"props":219193,"children":219194},{},[219195],{"type":23,"value":219196},"They break when products treat accounting reports as inputs rather than outputs. Profit & Loss, Cashflow, and Balance Sheet reports look authoritative, but they are reconstructed views—shaped by provider rules, timing differences, and fields that may change or be deprecated over time.",{"type":17,"tag":29,"props":219198,"children":219199},{},[219200],{"type":23,"value":219201},"For PMs and backend teams, this creates real uncertainty:",{"type":17,"tag":80,"props":219203,"children":219204},{},[219205,219210,219215],{"type":17,"tag":84,"props":219206,"children":219207},{},[219208],{"type":23,"value":219209},"Are budgets reacting to real spend, or delayed summaries?",{"type":17,"tag":84,"props":219211,"children":219212},{},[219213],{"type":23,"value":219214},"Is burn calculated from posted activity, or inferred from reports?",{"type":17,"tag":84,"props":219216,"children":219217},{},[219218],{"type":23,"value":219219},"Can runway be trusted when providers compute reports differently?",{"type":17,"tag":29,"props":219221,"children":219222},{},[219223],{"type":23,"value":219224},"Teams often discover too late that report-driven logic doesn't generalize across accounting systems. Numbers drift. Assumptions leak into code. Validation becomes difficult.",{"type":17,"tag":29,"props":219226,"children":219227},{},[219228,219229,219233,219235,219240],{"type":23,"value":25244},{"type":17,"tag":133,"props":219230,"children":219231},{"href":82425},[219232],{"type":23,"value":128616},{"type":23,"value":219234}," is designed to avoid this trap. It exposes ",{"type":17,"tag":48,"props":219236,"children":219237},{},[219238],{"type":23,"value":219239},"transaction-level accounting data",{"type":23,"value":219241}," as the stable foundation for financial analysis—every debit and credit, already classified, timestamped, and incrementally syncable. Reports remain useful, but only as validation layers, not sources of truth.",{"type":17,"tag":29,"props":219243,"children":219244},{},[219245],{"type":23,"value":219246},"This guide shows how to build operating budgets and forecast cash runway directly from normalized transaction data—using documented, non-deprecated fields only—so your calculations stay consistent across accounting providers and defensible as your product scales.",{"type":17,"tag":68,"props":219248,"children":219250},{"id":219249},"why-transactionsnot-reportsare-the-source-of-truth",[219251],{"type":23,"value":219252},"Why transactions—not reports—are the source of truth",{"type":17,"tag":29,"props":219254,"children":219255},{},[219256,219258,219262,219264,219269],{"type":23,"value":219257},"Accounting ",{"type":17,"tag":48,"props":219259,"children":219260},{},[219261],{"type":23,"value":82739},{"type":23,"value":219263}," (Profit & Loss, Cashflow, Balance Sheet) are ",{"type":17,"tag":48,"props":219265,"children":219266},{},[219267],{"type":23,"value":219268},"derived snapshots",{"type":23,"value":219270},". They are useful for validation, but they:",{"type":17,"tag":80,"props":219272,"children":219273},{},[219274,219279,219284],{"type":17,"tag":84,"props":219275,"children":219276},{},[219277],{"type":23,"value":219278},"vary by provider,",{"type":17,"tag":84,"props":219280,"children":219281},{},[219282],{"type":23,"value":219283},"may lag behind real activity,",{"type":17,"tag":84,"props":219285,"children":219286},{},[219287],{"type":23,"value":219288},"and include deprecated fields you should not depend on.",{"type":17,"tag":29,"props":219290,"children":219291},{},[219292,219296,219298,219303],{"type":17,"tag":48,"props":219293,"children":219294},{},[219295],{"type":23,"value":83810},{"type":23,"value":219297},", on the other hand, represent ",{"type":17,"tag":48,"props":219299,"children":219300},{},[219301],{"type":23,"value":219302},"posted financial reality",{"type":23,"value":20456},{"type":17,"tag":80,"props":219305,"children":219306},{},[219307,219312,219317,219322],{"type":17,"tag":84,"props":219308,"children":219309},{},[219310],{"type":23,"value":219311},"every debit and credit,",{"type":17,"tag":84,"props":219313,"children":219314},{},[219315],{"type":23,"value":219316},"already classified to accounts,",{"type":17,"tag":84,"props":219318,"children":219319},{},[219320],{"type":23,"value":219321},"timestamped,",{"type":17,"tag":84,"props":219323,"children":219324},{},[219325],{"type":23,"value":219326},"and incrementally syncable.",{"type":17,"tag":29,"props":219328,"children":219329},{},[219330],{"type":23,"value":219331},"For budgets and runway forecasting:",{"type":17,"tag":3414,"props":219333,"children":219334},{},[219335],{"type":17,"tag":29,"props":219336,"children":219337},{},[219338],{"type":23,"value":219339},"Transactions are the canonical input. Reports are optional validation.",{"type":17,"tag":68,"props":219341,"children":219342},{"id":199540},[219343],{"type":23,"value":199543},{"type":17,"tag":80,"props":219345,"children":219346},{},[219347,219352,219357,219362,219367,219372,219377],{"type":17,"tag":84,"props":219348,"children":219349},{},[219350],{"type":23,"value":219351},"Fetching and incrementally syncing transactions",{"type":17,"tag":84,"props":219353,"children":219354},{},[219355],{"type":23,"value":219356},"Interpreting debit/credit semantics correctly",{"type":17,"tag":84,"props":219358,"children":219359},{},[219360],{"type":23,"value":219361},"Classifying transactions using the chart of accounts",{"type":17,"tag":84,"props":219363,"children":219364},{},[219365],{"type":23,"value":219366},"Building monthly budgets from historical spend",{"type":17,"tag":84,"props":219368,"children":219369},{},[219370],{"type":23,"value":219371},"Calculating burn rate",{"type":17,"tag":84,"props":219373,"children":219374},{},[219375],{"type":23,"value":219376},"Forecasting runway",{"type":17,"tag":84,"props":219378,"children":219379},{},[219380],{"type":23,"value":219381},"Validating results using non-deprecated report totals (optional)",{"type":17,"tag":68,"props":219383,"children":219384},{"id":141798},[219385],{"type":23,"value":141801},{"type":17,"tag":80,"props":219387,"children":219388},{},[219389,219394,219399,219404,219414],{"type":17,"tag":84,"props":219390,"children":219391},{},[219392],{"type":23,"value":219393},"Node.js 18+",{"type":17,"tag":84,"props":219395,"children":219396},{},[219397],{"type":23,"value":219398},"A Unified workspace",{"type":17,"tag":84,"props":219400,"children":219401},{},[219402],{"type":23,"value":219403},"An Accounting integration authorized for a customer",{"type":17,"tag":84,"props":219405,"children":219406},{},[219407,219409],{"type":23,"value":219408},"A valid ",{"type":17,"tag":6121,"props":219410,"children":219412},{"className":219411},[],[219413],{"type":23,"value":19766},{"type":17,"tag":84,"props":219415,"children":219416},{},[219417,219421],{"type":17,"tag":133,"props":219418,"children":219419},{"href":7691},[219420],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":68,"props":219423,"children":219424},{"id":19743},[219425],{"type":23,"value":19746},{"type":17,"tag":6893,"props":219427,"children":219430},{"className":219428,"code":219429,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: {\n    jwt: process.env.UNIFIED_API_KEY!,\n  },\n});\n",[219431],{"type":17,"tag":6121,"props":219432,"children":219433},{"__ignoreMap":7},[219434],{"type":23,"value":219429},{"type":17,"tag":29,"props":219436,"children":219437},{},[219438,219440,219445],{"type":23,"value":219439},"All requests are scoped by ",{"type":17,"tag":6121,"props":219441,"children":219443},{"className":219442},[],[219444],{"type":23,"value":19766},{"type":23,"value":219446},", which represents one authorized customer integration.",{"type":17,"tag":68,"props":219448,"children":219450},{"id":219449},"step-2-understand-the-transaction-data-model-critical",[219451],{"type":23,"value":219452},"Step 2: Understand the Transaction data model (critical)",{"type":17,"tag":29,"props":219454,"children":219455},{},[219456,219458,219464],{"type":23,"value":219457},"Unified exposes transactions via ",{"type":17,"tag":6121,"props":219459,"children":219461},{"className":219460},[],[219462],{"type":23,"value":219463},"AccountingTransaction",{"type":23,"value":54},{"type":17,"tag":29,"props":219466,"children":219467},{},[219468],{"type":23,"value":219469},"Key fields you must understand:",{"type":17,"tag":80,"props":219471,"children":219472},{},[219473,219501,219516,219526,219540,219550],{"type":17,"tag":84,"props":219474,"children":219475},{},[219476,219482],{"type":17,"tag":6121,"props":219477,"children":219479},{"className":219478},[],[219480],{"type":23,"value":219481},"total_amount",{"type":17,"tag":80,"props":219483,"children":219484},{},[219485,219493],{"type":17,"tag":84,"props":219486,"children":219487},{},[219488],{"type":17,"tag":48,"props":219489,"children":219490},{},[219491],{"type":23,"value":219492},"positive = DEBIT",{"type":17,"tag":84,"props":219494,"children":219495},{},[219496],{"type":17,"tag":48,"props":219497,"children":219498},{},[219499],{"type":23,"value":219500},"negative = CREDIT",{"type":17,"tag":84,"props":219502,"children":219503},{},[219504,219509,219510],{"type":17,"tag":6121,"props":219505,"children":219507},{"className":219506},[],[219508],{"type":23,"value":184840},{"type":23,"value":98082},{"type":17,"tag":6121,"props":219511,"children":219513},{"className":219512},[],[219514],{"type":23,"value":219515},"AccountingAccount",{"type":17,"tag":84,"props":219517,"children":219518},{},[219519,219524],{"type":17,"tag":6121,"props":219520,"children":219522},{"className":219521},[],[219523],{"type":23,"value":27310},{"type":23,"value":219525}," → provider-specific transaction type (Invoice, Bill, Transfer, etc.)",{"type":17,"tag":84,"props":219527,"children":219528},{},[219529,219534,219535],{"type":17,"tag":6121,"props":219530,"children":219532},{"className":219531},[],[219533],{"type":23,"value":33446},{"type":23,"value":26030},{"type":17,"tag":6121,"props":219536,"children":219538},{"className":219537},[],[219539],{"type":23,"value":25337},{"type":17,"tag":84,"props":219541,"children":219542},{},[219543,219549],{"type":17,"tag":6121,"props":219544,"children":219546},{"className":219545},[],[219547],{"type":23,"value":219548},"lineitems[]",{"type":23,"value":200060},{"type":17,"tag":84,"props":219551,"children":219552},{},[219553],{"type":17,"tag":6121,"props":219554,"children":219556},{"className":219555},[],[219557],{"type":23,"value":22296},{"type":17,"tag":29,"props":219559,"children":219560},{},[219561],{"type":23,"value":219562},"This sign convention is the foundation of every calculation that follows.",{"type":17,"tag":68,"props":219564,"children":219566},{"id":219565},"step-3-fetch-transactions-incrementally",[219567],{"type":23,"value":219568},"Step 3: Fetch transactions incrementally",{"type":17,"tag":29,"props":219570,"children":219571},{},[219572,219573,219579],{"type":23,"value":33722},{"type":17,"tag":6121,"props":219574,"children":219576},{"className":219575},[],[219577],{"type":23,"value":219578},"listAccountingTransactions",{"type":23,"value":219580}," to sync transactions.",{"type":17,"tag":6893,"props":219582,"children":219585},{"className":219583,"code":219584,"language":18718,"meta":7},[18716],"const transactions = await sdk.accounting.listAccountingTransactions({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-22T22:41:23.849Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  contact_id: '',\n  fields: '',\n  raw: '',\n});\n",[219586],{"type":17,"tag":6121,"props":219587,"children":219588},{"__ignoreMap":7},[219589],{"type":23,"value":219584},{"type":17,"tag":239,"props":219591,"children":219593},{"id":219592},"pagination-rules",[219594],{"type":23,"value":219595},"Pagination rules",{"type":17,"tag":80,"props":219597,"children":219598},{},[219599,219615,219632,219645],{"type":17,"tag":84,"props":219600,"children":219601},{},[219602,219604,219609,219610],{"type":23,"value":219603},"Default ",{"type":17,"tag":6121,"props":219605,"children":219607},{"className":219606},[],[219608],{"type":23,"value":48389},{"type":23,"value":49318},{"type":17,"tag":48,"props":219611,"children":219612},{},[219613],{"type":23,"value":219614},"100",{"type":17,"tag":84,"props":219616,"children":219617},{},[219618,219620,219625,219626,219630],{"type":23,"value":219619},"Maximum ",{"type":17,"tag":6121,"props":219621,"children":219623},{"className":219622},[],[219624],{"type":23,"value":48389},{"type":23,"value":49318},{"type":17,"tag":48,"props":219627,"children":219628},{},[219629],{"type":23,"value":219614},{"type":23,"value":219631}," on most endpoints",{"type":17,"tag":84,"props":219633,"children":219634},{},[219635,219639,219641],{"type":17,"tag":133,"props":219636,"children":219637},{"href":1857},[219638],{"type":23,"value":2409},{"type":23,"value":219640}," uses ",{"type":17,"tag":48,"props":219642,"children":219643},{},[219644],{"type":23,"value":48411},{"type":17,"tag":84,"props":219646,"children":219647},{},[219648,219650],{"type":23,"value":219649},"Stop when ",{"type":17,"tag":6121,"props":219651,"children":219653},{"className":219652},[],[219654],{"type":23,"value":219655},"results.length \u003C limit",{"type":17,"tag":239,"props":219657,"children":219659},{"id":219658},"incremental-sync",[219660],{"type":23,"value":157204},{"type":17,"tag":29,"props":219662,"children":219663},{},[219664,219665,219670],{"type":23,"value":33722},{"type":17,"tag":6121,"props":219666,"children":219668},{"className":219667},[],[219669],{"type":23,"value":26291},{"type":23,"value":219671}," to fetch only transactions updated since your last checkpoint. This is the recommended polling strategy.",{"type":17,"tag":68,"props":219673,"children":219675},{"id":219674},"step-4-load-the-chart-of-accounts",[219676],{"type":23,"value":219677},"Step 4: Load the chart of accounts",{"type":17,"tag":29,"props":219679,"children":219680},{},[219681,219683,219688],{"type":23,"value":219682},"Accounts tell you ",{"type":17,"tag":48,"props":219684,"children":219685},{},[219686],{"type":23,"value":219687},"what kind of transaction",{"type":23,"value":219689}," you're looking at.",{"type":17,"tag":6893,"props":219691,"children":219694},{"className":219692,"code":219693,"language":18718,"meta":7},[18716],"const accounts = await sdk.accounting.listAccountingAccounts({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-22T22:41:23.849Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  org_id: '',\n  fields: '',\n  raw: '',\n});\n",[219695],{"type":17,"tag":6121,"props":219696,"children":219697},{"__ignoreMap":7},[219698],{"type":23,"value":219693},{"type":17,"tag":29,"props":219700,"children":219701},{},[219702],{"type":23,"value":219703},"Key account types:",{"type":17,"tag":6893,"props":219705,"children":219708},{"className":219706,"code":219707,"language":18718,"meta":7},[18716],"'EXPENSE'\n'REVENUE'\n'BANK'\n'CREDIT_CARD'\n'LIABILITY'\n'EQUITY'\n'FIXED_ASSET'\n",[219709],{"type":17,"tag":6121,"props":219710,"children":219711},{"__ignoreMap":7},[219712],{"type":23,"value":219707},{"type":17,"tag":29,"props":219714,"children":219715},{},[219716],{"type":23,"value":219717},"For runway forecasting, you will primarily use:",{"type":17,"tag":80,"props":219719,"children":219720},{},[219721,219731,219741],{"type":17,"tag":84,"props":219722,"children":219723},{},[219724,219729],{"type":17,"tag":48,"props":219725,"children":219726},{},[219727],{"type":23,"value":219728},"EXPENSE",{"type":23,"value":219730}," accounts (burn)",{"type":17,"tag":84,"props":219732,"children":219733},{},[219734,219739],{"type":17,"tag":48,"props":219735,"children":219736},{},[219737],{"type":23,"value":219738},"BANK / CREDIT_CARD",{"type":23,"value":219740}," accounts (cash movement)",{"type":17,"tag":84,"props":219742,"children":219743},{},[219744,219749],{"type":17,"tag":48,"props":219745,"children":219746},{},[219747],{"type":23,"value":219748},"REVENUE",{"type":23,"value":219750}," (optional, for net burn)",{"type":17,"tag":68,"props":219752,"children":219754},{"id":219753},"step-5-filter-to-true-operating-spend",[219755],{"type":23,"value":219756},"Step 5: Filter to 'true operating spend'",{"type":17,"tag":29,"props":219758,"children":219759},{},[219760],{"type":23,"value":219761},"Not every transaction should count toward burn.",{"type":17,"tag":239,"props":219763,"children":219765},{"id":219764},"recommended-filters",[219766],{"type":23,"value":219767},"Recommended filters",{"type":17,"tag":6154,"props":219769,"children":219770},{},[219771,219817,219843],{"type":17,"tag":84,"props":219772,"children":219773},{},[219774,219779],{"type":17,"tag":48,"props":219775,"children":219776},{},[219777],{"type":23,"value":219778},"Account type",{"type":17,"tag":80,"props":219780,"children":219781},{},[219782,219792],{"type":17,"tag":84,"props":219783,"children":219784},{},[219785,219787],{"type":23,"value":219786},"Include: ",{"type":17,"tag":6121,"props":219788,"children":219790},{"className":219789},[],[219791],{"type":23,"value":219728},{"type":17,"tag":84,"props":219793,"children":219794},{},[219795,219797,219803,219804,219810,219811],{"type":23,"value":219796},"Exclude: ",{"type":17,"tag":6121,"props":219798,"children":219800},{"className":219799},[],[219801],{"type":23,"value":219802},"EQUITY",{"type":23,"value":11826},{"type":17,"tag":6121,"props":219805,"children":219807},{"className":219806},[],[219808],{"type":23,"value":219809},"LIABILITY",{"type":23,"value":11826},{"type":17,"tag":6121,"props":219812,"children":219814},{"className":219813},[],[219815],{"type":23,"value":219816},"FIXED_ASSET",{"type":17,"tag":84,"props":219818,"children":219819},{},[219820,219825],{"type":17,"tag":48,"props":219821,"children":219822},{},[219823],{"type":23,"value":219824},"Sign",{"type":17,"tag":80,"props":219826,"children":219827},{},[219828,219838],{"type":17,"tag":84,"props":219829,"children":219830},{},[219831,219833],{"type":23,"value":219832},"Expenses are ",{"type":17,"tag":48,"props":219834,"children":219835},{},[219836],{"type":23,"value":219837},"positive debits",{"type":17,"tag":84,"props":219839,"children":219840},{},[219841],{"type":23,"value":219842},"Refunds/credits appear as negative values",{"type":17,"tag":84,"props":219844,"children":219845},{},[219846,219851],{"type":17,"tag":48,"props":219847,"children":219848},{},[219849],{"type":23,"value":219850},"Transaction type",{"type":17,"tag":80,"props":219852,"children":219853},{},[219854,219873],{"type":17,"tag":84,"props":219855,"children":219856},{},[219857,219859,219865,219866,219872],{"type":23,"value":219858},"Exclude internal transfers (",{"type":17,"tag":6121,"props":219860,"children":219862},{"className":219861},[],[219863],{"type":23,"value":219864},"Transfer",{"type":23,"value":11826},{"type":17,"tag":6121,"props":219867,"children":219869},{"className":219868},[],[219870],{"type":23,"value":219871},"Deposit",{"type":23,"value":12034},{"type":17,"tag":84,"props":219874,"children":219875},{},[219876],{"type":23,"value":219877},"Exclude balance-only movements",{"type":17,"tag":29,"props":219879,"children":219880},{},[219881],{"type":23,"value":219882},"Example filter logic:",{"type":17,"tag":6893,"props":219884,"children":219887},{"className":219885,"code":219886,"language":18718,"meta":7},[18716],"const expenseTransactions = transactions.filter(tx => {\n  const account = accountMap[tx.account_id];\n  return (\n    account?.type === 'EXPENSE' &&\n    tx.total_amount > 0\n  );\n});\n",[219888],{"type":17,"tag":6121,"props":219889,"children":219890},{"__ignoreMap":7},[219891],{"type":23,"value":219886},{"type":17,"tag":68,"props":219893,"children":219895},{"id":219894},"step-6-bucket-spend-by-month-budget-building",[219896],{"type":23,"value":219897},"Step 6: Bucket spend by month (budget building)",{"type":17,"tag":29,"props":219899,"children":219900},{},[219901],{"type":23,"value":219902},"Group transactions into calendar months.",{"type":17,"tag":6893,"props":219904,"children":219907},{"className":219905,"code":219906,"language":18718,"meta":7},[18716],"function monthKey(date: string) {\n  return date.slice(0, 7); // YYYY-MM\n}\n\nconst monthlySpend = {};\n\nfor (const tx of expenseTransactions) {\n  const month = monthKey(tx.created_at);\n  monthlySpend[month] = (monthlySpend[month] || 0) + tx.total_amount;\n}\n",[219908],{"type":17,"tag":6121,"props":219909,"children":219910},{"__ignoreMap":7},[219911],{"type":23,"value":219906},{"type":17,"tag":29,"props":219913,"children":219914},{},[219915,219917,219922],{"type":23,"value":219916},"This gives you ",{"type":17,"tag":48,"props":219918,"children":219919},{},[219920],{"type":23,"value":219921},"actual historical spend",{"type":23,"value":219923},", not estimates.",{"type":17,"tag":68,"props":219925,"children":219927},{"id":219926},"step-7-build-category-level-budgets-optional",[219928],{"type":23,"value":219929},"Step 7: Build category-level budgets (optional)",{"type":17,"tag":29,"props":219931,"children":219932},{},[219933],{"type":23,"value":219934},"If categories are present, you can budget by function.",{"type":17,"tag":6893,"props":219936,"children":219939},{"className":219937,"code":219938,"language":18718,"meta":7},[18716],"const categories = await sdk.accounting.listAccountingCategories({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-22T22:41:23.849Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  parent_id: '',\n  fields: '',\n  raw: '',\n});\n",[219940],{"type":17,"tag":6121,"props":219941,"children":219942},{"__ignoreMap":7},[219943],{"type":23,"value":219938},{"type":17,"tag":29,"props":219945,"children":219946},{},[219947,219949,219955],{"type":23,"value":219948},"Aggregate spend by ",{"type":17,"tag":6121,"props":219950,"children":219952},{"className":219951},[],[219953],{"type":23,"value":219954},"category_id",{"type":23,"value":219956}," across transactions to produce budgets like:",{"type":17,"tag":80,"props":219958,"children":219959},{},[219960,219964,219969],{"type":17,"tag":84,"props":219961,"children":219962},{},[219963],{"type":23,"value":11718},{"type":17,"tag":84,"props":219965,"children":219966},{},[219967],{"type":23,"value":219968},"R&D",{"type":17,"tag":84,"props":219970,"children":219971},{},[219972],{"type":23,"value":219973},"G&A",{"type":17,"tag":29,"props":219975,"children":219976},{},[219977],{"type":23,"value":219978},"Note: Category availability varies by provider. Your code must tolerate missing categories.",{"type":17,"tag":68,"props":219980,"children":219982},{"id":219981},"step-8-calculate-burn-rate",[219983],{"type":23,"value":219984},"Step 8: Calculate burn rate",{"type":17,"tag":29,"props":219986,"children":219987},{},[219988],{"type":23,"value":219989},"Burn rate is typically computed as:",{"type":17,"tag":6893,"props":219991,"children":219994},{"className":219992,"code":219993,"language":18718,"meta":7},[18716],"averageMonthlyBurn =\n  sum(lastNMonthsSpend) / N;\n",[219995],{"type":17,"tag":6121,"props":219996,"children":219997},{"__ignoreMap":7},[219998],{"type":23,"value":219993},{"type":17,"tag":29,"props":220000,"children":220001},{},[220002],{"type":23,"value":220003},"Example (3-month burn):",{"type":17,"tag":6893,"props":220005,"children":220008},{"className":220006,"code":220007,"language":18718,"meta":7},[18716],"const recentMonths = Object.values(monthlySpend).slice(-3);\nconst burnRate =\n  recentMonths.reduce((a, b) => a + b, 0) / recentMonths.length;\n",[220009],{"type":17,"tag":6121,"props":220010,"children":220011},{"__ignoreMap":7},[220012],{"type":23,"value":220007},{"type":17,"tag":29,"props":220014,"children":220015},{},[220016,220018,220023],{"type":23,"value":220017},"You now have ",{"type":17,"tag":48,"props":220019,"children":220020},{},[220021],{"type":23,"value":220022},"empirical burn",{"type":23,"value":220024},", derived directly from transactions.",{"type":17,"tag":68,"props":220026,"children":220028},{"id":220027},"step-9-forecast-runway",[220029],{"type":23,"value":220030},"Step 9: Forecast runway",{"type":17,"tag":29,"props":220032,"children":220033},{},[220034],{"type":23,"value":220035},"Runway is:",{"type":17,"tag":6893,"props":220037,"children":220040},{"className":220038,"code":220039,"language":18718,"meta":7},[18716],"runwayMonths =\n  currentCash / monthlyBurn;\n",[220041],{"type":17,"tag":6121,"props":220042,"children":220043},{"__ignoreMap":7},[220044],{"type":23,"value":220039},{"type":17,"tag":239,"props":220046,"children":220048},{"id":220047},"getting-current-cash-two-options",[220049],{"type":23,"value":220050},"Getting current cash (two options)",{"type":17,"tag":29,"props":220052,"children":220053},{},[220054],{"type":17,"tag":48,"props":220055,"children":220056},{},[220057],{"type":23,"value":220058},"Option A (preferred):",{"type":17,"tag":80,"props":220060,"children":220061},{},[220062],{"type":17,"tag":84,"props":220063,"children":220064},{},[220065],{"type":23,"value":220066},"Sum BANK and CREDIT_CARD account balances.",{"type":17,"tag":6893,"props":220068,"children":220071},{"className":220069,"code":220070,"language":18718,"meta":7},[18716],"const cash = accounts\n  .filter(a => a.type === 'BANK' || a.type === 'CREDIT_CARD')\n  .reduce((sum, a) => sum + (a.balance || 0), 0);\n",[220072],{"type":17,"tag":6121,"props":220073,"children":220074},{"__ignoreMap":7},[220075],{"type":23,"value":220070},{"type":17,"tag":29,"props":220077,"children":220078},{},[220079],{"type":17,"tag":48,"props":220080,"children":220081},{},[220082],{"type":23,"value":220083},"Option B (validation):",{"type":17,"tag":80,"props":220085,"children":220086},{},[220087],{"type":17,"tag":84,"props":220088,"children":220089},{},[220090],{"type":23,"value":220091},"Use the Cashflow report (see below).",{"type":17,"tag":68,"props":220093,"children":220095},{"id":220094},"step-10-validate-with-non-deprecated-reports-optional",[220096],{"type":23,"value":220097},"Step 10: Validate with non-deprecated reports (optional)",{"type":17,"tag":239,"props":220099,"children":220101},{"id":220100},"profit-loss-validation-only",[220102],{"type":23,"value":220103},"Profit & Loss (validation only)",{"type":17,"tag":29,"props":220105,"children":220106},{},[220107,220109,220114],{"type":23,"value":220108},"Retrieve a P&L report ",{"type":17,"tag":48,"props":220110,"children":220111},{},[220112],{"type":23,"value":220113},"by ID",{"type":23,"value":20456},{"type":17,"tag":6893,"props":220116,"children":220119},{"className":220117,"code":220118,"language":18718,"meta":7},[18716],"const pl = await sdk.accounting.getAccountingProfitloss({\n  connectionId,\n  id: profitlossId,\n  fields: '',\n  raw: '',\n});\n",[220120],{"type":17,"tag":6121,"props":220121,"children":220122},{"__ignoreMap":7},[220123],{"type":23,"value":220118},{"type":17,"tag":29,"props":220125,"children":220126},{},[220127],{"type":23,"value":220128},"Use only:",{"type":17,"tag":80,"props":220130,"children":220131},{},[220132,220141,220150,220159],{"type":17,"tag":84,"props":220133,"children":220134},{},[220135],{"type":17,"tag":6121,"props":220136,"children":220138},{"className":220137},[],[220139],{"type":23,"value":220140},"income_total_amount",{"type":17,"tag":84,"props":220142,"children":220143},{},[220144],{"type":17,"tag":6121,"props":220145,"children":220147},{"className":220146},[],[220148],{"type":23,"value":220149},"expenses_total_amount",{"type":17,"tag":84,"props":220151,"children":220152},{},[220153],{"type":17,"tag":6121,"props":220154,"children":220156},{"className":220155},[],[220157],{"type":23,"value":220158},"net_income_amount",{"type":17,"tag":84,"props":220160,"children":220161},{},[220162],{"type":17,"tag":6121,"props":220163,"children":220165},{"className":220164},[],[220166],{"type":23,"value":220167},"expenses_sections[].accounts[].transaction_ids",{"type":17,"tag":29,"props":220169,"children":220170},{},[220171,220172,220176],{"type":23,"value":200135},{"type":17,"tag":48,"props":220173,"children":220174},{},[220175],{"type":23,"value":159475},{"type":23,"value":220177}," use deprecated fields.",{"type":17,"tag":239,"props":220179,"children":220181},{"id":220180},"balance-sheet-cash-anchor",[220182],{"type":23,"value":220183},"Balance Sheet (cash anchor)",{"type":17,"tag":6893,"props":220185,"children":220188},{"className":220186,"code":220187,"language":18718,"meta":7},[18716],"const bs = await sdk.accounting.getAccountingBalancesheet({\n  connectionId,\n  id: balancesheetId,\n  fields: '',\n  raw: '',\n});\n",[220189],{"type":17,"tag":6121,"props":220190,"children":220191},{"__ignoreMap":7},[220192],{"type":23,"value":220187},{"type":17,"tag":29,"props":220194,"children":220195},{},[220196],{"type":23,"value":204878},{"type":17,"tag":80,"props":220198,"children":220199},{},[220200,220209,220218],{"type":17,"tag":84,"props":220201,"children":220202},{},[220203],{"type":17,"tag":6121,"props":220204,"children":220206},{"className":220205},[],[220207],{"type":23,"value":220208},"net_assets_amount",{"type":17,"tag":84,"props":220210,"children":220211},{},[220212],{"type":17,"tag":6121,"props":220213,"children":220215},{"className":220214},[],[220216],{"type":23,"value":220217},"assets[]",{"type":17,"tag":84,"props":220219,"children":220220},{},[220221],{"type":17,"tag":6121,"props":220222,"children":220224},{"className":220223},[],[220225],{"type":23,"value":220226},"liabilities[]",{"type":17,"tag":239,"props":220228,"children":220230},{"id":220229},"cashflow-cross-check",[220231],{"type":23,"value":220232},"Cashflow (cross-check)",{"type":17,"tag":6893,"props":220234,"children":220237},{"className":220235,"code":220236,"language":18718,"meta":7},[18716],"const cf = await sdk.accounting.getAccountingCashflow({\n  connectionId,\n  id: cashflowId,\n  fields: '',\n  raw: '',\n});\n",[220238],{"type":17,"tag":6121,"props":220239,"children":220240},{"__ignoreMap":7},[220241],{"type":23,"value":220236},{"type":17,"tag":29,"props":220243,"children":220244},{},[220245],{"type":23,"value":95512},{"type":17,"tag":80,"props":220247,"children":220248},{},[220249,220258,220267],{"type":17,"tag":84,"props":220250,"children":220251},{},[220252],{"type":17,"tag":6121,"props":220253,"children":220255},{"className":220254},[],[220256],{"type":23,"value":220257},"cash_beginning_amount",{"type":17,"tag":84,"props":220259,"children":220260},{},[220261],{"type":17,"tag":6121,"props":220262,"children":220264},{"className":220263},[],[220265],{"type":23,"value":220266},"cash_ending_amount",{"type":17,"tag":84,"props":220268,"children":220269},{},[220270],{"type":17,"tag":6121,"props":220271,"children":220273},{"className":220272},[],[220274],{"type":23,"value":220275},"net_change_in_cash_amount",{"type":17,"tag":29,"props":220277,"children":220278},{},[220279,220281,220286],{"type":23,"value":220280},"Reports should ",{"type":17,"tag":48,"props":220282,"children":220283},{},[220284],{"type":23,"value":220285},"confirm",{"type":23,"value":220287},", not drive, your forecast.",{"type":17,"tag":68,"props":220289,"children":220291},{"id":220290},"pagination-rate-limits-and-operations",[220292],{"type":23,"value":220293},"Pagination, rate limits, and operations",{"type":17,"tag":80,"props":220295,"children":220296},{},[220297,220313,220322,220340],{"type":17,"tag":84,"props":220298,"children":220299},{},[220300,220302,220307,220308],{"type":23,"value":220301},"All list endpoints use ",{"type":17,"tag":6121,"props":220303,"children":220305},{"className":220304},[],[220306],{"type":23,"value":48389},{"type":23,"value":26030},{"type":17,"tag":6121,"props":220309,"children":220311},{"className":220310},[],[220312],{"type":23,"value":48411},{"type":17,"tag":84,"props":220314,"children":220315},{},[220316,220318],{"type":23,"value":220317},"Default and max page size is ",{"type":17,"tag":48,"props":220319,"children":220320},{},[220321],{"type":23,"value":219614},{"type":17,"tag":84,"props":220323,"children":220324},{},[220325,220327],{"type":23,"value":220326},"Rate limits come from:\n",{"type":17,"tag":80,"props":220328,"children":220329},{},[220330,220335],{"type":17,"tag":84,"props":220331,"children":220332},{},[220333],{"type":23,"value":220334},"the underlying provider",{"type":17,"tag":84,"props":220336,"children":220337},{},[220338],{"type":23,"value":220339},"Unified's fairness limits",{"type":17,"tag":84,"props":220341,"children":220342},{},[220343,220345],{"type":23,"value":220344},"Rate limit errors return ",{"type":17,"tag":48,"props":220346,"children":220347},{},[220348],{"type":23,"value":220349},"HTTP 429",{"type":17,"tag":239,"props":220351,"children":220353},{"id":220352},"recommended-handling",[220354],{"type":23,"value":220355},"Recommended handling",{"type":17,"tag":80,"props":220357,"children":220358},{},[220359,220363,220367,220371],{"type":17,"tag":84,"props":220360,"children":220361},{},[220362],{"type":23,"value":203132},{"type":17,"tag":84,"props":220364,"children":220365},{},[220366],{"type":23,"value":159918},{"type":17,"tag":84,"props":220368,"children":220369},{},[220370],{"type":23,"value":159923},{"type":17,"tag":84,"props":220372,"children":220373},{},[220374],{"type":23,"value":220375},"Prefer webhooks for continuous sync",{"type":17,"tag":68,"props":220377,"children":220378},{"id":44585},[220379],{"type":23,"value":44588},{"type":17,"tag":29,"props":220381,"children":220382},{},[220383],{"type":23,"value":220384},"Using Unified's Accounting API, you can:",{"type":17,"tag":80,"props":220386,"children":220387},{},[220388,220398,220403,220408,220413],{"type":17,"tag":84,"props":220389,"children":220390},{},[220391,220393],{"type":23,"value":220392},"Build budgets from ",{"type":17,"tag":48,"props":220394,"children":220395},{},[220396],{"type":23,"value":220397},"real posted transactions",{"type":17,"tag":84,"props":220399,"children":220400},{},[220401],{"type":23,"value":220402},"Compute burn rate empirically",{"type":17,"tag":84,"props":220404,"children":220405},{},[220406],{"type":23,"value":220407},"Forecast runway with defensible assumptions",{"type":17,"tag":84,"props":220409,"children":220410},{},[220411],{"type":23,"value":220412},"Validate results using non-deprecated financial reports",{"type":17,"tag":84,"props":220414,"children":220415},{},[220416],{"type":23,"value":220417},"Avoid provider-specific reporting quirks",{"type":17,"tag":29,"props":220419,"children":220420},{},[220421],{"type":23,"value":220422},"The key principle is simple:",{"type":17,"tag":3414,"props":220424,"children":220425},{},[220426],{"type":17,"tag":29,"props":220427,"children":220428},{},[220429],{"type":23,"value":220430},"Transactions first. Reports second. Assumptions last.",{"type":17,"tag":29,"props":220432,"children":220433},{},[220434,220435],{"type":23,"value":1609},{"type":17,"tag":133,"props":220436,"children":220438},{"href":1612,"rel":220437},[214],[220439],{"type":23,"value":1616},{"type":17,"tag":29,"props":220441,"children":220442},{},[220443,220444],{"type":23,"value":1609},{"type":17,"tag":133,"props":220445,"children":220447},{"href":1623,"rel":220446},[214],[220448],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":220450},[220451,220452,220453,220454,220455,220456,220460,220461,220464,220465,220466,220467,220470,220475,220478],{"id":219249,"depth":1629,"text":219252},{"id":199540,"depth":1629,"text":199543},{"id":141798,"depth":1629,"text":141801},{"id":19743,"depth":1629,"text":19746},{"id":219449,"depth":1629,"text":219452},{"id":219565,"depth":1629,"text":219568,"children":220457},[220458,220459],{"id":219592,"depth":1635,"text":219595},{"id":219658,"depth":1635,"text":157204},{"id":219674,"depth":1629,"text":219677},{"id":219753,"depth":1629,"text":219756,"children":220462},[220463],{"id":219764,"depth":1635,"text":219767},{"id":219894,"depth":1629,"text":219897},{"id":219926,"depth":1629,"text":219929},{"id":219981,"depth":1629,"text":219984},{"id":220027,"depth":1629,"text":220030,"children":220468},[220469],{"id":220047,"depth":1635,"text":220050},{"id":220094,"depth":1629,"text":220097,"children":220471},[220472,220473,220474],{"id":220100,"depth":1635,"text":220103},{"id":220180,"depth":1635,"text":220183},{"id":220229,"depth":1635,"text":220232},{"id":220290,"depth":1629,"text":220293,"children":220476},[220477],{"id":220352,"depth":1635,"text":220355},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_build_budgets_and_forecast_runway.md","blog/how_to_build_budgets_and_forecast_runway.md","blog/how_to_build_budgets_and_forecast_runway",{"_path":220483,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":220484,"description":220485,"img":220486,"date":220487,"tag":12,"body":220488,"_type":1677,"_id":221971,"_source":1679,"_file":221972,"_stem":221973,"_extension":1682},"/blog/how_to_reconcile_customer_payments_ar_with_unified_accounting_api","How to Reconcile Customer Payments (AR) with Unified's Accounting API","Accounts Receivable reconciliation is often implemented in the wrong place.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_reconcile_customer_payments_ar_with_unified_accounting_api-icon.png","2026-01-19T21:56:00.000Z",{"type":14,"children":220489,"toc":221938},[220490,220495,220498,220505,220509,220514,220519,220537,220542,220565,220570,220576,220581,220613,220623,220664,220681,220685,220719,220723,220752,220756,220764,220776,220782,220788,220800,220869,220894,220900,220910,221030,221042,221050,221056,221065,221069,221108,221119,221125,221133,221139,221149,221251,221269,221274,221283,221289,221294,221303,221314,221320,221331,221337,221389,221395,221459,221482,221488,221494,221506,221515,221521,221532,221538,221557,221563,221568,221587,221593,221598,221607,221612,221620,221625,221646,221651,221657,221661,221666,221674,221678,221713,221722,221728,221732,221740,221744,221767,221778,221782,221822,221830,221846,221850,221855,221907,221912,221920,221929],{"type":17,"tag":18,"props":220491,"children":220493},{"id":220492},"how-to-reconcile-customer-payments-ar-with-unifieds-accounting-api",[220494],{"type":23,"value":220484},{"type":17,"tag":25,"props":220496,"children":220497},{},[],{"type":17,"tag":29,"props":220499,"children":220500},{},[220501],{"type":17,"tag":33,"props":220502,"children":220503},{},[220504],{"type":23,"value":219187},{"type":17,"tag":29,"props":220506,"children":220507},{},[220508],{"type":23,"value":220485},{"type":17,"tag":29,"props":220510,"children":220511},{},[220512],{"type":23,"value":220513},"Teams start with payment events—charges, refunds, payouts—and try to infer AR state from them. That works in a single-provider setup, but it breaks as soon as you support multiple accounting systems. Payment processors report activity. Accounting systems record obligation and settlement. Those are not the same thing.",{"type":17,"tag":29,"props":220515,"children":220516},{},[220517],{"type":23,"value":220518},"For PMs and backend teams, this mismatch creates immediate ambiguity:",{"type":17,"tag":80,"props":220520,"children":220521},{},[220522,220527,220532],{"type":17,"tag":84,"props":220523,"children":220524},{},[220525],{"type":23,"value":220526},"Is AR driven by what was charged, or what the ledger recorded?",{"type":17,"tag":84,"props":220528,"children":220529},{},[220530],{"type":23,"value":220531},"How do partial payments, credits, and write-offs actually surface?",{"type":17,"tag":84,"props":220533,"children":220534},{},[220535],{"type":23,"value":220536},"Which numbers should users trust when systems disagree?",{"type":17,"tag":29,"props":220538,"children":220539},{},[220540],{"type":23,"value":220541},"When reconciliation logic is built on payment events alone, edge cases accumulate quickly. Credits don't line up. Invoice balances drift. Collections workflows lose credibility.",{"type":17,"tag":29,"props":220543,"children":220544},{},[220545,220546,220550,220552,220557,220558,220563],{"type":23,"value":25244},{"type":17,"tag":133,"props":220547,"children":220548},{"href":82425},[220549],{"type":23,"value":128616},{"type":23,"value":220551}," is designed to anchor AR reconciliation where it belongs: in the general ledger. In Unified Accounting, ",{"type":17,"tag":48,"props":220553,"children":220554},{},[220555],{"type":23,"value":220556},"invoices define what is owed",{"type":23,"value":12561},{"type":17,"tag":48,"props":220559,"children":220560},{},[220561],{"type":23,"value":220562},"transactions define what posted",{"type":23,"value":220564},". Customer payments are not a separate object—they are ledger entries that must be interpreted in context.",{"type":17,"tag":29,"props":220566,"children":220567},{},[220568],{"type":23,"value":220569},"This guide shows how to reconcile AR defensively using that model—combining invoices and transactions, matching payments best-effort using documented fields only, and treating invoice balances as the final authority—so your AR logic remains correct across accounting providers.",{"type":17,"tag":68,"props":220571,"children":220573},{"id":220572},"why-ar-reconciliation-lives-in-accounting-not-payments",[220574],{"type":23,"value":220575},"Why AR reconciliation lives in Accounting (not Payments)",{"type":17,"tag":29,"props":220577,"children":220578},{},[220579],{"type":23,"value":220580},"Unified exposes two different surfaces that mention 'payments':",{"type":17,"tag":80,"props":220582,"children":220583},{},[220584,220597],{"type":17,"tag":84,"props":220585,"children":220586},{},[220587,220595],{"type":17,"tag":48,"props":220588,"children":220589},{},[220590],{"type":17,"tag":133,"props":220591,"children":220592},{"href":35809},[220593],{"type":23,"value":220594},"Payments API",{"type":23,"value":220596},": payment-processor events (e.g., Stripe/Square charges, refunds, payouts).",{"type":17,"tag":84,"props":220598,"children":220599},{},[220600,220604,220606,220611],{"type":17,"tag":48,"props":220601,"children":220602},{},[220603],{"type":23,"value":128616},{"type":23,"value":220605},": the ",{"type":17,"tag":48,"props":220607,"children":220608},{},[220609],{"type":23,"value":220610},"general ledger",{"type":23,"value":220612}," view—what the accounting system recorded.",{"type":17,"tag":29,"props":220614,"children":220615},{},[220616,220621],{"type":17,"tag":48,"props":220617,"children":220618},{},[220619],{"type":23,"value":220620},"AR reconciliation belongs to Accounting",{"type":23,"value":220622},", because AR is a ledger concept. In Unified Accounting:",{"type":17,"tag":80,"props":220624,"children":220625},{},[220626,220641,220655],{"type":17,"tag":84,"props":220627,"children":220628},{},[220629,220633,220635,220640],{"type":17,"tag":48,"props":220630,"children":220631},{},[220632],{"type":23,"value":70733},{"type":23,"value":220634}," represent ",{"type":17,"tag":48,"props":220636,"children":220637},{},[220638],{"type":23,"value":220639},"what's owed",{"type":23,"value":54},{"type":17,"tag":84,"props":220642,"children":220643},{},[220644,220648,220649,220653],{"type":17,"tag":48,"props":220645,"children":220646},{},[220647],{"type":23,"value":83810},{"type":23,"value":220634},{"type":17,"tag":48,"props":220650,"children":220651},{},[220652],{"type":23,"value":93946},{"type":23,"value":220654}," (including customer payments).",{"type":17,"tag":84,"props":220656,"children":220657},{},[220658,220662],{"type":17,"tag":48,"props":220659,"children":220660},{},[220661],{"type":23,"value":83801},{"type":23,"value":220663}," classify those transactions (e.g., AR vs bank).",{"type":17,"tag":29,"props":220665,"children":220666},{},[220667,220668,220673,220675,220679],{"type":23,"value":195030},{"type":17,"tag":48,"props":220669,"children":220670},{},[220671],{"type":23,"value":220672},"no standalone 'Payment' object",{"type":23,"value":220674}," in Accounting. Customer payments surface as ",{"type":17,"tag":48,"props":220676,"children":220677},{},[220678],{"type":23,"value":219463},{"type":23,"value":220680}," records.",{"type":17,"tag":68,"props":220682,"children":220683},{"id":199540},[220684],{"type":23,"value":199543},{"type":17,"tag":80,"props":220686,"children":220687},{},[220688,220699,220704,220709,220714],{"type":17,"tag":84,"props":220689,"children":220690},{},[220691,220693,220697],{"type":23,"value":220692},"Listing invoices and transactions with ",{"type":17,"tag":133,"props":220694,"children":220695},{"href":1857},[220696],{"type":23,"value":1860},{"type":23,"value":220698}," and incremental sync",{"type":17,"tag":84,"props":220700,"children":220701},{},[220702],{"type":23,"value":220703},"Understanding how customer payments appear as transactions",{"type":17,"tag":84,"props":220705,"children":220706},{},[220707],{"type":23,"value":220708},"Matching payments to invoices (best-effort, doc-accurate)",{"type":17,"tag":84,"props":220710,"children":220711},{},[220712],{"type":23,"value":220713},"Computing open AR, paid AR, partials, and credits",{"type":17,"tag":84,"props":220715,"children":220716},{},[220717],{"type":23,"value":220718},"Validating results against account balances and reports (optional)",{"type":17,"tag":68,"props":220720,"children":220721},{"id":141798},[220722],{"type":23,"value":141801},{"type":17,"tag":80,"props":220724,"children":220725},{},[220726,220730,220734,220738,220747],{"type":17,"tag":84,"props":220727,"children":220728},{},[220729],{"type":23,"value":219393},{"type":17,"tag":84,"props":220731,"children":220732},{},[220733],{"type":23,"value":219398},{"type":17,"tag":84,"props":220735,"children":220736},{},[220737],{"type":23,"value":219403},{"type":17,"tag":84,"props":220739,"children":220740},{},[220741,220742],{"type":23,"value":219408},{"type":17,"tag":6121,"props":220743,"children":220745},{"className":220744},[],[220746],{"type":23,"value":19766},{"type":17,"tag":84,"props":220748,"children":220749},{},[220750],{"type":23,"value":220751},"Unified API key",{"type":17,"tag":68,"props":220753,"children":220754},{"id":19743},[220755],{"type":23,"value":19746},{"type":17,"tag":6893,"props":220757,"children":220759},{"className":220758,"code":219429,"language":18718,"meta":7},[18716],[220760],{"type":17,"tag":6121,"props":220761,"children":220762},{"__ignoreMap":7},[220763],{"type":23,"value":219429},{"type":17,"tag":29,"props":220765,"children":220766},{},[220767,220769,220774],{"type":23,"value":220768},"All Accounting API calls are scoped by ",{"type":17,"tag":6121,"props":220770,"children":220772},{"className":220771},[],[220773],{"type":23,"value":19766},{"type":23,"value":220775},", which represents a single authorized customer integration.",{"type":17,"tag":68,"props":220777,"children":220779},{"id":220778},"step-2-understand-the-two-source-objects",[220780],{"type":23,"value":220781},"Step 2: Understand the two source objects",{"type":17,"tag":239,"props":220783,"children":220785},{"id":220784},"invoices-ar-state",[220786],{"type":23,"value":220787},"Invoices = AR state",{"type":17,"tag":29,"props":220789,"children":220790},{},[220791,220792,220798],{"type":23,"value":134520},{"type":17,"tag":6121,"props":220793,"children":220795},{"className":220794},[],[220796],{"type":23,"value":220797},"AccountingInvoice",{"type":23,"value":220799}," model, the AR-relevant fields are:",{"type":17,"tag":80,"props":220801,"children":220802},{},[220803,220811,220820,220829,220837,220845,220853],{"type":17,"tag":84,"props":220804,"children":220805},{},[220806],{"type":17,"tag":6121,"props":220807,"children":220809},{"className":220808},[],[220810],{"type":23,"value":219481},{"type":17,"tag":84,"props":220812,"children":220813},{},[220814],{"type":17,"tag":6121,"props":220815,"children":220817},{"className":220816},[],[220818],{"type":23,"value":220819},"paid_amount",{"type":17,"tag":84,"props":220821,"children":220822},{},[220823],{"type":17,"tag":6121,"props":220824,"children":220826},{"className":220825},[],[220827],{"type":23,"value":220828},"balance_amount",{"type":17,"tag":84,"props":220830,"children":220831},{},[220832],{"type":17,"tag":6121,"props":220833,"children":220835},{"className":220834},[],[220836],{"type":23,"value":19949},{"type":17,"tag":84,"props":220838,"children":220839},{},[220840],{"type":17,"tag":6121,"props":220841,"children":220843},{"className":220842},[],[220844],{"type":23,"value":187822},{"type":17,"tag":84,"props":220846,"children":220847},{},[220848],{"type":17,"tag":6121,"props":220849,"children":220851},{"className":220850},[],[220852],{"type":23,"value":26302},{"type":17,"tag":84,"props":220854,"children":220855},{},[220856,220862,220863],{"type":17,"tag":6121,"props":220857,"children":220859},{"className":220858},[],[220860],{"type":23,"value":220861},"invoice_number",{"type":23,"value":26030},{"type":17,"tag":6121,"props":220864,"children":220866},{"className":220865},[],[220867],{"type":23,"value":220868},"reference",{"type":17,"tag":29,"props":220870,"children":220871},{},[220872,220874,220879,220881,220886,220887,220892],{"type":23,"value":220873},"Invoices tell you ",{"type":17,"tag":48,"props":220875,"children":220876},{},[220877],{"type":23,"value":220878},"what remains owed",{"type":23,"value":220880},". Treat ",{"type":17,"tag":6121,"props":220882,"children":220884},{"className":220883},[],[220885],{"type":23,"value":220828},{"type":23,"value":34435},{"type":17,"tag":6121,"props":220888,"children":220890},{"className":220889},[],[220891],{"type":23,"value":19949},{"type":23,"value":220893}," as authoritative.",{"type":17,"tag":239,"props":220895,"children":220897},{"id":220896},"transactions-ledger-events",[220898],{"type":23,"value":220899},"Transactions = ledger events",{"type":17,"tag":29,"props":220901,"children":220902},{},[220903,220904,220909],{"type":23,"value":134520},{"type":17,"tag":6121,"props":220905,"children":220907},{"className":220906},[],[220908],{"type":23,"value":219463},{"type":23,"value":134527},{"type":17,"tag":80,"props":220911,"children":220912},{},[220913,220938,220946,220983,221008,221016],{"type":17,"tag":84,"props":220914,"children":220915},{},[220916,220921],{"type":17,"tag":6121,"props":220917,"children":220919},{"className":220918},[],[220920],{"type":23,"value":219481},{"type":17,"tag":80,"props":220922,"children":220923},{},[220924,220931],{"type":17,"tag":84,"props":220925,"children":220926},{},[220927],{"type":17,"tag":48,"props":220928,"children":220929},{},[220930],{"type":23,"value":219492},{"type":17,"tag":84,"props":220932,"children":220933},{},[220934],{"type":17,"tag":48,"props":220935,"children":220936},{},[220937],{"type":23,"value":219500},{"type":17,"tag":84,"props":220939,"children":220940},{},[220941],{"type":17,"tag":6121,"props":220942,"children":220944},{"className":220943},[],[220945],{"type":23,"value":184840},{"type":17,"tag":84,"props":220947,"children":220948},{},[220949,220954,220956,220962,220963,220969,220970,220975,220976,220982],{"type":17,"tag":6121,"props":220950,"children":220952},{"className":220951},[],[220953],{"type":23,"value":27310},{"type":23,"value":220955}," (examples include ",{"type":17,"tag":6121,"props":220957,"children":220959},{"className":220958},[],[220960],{"type":23,"value":220961},"ReceivePayment",{"type":23,"value":11826},{"type":17,"tag":6121,"props":220964,"children":220966},{"className":220965},[],[220967],{"type":23,"value":220968},"SalesReceipt",{"type":23,"value":11826},{"type":17,"tag":6121,"props":220971,"children":220973},{"className":220972},[],[220974],{"type":23,"value":129424},{"type":23,"value":11826},{"type":17,"tag":6121,"props":220977,"children":220979},{"className":220978},[],[220980],{"type":23,"value":220981},"CreditRefund",{"type":23,"value":12034},{"type":17,"tag":84,"props":220984,"children":220985},{},[220986,220992,220994,221000,221001,221007],{"type":17,"tag":6121,"props":220987,"children":220989},{"className":220988},[],[220990],{"type":23,"value":220991},"contacts[]",{"type":23,"value":220993}," (with ",{"type":17,"tag":6121,"props":220995,"children":220997},{"className":220996},[],[220998],{"type":23,"value":220999},"is_customer",{"type":23,"value":26030},{"type":17,"tag":6121,"props":221002,"children":221004},{"className":221003},[],[221005],{"type":23,"value":221006},"is_supplier",{"type":23,"value":12034},{"type":17,"tag":84,"props":221009,"children":221010},{},[221011],{"type":17,"tag":6121,"props":221012,"children":221014},{"className":221013},[],[221015],{"type":23,"value":220868},{"type":17,"tag":84,"props":221017,"children":221018},{},[221019,221024,221025],{"type":17,"tag":6121,"props":221020,"children":221022},{"className":221021},[],[221023],{"type":23,"value":33446},{"type":23,"value":26030},{"type":17,"tag":6121,"props":221026,"children":221028},{"className":221027},[],[221029],{"type":23,"value":25337},{"type":17,"tag":29,"props":221031,"children":221032},{},[221033,221035,221040],{"type":23,"value":221034},"Transactions tell you ",{"type":17,"tag":48,"props":221036,"children":221037},{},[221038],{"type":23,"value":221039},"what posted",{"type":23,"value":221041},"—including customer payments.",{"type":17,"tag":3414,"props":221043,"children":221044},{},[221045],{"type":17,"tag":29,"props":221046,"children":221047},{},[221048],{"type":23,"value":221049},"Important: The docs do not guarantee a direct invoice↔transaction foreign key. Reconciliation is therefore best-effort matching, with invoice balances as the final truth.",{"type":17,"tag":68,"props":221051,"children":221053},{"id":221052},"step-3-list-invoices-what-was-owed",[221054],{"type":23,"value":221055},"Step 3: List invoices (what was owed)",{"type":17,"tag":6893,"props":221057,"children":221060},{"className":221058,"code":221059,"language":18718,"meta":7},[18716],"const invoices = await sdk.accounting.listAccountingInvoices({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-22T23:22:07.715Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  contact_id: '',\n  org_id: '',\n  type: '',\n  fields: '',\n  raw: '',\n});\n",[221061],{"type":17,"tag":6121,"props":221062,"children":221063},{"__ignoreMap":7},[221064],{"type":23,"value":221059},{"type":17,"tag":239,"props":221066,"children":221067},{"id":219592},[221068],{"type":23,"value":219595},{"type":17,"tag":80,"props":221070,"children":221071},{},[221072,221081,221091,221099],{"type":17,"tag":84,"props":221073,"children":221074},{},[221075,221077],{"type":23,"value":221076},"Default page size: ",{"type":17,"tag":48,"props":221078,"children":221079},{},[221080],{"type":23,"value":219614},{"type":17,"tag":84,"props":221082,"children":221083},{},[221084,221086,221090],{"type":23,"value":221085},"Max page size: ",{"type":17,"tag":48,"props":221087,"children":221088},{},[221089],{"type":23,"value":219614},{"type":23,"value":219631},{"type":17,"tag":84,"props":221092,"children":221093},{},[221094,221095],{"type":23,"value":143132},{"type":17,"tag":48,"props":221096,"children":221097},{},[221098],{"type":23,"value":48411},{"type":17,"tag":84,"props":221100,"children":221101},{},[221102,221103],{"type":23,"value":219649},{"type":17,"tag":6121,"props":221104,"children":221106},{"className":221105},[],[221107],{"type":23,"value":219655},{"type":17,"tag":29,"props":221109,"children":221110},{},[221111,221112,221117],{"type":23,"value":33722},{"type":17,"tag":6121,"props":221113,"children":221115},{"className":221114},[],[221116],{"type":23,"value":26291},{"type":23,"value":221118}," to incrementally sync invoice state.",{"type":17,"tag":68,"props":221120,"children":221122},{"id":221121},"step-4-list-transactions-what-actually-happened",[221123],{"type":23,"value":221124},"Step 4: List transactions (what actually happened)",{"type":17,"tag":6893,"props":221126,"children":221128},{"className":221127,"code":219584,"language":18718,"meta":7},[18716],[221129],{"type":17,"tag":6121,"props":221130,"children":221131},{"__ignoreMap":7},[221132],{"type":23,"value":219584},{"type":17,"tag":68,"props":221134,"children":221136},{"id":221135},"step-5-identify-customer-payment-transactions",[221137],{"type":23,"value":221138},"Step 5: Identify customer payment transactions",{"type":17,"tag":29,"props":221140,"children":221141},{},[221142,221144,221148],{"type":23,"value":221143},"Customer payments surface as ",{"type":17,"tag":48,"props":221145,"children":221146},{},[221147],{"type":23,"value":82494},{"type":23,"value":21920},{"type":17,"tag":6154,"props":221150,"children":221151},{},[221152,221181,221204],{"type":17,"tag":84,"props":221153,"children":221154},{},[221155,221157,221162,221165,221167,221172,221174,221180],{"type":23,"value":221156},"Reference a ",{"type":17,"tag":48,"props":221158,"children":221159},{},[221160],{"type":23,"value":221161},"customer",{"type":17,"tag":3891,"props":221163,"children":221164},{},[],{"type":23,"value":221166},"(",{"type":17,"tag":6121,"props":221168,"children":221170},{"className":221169},[],[221171],{"type":23,"value":220991},{"type":23,"value":221173}," contains an entry with ",{"type":17,"tag":6121,"props":221175,"children":221177},{"className":221176},[],[221178],{"type":23,"value":221179},"is_customer === true",{"type":23,"value":12034},{"type":17,"tag":84,"props":221182,"children":221183},{},[221184,221186,221191,221193,221196,221197,221203],{"type":23,"value":221185},"Have a ",{"type":17,"tag":48,"props":221187,"children":221188},{},[221189],{"type":23,"value":221190},"credit",{"type":23,"value":221192}," sign",{"type":17,"tag":3891,"props":221194,"children":221195},{},[],{"type":23,"value":221166},{"type":17,"tag":6121,"props":221198,"children":221200},{"className":221199},[],[221201],{"type":23,"value":221202},"total_amount \u003C 0",{"type":23,"value":12034},{"type":17,"tag":84,"props":221205,"children":221206},{},[221207,221209,221214,221216],{"type":23,"value":221208},"Use a ",{"type":17,"tag":48,"props":221210,"children":221211},{},[221212],{"type":23,"value":221213},"payment-like type",{"type":23,"value":221215}," (examples, not exhaustive):",{"type":17,"tag":80,"props":221217,"children":221218},{},[221219,221227,221235,221243],{"type":17,"tag":84,"props":221220,"children":221221},{},[221222],{"type":17,"tag":6121,"props":221223,"children":221225},{"className":221224},[],[221226],{"type":23,"value":220961},{"type":17,"tag":84,"props":221228,"children":221229},{},[221230],{"type":17,"tag":6121,"props":221231,"children":221233},{"className":221232},[],[221234],{"type":23,"value":220968},{"type":17,"tag":84,"props":221236,"children":221237},{},[221238],{"type":17,"tag":6121,"props":221239,"children":221241},{"className":221240},[],[221242],{"type":23,"value":129424},{"type":17,"tag":84,"props":221244,"children":221245},{},[221246],{"type":17,"tag":6121,"props":221247,"children":221249},{"className":221248},[],[221250],{"type":23,"value":220981},{"type":17,"tag":29,"props":221252,"children":221253},{},[221254,221256,221261,221263,221267],{"type":23,"value":221255},"Because providers vary, treat the ",{"type":17,"tag":6121,"props":221257,"children":221259},{"className":221258},[],[221260],{"type":23,"value":27310},{"type":23,"value":221262}," list as ",{"type":17,"tag":48,"props":221264,"children":221265},{},[221266],{"type":23,"value":19014},{"type":23,"value":221268},", not a closed set.",{"type":17,"tag":29,"props":221270,"children":221271},{},[221272],{"type":23,"value":221273},"Example filter:",{"type":17,"tag":6893,"props":221275,"children":221278},{"className":221276,"code":221277,"language":18718,"meta":7},[18716],"const customerPayments = transactions.filter(tx => {\n  const isCustomer = tx.contacts?.some(c => c.is_customer);\n  const isCredit = (tx.total_amount ?? 0) \u003C 0;\n  return isCustomer && isCredit;\n});\n",[221279],{"type":17,"tag":6121,"props":221280,"children":221281},{"__ignoreMap":7},[221282],{"type":23,"value":221277},{"type":17,"tag":68,"props":221284,"children":221286},{"id":221285},"step-6-scope-reconciliation-by-customer",[221287],{"type":23,"value":221288},"Step 6: Scope reconciliation by customer",{"type":17,"tag":29,"props":221290,"children":221291},{},[221292],{"type":23,"value":221293},"Invoices and transactions both reference customers.",{"type":17,"tag":6893,"props":221295,"children":221298},{"className":221296,"code":221297,"language":18718,"meta":7},[18716],"function byContactId\u003CT extends { contact_id?: string }>(\n  rows: T[],\n  contactId: string\n) {\n  return rows.filter(r => r.contact_id === contactId);\n}\n",[221299],{"type":17,"tag":6121,"props":221300,"children":221301},{"__ignoreMap":7},[221302],{"type":23,"value":221297},{"type":17,"tag":29,"props":221304,"children":221305},{},[221306,221307,221312],{"type":23,"value":154964},{"type":17,"tag":48,"props":221308,"children":221309},{},[221310],{"type":23,"value":221311},"per customer",{"type":23,"value":221313}," to avoid cross-account contamination.",{"type":17,"tag":68,"props":221315,"children":221317},{"id":221316},"step-7-match-payments-to-invoices-best-effort",[221318],{"type":23,"value":221319},"Step 7: Match payments to invoices (best-effort)",{"type":17,"tag":29,"props":221321,"children":221322},{},[221323,221325,221330],{"type":23,"value":221324},"Because there is no guaranteed foreign key, matching uses ",{"type":17,"tag":48,"props":221326,"children":221327},{},[221328],{"type":23,"value":221329},"documented fields only",{"type":23,"value":20456},{"type":17,"tag":239,"props":221332,"children":221334},{"id":221333},"safe-matching-signals",[221335],{"type":23,"value":221336},"Safe matching signals",{"type":17,"tag":80,"props":221338,"children":221339},{},[221340,221350,221366,221371],{"type":17,"tag":84,"props":221341,"children":221342},{},[221343,221348],{"type":17,"tag":6121,"props":221344,"children":221346},{"className":221345},[],[221347],{"type":23,"value":26302},{"type":23,"value":221349}," (must match)",{"type":17,"tag":84,"props":221351,"children":221352},{},[221353,221358,221359,221364],{"type":17,"tag":6121,"props":221354,"children":221356},{"className":221355},[],[221357],{"type":23,"value":220868},{"type":23,"value":26030},{"type":17,"tag":6121,"props":221360,"children":221362},{"className":221361},[],[221363],{"type":23,"value":220861},{"type":23,"value":221365}," (when present)",{"type":17,"tag":84,"props":221367,"children":221368},{},[221369],{"type":23,"value":221370},"Amount proximity",{"type":17,"tag":84,"props":221372,"children":221373},{},[221374,221376,221381,221383,221388],{"type":23,"value":221375},"Temporal proximity (",{"type":17,"tag":6121,"props":221377,"children":221379},{"className":221378},[],[221380],{"type":23,"value":33446},{"type":23,"value":221382}," vs ",{"type":17,"tag":6121,"props":221384,"children":221386},{"className":221385},[],[221387],{"type":23,"value":187822},{"type":23,"value":12034},{"type":17,"tag":239,"props":221390,"children":221392},{"id":221391},"matching-strategy",[221393],{"type":23,"value":221394},"Matching strategy",{"type":17,"tag":6154,"props":221396,"children":221397},{},[221398,221403],{"type":17,"tag":84,"props":221399,"children":221400},{},[221401],{"type":23,"value":221402},"Group invoices by customer.",{"type":17,"tag":84,"props":221404,"children":221405},{},[221406,221408],{"type":23,"value":221407},"For each invoice:\n",{"type":17,"tag":80,"props":221409,"children":221410},{},[221411,221423],{"type":17,"tag":84,"props":221412,"children":221413},{},[221414,221415,221421],{"type":23,"value":132873},{"type":17,"tag":6121,"props":221416,"children":221418},{"className":221417},[],[221419],{"type":23,"value":221420},"balance_amount === 0",{"type":23,"value":221422},", treat as settled.",{"type":17,"tag":84,"props":221424,"children":221425},{},[221426,221428],{"type":23,"value":221427},"Otherwise, look for customer payment transactions whose:\n",{"type":17,"tag":80,"props":221429,"children":221430},{},[221431,221436,221441],{"type":17,"tag":84,"props":221432,"children":221433},{},[221434],{"type":23,"value":221435},"credit magnitude aligns with invoice amount, and/or",{"type":17,"tag":84,"props":221437,"children":221438},{},[221439],{"type":23,"value":221440},"reference matches invoice reference/number, and/or",{"type":17,"tag":84,"props":221442,"children":221443},{},[221444,221446,221451,221453,221458],{"type":23,"value":221445},"timestamp falls after invoice ",{"type":17,"tag":6121,"props":221447,"children":221449},{"className":221448},[],[221450],{"type":23,"value":187836},{"type":23,"value":221452}," and before ",{"type":17,"tag":6121,"props":221454,"children":221456},{"className":221455},[],[221457],{"type":23,"value":187822},{"type":23,"value":54},{"type":17,"tag":29,"props":221460,"children":221461},{},[221462,221467,221469,221474,221475,221480],{"type":17,"tag":48,"props":221463,"children":221464},{},[221465],{"type":23,"value":221466},"Always",{"type":23,"value":221468}," trust the invoice's ",{"type":17,"tag":6121,"props":221470,"children":221472},{"className":221471},[],[221473],{"type":23,"value":220828},{"type":23,"value":34435},{"type":17,"tag":6121,"props":221476,"children":221478},{"className":221477},[],[221479],{"type":23,"value":19949},{"type":23,"value":221481}," over heuristic matches.",{"type":17,"tag":68,"props":221483,"children":221485},{"id":221484},"step-8-compute-ar-metrics",[221486],{"type":23,"value":221487},"Step 8: Compute AR metrics",{"type":17,"tag":239,"props":221489,"children":221491},{"id":221490},"open-ar",[221492],{"type":23,"value":221493},"Open AR",{"type":17,"tag":29,"props":221495,"children":221496},{},[221497,221499,221504],{"type":23,"value":221498},"Sum of ",{"type":17,"tag":6121,"props":221500,"children":221502},{"className":221501},[],[221503],{"type":23,"value":220828},{"type":23,"value":221505}," for all non-settled invoices.",{"type":17,"tag":6893,"props":221507,"children":221510},{"className":221508,"code":221509,"language":18718,"meta":7},[18716],"const openAR = invoices\n  .filter(inv => (inv.balance_amount ?? 0) > 0)\n  .reduce((sum, inv) => sum + (inv.balance_amount ?? 0), 0);\n",[221511],{"type":17,"tag":6121,"props":221512,"children":221513},{"__ignoreMap":7},[221514],{"type":23,"value":221509},{"type":17,"tag":239,"props":221516,"children":221518},{"id":221517},"paid-ar",[221519],{"type":23,"value":221520},"Paid AR",{"type":17,"tag":29,"props":221522,"children":221523},{},[221524,221525,221530],{"type":23,"value":221498},{"type":17,"tag":6121,"props":221526,"children":221528},{"className":221527},[],[221529],{"type":23,"value":220819},{"type":23,"value":221531}," across invoices (or derived from credits if needed).",{"type":17,"tag":239,"props":221533,"children":221535},{"id":221534},"partial-payments",[221536],{"type":23,"value":221537},"Partial payments",{"type":17,"tag":29,"props":221539,"children":221540},{},[221541,221543,221549,221550,221556],{"type":23,"value":221542},"Invoices with ",{"type":17,"tag":6121,"props":221544,"children":221546},{"className":221545},[],[221547],{"type":23,"value":221548},"paid_amount > 0",{"type":23,"value":34435},{"type":17,"tag":6121,"props":221551,"children":221553},{"className":221552},[],[221554],{"type":23,"value":221555},"balance_amount > 0",{"type":23,"value":54},{"type":17,"tag":239,"props":221558,"children":221560},{"id":221559},"credits-overpayments",[221561],{"type":23,"value":221562},"Credits / overpayments",{"type":17,"tag":29,"props":221564,"children":221565},{},[221566],{"type":23,"value":221567},"Invoices or credit transactions where:",{"type":17,"tag":80,"props":221569,"children":221570},{},[221571,221582],{"type":17,"tag":84,"props":221572,"children":221573},{},[221574,221580],{"type":17,"tag":6121,"props":221575,"children":221577},{"className":221576},[],[221578],{"type":23,"value":221579},"paid_amount > total_amount",{"type":23,"value":221581},", or",{"type":17,"tag":84,"props":221583,"children":221584},{},[221585],{"type":23,"value":221586},"credit transactions exist without a matching open invoice.",{"type":17,"tag":68,"props":221588,"children":221590},{"id":221589},"step-9-validate-against-accounts-receivable-balances-optional",[221591],{"type":23,"value":221592},"Step 9: Validate against Accounts Receivable balances (optional)",{"type":17,"tag":29,"props":221594,"children":221595},{},[221596],{"type":23,"value":221597},"AR accounts are identified by:",{"type":17,"tag":6893,"props":221599,"children":221602},{"className":221600,"code":221601,"language":18718,"meta":7},[18716],"type === 'ACCOUNTS_RECEIVABLE'\n",[221603],{"type":17,"tag":6121,"props":221604,"children":221605},{"__ignoreMap":7},[221606],{"type":23,"value":221601},{"type":17,"tag":29,"props":221608,"children":221609},{},[221610],{"type":23,"value":221611},"List accounts:",{"type":17,"tag":6893,"props":221613,"children":221615},{"className":221614,"code":219693,"language":18718,"meta":7},[18716],[221616],{"type":17,"tag":6121,"props":221617,"children":221618},{"__ignoreMap":7},[221619],{"type":23,"value":219693},{"type":17,"tag":29,"props":221621,"children":221622},{},[221623],{"type":23,"value":221624},"Compare:",{"type":17,"tag":80,"props":221626,"children":221627},{},[221628,221638],{"type":17,"tag":84,"props":221629,"children":221630},{},[221631,221636],{"type":17,"tag":48,"props":221632,"children":221633},{},[221634],{"type":23,"value":221635},"Computed open AR",{"type":23,"value":221637}," vs",{"type":17,"tag":84,"props":221639,"children":221640},{},[221641],{"type":17,"tag":48,"props":221642,"children":221643},{},[221644],{"type":23,"value":221645},"AR account balance",{"type":17,"tag":29,"props":221647,"children":221648},{},[221649],{"type":23,"value":221650},"Discrepancies can occur due to timing or provider posting rules; document them rather than forcing alignment.",{"type":17,"tag":68,"props":221652,"children":221654},{"id":221653},"step-10-validate-with-reports-optional-non-deprecated-fields-only",[221655],{"type":23,"value":221656},"Step 10: Validate with reports (optional, non-deprecated fields only)",{"type":17,"tag":239,"props":221658,"children":221659},{"id":220100},[221660],{"type":23,"value":220103},{"type":17,"tag":29,"props":221662,"children":221663},{},[221664],{"type":23,"value":221665},"Retrieve by ID:",{"type":17,"tag":6893,"props":221667,"children":221669},{"className":221668,"code":220118,"language":18718,"meta":7},[18716],[221670],{"type":17,"tag":6121,"props":221671,"children":221672},{"__ignoreMap":7},[221673],{"type":23,"value":220118},{"type":17,"tag":29,"props":221675,"children":221676},{},[221677],{"type":23,"value":220128},{"type":17,"tag":80,"props":221679,"children":221680},{},[221681,221689,221697,221705],{"type":17,"tag":84,"props":221682,"children":221683},{},[221684],{"type":17,"tag":6121,"props":221685,"children":221687},{"className":221686},[],[221688],{"type":23,"value":220140},{"type":17,"tag":84,"props":221690,"children":221691},{},[221692],{"type":17,"tag":6121,"props":221693,"children":221695},{"className":221694},[],[221696],{"type":23,"value":220149},{"type":17,"tag":84,"props":221698,"children":221699},{},[221700],{"type":17,"tag":6121,"props":221701,"children":221703},{"className":221702},[],[221704],{"type":23,"value":220158},{"type":17,"tag":84,"props":221706,"children":221707},{},[221708],{"type":17,"tag":6121,"props":221709,"children":221711},{"className":221710},[],[221712],{"type":23,"value":220167},{"type":17,"tag":29,"props":221714,"children":221715},{},[221716,221717,221721],{"type":23,"value":200135},{"type":17,"tag":48,"props":221718,"children":221719},{},[221720],{"type":23,"value":159475},{"type":23,"value":220177},{"type":17,"tag":239,"props":221723,"children":221725},{"id":221724},"balance-sheet-ar-snapshot",[221726],{"type":23,"value":221727},"Balance Sheet (AR snapshot)",{"type":17,"tag":29,"props":221729,"children":221730},{},[221731],{"type":23,"value":221665},{"type":17,"tag":6893,"props":221733,"children":221735},{"className":221734,"code":220187,"language":18718,"meta":7},[18716],[221736],{"type":17,"tag":6121,"props":221737,"children":221738},{"__ignoreMap":7},[221739],{"type":23,"value":220187},{"type":17,"tag":29,"props":221741,"children":221742},{},[221743],{"type":23,"value":95512},{"type":17,"tag":80,"props":221745,"children":221746},{},[221747,221757],{"type":17,"tag":84,"props":221748,"children":221749},{},[221750,221755],{"type":17,"tag":6121,"props":221751,"children":221753},{"className":221752},[],[221754],{"type":23,"value":220217},{"type":23,"value":221756}," filtered to AR accounts",{"type":17,"tag":84,"props":221758,"children":221759},{},[221760,221765],{"type":17,"tag":6121,"props":221761,"children":221763},{"className":221762},[],[221764],{"type":23,"value":220208},{"type":23,"value":221766}," (context)",{"type":17,"tag":29,"props":221768,"children":221769},{},[221770,221772,221776],{"type":23,"value":221771},"Reports ",{"type":17,"tag":48,"props":221773,"children":221774},{},[221775],{"type":23,"value":220285},{"type":23,"value":221777}," reconciliation; they do not replace transaction-based logic.",{"type":17,"tag":68,"props":221779,"children":221780},{"id":220290},[221781],{"type":23,"value":220293},{"type":17,"tag":80,"props":221783,"children":221784},{},[221785,221800,221808,221813],{"type":17,"tag":84,"props":221786,"children":221787},{},[221788,221789,221794,221795],{"type":23,"value":220301},{"type":17,"tag":6121,"props":221790,"children":221792},{"className":221791},[],[221793],{"type":23,"value":48389},{"type":23,"value":26030},{"type":17,"tag":6121,"props":221796,"children":221798},{"className":221797},[],[221799],{"type":23,"value":48411},{"type":17,"tag":84,"props":221801,"children":221802},{},[221803,221804],{"type":23,"value":220317},{"type":17,"tag":48,"props":221805,"children":221806},{},[221807],{"type":23,"value":219614},{"type":17,"tag":84,"props":221809,"children":221810},{},[221811],{"type":23,"value":221812},"Rate limits come from providers and Unified",{"type":17,"tag":84,"props":221814,"children":221815},{},[221816,221818],{"type":23,"value":221817},"Rate-limit errors return ",{"type":17,"tag":48,"props":221819,"children":221820},{},[221821],{"type":23,"value":220349},{"type":17,"tag":29,"props":221823,"children":221824},{},[221825,221829],{"type":17,"tag":48,"props":221826,"children":221827},{},[221828],{"type":23,"value":220355},{"type":23,"value":20456},{"type":17,"tag":80,"props":221831,"children":221832},{},[221833,221838,221842],{"type":17,"tag":84,"props":221834,"children":221835},{},[221836],{"type":23,"value":221837},"Exponential backoff with jitter",{"type":17,"tag":84,"props":221839,"children":221840},{},[221841],{"type":23,"value":159923},{"type":17,"tag":84,"props":221843,"children":221844},{},[221845],{"type":23,"value":220375},{"type":17,"tag":68,"props":221847,"children":221848},{"id":44585},[221849],{"type":23,"value":44588},{"type":17,"tag":29,"props":221851,"children":221852},{},[221853],{"type":23,"value":221854},"Using Unified's Accounting API, you can reconcile customer payments by:",{"type":17,"tag":80,"props":221856,"children":221857},{},[221858,221869,221879,221884,221902],{"type":17,"tag":84,"props":221859,"children":221860},{},[221861,221863,221867],{"type":23,"value":221862},"Treating ",{"type":17,"tag":48,"props":221864,"children":221865},{},[221866],{"type":23,"value":36676},{"type":23,"value":221868}," as the AR state",{"type":17,"tag":84,"props":221870,"children":221871},{},[221872,221873,221877],{"type":23,"value":221862},{"type":17,"tag":48,"props":221874,"children":221875},{},[221876],{"type":23,"value":82494},{"type":23,"value":221878}," as the ledger of payments",{"type":17,"tag":84,"props":221880,"children":221881},{},[221882],{"type":23,"value":221883},"Matching best-effort with documented fields",{"type":17,"tag":84,"props":221885,"children":221886},{},[221887,221889,221894,221895,221900],{"type":23,"value":221888},"Trusting invoice ",{"type":17,"tag":6121,"props":221890,"children":221892},{"className":221891},[],[221893],{"type":23,"value":220828},{"type":23,"value":34435},{"type":17,"tag":6121,"props":221896,"children":221898},{"className":221897},[],[221899],{"type":23,"value":19949},{"type":23,"value":221901}," as final",{"type":17,"tag":84,"props":221903,"children":221904},{},[221905],{"type":23,"value":221906},"Validating with AR accounts and non-deprecated reports",{"type":17,"tag":29,"props":221908,"children":221909},{},[221910],{"type":23,"value":221911},"The guiding rule is simple:",{"type":17,"tag":3414,"props":221913,"children":221914},{},[221915],{"type":17,"tag":29,"props":221916,"children":221917},{},[221918],{"type":23,"value":221919},"Invoices tell you what's owed. Transactions tell you what happened. Reconciliation connects the two—defensively.",{"type":17,"tag":29,"props":221921,"children":221922},{},[221923,221924],{"type":23,"value":1609},{"type":17,"tag":133,"props":221925,"children":221927},{"href":1612,"rel":221926},[214],[221928],{"type":23,"value":1616},{"type":17,"tag":29,"props":221930,"children":221931},{},[221932,221933],{"type":23,"value":1609},{"type":17,"tag":133,"props":221934,"children":221936},{"href":1623,"rel":221935},[214],[221937],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":221939},[221940,221941,221942,221943,221944,221948,221951,221952,221953,221954,221958,221964,221965,221969,221970],{"id":220572,"depth":1629,"text":220575},{"id":199540,"depth":1629,"text":199543},{"id":141798,"depth":1629,"text":141801},{"id":19743,"depth":1629,"text":19746},{"id":220778,"depth":1629,"text":220781,"children":221945},[221946,221947],{"id":220784,"depth":1635,"text":220787},{"id":220896,"depth":1635,"text":220899},{"id":221052,"depth":1629,"text":221055,"children":221949},[221950],{"id":219592,"depth":1635,"text":219595},{"id":221121,"depth":1629,"text":221124},{"id":221135,"depth":1629,"text":221138},{"id":221285,"depth":1629,"text":221288},{"id":221316,"depth":1629,"text":221319,"children":221955},[221956,221957],{"id":221333,"depth":1635,"text":221336},{"id":221391,"depth":1635,"text":221394},{"id":221484,"depth":1629,"text":221487,"children":221959},[221960,221961,221962,221963],{"id":221490,"depth":1635,"text":221493},{"id":221517,"depth":1635,"text":221520},{"id":221534,"depth":1635,"text":221537},{"id":221559,"depth":1635,"text":221562},{"id":221589,"depth":1629,"text":221592},{"id":221653,"depth":1629,"text":221656,"children":221966},[221967,221968],{"id":220100,"depth":1635,"text":220103},{"id":221724,"depth":1635,"text":221727},{"id":220290,"depth":1629,"text":220293},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_reconcile_customer_payments_ar_with_unified_accounting_api.md","blog/how_to_reconcile_customer_payments_ar_with_unified_accounting_api.md","blog/how_to_reconcile_customer_payments_ar_with_unified_accounting_api",{"_path":221975,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":221976,"description":221977,"img":221978,"date":220487,"tag":12,"body":221979,"_type":1677,"_id":223303,"_source":1679,"_file":223304,"_stem":223305,"_extension":1682},"/blog/how_to_reconcile_vendor_payments_ap_with_unified_accounting_api","How to Reconcile Vendor Payments (AP) with Unified's Accounting API","Accounts Payable reconciliation is often implemented backwards.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_reconcile_vendor_payments_ap_with_unified_accounting_api-icon.png",{"type":14,"children":221980,"toc":223274},[221981,221986,221989,221996,222000,222018,222023,222041,222046,222068,222073,222079,222090,222095,222100,222124,222128,222161,222165,222197,222201,222209,222213,222219,222231,222299,222304,222310,222322,222446,222454,222460,222469,222474,222509,222515,222520,222529,222535,222540,222548,222554,222559,222620,222655,222660,222669,222674,222680,222699,222704,222716,222721,222745,222750,222756,222761,222765,222824,222828,222840,222873,222908,222914,222920,222925,222934,222940,222945,222968,222972,222976,222995,223001,223006,223029,223035,223040,223052,223056,223064,223068,223086,223091,223097,223102,223111,223117,223169,223173,223178,223243,223248,223256,223265],{"type":17,"tag":18,"props":221982,"children":221984},{"id":221983},"how-to-reconcile-vendor-payments-ap-with-unifieds-accounting-api",[221985],{"type":23,"value":221976},{"type":17,"tag":25,"props":221987,"children":221988},{},[],{"type":17,"tag":29,"props":221990,"children":221991},{},[221992],{"type":17,"tag":33,"props":221993,"children":221994},{},[221995],{"type":23,"value":219187},{"type":17,"tag":29,"props":221997,"children":221998},{},[221999],{"type":23,"value":221977},{"type":17,"tag":29,"props":222001,"children":222002},{},[222003,222005,222010,222012,222017],{"type":23,"value":222004},"Teams start by looking for payment events—checks, ACHs, credit card charges—and try to infer AP state from them. That can work in a single accounting system, but it breaks as soon as you support multiple providers. Payment activity shows ",{"type":17,"tag":33,"props":222006,"children":222007},{},[222008],{"type":23,"value":222009},"movement",{"type":23,"value":222011},". AP is about ",{"type":17,"tag":33,"props":222013,"children":222014},{},[222015],{"type":23,"value":222016},"obligation",{"type":23,"value":54},{"type":17,"tag":29,"props":222019,"children":222020},{},[222021],{"type":23,"value":222022},"For PMs and backend teams, this creates immediate risk:",{"type":17,"tag":80,"props":222024,"children":222025},{},[222026,222031,222036],{"type":17,"tag":84,"props":222027,"children":222028},{},[222029],{"type":23,"value":222030},"Is AP driven by what was paid, or what the ledger still says is owed?",{"type":17,"tag":84,"props":222032,"children":222033},{},[222034],{"type":23,"value":222035},"How do partial payments, vendor credits, and overpayments actually surface?",{"type":17,"tag":84,"props":222037,"children":222038},{},[222039],{"type":23,"value":222040},"Which number should users trust when bills and transactions don't line up perfectly?",{"type":17,"tag":29,"props":222042,"children":222043},{},[222044],{"type":23,"value":222045},"When AP logic is built on payment-like transactions alone, edge cases accumulate fast. Bills appear unpaid even after payments. Credits drift. Vendor balances become hard to explain.",{"type":17,"tag":29,"props":222047,"children":222048},{},[222049,222050,222054,222056,222061,222062,222066],{"type":23,"value":25244},{"type":17,"tag":133,"props":222051,"children":222052},{"href":82425},[222053],{"type":23,"value":128616},{"type":23,"value":222055}," is designed to anchor AP reconciliation where it belongs: in the general ledger. In Unified Accounting, ",{"type":17,"tag":48,"props":222057,"children":222058},{},[222059],{"type":23,"value":222060},"bills define what you owe",{"type":23,"value":12561},{"type":17,"tag":48,"props":222063,"children":222064},{},[222065],{"type":23,"value":220562},{"type":23,"value":222067},". Vendor payments are not a separate first-class object—they are ledger entries that must be interpreted in context.",{"type":17,"tag":29,"props":222069,"children":222070},{},[222071],{"type":23,"value":222072},"This guide shows how to reconcile AP defensively using that model—combining bills, transactions, contacts, and accounts, matching payments best-effort using documented fields only, and treating bill balances as the final authority—so your AP logic stays correct across accounting systems.",{"type":17,"tag":68,"props":222074,"children":222076},{"id":222075},"why-ap-reconciliation-lives-in-accounting-not-payments",[222077],{"type":23,"value":222078},"Why AP reconciliation lives in Accounting (not Payments)",{"type":17,"tag":29,"props":222080,"children":222081},{},[222082,222084,222088],{"type":23,"value":222083},"Unified has a separate ",{"type":17,"tag":48,"props":222085,"children":222086},{},[222087],{"type":23,"value":11737},{"type":23,"value":222089}," API category for payment processor events (Stripe/Square/etc.). That is not what AP is.",{"type":17,"tag":29,"props":222091,"children":222092},{},[222093],{"type":23,"value":222094},"AP reconciliation is a ledger problem: 'what does the accounting system say we owe and have paid?'",{"type":17,"tag":29,"props":222096,"children":222097},{},[222098],{"type":23,"value":222099},"So for AP, you use:",{"type":17,"tag":80,"props":222101,"children":222102},{},[222103,222114],{"type":17,"tag":84,"props":222104,"children":222105},{},[222106,222112],{"type":17,"tag":6121,"props":222107,"children":222109},{"className":222108},[],[222110],{"type":23,"value":222111},"AccountingBill",{"type":23,"value":222113}," for vendor obligations",{"type":17,"tag":84,"props":222115,"children":222116},{},[222117,222122],{"type":17,"tag":6121,"props":222118,"children":222120},{"className":222119},[],[222121],{"type":23,"value":219463},{"type":23,"value":222123}," for payment events and ledger movement",{"type":17,"tag":68,"props":222125,"children":222126},{"id":199540},[222127],{"type":23,"value":199543},{"type":17,"tag":80,"props":222129,"children":222130},{},[222131,222141,222146,222151,222156],{"type":17,"tag":84,"props":222132,"children":222133},{},[222134,222136,222140],{"type":23,"value":222135},"Listing bills and transactions with ",{"type":17,"tag":133,"props":222137,"children":222138},{"href":1857},[222139],{"type":23,"value":1860},{"type":23,"value":220698},{"type":17,"tag":84,"props":222142,"children":222143},{},[222144],{"type":23,"value":222145},"Identifying vendor payment transactions",{"type":17,"tag":84,"props":222147,"children":222148},{},[222149],{"type":23,"value":222150},"Matching vendor payments to bills (best-effort, doc-accurate)",{"type":17,"tag":84,"props":222152,"children":222153},{},[222154],{"type":23,"value":222155},"Computing open AP, paid AP, partials, and vendor credits",{"type":17,"tag":84,"props":222157,"children":222158},{},[222159],{"type":23,"value":222160},"Validating against AP accounts (optional)",{"type":17,"tag":68,"props":222162,"children":222163},{"id":141798},[222164],{"type":23,"value":141801},{"type":17,"tag":80,"props":222166,"children":222167},{},[222168,222172,222176,222180,222189],{"type":17,"tag":84,"props":222169,"children":222170},{},[222171],{"type":23,"value":219393},{"type":17,"tag":84,"props":222173,"children":222174},{},[222175],{"type":23,"value":219398},{"type":17,"tag":84,"props":222177,"children":222178},{},[222179],{"type":23,"value":219403},{"type":17,"tag":84,"props":222181,"children":222182},{},[222183,222184],{"type":23,"value":219408},{"type":17,"tag":6121,"props":222185,"children":222187},{"className":222186},[],[222188],{"type":23,"value":19766},{"type":17,"tag":84,"props":222190,"children":222191},{},[222192,222196],{"type":17,"tag":133,"props":222193,"children":222194},{"href":7691},[222195],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":68,"props":222198,"children":222199},{"id":19743},[222200],{"type":23,"value":19746},{"type":17,"tag":6893,"props":222202,"children":222204},{"className":222203,"code":219429,"language":18718,"meta":7},[18716],[222205],{"type":17,"tag":6121,"props":222206,"children":222207},{"__ignoreMap":7},[222208],{"type":23,"value":219429},{"type":17,"tag":68,"props":222210,"children":222211},{"id":220778},[222212],{"type":23,"value":220781},{"type":17,"tag":239,"props":222214,"children":222216},{"id":222215},"bills-represent-what-you-owe",[222217],{"type":23,"value":222218},"Bills represent 'what you owe'",{"type":17,"tag":29,"props":222220,"children":222221},{},[222222,222224,222229],{"type":23,"value":222223},"Bills (",{"type":17,"tag":6121,"props":222225,"children":222227},{"className":222226},[],[222228],{"type":23,"value":222111},{"type":23,"value":222230},") provide the AP state you care about:",{"type":17,"tag":80,"props":222232,"children":222233},{},[222234,222242,222250,222258,222266,222280,222290],{"type":17,"tag":84,"props":222235,"children":222236},{},[222237],{"type":17,"tag":6121,"props":222238,"children":222240},{"className":222239},[],[222241],{"type":23,"value":219481},{"type":17,"tag":84,"props":222243,"children":222244},{},[222245],{"type":17,"tag":6121,"props":222246,"children":222248},{"className":222247},[],[222249],{"type":23,"value":220819},{"type":17,"tag":84,"props":222251,"children":222252},{},[222253],{"type":17,"tag":6121,"props":222254,"children":222256},{"className":222255},[],[222257],{"type":23,"value":220828},{"type":17,"tag":84,"props":222259,"children":222260},{},[222261],{"type":17,"tag":6121,"props":222262,"children":222264},{"className":222263},[],[222265],{"type":23,"value":19949},{"type":17,"tag":84,"props":222267,"children":222268},{},[222269,222274,222275],{"type":17,"tag":6121,"props":222270,"children":222272},{"className":222271},[],[222273],{"type":23,"value":124766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":222276,"children":222278},{"className":222277},[],[222279],{"type":23,"value":187822},{"type":17,"tag":84,"props":222281,"children":222282},{},[222283,222288],{"type":17,"tag":6121,"props":222284,"children":222286},{"className":222285},[],[222287],{"type":23,"value":26302},{"type":23,"value":222289}," (vendor)",{"type":17,"tag":84,"props":222291,"children":222292},{},[222293],{"type":17,"tag":6121,"props":222294,"children":222296},{"className":222295},[],[222297],{"type":23,"value":222298},"bill_number",{"type":17,"tag":29,"props":222300,"children":222301},{},[222302],{"type":23,"value":222303},"Bills are the authoritative 'owed vs paid' state.",{"type":17,"tag":239,"props":222305,"children":222307},{"id":222306},"transactions-represent-what-happened",[222308],{"type":23,"value":222309},"Transactions represent 'what happened'",{"type":17,"tag":29,"props":222311,"children":222312},{},[222313,222315,222320],{"type":23,"value":222314},"Transactions (",{"type":17,"tag":6121,"props":222316,"children":222318},{"className":222317},[],[222319],{"type":23,"value":219463},{"type":23,"value":222321},") are ledger records with key semantics:",{"type":17,"tag":80,"props":222323,"children":222324},{},[222325,222350,222415,222429,222437],{"type":17,"tag":84,"props":222326,"children":222327},{},[222328,222333],{"type":17,"tag":6121,"props":222329,"children":222331},{"className":222330},[],[222332],{"type":23,"value":219481},{"type":17,"tag":80,"props":222334,"children":222335},{},[222336,222343],{"type":17,"tag":84,"props":222337,"children":222338},{},[222339],{"type":17,"tag":48,"props":222340,"children":222341},{},[222342],{"type":23,"value":219492},{"type":17,"tag":84,"props":222344,"children":222345},{},[222346],{"type":17,"tag":48,"props":222347,"children":222348},{},[222349],{"type":23,"value":219500},{"type":17,"tag":84,"props":222351,"children":222352},{},[222353,222358,222360],{"type":17,"tag":6121,"props":222354,"children":222356},{"className":222355},[],[222357],{"type":23,"value":27310},{"type":23,"value":222359}," includes examples like:\n",{"type":17,"tag":80,"props":222361,"children":222362},{},[222363,222372,222381,222390,222399],{"type":17,"tag":84,"props":222364,"children":222365},{},[222366],{"type":17,"tag":6121,"props":222367,"children":222369},{"className":222368},[],[222370],{"type":23,"value":222371},"BillPaymentCheck",{"type":17,"tag":84,"props":222373,"children":222374},{},[222375],{"type":17,"tag":6121,"props":222376,"children":222378},{"className":222377},[],[222379],{"type":23,"value":222380},"BillPaymentCreditCard",{"type":17,"tag":84,"props":222382,"children":222383},{},[222384],{"type":17,"tag":6121,"props":222385,"children":222387},{"className":222386},[],[222388],{"type":23,"value":222389},"VendorCredit",{"type":17,"tag":84,"props":222391,"children":222392},{},[222393],{"type":17,"tag":6121,"props":222394,"children":222396},{"className":222395},[],[222397],{"type":23,"value":222398},"Credit",{"type":17,"tag":84,"props":222400,"children":222401},{},[222402,222407,222408,222413],{"type":17,"tag":6121,"props":222403,"children":222405},{"className":222404},[],[222406],{"type":23,"value":219864},{"type":23,"value":11826},{"type":17,"tag":6121,"props":222409,"children":222411},{"className":222410},[],[222412],{"type":23,"value":219871},{"type":23,"value":222414}," (noise for AP)",{"type":17,"tag":84,"props":222416,"children":222417},{},[222418,222423,222424],{"type":17,"tag":6121,"props":222419,"children":222421},{"className":222420},[],[222422],{"type":23,"value":220991},{"type":23,"value":120761},{"type":17,"tag":6121,"props":222425,"children":222427},{"className":222426},[],[222428],{"type":23,"value":221006},{"type":17,"tag":84,"props":222430,"children":222431},{},[222432],{"type":17,"tag":6121,"props":222433,"children":222435},{"className":222434},[],[222436],{"type":23,"value":184840},{"type":17,"tag":84,"props":222438,"children":222439},{},[222440],{"type":17,"tag":6121,"props":222441,"children":222443},{"className":222442},[],[222444],{"type":23,"value":222445},"payment_method",{"type":17,"tag":3414,"props":222447,"children":222448},{},[222449],{"type":17,"tag":29,"props":222450,"children":222451},{},[222452],{"type":23,"value":222453},"Important: Unified docs do not guarantee a direct bill↔transaction foreign key. So reconciliation is best-effort matching, with bill balance_amount as the final authority.",{"type":17,"tag":68,"props":222455,"children":222457},{"id":222456},"step-3-list-bills-what-was-owed",[222458],{"type":23,"value":222459},"Step 3: List bills (what was owed)",{"type":17,"tag":6893,"props":222461,"children":222464},{"className":222462,"code":222463,"language":18718,"meta":7},[18716],"const bills = await sdk.accounting.listAccountingBills({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-22T23:41:33.305Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  contact_id: '',\n  org_id: '',\n  fields: '',\n  raw: '',\n});\n",[222465],{"type":17,"tag":6121,"props":222466,"children":222467},{"__ignoreMap":7},[222468],{"type":23,"value":222463},{"type":17,"tag":29,"props":222470,"children":222471},{},[222472],{"type":23,"value":222473},"Pagination rules:",{"type":17,"tag":80,"props":222475,"children":222476},{},[222477,222488,222498],{"type":17,"tag":84,"props":222478,"children":222479},{},[222480,222481,222486],{"type":23,"value":219603},{"type":17,"tag":6121,"props":222482,"children":222484},{"className":222483},[],[222485],{"type":23,"value":48389},{"type":23,"value":222487},": 100",{"type":17,"tag":84,"props":222489,"children":222490},{},[222491,222493],{"type":23,"value":222492},"Uses ",{"type":17,"tag":6121,"props":222494,"children":222496},{"className":222495},[],[222497],{"type":23,"value":48411},{"type":17,"tag":84,"props":222499,"children":222500},{},[222501,222503],{"type":23,"value":222502},"Stop when returned results ",{"type":17,"tag":6121,"props":222504,"children":222506},{"className":222505},[],[222507],{"type":23,"value":222508},"\u003C limit",{"type":17,"tag":68,"props":222510,"children":222512},{"id":222511},"step-4-retrieve-a-single-bill-optional",[222513],{"type":23,"value":222514},"Step 4: Retrieve a single bill (optional)",{"type":17,"tag":29,"props":222516,"children":222517},{},[222518],{"type":23,"value":222519},"Useful for verifying results or refreshing state after matching.",{"type":17,"tag":6893,"props":222521,"children":222524},{"className":222522,"code":222523,"language":18718,"meta":7},[18716],"const bill = await sdk.accounting.getAccountingBill({\n  connectionId,\n  id: billId,\n  fields: '',\n  raw: '',\n});\n",[222525],{"type":17,"tag":6121,"props":222526,"children":222527},{"__ignoreMap":7},[222528],{"type":23,"value":222523},{"type":17,"tag":68,"props":222530,"children":222532},{"id":222531},"step-5-list-transactions-what-actually-hit-the-ledger",[222533],{"type":23,"value":222534},"Step 5: List transactions (what actually hit the ledger)",{"type":17,"tag":29,"props":222536,"children":222537},{},[222538],{"type":23,"value":222539},"(Uses the same list endpoint you used in your runway post.)",{"type":17,"tag":6893,"props":222541,"children":222543},{"className":222542,"code":219584,"language":18718,"meta":7},[18716],[222544],{"type":17,"tag":6121,"props":222545,"children":222546},{"__ignoreMap":7},[222547],{"type":23,"value":219584},{"type":17,"tag":68,"props":222549,"children":222551},{"id":222550},"step-6-identify-vendor-payment-transactions",[222552],{"type":23,"value":222553},"Step 6: Identify vendor payment transactions",{"type":17,"tag":29,"props":222555,"children":222556},{},[222557],{"type":23,"value":222558},"Vendor payments surface as transactions that:",{"type":17,"tag":6154,"props":222560,"children":222561},{},[222562,222585,222608],{"type":17,"tag":84,"props":222563,"children":222564},{},[222565,222567,222570,222571,222576,222578,222584],{"type":23,"value":222566},"reference a vendor",{"type":17,"tag":3891,"props":222568,"children":222569},{},[],{"type":23,"value":221166},{"type":17,"tag":6121,"props":222572,"children":222574},{"className":222573},[],[222575],{"type":23,"value":220991},{"type":23,"value":222577}," contains an entry where ",{"type":17,"tag":6121,"props":222579,"children":222581},{"className":222580},[],[222582],{"type":23,"value":222583},"is_supplier === true",{"type":23,"value":12034},{"type":17,"tag":84,"props":222586,"children":222587},{},[222588,222590,222593,222595,222599,222601,222606],{"type":23,"value":222589},"represent an outflow / AP reduction",{"type":17,"tag":3891,"props":222591,"children":222592},{},[],{"type":23,"value":222594},"(typically ",{"type":17,"tag":48,"props":222596,"children":222597},{},[222598],{"type":23,"value":221190},{"type":23,"value":222600}," entries: ",{"type":17,"tag":6121,"props":222602,"children":222604},{"className":222603},[],[222605],{"type":23,"value":221202},{"type":23,"value":222607},", but provider accounting can vary)",{"type":17,"tag":84,"props":222609,"children":222610},{},[222611,222613,222618],{"type":23,"value":222612},"have a payment-like ",{"type":17,"tag":6121,"props":222614,"children":222616},{"className":222615},[],[222617],{"type":23,"value":27310},{"type":23,"value":222619}," (examples, non-exhaustive):",{"type":17,"tag":80,"props":222621,"children":222622},{},[222623,222631,222639,222647],{"type":17,"tag":84,"props":222624,"children":222625},{},[222626],{"type":17,"tag":6121,"props":222627,"children":222629},{"className":222628},[],[222630],{"type":23,"value":222371},{"type":17,"tag":84,"props":222632,"children":222633},{},[222634],{"type":17,"tag":6121,"props":222635,"children":222637},{"className":222636},[],[222638],{"type":23,"value":222380},{"type":17,"tag":84,"props":222640,"children":222641},{},[222642],{"type":17,"tag":6121,"props":222643,"children":222645},{"className":222644},[],[222646],{"type":23,"value":222389},{"type":17,"tag":84,"props":222648,"children":222649},{},[222650],{"type":17,"tag":6121,"props":222651,"children":222653},{"className":222652},[],[222654],{"type":23,"value":222398},{"type":17,"tag":29,"props":222656,"children":222657},{},[222658],{"type":23,"value":222659},"Filter example:",{"type":17,"tag":6893,"props":222661,"children":222664},{"className":222662,"code":222663,"language":18718,"meta":7},[18716],"const vendorPayments = transactions.filter(tx => {\n  const isSupplier = tx.contacts?.some(c => c.is_supplier);\n  if (!isSupplier) return false;\n\n  const type = tx.type || '';\n  const looksLikeAPPayment =\n    type.includes('BillPayment') ||\n    type === 'VendorCredit' ||\n    type === 'Credit';\n\n  return looksLikeAPPayment;\n});\n",[222665],{"type":17,"tag":6121,"props":222666,"children":222667},{"__ignoreMap":7},[222668],{"type":23,"value":222663},{"type":17,"tag":29,"props":222670,"children":222671},{},[222672],{"type":23,"value":222673},"This avoids hard-coding a closed list of types while still using documented examples.",{"type":17,"tag":68,"props":222675,"children":222677},{"id":222676},"step-7-scope-reconciliation-by-vendor",[222678],{"type":23,"value":222679},"Step 7: Scope reconciliation by vendor",{"type":17,"tag":29,"props":222681,"children":222682},{},[222683,222685,222690,222692,222697],{"type":23,"value":222684},"Bills and transactions both relate to a vendor via ",{"type":17,"tag":6121,"props":222686,"children":222688},{"className":222687},[],[222689],{"type":23,"value":26302},{"type":23,"value":222691}," (bills) and ",{"type":17,"tag":6121,"props":222693,"children":222695},{"className":222694},[],[222696],{"type":23,"value":220991},{"type":23,"value":222698}," (transactions).",{"type":17,"tag":29,"props":222700,"children":222701},{},[222702],{"type":23,"value":222703},"Bills:",{"type":17,"tag":80,"props":222705,"children":222706},{},[222707],{"type":17,"tag":84,"props":222708,"children":222709},{},[222710],{"type":17,"tag":6121,"props":222711,"children":222713},{"className":222712},[],[222714],{"type":23,"value":222715},"bill.contact_id",{"type":17,"tag":29,"props":222717,"children":222718},{},[222719],{"type":23,"value":222720},"Transactions:",{"type":17,"tag":80,"props":222722,"children":222723},{},[222724,222735],{"type":17,"tag":84,"props":222725,"children":222726},{},[222727,222733],{"type":17,"tag":6121,"props":222728,"children":222730},{"className":222729},[],[222731],{"type":23,"value":222732},"tx.contacts[].id",{"type":23,"value":222734}," (vendor id)",{"type":17,"tag":84,"props":222736,"children":222737},{},[222738,222740],{"type":23,"value":222739},"plus ",{"type":17,"tag":6121,"props":222741,"children":222743},{"className":222742},[],[222744],{"type":23,"value":221006},{"type":17,"tag":29,"props":222746,"children":222747},{},[222748],{"type":23,"value":222749},"Reconcile per vendor to avoid cross-contamination.",{"type":17,"tag":68,"props":222751,"children":222753},{"id":222752},"step-8-match-payments-to-bills-best-effort",[222754],{"type":23,"value":222755},"Step 8: Match payments to bills (best-effort)",{"type":17,"tag":29,"props":222757,"children":222758},{},[222759],{"type":23,"value":222760},"Because there is no guaranteed foreign key, matching uses only documented fields:",{"type":17,"tag":239,"props":222762,"children":222763},{"id":221333},[222764],{"type":23,"value":221336},{"type":17,"tag":80,"props":222766,"children":222767},{},[222768,222786,222791,222814],{"type":17,"tag":84,"props":222769,"children":222770},{},[222771,222773,222778,222780,222785],{"type":23,"value":222772},"Vendor identity (",{"type":17,"tag":6121,"props":222774,"children":222776},{"className":222775},[],[222777],{"type":23,"value":26302},{"type":23,"value":222779}," vs transaction contact ",{"type":17,"tag":6121,"props":222781,"children":222783},{"className":222782},[],[222784],{"type":23,"value":18766},{"type":23,"value":12034},{"type":17,"tag":84,"props":222787,"children":222788},{},[222789],{"type":23,"value":222790},"Amount proximity (credit magnitude vs bill balance)",{"type":17,"tag":84,"props":222792,"children":222793},{},[222794,222796,222801,222802,222807,222808,222813],{"type":23,"value":222795},"Time proximity (",{"type":17,"tag":6121,"props":222797,"children":222799},{"className":222798},[],[222800],{"type":23,"value":33446},{"type":23,"value":26030},{"type":17,"tag":6121,"props":222803,"children":222805},{"className":222804},[],[222806],{"type":23,"value":25337},{"type":23,"value":221382},{"type":17,"tag":6121,"props":222809,"children":222811},{"className":222810},[],[222812],{"type":23,"value":187822},{"type":23,"value":12034},{"type":17,"tag":84,"props":222815,"children":222816},{},[222817,222822],{"type":17,"tag":6121,"props":222818,"children":222820},{"className":222819},[],[222821],{"type":23,"value":220868},{"type":23,"value":222823}," fields where present",{"type":17,"tag":239,"props":222825,"children":222826},{"id":221391},[222827],{"type":23,"value":221394},{"type":17,"tag":29,"props":222829,"children":222830},{},[222831,222833,222838],{"type":23,"value":222832},"For each open bill (",{"type":17,"tag":6121,"props":222834,"children":222836},{"className":222835},[],[222837],{"type":23,"value":221555},{"type":23,"value":222839},"):",{"type":17,"tag":80,"props":222841,"children":222842},{},[222843],{"type":17,"tag":84,"props":222844,"children":222845},{},[222846,222848],{"type":23,"value":222847},"find vendor payment transactions with:\n",{"type":17,"tag":80,"props":222849,"children":222850},{},[222851,222856,222861],{"type":17,"tag":84,"props":222852,"children":222853},{},[222854],{"type":23,"value":222855},"same vendor",{"type":17,"tag":84,"props":222857,"children":222858},{},[222859],{"type":23,"value":222860},"payment amount close to balance or total",{"type":17,"tag":84,"props":222862,"children":222863},{},[222864,222866,222871],{"type":23,"value":222865},"timestamp near bill ",{"type":17,"tag":6121,"props":222867,"children":222869},{"className":222868},[],[222870],{"type":23,"value":187822},{"type":23,"value":222872}," or within a payment window",{"type":17,"tag":29,"props":222874,"children":222875},{},[222876,222881,222882,222890,222891,222895,222896,222906],{"type":17,"tag":48,"props":222877,"children":222878},{},[222879],{"type":23,"value":222880},"Final truth remains bill",{"type":23,"value":18757},{"type":17,"tag":48,"props":222883,"children":222884},{},[222885],{"type":17,"tag":6121,"props":222886,"children":222888},{"className":222887},[],[222889],{"type":23,"value":220828},{"type":23,"value":18757},{"type":17,"tag":48,"props":222892,"children":222893},{},[222894],{"type":23,"value":48975},{"type":23,"value":18757},{"type":17,"tag":48,"props":222897,"children":222898},{},[222899,222904],{"type":17,"tag":6121,"props":222900,"children":222902},{"className":222901},[],[222903],{"type":23,"value":19949},{"type":23,"value":222905},"****.",{"type":23,"value":222907}," If those don't change, you should treat the bill as unpaid even if you see a payment-like transaction.",{"type":17,"tag":68,"props":222909,"children":222911},{"id":222910},"step-9-compute-ap-metrics",[222912],{"type":23,"value":222913},"Step 9: Compute AP metrics",{"type":17,"tag":239,"props":222915,"children":222917},{"id":222916},"open-ap",[222918],{"type":23,"value":222919},"Open AP",{"type":17,"tag":29,"props":222921,"children":222922},{},[222923],{"type":23,"value":222924},"Sum of bill balances that are still owed:",{"type":17,"tag":6893,"props":222926,"children":222929},{"className":222927,"code":222928,"language":18718,"meta":7},[18716],"const openAP = bills\n  .filter(b => (b.balance_amount ?? 0) > 0)\n  .reduce((sum, b) => sum + (b.balance_amount ?? 0), 0);\n",[222930],{"type":17,"tag":6121,"props":222931,"children":222932},{"__ignoreMap":7},[222933],{"type":23,"value":222928},{"type":17,"tag":239,"props":222935,"children":222937},{"id":222936},"paid-ap",[222938],{"type":23,"value":222939},"Paid AP",{"type":17,"tag":29,"props":222941,"children":222942},{},[222943],{"type":23,"value":222944},"Bills where:",{"type":17,"tag":80,"props":222946,"children":222947},{},[222948,222958],{"type":17,"tag":84,"props":222949,"children":222950},{},[222951,222956],{"type":17,"tag":6121,"props":222952,"children":222954},{"className":222953},[],[222955],{"type":23,"value":221548},{"type":23,"value":222957}," and/or",{"type":17,"tag":84,"props":222959,"children":222960},{},[222961,222966],{"type":17,"tag":6121,"props":222962,"children":222964},{"className":222963},[],[222965],{"type":23,"value":19949},{"type":23,"value":222967}," indicates paid or partially paid",{"type":17,"tag":239,"props":222969,"children":222970},{"id":221534},[222971],{"type":23,"value":221537},{"type":17,"tag":29,"props":222973,"children":222974},{},[222975],{"type":23,"value":222944},{"type":17,"tag":80,"props":222977,"children":222978},{},[222979,222987],{"type":17,"tag":84,"props":222980,"children":222981},{},[222982],{"type":17,"tag":6121,"props":222983,"children":222985},{"className":222984},[],[222986],{"type":23,"value":221548},{"type":17,"tag":84,"props":222988,"children":222989},{},[222990],{"type":17,"tag":6121,"props":222991,"children":222993},{"className":222992},[],[222994],{"type":23,"value":221555},{"type":17,"tag":239,"props":222996,"children":222998},{"id":222997},"vendor-credits",[222999],{"type":23,"value":223000},"Vendor credits",{"type":17,"tag":29,"props":223002,"children":223003},{},[223004],{"type":23,"value":223005},"Handled as:",{"type":17,"tag":80,"props":223007,"children":223008},{},[223009,223019,223024],{"type":17,"tag":84,"props":223010,"children":223011},{},[223012,223014],{"type":23,"value":223013},"transactions like ",{"type":17,"tag":6121,"props":223015,"children":223017},{"className":223016},[],[223018],{"type":23,"value":222389},{"type":17,"tag":84,"props":223020,"children":223021},{},[223022],{"type":23,"value":223023},"bills with refund amounts",{"type":17,"tag":84,"props":223025,"children":223026},{},[223027],{"type":23,"value":223028},"or bills whose paid amount exceeds expected",{"type":17,"tag":68,"props":223030,"children":223032},{"id":223031},"step-10-validate-with-ap-accounts-optional",[223033],{"type":23,"value":223034},"Step 10: Validate with AP accounts (optional)",{"type":17,"tag":29,"props":223036,"children":223037},{},[223038],{"type":23,"value":223039},"If you want a secondary sanity check, validate open AP against accounts typed as:",{"type":17,"tag":80,"props":223041,"children":223042},{},[223043],{"type":17,"tag":84,"props":223044,"children":223045},{},[223046],{"type":17,"tag":6121,"props":223047,"children":223049},{"className":223048},[],[223050],{"type":23,"value":223051},"ACCOUNTS_PAYABLE",{"type":17,"tag":29,"props":223053,"children":223054},{},[223055],{"type":23,"value":221611},{"type":17,"tag":6893,"props":223057,"children":223059},{"className":223058,"code":219693,"language":18718,"meta":7},[18716],[223060],{"type":17,"tag":6121,"props":223061,"children":223062},{"__ignoreMap":7},[223063],{"type":23,"value":219693},{"type":17,"tag":29,"props":223065,"children":223066},{},[223067],{"type":23,"value":221624},{"type":17,"tag":80,"props":223069,"children":223070},{},[223071,223081],{"type":17,"tag":84,"props":223072,"children":223073},{},[223074,223076,223079],{"type":23,"value":223075},"computed open AP",{"type":17,"tag":3891,"props":223077,"children":223078},{},[],{"type":23,"value":223080},"vs",{"type":17,"tag":84,"props":223082,"children":223083},{},[223084],{"type":23,"value":223085},"AP account balance",{"type":17,"tag":29,"props":223087,"children":223088},{},[223089],{"type":23,"value":223090},"Discrepancies can occur due to provider posting rules and timing. Don't force equality.",{"type":17,"tag":68,"props":223092,"children":223094},{"id":223093},"updating-bills-optional",[223095],{"type":23,"value":223096},"Updating bills (optional)",{"type":17,"tag":29,"props":223098,"children":223099},{},[223100],{"type":23,"value":223101},"Updating bills exists, but should be used carefully because providers may restrict updates based on bill lifecycle.",{"type":17,"tag":6893,"props":223103,"children":223106},{"className":223104,"code":223105,"language":18718,"meta":7},[18716],"const updated = await sdk.accounting.updateAccountingBill({\n  connectionId,\n  id: billId,\n  accountingBill: { notes: 'Updated notes' },\n  fields: '',\n  raw: '',\n});\n",[223107],{"type":17,"tag":6121,"props":223108,"children":223109},{"__ignoreMap":7},[223110],{"type":23,"value":223105},{"type":17,"tag":68,"props":223112,"children":223114},{"id":223113},"rate-limits-pagination-and-reliability",[223115],{"type":23,"value":223116},"Rate limits, pagination, and reliability",{"type":17,"tag":80,"props":223118,"children":223119},{},[223120,223135,223140,223150,223159,223164],{"type":17,"tag":84,"props":223121,"children":223122},{},[223123,223124,223129,223130],{"type":23,"value":220301},{"type":17,"tag":6121,"props":223125,"children":223127},{"className":223126},[],[223128],{"type":23,"value":48389},{"type":23,"value":34435},{"type":17,"tag":6121,"props":223131,"children":223133},{"className":223132},[],[223134],{"type":23,"value":48411},{"type":17,"tag":84,"props":223136,"children":223137},{},[223138],{"type":23,"value":223139},"Default max is 100 records per request",{"type":17,"tag":84,"props":223141,"children":223142},{},[223143,223144,223149],{"type":23,"value":33722},{"type":17,"tag":6121,"props":223145,"children":223147},{"className":223146},[],[223148],{"type":23,"value":26291},{"type":23,"value":161412},{"type":17,"tag":84,"props":223151,"children":223152},{},[223153,223155],{"type":23,"value":223154},"Rate limits return ",{"type":17,"tag":48,"props":223156,"children":223157},{},[223158],{"type":23,"value":220349},{"type":17,"tag":84,"props":223160,"children":223161},{},[223162],{"type":23,"value":223163},"Use exponential backoff + jitter for retries",{"type":17,"tag":84,"props":223165,"children":223166},{},[223167],{"type":23,"value":223168},"For continuous sync, prefer webhooks rather than polling",{"type":17,"tag":68,"props":223170,"children":223171},{"id":44585},[223172],{"type":23,"value":44588},{"type":17,"tag":29,"props":223174,"children":223175},{},[223176],{"type":23,"value":223177},"Using Unified's Accounting API, you can reconcile vendor payments by:",{"type":17,"tag":80,"props":223179,"children":223180},{},[223181,223210,223233,223238],{"type":17,"tag":84,"props":223182,"children":223183},{},[223184,223186,223190,223192,223197,223198,223203,223204,223209],{"type":23,"value":223185},"treating ",{"type":17,"tag":48,"props":223187,"children":223188},{},[223189],{"type":23,"value":82475},{"type":23,"value":223191}," as your canonical AP state (",{"type":17,"tag":6121,"props":223193,"children":223195},{"className":223194},[],[223196],{"type":23,"value":220828},{"type":23,"value":11826},{"type":17,"tag":6121,"props":223199,"children":223201},{"className":223200},[],[223202],{"type":23,"value":220819},{"type":23,"value":11826},{"type":17,"tag":6121,"props":223205,"children":223207},{"className":223206},[],[223208],{"type":23,"value":19949},{"type":23,"value":12034},{"type":17,"tag":84,"props":223211,"children":223212},{},[223213,223214,223218,223220,223225,223226,223231],{"type":23,"value":223185},{"type":17,"tag":48,"props":223215,"children":223216},{},[223217],{"type":23,"value":82494},{"type":23,"value":223219}," as ledger payment activity (",{"type":17,"tag":6121,"props":223221,"children":223223},{"className":223222},[],[223224],{"type":23,"value":27310},{"type":23,"value":11826},{"type":17,"tag":6121,"props":223227,"children":223229},{"className":223228},[],[223230],{"type":23,"value":219481},{"type":23,"value":223232},", vendor contact)",{"type":17,"tag":84,"props":223234,"children":223235},{},[223236],{"type":23,"value":223237},"matching defensively (because no guaranteed bill↔transaction join)",{"type":17,"tag":84,"props":223239,"children":223240},{},[223241],{"type":23,"value":223242},"validating against AP accounts (optional)",{"type":17,"tag":29,"props":223244,"children":223245},{},[223246],{"type":23,"value":223247},"The guiding rule:",{"type":17,"tag":3414,"props":223249,"children":223250},{},[223251],{"type":17,"tag":29,"props":223252,"children":223253},{},[223254],{"type":23,"value":223255},"Bills tell you what you owe. Transactions tell you what happened. Reconciliation connects them—defensively.",{"type":17,"tag":29,"props":223257,"children":223258},{},[223259,223260],{"type":23,"value":1609},{"type":17,"tag":133,"props":223261,"children":223263},{"href":1612,"rel":223262},[214],[223264],{"type":23,"value":1616},{"type":17,"tag":29,"props":223266,"children":223267},{},[223268,223269],{"type":23,"value":1609},{"type":17,"tag":133,"props":223270,"children":223272},{"href":1623,"rel":223271},[214],[223273],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":223275},[223276,223277,223278,223279,223280,223284,223285,223286,223287,223288,223289,223293,223299,223300,223301,223302],{"id":222075,"depth":1629,"text":222078},{"id":199540,"depth":1629,"text":199543},{"id":141798,"depth":1629,"text":141801},{"id":19743,"depth":1629,"text":19746},{"id":220778,"depth":1629,"text":220781,"children":223281},[223282,223283],{"id":222215,"depth":1635,"text":222218},{"id":222306,"depth":1635,"text":222309},{"id":222456,"depth":1629,"text":222459},{"id":222511,"depth":1629,"text":222514},{"id":222531,"depth":1629,"text":222534},{"id":222550,"depth":1629,"text":222553},{"id":222676,"depth":1629,"text":222679},{"id":222752,"depth":1629,"text":222755,"children":223290},[223291,223292],{"id":221333,"depth":1635,"text":221336},{"id":221391,"depth":1635,"text":221394},{"id":222910,"depth":1629,"text":222913,"children":223294},[223295,223296,223297,223298],{"id":222916,"depth":1635,"text":222919},{"id":222936,"depth":1635,"text":222939},{"id":221534,"depth":1635,"text":221537},{"id":222997,"depth":1635,"text":223000},{"id":223031,"depth":1629,"text":223034},{"id":223093,"depth":1629,"text":223096},{"id":223113,"depth":1629,"text":223116},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_reconcile_vendor_payments_ap_with_unified_accounting_api.md","blog/how_to_reconcile_vendor_payments_ap_with_unified_accounting_api.md","blog/how_to_reconcile_vendor_payments_ap_with_unified_accounting_api",{"_path":223307,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":223308,"description":223309,"img":223310,"date":223311,"tag":12,"body":223312,"_type":1677,"_id":223930,"_source":1679,"_file":223931,"_stem":223932,"_extension":1682},"/blog/how_to_sync_and_classify_expenses_using_unified_accounting_api","How to Sync and Classify Expenses Using Unified's Accounting API","Expense ingestion looks simple until you try to make it work across accounting systems.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_sync_and_classify_expenses_using_unified_accounting_api-icon.png","2026-01-19T21:54:00.000Z",{"type":14,"children":223313,"toc":223908},[223314,223319,223322,223329,223333,223338,223346,223364,223369,223379,223384,223388,223420,223424,223432,223442,223448,223460,223464,223539,223544,223550,223562,223571,223575,223620,223624,223635,223640,223646,223651,223657,223666,223672,223681,223687,223696,223702,223707,223713,223722,223728,223737,223745,223751,223756,223765,223769,223793,223799,223808,223820,223826,223837,223846,223851,223857,223866,223871,223880,223885,223890,223899],{"type":17,"tag":18,"props":223315,"children":223317},{"id":223316},"how-to-sync-and-classify-expenses-using-unifieds-accounting-api",[223318],{"type":23,"value":223308},{"type":17,"tag":25,"props":223320,"children":223321},{},[],{"type":17,"tag":29,"props":223323,"children":223324},{},[223325],{"type":17,"tag":33,"props":223326,"children":223327},{},[223328],{"type":23,"value":219187},{"type":17,"tag":29,"props":223330,"children":223331},{},[223332],{"type":23,"value":223309},{"type":17,"tag":29,"props":223334,"children":223335},{},[223336],{"type":23,"value":223337},"Different providers disagree on where classification lives, which fields are required, and what can be created programmatically. Some enforce account-level classification. Others require categories or tax rates at the line-item level. Many silently recompute totals or reject writes that don't align with their internal rules.",{"type":17,"tag":29,"props":223339,"children":223340},{},[223341],{"type":17,"tag":48,"props":223342,"children":223343},{},[223344],{"type":23,"value":223345},"For a PM or backend team, this creates early risk:",{"type":17,"tag":80,"props":223347,"children":223348},{},[223349,223354,223359],{"type":17,"tag":84,"props":223350,"children":223351},{},[223352],{"type":23,"value":223353},"Can expenses be written safely across providers without conditional logic?",{"type":17,"tag":84,"props":223355,"children":223356},{},[223357],{"type":23,"value":223358},"Where should classification live so that downstream reporting stays consistent?",{"type":17,"tag":84,"props":223360,"children":223361},{},[223362],{"type":23,"value":223363},"How do you avoid partial writes, duplicate expenses, or reconciliation drift?",{"type":17,"tag":29,"props":223365,"children":223366},{},[223367],{"type":23,"value":223368},"Most teams end up hardcoding provider-specific behavior or narrowing scope to a single accounting system. That works initially, but it doesn't scale.",{"type":17,"tag":29,"props":223370,"children":223371},{},[223372,223373,223377],{"type":23,"value":25244},{"type":17,"tag":133,"props":223374,"children":223375},{"href":82425},[223376],{"type":23,"value":128616},{"type":23,"value":223378}," is designed to make expense sync predictable. Expenses, accounts, categories, and tax rates are shared through normalized models with documented behavior. Classification is explicit, line-item driven, and validated by the provider at write time rather than inferred upstream.",{"type":17,"tag":29,"props":223380,"children":223381},{},[223382],{"type":23,"value":223383},"This guide shows how to build a production-grade expense sync flow—fetching, classifying, creating, and updating expenses—using Unified's normalized API and documented parameters only.",{"type":17,"tag":68,"props":223385,"children":223386},{"id":141798},[223387],{"type":23,"value":141801},{"type":17,"tag":80,"props":223389,"children":223390},{},[223391,223395,223399,223403,223412],{"type":17,"tag":84,"props":223392,"children":223393},{},[223394],{"type":23,"value":219393},{"type":17,"tag":84,"props":223396,"children":223397},{},[223398],{"type":23,"value":219398},{"type":17,"tag":84,"props":223400,"children":223401},{},[223402],{"type":23,"value":219403},{"type":17,"tag":84,"props":223404,"children":223405},{},[223406,223407],{"type":23,"value":219408},{"type":17,"tag":6121,"props":223408,"children":223410},{"className":223409},[],[223411],{"type":23,"value":19766},{"type":17,"tag":84,"props":223413,"children":223414},{},[223415,223419],{"type":17,"tag":133,"props":223416,"children":223417},{"href":7691},[223418],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":68,"props":223421,"children":223422},{"id":19743},[223423],{"type":23,"value":19746},{"type":17,"tag":6893,"props":223425,"children":223427},{"className":223426,"code":219429,"language":18718,"meta":7},[18716],[223428],{"type":17,"tag":6121,"props":223429,"children":223430},{"__ignoreMap":7},[223431],{"type":23,"value":219429},{"type":17,"tag":29,"props":223433,"children":223434},{},[223435,223436,223441],{"type":23,"value":219439},{"type":17,"tag":6121,"props":223437,"children":223439},{"className":223438},[],[223440],{"type":23,"value":19766},{"type":23,"value":220775},{"type":17,"tag":68,"props":223443,"children":223445},{"id":223444},"step-2-understand-the-expense-model",[223446],{"type":23,"value":223447},"Step 2: Understand the Expense model",{"type":17,"tag":29,"props":223449,"children":223450},{},[223451,223453,223459],{"type":23,"value":223452},"Unified represents expenses using the normalized ",{"type":17,"tag":6121,"props":223454,"children":223456},{"className":223455},[],[223457],{"type":23,"value":223458},"AccountingExpense",{"type":23,"value":74653},{"type":17,"tag":29,"props":223461,"children":223462},{},[223463],{"type":23,"value":19821},{"type":17,"tag":80,"props":223465,"children":223466},{},[223467,223475,223529],{"type":17,"tag":84,"props":223468,"children":223469},{},[223470],{"type":17,"tag":48,"props":223471,"children":223472},{},[223473],{"type":23,"value":223474},"Classification happens at the line-item level",{"type":17,"tag":84,"props":223476,"children":223477},{},[223478,223480],{"type":23,"value":223479},"Each line item can reference:\n",{"type":17,"tag":80,"props":223481,"children":223482},{},[223483,223497,223513],{"type":17,"tag":84,"props":223484,"children":223485},{},[223486,223491,223492],{"type":17,"tag":6121,"props":223487,"children":223489},{"className":223488},[],[223490],{"type":23,"value":184840},{"type":23,"value":98082},{"type":17,"tag":6121,"props":223493,"children":223495},{"className":223494},[],[223496],{"type":23,"value":219515},{"type":17,"tag":84,"props":223498,"children":223499},{},[223500,223506,223507],{"type":17,"tag":6121,"props":223501,"children":223503},{"className":223502},[],[223504],{"type":23,"value":223505},"category_ids[]",{"type":23,"value":98082},{"type":17,"tag":6121,"props":223508,"children":223510},{"className":223509},[],[223511],{"type":23,"value":223512},"AccountingCategory",{"type":17,"tag":84,"props":223514,"children":223515},{},[223516,223522,223523],{"type":17,"tag":6121,"props":223517,"children":223519},{"className":223518},[],[223520],{"type":23,"value":223521},"taxrate_id",{"type":23,"value":98082},{"type":17,"tag":6121,"props":223524,"children":223526},{"className":223525},[],[223527],{"type":23,"value":223528},"AccountingTaxrate",{"type":17,"tag":84,"props":223530,"children":223531},{},[223532,223534],{"type":23,"value":223533},"All fields are optional at the schema level; ",{"type":17,"tag":48,"props":223535,"children":223536},{},[223537],{"type":23,"value":223538},"provider rules are enforced downstream",{"type":17,"tag":29,"props":223540,"children":223541},{},[223542],{"type":23,"value":223543},"You should never assume which fields are required for a given provider.",{"type":17,"tag":68,"props":223545,"children":223547},{"id":223546},"step-3-list-expenses-with-pagination-and-incremental-sync",[223548],{"type":23,"value":223549},"Step 3: List expenses (with pagination and incremental sync)",{"type":17,"tag":29,"props":223551,"children":223552},{},[223553,223554,223560],{"type":23,"value":33722},{"type":17,"tag":6121,"props":223555,"children":223557},{"className":223556},[],[223558],{"type":23,"value":223559},"listAccountingExpenses",{"type":23,"value":223561}," to fetch expenses.",{"type":17,"tag":6893,"props":223563,"children":223566},{"className":223564,"code":223565,"language":18718,"meta":7},[18716],"const results = await sdk.accounting.listAccountingExpenses({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-20T00:59:41.301Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  user_id: '',\n  start_gte: '',\n  end_lt: '',\n  contact_id: '',\n  category_id: '',\n  group_id: '',\n  fields: '',\n  raw: '',\n});\n",[223567],{"type":17,"tag":6121,"props":223568,"children":223569},{"__ignoreMap":7},[223570],{"type":23,"value":223565},{"type":17,"tag":239,"props":223572,"children":223573},{"id":219592},[223574],{"type":23,"value":219595},{"type":17,"tag":80,"props":223576,"children":223577},{},[223578,223586,223596,223610],{"type":17,"tag":84,"props":223579,"children":223580},{},[223581,223582],{"type":23,"value":221076},{"type":17,"tag":48,"props":223583,"children":223584},{},[223585],{"type":23,"value":219614},{"type":17,"tag":84,"props":223587,"children":223588},{},[223589,223591,223595],{"type":23,"value":223590},"Maximum page size: ",{"type":17,"tag":48,"props":223592,"children":223593},{},[223594],{"type":23,"value":219614},{"type":23,"value":219631},{"type":17,"tag":84,"props":223597,"children":223598},{},[223599,223603,223604,223608],{"type":17,"tag":133,"props":223600,"children":223601},{"href":1857},[223602],{"type":23,"value":2409},{"type":23,"value":219640},{"type":17,"tag":48,"props":223605,"children":223606},{},[223607],{"type":23,"value":48411},{"type":23,"value":223609},", not cursors",{"type":17,"tag":84,"props":223611,"children":223612},{},[223613,223615],{"type":23,"value":223614},"You've reached the end when ",{"type":17,"tag":6121,"props":223616,"children":223618},{"className":223617},[],[223619],{"type":23,"value":219655},{"type":17,"tag":239,"props":223621,"children":223622},{"id":219658},[223623],{"type":23,"value":157204},{"type":17,"tag":29,"props":223625,"children":223626},{},[223627,223628,223633],{"type":23,"value":33722},{"type":17,"tag":6121,"props":223629,"children":223631},{"className":223630},[],[223632],{"type":23,"value":26291},{"type":23,"value":223634}," to fetch only records updated since your last sync timestamp.",{"type":17,"tag":29,"props":223636,"children":223637},{},[223638],{"type":23,"value":223639},"This is the recommended approach for polling-based sync.",{"type":17,"tag":68,"props":223641,"children":223643},{"id":223642},"step-4-resolve-classification-dependencies",[223644],{"type":23,"value":223645},"Step 4: Resolve classification dependencies",{"type":17,"tag":29,"props":223647,"children":223648},{},[223649],{"type":23,"value":223650},"Before creating or updating expenses, resolve the IDs required for classification.",{"type":17,"tag":239,"props":223652,"children":223654},{"id":223653},"list-categories",[223655],{"type":23,"value":223656},"List categories",{"type":17,"tag":6893,"props":223658,"children":223661},{"className":223659,"code":223660,"language":18718,"meta":7},[18716],"const categories = await sdk.accounting.listAccountingCategories({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-20T00:59:41.301Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  parent_id: '',\n  fields: '',\n  raw: '',\n});\n",[223662],{"type":17,"tag":6121,"props":223663,"children":223664},{"__ignoreMap":7},[223665],{"type":23,"value":223660},{"type":17,"tag":239,"props":223667,"children":223669},{"id":223668},"list-accounts-chart-of-accounts",[223670],{"type":23,"value":223671},"List accounts (chart of accounts)",{"type":17,"tag":6893,"props":223673,"children":223676},{"className":223674,"code":223675,"language":18718,"meta":7},[18716],"const accounts = await sdk.accounting.listAccountingAccounts({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-20T00:59:41.301Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  org_id: '',\n  fields: '',\n  raw: '',\n});\n",[223677],{"type":17,"tag":6121,"props":223678,"children":223679},{"__ignoreMap":7},[223680],{"type":23,"value":223675},{"type":17,"tag":239,"props":223682,"children":223684},{"id":223683},"list-tax-rates",[223685],{"type":23,"value":223686},"List tax rates",{"type":17,"tag":6893,"props":223688,"children":223691},{"className":223689,"code":223690,"language":18718,"meta":7},[18716],"const taxrates = await sdk.accounting.listAccountingTaxrates({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-20T00:59:41.301Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  org_id: '',\n  fields: '',\n  raw: '',\n});\n",[223692],{"type":17,"tag":6121,"props":223693,"children":223694},{"__ignoreMap":7},[223695],{"type":23,"value":223690},{"type":17,"tag":239,"props":223697,"children":223699},{"id":223698},"optional-create-missing-dependencies",[223700],{"type":23,"value":223701},"Optional: create missing dependencies",{"type":17,"tag":29,"props":223703,"children":223704},{},[223705],{"type":23,"value":223706},"If your product auto-provisions classifications, you can create them.",{"type":17,"tag":239,"props":223708,"children":223710},{"id":223709},"create-a-category",[223711],{"type":23,"value":223712},"Create a category",{"type":17,"tag":6893,"props":223714,"children":223717},{"className":223715,"code":223716,"language":18718,"meta":7},[18716],"await sdk.accounting.createAccountingCategory({\n  connectionId,\n  accountingCategory: {\n    name: 'Travel',\n    is_active: true,\n  },\n});\n",[223718],{"type":17,"tag":6121,"props":223719,"children":223720},{"__ignoreMap":7},[223721],{"type":23,"value":223716},{"type":17,"tag":239,"props":223723,"children":223725},{"id":223724},"create-an-account",[223726],{"type":23,"value":223727},"Create an account",{"type":17,"tag":6893,"props":223729,"children":223732},{"className":223730,"code":223731,"language":18718,"meta":7},[18716],"await sdk.accounting.createAccountingAccount({\n  connectionId,\n  accountingAccount: {\n    name: 'Travel Expenses',\n    type: 'EXPENSE',\n    status: 'ACTIVE',\n    currency: 'USD',\n  },\n});\n",[223733],{"type":17,"tag":6121,"props":223734,"children":223735},{"__ignoreMap":7},[223736],{"type":23,"value":223731},{"type":17,"tag":3414,"props":223738,"children":223739},{},[223740],{"type":17,"tag":29,"props":223741,"children":223742},{},[223743],{"type":23,"value":223744},"Do not assume providers allow creation. Always be prepared to handle 501 Not Implemented.",{"type":17,"tag":68,"props":223746,"children":223748},{"id":223747},"step-5-build-a-normalized-expense-payload",[223749],{"type":23,"value":223750},"Step 5: Build a normalized expense payload",{"type":17,"tag":29,"props":223752,"children":223753},{},[223754],{"type":23,"value":223755},"A minimal, provider-safe expense payload looks like this:",{"type":17,"tag":6893,"props":223757,"children":223760},{"className":223758,"code":223759,"language":18718,"meta":7},[18716],"const expense = {\n  name: 'Flight to NYC',\n  currency: 'USD',\n  total_amount: 650.0,\n  lineitems: [\n    {\n      unit_quantity: 1,\n      unit_amount: 600.0,\n      tax_amount: 50.0,\n      account_id: travelAccountId,\n      category_ids: [travelCategoryId],\n      taxrate_id: salesTaxId,\n      notes: 'Conference travel',\n    },\n  ],\n};\n",[223761],{"type":17,"tag":6121,"props":223762,"children":223763},{"__ignoreMap":7},[223764],{"type":23,"value":223759},{"type":17,"tag":29,"props":223766,"children":223767},{},[223768],{"type":23,"value":21128},{"type":17,"tag":80,"props":223770,"children":223771},{},[223772,223783,223788],{"type":17,"tag":84,"props":223773,"children":223774},{},[223775,223777],{"type":23,"value":223776},"Totals are typically derived as ",{"type":17,"tag":6121,"props":223778,"children":223780},{"className":223779},[],[223781],{"type":23,"value":223782},"unit_quantity * unit_amount + tax_amount",{"type":17,"tag":84,"props":223784,"children":223785},{},[223786],{"type":23,"value":223787},"Providers may recompute totals or reject mismatches",{"type":17,"tag":84,"props":223789,"children":223790},{},[223791],{"type":23,"value":223792},"Leave fields unset unless you are certain they're supported",{"type":17,"tag":68,"props":223794,"children":223796},{"id":223795},"step-6-create-the-expense",[223797],{"type":23,"value":223798},"Step 6: Create the expense",{"type":17,"tag":6893,"props":223800,"children":223803},{"className":223801,"code":223802,"language":18718,"meta":7},[18716],"const created = await sdk.accounting.createAccountingExpense({\n  connectionId,\n  accountingExpense: expense,\n});\n",[223804],{"type":17,"tag":6121,"props":223805,"children":223806},{"__ignoreMap":7},[223807],{"type":23,"value":223802},{"type":17,"tag":29,"props":223809,"children":223810},{},[223811,223813,223818],{"type":23,"value":223812},"The response is a single ",{"type":17,"tag":6121,"props":223814,"children":223816},{"className":223815},[],[223817],{"type":23,"value":223458},{"type":23,"value":223819}," object reflecting the provider's state.",{"type":17,"tag":68,"props":223821,"children":223823},{"id":223822},"step-7-update-an-existing-expense",[223824],{"type":23,"value":223825},"Step 7: Update an existing expense",{"type":17,"tag":29,"props":223827,"children":223828},{},[223829,223831,223836],{"type":23,"value":223830},"To update an expense, supply its ",{"type":17,"tag":6121,"props":223832,"children":223834},{"className":223833},[],[223835],{"type":23,"value":18766},{"type":23,"value":54},{"type":17,"tag":6893,"props":223838,"children":223841},{"className":223839,"code":223840,"language":18718,"meta":7},[18716],"const updated = await sdk.accounting.updateAccountingExpense({\n  connectionId,\n  id: expenseId,\n  accountingExpense: {\n    ...expense,\n    name: 'Updated flight expense',\n  },\n});\n",[223842],{"type":17,"tag":6121,"props":223843,"children":223844},{"__ignoreMap":7},[223845],{"type":23,"value":223840},{"type":17,"tag":29,"props":223847,"children":223848},{},[223849],{"type":23,"value":223850},"Updates fully replace the resource state. There is no versioning.",{"type":17,"tag":68,"props":223852,"children":223854},{"id":223853},"step-8-retrieve-an-expense-by-id",[223855],{"type":23,"value":223856},"Step 8: Retrieve an expense by ID",{"type":17,"tag":6893,"props":223858,"children":223861},{"className":223859,"code":223860,"language":18718,"meta":7},[18716],"const result = await sdk.accounting.getAccountingExpense({\n  connectionId,\n  id: expenseId,\n  fields: '',\n  raw: '',\n});\n",[223862],{"type":17,"tag":6121,"props":223863,"children":223864},{"__ignoreMap":7},[223865],{"type":23,"value":223860},{"type":17,"tag":29,"props":223867,"children":223868},{},[223869],{"type":23,"value":223870},"Use this to verify writes or reconcile downstream changes.",{"type":17,"tag":68,"props":223872,"children":223874},{"id":223873},"final-notes",[223875],{"type":17,"tag":48,"props":223876,"children":223877},{},[223878],{"type":23,"value":223879},"Final notes",{"type":17,"tag":29,"props":223881,"children":223882},{},[223883],{"type":23,"value":223884},"Expense sync is one of the fastest ways to accumulate integration debt if classification rules aren't enforced early.",{"type":17,"tag":29,"props":223886,"children":223887},{},[223888],{"type":23,"value":223889},"Unified's Accounting API gives you a stable foundation for expense ingestion and classification across accounting systems, without vendor-specific code paths or undocumented behavior.",{"type":17,"tag":29,"props":223891,"children":223892},{},[223893,223894],{"type":23,"value":1609},{"type":17,"tag":133,"props":223895,"children":223897},{"href":1612,"rel":223896},[214],[223898],{"type":23,"value":1616},{"type":17,"tag":29,"props":223900,"children":223901},{},[223902,223903],{"type":23,"value":1609},{"type":17,"tag":133,"props":223904,"children":223906},{"href":1623,"rel":223905},[214],[223907],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":223909},[223910,223911,223912,223913,223917,223925,223926,223927,223928,223929],{"id":141798,"depth":1629,"text":141801},{"id":19743,"depth":1629,"text":19746},{"id":223444,"depth":1629,"text":223447},{"id":223546,"depth":1629,"text":223549,"children":223914},[223915,223916],{"id":219592,"depth":1635,"text":219595},{"id":219658,"depth":1635,"text":157204},{"id":223642,"depth":1629,"text":223645,"children":223918},[223919,223920,223921,223922,223923,223924],{"id":223653,"depth":1635,"text":223656},{"id":223668,"depth":1635,"text":223671},{"id":223683,"depth":1635,"text":223686},{"id":223698,"depth":1635,"text":223701},{"id":223709,"depth":1635,"text":223712},{"id":223724,"depth":1635,"text":223727},{"id":223747,"depth":1629,"text":223750},{"id":223795,"depth":1629,"text":223798},{"id":223822,"depth":1629,"text":223825},{"id":223853,"depth":1629,"text":223856},{"id":223873,"depth":1629,"text":223879},"content:blog:how_to_sync_and_classify_expenses_using_unified_accounting_api.md","blog/how_to_sync_and_classify_expenses_using_unified_accounting_api.md","blog/how_to_sync_and_classify_expenses_using_unified_accounting_api",{"_path":223934,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":223935,"description":223936,"img":223937,"date":223311,"tag":12,"body":223938,"_type":1677,"_id":224616,"_source":1679,"_file":224617,"_stem":224618,"_extension":1682},"/blog/how_to_sync_customers_or_suppliers_with_unified_accounting_api","How to Sync Customers or Suppliers with Unified's Accounting API","Syncing customers and suppliers sounds like a basic accounting task. It becomes a product problem the moment you support more than one accounting system.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_sync_customers_or_suppliers_with_unified_accounting_api-icon.png",{"type":14,"children":223939,"toc":224602},[223940,223945,223948,223955,223959,223964,223969,223987,223992,224029,224034,224038,224043,224071,224076,224085,224090,224099,224105,224116,224125,224133,224170,224176,224188,224197,224201,224237,224242,224251,224257,224262,224271,224276,224285,224291,224302,224311,224318,224342,224348,224353,224362,224372,224397,224402,224408,224420,224429,224436,224459,224465,224482,224491,224496,224505,224511,224516,224525,224530,224539,224543,224548,224579,224584,224593],{"type":17,"tag":18,"props":223941,"children":223943},{"id":223942},"how-to-sync-customers-or-suppliers-with-unifieds-accounting-api",[223944],{"type":23,"value":223935},{"type":17,"tag":25,"props":223946,"children":223947},{},[],{"type":17,"tag":29,"props":223949,"children":223950},{},[223951],{"type":17,"tag":33,"props":223952,"children":223953},{},[223954],{"type":23,"value":219187},{"type":17,"tag":29,"props":223956,"children":223957},{},[223958],{"type":23,"value":223936},{"type":17,"tag":29,"props":223960,"children":223961},{},[223962],{"type":23,"value":223963},"Many platforms treat customers and vendors as separate objects. Others merge them. Some allow a single entity to be both. Identifiers aren't stable, names change, emails aren't unique, and 'vendor vs customer' is often inferred rather than explicit. When teams integrate vendor-by-vendor, this usually leads to duplicate records, broken updates, or brittle reconciliation logic.",{"type":17,"tag":29,"props":223965,"children":223966},{},[223967],{"type":23,"value":223968},"For a PM, this raises hard questions early:",{"type":17,"tag":80,"props":223970,"children":223971},{},[223972,223977,223982],{"type":17,"tag":84,"props":223973,"children":223974},{},[223975],{"type":23,"value":223976},"Is a customer and a supplier the same logical entity in our product?",{"type":17,"tag":84,"props":223978,"children":223979},{},[223980],{"type":23,"value":223981},"What happens if a contact switches roles or has multiple roles?",{"type":17,"tag":84,"props":223983,"children":223984},{},[223985],{"type":23,"value":223986},"How do we guarantee idempotent syncs without relying on provider-specific IDs?",{"type":17,"tag":29,"props":223988,"children":223989},{},[223990],{"type":23,"value":223991},"Many products solve this by branching logic per accounting platform or maintaining separate customer and vendor pipelines. That increases complexity and makes long-term maintenance expensive.",{"type":17,"tag":29,"props":223993,"children":223994},{},[223995,223996,224000,224002,224007,224008,224014,224016,224021,224022,224027],{"type":23,"value":25244},{"type":17,"tag":133,"props":223997,"children":223998},{"href":82425},[223999],{"type":23,"value":128616},{"type":23,"value":224001}," takes a different approach. It provides ",{"type":17,"tag":48,"props":224003,"children":224004},{},[224005],{"type":23,"value":224006},"a single normalized contact model",{"type":23,"value":47186},{"type":17,"tag":6121,"props":224009,"children":224011},{"className":224010},[],[224012],{"type":23,"value":224013},"AccountingContact",{"type":23,"value":224015},"—and uses explicit boolean flags (",{"type":17,"tag":6121,"props":224017,"children":224019},{"className":224018},[],[224020],{"type":23,"value":220999},{"type":23,"value":11826},{"type":17,"tag":6121,"props":224023,"children":224025},{"className":224024},[],[224026],{"type":23,"value":221006},{"type":23,"value":224028},") to represent role. Identity is stable, behavior is documented, and sync semantics are consistent across accounting providers.",{"type":17,"tag":29,"props":224030,"children":224031},{},[224032],{"type":23,"value":224033},"This guide shows how to build a production-grade customer and supplier sync on top of that model—listing contacts, filtering by role, handling incremental updates, creating and updating records.",{"type":17,"tag":68,"props":224035,"children":224036},{"id":141798},[224037],{"type":23,"value":141801},{"type":17,"tag":29,"props":224039,"children":224040},{},[224041],{"type":23,"value":224042},"You'll need:",{"type":17,"tag":80,"props":224044,"children":224045},{},[224046,224050,224055,224066],{"type":17,"tag":84,"props":224047,"children":224048},{},[224049],{"type":23,"value":219398},{"type":17,"tag":84,"props":224051,"children":224052},{},[224053],{"type":23,"value":224054},"An API key",{"type":17,"tag":84,"props":224056,"children":224057},{},[224058,224059,224064],{"type":23,"value":9619},{"type":17,"tag":6121,"props":224060,"children":224062},{"className":224061},[],[224063],{"type":23,"value":19766},{"type":23,"value":224065}," for an authorized accounting integration",{"type":17,"tag":84,"props":224067,"children":224068},{},[224069],{"type":23,"value":224070},"Node.js 18+ (or equivalent runtime)",{"type":17,"tag":29,"props":224072,"children":224073},{},[224074],{"type":23,"value":224075},"Install the SDK:",{"type":17,"tag":6893,"props":224077,"children":224080},{"className":224078,"code":224079,"language":48432,"meta":7},[48430],"npm install @unified-api/typescript-sdk\n",[224081],{"type":17,"tag":6121,"props":224082,"children":224083},{"__ignoreMap":7},[224084],{"type":23,"value":224079},{"type":17,"tag":29,"props":224086,"children":224087},{},[224088],{"type":23,"value":224089},"Initialize the client:",{"type":17,"tag":6893,"props":224091,"children":224094},{"className":224092,"code":224093,"language":18718,"meta":7},[18716],"import { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nconst unified = new UnifiedTo({\n  security: {\n    jwt: process.env.UNIFIED_API_KEY!,\n  },\n});\n",[224095],{"type":17,"tag":6121,"props":224096,"children":224097},{"__ignoreMap":7},[224098],{"type":23,"value":224093},{"type":17,"tag":68,"props":224100,"children":224102},{"id":224101},"the-accountingcontact-model-important",[224103],{"type":23,"value":224104},"The AccountingContact model (important)",{"type":17,"tag":29,"props":224106,"children":224107},{},[224108,224110,224115],{"type":23,"value":224109},"Unified normalizes customers and suppliers into ",{"type":17,"tag":48,"props":224111,"children":224112},{},[224113],{"type":23,"value":224114},"one object",{"type":23,"value":20456},{"type":17,"tag":6893,"props":224117,"children":224120},{"className":224118,"code":224119,"language":18718,"meta":7},[18716],"type AccountingContact = {\n  id?: string;\n  name?: string;\n  first_name?: string;\n  last_name?: string;\n  emails?: { email?: string; type?: \"WORK\" | \"HOME\" | \"OTHER\" }[];\n  telephones?: { telephone?: string; type?: \"WORK\" | \"HOME\" | \"OTHER\" | \"FAX\" | \"MOBILE\" }[];\n  billing_address?: { ... };\n  shipping_address?: { ... };\n  is_customer?: boolean;\n  is_supplier?: boolean;\n  is_active?: boolean;\n  tax_number?: string;\n  payment_methods?: { ... }[];\n  company_name?: string;\n  identification?: string;\n  updated_at?: string;\n};\n",[224121],{"type":17,"tag":6121,"props":224122,"children":224123},{"__ignoreMap":7},[224124],{"type":23,"value":224119},{"type":17,"tag":29,"props":224126,"children":224127},{},[224128],{"type":17,"tag":48,"props":224129,"children":224130},{},[224131],{"type":23,"value":224132},"Key implications:",{"type":17,"tag":80,"props":224134,"children":224135},{},[224136,224141,224158],{"type":17,"tag":84,"props":224137,"children":224138},{},[224139],{"type":23,"value":224140},"Customers and suppliers are not separate endpoints.",{"type":17,"tag":84,"props":224142,"children":224143},{},[224144,224146,224151,224152,224157],{"type":23,"value":224145},"Filtering is done using ",{"type":17,"tag":6121,"props":224147,"children":224149},{"className":224148},[],[224150],{"type":23,"value":220999},{"type":23,"value":26030},{"type":17,"tag":6121,"props":224153,"children":224155},{"className":224154},[],[224156],{"type":23,"value":221006},{"type":23,"value":54},{"type":17,"tag":84,"props":224159,"children":224160},{},[224161,224163,224169],{"type":23,"value":224162},"The stable identifier is ",{"type":17,"tag":6121,"props":224164,"children":224166},{"className":224165},[],[224167],{"type":23,"value":224168},"(connectionId, id)",{"type":23,"value":54},{"type":17,"tag":68,"props":224171,"children":224173},{"id":224172},"step-1-list-accounting-contacts",[224174],{"type":23,"value":224175},"Step 1: List accounting contacts",{"type":17,"tag":29,"props":224177,"children":224178},{},[224179,224180,224186],{"type":23,"value":33722},{"type":17,"tag":6121,"props":224181,"children":224183},{"className":224182},[],[224184],{"type":23,"value":224185},"listAccountingContacts",{"type":23,"value":224187}," to fetch contacts for a connection.",{"type":17,"tag":6893,"props":224189,"children":224192},{"className":224190,"code":224191,"language":18718,"meta":7},[18716],"const contacts = await unified.accounting.listAccountingContacts({\n  connectionId,\n  limit: 100,\n});\n",[224193],{"type":17,"tag":6121,"props":224194,"children":224195},{"__ignoreMap":7},[224196],{"type":23,"value":224191},{"type":17,"tag":239,"props":224198,"children":224199},{"id":219592},[224200],{"type":23,"value":219595},{"type":17,"tag":80,"props":224202,"children":224203},{},[224204,224214,224225],{"type":17,"tag":84,"props":224205,"children":224206},{},[224207,224212],{"type":17,"tag":6121,"props":224208,"children":224210},{"className":224209},[],[224211],{"type":23,"value":48389},{"type":23,"value":224213}," defaults to 100 (maximum)",{"type":17,"tag":84,"props":224215,"children":224216},{},[224217,224218,224223],{"type":23,"value":33722},{"type":17,"tag":6121,"props":224219,"children":224221},{"className":224220},[],[224222],{"type":23,"value":48411},{"type":23,"value":224224}," to paginate",{"type":17,"tag":84,"props":224226,"children":224227},{},[224228,224230,224235],{"type":23,"value":224229},"When returned results ",{"type":17,"tag":6121,"props":224231,"children":224233},{"className":224232},[],[224234],{"type":23,"value":222508},{"type":23,"value":224236},", there are no more records",{"type":17,"tag":29,"props":224238,"children":224239},{},[224240],{"type":23,"value":224241},"Example paginated fetch:",{"type":17,"tag":6893,"props":224243,"children":224246},{"className":224244,"code":224245,"language":18718,"meta":7},[18716],"let offset = 0;\nconst allContacts: AccountingContact[] = [];\n\nwhile (true) {\n  const page = await unified.accounting.listAccountingContacts({\n    connectionId,\n    limit: 100,\n    offset,\n  });\n\n  allContacts.push(...page);\n\n  if (page.length \u003C 100) break;\n  offset += 100;\n}\n",[224247],{"type":17,"tag":6121,"props":224248,"children":224249},{"__ignoreMap":7},[224250],{"type":23,"value":224245},{"type":17,"tag":68,"props":224252,"children":224254},{"id":224253},"step-2-filter-customers-or-suppliers",[224255],{"type":23,"value":224256},"Step 2: Filter customers or suppliers",{"type":17,"tag":29,"props":224258,"children":224259},{},[224260],{"type":23,"value":224261},"Since Unified uses a shared model, filter in your application:",{"type":17,"tag":6893,"props":224263,"children":224266},{"className":224264,"code":224265,"language":18718,"meta":7},[18716],"const customers = allContacts.filter(c => c.is_customer);\nconst suppliers = allContacts.filter(c => c.is_supplier);\n",[224267],{"type":17,"tag":6121,"props":224268,"children":224269},{"__ignoreMap":7},[224270],{"type":23,"value":224265},{"type":17,"tag":29,"props":224272,"children":224273},{},[224274],{"type":23,"value":224275},"You can also filter out inactive records:",{"type":17,"tag":6893,"props":224277,"children":224280},{"className":224278,"code":224279,"language":18718,"meta":7},[18716],"const activeCustomers = customers.filter(c => c.is_active !== false);\n",[224281],{"type":17,"tag":6121,"props":224282,"children":224283},{"__ignoreMap":7},[224284],{"type":23,"value":224279},{"type":17,"tag":68,"props":224286,"children":224288},{"id":224287},"step-3-incremental-sync-using-updated-timestamps",[224289],{"type":23,"value":224290},"Step 3: Incremental sync using updated timestamps",{"type":17,"tag":29,"props":224292,"children":224293},{},[224294,224296,224301],{"type":23,"value":224295},"To avoid full re-syncs, use ",{"type":17,"tag":6121,"props":224297,"children":224299},{"className":224298},[],[224300],{"type":23,"value":26291},{"type":23,"value":20456},{"type":17,"tag":6893,"props":224303,"children":224306},{"className":224304,"code":224305,"language":18718,"meta":7},[18716],"const updatedSince = \"2025-01-01T00:00:00Z\";\n\nconst updatedContacts = await unified.accounting.listAccountingContacts({\n  connectionId,\n  updatedGte: updatedSince,\n  limit: 100,\n});\n",[224307],{"type":17,"tag":6121,"props":224308,"children":224309},{"__ignoreMap":7},[224310],{"type":23,"value":224305},{"type":17,"tag":29,"props":224312,"children":224313},{},[224314],{"type":17,"tag":48,"props":224315,"children":224316},{},[224317],{"type":23,"value":21128},{"type":17,"tag":80,"props":224319,"children":224320},{},[224321,224326,224331],{"type":17,"tag":84,"props":224322,"children":224323},{},[224324],{"type":23,"value":224325},"Dates must be ISO-8601",{"type":17,"tag":84,"props":224327,"children":224328},{},[224329],{"type":23,"value":224330},"Time and timezone are optional (defaults to UTC)",{"type":17,"tag":84,"props":224332,"children":224333},{},[224334,224336,224340],{"type":23,"value":224335},"This is the recommended polling strategy when ",{"type":17,"tag":133,"props":224337,"children":224338},{"href":4999},[224339],{"type":23,"value":5002},{"type":23,"value":224341}," aren't used",{"type":17,"tag":68,"props":224343,"children":224345},{"id":224344},"step-4-store-sync-keys-correctly",[224346],{"type":23,"value":224347},"Step 4: Store sync keys correctly",{"type":17,"tag":29,"props":224349,"children":224350},{},[224351],{"type":23,"value":224352},"For every contact you store locally, persist:",{"type":17,"tag":6893,"props":224354,"children":224357},{"className":224355,"code":224356,"language":18718,"meta":7},[18716],"{\n  connectionId: string;\n  unifiedContactId: string; // AccountingContact.id\n}\n",[224358],{"type":17,"tag":6121,"props":224359,"children":224360},{"__ignoreMap":7},[224361],{"type":23,"value":224356},{"type":17,"tag":29,"props":224363,"children":224364},{},[224365,224366,224370],{"type":23,"value":200135},{"type":17,"tag":48,"props":224367,"children":224368},{},[224369],{"type":23,"value":159475},{"type":23,"value":224371}," rely on:",{"type":17,"tag":80,"props":224373,"children":224374},{},[224375,224379,224383,224392],{"type":17,"tag":84,"props":224376,"children":224377},{},[224378],{"type":23,"value":18781},{"type":17,"tag":84,"props":224380,"children":224381},{},[224382],{"type":23,"value":62666},{"type":17,"tag":84,"props":224384,"children":224385},{},[224386],{"type":17,"tag":6121,"props":224387,"children":224389},{"className":224388},[],[224390],{"type":23,"value":224391},"identification",{"type":17,"tag":84,"props":224393,"children":224394},{},[224395],{"type":23,"value":224396},"raw provider IDs",{"type":17,"tag":29,"props":224398,"children":224399},{},[224400],{"type":23,"value":224401},"Those are not guaranteed to be unique or stable.",{"type":17,"tag":68,"props":224403,"children":224405},{"id":224404},"step-5-create-a-customer-or-supplier",[224406],{"type":23,"value":224407},"Step 5: Create a customer or supplier",{"type":17,"tag":29,"props":224409,"children":224410},{},[224411,224413,224419],{"type":23,"value":224412},"To create a new contact, use ",{"type":17,"tag":6121,"props":224414,"children":224416},{"className":224415},[],[224417],{"type":23,"value":224418},"createAccountingContact",{"type":23,"value":54},{"type":17,"tag":6893,"props":224421,"children":224424},{"className":224422,"code":224423,"language":18718,"meta":7},[18716],"const created = await unified.accounting.createAccountingContact({\n  connectionId,\n  accountingContact: {\n    name: \"Acme Corp\",\n    is_customer: true,\n    emails: [{ email: \"billing@acme.com\", type: \"WORK\" }],\n  },\n});\n",[224425],{"type":17,"tag":6121,"props":224426,"children":224427},{"__ignoreMap":7},[224428],{"type":23,"value":224423},{"type":17,"tag":29,"props":224430,"children":224431},{},[224432],{"type":17,"tag":48,"props":224433,"children":224434},{},[224435],{"type":23,"value":19907},{"type":17,"tag":80,"props":224437,"children":224438},{},[224439,224444,224449],{"type":17,"tag":84,"props":224440,"children":224441},{},[224442],{"type":23,"value":224443},"This is a full create (POST)",{"type":17,"tag":84,"props":224445,"children":224446},{},[224447],{"type":23,"value":224448},"You must supply the fields you want set",{"type":17,"tag":84,"props":224450,"children":224451},{},[224452,224454],{"type":23,"value":224453},"The response returns the created ",{"type":17,"tag":6121,"props":224455,"children":224457},{"className":224456},[],[224458],{"type":23,"value":224013},{"type":17,"tag":68,"props":224460,"children":224462},{"id":224461},"step-6-update-a-contact-put",[224463],{"type":23,"value":224464},"Step 6: Update a contact (PUT)",{"type":17,"tag":29,"props":224466,"children":224467},{},[224468,224469,224474,224476,224480],{"type":23,"value":25244},{"type":17,"tag":48,"props":224470,"children":224471},{},[224472],{"type":23,"value":224473},"update method",{"type":23,"value":224475}," is ",{"type":17,"tag":48,"props":224477,"children":224478},{},[224479],{"type":23,"value":110111},{"type":23,"value":224481},", shown as:",{"type":17,"tag":6893,"props":224483,"children":224486},{"className":224484,"code":224485,"language":18718,"meta":7},[18716],"updateAccountingContact\n",[224487],{"type":17,"tag":6121,"props":224488,"children":224489},{"__ignoreMap":7},[224490],{"type":23,"value":224485},{"type":17,"tag":29,"props":224492,"children":224493},{},[224494],{"type":23,"value":224495},"This replaces the contact resource.",{"type":17,"tag":6893,"props":224497,"children":224500},{"className":224498,"code":224499,"language":18718,"meta":7},[18716],"const updated = await unified.accounting.updateAccountingContact({\n  connectionId,\n  id: existingUnifiedContactId,\n  accountingContact: {\n    name: \"Acme Corporation\",\n    is_customer: true,\n    is_supplier: false,\n  },\n});\n",[224501],{"type":17,"tag":6121,"props":224502,"children":224503},{"__ignoreMap":7},[224504],{"type":23,"value":224499},{"type":17,"tag":68,"props":224506,"children":224508},{"id":224507},"step-7-delete-a-contact-optional",[224509],{"type":23,"value":224510},"Step 7: Delete a contact (optional)",{"type":17,"tag":29,"props":224512,"children":224513},{},[224514],{"type":23,"value":224515},"To remove a contact:",{"type":17,"tag":6893,"props":224517,"children":224520},{"className":224518,"code":224519,"language":18718,"meta":7},[18716],"await unified.accounting.removeAccountingContact({\n  connectionId,\n  id: unifiedContactId,\n});\n",[224521],{"type":17,"tag":6121,"props":224522,"children":224523},{"__ignoreMap":7},[224524],{"type":23,"value":224519},{"type":17,"tag":29,"props":224526,"children":224527},{},[224528],{"type":23,"value":224529},"This maps to:",{"type":17,"tag":6893,"props":224531,"children":224534},{"className":224532,"code":224533,"language":20901,"meta":23},[20899],"DELETE /accounting/{connection_id}/contact/{id}\n",[224535],{"type":17,"tag":6121,"props":224536,"children":224537},{"__ignoreMap":7},[224538],{"type":23,"value":224533},{"type":17,"tag":68,"props":224540,"children":224541},{"id":223873},[224542],{"type":23,"value":223879},{"type":17,"tag":29,"props":224544,"children":224545},{},[224546],{"type":23,"value":224547},"Customers and suppliers are one of the most failure-prone parts of accounting integrations, not because the data is complex, but because identity is often split across inconsistent models.",{"type":17,"tag":29,"props":224549,"children":224550},{},[224551,224553,224558,224560,224565,224566,224571,224573,224577],{"type":23,"value":224552},"By treating customers and suppliers as a single normalized ",{"type":17,"tag":6121,"props":224554,"children":224556},{"className":224555},[],[224557],{"type":23,"value":224013},{"type":23,"value":224559}," and relying on explicit role flags (",{"type":17,"tag":6121,"props":224561,"children":224563},{"className":224562},[],[224564],{"type":23,"value":220999},{"type":23,"value":11826},{"type":17,"tag":6121,"props":224567,"children":224569},{"className":224568},[],[224570],{"type":23,"value":221006},{"type":23,"value":224572},"), you avoid duplicate records, vendor-specific branching, and fragile reconciliation logic. The sync patterns in this guide are designed to be safe by default: stable identifiers, explicit ",{"type":17,"tag":133,"props":224574,"children":224575},{"href":1857},[224576],{"type":23,"value":1860},{"type":23,"value":224578},", timestamp-based incremental updates, and documented create/update/delete semantics.",{"type":17,"tag":29,"props":224580,"children":224581},{},[224582],{"type":23,"value":224583},"Used this way, Unified's Accounting API gives you a predictable, maintainable foundation for customer and supplier syncs across accounting systems—without guessing, scraping, or vendor-specific code paths.",{"type":17,"tag":29,"props":224585,"children":224586},{},[224587,224588],{"type":23,"value":1609},{"type":17,"tag":133,"props":224589,"children":224591},{"href":1612,"rel":224590},[214],[224592],{"type":23,"value":1616},{"type":17,"tag":29,"props":224594,"children":224595},{},[224596,224597],{"type":23,"value":1609},{"type":17,"tag":133,"props":224598,"children":224600},{"href":1623,"rel":224599},[214],[224601],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":224603},[224604,224605,224606,224609,224610,224611,224612,224613,224614,224615],{"id":141798,"depth":1629,"text":141801},{"id":224101,"depth":1629,"text":224104},{"id":224172,"depth":1629,"text":224175,"children":224607},[224608],{"id":219592,"depth":1635,"text":219595},{"id":224253,"depth":1629,"text":224256},{"id":224287,"depth":1629,"text":224290},{"id":224344,"depth":1629,"text":224347},{"id":224404,"depth":1629,"text":224407},{"id":224461,"depth":1629,"text":224464},{"id":224507,"depth":1629,"text":224510},{"id":223873,"depth":1629,"text":223879},"content:blog:how_to_sync_customers_or_suppliers_with_unified_accounting_api.md","blog/how_to_sync_customers_or_suppliers_with_unified_accounting_api.md","blog/how_to_sync_customers_or_suppliers_with_unified_accounting_api",{"_path":224620,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":224621,"description":224622,"img":224623,"date":224624,"tag":12,"body":224625,"_type":1677,"_id":225755,"_source":1679,"_file":225756,"_stem":225757,"_extension":1682},"/blog/how_to_create_and_sync_invoices_with_unified_accounting_api","How to Create and Sync Invoices with Unified's Accounting API","Invoicing is one of the most opinionated parts of accounting systems—and one of the easiest places for integrations to fail.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_and_sync_invoices_with_unified_accounting_api-icon.png","2026-01-19T21:53:00.000Z",{"type":14,"children":224626,"toc":225719},[224627,224632,224635,224642,224646,224651,224656,224674,224679,224702,224707,224711,224750,224754,224782,224786,224794,224804,224810,224821,224825,224935,224941,224950,224955,224961,224973,224982,224986,225024,225028,225039,225045,225050,225059,225065,225070,225076,225087,225096,225108,225114,225122,225127,225133,225141,225147,225155,225161,225166,225175,225179,225204,225210,225219,225230,225236,225242,225251,225263,225269,225278,225283,225299,225305,225316,225325,225330,225336,225345,225350,225356,225361,225444,225450,225478,225484,225489,225508,225517,225521,225543,225549,225560,225566,225571,225648,225653,225657,225661,225684,225696,225701,225710],{"type":17,"tag":18,"props":224628,"children":224630},{"id":224629},"how-to-create-and-sync-invoices-with-unifieds-accounting-api",[224631],{"type":23,"value":224621},{"type":17,"tag":25,"props":224633,"children":224634},{},[],{"type":17,"tag":29,"props":224636,"children":224637},{},[224638],{"type":17,"tag":33,"props":224639,"children":224640},{},[224641],{"type":23,"value":219187},{"type":17,"tag":29,"props":224643,"children":224644},{},[224645],{"type":23,"value":224622},{"type":17,"tag":29,"props":224647,"children":224648},{},[224649],{"type":23,"value":224650},"Across providers, invoices differ in how they're classified, when they can be edited, how they're delivered, and what 'paid' actually means. Some systems allow drafts to be modified freely. Others lock invoices once authorized. Payment collection, tax handling, and delivery behavior vary widely, even when the surface concepts look identical.",{"type":17,"tag":29,"props":224652,"children":224653},{},[224654],{"type":23,"value":224655},"For a PM or backend team, this creates immediate risk:",{"type":17,"tag":80,"props":224657,"children":224658},{},[224659,224664,224669],{"type":17,"tag":84,"props":224660,"children":224661},{},[224662],{"type":23,"value":224663},"Can invoices be created and updated safely across providers without branching logic?",{"type":17,"tag":84,"props":224665,"children":224666},{},[224667],{"type":23,"value":224668},"When is an invoice immutable, and how should failures be surfaced to users?",{"type":17,"tag":84,"props":224670,"children":224671},{},[224672],{"type":23,"value":224673},"How do you control delivery and payment behavior without relying on undocumented defaults?",{"type":17,"tag":29,"props":224675,"children":224676},{},[224677],{"type":23,"value":224678},"Many teams discover too late that invoice logic baked for one accounting system doesn't generalize. The result is partial writes, rejected updates, or invoices that don't behave the way users expect.",{"type":17,"tag":29,"props":224680,"children":224681},{},[224682,224683,224687,224689,224694,224696,224700],{"type":23,"value":25244},{"type":17,"tag":133,"props":224684,"children":224685},{"href":82425},[224686],{"type":23,"value":128616},{"type":23,"value":224688}," is designed to make invoice automation explicit and defensible. Invoices are represented through a normalized ",{"type":17,"tag":6121,"props":224690,"children":224692},{"className":224691},[],[224693],{"type":23,"value":220797},{"type":23,"value":224695}," model, with classification handled at the line-item level and lifecycle rules enforced by the provider rather than guessed upstream. Core behaviors—listing, syncing, creating, updating, delivering, and removing invoices—are exposed through documented parameters with consistent ",{"type":17,"tag":133,"props":224697,"children":224698},{"href":1857},[224699],{"type":23,"value":1860},{"type":23,"value":224701}," and error semantics.",{"type":17,"tag":29,"props":224703,"children":224704},{},[224705],{"type":23,"value":224706},"This guide shows how to build a production-grade invoice sync and write flow using Unified's Accounting API—resolving dependencies, creating classified invoices, controlling delivery and payment behavior, and handling provider constraints without vendor-specific code paths or assumptions.",{"type":17,"tag":68,"props":224708,"children":224709},{"id":199540},[224710],{"type":23,"value":199543},{"type":17,"tag":80,"props":224712,"children":224713},{},[224714,224719,224724,224729,224734,224739],{"type":17,"tag":84,"props":224715,"children":224716},{},[224717],{"type":23,"value":224718},"Listing invoices with pagination and incremental sync",{"type":17,"tag":84,"props":224720,"children":224721},{},[224722],{"type":23,"value":224723},"Resolving required invoice dependencies (contacts, accounts, categories, tax rates)",{"type":17,"tag":84,"props":224725,"children":224726},{},[224727],{"type":23,"value":224728},"Creating invoices with classified line items",{"type":17,"tag":84,"props":224730,"children":224731},{},[224732],{"type":23,"value":224733},"Controlling invoice delivery and payment behavior",{"type":17,"tag":84,"props":224735,"children":224736},{},[224737],{"type":23,"value":224738},"Updating and removing invoices",{"type":17,"tag":84,"props":224740,"children":224741},{},[224742,224744,224748],{"type":23,"value":224743},"Handling pagination, ",{"type":17,"tag":133,"props":224745,"children":224746},{"href":135},[224747],{"type":23,"value":138},{"type":23,"value":224749},", and provider constraints",{"type":17,"tag":68,"props":224751,"children":224752},{"id":141798},[224753],{"type":23,"value":141801},{"type":17,"tag":80,"props":224755,"children":224756},{},[224757,224761,224765,224769,224778],{"type":17,"tag":84,"props":224758,"children":224759},{},[224760],{"type":23,"value":219393},{"type":17,"tag":84,"props":224762,"children":224763},{},[224764],{"type":23,"value":219398},{"type":17,"tag":84,"props":224766,"children":224767},{},[224768],{"type":23,"value":219403},{"type":17,"tag":84,"props":224770,"children":224771},{},[224772,224773],{"type":23,"value":219408},{"type":17,"tag":6121,"props":224774,"children":224776},{"className":224775},[],[224777],{"type":23,"value":19766},{"type":17,"tag":84,"props":224779,"children":224780},{},[224781],{"type":23,"value":220751},{"type":17,"tag":68,"props":224783,"children":224784},{"id":19743},[224785],{"type":23,"value":19746},{"type":17,"tag":6893,"props":224787,"children":224789},{"className":224788,"code":219429,"language":18718,"meta":7},[18716],[224790],{"type":17,"tag":6121,"props":224791,"children":224792},{"__ignoreMap":7},[224793],{"type":23,"value":219429},{"type":17,"tag":29,"props":224795,"children":224796},{},[224797,224798,224803],{"type":23,"value":220768},{"type":17,"tag":6121,"props":224799,"children":224801},{"className":224800},[],[224802],{"type":23,"value":19766},{"type":23,"value":220775},{"type":17,"tag":68,"props":224805,"children":224807},{"id":224806},"step-2-understand-the-invoice-data-model-critical",[224808],{"type":23,"value":224809},"Step 2: Understand the Invoice data model (critical)",{"type":17,"tag":29,"props":224811,"children":224812},{},[224813,224815,224820],{"type":23,"value":224814},"Unified represents invoices using the normalized ",{"type":17,"tag":6121,"props":224816,"children":224818},{"className":224817},[],[224819],{"type":23,"value":220797},{"type":23,"value":74653},{"type":17,"tag":29,"props":224822,"children":224823},{},[224824],{"type":23,"value":65343},{"type":17,"tag":80,"props":224826,"children":224827},{},[224828,224845,224852,224902,224912,224930],{"type":17,"tag":84,"props":224829,"children":224830},{},[224831,224833,224838,224840],{"type":23,"value":224832},"Invoices are ",{"type":17,"tag":48,"props":224834,"children":224835},{},[224836],{"type":23,"value":224837},"customer-facing",{"type":23,"value":224839}," and reference a ",{"type":17,"tag":6121,"props":224841,"children":224843},{"className":224842},[],[224844],{"type":23,"value":26302},{"type":17,"tag":84,"props":224846,"children":224847},{},[224848],{"type":17,"tag":48,"props":224849,"children":224850},{},[224851],{"type":23,"value":223474},{"type":17,"tag":84,"props":224853,"children":224854},{},[224855,224857],{"type":23,"value":224856},"Line items may reference:\n",{"type":17,"tag":80,"props":224858,"children":224859},{},[224860,224874,224888],{"type":17,"tag":84,"props":224861,"children":224862},{},[224863,224868,224869],{"type":17,"tag":6121,"props":224864,"children":224866},{"className":224865},[],[224867],{"type":23,"value":184840},{"type":23,"value":98082},{"type":17,"tag":6121,"props":224870,"children":224872},{"className":224871},[],[224873],{"type":23,"value":219515},{"type":17,"tag":84,"props":224875,"children":224876},{},[224877,224882,224883],{"type":17,"tag":6121,"props":224878,"children":224880},{"className":224879},[],[224881],{"type":23,"value":223505},{"type":23,"value":98082},{"type":17,"tag":6121,"props":224884,"children":224886},{"className":224885},[],[224887],{"type":23,"value":223512},{"type":17,"tag":84,"props":224889,"children":224890},{},[224891,224896,224897],{"type":17,"tag":6121,"props":224892,"children":224894},{"className":224893},[],[224895],{"type":23,"value":223521},{"type":23,"value":98082},{"type":17,"tag":6121,"props":224898,"children":224900},{"className":224899},[],[224901],{"type":23,"value":223528},{"type":17,"tag":84,"props":224903,"children":224904},{},[224905,224907],{"type":23,"value":224906},"Invoice lifecycle is expressed via ",{"type":17,"tag":6121,"props":224908,"children":224910},{"className":224909},[],[224911],{"type":23,"value":19949},{"type":17,"tag":84,"props":224913,"children":224914},{},[224915,224917,224923,224924],{"type":23,"value":224916},"Payment and delivery behavior is controlled via ",{"type":17,"tag":6121,"props":224918,"children":224920},{"className":224919},[],[224921],{"type":23,"value":224922},"payment_collection_method",{"type":23,"value":34435},{"type":17,"tag":6121,"props":224925,"children":224927},{"className":224926},[],[224928],{"type":23,"value":224929},"send",{"type":17,"tag":84,"props":224931,"children":224932},{},[224933],{"type":23,"value":224934},"Provider rules (required fields, allowed transitions) are enforced downstream",{"type":17,"tag":239,"props":224936,"children":224938},{"id":224937},"invoice-status-values",[224939],{"type":23,"value":224940},"Invoice status values",{"type":17,"tag":6893,"props":224942,"children":224945},{"className":224943,"code":224944,"language":18718,"meta":7},[18716],"'DRAFT'\n'VOIDED'\n'AUTHORIZED'\n'PAID'\n'PARTIALLY_PAID'\n'PARTIALLY_REFUNDED'\n'REFUNDED'\n'SUBMITTED'\n'DELETED'\n'OVERDUE'\n",[224946],{"type":17,"tag":6121,"props":224947,"children":224948},{"__ignoreMap":7},[224949],{"type":23,"value":224944},{"type":17,"tag":29,"props":224951,"children":224952},{},[224953],{"type":23,"value":224954},"These values are normalized, but providers may return additional states. Treat this as an open set.",{"type":17,"tag":68,"props":224956,"children":224958},{"id":224957},"step-3-list-invoices-sync-in",[224959],{"type":23,"value":224960},"Step 3: List invoices (sync in)",{"type":17,"tag":29,"props":224962,"children":224963},{},[224964,224966,224972],{"type":23,"value":224965},"To sync invoices into your system, use ",{"type":17,"tag":6121,"props":224967,"children":224969},{"className":224968},[],[224970],{"type":23,"value":224971},"listAccountingInvoices",{"type":23,"value":54},{"type":17,"tag":6893,"props":224974,"children":224977},{"className":224975,"code":224976,"language":18718,"meta":7},[18716],"const results = await sdk.accounting.listAccountingInvoices({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-22T22:41:23.849Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  contact_id: '',\n  org_id: '',\n  type: '',\n  fields: '',\n  raw: '',\n});\n",[224978],{"type":17,"tag":6121,"props":224979,"children":224980},{"__ignoreMap":7},[224981],{"type":23,"value":224976},{"type":17,"tag":239,"props":224983,"children":224984},{"id":219592},[224985],{"type":23,"value":219595},{"type":17,"tag":80,"props":224987,"children":224988},{},[224989,224997,225006,225015],{"type":17,"tag":84,"props":224990,"children":224991},{},[224992,224993],{"type":23,"value":221076},{"type":17,"tag":48,"props":224994,"children":224995},{},[224996],{"type":23,"value":219614},{"type":17,"tag":84,"props":224998,"children":224999},{},[225000,225001,225005],{"type":23,"value":223590},{"type":17,"tag":48,"props":225002,"children":225003},{},[225004],{"type":23,"value":219614},{"type":23,"value":219631},{"type":17,"tag":84,"props":225007,"children":225008},{},[225009,225010,225014],{"type":23,"value":143132},{"type":17,"tag":48,"props":225011,"children":225012},{},[225013],{"type":23,"value":48411},{"type":23,"value":223609},{"type":17,"tag":84,"props":225016,"children":225017},{},[225018,225019],{"type":23,"value":223614},{"type":17,"tag":6121,"props":225020,"children":225022},{"className":225021},[],[225023],{"type":23,"value":219655},{"type":17,"tag":239,"props":225025,"children":225026},{"id":219658},[225027],{"type":23,"value":157204},{"type":17,"tag":29,"props":225029,"children":225030},{},[225031,225032,225037],{"type":23,"value":33722},{"type":17,"tag":6121,"props":225033,"children":225035},{"className":225034},[],[225036],{"type":23,"value":26291},{"type":23,"value":225038}," to fetch only invoices updated since your last sync timestamp. This is the recommended polling strategy.",{"type":17,"tag":68,"props":225040,"children":225042},{"id":225041},"step-4-retrieve-a-single-invoice",[225043],{"type":23,"value":225044},"Step 4: Retrieve a single invoice",{"type":17,"tag":29,"props":225046,"children":225047},{},[225048],{"type":23,"value":225049},"Use this to verify creates/updates or reconcile provider-side changes.",{"type":17,"tag":6893,"props":225051,"children":225054},{"className":225052,"code":225053,"language":18718,"meta":7},[18716],"const invoice = await sdk.accounting.getAccountingInvoice({\n  connectionId,\n  id: invoiceId,\n  fields: '',\n  raw: '',\n});\n",[225055],{"type":17,"tag":6121,"props":225056,"children":225057},{"__ignoreMap":7},[225058],{"type":23,"value":225053},{"type":17,"tag":68,"props":225060,"children":225062},{"id":225061},"step-5-resolve-invoice-dependencies",[225063],{"type":23,"value":225064},"Step 5: Resolve invoice dependencies",{"type":17,"tag":29,"props":225066,"children":225067},{},[225068],{"type":23,"value":225069},"Before creating an invoice, resolve the objects it references.",{"type":17,"tag":239,"props":225071,"children":225073},{"id":225072},"resolve-the-customer-contact",[225074],{"type":23,"value":225075},"Resolve the customer (contact)",{"type":17,"tag":29,"props":225077,"children":225078},{},[225079,225081,225086],{"type":23,"value":225080},"Invoices require a ",{"type":17,"tag":6121,"props":225082,"children":225084},{"className":225083},[],[225085],{"type":23,"value":26302},{"type":23,"value":54},{"type":17,"tag":6893,"props":225088,"children":225091},{"className":225089,"code":225090,"language":18718,"meta":7},[18716],"const contacts = await sdk.accounting.listAccountingContacts({\n  connectionId,\n  limit: 50,\n  offset: 0,\n  updated_gte: '2026-01-22T22:41:23.849Z',\n  sort: 'updated_at',\n  order: 'asc',\n  query: '',\n  type: 'CUSTOMER',\n  org_id: '',\n  fields: '',\n  raw: '',\n});\n",[225092],{"type":17,"tag":6121,"props":225093,"children":225094},{"__ignoreMap":7},[225095],{"type":23,"value":225090},{"type":17,"tag":29,"props":225097,"children":225098},{},[225099,225101,225107],{"type":23,"value":225100},"Select the appropriate ",{"type":17,"tag":6121,"props":225102,"children":225104},{"className":225103},[],[225105],{"type":23,"value":225106},"AccountingContact.id",{"type":23,"value":54},{"type":17,"tag":239,"props":225109,"children":225111},{"id":225110},"resolve-accounts-optional-but-common",[225112],{"type":23,"value":225113},"Resolve accounts (optional but common)",{"type":17,"tag":6893,"props":225115,"children":225117},{"className":225116,"code":223675,"language":18718,"meta":7},[18716],[225118],{"type":17,"tag":6121,"props":225119,"children":225120},{"__ignoreMap":7},[225121],{"type":23,"value":223675},{"type":17,"tag":29,"props":225123,"children":225124},{},[225125],{"type":23,"value":225126},"Use an account ID when your provider supports line-item account classification.",{"type":17,"tag":239,"props":225128,"children":225130},{"id":225129},"resolve-categories-optional",[225131],{"type":23,"value":225132},"Resolve categories (optional)",{"type":17,"tag":6893,"props":225134,"children":225136},{"className":225135,"code":223660,"language":18718,"meta":7},[18716],[225137],{"type":17,"tag":6121,"props":225138,"children":225139},{"__ignoreMap":7},[225140],{"type":23,"value":223660},{"type":17,"tag":239,"props":225142,"children":225144},{"id":225143},"resolve-tax-rates-optional",[225145],{"type":23,"value":225146},"Resolve tax rates (optional)",{"type":17,"tag":6893,"props":225148,"children":225150},{"className":225149,"code":223690,"language":18718,"meta":7},[18716],[225151],{"type":17,"tag":6121,"props":225152,"children":225153},{"__ignoreMap":7},[225154],{"type":23,"value":223690},{"type":17,"tag":68,"props":225156,"children":225158},{"id":225157},"step-6-build-a-provider-safe-invoice-payload",[225159],{"type":23,"value":225160},"Step 6: Build a provider-safe invoice payload",{"type":17,"tag":29,"props":225162,"children":225163},{},[225164],{"type":23,"value":225165},"A minimal, classification-aware invoice payload:",{"type":17,"tag":6893,"props":225167,"children":225170},{"className":225168,"code":225169,"language":18718,"meta":7},[18716],"const invoice = {\n  contact_id: customerId,\n  currency: 'USD',\n  invoice_number: 'INV-10042',\n  notes: 'January subscription',\n  payment_collection_method: 'send_invoice',\n  send: true,\n  lineitems: [\n    {\n      unit_quantity: 1,\n      unit_amount: 500.0,\n      tax_amount: 50.0,\n      account_id: revenueAccountId,\n      category_ids: [subscriptionCategoryId],\n      taxrate_id: salesTaxId,\n      item_name: 'Pro Plan – January',\n    },\n  ],\n};\n",[225171],{"type":17,"tag":6121,"props":225172,"children":225173},{"__ignoreMap":7},[225174],{"type":23,"value":225169},{"type":17,"tag":29,"props":225176,"children":225177},{},[225178],{"type":23,"value":193764},{"type":17,"tag":80,"props":225180,"children":225181},{},[225182,225195,225199],{"type":17,"tag":84,"props":225183,"children":225184},{},[225185,225187,225190],{"type":23,"value":225186},"Totals are typically derived as",{"type":17,"tag":3891,"props":225188,"children":225189},{},[],{"type":17,"tag":6121,"props":225191,"children":225193},{"className":225192},[],[225194],{"type":23,"value":223782},{"type":17,"tag":84,"props":225196,"children":225197},{},[225198],{"type":23,"value":223787},{"type":17,"tag":84,"props":225200,"children":225201},{},[225202],{"type":23,"value":225203},"Leave optional fields unset unless you are certain the provider supports them",{"type":17,"tag":68,"props":225205,"children":225207},{"id":225206},"step-7-create-the-invoice",[225208],{"type":23,"value":225209},"Step 7: Create the invoice",{"type":17,"tag":6893,"props":225211,"children":225214},{"className":225212,"code":225213,"language":18718,"meta":7},[18716],"const created = await sdk.accounting.createAccountingInvoice({\n  connectionId,\n  accountingInvoice: invoice,\n  fields: '',\n  raw: '',\n});\n",[225215],{"type":17,"tag":6121,"props":225216,"children":225217},{"__ignoreMap":7},[225218],{"type":23,"value":225213},{"type":17,"tag":29,"props":225220,"children":225221},{},[225222,225223,225228],{"type":23,"value":223812},{"type":17,"tag":6121,"props":225224,"children":225226},{"className":225225},[],[225227],{"type":23,"value":220797},{"type":23,"value":225229}," object reflecting the provider's current state.",{"type":17,"tag":68,"props":225231,"children":225233},{"id":225232},"step-8-control-invoice-delivery-and-payment-behavior",[225234],{"type":23,"value":225235},"Step 8: Control invoice delivery and payment behavior",{"type":17,"tag":239,"props":225237,"children":225239},{"id":225238},"send-invoice-email-link",[225240],{"type":23,"value":225241},"Send invoice (email / link)",{"type":17,"tag":6893,"props":225243,"children":225246},{"className":225244,"code":225245,"language":18718,"meta":7},[18716],"payment_collection_method: 'send_invoice'\nsend: true\n",[225247],{"type":17,"tag":6121,"props":225248,"children":225249},{"__ignoreMap":7},[225250],{"type":23,"value":225245},{"type":17,"tag":29,"props":225252,"children":225253},{},[225254,225256,225262],{"type":23,"value":225255},"This typically emails the invoice or makes a payment link available via ",{"type":17,"tag":6121,"props":225257,"children":225259},{"className":225258},[],[225260],{"type":23,"value":225261},"invoice.url",{"type":23,"value":54},{"type":17,"tag":239,"props":225264,"children":225266},{"id":225265},"charge-automatically",[225267],{"type":23,"value":225268},"Charge automatically",{"type":17,"tag":6893,"props":225270,"children":225273},{"className":225271,"code":225272,"language":18718,"meta":7},[18716],"payment_collection_method: 'charge_automatically'\nsend: true\n",[225274],{"type":17,"tag":6121,"props":225275,"children":225276},{"__ignoreMap":7},[225277],{"type":23,"value":225272},{"type":17,"tag":29,"props":225279,"children":225280},{},[225281],{"type":23,"value":225282},"This attempts to charge the customer's default payment method.",{"type":17,"tag":29,"props":225284,"children":225285},{},[225286,225290,225292,225297],{"type":17,"tag":48,"props":225287,"children":225288},{},[225289],{"type":23,"value":19907},{"type":23,"value":225291}," Provider behavior varies. Some platforms require additional configuration or a default payment method on the contact. Some may ignore ",{"type":17,"tag":6121,"props":225293,"children":225295},{"className":225294},[],[225296],{"type":23,"value":224929},{"type":23,"value":225298}," depending on provider capabilities.",{"type":17,"tag":68,"props":225300,"children":225302},{"id":225301},"step-9-update-an-invoice",[225303],{"type":23,"value":225304},"Step 9: Update an invoice",{"type":17,"tag":29,"props":225306,"children":225307},{},[225308,225310,225315],{"type":23,"value":225309},"To update an invoice, supply its ",{"type":17,"tag":6121,"props":225311,"children":225313},{"className":225312},[],[225314],{"type":23,"value":18766},{"type":23,"value":54},{"type":17,"tag":6893,"props":225317,"children":225320},{"className":225318,"code":225319,"language":18718,"meta":7},[18716],"const updated = await sdk.accounting.updateAccountingInvoice({\n  connectionId,\n  id: invoiceId,\n  accountingInvoice: {\n    notes: 'Updated invoice notes',\n  },\n  fields: '',\n  raw: '',\n});\n",[225321],{"type":17,"tag":6121,"props":225322,"children":225323},{"__ignoreMap":7},[225324],{"type":23,"value":225319},{"type":17,"tag":29,"props":225326,"children":225327},{},[225328],{"type":23,"value":225329},"Invoice updates may be restricted by provider lifecycle rules. For example, some providers do not allow updates once an invoice is submitted or paid.",{"type":17,"tag":68,"props":225331,"children":225333},{"id":225332},"step-10-remove-an-invoice-optional",[225334],{"type":23,"value":225335},"Step 10: Remove an invoice (optional)",{"type":17,"tag":6893,"props":225337,"children":225340},{"className":225338,"code":225339,"language":18718,"meta":7},[18716],"await sdk.accounting.removeAccountingInvoice({\n  connectionId,\n  id: invoiceId,\n});\n",[225341],{"type":17,"tag":6121,"props":225342,"children":225343},{"__ignoreMap":7},[225344],{"type":23,"value":225339},{"type":17,"tag":29,"props":225346,"children":225347},{},[225348],{"type":23,"value":225349},"Use this cautiously. Some providers treat removal as a soft delete or disallow deletion in certain states.",{"type":17,"tag":68,"props":225351,"children":225353},{"id":225352},"pagination-filtering-and-querying",[225354],{"type":23,"value":225355},"Pagination, filtering, and querying",{"type":17,"tag":29,"props":225357,"children":225358},{},[225359],{"type":23,"value":225360},"All list endpoints share the same semantics:",{"type":17,"tag":80,"props":225362,"children":225363},{},[225364,225380,225389,225419],{"type":17,"tag":84,"props":225365,"children":225366},{},[225367,225372,225373,225378],{"type":17,"tag":6121,"props":225368,"children":225370},{"className":225369},[],[225371],{"type":23,"value":48389},{"type":23,"value":26030},{"type":17,"tag":6121,"props":225374,"children":225376},{"className":225375},[],[225377],{"type":23,"value":48411},{"type":23,"value":225379}," pagination",{"type":17,"tag":84,"props":225381,"children":225382},{},[225383,225388],{"type":17,"tag":6121,"props":225384,"children":225386},{"className":225385},[],[225387],{"type":23,"value":26291},{"type":23,"value":161412},{"type":17,"tag":84,"props":225390,"children":225391},{},[225392,225394,225400,225401,225406,225407,225412,225413,225418],{"type":23,"value":225393},"Sorting via ",{"type":17,"tag":6121,"props":225395,"children":225397},{"className":225396},[],[225398],{"type":23,"value":225399},"sort",{"type":23,"value":44573},{"type":17,"tag":6121,"props":225402,"children":225404},{"className":225403},[],[225405],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":225408,"children":225410},{"className":225409},[],[225411],{"type":23,"value":25337},{"type":23,"value":11826},{"type":17,"tag":6121,"props":225414,"children":225416},{"className":225415},[],[225417],{"type":23,"value":33446},{"type":23,"value":12034},{"type":17,"tag":84,"props":225420,"children":225421},{},[225422,225424,225429,225430,225436,225437,225443],{"type":23,"value":225423},"Ordering via ",{"type":17,"tag":6121,"props":225425,"children":225427},{"className":225426},[],[225428],{"type":23,"value":75822},{"type":23,"value":44573},{"type":17,"tag":6121,"props":225431,"children":225433},{"className":225432},[],[225434],{"type":23,"value":225435},"asc",{"type":23,"value":11826},{"type":17,"tag":6121,"props":225438,"children":225440},{"className":225439},[],[225441],{"type":23,"value":225442},"desc",{"type":23,"value":12034},{"type":17,"tag":239,"props":225445,"children":225447},{"id":225446},"query-limitations",[225448],{"type":23,"value":225449},"Query limitations",{"type":17,"tag":80,"props":225451,"children":225452},{},[225453,225468,225473],{"type":17,"tag":84,"props":225454,"children":225455},{},[225456,225461,225463],{"type":17,"tag":6121,"props":225457,"children":225459},{"className":225458},[],[225460],{"type":23,"value":48368},{"type":23,"value":225462}," filters by ",{"type":17,"tag":48,"props":225464,"children":225465},{},[225466],{"type":23,"value":225467},"name or email only",{"type":17,"tag":84,"props":225469,"children":225470},{},[225471],{"type":23,"value":225472},"Behavior is integration-specific",{"type":17,"tag":84,"props":225474,"children":225475},{},[225476],{"type":23,"value":225477},"For complex filtering, Unified strongly recommends syncing data into your own database",{"type":17,"tag":68,"props":225479,"children":225481},{"id":225480},"rate-limits-and-retries",[225482],{"type":23,"value":225483},"Rate limits and retries",{"type":17,"tag":29,"props":225485,"children":225486},{},[225487],{"type":23,"value":225488},"Unified enforces:",{"type":17,"tag":6154,"props":225490,"children":225491},{},[225492,225500],{"type":17,"tag":84,"props":225493,"children":225494},{},[225495],{"type":17,"tag":48,"props":225496,"children":225497},{},[225498],{"type":23,"value":225499},"Upstream provider rate limits",{"type":17,"tag":84,"props":225501,"children":225502},{},[225503],{"type":17,"tag":48,"props":225504,"children":225505},{},[225506],{"type":23,"value":225507},"Unified-level fairness limits",{"type":17,"tag":29,"props":225509,"children":225510},{},[225511,225512,225516],{"type":23,"value":220344},{"type":17,"tag":48,"props":225513,"children":225514},{},[225515],{"type":23,"value":220349},{"type":23,"value":54},{"type":17,"tag":239,"props":225518,"children":225519},{"id":220352},[225520],{"type":23,"value":220355},{"type":17,"tag":80,"props":225522,"children":225523},{},[225524,225529,225533,225538],{"type":17,"tag":84,"props":225525,"children":225526},{},[225527],{"type":23,"value":225528},"Exponential backoff (1s → 2s → 4s → 8s)",{"type":17,"tag":84,"props":225530,"children":225531},{},[225532],{"type":23,"value":159918},{"type":17,"tag":84,"props":225534,"children":225535},{},[225536],{"type":23,"value":225537},"Cap retry attempts",{"type":17,"tag":84,"props":225539,"children":225540},{},[225541],{"type":23,"value":225542},"Queue requests for high-volume operations",{"type":17,"tag":239,"props":225544,"children":225546},{"id":225545},"strong-recommendation",[225547],{"type":23,"value":225548},"Strong recommendation",{"type":17,"tag":29,"props":225550,"children":225551},{},[225552,225554,225558],{"type":23,"value":225553},"For continuous invoice sync or lifecycle tracking, use ",{"type":17,"tag":48,"props":225555,"children":225556},{},[225557],{"type":23,"value":5002},{"type":23,"value":225559}," instead of polling. Unified manages retries, backoff, and initial sync for you.",{"type":17,"tag":68,"props":225561,"children":225563},{"id":225562},"error-handling",[225564],{"type":23,"value":225565},"Error handling",{"type":17,"tag":29,"props":225567,"children":225568},{},[225569],{"type":23,"value":225570},"Unified uses standard HTTP status codes:",{"type":17,"tag":80,"props":225572,"children":225573},{},[225574,225584,225594,225605,225616,225626,225637],{"type":17,"tag":84,"props":225575,"children":225576},{},[225577,225582],{"type":17,"tag":6121,"props":225578,"children":225580},{"className":225579},[],[225581],{"type":23,"value":139189},{"type":23,"value":225583}," – invalid parameters",{"type":17,"tag":84,"props":225585,"children":225586},{},[225587,225592],{"type":17,"tag":6121,"props":225588,"children":225590},{"className":225589},[],[225591],{"type":23,"value":139168},{"type":23,"value":225593}," – broken or revoked connection",{"type":17,"tag":84,"props":225595,"children":225596},{},[225597,225603],{"type":17,"tag":6121,"props":225598,"children":225600},{"className":225599},[],[225601],{"type":23,"value":225602},"403",{"type":23,"value":225604}," – missing scopes",{"type":17,"tag":84,"props":225606,"children":225607},{},[225608,225614],{"type":17,"tag":6121,"props":225609,"children":225611},{"className":225610},[],[225612],{"type":23,"value":225613},"404",{"type":23,"value":225615}," – resource not found",{"type":17,"tag":84,"props":225617,"children":225618},{},[225619,225624],{"type":17,"tag":6121,"props":225620,"children":225622},{"className":225621},[],[225623],{"type":23,"value":139179},{"type":23,"value":225625}," – rate limit exceeded",{"type":17,"tag":84,"props":225627,"children":225628},{},[225629,225635],{"type":17,"tag":6121,"props":225630,"children":225632},{"className":225631},[],[225633],{"type":23,"value":225634},"501",{"type":23,"value":225636}," – feature not supported by this integration",{"type":17,"tag":84,"props":225638,"children":225639},{},[225640,225646],{"type":17,"tag":6121,"props":225641,"children":225643},{"className":225642},[],[225644],{"type":23,"value":225645},"500",{"type":23,"value":225647}," – internal error (retryable)",{"type":17,"tag":29,"props":225649,"children":225650},{},[225651],{"type":23,"value":225652},"Errors are often provider-specific and should be surfaced clearly to users.",{"type":17,"tag":68,"props":225654,"children":225655},{"id":44585},[225656],{"type":23,"value":44588},{"type":17,"tag":29,"props":225658,"children":225659},{},[225660],{"type":23,"value":220384},{"type":17,"tag":80,"props":225662,"children":225663},{},[225664,225669,225674,225679],{"type":17,"tag":84,"props":225665,"children":225666},{},[225667],{"type":23,"value":225668},"List, create, update, and remove invoices across accounting platforms",{"type":17,"tag":84,"props":225670,"children":225671},{},[225672],{"type":23,"value":225673},"Classify invoice line items using normalized accounts, categories, and tax rates",{"type":17,"tag":84,"props":225675,"children":225676},{},[225677],{"type":23,"value":225678},"Control invoice delivery and payment behavior through a single API",{"type":17,"tag":84,"props":225680,"children":225681},{},[225682],{"type":23,"value":225683},"Handle pagination, rate limits, and provider constraints safely",{"type":17,"tag":29,"props":225685,"children":225686},{},[225687,225689,225694],{"type":23,"value":225688},"The key design principle is ",{"type":17,"tag":48,"props":225690,"children":225691},{},[225692],{"type":23,"value":225693},"defensive integration",{"type":23,"value":225695},": rely on normalized models, expect provider variance, and avoid assuming required fields or lifecycle transitions.",{"type":17,"tag":29,"props":225697,"children":225698},{},[225699],{"type":23,"value":225700},"If you need real-time invoice updates or high-volume sync, pair this workflow with Unified webhooks.",{"type":17,"tag":29,"props":225702,"children":225703},{},[225704,225705],{"type":23,"value":1609},{"type":17,"tag":133,"props":225706,"children":225708},{"href":1612,"rel":225707},[214],[225709],{"type":23,"value":1616},{"type":17,"tag":29,"props":225711,"children":225712},{},[225713,225714],{"type":23,"value":1609},{"type":17,"tag":133,"props":225715,"children":225717},{"href":1623,"rel":225716},[214],[225718],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":225720},[225721,225722,225723,225724,225727,225731,225732,225738,225739,225740,225744,225745,225746,225749,225753,225754],{"id":199540,"depth":1629,"text":199543},{"id":141798,"depth":1629,"text":141801},{"id":19743,"depth":1629,"text":19746},{"id":224806,"depth":1629,"text":224809,"children":225725},[225726],{"id":224937,"depth":1635,"text":224940},{"id":224957,"depth":1629,"text":224960,"children":225728},[225729,225730],{"id":219592,"depth":1635,"text":219595},{"id":219658,"depth":1635,"text":157204},{"id":225041,"depth":1629,"text":225044},{"id":225061,"depth":1629,"text":225064,"children":225733},[225734,225735,225736,225737],{"id":225072,"depth":1635,"text":225075},{"id":225110,"depth":1635,"text":225113},{"id":225129,"depth":1635,"text":225132},{"id":225143,"depth":1635,"text":225146},{"id":225157,"depth":1629,"text":225160},{"id":225206,"depth":1629,"text":225209},{"id":225232,"depth":1629,"text":225235,"children":225741},[225742,225743],{"id":225238,"depth":1635,"text":225241},{"id":225265,"depth":1635,"text":225268},{"id":225301,"depth":1629,"text":225304},{"id":225332,"depth":1629,"text":225335},{"id":225352,"depth":1629,"text":225355,"children":225747},[225748],{"id":225446,"depth":1635,"text":225449},{"id":225480,"depth":1629,"text":225483,"children":225750},[225751,225752],{"id":220352,"depth":1635,"text":220355},{"id":225545,"depth":1635,"text":225548},{"id":225562,"depth":1629,"text":225565},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_create_and_sync_invoices_with_unified_accounting_api.md","blog/how_to_create_and_sync_invoices_with_unified_accounting_api.md","blog/how_to_create_and_sync_invoices_with_unified_accounting_api",{"_path":225759,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":225760,"description":225761,"img":225762,"date":225763,"tag":12,"body":225764,"_type":1677,"_id":226503,"_source":1679,"_file":226504,"_stem":226505,"_extension":1682},"/blog/which_unified_api_solutions_have_a_usage_based_pricing_model","Which Unified API Solutions Have a Usage-Based Pricing Model?","Unified APIs make it possible to ship dozens of integrations through a single interface. But how those platforms price usage has a major impact on whether your...","https://s3.us-east-2.amazonaws.com/unified-article-images/which_unified_api_solutions_have_a_usage_based_pricing_model-icon.png","2026-01-16T16:20:00.000Z",{"type":14,"children":225765,"toc":226484},[225766,225771,225774,225782,225794,225799,225813,225818,225824,225843,225861,225866,225899,225910,225916,225921,225938,225949,225961,225979,225984,225996,226007,226048,226053,226059,226064,226070,226085,226096,226102,226126,226131,226139,226157,226163,226173,226178,226185,226203,226209,226226,226231,226238,226256,226262,226267,226273,226296,226302,226307,226325,226330,226336,226341,226359,226364,226370,226375,226386,226396,226409,226414,226418,226426,226448,226459],{"type":17,"tag":18,"props":225767,"children":225769},{"id":225768},"which-unified-api-solutions-have-a-usage-based-pricing-model",[225770],{"type":23,"value":225760},{"type":17,"tag":25,"props":225772,"children":225773},{},[],{"type":17,"tag":29,"props":225775,"children":225776},{},[225777],{"type":17,"tag":33,"props":225778,"children":225779},{},[225780],{"type":23,"value":225781},"January 16, 2026",{"type":17,"tag":29,"props":225783,"children":225784},{},[225785,225787,225792],{"type":23,"value":225786},"Unified APIs make it possible to ship dozens of integrations through a single interface. But how those platforms ",{"type":17,"tag":48,"props":225788,"children":225789},{},[225790],{"type":23,"value":225791},"price usage",{"type":23,"value":225793}," has a major impact on whether your product can scale predictably—especially for SaaS products with freemium plans or AI-native workloads.",{"type":17,"tag":29,"props":225795,"children":225796},{},[225797],{"type":23,"value":225798},"This article answers a specific question:",{"type":17,"tag":3414,"props":225800,"children":225801},{},[225802],{"type":17,"tag":29,"props":225803,"children":225804},{},[225805,225807,225811],{"type":23,"value":225806},"Which ",{"type":17,"tag":133,"props":225808,"children":225809},{"href":7691},[225810],{"type":23,"value":7459},{"type":23,"value":225812}," solutions actually use usage-based pricing—and what does that mean in practice?",{"type":17,"tag":29,"props":225814,"children":225815},{},[225816],{"type":23,"value":225817},"To do that accurately, we first need to define what 'usage-based pricing' means in this context.",{"type":17,"tag":68,"props":225819,"children":225821},{"id":225820},"how-we-define-usage-based-pricing",[225822],{"type":23,"value":225823},"How we define 'usage-based pricing'",{"type":17,"tag":29,"props":225825,"children":225826},{},[225827,225829,225834,225836,225841],{"type":23,"value":225828},"In this article, ",{"type":17,"tag":48,"props":225830,"children":225831},{},[225832],{"type":23,"value":225833},"usage-based pricing",{"type":23,"value":225835}," means pricing that is calculated directly from the ",{"type":17,"tag":48,"props":225837,"children":225838},{},[225839],{"type":23,"value":225840},"number of API requests executed across all integrations",{"type":23,"value":225842},", independent of:",{"type":17,"tag":80,"props":225844,"children":225845},{},[225846,225851,225856],{"type":17,"tag":84,"props":225847,"children":225848},{},[225849],{"type":23,"value":225850},"the number of customers,",{"type":17,"tag":84,"props":225852,"children":225853},{},[225854],{"type":23,"value":225855},"the number of connected third-party accounts,",{"type":17,"tag":84,"props":225857,"children":225858},{},[225859],{"type":23,"value":225860},"or the number of integrations enabled.",{"type":17,"tag":29,"props":225862,"children":225863},{},[225864],{"type":23,"value":225865},"Under a true usage-based model:",{"type":17,"tag":80,"props":225867,"children":225868},{},[225869,225879,225889,225894],{"type":17,"tag":84,"props":225870,"children":225871},{},[225872,225874],{"type":23,"value":225873},"You can support ",{"type":17,"tag":48,"props":225875,"children":225876},{},[225877],{"type":23,"value":225878},"unlimited customers and connections",{"type":17,"tag":84,"props":225880,"children":225881},{},[225882,225884],{"type":23,"value":225883},"Costs scale with ",{"type":17,"tag":48,"props":225885,"children":225886},{},[225887],{"type":23,"value":225888},"actual API activity",{"type":17,"tag":84,"props":225890,"children":225891},{},[225892],{"type":23,"value":225893},"Unit economics are predictable and modelable in advance",{"type":17,"tag":84,"props":225895,"children":225896},{},[225897],{"type":23,"value":225898},"Idle customers do not create incremental cost",{"type":17,"tag":29,"props":225900,"children":225901},{},[225902,225904,225908],{"type":23,"value":225903},"This definition mirrors how ",{"type":17,"tag":48,"props":225905,"children":225906},{},[225907],{"type":23,"value":217},{"type":23,"value":225909}," defines usage-based pricing: pricing is driven by monthly API requests, with published allowances, transparent overage rates, and volume discounts as usage grows.",{"type":17,"tag":68,"props":225911,"children":225913},{"id":225912},"what-usage-based-pricing-looks-like-in-practice",[225914],{"type":23,"value":225915},"What usage-based pricing looks like in practice",{"type":17,"tag":29,"props":225917,"children":225918},{},[225919],{"type":23,"value":225920},"Consider a simple example:",{"type":17,"tag":80,"props":225922,"children":225923},{},[225924,225928,225933],{"type":17,"tag":84,"props":225925,"children":225926},{},[225927],{"type":23,"value":8146},{"type":17,"tag":84,"props":225929,"children":225930},{},[225931],{"type":23,"value":225932},"1 connected account per customer",{"type":17,"tag":84,"props":225934,"children":225935},{},[225936],{"type":23,"value":225937},"~11 API requests per day per connection",{"type":17,"tag":29,"props":225939,"children":225940},{},[225941,225943,225948],{"type":23,"value":225942},"That results in approximately ",{"type":17,"tag":48,"props":225944,"children":225945},{},[225946],{"type":23,"value":225947},"34,100 API requests per month",{"type":23,"value":54},{"type":17,"tag":29,"props":225950,"children":225951},{},[225952,225954,225959],{"type":23,"value":225953},"Under a usage-based pricing model like Unified's, that workload fits comfortably within an entry-level production plan. The effective cost works out to roughly ",{"type":17,"tag":48,"props":225955,"children":225956},{},[225957],{"type":23,"value":225958},"$7.50 per customer per month",{"type":23,"value":225960},", with:",{"type":17,"tag":80,"props":225962,"children":225963},{},[225964,225969,225974],{"type":17,"tag":84,"props":225965,"children":225966},{},[225967],{"type":23,"value":225968},"No per-customer fees",{"type":17,"tag":84,"props":225970,"children":225971},{},[225972],{"type":23,"value":225973},"No per-connection fees",{"type":17,"tag":84,"props":225975,"children":225976},{},[225977],{"type":23,"value":225978},"No limits on the number of integrations enabled",{"type":17,"tag":29,"props":225980,"children":225981},{},[225982],{"type":23,"value":225983},"As usage increases, costs increase proportionally—using clearly defined overage rates and volume discounts.",{"type":17,"tag":68,"props":225985,"children":225987},{"id":225986},"what-does-not-count-as-usage-based-pricing",[225988,225990,225994],{"type":23,"value":225989},"What does ",{"type":17,"tag":33,"props":225991,"children":225992},{},[225993],{"type":23,"value":159475},{"type":23,"value":225995}," count as usage-based pricing",{"type":17,"tag":29,"props":225997,"children":225998},{},[225999,226001,226005],{"type":23,"value":226000},"For clarity, this article does ",{"type":17,"tag":48,"props":226002,"children":226003},{},[226004],{"type":23,"value":159475},{"type":23,"value":226006}," classify the following models as usage-based pricing:",{"type":17,"tag":80,"props":226008,"children":226009},{},[226010,226020,226028,226038],{"type":17,"tag":84,"props":226011,"children":226012},{},[226013,226018],{"type":17,"tag":48,"props":226014,"children":226015},{},[226016],{"type":23,"value":226017},"Per-connection pricing",{"type":23,"value":226019}," (billing per linked account, regardless of usage)",{"type":17,"tag":84,"props":226021,"children":226022},{},[226023],{"type":17,"tag":48,"props":226024,"children":226025},{},[226026],{"type":23,"value":226027},"Per-customer or per-seat pricing",{"type":17,"tag":84,"props":226029,"children":226030},{},[226031,226036],{"type":17,"tag":48,"props":226032,"children":226033},{},[226034],{"type":23,"value":226035},"Tiered plans with hard API call caps",{"type":23,"value":226037}," that force step-function jumps",{"type":17,"tag":84,"props":226039,"children":226040},{},[226041,226046],{"type":17,"tag":48,"props":226042,"children":226043},{},[226044],{"type":23,"value":226045},"Contract pricing",{"type":23,"value":226047}," where usage is not the primary billing unit",{"type":17,"tag":29,"props":226049,"children":226050},{},[226051],{"type":23,"value":226052},"Some platforms include API limits inside plans, but if pricing is ultimately anchored to customers, connections, or contracts, it is not usage-based under this definition.",{"type":17,"tag":68,"props":226054,"children":226056},{"id":226055},"pricing-models-across-unified-api-platforms",[226057],{"type":23,"value":226058},"Pricing models across unified API platforms",{"type":17,"tag":29,"props":226060,"children":226061},{},[226062],{"type":23,"value":226063},"Using publicly available pricing pages and third-party listings, unified API platforms generally fall into the following categories:",{"type":17,"tag":239,"props":226065,"children":226067},{"id":226066},"_1-usage-based-api-request-metered",[226068],{"type":23,"value":226069},"1. Usage-based (API-request-metered)",{"type":17,"tag":80,"props":226071,"children":226072},{},[226073],{"type":17,"tag":84,"props":226074,"children":226075},{},[226076,226080,226083],{"type":17,"tag":48,"props":226077,"children":226078},{},[226079],{"type":23,"value":217},{"type":17,"tag":3891,"props":226081,"children":226082},{},[],{"type":23,"value":226084},"Pricing is based on monthly API requests across all integrations. Plans include large call allowances, published overage rates, unlimited customers, and unlimited connections. Costs scale linearly with usage.",{"type":17,"tag":29,"props":226086,"children":226087},{},[226088,226090,226095],{"type":23,"value":226089},"This is currently the clearest example of a unified API platform where ",{"type":17,"tag":48,"props":226091,"children":226092},{},[226093],{"type":23,"value":226094},"usage—not customers or connections—is the primary pricing anchor",{"type":23,"value":54},{"type":17,"tag":239,"props":226097,"children":226099},{"id":226098},"_2-per-connection-pricing",[226100],{"type":23,"value":226101},"2. Per-connection pricing",{"type":17,"tag":80,"props":226103,"children":226104},{},[226105,226112,226119],{"type":17,"tag":84,"props":226106,"children":226107},{},[226108],{"type":17,"tag":48,"props":226109,"children":226110},{},[226111],{"type":23,"value":7968},{"type":17,"tag":84,"props":226113,"children":226114},{},[226115],{"type":17,"tag":48,"props":226116,"children":226117},{},[226118],{"type":23,"value":7973},{"type":17,"tag":84,"props":226120,"children":226121},{},[226122],{"type":17,"tag":48,"props":226123,"children":226124},{},[226125],{"type":23,"value":7978},{"type":17,"tag":29,"props":226127,"children":226128},{},[226129],{"type":23,"value":226130},"These platforms charge based on the number of connected third-party accounts (often called 'linked accounts' or 'connections'). API usage volume does not materially affect pricing.",{"type":17,"tag":29,"props":226132,"children":226133},{},[226134],{"type":17,"tag":48,"props":226135,"children":226136},{},[226137],{"type":23,"value":226138},"Implications:",{"type":17,"tag":80,"props":226140,"children":226141},{},[226142,226147,226152],{"type":17,"tag":84,"props":226143,"children":226144},{},[226145],{"type":23,"value":226146},"Every new customer connection adds fixed cost",{"type":17,"tag":84,"props":226148,"children":226149},{},[226150],{"type":23,"value":226151},"Idle or low-usage customers still incur fees",{"type":17,"tag":84,"props":226153,"children":226154},{},[226155],{"type":23,"value":226156},"Freemium or self-serve models become expensive quickly",{"type":17,"tag":239,"props":226158,"children":226160},{"id":226159},"_3-per-customer-per-seat-pricing",[226161],{"type":23,"value":226162},"3. Per-customer / per-seat pricing",{"type":17,"tag":80,"props":226164,"children":226165},{},[226166],{"type":17,"tag":84,"props":226167,"children":226168},{},[226169],{"type":17,"tag":48,"props":226170,"children":226171},{},[226172],{"type":23,"value":237},{"type":17,"tag":29,"props":226174,"children":226175},{},[226176],{"type":23,"value":226177},"Pricing is tied to the number of active end customers using integrations, with tiered plans covering ranges of consumers.",{"type":17,"tag":29,"props":226179,"children":226180},{},[226181],{"type":17,"tag":48,"props":226182,"children":226183},{},[226184],{"type":23,"value":226138},{"type":17,"tag":80,"props":226186,"children":226187},{},[226188,226193,226198],{"type":17,"tag":84,"props":226189,"children":226190},{},[226191],{"type":23,"value":226192},"Costs jump when customer counts cross plan thresholds",{"type":17,"tag":84,"props":226194,"children":226195},{},[226196],{"type":23,"value":226197},"API volume per customer does not affect pricing",{"type":17,"tag":84,"props":226199,"children":226200},{},[226201],{"type":23,"value":226202},"Heavy usage by a single customer is not reflected in cost",{"type":17,"tag":239,"props":226204,"children":226206},{"id":226205},"_4-contract-or-custom-pricing",[226207],{"type":23,"value":226208},"4. Contract or custom pricing",{"type":17,"tag":80,"props":226210,"children":226211},{},[226212,226219],{"type":17,"tag":84,"props":226213,"children":226214},{},[226215],{"type":17,"tag":48,"props":226216,"children":226217},{},[226218],{"type":23,"value":581},{"type":17,"tag":84,"props":226220,"children":226221},{},[226222],{"type":17,"tag":48,"props":226223,"children":226224},{},[226225],{"type":23,"value":8037},{"type":17,"tag":29,"props":226227,"children":226228},{},[226229],{"type":23,"value":226230},"These platforms do not publish pricing publicly. Pricing is negotiated through sales and may incorporate platform fees, connection counts, or usage assumptions.",{"type":17,"tag":29,"props":226232,"children":226233},{},[226234],{"type":17,"tag":48,"props":226235,"children":226236},{},[226237],{"type":23,"value":226138},{"type":17,"tag":80,"props":226239,"children":226240},{},[226241,226246,226251],{"type":17,"tag":84,"props":226242,"children":226243},{},[226244],{"type":23,"value":226245},"Limited transparency",{"type":17,"tag":84,"props":226247,"children":226248},{},[226249],{"type":23,"value":226250},"Harder to model unit economics",{"type":17,"tag":84,"props":226252,"children":226253},{},[226254],{"type":23,"value":226255},"Less compatible with self-serve or rapid experimentation",{"type":17,"tag":68,"props":226257,"children":226259},{"id":226258},"why-pricing-model-choice-matters-at-scale",[226260],{"type":23,"value":226261},"Why pricing model choice matters at scale",{"type":17,"tag":29,"props":226263,"children":226264},{},[226265],{"type":23,"value":226266},"Pricing is not just a commercial decision—it shapes how your product can grow.",{"type":17,"tag":239,"props":226268,"children":226270},{"id":226269},"for-b2b-saas-with-freemium-or-self-serve-onboarding",[226271],{"type":23,"value":226272},"For B2B SaaS with freemium or self-serve onboarding",{"type":17,"tag":80,"props":226274,"children":226275},{},[226276,226286],{"type":17,"tag":84,"props":226277,"children":226278},{},[226279,226284],{"type":17,"tag":48,"props":226280,"children":226281},{},[226282],{"type":23,"value":226283},"Usage-based pricing",{"type":23,"value":226285}," allows you to onboard many customers at low cost and pay only as they become active.",{"type":17,"tag":84,"props":226287,"children":226288},{},[226289,226294],{"type":17,"tag":48,"props":226290,"children":226291},{},[226292],{"type":23,"value":226293},"Per-connection or per-customer pricing",{"type":23,"value":226295}," introduces fixed costs that make free tiers risky.",{"type":17,"tag":239,"props":226297,"children":226299},{"id":226298},"for-ai-native-products-and-agents",[226300],{"type":23,"value":226301},"For AI-native products and agents",{"type":17,"tag":29,"props":226303,"children":226304},{},[226305],{"type":23,"value":226306},"AI workloads are inherently variable:",{"type":17,"tag":80,"props":226308,"children":226309},{},[226310,226315,226320],{"type":17,"tag":84,"props":226311,"children":226312},{},[226313],{"type":23,"value":226314},"Agents make many small, real-time calls",{"type":17,"tag":84,"props":226316,"children":226317},{},[226318],{"type":23,"value":226319},"Usage spikes are common",{"type":17,"tag":84,"props":226321,"children":226322},{},[226323],{"type":23,"value":226324},"The number of 'connections' is often irrelevant",{"type":17,"tag":29,"props":226326,"children":226327},{},[226328],{"type":23,"value":226329},"Usage-based pricing aligns naturally with this pattern. Per-connection or per-seat pricing does not.",{"type":17,"tag":239,"props":226331,"children":226333},{"id":226332},"for-finance-and-planning",[226334],{"type":23,"value":226335},"For finance and planning",{"type":17,"tag":29,"props":226337,"children":226338},{},[226339],{"type":23,"value":226340},"Usage-based pricing enables:",{"type":17,"tag":80,"props":226342,"children":226343},{},[226344,226349,226354],{"type":17,"tag":84,"props":226345,"children":226346},{},[226347],{"type":23,"value":226348},"Clear marginal cost per API request",{"type":17,"tag":84,"props":226350,"children":226351},{},[226352],{"type":23,"value":226353},"Predictable gross margin modeling",{"type":17,"tag":84,"props":226355,"children":226356},{},[226357],{"type":23,"value":226358},"Easier forecasting as usage grows",{"type":17,"tag":29,"props":226360,"children":226361},{},[226362],{"type":23,"value":226363},"Connection- or contract-based pricing often obscures these relationships.",{"type":17,"tag":68,"props":226365,"children":226367},{"id":226366},"a-note-on-enterprise-and-custom-pricing",[226368],{"type":23,"value":226369},"A note on enterprise and custom pricing",{"type":17,"tag":29,"props":226371,"children":226372},{},[226373],{"type":23,"value":226374},"Most infrastructure vendors—including unified API platforms—offer custom enterprise contracts at scale.",{"type":17,"tag":29,"props":226376,"children":226377},{},[226378,226380,226384],{"type":23,"value":226379},"The distinction is ",{"type":17,"tag":48,"props":226381,"children":226382},{},[226383],{"type":23,"value":159475},{"type":23,"value":226385}," whether custom pricing exists.",{"type":17,"tag":29,"props":226387,"children":226388},{},[226389,226390,226395],{"type":23,"value":226379},{"type":17,"tag":48,"props":226391,"children":226392},{},[226393],{"type":23,"value":226394},"what pricing anchors to by default",{"type":23,"value":20456},{"type":17,"tag":80,"props":226397,"children":226398},{},[226399,226404],{"type":17,"tag":84,"props":226400,"children":226401},{},[226402],{"type":23,"value":226403},"Usage-based models anchor to API requests",{"type":17,"tag":84,"props":226405,"children":226406},{},[226407],{"type":23,"value":226408},"Other models anchor to connections, customers, or negotiated commitments",{"type":17,"tag":29,"props":226410,"children":226411},{},[226412],{"type":23,"value":226413},"That anchor determines whether costs scale predictably as your product grows.",{"type":17,"tag":68,"props":226415,"children":226416},{"id":44585},[226417],{"type":23,"value":44588},{"type":17,"tag":29,"props":226419,"children":226420},{},[226421],{"type":17,"tag":48,"props":226422,"children":226423},{},[226424],{"type":23,"value":226425},"Under a strict, usage-based definition:",{"type":17,"tag":80,"props":226427,"children":226428},{},[226429,226438,226443],{"type":17,"tag":84,"props":226430,"children":226431},{},[226432,226436],{"type":17,"tag":48,"props":226433,"children":226434},{},[226435],{"type":23,"value":217},{"type":23,"value":226437}," is the clearest example of a unified API platform whose pricing is directly tied to API usage.",{"type":17,"tag":84,"props":226439,"children":226440},{},[226441],{"type":23,"value":226442},"Most other unified API platforms rely on per-connection, per-customer, tiered, or contract-based pricing models.",{"type":17,"tag":84,"props":226444,"children":226445},{},[226446],{"type":23,"value":226447},"Those models can work for certain enterprise use cases, but they introduce fixed costs and scaling constraints that usage-based pricing avoids.",{"type":17,"tag":29,"props":226449,"children":226450},{},[226451,226453,226458],{"type":23,"value":226452},"If your product roadmap includes freemium onboarding, AI agents, or unpredictable integration usage, ",{"type":17,"tag":48,"props":226454,"children":226455},{},[226456],{"type":23,"value":226457},"how your unified API is priced may matter as much as what it integrates with",{"type":23,"value":54},{"type":17,"tag":29,"props":226460,"children":226461},{},[226462,226471,226473,226482],{"type":17,"tag":133,"props":226463,"children":226465},{"href":158861,"rel":226464},[214],[226466],{"type":17,"tag":48,"props":226467,"children":226468},{},[226469],{"type":23,"value":226470},"Start your free 30-day trial",{"type":23,"value":226472}," or ",{"type":17,"tag":133,"props":226474,"children":226476},{"href":1623,"rel":226475},[214],[226477],{"type":17,"tag":48,"props":226478,"children":226479},{},[226480],{"type":23,"value":226481},"book a demo",{"type":23,"value":226483}," to see how Unified can help your team launch integrations faster and scale with real-time data.",{"title":7,"searchDepth":1629,"depth":1629,"links":226485},[226486,226487,226488,226490,226496,226501,226502],{"id":225820,"depth":1629,"text":225823},{"id":225912,"depth":1629,"text":225915},{"id":225986,"depth":1629,"text":226489},"What does not count as usage-based pricing",{"id":226055,"depth":1629,"text":226058,"children":226491},[226492,226493,226494,226495],{"id":226066,"depth":1635,"text":226069},{"id":226098,"depth":1635,"text":226101},{"id":226159,"depth":1635,"text":226162},{"id":226205,"depth":1635,"text":226208},{"id":226258,"depth":1629,"text":226261,"children":226497},[226498,226499,226500],{"id":226269,"depth":1635,"text":226272},{"id":226298,"depth":1635,"text":226301},{"id":226332,"depth":1635,"text":226335},{"id":226366,"depth":1629,"text":226369},{"id":44585,"depth":1629,"text":44588},"content:blog:which_unified_api_solutions_have_a_usage_based_pricing_model.md","blog/which_unified_api_solutions_have_a_usage_based_pricing_model.md","blog/which_unified_api_solutions_have_a_usage_based_pricing_model",{"_path":226507,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":226508,"description":226509,"img":226510,"date":226511,"tag":12,"body":226512,"_type":1677,"_id":227669,"_source":1679,"_file":227670,"_stem":227671,"_extension":1682},"/blog/what_unified_api_solutions_support_a_large_number_of_integrations","What Unified API Solutions Support a Large Number of Integrations?","For developers building SaaS platforms, integrations are no longer a differentiator—they're a requirement. Whether you're syncing HR data, embedding CRMs, or...","https://s3.us-east-2.amazonaws.com/unified-article-images/what_unified_api_solutions_support_a_large_number_of_integrations-icon.png","2026-01-16T16:18:00.000Z",{"type":14,"children":226513,"toc":227654},[226514,226519,226522,226529,226540,226545,226550,226569,226575,226659,226665,226851,226862,226868,226873,226953,226957,227007,227012,227060,227064,227112,227117,227165,227170,227218,227223,227271,227277,227308,227314,227319,227324,227552,227556,227567,227636,227645],{"type":17,"tag":18,"props":226515,"children":226517},{"id":226516},"what-unified-api-solutions-support-a-large-number-of-integrations",[226518],{"type":23,"value":226508},{"type":17,"tag":25,"props":226520,"children":226521},{},[],{"type":17,"tag":29,"props":226523,"children":226524},{},[226525],{"type":17,"tag":33,"props":226526,"children":226527},{},[226528],{"type":23,"value":225781},{"type":17,"tag":29,"props":226530,"children":226531},{},[226532,226534,226538],{"type":23,"value":226533},"For developers building SaaS platforms, integrations are no longer a differentiator—they're a requirement. Whether you're syncing HR data, embedding CRMs, or enabling real-time file access, the backbone of that work is a ",{"type":17,"tag":133,"props":226535,"children":226536},{"href":7691},[226537],{"type":23,"value":7459},{"type":23,"value":226539}," platform that can handle it all.",{"type":17,"tag":29,"props":226541,"children":226542},{},[226543],{"type":23,"value":226544},"But not all unified APIs are built equally. Some offer breadth but little depth. Others specialize in just one category. And only a few offer both scale and reliability across real-time workflows.",{"type":17,"tag":29,"props":226546,"children":226547},{},[226548],{"type":23,"value":226549},"So which unified API solutions support the most integrations in 2026?",{"type":17,"tag":29,"props":226551,"children":226552},{},[226553,226555,226560,226562,226567],{"type":23,"value":226554},"This breakdown compares top providers on both ",{"type":17,"tag":33,"props":226556,"children":226557},{},[226558],{"type":23,"value":226559},"breadth",{"type":23,"value":226561}," (how many integrations they support) and ",{"type":17,"tag":33,"props":226563,"children":226564},{},[226565],{"type":23,"value":226566},"depth",{"type":23,"value":226568}," (what capabilities they provide). We've analyzed public docs, integration directories, and real-time sync infrastructure across 8 leading platforms.",{"type":17,"tag":68,"props":226570,"children":226572},{"id":226571},"the-short-answer",[226573],{"type":23,"value":226574},"The Short Answer",{"type":17,"tag":80,"props":226576,"children":226577},{},[226578,226601,226610,226619,226628],{"type":17,"tag":84,"props":226579,"children":226580},{},[226581,226585,226587,226592,226594,226599],{"type":17,"tag":48,"props":226582,"children":226583},{},[226584],{"type":23,"value":217},{"type":23,"value":226586}," supports the largest number: ",{"type":17,"tag":48,"props":226588,"children":226589},{},[226590],{"type":23,"value":226591},"370+ integrations",{"type":23,"value":226593}," across ",{"type":17,"tag":48,"props":226595,"children":226596},{},[226597],{"type":23,"value":226598},"24 categories",{"type":23,"value":226600},", with real-time sync, full CRUD, and deep object support.",{"type":17,"tag":84,"props":226602,"children":226603},{},[226604,226608],{"type":17,"tag":48,"props":226605,"children":226606},{},[226607],{"type":23,"value":7968},{"type":23,"value":226609}," follows with ~220 integrations, mostly focused on HR, ATS, and CRM.",{"type":17,"tag":84,"props":226611,"children":226612},{},[226613,226617],{"type":17,"tag":48,"props":226614,"children":226615},{},[226616],{"type":23,"value":237},{"type":23,"value":226618}," offers ~200 integrations across core SaaS verticals.",{"type":17,"tag":84,"props":226620,"children":226621},{},[226622,226626],{"type":17,"tag":48,"props":226623,"children":226624},{},[226625],{"type":23,"value":8037},{"type":23,"value":226627}," covers 250+ integrations with strong real-time passthrough.",{"type":17,"tag":84,"props":226629,"children":226630},{},[226631,226635,226636,226641,226642,226646,226647,226651,226652,226657],{"type":17,"tag":48,"props":226632,"children":226633},{},[226634],{"type":23,"value":581},{"type":23,"value":11826},{"type":17,"tag":48,"props":226637,"children":226638},{},[226639],{"type":23,"value":226640},"StackOne",{"type":23,"value":11826},{"type":17,"tag":48,"props":226643,"children":226644},{},[226645],{"type":23,"value":7973},{"type":23,"value":11826},{"type":17,"tag":48,"props":226648,"children":226649},{},[226650],{"type":23,"value":7978},{"type":23,"value":12561},{"type":17,"tag":48,"props":226653,"children":226654},{},[226655],{"type":23,"value":226656},"Nylas",{"type":23,"value":226658}," round out the list, with more specialized or category-focused offerings.",{"type":17,"tag":68,"props":226660,"children":226662},{"id":226661},"breadth-who-has-the-most-integrations",[226663],{"type":23,"value":226664},"Breadth: Who Has the Most Integrations?",{"type":17,"tag":7231,"props":226666,"children":226667},{},[226668,226688],{"type":17,"tag":7235,"props":226669,"children":226670},{},[226671],{"type":17,"tag":7239,"props":226672,"children":226673},{},[226674,226678,226683],{"type":17,"tag":7243,"props":226675,"children":226676},{},[226677],{"type":23,"value":43242},{"type":17,"tag":7243,"props":226679,"children":226680},{},[226681],{"type":23,"value":226682},"Approx. # Integrations",{"type":17,"tag":7243,"props":226684,"children":226685},{},[226686],{"type":23,"value":226687},"Primary Categories",{"type":17,"tag":7259,"props":226689,"children":226690},{},[226691,226716,226733,226750,226767,226784,226800,226817,226834],{"type":17,"tag":7239,"props":226692,"children":226693},{},[226694,226701,226706],{"type":17,"tag":7266,"props":226695,"children":226696},{},[226697],{"type":17,"tag":48,"props":226698,"children":226699},{},[226700],{"type":23,"value":217},{"type":17,"tag":7266,"props":226702,"children":226703},{},[226704],{"type":23,"value":226705},"370+",{"type":17,"tag":7266,"props":226707,"children":226708},{},[226709,226711],{"type":23,"value":226710},"HR & Directory, ATS, Accounting, E-Commerce, Knowledge Management, CRM, Advertising, Call Center, Calendar & Meetings, ",{"type":17,"tag":33,"props":226712,"children":226713},{},[226714],{"type":23,"value":226715},"+ 14 more",{"type":17,"tag":7239,"props":226717,"children":226718},{},[226719,226723,226728],{"type":17,"tag":7266,"props":226720,"children":226721},{},[226722],{"type":23,"value":7968},{"type":17,"tag":7266,"props":226724,"children":226725},{},[226726],{"type":23,"value":226727},"220+",{"type":17,"tag":7266,"props":226729,"children":226730},{},[226731],{"type":23,"value":226732},"HRIS, ATS, CRM, Accounting, Ticketing",{"type":17,"tag":7239,"props":226734,"children":226735},{},[226736,226740,226745],{"type":17,"tag":7266,"props":226737,"children":226738},{},[226739],{"type":23,"value":8037},{"type":17,"tag":7266,"props":226741,"children":226742},{},[226743],{"type":23,"value":226744},"250+",{"type":17,"tag":7266,"props":226746,"children":226747},{},[226748],{"type":23,"value":226749},"CRM, Messaging, HR, Storage, Security",{"type":17,"tag":7239,"props":226751,"children":226752},{},[226753,226757,226762],{"type":17,"tag":7266,"props":226754,"children":226755},{},[226756],{"type":23,"value":237},{"type":17,"tag":7266,"props":226758,"children":226759},{},[226760],{"type":23,"value":226761},"200+",{"type":17,"tag":7266,"props":226763,"children":226764},{},[226765],{"type":23,"value":226766},"CRM, HRIS, ATS, Accounting, File, Support",{"type":17,"tag":7239,"props":226768,"children":226769},{},[226770,226774,226779],{"type":17,"tag":7266,"props":226771,"children":226772},{},[226773],{"type":23,"value":581},{"type":17,"tag":7266,"props":226775,"children":226776},{},[226777],{"type":23,"value":226778},"150+",{"type":17,"tag":7266,"props":226780,"children":226781},{},[226782],{"type":23,"value":226783},"CRM, Email, Marketing, Calendar",{"type":17,"tag":7239,"props":226785,"children":226786},{},[226787,226791,226795],{"type":17,"tag":7266,"props":226788,"children":226789},{},[226790],{"type":23,"value":226640},{"type":17,"tag":7266,"props":226792,"children":226793},{},[226794],{"type":23,"value":226761},{"type":17,"tag":7266,"props":226796,"children":226797},{},[226798],{"type":23,"value":226799},"ATS, CRM, Messaging, HRIS, IAM",{"type":17,"tag":7239,"props":226801,"children":226802},{},[226803,226807,226812],{"type":17,"tag":7266,"props":226804,"children":226805},{},[226806],{"type":23,"value":7973},{"type":17,"tag":7266,"props":226808,"children":226809},{},[226810],{"type":23,"value":226811},"250+ (HR/payroll only)",{"type":17,"tag":7266,"props":226813,"children":226814},{},[226815],{"type":23,"value":226816},"HRIS, Payroll",{"type":17,"tag":7239,"props":226818,"children":226819},{},[226820,226824,226829],{"type":17,"tag":7266,"props":226821,"children":226822},{},[226823],{"type":23,"value":7978},{"type":17,"tag":7266,"props":226825,"children":226826},{},[226827],{"type":23,"value":226828},"100+ (HR only)",{"type":17,"tag":7266,"props":226830,"children":226831},{},[226832],{"type":23,"value":226833},"HRIS, ATS, LMS, Assessment",{"type":17,"tag":7239,"props":226835,"children":226836},{},[226837,226841,226846],{"type":17,"tag":7266,"props":226838,"children":226839},{},[226840],{"type":23,"value":226656},{"type":17,"tag":7266,"props":226842,"children":226843},{},[226844],{"type":23,"value":226845},"Email/calendar focused",{"type":17,"tag":7266,"props":226847,"children":226848},{},[226849],{"type":23,"value":226850},"Email, Calendar, Contacts",{"type":17,"tag":29,"props":226852,"children":226853},{},[226854,226856,226860],{"type":23,"value":226855},"Unified.to leads with the most integrations ",{"type":17,"tag":33,"props":226857,"children":226858},{},[226859],{"type":23,"value":48975},{"type":23,"value":226861}," the most categories.",{"type":17,"tag":68,"props":226863,"children":226865},{"id":226864},"depth-what-can-you-actually-do-with-these-integrations",[226866],{"type":23,"value":226867},"Depth: What Can You Actually Do With These Integrations?",{"type":17,"tag":29,"props":226869,"children":226870},{},[226871],{"type":23,"value":226872},"Breadth matters, but integration depth determines what kind of product experiences you can build. We looked at five dimensions:",{"type":17,"tag":80,"props":226874,"children":226875},{},[226876,226906,226916,226926,226938],{"type":17,"tag":84,"props":226877,"children":226878},{},[226879,226884,226886,226891,226892,226897,226898,226904],{"type":17,"tag":48,"props":226880,"children":226881},{},[226882],{"type":23,"value":226883},"Supported Objects",{"type":23,"value":226885},": How many objects (e.g. ",{"type":17,"tag":6121,"props":226887,"children":226889},{"className":226888},[],[226890],{"type":23,"value":137672},{"type":23,"value":11826},{"type":17,"tag":6121,"props":226893,"children":226895},{"className":226894},[],[226896],{"type":23,"value":79044},{"type":23,"value":11826},{"type":17,"tag":6121,"props":226899,"children":226901},{"className":226900},[],[226902],{"type":23,"value":226903},"files",{"type":23,"value":226905},") are unified per integration?",{"type":17,"tag":84,"props":226907,"children":226908},{},[226909,226914],{"type":17,"tag":48,"props":226910,"children":226911},{},[226912],{"type":23,"value":226913},"Field Coverage",{"type":23,"value":226915},": Do they support custom fields? Passthroughs? Raw access?",{"type":17,"tag":84,"props":226917,"children":226918},{},[226919,226924],{"type":17,"tag":48,"props":226920,"children":226921},{},[226922],{"type":23,"value":226923},"Read/Write",{"type":23,"value":226925},": Can you create and update records, or only fetch?",{"type":17,"tag":84,"props":226927,"children":226928},{},[226929,226936],{"type":17,"tag":48,"props":226930,"children":226931},{},[226932],{"type":17,"tag":133,"props":226933,"children":226934},{"href":4999},[226935],{"type":23,"value":43896},{"type":23,"value":226937},": Are events real-time? Simulated? Delayed by hours?",{"type":17,"tag":84,"props":226939,"children":226940},{},[226941,226945,226947,226951],{"type":17,"tag":48,"props":226942,"children":226943},{},[226944],{"type":23,"value":146708},{"type":23,"value":226946},": Do they manage ",{"type":17,"tag":133,"props":226948,"children":226949},{"href":779},[226950],{"type":23,"value":782},{"type":23,"value":226952},", API keys, and token refresh securely?",{"type":17,"tag":239,"props":226954,"children":226955},{"id":101855},[226956],{"type":23,"value":217},{"type":17,"tag":80,"props":226958,"children":226959},{},[226960,226970,226980,226989,226998],{"type":17,"tag":84,"props":226961,"children":226962},{},[226963,226968],{"type":17,"tag":48,"props":226964,"children":226965},{},[226966],{"type":23,"value":226967},"Objects",{"type":23,"value":226969},": 1,400+ unified objects across categories",{"type":17,"tag":84,"props":226971,"children":226972},{},[226973,226978],{"type":17,"tag":48,"props":226974,"children":226975},{},[226976],{"type":23,"value":226977},"Fields",{"type":23,"value":226979},": Full normalized schemas + passthrough fields",{"type":17,"tag":84,"props":226981,"children":226982},{},[226983,226987],{"type":17,"tag":48,"props":226984,"children":226985},{},[226986],{"type":23,"value":226923},{"type":23,"value":226988},": Full CRUD across most providers",{"type":17,"tag":84,"props":226990,"children":226991},{},[226992,226996],{"type":17,"tag":48,"props":226993,"children":226994},{},[226995],{"type":23,"value":43896},{"type":23,"value":226997},": Native or virtual, real-time across all connectors",{"type":17,"tag":84,"props":226999,"children":227000},{},[227001,227005],{"type":17,"tag":48,"props":227002,"children":227003},{},[227004],{"type":23,"value":146708},{"type":23,"value":227006},": Embedded UI, token management, permission scopes",{"type":17,"tag":239,"props":227008,"children":227010},{"id":227009},"mergedev",[227011],{"type":23,"value":7968},{"type":17,"tag":80,"props":227013,"children":227014},{},[227015,227024,227033,227042,227051],{"type":17,"tag":84,"props":227016,"children":227017},{},[227018,227022],{"type":17,"tag":48,"props":227019,"children":227020},{},[227021],{"type":23,"value":226967},{"type":23,"value":227023},": Core schemas only (Employees, Jobs, etc.)",{"type":17,"tag":84,"props":227025,"children":227026},{},[227027,227031],{"type":17,"tag":48,"props":227028,"children":227029},{},[227030],{"type":23,"value":226977},{"type":23,"value":227032},": Custom fields via passthrough",{"type":17,"tag":84,"props":227034,"children":227035},{},[227036,227040],{"type":17,"tag":48,"props":227037,"children":227038},{},[227039],{"type":23,"value":226923},{"type":23,"value":227041},": Partial write support; mostly read",{"type":17,"tag":84,"props":227043,"children":227044},{},[227045,227049],{"type":17,"tag":48,"props":227046,"children":227047},{},[227048],{"type":23,"value":43896},{"type":23,"value":227050},": 24h polling by default; webhook events limited",{"type":17,"tag":84,"props":227052,"children":227053},{},[227054,227058],{"type":17,"tag":48,"props":227055,"children":227056},{},[227057],{"type":23,"value":146708},{"type":23,"value":227059},": Managed OAuth, scopes, and refresh",{"type":17,"tag":239,"props":227061,"children":227062},{"id":102079},[227063],{"type":23,"value":237},{"type":17,"tag":80,"props":227065,"children":227066},{},[227067,227076,227085,227094,227103],{"type":17,"tag":84,"props":227068,"children":227069},{},[227070,227074],{"type":17,"tag":48,"props":227071,"children":227072},{},[227073],{"type":23,"value":226967},{"type":23,"value":227075},": Standardized per API category (CRM, HRIS, etc.)",{"type":17,"tag":84,"props":227077,"children":227078},{},[227079,227083],{"type":17,"tag":48,"props":227080,"children":227081},{},[227082],{"type":23,"value":226977},{"type":23,"value":227084},": Supports raw mode for custom fields",{"type":17,"tag":84,"props":227086,"children":227087},{},[227088,227092],{"type":17,"tag":48,"props":227089,"children":227090},{},[227091],{"type":23,"value":226923},{"type":23,"value":227093},": Full CRUD on supported providers",{"type":17,"tag":84,"props":227095,"children":227096},{},[227097,227101],{"type":17,"tag":48,"props":227098,"children":227099},{},[227100],{"type":23,"value":43896},{"type":23,"value":227102},": Virtual webhooks with 24h polling unless upgraded",{"type":17,"tag":84,"props":227104,"children":227105},{},[227106,227110],{"type":17,"tag":48,"props":227107,"children":227108},{},[227109],{"type":23,"value":146708},{"type":23,"value":227111},": OAuth & API key support; token storage required",{"type":17,"tag":239,"props":227113,"children":227115},{"id":227114},"truto",[227116],{"type":23,"value":8037},{"type":17,"tag":80,"props":227118,"children":227119},{},[227120,227129,227138,227147,227156],{"type":17,"tag":84,"props":227121,"children":227122},{},[227123,227127],{"type":17,"tag":48,"props":227124,"children":227125},{},[227126],{"type":23,"value":226967},{"type":23,"value":227128},": Fully configurable; supports custom schemas",{"type":17,"tag":84,"props":227130,"children":227131},{},[227132,227136],{"type":17,"tag":48,"props":227133,"children":227134},{},[227135],{"type":23,"value":226977},{"type":23,"value":227137},": All vendor fields available via real-time passthrough",{"type":17,"tag":84,"props":227139,"children":227140},{},[227141,227145],{"type":17,"tag":48,"props":227142,"children":227143},{},[227144],{"type":23,"value":226923},{"type":23,"value":227146},": Yes, on all supported platforms",{"type":17,"tag":84,"props":227148,"children":227149},{},[227150,227154],{"type":17,"tag":48,"props":227151,"children":227152},{},[227153],{"type":23,"value":43896},{"type":23,"value":227155},": Native + synthetic, sub-hour intervals via RapidBridge",{"type":17,"tag":84,"props":227157,"children":227158},{},[227159,227163],{"type":17,"tag":48,"props":227160,"children":227161},{},[227162],{"type":23,"value":146708},{"type":23,"value":227164},": SCIM, API key, OAuth 2.0",{"type":17,"tag":239,"props":227166,"children":227168},{"id":227167},"paragon",[227169],{"type":23,"value":581},{"type":17,"tag":80,"props":227171,"children":227172},{},[227173,227182,227191,227200,227209],{"type":17,"tag":84,"props":227174,"children":227175},{},[227176,227180],{"type":17,"tag":48,"props":227177,"children":227178},{},[227179],{"type":23,"value":226967},{"type":23,"value":227181},": Action-based, no unified schema",{"type":17,"tag":84,"props":227183,"children":227184},{},[227185,227189],{"type":17,"tag":48,"props":227186,"children":227187},{},[227188],{"type":23,"value":226977},{"type":23,"value":227190},": Mapped per provider action",{"type":17,"tag":84,"props":227192,"children":227193},{},[227194,227198],{"type":17,"tag":48,"props":227195,"children":227196},{},[227197],{"type":23,"value":226923},{"type":23,"value":227199},": Yes, through provider-specific actions",{"type":17,"tag":84,"props":227201,"children":227202},{},[227203,227207],{"type":17,"tag":48,"props":227204,"children":227205},{},[227206],{"type":23,"value":43896},{"type":23,"value":227208},": Native + polling (1min interval)",{"type":17,"tag":84,"props":227210,"children":227211},{},[227212,227216],{"type":17,"tag":48,"props":227213,"children":227214},{},[227215],{"type":23,"value":146708},{"type":23,"value":227217},": Drop-in OAuth components",{"type":17,"tag":239,"props":227219,"children":227221},{"id":227220},"stackone",[227222],{"type":23,"value":226640},{"type":17,"tag":80,"props":227224,"children":227225},{},[227226,227235,227244,227253,227262],{"type":17,"tag":84,"props":227227,"children":227228},{},[227229,227233],{"type":17,"tag":48,"props":227230,"children":227231},{},[227232],{"type":23,"value":226967},{"type":23,"value":227234},": Unified schemas for AI-native apps",{"type":17,"tag":84,"props":227236,"children":227237},{},[227238,227242],{"type":17,"tag":48,"props":227239,"children":227240},{},[227241],{"type":23,"value":226977},{"type":23,"value":227243},": Normalized + passthrough",{"type":17,"tag":84,"props":227245,"children":227246},{},[227247,227251],{"type":17,"tag":48,"props":227248,"children":227249},{},[227250],{"type":23,"value":226923},{"type":23,"value":227252},": Yes, full support",{"type":17,"tag":84,"props":227254,"children":227255},{},[227256,227260],{"type":17,"tag":48,"props":227257,"children":227258},{},[227259],{"type":23,"value":43896},{"type":23,"value":227261},": Native + synthetic (down to 5 min)",{"type":17,"tag":84,"props":227263,"children":227264},{},[227265,227269],{"type":17,"tag":48,"props":227266,"children":227267},{},[227268],{"type":23,"value":146708},{"type":23,"value":227270},": OAuth proxy + key rotation",{"type":17,"tag":239,"props":227272,"children":227274},{"id":227273},"finch-kombo-nylas",[227275],{"type":23,"value":227276},"Finch / Kombo / Nylas",{"type":17,"tag":80,"props":227278,"children":227279},{},[227280],{"type":17,"tag":84,"props":227281,"children":227282},{},[227283,227288,227290],{"type":17,"tag":48,"props":227284,"children":227285},{},[227286],{"type":23,"value":227287},"Category-specific",{"type":23,"value":227289}," depth:\n",{"type":17,"tag":80,"props":227291,"children":227292},{},[227293,227298,227303],{"type":17,"tag":84,"props":227294,"children":227295},{},[227296],{"type":23,"value":227297},"Finch: strong payroll/HR field model, mostly read-only",{"type":17,"tag":84,"props":227299,"children":227300},{},[227301],{"type":23,"value":227302},"Kombo: solid HRIS/ATS coverage, webhook delays (3h+)",{"type":17,"tag":84,"props":227304,"children":227305},{},[227306],{"type":23,"value":227307},"Nylas: full read/write for email/calendar, but limited object diversity",{"type":17,"tag":68,"props":227309,"children":227311},{"id":227310},"real-time-sync-whos-actually-fast",[227312],{"type":23,"value":227313},"Real-Time Sync: Who's Actually Fast?",{"type":17,"tag":29,"props":227315,"children":227316},{},[227317],{"type":23,"value":227318},"Real-time event delivery matters for AI agents, dashboards, and user-facing sync.",{"type":17,"tag":29,"props":227320,"children":227321},{},[227322],{"type":23,"value":227323},"Here's how sync speed compares:",{"type":17,"tag":7231,"props":227325,"children":227326},{},[227327,227351],{"type":17,"tag":7235,"props":227328,"children":227329},{},[227330],{"type":17,"tag":7239,"props":227331,"children":227332},{},[227333,227337,227342,227347],{"type":17,"tag":7243,"props":227334,"children":227335},{},[227336],{"type":23,"value":43242},{"type":17,"tag":7243,"props":227338,"children":227339},{},[227340],{"type":23,"value":227341},"Real-Time Events",{"type":17,"tag":7243,"props":227343,"children":227344},{},[227345],{"type":23,"value":227346},"Default Polling",{"type":17,"tag":7243,"props":227348,"children":227349},{},[227350],{"type":23,"value":6701},{"type":17,"tag":7259,"props":227352,"children":227353},{},[227354,227378,227400,227421,227443,227465,227486,227508,227530],{"type":17,"tag":7239,"props":227355,"children":227356},{},[227357,227364,227369,227373],{"type":17,"tag":7266,"props":227358,"children":227359},{},[227360],{"type":17,"tag":48,"props":227361,"children":227362},{},[227363],{"type":23,"value":217},{"type":17,"tag":7266,"props":227365,"children":227366},{},[227367],{"type":23,"value":227368},"✅ Native + Virtual",{"type":17,"tag":7266,"props":227370,"children":227371},{},[227372],{"type":23,"value":9965},{"type":17,"tag":7266,"props":227374,"children":227375},{},[227376],{"type":23,"value":227377},"Instant events across 100% of connectors",{"type":17,"tag":7239,"props":227379,"children":227380},{},[227381,227385,227390,227395],{"type":17,"tag":7266,"props":227382,"children":227383},{},[227384],{"type":23,"value":7968},{"type":17,"tag":7266,"props":227386,"children":227387},{},[227388],{"type":23,"value":227389},"⚠️ Some",{"type":17,"tag":7266,"props":227391,"children":227392},{},[227393],{"type":23,"value":227394},"24h",{"type":17,"tag":7266,"props":227396,"children":227397},{},[227398],{"type":23,"value":227399},"Limited webhook support",{"type":17,"tag":7239,"props":227401,"children":227402},{},[227403,227407,227412,227416],{"type":17,"tag":7266,"props":227404,"children":227405},{},[227406],{"type":23,"value":237},{"type":17,"tag":7266,"props":227408,"children":227409},{},[227410],{"type":23,"value":227411},"✅ + Virtual",{"type":17,"tag":7266,"props":227413,"children":227414},{},[227415],{"type":23,"value":227394},{"type":17,"tag":7266,"props":227417,"children":227418},{},[227419],{"type":23,"value":227420},"Upgrade for faster sync",{"type":17,"tag":7239,"props":227422,"children":227423},{},[227424,227428,227433,227438],{"type":17,"tag":7266,"props":227425,"children":227426},{},[227427],{"type":23,"value":8037},{"type":17,"tag":7266,"props":227429,"children":227430},{},[227431],{"type":23,"value":227432},"✅ Native + Synthetic",{"type":17,"tag":7266,"props":227434,"children":227435},{},[227436],{"type":23,"value":227437},"Sub-hour",{"type":17,"tag":7266,"props":227439,"children":227440},{},[227441],{"type":23,"value":227442},"RapidBridge triggers",{"type":17,"tag":7239,"props":227444,"children":227445},{},[227446,227450,227455,227460],{"type":17,"tag":7266,"props":227447,"children":227448},{},[227449],{"type":23,"value":581},{"type":17,"tag":7266,"props":227451,"children":227452},{},[227453],{"type":23,"value":227454},"✅ Native + Polling",{"type":17,"tag":7266,"props":227456,"children":227457},{},[227458],{"type":23,"value":227459},"1 min",{"type":17,"tag":7266,"props":227461,"children":227462},{},[227463],{"type":23,"value":227464},"Real-time for most providers",{"type":17,"tag":7239,"props":227466,"children":227467},{},[227468,227472,227476,227481],{"type":17,"tag":7266,"props":227469,"children":227470},{},[227471],{"type":23,"value":226640},{"type":17,"tag":7266,"props":227473,"children":227474},{},[227475],{"type":23,"value":227432},{"type":17,"tag":7266,"props":227477,"children":227478},{},[227479],{"type":23,"value":227480},"1h (5m upgrade)",{"type":17,"tag":7266,"props":227482,"children":227483},{},[227484],{"type":23,"value":227485},"Cryptographic polling engine",{"type":17,"tag":7239,"props":227487,"children":227488},{},[227489,227493,227498,227503],{"type":17,"tag":7266,"props":227490,"children":227491},{},[227492],{"type":23,"value":7978},{"type":17,"tag":7266,"props":227494,"children":227495},{},[227496],{"type":23,"value":227497},"⚠️ Partial",{"type":17,"tag":7266,"props":227499,"children":227500},{},[227501],{"type":23,"value":227502},"3h (10h full)",{"type":17,"tag":7266,"props":227504,"children":227505},{},[227506],{"type":23,"value":227507},"HR data sync, some webhook support",{"type":17,"tag":7239,"props":227509,"children":227510},{},[227511,227515,227520,227525],{"type":17,"tag":7266,"props":227512,"children":227513},{},[227514],{"type":23,"value":7973},{"type":17,"tag":7266,"props":227516,"children":227517},{},[227518],{"type":23,"value":227519},"❌ Read-only",{"type":17,"tag":7266,"props":227521,"children":227522},{},[227523],{"type":23,"value":227524},"24h–7d",{"type":17,"tag":7266,"props":227526,"children":227527},{},[227528],{"type":23,"value":227529},"No real-time sync for most",{"type":17,"tag":7239,"props":227531,"children":227532},{},[227533,227537,227542,227547],{"type":17,"tag":7266,"props":227534,"children":227535},{},[227536],{"type":23,"value":226656},{"type":17,"tag":7266,"props":227538,"children":227539},{},[227540],{"type":23,"value":227541},"✅ Push + Fallback",{"type":17,"tag":7266,"props":227543,"children":227544},{},[227545],{"type":23,"value":227546},"Real-time or IMAP",{"type":17,"tag":7266,"props":227548,"children":227549},{},[227550],{"type":23,"value":227551},"Email-native delivery + sync fallback",{"type":17,"tag":68,"props":227553,"children":227554},{"id":2316},[227555],{"type":23,"value":2319},{"type":17,"tag":29,"props":227557,"children":227558},{},[227559,227561,227566],{"type":23,"value":227560},"If you're building an integration layer into your product, ",{"type":17,"tag":48,"props":227562,"children":227563},{},[227564],{"type":23,"value":227565},"choose based on your required categories, object depth, and sync latency",{"type":23,"value":54},{"type":17,"tag":80,"props":227568,"children":227569},{},[227570,227603,227614,227625],{"type":17,"tag":84,"props":227571,"children":227572},{},[227573,227574,227578,227580],{"type":23,"value":44311},{"type":17,"tag":48,"props":227575,"children":227576},{},[227577],{"type":23,"value":217},{"type":23,"value":227579}," if you want:\n",{"type":17,"tag":80,"props":227581,"children":227582},{},[227583,227588,227593,227598],{"type":17,"tag":84,"props":227584,"children":227585},{},[227586],{"type":23,"value":227587},"Largest integration surface",{"type":17,"tag":84,"props":227589,"children":227590},{},[227591],{"type":23,"value":227592},"Full read/write and object support",{"type":17,"tag":84,"props":227594,"children":227595},{},[227596],{"type":23,"value":227597},"Real-time webhook coverage across the board",{"type":17,"tag":84,"props":227599,"children":227600},{},[227601],{"type":23,"value":227602},"Passthrough access and LLM-ready data for agents/copilots",{"type":17,"tag":84,"props":227604,"children":227605},{},[227606,227607,227612],{"type":23,"value":44311},{"type":17,"tag":48,"props":227608,"children":227609},{},[227610],{"type":23,"value":227611},"Merge or Apideck",{"type":23,"value":227613}," if you're focused on HR or CRM and only need nightly syncs.",{"type":17,"tag":84,"props":227615,"children":227616},{},[227617,227618,227623],{"type":23,"value":44311},{"type":17,"tag":48,"props":227619,"children":227620},{},[227621],{"type":23,"value":227622},"Truto or StackOne",{"type":23,"value":227624}," if you're prioritizing passthrough access or custom object support.",{"type":17,"tag":84,"props":227626,"children":227627},{},[227628,227629,227634],{"type":23,"value":33722},{"type":17,"tag":48,"props":227630,"children":227631},{},[227632],{"type":23,"value":227633},"Finch, Kombo, or Nylas",{"type":23,"value":227635}," only if you're building for a single category like payroll or email.",{"type":17,"tag":29,"props":227637,"children":227638},{},[227639,227640],{"type":23,"value":1609},{"type":17,"tag":133,"props":227641,"children":227643},{"href":1612,"rel":227642},[214],[227644],{"type":23,"value":1616},{"type":17,"tag":29,"props":227646,"children":227647},{},[227648,227649],{"type":23,"value":1609},{"type":17,"tag":133,"props":227650,"children":227652},{"href":1623,"rel":227651},[214],[227653],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":227655},[227656,227657,227658,227667,227668],{"id":226571,"depth":1629,"text":226574},{"id":226661,"depth":1629,"text":226664},{"id":226864,"depth":1629,"text":226867,"children":227659},[227660,227661,227662,227663,227664,227665,227666],{"id":101855,"depth":1635,"text":217},{"id":227009,"depth":1635,"text":7968},{"id":102079,"depth":1635,"text":237},{"id":227114,"depth":1635,"text":8037},{"id":227167,"depth":1635,"text":581},{"id":227220,"depth":1635,"text":226640},{"id":227273,"depth":1635,"text":227276},{"id":227310,"depth":1629,"text":227313},{"id":2316,"depth":1629,"text":2319},"content:blog:what_unified_api_solutions_support_a_large_number_of_integrations.md","blog/what_unified_api_solutions_support_a_large_number_of_integrations.md","blog/what_unified_api_solutions_support_a_large_number_of_integrations",{"_path":227673,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":121224,"description":227674,"img":227675,"date":227676,"tag":12,"body":227677,"_type":1677,"_id":228610,"_source":1679,"_file":228611,"_stem":228612,"_extension":1682},"/blog/how_to_pull_cross_platform_ad_performance_reports_using_unified_advertising_api","Most advertising analytics features fail before the first report is returned.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_pull_cross_platform_ad_performance_reports_using_unified_advertising_api-icon.png","2026-01-16T00:00:00.000Z",{"type":14,"children":227678,"toc":228594},[227679,227684,227687,227694,227698,227702,227707,227712,227717,227722,227750,227755,227765,227770,227774,227809,227813,227822,227832,227841,227845,227854,227859,227865,227876,227885,227890,227903,227948,227960,227965,227971,227983,227989,227994,228062,228067,228148,228153,228159,228164,228173,228185,228191,228203,228212,228231,228295,228307,228313,228325,228337,228355,228366,228384,228389,228413,228419,228429,228452,228464,228470,228525,228531,228576,228585],{"type":17,"tag":18,"props":227680,"children":227682},{"id":227681},"how-to-pull-cross-platform-ad-performance-reports-using-unifieds-advertising-api",[227683],{"type":23,"value":121224},{"type":17,"tag":25,"props":227685,"children":227686},{},[],{"type":17,"tag":29,"props":227688,"children":227689},{},[227690],{"type":17,"tag":33,"props":227691,"children":227692},{},[227693],{"type":23,"value":225781},{"type":17,"tag":11616,"props":227695,"children":227697},{"width":11618,"height":11619,"src":227696,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/VZn0TLDNBXc",[],{"type":17,"tag":29,"props":227699,"children":227700},{},[227701],{"type":23,"value":227674},{"type":17,"tag":29,"props":227703,"children":227704},{},[227705],{"type":23,"value":227706},"On paper, ad performance reporting looks straightforward. Pick a date range. Select a campaign. Pull metrics. In practice, those steps only work if every ad platform agrees on how reports are generated, which filters are supported, and what a 'metric' actually represents.",{"type":17,"tag":29,"props":227708,"children":227709},{},[227710],{"type":23,"value":227711},"That's where product complexity shows up.",{"type":17,"tag":29,"props":227713,"children":227714},{},[227715],{"type":23,"value":227716},"Advertising platforms don't expose reporting in the same way. Some require preconfigured reports. Others return metrics inline with entity objects. Filtering behavior, date semantics, and supported KPIs vary by provider. Even when platforms expose similar metrics, the structure and granularity aren't guaranteed to match.",{"type":17,"tag":29,"props":227718,"children":227719},{},[227720],{"type":23,"value":227721},"For product teams, this creates uncomfortable questions:",{"type":17,"tag":80,"props":227723,"children":227724},{},[227725,227730,227735,227740,227745],{"type":17,"tag":84,"props":227726,"children":227727},{},[227728],{"type":23,"value":227729},"Is reporting a query-driven operation or a static list?",{"type":17,"tag":84,"props":227731,"children":227732},{},[227733],{"type":23,"value":227734},"Can we use the same filters across Google, Meta, and TikTok?",{"type":17,"tag":84,"props":227736,"children":227737},{},[227738],{"type":23,"value":227739},"Which KPIs are selectable, and which are computed upstream?",{"type":17,"tag":84,"props":227741,"children":227742},{},[227743],{"type":23,"value":227744},"Are metrics returned per day, per entity, or as aggregates?",{"type":17,"tag":84,"props":227746,"children":227747},{},[227748],{"type":23,"value":227749},"Can this feature ship broadly, or only for one provider?",{"type":17,"tag":29,"props":227751,"children":227752},{},[227753],{"type":23,"value":227754},"Many products solve this by building provider-specific reporting pipelines or limiting analytics to a single ad platform. That works initially, but it doesn't scale.",{"type":17,"tag":29,"props":227756,"children":227757},{},[227758,227759,227763],{"type":23,"value":25244},{"type":17,"tag":133,"props":227760,"children":227761},{"href":11091},[227762],{"type":23,"value":11094},{"type":23,"value":227764}," is designed to remove that constraint. Instead of forcing you to integrate three different reporting systems, Unified exposes a single, normalized reporting surface where provider differences are handled upstream.",{"type":17,"tag":29,"props":227766,"children":227767},{},[227768],{"type":23,"value":227769},"This guide shows how to pull cross-platform ad performance reports using Unified's Advertising API—step by step—without building separate reporting logic for Google Ads, Meta Ads, and TikTok Ads, and without assuming more structure than the API guarantees.",{"type":17,"tag":68,"props":227771,"children":227772},{"id":141798},[227773],{"type":23,"value":141801},{"type":17,"tag":80,"props":227775,"children":227776},{},[227777,227781,227785,227790,227799],{"type":17,"tag":84,"props":227778,"children":227779},{},[227780],{"type":23,"value":199683},{"type":17,"tag":84,"props":227782,"children":227783},{},[227784],{"type":23,"value":199688},{"type":17,"tag":84,"props":227786,"children":227787},{},[227788],{"type":23,"value":227789},"At least one Advertising integration enabled (Google Ads, Meta Ads, or TikTok Ads)",{"type":17,"tag":84,"props":227791,"children":227792},{},[227793,227794,227798],{"type":23,"value":199693},{"type":17,"tag":133,"props":227795,"children":227796},{"href":7691},[227797],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":227800,"children":227801},{},[227802,227804],{"type":23,"value":227803},"A customer Advertising ",{"type":17,"tag":6121,"props":227805,"children":227807},{"className":227806},[],[227808],{"type":23,"value":19766},{"type":17,"tag":68,"props":227810,"children":227811},{"id":211198},[227812],{"type":23,"value":211201},{"type":17,"tag":6893,"props":227814,"children":227817},{"className":227815,"code":227816,"language":48432,"meta":7},[48430],"mkdir ads-reporting-demo\ncd ads-reporting-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[227818],{"type":17,"tag":6121,"props":227819,"children":227820},{"__ignoreMap":7},[227821],{"type":23,"value":227816},{"type":17,"tag":29,"props":227823,"children":227824},{},[227825,227826,227831],{"type":23,"value":211215},{"type":17,"tag":6121,"props":227827,"children":227829},{"className":227828},[],[227830],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":227833,"children":227836},{"className":227834,"code":227835,"language":20901,"meta":23},[20899],"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_ADS=your_customer_ads_connection_id\n",[227837],{"type":17,"tag":6121,"props":227838,"children":227839},{"__ignoreMap":7},[227840],{"type":23,"value":227835},{"type":17,"tag":68,"props":227842,"children":227843},{"id":211235},[227844],{"type":23,"value":211238},{"type":17,"tag":6893,"props":227846,"children":227849},{"className":227847,"code":227848,"language":18718,"meta":7},[18716],"import \"dotenv/config\";\nimport { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nconst { UNIFIED_API_KEY, CONNECTION_ADS } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[227850],{"type":17,"tag":6121,"props":227851,"children":227852},{"__ignoreMap":7},[227853],{"type":23,"value":227848},{"type":17,"tag":29,"props":227855,"children":227856},{},[227857],{"type":23,"value":227858},"At this point, you're authenticated and ready to interact with Advertising integrations through a single client.",{"type":17,"tag":68,"props":227860,"children":227862},{"id":227861},"step-3-understand-how-ads-reporting-works-critical",[227863],{"type":23,"value":227864},"Step 3: Understand how Ads reporting works (critical)",{"type":17,"tag":29,"props":227866,"children":227867},{},[227868,227870,227875],{"type":23,"value":227869},"Unified exposes advertising reports through a ",{"type":17,"tag":48,"props":227871,"children":227872},{},[227873],{"type":23,"value":227874},"single list endpoint",{"type":23,"value":20456},{"type":17,"tag":6893,"props":227877,"children":227880},{"className":227878,"code":227879,"language":20901,"meta":23},[20899],"GET /ads/{connection_id}/report\n",[227881],{"type":17,"tag":6121,"props":227882,"children":227883},{"__ignoreMap":7},[227884],{"type":23,"value":227879},{"type":17,"tag":29,"props":227886,"children":227887},{},[227888],{"type":23,"value":227889},"The reporting surface itself is read-only. Ads, campaigns, and groups may support write operations depending on provider support, but reporting does not.",{"type":17,"tag":29,"props":227891,"children":227892},{},[227893,227895,227901],{"type":23,"value":227894},"Each result returned is an ",{"type":17,"tag":6121,"props":227896,"children":227898},{"className":227897},[],[227899],{"type":23,"value":227900},"AdsReport",{"type":23,"value":227902}," object. At a high level, an AdsReport includes:",{"type":17,"tag":80,"props":227904,"children":227905},{},[227906,227914,227930,227938],{"type":17,"tag":84,"props":227907,"children":227908},{},[227909],{"type":17,"tag":6121,"props":227910,"children":227912},{"className":227911},[],[227913],{"type":23,"value":22399},{"type":17,"tag":84,"props":227915,"children":227916},{},[227917,227922,227923,227928],{"type":17,"tag":6121,"props":227918,"children":227920},{"className":227919},[],[227921],{"type":23,"value":21051},{"type":23,"value":34435},{"type":17,"tag":6121,"props":227924,"children":227926},{"className":227925},[],[227927],{"type":23,"value":21060},{"type":23,"value":227929}," (the report's date range)",{"type":17,"tag":84,"props":227931,"children":227932},{},[227933],{"type":17,"tag":6121,"props":227934,"children":227936},{"className":227935},[],[227937],{"type":23,"value":22296},{"type":17,"tag":84,"props":227939,"children":227940},{},[227941,227946],{"type":17,"tag":6121,"props":227942,"children":227944},{"className":227943},[],[227945],{"type":23,"value":22422},{"type":23,"value":227947}," (an array containing the performance data)",{"type":17,"tag":29,"props":227949,"children":227950},{},[227951,227953,227958],{"type":23,"value":227952},"Unified documents where metrics live, but does not publish a stable, spec-backed schema for their internal structure. The ",{"type":17,"tag":6121,"props":227954,"children":227956},{"className":227955},[],[227957],{"type":23,"value":22201},{"type":23,"value":227959}," array should be treated as an opaque payload that your application can inspect or pass through, not as a guaranteed schema.",{"type":17,"tag":29,"props":227961,"children":227962},{},[227963],{"type":23,"value":227964},"This distinction matters. You should not assume daily rows, per-entity breakdowns, or specific metric field names unless you validate them against your target provider.",{"type":17,"tag":68,"props":227966,"children":227968},{"id":227967},"step-4-know-which-report-filters-are-supported",[227969],{"type":23,"value":227970},"Step 4: Know which report filters are supported",{"type":17,"tag":29,"props":227972,"children":227973},{},[227974,227976,227981],{"type":23,"value":227975},"Reporting filters are ",{"type":17,"tag":48,"props":227977,"children":227978},{},[227979],{"type":23,"value":227980},"provider-specific",{"type":23,"value":227982},". Unified normalizes the endpoint, but not every provider supports the same query parameters.",{"type":17,"tag":239,"props":227984,"children":227986},{"id":227985},"commonly-supported-filters",[227987],{"type":23,"value":227988},"Commonly supported filters",{"type":17,"tag":29,"props":227990,"children":227991},{},[227992],{"type":23,"value":227993},"Across providers, Ads reports may support:",{"type":17,"tag":80,"props":227995,"children":227996},{},[227997,228005,228013,228021,228030,228038,228046,228054],{"type":17,"tag":84,"props":227998,"children":227999},{},[228000],{"type":17,"tag":6121,"props":228001,"children":228003},{"className":228002},[],[228004],{"type":23,"value":11980},{"type":17,"tag":84,"props":228006,"children":228007},{},[228008],{"type":17,"tag":6121,"props":228009,"children":228011},{"className":228010},[],[228012],{"type":23,"value":47245},{"type":17,"tag":84,"props":228014,"children":228015},{},[228016],{"type":17,"tag":6121,"props":228017,"children":228019},{"className":228018},[],[228020],{"type":23,"value":47281},{"type":17,"tag":84,"props":228022,"children":228023},{},[228024],{"type":17,"tag":6121,"props":228025,"children":228027},{"className":228026},[],[228028],{"type":23,"value":228029},"ad_id",{"type":17,"tag":84,"props":228031,"children":228032},{},[228033],{"type":17,"tag":6121,"props":228034,"children":228036},{"className":228035},[],[228037],{"type":23,"value":109144},{"type":17,"tag":84,"props":228039,"children":228040},{},[228041],{"type":17,"tag":6121,"props":228042,"children":228044},{"className":228043},[],[228045],{"type":23,"value":109151},{"type":17,"tag":84,"props":228047,"children":228048},{},[228049],{"type":17,"tag":6121,"props":228050,"children":228052},{"className":228051},[],[228053],{"type":23,"value":48389},{"type":17,"tag":84,"props":228055,"children":228056},{},[228057],{"type":17,"tag":6121,"props":228058,"children":228060},{"className":228059},[],[228061],{"type":23,"value":48411},{"type":17,"tag":239,"props":228063,"children":228064},{"id":22668},[228065],{"type":23,"value":228066},"Provider differences you must handle",{"type":17,"tag":80,"props":228068,"children":228069},{},[228070,228097,228124],{"type":17,"tag":84,"props":228071,"children":228072},{},[228073,228077],{"type":17,"tag":48,"props":228074,"children":228075},{},[228076],{"type":23,"value":11337},{"type":17,"tag":80,"props":228078,"children":228079},{},[228080,228085],{"type":17,"tag":84,"props":228081,"children":228082},{},[228083],{"type":23,"value":228084},"Supports date filtering and entity filters",{"type":17,"tag":84,"props":228086,"children":228087},{},[228088,228090,228095],{"type":23,"value":228089},"Supports a ",{"type":17,"tag":6121,"props":228091,"children":228093},{"className":228092},[],[228094],{"type":23,"value":27310},{"type":23,"value":228096}," parameter to request specific KPIs",{"type":17,"tag":84,"props":228098,"children":228099},{},[228100,228104],{"type":17,"tag":48,"props":228101,"children":228102},{},[228103],{"type":23,"value":11332},{"type":17,"tag":80,"props":228105,"children":228106},{},[228107,228112],{"type":17,"tag":84,"props":228108,"children":228109},{},[228110],{"type":23,"value":228111},"Supports date filtering",{"type":17,"tag":84,"props":228113,"children":228114},{},[228115,228117,228122],{"type":23,"value":228116},"Adds ",{"type":17,"tag":6121,"props":228118,"children":228120},{"className":228119},[],[228121],{"type":23,"value":26291},{"type":23,"value":228123}," for incremental reads",{"type":17,"tag":84,"props":228125,"children":228126},{},[228127,228131],{"type":17,"tag":48,"props":228128,"children":228129},{},[228130],{"type":23,"value":11362},{"type":17,"tag":80,"props":228132,"children":228133},{},[228134,228138],{"type":17,"tag":84,"props":228135,"children":228136},{},[228137],{"type":23,"value":228111},{"type":17,"tag":84,"props":228139,"children":228140},{},[228141,228143],{"type":23,"value":228142},"Does not document KPI selection via ",{"type":17,"tag":6121,"props":228144,"children":228146},{"className":228145},[],[228147],{"type":23,"value":27310},{"type":17,"tag":29,"props":228149,"children":228150},{},[228151],{"type":23,"value":228152},"Do not assume filter parity across providers. Always check supported list options before enabling a filter in your UI.",{"type":17,"tag":68,"props":228154,"children":228156},{"id":228155},"step-5-pull-a-baseline-report",[228157],{"type":23,"value":228158},"Step 5: Pull a baseline report",{"type":17,"tag":29,"props":228160,"children":228161},{},[228162],{"type":23,"value":228163},"Here's a minimal, provider-safe example that pulls reports for a date range:",{"type":17,"tag":6893,"props":228165,"children":228168},{"className":228166,"code":228167,"language":18718,"meta":7},[18716],"const reports = await sdk.ads.listAdsReports({\n  connectionId: CONNECTION_ADS!,\n  startGte: \"2025-01-01\",\n  endLt: \"2025-01-31\",\n  limit: 50,\n});\n",[228169],{"type":17,"tag":6121,"props":228170,"children":228171},{"__ignoreMap":7},[228172],{"type":23,"value":228167},{"type":17,"tag":29,"props":228174,"children":228175},{},[228176,228178,228183],{"type":23,"value":228177},"The response is an array of ",{"type":17,"tag":6121,"props":228179,"children":228181},{"className":228180},[],[228182],{"type":23,"value":227900},{"type":23,"value":228184}," objects. Each report represents a scoped result set for the given filters.",{"type":17,"tag":68,"props":228186,"children":228188},{"id":228187},"step-6-optional-request-a-specific-kpi-type",[228189],{"type":23,"value":228190},"Step 6 (Optional): Request a specific KPI type",{"type":17,"tag":29,"props":228192,"children":228193},{},[228194,228196,228201],{"type":23,"value":228195},"Some providers support selecting a specific KPI via the ",{"type":17,"tag":6121,"props":228197,"children":228199},{"className":228198},[],[228200],{"type":23,"value":27310},{"type":23,"value":228202}," parameter (for example, Google Ads).",{"type":17,"tag":6893,"props":228204,"children":228207},{"className":228205,"code":228206,"language":18718,"meta":7},[18716],"const reports = await sdk.ads.listAdsReports({\n  connectionId: CONNECTION_ADS!,\n  startGte: \"2025-01-01\",\n  endLt: \"2025-01-31\",\n  type: \"CLICKS\",\n  limit: 50,\n});\n",[228208],{"type":17,"tag":6121,"props":228209,"children":228210},{"__ignoreMap":7},[228211],{"type":23,"value":228206},{"type":17,"tag":29,"props":228213,"children":228214},{},[228215,228217,228222,228224,228229],{"type":23,"value":228216},"Unified documents supported KPI ",{"type":17,"tag":33,"props":228218,"children":228219},{},[228220],{"type":23,"value":228221},"selectors",{"type":23,"value":228223}," (via the ",{"type":17,"tag":6121,"props":228225,"children":228227},{"className":228226},[],[228228],{"type":23,"value":27310},{"type":23,"value":228230}," parameter) for certain providers. Supported values are provider-specific and documented in the Advertising API blog and integration pages.",{"type":17,"tag":80,"props":228232,"children":228233},{},[228234,228243,228252,228261,228270,228279,228287],{"type":17,"tag":84,"props":228235,"children":228236},{},[228237],{"type":17,"tag":6121,"props":228238,"children":228240},{"className":228239},[],[228241],{"type":23,"value":228242},"CLICKS",{"type":17,"tag":84,"props":228244,"children":228245},{},[228246],{"type":17,"tag":6121,"props":228247,"children":228249},{"className":228248},[],[228250],{"type":23,"value":228251},"IMPRESSIONS",{"type":17,"tag":84,"props":228253,"children":228254},{},[228255],{"type":17,"tag":6121,"props":228256,"children":228258},{"className":228257},[],[228259],{"type":23,"value":228260},"CTR",{"type":17,"tag":84,"props":228262,"children":228263},{},[228264],{"type":17,"tag":6121,"props":228265,"children":228267},{"className":228266},[],[228268],{"type":23,"value":228269},"COST",{"type":17,"tag":84,"props":228271,"children":228272},{},[228273],{"type":17,"tag":6121,"props":228274,"children":228276},{"className":228275},[],[228277],{"type":23,"value":228278},"CONVERSIONS",{"type":17,"tag":84,"props":228280,"children":228281},{},[228282],{"type":17,"tag":6121,"props":228283,"children":228285},{"className":228284},[],[228286],{"type":23,"value":41451},{"type":17,"tag":84,"props":228288,"children":228289},{},[228290],{"type":17,"tag":6121,"props":228291,"children":228293},{"className":228292},[],[228294],{"type":23,"value":41446},{"type":17,"tag":29,"props":228296,"children":228297},{},[228298,228300,228305],{"type":23,"value":228299},"If a provider does not support KPI selection, the ",{"type":17,"tag":6121,"props":228301,"children":228303},{"className":228302},[],[228304],{"type":23,"value":27310},{"type":23,"value":228306}," parameter may be ignored. Your application should handle this gracefully.",{"type":17,"tag":68,"props":228308,"children":228310},{"id":228309},"step-7-handle-metrics-safely",[228311],{"type":23,"value":228312},"Step 7: Handle metrics safely",{"type":17,"tag":29,"props":228314,"children":228315},{},[228316,228318,228324],{"type":23,"value":228317},"All performance data lives inside ",{"type":17,"tag":6121,"props":228319,"children":228321},{"className":228320},[],[228322],{"type":23,"value":228323},"report.metrics",{"type":23,"value":54},{"type":17,"tag":29,"props":228326,"children":228327},{},[228328,228330,228335],{"type":23,"value":228329},"What Unified ",{"type":17,"tag":48,"props":228331,"children":228332},{},[228333],{"type":23,"value":228334},"does",{"type":23,"value":228336}," guarantee:",{"type":17,"tag":80,"props":228338,"children":228339},{},[228340,228345,228350],{"type":17,"tag":84,"props":228341,"children":228342},{},[228343],{"type":23,"value":228344},"Metrics are returned as an array.",{"type":17,"tag":84,"props":228346,"children":228347},{},[228348],{"type":23,"value":228349},"Currency is specified at the report level.",{"type":17,"tag":84,"props":228351,"children":228352},{},[228353],{"type":23,"value":228354},"Metrics are scoped to the report's date range and filters.",{"type":17,"tag":29,"props":228356,"children":228357},{},[228358,228359,228364],{"type":23,"value":228329},{"type":17,"tag":48,"props":228360,"children":228361},{},[228362],{"type":23,"value":228363},"does not",{"type":23,"value":228365}," guarantee in public docs:",{"type":17,"tag":80,"props":228367,"children":228368},{},[228369,228374,228379],{"type":17,"tag":84,"props":228370,"children":228371},{},[228372],{"type":23,"value":228373},"The exact fields inside each metrics entry.",{"type":17,"tag":84,"props":228375,"children":228376},{},[228377],{"type":23,"value":228378},"Whether metrics are per-day, per-entity, or aggregated.",{"type":17,"tag":84,"props":228380,"children":228381},{},[228382],{"type":23,"value":228383},"Whether monetary values use major or minor currency units.",{"type":17,"tag":29,"props":228385,"children":228386},{},[228387],{"type":23,"value":228388},"For this reason:",{"type":17,"tag":80,"props":228390,"children":228391},{},[228392,228397,228402],{"type":17,"tag":84,"props":228393,"children":228394},{},[228395],{"type":23,"value":228396},"Do not hardcode metric field names.",{"type":17,"tag":84,"props":228398,"children":228399},{},[228400],{"type":23,"value":228401},"Do not compute derived metrics unless you control the inputs.",{"type":17,"tag":84,"props":228403,"children":228404},{},[228405,228406,228411],{"type":23,"value":156457},{"type":17,"tag":6121,"props":228407,"children":228409},{"className":228408},[],[228410],{"type":23,"value":22201},{"type":23,"value":228412}," as provider-defined data that your analytics layer interprets.",{"type":17,"tag":68,"props":228414,"children":228416},{"id":228415},"pagination-and-rate-limits",[228417],{"type":23,"value":228418},"Pagination and rate limits",{"type":17,"tag":29,"props":228420,"children":228421},{},[228422,228424,228428],{"type":23,"value":228423},"Ads reports use offset-based ",{"type":17,"tag":133,"props":228425,"children":228426},{"href":1857},[228427],{"type":23,"value":1860},{"type":23,"value":20456},{"type":17,"tag":80,"props":228430,"children":228431},{},[228432,228442],{"type":17,"tag":84,"props":228433,"children":228434},{},[228435,228440],{"type":17,"tag":6121,"props":228436,"children":228438},{"className":228437},[],[228439],{"type":23,"value":48389},{"type":23,"value":228441}," controls page size (typically capped at 100)",{"type":17,"tag":84,"props":228443,"children":228444},{},[228445,228450],{"type":17,"tag":6121,"props":228446,"children":228448},{"className":228447},[],[228449],{"type":23,"value":48411},{"type":23,"value":228451}," controls pagination",{"type":17,"tag":29,"props":228453,"children":228454},{},[228455,228457,228462],{"type":23,"value":228456},"When you receive a ",{"type":17,"tag":6121,"props":228458,"children":228460},{"className":228459},[],[228461],{"type":23,"value":139179},{"type":23,"value":228463}," response, handle it with backoff and retry logic. Unified enforces both provider-level and platform-level rate limits. The SDK does not automatically retry for you.",{"type":17,"tag":68,"props":228465,"children":228467},{"id":228466},"provider-considerations-you-must-handle",[228468],{"type":23,"value":228469},"Provider considerations you must handle",{"type":17,"tag":80,"props":228471,"children":228472},{},[228473,228486,228499,228512],{"type":17,"tag":84,"props":228474,"children":228475},{},[228476,228481,228484],{"type":17,"tag":48,"props":228477,"children":228478},{},[228479],{"type":23,"value":228480},"Reporting is list-based",{"type":17,"tag":3891,"props":228482,"children":228483},{},[],{"type":23,"value":228485},"There is no explicit 'run report' operation. All reporting is driven by list filters.",{"type":17,"tag":84,"props":228487,"children":228488},{},[228489,228494,228497],{"type":17,"tag":48,"props":228490,"children":228491},{},[228492],{"type":23,"value":228493},"Metrics are opaque",{"type":17,"tag":3891,"props":228495,"children":228496},{},[],{"type":23,"value":228498},"Unified normalizes access, not interpretation. Validate metric structure per provider.",{"type":17,"tag":84,"props":228500,"children":228501},{},[228502,228507,228510],{"type":17,"tag":48,"props":228503,"children":228504},{},[228505],{"type":23,"value":228506},"Filter support varies",{"type":17,"tag":3891,"props":228508,"children":228509},{},[],{"type":23,"value":228511},"Never assume a filter exists across all ad platforms.",{"type":17,"tag":84,"props":228513,"children":228514},{},[228515,228520,228523],{"type":17,"tag":48,"props":228516,"children":228517},{},[228518],{"type":23,"value":228519},"Webhooks are limited",{"type":17,"tag":3891,"props":228521,"children":228522},{},[],{"type":23,"value":228524},"Advertising webhooks are currently documented only for Meta Ads. Polling remains the primary reporting mechanism for other providers.",{"type":17,"tag":68,"props":228526,"children":228528},{"id":228527},"to-pull-cross-platform-ad-performance-reports-with-unified",[228529],{"type":23,"value":228530},"To pull cross-platform ad performance reports with Unified:",{"type":17,"tag":80,"props":228532,"children":228533},{},[228534,228544,228556,228561,228566,228571],{"type":17,"tag":84,"props":228535,"children":228536},{},[228537,228539],{"type":23,"value":228538},"Authenticate and obtain a valid Ads ",{"type":17,"tag":6121,"props":228540,"children":228542},{"className":228541},[],[228543],{"type":23,"value":19766},{"type":17,"tag":84,"props":228545,"children":228546},{},[228547,228548,228554],{"type":23,"value":33722},{"type":17,"tag":6121,"props":228549,"children":228551},{"className":228550},[],[228552],{"type":23,"value":228553},"GET /ads/{connection_id}/report",{"type":23,"value":228555}," with provider-safe filters",{"type":17,"tag":84,"props":228557,"children":228558},{},[228559],{"type":23,"value":228560},"Scope reports by date range and entity IDs",{"type":17,"tag":84,"props":228562,"children":228563},{},[228564],{"type":23,"value":228565},"Request KPI types where supported",{"type":17,"tag":84,"props":228567,"children":228568},{},[228569],{"type":23,"value":228570},"Treat metrics as an opaque, provider-defined payload",{"type":17,"tag":84,"props":228572,"children":228573},{},[228574],{"type":23,"value":228575},"Handle pagination and rate limits explicitly",{"type":17,"tag":29,"props":228577,"children":228578},{},[228579,228580],{"type":23,"value":1609},{"type":17,"tag":133,"props":228581,"children":228583},{"href":1612,"rel":228582},[214],[228584],{"type":23,"value":1616},{"type":17,"tag":29,"props":228586,"children":228587},{},[228588,228589],{"type":23,"value":1609},{"type":17,"tag":133,"props":228590,"children":228592},{"href":1623,"rel":228591},[214],[228593],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":228595},[228596,228597,228598,228599,228600,228604,228605,228606,228607,228608,228609],{"id":141798,"depth":1629,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":227861,"depth":1629,"text":227864},{"id":227967,"depth":1629,"text":227970,"children":228601},[228602,228603],{"id":227985,"depth":1635,"text":227988},{"id":22668,"depth":1635,"text":228066},{"id":228155,"depth":1629,"text":228158},{"id":228187,"depth":1629,"text":228190},{"id":228309,"depth":1629,"text":228312},{"id":228415,"depth":1629,"text":228418},{"id":228466,"depth":1629,"text":228469},{"id":228527,"depth":1629,"text":228530},"content:blog:how_to_pull_cross_platform_ad_performance_reports_using_unified_advertising_api.md","blog/how_to_pull_cross_platform_ad_performance_reports_using_unified_advertising_api.md","blog/how_to_pull_cross_platform_ad_performance_reports_using_unified_advertising_api",{"_path":228614,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":129133,"description":228615,"img":228616,"date":227676,"tag":12,"body":228617,"_type":1677,"_id":229742,"_source":1679,"_file":229743,"_stem":229744,"_extension":1682},"/blog/polling_vs_webhooks_when_to_use_one_over_the_other","Keeping customer data in sync across integrations is one of the hardest parts of building SaaS products.","https://s3.us-east-2.amazonaws.com/unified-article-images/polling_vs_webhooks_when_to_use_one_over_the_other-icon.png",{"type":14,"children":228618,"toc":229709},[228619,228624,228627,228634,228638,228643,228657,228669,228694,228699,228704,228710,228721,228726,228731,228773,228779,228784,228792,228834,228840,228845,228853,228933,228945,228951,228956,228961,228966,228972,228979,229021,229027,229032,229039,229116,229121,229127,229132,229136,229141,229159,229166,229184,229188,229193,229197,229212,229217,229230,229237,229242,229248,229253,229257,229262,229279,229284,229302,229307,229312,229317,229335,229340,229357,229363,229368,229374,229379,229397,229402,229408,229413,229431,229437,229442,229446,229464,229470,229488,229493,229499,229504,229508,229531,229536,229553,229559,229565,229588,229594,229612,229618,229636,229640,229645,229650,229655,229660,229665,229669,229686,229691,229700],{"type":17,"tag":18,"props":228620,"children":228622},{"id":228621},"polling-vs-webhooks-when-to-use-one-over-the-other",[228623],{"type":23,"value":129133},{"type":17,"tag":25,"props":228625,"children":228626},{},[],{"type":17,"tag":29,"props":228628,"children":228629},{},[228630],{"type":17,"tag":33,"props":228631,"children":228632},{},[228633],{"type":23,"value":225781},{"type":17,"tag":29,"props":228635,"children":228636},{},[228637],{"type":23,"value":228615},{"type":17,"tag":29,"props":228639,"children":228640},{},[228641],{"type":23,"value":228642},"Most teams eventually face the same question:",{"type":17,"tag":29,"props":228644,"children":228645},{},[228646],{"type":17,"tag":48,"props":228647,"children":228648},{},[228649,228651,228655],{"type":23,"value":228650},"Should we poll APIs for changes, or rely on ",{"type":17,"tag":133,"props":228652,"children":228653},{"href":4999},[228654],{"type":23,"value":5002},{"type":23,"value":228656},"?",{"type":17,"tag":29,"props":228658,"children":228659},{},[228660,228662,228667],{"type":23,"value":228661},"This is not just a feature choice. It determines ",{"type":17,"tag":48,"props":228663,"children":228664},{},[228665],{"type":23,"value":228666},"where change detection lives",{"type":23,"value":228668},", how much infrastructure your team owns, and how your system behaves under load.",{"type":17,"tag":3414,"props":228670,"children":228671},{},[228672],{"type":17,"tag":29,"props":228673,"children":228674},{},[228675,228677,228681,228683,228687,228689],{"type":23,"value":228676},"For a breakdown of how ",{"type":17,"tag":133,"props":228678,"children":228679},{"href":7691},[228680],{"type":23,"value":7459},{"type":23,"value":228682}," platforms implement ",{"type":17,"tag":133,"props":228684,"children":228685},{"href":9007},[228686],{"type":23,"value":46572},{"type":23,"value":228688}," vs sync-based notification systems, see: ",{"type":17,"tag":48,"props":228690,"children":228691},{},[228692],{"type":23,"value":228693},"Which Unified API Platforms Support Virtual Webhooks vs Sync-Based Notifications",{"type":17,"tag":29,"props":228695,"children":228696},{},[228697],{"type":23,"value":228698},"Polling and webhooks solve different constraints. In practice, most systems use a combination of both.",{"type":17,"tag":29,"props":228700,"children":228701},{},[228702],{"type":23,"value":228703},"This guide focuses on how each model works at a systems level, where it breaks down, and how virtual webhooks fit in when native webhooks are not available.",{"type":17,"tag":68,"props":228705,"children":228707},{"id":228706},"what-is-polling",[228708],{"type":23,"value":228709},"What is polling?",{"type":17,"tag":29,"props":228711,"children":228712},{},[228713,228715,228720],{"type":23,"value":228714},"Polling is a ",{"type":17,"tag":48,"props":228716,"children":228717},{},[228718],{"type":23,"value":228719},"client-driven model",{"type":23,"value":54},{"type":17,"tag":29,"props":228722,"children":228723},{},[228724],{"type":23,"value":228725},"Your application periodically calls a third-party API to check whether anything has changed.",{"type":17,"tag":29,"props":228727,"children":228728},{},[228729],{"type":23,"value":228730},"A typical polling loop:",{"type":17,"tag":6154,"props":228732,"children":228733},{},[228734,228753,228758,228763,228768],{"type":17,"tag":84,"props":228735,"children":228736},{},[228737,228739,228744,228746,228752],{"type":23,"value":228738},"Call a ",{"type":17,"tag":6121,"props":228740,"children":228742},{"className":228741},[],[228743],{"type":23,"value":11243},{"type":23,"value":228745}," endpoint (e.g. ",{"type":17,"tag":6121,"props":228747,"children":228749},{"className":228748},[],[228750],{"type":23,"value":228751},"updated_since=timestamp",{"type":23,"value":12034},{"type":17,"tag":84,"props":228754,"children":228755},{},[228756],{"type":23,"value":228757},"Process returned records",{"type":17,"tag":84,"props":228759,"children":228760},{},[228761],{"type":23,"value":228762},"Store a checkpoint",{"type":17,"tag":84,"props":228764,"children":228765},{},[228766],{"type":23,"value":228767},"Wait for the next interval",{"type":17,"tag":84,"props":228769,"children":228770},{},[228771],{"type":23,"value":228772},"Repeat",{"type":17,"tag":239,"props":228774,"children":228776},{"id":228775},"where-polling-works-well",[228777],{"type":23,"value":228778},"Where polling works well",{"type":17,"tag":29,"props":228780,"children":228781},{},[228782],{"type":23,"value":228783},"Polling is widely used because it is simple and universally supported.",{"type":17,"tag":29,"props":228785,"children":228786},{},[228787],{"type":17,"tag":48,"props":228788,"children":228789},{},[228790],{"type":23,"value":228791},"Advantages",{"type":17,"tag":80,"props":228793,"children":228794},{},[228795,228808,228821],{"type":17,"tag":84,"props":228796,"children":228797},{},[228798,228803,228806],{"type":17,"tag":48,"props":228799,"children":228800},{},[228801],{"type":23,"value":228802},"Works with any API",{"type":17,"tag":3891,"props":228804,"children":228805},{},[],{"type":23,"value":228807},"If an integration exposes read endpoints, polling is available.",{"type":17,"tag":84,"props":228809,"children":228810},{},[228811,228816,228819],{"type":17,"tag":48,"props":228812,"children":228813},{},[228814],{"type":23,"value":228815},"Full control over execution",{"type":17,"tag":3891,"props":228817,"children":228818},{},[],{"type":23,"value":228820},"You define the interval, retry behavior, and backoff strategy.",{"type":17,"tag":84,"props":228822,"children":228823},{},[228824,228829,228832],{"type":17,"tag":48,"props":228825,"children":228826},{},[228827],{"type":23,"value":228828},"Deterministic behavior",{"type":17,"tag":3891,"props":228830,"children":228831},{},[],{"type":23,"value":228833},"Your system controls when reads happen and how failures are handled.",{"type":17,"tag":239,"props":228835,"children":228837},{"id":228836},"where-polling-breaks-down",[228838],{"type":23,"value":228839},"Where polling breaks down",{"type":17,"tag":29,"props":228841,"children":228842},{},[228843],{"type":23,"value":228844},"As systems scale, polling introduces operational overhead.",{"type":17,"tag":29,"props":228846,"children":228847},{},[228848],{"type":17,"tag":48,"props":228849,"children":228850},{},[228851],{"type":23,"value":228852},"Drawbacks",{"type":17,"tag":80,"props":228854,"children":228855},{},[228856,228869,228882,228920],{"type":17,"tag":84,"props":228857,"children":228858},{},[228859,228864,228867],{"type":17,"tag":48,"props":228860,"children":228861},{},[228862],{"type":23,"value":228863},"Delayed updates",{"type":17,"tag":3891,"props":228865,"children":228866},{},[],{"type":23,"value":228868},"Data is only as fresh as your polling interval.",{"type":17,"tag":84,"props":228870,"children":228871},{},[228872,228877,228880],{"type":17,"tag":48,"props":228873,"children":228874},{},[228875],{"type":23,"value":228876},"Inefficient API usage",{"type":17,"tag":3891,"props":228878,"children":228879},{},[],{"type":23,"value":228881},"Many requests return no changes but still consume rate limits.",{"type":17,"tag":84,"props":228883,"children":228884},{},[228885,228889,228892,228894],{"type":17,"tag":48,"props":228886,"children":228887},{},[228888],{"type":23,"value":46374},{"type":17,"tag":3891,"props":228890,"children":228891},{},[],{"type":23,"value":228893},"You maintain:",{"type":17,"tag":80,"props":228895,"children":228896},{},[228897,228902,228907,228911,228915],{"type":17,"tag":84,"props":228898,"children":228899},{},[228900],{"type":23,"value":228901},"schedulers",{"type":17,"tag":84,"props":228903,"children":228904},{},[228905],{"type":23,"value":228906},"checkpoint tracking",{"type":17,"tag":84,"props":228908,"children":228909},{},[228910],{"type":23,"value":124228},{"type":17,"tag":84,"props":228912,"children":228913},{},[228914],{"type":23,"value":89705},{"type":17,"tag":84,"props":228916,"children":228917},{},[228918],{"type":23,"value":228919},"retry and backoff",{"type":17,"tag":84,"props":228921,"children":228922},{},[228923,228928,228931],{"type":17,"tag":48,"props":228924,"children":228925},{},[228926],{"type":23,"value":228927},"Rate-limit pressure",{"type":17,"tag":3891,"props":228929,"children":228930},{},[],{"type":23,"value":228932},"Polling across many integrations and customers multiplies request volume.",{"type":17,"tag":29,"props":228934,"children":228935},{},[228936,228938,228943],{"type":23,"value":228937},"Polling works best for ",{"type":17,"tag":48,"props":228939,"children":228940},{},[228941],{"type":23,"value":228942},"low-urgency, batch-oriented workflows",{"type":23,"value":228944}," where freshness is not critical.",{"type":17,"tag":68,"props":228946,"children":228948},{"id":228947},"what-is-a-webhook",[228949],{"type":23,"value":228950},"What is a webhook?",{"type":17,"tag":29,"props":228952,"children":228953},{},[228954],{"type":23,"value":228955},"Webhooks invert the control model.",{"type":17,"tag":29,"props":228957,"children":228958},{},[228959],{"type":23,"value":228960},"Instead of your application requesting updates, the source integration sends an event when something changes.",{"type":17,"tag":29,"props":228962,"children":228963},{},[228964],{"type":23,"value":228965},"When an event occurs, the provider sends an HTTP request to your webhook endpoint containing information about the change.",{"type":17,"tag":239,"props":228967,"children":228969},{"id":228968},"where-webhooks-work-well",[228970],{"type":23,"value":228971},"Where webhooks work well",{"type":17,"tag":29,"props":228973,"children":228974},{},[228975],{"type":17,"tag":48,"props":228976,"children":228977},{},[228978],{"type":23,"value":228791},{"type":17,"tag":80,"props":228980,"children":228981},{},[228982,228995,229008],{"type":17,"tag":84,"props":228983,"children":228984},{},[228985,228990,228993],{"type":17,"tag":48,"props":228986,"children":228987},{},[228988],{"type":23,"value":228989},"Timely updates",{"type":17,"tag":3891,"props":228991,"children":228992},{},[],{"type":23,"value":228994},"Changes are delivered when they occur or shortly after.",{"type":17,"tag":84,"props":228996,"children":228997},{},[228998,229003,229006],{"type":17,"tag":48,"props":228999,"children":229000},{},[229001],{"type":23,"value":229002},"Reduced API usage",{"type":17,"tag":3891,"props":229004,"children":229005},{},[],{"type":23,"value":229007},"No need to repeatedly request data when nothing has changed.",{"type":17,"tag":84,"props":229009,"children":229010},{},[229011,229016,229019],{"type":17,"tag":48,"props":229012,"children":229013},{},[229014],{"type":23,"value":229015},"Event-driven architecture",{"type":17,"tag":3891,"props":229017,"children":229018},{},[],{"type":23,"value":229020},"Fits naturally with automation, notifications, and reactive systems.",{"type":17,"tag":239,"props":229022,"children":229024},{"id":229023},"the-challenges-with-native-webhooks",[229025],{"type":23,"value":229026},"The challenges with native webhooks",{"type":17,"tag":29,"props":229028,"children":229029},{},[229030],{"type":23,"value":229031},"Webhooks introduce variability because they depend on the source integration.",{"type":17,"tag":29,"props":229033,"children":229034},{},[229035],{"type":17,"tag":48,"props":229036,"children":229037},{},[229038],{"type":23,"value":440},{"type":17,"tag":80,"props":229040,"children":229041},{},[229042,229055,229068,229103],{"type":17,"tag":84,"props":229043,"children":229044},{},[229045,229050,229053],{"type":17,"tag":48,"props":229046,"children":229047},{},[229048],{"type":23,"value":229049},"Inconsistent support",{"type":17,"tag":3891,"props":229051,"children":229052},{},[],{"type":23,"value":229054},"Many APIs do not support webhooks, or only support them for certain objects.",{"type":17,"tag":84,"props":229056,"children":229057},{},[229058,229063,229066],{"type":17,"tag":48,"props":229059,"children":229060},{},[229061],{"type":23,"value":229062},"Provider-specific behavior",{"type":17,"tag":3891,"props":229064,"children":229065},{},[],{"type":23,"value":229067},"Retry logic, ordering, and payload structure vary.",{"type":17,"tag":84,"props":229069,"children":229070},{},[229071,229076,229079,229081],{"type":17,"tag":48,"props":229072,"children":229073},{},[229074],{"type":23,"value":229075},"Delivery handling required",{"type":17,"tag":3891,"props":229077,"children":229078},{},[],{"type":23,"value":229080},"Your system must handle:",{"type":17,"tag":80,"props":229082,"children":229083},{},[229084,229088,229093,229098],{"type":17,"tag":84,"props":229085,"children":229086},{},[229087],{"type":23,"value":36948},{"type":17,"tag":84,"props":229089,"children":229090},{},[229091],{"type":23,"value":229092},"duplicate events",{"type":17,"tag":84,"props":229094,"children":229095},{},[229096],{"type":23,"value":229097},"out-of-order delivery",{"type":17,"tag":84,"props":229099,"children":229100},{},[229101],{"type":23,"value":229102},"partial failures",{"type":17,"tag":84,"props":229104,"children":229105},{},[229106,229111,229114],{"type":17,"tag":48,"props":229107,"children":229108},{},[229109],{"type":23,"value":229110},"Uneven reliability",{"type":17,"tag":3891,"props":229112,"children":229113},{},[],{"type":23,"value":229115},"Some providers retry aggressively. Others do not retry at all.",{"type":17,"tag":29,"props":229117,"children":229118},{},[229119],{"type":23,"value":229120},"Because of this, most systems end up combining webhooks with polling.",{"type":17,"tag":68,"props":229122,"children":229124},{"id":229123},"native-webhooks-vs-virtual-webhooks",[229125],{"type":23,"value":229126},"Native webhooks vs virtual webhooks",{"type":17,"tag":29,"props":229128,"children":229129},{},[229130],{"type":23,"value":229131},"When native webhooks are not available, event delivery still requires change detection.",{"type":17,"tag":239,"props":229133,"children":229134},{"id":9021},[229135],{"type":23,"value":9024},{"type":17,"tag":29,"props":229137,"children":229138},{},[229139],{"type":23,"value":229140},"Native webhooks are emitted by the source integration.",{"type":17,"tag":80,"props":229142,"children":229143},{},[229144,229149,229154],{"type":17,"tag":84,"props":229145,"children":229146},{},[229147],{"type":23,"value":229148},"The provider detects a change",{"type":17,"tag":84,"props":229150,"children":229151},{},[229152],{"type":23,"value":229153},"The provider sends an event",{"type":17,"tag":84,"props":229155,"children":229156},{},[229157],{"type":23,"value":229158},"Delivery behavior depends on the provider",{"type":17,"tag":29,"props":229160,"children":229161},{},[229162],{"type":17,"tag":48,"props":229163,"children":229164},{},[229165],{"type":23,"value":153155},{"type":17,"tag":80,"props":229167,"children":229168},{},[229169,229174,229179],{"type":17,"tag":84,"props":229170,"children":229171},{},[229172],{"type":23,"value":229173},"Retry guarantees vary",{"type":17,"tag":84,"props":229175,"children":229176},{},[229177],{"type":23,"value":229178},"Events may be missed if delivery fails",{"type":17,"tag":84,"props":229180,"children":229181},{},[229182],{"type":23,"value":229183},"Consumers should treat delivery as best-effort",{"type":17,"tag":239,"props":229185,"children":229186},{"id":9074},[229187],{"type":23,"value":9077},{"type":17,"tag":29,"props":229189,"children":229190},{},[229191],{"type":23,"value":229192},"Virtual webhooks move change detection into the integration layer.",{"type":17,"tag":29,"props":229194,"children":229195},{},[229196],{"type":23,"value":9087},{"type":17,"tag":80,"props":229198,"children":229199},{},[229200,229204,229208],{"type":17,"tag":84,"props":229201,"children":229202},{},[229203],{"type":23,"value":9095},{"type":17,"tag":84,"props":229205,"children":229206},{},[229207],{"type":23,"value":9100},{"type":17,"tag":84,"props":229209,"children":229210},{},[229211],{"type":23,"value":215532},{"type":17,"tag":29,"props":229213,"children":229214},{},[229215],{"type":23,"value":229216},"From your application's perspective:",{"type":17,"tag":80,"props":229218,"children":229219},{},[229220,229225],{"type":17,"tag":84,"props":229221,"children":229222},{},[229223],{"type":23,"value":229224},"You subscribe once",{"type":17,"tag":84,"props":229226,"children":229227},{},[229228],{"type":23,"value":229229},"Events arrive without polling logic in your system",{"type":17,"tag":3414,"props":229231,"children":229232},{},[229233],{"type":17,"tag":29,"props":229234,"children":229235},{},[229236],{"type":23,"value":215550},{"type":17,"tag":29,"props":229238,"children":229239},{},[229240],{"type":23,"value":229241},"This is distinct from sync-based systems, where data is stored and events are emitted after scheduled updates.",{"type":17,"tag":68,"props":229243,"children":229245},{"id":229244},"delivery-semantics-important-distinction",[229246],{"type":23,"value":229247},"Delivery semantics (important distinction)",{"type":17,"tag":29,"props":229249,"children":229250},{},[229251],{"type":23,"value":229252},"How events are delivered matters as much as how they are generated.",{"type":17,"tag":239,"props":229254,"children":229255},{"id":164743},[229256],{"type":23,"value":9256},{"type":17,"tag":29,"props":229258,"children":229259},{},[229260],{"type":23,"value":229261},"For virtual webhooks, the integration layer controls:",{"type":17,"tag":80,"props":229263,"children":229264},{},[229265,229270,229274],{"type":17,"tag":84,"props":229266,"children":229267},{},[229268],{"type":23,"value":229269},"when data is read",{"type":17,"tag":84,"props":229271,"children":229272},{},[229273],{"type":23,"value":9512},{"type":17,"tag":84,"props":229275,"children":229276},{},[229277],{"type":23,"value":229278},"when events are emitted",{"type":17,"tag":29,"props":229280,"children":229281},{},[229282],{"type":23,"value":229283},"As a result:",{"type":17,"tag":80,"props":229285,"children":229286},{},[229287,229292,229297],{"type":17,"tag":84,"props":229288,"children":229289},{},[229290],{"type":23,"value":229291},"Events are emitted per detected change",{"type":17,"tag":84,"props":229293,"children":229294},{},[229295],{"type":23,"value":229296},"Retries are handled before delivery",{"type":17,"tag":84,"props":229298,"children":229299},{},[229300],{"type":23,"value":229301},"Event streams are consistent at the integration layer",{"type":17,"tag":29,"props":229303,"children":229304},{},[229305],{"type":23,"value":229306},"Consumers should still implement idempotency to handle network-level duplication.",{"type":17,"tag":239,"props":229308,"children":229310},{"id":229309},"native-webhooks-1",[229311],{"type":23,"value":9024},{"type":17,"tag":29,"props":229313,"children":229314},{},[229315],{"type":23,"value":229316},"For native webhooks:",{"type":17,"tag":80,"props":229318,"children":229319},{},[229320,229325,229330],{"type":17,"tag":84,"props":229321,"children":229322},{},[229323],{"type":23,"value":229324},"Delivery depends on the provider",{"type":17,"tag":84,"props":229326,"children":229327},{},[229328],{"type":23,"value":229329},"Retry behavior varies",{"type":17,"tag":84,"props":229331,"children":229332},{},[229333],{"type":23,"value":229334},"Events may arrive out of order or be duplicated",{"type":17,"tag":29,"props":229336,"children":229337},{},[229338],{"type":23,"value":229339},"Consumers should assume:",{"type":17,"tag":80,"props":229341,"children":229342},{},[229343,229347,229352],{"type":17,"tag":84,"props":229344,"children":229345},{},[229346],{"type":23,"value":229092},{"type":17,"tag":84,"props":229348,"children":229349},{},[229350],{"type":23,"value":229351},"possible ordering issues",{"type":17,"tag":84,"props":229353,"children":229354},{},[229355],{"type":23,"value":229356},"no guaranteed replay",{"type":17,"tag":68,"props":229358,"children":229360},{"id":229359},"initial-sync-and-ongoing-updates",[229361],{"type":23,"value":229362},"Initial sync and ongoing updates",{"type":17,"tag":29,"props":229364,"children":229365},{},[229366],{"type":23,"value":229367},"When subscribing to events, systems often need both historical data and incremental updates.",{"type":17,"tag":239,"props":229369,"children":229371},{"id":229370},"initial-sync",[229372],{"type":23,"value":229373},"Initial sync",{"type":17,"tag":29,"props":229375,"children":229376},{},[229377],{"type":23,"value":229378},"An initial backfill typically:",{"type":17,"tag":6154,"props":229380,"children":229381},{},[229382,229387,229392],{"type":17,"tag":84,"props":229383,"children":229384},{},[229385],{"type":23,"value":229386},"Retrieves existing records",{"type":17,"tag":84,"props":229388,"children":229389},{},[229390],{"type":23,"value":229391},"Delivers data in batches",{"type":17,"tag":84,"props":229393,"children":229394},{},[229395],{"type":23,"value":229396},"Emits a completion signal when finished",{"type":17,"tag":29,"props":229398,"children":229399},{},[229400],{"type":23,"value":229401},"This process may trigger multiple webhook deliveries before steady-state operation begins.",{"type":17,"tag":239,"props":229403,"children":229405},{"id":229404},"ongoing-updates",[229406],{"type":23,"value":229407},"Ongoing updates",{"type":17,"tag":29,"props":229409,"children":229410},{},[229411],{"type":23,"value":229412},"After initial sync:",{"type":17,"tag":80,"props":229414,"children":229415},{},[229416,229421,229426],{"type":17,"tag":84,"props":229417,"children":229418},{},[229419],{"type":23,"value":229420},"Only new or updated records generate events",{"type":17,"tag":84,"props":229422,"children":229423},{},[229424],{"type":23,"value":229425},"Payloads may be batched",{"type":17,"tag":84,"props":229427,"children":229428},{},[229429],{"type":23,"value":229430},"Multiple deliveries may occur during high-change periods",{"type":17,"tag":68,"props":229432,"children":229434},{"id":229433},"billing-and-cost-considerations",[229435],{"type":23,"value":229436},"Billing and cost considerations",{"type":17,"tag":29,"props":229438,"children":229439},{},[229440],{"type":23,"value":229441},"Polling and event-driven models scale differently.",{"type":17,"tag":239,"props":229443,"children":229444},{"id":31656},[229445],{"type":23,"value":172306},{"type":17,"tag":80,"props":229447,"children":229448},{},[229449,229454,229459],{"type":17,"tag":84,"props":229450,"children":229451},{},[229452],{"type":23,"value":229453},"Every request counts toward usage",{"type":17,"tag":84,"props":229455,"children":229456},{},[229457],{"type":23,"value":229458},"Empty responses still consume resources",{"type":17,"tag":84,"props":229460,"children":229461},{},[229462],{"type":23,"value":229463},"Pagination increases request volume",{"type":17,"tag":239,"props":229465,"children":229467},{"id":229466},"event-driven-delivery",[229468],{"type":23,"value":229469},"Event-driven delivery",{"type":17,"tag":80,"props":229471,"children":229472},{},[229473,229478,229483],{"type":17,"tag":84,"props":229474,"children":229475},{},[229476],{"type":23,"value":229477},"Usage is tied to events processed",{"type":17,"tag":84,"props":229479,"children":229480},{},[229481],{"type":23,"value":229482},"No cost for empty intervals",{"type":17,"tag":84,"props":229484,"children":229485},{},[229486],{"type":23,"value":229487},"Cost scales with actual data changes",{"type":17,"tag":29,"props":229489,"children":229490},{},[229491],{"type":23,"value":229492},"This makes event-driven models more predictable for low-change datasets.",{"type":17,"tag":68,"props":229494,"children":229496},{"id":229495},"handling-duplicates-and-idempotency",[229497],{"type":23,"value":229498},"Handling duplicates and idempotency",{"type":17,"tag":29,"props":229500,"children":229501},{},[229502],{"type":23,"value":229503},"Event-driven systems require idempotent handling.",{"type":17,"tag":29,"props":229505,"children":229506},{},[229507],{"type":23,"value":22753},{"type":17,"tag":80,"props":229509,"children":229510},{},[229511,229521,229526],{"type":17,"tag":84,"props":229512,"children":229513},{},[229514,229516],{"type":23,"value":229515},"update records using the latest ",{"type":17,"tag":6121,"props":229517,"children":229519},{"className":229518},[],[229520],{"type":23,"value":25337},{"type":17,"tag":84,"props":229522,"children":229523},{},[229524],{"type":23,"value":229525},"apply atomic writes",{"type":17,"tag":84,"props":229527,"children":229528},{},[229529],{"type":23,"value":229530},"ignore stale updates",{"type":17,"tag":29,"props":229532,"children":229533},{},[229534],{"type":23,"value":229535},"This protects against:",{"type":17,"tag":80,"props":229537,"children":229538},{},[229539,229543,229548],{"type":17,"tag":84,"props":229540,"children":229541},{},[229542],{"type":23,"value":229092},{"type":17,"tag":84,"props":229544,"children":229545},{},[229546],{"type":23,"value":229547},"rapid successive updates",{"type":17,"tag":84,"props":229549,"children":229550},{},[229551],{"type":23,"value":229552},"network retries",{"type":17,"tag":68,"props":229554,"children":229556},{"id":229555},"when-to-use-each-approach",[229557],{"type":23,"value":229558},"When to use each approach",{"type":17,"tag":239,"props":229560,"children":229562},{"id":229561},"use-polling-when",[229563],{"type":23,"value":229564},"Use polling when",{"type":17,"tag":80,"props":229566,"children":229567},{},[229568,229573,229578,229583],{"type":17,"tag":84,"props":229569,"children":229570},{},[229571],{"type":23,"value":229572},"freshness is not critical",{"type":17,"tag":84,"props":229574,"children":229575},{},[229576],{"type":23,"value":229577},"batch processing is acceptable",{"type":17,"tag":84,"props":229579,"children":229580},{},[229581],{"type":23,"value":229582},"you need full control over scheduling",{"type":17,"tag":84,"props":229584,"children":229585},{},[229586],{"type":23,"value":229587},"provider webhook support is limited",{"type":17,"tag":239,"props":229589,"children":229591},{"id":229590},"use-native-webhooks-when",[229592],{"type":23,"value":229593},"Use native webhooks when",{"type":17,"tag":80,"props":229595,"children":229596},{},[229597,229602,229607],{"type":17,"tag":84,"props":229598,"children":229599},{},[229600],{"type":23,"value":229601},"the provider supports them reliably",{"type":17,"tag":84,"props":229603,"children":229604},{},[229605],{"type":23,"value":229606},"timely updates are required",{"type":17,"tag":84,"props":229608,"children":229609},{},[229610],{"type":23,"value":229611},"event coverage is sufficient",{"type":17,"tag":239,"props":229613,"children":229615},{"id":229614},"use-virtual-webhooks-when",[229616],{"type":23,"value":229617},"Use virtual webhooks when",{"type":17,"tag":80,"props":229619,"children":229620},{},[229621,229626,229631],{"type":17,"tag":84,"props":229622,"children":229623},{},[229624],{"type":23,"value":229625},"native webhooks are not available",{"type":17,"tag":84,"props":229627,"children":229628},{},[229629],{"type":23,"value":229630},"you want event-driven behavior without building polling infrastructure",{"type":17,"tag":84,"props":229632,"children":229633},{},[229634],{"type":23,"value":229635},"consistent delivery and centralized change detection matter",{"type":17,"tag":68,"props":229637,"children":229638},{"id":2316},[229639],{"type":23,"value":8829},{"type":17,"tag":29,"props":229641,"children":229642},{},[229643],{"type":23,"value":229644},"Polling and webhooks are not interchangeable.",{"type":17,"tag":29,"props":229646,"children":229647},{},[229648],{"type":23,"value":229649},"Polling gives control and universality, but introduces delay and operational overhead.",{"type":17,"tag":29,"props":229651,"children":229652},{},[229653],{"type":23,"value":229654},"Webhooks provide event-driven behavior, but depend on provider reliability.",{"type":17,"tag":29,"props":229656,"children":229657},{},[229658],{"type":23,"value":229659},"Virtual webhooks shift polling and change detection into the integration layer and deliver events through a webhook interface.",{"type":17,"tag":29,"props":229661,"children":229662},{},[229663],{"type":23,"value":229664},"The real decision is not polling vs webhooks.",{"type":17,"tag":29,"props":229666,"children":229667},{},[229668],{"type":23,"value":104074},{"type":17,"tag":80,"props":229670,"children":229671},{},[229672,229676,229681],{"type":17,"tag":84,"props":229673,"children":229674},{},[229675],{"type":23,"value":228666},{"type":17,"tag":84,"props":229677,"children":229678},{},[229679],{"type":23,"value":229680},"how events are generated",{"type":17,"tag":84,"props":229682,"children":229683},{},[229684],{"type":23,"value":229685},"how much infrastructure your team owns",{"type":17,"tag":29,"props":229687,"children":229688},{},[229689],{"type":23,"value":229690},"That choice determines whether your system is built around scheduled retrieval—or around events.",{"type":17,"tag":29,"props":229692,"children":229693},{},[229694,229695],{"type":23,"value":1609},{"type":17,"tag":133,"props":229696,"children":229698},{"href":1612,"rel":229697},[214],[229699],{"type":23,"value":1616},{"type":17,"tag":29,"props":229701,"children":229702},{},[229703,229704],{"type":23,"value":1609},{"type":17,"tag":133,"props":229705,"children":229707},{"href":1623,"rel":229706},[214],[229708],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":229710},[229711,229715,229719,229723,229727,229731,229735,229736,229741],{"id":228706,"depth":1629,"text":228709,"children":229712},[229713,229714],{"id":228775,"depth":1635,"text":228778},{"id":228836,"depth":1635,"text":228839},{"id":228947,"depth":1629,"text":228950,"children":229716},[229717,229718],{"id":228968,"depth":1635,"text":228971},{"id":229023,"depth":1635,"text":229026},{"id":229123,"depth":1629,"text":229126,"children":229720},[229721,229722],{"id":9021,"depth":1635,"text":9024},{"id":9074,"depth":1635,"text":9077},{"id":229244,"depth":1629,"text":229247,"children":229724},[229725,229726],{"id":164743,"depth":1635,"text":9256},{"id":229309,"depth":1635,"text":9024},{"id":229359,"depth":1629,"text":229362,"children":229728},[229729,229730],{"id":229370,"depth":1635,"text":229373},{"id":229404,"depth":1635,"text":229407},{"id":229433,"depth":1629,"text":229436,"children":229732},[229733,229734],{"id":31656,"depth":1635,"text":172306},{"id":229466,"depth":1635,"text":229469},{"id":229495,"depth":1629,"text":229498},{"id":229555,"depth":1629,"text":229558,"children":229737},[229738,229739,229740],{"id":229561,"depth":1635,"text":229564},{"id":229590,"depth":1635,"text":229593},{"id":229614,"depth":1635,"text":229617},{"id":2316,"depth":1629,"text":8829},"content:blog:polling_vs_webhooks_when_to_use_one_over_the_other.md","blog/polling_vs_webhooks_when_to_use_one_over_the_other.md","blog/polling_vs_webhooks_when_to_use_one_over_the_other",{"_path":229746,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":229747,"description":229748,"img":229749,"date":229750,"tag":12,"body":229751,"_type":1677,"_id":230369,"_source":1679,"_file":230370,"_stem":230371,"_extension":1682},"/blog/best_unified_advertising_apis_for_saas_in_2026_technical_comparison_unified","Best Unified Advertising APIs for SaaS in 2026 (Technical Comparison): Unified","Advertising is one of the hardest API categories to support in a SaaS product.","https://s3.us-east-2.amazonaws.com/unified-article-images/best_unified_advertising_apis_for_saas_in_2026_technical_comparison_unified-icon.png","2026-01-15T00:00:00.000Z",{"type":14,"children":229752,"toc":230354},[229753,229758,229761,229769,229773,229784,229789,229802,229807,229819,229830,229835,229840,229852,229856,229862,229867,229873,229878,229883,229888,229893,229899,229904,229909,229914,229920,229925,229930,229935,229941,229945,229950,229955,229960,229965,229975,229979,229984,229989,229998,230004,230009,230014,230023,230028,230033,230038,230047,230224,230230,230239,230262,230270,230288,230292,230297,230302,230319,230331,230336,230345],{"type":17,"tag":18,"props":229754,"children":229756},{"id":229755},"best-unified-advertising-apis-for-saas-in-2026-technical-comparison-unified",[229757],{"type":23,"value":229747},{"type":17,"tag":25,"props":229759,"children":229760},{},[],{"type":17,"tag":29,"props":229762,"children":229763},{},[229764],{"type":17,"tag":33,"props":229765,"children":229766},{},[229767],{"type":23,"value":229768},"January 15, 2026",{"type":17,"tag":29,"props":229770,"children":229771},{},[229772],{"type":23,"value":229748},{"type":17,"tag":29,"props":229774,"children":229775},{},[229776,229778,229782],{"type":23,"value":229777},"Every major ad platform — Google Ads, Meta, LinkedIn, TikTok, Amazon — provides a different data model, authentication flow, ",{"type":17,"tag":133,"props":229779,"children":229780},{"href":1857},[229781],{"type":23,"value":1860},{"type":23,"value":229783}," strategy, and rate-limit policy. Even simple tasks like listing campaigns or pulling performance metrics require vendor-specific logic. Writing to those systems is even more complex.",{"type":17,"tag":29,"props":229785,"children":229786},{},[229787],{"type":23,"value":229788},"For product teams, this creates a familiar dilemma:",{"type":17,"tag":80,"props":229790,"children":229791},{},[229792,229797],{"type":17,"tag":84,"props":229793,"children":229794},{},[229795],{"type":23,"value":229796},"Build and maintain direct integrations for each ad platform",{"type":17,"tag":84,"props":229798,"children":229799},{},[229800],{"type":23,"value":229801},"Or limit functionality and only support one or two providers",{"type":17,"tag":29,"props":229803,"children":229804},{},[229805],{"type":23,"value":229806},"As more SaaS products embed advertising data into dashboards, AI features, attribution models, and automation workflows, this approach stops scaling.",{"type":17,"tag":29,"props":229808,"children":229809},{},[229810,229812,229817],{"type":23,"value":229811},"That's where ",{"type":17,"tag":48,"props":229813,"children":229814},{},[229815],{"type":23,"value":229816},"unified advertising APIs",{"type":23,"value":229818}," come in.",{"type":17,"tag":29,"props":229820,"children":229821},{},[229822,229824,229828],{"type":23,"value":229823},"A unified ",{"type":17,"tag":133,"props":229825,"children":229826},{"href":11091},[229827],{"type":23,"value":42135},{"type":23,"value":229829}," promises a single integration layer across multiple ad platforms — abstracting authentication, normalizing core objects like campaigns and ads, and providing a consistent way to access performance data. In theory, this lets teams ship faster and support more platforms with less maintenance.",{"type":17,"tag":29,"props":229831,"children":229832},{},[229833],{"type":23,"value":229834},"In practice, not all unified Ads APIs are built the same way.",{"type":17,"tag":29,"props":229836,"children":229837},{},[229838],{"type":23,"value":229839},"Some platforms focus on full write-level abstraction. Others prioritize real-time data access and passthrough. Some store and sync data. Others fetch directly from the source. These architectural choices have real consequences for accuracy, security, and long-term flexibility.",{"type":17,"tag":29,"props":229841,"children":229842},{},[229843,229845,229850],{"type":23,"value":229844},"In this post, we'll compare the leading unified advertising APIs from a ",{"type":17,"tag":48,"props":229846,"children":229847},{},[229848],{"type":23,"value":229849},"technical perspective",{"type":23,"value":229851}," — including Unified.to, Truto, n₂, and Rutter — and break down where each approach makes sense depending on what you're building.",{"type":17,"tag":11616,"props":229853,"children":229855},{"width":11618,"height":11619,"src":229854,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/fti_0h3tFOg",[],{"type":17,"tag":68,"props":229857,"children":229859},{"id":229858},"what-matters-in-a-unified-ads-api",[229860],{"type":23,"value":229861},"What Matters in a Unified Ads API",{"type":17,"tag":29,"props":229863,"children":229864},{},[229865],{"type":23,"value":229866},"Most comparison pages focus on logos. That's not what breaks production systems. What matters is architecture.",{"type":17,"tag":239,"props":229868,"children":229870},{"id":229869},"read-vs-unified-write",[229871],{"type":23,"value":229872},"Read vs Unified Write",{"type":17,"tag":29,"props":229874,"children":229875},{},[229876],{"type":23,"value":229877},"Some platforms offer full CRUD across campaigns using a normalized schema. Others intentionally avoid write operations and offer passthrough instead.",{"type":17,"tag":29,"props":229879,"children":229880},{},[229881],{"type":23,"value":229882},"This is not a limitation — it's a design choice.",{"type":17,"tag":29,"props":229884,"children":229885},{},[229886],{"type":23,"value":229887},"Unified write introduces abstraction risk: every ad platform evolves differently. Passthrough preserves correctness but shifts responsibility to the product team.",{"type":17,"tag":29,"props":229889,"children":229890},{},[229891],{"type":23,"value":229892},"There is no universally 'better' option — only better alignment with your product.",{"type":17,"tag":239,"props":229894,"children":229896},{"id":229895},"passthrough-vs-opinionated-abstraction",[229897],{"type":23,"value":229898},"Passthrough vs Opinionated Abstraction",{"type":17,"tag":29,"props":229900,"children":229901},{},[229902],{"type":23,"value":229903},"A passthrough API lets you call the underlying Ads API directly while still benefiting from unified auth, connection management, and security.",{"type":17,"tag":29,"props":229905,"children":229906},{},[229907],{"type":23,"value":229908},"An opinionated API hides vendor differences but constrains flexibility.",{"type":17,"tag":29,"props":229910,"children":229911},{},[229912],{"type":23,"value":229913},"If your roadmap includes AI agents, real-time decisioning, or advanced ad workflows, passthrough becomes critical.",{"type":17,"tag":239,"props":229915,"children":229917},{"id":229916},"real-time-vs-stored-data",[229918],{"type":23,"value":229919},"Real-Time vs Stored Data",{"type":17,"tag":29,"props":229921,"children":229922},{},[229923],{"type":23,"value":229924},"Many 'unified' platforms store or sync advertising data.",{"type":17,"tag":29,"props":229926,"children":229927},{},[229928],{"type":23,"value":229929},"That works for dashboards. It breaks AI features, alerts, and user-facing automation.",{"type":17,"tag":29,"props":229931,"children":229932},{},[229933],{"type":23,"value":229934},"Real-time access means every call hits the source system live — no caches, no sync delays.",{"type":17,"tag":68,"props":229936,"children":229938},{"id":229937},"unifiedto-vs-other-unified-ads-apis",[229939],{"type":23,"value":229940},"Unified.to vs Other Unified Ads APIs",{"type":17,"tag":239,"props":229942,"children":229943},{"id":101855},[229944],{"type":23,"value":217},{"type":17,"tag":29,"props":229946,"children":229947},{},[229948],{"type":23,"value":229949},"Unified.to takes a real-time, passthrough-first approach.",{"type":17,"tag":29,"props":229951,"children":229952},{},[229953],{"type":23,"value":229954},"It provides normalized, read-only advertising models for campaigns, ads, and performance — and pairs them with a first-class passthrough API for anything vendor-specific.",{"type":17,"tag":29,"props":229956,"children":229957},{},[229958],{"type":23,"value":229959},"Unified.to does not store advertising data. Every request is fetched live from the source system.",{"type":17,"tag":29,"props":229961,"children":229962},{},[229963],{"type":23,"value":229964},"This design is intentional. It avoids schema drift, eliminates stale data, and keeps compliance risk low.",{"type":17,"tag":29,"props":229966,"children":229967},{},[229968,229973],{"type":17,"tag":48,"props":229969,"children":229970},{},[229971],{"type":23,"value":229972},"Best fit:",{"type":23,"value":229974}," SaaS and AI-native products that need live advertising data without becoming an ad ops platform.",{"type":17,"tag":239,"props":229976,"children":229977},{"id":227114},[229978],{"type":23,"value":8037},{"type":17,"tag":29,"props":229980,"children":229981},{},[229982],{"type":23,"value":229983},"Truto provides a fully unified Ads API with create, update, and delete support across supported platforms.",{"type":17,"tag":29,"props":229985,"children":229986},{},[229987],{"type":23,"value":229988},"This enables deep workflow automation but requires heavier abstraction and stored state.",{"type":17,"tag":29,"props":229990,"children":229991},{},[229992,229996],{"type":17,"tag":48,"props":229993,"children":229994},{},[229995],{"type":23,"value":229972},{"type":23,"value":229997}," Products acting as operational ad management tools.",{"type":17,"tag":239,"props":229999,"children":230001},{"id":230000},"n",[230002],{"type":23,"value":230003},"n₂",{"type":17,"tag":29,"props":230005,"children":230006},{},[230007],{"type":23,"value":230008},"n₂ supports reading via unified models and writing via raw passthrough endpoints.",{"type":17,"tag":29,"props":230010,"children":230011},{},[230012],{"type":23,"value":230013},"This hybrid approach offers flexibility but requires teams to manage more vendor-specific logic.",{"type":17,"tag":29,"props":230015,"children":230016},{},[230017,230021],{"type":17,"tag":48,"props":230018,"children":230019},{},[230020],{"type":23,"value":229972},{"type":23,"value":230022}," Teams with strong ads expertise needing fine-grained control.",{"type":17,"tag":239,"props":230024,"children":230026},{"id":230025},"rutter",[230027],{"type":23,"value":8063},{"type":17,"tag":29,"props":230029,"children":230030},{},[230031],{"type":23,"value":230032},"Rutter markets read/write Ads support, but public documentation shows primarily read-only endpoints.",{"type":17,"tag":29,"props":230034,"children":230035},{},[230036],{"type":23,"value":230037},"Passthrough exists at a field level rather than as a generic raw API.",{"type":17,"tag":29,"props":230039,"children":230040},{},[230041,230045],{"type":17,"tag":48,"props":230042,"children":230043},{},[230044],{"type":23,"value":229972},{"type":23,"value":230046}," Reporting and analytics use cases where write is secondary.",{"type":17,"tag":7231,"props":230048,"children":230049},{},[230050,230083],{"type":17,"tag":7235,"props":230051,"children":230052},{},[230053],{"type":17,"tag":7239,"props":230054,"children":230055},{},[230056,230060,230065,230070,230075,230079],{"type":17,"tag":7243,"props":230057,"children":230058},{},[230059],{"type":23,"value":43242},{"type":17,"tag":7243,"props":230061,"children":230062},{},[230063],{"type":23,"value":230064},"Ads Integrations",{"type":17,"tag":7243,"props":230066,"children":230067},{},[230068],{"type":23,"value":230069},"Passthrough / Raw",{"type":17,"tag":7243,"props":230071,"children":230072},{},[230073],{"type":23,"value":230074},"Data Model",{"type":17,"tag":7243,"props":230076,"children":230077},{},[230078],{"type":23,"value":7359},{"type":17,"tag":7243,"props":230080,"children":230081},{},[230082],{"type":23,"value":43247},{"type":17,"tag":7259,"props":230084,"children":230085},{},[230086,230121,230156,230191],{"type":17,"tag":7239,"props":230087,"children":230088},{},[230089,230096,230101,230106,230111,230116],{"type":17,"tag":7266,"props":230090,"children":230091},{},[230092],{"type":17,"tag":48,"props":230093,"children":230094},{},[230095],{"type":23,"value":217},{"type":17,"tag":7266,"props":230097,"children":230098},{},[230099],{"type":23,"value":230100},"9 (Google, Meta, LinkedIn, TikTok, Amazon, X, etc.)",{"type":17,"tag":7266,"props":230102,"children":230103},{},[230104],{"type":23,"value":230105},"First-class passthrough",{"type":17,"tag":7266,"props":230107,"children":230108},{},[230109],{"type":23,"value":230110},"Normalized",{"type":17,"tag":7266,"props":230112,"children":230113},{},[230114],{"type":23,"value":230115},"Real-time, no storage",{"type":17,"tag":7266,"props":230117,"children":230118},{},[230119],{"type":23,"value":230120},"SaaS + AI products needing live data",{"type":17,"tag":7239,"props":230122,"children":230123},{},[230124,230131,230136,230141,230146,230151],{"type":17,"tag":7266,"props":230125,"children":230126},{},[230127],{"type":17,"tag":48,"props":230128,"children":230129},{},[230130],{"type":23,"value":8037},{"type":17,"tag":7266,"props":230132,"children":230133},{},[230134],{"type":23,"value":230135},"3",{"type":17,"tag":7266,"props":230137,"children":230138},{},[230139],{"type":23,"value":230140},"Partial (proxy/raw params)",{"type":17,"tag":7266,"props":230142,"children":230143},{},[230144],{"type":23,"value":230145},"Opinionated",{"type":17,"tag":7266,"props":230147,"children":230148},{},[230149],{"type":23,"value":230150},"Stored + unified",{"type":17,"tag":7266,"props":230152,"children":230153},{},[230154],{"type":23,"value":230155},"Workflow-heavy ad ops",{"type":17,"tag":7239,"props":230157,"children":230158},{},[230159,230166,230171,230176,230181,230186],{"type":17,"tag":7266,"props":230160,"children":230161},{},[230162],{"type":17,"tag":48,"props":230163,"children":230164},{},[230165],{"type":23,"value":230003},{"type":17,"tag":7266,"props":230167,"children":230168},{},[230169],{"type":23,"value":230170},"5",{"type":17,"tag":7266,"props":230172,"children":230173},{},[230174],{"type":23,"value":230175},"Raw endpoint",{"type":17,"tag":7266,"props":230177,"children":230178},{},[230179],{"type":23,"value":230180},"Semi-unified",{"type":17,"tag":7266,"props":230182,"children":230183},{},[230184],{"type":23,"value":230185},"Mixed",{"type":17,"tag":7266,"props":230187,"children":230188},{},[230189],{"type":23,"value":230190},"Advanced ad manipulation",{"type":17,"tag":7239,"props":230192,"children":230193},{},[230194,230201,230205,230210,230214,230219],{"type":17,"tag":7266,"props":230195,"children":230196},{},[230197],{"type":17,"tag":48,"props":230198,"children":230199},{},[230200],{"type":23,"value":8063},{"type":17,"tag":7266,"props":230202,"children":230203},{},[230204],{"type":23,"value":230135},{"type":17,"tag":7266,"props":230206,"children":230207},{},[230208],{"type":23,"value":230209},"Field-level",{"type":17,"tag":7266,"props":230211,"children":230212},{},[230213],{"type":23,"value":87523},{"type":17,"tag":7266,"props":230215,"children":230216},{},[230217],{"type":23,"value":230218},"Stored",{"type":17,"tag":7266,"props":230220,"children":230221},{},[230222],{"type":23,"value":230223},"Reporting-heavy use cases",{"type":17,"tag":239,"props":230225,"children":230227},{"id":230226},"which-unified-ads-api-is-right-for-you",[230228],{"type":23,"value":230229},"Which Unified Ads API Is Right for You?",{"type":17,"tag":29,"props":230231,"children":230232},{},[230233,230234,230238],{"type":23,"value":44311},{"type":17,"tag":48,"props":230235,"children":230236},{},[230237],{"type":23,"value":217},{"type":23,"value":44317},{"type":17,"tag":80,"props":230240,"children":230241},{},[230242,230247,230252,230257],{"type":17,"tag":84,"props":230243,"children":230244},{},[230245],{"type":23,"value":230246},"You're building a SaaS product, not an ad manager",{"type":17,"tag":84,"props":230248,"children":230249},{},[230250],{"type":23,"value":230251},"You need real-time advertising data",{"type":17,"tag":84,"props":230253,"children":230254},{},[230255],{"type":23,"value":230256},"You want passthrough for AI agents or advanced logic",{"type":17,"tag":84,"props":230258,"children":230259},{},[230260],{"type":23,"value":230261},"You care about security and zero data storage",{"type":17,"tag":29,"props":230263,"children":230264},{},[230265],{"type":17,"tag":48,"props":230266,"children":230267},{},[230268],{"type":23,"value":230269},"Choose a write-first API if:",{"type":17,"tag":80,"props":230271,"children":230272},{},[230273,230278,230283],{"type":17,"tag":84,"props":230274,"children":230275},{},[230276],{"type":23,"value":230277},"Your product directly manages ad spend and campaigns",{"type":17,"tag":84,"props":230279,"children":230280},{},[230281],{"type":23,"value":230282},"You need cross-platform write abstraction",{"type":17,"tag":84,"props":230284,"children":230285},{},[230286],{"type":23,"value":230287},"You accept tighter coupling to the integration layer",{"type":17,"tag":239,"props":230289,"children":230290},{"id":1552},[230291],{"type":23,"value":44411},{"type":17,"tag":29,"props":230293,"children":230294},{},[230295],{"type":23,"value":230296},"There is no single 'best' unified Ads API in isolation.",{"type":17,"tag":29,"props":230298,"children":230299},{},[230300],{"type":23,"value":230301},"The best choice depends on whether you're building:",{"type":17,"tag":80,"props":230303,"children":230304},{},[230305,230309,230314],{"type":17,"tag":84,"props":230306,"children":230307},{},[230308],{"type":23,"value":91320},{"type":17,"tag":84,"props":230310,"children":230311},{},[230312],{"type":23,"value":230313},"Workflows",{"type":17,"tag":84,"props":230315,"children":230316},{},[230317],{"type":23,"value":230318},"Or a managed platform",{"type":17,"tag":29,"props":230320,"children":230321},{},[230322,230324,230329],{"type":23,"value":230323},"Unified.to is designed for ",{"type":17,"tag":48,"props":230325,"children":230326},{},[230327],{"type":23,"value":230328},"product teams",{"type":23,"value":230330}," — not ad operators — who need reliable, real-time access to advertising data without owning the complexity of every Ads API on the market.",{"type":17,"tag":29,"props":230332,"children":230333},{},[230334],{"type":23,"value":230335},"If that's your use case, the architecture matters more than the feature checklist.",{"type":17,"tag":29,"props":230337,"children":230338},{},[230339,230340],{"type":23,"value":1609},{"type":17,"tag":133,"props":230341,"children":230343},{"href":1612,"rel":230342},[214],[230344],{"type":23,"value":1616},{"type":17,"tag":29,"props":230346,"children":230347},{},[230348,230349],{"type":23,"value":1609},{"type":17,"tag":133,"props":230350,"children":230352},{"href":1623,"rel":230351},[214],[230353],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":230355},[230356,230361],{"id":229858,"depth":1629,"text":229861,"children":230357},[230358,230359,230360],{"id":229869,"depth":1635,"text":229872},{"id":229895,"depth":1635,"text":229898},{"id":229916,"depth":1635,"text":229919},{"id":229937,"depth":1629,"text":229940,"children":230362},[230363,230364,230365,230366,230367,230368],{"id":101855,"depth":1635,"text":217},{"id":227114,"depth":1635,"text":8037},{"id":230000,"depth":1635,"text":230003},{"id":230025,"depth":1635,"text":8063},{"id":230226,"depth":1635,"text":230229},{"id":1552,"depth":1635,"text":44411},"content:blog:best_unified_advertising_apis_for_saas_in_2026_technical_comparison_unified.md","blog/best_unified_advertising_apis_for_saas_in_2026_technical_comparison_unified.md","blog/best_unified_advertising_apis_for_saas_in_2026_technical_comparison_unified",{"_path":230373,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":230374,"description":230375,"img":230376,"date":229750,"tag":12,"body":230377,"_type":1677,"_id":231312,"_source":1679,"_file":231313,"_stem":231314,"_extension":1682},"/blog/unified_advertising_api_use_cases_for_saas_analytics_and_ai_products","Unified Advertising API Use Cases for SaaS, Analytics, and AI Products","Advertising is one of the most difficult API categories to support well inside a SaaS product.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_advertising_api_use_cases_for_saas_analytics_and_ai_products-icon.png",{"type":14,"children":230378,"toc":231294},[230379,230384,230387,230394,230398,230403,230408,230423,230434,230446,230450,230456,230468,230473,230496,230506,230524,230542,230548,230560,230565,230593,230598,230604,230609,230658,230663,230669,230675,230683,230688,230693,230698,230716,230727,230750,230755,230761,230768,230773,230778,230783,230801,230806,230812,230819,230824,230829,230833,230856,230861,230867,230874,230879,230884,230889,230907,230912,230918,230925,230930,230935,230953,230965,230971,230978,230983,230988,231006,231011,231017,231022,231095,231100,231106,231117,231122,231140,231144,231167,231173,231178,231183,231205,231210,231216,231221,231244,231249,231262,231266,231271,231276,231285],{"type":17,"tag":18,"props":230380,"children":230382},{"id":230381},"unified-advertising-api-use-cases-for-saas-analytics-and-ai-products",[230383],{"type":23,"value":230374},{"type":17,"tag":25,"props":230385,"children":230386},{},[],{"type":17,"tag":29,"props":230388,"children":230389},{},[230390],{"type":17,"tag":33,"props":230391,"children":230392},{},[230393],{"type":23,"value":229768},{"type":17,"tag":29,"props":230395,"children":230396},{},[230397],{"type":23,"value":230375},{"type":17,"tag":29,"props":230399,"children":230400},{},[230401],{"type":23,"value":230402},"Each major platform — Google Ads, Meta Ads, LinkedIn, TikTok, Amazon — provides its own authentication flows, data models, reporting endpoints, and rate-limit behavior. Even reading campaign performance across platforms requires vendor-specific logic. Writing or managing ads adds another layer of complexity.",{"type":17,"tag":29,"props":230404,"children":230405},{},[230406],{"type":23,"value":230407},"As more SaaS products embed advertising data into dashboards, analytics, AI workflows, and reporting tools, this approach stops scaling.",{"type":17,"tag":29,"props":230409,"children":230410},{},[230411,230413,230421],{"type":23,"value":230412},"That's where a ",{"type":17,"tag":48,"props":230414,"children":230415},{},[230416,230417],{"type":23,"value":86959},{"type":17,"tag":133,"props":230418,"children":230419},{"href":11091},[230420],{"type":23,"value":11094},{"type":23,"value":230422}," comes in.",{"type":17,"tag":29,"props":230424,"children":230425},{},[230426,230428,230432],{"type":23,"value":230427},"Rather than building and maintaining separate integrations for every advertising platform, a unified ",{"type":17,"tag":133,"props":230429,"children":230430},{"href":11091},[230431],{"type":23,"value":42135},{"type":23,"value":230433}," lets product teams integrate once and access campaign data and performance metrics across platforms through a single, consistent interface.",{"type":17,"tag":29,"props":230435,"children":230436},{},[230437,230439,230444],{"type":23,"value":230438},"This post focuses on ",{"type":17,"tag":48,"props":230440,"children":230441},{},[230442],{"type":23,"value":230443},"what you can build",{"type":23,"value":230445}," with a Unified Advertising API — and when it makes sense to use one.",{"type":17,"tag":11616,"props":230447,"children":230449},{"width":11618,"height":11619,"src":230448,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/5dRVlJ03qvI",[],{"type":17,"tag":68,"props":230451,"children":230453},{"id":230452},"what-the-unified-advertising-api-is-and-is-not",[230454],{"type":23,"value":230455},"What the Unified Advertising API Is (and Is Not)",{"type":17,"tag":29,"props":230457,"children":230458},{},[230459,230461,230466],{"type":23,"value":230460},"The Unified Advertising API is designed for ",{"type":17,"tag":48,"props":230462,"children":230463},{},[230464],{"type":23,"value":230465},"products where advertising data is a core dataset",{"type":23,"value":230467}," — not for ad creation or media buying tools.",{"type":17,"tag":29,"props":230469,"children":230470},{},[230471],{"type":23,"value":230472},"It enables teams to:",{"type":17,"tag":80,"props":230474,"children":230475},{},[230476,230481,230486,230491],{"type":17,"tag":84,"props":230477,"children":230478},{},[230479],{"type":23,"value":230480},"Read campaigns, ad groups, ads, and performance metrics",{"type":17,"tag":84,"props":230482,"children":230483},{},[230484],{"type":23,"value":230485},"Generate reports by date range, campaign, or ad",{"type":17,"tag":84,"props":230487,"children":230488},{},[230489],{"type":23,"value":230490},"Compare performance across platforms",{"type":17,"tag":84,"props":230492,"children":230493},{},[230494],{"type":23,"value":230495},"Power analytics, dashboards, and AI systems with consistent ad data",{"type":17,"tag":29,"props":230497,"children":230498},{},[230499,230500,230504],{"type":23,"value":1598},{"type":17,"tag":48,"props":230501,"children":230502},{},[230503],{"type":23,"value":159475},{"type":23,"value":230505}," intended to:",{"type":17,"tag":80,"props":230507,"children":230508},{},[230509,230514,230519],{"type":17,"tag":84,"props":230510,"children":230511},{},[230512],{"type":23,"value":230513},"Create or manage ads",{"type":17,"tag":84,"props":230515,"children":230516},{},[230517],{"type":23,"value":230518},"Handle bidding strategies",{"type":17,"tag":84,"props":230520,"children":230521},{},[230522],{"type":23,"value":230523},"Replace native ad platform tooling",{"type":17,"tag":29,"props":230525,"children":230526},{},[230527,230529,230534,230536,230541],{"type":23,"value":230528},"This distinction matters. Most SaaS products don't need to ",{"type":17,"tag":33,"props":230530,"children":230531},{},[230532],{"type":23,"value":230533},"run",{"type":23,"value":230535}," ads — they need to ",{"type":17,"tag":48,"props":230537,"children":230538},{},[230539],{"type":23,"value":230540},"analyze, report on, and react to advertising performance",{"type":23,"value":54},{"type":17,"tag":68,"props":230543,"children":230545},{"id":230544},"when-advertising-becomes-core-product-data",[230546],{"type":23,"value":230547},"When Advertising Becomes Core Product Data",{"type":17,"tag":29,"props":230549,"children":230550},{},[230551,230553,230558],{"type":23,"value":230552},"A Unified Advertising API makes sense when advertising performance is not a side integration, but a ",{"type":17,"tag":48,"props":230554,"children":230555},{},[230556],{"type":23,"value":230557},"primary data source",{"type":23,"value":230559}," inside your product.",{"type":17,"tag":29,"props":230561,"children":230562},{},[230563],{"type":23,"value":230564},"Typical examples include:",{"type":17,"tag":80,"props":230566,"children":230567},{},[230568,230573,230578,230583,230588],{"type":17,"tag":84,"props":230569,"children":230570},{},[230571],{"type":23,"value":230572},"Marketing analytics platforms",{"type":17,"tag":84,"props":230574,"children":230575},{},[230576],{"type":23,"value":230577},"Attribution and ROI tools",{"type":17,"tag":84,"props":230579,"children":230580},{},[230581],{"type":23,"value":230582},"AI insight engines",{"type":17,"tag":84,"props":230584,"children":230585},{},[230586],{"type":23,"value":230587},"Agency reporting software",{"type":17,"tag":84,"props":230589,"children":230590},{},[230591],{"type":23,"value":230592},"Embedded analytics in SaaS or e-commerce products",{"type":17,"tag":29,"props":230594,"children":230595},{},[230596],{"type":23,"value":230597},"In these cases, ad data behaves more like CRM or financial data: it needs to be reliable, normalized, and available across providers by default.",{"type":17,"tag":68,"props":230599,"children":230601},{"id":230600},"core-advertising-data-objects",[230602],{"type":23,"value":230603},"Core Advertising Data Objects",{"type":17,"tag":29,"props":230605,"children":230606},{},[230607],{"type":23,"value":230608},"The Unified Advertising API provides access to a consistent set of advertising objects across platforms:",{"type":17,"tag":80,"props":230610,"children":230611},{},[230612,230621,230630,230640,230649],{"type":17,"tag":84,"props":230613,"children":230614},{},[230615,230619],{"type":17,"tag":48,"props":230616,"children":230617},{},[230618],{"type":23,"value":41703},{"type":23,"value":230620}," – Advertising accounts and account metadata",{"type":17,"tag":84,"props":230622,"children":230623},{},[230624,230628],{"type":17,"tag":48,"props":230625,"children":230626},{},[230627],{"type":23,"value":41708},{"type":23,"value":230629}," – Campaign configuration, budgets, scheduling, and status",{"type":17,"tag":84,"props":230631,"children":230632},{},[230633,230638],{"type":17,"tag":48,"props":230634,"children":230635},{},[230636],{"type":23,"value":230637},"Groups (Ad Groups)",{"type":23,"value":230639}," – Targeting and configuration at the group level",{"type":17,"tag":84,"props":230641,"children":230642},{},[230643,230647],{"type":17,"tag":48,"props":230644,"children":230645},{},[230646],{"type":23,"value":41733},{"type":23,"value":230648}," – Individual ads, creatives, copy, headlines, CTAs, and URLs",{"type":17,"tag":84,"props":230650,"children":230651},{},[230652,230656],{"type":17,"tag":48,"props":230653,"children":230654},{},[230655],{"type":23,"value":41738},{"type":23,"value":230657}," – Performance metrics such as impressions, clicks, spend, conversions, and other KPIs",{"type":17,"tag":29,"props":230659,"children":230660},{},[230661],{"type":23,"value":230662},"These objects are normalized so product teams can build once and support multiple advertising platforms without rewriting logic per vendor.",{"type":17,"tag":68,"props":230664,"children":230666},{"id":230665},"unified-advertising-api-use-cases",[230667],{"type":23,"value":230668},"Unified Advertising API Use Cases",{"type":17,"tag":239,"props":230670,"children":230672},{"id":230671},"multi-platform-advertising-dashboards",[230673],{"type":23,"value":230674},"Multi-Platform Advertising Dashboards",{"type":17,"tag":29,"props":230676,"children":230677},{},[230678],{"type":17,"tag":48,"props":230679,"children":230680},{},[230681],{"type":23,"value":230682},"Who this is for:",{"type":17,"tag":29,"props":230684,"children":230685},{},[230686],{"type":23,"value":230687},"Analytics SaaS, internal marketing platforms, BI tools",{"type":17,"tag":29,"props":230689,"children":230690},{},[230691],{"type":23,"value":230692},"One of the most common use cases is a unified dashboard showing campaign performance across multiple ad platforms.",{"type":17,"tag":29,"props":230694,"children":230695},{},[230696],{"type":23,"value":230697},"With a Unified Advertising API, teams can:",{"type":17,"tag":80,"props":230699,"children":230700},{},[230701,230706,230711],{"type":17,"tag":84,"props":230702,"children":230703},{},[230704],{"type":23,"value":230705},"Display Google, Meta, and TikTok campaigns side-by-side",{"type":17,"tag":84,"props":230707,"children":230708},{},[230709],{"type":23,"value":230710},"Filter by date range, campaign, or ad",{"type":17,"tag":84,"props":230712,"children":230713},{},[230714],{"type":23,"value":230715},"Compare spend, impressions, clicks, and conversions across platforms",{"type":17,"tag":29,"props":230717,"children":230718},{},[230719,230721,230725],{"type":23,"value":230720},"Without a ",{"type":17,"tag":133,"props":230722,"children":230723},{"href":7691},[230724],{"type":23,"value":7459},{"type":23,"value":230726},", this requires:",{"type":17,"tag":80,"props":230728,"children":230729},{},[230730,230735,230740,230745],{"type":17,"tag":84,"props":230731,"children":230732},{},[230733],{"type":23,"value":230734},"Multiple integrations",{"type":17,"tag":84,"props":230736,"children":230737},{},[230738],{"type":23,"value":230739},"Separate auth flows",{"type":17,"tag":84,"props":230741,"children":230742},{},[230743],{"type":23,"value":230744},"Custom data mapping per provider",{"type":17,"tag":84,"props":230746,"children":230747},{},[230748],{"type":23,"value":230749},"Ongoing maintenance as APIs change",{"type":17,"tag":29,"props":230751,"children":230752},{},[230753],{"type":23,"value":230754},"With a unified Ads API, this becomes a single integration problem.",{"type":17,"tag":239,"props":230756,"children":230758},{"id":230757},"agency-reporting-white-label-analytics",[230759],{"type":23,"value":230760},"Agency Reporting & White-Label Analytics",{"type":17,"tag":29,"props":230762,"children":230763},{},[230764],{"type":17,"tag":48,"props":230765,"children":230766},{},[230767],{"type":23,"value":230682},{"type":17,"tag":29,"props":230769,"children":230770},{},[230771],{"type":23,"value":230772},"Marketing agencies, reporting SaaS, client dashboards",{"type":17,"tag":29,"props":230774,"children":230775},{},[230776],{"type":23,"value":230777},"Agencies rarely control which platforms their clients use. One client may run Google and Meta ads, another TikTok and LinkedIn.",{"type":17,"tag":29,"props":230779,"children":230780},{},[230781],{"type":23,"value":230782},"A Unified Advertising API enables:",{"type":17,"tag":80,"props":230784,"children":230785},{},[230786,230791,230796],{"type":17,"tag":84,"props":230787,"children":230788},{},[230789],{"type":23,"value":230790},"Multi-client reporting across all major platforms",{"type":17,"tag":84,"props":230792,"children":230793},{},[230794],{"type":23,"value":230795},"White-label dashboards",{"type":17,"tag":84,"props":230797,"children":230798},{},[230799],{"type":23,"value":230800},"Consistent reporting without platform-specific code paths",{"type":17,"tag":29,"props":230802,"children":230803},{},[230804],{"type":23,"value":230805},"This allows agencies to build proprietary reporting tools without becoming experts in every Ads API.",{"type":17,"tag":239,"props":230807,"children":230809},{"id":230808},"ai-powered-advertising-analytics-insights",[230810],{"type":23,"value":230811},"AI-Powered Advertising Analytics & Insights",{"type":17,"tag":29,"props":230813,"children":230814},{},[230815],{"type":17,"tag":48,"props":230816,"children":230817},{},[230818],{"type":23,"value":230682},{"type":17,"tag":29,"props":230820,"children":230821},{},[230822],{"type":23,"value":230823},"AI products, insight engines, analytics platforms",{"type":17,"tag":29,"props":230825,"children":230826},{},[230827],{"type":23,"value":230828},"Advertising data is a strong input for AI systems — but only if it's consistent and current.",{"type":17,"tag":29,"props":230830,"children":230831},{},[230832],{"type":23,"value":230697},{"type":17,"tag":80,"props":230834,"children":230835},{},[230836,230841,230846,230851],{"type":17,"tag":84,"props":230837,"children":230838},{},[230839],{"type":23,"value":230840},"Feed normalized campaign data into AI models",{"type":17,"tag":84,"props":230842,"children":230843},{},[230844],{"type":23,"value":230845},"Detect performance trends across platforms",{"type":17,"tag":84,"props":230847,"children":230848},{},[230849],{"type":23,"value":230850},"Generate insights, summaries, and recommendations",{"type":17,"tag":84,"props":230852,"children":230853},{},[230854],{"type":23,"value":230855},"Identify anomalies in spend or conversions",{"type":17,"tag":29,"props":230857,"children":230858},{},[230859],{"type":23,"value":230860},"Real-time access is critical here. Cached or delayed data undermines AI accuracy and trust.",{"type":17,"tag":239,"props":230862,"children":230864},{"id":230863},"cross-platform-reporting-attribution",[230865],{"type":23,"value":230866},"Cross-Platform Reporting & Attribution",{"type":17,"tag":29,"props":230868,"children":230869},{},[230870],{"type":17,"tag":48,"props":230871,"children":230872},{},[230873],{"type":23,"value":230682},{"type":17,"tag":29,"props":230875,"children":230876},{},[230877],{"type":23,"value":230878},"Attribution tools, revenue analytics platforms",{"type":17,"tag":29,"props":230880,"children":230881},{},[230882],{"type":23,"value":230883},"Understanding ROI across channels requires aggregating ad performance from multiple platforms into a single view.",{"type":17,"tag":29,"props":230885,"children":230886},{},[230887],{"type":23,"value":230888},"Unified Advertising APIs make it possible to:",{"type":17,"tag":80,"props":230890,"children":230891},{},[230892,230897,230902],{"type":17,"tag":84,"props":230893,"children":230894},{},[230895],{"type":23,"value":230896},"Aggregate spend and conversions across platforms",{"type":17,"tag":84,"props":230898,"children":230899},{},[230900],{"type":23,"value":230901},"Build cross-channel attribution models",{"type":17,"tag":84,"props":230903,"children":230904},{},[230905],{"type":23,"value":230906},"Join advertising data with CRM, revenue, or product usage data",{"type":17,"tag":29,"props":230908,"children":230909},{},[230910],{"type":23,"value":230911},"This is especially valuable for products that help teams understand marketing effectiveness beyond a single ad network.",{"type":17,"tag":239,"props":230913,"children":230915},{"id":230914},"performance-monitoring-spend-alerts",[230916],{"type":23,"value":230917},"Performance Monitoring & Spend Alerts",{"type":17,"tag":29,"props":230919,"children":230920},{},[230921],{"type":17,"tag":48,"props":230922,"children":230923},{},[230924],{"type":23,"value":230682},{"type":17,"tag":29,"props":230926,"children":230927},{},[230928],{"type":23,"value":230929},"Monitoring tools, internal ops dashboards",{"type":17,"tag":29,"props":230931,"children":230932},{},[230933],{"type":23,"value":230934},"Because advertising spend changes quickly, many teams build monitoring systems that:",{"type":17,"tag":80,"props":230936,"children":230937},{},[230938,230943,230948],{"type":17,"tag":84,"props":230939,"children":230940},{},[230941],{"type":23,"value":230942},"Track campaign performance in real time",{"type":17,"tag":84,"props":230944,"children":230945},{},[230946],{"type":23,"value":230947},"Alert when budgets exceed thresholds",{"type":17,"tag":84,"props":230949,"children":230950},{},[230951],{"type":23,"value":230952},"Detect sudden performance drops or spikes",{"type":17,"tag":29,"props":230954,"children":230955},{},[230956,230958,230963],{"type":23,"value":230957},"A Unified Advertising API allows these systems to monitor ",{"type":17,"tag":48,"props":230959,"children":230960},{},[230961],{"type":23,"value":230962},"all connected ad platforms",{"type":23,"value":230964}," without custom logic per provider.",{"type":17,"tag":239,"props":230966,"children":230968},{"id":230967},"data-warehousing-bi-pipelines",[230969],{"type":23,"value":230970},"Data Warehousing & BI Pipelines",{"type":17,"tag":29,"props":230972,"children":230973},{},[230974],{"type":17,"tag":48,"props":230975,"children":230976},{},[230977],{"type":23,"value":230682},{"type":17,"tag":29,"props":230979,"children":230980},{},[230981],{"type":23,"value":230982},"Data teams, analytics and BI platforms",{"type":17,"tag":29,"props":230984,"children":230985},{},[230986],{"type":23,"value":230987},"Some teams use a Unified Advertising API to feed advertising data into:",{"type":17,"tag":80,"props":230989,"children":230990},{},[230991,230996,231001],{"type":17,"tag":84,"props":230992,"children":230993},{},[230994],{"type":23,"value":230995},"Data warehouses",{"type":17,"tag":84,"props":230997,"children":230998},{},[230999],{"type":23,"value":231000},"BI tools",{"type":17,"tag":84,"props":231002,"children":231003},{},[231004],{"type":23,"value":231005},"Custom analytics pipelines",{"type":17,"tag":29,"props":231007,"children":231008},{},[231009],{"type":23,"value":231010},"The Unified API acts as a real-time data source that can be joined with other business data — without building and maintaining multiple ingestion pipelines.",{"type":17,"tag":68,"props":231012,"children":231014},{"id":231013},"supported-advertising-platforms",[231015],{"type":23,"value":231016},"Supported Advertising Platforms",{"type":17,"tag":29,"props":231018,"children":231019},{},[231020],{"type":23,"value":231021},"The Unified Advertising API supports major advertising platforms, including:",{"type":17,"tag":80,"props":231023,"children":231024},{},[231025,231034,231043,231052,231059,231066,231073,231080,231087],{"type":17,"tag":84,"props":231026,"children":231027},{},[231028,231032],{"type":17,"tag":48,"props":231029,"children":231030},{},[231031],{"type":23,"value":11337},{"type":23,"value":231033}," – Campaigns, ad groups, ads, and performance reports",{"type":17,"tag":84,"props":231035,"children":231036},{},[231037,231041],{"type":17,"tag":48,"props":231038,"children":231039},{},[231040],{"type":23,"value":11332},{"type":23,"value":231042}," – Facebook and Instagram advertising data",{"type":17,"tag":84,"props":231044,"children":231045},{},[231046,231050],{"type":17,"tag":48,"props":231047,"children":231048},{},[231049],{"type":23,"value":11362},{"type":23,"value":231051}," – Campaign and ad performance",{"type":17,"tag":84,"props":231053,"children":231054},{},[231055],{"type":17,"tag":48,"props":231056,"children":231057},{},[231058],{"type":23,"value":11382},{"type":17,"tag":84,"props":231060,"children":231061},{},[231062],{"type":17,"tag":48,"props":231063,"children":231064},{},[231065],{"type":23,"value":11377},{"type":17,"tag":84,"props":231067,"children":231068},{},[231069],{"type":17,"tag":48,"props":231070,"children":231071},{},[231072],{"type":23,"value":11372},{"type":17,"tag":84,"props":231074,"children":231075},{},[231076],{"type":17,"tag":48,"props":231077,"children":231078},{},[231079],{"type":23,"value":11347},{"type":17,"tag":84,"props":231081,"children":231082},{},[231083],{"type":17,"tag":48,"props":231084,"children":231085},{},[231086],{"type":23,"value":40389},{"type":17,"tag":84,"props":231088,"children":231089},{},[231090],{"type":17,"tag":48,"props":231091,"children":231092},{},[231093],{"type":23,"value":231094},"X (Twitter) Ads",{"type":17,"tag":29,"props":231096,"children":231097},{},[231098],{"type":23,"value":231099},"Additional platforms are added based on customer demand.",{"type":17,"tag":68,"props":231101,"children":231103},{"id":231102},"real-time-live-advertising-data",[231104],{"type":23,"value":231105},"Real-Time, Live Advertising Data",{"type":17,"tag":29,"props":231107,"children":231108},{},[231109,231111,231116],{"type":23,"value":231110},"Unlike integration platforms that cache or periodically sync advertising data, the Unified Advertising API provides ",{"type":17,"tag":48,"props":231112,"children":231113},{},[231114],{"type":23,"value":231115},"live access",{"type":23,"value":54},{"type":17,"tag":29,"props":231118,"children":231119},{},[231120],{"type":23,"value":231121},"Every request hits the source platform directly, ensuring:",{"type":17,"tag":80,"props":231123,"children":231124},{},[231125,231130,231135],{"type":17,"tag":84,"props":231126,"children":231127},{},[231128],{"type":23,"value":231129},"Up-to-date campaign status",{"type":17,"tag":84,"props":231131,"children":231132},{},[231133],{"type":23,"value":231134},"Accurate spend and performance metrics",{"type":17,"tag":84,"props":231136,"children":231137},{},[231138],{"type":23,"value":231139},"Reliable inputs for AI and monitoring systems",{"type":17,"tag":29,"props":231141,"children":231142},{},[231143],{"type":23,"value":105738},{"type":17,"tag":80,"props":231145,"children":231146},{},[231147,231152,231157,231162],{"type":17,"tag":84,"props":231148,"children":231149},{},[231150],{"type":23,"value":231151},"AI-driven analytics",{"type":17,"tag":84,"props":231153,"children":231154},{},[231155],{"type":23,"value":231156},"Live dashboards",{"type":17,"tag":84,"props":231158,"children":231159},{},[231160],{"type":23,"value":231161},"Alerting and anomaly detection",{"type":17,"tag":84,"props":231163,"children":231164},{},[231165],{"type":23,"value":231166},"Trust in reporting outputs",{"type":17,"tag":68,"props":231168,"children":231170},{"id":231169},"privacy-and-security-considerations",[231171],{"type":23,"value":231172},"Privacy and Security Considerations",{"type":17,"tag":29,"props":231174,"children":231175},{},[231176],{"type":23,"value":231177},"Advertising data often includes sensitive commercial information.",{"type":17,"tag":29,"props":231179,"children":231180},{},[231181],{"type":23,"value":231182},"Unified.to's architecture is designed to minimize risk:",{"type":17,"tag":80,"props":231184,"children":231185},{},[231186,231191,231196,231201],{"type":17,"tag":84,"props":231187,"children":231188},{},[231189],{"type":23,"value":231190},"No storage of customer advertising data",{"type":17,"tag":84,"props":231192,"children":231193},{},[231194],{"type":23,"value":231195},"Stateless, pass-through requests",{"type":17,"tag":84,"props":231197,"children":231198},{},[231199],{"type":23,"value":231200},"Region-specific routing (US / EU / AU)",{"type":17,"tag":84,"props":231202,"children":231203},{},[231204],{"type":23,"value":218420},{"type":17,"tag":29,"props":231206,"children":231207},{},[231208],{"type":23,"value":231209},"This simplifies compliance reviews and reduces long-term data liability.",{"type":17,"tag":68,"props":231211,"children":231213},{"id":231212},"is-a-unified-advertising-api-right-for-your-product",[231214],{"type":23,"value":231215},"Is a Unified Advertising API Right for Your Product?",{"type":17,"tag":29,"props":231217,"children":231218},{},[231219],{"type":23,"value":231220},"A Unified Advertising API is a strong fit if:",{"type":17,"tag":80,"props":231222,"children":231223},{},[231224,231229,231234,231239],{"type":17,"tag":84,"props":231225,"children":231226},{},[231227],{"type":23,"value":231228},"Advertising performance is core to your product",{"type":17,"tag":84,"props":231230,"children":231231},{},[231232],{"type":23,"value":231233},"You need multi-platform reporting by default",{"type":17,"tag":84,"props":231235,"children":231236},{},[231237],{"type":23,"value":231238},"You're building analytics, AI, or monitoring features",{"type":17,"tag":84,"props":231240,"children":231241},{},[231242],{"type":23,"value":231243},"You want to avoid maintaining multiple Ads integrations",{"type":17,"tag":29,"props":231245,"children":231246},{},[231247],{"type":23,"value":231248},"It may not be the right fit if:",{"type":17,"tag":80,"props":231250,"children":231251},{},[231252,231257],{"type":17,"tag":84,"props":231253,"children":231254},{},[231255],{"type":23,"value":231256},"Your product manages ad creation and bidding directly",{"type":17,"tag":84,"props":231258,"children":231259},{},[231260],{"type":23,"value":231261},"You need deep, platform-specific ad operations",{"type":17,"tag":68,"props":231263,"children":231264},{"id":1552},[231265],{"type":23,"value":44411},{"type":17,"tag":29,"props":231267,"children":231268},{},[231269],{"type":23,"value":231270},"Unified Advertising APIs are not about replacing ad platforms — they're about making advertising data usable inside modern SaaS products.",{"type":17,"tag":29,"props":231272,"children":231273},{},[231274],{"type":23,"value":231275},"If your product treats advertising performance as a core dataset, a unified Ads API can dramatically reduce integration complexity while enabling faster development, better analytics, and more reliable AI features.",{"type":17,"tag":29,"props":231277,"children":231278},{},[231279,231280],{"type":23,"value":1609},{"type":17,"tag":133,"props":231281,"children":231283},{"href":1612,"rel":231282},[214],[231284],{"type":23,"value":1616},{"type":17,"tag":29,"props":231286,"children":231287},{},[231288,231289],{"type":23,"value":1609},{"type":17,"tag":133,"props":231290,"children":231292},{"href":1623,"rel":231291},[214],[231293],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":231295},[231296,231297,231298,231299,231307,231308,231309,231310,231311],{"id":230452,"depth":1629,"text":230455},{"id":230544,"depth":1629,"text":230547},{"id":230600,"depth":1629,"text":230603},{"id":230665,"depth":1629,"text":230668,"children":231300},[231301,231302,231303,231304,231305,231306],{"id":230671,"depth":1635,"text":230674},{"id":230757,"depth":1635,"text":230760},{"id":230808,"depth":1635,"text":230811},{"id":230863,"depth":1635,"text":230866},{"id":230914,"depth":1635,"text":230917},{"id":230967,"depth":1635,"text":230970},{"id":231013,"depth":1629,"text":231016},{"id":231102,"depth":1629,"text":231105},{"id":231169,"depth":1629,"text":231172},{"id":231212,"depth":1629,"text":231215},{"id":1552,"depth":1629,"text":44411},"content:blog:unified_advertising_api_use_cases_for_saas_analytics_and_ai_products.md","blog/unified_advertising_api_use_cases_for_saas_analytics_and_ai_products.md","blog/unified_advertising_api_use_cases_for_saas_analytics_and_ai_products",{"_path":231316,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":231317,"description":231318,"img":231319,"date":231320,"tag":12,"body":231321,"_type":1677,"_id":232156,"_source":1679,"_file":232157,"_stem":232158,"_extension":1682},"/blog/how_to_create_purchase_orders_using_unified_accounting_api","How to Create Purchase Orders Using Unified's Accounting API","Most purchase order features fail before the request is even sent.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_purchase_orders_using_unified_accounting_api-icon.png","2026-01-14T00:00:00.000Z",{"type":14,"children":231322,"toc":232134},[231323,231328,231331,231339,231343,231355,231359,231364,231368,231391,231396,231406,231411,231415,231450,231454,231463,231473,231482,231486,231495,231500,231506,231519,231524,231589,231594,231637,231642,231654,231679,231688,231707,231713,231718,231727,231747,231759,231778,231787,231814,231838,231844,231849,231858,231864,231927,231932,231938,231947,231957,231984,231990,232002,232011,232021,232025,232031,232044,232050,232055,232061,232066,232072,232116,232125],{"type":17,"tag":18,"props":231324,"children":231326},{"id":231325},"how-to-create-purchase-orders-using-unifieds-accounting-api",[231327],{"type":23,"value":231317},{"type":17,"tag":25,"props":231329,"children":231330},{},[],{"type":17,"tag":29,"props":231332,"children":231333},{},[231334],{"type":17,"tag":33,"props":231335,"children":231336},{},[231337],{"type":23,"value":231338},"January 14, 2026",{"type":17,"tag":29,"props":231340,"children":231341},{},[231342],{"type":23,"value":231318},{"type":17,"tag":29,"props":231344,"children":231345},{},[231346,231348,231353],{"type":23,"value":231347},"On paper, creating a purchase order looks trivial. Pick a supplier. Add line items. Send the request. In practice, those steps only work if the accounting system on the other end agrees on what a purchase order ",{"type":17,"tag":33,"props":231349,"children":231350},{},[231351],{"type":23,"value":231352},"is",{"type":23,"value":231354},", which fields are writable, and how line items are modeled.",{"type":17,"tag":29,"props":231356,"children":231357},{},[231358],{"type":23,"value":227711},{"type":17,"tag":29,"props":231360,"children":231361},{},[231362],{"type":23,"value":231363},"Accounting platforms don't treat purchase orders consistently. Some provide full CRUD support. Others surface purchase orders as read-only artifacts generated elsewhere. Even among systems that support creation, required fields, writable properties, and lifecycle behavior vary by provider.",{"type":17,"tag":29,"props":231365,"children":231366},{},[231367],{"type":23,"value":227721},{"type":17,"tag":80,"props":231369,"children":231370},{},[231371,231376,231381,231386],{"type":17,"tag":84,"props":231372,"children":231373},{},[231374],{"type":23,"value":231375},"Can we rely on a single payload shape across providers?",{"type":17,"tag":84,"props":231377,"children":231378},{},[231379],{"type":23,"value":231380},"Do we need vendor-specific logic just to create a PO?",{"type":17,"tag":84,"props":231382,"children":231383},{},[231384],{"type":23,"value":231385},"Which fields are safe to set, and which will be ignored or rejected?",{"type":17,"tag":84,"props":231387,"children":231388},{},[231389],{"type":23,"value":231390},"Can this feature ship broadly, or only to a narrow subset of integrations?",{"type":17,"tag":29,"props":231392,"children":231393},{},[231394],{"type":23,"value":231395},"Many products solve this by hardcoding per-vendor rules or limiting purchase order creation to one or two accounting systems. That works initially, but it doesn't scale.",{"type":17,"tag":29,"props":231397,"children":231398},{},[231399,231400,231404],{"type":23,"value":25244},{"type":17,"tag":133,"props":231401,"children":231402},{"href":82425},[231403],{"type":23,"value":128616},{"type":23,"value":231405}," is designed to remove that constraint. Instead of pushing provider differences into your application logic, Unified normalizes purchase order objects upstream and provides a consistent API surface where write support exists.",{"type":17,"tag":29,"props":231407,"children":231408},{},[231409],{"type":23,"value":231410},"This guide shows how to create purchase orders using that normalized layer—step by step—without branching logic for QuickBooks vs. Xero vs. NetSuite, and without assuming that every provider behaves the same.",{"type":17,"tag":68,"props":231412,"children":231413},{"id":141798},[231414],{"type":23,"value":141801},{"type":17,"tag":80,"props":231416,"children":231417},{},[231418,231422,231426,231431,231440],{"type":17,"tag":84,"props":231419,"children":231420},{},[231421],{"type":23,"value":199683},{"type":17,"tag":84,"props":231423,"children":231424},{},[231425],{"type":23,"value":199688},{"type":17,"tag":84,"props":231427,"children":231428},{},[231429],{"type":23,"value":231430},"An Accounting integration enabled for your customer",{"type":17,"tag":84,"props":231432,"children":231433},{},[231434,231435,231439],{"type":23,"value":199693},{"type":17,"tag":133,"props":231436,"children":231437},{"href":7691},[231438],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":231441,"children":231442},{},[231443,231445],{"type":23,"value":231444},"A customer Accounting ",{"type":17,"tag":6121,"props":231446,"children":231448},{"className":231447},[],[231449],{"type":23,"value":19766},{"type":17,"tag":68,"props":231451,"children":231452},{"id":211198},[231453],{"type":23,"value":211201},{"type":17,"tag":6893,"props":231455,"children":231458},{"className":231456,"code":231457,"language":48432,"meta":7},[48430],"mkdir purchase-order-demo\ncd purchase-order-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[231459],{"type":17,"tag":6121,"props":231460,"children":231461},{"__ignoreMap":7},[231462],{"type":23,"value":231457},{"type":17,"tag":29,"props":231464,"children":231465},{},[231466,231467,231472],{"type":23,"value":211215},{"type":17,"tag":6121,"props":231468,"children":231470},{"className":231469},[],[231471],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":231474,"children":231477},{"className":231475,"code":231476,"language":20901,"meta":23},[20899],"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_ACCOUNTING=your_customer_accounting_connection_id\n",[231478],{"type":17,"tag":6121,"props":231479,"children":231480},{"__ignoreMap":7},[231481],{"type":23,"value":231476},{"type":17,"tag":68,"props":231483,"children":231484},{"id":211235},[231485],{"type":23,"value":211238},{"type":17,"tag":6893,"props":231487,"children":231490},{"className":231488,"code":231489,"language":18718,"meta":7},[18716],"import \"dotenv/config\";\nimport { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nconst { UNIFIED_API_KEY, CONNECTION_ACCOUNTING } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[231491],{"type":17,"tag":6121,"props":231492,"children":231493},{"__ignoreMap":7},[231494],{"type":23,"value":231489},{"type":17,"tag":29,"props":231496,"children":231497},{},[231498],{"type":23,"value":231499},"At this point, you're authenticated and ready to interact with the Accounting and Commerce APIs through a single client.",{"type":17,"tag":68,"props":231501,"children":231503},{"id":231502},"step-3-understand-the-normalized-purchase-order-model-critical",[231504],{"type":23,"value":231505},"Step 3: Understand the normalized Purchase Order model (critical)",{"type":17,"tag":29,"props":231507,"children":231508},{},[231509,231511,231517],{"type":23,"value":231510},"Unified represents purchase orders using the normalized ",{"type":17,"tag":6121,"props":231512,"children":231514},{"className":231513},[],[231515],{"type":23,"value":231516},"AccountingPurchaseorder",{"type":23,"value":231518}," object. Field names are snake_case and consistent across providers.",{"type":17,"tag":29,"props":231520,"children":231521},{},[231522],{"type":23,"value":231523},"At the top level, a purchase order can include:",{"type":17,"tag":80,"props":231525,"children":231526},{},[231527,231537,231547,231557,231579],{"type":17,"tag":84,"props":231528,"children":231529},{},[231530,231535],{"type":17,"tag":6121,"props":231531,"children":231533},{"className":231532},[],[231534],{"type":23,"value":26302},{"type":23,"value":231536}," — the supplier (AccountingContact)",{"type":17,"tag":84,"props":231538,"children":231539},{},[231540,231545],{"type":17,"tag":6121,"props":231541,"children":231543},{"className":231542},[],[231544],{"type":23,"value":184840},{"type":23,"value":231546}," — optional accounting account",{"type":17,"tag":84,"props":231548,"children":231549},{},[231550,231555],{"type":17,"tag":6121,"props":231551,"children":231553},{"className":231552},[],[231554],{"type":23,"value":22296},{"type":23,"value":231556}," — ISO 4217 currency code",{"type":17,"tag":84,"props":231558,"children":231559},{},[231560,231565,231567,231572,231573,231578],{"type":17,"tag":6121,"props":231561,"children":231563},{"className":231562},[],[231564],{"type":23,"value":19949},{"type":23,"value":231566}," — lifecycle state (",{"type":17,"tag":6121,"props":231568,"children":231570},{"className":231569},[],[231571],{"type":23,"value":187870},{"type":23,"value":11826},{"type":17,"tag":6121,"props":231574,"children":231576},{"className":231575},[],[231577],{"type":23,"value":187879},{"type":23,"value":149980},{"type":17,"tag":84,"props":231580,"children":231581},{},[231582,231587],{"type":17,"tag":6121,"props":231583,"children":231585},{"className":231584},[],[231586],{"type":23,"value":219548},{"type":23,"value":231588}," — goods or services being purchased",{"type":17,"tag":29,"props":231590,"children":231591},{},[231592],{"type":23,"value":231593},"Each line item supports:",{"type":17,"tag":80,"props":231595,"children":231596},{},[231597,231602,231613,231632],{"type":17,"tag":84,"props":231598,"children":231599},{},[231600],{"type":23,"value":231601},"quantity and unit price",{"type":17,"tag":84,"props":231603,"children":231604},{},[231605,231607,231612],{"type":23,"value":231606},"optional linkage to a Commerce catalog item (",{"type":17,"tag":6121,"props":231608,"children":231610},{"className":231609},[],[231611],{"type":23,"value":21080},{"type":23,"value":12034},{"type":17,"tag":84,"props":231614,"children":231615},{},[231616,231618,231624,231625,231631],{"type":23,"value":231617},"optional free-text identifiers (",{"type":17,"tag":6121,"props":231619,"children":231621},{"className":231620},[],[231622],{"type":23,"value":231623},"item_name",{"type":23,"value":11826},{"type":17,"tag":6121,"props":231626,"children":231628},{"className":231627},[],[231629],{"type":23,"value":231630},"item_sku",{"type":23,"value":12034},{"type":17,"tag":84,"props":231633,"children":231634},{},[231635],{"type":23,"value":231636},"optional accounting references (account, category, tax rate)",{"type":17,"tag":29,"props":231638,"children":231639},{},[231640],{"type":23,"value":231641},"Unified does not assume which fields are required. Provider-specific constraints are enforced by the integration.",{"type":17,"tag":68,"props":231643,"children":231645},{"id":231644},"step-4-resolve-the-supplier-contact_id",[231646,231648,231653],{"type":23,"value":231647},"Step 4: Resolve the supplier (",{"type":17,"tag":6121,"props":231649,"children":231651},{"className":231650},[],[231652],{"type":23,"value":26302},{"type":23,"value":12034},{"type":17,"tag":29,"props":231655,"children":231656},{},[231657,231659,231664,231666,231671,231672,231678],{"type":23,"value":231658},"Purchase orders typically reference a ",{"type":17,"tag":48,"props":231660,"children":231661},{},[231662],{"type":23,"value":231663},"supplier",{"type":23,"value":231665},", which is an ",{"type":17,"tag":6121,"props":231667,"children":231669},{"className":231668},[],[231670],{"type":23,"value":224013},{"type":23,"value":120761},{"type":17,"tag":6121,"props":231673,"children":231675},{"className":231674},[],[231676],{"type":23,"value":231677},"type = SUPPLIER",{"type":23,"value":54},{"type":17,"tag":6893,"props":231680,"children":231683},{"className":231681,"code":231682,"language":18718,"meta":7},[18716],"const suppliers = await sdk.accounting.listAccountingContacts({\n  connectionId: CONNECTION_ACCOUNTING!,\n  type: \"SUPPLIER\",\n  limit: 50,\n});\n",[231684],{"type":17,"tag":6121,"props":231685,"children":231686},{"__ignoreMap":7},[231687],{"type":23,"value":231682},{"type":17,"tag":29,"props":231689,"children":231690},{},[231691,231693,231698,231700,231706],{"type":23,"value":231692},"Each result includes an ",{"type":17,"tag":6121,"props":231694,"children":231696},{"className":231695},[],[231697],{"type":23,"value":18766},{"type":23,"value":231699},". Select the appropriate one and store it as ",{"type":17,"tag":6121,"props":231701,"children":231703},{"className":231702},[],[231704],{"type":23,"value":231705},"supplierId",{"type":23,"value":54},{"type":17,"tag":68,"props":231708,"children":231710},{"id":231709},"step-5-optional-resolve-an-accounting-account",[231711],{"type":23,"value":231712},"Step 5 (Optional): Resolve an accounting account",{"type":17,"tag":29,"props":231714,"children":231715},{},[231716],{"type":23,"value":231717},"Some providers allow or require purchase orders (or line items) to reference an accounting account.",{"type":17,"tag":6893,"props":231719,"children":231722},{"className":231720,"code":231721,"language":18718,"meta":7},[18716],"const accounts = await sdk.accounting.listAccountingAccounts({\n  connectionId: CONNECTION_ACCOUNTING!,\n  limit: 50,\n});\n",[231723],{"type":17,"tag":6121,"props":231724,"children":231725},{"__ignoreMap":7},[231726],{"type":23,"value":231721},{"type":17,"tag":29,"props":231728,"children":231729},{},[231730,231732,231737,231739,231745],{"type":23,"value":231731},"If your provider supports writable ",{"type":17,"tag":6121,"props":231733,"children":231735},{"className":231734},[],[231736],{"type":23,"value":184840},{"type":23,"value":231738}," on purchase orders or line items, select the relevant ",{"type":17,"tag":6121,"props":231740,"children":231742},{"className":231741},[],[231743],{"type":23,"value":231744},"AccountingAccount.id",{"type":23,"value":231746},". Otherwise, omit it.",{"type":17,"tag":68,"props":231748,"children":231750},{"id":231749},"step-6-recommended-resolve-a-commerce-item-item_id",[231751,231753,231758],{"type":23,"value":231752},"Step 6 (Recommended): Resolve a Commerce item (",{"type":17,"tag":6121,"props":231754,"children":231756},{"className":231755},[],[231757],{"type":23,"value":21080},{"type":23,"value":12034},{"type":17,"tag":29,"props":231760,"children":231761},{},[231762,231764,231770,231771,231776],{"type":23,"value":231763},"Line items can reference a ",{"type":17,"tag":6121,"props":231765,"children":231767},{"className":231766},[],[231768],{"type":23,"value":231769},"CommerceItem",{"type":23,"value":205963},{"type":17,"tag":6121,"props":231772,"children":231774},{"className":231773},[],[231775],{"type":23,"value":21080},{"type":23,"value":231777},". This is the preferred approach when Commerce items are available for the integration.",{"type":17,"tag":6893,"props":231779,"children":231782},{"className":231780,"code":231781,"language":18718,"meta":7},[18716],"const items = await sdk.commerce.listCommerceItems({\n  connectionId: CONNECTION_ACCOUNTING!,\n  limit: 50,\n  query: \"Widget\",\n});\n",[231783],{"type":17,"tag":6121,"props":231784,"children":231785},{"__ignoreMap":7},[231786],{"type":23,"value":231781},{"type":17,"tag":29,"props":231788,"children":231789},{},[231790,231792,231797,231799,231805,231807,231813],{"type":23,"value":231791},"Each result is a ",{"type":17,"tag":6121,"props":231793,"children":231795},{"className":231794},[],[231796],{"type":23,"value":231769},{"type":23,"value":231798},". Use ",{"type":17,"tag":6121,"props":231800,"children":231802},{"className":231801},[],[231803],{"type":23,"value":231804},"item.id",{"type":23,"value":231806}," as ",{"type":17,"tag":6121,"props":231808,"children":231810},{"className":231809},[],[231811],{"type":23,"value":231812},"lineitems[].item_id",{"type":23,"value":54},{"type":17,"tag":29,"props":231815,"children":231816},{},[231817,231819,231823,231825,231830,231831,231836],{"type":23,"value":231818},"If Commerce items are ",{"type":17,"tag":48,"props":231820,"children":231821},{},[231822],{"type":23,"value":159475},{"type":23,"value":231824}," provided for your provider, you can skip this step and use ",{"type":17,"tag":6121,"props":231826,"children":231828},{"className":231827},[],[231829],{"type":23,"value":231623},{"type":23,"value":75890},{"type":17,"tag":6121,"props":231832,"children":231834},{"className":231833},[],[231835],{"type":23,"value":231630},{"type":23,"value":231837}," instead.",{"type":17,"tag":68,"props":231839,"children":231841},{"id":231840},"step-7-build-a-minimum-viable-purchase-order-payload",[231842],{"type":23,"value":231843},"Step 7: Build a minimum viable purchase order payload",{"type":17,"tag":29,"props":231845,"children":231846},{},[231847],{"type":23,"value":231848},"Here's a provider-safe baseline payload that uses only documented fields:",{"type":17,"tag":6893,"props":231850,"children":231853},{"className":231851,"code":231852,"language":18718,"meta":7},[18716],"const purchaseOrder = {\n  contact_id: supplierId,\n  currency: \"USD\",\n  status: \"DRAFT\",\n  lineitems: [\n    {\n      unit_quantity: 2,\n      unit_amount: 49.99,\n\n      // Preferred when Commerce Items are available:\n      item_id: commerceItemId,\n\n      // Fallback if Commerce Items are not exposed:\n      // item_name: \"Widget\",\n      // item_sku: \"WID-001\",\n    },\n  ],\n};\n",[231854],{"type":17,"tag":6121,"props":231855,"children":231856},{"__ignoreMap":7},[231857],{"type":23,"value":231852},{"type":17,"tag":239,"props":231859,"children":231861},{"id":231860},"why-this-payload-works",[231862],{"type":23,"value":231863},"Why this payload works",{"type":17,"tag":80,"props":231865,"children":231866},{},[231867,231872,231877,231914],{"type":17,"tag":84,"props":231868,"children":231869},{},[231870],{"type":23,"value":231871},"All fields are explicitly documented in the data model",{"type":17,"tag":84,"props":231873,"children":231874},{},[231875],{"type":23,"value":231876},"No undocumented required fields are assumed",{"type":17,"tag":84,"props":231878,"children":231879},{},[231880,231882],{"type":23,"value":231881},"Line items support either:",{"type":17,"tag":80,"props":231883,"children":231884},{},[231885,231897],{"type":17,"tag":84,"props":231886,"children":231887},{},[231888,231890,231895],{"type":23,"value":231889},"normalized catalog linkage (",{"type":17,"tag":6121,"props":231891,"children":231893},{"className":231892},[],[231894],{"type":23,"value":21080},{"type":23,"value":231896},"), or",{"type":17,"tag":84,"props":231898,"children":231899},{},[231900,231902,231907,231908,231913],{"type":23,"value":231901},"free-text identifiers (",{"type":17,"tag":6121,"props":231903,"children":231905},{"className":231904},[],[231906],{"type":23,"value":231623},{"type":23,"value":11826},{"type":17,"tag":6121,"props":231909,"children":231911},{"className":231910},[],[231912],{"type":23,"value":231630},{"type":23,"value":12034},{"type":17,"tag":84,"props":231915,"children":231916},{},[231917,231919,231922],{"type":23,"value":231918},"Line-item totals are defined as",{"type":17,"tag":3891,"props":231920,"children":231921},{},[],{"type":17,"tag":6121,"props":231923,"children":231925},{"className":231924},[],[231926],{"type":23,"value":223782},{"type":17,"tag":29,"props":231928,"children":231929},{},[231930],{"type":23,"value":231931},"Provider behavior around validating or computing totals may vary. If you supply totals explicitly, ensure they align with provider expectations.",{"type":17,"tag":68,"props":231933,"children":231935},{"id":231934},"step-8-create-the-purchase-order",[231936],{"type":23,"value":231937},"Step 8: Create the purchase order",{"type":17,"tag":6893,"props":231939,"children":231942},{"className":231940,"code":231941,"language":18718,"meta":7},[18716],"const result = await sdk.accounting.createAccountingPurchaseorder({\n  connectionId: CONNECTION_ACCOUNTING!,\n  accountingPurchaseorder: purchaseOrder,\n});\n",[231943],{"type":17,"tag":6121,"props":231944,"children":231945},{"__ignoreMap":7},[231946],{"type":23,"value":231941},{"type":17,"tag":29,"props":231948,"children":231949},{},[231950,231951,231956],{"type":23,"value":223812},{"type":17,"tag":6121,"props":231952,"children":231954},{"className":231953},[],[231955],{"type":23,"value":231516},{"type":23,"value":107701},{"type":17,"tag":80,"props":231958,"children":231959},{},[231960,231970,231974,231979],{"type":17,"tag":84,"props":231961,"children":231962},{},[231963,231965],{"type":23,"value":231964},"the created ",{"type":17,"tag":6121,"props":231966,"children":231968},{"className":231967},[],[231969],{"type":23,"value":18766},{"type":17,"tag":84,"props":231971,"children":231972},{},[231973],{"type":23,"value":19954},{"type":17,"tag":84,"props":231975,"children":231976},{},[231977],{"type":23,"value":231978},"normalized status",{"type":17,"tag":84,"props":231980,"children":231981},{},[231982],{"type":23,"value":231983},"line items and totals as returned by the provider",{"type":17,"tag":68,"props":231985,"children":231987},{"id":231986},"optional-limit-returned-fields",[231988],{"type":23,"value":231989},"Optional: Limit returned fields",{"type":17,"tag":29,"props":231991,"children":231992},{},[231993,231995,232000],{"type":23,"value":231994},"If you only need a subset of fields, use the ",{"type":17,"tag":6121,"props":231996,"children":231998},{"className":231997},[],[231999],{"type":23,"value":39759},{"type":23,"value":232001}," parameter:",{"type":17,"tag":6893,"props":232003,"children":232006},{"className":232004,"code":232005,"language":18718,"meta":7},[18716],"const result = await sdk.accounting.createAccountingPurchaseorder({\n  connectionId: CONNECTION_ACCOUNTING!,\n  accountingPurchaseorder: purchaseOrder,\n  fields: [\"id\", \"status\", \"total_amount\"],\n});\n",[232007],{"type":17,"tag":6121,"props":232008,"children":232009},{"__ignoreMap":7},[232010],{"type":23,"value":232005},{"type":17,"tag":29,"props":232012,"children":232013},{},[232014,232019],{"type":17,"tag":6121,"props":232015,"children":232017},{"className":232016},[],[232018],{"type":23,"value":39759},{"type":23,"value":232020}," must be an array of strings. Omit it entirely if you don't need filtering.",{"type":17,"tag":68,"props":232022,"children":232023},{"id":228466},[232024],{"type":23,"value":228469},{"type":17,"tag":239,"props":232026,"children":232028},{"id":232027},"write-support-varies",[232029],{"type":23,"value":232030},"Write support varies",{"type":17,"tag":29,"props":232032,"children":232033},{},[232034,232036,232042],{"type":23,"value":232035},"Not all providers support creating purchase orders. Always verify writable support for ",{"type":17,"tag":6121,"props":232037,"children":232039},{"className":232038},[],[232040],{"type":23,"value":232041},"ACCOUNTING PURCHASEORDER",{"type":23,"value":232043}," before enabling this feature.",{"type":17,"tag":239,"props":232045,"children":232047},{"id":232046},"required-fields-vary",[232048],{"type":23,"value":232049},"Required fields vary",{"type":17,"tag":29,"props":232051,"children":232052},{},[232053],{"type":23,"value":232054},"Unified's schema is permissive, but providers may enforce required fields (account, tax rate, etc.). Handle errors gracefully.",{"type":17,"tag":239,"props":232056,"children":232058},{"id":232057},"status-values-may-differ",[232059],{"type":23,"value":232060},"Status values may differ",{"type":17,"tag":29,"props":232062,"children":232063},{},[232064],{"type":23,"value":232065},"Unified documents standard status values, but providers may return additional states. Treat status as an open set.",{"type":17,"tag":68,"props":232067,"children":232069},{"id":232068},"to-create-purchase-orders-with-unified",[232070],{"type":23,"value":232071},"To create purchase orders with Unified:",{"type":17,"tag":6154,"props":232073,"children":232074},{},[232075,232085,232090,232095,232100,232111],{"type":17,"tag":84,"props":232076,"children":232077},{},[232078,232080],{"type":23,"value":232079},"Authenticate and obtain a valid ",{"type":17,"tag":6121,"props":232081,"children":232083},{"className":232082},[],[232084],{"type":23,"value":19766},{"type":17,"tag":84,"props":232086,"children":232087},{},[232088],{"type":23,"value":232089},"Resolve a supplier contact",{"type":17,"tag":84,"props":232091,"children":232092},{},[232093],{"type":23,"value":232094},"Optionally resolve accounts and commerce items",{"type":17,"tag":84,"props":232096,"children":232097},{},[232098],{"type":23,"value":232099},"Build a normalized, minimal payload",{"type":17,"tag":84,"props":232101,"children":232102},{},[232103,232105],{"type":23,"value":232104},"Call ",{"type":17,"tag":6121,"props":232106,"children":232108},{"className":232107},[],[232109],{"type":23,"value":232110},"createAccountingPurchaseorder",{"type":17,"tag":84,"props":232112,"children":232113},{},[232114],{"type":23,"value":232115},"Handle provider-specific constraints",{"type":17,"tag":29,"props":232117,"children":232118},{},[232119,232120],{"type":23,"value":1609},{"type":17,"tag":133,"props":232121,"children":232123},{"href":1612,"rel":232122},[214],[232124],{"type":23,"value":1616},{"type":17,"tag":29,"props":232126,"children":232127},{},[232128,232129],{"type":23,"value":1609},{"type":17,"tag":133,"props":232130,"children":232132},{"href":1623,"rel":232131},[214],[232133],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":232135},[232136,232137,232138,232139,232140,232142,232143,232145,232148,232149,232150,232155],{"id":141798,"depth":1629,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":231502,"depth":1629,"text":231505},{"id":231644,"depth":1629,"text":232141},"Step 4: Resolve the supplier (contact_id)",{"id":231709,"depth":1629,"text":231712},{"id":231749,"depth":1629,"text":232144},"Step 6 (Recommended): Resolve a Commerce item (item_id)",{"id":231840,"depth":1629,"text":231843,"children":232146},[232147],{"id":231860,"depth":1635,"text":231863},{"id":231934,"depth":1629,"text":231937},{"id":231986,"depth":1629,"text":231989},{"id":228466,"depth":1629,"text":228469,"children":232151},[232152,232153,232154],{"id":232027,"depth":1635,"text":232030},{"id":232046,"depth":1635,"text":232049},{"id":232057,"depth":1635,"text":232060},{"id":232068,"depth":1629,"text":232071},"content:blog:how_to_create_purchase_orders_using_unified_accounting_api.md","blog/how_to_create_purchase_orders_using_unified_accounting_api.md","blog/how_to_create_purchase_orders_using_unified_accounting_api",{"_path":232160,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":163611,"description":232161,"img":232162,"date":231320,"tag":12,"body":232163,"_type":1677,"_id":233887,"_source":1679,"_file":233888,"_stem":233889,"_extension":1682},"/blog/how_to_train_ai_with_crm_data_using_unified_crm_api","Training AI on CRM data sounds straightforward. Pull deals, pull contacts, join companies, and turn the result into rows for embeddings or model training.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_train_ai_with_crm_data_using_unified_crm_api-icon.png",{"type":14,"children":232164,"toc":233862},[232165,232170,232173,232180,232184,232189,232194,232199,232209,232220,232225,232266,232271,232275,232300,232304,232313,232323,232331,232335,232343,232349,232354,232364,232369,232555,232565,232570,232774,232784,232789,232933,232944,232949,233003,233013,233018,233174,233185,233190,233315,233321,233326,233374,233379,233388,233394,233412,233421,233427,233432,233454,233459,233468,233473,233505,233517,233523,233528,233537,233543,233561,233591,233600,233605,233611,233616,233651,233656,233665,233670,233696,233702,233707,233716,233722,233727,233769,233774,233780,233793,233839,233844,233853],{"type":17,"tag":18,"props":232166,"children":232168},{"id":232167},"how-to-train-ai-with-crm-data-using-unifieds-crm-api",[232169],{"type":23,"value":163611},{"type":17,"tag":25,"props":232171,"children":232172},{},[],{"type":17,"tag":29,"props":232174,"children":232175},{},[232176],{"type":17,"tag":33,"props":232177,"children":232178},{},[232179],{"type":23,"value":231338},{"type":17,"tag":29,"props":232181,"children":232182},{},[232183],{"type":23,"value":232161},{"type":17,"tag":29,"props":232185,"children":232186},{},[232187],{"type":23,"value":232188},"In practice, this only works if the underlying CRM data is consistent across customers.",{"type":17,"tag":29,"props":232190,"children":232191},{},[232192],{"type":23,"value":232193},"CRMs don't just differ in UI. They model pipelines, stages, ownership, and activity differently. Some systems treat deals as rigid opportunities with fixed stages. Others allow custom pipelines or stage semantics that don't align cleanly. Contacts can appear multiple times. Activities live as notes, tasks, emails, meetings, or page views, each with different structures.",{"type":17,"tag":29,"props":232195,"children":232196},{},[232197],{"type":23,"value":232198},"If you ignore those differences, AI features become fragile. You end up hardcoding assumptions per CRM vendor or quietly dropping fields that don't behave the way you expect.",{"type":17,"tag":29,"props":232200,"children":232201},{},[232202,232203,232207],{"type":23,"value":25244},{"type":17,"tag":133,"props":232204,"children":232205},{"href":61562},[232206],{"type":23,"value":61565},{"type":23,"value":232208}," is designed to remove those constraints by giving you a single, normalized set of CRM objects to build on.",{"type":17,"tag":29,"props":232210,"children":232211},{},[232212,232214,232218],{"type":23,"value":232213},"This normalized layer can power ",{"type":17,"tag":133,"props":232215,"children":232216},{"href":77021},[232217],{"type":23,"value":77024},{"type":23,"value":232219}," (RAG) workflows, where CRM notes, deals, and activity are indexed and retrieved at query time to ground AI outputs in customer history.",{"type":17,"tag":29,"props":232221,"children":232222},{},[232223],{"type":23,"value":232224},"Unified's CRM API is designed to prevent that. Instead of building training logic on vendor-specific objects, you work against a single normalized set of CRM objects:",{"type":17,"tag":80,"props":232226,"children":232227},{},[232228],{"type":17,"tag":84,"props":232229,"children":232230},{},[232231,232236,232237,232242,232243,232248,232249,232254,232255,232260,232261],{"type":17,"tag":6121,"props":232232,"children":232234},{"className":232233},[],[232235],{"type":23,"value":43632},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232238,"children":232240},{"className":232239},[],[232241],{"type":23,"value":43625},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232244,"children":232246},{"className":232245},[],[232247],{"type":23,"value":62420},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232250,"children":232252},{"className":232251},[],[232253],{"type":23,"value":62844},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232256,"children":232258},{"className":232257},[],[232259],{"type":23,"value":62633},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232262,"children":232264},{"className":232263},[],[232265],{"type":23,"value":62746},{"type":17,"tag":29,"props":232267,"children":232268},{},[232269],{"type":23,"value":232270},"This guide shows how to build a training-ready dataset from that normalized layer in TypeScript, using only documented fields, list parameters, and SDK methods. No UI. No dashboards. Just a backend pipeline you can run on a schedule or in response to updated data.",{"type":17,"tag":239,"props":232272,"children":232273},{"id":141798},[232274],{"type":23,"value":141801},{"type":17,"tag":80,"props":232276,"children":232277},{},[232278,232282,232286,232291],{"type":17,"tag":84,"props":232279,"children":232280},{},[232281],{"type":23,"value":199683},{"type":17,"tag":84,"props":232283,"children":232284},{},[232285],{"type":23,"value":211176},{"type":17,"tag":84,"props":232287,"children":232288},{},[232289],{"type":23,"value":232290},"Your Unified API key",{"type":17,"tag":84,"props":232292,"children":232293},{},[232294,232295],{"type":23,"value":211190},{"type":17,"tag":6121,"props":232296,"children":232298},{"className":232297},[],[232299],{"type":23,"value":19766},{"type":17,"tag":68,"props":232301,"children":232302},{"id":211198},[232303],{"type":23,"value":211201},{"type":17,"tag":6893,"props":232305,"children":232308},{"className":232306,"code":232307,"language":48432,"meta":7},[48430],"mkdir crm-ai-training-demo\ncd crm-ai-training-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[232309],{"type":17,"tag":6121,"props":232310,"children":232311},{"__ignoreMap":7},[232312],{"type":23,"value":232307},{"type":17,"tag":29,"props":232314,"children":232315},{},[232316,232317,232322],{"type":23,"value":211215},{"type":17,"tag":6121,"props":232318,"children":232320},{"className":232319},[],[232321],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":232324,"children":232326},{"className":232325,"code":211227,"language":48432,"meta":7},[48430],[232327],{"type":17,"tag":6121,"props":232328,"children":232329},{"__ignoreMap":7},[232330],{"type":23,"value":211227},{"type":17,"tag":68,"props":232332,"children":232333},{"id":211235},[232334],{"type":23,"value":211238},{"type":17,"tag":6893,"props":232336,"children":232338},{"className":232337,"code":211242,"language":18718,"meta":7},[18716],[232339],{"type":17,"tag":6121,"props":232340,"children":232341},{"__ignoreMap":7},[232342],{"type":23,"value":211242},{"type":17,"tag":68,"props":232344,"children":232346},{"id":232345},"step-3-understand-the-normalized-crm-objects-critical",[232347],{"type":23,"value":232348},"Step 3: Understand the normalized CRM objects (critical)",{"type":17,"tag":29,"props":232350,"children":232351},{},[232352],{"type":23,"value":232353},"This guide only uses fields explicitly defined in the CRM data models and list endpoints.",{"type":17,"tag":239,"props":232355,"children":232356},{"id":212137},[232357,232358,232363],{"type":23,"value":212140},{"type":17,"tag":6121,"props":232359,"children":232361},{"className":232360},[],[232362],{"type":23,"value":212146},{"type":23,"value":12034},{"type":17,"tag":29,"props":232365,"children":232366},{},[232367],{"type":23,"value":232368},"Deals are your core training record. Useful fields include:",{"type":17,"tag":80,"props":232370,"children":232371},{},[232372,232380,232396,232404,232414,232424,232434,232444,232458,232472,232480,232489,232505,232515,232525,232535,232545],{"type":17,"tag":84,"props":232373,"children":232374},{},[232375],{"type":17,"tag":6121,"props":232376,"children":232378},{"className":232377},[],[232379],{"type":23,"value":18766},{"type":17,"tag":84,"props":232381,"children":232382},{},[232383,232388,232389,232394],{"type":17,"tag":6121,"props":232384,"children":232386},{"className":232385},[],[232387],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232390,"children":232392},{"className":232391},[],[232393],{"type":23,"value":25337},{"type":23,"value":232395}," (ISO-8601)",{"type":17,"tag":84,"props":232397,"children":232398},{},[232399],{"type":17,"tag":6121,"props":232400,"children":232402},{"className":232401},[],[232403],{"type":23,"value":18781},{"type":17,"tag":84,"props":232405,"children":232406},{},[232407,232412],{"type":17,"tag":6121,"props":232408,"children":232410},{"className":232409},[],[232411],{"type":23,"value":25890},{"type":23,"value":232413}," (number)",{"type":17,"tag":84,"props":232415,"children":232416},{},[232417,232422],{"type":17,"tag":6121,"props":232418,"children":232420},{"className":232419},[],[232421],{"type":23,"value":22296},{"type":23,"value":232423}," (3-letter ISO code)",{"type":17,"tag":84,"props":232425,"children":232426},{},[232427,232432],{"type":17,"tag":6121,"props":232428,"children":232430},{"className":232429},[],[232431],{"type":23,"value":25912},{"type":23,"value":232433}," (expected close datetime)",{"type":17,"tag":84,"props":232435,"children":232436},{},[232437,232442],{"type":17,"tag":6121,"props":232438,"children":232440},{"className":232439},[],[232441],{"type":23,"value":62569},{"type":23,"value":232443}," (actual close datetime)",{"type":17,"tag":84,"props":232445,"children":232446},{},[232447,232452,232453],{"type":17,"tag":6121,"props":232448,"children":232450},{"className":232449},[],[232451],{"type":23,"value":212204},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232454,"children":232456},{"className":232455},[],[232457],{"type":23,"value":25923},{"type":17,"tag":84,"props":232459,"children":232460},{},[232461,232466,232467],{"type":17,"tag":6121,"props":232462,"children":232464},{"className":232463},[],[232465],{"type":23,"value":62844},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232468,"children":232470},{"className":232469},[],[232471],{"type":23,"value":109074},{"type":17,"tag":84,"props":232473,"children":232474},{},[232475],{"type":17,"tag":6121,"props":232476,"children":232478},{"className":232477},[],[232479],{"type":23,"value":62564},{"type":17,"tag":84,"props":232481,"children":232482},{},[232483,232488],{"type":17,"tag":6121,"props":232484,"children":232486},{"className":232485},[],[232487],{"type":23,"value":25901},{"type":23,"value":212250},{"type":17,"tag":84,"props":232490,"children":232491},{},[232492,232498,232499],{"type":17,"tag":6121,"props":232493,"children":232495},{"className":232494},[],[232496],{"type":23,"value":232497},"lost_reason",{"type":23,"value":11826},{"type":17,"tag":6121,"props":232500,"children":232502},{"className":232501},[],[232503],{"type":23,"value":232504},"won_reason",{"type":17,"tag":84,"props":232506,"children":232507},{},[232508,232513],{"type":17,"tag":6121,"props":232509,"children":232511},{"className":232510},[],[232512],{"type":23,"value":62582},{"type":23,"value":232514}," (reference to HrisEmployee)",{"type":17,"tag":84,"props":232516,"children":232517},{},[232518,232523],{"type":17,"tag":6121,"props":232519,"children":232521},{"className":232520},[],[232522],{"type":23,"value":110157},{"type":23,"value":232524}," (references to CrmContact)",{"type":17,"tag":84,"props":232526,"children":232527},{},[232528,232533],{"type":17,"tag":6121,"props":232529,"children":232531},{"className":232530},[],[232532],{"type":23,"value":110146},{"type":23,"value":232534}," (references to CrmCompany)",{"type":17,"tag":84,"props":232536,"children":232537},{},[232538,232543],{"type":17,"tag":6121,"props":232539,"children":232541},{"className":232540},[],[232542],{"type":23,"value":133378},{"type":23,"value":232544}," (structured custom fields)",{"type":17,"tag":84,"props":232546,"children":232547},{},[232548,232553],{"type":17,"tag":6121,"props":232549,"children":232551},{"className":232550},[],[232552],{"type":23,"value":62389},{"type":23,"value":232554}," (vendor-native payload)",{"type":17,"tag":239,"props":232556,"children":232557},{"id":211261},[232558,232559,232564],{"type":23,"value":211264},{"type":17,"tag":6121,"props":232560,"children":232562},{"className":232561},[],[232563],{"type":23,"value":211270},{"type":23,"value":12034},{"type":17,"tag":29,"props":232566,"children":232567},{},[232568],{"type":23,"value":232569},"Contacts give person-level context:",{"type":17,"tag":80,"props":232571,"children":232572},{},[232573,232593,232631,232641,232674,232718,232732,232742,232750,232758,232766],{"type":17,"tag":84,"props":232574,"children":232575},{},[232576,232581,232582,232587,232588],{"type":17,"tag":6121,"props":232577,"children":232579},{"className":232578},[],[232580],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232583,"children":232585},{"className":232584},[],[232586],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232589,"children":232591},{"className":232590},[],[232592],{"type":23,"value":25337},{"type":17,"tag":84,"props":232594,"children":232595},{},[232596,232601,232602,232607,232608,232613,232614,232619,232620,232625,232626],{"type":17,"tag":6121,"props":232597,"children":232599},{"className":232598},[],[232600],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232603,"children":232605},{"className":232604},[],[232606],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232609,"children":232611},{"className":232610},[],[232612],{"type":23,"value":62341},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232615,"children":232617},{"className":232616},[],[232618],{"type":23,"value":62346},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232621,"children":232623},{"className":232622},[],[232624],{"type":23,"value":62375},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232627,"children":232629},{"className":232628},[],[232630],{"type":23,"value":62380},{"type":17,"tag":84,"props":232632,"children":232633},{},[232634,232639],{"type":17,"tag":6121,"props":232635,"children":232637},{"className":232636},[],[232638],{"type":23,"value":62420},{"type":23,"value":232640}," (organization name string)",{"type":17,"tag":84,"props":232642,"children":232643},{},[232644,232649,232650,232655,232657,232662,232663,232668,232669],{"type":17,"tag":6121,"props":232645,"children":232647},{"className":232646},[],[232648],{"type":23,"value":133312},{"type":23,"value":120761},{"type":17,"tag":6121,"props":232651,"children":232653},{"className":232652},[],[232654],{"type":23,"value":27310},{"type":23,"value":232656}," enum: ",{"type":17,"tag":6121,"props":232658,"children":232660},{"className":232659},[],[232661],{"type":23,"value":211348},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232664,"children":232666},{"className":232665},[],[232667],{"type":23,"value":211355},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232670,"children":232672},{"className":232671},[],[232673],{"type":23,"value":149660},{"type":17,"tag":84,"props":232675,"children":232676},{},[232677,232682,232683,232688,232689,232694,232695,232700,232701,232706,232707,232712,232713],{"type":17,"tag":6121,"props":232678,"children":232680},{"className":232679},[],[232681],{"type":23,"value":133321},{"type":23,"value":120761},{"type":17,"tag":6121,"props":232684,"children":232686},{"className":232685},[],[232687],{"type":23,"value":27310},{"type":23,"value":232656},{"type":17,"tag":6121,"props":232690,"children":232692},{"className":232691},[],[232693],{"type":23,"value":211348},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232696,"children":232698},{"className":232697},[],[232699],{"type":23,"value":211355},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232702,"children":232704},{"className":232703},[],[232705],{"type":23,"value":149660},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232708,"children":232710},{"className":232709},[],[232711],{"type":23,"value":211401},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232714,"children":232716},{"className":232715},[],[232717],{"type":23,"value":211408},{"type":17,"tag":84,"props":232719,"children":232720},{},[232721,232726,232727],{"type":17,"tag":6121,"props":232722,"children":232724},{"className":232723},[],[232725],{"type":23,"value":110168},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232728,"children":232730},{"className":232729},[],[232731],{"type":23,"value":110146},{"type":17,"tag":84,"props":232733,"children":232734},{},[232735,232740],{"type":17,"tag":6121,"props":232736,"children":232738},{"className":232737},[],[232739],{"type":23,"value":62370},{"type":23,"value":232741}," (structured)",{"type":17,"tag":84,"props":232743,"children":232744},{},[232745],{"type":17,"tag":6121,"props":232746,"children":232748},{"className":232747},[],[232749],{"type":23,"value":62582},{"type":17,"tag":84,"props":232751,"children":232752},{},[232753],{"type":17,"tag":6121,"props":232754,"children":232756},{"className":232755},[],[232757],{"type":23,"value":133330},{"type":17,"tag":84,"props":232759,"children":232760},{},[232761],{"type":17,"tag":6121,"props":232762,"children":232764},{"className":232763},[],[232765],{"type":23,"value":133378},{"type":17,"tag":84,"props":232767,"children":232768},{},[232769],{"type":17,"tag":6121,"props":232770,"children":232772},{"className":232771},[],[232773],{"type":23,"value":62389},{"type":17,"tag":239,"props":232775,"children":232776},{"id":211471},[232777,232778,232783],{"type":23,"value":206906},{"type":17,"tag":6121,"props":232779,"children":232781},{"className":232780},[],[232782],{"type":23,"value":211479},{"type":23,"value":12034},{"type":17,"tag":29,"props":232785,"children":232786},{},[232787],{"type":23,"value":232788},"Companies give firmographic context:",{"type":17,"tag":80,"props":232790,"children":232791},{},[232792,232818,232832,232853,232861,232875,232901,232909,232917,232925],{"type":17,"tag":84,"props":232793,"children":232794},{},[232795,232800,232801,232806,232807,232812,232813],{"type":17,"tag":6121,"props":232796,"children":232798},{"className":232797},[],[232799],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232802,"children":232804},{"className":232803},[],[232805],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232808,"children":232810},{"className":232809},[],[232811],{"type":23,"value":25337},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232814,"children":232816},{"className":232815},[],[232817],{"type":23,"value":18781},{"type":17,"tag":84,"props":232819,"children":232820},{},[232821,232826,232827],{"type":17,"tag":6121,"props":232822,"children":232824},{"className":232823},[],[232825],{"type":23,"value":110168},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232828,"children":232830},{"className":232829},[],[232831],{"type":23,"value":110157},{"type":17,"tag":84,"props":232833,"children":232834},{},[232835,232840,232841,232846,232847],{"type":17,"tag":6121,"props":232836,"children":232838},{"className":232837},[],[232839],{"type":23,"value":133312},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232842,"children":232844},{"className":232843},[],[232845],{"type":23,"value":133321},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232848,"children":232850},{"className":232849},[],[232851],{"type":23,"value":232852},"websites[]",{"type":17,"tag":84,"props":232854,"children":232855},{},[232856],{"type":17,"tag":6121,"props":232857,"children":232859},{"className":232858},[],[232860],{"type":23,"value":62370},{"type":17,"tag":84,"props":232862,"children":232863},{},[232864,232869,232870],{"type":17,"tag":6121,"props":232865,"children":232867},{"className":232866},[],[232868],{"type":23,"value":62868},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232871,"children":232873},{"className":232872},[],[232874],{"type":23,"value":133369},{"type":17,"tag":84,"props":232876,"children":232877},{},[232878,232883,232884,232889,232890,232895,232896],{"type":17,"tag":6121,"props":232879,"children":232881},{"className":232880},[],[232882],{"type":23,"value":24679},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232885,"children":232887},{"className":232886},[],[232888],{"type":23,"value":50783},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232891,"children":232893},{"className":232892},[],[232894],{"type":23,"value":62469},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232897,"children":232899},{"className":232898},[],[232900],{"type":23,"value":22305},{"type":17,"tag":84,"props":232902,"children":232903},{},[232904],{"type":17,"tag":6121,"props":232905,"children":232907},{"className":232906},[],[232908],{"type":23,"value":211547},{"type":17,"tag":84,"props":232910,"children":232911},{},[232912],{"type":17,"tag":6121,"props":232913,"children":232915},{"className":232914},[],[232916],{"type":23,"value":62582},{"type":17,"tag":84,"props":232918,"children":232919},{},[232920],{"type":17,"tag":6121,"props":232921,"children":232923},{"className":232922},[],[232924],{"type":23,"value":133378},{"type":17,"tag":84,"props":232926,"children":232927},{},[232928],{"type":17,"tag":6121,"props":232929,"children":232931},{"className":232930},[],[232932],{"type":23,"value":62389},{"type":17,"tag":239,"props":232934,"children":232936},{"id":232935},"pipelines-crmpipeline-optional",[232937,232938,232943],{"type":23,"value":212313},{"type":17,"tag":6121,"props":232939,"children":232941},{"className":232940},[],[232942],{"type":23,"value":212319},{"type":23,"value":212409},{"type":17,"tag":29,"props":232945,"children":232946},{},[232947],{"type":23,"value":232948},"Use pipelines if you need stage metadata:",{"type":17,"tag":80,"props":232950,"children":232951},{},[232952],{"type":17,"tag":84,"props":232953,"children":232954},{},[232955,232960,232962],{"type":17,"tag":6121,"props":232956,"children":232958},{"className":232957},[],[232959],{"type":23,"value":212337},{"type":23,"value":232961}," where each stage includes:\n",{"type":17,"tag":80,"props":232963,"children":232964},{},[232965],{"type":17,"tag":84,"props":232966,"children":232967},{},[232968,232973,232974,232979,232980,232985,232986,232991,232992,232997,232998],{"type":17,"tag":6121,"props":232969,"children":232971},{"className":232970},[],[232972],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232975,"children":232977},{"className":232976},[],[232978],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232981,"children":232983},{"className":232982},[],[232984],{"type":23,"value":174606},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232987,"children":232989},{"className":232988},[],[232990],{"type":23,"value":62873},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232993,"children":232995},{"className":232994},[],[232996],{"type":23,"value":212374},{"type":23,"value":11826},{"type":17,"tag":6121,"props":232999,"children":233001},{"className":233000},[],[233002],{"type":23,"value":62878},{"type":17,"tag":239,"props":233004,"children":233005},{"id":212398},[233006,233007,233012],{"type":23,"value":212401},{"type":17,"tag":6121,"props":233008,"children":233010},{"className":233009},[],[233011],{"type":23,"value":212407},{"type":23,"value":212409},{"type":17,"tag":29,"props":233014,"children":233015},{},[233016],{"type":23,"value":233017},"Events represent activity and engagement:",{"type":17,"tag":80,"props":233019,"children":233020},{},[233021,233077,233130,233158,233166],{"type":17,"tag":84,"props":233022,"children":233023},{},[233024,233029,233030,233035,233036,233041,233042,233047,233048,233053,233054,233059,233060,233065,233066,233071,233072],{"type":17,"tag":6121,"props":233025,"children":233027},{"className":233026},[],[233028],{"type":23,"value":27310},{"type":23,"value":232656},{"type":17,"tag":6121,"props":233031,"children":233033},{"className":233032},[],[233034],{"type":23,"value":27047},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233037,"children":233039},{"className":233038},[],[233040],{"type":23,"value":27052},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233043,"children":233045},{"className":233044},[],[233046],{"type":23,"value":27067},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233049,"children":233051},{"className":233050},[],[233052],{"type":23,"value":27062},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233055,"children":233057},{"className":233056},[],[233058],{"type":23,"value":27057},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233061,"children":233063},{"className":233062},[],[233064],{"type":23,"value":118690},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233067,"children":233069},{"className":233068},[],[233070],{"type":23,"value":118700},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233073,"children":233075},{"className":233074},[],[233076],{"type":23,"value":118710},{"type":17,"tag":84,"props":233078,"children":233079},{},[233080,233082,233087,233088,233093,233094,233099,233100,233105,233106,233111,233112,233117,233118,233123,233124,233129],{"type":23,"value":233081},"Nested objects vary by type (",{"type":17,"tag":6121,"props":233083,"children":233085},{"className":233084},[],[233086],{"type":23,"value":62656},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233089,"children":233091},{"className":233090},[],[233092],{"type":23,"value":62661},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233095,"children":233097},{"className":233096},[],[233098],{"type":23,"value":62666},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233101,"children":233103},{"className":233102},[],[233104],{"type":23,"value":62671},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233107,"children":233109},{"className":233108},[],[233110],{"type":23,"value":62676},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233113,"children":233115},{"className":233114},[],[233116],{"type":23,"value":62681},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233119,"children":233121},{"className":233120},[],[233122],{"type":23,"value":62686},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233125,"children":233127},{"className":233126},[],[233128],{"type":23,"value":62691},{"type":23,"value":12034},{"type":17,"tag":84,"props":233131,"children":233132},{},[233133,233135,233140,233141,233146,233147,233152,233153],{"type":23,"value":233134},"Relationship arrays: ",{"type":17,"tag":6121,"props":233136,"children":233138},{"className":233137},[],[233139],{"type":23,"value":110168},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233142,"children":233144},{"className":233143},[],[233145],{"type":23,"value":110146},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233148,"children":233150},{"className":233149},[],[233151],{"type":23,"value":110157},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233154,"children":233156},{"className":233155},[],[233157],{"type":23,"value":213182},{"type":17,"tag":84,"props":233159,"children":233160},{},[233161],{"type":17,"tag":6121,"props":233162,"children":233164},{"className":233163},[],[233165],{"type":23,"value":62582},{"type":17,"tag":84,"props":233167,"children":233168},{},[233169],{"type":17,"tag":6121,"props":233170,"children":233172},{"className":233171},[],[233173],{"type":23,"value":62389},{"type":17,"tag":239,"props":233175,"children":233177},{"id":233176},"leads-crmlead-optional",[233178,233179,233184],{"type":23,"value":214108},{"type":17,"tag":6121,"props":233180,"children":233182},{"className":233181},[],[233183],{"type":23,"value":214114},{"type":23,"value":212409},{"type":17,"tag":29,"props":233186,"children":233187},{},[233188],{"type":23,"value":233189},"Leads are top-of-funnel records:",{"type":17,"tag":80,"props":233191,"children":233192},{},[233193,233231,233251,233265,233279,233299,233307],{"type":17,"tag":84,"props":233194,"children":233195},{},[233196,233201,233202,233207,233208,233213,233214,233219,233220,233225,233226],{"type":17,"tag":6121,"props":233197,"children":233199},{"className":233198},[],[233200],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233203,"children":233205},{"className":233204},[],[233206],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233209,"children":233211},{"className":233210},[],[233212],{"type":23,"value":25337},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233215,"children":233217},{"className":233216},[],[233218],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233221,"children":233223},{"className":233222},[],[233224],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233227,"children":233229},{"className":233228},[],[233230],{"type":23,"value":62341},{"type":17,"tag":84,"props":233232,"children":233233},{},[233234,233239,233240,233245,233246],{"type":17,"tag":6121,"props":233235,"children":233237},{"className":233236},[],[233238],{"type":23,"value":27299},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233241,"children":233243},{"className":233242},[],[233244],{"type":23,"value":26302},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233247,"children":233249},{"className":233248},[],[233250],{"type":23,"value":62786},{"type":17,"tag":84,"props":233252,"children":233253},{},[233254,233259,233260],{"type":17,"tag":6121,"props":233255,"children":233257},{"className":233256},[],[233258],{"type":23,"value":62564},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233261,"children":233263},{"className":233262},[],[233264],{"type":23,"value":19949},{"type":17,"tag":84,"props":233266,"children":233267},{},[233268,233273,233274],{"type":17,"tag":6121,"props":233269,"children":233271},{"className":233270},[],[233272],{"type":23,"value":62582},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233275,"children":233277},{"className":233276},[],[233278],{"type":23,"value":124757},{"type":17,"tag":84,"props":233280,"children":233281},{},[233282,233287,233288,233293,233294],{"type":17,"tag":6121,"props":233283,"children":233285},{"className":233284},[],[233286],{"type":23,"value":133312},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233289,"children":233291},{"className":233290},[],[233292],{"type":23,"value":133321},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233295,"children":233297},{"className":233296},[],[233298],{"type":23,"value":133330},{"type":17,"tag":84,"props":233300,"children":233301},{},[233302],{"type":17,"tag":6121,"props":233303,"children":233305},{"className":233304},[],[233306],{"type":23,"value":133378},{"type":17,"tag":84,"props":233308,"children":233309},{},[233310],{"type":17,"tag":6121,"props":233311,"children":233313},{"className":233312},[],[233314],{"type":23,"value":62389},{"type":17,"tag":68,"props":233316,"children":233318},{"id":233317},"step-4-build-reliable-list-fetchers-pagination-incremental-pulls",[233319],{"type":23,"value":233320},"Step 4: Build reliable list fetchers (pagination + incremental pulls)",{"type":17,"tag":29,"props":233322,"children":233323},{},[233324],{"type":23,"value":233325},"All list endpoints share the same pagination approach:",{"type":17,"tag":80,"props":233327,"children":233328},{},[233329,233339,233348,233358,233369],{"type":17,"tag":84,"props":233330,"children":233331},{},[233332,233337],{"type":17,"tag":6121,"props":233333,"children":233335},{"className":233334},[],[233336],{"type":23,"value":48389},{"type":23,"value":233338}," default 100 (and typically cannot exceed 100)",{"type":17,"tag":84,"props":233340,"children":233341},{},[233342,233347],{"type":17,"tag":6121,"props":233343,"children":233345},{"className":233344},[],[233346],{"type":23,"value":48411},{"type":23,"value":211642},{"type":17,"tag":84,"props":233349,"children":233350},{},[233351,233353],{"type":23,"value":233352},"You know you're done when returned results \u003C requested ",{"type":17,"tag":6121,"props":233354,"children":233356},{"className":233355},[],[233357],{"type":23,"value":48389},{"type":17,"tag":84,"props":233359,"children":233360},{},[233361,233363,233368],{"type":23,"value":233362},"Incremental pulls use ",{"type":17,"tag":6121,"props":233364,"children":233366},{"className":233365},[],[233367],{"type":23,"value":26291},{"type":23,"value":232395},{"type":17,"tag":84,"props":233370,"children":233371},{},[233372],{"type":23,"value":233373},"Some integrations may not support every parameter; verify per-integration feature support in the dashboard",{"type":17,"tag":29,"props":233375,"children":233376},{},[233377],{"type":23,"value":233378},"Below are safe, backend-only helpers for deals, contacts, and companies.",{"type":17,"tag":6893,"props":233380,"children":233383},{"className":233381,"code":233382,"language":18718,"meta":7},[18716],"type Sort = \"name\" | \"updated_at\" | \"created_at\";\ntype Order = \"asc\" | \"desc\";\n\ntype ListBaseOpts = {\n  pageSize?: number;\n  updated_gte?: string;\n  sort?: Sort;\n  order?: Order;\n  query?: string;\n  fields?: string;\n  raw?: string;\n};\n\nasync function fetchAllDeals(\n  opts?: ListBaseOpts & {\n    company_id?: string;\n    contact_id?: string;\n    user_id?: string;\n    pipeline_id?: string;\n  }\n) {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmDeals({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte ?? \"\",\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      company_id: opts?.company_id ?? \"\",\n      contact_id: opts?.contact_id ?? \"\",\n      user_id: opts?.user_id ?? \"\",\n      pipeline_id: opts?.pipeline_id ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    if (page.length \u003C pageSize) break;\n    offset += pageSize;\n  }\n\n  return out;\n}\n\nasync function fetchAllContacts(\n  opts?: ListBaseOpts & {\n    company_id?: string;\n    deal_id?: string;\n    user_id?: string;\n  }\n) {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmContacts({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte ?? \"\",\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      company_id: opts?.company_id ?? \"\",\n      deal_id: opts?.deal_id ?? \"\",\n      user_id: opts?.user_id ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    if (page.length \u003C pageSize) break;\n    offset += pageSize;\n  }\n\n  return out;\n}\n\nasync function fetchAllCompanies(\n  opts?: ListBaseOpts & {\n    deal_id?: string;\n    contact_id?: string;\n    user_id?: string;\n  }\n) {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmCompanies({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte ?? \"\",\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      deal_id: opts?.deal_id ?? \"\",\n      contact_id: opts?.contact_id ?? \"\",\n      user_id: opts?.user_id ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    if (page.length \u003C pageSize) break;\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[233384],{"type":17,"tag":6121,"props":233385,"children":233386},{"__ignoreMap":7},[233387],{"type":23,"value":233382},{"type":17,"tag":68,"props":233389,"children":233391},{"id":233390},"step-5-index-contacts-and-companies-for-joins",[233392],{"type":23,"value":233393},"Step 5: Index contacts and companies for joins",{"type":17,"tag":29,"props":233395,"children":233396},{},[233397,233399,233404,233405,233410],{"type":23,"value":233398},"Deals link to contacts and companies via ID arrays (",{"type":17,"tag":6121,"props":233400,"children":233402},{"className":233401},[],[233403],{"type":23,"value":110157},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233406,"children":233408},{"className":233407},[],[233409],{"type":23,"value":110146},{"type":23,"value":233411},"). Build lookup tables so joins are deterministic.",{"type":17,"tag":6893,"props":233413,"children":233416},{"className":233414,"code":233415,"language":18718,"meta":7},[18716],"function indexById\u003CT extends { id?: string }>(rows: T[]): Record\u003Cstring, T> {\n  const out: Record\u003Cstring, T> = {};\n  for (const r of rows) {\n    if (!r.id) continue;\n    out[r.id] = r;\n  }\n  return out;\n}\n",[233417],{"type":17,"tag":6121,"props":233418,"children":233419},{"__ignoreMap":7},[233420],{"type":23,"value":233415},{"type":17,"tag":68,"props":233422,"children":233424},{"id":233423},"step-6-decide-what-your-training-row-is",[233425],{"type":23,"value":233426},"Step 6: Decide what your 'training row' is",{"type":17,"tag":29,"props":233428,"children":233429},{},[233430],{"type":23,"value":233431},"A training row should be:",{"type":17,"tag":80,"props":233433,"children":233434},{},[233435,233439,233444,233449],{"type":17,"tag":84,"props":233436,"children":233437},{},[233438],{"type":23,"value":211735},{"type":17,"tag":84,"props":233440,"children":233441},{},[233442],{"type":23,"value":233443},"stable across runs",{"type":17,"tag":84,"props":233445,"children":233446},{},[233447],{"type":23,"value":233448},"based on fields that exist in the normalized schema",{"type":17,"tag":84,"props":233450,"children":233451},{},[233452],{"type":23,"value":233453},"explicit about missingness",{"type":17,"tag":29,"props":233455,"children":233456},{},[233457],{"type":23,"value":233458},"Below is a conservative row shape that stays within documented fields.",{"type":17,"tag":6893,"props":233460,"children":233463},{"className":233461,"code":233462,"language":18718,"meta":7},[18716],"type TrainingRow = {\n  deal_id: string;\n\n  deal_created_at?: string;\n  deal_updated_at?: string;\n\n  amount?: number;\n  currency?: string;\n\n  pipeline?: string;\n  pipeline_id?: string;\n  stage?: string;\n  stage_id?: string;\n\n  closing_at?: string;\n  closed_at?: string;\n\n  probability?: number;\n  source?: string;\n\n  owner_user_id?: string;\n\n  contact_count: number;\n  company_count: number;\n\n  primary_contact_id?: string;\n  primary_contact_title?: string;\n  primary_contact_department?: string;\n  primary_contact_email_type?: string;\n\n  primary_company_id?: string;\n  primary_company_industry?: string;\n  primary_company_employees?: number;\n  primary_company_is_active?: boolean;\n  primary_company_timezone?: string;\n\n  label?: \"CLOSED\" | \"OPEN\";\n};\n",[233464],{"type":17,"tag":6121,"props":233465,"children":233466},{"__ignoreMap":7},[233467],{"type":23,"value":233462},{"type":17,"tag":29,"props":233469,"children":233470},{},[233471],{"type":23,"value":233472},"Note: This uses a simple label definition:",{"type":17,"tag":80,"props":233474,"children":233475},{},[233476,233494],{"type":17,"tag":84,"props":233477,"children":233478},{},[233479,233485,233487,233492],{"type":17,"tag":6121,"props":233480,"children":233482},{"className":233481},[],[233483],{"type":23,"value":233484},"label = \"CLOSED\"",{"type":23,"value":233486}," when ",{"type":17,"tag":6121,"props":233488,"children":233490},{"className":233489},[],[233491],{"type":23,"value":62569},{"type":23,"value":233493}," exists",{"type":17,"tag":84,"props":233495,"children":233496},{},[233497,233499],{"type":23,"value":233498},"otherwise ",{"type":17,"tag":6121,"props":233500,"children":233502},{"className":233501},[],[233503],{"type":23,"value":233504},"label = \"OPEN\"",{"type":17,"tag":29,"props":233506,"children":233507},{},[233508,233510,233515],{"type":23,"value":233509},"That is safe because ",{"type":17,"tag":6121,"props":233511,"children":233513},{"className":233512},[],[233514],{"type":23,"value":62569},{"type":23,"value":233516}," is documented as 'the date that this deal closed.'",{"type":17,"tag":68,"props":233518,"children":233520},{"id":233519},"step-7-build-training-rows-from-deals-joins",[233521],{"type":23,"value":233522},"Step 7: Build training rows from deals + joins",{"type":17,"tag":29,"props":233524,"children":233525},{},[233526],{"type":23,"value":233527},"This step converts normalized CRM objects into training rows.",{"type":17,"tag":6893,"props":233529,"children":233532},{"className":233530,"code":233531,"language":18718,"meta":7},[18716],"function buildTrainingRows(input: {\n  deals: any[];\n  contactsById: Record\u003Cstring, any>;\n  companiesById: Record\u003Cstring, any>;\n}): TrainingRow[] {\n  const { deals, contactsById, companiesById } = input;\n\n  const rows: TrainingRow[] = [];\n\n  for (const d of deals) {\n    if (!d.id) continue;\n\n    const contactIds: string[] = Array.isArray(d.contact_ids) ? d.contact_ids : [];\n    const companyIds: string[] = Array.isArray(d.company_ids) ? d.company_ids : [];\n\n    const primaryContactId = contactIds[0];\n    const primaryCompanyId = companyIds[0];\n\n    const primaryContact = primaryContactId ? contactsById[primaryContactId] : undefined;\n    const primaryCompany = primaryCompanyId ? companiesById[primaryCompanyId] : undefined;\n\n    const primaryEmail = primaryContact?.emails?.[0];\n    const primaryEmailType = primaryEmail?.type;\n\n    const row: TrainingRow = {\n      deal_id: d.id,\n\n      deal_created_at: d.created_at,\n      deal_updated_at: d.updated_at,\n\n      amount: typeof d.amount === \"number\" ? d.amount : undefined,\n      currency: typeof d.currency === \"string\" ? d.currency : undefined,\n\n      pipeline: typeof d.pipeline === \"string\" ? d.pipeline : undefined,\n      pipeline_id: typeof d.pipeline_id === \"string\" ? d.pipeline_id : undefined,\n      stage: typeof d.stage === \"string\" ? d.stage : undefined,\n      stage_id: typeof d.stage_id === \"string\" ? d.stage_id : undefined,\n\n      closing_at: d.closing_at,\n      closed_at: d.closed_at,\n\n      probability: typeof d.probability === \"number\" ? d.probability : undefined,\n      source: typeof d.source === \"string\" ? d.source : undefined,\n\n      owner_user_id: typeof d.user_id === \"string\" ? d.user_id : undefined,\n\n      contact_count: contactIds.length,\n      company_count: companyIds.length,\n\n      primary_contact_id: primaryContactId,\n      primary_contact_title: primaryContact?.title,\n      primary_contact_department: primaryContact?.department,\n      primary_contact_email_type: primaryEmailType,\n\n      primary_company_id: primaryCompanyId,\n      primary_company_industry: primaryCompany?.industry,\n      primary_company_employees: typeof primaryCompany?.employees === \"number\" ? primaryCompany.employees : undefined,\n      primary_company_is_active: typeof primaryCompany?.is_active === \"boolean\" ? primaryCompany.is_active : undefined,\n      primary_company_timezone: primaryCompany?.timezone,\n\n      label: d.closed_at ? \"CLOSED\" : \"OPEN\",\n    };\n\n    rows.push(row);\n  }\n\n  return rows;\n}\n",[233533],{"type":17,"tag":6121,"props":233534,"children":233535},{"__ignoreMap":7},[233536],{"type":23,"value":233531},{"type":17,"tag":68,"props":233538,"children":233540},{"id":233539},"step-8-optional-enrichment-with-pipeline-stages",[233541],{"type":23,"value":233542},"Step 8: Optional enrichment with pipeline stages",{"type":17,"tag":29,"props":233544,"children":233545},{},[233546,233548,233553,233554,233559],{"type":23,"value":233547},"If you want stage metadata (like ",{"type":17,"tag":6121,"props":233549,"children":233551},{"className":233550},[],[233552],{"type":23,"value":212374},{"type":23,"value":75890},{"type":17,"tag":6121,"props":233555,"children":233557},{"className":233556},[],[233558],{"type":23,"value":62873},{"type":23,"value":233560},") you can pull pipelines and map:",{"type":17,"tag":80,"props":233562,"children":233563},{},[233564,233575],{"type":17,"tag":84,"props":233565,"children":233566},{},[233567,233573],{"type":17,"tag":6121,"props":233568,"children":233570},{"className":233569},[],[233571],{"type":23,"value":233572},"deal.pipeline_id",{"type":23,"value":233574}," → pipeline",{"type":17,"tag":84,"props":233576,"children":233577},{},[233578,233584,233586,233589],{"type":17,"tag":6121,"props":233579,"children":233581},{"className":233580},[],[233582],{"type":23,"value":233583},"deal.stage_id",{"type":23,"value":233585}," → pipeline.stages",{"type":17,"tag":22203,"props":233587,"children":233588},{},[],{"type":23,"value":233590},".id",{"type":17,"tag":6893,"props":233592,"children":233595},{"className":233593,"code":233594,"language":18718,"meta":7},[18716],"async function fetchAllPipelines(opts?: ListBaseOpts) {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmPipelines({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte ?? \"\",\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    if (page.length \u003C pageSize) break;\n    offset += pageSize;\n  }\n\n  return out;\n}\n\nfunction indexStagesByPipeline(pipelines: any[]) {\n  const out: Record\u003Cstring, Record\u003Cstring, any>> = {};\n  for (const p of pipelines) {\n    if (!p.id) continue;\n    const stages: any[] = Array.isArray(p.stages) ? p.stages : [];\n    out[p.id] = {};\n    for (const s of stages) {\n      if (!s.id) continue;\n      out[p.id][s.id] = s;\n    }\n  }\n  return out;\n}\n",[233596],{"type":17,"tag":6121,"props":233597,"children":233598},{"__ignoreMap":7},[233599],{"type":23,"value":233594},{"type":17,"tag":29,"props":233601,"children":233602},{},[233603],{"type":23,"value":233604},"You can then enrich each training row with stage attributes if both IDs exist.",{"type":17,"tag":68,"props":233606,"children":233608},{"id":233607},"step-9-optional-enrichment-with-events-engagement-signals",[233609],{"type":23,"value":233610},"Step 9: Optional enrichment with events (engagement signals)",{"type":17,"tag":29,"props":233612,"children":233613},{},[233614],{"type":23,"value":233615},"If you want engagement features, events are the normalized place to get them. You can filter events by:",{"type":17,"tag":80,"props":233617,"children":233618},{},[233619,233627,233635,233643],{"type":17,"tag":84,"props":233620,"children":233621},{},[233622],{"type":17,"tag":6121,"props":233623,"children":233625},{"className":233624},[],[233626],{"type":23,"value":27285},{"type":17,"tag":84,"props":233628,"children":233629},{},[233630],{"type":17,"tag":6121,"props":233631,"children":233633},{"className":233632},[],[233634],{"type":23,"value":26302},{"type":17,"tag":84,"props":233636,"children":233637},{},[233638],{"type":17,"tag":6121,"props":233639,"children":233641},{"className":233640},[],[233642],{"type":23,"value":27299},{"type":17,"tag":84,"props":233644,"children":233645},{},[233646],{"type":17,"tag":6121,"props":233647,"children":233649},{"className":233648},[],[233650],{"type":23,"value":27310},{"type":17,"tag":29,"props":233652,"children":233653},{},[233654],{"type":23,"value":233655},"This fetcher is identical to the other list helpers:",{"type":17,"tag":6893,"props":233657,"children":233660},{"className":233658,"code":233659,"language":18718,"meta":7},[18716],"async function fetchAllEvents(\n  opts?: ListBaseOpts & {\n    deal_id?: string;\n    contact_id?: string;\n    company_id?: string;\n    user_id?: string;\n    type?: string;\n    lead_id?: string;\n  }\n) {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: any[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmEvents({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte ?? \"\",\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      deal_id: opts?.deal_id ?? \"\",\n      contact_id: opts?.contact_id ?? \"\",\n      company_id: opts?.company_id ?? \"\",\n      user_id: opts?.user_id ?? \"\",\n      type: opts?.type ?? \"\",\n      lead_id: opts?.lead_id ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    if (page.length \u003C pageSize) break;\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[233661],{"type":17,"tag":6121,"props":233662,"children":233663},{"__ignoreMap":7},[233664],{"type":23,"value":233659},{"type":17,"tag":29,"props":233666,"children":233667},{},[233668],{"type":23,"value":233669},"A safe engagement feature you can compute without guessing semantics:",{"type":17,"tag":80,"props":233671,"children":233672},{},[233673],{"type":17,"tag":84,"props":233674,"children":233675},{},[233676,233678,233683,233685,233690,233691],{"type":23,"value":233677},"counts by ",{"type":17,"tag":6121,"props":233679,"children":233681},{"className":233680},[],[233682],{"type":23,"value":27310},{"type":23,"value":233684}," for a given ",{"type":17,"tag":6121,"props":233686,"children":233688},{"className":233687},[],[233689],{"type":23,"value":27285},{"type":23,"value":75890},{"type":17,"tag":6121,"props":233692,"children":233694},{"className":233693},[],[233695],{"type":23,"value":26302},{"type":17,"tag":68,"props":233697,"children":233699},{"id":233698},"step-10-putting-it-all-together",[233700],{"type":23,"value":233701},"Step 10: Putting it all together",{"type":17,"tag":29,"props":233703,"children":233704},{},[233705],{"type":23,"value":233706},"This pulls deals, contacts, companies, builds indexes, and produces training rows.",{"type":17,"tag":6893,"props":233708,"children":233711},{"className":233709,"code":233710,"language":18718,"meta":7},[18716],"async function main() {\n  const updated_gte = \"\"; // optionally set for incremental runs\n\n  const deals = await fetchAllDeals({\n    pageSize: 100,\n    updated_gte,\n    sort: \"updated_at\",\n    order: \"asc\",\n  });\n\n  const contacts = await fetchAllContacts({\n    pageSize: 100,\n    updated_gte,\n    sort: \"updated_at\",\n    order: \"asc\",\n  });\n\n  const companies = await fetchAllCompanies({\n    pageSize: 100,\n    updated_gte,\n    sort: \"updated_at\",\n    order: \"asc\",\n  });\n\n  const contactsById = indexById(contacts);\n  const companiesById = indexById(companies);\n\n  const trainingRows = buildTrainingRows({\n    deals,\n    contactsById,\n    companiesById,\n  });\n\n  console.log(\"Deals:\", deals.length);\n  console.log(\"Contacts:\", contacts.length);\n  console.log(\"Companies:\", companies.length);\n  console.log(\"Training rows:\", trainingRows.length);\n\n  // At this point:\n  // - write to a JSONL file\n  // - insert into your DB\n  // - send through an embedding pipeline\n  // - create a supervised dataset for classification/fine-tuning\n  console.log(\"Sample row:\", trainingRows[0]);\n}\n\nmain().catch((err) => {\n  console.error(err);\n  process.exit(1);\n});\n",[233712],{"type":17,"tag":6121,"props":233713,"children":233714},{"__ignoreMap":7},[233715],{"type":23,"value":233710},{"type":17,"tag":239,"props":233717,"children":233719},{"id":233718},"using-this-dataset-in-a-rag-pipeline",[233720],{"type":23,"value":233721},"Using This Dataset in a RAG Pipeline",{"type":17,"tag":29,"props":233723,"children":233724},{},[233725],{"type":23,"value":233726},"Beyond supervised training, the same normalized CRM objects can power a RAG architecture:",{"type":17,"tag":6154,"props":233728,"children":233729},{},[233730,233735,233764],{"type":17,"tag":84,"props":233731,"children":233732},{},[233733],{"type":23,"value":233734},"Chunk and embed textual CRM fields (deal names, notes, event summaries, company descriptions).",{"type":17,"tag":84,"props":233736,"children":233737},{},[233738,233740,233745,233746,233751,233752,233757,233758,233763],{"type":23,"value":233739},"Store embeddings in your vector database with identifiers like ",{"type":17,"tag":6121,"props":233741,"children":233743},{"className":233742},[],[233744],{"type":23,"value":25037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233747,"children":233749},{"className":233748},[],[233750],{"type":23,"value":27285},{"type":23,"value":11826},{"type":17,"tag":6121,"props":233753,"children":233755},{"className":233754},[],[233756],{"type":23,"value":26302},{"type":23,"value":12561},{"type":17,"tag":6121,"props":233759,"children":233761},{"className":233760},[],[233762],{"type":23,"value":25337},{"type":23,"value":54},{"type":17,"tag":84,"props":233765,"children":233766},{},[233767],{"type":23,"value":233768},"On user query ('What happened with Acme Corp?'), retrieve the most relevant deal, event, and note segments before generating a grounded response. Unified Use Case RAG Pipelines",{"type":17,"tag":29,"props":233770,"children":233771},{},[233772],{"type":23,"value":233773},"Unified handles ingestion, normalization, and real-time updates; embeddings and vector search remain in your infrastructure.",{"type":17,"tag":239,"props":233775,"children":233777},{"id":233776},"where-this-fits-in-an-ai-pipeline",[233778],{"type":23,"value":233779},"Where this fits in an AI pipeline",{"type":17,"tag":29,"props":233781,"children":233782},{},[233783,233785,233791],{"type":23,"value":233784},"Once you have ",{"type":17,"tag":6121,"props":233786,"children":233788},{"className":233787},[],[233789],{"type":23,"value":233790},"trainingRows",{"type":23,"value":233792},", you can:",{"type":17,"tag":80,"props":233794,"children":233795},{},[233796,233816,233834],{"type":17,"tag":84,"props":233797,"children":233798},{},[233799,233801,233807,233808,233814],{"type":23,"value":233800},"embed textual fields (",{"type":17,"tag":6121,"props":233802,"children":233804},{"className":233803},[],[233805],{"type":23,"value":233806},"deal.name",{"type":23,"value":11826},{"type":17,"tag":6121,"props":233809,"children":233811},{"className":233810},[],[233812],{"type":23,"value":233813},"company.industry",{"type":23,"value":233815},", event notes, contact title/department) to build retrieval for RAG-based CRM search and assistants.",{"type":17,"tag":84,"props":233817,"children":233818},{},[233819,233821,233826,233827,233832],{"type":23,"value":233820},"train a classifier (e.g. predict ",{"type":17,"tag":6121,"props":233822,"children":233824},{"className":233823},[],[233825],{"type":23,"value":183711},{"type":23,"value":221382},{"type":17,"tag":6121,"props":233828,"children":233830},{"className":233829},[],[233831],{"type":23,"value":150031},{"type":23,"value":233833},") using numeric/context fields",{"type":17,"tag":84,"props":233835,"children":233836},{},[233837],{"type":23,"value":233838},"fine-tune with structured examples if your model accepts JSON schemas",{"type":17,"tag":29,"props":233840,"children":233841},{},[233842],{"type":23,"value":233843},"The key is that your dataset is built on the normalized CRM objects and list semantics that Unified documents, with pagination and filtering handled explicitly and without vendor-specific branching.",{"type":17,"tag":29,"props":233845,"children":233846},{},[233847,233848],{"type":23,"value":1609},{"type":17,"tag":133,"props":233849,"children":233851},{"href":1612,"rel":233850},[214],[233852],{"type":23,"value":1616},{"type":17,"tag":29,"props":233854,"children":233855},{},[233856,233857],{"type":23,"value":1609},{"type":17,"tag":133,"props":233858,"children":233860},{"href":1623,"rel":233859},[214],[233861],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":233863},[233864,233865,233866,233867,233877,233878,233879,233880,233881,233882,233883],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":232345,"depth":1629,"text":232348,"children":233868},[233869,233870,233871,233872,233874,233875],{"id":212137,"depth":1635,"text":212774},{"id":211261,"depth":1635,"text":211978},{"id":211471,"depth":1635,"text":211980},{"id":232935,"depth":1635,"text":233873},"Pipelines (CrmPipeline) optional",{"id":212398,"depth":1635,"text":212778},{"id":233176,"depth":1635,"text":233876},"Leads (CrmLead) optional",{"id":233317,"depth":1629,"text":233320},{"id":233390,"depth":1629,"text":233393},{"id":233423,"depth":1629,"text":233426},{"id":233519,"depth":1629,"text":233522},{"id":233539,"depth":1629,"text":233542},{"id":233607,"depth":1629,"text":233610},{"id":233698,"depth":1629,"text":233701,"children":233884},[233885,233886],{"id":233718,"depth":1635,"text":233721},{"id":233776,"depth":1635,"text":233779},"content:blog:how_to_train_ai_with_crm_data_using_unified_crm_api.md","blog/how_to_train_ai_with_crm_data_using_unified_crm_api.md","blog/how_to_train_ai_with_crm_data_using_unified_crm_api",{"_path":233891,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":163621,"description":233892,"img":233893,"date":231320,"tag":12,"body":233894,"_type":1677,"_id":234735,"_source":1679,"_file":234736,"_stem":234737,"_extension":1682},"/blog/how_to_train_ai_with_hris_data_with_unified_hr_and_directory_api","Most HR-driven AI features fail long before the model ever trains.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_train_ai_with_hris_data_with_unified_hr_and_directory_api-icon.png",{"type":14,"children":233895,"toc":234712},[233896,233901,233904,233911,233915,233920,233925,233930,233935,233940,233958,233963,233973,233984,233989,233993,234025,234029,234038,234048,234057,234061,234070,234083,234089,234094,234104,234109,234114,234199,234211,234224,234229,234286,234291,234304,234309,234349,234354,234362,234375,234380,234420,234425,234431,234449,234458,234464,234475,234484,234495,234501,234512,234521,234526,234532,234537,234546,234551,234557,234562,234571,234576,234582,234587,234610,234619,234624,234630,234635,234670,234675,234679,234684,234689,234694,234703],{"type":17,"tag":18,"props":233897,"children":233899},{"id":233898},"how-to-train-ai-with-hris-data-with-unifieds-hr-directory-api",[233900],{"type":23,"value":163621},{"type":17,"tag":25,"props":233902,"children":233903},{},[],{"type":17,"tag":29,"props":233905,"children":233906},{},[233907],{"type":17,"tag":33,"props":233908,"children":233909},{},[233910],{"type":23,"value":231338},{"type":17,"tag":29,"props":233912,"children":233913},{},[233914],{"type":23,"value":233892},{"type":17,"tag":29,"props":233916,"children":233917},{},[233918],{"type":23,"value":233919},"On paper, HR analytics looks straightforward. Pull employees. Read compensation. Add payroll history. Derive features like salary bands, tenure, churn risk, or cost forecasting.",{"type":17,"tag":29,"props":233921,"children":233922},{},[233923],{"type":23,"value":233924},"In practice, those steps only work if HR data means the same thing across customers.",{"type":17,"tag":29,"props":233926,"children":233927},{},[233928],{"type":23,"value":233929},"That's where complexity creeps in.",{"type":17,"tag":29,"props":233931,"children":233932},{},[233933],{"type":23,"value":233934},"HR systems don't just differ in UI. They model employees, compensation, payroll, and time differently. Some systems treat compensation as a single current record. Others split it into multiple components. Payroll may arrive as clean payslips, or only as time-based shifts. Leave, termination, and employment status are often represented differently or inconsistently.",{"type":17,"tag":29,"props":233936,"children":233937},{},[233938],{"type":23,"value":233939},"For a PM or platform engineer, this creates uncomfortable tradeoffs:",{"type":17,"tag":80,"props":233941,"children":233942},{},[233943,233948,233953],{"type":17,"tag":84,"props":233944,"children":233945},{},[233946],{"type":23,"value":233947},"Can we trust compensation fields to be comparable across HR providers?",{"type":17,"tag":84,"props":233949,"children":233950},{},[233951],{"type":23,"value":233952},"Is payroll data current-state or historical?",{"type":17,"tag":84,"props":233954,"children":233955},{},[233956],{"type":23,"value":233957},"Can we train one model across all customers, or does each integration need special handling?",{"type":17,"tag":29,"props":233959,"children":233960},{},[233961],{"type":23,"value":233962},"Many teams solve this by narrowing scope or hardcoding logic per HR vendor. That works early, but it limits who your AI features work for and how confidently you can ship changes.",{"type":17,"tag":29,"props":233964,"children":233965},{},[233966,233967,233971],{"type":23,"value":25244},{"type":17,"tag":133,"props":233968,"children":233969},{"href":60186},[233970],{"type":23,"value":197036},{"type":23,"value":233972}," is designed to remove those constraints. Instead of reconciling HR semantics downstream, Unified normalizes employees, compensation, payslips, timeshifts, and timeoff upstream. Dates, enums, currencies, and identifiers behave consistently before your AI pipeline ever runs.",{"type":17,"tag":29,"props":233974,"children":233975},{},[233976,233978,233982],{"type":23,"value":233977},"The same normalized HR layer can also support ",{"type":17,"tag":133,"props":233979,"children":233980},{"href":77021},[233981],{"type":23,"value":77024},{"type":23,"value":233983}," (RAG) workflows, where HR records or policy documents are indexed and retrieved to ground AI responses in real employee data.",{"type":17,"tag":29,"props":233985,"children":233986},{},[233987],{"type":23,"value":233988},"This guide shows how to build AI-ready HR datasets on top of that normalized layer using Unified's HR & Directory API, without branching logic per provider and without guessing at data semantics.",{"type":17,"tag":239,"props":233990,"children":233991},{"id":141798},[233992],{"type":23,"value":141801},{"type":17,"tag":80,"props":233994,"children":233995},{},[233996,234000,234011,234015],{"type":17,"tag":84,"props":233997,"children":233998},{},[233999],{"type":23,"value":199683},{"type":17,"tag":84,"props":234001,"children":234002},{},[234003,234005,234009],{"type":23,"value":234004},"A Unified account with an ",{"type":17,"tag":48,"props":234006,"children":234007},{},[234008],{"type":23,"value":89846},{"type":23,"value":234010}," integration enabled",{"type":17,"tag":84,"props":234012,"children":234013},{},[234014],{"type":23,"value":232290},{"type":17,"tag":84,"props":234016,"children":234017},{},[234018,234020],{"type":23,"value":234019},"A customer HRIS ",{"type":17,"tag":6121,"props":234021,"children":234023},{"className":234022},[],[234024],{"type":23,"value":19766},{"type":17,"tag":68,"props":234026,"children":234027},{"id":211198},[234028],{"type":23,"value":211201},{"type":17,"tag":6893,"props":234030,"children":234033},{"className":234031,"code":234032,"language":48432,"meta":7},[48430],"mkdir hris-ai-training\ncd hris-ai-training\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[234034],{"type":17,"tag":6121,"props":234035,"children":234036},{"__ignoreMap":7},[234037],{"type":23,"value":234032},{"type":17,"tag":29,"props":234039,"children":234040},{},[234041,234042,234047],{"type":23,"value":211215},{"type":17,"tag":6121,"props":234043,"children":234045},{"className":234044},[],[234046],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":234049,"children":234052},{"className":234050,"code":234051,"language":20901,"meta":23},[20899],"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_HRIS=your_customer_hris_connection_id\n",[234053],{"type":17,"tag":6121,"props":234054,"children":234055},{"__ignoreMap":7},[234056],{"type":23,"value":234051},{"type":17,"tag":68,"props":234058,"children":234059},{"id":211235},[234060],{"type":23,"value":211238},{"type":17,"tag":6893,"props":234062,"children":234065},{"className":234063,"code":234064,"language":18718,"meta":7},[18716],"import \"dotenv/config\";\nimport { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nconst { UNIFIED_API_KEY, CONNECTION_HRIS } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[234066],{"type":17,"tag":6121,"props":234067,"children":234068},{"__ignoreMap":7},[234069],{"type":23,"value":234064},{"type":17,"tag":29,"props":234071,"children":234072},{},[234073,234075,234081],{"type":23,"value":234074},"All HRIS operations live under the ",{"type":17,"tag":6121,"props":234076,"children":234078},{"className":234077},[],[234079],{"type":23,"value":234080},"sdk.hris",{"type":23,"value":234082}," namespace.",{"type":17,"tag":68,"props":234084,"children":234086},{"id":234085},"step-3-understand-the-normalized-hris-objects",[234087],{"type":23,"value":234088},"Step 3: Understand the normalized HRIS objects",{"type":17,"tag":29,"props":234090,"children":234091},{},[234092],{"type":23,"value":234093},"Before writing any model logic, it's critical to understand what Unified guarantees and what it does not.",{"type":17,"tag":239,"props":234095,"children":234096},{"id":206590},[234097,234098,234103],{"type":23,"value":206593},{"type":17,"tag":6121,"props":234099,"children":234101},{"className":234100},[],[234102],{"type":23,"value":206599},{"type":23,"value":12034},{"type":17,"tag":29,"props":234105,"children":234106},{},[234107],{"type":23,"value":234108},"Employees are the anchor for all HRIS data. Each employee record includes identity fields, employment status, and current compensation.",{"type":17,"tag":29,"props":234110,"children":234111},{},[234112],{"type":23,"value":234113},"Important fields you'll rely on:",{"type":17,"tag":80,"props":234115,"children":234116},{},[234117,234125,234146,234176,234190],{"type":17,"tag":84,"props":234118,"children":234119},{},[234120],{"type":17,"tag":6121,"props":234121,"children":234123},{"className":234122},[],[234124],{"type":23,"value":18766},{"type":17,"tag":84,"props":234126,"children":234127},{},[234128,234133,234134,234139,234140,234145],{"type":17,"tag":6121,"props":234129,"children":234131},{"className":234130},[],[234132],{"type":23,"value":206629},{"type":23,"value":44573},{"type":17,"tag":6121,"props":234135,"children":234137},{"className":234136},[],[234138],{"type":23,"value":183701},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234141,"children":234143},{"className":234142},[],[234144],{"type":23,"value":210788},{"type":23,"value":12034},{"type":17,"tag":84,"props":234147,"children":234148},{},[234149,234154,234155,234161,234162,234168,234169,234175],{"type":17,"tag":6121,"props":234150,"children":234152},{"className":234151},[],[234153],{"type":23,"value":75514},{"type":23,"value":44573},{"type":17,"tag":6121,"props":234156,"children":234158},{"className":234157},[],[234159],{"type":23,"value":234160},"FULL_TIME",{"type":23,"value":11826},{"type":17,"tag":6121,"props":234163,"children":234165},{"className":234164},[],[234166],{"type":23,"value":234167},"PART_TIME",{"type":23,"value":11826},{"type":17,"tag":6121,"props":234170,"children":234172},{"className":234171},[],[234173],{"type":23,"value":234174},"CONTRACTOR",{"type":23,"value":149980},{"type":17,"tag":84,"props":234177,"children":234178},{},[234179,234184,234185],{"type":17,"tag":6121,"props":234180,"children":234182},{"className":234181},[],[234183],{"type":23,"value":132233},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234186,"children":234188},{"className":234187},[],[234189],{"type":23,"value":206687},{"type":17,"tag":84,"props":234191,"children":234192},{},[234193],{"type":17,"tag":6121,"props":234194,"children":234196},{"className":234195},[],[234197],{"type":23,"value":234198},"compensation[]",{"type":17,"tag":29,"props":234200,"children":234201},{},[234202,234204,234209],{"type":23,"value":234203},"Compensation entries are ",{"type":17,"tag":48,"props":234205,"children":234206},{},[234207],{"type":23,"value":234208},"current-state only",{"type":23,"value":234210},". They do not include start or end dates. Multiple entries may exist per employee to represent salary, bonus, equity, or other components.",{"type":17,"tag":239,"props":234212,"children":234214},{"id":234213},"payslips-hrispayslip",[234215,234217,234223],{"type":23,"value":234216},"Payslips (",{"type":17,"tag":6121,"props":234218,"children":234220},{"className":234219},[],[234221],{"type":23,"value":234222},"HrisPayslip",{"type":23,"value":12034},{"type":17,"tag":29,"props":234225,"children":234226},{},[234227],{"type":23,"value":234228},"Payslips represent historical payroll events. Each record includes:",{"type":17,"tag":80,"props":234230,"children":234231},{},[234232,234242,234262,234278],{"type":17,"tag":84,"props":234233,"children":234234},{},[234235,234240],{"type":17,"tag":6121,"props":234236,"children":234238},{"className":234237},[],[234239],{"type":23,"value":62582},{"type":23,"value":234241}," (employee reference)",{"type":17,"tag":84,"props":234243,"children":234244},{},[234245,234250,234251,234256,234257],{"type":17,"tag":6121,"props":234246,"children":234248},{"className":234247},[],[234249],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234252,"children":234254},{"className":234253},[],[234255],{"type":23,"value":21060},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234258,"children":234260},{"className":234259},[],[234261],{"type":23,"value":187822},{"type":17,"tag":84,"props":234263,"children":234264},{},[234265,234271,234272],{"type":17,"tag":6121,"props":234266,"children":234268},{"className":234267},[],[234269],{"type":23,"value":234270},"gross_amount",{"type":23,"value":11826},{"type":17,"tag":6121,"props":234273,"children":234275},{"className":234274},[],[234276],{"type":23,"value":234277},"net_amount",{"type":17,"tag":84,"props":234279,"children":234280},{},[234281],{"type":17,"tag":6121,"props":234282,"children":234284},{"className":234283},[],[234285],{"type":23,"value":22296},{"type":17,"tag":29,"props":234287,"children":234288},{},[234289],{"type":23,"value":234290},"Payslips are the primary source of historical pay data.",{"type":17,"tag":239,"props":234292,"children":234294},{"id":234293},"timeshifts-hristimeshift",[234295,234297,234303],{"type":23,"value":234296},"Timeshifts (",{"type":17,"tag":6121,"props":234298,"children":234300},{"className":234299},[],[234301],{"type":23,"value":234302},"HrisTimeshift",{"type":23,"value":12034},{"type":17,"tag":29,"props":234305,"children":234306},{},[234307],{"type":23,"value":234308},"Timeshifts represent time-based work records. Each record includes:",{"type":17,"tag":80,"props":234310,"children":234311},{},[234312,234321,234335,234344],{"type":17,"tag":84,"props":234313,"children":234314},{},[234315],{"type":17,"tag":6121,"props":234316,"children":234318},{"className":234317},[],[234319],{"type":23,"value":234320},"employee_user_id",{"type":17,"tag":84,"props":234322,"children":234323},{},[234324,234329,234330],{"type":17,"tag":6121,"props":234325,"children":234327},{"className":234326},[],[234328],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234331,"children":234333},{"className":234332},[],[234334],{"type":23,"value":21060},{"type":17,"tag":84,"props":234336,"children":234337},{},[234338],{"type":17,"tag":6121,"props":234339,"children":234341},{"className":234340},[],[234342],{"type":23,"value":234343},"hours",{"type":17,"tag":84,"props":234345,"children":234346},{},[234347],{"type":23,"value":234348},"Optional compensation entries",{"type":17,"tag":29,"props":234350,"children":234351},{},[234352],{"type":23,"value":234353},"Timeshifts are useful for hourly or shift-based analysis, but are provider-dependent and should be treated as optional.",{"type":17,"tag":29,"props":234355,"children":234356},{},[234357],{"type":17,"tag":33,"props":234358,"children":234359},{},[234360],{"type":23,"value":234361},"Note: Some HRIS providers may not support timeshifts or timeoff.",{"type":17,"tag":239,"props":234363,"children":234365},{"id":234364},"timeoff-hristimeoff",[234366,234368,234374],{"type":23,"value":234367},"Timeoff (",{"type":17,"tag":6121,"props":234369,"children":234371},{"className":234370},[],[234372],{"type":23,"value":234373},"HrisTimeoff",{"type":23,"value":12034},{"type":17,"tag":29,"props":234376,"children":234377},{},[234378],{"type":23,"value":234379},"Timeoff records represent leave events. They include:",{"type":17,"tag":80,"props":234381,"children":234382},{},[234383,234391,234405],{"type":17,"tag":84,"props":234384,"children":234385},{},[234386],{"type":17,"tag":6121,"props":234387,"children":234389},{"className":234388},[],[234390],{"type":23,"value":62582},{"type":17,"tag":84,"props":234392,"children":234393},{},[234394,234399,234400],{"type":17,"tag":6121,"props":234395,"children":234397},{"className":234396},[],[234398],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234401,"children":234403},{"className":234402},[],[234404],{"type":23,"value":21060},{"type":17,"tag":84,"props":234406,"children":234407},{},[234408,234413,234414],{"type":17,"tag":6121,"props":234409,"children":234411},{"className":234410},[],[234412],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234415,"children":234417},{"className":234416},[],[234418],{"type":23,"value":234419},"is_paid",{"type":17,"tag":29,"props":234421,"children":234422},{},[234423],{"type":23,"value":234424},"Timeoff can be used for availability or absence features, but is not required for payroll-based training.",{"type":17,"tag":68,"props":234426,"children":234428},{"id":234427},"step-4-fetch-employees",[234429],{"type":23,"value":234430},"Step 4: Fetch employees",{"type":17,"tag":29,"props":234432,"children":234433},{},[234434,234436,234441,234442,234447],{"type":23,"value":234435},"Employee lists are paginated using ",{"type":17,"tag":6121,"props":234437,"children":234439},{"className":234438},[],[234440],{"type":23,"value":48389},{"type":23,"value":34435},{"type":17,"tag":6121,"props":234443,"children":234445},{"className":234444},[],[234446],{"type":23,"value":48411},{"type":23,"value":234448},". The list endpoint returns a plain array, not a wrapped object.",{"type":17,"tag":6893,"props":234450,"children":234453},{"className":234451,"code":234452,"language":18718,"meta":7},[18716],"export async function fetchAllEmployees() {\n  const out = [];\n  let offset = 0;\n  const limit = 100;\n\n  while (true) {\n    const page = await sdk.hris.listHrisEmployees({\n      connectionId: CONNECTION_HRIS!,\n      limit,\n      offset,\n      sort: \"updated_at\",\n      order: \"asc\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += limit;\n  }\n\n  return out;\n}\n",[234454],{"type":17,"tag":6121,"props":234455,"children":234456},{"__ignoreMap":7},[234457],{"type":23,"value":234452},{"type":17,"tag":68,"props":234459,"children":234461},{"id":234460},"step-5-fetch-payslips-per-employee",[234462],{"type":23,"value":234463},"Step 5: Fetch payslips per employee",{"type":17,"tag":29,"props":234465,"children":234466},{},[234467,234469,234474],{"type":23,"value":234468},"Payslips can be filtered by employee using ",{"type":17,"tag":6121,"props":234470,"children":234472},{"className":234471},[],[234473],{"type":23,"value":62582},{"type":23,"value":54},{"type":17,"tag":6893,"props":234476,"children":234479},{"className":234477,"code":234478,"language":18718,"meta":7},[18716],"export async function fetchPayslipsForEmployee(employeeId: string) {\n  return await sdk.hris.listHrisPayslips({\n    connectionId: CONNECTION_HRIS!,\n    user_id: employeeId,\n    limit: 100,\n    offset: 0,\n    sort: \"updated_at\",\n    order: \"asc\",\n  });\n}\n",[234480],{"type":17,"tag":6121,"props":234481,"children":234482},{"__ignoreMap":7},[234483],{"type":23,"value":234478},{"type":17,"tag":29,"props":234485,"children":234486},{},[234487,234489,234494],{"type":23,"value":234488},"This returns an array of ",{"type":17,"tag":6121,"props":234490,"children":234492},{"className":234491},[],[234493],{"type":23,"value":234222},{"type":23,"value":54},{"type":17,"tag":68,"props":234496,"children":234498},{"id":234497},"step-6-optional-fetch-timeshifts",[234499],{"type":23,"value":234500},"Step 6: Optional — fetch timeshifts",{"type":17,"tag":29,"props":234502,"children":234503},{},[234504,234506,234511],{"type":23,"value":234505},"If your use case involves hourly analysis, timeshifts can be fetched and joined by ",{"type":17,"tag":6121,"props":234507,"children":234509},{"className":234508},[],[234510],{"type":23,"value":234320},{"type":23,"value":54},{"type":17,"tag":6893,"props":234513,"children":234516},{"className":234514,"code":234515,"language":18718,"meta":7},[18716],"export async function fetchTimeshifts(startGte?: string, endLt?: string) {\n  return await sdk.hris.listHrisTimeshifts({\n    connectionId: CONNECTION_HRIS!,\n    limit: 100,\n    offset: 0,\n    start_gte: startGte ?? \"\",\n    end_lt: endLt ?? \"\",\n  });\n}\n",[234517],{"type":17,"tag":6121,"props":234518,"children":234519},{"__ignoreMap":7},[234520],{"type":23,"value":234515},{"type":17,"tag":29,"props":234522,"children":234523},{},[234524],{"type":23,"value":234525},"Not all providers support timeshifts. Your pipeline should tolerate empty results.",{"type":17,"tag":68,"props":234527,"children":234529},{"id":234528},"step-7-normalize-employees-for-training",[234530],{"type":23,"value":234531},"Step 7: Normalize employees for training",{"type":17,"tag":29,"props":234533,"children":234534},{},[234535],{"type":23,"value":234536},"This step converts raw HRIS records into a stable shape for feature extraction.",{"type":17,"tag":6893,"props":234538,"children":234541},{"className":234539,"code":234540,"language":18718,"meta":7},[18716],"export function normalizeEmployee(e: any) {\n  return {\n    id: e.id,\n    status: e.employment_status,\n    type: e.employment_type,\n    hiredAt: e.hired_at,\n    terminatedAt: e.terminated_at,\n    compensation: (e.compensation ?? []).map((c: any) => ({\n      type: c.type,\n      amount: c.amount,\n      currency: c.currency,\n      frequency: c.frequency,\n    })),\n  };\n}\n",[234542],{"type":17,"tag":6121,"props":234543,"children":234544},{"__ignoreMap":7},[234545],{"type":23,"value":234540},{"type":17,"tag":29,"props":234547,"children":234548},{},[234549],{"type":23,"value":234550},"Do not annualize or convert currencies here. Compensation frequency and currency are explicitly modeled and should remain intact.",{"type":17,"tag":68,"props":234552,"children":234554},{"id":234553},"step-8-build-payroll-history-features",[234555],{"type":23,"value":234556},"Step 8: Build payroll history features",{"type":17,"tag":29,"props":234558,"children":234559},{},[234560],{"type":23,"value":234561},"Payslips provide historical labels and trends.",{"type":17,"tag":6893,"props":234563,"children":234566},{"className":234564,"code":234565,"language":18718,"meta":7},[18716],"export function aggregatePayroll(payslips: any[]) {\n  return payslips.map((p) => ({\n    startAt: p.start_at,\n    endAt: p.end_at,\n    gross: p.gross_amount,\n    net: p.net_amount,\n    currency: p.currency,\n  }));\n}\n",[234567],{"type":17,"tag":6121,"props":234568,"children":234569},{"__ignoreMap":7},[234570],{"type":23,"value":234565},{"type":17,"tag":29,"props":234572,"children":234573},{},[234574],{"type":23,"value":234575},"Group by month, quarter, or fiscal period depending on your model needs.",{"type":17,"tag":68,"props":234577,"children":234579},{"id":234578},"step-9-assemble-ai-ready-records",[234580],{"type":23,"value":234581},"Step 9: Assemble AI-ready records",{"type":17,"tag":29,"props":234583,"children":234584},{},[234585],{"type":23,"value":234586},"At this point, you can construct training rows that combine:",{"type":17,"tag":80,"props":234588,"children":234589},{},[234590,234595,234600,234605],{"type":17,"tag":84,"props":234591,"children":234592},{},[234593],{"type":23,"value":234594},"Current employee attributes",{"type":17,"tag":84,"props":234596,"children":234597},{},[234598],{"type":23,"value":234599},"Current compensation structure",{"type":17,"tag":84,"props":234601,"children":234602},{},[234603],{"type":23,"value":234604},"Historical payroll events",{"type":17,"tag":84,"props":234606,"children":234607},{},[234608],{"type":23,"value":234609},"Optional hours worked or timeoff signals",{"type":17,"tag":6893,"props":234611,"children":234614},{"className":234612,"code":234613,"language":18718,"meta":7},[18716],"export function buildTrainingRow(employee: any, payroll: any[]) {\n  return {\n    employeeId: employee.id,\n    status: employee.status,\n    employmentType: employee.type,\n    compensation: employee.compensation,\n    payrollHistory: payroll,\n  };\n}\n",[234615],{"type":17,"tag":6121,"props":234616,"children":234617},{"__ignoreMap":7},[234618],{"type":23,"value":234613},{"type":17,"tag":29,"props":234620,"children":234621},{},[234622],{"type":23,"value":234623},"These records can be serialized to JSONL, stored in a feature store, or streamed into a training job.",{"type":17,"tag":239,"props":234625,"children":234627},{"id":234626},"optional-using-hris-data-in-a-rag-architecture",[234628],{"type":23,"value":234629},"Optional: Using HRIS Data in a RAG Architecture",{"type":17,"tag":29,"props":234631,"children":234632},{},[234633],{"type":23,"value":234634},"Beyond structured model training, normalized HR records can also power RAG-based assistants:",{"type":17,"tag":6154,"props":234636,"children":234637},{},[234638,234643,234665],{"type":17,"tag":84,"props":234639,"children":234640},{},[234641],{"type":23,"value":234642},"Chunk and embed relevant HR fields (for example, job titles, department descriptions, policy documents linked to roles).",{"type":17,"tag":84,"props":234644,"children":234645},{},[234646,234647,234652,234653,234658,234659,234664],{"type":23,"value":233739},{"type":17,"tag":6121,"props":234648,"children":234650},{"className":234649},[],[234651],{"type":23,"value":25037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234654,"children":234656},{"className":234655},[],[234657],{"type":23,"value":189411},{"type":23,"value":12561},{"type":17,"tag":6121,"props":234660,"children":234662},{"className":234661},[],[234663],{"type":23,"value":25337},{"type":23,"value":54},{"type":17,"tag":84,"props":234666,"children":234667},{},[234668],{"type":23,"value":234669},"On user query ('What is this employee's tenure?' or 'What policies apply to contractors?'), retrieve relevant segments before generating a grounded response. Unified Use Case RAG Pipelines",{"type":17,"tag":29,"props":234671,"children":234672},{},[234673],{"type":23,"value":234674},"Unified handles ingestion and normalization across HR providers; embeddings and vector storage remain in your infrastructure.",{"type":17,"tag":68,"props":234676,"children":234677},{"id":132938},[234678],{"type":23,"value":136162},{"type":17,"tag":29,"props":234680,"children":234681},{},[234682],{"type":23,"value":234683},"AI features built on HR data fail when the data itself isn't reliable. Unified's HR & Directory API gives you a consistent, real-time foundation for employees, compensation, payroll, and time-based work across providers.",{"type":17,"tag":29,"props":234685,"children":234686},{},[234687],{"type":23,"value":234688},"Once the semantics are stable, the modeling becomes the easy part.",{"type":17,"tag":29,"props":234690,"children":234691},{},[234692],{"type":23,"value":234693},"If you're building AI features that depend on HR data, this is the layer that lets you do it once and scale it everywhere.",{"type":17,"tag":29,"props":234695,"children":234696},{},[234697,234698],{"type":23,"value":1609},{"type":17,"tag":133,"props":234699,"children":234701},{"href":1612,"rel":234700},[214],[234702],{"type":23,"value":1616},{"type":17,"tag":29,"props":234704,"children":234705},{},[234706,234707],{"type":23,"value":1609},{"type":17,"tag":133,"props":234708,"children":234710},{"href":1623,"rel":234709},[214],[234711],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":234713},[234714,234715,234716,234717,234726,234727,234728,234729,234730,234731,234734],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":234085,"depth":1629,"text":234088,"children":234718},[234719,234720,234722,234724],{"id":206590,"depth":1635,"text":207267},{"id":234213,"depth":1635,"text":234721},"Payslips (HrisPayslip)",{"id":234293,"depth":1635,"text":234723},"Timeshifts (HrisTimeshift)",{"id":234364,"depth":1635,"text":234725},"Timeoff (HrisTimeoff)",{"id":234427,"depth":1629,"text":234430},{"id":234460,"depth":1629,"text":234463},{"id":234497,"depth":1629,"text":234500},{"id":234528,"depth":1629,"text":234531},{"id":234553,"depth":1629,"text":234556},{"id":234578,"depth":1629,"text":234581,"children":234732},[234733],{"id":234626,"depth":1635,"text":234629},{"id":132938,"depth":1629,"text":136162},"content:blog:how_to_train_ai_with_hris_data_with_unified_hr_and_directory_api.md","blog/how_to_train_ai_with_hris_data_with_unified_hr_and_directory_api.md","blog/how_to_train_ai_with_hris_data_with_unified_hr_and_directory_api",{"_path":234739,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":234740,"description":234741,"img":234742,"date":234743,"tag":12,"body":234744,"_type":1677,"_id":235522,"_source":1679,"_file":235523,"_stem":235524,"_extension":1682},"/blog/how_to_analyze_compensation_with_unified_hr_and_directory_api","How to Analyze Compensation with Unified's HR & Directory API","Compensation analysis looks straightforward until you support more than one HR system.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_analyze_compensation_with_unified_hr_and_directory_api-icon.png","2026-01-10T00:00:00.000Z",{"type":14,"children":234745,"toc":235502},[234746,234751,234754,234762,234766,234771,234776,234794,234799,234816,234821,234825,234860,234864,234873,234883,234891,234895,234904,234910,234921,234933,234938,235111,235117,235128,235268,235272,235296,235302,235311,235317,235326,235332,235337,235345,235354,235360,235372,235381,235387,235393,235402,235408,235417,235423,235432,235438,235447,235452,235456,235479,235484,235493],{"type":17,"tag":18,"props":234747,"children":234749},{"id":234748},"how-to-analyze-compensation-with-unifieds-hr-directory-api",[234750],{"type":23,"value":234740},{"type":17,"tag":25,"props":234752,"children":234753},{},[],{"type":17,"tag":29,"props":234755,"children":234756},{},[234757],{"type":17,"tag":33,"props":234758,"children":234759},{},[234760],{"type":23,"value":234761},"January 10, 2026",{"type":17,"tag":29,"props":234763,"children":234764},{},[234765],{"type":23,"value":234741},{"type":17,"tag":29,"props":234767,"children":234768},{},[234769],{"type":23,"value":234770},"Across HRIS platforms, 'employee pay' is modeled very differently. Some systems emphasize salary. Others break compensation into many components. Employment status, contractor treatment, and demographic fields vary in both structure and availability. Even when the data exists, it's often exposed inconsistently or buried behind vendor-specific assumptions.",{"type":17,"tag":29,"props":234772,"children":234773},{},[234774],{"type":23,"value":234775},"For a PM, this creates immediate ambiguity:",{"type":17,"tag":80,"props":234777,"children":234778},{},[234779,234784,234789],{"type":17,"tag":84,"props":234780,"children":234781},{},[234782],{"type":23,"value":234783},"Does 'total compensation' include bonuses, equity, or only base pay?",{"type":17,"tag":84,"props":234785,"children":234786},{},[234787],{"type":23,"value":234788},"Are we analyzing active employees only, or also recent terminations?",{"type":17,"tag":84,"props":234790,"children":234791},{},[234792],{"type":23,"value":234793},"Can averages and equity analyses be trusted across HRIS providers?",{"type":17,"tag":29,"props":234795,"children":234796},{},[234797],{"type":23,"value":234798},"Many products handle this by hardcoding assumptions per vendor or narrowing scope to a single HR system. That works until customers ask for broader support—or expect the numbers to line up across tools.",{"type":17,"tag":29,"props":234800,"children":234801},{},[234802,234803,234807,234809,234814],{"type":23,"value":25244},{"type":17,"tag":133,"props":234804,"children":234805},{"href":60186},[234806],{"type":23,"value":197036},{"type":23,"value":234808}," is designed to remove that fragmentation. It exposes employees and their ",{"type":17,"tag":48,"props":234810,"children":234811},{},[234812],{"type":23,"value":234813},"current compensation packages",{"type":23,"value":234815}," through a normalized Employee model, regardless of which HRIS your customer uses. Compensation components, employment status, and core demographics are structured consistently, while leaving normalization policy decisions (like annualization or inclusion rules) explicitly in your control.",{"type":17,"tag":29,"props":234817,"children":234818},{},[234819],{"type":23,"value":234820},"This guide shows how to build a compensation analysis module on top of that model—fetching employees, filtering active staff, normalizing compensation frequencies, and computing totals and averages—without maintaining vendor-specific connectors or embedding undocumented assumptions in your product logic.",{"type":17,"tag":68,"props":234822,"children":234823},{"id":141798},[234824],{"type":23,"value":141801},{"type":17,"tag":80,"props":234826,"children":234827},{},[234828,234832,234841,234851],{"type":17,"tag":84,"props":234829,"children":234830},{},[234831],{"type":23,"value":199683},{"type":17,"tag":84,"props":234833,"children":234834},{},[234835,234836,234840],{"type":23,"value":234004},{"type":17,"tag":48,"props":234837,"children":234838},{},[234839],{"type":23,"value":89846},{"type":23,"value":234010},{"type":17,"tag":84,"props":234842,"children":234843},{},[234844,234845,234849],{"type":23,"value":199693},{"type":17,"tag":133,"props":234846,"children":234847},{"href":7691},[234848],{"type":23,"value":7806},{"type":23,"value":234850}," key (JWT)",{"type":17,"tag":84,"props":234852,"children":234853},{},[234854,234855],{"type":23,"value":234019},{"type":17,"tag":6121,"props":234856,"children":234858},{"className":234857},[],[234859],{"type":23,"value":19766},{"type":17,"tag":68,"props":234861,"children":234862},{"id":211198},[234863],{"type":23,"value":211201},{"type":17,"tag":6893,"props":234865,"children":234868},{"className":234866,"code":234867,"language":48432,"meta":7},[48430],"mkdir compensation-analysis-demo\ncd compensation-analysis-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[234869],{"type":17,"tag":6121,"props":234870,"children":234871},{"__ignoreMap":7},[234872],{"type":23,"value":234867},{"type":17,"tag":29,"props":234874,"children":234875},{},[234876,234877,234882],{"type":23,"value":211215},{"type":17,"tag":6121,"props":234878,"children":234880},{"className":234879},[],[234881],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":234884,"children":234886},{"className":234885,"code":234051,"language":20901,"meta":23},[20899],[234887],{"type":17,"tag":6121,"props":234888,"children":234889},{"__ignoreMap":7},[234890],{"type":23,"value":234051},{"type":17,"tag":68,"props":234892,"children":234893},{"id":211235},[234894],{"type":23,"value":211238},{"type":17,"tag":6893,"props":234896,"children":234899},{"className":234897,"code":234898,"language":18718,"meta":7},[18716],"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_HRIS } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[234900],{"type":17,"tag":6121,"props":234901,"children":234902},{"__ignoreMap":7},[234903],{"type":23,"value":234898},{"type":17,"tag":68,"props":234905,"children":234907},{"id":234906},"step-3-understand-how-compensation-is-represented-in-unified",[234908],{"type":23,"value":234909},"Step 3: Understand how compensation is represented in Unified",{"type":17,"tag":29,"props":234911,"children":234912},{},[234913,234915,234919],{"type":23,"value":234914},"Unified exposes compensation data through the ",{"type":17,"tag":48,"props":234916,"children":234917},{},[234918],{"type":23,"value":61210},{"type":23,"value":234920}," object. There is no separate 'Employment' or 'Compensation' endpoint—everything you need for this use case is embedded in the employee record.",{"type":17,"tag":239,"props":234922,"children":234924},{"id":234923},"employee-hrisemployee",[234925,234927,234932],{"type":23,"value":234926},"Employee (",{"type":17,"tag":6121,"props":234928,"children":234930},{"className":234929},[],[234931],{"type":23,"value":206599},{"type":23,"value":12034},{"type":17,"tag":29,"props":234934,"children":234935},{},[234936],{"type":23,"value":234937},"Each employee includes:",{"type":17,"tag":80,"props":234939,"children":234940},{},[234941,234981,235051,235071],{"type":17,"tag":84,"props":234942,"children":234943},{},[234944,234949,234952,234957,234958,234963,234964,234969,234970,234975,234976],{"type":17,"tag":48,"props":234945,"children":234946},{},[234947],{"type":23,"value":234948},"Identity",{"type":17,"tag":3891,"props":234950,"children":234951},{},[],{"type":17,"tag":6121,"props":234953,"children":234955},{"className":234954},[],[234956],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234959,"children":234961},{"className":234960},[],[234962],{"type":23,"value":62336},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234965,"children":234967},{"className":234966},[],[234968],{"type":23,"value":62341},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234971,"children":234973},{"className":234972},[],[234974],{"type":23,"value":50735},{"type":23,"value":11826},{"type":17,"tag":6121,"props":234977,"children":234979},{"className":234978},[],[234980],{"type":23,"value":62346},{"type":17,"tag":84,"props":234982,"children":234983},{},[234984,234989,234992,234997,234998,235003,235004,235009,235010,235013,235018,235019,235024,235027,235032,235033,235038,235039,235044,235045,235050],{"type":17,"tag":48,"props":234985,"children":234986},{},[234987],{"type":23,"value":234988},"Employment status",{"type":17,"tag":3891,"props":234990,"children":234991},{},[],{"type":17,"tag":6121,"props":234993,"children":234995},{"className":234994},[],[234996],{"type":23,"value":206629},{"type":23,"value":44573},{"type":17,"tag":6121,"props":234999,"children":235001},{"className":235000},[],[235002],{"type":23,"value":183701},{"type":23,"value":26030},{"type":17,"tag":6121,"props":235005,"children":235007},{"className":235006},[],[235008],{"type":23,"value":210788},{"type":23,"value":12034},{"type":17,"tag":3891,"props":235011,"children":235012},{},[],{"type":17,"tag":6121,"props":235014,"children":235016},{"className":235015},[],[235017],{"type":23,"value":132233},{"type":23,"value":11826},{"type":17,"tag":6121,"props":235020,"children":235022},{"className":235021},[],[235023],{"type":23,"value":206687},{"type":17,"tag":3891,"props":235025,"children":235026},{},[],{"type":17,"tag":6121,"props":235028,"children":235030},{"className":235029},[],[235031],{"type":23,"value":75514},{"type":23,"value":44573},{"type":17,"tag":6121,"props":235034,"children":235036},{"className":235035},[],[235037],{"type":23,"value":234160},{"type":23,"value":11826},{"type":17,"tag":6121,"props":235040,"children":235042},{"className":235041},[],[235043],{"type":23,"value":234167},{"type":23,"value":11826},{"type":17,"tag":6121,"props":235046,"children":235048},{"className":235047},[],[235049],{"type":23,"value":234174},{"type":23,"value":149980},{"type":17,"tag":84,"props":235052,"children":235053},{},[235054,235059,235060,235065,235066,235069],{"type":17,"tag":48,"props":235055,"children":235056},{},[235057],{"type":23,"value":235058},"Compensation array",{"type":23,"value":44573},{"type":17,"tag":6121,"props":235061,"children":235063},{"className":235062},[],[235064],{"type":23,"value":234198},{"type":23,"value":12034},{"type":17,"tag":3891,"props":235067,"children":235068},{},[],{"type":23,"value":235070},"Each entry represents one component of the employee's compensation package.",{"type":17,"tag":84,"props":235072,"children":235073},{},[235074,235079,235082,235087,235088,235093,235094,235099,235100,235106,235109],{"type":17,"tag":48,"props":235075,"children":235076},{},[235077],{"type":23,"value":235078},"Optional demographics",{"type":17,"tag":3891,"props":235080,"children":235081},{},[],{"type":17,"tag":6121,"props":235083,"children":235085},{"className":235084},[],[235086],{"type":23,"value":206646},{"type":23,"value":11826},{"type":17,"tag":6121,"props":235089,"children":235091},{"className":235090},[],[235092],{"type":23,"value":206661},{"type":23,"value":11826},{"type":17,"tag":6121,"props":235095,"children":235097},{"className":235096},[],[235098],{"type":23,"value":206670},{"type":23,"value":11826},{"type":17,"tag":6121,"props":235101,"children":235103},{"className":235102},[],[235104],{"type":23,"value":235105},"pronouns",{"type":17,"tag":3891,"props":235107,"children":235108},{},[],{"type":23,"value":235110},"(Availability varies by HRIS and customer configuration.)",{"type":17,"tag":239,"props":235112,"children":235114},{"id":235113},"compensation-entries",[235115],{"type":23,"value":235116},"Compensation entries",{"type":17,"tag":29,"props":235118,"children":235119},{},[235120,235122,235127],{"type":23,"value":235121},"Each item in ",{"type":17,"tag":6121,"props":235123,"children":235125},{"className":235124},[],[235126],{"type":23,"value":234198},{"type":23,"value":132329},{"type":17,"tag":80,"props":235129,"children":235130},{},[235131,235173,235183,235200,235258],{"type":17,"tag":84,"props":235132,"children":235133},{},[235134,235139,235141,235147,235148,235154,235155,235161,235162,235167,235168],{"type":17,"tag":6121,"props":235135,"children":235137},{"className":235136},[],[235138],{"type":23,"value":27310},{"type":23,"value":235140}," — ",{"type":17,"tag":6121,"props":235142,"children":235144},{"className":235143},[],[235145],{"type":23,"value":235146},"SALARY",{"type":23,"value":11826},{"type":17,"tag":6121,"props":235149,"children":235151},{"className":235150},[],[235152],{"type":23,"value":235153},"BONUS",{"type":23,"value":11826},{"type":17,"tag":6121,"props":235156,"children":235158},{"className":235157},[],[235159],{"type":23,"value":235160},"STOCK_OPTIONS",{"type":23,"value":11826},{"type":17,"tag":6121,"props":235163,"children":235165},{"className":235164},[],[235166],{"type":23,"value":219802},{"type":23,"value":11826},{"type":17,"tag":6121,"props":235169,"children":235171},{"className":235170},[],[235172],{"type":23,"value":149660},{"type":17,"tag":84,"props":235174,"children":235175},{},[235176,235181],{"type":17,"tag":6121,"props":235177,"children":235179},{"className":235178},[],[235180],{"type":23,"value":25890},{"type":23,"value":235182}," — numeric value",{"type":17,"tag":84,"props":235184,"children":235185},{},[235186,235191,235193,235199],{"type":17,"tag":6121,"props":235187,"children":235189},{"className":235188},[],[235190],{"type":23,"value":22296},{"type":23,"value":235192}," — ISO currency code (e.g. ",{"type":17,"tag":6121,"props":235194,"children":235196},{"className":235195},[],[235197],{"type":23,"value":235198},"USD",{"type":23,"value":12034},{"type":17,"tag":84,"props":235201,"children":235202},{},[235203,235209,235210,235216,235217,235223,235224,235230,235231,235237,235238,235244,235245,235251,235252],{"type":17,"tag":6121,"props":235204,"children":235206},{"className":235205},[],[235207],{"type":23,"value":235208},"frequency",{"type":23,"value":235140},{"type":17,"tag":6121,"props":235211,"children":235213},{"className":235212},[],[235214],{"type":23,"value":235215},"ONE_TIME",{"type":23,"value":11826},{"type":17,"tag":6121,"props":235218,"children":235220},{"className":235219},[],[235221],{"type":23,"value":235222},"DAY",{"type":23,"value":11826},{"type":17,"tag":6121,"props":235225,"children":235227},{"className":235226},[],[235228],{"type":23,"value":235229},"QUARTER",{"type":23,"value":11826},{"type":17,"tag":6121,"props":235232,"children":235234},{"className":235233},[],[235235],{"type":23,"value":235236},"YEAR",{"type":23,"value":11826},{"type":17,"tag":6121,"props":235239,"children":235241},{"className":235240},[],[235242],{"type":23,"value":235243},"HOUR",{"type":23,"value":11826},{"type":17,"tag":6121,"props":235246,"children":235248},{"className":235247},[],[235249],{"type":23,"value":235250},"MONTH",{"type":23,"value":11826},{"type":17,"tag":6121,"props":235253,"children":235255},{"className":235254},[],[235256],{"type":23,"value":235257},"WEEK",{"type":17,"tag":84,"props":235259,"children":235260},{},[235261,235266],{"type":17,"tag":6121,"props":235262,"children":235264},{"className":235263},[],[235265],{"type":23,"value":47281},{"type":23,"value":235267}," — optional reference to an HRIS group (e.g. department)",{"type":17,"tag":29,"props":235269,"children":235270},{},[235271],{"type":23,"value":194883},{"type":17,"tag":80,"props":235273,"children":235274},{},[235275,235286,235291],{"type":17,"tag":84,"props":235276,"children":235277},{},[235278,235280,235284],{"type":23,"value":235279},"Compensation entries represent the ",{"type":17,"tag":48,"props":235281,"children":235282},{},[235283],{"type":23,"value":10763},{"type":23,"value":235285},", not an effective-dated history.",{"type":17,"tag":84,"props":235287,"children":235288},{},[235289],{"type":23,"value":235290},"There are no start/end dates on compensation records.",{"type":17,"tag":84,"props":235292,"children":235293},{},[235294],{"type":23,"value":235295},"Multiple entries can exist per employee to represent different pay components (salary + bonus + equity).",{"type":17,"tag":68,"props":235297,"children":235299},{"id":235298},"step-4-fetch-all-employees-with-pagination",[235300],{"type":23,"value":235301},"Step 4: Fetch all employees (with pagination)",{"type":17,"tag":6893,"props":235303,"children":235306},{"className":235304,"code":235305,"language":18718,"meta":7},[18716],"type HrisEmployee = {\n  id?: string;\n  title?: string;\n  employment_status?: 'ACTIVE' | 'INACTIVE';\n  terminated_at?: string | null;\n  employment_type?: string;\n  gender?: string;\n  compensation?: {\n    type?: 'SALARY' | 'BONUS' | 'STOCK_OPTIONS' | 'EQUITY' | 'OTHER';\n    amount?: number;\n    currency?: string;\n    frequency?: 'ONE_TIME' | 'DAY' | 'QUARTER' | 'YEAR' | 'HOUR' | 'MONTH' | 'WEEK';\n  }[];\n};\n\nexport async function fetchAllEmployees(\n  connectionId: string,\n  pageSize = 100\n): Promise\u003CHrisEmployee[]> {\n  let offset = 0;\n  const employees: HrisEmployee[] = [];\n\n  while (true) {\n    const page = await sdk.hris.listHrisEmployees({\n      connectionId,\n      limit: pageSize,\n      offset,\n      fields: 'id,title,employment_status,terminated_at,employment_type,gender,compensation'\n    });\n\n    if (!page || page.length === 0) break;\n\n    employees.push(...page);\n    offset += pageSize;\n  }\n\n  return employees;\n}\n",[235307],{"type":17,"tag":6121,"props":235308,"children":235309},{"__ignoreMap":7},[235310],{"type":23,"value":235305},{"type":17,"tag":68,"props":235312,"children":235314},{"id":235313},"step-5-filter-active-employees",[235315],{"type":23,"value":235316},"Step 5: Filter active employees",{"type":17,"tag":6893,"props":235318,"children":235321},{"className":235319,"code":235320,"language":18718,"meta":7},[18716],"export function filterActiveEmployees(\n  employees: HrisEmployee[]\n): HrisEmployee[] {\n  return employees.filter(\n    (e) => e.employment_status === 'ACTIVE' && !e.terminated_at\n  );\n}\n",[235322],{"type":17,"tag":6121,"props":235323,"children":235324},{"__ignoreMap":7},[235325],{"type":23,"value":235320},{"type":17,"tag":68,"props":235327,"children":235329},{"id":235328},"step-6-normalize-compensation-amounts-policy-dependent",[235330],{"type":23,"value":235331},"Step 6: Normalize compensation amounts (policy-dependent)",{"type":17,"tag":29,"props":235333,"children":235334},{},[235335],{"type":23,"value":235336},"Compensation entries use different frequencies. To aggregate meaningfully, normalize amounts to a common time basis (for example, annualized).",{"type":17,"tag":3414,"props":235338,"children":235339},{},[235340],{"type":17,"tag":29,"props":235341,"children":235342},{},[235343],{"type":23,"value":235344},"Note: The multipliers below are defaults. You should adjust them to match your organization's working-hour and working-day policies.",{"type":17,"tag":6893,"props":235346,"children":235349},{"className":235347,"code":235348,"language":18718,"meta":7},[18716],"const frequencyMultiplier: Record\u003Cstring, number> = {\n  YEAR: 1,\n  QUARTER: 4,\n  MONTH: 12,\n  WEEK: 52,\n  DAY: 260,   // policy assumption\n  HOUR: 2080, // policy assumption\n  ONE_TIME: 1,\n};\n\nfunction normalizeAmount(amount: number, frequency: string): number {\n  return amount * (frequencyMultiplier[frequency] ?? 1);\n}\n",[235350],{"type":17,"tag":6121,"props":235351,"children":235352},{"__ignoreMap":7},[235353],{"type":23,"value":235348},{"type":17,"tag":68,"props":235355,"children":235357},{"id":235356},"step-7-aggregate-compensation-per-employee-currency-safe",[235358],{"type":23,"value":235359},"Step 7: Aggregate compensation per employee (currency-safe)",{"type":17,"tag":29,"props":235361,"children":235362},{},[235363,235365,235370],{"type":23,"value":235364},"Instead of aggregating per compensation record, first compute ",{"type":17,"tag":48,"props":235366,"children":235367},{},[235368],{"type":23,"value":235369},"total compensation per employee",{"type":23,"value":235371},", grouped by currency.",{"type":17,"tag":6893,"props":235373,"children":235376},{"className":235374,"code":235375,"language":18718,"meta":7},[18716],"type EmployeeCompTotal = {\n  employee_id: string;\n  title?: string;\n  employment_type?: string;\n  gender?: string;\n  totals_by_currency: Record\u003Cstring, number>;\n};\n\nexport function aggregatePerEmployee(\n  employees: HrisEmployee[]\n): EmployeeCompTotal[] {\n  const results: EmployeeCompTotal[] = [];\n\n  for (const e of employees) {\n    if (!e.id) continue;\n\n    const totals: Record\u003Cstring, number> = {};\n\n    for (const c of e.compensation ?? []) {\n      if (c.amount == null || !c.currency || !c.frequency) continue;\n\n      const normalized = normalizeAmount(c.amount, c.frequency);\n      totals[c.currency] = (totals[c.currency] ?? 0) + normalized;\n    }\n\n    results.push({\n      employee_id: e.id,\n      title: e.title,\n      employment_type: e.employment_type,\n      gender: e.gender,\n      totals_by_currency: totals,\n    });\n  }\n\n  return results;\n}\n",[235377],{"type":17,"tag":6121,"props":235378,"children":235379},{"__ignoreMap":7},[235380],{"type":23,"value":235375},{"type":17,"tag":68,"props":235382,"children":235384},{"id":235383},"step-8-compute-totals-and-averages",[235385],{"type":23,"value":235386},"Step 8: Compute totals and averages",{"type":17,"tag":239,"props":235388,"children":235390},{"id":235389},"total-compensation-by-currency",[235391],{"type":23,"value":235392},"Total compensation (by currency)",{"type":17,"tag":6893,"props":235394,"children":235397},{"className":235395,"code":235396,"language":18718,"meta":7},[18716],"export function totalCompensationByCurrency(\n  employees: EmployeeCompTotal[]\n): Record\u003Cstring, number> {\n  const totals: Record\u003Cstring, number> = {};\n\n  for (const e of employees) {\n    for (const [currency, amount] of Object.entries(e.totals_by_currency)) {\n      totals[currency] = (totals[currency] ?? 0) + amount;\n    }\n  }\n\n  return totals;\n}\n",[235398],{"type":17,"tag":6121,"props":235399,"children":235400},{"__ignoreMap":7},[235401],{"type":23,"value":235396},{"type":17,"tag":239,"props":235403,"children":235405},{"id":235404},"average-pay-by-role-per-employee",[235406],{"type":23,"value":235407},"Average pay by role (per employee)",{"type":17,"tag":6893,"props":235409,"children":235412},{"className":235410,"code":235411,"language":18718,"meta":7},[18716],"export function averagePayByRole(\n  employees: EmployeeCompTotal[]\n): Record\u003Cstring, Record\u003Cstring, number>> {\n  const totals: Record\u003Cstring, Record\u003Cstring, number>> = {};\n  const counts: Record\u003Cstring, number> = {};\n\n  for (const e of employees) {\n    const role = e.title ?? 'Unknown';\n    counts[role] = (counts[role] ?? 0) + 1;\n\n    for (const [currency, amount] of Object.entries(e.totals_by_currency)) {\n      totals[role] ??= {};\n      totals[role][currency] = (totals[role][currency] ?? 0) + amount;\n    }\n  }\n\n  const averages: Record\u003Cstring, Record\u003Cstring, number>> = {};\n  for (const role of Object.keys(totals)) {\n    averages[role] = {};\n    for (const [currency, total] of Object.entries(totals[role])) {\n      averages[role][currency] = total / counts[role];\n    }\n  }\n\n  return averages;\n}\n",[235413],{"type":17,"tag":6121,"props":235414,"children":235415},{"__ignoreMap":7},[235416],{"type":23,"value":235411},{"type":17,"tag":239,"props":235418,"children":235420},{"id":235419},"optional-breakdown-by-demographic-field",[235421],{"type":23,"value":235422},"Optional: breakdown by demographic field",{"type":17,"tag":6893,"props":235424,"children":235427},{"className":235425,"code":235426,"language":18718,"meta":7},[18716],"export function breakdownByField(\n  employees: EmployeeCompTotal[],\n  field: 'gender' | 'employment_type'\n): Record\u003Cstring, Record\u003Cstring, number>> {\n  const totals: Record\u003Cstring, Record\u003Cstring, number>> = {};\n\n  for (const e of employees) {\n    const key = (e as any)[field] ?? 'Unknown';\n\n    totals[key] ??= {};\n    for (const [currency, amount] of Object.entries(e.totals_by_currency)) {\n      totals[key][currency] = (totals[key][currency] ?? 0) + amount;\n    }\n  }\n\n  return totals;\n}\n",[235428],{"type":17,"tag":6121,"props":235429,"children":235430},{"__ignoreMap":7},[235431],{"type":23,"value":235426},{"type":17,"tag":68,"props":235433,"children":235435},{"id":235434},"step-9-putting-it-all-together",[235436],{"type":23,"value":235437},"Step 9: Putting it all together",{"type":17,"tag":6893,"props":235439,"children":235442},{"className":235440,"code":235441,"language":18718,"meta":7},[18716],"async function main() {\n  const employees = await fetchAllEmployees(CONNECTION_HRIS!);\n  const active = filterActiveEmployees(employees);\n  const perEmployee = aggregatePerEmployee(active);\n\n  console.log('Total compensation by currency:');\n  console.log(totalCompensationByCurrency(perEmployee));\n\n  console.log('Average pay by role:');\n  console.log(averagePayByRole(perEmployee));\n\n  console.log('Compensation by gender:');\n  console.log(breakdownByField(perEmployee, 'gender'));\n}\n\nmain().catch(console.error);\n",[235443],{"type":17,"tag":6121,"props":235444,"children":235445},{"__ignoreMap":7},[235446],{"type":23,"value":235441},{"type":17,"tag":29,"props":235448,"children":235449},{},[235450],{"type":23,"value":235451},"With Unified's HR & Directory API, compensation analysis becomes a straightforward data problem instead of a vendor-specific integration challenge. By relying on the normalized Employee model and its embedded compensation records, you can compute totals, averages, and demographic breakdowns across HRIS platforms using the same code path.",{"type":17,"tag":29,"props":235453,"children":235454},{},[235455],{"type":23,"value":2849},{"type":17,"tag":80,"props":235457,"children":235458},{},[235459,235464,235469,235474],{"type":17,"tag":84,"props":235460,"children":235461},{},[235462],{"type":23,"value":235463},"Real-time access to current compensation",{"type":17,"tag":84,"props":235465,"children":235466},{},[235467],{"type":23,"value":235468},"Currency-safe aggregation",{"type":17,"tag":84,"props":235470,"children":235471},{},[235472],{"type":23,"value":235473},"Explicit, policy-controlled normalization",{"type":17,"tag":84,"props":235475,"children":235476},{},[235477],{"type":23,"value":235478},"A clean foundation for FP&A, HR analytics, and pay-equity tooling",{"type":17,"tag":29,"props":235480,"children":235481},{},[235482],{"type":23,"value":235483},"From here, common extensions include grouping by department or location, incorporating benefits and deductions for total-rewards analysis, or layering in historical tracking using HRIS-specific metadata when available.",{"type":17,"tag":29,"props":235485,"children":235486},{},[235487,235488],{"type":23,"value":1609},{"type":17,"tag":133,"props":235489,"children":235491},{"href":1612,"rel":235490},[214],[235492],{"type":23,"value":1616},{"type":17,"tag":29,"props":235494,"children":235495},{},[235496,235497],{"type":23,"value":1609},{"type":17,"tag":133,"props":235498,"children":235500},{"href":1623,"rel":235499},[214],[235501],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":235503},[235504,235505,235506,235507,235512,235513,235514,235515,235516,235521],{"id":141798,"depth":1629,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":234906,"depth":1629,"text":234909,"children":235508},[235509,235511],{"id":234923,"depth":1635,"text":235510},"Employee (HrisEmployee)",{"id":235113,"depth":1635,"text":235116},{"id":235298,"depth":1629,"text":235301},{"id":235313,"depth":1629,"text":235316},{"id":235328,"depth":1629,"text":235331},{"id":235356,"depth":1629,"text":235359},{"id":235383,"depth":1629,"text":235386,"children":235517},[235518,235519,235520],{"id":235389,"depth":1635,"text":235392},{"id":235404,"depth":1635,"text":235407},{"id":235419,"depth":1635,"text":235422},{"id":235434,"depth":1629,"text":235437},"content:blog:how_to_analyze_compensation_with_unified_hr_and_directory_api.md","blog/how_to_analyze_compensation_with_unified_hr_and_directory_api.md","blog/how_to_analyze_compensation_with_unified_hr_and_directory_api",{"_path":235526,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":235527,"description":235528,"img":235529,"date":234743,"tag":12,"body":235530,"_type":1677,"_id":236080,"_source":1679,"_file":236081,"_stem":236082,"_extension":1682},"/blog/how_to_analyze_sales_rep_performance_with_unified_crm_api","How to Analyze Sales Rep Performance with Unified's CRM API","Sales performance features often start life as dashboards. They fail when the underlying data contract isn't stable.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_analyze_sales_rep_performance_with_unified_crm_api-icon.png",{"type":14,"children":235531,"toc":236065},[235532,235537,235540,235547,235551,235556,235561,235579,235584,235594,235599,235603,235639,235647,235653,235661,235667,235672,235677,235686,235693,235754,235760,235772,235781,235787,235804,235813,235819,235831,235840,235846,235858,235864,235873,235879,235888,235900,235906,235911,235951,235957,235962,236005,236010,236014,236019,236047,236056],{"type":17,"tag":18,"props":235533,"children":235535},{"id":235534},"how-to-analyze-sales-rep-performance-with-unifieds-crm-api",[235536],{"type":23,"value":235527},{"type":17,"tag":25,"props":235538,"children":235539},{},[],{"type":17,"tag":29,"props":235541,"children":235542},{},[235543],{"type":17,"tag":33,"props":235544,"children":235545},{},[235546],{"type":23,"value":234761},{"type":17,"tag":29,"props":235548,"children":235549},{},[235550],{"type":23,"value":235528},{"type":17,"tag":29,"props":235552,"children":235553},{},[235554],{"type":23,"value":235555},"Once you support multiple CRMs, 'rep performance' stops meaning one thing. Ownership can be a user, a team, or reassigned mid-deal. Deal status isn't always explicit. Probability may be inferred from stage, overridden manually, or ignored entirely. Historical context may or may not exist depending on how the CRM was configured.",{"type":17,"tag":29,"props":235557,"children":235558},{},[235559],{"type":23,"value":235560},"For a PM, this creates sharp edges:",{"type":17,"tag":80,"props":235562,"children":235563},{},[235564,235569,235574],{"type":17,"tag":84,"props":235565,"children":235566},{},[235567],{"type":23,"value":235568},"Can performance metrics be trusted across Salesforce, HubSpot, and Zoho?",{"type":17,"tag":84,"props":235570,"children":235571},{},[235572],{"type":23,"value":235573},"Are reps being measured on closed revenue, pipeline, or a mix of both?",{"type":17,"tag":84,"props":235575,"children":235576},{},[235577],{"type":23,"value":235578},"Can you explain why a number changed if the CRM didn't record history?",{"type":17,"tag":29,"props":235580,"children":235581},{},[235582],{"type":23,"value":235583},"Many products quietly blur these distinctions. Metrics are computed from cached data, undocumented fields, or assumptions that only hold for one CRM. The result looks correct—until a customer asks how it was calculated.",{"type":17,"tag":29,"props":235585,"children":235586},{},[235587,235588,235592],{"type":23,"value":25244},{"type":17,"tag":133,"props":235589,"children":235590},{"href":61562},[235591],{"type":23,"value":61565},{"type":23,"value":235593}," is designed to make those boundaries explicit. It exposes a real-time, normalized view of deals and ownership, without storing snapshots or inventing state. What you compute is always based on the current CRM truth, using documented fields only.",{"type":17,"tag":29,"props":235595,"children":235596},{},[235597],{"type":23,"value":235598},"This guide shows how to analyze sales rep performance using that model—attributing deals to reps, calculating revenue and weighted pipeline, and optionally enriching reps via HRIS—while staying honest about what can and cannot be computed without your own storage layer.",{"type":17,"tag":68,"props":235600,"children":235601},{"id":141798},[235602],{"type":23,"value":141801},{"type":17,"tag":80,"props":235604,"children":235605},{},[235606,235610,235614,235618,235628],{"type":17,"tag":84,"props":235607,"children":235608},{},[235609],{"type":23,"value":219393},{"type":17,"tag":84,"props":235611,"children":235612},{},[235613],{"type":23,"value":199688},{"type":17,"tag":84,"props":235615,"children":235616},{},[235617],{"type":23,"value":224054},{"type":17,"tag":84,"props":235619,"children":235620},{},[235621,235623],{"type":23,"value":235622},"A CRM ",{"type":17,"tag":6121,"props":235624,"children":235626},{"className":235625},[],[235627],{"type":23,"value":25037},{"type":17,"tag":84,"props":235629,"children":235630},{},[235631,235637],{"type":17,"tag":6121,"props":235632,"children":235634},{"className":235633},[],[235635],{"type":23,"value":235636},"@unified-api/typescript-sdk",{"type":23,"value":235638}," (v2.82.14)",{"type":17,"tag":6893,"props":235640,"children":235642},{"className":235641,"code":224079,"language":48432,"meta":7},[48430],[235643],{"type":17,"tag":6121,"props":235644,"children":235645},{"__ignoreMap":7},[235646],{"type":23,"value":224079},{"type":17,"tag":68,"props":235648,"children":235650},{"id":235649},"initialize-the-sdk",[235651],{"type":23,"value":235652},"Initialize the SDK",{"type":17,"tag":6893,"props":235654,"children":235656},{"className":235655,"code":219429,"language":18718,"meta":7},[18716],[235657],{"type":17,"tag":6121,"props":235658,"children":235659},{"__ignoreMap":7},[235660],{"type":23,"value":219429},{"type":17,"tag":68,"props":235662,"children":235664},{"id":235663},"step-1-fetch-deals-real-time",[235665],{"type":23,"value":235666},"Step 1: Fetch Deals (Real-Time)",{"type":17,"tag":29,"props":235668,"children":235669},{},[235670],{"type":23,"value":235671},"Unified's CRM API is real-time passthrough. Every request hits the source CRM live; there are no cached snapshots.",{"type":17,"tag":29,"props":235673,"children":235674},{},[235675],{"type":23,"value":235676},"We'll fetch only the fields required for performance analysis.",{"type":17,"tag":6893,"props":235678,"children":235681},{"className":235679,"code":235680,"language":18718,"meta":7},[18716],"const connectionId = 'YOUR_CONNECTION_ID';\n\nconst deals = await sdk.crm.listCrmDeals({\n  connectionId,\n  limit: 100,\n  offset: 0,\n  // Optional incremental fetch:\n  // updated_gte: '2026-01-11T00:00:00Z',\n  fields: [\n    'id',\n    'user_id',\n    'amount',\n    'currency',\n    'probability',\n    'closed_at',\n    'closing_at',\n    'stage',\n    'pipeline',\n    'won_reason',\n    'lost_reason',\n  ],\n});\n",[235682],{"type":17,"tag":6121,"props":235683,"children":235684},{"__ignoreMap":7},[235685],{"type":23,"value":235680},{"type":17,"tag":29,"props":235687,"children":235688},{},[235689],{"type":17,"tag":48,"props":235690,"children":235691},{},[235692],{"type":23,"value":6701},{"type":17,"tag":80,"props":235694,"children":235695},{},[235696,235718,235738,235749],{"type":17,"tag":84,"props":235697,"children":235698},{},[235699,235701,235710,235711,235716],{"type":23,"value":235700},"Returns a ",{"type":17,"tag":48,"props":235702,"children":235703},{},[235704],{"type":17,"tag":6121,"props":235705,"children":235707},{"className":235706},[],[235708],{"type":23,"value":235709},"CrmDeal[]",{"type":23,"value":18757},{"type":17,"tag":48,"props":235712,"children":235713},{},[235714],{"type":23,"value":235715},"array",{"type":23,"value":235717}," (no cursor wrapper).",{"type":17,"tag":84,"props":235719,"children":235720},{},[235721,235725,235726,235731,235732,235737],{"type":17,"tag":133,"props":235722,"children":235723},{"href":1857},[235724],{"type":23,"value":2409},{"type":23,"value":219640},{"type":17,"tag":6121,"props":235727,"children":235729},{"className":235728},[],[235730],{"type":23,"value":48389},{"type":23,"value":89280},{"type":17,"tag":6121,"props":235733,"children":235735},{"className":235734},[],[235736],{"type":23,"value":48411},{"type":23,"value":54},{"type":17,"tag":84,"props":235739,"children":235740},{},[235741,235743,235748],{"type":23,"value":235742},"Filtering by rep is supported via ",{"type":17,"tag":6121,"props":235744,"children":235746},{"className":235745},[],[235747],{"type":23,"value":62582},{"type":23,"value":54},{"type":17,"tag":84,"props":235750,"children":235751},{},[235752],{"type":23,"value":235753},"There is no status filter; infer open/won/lost from fields.",{"type":17,"tag":68,"props":235755,"children":235757},{"id":235756},"step-2-attribute-deals-to-reps",[235758],{"type":23,"value":235759},"Step 2: Attribute Deals to Reps",{"type":17,"tag":29,"props":235761,"children":235762},{},[235763,235765,235770],{"type":23,"value":235764},"Each deal has ",{"type":17,"tag":6121,"props":235766,"children":235768},{"className":235767},[],[235769],{"type":23,"value":62582},{"type":23,"value":235771},", which references an HRIS employee.",{"type":17,"tag":6893,"props":235773,"children":235776},{"className":235774,"code":235775,"language":18718,"meta":7},[18716],"type Deal = typeof deals[number];\n\nfunction filterDealsByRep(allDeals: Deal[], repId: string): Deal[] {\n  return allDeals.filter(d => d.user_id === repId);\n}\n",[235777],{"type":17,"tag":6121,"props":235778,"children":235779},{"__ignoreMap":7},[235780],{"type":23,"value":235775},{"type":17,"tag":68,"props":235782,"children":235784},{"id":235783},"step-3-aggregate-revenue-currency-safe",[235785],{"type":23,"value":235786},"Step 3: Aggregate Revenue (Currency-Safe)",{"type":17,"tag":29,"props":235788,"children":235789},{},[235790,235792,235796,235798,235803],{"type":23,"value":235791},"Unified does ",{"type":17,"tag":48,"props":235793,"children":235794},{},[235795],{"type":23,"value":159475},{"type":23,"value":235797}," convert currencies. Aggregate per rep ",{"type":17,"tag":48,"props":235799,"children":235800},{},[235801],{"type":23,"value":235802},"per currency",{"type":23,"value":54},{"type":17,"tag":6893,"props":235805,"children":235808},{"className":235806,"code":235807,"language":18718,"meta":7},[18716],"type RevenueByCurrency = Record\u003Cstring, number>;\ntype RevenueByRep = Record\u003Cstring, RevenueByCurrency>;\n\nfunction aggregateRevenueByRep(allDeals: Deal[]): RevenueByRep {\n  const result: RevenueByRep = {};\n\n  for (const d of allDeals) {\n    if (!d.user_id || typeof d.amount !== 'number' || !d.currency) continue;\n\n    result[d.user_id] ??= {};\n    result[d.user_id][d.currency] ??= 0;\n    result[d.user_id][d.currency] += d.amount;\n  }\n\n  return result;\n}\n",[235809],{"type":17,"tag":6121,"props":235810,"children":235811},{"__ignoreMap":7},[235812],{"type":23,"value":235807},{"type":17,"tag":68,"props":235814,"children":235816},{"id":235815},"step-4-weighted-pipeline-optional",[235817],{"type":23,"value":235818},"Step 4: Weighted Pipeline (Optional)",{"type":17,"tag":29,"props":235820,"children":235821},{},[235822,235823,235829],{"type":23,"value":33722},{"type":17,"tag":6121,"props":235824,"children":235826},{"className":235825},[],[235827],{"type":23,"value":235828},"amount × probability",{"type":23,"value":235830}," for open deals.",{"type":17,"tag":6893,"props":235832,"children":235835},{"className":235833,"code":235834,"language":18718,"meta":7},[18716],"type WeightedByRep = Record\u003Cstring, RevenueByCurrency>;\n\nfunction aggregateWeightedPipeline(allDeals: Deal[]): WeightedByRep {\n  const result: WeightedByRep = {};\n\n  for (const d of allDeals) {\n    if (\n      !d.user_id ||\n      typeof d.amount !== 'number' ||\n      typeof d.probability !== 'number' ||\n      !d.currency ||\n      d.closed_at // skip closed deals\n    ) continue;\n\n    const weighted = d.amount * d.probability;\n\n    result[d.user_id] ??= {};\n    result[d.user_id][d.currency] ??= 0;\n    result[d.user_id][d.currency] += weighted;\n  }\n\n  return result;\n}\n",[235836],{"type":17,"tag":6121,"props":235837,"children":235838},{"__ignoreMap":7},[235839],{"type":23,"value":235834},{"type":17,"tag":68,"props":235841,"children":235843},{"id":235842},"step-5-resolve-rep-names-optional-hris",[235844],{"type":23,"value":235845},"Step 5: Resolve Rep Names (Optional, HRIS)",{"type":17,"tag":29,"props":235847,"children":235848},{},[235849,235851,235856],{"type":23,"value":235850},"Deals only carry ",{"type":17,"tag":6121,"props":235852,"children":235854},{"className":235853},[],[235855],{"type":23,"value":62582},{"type":23,"value":235857},". To show rep names/emails, resolve via HRIS.",{"type":17,"tag":239,"props":235859,"children":235861},{"id":235860},"retrieve-a-single-employee",[235862],{"type":23,"value":235863},"Retrieve a Single Employee",{"type":17,"tag":6893,"props":235865,"children":235868},{"className":235866,"code":235867,"language":18718,"meta":7},[18716],"const rep = await sdk.hris.getHrisEmployee({\n  connectionId,\n  id: 'EMPLOYEE_ID',\n  fields: ['id', 'name', 'emails', 'title'],\n});\n",[235869],{"type":17,"tag":6121,"props":235870,"children":235871},{"__ignoreMap":7},[235872],{"type":23,"value":235867},{"type":17,"tag":239,"props":235874,"children":235876},{"id":235875},"or-list-employees-bulk-join",[235877],{"type":23,"value":235878},"Or List Employees (Bulk Join)",{"type":17,"tag":6893,"props":235880,"children":235883},{"className":235881,"code":235882,"language":18718,"meta":7},[18716],"const employees = await sdk.hris.listHrisEmployees({\n  connectionId,\n  limit: 100,\n  offset: 0,\n  fields: ['id', 'name', 'emails'],\n});\n",[235884],{"type":17,"tag":6121,"props":235885,"children":235886},{"__ignoreMap":7},[235887],{"type":23,"value":235882},{"type":17,"tag":29,"props":235889,"children":235890},{},[235891,235893,235898],{"type":23,"value":235892},"Build a lookup map by ",{"type":17,"tag":6121,"props":235894,"children":235896},{"className":235895},[],[235897],{"type":23,"value":18766},{"type":23,"value":235899}," and join to your aggregates.",{"type":17,"tag":68,"props":235901,"children":235903},{"id":235902},"what-you-can-compute-reliably",[235904],{"type":23,"value":235905},"What You Can Compute Reliably",{"type":17,"tag":29,"props":235907,"children":235908},{},[235909],{"type":23,"value":235910},"Based on documented fields and real-time semantics:",{"type":17,"tag":80,"props":235912,"children":235913},{},[235914,235919,235924,235929,235934,235946],{"type":17,"tag":84,"props":235915,"children":235916},{},[235917],{"type":23,"value":235918},"Total revenue per rep (by currency)",{"type":17,"tag":84,"props":235920,"children":235921},{},[235922],{"type":23,"value":235923},"Average deal size per rep",{"type":17,"tag":84,"props":235925,"children":235926},{},[235927],{"type":23,"value":235928},"Deal counts per rep",{"type":17,"tag":84,"props":235930,"children":235931},{},[235932],{"type":23,"value":235933},"Weighted pipeline (amount × probability)",{"type":17,"tag":84,"props":235935,"children":235936},{},[235937,235939,235945],{"type":23,"value":235938},"Sales cycle length (for closed deals: ",{"type":17,"tag":6121,"props":235940,"children":235942},{"className":235941},[],[235943],{"type":23,"value":235944},"closed_at - created_at",{"type":23,"value":12034},{"type":17,"tag":84,"props":235947,"children":235948},{},[235949],{"type":23,"value":235950},"Current pipeline distribution by stage",{"type":17,"tag":68,"props":235952,"children":235954},{"id":235953},"what-you-cannot-compute-without-your-own-storage",[235955],{"type":23,"value":235956},"What You Cannot Compute (Without Your Own Storage)",{"type":17,"tag":29,"props":235958,"children":235959},{},[235960],{"type":23,"value":235961},"These are constrained by documented behavior:",{"type":17,"tag":80,"props":235963,"children":235964},{},[235965,235975,235985,235995],{"type":17,"tag":84,"props":235966,"children":235967},{},[235968,235973],{"type":17,"tag":48,"props":235969,"children":235970},{},[235971],{"type":23,"value":235972},"Stage velocity / conversion rates",{"type":23,"value":235974}," (no stage history)",{"type":17,"tag":84,"props":235976,"children":235977},{},[235978,235983],{"type":17,"tag":48,"props":235979,"children":235980},{},[235981],{"type":23,"value":235982},"Historical trends",{"type":23,"value":235984}," (no snapshots; current-state only)",{"type":17,"tag":84,"props":235986,"children":235987},{},[235988,235993],{"type":17,"tag":48,"props":235989,"children":235990},{},[235991],{"type":23,"value":235992},"Cross-currency rollups",{"type":23,"value":235994}," (no conversion)",{"type":17,"tag":84,"props":235996,"children":235997},{},[235998,236003],{"type":17,"tag":48,"props":235999,"children":236000},{},[236001],{"type":23,"value":236002},"Explicit status filtering",{"type":23,"value":236004}," (no status enum)",{"type":17,"tag":29,"props":236006,"children":236007},{},[236008],{"type":23,"value":236009},"If you need these, persist deal snapshots on your side.",{"type":17,"tag":68,"props":236011,"children":236012},{"id":44585},[236013],{"type":23,"value":44588},{"type":17,"tag":29,"props":236015,"children":236016},{},[236017],{"type":23,"value":236018},"Using Unified's CRM API, you can analyze sales rep performance with live, normalized data:",{"type":17,"tag":80,"props":236020,"children":236021},{},[236022,236027,236037,236042],{"type":17,"tag":84,"props":236023,"children":236024},{},[236025],{"type":23,"value":236026},"Fetch deals in real time",{"type":17,"tag":84,"props":236028,"children":236029},{},[236030,236032],{"type":23,"value":236031},"Attribute to reps via ",{"type":17,"tag":6121,"props":236033,"children":236035},{"className":236034},[],[236036],{"type":23,"value":62582},{"type":17,"tag":84,"props":236038,"children":236039},{},[236040],{"type":23,"value":236041},"Aggregate revenue and weighted pipeline safely",{"type":17,"tag":84,"props":236043,"children":236044},{},[236045],{"type":23,"value":236046},"Optionally enrich reps via HRIS",{"type":17,"tag":29,"props":236048,"children":236049},{},[236050,236051],{"type":23,"value":1609},{"type":17,"tag":133,"props":236052,"children":236054},{"href":1612,"rel":236053},[214],[236055],{"type":23,"value":1616},{"type":17,"tag":29,"props":236057,"children":236058},{},[236059,236060],{"type":23,"value":1609},{"type":17,"tag":133,"props":236061,"children":236063},{"href":1623,"rel":236062},[214],[236064],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":236066},[236067,236068,236069,236070,236071,236072,236073,236077,236078,236079],{"id":141798,"depth":1629,"text":141801},{"id":235649,"depth":1629,"text":235652},{"id":235663,"depth":1629,"text":235666},{"id":235756,"depth":1629,"text":235759},{"id":235783,"depth":1629,"text":235786},{"id":235815,"depth":1629,"text":235818},{"id":235842,"depth":1629,"text":235845,"children":236074},[236075,236076],{"id":235860,"depth":1635,"text":235863},{"id":235875,"depth":1635,"text":235878},{"id":235902,"depth":1629,"text":235905},{"id":235953,"depth":1629,"text":235956},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_analyze_sales_rep_performance_with_unified_crm_api.md","blog/how_to_analyze_sales_rep_performance_with_unified_crm_api.md","blog/how_to_analyze_sales_rep_performance_with_unified_crm_api",{"_path":236084,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":236085,"description":236086,"img":236087,"date":234743,"tag":12,"body":236088,"_type":1677,"_id":236996,"_source":1679,"_file":236997,"_stem":236998,"_extension":1682},"/blog/how_to_forecast_revenue_with_unified_crm_api","How to Forecast Revenue with Unified's CRM API","Revenue forecasting looks like a math problem. In reality, it's a data consistency problem that shows up in product decisions.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_forecast_revenue_with_unified_crm_api-icon.png",{"type":14,"children":236089,"toc":236977},[236090,236095,236098,236105,236109,236114,236119,236137,236142,236165,236170,236174,236206,236210,236219,236229,236237,236241,236250,236256,236268,236278,236283,236396,236406,236411,236495,236501,236506,236522,236564,236576,236585,236591,236596,236605,236630,236639,236651,236682,236716,236722,236731,236737,236746,236758,236764,236769,236789,236793,236809,236818,236824,236829,236844,236853,236857,236862,236871,236876,236881,236959,236968],{"type":17,"tag":18,"props":236091,"children":236093},{"id":236092},"how-to-forecast-revenue-with-unifieds-crm-api",[236094],{"type":23,"value":236085},{"type":17,"tag":25,"props":236096,"children":236097},{},[],{"type":17,"tag":29,"props":236099,"children":236100},{},[236101],{"type":17,"tag":33,"props":236102,"children":236103},{},[236104],{"type":23,"value":234761},{"type":17,"tag":29,"props":236106,"children":236107},{},[236108],{"type":23,"value":236086},{"type":17,"tag":29,"props":236110,"children":236111},{},[236112],{"type":23,"value":236113},"Once you support more than one CRM, the meaning of a 'forecast' starts to vary. Deal stages imply different probabilities. Pipelines may override stage-level logic or ignore it entirely. Some systems treat probability as advisory. Others treat it as contractual. Even something as basic as 'expected close date' may be a first-class field in one CRM and a custom field in another.",{"type":17,"tag":29,"props":236115,"children":236116},{},[236117],{"type":23,"value":236118},"For a PM, this creates friction fast:",{"type":17,"tag":80,"props":236120,"children":236121},{},[236122,236127,236132],{"type":17,"tag":84,"props":236123,"children":236124},{},[236125],{"type":23,"value":236126},"Can forecasts be compared across customers on different CRMs?",{"type":17,"tag":84,"props":236128,"children":236129},{},[236130],{"type":23,"value":236131},"Do probability changes reflect real pipeline movement, or just stage configuration quirks?",{"type":17,"tag":84,"props":236133,"children":236134},{},[236135],{"type":23,"value":236136},"Can automation safely update probabilities without breaking how a sales team actually works?",{"type":17,"tag":29,"props":236138,"children":236139},{},[236140],{"type":23,"value":236141},"Many forecasting features quietly become CRM-specific. Logic gets embedded for Salesforce first, patched for HubSpot, and partially supported elsewhere. The result is a feature that works, but only under the right conditions.",{"type":17,"tag":29,"props":236143,"children":236144},{},[236145,236146,236150,236152,236157,236158,236163],{"type":23,"value":25244},{"type":17,"tag":133,"props":236147,"children":236148},{"href":61562},[236149],{"type":23,"value":61565},{"type":23,"value":236151}," is designed to remove that fragmentation. Deals, pipelines, stages, and probabilities are normalized into a single model across CRM providers. Core fields like ",{"type":17,"tag":6121,"props":236153,"children":236155},{"className":236154},[],[236156],{"type":23,"value":25890},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236159,"children":236161},{"className":236160},[],[236162],{"type":23,"value":25901},{"type":23,"value":236164},", and stage configuration behave consistently, while CRM-specific data remains accessible through metadata when needed.",{"type":17,"tag":29,"props":236166,"children":236167},{},[236168],{"type":23,"value":236169},"This guide shows how to build a revenue forecasting module on top of that normalized layer—listing open opportunities, calculating weighted revenue, grouping forecasts by expected close date, and updating probabilities—without branching logic per CRM or rewriting your forecasting rules as you add new integrations.",{"type":17,"tag":239,"props":236171,"children":236172},{"id":141798},[236173],{"type":23,"value":141801},{"type":17,"tag":80,"props":236175,"children":236176},{},[236177,236181,236186,236195],{"type":17,"tag":84,"props":236178,"children":236179},{},[236180],{"type":23,"value":199683},{"type":17,"tag":84,"props":236182,"children":236183},{},[236184],{"type":23,"value":236185},"A Unified account with a CRM integration enabled (Salesforce, HubSpot, Zoho, etc.)",{"type":17,"tag":84,"props":236187,"children":236188},{},[236189,236190,236194],{"type":23,"value":199693},{"type":17,"tag":133,"props":236191,"children":236192},{"href":7691},[236193],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":236196,"children":236197},{},[236198,236199,236204],{"type":23,"value":211190},{"type":17,"tag":6121,"props":236200,"children":236202},{"className":236201},[],[236203],{"type":23,"value":19766},{"type":23,"value":236205}," (created after your customer authorizes via Unified's auth flow)",{"type":17,"tag":68,"props":236207,"children":236208},{"id":211198},[236209],{"type":23,"value":211201},{"type":17,"tag":6893,"props":236211,"children":236214},{"className":236212,"code":236213,"language":48432,"meta":7},[48430],"mkdir revenue-forecast-demo\ncd revenue-forecast-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[236215],{"type":17,"tag":6121,"props":236216,"children":236217},{"__ignoreMap":7},[236218],{"type":23,"value":236213},{"type":17,"tag":29,"props":236220,"children":236221},{},[236222,236223,236228],{"type":23,"value":211215},{"type":17,"tag":6121,"props":236224,"children":236226},{"className":236225},[],[236227],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":236230,"children":236232},{"className":236231,"code":211227,"language":20901,"meta":23},[20899],[236233],{"type":17,"tag":6121,"props":236234,"children":236235},{"__ignoreMap":7},[236236],{"type":23,"value":211227},{"type":17,"tag":68,"props":236238,"children":236239},{"id":211235},[236240],{"type":23,"value":211238},{"type":17,"tag":6893,"props":236242,"children":236245},{"className":236243,"code":236244,"language":18718,"meta":7},[18716],"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_CRM } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[236246],{"type":17,"tag":6121,"props":236247,"children":236248},{"__ignoreMap":7},[236249],{"type":23,"value":236244},{"type":17,"tag":68,"props":236251,"children":236253},{"id":236252},"step-3-understand-the-normalized-crm-objects",[236254],{"type":23,"value":236255},"Step 3: Understand the normalized CRM objects",{"type":17,"tag":29,"props":236257,"children":236258},{},[236259,236261,236266],{"type":23,"value":236260},"Unified returns normalized CRM objects in the SDK using ",{"type":17,"tag":48,"props":236262,"children":236263},{},[236264],{"type":23,"value":236265},"snake_case",{"type":23,"value":236267}," field names.",{"type":17,"tag":239,"props":236269,"children":236270},{"id":212137},[236271,236272,236277],{"type":23,"value":212140},{"type":17,"tag":6121,"props":236273,"children":236275},{"className":236274},[],[236276],{"type":23,"value":212146},{"type":23,"value":12034},{"type":17,"tag":29,"props":236279,"children":236280},{},[236281],{"type":23,"value":236282},"A deal includes fields like:",{"type":17,"tag":80,"props":236284,"children":236285},{},[236286,236312,236322,236348,236356,236376,236386],{"type":17,"tag":84,"props":236287,"children":236288},{},[236289,236294,236295,236300,236301,236306,236307],{"type":17,"tag":6121,"props":236290,"children":236292},{"className":236291},[],[236293],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236296,"children":236298},{"className":236297},[],[236299],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236302,"children":236304},{"className":236303},[],[236305],{"type":23,"value":25890},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236308,"children":236310},{"className":236309},[],[236311],{"type":23,"value":22296},{"type":17,"tag":84,"props":236313,"children":236314},{},[236315,236320],{"type":17,"tag":6121,"props":236316,"children":236318},{"className":236317},[],[236319],{"type":23,"value":62569},{"type":23,"value":236321}," (the date the deal actually closed)",{"type":17,"tag":84,"props":236323,"children":236324},{},[236325,236330,236331,236336,236337,236342,236343],{"type":17,"tag":6121,"props":236326,"children":236328},{"className":236327},[],[236329],{"type":23,"value":212204},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236332,"children":236334},{"className":236333},[],[236335],{"type":23,"value":25923},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236338,"children":236340},{"className":236339},[],[236341],{"type":23,"value":62844},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236344,"children":236346},{"className":236345},[],[236347],{"type":23,"value":109074},{"type":17,"tag":84,"props":236349,"children":236350},{},[236351],{"type":17,"tag":6121,"props":236352,"children":236354},{"className":236353},[],[236355],{"type":23,"value":25901},{"type":17,"tag":84,"props":236357,"children":236358},{},[236359,236364,236365,236370,236371],{"type":17,"tag":6121,"props":236360,"children":236362},{"className":236361},[],[236363],{"type":23,"value":62582},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236366,"children":236368},{"className":236367},[],[236369],{"type":23,"value":62483},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236372,"children":236374},{"className":236373},[],[236375],{"type":23,"value":62360},{"type":17,"tag":84,"props":236377,"children":236378},{},[236379,236384],{"type":17,"tag":6121,"props":236380,"children":236382},{"className":236381},[],[236383],{"type":23,"value":133378},{"type":23,"value":236385}," (normalized access to custom fields)",{"type":17,"tag":84,"props":236387,"children":236388},{},[236389,236394],{"type":17,"tag":6121,"props":236390,"children":236392},{"className":236391},[],[236393],{"type":23,"value":62389},{"type":23,"value":236395}," (integration-specific payload when needed)",{"type":17,"tag":239,"props":236397,"children":236398},{"id":212310},[236399,236400,236405],{"type":23,"value":212313},{"type":17,"tag":6121,"props":236401,"children":236403},{"className":236402},[],[236404],{"type":23,"value":212319},{"type":23,"value":12034},{"type":17,"tag":29,"props":236407,"children":236408},{},[236409],{"type":23,"value":236410},"A pipeline includes:",{"type":17,"tag":80,"props":236412,"children":236413},{},[236414,236440,236450],{"type":17,"tag":84,"props":236415,"children":236416},{},[236417,236422,236423,236428,236429,236434,236435],{"type":17,"tag":6121,"props":236418,"children":236420},{"className":236419},[],[236421],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236424,"children":236426},{"className":236425},[],[236427],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236430,"children":236432},{"className":236431},[],[236433],{"type":23,"value":62868},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236436,"children":236438},{"className":236437},[],[236439],{"type":23,"value":62878},{"type":17,"tag":84,"props":236441,"children":236442},{},[236443,236448],{"type":17,"tag":6121,"props":236444,"children":236446},{"className":236445},[],[236447],{"type":23,"value":62873},{"type":23,"value":236449}," (default probability at pipeline level)",{"type":17,"tag":84,"props":236451,"children":236452},{},[236453,236458,236460],{"type":17,"tag":6121,"props":236454,"children":236456},{"className":236455},[],[236457],{"type":23,"value":212337},{"type":23,"value":236459},", where each stage can include:\n",{"type":17,"tag":80,"props":236461,"children":236462},{},[236463,236471,236481],{"type":17,"tag":84,"props":236464,"children":236465},{},[236466],{"type":17,"tag":6121,"props":236467,"children":236469},{"className":236468},[],[236470],{"type":23,"value":62873},{"type":17,"tag":84,"props":236472,"children":236473},{},[236474,236479],{"type":17,"tag":6121,"props":236475,"children":236477},{"className":236476},[],[236478],{"type":23,"value":212374},{"type":23,"value":236480}," (whether the stage is a closed stage)",{"type":17,"tag":84,"props":236482,"children":236483},{},[236484,236489,236490],{"type":17,"tag":6121,"props":236485,"children":236487},{"className":236486},[],[236488],{"type":23,"value":174606},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236491,"children":236493},{"className":236492},[],[236494],{"type":23,"value":62878},{"type":17,"tag":68,"props":236496,"children":236498},{"id":236497},"step-4-list-open-opportunities-deals",[236499],{"type":23,"value":236500},"Step 4: List open opportunities (deals)",{"type":17,"tag":29,"props":236502,"children":236503},{},[236504],{"type":23,"value":236505},"Unified's SDK lists deals via:",{"type":17,"tag":29,"props":236507,"children":236508},{},[236509,236515,236516],{"type":17,"tag":6121,"props":236510,"children":236512},{"className":236511},[],[236513],{"type":23,"value":236514},"GET /crm/{connection_id}/deal",{"type":23,"value":98082},{"type":17,"tag":6121,"props":236517,"children":236519},{"className":236518},[],[236520],{"type":23,"value":236521},"sdk.crm.listCrmDeals(...)",{"type":17,"tag":29,"props":236523,"children":236524},{},[236525,236527,236531,236532,236537,236538,236543,236545,236550,236551,236556,236557,236562],{"type":23,"value":236526},"It supports ",{"type":17,"tag":133,"props":236528,"children":236529},{"href":1857},[236530],{"type":23,"value":1860},{"type":23,"value":44573},{"type":17,"tag":6121,"props":236533,"children":236535},{"className":236534},[],[236536],{"type":23,"value":48389},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236539,"children":236541},{"className":236540},[],[236542],{"type":23,"value":48411},{"type":23,"value":236544},") and filtering (e.g. ",{"type":17,"tag":6121,"props":236546,"children":236548},{"className":236547},[],[236549],{"type":23,"value":109074},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236552,"children":236554},{"className":236553},[],[236555],{"type":23,"value":62582},{"type":23,"value":11826},{"type":17,"tag":6121,"props":236558,"children":236560},{"className":236559},[],[236561],{"type":23,"value":27299},{"type":23,"value":236563},", etc.).",{"type":17,"tag":29,"props":236565,"children":236566},{},[236567,236569,236574],{"type":23,"value":236568},"This function fetches all open deals by paging through results, then filtering out closed deals (anything with ",{"type":17,"tag":6121,"props":236570,"children":236572},{"className":236571},[],[236573],{"type":23,"value":62569},{"type":23,"value":236575}," set).",{"type":17,"tag":6893,"props":236577,"children":236580},{"className":236578,"code":236579,"language":18718,"meta":7},[18716],"type CrmDeal = {\n  id?: string;\n  amount?: number;\n  probability?: number;\n  closed_at?: string; // actual close date\n  stage_id?: string;\n  pipeline_id?: string;\n  metadata?: { slug?: string; value?: any }[];\n};\n\nexport async function listOpenDeals(\n  connectionId: string,\n  opts?: {\n    pipelineId?: string;\n    ownerId?: string;\n    pageSize?: number;\n  }\n): Promise\u003CCrmDeal[]> {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const openDeals: CrmDeal[] = [];\n\n  while (true) {\n    const deals = await sdk.crm.listCrmDeals({\n      connectionId,\n      limit: pageSize,\n      offset,\n      pipeline_id: opts?.pipelineId,\n      user_id: opts?.ownerId,\n    });\n\n    if (!deals || deals.length === 0) break;\n\n    openDeals.push(...deals.filter((d) => !d.closed_at));\n    offset += pageSize;\n  }\n\n  return openDeals;\n}\n",[236581],{"type":17,"tag":6121,"props":236582,"children":236583},{"__ignoreMap":7},[236584],{"type":23,"value":236579},{"type":17,"tag":68,"props":236586,"children":236588},{"id":236587},"step-5-calculate-weighted-revenue-amount-probability",[236589],{"type":23,"value":236590},"Step 5: Calculate weighted revenue (amount × probability)",{"type":17,"tag":29,"props":236592,"children":236593},{},[236594],{"type":23,"value":236595},"Weighted revenue is the expected value of the pipeline:",{"type":17,"tag":29,"props":236597,"children":236598},{},[236599],{"type":17,"tag":6121,"props":236600,"children":236602},{"className":236601},[],[236603],{"type":23,"value":236604},"sum(amount × probability)",{"type":17,"tag":29,"props":236606,"children":236607},{},[236608,236610,236615,236617,236622,236623,236628],{"type":23,"value":236609},"Unified's normalized ",{"type":17,"tag":6121,"props":236611,"children":236613},{"className":236612},[],[236614],{"type":23,"value":212146},{"type":23,"value":236616}," includes both ",{"type":17,"tag":6121,"props":236618,"children":236620},{"className":236619},[],[236621],{"type":23,"value":25890},{"type":23,"value":34435},{"type":17,"tag":6121,"props":236624,"children":236626},{"className":236625},[],[236627],{"type":23,"value":25901},{"type":23,"value":236629},", so you can compute this consistently across CRM vendors.",{"type":17,"tag":6893,"props":236631,"children":236634},{"className":236632,"code":236633,"language":18718,"meta":7},[18716],"export function calculateWeightedRevenue(deals: CrmDeal[]): number {\n  return deals.reduce((total, deal) => {\n    const amount = Number(deal.amount ?? 0);\n    const probability = Number(deal.probability ?? 0);\n    return total + amount * probability;\n  }, 0);\n}\n",[236635],{"type":17,"tag":6121,"props":236636,"children":236637},{"__ignoreMap":7},[236638],{"type":23,"value":236633},{"type":17,"tag":68,"props":236640,"children":236642},{"id":236641},"step-6-group-forecast-by-expected-close-month-using-metadata",[236643,236645,236650],{"type":23,"value":236644},"Step 6: Group forecast by expected close month (using ",{"type":17,"tag":6121,"props":236646,"children":236648},{"className":236647},[],[236649],{"type":23,"value":23792},{"type":23,"value":12034},{"type":17,"tag":29,"props":236652,"children":236653},{},[236654,236655,236660,236662,236667,236669,236673,236675,236680],{"type":23,"value":135951},{"type":17,"tag":6121,"props":236656,"children":236658},{"className":236657},[],[236659],{"type":23,"value":62569},{"type":23,"value":236661}," is the date the deal ",{"type":17,"tag":48,"props":236663,"children":236664},{},[236665],{"type":23,"value":236666},"actually closed",{"type":23,"value":236668},", so it won't exist for open deals. CRMs usually store an ",{"type":17,"tag":33,"props":236670,"children":236671},{},[236672],{"type":23,"value":108719},{"type":23,"value":236674}," as a standard or custom field, which may not be part of Unified's normalized ",{"type":17,"tag":6121,"props":236676,"children":236678},{"className":236677},[],[236679],{"type":23,"value":212146},{"type":23,"value":236681}," fields.",{"type":17,"tag":29,"props":236683,"children":236684},{},[236685,236687,236692,236694,236700,236701,236707,236709,236715],{"type":23,"value":236686},"Unified exposes these extra fields through ",{"type":17,"tag":6121,"props":236688,"children":236690},{"className":236689},[],[236691],{"type":23,"value":133378},{"type":23,"value":236693},". If your CRM stores expected close date as a field (often ",{"type":17,"tag":6121,"props":236695,"children":236697},{"className":236696},[],[236698],{"type":23,"value":236699},"close_date",{"type":23,"value":11826},{"type":17,"tag":6121,"props":236702,"children":236704},{"className":236703},[],[236705],{"type":23,"value":236706},"expected_close_date",{"type":23,"value":236708},", etc.), you can group forecasts by month using the matching ",{"type":17,"tag":6121,"props":236710,"children":236712},{"className":236711},[],[236713],{"type":23,"value":236714},"metadata.slug",{"type":23,"value":54},{"type":17,"tag":239,"props":236717,"children":236719},{"id":236718},"helper-fetch-a-metadata-value-by-slug",[236720],{"type":23,"value":236721},"Helper: fetch a metadata value by slug",{"type":17,"tag":6893,"props":236723,"children":236726},{"className":236724,"code":236725,"language":18718,"meta":7},[18716],"function getMetadataValue(deal: CrmDeal, slug: string): any {\n  return deal.metadata?.find((m) => m.slug === slug)?.value;\n}\n\nfunction toMonthKey(dateStr: string): string | null {\n  // Accept ISO timestamps or YYYY-MM-DD strings\n  if (!dateStr) return null;\n  const s = String(dateStr);\n  if (s.length \u003C 7) return null;\n  return s.substring(0, 7); // YYYY-MM\n}\n",[236727],{"type":17,"tag":6121,"props":236728,"children":236729},{"__ignoreMap":7},[236730],{"type":23,"value":236725},{"type":17,"tag":239,"props":236732,"children":236734},{"id":236733},"group-by-expected-close-month",[236735],{"type":23,"value":236736},"Group by expected close month",{"type":17,"tag":6893,"props":236738,"children":236741},{"className":236739,"code":236740,"language":18718,"meta":7},[18716],"export function groupForecastByExpectedCloseMonth(\n  deals: CrmDeal[],\n  expectedCloseDateSlug = 'close_date' // replace with your actual slug if different\n): Record\u003Cstring, number> {\n  return deals.reduce((acc, deal) => {\n    const expectedClose = getMetadataValue(deal, expectedCloseDateSlug);\n    const monthKey = toMonthKey(expectedClose);\n    if (!monthKey) return acc;\n\n    const amount = Number(deal.amount ?? 0);\n    const probability = Number(deal.probability ?? 0);\n    const weighted = amount * probability;\n\n    acc[monthKey] = (acc[monthKey] || 0) + weighted;\n    return acc;\n  }, {} as Record\u003Cstring, number>);\n}\n",[236742],{"type":17,"tag":6121,"props":236743,"children":236744},{"__ignoreMap":7},[236745],{"type":23,"value":236740},{"type":17,"tag":29,"props":236747,"children":236748},{},[236749,236751,236756],{"type":23,"value":236750},"If you don't know the right slug yet, the fastest way to confirm is to inspect one returned deal's ",{"type":17,"tag":6121,"props":236752,"children":236754},{"className":236753},[],[236755],{"type":23,"value":133378},{"type":23,"value":236757}," in your logs and pick the slug that corresponds to expected close date.",{"type":17,"tag":68,"props":236759,"children":236761},{"id":236760},"step-7-list-pipelines-optional",[236762],{"type":23,"value":236763},"Step 7: List pipelines (optional)",{"type":17,"tag":29,"props":236765,"children":236766},{},[236767],{"type":23,"value":236768},"Pipelines are useful if you want to:",{"type":17,"tag":80,"props":236770,"children":236771},{},[236772,236777],{"type":17,"tag":84,"props":236773,"children":236774},{},[236775],{"type":23,"value":236776},"show pipeline options for filtering",{"type":17,"tag":84,"props":236778,"children":236779},{},[236780,236782,236787],{"type":23,"value":236781},"inspect stage configuration (",{"type":17,"tag":6121,"props":236783,"children":236785},{"className":236784},[],[236786],{"type":23,"value":62873},{"type":23,"value":236788},", closed stages, ordering)",{"type":17,"tag":29,"props":236790,"children":236791},{},[236792],{"type":23,"value":95512},{"type":17,"tag":29,"props":236794,"children":236795},{},[236796,236802,236803],{"type":17,"tag":6121,"props":236797,"children":236799},{"className":236798},[],[236800],{"type":23,"value":236801},"GET /crm/{connection_id}/pipeline",{"type":23,"value":98082},{"type":17,"tag":6121,"props":236804,"children":236806},{"className":236805},[],[236807],{"type":23,"value":236808},"sdk.crm.listCrmPipelines(...)",{"type":17,"tag":6893,"props":236810,"children":236813},{"className":236811,"code":236812,"language":18718,"meta":7},[18716],"export type CrmPipeline = {\n  id?: string;\n  name?: string;\n  is_active?: boolean;\n  deal_probability?: number;\n  display_order?: number;\n  stages?: {\n    id?: string;\n    name?: string;\n    active?: boolean;\n    deal_probability?: number;\n    is_closed?: boolean;\n    display_order?: number;\n  }[];\n};\n\nexport async function listPipelines(connectionId: string): Promise\u003CCrmPipeline[]> {\n  let offset = 0;\n  const pipelines: CrmPipeline[] = [];\n\n  while (true) {\n    const page = await sdk.crm.listCrmPipelines({\n      connectionId,\n      limit: 100,\n      offset,\n    });\n\n    if (!page || page.length === 0) break;\n\n    pipelines.push(...page);\n    offset += 100;\n  }\n\n  return pipelines;\n}\n",[236814],{"type":17,"tag":6121,"props":236815,"children":236816},{"__ignoreMap":7},[236817],{"type":23,"value":236812},{"type":17,"tag":68,"props":236819,"children":236821},{"id":236820},"step-8-update-a-deal-probability-optional",[236822],{"type":23,"value":236823},"Step 8: Update a deal probability (optional)",{"type":17,"tag":29,"props":236825,"children":236826},{},[236827],{"type":23,"value":236828},"If your product allows users (or automation) to override probability, Unified supports updating a deal with:",{"type":17,"tag":29,"props":236830,"children":236831},{},[236832,236837,236838],{"type":17,"tag":6121,"props":236833,"children":236835},{"className":236834},[],[236836],{"type":23,"value":110051},{"type":23,"value":98082},{"type":17,"tag":6121,"props":236839,"children":236841},{"className":236840},[],[236842],{"type":23,"value":236843},"sdk.crm.updateCrmDeal(...)",{"type":17,"tag":6893,"props":236845,"children":236848},{"className":236846,"code":236847,"language":18718,"meta":7},[18716],"export async function updateDealProbability(\n  connectionId: string,\n  dealId: string,\n  probability: number\n): Promise\u003Cvoid> {\n  await sdk.crm.updateCrmDeal({\n    connectionId,\n    id: dealId,\n    crmDeal: {\n      probability,\n    },\n  });\n}\n",[236849],{"type":17,"tag":6121,"props":236850,"children":236851},{"__ignoreMap":7},[236852],{"type":23,"value":236847},{"type":17,"tag":68,"props":236854,"children":236855},{"id":235434},[236856],{"type":23,"value":235437},{"type":17,"tag":29,"props":236858,"children":236859},{},[236860],{"type":23,"value":236861},"This example fetches open deals, computes total weighted revenue, and groups the forecast by expected close month using a metadata slug.",{"type":17,"tag":6893,"props":236863,"children":236866},{"className":236864,"code":236865,"language":18718,"meta":7},[18716],"async function main() {\n  const connectionId = CONNECTION_CRM!;\n  const expectedCloseDateSlug = 'close_date'; // replace if your slug differs\n\n  const openDeals = await listOpenDeals(connectionId, {\n    // pipelineId: '...',\n    // ownerId: '...',\n    pageSize: 100,\n  });\n\n  const totalWeighted = calculateWeightedRevenue(openDeals);\n  console.log('Total weighted revenue:', totalWeighted);\n\n  const forecastByMonth = groupForecastByExpectedCloseMonth(\n    openDeals,\n    expectedCloseDateSlug\n  );\n  console.log('Forecast by expected close month:', forecastByMonth);\n\n  // Optional: pipeline exploration\n  const pipelines = await listPipelines(connectionId);\n  console.log('Pipelines:', pipelines.map((p) => p.name));\n}\n\nmain().catch(console.error);\n",[236867],{"type":17,"tag":6121,"props":236868,"children":236869},{"__ignoreMap":7},[236870],{"type":23,"value":236865},{"type":17,"tag":29,"props":236872,"children":236873},{},[236874],{"type":23,"value":236875},"Unified's CRM API gives you a consistent deal and pipeline model across CRM vendors, so you can build forecasting logic once and apply it across Salesforce, HubSpot, Zoho and more.",{"type":17,"tag":29,"props":236877,"children":236878},{},[236879],{"type":23,"value":236880},"Key takeaways from this implementation:",{"type":17,"tag":80,"props":236882,"children":236883},{},[236884,236907,236919,236930,236948],{"type":17,"tag":84,"props":236885,"children":236886},{},[236887,236888,236893,236894,236899,236900,236905],{"type":23,"value":33722},{"type":17,"tag":6121,"props":236889,"children":236891},{"className":236890},[],[236892],{"type":23,"value":236521},{"type":23,"value":120761},{"type":17,"tag":6121,"props":236895,"children":236897},{"className":236896},[],[236898],{"type":23,"value":48389},{"type":23,"value":34435},{"type":17,"tag":6121,"props":236901,"children":236903},{"className":236902},[],[236904],{"type":23,"value":48411},{"type":23,"value":236906}," to page through all deals.",{"type":17,"tag":84,"props":236908,"children":236909},{},[236910,236912,236917],{"type":23,"value":236911},"Filter open deals using ",{"type":17,"tag":6121,"props":236913,"children":236915},{"className":236914},[],[236916],{"type":23,"value":62569},{"type":23,"value":236918}," (actual close timestamp).",{"type":17,"tag":84,"props":236920,"children":236921},{},[236922,236924,236929],{"type":23,"value":236923},"Calculate weighted revenue using ",{"type":17,"tag":6121,"props":236925,"children":236927},{"className":236926},[],[236928],{"type":23,"value":235828},{"type":23,"value":54},{"type":17,"tag":84,"props":236931,"children":236932},{},[236933,236935,236940,236942,236947],{"type":23,"value":236934},"Group by ",{"type":17,"tag":33,"props":236936,"children":236937},{},[236938],{"type":23,"value":236939},"expected",{"type":23,"value":236941}," close month using a close-date field exposed via ",{"type":17,"tag":6121,"props":236943,"children":236945},{"className":236944},[],[236946],{"type":23,"value":133378},{"type":23,"value":54},{"type":17,"tag":84,"props":236949,"children":236950},{},[236951,236952,236957],{"type":23,"value":33722},{"type":17,"tag":6121,"props":236953,"children":236955},{"className":236954},[],[236956],{"type":23,"value":236843},{"type":23,"value":236958}," to update probabilities when needed.",{"type":17,"tag":29,"props":236960,"children":236961},{},[236962,236963],{"type":23,"value":1609},{"type":17,"tag":133,"props":236964,"children":236966},{"href":1612,"rel":236965},[214],[236967],{"type":23,"value":1616},{"type":17,"tag":29,"props":236969,"children":236970},{},[236971,236972],{"type":23,"value":1609},{"type":17,"tag":133,"props":236973,"children":236975},{"href":1623,"rel":236974},[214],[236976],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":236978},[236979,236980,236981,236982,236986,236987,236988,236993,236994,236995],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":236252,"depth":1629,"text":236255,"children":236983},[236984,236985],{"id":212137,"depth":1635,"text":212774},{"id":212310,"depth":1635,"text":212776},{"id":236497,"depth":1629,"text":236500},{"id":236587,"depth":1629,"text":236590},{"id":236641,"depth":1629,"text":236989,"children":236990},"Step 6: Group forecast by expected close month (using metadata)",[236991,236992],{"id":236718,"depth":1635,"text":236721},{"id":236733,"depth":1635,"text":236736},{"id":236760,"depth":1629,"text":236763},{"id":236820,"depth":1629,"text":236823},{"id":235434,"depth":1629,"text":235437},"content:blog:how_to_forecast_revenue_with_unified_crm_api.md","blog/how_to_forecast_revenue_with_unified_crm_api.md","blog/how_to_forecast_revenue_with_unified_crm_api",{"_path":237000,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":237001,"description":237002,"img":237003,"date":234743,"tag":12,"body":237004,"_type":1677,"_id":237713,"_source":1679,"_file":237714,"_stem":237715,"_extension":1682},"/blog/how_to_perform_financial_analysis_with_transaction_level_detail_using_unified_accounting_api","How to Perform Financial Analysis with Transaction-Level Detail Using Unified's Accounting API","Most budgeting and runway features fail long before the math.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_perform_financial_analysis_with_transaction_level_detail_using_unified_accounting_api-icon.png",{"type":14,"children":237005,"toc":237691},[237006,237011,237014,237021,237025,237029,237034,237039,237044,237049,237067,237072,237082,237087,237091,237125,237129,237138,237148,237156,237160,237168,237174,237179,237190,237195,237274,237286,237298,237361,237374,237379,237401,237414,237419,237469,237475,237480,237489,237495,237504,237510,237519,237525,237537,237546,237552,237557,237566,237572,237597,237606,237610,237615,237624,237629,237661,237673,237682],{"type":17,"tag":18,"props":237007,"children":237009},{"id":237008},"how-to-perform-financial-analysis-with-transaction-level-detail-using-unifieds-accounting-api",[237010],{"type":23,"value":237001},{"type":17,"tag":25,"props":237012,"children":237013},{},[],{"type":17,"tag":29,"props":237015,"children":237016},{},[237017],{"type":17,"tag":33,"props":237018,"children":237019},{},[237020],{"type":23,"value":234761},{"type":17,"tag":11616,"props":237022,"children":237024},{"width":11618,"height":11619,"src":237023,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/PA6gt_tzwwo",[],{"type":17,"tag":29,"props":237026,"children":237027},{},[237028],{"type":23,"value":237002},{"type":17,"tag":29,"props":237030,"children":237031},{},[237032],{"type":23,"value":237033},"On paper, financial analysis looks simple. Aggregate transactions. Group by account. Compare actuals to budget. Divide cash by burn. In practice, those steps only hold if the underlying ledger data is consistent across customers.",{"type":17,"tag":29,"props":237035,"children":237036},{},[237037],{"type":23,"value":237038},"That's where product complexity creeps in.",{"type":17,"tag":29,"props":237040,"children":237041},{},[237042],{"type":23,"value":237043},"Accounting platforms don't just differ in UI. They model transactions, accounts, balances, and even fiscal structure differently. Some systems expose clean transaction-level debits and credits. Others infer direction from context. Account hierarchies vary. Balance sheet snapshots may or may not align cleanly with transaction timelines.",{"type":17,"tag":29,"props":237045,"children":237046},{},[237047],{"type":23,"value":237048},"For a PM, this creates uncomfortable tradeoffs:",{"type":17,"tag":80,"props":237050,"children":237051},{},[237052,237057,237062],{"type":17,"tag":84,"props":237053,"children":237054},{},[237055],{"type":23,"value":237056},"Can we guarantee that budgets mean the same thing across accounting providers?",{"type":17,"tag":84,"props":237058,"children":237059},{},[237060],{"type":23,"value":237061},"Can runway be calculated consistently, or does it depend on which system the customer uses?",{"type":17,"tag":84,"props":237063,"children":237064},{},[237065],{"type":23,"value":237066},"Can we roll this feature out broadly, or only to a subset of 'well-behaved' integrations?",{"type":17,"tag":29,"props":237068,"children":237069},{},[237070],{"type":23,"value":237071},"Many products solve this by narrowing scope or hardcoding assumptions per vendor. That works early, but it limits who the feature works for and how confidently you can ship changes.",{"type":17,"tag":29,"props":237073,"children":237074},{},[237075,237076,237080],{"type":23,"value":25244},{"type":17,"tag":133,"props":237077,"children":237078},{"href":82425},[237079],{"type":23,"value":128616},{"type":23,"value":237081}," is designed to remove those constraints. Instead of reconciling accounting semantics downstream, Unified normalizes transactions, accounts, organizations, and balance sheets upstream. Signed amounts, account classifications, and timestamps behave consistently before your analysis logic ever runs.",{"type":17,"tag":29,"props":237083,"children":237084},{},[237085],{"type":23,"value":237086},"This guide shows how to build transaction-level financial analysis—monthly actuals, baseline budgets, and runway—on top of that normalized layer, without branching logic for QuickBooks vs. Xero vs. NetSuite, and without rewriting your analysis as new accounting systems are added.",{"type":17,"tag":239,"props":237088,"children":237089},{"id":141798},[237090],{"type":23,"value":141801},{"type":17,"tag":80,"props":237092,"children":237093},{},[237094,237098,237107,237116],{"type":17,"tag":84,"props":237095,"children":237096},{},[237097],{"type":23,"value":199683},{"type":17,"tag":84,"props":237099,"children":237100},{},[237101,237102,237106],{"type":23,"value":234004},{"type":17,"tag":48,"props":237103,"children":237104},{},[237105],{"type":23,"value":104365},{"type":23,"value":234010},{"type":17,"tag":84,"props":237108,"children":237109},{},[237110,237111,237115],{"type":23,"value":199693},{"type":17,"tag":133,"props":237112,"children":237113},{"href":7691},[237114],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":237117,"children":237118},{},[237119,237120],{"type":23,"value":231444},{"type":17,"tag":6121,"props":237121,"children":237123},{"className":237122},[],[237124],{"type":23,"value":19766},{"type":17,"tag":68,"props":237126,"children":237127},{"id":211198},[237128],{"type":23,"value":211201},{"type":17,"tag":6893,"props":237130,"children":237133},{"className":237131,"code":237132,"language":48432,"meta":7},[48430],"mkdir transaction-finance-analysis-demo\ncd transaction-finance-analysis-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[237134],{"type":17,"tag":6121,"props":237135,"children":237136},{"__ignoreMap":7},[237137],{"type":23,"value":237132},{"type":17,"tag":29,"props":237139,"children":237140},{},[237141,237142,237147],{"type":23,"value":211215},{"type":17,"tag":6121,"props":237143,"children":237145},{"className":237144},[],[237146],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":237149,"children":237151},{"className":237150,"code":231476,"language":20901,"meta":23},[20899],[237152],{"type":17,"tag":6121,"props":237153,"children":237154},{"__ignoreMap":7},[237155],{"type":23,"value":231476},{"type":17,"tag":68,"props":237157,"children":237158},{"id":211235},[237159],{"type":23,"value":211238},{"type":17,"tag":6893,"props":237161,"children":237163},{"className":237162,"code":231489,"language":18718,"meta":7},[18716],[237164],{"type":17,"tag":6121,"props":237165,"children":237166},{"__ignoreMap":7},[237167],{"type":23,"value":231489},{"type":17,"tag":68,"props":237169,"children":237171},{"id":237170},"step-3-understand-the-normalized-accounting-objects-critical",[237172],{"type":23,"value":237173},"Step 3: Understand the normalized Accounting objects (critical)",{"type":17,"tag":29,"props":237175,"children":237176},{},[237177],{"type":23,"value":237178},"Unified's Accounting models use snake_case field names in the API docs and TypeScript types shown here.",{"type":17,"tag":239,"props":237180,"children":237182},{"id":237181},"transactions-accountingtransaction",[237183,237184,237189],{"type":23,"value":222314},{"type":17,"tag":6121,"props":237185,"children":237187},{"className":237186},[],[237188],{"type":23,"value":219463},{"type":23,"value":12034},{"type":17,"tag":29,"props":237191,"children":237192},{},[237193],{"type":23,"value":237194},"Transactions are the lowest-level record of ledger activity. Useful fields include:",{"type":17,"tag":80,"props":237196,"children":237197},{},[237198,237208,237218,237226,237236,237258],{"type":17,"tag":84,"props":237199,"children":237200},{},[237201,237206],{"type":17,"tag":6121,"props":237202,"children":237204},{"className":237203},[],[237205],{"type":23,"value":219481},{"type":23,"value":237207}," (signed: negative for credit, positive for debit)",{"type":17,"tag":84,"props":237209,"children":237210},{},[237211,237216],{"type":17,"tag":6121,"props":237212,"children":237214},{"className":237213},[],[237215],{"type":23,"value":184840},{"type":23,"value":237217}," (where the transaction lands in the chart of accounts)",{"type":17,"tag":84,"props":237219,"children":237220},{},[237221],{"type":17,"tag":6121,"props":237222,"children":237224},{"className":237223},[],[237225],{"type":23,"value":22296},{"type":17,"tag":84,"props":237227,"children":237228},{},[237229,237234],{"type":17,"tag":6121,"props":237230,"children":237232},{"className":237231},[],[237233],{"type":23,"value":27310},{"type":23,"value":237235}," (e.g. Invoice, BillPaymentCreditCard, JournalEntry, etc.)",{"type":17,"tag":84,"props":237237,"children":237238},{},[237239,237244,237246,237251,237252,237257],{"type":17,"tag":6121,"props":237240,"children":237242},{"className":237241},[],[237243],{"type":23,"value":220991},{"type":23,"value":237245}," (counterparty hints: ",{"type":17,"tag":6121,"props":237247,"children":237249},{"className":237248},[],[237250],{"type":23,"value":221006},{"type":23,"value":11826},{"type":17,"tag":6121,"props":237253,"children":237255},{"className":237254},[],[237256],{"type":23,"value":220999},{"type":23,"value":12034},{"type":17,"tag":84,"props":237259,"children":237260},{},[237261,237266,237267,237272],{"type":17,"tag":6121,"props":237262,"children":237264},{"className":237263},[],[237265],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":237268,"children":237270},{"className":237269},[],[237271],{"type":23,"value":25337},{"type":23,"value":237273}," (timestamps for bucketing and incremental export)",{"type":17,"tag":239,"props":237275,"children":237277},{"id":237276},"accounts-accountingaccount",[237278,237280,237285],{"type":23,"value":237279},"Accounts (",{"type":17,"tag":6121,"props":237281,"children":237283},{"className":237282},[],[237284],{"type":23,"value":219515},{"type":23,"value":12034},{"type":17,"tag":29,"props":237287,"children":237288},{},[237289,237291,237296],{"type":23,"value":237290},"Accounts label ",{"type":17,"tag":6121,"props":237292,"children":237294},{"className":237293},[],[237295],{"type":23,"value":184840},{"type":23,"value":237297}," and provide the classification you need for budgets and burn:",{"type":17,"tag":80,"props":237299,"children":237300},{},[237301,237315,237351],{"type":17,"tag":84,"props":237302,"children":237303},{},[237304,237309,237310],{"type":17,"tag":6121,"props":237305,"children":237307},{"className":237306},[],[237308],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":237311,"children":237313},{"className":237312},[],[237314],{"type":23,"value":18781},{"type":17,"tag":84,"props":237316,"children":237317},{},[237318,237323,237325,237330,237331,237336,237337,237343,237344,237350],{"type":17,"tag":6121,"props":237319,"children":237321},{"className":237320},[],[237322],{"type":23,"value":27310},{"type":23,"value":237324}," (e.g. ",{"type":17,"tag":6121,"props":237326,"children":237328},{"className":237327},[],[237329],{"type":23,"value":219728},{"type":23,"value":11826},{"type":17,"tag":6121,"props":237332,"children":237334},{"className":237333},[],[237335],{"type":23,"value":219748},{"type":23,"value":11826},{"type":17,"tag":6121,"props":237338,"children":237340},{"className":237339},[],[237341],{"type":23,"value":237342},"BANK",{"type":23,"value":11826},{"type":17,"tag":6121,"props":237345,"children":237347},{"className":237346},[],[237348],{"type":23,"value":237349},"CREDIT_CARD",{"type":23,"value":149980},{"type":17,"tag":84,"props":237352,"children":237353},{},[237354,237356],{"type":23,"value":237355},"hierarchy via ",{"type":17,"tag":6121,"props":237357,"children":237359},{"className":237358},[],[237360],{"type":23,"value":15863},{"type":17,"tag":239,"props":237362,"children":237364},{"id":237363},"organization-accountingorganization",[237365,237367,237373],{"type":23,"value":237366},"Organization (",{"type":17,"tag":6121,"props":237368,"children":237370},{"className":237369},[],[237371],{"type":23,"value":237372},"AccountingOrganization",{"type":23,"value":12034},{"type":17,"tag":29,"props":237375,"children":237376},{},[237377],{"type":23,"value":237378},"Organization gives you company metadata helpful for analysis:",{"type":17,"tag":80,"props":237380,"children":237381},{},[237382,237392],{"type":17,"tag":84,"props":237383,"children":237384},{},[237385,237390],{"type":17,"tag":6121,"props":237386,"children":237388},{"className":237387},[],[237389],{"type":23,"value":22296},{"type":23,"value":237391}," (primary currency)",{"type":17,"tag":84,"props":237393,"children":237394},{},[237395],{"type":17,"tag":6121,"props":237396,"children":237398},{"className":237397},[],[237399],{"type":23,"value":237400},"fiscal_year_end_month",{"type":17,"tag":239,"props":237402,"children":237404},{"id":237403},"balance-sheet-accountingbalancesheet",[237405,237407,237413],{"type":23,"value":237406},"Balance sheet (",{"type":17,"tag":6121,"props":237408,"children":237410},{"className":237409},[],[237411],{"type":23,"value":237412},"AccountingBalancesheet",{"type":23,"value":12034},{"type":17,"tag":29,"props":237415,"children":237416},{},[237417],{"type":23,"value":237418},"Balance sheet provides point-in-time balances:",{"type":17,"tag":80,"props":237420,"children":237421},{},[237422,237436],{"type":17,"tag":84,"props":237423,"children":237424},{},[237425,237430,237431],{"type":17,"tag":6121,"props":237426,"children":237428},{"className":237427},[],[237429],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":237432,"children":237434},{"className":237433},[],[237435],{"type":23,"value":220208},{"type":17,"tag":84,"props":237437,"children":237438},{},[237439,237444,237445,237450,237451,237457,237458,237463,237464],{"type":17,"tag":6121,"props":237440,"children":237442},{"className":237441},[],[237443],{"type":23,"value":220217},{"type":23,"value":11826},{"type":17,"tag":6121,"props":237446,"children":237448},{"className":237447},[],[237449],{"type":23,"value":220226},{"type":23,"value":11826},{"type":17,"tag":6121,"props":237452,"children":237454},{"className":237453},[],[237455],{"type":23,"value":237456},"equity[]",{"type":23,"value":120761},{"type":17,"tag":6121,"props":237459,"children":237461},{"className":237460},[],[237462],{"type":23,"value":184840},{"type":23,"value":11826},{"type":17,"tag":6121,"props":237465,"children":237467},{"className":237466},[],[237468],{"type":23,"value":25890},{"type":17,"tag":68,"props":237470,"children":237472},{"id":237471},"step-4-fetch-organizations-to-get-primary-currency-and-fiscal-year-end",[237473],{"type":23,"value":237474},"Step 4: Fetch organizations (to get primary currency and fiscal year end)",{"type":17,"tag":29,"props":237476,"children":237477},{},[237478],{"type":23,"value":237479},"Below are partial TypeScript shapes showing only the fields used in this example.",{"type":17,"tag":6893,"props":237481,"children":237484},{"className":237482,"code":237483,"language":18718,"meta":7},[18716],"import type { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nexport type AccountingOrganization = {\n  id?: string;\n  name: string;\n  currency?: string;\n  fiscal_year_end_month?: number;\n};\n\nexport async function fetchAllOrganizations(\n  sdk: UnifiedTo,\n  connectionId: string,\n  opts?: {\n    pageSize?: number;\n    updated_gte?: string;\n    sort?: \"name\" | \"updated_at\" | \"created_at\";\n    order?: \"asc\" | \"desc\";\n    query?: string;\n    fields?: string;\n    raw?: string;\n  }\n): Promise\u003CAccountingOrganization[]> {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: AccountingOrganization[] = [];\n\n  while (true) {\n    const page = await sdk.accounting.listAccountingOrganizations({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte,\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += pageSize;\n  }\n\n  return out;\n}\n\nexport function pickPrimaryOrganization(orgs: AccountingOrganization[]): AccountingOrganization | null {\n  if (!orgs || orgs.length === 0) return null;\n  // Use the first org by default. If you have a known org selection strategy, apply it here.\n  return orgs[0];\n}\n",[237485],{"type":17,"tag":6121,"props":237486,"children":237487},{"__ignoreMap":7},[237488],{"type":23,"value":237483},{"type":17,"tag":68,"props":237490,"children":237492},{"id":237491},"step-5-fetch-the-chart-of-accounts-for-classification",[237493],{"type":23,"value":237494},"Step 5: Fetch the chart of accounts (for classification)",{"type":17,"tag":6893,"props":237496,"children":237499},{"className":237497,"code":237498,"language":18718,"meta":7},[18716],"import type { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nexport type AccountingAccount = {\n  id?: string;\n  name?: string;\n  type?:\n    | \"ACCOUNTS_PAYABLE\"\n    | \"ACCOUNTS_RECEIVABLE\"\n    | \"BANK\"\n    | \"CREDIT_CARD\"\n    | \"FIXED_ASSET\"\n    | \"LIABILITY\"\n    | \"EQUITY\"\n    | \"EXPENSE\"\n    | \"REVENUE\"\n    | \"OTHER\";\n  parent_id?: string;\n  currency?: string;\n  balance?: number;\n};\n\nexport async function fetchAllAccounts(\n  sdk: UnifiedTo,\n  connectionId: string,\n  opts?: {\n    pageSize?: number;\n    updated_gte?: string;\n    sort?: \"name\" | \"updated_at\" | \"created_at\";\n    order?: \"asc\" | \"desc\";\n    query?: string;\n    org_id?: string;\n    fields?: string;\n    raw?: string;\n  }\n): Promise\u003CAccountingAccount[]> {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: AccountingAccount[] = [];\n\n  while (true) {\n    const page = await sdk.accounting.listAccountingAccounts({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte,\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      org_id: opts?.org_id ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += pageSize;\n  }\n\n  return out;\n}\n\nexport function indexAccounts(accounts: AccountingAccount[]): Record\u003Cstring, AccountingAccount> {\n  return Object.fromEntries(accounts.filter((a) => a.id).map((a) => [a.id!, a]));\n}\n",[237500],{"type":17,"tag":6121,"props":237501,"children":237502},{"__ignoreMap":7},[237503],{"type":23,"value":237498},{"type":17,"tag":68,"props":237505,"children":237507},{"id":237506},"step-6-fetch-all-transactions-transaction-level-detail",[237508],{"type":23,"value":237509},"Step 6: Fetch all transactions (transaction-level detail)",{"type":17,"tag":6893,"props":237511,"children":237514},{"className":237512,"code":237513,"language":18718,"meta":7},[18716],"import type { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nexport type AccountingTransaction = {\n  id?: string;\n  created_at?: string;\n  updated_at?: string;\n  memo?: string;\n  total_amount?: number; // negative for CREDIT, positive for DEBIT\n  currency?: string;\n  account_id?: string;\n  type?: string;\n  contacts?: {\n    id?: string;\n    is_customer?: boolean;\n    is_supplier?: boolean;\n  }[];\n};\n\nexport async function fetchAllTransactions(\n  sdk: UnifiedTo,\n  connectionId: string,\n  opts?: {\n    pageSize?: number;\n    updated_gte?: string;\n    sort?: \"name\" | \"updated_at\" | \"created_at\";\n    order?: \"asc\" | \"desc\";\n    query?: string;\n    contact_id?: string;\n    fields?: string;\n    raw?: string;\n  }\n): Promise\u003CAccountingTransaction[]> {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: AccountingTransaction[] = [];\n\n  while (true) {\n    const page = await sdk.accounting.listAccountingTransactions({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte,\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      contact_id: opts?.contact_id ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[237515],{"type":17,"tag":6121,"props":237516,"children":237517},{"__ignoreMap":7},[237518],{"type":23,"value":237513},{"type":17,"tag":68,"props":237520,"children":237522},{"id":237521},"step-7-build-monthly-actuals-by-account",[237523],{"type":23,"value":237524},"Step 7: Build monthly actuals (by account)",{"type":17,"tag":29,"props":237526,"children":237527},{},[237528,237530,237536],{"type":23,"value":237529},"This step turns transaction detail into a month-bucketed view of spend. For budgeting and runway, the most useful 'actuals' are typically expense accounts (",{"type":17,"tag":6121,"props":237531,"children":237533},{"className":237532},[],[237534],{"type":23,"value":237535},"AccountingAccount.type === \"EXPENSE\"",{"type":23,"value":129328},{"type":17,"tag":6893,"props":237538,"children":237541},{"className":237539,"code":237540,"language":18718,"meta":7},[18716],"export type MonthlyActuals = Record\u003Cstring, Record\u003Cstring, number>>;\n// monthKey -> accountId -> total_amount\n\nfunction toMonthKey(iso: string | undefined): string | null {\n  if (!iso) return null;\n  const s = String(iso);\n  if (s.length \u003C 7) return null;\n  return s.slice(0, 7); // YYYY-MM\n}\n\nexport function buildMonthlyExpenseActuals(\n  transactions: AccountingTransaction[],\n  accountIndex: Record\u003Cstring, { type?: string }>\n): MonthlyActuals {\n  const out: MonthlyActuals = {};\n\n  for (const t of transactions) {\n    const month = toMonthKey(t.created_at);\n    if (!month) continue;\n\n    const accountId = t.account_id;\n    if (!accountId) continue;\n\n    const acct = accountIndex[accountId];\n    if (!acct || acct.type !== \"EXPENSE\") continue;\n\n    const amt = Number(t.total_amount ?? 0);\n\n    out[month] ||= {};\n    out[month][accountId] = (out[month][accountId] ?? 0) + amt;\n  }\n\n  return out;\n}\n",[237542],{"type":17,"tag":6121,"props":237543,"children":237544},{"__ignoreMap":7},[237545],{"type":23,"value":237540},{"type":17,"tag":68,"props":237547,"children":237549},{"id":237548},"step-8-estimate-a-baseline-budget-from-trailing-averages",[237550],{"type":23,"value":237551},"Step 8: Estimate a baseline budget (from trailing averages)",{"type":17,"tag":29,"props":237553,"children":237554},{},[237555],{"type":23,"value":237556},"A simple baseline budget can be computed as the average monthly spend per expense account over the last N months.",{"type":17,"tag":6893,"props":237558,"children":237561},{"className":237559,"code":237560,"language":18718,"meta":7},[18716],"export function suggestMonthlyBudgets(\n  monthlyActuals: MonthlyActuals,\n  monthsBack = 3\n): Record\u003Cstring, number> {\n  const months = Object.keys(monthlyActuals).sort(); // YYYY-MM sort works lexicographically\n  const recent = months.slice(-monthsBack);\n\n  const sums: Record\u003Cstring, number> = {};\n  for (const m of recent) {\n    for (const [accountId, amt] of Object.entries(monthlyActuals[m] || {})) {\n      sums[accountId] = (sums[accountId] ?? 0) + Number(amt ?? 0);\n    }\n  }\n\n  const budgets: Record\u003Cstring, number> = {};\n  for (const [accountId, total] of Object.entries(sums)) {\n    budgets[accountId] = total / Math.max(1, recent.length);\n  }\n\n  return budgets;\n}\n",[237562],{"type":17,"tag":6121,"props":237563,"children":237564},{"__ignoreMap":7},[237565],{"type":23,"value":237560},{"type":17,"tag":68,"props":237567,"children":237569},{"id":237568},"step-9-fetch-the-latest-balance-sheet-and-calculate-runway",[237570],{"type":23,"value":237571},"Step 9: Fetch the latest balance sheet and calculate runway",{"type":17,"tag":29,"props":237573,"children":237574},{},[237575,237577,237582,237584,237590,237591,237596],{"type":23,"value":237576},"Runway requires a cash-on-hand estimate. This implementation uses balance sheet ",{"type":17,"tag":6121,"props":237578,"children":237580},{"className":237579},[],[237581],{"type":23,"value":220217},{"type":23,"value":237583}," and filters to accounts whose ",{"type":17,"tag":6121,"props":237585,"children":237587},{"className":237586},[],[237588],{"type":23,"value":237589},"AccountingAccount.type",{"type":23,"value":224475},{"type":17,"tag":6121,"props":237592,"children":237594},{"className":237593},[],[237595],{"type":23,"value":237342},{"type":23,"value":54},{"type":17,"tag":6893,"props":237598,"children":237601},{"className":237599,"code":237600,"language":18718,"meta":7},[18716],"import type { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nexport type AccountingBalancesheet = {\n  id?: string;\n  created_at?: string;\n  updated_at?: string;\n  start_at?: string;\n  end_at?: string;\n  currency?: string;\n  net_assets_amount?: number;\n  assets?: { account_id?: string; amount?: number; name?: string }[];\n};\n\nexport async function fetchLatestBalancesheet(\n  sdk: UnifiedTo,\n  connectionId: string\n): Promise\u003CAccountingBalancesheet | null> {\n  const page = await sdk.accounting.listAccountingBalancesheets({\n    connectionId,\n    limit: 1,\n    offset: 0,\n    sort: \"updated_at\",\n    order: \"desc\",\n    query: \"\",\n    start_gte: \"\",\n    end_lt: \"\",\n    end_le: \"\",\n    category_id: \"\",\n    contact_id: \"\",\n    fields: \"\",\n    raw: \"\",\n    updated_gte: \"\",\n  });\n\n  if (!page || page.length === 0) return null;\n  return page[0];\n}\n\nexport function estimateCashOnHand(\n  balancesheet: AccountingBalancesheet,\n  accountIndex: Record\u003Cstring, AccountingAccount>\n): number {\n  const assets = balancesheet.assets ?? [];\n  let cash = 0;\n\n  for (const a of assets) {\n    if (!a.account_id) continue;\n    const acct = accountIndex[a.account_id];\n    if (!acct) continue;\n\n    if (acct.type === \"BANK\") {\n      cash += Number(a.amount ?? 0);\n    }\n  }\n\n  return cash;\n}\n\nexport function estimateRunwayMonths(\n  cashOnHand: number,\n  monthlyExpenseBurn: number\n): number | null {\n  const burn = Number(monthlyExpenseBurn ?? 0);\n  if (burn \u003C= 0) return null;\n  return cashOnHand / burn;\n}\n",[237602],{"type":17,"tag":6121,"props":237603,"children":237604},{"__ignoreMap":7},[237605],{"type":23,"value":237600},{"type":17,"tag":68,"props":237607,"children":237608},{"id":233698},[237609],{"type":23,"value":233701},{"type":17,"tag":29,"props":237611,"children":237612},{},[237613],{"type":23,"value":237614},"This example pulls accounts + transactions, builds monthly actuals, suggests a baseline budget, fetches the latest balance sheet, and estimates runway.",{"type":17,"tag":6893,"props":237616,"children":237619},{"className":237617,"code":237618,"language":18718,"meta":7},[18716],"async function main() {\n  const connectionId = CONNECTION_ACCOUNTING!;\n  if (!connectionId) throw new Error(\"Missing CONNECTION_ACCOUNTING\");\n\n  const [orgs, accounts, transactions] = await Promise.all([\n    fetchAllOrganizations(sdk, connectionId, { pageSize: 50 }),\n    fetchAllAccounts(sdk, connectionId, { pageSize: 100 }),\n    fetchAllTransactions(sdk, connectionId, { pageSize: 100 }),\n  ]);\n\n  const org = pickPrimaryOrganization(orgs);\n  console.log(\"Organization:\", org?.name, org?.currency, org?.fiscal_year_end_month);\n\n  const accountIndex = indexAccounts(accounts);\n\n  const monthlyActuals = buildMonthlyExpenseActuals(transactions, accountIndex);\n  console.log(\"Monthly expense actuals (months):\", Object.keys(monthlyActuals));\n\n  const budgets = suggestMonthlyBudgets(monthlyActuals, 3);\n  console.log(\"Suggested monthly budgets (per account_id):\", budgets);\n\n  const latestBs = await fetchLatestBalancesheet(sdk, connectionId);\n  if (!latestBs) {\n    console.log(\"No balancesheet available.\");\n    return;\n  }\n\n  const cashOnHand = estimateCashOnHand(latestBs, accountIndex);\n\n  // Average monthly burn: sum of suggested budgets\n  const avgMonthlyBurn = Object.values(budgets).reduce((sum, v) => sum + Number(v ?? 0), 0);\n\n  const runway = estimateRunwayMonths(cashOnHand, avgMonthlyBurn);\n\n  console.log(\"Cash on hand:\", cashOnHand);\n  console.log(\"Avg monthly burn:\", avgMonthlyBurn);\n  console.log(\"Estimated runway (months):\", runway);\n}\n\nmain().catch(console.error);\n",[237620],{"type":17,"tag":6121,"props":237621,"children":237622},{"__ignoreMap":7},[237623],{"type":23,"value":237618},{"type":17,"tag":29,"props":237625,"children":237626},{},[237627],{"type":23,"value":237628},"You now have a transaction-level financial analysis flow that:",{"type":17,"tag":80,"props":237630,"children":237631},{},[237632,237641,237646,237651,237656],{"type":17,"tag":84,"props":237633,"children":237634},{},[237635,237637],{"type":23,"value":237636},"pulls normalized ledger transactions with ",{"type":17,"tag":133,"props":237638,"children":237639},{"href":1857},[237640],{"type":23,"value":1860},{"type":17,"tag":84,"props":237642,"children":237643},{},[237644],{"type":23,"value":237645},"labels transactions using the chart of accounts",{"type":17,"tag":84,"props":237647,"children":237648},{},[237649],{"type":23,"value":237650},"constructs month-bucketed actuals for budgets",{"type":17,"tag":84,"props":237652,"children":237653},{},[237654],{"type":23,"value":237655},"estimates baseline budgets from trailing averages",{"type":17,"tag":84,"props":237657,"children":237658},{},[237659],{"type":23,"value":237660},"fetches the latest balance sheet and computes runway from cash-on-hand and burn",{"type":17,"tag":29,"props":237662,"children":237663},{},[237664,237666,237671],{"type":23,"value":237665},"From here, you can extend the same dataset to support per-vendor spend views (via transaction ",{"type":17,"tag":6121,"props":237667,"children":237669},{"className":237668},[],[237670],{"type":23,"value":220991},{"type":23,"value":237672},"), budgeting by category trees, or cashflow-based runway calculations when your accounting integration supports those statements.",{"type":17,"tag":29,"props":237674,"children":237675},{},[237676,237677],{"type":23,"value":1609},{"type":17,"tag":133,"props":237678,"children":237680},{"href":1612,"rel":237679},[214],[237681],{"type":23,"value":1616},{"type":17,"tag":29,"props":237683,"children":237684},{},[237685,237686],{"type":23,"value":1609},{"type":17,"tag":133,"props":237687,"children":237689},{"href":1623,"rel":237688},[214],[237690],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":237692},[237693,237694,237695,237696,237706,237707,237708,237709,237710,237711,237712],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":237170,"depth":1629,"text":237173,"children":237697},[237698,237700,237702,237704],{"id":237181,"depth":1635,"text":237699},"Transactions (AccountingTransaction)",{"id":237276,"depth":1635,"text":237701},"Accounts (AccountingAccount)",{"id":237363,"depth":1635,"text":237703},"Organization (AccountingOrganization)",{"id":237403,"depth":1635,"text":237705},"Balance sheet (AccountingBalancesheet)",{"id":237471,"depth":1629,"text":237474},{"id":237491,"depth":1629,"text":237494},{"id":237506,"depth":1629,"text":237509},{"id":237521,"depth":1629,"text":237524},{"id":237548,"depth":1629,"text":237551},{"id":237568,"depth":1629,"text":237571},{"id":233698,"depth":1629,"text":233701},"content:blog:how_to_perform_financial_analysis_with_transaction_level_detail_using_unified_accounting_api.md","blog/how_to_perform_financial_analysis_with_transaction_level_detail_using_unified_accounting_api.md","blog/how_to_perform_financial_analysis_with_transaction_level_detail_using_unified_accounting_api",{"_path":237717,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":237718,"description":237719,"img":237720,"date":234743,"tag":12,"body":237721,"_type":1677,"_id":238628,"_source":1679,"_file":238629,"_stem":238630,"_extension":1682},"/blog/how_to_read_employee_payroll_history_with_unified","How to Read Employee Payroll History with Unified's","Payroll analysis breaks when products rely on inferred compensation instead of recorded payroll events.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_read_employee_payroll_history_with_unified-icon.png",{"type":14,"children":237722,"toc":238602},[237723,237728,237731,237738,237742,237768,237773,237791,237796,237808,237813,237817,237853,237859,237864,237873,237879,237907,237929,237935,237940,237949,237954,237960,237971,237980,237986,238003,238067,238073,238082,238088,238100,238124,238130,238141,238150,238156,238167,238231,238237,238246,238271,238283,238296,238324,238340,238346,238358,238364,238430,238436,238445,238451,238456,238462,238517,238535,238539,238544,238579,238584,238593],{"type":17,"tag":18,"props":237724,"children":237726},{"id":237725},"how-to-read-employee-payroll-history-with-unifieds",[237727],{"type":23,"value":237718},{"type":17,"tag":25,"props":237729,"children":237730},{},[],{"type":17,"tag":29,"props":237732,"children":237733},{},[237734],{"type":17,"tag":33,"props":237735,"children":237736},{},[237737],{"type":23,"value":234761},{"type":17,"tag":29,"props":237739,"children":237740},{},[237741],{"type":23,"value":237719},{"type":17,"tag":29,"props":237743,"children":237744},{},[237745,237747,237752,237754,237759,237761,237766],{"type":23,"value":237746},"Across HR systems, 'pay history' is often implied rather than explicit. Employee records may show a current salary or hourly rate, but they rarely encode ",{"type":17,"tag":33,"props":237748,"children":237749},{},[237750],{"type":23,"value":237751},"when",{"type":23,"value":237753}," that compensation applied, ",{"type":17,"tag":33,"props":237755,"children":237756},{},[237757],{"type":23,"value":237758},"which period",{"type":23,"value":237760}," it covered, or ",{"type":17,"tag":33,"props":237762,"children":237763},{},[237764],{"type":23,"value":237765},"what was actually paid",{"type":23,"value":237767}," after deductions. Vendors expose this differently, and many don't expose it cleanly at all.",{"type":17,"tag":29,"props":237769,"children":237770},{},[237771],{"type":23,"value":237772},"For a PM, this creates real constraints:",{"type":17,"tag":80,"props":237774,"children":237775},{},[237776,237781,237786],{"type":17,"tag":84,"props":237777,"children":237778},{},[237779],{"type":23,"value":237780},"Can payroll analytics be trusted across HR systems with different data models?",{"type":17,"tag":84,"props":237782,"children":237783},{},[237784],{"type":23,"value":237785},"Can historical pay be reconstructed without guessing past compensation?",{"type":17,"tag":84,"props":237787,"children":237788},{},[237789],{"type":23,"value":237790},"Can you explain exactly where a number came from during audits or disputes?",{"type":17,"tag":29,"props":237792,"children":237793},{},[237794],{"type":23,"value":237795},"Many products solve this by storing snapshots, reconstructing history, or quietly falling back to current-state compensation fields. That approach works—until it doesn't, and correctness becomes hard to defend.",{"type":17,"tag":29,"props":237797,"children":237798},{},[237799,237801,237806],{"type":23,"value":237800},"Unified's HR API takes a stricter stance. It does not invent payroll history or mutate employee records. Instead, it exposes ",{"type":17,"tag":33,"props":237802,"children":237803},{},[237804],{"type":23,"value":237805},"documented payroll artifacts",{"type":23,"value":237807},"—payslips and timeshifts—when the underlying HR system supports them. These represent point-in-time payroll snapshots and time-window compensation records, respectively.",{"type":17,"tag":29,"props":237809,"children":237810},{},[237811],{"type":23,"value":237812},"This guide shows how to assemble employee payroll history using those primitives only—reading payslips and timeshifts, joining them to employees, and aggregating results client-side—without vendor-specific integrations, undocumented fields, or assumed compensation history.",{"type":17,"tag":68,"props":237814,"children":237815},{"id":141798},[237816],{"type":23,"value":141801},{"type":17,"tag":80,"props":237818,"children":237819},{},[237820,237824,237828,237833,237844],{"type":17,"tag":84,"props":237821,"children":237822},{},[237823],{"type":23,"value":219393},{"type":17,"tag":84,"props":237825,"children":237826},{},[237827],{"type":23,"value":219398},{"type":17,"tag":84,"props":237829,"children":237830},{},[237831],{"type":23,"value":237832},"An HR integration enabled for your customer",{"type":17,"tag":84,"props":237834,"children":237835},{},[237836,237837,237842],{"type":23,"value":9619},{"type":17,"tag":6121,"props":237838,"children":237840},{"className":237839},[],[237841],{"type":23,"value":19766},{"type":23,"value":237843}," created via Unified's auth flow",{"type":17,"tag":84,"props":237845,"children":237846},{},[237847,237848,237852],{"type":23,"value":9619},{"type":17,"tag":133,"props":237849,"children":237850},{"href":7691},[237851],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":68,"props":237854,"children":237856},{"id":237855},"step-1-fetch-employees",[237857],{"type":23,"value":237858},"Step 1: Fetch employees",{"type":17,"tag":29,"props":237860,"children":237861},{},[237862],{"type":23,"value":237863},"Employees are the anchor object for all HR data. All payroll records reference employees by ID.",{"type":17,"tag":6893,"props":237865,"children":237868},{"className":237866,"code":237867,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n  security: { jwt: process.env.UNIFIED_API_KEY! },\n});\n\nconst connectionId = 'YOUR_CONNECTION_ID';\n\nconst employees = await sdk.hris.listHrisEmployees({\n  connectionId,\n  limit: 100,\n  offset: 0,\n  sort: 'updated_at',\n  order: 'asc',\n});\n",[237869],{"type":17,"tag":6121,"props":237870,"children":237871},{"__ignoreMap":7},[237872],{"type":23,"value":237867},{"type":17,"tag":239,"props":237874,"children":237876},{"id":237875},"what-this-returns",[237877],{"type":23,"value":237878},"What this returns",{"type":17,"tag":80,"props":237880,"children":237881},{},[237882,237897,237902],{"type":17,"tag":84,"props":237883,"children":237884},{},[237885,237886,237891,237892],{"type":23,"value":9619},{"type":17,"tag":48,"props":237887,"children":237888},{},[237889],{"type":23,"value":237890},"plain array",{"type":23,"value":210705},{"type":17,"tag":6121,"props":237893,"children":237895},{"className":237894},[],[237896],{"type":23,"value":206599},{"type":17,"tag":84,"props":237898,"children":237899},{},[237900],{"type":23,"value":237901},"No wrapper object",{"type":17,"tag":84,"props":237903,"children":237904},{},[237905],{"type":23,"value":237906},"No cursor field",{"type":17,"tag":29,"props":237908,"children":237909},{},[237910,237914,237916,237921,237922,237927],{"type":17,"tag":133,"props":237911,"children":237912},{"href":1857},[237913],{"type":23,"value":2409},{"type":23,"value":237915}," is handled with ",{"type":17,"tag":6121,"props":237917,"children":237919},{"className":237918},[],[237920],{"type":23,"value":48389},{"type":23,"value":34435},{"type":17,"tag":6121,"props":237923,"children":237925},{"className":237924},[],[237926],{"type":23,"value":48411},{"type":23,"value":237928},". You know you've reached the end when the number of returned records is less than your requested limit.",{"type":17,"tag":239,"props":237930,"children":237932},{"id":237931},"employee-identifiers",[237933],{"type":23,"value":237934},"Employee identifiers",{"type":17,"tag":29,"props":237936,"children":237937},{},[237938],{"type":23,"value":237939},"Each employee has a canonical identifier:",{"type":17,"tag":6893,"props":237941,"children":237944},{"className":237942,"code":237943,"language":18718,"meta":7},[18716],"employee.id\n",[237945],{"type":17,"tag":6121,"props":237946,"children":237947},{"__ignoreMap":7},[237948],{"type":23,"value":237943},{"type":17,"tag":29,"props":237950,"children":237951},{},[237952],{"type":23,"value":237953},"All payroll objects reference this ID.",{"type":17,"tag":68,"props":237955,"children":237957},{"id":237956},"step-2-fetch-payroll-history-via-payslips",[237958],{"type":23,"value":237959},"Step 2: Fetch payroll history via payslips",{"type":17,"tag":29,"props":237961,"children":237962},{},[237963,237965,237970],{"type":23,"value":237964},"Payslips are the primary source of ",{"type":17,"tag":48,"props":237966,"children":237967},{},[237968],{"type":23,"value":237969},"historical payroll data",{"type":23,"value":108848},{"type":17,"tag":6893,"props":237972,"children":237975},{"className":237973,"code":237974,"language":18718,"meta":7},[18716],"const payslips = await sdk.hris.listHrisPayslips({\n  connectionId,\n  limit: 100,\n  offset: 0,\n  user_id: employeeId, // optional filter\n  sort: 'updated_at',\n  order: 'asc',\n});\n",[237976],{"type":17,"tag":6121,"props":237977,"children":237978},{"__ignoreMap":7},[237979],{"type":23,"value":237974},{"type":17,"tag":239,"props":237981,"children":237983},{"id":237982},"payslip-semantics",[237984],{"type":23,"value":237985},"Payslip semantics",{"type":17,"tag":29,"props":237987,"children":237988},{},[237989,237990,237995,237997,238002],{"type":23,"value":159500},{"type":17,"tag":6121,"props":237991,"children":237993},{"className":237992},[],[237994],{"type":23,"value":234222},{"type":23,"value":237996}," represents a ",{"type":17,"tag":48,"props":237998,"children":237999},{},[238000],{"type":23,"value":238001},"point-in-time payroll snapshot",{"type":23,"value":20456},{"type":17,"tag":80,"props":238004,"children":238005},{},[238006,238022,238032,238040,238048,238056],{"type":17,"tag":84,"props":238007,"children":238008},{},[238009,238014,238015,238020],{"type":17,"tag":6121,"props":238010,"children":238012},{"className":238011},[],[238013],{"type":23,"value":21051},{"type":23,"value":26030},{"type":17,"tag":6121,"props":238016,"children":238018},{"className":238017},[],[238019],{"type":23,"value":21060},{"type":23,"value":238021},": pay period",{"type":17,"tag":84,"props":238023,"children":238024},{},[238025,238030],{"type":17,"tag":6121,"props":238026,"children":238028},{"className":238027},[],[238029],{"type":23,"value":187822},{"type":23,"value":238031},": payment date",{"type":17,"tag":84,"props":238033,"children":238034},{},[238035],{"type":17,"tag":6121,"props":238036,"children":238038},{"className":238037},[],[238039],{"type":23,"value":234270},{"type":17,"tag":84,"props":238041,"children":238042},{},[238043],{"type":17,"tag":6121,"props":238044,"children":238046},{"className":238045},[],[238047],{"type":23,"value":234277},{"type":17,"tag":84,"props":238049,"children":238050},{},[238051],{"type":17,"tag":6121,"props":238052,"children":238054},{"className":238053},[],[238055],{"type":23,"value":22296},{"type":17,"tag":84,"props":238057,"children":238058},{},[238059,238065],{"type":17,"tag":6121,"props":238060,"children":238062},{"className":238061},[],[238063],{"type":23,"value":238064},"details[]",{"type":23,"value":238066},": earnings, taxes, deductions",{"type":17,"tag":239,"props":238068,"children":238070},{"id":238069},"joining-payslips-to-employees",[238071],{"type":23,"value":238072},"Joining payslips to employees",{"type":17,"tag":6893,"props":238074,"children":238077},{"className":238075,"code":238076,"language":18718,"meta":7},[18716],"payslip.user_id === employee.id\n",[238078],{"type":17,"tag":6121,"props":238079,"children":238080},{"__ignoreMap":7},[238081],{"type":23,"value":238076},{"type":17,"tag":239,"props":238083,"children":238085},{"id":238084},"date-filtering",[238086],{"type":23,"value":238087},"Date filtering",{"type":17,"tag":29,"props":238089,"children":238090},{},[238091,238093,238098],{"type":23,"value":238092},"Payslips ",{"type":17,"tag":48,"props":238094,"children":238095},{},[238096],{"type":23,"value":238097},"cannot",{"type":23,"value":238099}," be filtered by pay-period dates server-side. To work with a date range:",{"type":17,"tag":80,"props":238101,"children":238102},{},[238103,238108],{"type":17,"tag":84,"props":238104,"children":238105},{},[238106],{"type":23,"value":238107},"Fetch all payslips",{"type":17,"tag":84,"props":238109,"children":238110},{},[238111,238113,238118,238119],{"type":23,"value":238112},"Filter client-side using ",{"type":17,"tag":6121,"props":238114,"children":238116},{"className":238115},[],[238117],{"type":23,"value":21051},{"type":23,"value":26030},{"type":17,"tag":6121,"props":238120,"children":238122},{"className":238121},[],[238123],{"type":23,"value":21060},{"type":17,"tag":68,"props":238125,"children":238127},{"id":238126},"step-3-fetch-time-based-compensation-via-timeshifts-optional",[238128],{"type":23,"value":238129},"Step 3: Fetch time-based compensation via timeshifts (optional)",{"type":17,"tag":29,"props":238131,"children":238132},{},[238133,238135,238140],{"type":23,"value":238134},"Some HR systems calculate payroll from worked hours rather than fixed salaries. For these, Unified exposes ",{"type":17,"tag":48,"props":238136,"children":238137},{},[238138],{"type":23,"value":238139},"timeshifts",{"type":23,"value":54},{"type":17,"tag":6893,"props":238142,"children":238145},{"className":238143,"code":238144,"language":18718,"meta":7},[18716],"const timeshifts = await sdk.hris.listHrisTimeshifts({\n  connectionId,\n  limit: 100,\n  offset: 0,\n  start_gte: '2026-01-01T00:00:00Z',\n  end_lt: '2026-02-01T00:00:00Z',\n});\n",[238146],{"type":17,"tag":6121,"props":238147,"children":238148},{"__ignoreMap":7},[238149],{"type":23,"value":238144},{"type":17,"tag":239,"props":238151,"children":238153},{"id":238152},"timeshift-semantics",[238154],{"type":23,"value":238155},"Timeshift semantics",{"type":17,"tag":29,"props":238157,"children":238158},{},[238159,238160,238165],{"type":23,"value":159500},{"type":17,"tag":6121,"props":238161,"children":238163},{"className":238162},[],[238164],{"type":23,"value":234302},{"type":23,"value":238166}," represents compensation for a time window:",{"type":17,"tag":80,"props":238168,"children":238169},{},[238170,238184,238192],{"type":17,"tag":84,"props":238171,"children":238172},{},[238173,238178,238179],{"type":17,"tag":6121,"props":238174,"children":238176},{"className":238175},[],[238177],{"type":23,"value":21051},{"type":23,"value":26030},{"type":17,"tag":6121,"props":238180,"children":238182},{"className":238181},[],[238183],{"type":23,"value":21060},{"type":17,"tag":84,"props":238185,"children":238186},{},[238187],{"type":17,"tag":6121,"props":238188,"children":238190},{"className":238189},[],[238191],{"type":23,"value":234343},{"type":17,"tag":84,"props":238193,"children":238194},{},[238195,238200,238202],{"type":17,"tag":6121,"props":238196,"children":238198},{"className":238197},[],[238199],{"type":23,"value":234198},{"type":23,"value":238201}," entries:\n",{"type":17,"tag":80,"props":238203,"children":238204},{},[238205,238213,238221],{"type":17,"tag":84,"props":238206,"children":238207},{},[238208],{"type":17,"tag":6121,"props":238209,"children":238211},{"className":238210},[],[238212],{"type":23,"value":25890},{"type":17,"tag":84,"props":238214,"children":238215},{},[238216],{"type":17,"tag":6121,"props":238217,"children":238219},{"className":238218},[],[238220],{"type":23,"value":22296},{"type":17,"tag":84,"props":238222,"children":238223},{},[238224,238229],{"type":17,"tag":6121,"props":238225,"children":238227},{"className":238226},[],[238228],{"type":23,"value":235208},{"type":23,"value":238230}," (HOUR, DAY, ONE_TIME, etc.)",{"type":17,"tag":239,"props":238232,"children":238234},{"id":238233},"joining-timeshifts-to-employees",[238235],{"type":23,"value":238236},"Joining timeshifts to employees",{"type":17,"tag":6893,"props":238238,"children":238241},{"className":238239,"code":238240,"language":18718,"meta":7},[18716],"timeshift.employee_user_id === employee.id\n",[238242],{"type":17,"tag":6121,"props":238243,"children":238244},{"__ignoreMap":7},[238245],{"type":23,"value":238240},{"type":17,"tag":29,"props":238247,"children":238248},{},[238249,238251,238256,238258,238263,238264,238269],{"type":23,"value":238250},"Timeshifts support ",{"type":17,"tag":48,"props":238252,"children":238253},{},[238254],{"type":23,"value":238255},"true server-side date filtering",{"type":23,"value":238257}," using ",{"type":17,"tag":6121,"props":238259,"children":238261},{"className":238260},[],[238262],{"type":23,"value":109144},{"type":23,"value":34435},{"type":17,"tag":6121,"props":238265,"children":238267},{"className":238266},[],[238268],{"type":23,"value":109151},{"type":23,"value":238270},", but availability depends on the integration.",{"type":17,"tag":68,"props":238272,"children":238274},{"id":238273},"step-4-understand-what-is-not-historical",[238275,238277,238281],{"type":23,"value":238276},"Step 4: Understand what is ",{"type":17,"tag":33,"props":238278,"children":238279},{},[238280],{"type":23,"value":159475},{"type":23,"value":238282}," historical",{"type":17,"tag":29,"props":238284,"children":238285},{},[238286,238288,238294],{"type":23,"value":238287},"Unified also exposes ",{"type":17,"tag":6121,"props":238289,"children":238291},{"className":238290},[],[238292],{"type":23,"value":238293},"employee.compensation[]",{"type":23,"value":238295},", but:",{"type":17,"tag":80,"props":238297,"children":238298},{},[238299,238309,238314],{"type":17,"tag":84,"props":238300,"children":238301},{},[238302,238304],{"type":23,"value":238303},"It has ",{"type":17,"tag":48,"props":238305,"children":238306},{},[238307],{"type":23,"value":238308},"no effective dates",{"type":17,"tag":84,"props":238310,"children":238311},{},[238312],{"type":23,"value":238313},"No history semantics are documented",{"type":17,"tag":84,"props":238315,"children":238316},{},[238317,238319],{"type":23,"value":238318},"It should be treated as ",{"type":17,"tag":48,"props":238320,"children":238321},{},[238322],{"type":23,"value":238323},"current-state compensation only",{"type":17,"tag":29,"props":238325,"children":238326},{},[238327,238329,238334,238335,238339],{"type":23,"value":238328},"For historical payroll analysis, always use ",{"type":17,"tag":48,"props":238330,"children":238331},{},[238332],{"type":23,"value":238333},"payslips",{"type":23,"value":75890},{"type":17,"tag":48,"props":238336,"children":238337},{},[238338],{"type":23,"value":238139},{"type":23,"value":54},{"type":17,"tag":68,"props":238341,"children":238343},{"id":238342},"step-5-aggregate-payroll-data-client-side",[238344],{"type":23,"value":238345},"Step 5: Aggregate payroll data client-side",{"type":17,"tag":29,"props":238347,"children":238348},{},[238349,238351,238356],{"type":23,"value":238350},"Unified returns ",{"type":17,"tag":48,"props":238352,"children":238353},{},[238354],{"type":23,"value":238355},"raw numeric values",{"type":23,"value":238357},". All aggregation is your responsibility.",{"type":17,"tag":239,"props":238359,"children":238361},{"id":238360},"key-constraints",[238362],{"type":23,"value":238363},"Key constraints",{"type":17,"tag":80,"props":238365,"children":238366},{},[238367,238393,238414],{"type":17,"tag":84,"props":238368,"children":238369},{},[238370,238375],{"type":17,"tag":48,"props":238371,"children":238372},{},[238373],{"type":23,"value":238374},"No currency normalization",{"type":17,"tag":80,"props":238376,"children":238377},{},[238378,238388],{"type":17,"tag":84,"props":238379,"children":238380},{},[238381,238383],{"type":23,"value":238382},"Each record includes its own ",{"type":17,"tag":6121,"props":238384,"children":238386},{"className":238385},[],[238387],{"type":23,"value":22296},{"type":17,"tag":84,"props":238389,"children":238390},{},[238391],{"type":23,"value":238392},"Aggregate only within the same currency",{"type":17,"tag":84,"props":238394,"children":238395},{},[238396,238401],{"type":17,"tag":48,"props":238397,"children":238398},{},[238399],{"type":23,"value":238400},"No frequency normalization",{"type":17,"tag":80,"props":238402,"children":238403},{},[238404,238409],{"type":17,"tag":84,"props":238405,"children":238406},{},[238407],{"type":23,"value":238408},"Timeshift compensation may be hourly, yearly, or one-time",{"type":17,"tag":84,"props":238410,"children":238411},{},[238412],{"type":23,"value":238413},"Convert units explicitly if needed",{"type":17,"tag":84,"props":238415,"children":238416},{},[238417,238422],{"type":17,"tag":48,"props":238418,"children":238419},{},[238420],{"type":23,"value":238421},"No server-side aggregation",{"type":17,"tag":80,"props":238423,"children":238424},{},[238425],{"type":17,"tag":84,"props":238426,"children":238427},{},[238428],{"type":23,"value":238429},"No totals, averages, or group-by endpoints",{"type":17,"tag":239,"props":238431,"children":238433},{"id":238432},"example-aggregation-logic-conceptual",[238434],{"type":23,"value":238435},"Example aggregation logic (conceptual)",{"type":17,"tag":6893,"props":238437,"children":238440},{"className":238438,"code":238439,"language":18718,"meta":7},[18716],"const totalsByPeriod = {};\n\nfor (const payslip of payslips) {\n  const periodKey = `${payslip.start_at}-${payslip.end_at}`;\n  const currency = payslip.currency;\n\n  if (!totalsByPeriod[periodKey]) {\n    totalsByPeriod[periodKey] = { currency, gross: 0, net: 0 };\n  }\n\n  totalsByPeriod[periodKey].gross += payslip.gross_amount ?? 0;\n  totalsByPeriod[periodKey].net += payslip.net_amount ?? 0;\n}\n",[238441],{"type":17,"tag":6121,"props":238442,"children":238443},{"__ignoreMap":7},[238444],{"type":23,"value":238439},{"type":17,"tag":68,"props":238446,"children":238448},{"id":238447},"error-handling-and-unsupported-features",[238449],{"type":23,"value":238450},"Error handling and unsupported features",{"type":17,"tag":29,"props":238452,"children":238453},{},[238454],{"type":23,"value":238455},"Unified uses standard HTTP status codes.",{"type":17,"tag":239,"props":238457,"children":238459},{"id":238458},"important-behavior",[238460],{"type":23,"value":238461},"Important behavior",{"type":17,"tag":80,"props":238463,"children":238464},{},[238465,238486,238501],{"type":17,"tag":84,"props":238466,"children":238467},{},[238468,238473],{"type":17,"tag":48,"props":238469,"children":238470},{},[238471],{"type":23,"value":238472},"501 Not Implemented",{"type":17,"tag":80,"props":238474,"children":238475},{},[238476,238481],{"type":17,"tag":84,"props":238477,"children":238478},{},[238479],{"type":23,"value":238480},"The integration does not support that feature (e.g. payslips or timeshifts)",{"type":17,"tag":84,"props":238482,"children":238483},{},[238484],{"type":23,"value":238485},"The connection itself is still valid",{"type":17,"tag":84,"props":238487,"children":238488},{},[238489,238493],{"type":17,"tag":48,"props":238490,"children":238491},{},[238492],{"type":23,"value":137475},{"type":17,"tag":80,"props":238494,"children":238495},{},[238496],{"type":17,"tag":84,"props":238497,"children":238498},{},[238499],{"type":23,"value":238500},"Connection is broken and must be recreated",{"type":17,"tag":84,"props":238502,"children":238503},{},[238504,238509],{"type":17,"tag":48,"props":238505,"children":238506},{},[238507],{"type":23,"value":238508},"403 Forbidden",{"type":17,"tag":80,"props":238510,"children":238511},{},[238512],{"type":17,"tag":84,"props":238513,"children":238514},{},[238515],{"type":23,"value":238516},"Missing scopes or permissions",{"type":17,"tag":29,"props":238518,"children":238519},{},[238520,238522,238526,238528,238533],{"type":23,"value":238521},"Always check the ",{"type":17,"tag":48,"props":238523,"children":238524},{},[238525],{"type":23,"value":211607},{"type":23,"value":238527}," tab for an integration in ",{"type":17,"tag":6121,"props":238529,"children":238531},{"className":238530},[],[238532],{"type":23,"value":106701},{"type":23,"value":238534}," to confirm object availability.",{"type":17,"tag":68,"props":238536,"children":238537},{"id":44585},[238538],{"type":23,"value":44588},{"type":17,"tag":29,"props":238540,"children":238541},{},[238542],{"type":23,"value":238543},"With Unified's HR API, you can reliably read employee payroll history by:",{"type":17,"tag":6154,"props":238545,"children":238546},{},[238547,238552,238563,238574],{"type":17,"tag":84,"props":238548,"children":238549},{},[238550],{"type":23,"value":238551},"Fetching employees",{"type":17,"tag":84,"props":238553,"children":238554},{},[238555,238557,238561],{"type":23,"value":238556},"Joining ",{"type":17,"tag":48,"props":238558,"children":238559},{},[238560],{"type":23,"value":238333},{"type":23,"value":238562}," for pay-period payroll snapshots",{"type":17,"tag":84,"props":238564,"children":238565},{},[238566,238568,238572],{"type":23,"value":238567},"Optionally joining ",{"type":17,"tag":48,"props":238569,"children":238570},{},[238571],{"type":23,"value":238139},{"type":23,"value":238573}," for time-based compensation",{"type":17,"tag":84,"props":238575,"children":238576},{},[238577],{"type":23,"value":238578},"Aggregating results client-side with explicit currency and frequency handling",{"type":17,"tag":29,"props":238580,"children":238581},{},[238582],{"type":23,"value":238583},"This approach avoids vendor-specific APIs, preserves correctness, and scales cleanly across HR systems—without Unified storing or mutating payroll data.",{"type":17,"tag":29,"props":238585,"children":238586},{},[238587,238588],{"type":23,"value":1609},{"type":17,"tag":133,"props":238589,"children":238591},{"href":1612,"rel":238590},[214],[238592],{"type":23,"value":1616},{"type":17,"tag":29,"props":238594,"children":238595},{},[238596,238597],{"type":23,"value":1609},{"type":17,"tag":133,"props":238598,"children":238600},{"href":1623,"rel":238599},[214],[238601],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":238603},[238604,238605,238609,238614,238618,238620,238624,238627],{"id":141798,"depth":1629,"text":141801},{"id":237855,"depth":1629,"text":237858,"children":238606},[238607,238608],{"id":237875,"depth":1635,"text":237878},{"id":237931,"depth":1635,"text":237934},{"id":237956,"depth":1629,"text":237959,"children":238610},[238611,238612,238613],{"id":237982,"depth":1635,"text":237985},{"id":238069,"depth":1635,"text":238072},{"id":238084,"depth":1635,"text":238087},{"id":238126,"depth":1629,"text":238129,"children":238615},[238616,238617],{"id":238152,"depth":1635,"text":238155},{"id":238233,"depth":1635,"text":238236},{"id":238273,"depth":1629,"text":238619},"Step 4: Understand what is not historical",{"id":238342,"depth":1629,"text":238345,"children":238621},[238622,238623],{"id":238360,"depth":1635,"text":238363},{"id":238432,"depth":1635,"text":238435},{"id":238447,"depth":1629,"text":238450,"children":238625},[238626],{"id":238458,"depth":1635,"text":238461},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_read_employee_payroll_history_with_unified.md","blog/how_to_read_employee_payroll_history_with_unified.md","blog/how_to_read_employee_payroll_history_with_unified",{"_path":238632,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":238633,"description":238634,"img":238635,"date":238636,"tag":12,"body":238637,"_type":1677,"_id":239364,"_source":1679,"_file":239365,"_stem":239366,"_extension":1682},"/blog/how_to_train_ai_on_accounting_data_with_unified_accounting_api","How to Train AI on Accounting Data with Unified's Accounting API","Training models on accounting data sounds like a data science problem. In reality, it's a product problem first.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_train_ai_on_accounting_data_with_unified_accounting_api-icon.png","2026-01-09T00:00:00.000Z",{"type":14,"children":238638,"toc":239347},[238639,238644,238647,238655,238659,238664,238669,238687,238692,238702,238707,238711,238745,238749,238758,238768,238776,238780,238788,238794,238798,238810,238881,238891,238896,238990,239000,239012,239067,239079,239084,239123,239129,239133,239142,239148,239157,239163,239168,239172,239229,239238,239249,239261,239266,239275,239287,239293,239298,239307,239312,239317,239329,239338],{"type":17,"tag":18,"props":238640,"children":238642},{"id":238641},"how-to-train-ai-on-accounting-data-with-unifieds-accounting-api",[238643],{"type":23,"value":238633},{"type":17,"tag":25,"props":238645,"children":238646},{},[],{"type":17,"tag":29,"props":238648,"children":238649},{},[238650],{"type":17,"tag":33,"props":238651,"children":238652},{},[238653],{"type":23,"value":238654},"January 9, 2026",{"type":17,"tag":29,"props":238656,"children":238657},{},[238658],{"type":23,"value":238634},{"type":17,"tag":29,"props":238660,"children":238661},{},[238662],{"type":23,"value":238663},"As soon as you support multiple accounting systems, the shape of your training data starts to drift. Amounts may be signed or unsigned. Credits and debits may be inferred instead of explicit. Accounts might represent categories, ledgers, or reporting groupings depending on the provider. Counterparties may be embedded in transactions, split across contacts, or missing entirely.",{"type":17,"tag":29,"props":238665,"children":238666},{},[238667],{"type":23,"value":238668},"For a PM, this creates hard questions upstream of model quality:",{"type":17,"tag":80,"props":238670,"children":238671},{},[238672,238677,238682],{"type":17,"tag":84,"props":238673,"children":238674},{},[238675],{"type":23,"value":238676},"Can we guarantee consistent inputs across customers on different accounting systems?",{"type":17,"tag":84,"props":238678,"children":238679},{},[238680],{"type":23,"value":238681},"Can we retrain models incrementally without rebuilding the dataset every time?",{"type":17,"tag":84,"props":238683,"children":238684},{},[238685],{"type":23,"value":238686},"Can we explain model behavior if the underlying accounting semantics vary by provider?",{"type":17,"tag":29,"props":238688,"children":238689},{},[238690],{"type":23,"value":238691},"Most AI features built on accounting data quietly accumulate exceptions: vendor-specific preprocessing, system-specific heuristics, and training pipelines that only work reliably for a subset of integrations.",{"type":17,"tag":29,"props":238693,"children":238694},{},[238695,238696,238700],{"type":23,"value":25244},{"type":17,"tag":133,"props":238697,"children":238698},{"href":82425},[238699],{"type":23,"value":128616},{"type":23,"value":238701}," is designed to eliminate that divergence at the source. Instead of normalizing data after ingestion, Unified exposes transactions, accounts, and contacts through a consistent schema across providers. Signed amounts, stable timestamps, and account attribution are standardized before the data ever enters your training pipeline.",{"type":17,"tag":29,"props":238703,"children":238704},{},[238705],{"type":23,"value":238706},"This guide shows how to turn those normalized accounting objects into a flat, training-ready dataset—without conditional logic for QuickBooks vs. Xero vs. NetSuite, and without rethinking your pipeline as new accounting systems are added.",{"type":17,"tag":239,"props":238708,"children":238709},{"id":141798},[238710],{"type":23,"value":141801},{"type":17,"tag":80,"props":238712,"children":238713},{},[238714,238718,238727,238736],{"type":17,"tag":84,"props":238715,"children":238716},{},[238717],{"type":23,"value":199683},{"type":17,"tag":84,"props":238719,"children":238720},{},[238721,238722,238726],{"type":23,"value":234004},{"type":17,"tag":48,"props":238723,"children":238724},{},[238725],{"type":23,"value":104365},{"type":23,"value":234010},{"type":17,"tag":84,"props":238728,"children":238729},{},[238730,238731,238735],{"type":23,"value":199693},{"type":17,"tag":133,"props":238732,"children":238733},{"href":7691},[238734],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":238737,"children":238738},{},[238739,238740],{"type":23,"value":231444},{"type":17,"tag":6121,"props":238741,"children":238743},{"className":238742},[],[238744],{"type":23,"value":19766},{"type":17,"tag":68,"props":238746,"children":238747},{"id":211198},[238748],{"type":23,"value":211201},{"type":17,"tag":6893,"props":238750,"children":238753},{"className":238751,"code":238752,"language":48432,"meta":7},[48430],"mkdir accounting-ai-training-demo\ncd accounting-ai-training-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[238754],{"type":17,"tag":6121,"props":238755,"children":238756},{"__ignoreMap":7},[238757],{"type":23,"value":238752},{"type":17,"tag":29,"props":238759,"children":238760},{},[238761,238762,238767],{"type":23,"value":211215},{"type":17,"tag":6121,"props":238763,"children":238765},{"className":238764},[],[238766],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":238769,"children":238771},{"className":238770,"code":231476,"language":20901,"meta":23},[20899],[238772],{"type":17,"tag":6121,"props":238773,"children":238774},{"__ignoreMap":7},[238775],{"type":23,"value":231476},{"type":17,"tag":68,"props":238777,"children":238778},{"id":211235},[238779],{"type":23,"value":211238},{"type":17,"tag":6893,"props":238781,"children":238783},{"className":238782,"code":231489,"language":18718,"meta":7},[18716],[238784],{"type":17,"tag":6121,"props":238785,"children":238786},{"__ignoreMap":7},[238787],{"type":23,"value":231489},{"type":17,"tag":68,"props":238789,"children":238791},{"id":238790},"step-3-understand-the-normalized-accounting-objects",[238792],{"type":23,"value":238793},"Step 3: Understand the normalized Accounting objects",{"type":17,"tag":29,"props":238795,"children":238796},{},[238797],{"type":23,"value":237178},{"type":17,"tag":29,"props":238799,"children":238800},{},[238801,238803,238808],{"type":23,"value":238802},"For training datasets, the most useful base object is ",{"type":17,"tag":6121,"props":238804,"children":238806},{"className":238805},[],[238807],{"type":23,"value":219463},{"type":23,"value":238809}," because it provides:",{"type":17,"tag":80,"props":238811,"children":238812},{},[238813,238830,238841,238864],{"type":17,"tag":84,"props":238814,"children":238815},{},[238816,238818,238823,238824,238829],{"type":23,"value":238817},"signed amounts (",{"type":17,"tag":6121,"props":238819,"children":238821},{"className":238820},[],[238822],{"type":23,"value":219481},{"type":23,"value":224475},{"type":17,"tag":48,"props":238825,"children":238826},{},[238827],{"type":23,"value":238828},"negative for CREDIT, positive for DEBIT",{"type":23,"value":12034},{"type":17,"tag":84,"props":238831,"children":238832},{},[238833,238835,238840],{"type":23,"value":238834},"consistent account attribution (",{"type":17,"tag":6121,"props":238836,"children":238838},{"className":238837},[],[238839],{"type":23,"value":184840},{"type":23,"value":12034},{"type":17,"tag":84,"props":238842,"children":238843},{},[238844,238846,238851,238852,238857,238858,238863],{"type":23,"value":238845},"counterparty hints (",{"type":17,"tag":6121,"props":238847,"children":238849},{"className":238848},[],[238850],{"type":23,"value":220991},{"type":23,"value":120761},{"type":17,"tag":6121,"props":238853,"children":238855},{"className":238854},[],[238856],{"type":23,"value":221006},{"type":23,"value":26030},{"type":17,"tag":6121,"props":238859,"children":238861},{"className":238860},[],[238862],{"type":23,"value":220999},{"type":23,"value":12034},{"type":17,"tag":84,"props":238865,"children":238866},{},[238867,238869,238874,238875,238880],{"type":23,"value":238868},"stable timestamps (",{"type":17,"tag":6121,"props":238870,"children":238872},{"className":238871},[],[238873],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":238876,"children":238878},{"className":238877},[],[238879],{"type":23,"value":25337},{"type":23,"value":12034},{"type":17,"tag":239,"props":238882,"children":238883},{"id":237181},[238884,238885,238890],{"type":23,"value":222314},{"type":17,"tag":6121,"props":238886,"children":238888},{"className":238887},[],[238889],{"type":23,"value":219463},{"type":23,"value":12034},{"type":17,"tag":29,"props":238892,"children":238893},{},[238894],{"type":23,"value":238895},"Key fields used in this guide:",{"type":17,"tag":80,"props":238897,"children":238898},{},[238899,238919,238929,238937,238945,238955,238970,238980],{"type":17,"tag":84,"props":238900,"children":238901},{},[238902,238907,238908,238913,238914],{"type":17,"tag":6121,"props":238903,"children":238905},{"className":238904},[],[238906],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":238909,"children":238911},{"className":238910},[],[238912],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":238915,"children":238917},{"className":238916},[],[238918],{"type":23,"value":25337},{"type":17,"tag":84,"props":238920,"children":238921},{},[238922,238927],{"type":17,"tag":6121,"props":238923,"children":238925},{"className":238924},[],[238926],{"type":23,"value":219481},{"type":23,"value":238928}," (signed)",{"type":17,"tag":84,"props":238930,"children":238931},{},[238932],{"type":17,"tag":6121,"props":238933,"children":238935},{"className":238934},[],[238936],{"type":23,"value":22296},{"type":17,"tag":84,"props":238938,"children":238939},{},[238940],{"type":17,"tag":6121,"props":238941,"children":238943},{"className":238942},[],[238944],{"type":23,"value":184840},{"type":17,"tag":84,"props":238946,"children":238947},{},[238948,238953],{"type":17,"tag":6121,"props":238949,"children":238951},{"className":238950},[],[238952],{"type":23,"value":27310},{"type":23,"value":238954}," (e.g., Bill, JournalEntry, CreditCardCharge, etc.)",{"type":17,"tag":84,"props":238956,"children":238957},{},[238958,238964,238965],{"type":17,"tag":6121,"props":238959,"children":238961},{"className":238960},[],[238962],{"type":23,"value":238963},"memo",{"type":23,"value":11826},{"type":17,"tag":6121,"props":238966,"children":238968},{"className":238967},[],[238969],{"type":23,"value":220868},{"type":17,"tag":84,"props":238971,"children":238972},{},[238973,238978],{"type":17,"tag":6121,"props":238974,"children":238976},{"className":238975},[],[238977],{"type":23,"value":220991},{"type":23,"value":238979}," (IDs plus supplier/customer flags)",{"type":17,"tag":84,"props":238981,"children":238982},{},[238983,238988],{"type":17,"tag":6121,"props":238984,"children":238986},{"className":238985},[],[238987],{"type":23,"value":219548},{"type":23,"value":238989}," (optional, for more detailed attribution)",{"type":17,"tag":239,"props":238991,"children":238992},{"id":237276},[238993,238994,238999],{"type":23,"value":237279},{"type":17,"tag":6121,"props":238995,"children":238997},{"className":238996},[],[238998],{"type":23,"value":219515},{"type":23,"value":12034},{"type":17,"tag":29,"props":239001,"children":239002},{},[239003,239005,239010],{"type":23,"value":239004},"Accounts turn ",{"type":17,"tag":6121,"props":239006,"children":239008},{"className":239007},[],[239009],{"type":23,"value":184840},{"type":23,"value":239011}," into labels your model can learn:",{"type":17,"tag":80,"props":239013,"children":239014},{},[239015,239029,239056],{"type":17,"tag":84,"props":239016,"children":239017},{},[239018,239023,239024],{"type":17,"tag":6121,"props":239019,"children":239021},{"className":239020},[],[239022],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":239025,"children":239027},{"className":239026},[],[239028],{"type":23,"value":18781},{"type":17,"tag":84,"props":239030,"children":239031},{},[239032,239037,239038,239043,239044,239049,239050,239055],{"type":17,"tag":6121,"props":239033,"children":239035},{"className":239034},[],[239036],{"type":23,"value":27310},{"type":23,"value":149495},{"type":17,"tag":6121,"props":239039,"children":239041},{"className":239040},[],[239042],{"type":23,"value":219728},{"type":23,"value":11826},{"type":17,"tag":6121,"props":239045,"children":239047},{"className":239046},[],[239048],{"type":23,"value":219748},{"type":23,"value":11826},{"type":17,"tag":6121,"props":239051,"children":239053},{"className":239052},[],[239054],{"type":23,"value":223051},{"type":23,"value":149980},{"type":17,"tag":84,"props":239057,"children":239058},{},[239059,239061,239066],{"type":23,"value":239060},"hierarchy fields like ",{"type":17,"tag":6121,"props":239062,"children":239064},{"className":239063},[],[239065],{"type":23,"value":15863},{"type":23,"value":200060},{"type":17,"tag":239,"props":239068,"children":239070},{"id":239069},"contacts-accountingcontact-optional-but-useful",[239071,239072,239077],{"type":23,"value":211264},{"type":17,"tag":6121,"props":239073,"children":239075},{"className":239074},[],[239076],{"type":23,"value":224013},{"type":23,"value":239078},") (optional but useful)",{"type":17,"tag":29,"props":239080,"children":239081},{},[239082],{"type":23,"value":239083},"Contacts let you attach stable vendor/customer labels:",{"type":17,"tag":80,"props":239085,"children":239086},{},[239087,239095,239109],{"type":17,"tag":84,"props":239088,"children":239089},{},[239090],{"type":17,"tag":6121,"props":239091,"children":239093},{"className":239092},[],[239094],{"type":23,"value":18766},{"type":17,"tag":84,"props":239096,"children":239097},{},[239098,239103,239104],{"type":17,"tag":6121,"props":239099,"children":239101},{"className":239100},[],[239102],{"type":23,"value":18781},{"type":23,"value":26030},{"type":17,"tag":6121,"props":239105,"children":239107},{"className":239106},[],[239108],{"type":23,"value":62786},{"type":17,"tag":84,"props":239110,"children":239111},{},[239112,239117,239118],{"type":17,"tag":6121,"props":239113,"children":239115},{"className":239114},[],[239116],{"type":23,"value":221006},{"type":23,"value":11826},{"type":17,"tag":6121,"props":239119,"children":239121},{"className":239120},[],[239122],{"type":23,"value":220999},{"type":17,"tag":68,"props":239124,"children":239126},{"id":239125},"step-4-fetch-all-transactions-with-pagination",[239127],{"type":23,"value":239128},"Step 4: Fetch all transactions (with pagination)",{"type":17,"tag":29,"props":239130,"children":239131},{},[239132],{"type":23,"value":237479},{"type":17,"tag":6893,"props":239134,"children":239137},{"className":239135,"code":239136,"language":18718,"meta":7},[18716],"import type { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nexport type AccountingTransaction = {\n  id?: string;\n  created_at?: string; // ISO date\n  updated_at?: string; // ISO date\n  memo?: string;\n  reference?: string;\n  total_amount?: number; // negative for CREDIT, positive for DEBIT\n  tax_amount?: number; // negative for CREDIT, positive for DEBIT\n  sub_total_amount?: number;\n  account_id?: string;\n  currency?: string;\n  type?: string;\n  contacts?: {\n    id?: string;\n    is_customer?: boolean;\n    is_supplier?: boolean;\n  }[];\n  lineitems?: {\n    id?: string;\n    unit_quantity?: number;\n    unit_amount?: number;\n    total_amount?: number; // signed\n    account_id?: string;\n    object_type?: string;\n    name?: string;\n    description?: string;\n  }[];\n};\n\nexport async function fetchAllTransactions(\n  sdk: UnifiedTo,\n  connectionId: string,\n  opts?: {\n    pageSize?: number;\n    updated_gte?: string;\n    sort?: \"name\" | \"updated_at\" | \"created_at\";\n    order?: \"asc\" | \"desc\";\n    query?: string;\n    contact_id?: string;\n    fields?: string;\n    raw?: string;\n  }\n): Promise\u003CAccountingTransaction[]> {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: AccountingTransaction[] = [];\n\n  while (true) {\n    const page = await sdk.accounting.listAccountingTransactions({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte,\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      contact_id: opts?.contact_id ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[239138],{"type":17,"tag":6121,"props":239139,"children":239140},{"__ignoreMap":7},[239141],{"type":23,"value":239136},{"type":17,"tag":68,"props":239143,"children":239145},{"id":239144},"step-5-fetch-accounts-for-labeling",[239146],{"type":23,"value":239147},"Step 5: Fetch accounts (for labeling)",{"type":17,"tag":6893,"props":239149,"children":239152},{"className":239150,"code":239151,"language":18718,"meta":7},[18716],"import type { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nexport type AccountingAccount = {\n  id?: string;\n  name?: string;\n  type?:\n    | \"ACCOUNTS_PAYABLE\"\n    | \"ACCOUNTS_RECEIVABLE\"\n    | \"BANK\"\n    | \"CREDIT_CARD\"\n    | \"FIXED_ASSET\"\n    | \"LIABILITY\"\n    | \"EQUITY\"\n    | \"EXPENSE\"\n    | \"REVENUE\"\n    | \"OTHER\";\n  parent_id?: string;\n};\n\nexport async function fetchAllAccounts(\n  sdk: UnifiedTo,\n  connectionId: string,\n  opts?: {\n    pageSize?: number;\n    updated_gte?: string;\n    sort?: \"name\" | \"updated_at\" | \"created_at\";\n    order?: \"asc\" | \"desc\";\n    query?: string;\n    fields?: string;\n    raw?: string;\n  }\n): Promise\u003CAccountingAccount[]> {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: AccountingAccount[] = [];\n\n  while (true) {\n    const page = await sdk.accounting.listAccountingAccounts({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte,\n      sort: opts?.sort ?? \"updated_at\",\n      order: opts?.order ?? \"asc\",\n      query: opts?.query ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[239153],{"type":17,"tag":6121,"props":239154,"children":239155},{"__ignoreMap":7},[239156],{"type":23,"value":239151},{"type":17,"tag":68,"props":239158,"children":239160},{"id":239159},"step-6-convert-transactions-into-training-rows",[239161],{"type":23,"value":239162},"Step 6: Convert transactions into training rows",{"type":17,"tag":29,"props":239164,"children":239165},{},[239166],{"type":23,"value":239167},"This step turns raw accounting objects into a flat dataset suitable for model training. Each row is one normalized transaction with stable labels (account name/type) and optional vendor/customer hints.",{"type":17,"tag":29,"props":239169,"children":239170},{},[239171],{"type":23,"value":19821},{"type":17,"tag":80,"props":239173,"children":239174},{},[239175,239193,239204],{"type":17,"tag":84,"props":239176,"children":239177},{},[239178,239180,239185,239186,239191],{"type":23,"value":239179},"Keep ",{"type":17,"tag":6121,"props":239181,"children":239183},{"className":239182},[],[239184],{"type":23,"value":219481},{"type":23,"value":18757},{"type":17,"tag":48,"props":239187,"children":239188},{},[239189],{"type":23,"value":239190},"signed",{"type":23,"value":239192}," (negative credits, positive debits).",{"type":17,"tag":84,"props":239194,"children":239195},{},[239196,239197,239202],{"type":23,"value":239179},{"type":17,"tag":6121,"props":239198,"children":239200},{"className":239199},[],[239201],{"type":23,"value":22296},{"type":23,"value":239203}," as a feature. Don't sum across currencies unless you explicitly convert later.",{"type":17,"tag":84,"props":239205,"children":239206},{},[239207,239208,239213,239215,239220,239222,239227],{"type":23,"value":33722},{"type":17,"tag":6121,"props":239209,"children":239211},{"className":239210},[],[239212],{"type":23,"value":25337},{"type":23,"value":239214}," for incremental exports (",{"type":17,"tag":6121,"props":239216,"children":239218},{"className":239217},[],[239219],{"type":23,"value":26291},{"type":23,"value":239221},"), and keep ",{"type":17,"tag":6121,"props":239223,"children":239225},{"className":239224},[],[239226],{"type":23,"value":33446},{"type":23,"value":239228}," as an event timestamp feature.",{"type":17,"tag":6893,"props":239230,"children":239233},{"className":239231,"code":239232,"language":18718,"meta":7},[18716],"export type TrainingRow = {\n  transaction_id: string;\n  created_at: string | null;\n  updated_at: string | null;\n\n  amount: number;\n  currency: string | null;\n\n  transaction_type: string | null;\n  memo: string | null;\n  reference: string | null;\n\n  account_id: string | null;\n  account_name: string | null;\n  account_type: string | null;\n\n  // Supplier/customer hints from normalized contacts on the transaction\n  counterparty_contact_id: string | null;\n  counterparty_is_supplier: boolean | null;\n  counterparty_is_customer: boolean | null;\n};\n\nfunction indexAccounts(accounts: AccountingAccount[]): Record\u003Cstring, AccountingAccount> {\n  return Object.fromEntries(accounts.filter((a) => a.id).map((a) => [a.id!, a]));\n}\n\nfunction pickCounterparty(\n  tx: AccountingTransaction\n): { id: string | null; is_supplier: boolean | null; is_customer: boolean | null } {\n  // Prefer a supplier contact when present\n  const supplier = tx.contacts?.find((c) => c.id && c.is_supplier);\n  if (supplier?.id) return { id: supplier.id, is_supplier: true, is_customer: supplier.is_customer ?? null };\n\n  // Otherwise fall back to any contact ID if present\n  const any = tx.contacts?.find((c) => c.id);\n  if (any?.id) return { id: any.id, is_supplier: any.is_supplier ?? null, is_customer: any.is_customer ?? null };\n\n  return { id: null, is_supplier: null, is_customer: null };\n}\n\nexport function toTrainingRows(\n  transactions: AccountingTransaction[],\n  accounts: AccountingAccount[]\n): TrainingRow[] {\n  const accountIndex = indexAccounts(accounts);\n\n  return transactions\n    .filter((t) => t.id)\n    .map((t) => {\n      const acct = t.account_id ? accountIndex[t.account_id] : undefined;\n      const cp = pickCounterparty(t);\n\n      return {\n        transaction_id: t.id!,\n        created_at: t.created_at ?? null,\n        updated_at: t.updated_at ?? null,\n\n        amount: Number(t.total_amount ?? 0),\n        currency: t.currency ?? null,\n\n        transaction_type: t.type ?? null,\n        memo: t.memo ?? null,\n        reference: t.reference ?? null,\n\n        account_id: t.account_id ?? null,\n        account_name: acct?.name ?? null,\n        account_type: acct?.type ?? null,\n\n        counterparty_contact_id: cp.id,\n        counterparty_is_supplier: cp.is_supplier,\n        counterparty_is_customer: cp.is_customer,\n      };\n    });\n}\n",[239234],{"type":17,"tag":6121,"props":239235,"children":239236},{"__ignoreMap":7},[239237],{"type":23,"value":239232},{"type":17,"tag":68,"props":239239,"children":239241},{"id":239240},"step-7-optional-incremental-export-using-updated_gte",[239242,239244],{"type":23,"value":239243},"Step 7 (optional): Incremental export using ",{"type":17,"tag":6121,"props":239245,"children":239247},{"className":239246},[],[239248],{"type":23,"value":26291},{"type":17,"tag":29,"props":239250,"children":239251},{},[239252,239254,239259],{"type":23,"value":239253},"For training pipelines, you rarely want to rebuild the entire dataset on every run. Unified list endpoints support ",{"type":17,"tag":6121,"props":239255,"children":239257},{"className":239256},[],[239258],{"type":23,"value":26291},{"type":23,"value":239260},", so you can export only records that changed since your last successful run.",{"type":17,"tag":29,"props":239262,"children":239263},{},[239264],{"type":23,"value":239265},"Example usage:",{"type":17,"tag":6893,"props":239267,"children":239270},{"className":239268,"code":239269,"language":18718,"meta":7},[18716],"const lastRun = \"2025-12-01T00:00:00.000Z\";\n\nconst transactions = await fetchAllTransactions(sdk, connectionId, {\n  pageSize: 100,\n  updated_gte: lastRun,\n  sort: \"updated_at\",\n  order: \"asc\",\n});\n",[239271],{"type":17,"tag":6121,"props":239272,"children":239273},{"__ignoreMap":7},[239274],{"type":23,"value":239269},{"type":17,"tag":29,"props":239276,"children":239277},{},[239278,239279,239285],{"type":23,"value":209932},{"type":17,"tag":6121,"props":239280,"children":239282},{"className":239281},[],[239283],{"type":23,"value":239284},"lastRun",{"type":23,"value":239286}," in your system (DB, object storage, etc.) and advance it only after a successful export.",{"type":17,"tag":68,"props":239288,"children":239290},{"id":239289},"step-8-putting-it-all-together",[239291],{"type":23,"value":239292},"Step 8: Putting it all together",{"type":17,"tag":29,"props":239294,"children":239295},{},[239296],{"type":23,"value":239297},"This example fetches transactions + accounts, builds training rows, and prints a small sample.",{"type":17,"tag":6893,"props":239299,"children":239302},{"className":239300,"code":239301,"language":18718,"meta":7},[18716],"async function main() {\n  const connectionId = CONNECTION_ACCOUNTING!;\n  if (!connectionId) throw new Error(\"Missing CONNECTION_ACCOUNTING\");\n\n  const [transactions, accounts] = await Promise.all([\n    fetchAllTransactions(sdk, connectionId, { pageSize: 100, sort: \"updated_at\", order: \"asc\" }),\n    fetchAllAccounts(sdk, connectionId, { pageSize: 100, sort: \"updated_at\", order: \"asc\" }),\n  ]);\n\n  const rows = toTrainingRows(transactions, accounts);\n\n  console.log(\"Training rows (first 5):\", rows.slice(0, 5));\n  console.log(\"Row count:\", rows.length);\n}\n\nmain().catch(console.error);\n",[239303],{"type":17,"tag":6121,"props":239304,"children":239305},{"__ignoreMap":7},[239306],{"type":23,"value":239301},{"type":17,"tag":29,"props":239308,"children":239309},{},[239310],{"type":23,"value":239311},"You now have a repeatable export flow that pages through normalized accounting transactions, enriches them with account metadata, and outputs a consistent training dataset across accounting systems.",{"type":17,"tag":29,"props":239313,"children":239314},{},[239315],{"type":23,"value":239316},"This dataset is suitable for model training, evaluation, and retraining workflows without changing your integration logic per provider.",{"type":17,"tag":29,"props":239318,"children":239319},{},[239320,239322,239327],{"type":23,"value":239321},"Optional next steps are incremental exports using ",{"type":17,"tag":6121,"props":239323,"children":239325},{"className":239324},[],[239326],{"type":23,"value":26291},{"type":23,"value":239328},", adding contact enrichment for vendor names, and incorporating period-level labels from Profit & Loss or Cash Flow reports when your training objective requires it.",{"type":17,"tag":29,"props":239330,"children":239331},{},[239332,239333],{"type":23,"value":1609},{"type":17,"tag":133,"props":239334,"children":239336},{"href":1612,"rel":239335},[214],[239337],{"type":23,"value":1616},{"type":17,"tag":29,"props":239339,"children":239340},{},[239341,239342],{"type":23,"value":1609},{"type":17,"tag":133,"props":239343,"children":239345},{"href":1623,"rel":239344},[214],[239346],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":239348},[239349,239350,239351,239352,239358,239359,239360,239361,239363],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":238790,"depth":1629,"text":238793,"children":239353},[239354,239355,239356],{"id":237181,"depth":1635,"text":237699},{"id":237276,"depth":1635,"text":237701},{"id":239069,"depth":1635,"text":239357},"Contacts (AccountingContact) (optional but useful)",{"id":239125,"depth":1629,"text":239128},{"id":239144,"depth":1629,"text":239147},{"id":239159,"depth":1629,"text":239162},{"id":239240,"depth":1629,"text":239362},"Step 7 (optional): Incremental export using updated_gte",{"id":239289,"depth":1629,"text":239292},"content:blog:how_to_train_ai_on_accounting_data_with_unified_accounting_api.md","blog/how_to_train_ai_on_accounting_data_with_unified_accounting_api.md","blog/how_to_train_ai_on_accounting_data_with_unified_accounting_api",{"_path":239368,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":239369,"description":239370,"img":239371,"date":239372,"tag":12,"body":239373,"_type":1677,"_id":239591,"_source":1679,"_file":239592,"_stem":239593,"_extension":1682},"/blog/why_rag_breaks_in_execution_time_agent_workflows","Why RAG Breaks in Execution-Time Agent Workflows","Retrieval-augmented generation (RAG) solved a real problem. Instead of relying on model training data alone, we retrieve external context and ground responses...","https://s3.us-east-2.amazonaws.com/unified-article-images/why_rag_breaks_in_execution_time_agent_workflows-icon.png","2026-01-05T17:41:00.000Z",{"type":14,"children":239374,"toc":239572},[239375,239380,239383,239391,239400,239406,239411,239417,239422,239428,239433,239439,239444,239450,239455,239461,239466,239472,239477,239483,239488,239494,239499,239505,239510,239516,239521,239525,239530,239536,239541,239545,239550,239561],{"type":17,"tag":18,"props":239376,"children":239378},{"id":239377},"why-rag-breaks-in-execution-time-agent-workflows",[239379],{"type":23,"value":239369},{"type":17,"tag":25,"props":239381,"children":239382},{},[],{"type":17,"tag":29,"props":239384,"children":239385},{},[239386],{"type":17,"tag":33,"props":239387,"children":239388},{},[239389],{"type":23,"value":239390},"January 5, 2026",{"type":17,"tag":29,"props":239392,"children":239393},{},[239394,239398],{"type":17,"tag":133,"props":239395,"children":239396},{"href":77021},[239397],{"type":23,"value":137991},{"type":23,"value":239399}," (RAG) solved a real problem. Instead of relying on model training data alone, we retrieve external context and ground responses in real information. That works well for answering questions. It breaks when systems need to take action. As AI moves from copilots to agents, the gap becomes obvious. Execution-time workflows require current state, permissioned access, and deterministic outcomes. RAG was not designed for that.",{"type":17,"tag":68,"props":239401,"children":239403},{"id":239402},"rag-works-for-knowledge-not-state",[239404],{"type":23,"value":239405},"RAG Works for Knowledge, Not State",{"type":17,"tag":29,"props":239407,"children":239408},{},[239409],{"type":23,"value":239410},"RAG is effective when the goal is informational. It retrieves documents, injects them into a prompt, and lets the model generate a response. This works for enterprise search, support assistants, and summarization across internal knowledge. It assumes the retrieved context is 'good enough' to answer the question. That assumption fails when the system depends on real-time state. Pricing, inventory, deal stages, ticket status, and account balances change continuously. A retrieved snapshot is not the system of record.",{"type":17,"tag":68,"props":239412,"children":239414},{"id":239413},"execution-changes-the-requirements",[239415],{"type":23,"value":239416},"Execution Changes the Requirements",{"type":17,"tag":29,"props":239418,"children":239419},{},[239420],{"type":23,"value":239421},"Execution introduces constraints that retrieval alone does not handle. The system must guarantee that data is current, that the user is authorized to act, and that the operation is valid at the time of execution. In other words, the system is no longer generating answers. It is mutating state. This is where most RAG implementations break. The architecture is designed for reading, not acting.",{"type":17,"tag":239,"props":239423,"children":239425},{"id":239424},"_1-stale-context-breaks-correctness",[239426],{"type":23,"value":239427},"1. Stale Context Breaks Correctness",{"type":17,"tag":29,"props":239429,"children":239430},{},[239431],{"type":23,"value":239432},"RAG pipelines rely on indexed data. Even with frequent refresh cycles, there is always a gap between the indexed representation and the current system state. That gap creates failure modes in production. A well-known example is the Air Canada chatbot incident, where outdated policy information led to incorrect responses and legal consequences. Similar issues appear in pricing, inventory, and support systems, where even minutes of drift can produce incorrect outcomes. RAG does not guarantee freshness. Execution systems require it.",{"type":17,"tag":239,"props":239434,"children":239436},{"id":239435},"_2-rag-is-read-only",[239437],{"type":23,"value":239438},"2. RAG Is Read-Only",{"type":17,"tag":29,"props":239440,"children":239441},{},[239442],{"type":23,"value":239443},"RAG retrieves information. It does not execute actions. If a user asks, 'update this record' or 'close this ticket,' RAG can explain the process but cannot perform it. This limitation is structural. The system has no mechanism to call APIs, validate inputs, or commit changes. Extensions like CRUD-augmented generation (CRAG) attempt to address this, but they are not widely adopted in production. Execution requires tool access, not just retrieval.",{"type":17,"tag":239,"props":239445,"children":239447},{"id":239446},"_3-retrieved-context-executable-action",[239448],{"type":23,"value":239449},"3. Retrieved Context ≠ Executable Action",{"type":17,"tag":29,"props":239451,"children":239452},{},[239453],{"type":23,"value":239454},"RAG often returns text that describes what should happen. That is not the same as making it happen. Retrieving a refund policy does not process a refund. Retrieving a workflow description does not execute it. In execution systems, correctness depends on deterministic operations. APIs enforce validation, constraints, and business rules. Retrieval does not. This is why frameworks increasingly combine RAG with tool-calling, where the model decides when to invoke a function instead of generating text.",{"type":17,"tag":239,"props":239456,"children":239458},{"id":239457},"_4-retrieval-fails-silently",[239459],{"type":23,"value":239460},"4. Retrieval Fails Silently",{"type":17,"tag":29,"props":239462,"children":239463},{},[239464],{"type":23,"value":239465},"RAG systems depend on retrieval quality. When retrieval fails, the model still produces an answer. Common failure modes include vocabulary mismatch, ambiguous queries, irrelevant top results, and chunking artifacts. These issues are well documented in production RAG analyses like this guide. The problem is not just accuracy. It is invisibility. The system does not know it retrieved the wrong context, and the model cannot correct for missing information. In execution workflows, silent failures are unacceptable.",{"type":17,"tag":239,"props":239467,"children":239469},{"id":239468},"_5-embeddings-struggle-with-exactness-and-structure",[239470],{"type":23,"value":239471},"5. Embeddings Struggle with Exactness and Structure",{"type":17,"tag":29,"props":239473,"children":239474},{},[239475],{"type":23,"value":239476},"Vector search is optimized for semantic similarity, not precision. It performs poorly on exact identifiers, structured queries, and transactional data. Queries like 'invoice #8472' or 'Section 4.2.1' require exact matches. Systems relying solely on embeddings often miss these cases. Hybrid retrieval can mitigate this, but most RAG implementations are not designed for strict correctness. Execution systems depend on exact values and structured relationships.",{"type":17,"tag":239,"props":239478,"children":239480},{"id":239479},"_6-rag-breaks-on-multi-step-workflows",[239481],{"type":23,"value":239482},"6. RAG Breaks on Multi-Step Workflows",{"type":17,"tag":29,"props":239484,"children":239485},{},[239486],{"type":23,"value":239487},"Execution workflows are rarely single-step. They require sequencing: retrieve data, validate conditions, perform actions, and update state. RAG does not provide planning or orchestration. It retrieves context and generates a response in a single pass. Research from systems like PromptQL shows that multi-step reasoning often fails due to context limits, extraction errors, and incomplete computation. Agents require iterative reasoning and tool interaction. RAG alone cannot support that.",{"type":17,"tag":68,"props":239489,"children":239491},{"id":239490},"why-tool-calls-and-live-apis-win",[239492],{"type":23,"value":239493},"Why Tool Calls and Live APIs Win",{"type":17,"tag":29,"props":239495,"children":239496},{},[239497],{"type":23,"value":239498},"When correctness matters, systems rely on tools. Tool-calling allows models to invoke APIs, fetch live data, and execute actions. APIs return deterministic results, enforce permissions, and operate on current state. This is critical for workflows like scheduling, payments, and record updates. As outlined in this comparison, RAG is suited for knowledge, while tools are required for exact values, actions, and compliance. The distinction is not subtle. It defines whether a system can operate reliably.",{"type":17,"tag":239,"props":239500,"children":239502},{"id":239501},"the-real-architecture-retrieval-execution",[239503],{"type":23,"value":239504},"The Real Architecture: Retrieval + Execution",{"type":17,"tag":29,"props":239506,"children":239507},{},[239508],{"type":23,"value":239509},"Production systems increasingly adopt hybrid architectures. RAG handles unstructured knowledge and context. Live APIs handle structured data and actions. The system routes between them based on intent. Static documents are indexed. Dynamic data is retrieved in real time. Actions are executed through authenticated APIs. This separation is critical. Blurring it leads to stale answers, unauthorized actions, and incorrect behavior.",{"type":17,"tag":239,"props":239511,"children":239513},{"id":239512},"why-real-time-data-matters",[239514],{"type":23,"value":239515},"Why Real-Time Data Matters",{"type":17,"tag":29,"props":239517,"children":239518},{},[239519],{"type":23,"value":239520},"Execution depends on current state. A system cannot approve a transaction, update a record, or trigger a workflow based on cached data. Real-time access ensures correctness, enforces permissions, and reflects the latest changes. Streaming approaches can reduce staleness, but they do not eliminate the need for live reads. For operational systems, real-time data is not an optimization. It is a requirement.",{"type":17,"tag":68,"props":239522,"children":239523},{"id":1051},[239524],{"type":23,"value":4247},{"type":17,"tag":29,"props":239526,"children":239527},{},[239528],{"type":23,"value":239529},"Unified provides the data access layer required for this architecture. Instead of pre-indexing and storing customer data, Unified retrieves it directly from source systems in real time. It normalizes APIs across categories like CRM, ticketing, file storage, ATS, and HRIS. It also supports event-driven updates for systems that require indexing. In RAG systems, Unified powers retrieval. In agent systems, it enables authorized tool execution. It is not the model or the vector database. It is the interface to live SaaS data.",{"type":17,"tag":239,"props":239531,"children":239533},{"id":239532},"rag-vs-execution-systems-clear-boundary",[239534],{"type":23,"value":239535},"RAG vs Execution Systems (Clear Boundary)",{"type":17,"tag":29,"props":239537,"children":239538},{},[239539],{"type":23,"value":239540},"RAG retrieves context and generates responses. Execution systems retrieve context, call tools, and modify state. The difference is not incremental. It is architectural. Retrieval is about grounding. Execution is about correctness.",{"type":17,"tag":68,"props":239542,"children":239543},{"id":2316},[239544],{"type":23,"value":2319},{"type":17,"tag":29,"props":239546,"children":239547},{},[239548],{"type":23,"value":239549},"RAG is effective for answering questions grounded in external knowledge. It breaks when systems need to act on real-world data. Execution-time agent workflows require live state, deterministic tool access, and explicit authorization. Retrieval alone cannot provide that. The systems that succeed combine RAG with real-time APIs and structured execution layers. That is the shift from answering questions to operating systems.",{"type":17,"tag":29,"props":239551,"children":239552},{},[239553],{"type":17,"tag":133,"props":239554,"children":239556},{"href":1612,"rel":239555},[214],[239557],{"type":17,"tag":48,"props":239558,"children":239559},{},[239560],{"type":23,"value":1616},{"type":17,"tag":29,"props":239562,"children":239563},{},[239564],{"type":17,"tag":133,"props":239565,"children":239567},{"href":1623,"rel":239566},[214],[239568],{"type":17,"tag":48,"props":239569,"children":239570},{},[239571],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":239573},[239574,239575,239583,239587,239590],{"id":239402,"depth":1629,"text":239405},{"id":239413,"depth":1629,"text":239416,"children":239576},[239577,239578,239579,239580,239581,239582],{"id":239424,"depth":1635,"text":239427},{"id":239435,"depth":1635,"text":239438},{"id":239446,"depth":1635,"text":239449},{"id":239457,"depth":1635,"text":239460},{"id":239468,"depth":1635,"text":239471},{"id":239479,"depth":1635,"text":239482},{"id":239490,"depth":1629,"text":239493,"children":239584},[239585,239586],{"id":239501,"depth":1635,"text":239504},{"id":239512,"depth":1635,"text":239515},{"id":1051,"depth":1629,"text":4247,"children":239588},[239589],{"id":239532,"depth":1635,"text":239535},{"id":2316,"depth":1629,"text":2319},"content:blog:why_rag_breaks_in_execution_time_agent_workflows.md","blog/why_rag_breaks_in_execution_time_agent_workflows.md","blog/why_rag_breaks_in_execution_time_agent_workflows",{"_path":239595,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":239596,"description":239597,"img":239598,"date":239599,"tag":12,"body":239600,"_type":1677,"_id":240610,"_source":1679,"_file":240611,"_stem":240612,"_extension":1682},"/blog/december_2025_product_updates","December 2025 product updates","In December, we shipped a new Unified Advertising category, expanded webhook coverage across key systems, and added the fields teams rely on for production...","https://s3.us-east-2.amazonaws.com/unified-article-images/december_2025_product_updates-icon.png","2026-01-05T00:00:00.000Z",{"type":14,"children":239601,"toc":240599},[239602,239607,239610,239617,239622,239634,239656,239668,239673,239715,239725,239733,239775,239779,239909,239915,239922,239962,239969,239996,240003,240019,240027,240054,240062,240085,240093,240140,240146,240151,240287,240293,240356,240362,240428,240434,240535,240539,240572,240577,240588],{"type":17,"tag":18,"props":239603,"children":239605},{"id":239604},"december-2025-product-updates",[239606],{"type":23,"value":239596},{"type":17,"tag":25,"props":239608,"children":239609},{},[],{"type":17,"tag":29,"props":239611,"children":239612},{},[239613],{"type":17,"tag":33,"props":239614,"children":239615},{},[239616],{"type":23,"value":239390},{"type":17,"tag":29,"props":239618,"children":239619},{},[239620],{"type":23,"value":239621},"In December, we shipped a new Unified Advertising category, expanded webhook coverage across key systems, and added the fields teams rely on for production workflows.",{"type":17,"tag":29,"props":239623,"children":239624},{},[239625,239627,239632],{"type":23,"value":239626},"We shipped 9 new integrations (including X Ads, Paycor, Gainsight, and multiple Zoho apps), launched a new ",{"type":17,"tag":48,"props":239628,"children":239629},{},[239630],{"type":23,"value":239631},"Unified Advertising",{"type":23,"value":239633}," category, and continued pushing virtual webhook depth across CRM and ATS systems.",{"type":17,"tag":29,"props":239635,"children":239636},{},[239637,239638,239645,239654],{"type":23,"value":25244},{"type":17,"tag":133,"props":239639,"children":239642},{"href":239640,"rel":239641},"https://unified.to/blog/unified_hits_major_growth_milestone_as_api_usage_surges_550percent_in_2025",[214],[239643],{"type":23,"value":239644},"API usage grew ",{"type":17,"tag":133,"props":239646,"children":239648},{"href":239640,"rel":239647},[214],[239649],{"type":17,"tag":48,"props":239650,"children":239651},{},[239652],{"type":23,"value":239653},"550%",{"type":23,"value":239655}," in 2025 as more SaaS and AI products moved to Unified for real-time access to customer data.",{"type":17,"tag":239,"props":239657,"children":239659},{"id":239658},"new-unified-advertising-category",[239660,239662],{"type":23,"value":239661},"New: ",{"type":17,"tag":133,"props":239663,"children":239665},{"href":18452,"rel":239664},[214],[239666],{"type":23,"value":239667},"Unified Advertising category",{"type":17,"tag":29,"props":239669,"children":239670},{},[239671],{"type":23,"value":239672},"Unified Advertising normalizes the objects you need to model account structure and pull performance stats across ad platforms:",{"type":17,"tag":80,"props":239674,"children":239675},{},[239676,239683,239690,239699,239706],{"type":17,"tag":84,"props":239677,"children":239678},{},[239679],{"type":17,"tag":48,"props":239680,"children":239681},{},[239682],{"type":23,"value":18046},{"type":17,"tag":84,"props":239684,"children":239685},{},[239686],{"type":17,"tag":48,"props":239687,"children":239688},{},[239689],{"type":23,"value":18610},{"type":17,"tag":84,"props":239691,"children":239692},{},[239693,239697],{"type":17,"tag":48,"props":239694,"children":239695},{},[239696],{"type":23,"value":18623},{"type":23,"value":239698}," (ad group)",{"type":17,"tag":84,"props":239700,"children":239701},{},[239702],{"type":17,"tag":48,"props":239703,"children":239704},{},[239705],{"type":23,"value":18636},{"type":17,"tag":84,"props":239707,"children":239708},{},[239709,239713],{"type":17,"tag":48,"props":239710,"children":239711},{},[239712],{"type":23,"value":22191},{"type":23,"value":239714}," (performance stats)",{"type":17,"tag":29,"props":239716,"children":239717},{},[239718],{"type":17,"tag":133,"props":239719,"children":239722},{"href":239720,"rel":239721},"https://docs.unified.to/ads/overview",[214],[239723],{"type":23,"value":239724},"Read more in docs →",{"type":17,"tag":29,"props":239726,"children":239727},{},[239728],{"type":17,"tag":48,"props":239729,"children":239730},{},[239731],{"type":23,"value":239732},"First integrations include:",{"type":17,"tag":80,"props":239734,"children":239735},{},[239736,239740,239745,239749,239753,239757,239761,239765,239770],{"type":17,"tag":84,"props":239737,"children":239738},{},[239739],{"type":23,"value":11337},{"type":17,"tag":84,"props":239741,"children":239742},{},[239743],{"type":23,"value":239744},"Meta Ads (Facebook, Instagram, WhatsApp)",{"type":17,"tag":84,"props":239746,"children":239747},{},[239748],{"type":23,"value":11362},{"type":17,"tag":84,"props":239750,"children":239751},{},[239752],{"type":23,"value":40389},{"type":17,"tag":84,"props":239754,"children":239755},{},[239756],{"type":23,"value":11372},{"type":17,"tag":84,"props":239758,"children":239759},{},[239760],{"type":23,"value":47580},{"type":17,"tag":84,"props":239762,"children":239763},{},[239764],{"type":23,"value":11377},{"type":17,"tag":84,"props":239766,"children":239767},{},[239768],{"type":23,"value":239769},"Microsoft Ads",{"type":17,"tag":84,"props":239771,"children":239772},{},[239773],{"type":23,"value":239774},"X Ads (Twitter Ads)",{"type":17,"tag":239,"props":239776,"children":239777},{"id":11629},[239778],{"type":23,"value":216420},{"type":17,"tag":80,"props":239780,"children":239781},{},[239782,239796,239810,239824,239838,239853,239867,239881,239895],{"type":17,"tag":84,"props":239783,"children":239784},{},[239785,239794],{"type":17,"tag":133,"props":239786,"children":239789},{"href":239787,"rel":239788},"https://unified.to/integrations/gainsight",[214],[239790],{"type":17,"tag":48,"props":239791,"children":239792},{},[239793],{"type":23,"value":13006},{"type":23,"value":239795}," (CRM)",{"type":17,"tag":84,"props":239797,"children":239798},{},[239799,239808],{"type":17,"tag":133,"props":239800,"children":239803},{"href":239801,"rel":239802},"https://unified.to/integrations/paycor",[214],[239804],{"type":17,"tag":48,"props":239805,"children":239806},{},[239807],{"type":23,"value":58983},{"type":23,"value":239809}," (HR & Directory, ATS)",{"type":17,"tag":84,"props":239811,"children":239812},{},[239813,239822],{"type":17,"tag":133,"props":239814,"children":239817},{"href":239815,"rel":239816},"https://unified.to/integrations/8x8xcaas",[214],[239818],{"type":17,"tag":48,"props":239819,"children":239820},{},[239821],{"type":23,"value":30831},{"type":23,"value":239823}," (Call Center, HR & Directory)",{"type":17,"tag":84,"props":239825,"children":239826},{},[239827,239836],{"type":17,"tag":133,"props":239828,"children":239831},{"href":239829,"rel":239830},"https://unified.to/integrations/slackbot",[214],[239832],{"type":17,"tag":48,"props":239833,"children":239834},{},[239835],{"type":23,"value":155275},{"type":23,"value":239837}," (Messaging, HR & Directory, Authentication)",{"type":17,"tag":84,"props":239839,"children":239840},{},[239841,239851],{"type":17,"tag":133,"props":239842,"children":239845},{"href":239843,"rel":239844},"http://unified.to/integrations/bunny",[214],[239846],{"type":17,"tag":48,"props":239847,"children":239848},{},[239849],{"type":23,"value":239850},"Bunny.com",{"type":23,"value":239852}," (Payment, HR & Directory, Accounting, E-Commerce, CRM)",{"type":17,"tag":84,"props":239854,"children":239855},{},[239856,239865],{"type":17,"tag":133,"props":239857,"children":239860},{"href":239858,"rel":239859},"https://unified.to/integrations/zohocalendar",[214],[239861],{"type":17,"tag":48,"props":239862,"children":239863},{},[239864],{"type":23,"value":14166},{"type":23,"value":239866}," (Calendar, Authentication)",{"type":17,"tag":84,"props":239868,"children":239869},{},[239870,239879],{"type":17,"tag":133,"props":239871,"children":239874},{"href":239872,"rel":239873},"https://unified.to/integrations/zohomail",[214],[239875],{"type":17,"tag":48,"props":239876,"children":239877},{},[239878],{"type":23,"value":15763},{"type":23,"value":239880}," (Messaging, Authentication)",{"type":17,"tag":84,"props":239882,"children":239883},{},[239884,239893],{"type":17,"tag":133,"props":239885,"children":239888},{"href":239886,"rel":239887},"https://unified.to/integrations/zohomeeting",[214],[239889],{"type":17,"tag":48,"props":239890,"children":239891},{},[239892],{"type":23,"value":14177},{"type":23,"value":239894}," (Calendar, HR & Directory, Authentication)",{"type":17,"tag":84,"props":239896,"children":239897},{},[239898,239907],{"type":17,"tag":133,"props":239899,"children":239902},{"href":239900,"rel":239901},"https://unified.to/integrations/twitterads",[214],[239903],{"type":17,"tag":48,"props":239904,"children":239905},{},[239906],{"type":23,"value":239774},{"type":23,"value":239908}," (Advertising)",{"type":17,"tag":239,"props":239910,"children":239912},{"id":239911},"webhooks-and-streaming-enhancements",[239913],{"type":23,"value":239914},"Webhooks and Streaming Enhancements",{"type":17,"tag":29,"props":239916,"children":239917},{},[239918],{"type":17,"tag":48,"props":239919,"children":239920},{},[239921],{"type":23,"value":22466},{"type":17,"tag":80,"props":239923,"children":239924},{},[239925,239936,239946],{"type":17,"tag":84,"props":239926,"children":239927},{},[239928,239930,239934],{"type":23,"value":239929},"Added native + [virtual ",{"type":17,"tag":133,"props":239931,"children":239932},{"href":4999},[239933],{"type":23,"value":5002},{"type":23,"value":239935},"](/blog/unlock_real_time_data_with_virtual_webhooks) for key Calendar/Event flows (created, updated, deleted)",{"type":17,"tag":84,"props":239937,"children":239938},{},[239939,239941],{"type":23,"value":239940},"Expanded object + method coverage across ",{"type":17,"tag":48,"props":239942,"children":239943},{},[239944],{"type":23,"value":239945},"Event, Calendar, Busy, Recording, Channel, Message, Contact",{"type":17,"tag":84,"props":239947,"children":239948},{},[239949,239951,239955,239956,239960],{"type":23,"value":239950},"Added virtual webhooks for ",{"type":17,"tag":48,"props":239952,"children":239953},{},[239954],{"type":23,"value":14567},{"type":23,"value":34435},{"type":17,"tag":48,"props":239957,"children":239958},{},[239959],{"type":23,"value":15800},{"type":23,"value":239961},", including deleted support for Message",{"type":17,"tag":29,"props":239963,"children":239964},{},[239965],{"type":17,"tag":48,"props":239966,"children":239967},{},[239968],{"type":23,"value":3184},{"type":17,"tag":80,"props":239970,"children":239971},{},[239972,239986],{"type":17,"tag":84,"props":239973,"children":239974},{},[239975,239976,239980,239981],{"type":23,"value":216368},{"type":17,"tag":48,"props":239977,"children":239978},{},[239979],{"type":23,"value":145784},{"type":23,"value":34435},{"type":17,"tag":48,"props":239982,"children":239983},{},[239984],{"type":23,"value":239985},"Member",{"type":17,"tag":84,"props":239987,"children":239988},{},[239989,239990,239994],{"type":23,"value":11819},{"type":17,"tag":133,"props":239991,"children":239992},{"href":1857},[239993],{"type":23,"value":1860},{"type":23,"value":239995}," controls for List and Member virtual webhook reads",{"type":17,"tag":29,"props":239997,"children":239998},{},[239999],{"type":17,"tag":48,"props":240000,"children":240001},{},[240002],{"type":23,"value":26535},{"type":17,"tag":80,"props":240004,"children":240005},{},[240006,240014],{"type":17,"tag":84,"props":240007,"children":240008},{},[240009,240010],{"type":23,"value":216368},{"type":17,"tag":48,"props":240011,"children":240012},{},[240013],{"type":23,"value":14528},{"type":17,"tag":84,"props":240015,"children":240016},{},[240017],{"type":23,"value":240018},"Added Event object with list/get/create/remove methods",{"type":17,"tag":29,"props":240020,"children":240021},{},[240022],{"type":17,"tag":48,"props":240023,"children":240024},{},[240025],{"type":23,"value":240026},"Keap + Insightly",{"type":17,"tag":80,"props":240028,"children":240029},{},[240030,240039,240049],{"type":17,"tag":84,"props":240031,"children":240032},{},[240033,240035],{"type":23,"value":240034},"Keap: created/updated virtual webhooks for ",{"type":17,"tag":48,"props":240036,"children":240037},{},[240038],{"type":23,"value":25846},{"type":17,"tag":84,"props":240040,"children":240041},{},[240042,240044],{"type":23,"value":240043},"Insightly: created/updated virtual webhooks for ",{"type":17,"tag":48,"props":240045,"children":240046},{},[240047],{"type":23,"value":240048},"Company, Lead, Employee, Contact, Deal",{"type":17,"tag":84,"props":240050,"children":240051},{},[240052],{"type":23,"value":240053},"Added pagination support for virtual webhook reads across Insightly objects",{"type":17,"tag":29,"props":240055,"children":240056},{},[240057],{"type":17,"tag":48,"props":240058,"children":240059},{},[240060],{"type":23,"value":240061},"ADP Workforce Now",{"type":17,"tag":80,"props":240063,"children":240064},{},[240065,240075],{"type":17,"tag":84,"props":240066,"children":240067},{},[240068,240070],{"type":23,"value":240069},"Added created/updated native webhooks for ",{"type":17,"tag":48,"props":240071,"children":240072},{},[240073],{"type":23,"value":240074},"Job, Candidate, Application",{"type":17,"tag":84,"props":240076,"children":240077},{},[240078,240079,240083],{"type":23,"value":11819},{"type":17,"tag":48,"props":240080,"children":240081},{},[240082],{"type":23,"value":198668},{"type":23,"value":240084}," object with list/get methods",{"type":17,"tag":29,"props":240086,"children":240087},{},[240088],{"type":17,"tag":48,"props":240089,"children":240090},{},[240091],{"type":23,"value":240092},"ATS-specific",{"type":17,"tag":80,"props":240094,"children":240095},{},[240096,240112,240128],{"type":17,"tag":84,"props":240097,"children":240098},{},[240099,240101,240105,240106,240110],{"type":23,"value":240100},"Zoho Recruit: created/updated virtual webhooks for ",{"type":17,"tag":48,"props":240102,"children":240103},{},[240104],{"type":23,"value":25828},{"type":23,"value":34435},{"type":17,"tag":48,"props":240107,"children":240108},{},[240109],{"type":23,"value":25846},{"type":23,"value":240111},", added Event object + full CRUD methods",{"type":17,"tag":84,"props":240113,"children":240114},{},[240115,240117,240121,240122,240126],{"type":23,"value":240116},"JobDiva: created/updated virtual webhooks for ",{"type":17,"tag":48,"props":240118,"children":240119},{},[240120],{"type":23,"value":62749},{"type":23,"value":34435},{"type":17,"tag":48,"props":240123,"children":240124},{},[240125],{"type":23,"value":14528},{"type":23,"value":240127},", expanded object/method coverage",{"type":17,"tag":84,"props":240129,"children":240130},{},[240131,240133,240138],{"type":23,"value":240132},"Crelate: created/updated virtual webhooks for ",{"type":17,"tag":48,"props":240134,"children":240135},{},[240136],{"type":23,"value":240137},"Job",{"type":23,"value":240139},", expanded pagination support",{"type":17,"tag":239,"props":240141,"children":240143},{"id":240142},"hr-directory-updates",[240144],{"type":23,"value":240145},"HR & Directory Updates",{"type":17,"tag":29,"props":240147,"children":240148},{},[240149],{"type":23,"value":240150},"We continued rounding out the HR profile surface area teams need for provisioning, security posture, and workforce analytics:",{"type":17,"tag":80,"props":240152,"children":240153},{},[240154,240171,240200,240232,240248],{"type":17,"tag":84,"props":240155,"children":240156},{},[240157,240158,240164,240166],{"type":23,"value":11819},{"type":17,"tag":6121,"props":240159,"children":240161},{"className":240160},[],[240162],{"type":23,"value":240163},"has_mfa",{"type":23,"value":240165}," readable field across ",{"type":17,"tag":48,"props":240167,"children":240168},{},[240169],{"type":23,"value":240170},"Snowflake, Slack, Slack (bot), ServiceNow, RecruitCRM, Heroku, GitHub, Discord, Deputy, Dashlane",{"type":17,"tag":84,"props":240172,"children":240173},{},[240174,240175,240180,240181,240186,240187,240193,240195],{"type":23,"value":11819},{"type":17,"tag":6121,"props":240176,"children":240178},{"className":240177},[],[240179],{"type":23,"value":75514},{"type":23,"value":11826},{"type":17,"tag":6121,"props":240182,"children":240184},{"className":240183},[],[240185],{"type":23,"value":206629},{"type":23,"value":12561},{"type":17,"tag":6121,"props":240188,"children":240190},{"className":240189},[],[240191],{"type":23,"value":240192},"compensation",{"type":23,"value":240194}," fields to ",{"type":17,"tag":48,"props":240196,"children":240197},{},[240198],{"type":23,"value":240199},"UKG Pro HCM Employee",{"type":17,"tag":84,"props":240201,"children":240202},{},[240203,240204,240209,240211,240216,240217,240223,240225,240230],{"type":23,"value":11819},{"type":17,"tag":6121,"props":240205,"children":240207},{"className":240206},[],[240208],{"type":23,"value":75514},{"type":23,"value":240210}," (and expanded ",{"type":17,"tag":6121,"props":240212,"children":240214},{"className":240213},[],[240215],{"type":23,"value":240192},{"type":23,"value":11826},{"type":17,"tag":6121,"props":240218,"children":240220},{"className":240219},[],[240221],{"type":23,"value":240222},"relationships",{"type":23,"value":240224},") on ",{"type":17,"tag":48,"props":240226,"children":240227},{},[240228],{"type":23,"value":240229},"SAP SuccessFactors Employee",{"type":23,"value":240231}," (including OpenID Connect)",{"type":17,"tag":84,"props":240233,"children":240234},{},[240235,240236,240241,240243],{"type":23,"value":11819},{"type":17,"tag":6121,"props":240237,"children":240239},{"className":240238},[],[240240],{"type":23,"value":240222},{"type":23,"value":240242}," field on ",{"type":17,"tag":48,"props":240244,"children":240245},{},[240246],{"type":23,"value":240247},"PrismHR, Namely Employee",{"type":17,"tag":84,"props":240249,"children":240250},{},[240251,240253,240257,240259],{"type":23,"value":240252},"Expanded ",{"type":17,"tag":48,"props":240254,"children":240255},{},[240256],{"type":23,"value":58983},{"type":23,"value":240258}," coverage substantially:\n",{"type":17,"tag":80,"props":240260,"children":240261},{},[240262,240272,240277,240282],{"type":17,"tag":84,"props":240263,"children":240264},{},[240265,240267],{"type":23,"value":240266},"Added core objects including ",{"type":17,"tag":48,"props":240268,"children":240269},{},[240270],{"type":23,"value":240271},"Company, Group, Location, Benefit, Deduction, Timeoff, Job, Payslip, Passthrough",{"type":17,"tag":84,"props":240273,"children":240274},{},[240275],{"type":23,"value":240276},"Added Employee create/update/remove",{"type":17,"tag":84,"props":240278,"children":240279},{},[240280],{"type":23,"value":240281},"Added pagination + filtering support across Employee/Payslip/Job flows",{"type":17,"tag":84,"props":240283,"children":240284},{},[240285],{"type":23,"value":240286},"Added additional HR fields on Paycor Employee (title, manager, hire date, status, identifiers, and more)",{"type":17,"tag":239,"props":240288,"children":240290},{"id":240289},"crm-updates",[240291],{"type":23,"value":240292},"CRM Updates",{"type":17,"tag":80,"props":240294,"children":240295},{},[240296,240305,240321,240339,240351],{"type":17,"tag":84,"props":240297,"children":240298},{},[240299,240303],{"type":17,"tag":48,"props":240300,"children":240301},{},[240302],{"type":23,"value":13006},{"type":23,"value":240304},": new CRM integration",{"type":17,"tag":84,"props":240306,"children":240307},{},[240308,240309,240314,240316],{"type":23,"value":11819},{"type":17,"tag":6121,"props":240310,"children":240312},{"className":240311},[],[240313],{"type":23,"value":25912},{"type":23,"value":240315}," readable/writable field across Deals in ",{"type":17,"tag":48,"props":240317,"children":240318},{},[240319],{"type":23,"value":240320},"Zoho CRM, Recruiterflow, Pipedrive, Microsoft Dynamics 365 Sales",{"type":17,"tag":84,"props":240322,"children":240323},{},[240324,240326,240331,240332,240337],{"type":23,"value":240325},"Pipedrive Deal: added ",{"type":17,"tag":6121,"props":240327,"children":240329},{"className":240328},[],[240330],{"type":23,"value":25923},{"type":23,"value":34435},{"type":17,"tag":6121,"props":240333,"children":240335},{"className":240334},[],[240336],{"type":23,"value":62483},{"type":23,"value":240338}," readable/writable fields",{"type":17,"tag":84,"props":240340,"children":240341},{},[240342,240344,240349],{"type":23,"value":240343},"HubSpot Deal: added ",{"type":17,"tag":6121,"props":240345,"children":240347},{"className":240346},[],[240348],{"type":23,"value":109074},{"type":23,"value":240350}," readable field",{"type":17,"tag":84,"props":240352,"children":240353},{},[240354],{"type":23,"value":240355},"Gong Contact: expanded readable fields (title, phones, emails, company), plus added get method",{"type":17,"tag":239,"props":240357,"children":240359},{"id":240358},"messaging-and-collaboration",[240360],{"type":23,"value":240361},"Messaging and Collaboration",{"type":17,"tag":80,"props":240363,"children":240364},{},[240365,240396,240407,240418],{"type":17,"tag":84,"props":240366,"children":240367},{},[240368,240370],{"type":23,"value":240369},"Added richer interactive message support:\n",{"type":17,"tag":80,"props":240371,"children":240372},{},[240373,240386],{"type":17,"tag":84,"props":240374,"children":240375},{},[240376,240378,240384],{"type":23,"value":240377},"Slack + Slack (bot): new readable/writable fields for ",{"type":17,"tag":6121,"props":240379,"children":240381},{"className":240380},[],[240382],{"type":23,"value":240383},"buttons",{"type":23,"value":240385}," (and destination members on Slack)",{"type":17,"tag":84,"props":240387,"children":240388},{},[240389,240391],{"type":23,"value":240390},"Microsoft Teams: added writable/readable support for message ",{"type":17,"tag":6121,"props":240392,"children":240394},{"className":240393},[],[240395],{"type":23,"value":240383},{"type":17,"tag":84,"props":240397,"children":240398},{},[240399,240401,240405],{"type":23,"value":240400},"Slack (bot): added ",{"type":17,"tag":48,"props":240402,"children":240403},{},[240404],{"type":23,"value":14528},{"type":23,"value":240406}," object and created native webhooks for Event",{"type":17,"tag":84,"props":240408,"children":240409},{},[240410,240412,240416],{"type":23,"value":240411},"Trello: added ",{"type":17,"tag":48,"props":240413,"children":240414},{},[240415],{"type":23,"value":61210},{"type":23,"value":240417}," object plus list/get methods, and added created_at fields for Project/Task",{"type":17,"tag":84,"props":240419,"children":240420},{},[240421,240423],{"type":23,"value":240422},"Zoho Mail: added Message readable field ",{"type":17,"tag":6121,"props":240424,"children":240426},{"className":240425},[],[240427],{"type":23,"value":220868},{"type":17,"tag":239,"props":240429,"children":240431},{"id":240430},"commerce-accounting-and-other-enhancements",[240432],{"type":23,"value":240433},"Commerce, Accounting, and Other Enhancements",{"type":17,"tag":80,"props":240435,"children":240436},{},[240437,240466,240478,240506,240530],{"type":17,"tag":84,"props":240438,"children":240439},{},[240440,240442],{"type":23,"value":240441},"Shopify:\n",{"type":17,"tag":80,"props":240443,"children":240444},{},[240445,240450,240455],{"type":17,"tag":84,"props":240446,"children":240447},{},[240448],{"type":23,"value":240449},"Item: added collections readable/writable support",{"type":17,"tag":84,"props":240451,"children":240452},{},[240453],{"type":23,"value":240454},"Salesorder: added pagination + sort support",{"type":17,"tag":84,"props":240456,"children":240457},{},[240458,240460,240465],{"type":23,"value":240459},"Metadata: added ",{"type":17,"tag":6121,"props":240461,"children":240463},{"className":240462},[],[240464],{"type":23,"value":38585},{"type":23,"value":240350},{"type":17,"tag":84,"props":240467,"children":240468},{},[240469,240471,240476],{"type":23,"value":240470},"Xero Invoice: added ",{"type":17,"tag":6121,"props":240472,"children":240474},{"className":240473},[],[240475],{"type":23,"value":220868},{"type":23,"value":240477}," readable/writable field",{"type":17,"tag":84,"props":240479,"children":240480},{},[240481,240483],{"type":23,"value":240482},"NetSuite:\n",{"type":17,"tag":80,"props":240484,"children":240485},{},[240486,240496],{"type":17,"tag":84,"props":240487,"children":240488},{},[240489,240491],{"type":23,"value":240490},"Collection: added writable field ",{"type":17,"tag":6121,"props":240492,"children":240494},{"className":240493},[],[240495],{"type":23,"value":27310},{"type":17,"tag":84,"props":240497,"children":240498},{},[240499,240501],{"type":23,"value":240500},"Item: added readable/writable field ",{"type":17,"tag":6121,"props":240502,"children":240504},{"className":240503},[],[240505],{"type":23,"value":38595},{"type":17,"tag":84,"props":240507,"children":240508},{},[240509,240511],{"type":23,"value":240510},"Certn:\n",{"type":17,"tag":80,"props":240512,"children":240513},{},[240514,240525],{"type":17,"tag":84,"props":240515,"children":240516},{},[240517,240519],{"type":23,"value":240518},"Request: added writable ",{"type":17,"tag":6121,"props":240520,"children":240522},{"className":240521},[],[240523],{"type":23,"value":240524},"parameters",{"type":17,"tag":84,"props":240526,"children":240527},{},[240528],{"type":23,"value":240529},"Package: added readable fields (valid regions, parameters, target URL support, aliases)",{"type":17,"tag":84,"props":240531,"children":240532},{},[240533],{"type":23,"value":240534},"Monday: expanded Group pagination support, added remove method for Group, added get method for Project",{"type":17,"tag":239,"props":240536,"children":240537},{"id":120936},[240538],{"type":23,"value":216865},{"type":17,"tag":80,"props":240540,"children":240541},{},[240542,240552,240562],{"type":17,"tag":84,"props":240543,"children":240544},{},[240545],{"type":17,"tag":133,"props":240546,"children":240549},{"href":240547,"rel":240548},"https://unified.to/blog/how_to_use_unified_with_lovable",[214],[240550],{"type":23,"value":240551},"How to Use Unified with Lovable",{"type":17,"tag":84,"props":240553,"children":240554},{},[240555],{"type":17,"tag":133,"props":240556,"children":240559},{"href":240557,"rel":240558},"https://unified.to/blog/scaling_mcp_tools_with_anthropic_defer_loading",[214],[240560],{"type":23,"value":240561},"Scaling MCP Tools with Anthropic's Defer Loading",{"type":17,"tag":84,"props":240563,"children":240564},{},[240565],{"type":17,"tag":133,"props":240566,"children":240569},{"href":240567,"rel":240568},"https://unified.to/blog/how_to_install",[214],[240570],{"type":23,"value":240571},"How To Install Unified MCP in OpenAI Agent Builder",{"type":17,"tag":29,"props":240573,"children":240574},{},[240575],{"type":23,"value":240576},"That's a wrap for December. More integrations, deeper webhook coverage, and expanded objects/fields across advertising, HR, CRM, and messaging—so your product can sync and act on real data, in real time.",{"type":17,"tag":29,"props":240578,"children":240579},{},[240580],{"type":17,"tag":133,"props":240581,"children":240583},{"href":1612,"rel":240582},[214],[240584],{"type":17,"tag":48,"props":240585,"children":240586},{},[240587],{"type":23,"value":1616},{"type":17,"tag":29,"props":240589,"children":240590},{},[240591],{"type":17,"tag":133,"props":240592,"children":240594},{"href":1623,"rel":240593},[214],[240595],{"type":17,"tag":48,"props":240596,"children":240597},{},[240598],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":240600},[240601,240603,240604,240605,240606,240607,240608,240609],{"id":239658,"depth":1635,"text":240602},"New: Unified Advertising category",{"id":11629,"depth":1635,"text":216420},{"id":239911,"depth":1635,"text":239914},{"id":240142,"depth":1635,"text":240145},{"id":240289,"depth":1635,"text":240292},{"id":240358,"depth":1635,"text":240361},{"id":240430,"depth":1635,"text":240433},{"id":120936,"depth":1635,"text":216865},"content:blog:december_2025_product_updates.md","blog/december_2025_product_updates.md","blog/december_2025_product_updates",{"_path":240614,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":240615,"description":240616,"img":240617,"date":239599,"tag":12,"body":240618,"_type":1677,"_id":241313,"_source":1679,"_file":241314,"_stem":241315,"_extension":1682},"/blog/how_to_install","How To Install","Agent Builder connects to Unified MCP by adding a remote MCP server URL, then enabling only the tools your agent needs.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_install-icon.png",{"type":14,"children":240619,"toc":241298},[240620,240625,240628,240635,240653,240658,240664,240669,240703,240708,240745,240750,240782,240788,240868,240873,240899,240905,240914,240927,240940,240945,240987,240992,241006,241011,241069,241075,241080,241123,241128,241134,241140,241169,241175,241187,241203,241207,241212,241251,241257,241262,241271,241276,241287],{"type":17,"tag":18,"props":240621,"children":240623},{"id":240622},"how-to-install",[240624],{"type":23,"value":240615},{"type":17,"tag":25,"props":240626,"children":240627},{},[],{"type":17,"tag":29,"props":240629,"children":240630},{},[240631],{"type":17,"tag":33,"props":240632,"children":240633},{},[240634],{"type":23,"value":239390},{"type":17,"tag":29,"props":240636,"children":240637},{},[240638,240640,240645,240647,240651],{"type":23,"value":240639},"Agent Builder connects to ",{"type":17,"tag":133,"props":240641,"children":240643},{"href":217198,"rel":240642},[214],[240644],{"type":23,"value":45418},{"type":23,"value":240646}," by adding a remote ",{"type":17,"tag":133,"props":240648,"children":240649},{"href":326},[240650],{"type":23,"value":329},{"type":23,"value":240652}," server URL, then enabling only the tools your agent needs.",{"type":17,"tag":29,"props":240654,"children":240655},{},[240656],{"type":23,"value":240657},"This is the fastest path to give OpenAI agents real-time access to customer systems through Unified connections, without building one-off function calls for each SaaS API.",{"type":17,"tag":68,"props":240659,"children":240661},{"id":240660},"_1-create-your-unified-mcp-server-url",[240662],{"type":23,"value":240663},"1) Create your Unified MCP server URL",{"type":17,"tag":29,"props":240665,"children":240666},{},[240667],{"type":23,"value":240668},"Use the Streamable HTTP endpoint:",{"type":17,"tag":80,"props":240670,"children":240671},{},[240672,240682,240692],{"type":17,"tag":84,"props":240673,"children":240674},{},[240675,240677],{"type":23,"value":240676},"US: ",{"type":17,"tag":6121,"props":240678,"children":240680},{"className":240679},[],[240681],{"type":23,"value":142206},{"type":17,"tag":84,"props":240683,"children":240684},{},[240685,240687],{"type":23,"value":240686},"EU: ",{"type":17,"tag":6121,"props":240688,"children":240690},{"className":240689},[],[240691],{"type":23,"value":142215},{"type":17,"tag":84,"props":240693,"children":240694},{},[240695,240697],{"type":23,"value":240696},"AU: ",{"type":17,"tag":6121,"props":240698,"children":240700},{"className":240699},[],[240701],{"type":23,"value":240702},"https://mcp-api-au.unified.to/mcp",{"type":17,"tag":29,"props":240704,"children":240705},{},[240706],{"type":23,"value":240707},"Required parameters",{"type":17,"tag":80,"props":240709,"children":240710},{},[240711,240725],{"type":17,"tag":84,"props":240712,"children":240713},{},[240714,240720,240723],{"type":17,"tag":6121,"props":240715,"children":240717},{"className":240716},[],[240718],{"type":23,"value":240719},"token",{"type":17,"tag":3891,"props":240721,"children":240722},{},[],{"type":23,"value":240724},"Your Unified workspace API key (private), or an end-user-safe token for a single connection.",{"type":17,"tag":84,"props":240726,"children":240727},{},[240728,240733,240736,240738,240743],{"type":17,"tag":6121,"props":240729,"children":240731},{"className":240730},[],[240732],{"type":23,"value":92426},{"type":17,"tag":3891,"props":240734,"children":240735},{},[],{"type":23,"value":240737},"The end-customer connection ID (commonly used when ",{"type":17,"tag":6121,"props":240739,"children":240741},{"className":240740},[],[240742],{"type":23,"value":240719},{"type":23,"value":240744}," is a workspace API key).",{"type":17,"tag":29,"props":240746,"children":240747},{},[240748],{"type":23,"value":240749},"Tokens can be passed as:",{"type":17,"tag":80,"props":240751,"children":240752},{},[240753,240765],{"type":17,"tag":84,"props":240754,"children":240755},{},[240756,240757,240763],{"type":23,"value":78814},{"type":17,"tag":6121,"props":240758,"children":240760},{"className":240759},[],[240761],{"type":23,"value":240762},"token=",{"type":23,"value":240764}," URL parameter, or",{"type":17,"tag":84,"props":240766,"children":240767},{},[240768,240774,240775],{"type":17,"tag":6121,"props":240769,"children":240771},{"className":240770},[],[240772],{"type":23,"value":240773},"Authorization: bearer {token}",{"type":23,"value":18757},{"type":17,"tag":133,"props":240776,"children":240779},{"href":240777,"rel":240778},"https://docs.unified.to/mcp/additional-api-endpoints",[214],[240780],{"type":23,"value":240781},"Unified Docs",{"type":17,"tag":239,"props":240783,"children":240785},{"id":240784},"scoping-parameters-recommended",[240786],{"type":23,"value":240787},"Scoping parameters (recommended)",{"type":17,"tag":80,"props":240789,"children":240790},{},[240791,240817,240850],{"type":17,"tag":84,"props":240792,"children":240793},{},[240794,240799,240802,240804,240810,240812],{"type":17,"tag":6121,"props":240795,"children":240797},{"className":240796},[],[240798],{"type":23,"value":24204},{"type":17,"tag":3891,"props":240800,"children":240801},{},[],{"type":23,"value":240803},"A comma-delimited list of Unified scope permissions (example format shown in docs: ",{"type":17,"tag":6121,"props":240805,"children":240807},{"className":240806},[],[240808],{"type":23,"value":240809},"hris_employee_read",{"type":23,"value":240811},"). ",{"type":17,"tag":133,"props":240813,"children":240815},{"href":240777,"rel":240814},[214],[240816],{"type":23,"value":240781},{"type":17,"tag":84,"props":240818,"children":240819},{},[240820,240825,240828,240830,240836,240837,240843,240844],{"type":17,"tag":6121,"props":240821,"children":240823},{"className":240822},[],[240824],{"type":23,"value":131599},{"type":17,"tag":3891,"props":240826,"children":240827},{},[],{"type":23,"value":240829},"A comma-delimited list of MCP tool IDs (example formats shown in docs: ",{"type":17,"tag":6121,"props":240831,"children":240833},{"className":240832},[],[240834],{"type":23,"value":240835},"get_messaging_message",{"type":23,"value":11826},{"type":17,"tag":6121,"props":240838,"children":240840},{"className":240839},[],[240841],{"type":23,"value":240842},"list_messaging_message",{"type":23,"value":240811},{"type":17,"tag":133,"props":240845,"children":240848},{"href":240846,"rel":240847},"https://docs.unified.to/mcp/installation",[214],[240849],{"type":23,"value":240781},{"type":17,"tag":84,"props":240851,"children":240852},{},[240853,240858,240861,240863],{"type":17,"tag":6121,"props":240854,"children":240856},{"className":240855},[],[240857],{"type":23,"value":141531},{"type":17,"tag":3891,"props":240859,"children":240860},{},[],{"type":23,"value":240862},"Removes sensitive fields from results. ",{"type":17,"tag":133,"props":240864,"children":240866},{"href":240777,"rel":240865},[214],[240867],{"type":23,"value":240781},{"type":17,"tag":29,"props":240869,"children":240870},{},[240871],{"type":23,"value":240872},"Optional:",{"type":17,"tag":80,"props":240874,"children":240875},{},[240876,240885],{"type":17,"tag":84,"props":240877,"children":240878},{},[240879],{"type":17,"tag":6121,"props":240880,"children":240882},{"className":240881},[],[240883],{"type":23,"value":240884},"aliases",{"type":17,"tag":84,"props":240886,"children":240887},{},[240888,240893,240894],{"type":17,"tag":6121,"props":240889,"children":240891},{"className":240890},[],[240892],{"type":23,"value":142274},{"type":23,"value":18757},{"type":17,"tag":133,"props":240895,"children":240897},{"href":240777,"rel":240896},[214],[240898],{"type":23,"value":240781},{"type":17,"tag":239,"props":240900,"children":240902},{"id":240901},"example-url-placeholder-values",[240903],{"type":23,"value":240904},"Example URL (placeholder values)",{"type":17,"tag":6893,"props":240906,"children":240909},{"className":240907,"code":240908,"language":20901,"meta":23},[20899],"https://mcp-api.unified.to/mcp\n  ?token=WORKSPACE_API_KEY\n  &connection=CONNECTION_ID\n  &permissions=hris_employee_read\n  &hide_sensitive=true\n  &tools=get_messaging_message,list_messaging_message\n",[240910],{"type":17,"tag":6121,"props":240911,"children":240912},{"__ignoreMap":7},[240913],{"type":23,"value":240908},{"type":17,"tag":29,"props":240915,"children":240916},{},[240917,240919,240925],{"type":23,"value":240918},"If you haven't selected tools yet, skip ",{"type":17,"tag":6121,"props":240920,"children":240922},{"className":240921},[],[240923],{"type":23,"value":240924},"tools=",{"type":23,"value":240926}," and fetch the tool list first.",{"type":17,"tag":68,"props":240928,"children":240930},{"id":240929},"_2-fetch-tool-ids-so-tools-is-exact",[240931,240933,240938],{"type":23,"value":240932},"2) Fetch tool IDs (so ",{"type":17,"tag":6121,"props":240934,"children":240936},{"className":240935},[],[240937],{"type":23,"value":240924},{"type":23,"value":240939}," is exact)",{"type":17,"tag":29,"props":240941,"children":240942},{},[240943],{"type":23,"value":240944},"Unified exposes tool discovery and execution endpoints:",{"type":17,"tag":80,"props":240946,"children":240947},{},[240948,240971],{"type":17,"tag":84,"props":240949,"children":240950},{},[240951,240957,240959,240964,240966],{"type":17,"tag":6121,"props":240952,"children":240954},{"className":240953},[],[240955],{"type":23,"value":240956},"GET /tools",{"type":23,"value":240958}," to list available tools (including the ",{"type":17,"tag":6121,"props":240960,"children":240962},{"className":240961},[],[240963],{"type":23,"value":18766},{"type":23,"value":240965}," field) ",{"type":17,"tag":133,"props":240967,"children":240969},{"href":240777,"rel":240968},[214],[240970],{"type":23,"value":240781},{"type":17,"tag":84,"props":240972,"children":240973},{},[240974,240980,240982],{"type":17,"tag":6121,"props":240975,"children":240977},{"className":240976},[],[240978],{"type":23,"value":240979},"POST /tools/{id}/call",{"type":23,"value":240981}," to execute a specific tool ",{"type":17,"tag":133,"props":240983,"children":240985},{"href":240777,"rel":240984},[214],[240986],{"type":23,"value":240781},{"type":17,"tag":29,"props":240988,"children":240989},{},[240990],{"type":23,"value":240991},"In practice, the Tools endpoint sits under the MCP base URL. For Streamable HTTP, that means:",{"type":17,"tag":80,"props":240993,"children":240994},{},[240995],{"type":17,"tag":84,"props":240996,"children":240997},{},[240998,241004],{"type":17,"tag":6121,"props":240999,"children":241001},{"className":241000},[],[241002],{"type":23,"value":241003},"GET https://mcp-api.unified.to/mcp/tools?...",{"type":23,"value":241005}," (requires auth; the endpoint returns 401 if you hit it without a token)",{"type":17,"tag":29,"props":241007,"children":241008},{},[241009],{"type":23,"value":241010},"Workflow:",{"type":17,"tag":6154,"props":241012,"children":241013},{},[241014,241045,241057],{"type":17,"tag":84,"props":241015,"children":241016},{},[241017,241018,241024,241026,241031,241032,241037,241038,241043],{"type":23,"value":232104},{"type":17,"tag":6121,"props":241019,"children":241021},{"className":241020},[],[241022],{"type":23,"value":241023},"GET /mcp/tools",{"type":23,"value":241025}," using the same ",{"type":17,"tag":6121,"props":241027,"children":241029},{"className":241028},[],[241030],{"type":23,"value":240719},{"type":23,"value":11826},{"type":17,"tag":6121,"props":241033,"children":241035},{"className":241034},[],[241036],{"type":23,"value":92426},{"type":23,"value":12561},{"type":17,"tag":6121,"props":241039,"children":241041},{"className":241040},[],[241042],{"type":23,"value":24204},{"type":23,"value":241044}," you'll use in production.",{"type":17,"tag":84,"props":241046,"children":241047},{},[241048,241050,241055],{"type":23,"value":241049},"Copy the ",{"type":17,"tag":6121,"props":241051,"children":241053},{"className":241052},[],[241054],{"type":23,"value":18766},{"type":23,"value":241056}," values you want.",{"type":17,"tag":84,"props":241058,"children":241059},{},[241060,241062,241068],{"type":23,"value":241061},"Add them back into your MCP URL using ",{"type":17,"tag":6121,"props":241063,"children":241065},{"className":241064},[],[241066],{"type":23,"value":241067},"&tools=id1,id2,...",{"type":23,"value":54},{"type":17,"tag":68,"props":241070,"children":241072},{"id":241071},"_3-connect-unified-mcp-in-openai-agent-builder",[241073],{"type":23,"value":241074},"3) Connect Unified MCP in OpenAI Agent Builder",{"type":17,"tag":29,"props":241076,"children":241077},{},[241078],{"type":23,"value":241079},"Agent Builder's UI evolves quickly (beta), but the flow is consistent:",{"type":17,"tag":6154,"props":241081,"children":241082},{},[241083,241088,241105,241118],{"type":17,"tag":84,"props":241084,"children":241085},{},[241086],{"type":23,"value":241087},"Open your Agent Builder workflow and select your agent.",{"type":17,"tag":84,"props":241089,"children":241090},{},[241091,241092,241097,241099,241103],{"type":23,"value":6661},{"type":17,"tag":48,"props":241093,"children":241094},{},[241095],{"type":23,"value":241096},"Tools",{"type":23,"value":241098}," and add an ",{"type":17,"tag":48,"props":241100,"children":241101},{},[241102],{"type":23,"value":1067},{"type":23,"value":241104}," (remote/web MCP server).",{"type":17,"tag":84,"props":241106,"children":241107},{},[241108,241110,241116],{"type":23,"value":241109},"Paste your Unified ",{"type":17,"tag":6121,"props":241111,"children":241113},{"className":241112},[],[241114],{"type":23,"value":241115},"/mcp?...",{"type":23,"value":241117}," URL and connect.",{"type":17,"tag":84,"props":241119,"children":241120},{},[241121],{"type":23,"value":241122},"Enable only the tools you want available to this agent.",{"type":17,"tag":29,"props":241124,"children":241125},{},[241126],{"type":23,"value":241127},"If your agent has write access (create/update/delete), pair this with an approval step in your workflow.",{"type":17,"tag":68,"props":241129,"children":241131},{"id":241130},"why-scoping-matters-tool-limits-cost-security",[241132],{"type":23,"value":241133},"Why scoping matters (tool limits, cost, security)",{"type":17,"tag":239,"props":241135,"children":241137},{"id":241136},"tool-limits",[241138],{"type":23,"value":241139},"Tool limits",{"type":17,"tag":29,"props":241141,"children":241142},{},[241143,241145,241149,241151,241156,241157,241162,241164],{"type":23,"value":241144},"Models perform better when the toolset is small and relevant. ",{"type":17,"tag":133,"props":241146,"children":241147},{"href":326},[241148],{"type":23,"value":45418},{"type":23,"value":241150}," can expose a very large catalog, so narrowing by ",{"type":17,"tag":6121,"props":241152,"children":241154},{"className":241153},[],[241155],{"type":23,"value":24204},{"type":23,"value":34435},{"type":17,"tag":6121,"props":241158,"children":241160},{"className":241159},[],[241161],{"type":23,"value":131599},{"type":23,"value":241163}," is the default best practice. ",{"type":17,"tag":133,"props":241165,"children":241167},{"href":43558,"rel":241166},[214],[241168],{"type":23,"value":240781},{"type":17,"tag":239,"props":241170,"children":241172},{"id":241171},"cost-openai-tokens-unified-api-requests",[241173],{"type":23,"value":241174},"Cost (OpenAI tokens + Unified API requests)",{"type":17,"tag":29,"props":241176,"children":241177},{},[241178,241180],{"type":23,"value":241179},"On the OpenAI side, the MCP tool is billed via tokens used when importing tool definitions and making tool calls, with no additional per-tool-call fee from OpenAI beyond token usage. ",{"type":17,"tag":133,"props":241181,"children":241184},{"href":241182,"rel":241183},"https://platform.openai.com/docs/guides/tools-connectors-mcp?utm_source=chatgpt.com",[214],[241185],{"type":23,"value":241186},"OpenAI Platform+1",{"type":17,"tag":29,"props":241188,"children":241189},{},[241190,241192,241197,241198],{"type":23,"value":241191},"On the Unified side, ",{"type":17,"tag":48,"props":241193,"children":241194},{},[241195],{"type":23,"value":241196},"each MCP tool call counts as 1 API request on your Unified plan",{"type":23,"value":123303},{"type":17,"tag":133,"props":241199,"children":241201},{"href":43558,"rel":241200},[214],[241202],{"type":23,"value":240781},{"type":17,"tag":239,"props":241204,"children":241205},{"id":94791},[241206],{"type":23,"value":68268},{"type":17,"tag":29,"props":241208,"children":241209},{},[241210],{"type":23,"value":241211},"Remote MCP servers can access and return sensitive data. Reduce risk by default:",{"type":17,"tag":80,"props":241213,"children":241214},{},[241215,241225,241235],{"type":17,"tag":84,"props":241216,"children":241217},{},[241218,241220],{"type":23,"value":241219},"use least-privilege ",{"type":17,"tag":6121,"props":241221,"children":241223},{"className":241222},[],[241224],{"type":23,"value":24204},{"type":17,"tag":84,"props":241226,"children":241227},{},[241228,241230],{"type":23,"value":241229},"restrict ",{"type":17,"tag":6121,"props":241231,"children":241233},{"className":241232},[],[241234],{"type":23,"value":131599},{"type":17,"tag":84,"props":241236,"children":241237},{},[241238,241240,241245,241246],{"type":23,"value":241239},"enable ",{"type":17,"tag":6121,"props":241241,"children":241243},{"className":241242},[],[241244],{"type":23,"value":141531},{"type":23,"value":18757},{"type":17,"tag":133,"props":241247,"children":241249},{"href":240777,"rel":241248},[214],[241250],{"type":23,"value":240781},{"type":17,"tag":68,"props":241252,"children":241254},{"id":241253},"appendix-what-code-export-will-look-like-agents-sdk",[241255],{"type":23,"value":241256},"Appendix: what Code Export will look like (Agents SDK)",{"type":17,"tag":29,"props":241258,"children":241259},{},[241260],{"type":23,"value":241261},"If you export your Agent Builder configuration to code, the same MCP server URL typically appears as a hosted MCP tool configuration.",{"type":17,"tag":6893,"props":241263,"children":241266},{"className":241264,"code":241265,"language":127595,"meta":7},[127593],"from agentsimport Agent, HostedMCPTool\n\nagent = Agent(\n  name=\"Unified-powered agent\",\n  tools=[\n    HostedMCPTool(tool_config={\n\"type\":\"mcp\",\n\"server_label\":\"unifiedMCP\",\n\"server_url\":\"https://mcp-api.unified.to/mcp?token=...&connection=...&permissions=hris_employee_read&hide_sensitive=true&tools=get_messaging_message,list_messaging_message\",\n\"require_approval\":\"never\",\n    })\n  ],\n)\n",[241267],{"type":17,"tag":6121,"props":241268,"children":241269},{"__ignoreMap":7},[241270],{"type":23,"value":241265},{"type":17,"tag":29,"props":241272,"children":241273},{},[241274],{"type":23,"value":241275},"The implementation stays the same across UI and SDK: connect Unified as a remote MCP server URL, then scope down to the smallest set of permissions and tools your workflow requires.",{"type":17,"tag":29,"props":241277,"children":241278},{},[241279],{"type":17,"tag":133,"props":241280,"children":241282},{"href":1612,"rel":241281},[214],[241283],{"type":17,"tag":48,"props":241284,"children":241285},{},[241286],{"type":23,"value":1616},{"type":17,"tag":29,"props":241288,"children":241289},{},[241290],{"type":17,"tag":133,"props":241291,"children":241293},{"href":1623,"rel":241292},[214],[241294],{"type":17,"tag":48,"props":241295,"children":241296},{},[241297],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":241299},[241300,241304,241306,241307,241312],{"id":240660,"depth":1629,"text":240663,"children":241301},[241302,241303],{"id":240784,"depth":1635,"text":240787},{"id":240901,"depth":1635,"text":240904},{"id":240929,"depth":1629,"text":241305},"2) Fetch tool IDs (so tools= is exact)",{"id":241071,"depth":1629,"text":241074},{"id":241130,"depth":1629,"text":241133,"children":241308},[241309,241310,241311],{"id":241136,"depth":1635,"text":241139},{"id":241171,"depth":1635,"text":241174},{"id":94791,"depth":1635,"text":68268},{"id":241253,"depth":1629,"text":241256},"content:blog:how_to_install.md","blog/how_to_install.md","blog/how_to_install",{"_path":241317,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":241318,"description":241319,"img":241320,"date":239599,"tag":12,"body":241321,"_type":1677,"_id":242191,"_source":1679,"_file":242192,"_stem":242193,"_extension":1682},"/blog/unified_advertising_api_sync_campaigns_ads_and_performance_data_across_platforms","Unified Advertising API: Sync Campaigns, Ads, and Performance Data Across Platforms","If your product touches paid media, you eventually hit the same wall, every customer asks to connect a different ad platform, and each platform's API behaves...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_advertising_api_sync_campaigns_ads_and_performance_data_across_platforms-icon.png",{"type":14,"children":241322,"toc":242182},[241323,241328,241331,241338,241352,241357,241370,241375,241398,241407,241413,241418,241426,241465,241473,241496,241502,241506,241554,241559,241567,241573,241578,241633,241645,241654,241659,241759,241764,241770,241775,241788,241808,241822,241834,241997,242003,242008,242075,242081,242092,242110,242120,242138,242162,242167,242172,242177],{"type":17,"tag":18,"props":241324,"children":241326},{"id":241325},"unified-advertising-api-sync-campaigns-ads-and-performance-data-across-platforms",[241327],{"type":23,"value":241318},{"type":17,"tag":25,"props":241329,"children":241330},{},[],{"type":17,"tag":29,"props":241332,"children":241333},{},[241334],{"type":17,"tag":33,"props":241335,"children":241336},{},[241337],{"type":23,"value":239390},{"type":17,"tag":29,"props":241339,"children":241340},{},[241341,241343,241351],{"type":23,"value":241342},"Unified now supports a new category: ",{"type":17,"tag":133,"props":241344,"children":241346},{"href":18452,"rel":241345},[214],[241347],{"type":17,"tag":48,"props":241348,"children":241349},{},[241350],{"type":23,"value":215993},{"type":23,"value":54},{"type":17,"tag":29,"props":241353,"children":241354},{},[241355],{"type":23,"value":241356},"If your product touches paid media, you eventually hit the same wall: every customer asks to connect a different ad platform, and each platform's API behaves differently.",{"type":17,"tag":29,"props":241358,"children":241359},{},[241360,241361,241368],{"type":23,"value":149272},{"type":17,"tag":48,"props":241362,"children":241363},{},[241364],{"type":17,"tag":133,"props":241365,"children":241366},{"href":11091},[241367],{"type":23,"value":11094},{"type":23,"value":241369}," gives you a single, standardized way to read and write campaigns, ads, and performance data across major ad networks, in real time, without maintaining vendor-specific integrations.",{"type":17,"tag":29,"props":241371,"children":241372},{},[241373],{"type":23,"value":241374},"This is built for teams shipping advertising data as a real product surface:",{"type":17,"tag":80,"props":241376,"children":241377},{},[241378,241383,241388,241393],{"type":17,"tag":84,"props":241379,"children":241380},{},[241381],{"type":23,"value":241382},"Marketing analytics and reporting SaaS ('Connect your ad accounts')",{"type":17,"tag":84,"props":241384,"children":241385},{},[241386],{"type":23,"value":241387},"Agency and reseller portals (many clients, many ad accounts)",{"type":17,"tag":84,"props":241389,"children":241390},{},[241391],{"type":23,"value":241392},"AI and automation tools that need live performance signals",{"type":17,"tag":84,"props":241394,"children":241395},{},[241396],{"type":23,"value":241397},"Data and BI pipelines pulling paid media into warehouses for attribution and forecasting",{"type":17,"tag":29,"props":241399,"children":241400},{},[241401],{"type":17,"tag":133,"props":241402,"children":241404},{"href":239720,"rel":241403},[214],[241405],{"type":23,"value":241406},"Read our docs →",{"type":17,"tag":68,"props":241408,"children":241410},{"id":241409},"why-a-unified-advertising-api",[241411],{"type":23,"value":241412},"Why a unified Advertising API",{"type":17,"tag":29,"props":241414,"children":241415},{},[241416],{"type":23,"value":241417},"Ad platforms provide similar concepts (campaigns, ads, performance), but their APIs rarely line up. Authentication differs, objects are modeled differently, and reporting endpoints and metrics are inconsistent. Supporting 'one more platform' becomes recurring engineering work.",{"type":17,"tag":29,"props":241419,"children":241420},{},[241421],{"type":17,"tag":48,"props":241422,"children":241423},{},[241424],{"type":23,"value":241425},"Traditional approach",{"type":17,"tag":80,"props":241427,"children":241428},{},[241429,241434,241439,241444,241449],{"type":17,"tag":84,"props":241430,"children":241431},{},[241432],{"type":23,"value":241433},"Build separate integrations per platform",{"type":17,"tag":84,"props":241435,"children":241436},{},[241437],{"type":23,"value":241438},"Maintain multiple auth systems and permission scopes",{"type":17,"tag":84,"props":241440,"children":241441},{},[241442],{"type":23,"value":241443},"Normalize schemas yourself for reporting and analytics",{"type":17,"tag":84,"props":241445,"children":241446},{},[241447],{"type":23,"value":241448},"Rework integrations when APIs change",{"type":17,"tag":84,"props":241450,"children":241451},{},[241452,241454,241458,241459,241463],{"type":23,"value":241453},"Repeat ",{"type":17,"tag":133,"props":241455,"children":241456},{"href":1857},[241457],{"type":23,"value":1860},{"type":23,"value":11826},{"type":17,"tag":133,"props":241460,"children":241461},{"href":135},[241462],{"type":23,"value":138},{"type":23,"value":241464},", and error handling patterns per provider",{"type":17,"tag":29,"props":241466,"children":241467},{},[241468],{"type":17,"tag":48,"props":241469,"children":241470},{},[241471],{"type":23,"value":241472},"With Unified",{"type":17,"tag":80,"props":241474,"children":241475},{},[241476,241481,241486,241491],{"type":17,"tag":84,"props":241477,"children":241478},{},[241479],{"type":23,"value":241480},"Integrate once through one API surface",{"type":17,"tag":84,"props":241482,"children":241483},{},[241484],{"type":23,"value":241485},"Work with normalized objects across providers",{"type":17,"tag":84,"props":241487,"children":241488},{},[241489],{"type":23,"value":241490},"Query performance metrics by KPI type and time range",{"type":17,"tag":84,"props":241492,"children":241493},{},[241494],{"type":23,"value":241495},"Get real-time data via real-time, pass-through API calls (no caching, no sync jobs)",{"type":17,"tag":68,"props":241497,"children":241499},{"id":241498},"what-you-can-build-with-advertising",[241500],{"type":23,"value":241501},"What you can build with Advertising",{"type":17,"tag":29,"props":241503,"children":241504},{},[241505],{"type":23,"value":15093},{"type":17,"tag":80,"props":241507,"children":241508},{},[241509,241514,241519,241524,241529,241534,241539,241544,241549],{"type":17,"tag":84,"props":241510,"children":241511},{},[241512],{"type":23,"value":241513},"Multi-platform ad dashboards inside your product",{"type":17,"tag":84,"props":241515,"children":241516},{},[241517],{"type":23,"value":241518},"Agency reporting portals (white-label, client-by-client)",{"type":17,"tag":84,"props":241520,"children":241521},{},[241522],{"type":23,"value":241523},"Cross-channel monitoring and alerts (spend, CTR shifts, performance drops)",{"type":17,"tag":84,"props":241525,"children":241526},{},[241527],{"type":23,"value":241528},"Cross-platform reporting and attribution workflows that need consistent inputs",{"type":17,"tag":84,"props":241530,"children":241531},{},[241532],{"type":23,"value":241533},"Warehousing ad performance into BI (without multiple pipelines)",{"type":17,"tag":84,"props":241535,"children":241536},{},[241537],{"type":23,"value":241538},"AI analytics over ad data (trend detection, anomaly detection, recommendations)",{"type":17,"tag":84,"props":241540,"children":241541},{},[241542],{"type":23,"value":241543},"Campaign creation and lifecycle management",{"type":17,"tag":84,"props":241545,"children":241546},{},[241547],{"type":23,"value":241548},"Budget updates and pacing adjustments",{"type":17,"tag":84,"props":241550,"children":241551},{},[241552],{"type":23,"value":241553},"Creative and targeting updates across platforms",{"type":17,"tag":29,"props":241555,"children":241556},{},[241557],{"type":23,"value":241558},"This is especially useful for AI-powered products, where agents or copilots need consistent, real-time access to campaign performance and the ability to take action across platforms.",{"type":17,"tag":29,"props":241560,"children":241561},{},[241562],{"type":17,"tag":133,"props":241563,"children":241565},{"href":239720,"rel":241564},[214],[241566],{"type":23,"value":241406},{"type":17,"tag":68,"props":241568,"children":241570},{"id":241569},"supported-providers",[241571],{"type":23,"value":241572},"Supported providers",{"type":17,"tag":29,"props":241574,"children":241575},{},[241576],{"type":23,"value":241577},"Advertising integrations include:",{"type":17,"tag":80,"props":241579,"children":241580},{},[241581,241585,241589,241593,241597,241601,241605,241609,241613,241617,241621,241625,241629],{"type":17,"tag":84,"props":241582,"children":241583},{},[241584],{"type":23,"value":11347},{"type":17,"tag":84,"props":241586,"children":241587},{},[241588],{"type":23,"value":11337},{"type":17,"tag":84,"props":241590,"children":241591},{},[241592],{"type":23,"value":41676},{"type":17,"tag":84,"props":241594,"children":241595},{},[241596],{"type":23,"value":11342},{"type":17,"tag":84,"props":241598,"children":241599},{},[241600],{"type":23,"value":11357},{"type":17,"tag":84,"props":241602,"children":241603},{},[241604],{"type":23,"value":11332},{"type":17,"tag":84,"props":241606,"children":241607},{},[241608],{"type":23,"value":11382},{"type":17,"tag":84,"props":241610,"children":241611},{},[241612],{"type":23,"value":11377},{"type":17,"tag":84,"props":241614,"children":241615},{},[241616],{"type":23,"value":11372},{"type":17,"tag":84,"props":241618,"children":241619},{},[241620],{"type":23,"value":11367},{"type":17,"tag":84,"props":241622,"children":241623},{},[241624],{"type":23,"value":11387},{"type":17,"tag":84,"props":241626,"children":241627},{},[241628],{"type":23,"value":11362},{"type":17,"tag":84,"props":241630,"children":241631},{},[241632],{"type":23,"value":11352},{"type":17,"tag":29,"props":241634,"children":241635},{},[241636,241638,241644],{"type":23,"value":241637},"Looking for another provider? ",{"type":17,"tag":133,"props":241639,"children":241641},{"href":215330,"rel":241640},[214],[241642],{"type":23,"value":241643},"Request an integration",{"type":23,"value":54},{"type":17,"tag":68,"props":241646,"children":241648},{"id":241647},"standardized-objects-across-advertising-platforms",[241649],{"type":17,"tag":48,"props":241650,"children":241651},{},[241652],{"type":23,"value":241653},"Standardized objects across advertising platforms",{"type":17,"tag":29,"props":241655,"children":241656},{},[241657],{"type":23,"value":241658},"The Advertising API provides normalized objects across providers:",{"type":17,"tag":80,"props":241660,"children":241661},{},[241662,241671,241695,241704,241713,241722,241731,241740,241749],{"type":17,"tag":84,"props":241663,"children":241664},{},[241665,241669],{"type":17,"tag":48,"props":241666,"children":241667},{},[241668],{"type":23,"value":41703},{"type":23,"value":241670}," (ad accounts): id, name, currency, timezone (where supported)",{"type":17,"tag":84,"props":241672,"children":241673},{},[241674,241678,241680,241686,241687,241693],{"type":17,"tag":48,"props":241675,"children":241676},{},[241677],{"type":23,"value":41708},{"type":23,"value":241679},": id, name, active status, budgets (",{"type":17,"tag":6121,"props":241681,"children":241683},{"className":241682},[],[241684],{"type":23,"value":241685},"budget_amount",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241688,"children":241690},{"className":241689},[],[241691],{"type":23,"value":241692},"budget_period",{"type":23,"value":241694},"), scheduling (where supported)",{"type":17,"tag":84,"props":241696,"children":241697},{},[241698,241702],{"type":17,"tag":48,"props":241699,"children":241700},{},[241701],{"type":23,"value":41728},{"type":23,"value":241703}," (ad groups/ad sets): id, name, active status, campaign relationship, plus provider-specific fields where available",{"type":17,"tag":84,"props":241705,"children":241706},{},[241707,241711],{"type":17,"tag":48,"props":241708,"children":241709},{},[241710],{"type":23,"value":41733},{"type":23,"value":241712},": id, name, type, active status, group relationship, plus creative fields where available",{"type":17,"tag":84,"props":241714,"children":241715},{},[241716,241720],{"type":17,"tag":48,"props":241717,"children":241718},{},[241719],{"type":23,"value":41738},{"type":23,"value":241721},": metric results scoped to date range + org, and optionally campaign",{"type":17,"tag":84,"props":241723,"children":241724},{},[241725,241729],{"type":17,"tag":48,"props":241726,"children":241727},{},[241728],{"type":23,"value":41718},{"type":23,"value":241730}," (ad assets, copy, URLs, metadata)",{"type":17,"tag":84,"props":241732,"children":241733},{},[241734,241738],{"type":17,"tag":48,"props":241735,"children":241736},{},[241737],{"type":23,"value":41723},{"type":23,"value":241739}," (budget allocation and pacing structures)",{"type":17,"tag":84,"props":241741,"children":241742},{},[241743,241747],{"type":17,"tag":48,"props":241744,"children":241745},{},[241746],{"type":23,"value":41743},{"type":23,"value":241748}," (targeting parameters)",{"type":17,"tag":84,"props":241750,"children":241751},{},[241752,241757],{"type":17,"tag":48,"props":241753,"children":241754},{},[241755],{"type":23,"value":241756},"Promoted Objects",{"type":23,"value":241758}," (platform-specific promoted entities)",{"type":17,"tag":29,"props":241760,"children":241761},{},[241762],{"type":23,"value":241763},"Field-level coverage varies by provider. In addition to core objects, Unified supports deeper structures such as creatives, insertion orders, targeting, and promoted entities, enabling full campaign lifecycle management across platforms.",{"type":17,"tag":68,"props":241765,"children":241767},{"id":241766},"reports-with-explicit-kpi-types",[241768],{"type":23,"value":241769},"Reports with explicit KPI types",{"type":17,"tag":29,"props":241771,"children":241772},{},[241773],{"type":23,"value":241774},"Reporting is metric-driven. You request the KPI you want, then filter by ad account and campaign.",{"type":17,"tag":29,"props":241776,"children":241777},{},[241778,241782,241783],{"type":17,"tag":48,"props":241779,"children":241780},{},[241781],{"type":23,"value":48264},{"type":23,"value":18757},{"type":17,"tag":6121,"props":241784,"children":241786},{"className":241785},[],[241787],{"type":23,"value":228553},{"type":17,"tag":29,"props":241789,"children":241790},{},[241791,241796,241797,241802,241803],{"type":17,"tag":48,"props":241792,"children":241793},{},[241794],{"type":23,"value":241795},"Filters:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":241798,"children":241800},{"className":241799},[],[241801],{"type":23,"value":11980},{"type":23,"value":11826},{"type":17,"tag":6121,"props":241804,"children":241806},{"className":241805},[],[241807],{"type":23,"value":47245},{"type":17,"tag":29,"props":241809,"children":241810},{},[241811,241816,241817],{"type":17,"tag":48,"props":241812,"children":241813},{},[241814],{"type":23,"value":241815},"Metric selector:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":241818,"children":241820},{"className":241819},[],[241821],{"type":23,"value":27310},{"type":17,"tag":29,"props":241823,"children":241824},{},[241825,241827,241832],{"type":23,"value":241826},"Supported ",{"type":17,"tag":6121,"props":241828,"children":241830},{"className":241829},[],[241831],{"type":23,"value":27310},{"type":23,"value":241833}," values include:",{"type":17,"tag":80,"props":241835,"children":241836},{},[241837,241886,241915,241968,241986],{"type":17,"tag":84,"props":241838,"children":241839},{},[241840,241842,241847,241848,241853,241854,241859,241860,241865,241866,241872,241873,241879,241880],{"type":23,"value":241841},"Core: ",{"type":17,"tag":6121,"props":241843,"children":241845},{"className":241844},[],[241846],{"type":23,"value":228242},{"type":23,"value":11826},{"type":17,"tag":6121,"props":241849,"children":241851},{"className":241850},[],[241852],{"type":23,"value":228251},{"type":23,"value":11826},{"type":17,"tag":6121,"props":241855,"children":241857},{"className":241856},[],[241858],{"type":23,"value":228260},{"type":23,"value":11826},{"type":17,"tag":6121,"props":241861,"children":241863},{"className":241862},[],[241864],{"type":23,"value":228269},{"type":23,"value":11826},{"type":17,"tag":6121,"props":241867,"children":241869},{"className":241868},[],[241870],{"type":23,"value":241871},"CPC",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241874,"children":241876},{"className":241875},[],[241877],{"type":23,"value":241878},"CPM",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241881,"children":241883},{"className":241882},[],[241884],{"type":23,"value":241885},"ECPM",{"type":17,"tag":84,"props":241887,"children":241888},{},[241889,241891,241896,241897,241903,241904,241909,241910],{"type":23,"value":241890},"Conversion + value: ",{"type":17,"tag":6121,"props":241892,"children":241894},{"className":241893},[],[241895],{"type":23,"value":228278},{"type":23,"value":11826},{"type":17,"tag":6121,"props":241898,"children":241900},{"className":241899},[],[241901],{"type":23,"value":241902},"CONVERSION_VALUE",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241905,"children":241907},{"className":241906},[],[241908],{"type":23,"value":41451},{"type":23,"value":11826},{"type":17,"tag":6121,"props":241911,"children":241913},{"className":241912},[],[241914],{"type":23,"value":41446},{"type":17,"tag":84,"props":241916,"children":241917},{},[241918,241920,241926,241927,241933,241934,241940,241941,241947,241948,241954,241955,241961,241962],{"type":23,"value":241919},"Engagement: ",{"type":17,"tag":6121,"props":241921,"children":241923},{"className":241922},[],[241924],{"type":23,"value":241925},"ENGAGEMENT",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241928,"children":241930},{"className":241929},[],[241931],{"type":23,"value":241932},"ENGAGEMENTS",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241935,"children":241937},{"className":241936},[],[241938],{"type":23,"value":241939},"LIKES",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241942,"children":241944},{"className":241943},[],[241945],{"type":23,"value":241946},"SHARES",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241949,"children":241951},{"className":241950},[],[241952],{"type":23,"value":241953},"COMMENTS",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241956,"children":241958},{"className":241957},[],[241959],{"type":23,"value":241960},"SAVES",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241963,"children":241965},{"className":241964},[],[241966],{"type":23,"value":241967},"FOLLOWS",{"type":17,"tag":84,"props":241969,"children":241970},{},[241971,241973,241979,241980],{"type":23,"value":241972},"Video: ",{"type":17,"tag":6121,"props":241974,"children":241976},{"className":241975},[],[241977],{"type":23,"value":241978},"VIDEO_VIEWS",{"type":23,"value":11826},{"type":17,"tag":6121,"props":241981,"children":241983},{"className":241982},[],[241984],{"type":23,"value":241985},"VIDEO_COMPLETIONS",{"type":17,"tag":84,"props":241987,"children":241988},{},[241989,241991],{"type":23,"value":241990},"Lead gen: ",{"type":17,"tag":6121,"props":241992,"children":241994},{"className":241993},[],[241995],{"type":23,"value":241996},"LEADS",{"type":17,"tag":68,"props":241998,"children":242000},{"id":241999},"example-workflow",[242001],{"type":23,"value":242002},"Example workflow",{"type":17,"tag":29,"props":242004,"children":242005},{},[242006],{"type":23,"value":242007},"Cross-platform dashboard inside your product:",{"type":17,"tag":6154,"props":242009,"children":242010},{},[242011,242016,242027,242070],{"type":17,"tag":84,"props":242012,"children":242013},{},[242014],{"type":23,"value":242015},"Customer connects Google Ads + Meta Ads + TikTok Ads",{"type":17,"tag":84,"props":242017,"children":242018},{},[242019,242021,242025],{"type":23,"value":242020},"You list ",{"type":17,"tag":48,"props":242022,"children":242023},{},[242024],{"type":23,"value":171705},{"type":23,"value":242026}," (ad accounts) and pull structure (campaigns, groups, ads)",{"type":17,"tag":84,"props":242028,"children":242029},{},[242030,242032,242038,242040,242045,242046,242051,242052,242057,242059,242064,242065],{"type":23,"value":242031},"You query ",{"type":17,"tag":6121,"props":242033,"children":242035},{"className":242034},[],[242036],{"type":23,"value":242037},"/report",{"type":23,"value":242039}," for the KPIs you need (e.g., ",{"type":17,"tag":6121,"props":242041,"children":242043},{"className":242042},[],[242044],{"type":23,"value":228269},{"type":23,"value":11826},{"type":17,"tag":6121,"props":242047,"children":242049},{"className":242048},[],[242050],{"type":23,"value":228242},{"type":23,"value":11826},{"type":17,"tag":6121,"props":242053,"children":242055},{"className":242054},[],[242056],{"type":23,"value":41446},{"type":23,"value":242058},") filtered by ",{"type":17,"tag":6121,"props":242060,"children":242062},{"className":242061},[],[242063],{"type":23,"value":11980},{"type":23,"value":34435},{"type":17,"tag":6121,"props":242066,"children":242068},{"className":242067},[],[242069],{"type":23,"value":47245},{"type":17,"tag":84,"props":242071,"children":242072},{},[242073],{"type":23,"value":242074},"You render a consistent dashboard across platforms using Unified's normalized objects",{"type":17,"tag":68,"props":242076,"children":242078},{"id":242077},"real-time-readwrite-by-design",[242079],{"type":23,"value":242080},"Real-time, read/write by design",{"type":17,"tag":29,"props":242082,"children":242083},{},[242084,242086,242090],{"type":23,"value":242085},"The Advertising API supports both ",{"type":17,"tag":48,"props":242087,"children":242088},{},[242089],{"type":23,"value":78704},{"type":23,"value":242091}," across supported objects.",{"type":17,"tag":80,"props":242093,"children":242094},{},[242095,242100,242105],{"type":17,"tag":84,"props":242096,"children":242097},{},[242098],{"type":23,"value":242099},"Read campaign structure, ads, and performance metrics",{"type":17,"tag":84,"props":242101,"children":242102},{},[242103],{"type":23,"value":242104},"Create, update, and manage campaigns, groups, creatives, and ads",{"type":17,"tag":84,"props":242106,"children":242107},{},[242108],{"type":23,"value":242109},"Modify targeting, budgets, and scheduling where supported",{"type":17,"tag":29,"props":242111,"children":242112},{},[242113,242114,242119],{"type":23,"value":182270},{"type":17,"tag":48,"props":242115,"children":242116},{},[242117],{"type":23,"value":242118},"stateless and routed directly to the source API",{"type":23,"value":182277},{"type":17,"tag":29,"props":242121,"children":242122},{},[242123,242125,242130,242132],{"type":23,"value":242124},"Unified provides real-time access because every request is ",{"type":17,"tag":48,"props":242126,"children":242127},{},[242128],{"type":23,"value":242129},"stateless and passes through to the ad platforms directly",{"type":23,"value":242131}," (no caching). Traffic is regionalized (US/EU/AU) to support data residency requirements. ",{"type":17,"tag":133,"props":242133,"children":242135},{"href":86962,"rel":242134},[214],[242136],{"type":23,"value":242137},"Learn more about our data security →",{"type":17,"tag":29,"props":242139,"children":242140},{},[242141,242143,242152,242153,242161],{"type":23,"value":242142},"The Advertising API is available on all Unified plans. ",{"type":17,"tag":133,"props":242144,"children":242146},{"href":1612,"rel":242145},[214],[242147],{"type":17,"tag":48,"props":242148,"children":242149},{},[242150],{"type":23,"value":242151},"Start your 30-day trial",{"type":23,"value":75890},{"type":17,"tag":133,"props":242154,"children":242156},{"href":1623,"rel":242155},[214],[242157],{"type":17,"tag":48,"props":242158,"children":242159},{},[242160],{"type":23,"value":226481},{"type":23,"value":54},{"type":17,"tag":29,"props":242163,"children":242164},{},[242165],{"type":23,"value":242166},"What is a unified advertising API?",{"type":17,"tag":29,"props":242168,"children":242169},{},[242170],{"type":23,"value":242171},"A unified advertising API provides a single interface to access and manage data across multiple ad platforms. Instead of integrating with each provider separately, developers can use one API to read and write campaigns, ads, and performance data with consistent schemas across systems.",{"type":17,"tag":29,"props":242173,"children":242174},{},[242175],{"type":23,"value":242176},"Can you manage ad campaigns across multiple platforms with one API?",{"type":17,"tag":29,"props":242178,"children":242179},{},[242180],{"type":23,"value":242181},"Yes, a unified advertising API allows developers to create, update, and manage campaigns, ads, and targeting across multiple ad platforms through a single integration. This removes the need to build and maintain separate integrations for each provider.",{"title":7,"searchDepth":1629,"depth":1629,"links":242183},[242184,242185,242186,242187,242188,242189,242190],{"id":241409,"depth":1629,"text":241412},{"id":241498,"depth":1629,"text":241501},{"id":241569,"depth":1629,"text":241572},{"id":241647,"depth":1629,"text":241653},{"id":241766,"depth":1629,"text":241769},{"id":241999,"depth":1629,"text":242002},{"id":242077,"depth":1629,"text":242080},"content:blog:unified_advertising_api_sync_campaigns_ads_and_performance_data_across_platforms.md","blog/unified_advertising_api_sync_campaigns_ads_and_performance_data_across_platforms.md","blog/unified_advertising_api_sync_campaigns_ads_and_performance_data_across_platforms",{"_path":242195,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":242196,"description":242197,"img":242198,"date":239599,"tag":12,"body":242199,"_type":1677,"_id":242863,"_source":1679,"_file":242864,"_stem":242865,"_extension":1682},"/blog/unified_forms_api_sync_form_submissions_across_typeform_google_forms_and_more","Unified Forms API: Sync Form Submissions Across Typeform, Google Forms, and More","If your product collects data through forms, you eventually face the same problem, customers use different form builders, and each platform exposes...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_forms_api_sync_form_submissions_across_typeform_google_forms_and_more-icon.png",{"type":14,"children":242200,"toc":242846},[242201,242206,242209,242216,242221,242247,242252,242275,242279,242284,242299,242310,242316,242321,242326,242333,242361,242368,242391,242397,242402,242425,242430,242436,242459,242465,242470,242488,242493,242499,242503,242541,242545,242573,242579,242589,242610,242615,242620,242628,242637,242642,242676,242685,242690,242695,242718,242723,242731,242737,242741,242746,242768,242772,242776,242799,242813,242837,242841],{"type":17,"tag":18,"props":242202,"children":242204},{"id":242203},"unified-forms-api-sync-form-submissions-across-typeform-google-forms-and-more",[242205],{"type":23,"value":242196},{"type":17,"tag":25,"props":242207,"children":242208},{},[],{"type":17,"tag":29,"props":242210,"children":242211},{},[242212],{"type":17,"tag":33,"props":242213,"children":242214},{},[242215],{"type":23,"value":239390},{"type":17,"tag":29,"props":242217,"children":242218},{},[242219],{"type":23,"value":242220},"If your product collects data through forms, you eventually face the same problem: customers use different form builders, and each platform exposes submissions, fields, and responses differently.",{"type":17,"tag":29,"props":242222,"children":242223},{},[242224,242225,242230,242238,242240,242245],{"type":23,"value":6712},{"type":17,"tag":133,"props":242226,"children":242228},{"href":39954,"rel":242227},[214],[242229],{"type":23,"value":86959},{"type":17,"tag":133,"props":242231,"children":242233},{"href":39954,"rel":242232},[214],[242234],{"type":17,"tag":48,"props":242235,"children":242236},{},[242237],{"type":23,"value":114951},{"type":23,"value":242239}," gives you a single, standardized way to pull ",{"type":17,"tag":48,"props":242241,"children":242242},{},[242243],{"type":23,"value":242244},"real-time form and submission data",{"type":23,"value":242246}," across major form platforms, without maintaining vendor-specific integrations.",{"type":17,"tag":29,"props":242248,"children":242249},{},[242250],{"type":23,"value":242251},"This is built for teams shipping form data as a core product capability:",{"type":17,"tag":80,"props":242253,"children":242254},{},[242255,242260,242265,242270],{"type":17,"tag":84,"props":242256,"children":242257},{},[242258],{"type":23,"value":242259},"SaaS products that ingest leads, registrations, or feedback",{"type":17,"tag":84,"props":242261,"children":242262},{},[242263],{"type":23,"value":242264},"Platforms syncing form submissions into CRMs, databases, or internal tools",{"type":17,"tag":84,"props":242266,"children":242267},{},[242268],{"type":23,"value":242269},"Automation systems triggered by form submissions",{"type":17,"tag":84,"props":242271,"children":242272},{},[242273],{"type":23,"value":242274},"Analytics and AI tools analyzing surveys, feedback, and structured inputs",{"type":17,"tag":68,"props":242276,"children":242277},{"id":25342},[242278],{"type":23,"value":216065},{"type":17,"tag":29,"props":242280,"children":242281},{},[242282],{"type":23,"value":242283},"Forms integrations are available now for:",{"type":17,"tag":80,"props":242285,"children":242286},{},[242287,242291,242295],{"type":17,"tag":84,"props":242288,"children":242289},{},[242290],{"type":23,"value":39973},{"type":17,"tag":84,"props":242292,"children":242293},{},[242294],{"type":23,"value":39623},{"type":17,"tag":84,"props":242296,"children":242297},{},[242298],{"type":23,"value":39982},{"type":17,"tag":29,"props":242300,"children":242301},{},[242302,242304,242309],{"type":23,"value":242303},"Additional integrations are expanding as part of the Forms category. Looking for another provider? ",{"type":17,"tag":133,"props":242305,"children":242307},{"href":215330,"rel":242306},[214],[242308],{"type":23,"value":241643},{"type":23,"value":54},{"type":17,"tag":68,"props":242311,"children":242313},{"id":242312},"why-a-unified-forms-api",[242314],{"type":23,"value":242315},"Why a unified Forms API",{"type":17,"tag":29,"props":242317,"children":242318},{},[242319],{"type":23,"value":242320},"Form platforms all solve similar problems, but their APIs don't align. Authentication varies, submission payloads differ, and field definitions are inconsistent across tools.",{"type":17,"tag":29,"props":242322,"children":242323},{},[242324],{"type":23,"value":242325},"Supporting 'just one more form provider' quickly turns into repeated integration work.",{"type":17,"tag":29,"props":242327,"children":242328},{},[242329],{"type":17,"tag":48,"props":242330,"children":242331},{},[242332],{"type":23,"value":241425},{"type":17,"tag":80,"props":242334,"children":242335},{},[242336,242341,242346,242351,242356],{"type":17,"tag":84,"props":242337,"children":242338},{},[242339],{"type":23,"value":242340},"Build and maintain separate integrations per form platform",{"type":17,"tag":84,"props":242342,"children":242343},{},[242344],{"type":23,"value":242345},"Learn multiple auth systems and API specifications",{"type":17,"tag":84,"props":242347,"children":242348},{},[242349],{"type":23,"value":242350},"Normalize submissions and answers yourself",{"type":17,"tag":84,"props":242352,"children":242353},{},[242354],{"type":23,"value":242355},"Handle platform-specific field types and response formats",{"type":17,"tag":84,"props":242357,"children":242358},{},[242359],{"type":23,"value":242360},"Update integrations when providers change APIs",{"type":17,"tag":29,"props":242362,"children":242363},{},[242364],{"type":17,"tag":48,"props":242365,"children":242366},{},[242367],{"type":23,"value":241472},{"type":17,"tag":80,"props":242369,"children":242370},{},[242371,242376,242381,242386],{"type":17,"tag":84,"props":242372,"children":242373},{},[242374],{"type":23,"value":242375},"Integrate once through a single API surface",{"type":17,"tag":84,"props":242377,"children":242378},{},[242379],{"type":23,"value":242380},"Work with normalized form and submission objects",{"type":17,"tag":84,"props":242382,"children":242383},{},[242384],{"type":23,"value":242385},"Pull responses live from the source platform",{"type":17,"tag":84,"props":242387,"children":242388},{},[242389],{"type":23,"value":242390},"Avoid long-term maintenance as platforms evolve",{"type":17,"tag":68,"props":242392,"children":242394},{"id":242393},"using-form-data-in-ai-systems",[242395],{"type":23,"value":242396},"Using form data in AI systems",{"type":17,"tag":29,"props":242398,"children":242399},{},[242400],{"type":23,"value":242401},"Form submissions provide structured inputs that can be used to:",{"type":17,"tag":80,"props":242403,"children":242404},{},[242405,242410,242415,242420],{"type":17,"tag":84,"props":242406,"children":242407},{},[242408],{"type":23,"value":242409},"Classify leads or user intent",{"type":17,"tag":84,"props":242411,"children":242412},{},[242413],{"type":23,"value":242414},"Extract signals from survey responses",{"type":17,"tag":84,"props":242416,"children":242417},{},[242418],{"type":23,"value":242419},"Generate summaries of qualitative feedback",{"type":17,"tag":84,"props":242421,"children":242422},{},[242423],{"type":23,"value":242424},"Trigger downstream actions based on response content",{"type":17,"tag":29,"props":242426,"children":242427},{},[242428],{"type":23,"value":242429},"Because data is retrieved in real time, AI systems operate on current inputs rather than cached snapshots.",{"type":17,"tag":68,"props":242431,"children":242433},{"id":242432},"what-the-forms-api-handles",[242434],{"type":23,"value":242435},"What the Forms API handles",{"type":17,"tag":80,"props":242437,"children":242438},{},[242439,242444,242449,242454],{"type":17,"tag":84,"props":242440,"children":242441},{},[242442],{"type":23,"value":242443},"Form definitions (fields, structure, configuration)",{"type":17,"tag":84,"props":242445,"children":242446},{},[242447],{"type":23,"value":242448},"Submission data (answers, respondents, timestamps)",{"type":17,"tag":84,"props":242450,"children":242451},{},[242452],{"type":23,"value":242453},"Cross-platform normalization of field types and responses",{"type":17,"tag":84,"props":242455,"children":242456},{},[242457],{"type":23,"value":242458},"Real-time retrieval without polling or sync jobs",{"type":17,"tag":68,"props":242460,"children":242462},{"id":242461},"event-driven-form-data-access",[242463],{"type":23,"value":242464},"Event-driven form data access",{"type":17,"tag":29,"props":242466,"children":242467},{},[242468],{"type":23,"value":242469},"Form submissions can be consumed as they occur using:",{"type":17,"tag":80,"props":242471,"children":242472},{},[242473,242483],{"type":17,"tag":84,"props":242474,"children":242475},{},[242476,242477,242481],{"type":23,"value":119374},{"type":17,"tag":133,"props":242478,"children":242479},{"href":4999},[242480],{"type":23,"value":5002},{"type":23,"value":242482}," where supported",{"type":17,"tag":84,"props":242484,"children":242485},{},[242486],{"type":23,"value":242487},"Unified-managed delivery where not",{"type":17,"tag":29,"props":242489,"children":242490},{},[242491],{"type":23,"value":242492},"This allows systems to react to new submissions without building polling infrastructure.",{"type":17,"tag":68,"props":242494,"children":242496},{"id":242495},"what-you-can-build-with-forms",[242497],{"type":23,"value":242498},"What you can build with Forms",{"type":17,"tag":29,"props":242500,"children":242501},{},[242502],{"type":23,"value":12661},{"type":17,"tag":80,"props":242504,"children":242505},{},[242506,242511,242516,242521,242526,242531,242536],{"type":17,"tag":84,"props":242507,"children":242508},{},[242509],{"type":23,"value":242510},"Lead and customer data capture pipelines",{"type":17,"tag":84,"props":242512,"children":242513},{},[242514],{"type":23,"value":242515},"Survey and feedback analytics dashboards",{"type":17,"tag":84,"props":242517,"children":242518},{},[242519],{"type":23,"value":242520},"Automation triggered by form submissions",{"type":17,"tag":84,"props":242522,"children":242523},{},[242524],{"type":23,"value":242525},"Aggregating submissions across multiple form platforms",{"type":17,"tag":84,"props":242527,"children":242528},{},[242529],{"type":23,"value":242530},"AI analysis of structured responses (classification, trend detection, summarization)",{"type":17,"tag":84,"props":242532,"children":242533},{},[242534],{"type":23,"value":242535},"Lead scoring and qualification based on submission answers",{"type":17,"tag":84,"props":242537,"children":242538},{},[242539],{"type":23,"value":242540},"Audit and compliance tracking for submitted data",{"type":17,"tag":68,"props":242542,"children":242543},{"id":182585},[242544],{"type":23,"value":182588},{"type":17,"tag":80,"props":242546,"children":242547},{},[242548,242553,242558,242563,242568],{"type":17,"tag":84,"props":242549,"children":242550},{},[242551],{"type":23,"value":242552},"SaaS platforms ingesting lead or customer data",{"type":17,"tag":84,"props":242554,"children":242555},{},[242556],{"type":23,"value":242557},"Data pipelines consolidating form submissions across sources",{"type":17,"tag":84,"props":242559,"children":242560},{},[242561],{"type":23,"value":242562},"Analytics platforms processing survey or feedback data",{"type":17,"tag":84,"props":242564,"children":242565},{},[242566],{"type":23,"value":242567},"AI systems analyzing structured responses",{"type":17,"tag":84,"props":242569,"children":242570},{},[242571],{"type":23,"value":242572},"Automation platforms reacting to form submissions",{"type":17,"tag":68,"props":242574,"children":242576},{"id":242575},"normalized-objects-across-providers",[242577],{"type":23,"value":242578},"Normalized objects across providers",{"type":17,"tag":29,"props":242580,"children":242581},{},[242582,242583,242587],{"type":23,"value":6712},{"type":17,"tag":133,"props":242584,"children":242585},{"href":39304},[242586],{"type":23,"value":114951},{"type":23,"value":242588}," exposes consistent objects across platforms:",{"type":17,"tag":80,"props":242590,"children":242591},{},[242592,242601],{"type":17,"tag":84,"props":242593,"children":242594},{},[242595,242599],{"type":17,"tag":48,"props":242596,"children":242597},{},[242598],{"type":23,"value":114439},{"type":23,"value":242600},": templates, field definitions, configuration, active status, published URLs",{"type":17,"tag":84,"props":242602,"children":242603},{},[242604,242608],{"type":17,"tag":48,"props":242605,"children":242606},{},[242607],{"type":23,"value":189222},{"type":23,"value":242609},": responses, answers, respondent identifiers, timestamps",{"type":17,"tag":29,"props":242611,"children":242612},{},[242613],{"type":23,"value":242614},"Forms and submissions follow consistent schemas across providers, reducing the need to map field types or response formats per platform.",{"type":17,"tag":29,"props":242616,"children":242617},{},[242618],{"type":23,"value":242619},"Field-level support varies by provider. Use the Supported Integrations page to confirm which fields are readable for each platform.",{"type":17,"tag":29,"props":242621,"children":242622},{},[242623],{"type":17,"tag":133,"props":242624,"children":242626},{"href":114668,"rel":242625},[214],[242627],{"type":23,"value":241406},{"type":17,"tag":68,"props":242629,"children":242631},{"id":242630},"example-implementation",[242632],{"type":17,"tag":48,"props":242633,"children":242634},{},[242635],{"type":23,"value":242636},"Example implementation",{"type":17,"tag":29,"props":242638,"children":242639},{},[242640],{"type":23,"value":242641},"Unified form ingestion inside your product:",{"type":17,"tag":6154,"props":242643,"children":242644},{},[242645,242650,242660,242671],{"type":17,"tag":84,"props":242646,"children":242647},{},[242648],{"type":23,"value":242649},"Customer connects Typeform, Google Forms, or Tally",{"type":17,"tag":84,"props":242651,"children":242652},{},[242653,242654,242658],{"type":23,"value":242020},{"type":17,"tag":48,"props":242655,"children":242656},{},[242657],{"type":23,"value":39321},{"type":23,"value":242659}," and pull field definitions",{"type":17,"tag":84,"props":242661,"children":242662},{},[242663,242665,242669],{"type":23,"value":242664},"You retrieve ",{"type":17,"tag":48,"props":242666,"children":242667},{},[242668],{"type":23,"value":189219},{"type":23,"value":242670}," as they arrive, normalized across platforms",{"type":17,"tag":84,"props":242672,"children":242673},{},[242674],{"type":23,"value":242675},"You store, analyze, or trigger actions using a consistent schema",{"type":17,"tag":68,"props":242677,"children":242679},{"id":242678},"real-time-access-to-form-and-submission-data",[242680],{"type":17,"tag":48,"props":242681,"children":242682},{},[242683],{"type":23,"value":242684},"Real-time access to form and submission data",{"type":17,"tag":29,"props":242686,"children":242687},{},[242688],{"type":23,"value":242689},"The Forms API provides real-time access to form definitions and submission data. Requests are stateless and routed directly to the source platform, with no caching or stored copies of customer data. No polling or background sync jobs are required.\nWrite support varies by provider and object.",{"type":17,"tag":29,"props":242691,"children":242692},{},[242693],{"type":23,"value":242694},"This architecture is ideal for:",{"type":17,"tag":80,"props":242696,"children":242697},{},[242698,242703,242708,242713],{"type":17,"tag":84,"props":242699,"children":242700},{},[242701],{"type":23,"value":242702},"Lead capture systems needing immediate access to new submissions",{"type":17,"tag":84,"props":242704,"children":242705},{},[242706],{"type":23,"value":242707},"Automation triggered as soon as a form is submitted",{"type":17,"tag":84,"props":242709,"children":242710},{},[242711],{"type":23,"value":242712},"Dashboards displaying up-to-date response data",{"type":17,"tag":84,"props":242714,"children":242715},{},[242716],{"type":23,"value":242717},"AI workflows that depend on fresh inputs",{"type":17,"tag":29,"props":242719,"children":242720},{},[242721],{"type":23,"value":242722},"Traffic is regionalized (US/EU/AU) to support data residency requirements.",{"type":17,"tag":29,"props":242724,"children":242725},{},[242726],{"type":17,"tag":133,"props":242727,"children":242729},{"href":86962,"rel":242728},[214],[242730],{"type":23,"value":242137},{"type":17,"tag":68,"props":242732,"children":242734},{"id":242733},"data-models",[242735],{"type":23,"value":242736},"Data models",{"type":17,"tag":239,"props":242738,"children":242739},{"id":62686},[242740],{"type":23,"value":40001},{"type":17,"tag":29,"props":242742,"children":242743},{},[242744],{"type":23,"value":242745},"Includes metadata such as:",{"type":17,"tag":80,"props":242747,"children":242748},{},[242749,242753,242758,242763],{"type":17,"tag":84,"props":242750,"children":242751},{},[242752],{"type":23,"value":167382},{"type":17,"tag":84,"props":242754,"children":242755},{},[242756],{"type":23,"value":242757},"fields and configuration",{"type":17,"tag":84,"props":242759,"children":242760},{},[242761],{"type":23,"value":242762},"active status and published URL",{"type":17,"tag":84,"props":242764,"children":242765},{},[242766],{"type":23,"value":242767},"response count and submission behavior",{"type":17,"tag":239,"props":242769,"children":242770},{"id":200604},[242771],{"type":23,"value":40044},{"type":17,"tag":29,"props":242773,"children":242774},{},[242775],{"type":23,"value":100844},{"type":17,"tag":80,"props":242777,"children":242778},{},[242779,242784,242789,242794],{"type":17,"tag":84,"props":242780,"children":242781},{},[242782],{"type":23,"value":242783},"form relationship",{"type":17,"tag":84,"props":242785,"children":242786},{},[242787],{"type":23,"value":242788},"respondent identifiers (where available)",{"type":17,"tag":84,"props":242790,"children":242791},{},[242792],{"type":23,"value":242793},"structured answers",{"type":17,"tag":84,"props":242795,"children":242796},{},[242797],{"type":23,"value":242798},"submission timestamps",{"type":17,"tag":29,"props":242800,"children":242801},{},[242802,242804,242811],{"type":23,"value":242803},"Coverage varies by platform. Refer to the ",{"type":17,"tag":133,"props":242805,"children":242808},{"href":242806,"rel":242807},"https://docs.unified.to/forms/integrations",[214],[242809],{"type":23,"value":242810},"Supported Integrations page",{"type":23,"value":242812}," for field-level detail.",{"type":17,"tag":29,"props":242814,"children":242815},{},[242816,242818,242826,242827,242835],{"type":23,"value":242817},"The Forms API is available on all Unified plans.  ",{"type":17,"tag":133,"props":242819,"children":242821},{"href":1612,"rel":242820},[214],[242822],{"type":17,"tag":48,"props":242823,"children":242824},{},[242825],{"type":23,"value":242151},{"type":23,"value":75890},{"type":17,"tag":133,"props":242828,"children":242830},{"href":1623,"rel":242829},[214],[242831],{"type":17,"tag":48,"props":242832,"children":242833},{},[242834],{"type":23,"value":226481},{"type":23,"value":242836}," to validate platform coverage for your use case.",{"type":17,"tag":239,"props":242838,"children":242839},{"id":39294},[242840],{"type":23,"value":39297},{"type":17,"tag":29,"props":242842,"children":242843},{},[242844],{"type":23,"value":242845},"A forms API allows developers to access form definitions and submission data from form platforms like Typeform, Google Forms, and Tally through a single interface. It standardizes how forms and responses are retrieved, enabling consistent data ingestion across multiple providers.",{"title":7,"searchDepth":1629,"depth":1629,"links":242847},[242848,242849,242850,242851,242852,242853,242854,242855,242856,242857,242858],{"id":25342,"depth":1629,"text":216065},{"id":242312,"depth":1629,"text":242315},{"id":242393,"depth":1629,"text":242396},{"id":242432,"depth":1629,"text":242435},{"id":242461,"depth":1629,"text":242464},{"id":242495,"depth":1629,"text":242498},{"id":182585,"depth":1629,"text":182588},{"id":242575,"depth":1629,"text":242578},{"id":242630,"depth":1629,"text":242636},{"id":242678,"depth":1629,"text":242684},{"id":242733,"depth":1629,"text":242736,"children":242859},[242860,242861,242862],{"id":62686,"depth":1635,"text":40001},{"id":200604,"depth":1635,"text":40044},{"id":39294,"depth":1635,"text":39297},"content:blog:unified_forms_api_sync_form_submissions_across_typeform_google_forms_and_more.md","blog/unified_forms_api_sync_form_submissions_across_typeform_google_forms_and_more.md","blog/unified_forms_api_sync_form_submissions_across_typeform_google_forms_and_more",{"_path":242867,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":242868,"description":242869,"img":242870,"date":242871,"tag":12,"body":242872,"_type":1677,"_id":243687,"_source":1679,"_file":243688,"_stem":243689,"_extension":1682},"/blog/how_to_analyze_spend_with_unified_accounting_api","How to Analyze Spend with Unified's Accounting API","For most product teams, 'spend analysis' sounds straightforward. Pull bills. Pull expenses. Group them by vendor and category. Show totals in a dashboard.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_analyze_spend_with_unified_accounting_api-icon.png","2025-12-30T19:36:00.000Z",{"type":14,"children":242873,"toc":243663},[242874,242879,242882,242890,242894,242899,242904,242909,242927,242932,242942,242947,242951,242985,242989,242998,243008,243016,243020,243028,243032,243036,243047,243052,243144,243156,243161,243227,243238,243243,243276,243288,243293,243320,243326,243338,243370,243375,243381,243388,243397,243403,243412,243423,243428,243470,243479,243488,243511,243520,243524,243533,243539,243544,243645,243654],{"type":17,"tag":18,"props":242875,"children":242877},{"id":242876},"how-to-analyze-spend-with-unifieds-accounting-api",[242878],{"type":23,"value":242868},{"type":17,"tag":25,"props":242880,"children":242881},{},[],{"type":17,"tag":29,"props":242883,"children":242884},{},[242885],{"type":17,"tag":33,"props":242886,"children":242887},{},[242888],{"type":23,"value":242889},"December 30, 2025",{"type":17,"tag":29,"props":242891,"children":242892},{},[242893],{"type":23,"value":242869},{"type":17,"tag":29,"props":242895,"children":242896},{},[242897],{"type":23,"value":242898},"In practice, this breaks down quickly once you support more than one accounting system.",{"type":17,"tag":29,"props":242900,"children":242901},{},[242902],{"type":23,"value":242903},"QuickBooks, Xero, NetSuite, Sage, and similar platforms all model spend differently. Some treat vendor bills and employee expenses as separate objects. Others blur the line. Categories live on headers in one system, line items in another. Vendor identity may be a contact, a supplier, or an implicit relationship on a transaction.",{"type":17,"tag":29,"props":242905,"children":242906},{},[242907],{"type":23,"value":242908},"For a PM, the problem isn't how to write the aggregation logic. It's deciding what your product can reliably promise:",{"type":17,"tag":80,"props":242910,"children":242911},{},[242912,242917,242922],{"type":17,"tag":84,"props":242913,"children":242914},{},[242915],{"type":23,"value":242916},"Can users expect consistent spend totals across accounting providers?",{"type":17,"tag":84,"props":242918,"children":242919},{},[242920],{"type":23,"value":242921},"Can you support vendor-level reporting without custom logic per integration?",{"type":17,"tag":84,"props":242923,"children":242924},{},[242925],{"type":23,"value":242926},"Can you roll this feature out broadly, or only for a short list of 'supported' systems?",{"type":17,"tag":29,"props":242928,"children":242929},{},[242930],{"type":23,"value":242931},"This is why many spend features quietly turn into one-off integrations, fragile mappings, or 'best-effort' reporting disclaimers.",{"type":17,"tag":29,"props":242933,"children":242934},{},[242935,242936,242940],{"type":23,"value":25244},{"type":17,"tag":133,"props":242937,"children":242938},{"href":82425},[242939],{"type":23,"value":128616},{"type":23,"value":242941}," exists to remove that decision from your roadmap. Instead of building spend logic vendor-by-vendor, you work against normalized bill, expense, contact, and category objects—so your product logic stays the same even as customers connect different accounting tools.",{"type":17,"tag":29,"props":242943,"children":242944},{},[242945],{"type":23,"value":242946},"The rest of this guide shows how that looks in practice: fetching bills and expenses through one SDK, then grouping spend by vendor and category using Unified's documented fields. No per-vendor branching. No accounting-system-specific assumptions.",{"type":17,"tag":239,"props":242948,"children":242949},{"id":141798},[242950],{"type":23,"value":141801},{"type":17,"tag":80,"props":242952,"children":242953},{},[242954,242958,242967,242976],{"type":17,"tag":84,"props":242955,"children":242956},{},[242957],{"type":23,"value":199683},{"type":17,"tag":84,"props":242959,"children":242960},{},[242961,242962,242966],{"type":23,"value":234004},{"type":17,"tag":48,"props":242963,"children":242964},{},[242965],{"type":23,"value":104365},{"type":23,"value":234010},{"type":17,"tag":84,"props":242968,"children":242969},{},[242970,242971,242975],{"type":23,"value":199693},{"type":17,"tag":133,"props":242972,"children":242973},{"href":7691},[242974],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":242977,"children":242978},{},[242979,242980],{"type":23,"value":231444},{"type":17,"tag":6121,"props":242981,"children":242983},{"className":242982},[],[242984],{"type":23,"value":19766},{"type":17,"tag":68,"props":242986,"children":242987},{"id":211198},[242988],{"type":23,"value":211201},{"type":17,"tag":6893,"props":242990,"children":242993},{"className":242991,"code":242992,"language":48432,"meta":7},[48430],"mkdir spend-analysis-demo\ncd spend-analysis-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[242994],{"type":17,"tag":6121,"props":242995,"children":242996},{"__ignoreMap":7},[242997],{"type":23,"value":242992},{"type":17,"tag":29,"props":242999,"children":243000},{},[243001,243002,243007],{"type":23,"value":211215},{"type":17,"tag":6121,"props":243003,"children":243005},{"className":243004},[],[243006],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":243009,"children":243011},{"className":243010,"code":231476,"language":20901,"meta":23},[20899],[243012],{"type":17,"tag":6121,"props":243013,"children":243014},{"__ignoreMap":7},[243015],{"type":23,"value":231476},{"type":17,"tag":68,"props":243017,"children":243018},{"id":211235},[243019],{"type":23,"value":211238},{"type":17,"tag":6893,"props":243021,"children":243023},{"className":243022,"code":231489,"language":18718,"meta":7},[18716],[243024],{"type":17,"tag":6121,"props":243025,"children":243026},{"__ignoreMap":7},[243027],{"type":23,"value":231489},{"type":17,"tag":68,"props":243029,"children":243030},{"id":238790},[243031],{"type":23,"value":238793},{"type":17,"tag":29,"props":243033,"children":243034},{},[243035],{"type":23,"value":237178},{"type":17,"tag":239,"props":243037,"children":243039},{"id":243038},"bills-accountingbill",[243040,243041,243046],{"type":23,"value":222223},{"type":17,"tag":6121,"props":243042,"children":243044},{"className":243043},[],[243045],{"type":23,"value":222111},{"type":23,"value":12034},{"type":17,"tag":29,"props":243048,"children":243049},{},[243050],{"type":23,"value":243051},"Bills represent vendor invoices (committed spend / AP). Useful fields include:",{"type":17,"tag":80,"props":243053,"children":243054},{},[243055,243069,243078,243098,243106,243126,243134],{"type":17,"tag":84,"props":243056,"children":243057},{},[243058,243063,243064],{"type":17,"tag":6121,"props":243059,"children":243061},{"className":243060},[],[243062],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243065,"children":243067},{"className":243066},[],[243068],{"type":23,"value":222298},{"type":17,"tag":84,"props":243070,"children":243071},{},[243072,243077],{"type":17,"tag":6121,"props":243073,"children":243075},{"className":243074},[],[243076],{"type":23,"value":26302},{"type":23,"value":222289},{"type":17,"tag":84,"props":243079,"children":243080},{},[243081,243086,243087,243092,243093],{"type":17,"tag":6121,"props":243082,"children":243084},{"className":243083},[],[243085],{"type":23,"value":219481},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243088,"children":243090},{"className":243089},[],[243091],{"type":23,"value":220819},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243094,"children":243096},{"className":243095},[],[243097],{"type":23,"value":220828},{"type":17,"tag":84,"props":243099,"children":243100},{},[243101],{"type":17,"tag":6121,"props":243102,"children":243104},{"className":243103},[],[243105],{"type":23,"value":22296},{"type":17,"tag":84,"props":243107,"children":243108},{},[243109,243114,243115,243120,243121],{"type":17,"tag":6121,"props":243110,"children":243112},{"className":243111},[],[243113],{"type":23,"value":187836},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243116,"children":243118},{"className":243117},[],[243119],{"type":23,"value":124766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243122,"children":243124},{"className":243123},[],[243125],{"type":23,"value":187822},{"type":17,"tag":84,"props":243127,"children":243128},{},[243129],{"type":17,"tag":6121,"props":243130,"children":243132},{"className":243131},[],[243133],{"type":23,"value":19949},{"type":17,"tag":84,"props":243135,"children":243136},{},[243137,243142],{"type":17,"tag":6121,"props":243138,"children":243140},{"className":243139},[],[243141],{"type":23,"value":219548},{"type":23,"value":243143}," (where categorization typically lives)",{"type":17,"tag":239,"props":243145,"children":243147},{"id":243146},"expenses-accountingexpense",[243148,243150,243155],{"type":23,"value":243149},"Expenses (",{"type":17,"tag":6121,"props":243151,"children":243153},{"className":243152},[],[243154],{"type":23,"value":223458},{"type":23,"value":12034},{"type":17,"tag":29,"props":243157,"children":243158},{},[243159],{"type":23,"value":243160},"Expenses represent employee spend / reimbursements (actual spend).",{"type":17,"tag":80,"props":243162,"children":243163},{},[243164,243172,243182,243190,243198,243219],{"type":17,"tag":84,"props":243165,"children":243166},{},[243167],{"type":17,"tag":6121,"props":243168,"children":243170},{"className":243169},[],[243171],{"type":23,"value":18766},{"type":17,"tag":84,"props":243173,"children":243174},{},[243175,243180],{"type":17,"tag":6121,"props":243176,"children":243178},{"className":243177},[],[243179],{"type":23,"value":62582},{"type":23,"value":243181}," (employee)",{"type":17,"tag":84,"props":243183,"children":243184},{},[243185],{"type":17,"tag":6121,"props":243186,"children":243188},{"className":243187},[],[243189],{"type":23,"value":219481},{"type":17,"tag":84,"props":243191,"children":243192},{},[243193],{"type":17,"tag":6121,"props":243194,"children":243196},{"className":243195},[],[243197],{"type":23,"value":22296},{"type":17,"tag":84,"props":243199,"children":243200},{},[243201,243206,243207,243212,243213],{"type":17,"tag":6121,"props":243202,"children":243204},{"className":243203},[],[243205],{"type":23,"value":188025},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243208,"children":243210},{"className":243209},[],[243211],{"type":23,"value":188032},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243214,"children":243216},{"className":243215},[],[243217],{"type":23,"value":243218},"reimbursed_amount",{"type":17,"tag":84,"props":243220,"children":243221},{},[243222],{"type":17,"tag":6121,"props":243223,"children":243225},{"className":243224},[],[243226],{"type":23,"value":219548},{"type":17,"tag":239,"props":243228,"children":243230},{"id":243229},"contacts-accountingcontact",[243231,243232,243237],{"type":23,"value":211264},{"type":17,"tag":6121,"props":243233,"children":243235},{"className":243234},[],[243236],{"type":23,"value":224013},{"type":23,"value":12034},{"type":17,"tag":29,"props":243239,"children":243240},{},[243241],{"type":23,"value":243242},"Contacts represent vendors/customers. For vendor grouping you typically use:",{"type":17,"tag":80,"props":243244,"children":243245},{},[243246,243254,243268],{"type":17,"tag":84,"props":243247,"children":243248},{},[243249],{"type":17,"tag":6121,"props":243250,"children":243252},{"className":243251},[],[243253],{"type":23,"value":18766},{"type":17,"tag":84,"props":243255,"children":243256},{},[243257,243262,243263],{"type":17,"tag":6121,"props":243258,"children":243260},{"className":243259},[],[243261],{"type":23,"value":18781},{"type":23,"value":26030},{"type":17,"tag":6121,"props":243264,"children":243266},{"className":243265},[],[243267],{"type":23,"value":62786},{"type":17,"tag":84,"props":243269,"children":243270},{},[243271],{"type":17,"tag":6121,"props":243272,"children":243274},{"className":243273},[],[243275],{"type":23,"value":221006},{"type":17,"tag":239,"props":243277,"children":243279},{"id":243278},"categories-accountingcategory",[243280,243282,243287],{"type":23,"value":243281},"Categories (",{"type":17,"tag":6121,"props":243283,"children":243285},{"className":243284},[],[243286],{"type":23,"value":223512},{"type":23,"value":12034},{"type":17,"tag":29,"props":243289,"children":243290},{},[243291],{"type":23,"value":243292},"Categories are the normalized classification layer:",{"type":17,"tag":80,"props":243294,"children":243295},{},[243296,243304,243312],{"type":17,"tag":84,"props":243297,"children":243298},{},[243299],{"type":17,"tag":6121,"props":243300,"children":243302},{"className":243301},[],[243303],{"type":23,"value":18766},{"type":17,"tag":84,"props":243305,"children":243306},{},[243307],{"type":17,"tag":6121,"props":243308,"children":243310},{"className":243309},[],[243311],{"type":23,"value":18781},{"type":17,"tag":84,"props":243313,"children":243314},{},[243315],{"type":17,"tag":6121,"props":243316,"children":243318},{"className":243317},[],[243319],{"type":23,"value":15863},{"type":17,"tag":239,"props":243321,"children":243323},{"id":243322},"line-item-attribution-important",[243324],{"type":23,"value":243325},"Line item attribution (important)",{"type":17,"tag":29,"props":243327,"children":243328},{},[243329,243331,243336],{"type":23,"value":243330},"Both bills and expenses include ",{"type":17,"tag":6121,"props":243332,"children":243334},{"className":243333},[],[243335],{"type":23,"value":219548},{"type":23,"value":243337},", and each line item can include:",{"type":17,"tag":80,"props":243339,"children":243340},{},[243341,243351,243362],{"type":17,"tag":84,"props":243342,"children":243343},{},[243344,243349],{"type":17,"tag":6121,"props":243345,"children":243347},{"className":243346},[],[243348],{"type":23,"value":184840},{"type":23,"value":243350}," (chart-of-accounts account)",{"type":17,"tag":84,"props":243352,"children":243353},{},[243354,243360],{"type":17,"tag":6121,"props":243355,"children":243357},{"className":243356},[],[243358],{"type":23,"value":243359},"category_ids",{"type":23,"value":243361}," (one or more category IDs)",{"type":17,"tag":84,"props":243363,"children":243364},{},[243365],{"type":17,"tag":6121,"props":243366,"children":243368},{"className":243367},[],[243369],{"type":23,"value":219481},{"type":17,"tag":29,"props":243371,"children":243372},{},[243373],{"type":23,"value":243374},"For category grouping, prefer line item fields over header totals.",{"type":17,"tag":68,"props":243376,"children":243378},{"id":243377},"step-4-fetch-all-bills-with-pagination",[243379],{"type":23,"value":243380},"Step 4: Fetch all bills (with pagination)",{"type":17,"tag":29,"props":243382,"children":243383},{},[243384],{"type":17,"tag":33,"props":243385,"children":243386},{},[243387],{"type":23,"value":237479},{"type":17,"tag":6893,"props":243389,"children":243392},{"className":243390,"code":243391,"language":18718,"meta":7},[18716],"import type { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nexport type AccountingBill = {\n  id?: string;\n  contact_id?: string;\n  currency?: string;\n  total_amount?: number;\n  lineitems?: {\n    total_amount?: number;\n    account_id?: string;\n    category_ids?: any;\n  }[];\n};\n\nexport async function fetchAllBills(\n  sdk: UnifiedTo,\n  connectionId: string,\n  opts?: {\n    pageSize?: number;\n    updated_gte?: string;\n    sort?: \"name\" | \"updated_at\" | \"created_at\";\n    order?: \"asc\" | \"desc\";\n    query?: string;\n    contact_id?: string;\n    fields?: string;\n    raw?: string;\n  }\n): Promise\u003CAccountingBill[]> {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: AccountingBill[] = [];\n\n  while (true) {\n    const page = await sdk.accounting.listAccountingBills({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte,\n      sort: opts?.sort,\n      order: opts?.order,\n      query: opts?.query,\n      contact_id: opts?.contact_id,\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[243393],{"type":17,"tag":6121,"props":243394,"children":243395},{"__ignoreMap":7},[243396],{"type":23,"value":243391},{"type":17,"tag":68,"props":243398,"children":243400},{"id":243399},"step-5-fetch-all-expenses-with-pagination",[243401],{"type":23,"value":243402},"Step 5: Fetch all expenses (with pagination)",{"type":17,"tag":6893,"props":243404,"children":243407},{"className":243405,"code":243406,"language":18718,"meta":7},[18716],"import type { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nexport type AccountingExpense = {\n  id?: string;\n  user_id?: string;\n  currency?: string;\n  total_amount?: number;\n  lineitems?: {\n    total_amount?: number;\n    account_id?: string;\n    category_ids?: any;\n  }[];\n};\n\nexport async function fetchAllExpenses(\n  sdk: UnifiedTo,\n  connectionId: string,\n  opts?: {\n    pageSize?: number;\n    updated_gte?: string;\n    sort?: \"name\" | \"updated_at\" | \"created_at\";\n    order?: \"asc\" | \"desc\";\n    query?: string;\n    user_id?: string;\n    fields?: string;\n    raw?: string;\n  }\n): Promise\u003CAccountingExpense[]> {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: AccountingExpense[] = [];\n\n  while (true) {\n    const page = await sdk.accounting.listAccountingExpenses({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte,\n      sort: opts?.sort,\n      order: opts?.order,\n      query: opts?.query,\n      user_id: opts?.user_id,\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += pageSize;\n  }\n\n  return out;\n}\n",[243408],{"type":17,"tag":6121,"props":243409,"children":243410},{"__ignoreMap":7},[243411],{"type":23,"value":243406},{"type":17,"tag":239,"props":243413,"children":243415},{"id":243414},"step-6-aggregate-spend-by-vendor-and-category-using-line-items",[243416,243418],{"type":23,"value":243417},"Step 6: ",{"type":17,"tag":48,"props":243419,"children":243420},{},[243421],{"type":23,"value":243422},"Aggregate spend by vendor and category (using line items)",{"type":17,"tag":29,"props":243424,"children":243425},{},[243426],{"type":23,"value":243427},"This step uses only Unified's normalized fields:",{"type":17,"tag":80,"props":243429,"children":243430},{},[243431,243442,243454],{"type":17,"tag":84,"props":243432,"children":243433},{},[243434,243436,243441],{"type":23,"value":243435},"Bills: ",{"type":17,"tag":6121,"props":243437,"children":243439},{"className":243438},[],[243440],{"type":23,"value":26302},{"type":23,"value":222289},{"type":17,"tag":84,"props":243443,"children":243444},{},[243445,243447,243452],{"type":23,"value":243446},"Expenses: ",{"type":17,"tag":6121,"props":243448,"children":243450},{"className":243449},[],[243451],{"type":23,"value":62582},{"type":23,"value":243453}," (employee bucket)",{"type":17,"tag":84,"props":243455,"children":243456},{},[243457,243459,243464,243465],{"type":23,"value":243458},"Line items: ",{"type":17,"tag":6121,"props":243460,"children":243462},{"className":243461},[],[243463],{"type":23,"value":184840},{"type":23,"value":34435},{"type":17,"tag":6121,"props":243466,"children":243468},{"className":243467},[],[243469],{"type":23,"value":243359},{"type":17,"tag":6893,"props":243471,"children":243474},{"className":243472,"code":243473,"language":18718,"meta":7},[18716],"import type { AccountingBill } from \"./bills\";\nimport type { AccountingExpense } from \"./expenses\";\n\ntype SpendTotals = Record\u003Cstring, Record\u003Cstring, Record\u003Cstring, number>>>;\n// vendor_key -> bucket_key -> currency -> total_amount\n\nfunction addAmount(\n  acc: SpendTotals,\n  vendorKey: string,\n  bucketKey: string,\n  currency: string,\n  amount: number\n) {\n  if (!acc[vendorKey]) acc[vendorKey] = {};\n  if (!acc[vendorKey][bucketKey]) acc[vendorKey][bucketKey] = {};\n  acc[vendorKey][bucketKey][currency] = (acc[vendorKey][bucketKey][currency] ?? 0) + amount;\n}\n\nfunction normalizeCategoryIds(category_ids: any): string[] {\n  if (!category_ids) return [];\n  if (Array.isArray(category_ids)) return category_ids.map(String).filter(Boolean);\n  return [String(category_ids)].filter(Boolean);\n}\n\nexport function groupSpendByVendorAndCategory(input: {\n  bills: AccountingBill[];\n  expenses: AccountingExpense[];\n}): SpendTotals {\n  const totals: SpendTotals = {};\n\n  // Bills (vendor spend)\n  for (const b of input.bills) {\n    const vendorKey = b.contact_id ?? \"vendor:unknown\";\n    const currency = b.currency ?? \"UNKNOWN\";\n    const lineitems = b.lineitems ?? [];\n\n    if (lineitems.length > 0) {\n      for (const li of lineitems) {\n        const amt = Number(li.total_amount ?? 0);\n\n        if (li.account_id) {\n          addAmount(totals, vendorKey, `account:${li.account_id}`, currency, amt);\n          continue;\n        }\n\n        const cats = normalizeCategoryIds(li.category_ids);\n        if (cats.length > 0) {\n          for (const c of cats) addAmount(totals, vendorKey, `category:${c}`, currency, amt);\n          continue;\n        }\n\n        addAmount(totals, vendorKey, \"unattributed\", currency, amt);\n      }\n    } else {\n      addAmount(totals, vendorKey, \"unattributed\", currency, Number(b.total_amount ?? 0));\n    }\n  }\n\n  // Expenses (employee spend)\n  for (const e of input.expenses) {\n    const vendorKey = e.user_id ? `employee:${e.user_id}` : \"employee:unknown\";\n    const currency = e.currency ?? \"UNKNOWN\";\n    const lineitems = e.lineitems ?? [];\n\n    if (lineitems.length > 0) {\n      for (const li of lineitems) {\n        const amt = Number(li.total_amount ?? 0);\n\n        if (li.account_id) {\n          addAmount(totals, vendorKey, `account:${li.account_id}`, currency, amt);\n          continue;\n        }\n\n        const cats = normalizeCategoryIds(li.category_ids);\n        if (cats.length > 0) {\n          for (const c of cats) addAmount(totals, vendorKey, `category:${c}`, currency, amt);\n          continue;\n        }\n\n        addAmount(totals, vendorKey, \"unattributed\", currency, amt);\n      }\n    } else {\n      addAmount(totals, vendorKey, \"unattributed\", currency, Number(e.total_amount ?? 0));\n    }\n  }\n\n  return totals;\n}\n",[243475],{"type":17,"tag":6121,"props":243476,"children":243477},{"__ignoreMap":7},[243478],{"type":23,"value":243473},{"type":17,"tag":68,"props":243480,"children":243482},{"id":243481},"step-7-optional-fetch-vendors-to-display-names",[243483],{"type":17,"tag":48,"props":243484,"children":243485},{},[243486],{"type":23,"value":243487},"Step 7 (optional): Fetch vendors to display names",{"type":17,"tag":29,"props":243489,"children":243490},{},[243491,243493,243498,243499,243504,243505,243510],{"type":23,"value":243492},"Uses your Contact schema (",{"type":17,"tag":6121,"props":243494,"children":243496},{"className":243495},[],[243497],{"type":23,"value":221006},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243500,"children":243502},{"className":243501},[],[243503],{"type":23,"value":62786},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243506,"children":243508},{"className":243507},[],[243509],{"type":23,"value":18781},{"type":23,"value":129328},{"type":17,"tag":6893,"props":243512,"children":243515},{"className":243513,"code":243514,"language":18718,"meta":7},[18716],"import type { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nexport type AccountingContact = {\n  id?: string;\n  name?: string;\n  company_name?: string;\n  is_supplier?: boolean;\n};\n\nexport async function fetchAllVendors(\n  sdk: UnifiedTo,\n  connectionId: string,\n  opts?: {\n    pageSize?: number;\n    updated_gte?: string;\n    sort?: \"name\" | \"updated_at\" | \"created_at\";\n    order?: \"asc\" | \"desc\";\n    query?: string;\n    type?: string;\n    fields?: string;\n    raw?: string;\n  }\n): Promise\u003CAccountingContact[]> {\n  const pageSize = opts?.pageSize ?? 100;\n  let offset = 0;\n  const out: AccountingContact[] = [];\n\n  while (true) {\n    const page = await sdk.accounting.listAccountingContacts({\n      connectionId,\n      limit: pageSize,\n      offset,\n      updated_gte: opts?.updated_gte,\n      sort: opts?.sort,\n      order: opts?.order,\n      query: opts?.query,\n      type: opts?.type ?? \"\",\n      fields: opts?.fields ?? \"\",\n      raw: opts?.raw ?? \"\",\n    });\n\n    if (!page || page.length === 0) break;\n\n    out.push(...page);\n    offset += pageSize;\n  }\n\n  return out.filter((c) => c.is_supplier);\n}\n",[243516],{"type":17,"tag":6121,"props":243517,"children":243518},{"__ignoreMap":7},[243519],{"type":23,"value":243514},{"type":17,"tag":68,"props":243521,"children":243522},{"id":239289},[243523],{"type":23,"value":239292},{"type":17,"tag":6893,"props":243525,"children":243528},{"className":243526,"code":243527,"language":18718,"meta":7},[18716],"import \"dotenv/config\";\nimport { UnifiedTo } from \"@unified-api/typescript-sdk\";\n\nimport { fetchAllBills } from \"./bills\";\nimport { fetchAllExpenses } from \"./expenses\";\nimport { groupSpendByVendorAndCategory } from \"./aggregate\";\nimport { fetchAllVendors } from \"./vendors\";\n\nconst { UNIFIED_API_KEY, CONNECTION_ACCOUNTING } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n\nfunction buildVendorIndex(vendors: { id?: string; company_name?: string; name?: string }[]) {\n  return Object.fromEntries(\n    vendors\n      .filter((v) => v.id)\n      .map((v) => [v.id!, v.company_name ?? v.name ?? v.id!])\n  );\n}\n\n/**\n * Pretty-print helper: replaces vendor IDs with names when possible.\n * Keeps the underlying totals structure intact.\n */\nfunction printSpendTotals(\n  totals: Record\u003Cstring, Record\u003Cstring, Record\u003Cstring, number>>>,\n  vendorIndex?: Record\u003Cstring, string>\n) {\n  const output: Record\u003Cstring, any> = {};\n\n  for (const [vendorKey, buckets] of Object.entries(totals)) {\n    const displayVendor =\n      vendorIndex && vendorKey in vendorIndex ? vendorIndex[vendorKey] : vendorKey;\n\n    output[displayVendor] = {};\n\n    for (const [bucketKey, byCurrency] of Object.entries(buckets)) {\n      // Round for readability; remove rounding if you want exact floats\n      output[displayVendor][bucketKey] = Object.fromEntries(\n        Object.entries(byCurrency).map(([currency, amount]) => [\n          currency,\n          Math.round(amount * 100) / 100,\n        ])\n      );\n    }\n  }\n\n  console.log(JSON.stringify(output, null, 2));\n}\n\nasync function main() {\n  const connectionId = CONNECTION_ACCOUNTING!;\n  if (!connectionId) throw new Error(\"Missing CONNECTION_ACCOUNTING\");\n\n  // Fetch core spend objects\n  const [bills, expenses] = await Promise.all([\n    fetchAllBills(sdk, connectionId, { pageSize: 100 }),\n    fetchAllExpenses(sdk, connectionId, { pageSize: 100 }),\n  ]);\n\n  // Aggregate (currency-safe)\n  const totals = groupSpendByVendorAndCategory({ bills, expenses });\n\n  console.log(\"Spend totals (IDs):\");\n  printSpendTotals(totals);\n\n  // Optional: fetch vendors (contacts) and resolve IDs to names\n  const vendors = await fetchAllVendors(sdk, connectionId, { pageSize: 100 });\n  const vendorIndex = buildVendorIndex(vendors);\n\n  console.log(\"Spend totals (vendor names where available):\");\n  printSpendTotals(totals, vendorIndex);\n}\n\nmain().catch(console.error);\n",[243529],{"type":17,"tag":6121,"props":243530,"children":243531},{"__ignoreMap":7},[243532],{"type":23,"value":243527},{"type":17,"tag":68,"props":243534,"children":243536},{"id":243535},"tldr",[243537],{"type":23,"value":243538},"TLDR;",{"type":17,"tag":29,"props":243540,"children":243541},{},[243542],{"type":23,"value":243543},"You now have a minimal, SDK-first spend analysis flow that:",{"type":17,"tag":80,"props":243545,"children":243546},{},[243547,243556,243597,243617,243635],{"type":17,"tag":84,"props":243548,"children":243549},{},[243550,243552],{"type":23,"value":243551},"Lists all bills and expenses with explicit ",{"type":17,"tag":133,"props":243553,"children":243554},{"href":1857},[243555],{"type":23,"value":1860},{"type":17,"tag":84,"props":243557,"children":243558},{},[243559,243561,243566,243567,243572,243573,243578,243579,243584,243585,243590,243591,243596],{"type":23,"value":243560},"Uses Unified's documented list params (",{"type":17,"tag":6121,"props":243562,"children":243564},{"className":243563},[],[243565],{"type":23,"value":48389},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243568,"children":243570},{"className":243569},[],[243571],{"type":23,"value":48411},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243574,"children":243576},{"className":243575},[],[243577],{"type":23,"value":26291},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243580,"children":243582},{"className":243581},[],[243583],{"type":23,"value":225399},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243586,"children":243588},{"className":243587},[],[243589],{"type":23,"value":75822},{"type":23,"value":11826},{"type":17,"tag":6121,"props":243592,"children":243594},{"className":243593},[],[243595],{"type":23,"value":48368},{"type":23,"value":149980},{"type":17,"tag":84,"props":243598,"children":243599},{},[243600,243602,243607,243609,243615],{"type":23,"value":243601},"Aggregates totals by vendor (",{"type":17,"tag":6121,"props":243603,"children":243605},{"className":243604},[],[243606],{"type":23,"value":26302},{"type":23,"value":243608}," for bills, ",{"type":17,"tag":6121,"props":243610,"children":243612},{"className":243611},[],[243613],{"type":23,"value":243614},"employee:\u003Cuser_id>",{"type":23,"value":243616}," buckets for expenses)",{"type":17,"tag":84,"props":243618,"children":243619},{},[243620,243622,243626,243628,243633],{"type":23,"value":243621},"Groups spend by ",{"type":17,"tag":48,"props":243623,"children":243624},{},[243625],{"type":23,"value":89108},{"type":23,"value":243627}," (preferred) and ",{"type":17,"tag":48,"props":243629,"children":243630},{},[243631],{"type":23,"value":243632},"category",{"type":23,"value":243634}," (fallback) using normalized line item fields",{"type":17,"tag":84,"props":243636,"children":243637},{},[243638,243640],{"type":23,"value":243639},"Optionally resolves vendor IDs to names by listing contacts filtered to ",{"type":17,"tag":6121,"props":243641,"children":243643},{"className":243642},[],[243644],{"type":23,"value":221006},{"type":17,"tag":29,"props":243646,"children":243647},{},[243648,243649],{"type":23,"value":1609},{"type":17,"tag":133,"props":243650,"children":243652},{"href":1612,"rel":243651},[214],[243653],{"type":23,"value":1616},{"type":17,"tag":29,"props":243655,"children":243656},{},[243657,243658],{"type":23,"value":1609},{"type":17,"tag":133,"props":243659,"children":243661},{"href":1623,"rel":243660},[214],[243662],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":243664},[243665,243666,243667,243668,243679,243680,243684,243685,243686],{"id":141798,"depth":1635,"text":141801},{"id":211198,"depth":1629,"text":211201},{"id":211235,"depth":1629,"text":211238},{"id":238790,"depth":1629,"text":238793,"children":243669},[243670,243672,243674,243676,243678],{"id":243038,"depth":1635,"text":243671},"Bills (AccountingBill)",{"id":243146,"depth":1635,"text":243673},"Expenses (AccountingExpense)",{"id":243229,"depth":1635,"text":243675},"Contacts (AccountingContact)",{"id":243278,"depth":1635,"text":243677},"Categories (AccountingCategory)",{"id":243322,"depth":1635,"text":243325},{"id":243377,"depth":1629,"text":243380},{"id":243399,"depth":1629,"text":243402,"children":243681},[243682],{"id":243414,"depth":1635,"text":243683},"Step 6: Aggregate spend by vendor and category (using line items)",{"id":243481,"depth":1629,"text":243487},{"id":239289,"depth":1629,"text":239292},{"id":243535,"depth":1629,"text":243538},"content:blog:how_to_analyze_spend_with_unified_accounting_api.md","blog/how_to_analyze_spend_with_unified_accounting_api.md","blog/how_to_analyze_spend_with_unified_accounting_api",{"_path":243691,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":240561,"description":243692,"img":243693,"date":243694,"tag":6341,"body":243695,"_type":1677,"_id":244523,"_source":1679,"_file":244524,"_stem":244525,"_extension":1682},"/blog/scaling_mcp_tools_with_anthropic_defer_loading","Learn how to use Anthropic's `defer_loading` tool search features with Unified's MCP server to efficiently manage hundreds of tools while maintaining high...","https://s3.us-east-2.amazonaws.com/unified-article-images/scaling_mcp_tools_with_anthropic_defer_loading-icon.png","2025-12-25T18:46:00.000Z",{"type":14,"children":243696,"toc":244503},[243697,243702,243705,243713,243732,243745,243750,243773,243784,243790,243800,243805,243823,243829,243841,243847,243863,243881,243897,243915,243921,243965,243971,244000,244035,244044,244059,244068,244095,244123,244127,244133,244138,244144,244149,244158,244164,244176,244188,244194,244199,244208,244214,244227,244236,244242,244247,244290,244296,244304,244332,244340,244358,244364,244369,244378,244384,244434,244439,244450,244493,244498],{"type":17,"tag":18,"props":243698,"children":243700},{"id":243699},"scaling-mcp-tools-with-anthropics-defer-loading",[243701],{"type":23,"value":240561},{"type":17,"tag":25,"props":243703,"children":243704},{},[],{"type":17,"tag":29,"props":243706,"children":243707},{},[243708],{"type":17,"tag":33,"props":243709,"children":243710},{},[243711],{"type":23,"value":243712},"December 25, 2025",{"type":17,"tag":29,"props":243714,"children":243715},{},[243716,243718,243724,243726,243730],{"type":23,"value":243717},"Learn how to use Anthropic's ",{"type":17,"tag":6121,"props":243719,"children":243721},{"className":243720},[],[243722],{"type":23,"value":243723},"defer_loading",{"type":23,"value":243725}," tool search features with Unified's ",{"type":17,"tag":133,"props":243727,"children":243728},{"href":326},[243729],{"type":23,"value":329},{"type":23,"value":243731}," server to efficiently manage hundreds of tools while maintaining high accuracy and context efficiency.",{"type":17,"tag":29,"props":243733,"children":243734},{},[243735,243737,243743],{"type":23,"value":243736},"When building AI applications with MCP servers, including the ",{"type":17,"tag":133,"props":243738,"children":243741},{"href":243739,"rel":243740},"https://www.notion.so/mcp/overview",[214],[243742],{"type":23,"value":142497},{"type":23,"value":243744},", you quickly encounter a critical challenge: most LLM models struggle with large numbers of tools.",{"type":17,"tag":29,"props":243746,"children":243747},{},[243748],{"type":23,"value":243749},"While Unified can provide thousands of tools across different integrations, traditional approaches hit two key limitations:",{"type":17,"tag":80,"props":243751,"children":243752},{},[243753,243763],{"type":17,"tag":84,"props":243754,"children":243755},{},[243756,243761],{"type":17,"tag":48,"props":243757,"children":243758},{},[243759],{"type":23,"value":243760},"Context window bloat",{"type":23,"value":243762},": Tool definitions consume massive portions of your context (50 tools ≈ 10-20K tokens)",{"type":17,"tag":84,"props":243764,"children":243765},{},[243766,243771],{"type":17,"tag":48,"props":243767,"children":243768},{},[243769],{"type":23,"value":243770},"Tool selection degradation",{"type":23,"value":243772},": An LLM's ability to correctly select tools degrades significantly beyond 30-50 tools",{"type":17,"tag":29,"props":243774,"children":243775},{},[243776,243778,243782],{"type":23,"value":243777},"Anthropic's new ",{"type":17,"tag":48,"props":243779,"children":243780},{},[243781],{"type":23,"value":243723},{"type":23,"value":243783}," feature solves both first problems by dynamically discovering and loading tools on-demand instead of loading all tool definitions upfront.",{"type":17,"tag":68,"props":243785,"children":243787},{"id":243786},"the-problem-too-many-tools",[243788],{"type":23,"value":243789},"The Problem: Too Many Tools",{"type":17,"tag":29,"props":243791,"children":243792},{},[243793,243794,243798],{"type":23,"value":6712},{"type":17,"tag":133,"props":243795,"children":243796},{"href":326},[243797],{"type":23,"value":45418},{"type":23,"value":243799}," server can expose tools from any connected integration— CRM, ATS, HRIS, ticketing, storage, and more. A single connection might offer 50+ tools, and with multiple integrations, you could easily have 200+ available tools.  Overall, the Unified MCP server currently support more than 22,000 tools.",{"type":17,"tag":29,"props":243801,"children":243802},{},[243803],{"type":23,"value":243804},"Traditional approach problems:",{"type":17,"tag":80,"props":243806,"children":243807},{},[243808,243813,243818],{"type":17,"tag":84,"props":243809,"children":243810},{},[243811],{"type":23,"value":243812},"Loading 200 tool definitions uses 40,000-80,000 tokens",{"type":17,"tag":84,"props":243814,"children":243815},{},[243816],{"type":23,"value":243817},"The LLM API struggles to select the correct tool from such a large set",{"type":17,"tag":84,"props":243819,"children":243820},{},[243821],{"type":23,"value":243822},"You waste context on tools that won't be used in that conversation",{"type":17,"tag":68,"props":243824,"children":243826},{"id":243825},"the-solution-anthropics-defer-loading-tool-search",[243827],{"type":23,"value":243828},"The Solution: Anthropic's Defer Loading Tool Search",{"type":17,"tag":29,"props":243830,"children":243831},{},[243832,243834,243839],{"type":23,"value":243833},"Anthropic's ",{"type":17,"tag":6121,"props":243835,"children":243837},{"className":243836},[],[243838],{"type":23,"value":243723},{"type":23,"value":243840}," feature works with two tool search variants:",{"type":17,"tag":239,"props":243842,"children":243844},{"id":243843},"tool-search-variants",[243845],{"type":23,"value":243846},"Tool Search Variants",{"type":17,"tag":29,"props":243848,"children":243849},{},[243850,243855,243856,243862],{"type":17,"tag":48,"props":243851,"children":243852},{},[243853],{"type":23,"value":243854},"1. Regex Tool Search",{"type":23,"value":44573},{"type":17,"tag":6121,"props":243857,"children":243859},{"className":243858},[],[243860],{"type":23,"value":243861},"tool_search_tool_regex_20251119",{"type":23,"value":12034},{"type":17,"tag":80,"props":243864,"children":243865},{},[243866,243871,243876],{"type":17,"tag":84,"props":243867,"children":243868},{},[243869],{"type":23,"value":243870},"Claude constructs regex patterns to search for tools",{"type":17,"tag":84,"props":243872,"children":243873},{},[243874],{"type":23,"value":243875},"Best for exact matches and pattern-based discovery",{"type":17,"tag":84,"props":243877,"children":243878},{},[243879],{"type":23,"value":243880},"Fast and efficient for well-named tools",{"type":17,"tag":29,"props":243882,"children":243883},{},[243884,243889,243890,243896],{"type":17,"tag":48,"props":243885,"children":243886},{},[243887],{"type":23,"value":243888},"2. BM25 Tool Search",{"type":23,"value":44573},{"type":17,"tag":6121,"props":243891,"children":243893},{"className":243892},[],[243894],{"type":23,"value":243895},"tool_search_tool_bm25_20251119",{"type":23,"value":12034},{"type":17,"tag":80,"props":243898,"children":243899},{},[243900,243905,243910],{"type":17,"tag":84,"props":243901,"children":243902},{},[243903],{"type":23,"value":243904},"Claude uses natural language queries to search",{"type":17,"tag":84,"props":243906,"children":243907},{},[243908],{"type":23,"value":243909},"Better for semantic understanding",{"type":17,"tag":84,"props":243911,"children":243912},{},[243913],{"type":23,"value":243914},"More flexible for varied naming conventions",{"type":17,"tag":239,"props":243916,"children":243918},{"id":243917},"how-it-works",[243919],{"type":23,"value":243920},"How It Works",{"type":17,"tag":6154,"props":243922,"children":243923},{},[243924,243929,243940,243945,243950,243955,243960],{"type":17,"tag":84,"props":243925,"children":243926},{},[243927],{"type":23,"value":243928},"You include a tool search tool in your tools list",{"type":17,"tag":84,"props":243930,"children":243931},{},[243932,243934],{"type":23,"value":243933},"You provide all tool definitions with ",{"type":17,"tag":6121,"props":243935,"children":243937},{"className":243936},[],[243938],{"type":23,"value":243939},"defer_loading: true",{"type":17,"tag":84,"props":243941,"children":243942},{},[243943],{"type":23,"value":243944},"Claude sees only the tool search tool initially",{"type":17,"tag":84,"props":243946,"children":243947},{},[243948],{"type":23,"value":243949},"When Claude needs additional tools, it searches dynamically",{"type":17,"tag":84,"props":243951,"children":243952},{},[243953],{"type":23,"value":243954},"The API returns 3-5 most relevant tools",{"type":17,"tag":84,"props":243956,"children":243957},{},[243958],{"type":23,"value":243959},"These are automatically expanded into full definitions",{"type":17,"tag":84,"props":243961,"children":243962},{},[243963],{"type":23,"value":243964},"Claude selects and invokes the appropriate tool",{"type":17,"tag":68,"props":243966,"children":243968},{"id":243967},"implementation",[243969],{"type":23,"value":243970},"Implementation",{"type":17,"tag":29,"props":243972,"children":243973},{},[243974,243976,243981,243983,243990,243992,243998],{"type":23,"value":243975},"To use the new ",{"type":17,"tag":6121,"props":243977,"children":243979},{"className":243978},[],[243980],{"type":23,"value":243723},{"type":23,"value":243982}," tool option, follow these instructions (found ",{"type":17,"tag":133,"props":243984,"children":243987},{"href":243985,"rel":243986},"https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool#mcp-integration",[214],[243988],{"type":23,"value":243989},"here",{"type":23,"value":243991},") when calling Anthropic's ",{"type":17,"tag":6121,"props":243993,"children":243995},{"className":243994},[],[243996],{"type":23,"value":243997},"/v1/messages",{"type":23,"value":243999}," API:",{"type":17,"tag":80,"props":244001,"children":244002},{},[244003,244030],{"type":17,"tag":84,"props":244004,"children":244005},{},[244006,244008,244014,244016,244022,244024],{"type":23,"value":244007},"Add ",{"type":17,"tag":6121,"props":244009,"children":244011},{"className":244010},[],[244012],{"type":23,"value":244013},"\"mcp-client-2025-11-20\"",{"type":23,"value":244015},"  to the ",{"type":17,"tag":6121,"props":244017,"children":244019},{"className":244018},[],[244020],{"type":23,"value":244021},"anthropic-beta",{"type":23,"value":244023}," header:\n",{"type":17,"tag":6121,"props":244025,"children":244027},{"className":244026},[],[244028],{"type":23,"value":244029},"anthropic-beta: advanced-tool-use-2025-11-20,mcp-client-2025-11-20",{"type":17,"tag":84,"props":244031,"children":244032},{},[244033],{"type":23,"value":244034},"Add the Unified MCP server's URL as usual",{"type":17,"tag":6893,"props":244036,"children":244039},{"className":244037,"code":244038,"language":22503,"meta":7},[22501],"\"mcp_servers\": [\n  {\n    \"type\": \"url\",\n    \"name\": \"unified-salesforce-server\",\n    \"url\": \"https://mcp-api.unified.to?token=x&connection=y\"\n  }\n],\n",[244040],{"type":17,"tag":6121,"props":244041,"children":244042},{"__ignoreMap":7},[244043],{"type":23,"value":244038},{"type":17,"tag":80,"props":244045,"children":244046},{},[244047],{"type":17,"tag":84,"props":244048,"children":244049},{},[244050,244052,244057],{"type":23,"value":244051},"Then add an additional ",{"type":17,"tag":6121,"props":244053,"children":244055},{"className":244054},[],[244056],{"type":23,"value":131599},{"type":23,"value":244058}," array with configuration on which tools to defer:",{"type":17,"tag":6893,"props":244060,"children":244063},{"className":244061,"code":244062,"language":22503,"meta":7},[22501],"\"tools\": [\n  {\n    \"type\": \"tool_search_tool_regex_20251119\",\n    \"name\": \"tool_search_tool_regex\"\n  },\n  {\n    \"type\": \"mcp_toolset\",\n    \"mcp_server_name\": \"unified-salesforce-server\",\n    \"default_config\": {\n      \"defer_loading\": true\n    },\n    \"configs\": {\n      \"list_crm_contacts\": {\n        \"defer_loading\": false\n      }\n    }\n  }\n],\n",[244064],{"type":17,"tag":6121,"props":244065,"children":244066},{"__ignoreMap":7},[244067],{"type":23,"value":244062},{"type":17,"tag":80,"props":244069,"children":244070},{},[244071,244083],{"type":17,"tag":84,"props":244072,"children":244073},{},[244074,244075,244081],{"type":23,"value":48249},{"type":17,"tag":6121,"props":244076,"children":244078},{"className":244077},[],[244079],{"type":23,"value":244080},"default_config.defer_loading: true",{"type":23,"value":244082}," option to make all tools deferrable",{"type":17,"tag":84,"props":244084,"children":244085},{},[244086,244087,244093],{"type":23,"value":48249},{"type":17,"tag":6121,"props":244088,"children":244090},{"className":244089},[],[244091],{"type":23,"value":244092},"configs.{tool_id}.defer_loading: true/false",{"type":23,"value":244094}," to set an individual tool to defer (or not)",{"type":17,"tag":29,"props":244096,"children":244097},{},[244098,244100,244106,244108,244114,244116,244121],{"type":23,"value":244099},"Or, alternatively, you can call the Unified MCP ",{"type":17,"tag":6121,"props":244101,"children":244103},{"className":244102},[],[244104],{"type":23,"value":244105},"/tools",{"type":23,"value":244107}," endpoint with parameters ",{"type":17,"tag":6121,"props":244109,"children":244111},{"className":244110},[],[244112],{"type":23,"value":244113},"?type=anthropic&defer_tools=all",{"type":23,"value":244115}," and then feed that ",{"type":17,"tag":6121,"props":244117,"children":244119},{"className":244118},[],[244120],{"type":23,"value":131599},{"type":23,"value":244122}," result into Anthropic's API.",{"type":17,"tag":68,"props":244124,"children":244125},{"id":183199},[244126],{"type":23,"value":183202},{"type":17,"tag":239,"props":244128,"children":244130},{"id":244129},"_1-keep-core-tools-non-deferred",[244131],{"type":23,"value":244132},"1. Keep Core Tools Non-Deferred",{"type":17,"tag":29,"props":244134,"children":244135},{},[244136],{"type":23,"value":244137},"If you have 3-5 tools that are frequently used, keep them as non-deferred.",{"type":17,"tag":239,"props":244139,"children":244141},{"id":244140},"_2-use-permissions-to-scope-tools",[244142],{"type":23,"value":244143},"2. Use Permissions to Scope Tools",{"type":17,"tag":29,"props":244145,"children":244146},{},[244147],{"type":23,"value":244148},"Reduce the tool catalog size by requesting only the permissions you need:",{"type":17,"tag":6893,"props":244150,"children":244153},{"className":244151,"code":244152,"language":18718,"meta":7},[18716],"// Instead of all tools across all categories\npermissions: 'crm_contact_read,crm_contact_write,crm_deal_read'\n\n// This is better than loading 200+ tools from all categories\n",[244154],{"type":17,"tag":6121,"props":244155,"children":244156},{"__ignoreMap":7},[244157],{"type":23,"value":244152},{"type":17,"tag":239,"props":244159,"children":244161},{"id":244160},"_3-restrict-tools",[244162],{"type":23,"value":244163},"3. Restrict Tools",{"type":17,"tag":29,"props":244165,"children":244166},{},[244167,244169,244174],{"type":23,"value":244168},"Use the Unified MCP ",{"type":17,"tag":6121,"props":244170,"children":244172},{"className":244171},[],[244173],{"type":23,"value":131599},{"type":23,"value":244175}," parameter to restrict which tools will be returned back to the LLM API.",{"type":17,"tag":29,"props":244177,"children":244178},{},[244179,244181,244186],{"type":23,"value":244180},"This has a different effect than the ",{"type":17,"tag":6121,"props":244182,"children":244184},{"className":244183},[],[244185],{"type":23,"value":131610},{"type":23,"value":244187}," parameter as it doesn't return restricted tools to the LLM API at all, while deferring tools means that the LLM API knows about the tool, but doesnt process it until it is needed.",{"type":17,"tag":239,"props":244189,"children":244191},{"id":244190},"_4-monitor-token-usage",[244192],{"type":23,"value":244193},"4. Monitor Token Usage",{"type":17,"tag":29,"props":244195,"children":244196},{},[244197],{"type":23,"value":244198},"Track your token consumption to understand the benefits:",{"type":17,"tag":6893,"props":244200,"children":244203},{"className":244201,"code":244202,"language":18718,"meta":7},[18716],"console.log(`Input tokens: ${response.usage.input_tokens}`);\nconsole.log(`Output tokens: ${response.usage.output_tokens}`);\nconsole.log(`Tool search requests: ${response.usage.server_tool_use?.tool_search_requests}`);\n",[244204],{"type":17,"tag":6121,"props":244205,"children":244206},{"__ignoreMap":7},[244207],{"type":23,"value":244202},{"type":17,"tag":239,"props":244209,"children":244211},{"id":244210},"_5-combine-with-prompt-caching",[244212],{"type":23,"value":244213},"5. Combine with Prompt Caching",{"type":17,"tag":29,"props":244215,"children":244216},{},[244217,244218,244225],{"type":23,"value":33722},{"type":17,"tag":133,"props":244219,"children":244222},{"href":244220,"rel":244221},"https://www.notion.so/guides/building_ai_applications_with_unified_and_langbase",[214],[244223],{"type":23,"value":244224},"prompt caching",{"type":23,"value":244226}," with defer_loading for multi-turn conversations:",{"type":17,"tag":6893,"props":244228,"children":244231},{"className":244229,"code":244230,"language":18718,"meta":7},[18716],"messages.push({\n    role: \"user\",\n    content: \"Now find their recent deals\",\n    cache_control: { type: \"ephemeral\" }\n});\n",[244232],{"type":17,"tag":6121,"props":244233,"children":244234},{"__ignoreMap":7},[244235],{"type":23,"value":244230},{"type":17,"tag":68,"props":244237,"children":244239},{"id":244238},"tool-search-limits",[244240],{"type":23,"value":244241},"Tool Search Limits",{"type":17,"tag":29,"props":244243,"children":244244},{},[244245],{"type":23,"value":244246},"Be aware of these limits:",{"type":17,"tag":80,"props":244248,"children":244249},{},[244250,244260,244270,244280],{"type":17,"tag":84,"props":244251,"children":244252},{},[244253,244258],{"type":17,"tag":48,"props":244254,"children":244255},{},[244256],{"type":23,"value":244257},"Maximum tools",{"type":23,"value":244259},": 10,000 tools in your catalog",{"type":17,"tag":84,"props":244261,"children":244262},{},[244263,244268],{"type":17,"tag":48,"props":244264,"children":244265},{},[244266],{"type":23,"value":244267},"Search results",{"type":23,"value":244269},": Returns 3-5 most relevant tools per search",{"type":17,"tag":84,"props":244271,"children":244272},{},[244273,244278],{"type":17,"tag":48,"props":244274,"children":244275},{},[244276],{"type":23,"value":244277},"Pattern length",{"type":23,"value":244279},": Maximum 200 characters for regex patterns",{"type":17,"tag":84,"props":244281,"children":244282},{},[244283,244288],{"type":17,"tag":48,"props":244284,"children":244285},{},[244286],{"type":23,"value":244287},"Model support",{"type":23,"value":244289},": Claude Sonnet 4.5+ and Opus 4.5+ only",{"type":17,"tag":68,"props":244291,"children":244293},{"id":244292},"when-to-use-defer-loading",[244294],{"type":23,"value":244295},"When to Use Defer Loading",{"type":17,"tag":29,"props":244297,"children":244298},{},[244299],{"type":17,"tag":48,"props":244300,"children":244301},{},[244302],{"type":23,"value":244303},"Good use cases:",{"type":17,"tag":80,"props":244305,"children":244306},{},[244307,244312,244317,244322,244327],{"type":17,"tag":84,"props":244308,"children":244309},{},[244310],{"type":23,"value":244311},"20+ tools available from Unified connections",{"type":17,"tag":84,"props":244313,"children":244314},{},[244315],{"type":23,"value":244316},"Multiple integrations (CRM + ATS + HRIS + Storage)",{"type":17,"tag":84,"props":244318,"children":244319},{},[244320],{"type":23,"value":244321},"Building multi-tenant applications where each tenant has different integrations",{"type":17,"tag":84,"props":244323,"children":244324},{},[244325],{"type":23,"value":244326},"Context window is getting tight with tool definitions",{"type":17,"tag":84,"props":244328,"children":244329},{},[244330],{"type":23,"value":244331},"Tool selection accuracy is degrading",{"type":17,"tag":29,"props":244333,"children":244334},{},[244335],{"type":17,"tag":48,"props":244336,"children":244337},{},[244338],{"type":23,"value":244339},"When traditional tool calling might be better:",{"type":17,"tag":80,"props":244341,"children":244342},{},[244343,244348,244353],{"type":17,"tag":84,"props":244344,"children":244345},{},[244346],{"type":23,"value":244347},"Less than 10 tools total",{"type":17,"tag":84,"props":244349,"children":244350},{},[244351],{"type":23,"value":244352},"All tools are frequently used in every request",{"type":17,"tag":84,"props":244354,"children":244355},{},[244356],{"type":23,"value":244357},"Very focused single-integration use case",{"type":17,"tag":68,"props":244359,"children":244361},{"id":244360},"real-world-example-multi-integration-assistant",[244362],{"type":23,"value":244363},"Real-World Example: Multi-Integration Assistant",{"type":17,"tag":29,"props":244365,"children":244366},{},[244367],{"type":23,"value":244368},"Here's a practical example of a customer support assistant that accesses multiple integrations:",{"type":17,"tag":6893,"props":244370,"children":244373},{"className":244371,"code":244372,"language":18718,"meta":7},[18716],"async function createSupportAssistant(crm_connection_id, hris_connection_id, zendesk_connection_id) {\n    // Fetch tools from multiple Unified connections\n    const crmTools = await fetchUnifiedTools(crm_connection_id, 'crm_contact_read,crm_deal_read', { type: 'anthropic', defer_tools: 'list_crm_'});\n    const ticketingTools = await fetchUnifiedTools(zendesk_connection_id, 'ticketing_ticket_read,ticketing_ticket_write', { type: 'anthropic', defer_tools: 'list_crm_'});\n    const hrisTools = await fetchUnifiedTools(hris_connection_id, 'hris_employee_read', { type: 'anthropic', defer_tools: 'list_crm_'});\n\n    // Combine all tools with defer_loading\n    const tools = [\n        ...crmTools,\n        ...ticketingTools,\n        ...hrisTools\n    ];\n\n    // Total: 150+ tools, with all listX tools being deffered\n    return await anthropic.beta.messages.create({\n        model: \"claude-sonnet-4-5-20250929\",\n        betas: [\"advanced-tool-use-2025-11-20\"],\n        max_tokens: 4096,\n        messages: [{\n            role: \"user\",\n            content: \"Customer John Doe from Acme Corp called about ticket #12345. Show me his account info, open tickets, and any recent deals.\"\n        }],\n        tools: tools\n    });\n}\n",[244374],{"type":17,"tag":6121,"props":244375,"children":244376},{"__ignoreMap":7},[244377],{"type":23,"value":244372},{"type":17,"tag":68,"props":244379,"children":244381},{"id":244380},"resources",[244382],{"type":23,"value":244383},"Resources",{"type":17,"tag":80,"props":244385,"children":244386},{},[244387,244396,244405,244415,244425],{"type":17,"tag":84,"props":244388,"children":244389},{},[244390],{"type":17,"tag":133,"props":244391,"children":244393},{"href":217198,"rel":244392},[214],[244394],{"type":23,"value":244395},"Unified MCP Server Overview",{"type":17,"tag":84,"props":244397,"children":244398},{},[244399],{"type":17,"tag":133,"props":244400,"children":244402},{"href":240846,"rel":244401},[214],[244403],{"type":23,"value":244404},"MCP Installation & Usage",{"type":17,"tag":84,"props":244406,"children":244407},{},[244408],{"type":17,"tag":133,"props":244409,"children":244412},{"href":244410,"rel":244411},"https://docs.unified.to/mcp/server-options",[214],[244413],{"type":23,"value":244414},"MCP Server Options",{"type":17,"tag":84,"props":244416,"children":244417},{},[244418],{"type":17,"tag":133,"props":244419,"children":244422},{"href":244420,"rel":244421},"https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool",[214],[244423],{"type":23,"value":244424},"Anthropic Tool Search Documentation",{"type":17,"tag":84,"props":244426,"children":244427},{},[244428],{"type":17,"tag":133,"props":244429,"children":244431},{"href":243985,"rel":244430},[214],[244432],{"type":23,"value":244433},"Anthropic MCP Integration Guide",{"type":17,"tag":68,"props":244435,"children":244436},{"id":243535},[244437],{"type":23,"value":244438},"TLDR",{"type":17,"tag":29,"props":244440,"children":244441},{},[244442,244443,244448],{"type":23,"value":243833},{"type":17,"tag":6121,"props":244444,"children":244446},{"className":244445},[],[244447],{"type":23,"value":243723},{"type":23,"value":244449}," feature is a game-changer for building AI applications with Unified's MCP server. By the LLM API dynamically loading tools on-demand, you can:",{"type":17,"tag":80,"props":244451,"children":244452},{},[244453,244463,244473,244483],{"type":17,"tag":84,"props":244454,"children":244455},{},[244456,244461],{"type":17,"tag":48,"props":244457,"children":244458},{},[244459],{"type":23,"value":244460},"Scale to hundreds of tools",{"type":23,"value":244462}," across multiple integrations",{"type":17,"tag":84,"props":244464,"children":244465},{},[244466,244471],{"type":17,"tag":48,"props":244467,"children":244468},{},[244469],{"type":23,"value":244470},"Reduce context usage",{"type":23,"value":244472}," by 80-90%",{"type":17,"tag":84,"props":244474,"children":244475},{},[244476,244481],{"type":17,"tag":48,"props":244477,"children":244478},{},[244479],{"type":23,"value":244480},"Improve tool selection accuracy",{"type":23,"value":244482}," significantly",{"type":17,"tag":84,"props":244484,"children":244485},{},[244486,244491],{"type":17,"tag":48,"props":244487,"children":244488},{},[244489],{"type":23,"value":244490},"Build more capable AI assistants",{"type":23,"value":244492}," that access diverse data sources",{"type":17,"tag":29,"props":244494,"children":244495},{},[244496],{"type":23,"value":244497},"Start by adding the tool search tool and marking your Unified MCP tools as deferred. Monitor your token usage and tool selection accuracy to see the immediate benefits.",{"type":17,"tag":29,"props":244499,"children":244500},{},[244501],{"type":23,"value":244502},"The combination of Unified's extensive integration network and Anthropic's intelligent tool search opens up possibilities for building truly comprehensive AI agents that can work across your entire SaaS ecosystem.",{"title":7,"searchDepth":1629,"depth":1629,"links":244504},[244505,244506,244510,244511,244518,244519,244520,244521,244522],{"id":243786,"depth":1629,"text":243789},{"id":243825,"depth":1629,"text":243828,"children":244507},[244508,244509],{"id":243843,"depth":1635,"text":243846},{"id":243917,"depth":1635,"text":243920},{"id":243967,"depth":1629,"text":243970},{"id":183199,"depth":1629,"text":183202,"children":244512},[244513,244514,244515,244516,244517],{"id":244129,"depth":1635,"text":244132},{"id":244140,"depth":1635,"text":244143},{"id":244160,"depth":1635,"text":244163},{"id":244190,"depth":1635,"text":244193},{"id":244210,"depth":1635,"text":244213},{"id":244238,"depth":1629,"text":244241},{"id":244292,"depth":1629,"text":244295},{"id":244360,"depth":1629,"text":244363},{"id":244380,"depth":1629,"text":244383},{"id":243535,"depth":1629,"text":244438},"content:blog:scaling_mcp_tools_with_anthropic_defer_loading.md","blog/scaling_mcp_tools_with_anthropic_defer_loading.md","blog/scaling_mcp_tools_with_anthropic_defer_loading",{"_path":244527,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":216894,"description":244528,"img":244529,"date":244530,"tag":12,"body":244531,"_type":1677,"_id":245779,"_source":1679,"_file":245780,"_stem":245781,"_extension":1682},"/blog/how_to_use_supabase_with_unified","Supabase is a strong choice when you want Unified's normalized objects available in Postgres for querying, analytics, and joins with your own data.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_supabase_with_unified-icon.png","2025-12-19T14:41:00.000Z",{"type":14,"children":244532,"toc":245749},[244533,244538,244541,244549,244553,244558,244586,244591,244597,244602,244631,244648,244654,244663,244695,244701,244706,244711,244738,245008,245014,245051,245057,245080,245090,245096,245101,245107,245125,245130,245136,245158,245163,245169,245181,245193,245199,245240,245245,245251,245298,245304,245309,245327,245332,245338,245348,245354,245372,245378,245396,245401,245407,245412,245417,245430,245436,245454,245460,245486,245492,245505,245511,245516,245521,245549,245554,245560,245653,245665,245669,245681,245699,245704,245711],{"type":17,"tag":18,"props":244534,"children":244536},{"id":244535},"how-to-use-supabase-with-unifiedto",[244537],{"type":23,"value":216894},{"type":17,"tag":25,"props":244539,"children":244540},{},[],{"type":17,"tag":29,"props":244542,"children":244543},{},[244544],{"type":17,"tag":33,"props":244545,"children":244546},{},[244547],{"type":23,"value":244548},"December 19, 2025",{"type":17,"tag":29,"props":244550,"children":244551},{},[244552],{"type":23,"value":244528},{"type":17,"tag":29,"props":244554,"children":244555},{},[244556],{"type":23,"value":244557},"Unified.to supports Supabase in two complementary ways:",{"type":17,"tag":6154,"props":244559,"children":244560},{},[244561,244576],{"type":17,"tag":84,"props":244562,"children":244563},{},[244564,244574],{"type":17,"tag":133,"props":244565,"children":244568},{"href":244566,"rel":244567},"https://docs.unified.to/reference/sdks#sdks:~:text=Supabase%20SQL%20DDL%3A%20Unified%20API%27s%20DDL",[214],[244569],{"type":17,"tag":48,"props":244570,"children":244571},{},[244572],{"type":23,"value":244573},"Schema-first (DDL)",{"type":23,"value":244575},": create Postgres tables that match Unified's data models",{"type":17,"tag":84,"props":244577,"children":244578},{},[244579,244584],{"type":17,"tag":48,"props":244580,"children":244581},{},[244582],{"type":23,"value":244583},"Data delivery",{"type":23,"value":244585},": stream normalized updates into those tables via database sync or your own ingestion layer",{"type":17,"tag":29,"props":244587,"children":244588},{},[244589],{"type":23,"value":244590},"This guide explains both approaches, when to use each, and how Supabase fits into Unified's real-time, no-storage architecture.",{"type":17,"tag":68,"props":244592,"children":244594},{"id":244593},"when-supabase-is-the-right-tool",[244595],{"type":23,"value":244596},"When Supabase is the right tool",{"type":17,"tag":29,"props":244598,"children":244599},{},[244600],{"type":23,"value":244601},"Use Supabase with Unified.to when you want:",{"type":17,"tag":80,"props":244603,"children":244604},{},[244605,244616,244621,244626],{"type":17,"tag":84,"props":244606,"children":244607},{},[244608,244609,244614],{"type":23,"value":9619},{"type":17,"tag":48,"props":244610,"children":244611},{},[244612],{"type":23,"value":244613},"local, queryable mirror",{"type":23,"value":244615}," of normalized SaaS data",{"type":17,"tag":84,"props":244617,"children":244618},{},[244619],{"type":23,"value":244620},"SQL for analytics, reporting, or BI",{"type":17,"tag":84,"props":244622,"children":244623},{},[244624],{"type":23,"value":244625},"Joins between Unified objects and your own application tables",{"type":17,"tag":84,"props":244627,"children":244628},{},[244629],{"type":23,"value":244630},"Eventual consistency with predictable schemas",{"type":17,"tag":29,"props":244632,"children":244633},{},[244634,244636,244640,244642,244646],{"type":23,"value":244635},"Supabase is ",{"type":17,"tag":48,"props":244637,"children":244638},{},[244639],{"type":23,"value":159475},{"type":23,"value":244641}," a replacement for Unified's API or ",{"type":17,"tag":133,"props":244643,"children":244644},{"href":4999},[244645],{"type":23,"value":5002},{"type":23,"value":244647},". It's a storage and query layer you control.",{"type":17,"tag":68,"props":244649,"children":244651},{"id":244650},"high-level-architecture",[244652],{"type":23,"value":244653},"High-level architecture",{"type":17,"tag":6893,"props":244655,"children":244658},{"className":244656,"code":244657,"language":20901,"meta":23},[20899],"SaaS providers (CRM, HRIS, Calendar, etc.)\n            ↓\n         Unified.tomer\n   (real-time normalization)\n            ↓\n   ┌───────────────┐\n   │  Your backend │  ← API calls / webhooks (real-time)\n   └───────────────┘\n            ↓\n         Supabase\n     (Postgres mirror)\n",[244659],{"type":17,"tag":6121,"props":244660,"children":244661},{"__ignoreMap":7},[244662],{"type":23,"value":244657},{"type":17,"tag":80,"props":244664,"children":244665},{},[244666,244675,244685],{"type":17,"tag":84,"props":244667,"children":244668},{},[244669,244673],{"type":17,"tag":48,"props":244670,"children":244671},{},[244672],{"type":23,"value":87523},{"type":23,"value":244674}," remains the integration layer and source of truth",{"type":17,"tag":84,"props":244676,"children":244677},{},[244678,244683],{"type":17,"tag":48,"props":244679,"children":244680},{},[244681],{"type":23,"value":244682},"Supabase",{"type":23,"value":244684}," is a mirror/cache for querying and analytics",{"type":17,"tag":84,"props":244686,"children":244687},{},[244688,244693],{"type":17,"tag":48,"props":244689,"children":244690},{},[244691],{"type":23,"value":244692},"Your backend",{"type":23,"value":244694}," decides when to read from Supabase vs call Unified directly",{"type":17,"tag":68,"props":244696,"children":244698},{"id":244697},"step-1-create-tables-using-unifieds-supabase-ddl",[244699],{"type":23,"value":244700},"Step 1: Create tables using Unified's Supabase DDL",{"type":17,"tag":29,"props":244702,"children":244703},{},[244704],{"type":23,"value":244705},"Unified provides Supabase-compatible SQL DDL files for each integration category (CRM, Calendar, HRIS, etc.), as well as an all-in-one option.",{"type":17,"tag":29,"props":244707,"children":244708},{},[244709],{"type":23,"value":244710},"The DDL creates Postgres tables that match Unified's normalized data models so incoming data can be written consistently. These tables are designed to receive data delivered by Unified's database webhook pipeline.",{"type":17,"tag":29,"props":244712,"children":244713},{},[244714,244723,244725],{"type":17,"tag":244715,"props":244716,"children":244717},"u",{},[244718],{"type":17,"tag":48,"props":244719,"children":244720},{},[244721],{"type":23,"value":244722},"Supabase SQL DDL:",{"type":23,"value":244724}," ",{"type":17,"tag":133,"props":244726,"children":244729},{"href":244727,"rel":244728},"https://api.unified.to/docs/supabase_ddl.sql",[214],[244730],{"type":17,"tag":244715,"props":244731,"children":244732},{},[244733],{"type":17,"tag":48,"props":244734,"children":244735},{},[244736],{"type":23,"value":244737},"Unified API's DDL",{"type":17,"tag":3414,"props":244739,"children":244740},{},[244741,244758],{"type":17,"tag":29,"props":244742,"children":244743},{},[244744,244746,244756],{"type":23,"value":244745},"You can use our SQL DDL to create databases in Supabase matching our data-model schemas. You can download one ",{"type":17,"tag":133,"props":244747,"children":244750},{"href":244748,"rel":244749},"https://api.unified.to/docs/supabase-ddl.sql",[214],[244751],{"type":17,"tag":48,"props":244752,"children":244753},{},[244754],{"type":23,"value":244755},"DDL SQL",{"type":23,"value":244757}," for all of our Unified APIs, or you can download a DDL SQL for each API, which will contain just the data models for that API category.",{"type":17,"tag":80,"props":244759,"children":244760},{},[244761,244774,244787,244800,244813,244826,244839,244852,244865,244878,244891,244904,244917,244930,244943,244956,244969,244982,244995],{"type":17,"tag":84,"props":244762,"children":244763},{},[244764],{"type":17,"tag":133,"props":244765,"children":244768},{"href":244766,"rel":244767},"https://api.unified.to/docs/supabase-ddl-accounting.sql",[214],[244769],{"type":17,"tag":48,"props":244770,"children":244771},{},[244772],{"type":23,"value":244773},"supabase_ddl_accounting.sql",{"type":17,"tag":84,"props":244775,"children":244776},{},[244777],{"type":17,"tag":133,"props":244778,"children":244781},{"href":244779,"rel":244780},"https://api.unified.to/docs/supabase-ddl-ats.sql",[214],[244782],{"type":17,"tag":48,"props":244783,"children":244784},{},[244785],{"type":23,"value":244786},"supabase_ddl_ats.sql",{"type":17,"tag":84,"props":244788,"children":244789},{},[244790],{"type":17,"tag":133,"props":244791,"children":244794},{"href":244792,"rel":244793},"https://api.unified.to/docs/supabase-ddl-calendar.sql",[214],[244795],{"type":17,"tag":48,"props":244796,"children":244797},{},[244798],{"type":23,"value":244799},"supabase_ddl_calendar.sql",{"type":17,"tag":84,"props":244801,"children":244802},{},[244803],{"type":17,"tag":133,"props":244804,"children":244807},{"href":244805,"rel":244806},"https://api.unified.to/docs/supabase-ddl-commerce.sql",[214],[244808],{"type":17,"tag":48,"props":244809,"children":244810},{},[244811],{"type":23,"value":244812},"supabase_ddl_commerce.sql",{"type":17,"tag":84,"props":244814,"children":244815},{},[244816],{"type":17,"tag":133,"props":244817,"children":244820},{"href":244818,"rel":244819},"https://api.unified.to/docs/supabase-ddl-crm.sql",[214],[244821],{"type":17,"tag":48,"props":244822,"children":244823},{},[244824],{"type":23,"value":244825},"supabase_ddl_crm.sql",{"type":17,"tag":84,"props":244827,"children":244828},{},[244829],{"type":17,"tag":133,"props":244830,"children":244833},{"href":244831,"rel":244832},"https://api.unified.to/docs/supabase-ddl-enrichment.sql",[214],[244834],{"type":17,"tag":48,"props":244835,"children":244836},{},[244837],{"type":23,"value":244838},"supabase_ddl_enrichment.sql",{"type":17,"tag":84,"props":244840,"children":244841},{},[244842],{"type":17,"tag":133,"props":244843,"children":244846},{"href":244844,"rel":244845},"https://api.unified.to/docs/supabase-ddl-hris.sql",[214],[244847],{"type":17,"tag":48,"props":244848,"children":244849},{},[244850],{"type":23,"value":244851},"supabase_ddl_hris.sql",{"type":17,"tag":84,"props":244853,"children":244854},{},[244855],{"type":17,"tag":133,"props":244856,"children":244859},{"href":244857,"rel":244858},"https://api.unified.to/docs/supabase-ddl-kms.sql",[214],[244860],{"type":17,"tag":48,"props":244861,"children":244862},{},[244863],{"type":23,"value":244864},"supabase_ddl_kms.sql",{"type":17,"tag":84,"props":244866,"children":244867},{},[244868],{"type":17,"tag":133,"props":244869,"children":244872},{"href":244870,"rel":244871},"https://api.unified.to/docs/supabase-ddl-lms.sql",[214],[244873],{"type":17,"tag":48,"props":244874,"children":244875},{},[244876],{"type":23,"value":244877},"supabase_ddl_lms.sql",{"type":17,"tag":84,"props":244879,"children":244880},{},[244881],{"type":17,"tag":133,"props":244882,"children":244885},{"href":244883,"rel":244884},"https://api.unified.to/docs/supabase-ddl-martech.sql",[214],[244886],{"type":17,"tag":48,"props":244887,"children":244888},{},[244889],{"type":23,"value":244890},"supabase_ddl_martech.sql",{"type":17,"tag":84,"props":244892,"children":244893},{},[244894],{"type":17,"tag":133,"props":244895,"children":244898},{"href":244896,"rel":244897},"https://api.unified.to/docs/supabase-ddl-messaging.sql",[214],[244899],{"type":17,"tag":48,"props":244900,"children":244901},{},[244902],{"type":23,"value":244903},"supabase_ddl_messaging.sql",{"type":17,"tag":84,"props":244905,"children":244906},{},[244907],{"type":17,"tag":133,"props":244908,"children":244911},{"href":244909,"rel":244910},"https://api.unified.to/docs/supabase-ddl-payment.sql",[214],[244912],{"type":17,"tag":48,"props":244913,"children":244914},{},[244915],{"type":23,"value":244916},"supabase_ddl_payment.sql",{"type":17,"tag":84,"props":244918,"children":244919},{},[244920],{"type":17,"tag":133,"props":244921,"children":244924},{"href":244922,"rel":244923},"https://api.unified.to/docs/supabase-ddl-repo.sql",[214],[244925],{"type":17,"tag":48,"props":244926,"children":244927},{},[244928],{"type":23,"value":244929},"supabase_ddl_repo.sql",{"type":17,"tag":84,"props":244931,"children":244932},{},[244933],{"type":17,"tag":133,"props":244934,"children":244937},{"href":244935,"rel":244936},"https://api.unified.to/docs/supabase-ddl-scim.sql",[214],[244938],{"type":17,"tag":48,"props":244939,"children":244940},{},[244941],{"type":23,"value":244942},"supabase_ddl_scim.sql",{"type":17,"tag":84,"props":244944,"children":244945},{},[244946],{"type":17,"tag":133,"props":244947,"children":244950},{"href":244948,"rel":244949},"https://api.unified.to/docs/supabase-ddl-storage.sql",[214],[244951],{"type":17,"tag":48,"props":244952,"children":244953},{},[244954],{"type":23,"value":244955},"supabase_ddl_storage.sql",{"type":17,"tag":84,"props":244957,"children":244958},{},[244959],{"type":17,"tag":133,"props":244960,"children":244963},{"href":244961,"rel":244962},"https://api.unified.to/docs/supabase-ddl-task.sql",[214],[244964],{"type":17,"tag":48,"props":244965,"children":244966},{},[244967],{"type":23,"value":244968},"supabase_ddl_task.sql",{"type":17,"tag":84,"props":244970,"children":244971},{},[244972],{"type":17,"tag":133,"props":244973,"children":244976},{"href":244974,"rel":244975},"https://api.unified.to/docs/supabase-ddl-ticketing.sql",[214],[244977],{"type":17,"tag":48,"props":244978,"children":244979},{},[244980],{"type":23,"value":244981},"supabase_ddl_ticketing.sql",{"type":17,"tag":84,"props":244983,"children":244984},{},[244985],{"type":17,"tag":133,"props":244986,"children":244989},{"href":244987,"rel":244988},"https://api.unified.to/docs/supabase-ddl-uc.sql",[214],[244990],{"type":17,"tag":48,"props":244991,"children":244992},{},[244993],{"type":23,"value":244994},"supabase_ddl_uc.sql",{"type":17,"tag":84,"props":244996,"children":244997},{},[244998],{"type":17,"tag":133,"props":244999,"children":245002},{"href":245000,"rel":245001},"https://api.unified.to/docs/supabase-ddl-verification.sql",[214],[245003],{"type":17,"tag":48,"props":245004,"children":245005},{},[245006],{"type":23,"value":245007},"supabase_ddl_verification.sql",{"type":17,"tag":239,"props":245009,"children":245011},{"id":245010},"what-the-ddl-gives-you",[245012],{"type":23,"value":245013},"What the DDL gives you",{"type":17,"tag":80,"props":245015,"children":245016},{},[245017,245029,245041,245046],{"type":17,"tag":84,"props":245018,"children":245019},{},[245020,245022,245028],{"type":23,"value":245021},"Tables in the default schema (typically ",{"type":17,"tag":6121,"props":245023,"children":245025},{"className":245024},[],[245026],{"type":23,"value":245027},"public",{"type":23,"value":12034},{"type":17,"tag":84,"props":245030,"children":245031},{},[245032,245034,245040],{"type":23,"value":245033},"Consistent naming (",{"type":17,"tag":6121,"props":245035,"children":245037},{"className":245036},[],[245038],{"type":23,"value":245039},"unified_\u003Ccategory>_\u003Cobject>",{"type":23,"value":12034},{"type":17,"tag":84,"props":245042,"children":245043},{},[245044],{"type":23,"value":245045},"Columns that match Unified's normalized fields",{"type":17,"tag":84,"props":245047,"children":245048},{},[245049],{"type":23,"value":245050},"Read-only mappings (no primary keys, indexes, or constraints enforced)",{"type":17,"tag":239,"props":245052,"children":245054},{"id":245053},"apply-the-ddl",[245055],{"type":23,"value":245056},"Apply the DDL",{"type":17,"tag":6154,"props":245058,"children":245059},{},[245060,245070,245075],{"type":17,"tag":84,"props":245061,"children":245062},{},[245063,245065],{"type":23,"value":245064},"Open ",{"type":17,"tag":48,"props":245066,"children":245067},{},[245068],{"type":23,"value":245069},"Supabase Dashboard → SQL Editor",{"type":17,"tag":84,"props":245071,"children":245072},{},[245073],{"type":23,"value":245074},"Paste the DDL (for a single category or all categories)",{"type":17,"tag":84,"props":245076,"children":245077},{},[245078],{"type":23,"value":245079},"Run the query",{"type":17,"tag":29,"props":245081,"children":245082},{},[245083,245088],{"type":17,"tag":48,"props":245084,"children":245085},{},[245086],{"type":23,"value":245087},"Recommendation:",{"type":23,"value":245089}," start with a single category DDL (e.g., CRM) unless you know you need multiple domains.",{"type":17,"tag":68,"props":245091,"children":245093},{"id":245092},"step-2-understand-the-schema-guarantees-and-limits",[245094],{"type":23,"value":245095},"Step 2: Understand the schema guarantees (and limits)",{"type":17,"tag":29,"props":245097,"children":245098},{},[245099],{"type":23,"value":245100},"Unified's Supabase DDL is intentionally minimal.",{"type":17,"tag":239,"props":245102,"children":245104},{"id":245103},"what-you-should-not-change",[245105],{"type":23,"value":245106},"What you should not change",{"type":17,"tag":80,"props":245108,"children":245109},{},[245110,245115,245120],{"type":17,"tag":84,"props":245111,"children":245112},{},[245113],{"type":23,"value":245114},"Do not add or remove columns on the foreign tables",{"type":17,"tag":84,"props":245116,"children":245117},{},[245118],{"type":23,"value":245119},"Do not add primary keys or constraints to the foreign tables",{"type":17,"tag":84,"props":245121,"children":245122},{},[245123],{"type":23,"value":245124},"Do not rely on foreign tables as a transactional store",{"type":17,"tag":29,"props":245126,"children":245127},{},[245128],{"type":23,"value":245129},"Altering the foreign tables can break the mapping to Unified's API.",{"type":17,"tag":239,"props":245131,"children":245133},{"id":245132},"what-you-can-safely-extend",[245134],{"type":23,"value":245135},"What you can safely extend",{"type":17,"tag":80,"props":245137,"children":245138},{},[245139,245148,245153],{"type":17,"tag":84,"props":245140,"children":245141},{},[245142,245143],{"type":23,"value":178191},{"type":17,"tag":48,"props":245144,"children":245145},{},[245146],{"type":23,"value":245147},"local tables or materialized views",{"type":17,"tag":84,"props":245149,"children":245150},{},[245151],{"type":23,"value":245152},"Add indexes and constraints to those local tables",{"type":17,"tag":84,"props":245154,"children":245155},{},[245156],{"type":23,"value":245157},"Join Unified foreign tables into your own schema",{"type":17,"tag":29,"props":245159,"children":245160},{},[245161],{"type":23,"value":245162},"This pattern keeps the Unified mapping intact while giving you full Postgres control.",{"type":17,"tag":68,"props":245164,"children":245166},{"id":245165},"step-3-how-data-is-delivered-into-supabase",[245167],{"type":23,"value":245168},"Step 3: How data is delivered into Supabase",{"type":17,"tag":29,"props":245170,"children":245171},{},[245172,245174,245179],{"type":23,"value":245173},"Unified delivers data into Supabase using the same ",{"type":17,"tag":48,"props":245175,"children":245176},{},[245177],{"type":23,"value":245178},"database webhook mechanism",{"type":23,"value":245180}," it uses for other Postgres-compatible databases.",{"type":17,"tag":29,"props":245182,"children":245183},{},[245184,245186,245191],{"type":23,"value":245185},"Supabase is treated as a database destination, not a special integration. Data flows ",{"type":17,"tag":48,"props":245187,"children":245188},{},[245189],{"type":23,"value":245190},"one-way",{"type":23,"value":245192}," from Unified into your Supabase tables using Unified's normalized data model.",{"type":17,"tag":239,"props":245194,"children":245196},{"id":245195},"how-delivery-works",[245197],{"type":23,"value":245198},"How delivery works",{"type":17,"tag":80,"props":245200,"children":245201},{},[245202,245207,245212,245217],{"type":17,"tag":84,"props":245203,"children":245204},{},[245205],{"type":23,"value":245206},"Unified listens for changes from connected SaaS platforms (via native APIs and webhooks)",{"type":17,"tag":84,"props":245208,"children":245209},{},[245210],{"type":23,"value":245211},"Those changes are normalized into Unified's standard object schemas",{"type":17,"tag":84,"props":245213,"children":245214},{},[245215],{"type":23,"value":245216},"Unified delivers inserts and updates into your Supabase database via its database webhook pipeline",{"type":17,"tag":84,"props":245218,"children":245219},{},[245220,245222,245227,245229,245234,245235],{"type":23,"value":245221},"Records are written using ",{"type":17,"tag":48,"props":245223,"children":245224},{},[245225],{"type":23,"value":245226},"upserts",{"type":23,"value":245228}," keyed by ",{"type":17,"tag":6121,"props":245230,"children":245232},{"className":245231},[],[245233],{"type":23,"value":18766},{"type":23,"value":34435},{"type":17,"tag":6121,"props":245236,"children":245238},{"className":245237},[],[245239],{"type":23,"value":25037},{"type":17,"tag":29,"props":245241,"children":245242},{},[245243],{"type":23,"value":245244},"This mechanism ensures that data written into Supabase matches the schemas created by the Supabase DDL.",{"type":17,"tag":239,"props":245246,"children":245248},{"id":245247},"important-characteristics",[245249],{"type":23,"value":245250},"Important characteristics",{"type":17,"tag":80,"props":245252,"children":245253},{},[245254,245269,245279,245288],{"type":17,"tag":84,"props":245255,"children":245256},{},[245257,245262,245264,245267],{"type":17,"tag":48,"props":245258,"children":245259},{},[245260],{"type":23,"value":245261},"One-way delivery",{"type":23,"value":245263},": data flows from Unified to Supabase only",{"type":17,"tag":3891,"props":245265,"children":245266},{},[],{"type":23,"value":245268},"Changes made directly in Supabase do not propagate back to Unified or to upstream SaaS platforms.",{"type":17,"tag":84,"props":245270,"children":245271},{},[245272,245277],{"type":17,"tag":48,"props":245273,"children":245274},{},[245275],{"type":23,"value":245276},"Upserts, not hard deletes",{"type":23,"value":245278},": if a record is removed in the source system, it is not hard-deleted from Supabase. Rows remain unless you explicitly prune them.",{"type":17,"tag":84,"props":245280,"children":245281},{},[245282,245286],{"type":17,"tag":48,"props":245283,"children":245284},{},[245285],{"type":23,"value":181515},{"type":23,"value":245287},": delivery is asynchronous. Updates typically arrive seconds to minutes after upstream changes.",{"type":17,"tag":84,"props":245289,"children":245290},{},[245291,245296],{"type":17,"tag":48,"props":245292,"children":245293},{},[245294],{"type":23,"value":245295},"Same delivery model as other databases",{"type":23,"value":245297},": Supabase does not use a custom or separate sync engine.",{"type":17,"tag":239,"props":245299,"children":245301},{"id":245300},"when-to-rely-on-this-delivery-path",[245302],{"type":23,"value":245303},"When to rely on this delivery path",{"type":17,"tag":29,"props":245305,"children":245306},{},[245307],{"type":23,"value":245308},"Use database delivery into Supabase when you want:",{"type":17,"tag":80,"props":245310,"children":245311},{},[245312,245317,245322],{"type":17,"tag":84,"props":245313,"children":245314},{},[245315],{"type":23,"value":245316},"A local, queryable mirror of Unified's normalized data",{"type":17,"tag":84,"props":245318,"children":245319},{},[245320],{"type":23,"value":245321},"SQL access for analytics, reporting, or joins",{"type":17,"tag":84,"props":245323,"children":245324},{},[245325],{"type":23,"value":245326},"A storage layer you control for downstream use cases",{"type":17,"tag":29,"props":245328,"children":245329},{},[245330],{"type":23,"value":245331},"For real-time application logic, user-initiated actions, or write operations, continue to use Unified's API or webhooks directly.",{"type":17,"tag":68,"props":245333,"children":245335},{"id":245334},"step-4-data-freshness-and-consistency",[245336],{"type":23,"value":245337},"Step 4: Data freshness and consistency",{"type":17,"tag":29,"props":245339,"children":245340},{},[245341,245343,245347],{"type":23,"value":245342},"Supabase should be treated as ",{"type":17,"tag":48,"props":245344,"children":245345},{},[245346],{"type":23,"value":71122},{"type":23,"value":54},{"type":17,"tag":239,"props":245349,"children":245351},{"id":245350},"what-to-expect",[245352],{"type":23,"value":245353},"What to expect",{"type":17,"tag":80,"props":245355,"children":245356},{},[245357,245362,245367],{"type":17,"tag":84,"props":245358,"children":245359},{},[245360],{"type":23,"value":245361},"Updates arrive seconds to minutes after upstream changes",{"type":17,"tag":84,"props":245363,"children":245364},{},[245365],{"type":23,"value":245366},"Ordering is preserved per object and connection",{"type":17,"tag":84,"props":245368,"children":245369},{},[245370],{"type":23,"value":245371},"Supabase mirrors the latest known state, not a live view",{"type":17,"tag":239,"props":245373,"children":245375},{"id":245374},"what-not-to-assume",[245376],{"type":23,"value":245377},"What not to assume",{"type":17,"tag":80,"props":245379,"children":245380},{},[245381,245386,245391],{"type":17,"tag":84,"props":245382,"children":245383},{},[245384],{"type":23,"value":245385},"Supabase is not strongly consistent",{"type":17,"tag":84,"props":245387,"children":245388},{},[245389],{"type":23,"value":245390},"Supabase is not guaranteed real-time",{"type":17,"tag":84,"props":245392,"children":245393},{},[245394],{"type":23,"value":245395},"Supabase is not a system of record",{"type":17,"tag":29,"props":245397,"children":245398},{},[245399],{"type":23,"value":245400},"For user-facing or transactional workflows, call Unified's API directly or rely on webhooks.",{"type":17,"tag":68,"props":245402,"children":245404},{"id":245403},"step-5-failure-modes-and-reliability",[245405],{"type":23,"value":245406},"Step 5: Failure modes and reliability",{"type":17,"tag":29,"props":245408,"children":245409},{},[245410],{"type":23,"value":245411},"Unified's data delivery is asynchronous and resilient, but not transactional.",{"type":17,"tag":239,"props":245413,"children":245414},{"id":36948},[245415],{"type":23,"value":245416},"Retries",{"type":17,"tag":80,"props":245418,"children":245419},{},[245420,245425],{"type":17,"tag":84,"props":245421,"children":245422},{},[245423],{"type":23,"value":245424},"Transient failures (network, database downtime) are retried automatically",{"type":17,"tag":84,"props":245426,"children":245427},{},[245428],{"type":23,"value":245429},"Backoff is applied until the destination is healthy again",{"type":17,"tag":239,"props":245431,"children":245433},{"id":245432},"error-visibility",[245434],{"type":23,"value":245435},"Error visibility",{"type":17,"tag":80,"props":245437,"children":245438},{},[245439,245444,245449],{"type":17,"tag":84,"props":245440,"children":245441},{},[245442],{"type":23,"value":245443},"Destination errors surface in the Unified dashboard",{"type":17,"tag":84,"props":245445,"children":245446},{},[245447],{"type":23,"value":245448},"Failed writes are logged with timestamps and messages",{"type":17,"tag":84,"props":245450,"children":245451},{},[245452],{"type":23,"value":245453},"Partial failures do not stop the entire stream",{"type":17,"tag":239,"props":245455,"children":245457},{"id":245456},"backfill-and-replay",[245458],{"type":23,"value":245459},"Backfill and replay",{"type":17,"tag":80,"props":245461,"children":245462},{},[245463,245468],{"type":17,"tag":84,"props":245464,"children":245465},{},[245466],{"type":23,"value":245467},"There is no selective 'replay' button",{"type":17,"tag":84,"props":245469,"children":245470},{},[245471,245473],{"type":23,"value":245472},"To backfill:\n",{"type":17,"tag":80,"props":245474,"children":245475},{},[245476,245481],{"type":17,"tag":84,"props":245477,"children":245478},{},[245479],{"type":23,"value":245480},"Re-enable the destination, or",{"type":17,"tag":84,"props":245482,"children":245483},{},[245484],{"type":23,"value":245485},"Re-pull data via API and upsert manually",{"type":17,"tag":239,"props":245487,"children":245489},{"id":245488},"deletes",[245490],{"type":23,"value":245491},"Deletes",{"type":17,"tag":80,"props":245493,"children":245494},{},[245495,245500],{"type":17,"tag":84,"props":245496,"children":245497},{},[245498],{"type":23,"value":245499},"Source deletes are not hard-deleted in Supabase",{"type":17,"tag":84,"props":245501,"children":245502},{},[245503],{"type":23,"value":245504},"Rows remain unless you prune them yourself",{"type":17,"tag":68,"props":245506,"children":245508},{"id":245507},"how-supabase-fits-unifieds-no-storage-model",[245509],{"type":23,"value":245510},"How Supabase fits Unified's no-storage model",{"type":17,"tag":29,"props":245512,"children":245513},{},[245514],{"type":23,"value":245515},"Unified does not store your customers' data.",{"type":17,"tag":29,"props":245517,"children":245518},{},[245519],{"type":23,"value":245520},"Supabase support does not change that:",{"type":17,"tag":80,"props":245522,"children":245523},{},[245524,245529,245539,245544],{"type":17,"tag":84,"props":245525,"children":245526},{},[245527],{"type":23,"value":245528},"Unified normalizes and forwards data",{"type":17,"tag":84,"props":245530,"children":245531},{},[245532,245533,245537],{"type":23,"value":244635},{"type":17,"tag":48,"props":245534,"children":245535},{},[245536],{"type":23,"value":199669},{"type":23,"value":245538}," database",{"type":17,"tag":84,"props":245540,"children":245541},{},[245542],{"type":23,"value":245543},"Credentials are stored securely and scoped per environment",{"type":17,"tag":84,"props":245545,"children":245546},{},[245547],{"type":23,"value":245548},"Unified never reads from your database or syncs data back upstream",{"type":17,"tag":29,"props":245550,"children":245551},{},[245552],{"type":23,"value":245553},"This preserves vendor neutrality and avoids lock-in.",{"type":17,"tag":68,"props":245555,"children":245557},{"id":245556},"when-to-use-supabase-vs-api-vs-webhooks",[245558],{"type":23,"value":245559},"When to use Supabase vs API vs webhooks",{"type":17,"tag":7231,"props":245561,"children":245562},{},[245563,245578],{"type":17,"tag":7235,"props":245564,"children":245565},{},[245566],{"type":17,"tag":7239,"props":245567,"children":245568},{},[245569,245573],{"type":17,"tag":7243,"props":245570,"children":245571},{},[245572],{"type":23,"value":96563},{"type":17,"tag":7243,"props":245574,"children":245575},{},[245576],{"type":23,"value":245577},"Best option",{"type":17,"tag":7259,"props":245579,"children":245580},{},[245581,245593,245605,245617,245629,245641],{"type":17,"tag":7239,"props":245582,"children":245583},{},[245584,245589],{"type":17,"tag":7266,"props":245585,"children":245586},{},[245587],{"type":23,"value":245588},"Analytics / BI",{"type":17,"tag":7266,"props":245590,"children":245591},{},[245592],{"type":23,"value":244682},{"type":17,"tag":7239,"props":245594,"children":245595},{},[245596,245601],{"type":17,"tag":7266,"props":245597,"children":245598},{},[245599],{"type":23,"value":245600},"Reporting / dashboards",{"type":17,"tag":7266,"props":245602,"children":245603},{},[245604],{"type":23,"value":244682},{"type":17,"tag":7239,"props":245606,"children":245607},{},[245608,245613],{"type":17,"tag":7266,"props":245609,"children":245610},{},[245611],{"type":23,"value":245612},"Real-time UI reads",{"type":17,"tag":7266,"props":245614,"children":245615},{},[245616],{"type":23,"value":7806},{"type":17,"tag":7239,"props":245618,"children":245619},{},[245620,245625],{"type":17,"tag":7266,"props":245621,"children":245622},{},[245623],{"type":23,"value":245624},"Event-driven workflows",{"type":17,"tag":7266,"props":245626,"children":245627},{},[245628],{"type":23,"value":71881},{"type":17,"tag":7239,"props":245630,"children":245631},{},[245632,245637],{"type":17,"tag":7266,"props":245633,"children":245634},{},[245635],{"type":23,"value":245636},"Writes / mutations",{"type":17,"tag":7266,"props":245638,"children":245639},{},[245640],{"type":23,"value":7806},{"type":17,"tag":7239,"props":245642,"children":245643},{},[245644,245649],{"type":17,"tag":7266,"props":245645,"children":245646},{},[245647],{"type":23,"value":245648},"Auditing / joins",{"type":17,"tag":7266,"props":245650,"children":245651},{},[245652],{"type":23,"value":244682},{"type":17,"tag":29,"props":245654,"children":245655},{},[245656,245658,245663],{"type":23,"value":245657},"Most production systems use ",{"type":17,"tag":48,"props":245659,"children":245660},{},[245661],{"type":23,"value":245662},"both",{"type":23,"value":245664},": API/webhooks for real-time paths, Supabase for analytics and queries.",{"type":17,"tag":68,"props":245666,"children":245667},{"id":44585},[245668],{"type":23,"value":44588},{"type":17,"tag":29,"props":245670,"children":245671},{},[245672,245674,245679],{"type":23,"value":245673},"Using Supabase with Unified.to is about ",{"type":17,"tag":48,"props":245675,"children":245676},{},[245677],{"type":23,"value":245678},"mirroring",{"type":23,"value":245680},", not replacing, the integration layer.",{"type":17,"tag":80,"props":245682,"children":245683},{},[245684,245689,245694],{"type":17,"tag":84,"props":245685,"children":245686},{},[245687],{"type":23,"value":245688},"Use Unified to integrate and normalize data in real time",{"type":17,"tag":84,"props":245690,"children":245691},{},[245692],{"type":23,"value":245693},"Use Supabase to query, analyze, and join that data",{"type":17,"tag":84,"props":245695,"children":245696},{},[245697],{"type":23,"value":245698},"Keep writes, auth, and real-time logic at the API/webhook layer",{"type":17,"tag":29,"props":245700,"children":245701},{},[245702],{"type":23,"value":245703},"This separation keeps your system flexible, scalable, and vendor-neutral.",{"type":17,"tag":29,"props":245705,"children":245706},{},[245707],{"type":17,"tag":48,"props":245708,"children":245709},{},[245710],{"type":23,"value":244383},{"type":17,"tag":80,"props":245712,"children":245713},{},[245714,245723,245733,245741],{"type":17,"tag":84,"props":245715,"children":245716},{},[245717],{"type":17,"tag":133,"props":245718,"children":245720},{"href":43547,"rel":245719},[214],[245721],{"type":23,"value":245722},"Unified API docs",{"type":17,"tag":84,"props":245724,"children":245725},{},[245726],{"type":17,"tag":133,"props":245727,"children":245730},{"href":245728,"rel":245729},"https://docs.unified.to/reference/sdks#sdks",[214],[245731],{"type":23,"value":245732},"Supabase DDL files: available per category",{"type":17,"tag":84,"props":245734,"children":245735},{},[245736],{"type":17,"tag":133,"props":245737,"children":245739},{"href":1612,"rel":245738},[214],[245740],{"type":23,"value":1616},{"type":17,"tag":84,"props":245742,"children":245743},{},[245744],{"type":17,"tag":133,"props":245745,"children":245747},{"href":1623,"rel":245746},[214],[245748],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":245750},[245751,245752,245753,245757,245761,245766,245770,245776,245777,245778],{"id":244593,"depth":1629,"text":244596},{"id":244650,"depth":1629,"text":244653},{"id":244697,"depth":1629,"text":244700,"children":245754},[245755,245756],{"id":245010,"depth":1635,"text":245013},{"id":245053,"depth":1635,"text":245056},{"id":245092,"depth":1629,"text":245095,"children":245758},[245759,245760],{"id":245103,"depth":1635,"text":245106},{"id":245132,"depth":1635,"text":245135},{"id":245165,"depth":1629,"text":245168,"children":245762},[245763,245764,245765],{"id":245195,"depth":1635,"text":245198},{"id":245247,"depth":1635,"text":245250},{"id":245300,"depth":1635,"text":245303},{"id":245334,"depth":1629,"text":245337,"children":245767},[245768,245769],{"id":245350,"depth":1635,"text":245353},{"id":245374,"depth":1635,"text":245377},{"id":245403,"depth":1629,"text":245406,"children":245771},[245772,245773,245774,245775],{"id":36948,"depth":1635,"text":245416},{"id":245432,"depth":1635,"text":245435},{"id":245456,"depth":1635,"text":245459},{"id":245488,"depth":1635,"text":245491},{"id":245507,"depth":1629,"text":245510},{"id":245556,"depth":1629,"text":245559},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_use_supabase_with_unified.md","blog/how_to_use_supabase_with_unified.md","blog/how_to_use_supabase_with_unified",{"_path":245783,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":216881,"description":245784,"img":245785,"date":245786,"tag":12,"body":245787,"_type":1677,"_id":246809,"_source":1679,"_file":246810,"_stem":246811,"_extension":1682},"/blog/how_to_use_postman_with_unified","Postman is the fastest way to explore, understand, and debug the Unified.to API before you write application code.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_postman_with_unified-icon.png","2025-12-19T14:15:00.000Z",{"type":14,"children":245788,"toc":246786},[245789,245794,245797,245804,245816,245821,245826,245832,245837,245865,245876,245882,245887,245892,245920,245925,245931,245941,245946,246048,246053,246094,246099,246111,246143,246149,246154,246163,246167,246208,246213,246224,246235,246246,246257,246280,246285,246291,246296,246302,246311,246316,246343,246349,246358,246363,246369,246381,246385,246414,246419,246445,246450,246456,246576,246581,246587,246592,246598,246616,246622,246640,246645,246657,246662,246694,246699,246712,246716,246721,246739,246744,246751],{"type":17,"tag":18,"props":245790,"children":245792},{"id":245791},"how-to-use-postman-with-unifiedto",[245793],{"type":23,"value":216881},{"type":17,"tag":25,"props":245795,"children":245796},{},[],{"type":17,"tag":29,"props":245798,"children":245799},{},[245800],{"type":17,"tag":33,"props":245801,"children":245802},{},[245803],{"type":23,"value":244548},{"type":17,"tag":29,"props":245805,"children":245806},{},[245807,245809,245814],{"type":23,"value":245808},"Postman is the fastest way to explore, understand, and debug the ",{"type":17,"tag":133,"props":245810,"children":245812},{"href":42620,"rel":245811},[214],[245813],{"type":23,"value":217},{"type":23,"value":245815}," API before you write application code.",{"type":17,"tag":29,"props":245817,"children":245818},{},[245819],{"type":23,"value":245820},"Unified.to provides an official Postman workspace and collection that mirrors the real production API: same endpoints, same auth model, same normalized data. This makes Postman ideal for learning the API surface, validating integrations, and troubleshooting requests.",{"type":17,"tag":29,"props":245822,"children":245823},{},[245824],{"type":23,"value":245825},"This guide explains how to use Postman correctly with Unified.to, what you need to configure, and where Postman fits (and doesn't fit) in your development workflow.",{"type":17,"tag":68,"props":245827,"children":245829},{"id":245828},"when-postman-is-the-right-tool",[245830],{"type":23,"value":245831},"When Postman is the right tool",{"type":17,"tag":29,"props":245833,"children":245834},{},[245835],{"type":23,"value":245836},"Postman works best for:",{"type":17,"tag":80,"props":245838,"children":245839},{},[245840,245845,245850,245855,245860],{"type":17,"tag":84,"props":245841,"children":245842},{},[245843],{"type":23,"value":245844},"Exploring Unified's API categories and objects",{"type":17,"tag":84,"props":245846,"children":245847},{},[245848],{"type":23,"value":245849},"Verifying authentication and permissions",{"type":17,"tag":84,"props":245851,"children":245852},{},[245853],{"type":23,"value":245854},"Testing read-only requests against real integrations",{"type":17,"tag":84,"props":245856,"children":245857},{},[245858],{"type":23,"value":245859},"Debugging request payloads, parameters, and responses",{"type":17,"tag":84,"props":245861,"children":245862},{},[245863],{"type":23,"value":245864},"Sharing reproducible API examples with teammates",{"type":17,"tag":29,"props":245866,"children":245867},{},[245868,245870,245874],{"type":23,"value":245869},"Postman is ",{"type":17,"tag":48,"props":245871,"children":245872},{},[245873],{"type":23,"value":159475},{"type":23,"value":245875}," intended for production workloads, automation, or customer-facing usage. Those belong in your backend using SDKs or raw REST.",{"type":17,"tag":68,"props":245877,"children":245879},{"id":245878},"step-1-import-the-unifiedto-postman-collection",[245880],{"type":23,"value":245881},"Step 1: Import the Unified.to Postman collection",{"type":17,"tag":29,"props":245883,"children":245884},{},[245885],{"type":23,"value":245886},"Unified maintains an official Postman workspace containing pre-configured requests for all API categories.",{"type":17,"tag":29,"props":245888,"children":245889},{},[245890],{"type":23,"value":245891},"You can access it in two ways:",{"type":17,"tag":80,"props":245893,"children":245894},{},[245895,245907],{"type":17,"tag":84,"props":245896,"children":245897},{},[245898,245899,245905],{"type":23,"value":146703},{"type":17,"tag":133,"props":245900,"children":245902},{"href":245901},"/2ce6207b838480ca9c65e76e3f68e55f",[245903],{"type":23,"value":245904},"Unified.to Postman workspace",{"type":23,"value":245906}," directly",{"type":17,"tag":84,"props":245908,"children":245909},{},[245910,245912,245918],{"type":23,"value":245911},"Or download and import a ",{"type":17,"tag":6121,"props":245913,"children":245915},{"className":245914},[],[245916],{"type":23,"value":245917},"collection.json",{"type":23,"value":245919}," file (either the full API or category-specific collections like CRM, Calendar, HRIS, etc.)",{"type":17,"tag":29,"props":245921,"children":245922},{},[245923],{"type":23,"value":245924},"Each collection mirrors the REST API exactly—no Postman-specific abstractions.",{"type":17,"tag":68,"props":245926,"children":245928},{"id":245927},"step-2-create-a-postman-environment",[245929],{"type":23,"value":245930},"Step 2: Create a Postman environment",{"type":17,"tag":29,"props":245932,"children":245933},{},[245934,245935,245939],{"type":23,"value":235791},{"type":17,"tag":48,"props":245936,"children":245937},{},[245938],{"type":23,"value":159475},{"type":23,"value":245940}," ship a pre-configured Postman environment. You'll need to create one manually.",{"type":17,"tag":29,"props":245942,"children":245943},{},[245944],{"type":23,"value":245945},"At minimum, define the following environment variables:",{"type":17,"tag":7231,"props":245947,"children":245948},{},[245949,245968],{"type":17,"tag":7235,"props":245950,"children":245951},{},[245952],{"type":17,"tag":7239,"props":245953,"children":245954},{},[245955,245960,245964],{"type":17,"tag":7243,"props":245956,"children":245957},{},[245958],{"type":23,"value":245959},"Variable",{"type":17,"tag":7243,"props":245961,"children":245962},{},[245963],{"type":23,"value":24525},{"type":17,"tag":7243,"props":245965,"children":245966},{},[245967],{"type":23,"value":7377},{"type":17,"tag":7259,"props":245969,"children":245970},{},[245971,245997,246023],{"type":17,"tag":7239,"props":245972,"children":245973},{},[245974,245983,245988],{"type":17,"tag":7266,"props":245975,"children":245976},{},[245977],{"type":17,"tag":6121,"props":245978,"children":245980},{"className":245979},[],[245981],{"type":23,"value":245982},"api_key",{"type":17,"tag":7266,"props":245984,"children":245985},{},[245986],{"type":23,"value":245987},"Your Unified workspace API key",{"type":17,"tag":7266,"props":245989,"children":245990},{},[245991],{"type":17,"tag":6121,"props":245992,"children":245994},{"className":245993},[],[245995],{"type":23,"value":245996},"unified_live_...",{"type":17,"tag":7239,"props":245998,"children":245999},{},[246000,246009,246014],{"type":17,"tag":7266,"props":246001,"children":246002},{},[246003],{"type":17,"tag":6121,"props":246004,"children":246006},{"className":246005},[],[246007],{"type":23,"value":246008},"base_url",{"type":17,"tag":7266,"props":246010,"children":246011},{},[246012],{"type":23,"value":246013},"API base URL (region-specific)",{"type":17,"tag":7266,"props":246015,"children":246016},{},[246017],{"type":17,"tag":6121,"props":246018,"children":246020},{"className":246019},[],[246021],{"type":23,"value":246022},"https://api.unified.to",{"type":17,"tag":7239,"props":246024,"children":246025},{},[246026,246034,246039],{"type":17,"tag":7266,"props":246027,"children":246028},{},[246029],{"type":17,"tag":6121,"props":246030,"children":246032},{"className":246031},[],[246033],{"type":23,"value":25037},{"type":17,"tag":7266,"props":246035,"children":246036},{},[246037],{"type":23,"value":246038},"End-customer connection identifier",{"type":17,"tag":7266,"props":246040,"children":246041},{},[246042],{"type":17,"tag":6121,"props":246043,"children":246045},{"className":246044},[],[246046],{"type":23,"value":246047},"con_abc123",{"type":17,"tag":29,"props":246049,"children":246050},{},[246051],{"type":23,"value":246052},"Optional (but useful):",{"type":17,"tag":80,"props":246054,"children":246055},{},[246056,246073],{"type":17,"tag":84,"props":246057,"children":246058},{},[246059,246064,246066,246072],{"type":17,"tag":6121,"props":246060,"children":246062},{"className":246061},[],[246063],{"type":23,"value":48389},{"type":23,"value":246065}," – default page size (e.g. ",{"type":17,"tag":6121,"props":246067,"children":246069},{"className":246068},[],[246070],{"type":23,"value":246071},"25",{"type":23,"value":12034},{"type":17,"tag":84,"props":246074,"children":246075},{},[246076,246082,246083,246088,246090],{"type":17,"tag":6121,"props":246077,"children":246079},{"className":246078},[],[246080],{"type":23,"value":246081},"cursor",{"type":23,"value":75890},{"type":17,"tag":6121,"props":246084,"children":246086},{"className":246085},[],[246087],{"type":23,"value":48411},{"type":23,"value":246089}," – for ",{"type":17,"tag":133,"props":246091,"children":246092},{"href":1857},[246093],{"type":23,"value":1860},{"type":17,"tag":239,"props":246095,"children":246096},{"id":48883},[246097],{"type":23,"value":246098},"Regions",{"type":17,"tag":29,"props":246100,"children":246101},{},[246102,246104,246109],{"type":23,"value":246103},"Unified operates fully isolated regions. Your ",{"type":17,"tag":6121,"props":246105,"children":246107},{"className":246106},[],[246108],{"type":23,"value":246008},{"type":23,"value":246110}," should match where your workspace is provisioned:",{"type":17,"tag":80,"props":246112,"children":246113},{},[246114,246123,246133],{"type":17,"tag":84,"props":246115,"children":246116},{},[246117,246118],{"type":23,"value":240676},{"type":17,"tag":6121,"props":246119,"children":246121},{"className":246120},[],[246122],{"type":23,"value":246022},{"type":17,"tag":84,"props":246124,"children":246125},{},[246126,246127],{"type":23,"value":240686},{"type":17,"tag":6121,"props":246128,"children":246130},{"className":246129},[],[246131],{"type":23,"value":246132},"https://api-eu.unified.to",{"type":17,"tag":84,"props":246134,"children":246135},{},[246136,246137],{"type":23,"value":240696},{"type":17,"tag":6121,"props":246138,"children":246140},{"className":246139},[],[246141],{"type":23,"value":246142},"https://api-au.unified.to",{"type":17,"tag":68,"props":246144,"children":246146},{"id":246145},"step-3-how-authentication-works-in-postman",[246147],{"type":23,"value":246148},"Step 3: How authentication works in Postman",{"type":17,"tag":29,"props":246150,"children":246151},{},[246152],{"type":23,"value":246153},"Authentication is handled via a standard HTTP header on every request:",{"type":17,"tag":6893,"props":246155,"children":246158},{"className":246156,"code":246157,"language":20901,"meta":23},[20899],"Authorization: Bearer {{api_key}}\n",[246159],{"type":17,"tag":6121,"props":246160,"children":246161},{"__ignoreMap":7},[246162],{"type":23,"value":246157},{"type":17,"tag":29,"props":246164,"children":246165},{},[246166],{"type":23,"value":19821},{"type":17,"tag":80,"props":246168,"children":246169},{},[246170,246182,246193,246198],{"type":17,"tag":84,"props":246171,"children":246172},{},[246173,246175,246180],{"type":23,"value":246174},"Auth is defined at the ",{"type":17,"tag":48,"props":246176,"children":246177},{},[246178],{"type":23,"value":246179},"collection level",{"type":23,"value":246181},", not per request",{"type":17,"tag":84,"props":246183,"children":246184},{},[246185,246187,246191],{"type":23,"value":246186},"No ",{"type":17,"tag":133,"props":246188,"children":246189},{"href":779},[246190],{"type":23,"value":782},{"type":23,"value":246192}," flow runs inside Postman",{"type":17,"tag":84,"props":246194,"children":246195},{},[246196],{"type":23,"value":246197},"No pre-request scripts are required",{"type":17,"tag":84,"props":246199,"children":246200},{},[246201,246203],{"type":23,"value":246202},"The API key must belong to the workspace that owns the ",{"type":17,"tag":6121,"props":246204,"children":246206},{"className":246205},[],[246207],{"type":23,"value":25037},{"type":17,"tag":29,"props":246209,"children":246210},{},[246211],{"type":23,"value":246212},"If authentication fails, Unified returns a standard JSON error with a 401 or 403 status.",{"type":17,"tag":68,"props":246214,"children":246216},{"id":246215},"step-4-understand-the-role-of-connection_id",[246217,246219],{"type":23,"value":246218},"Step 4: Understand the role of ",{"type":17,"tag":6121,"props":246220,"children":246222},{"className":246221},[],[246223],{"type":23,"value":25037},{"type":17,"tag":29,"props":246225,"children":246226},{},[246227,246229,246234],{"type":23,"value":246228},"Every Unified request is scoped to a ",{"type":17,"tag":48,"props":246230,"children":246231},{},[246232],{"type":23,"value":246233},"customer connection",{"type":23,"value":54},{"type":17,"tag":29,"props":246236,"children":246237},{},[246238,246239,246244],{"type":23,"value":9619},{"type":17,"tag":6121,"props":246240,"children":246242},{"className":246241},[],[246243],{"type":23,"value":25037},{"type":23,"value":246245}," represents a single authorized third-party account (for example, one Salesforce org or one Google Drive account).",{"type":17,"tag":29,"props":246247,"children":246248},{},[246249,246251,246255],{"type":23,"value":246250},"Postman does ",{"type":17,"tag":48,"props":246252,"children":246253},{},[246254],{"type":23,"value":159475},{"type":23,"value":246256}," create connections. You must:",{"type":17,"tag":6154,"props":246258,"children":246259},{},[246260,246265,246275],{"type":17,"tag":84,"props":246261,"children":246262},{},[246263],{"type":23,"value":246264},"Authorize a connection using Unified's dashboard or embedded auth",{"type":17,"tag":84,"props":246266,"children":246267},{},[246268,246270],{"type":23,"value":246269},"Copy the resulting ",{"type":17,"tag":6121,"props":246271,"children":246273},{"className":246272},[],[246274],{"type":23,"value":25037},{"type":17,"tag":84,"props":246276,"children":246277},{},[246278],{"type":23,"value":246279},"Paste it into your Postman environment",{"type":17,"tag":29,"props":246281,"children":246282},{},[246283],{"type":23,"value":246284},"Once set, the same request works across all supported vendors in that category.",{"type":17,"tag":68,"props":246286,"children":246288},{"id":246287},"step-5-make-your-first-request-recommended-example",[246289],{"type":23,"value":246290},"Step 5: Make your first request (recommended example)",{"type":17,"tag":29,"props":246292,"children":246293},{},[246294],{"type":23,"value":246295},"A good first request is a simple, read-only endpoint that exists across many integrations.",{"type":17,"tag":239,"props":246297,"children":246299},{"id":246298},"example-list-crm-contacts",[246300],{"type":23,"value":246301},"Example: List CRM contacts",{"type":17,"tag":6893,"props":246303,"children":246306},{"className":246304,"code":246305,"language":20901,"meta":23},[20899],"GET {{base_url}}/crm/{{connection_id}}/contact?limit=25\n",[246307],{"type":17,"tag":6121,"props":246308,"children":246309},{"__ignoreMap":7},[246310],{"type":23,"value":246305},{"type":17,"tag":29,"props":246312,"children":246313},{},[246314],{"type":23,"value":246315},"Why this endpoint:",{"type":17,"tag":80,"props":246317,"children":246318},{},[246319,246323,246328,246333,246338],{"type":17,"tag":84,"props":246320,"children":246321},{},[246322],{"type":23,"value":185706},{"type":17,"tag":84,"props":246324,"children":246325},{},[246326],{"type":23,"value":246327},"Minimal permissions",{"type":17,"tag":84,"props":246329,"children":246330},{},[246331],{"type":23,"value":246332},"Supported across most CRMs",{"type":17,"tag":84,"props":246334,"children":246335},{},[246336],{"type":23,"value":246337},"Returns normalized data",{"type":17,"tag":84,"props":246339,"children":246340},{},[246341],{"type":23,"value":246342},"Works reliably for first-time testing",{"type":17,"tag":239,"props":246344,"children":246346},{"id":246345},"high-level-response-shape",[246347],{"type":23,"value":246348},"High-level response shape",{"type":17,"tag":6893,"props":246350,"children":246353},{"className":246351,"code":246352,"language":22503,"meta":7},[22501],"{\n  \"data\": [\n    {\n      \"id\": \"string\",\n      \"name\": \"string\",\n      \"emails\": [],\n      \"phones\": [],\n      \"created_at\": \"timestamp\",\n      \"updated_at\": \"timestamp\"\n    }\n  ],\n  \"next_cursor\": \"string | null\"\n}\n",[246354],{"type":17,"tag":6121,"props":246355,"children":246356},{"__ignoreMap":7},[246357],{"type":23,"value":246352},{"type":17,"tag":29,"props":246359,"children":246360},{},[246361],{"type":23,"value":246362},"Unified normalizes fields across vendors, so the response shape is consistent whether the source is Salesforce, HubSpot, or Zoho.",{"type":17,"tag":68,"props":246364,"children":246366},{"id":246365},"step-6-pagination-behavior",[246367],{"type":23,"value":246368},"Step 6: Pagination behavior",{"type":17,"tag":29,"props":246370,"children":246371},{},[246372,246374,246379],{"type":23,"value":246373},"Unified uses ",{"type":17,"tag":48,"props":246375,"children":246376},{},[246377],{"type":23,"value":246378},"explicit pagination",{"type":23,"value":246380},". Postman does not auto-paginate.",{"type":17,"tag":29,"props":246382,"children":246383},{},[246384],{"type":23,"value":202398},{"type":17,"tag":80,"props":246386,"children":246387},{},[246388,246398],{"type":17,"tag":84,"props":246389,"children":246390},{},[246391,246396],{"type":17,"tag":6121,"props":246392,"children":246394},{"className":246393},[],[246395],{"type":23,"value":48389},{"type":23,"value":246397}," – number of records per request",{"type":17,"tag":84,"props":246399,"children":246400},{},[246401,246406,246407,246412],{"type":17,"tag":6121,"props":246402,"children":246404},{"className":246403},[],[246405],{"type":23,"value":246081},{"type":23,"value":75890},{"type":17,"tag":6121,"props":246408,"children":246410},{"className":246409},[],[246411],{"type":23,"value":48411},{"type":23,"value":246413}," – provided in the response",{"type":17,"tag":29,"props":246415,"children":246416},{},[246417],{"type":23,"value":246418},"To fetch additional pages:",{"type":17,"tag":6154,"props":246420,"children":246421},{},[246422,246435,246440],{"type":17,"tag":84,"props":246423,"children":246424},{},[246425,246427,246433],{"type":23,"value":246426},"Copy ",{"type":17,"tag":6121,"props":246428,"children":246430},{"className":246429},[],[246431],{"type":23,"value":246432},"next_cursor",{"type":23,"value":246434}," from the response",{"type":17,"tag":84,"props":246436,"children":246437},{},[246438],{"type":23,"value":246439},"Set it as an environment variable",{"type":17,"tag":84,"props":246441,"children":246442},{},[246443],{"type":23,"value":246444},"Re-run the request",{"type":17,"tag":29,"props":246446,"children":246447},{},[246448],{"type":23,"value":246449},"Each page counts as a separate API call.",{"type":17,"tag":68,"props":246451,"children":246453},{"id":246452},"step-7-common-errors-youll-see-in-postman",[246454],{"type":23,"value":246455},"Step 7: Common errors you'll see in Postman",{"type":17,"tag":7231,"props":246457,"children":246458},{},[246459,246479],{"type":17,"tag":7235,"props":246460,"children":246461},{},[246462],{"type":17,"tag":7239,"props":246463,"children":246464},{},[246465,246469,246474],{"type":17,"tag":7243,"props":246466,"children":246467},{},[246468],{"type":23,"value":20328},{"type":17,"tag":7243,"props":246470,"children":246471},{},[246472],{"type":23,"value":246473},"Cause",{"type":17,"tag":7243,"props":246475,"children":246476},{},[246477],{"type":23,"value":246478},"What to check",{"type":17,"tag":7259,"props":246480,"children":246481},{},[246482,246503,246520,246542,246559],{"type":17,"tag":7239,"props":246483,"children":246484},{},[246485,246489,246494],{"type":17,"tag":7266,"props":246486,"children":246487},{},[246488],{"type":23,"value":139168},{"type":17,"tag":7266,"props":246490,"children":246491},{},[246492],{"type":23,"value":246493},"Missing or invalid API key",{"type":17,"tag":7266,"props":246495,"children":246496},{},[246497,246502],{"type":17,"tag":6121,"props":246498,"children":246500},{"className":246499},[],[246501],{"type":23,"value":7306},{"type":23,"value":71198},{"type":17,"tag":7239,"props":246504,"children":246505},{},[246506,246510,246515],{"type":17,"tag":7266,"props":246507,"children":246508},{},[246509],{"type":23,"value":225602},{"type":17,"tag":7266,"props":246511,"children":246512},{},[246513],{"type":23,"value":246514},"Integration not enabled",{"type":17,"tag":7266,"props":246516,"children":246517},{},[246518],{"type":23,"value":246519},"Category enabled in dashboard",{"type":17,"tag":7239,"props":246521,"children":246522},{},[246523,246527,246537],{"type":17,"tag":7266,"props":246524,"children":246525},{},[246526],{"type":23,"value":139189},{"type":17,"tag":7266,"props":246528,"children":246529},{},[246530,246532],{"type":23,"value":246531},"Missing ",{"type":17,"tag":6121,"props":246533,"children":246535},{"className":246534},[],[246536],{"type":23,"value":25037},{"type":17,"tag":7266,"props":246538,"children":246539},{},[246540],{"type":23,"value":246541},"Environment variable set",{"type":17,"tag":7239,"props":246543,"children":246544},{},[246545,246549,246554],{"type":17,"tag":7266,"props":246546,"children":246547},{},[246548],{"type":23,"value":225613},{"type":17,"tag":7266,"props":246550,"children":246551},{},[246552],{"type":23,"value":246553},"Invalid endpoint",{"type":17,"tag":7266,"props":246555,"children":246556},{},[246557],{"type":23,"value":246558},"Category path or object name",{"type":17,"tag":7239,"props":246560,"children":246561},{},[246562,246566,246571],{"type":17,"tag":7266,"props":246563,"children":246564},{},[246565],{"type":23,"value":139179},{"type":17,"tag":7266,"props":246567,"children":246568},{},[246569],{"type":23,"value":246570},"Rate limited",{"type":17,"tag":7266,"props":246572,"children":246573},{},[246574],{"type":23,"value":246575},"Reduce request frequency",{"type":17,"tag":29,"props":246577,"children":246578},{},[246579],{"type":23,"value":246580},"All errors return structured JSON with a message and error code.",{"type":17,"tag":68,"props":246582,"children":246584},{"id":246583},"postman-vs-openapi-import",[246585],{"type":23,"value":246586},"Postman vs OpenAPI import",{"type":17,"tag":29,"props":246588,"children":246589},{},[246590],{"type":23,"value":246591},"Unified supports both approaches:",{"type":17,"tag":239,"props":246593,"children":246595},{"id":246594},"use-the-postman-collection-when",[246596],{"type":23,"value":246597},"Use the Postman collection when:",{"type":17,"tag":80,"props":246599,"children":246600},{},[246601,246606,246611],{"type":17,"tag":84,"props":246602,"children":246603},{},[246604],{"type":23,"value":246605},"You want ready-to-run examples",{"type":17,"tag":84,"props":246607,"children":246608},{},[246609],{"type":23,"value":246610},"You're exploring the API for the first time",{"type":17,"tag":84,"props":246612,"children":246613},{},[246614],{"type":23,"value":246615},"You want curated, validated requests",{"type":17,"tag":239,"props":246617,"children":246619},{"id":246618},"import-openapi-when",[246620],{"type":23,"value":246621},"Import OpenAPI when:",{"type":17,"tag":80,"props":246623,"children":246624},{},[246625,246630,246635],{"type":17,"tag":84,"props":246626,"children":246627},{},[246628],{"type":23,"value":246629},"You want to generate your own Postman structure",{"type":17,"tag":84,"props":246631,"children":246632},{},[246633],{"type":23,"value":246634},"You're testing specific subsets of the API",{"type":17,"tag":84,"props":246636,"children":246637},{},[246638],{"type":23,"value":246639},"You're building mocks or documentation",{"type":17,"tag":29,"props":246641,"children":246642},{},[246643],{"type":23,"value":246644},"For most developers, the official Postman collection is the fastest starting point.",{"type":17,"tag":68,"props":246646,"children":246648},{"id":246647},"what-postman-should-not-be-used-for",[246649,246651,246655],{"type":23,"value":246650},"What Postman should ",{"type":17,"tag":33,"props":246652,"children":246653},{},[246654],{"type":23,"value":159475},{"type":23,"value":246656}," be used for",{"type":17,"tag":29,"props":246658,"children":246659},{},[246660],{"type":23,"value":246661},"Postman is not suitable for:",{"type":17,"tag":80,"props":246663,"children":246664},{},[246665,246670,246675,246680,246689],{"type":17,"tag":84,"props":246666,"children":246667},{},[246668],{"type":23,"value":246669},"Production API traffic",{"type":17,"tag":84,"props":246671,"children":246672},{},[246673],{"type":23,"value":246674},"Background jobs or syncs",{"type":17,"tag":84,"props":246676,"children":246677},{},[246678],{"type":23,"value":246679},"Customer-initiated requests",{"type":17,"tag":84,"props":246681,"children":246682},{},[246683,246687],{"type":17,"tag":133,"props":246684,"children":246685},{"href":4999},[246686],{"type":23,"value":43896},{"type":23,"value":246688}," or streaming",{"type":17,"tag":84,"props":246690,"children":246691},{},[246692],{"type":23,"value":246693},"Load testing",{"type":17,"tag":29,"props":246695,"children":246696},{},[246697],{"type":23,"value":246698},"Once you understand the API, move to:",{"type":17,"tag":80,"props":246700,"children":246701},{},[246702,246707],{"type":17,"tag":84,"props":246703,"children":246704},{},[246705],{"type":23,"value":246706},"Unified SDKs (TypeScript, Python, Go, etc.)",{"type":17,"tag":84,"props":246708,"children":246709},{},[246710],{"type":23,"value":246711},"Or raw REST calls from your backend",{"type":17,"tag":68,"props":246713,"children":246714},{"id":44585},[246715],{"type":23,"value":44588},{"type":17,"tag":29,"props":246717,"children":246718},{},[246719],{"type":23,"value":246720},"Postman is the quickest way to get hands-on with Unified.to:",{"type":17,"tag":80,"props":246722,"children":246723},{},[246724,246729,246734],{"type":17,"tag":84,"props":246725,"children":246726},{},[246727],{"type":23,"value":246728},"One API key",{"type":17,"tag":84,"props":246730,"children":246731},{},[246732],{"type":23,"value":246733},"One connection ID",{"type":17,"tag":84,"props":246735,"children":246736},{},[246737],{"type":23,"value":246738},"One request works across dozens of integrations",{"type":17,"tag":29,"props":246740,"children":246741},{},[246742],{"type":23,"value":246743},"Use Postman to explore, debug, and validate. When you're ready to ship, move the same requests into your backend—unchanged.",{"type":17,"tag":29,"props":246745,"children":246746},{},[246747],{"type":17,"tag":48,"props":246748,"children":246749},{},[246750],{"type":23,"value":244383},{"type":17,"tag":80,"props":246752,"children":246753},{},[246754,246763,246770,246778],{"type":17,"tag":84,"props":246755,"children":246756},{},[246757],{"type":17,"tag":133,"props":246758,"children":246760},{"href":246759},"/2bb6207b83848036a1ecde98c2b89ff6",[246761],{"type":23,"value":246762},"Unified Postman workspace",{"type":17,"tag":84,"props":246764,"children":246765},{},[246766],{"type":17,"tag":133,"props":246767,"children":246768},{"href":246759},[246769],{"type":23,"value":245722},{"type":17,"tag":84,"props":246771,"children":246772},{},[246773],{"type":17,"tag":133,"props":246774,"children":246776},{"href":1612,"rel":246775},[214],[246777],{"type":23,"value":1616},{"type":17,"tag":84,"props":246779,"children":246780},{},[246781],{"type":17,"tag":133,"props":246782,"children":246784},{"href":1623,"rel":246783},[214],[246785],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":246787},[246788,246789,246790,246793,246794,246796,246800,246801,246802,246806,246808],{"id":245828,"depth":1629,"text":245831},{"id":245878,"depth":1629,"text":245881},{"id":245927,"depth":1629,"text":245930,"children":246791},[246792],{"id":48883,"depth":1635,"text":246098},{"id":246145,"depth":1629,"text":246148},{"id":246215,"depth":1629,"text":246795},"Step 4: Understand the role of connection_id",{"id":246287,"depth":1629,"text":246290,"children":246797},[246798,246799],{"id":246298,"depth":1635,"text":246301},{"id":246345,"depth":1635,"text":246348},{"id":246365,"depth":1629,"text":246368},{"id":246452,"depth":1629,"text":246455},{"id":246583,"depth":1629,"text":246586,"children":246803},[246804,246805],{"id":246594,"depth":1635,"text":246597},{"id":246618,"depth":1635,"text":246621},{"id":246647,"depth":1629,"text":246807},"What Postman should not be used for",{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_use_postman_with_unified.md","blog/how_to_use_postman_with_unified.md","blog/how_to_use_postman_with_unified",{"_path":246813,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":240551,"description":246814,"img":246815,"date":246816,"tag":12,"body":246817,"_type":1677,"_id":247720,"_source":1679,"_file":247721,"_stem":247722,"_extension":1682},"/blog/how_to_use_unified_with_lovable","Lovable makes it easy to design and ship application logic quickly. Unified.to makes it easy to add and maintain SaaS integrations. Used together, they let you...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_with_lovable-icon.png","2025-12-19T00:00:00.000Z",{"type":14,"children":246818,"toc":247702},[246819,246824,246827,246834,246845,246850,246856,246867,246878,246883,246887,246896,246901,246907,246912,246923,246929,246944,246955,246961,246973,246985,246991,247228,247246,247251,247257,247262,247266,247308,247313,247319,247324,247369,247380,247386,247391,247435,247440,247446,247455,247460,247466,247471,247489,247494,247499,247512,247517,247540,247546,247551,247569,247574,247580,247591,247596,247630,247635,247639,247644,247675,247680,247691],{"type":17,"tag":18,"props":246820,"children":246822},{"id":246821},"how-to-use-unified-with-lovable",[246823],{"type":23,"value":240551},{"type":17,"tag":25,"props":246825,"children":246826},{},[],{"type":17,"tag":29,"props":246828,"children":246829},{},[246830],{"type":17,"tag":33,"props":246831,"children":246832},{},[246833],{"type":23,"value":244548},{"type":17,"tag":29,"props":246835,"children":246836},{},[246837,246839,246844],{"type":23,"value":246838},"Lovable makes it easy to design and ship application logic quickly. Unified.to makes it easy to add and maintain SaaS integrations. Used together, they let you build Lovable apps that can read and act on real customer data across CRMs, calendars, file storage, and more — ",{"type":17,"tag":48,"props":246840,"children":246841},{},[246842],{"type":23,"value":246843},"without embedding credentials or SDKs directly in Lovable",{"type":23,"value":54},{"type":17,"tag":29,"props":246846,"children":246847},{},[246848],{"type":23,"value":246849},"This guide explains the supported way to use Unified.to with Lovable: through a backend integration layer.",{"type":17,"tag":68,"props":246851,"children":246853},{"id":246852},"why-a-backend-layer-is-required",[246854],{"type":23,"value":246855},"Why a backend layer is required",{"type":17,"tag":29,"props":246857,"children":246858},{},[246859,246861,246866],{"type":23,"value":246860},"Lovable applications do not provide a general-purpose backend runtime and should not store secrets or API keys client-side. Unified.to APIs, by design, must be called from a secure backend using an API key and a customer-specific ",{"type":17,"tag":6121,"props":246862,"children":246864},{"className":246863},[],[246865],{"type":23,"value":19766},{"type":23,"value":54},{"type":17,"tag":29,"props":246868,"children":246869},{},[246870,246872,246876],{"type":23,"value":246871},"Because of this, Unified.to is ",{"type":17,"tag":48,"props":246873,"children":246874},{},[246875],{"type":23,"value":159475},{"type":23,"value":246877}," embedded directly inside a Lovable app. Instead, Lovable triggers backend actions, and the backend calls Unified.to.",{"type":17,"tag":29,"props":246879,"children":246880},{},[246881],{"type":23,"value":246882},"This architecture keeps credentials secure and aligns with how both platforms are designed to be used.",{"type":17,"tag":68,"props":246884,"children":246885},{"id":244650},[246886],{"type":23,"value":244653},{"type":17,"tag":6893,"props":246888,"children":246891},{"className":246889,"code":246890,"language":6898,"meta":7},[6896],"Lovable UI / Agent\n↓\nBackend action (serverless or API)\n↓\n\nUnified.to\n API\n↓\nCustomer's SaaS tools (CRM, calendar, storage, etc.)\n",[246892],{"type":17,"tag":6121,"props":246893,"children":246894},{"__ignoreMap":7},[246895],{"type":23,"value":246890},{"type":17,"tag":29,"props":246897,"children":246898},{},[246899],{"type":23,"value":246900},"Lovable handles UX and orchestration. Unified.to handles integrations and authorization. Your backend is the security boundary between them.",{"type":17,"tag":68,"props":246902,"children":246904},{"id":246903},"step-1-set-up-unifiedto",[246905],{"type":23,"value":246906},"Step 1: Set up Unified.to",{"type":17,"tag":29,"props":246908,"children":246909},{},[246910],{"type":23,"value":246911},"Create a Unified.to workspace and generate an API key.",{"type":17,"tag":29,"props":246913,"children":246914},{},[246915,246917,246921],{"type":23,"value":246916},"In Unified, enable the integration categories you plan to support (for example: CRM, Calendar, File Storage). Unified manages ",{"type":17,"tag":133,"props":246918,"children":246919},{"href":779},[246920],{"type":23,"value":782},{"type":23,"value":246922},", API keys, token refresh, and provider-specific edge cases for you.",{"type":17,"tag":68,"props":246924,"children":246926},{"id":246925},"step-2-handle-end-user-authorization",[246927],{"type":23,"value":246928},"Step 2: Handle end-user authorization",{"type":17,"tag":29,"props":246930,"children":246931},{},[246932,246934,246942],{"type":23,"value":246933},"Before your Lovable app can access a customer's SaaS data, that customer must authorize their account with Unified.to. Unified supports both OAuth-based and API-key–based integrations. In all cases, authorization results in a ",{"type":17,"tag":48,"props":246935,"children":246936},{},[246937],{"type":17,"tag":6121,"props":246938,"children":246940},{"className":246939},[],[246941],{"type":23,"value":19766},{"type":23,"value":246943}," that your backend uses for API calls.",{"type":17,"tag":29,"props":246945,"children":246946},{},[246947,246948,246953],{"type":23,"value":180343},{"type":17,"tag":48,"props":246949,"children":246950},{},[246951],{"type":23,"value":246952},"two supported authorization patterns",{"type":23,"value":246954}," when working with Lovable.",{"type":17,"tag":239,"props":246956,"children":246958},{"id":246957},"option-a-embed-unified-auth-in-the-exported-lovable-react-app",[246959],{"type":23,"value":246960},"Option A: Embed Unified Auth in the exported Lovable React app",{"type":17,"tag":29,"props":246962,"children":246963},{},[246964,246966,246971],{"type":23,"value":246965},"Unified provides a pre-built ",{"type":17,"tag":48,"props":246967,"children":246968},{},[246969],{"type":23,"value":246970},"authorization directory component for React",{"type":23,"value":246972}," that handles OAuth- and API-key–based integrations.",{"type":17,"tag":29,"props":246974,"children":246975},{},[246976,246978,246983],{"type":23,"value":246977},"This option assumes you ",{"type":17,"tag":48,"props":246979,"children":246980},{},[246981],{"type":23,"value":246982},"export the Lovable project",{"type":23,"value":246984}," (GitHub/download) and run it as a standard React app where you can install npm packages and control OAuth redirects. Lovable's hosted runtime does not guarantee support for third-party auth components.",{"type":17,"tag":239,"props":246986,"children":246988},{"id":246987},"implementation-exported-lovable-react-app",[246989],{"type":23,"value":246990},"Implementation (exported Lovable React app)",{"type":17,"tag":6154,"props":246992,"children":246993},{},[246994,247007,247024,247102,247209],{"type":17,"tag":84,"props":246995,"children":246996},{},[246997,247002,247005],{"type":17,"tag":48,"props":246998,"children":246999},{},[247000],{"type":23,"value":247001},"Export your Lovable project",{"type":17,"tag":3891,"props":247003,"children":247004},{},[],{"type":23,"value":247006},"Download the source or connect it to GitHub so you can run it as a normal React app.",{"type":17,"tag":84,"props":247008,"children":247009},{},[247010,247015],{"type":17,"tag":48,"props":247011,"children":247012},{},[247013],{"type":23,"value":247014},"Install the Unified React authorization package",{"type":17,"tag":6893,"props":247016,"children":247019},{"className":247017,"code":247018,"language":48432,"meta":7},[48430],"npm install @unified-api/react-directory\n",[247020],{"type":17,"tag":6121,"props":247021,"children":247022},{"__ignoreMap":7},[247023],{"type":23,"value":247018},{"type":17,"tag":84,"props":247025,"children":247026},{},[247027,247032,247035,247037,247043,247044,247050,247052,247094],{"type":17,"tag":48,"props":247028,"children":247029},{},[247030],{"type":23,"value":247031},"Add a Connections or Integrations route",{"type":17,"tag":3891,"props":247033,"children":247034},{},[],{"type":23,"value":247036},"Create a page such as ",{"type":17,"tag":6121,"props":247038,"children":247040},{"className":247039},[],[247041],{"type":23,"value":247042},"/connections",{"type":23,"value":75890},{"type":17,"tag":6121,"props":247045,"children":247047},{"className":247046},[],[247048],{"type":23,"value":247049},"/settings/integrations",{"type":23,"value":247051}," and render Unified's authorization directory component using the code snippet provided in the Unified dashboard:",{"type":17,"tag":80,"props":247053,"children":247054},{},[247055,247064,247073,247078,247089],{"type":17,"tag":84,"props":247056,"children":247057},{},[247058,247059],{"type":23,"value":6661},{"type":17,"tag":48,"props":247060,"children":247061},{},[247062],{"type":23,"value":247063},"app.unified.to → Embedded components",{"type":17,"tag":84,"props":247065,"children":247066},{},[247067,247068],{"type":23,"value":6673},{"type":17,"tag":48,"props":247069,"children":247070},{},[247071],{"type":23,"value":247072},"Authorization Directory",{"type":17,"tag":84,"props":247074,"children":247075},{},[247076],{"type":23,"value":247077},"Configure scopes and redirect URLs",{"type":17,"tag":84,"props":247079,"children":247080},{},[247081,247083,247088],{"type":23,"value":247082},"Copy the React snippet from the ",{"type":17,"tag":48,"props":247084,"children":247085},{},[247086],{"type":23,"value":247087},"Embedded Code",{"type":23,"value":146710},{"type":17,"tag":84,"props":247090,"children":247091},{},[247092],{"type":23,"value":247093},"Paste it into your exported Lovable React app",{"type":17,"tag":3414,"props":247095,"children":247096},{},[247097],{"type":17,"tag":29,"props":247098,"children":247099},{},[247100],{"type":23,"value":247101},"Do not improvise component props — use the snippet generated by Unified, as it reflects your workspace configuration and scopes.",{"type":17,"tag":84,"props":247103,"children":247104},{},[247105,247110,247113,247115,247120,247122,247179,247182,247184],{"type":17,"tag":48,"props":247106,"children":247107},{},[247108],{"type":23,"value":247109},"Handle the authorization redirect",{"type":17,"tag":3891,"props":247111,"children":247112},{},[],{"type":23,"value":247114},"On successful authorization (whether via OAuth or API token), Unified redirects the user to your ",{"type":17,"tag":6121,"props":247116,"children":247118},{"className":247117},[],[247119],{"type":23,"value":147437},{"type":23,"value":247121}," URL with the following query parameters:",{"type":17,"tag":80,"props":247123,"children":247124},{},[247125,247139,247149,247159,247169],{"type":17,"tag":84,"props":247126,"children":247127},{},[247128,247133,247135],{"type":17,"tag":6121,"props":247129,"children":247131},{"className":247130},[],[247132],{"type":23,"value":18766},{"type":23,"value":247134}," — the newly created ",{"type":17,"tag":48,"props":247136,"children":247137},{},[247138],{"type":23,"value":19766},{"type":17,"tag":84,"props":247140,"children":247141},{},[247142,247147],{"type":17,"tag":6121,"props":247143,"children":247145},{"className":247144},[],[247146],{"type":23,"value":77758},{"type":23,"value":247148}," — your original state value",{"type":17,"tag":84,"props":247150,"children":247151},{},[247152,247157],{"type":17,"tag":6121,"props":247153,"children":247155},{"className":247154},[],[247156],{"type":23,"value":77777},{"type":23,"value":247158}," — a random nonce",{"type":17,"tag":84,"props":247160,"children":247161},{},[247162,247167],{"type":17,"tag":6121,"props":247163,"children":247165},{"className":247164},[],[247166],{"type":23,"value":27310},{"type":23,"value":247168}," — integration type",{"type":17,"tag":84,"props":247170,"children":247171},{},[247172,247177],{"type":17,"tag":6121,"props":247173,"children":247175},{"className":247174},[],[247176],{"type":23,"value":178128},{"type":23,"value":247178}," — HMAC signature to verify integrity",{"type":17,"tag":3891,"props":247180,"children":247181},{},[],{"type":23,"value":247183},"Your app should:",{"type":17,"tag":80,"props":247185,"children":247186},{},[247187,247199,247204],{"type":17,"tag":84,"props":247188,"children":247189},{},[247190,247192,247197],{"type":23,"value":247191},"Read the ",{"type":17,"tag":6121,"props":247193,"children":247195},{"className":247194},[],[247196],{"type":23,"value":18766},{"type":23,"value":247198}," value from the URL",{"type":17,"tag":84,"props":247200,"children":247201},{},[247202],{"type":23,"value":247203},"POST it to your backend",{"type":17,"tag":84,"props":247205,"children":247206},{},[247207],{"type":23,"value":247208},"Associate it with the logged-in user",{"type":17,"tag":84,"props":247210,"children":247211},{},[247212,247217,247220,247221,247226],{"type":17,"tag":48,"props":247213,"children":247214},{},[247215],{"type":23,"value":247216},"Verify the signature (recommended)",{"type":17,"tag":3891,"props":247218,"children":247219},{},[],{"type":23,"value":48249},{"type":17,"tag":6121,"props":247222,"children":247224},{"className":247223},[],[247225],{"type":23,"value":178128},{"type":23,"value":247227}," value to verify the redirect payload using your workspace secret, as documented by Unified.",{"type":17,"tag":29,"props":247229,"children":247230},{},[247231,247233,247244],{"type":23,"value":247232},"Even when using the embedded React component, ",{"type":17,"tag":48,"props":247234,"children":247235},{},[247236,247238,247242],{"type":23,"value":247237},"all ",{"type":17,"tag":133,"props":247239,"children":247240},{"href":7691},[247241],{"type":23,"value":7806},{"type":23,"value":247243}," calls and credential handling must remain in your backend",{"type":23,"value":247245},". Lovable should never store API keys or call Unified directly.",{"type":17,"tag":29,"props":247247,"children":247248},{},[247249],{"type":23,"value":247250},"If you are using Lovable's hosted runtime without exporting the project, treat this approach as best-effort only. The most reliable option in that case is Option B.",{"type":17,"tag":239,"props":247252,"children":247254},{"id":247253},"option-b-redirect-to-a-unified-hosted-authorization-url-recommended-default",[247255],{"type":23,"value":247256},"Option B: Redirect to a Unified-hosted authorization URL (recommended default)",{"type":17,"tag":29,"props":247258,"children":247259},{},[247260],{"type":23,"value":247261},"You can also initiate authorization by redirecting users to a Unified-hosted authorization page.",{"type":17,"tag":29,"props":247263,"children":247264},{},[247265],{"type":23,"value":3442},{"type":17,"tag":80,"props":247267,"children":247268},{},[247269,247274,247279,247284,247296],{"type":17,"tag":84,"props":247270,"children":247271},{},[247272],{"type":23,"value":247273},"Lovable renders a simple 'Connect account' action",{"type":17,"tag":84,"props":247275,"children":247276},{},[247277],{"type":23,"value":247278},"The user is redirected to a Unified-hosted authorization URL",{"type":17,"tag":84,"props":247280,"children":247281},{},[247282],{"type":23,"value":247283},"Unified completes OAuth or API-key validation",{"type":17,"tag":84,"props":247285,"children":247286},{},[247287,247288],{"type":23,"value":73306},{"type":17,"tag":48,"props":247289,"children":247290},{},[247291],{"type":17,"tag":6121,"props":247292,"children":247294},{"className":247293},[],[247295],{"type":23,"value":19766},{"type":17,"tag":84,"props":247297,"children":247298},{},[247299,247301,247306],{"type":23,"value":247300},"Your backend stores the ",{"type":17,"tag":6121,"props":247302,"children":247304},{"className":247303},[],[247305],{"type":23,"value":19766},{"type":23,"value":247307}," and uses it for all future API calls",{"type":17,"tag":29,"props":247309,"children":247310},{},[247311],{"type":23,"value":247312},"This approach avoids assumptions about embedded components and is the most robust option when working with Lovable.",{"type":17,"tag":239,"props":247314,"children":247316},{"id":247315},"what-your-backend-receives",[247317],{"type":23,"value":247318},"What your backend receives",{"type":17,"tag":29,"props":247320,"children":247321},{},[247322],{"type":23,"value":247323},"Regardless of the authorization method:",{"type":17,"tag":80,"props":247325,"children":247326},{},[247327,247341,247346],{"type":17,"tag":84,"props":247328,"children":247329},{},[247330,247331,247339],{"type":23,"value":25032},{"type":17,"tag":48,"props":247332,"children":247333},{},[247334],{"type":17,"tag":6121,"props":247335,"children":247337},{"className":247336},[],[247338],{"type":23,"value":19766},{"type":23,"value":247340}," representing the authorized account",{"type":17,"tag":84,"props":247342,"children":247343},{},[247344],{"type":23,"value":247345},"Your backend stores this ID and associates it with the user",{"type":17,"tag":84,"props":247347,"children":247348},{},[247349,247351],{"type":23,"value":247350},"All subsequent Unified API calls use:\n",{"type":17,"tag":80,"props":247352,"children":247353},{},[247354,247359],{"type":17,"tag":84,"props":247355,"children":247356},{},[247357],{"type":23,"value":247358},"Your workspace API key",{"type":17,"tag":84,"props":247360,"children":247361},{},[247362,247364],{"type":23,"value":247363},"The user's ",{"type":17,"tag":6121,"props":247365,"children":247367},{"className":247366},[],[247368],{"type":23,"value":19766},{"type":17,"tag":29,"props":247370,"children":247371},{},[247372,247373,247378],{"type":23,"value":6712},{"type":17,"tag":6121,"props":247374,"children":247376},{"className":247375},[],[247377],{"type":23,"value":19766},{"type":23,"value":247379}," is the only identifier required to access that user's connected SaaS account going forward.",{"type":17,"tag":68,"props":247381,"children":247383},{"id":247382},"step-3-create-a-backend-endpoint-that-calls-unifiedto",[247384],{"type":23,"value":247385},"Step 3: Create a backend endpoint that calls Unified.to",{"type":17,"tag":29,"props":247387,"children":247388},{},[247389],{"type":23,"value":247390},"Unified.to APIs are called using:",{"type":17,"tag":80,"props":247392,"children":247393},{},[247394,247424],{"type":17,"tag":84,"props":247395,"children":247396},{},[247397,247398,247403,247404,247411,247416,247418,247423],{"type":23,"value":9619},{"type":17,"tag":133,"props":247399,"children":247401},{"href":42620,"rel":247400},[214],[247402],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":133,"props":247405,"children":247408},{"href":247406,"rel":247407},"https://app.unified.to/apikeys",[214],[247409],{"type":23,"value":247410},"workspace ",{"type":17,"tag":133,"props":247412,"children":247414},{"href":247406,"rel":247413},[214],[247415],{"type":23,"value":45587},{"type":23,"value":247417}," key in the ",{"type":17,"tag":6121,"props":247419,"children":247421},{"className":247420},[],[247422],{"type":23,"value":7306},{"type":23,"value":71198},{"type":17,"tag":84,"props":247425,"children":247426},{},[247427,247428,247433],{"type":23,"value":9619},{"type":17,"tag":6121,"props":247429,"children":247431},{"className":247430},[],[247432],{"type":23,"value":19766},{"type":23,"value":247434}," to scope the request",{"type":17,"tag":29,"props":247436,"children":247437},{},[247438],{"type":23,"value":247439},"You can use any backend runtime (Vercel, Cloudflare Workers, AWS Lambda, etc.). SDKs are optional — raw REST works just as well.",{"type":17,"tag":239,"props":247441,"children":247443},{"id":247442},"example-list-crm-contacts-read-only",[247444],{"type":23,"value":247445},"Example: list CRM contacts (read-only)",{"type":17,"tag":6893,"props":247447,"children":247450},{"className":247448,"code":247449,"language":6898,"meta":7},[6896],"export async function listContacts(connectionId: string) {\n  const res = await fetch(\n    `https://api.unified.to/crm/${connectionId}/contact?limit=25`,\n    {\n      headers: {\n        Authorization: `Bearer ${process.env.UNIFIED_API_KEY}`,\n        \"Content-Type\": \"application/json\",\n      },\n    }\n  );\n\n  if (!res.ok) {\n    throw new Error(\"Unified API request failed\");\n  }\n\n  return res.json();\n}\n",[247451],{"type":17,"tag":6121,"props":247452,"children":247453},{"__ignoreMap":7},[247454],{"type":23,"value":247449},{"type":17,"tag":29,"props":247456,"children":247457},{},[247458],{"type":23,"value":247459},"Unified returns normalized objects across providers (Salesforce, HubSpot, Zoho, etc.), so your Lovable app doesn't need vendor-specific logic.",{"type":17,"tag":68,"props":247461,"children":247463},{"id":247462},"step-4-make-the-backend-action-available-to-lovable",[247464],{"type":23,"value":247465},"Step 4: Make the backend action available to Lovable",{"type":17,"tag":29,"props":247467,"children":247468},{},[247469],{"type":23,"value":247470},"Lovable can trigger backend actions via:",{"type":17,"tag":80,"props":247472,"children":247473},{},[247474,247479,247484],{"type":17,"tag":84,"props":247475,"children":247476},{},[247477],{"type":23,"value":247478},"HTTP requests",{"type":17,"tag":84,"props":247480,"children":247481},{},[247482],{"type":23,"value":247483},"Agent actions",{"type":17,"tag":84,"props":247485,"children":247486},{},[247487],{"type":23,"value":247488},"Tool-style function calls",{"type":17,"tag":29,"props":247490,"children":247491},{},[247492],{"type":23,"value":247493},"From Lovable's perspective, this is a callable data source. It doesn't know (or need to know) that Unified is behind it.",{"type":17,"tag":29,"props":247495,"children":247496},{},[247497],{"type":23,"value":247498},"Lovable sends:",{"type":17,"tag":80,"props":247500,"children":247501},{},[247502,247507],{"type":17,"tag":84,"props":247503,"children":247504},{},[247505],{"type":23,"value":247506},"The user identifier",{"type":17,"tag":84,"props":247508,"children":247509},{},[247510],{"type":23,"value":247511},"The action to perform (e.g. 'fetch contacts')",{"type":17,"tag":29,"props":247513,"children":247514},{},[247515],{"type":23,"value":247516},"Your backend:",{"type":17,"tag":80,"props":247518,"children":247519},{},[247520,247530,247535],{"type":17,"tag":84,"props":247521,"children":247522},{},[247523,247525],{"type":23,"value":247524},"Looks up the user's ",{"type":17,"tag":6121,"props":247526,"children":247528},{"className":247527},[],[247529],{"type":23,"value":19766},{"type":17,"tag":84,"props":247531,"children":247532},{},[247533],{"type":23,"value":247534},"Calls Unified.to",{"type":17,"tag":84,"props":247536,"children":247537},{},[247538],{"type":23,"value":247539},"Returns structured data to Lovable",{"type":17,"tag":68,"props":247541,"children":247543},{"id":247542},"step-5-use-the-data-inside-lovable",[247544],{"type":23,"value":247545},"Step 5: Use the data inside Lovable",{"type":17,"tag":29,"props":247547,"children":247548},{},[247549],{"type":23,"value":247550},"Once data is returned, Lovable can:",{"type":17,"tag":80,"props":247552,"children":247553},{},[247554,247559,247564],{"type":17,"tag":84,"props":247555,"children":247556},{},[247557],{"type":23,"value":247558},"Display it in the UI",{"type":17,"tag":84,"props":247560,"children":247561},{},[247562],{"type":23,"value":247563},"Use it in conditional logic",{"type":17,"tag":84,"props":247565,"children":247566},{},[247567],{"type":23,"value":247568},"Feed it into AI workflows or automations",{"type":17,"tag":29,"props":247570,"children":247571},{},[247572],{"type":23,"value":247573},"Because Unified returns real-time data and never caches customer records, Lovable always works with live information from the source system.",{"type":17,"tag":68,"props":247575,"children":247577},{"id":247576},"a-note-on-mcp-model-context-protocol",[247578],{"type":23,"value":247579},"A note on MCP (Model Context Protocol)",{"type":17,"tag":29,"props":247581,"children":247582},{},[247583,247585,247589],{"type":23,"value":247584},"Unified.to also provides an ",{"type":17,"tag":133,"props":247586,"children":247587},{"href":326},[247588],{"type":23,"value":329},{"type":23,"value":247590}," server that makes integration actions available as tools for LLMs.",{"type":17,"tag":29,"props":247592,"children":247593},{},[247594],{"type":23,"value":247595},"In the context of Lovable:",{"type":17,"tag":80,"props":247597,"children":247598},{},[247599,247609,247620],{"type":17,"tag":84,"props":247600,"children":247601},{},[247602,247604],{"type":23,"value":247603},"MCP can be useful ",{"type":17,"tag":48,"props":247605,"children":247606},{},[247607],{"type":23,"value":247608},"during agent-assisted app creation",{"type":17,"tag":84,"props":247610,"children":247611},{},[247612,247614,247618],{"type":23,"value":247613},"MCP does ",{"type":17,"tag":48,"props":247615,"children":247616},{},[247617],{"type":23,"value":159475},{"type":23,"value":247619}," replace Unified's REST API and is not designed for runtime application access to end-customer data.",{"type":17,"tag":84,"props":247621,"children":247622},{},[247623,247624,247628],{"type":23,"value":247613},{"type":17,"tag":48,"props":247625,"children":247626},{},[247627],{"type":23,"value":159475},{"type":23,"value":247629}," run inside the deployed Lovable app",{"type":17,"tag":29,"props":247631,"children":247632},{},[247633],{"type":23,"value":247634},"For runtime application logic, you should always call Unified through your backend.",{"type":17,"tag":68,"props":247636,"children":247637},{"id":44585},[247638],{"type":23,"value":44588},{"type":17,"tag":29,"props":247640,"children":247641},{},[247642],{"type":23,"value":247643},"Using Unified.to with Lovable requires a simple but important architectural decision:",{"type":17,"tag":80,"props":247645,"children":247646},{},[247647,247657,247666],{"type":17,"tag":84,"props":247648,"children":247649},{},[247650,247655],{"type":17,"tag":48,"props":247651,"children":247652},{},[247653],{"type":23,"value":247654},"Lovable",{"type":23,"value":247656}," handles UI, logic, and orchestration",{"type":17,"tag":84,"props":247658,"children":247659},{},[247660,247664],{"type":17,"tag":48,"props":247661,"children":247662},{},[247663],{"type":23,"value":217},{"type":23,"value":247665}," handles integrations, auth, and normalization",{"type":17,"tag":84,"props":247667,"children":247668},{},[247669,247673],{"type":17,"tag":48,"props":247670,"children":247671},{},[247672],{"type":23,"value":244692},{"type":23,"value":247674}," connects them securely",{"type":17,"tag":29,"props":247676,"children":247677},{},[247678],{"type":23,"value":247679},"This approach avoids client-side secrets, scales cleanly, and lets you add dozens of SaaS integrations without maintaining custom connectors.",{"type":17,"tag":29,"props":247681,"children":247682},{},[247683],{"type":17,"tag":133,"props":247684,"children":247686},{"href":1612,"rel":247685},[214],[247687],{"type":17,"tag":48,"props":247688,"children":247689},{},[247690],{"type":23,"value":1616},{"type":17,"tag":29,"props":247692,"children":247693},{},[247694],{"type":17,"tag":133,"props":247695,"children":247697},{"href":1623,"rel":247696},[214],[247698],{"type":17,"tag":48,"props":247699,"children":247700},{},[247701],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":247703},[247704,247705,247706,247707,247713,247716,247717,247718,247719],{"id":246852,"depth":1629,"text":246855},{"id":244650,"depth":1629,"text":244653},{"id":246903,"depth":1629,"text":246906},{"id":246925,"depth":1629,"text":246928,"children":247708},[247709,247710,247711,247712],{"id":246957,"depth":1635,"text":246960},{"id":246987,"depth":1635,"text":246990},{"id":247253,"depth":1635,"text":247256},{"id":247315,"depth":1635,"text":247318},{"id":247382,"depth":1629,"text":247385,"children":247714},[247715],{"id":247442,"depth":1635,"text":247445},{"id":247462,"depth":1629,"text":247465},{"id":247542,"depth":1629,"text":247545},{"id":247576,"depth":1629,"text":247579},{"id":44585,"depth":1629,"text":44588},"content:blog:how_to_use_unified_with_lovable.md","blog/how_to_use_unified_with_lovable.md","blog/how_to_use_unified_with_lovable",{"_path":247724,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":247725,"description":247726,"img":247727,"date":247728,"tag":6341,"body":247729,"_type":1677,"_id":248091,"_source":1679,"_file":248092,"_stem":248093,"_extension":1682},"/blog/how_to_create_connection_with_hubspot","How to create Connection with Hubspot","Hubspot provides Free Developer Sandbox Account. You can create that from following link .","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-icon.svg","2025-12-17T08:03:00.000Z",{"type":14,"children":247730,"toc":248089},[247731,247736,247739,247747,247760,247768,247775,247783,247790,247795,247802,247810,247817,247825,247832,247841,247849,247856,247864,247871,247879,247888,247895,247903,247910,247918,247925,247933,247940,247948,247955,247963,247972,247980,247989,247997,248004,248012,248019,248027,248034,248042,248049,248057,248064,248084],{"type":17,"tag":18,"props":247732,"children":247734},{"id":247733},"how-to-create-connection-with-hubspot",[247735],{"type":23,"value":247725},{"type":17,"tag":25,"props":247737,"children":247738},{},[],{"type":17,"tag":29,"props":247740,"children":247741},{},[247742],{"type":17,"tag":33,"props":247743,"children":247744},{},[247745],{"type":23,"value":247746},"December 17, 2025",{"type":17,"tag":29,"props":247748,"children":247749},{},[247750,247752,247758],{"type":23,"value":247751},"Hubspot provides Free Developer Sandbox Account. You can create that from following ",{"type":17,"tag":133,"props":247753,"children":247756},{"href":247754,"rel":247755},"https://offers.hubspot.com/free-cms-developer-sandbox",[214],[247757],{"type":23,"value":42710},{"type":23,"value":247759}," .",{"type":17,"tag":6154,"props":247761,"children":247762},{},[247763],{"type":17,"tag":84,"props":247764,"children":247765},{},[247766],{"type":23,"value":247767},"Create an account.",{"type":17,"tag":29,"props":247769,"children":247770},{},[247771],{"type":17,"tag":6438,"props":247772,"children":247774},{"alt":6440,"src":247773},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-0.png",[],{"type":17,"tag":6154,"props":247776,"children":247777},{},[247778],{"type":17,"tag":84,"props":247779,"children":247780},{},[247781],{"type":23,"value":247782},"Provide name of the account",{"type":17,"tag":29,"props":247784,"children":247785},{},[247786],{"type":17,"tag":6438,"props":247787,"children":247789},{"alt":6440,"src":247788},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-1.png",[],{"type":17,"tag":29,"props":247791,"children":247792},{},[247793],{"type":23,"value":247794},"After account is created it will redirect you to following page:-",{"type":17,"tag":29,"props":247796,"children":247797},{},[247798],{"type":17,"tag":6438,"props":247799,"children":247801},{"alt":6440,"src":247800},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-2.png",[],{"type":17,"tag":6154,"props":247803,"children":247804},{},[247805],{"type":17,"tag":84,"props":247806,"children":247807},{},[247808],{"type":23,"value":247809},"Goto Development page from the size menu",{"type":17,"tag":29,"props":247811,"children":247812},{},[247813],{"type":17,"tag":6438,"props":247814,"children":247816},{"alt":6440,"src":247815},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-3.png",[],{"type":17,"tag":6154,"props":247818,"children":247819},{},[247820],{"type":17,"tag":84,"props":247821,"children":247822},{},[247823],{"type":23,"value":247824},"Create a project in IDE and install and install using following command",{"type":17,"tag":29,"props":247826,"children":247827},{},[247828],{"type":17,"tag":6438,"props":247829,"children":247831},{"alt":6440,"src":247830},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-4.png",[],{"type":17,"tag":6893,"props":247833,"children":247836},{"className":247834,"code":247835,"language":6898,"meta":7},[6896],"npm install -g @hubspot/cli && hs init\n",[247837],{"type":17,"tag":6121,"props":247838,"children":247839},{"__ignoreMap":7},[247840],{"type":23,"value":247835},{"type":17,"tag":6154,"props":247842,"children":247843},{},[247844],{"type":17,"tag":84,"props":247845,"children":247846},{},[247847],{"type":23,"value":247848},"Create your Personal Access Key.\nIt will be inside the keys menu",{"type":17,"tag":29,"props":247850,"children":247851},{},[247852],{"type":17,"tag":6438,"props":247853,"children":247855},{"alt":6440,"src":247854},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-5.png",[],{"type":17,"tag":6154,"props":247857,"children":247858},{},[247859],{"type":17,"tag":84,"props":247860,"children":247861},{},[247862],{"type":23,"value":247863},"Paste that key in your terminal when your hubspot application ask for it.",{"type":17,"tag":29,"props":247865,"children":247866},{},[247867],{"type":17,"tag":6438,"props":247868,"children":247870},{"alt":6440,"src":247869},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-6.png",[],{"type":17,"tag":6154,"props":247872,"children":247873},{},[247874],{"type":17,"tag":84,"props":247875,"children":247876},{},[247877],{"type":23,"value":247878},"Now we will create a project.\nrun following command in that same project.",{"type":17,"tag":6893,"props":247880,"children":247883},{"className":247881,"code":247882,"language":6898,"meta":7},[6896],"hs get-started\n",[247884],{"type":17,"tag":6121,"props":247885,"children":247886},{"__ignoreMap":7},[247887],{"type":23,"value":247882},{"type":17,"tag":29,"props":247889,"children":247890},{},[247891],{"type":17,"tag":6438,"props":247892,"children":247894},{"alt":6440,"src":247893},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-7.png",[],{"type":17,"tag":6154,"props":247896,"children":247897},{},[247898],{"type":17,"tag":84,"props":247899,"children":247900},{},[247901],{"type":23,"value":247902},"Write Y to upload that project in the hubspot application.",{"type":17,"tag":29,"props":247904,"children":247905},{},[247906],{"type":17,"tag":6438,"props":247907,"children":247909},{"alt":6440,"src":247908},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-8.png",[],{"type":17,"tag":6154,"props":247911,"children":247912},{},[247913],{"type":17,"tag":84,"props":247914,"children":247915},{},[247916],{"type":23,"value":247917},"Again select Y for following",{"type":17,"tag":29,"props":247919,"children":247920},{},[247921],{"type":17,"tag":6438,"props":247922,"children":247924},{"alt":6440,"src":247923},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-9.png",[],{"type":17,"tag":6154,"props":247926,"children":247927},{},[247928],{"type":17,"tag":84,"props":247929,"children":247930},{},[247931],{"type":23,"value":247932},"It will redirect to hubspot page.\ngoto to following page:-\nConnected Apps→ Manage Location → click the check box → Save.",{"type":17,"tag":29,"props":247934,"children":247935},{},[247936],{"type":17,"tag":6438,"props":247937,"children":247939},{"alt":6440,"src":247938},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-10.png",[],{"type":17,"tag":6154,"props":247941,"children":247942},{},[247943],{"type":17,"tag":84,"props":247944,"children":247945},{},[247946],{"type":23,"value":247947},"In your project(code) you will see following folder structure.\nGOTO→ yourproject (account-testing) → app-hsmeta.json",{"type":17,"tag":29,"props":247949,"children":247950},{},[247951],{"type":17,"tag":6438,"props":247952,"children":247954},{"alt":6440,"src":247953},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-11.png",[],{"type":17,"tag":6154,"props":247956,"children":247957},{},[247958],{"type":17,"tag":84,"props":247959,"children":247960},{},[247961],{"type":23,"value":247962},"Following will be the scopes and redirect URL. You can remove which you want. However, do remember those removed scopes before creating a connection in unified. Also remember to add redirect URL as follows.",{"type":17,"tag":6893,"props":247964,"children":247967},{"className":247965,"code":247966,"language":6898,"meta":7},[6896],"{\n  \"uid\": \"get_started_app\",\n  \"type\": \"app\",\n  \"config\": {\n    \"description\": \"A Unified.to token app for testing\",\n    \"name\": \"My Get Started app\",\n    \"distribution\": \"private\",\n    \"auth\": {\n      \"type\": \"oauth\",\n      \"redirectUrls\": [\n        \"https://api.unified.to/oauth/code\",\n      ],\n      \"requiredScopes\": [\n        \"oauth\",\n        \"crm.objects.companies.read\",\n        \"crm.objects.contacts.read\",\n        \"crm.objects.deals.read\",\n        \"crm.objects.owners.read\",\n        \"crm.pipelines.orders.read\",\n        \"crm.objects.contacts.write\",\n        \"crm.pipelines.orders.read\",\n        \"crm.pipelines.orders.write\",\n        \"crm.objects.deals.write\",\n        \"sales-email-read\",\n        \"content\",\n        \"tickets\",\n        \"crm.lists.read\",\n        \"settings.users.teams.read\"\n      ],\n      \"optionalScopes\": [],\n      \"conditionallyRequiredScopes\": []\n    },\n    \"permittedUrls\": {\n      \"fetch\": [\"https://api.hubapi.com\"],\n      \"iframe\": [],\n      \"img\": []\n    },\n    \"support\": {\n      \"supportEmail\": \"support@example.com\",\n      \"documentationUrl\": \"https://example.com/docs\",\n      \"supportUrl\": \"https://example.com/support\",\n      \"supportPhone\": \"+18005555555\"\n    }\n  }\n}\n",[247968],{"type":17,"tag":6121,"props":247969,"children":247970},{"__ignoreMap":7},[247971],{"type":23,"value":247966},{"type":17,"tag":6154,"props":247973,"children":247974},{},[247975],{"type":17,"tag":84,"props":247976,"children":247977},{},[247978],{"type":23,"value":247979},"You can update those changes using following command in terminal.",{"type":17,"tag":6893,"props":247981,"children":247984},{"className":247982,"code":247983,"language":6898,"meta":7},[6896],"hs project upload\n",[247985],{"type":17,"tag":6121,"props":247986,"children":247987},{"__ignoreMap":7},[247988],{"type":23,"value":247983},{"type":17,"tag":6154,"props":247990,"children":247991},{},[247992],{"type":17,"tag":84,"props":247993,"children":247994},{},[247995],{"type":23,"value":247996},"When the code is uploaded successfully you can check that by going to following Development→ Project → Select your project.",{"type":17,"tag":29,"props":247998,"children":247999},{},[248000],{"type":17,"tag":6438,"props":248001,"children":248003},{"alt":6440,"src":248002},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-12.png",[],{"type":17,"tag":6154,"props":248005,"children":248006},{},[248007],{"type":17,"tag":84,"props":248008,"children":248009},{},[248010],{"type":23,"value":248011},"To check your scopes click on the project Component. It will show your app-hsmeta.json",{"type":17,"tag":29,"props":248013,"children":248014},{},[248015],{"type":17,"tag":6438,"props":248016,"children":248018},{"alt":6440,"src":248017},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-13.png",[],{"type":17,"tag":6154,"props":248020,"children":248021},{},[248022],{"type":17,"tag":84,"props":248023,"children":248024},{},[248025],{"type":23,"value":248026},"To get the client ID and Client Secret click on the Auth button in your project component.",{"type":17,"tag":29,"props":248028,"children":248029},{},[248030],{"type":17,"tag":6438,"props":248031,"children":248033},{"alt":6440,"src":248032},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-14.png",[],{"type":17,"tag":6154,"props":248035,"children":248036},{},[248037],{"type":17,"tag":84,"props":248038,"children":248039},{},[248040],{"type":23,"value":248041},"Paste the Client ID and Client Secret in the app.unified.to",{"type":17,"tag":29,"props":248043,"children":248044},{},[248045],{"type":17,"tag":6438,"props":248046,"children":248048},{"alt":6440,"src":248047},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-15.png",[],{"type":17,"tag":6154,"props":248050,"children":248051},{},[248052],{"type":17,"tag":84,"props":248053,"children":248054},{},[248055],{"type":23,"value":248056},"To get developer key goto Development→ keys → developer API key. If no keys are present than generate developer api key.",{"type":17,"tag":29,"props":248058,"children":248059},{},[248060],{"type":17,"tag":6438,"props":248061,"children":248063},{"alt":6440,"src":248062},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_connection_with_hubspot-16.png",[],{"type":17,"tag":6154,"props":248065,"children":248066},{},[248067,248079],{"type":17,"tag":84,"props":248068,"children":248069},{},[248070,248072,248077],{"type":23,"value":248071},"Paste that key in the ",{"type":17,"tag":133,"props":248073,"children":248075},{"href":106697,"rel":248074},[214],[248076],{"type":23,"value":106701},{"type":23,"value":248078}," and click activate.",{"type":17,"tag":84,"props":248080,"children":248081},{},[248082],{"type":23,"value":248083},"Goto Embedded components→ click on hubspot→ select your project→ click on approve.",{"type":17,"tag":29,"props":248085,"children":248086},{},[248087],{"type":23,"value":248088},"Your Hubspot application is created.",{"title":7,"searchDepth":1629,"depth":1629,"links":248090},[],"content:blog:how_to_create_connection_with_hubspot.md","blog/how_to_create_connection_with_hubspot.md","blog/how_to_create_connection_with_hubspot",{"_path":248095,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":248096,"description":248097,"img":248098,"date":248099,"tag":12,"body":248100,"_type":1677,"_id":248971,"_source":1679,"_file":248972,"_stem":248973,"_extension":1682},"/blog/which_event_delivery_model_scales_polling_webhooks_or_virtual_webhooks","Which Event Delivery Model Scales: Polling, Webhooks, or Virtual Webhooks?","As products grow, the way they detect and react to data changes becomes infrastructure, not implementation detail.","https://s3.us-east-2.amazonaws.com/unified-article-images/which_event_delivery_model_scales_polling_webhooks_or_virtual_webhooks-icon.png","2025-12-15T23:17:00.000Z",{"type":14,"children":248101,"toc":248957},[248102,248107,248110,248118,248122,248127,248149,248154,248166,248183,248189,248194,248198,248216,248222,248233,248240,248258,248266,248284,248292,248310,248318,248322,248344,248349,248352,248358,248363,248380,248385,248388,248394,248402,248415,248423,248441,248449,248462,248473,248476,248482,248487,248492,248509,248514,248531,248539,248543,248546,248552,248560,248578,248586,248604,248612,248630,248638,248651,248662,248665,248671,248782,248785,248791,248798,248816,248819,248826,248843,248846,248853,248875,248878,248882,248887,248892,248897,248902,248920,248925,248941],{"type":17,"tag":18,"props":248103,"children":248105},{"id":248104},"which-event-delivery-model-scales-polling-webhooks-or-virtual-webhooks",[248106],{"type":23,"value":248096},{"type":17,"tag":25,"props":248108,"children":248109},{},[],{"type":17,"tag":29,"props":248111,"children":248112},{},[248113],{"type":17,"tag":33,"props":248114,"children":248115},{},[248116],{"type":23,"value":248117},"December 15, 2025",{"type":17,"tag":29,"props":248119,"children":248120},{},[248121],{"type":23,"value":248097},{"type":17,"tag":29,"props":248123,"children":248124},{},[248125],{"type":23,"value":248126},"Most teams start with one of three approaches:",{"type":17,"tag":80,"props":248128,"children":248129},{},[248130,248134,248142],{"type":17,"tag":84,"props":248131,"children":248132},{},[248133],{"type":23,"value":31656},{"type":17,"tag":84,"props":248135,"children":248136},{},[248137,248138],{"type":23,"value":89673},{"type":17,"tag":133,"props":248139,"children":248140},{"href":4999},[248141],{"type":23,"value":5002},{"type":17,"tag":84,"props":248143,"children":248144},{},[248145],{"type":17,"tag":133,"props":248146,"children":248147},{"href":9007},[248148],{"type":23,"value":46572},{"type":17,"tag":29,"props":248150,"children":248151},{},[248152],{"type":23,"value":248153},"All three work at small scale. They diverge as you add customers, integrations, and event volume.",{"type":17,"tag":29,"props":248155,"children":248156},{},[248157,248159,248164],{"type":23,"value":248158},"This guide focuses on ",{"type":17,"tag":48,"props":248160,"children":248161},{},[248162],{"type":23,"value":248163},"what actually scales",{"type":23,"value":248165},", and which failure modes emerge as systems grow.",{"type":17,"tag":3414,"props":248167,"children":248168},{},[248169],{"type":17,"tag":29,"props":248170,"children":248171},{},[248172,248173,248177,248179],{"type":23,"value":228676},{"type":17,"tag":133,"props":248174,"children":248175},{"href":7691},[248176],{"type":23,"value":7459},{"type":23,"value":248178}," platforms implement virtual webhooks vs sync-based notification systems, see: ",{"type":17,"tag":48,"props":248180,"children":248181},{},[248182],{"type":23,"value":228693},{"type":17,"tag":68,"props":248184,"children":248186},{"id":248185},"polling-simple-to-start-hard-to-grow",[248187],{"type":23,"value":248188},"Polling: simple to start, hard to grow",{"type":17,"tag":29,"props":248190,"children":248191},{},[248192],{"type":23,"value":248193},"Polling means your application periodically checks an API for changes.",{"type":17,"tag":29,"props":248195,"children":248196},{},[248197],{"type":23,"value":204371},{"type":17,"tag":80,"props":248199,"children":248200},{},[248201,248206,248211],{"type":17,"tag":84,"props":248202,"children":248203},{},[248204],{"type":23,"value":248205},"run a job every N minutes",{"type":17,"tag":84,"props":248207,"children":248208},{},[248209],{"type":23,"value":248210},"request records updated since the last checkpoint",{"type":17,"tag":84,"props":248212,"children":248213},{},[248214],{"type":23,"value":248215},"process results, update state, repeat",{"type":17,"tag":239,"props":248217,"children":248219},{"id":248218},"why-polling-struggles-at-scale",[248220],{"type":23,"value":248221},"Why polling struggles at scale",{"type":17,"tag":29,"props":248223,"children":248224},{},[248225,248227,248232],{"type":23,"value":248226},"Polling does not fail because it is inefficient. It fails because it becomes ",{"type":17,"tag":48,"props":248228,"children":248229},{},[248230],{"type":23,"value":248231},"distributed state management across many systems",{"type":23,"value":54},{"type":17,"tag":29,"props":248234,"children":248235},{},[248236],{"type":17,"tag":48,"props":248237,"children":248238},{},[248239],{"type":23,"value":3279},{"type":17,"tag":80,"props":248241,"children":248242},{},[248243,248248,248253],{"type":17,"tag":84,"props":248244,"children":248245},{},[248246],{"type":23,"value":248247},"Most requests return no changes",{"type":17,"tag":84,"props":248249,"children":248250},{},[248251],{"type":23,"value":248252},"API quota is consumed regardless",{"type":17,"tag":84,"props":248254,"children":248255},{},[248256],{"type":23,"value":248257},"High-activity tenants can starve low-activity ones",{"type":17,"tag":29,"props":248259,"children":248260},{},[248261],{"type":17,"tag":48,"props":248262,"children":248263},{},[248264],{"type":23,"value":248265},"Missed updates",{"type":17,"tag":80,"props":248267,"children":248268},{},[248269,248274,248279],{"type":17,"tag":84,"props":248270,"children":248271},{},[248272],{"type":23,"value":248273},"Clock drift and retry gaps create blind spots",{"type":17,"tag":84,"props":248275,"children":248276},{},[248277],{"type":23,"value":248278},"Incremental filters are inconsistent across APIs",{"type":17,"tag":84,"props":248280,"children":248281},{},[248282],{"type":23,"value":248283},"Partial failures are difficult to detect",{"type":17,"tag":29,"props":248285,"children":248286},{},[248287],{"type":17,"tag":48,"props":248288,"children":248289},{},[248290],{"type":23,"value":248291},"Duplicate processing",{"type":17,"tag":80,"props":248293,"children":248294},{},[248295,248300,248305],{"type":17,"tag":84,"props":248296,"children":248297},{},[248298],{"type":23,"value":248299},"Records appear across overlapping windows",{"type":17,"tag":84,"props":248301,"children":248302},{},[248303],{"type":23,"value":248304},"Idempotency logic becomes required everywhere",{"type":17,"tag":84,"props":248306,"children":248307},{},[248308],{"type":23,"value":248309},"Ordering guarantees are rare",{"type":17,"tag":29,"props":248311,"children":248312},{},[248313],{"type":17,"tag":48,"props":248314,"children":248315},{},[248316],{"type":23,"value":248317},"Operational overhead",{"type":17,"tag":29,"props":248319,"children":248320},{},[248321],{"type":23,"value":228893},{"type":17,"tag":80,"props":248323,"children":248324},{},[248325,248329,248334,248339],{"type":17,"tag":84,"props":248326,"children":248327},{},[248328],{"type":23,"value":228901},{"type":17,"tag":84,"props":248330,"children":248331},{},[248332],{"type":23,"value":248333},"checkpoint state per integration",{"type":17,"tag":84,"props":248335,"children":248336},{},[248337],{"type":23,"value":248338},"retry and backoff logic",{"type":17,"tag":84,"props":248340,"children":248341},{},[248342],{"type":23,"value":248343},"pagination handling",{"type":17,"tag":29,"props":248345,"children":248346},{},[248347],{"type":23,"value":248348},"Polling works for low-frequency, batch workflows. It does not scale cleanly across many tenants and integrations.",{"type":17,"tag":25,"props":248350,"children":248351},{},[],{"type":17,"tag":68,"props":248353,"children":248355},{"id":248354},"native-webhooks-ideal-but-incomplete",[248356],{"type":23,"value":248357},"Native webhooks: ideal, but incomplete",{"type":17,"tag":29,"props":248359,"children":248360},{},[248361],{"type":23,"value":248362},"Native webhooks shift change detection to the source system.",{"type":17,"tag":80,"props":248364,"children":248365},{},[248366,248370,248375],{"type":17,"tag":84,"props":248367,"children":248368},{},[248369],{"type":23,"value":229148},{"type":17,"tag":84,"props":248371,"children":248372},{},[248373],{"type":23,"value":248374},"An event is pushed",{"type":17,"tag":84,"props":248376,"children":248377},{},[248378],{"type":23,"value":248379},"Your application reacts",{"type":17,"tag":29,"props":248381,"children":248382},{},[248383],{"type":23,"value":248384},"This is the cleanest model when it exists.",{"type":17,"tag":25,"props":248386,"children":248387},{},[],{"type":17,"tag":239,"props":248389,"children":248391},{"id":248390},"where-native-webhooks-fall-short",[248392],{"type":23,"value":248393},"Where native webhooks fall short",{"type":17,"tag":29,"props":248395,"children":248396},{},[248397],{"type":17,"tag":48,"props":248398,"children":248399},{},[248400],{"type":23,"value":248401},"Coverage gaps",{"type":17,"tag":80,"props":248403,"children":248404},{},[248405,248410],{"type":17,"tag":84,"props":248406,"children":248407},{},[248408],{"type":23,"value":248409},"Many APIs do not support webhooks",{"type":17,"tag":84,"props":248411,"children":248412},{},[248413],{"type":23,"value":248414},"Others only support a subset of objects",{"type":17,"tag":29,"props":248416,"children":248417},{},[248418],{"type":17,"tag":48,"props":248419,"children":248420},{},[248421],{"type":23,"value":248422},"Inconsistent behavior",{"type":17,"tag":80,"props":248424,"children":248425},{},[248426,248431,248436],{"type":17,"tag":84,"props":248427,"children":248428},{},[248429],{"type":23,"value":248430},"Payload formats differ across providers",{"type":17,"tag":84,"props":248432,"children":248433},{},[248434],{"type":23,"value":248435},"Event semantics are not standardized",{"type":17,"tag":84,"props":248437,"children":248438},{},[248439],{"type":23,"value":248440},"Ordering and deduplication are rarely guaranteed",{"type":17,"tag":29,"props":248442,"children":248443},{},[248444],{"type":17,"tag":48,"props":248445,"children":248446},{},[248447],{"type":23,"value":248448},"Partial payloads",{"type":17,"tag":80,"props":248450,"children":248451},{},[248452,248457],{"type":17,"tag":84,"props":248453,"children":248454},{},[248455],{"type":23,"value":248456},"Some events include only IDs",{"type":17,"tag":84,"props":248458,"children":248459},{},[248460],{"type":23,"value":248461},"Follow-up fetches are often required",{"type":17,"tag":29,"props":248463,"children":248464},{},[248465,248467,248472],{"type":23,"value":248466},"Native webhooks scale well per integration. They do not scale well across ",{"type":17,"tag":48,"props":248468,"children":248469},{},[248470],{"type":23,"value":248471},"many integrations with inconsistent support",{"type":23,"value":54},{"type":17,"tag":25,"props":248474,"children":248475},{},[],{"type":17,"tag":68,"props":248477,"children":248479},{"id":248478},"virtual-webhooks-designed-for-scale",[248480],{"type":23,"value":248481},"Virtual webhooks: designed for scale",{"type":17,"tag":29,"props":248483,"children":248484},{},[248485],{"type":23,"value":248486},"Virtual webhooks centralize change detection inside the integration layer.",{"type":17,"tag":29,"props":248488,"children":248489},{},[248490],{"type":23,"value":248491},"Instead of relying on the source system to emit events:",{"type":17,"tag":6154,"props":248493,"children":248494},{},[248495,248499,248504],{"type":17,"tag":84,"props":248496,"children":248497},{},[248498],{"type":23,"value":9095},{"type":17,"tag":84,"props":248500,"children":248501},{},[248502],{"type":23,"value":248503},"Detects changes using consistent logic",{"type":17,"tag":84,"props":248505,"children":248506},{},[248507],{"type":23,"value":248508},"Emits webhook events when changes occur",{"type":17,"tag":29,"props":248510,"children":248511},{},[248512],{"type":23,"value":248513},"From the application's perspective:",{"type":17,"tag":80,"props":248515,"children":248516},{},[248517,248521,248526],{"type":17,"tag":84,"props":248518,"children":248519},{},[248520],{"type":23,"value":229224},{"type":17,"tag":84,"props":248522,"children":248523},{},[248524],{"type":23,"value":248525},"You receive events",{"type":17,"tag":84,"props":248527,"children":248528},{},[248529],{"type":23,"value":248530},"You do not manage polling infrastructure",{"type":17,"tag":3414,"props":248532,"children":248533},{},[248534],{"type":17,"tag":29,"props":248535,"children":248536},{},[248537],{"type":23,"value":248538},"Polling still exists—it is centralized instead of distributed across your system.",{"type":17,"tag":29,"props":248540,"children":248541},{},[248542],{"type":23,"value":229241},{"type":17,"tag":25,"props":248544,"children":248545},{},[],{"type":17,"tag":239,"props":248547,"children":248549},{"id":248548},"why-virtual-webhooks-scale-better",[248550],{"type":23,"value":248551},"Why virtual webhooks scale better",{"type":17,"tag":29,"props":248553,"children":248554},{},[248555],{"type":17,"tag":48,"props":248556,"children":248557},{},[248558],{"type":23,"value":248559},"Centralized load management",{"type":17,"tag":80,"props":248561,"children":248562},{},[248563,248568,248573],{"type":17,"tag":84,"props":248564,"children":248565},{},[248566],{"type":23,"value":248567},"Polling frequency is controlled in one place",{"type":17,"tag":84,"props":248569,"children":248570},{},[248571],{"type":23,"value":248572},"Idle tenants do not consume unnecessary requests",{"type":17,"tag":84,"props":248574,"children":248575},{},[248576],{"type":23,"value":248577},"Rate limits are handled at the platform level",{"type":17,"tag":29,"props":248579,"children":248580},{},[248581],{"type":17,"tag":48,"props":248582,"children":248583},{},[248584],{"type":23,"value":248585},"Consistent event model",{"type":17,"tag":80,"props":248587,"children":248588},{},[248589,248594,248599],{"type":17,"tag":84,"props":248590,"children":248591},{},[248592],{"type":23,"value":248593},"Events follow a unified schema",{"type":17,"tag":84,"props":248595,"children":248596},{},[248597],{"type":23,"value":248598},"Change detection is standardized",{"type":17,"tag":84,"props":248600,"children":248601},{},[248602],{"type":23,"value":248603},"Deduplication and retries are handled once",{"type":17,"tag":29,"props":248605,"children":248606},{},[248607],{"type":17,"tag":48,"props":248608,"children":248609},{},[248610],{"type":23,"value":248611},"Reduced failure surface",{"type":17,"tag":80,"props":248613,"children":248614},{},[248615,248620,248625],{"type":17,"tag":84,"props":248616,"children":248617},{},[248618],{"type":23,"value":248619},"No per-integration cron jobs",{"type":17,"tag":84,"props":248621,"children":248622},{},[248623],{"type":23,"value":248624},"No fragmented polling state",{"type":17,"tag":84,"props":248626,"children":248627},{},[248628],{"type":23,"value":248629},"Fewer silent failure modes",{"type":17,"tag":29,"props":248631,"children":248632},{},[248633],{"type":17,"tag":48,"props":248634,"children":248635},{},[248636],{"type":23,"value":248637},"Predictable freshness",{"type":17,"tag":80,"props":248639,"children":248640},{},[248641,248646],{"type":17,"tag":84,"props":248642,"children":248643},{},[248644],{"type":23,"value":248645},"Latency is bounded by detection interval",{"type":17,"tag":84,"props":248647,"children":248648},{},[248649],{"type":23,"value":248650},"Not dependent on batch sync completion",{"type":17,"tag":29,"props":248652,"children":248653},{},[248654,248656,248661],{"type":23,"value":248655},"Virtual webhooks are not about removing polling. They are about ",{"type":17,"tag":48,"props":248657,"children":248658},{},[248659],{"type":23,"value":248660},"containing it within a single system boundary",{"type":23,"value":54},{"type":17,"tag":25,"props":248663,"children":248664},{},[],{"type":17,"tag":68,"props":248666,"children":248668},{"id":248667},"event-delivery-comparison",[248669],{"type":23,"value":248670},"Event delivery comparison",{"type":17,"tag":7231,"props":248672,"children":248673},{},[248674,248704],{"type":17,"tag":7235,"props":248675,"children":248676},{},[248677],{"type":17,"tag":7239,"props":248678,"children":248679},{},[248680,248684,248689,248694,248699],{"type":17,"tag":7243,"props":248681,"children":248682},{},[248683],{"type":23,"value":16997},{"type":17,"tag":7243,"props":248685,"children":248686},{},[248687],{"type":23,"value":248688},"What triggers events",{"type":17,"tag":7243,"props":248690,"children":248691},{},[248692],{"type":23,"value":248693},"Failure surface",{"type":17,"tag":7243,"props":248695,"children":248696},{},[248697],{"type":23,"value":248698},"Operational burden",{"type":17,"tag":7243,"props":248700,"children":248701},{},[248702],{"type":23,"value":248703},"Scales across integrations",{"type":17,"tag":7259,"props":248705,"children":248706},{},[248707,248731,248757],{"type":17,"tag":7239,"props":248708,"children":248709},{},[248710,248714,248719,248723,248727],{"type":17,"tag":7266,"props":248711,"children":248712},{},[248713],{"type":23,"value":172306},{"type":17,"tag":7266,"props":248715,"children":248716},{},[248717],{"type":23,"value":248718},"Time-based checks",{"type":17,"tag":7266,"props":248720,"children":248721},{},[248722],{"type":23,"value":69476},{"type":17,"tag":7266,"props":248724,"children":248725},{},[248726],{"type":23,"value":69476},{"type":17,"tag":7266,"props":248728,"children":248729},{},[248730],{"type":23,"value":48006},{"type":17,"tag":7239,"props":248732,"children":248733},{},[248734,248738,248743,248748,248752],{"type":17,"tag":7266,"props":248735,"children":248736},{},[248737],{"type":23,"value":9024},{"type":17,"tag":7266,"props":248739,"children":248740},{},[248741],{"type":23,"value":248742},"Source-detected changes",{"type":17,"tag":7266,"props":248744,"children":248745},{},[248746],{"type":23,"value":248747},"Medium (coverage gaps)",{"type":17,"tag":7266,"props":248749,"children":248750},{},[248751],{"type":23,"value":69459},{"type":17,"tag":7266,"props":248753,"children":248754},{},[248755],{"type":23,"value":248756},"Sometimes",{"type":17,"tag":7239,"props":248758,"children":248759},{},[248760,248764,248769,248774,248778],{"type":17,"tag":7266,"props":248761,"children":248762},{},[248763],{"type":23,"value":9256},{"type":17,"tag":7266,"props":248765,"children":248766},{},[248767],{"type":23,"value":248768},"Platform-detected changes",{"type":17,"tag":7266,"props":248770,"children":248771},{},[248772],{"type":23,"value":248773},"Lower (centralized)",{"type":17,"tag":7266,"props":248775,"children":248776},{},[248777],{"type":23,"value":69459},{"type":17,"tag":7266,"props":248779,"children":248780},{},[248781],{"type":23,"value":47981},{"type":17,"tag":25,"props":248783,"children":248784},{},[],{"type":17,"tag":68,"props":248786,"children":248788},{"id":248787},"when-each-model-makes-sense",[248789],{"type":23,"value":248790},"When each model makes sense",{"type":17,"tag":29,"props":248792,"children":248793},{},[248794],{"type":17,"tag":48,"props":248795,"children":248796},{},[248797],{"type":23,"value":172306},{"type":17,"tag":80,"props":248799,"children":248800},{},[248801,248806,248811],{"type":17,"tag":84,"props":248802,"children":248803},{},[248804],{"type":23,"value":248805},"backfills",{"type":17,"tag":84,"props":248807,"children":248808},{},[248809],{"type":23,"value":248810},"reporting pipelines",{"type":17,"tag":84,"props":248812,"children":248813},{},[248814],{"type":23,"value":248815},"low-urgency workflows",{"type":17,"tag":25,"props":248817,"children":248818},{},[],{"type":17,"tag":29,"props":248820,"children":248821},{},[248822],{"type":17,"tag":48,"props":248823,"children":248824},{},[248825],{"type":23,"value":9024},{"type":17,"tag":80,"props":248827,"children":248828},{},[248829,248833,248838],{"type":17,"tag":84,"props":248830,"children":248831},{},[248832],{"type":23,"value":66282},{"type":17,"tag":84,"props":248834,"children":248835},{},[248836],{"type":23,"value":248837},"infrastructure events",{"type":17,"tag":84,"props":248839,"children":248840},{},[248841],{"type":23,"value":248842},"APIs with reliable webhook coverage",{"type":17,"tag":25,"props":248844,"children":248845},{},[],{"type":17,"tag":29,"props":248847,"children":248848},{},[248849],{"type":17,"tag":48,"props":248850,"children":248851},{},[248852],{"type":23,"value":9256},{"type":17,"tag":80,"props":248854,"children":248855},{},[248856,248860,248865,248870],{"type":17,"tag":84,"props":248857,"children":248858},{},[248859],{"type":23,"value":71368},{"type":17,"tag":84,"props":248861,"children":248862},{},[248863],{"type":23,"value":248864},"cross-vendor integrations",{"type":17,"tag":84,"props":248866,"children":248867},{},[248868],{"type":23,"value":248869},"automation and agent workflows",{"type":17,"tag":84,"props":248871,"children":248872},{},[248873],{"type":23,"value":248874},"user-facing features that depend on timely updates",{"type":17,"tag":25,"props":248876,"children":248877},{},[],{"type":17,"tag":68,"props":248879,"children":248880},{"id":9491},[248881],{"type":23,"value":9494},{"type":17,"tag":29,"props":248883,"children":248884},{},[248885],{"type":23,"value":248886},"Polling works early.",{"type":17,"tag":29,"props":248888,"children":248889},{},[248890],{"type":23,"value":248891},"Native webhooks work when they exist.",{"type":17,"tag":29,"props":248893,"children":248894},{},[248895],{"type":23,"value":248896},"Virtual webhooks are designed for environments where neither assumption holds.",{"type":17,"tag":29,"props":248898,"children":248899},{},[248900],{"type":23,"value":248901},"Choosing an event delivery model is not about preference. It is about which failure modes you want to own as your system scales:",{"type":17,"tag":80,"props":248903,"children":248904},{},[248905,248910,248915],{"type":17,"tag":84,"props":248906,"children":248907},{},[248908],{"type":23,"value":248909},"distributed polling infrastructure",{"type":17,"tag":84,"props":248911,"children":248912},{},[248913],{"type":23,"value":248914},"inconsistent provider behavior",{"type":17,"tag":84,"props":248916,"children":248917},{},[248918],{"type":23,"value":248919},"or centralized change detection",{"type":17,"tag":29,"props":248921,"children":248922},{},[248923],{"type":23,"value":248924},"That choice determines whether your integration layer becomes a bottleneck—or an abstraction.",{"type":17,"tag":29,"props":248926,"children":248927},{},[248928,248932,248933],{"type":17,"tag":48,"props":248929,"children":248930},{},[248931],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":248934,"children":248936},{"href":1612,"rel":248935},[214],[248937],{"type":17,"tag":48,"props":248938,"children":248939},{},[248940],{"type":23,"value":1616},{"type":17,"tag":29,"props":248942,"children":248943},{},[248944,248948,248949],{"type":17,"tag":48,"props":248945,"children":248946},{},[248947],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":248950,"children":248952},{"href":1623,"rel":248951},[214],[248953],{"type":17,"tag":48,"props":248954,"children":248955},{},[248956],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":248958},[248959,248962,248965,248968,248969,248970],{"id":248185,"depth":1629,"text":248188,"children":248960},[248961],{"id":248218,"depth":1635,"text":248221},{"id":248354,"depth":1629,"text":248357,"children":248963},[248964],{"id":248390,"depth":1635,"text":248393},{"id":248478,"depth":1629,"text":248481,"children":248966},[248967],{"id":248548,"depth":1635,"text":248551},{"id":248667,"depth":1629,"text":248670},{"id":248787,"depth":1629,"text":248790},{"id":9491,"depth":1629,"text":9494},"content:blog:which_event_delivery_model_scales_polling_webhooks_or_virtual_webhooks.md","blog/which_event_delivery_model_scales_polling_webhooks_or_virtual_webhooks.md","blog/which_event_delivery_model_scales_polling_webhooks_or_virtual_webhooks",{"_path":248975,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":248976,"description":248977,"img":248978,"date":248979,"tag":12,"body":248980,"_type":1677,"_id":249611,"_source":1679,"_file":249612,"_stem":249613,"_extension":1682},"/blog/what_are_virtual_webhooks_how_they_differ_from_sync_based_webhooks","What Are Virtual Webhooks? How They Differ From Sync-Based Webhooks","Virtual webhooks provide event delivery for integrations that don't support native webhooks.","https://s3.us-east-2.amazonaws.com/unified-article-images/what_are_virtual_webhooks_how_they_differ_from_sync_based_webhooks-icon.png","2025-12-15T22:50:00.000Z",{"type":14,"children":248981,"toc":249596},[248982,248987,248990,248997,249007,249012,249017,249022,249027,249041,249047,249052,249067,249072,249078,249083,249087,249105,249109,249127,249134,249139,249145,249150,249168,249173,249177,249190,249196,249201,249315,249320,249325,249331,249337,249342,249355,249360,249364,249369,249386,249391,249397,249402,249420,249425,249429,249434,249439,249445,249450,249468,249473,249491,249496,249502,249507,249530,249534,249539,249552,249569,249574,249585],{"type":17,"tag":18,"props":248983,"children":248985},{"id":248984},"what-are-virtual-webhooks-how-they-differ-from-sync-based-webhooks",[248986],{"type":23,"value":248976},{"type":17,"tag":25,"props":248988,"children":248989},{},[],{"type":17,"tag":29,"props":248991,"children":248992},{},[248993],{"type":17,"tag":33,"props":248994,"children":248995},{},[248996],{"type":23,"value":248117},{"type":17,"tag":29,"props":248998,"children":248999},{},[249000,249001,249005],{"type":23,"value":172596},{"type":17,"tag":133,"props":249002,"children":249003},{"href":4999},[249004],{"type":23,"value":5002},{"type":23,"value":249006},"](/blog/unlock_real_time_data_with_virtual_webhooks) provide event delivery for integrations that don't support native webhooks.",{"type":17,"tag":29,"props":249008,"children":249009},{},[249010],{"type":23,"value":249011},"Instead of requiring your application to poll APIs for changes, the integration layer detects changes and delivers them as webhook events.",{"type":17,"tag":29,"props":249013,"children":249014},{},[249015],{"type":23,"value":249016},"This is not how all 'webhooks' work.",{"type":17,"tag":29,"props":249018,"children":249019},{},[249020],{"type":23,"value":249021},"Some systems emit events when a change is detected. Others emit events after data has been synced into a stored copy.",{"type":17,"tag":29,"props":249023,"children":249024},{},[249025],{"type":23,"value":249026},"That distinction affects latency, API usage, and how much infrastructure your team owns.",{"type":17,"tag":3414,"props":249028,"children":249029},{},[249030],{"type":17,"tag":29,"props":249031,"children":249032},{},[249033,249035,249039],{"type":23,"value":249034},"For a broader comparison of how ",{"type":17,"tag":133,"props":249036,"children":249037},{"href":7691},[249038],{"type":23,"value":7459},{"type":23,"value":249040}," platforms implement virtual webhooks vs sync-based notification systems, see: Which Unified API Platforms Support Virtual Webhooks vs Sync-Based Notifications",{"type":17,"tag":68,"props":249042,"children":249044},{"id":249043},"native-webhooks-baseline",[249045],{"type":23,"value":249046},"Native webhooks (baseline)",{"type":17,"tag":29,"props":249048,"children":249049},{},[249050],{"type":23,"value":249051},"Native webhooks are emitted by the source system.",{"type":17,"tag":80,"props":249053,"children":249054},{},[249055,249059,249063],{"type":17,"tag":84,"props":249056,"children":249057},{},[249058],{"type":23,"value":9037},{"type":17,"tag":84,"props":249060,"children":249061},{},[249062],{"type":23,"value":215494},{"type":17,"tag":84,"props":249064,"children":249065},{},[249066],{"type":23,"value":9047},{"type":17,"tag":29,"props":249068,"children":249069},{},[249070],{"type":23,"value":249071},"This is the simplest model, but coverage is limited. Many APIs do not support webhooks consistently across objects.",{"type":17,"tag":68,"props":249073,"children":249075},{"id":249074},"virtual-webhooks-detect-deliver",[249076],{"type":23,"value":249077},"Virtual webhooks (detect → deliver)",{"type":17,"tag":29,"props":249079,"children":249080},{},[249081],{"type":23,"value":249082},"Virtual webhooks provide event delivery when native webhooks are not available.",{"type":17,"tag":29,"props":249084,"children":249085},{},[249086],{"type":23,"value":9087},{"type":17,"tag":80,"props":249088,"children":249089},{},[249090,249095,249100],{"type":17,"tag":84,"props":249091,"children":249092},{},[249093],{"type":23,"value":249094},"the integration layer polls the source API",{"type":17,"tag":84,"props":249096,"children":249097},{},[249098],{"type":23,"value":249099},"detects changes using timestamps, cursors, or diffs",{"type":17,"tag":84,"props":249101,"children":249102},{},[249103],{"type":23,"value":249104},"delivers a webhook event when a change is detected",{"type":17,"tag":29,"props":249106,"children":249107},{},[249108],{"type":23,"value":229216},{"type":17,"tag":80,"props":249110,"children":249111},{},[249112,249117,249122],{"type":17,"tag":84,"props":249113,"children":249114},{},[249115],{"type":23,"value":249116},"you subscribe once",{"type":17,"tag":84,"props":249118,"children":249119},{},[249120],{"type":23,"value":249121},"you receive events",{"type":17,"tag":84,"props":249123,"children":249124},{},[249125],{"type":23,"value":249126},"you do not manage polling infrastructure",{"type":17,"tag":3414,"props":249128,"children":249129},{},[249130],{"type":17,"tag":29,"props":249131,"children":249132},{},[249133],{"type":23,"value":215550},{"type":17,"tag":29,"props":249135,"children":249136},{},[249137],{"type":23,"value":249138},"Virtual webhooks replace application-level polling with centralized change detection.",{"type":17,"tag":68,"props":249140,"children":249142},{"id":249141},"sync-based-webhooks-sync-notify",[249143],{"type":23,"value":249144},"Sync-based webhooks (sync → notify)",{"type":17,"tag":29,"props":249146,"children":249147},{},[249148],{"type":23,"value":249149},"Some platforms use a different model.",{"type":17,"tag":80,"props":249151,"children":249152},{},[249153,249158,249163],{"type":17,"tag":84,"props":249154,"children":249155},{},[249156],{"type":23,"value":249157},"data is retrieved on a schedule",{"type":17,"tag":84,"props":249159,"children":249160},{},[249161],{"type":23,"value":249162},"records are written into a vendor-managed store",{"type":17,"tag":84,"props":249164,"children":249165},{},[249166],{"type":23,"value":249167},"webhook events are emitted after the sync completes",{"type":17,"tag":29,"props":249169,"children":249170},{},[249171],{"type":23,"value":249172},"These events are tied to batch updates, not real-time change detection.",{"type":17,"tag":29,"props":249174,"children":249175},{},[249176],{"type":23,"value":9195},{"type":17,"tag":80,"props":249178,"children":249179},{},[249180,249185],{"type":17,"tag":84,"props":249181,"children":249182},{},[249183],{"type":23,"value":249184},"the webhook signals that data changed",{"type":17,"tag":84,"props":249186,"children":249187},{},[249188],{"type":23,"value":249189},"your application retrieves updated records separately",{"type":17,"tag":68,"props":249191,"children":249193},{"id":249192},"the-key-difference-data-vs-signal",[249194],{"type":23,"value":249195},"The key difference: data vs signal",{"type":17,"tag":29,"props":249197,"children":249198},{},[249199],{"type":23,"value":249200},"The core distinction is what the webhook delivers and when it is generated.",{"type":17,"tag":7231,"props":249202,"children":249203},{},[249204,249224],{"type":17,"tag":7235,"props":249205,"children":249206},{},[249207],{"type":17,"tag":7239,"props":249208,"children":249209},{},[249210,249215,249219],{"type":17,"tag":7243,"props":249211,"children":249212},{},[249213],{"type":23,"value":249214},"Aspect",{"type":17,"tag":7243,"props":249216,"children":249217},{},[249218],{"type":23,"value":9256},{"type":17,"tag":7243,"props":249220,"children":249221},{},[249222],{"type":23,"value":249223},"Sync-based webhooks",{"type":17,"tag":7259,"props":249225,"children":249226},{},[249227,249245,249263,249281,249297],{"type":17,"tag":7239,"props":249228,"children":249229},{},[249230,249235,249240],{"type":17,"tag":7266,"props":249231,"children":249232},{},[249233],{"type":23,"value":249234},"Trigger",{"type":17,"tag":7266,"props":249236,"children":249237},{},[249238],{"type":23,"value":249239},"Change detection",{"type":17,"tag":7266,"props":249241,"children":249242},{},[249243],{"type":23,"value":249244},"Sync completion",{"type":17,"tag":7239,"props":249246,"children":249247},{},[249248,249253,249258],{"type":17,"tag":7266,"props":249249,"children":249250},{},[249251],{"type":23,"value":249252},"Payload",{"type":17,"tag":7266,"props":249254,"children":249255},{},[249256],{"type":23,"value":249257},"Often includes updated data",{"type":17,"tag":7266,"props":249259,"children":249260},{},[249261],{"type":23,"value":249262},"Often a signal only",{"type":17,"tag":7239,"props":249264,"children":249265},{},[249266,249271,249276],{"type":17,"tag":7266,"props":249267,"children":249268},{},[249269],{"type":23,"value":249270},"Follow-up API call",{"type":17,"tag":7266,"props":249272,"children":249273},{},[249274],{"type":23,"value":249275},"Often not required",{"type":17,"tag":7266,"props":249277,"children":249278},{},[249279],{"type":23,"value":249280},"Often required",{"type":17,"tag":7239,"props":249282,"children":249283},{},[249284,249288,249293],{"type":17,"tag":7266,"props":249285,"children":249286},{},[249287],{"type":23,"value":69408},{"type":17,"tag":7266,"props":249289,"children":249290},{},[249291],{"type":23,"value":249292},"Not required",{"type":17,"tag":7266,"props":249294,"children":249295},{},[249296],{"type":23,"value":47953},{"type":17,"tag":7239,"props":249298,"children":249299},{},[249300,249305,249310],{"type":17,"tag":7266,"props":249301,"children":249302},{},[249303],{"type":23,"value":249304},"Latency bound by",{"type":17,"tag":7266,"props":249306,"children":249307},{},[249308],{"type":23,"value":249309},"Detection interval",{"type":17,"tag":7266,"props":249311,"children":249312},{},[249313],{"type":23,"value":249314},"Sync schedule + storage lag",{"type":17,"tag":29,"props":249316,"children":249317},{},[249318],{"type":23,"value":249319},"Virtual webhooks are generated from detected changes in the source system.",{"type":17,"tag":29,"props":249321,"children":249322},{},[249323],{"type":23,"value":249324},"Sync-based webhooks are generated from changes in a stored copy.",{"type":17,"tag":68,"props":249326,"children":249328},{"id":249327},"why-this-difference-matters",[249329],{"type":23,"value":249330},"Why this difference matters",{"type":17,"tag":239,"props":249332,"children":249334},{"id":249333},"api-usage",[249335],{"type":23,"value":249336},"API usage",{"type":17,"tag":29,"props":249338,"children":249339},{},[249340],{"type":23,"value":249341},"Sync-based systems often require:",{"type":17,"tag":80,"props":249343,"children":249344},{},[249345,249350],{"type":17,"tag":84,"props":249346,"children":249347},{},[249348],{"type":23,"value":249349},"one event",{"type":17,"tag":84,"props":249351,"children":249352},{},[249353],{"type":23,"value":249354},"one or more follow-up API calls",{"type":17,"tag":29,"props":249356,"children":249357},{},[249358],{"type":23,"value":249359},"Virtual webhooks can deliver updated records in the initial event, reducing additional reads.",{"type":17,"tag":239,"props":249361,"children":249362},{"id":838},[249363],{"type":23,"value":9978},{"type":17,"tag":29,"props":249365,"children":249366},{},[249367],{"type":23,"value":249368},"Sync-based systems introduce delay from:",{"type":17,"tag":80,"props":249370,"children":249371},{},[249372,249376,249381],{"type":17,"tag":84,"props":249373,"children":249374},{},[249375],{"type":23,"value":87261},{"type":17,"tag":84,"props":249377,"children":249378},{},[249379],{"type":23,"value":249380},"processing queues",{"type":17,"tag":84,"props":249382,"children":249383},{},[249384],{"type":23,"value":249385},"storage updates",{"type":17,"tag":29,"props":249387,"children":249388},{},[249389],{"type":23,"value":249390},"Virtual webhooks are bounded by how frequently changes are detected.",{"type":17,"tag":239,"props":249392,"children":249394},{"id":249393},"system-design",[249395],{"type":23,"value":249396},"System design",{"type":17,"tag":29,"props":249398,"children":249399},{},[249400],{"type":23,"value":249401},"Sync-based systems require handling:",{"type":17,"tag":80,"props":249403,"children":249404},{},[249405,249410,249415],{"type":17,"tag":84,"props":249406,"children":249407},{},[249408],{"type":23,"value":249409},"sync state",{"type":17,"tag":84,"props":249411,"children":249412},{},[249413],{"type":23,"value":249414},"replica consistency",{"type":17,"tag":84,"props":249416,"children":249417},{},[249418],{"type":23,"value":249419},"timing mismatches between sync and events",{"type":17,"tag":29,"props":249421,"children":249422},{},[249423],{"type":23,"value":249424},"Virtual webhooks reduce this to a single event stream based on detected changes.",{"type":17,"tag":239,"props":249426,"children":249427},{"id":215742},[249428],{"type":23,"value":7324},{"type":17,"tag":29,"props":249430,"children":249431},{},[249432],{"type":23,"value":249433},"Sync-based systems depend on storing customer data in a vendor-managed database.",{"type":17,"tag":29,"props":249435,"children":249436},{},[249437],{"type":23,"value":249438},"Virtual webhook systems can operate without storing customer records, retrieving data directly from the source API when events are generated.",{"type":17,"tag":68,"props":249440,"children":249442},{"id":249441},"how-unified-implements-virtual-webhooks",[249443],{"type":23,"value":249444},"How Unified implements virtual webhooks",{"type":17,"tag":29,"props":249446,"children":249447},{},[249448],{"type":23,"value":249449},"Unified uses a change-detection model to deliver webhook events without storing customer data.",{"type":17,"tag":80,"props":249451,"children":249452},{},[249453,249458,249463],{"type":17,"tag":84,"props":249454,"children":249455},{},[249456],{"type":23,"value":249457},"polling and change detection are handled internally",{"type":17,"tag":84,"props":249459,"children":249460},{},[249461],{"type":23,"value":249462},"events are generated from source API changes",{"type":17,"tag":84,"props":249464,"children":249465},{},[249466],{"type":23,"value":249467},"additional data is retrieved directly from the source API",{"type":17,"tag":29,"props":249469,"children":249470},{},[249471],{"type":23,"value":249472},"This avoids:",{"type":17,"tag":80,"props":249474,"children":249475},{},[249476,249481,249486],{"type":17,"tag":84,"props":249477,"children":249478},{},[249479],{"type":23,"value":249480},"maintaining a replicated data layer",{"type":17,"tag":84,"props":249482,"children":249483},{},[249484],{"type":23,"value":249485},"cache-based inconsistencies",{"type":17,"tag":84,"props":249487,"children":249488},{},[249489],{"type":23,"value":249490},"managing sync jobs",{"type":17,"tag":29,"props":249492,"children":249493},{},[249494],{"type":23,"value":249495},"The result is a consistent event model across integrations, regardless of whether native webhooks exist.",{"type":17,"tag":68,"props":249497,"children":249499},{"id":249498},"when-virtual-webhooks-are-the-right-fit",[249500],{"type":23,"value":249501},"When virtual webhooks are the right fit",{"type":17,"tag":29,"props":249503,"children":249504},{},[249505],{"type":23,"value":249506},"Virtual webhooks are useful when:",{"type":17,"tag":80,"props":249508,"children":249509},{},[249510,249515,249520,249525],{"type":17,"tag":84,"props":249511,"children":249512},{},[249513],{"type":23,"value":249514},"the integration does not provide native webhooks",{"type":17,"tag":84,"props":249516,"children":249517},{},[249518],{"type":23,"value":249519},"your product depends on timely updates",{"type":17,"tag":84,"props":249521,"children":249522},{},[249523],{"type":23,"value":249524},"you want to avoid building polling infrastructure",{"type":17,"tag":84,"props":249526,"children":249527},{},[249528],{"type":23,"value":249529},"you want to avoid managing sync pipelines or stored replicas",{"type":17,"tag":68,"props":249531,"children":249532},{"id":45643},[249533],{"type":23,"value":45646},{"type":17,"tag":29,"props":249535,"children":249536},{},[249537],{"type":23,"value":249538},"Not all webhooks are event-driven in the same way.",{"type":17,"tag":80,"props":249540,"children":249541},{},[249542,249547],{"type":17,"tag":84,"props":249543,"children":249544},{},[249545],{"type":23,"value":249546},"Virtual webhooks detect changes and deliver events",{"type":17,"tag":84,"props":249548,"children":249549},{},[249550],{"type":23,"value":249551},"Sync-based webhooks notify after batch updates",{"type":17,"tag":29,"props":249553,"children":249554},{},[249555,249557,249562,249563,249568],{"type":23,"value":249556},"The difference is whether your system receives ",{"type":17,"tag":48,"props":249558,"children":249559},{},[249560],{"type":23,"value":249561},"data when it changes",{"type":23,"value":27293},{"type":17,"tag":48,"props":249564,"children":249565},{},[249566],{"type":23,"value":249567},"a signal that requires additional retrieval",{"type":23,"value":54},{"type":17,"tag":29,"props":249570,"children":249571},{},[249572],{"type":23,"value":249573},"That distinction determines latency, architecture, and how much integration logic your team owns.",{"type":17,"tag":29,"props":249575,"children":249576},{},[249577],{"type":17,"tag":133,"props":249578,"children":249580},{"href":1612,"rel":249579},[214],[249581],{"type":17,"tag":48,"props":249582,"children":249583},{},[249584],{"type":23,"value":1616},{"type":17,"tag":29,"props":249586,"children":249587},{},[249588],{"type":17,"tag":133,"props":249589,"children":249591},{"href":1623,"rel":249590},[214],[249592],{"type":17,"tag":48,"props":249593,"children":249594},{},[249595],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":249597},[249598,249599,249600,249601,249602,249608,249609,249610],{"id":249043,"depth":1629,"text":249046},{"id":249074,"depth":1629,"text":249077},{"id":249141,"depth":1629,"text":249144},{"id":249192,"depth":1629,"text":249195},{"id":249327,"depth":1629,"text":249330,"children":249603},[249604,249605,249606,249607],{"id":249333,"depth":1635,"text":249336},{"id":838,"depth":1635,"text":9978},{"id":249393,"depth":1635,"text":249396},{"id":215742,"depth":1635,"text":7324},{"id":249441,"depth":1629,"text":249444},{"id":249498,"depth":1629,"text":249501},{"id":45643,"depth":1629,"text":45646},"content:blog:what_are_virtual_webhooks_how_they_differ_from_sync_based_webhooks.md","blog/what_are_virtual_webhooks_how_they_differ_from_sync_based_webhooks.md","blog/what_are_virtual_webhooks_how_they_differ_from_sync_based_webhooks",{"_path":249615,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":249616,"description":249617,"img":249618,"date":249619,"tag":12,"body":249620,"_type":1677,"_id":251095,"_source":1679,"_file":251096,"_stem":251097,"_extension":1682},"/blog/which_unified_api_platforms_support_virtual_webhooks_vs_sync_based_notifications","Which Unified API Platforms Support Virtual Webhooks vs Sync-Based Notifications?","When SaaS teams evaluate unified API platforms, one question comes up quickly, what happens when an integration does not support native webhooks?","https://s3.us-east-2.amazonaws.com/unified-article-images/which_unified_api_platforms_support_virtual_webhooks_vs_sync_based_notifications-icon.png","2025-12-15T00:00:00.000Z",{"type":14,"children":249621,"toc":251041},[249622,249627,249630,249637,249653,249658,249662,249667,249672,249699,249704,249710,249714,249718,249723,249727,249745,249750,249754,249759,249770,249787,249799,249805,249810,249815,249833,249838,249851,249856,249862,249867,249872,249895,249901,249924,249929,249935,249940,249944,249949,249954,249959,249964,249969,249974,249980,249985,249990,249996,250001,250006,250011,250016,250022,250027,250033,250040,250046,250053,250059,250085,250090,250096,250104,250108,250113,250117,250144,250149,250157,250161,250166,250170,250193,250198,250203,250208,250212,250235,250240,250245,250250,250254,250277,250282,250286,250291,250295,250318,250323,250327,250332,250336,250359,250364,250368,250373,250377,250400,250406,250661,250667,250672,250678,250683,250689,250694,250698,250703,250708,250714,250719,250724,250729,250762,250768,250773,250791,250796,250802,250807,250842,250847,250851,250855,250873,250877,250894,250900,250918,250924,250947,250953,250958,250963,250968,250973,250996,251001,251005,251009,251014,251019,251030],{"type":17,"tag":18,"props":249623,"children":249625},{"id":249624},"which-unified-api-platforms-support-virtual-webhooks-vs-sync-based-notifications",[249626],{"type":23,"value":249616},{"type":17,"tag":25,"props":249628,"children":249629},{},[],{"type":17,"tag":29,"props":249631,"children":249632},{},[249633],{"type":17,"tag":33,"props":249634,"children":249635},{},[249636],{"type":23,"value":248117},{"type":17,"tag":29,"props":249638,"children":249639},{},[249640,249642,249646,249648,249652],{"type":23,"value":249641},"When SaaS teams evaluate ",{"type":17,"tag":133,"props":249643,"children":249644},{"href":7691},[249645],{"type":23,"value":7459},{"type":23,"value":249647}," platforms, one question comes up quickly: what happens when an integration does not support native ",{"type":17,"tag":133,"props":249649,"children":249650},{"href":4999},[249651],{"type":23,"value":5002},{"type":23,"value":228656},{"type":17,"tag":29,"props":249654,"children":249655},{},[249656],{"type":23,"value":249657},"There are two very different answers. Some platforms detect changes from the source API and deliver events through a webhook interface. Others run scheduled sync jobs, update their own stored copy of the data, and then notify you that something changed. Those models create very different tradeoffs around latency, architecture, and how much work still lives in your application.",{"type":17,"tag":239,"props":249659,"children":249660},{"id":883},[249661],{"type":23,"value":886},{"type":17,"tag":29,"props":249663,"children":249664},{},[249665],{"type":23,"value":249666},"Most unified API platforms say they support webhooks. That label alone does not tell you enough.",{"type":17,"tag":29,"props":249668,"children":249669},{},[249670],{"type":23,"value":249671},"The real questions are:",{"type":17,"tag":80,"props":249673,"children":249674},{},[249675,249679,249684,249689,249694],{"type":17,"tag":84,"props":249676,"children":249677},{},[249678],{"type":23,"value":179713},{"type":17,"tag":84,"props":249680,"children":249681},{},[249682],{"type":23,"value":249683},"When is an event sent?",{"type":17,"tag":84,"props":249685,"children":249686},{},[249687],{"type":23,"value":249688},"Does the event include the updated record?",{"type":17,"tag":84,"props":249690,"children":249691},{},[249692],{"type":23,"value":249693},"Do you need another API call after the event?",{"type":17,"tag":84,"props":249695,"children":249696},{},[249697],{"type":23,"value":249698},"Is customer data stored by the platform?",{"type":17,"tag":29,"props":249700,"children":249701},{},[249702],{"type":23,"value":249703},"Those details determine whether your product processes changes immediately, or whether your team still ends up building background logic to retrieve, deduplicate, and reconcile updates.",{"type":17,"tag":68,"props":249705,"children":249707},{"id":249706},"event-delivery-models",[249708],{"type":23,"value":249709},"Event delivery models",{"type":17,"tag":239,"props":249711,"children":249712},{"id":9021},[249713],{"type":23,"value":9024},{"type":17,"tag":29,"props":249715,"children":249716},{},[249717],{"type":23,"value":9029},{"type":17,"tag":29,"props":249719,"children":249720},{},[249721],{"type":23,"value":249722},"The source integration detects a change and sends an event directly. If the source API supports webhook subscriptions and the coverage is good enough, this is the cleanest path.",{"type":17,"tag":29,"props":249724,"children":249725},{},[249726],{"type":23,"value":204371},{"type":17,"tag":80,"props":249728,"children":249729},{},[249730,249735,249740],{"type":17,"tag":84,"props":249731,"children":249732},{},[249733],{"type":23,"value":249734},"source integration detects a change",{"type":17,"tag":84,"props":249736,"children":249737},{},[249738],{"type":23,"value":249739},"source integration sends an event",{"type":17,"tag":84,"props":249741,"children":249742},{},[249743],{"type":23,"value":249744},"your application processes it",{"type":17,"tag":29,"props":249746,"children":249747},{},[249748],{"type":23,"value":249749},"The limitation is coverage. Many SaaS APIs do not support native webhooks consistently, and some do not support them at all.",{"type":17,"tag":239,"props":249751,"children":249752},{"id":164743},[249753],{"type":23,"value":9256},{"type":17,"tag":29,"props":249755,"children":249756},{},[249757],{"type":23,"value":249758},"This is the event delivery model that matters most when native webhook coverage is missing.",{"type":17,"tag":29,"props":249760,"children":249761},{},[249762,249764,249768],{"type":23,"value":249763},"With ",{"type":17,"tag":133,"props":249765,"children":249766},{"href":9007},[249767],{"type":23,"value":46572},{"type":23,"value":249769},", the integration layer:",{"type":17,"tag":80,"props":249771,"children":249772},{},[249773,249778,249782],{"type":17,"tag":84,"props":249774,"children":249775},{},[249776],{"type":23,"value":249777},"polls the source API",{"type":17,"tag":84,"props":249779,"children":249780},{},[249781],{"type":23,"value":249099},{"type":17,"tag":84,"props":249783,"children":249784},{},[249785],{"type":23,"value":249786},"delivers events directly to your webhook endpoint",{"type":17,"tag":29,"props":249788,"children":249789},{},[249790,249792,249797],{"type":23,"value":249791},"The important distinction is that polling is handled inside the integration layer, not inside your application. Unified's webhook guidance is explicit here: this should be described as ",{"type":17,"tag":48,"props":249793,"children":249794},{},[249795],{"type":23,"value":249796},"detect changes → deliver events",{"type":23,"value":249798},", not as an approximation of native webhooks.",{"type":17,"tag":239,"props":249800,"children":249802},{"id":249801},"sync-based-notification-systems",[249803],{"type":23,"value":249804},"Sync-based notification systems",{"type":17,"tag":29,"props":249806,"children":249807},{},[249808],{"type":23,"value":249809},"This is a different architecture and should be treated separately.",{"type":17,"tag":29,"props":249811,"children":249812},{},[249813],{"type":23,"value":249814},"In this model, the platform:",{"type":17,"tag":80,"props":249816,"children":249817},{},[249818,249823,249828],{"type":17,"tag":84,"props":249819,"children":249820},{},[249821],{"type":23,"value":249822},"runs a scheduled sync",{"type":17,"tag":84,"props":249824,"children":249825},{},[249826],{"type":23,"value":249827},"stores records in its own environment",{"type":17,"tag":84,"props":249829,"children":249830},{},[249831],{"type":23,"value":249832},"emits a notification after the sync finishes",{"type":17,"tag":29,"props":249834,"children":249835},{},[249836],{"type":23,"value":249837},"Typical patterns look like:",{"type":17,"tag":80,"props":249839,"children":249840},{},[249841,249846],{"type":17,"tag":84,"props":249842,"children":249843},{},[249844],{"type":23,"value":249845},"sync → notify",{"type":17,"tag":84,"props":249847,"children":249848},{},[249849],{"type":23,"value":249850},"poll → notify → fetch",{"type":17,"tag":29,"props":249852,"children":249853},{},[249854],{"type":23,"value":249855},"These are not the same as virtual webhooks. The notification often tells you that records changed, but your application still has to retrieve the updated data separately. Roy's positioning guidance is explicit that sync-based notification systems should not be grouped under the same category as virtual webhooks.",{"type":17,"tag":68,"props":249857,"children":249859},{"id":249858},"virtual-webhooks-vs-sync-based-notifications",[249860],{"type":23,"value":249861},"Virtual webhooks vs sync-based notifications",{"type":17,"tag":29,"props":249863,"children":249864},{},[249865],{"type":23,"value":249866},"Here is the real distinction.",{"type":17,"tag":239,"props":249868,"children":249870},{"id":249869},"virtual-webhooks-1",[249871],{"type":23,"value":9256},{"type":17,"tag":80,"props":249873,"children":249874},{},[249875,249880,249885,249890],{"type":17,"tag":84,"props":249876,"children":249877},{},[249878],{"type":23,"value":249879},"change detection happens against the source API",{"type":17,"tag":84,"props":249881,"children":249882},{},[249883],{"type":23,"value":249884},"events are delivered through a webhook interface",{"type":17,"tag":84,"props":249886,"children":249887},{},[249888],{"type":23,"value":249889},"no stored customer data is required",{"type":17,"tag":84,"props":249891,"children":249892},{},[249893],{"type":23,"value":249894},"follow-up reads may not be required, depending on payload design",{"type":17,"tag":239,"props":249896,"children":249898},{"id":249897},"sync-based-notifications",[249899],{"type":23,"value":249900},"Sync-based notifications",{"type":17,"tag":80,"props":249902,"children":249903},{},[249904,249909,249914,249919],{"type":17,"tag":84,"props":249905,"children":249906},{},[249907],{"type":23,"value":249908},"records are synced into the platform's own store",{"type":17,"tag":84,"props":249910,"children":249911},{},[249912],{"type":23,"value":249913},"an event is sent after the sync completes",{"type":17,"tag":84,"props":249915,"children":249916},{},[249917],{"type":23,"value":249918},"your application often retrieves updated records separately",{"type":17,"tag":84,"props":249920,"children":249921},{},[249922],{"type":23,"value":249923},"timing depends on sync cadence, not direct change detection",{"type":17,"tag":29,"props":249925,"children":249926},{},[249927],{"type":23,"value":249928},"That difference affects every downstream decision: feature latency, backend complexity, compliance review, and whether your team is processing events or constantly reconciling stored replicas.",{"type":17,"tag":68,"props":249930,"children":249932},{"id":249931},"what-real-time-actually-means",[249933],{"type":23,"value":249934},"What 'real-time' actually means",{"type":17,"tag":29,"props":249936,"children":249937},{},[249938],{"type":23,"value":249939},"Not every event model produces the same level of freshness.",{"type":17,"tag":239,"props":249941,"children":249942},{"id":229309},[249943],{"type":23,"value":9024},{"type":17,"tag":29,"props":249945,"children":249946},{},[249947],{"type":23,"value":249948},"Near-instant, assuming the source integration supports them reliably.",{"type":17,"tag":239,"props":249950,"children":249952},{"id":249951},"virtual-webhooks-2",[249953],{"type":23,"value":9256},{"type":17,"tag":29,"props":249955,"children":249956},{},[249957],{"type":23,"value":249958},"Bounded by polling interval and change detection frequency. In a strong implementation, this can be close enough for user-facing automation, alerts, and AI workflows.",{"type":17,"tag":239,"props":249960,"children":249962},{"id":249961},"sync-based-notifications-1",[249963],{"type":23,"value":249900},{"type":17,"tag":29,"props":249965,"children":249966},{},[249967],{"type":23,"value":249968},"Bounded by sync cadence. Depending on plan or integration, that may mean minutes, hours, or daily intervals.",{"type":17,"tag":29,"props":249970,"children":249971},{},[249972],{"type":23,"value":249973},"If your feature depends on timing, these differences are not theoretical. They show up in customer experience immediately.",{"type":17,"tag":68,"props":249975,"children":249977},{"id":249976},"what-the-webhook-actually-sends",[249978],{"type":23,"value":249979},"What the webhook actually sends",{"type":17,"tag":29,"props":249981,"children":249982},{},[249983],{"type":23,"value":249984},"This is where a lot of evaluations go wrong.",{"type":17,"tag":29,"props":249986,"children":249987},{},[249988],{"type":23,"value":249989},"There are two common payload patterns.",{"type":17,"tag":239,"props":249991,"children":249993},{"id":249992},"event-with-updated-records",[249994],{"type":23,"value":249995},"Event with updated records",{"type":17,"tag":29,"props":249997,"children":249998},{},[249999],{"type":23,"value":250000},"The webhook includes the record or records that changed, so your application can process the event immediately.",{"type":17,"tag":239,"props":250002,"children":250004},{"id":250003},"notification-only",[250005],{"type":23,"value":9313},{"type":17,"tag":29,"props":250007,"children":250008},{},[250009],{"type":23,"value":250010},"The webhook tells you that something changed, but your application still has to call the API to retrieve the updated records.",{"type":17,"tag":29,"props":250012,"children":250013},{},[250014],{"type":23,"value":250015},"That second pattern is far more common than many teams expect. And if you still need another API call after every event, a large part of the operational burden remains in your own application.",{"type":17,"tag":68,"props":250017,"children":250019},{"id":250018},"where-unified-api-platforms-fall",[250020],{"type":23,"value":250021},"Where unified API platforms fall",{"type":17,"tag":29,"props":250023,"children":250024},{},[250025],{"type":23,"value":250026},"Based on documented behavior, these platforms generally cluster into three groups.",{"type":17,"tag":239,"props":250028,"children":250030},{"id":250029},"platforms-that-support-native-and-virtual-webhooks",[250031],{"type":23,"value":250032},"Platforms that support native and virtual webhooks",{"type":17,"tag":80,"props":250034,"children":250035},{},[250036],{"type":17,"tag":84,"props":250037,"children":250038},{},[250039],{"type":23,"value":87523},{"type":17,"tag":239,"props":250041,"children":250043},{"id":250042},"platforms-that-support-polling-based-event-delivery-but-often-with-notification-first-behavior",[250044],{"type":23,"value":250045},"Platforms that support polling-based event delivery, but often with notification-first behavior",{"type":17,"tag":80,"props":250047,"children":250048},{},[250049],{"type":17,"tag":84,"props":250050,"children":250051},{},[250052],{"type":23,"value":237},{"type":17,"tag":239,"props":250054,"children":250056},{"id":250055},"platforms-that-rely-primarily-on-sync-based-notifications-or-hybrid-sync-models",[250057],{"type":23,"value":250058},"Platforms that rely primarily on sync-based notifications or hybrid sync models",{"type":17,"tag":80,"props":250060,"children":250061},{},[250062,250066,250070,250075,250080],{"type":17,"tag":84,"props":250063,"children":250064},{},[250065],{"type":23,"value":227},{"type":17,"tag":84,"props":250067,"children":250068},{},[250069],{"type":23,"value":7978},{"type":17,"tag":84,"props":250071,"children":250072},{},[250073],{"type":23,"value":250074},"Paragon Managed Sync",{"type":17,"tag":84,"props":250076,"children":250077},{},[250078],{"type":23,"value":250079},"Truto scheduled sync jobs",{"type":17,"tag":84,"props":250081,"children":250082},{},[250083],{"type":23,"value":250084},"StackOne synthetic events",{"type":17,"tag":29,"props":250086,"children":250087},{},[250088],{"type":23,"value":250089},"Some platforms use more than one model depending on product area. That is why 'supports webhooks' is not a complete answer.",{"type":17,"tag":68,"props":250091,"children":250093},{"id":250092},"provider-by-provider-overview",[250094],{"type":23,"value":250095},"Provider-by-provider overview",{"type":17,"tag":29,"props":250097,"children":250098},{},[250099],{"type":17,"tag":6438,"props":250100,"children":250103},{"alt":250101,"src":250102},"Unified_Webhooks__Databases.png","https://s3.us-east-2.amazonaws.com/unified-article-images/which_unified_api_platforms_support_virtual_webhooks_vs_sync_based_notifications-0.png",[],{"type":17,"tag":239,"props":250105,"children":250106},{"id":105425},[250107],{"type":23,"value":87523},{"type":17,"tag":29,"props":250109,"children":250110},{},[250111],{"type":23,"value":250112},"Unified supports both native and virtual webhooks. When an integration supports native webhooks, Unified forwards those events. When it does not, Unified polls the source API, detects changes, and delivers events through the same webhook interface. This matches Unified's real-time, pass-through architecture and zero-storage positioning.",{"type":17,"tag":29,"props":250114,"children":250115},{},[250116],{"type":23,"value":65343},{"type":17,"tag":80,"props":250118,"children":250119},{},[250120,250125,250130,250134,250139],{"type":17,"tag":84,"props":250121,"children":250122},{},[250123],{"type":23,"value":250124},"native and virtual webhooks supported",{"type":17,"tag":84,"props":250126,"children":250127},{},[250128],{"type":23,"value":250129},"configurable intervals, including minute-level polling on paid plans",{"type":17,"tag":84,"props":250131,"children":250132},{},[250133],{"type":23,"value":215866},{"type":17,"tag":84,"props":250135,"children":250136},{},[250137],{"type":23,"value":250138},"updated records can be included directly in the event payload",{"type":17,"tag":84,"props":250140,"children":250141},{},[250142],{"type":23,"value":250143},"no required second fetch for many workflows",{"type":17,"tag":29,"props":250145,"children":250146},{},[250147],{"type":23,"value":250148},"This aligns with Unified's broader positioning: real-time requests against source APIs, no stored customer records, and webhook support that includes native and virtual event delivery with retries and backoff handling built in.",{"type":17,"tag":29,"props":250150,"children":250151},{},[250152],{"type":17,"tag":6438,"props":250153,"children":250156},{"alt":250154,"src":250155},"Unified_Webhooks__Databases_%281%2922.png","https://s3.us-east-2.amazonaws.com/unified-article-images/which_unified_api_platforms_support_virtual_webhooks_vs_sync_based_notifications-1.png",[],{"type":17,"tag":239,"props":250158,"children":250159},{"id":102079},[250160],{"type":23,"value":237},{"type":17,"tag":29,"props":250162,"children":250163},{},[250164],{"type":23,"value":250165},"Apideck supports native and polling-based webhook coverage, including what it calls virtualized webhooks. In many configurations, the event model is closer to change notification than direct data delivery.",{"type":17,"tag":29,"props":250167,"children":250168},{},[250169],{"type":23,"value":65343},{"type":17,"tag":80,"props":250171,"children":250172},{},[250173,250178,250183,250188],{"type":17,"tag":84,"props":250174,"children":250175},{},[250176],{"type":23,"value":250177},"polling-based webhook support exists",{"type":17,"tag":84,"props":250179,"children":250180},{},[250181],{"type":23,"value":250182},"automated polling commonly defaults to longer intervals unless adjusted",{"type":17,"tag":84,"props":250184,"children":250185},{},[250186],{"type":23,"value":250187},"events often signal that data changed",{"type":17,"tag":84,"props":250189,"children":250190},{},[250191],{"type":23,"value":250192},"applications commonly retrieve the updated records through the API",{"type":17,"tag":29,"props":250194,"children":250195},{},[250196],{"type":23,"value":250197},"That means Apideck may reduce some integration work, but the architecture still often includes an event followed by a read.",{"type":17,"tag":239,"props":250199,"children":250201},{"id":250200},"merge",[250202],{"type":23,"value":227},{"type":17,"tag":29,"props":250204,"children":250205},{},[250206],{"type":23,"value":250207},"Merge uses a sync-and-store model. Records are synced into Merge's environment, and notifications are sent after sync jobs update that stored copy.",{"type":17,"tag":29,"props":250209,"children":250210},{},[250211],{"type":23,"value":65343},{"type":17,"tag":80,"props":250213,"children":250214},{},[250215,250220,250225,250230],{"type":17,"tag":84,"props":250216,"children":250217},{},[250218],{"type":23,"value":250219},"scheduled sync architecture",{"type":17,"tag":84,"props":250221,"children":250222},{},[250223],{"type":23,"value":250224},"stored data replica",{"type":17,"tag":84,"props":250226,"children":250227},{},[250228],{"type":23,"value":250229},"webhook notifications tied to sync completion or stored-record changes",{"type":17,"tag":84,"props":250231,"children":250232},{},[250233],{"type":23,"value":250234},"applications typically retrieve updated data through the Merge API",{"type":17,"tag":29,"props":250236,"children":250237},{},[250238],{"type":23,"value":250239},"This can work well for some reporting or replica-based use cases, but it is a different model from source-level change detection and direct event delivery.",{"type":17,"tag":239,"props":250241,"children":250243},{"id":250242},"kombo",[250244],{"type":23,"value":7978},{"type":17,"tag":29,"props":250246,"children":250247},{},[250248],{"type":23,"value":250249},"Kombo also centers its eventing around sync behavior and stored records.",{"type":17,"tag":29,"props":250251,"children":250252},{},[250253],{"type":23,"value":65343},{"type":17,"tag":80,"props":250255,"children":250256},{},[250257,250262,250267,250272],{"type":17,"tag":84,"props":250258,"children":250259},{},[250260],{"type":23,"value":250261},"scheduled sync engine",{"type":17,"tag":84,"props":250263,"children":250264},{},[250265],{"type":23,"value":250266},"notifications when records have changed in Kombo's environment",{"type":17,"tag":84,"props":250268,"children":250269},{},[250270],{"type":23,"value":250271},"applications retrieve updated records separately",{"type":17,"tag":84,"props":250273,"children":250274},{},[250275],{"type":23,"value":250276},"default intervals are typically measured in hours unless adjusted",{"type":17,"tag":29,"props":250278,"children":250279},{},[250280],{"type":23,"value":250281},"This places it closer to sync-based notification systems than to virtual webhooks as defined above.",{"type":17,"tag":239,"props":250283,"children":250284},{"id":227167},[250285],{"type":23,"value":581},{"type":17,"tag":29,"props":250287,"children":250288},{},[250289],{"type":23,"value":250290},"Paragon is hybrid. Some event behavior is tied to workflow triggers and polling checks, while Managed Sync introduces replica-based storage patterns.",{"type":17,"tag":29,"props":250292,"children":250293},{},[250294],{"type":23,"value":65343},{"type":17,"tag":80,"props":250296,"children":250297},{},[250298,250303,250308,250313],{"type":17,"tag":84,"props":250299,"children":250300},{},[250301],{"type":23,"value":250302},"multiple event models depending on feature used",{"type":17,"tag":84,"props":250304,"children":250305},{},[250306],{"type":23,"value":250307},"polling-based triggers available",{"type":17,"tag":84,"props":250309,"children":250310},{},[250311],{"type":23,"value":250312},"workflow triggers may start automation rather than deliver updated objects directly",{"type":17,"tag":84,"props":250314,"children":250315},{},[250316],{"type":23,"value":250317},"Managed Sync introduces stored data behavior",{"type":17,"tag":29,"props":250319,"children":250320},{},[250321],{"type":23,"value":250322},"With Paragon, teams need to evaluate the exact feature path they plan to use, not just the product category.",{"type":17,"tag":239,"props":250324,"children":250325},{"id":227114},[250326],{"type":23,"value":8037},{"type":17,"tag":29,"props":250328,"children":250329},{},[250330],{"type":23,"value":250331},"Truto combines pass-through API behavior with scheduled sync capabilities in some areas. Native webhook proxying may be supported where the source integration provides it, while other data movement patterns rely on scheduled jobs.",{"type":17,"tag":29,"props":250333,"children":250334},{},[250335],{"type":23,"value":65343},{"type":17,"tag":80,"props":250337,"children":250338},{},[250339,250344,250349,250354],{"type":17,"tag":84,"props":250340,"children":250341},{},[250342],{"type":23,"value":250343},"native webhook proxying where available",{"type":17,"tag":84,"props":250345,"children":250346},{},[250347],{"type":23,"value":250348},"scheduled sync jobs for some use cases",{"type":17,"tag":84,"props":250350,"children":250351},{},[250352],{"type":23,"value":250353},"behavior depends on whether you are using pass-through API access or sync-style ingestion",{"type":17,"tag":84,"props":250355,"children":250356},{},[250357],{"type":23,"value":250358},"virtual webhook behavior is not always clearly documented as a detect-changes-and-deliver model",{"type":17,"tag":29,"props":250360,"children":250361},{},[250362],{"type":23,"value":250363},"This makes Truto another platform where the specific product path matters more than the umbrella claim.",{"type":17,"tag":239,"props":250365,"children":250366},{"id":227220},[250367],{"type":23,"value":226640},{"type":17,"tag":29,"props":250369,"children":250370},{},[250371],{"type":23,"value":250372},"StackOne uses synthetic event approaches for some integrations. In practice, this is generally closer to polling plus notification than to direct event delivery with data included.",{"type":17,"tag":29,"props":250374,"children":250375},{},[250376],{"type":23,"value":65343},{"type":17,"tag":80,"props":250378,"children":250379},{},[250380,250385,250390,250395],{"type":17,"tag":84,"props":250381,"children":250382},{},[250383],{"type":23,"value":250384},"polling and synthetic event generation",{"type":17,"tag":84,"props":250386,"children":250387},{},[250388],{"type":23,"value":250389},"notification-first event pattern",{"type":17,"tag":84,"props":250391,"children":250392},{},[250393],{"type":23,"value":250394},"follow-up reads commonly required",{"type":17,"tag":84,"props":250396,"children":250397},{},[250398],{"type":23,"value":250399},"timing depends on scheduled detection intervals",{"type":17,"tag":68,"props":250401,"children":250403},{"id":250402},"comparison-table",[250404],{"type":23,"value":250405},"Comparison table",{"type":17,"tag":7231,"props":250407,"children":250408},{},[250409,250444],{"type":17,"tag":7235,"props":250410,"children":250411},{},[250412],{"type":17,"tag":7239,"props":250413,"children":250414},{},[250415,250419,250424,250429,250434,250439],{"type":17,"tag":7243,"props":250416,"children":250417},{},[250418],{"type":23,"value":43242},{"type":17,"tag":7243,"props":250420,"children":250421},{},[250422],{"type":23,"value":250423},"Event model",{"type":17,"tag":7243,"props":250425,"children":250426},{},[250427],{"type":23,"value":250428},"How changes are detected",{"type":17,"tag":7243,"props":250430,"children":250431},{},[250432],{"type":23,"value":250433},"What the webhook sends",{"type":17,"tag":7243,"props":250435,"children":250436},{},[250437],{"type":23,"value":250438},"Follow-up read required",{"type":17,"tag":7243,"props":250440,"children":250441},{},[250442],{"type":23,"value":250443},"Data storage model",{"type":17,"tag":7259,"props":250445,"children":250446},{},[250447,250479,250510,250541,250570,250600,250631],{"type":17,"tag":7239,"props":250448,"children":250449},{},[250450,250454,250459,250464,250469,250474],{"type":17,"tag":7266,"props":250451,"children":250452},{},[250453],{"type":23,"value":87523},{"type":17,"tag":7266,"props":250455,"children":250456},{},[250457],{"type":23,"value":250458},"Native + Virtual",{"type":17,"tag":7266,"props":250460,"children":250461},{},[250462],{"type":23,"value":250463},"Native push or poll → detect → deliver",{"type":17,"tag":7266,"props":250465,"children":250466},{},[250467],{"type":23,"value":250468},"Updated records can be included directly",{"type":17,"tag":7266,"props":250470,"children":250471},{},[250472],{"type":23,"value":250473},"Often no",{"type":17,"tag":7266,"props":250475,"children":250476},{},[250477],{"type":23,"value":250478},"Zero-storage, pass-through",{"type":17,"tag":7239,"props":250480,"children":250481},{},[250482,250486,250491,250496,250501,250505],{"type":17,"tag":7266,"props":250483,"children":250484},{},[250485],{"type":23,"value":237},{"type":17,"tag":7266,"props":250487,"children":250488},{},[250489],{"type":23,"value":250490},"Polling-based event delivery",{"type":17,"tag":7266,"props":250492,"children":250493},{},[250494],{"type":23,"value":250495},"Poll → detect",{"type":17,"tag":7266,"props":250497,"children":250498},{},[250499],{"type":23,"value":250500},"Often notification-first",{"type":17,"tag":7266,"props":250502,"children":250503},{},[250504],{"type":23,"value":202478},{"type":17,"tag":7266,"props":250506,"children":250507},{},[250508],{"type":23,"value":250509},"Marketed as zero-storage for customer records",{"type":17,"tag":7239,"props":250511,"children":250512},{},[250513,250517,250522,250527,250532,250536],{"type":17,"tag":7266,"props":250514,"children":250515},{},[250516],{"type":23,"value":227},{"type":17,"tag":7266,"props":250518,"children":250519},{},[250520],{"type":23,"value":250521},"Sync-based notification",{"type":17,"tag":7266,"props":250523,"children":250524},{},[250525],{"type":23,"value":250526},"Scheduled sync into stored data",{"type":17,"tag":7266,"props":250528,"children":250529},{},[250530],{"type":23,"value":250531},"Notification after sync or stored-record change",{"type":17,"tag":7266,"props":250533,"children":250534},{},[250535],{"type":23,"value":47981},{"type":17,"tag":7266,"props":250537,"children":250538},{},[250539],{"type":23,"value":250540},"Stored replica",{"type":17,"tag":7239,"props":250542,"children":250543},{},[250544,250548,250552,250557,250562,250566],{"type":17,"tag":7266,"props":250545,"children":250546},{},[250547],{"type":23,"value":7978},{"type":17,"tag":7266,"props":250549,"children":250550},{},[250551],{"type":23,"value":250521},{"type":17,"tag":7266,"props":250553,"children":250554},{},[250555],{"type":23,"value":250556},"Scheduled sync",{"type":17,"tag":7266,"props":250558,"children":250559},{},[250560],{"type":23,"value":250561},"Notification",{"type":17,"tag":7266,"props":250563,"children":250564},{},[250565],{"type":23,"value":47981},{"type":17,"tag":7266,"props":250567,"children":250568},{},[250569],{"type":23,"value":250540},{"type":17,"tag":7239,"props":250571,"children":250572},{},[250573,250577,250582,250587,250592,250596],{"type":17,"tag":7266,"props":250574,"children":250575},{},[250576],{"type":23,"value":581},{"type":17,"tag":7266,"props":250578,"children":250579},{},[250580],{"type":23,"value":250581},"Hybrid",{"type":17,"tag":7266,"props":250583,"children":250584},{},[250585],{"type":23,"value":250586},"Polling triggers or sync logic",{"type":17,"tag":7266,"props":250588,"children":250589},{},[250590],{"type":23,"value":250591},"Trigger or notification",{"type":17,"tag":7266,"props":250593,"children":250594},{},[250595],{"type":23,"value":202478},{"type":17,"tag":7266,"props":250597,"children":250598},{},[250599],{"type":23,"value":250581},{"type":17,"tag":7239,"props":250601,"children":250602},{},[250603,250607,250611,250616,250621,250626],{"type":17,"tag":7266,"props":250604,"children":250605},{},[250606],{"type":23,"value":8037},{"type":17,"tag":7266,"props":250608,"children":250609},{},[250610],{"type":23,"value":250581},{"type":17,"tag":7266,"props":250612,"children":250613},{},[250614],{"type":23,"value":250615},"Native proxying or scheduled jobs",{"type":17,"tag":7266,"props":250617,"children":250618},{},[250619],{"type":23,"value":250620},"Depends on feature",{"type":17,"tag":7266,"props":250622,"children":250623},{},[250624],{"type":23,"value":250625},"Depends",{"type":17,"tag":7266,"props":250627,"children":250628},{},[250629],{"type":23,"value":250630},"Hybrid / optional storage patterns",{"type":17,"tag":7239,"props":250632,"children":250633},{},[250634,250638,250643,250648,250652,250656],{"type":17,"tag":7266,"props":250635,"children":250636},{},[250637],{"type":23,"value":226640},{"type":17,"tag":7266,"props":250639,"children":250640},{},[250641],{"type":23,"value":250642},"Synthetic events",{"type":17,"tag":7266,"props":250644,"children":250645},{},[250646],{"type":23,"value":250647},"Polling and synthetic detection",{"type":17,"tag":7266,"props":250649,"children":250650},{},[250651],{"type":23,"value":250561},{"type":17,"tag":7266,"props":250653,"children":250654},{},[250655],{"type":23,"value":47981},{"type":17,"tag":7266,"props":250657,"children":250658},{},[250659],{"type":23,"value":250660},"Varies by feature",{"type":17,"tag":68,"props":250662,"children":250664},{"id":250663},"the-subtle-differences-between-virtual-webhook-platforms",[250665],{"type":23,"value":250666},"The subtle differences between virtual webhook platforms",{"type":17,"tag":29,"props":250668,"children":250669},{},[250670],{"type":23,"value":250671},"Not every platform in the 'polling-based' bucket creates the same developer outcome.",{"type":17,"tag":239,"props":250673,"children":250675},{"id":250674},"default-freshness",[250676],{"type":23,"value":250677},"Default freshness",{"type":17,"tag":29,"props":250679,"children":250680},{},[250681],{"type":23,"value":250682},"Polling interval matters. A minute-level interval can support responsive user-facing workflows. A daily interval cannot.",{"type":17,"tag":239,"props":250684,"children":250686},{"id":250685},"payload-design",[250687],{"type":23,"value":250688},"Payload design",{"type":17,"tag":29,"props":250690,"children":250691},{},[250692],{"type":23,"value":250693},"If the event contains updated records, your application can process the event in one step. If the event only signals change, you now have to build retrieval, pagination, retry, and deduplication logic separately.",{"type":17,"tag":239,"props":250695,"children":250696},{"id":215742},[250697],{"type":23,"value":7324},{"type":17,"tag":29,"props":250699,"children":250700},{},[250701],{"type":23,"value":250702},"A zero-storage approach keeps the integration layer focused on authorized retrieval and event delivery. A sync-and-store approach expands the architectural surface area and often changes procurement, compliance, and migration considerations.",{"type":17,"tag":29,"props":250704,"children":250705},{},[250706],{"type":23,"value":250707},"Unified's positioning is clear on this point: requests are real-time and pass-through, customer data is not stored, and native plus virtual webhooks are core delivery mechanisms.",{"type":17,"tag":68,"props":250709,"children":250711},{"id":250710},"what-this-means-in-your-application",[250712],{"type":23,"value":250713},"What this means in your application",{"type":17,"tag":29,"props":250715,"children":250716},{},[250717],{"type":23,"value":250718},"Two teams can set out to build the same feature and end up with very different backend architectures.",{"type":17,"tag":239,"props":250720,"children":250722},{"id":250721},"with-sync-based-notifications",[250723],{"type":23,"value":9434},{"type":17,"tag":29,"props":250725,"children":250726},{},[250727],{"type":23,"value":250728},"Your application typically has to:",{"type":17,"tag":80,"props":250730,"children":250731},{},[250732,250737,250742,250747,250752,250757],{"type":17,"tag":84,"props":250733,"children":250734},{},[250735],{"type":23,"value":250736},"receive a notification",{"type":17,"tag":84,"props":250738,"children":250739},{},[250740],{"type":23,"value":250741},"call the API to retrieve updates",{"type":17,"tag":84,"props":250743,"children":250744},{},[250745],{"type":23,"value":250746},"manage pagination",{"type":17,"tag":84,"props":250748,"children":250749},{},[250750],{"type":23,"value":250751},"deduplicate records",{"type":17,"tag":84,"props":250753,"children":250754},{},[250755],{"type":23,"value":250756},"handle delayed consistency",{"type":17,"tag":84,"props":250758,"children":250759},{},[250760],{"type":23,"value":250761},"manage retries and reconciliation",{"type":17,"tag":239,"props":250763,"children":250765},{"id":250764},"with-virtual-webhooks-that-include-records",[250766],{"type":23,"value":250767},"With virtual webhooks that include records",{"type":17,"tag":29,"props":250769,"children":250770},{},[250771],{"type":23,"value":250772},"Your application can often:",{"type":17,"tag":80,"props":250774,"children":250775},{},[250776,250781,250786],{"type":17,"tag":84,"props":250777,"children":250778},{},[250779],{"type":23,"value":250780},"receive the event",{"type":17,"tag":84,"props":250782,"children":250783},{},[250784],{"type":23,"value":250785},"process the record",{"type":17,"tag":84,"props":250787,"children":250788},{},[250789],{"type":23,"value":250790},"continue the workflow",{"type":17,"tag":29,"props":250792,"children":250793},{},[250794],{"type":23,"value":250795},"That difference compounds across integrations, objects, and customer accounts.",{"type":17,"tag":68,"props":250797,"children":250799},{"id":250798},"better-vendor-evaluation-questions",[250800],{"type":23,"value":250801},"Better vendor evaluation questions",{"type":17,"tag":29,"props":250803,"children":250804},{},[250805],{"type":23,"value":250806},"Instead of asking whether a platform supports webhooks, ask:",{"type":17,"tag":80,"props":250808,"children":250809},{},[250810,250815,250819,250824,250828,250832,250837],{"type":17,"tag":84,"props":250811,"children":250812},{},[250813],{"type":23,"value":250814},"Does the platform support native webhooks, virtual webhooks, or sync-based notifications?",{"type":17,"tag":84,"props":250816,"children":250817},{},[250818],{"type":23,"value":179713},{"type":17,"tag":84,"props":250820,"children":250821},{},[250822],{"type":23,"value":250823},"What is the default polling or sync interval?",{"type":17,"tag":84,"props":250825,"children":250826},{},[250827],{"type":23,"value":215795},{"type":17,"tag":84,"props":250829,"children":250830},{},[250831],{"type":23,"value":215800},{"type":17,"tag":84,"props":250833,"children":250834},{},[250835],{"type":23,"value":250836},"Does the platform store customer records?",{"type":17,"tag":84,"props":250838,"children":250839},{},[250840],{"type":23,"value":250841},"Is the event model the same across integrations, or does it change by feature?",{"type":17,"tag":29,"props":250843,"children":250844},{},[250845],{"type":23,"value":250846},"Those questions tell you far more about developer effort and production behavior than a generic webhook checklist.",{"type":17,"tag":68,"props":250848,"children":250849},{"id":248787},[250850],{"type":23,"value":248790},{"type":17,"tag":239,"props":250852,"children":250853},{"id":229590},[250854],{"type":23,"value":229593},{"type":17,"tag":80,"props":250856,"children":250857},{},[250858,250863,250868],{"type":17,"tag":84,"props":250859,"children":250860},{},[250861],{"type":23,"value":250862},"the source integration supports them reliably",{"type":17,"tag":84,"props":250864,"children":250865},{},[250866],{"type":23,"value":250867},"you need immediate updates",{"type":17,"tag":84,"props":250869,"children":250870},{},[250871],{"type":23,"value":250872},"event coverage is sufficient for your product",{"type":17,"tag":239,"props":250874,"children":250875},{"id":229614},[250876],{"type":23,"value":229617},{"type":17,"tag":80,"props":250878,"children":250879},{},[250880,250885,250889],{"type":17,"tag":84,"props":250881,"children":250882},{},[250883],{"type":23,"value":250884},"the source integration does not support native webhooks",{"type":17,"tag":84,"props":250886,"children":250887},{},[250888],{"type":23,"value":249519},{"type":17,"tag":84,"props":250890,"children":250891},{},[250892],{"type":23,"value":250893},"you want the integration layer to own polling, change detection, and delivery",{"type":17,"tag":239,"props":250895,"children":250897},{"id":250896},"use-sync-based-notifications-when",[250898],{"type":23,"value":250899},"Use sync-based notifications when",{"type":17,"tag":80,"props":250901,"children":250902},{},[250903,250908,250913],{"type":17,"tag":84,"props":250904,"children":250905},{},[250906],{"type":23,"value":250907},"you are comfortable with scheduled sync intervals",{"type":17,"tag":84,"props":250909,"children":250910},{},[250911],{"type":23,"value":250912},"you want a stored replica for reporting or batch-style access",{"type":17,"tag":84,"props":250914,"children":250915},{},[250916],{"type":23,"value":250917},"event timing is less important than replica availability",{"type":17,"tag":239,"props":250919,"children":250921},{"id":250920},"be-careful-with-sync-based-notifications-when",[250922],{"type":23,"value":250923},"Be careful with sync-based notifications when",{"type":17,"tag":80,"props":250925,"children":250926},{},[250927,250932,250937,250942],{"type":17,"tag":84,"props":250928,"children":250929},{},[250930],{"type":23,"value":250931},"latency affects user experience",{"type":17,"tag":84,"props":250933,"children":250934},{},[250935],{"type":23,"value":250936},"your workflow depends on current source data",{"type":17,"tag":84,"props":250938,"children":250939},{},[250940],{"type":23,"value":250941},"your team wants to avoid event → read → reconcile patterns",{"type":17,"tag":84,"props":250943,"children":250944},{},[250945],{"type":23,"value":250946},"compliance scope or stored customer data matters",{"type":17,"tag":68,"props":250948,"children":250950},{"id":250949},"why-this-is-a-meaningful-architectural-boundary",[250951],{"type":23,"value":250952},"Why this is a meaningful architectural boundary",{"type":17,"tag":29,"props":250954,"children":250955},{},[250956],{"type":23,"value":250957},"This is not just a feature comparison. It is a category boundary.",{"type":17,"tag":29,"props":250959,"children":250960},{},[250961],{"type":23,"value":250962},"Virtual webhooks are event-driven change detection delivered through a webhook interface.",{"type":17,"tag":29,"props":250964,"children":250965},{},[250966],{"type":23,"value":250967},"Sync-based notification systems are batch or schedule-driven notifications tied to stored data.",{"type":17,"tag":29,"props":250969,"children":250970},{},[250971],{"type":23,"value":250972},"That distinction matters because it changes:",{"type":17,"tag":80,"props":250974,"children":250975},{},[250976,250981,250986,250991],{"type":17,"tag":84,"props":250977,"children":250978},{},[250979],{"type":23,"value":250980},"how quickly your product responds",{"type":17,"tag":84,"props":250982,"children":250983},{},[250984],{"type":23,"value":250985},"where complexity lives",{"type":17,"tag":84,"props":250987,"children":250988},{},[250989],{"type":23,"value":250990},"how much integration logic your team still owns",{"type":17,"tag":84,"props":250992,"children":250993},{},[250994],{"type":23,"value":250995},"whether your application is built around events or around stored replicas",{"type":17,"tag":29,"props":250997,"children":250998},{},[250999],{"type":23,"value":251000},"Unified's webhook guidance is explicit that these models should be separated, and that Unified should be framed around change detection and event delivery, not as an approximation of anything else.",{"type":17,"tag":68,"props":251002,"children":251003},{"id":45643},[251004],{"type":23,"value":45646},{"type":17,"tag":29,"props":251006,"children":251007},{},[251008],{"type":23,"value":9499},{"type":17,"tag":29,"props":251010,"children":251011},{},[251012],{"type":23,"value":251013},"What matters is how the platform detects changes, when it emits events, whether the event includes usable records, and whether customer data is stored along the way.",{"type":17,"tag":29,"props":251015,"children":251016},{},[251017],{"type":23,"value":251018},"Some unified API platforms rely on scheduled syncs and notifications built on top of stored data. Unified supports native webhooks where available and virtual webhooks where they are not, using source-level change detection and direct event delivery without storing customer records. That makes a real difference for product teams building alerts, automations, AI features, and any workflow where timing and architectural simplicity matter.",{"type":17,"tag":29,"props":251020,"children":251021},{},[251022],{"type":17,"tag":133,"props":251023,"children":251025},{"href":1612,"rel":251024},[214],[251026],{"type":17,"tag":48,"props":251027,"children":251028},{},[251029],{"type":23,"value":1616},{"type":17,"tag":29,"props":251031,"children":251032},{},[251033],{"type":17,"tag":133,"props":251034,"children":251036},{"href":1623,"rel":251035},[214],[251037],{"type":17,"tag":48,"props":251038,"children":251039},{},[251040],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":251042},[251043,251044,251049,251053,251058,251062,251067,251076,251077,251082,251086,251087,251093,251094],{"id":883,"depth":1635,"text":886},{"id":249706,"depth":1629,"text":249709,"children":251045},[251046,251047,251048],{"id":9021,"depth":1635,"text":9024},{"id":164743,"depth":1635,"text":9256},{"id":249801,"depth":1635,"text":249804},{"id":249858,"depth":1629,"text":249861,"children":251050},[251051,251052],{"id":249869,"depth":1635,"text":9256},{"id":249897,"depth":1635,"text":249900},{"id":249931,"depth":1629,"text":249934,"children":251054},[251055,251056,251057],{"id":229309,"depth":1635,"text":9024},{"id":249951,"depth":1635,"text":9256},{"id":249961,"depth":1635,"text":249900},{"id":249976,"depth":1629,"text":249979,"children":251059},[251060,251061],{"id":249992,"depth":1635,"text":249995},{"id":250003,"depth":1635,"text":9313},{"id":250018,"depth":1629,"text":250021,"children":251063},[251064,251065,251066],{"id":250029,"depth":1635,"text":250032},{"id":250042,"depth":1635,"text":250045},{"id":250055,"depth":1635,"text":250058},{"id":250092,"depth":1629,"text":250095,"children":251068},[251069,251070,251071,251072,251073,251074,251075],{"id":105425,"depth":1635,"text":87523},{"id":102079,"depth":1635,"text":237},{"id":250200,"depth":1635,"text":227},{"id":250242,"depth":1635,"text":7978},{"id":227167,"depth":1635,"text":581},{"id":227114,"depth":1635,"text":8037},{"id":227220,"depth":1635,"text":226640},{"id":250402,"depth":1629,"text":250405},{"id":250663,"depth":1629,"text":250666,"children":251078},[251079,251080,251081],{"id":250674,"depth":1635,"text":250677},{"id":250685,"depth":1635,"text":250688},{"id":215742,"depth":1635,"text":7324},{"id":250710,"depth":1629,"text":250713,"children":251083},[251084,251085],{"id":250721,"depth":1635,"text":9434},{"id":250764,"depth":1635,"text":250767},{"id":250798,"depth":1629,"text":250801},{"id":248787,"depth":1629,"text":248790,"children":251088},[251089,251090,251091,251092],{"id":229590,"depth":1635,"text":229593},{"id":229614,"depth":1635,"text":229617},{"id":250896,"depth":1635,"text":250899},{"id":250920,"depth":1635,"text":250923},{"id":250949,"depth":1629,"text":250952},{"id":45643,"depth":1629,"text":45646},"content:blog:which_unified_api_platforms_support_virtual_webhooks_vs_sync_based_notifications.md","blog/which_unified_api_platforms_support_virtual_webhooks_vs_sync_based_notifications.md","blog/which_unified_api_platforms_support_virtual_webhooks_vs_sync_based_notifications",{"_path":251099,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":251100,"description":251101,"img":251102,"date":251103,"tag":6341,"body":251104,"_type":1677,"_id":251409,"_source":1679,"_file":251410,"_stem":251411,"_extension":1682},"/blog/handling_delegated_vs_application_scopes_in_microsoft_integrations","Handling Delegated vs. Application Scopes in Microsoft Integrations","Microsoft Graph offers two fundamentally different permission models — Delegated and Application scopes. Understanding how these scopes behave is important...","https://s3.us-east-2.amazonaws.com/unified-article-images/handling_delegated_vs_application_scopes_in_microsoft_integrations-icon.png","2025-12-09T21:05:00.000Z",{"type":14,"children":251105,"toc":251402},[251106,251111,251114,251122,251139,251150,251155,251160,251169,251178,251190,251195,251218,251227,251239,251244,251274,251279,251319,251322,251331,251336,251366,251371,251397],{"type":17,"tag":18,"props":251107,"children":251109},{"id":251108},"handling-delegated-vs-application-scopes-in-microsoft-integrations",[251110],{"type":23,"value":251100},{"type":17,"tag":25,"props":251112,"children":251113},{},[],{"type":17,"tag":29,"props":251115,"children":251116},{},[251117],{"type":17,"tag":33,"props":251118,"children":251119},{},[251120],{"type":23,"value":251121},"December 9, 2025",{"type":17,"tag":29,"props":251123,"children":251124},{},[251125,251127,251132,251133,251137],{"type":23,"value":251126},"Microsoft Graph offers two fundamentally different permission models — ",{"type":17,"tag":48,"props":251128,"children":251129},{},[251130],{"type":23,"value":251131},"Delegated",{"type":23,"value":34435},{"type":17,"tag":48,"props":251134,"children":251135},{},[251136],{"type":23,"value":117242},{"type":23,"value":251138}," scopes. Understanding how these scopes behave is important when connecting Microsoft integrations through Unified.",{"type":17,"tag":29,"props":251140,"children":251141},{},[251142,251144,251148],{"type":23,"value":251143},"Some Microsoft APIs only support delegated permissions, while others require strictly application-level permissions. Mixing them in a single ",{"type":17,"tag":133,"props":251145,"children":251146},{"href":779},[251147],{"type":23,"value":782},{"type":23,"value":251149}," flow will cause failures.",{"type":17,"tag":29,"props":251151,"children":251152},{},[251153],{"type":23,"value":251154},"In Unified, you can create separate Microsoft connections so you can cleanly target the scopes required for the endpoints you plan to use.",{"type":17,"tag":29,"props":251156,"children":251157},{},[251158],{"type":23,"value":251159},"This guide explains the difference between the permission types, why certain Unified endpoints require one or the other, and how to configure your Unified connections correctly.",{"type":17,"tag":68,"props":251161,"children":251163},{"id":251162},"_1-delegated-vs-application-permissions",[251164],{"type":17,"tag":48,"props":251165,"children":251166},{},[251167],{"type":23,"value":251168},"1. Delegated vs. Application Permissions",{"type":17,"tag":239,"props":251170,"children":251172},{"id":251171},"delegated-permissions",[251173],{"type":17,"tag":48,"props":251174,"children":251175},{},[251176],{"type":23,"value":251177},"Delegated Permissions",{"type":17,"tag":29,"props":251179,"children":251180},{},[251181,251183,251188],{"type":23,"value":251182},"Delegated permissions are used when a ",{"type":17,"tag":48,"props":251184,"children":251185},{},[251186],{"type":23,"value":251187},"signed-in Microsoft user",{"type":23,"value":251189}," is present in the OAuth flow.",{"type":17,"tag":29,"props":251191,"children":251192},{},[251193],{"type":23,"value":251194},"Use delegated permissions when:",{"type":17,"tag":80,"props":251196,"children":251197},{},[251198,251208,251213],{"type":17,"tag":84,"props":251199,"children":251200},{},[251201,251203],{"type":23,"value":251202},"The API needs to act ",{"type":17,"tag":48,"props":251204,"children":251205},{},[251206],{"type":23,"value":251207},"on behalf of a user",{"type":17,"tag":84,"props":251209,"children":251210},{},[251211],{"type":23,"value":251212},"You want to access data the user normally has permission to view",{"type":17,"tag":84,"props":251214,"children":251215},{},[251216],{"type":23,"value":251217},"The Microsoft Graph endpoint explicitly supports delegated scopes",{"type":17,"tag":239,"props":251219,"children":251221},{"id":251220},"application-permissions",[251222],{"type":17,"tag":48,"props":251223,"children":251224},{},[251225],{"type":23,"value":251226},"Application Permissions",{"type":17,"tag":29,"props":251228,"children":251229},{},[251230,251232,251237],{"type":23,"value":251231},"Application permissions are used when ",{"type":17,"tag":48,"props":251233,"children":251234},{},[251235],{"type":23,"value":251236},"no user is logged in",{"type":23,"value":251238},", and the app accesses Microsoft Graph directly as itself.",{"type":17,"tag":29,"props":251240,"children":251241},{},[251242],{"type":23,"value":251243},"Use application permissions when:",{"type":17,"tag":80,"props":251245,"children":251246},{},[251247,251257,251262],{"type":17,"tag":84,"props":251248,"children":251249},{},[251250,251252],{"type":23,"value":251251},"A Microsoft endpoint ",{"type":17,"tag":48,"props":251253,"children":251254},{},[251255],{"type":23,"value":251256},"does not support delegated scopes",{"type":17,"tag":84,"props":251258,"children":251259},{},[251260],{"type":23,"value":251261},"The API involves system-level or tenant-wide data",{"type":17,"tag":84,"props":251263,"children":251264},{},[251265,251267,251272],{"type":23,"value":251266},"The OAuth token must come from the ",{"type":17,"tag":48,"props":251268,"children":251269},{},[251270],{"type":23,"value":251271},"client_credentials",{"type":23,"value":251273}," flow",{"type":17,"tag":29,"props":251275,"children":251276},{},[251277],{"type":23,"value":251278},"Examples of Unified endpoints that only support application scopes:",{"type":17,"tag":80,"props":251280,"children":251281},{},[251282],{"type":17,"tag":84,"props":251283,"children":251284},{},[251285,251294,251296],{"type":17,"tag":48,"props":251286,"children":251287},{},[251288],{"type":17,"tag":6121,"props":251289,"children":251291},{"className":251290},[],[251292],{"type":23,"value":251293},"uc_call",{"type":23,"value":251295}," (MS Teams call records API)\n",{"type":17,"tag":80,"props":251297,"children":251298},{},[251299],{"type":17,"tag":84,"props":251300,"children":251301},{},[251302,251304,251310,251312,251317],{"type":23,"value":251303},"Microsoft Graph requires ",{"type":17,"tag":6121,"props":251305,"children":251307},{"className":251306},[],[251308],{"type":23,"value":251309},"CallRecords.Read.All",{"type":23,"value":251311}," as an ",{"type":17,"tag":48,"props":251313,"children":251314},{},[251315],{"type":23,"value":251316},"application permission",{"type":23,"value":251318},", not delegated.",{"type":17,"tag":25,"props":251320,"children":251321},{},[],{"type":17,"tag":68,"props":251323,"children":251325},{"id":251324},"_2-why-you-cannot-mix-delegated-and-application-scopes",[251326],{"type":17,"tag":48,"props":251327,"children":251328},{},[251329],{"type":23,"value":251330},"2. Why You Cannot Mix Delegated and Application Scopes",{"type":17,"tag":29,"props":251332,"children":251333},{},[251334],{"type":23,"value":251335},"Microsoft Graph enforces strict separation between permission types:",{"type":17,"tag":80,"props":251337,"children":251338},{},[251339,251351,251361],{"type":17,"tag":84,"props":251340,"children":251341},{},[251342,251344,251349],{"type":23,"value":251343},"Delegated scopes must be requested during a ",{"type":17,"tag":48,"props":251345,"children":251346},{},[251347],{"type":23,"value":251348},"user login",{"type":23,"value":251350}," OAuth flow",{"type":17,"tag":84,"props":251352,"children":251353},{},[251354,251356],{"type":23,"value":251355},"Application scopes must be requested using ",{"type":17,"tag":48,"props":251357,"children":251358},{},[251359],{"type":23,"value":251360},"client credentials",{"type":17,"tag":84,"props":251362,"children":251363},{},[251364],{"type":23,"value":251365},"A single OAuth authorization cannot request both delegated and application permissions",{"type":17,"tag":29,"props":251367,"children":251368},{},[251369],{"type":23,"value":251370},"If both are selected together:",{"type":17,"tag":80,"props":251372,"children":251373},{},[251374,251387,251392],{"type":17,"tag":84,"props":251375,"children":251376},{},[251377,251379,251385],{"type":23,"value":251378},"Microsoft returns ",{"type":17,"tag":6121,"props":251380,"children":251382},{"className":251381},[],[251383],{"type":23,"value":251384},"AADSTS650053",{"type":23,"value":251386}," or similar errors",{"type":17,"tag":84,"props":251388,"children":251389},{},[251390],{"type":23,"value":251391},"The OAuth token cannot be issued",{"type":17,"tag":84,"props":251393,"children":251394},{},[251395],{"type":23,"value":251396},"Your Unified connection will fail to authenticate",{"type":17,"tag":29,"props":251398,"children":251399},{},[251400],{"type":23,"value":251401},"Because of this, selecting both scope types for the same Unified connection will not work.",{"title":7,"searchDepth":1629,"depth":1629,"links":251403},[251404,251408],{"id":251162,"depth":1629,"text":251168,"children":251405},[251406,251407],{"id":251171,"depth":1635,"text":251177},{"id":251220,"depth":1635,"text":251226},{"id":251324,"depth":1629,"text":251330},"content:blog:handling_delegated_vs_application_scopes_in_microsoft_integrations.md","blog/handling_delegated_vs_application_scopes_in_microsoft_integrations.md","blog/handling_delegated_vs_application_scopes_in_microsoft_integrations",{"_path":251413,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":251414,"description":251415,"img":251416,"date":251417,"tag":12,"body":251418,"_type":1677,"_id":251823,"_source":1679,"_file":251824,"_stem":251825,"_extension":1682},"/blog/unified_hits_major_growth_milestone_as_api_usage_surges_550percent_in_2025","Unified Hits Major Growth Milestone as API Usage Surges 550% in 2025","Unified has entered a new stage of growth. Over the past six months, API usage grew 550% and our customer base expanded 170% as more SaaS and AI platforms...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_hits_major_growth_milestone_as_api_usage_surges_550percent_in_2025-icon.png","2025-12-08T00:00:00.000Z",{"type":14,"children":251419,"toc":251816},[251420,251425,251428,251436,251454,251459,251505,251520,251525,251530,251536,251544,251555,251573,251614,251619,251625,251633,251651,251656,251662,251691,251696,251708,251713,251719,251727,251764,251769,251774,251780,251785,251790,251795],{"type":17,"tag":18,"props":251421,"children":251423},{"id":251422},"unified-hits-major-growth-milestone-as-api-usage-surges-550-in-2025",[251424],{"type":23,"value":251414},{"type":17,"tag":25,"props":251426,"children":251427},{},[],{"type":17,"tag":29,"props":251429,"children":251430},{},[251431],{"type":17,"tag":33,"props":251432,"children":251433},{},[251434],{"type":23,"value":251435},"December 8, 2025",{"type":17,"tag":29,"props":251437,"children":251438},{},[251439,251441,251445,251447,251452],{"type":23,"value":251440},"Unified has entered a new stage of growth. Over the past six months, API usage grew ",{"type":17,"tag":48,"props":251442,"children":251443},{},[251444],{"type":23,"value":239653},{"type":23,"value":251446}," and our customer base expanded ",{"type":17,"tag":48,"props":251448,"children":251449},{},[251450],{"type":23,"value":251451},"170%",{"type":23,"value":251453}," as more SaaS and AI platforms moved to real-time infrastructure.",{"type":17,"tag":29,"props":251455,"children":251456},{},[251457],{"type":23,"value":251458},"AI-native products increasingly depend on instant, secure access to customer data, and Unified is becoming the real-time infrastructure layer powering those workflows.",{"type":17,"tag":29,"props":251460,"children":251461},{},[251462,251464,251469,251471,251479,251481,251486,251488,251493,251494,251499,251500,251504],{"type":23,"value":251463},"Unified now connects to ",{"type":17,"tag":48,"props":251465,"children":251466},{},[251467],{"type":23,"value":251468},"350+ integrations",{"type":23,"value":251470}," across 21 categories, with ",{"type":17,"tag":133,"props":251472,"children":251474},{"href":217198,"rel":251473},[214],[251475],{"type":17,"tag":48,"props":251476,"children":251477},{},[251478],{"type":23,"value":45418},{"type":23,"value":251480}," extending that surface to ",{"type":17,"tag":48,"props":251482,"children":251483},{},[251484],{"type":23,"value":251485},"20,000+ tools",{"type":23,"value":251487}," for AI-native apps, agents and copilots like ",{"type":17,"tag":48,"props":251489,"children":251490},{},[251491],{"type":23,"value":251492},"Claude",{"type":23,"value":11826},{"type":17,"tag":48,"props":251495,"children":251496},{},[251497],{"type":23,"value":251498},"ChatGPT",{"type":23,"value":12561},{"type":17,"tag":48,"props":251501,"children":251502},{},[251503],{"type":23,"value":137567},{"type":23,"value":54},{"type":17,"tag":3414,"props":251506,"children":251507},{},[251508],{"type":17,"tag":29,"props":251509,"children":251510},{},[251511,251513,251518],{"type":23,"value":251512},"\"",{"type":17,"tag":33,"props":251514,"children":251515},{},[251516],{"type":23,"value":251517},"AI is reshaping every software product roadmap. Data is the fuel for that intelligence. As AI-native apps, agents, and copilots expand inside SaaS, teams need authorized access to their customers' third-party data, and that's exactly what Unified delivers in real time.",{"type":23,"value":251519},"'",{"type":17,"tag":29,"props":251521,"children":251522},{},[251523],{"type":23,"value":251524},"— Roy Pereira, CEO @ Unified",{"type":17,"tag":29,"props":251526,"children":251527},{},[251528],{"type":23,"value":251529},"This breadth, combined with deep category-level normalization, has made Unified the standard integration layer for modern SaaS teams building AI-ready products.",{"type":17,"tag":68,"props":251531,"children":251533},{"id":251532},"_550-growth-in-api-usage",[251534],{"type":23,"value":251535},"550% Growth in API Usage",{"type":17,"tag":29,"props":251537,"children":251538},{},[251539],{"type":17,"tag":6438,"props":251540,"children":251543},{"alt":251541,"src":251542},"2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_hits_major_growth_milestone_as_api_usage_surges_550percent_in_2025-0.png",[],{"type":17,"tag":29,"props":251545,"children":251546},{},[251547,251549,251553],{"type":23,"value":251548},"Over the past six months, API usage across Unified has increased by more than ",{"type":17,"tag":48,"props":251550,"children":251551},{},[251552],{"type":23,"value":239653},{"type":23,"value":251554},", driven by the growing need for real-time data in SaaS and AI products.",{"type":17,"tag":29,"props":251556,"children":251557},{},[251558,251560,251564,251566,251571],{"type":23,"value":251559},"Teams use Unified to power ",{"type":17,"tag":133,"props":251561,"children":251562},{"href":5201},[251563],{"type":23,"value":5204},{"type":23,"value":251565}," pipelines, enterprise search, and AI workflows that rely on clean, normalized, real-time data. Every API call runs directly from the source through our ",{"type":17,"tag":133,"props":251567,"children":251569},{"href":86962,"rel":251568},[214],[251570],{"type":23,"value":63298},{"type":23,"value":251572},"—no caching, no persistence, no compliance risk.",{"type":17,"tag":3414,"props":251574,"children":251575},{},[251576],{"type":17,"tag":29,"props":251577,"children":251578},{},[251579,251580,251585,251586,251596,251607,251608,251613],{"type":23,"value":251512},{"type":17,"tag":33,"props":251581,"children":251582},{},[251583],{"type":23,"value":251584},"Building with Unified has been transformational for our email integration at",{"type":23,"value":18757},{"type":17,"tag":133,"props":251587,"children":251590},{"href":251588,"rel":251589},"https://www.sybill.ai/",[214],[251591],{"type":17,"tag":33,"props":251592,"children":251593},{},[251594],{"type":23,"value":251595},"Sybill",{"type":17,"tag":33,"props":251597,"children":251598},{},[251599,251601,251605],{"type":23,"value":251600},". We initially scoped two months of engineering effort to support both Gmail and Outlook, but with Unified's ",{"type":17,"tag":133,"props":251602,"children":251603},{"href":7691},[251604],{"type":23,"value":7459},{"type":23,"value":251606},", we shipped production-ready integration in under two weeks",{"type":23,"value":47186},{"type":17,"tag":33,"props":251609,"children":251610},{},[251611],{"type":23,"value":251612},"an eightfold reduction in development time.",{"type":23,"value":251519},{"type":17,"tag":29,"props":251615,"children":251616},{},[251617],{"type":23,"value":251618},"— Abhishek Vijayan, Staff Software Engineer at Sybill.",{"type":17,"tag":68,"props":251620,"children":251622},{"id":251621},"_400-growth-in-new-connections",[251623],{"type":23,"value":251624},"400% Growth in New Connections",{"type":17,"tag":29,"props":251626,"children":251627},{},[251628],{"type":17,"tag":6438,"props":251629,"children":251632},{"alt":251630,"src":251631},"3.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_hits_major_growth_milestone_as_api_usage_surges_550percent_in_2025-1.png",[],{"type":17,"tag":29,"props":251634,"children":251635},{},[251636,251638,251643,251645,251649],{"type":23,"value":251637},"Customer integrations built on Unified have grown more than ",{"type":17,"tag":48,"props":251639,"children":251640},{},[251641],{"type":23,"value":251642},"400% YoY",{"type":23,"value":251644},", driven by teams expanding coverage across more categories. Overall adoption is up ",{"type":17,"tag":48,"props":251646,"children":251647},{},[251648],{"type":23,"value":251451},{"type":23,"value":251650},", reflecting broader use across SaaS and AI-native platforms.",{"type":17,"tag":29,"props":251652,"children":251653},{},[251654],{"type":23,"value":251655},"Each connection represents a live, authenticated data stream—standardized, normalized, and instantly usable across multiple endpoints. This growth highlights how quickly developers can launch and scale integrations.",{"type":17,"tag":68,"props":251657,"children":251659},{"id":251658},"relentless-product-velocity",[251660],{"type":23,"value":251661},"Relentless Product Velocity",{"type":17,"tag":29,"props":251663,"children":251664},{},[251665,251667,251672,251674,251683,251689],{"type":23,"value":251666},"Unified's engineering pace continues to accelerate. In 2025, we've launched over ",{"type":17,"tag":48,"props":251668,"children":251669},{},[251670],{"type":23,"value":251671},"100 new integrations",{"type":23,"value":251673}," and delivered ",{"type":17,"tag":133,"props":251675,"children":251677},{"href":47029,"rel":251676},[214],[251678],{"type":17,"tag":48,"props":251679,"children":251680},{},[251681],{"type":23,"value":251682},"thousands",{"type":17,"tag":133,"props":251684,"children":251686},{"href":47029,"rel":251685},[214],[251687],{"type":23,"value":251688}," of enhancements",{"type":23,"value":251690}," across the platform, including expanded webhook coverage, deeper schema alignment, improved authentication flows, and new data objects and fields.",{"type":17,"tag":29,"props":251692,"children":251693},{},[251694],{"type":23,"value":251695},"We prioritize customer integration requests, ensuring the roadmap reflects real needs and helping teams expand coverage quickly without slowing their roadmap or staffing backend integration teams.",{"type":17,"tag":3414,"props":251697,"children":251698},{},[251699],{"type":17,"tag":29,"props":251700,"children":251701},{},[251702,251707],{"type":17,"tag":33,"props":251703,"children":251704},{},[251705],{"type":23,"value":251706},"'Unified has shortened our sales cycle from roughly three months to three weeks because we can onboard customers and their data immediately. As our customer list grows, our engineering headcount does not need to grow with it.",{"type":23,"value":251519},{"type":17,"tag":29,"props":251709,"children":251710},{},[251711],{"type":23,"value":251712},"— Robert Hayes, Co-founder at Merchkit",{"type":17,"tag":68,"props":251714,"children":251716},{"id":251715},"built-for-scale-secure-by-design",[251717],{"type":23,"value":251718},"Built for Scale, Secure by Design",{"type":17,"tag":29,"props":251720,"children":251721},{},[251722],{"type":17,"tag":6438,"props":251723,"children":251726},{"alt":251724,"src":251725},"June_Update_%287%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_hits_major_growth_milestone_as_api_usage_surges_550percent_in_2025-2.png",[],{"type":17,"tag":29,"props":251728,"children":251729},{},[251730,251732,251736,251737,251741,251742,251746,251747,251751,251752,251756,251758,251763],{"type":23,"value":251731},"As usage grows, so does our commitment to security and compliance. Unified is fully ",{"type":17,"tag":48,"props":251733,"children":251734},{},[251735],{"type":23,"value":94139},{"type":23,"value":11826},{"type":17,"tag":48,"props":251738,"children":251739},{},[251740],{"type":23,"value":63416},{"type":23,"value":11826},{"type":17,"tag":48,"props":251743,"children":251744},{},[251745],{"type":23,"value":63428},{"type":23,"value":11826},{"type":17,"tag":48,"props":251748,"children":251749},{},[251750],{"type":23,"value":63422},{"type":23,"value":12561},{"type":17,"tag":48,"props":251753,"children":251754},{},[251755],{"type":23,"value":63434},{"type":23,"value":251757}," compliant, with segregated infrastructure across the ",{"type":17,"tag":48,"props":251759,"children":251760},{},[251761],{"type":23,"value":251762},"U.S., Europe, and Australia",{"type":23,"value":54},{"type":17,"tag":29,"props":251765,"children":251766},{},[251767],{"type":23,"value":251768},"Because Unified never stores or caches customer data, compliance and data residency are simplified from day one. Every request is stateless and encrypted, with credentials optionally stored in your own AWS Secrets Manager account.",{"type":17,"tag":29,"props":251770,"children":251771},{},[251772],{"type":23,"value":251773},"This zero-storage model reduces compliance overhead and helps teams clear security reviews faster.",{"type":17,"tag":68,"props":251775,"children":251777},{"id":251776},"whats-next-at-unified",[251778],{"type":23,"value":251779},"What's Next at Unified",{"type":17,"tag":29,"props":251781,"children":251782},{},[251783],{"type":23,"value":251784},"Unified has become a core foundation for how modern SaaS companies deliver integrations and how AI-native products securely access customer data in real time.",{"type":17,"tag":29,"props":251786,"children":251787},{},[251788],{"type":23,"value":251789},"We'll continue expanding category coverage, deepening normalization, and strengthening the real-time infrastructure that teams rely on.",{"type":17,"tag":29,"props":251791,"children":251792},{},[251793],{"type":23,"value":251794},"For product and platform teams building AI-ready features that need to move faster with cleaner data, less maintenance, and no compliance trade-offs, Unified is your real-time integration partner.",{"type":17,"tag":29,"props":251796,"children":251797},{},[251798,251806,251807,251815],{"type":17,"tag":133,"props":251799,"children":251801},{"href":158861,"rel":251800},[214],[251802],{"type":17,"tag":48,"props":251803,"children":251804},{},[251805],{"type":23,"value":226470},{"type":23,"value":226472},{"type":17,"tag":133,"props":251808,"children":251810},{"href":1623,"rel":251809},[214],[251811],{"type":17,"tag":48,"props":251812,"children":251813},{},[251814],{"type":23,"value":226481},{"type":23,"value":226483},{"title":7,"searchDepth":1629,"depth":1629,"links":251817},[251818,251819,251820,251821,251822],{"id":251532,"depth":1629,"text":251535},{"id":251621,"depth":1629,"text":251624},{"id":251658,"depth":1629,"text":251661},{"id":251715,"depth":1629,"text":251718},{"id":251776,"depth":1629,"text":251779},"content:blog:unified_hits_major_growth_milestone_as_api_usage_surges_550percent_in_2025.md","blog/unified_hits_major_growth_milestone_as_api_usage_surges_550percent_in_2025.md","blog/unified_hits_major_growth_milestone_as_api_usage_surges_550percent_in_2025",{"_path":251827,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":251828,"description":251829,"img":251830,"date":251831,"tag":12,"body":251832,"_type":1677,"_id":252511,"_source":1679,"_file":252512,"_stem":252513,"_extension":1682},"/blog/ai_integration_use_cases_how_saas_teams_are_using_unified_for_rag_agents_and_vertical_ai","AI Integration Use Cases: How SaaS Teams Are Using Unified.to for RAG, Agents, and Vertical AI","AI features inside SaaS products are getting more specific. Teams aren't asking 'How do we add AI?' anymore — they're asking how to ground AI in the customer...","https://s3.us-east-2.amazonaws.com/unified-article-images/ai_integration_use_cases_how_saas_teams_are_using_unified_for_rag_agents_and_vertical_ai-icon.png","2025-12-06T13:48:00.000Z",{"type":14,"children":251833,"toc":252505},[251834,251839,251842,251850,251855,251860,251882,251887,251893,251902,251907,251925,251930,251938,252012,252020,252075,252085,252091,252096,252114,252119,252126,252154,252161,252203,252208,252213,252219,252224,252229,252233,252276,252281,252288,252375,252380,252387,252441,252450,252459,252464,252478,252483,252494],{"type":17,"tag":18,"props":251835,"children":251837},{"id":251836},"ai-integration-use-cases-how-saas-teams-are-using-unifiedto-for-rag-agents-and-vertical-ai",[251838],{"type":23,"value":251828},{"type":17,"tag":25,"props":251840,"children":251841},{},[],{"type":17,"tag":29,"props":251843,"children":251844},{},[251845],{"type":17,"tag":33,"props":251846,"children":251847},{},[251848],{"type":23,"value":251849},"December 6, 2025",{"type":17,"tag":29,"props":251851,"children":251852},{},[251853],{"type":23,"value":251854},"AI features inside SaaS products are getting more specific. Teams aren't asking 'How do we add AI?' anymore — they're asking how to ground AI in the customer data their product already depends on.",{"type":17,"tag":29,"props":251856,"children":251857},{},[251858],{"type":23,"value":251859},"Across AI-native SaaS products, three patterns show up:",{"type":17,"tag":80,"props":251861,"children":251862},{},[251863,251872,251877],{"type":17,"tag":84,"props":251864,"children":251865},{},[251866,251870],{"type":17,"tag":133,"props":251867,"children":251868},{"href":5201},[251869],{"type":23,"value":5204},{"type":23,"value":251871}," pipelines and enterprise search,",{"type":17,"tag":84,"props":251873,"children":251874},{},[251875],{"type":23,"value":251876},"AI note-takers and sales copilots,",{"type":17,"tag":84,"props":251878,"children":251879},{},[251880],{"type":23,"value":251881},"Vertical AI that enriches or generates content on top of operational data.",{"type":17,"tag":29,"props":251883,"children":251884},{},[251885],{"type":23,"value":251886},"Each of these use cases needs the same foundation: real-time access to CRMs, files, tickets, calendars, commerce systems, and more. The examples below show how teams are launching these features today — and why a unified, real-time integration layer changes what's possible.",{"type":17,"tag":68,"props":251888,"children":251890},{"id":251889},"rag-pipelines-on-live-saas-data",[251891],{"type":23,"value":251892},"RAG Pipelines on Live SaaS Data",{"type":17,"tag":29,"props":251894,"children":251895},{},[251896,251900],{"type":17,"tag":133,"props":251897,"children":251898},{"href":5201},[251899],{"type":23,"value":137991},{"type":23,"value":251901}," (RAG) pipelines ground AI features in a customer's live SaaS data. They pull normalized content from source systems, embed it, and retrieve relevant context at query time so LLM outputs are based on real, current information.",{"type":17,"tag":29,"props":251903,"children":251904},{},[251905],{"type":23,"value":251906},"One of the most common RAG implementations is enterprise search, where users can ask natural-language questions across internal tools. Typical queries include:",{"type":17,"tag":80,"props":251908,"children":251909},{},[251910,251915,251920],{"type":17,"tag":84,"props":251911,"children":251912},{},[251913],{"type":23,"value":251914},"'Show me all open enterprise deals with contracts stuck in legal.'",{"type":17,"tag":84,"props":251916,"children":251917},{},[251918],{"type":23,"value":251919},"'Summarize everything we know about this account across Salesforce, Notion, and Gmail.'",{"type":17,"tag":84,"props":251921,"children":251922},{},[251923],{"type":23,"value":251924},"'What changed in our security pipeline last week?'",{"type":17,"tag":29,"props":251926,"children":251927},{},[251928],{"type":23,"value":251929},"Under the hood, these products retrieve content from CRMs, file storage, knowledge bases, ticketing systems, and conversations, then surface answers using retrieved context rather than static prompts.",{"type":17,"tag":29,"props":251931,"children":251932},{},[251933],{"type":17,"tag":48,"props":251934,"children":251935},{},[251936],{"type":23,"value":251937},"Typical architecture",{"type":17,"tag":6154,"props":251939,"children":251940},{},[251941,251954,251973,251986,251999],{"type":17,"tag":84,"props":251942,"children":251943},{},[251944,251949,251952],{"type":17,"tag":48,"props":251945,"children":251946},{},[251947],{"type":23,"value":251948},"Connect",{"type":17,"tag":3891,"props":251950,"children":251951},{},[],{"type":23,"value":251953},"Use Unified to authorize access to core RAG source categories — file storage, knowledge pages, ticketing systems, CRM activity, and (where relevant) ATS data.",{"type":17,"tag":84,"props":251955,"children":251956},{},[251957,251962,251965,251967,251971],{"type":17,"tag":48,"props":251958,"children":251959},{},[251960],{"type":23,"value":251961},"Ingest fresh data",{"type":17,"tag":3891,"props":251963,"children":251964},{},[],{"type":23,"value":251966},"Subscribe to native or ",{"type":17,"tag":133,"props":251968,"children":251969},{"href":9007},[251970],{"type":23,"value":46572},{"type":23,"value":251972},". On create or update events, fetch the changed records directly from the source API.",{"type":17,"tag":84,"props":251974,"children":251975},{},[251976,251981,251984],{"type":17,"tag":48,"props":251977,"children":251978},{},[251979],{"type":23,"value":251980},"Chunk and embed",{"type":17,"tag":3891,"props":251982,"children":251983},{},[],{"type":23,"value":251985},"Break large text (files, pages, tickets, resumes) into chunks and generate embeddings using your embedding model. Each chunk inherits metadata such as object type, object ID, connection ID, and update timestamp.",{"type":17,"tag":84,"props":251987,"children":251988},{},[251989,251994,251997],{"type":17,"tag":48,"props":251990,"children":251991},{},[251992],{"type":23,"value":251993},"Index",{"type":17,"tag":3891,"props":251995,"children":251996},{},[],{"type":23,"value":251998},"Upsert embeddings into a vector database (for example, Pinecone), using metadata to support tenant isolation, object-level filtering, and update-time filtering.",{"type":17,"tag":84,"props":252000,"children":252001},{},[252002,252007,252010],{"type":17,"tag":48,"props":252003,"children":252004},{},[252005],{"type":23,"value":252006},"Retrieve and generate",{"type":17,"tag":3891,"props":252008,"children":252009},{},[],{"type":23,"value":252011},"At query time, retrieve the most relevant chunks and pass them to the LLM to generate grounded responses.",{"type":17,"tag":29,"props":252013,"children":252014},{},[252015],{"type":17,"tag":48,"props":252016,"children":252017},{},[252018],{"type":23,"value":252019},"Why teams choose Unified",{"type":17,"tag":80,"props":252021,"children":252022},{},[252023,252036,252049,252062],{"type":17,"tag":84,"props":252024,"children":252025},{},[252026,252031,252034],{"type":17,"tag":48,"props":252027,"children":252028},{},[252029],{"type":23,"value":252030},"Designed for RAG data sources",{"type":17,"tag":3891,"props":252032,"children":252033},{},[],{"type":23,"value":252035},"Unified provides normalized access to the SaaS tools RAG pipelines rely on most, removing per-provider mapping logic .",{"type":17,"tag":84,"props":252037,"children":252038},{},[252039,252044,252047],{"type":17,"tag":48,"props":252040,"children":252041},{},[252042],{"type":23,"value":252043},"Continuously current",{"type":17,"tag":3891,"props":252045,"children":252046},{},[],{"type":23,"value":252048},"Webhooks keep embeddings in sync as records change. Unified fetches data in real time and does not cache end-customer payloads, so retrieved context reflects the latest state.",{"type":17,"tag":84,"props":252050,"children":252051},{},[252052,252057,252060],{"type":17,"tag":48,"props":252053,"children":252054},{},[252055],{"type":23,"value":252056},"Normalization improves retrieval quality",{"type":17,"tag":3891,"props":252058,"children":252059},{},[],{"type":23,"value":252061},"Consistent schemas across providers improve embedding quality and retrieval relevance, while provider-specific fields remain available when needed.",{"type":17,"tag":84,"props":252063,"children":252064},{},[252065,252070,252073],{"type":17,"tag":48,"props":252066,"children":252067},{},[252068],{"type":23,"value":252069},"No additional data-at-rest risk",{"type":17,"tag":3891,"props":252071,"children":252072},{},[],{"type":23,"value":252074},"Unified does not store customer content. Derived artifacts such as embeddings and vector indexes live entirely in your own infrastructure.",{"type":17,"tag":29,"props":252076,"children":252077},{},[252078,252083],{"type":17,"tag":48,"props":252079,"children":252080},{},[252081],{"type":23,"value":252082},"Result:",{"type":23,"value":252084}," teams can build RAG-powered features — including enterprise search — on top of live SaaS data without maintaining dozens of custom integrations or managing a parallel data store.",{"type":17,"tag":68,"props":252086,"children":252088},{"id":252087},"ai-note-takers-and-sales-copilots",[252089],{"type":23,"value":252090},"AI Note-Takers and Sales Copilots",{"type":17,"tag":29,"props":252092,"children":252093},{},[252094],{"type":23,"value":252095},"These products sit in calls and meetings, then handle the busywork:",{"type":17,"tag":80,"props":252097,"children":252098},{},[252099,252104,252109],{"type":17,"tag":84,"props":252100,"children":252101},{},[252102],{"type":23,"value":252103},"Join Zoom / Meet / Teams calls, transcribe the conversation, and extract key points.",{"type":17,"tag":84,"props":252105,"children":252106},{},[252107],{"type":23,"value":252108},"Map the call to the right account, opportunity, and contacts in the CRM.",{"type":17,"tag":84,"props":252110,"children":252111},{},[252112],{"type":23,"value":252113},"Generate and send follow-up emails, tasks, or summaries into tools like HubSpot, Salesforce, Notion, and Slack.",{"type":17,"tag":29,"props":252115,"children":252116},{},[252117],{"type":23,"value":252118},"The value isn't just the transcript — it's tying everything back into the systems sales teams already live in.",{"type":17,"tag":29,"props":252120,"children":252121},{},[252122],{"type":17,"tag":48,"props":252123,"children":252124},{},[252125],{"type":23,"value":251937},{"type":17,"tag":6154,"props":252127,"children":252128},{},[252129,252134,252139,252144,252149],{"type":17,"tag":84,"props":252130,"children":252131},{},[252132],{"type":23,"value":252133},"Capture or receive call recordings and transcripts from meeting platforms.",{"type":17,"tag":84,"props":252135,"children":252136},{},[252137],{"type":23,"value":252138},"Use Unified to connect CRMs, calendars, and messaging tools (e.g. Salesforce, HubSpot, Google Calendar, Slack).",{"type":17,"tag":84,"props":252140,"children":252141},{},[252142],{"type":23,"value":252143},"For each call, fetch the latest account, opportunity, and attendee context in real time.",{"type":17,"tag":84,"props":252145,"children":252146},{},[252147],{"type":23,"value":252148},"Run LLM prompts that generate notes, next steps, and emails using both transcript and CRM data.",{"type":17,"tag":84,"props":252150,"children":252151},{},[252152],{"type":23,"value":252153},"Push updates back into CRM (notes, tasks, fields), internal docs, or channels via Unified.",{"type":17,"tag":29,"props":252155,"children":252156},{},[252157],{"type":17,"tag":48,"props":252158,"children":252159},{},[252160],{"type":23,"value":252019},{"type":17,"tag":80,"props":252162,"children":252163},{},[252164,252177,252190],{"type":17,"tag":84,"props":252165,"children":252166},{},[252167,252172,252175],{"type":17,"tag":48,"props":252168,"children":252169},{},[252170],{"type":23,"value":252171},"Context stays fresh",{"type":17,"tag":3891,"props":252173,"children":252174},{},[],{"type":23,"value":252176},"Before generating a follow-up, the product can pull the latest deal stage, open tickets, and prior interactions — all from the source of truth, not a cached copy.",{"type":17,"tag":84,"props":252178,"children":252179},{},[252180,252185,252188],{"type":17,"tag":48,"props":252181,"children":252182},{},[252183],{"type":23,"value":252184},"One CRM pipeline instead of many",{"type":17,"tag":3891,"props":252186,"children":252187},{},[],{"type":23,"value":252189},"Rather than bespoke logic for 'Salesforce vs HubSpot vs Pipedrive vs Copper,' teams build against a unified CRM schema and let Unified handle per-vendor quirks and auth.",{"type":17,"tag":84,"props":252191,"children":252192},{},[252193,252198,252201],{"type":17,"tag":48,"props":252194,"children":252195},{},[252196],{"type":23,"value":252197},"Read and write in the same integration path",{"type":17,"tag":3891,"props":252199,"children":252200},{},[],{"type":23,"value":252202},"The same unified model handles reads and writes. You can create tasks, update fields, or attach call summaries using consistent APIs, then rely on webhooks to keep your internal state in sync.",{"type":17,"tag":29,"props":252204,"children":252205},{},[252206],{"type":23,"value":252207},"Some teams use an agent-based approach here, where the AI can take authorized actions—such as updating records or creating follow-ups—rather than only generating text.",{"type":17,"tag":29,"props":252209,"children":252210},{},[252211],{"type":23,"value":252212},"The value isn't the transcript — it's the ability to push structured updates back into the CRM in the same workflow.",{"type":17,"tag":68,"props":252214,"children":252216},{"id":252215},"vertical-ai-industry-specific-ai-built-on-unified-saas-data",[252217],{"type":23,"value":252218},"Vertical AI: Industry-Specific AI Built on Unified SaaS Data",{"type":17,"tag":29,"props":252220,"children":252221},{},[252222],{"type":23,"value":252223},"Vertical AI systems apply AI models to operational data within a specific industry — such as FinTech, sales, lead generation, or e-commerce. These products depend on clean, normalized data pulled from multiple SaaS categories and joined into a single, consistent view.",{"type":17,"tag":29,"props":252225,"children":252226},{},[252227],{"type":23,"value":252228},"Instead of training models on siloed exports or brittle pipelines, teams use Unified to fetch live data across accounting, payments, CRM, forms, marketing, and commerce systems — then apply AI to power industry-specific workflows.",{"type":17,"tag":29,"props":252230,"children":252231},{},[252232],{"type":23,"value":90554},{"type":17,"tag":80,"props":252234,"children":252235},{},[252236,252246,252256,252266],{"type":17,"tag":84,"props":252237,"children":252238},{},[252239,252244],{"type":17,"tag":48,"props":252240,"children":252241},{},[252242],{"type":23,"value":252243},"FinTech and payments platforms",{"type":23,"value":252245}," that analyze invoices, transactions, payouts, and subscriptions to power forecasting, reconciliation, or risk scoring.",{"type":17,"tag":84,"props":252247,"children":252248},{},[252249,252254],{"type":17,"tag":48,"props":252250,"children":252251},{},[252252],{"type":23,"value":252253},"Sales and revenue tools",{"type":23,"value":252255}," that join CRM activity, leads, and engagement data to drive lead scoring, prioritization, or recommendations.",{"type":17,"tag":84,"props":252257,"children":252258},{},[252259,252264],{"type":17,"tag":48,"props":252260,"children":252261},{},[252262],{"type":23,"value":252263},"Lead generation platforms",{"type":23,"value":252265}," that combine form submissions, campaigns, and CRM records to enrich and qualify prospects.",{"type":17,"tag":84,"props":252267,"children":252268},{},[252269,252274],{"type":17,"tag":48,"props":252270,"children":252271},{},[252272],{"type":23,"value":252273},"E-commerce tools",{"type":23,"value":252275}," that analyze products, inventory, orders, and reviews to generate recommendations, optimize listings, or drive merchandising decisions.",{"type":17,"tag":29,"props":252277,"children":252278},{},[252279],{"type":23,"value":252280},"The AI isn't operating on isolated records — it's working on a unified dataset built from the customer's real systems.",{"type":17,"tag":29,"props":252282,"children":252283},{},[252284],{"type":17,"tag":48,"props":252285,"children":252286},{},[252287],{"type":23,"value":251937},{"type":17,"tag":6154,"props":252289,"children":252290},{},[252291,252304,252317,252349,252362],{"type":17,"tag":84,"props":252292,"children":252293},{},[252294,252299,252302],{"type":17,"tag":48,"props":252295,"children":252296},{},[252297],{"type":23,"value":252298},"Connect customer systems",{"type":17,"tag":3891,"props":252300,"children":252301},{},[],{"type":23,"value":252303},"Customers authenticate once using Unified's embedded authorization to connect accounting, payments, CRM, marketing, forms, or commerce platforms.",{"type":17,"tag":84,"props":252305,"children":252306},{},[252307,252312,252315],{"type":17,"tag":48,"props":252308,"children":252309},{},[252310],{"type":23,"value":252311},"Ingest and normalize",{"type":17,"tag":3891,"props":252313,"children":252314},{},[],{"type":23,"value":252316},"Fetch records from each category through Unified's APIs and map them to normalized schemas (for example, invoices, transactions, contacts, products). Provider-specific fields remain available when needed.",{"type":17,"tag":84,"props":252318,"children":252319},{},[252320,252325,252328,252330,252335,252336,252341,252342,252347],{"type":17,"tag":48,"props":252321,"children":252322},{},[252323],{"type":23,"value":252324},"Join and contextualize",{"type":17,"tag":3891,"props":252326,"children":252327},{},[],{"type":23,"value":252329},"Join records across categories using foreign keys such as ",{"type":17,"tag":6121,"props":252331,"children":252333},{"className":252332},[],[252334],{"type":23,"value":108877},{"type":23,"value":11826},{"type":17,"tag":6121,"props":252337,"children":252339},{"className":252338},[],[252340],{"type":23,"value":27299},{"type":23,"value":27293},{"type":17,"tag":6121,"props":252343,"children":252345},{"className":252344},[],[252346],{"type":23,"value":185867},{"type":23,"value":252348},". This creates a unified view of customers, transactions, leads, and products — critical for AI scoring, prediction, and recommendations.",{"type":17,"tag":84,"props":252350,"children":252351},{},[252352,252357,252360],{"type":17,"tag":48,"props":252353,"children":252354},{},[252355],{"type":23,"value":252356},"Power AI models",{"type":17,"tag":3891,"props":252358,"children":252359},{},[],{"type":23,"value":252361},"Feed the normalized, joined dataset into AI systems to drive vertical-specific workflows such as forecasting, lead scoring, enrichment, or personalization. Store derived features or embeddings in your own infrastructure as needed.",{"type":17,"tag":84,"props":252363,"children":252364},{},[252365,252370,252373],{"type":17,"tag":48,"props":252366,"children":252367},{},[252368],{"type":23,"value":252369},"Keep data fresh",{"type":17,"tag":3891,"props":252371,"children":252372},{},[],{"type":23,"value":252374},"Subscribe to native or virtual webhooks so models operate on real-time data instead of periodic syncs. Use polling only for backfills or edge cases.",{"type":17,"tag":29,"props":252376,"children":252377},{},[252378],{"type":23,"value":252379},"In cases where these predictions need to update records or trigger actions, teams use an agent-based approach with authorized writes back to source platforms.",{"type":17,"tag":29,"props":252381,"children":252382},{},[252383],{"type":17,"tag":48,"props":252384,"children":252385},{},[252386],{"type":23,"value":252019},{"type":17,"tag":80,"props":252388,"children":252389},{},[252390,252403,252416,252428],{"type":17,"tag":84,"props":252391,"children":252392},{},[252393,252398,252401],{"type":17,"tag":48,"props":252394,"children":252395},{},[252396],{"type":23,"value":252397},"Built for vertical AI workflows",{"type":17,"tag":3891,"props":252399,"children":252400},{},[],{"type":23,"value":252402},"Unified delivers category-specific APIs across accounting, payments, CRM, forms, marketing, and commerce — making it possible to build industry-specific AI without managing dozens of integrations.",{"type":17,"tag":84,"props":252404,"children":252405},{},[252406,252411,252414],{"type":17,"tag":48,"props":252407,"children":252408},{},[252409],{"type":23,"value":252410},"Normalized data across vendors",{"type":17,"tag":3891,"props":252412,"children":252413},{},[],{"type":23,"value":252415},"Unified's schemas standardize core records like invoices, transactions, contacts, and products across providers, improving data quality and reducing preprocessing before AI models run.",{"type":17,"tag":84,"props":252417,"children":252418},{},[252419,252423,252426],{"type":17,"tag":48,"props":252420,"children":252421},{},[252422],{"type":23,"value":147951},{"type":17,"tag":3891,"props":252424,"children":252425},{},[],{"type":23,"value":252427},"Foreign-key relationships make it possible to join data across systems — for example, linking payments to customers or orders to products — which is essential for accurate AI predictions and recommendations.",{"type":17,"tag":84,"props":252429,"children":252430},{},[252431,252436,252439],{"type":17,"tag":48,"props":252432,"children":252433},{},[252434],{"type":23,"value":252435},"Real-time context without storage risk",{"type":17,"tag":3891,"props":252437,"children":252438},{},[],{"type":23,"value":252440},"Unified reads and writes data live and does not cache end-customer payloads. Webhooks keep AI workflows synchronized without introducing a secondary data store.",{"type":17,"tag":29,"props":252442,"children":252443},{},[252444,252448],{"type":17,"tag":48,"props":252445,"children":252446},{},[252447],{"type":23,"value":252082},{"type":23,"value":252449}," teams can build vertical AI products on top of live, joined SaaS data — without maintaining custom pipelines for every vendor or category.",{"type":17,"tag":68,"props":252451,"children":252453},{"id":252452},"the-integration-layer-that-makes-this-possible",[252454],{"type":17,"tag":48,"props":252455,"children":252456},{},[252457],{"type":23,"value":252458},"The Integration Layer That Makes This Possible",{"type":17,"tag":29,"props":252460,"children":252461},{},[252462],{"type":23,"value":252463},"AI features only work as well as the data they can reach. Whether you're indexing content for search, generating follow-ups after a call, or enriching product catalogs, you need live context from the systems your customers already use.",{"type":17,"tag":29,"props":252465,"children":252466},{},[252467,252469,252476],{"type":23,"value":252468},"Unified provides that foundation — a unified, real-time API layer across 380+ integrations with normalized models, ",{"type":17,"tag":133,"props":252470,"children":252473},{"href":252471,"rel":252472},"https://docs.unified.to/reference/webhooks#webhooks",[214],[252474],{"type":23,"value":252475},"webhook coverage",{"type":23,"value":252477},", and zero-storage architecture. It removes the integration bottleneck so you can focus on the AI experience, not on maintaining dozens of connectors.",{"type":17,"tag":29,"props":252479,"children":252480},{},[252481],{"type":23,"value":252482},"If you're building in any of these spaces and want to move faster with less integration overhead, Unified is built for exactly these workloads.",{"type":17,"tag":29,"props":252484,"children":252485},{},[252486],{"type":17,"tag":133,"props":252487,"children":252489},{"href":1612,"rel":252488},[214],[252490],{"type":17,"tag":48,"props":252491,"children":252492},{},[252493],{"type":23,"value":1616},{"type":17,"tag":29,"props":252495,"children":252496},{},[252497],{"type":17,"tag":133,"props":252498,"children":252500},{"href":1623,"rel":252499},[214],[252501],{"type":17,"tag":48,"props":252502,"children":252503},{},[252504],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":252506},[252507,252508,252509,252510],{"id":251889,"depth":1629,"text":251892},{"id":252087,"depth":1629,"text":252090},{"id":252215,"depth":1629,"text":252218},{"id":252452,"depth":1629,"text":252458},"content:blog:ai_integration_use_cases_how_saas_teams_are_using_unified_for_rag_agents_and_vertical_ai.md","blog/ai_integration_use_cases_how_saas_teams_are_using_unified_for_rag_agents_and_vertical_ai.md","blog/ai_integration_use_cases_how_saas_teams_are_using_unified_for_rag_agents_and_vertical_ai",{"_path":252515,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":252516,"description":252517,"img":252518,"date":252519,"tag":12,"body":252520,"_type":1677,"_id":253102,"_source":1679,"_file":253103,"_stem":253104,"_extension":1682},"/blog/unified_api_security_how_zero_storage_architecture_protects_customer_data_in_real_time","Unified API Security: How Zero-Storage Architecture Protects Customer Data in Real Time","Every API connection is a potential risk vector. Integration vendors that store, sync, or cache customer data expand the attack surface, multiply compliance...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_api_security_how_zero_storage_architecture_protects_customer_data_in_real_time-icon.png","2025-12-05T00:00:00.000Z",{"type":14,"children":252521,"toc":253074},[252522,252527,252530,252538,252543,252555,252561,252566,252571,252581,252586,252592,252610,252615,252620,252625,252630,252643,252649,252654,252664,252670,252687,252698,252703,252708,252714,252725,252730,252761,252766,252771,252777,252782,252820,252825,252830,252836,252856,252868,252873,252878,252884,252889,252894,252899,252904,252910,252936,252941,252946,252951,252957,252962,253036,253041,253052,253063],{"type":17,"tag":18,"props":252523,"children":252525},{"id":252524},"unified-api-security-how-zero-storage-architecture-protects-customer-data-in-real-time",[252526],{"type":23,"value":252516},{"type":17,"tag":25,"props":252528,"children":252529},{},[],{"type":17,"tag":29,"props":252531,"children":252532},{},[252533],{"type":17,"tag":33,"props":252534,"children":252535},{},[252536],{"type":23,"value":252537},"December 5, 2025",{"type":17,"tag":29,"props":252539,"children":252540},{},[252541],{"type":23,"value":252542},"Every API connection is a potential risk vector. Integration vendors that store, sync, or cache customer data expand the attack surface, multiply compliance obligations, and complicate incident response.",{"type":17,"tag":29,"props":252544,"children":252545},{},[252546,252548,252553],{"type":23,"value":252547},"Unified takes a different approach. We built a ",{"type":17,"tag":48,"props":252549,"children":252550},{},[252551],{"type":23,"value":252552},"real-time, zero-storage architecture",{"type":23,"value":252554}," designed to safeguard customer data by default — no replicas, no warehouses, no liability footprint.",{"type":17,"tag":68,"props":252556,"children":252558},{"id":252557},"zero-storage-architecture-eliminating-data-at-rest-risk",[252559],{"type":23,"value":252560},"Zero-Storage Architecture: Eliminating Data-at-Rest Risk",{"type":17,"tag":29,"props":252562,"children":252563},{},[252564],{"type":23,"value":252565},"Unified never stores your customers' data. Every API call is fetched live from the source, transformed in memory, and delivered instantly to your system.",{"type":17,"tag":239,"props":252567,"children":252569},{"id":252568},"why-it-matters",[252570],{"type":23,"value":85072},{"type":17,"tag":29,"props":252572,"children":252573},{},[252574,252575,252579],{"type":23,"value":9603},{"type":17,"tag":133,"props":252576,"children":252577},{"href":7691},[252578],{"type":23,"value":7459},{"type":23,"value":252580}," and iPaaS vendors cache data for convenience. Those caches become secondary databases containing sensitive customer information. If that data is breached or subpoenaed, your users' records are exposed.",{"type":17,"tag":29,"props":252582,"children":252583},{},[252584],{"type":23,"value":252585},"By never writing data to disk, Unified removes that liability entirely. No stored data means no additional breach vector and faster compliance reviews.",{"type":17,"tag":68,"props":252587,"children":252589},{"id":252588},"compliance-by-design",[252590],{"type":23,"value":252591},"Compliance by Design",{"type":17,"tag":29,"props":252593,"children":252594},{},[252595,252597,252602,252604,252609],{"type":23,"value":252596},"Unified is ",{"type":17,"tag":48,"props":252598,"children":252599},{},[252600],{"type":23,"value":252601},"SOC 2 Type II certified",{"type":23,"value":252603}," and compliant with ",{"type":17,"tag":48,"props":252605,"children":252606},{},[252607],{"type":23,"value":252608},"GDPR, CCPA/CPRA, HIPAA, and PIPEDA",{"type":23,"value":54},{"type":17,"tag":29,"props":252611,"children":252612},{},[252613],{"type":23,"value":252614},"Our architecture inherently reduces PII persistence risk, minimizing your audit scope and compliance overhead.",{"type":17,"tag":239,"props":252616,"children":252618},{"id":252617},"why-it-matters-1",[252619],{"type":23,"value":85072},{"type":17,"tag":29,"props":252621,"children":252622},{},[252623],{"type":23,"value":252624},"Security certifications validate process maturity, but architecture determines your exposure. Many unified API vendors store or sync customer data, which requires their customers to expand SOC 2 controls to cover a secondary database they don't operate. If that vendor is breached, subpoenaed, or misconfigured, your users' data becomes part of the blast radius.",{"type":17,"tag":29,"props":252626,"children":252627},{},[252628],{"type":23,"value":252629},"Because Unified never stores data, our SOC 2 footprint is materially smaller — and so is yours. There's no cached database to include in your own audits, no data-at-rest controls to inherit, and no additional monitoring obligations to manage.",{"type":17,"tag":29,"props":252631,"children":252632},{},[252633,252635,252642],{"type":23,"value":252634},"Access all reports through our ",{"type":17,"tag":133,"props":252636,"children":252639},{"href":252637,"rel":252638},"https://app.mycroft.io/trust/unified-to",[214],[252640],{"type":23,"value":252641},"Trust Center",{"type":23,"value":54},{"type":17,"tag":239,"props":252644,"children":252646},{"id":252645},"migrating-from-storage-based-vendors",[252647],{"type":23,"value":252648},"Migrating from storage-based vendors",{"type":17,"tag":29,"props":252650,"children":252651},{},[252652],{"type":23,"value":252653},"Teams moving off storage-heavy providers (like Merge) avoid multi-week data extraction and sanitization cycles because Unified has nothing to migrate. Credentials import cleanly, and your data model maps one-to-one or through unified schemas. A lightweight credential export → CSV import process lets you transition safely without replicating any historical customer data.",{"type":17,"tag":29,"props":252655,"children":252656},{},[252657],{"type":17,"tag":133,"props":252658,"children":252661},{"href":252659,"rel":252660},"https://unified.to/blog/how_to_migrate_or_import_your_integrations_into_unified",[214],[252662],{"type":23,"value":252663},"How to migrate or import your integrations into Unified.to",{"type":17,"tag":68,"props":252665,"children":252667},{"id":252666},"encryption-and-secrets-management",[252668],{"type":23,"value":252669},"Encryption and Secrets Management",{"type":17,"tag":29,"props":252671,"children":252672},{},[252673,252675,252680,252682,252686],{"type":23,"value":252674},"All data in transit uses ",{"type":17,"tag":48,"props":252676,"children":252677},{},[252678],{"type":23,"value":252679},"TLS 1.2+",{"type":23,"value":252681},", and minimal operational metadata is encrypted at rest using ",{"type":17,"tag":48,"props":252683,"children":252684},{},[252685],{"type":23,"value":64321},{"type":23,"value":54},{"type":17,"tag":29,"props":252688,"children":252689},{},[252690,252692,252696],{"type":23,"value":252691},"Teams can optionally store OAuth2 credentials and API tokens in their own ",{"type":17,"tag":48,"props":252693,"children":252694},{},[252695],{"type":23,"value":764},{"type":23,"value":252697},", giving them full custody of credentials.",{"type":17,"tag":239,"props":252699,"children":252701},{"id":252700},"why-it-matters-2",[252702],{"type":23,"value":85072},{"type":17,"tag":29,"props":252704,"children":252705},{},[252706],{"type":23,"value":252707},"Encryption protects data from interception. Allowing you to bring your own secrets vault ensures even Unified can't access customer credentials—ideal for regulated or enterprise environments.",{"type":17,"tag":68,"props":252709,"children":252711},{"id":252710},"access-and-identity-controls",[252712],{"type":23,"value":252713},"Access and Identity Controls",{"type":17,"tag":29,"props":252715,"children":252716},{},[252717,252718,252723],{"type":23,"value":58218},{"type":17,"tag":48,"props":252719,"children":252720},{},[252721],{"type":23,"value":252722},"SAML 2.0 and OIDC SSO",{"type":23,"value":252724}," with Okta, Entra ID, Google Workspace, Ping, and others.",{"type":17,"tag":29,"props":252726,"children":252727},{},[252728],{"type":23,"value":252729},"Access can be restricted by:",{"type":17,"tag":80,"props":252731,"children":252732},{},[252733,252741,252751],{"type":17,"tag":84,"props":252734,"children":252735},{},[252736],{"type":17,"tag":48,"props":252737,"children":252738},{},[252739],{"type":23,"value":252740},"IP allowlisting",{"type":17,"tag":84,"props":252742,"children":252743},{},[252744,252749],{"type":17,"tag":48,"props":252745,"children":252746},{},[252747],{"type":23,"value":252748},"Environment-specific API keys",{"type":23,"value":252750}," (dev, staging, production)",{"type":17,"tag":84,"props":252752,"children":252753},{},[252754,252759],{"type":17,"tag":48,"props":252755,"children":252756},{},[252757],{"type":23,"value":252758},"Per-developer tokens",{"type":23,"value":252760}," with scoped permissions",{"type":17,"tag":239,"props":252762,"children":252764},{"id":252763},"why-it-matters-3",[252765],{"type":23,"value":85072},{"type":17,"tag":29,"props":252767,"children":252768},{},[252769],{"type":23,"value":252770},"Centralized identity management prevents credential sprawl, enforces MFA, and aligns with least-privilege principles. Environment-restricted keys reduce blast radius—an exposed dev key can't reach production data.",{"type":17,"tag":68,"props":252772,"children":252774},{"id":252773},"application-security-and-testing",[252775],{"type":23,"value":252776},"Application Security and Testing",{"type":17,"tag":29,"props":252778,"children":252779},{},[252780],{"type":23,"value":252781},"Security is integrated throughout our software development lifecycle:",{"type":17,"tag":80,"props":252783,"children":252784},{},[252785,252803,252808],{"type":17,"tag":84,"props":252786,"children":252787},{},[252788,252790,252795,252796,252801],{"type":23,"value":252789},"Every build undergoes ",{"type":17,"tag":48,"props":252791,"children":252792},{},[252793],{"type":23,"value":252794},"static (SAST)",{"type":23,"value":34435},{"type":17,"tag":48,"props":252797,"children":252798},{},[252799],{"type":23,"value":252800},"dynamic (DAST)",{"type":23,"value":252802}," analysis",{"type":17,"tag":84,"props":252804,"children":252805},{},[252806],{"type":23,"value":252807},"Containers and infrastructure are scanned automatically",{"type":17,"tag":84,"props":252809,"children":252810},{},[252811,252813,252818],{"type":23,"value":252812},"Independent ",{"type":17,"tag":48,"props":252814,"children":252815},{},[252816],{"type":23,"value":252817},"annual penetration tests",{"type":23,"value":252819}," validate the platform",{"type":17,"tag":239,"props":252821,"children":252823},{"id":252822},"why-it-matters-4",[252824],{"type":23,"value":85072},{"type":17,"tag":29,"props":252826,"children":252827},{},[252828],{"type":23,"value":252829},"Continuous testing ensures vulnerabilities are identified early. External audits confirm that claims hold up under real-world attack simulation, not just internal review.",{"type":17,"tag":68,"props":252831,"children":252833},{"id":252832},"data-residency-and-regional-isolation",[252834],{"type":23,"value":252835},"Data Residency and Regional Isolation",{"type":17,"tag":29,"props":252837,"children":252838},{},[252839,252841,252845,252846,252850,252851,252855],{"type":23,"value":252840},"Unified operates fully segregated environments in the ",{"type":17,"tag":48,"props":252842,"children":252843},{},[252844],{"type":23,"value":64343},{"type":23,"value":11826},{"type":17,"tag":48,"props":252847,"children":252848},{},[252849],{"type":23,"value":64348},{"type":23,"value":12561},{"type":17,"tag":48,"props":252852,"children":252853},{},[252854],{"type":23,"value":64353},{"type":23,"value":54},{"type":17,"tag":29,"props":252857,"children":252858},{},[252859,252861,252866],{"type":23,"value":252860},"Enterprise customers can also deploy in ",{"type":17,"tag":48,"props":252862,"children":252863},{},[252864],{"type":23,"value":252865},"single-tenant or dedicated clouds",{"type":23,"value":252867}," with isolated servers and databases.",{"type":17,"tag":239,"props":252869,"children":252871},{"id":252870},"why-it-matters-5",[252872],{"type":23,"value":85072},{"type":17,"tag":29,"props":252874,"children":252875},{},[252876],{"type":23,"value":252877},"Regional segregation helps organizations meet GDPR and other residency requirements while improving latency and resilience. It prevents data from crossing borders unintentionally.",{"type":17,"tag":68,"props":252879,"children":252881},{"id":252880},"environment-restricted-api-keys",[252882],{"type":23,"value":252883},"Environment-Restricted API Keys",{"type":17,"tag":29,"props":252885,"children":252886},{},[252887],{"type":23,"value":252888},"Unified's latest security feature lets teams bind each API key to a specific environment—development, staging, or production.",{"type":17,"tag":29,"props":252890,"children":252891},{},[252892],{"type":23,"value":252893},"When combined with per-user keys and IP allowlisting, this isolates credentials across teams and workflows.",{"type":17,"tag":239,"props":252895,"children":252897},{"id":252896},"why-it-matters-6",[252898],{"type":23,"value":85072},{"type":17,"tag":29,"props":252900,"children":252901},{},[252902],{"type":23,"value":252903},"If a credential leaks, its reach is limited to a single environment. This dramatically lowers potential exposure during development or testing.",{"type":17,"tag":68,"props":252905,"children":252907},{"id":252906},"built-for-the-ai-era",[252908],{"type":23,"value":252909},"Built for the AI Era",{"type":17,"tag":29,"props":252911,"children":252912},{},[252913,252915,252928,252930,252935],{"type":23,"value":252914},"Our ",{"type":17,"tag":48,"props":252916,"children":252917},{},[252918,252922,252923,252927],{"type":17,"tag":133,"props":252919,"children":252920},{"href":64193},[252921],{"type":23,"value":44580},{"type":23,"value":44573},{"type":17,"tag":133,"props":252924,"children":252925},{"href":326},[252926],{"type":23,"value":329},{"type":23,"value":12034},{"type":23,"value":252929}," lets AI models like Claude, ChatGPT, or Gemini act on real customer data ",{"type":17,"tag":48,"props":252931,"children":252932},{},[252933],{"type":23,"value":252934},"without exposing PII",{"type":23,"value":54},{"type":17,"tag":29,"props":252937,"children":252938},{},[252939],{"type":23,"value":252940},"Only permissioned API objects are made available to the LLM; nothing is stored or retained.",{"type":17,"tag":239,"props":252942,"children":252944},{"id":252943},"why-it-matters-7",[252945],{"type":23,"value":85072},{"type":17,"tag":29,"props":252947,"children":252948},{},[252949],{"type":23,"value":252950},"AI agents require real-time data, but exposing full datasets creates privacy risk. Scoped MCP access provides the utility of AI actions with enterprise-grade control.",{"type":17,"tag":68,"props":252952,"children":252954},{"id":252953},"security-questions-to-ask-any-integration-vendor",[252955],{"type":23,"value":252956},"Security Questions to Ask Any Integration Vendor",{"type":17,"tag":29,"props":252958,"children":252959},{},[252960],{"type":23,"value":252961},"Use these questions to evaluate providers and uncover hidden risks:",{"type":17,"tag":6154,"props":252963,"children":252964},{},[252965,252978,252991,253004,253012,253020,253028],{"type":17,"tag":84,"props":252966,"children":252967},{},[252968,252973,252976],{"type":17,"tag":48,"props":252969,"children":252970},{},[252971],{"type":23,"value":252972},"Do you store or cache customer data?",{"type":17,"tag":3891,"props":252974,"children":252975},{},[],{"type":23,"value":252977},"If yes, ask where, how long, and under what encryption.",{"type":17,"tag":84,"props":252979,"children":252980},{},[252981,252986,252989],{"type":17,"tag":48,"props":252982,"children":252983},{},[252984],{"type":23,"value":252985},"Who controls OAuth credentials and API keys?",{"type":17,"tag":3891,"props":252987,"children":252988},{},[],{"type":23,"value":252990},"Can you host them in your own secrets vault?",{"type":17,"tag":84,"props":252992,"children":252993},{},[252994,252999,253002],{"type":17,"tag":48,"props":252995,"children":252996},{},[252997],{"type":23,"value":252998},"Can I restrict API keys by environment or IP?",{"type":17,"tag":3891,"props":253000,"children":253001},{},[],{"type":23,"value":253003},"This limits accidental or malicious access.",{"type":17,"tag":84,"props":253005,"children":253006},{},[253007],{"type":17,"tag":48,"props":253008,"children":253009},{},[253010],{"type":23,"value":253011},"Which compliance certifications are active and independently verified?",{"type":17,"tag":84,"props":253013,"children":253014},{},[253015],{"type":17,"tag":48,"props":253016,"children":253017},{},[253018],{"type":23,"value":253019},"How often is penetration testing performed—and by whom?",{"type":17,"tag":84,"props":253021,"children":253022},{},[253023],{"type":17,"tag":48,"props":253024,"children":253025},{},[253026],{"type":23,"value":253027},"Are data regions segregated or shared?",{"type":17,"tag":84,"props":253029,"children":253030},{},[253031],{"type":17,"tag":48,"props":253032,"children":253033},{},[253034],{"type":23,"value":253035},"What is your log retention and redaction policy?",{"type":17,"tag":29,"props":253037,"children":253038},{},[253039],{"type":23,"value":253040},"Unified was designed to meet every one of these standards: real-time passthrough, zero data storage, and transparent documentation.",{"type":17,"tag":29,"props":253042,"children":253043},{},[253044,253050],{"type":17,"tag":133,"props":253045,"children":253047},{"href":86962,"rel":253046},[214],[253048],{"type":23,"value":253049},"Visit our security page",{"type":23,"value":253051}," to review the latest certifications and security reports.",{"type":17,"tag":29,"props":253053,"children":253054},{},[253055],{"type":17,"tag":133,"props":253056,"children":253058},{"href":1612,"rel":253057},[214],[253059],{"type":17,"tag":48,"props":253060,"children":253061},{},[253062],{"type":23,"value":1616},{"type":17,"tag":29,"props":253064,"children":253065},{},[253066],{"type":17,"tag":133,"props":253067,"children":253069},{"href":1623,"rel":253068},[214],[253070],{"type":17,"tag":48,"props":253071,"children":253072},{},[253073],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":253075},[253076,253079,253083,253086,253089,253092,253095,253098,253101],{"id":252557,"depth":1629,"text":252560,"children":253077},[253078],{"id":252568,"depth":1635,"text":85072},{"id":252588,"depth":1629,"text":252591,"children":253080},[253081,253082],{"id":252617,"depth":1635,"text":85072},{"id":252645,"depth":1635,"text":252648},{"id":252666,"depth":1629,"text":252669,"children":253084},[253085],{"id":252700,"depth":1635,"text":85072},{"id":252710,"depth":1629,"text":252713,"children":253087},[253088],{"id":252763,"depth":1635,"text":85072},{"id":252773,"depth":1629,"text":252776,"children":253090},[253091],{"id":252822,"depth":1635,"text":85072},{"id":252832,"depth":1629,"text":252835,"children":253093},[253094],{"id":252870,"depth":1635,"text":85072},{"id":252880,"depth":1629,"text":252883,"children":253096},[253097],{"id":252896,"depth":1635,"text":85072},{"id":252906,"depth":1629,"text":252909,"children":253099},[253100],{"id":252943,"depth":1635,"text":85072},{"id":252953,"depth":1629,"text":252956},"content:blog:unified_api_security_how_zero_storage_architecture_protects_customer_data_in_real_time.md","blog/unified_api_security_how_zero_storage_architecture_protects_customer_data_in_real_time.md","blog/unified_api_security_how_zero_storage_architecture_protects_customer_data_in_real_time",{"_path":253106,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":253107,"description":253108,"img":253109,"date":253110,"tag":12,"body":253111,"_type":1677,"_id":253715,"_source":1679,"_file":253716,"_stem":253717,"_extension":1682},"/blog/november_2025_product_updates","November 2025 product updates","In November, we focused on depth that your product and AI features actually use — not just adding more integrations.","https://s3.us-east-2.amazonaws.com/unified-article-images/november_2025_product_updates-icon.png","2025-12-01T00:00:00.000Z",{"type":14,"children":253112,"toc":253709},[253113,253118,253121,253129,253133,253138,253144,253152,253188,253196,253219,253227,253251,253259,253282,253290,253313,253317,253334,253342,253365,253370,253383,253389,253394,253631,253647,253651,253682,253687,253698],{"type":17,"tag":18,"props":253114,"children":253116},{"id":253115},"november-2025-product-updates",[253117],{"type":23,"value":253107},{"type":17,"tag":25,"props":253119,"children":253120},{},[],{"type":17,"tag":29,"props":253122,"children":253123},{},[253124],{"type":17,"tag":33,"props":253125,"children":253126},{},[253127],{"type":23,"value":253128},"December 1, 2025",{"type":17,"tag":29,"props":253130,"children":253131},{},[253132],{"type":23,"value":253108},{"type":17,"tag":29,"props":253134,"children":253135},{},[253136],{"type":23,"value":253137},"On the platform side, we strengthened our security posture with environment-restricted API keys and shipped several developer-focused improvements: Supabase model definitions and database webhook support, a Cloudflare Worker template, category-scoped OpenAPI and Postman specs, a new global search inside the app, and in-app tools that make testing and setup faster.",{"type":17,"tag":68,"props":253139,"children":253141},{"id":253140},"developer-experience-updates",[253142],{"type":23,"value":253143},"Developer Experience Updates",{"type":17,"tag":29,"props":253145,"children":253146},{},[253147],{"type":17,"tag":48,"props":253148,"children":253149},{},[253150],{"type":23,"value":253151},"Supabase model definitions",{"type":17,"tag":80,"props":253153,"children":253154},{},[253155,253167],{"type":17,"tag":84,"props":253156,"children":253157},{},[253158,253160,253165],{"type":23,"value":253159},"Added full + per-category ",{"type":17,"tag":48,"props":253161,"children":253162},{},[253163],{"type":23,"value":253164},"Supabase DDL SQL",{"type":23,"value":253166}," files",{"type":17,"tag":84,"props":253168,"children":253169},{},[253170,253171,253180,253183],{"type":23,"value":11819},{"type":17,"tag":48,"props":253172,"children":253173},{},[253174,253176],{"type":23,"value":253175},"Supabase support for database ",{"type":17,"tag":133,"props":253177,"children":253178},{"href":4999},[253179],{"type":23,"value":5002},{"type":17,"tag":3891,"props":253181,"children":253182},{},[],{"type":17,"tag":33,"props":253184,"children":253185},{},[253186],{"type":23,"value":253187},"Allows teams to mirror Unified's schemas in Supabase and stream updates directly into their own database.",{"type":17,"tag":29,"props":253189,"children":253190},{},[253191],{"type":17,"tag":48,"props":253192,"children":253193},{},[253194],{"type":23,"value":253195},"Cloudflare Worker template",{"type":17,"tag":80,"props":253197,"children":253198},{},[253199],{"type":17,"tag":84,"props":253200,"children":253201},{},[253202,253204,253209,253211,253214],{"type":23,"value":253203},"Added a ready-to-deploy Worker example and ",{"type":17,"tag":48,"props":253205,"children":253206},{},[253207],{"type":23,"value":253208},"Deploy to Cloudflare",{"type":23,"value":253210}," button",{"type":17,"tag":3891,"props":253212,"children":253213},{},[],{"type":17,"tag":33,"props":253215,"children":253216},{},[253217],{"type":23,"value":253218},"Makes it easy to call Unified from edge runtimes without managing servers.",{"type":17,"tag":29,"props":253220,"children":253221},{},[253222],{"type":17,"tag":48,"props":253223,"children":253224},{},[253225],{"type":23,"value":253226},"Postman improvements",{"type":17,"tag":80,"props":253228,"children":253229},{},[253230,253241,253246],{"type":17,"tag":84,"props":253231,"children":253232},{},[253233,253234,253239],{"type":23,"value":11819},{"type":17,"tag":48,"props":253235,"children":253236},{},[253237],{"type":23,"value":253238},"Run in Postman",{"type":23,"value":253240}," button globally + per category",{"type":17,"tag":84,"props":253242,"children":253243},{},[253244],{"type":23,"value":253245},"Added Unified's Postman workspace link in the app footer",{"type":17,"tag":84,"props":253247,"children":253248},{},[253249],{"type":23,"value":253250},"Category-scoped Postman collections with region + key variables",{"type":17,"tag":29,"props":253252,"children":253253},{},[253254],{"type":17,"tag":48,"props":253255,"children":253256},{},[253257],{"type":23,"value":253258},"Split OpenAPI/Postman specs",{"type":17,"tag":80,"props":253260,"children":253261},{},[253262],{"type":17,"tag":84,"props":253263,"children":253264},{},[253265,253267,253272,253274,253277],{"type":23,"value":253266},"Our large unified spec is now split into ",{"type":17,"tag":48,"props":253268,"children":253269},{},[253270],{"type":23,"value":253271},"per-category",{"type":23,"value":253273}," OpenAPI, Postman, and Supabase files",{"type":17,"tag":3891,"props":253275,"children":253276},{},[],{"type":17,"tag":33,"props":253278,"children":253279},{},[253280],{"type":23,"value":253281},"Improves performance in tooling and lets devs import only what they need.",{"type":17,"tag":29,"props":253283,"children":253284},{},[253285],{"type":17,"tag":48,"props":253286,"children":253287},{},[253288],{"type":23,"value":253289},"In-app improvements",{"type":17,"tag":80,"props":253291,"children":253292},{},[253293,253298,253303,253308],{"type":17,"tag":84,"props":253294,"children":253295},{},[253296],{"type":23,"value":253297},"New global search",{"type":17,"tag":84,"props":253299,"children":253300},{},[253301],{"type":23,"value":253302},"Import existing connections",{"type":17,"tag":84,"props":253304,"children":253305},{},[253306],{"type":23,"value":253307},"New FileManager + MessageManager sample components",{"type":17,"tag":84,"props":253309,"children":253310},{},[253311],{"type":23,"value":253312},"Expanded API SDKs section (Supabase, Cloudflare)",{"type":17,"tag":68,"props":253314,"children":253315},{"id":252880},[253316],{"type":23,"value":252883},{"type":17,"tag":29,"props":253318,"children":253319},{},[253320,253322,253332],{"type":23,"value":253321},"We introduced ",{"type":17,"tag":133,"props":253323,"children":253326},{"href":253324,"rel":253325},"https://unified.to/blog/strengthening_our_security_posture_with_environment_restricted_api_keys",[214],[253327],{"type":17,"tag":48,"props":253328,"children":253329},{},[253330],{"type":23,"value":253331},"environment-restricted API keys",{"type":23,"value":253333}," so teams can limit keys to production, staging, sandbox, or custom environments.",{"type":17,"tag":29,"props":253335,"children":253336},{},[253337],{"type":17,"tag":48,"props":253338,"children":253339},{},[253340],{"type":23,"value":253341},"Why this matters:",{"type":17,"tag":80,"props":253343,"children":253344},{},[253345,253350,253355,253360],{"type":17,"tag":84,"props":253346,"children":253347},{},[253348],{"type":23,"value":253349},"Prevent accidental access to production",{"type":17,"tag":84,"props":253351,"children":253352},{},[253353],{"type":23,"value":253354},"Give certain developers non-production access only",{"type":17,"tag":84,"props":253356,"children":253357},{},[253358],{"type":23,"value":253359},"Avoid creating separate workspaces to isolate environments",{"type":17,"tag":84,"props":253361,"children":253362},{},[253363],{"type":23,"value":253364},"Align Unified access with your internal environment structure",{"type":17,"tag":29,"props":253366,"children":253367},{},[253368],{"type":23,"value":253369},"Keys only work in the environment they're scoped to. Existing keys stay unchanged unless you apply restrictions.",{"type":17,"tag":29,"props":253371,"children":253372},{},[253373,253375,253381],{"type":23,"value":253374},"This builds on our ",{"type":17,"tag":133,"props":253376,"children":253378},{"href":86962,"rel":253377},[214],[253379],{"type":23,"value":253380},"security foundation",{"type":23,"value":253382},": zero data stored, SOC 2 Type II, GDPR/CCPA/PIPEDA/HIPAA compliance, SAML SSO, IP allowlisting, Secrets Manager support, and fully isolated data regions.",{"type":17,"tag":68,"props":253384,"children":253386},{"id":253385},"november-changelog-summary",[253387],{"type":23,"value":253388},"November Changelog Summary",{"type":17,"tag":29,"props":253390,"children":253391},{},[253392],{"type":23,"value":253393},"At a glance, across 20+ systems:",{"type":17,"tag":80,"props":253395,"children":253396},{},[253397,253443,253491,253514,253530,253546,253567,253583,253599],{"type":17,"tag":84,"props":253398,"children":253399},{},[253400,253405],{"type":17,"tag":48,"props":253401,"children":253402},{},[253403],{"type":23,"value":253404},"New integrations:",{"type":17,"tag":80,"props":253406,"children":253407},{},[253408,253420,253432],{"type":17,"tag":84,"props":253409,"children":253410},{},[253411,253418],{"type":17,"tag":133,"props":253412,"children":253415},{"href":253413,"rel":253414},"https://unified.to/integrations/Seven20",[214],[253416],{"type":23,"value":253417},"Seven20",{"type":23,"value":253419}," (ATS/HR/Auth)",{"type":17,"tag":84,"props":253421,"children":253422},{},[253423,253430],{"type":17,"tag":133,"props":253424,"children":253427},{"href":253425,"rel":253426},"https://unified.to/integrations/pcrecruiteronprem",[214],[253428],{"type":23,"value":253429},"PCRecruiter On-Prem",{"type":23,"value":253431}," (ATS/HR)",{"type":17,"tag":84,"props":253433,"children":253434},{},[253435,253441],{"type":17,"tag":133,"props":253436,"children":253439},{"href":253437,"rel":253438},"https://unified.to/integrations/dialpad",[214],[253440],{"type":23,"value":31550},{"type":23,"value":253442}," (Dialer/Call Center/Call Center)",{"type":17,"tag":84,"props":253444,"children":253445},{},[253446,253450],{"type":17,"tag":48,"props":253447,"children":253448},{},[253449],{"type":23,"value":25087},{"type":17,"tag":80,"props":253451,"children":253452},{},[253453],{"type":17,"tag":84,"props":253454,"children":253455},{},[253456,253461,253463,253468,253469,253475,253477,253482,253484,253489],{"type":17,"tag":48,"props":253457,"children":253458},{},[253459],{"type":23,"value":253460},"Messaging & meetings:",{"type":23,"value":253462}," Expanded filters and virtual webhook parameters across Slack and Microsoft Teams (including ",{"type":17,"tag":6121,"props":253464,"children":253466},{"className":253465},[],[253467],{"type":23,"value":27310},{"type":23,"value":11826},{"type":17,"tag":6121,"props":253470,"children":253472},{"className":253471},[],[253473],{"type":23,"value":253474},"user_mentioned_id",{"type":23,"value":253476},", time-range filters, and virtual-webhook-specific params), added ",{"type":17,"tag":6121,"props":253478,"children":253480},{"className":253479},[],[253481],{"type":23,"value":33497},{"type":23,"value":253483}," to Slack, Teams, Outlook, Gmail, and Discord, and introduced ",{"type":17,"tag":6121,"props":253485,"children":253487},{"className":253486},[],[253488],{"type":23,"value":165737},{"type":23,"value":253490}," flags on Google Calendar and Google Meet events",{"type":17,"tag":84,"props":253492,"children":253493},{},[253494,253498],{"type":17,"tag":48,"props":253495,"children":253496},{},[253497],{"type":23,"value":26246},{"type":17,"tag":80,"props":253499,"children":253500},{},[253501],{"type":17,"tag":84,"props":253502,"children":253503},{},[253504,253505,253512],{"type":23,"value":11819},{"type":17,"tag":133,"props":253506,"children":253509},{"href":253507,"rel":253508},"http://company.domains/",[214],[253510],{"type":23,"value":253511},"Company.domains",{"type":23,"value":253513}," field across 20+ CRM integrations.",{"type":17,"tag":84,"props":253515,"children":253516},{},[253517,253522],{"type":17,"tag":48,"props":253518,"children":253519},{},[253520],{"type":23,"value":253521},"ATS:",{"type":17,"tag":80,"props":253523,"children":253524},{},[253525],{"type":17,"tag":84,"props":253526,"children":253527},{},[253528],{"type":23,"value":253529},"New readable/writable fields and full virtual webhook coverage across Bullhorn, Oracle Taleo, Workday (Legacy), Personio, Lever, Greenhouse, SmartRecruiters, JobAdder, Workable, and others",{"type":17,"tag":84,"props":253531,"children":253532},{},[253533,253538],{"type":17,"tag":48,"props":253534,"children":253535},{},[253536],{"type":23,"value":253537},"HRIS:",{"type":17,"tag":80,"props":253539,"children":253540},{},[253541],{"type":17,"tag":84,"props":253542,"children":253543},{},[253544],{"type":23,"value":253545},"Added new objects for (corporate) Deductions and (employee) Benefits supported across major HRIS platforms (ADP, UKG Pro, Paylocity, Paychex, Workday (Legacy)).  More coming shortly.",{"type":17,"tag":84,"props":253547,"children":253548},{},[253549,253554],{"type":17,"tag":48,"props":253550,"children":253551},{},[253552],{"type":23,"value":253553},"Commerce/Finance:",{"type":17,"tag":80,"props":253555,"children":253556},{},[253557,253562],{"type":17,"tag":84,"props":253558,"children":253559},{},[253560],{"type":23,"value":253561},"Saleschannel object that supports Shopify, Walmart, Akeneo",{"type":17,"tag":84,"props":253563,"children":253564},{},[253565],{"type":23,"value":253566},"Expanded Stripe/Chargebee/Bill.com/Xero/Sage/QuickBooks coverage",{"type":17,"tag":84,"props":253568,"children":253569},{},[253570,253575],{"type":17,"tag":48,"props":253571,"children":253572},{},[253573],{"type":23,"value":253574},"Identity & Access:",{"type":17,"tag":80,"props":253576,"children":253577},{},[253578],{"type":17,"tag":84,"props":253579,"children":253580},{},[253581],{"type":23,"value":253582},"Virtual webhook expansions across Okta, Entra ID, JumpCloud, StrongDM",{"type":17,"tag":84,"props":253584,"children":253585},{},[253586,253591],{"type":17,"tag":48,"props":253587,"children":253588},{},[253589],{"type":23,"value":253590},"Tasks:",{"type":17,"tag":80,"props":253592,"children":253593},{},[253594],{"type":17,"tag":84,"props":253595,"children":253596},{},[253597],{"type":23,"value":253598},"Hierarchy fields added to Notion, Coda, ClickUp, Confluence; GitHub/GitLab/BitBucket webhook improvements",{"type":17,"tag":84,"props":253600,"children":253601},{},[253602,253607],{"type":17,"tag":48,"props":253603,"children":253604},{},[253605],{"type":23,"value":253606},"Calls & Meetings:",{"type":17,"tag":80,"props":253608,"children":253609},{},[253610,253615,253620],{"type":17,"tag":84,"props":253611,"children":253612},{},[253613],{"type":23,"value":253614},"Universal contact enrichment",{"type":17,"tag":84,"props":253616,"children":253617},{},[253618],{"type":23,"value":253619},"primary calendar support",{"type":17,"tag":84,"props":253621,"children":253622},{},[253623,253625,253629],{"type":23,"value":253624},"expanded ",{"type":17,"tag":133,"props":253626,"children":253627},{"href":9007},[253628],{"type":23,"value":46572},{"type":23,"value":253630}," across Gong, Zoom Phone, Dialpad, Cloudtalk.io, JustCall, GoTo, Fireflies, Fathom",{"type":17,"tag":29,"props":253632,"children":253633},{},[253634,253636,253645],{"type":23,"value":253635},"This represents ",{"type":17,"tag":133,"props":253637,"children":253639},{"href":47029,"rel":253638},[214],[253640],{"type":17,"tag":48,"props":253641,"children":253642},{},[253643],{"type":23,"value":253644},"944 enhancements shipped",{"type":23,"value":253646}," across the platform.",{"type":17,"tag":68,"props":253648,"children":253649},{"id":120936},[253650],{"type":23,"value":216865},{"type":17,"tag":80,"props":253652,"children":253653},{},[253654,253662,253672],{"type":17,"tag":84,"props":253655,"children":253656},{},[253657],{"type":17,"tag":133,"props":253658,"children":253660},{"href":163577,"rel":253659},[214],[253661],{"type":23,"value":163581},{"type":17,"tag":84,"props":253663,"children":253664},{},[253665],{"type":17,"tag":133,"props":253666,"children":253669},{"href":253667,"rel":253668},"https://unified.to/blog/notice_of_deprecation_of_fields_and_objects_nov_2025",[214],[253670],{"type":23,"value":253671},"Notice of Deprecation of Fields and Objects (Nov 2025)",{"type":17,"tag":84,"props":253673,"children":253674},{},[253675],{"type":17,"tag":133,"props":253676,"children":253679},{"href":253677,"rel":253678},"https://unified.to/blog/fireflies_integration_guide",[214],[253680],{"type":23,"value":253681},"Fireflies Integration Guide",{"type":17,"tag":29,"props":253683,"children":253684},{},[253685],{"type":23,"value":253686},"That's a wrap for November. From deeper integration coverage to tighter access controls and new developer tools, Unified continues to offer a secure, real-time foundation for teams building modern SaaS and AI products.",{"type":17,"tag":29,"props":253688,"children":253689},{},[253690],{"type":17,"tag":133,"props":253691,"children":253693},{"href":1612,"rel":253692},[214],[253694],{"type":17,"tag":48,"props":253695,"children":253696},{},[253697],{"type":23,"value":1616},{"type":17,"tag":29,"props":253699,"children":253700},{},[253701],{"type":17,"tag":133,"props":253702,"children":253704},{"href":1623,"rel":253703},[214],[253705],{"type":17,"tag":48,"props":253706,"children":253707},{},[253708],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":253710},[253711,253712,253713,253714],{"id":253140,"depth":1629,"text":253143},{"id":252880,"depth":1629,"text":252883},{"id":253385,"depth":1629,"text":253388},{"id":120936,"depth":1629,"text":216865},"content:blog:november_2025_product_updates.md","blog/november_2025_product_updates.md","blog/november_2025_product_updates",{"_path":253719,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":253720,"description":253721,"img":253722,"date":253723,"tag":12,"body":253724,"_type":1677,"_id":254101,"_source":1679,"_file":254102,"_stem":254103,"_extension":1682},"/blog/how_to_move_from_legacy_unified_apis_to_unified_without_rebuilding_your_integrations","How to Move from Legacy Unified APIs to Unified.to Without Rebuilding Your Integrations","Teams that adopted the first wave of unified APIs and iPaaS tools are now hitting real limits.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_move_from_legacy_unified_apis_to_unified_without_rebuilding_your_integrations-icon.png","2025-11-27T00:00:00.000Z",{"type":14,"children":253725,"toc":254096},[253726,253731,253734,253742,253746,253751,253756,253769,253775,253849,253854,253860,253865,253939,253951,253959,253964,254038,254051,254057,254062,254080,254085],{"type":17,"tag":18,"props":253727,"children":253729},{"id":253728},"how-to-move-from-legacy-unified-apis-to-unifiedto-without-rebuilding-your-integrations",[253730],{"type":23,"value":253720},{"type":17,"tag":25,"props":253732,"children":253733},{},[],{"type":17,"tag":29,"props":253735,"children":253736},{},[253737],{"type":17,"tag":33,"props":253738,"children":253739},{},[253740],{"type":23,"value":253741},"November 27, 2025",{"type":17,"tag":29,"props":253743,"children":253744},{},[253745],{"type":23,"value":253721},{"type":17,"tag":29,"props":253747,"children":253748},{},[253749],{"type":23,"value":253750},"They're trying to build real-time products and AI features on top of systems that were designed for batch syncs, store copies of customer data, and only support single-categories. Pricing is tied to individual integrations, expansion is painful, and every new use case means bolting on yet another data pipeline.",{"type":17,"tag":29,"props":253752,"children":253753},{},[253754],{"type":23,"value":253755},"Unified was built for the post-AI era—real-time, zero-storage, and multi-category from day one.",{"type":17,"tag":29,"props":253757,"children":253758},{},[253759,253761,253767],{"type":23,"value":253760},"We regularly hear from teams using ",{"type":17,"tag":133,"props":253762,"children":253764},{"href":78603,"rel":253763},[214],[253765],{"type":23,"value":253766},"first-generation unified APIs and iPaaS platforms",{"type":23,"value":253768}," who want to move, but don't want to rebuild their integration layer from scratch. We've already helped teams transition off older platforms; this guide distills the migration patterns that actually work.",{"type":17,"tag":68,"props":253770,"children":253772},{"id":253771},"why-teams-move",[253773],{"type":23,"value":253774},"Why Teams Move",{"type":17,"tag":80,"props":253776,"children":253777},{},[253778,253797,253810,253823,253836],{"type":17,"tag":84,"props":253779,"children":253780},{},[253781,253786,253789,253791,253795],{"type":17,"tag":48,"props":253782,"children":253783},{},[253784],{"type":23,"value":253785},"Stale data",{"type":17,"tag":3891,"props":253787,"children":253788},{},[],{"type":23,"value":253790},"Batch syncs and stored copies of data don't work well for event-driven apps, ",{"type":17,"tag":133,"props":253792,"children":253793},{"href":5201},[253794],{"type":23,"value":5204},{"type":23,"value":253796},", or copilots that need fresh information.",{"type":17,"tag":84,"props":253798,"children":253799},{},[253800,253805,253808],{"type":17,"tag":48,"props":253801,"children":253802},{},[253803],{"type":23,"value":253804},"Single-category limits",{"type":17,"tag":3891,"props":253806,"children":253807},{},[],{"type":23,"value":253809},"Tools optimized for one vertical (e.g. HR) don't scale when you also need accounting, KMS, messaging, tickets, and calendars in the same product.",{"type":17,"tag":84,"props":253811,"children":253812},{},[253813,253818,253821],{"type":17,"tag":48,"props":253814,"children":253815},{},[253816],{"type":23,"value":253817},"Pricing that doesn't scale with your product",{"type":17,"tag":3891,"props":253819,"children":253820},{},[],{"type":23,"value":253822},"As you add more integrations and categories, per-integration pricing drive costs up fast and make it harder to justify staying on the same platform.",{"type":17,"tag":84,"props":253824,"children":253825},{},[253826,253831,253834],{"type":17,"tag":48,"props":253827,"children":253828},{},[253829],{"type":23,"value":253830},"Security posture",{"type":17,"tag":3891,"props":253832,"children":253833},{},[],{"type":23,"value":253835},"When your integration vendor stores customer data, your SOC 2 scope expands with them—more controls, more evidence, and more scrutiny every time you add an integration. Teams move to a zero-storage model so the integration layer stays largely out of scope, and because there are now straightforward migration paths off first-generation platforms.",{"type":17,"tag":84,"props":253837,"children":253838},{},[253839,253844,253847],{"type":17,"tag":48,"props":253840,"children":253841},{},[253842],{"type":23,"value":253843},"Developer drag",{"type":17,"tag":3891,"props":253845,"children":253846},{},[],{"type":23,"value":253848},"Different auth flows, webhook semantics, and partially-normalized schemas create ongoing maintenance work that never really goes away.",{"type":17,"tag":29,"props":253850,"children":253851},{},[253852],{"type":23,"value":253853},"If two or more of these are true for you, a structured migration is usually worth a serious look.",{"type":17,"tag":68,"props":253855,"children":253857},{"id":253856},"migration-at-a-high-level",[253858],{"type":23,"value":253859},"Migration at a High Level",{"type":17,"tag":29,"props":253861,"children":253862},{},[253863],{"type":23,"value":253864},"At a high level, most teams follow the same pattern:",{"type":17,"tag":6154,"props":253866,"children":253867},{},[253868,253881,253894,253907,253920],{"type":17,"tag":84,"props":253869,"children":253870},{},[253871,253876,253879],{"type":17,"tag":48,"props":253872,"children":253873},{},[253874],{"type":23,"value":253875},"Pick the first flows to move",{"type":17,"tag":3891,"props":253877,"children":253878},{},[],{"type":23,"value":253880},"Start with one or two high-impact areas (e.g. accounting, ATS, or a RAG/KMS pipeline).",{"type":17,"tag":84,"props":253882,"children":253883},{},[253884,253889,253892],{"type":17,"tag":48,"props":253885,"children":253886},{},[253887],{"type":23,"value":253888},"Run Unified alongside your current provider",{"type":17,"tag":3891,"props":253890,"children":253891},{},[],{"type":23,"value":253893},"Set up a Unified workspace, connect a few test accounts, and validate payloads and events in staging.",{"type":17,"tag":84,"props":253895,"children":253896},{},[253897,253902,253905],{"type":17,"tag":48,"props":253898,"children":253899},{},[253900],{"type":23,"value":253901},"Send new customers through Unified",{"type":17,"tag":3891,"props":253903,"children":253904},{},[],{"type":23,"value":253906},"New connections are created via Unified from day one; existing customers stay on your legacy provider temporarily.",{"type":17,"tag":84,"props":253908,"children":253909},{},[253910,253915,253918],{"type":17,"tag":48,"props":253911,"children":253912},{},[253913],{"type":23,"value":253914},"Move existing customers in phases",{"type":17,"tag":3891,"props":253916,"children":253917},{},[],{"type":23,"value":253919},"Either re-authenticate them via Unified's auth flow, or import their existing credentials (see below), then route traffic through Unified.",{"type":17,"tag":84,"props":253921,"children":253922},{},[253923,253928,253931,253933,253937],{"type":17,"tag":48,"props":253924,"children":253925},{},[253926],{"type":23,"value":253927},"Decommission the old provider",{"type":17,"tag":3891,"props":253929,"children":253930},{},[],{"type":23,"value":253932},"Once you're confident in coverage and behavior, remove their auth UI, API keys, ",{"type":17,"tag":133,"props":253934,"children":253935},{"href":4999},[253936],{"type":23,"value":5002},{"type":23,"value":253938},", and jobs.",{"type":17,"tag":29,"props":253940,"children":253941},{},[253942,253944,253949],{"type":23,"value":253943},"If you already hold your customers' credentials and don't want to force a new auth flow, you can ",{"type":17,"tag":48,"props":253945,"children":253946},{},[253947],{"type":23,"value":253948},"import",{"type":23,"value":253950}," those integrations directly into Unified.",{"type":17,"tag":29,"props":253952,"children":253953},{},[253954],{"type":17,"tag":6438,"props":253955,"children":253958},{"alt":253956,"src":253957},"app.unified.to_connections_import_typedropbox.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_move_from_legacy_unified_apis_to_unified_without_rebuilding_your_integrations-0.png",[],{"type":17,"tag":29,"props":253960,"children":253961},{},[253962],{"type":23,"value":253963},"At a high level, that looks like:",{"type":17,"tag":80,"props":253965,"children":253966},{},[253967,253986,253999,254012,254025],{"type":17,"tag":84,"props":253968,"children":253969},{},[253970,253975,253978,253980,253984],{"type":17,"tag":48,"props":253971,"children":253972},{},[253973],{"type":23,"value":253974},"Identify auth type per integration",{"type":17,"tag":3891,"props":253976,"children":253977},{},[],{"type":23,"value":253979},"Make sure you have the right credentials on hand (tokens or ",{"type":17,"tag":133,"props":253981,"children":253982},{"href":779},[253983],{"type":23,"value":782},{"type":23,"value":253985}," access/refresh tokens) for each customer.",{"type":17,"tag":84,"props":253987,"children":253988},{},[253989,253994,253997],{"type":17,"tag":48,"props":253990,"children":253991},{},[253992],{"type":23,"value":253993},"Check what Unified expects for that integration",{"type":17,"tag":3891,"props":253995,"children":253996},{},[],{"type":23,"value":253998},"Use the Unified Core API to see which credential fields are required (e.g. token names, domains, client IDs, refresh tokens).",{"type":17,"tag":84,"props":254000,"children":254001},{},[254002,254007,254010],{"type":17,"tag":48,"props":254003,"children":254004},{},[254005],{"type":23,"value":254006},"Map your existing credentials into a Unified connection payload",{"type":17,"tag":3891,"props":254008,"children":254009},{},[],{"type":23,"value":254011},"For OAuth apps, you'll also point your redirect URI to Unified (details in the import guide).",{"type":17,"tag":84,"props":254013,"children":254014},{},[254015,254020,254023],{"type":17,"tag":48,"props":254016,"children":254017},{},[254018],{"type":23,"value":254019},"Create the connection via the Unified API",{"type":17,"tag":3891,"props":254021,"children":254022},{},[],{"type":23,"value":254024},"Call the Unified connection endpoint to create a new connection for each customer.",{"type":17,"tag":84,"props":254026,"children":254027},{},[254028,254033,254036],{"type":17,"tag":48,"props":254029,"children":254030},{},[254031],{"type":23,"value":254032},"Test and start using the new connection IDs",{"type":17,"tag":3891,"props":254034,"children":254035},{},[],{"type":23,"value":254037},"Make a test API call with each new connection ID, then update your app to use those IDs instead of your previous integration provider.",{"type":17,"tag":29,"props":254039,"children":254040},{},[254041,254043],{"type":23,"value":254042},"Full details, including payload shapes and code examples, are in our import guide: ",{"type":17,"tag":133,"props":254044,"children":254046},{"href":252659,"rel":254045},[214],[254047],{"type":17,"tag":48,"props":254048,"children":254049},{},[254050],{"type":23,"value":252663},{"type":17,"tag":68,"props":254052,"children":254054},{"id":254053},"next-step",[254055],{"type":23,"value":254056},"Next Step",{"type":17,"tag":29,"props":254058,"children":254059},{},[254060],{"type":23,"value":254061},"If you're evaluating a move:",{"type":17,"tag":80,"props":254063,"children":254064},{},[254065,254070,254075],{"type":17,"tag":84,"props":254066,"children":254067},{},[254068],{"type":23,"value":254069},"List the integrations and categories you rely on today.",{"type":17,"tag":84,"props":254071,"children":254072},{},[254073],{"type":23,"value":254074},"Identify the first one or two flows where real-time behavior or broader coverage would matter.",{"type":17,"tag":84,"props":254076,"children":254077},{},[254078],{"type":23,"value":254079},"Have your engineering lead review the technical sections of this guide and estimate effort for a hybrid rollout.",{"type":17,"tag":29,"props":254081,"children":254082},{},[254083],{"type":23,"value":254084},"From there, you can decide whether to keep your current stack, schedule a future migration, or start a pilot with Unified.",{"type":17,"tag":29,"props":254086,"children":254087},{},[254088],{"type":17,"tag":133,"props":254089,"children":254091},{"href":1623,"rel":254090},[214],[254092],{"type":17,"tag":48,"props":254093,"children":254094},{},[254095],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":254097},[254098,254099,254100],{"id":253771,"depth":1629,"text":253774},{"id":253856,"depth":1629,"text":253859},{"id":254053,"depth":1629,"text":254056},"content:blog:how_to_move_from_legacy_unified_apis_to_unified_without_rebuilding_your_integrations.md","blog/how_to_move_from_legacy_unified_apis_to_unified_without_rebuilding_your_integrations.md","blog/how_to_move_from_legacy_unified_apis_to_unified_without_rebuilding_your_integrations",{"_path":254105,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":254106,"description":254107,"img":254108,"date":254109,"tag":12,"body":254110,"_type":1677,"_id":254551,"_source":1679,"_file":254552,"_stem":254553,"_extension":1682},"/blog/how_to_push_qualified_leads_into_salesforce_hubspot_and_30_crms_with_a_unified_api","How to Push Qualified Leads into Salesforce, HubSpot, and 30+ CRMs with a Unified API","Lead generation tools need to connect with customers' CRMs to deliver qualified prospects directly into their pipeline. But every CRM—Salesforce, HubSpot,...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_push_qualified_leads_into_salesforce_hubspot_and_30_crms_with_a_unified_api-icon.png","2025-11-21T00:00:00.000Z",{"type":14,"children":254111,"toc":254544},[254112,254117,254120,254128,254133,254144,254150,254155,254210,254214,254318,254323,254329,254341,254353,254359,254463,254468,254474,254517,254522],{"type":17,"tag":18,"props":254113,"children":254115},{"id":254114},"how-to-push-qualified-leads-into-salesforce-hubspot-and-30-crms-with-a-unified-api",[254116],{"type":23,"value":254106},{"type":17,"tag":25,"props":254118,"children":254119},{},[],{"type":17,"tag":29,"props":254121,"children":254122},{},[254123],{"type":17,"tag":33,"props":254124,"children":254125},{},[254126],{"type":23,"value":254127},"November 21, 2025",{"type":17,"tag":29,"props":254129,"children":254130},{},[254131],{"type":23,"value":254132},"Lead generation tools need to connect with customers' CRMs to deliver qualified prospects directly into their pipeline. But every CRM—Salesforce, HubSpot, Pipedrive, Copper, and others—handles leads, contacts, and deals differently, forcing teams to maintain multiple connector implementations.",{"type":17,"tag":29,"props":254134,"children":254135},{},[254136,254138,254142],{"type":23,"value":254137},"Unified.to removes that complexity. With one ",{"type":17,"tag":133,"props":254139,"children":254140},{"href":7691},[254141],{"type":23,"value":7459},{"type":23,"value":254143},", your app can collect customer lead data, identify new prospects from your own dataset or workflow, and automatically create CRM records—leads, contacts, companies, and deals—without coding per vendor.",{"type":17,"tag":239,"props":254145,"children":254147},{"id":254146},"when-to-use-unified-for-lead-generation",[254148],{"type":23,"value":254149},"When to Use Unified for Lead Generation",{"type":17,"tag":29,"props":254151,"children":254152},{},[254153],{"type":23,"value":254154},"With a unified API, you can:",{"type":17,"tag":80,"props":254156,"children":254157},{},[254158,254168,254178,254195],{"type":17,"tag":84,"props":254159,"children":254160},{},[254161,254166],{"type":17,"tag":48,"props":254162,"children":254163},{},[254164],{"type":23,"value":254165},"Push qualified prospects",{"type":23,"value":254167}," into your customers' CRMs through a single integration.",{"type":17,"tag":84,"props":254169,"children":254170},{},[254171,254176],{"type":17,"tag":48,"props":254172,"children":254173},{},[254174],{"type":23,"value":254175},"Choose your CRM model",{"type":23,"value":254177},"—simple Lead objects or full Contact/Company/Deal structures.",{"type":17,"tag":84,"props":254179,"children":254180},{},[254181,254186,254188,254193],{"type":17,"tag":48,"props":254182,"children":254183},{},[254184],{"type":23,"value":254185},"Tag attribution",{"type":23,"value":254187}," by setting a ",{"type":17,"tag":6121,"props":254189,"children":254191},{"className":254190},[],[254192],{"type":23,"value":62564},{"type":23,"value":254194}," field on created records.",{"type":17,"tag":84,"props":254196,"children":254197},{},[254198,254203,254205,254209],{"type":17,"tag":48,"props":254199,"children":254200},{},[254201],{"type":23,"value":254202},"Track updates",{"type":23,"value":254204}," to leads and opportunities in real time via ",{"type":17,"tag":133,"props":254206,"children":254207},{"href":4999},[254208],{"type":23,"value":5002},{"type":23,"value":54},{"type":17,"tag":239,"props":254211,"children":254212},{"id":108404},[254213],{"type":23,"value":108407},{"type":17,"tag":7231,"props":254215,"children":254216},{},[254217,254235],{"type":17,"tag":7235,"props":254218,"children":254219},{},[254220],{"type":17,"tag":7239,"props":254221,"children":254222},{},[254223,254227,254231],{"type":17,"tag":7243,"props":254224,"children":254225},{},[254226],{"type":23,"value":18594},{"type":17,"tag":7243,"props":254228,"children":254229},{},[254230],{"type":23,"value":20787},{"type":17,"tag":7243,"props":254232,"children":254233},{},[254234],{"type":23,"value":6701},{"type":17,"tag":7259,"props":254236,"children":254237},{},[254238,254258,254278,254298],{"type":17,"tag":7239,"props":254239,"children":254240},{},[254241,254248,254253],{"type":17,"tag":7266,"props":254242,"children":254243},{},[254244],{"type":17,"tag":48,"props":254245,"children":254246},{},[254247],{"type":23,"value":62749},{"type":17,"tag":7266,"props":254249,"children":254250},{},[254251],{"type":23,"value":254252},"Single lead record for simpler funnels",{"type":17,"tag":7266,"props":254254,"children":254255},{},[254256],{"type":23,"value":254257},"Typical fields include identity/contact info, ownership, lifecycle/status; exact fields vary by CRM.",{"type":17,"tag":7239,"props":254259,"children":254260},{},[254261,254268,254273],{"type":17,"tag":7266,"props":254262,"children":254263},{},[254264],{"type":17,"tag":48,"props":254265,"children":254266},{},[254267],{"type":23,"value":25828},{"type":17,"tag":7266,"props":254269,"children":254270},{},[254271],{"type":23,"value":254272},"Person record used in Contact-Company-Deal (CCD) flows",{"type":17,"tag":7266,"props":254274,"children":254275},{},[254276],{"type":23,"value":254277},"Match/deduplicate by email or phone; supports ownership and lifecycle fields.",{"type":17,"tag":7239,"props":254279,"children":254280},{},[254281,254288,254293],{"type":17,"tag":7266,"props":254282,"children":254283},{},[254284],{"type":17,"tag":48,"props":254285,"children":254286},{},[254287],{"type":23,"value":25846},{"type":17,"tag":7266,"props":254289,"children":254290},{},[254291],{"type":23,"value":254292},"Organization or account associated to contact/deal",{"type":17,"tag":7266,"props":254294,"children":254295},{},[254296],{"type":23,"value":254297},"Match/deduplicate by domain or name; supports firmographic attributes.",{"type":17,"tag":7239,"props":254299,"children":254300},{},[254301,254308,254313],{"type":17,"tag":7266,"props":254302,"children":254303},{},[254304],{"type":17,"tag":48,"props":254305,"children":254306},{},[254307],{"type":23,"value":25810},{"type":17,"tag":7266,"props":254309,"children":254310},{},[254311],{"type":23,"value":254312},"Opportunity linked to contact and company",{"type":17,"tag":7266,"props":254314,"children":254315},{},[254316],{"type":23,"value":254317},"Includes pipeline/stage, amount, currency, close date, and owner.",{"type":17,"tag":29,"props":254319,"children":254320},{},[254321],{"type":23,"value":254322},"Unified's normalized CRM schema lets you build once and support dozens of systems, regardless of whether they use lead-based or CCD data models.",{"type":17,"tag":239,"props":254324,"children":254326},{"id":254325},"supported-crms",[254327],{"type":23,"value":254328},"Supported CRMs",{"type":17,"tag":29,"props":254330,"children":254331},{},[254332,254334,254339],{"type":23,"value":254333},"Unified.to supports ",{"type":17,"tag":48,"props":254335,"children":254336},{},[254337],{"type":23,"value":254338},"38+ CRM platforms",{"type":23,"value":254340}," with one API, including:",{"type":17,"tag":29,"props":254342,"children":254343},{},[254344,254346,254352],{"type":23,"value":254345},"Salesforce, HubSpot, Pipedrive, Copper, Close, Zoho CRM, Zendesk Sell, Insightly, Attio, and more. See the full list of ",{"type":17,"tag":133,"props":254347,"children":254349},{"href":76501,"rel":254348},[214],[254350],{"type":23,"value":254351},"supported CRM integrations",{"type":23,"value":54},{"type":17,"tag":239,"props":254354,"children":254356},{"id":254355},"data-flow-for-lead-generation",[254357],{"type":23,"value":254358},"Data Flow for Lead Generation",{"type":17,"tag":6154,"props":254360,"children":254361},{},[254362,254372,254382,254398,254426,254443,254453],{"type":17,"tag":84,"props":254363,"children":254364},{},[254365,254370],{"type":17,"tag":48,"props":254366,"children":254367},{},[254368],{"type":23,"value":254369},"Collect Criteria",{"type":23,"value":254371}," — Your app captures customer input (target industries, locations, or attributes).",{"type":17,"tag":84,"props":254373,"children":254374},{},[254375,254380],{"type":17,"tag":48,"props":254376,"children":254377},{},[254378],{"type":23,"value":254379},"Discover",{"type":23,"value":254381}," — Identify potential prospects from your dataset or external search tools.",{"type":17,"tag":84,"props":254383,"children":254384},{},[254385,254390,254392,254396],{"type":17,"tag":48,"props":254386,"children":254387},{},[254388],{"type":23,"value":254389},"Create (Path A)",{"type":23,"value":254391}," — Create a ",{"type":17,"tag":48,"props":254393,"children":254394},{},[254395],{"type":23,"value":62749},{"type":23,"value":254397}," record in the customer's CRM.",{"type":17,"tag":84,"props":254399,"children":254400},{},[254401,254406,254408,254412,254414,254418,254420,254424],{"type":17,"tag":48,"props":254402,"children":254403},{},[254404],{"type":23,"value":254405},"Create (Path B)",{"type":23,"value":254407}," — Upsert ",{"type":17,"tag":48,"props":254409,"children":254410},{},[254411],{"type":23,"value":25846},{"type":23,"value":254413}," (if needed) → upsert ",{"type":17,"tag":48,"props":254415,"children":254416},{},[254417],{"type":23,"value":25828},{"type":23,"value":254419}," → create ",{"type":17,"tag":48,"props":254421,"children":254422},{},[254423],{"type":23,"value":25810},{"type":23,"value":254425}," linked to both.",{"type":17,"tag":84,"props":254427,"children":254428},{},[254429,254434,254436,254441],{"type":17,"tag":48,"props":254430,"children":254431},{},[254432],{"type":23,"value":254433},"Attribute",{"type":23,"value":254435}," — Optionally set a ",{"type":17,"tag":6121,"props":254437,"children":254439},{"className":254438},[],[254440],{"type":23,"value":62564},{"type":23,"value":254442}," field to mark lead origin or campaign.",{"type":17,"tag":84,"props":254444,"children":254445},{},[254446,254451],{"type":17,"tag":48,"props":254447,"children":254448},{},[254449],{"type":23,"value":254450},"Deduplicate",{"type":23,"value":254452}," — Match records using email (contact) or domain (company), and rely on CRM-native deduplication where supported.",{"type":17,"tag":84,"props":254454,"children":254455},{},[254456,254461],{"type":17,"tag":48,"props":254457,"children":254458},{},[254459],{"type":23,"value":254460},"Monitor",{"type":23,"value":254462}," — Subscribe to Unified's CRM webhooks to track updates, enrich data, and move records through the sales funnel.",{"type":17,"tag":29,"props":254464,"children":254465},{},[254466],{"type":23,"value":254467},"Unified's real-time, zero-storage architecture ensures every record is written and retrieved live from the CRM—never cached or stale.",{"type":17,"tag":239,"props":254469,"children":254471},{"id":254470},"why-it-matters-for-product-growth-teams",[254472],{"type":23,"value":254473},"Why It Matters for Product & Growth Teams",{"type":17,"tag":80,"props":254475,"children":254476},{},[254477,254487,254497,254507],{"type":17,"tag":84,"props":254478,"children":254479},{},[254480,254485],{"type":17,"tag":48,"props":254481,"children":254482},{},[254483],{"type":23,"value":254484},"One integration, 38+ CRMs",{"type":23,"value":254486}," — eliminate per-vendor logic.",{"type":17,"tag":84,"props":254488,"children":254489},{},[254490,254495],{"type":17,"tag":48,"props":254491,"children":254492},{},[254493],{"type":23,"value":254494},"Normalized schema",{"type":23,"value":254496}," — consistent object models across CRM data types.",{"type":17,"tag":84,"props":254498,"children":254499},{},[254500,254505],{"type":17,"tag":48,"props":254501,"children":254502},{},[254503],{"type":23,"value":254504},"Real-time visibility",{"type":23,"value":254506}," — webhook updates keep pipelines current.",{"type":17,"tag":84,"props":254508,"children":254509},{},[254510,254515],{"type":17,"tag":48,"props":254511,"children":254512},{},[254513],{"type":23,"value":254514},"Flexible architecture",{"type":23,"value":254516}," — support simple Lead workflows or multi-object deal creation.",{"type":17,"tag":29,"props":254518,"children":254519},{},[254520],{"type":23,"value":254521},"Deliver qualified leads to any customer CRM instantly—without managing dozens of integrations.",{"type":17,"tag":29,"props":254523,"children":254524},{},[254525,254533,254534,254542],{"type":17,"tag":133,"props":254526,"children":254528},{"href":158861,"rel":254527},[214],[254529],{"type":17,"tag":48,"props":254530,"children":254531},{},[254532],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":254535,"children":254537},{"href":1623,"rel":254536},[214],[254538],{"type":17,"tag":48,"props":254539,"children":254540},{},[254541],{"type":23,"value":226481},{"type":23,"value":254543}," to see how Unified.to powers smarter lead workflows.",{"title":7,"searchDepth":1629,"depth":1629,"links":254545},[254546,254547,254548,254549,254550],{"id":254146,"depth":1635,"text":254149},{"id":108404,"depth":1635,"text":108407},{"id":254325,"depth":1635,"text":254328},{"id":254355,"depth":1635,"text":254358},{"id":254470,"depth":1635,"text":254473},"content:blog:how_to_push_qualified_leads_into_salesforce_hubspot_and_30_crms_with_a_unified_api.md","blog/how_to_push_qualified_leads_into_salesforce_hubspot_and_30_crms_with_a_unified_api.md","blog/how_to_push_qualified_leads_into_salesforce_hubspot_and_30_crms_with_a_unified_api",{"_path":254555,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":163581,"description":254556,"img":254557,"date":254558,"tag":6341,"body":254559,"_type":1677,"_id":255114,"_source":1679,"_file":255115,"_stem":255116,"_extension":1682},"/blog/how_to_build_enterprise_search_using_rag","In this article, we will be going into detail on how to build an enterprise search application as well as a Q&A bot using a RAG pipeline with Unified's data...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_enterprise_search_using_rag-icon.png","2025-11-19T00:00:00.000Z",{"type":14,"children":254560,"toc":255100},[254561,254566,254569,254577,254588,254599,254603,254632,254639,254667,254676,254685,254696,254705,254712,254721,254730,254741,254750,254759,254764,254773,254782,254787,254796,254805,254818,254824,254829,254892,254897,254902,254955,254960,254969,254978,254983,254995,255000,255005,255014,255023,255028,255033,255063,255068,255077,255086,255095],{"type":17,"tag":18,"props":254562,"children":254564},{"id":254563},"how-to-build-enterprise-search-using-rag",[254565],{"type":23,"value":163581},{"type":17,"tag":25,"props":254567,"children":254568},{},[],{"type":17,"tag":29,"props":254570,"children":254571},{},[254572],{"type":17,"tag":33,"props":254573,"children":254574},{},[254575],{"type":23,"value":254576},"November 19, 2025",{"type":17,"tag":29,"props":254578,"children":254579},{},[254580,254582,254586],{"type":23,"value":254581},"In this article, we will be going into detail on how to build an enterprise search application as well as a Q&A bot using a ",{"type":17,"tag":133,"props":254583,"children":254584},{"href":5201},[254585],{"type":23,"value":5204},{"type":23,"value":254587}," pipeline with Unified's data integrations and OpenAI embedding models.",{"type":17,"tag":29,"props":254589,"children":254590},{},[254591,254597],{"type":17,"tag":133,"props":254592,"children":254595},{"href":254593,"rel":254594},"https://developer.nvidia.com/blog/rag-101-demystifying-retrieval-augmented-generation-pipelines/",[214],[254596],{"type":23,"value":5204},{"type":23,"value":254598}," or Retrieval-Augmented-Generation is a powerful approach that can be leveraged to take a large amount of information and index it efficiently so that it can be searched quickly. This design pattern is very beneficial for enterprise search, Q&A bots, or any agent. A Q&A bot can be used to answer questions across a company's knowledge base, while an enterprise search application can be used to search corporate information from any internal data source.",{"type":17,"tag":11616,"props":254600,"children":254602},{"width":11618,"height":11619,"src":254601,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/yymVcO6T6Vs",[],{"type":17,"tag":29,"props":254604,"children":254605},{},[254606,254608,254613,254615,254621,254623,254630],{"type":23,"value":254607},"We will be using a few of Unified.to's integrations to access internal company knowledge in ",{"type":17,"tag":133,"props":254609,"children":254611},{"href":29953,"rel":254610},[214],[254612],{"type":23,"value":98},{"type":23,"value":254614}," (eg. Google Drive) and ",{"type":17,"tag":133,"props":254616,"children":254618},{"href":23930,"rel":254617},[214],[254619],{"type":23,"value":254620},"knowledge management systems",{"type":23,"value":254622}," (eg. Notion), embed their content using ",{"type":17,"tag":133,"props":254624,"children":254627},{"href":254625,"rel":254626},"https://unified.to/genai",[214],[254628],{"type":23,"value":254629},"OpenAI's models",{"type":23,"value":254631},", and then store them in a vector DB and used to answer questions.",{"type":17,"tag":68,"props":254633,"children":254634},{"id":141798},[254635],{"type":17,"tag":48,"props":254636,"children":254637},{},[254638],{"type":23,"value":141801},{"type":17,"tag":80,"props":254640,"children":254641},{},[254642,254647,254652,254657,254662],{"type":17,"tag":84,"props":254643,"children":254644},{},[254645],{"type":23,"value":254646},"Node.js 19+",{"type":17,"tag":84,"props":254648,"children":254649},{},[254650],{"type":23,"value":254651},"Unified account with integrations enabled for Google Drive and Notion",{"type":17,"tag":84,"props":254653,"children":254654},{},[254655],{"type":23,"value":254656},"Unified.to API key and GenAI Connection ID",{"type":17,"tag":84,"props":254658,"children":254659},{},[254660],{"type":23,"value":254661},"OpenAI API key (As we are using OpenAI for embedding)",{"type":17,"tag":84,"props":254663,"children":254664},{},[254665],{"type":23,"value":254666},"A vector DB (eg. Pinecone, or Chroma. For the demo we are using a in memory vector store)",{"type":17,"tag":68,"props":254668,"children":254670},{"id":254669},"step-1-setting-your-project-up",[254671],{"type":17,"tag":48,"props":254672,"children":254673},{},[254674],{"type":23,"value":254675},"Step 1: Setting your project up",{"type":17,"tag":6893,"props":254677,"children":254680},{"className":254678,"code":254679,"language":18718,"meta":7},[18716],"mkdir rag-bot\ncd rag-bot\nnpm init -y\nnpm install dotenv @unified-api/typescript-sdk\n",[254681],{"type":17,"tag":6121,"props":254682,"children":254683},{"__ignoreMap":7},[254684],{"type":23,"value":254679},{"type":17,"tag":29,"props":254686,"children":254687},{},[254688,254690,254695],{"type":23,"value":254689},"Add your credentials and keys to the ",{"type":17,"tag":6121,"props":254691,"children":254693},{"className":254692},[],[254694],{"type":23,"value":211221},{"type":23,"value":20456},{"type":17,"tag":6893,"props":254697,"children":254700},{"className":254698,"code":254699,"language":20901,"meta":23},[20899],"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_GOOGLEDRIVE=your_gdrive_connection_id\nCONNECTION_NOTION=your_notion_connection_id\nCONNECTION_GENAI=your_genai_connection_id\n",[254701],{"type":17,"tag":6121,"props":254702,"children":254703},{"__ignoreMap":7},[254704],{"type":23,"value":254699},{"type":17,"tag":68,"props":254706,"children":254707},{"id":211235},[254708],{"type":17,"tag":48,"props":254709,"children":254710},{},[254711],{"type":23,"value":211238},{"type":17,"tag":6893,"props":254713,"children":254716},{"className":254714,"code":254715,"language":18718,"meta":7},[18716],"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_GOOGLEDRIVE, CONNECTION_NOTION, CONNECTION_GENAI } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[254717],{"type":17,"tag":6121,"props":254718,"children":254719},{"__ignoreMap":7},[254720],{"type":23,"value":254715},{"type":17,"tag":68,"props":254722,"children":254724},{"id":254723},"step-3-fetch-all-the-files-from-google-drive",[254725],{"type":17,"tag":48,"props":254726,"children":254727},{},[254728],{"type":23,"value":254729},"Step 3: Fetch all the files from Google Drive",{"type":17,"tag":29,"props":254731,"children":254732},{},[254733,254735,254739],{"type":23,"value":254734},"We will now use Unified's ",{"type":17,"tag":133,"props":254736,"children":254737},{"href":28977},[254738],{"type":23,"value":28980},{"type":23,"value":254740}," to retrieve files from a Google Drive.",{"type":17,"tag":6893,"props":254742,"children":254745},{"className":254743,"code":254744,"language":18718,"meta":7},[18716],"async function getAllGoogleDriveFiles(connectionId: string) {\n  const files: any[] = [];\n    let offset = 0;\n    const limit = 100;\n    let hasMore = true;\n    while (hasMore) {\n          const response = await sdk.storage.listStorageFiles({\n            connectionId,\n            offset,\n            limit,\n          });\n            pages.push(...(response.files || []));\n          hasMore = (response.files?.length || 0) === limit;\n          offset += limit;\n        }\n\n      return files;\n    }\n\n    const file = await sdk.storage.getStorageFile({ connectionId, id: fileId });\n\n    const downloadUrl = file.download_url;\n\n    const content = await fetch(downloadUrl).then(res => res.text());\n\n    return content;\n}\n",[254746],{"type":17,"tag":6121,"props":254747,"children":254748},{"__ignoreMap":7},[254749],{"type":23,"value":254744},{"type":17,"tag":68,"props":254751,"children":254753},{"id":254752},"step-4-fetch-notion-pages",[254754],{"type":17,"tag":48,"props":254755,"children":254756},{},[254757],{"type":23,"value":254758},"Step 4: Fetch Notion Pages",{"type":17,"tag":29,"props":254760,"children":254761},{},[254762],{"type":23,"value":254763},"Now that we have the data from Google Drive, we will use Unified's connection to Notion to fetch data from Notion as well.",{"type":17,"tag":6893,"props":254765,"children":254768},{"className":254766,"code":254767,"language":18718,"meta":7},[18716],"async function getAllNotionPages(connectionId: string) {\n  const pages: any[] = [];\n    let offset = 0;\n    const limit = 100;\n    let hasMore = true;\n    while (hasMore) {\n      const response = await sdk.storage.listStorageFiles({\n        connectionId,\n        offset,\n        limit,\n      });\n      files.push(...(response.files || []));\n      hasMore = (response.files?.length || 0) === limit;\n      offset += limit;\n    }\n\n  return pages;\n}\n\nasync function getNotionPageContent(connectionId: string, pageId: string) {\n  const page = await sdk.kms.getKmsPage({\n    connectionId,\n    id: pageId,\n  });\n\n const content = await fetch(page.download_url).then(r => r.text());\n return content;\n}\n",[254769],{"type":17,"tag":6121,"props":254770,"children":254771},{"__ignoreMap":7},[254772],{"type":23,"value":254767},{"type":17,"tag":68,"props":254774,"children":254776},{"id":254775},"step-5-building-the-vector-db",[254777],{"type":17,"tag":48,"props":254778,"children":254779},{},[254780],{"type":23,"value":254781},"Step 5: Building the vector DB",{"type":17,"tag":29,"props":254783,"children":254784},{},[254785],{"type":23,"value":254786},"For the purpose of the demo, we will be creating a simple in memory vector store. But for production, you would use a cloud-based vector database like Pinecone, Chroma or Weaviate.",{"type":17,"tag":6893,"props":254788,"children":254791},{"className":254789,"code":254790,"language":18718,"meta":7},[18716],"type Document = { id: string; source: string; content: string; embedding?: number[] };\nconst vectorDB: Document[] = [];\n",[254792],{"type":17,"tag":6121,"props":254793,"children":254794},{"__ignoreMap":7},[254795],{"type":23,"value":254790},{"type":17,"tag":68,"props":254797,"children":254799},{"id":254798},"step-6-embedding-the-documents",[254800],{"type":17,"tag":48,"props":254801,"children":254802},{},[254803],{"type":23,"value":254804},"Step 6: Embedding the documents",{"type":17,"tag":29,"props":254806,"children":254807},{},[254808,254810,254816],{"type":23,"value":254809},"For the purpose of the example, we will be using OpenAI as the embedding provider in this step.  Unified has ",{"type":17,"tag":133,"props":254811,"children":254813},{"href":254625,"rel":254812},[214],[254814],{"type":23,"value":254815},"many integrations",{"type":23,"value":254817}," that support embedding, but you can also use a single provider's SDK.  Please remember to chunk the content properly and not embed the entire content at once.",{"type":17,"tag":239,"props":254819,"children":254821},{"id":254820},"chunking-strategies",[254822],{"type":23,"value":254823},"Chunking strategies:",{"type":17,"tag":29,"props":254825,"children":254826},{},[254827],{"type":23,"value":254828},"Chunking large documents effectively is super important to maintain context and relevance. Here are a few best practices for chunking:",{"type":17,"tag":6154,"props":254830,"children":254831},{},[254832,254842,254852,254862,254872,254882],{"type":17,"tag":84,"props":254833,"children":254834},{},[254835,254840],{"type":17,"tag":48,"props":254836,"children":254837},{},[254838],{"type":23,"value":254839},"Semantic Chunking",{"type":23,"value":254841},": Instead of splitting by fixed lengths, break the document into chunks based on natural language boundaries, like paragraphs or sections, ensuring each chunk is coherent and meaningful.",{"type":17,"tag":84,"props":254843,"children":254844},{},[254845,254850],{"type":17,"tag":48,"props":254846,"children":254847},{},[254848],{"type":23,"value":254849},"Overlap Between Chunks",{"type":23,"value":254851},": Include a slight overlap between adjacent chunks. This helps maintain continuity and context, especially for complex ideas that span multiple chunks.",{"type":17,"tag":84,"props":254853,"children":254854},{},[254855,254860],{"type":17,"tag":48,"props":254856,"children":254857},{},[254858],{"type":23,"value":254859},"Fixed-Length Chunking",{"type":23,"value":254861},": If you use fixed-length chunking, aim for a length that balances between too small (losing context) and too large (losing efficiency). Typically, a few hundred tokens per chunk works well.",{"type":17,"tag":84,"props":254863,"children":254864},{},[254865,254870],{"type":17,"tag":48,"props":254866,"children":254867},{},[254868],{"type":23,"value":254869},"Using Document Structure",{"type":23,"value":254871},": If your document has headings, subheadings, or other structural elements, use those to guide the chunking. This ensures that each chunk is logically complete.",{"type":17,"tag":84,"props":254873,"children":254874},{},[254875,254880],{"type":17,"tag":48,"props":254876,"children":254877},{},[254878],{"type":23,"value":254879},"Contextual Embeddings",{"type":23,"value":254881},": Sometimes, you can embed the entire document first and then create embeddings for chunks that are derived from the document's embedding, ensuring that each chunk stays contextually relevant.",{"type":17,"tag":84,"props":254883,"children":254884},{},[254885,254890],{"type":17,"tag":48,"props":254886,"children":254887},{},[254888],{"type":23,"value":254889},"Pre-processing and Cleaning",{"type":23,"value":254891},": Before chunking, clean up the text by removing unnecessary whitespace, special characters, or any irrelevant information to improve the quality of the embeddings.",{"type":17,"tag":29,"props":254893,"children":254894},{},[254895],{"type":23,"value":254896},"By following these strategies, you'll maintain the semantic integrity of the document and ensure that the vector database can retrieve meaningful context.",{"type":17,"tag":29,"props":254898,"children":254899},{},[254900],{"type":23,"value":254901},"There are several popular libraries that help with chunking and embedding in a streamlined way. A few notable ones include:",{"type":17,"tag":6154,"props":254903,"children":254904},{},[254905,254915,254925,254935,254945],{"type":17,"tag":84,"props":254906,"children":254907},{},[254908,254913],{"type":17,"tag":48,"props":254909,"children":254910},{},[254911],{"type":23,"value":254912},"LangChain",{"type":23,"value":254914},": This is a popular framework that integrates various language models and vector databases. It provides built-in utilities for chunking, embedding, and storing data in vector stores.",{"type":17,"tag":84,"props":254916,"children":254917},{},[254918,254923],{"type":17,"tag":48,"props":254919,"children":254920},{},[254921],{"type":23,"value":254922},"Haystack",{"type":23,"value":254924},": Developed by deepset, Haystack is another robust framework for building search pipelines. It supports intelligent chunking, document retrieval, and integration with vector databases like FAISS, Milvus, and Pinecone.",{"type":17,"tag":84,"props":254926,"children":254927},{},[254928,254933],{"type":17,"tag":48,"props":254929,"children":254930},{},[254931],{"type":23,"value":254932},"Transformers and Datasets from Hugging Face",{"type":23,"value":254934},": Hugging Face offers tools that can help with both embedding and chunking. You can use their Transformers library for embedding and their Datasets library to preprocess and chunk documents.",{"type":17,"tag":84,"props":254936,"children":254937},{},[254938,254943],{"type":17,"tag":48,"props":254939,"children":254940},{},[254941],{"type":23,"value":254942},"SentenceTransformers",{"type":23,"value":254944},": This library is great for generating embeddings and can be combined with custom chunking logic to break documents into meaningful pieces before embedding.",{"type":17,"tag":84,"props":254946,"children":254947},{},[254948,254953],{"type":17,"tag":48,"props":254949,"children":254950},{},[254951],{"type":23,"value":254952},"GPT-Index (formerly LlamaIndex)",{"type":23,"value":254954},": This library is designed to help build large language model applications and provides utilities for chunking, indexing, and querying documents effectively.",{"type":17,"tag":29,"props":254956,"children":254957},{},[254958],{"type":23,"value":254959},"These libraries often provide a lot of built-in functionality, making it easier to handle complex documents and ensure that your embeddings and vector storage are efficient and meaningful.",{"type":17,"tag":6893,"props":254961,"children":254964},{"className":254962,"code":254963,"language":18718,"meta":7},[18716],"import { Configuration, OpenAIApi } from \"openai\";\nconst openai = new OpenAIApi(new Configuration({ apiKey: process.env.OPENAI_API_KEY }));\n\nasync function embedText(text: string): Promise\u003Cnumber[]> {\n  const response = await openai.createEmbedding({\n    model: \"text-embedding-3-large\", //You can choose to use text-embedding-3-small too\n    input: text,\n  });\n  return response.data.data[0].embedding;\n}\n",[254965],{"type":17,"tag":6121,"props":254966,"children":254967},{"__ignoreMap":7},[254968],{"type":23,"value":254963},{"type":17,"tag":68,"props":254970,"children":254972},{"id":254971},"step-7-indexing-everything",[254973],{"type":17,"tag":48,"props":254974,"children":254975},{},[254976],{"type":23,"value":254977},"Step 7: Indexing Everything",{"type":17,"tag":29,"props":254979,"children":254980},{},[254981],{"type":23,"value":254982},"Now that we have all the data collected, it is time to index all of it!",{"type":17,"tag":29,"props":254984,"children":254985},{},[254986,254988,254993],{"type":23,"value":254987},"When you store vectors in a vector database like Pinecone or Weaviate, you can attach ",{"type":17,"tag":6121,"props":254989,"children":254991},{"className":254990},[],[254992],{"type":23,"value":23792},{"type":23,"value":254994}," to each vector. This metadata can include things like a unique ID, the original text, source information, or any other relevant attributes.",{"type":17,"tag":29,"props":254996,"children":254997},{},[254998],{"type":23,"value":254999},"When you perform a similarity search and get the top matching vectors, the database returns the metadata along with the vectors. That way, you can easily link back to the original content.",{"type":17,"tag":29,"props":255001,"children":255002},{},[255003],{"type":23,"value":255004},"For instance, when you index a piece of text, you'd store the vector along with metadata like a document ID, the title, or even the source URL. When you retrieve the nearest neighbors, the metadata is returned, and you can use it to identify or fetch the original content from your database or any external source.",{"type":17,"tag":6893,"props":255006,"children":255009},{"className":255007,"code":255008,"language":18718,"meta":7},[18716],"async function indexAllContent() {\n  // Google Drive\n  const gdriveFiles = await getAllGoogleDriveFiles(CONNECTION_GOOGLEDRIVE!);\n  for (const file of gdriveFiles) {\n    const content = await getFileContent(CONNECTION_GOOGLEDRIVE!, file.id);\n    const embedding = await embedText(content);\n    vectorDB.push({\n            id: file.id,\n            source: \"gdrive\",\n            content,\n            embedding,\n            filename: file.name,\n            date_created: file.created_at,\n            owner_id: file.user_id, \n        });\n    }\n\n  // Notion\n  const notionPages = await getAllNotionPages(CONNECTION_NOTION!);\n  for (const page of notionPages) {\n    const content = await getNotionPageContent(CONNECTION_NOTION!, page.id);\n    const embedding = await embedText(content);\n    vectorDB.push({ id: page.id, source: \"notion\", content, embedding });\n  }\n}\n",[255010],{"type":17,"tag":6121,"props":255011,"children":255012},{"__ignoreMap":7},[255013],{"type":23,"value":255008},{"type":17,"tag":68,"props":255015,"children":255017},{"id":255016},"step-8-finding-answers",[255018],{"type":17,"tag":48,"props":255019,"children":255020},{},[255021],{"type":23,"value":255022},"Step 8: Finding Answers",{"type":17,"tag":29,"props":255024,"children":255025},{},[255026],{"type":23,"value":255027},"Now that we have the data ready, it is time to implement the Bot or enterprise search that will use this data to answer questions from a user.",{"type":17,"tag":29,"props":255029,"children":255030},{},[255031],{"type":23,"value":255032},"The basic flow would be:",{"type":17,"tag":6154,"props":255034,"children":255035},{},[255036,255041,255046,255058],{"type":17,"tag":84,"props":255037,"children":255038},{},[255039],{"type":23,"value":255040},"Embed the question asked",{"type":17,"tag":84,"props":255042,"children":255043},{},[255044],{"type":23,"value":255045},"Find similar docs in the Vector DB",{"type":17,"tag":84,"props":255047,"children":255048},{},[255049,255051,255056],{"type":23,"value":255050},"Send the top ",{"type":17,"tag":6121,"props":255052,"children":255054},{"className":255053},[],[255055],{"type":23,"value":230000},{"type":23,"value":255057}," amount of docs as context paired with the question to Unified's GenAI endpoint.",{"type":17,"tag":84,"props":255059,"children":255060},{},[255061],{"type":23,"value":255062},"Return the answer to the user.",{"type":17,"tag":29,"props":255064,"children":255065},{},[255066],{"type":23,"value":255067},"For the purpose of the example, we will be sending the top 3 most similar docs.",{"type":17,"tag":6893,"props":255069,"children":255072},{"className":255070,"code":255071,"language":18718,"meta":7},[18716],"function cosineSimilarity(a: number[], b: number[]) {\n  const dot = a.reduce((sum, ai, i) => sum + ai * b[i], 0);\n  const normA = Math.sqrt(a.reduce((sum, ai) => sum + ai * ai, 0));\n  const normB = Math.sqrt(b.reduce((sum, bi) => sum + bi * bi, 0));\n  return dot / (normA * normB);\n}\n\nasync function answerQuestion(question: string) {\n  const questionEmbedding = await embedText(question);\n\n  // For the purpose of the example we will be sending the top 3 docs\n  const scored = vectorDB.map(doc => ({\n    ...doc,\n    score: cosineSimilarity(questionEmbedding, doc.embedding!)\n  }));\n  const topDocs = scored.sort((a, b) => b.score - a.score).slice(0, 3);\n\n  const context = topDocs.map(doc => doc.content).join('\\n---\\n');\n \n  const prompt = `\nYou are a helpful company knowledge bot. Use the following context to answer the question.\n\nContext:\n${context}Question:\n${question}Answer in a concise and accurate way.\n  `;\n\n  const result = await sdk.genai.createGenaiPrompt({\n    connectionId: CONNECTION_GENAI!,\n    prompt: {\n      messages: [{ role: \"USER\", content: prompt }],\n      maxTokens: 256,\n      temperature: 0.2\n    }\n  });\n\n  return result.choices?.[0]?.message?.content || \"No answer generated.\";\n}\n",[255073],{"type":17,"tag":6121,"props":255074,"children":255075},{"__ignoreMap":7},[255076],{"type":23,"value":255071},{"type":17,"tag":68,"props":255078,"children":255080},{"id":255079},"step-9-usage",[255081],{"type":17,"tag":48,"props":255082,"children":255083},{},[255084],{"type":23,"value":255085},"Step 9: Usage",{"type":17,"tag":6893,"props":255087,"children":255090},{"className":255088,"code":255089,"language":18718,"meta":7},[18716],"(async () => {\n  await indexAllContent();\n  const answer = await answerQuestion(\"How do I request vacation days?\");\n  console.log(\"Bot answer:\", answer);\n})();\n",[255091],{"type":17,"tag":6121,"props":255092,"children":255093},{"__ignoreMap":7},[255094],{"type":23,"value":255089},{"type":17,"tag":29,"props":255096,"children":255097},{},[255098],{"type":23,"value":255099},"At Unified, most of our customers are using this simple RAG Pipeline flow to add AI-powered intelligence to their application.  It can be used across industries and verticals as Unified supports 21 B2B SaaS categories and more than 350 integrations to retrieve end-customer data from.",{"title":7,"searchDepth":1629,"depth":1629,"links":255101},[255102,255103,255104,255105,255106,255107,255108,255111,255112,255113],{"id":141798,"depth":1629,"text":141801},{"id":254669,"depth":1629,"text":254675},{"id":211235,"depth":1629,"text":211238},{"id":254723,"depth":1629,"text":254729},{"id":254752,"depth":1629,"text":254758},{"id":254775,"depth":1629,"text":254781},{"id":254798,"depth":1629,"text":254804,"children":255109},[255110],{"id":254820,"depth":1635,"text":254823},{"id":254971,"depth":1629,"text":254977},{"id":255016,"depth":1629,"text":255022},{"id":255079,"depth":1629,"text":255085},"content:blog:how_to_build_enterprise_search_using_rag.md","blog/how_to_build_enterprise_search_using_rag.md","blog/how_to_build_enterprise_search_using_rag",{"_path":255118,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":255119,"description":255120,"img":255121,"date":254558,"tag":12,"body":255122,"_type":1677,"_id":255397,"_source":1679,"_file":255398,"_stem":255399,"_extension":1682},"/blog/strengthening_our_security_posture_with_environment_restricted_api_keys","Strengthening Our Security Posture with Environment-Restricted API Keys","We're introducing API Keys with Environment Restrictions, a direct extension of our least-privilege approach to integrations.","https://s3.us-east-2.amazonaws.com/unified-article-images/strengthening_our_security_posture_with_environment_restricted_api_keys-icon.png",{"type":14,"children":255123,"toc":255392},[255124,255129,255132,255139,255147,255159,255164,255169,255175,255180,255217,255222,255227,255257,255262,255268,255273,255284,255289,255300,255305,255316,255321,255331,255336,255347,255352,255363,255368,255379],{"type":17,"tag":18,"props":255125,"children":255127},{"id":255126},"strengthening-our-security-posture-with-environment-restricted-api-keys",[255128],{"type":23,"value":255119},{"type":17,"tag":25,"props":255130,"children":255131},{},[],{"type":17,"tag":29,"props":255133,"children":255134},{},[255135],{"type":17,"tag":33,"props":255136,"children":255137},{},[255138],{"type":23,"value":254576},{"type":17,"tag":29,"props":255140,"children":255141},{},[255142],{"type":17,"tag":6438,"props":255143,"children":255146},{"alt":255144,"src":255145},"security.png","https://s3.us-east-2.amazonaws.com/unified-article-images/strengthening_our_security_posture_with_environment_restricted_api_keys-0.png",[],{"type":17,"tag":29,"props":255148,"children":255149},{},[255150,255152,255157],{"type":23,"value":255151},"We're introducing ",{"type":17,"tag":48,"props":255153,"children":255154},{},[255155],{"type":23,"value":255156},"API Keys with Environment Restrictions",{"type":23,"value":255158},", a direct extension of our least-privilege approach to integrations.",{"type":17,"tag":29,"props":255160,"children":255161},{},[255162],{"type":23,"value":255163},"This strengthens our position as the most security-forward platform by giving teams clearer control over how developers access production, staging, and sandbox environments.",{"type":17,"tag":29,"props":255165,"children":255166},{},[255167],{"type":23,"value":255168},"This feature came from customer feedback, including teams that needed a simple way to separate production access from non-production access for their developers without creating multiple workspaces or managing keys manually.",{"type":17,"tag":68,"props":255170,"children":255172},{"id":255171},"why-we-built-this",[255173],{"type":23,"value":255174},"Why we built this",{"type":17,"tag":29,"props":255176,"children":255177},{},[255178],{"type":23,"value":255179},"Customers told us:",{"type":17,"tag":80,"props":255181,"children":255182},{},[255183,255195,255207,255212],{"type":17,"tag":84,"props":255184,"children":255185},{},[255186,255188,255193],{"type":23,"value":255187},"They wanted a clean way to give certain developers access only to ",{"type":17,"tag":48,"props":255189,"children":255190},{},[255191],{"type":23,"value":255192},"non-production",{"type":23,"value":255194}," environments.",{"type":17,"tag":84,"props":255196,"children":255197},{},[255198,255200,255205],{"type":23,"value":255199},"They needed ",{"type":17,"tag":48,"props":255201,"children":255202},{},[255203],{"type":23,"value":255204},"tighter control over production access",{"type":23,"value":255206}," for compliance and internal review.",{"type":17,"tag":84,"props":255208,"children":255209},{},[255210],{"type":23,"value":255211},"They didn't want to maintain multiple workspaces just to separate environments.",{"type":17,"tag":84,"props":255213,"children":255214},{},[255215],{"type":23,"value":255216},"They wanted a straightforward way to prevent accidental data access in their customer's connections on their production environment.",{"type":17,"tag":29,"props":255218,"children":255219},{},[255220],{"type":23,"value":255221},"Environment-restricted keys solve that without changing the existing setup.",{"type":17,"tag":68,"props":255223,"children":255224},{"id":243917},[255225],{"type":23,"value":255226},"How it works",{"type":17,"tag":80,"props":255228,"children":255229},{},[255230,255242,255247,255252],{"type":17,"tag":84,"props":255231,"children":255232},{},[255233,255235,255240],{"type":23,"value":255234},"You can optionally ",{"type":17,"tag":48,"props":255236,"children":255237},{},[255238],{"type":23,"value":255239},"assign an API key to a specific environment",{"type":23,"value":255241}," (production, staging, or sandbox, or any custom environment) when assigning a key to a specific developer.",{"type":17,"tag":84,"props":255243,"children":255244},{},[255245],{"type":23,"value":255246},"Keys only operate within the environment they're scoped to.",{"type":17,"tag":84,"props":255248,"children":255249},{},[255250],{"type":23,"value":255251},"Existing keys remain unchanged unless you choose to apply restrictions.",{"type":17,"tag":84,"props":255253,"children":255254},{},[255255],{"type":23,"value":255256},"This reduces accidental access, limits blast radius, and aligns Unified access with your internal environment structure.",{"type":17,"tag":29,"props":255258,"children":255259},{},[255260],{"type":23,"value":255261},"This is an optional feature — you can enable it when you need it.",{"type":17,"tag":68,"props":255263,"children":255265},{"id":255264},"our-broader-security-posture",[255266],{"type":23,"value":255267},"Our broader security posture",{"type":17,"tag":29,"props":255269,"children":255270},{},[255271],{"type":23,"value":255272},"Environment-restricted keys build on the controls we already provide across our platform. Unified is designed to safeguard customer data by default:",{"type":17,"tag":6154,"props":255274,"children":255275},{},[255276],{"type":17,"tag":84,"props":255277,"children":255278},{},[255279],{"type":17,"tag":48,"props":255280,"children":255281},{},[255282],{"type":23,"value":255283},"Zero data stored at rest",{"type":17,"tag":29,"props":255285,"children":255286},{},[255287],{"type":23,"value":255288},"Unified operates on a passthrough, no-storage architecture. Data is fetched live, transformed, and delivered in real time. Nothing persists on our servers, and detailed logs are not stored.",{"type":17,"tag":6154,"props":255290,"children":255291},{},[255292],{"type":17,"tag":84,"props":255293,"children":255294},{},[255295],{"type":17,"tag":48,"props":255296,"children":255297},{},[255298],{"type":23,"value":255299},"Independent compliance",{"type":17,"tag":29,"props":255301,"children":255302},{},[255303],{"type":23,"value":255304},"We are SOC 2 Type II certified and compliant with GDPR, CCPA/CPRA, PIPEDA, and HIPAA. The absence of stored customer data reduces audit scope and removes PII persistence risk.",{"type":17,"tag":6154,"props":255306,"children":255307},{},[255308],{"type":17,"tag":84,"props":255309,"children":255310},{},[255311],{"type":17,"tag":48,"props":255312,"children":255313},{},[255314],{"type":23,"value":255315},"Encryption and secrets management",{"type":17,"tag":29,"props":255317,"children":255318},{},[255319],{"type":23,"value":255320},"All data in transit uses TLS 1.2+. Minimal operational metadata is encrypted at rest with AES-256. OAuth2 credentials and API tokens can be stored in your own AWS Secrets Manager.",{"type":17,"tag":6154,"props":255322,"children":255323},{},[255324],{"type":17,"tag":84,"props":255325,"children":255326},{},[255327],{"type":17,"tag":48,"props":255328,"children":255329},{},[255330],{"type":23,"value":189598},{"type":17,"tag":29,"props":255332,"children":255333},{},[255334],{"type":23,"value":255335},"Dashboard access can be enforced through SAML-based SSO with your IdP's MFA and conditional-access policies. Role-based permissions and IP allowlisting give teams further control.",{"type":17,"tag":6154,"props":255337,"children":255338},{},[255339],{"type":17,"tag":84,"props":255340,"children":255341},{},[255342],{"type":17,"tag":48,"props":255343,"children":255344},{},[255345],{"type":23,"value":255346},"Application security",{"type":17,"tag":29,"props":255348,"children":255349},{},[255350],{"type":23,"value":255351},"Unified undergoes annual third-party penetration testing. Containers and infrastructure are continuously scanned, every build goes through SAST, and runtime is covered by DAST.",{"type":17,"tag":6154,"props":255353,"children":255354},{},[255355],{"type":17,"tag":84,"props":255356,"children":255357},{},[255358],{"type":17,"tag":48,"props":255359,"children":255360},{},[255361],{"type":23,"value":255362},"Segregated data regions",{"type":17,"tag":29,"props":255364,"children":255365},{},[255366],{"type":23,"value":255367},"Customers can select US, EU, or APAC regions. Multi-region isolation ensures credentials and operational metadata stay within the region selected.",{"type":17,"tag":29,"props":255369,"children":255370},{},[255371,255373,255378],{"type":23,"value":255372},"You can review all details or request reports through our ",{"type":17,"tag":133,"props":255374,"children":255376},{"href":252637,"rel":255375},[214],[255377],{"type":23,"value":252641},{"type":23,"value":54},{"type":17,"tag":29,"props":255380,"children":255381},{},[255382,255384,255390],{"type":23,"value":255383},"Environment-restricted keys extend this foundation, giving teams another layer of control without adding setup overhead. If you need guidance on how to roll this out across your team, ",{"type":17,"tag":133,"props":255385,"children":255387},{"href":215330,"rel":255386},[214],[255388],{"type":23,"value":255389},"reach out",{"type":23,"value":255391}," — we'll walk you through it.",{"title":7,"searchDepth":1629,"depth":1629,"links":255393},[255394,255395,255396],{"id":255171,"depth":1629,"text":255174},{"id":243917,"depth":1629,"text":255226},{"id":255264,"depth":1629,"text":255267},"content:blog:strengthening_our_security_posture_with_environment_restricted_api_keys.md","blog/strengthening_our_security_posture_with_environment_restricted_api_keys.md","blog/strengthening_our_security_posture_with_environment_restricted_api_keys",{"_path":255401,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":255402,"description":255403,"img":6339,"date":255404,"tag":6341,"body":255405,"_type":1677,"_id":255769,"_source":1679,"_file":255770,"_stem":255771,"_extension":1682},"/blog/how_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials","How to Register a Workday Developer App and Get OAUTH2/ SOAP Credentials","2. Register API Client, Navigate to the \"Register API Client\" section","2025-11-10T19:03:00.000Z",{"type":14,"children":255406,"toc":255760},[255407,255412,255415,255423,255434,255439,255457,255462,255473,255479,255540,255545,255552,255557,255566,255584,255596,255605,255611,255654,255660,255703,255709],{"type":17,"tag":18,"props":255408,"children":255410},{"id":255409},"how-to-register-a-workday-developer-app-and-get-oauth2-soap-credentials",[255411],{"type":23,"value":255402},{"type":17,"tag":25,"props":255413,"children":255414},{},[],{"type":17,"tag":29,"props":255416,"children":255417},{},[255418],{"type":17,"tag":33,"props":255419,"children":255420},{},[255421],{"type":23,"value":255422},"November 10, 2025",{"type":17,"tag":18,"props":255424,"children":255426},{"id":255425},"how-to-register-and-get-oauth2-credentials-for-workday",[255427,255429],{"type":23,"value":255428},"How to Register and Get OAUTH2 ",{"type":17,"tag":48,"props":255430,"children":255431},{},[255432],{"type":23,"value":255433},"Credentials for Workday:",{"type":17,"tag":29,"props":255435,"children":255436},{},[255437],{"type":23,"value":255438},"You will need 3 endpoints (URLs):",{"type":17,"tag":80,"props":255440,"children":255441},{},[255442,255447,255452],{"type":17,"tag":84,"props":255443,"children":255444},{},[255445],{"type":23,"value":255446},"REST API Endpoint",{"type":17,"tag":84,"props":255448,"children":255449},{},[255450],{"type":23,"value":255451},"Token Endpoint",{"type":17,"tag":84,"props":255453,"children":255454},{},[255455],{"type":23,"value":255456},"Authorization Endpoint",{"type":17,"tag":29,"props":255458,"children":255459},{},[255460],{"type":23,"value":255461},"You will also need:",{"type":17,"tag":80,"props":255463,"children":255464},{},[255465,255469],{"type":17,"tag":84,"props":255466,"children":255467},{},[255468],{"type":23,"value":6040},{"type":17,"tag":84,"props":255470,"children":255471},{},[255472],{"type":23,"value":6045},{"type":17,"tag":239,"props":255474,"children":255476},{"id":255475},"how-to-setup-client-id",[255477],{"type":23,"value":255478},"How to setup Client ID",{"type":17,"tag":6154,"props":255480,"children":255481},{},[255482,255490,255495,255500,255504,255509,255514,255525,255530,255535],{"type":17,"tag":84,"props":255483,"children":255484},{},[255485],{"type":17,"tag":48,"props":255486,"children":255487},{},[255488],{"type":23,"value":255489},"Log in to the Workday application",{"type":17,"tag":84,"props":255491,"children":255492},{},[255493],{"type":23,"value":255494},"Register API Client: Navigate to the \"Register API Client\" section",{"type":17,"tag":84,"props":255496,"children":255497},{},[255498],{"type":23,"value":255499},"Select the Register API Client form",{"type":17,"tag":84,"props":255501,"children":255502},{},[255503],{"type":23,"value":255499},{"type":17,"tag":84,"props":255505,"children":255506},{},[255507],{"type":23,"value":255508},"For the grant type, select \"Authorization Code Grant'",{"type":17,"tag":84,"props":255510,"children":255511},{},[255512],{"type":23,"value":255513},"For the access token type, select \"Bearer'",{"type":17,"tag":84,"props":255515,"children":255516},{},[255517,255519,255524],{"type":23,"value":255518},"In the Redirection URI field, enter \"",{"type":17,"tag":133,"props":255520,"children":255522},{"href":42417,"rel":255521},[214],[255523],{"type":23,"value":42417},{"type":23,"value":251512},{"type":17,"tag":84,"props":255526,"children":255527},{},[255528],{"type":23,"value":255529},"In the Scope section, add Staffing and/or Recruiting, depending on your application's needs",{"type":17,"tag":84,"props":255531,"children":255532},{},[255533],{"type":23,"value":255534},"Select \"Non-expiring Refresh Tokens'",{"type":17,"tag":84,"props":255536,"children":255537},{},[255538],{"type":23,"value":255539},"Select the Include Workday Owned Scope checkbox.",{"type":17,"tag":29,"props":255541,"children":255542},{},[255543],{"type":23,"value":255544},"Click OK to save the app.",{"type":17,"tag":29,"props":255546,"children":255547},{},[255548],{"type":17,"tag":6438,"props":255549,"children":255551},{"alt":6440,"src":255550},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials-0.png",[],{"type":17,"tag":29,"props":255553,"children":255554},{},[255555],{"type":23,"value":255556},"Once you create your application, Workday will display the information that you entered plus additional information.",{"type":17,"tag":239,"props":255558,"children":255560},{"id":255559},"retrieve-endpoints",[255561],{"type":17,"tag":48,"props":255562,"children":255563},{},[255564],{"type":23,"value":255565},"Retrieve Endpoints",{"type":17,"tag":6154,"props":255567,"children":255568},{},[255569,255574,255579],{"type":17,"tag":84,"props":255570,"children":255571},{},[255572],{"type":23,"value":255573},"Access \"View API Clients\"",{"type":17,"tag":84,"props":255575,"children":255576},{},[255577],{"type":23,"value":255578},"Use the Workday search bar to navigate to \"View API clients\"",{"type":17,"tag":84,"props":255580,"children":255581},{},[255582],{"type":23,"value":255583},"Retrieve REST API Endpoint, Token Endpoint, Authorization Endpoint",{"type":17,"tag":18,"props":255585,"children":255587},{"id":255586},"how-to-register-and-get-oauth2-credentials-for-workday-legacy",[255588,255589,255594],{"type":23,"value":255428},{"type":17,"tag":48,"props":255590,"children":255591},{},[255592],{"type":23,"value":255593},"Credentials for Workday Legacy",{"type":23,"value":255595},":-",{"type":17,"tag":68,"props":255597,"children":255599},{"id":255598},"integration-system-userisu",[255600],{"type":17,"tag":48,"props":255601,"children":255602},{},[255603],{"type":23,"value":255604},"Integration System User(ISU)",{"type":17,"tag":239,"props":255606,"children":255608},{"id":255607},"create-user",[255609],{"type":23,"value":255610},"Create User",{"type":17,"tag":6154,"props":255612,"children":255613},{},[255614,255619,255624,255629,255634,255639,255644,255649],{"type":17,"tag":84,"props":255615,"children":255616},{},[255617],{"type":23,"value":255618},"Log in to the Workday tenant",{"type":17,"tag":84,"props":255620,"children":255621},{},[255622],{"type":23,"value":255623},"search 'Create Integration System User'.",{"type":17,"tag":84,"props":255625,"children":255626},{},[255627],{"type":23,"value":255628},"Goto 'Create Integration System User'",{"type":17,"tag":84,"props":255630,"children":255631},{},[255632],{"type":23,"value":255633},"In the \"Create Integration System User\" page, go to the \"Account Information\" section.",{"type":17,"tag":84,"props":255635,"children":255636},{},[255637],{"type":23,"value":255638},"Provide Username & Password",{"type":17,"tag":84,"props":255640,"children":255641},{},[255642],{"type":23,"value":255643},"Require New Password  should remain unchecked",{"type":17,"tag":84,"props":255645,"children":255646},{},[255647],{"type":23,"value":255648},"Type 0 (zero) for Session Timeout Minutes to prevent session expiration",{"type":17,"tag":84,"props":255650,"children":255651},{},[255652],{"type":23,"value":255653},"Click \"OK\" to save.",{"type":17,"tag":239,"props":255655,"children":255657},{"id":255656},"provide-permissions-to-isu",[255658],{"type":23,"value":255659},"Provide permissions to ISU",{"type":17,"tag":6154,"props":255661,"children":255662},{},[255663,255668,255673,255678,255683,255688,255693,255698],{"type":17,"tag":84,"props":255664,"children":255665},{},[255666],{"type":23,"value":255667},"Search field, type \"Create Security Group'",{"type":17,"tag":84,"props":255669,"children":255670},{},[255671],{"type":23,"value":255672},"Select \"Integration System Security Group\" from the \"Type of Tenanted Security Group\" drop-down menu.",{"type":17,"tag":84,"props":255674,"children":255675},{},[255676],{"type":23,"value":255677},"In the \"Name\" field, enter a name for the security group.",{"type":17,"tag":84,"props":255679,"children":255680},{},[255681],{"type":23,"value":255682},"Integration System Security Group on Workday select 'Maintain Permissions for Security Group''",{"type":17,"tag":84,"props":255684,"children":255685},{},[255686],{"type":23,"value":255687},"Configure the Permissions and select \"Maintain' Operation",{"type":17,"tag":84,"props":255689,"children":255690},{},[255691],{"type":23,"value":255692},"\"Source Security Group\" name matches your created security group.",{"type":17,"tag":84,"props":255694,"children":255695},{},[255696],{"type":23,"value":255697},"Now add Domain Security Policy Permissions",{"type":17,"tag":84,"props":255699,"children":255700},{},[255701],{"type":23,"value":255702},"Search 'Activate Pending Security Policy Changes'",{"type":17,"tag":239,"props":255704,"children":255706},{"id":255705},"wsdl-url",[255707],{"type":23,"value":255708},"WSDL URL",{"type":17,"tag":6154,"props":255710,"children":255711},{},[255712,255717,255727,255732,255737,255742],{"type":17,"tag":84,"props":255713,"children":255714},{},[255715],{"type":23,"value":255716},"Go to Workday, search 'Public Web Services'.",{"type":17,"tag":84,"props":255718,"children":255719},{},[255720,255721,255726],{"type":23,"value":6629},{"type":17,"tag":48,"props":255722,"children":255723},{},[255724],{"type":23,"value":255725},"\"Public Web Services Report",{"type":23,"value":251519},{"type":17,"tag":84,"props":255728,"children":255729},{},[255730],{"type":23,"value":255731},"Hover over the \"Human Resources\" section.",{"type":17,"tag":84,"props":255733,"children":255734},{},[255735],{"type":23,"value":255736},"Click the three dots to open the menu.",{"type":17,"tag":84,"props":255738,"children":255739},{},[255740],{"type":23,"value":255741},"Select \"Web Services\" and then click \"View WSDL'",{"type":17,"tag":84,"props":255743,"children":255744},{},[255745,255747,255756],{"type":23,"value":255746},"Goto bottom of the page and get host URL. That looks like following:- ",{"type":17,"tag":133,"props":255748,"children":255751},{"href":255749,"rel":255750},"https://wd5-services1.myworkday.com/ccx",[214],[255752],{"type":17,"tag":48,"props":255753,"children":255754},{},[255755],{"type":23,"value":255749},{"type":17,"tag":48,"props":255757,"children":255758},{},[255759],{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":255761},[255762,255763,255764],{"id":255475,"depth":1635,"text":255478},{"id":255559,"depth":1635,"text":255565},{"id":255598,"depth":1629,"text":255604,"children":255765},[255766,255767,255768],{"id":255607,"depth":1635,"text":255610},{"id":255656,"depth":1635,"text":255659},{"id":255705,"depth":1635,"text":255708},"content:blog:how_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials.md","blog/how_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials.md","blog/how_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials",{"_path":255773,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":255774,"description":255775,"img":255776,"date":255777,"tag":12,"body":255778,"_type":1677,"_id":256532,"_source":1679,"_file":256533,"_stem":256534,"_extension":1682},"/blog/build_vs_buy_for_saas_integrations_why_a_unified_api_costs_less_to_maintain_than_building_in_house","Build vs. Buy for SaaS Integrations: Why a Unified API Costs Less to Maintain than Building In-House","Integrations aren't optional anymore. SaaS customers expect your product to connect instantly to their existing stack—CRMs, HR tools, accounting systems, cloud...","https://s3.us-east-2.amazonaws.com/unified-article-images/build_vs_buy_for_saas_integrations_why_a_unified_api_costs_less_to_maintain_than_building_in_house-icon.png","2025-11-10T00:00:00.000Z",{"type":14,"children":255779,"toc":256516},[255780,255785,255788,255795,255800,255805,255816,255821,255827,255832,255837,255870,255881,255887,255893,255900,255918,255925,255954,255959,255965,255976,255983,256006,256013,256038,256043,256049,256163,256169,256174,256226,256238,256244,256255,256263,256311,256319,256330,256335,256341,256347,256365,256371,256389,256394,256400,256408,256432,256440,256458,256464,256469,256479,256489,256494,256499,256507],{"type":17,"tag":18,"props":255781,"children":255783},{"id":255782},"build-vs-buy-for-saas-integrations-why-a-unified-api-costs-less-to-maintain-than-building-in-house",[255784],{"type":23,"value":255774},{"type":17,"tag":25,"props":255786,"children":255787},{},[],{"type":17,"tag":29,"props":255789,"children":255790},{},[255791],{"type":17,"tag":33,"props":255792,"children":255793},{},[255794],{"type":23,"value":255422},{"type":17,"tag":29,"props":255796,"children":255797},{},[255798],{"type":23,"value":255799},"Integrations aren't optional anymore. SaaS customers expect your product to connect instantly to their existing stack—CRMs, HR tools, accounting systems, cloud storage, and chat apps.",{"type":17,"tag":29,"props":255801,"children":255802},{},[255803],{"type":23,"value":255804},"Those integrations aren't just features—they're table stakes for winning and keeping customers.",{"type":17,"tag":29,"props":255806,"children":255807},{},[255808,255810,255814],{"type":23,"value":255809},"The only real question is how you deliver that experience: do you build integrations in-house, or do you buy through a ",{"type":17,"tag":133,"props":255811,"children":255812},{"href":7691},[255813],{"type":23,"value":7459},{"type":23,"value":255815}," platform that gives you instant coverage and real-time data?",{"type":17,"tag":29,"props":255817,"children":255818},{},[255819],{"type":23,"value":255820},"This post breaks down both models—the trade-offs, costs, and long-term impact—and shows where Unified fits for SaaS teams that need speed, scale, and zero-maintenance infrastructure.",{"type":17,"tag":68,"props":255822,"children":255824},{"id":255823},"why-this-decision-matters-more-in-2025",[255825],{"type":23,"value":255826},"Why this decision matters more in 2025",{"type":17,"tag":29,"props":255828,"children":255829},{},[255830],{"type":23,"value":255831},"Across the SaaS market, companies are using hundreds of integrations to drive adoption and retention.",{"type":17,"tag":29,"props":255833,"children":255834},{},[255835],{"type":23,"value":255836},"Integrations now directly impact:",{"type":17,"tag":80,"props":255838,"children":255839},{},[255840,255850,255860],{"type":17,"tag":84,"props":255841,"children":255842},{},[255843,255848],{"type":17,"tag":48,"props":255844,"children":255845},{},[255846],{"type":23,"value":255847},"Close rate",{"type":23,"value":255849}," — Buyers choose platforms that 'just work' with their existing stack.",{"type":17,"tag":84,"props":255851,"children":255852},{},[255853,255858],{"type":17,"tag":48,"props":255854,"children":255855},{},[255856],{"type":23,"value":255857},"Retention",{"type":23,"value":255859}," — Users rarely churn from software tightly embedded into their daily tools.",{"type":17,"tag":84,"props":255861,"children":255862},{},[255863,255868],{"type":17,"tag":48,"props":255864,"children":255865},{},[255866],{"type":23,"value":255867},"Expansion",{"type":23,"value":255869}," — Cross-product insights and automations depend on clean, normalized data flows.",{"type":17,"tag":29,"props":255871,"children":255872},{},[255873,255875,255880],{"type":23,"value":255874},"That's why integration strategy has shifted from a technical task to a ",{"type":17,"tag":48,"props":255876,"children":255877},{},[255878],{"type":23,"value":255879},"core GTM enabler",{"type":23,"value":54},{"type":17,"tag":68,"props":255882,"children":255884},{"id":255883},"build-in-house-vs-buy-unified-api",[255885],{"type":23,"value":255886},"Build In-House vs. Buy Unified API",{"type":17,"tag":239,"props":255888,"children":255890},{"id":255889},"option-a-build-in-house",[255891],{"type":23,"value":255892},"Option A: Build In-House",{"type":17,"tag":29,"props":255894,"children":255895},{},[255896],{"type":17,"tag":48,"props":255897,"children":255898},{},[255899],{"type":23,"value":68924},{"type":17,"tag":80,"props":255901,"children":255902},{},[255903,255908,255913],{"type":17,"tag":84,"props":255904,"children":255905},{},[255906],{"type":23,"value":255907},"Complete control over logic, UX, and roadmap.",{"type":17,"tag":84,"props":255909,"children":255910},{},[255911],{"type":23,"value":255912},"Tailored for unique or regulated workflows.",{"type":17,"tag":84,"props":255914,"children":255915},{},[255916],{"type":23,"value":255917},"No third-party dependency or external SLAs.",{"type":17,"tag":29,"props":255919,"children":255920},{},[255921],{"type":17,"tag":48,"props":255922,"children":255923},{},[255924],{"type":23,"value":68950},{"type":17,"tag":80,"props":255926,"children":255927},{},[255928,255933,255938,255949],{"type":17,"tag":84,"props":255929,"children":255930},{},[255931],{"type":23,"value":255932},"High up-front cost: dedicated developers, infrastructure, monitoring.",{"type":17,"tag":84,"props":255934,"children":255935},{},[255936],{"type":23,"value":255937},"Long time-to-market: 6–12 weeks per integration on average.",{"type":17,"tag":84,"props":255939,"children":255940},{},[255941,255943,255947],{"type":23,"value":255942},"Never-ending maintenance: APIs change, tokens expire, ",{"type":17,"tag":133,"props":255944,"children":255945},{"href":135},[255946],{"type":23,"value":138},{"type":23,"value":255948}," shift.",{"type":17,"tag":84,"props":255950,"children":255951},{},[255952],{"type":23,"value":255953},"Difficult to scale beyond a handful of connectors.",{"type":17,"tag":29,"props":255955,"children":255956},{},[255957],{"type":23,"value":255958},"Building in-house makes sense for teams whose core differentiation is integration itself or who operate in highly regulated domains where third-party dependencies aren't an option. For everyone else, the cost curve steepens fast.",{"type":17,"tag":239,"props":255960,"children":255962},{"id":255961},"option-b-unified-api-provider",[255963],{"type":23,"value":255964},"Option B: Unified API Provider",{"type":17,"tag":29,"props":255966,"children":255967},{},[255968,255969,255974],{"type":23,"value":9619},{"type":17,"tag":48,"props":255970,"children":255971},{},[255972],{"type":23,"value":255973},"modern unified API",{"type":23,"value":255975}," gives developers a single, normalized interface across dozens of third-party platforms in a category—CRM, HR, Accounting, and more. You build once and access many systems, all through real-time, passthrough requests rather than stored or cached data.",{"type":17,"tag":29,"props":255977,"children":255978},{},[255979],{"type":17,"tag":48,"props":255980,"children":255981},{},[255982],{"type":23,"value":68924},{"type":17,"tag":80,"props":255984,"children":255985},{},[255986,255991,255996,256001],{"type":17,"tag":84,"props":255987,"children":255988},{},[255989],{"type":23,"value":255990},"One integration unlocks hundreds of connectors.",{"type":17,"tag":84,"props":255992,"children":255993},{},[255994],{"type":23,"value":255995},"Faster go-live, typically days not months.",{"type":17,"tag":84,"props":255997,"children":255998},{},[255999],{"type":23,"value":256000},"Reduces backend maintenance and schema management.",{"type":17,"tag":84,"props":256002,"children":256003},{},[256004],{"type":23,"value":256005},"Keeps engineers focused on core product value.",{"type":17,"tag":29,"props":256007,"children":256008},{},[256009],{"type":17,"tag":48,"props":256010,"children":256011},{},[256012],{"type":23,"value":68950},{"type":17,"tag":80,"props":256014,"children":256015},{},[256016,256028,256033],{"type":17,"tag":84,"props":256017,"children":256018},{},[256019,256021,256026],{"type":23,"value":256020},"Some providers rely on ",{"type":17,"tag":48,"props":256022,"children":256023},{},[256024],{"type":23,"value":256025},"cached or batch-synced data",{"type":23,"value":256027},", which breaks real-time use cases.",{"type":17,"tag":84,"props":256029,"children":256030},{},[256031],{"type":23,"value":256032},"Coverage gaps and shallow schemas in early-generation unified APIs.",{"type":17,"tag":84,"props":256034,"children":256035},{},[256036],{"type":23,"value":256037},"Usage-based costs grow with scale.",{"type":17,"tag":29,"props":256039,"children":256040},{},[256041],{"type":23,"value":256042},"Unified APIs are ideal for developer-first teams that still want flexibility but need predictable scaling and a standardized data model.",{"type":17,"tag":68,"props":256044,"children":256046},{"id":256045},"cost-comparison",[256047],{"type":23,"value":256048},"Cost comparison",{"type":17,"tag":7231,"props":256050,"children":256051},{},[256052,256072],{"type":17,"tag":7235,"props":256053,"children":256054},{},[256055],{"type":17,"tag":7239,"props":256056,"children":256057},{},[256058,256063,256067],{"type":17,"tag":7243,"props":256059,"children":256060},{},[256061],{"type":23,"value":256062},"Factor",{"type":17,"tag":7243,"props":256064,"children":256065},{},[256066],{"type":23,"value":80568},{"type":17,"tag":7243,"props":256068,"children":256069},{},[256070],{"type":23,"value":256071},"Unified API (Unified.to)",{"type":17,"tag":7259,"props":256073,"children":256074},{},[256075,256093,256110,256128,256146],{"type":17,"tag":7239,"props":256076,"children":256077},{},[256078,256083,256088],{"type":17,"tag":7266,"props":256079,"children":256080},{},[256081],{"type":23,"value":256082},"Annual cost (20 integrations)",{"type":17,"tag":7266,"props":256084,"children":256085},{},[256086],{"type":23,"value":256087},"$1–2M (fully loaded engineering cost)",{"type":17,"tag":7266,"props":256089,"children":256090},{},[256091],{"type":23,"value":256092},"$9K–$36K (Grow or Scale plan)",{"type":17,"tag":7239,"props":256094,"children":256095},{},[256096,256100,256105],{"type":17,"tag":7266,"props":256097,"children":256098},{},[256099],{"type":23,"value":31417},{"type":17,"tag":7266,"props":256101,"children":256102},{},[256103],{"type":23,"value":256104},"15–25% of build cost per year",{"type":17,"tag":7266,"props":256106,"children":256107},{},[256108],{"type":23,"value":256109},"Included",{"type":17,"tag":7239,"props":256111,"children":256112},{},[256113,256118,256123],{"type":17,"tag":7266,"props":256114,"children":256115},{},[256116],{"type":23,"value":256117},"Time to launch 10 integrations",{"type":17,"tag":7266,"props":256119,"children":256120},{},[256121],{"type":23,"value":256122},"6–9 months (spec → production)",{"type":17,"tag":7266,"props":256124,"children":256125},{},[256126],{"type":23,"value":256127},"2–4 weeks",{"type":17,"tag":7239,"props":256129,"children":256130},{},[256131,256136,256141],{"type":17,"tag":7266,"props":256132,"children":256133},{},[256134],{"type":23,"value":256135},"Engineering headcount",{"type":17,"tag":7266,"props":256137,"children":256138},{},[256139],{"type":23,"value":256140},"2–4+ FTEs dedicated",{"type":17,"tag":7266,"props":256142,"children":256143},{},[256144],{"type":23,"value":256145},"1 FTE",{"type":17,"tag":7239,"props":256147,"children":256148},{},[256149,256153,256158],{"type":17,"tag":7266,"props":256150,"children":256151},{},[256152],{"type":23,"value":7359},{"type":17,"tag":7266,"props":256154,"children":256155},{},[256156],{"type":23,"value":256157},"Polling and ETL-style syncs",{"type":17,"tag":7266,"props":256159,"children":256160},{},[256161],{"type":23,"value":256162},"Real-time pass-through with native + virtual webhooks",{"type":17,"tag":68,"props":256164,"children":256166},{"id":256165},"what-build-really-costs-beyond-payroll",[256167],{"type":23,"value":256168},"What 'build' really costs beyond payroll",{"type":17,"tag":29,"props":256170,"children":256171},{},[256172],{"type":23,"value":256173},"Developer salaries are just the surface. The deeper costs compound through maintenance, reliability, and lost velocity.",{"type":17,"tag":80,"props":256175,"children":256176},{},[256177,256187,256196,256206,256216],{"type":17,"tag":84,"props":256178,"children":256179},{},[256180,256185],{"type":17,"tag":48,"props":256181,"children":256182},{},[256183],{"type":23,"value":256184},"Auth logic per vendor",{"type":23,"value":256186},": OAuth2 scopes, token refresh, expiry monitoring.",{"type":17,"tag":84,"props":256188,"children":256189},{},[256190,256194],{"type":17,"tag":48,"props":256191,"children":256192},{},[256193],{"type":23,"value":91735},{"type":23,"value":256195},": mapping, migration scripts, testing, re-deploys.",{"type":17,"tag":84,"props":256197,"children":256198},{},[256199,256204],{"type":17,"tag":48,"props":256200,"children":256201},{},[256202],{"type":23,"value":256203},"Monitoring and on-call",{"type":23,"value":256205},": failed syncs, API rate limits, retries.",{"type":17,"tag":84,"props":256207,"children":256208},{},[256209,256214],{"type":17,"tag":48,"props":256210,"children":256211},{},[256212],{"type":23,"value":256213},"Compliance",{"type":23,"value":256215},": data stored at rest increases audit and liability scope.",{"type":17,"tag":84,"props":256217,"children":256218},{},[256219,256224],{"type":17,"tag":48,"props":256220,"children":256221},{},[256222],{"type":23,"value":256223},"Opportunity cost",{"type":23,"value":256225},": features and performance work delayed while maintaining connectors.",{"type":17,"tag":29,"props":256227,"children":256228},{},[256229,256231,256236],{"type":23,"value":256230},"Over time, every new integration adds ",{"type":17,"tag":48,"props":256232,"children":256233},{},[256234],{"type":23,"value":256235},"compound maintenance debt",{"type":23,"value":256237},"—even small breakages multiply across customers, environments, and versions.",{"type":17,"tag":68,"props":256239,"children":256241},{"id":256240},"where-unified-changes-the-equation",[256242],{"type":23,"value":256243},"Where Unified changes the equation",{"type":17,"tag":29,"props":256245,"children":256246},{},[256247,256248,256253],{"type":23,"value":217034},{"type":17,"tag":48,"props":256249,"children":256250},{},[256251],{"type":23,"value":256252},"real-time unified API",{"type":23,"value":256254}," built on a pass-through, zero-storage architecture. Every request fetches live data directly from the source—no caches, no replication, no stale syncs.",{"type":17,"tag":29,"props":256256,"children":256257},{},[256258],{"type":17,"tag":48,"props":256259,"children":256260},{},[256261],{"type":23,"value":256262},"Why that matters:",{"type":17,"tag":80,"props":256264,"children":256265},{},[256266,256281,256291,256301],{"type":17,"tag":84,"props":256267,"children":256268},{},[256269,256273,256275,256279],{"type":17,"tag":48,"props":256270,"children":256271},{},[256272],{"type":23,"value":218167},{"type":23,"value":256274}," — AI copilots, ",{"type":17,"tag":133,"props":256276,"children":256277},{"href":5201},[256278],{"type":23,"value":5204},{"type":23,"value":256280},", and analytics features depend on live data, not hourly syncs.",{"type":17,"tag":84,"props":256282,"children":256283},{},[256284,256289],{"type":17,"tag":48,"props":256285,"children":256286},{},[256287],{"type":23,"value":256288},"Zero-storage security",{"type":23,"value":256290}," — nothing stored at rest, no customer PII on vendor servers.",{"type":17,"tag":84,"props":256292,"children":256293},{},[256294,256299],{"type":17,"tag":48,"props":256295,"children":256296},{},[256297],{"type":23,"value":256298},"Consistent schemas",{"type":23,"value":256300}," — unified models across categories, with custom fields available through the Metadata API.",{"type":17,"tag":84,"props":256302,"children":256303},{},[256304,256309],{"type":17,"tag":48,"props":256305,"children":256306},{},[256307],{"type":23,"value":256308},"Predictable scaling",{"type":23,"value":256310}," — usage-based pricing that tracks real demand, not seats or connections.",{"type":17,"tag":29,"props":256312,"children":256313},{},[256314,256318],{"type":17,"tag":48,"props":256315,"children":256316},{},[256317],{"type":23,"value":7377},{"type":23,"value":20456},{"type":17,"tag":29,"props":256320,"children":256321},{},[256322,256324,256329],{"type":23,"value":256323},"A SaaS product with 100 customers and one connection each (1 list + 10 CRUD calls per day) makes ~34K calls/month — $750/month on the Grow plan, or $7.50 per customer. That's about ",{"type":17,"tag":48,"props":256325,"children":256326},{},[256327],{"type":23,"value":256328},"11× more cost-efficient than adding a backend engineer",{"type":23,"value":54},{"type":17,"tag":29,"props":256331,"children":256332},{},[256333],{"type":23,"value":256334},"In other words, one engineer-month covers a full year of Unified. If your team spends even a few weeks fixing integrations, it's already breakeven.",{"type":17,"tag":68,"props":256336,"children":256338},{"id":256337},"the-long-term-scalability-lens",[256339],{"type":23,"value":256340},"The long-term scalability lens",{"type":17,"tag":239,"props":256342,"children":256344},{"id":256343},"if-you-build",[256345],{"type":23,"value":256346},"If you build:",{"type":17,"tag":80,"props":256348,"children":256349},{},[256350,256355,256360],{"type":17,"tag":84,"props":256351,"children":256352},{},[256353],{"type":23,"value":256354},"Each new integration extends your maintenance horizon by years.",{"type":17,"tag":84,"props":256356,"children":256357},{},[256358],{"type":23,"value":256359},"Your roadmap starts revolving around vendor updates instead of core innovation.",{"type":17,"tag":84,"props":256361,"children":256362},{},[256363],{"type":23,"value":256364},"Engineers spend time fixing rate limits and expired tokens instead of building features.",{"type":17,"tag":239,"props":256366,"children":256368},{"id":256367},"if-you-buy",[256369],{"type":23,"value":256370},"If you buy:",{"type":17,"tag":80,"props":256372,"children":256373},{},[256374,256379,256384],{"type":17,"tag":84,"props":256375,"children":256376},{},[256377],{"type":23,"value":256378},"Integration maintenance becomes infrastructure, not headcount.",{"type":17,"tag":84,"props":256380,"children":256381},{},[256382],{"type":23,"value":256383},"Scaling from 5 to 50 integrations costs time in configuration, not code.",{"type":17,"tag":84,"props":256385,"children":256386},{},[256387],{"type":23,"value":256388},"Your team stays focused on what differentiates your product.",{"type":17,"tag":29,"props":256390,"children":256391},{},[256392],{"type":23,"value":256393},"The real divide isn't cost—it's focus. Building means managing APIs forever. Buying means your integrations become part of your infrastructure.",{"type":17,"tag":68,"props":256395,"children":256397},{"id":256396},"decision-framework",[256398],{"type":23,"value":256399},"Decision framework",{"type":17,"tag":29,"props":256401,"children":256402},{},[256403],{"type":17,"tag":48,"props":256404,"children":256405},{},[256406],{"type":23,"value":256407},"Build if:",{"type":17,"tag":80,"props":256409,"children":256410},{},[256411,256422,256427],{"type":17,"tag":84,"props":256412,"children":256413},{},[256414,256416,256420],{"type":23,"value":256415},"Your product ",{"type":17,"tag":33,"props":256417,"children":256418},{},[256419],{"type":23,"value":231352},{"type":23,"value":256421}," the integration layer (e.g., workflow automation platforms).",{"type":17,"tag":84,"props":256423,"children":256424},{},[256425],{"type":23,"value":256426},"You need deep proprietary logic across a small number of systems.",{"type":17,"tag":84,"props":256428,"children":256429},{},[256430],{"type":23,"value":256431},"You can afford a dedicated integrations engineering team.",{"type":17,"tag":29,"props":256433,"children":256434},{},[256435],{"type":17,"tag":48,"props":256436,"children":256437},{},[256438],{"type":23,"value":256439},"Buy with Unified if:",{"type":17,"tag":80,"props":256441,"children":256442},{},[256443,256448,256453],{"type":17,"tag":84,"props":256444,"children":256445},{},[256446],{"type":23,"value":256447},"You want to ship fast and scale coverage.",{"type":17,"tag":84,"props":256449,"children":256450},{},[256451],{"type":23,"value":256452},"You need real-time data for AI or analytics.",{"type":17,"tag":84,"props":256454,"children":256455},{},[256456],{"type":23,"value":256457},"You value zero-storage security and predictable usage economics.",{"type":17,"tag":68,"props":256459,"children":256461},{"id":256460},"conclusion",[256462],{"type":23,"value":256463},"Conclusion",{"type":17,"tag":29,"props":256465,"children":256466},{},[256467],{"type":23,"value":256468},"Building integrations once signaled technical strength.",{"type":17,"tag":29,"props":256470,"children":256471},{},[256472,256474],{"type":23,"value":256473},"Today, it's ",{"type":17,"tag":48,"props":256475,"children":256476},{},[256477],{"type":23,"value":256478},"technical debt disguised as control.",{"type":17,"tag":29,"props":256480,"children":256481},{},[256482,256484],{"type":23,"value":256483},"Unified gives you both: ",{"type":17,"tag":48,"props":256485,"children":256486},{},[256487],{"type":23,"value":256488},"developer-level control and zero maintenance overhead.",{"type":17,"tag":29,"props":256490,"children":256491},{},[256492],{"type":23,"value":256493},"Connect once, access 350+ systems in real time, and never manage polling, tokens, or schema drift again.",{"type":17,"tag":29,"props":256495,"children":256496},{},[256497],{"type":23,"value":256498},"Faster time-to-market. Lower total cost. No stored data.",{"type":17,"tag":29,"props":256500,"children":256501},{},[256502],{"type":17,"tag":48,"props":256503,"children":256504},{},[256505],{"type":23,"value":256506},"Unified isn't another vendor—it's your integration infrastructure.",{"type":17,"tag":29,"props":256508,"children":256509},{},[256510],{"type":17,"tag":133,"props":256511,"children":256513},{"href":212,"rel":256512},[214],[256514],{"type":23,"value":256515},"Start your 30-day free trial →",{"title":7,"searchDepth":1629,"depth":1629,"links":256517},[256518,256519,256523,256524,256525,256526,256530,256531],{"id":255823,"depth":1629,"text":255826},{"id":255883,"depth":1629,"text":255886,"children":256520},[256521,256522],{"id":255889,"depth":1635,"text":255892},{"id":255961,"depth":1635,"text":255964},{"id":256045,"depth":1629,"text":256048},{"id":256165,"depth":1629,"text":256168},{"id":256240,"depth":1629,"text":256243},{"id":256337,"depth":1629,"text":256340,"children":256527},[256528,256529],{"id":256343,"depth":1635,"text":256346},{"id":256367,"depth":1635,"text":256370},{"id":256396,"depth":1629,"text":256399},{"id":256460,"depth":1629,"text":256463},"content:blog:build_vs_buy_for_saas_integrations_why_a_unified_api_costs_less_to_maintain_than_building_in_house.md","blog/build_vs_buy_for_saas_integrations_why_a_unified_api_costs_less_to_maintain_than_building_in_house.md","blog/build_vs_buy_for_saas_integrations_why_a_unified_api_costs_less_to_maintain_than_building_in_house",{"_path":256536,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":253671,"description":256537,"img":256538,"date":255777,"tag":6341,"body":256539,"_type":1677,"_id":262286,"_source":1679,"_file":262287,"_stem":262288,"_extension":1682},"/blog/notice_of_deprecation_of_fields_and_objects_nov_2025","At Unified, we have always built our unified data-models with a lot of thoughtful attention to detail, so that they never have to be 'versioned' due to...","https://s3.us-east-2.amazonaws.com/unified-article-images/notice_of_deprecation_of_fields_and_objects_nov_2025-icon.png",{"type":14,"children":256540,"toc":262193},[256541,256546,256549,256556,256562,256567,256572,256577,256582,256593,256604,256607,256613,256676,256679,256684,256702,256717,256725,256830,256838,256847,256855,256864,256872,256921,256928,256937,256940,256956,256969,256976,257063,257070,257079,257086,257095,257102,257165,257172,257181,257184,257189,257206,257222,257237,257244,257278,257285,257294,257301,257310,257317,257356,257363,257372,257375,257392,257400,257419,257426,257435,257442,257450,257457,257496,257503,257512,257515,257532,257539,257551,257558,257567,257574,257583,257590,257629,257636,257645,257648,257665,257672,257684,257691,257700,257707,257716,257723,257762,257769,257778,257781,257786,257803,257811,257818,257836,257843,257852,257859,257868,257875,257939,257946,257955,257958,257976,257983,257994,258001,258010,258017,258025,258032,258076,258083,258092,258095,258111,258118,258135,258142,258151,258158,258167,258174,258235,258242,258251,258254,258260,258276,258292,258312,258319,258336,258343,258352,258359,258368,258375,258436,258443,258452,258455,258467,258474,258485,258492,258501,258508,258523,258530,258570,258577,258586,258589,258594,258611,258618,258630,258637,258646,258653,258662,258669,258725,258732,258741,258744,258755,258762,258773,258780,258789,258796,258804,258811,258840,258843,258859,258866,258885,258892,258901,258908,258917,258924,258992,258999,259008,259011,259029,259036,259054,259061,259070,259077,259086,259093,259147,259154,259163,259166,259183,259190,259201,259208,259217,259224,259233,259240,259276,259283,259292,259295,259313,259320,259331,259338,259347,259354,259363,259370,259406,259413,259422,259425,259450,259457,259468,259475,259484,259491,259500,259507,259546,259553,259562,259565,259582,259589,259600,259607,259616,259623,259632,259639,259675,259682,259691,259694,259714,259722,259744,259751,259766,259773,259818,259825,259834,259837,259842,259859,259866,259884,259891,259900,259907,259916,259923,259970,259977,259986,259989,260005,260012,260030,260037,260046,260053,260062,260069,260122,260129,260138,260141,260146,260162,260169,260188,260195,260204,260211,260220,260227,260281,260288,260297,260300,260305,260321,260328,260347,260354,260363,260370,260379,260382,260387,260403,260410,260422,260430,260439,260446,260455,260462,260503,260510,260519,260522,260538,260545,260680,260687,260696,260703,260712,260719,260753,260760,260769,260777,260784,260793,260800,260864,260871,260880,260888,260895,260904,260912,260980,260987,261045,261055,261100,261108,261140,261147,261156,261159,261171,261181,261196,261203,261220,261228,261237,261246,261254,261263,261271,261280,261288,261297,261305,261314,261321,261439,261446,261455,261463,261506,261509,261514,261529,261543,261551,261589,261596,261605,261612,261621,261628,261651,261654,261660,262041,262049,262067,262070,262076,262087,262105,262116,262129,262140,262166,262175],{"type":17,"tag":18,"props":256542,"children":256544},{"id":256543},"notice-of-deprecation-of-fields-and-objects-nov-2025",[256545],{"type":23,"value":253671},{"type":17,"tag":25,"props":256547,"children":256548},{},[],{"type":17,"tag":29,"props":256550,"children":256551},{},[256552],{"type":17,"tag":33,"props":256553,"children":256554},{},[256555],{"type":23,"value":255422},{"type":17,"tag":18,"props":256557,"children":256559},{"id":256558},"deprecated-fields-objects-list-options",[256560],{"type":23,"value":256561},"Deprecated Fields, Objects & List Options",{"type":17,"tag":29,"props":256563,"children":256564},{},[256565],{"type":23,"value":256566},"At Unified, we have always built our unified data-models with a lot of thoughtful attention to detail, so that they never have to be 'versioned' due to backward-compatibility issues.",{"type":17,"tag":29,"props":256568,"children":256569},{},[256570],{"type":23,"value":256571},"In fact, when we launch a new data object or a brand new category, designing our unified data models always takes longer than actually 'coding' the integrations.  Our customers have noticed and have told us that we have the best designed unified data models in the business.",{"type":17,"tag":29,"props":256573,"children":256574},{},[256575],{"type":23,"value":256576},"Over the 2.5 years, as we've made improvements to the unified data-models, we have kept older fields and objects around so that our customers do not have to change their applications.",{"type":17,"tag":29,"props":256578,"children":256579},{},[256580],{"type":23,"value":256581},"Today, we are announcing some deprecations of fields, data-models and list options that have been improved with others and will shortly be removed in our system.",{"type":17,"tag":29,"props":256583,"children":256584},{},[256585,256587,256591],{"type":23,"value":256586},"This document provides a comprehensive breakdown of all deprecation in the ",{"type":17,"tag":133,"props":256588,"children":256589},{"href":7691},[256590],{"type":23,"value":7806},{"type":23,"value":256592}," as of November 2025, organized by category with migration recommendations.",{"type":17,"tag":29,"props":256594,"children":256595},{},[256596,256598],{"type":23,"value":256597},"Please make all necessary changes to your code by ",{"type":17,"tag":6121,"props":256599,"children":256601},{"className":256600},[],[256602],{"type":23,"value":256603},"JANUARY 7, 2026",{"type":17,"tag":25,"props":256605,"children":256606},{},[],{"type":17,"tag":68,"props":256608,"children":256610},{"id":256609},"table-of-contents",[256611],{"type":23,"value":256612},"Table of Contents",{"type":17,"tag":6154,"props":256614,"children":256615},{},[256616,256621,256626,256631,256636,256641,256646,256651,256656,256661,256666,256671],{"type":17,"tag":84,"props":256617,"children":256618},{},[256619],{"type":23,"value":256620},"MetadataMetadata Fields",{"type":17,"tag":84,"props":256622,"children":256623},{},[256624],{"type":23,"value":256625},"Parent Fields",{"type":17,"tag":84,"props":256627,"children":256628},{},[256629],{"type":23,"value":256630},"HRIS Employee Fields",{"type":17,"tag":84,"props":256632,"children":256633},{},[256634],{"type":23,"value":256635},"MessagingMessage Fields",{"type":17,"tag":84,"props":256637,"children":256638},{},[256639],{"type":23,"value":256640},"Accounting Fields",{"type":17,"tag":84,"props":256642,"children":256643},{},[256644],{"type":23,"value":256645},"ATS (Applicant Tracking System) Fields",{"type":17,"tag":84,"props":256647,"children":256648},{},[256649],{"type":23,"value":256650},"Ticketing Fields",{"type":17,"tag":84,"props":256652,"children":256653},{},[256654],{"type":23,"value":256655},"Calendar Fields",{"type":17,"tag":84,"props":256657,"children":256658},{},[256659],{"type":23,"value":256660},"Query Parameters & Filters",{"type":17,"tag":84,"props":256662,"children":256663},{},[256664],{"type":23,"value":256665},"Webhook Fields",{"type":17,"tag":84,"props":256667,"children":256668},{},[256669],{"type":23,"value":256670},"Deprecated Objects/Usage Patterns",{"type":17,"tag":84,"props":256672,"children":256673},{},[256674],{"type":23,"value":256675},"Deprecated Types/Interfaces",{"type":17,"tag":25,"props":256677,"children":256678},{},[],{"type":17,"tag":68,"props":256680,"children":256682},{"id":256681},"metadatametadata-fields",[256683],{"type":23,"value":256620},{"type":17,"tag":239,"props":256685,"children":256687},{"id":256686},"field-key-slug",[256688,256690,256696,256697],{"type":23,"value":256689},"Field: ",{"type":17,"tag":6121,"props":256691,"children":256693},{"className":256692},[],[256694],{"type":23,"value":256695},"key",{"type":23,"value":98082},{"type":17,"tag":6121,"props":256698,"children":256700},{"className":256699},[],[256701],{"type":23,"value":214491},{"type":17,"tag":80,"props":256703,"children":256704},{},[256705],{"type":17,"tag":84,"props":256706,"children":256707},{},[256708,256710,256715],{"type":23,"value":256709},"the reason was the ",{"type":17,"tag":6121,"props":256711,"children":256713},{"className":256712},[],[256714],{"type":23,"value":256695},{"type":23,"value":256716}," was a confusing name and could denote something else that it wasn't",{"type":17,"tag":29,"props":256718,"children":256719},{},[256720],{"type":17,"tag":48,"props":256721,"children":256722},{},[256723],{"type":23,"value":256724},"Affected Models:",{"type":17,"tag":80,"props":256726,"children":256727},{},[256728,256745,256762,256779,256796,256813],{"type":17,"tag":84,"props":256729,"children":256730},{},[256731,256737,256739],{"type":17,"tag":6121,"props":256732,"children":256734},{"className":256733},[],[256735],{"type":23,"value":256736},"IKmsPageMetadata",{"type":23,"value":256738}," (KMS) - ",{"type":17,"tag":6121,"props":256740,"children":256742},{"className":256741},[],[256743],{"type":23,"value":256744},"src/models/UnifiedKms.ts",{"type":17,"tag":84,"props":256746,"children":256747},{},[256748,256754,256756],{"type":17,"tag":6121,"props":256749,"children":256751},{"className":256750},[],[256752],{"type":23,"value":256753},"ITaskMetadata",{"type":23,"value":256755}," (Task) - ",{"type":17,"tag":6121,"props":256757,"children":256759},{"className":256758},[],[256760],{"type":23,"value":256761},"src/models/UnifiedTask.ts",{"type":17,"tag":84,"props":256763,"children":256764},{},[256765,256771,256773],{"type":17,"tag":6121,"props":256766,"children":256768},{"className":256767},[],[256769],{"type":23,"value":256770},"IHrisMetadata",{"type":23,"value":256772}," (HRIS) - ",{"type":17,"tag":6121,"props":256774,"children":256776},{"className":256775},[],[256777],{"type":23,"value":256778},"src/models/UnifiedHris.ts",{"type":17,"tag":84,"props":256780,"children":256781},{},[256782,256788,256790],{"type":17,"tag":6121,"props":256783,"children":256785},{"className":256784},[],[256786],{"type":23,"value":256787},"IAtsMetadata",{"type":23,"value":256789}," (ATS) - ",{"type":17,"tag":6121,"props":256791,"children":256793},{"className":256792},[],[256794],{"type":23,"value":256795},"src/models/UnifiedAts.ts",{"type":17,"tag":84,"props":256797,"children":256798},{},[256799,256805,256807],{"type":17,"tag":6121,"props":256800,"children":256802},{"className":256801},[],[256803],{"type":23,"value":256804},"ICommerceMetadata",{"type":23,"value":256806}," (Commerce) - ",{"type":17,"tag":6121,"props":256808,"children":256810},{"className":256809},[],[256811],{"type":23,"value":256812},"src/models/UnifiedCommerce.ts",{"type":17,"tag":84,"props":256814,"children":256815},{},[256816,256822,256824],{"type":17,"tag":6121,"props":256817,"children":256819},{"className":256818},[],[256820],{"type":23,"value":256821},"ICrmMetadata",{"type":23,"value":256823}," (CRM) - ",{"type":17,"tag":6121,"props":256825,"children":256827},{"className":256826},[],[256828],{"type":23,"value":256829},"src/models/UnifiedCrm.ts",{"type":17,"tag":29,"props":256831,"children":256832},{},[256833],{"type":17,"tag":48,"props":256834,"children":256835},{},[256836],{"type":23,"value":256837},"Deprecated Field:",{"type":17,"tag":6893,"props":256839,"children":256842},{"code":256840,"language":18718,"meta":7,"className":256841},"key?: string; // @deprecated; use slug instead\n",[18716],[256843],{"type":17,"tag":6121,"props":256844,"children":256845},{"__ignoreMap":7},[256846],{"type":23,"value":256840},{"type":17,"tag":29,"props":256848,"children":256849},{},[256850],{"type":17,"tag":48,"props":256851,"children":256852},{},[256853],{"type":23,"value":256854},"Replacement:",{"type":17,"tag":6893,"props":256856,"children":256859},{"code":256857,"language":18718,"meta":7,"className":256858},"slug?: string; // Actual textual value of the slug\n",[18716],[256860],{"type":17,"tag":6121,"props":256861,"children":256862},{"__ignoreMap":7},[256863],{"type":23,"value":256857},{"type":17,"tag":29,"props":256865,"children":256866},{},[256867],{"type":17,"tag":48,"props":256868,"children":256869},{},[256870],{"type":23,"value":256871},"Migration Recommendation:",{"type":17,"tag":80,"props":256873,"children":256874},{},[256875,256897],{"type":17,"tag":84,"props":256876,"children":256877},{},[256878,256883,256885,256891,256892],{"type":17,"tag":48,"props":256879,"children":256880},{},[256881],{"type":23,"value":256882},"Read Operations:",{"type":23,"value":256884}," Replace all references to ",{"type":17,"tag":6121,"props":256886,"children":256888},{"className":256887},[],[256889],{"type":23,"value":256890},"metadata.key",{"type":23,"value":120761},{"type":17,"tag":6121,"props":256893,"children":256895},{"className":256894},[],[256896],{"type":23,"value":236714},{"type":17,"tag":84,"props":256898,"children":256899},{},[256900,256905,256907,256912,256914,256919],{"type":17,"tag":48,"props":256901,"children":256902},{},[256903],{"type":23,"value":256904},"Write Operations:",{"type":23,"value":256906}," Use ",{"type":17,"tag":6121,"props":256908,"children":256910},{"className":256909},[],[256911],{"type":23,"value":214491},{"type":23,"value":256913}," instead of ",{"type":17,"tag":6121,"props":256915,"children":256917},{"className":256916},[],[256918],{"type":23,"value":256695},{"type":23,"value":256920}," when creating or updating metadata objects",{"type":17,"tag":29,"props":256922,"children":256923},{},[256924],{"type":17,"tag":48,"props":256925,"children":256926},{},[256927],{"type":23,"value":19878},{"type":17,"tag":6893,"props":256929,"children":256932},{"code":256930,"language":18718,"meta":7,"className":256931},"// Before\nmetadata: [{\n    key: 'custom_field',\n    value: 'some value'\n}]\n\n// After\nmetadata: [{\n    slug: 'custom_field',\n    value: 'some value'\n}]\n",[18716],[256933],{"type":17,"tag":6121,"props":256934,"children":256935},{"__ignoreMap":7},[256936],{"type":23,"value":256930},{"type":17,"tag":25,"props":256938,"children":256939},{},[],{"type":17,"tag":239,"props":256941,"children":256943},{"id":256942},"field-type-format",[256944,256945,256950,256951],{"type":23,"value":256689},{"type":17,"tag":6121,"props":256946,"children":256948},{"className":256947},[],[256949],{"type":23,"value":27310},{"type":23,"value":98082},{"type":17,"tag":6121,"props":256952,"children":256954},{"className":256953},[],[256955],{"type":23,"value":214510},{"type":17,"tag":80,"props":256957,"children":256958},{},[256959],{"type":17,"tag":84,"props":256960,"children":256961},{},[256962,256963,256968],{"type":23,"value":256709},{"type":17,"tag":6121,"props":256964,"children":256966},{"className":256965},[],[256967],{"type":23,"value":27310},{"type":23,"value":256716},{"type":17,"tag":29,"props":256970,"children":256971},{},[256972],{"type":17,"tag":48,"props":256973,"children":256974},{},[256975],{"type":23,"value":256724},{"type":17,"tag":80,"props":256977,"children":256978},{},[256979,256993,257007,257021,257035,257049],{"type":17,"tag":84,"props":256980,"children":256981},{},[256982,256987,256988],{"type":17,"tag":6121,"props":256983,"children":256985},{"className":256984},[],[256986],{"type":23,"value":256736},{"type":23,"value":256738},{"type":17,"tag":6121,"props":256989,"children":256991},{"className":256990},[],[256992],{"type":23,"value":256744},{"type":17,"tag":84,"props":256994,"children":256995},{},[256996,257001,257002],{"type":17,"tag":6121,"props":256997,"children":256999},{"className":256998},[],[257000],{"type":23,"value":256753},{"type":23,"value":256755},{"type":17,"tag":6121,"props":257003,"children":257005},{"className":257004},[],[257006],{"type":23,"value":256761},{"type":17,"tag":84,"props":257008,"children":257009},{},[257010,257015,257016],{"type":17,"tag":6121,"props":257011,"children":257013},{"className":257012},[],[257014],{"type":23,"value":256770},{"type":23,"value":256772},{"type":17,"tag":6121,"props":257017,"children":257019},{"className":257018},[],[257020],{"type":23,"value":256778},{"type":17,"tag":84,"props":257022,"children":257023},{},[257024,257029,257030],{"type":17,"tag":6121,"props":257025,"children":257027},{"className":257026},[],[257028],{"type":23,"value":256787},{"type":23,"value":256789},{"type":17,"tag":6121,"props":257031,"children":257033},{"className":257032},[],[257034],{"type":23,"value":256795},{"type":17,"tag":84,"props":257036,"children":257037},{},[257038,257043,257044],{"type":17,"tag":6121,"props":257039,"children":257041},{"className":257040},[],[257042],{"type":23,"value":256804},{"type":23,"value":256806},{"type":17,"tag":6121,"props":257045,"children":257047},{"className":257046},[],[257048],{"type":23,"value":256812},{"type":17,"tag":84,"props":257050,"children":257051},{},[257052,257057,257058],{"type":17,"tag":6121,"props":257053,"children":257055},{"className":257054},[],[257056],{"type":23,"value":256821},{"type":23,"value":256823},{"type":17,"tag":6121,"props":257059,"children":257061},{"className":257060},[],[257062],{"type":23,"value":256829},{"type":17,"tag":29,"props":257064,"children":257065},{},[257066],{"type":17,"tag":48,"props":257067,"children":257068},{},[257069],{"type":23,"value":256837},{"type":17,"tag":6893,"props":257071,"children":257074},{"code":257072,"language":18718,"meta":7,"className":257073},"type?: string; // @deprecated; use format instead\n",[18716],[257075],{"type":17,"tag":6121,"props":257076,"children":257077},{"__ignoreMap":7},[257078],{"type":23,"value":257072},{"type":17,"tag":29,"props":257080,"children":257081},{},[257082],{"type":17,"tag":48,"props":257083,"children":257084},{},[257085],{"type":23,"value":256854},{"type":17,"tag":6893,"props":257087,"children":257090},{"code":257088,"language":18718,"meta":7,"className":257089},"format?: TMetadataFormat; // Enum: TEXT, NUMBER, DATE, BOOLEAN, FILE, TEXTAREA, SINGLE_SELECT, MULTIPLE_SELECT, MEASUREMENT, PRICE, YES_NO, CURRENCY, URL, etc.\n",[18716],[257091],{"type":17,"tag":6121,"props":257092,"children":257093},{"__ignoreMap":7},[257094],{"type":23,"value":257088},{"type":17,"tag":29,"props":257096,"children":257097},{},[257098],{"type":17,"tag":48,"props":257099,"children":257100},{},[257101],{"type":23,"value":256871},{"type":17,"tag":80,"props":257103,"children":257104},{},[257105,257126,257148],{"type":17,"tag":84,"props":257106,"children":257107},{},[257108,257112,257113,257119,257120],{"type":17,"tag":48,"props":257109,"children":257110},{},[257111],{"type":23,"value":256882},{"type":23,"value":256884},{"type":17,"tag":6121,"props":257114,"children":257116},{"className":257115},[],[257117],{"type":23,"value":257118},"metadata.type",{"type":23,"value":120761},{"type":17,"tag":6121,"props":257121,"children":257123},{"className":257122},[],[257124],{"type":23,"value":257125},"metadata.format",{"type":17,"tag":84,"props":257127,"children":257128},{},[257129,257133,257134,257139,257141,257146],{"type":17,"tag":48,"props":257130,"children":257131},{},[257132],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257135,"children":257137},{"className":257136},[],[257138],{"type":23,"value":214510},{"type":23,"value":257140}," with the appropriate enum value instead of ",{"type":17,"tag":6121,"props":257142,"children":257144},{"className":257143},[],[257145],{"type":23,"value":27310},{"type":23,"value":257147}," string",{"type":17,"tag":84,"props":257149,"children":257150},{},[257151,257156,257158,257163],{"type":17,"tag":48,"props":257152,"children":257153},{},[257154],{"type":23,"value":257155},"Type Safety:",{"type":23,"value":257157}," The ",{"type":17,"tag":6121,"props":257159,"children":257161},{"className":257160},[],[257162],{"type":23,"value":214510},{"type":23,"value":257164}," field uses strongly-typed enums, providing better type safety and validation",{"type":17,"tag":29,"props":257166,"children":257167},{},[257168],{"type":17,"tag":48,"props":257169,"children":257170},{},[257171],{"type":23,"value":19878},{"type":17,"tag":6893,"props":257173,"children":257176},{"code":257174,"language":18718,"meta":7,"className":257175},"// Before\nmetadata: [{\n    key: 'age',\n    type: 'number',\n    value: 25\n}]\n\n// After\nmetadata: [{\n    slug: 'age',\n    format: 'NUMBER', // Use enum value\n    value: 25\n}]\n",[18716],[257177],{"type":17,"tag":6121,"props":257178,"children":257179},{"__ignoreMap":7},[257180],{"type":23,"value":257174},{"type":17,"tag":25,"props":257182,"children":257183},{},[],{"type":17,"tag":68,"props":257185,"children":257187},{"id":257186},"parent-fields",[257188],{"type":23,"value":256625},{"type":17,"tag":239,"props":257190,"children":257192},{"id":257191},"field-parent_space_id-parent_id",[257193,257194,257200,257201],{"type":23,"value":256689},{"type":17,"tag":6121,"props":257195,"children":257197},{"className":257196},[],[257198],{"type":23,"value":257199},"parent_space_id",{"type":23,"value":98082},{"type":17,"tag":6121,"props":257202,"children":257204},{"className":257203},[],[257205],{"type":23,"value":15863},{"type":17,"tag":239,"props":257207,"children":257209},{"id":257208},"field-parent_page_id-parent_id",[257210,257211,257216,257217],{"type":23,"value":256689},{"type":17,"tag":6121,"props":257212,"children":257214},{"className":257213},[],[257215],{"type":23,"value":173228},{"type":23,"value":98082},{"type":17,"tag":6121,"props":257218,"children":257220},{"className":257219},[],[257221],{"type":23,"value":15863},{"type":17,"tag":80,"props":257223,"children":257224},{},[257225],{"type":17,"tag":84,"props":257226,"children":257227},{},[257228,257230,257235],{"type":23,"value":257229},"the reason was that we standardized across all of our unified data models the field name of ",{"type":17,"tag":6121,"props":257231,"children":257233},{"className":257232},[],[257234],{"type":23,"value":15863},{"type":23,"value":257236}," when it denoted a parent of the current object (and is the same object)",{"type":17,"tag":29,"props":257238,"children":257239},{},[257240],{"type":17,"tag":48,"props":257241,"children":257242},{},[257243],{"type":23,"value":256724},{"type":17,"tag":80,"props":257245,"children":257246},{},[257247,257263],{"type":17,"tag":84,"props":257248,"children":257249},{},[257250,257256,257258],{"type":17,"tag":6121,"props":257251,"children":257253},{"className":257252},[],[257254],{"type":23,"value":257255},"IKmsSpace",{"type":23,"value":257257}," - ",{"type":17,"tag":6121,"props":257259,"children":257261},{"className":257260},[],[257262],{"type":23,"value":256744},{"type":17,"tag":84,"props":257264,"children":257265},{},[257266,257272,257273],{"type":17,"tag":6121,"props":257267,"children":257269},{"className":257268},[],[257270],{"type":23,"value":257271},"IKmsPage",{"type":23,"value":257257},{"type":17,"tag":6121,"props":257274,"children":257276},{"className":257275},[],[257277],{"type":23,"value":256744},{"type":17,"tag":29,"props":257279,"children":257280},{},[257281],{"type":17,"tag":48,"props":257282,"children":257283},{},[257284],{"type":23,"value":256837},{"type":17,"tag":6893,"props":257286,"children":257289},{"code":257287,"language":18718,"meta":7,"className":257288},"// In KmsSpace\nparent_space_id?: string; // @deprecated; use parent_id instead\n\n// In KmsPage\nparent_page_id?: string; // @deprecated; use parent_id instead\n",[18716],[257290],{"type":17,"tag":6121,"props":257291,"children":257292},{"__ignoreMap":7},[257293],{"type":23,"value":257287},{"type":17,"tag":29,"props":257295,"children":257296},{},[257297],{"type":17,"tag":48,"props":257298,"children":257299},{},[257300],{"type":23,"value":256854},{"type":17,"tag":6893,"props":257302,"children":257305},{"code":257303,"language":18718,"meta":7,"className":257304},"parent_id?: string;\n",[18716],[257306],{"type":17,"tag":6121,"props":257307,"children":257308},{"__ignoreMap":7},[257309],{"type":23,"value":257303},{"type":17,"tag":29,"props":257311,"children":257312},{},[257313],{"type":17,"tag":48,"props":257314,"children":257315},{},[257316],{"type":23,"value":256871},{"type":17,"tag":80,"props":257318,"children":257319},{},[257320,257341],{"type":17,"tag":84,"props":257321,"children":257322},{},[257323,257327,257328,257333,257334,257339],{"type":17,"tag":48,"props":257324,"children":257325},{},[257326],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257329,"children":257331},{"className":257330},[],[257332],{"type":23,"value":15863},{"type":23,"value":256913},{"type":17,"tag":6121,"props":257335,"children":257337},{"className":257336},[],[257338],{"type":23,"value":257199},{"type":23,"value":257340}," when reading space objects",{"type":17,"tag":84,"props":257342,"children":257343},{},[257344,257348,257349,257354],{"type":17,"tag":48,"props":257345,"children":257346},{},[257347],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257350,"children":257352},{"className":257351},[],[257353],{"type":23,"value":15863},{"type":23,"value":257355}," when creating or updating spaces",{"type":17,"tag":29,"props":257357,"children":257358},{},[257359],{"type":17,"tag":48,"props":257360,"children":257361},{},[257362],{"type":23,"value":19878},{"type":17,"tag":6893,"props":257364,"children":257367},{"code":257365,"language":18718,"meta":7,"className":257366},"// Before\nconst space = {\n    name: 'Subspace',\n    parent_space_id: 'space_123'\n}\n\n// After\nconst space = {\n    name: 'Subspace',\n    parent_id: 'space_123'\n}\n",[18716],[257368],{"type":17,"tag":6121,"props":257369,"children":257370},{"__ignoreMap":7},[257371],{"type":23,"value":257365},{"type":17,"tag":25,"props":257373,"children":257374},{},[],{"type":17,"tag":239,"props":257376,"children":257378},{"id":257377},"field-parent_channel_id-parent_id",[257379,257380,257386,257387],{"type":23,"value":256689},{"type":17,"tag":6121,"props":257381,"children":257383},{"className":257382},[],[257384],{"type":23,"value":257385},"parent_channel_id",{"type":23,"value":98082},{"type":17,"tag":6121,"props":257388,"children":257390},{"className":257389},[],[257391],{"type":23,"value":15863},{"type":17,"tag":29,"props":257393,"children":257394},{},[257395],{"type":17,"tag":48,"props":257396,"children":257397},{},[257398],{"type":23,"value":257399},"Affected Model:",{"type":17,"tag":80,"props":257401,"children":257402},{},[257403],{"type":17,"tag":84,"props":257404,"children":257405},{},[257406,257412,257413],{"type":17,"tag":6121,"props":257407,"children":257409},{"className":257408},[],[257410],{"type":23,"value":257411},"IMessagingChannel",{"type":23,"value":257257},{"type":17,"tag":6121,"props":257414,"children":257416},{"className":257415},[],[257417],{"type":23,"value":257418},"src/models/UnifiedMessaging.ts",{"type":17,"tag":29,"props":257420,"children":257421},{},[257422],{"type":17,"tag":48,"props":257423,"children":257424},{},[257425],{"type":23,"value":256837},{"type":17,"tag":6893,"props":257427,"children":257430},{"code":257428,"language":18718,"meta":7,"className":257429},"parent_channel_id?: string; // @deprecated; use parent_id instead\n",[18716],[257431],{"type":17,"tag":6121,"props":257432,"children":257433},{"__ignoreMap":7},[257434],{"type":23,"value":257428},{"type":17,"tag":29,"props":257436,"children":257437},{},[257438],{"type":17,"tag":48,"props":257439,"children":257440},{},[257441],{"type":23,"value":256854},{"type":17,"tag":6893,"props":257443,"children":257445},{"code":257303,"language":18718,"meta":7,"className":257444},[18716],[257446],{"type":17,"tag":6121,"props":257447,"children":257448},{"__ignoreMap":7},[257449],{"type":23,"value":257303},{"type":17,"tag":29,"props":257451,"children":257452},{},[257453],{"type":17,"tag":48,"props":257454,"children":257455},{},[257456],{"type":23,"value":256871},{"type":17,"tag":80,"props":257458,"children":257459},{},[257460,257481],{"type":17,"tag":84,"props":257461,"children":257462},{},[257463,257467,257468,257473,257474,257479],{"type":17,"tag":48,"props":257464,"children":257465},{},[257466],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257469,"children":257471},{"className":257470},[],[257472],{"type":23,"value":15863},{"type":23,"value":256913},{"type":17,"tag":6121,"props":257475,"children":257477},{"className":257476},[],[257478],{"type":23,"value":257385},{"type":23,"value":257480}," when reading channel objects",{"type":17,"tag":84,"props":257482,"children":257483},{},[257484,257488,257489,257494],{"type":17,"tag":48,"props":257485,"children":257486},{},[257487],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257490,"children":257492},{"className":257491},[],[257493],{"type":23,"value":15863},{"type":23,"value":257495}," when creating or updating channels",{"type":17,"tag":29,"props":257497,"children":257498},{},[257499],{"type":17,"tag":48,"props":257500,"children":257501},{},[257502],{"type":23,"value":19878},{"type":17,"tag":6893,"props":257504,"children":257507},{"code":257505,"language":18718,"meta":7,"className":257506},"// Before\nconst channel = {\n    name: 'Sub-channel',\n    parent_channel_id: 'channel_123'\n}\n\n// After\nconst channel = {\n    name: 'Sub-channel',\n    parent_id: 'channel_123'\n}\n",[18716],[257508],{"type":17,"tag":6121,"props":257509,"children":257510},{"__ignoreMap":7},[257511],{"type":23,"value":257505},{"type":17,"tag":25,"props":257513,"children":257514},{},[],{"type":17,"tag":239,"props":257516,"children":257518},{"id":257517},"field-parent_account_id-parent_id",[257519,257520,257526,257527],{"type":23,"value":256689},{"type":17,"tag":6121,"props":257521,"children":257523},{"className":257522},[],[257524],{"type":23,"value":257525},"parent_account_id",{"type":23,"value":98082},{"type":17,"tag":6121,"props":257528,"children":257530},{"className":257529},[],[257531],{"type":23,"value":15863},{"type":17,"tag":29,"props":257533,"children":257534},{},[257535],{"type":17,"tag":48,"props":257536,"children":257537},{},[257538],{"type":23,"value":257399},{"type":17,"tag":80,"props":257540,"children":257541},{},[257542],{"type":17,"tag":84,"props":257543,"children":257544},{},[257545],{"type":17,"tag":6121,"props":257546,"children":257548},{"className":257547},[],[257549],{"type":23,"value":257550},"IAccountingAccount",{"type":17,"tag":29,"props":257552,"children":257553},{},[257554],{"type":17,"tag":48,"props":257555,"children":257556},{},[257557],{"type":23,"value":256837},{"type":17,"tag":6893,"props":257559,"children":257562},{"code":257560,"language":18718,"meta":7,"className":257561},"parent_account_id?: string; // @deprecated; use parent_id instead\n",[18716],[257563],{"type":17,"tag":6121,"props":257564,"children":257565},{"__ignoreMap":7},[257566],{"type":23,"value":257560},{"type":17,"tag":29,"props":257568,"children":257569},{},[257570],{"type":17,"tag":48,"props":257571,"children":257572},{},[257573],{"type":23,"value":256854},{"type":17,"tag":6893,"props":257575,"children":257578},{"code":257576,"language":18718,"meta":7,"className":257577},"parent_id?: string; // The parent account ID for this account\n",[18716],[257579],{"type":17,"tag":6121,"props":257580,"children":257581},{"__ignoreMap":7},[257582],{"type":23,"value":257576},{"type":17,"tag":29,"props":257584,"children":257585},{},[257586],{"type":17,"tag":48,"props":257587,"children":257588},{},[257589],{"type":23,"value":256871},{"type":17,"tag":80,"props":257591,"children":257592},{},[257593,257614],{"type":17,"tag":84,"props":257594,"children":257595},{},[257596,257600,257601,257606,257607,257612],{"type":17,"tag":48,"props":257597,"children":257598},{},[257599],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257602,"children":257604},{"className":257603},[],[257605],{"type":23,"value":15863},{"type":23,"value":256913},{"type":17,"tag":6121,"props":257608,"children":257610},{"className":257609},[],[257611],{"type":23,"value":257525},{"type":23,"value":257613}," when reading account objects",{"type":17,"tag":84,"props":257615,"children":257616},{},[257617,257621,257622,257627],{"type":17,"tag":48,"props":257618,"children":257619},{},[257620],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257623,"children":257625},{"className":257624},[],[257626],{"type":23,"value":15863},{"type":23,"value":257628}," when creating or updating accounts",{"type":17,"tag":29,"props":257630,"children":257631},{},[257632],{"type":17,"tag":48,"props":257633,"children":257634},{},[257635],{"type":23,"value":19878},{"type":17,"tag":6893,"props":257637,"children":257640},{"code":257638,"language":18718,"meta":7,"className":257639},"// Before\nconst account = {\n    name: 'Sub-account',\n    parent_account_id: 'account_123'\n}\n\n// After\nconst account = {\n    name: 'Sub-account',\n    parent_id: 'account_123'\n}\n",[18716],[257641],{"type":17,"tag":6121,"props":257642,"children":257643},{"__ignoreMap":7},[257644],{"type":23,"value":257638},{"type":17,"tag":25,"props":257646,"children":257647},{},[],{"type":17,"tag":239,"props":257649,"children":257651},{"id":257650},"field-parent_message_id-parent_id",[257652,257653,257659,257660],{"type":23,"value":256689},{"type":17,"tag":6121,"props":257654,"children":257656},{"className":257655},[],[257657],{"type":23,"value":257658},"parent_message_id",{"type":23,"value":98082},{"type":17,"tag":6121,"props":257661,"children":257663},{"className":257662},[],[257664],{"type":23,"value":15863},{"type":17,"tag":29,"props":257666,"children":257667},{},[257668],{"type":17,"tag":48,"props":257669,"children":257670},{},[257671],{"type":23,"value":257399},{"type":17,"tag":80,"props":257673,"children":257674},{},[257675],{"type":17,"tag":84,"props":257676,"children":257677},{},[257678],{"type":17,"tag":6121,"props":257679,"children":257681},{"className":257680},[],[257682],{"type":23,"value":257683},"IMessagingMessage",{"type":17,"tag":29,"props":257685,"children":257686},{},[257687],{"type":17,"tag":48,"props":257688,"children":257689},{},[257690],{"type":23,"value":256837},{"type":17,"tag":6893,"props":257692,"children":257695},{"code":257693,"language":18718,"meta":7,"className":257694},"parent_message_id?: string; // @deprecated; use parent_id\n",[18716],[257696],{"type":17,"tag":6121,"props":257697,"children":257698},{"__ignoreMap":7},[257699],{"type":23,"value":257693},{"type":17,"tag":29,"props":257701,"children":257702},{},[257703],{"type":17,"tag":48,"props":257704,"children":257705},{},[257706],{"type":23,"value":256854},{"type":17,"tag":6893,"props":257708,"children":257711},{"code":257709,"language":18718,"meta":7,"className":257710},"parent_id?: string; // Represents the ID of the immediate predecessor message in the thread\n",[18716],[257712],{"type":17,"tag":6121,"props":257713,"children":257714},{"__ignoreMap":7},[257715],{"type":23,"value":257709},{"type":17,"tag":29,"props":257717,"children":257718},{},[257719],{"type":17,"tag":48,"props":257720,"children":257721},{},[257722],{"type":23,"value":256871},{"type":17,"tag":80,"props":257724,"children":257725},{},[257726,257747],{"type":17,"tag":84,"props":257727,"children":257728},{},[257729,257733,257734,257739,257740,257745],{"type":17,"tag":48,"props":257730,"children":257731},{},[257732],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257735,"children":257737},{"className":257736},[],[257738],{"type":23,"value":15863},{"type":23,"value":256913},{"type":17,"tag":6121,"props":257741,"children":257743},{"className":257742},[],[257744],{"type":23,"value":257658},{"type":23,"value":257746}," when reading message objects",{"type":17,"tag":84,"props":257748,"children":257749},{},[257750,257754,257755,257760],{"type":17,"tag":48,"props":257751,"children":257752},{},[257753],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257756,"children":257758},{"className":257757},[],[257759],{"type":23,"value":15863},{"type":23,"value":257761}," when creating threaded messages",{"type":17,"tag":29,"props":257763,"children":257764},{},[257765],{"type":17,"tag":48,"props":257766,"children":257767},{},[257768],{"type":23,"value":19878},{"type":17,"tag":6893,"props":257770,"children":257773},{"code":257771,"language":18718,"meta":7,"className":257772},"// Before\nconst message = {\n    message: 'Reply text',\n    parent_message_id: 'msg_123'\n}\n\n// After\nconst message = {\n    message: 'Reply text',\n    parent_id: 'msg_123'\n}\n",[18716],[257774],{"type":17,"tag":6121,"props":257775,"children":257776},{"__ignoreMap":7},[257777],{"type":23,"value":257771},{"type":17,"tag":25,"props":257779,"children":257780},{},[],{"type":17,"tag":68,"props":257782,"children":257784},{"id":257783},"hris-employee-fields",[257785],{"type":23,"value":256630},{"type":17,"tag":239,"props":257787,"children":257789},{"id":257788},"field-department-groups",[257790,257791,257796,257797],{"type":23,"value":256689},{"type":17,"tag":6121,"props":257792,"children":257794},{"className":257793},[],[257795],{"type":23,"value":62375},{"type":23,"value":98082},{"type":17,"tag":6121,"props":257798,"children":257800},{"className":257799},[],[257801],{"type":23,"value":257802},"groups",{"type":17,"tag":80,"props":257804,"children":257805},{},[257806],{"type":17,"tag":84,"props":257807,"children":257808},{},[257809],{"type":23,"value":257810},"we unified all HR 'grouping' objects into one called HRIS Group.  Groups have types that denote if they are a department, business unit, team, …",{"type":17,"tag":29,"props":257812,"children":257813},{},[257814],{"type":17,"tag":48,"props":257815,"children":257816},{},[257817],{"type":23,"value":257399},{"type":17,"tag":80,"props":257819,"children":257820},{},[257821],{"type":17,"tag":84,"props":257822,"children":257823},{},[257824,257830,257831],{"type":17,"tag":6121,"props":257825,"children":257827},{"className":257826},[],[257828],{"type":23,"value":257829},"IHrisEmployee",{"type":23,"value":257257},{"type":17,"tag":6121,"props":257832,"children":257834},{"className":257833},[],[257835],{"type":23,"value":256778},{"type":17,"tag":29,"props":257837,"children":257838},{},[257839],{"type":17,"tag":48,"props":257840,"children":257841},{},[257842],{"type":23,"value":256837},{"type":17,"tag":6893,"props":257844,"children":257847},{"code":257845,"language":18718,"meta":7,"className":257846},"department?: string; // @deprecated\n",[18716],[257848],{"type":17,"tag":6121,"props":257849,"children":257850},{"__ignoreMap":7},[257851],{"type":23,"value":257845},{"type":17,"tag":29,"props":257853,"children":257854},{},[257855],{"type":17,"tag":48,"props":257856,"children":257857},{},[257858],{"type":23,"value":256854},{"type":17,"tag":6893,"props":257860,"children":257863},{"code":257861,"language":18718,"meta":7,"className":257862},"groups?: IHrisGroup[]; // Which groups/teams/units that this employee/user belongs to\n",[18716],[257864],{"type":17,"tag":6121,"props":257865,"children":257866},{"__ignoreMap":7},[257867],{"type":23,"value":257861},{"type":17,"tag":29,"props":257869,"children":257870},{},[257871],{"type":17,"tag":48,"props":257872,"children":257873},{},[257874],{"type":23,"value":256871},{"type":17,"tag":80,"props":257876,"children":257877},{},[257878,257894,257923],{"type":17,"tag":84,"props":257879,"children":257880},{},[257881,257885,257887,257892],{"type":17,"tag":48,"props":257882,"children":257883},{},[257884],{"type":23,"value":256882},{"type":23,"value":257886}," Access department information through the ",{"type":17,"tag":6121,"props":257888,"children":257890},{"className":257889},[],[257891],{"type":23,"value":257802},{"type":23,"value":257893}," array",{"type":17,"tag":84,"props":257895,"children":257896},{},[257897,257901,257902,257907,257909,257915,257917,257922],{"type":17,"tag":48,"props":257898,"children":257899},{},[257900],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":257903,"children":257905},{"className":257904},[],[257906],{"type":23,"value":257802},{"type":23,"value":257908}," array with ",{"type":17,"tag":6121,"props":257910,"children":257912},{"className":257911},[],[257913],{"type":23,"value":257914},"IHrisGroup",{"type":23,"value":257916}," objects instead of a single ",{"type":17,"tag":6121,"props":257918,"children":257920},{"className":257919},[],[257921],{"type":23,"value":62375},{"type":23,"value":257147},{"type":17,"tag":84,"props":257924,"children":257925},{},[257926,257931,257932,257937],{"type":17,"tag":48,"props":257927,"children":257928},{},[257929],{"type":23,"value":257930},"Multiple Groups:",{"type":23,"value":257157},{"type":17,"tag":6121,"props":257933,"children":257935},{"className":257934},[],[257936],{"type":23,"value":257802},{"type":23,"value":257938}," field supports multiple group memberships, which is more flexible than a single department",{"type":17,"tag":29,"props":257940,"children":257941},{},[257942],{"type":17,"tag":48,"props":257943,"children":257944},{},[257945],{"type":23,"value":19878},{"type":17,"tag":6893,"props":257947,"children":257950},{"code":257948,"language":18718,"meta":7,"className":257949},"// Before\nconst employee = {\n    name: 'John Doe',\n    department: 'Engineering'\n}\n\n// After\nconst employee = {\n    name: 'John Doe',\n    groups: [{\n        id: 'group_123',\n        name: 'Engineering',\n        type: 'DEPARTMENT'\n    }]\n}\n",[18716],[257951],{"type":17,"tag":6121,"props":257952,"children":257953},{"__ignoreMap":7},[257954],{"type":23,"value":257948},{"type":17,"tag":25,"props":257956,"children":257957},{},[],{"type":17,"tag":239,"props":257959,"children":257961},{"id":257960},"fielddivision-groups",[257962,257964,257970,257971],{"type":23,"value":257963},"Field:",{"type":17,"tag":6121,"props":257965,"children":257967},{"className":257966},[],[257968],{"type":23,"value":257969},"division",{"type":23,"value":98082},{"type":17,"tag":6121,"props":257972,"children":257974},{"className":257973},[],[257975],{"type":23,"value":257802},{"type":17,"tag":29,"props":257977,"children":257978},{},[257979],{"type":17,"tag":48,"props":257980,"children":257981},{},[257982],{"type":23,"value":257399},{"type":17,"tag":80,"props":257984,"children":257985},{},[257986],{"type":17,"tag":84,"props":257987,"children":257988},{},[257989],{"type":17,"tag":6121,"props":257990,"children":257992},{"className":257991},[],[257993],{"type":23,"value":257829},{"type":17,"tag":29,"props":257995,"children":257996},{},[257997],{"type":17,"tag":48,"props":257998,"children":257999},{},[258000],{"type":23,"value":256837},{"type":17,"tag":6893,"props":258002,"children":258005},{"code":258003,"language":18718,"meta":7,"className":258004},"division?: string; // @deprecated\n",[18716],[258006],{"type":17,"tag":6121,"props":258007,"children":258008},{"__ignoreMap":7},[258009],{"type":23,"value":258003},{"type":17,"tag":29,"props":258011,"children":258012},{},[258013],{"type":17,"tag":48,"props":258014,"children":258015},{},[258016],{"type":23,"value":256854},{"type":17,"tag":6893,"props":258018,"children":258020},{"code":257861,"language":18718,"meta":7,"className":258019},[18716],[258021],{"type":17,"tag":6121,"props":258022,"children":258023},{"__ignoreMap":7},[258024],{"type":23,"value":257861},{"type":17,"tag":29,"props":258026,"children":258027},{},[258028],{"type":17,"tag":48,"props":258029,"children":258030},{},[258031],{"type":23,"value":256871},{"type":17,"tag":80,"props":258033,"children":258034},{},[258035,258050],{"type":17,"tag":84,"props":258036,"children":258037},{},[258038,258042,258044,258049],{"type":17,"tag":48,"props":258039,"children":258040},{},[258041],{"type":23,"value":256882},{"type":23,"value":258043}," Access division information through the ",{"type":17,"tag":6121,"props":258045,"children":258047},{"className":258046},[],[258048],{"type":23,"value":257802},{"type":23,"value":257893},{"type":17,"tag":84,"props":258051,"children":258052},{},[258053,258057,258058,258063,258064,258069,258070,258075],{"type":17,"tag":48,"props":258054,"children":258055},{},[258056],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":258059,"children":258061},{"className":258060},[],[258062],{"type":23,"value":257802},{"type":23,"value":257908},{"type":17,"tag":6121,"props":258065,"children":258067},{"className":258066},[],[258068],{"type":23,"value":257914},{"type":23,"value":257916},{"type":17,"tag":6121,"props":258071,"children":258073},{"className":258072},[],[258074],{"type":23,"value":257969},{"type":23,"value":257147},{"type":17,"tag":29,"props":258077,"children":258078},{},[258079],{"type":17,"tag":48,"props":258080,"children":258081},{},[258082],{"type":23,"value":19878},{"type":17,"tag":6893,"props":258084,"children":258087},{"code":258085,"language":18718,"meta":7,"className":258086},"// Before\nconst employee = {\n    name: 'John Doe',\n    division: 'Product'\n}\n\n// After\nconst employee = {\n    name: 'John Doe',\n    groups: [{\n        id: 'group_456',\n        name: 'Product',\n        type: 'DIVISION'\n    }]\n}\n",[18716],[258088],{"type":17,"tag":6121,"props":258089,"children":258090},{"__ignoreMap":7},[258091],{"type":23,"value":258085},{"type":17,"tag":25,"props":258093,"children":258094},{},[],{"type":17,"tag":239,"props":258096,"children":258098},{"id":258097},"field-location-locations",[258099,258100,258105,258106],{"type":23,"value":256689},{"type":17,"tag":6121,"props":258101,"children":258103},{"className":258102},[],[258104],{"type":23,"value":74134},{"type":23,"value":98082},{"type":17,"tag":6121,"props":258107,"children":258109},{"className":258108},[],[258110],{"type":23,"value":101916},{"type":17,"tag":29,"props":258112,"children":258113},{},[258114],{"type":17,"tag":48,"props":258115,"children":258116},{},[258117],{"type":23,"value":257399},{"type":17,"tag":80,"props":258119,"children":258120},{},[258121],{"type":17,"tag":84,"props":258122,"children":258123},{},[258124,258129,258130],{"type":17,"tag":6121,"props":258125,"children":258127},{"className":258126},[],[258128],{"type":23,"value":257829},{"type":23,"value":257257},{"type":17,"tag":6121,"props":258131,"children":258133},{"className":258132},[],[258134],{"type":23,"value":256778},{"type":17,"tag":29,"props":258136,"children":258137},{},[258138],{"type":17,"tag":48,"props":258139,"children":258140},{},[258141],{"type":23,"value":256837},{"type":17,"tag":6893,"props":258143,"children":258146},{"code":258144,"language":18718,"meta":7,"className":258145},"location?: string; // @deprecated\n",[18716],[258147],{"type":17,"tag":6121,"props":258148,"children":258149},{"__ignoreMap":7},[258150],{"type":23,"value":258144},{"type":17,"tag":29,"props":258152,"children":258153},{},[258154],{"type":17,"tag":48,"props":258155,"children":258156},{},[258157],{"type":23,"value":256854},{"type":17,"tag":6893,"props":258159,"children":258162},{"code":258160,"language":18718,"meta":7,"className":258161},"locations?: IHrisLocation[]; // Array of partial location objects\n",[18716],[258163],{"type":17,"tag":6121,"props":258164,"children":258165},{"__ignoreMap":7},[258166],{"type":23,"value":258160},{"type":17,"tag":29,"props":258168,"children":258169},{},[258170],{"type":17,"tag":48,"props":258171,"children":258172},{},[258173],{"type":23,"value":256871},{"type":17,"tag":80,"props":258175,"children":258176},{},[258177,258192,258219],{"type":17,"tag":84,"props":258178,"children":258179},{},[258180,258184,258186,258191],{"type":17,"tag":48,"props":258181,"children":258182},{},[258183],{"type":23,"value":256882},{"type":23,"value":258185}," Access location information through the ",{"type":17,"tag":6121,"props":258187,"children":258189},{"className":258188},[],[258190],{"type":23,"value":101916},{"type":23,"value":257893},{"type":17,"tag":84,"props":258193,"children":258194},{},[258195,258199,258200,258205,258206,258212,258213,258218],{"type":17,"tag":48,"props":258196,"children":258197},{},[258198],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":258201,"children":258203},{"className":258202},[],[258204],{"type":23,"value":101916},{"type":23,"value":257908},{"type":17,"tag":6121,"props":258207,"children":258209},{"className":258208},[],[258210],{"type":23,"value":258211},"IHrisLocation",{"type":23,"value":257916},{"type":17,"tag":6121,"props":258214,"children":258216},{"className":258215},[],[258217],{"type":23,"value":74134},{"type":23,"value":257147},{"type":17,"tag":84,"props":258220,"children":258221},{},[258222,258227,258228,258233],{"type":17,"tag":48,"props":258223,"children":258224},{},[258225],{"type":23,"value":258226},"Rich Data:",{"type":23,"value":257157},{"type":17,"tag":6121,"props":258229,"children":258231},{"className":258230},[],[258232],{"type":23,"value":101916},{"type":23,"value":258234}," array provides full address details, timezone, currency, and other metadata",{"type":17,"tag":29,"props":258236,"children":258237},{},[258238],{"type":17,"tag":48,"props":258239,"children":258240},{},[258241],{"type":23,"value":19878},{"type":17,"tag":6893,"props":258243,"children":258246},{"code":258244,"language":18718,"meta":7,"className":258245},"// Before\nconst employee = {\n    name: 'John Doe',\n    location: 'San Francisco Office'\n}\n\n// After\nconst employee = {\n    name: 'John Doe',\n    locations: [{\n        id: 'loc_123',\n        name: 'San Francisco Office',\n        address: {\n            address1: '123 Main St',\n            city: 'San Francisco',\n            region: 'CA',\n            postal_code: '94102',\n            country: 'United States'\n        },\n        timezone: 'America/Los_Angeles'\n    }]\n}\n",[18716],[258247],{"type":17,"tag":6121,"props":258248,"children":258249},{"__ignoreMap":7},[258250],{"type":23,"value":258244},{"type":17,"tag":25,"props":258252,"children":258253},{},[],{"type":17,"tag":68,"props":258255,"children":258257},{"id":258256},"messaging-fields",[258258],{"type":23,"value":258259},"Messaging Fields",{"type":17,"tag":239,"props":258261,"children":258263},{"id":258262},"field-channel_id-channels",[258264,258265,258270,258271],{"type":23,"value":256689},{"type":17,"tag":6121,"props":258266,"children":258268},{"className":258267},[],[258269],{"type":23,"value":130947},{"type":23,"value":98082},{"type":17,"tag":6121,"props":258272,"children":258274},{"className":258273},[],[258275],{"type":23,"value":33459},{"type":17,"tag":239,"props":258277,"children":258279},{"id":258278},"field-channel_ids-channels",[258280,258281,258286,258287],{"type":23,"value":256689},{"type":17,"tag":6121,"props":258282,"children":258284},{"className":258283},[],[258285],{"type":23,"value":177783},{"type":23,"value":98082},{"type":17,"tag":6121,"props":258288,"children":258290},{"className":258289},[],[258291],{"type":23,"value":33459},{"type":17,"tag":80,"props":258293,"children":258294},{},[258295],{"type":17,"tag":84,"props":258296,"children":258297},{},[258298,258300,258305,258307],{"type":23,"value":258299},"the reason was so we could include additional channel information, such as the channel ",{"type":17,"tag":6121,"props":258301,"children":258303},{"className":258302},[],[258304],{"type":23,"value":18781},{"type":23,"value":258306}," , as well as its ",{"type":17,"tag":6121,"props":258308,"children":258310},{"className":258309},[],[258311],{"type":23,"value":18766},{"type":17,"tag":29,"props":258313,"children":258314},{},[258315],{"type":17,"tag":48,"props":258316,"children":258317},{},[258318],{"type":23,"value":257399},{"type":17,"tag":80,"props":258320,"children":258321},{},[258322],{"type":17,"tag":84,"props":258323,"children":258324},{},[258325,258330,258331],{"type":17,"tag":6121,"props":258326,"children":258328},{"className":258327},[],[258329],{"type":23,"value":257683},{"type":23,"value":257257},{"type":17,"tag":6121,"props":258332,"children":258334},{"className":258333},[],[258335],{"type":23,"value":257418},{"type":17,"tag":29,"props":258337,"children":258338},{},[258339],{"type":17,"tag":48,"props":258340,"children":258341},{},[258342],{"type":23,"value":256837},{"type":17,"tag":6893,"props":258344,"children":258347},{"code":258345,"language":18718,"meta":7,"className":258346},"channel_id?: string; // @deprecated\n",[18716],[258348],{"type":17,"tag":6121,"props":258349,"children":258350},{"__ignoreMap":7},[258351],{"type":23,"value":258345},{"type":17,"tag":29,"props":258353,"children":258354},{},[258355],{"type":17,"tag":48,"props":258356,"children":258357},{},[258358],{"type":23,"value":256854},{"type":17,"tag":6893,"props":258360,"children":258363},{"code":258361,"language":18718,"meta":7,"className":258362},"channels?: IMessagingChannelMessage[]; // Represents the names of all channels to which the message is sent / belongs to\n",[18716],[258364],{"type":17,"tag":6121,"props":258365,"children":258366},{"__ignoreMap":7},[258367],{"type":23,"value":258361},{"type":17,"tag":29,"props":258369,"children":258370},{},[258371],{"type":17,"tag":48,"props":258372,"children":258373},{},[258374],{"type":23,"value":256871},{"type":17,"tag":80,"props":258376,"children":258377},{},[258378,258405,258420],{"type":17,"tag":84,"props":258379,"children":258380},{},[258381,258385,258386,258391,258393,258398,258399],{"type":17,"tag":48,"props":258382,"children":258383},{},[258384],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":258387,"children":258389},{"className":258388},[],[258390],{"type":23,"value":33459},{"type":23,"value":258392}," array instead of ",{"type":17,"tag":6121,"props":258394,"children":258396},{"className":258395},[],[258397],{"type":23,"value":130947},{"type":23,"value":75890},{"type":17,"tag":6121,"props":258400,"children":258402},{"className":258401},[],[258403],{"type":23,"value":258404},"channels_ids",{"type":17,"tag":84,"props":258406,"children":258407},{},[258408,258412,258413,258418],{"type":17,"tag":48,"props":258409,"children":258410},{},[258411],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":258414,"children":258416},{"className":258415},[],[258417],{"type":23,"value":33459},{"type":23,"value":258419}," array when creating messages",{"type":17,"tag":84,"props":258421,"children":258422},{},[258423,258428,258429,258434],{"type":17,"tag":48,"props":258424,"children":258425},{},[258426],{"type":23,"value":258427},"Multi-Channel Support:",{"type":23,"value":257157},{"type":17,"tag":6121,"props":258430,"children":258432},{"className":258431},[],[258433],{"type":23,"value":33459},{"type":23,"value":258435}," array supports messages posted to multiple channels (when the integration supports it)",{"type":17,"tag":29,"props":258437,"children":258438},{},[258439],{"type":17,"tag":48,"props":258440,"children":258441},{},[258442],{"type":23,"value":19878},{"type":17,"tag":6893,"props":258444,"children":258447},{"code":258445,"language":18718,"meta":7,"className":258446},"// Before\nconst message = {\n    message: 'Hello',\n    channel_id: 'channel_123',\n    channels_ids: [\"channel_123\"]\n}\n\n// After\nconst message = {\n    message: 'Hello',\n    channels: [{\n        id: 'channel_123',\n        name: 'General'\n    }]\n}\n",[18716],[258448],{"type":17,"tag":6121,"props":258449,"children":258450},{"__ignoreMap":7},[258451],{"type":23,"value":258445},{"type":17,"tag":25,"props":258453,"children":258454},{},[],{"type":17,"tag":239,"props":258456,"children":258458},{"id":258457},"field-root_message_id-removed",[258459,258460,258465],{"type":23,"value":256689},{"type":17,"tag":6121,"props":258461,"children":258463},{"className":258462},[],[258464],{"type":23,"value":130956},{"type":23,"value":258466}," → Removed",{"type":17,"tag":29,"props":258468,"children":258469},{},[258470],{"type":17,"tag":48,"props":258471,"children":258472},{},[258473],{"type":23,"value":257399},{"type":17,"tag":80,"props":258475,"children":258476},{},[258477],{"type":17,"tag":84,"props":258478,"children":258479},{},[258480],{"type":17,"tag":6121,"props":258481,"children":258483},{"className":258482},[],[258484],{"type":23,"value":257683},{"type":17,"tag":29,"props":258486,"children":258487},{},[258488],{"type":17,"tag":48,"props":258489,"children":258490},{},[258491],{"type":23,"value":256837},{"type":17,"tag":6893,"props":258493,"children":258496},{"code":258494,"language":18718,"meta":7,"className":258495},"root_message_id?: string; // @deprecated\n",[18716],[258497],{"type":17,"tag":6121,"props":258498,"children":258499},{"__ignoreMap":7},[258500],{"type":23,"value":258494},{"type":17,"tag":29,"props":258502,"children":258503},{},[258504],{"type":17,"tag":48,"props":258505,"children":258506},{},[258507],{"type":23,"value":256854},{"type":17,"tag":80,"props":258509,"children":258510},{},[258511],{"type":17,"tag":84,"props":258512,"children":258513},{},[258514,258516,258521],{"type":23,"value":258515},"No direct replacement. Use ",{"type":17,"tag":6121,"props":258517,"children":258519},{"className":258518},[],[258520],{"type":23,"value":15863},{"type":23,"value":258522}," to traverse the thread structure.",{"type":17,"tag":29,"props":258524,"children":258525},{},[258526],{"type":17,"tag":48,"props":258527,"children":258528},{},[258529],{"type":23,"value":256871},{"type":17,"tag":80,"props":258531,"children":258532},{},[258533,258554],{"type":17,"tag":84,"props":258534,"children":258535},{},[258536,258540,258542,258547,258549],{"type":17,"tag":48,"props":258537,"children":258538},{},[258539],{"type":23,"value":256882},{"type":23,"value":258541}," If you need to find the root message, traverse the ",{"type":17,"tag":6121,"props":258543,"children":258545},{"className":258544},[],[258546],{"type":23,"value":15863},{"type":23,"value":258548}," chain until you reach a message without a ",{"type":17,"tag":6121,"props":258550,"children":258552},{"className":258551},[],[258553],{"type":23,"value":15863},{"type":17,"tag":84,"props":258555,"children":258556},{},[258557,258561,258563,258568],{"type":17,"tag":48,"props":258558,"children":258559},{},[258560],{"type":23,"value":256904},{"type":23,"value":258562}," Remove references to ",{"type":17,"tag":6121,"props":258564,"children":258566},{"className":258565},[],[258567],{"type":23,"value":130956},{"type":23,"value":258569}," when creating messages",{"type":17,"tag":29,"props":258571,"children":258572},{},[258573],{"type":17,"tag":48,"props":258574,"children":258575},{},[258576],{"type":23,"value":19878},{"type":17,"tag":6893,"props":258578,"children":258581},{"code":258579,"language":18718,"meta":7,"className":258580},"// Before\nconst message = {\n    message: 'Reply',\n    parent_message_id: 'msg_123',\n    root_message_id: 'msg_1'\n}\n\n// After\nconst message = {\n    message: 'Reply',\n    parent_id: 'msg_123'\n    // root_message_id removed - traverse parent_id chain if needed\n}\n\n// Helper function to find root message\nfunction findRootMessage(message) {\n    while (message.parent_id) {\n        message = getMessage(message.parent_id);\n    }\n    return message;\n}\n",[18716],[258582],{"type":17,"tag":6121,"props":258583,"children":258584},{"__ignoreMap":7},[258585],{"type":23,"value":258579},{"type":17,"tag":25,"props":258587,"children":258588},{},[],{"type":17,"tag":68,"props":258590,"children":258592},{"id":258591},"accounting-fields",[258593],{"type":23,"value":256640},{"type":17,"tag":239,"props":258595,"children":258597},{"id":258596},"field-invoice_at-posted_at",[258598,258599,258605,258606],{"type":23,"value":256689},{"type":17,"tag":6121,"props":258600,"children":258602},{"className":258601},[],[258603],{"type":23,"value":258604},"invoice_at",{"type":23,"value":98082},{"type":17,"tag":6121,"props":258607,"children":258609},{"className":258608},[],[258610],{"type":23,"value":187836},{"type":17,"tag":29,"props":258612,"children":258613},{},[258614],{"type":17,"tag":48,"props":258615,"children":258616},{},[258617],{"type":23,"value":257399},{"type":17,"tag":80,"props":258619,"children":258620},{},[258621],{"type":17,"tag":84,"props":258622,"children":258623},{},[258624],{"type":17,"tag":6121,"props":258625,"children":258627},{"className":258626},[],[258628],{"type":23,"value":258629},"IAccountingInvoice",{"type":17,"tag":29,"props":258631,"children":258632},{},[258633],{"type":17,"tag":48,"props":258634,"children":258635},{},[258636],{"type":23,"value":256837},{"type":17,"tag":6893,"props":258638,"children":258641},{"code":258639,"language":18718,"meta":7,"className":258640},"invoice_at?: (string | Date | number); // @deprecated; use posted_at\n",[18716],[258642],{"type":17,"tag":6121,"props":258643,"children":258644},{"__ignoreMap":7},[258645],{"type":23,"value":258639},{"type":17,"tag":29,"props":258647,"children":258648},{},[258649],{"type":17,"tag":48,"props":258650,"children":258651},{},[258652],{"type":23,"value":256854},{"type":17,"tag":6893,"props":258654,"children":258657},{"code":258655,"language":18718,"meta":7,"className":258656},"posted_at?: (string | Date | number);\n",[18716],[258658],{"type":17,"tag":6121,"props":258659,"children":258660},{"__ignoreMap":7},[258661],{"type":23,"value":258655},{"type":17,"tag":29,"props":258663,"children":258664},{},[258665],{"type":17,"tag":48,"props":258666,"children":258667},{},[258668],{"type":23,"value":256871},{"type":17,"tag":80,"props":258670,"children":258671},{},[258672,258693,258708],{"type":17,"tag":84,"props":258673,"children":258674},{},[258675,258679,258680,258685,258686,258691],{"type":17,"tag":48,"props":258676,"children":258677},{},[258678],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":258681,"children":258683},{"className":258682},[],[258684],{"type":23,"value":187836},{"type":23,"value":256913},{"type":17,"tag":6121,"props":258687,"children":258689},{"className":258688},[],[258690],{"type":23,"value":258604},{"type":23,"value":258692}," when reading invoice objects",{"type":17,"tag":84,"props":258694,"children":258695},{},[258696,258700,258701,258706],{"type":17,"tag":48,"props":258697,"children":258698},{},[258699],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":258702,"children":258704},{"className":258703},[],[258705],{"type":23,"value":187836},{"type":23,"value":258707}," when creating or updating invoices",{"type":17,"tag":84,"props":258709,"children":258710},{},[258711,258716,258718,258723],{"type":17,"tag":48,"props":258712,"children":258713},{},[258714],{"type":23,"value":258715},"Consistency:",{"type":23,"value":258717}," This change aligns with other accounting objects that use ",{"type":17,"tag":6121,"props":258719,"children":258721},{"className":258720},[],[258722],{"type":23,"value":187836},{"type":23,"value":258724}," for transaction dates",{"type":17,"tag":29,"props":258726,"children":258727},{},[258728],{"type":17,"tag":48,"props":258729,"children":258730},{},[258731],{"type":23,"value":19878},{"type":17,"tag":6893,"props":258733,"children":258736},{"code":258734,"language":18718,"meta":7,"className":258735},"// Before\nconst invoice = {\n    invoice_number: 'INV-001',\n    invoice_at: '2024-01-15'\n}\n\n// After\nconst invoice = {\n    invoice_number: 'INV-001',\n    posted_at: '2024-01-15'\n}\n",[18716],[258737],{"type":17,"tag":6121,"props":258738,"children":258739},{"__ignoreMap":7},[258740],{"type":23,"value":258734},{"type":17,"tag":25,"props":258742,"children":258743},{},[],{"type":17,"tag":239,"props":258745,"children":258747},{"id":258746},"field-type-removed",[258748,258749,258754],{"type":23,"value":256689},{"type":17,"tag":6121,"props":258750,"children":258752},{"className":258751},[],[258753],{"type":23,"value":27310},{"type":23,"value":258466},{"type":17,"tag":29,"props":258756,"children":258757},{},[258758],{"type":17,"tag":48,"props":258759,"children":258760},{},[258761],{"type":23,"value":257399},{"type":17,"tag":80,"props":258763,"children":258764},{},[258765],{"type":17,"tag":84,"props":258766,"children":258767},{},[258768],{"type":17,"tag":6121,"props":258769,"children":258771},{"className":258770},[],[258772],{"type":23,"value":258629},{"type":17,"tag":29,"props":258774,"children":258775},{},[258776],{"type":17,"tag":48,"props":258777,"children":258778},{},[258779],{"type":23,"value":256837},{"type":17,"tag":6893,"props":258781,"children":258784},{"code":258782,"language":18718,"meta":7,"className":258783},"type?: TAccountingInvoiceType; // @deprecated\n",[18716],[258785],{"type":17,"tag":6121,"props":258786,"children":258787},{"__ignoreMap":7},[258788],{"type":23,"value":258782},{"type":17,"tag":29,"props":258790,"children":258791},{},[258792],{"type":17,"tag":48,"props":258793,"children":258794},{},[258795],{"type":23,"value":256854},{"type":17,"tag":80,"props":258797,"children":258798},{},[258799],{"type":17,"tag":84,"props":258800,"children":258801},{},[258802],{"type":23,"value":258803},"No direct replacement. Bills are now found in the AccountingBill object, while invoices are solely in the AccountingInvoice object.",{"type":17,"tag":29,"props":258805,"children":258806},{},[258807],{"type":17,"tag":48,"props":258808,"children":258809},{},[258810],{"type":23,"value":256871},{"type":17,"tag":80,"props":258812,"children":258813},{},[258814,258830],{"type":17,"tag":84,"props":258815,"children":258816},{},[258817,258821,258823,258829],{"type":17,"tag":48,"props":258818,"children":258819},{},[258820],{"type":23,"value":256882},{"type":23,"value":258822}," Remove dependencies on ",{"type":17,"tag":6121,"props":258824,"children":258826},{"className":258825},[],[258827],{"type":23,"value":258828},"invoice.type",{"type":23,"value":187853},{"type":17,"tag":84,"props":258831,"children":258832},{},[258833,258838],{"type":17,"tag":48,"props":258834,"children":258835},{},[258836],{"type":23,"value":258837},"Alternative:",{"type":23,"value":258839}," Bills are now found in the AccountingBill object, while invoices are solely in the AccountingInvoice object.",{"type":17,"tag":25,"props":258841,"children":258842},{},[],{"type":17,"tag":239,"props":258844,"children":258846},{"id":258845},"field-contact_id-contacts",[258847,258848,258853,258854],{"type":23,"value":256689},{"type":17,"tag":6121,"props":258849,"children":258851},{"className":258850},[],[258852],{"type":23,"value":26302},{"type":23,"value":98082},{"type":17,"tag":6121,"props":258855,"children":258857},{"className":258856},[],[258858],{"type":23,"value":30404},{"type":17,"tag":29,"props":258860,"children":258861},{},[258862],{"type":17,"tag":48,"props":258863,"children":258864},{},[258865],{"type":23,"value":257399},{"type":17,"tag":80,"props":258867,"children":258868},{},[258869],{"type":17,"tag":84,"props":258870,"children":258871},{},[258872,258878,258879],{"type":17,"tag":6121,"props":258873,"children":258875},{"className":258874},[],[258876],{"type":23,"value":258877},"IAccountingTransaction",{"type":23,"value":257257},{"type":17,"tag":6121,"props":258880,"children":258882},{"className":258881},[],[258883],{"type":23,"value":258884},"src/models/UnifiedAccounting.ts",{"type":17,"tag":29,"props":258886,"children":258887},{},[258888],{"type":17,"tag":48,"props":258889,"children":258890},{},[258891],{"type":23,"value":256837},{"type":17,"tag":6893,"props":258893,"children":258896},{"code":258894,"language":18718,"meta":7,"className":258895},"contact_id?: string; // @deprecated; use contacts\n",[18716],[258897],{"type":17,"tag":6121,"props":258898,"children":258899},{"__ignoreMap":7},[258900],{"type":23,"value":258894},{"type":17,"tag":29,"props":258902,"children":258903},{},[258904],{"type":17,"tag":48,"props":258905,"children":258906},{},[258907],{"type":23,"value":256854},{"type":17,"tag":6893,"props":258909,"children":258912},{"code":258910,"language":18718,"meta":7,"className":258911},"contacts?: IAccountingTransactionContact[];\n",[18716],[258913],{"type":17,"tag":6121,"props":258914,"children":258915},{"__ignoreMap":7},[258916],{"type":23,"value":258910},{"type":17,"tag":29,"props":258918,"children":258919},{},[258920],{"type":17,"tag":48,"props":258921,"children":258922},{},[258923],{"type":23,"value":256871},{"type":17,"tag":80,"props":258925,"children":258926},{},[258927,258946,258967,258983],{"type":17,"tag":84,"props":258928,"children":258929},{},[258930,258934,258935,258940,258941],{"type":17,"tag":48,"props":258931,"children":258932},{},[258933],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":258936,"children":258938},{"className":258937},[],[258939],{"type":23,"value":30404},{"type":23,"value":258392},{"type":17,"tag":6121,"props":258942,"children":258944},{"className":258943},[],[258945],{"type":23,"value":26302},{"type":17,"tag":84,"props":258947,"children":258948},{},[258949,258953,258954,258959,258961,258966],{"type":17,"tag":48,"props":258950,"children":258951},{},[258952],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":258955,"children":258957},{"className":258956},[],[258958],{"type":23,"value":30404},{"type":23,"value":258960}," array when creating transactions, but just include an ",{"type":17,"tag":6121,"props":258962,"children":258964},{"className":258963},[],[258965],{"type":23,"value":18766},{"type":23,"value":187853},{"type":17,"tag":84,"props":258968,"children":258969},{},[258970,258975,258976,258981],{"type":17,"tag":48,"props":258971,"children":258972},{},[258973],{"type":23,"value":258974},"Multi-Contact Support:",{"type":23,"value":257157},{"type":17,"tag":6121,"props":258977,"children":258979},{"className":258978},[],[258980],{"type":23,"value":30404},{"type":23,"value":258982}," array supports multiple contacts per transaction (when the integration supports multiple contacts)",{"type":17,"tag":84,"props":258984,"children":258985},{},[258986,258990],{"type":17,"tag":48,"props":258987,"children":258988},{},[258989],{"type":23,"value":258226},{"type":23,"value":258991}," Provides contact names and emails, not just IDs",{"type":17,"tag":29,"props":258993,"children":258994},{},[258995],{"type":17,"tag":48,"props":258996,"children":258997},{},[258998],{"type":23,"value":19878},{"type":17,"tag":6893,"props":259000,"children":259003},{"code":259001,"language":18718,"meta":7,"className":259002},"// Before\nconst transaction = {\n    total_amount: 1000,\n    contact_id: 'contact_123'\n}\n\n// After\nconst transaction = {\n    total_amount: 1000,\n    contacts: [{\n        id: 'contact_123',\n        name: 'Acme Corp',\n        emails: [{\n            email: 'billing@acme.com'\n        }]\n    }]\n}\n",[18716],[259004],{"type":17,"tag":6121,"props":259005,"children":259006},{"__ignoreMap":7},[259007],{"type":23,"value":259001},{"type":17,"tag":25,"props":259009,"children":259010},{},[],{"type":17,"tag":239,"props":259012,"children":259014},{"id":259013},"field-income-income_sections",[259015,259016,259022,259023],{"type":23,"value":256689},{"type":17,"tag":6121,"props":259017,"children":259019},{"className":259018},[],[259020],{"type":23,"value":259021},"income",{"type":23,"value":98082},{"type":17,"tag":6121,"props":259024,"children":259026},{"className":259025},[],[259027],{"type":23,"value":259028},"income_sections",{"type":17,"tag":29,"props":259030,"children":259031},{},[259032],{"type":17,"tag":48,"props":259033,"children":259034},{},[259035],{"type":23,"value":257399},{"type":17,"tag":80,"props":259037,"children":259038},{},[259039],{"type":17,"tag":84,"props":259040,"children":259041},{},[259042,259048,259049],{"type":17,"tag":6121,"props":259043,"children":259045},{"className":259044},[],[259046],{"type":23,"value":259047},"IAccountingProfitloss",{"type":23,"value":257257},{"type":17,"tag":6121,"props":259050,"children":259052},{"className":259051},[],[259053],{"type":23,"value":258884},{"type":17,"tag":29,"props":259055,"children":259056},{},[259057],{"type":17,"tag":48,"props":259058,"children":259059},{},[259060],{"type":23,"value":256837},{"type":17,"tag":6893,"props":259062,"children":259065},{"code":259063,"language":18718,"meta":7,"className":259064},"income?: IAccountingProfitlossCategory[]; // @deprecated – use income_sections instead\n",[18716],[259066],{"type":17,"tag":6121,"props":259067,"children":259068},{"__ignoreMap":7},[259069],{"type":23,"value":259063},{"type":17,"tag":29,"props":259071,"children":259072},{},[259073],{"type":17,"tag":48,"props":259074,"children":259075},{},[259076],{"type":23,"value":256854},{"type":17,"tag":6893,"props":259078,"children":259081},{"code":259079,"language":18718,"meta":7,"className":259080},"income_sections?: IAccountingProfitlossSection[];\n",[18716],[259082],{"type":17,"tag":6121,"props":259083,"children":259084},{"__ignoreMap":7},[259085],{"type":23,"value":259079},{"type":17,"tag":29,"props":259087,"children":259088},{},[259089],{"type":17,"tag":48,"props":259090,"children":259091},{},[259092],{"type":23,"value":256871},{"type":17,"tag":80,"props":259094,"children":259095},{},[259096,259115,259130],{"type":17,"tag":84,"props":259097,"children":259098},{},[259099,259103,259104,259109,259110],{"type":17,"tag":48,"props":259100,"children":259101},{},[259102],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259105,"children":259107},{"className":259106},[],[259108],{"type":23,"value":259028},{"type":23,"value":256913},{"type":17,"tag":6121,"props":259111,"children":259113},{"className":259112},[],[259114],{"type":23,"value":259021},{"type":17,"tag":84,"props":259116,"children":259117},{},[259118,259122,259123,259128],{"type":17,"tag":48,"props":259119,"children":259120},{},[259121],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259124,"children":259126},{"className":259125},[],[259127],{"type":23,"value":259028},{"type":23,"value":259129}," when creating profit/loss reports",{"type":17,"tag":84,"props":259131,"children":259132},{},[259133,259138,259140,259145],{"type":17,"tag":48,"props":259134,"children":259135},{},[259136],{"type":23,"value":259137},"Enhanced Structure:",{"type":23,"value":259139}," The new ",{"type":17,"tag":6121,"props":259141,"children":259143},{"className":259142},[],[259144],{"type":23,"value":259028},{"type":23,"value":259146}," provides a more structured format with better categorization",{"type":17,"tag":29,"props":259148,"children":259149},{},[259150],{"type":17,"tag":48,"props":259151,"children":259152},{},[259153],{"type":23,"value":19878},{"type":17,"tag":6893,"props":259155,"children":259158},{"code":259156,"language":18718,"meta":7,"className":259157},"// Before\nconst profitloss = {\n    start_at: '2024-01-01',\n    end_at: '2024-12-31',\n    income: [{\n        name: 'Sales',\n        amount: 100000\n    }]\n}\n\n// After\nconst profitloss = {\n    start_at: '2024-01-01',\n    end_at: '2024-12-31',\n    income_sections: [{\n        name: 'Sales',\n        accounts: [{\n            name: 'Product Sales',\n            amount: 100000\n        }]\n    }]\n}\n",[18716],[259159],{"type":17,"tag":6121,"props":259160,"children":259161},{"__ignoreMap":7},[259162],{"type":23,"value":259156},{"type":17,"tag":25,"props":259164,"children":259165},{},[],{"type":17,"tag":239,"props":259167,"children":259169},{"id":259168},"fieldexpenses-expenses_sections",[259170,259171,259176,259177],{"type":23,"value":257963},{"type":17,"tag":6121,"props":259172,"children":259174},{"className":259173},[],[259175],{"type":23,"value":82484},{"type":23,"value":98082},{"type":17,"tag":6121,"props":259178,"children":259180},{"className":259179},[],[259181],{"type":23,"value":259182},"expenses_sections",{"type":17,"tag":29,"props":259184,"children":259185},{},[259186],{"type":17,"tag":48,"props":259187,"children":259188},{},[259189],{"type":23,"value":257399},{"type":17,"tag":80,"props":259191,"children":259192},{},[259193],{"type":17,"tag":84,"props":259194,"children":259195},{},[259196],{"type":17,"tag":6121,"props":259197,"children":259199},{"className":259198},[],[259200],{"type":23,"value":259047},{"type":17,"tag":29,"props":259202,"children":259203},{},[259204],{"type":17,"tag":48,"props":259205,"children":259206},{},[259207],{"type":23,"value":256837},{"type":17,"tag":6893,"props":259209,"children":259212},{"code":259210,"language":18718,"meta":7,"className":259211},"expenses?: IAccountingProfitlossCategory[]; // @deprecated – use expenses_sections instead\n",[18716],[259213],{"type":17,"tag":6121,"props":259214,"children":259215},{"__ignoreMap":7},[259216],{"type":23,"value":259210},{"type":17,"tag":29,"props":259218,"children":259219},{},[259220],{"type":17,"tag":48,"props":259221,"children":259222},{},[259223],{"type":23,"value":256854},{"type":17,"tag":6893,"props":259225,"children":259228},{"code":259226,"language":18718,"meta":7,"className":259227},"expenses_sections?: IAccountingProfitlossSection[];\n",[18716],[259229],{"type":17,"tag":6121,"props":259230,"children":259231},{"__ignoreMap":7},[259232],{"type":23,"value":259226},{"type":17,"tag":29,"props":259234,"children":259235},{},[259236],{"type":17,"tag":48,"props":259237,"children":259238},{},[259239],{"type":23,"value":256871},{"type":17,"tag":80,"props":259241,"children":259242},{},[259243,259262],{"type":17,"tag":84,"props":259244,"children":259245},{},[259246,259250,259251,259256,259257],{"type":17,"tag":48,"props":259247,"children":259248},{},[259249],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259252,"children":259254},{"className":259253},[],[259255],{"type":23,"value":259182},{"type":23,"value":256913},{"type":17,"tag":6121,"props":259258,"children":259260},{"className":259259},[],[259261],{"type":23,"value":82484},{"type":17,"tag":84,"props":259263,"children":259264},{},[259265,259269,259270,259275],{"type":17,"tag":48,"props":259266,"children":259267},{},[259268],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259271,"children":259273},{"className":259272},[],[259274],{"type":23,"value":259182},{"type":23,"value":259129},{"type":17,"tag":29,"props":259277,"children":259278},{},[259279],{"type":17,"tag":48,"props":259280,"children":259281},{},[259282],{"type":23,"value":19878},{"type":17,"tag":6893,"props":259284,"children":259287},{"code":259285,"language":18718,"meta":7,"className":259286},"// Before\nconst profitloss = {\n    expenses: [{\n        name: 'Operating Expenses',\n        amount: 50000\n    }]\n}\n\n// After\nconst profitloss = {\n    expenses_sections: [{\n        name: 'Operating Expenses',\n        accounts: [{\n            name: 'Salaries',\n            amount: 50000\n        }]\n    }]\n}\n",[18716],[259288],{"type":17,"tag":6121,"props":259289,"children":259290},{"__ignoreMap":7},[259291],{"type":23,"value":259285},{"type":17,"tag":25,"props":259293,"children":259294},{},[],{"type":17,"tag":239,"props":259296,"children":259298},{"id":259297},"fieldcost_of_goods_sold-cost_of_goods_sold_sections",[259299,259300,259306,259307],{"type":23,"value":257963},{"type":17,"tag":6121,"props":259301,"children":259303},{"className":259302},[],[259304],{"type":23,"value":259305},"cost_of_goods_sold",{"type":23,"value":98082},{"type":17,"tag":6121,"props":259308,"children":259310},{"className":259309},[],[259311],{"type":23,"value":259312},"cost_of_goods_sold_sections",{"type":17,"tag":29,"props":259314,"children":259315},{},[259316],{"type":17,"tag":48,"props":259317,"children":259318},{},[259319],{"type":23,"value":257399},{"type":17,"tag":80,"props":259321,"children":259322},{},[259323],{"type":17,"tag":84,"props":259324,"children":259325},{},[259326],{"type":17,"tag":6121,"props":259327,"children":259329},{"className":259328},[],[259330],{"type":23,"value":259047},{"type":17,"tag":29,"props":259332,"children":259333},{},[259334],{"type":17,"tag":48,"props":259335,"children":259336},{},[259337],{"type":23,"value":256837},{"type":17,"tag":6893,"props":259339,"children":259342},{"code":259340,"language":18718,"meta":7,"className":259341},"cost_of_goods_sold?: IAccountingProfitlossCategory[]; // @deprecated – use cost_of_goods_sold_sections instead\n",[18716],[259343],{"type":17,"tag":6121,"props":259344,"children":259345},{"__ignoreMap":7},[259346],{"type":23,"value":259340},{"type":17,"tag":29,"props":259348,"children":259349},{},[259350],{"type":17,"tag":48,"props":259351,"children":259352},{},[259353],{"type":23,"value":256854},{"type":17,"tag":6893,"props":259355,"children":259358},{"code":259356,"language":18718,"meta":7,"className":259357},"cost_of_goods_sold_sections?: IAccountingProfitlossSection[];\n",[18716],[259359],{"type":17,"tag":6121,"props":259360,"children":259361},{"__ignoreMap":7},[259362],{"type":23,"value":259356},{"type":17,"tag":29,"props":259364,"children":259365},{},[259366],{"type":17,"tag":48,"props":259367,"children":259368},{},[259369],{"type":23,"value":256871},{"type":17,"tag":80,"props":259371,"children":259372},{},[259373,259392],{"type":17,"tag":84,"props":259374,"children":259375},{},[259376,259380,259381,259386,259387],{"type":17,"tag":48,"props":259377,"children":259378},{},[259379],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259382,"children":259384},{"className":259383},[],[259385],{"type":23,"value":259312},{"type":23,"value":256913},{"type":17,"tag":6121,"props":259388,"children":259390},{"className":259389},[],[259391],{"type":23,"value":259305},{"type":17,"tag":84,"props":259393,"children":259394},{},[259395,259399,259400,259405],{"type":17,"tag":48,"props":259396,"children":259397},{},[259398],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259401,"children":259403},{"className":259402},[],[259404],{"type":23,"value":259312},{"type":23,"value":259129},{"type":17,"tag":29,"props":259407,"children":259408},{},[259409],{"type":17,"tag":48,"props":259410,"children":259411},{},[259412],{"type":23,"value":19878},{"type":17,"tag":6893,"props":259414,"children":259417},{"code":259415,"language":18718,"meta":7,"className":259416},"// Before\nconst profitloss = {\n    cost_of_goods_sold: [{\n        name: 'Materials',\n        amount: 30000\n    }]\n}\n\n// After\nconst profitloss = {\n    cost_of_goods_sold_sections: [{\n        name: 'Materials',\n        accounts: [{\n            name: 'Raw Materials',\n            amount: 30000\n        }]\n    }]\n}\n",[18716],[259418],{"type":17,"tag":6121,"props":259419,"children":259420},{"__ignoreMap":7},[259421],{"type":23,"value":259415},{"type":17,"tag":25,"props":259423,"children":259424},{},[],{"type":17,"tag":239,"props":259426,"children":259428},{"id":259427},"fieldgross_profit_amount-calculate-from-income_total_amount-and-cost_of_goods_sold_total_amount",[259429,259430,259436,259438,259443,259444],{"type":23,"value":257963},{"type":17,"tag":6121,"props":259431,"children":259433},{"className":259432},[],[259434],{"type":23,"value":259435},"gross_profit_amount",{"type":23,"value":259437}," → Calculate from ",{"type":17,"tag":6121,"props":259439,"children":259441},{"className":259440},[],[259442],{"type":23,"value":220140},{"type":23,"value":34435},{"type":17,"tag":6121,"props":259445,"children":259447},{"className":259446},[],[259448],{"type":23,"value":259449},"cost_of_goods_sold_total_amount",{"type":17,"tag":29,"props":259451,"children":259452},{},[259453],{"type":17,"tag":48,"props":259454,"children":259455},{},[259456],{"type":23,"value":257399},{"type":17,"tag":80,"props":259458,"children":259459},{},[259460],{"type":17,"tag":84,"props":259461,"children":259462},{},[259463],{"type":17,"tag":6121,"props":259464,"children":259466},{"className":259465},[],[259467],{"type":23,"value":259047},{"type":17,"tag":29,"props":259469,"children":259470},{},[259471],{"type":17,"tag":48,"props":259472,"children":259473},{},[259474],{"type":23,"value":256837},{"type":17,"tag":6893,"props":259476,"children":259479},{"code":259477,"language":18718,"meta":7,"className":259478},"gross_profit_amount?: number; // @deprecated – compute using income_total_amount - cost_of_goods_sold_total_amount\n",[18716],[259480],{"type":17,"tag":6121,"props":259481,"children":259482},{"__ignoreMap":7},[259483],{"type":23,"value":259477},{"type":17,"tag":29,"props":259485,"children":259486},{},[259487],{"type":17,"tag":48,"props":259488,"children":259489},{},[259490],{"type":23,"value":256854},{"type":17,"tag":6893,"props":259492,"children":259495},{"code":259493,"language":18718,"meta":7,"className":259494},"gross_profit_amount = income_total_amount - cost_of_goods_sold_total_amount\n",[18716],[259496],{"type":17,"tag":6121,"props":259497,"children":259498},{"__ignoreMap":7},[259499],{"type":23,"value":259493},{"type":17,"tag":29,"props":259501,"children":259502},{},[259503],{"type":17,"tag":48,"props":259504,"children":259505},{},[259506],{"type":23,"value":256871},{"type":17,"tag":80,"props":259508,"children":259509},{},[259510,259531],{"type":17,"tag":84,"props":259511,"children":259512},{},[259513,259517,259519,259524,259525],{"type":17,"tag":48,"props":259514,"children":259515},{},[259516],{"type":23,"value":256882},{"type":23,"value":259518}," Calculate ",{"type":17,"tag":6121,"props":259520,"children":259522},{"className":259521},[],[259523],{"type":23,"value":259435},{"type":23,"value":238257},{"type":17,"tag":6121,"props":259526,"children":259528},{"className":259527},[],[259529],{"type":23,"value":259530},"income_total_amount - cost_of_goods_sold_total_amount",{"type":17,"tag":84,"props":259532,"children":259533},{},[259534,259538,259540,259545],{"type":17,"tag":48,"props":259535,"children":259536},{},[259537],{"type":23,"value":256904},{"type":23,"value":259539}," Do not set ",{"type":17,"tag":6121,"props":259541,"children":259543},{"className":259542},[],[259544],{"type":23,"value":259435},{"type":23,"value":245906},{"type":17,"tag":29,"props":259547,"children":259548},{},[259549],{"type":17,"tag":48,"props":259550,"children":259551},{},[259552],{"type":23,"value":19878},{"type":17,"tag":6893,"props":259554,"children":259557},{"code":259555,"language":18718,"meta":7,"className":259556},"// Before\nconst profitloss = {\n    income_total_amount: 100000,\n    cost_of_goods_sold_total_amount: 30000,\n    gross_profit_amount: 70000\n}\n\n// After\nconst profitloss = {\n    income_total_amount: 100000,\n    cost_of_goods_sold_total_amount: 30000\n    // gross_profit_amount removed - calculate it\n}\n\n// Calculate gross profit\nconst gross_profit_amount = profitloss.income_total_amount - profitloss.cost_of_goods_sold_total_amount;\n",[18716],[259558],{"type":17,"tag":6121,"props":259559,"children":259560},{"__ignoreMap":7},[259561],{"type":23,"value":259555},{"type":17,"tag":25,"props":259563,"children":259564},{},[],{"type":17,"tag":239,"props":259566,"children":259568},{"id":259567},"field-net_profit_amount-net_income_amount",[259569,259570,259576,259577],{"type":23,"value":256689},{"type":17,"tag":6121,"props":259571,"children":259573},{"className":259572},[],[259574],{"type":23,"value":259575},"net_profit_amount",{"type":23,"value":98082},{"type":17,"tag":6121,"props":259578,"children":259580},{"className":259579},[],[259581],{"type":23,"value":220158},{"type":17,"tag":29,"props":259583,"children":259584},{},[259585],{"type":17,"tag":48,"props":259586,"children":259587},{},[259588],{"type":23,"value":257399},{"type":17,"tag":80,"props":259590,"children":259591},{},[259592],{"type":17,"tag":84,"props":259593,"children":259594},{},[259595],{"type":17,"tag":6121,"props":259596,"children":259598},{"className":259597},[],[259599],{"type":23,"value":259047},{"type":17,"tag":29,"props":259601,"children":259602},{},[259603],{"type":17,"tag":48,"props":259604,"children":259605},{},[259606],{"type":23,"value":256837},{"type":17,"tag":6893,"props":259608,"children":259611},{"code":259609,"language":18718,"meta":7,"className":259610},"net_profit_amount?: number; // @deprecated – use net_income_amount instead\n",[18716],[259612],{"type":17,"tag":6121,"props":259613,"children":259614},{"__ignoreMap":7},[259615],{"type":23,"value":259609},{"type":17,"tag":29,"props":259617,"children":259618},{},[259619],{"type":17,"tag":48,"props":259620,"children":259621},{},[259622],{"type":23,"value":256854},{"type":17,"tag":6893,"props":259624,"children":259627},{"code":259625,"language":18718,"meta":7,"className":259626},"net_income_amount?: number;\n",[18716],[259628],{"type":17,"tag":6121,"props":259629,"children":259630},{"__ignoreMap":7},[259631],{"type":23,"value":259625},{"type":17,"tag":29,"props":259633,"children":259634},{},[259635],{"type":17,"tag":48,"props":259636,"children":259637},{},[259638],{"type":23,"value":256871},{"type":17,"tag":80,"props":259640,"children":259641},{},[259642,259661],{"type":17,"tag":84,"props":259643,"children":259644},{},[259645,259649,259650,259655,259656],{"type":17,"tag":48,"props":259646,"children":259647},{},[259648],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259651,"children":259653},{"className":259652},[],[259654],{"type":23,"value":220158},{"type":23,"value":256913},{"type":17,"tag":6121,"props":259657,"children":259659},{"className":259658},[],[259660],{"type":23,"value":259575},{"type":17,"tag":84,"props":259662,"children":259663},{},[259664,259668,259669,259674],{"type":17,"tag":48,"props":259665,"children":259666},{},[259667],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259670,"children":259672},{"className":259671},[],[259673],{"type":23,"value":220158},{"type":23,"value":259129},{"type":17,"tag":29,"props":259676,"children":259677},{},[259678],{"type":17,"tag":48,"props":259679,"children":259680},{},[259681],{"type":23,"value":19878},{"type":17,"tag":6893,"props":259683,"children":259686},{"code":259684,"language":18718,"meta":7,"className":259685},"// Before\nconst profitloss = {\n    net_profit_amount: 50000\n}\n\n// After\nconst profitloss = {\n    net_income_amount: 50000\n}\n",[18716],[259687],{"type":17,"tag":6121,"props":259688,"children":259689},{"__ignoreMap":7},[259690],{"type":23,"value":259684},{"type":17,"tag":25,"props":259692,"children":259693},{},[],{"type":17,"tag":239,"props":259695,"children":259697},{"id":259696},"field-iaccountingprofitlosscategory-and-iaccountingprofitlosssubcategory-deprecated-types",[259698,259699,259705,259706,259712],{"type":23,"value":256689},{"type":17,"tag":6121,"props":259700,"children":259702},{"className":259701},[],[259703],{"type":23,"value":259704},"IAccountingProfitlossCategory",{"type":23,"value":34435},{"type":17,"tag":6121,"props":259707,"children":259709},{"className":259708},[],[259710],{"type":23,"value":259711},"IAccountingProfitlossSubcategory",{"type":23,"value":259713}," → Deprecated Types",{"type":17,"tag":29,"props":259715,"children":259716},{},[259717],{"type":17,"tag":48,"props":259718,"children":259719},{},[259720],{"type":23,"value":259721},"Deprecated Types:",{"type":17,"tag":80,"props":259723,"children":259724},{},[259725,259735],{"type":17,"tag":84,"props":259726,"children":259727},{},[259728,259733],{"type":17,"tag":6121,"props":259729,"children":259731},{"className":259730},[],[259732],{"type":23,"value":259704},{"type":23,"value":259734}," - @deprecated",{"type":17,"tag":84,"props":259736,"children":259737},{},[259738,259743],{"type":17,"tag":6121,"props":259739,"children":259741},{"className":259740},[],[259742],{"type":23,"value":259711},{"type":23,"value":259734},{"type":17,"tag":29,"props":259745,"children":259746},{},[259747],{"type":17,"tag":48,"props":259748,"children":259749},{},[259750],{"type":23,"value":256854},{"type":17,"tag":80,"props":259752,"children":259753},{},[259754],{"type":17,"tag":84,"props":259755,"children":259756},{},[259757,259758,259764],{"type":23,"value":33722},{"type":17,"tag":6121,"props":259759,"children":259761},{"className":259760},[],[259762],{"type":23,"value":259763},"IAccountingProfitlossSection",{"type":23,"value":259765}," instead",{"type":17,"tag":29,"props":259767,"children":259768},{},[259769],{"type":17,"tag":48,"props":259770,"children":259771},{},[259772],{"type":23,"value":256871},{"type":17,"tag":80,"props":259774,"children":259775},{},[259776,259791],{"type":17,"tag":84,"props":259777,"children":259778},{},[259779,259784,259786],{"type":17,"tag":48,"props":259780,"children":259781},{},[259782],{"type":23,"value":259783},"Type Definitions:",{"type":23,"value":259785}," Update TypeScript interfaces to use ",{"type":17,"tag":6121,"props":259787,"children":259789},{"className":259788},[],[259790],{"type":23,"value":259763},{"type":17,"tag":84,"props":259792,"children":259793},{},[259794,259798,259799,259804,259805,259810,259811,259816],{"type":17,"tag":48,"props":259795,"children":259796},{},[259797],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259800,"children":259802},{"className":259801},[],[259803],{"type":23,"value":259028},{"type":23,"value":11826},{"type":17,"tag":6121,"props":259806,"children":259808},{"className":259807},[],[259809],{"type":23,"value":259182},{"type":23,"value":12561},{"type":17,"tag":6121,"props":259812,"children":259814},{"className":259813},[],[259815],{"type":23,"value":259312},{"type":23,"value":259817}," which use the new section structure",{"type":17,"tag":29,"props":259819,"children":259820},{},[259821],{"type":17,"tag":48,"props":259822,"children":259823},{},[259824],{"type":23,"value":19878},{"type":17,"tag":6893,"props":259826,"children":259829},{"code":259827,"language":18718,"meta":7,"className":259828},"// Before\ninterface Profitloss {\n    income?: IAccountingProfitlossCategory[];\n}\n\n// After\ninterface Profitloss {\n    income_sections?: IAccountingProfitlossSection[];\n}\n",[18716],[259830],{"type":17,"tag":6121,"props":259831,"children":259832},{"__ignoreMap":7},[259833],{"type":23,"value":259827},{"type":17,"tag":25,"props":259835,"children":259836},{},[],{"type":17,"tag":68,"props":259838,"children":259840},{"id":259839},"ats-applicant-tracking-system-fields",[259841],{"type":23,"value":256645},{"type":17,"tag":239,"props":259843,"children":259845},{"id":259844},"fielddocument_id-document_ids",[259846,259847,259852,259853],{"type":23,"value":257963},{"type":17,"tag":6121,"props":259848,"children":259850},{"className":259849},[],[259851],{"type":23,"value":168063},{"type":23,"value":98082},{"type":17,"tag":6121,"props":259854,"children":259856},{"className":259855},[],[259857],{"type":23,"value":259858},"document_ids",{"type":17,"tag":29,"props":259860,"children":259861},{},[259862],{"type":17,"tag":48,"props":259863,"children":259864},{},[259865],{"type":23,"value":257399},{"type":17,"tag":80,"props":259867,"children":259868},{},[259869],{"type":17,"tag":84,"props":259870,"children":259871},{},[259872,259878,259879],{"type":17,"tag":6121,"props":259873,"children":259875},{"className":259874},[],[259876],{"type":23,"value":259877},"IAtsActivity",{"type":23,"value":257257},{"type":17,"tag":6121,"props":259880,"children":259882},{"className":259881},[],[259883],{"type":23,"value":256795},{"type":17,"tag":29,"props":259885,"children":259886},{},[259887],{"type":17,"tag":48,"props":259888,"children":259889},{},[259890],{"type":23,"value":256837},{"type":17,"tag":6893,"props":259892,"children":259895},{"code":259893,"language":18718,"meta":7,"className":259894},"document_id?: string; // @deprecated\n",[18716],[259896],{"type":17,"tag":6121,"props":259897,"children":259898},{"__ignoreMap":7},[259899],{"type":23,"value":259893},{"type":17,"tag":29,"props":259901,"children":259902},{},[259903],{"type":17,"tag":48,"props":259904,"children":259905},{},[259906],{"type":23,"value":256854},{"type":17,"tag":6893,"props":259908,"children":259911},{"code":259909,"language":18718,"meta":7,"className":259910},"document_ids?: string[]; // IDs for AtsDocument.get\n",[18716],[259912],{"type":17,"tag":6121,"props":259913,"children":259914},{"__ignoreMap":7},[259915],{"type":23,"value":259909},{"type":17,"tag":29,"props":259917,"children":259918},{},[259919],{"type":17,"tag":48,"props":259920,"children":259921},{},[259922],{"type":23,"value":256871},{"type":17,"tag":80,"props":259924,"children":259925},{},[259926,259945,259960],{"type":17,"tag":84,"props":259927,"children":259928},{},[259929,259933,259934,259939,259940],{"type":17,"tag":48,"props":259930,"children":259931},{},[259932],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259935,"children":259937},{"className":259936},[],[259938],{"type":23,"value":259858},{"type":23,"value":258392},{"type":17,"tag":6121,"props":259941,"children":259943},{"className":259942},[],[259944],{"type":23,"value":168063},{"type":17,"tag":84,"props":259946,"children":259947},{},[259948,259952,259953,259958],{"type":17,"tag":48,"props":259949,"children":259950},{},[259951],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":259954,"children":259956},{"className":259955},[],[259957],{"type":23,"value":259858},{"type":23,"value":259959}," array when creating activities",{"type":17,"tag":84,"props":259961,"children":259962},{},[259963,259968],{"type":17,"tag":48,"props":259964,"children":259965},{},[259966],{"type":23,"value":259967},"Multi-Document Support:",{"type":23,"value":259969}," Supports multiple documents per activity",{"type":17,"tag":29,"props":259971,"children":259972},{},[259973],{"type":17,"tag":48,"props":259974,"children":259975},{},[259976],{"type":23,"value":19878},{"type":17,"tag":6893,"props":259978,"children":259981},{"code":259979,"language":18718,"meta":7,"className":259980},"// Before\nconst activity = {\n    title: 'Review Resume',\n    document_id: 'doc_123'\n}\n\n// After\nconst activity = {\n    title: 'Review Resume',\n    document_ids: ['doc_123', 'doc_456']\n}\n",[18716],[259982],{"type":17,"tag":6121,"props":259983,"children":259984},{"__ignoreMap":7},[259985],{"type":23,"value":259979},{"type":17,"tag":25,"props":259987,"children":259988},{},[],{"type":17,"tag":239,"props":259990,"children":259992},{"id":259991},"field-departments-groups",[259993,259994,259999,260000],{"type":23,"value":256689},{"type":17,"tag":6121,"props":259995,"children":259997},{"className":259996},[],[259998],{"type":23,"value":75532},{"type":23,"value":98082},{"type":17,"tag":6121,"props":260001,"children":260003},{"className":260002},[],[260004],{"type":23,"value":257802},{"type":17,"tag":29,"props":260006,"children":260007},{},[260008],{"type":17,"tag":48,"props":260009,"children":260010},{},[260011],{"type":23,"value":257399},{"type":17,"tag":80,"props":260013,"children":260014},{},[260015],{"type":17,"tag":84,"props":260016,"children":260017},{},[260018,260024,260025],{"type":17,"tag":6121,"props":260019,"children":260021},{"className":260020},[],[260022],{"type":23,"value":260023},"IAtsJob",{"type":23,"value":257257},{"type":17,"tag":6121,"props":260026,"children":260028},{"className":260027},[],[260029],{"type":23,"value":256795},{"type":17,"tag":29,"props":260031,"children":260032},{},[260033],{"type":17,"tag":48,"props":260034,"children":260035},{},[260036],{"type":23,"value":256837},{"type":17,"tag":6893,"props":260038,"children":260041},{"code":260039,"language":18718,"meta":7,"className":260040},"departments?: string[]; // @deprecated Use `groups` instead\n",[18716],[260042],{"type":17,"tag":6121,"props":260043,"children":260044},{"__ignoreMap":7},[260045],{"type":23,"value":260039},{"type":17,"tag":29,"props":260047,"children":260048},{},[260049],{"type":17,"tag":48,"props":260050,"children":260051},{},[260052],{"type":23,"value":256854},{"type":17,"tag":6893,"props":260054,"children":260057},{"code":260055,"language":18718,"meta":7,"className":260056},"groups?: IAtsGroup[]; // The departments/divisions/teams that this job belongs to\n",[18716],[260058],{"type":17,"tag":6121,"props":260059,"children":260060},{"__ignoreMap":7},[260061],{"type":23,"value":260055},{"type":17,"tag":29,"props":260063,"children":260064},{},[260065],{"type":17,"tag":48,"props":260066,"children":260067},{},[260068],{"type":23,"value":256871},{"type":17,"tag":80,"props":260070,"children":260071},{},[260072,260091,260113],{"type":17,"tag":84,"props":260073,"children":260074},{},[260075,260079,260080,260085,260086],{"type":17,"tag":48,"props":260076,"children":260077},{},[260078],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":260081,"children":260083},{"className":260082},[],[260084],{"type":23,"value":257802},{"type":23,"value":258392},{"type":17,"tag":6121,"props":260087,"children":260089},{"className":260088},[],[260090],{"type":23,"value":75532},{"type":17,"tag":84,"props":260092,"children":260093},{},[260094,260098,260099,260104,260105,260111],{"type":17,"tag":48,"props":260095,"children":260096},{},[260097],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":260100,"children":260102},{"className":260101},[],[260103],{"type":23,"value":257802},{"type":23,"value":257908},{"type":17,"tag":6121,"props":260106,"children":260108},{"className":260107},[],[260109],{"type":23,"value":260110},"IAtsGroup",{"type":23,"value":260112}," objects instead of department strings",{"type":17,"tag":84,"props":260114,"children":260115},{},[260116,260120],{"type":17,"tag":48,"props":260117,"children":260118},{},[260119],{"type":23,"value":258226},{"type":23,"value":260121}," Provides group IDs, names, and types (TEAM, GROUP, DEPARTMENT, DIVISION, etc.)",{"type":17,"tag":29,"props":260123,"children":260124},{},[260125],{"type":17,"tag":48,"props":260126,"children":260127},{},[260128],{"type":23,"value":19878},{"type":17,"tag":6893,"props":260130,"children":260133},{"code":260131,"language":18718,"meta":7,"className":260132},"// Before\nconst job = {\n    name: 'Software Engineer',\n    departments: ['Engineering', 'Product']\n}\n\n// After\nconst job = {\n    name: 'Software Engineer',\n    groups: [{\n        id: 'group_123',\n        name: 'Engineering',\n        type: 'DEPARTMENT'\n    }, {\n        id: 'group_456',\n        name: 'Product',\n        type: 'DEPARTMENT'\n    }]\n}\n",[18716],[260134],{"type":17,"tag":6121,"props":260135,"children":260136},{"__ignoreMap":7},[260137],{"type":23,"value":260131},{"type":17,"tag":25,"props":260139,"children":260140},{},[],{"type":17,"tag":68,"props":260142,"children":260144},{"id":260143},"ticketing-fields",[260145],{"type":23,"value":256650},{"type":17,"tag":239,"props":260147,"children":260149},{"id":260148},"field-category-category_id",[260150,260151,260156,260157],{"type":23,"value":256689},{"type":17,"tag":6121,"props":260152,"children":260154},{"className":260153},[],[260155],{"type":23,"value":243632},{"type":23,"value":98082},{"type":17,"tag":6121,"props":260158,"children":260160},{"className":260159},[],[260161],{"type":23,"value":219954},{"type":17,"tag":29,"props":260163,"children":260164},{},[260165],{"type":17,"tag":48,"props":260166,"children":260167},{},[260168],{"type":23,"value":257399},{"type":17,"tag":80,"props":260170,"children":260171},{},[260172],{"type":17,"tag":84,"props":260173,"children":260174},{},[260175,260181,260182],{"type":17,"tag":6121,"props":260176,"children":260178},{"className":260177},[],[260179],{"type":23,"value":260180},"ITicketingTicket",{"type":23,"value":257257},{"type":17,"tag":6121,"props":260183,"children":260185},{"className":260184},[],[260186],{"type":23,"value":260187},"src/models/UnifiedTicketing.ts",{"type":17,"tag":29,"props":260189,"children":260190},{},[260191],{"type":17,"tag":48,"props":260192,"children":260193},{},[260194],{"type":23,"value":256837},{"type":17,"tag":6893,"props":260196,"children":260199},{"code":260197,"language":18718,"meta":7,"className":260198},"category?: string; // @deprecated; use category_id\n",[18716],[260200],{"type":17,"tag":6121,"props":260201,"children":260202},{"__ignoreMap":7},[260203],{"type":23,"value":260197},{"type":17,"tag":29,"props":260205,"children":260206},{},[260207],{"type":17,"tag":48,"props":260208,"children":260209},{},[260210],{"type":23,"value":256854},{"type":17,"tag":6893,"props":260212,"children":260215},{"code":260213,"language":18718,"meta":7,"className":260214},"category_id?: string;\n",[18716],[260216],{"type":17,"tag":6121,"props":260217,"children":260218},{"__ignoreMap":7},[260219],{"type":23,"value":260213},{"type":17,"tag":29,"props":260221,"children":260222},{},[260223],{"type":17,"tag":48,"props":260224,"children":260225},{},[260226],{"type":23,"value":256871},{"type":17,"tag":80,"props":260228,"children":260229},{},[260230,260250,260265],{"type":17,"tag":84,"props":260231,"children":260232},{},[260233,260237,260238,260243,260244,260249],{"type":17,"tag":48,"props":260234,"children":260235},{},[260236],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":260239,"children":260241},{"className":260240},[],[260242],{"type":23,"value":219954},{"type":23,"value":256913},{"type":17,"tag":6121,"props":260245,"children":260247},{"className":260246},[],[260248],{"type":23,"value":243632},{"type":23,"value":257147},{"type":17,"tag":84,"props":260251,"children":260252},{},[260253,260257,260258,260263],{"type":17,"tag":48,"props":260254,"children":260255},{},[260256],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":260259,"children":260261},{"className":260260},[],[260262],{"type":23,"value":219954},{"type":23,"value":260264}," when creating or updating tickets",{"type":17,"tag":84,"props":260266,"children":260267},{},[260268,260272,260274,260279],{"type":17,"tag":48,"props":260269,"children":260270},{},[260271],{"type":23,"value":258715},{"type":23,"value":260273}," Using ",{"type":17,"tag":6121,"props":260275,"children":260277},{"className":260276},[],[260278],{"type":23,"value":219954},{"type":23,"value":260280}," maintains consistency with other ID-based relationships",{"type":17,"tag":29,"props":260282,"children":260283},{},[260284],{"type":17,"tag":48,"props":260285,"children":260286},{},[260287],{"type":23,"value":19878},{"type":17,"tag":6893,"props":260289,"children":260292},{"code":260290,"language":18718,"meta":7,"className":260291},"// Before\nconst ticket = {\n    subject: 'Support Request',\n    category: 'technical'\n}\n\n// After\nconst ticket = {\n    subject: 'Support Request',\n    category_id: 'category_123'\n}\n",[18716],[260293],{"type":17,"tag":6121,"props":260294,"children":260295},{"__ignoreMap":7},[260296],{"type":23,"value":260290},{"type":17,"tag":25,"props":260298,"children":260299},{},[],{"type":17,"tag":68,"props":260301,"children":260303},{"id":260302},"calendar-fields",[260304],{"type":23,"value":256655},{"type":17,"tag":239,"props":260306,"children":260308},{"id":260307},"fieldprimary-is_primary",[260309,260310,260315,260316],{"type":23,"value":257963},{"type":17,"tag":6121,"props":260311,"children":260313},{"className":260312},[],[260314],{"type":23,"value":127626},{"type":23,"value":98082},{"type":17,"tag":6121,"props":260317,"children":260319},{"className":260318},[],[260320],{"type":23,"value":165549},{"type":17,"tag":29,"props":260322,"children":260323},{},[260324],{"type":17,"tag":48,"props":260325,"children":260326},{},[260327],{"type":23,"value":257399},{"type":17,"tag":80,"props":260329,"children":260330},{},[260331],{"type":17,"tag":84,"props":260332,"children":260333},{},[260334,260340,260341],{"type":17,"tag":6121,"props":260335,"children":260337},{"className":260336},[],[260338],{"type":23,"value":260339},"ICalendarCalendar",{"type":23,"value":257257},{"type":17,"tag":6121,"props":260342,"children":260344},{"className":260343},[],[260345],{"type":23,"value":260346},"src/models/UnifiedCalendar.ts",{"type":17,"tag":29,"props":260348,"children":260349},{},[260350],{"type":17,"tag":48,"props":260351,"children":260352},{},[260353],{"type":23,"value":256837},{"type":17,"tag":6893,"props":260355,"children":260358},{"code":260356,"language":18718,"meta":7,"className":260357},"primary?: boolean; // @deprecated\n",[18716],[260359],{"type":17,"tag":6121,"props":260360,"children":260361},{"__ignoreMap":7},[260362],{"type":23,"value":260356},{"type":17,"tag":29,"props":260364,"children":260365},{},[260366],{"type":17,"tag":48,"props":260367,"children":260368},{},[260369],{"type":23,"value":256854},{"type":17,"tag":6893,"props":260371,"children":260374},{"code":260372,"language":18718,"meta":7,"className":260373},"is_primary?: boolean;\n",[18716],[260375],{"type":17,"tag":6121,"props":260376,"children":260377},{"__ignoreMap":7},[260378],{"type":23,"value":260372},{"type":17,"tag":25,"props":260380,"children":260381},{},[],{"type":17,"tag":68,"props":260383,"children":260385},{"id":260384},"query-parameters-filters",[260386],{"type":23,"value":256660},{"type":17,"tag":239,"props":260388,"children":260390},{"id":260389},"expand_recurring_events-expand",[260391,260397,260398],{"type":17,"tag":6121,"props":260392,"children":260394},{"className":260393},[],[260395],{"type":23,"value":260396},"expand_recurring_events",{"type":23,"value":98082},{"type":17,"tag":6121,"props":260399,"children":260401},{"className":260400},[],[260402],{"type":23,"value":123623},{"type":17,"tag":29,"props":260404,"children":260405},{},[260406],{"type":17,"tag":48,"props":260407,"children":260408},{},[260409],{"type":23,"value":256724},{"type":17,"tag":80,"props":260411,"children":260412},{},[260413],{"type":17,"tag":84,"props":260414,"children":260415},{},[260416],{"type":17,"tag":6121,"props":260417,"children":260419},{"className":260418},[],[260420],{"type":23,"value":260421},"ICalendarEvent",{"type":17,"tag":29,"props":260423,"children":260424},{},[260425],{"type":17,"tag":48,"props":260426,"children":260427},{},[260428],{"type":23,"value":260429},"Deprecated Parameter:",{"type":17,"tag":6893,"props":260431,"children":260434},{"code":260432,"language":18718,"meta":7,"className":260433},"expand_recurring_events?: boolean; // @deprecated; use expand\n",[18716],[260435],{"type":17,"tag":6121,"props":260436,"children":260437},{"__ignoreMap":7},[260438],{"type":23,"value":260432},{"type":17,"tag":29,"props":260440,"children":260441},{},[260442],{"type":17,"tag":48,"props":260443,"children":260444},{},[260445],{"type":23,"value":256854},{"type":17,"tag":6893,"props":260447,"children":260450},{"code":260448,"language":18718,"meta":7,"className":260449},"expand?: boolean;\n",[18716],[260451],{"type":17,"tag":6121,"props":260452,"children":260453},{"__ignoreMap":7},[260454],{"type":23,"value":260448},{"type":17,"tag":29,"props":260456,"children":260457},{},[260458],{"type":17,"tag":48,"props":260459,"children":260460},{},[260461],{"type":23,"value":256871},{"type":17,"tag":80,"props":260463,"children":260464},{},[260465,260487],{"type":17,"tag":84,"props":260466,"children":260467},{},[260468,260473,260475,260480,260482],{"type":17,"tag":48,"props":260469,"children":260470},{},[260471],{"type":23,"value":260472},"API Calls:",{"type":23,"value":260474}," Replace ",{"type":17,"tag":6121,"props":260476,"children":260478},{"className":260477},[],[260479],{"type":23,"value":260396},{"type":23,"value":260481}," query parameter with ",{"type":17,"tag":6121,"props":260483,"children":260485},{"className":260484},[],[260486],{"type":23,"value":123623},{"type":17,"tag":84,"props":260488,"children":260489},{},[260490,260495,260496,260501],{"type":17,"tag":48,"props":260491,"children":260492},{},[260493],{"type":23,"value":260494},"More Flexible:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":260497,"children":260499},{"className":260498},[],[260500],{"type":23,"value":123623},{"type":23,"value":260502}," supports expanding multiple event types, not just recurring events",{"type":17,"tag":29,"props":260504,"children":260505},{},[260506],{"type":17,"tag":48,"props":260507,"children":260508},{},[260509],{"type":23,"value":19878},{"type":17,"tag":6893,"props":260511,"children":260514},{"code":260512,"language":18718,"meta":7,"className":260513},"// Before\nGET /api/calendar/events?expand_recurring_events=true\n\n// After\nGET /api/calendar/events?expand=true\n",[18716],[260515],{"type":17,"tag":6121,"props":260516,"children":260517},{"__ignoreMap":7},[260518],{"type":23,"value":260512},{"type":17,"tag":25,"props":260520,"children":260521},{},[],{"type":17,"tag":239,"props":260523,"children":260525},{"id":260524},"end_le-end_lt",[260526,260532,260533],{"type":17,"tag":6121,"props":260527,"children":260529},{"className":260528},[],[260530],{"type":23,"value":260531},"end_le",{"type":23,"value":98082},{"type":17,"tag":6121,"props":260534,"children":260536},{"className":260535},[],[260537],{"type":23,"value":109151},{"type":17,"tag":29,"props":260539,"children":260540},{},[260541],{"type":17,"tag":48,"props":260542,"children":260543},{},[260544],{"type":23,"value":256724},{"type":17,"tag":80,"props":260546,"children":260547},{},[260548,260556,260565,260574,260583,260592,260601,260610,260619,260628,260636,260645,260653,260662,260671],{"type":17,"tag":84,"props":260549,"children":260550},{},[260551],{"type":17,"tag":6121,"props":260552,"children":260554},{"className":260553},[],[260555],{"type":23,"value":260421},{"type":17,"tag":84,"props":260557,"children":260558},{},[260559],{"type":17,"tag":6121,"props":260560,"children":260562},{"className":260561},[],[260563],{"type":23,"value":260564},"ICalendarBusy",{"type":17,"tag":84,"props":260566,"children":260567},{},[260568],{"type":17,"tag":6121,"props":260569,"children":260571},{"className":260570},[],[260572],{"type":23,"value":260573},"ICalendarRecording",{"type":17,"tag":84,"props":260575,"children":260576},{},[260577],{"type":17,"tag":6121,"props":260578,"children":260580},{"className":260579},[],[260581],{"type":23,"value":260582},"IUcCall",{"type":17,"tag":84,"props":260584,"children":260585},{},[260586],{"type":17,"tag":6121,"props":260587,"children":260589},{"className":260588},[],[260590],{"type":23,"value":260591},"IUcRecording",{"type":17,"tag":84,"props":260593,"children":260594},{},[260595],{"type":17,"tag":6121,"props":260596,"children":260598},{"className":260597},[],[260599],{"type":23,"value":260600},"IHrisTimeoff",{"type":17,"tag":84,"props":260602,"children":260603},{},[260604],{"type":17,"tag":6121,"props":260605,"children":260607},{"className":260606},[],[260608],{"type":23,"value":260609},"IHrisTimeshift",{"type":17,"tag":84,"props":260611,"children":260612},{},[260613],{"type":17,"tag":6121,"props":260614,"children":260616},{"className":260615},[],[260617],{"type":23,"value":260618},"IAccountingBalancesheet",{"type":17,"tag":84,"props":260620,"children":260621},{},[260622],{"type":17,"tag":6121,"props":260623,"children":260625},{"className":260624},[],[260626],{"type":23,"value":260627},"IAccountingCashflow",{"type":17,"tag":84,"props":260629,"children":260630},{},[260631],{"type":17,"tag":6121,"props":260632,"children":260634},{"className":260633},[],[260635],{"type":23,"value":259047},{"type":17,"tag":84,"props":260637,"children":260638},{},[260639],{"type":17,"tag":6121,"props":260640,"children":260642},{"className":260641},[],[260643],{"type":23,"value":260644},"IAccountingTrialbalance",{"type":17,"tag":84,"props":260646,"children":260647},{},[260648],{"type":17,"tag":6121,"props":260649,"children":260651},{"className":260650},[],[260652],{"type":23,"value":257683},{"type":17,"tag":84,"props":260654,"children":260655},{},[260656],{"type":17,"tag":6121,"props":260657,"children":260659},{"className":260658},[],[260660],{"type":23,"value":260661},"IPaymentSubscription",{"type":17,"tag":84,"props":260663,"children":260664},{},[260665],{"type":17,"tag":6121,"props":260666,"children":260668},{"className":260667},[],[260669],{"type":23,"value":260670},"IPaymentPayment",{"type":17,"tag":84,"props":260672,"children":260673},{},[260674],{"type":17,"tag":6121,"props":260675,"children":260677},{"className":260676},[],[260678],{"type":23,"value":260679},"IPaymentPayout",{"type":17,"tag":29,"props":260681,"children":260682},{},[260683],{"type":17,"tag":48,"props":260684,"children":260685},{},[260686],{"type":23,"value":260429},{"type":17,"tag":6893,"props":260688,"children":260691},{"code":260689,"language":18718,"meta":7,"className":260690},"end_le?: string | Date; // @deprecated; use end_lt\n",[18716],[260692],{"type":17,"tag":6121,"props":260693,"children":260694},{"__ignoreMap":7},[260695],{"type":23,"value":260689},{"type":17,"tag":29,"props":260697,"children":260698},{},[260699],{"type":17,"tag":48,"props":260700,"children":260701},{},[260702],{"type":23,"value":256854},{"type":17,"tag":6893,"props":260704,"children":260707},{"code":260705,"language":18718,"meta":7,"className":260706},"end_lt?: string | Date;\n",[18716],[260708],{"type":17,"tag":6121,"props":260709,"children":260710},{"__ignoreMap":7},[260711],{"type":23,"value":260705},{"type":17,"tag":29,"props":260713,"children":260714},{},[260715],{"type":17,"tag":48,"props":260716,"children":260717},{},[260718],{"type":23,"value":256871},{"type":17,"tag":80,"props":260720,"children":260721},{},[260722,260744],{"type":17,"tag":84,"props":260723,"children":260724},{},[260725,260729,260730,260735,260737,260742],{"type":17,"tag":48,"props":260726,"children":260727},{},[260728],{"type":23,"value":260472},{"type":23,"value":260474},{"type":17,"tag":6121,"props":260731,"children":260733},{"className":260732},[],[260734],{"type":23,"value":260531},{"type":23,"value":260736}," (less than or equal) with ",{"type":17,"tag":6121,"props":260738,"children":260740},{"className":260739},[],[260741],{"type":23,"value":109151},{"type":23,"value":260743}," (less than)",{"type":17,"tag":84,"props":260745,"children":260746},{},[260747,260751],{"type":17,"tag":48,"props":260748,"children":260749},{},[260750],{"type":23,"value":258715},{"type":23,"value":260752}," Aligns with standard date range filtering conventions",{"type":17,"tag":29,"props":260754,"children":260755},{},[260756],{"type":17,"tag":48,"props":260757,"children":260758},{},[260759],{"type":23,"value":19878},{"type":17,"tag":6893,"props":260761,"children":260764},{"code":260762,"language":18718,"meta":7,"className":260763},"// Before\nGET /api/calendar/events?end_le=2024-12-31\n\n// After\nGET /api/calendar/events?end_lt=2025-01-01\n// Note: Adjust date by +1 day if you need inclusive end date\n",[18716],[260765],{"type":17,"tag":6121,"props":260766,"children":260767},{"__ignoreMap":7},[260768],{"type":23,"value":260762},{"type":17,"tag":6893,"props":260770,"children":260772},{"code":260771},"\n\n---\n\n\n## Webhook Payload Fields\n\n\n### Field: `sig` → `sig256`\n\n\n**Affected Interface:**\n\n- `IWebhookData`\n\n**Deprecated Field:**\n\n\n```typescript\nsig?: string; // @deprecated; use sig256 instead\n",[260773],{"type":17,"tag":6121,"props":260774,"children":260775},{"__ignoreMap":7},[260776],{"type":23,"value":260771},{"type":17,"tag":29,"props":260778,"children":260779},{},[260780],{"type":17,"tag":48,"props":260781,"children":260782},{},[260783],{"type":23,"value":256854},{"type":17,"tag":6893,"props":260785,"children":260788},{"code":260786,"language":18718,"meta":7,"className":260787},"sig256?: string; // HMAC-SHA256(workspace.secret, data + nonce)\n",[18716],[260789],{"type":17,"tag":6121,"props":260790,"children":260791},{"__ignoreMap":7},[260792],{"type":23,"value":260786},{"type":17,"tag":29,"props":260794,"children":260795},{},[260796],{"type":17,"tag":48,"props":260797,"children":260798},{},[260799],{"type":23,"value":256871},{"type":17,"tag":80,"props":260801,"children":260802},{},[260803,260825,260848],{"type":17,"tag":84,"props":260804,"children":260805},{},[260806,260811,260812,260817,260818,260823],{"type":17,"tag":48,"props":260807,"children":260808},{},[260809],{"type":23,"value":260810},"Webhook Verification:",{"type":23,"value":256906},{"type":17,"tag":6121,"props":260813,"children":260815},{"className":260814},[],[260816],{"type":23,"value":177128},{"type":23,"value":256913},{"type":17,"tag":6121,"props":260819,"children":260821},{"className":260820},[],[260822],{"type":23,"value":178128},{"type":23,"value":260824}," for webhook signature verification",{"type":17,"tag":84,"props":260826,"children":260827},{},[260828,260833,260834,260839,260841,260846],{"type":17,"tag":48,"props":260829,"children":260830},{},[260831],{"type":23,"value":260832},"Security:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":260835,"children":260837},{"className":260836},[],[260838],{"type":23,"value":177128},{"type":23,"value":260840}," uses HMAC-SHA256 which is more secure than the previous signature algorithm. ",{"type":17,"tag":6121,"props":260842,"children":260844},{"className":260843},[],[260845],{"type":23,"value":178128},{"type":23,"value":260847}," used HMAC-SHA1, which is now deprecated.",{"type":17,"tag":84,"props":260849,"children":260850},{},[260851,260856,260858,260863],{"type":17,"tag":48,"props":260852,"children":260853},{},[260854],{"type":23,"value":260855},"Verification:",{"type":23,"value":260857}," Update your webhook verification code to check ",{"type":17,"tag":6121,"props":260859,"children":260861},{"className":260860},[],[260862],{"type":23,"value":177128},{"type":23,"value":187853},{"type":17,"tag":29,"props":260865,"children":260866},{},[260867],{"type":17,"tag":48,"props":260868,"children":260869},{},[260870],{"type":23,"value":19878},{"type":17,"tag":6893,"props":260872,"children":260875},{"code":260873,"language":18718,"meta":7,"className":260874},"// Before\nconst isValid = verifySignature(webhook.sig, payload, secret, 'sha');\n\n// After\nconst isValid = verifySignature(webhook.sig256, payload, secret, ‘sha256');\n",[18716],[260876],{"type":17,"tag":6121,"props":260877,"children":260878},{"__ignoreMap":7},[260879],{"type":23,"value":260873},{"type":17,"tag":6893,"props":260881,"children":260883},{"code":260882},"\n\n---\n\n\n## Deprecated Objects/Usage Patterns\n\n\n### `IAccountingInvoice` with `type === 'BILL'` → Use `IAccountingBill`\n\n\n**Status:** Deprecated usage pattern:\n\n- Instead of using `IAccountingInvoice` with `type='BILL'`, use the dedicated `IAccountingBill` object\n\n**Affected Model:**\n\n- `IAccountingInvoice` - `src/models/UnifiedAccounting.ts`\n\n**Deprecated Pattern:**\n\n\n```typescript\ninterface IAccountingInvoice {\n  type: 'BILL',  // @deprecated - use IAccountingBill instead\n  ...\n}\n",[260884],{"type":17,"tag":6121,"props":260885,"children":260886},{"__ignoreMap":7},[260887],{"type":23,"value":260882},{"type":17,"tag":29,"props":260889,"children":260890},{},[260891],{"type":17,"tag":48,"props":260892,"children":260893},{},[260894],{"type":23,"value":256854},{"type":17,"tag":6893,"props":260896,"children":260899},{"code":260897,"language":18718,"meta":7,"className":260898},"interface IAccountingBill {\n    ...\n}\n",[18716],[260900],{"type":17,"tag":6121,"props":260901,"children":260902},{"__ignoreMap":7},[260903],{"type":23,"value":260897},{"type":17,"tag":29,"props":260905,"children":260906},{},[260907],{"type":17,"tag":48,"props":260908,"children":260909},{},[260910],{"type":23,"value":260911},"Key Differences:",{"type":17,"tag":80,"props":260913,"children":260914},{},[260915,260936,260952,260975],{"type":17,"tag":84,"props":260916,"children":260917},{},[260918,260924,260925,260930,260931],{"type":17,"tag":6121,"props":260919,"children":260921},{"className":260920},[],[260922],{"type":23,"value":260923},"IAccountingBill",{"type":23,"value":219640},{"type":17,"tag":6121,"props":260926,"children":260928},{"className":260927},[],[260929],{"type":23,"value":222298},{"type":23,"value":256913},{"type":17,"tag":6121,"props":260932,"children":260934},{"className":260933},[],[260935],{"type":23,"value":220861},{"type":17,"tag":84,"props":260937,"children":260938},{},[260939,260944,260946,260951],{"type":17,"tag":6121,"props":260940,"children":260942},{"className":260941},[],[260943],{"type":23,"value":260923},{"type":23,"value":260945}," does not have the deprecated ",{"type":17,"tag":6121,"props":260947,"children":260949},{"className":260948},[],[260950],{"type":23,"value":27310},{"type":23,"value":187853},{"type":17,"tag":84,"props":260953,"children":260954},{},[260955,260960,260961,260966,260968,260973],{"type":17,"tag":6121,"props":260956,"children":260958},{"className":260957},[],[260959],{"type":23,"value":260923},{"type":23,"value":260945},{"type":17,"tag":6121,"props":260962,"children":260964},{"className":260963},[],[260965],{"type":23,"value":258604},{"type":23,"value":260967}," field (uses ",{"type":17,"tag":6121,"props":260969,"children":260971},{"className":260970},[],[260972],{"type":23,"value":187836},{"type":23,"value":260974}," instead)",{"type":17,"tag":84,"props":260976,"children":260977},{},[260978],{"type":23,"value":260979},"More semantic clarity: a Bill is clearly distinct from an Invoice",{"type":17,"tag":29,"props":260981,"children":260982},{},[260983],{"type":17,"tag":48,"props":260984,"children":260985},{},[260986],{"type":23,"value":256871},{"type":17,"tag":80,"props":260988,"children":260989},{},[260990,261019],{"type":17,"tag":84,"props":260991,"children":260992},{},[260993,260997,260998,261004,261006,261011,261013],{"type":17,"tag":48,"props":260994,"children":260995},{},[260996],{"type":23,"value":256882},{"type":23,"value":256906},{"type":17,"tag":6121,"props":260999,"children":261001},{"className":261000},[],[261002],{"type":23,"value":261003},"accounting_bill",{"type":23,"value":261005}," endpoints instead of ",{"type":17,"tag":6121,"props":261007,"children":261009},{"className":261008},[],[261010],{"type":23,"value":71554},{"type":23,"value":261012}," endpoints with ",{"type":17,"tag":6121,"props":261014,"children":261016},{"className":261015},[],[261017],{"type":23,"value":261018},"type='BILL'",{"type":17,"tag":84,"props":261020,"children":261021},{},[261022,261026,261027,261032,261034,261039,261040],{"type":17,"tag":48,"props":261023,"children":261024},{},[261025],{"type":23,"value":256904},{"type":23,"value":256906},{"type":17,"tag":6121,"props":261028,"children":261030},{"className":261029},[],[261031],{"type":23,"value":261003},{"type":23,"value":261033}," create/update endpoints instead of ",{"type":17,"tag":6121,"props":261035,"children":261037},{"className":261036},[],[261038],{"type":23,"value":71554},{"type":23,"value":120761},{"type":17,"tag":6121,"props":261041,"children":261043},{"className":261042},[],[261044],{"type":23,"value":261018},{"type":17,"tag":29,"props":261046,"children":261047},{},[261048,261053],{"type":17,"tag":48,"props":261049,"children":261050},{},[261051],{"type":23,"value":261052},"Field Mapping:",{"type":23,"value":261054}," When migrating data:",{"type":17,"tag":80,"props":261056,"children":261057},{},[261058,261072,261084],{"type":17,"tag":84,"props":261059,"children":261060},{},[261061,261066,261067],{"type":17,"tag":6121,"props":261062,"children":261064},{"className":261063},[],[261065],{"type":23,"value":220861},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261068,"children":261070},{"className":261069},[],[261071],{"type":23,"value":222298},{"type":17,"tag":84,"props":261073,"children":261074},{},[261075,261077,261082],{"type":23,"value":261076},"Remove ",{"type":17,"tag":6121,"props":261078,"children":261080},{"className":261079},[],[261081],{"type":23,"value":27310},{"type":23,"value":261083}," field (no longer needed)",{"type":17,"tag":84,"props":261085,"children":261086},{},[261087,261092,261093,261098],{"type":17,"tag":6121,"props":261088,"children":261090},{"className":261089},[],[261091],{"type":23,"value":258604},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261094,"children":261096},{"className":261095},[],[261097],{"type":23,"value":187836},{"type":23,"value":261099}," (if still using deprecated field)",{"type":17,"tag":29,"props":261101,"children":261102},{},[261103],{"type":17,"tag":48,"props":261104,"children":261105},{},[261106],{"type":23,"value":261107},"API Endpoints:",{"type":17,"tag":80,"props":261109,"children":261110},{},[261111,261129],{"type":17,"tag":84,"props":261112,"children":261113},{},[261114,261116,261122,261123],{"type":23,"value":261115},"❌ Deprecated: ",{"type":17,"tag":6121,"props":261117,"children":261119},{"className":261118},[],[261120],{"type":23,"value":261121},"POST /accounting/invoice",{"type":23,"value":120761},{"type":17,"tag":6121,"props":261124,"children":261126},{"className":261125},[],[261127],{"type":23,"value":261128},"type: 'BILL'",{"type":17,"tag":84,"props":261130,"children":261131},{},[261132,261134],{"type":23,"value":261133},"✅ Use: ",{"type":17,"tag":6121,"props":261135,"children":261137},{"className":261136},[],[261138],{"type":23,"value":261139},"POST /accounting/bill",{"type":17,"tag":29,"props":261141,"children":261142},{},[261143],{"type":17,"tag":48,"props":261144,"children":261145},{},[261146],{"type":23,"value":19878},{"type":17,"tag":6893,"props":261148,"children":261151},{"code":261149,"language":18718,"meta":7,"className":261150},"// Before\nPOST /accounting/invoice\n{\n    'type': 'BILL',\n    'invoice_number': 'BILL-001',\n    'contact_id': 'contact_123',\n    'total_amount': 1000\n}\n\n// After\nPOST /accounting/bill\n{\n    'bill_number': 'BILL-001',\n    'contact_id': 'contact_123',\n    'total_amount': 1000\n}\n",[18716],[261152],{"type":17,"tag":6121,"props":261153,"children":261154},{"__ignoreMap":7},[261155],{"type":23,"value":261149},{"type":17,"tag":25,"props":261157,"children":261158},{},[],{"type":17,"tag":239,"props":261160,"children":261162},{"id":261161},"iaccountingreport-use-individual-report-objects",[261163,261169],{"type":17,"tag":6121,"props":261164,"children":261166},{"className":261165},[],[261167],{"type":23,"value":261168},"IAccountingReport",{"type":23,"value":261170}," → Use Individual Report Objects",{"type":17,"tag":29,"props":261172,"children":261173},{},[261174,261179],{"type":17,"tag":48,"props":261175,"children":261176},{},[261177],{"type":23,"value":261178},"Status:",{"type":23,"value":261180}," Deprecated object",{"type":17,"tag":80,"props":261182,"children":261183},{},[261184],{"type":17,"tag":84,"props":261185,"children":261186},{},[261187,261189,261194],{"type":23,"value":261188},"Instead of using ",{"type":17,"tag":6121,"props":261190,"children":261192},{"className":261191},[],[261193],{"type":23,"value":261168},{"type":23,"value":261195},", use the individual report objects directly",{"type":17,"tag":29,"props":261197,"children":261198},{},[261199],{"type":17,"tag":48,"props":261200,"children":261201},{},[261202],{"type":23,"value":257399},{"type":17,"tag":80,"props":261204,"children":261205},{},[261206],{"type":17,"tag":84,"props":261207,"children":261208},{},[261209,261214,261215],{"type":17,"tag":6121,"props":261210,"children":261212},{"className":261211},[],[261213],{"type":23,"value":261168},{"type":23,"value":257257},{"type":17,"tag":6121,"props":261216,"children":261218},{"className":261217},[],[261219],{"type":23,"value":258884},{"type":17,"tag":29,"props":261221,"children":261222},{},[261223],{"type":17,"tag":48,"props":261224,"children":261225},{},[261226],{"type":23,"value":261227},"Deprecated Object Structure:",{"type":17,"tag":6893,"props":261229,"children":261232},{"code":261230,"language":18718,"meta":7,"className":261231},"interface IAccountingReport {\n  type?: TAccountingReportType; // Enum: TRIAL_BALANCE, BALANCE_SHEET, PROFIT_AND_LOSS  \n  ...\n}\n",[18716],[261233],{"type":17,"tag":6121,"props":261234,"children":261235},{"__ignoreMap":7},[261236],{"type":23,"value":261230},{"type":17,"tag":29,"props":261238,"children":261239},{},[261240,261244],{"type":17,"tag":48,"props":261241,"children":261242},{},[261243],{"type":23,"value":256854},{"type":23,"value":261245}," Use individual report objects directly",{"type":17,"tag":29,"props":261247,"children":261248},{},[261249],{"type":17,"tag":48,"props":261250,"children":261251},{},[261252],{"type":23,"value":261253},"Balance Sheet:",{"type":17,"tag":6893,"props":261255,"children":261258},{"code":261256,"language":18718,"meta":7,"className":261257},"interface IAccountingBalancesheet {\n  id?: string;  \n  created_at?: (string | Date | number);  \n  updated_at?: (string | Date | number);  \n  start_at?: (string | Date | number);  \n  end_at?: (string | Date | number);  \n  name?: string;  \n  currency?: string;  \n  net_assets_amount?: number;  \n  assets?: IAccountingBalancesheetItem[];  \n  liabilities?: IAccountingBalancesheetItem[];  \n  equity?: IAccountingBalancesheetItem[];  \n  raw?: unknown;\n}\n",[18716],[261259],{"type":17,"tag":6121,"props":261260,"children":261261},{"__ignoreMap":7},[261262],{"type":23,"value":261256},{"type":17,"tag":29,"props":261264,"children":261265},{},[261266],{"type":17,"tag":48,"props":261267,"children":261268},{},[261269],{"type":23,"value":261270},"Profit and Loss:",{"type":17,"tag":6893,"props":261272,"children":261275},{"code":261273,"language":18718,"meta":7,"className":261274},"interface IAccountingProfitloss {\n  id?: string;  \n  created_at?: (string | Date | number);  \n  updated_at?: (string | Date | number);  \n  category_ids?: string[];  \n  start_at?: (string | Date | number);  \n  end_at?: (string | Date | number);  \n  name?: string;  \n  currency?: string;  \n  income_sections?: IAccountingProfitlossSection[];  \n  expenses_sections?: IAccountingProfitlossSection[];  \n  cost_of_goods_sold_sections?: IAccountingProfitlossSection[];  \n  income_total_amount?: number;  \n  net_income_amount?: number;  \n  expenses_total_amount?: number;  \n  cost_of_goods_sold_total_amount?: number;  \n  raw?: unknown;\n}\n",[18716],[261276],{"type":17,"tag":6121,"props":261277,"children":261278},{"__ignoreMap":7},[261279],{"type":23,"value":261273},{"type":17,"tag":29,"props":261281,"children":261282},{},[261283],{"type":17,"tag":48,"props":261284,"children":261285},{},[261286],{"type":23,"value":261287},"Trial Balance:",{"type":17,"tag":6893,"props":261289,"children":261292},{"code":261290,"language":18718,"meta":7,"className":261291},"interface IAccountingTrialbalance {\n  id?: string;  \n  created_at?: (string | Date | number);  \n  updated_at?: (string | Date | number);  \n  start_at?: (string | Date | number);  \n  name?: string;  \n  currency?: string;  \n  end_at?: (string | Date | number);  \n  total_debit_amount?: number;  \n  total_credit_amount?: number;  \n  sub_items?: IAccountingTrialbalanceSubItem[];  \n  raw?: unknown;\n}\n",[18716],[261293],{"type":17,"tag":6121,"props":261294,"children":261295},{"__ignoreMap":7},[261296],{"type":23,"value":261290},{"type":17,"tag":29,"props":261298,"children":261299},{},[261300],{"type":17,"tag":48,"props":261301,"children":261302},{},[261303],{"type":23,"value":261304},"Cash Flow:",{"type":17,"tag":6893,"props":261306,"children":261309},{"code":261307,"language":18718,"meta":7,"className":261308},"interface IAccountingCashflow {\n  id?: string;  \n  created_at?: (string | Date | number);  \n  updated_at?: (string | Date | number);  \n  start_at?: (string | Date | number);  \n  end_at?: (string | Date | number);  \n  category_ids?: string[];  \n  contact_id?: string;  name?: string; // e.g. \"Cash Flow Statement Q1 2020\"  \n  currency?: string; // ISO 4217, e.g. \"USD\"  \n  cash_beginning_amount?: number; // Cash at beginning of period  \n  cash_ending_amount?: number; // Cash at end of period  \n  net_change_in_cash_amount?: number; // Usually ending - beginning  \n  operating_sections?: IAccountingCashflowSection[];  \n  investing_sections?: IAccountingCashflowSection[];  \n  financing_sections?: IAccountingCashflowSection[];  raw?: unknown;\n}\n\ninterface IAccountingCashflowSection {\n  section_name?: string; // e.g. \"Operating Activities\"  \n  total_amount?: number; // Net cash provided/used by this section  \n  items?: IAccountingCashflowItem[];\n}\n\ninterface IAccountingCashflowItem {\n  account_id?: string; // If attributable to a specific GL account  \n  name?: string; // e.g. \"Net Income\", \"Depreciation\", \"Equipment\"  \n  amount?: number; // Positive = inflow, Negative = outflow  \n  transaction_ids?: string[]; // Optional linkage to transactions  \n  sub_items?: IAccountingCashflowItem[];\n}\n",[18716],[261310],{"type":17,"tag":6121,"props":261311,"children":261312},{"__ignoreMap":7},[261313],{"type":23,"value":261307},{"type":17,"tag":29,"props":261315,"children":261316},{},[261317],{"type":17,"tag":48,"props":261318,"children":261319},{},[261320],{"type":23,"value":256871},{"type":17,"tag":80,"props":261322,"children":261323},{},[261324,261341,261359,261377,261394,261406,261415],{"type":17,"tag":84,"props":261325,"children":261326},{},[261327,261331,261333,261339],{"type":17,"tag":48,"props":261328,"children":261329},{},[261330],{"type":23,"value":256882},{"type":23,"value":261332}," Instead of using ",{"type":17,"tag":6121,"props":261334,"children":261336},{"className":261335},[],[261337],{"type":23,"value":261338},"accounting_report",{"type":23,"value":261340}," endpoints, use the specific report endpoints",{"type":17,"tag":84,"props":261342,"children":261343},{},[261344,261345,261351,261353],{"type":23,"value":261115},{"type":17,"tag":6121,"props":261346,"children":261348},{"className":261347},[],[261349],{"type":23,"value":261350},"GET /accounting/report?type=BALANCE_SHEET",{"type":23,"value":261352},".  ✅ Use: ",{"type":17,"tag":6121,"props":261354,"children":261356},{"className":261355},[],[261357],{"type":23,"value":261358},"GET /accounting/balancesheet",{"type":17,"tag":84,"props":261360,"children":261361},{},[261362,261363,261369,261371],{"type":23,"value":261115},{"type":17,"tag":6121,"props":261364,"children":261366},{"className":261365},[],[261367],{"type":23,"value":261368},"GET /accounting/report?type=PROFIT_AND_LOSS",{"type":23,"value":261370},". ✅ Use: ",{"type":17,"tag":6121,"props":261372,"children":261374},{"className":261373},[],[261375],{"type":23,"value":261376},"GET /accounting/profitloss",{"type":17,"tag":84,"props":261378,"children":261379},{},[261380,261381,261387,261388],{"type":23,"value":261115},{"type":17,"tag":6121,"props":261382,"children":261384},{"className":261383},[],[261385],{"type":23,"value":261386},"GET /accounting/report?type=TRIAL_BALANCE",{"type":23,"value":261370},{"type":17,"tag":6121,"props":261389,"children":261391},{"className":261390},[],[261392],{"type":23,"value":261393},"GET /accounting/trialbalance",{"type":17,"tag":84,"props":261395,"children":261396},{},[261397,261398,261404],{"type":23,"value":261133},{"type":17,"tag":6121,"props":261399,"children":261401},{"className":261400},[],[261402],{"type":23,"value":261403},"GET /accounting/cashflow",{"type":23,"value":261405}," (Cash flow was never part of the deprecated report object, but should be accessed directly)",{"type":17,"tag":84,"props":261407,"children":261408},{},[261409,261413],{"type":17,"tag":48,"props":261410,"children":261411},{},[261412],{"type":23,"value":256904},{"type":23,"value":261414}," Create individual report objects directly instead of wrapping them in a report object",{"type":17,"tag":84,"props":261416,"children":261417},{},[261418,261423,261425,261431,261432,261438],{"type":17,"tag":48,"props":261419,"children":261420},{},[261421],{"type":23,"value":261422},"Field Access:",{"type":23,"value":261424}," Access report data directly from the individual objects instead of through ",{"type":17,"tag":6121,"props":261426,"children":261428},{"className":261427},[],[261429],{"type":23,"value":261430},"report.balance_sheet",{"type":23,"value":11826},{"type":17,"tag":6121,"props":261433,"children":261435},{"className":261434},[],[261436],{"type":23,"value":261437},"report.profit_and_loss",{"type":23,"value":212457},{"type":17,"tag":29,"props":261440,"children":261441},{},[261442],{"type":17,"tag":48,"props":261443,"children":261444},{},[261445],{"type":23,"value":19878},{"type":17,"tag":6893,"props":261447,"children":261450},{"code":261448,"language":18718,"meta":7,"className":261449},"// Before\nconst report = await getAccountingReport({\n  type: 'BALANCE_SHEET',  \n  start_at: '2024-01-01',  \n  end_at: '2024-12-31'\n});\nconst assets = report.balance_sheet?.assets;\n\n// After\nconst balanceSheet = await getAccountingBalancesheet({\n  start_at: '2024-01-01',  \n  end_at: '2024-12-31'\n});\nconst assets = balanceSheet.assets;\n",[18716],[261451],{"type":17,"tag":6121,"props":261452,"children":261453},{"__ignoreMap":7},[261454],{"type":23,"value":261448},{"type":17,"tag":29,"props":261456,"children":261457},{},[261458],{"type":17,"tag":48,"props":261459,"children":261460},{},[261461],{"type":23,"value":261462},"Benefits of Using Individual Objects:",{"type":17,"tag":80,"props":261464,"children":261465},{},[261466,261476,261486,261496],{"type":17,"tag":84,"props":261467,"children":261468},{},[261469,261474],{"type":17,"tag":48,"props":261470,"children":261471},{},[261472],{"type":23,"value":261473},"Simpler API:",{"type":23,"value":261475}," Each report type has its own dedicated endpoint",{"type":17,"tag":84,"props":261477,"children":261478},{},[261479,261484],{"type":17,"tag":48,"props":261480,"children":261481},{},[261482],{"type":23,"value":261483},"Better Type Safety:",{"type":23,"value":261485}," TypeScript can better infer types for specific report objects",{"type":17,"tag":84,"props":261487,"children":261488},{},[261489,261494],{"type":17,"tag":48,"props":261490,"children":261491},{},[261492],{"type":23,"value":261493},"Clearer Intent:",{"type":23,"value":261495}," Code is more explicit about which report type is being accessed",{"type":17,"tag":84,"props":261497,"children":261498},{},[261499,261504],{"type":17,"tag":48,"props":261500,"children":261501},{},[261502],{"type":23,"value":261503},"Easier Maintenance:",{"type":23,"value":261505}," Individual objects are easier to extend and modify independently",{"type":17,"tag":25,"props":261507,"children":261508},{},[],{"type":17,"tag":68,"props":261510,"children":261512},{"id":261511},"deprecated-typesinterfaces",[261513],{"type":23,"value":256675},{"type":17,"tag":239,"props":261515,"children":261517},{"id":261516},"iaccountingprofitlosscategory-and-iaccountingprofitlosssubcategory",[261518,261523,261524],{"type":17,"tag":6121,"props":261519,"children":261521},{"className":261520},[],[261522],{"type":23,"value":259704},{"type":23,"value":34435},{"type":17,"tag":6121,"props":261525,"children":261527},{"className":261526},[],[261528],{"type":23,"value":259711},{"type":17,"tag":29,"props":261530,"children":261531},{},[261532,261536,261538],{"type":17,"tag":48,"props":261533,"children":261534},{},[261535],{"type":23,"value":261178},{"type":23,"value":261537}," Deprecated types - These interfaces are deprecated in favor of ",{"type":17,"tag":6121,"props":261539,"children":261541},{"className":261540},[],[261542],{"type":23,"value":259763},{"type":17,"tag":29,"props":261544,"children":261545},{},[261546],{"type":17,"tag":48,"props":261547,"children":261548},{},[261549],{"type":23,"value":261550},"Affected Files:",{"type":17,"tag":80,"props":261552,"children":261553},{},[261554,261562,261580],{"type":17,"tag":84,"props":261555,"children":261556},{},[261557],{"type":17,"tag":6121,"props":261558,"children":261560},{"className":261559},[],[261561],{"type":23,"value":258884},{"type":17,"tag":84,"props":261563,"children":261564},{},[261565,261571,261573,261579],{"type":17,"tag":6121,"props":261566,"children":261568},{"className":261567},[],[261569],{"type":23,"value":261570},"src/models/UnifiedAccounting.joi.ts",{"type":23,"value":261572}," (marked as ",{"type":17,"tag":6121,"props":261574,"children":261576},{"className":261575},[],[261577],{"type":23,"value":261578},"@deprecated",{"type":23,"value":12034},{"type":17,"tag":84,"props":261581,"children":261582},{},[261583],{"type":17,"tag":6121,"props":261584,"children":261586},{"className":261585},[],[261587],{"type":23,"value":261588},"src/models/UnifiedAccounting.proto",{"type":17,"tag":29,"props":261590,"children":261591},{},[261592],{"type":17,"tag":48,"props":261593,"children":261594},{},[261595],{"type":23,"value":259721},{"type":17,"tag":6893,"props":261597,"children":261600},{"code":261598,"language":18718,"meta":7,"className":261599},"interface IAccountingProfitlossCategory {\n  name?: string;  amount?: number;  sub_items?: IAccountingProfitlossSubcategory[];}\ninterface IAccountingProfitlossSubcategory {\n  name?: string;  amount?: number;  transaction_ids?: string[];}\n",[18716],[261601],{"type":17,"tag":6121,"props":261602,"children":261603},{"__ignoreMap":7},[261604],{"type":23,"value":261598},{"type":17,"tag":29,"props":261606,"children":261607},{},[261608],{"type":17,"tag":48,"props":261609,"children":261610},{},[261611],{"type":23,"value":256854},{"type":17,"tag":6893,"props":261613,"children":261616},{"code":261614,"language":18718,"meta":7,"className":261615},"interface IAccountingProfitlossSection {\n  section_type?: string;  section_name?: string;  total_amount?: number;  accounts?: IAccountingProfitlossAccount[];}\ninterface IAccountingProfitlossAccount {\n  account_id?: string;  account_name?: string;  total_amount?: number;  transaction_ids?: string[];}\n",[18716],[261617],{"type":17,"tag":6121,"props":261618,"children":261619},{"__ignoreMap":7},[261620],{"type":23,"value":261614},{"type":17,"tag":29,"props":261622,"children":261623},{},[261624],{"type":17,"tag":48,"props":261625,"children":261626},{},[261627],{"type":23,"value":256871},{"type":17,"tag":80,"props":261629,"children":261630},{},[261631,261641,261646],{"type":17,"tag":84,"props":261632,"children":261633},{},[261634,261636],{"type":23,"value":261635},"Update TypeScript type definitions to use ",{"type":17,"tag":6121,"props":261637,"children":261639},{"className":261638},[],[261640],{"type":23,"value":259763},{"type":17,"tag":84,"props":261642,"children":261643},{},[261644],{"type":23,"value":261645},"Update code that creates or manipulates profit/loss categories to use sections instead",{"type":17,"tag":84,"props":261647,"children":261648},{},[261649],{"type":23,"value":261650},"The new structure provides better organization with accounts grouped under sections",{"type":17,"tag":25,"props":261652,"children":261653},{},[],{"type":17,"tag":68,"props":261655,"children":261657},{"id":261656},"summary-by-category",[261658],{"type":23,"value":261659},"Summary by Category",{"type":17,"tag":7231,"props":261661,"children":261662},{},[261663,261683],{"type":17,"tag":7235,"props":261664,"children":261665},{},[261666],{"type":17,"tag":7239,"props":261667,"children":261668},{},[261669,261673,261678],{"type":17,"tag":7243,"props":261670,"children":261671},{},[261672],{"type":23,"value":7247},{"type":17,"tag":7243,"props":261674,"children":261675},{},[261676],{"type":23,"value":261677},"Deprecated Fields Count",{"type":17,"tag":7243,"props":261679,"children":261680},{},[261681],{"type":23,"value":261682},"Primary Changes",{"type":17,"tag":7259,"props":261684,"children":261685},{},[261686,261726,261756,261800,261849,261866,261903,261929,261946,261971,262009],{"type":17,"tag":7239,"props":261687,"children":261688},{},[261689,261693,261698],{"type":17,"tag":7266,"props":261690,"children":261691},{},[261692],{"type":23,"value":126524},{"type":17,"tag":7266,"props":261694,"children":261695},{},[261696],{"type":23,"value":261697},"2",{"type":17,"tag":7266,"props":261699,"children":261700},{},[261701,261706,261707,261712,261713,261718,261719,261724],{"type":17,"tag":6121,"props":261702,"children":261704},{"className":261703},[],[261705],{"type":23,"value":256695},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261708,"children":261710},{"className":261709},[],[261711],{"type":23,"value":214491},{"type":23,"value":11826},{"type":17,"tag":6121,"props":261714,"children":261716},{"className":261715},[],[261717],{"type":23,"value":27310},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261720,"children":261722},{"className":261721},[],[261723],{"type":23,"value":214510},{"type":23,"value":261725}," (affects 6 models)",{"type":17,"tag":7239,"props":261727,"children":261728},{},[261729,261734,261739],{"type":17,"tag":7266,"props":261730,"children":261731},{},[261732],{"type":23,"value":261733},"Parent/Relationship",{"type":17,"tag":7266,"props":261735,"children":261736},{},[261737],{"type":23,"value":261738},"4",{"type":17,"tag":7266,"props":261740,"children":261741},{},[261742,261744,261750,261751],{"type":23,"value":261743},"Various ",{"type":17,"tag":6121,"props":261745,"children":261747},{"className":261746},[],[261748],{"type":23,"value":261749},"parent_*_id",{"type":23,"value":98082},{"type":17,"tag":6121,"props":261752,"children":261754},{"className":261753},[],[261755],{"type":23,"value":15863},{"type":17,"tag":7239,"props":261757,"children":261758},{},[261759,261763,261767],{"type":17,"tag":7266,"props":261760,"children":261761},{},[261762],{"type":23,"value":89846},{"type":17,"tag":7266,"props":261764,"children":261765},{},[261766],{"type":23,"value":230135},{"type":17,"tag":7266,"props":261768,"children":261769},{},[261770,261775,261776,261781,261782,261787,261788,261793,261795],{"type":17,"tag":6121,"props":261771,"children":261773},{"className":261772},[],[261774],{"type":23,"value":62375},{"type":23,"value":11826},{"type":17,"tag":6121,"props":261777,"children":261779},{"className":261778},[],[261780],{"type":23,"value":257969},{"type":23,"value":11826},{"type":17,"tag":6121,"props":261783,"children":261785},{"className":261784},[],[261786],{"type":23,"value":74134},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261789,"children":261791},{"className":261790},[],[261792],{"type":23,"value":257802},{"type":23,"value":261794},"/",{"type":17,"tag":6121,"props":261796,"children":261798},{"className":261797},[],[261799],{"type":23,"value":101916},{"type":17,"tag":7239,"props":261801,"children":261802},{},[261803,261807,261811],{"type":17,"tag":7266,"props":261804,"children":261805},{},[261806],{"type":23,"value":24559},{"type":17,"tag":7266,"props":261808,"children":261809},{},[261810],{"type":23,"value":261738},{"type":17,"tag":7266,"props":261812,"children":261813},{},[261814,261819,261820,261825,261826,261831,261832,261837,261838,261843,261844],{"type":17,"tag":6121,"props":261815,"children":261817},{"className":261816},[],[261818],{"type":23,"value":130947},{"type":23,"value":11826},{"type":17,"tag":6121,"props":261821,"children":261823},{"className":261822},[],[261824],{"type":23,"value":177783},{"type":23,"value":11826},{"type":17,"tag":6121,"props":261827,"children":261829},{"className":261828},[],[261830],{"type":23,"value":257658},{"type":23,"value":11826},{"type":17,"tag":6121,"props":261833,"children":261835},{"className":261834},[],[261836],{"type":23,"value":130956},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261839,"children":261841},{"className":261840},[],[261842],{"type":23,"value":33459},{"type":23,"value":261794},{"type":17,"tag":6121,"props":261845,"children":261847},{"className":261846},[],[261848],{"type":23,"value":15863},{"type":17,"tag":7239,"props":261850,"children":261851},{},[261852,261856,261861],{"type":17,"tag":7266,"props":261853,"children":261854},{},[261855],{"type":23,"value":104365},{"type":17,"tag":7266,"props":261857,"children":261858},{},[261859],{"type":23,"value":261860},"8",{"type":17,"tag":7266,"props":261862,"children":261863},{},[261864],{"type":23,"value":261865},"Multiple field replacements and structural changes",{"type":17,"tag":7239,"props":261867,"children":261868},{},[261869,261873,261877],{"type":17,"tag":7266,"props":261870,"children":261871},{},[261872],{"type":23,"value":11756},{"type":17,"tag":7266,"props":261874,"children":261875},{},[261876],{"type":23,"value":261697},{"type":17,"tag":7266,"props":261878,"children":261879},{},[261880,261885,261886,261891,261892,261897,261898],{"type":17,"tag":6121,"props":261881,"children":261883},{"className":261882},[],[261884],{"type":23,"value":168063},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261887,"children":261889},{"className":261888},[],[261890],{"type":23,"value":259858},{"type":23,"value":11826},{"type":17,"tag":6121,"props":261893,"children":261895},{"className":261894},[],[261896],{"type":23,"value":75532},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261899,"children":261901},{"className":261900},[],[261902],{"type":23,"value":257802},{"type":17,"tag":7239,"props":261904,"children":261905},{},[261906,261910,261915],{"type":17,"tag":7266,"props":261907,"children":261908},{},[261909],{"type":23,"value":24541},{"type":17,"tag":7266,"props":261911,"children":261912},{},[261913],{"type":23,"value":261914},"1",{"type":17,"tag":7266,"props":261916,"children":261917},{},[261918,261923,261924],{"type":17,"tag":6121,"props":261919,"children":261921},{"className":261920},[],[261922],{"type":23,"value":243632},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261925,"children":261927},{"className":261926},[],[261928],{"type":23,"value":219954},{"type":17,"tag":7239,"props":261930,"children":261931},{},[261932,261937,261941],{"type":17,"tag":7266,"props":261933,"children":261934},{},[261935],{"type":23,"value":261936},"Query Parameters",{"type":17,"tag":7266,"props":261938,"children":261939},{},[261940],{"type":23,"value":230135},{"type":17,"tag":7266,"props":261942,"children":261943},{},[261944],{"type":23,"value":261945},"Date filter and expand parameter updates",{"type":17,"tag":7239,"props":261947,"children":261948},{},[261949,261953,261957],{"type":17,"tag":7266,"props":261950,"children":261951},{},[261952],{"type":23,"value":43896},{"type":17,"tag":7266,"props":261954,"children":261955},{},[261956],{"type":23,"value":261914},{"type":17,"tag":7266,"props":261958,"children":261959},{},[261960,261965,261966],{"type":17,"tag":6121,"props":261961,"children":261963},{"className":261962},[],[261964],{"type":23,"value":178128},{"type":23,"value":98082},{"type":17,"tag":6121,"props":261967,"children":261969},{"className":261968},[],[261970],{"type":23,"value":177128},{"type":17,"tag":7239,"props":261972,"children":261973},{},[261974,261982,261989],{"type":17,"tag":7266,"props":261975,"children":261976},{},[261977],{"type":17,"tag":48,"props":261978,"children":261979},{},[261980],{"type":23,"value":261981},"Deprecated Objects",{"type":17,"tag":7266,"props":261983,"children":261984},{},[261985],{"type":17,"tag":48,"props":261986,"children":261987},{},[261988],{"type":23,"value":261697},{"type":17,"tag":7266,"props":261990,"children":261991},{},[261992,261997,261998,262003,262004],{"type":17,"tag":6121,"props":261993,"children":261995},{"className":261994},[],[261996],{"type":23,"value":258629},{"type":23,"value":120761},{"type":17,"tag":6121,"props":261999,"children":262001},{"className":262000},[],[262002],{"type":23,"value":261018},{"type":23,"value":11826},{"type":17,"tag":6121,"props":262005,"children":262007},{"className":262006},[],[262008],{"type":23,"value":261168},{"type":17,"tag":7239,"props":262010,"children":262011},{},[262012,262020,262027],{"type":17,"tag":7266,"props":262013,"children":262014},{},[262015],{"type":17,"tag":48,"props":262016,"children":262017},{},[262018],{"type":23,"value":262019},"Deprecated Types",{"type":17,"tag":7266,"props":262021,"children":262022},{},[262023],{"type":17,"tag":48,"props":262024,"children":262025},{},[262026],{"type":23,"value":261697},{"type":17,"tag":7266,"props":262028,"children":262029},{},[262030,262035,262036],{"type":17,"tag":6121,"props":262031,"children":262033},{"className":262032},[],[262034],{"type":23,"value":259704},{"type":23,"value":11826},{"type":17,"tag":6121,"props":262037,"children":262039},{"className":262038},[],[262040],{"type":23,"value":259711},{"type":17,"tag":29,"props":262042,"children":262043},{},[262044],{"type":17,"tag":48,"props":262045,"children":262046},{},[262047],{"type":23,"value":262048},"Total Deprecated Fields:",{"type":17,"tag":80,"props":262050,"children":262051},{},[262052,262057,262062],{"type":17,"tag":84,"props":262053,"children":262054},{},[262055],{"type":23,"value":262056},"27 unique fields",{"type":17,"tag":84,"props":262058,"children":262059},{},[262060],{"type":23,"value":262061},"2 deprecated objects",{"type":17,"tag":84,"props":262063,"children":262064},{},[262065],{"type":23,"value":262066},"2 deprecated types across all categories",{"type":17,"tag":25,"props":262068,"children":262069},{},[],{"type":17,"tag":68,"props":262071,"children":262073},{"id":262072},"general-migration-guidelines",[262074],{"type":23,"value":262075},"General Migration Guidelines",{"type":17,"tag":239,"props":262077,"children":262079},{"id":262078},"_1-backward-compatibility",[262080,262082],{"type":23,"value":262081},"1. ",{"type":17,"tag":48,"props":262083,"children":262084},{},[262085],{"type":23,"value":262086},"Backward Compatibility",{"type":17,"tag":80,"props":262088,"children":262089},{},[262090,262100],{"type":17,"tag":84,"props":262091,"children":262092},{},[262093,262095],{"type":23,"value":262094},"Deprecated fields will still be supported until  ",{"type":17,"tag":6121,"props":262096,"children":262098},{"className":262097},[],[262099],{"type":23,"value":256603},{"type":17,"tag":84,"props":262101,"children":262102},{},[262103],{"type":23,"value":262104},"Plan to migrate as soon as possible to avoid breaking changes in future API versions",{"type":17,"tag":239,"props":262106,"children":262108},{"id":262107},"_2-testing",[262109,262111],{"type":23,"value":262110},"2. ",{"type":17,"tag":48,"props":262112,"children":262113},{},[262114],{"type":23,"value":262115},"Testing",{"type":17,"tag":80,"props":262117,"children":262118},{},[262119,262124],{"type":17,"tag":84,"props":262120,"children":262121},{},[262122],{"type":23,"value":262123},"Test all migrations thoroughly in a development environment",{"type":17,"tag":84,"props":262125,"children":262126},{},[262127],{"type":23,"value":262128},"Verify that data reads and writes work correctly with the new fields",{"type":17,"tag":239,"props":262130,"children":262132},{"id":262131},"_3-data-migration",[262133,262135],{"type":23,"value":262134},"3. ",{"type":17,"tag":48,"props":262136,"children":262137},{},[262138],{"type":23,"value":262139},"Data Migration",{"type":17,"tag":80,"props":262141,"children":262142},{},[262143],{"type":17,"tag":84,"props":262144,"children":262145},{},[262146,262148],{"type":23,"value":262147},"For existing data using deprecated fields, consider:\n",{"type":17,"tag":80,"props":262149,"children":262150},{},[262151,262156,262161],{"type":17,"tag":84,"props":262152,"children":262153},{},[262154],{"type":23,"value":262155},"Running a one-time migration script to populate new fields from old fields",{"type":17,"tag":84,"props":262157,"children":262158},{},[262159],{"type":23,"value":262160},"Updating your application code to read from both old and new fields during transition",{"type":17,"tag":84,"props":262162,"children":262163},{},[262164],{"type":23,"value":262165},"Gradually migrating writes to use only new fields",{"type":17,"tag":239,"props":262167,"children":262169},{"id":262168},"_4-documentation",[262170],{"type":17,"tag":48,"props":262171,"children":262172},{},[262173],{"type":23,"value":262174},"4. Documentation",{"type":17,"tag":80,"props":262176,"children":262177},{},[262178,262183,262188],{"type":17,"tag":84,"props":262179,"children":262180},{},[262181],{"type":23,"value":262182},"Update your internal documentation and code comments",{"type":17,"tag":84,"props":262184,"children":262185},{},[262186],{"type":23,"value":262187},"Notify your team about these changes",{"type":17,"tag":84,"props":262189,"children":262190},{},[262191],{"type":23,"value":262192},"Update API integration tests to use new field names",{"title":7,"searchDepth":1629,"depth":1629,"links":262194},[262195,262196,262202,262214,262222,262230,262250,262256,262260,262264,262272,262276,262277],{"id":256609,"depth":1629,"text":256612},{"id":256681,"depth":1629,"text":256620,"children":262197},[262198,262200],{"id":256686,"depth":1635,"text":262199},"Field: key → slug",{"id":256942,"depth":1635,"text":262201},"Field: type → format",{"id":257186,"depth":1629,"text":256625,"children":262203},[262204,262206,262208,262210,262212],{"id":257191,"depth":1635,"text":262205},"Field: parent_space_id → parent_id",{"id":257208,"depth":1635,"text":262207},"Field: parent_page_id → parent_id",{"id":257377,"depth":1635,"text":262209},"Field: parent_channel_id → parent_id",{"id":257517,"depth":1635,"text":262211},"Field: parent_account_id → parent_id",{"id":257650,"depth":1635,"text":262213},"Field: parent_message_id → parent_id",{"id":257783,"depth":1629,"text":256630,"children":262215},[262216,262218,262220],{"id":257788,"depth":1635,"text":262217},"Field: department → groups",{"id":257960,"depth":1635,"text":262219},"Field:division → groups",{"id":258097,"depth":1635,"text":262221},"Field: location → locations",{"id":258256,"depth":1629,"text":258259,"children":262223},[262224,262226,262228],{"id":258262,"depth":1635,"text":262225},"Field: channel_id → channels",{"id":258278,"depth":1635,"text":262227},"Field: channel_ids → channels",{"id":258457,"depth":1635,"text":262229},"Field: root_message_id → Removed",{"id":258591,"depth":1629,"text":256640,"children":262231},[262232,262234,262236,262238,262240,262242,262244,262246,262248],{"id":258596,"depth":1635,"text":262233},"Field: invoice_at → posted_at",{"id":258746,"depth":1635,"text":262235},"Field: type → Removed",{"id":258845,"depth":1635,"text":262237},"Field: contact_id → contacts",{"id":259013,"depth":1635,"text":262239},"Field: income → income_sections",{"id":259168,"depth":1635,"text":262241},"Field:expenses → expenses_sections",{"id":259297,"depth":1635,"text":262243},"Field:cost_of_goods_sold → cost_of_goods_sold_sections",{"id":259427,"depth":1635,"text":262245},"Field:gross_profit_amount → Calculate from income_total_amount and cost_of_goods_sold_total_amount",{"id":259567,"depth":1635,"text":262247},"Field: net_profit_amount → net_income_amount",{"id":259696,"depth":1635,"text":262249},"Field: IAccountingProfitlossCategory and IAccountingProfitlossSubcategory → Deprecated Types",{"id":259839,"depth":1629,"text":256645,"children":262251},[262252,262254],{"id":259844,"depth":1635,"text":262253},"Field:document_id → document_ids",{"id":259991,"depth":1635,"text":262255},"Field: departments → groups",{"id":260143,"depth":1629,"text":256650,"children":262257},[262258],{"id":260148,"depth":1635,"text":262259},"Field: category → category_id",{"id":260302,"depth":1629,"text":256655,"children":262261},[262262],{"id":260307,"depth":1635,"text":262263},"Field:primary → is_primary",{"id":260384,"depth":1629,"text":256660,"children":262265},[262266,262268,262270],{"id":260389,"depth":1635,"text":262267},"expand_recurring_events → expand",{"id":260524,"depth":1635,"text":262269},"end_le → end_lt",{"id":261161,"depth":1635,"text":262271},"IAccountingReport → Use Individual Report Objects",{"id":261511,"depth":1629,"text":256675,"children":262273},[262274],{"id":261516,"depth":1635,"text":262275},"IAccountingProfitlossCategory and IAccountingProfitlossSubcategory",{"id":261656,"depth":1629,"text":261659},{"id":262072,"depth":1629,"text":262075,"children":262278},[262279,262281,262283,262285],{"id":262078,"depth":1635,"text":262280},"1. Backward Compatibility",{"id":262107,"depth":1635,"text":262282},"2. Testing",{"id":262131,"depth":1635,"text":262284},"3. Data Migration",{"id":262168,"depth":1635,"text":262174},"content:blog:notice_of_deprecation_of_fields_and_objects_nov_2025.md","blog/notice_of_deprecation_of_fields_and_objects_nov_2025.md","blog/notice_of_deprecation_of_fields_and_objects_nov_2025",{"_path":262290,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":262291,"description":262292,"img":262293,"date":262294,"tag":12,"body":262295,"_type":1677,"_id":263023,"_source":1679,"_file":263024,"_stem":263025,"_extension":1682},"/blog/best_practices_for_zero_storage_webhooks_and_data_residency_controls_in_regulated_saas_applications","Best Practices for Zero-Storage Webhooks and Data Residency Controls in Regulated SaaS Applications","Building integrations for regulated SaaS products is rarely blocked by features. It's blocked by architecture.","https://s3.us-east-2.amazonaws.com/unified-article-images/best_practices_for_zero_storage_webhooks_and_data_residency_controls_in_regulated_saas_applications-icon.png","2025-11-07T20:43:00.000Z",{"type":14,"children":262296,"toc":263006},[262297,262302,262305,262313,262317,262322,262327,262339,262345,262350,262362,262367,262410,262415,262421,262426,262443,262454,262486,262491,262514,262519,262552,262557,262563,262572,262577,262582,262600,262605,262631,262636,262642,262654,262659,262664,262698,262703,262708,262714,262719,262724,262747,262752,262758,262763,262769,262778,262784,262789,262795,262800,262805,262811,262816,262827,262865,262870,262876,262881,262914,262919,262925,262930,262935,262958,262963,262968,262974,262979],{"type":17,"tag":18,"props":262298,"children":262300},{"id":262299},"best-practices-for-zero-storage-webhooks-and-data-residency-controls-in-regulated-saas-applications",[262301],{"type":23,"value":262291},{"type":17,"tag":25,"props":262303,"children":262304},{},[],{"type":17,"tag":29,"props":262306,"children":262307},{},[262308],{"type":17,"tag":33,"props":262309,"children":262310},{},[262311],{"type":23,"value":262312},"November 7, 2025",{"type":17,"tag":29,"props":262314,"children":262315},{},[262316],{"type":23,"value":262292},{"type":17,"tag":29,"props":262318,"children":262319},{},[262320],{"type":23,"value":262321},"Security reviews stall because customer data is stored in places no one can clearly explain. Compliance scope balloons because integration layers quietly persist third-party records. Real-time requirements clash with polling-based syncs that introduce latency, retries, and brittle logic.",{"type":17,"tag":29,"props":262323,"children":262324},{},[262325],{"type":23,"value":262326},"As SaaS teams move upmarket—and as AI-driven features become table stakes—these tradeoffs are no longer theoretical. They show up in SOC 2 audits, GDPR assessments, customer procurement reviews, and internal security sign-off.",{"type":17,"tag":29,"props":262328,"children":262329},{},[262330,262332,262337],{"type":23,"value":262331},"This article walks through ",{"type":17,"tag":48,"props":262333,"children":262334},{},[262335],{"type":23,"value":262336},"practical best practices",{"type":23,"value":262338}," for designing real-time integrations that minimize compliance risk while still supporting modern product requirements. It focuses on architectural patterns, not vendors.",{"type":17,"tag":68,"props":262340,"children":262342},{"id":262341},"why-integration-architecture-becomes-a-compliance-problem",[262343],{"type":23,"value":262344},"Why integration architecture becomes a compliance problem",{"type":17,"tag":29,"props":262346,"children":262347},{},[262348],{"type":23,"value":262349},"Most SaaS teams don't set out to build risky integration layers. The risk accumulates gradually.",{"type":17,"tag":29,"props":262351,"children":262352},{},[262353,262355,262360],{"type":23,"value":262354},"A webhook payload gets stored 'temporarily' for retries. A polling job writes records to a database for convenience. Logs capture request payloads for debugging. Over time, the integration layer becomes an ",{"type":17,"tag":48,"props":262356,"children":262357},{},[262358],{"type":23,"value":262359},"implicit data store",{"type":23,"value":262361},"—one that now falls squarely inside your compliance boundary.",{"type":17,"tag":29,"props":262363,"children":262364},{},[262365],{"type":23,"value":262366},"For regulated products, that creates several problems:",{"type":17,"tag":80,"props":262368,"children":262369},{},[262370,262380,262390,262400],{"type":17,"tag":84,"props":262371,"children":262372},{},[262373,262378],{"type":17,"tag":48,"props":262374,"children":262375},{},[262376],{"type":23,"value":262377},"Expanded audit scope",{"type":23,"value":262379},": Stored third-party data must now be audited, secured, retained, and deleted appropriately.",{"type":17,"tag":84,"props":262381,"children":262382},{},[262383,262388],{"type":17,"tag":48,"props":262384,"children":262385},{},[262386],{"type":23,"value":262387},"Unclear data residency",{"type":23,"value":262389},": If integration data is persisted, where does it live? Which region? Under whose control?",{"type":17,"tag":84,"props":262391,"children":262392},{},[262393,262398],{"type":17,"tag":48,"props":262394,"children":262395},{},[262396],{"type":23,"value":262397},"Delayed data access",{"type":23,"value":262399},": Polling and batch syncs introduce latency that breaks dashboards, automation, and AI features.",{"type":17,"tag":84,"props":262401,"children":262402},{},[262403,262408],{"type":17,"tag":48,"props":262404,"children":262405},{},[262406],{"type":23,"value":262407},"Operational drag",{"type":23,"value":262409},": Every vendor behaves differently, which multiplies maintenance and edge cases.",{"type":17,"tag":29,"props":262411,"children":262412},{},[262413],{"type":23,"value":262414},"These issues aren't solved by adding more controls after the fact. They're solved by choosing the right integration model upfront.",{"type":17,"tag":68,"props":262416,"children":262418},{"id":262417},"what-zero-storage-actually-means-and-what-it-doesnt",[262419],{"type":23,"value":262420},"What 'zero-storage' actually means (and what it doesn't)",{"type":17,"tag":29,"props":262422,"children":262423},{},[262424],{"type":23,"value":262425},"'Zero-storage' is often used loosely, so it's worth defining precisely.",{"type":17,"tag":29,"props":262427,"children":262428},{},[262429,262430,262435,262437,262441],{"type":23,"value":9619},{"type":17,"tag":48,"props":262431,"children":262432},{},[262433],{"type":23,"value":262434},"zero-storage integration architecture",{"type":23,"value":262436}," does ",{"type":17,"tag":48,"props":262438,"children":262439},{},[262440],{"type":23,"value":159475},{"type":23,"value":262442}," mean that data never touches memory. Every API call necessarily processes data in transit.",{"type":17,"tag":29,"props":262444,"children":262445},{},[262446,262448,262452],{"type":23,"value":262447},"What it ",{"type":17,"tag":33,"props":262449,"children":262450},{},[262451],{"type":23,"value":228334},{"type":23,"value":262453}," mean is:",{"type":17,"tag":80,"props":262455,"children":262456},{},[262457,262467,262472,262477],{"type":17,"tag":84,"props":262458,"children":262459},{},[262460,262462],{"type":23,"value":262461},"No third-party customer data is ",{"type":17,"tag":48,"props":262463,"children":262464},{},[262465],{"type":23,"value":262466},"persisted at rest",{"type":17,"tag":84,"props":262468,"children":262469},{},[262470],{"type":23,"value":262471},"No integration-owned database of external records",{"type":17,"tag":84,"props":262473,"children":262474},{},[262475],{"type":23,"value":262476},"No cached payloads reused across requests",{"type":17,"tag":84,"props":262478,"children":262479},{},[262480,262481],{"type":23,"value":246186},{"type":17,"tag":48,"props":262482,"children":262483},{},[262484],{"type":23,"value":262485},"persistent storage of webhook payloads for replay or downstream querying",{"type":17,"tag":29,"props":262487,"children":262488},{},[262489],{"type":23,"value":262490},"In practice, this means each request:",{"type":17,"tag":6154,"props":262492,"children":262493},{},[262494,262499,262504,262509],{"type":17,"tag":84,"props":262495,"children":262496},{},[262497],{"type":23,"value":262498},"Is authorized",{"type":17,"tag":84,"props":262500,"children":262501},{},[262502],{"type":23,"value":262503},"Is routed directly to the source API",{"type":17,"tag":84,"props":262505,"children":262506},{},[262507],{"type":23,"value":262508},"Returns data in real time",{"type":17,"tag":84,"props":262510,"children":262511},{},[262512],{"type":23,"value":262513},"Is discarded after delivery",{"type":17,"tag":29,"props":262515,"children":262516},{},[262517],{"type":23,"value":262518},"Why this matters for regulated SaaS teams:",{"type":17,"tag":80,"props":262520,"children":262521},{},[262522,262532,262542],{"type":17,"tag":84,"props":262523,"children":262524},{},[262525,262530],{"type":17,"tag":48,"props":262526,"children":262527},{},[262528],{"type":23,"value":262529},"Smaller compliance footprint",{"type":23,"value":262531},": Fewer components fall inside audit scope.",{"type":17,"tag":84,"props":262533,"children":262534},{},[262535,262540],{"type":17,"tag":48,"props":262536,"children":262537},{},[262538],{"type":23,"value":262539},"Clear data boundaries",{"type":23,"value":262541},": Data residency is determined by the source platform and your own application, with integration infrastructure expected to support regional routing where required.",{"type":17,"tag":84,"props":262543,"children":262544},{},[262545,262550],{"type":17,"tag":48,"props":262546,"children":262547},{},[262548],{"type":23,"value":262549},"Faster security reviews",{"type":23,"value":262551},": 'We don't store customer data' is easier to validate than 'we store some of it, sometimes.'",{"type":17,"tag":29,"props":262553,"children":262554},{},[262555],{"type":23,"value":262556},"Zero-storage isn't a marketing claim. It's an architectural constraint—and a useful one.",{"type":17,"tag":68,"props":262558,"children":262560},{"id":262559},"webhooks-real-time-in-theory-inconsistent-in-practice",[262561],{"type":23,"value":262562},"Webhooks: real-time in theory, inconsistent in practice",{"type":17,"tag":29,"props":262564,"children":262565},{},[262566,262570],{"type":17,"tag":133,"props":262567,"children":262568},{"href":4999},[262569],{"type":23,"value":43896},{"type":23,"value":262571}," are often treated as the answer to real-time data delivery. In reality, they're inconsistent across SaaS platforms.",{"type":17,"tag":29,"props":262573,"children":262574},{},[262575],{"type":23,"value":262576},"Some APIs offer robust native webhooks with clear guarantees. Many don't. Some only emit partial events. Others emit nothing at all.",{"type":17,"tag":29,"props":262578,"children":262579},{},[262580],{"type":23,"value":262581},"As a result, teams usually face three options:",{"type":17,"tag":6154,"props":262583,"children":262584},{},[262585,262590,262595],{"type":17,"tag":84,"props":262586,"children":262587},{},[262588],{"type":23,"value":262589},"Rely on native webhooks where available",{"type":17,"tag":84,"props":262591,"children":262592},{},[262593],{"type":23,"value":262594},"Build polling jobs for everything else",{"type":17,"tag":84,"props":262596,"children":262597},{},[262598],{"type":23,"value":262599},"Accept delayed or stale data",{"type":17,"tag":29,"props":262601,"children":262602},{},[262603],{"type":23,"value":262604},"Polling solves availability but introduces new problems:",{"type":17,"tag":80,"props":262606,"children":262607},{},[262608,262613,262617,262622,262626],{"type":17,"tag":84,"props":262609,"children":262610},{},[262611],{"type":23,"value":262612},"Increased latency",{"type":17,"tag":84,"props":262614,"children":262615},{},[262616],{"type":23,"value":228927},{"type":17,"tag":84,"props":262618,"children":262619},{},[262620],{"type":23,"value":262621},"Custom retry and backoff logic",{"type":17,"tag":84,"props":262623,"children":262624},{},[262625],{"type":23,"value":46374},{"type":17,"tag":84,"props":262627,"children":262628},{},[262629],{"type":23,"value":262630},"Stored state for change detection",{"type":17,"tag":29,"props":262632,"children":262633},{},[262634],{"type":23,"value":262635},"For regulated environments, polling often means storing previous snapshots of data—immediately breaking zero-storage guarantees.",{"type":17,"tag":68,"props":262637,"children":262639},{"id":262638},"designing-webhook-fallbacks-without-storing-data",[262640],{"type":23,"value":262641},"Designing webhook fallbacks without storing data",{"type":17,"tag":29,"props":262643,"children":262644},{},[262645,262647,262652],{"type":23,"value":262646},"A better pattern is to treat webhooks as a ",{"type":17,"tag":48,"props":262648,"children":262649},{},[262650],{"type":23,"value":262651},"delivery interface",{"type":23,"value":262653},", not a vendor-specific feature.",{"type":17,"tag":29,"props":262655,"children":262656},{},[262657],{"type":23,"value":262658},"When native webhooks exist, consume them directly. When they don't, deliver the same webhook interface by managing change detection upstream—without persisting customer data.",{"type":17,"tag":29,"props":262660,"children":262661},{},[262662],{"type":23,"value":262663},"At a high level, a well-designed webhook fallback should:",{"type":17,"tag":80,"props":262665,"children":262666},{},[262667,262672,262677,262682,262693],{"type":17,"tag":84,"props":262668,"children":262669},{},[262670],{"type":23,"value":262671},"Poll the source API on a controlled schedule",{"type":17,"tag":84,"props":262673,"children":262674},{},[262675],{"type":23,"value":262676},"Detect changes deterministically",{"type":17,"tag":84,"props":262678,"children":262679},{},[262680],{"type":23,"value":262681},"Deliver only the updated records",{"type":17,"tag":84,"props":262683,"children":262684},{},[262685,262687,262691],{"type":23,"value":262686},"Handle retries and ",{"type":17,"tag":133,"props":262688,"children":262689},{"href":135},[262690],{"type":23,"value":138},{"type":23,"value":262692}," centrally",{"type":17,"tag":84,"props":262694,"children":262695},{},[262696],{"type":23,"value":262697},"Avoid persistent storage of payloads or snapshots",{"type":17,"tag":29,"props":262699,"children":262700},{},[262701],{"type":23,"value":262702},"From the application's perspective, the result is consistent: webhook events arrive when data changes, regardless of whether the source platform supports native events.",{"type":17,"tag":29,"props":262704,"children":262705},{},[262706],{"type":23,"value":262707},"This approach preserves real-time behavior while maintaining a stateless architecture.",{"type":17,"tag":68,"props":262709,"children":262711},{"id":262710},"data-residency-what-actually-reduces-risk",[262712],{"type":23,"value":262713},"Data residency: what actually reduces risk",{"type":17,"tag":29,"props":262715,"children":262716},{},[262717],{"type":23,"value":262718},"Data residency discussions often focus on geography, but location is only part of the story. Control matters just as much.",{"type":17,"tag":29,"props":262720,"children":262721},{},[262722],{"type":23,"value":262723},"In regulated SaaS environments, teams are typically asked:",{"type":17,"tag":80,"props":262725,"children":262726},{},[262727,262732,262737,262742],{"type":17,"tag":84,"props":262728,"children":262729},{},[262730],{"type":23,"value":262731},"Where does customer data flow?",{"type":17,"tag":84,"props":262733,"children":262734},{},[262735],{"type":23,"value":262736},"Where is it stored?",{"type":17,"tag":84,"props":262738,"children":262739},{},[262740],{"type":23,"value":262741},"Who controls access?",{"type":17,"tag":84,"props":262743,"children":262744},{},[262745],{"type":23,"value":262746},"How is it logged?",{"type":17,"tag":29,"props":262748,"children":262749},{},[262750],{"type":23,"value":262751},"Effective data residency strategies usually include:",{"type":17,"tag":239,"props":262753,"children":262755},{"id":262754},"regional-routing",[262756],{"type":23,"value":262757},"Regional routing",{"type":17,"tag":29,"props":262759,"children":262760},{},[262761],{"type":23,"value":262762},"Requests should stay within the appropriate jurisdiction (for example, EU versus North America). This matters even when no data is stored, as traffic patterns themselves can raise questions during review.",{"type":17,"tag":239,"props":262764,"children":262766},{"id":262765},"customer-owned-secrets",[262767],{"type":23,"value":262768},"Customer-owned secrets",{"type":17,"tag":29,"props":262770,"children":262771},{},[262772,262776],{"type":17,"tag":133,"props":262773,"children":262774},{"href":779},[262775],{"type":23,"value":782},{"type":23,"value":262777}," tokens and API keys are sensitive. Allowing teams to keep credentials in their own secrets manager—rather than a third-party database—simplifies trust boundaries and internal approvals.",{"type":17,"tag":239,"props":262779,"children":262781},{"id":262780},"network-controls",[262782],{"type":23,"value":262783},"Network controls",{"type":17,"tag":29,"props":262785,"children":262786},{},[262787],{"type":23,"value":262788},"IP allow-listing and explicit routing reduce the surface area of integration access.",{"type":17,"tag":239,"props":262790,"children":262792},{"id":262791},"private-observability",[262793],{"type":23,"value":262794},"Private observability",{"type":17,"tag":29,"props":262796,"children":262797},{},[262798],{"type":23,"value":262799},"Logs are often overlooked. Shipping detailed request logs directly to a customer-owned logging platform ensures visibility without creating another data store.",{"type":17,"tag":29,"props":262801,"children":262802},{},[262803],{"type":23,"value":262804},"Residency isn't solved by a checkbox. It's solved by giving teams control over where data flows and what persists.",{"type":17,"tag":68,"props":262806,"children":262808},{"id":262807},"a-concrete-reference-architecture-one-example",[262809],{"type":23,"value":262810},"A concrete reference architecture (one example)",{"type":17,"tag":29,"props":262812,"children":262813},{},[262814],{"type":23,"value":262815},"To make these ideas less abstract, it helps to look at a real implementation.",{"type":17,"tag":29,"props":262817,"children":262818},{},[262819,262821,262825],{"type":23,"value":262820},"One example is how ",{"type":17,"tag":48,"props":262822,"children":262823},{},[262824],{"type":23,"value":87523},{"type":23,"value":262826}," is used by regulated SaaS teams as an integration layer that follows these principles:",{"type":17,"tag":80,"props":262828,"children":262829},{},[262830,262835,262840,262845,262850,262855,262860],{"type":17,"tag":84,"props":262831,"children":262832},{},[262833],{"type":23,"value":262834},"Requests are stateless and pass-through, fetched directly from source APIs",{"type":17,"tag":84,"props":262836,"children":262837},{},[262838],{"type":23,"value":262839},"No third-party customer data is stored or cached",{"type":17,"tag":84,"props":262841,"children":262842},{},[262843],{"type":23,"value":262844},"Native webhooks are used where available",{"type":17,"tag":84,"props":262846,"children":262847},{},[262848],{"type":23,"value":262849},"Webhook fallbacks are delivered through managed change detection without persistent payload storage",{"type":17,"tag":84,"props":262851,"children":262852},{},[262853],{"type":23,"value":262854},"Credentials can be stored in customer-owned secrets infrastructure",{"type":17,"tag":84,"props":262856,"children":262857},{},[262858],{"type":23,"value":262859},"Traffic can be routed regionally",{"type":17,"tag":84,"props":262861,"children":262862},{},[262863],{"type":23,"value":262864},"Logs can be streamed to customer-controlled observability tools",{"type":17,"tag":29,"props":262866,"children":262867},{},[262868],{"type":23,"value":262869},"The important part isn't the product—it's the pattern. This is one way teams operationalize zero-storage and real-time delivery without expanding their compliance surface.",{"type":17,"tag":68,"props":262871,"children":262873},{"id":262872},"what-to-ask-when-evaluating-integration-architectures",[262874],{"type":23,"value":262875},"What to ask when evaluating integration architectures",{"type":17,"tag":29,"props":262877,"children":262878},{},[262879],{"type":23,"value":262880},"Whether you build integrations in-house or rely on an external layer, these questions tend to surface during audits and security reviews:",{"type":17,"tag":80,"props":262882,"children":262883},{},[262884,262889,262894,262899,262904,262909],{"type":17,"tag":84,"props":262885,"children":262886},{},[262887],{"type":23,"value":262888},"Do you store any third-party customer data at rest?",{"type":17,"tag":84,"props":262890,"children":262891},{},[262892],{"type":23,"value":262893},"Are webhook payloads persisted for retries or replay?",{"type":17,"tag":84,"props":262895,"children":262896},{},[262897],{"type":23,"value":262898},"How do you handle platforms without native webhooks?",{"type":17,"tag":84,"props":262900,"children":262901},{},[262902],{"type":23,"value":262903},"Where are credentials stored, and who controls them?",{"type":17,"tag":84,"props":262905,"children":262906},{},[262907],{"type":23,"value":262908},"Can traffic be routed regionally?",{"type":17,"tag":84,"props":262910,"children":262911},{},[262912],{"type":23,"value":262913},"Where do logs live, and what do they contain?",{"type":17,"tag":29,"props":262915,"children":262916},{},[262917],{"type":23,"value":262918},"Clear answers to these questions usually matter more than feature checklists.",{"type":17,"tag":68,"props":262920,"children":262922},{"id":262921},"why-this-matters-for-modern-saas-teams",[262923],{"type":23,"value":262924},"Why this matters for modern SaaS teams",{"type":17,"tag":29,"props":262926,"children":262927},{},[262928],{"type":23,"value":262929},"As SaaS products become more interconnected—and as AI features rely on timely, accurate data—the cost of stale or over-stored data increases.",{"type":17,"tag":29,"props":262931,"children":262932},{},[262933],{"type":23,"value":262934},"Zero-storage, real-time architectures aren't just about compliance. They also enable:",{"type":17,"tag":80,"props":262936,"children":262937},{},[262938,262943,262948,262953],{"type":17,"tag":84,"props":262939,"children":262940},{},[262941],{"type":23,"value":262942},"Faster user experiences",{"type":17,"tag":84,"props":262944,"children":262945},{},[262946],{"type":23,"value":262947},"Simpler system design",{"type":17,"tag":84,"props":262949,"children":262950},{},[262951],{"type":23,"value":262952},"More reliable AI-driven features",{"type":17,"tag":84,"props":262954,"children":262955},{},[262956],{"type":23,"value":262957},"Lower long-term maintenance cost",{"type":17,"tag":29,"props":262959,"children":262960},{},[262961],{"type":23,"value":262962},"Most importantly, they align incentives. When integrations don't store data, teams are forced to design around clear boundaries and explicit authorization.",{"type":17,"tag":29,"props":262964,"children":262965},{},[262966],{"type":23,"value":262967},"That discipline pays off when the first enterprise security questionnaire arrives—or when your product starts to scale into regulated markets.",{"type":17,"tag":239,"props":262969,"children":262971},{"id":262970},"take-the-next-step",[262972],{"type":23,"value":262973},"Take the next step",{"type":17,"tag":29,"props":262975,"children":262976},{},[262977],{"type":23,"value":262978},"If you're evaluating real-time, zero-storage integration architectures for a regulated SaaS product, seeing a concrete implementation can help clarify tradeoffs and requirements.",{"type":17,"tag":29,"props":262980,"children":262981},{},[262982,262984,262992,262993,262997,262998],{"type":23,"value":262983},"You can explore Unified's approach hands-on, or talk through your specific constraints with the team: ",{"type":17,"tag":133,"props":262985,"children":262987},{"href":1612,"rel":262986},[214],[262988],{"type":17,"tag":48,"props":262989,"children":262990},{},[262991],{"type":23,"value":1616},{"type":23,"value":18757},{"type":17,"tag":48,"props":262994,"children":262995},{},[262996],{"type":23,"value":217439},{"type":23,"value":18757},{"type":17,"tag":133,"props":262999,"children":263001},{"href":1623,"rel":263000},[214],[263002],{"type":17,"tag":48,"props":263003,"children":263004},{},[263005],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":263007},[263008,263009,263010,263011,263012,263018,263019,263020],{"id":262341,"depth":1629,"text":262344},{"id":262417,"depth":1629,"text":262420},{"id":262559,"depth":1629,"text":262562},{"id":262638,"depth":1629,"text":262641},{"id":262710,"depth":1629,"text":262713,"children":263013},[263014,263015,263016,263017],{"id":262754,"depth":1635,"text":262757},{"id":262765,"depth":1635,"text":262768},{"id":262780,"depth":1635,"text":262783},{"id":262791,"depth":1635,"text":262794},{"id":262807,"depth":1629,"text":262810},{"id":262872,"depth":1629,"text":262875},{"id":262921,"depth":1629,"text":262924,"children":263021},[263022],{"id":262970,"depth":1635,"text":262973},"content:blog:best_practices_for_zero_storage_webhooks_and_data_residency_controls_in_regulated_saas_applications.md","blog/best_practices_for_zero_storage_webhooks_and_data_residency_controls_in_regulated_saas_applications.md","blog/best_practices_for_zero_storage_webhooks_and_data_residency_controls_in_regulated_saas_applications",{"_path":263027,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":263028,"description":263029,"img":263030,"date":263031,"tag":12,"body":263032,"_type":1677,"_id":264563,"_source":1679,"_file":264564,"_stem":264565,"_extension":1682},"/blog/etl_vs_ipaas_vs_unified_api_complete_architecture_guide_for_saas_teams","ETL vs iPaaS vs Unified API: Complete Architecture Guide for SaaS Teams","Choosing between ETL, iPaaS, and unified APIs is not a tooling decision—it's an architecture decision that directly impacts how your product scales, how fast...","https://s3.us-east-2.amazonaws.com/unified-article-images/etl_vs_ipaas_vs_unified_api_complete_architecture_guide_for_saas_teams-icon.png","2025-11-05T13:28:00.000Z",{"type":14,"children":263033,"toc":264516},[263034,263039,263042,263050,263055,263060,263072,263078,263084,263089,263093,263109,263114,263132,263137,263143,263148,263152,263170,263175,263193,263198,263203,263208,263212,263229,263234,263252,263257,263263,263268,263273,263291,263296,263302,263313,263431,263436,263459,263464,263470,263475,263480,263498,263503,263508,263526,263531,263536,263554,263559,263564,263582,263587,263593,263598,263603,263621,263626,263631,263655,263660,263665,263683,263688,263693,263715,263720,263726,263731,263737,263750,263755,263773,263778,263786,263790,263803,263808,263820,263824,263842,263848,263853,263945,263950,263956,263961,263966,263979,263984,263997,264002,264015,264020,264038,264043,264047,264052,264057,264070,264074,264092,264097,264110,264114,264127,264132,264149,264153,264171,264177,264182,264294,264299,264305,264310,264349,264354,264360,264366,264384,264390,264408,264413,264431,264437,264460,264464,264497,264508],{"type":17,"tag":18,"props":263035,"children":263037},{"id":263036},"etl-vs-ipaas-vs-unified-api-complete-architecture-guide-for-saas-teams",[263038],{"type":23,"value":263028},{"type":17,"tag":25,"props":263040,"children":263041},{},[],{"type":17,"tag":29,"props":263043,"children":263044},{},[263045],{"type":17,"tag":33,"props":263046,"children":263047},{},[263048],{"type":23,"value":263049},"November 5, 2025",{"type":17,"tag":29,"props":263051,"children":263052},{},[263053],{"type":23,"value":263054},"Choosing between ETL, iPaaS, and unified APIs is not a tooling decision—it's an architecture decision that directly impacts how your product scales, how fast you ship, and how much ongoing maintenance you absorb.",{"type":17,"tag":29,"props":263056,"children":263057},{},[263058],{"type":23,"value":263059},"ETL was built for internal data movement and analytics. iPaaS was built for workflow automation across tools. Unified APIs were built for product integrations—but most early versions still rely on stored or synced data.",{"type":17,"tag":29,"props":263061,"children":263062},{},[263063,263065,263070],{"type":23,"value":263064},"Modern SaaS teams are increasingly moving toward ",{"type":17,"tag":48,"props":263066,"children":263067},{},[263068],{"type":23,"value":263069},"real-time, pass-through integration architectures",{"type":23,"value":263071}," that reduce maintenance, improve data freshness, and minimize compliance risk. The differences between these approaches become more pronounced as you scale integrations across customers, vendors, and use cases.",{"type":17,"tag":68,"props":263073,"children":263075},{"id":263074},"what-each-integration-approach-is-actually-designed-for",[263076],{"type":23,"value":263077},"What each integration approach is actually designed for",{"type":17,"tag":239,"props":263079,"children":263081},{"id":263080},"etl-extract-transform-load",[263082],{"type":23,"value":263083},"ETL (Extract, Transform, Load)",{"type":17,"tag":29,"props":263085,"children":263086},{},[263087],{"type":23,"value":263088},"ETL pipelines move data between systems on a schedule, typically into a warehouse.",{"type":17,"tag":29,"props":263090,"children":263091},{},[263092],{"type":23,"value":99135},{"type":17,"tag":80,"props":263094,"children":263095},{},[263096,263100,263104],{"type":17,"tag":84,"props":263097,"children":263098},{},[263099],{"type":23,"value":102323},{"type":17,"tag":84,"props":263101,"children":263102},{},[263103],{"type":23,"value":966},{"type":17,"tag":84,"props":263105,"children":263106},{},[263107],{"type":23,"value":263108},"internal data consolidation",{"type":17,"tag":29,"props":263110,"children":263111},{},[263112],{"type":23,"value":263113},"They are not designed for:",{"type":17,"tag":80,"props":263115,"children":263116},{},[263117,263122,263127],{"type":17,"tag":84,"props":263118,"children":263119},{},[263120],{"type":23,"value":263121},"user-facing product integrations",{"type":17,"tag":84,"props":263123,"children":263124},{},[263125],{"type":23,"value":263126},"real-time application logic",{"type":17,"tag":84,"props":263128,"children":263129},{},[263130],{"type":23,"value":263131},"multi-tenant SaaS environments",{"type":17,"tag":29,"props":263133,"children":263134},{},[263135],{"type":23,"value":263136},"ETL introduces latency, requires custom pipelines per source, and demands ongoing maintenance as schemas evolve.",{"type":17,"tag":239,"props":263138,"children":263140},{"id":263139},"ipaas-integration-platform-as-a-service",[263141],{"type":23,"value":263142},"iPaaS (Integration Platform as a Service)",{"type":17,"tag":29,"props":263144,"children":263145},{},[263146],{"type":23,"value":263147},"iPaaS platforms connect applications through workflows, triggers, and automation logic.",{"type":17,"tag":29,"props":263149,"children":263150},{},[263151],{"type":23,"value":99135},{"type":17,"tag":80,"props":263153,"children":263154},{},[263155,263160,263165],{"type":17,"tag":84,"props":263156,"children":263157},{},[263158],{"type":23,"value":263159},"internal business automation",{"type":17,"tag":84,"props":263161,"children":263162},{},[263163],{"type":23,"value":263164},"no-code / low-code workflows",{"type":17,"tag":84,"props":263166,"children":263167},{},[263168],{"type":23,"value":263169},"operational task orchestration",{"type":17,"tag":29,"props":263171,"children":263172},{},[263173],{"type":23,"value":263174},"They are not optimized for:",{"type":17,"tag":80,"props":263176,"children":263177},{},[263178,263183,263188],{"type":17,"tag":84,"props":263179,"children":263180},{},[263181],{"type":23,"value":263182},"developer-first product integrations",{"type":17,"tag":84,"props":263184,"children":263185},{},[263186],{"type":23,"value":263187},"consistent multi-tenant architectures",{"type":17,"tag":84,"props":263189,"children":263190},{},[263191],{"type":23,"value":263192},"large-scale integration delivery inside SaaS products",{"type":17,"tag":29,"props":263194,"children":263195},{},[263196],{"type":23,"value":263197},"Each integration is effectively its own workflow, with separate logic, mappings, and monitoring requirements.",{"type":17,"tag":239,"props":263199,"children":263201},{"id":263200},"unified-apis",[263202],{"type":23,"value":78607},{"type":17,"tag":29,"props":263204,"children":263205},{},[263206],{"type":23,"value":263207},"Unified APIs provide a single API layer that abstracts multiple third-party services into a shared interface.",{"type":17,"tag":29,"props":263209,"children":263210},{},[263211],{"type":23,"value":99135},{"type":17,"tag":80,"props":263213,"children":263214},{},[263215,263219,263224],{"type":17,"tag":84,"props":263216,"children":263217},{},[263218],{"type":23,"value":1386},{"type":17,"tag":84,"props":263220,"children":263221},{},[263222],{"type":23,"value":263223},"simplified developer experience",{"type":17,"tag":84,"props":263225,"children":263226},{},[263227],{"type":23,"value":263228},"multi-integration SaaS products",{"type":17,"tag":29,"props":263230,"children":263231},{},[263232],{"type":23,"value":263233},"However, most first-generation unified APIs:",{"type":17,"tag":80,"props":263235,"children":263236},{},[263237,263242,263247],{"type":17,"tag":84,"props":263238,"children":263239},{},[263240],{"type":23,"value":263241},"store or cache customer data",{"type":17,"tag":84,"props":263243,"children":263244},{},[263245],{"type":23,"value":263246},"provide shallow normalization",{"type":17,"tag":84,"props":263248,"children":263249},{},[263250],{"type":23,"value":263251},"still require vendor-specific handling",{"type":17,"tag":29,"props":263253,"children":263254},{},[263255],{"type":23,"value":263256},"This reduces initial effort but introduces long-term complexity.",{"type":17,"tag":239,"props":263258,"children":263260},{"id":263259},"real-time-unified-apis-modern-architecture",[263261],{"type":23,"value":263262},"Real-time unified APIs (modern architecture)",{"type":17,"tag":29,"props":263264,"children":263265},{},[263266],{"type":23,"value":263267},"A newer approach removes the core limitations of earlier models.",{"type":17,"tag":29,"props":263269,"children":263270},{},[263271],{"type":23,"value":263272},"Real-time unified APIs:",{"type":17,"tag":80,"props":263274,"children":263275},{},[263276,263281,263286],{"type":17,"tag":84,"props":263277,"children":263278},{},[263279],{"type":23,"value":263280},"execute requests directly against source systems",{"type":17,"tag":84,"props":263282,"children":263283},{},[263284],{"type":23,"value":263285},"do not store or replicate customer data",{"type":17,"tag":84,"props":263287,"children":263288},{},[263289],{"type":23,"value":263290},"provide consistent schemas, auth, and event handling",{"type":17,"tag":29,"props":263292,"children":263293},{},[263294],{"type":23,"value":263295},"This model reduces infrastructure overhead while improving performance and compliance.",{"type":17,"tag":68,"props":263297,"children":263299},{"id":263298},"real-time-vs-batch-the-foundation-of-modern-integrations",[263300],{"type":23,"value":263301},"Real-time vs batch: the foundation of modern integrations",{"type":17,"tag":29,"props":263303,"children":263304},{},[263305,263307,263312],{"type":23,"value":263306},"The biggest architectural divide across these platforms is ",{"type":17,"tag":48,"props":263308,"children":263309},{},[263310],{"type":23,"value":263311},"how data moves",{"type":23,"value":54},{"type":17,"tag":7231,"props":263314,"children":263315},{},[263316,263339],{"type":17,"tag":7235,"props":263317,"children":263318},{},[263319],{"type":17,"tag":7239,"props":263320,"children":263321},{},[263322,263326,263331,263335],{"type":17,"tag":7243,"props":263323,"children":263324},{},[263325],{"type":23,"value":81201},{"type":17,"tag":7243,"props":263327,"children":263328},{},[263329],{"type":23,"value":263330},"Processing model",{"type":17,"tag":7243,"props":263332,"children":263333},{},[263334],{"type":23,"value":9978},{"type":17,"tag":7243,"props":263336,"children":263337},{},[263338],{"type":23,"value":9960},{"type":17,"tag":7259,"props":263340,"children":263341},{},[263342,263365,263386,263408],{"type":17,"tag":7239,"props":263343,"children":263344},{},[263345,263350,263355,263360],{"type":17,"tag":7266,"props":263346,"children":263347},{},[263348],{"type":23,"value":263349},"ETL",{"type":17,"tag":7266,"props":263351,"children":263352},{},[263353],{"type":23,"value":263354},"Batch",{"type":17,"tag":7266,"props":263356,"children":263357},{},[263358],{"type":23,"value":263359},"Hours–days",{"type":17,"tag":7266,"props":263361,"children":263362},{},[263363],{"type":23,"value":263364},"Stale",{"type":17,"tag":7239,"props":263366,"children":263367},{},[263368,263372,263377,263381],{"type":17,"tag":7266,"props":263369,"children":263370},{},[263371],{"type":23,"value":69365},{"type":17,"tag":7266,"props":263373,"children":263374},{},[263375],{"type":23,"value":263376},"Polling / scheduled",{"type":17,"tag":7266,"props":263378,"children":263379},{},[263380],{"type":23,"value":69432},{"type":17,"tag":7266,"props":263382,"children":263383},{},[263384],{"type":23,"value":263385},"Delayed",{"type":17,"tag":7239,"props":263387,"children":263388},{},[263389,263394,263399,263403],{"type":17,"tag":7266,"props":263390,"children":263391},{},[263392],{"type":23,"value":263393},"Unified API (Gen 1)",{"type":17,"tag":7266,"props":263395,"children":263396},{},[263397],{"type":23,"value":263398},"Cached / sync",{"type":17,"tag":7266,"props":263400,"children":263401},{},[263402],{"type":23,"value":69432},{"type":17,"tag":7266,"props":263404,"children":263405},{},[263406],{"type":23,"value":263407},"Semi-stale",{"type":17,"tag":7239,"props":263409,"children":263410},{},[263411,263416,263421,263426],{"type":17,"tag":7266,"props":263412,"children":263413},{},[263414],{"type":23,"value":263415},"Real-time unified API",{"type":17,"tag":7266,"props":263417,"children":263418},{},[263419],{"type":23,"value":263420},"On-demand",{"type":17,"tag":7266,"props":263422,"children":263423},{},[263424],{"type":23,"value":263425},"Instant",{"type":17,"tag":7266,"props":263427,"children":263428},{},[263429],{"type":23,"value":263430},"Live",{"type":17,"tag":29,"props":263432,"children":263433},{},[263434],{"type":23,"value":263435},"Batch and polling systems introduce lag by design. That lag affects:",{"type":17,"tag":80,"props":263437,"children":263438},{},[263439,263444,263449,263454],{"type":17,"tag":84,"props":263440,"children":263441},{},[263442],{"type":23,"value":263443},"in-app product experiences",{"type":17,"tag":84,"props":263445,"children":263446},{},[263447],{"type":23,"value":263448},"automation accuracy",{"type":17,"tag":84,"props":263450,"children":263451},{},[263452],{"type":23,"value":263453},"AI outputs",{"type":17,"tag":84,"props":263455,"children":263456},{},[263457],{"type":23,"value":263458},"user trust",{"type":17,"tag":29,"props":263460,"children":263461},{},[263462],{"type":23,"value":263463},"Real-time access removes that gap entirely.",{"type":17,"tag":68,"props":263465,"children":263467},{"id":263466},"maintenance-and-operational-overhead",[263468],{"type":23,"value":263469},"Maintenance and operational overhead",{"type":17,"tag":29,"props":263471,"children":263472},{},[263473],{"type":23,"value":263474},"Maintenance is where architectural differences become most expensive.",{"type":17,"tag":239,"props":263476,"children":263478},{"id":263477},"etl",[263479],{"type":23,"value":263349},{"type":17,"tag":80,"props":263481,"children":263482},{},[263483,263488,263493],{"type":17,"tag":84,"props":263484,"children":263485},{},[263486],{"type":23,"value":263487},"pipelines must be rebuilt when schemas change",{"type":17,"tag":84,"props":263489,"children":263490},{},[263491],{"type":23,"value":263492},"jobs must be monitored and retried",{"type":17,"tag":84,"props":263494,"children":263495},{},[263496],{"type":23,"value":263497},"transformations require ongoing updates",{"type":17,"tag":29,"props":263499,"children":263500},{},[263501],{"type":23,"value":263502},"Result: continuous engineering overhead and technical debt.",{"type":17,"tag":239,"props":263504,"children":263506},{"id":263505},"ipaas",[263507],{"type":23,"value":69365},{"type":17,"tag":80,"props":263509,"children":263510},{},[263511,263516,263521],{"type":17,"tag":84,"props":263512,"children":263513},{},[263514],{"type":23,"value":263515},"workflows break when APIs change",{"type":17,"tag":84,"props":263517,"children":263518},{},[263519],{"type":23,"value":263520},"polling jobs fail silently",{"type":17,"tag":84,"props":263522,"children":263523},{},[263524],{"type":23,"value":263525},"field mappings drift over time",{"type":17,"tag":29,"props":263527,"children":263528},{},[263529],{"type":23,"value":263530},"Result: moderate but persistent operational burden.",{"type":17,"tag":239,"props":263532,"children":263533},{"id":91072},[263534],{"type":23,"value":263535},"First-generation unified APIs",{"type":17,"tag":80,"props":263537,"children":263538},{},[263539,263544,263549],{"type":17,"tag":84,"props":263540,"children":263541},{},[263542],{"type":23,"value":263543},"partial normalization requires manual fixes",{"type":17,"tag":84,"props":263545,"children":263546},{},[263547],{"type":23,"value":263548},"vendor edge cases accumulate",{"type":17,"tag":84,"props":263550,"children":263551},{},[263552],{"type":23,"value":263553},"schema gaps create rework",{"type":17,"tag":29,"props":263555,"children":263556},{},[263557],{"type":23,"value":263558},"Result: reduced initial effort, but growing long-term maintenance.",{"type":17,"tag":239,"props":263560,"children":263561},{"id":91134},[263562],{"type":23,"value":263563},"Real-time unified APIs",{"type":17,"tag":80,"props":263565,"children":263566},{},[263567,263572,263577],{"type":17,"tag":84,"props":263568,"children":263569},{},[263570],{"type":23,"value":263571},"no pipelines to maintain",{"type":17,"tag":84,"props":263573,"children":263574},{},[263575],{"type":23,"value":263576},"no stored datasets to reconcile",{"type":17,"tag":84,"props":263578,"children":263579},{},[263580],{"type":23,"value":263581},"API changes handled centrally",{"type":17,"tag":29,"props":263583,"children":263584},{},[263585],{"type":23,"value":263586},"Result: dramatically lower maintenance footprint.",{"type":17,"tag":68,"props":263588,"children":263590},{"id":263589},"authorization-and-security-model",[263591],{"type":23,"value":263592},"Authorization and security model",{"type":17,"tag":29,"props":263594,"children":263595},{},[263596],{"type":23,"value":263597},"Authorization complexity increases with every integration.",{"type":17,"tag":239,"props":263599,"children":263601},{"id":263600},"etl-1",[263602],{"type":23,"value":263349},{"type":17,"tag":80,"props":263604,"children":263605},{},[263606,263611,263616],{"type":17,"tag":84,"props":263607,"children":263608},{},[263609],{"type":23,"value":263610},"uses system-level credentials",{"type":17,"tag":84,"props":263612,"children":263613},{},[263614],{"type":23,"value":263615},"no user-level authorization",{"type":17,"tag":84,"props":263617,"children":263618},{},[263619],{"type":23,"value":263620},"no tenant isolation",{"type":17,"tag":29,"props":263622,"children":263623},{},[263624],{"type":23,"value":263625},"Risk: overexposed access and no control granularity.",{"type":17,"tag":239,"props":263627,"children":263629},{"id":263628},"ipaas-1",[263630],{"type":23,"value":69365},{"type":17,"tag":80,"props":263632,"children":263633},{},[263634,263639,263650],{"type":17,"tag":84,"props":263635,"children":263636},{},[263637],{"type":23,"value":263638},"per-connector credential management",{"type":17,"tag":84,"props":263640,"children":263641},{},[263642,263644,263648],{"type":23,"value":263643},"inconsistent ",{"type":17,"tag":133,"props":263645,"children":263646},{"href":779},[263647],{"type":23,"value":782},{"type":23,"value":263649}," implementations",{"type":17,"tag":84,"props":263651,"children":263652},{},[263653],{"type":23,"value":263654},"limited tenant isolation",{"type":17,"tag":29,"props":263656,"children":263657},{},[263658],{"type":23,"value":263659},"Risk: fragmented auth logic and centralized credential exposure.",{"type":17,"tag":239,"props":263661,"children":263663},{"id":263662},"first-generation-unified-apis-1",[263664],{"type":23,"value":263535},{"type":17,"tag":80,"props":263666,"children":263667},{},[263668,263673,263678],{"type":17,"tag":84,"props":263669,"children":263670},{},[263671],{"type":23,"value":263672},"provider-specific OAuth handling",{"type":17,"tag":84,"props":263674,"children":263675},{},[263676],{"type":23,"value":263677},"token management often manual",{"type":17,"tag":84,"props":263679,"children":263680},{},[263681],{"type":23,"value":263682},"inconsistent scope enforcement",{"type":17,"tag":29,"props":263684,"children":263685},{},[263686],{"type":23,"value":263687},"Risk: high complexity and compliance exposure.",{"type":17,"tag":239,"props":263689,"children":263691},{"id":263690},"real-time-unified-apis-1",[263692],{"type":23,"value":263563},{"type":17,"tag":80,"props":263694,"children":263695},{},[263696,263701,263706,263711],{"type":17,"tag":84,"props":263697,"children":263698},{},[263699],{"type":23,"value":263700},"standardized OAuth flows",{"type":17,"tag":84,"props":263702,"children":263703},{},[263704],{"type":23,"value":263705},"normalized permission scopes",{"type":17,"tag":84,"props":263707,"children":263708},{},[263709],{"type":23,"value":263710},"automatic token refresh and rotation",{"type":17,"tag":84,"props":263712,"children":263713},{},[263714],{"type":23,"value":65793},{"type":17,"tag":29,"props":263716,"children":263717},{},[263718],{"type":23,"value":263719},"Result: consistent, auditable, and scalable authorization.",{"type":17,"tag":68,"props":263721,"children":263723},{"id":263722},"data-architecture-and-storage-model",[263724],{"type":23,"value":263725},"Data architecture and storage model",{"type":17,"tag":29,"props":263727,"children":263728},{},[263729],{"type":23,"value":263730},"How data is handled determines both performance and compliance risk.",{"type":17,"tag":239,"props":263732,"children":263734},{"id":263733},"etl-and-ipaas",[263735],{"type":23,"value":263736},"ETL and iPaaS",{"type":17,"tag":80,"props":263738,"children":263739},{},[263740,263745],{"type":17,"tag":84,"props":263741,"children":263742},{},[263743],{"type":23,"value":263744},"replicate data into intermediate systems",{"type":17,"tag":84,"props":263746,"children":263747},{},[263748],{"type":23,"value":263749},"store data for processing or retries",{"type":17,"tag":29,"props":263751,"children":263752},{},[263753],{"type":23,"value":263754},"Impact:",{"type":17,"tag":80,"props":263756,"children":263757},{},[263758,263763,263768],{"type":17,"tag":84,"props":263759,"children":263760},{},[263761],{"type":23,"value":263762},"increased attack surface",{"type":17,"tag":84,"props":263764,"children":263765},{},[263766],{"type":23,"value":263767},"expanded compliance scope",{"type":17,"tag":84,"props":263769,"children":263770},{},[263771],{"type":23,"value":263772},"harder deletion and correction workflows",{"type":17,"tag":239,"props":263774,"children":263776},{"id":263775},"first-generation-unified-apis-2",[263777],{"type":23,"value":263535},{"type":17,"tag":80,"props":263779,"children":263780},{},[263781],{"type":17,"tag":84,"props":263782,"children":263783},{},[263784],{"type":23,"value":263785},"cache or store data for faster queries",{"type":17,"tag":29,"props":263787,"children":263788},{},[263789],{"type":23,"value":263754},{"type":17,"tag":80,"props":263791,"children":263792},{},[263793,263798],{"type":17,"tag":84,"props":263794,"children":263795},{},[263796],{"type":23,"value":263797},"similar risks to ETL and iPaaS",{"type":17,"tag":84,"props":263799,"children":263800},{},[263801],{"type":23,"value":263802},"additional vendor data exposure",{"type":17,"tag":239,"props":263804,"children":263806},{"id":263805},"real-time-unified-apis-2",[263807],{"type":23,"value":263563},{"type":17,"tag":80,"props":263809,"children":263810},{},[263811,263815],{"type":17,"tag":84,"props":263812,"children":263813},{},[263814],{"type":23,"value":93355},{"type":17,"tag":84,"props":263816,"children":263817},{},[263818],{"type":23,"value":263819},"data retrieved on demand",{"type":17,"tag":29,"props":263821,"children":263822},{},[263823],{"type":23,"value":263754},{"type":17,"tag":80,"props":263825,"children":263826},{},[263827,263832,263837],{"type":17,"tag":84,"props":263828,"children":263829},{},[263830],{"type":23,"value":263831},"fewer systems handling sensitive data",{"type":17,"tag":84,"props":263833,"children":263834},{},[263835],{"type":23,"value":263836},"simpler compliance and auditing",{"type":17,"tag":84,"props":263838,"children":263839},{},[263840],{"type":23,"value":263841},"reduced breach surface",{"type":17,"tag":68,"props":263843,"children":263845},{"id":263844},"levels-of-integration-unification",[263846],{"type":23,"value":263847},"Levels of integration unification",{"type":17,"tag":29,"props":263849,"children":263850},{},[263851],{"type":23,"value":263852},"Not all 'unified' platforms provide the same level of abstraction.",{"type":17,"tag":7231,"props":263854,"children":263855},{},[263856,263876],{"type":17,"tag":7235,"props":263857,"children":263858},{},[263859],{"type":17,"tag":7239,"props":263860,"children":263861},{},[263862,263866,263871],{"type":17,"tag":7243,"props":263863,"children":263864},{},[263865],{"type":23,"value":43242},{"type":17,"tag":7243,"props":263867,"children":263868},{},[263869],{"type":23,"value":263870},"Unification level",{"type":17,"tag":7243,"props":263872,"children":263873},{},[263874],{"type":23,"value":263875},"What it actually means",{"type":17,"tag":7259,"props":263877,"children":263878},{},[263879,263896,263912,263929],{"type":17,"tag":7239,"props":263880,"children":263881},{},[263882,263886,263891],{"type":17,"tag":7266,"props":263883,"children":263884},{},[263885],{"type":23,"value":263349},{"type":17,"tag":7266,"props":263887,"children":263888},{},[263889],{"type":23,"value":263890},"None",{"type":17,"tag":7266,"props":263892,"children":263893},{},[263894],{"type":23,"value":263895},"Custom pipelines per system",{"type":17,"tag":7239,"props":263897,"children":263898},{},[263899,263903,263907],{"type":17,"tag":7266,"props":263900,"children":263901},{},[263902],{"type":23,"value":69365},{"type":17,"tag":7266,"props":263904,"children":263905},{},[263906],{"type":23,"value":263890},{"type":17,"tag":7266,"props":263908,"children":263909},{},[263910],{"type":23,"value":263911},"Workflow-level connections only",{"type":17,"tag":7239,"props":263913,"children":263914},{},[263915,263919,263924],{"type":17,"tag":7266,"props":263916,"children":263917},{},[263918],{"type":23,"value":263393},{"type":17,"tag":7266,"props":263920,"children":263921},{},[263922],{"type":23,"value":263923},"Partial",{"type":17,"tag":7266,"props":263925,"children":263926},{},[263927],{"type":23,"value":263928},"Shared endpoints, inconsistent schemas",{"type":17,"tag":7239,"props":263930,"children":263931},{},[263932,263936,263940],{"type":17,"tag":7266,"props":263933,"children":263934},{},[263935],{"type":23,"value":263415},{"type":17,"tag":7266,"props":263937,"children":263938},{},[263939],{"type":23,"value":169567},{"type":17,"tag":7266,"props":263941,"children":263942},{},[263943],{"type":23,"value":263944},"Unified schemas, auth, webhooks, and events",{"type":17,"tag":29,"props":263946,"children":263947},{},[263948],{"type":23,"value":263949},"Deep unification determines whether integrations scale cleanly or fragment over time.",{"type":17,"tag":68,"props":263951,"children":263953},{"id":263952},"launch-speed-and-scalability",[263954],{"type":23,"value":263955},"Launch speed and scalability",{"type":17,"tag":29,"props":263957,"children":263958},{},[263959],{"type":23,"value":263960},"Time-to-launch compounds as integrations grow.",{"type":17,"tag":239,"props":263962,"children":263964},{"id":263963},"etl-2",[263965],{"type":23,"value":263349},{"type":17,"tag":80,"props":263967,"children":263968},{},[263969,263974],{"type":17,"tag":84,"props":263970,"children":263971},{},[263972],{"type":23,"value":263973},"each pipeline built manually",{"type":17,"tag":84,"props":263975,"children":263976},{},[263977],{"type":23,"value":263978},"long development cycles",{"type":17,"tag":239,"props":263980,"children":263982},{"id":263981},"ipaas-2",[263983],{"type":23,"value":69365},{"type":17,"tag":80,"props":263985,"children":263986},{},[263987,263992],{"type":17,"tag":84,"props":263988,"children":263989},{},[263990],{"type":23,"value":263991},"per-integration setup",{"type":17,"tag":84,"props":263993,"children":263994},{},[263995],{"type":23,"value":263996},"limited parallelization",{"type":17,"tag":239,"props":263998,"children":264000},{"id":263999},"first-generation-unified-apis-3",[264001],{"type":23,"value":263535},{"type":17,"tag":80,"props":264003,"children":264004},{},[264005,264010],{"type":17,"tag":84,"props":264006,"children":264007},{},[264008],{"type":23,"value":264009},"faster start",{"type":17,"tag":84,"props":264011,"children":264012},{},[264013],{"type":23,"value":264014},"slower scaling due to customization",{"type":17,"tag":239,"props":264016,"children":264018},{"id":264017},"real-time-unified-apis-3",[264019],{"type":23,"value":263563},{"type":17,"tag":80,"props":264021,"children":264022},{},[264023,264028,264033],{"type":17,"tag":84,"props":264024,"children":264025},{},[264026],{"type":23,"value":264027},"one API unlocks multiple integrations",{"type":17,"tag":84,"props":264029,"children":264030},{},[264031],{"type":23,"value":264032},"parallel deployment across categories",{"type":17,"tag":84,"props":264034,"children":264035},{},[264036],{"type":23,"value":264037},"minimal per-integration overhead",{"type":17,"tag":29,"props":264039,"children":264040},{},[264041],{"type":23,"value":264042},"Result: significantly faster time-to-market.",{"type":17,"tag":68,"props":264044,"children":264045},{"id":218924},[264046],{"type":23,"value":69493},{"type":17,"tag":29,"props":264048,"children":264049},{},[264050],{"type":23,"value":264051},"AI systems depend on data quality, structure, and freshness.",{"type":17,"tag":239,"props":264053,"children":264055},{"id":264054},"etl-and-ipaas-1",[264056],{"type":23,"value":263736},{"type":17,"tag":80,"props":264058,"children":264059},{},[264060,264065],{"type":17,"tag":84,"props":264061,"children":264062},{},[264063],{"type":23,"value":264064},"batch data introduces lag",{"type":17,"tag":84,"props":264066,"children":264067},{},[264068],{"type":23,"value":264069},"inconsistent schemas across sources",{"type":17,"tag":29,"props":264071,"children":264072},{},[264073],{"type":23,"value":263754},{"type":17,"tag":80,"props":264075,"children":264076},{},[264077,264082,264087],{"type":17,"tag":84,"props":264078,"children":264079},{},[264080],{"type":23,"value":264081},"outdated model inputs",{"type":17,"tag":84,"props":264083,"children":264084},{},[264085],{"type":23,"value":264086},"fragmented features",{"type":17,"tag":84,"props":264088,"children":264089},{},[264090],{"type":23,"value":264091},"unreliable outputs",{"type":17,"tag":239,"props":264093,"children":264095},{"id":264094},"first-generation-unified-apis-4",[264096],{"type":23,"value":263535},{"type":17,"tag":80,"props":264098,"children":264099},{},[264100,264105],{"type":17,"tag":84,"props":264101,"children":264102},{},[264103],{"type":23,"value":264104},"partial normalization",{"type":17,"tag":84,"props":264106,"children":264107},{},[264108],{"type":23,"value":264109},"cached data limits real-time use",{"type":17,"tag":29,"props":264111,"children":264112},{},[264113],{"type":23,"value":263754},{"type":17,"tag":80,"props":264115,"children":264116},{},[264117,264122],{"type":17,"tag":84,"props":264118,"children":264119},{},[264120],{"type":23,"value":264121},"inconsistent training data",{"type":17,"tag":84,"props":264123,"children":264124},{},[264125],{"type":23,"value":264126},"limited real-time capabilities",{"type":17,"tag":239,"props":264128,"children":264130},{"id":264129},"real-time-unified-apis-4",[264131],{"type":23,"value":263563},{"type":17,"tag":80,"props":264133,"children":264134},{},[264135,264139,264144],{"type":17,"tag":84,"props":264136,"children":264137},{},[264138],{"type":23,"value":64171},{"type":17,"tag":84,"props":264140,"children":264141},{},[264142],{"type":23,"value":264143},"fully normalized schemas",{"type":17,"tag":84,"props":264145,"children":264146},{},[264147],{"type":23,"value":264148},"consistent object structures",{"type":17,"tag":29,"props":264150,"children":264151},{},[264152],{"type":23,"value":263754},{"type":17,"tag":80,"props":264154,"children":264155},{},[264156,264161,264166],{"type":17,"tag":84,"props":264157,"children":264158},{},[264159],{"type":23,"value":264160},"clean inputs for AI systems",{"type":17,"tag":84,"props":264162,"children":264163},{},[264164],{"type":23,"value":264165},"reliable real-time inference",{"type":17,"tag":84,"props":264167,"children":264168},{},[264169],{"type":23,"value":264170},"strong foundation for copilots and agents",{"type":17,"tag":68,"props":264172,"children":264174},{"id":264173},"total-cost-and-long-term-tradeoffs",[264175],{"type":23,"value":264176},"Total cost and long-term tradeoffs",{"type":17,"tag":29,"props":264178,"children":264179},{},[264180],{"type":23,"value":264181},"The cost of integration platforms is not just pricing—it's operational burden.",{"type":17,"tag":7231,"props":264183,"children":264184},{},[264185,264210],{"type":17,"tag":7235,"props":264186,"children":264187},{},[264188],{"type":17,"tag":7239,"props":264189,"children":264190},{},[264191,264195,264200,264205],{"type":17,"tag":7243,"props":264192,"children":264193},{},[264194],{"type":23,"value":43242},{"type":17,"tag":7243,"props":264196,"children":264197},{},[264198],{"type":23,"value":264199},"Engineering cost",{"type":17,"tag":7243,"props":264201,"children":264202},{},[264203],{"type":23,"value":264204},"Maintenance cost",{"type":17,"tag":7243,"props":264206,"children":264207},{},[264208],{"type":23,"value":264209},"Scalability",{"type":17,"tag":7259,"props":264211,"children":264212},{},[264213,264234,264255,264275],{"type":17,"tag":7239,"props":264214,"children":264215},{},[264216,264220,264224,264229],{"type":17,"tag":7266,"props":264217,"children":264218},{},[264219],{"type":23,"value":263349},{"type":17,"tag":7266,"props":264221,"children":264222},{},[264223],{"type":23,"value":69476},{"type":17,"tag":7266,"props":264225,"children":264226},{},[264227],{"type":23,"value":264228},"Very high",{"type":17,"tag":7266,"props":264230,"children":264231},{},[264232],{"type":23,"value":264233},"Low for product use cases",{"type":17,"tag":7239,"props":264235,"children":264236},{},[264237,264241,264246,264250],{"type":17,"tag":7266,"props":264238,"children":264239},{},[264240],{"type":23,"value":69365},{"type":17,"tag":7266,"props":264242,"children":264243},{},[264244],{"type":23,"value":264245},"Moderate",{"type":17,"tag":7266,"props":264247,"children":264248},{},[264249],{"type":23,"value":264245},{"type":17,"tag":7266,"props":264251,"children":264252},{},[264253],{"type":23,"value":264254},"Limited at scale",{"type":17,"tag":7239,"props":264256,"children":264257},{},[264258,264262,264266,264271],{"type":17,"tag":7266,"props":264259,"children":264260},{},[264261],{"type":23,"value":263393},{"type":17,"tag":7266,"props":264263,"children":264264},{},[264265],{"type":23,"value":264245},{"type":17,"tag":7266,"props":264267,"children":264268},{},[264269],{"type":23,"value":264270},"High over time",{"type":17,"tag":7266,"props":264272,"children":264273},{},[264274],{"type":23,"value":69481},{"type":17,"tag":7239,"props":264276,"children":264277},{},[264278,264282,264286,264290],{"type":17,"tag":7266,"props":264279,"children":264280},{},[264281],{"type":23,"value":263415},{"type":17,"tag":7266,"props":264283,"children":264284},{},[264285],{"type":23,"value":69459},{"type":17,"tag":7266,"props":264287,"children":264288},{},[264289],{"type":23,"value":69459},{"type":17,"tag":7266,"props":264291,"children":264292},{},[264293],{"type":23,"value":69476},{"type":17,"tag":29,"props":264295,"children":264296},{},[264297],{"type":23,"value":264298},"Systems that require constant oversight slow teams down and accumulate hidden cost.",{"type":17,"tag":68,"props":264300,"children":264302},{"id":264301},"how-integration-platforms-evolved",[264303],{"type":23,"value":264304},"How integration platforms evolved",{"type":17,"tag":29,"props":264306,"children":264307},{},[264308],{"type":23,"value":264309},"Integration technology reflects how software itself has evolved.",{"type":17,"tag":80,"props":264311,"children":264312},{},[264313,264322,264331,264340],{"type":17,"tag":84,"props":264314,"children":264315},{},[264316,264320],{"type":17,"tag":48,"props":264317,"children":264318},{},[264319],{"type":23,"value":263349},{"type":23,"value":264321}," enabled internal data consolidation",{"type":17,"tag":84,"props":264323,"children":264324},{},[264325,264329],{"type":17,"tag":48,"props":264326,"children":264327},{},[264328],{"type":23,"value":69365},{"type":23,"value":264330}," enabled cloud workflow automation",{"type":17,"tag":84,"props":264332,"children":264333},{},[264334,264338],{"type":17,"tag":48,"props":264335,"children":264336},{},[264337],{"type":23,"value":78607},{"type":23,"value":264339}," simplified integration delivery",{"type":17,"tag":84,"props":264341,"children":264342},{},[264343,264347],{"type":17,"tag":48,"props":264344,"children":264345},{},[264346],{"type":23,"value":263563},{"type":23,"value":264348}," align with modern SaaS and AI requirements",{"type":17,"tag":29,"props":264350,"children":264351},{},[264352],{"type":23,"value":264353},"The shift is clear: from batch processing to real-time, from custom pipelines to reusable infrastructure.",{"type":17,"tag":68,"props":264355,"children":264357},{"id":264356},"when-each-approach-makes-sense",[264358],{"type":23,"value":264359},"When each approach makes sense",{"type":17,"tag":239,"props":264361,"children":264363},{"id":264362},"use-etl-when",[264364],{"type":23,"value":264365},"Use ETL when:",{"type":17,"tag":80,"props":264367,"children":264368},{},[264369,264374,264379],{"type":17,"tag":84,"props":264370,"children":264371},{},[264372],{"type":23,"value":264373},"building internal analytics pipelines",{"type":17,"tag":84,"props":264375,"children":264376},{},[264377],{"type":23,"value":264378},"working with data warehouses",{"type":17,"tag":84,"props":264380,"children":264381},{},[264382],{"type":23,"value":264383},"processing large historical datasets",{"type":17,"tag":239,"props":264385,"children":264387},{"id":264386},"use-ipaas-when",[264388],{"type":23,"value":264389},"Use iPaaS when:",{"type":17,"tag":80,"props":264391,"children":264392},{},[264393,264398,264403],{"type":17,"tag":84,"props":264394,"children":264395},{},[264396],{"type":23,"value":264397},"automating internal workflows",{"type":17,"tag":84,"props":264399,"children":264400},{},[264401],{"type":23,"value":264402},"connecting tools across departments",{"type":17,"tag":84,"props":264404,"children":264405},{},[264406],{"type":23,"value":264407},"enabling non-developer configuration",{"type":17,"tag":239,"props":264409,"children":264411},{"id":264410},"use-unified-apis-when",[264412],{"type":23,"value":5328},{"type":17,"tag":80,"props":264414,"children":264415},{},[264416,264421,264426],{"type":17,"tag":84,"props":264417,"children":264418},{},[264419],{"type":23,"value":264420},"building product integrations",{"type":17,"tag":84,"props":264422,"children":264423},{},[264424],{"type":23,"value":264425},"supporting multiple third-party platforms",{"type":17,"tag":84,"props":264427,"children":264428},{},[264429],{"type":23,"value":264430},"needing faster time-to-market",{"type":17,"tag":239,"props":264432,"children":264434},{"id":264433},"use-real-time-unified-apis-when",[264435],{"type":23,"value":264436},"Use real-time unified APIs when:",{"type":17,"tag":80,"props":264438,"children":264439},{},[264440,264445,264450,264455],{"type":17,"tag":84,"props":264441,"children":264442},{},[264443],{"type":23,"value":264444},"building customer-facing integrations at scale",{"type":17,"tag":84,"props":264446,"children":264447},{},[264448],{"type":23,"value":264449},"supporting AI or real-time product features",{"type":17,"tag":84,"props":264451,"children":264452},{},[264453],{"type":23,"value":264454},"minimizing compliance and security risk",{"type":17,"tag":84,"props":264456,"children":264457},{},[264458],{"type":23,"value":264459},"reducing long-term maintenance",{"type":17,"tag":68,"props":264461,"children":264462},{"id":7672},[264463],{"type":23,"value":7675},{"type":17,"tag":80,"props":264465,"children":264466},{},[264467,264472,264477,264482,264487,264492],{"type":17,"tag":84,"props":264468,"children":264469},{},[264470],{"type":23,"value":264471},"ETL, iPaaS, and unified APIs solve fundamentally different problems",{"type":17,"tag":84,"props":264473,"children":264474},{},[264475],{"type":23,"value":264476},"Batch and polling architectures introduce latency and operational overhead",{"type":17,"tag":84,"props":264478,"children":264479},{},[264480],{"type":23,"value":264481},"Data replication increases security risk and compliance scope",{"type":17,"tag":84,"props":264483,"children":264484},{},[264485],{"type":23,"value":264486},"Partial unification reduces initial effort but creates long-term complexity",{"type":17,"tag":84,"props":264488,"children":264489},{},[264490],{"type":23,"value":264491},"Real-time, pass-through architectures reduce maintenance and improve scalability",{"type":17,"tag":84,"props":264493,"children":264494},{},[264495],{"type":23,"value":264496},"Integration architecture directly impacts product velocity and AI readiness",{"type":17,"tag":29,"props":264498,"children":264499},{},[264500,264502,264507],{"type":23,"value":264501},"Choosing the right approach is less about features and more about ",{"type":17,"tag":48,"props":264503,"children":264504},{},[264505],{"type":23,"value":264506},"how your system handles data, change, and scale over time",{"type":23,"value":54},{"type":17,"tag":29,"props":264509,"children":264510},{},[264511],{"type":17,"tag":133,"props":264512,"children":264514},{"href":212,"rel":264513},[214],[264515],{"type":23,"value":256515},{"title":7,"searchDepth":1629,"depth":1629,"links":264517},[264518,264524,264525,264531,264537,264542,264543,264549,264554,264555,264556,264562],{"id":263074,"depth":1629,"text":263077,"children":264519},[264520,264521,264522,264523],{"id":263080,"depth":1635,"text":263083},{"id":263139,"depth":1635,"text":263142},{"id":263200,"depth":1635,"text":78607},{"id":263259,"depth":1635,"text":263262},{"id":263298,"depth":1629,"text":263301},{"id":263466,"depth":1629,"text":263469,"children":264526},[264527,264528,264529,264530],{"id":263477,"depth":1635,"text":263349},{"id":263505,"depth":1635,"text":69365},{"id":91072,"depth":1635,"text":263535},{"id":91134,"depth":1635,"text":263563},{"id":263589,"depth":1629,"text":263592,"children":264532},[264533,264534,264535,264536],{"id":263600,"depth":1635,"text":263349},{"id":263628,"depth":1635,"text":69365},{"id":263662,"depth":1635,"text":263535},{"id":263690,"depth":1635,"text":263563},{"id":263722,"depth":1629,"text":263725,"children":264538},[264539,264540,264541],{"id":263733,"depth":1635,"text":263736},{"id":263775,"depth":1635,"text":263535},{"id":263805,"depth":1635,"text":263563},{"id":263844,"depth":1629,"text":263847},{"id":263952,"depth":1629,"text":263955,"children":264544},[264545,264546,264547,264548],{"id":263963,"depth":1635,"text":263349},{"id":263981,"depth":1635,"text":69365},{"id":263999,"depth":1635,"text":263535},{"id":264017,"depth":1635,"text":263563},{"id":218924,"depth":1629,"text":69493,"children":264550},[264551,264552,264553],{"id":264054,"depth":1635,"text":263736},{"id":264094,"depth":1635,"text":263535},{"id":264129,"depth":1635,"text":263563},{"id":264173,"depth":1629,"text":264176},{"id":264301,"depth":1629,"text":264304},{"id":264356,"depth":1629,"text":264359,"children":264557},[264558,264559,264560,264561],{"id":264362,"depth":1635,"text":264365},{"id":264386,"depth":1635,"text":264389},{"id":264410,"depth":1635,"text":5328},{"id":264433,"depth":1635,"text":264436},{"id":7672,"depth":1629,"text":7675},"content:blog:etl_vs_ipaas_vs_unified_api_complete_architecture_guide_for_saas_teams.md","blog/etl_vs_ipaas_vs_unified_api_complete_architecture_guide_for_saas_teams.md","blog/etl_vs_ipaas_vs_unified_api_complete_architecture_guide_for_saas_teams",{"_path":264567,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":253681,"description":264568,"img":264569,"date":264570,"tag":6341,"body":264571,"_type":1677,"_id":265461,"_source":1679,"_file":265462,"_stem":265463,"_extension":1682},"/blog/fireflies_integration_guide","Learn how to connect an end-customer's Fireflies.ai account to your application using Unified.to.","https://s3.us-east-2.amazonaws.com/unified-article-images/fireflies_integration_guide-icon.jpg","2025-11-05T00:00:00.000Z",{"type":14,"children":264572,"toc":265444},[264573,264578,264581,264588,264593,264619,264624,264628,264640,264652,264656,264661,264721,264733,264739,264750,264795,264800,264803,264809,264827,264845,264848,264854,264866,264874,264924,264927,264933,264984,265003,265006,265012,265024,265108,265124,265127,265133,265138,265150,265194,265199,265211,265214,265220,265238,265241,265245,265334,265339,265342,265346,265391,265394,265400,265433,265436],{"type":17,"tag":18,"props":264574,"children":264576},{"id":264575},"fireflies-integration-guide",[264577],{"type":23,"value":253681},{"type":17,"tag":25,"props":264579,"children":264580},{},[],{"type":17,"tag":29,"props":264582,"children":264583},{},[264584],{"type":17,"tag":33,"props":264585,"children":264586},{},[264587],{"type":23,"value":263049},{"type":17,"tag":18,"props":264589,"children":264591},{"id":264590},"fireflies-integration-guide-1",[264592],{"type":23,"value":253681},{"type":17,"tag":29,"props":264594,"children":264595},{},[264596,264598,264608,264610,264618],{"type":23,"value":264597},"Learn how to connect an end-customer's ",{"type":17,"tag":133,"props":264599,"children":264602},{"href":264600,"rel":264601},"http://fireflies.ai/",[214],[264603],{"type":17,"tag":48,"props":264604,"children":264605},{},[264606],{"type":23,"value":264607},"Fireflies.ai",{"type":23,"value":264609}," account to your application using ",{"type":17,"tag":133,"props":264611,"children":264613},{"href":42620,"rel":264612},[214],[264614],{"type":17,"tag":48,"props":264615,"children":264616},{},[264617],{"type":23,"value":217},{"type":23,"value":54},{"type":17,"tag":29,"props":264620,"children":264621},{},[264622],{"type":23,"value":264623},"This guide covers how to enable the integration, embed the authorization component, and verify the connection end-to-end.",{"type":17,"tag":68,"props":264625,"children":264626},{"id":42649},[264627],{"type":23,"value":42652},{"type":17,"tag":29,"props":264629,"children":264630},{},[264631,264633,264638],{"type":23,"value":264632},"The Fireflies integration allows your app's end users to authorize ",{"type":17,"tag":133,"props":264634,"children":264636},{"href":42620,"rel":264635},[214],[264637],{"type":23,"value":217},{"type":23,"value":264639}," to access their Fireflies accounts for meeting recordings and user data.",{"type":17,"tag":29,"props":264641,"children":264642},{},[264643,264645,264650],{"type":23,"value":264644},"Once connected, your application can access the Fireflies API securely through ",{"type":17,"tag":133,"props":264646,"children":264648},{"href":42620,"rel":264647},[214],[264649],{"type":23,"value":217},{"type":23,"value":264651}," — without your users ever leaving your app.",{"type":17,"tag":68,"props":264653,"children":264654},{"id":141798},[264655],{"type":23,"value":141801},{"type":17,"tag":29,"props":264657,"children":264658},{},[264659],{"type":23,"value":264660},"Before getting started, ensure you have:",{"type":17,"tag":80,"props":264662,"children":264663},{},[264664,264684,264705,264710],{"type":17,"tag":84,"props":264665,"children":264666},{},[264667,264668,264676,264677,264682],{"type":23,"value":9619},{"type":17,"tag":133,"props":264669,"children":264671},{"href":42620,"rel":264670},[214],[264672],{"type":17,"tag":48,"props":264673,"children":264674},{},[264675],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":48,"props":264678,"children":264679},{},[264680],{"type":23,"value":264681},"developer account",{"type":23,"value":264683}," and active API credentials",{"type":17,"tag":84,"props":264685,"children":264686},{},[264687,264689,264697,264698,264703],{"type":23,"value":264688},"Your end-customer has a ",{"type":17,"tag":133,"props":264690,"children":264692},{"href":264600,"rel":264691},[214],[264693],{"type":17,"tag":48,"props":264694,"children":264695},{},[264696],{"type":23,"value":264607},{"type":23,"value":18757},{"type":17,"tag":48,"props":264699,"children":264700},{},[264701],{"type":23,"value":264702},"paid plan",{"type":23,"value":264704}," (API access required)",{"type":17,"tag":84,"props":264706,"children":264707},{},[264708],{"type":23,"value":264709},"Access to your app's frontend or backend to embed the Unified.to authorization component so that you can get your end-customer to authorize access to Fireflies",{"type":17,"tag":84,"props":264711,"children":264712},{},[264713,264715,264719],{"type":23,"value":264714},"Optional: API Explorer or ",{"type":17,"tag":133,"props":264716,"children":264717},{"href":326},[264718],{"type":23,"value":329},{"type":23,"value":264720}," Server for testing connections",{"type":17,"tag":29,"props":264722,"children":264723},{},[264724,264726,264731],{"type":23,"value":264725},"Please note that the Fireflies API is only available to users on a ",{"type":17,"tag":48,"props":264727,"children":264728},{},[264729],{"type":23,"value":264730},"paid Fireflies plan",{"type":23,"value":264732},".  Free-tier accounts cannot authorize API access.",{"type":17,"tag":68,"props":264734,"children":264736},{"id":264735},"step-by-step-setup",[264737],{"type":23,"value":264738},"Step-by-Step Setup",{"type":17,"tag":239,"props":264740,"children":264742},{"id":264741},"_1-enable-the-fireflies-integration-in-unifiedto",[264743,264745],{"type":23,"value":264744},"1. Enable the Fireflies Integration in ",{"type":17,"tag":133,"props":264746,"children":264748},{"href":42620,"rel":264747},[214],[264749],{"type":23,"value":217},{"type":17,"tag":6154,"props":264751,"children":264752},{},[264753,264765,264774,264785],{"type":17,"tag":84,"props":264754,"children":264755},{},[264756,264758,264763],{"type":23,"value":264757},"Log in to your ",{"type":17,"tag":133,"props":264759,"children":264761},{"href":42620,"rel":264760},[214],[264762],{"type":23,"value":217},{"type":23,"value":264764}," developer dashboard.",{"type":17,"tag":84,"props":264766,"children":264767},{},[264768,264769,264773],{"type":23,"value":42939},{"type":17,"tag":48,"props":264770,"children":264771},{},[264772],{"type":23,"value":42944},{"type":23,"value":54},{"type":17,"tag":84,"props":264775,"children":264776},{},[264777,264779,264783],{"type":23,"value":264778},"Locate ",{"type":17,"tag":48,"props":264780,"children":264781},{},[264782],{"type":23,"value":14249},{"type":23,"value":264784}," in the catalog.",{"type":17,"tag":84,"props":264786,"children":264787},{},[264788,264789,264794],{"type":23,"value":6629},{"type":17,"tag":48,"props":264790,"children":264791},{},[264792],{"type":23,"value":264793},"Activate Integration",{"type":23,"value":54},{"type":17,"tag":29,"props":264796,"children":264797},{},[264798],{"type":23,"value":264799},"Once enabled, Fireflies becomes available for your end-customer to authorize within your own app.",{"type":17,"tag":25,"props":264801,"children":264802},{},[],{"type":17,"tag":239,"props":264804,"children":264806},{"id":264805},"_2-embed-the-authorization-component",[264807],{"type":23,"value":264808},"2. Embed the Authorization Component",{"type":17,"tag":29,"props":264810,"children":264811},{},[264812,264813,264818,264820,264825],{"type":23,"value":48249},{"type":17,"tag":48,"props":264814,"children":264815},{},[264816],{"type":23,"value":264817},"Embedded Authorization (Authorize Optimization)",{"type":23,"value":264819}," component from ",{"type":17,"tag":133,"props":264821,"children":264823},{"href":42620,"rel":264822},[214],[264824],{"type":23,"value":217},{"type":23,"value":264826}," to create a seamless in-app experience.",{"type":17,"tag":6154,"props":264828,"children":264829},{},[264830,264835,264840],{"type":17,"tag":84,"props":264831,"children":264832},{},[264833],{"type":23,"value":264834},"Add the component to your application UI where users connect integrations.",{"type":17,"tag":84,"props":264836,"children":264837},{},[264838],{"type":23,"value":264839},"Preview the embedded experience - this is what your customers see when connecting Fireflies.",{"type":17,"tag":84,"props":264841,"children":264842},{},[264843],{"type":23,"value":264844},"The component displays a button (e.g., 'Authorize Fireflies') and short instructions.",{"type":17,"tag":25,"props":264846,"children":264847},{},[],{"type":17,"tag":239,"props":264849,"children":264851},{"id":264850},"_3-obtain-the-fireflies-api-key",[264852],{"type":23,"value":264853},"3. Obtain the Fireflies API Key",{"type":17,"tag":29,"props":264855,"children":264856},{},[264857,264859,264864],{"type":23,"value":264858},"Your end-customers/users will need their ",{"type":17,"tag":48,"props":264860,"children":264861},{},[264862],{"type":23,"value":264863},"Fireflies API key",{"type":23,"value":264865}," to complete authorization.",{"type":17,"tag":29,"props":264867,"children":264868},{},[264869],{"type":17,"tag":48,"props":264870,"children":264871},{},[264872],{"type":23,"value":264873},"Steps for your end user:",{"type":17,"tag":6154,"props":264875,"children":264876},{},[264877,264892,264902,264919],{"type":17,"tag":84,"props":264878,"children":264879},{},[264880,264882,264890],{"type":23,"value":264881},"Log in to their ",{"type":17,"tag":133,"props":264883,"children":264885},{"href":264600,"rel":264884},[214],[264886],{"type":17,"tag":48,"props":264887,"children":264888},{},[264889],{"type":23,"value":264607},{"type":23,"value":264891}," account.",{"type":17,"tag":84,"props":264893,"children":264894},{},[264895,264896,264901],{"type":23,"value":6661},{"type":17,"tag":48,"props":264897,"children":264898},{},[264899],{"type":23,"value":264900},"Settings → Integrations",{"type":23,"value":54},{"type":17,"tag":84,"props":264903,"children":264904},{},[264905,264906,264911,264913,264918],{"type":23,"value":264778},{"type":17,"tag":48,"props":264907,"children":264908},{},[264909],{"type":23,"value":264910},"API Key",{"type":23,"value":264912}," and click ",{"type":17,"tag":48,"props":264914,"children":264915},{},[264916],{"type":23,"value":264917},"Copy",{"type":23,"value":54},{"type":17,"tag":84,"props":264920,"children":264921},{},[264922],{"type":23,"value":264923},"Return to your app's authorization screen and paste it into the field provided.",{"type":17,"tag":25,"props":264925,"children":264926},{},[],{"type":17,"tag":239,"props":264928,"children":264930},{"id":264929},"_4-authorize-access",[264931],{"type":23,"value":264932},"4. Authorize Access",{"type":17,"tag":6154,"props":264934,"children":264935},{},[264936,264941,264951],{"type":17,"tag":84,"props":264937,"children":264938},{},[264939],{"type":23,"value":264940},"In the authorization window, paste the Fireflies API key.",{"type":17,"tag":84,"props":264942,"children":264943},{},[264944,264945,264950],{"type":23,"value":6629},{"type":17,"tag":48,"props":264946,"children":264947},{},[264948],{"type":23,"value":264949},"Authorize",{"type":23,"value":54},{"type":17,"tag":84,"props":264952,"children":264953},{},[264954,264959,264961],{"type":17,"tag":133,"props":264955,"children":264957},{"href":42620,"rel":264956},[214],[264958],{"type":23,"value":217},{"type":23,"value":264960}," will automatically:\n",{"type":17,"tag":80,"props":264962,"children":264963},{},[264964,264969,264974],{"type":17,"tag":84,"props":264965,"children":264966},{},[264967],{"type":23,"value":264968},"Validate the API key",{"type":17,"tag":84,"props":264970,"children":264971},{},[264972],{"type":23,"value":264973},"Connect to Fireflies",{"type":17,"tag":84,"props":264975,"children":264976},{},[264977,264979],{"type":23,"value":264978},"Run a ",{"type":17,"tag":48,"props":264980,"children":264981},{},[264982],{"type":23,"value":264983},"test connection",{"type":17,"tag":29,"props":264985,"children":264986},{},[264987,264989,264994,264996,265001],{"type":23,"value":264988},"If successful, ",{"type":17,"tag":133,"props":264990,"children":264992},{"href":42620,"rel":264991},[214],[264993],{"type":23,"value":217},{"type":23,"value":264995}," creates a new ",{"type":17,"tag":48,"props":264997,"children":264998},{},[264999],{"type":23,"value":265000},"Connection Object",{"type":23,"value":265002}," linked to that customer.",{"type":17,"tag":25,"props":265004,"children":265005},{},[],{"type":17,"tag":239,"props":265007,"children":265009},{"id":265008},"_5-verify-the-connection",[265010],{"type":23,"value":265011},"5. Verify the Connection",{"type":17,"tag":29,"props":265013,"children":265014},{},[265015,265017,265022],{"type":23,"value":265016},"Once the test passes, a new connection record appears in your ",{"type":17,"tag":133,"props":265018,"children":265020},{"href":42620,"rel":265019},[214],[265021],{"type":23,"value":217},{"type":23,"value":265023}," dashboard.",{"type":17,"tag":7231,"props":265025,"children":265026},{},[265027,265041],{"type":17,"tag":7235,"props":265028,"children":265029},{},[265030],{"type":17,"tag":7239,"props":265031,"children":265032},{},[265033,265037],{"type":17,"tag":7243,"props":265034,"children":265035},{},[265036],{"type":23,"value":24651},{"type":17,"tag":7243,"props":265038,"children":265039},{},[265040],{"type":23,"value":24525},{"type":17,"tag":7259,"props":265042,"children":265043},{},[265044,265059,265077,265092],{"type":17,"tag":7239,"props":265045,"children":265046},{},[265047,265054],{"type":17,"tag":7266,"props":265048,"children":265049},{},[265050],{"type":17,"tag":48,"props":265051,"children":265052},{},[265053],{"type":23,"value":43146},{"type":17,"tag":7266,"props":265055,"children":265056},{},[265057],{"type":23,"value":265058},"Unique identifier for API requests",{"type":17,"tag":7239,"props":265060,"children":265061},{},[265062,265069],{"type":17,"tag":7266,"props":265063,"children":265064},{},[265065],{"type":17,"tag":48,"props":265066,"children":265067},{},[265068],{"type":23,"value":20017},{"type":17,"tag":7266,"props":265070,"children":265071},{},[265072],{"type":17,"tag":133,"props":265073,"children":265075},{"href":264600,"rel":265074},[214],[265076],{"type":23,"value":264607},{"type":17,"tag":7239,"props":265078,"children":265079},{},[265080,265087],{"type":17,"tag":7266,"props":265081,"children":265082},{},[265083],{"type":17,"tag":48,"props":265084,"children":265085},{},[265086],{"type":23,"value":20328},{"type":17,"tag":7266,"props":265088,"children":265089},{},[265090],{"type":23,"value":265091},"Connected",{"type":17,"tag":7239,"props":265093,"children":265094},{},[265095,265103],{"type":17,"tag":7266,"props":265096,"children":265097},{},[265098],{"type":17,"tag":48,"props":265099,"children":265100},{},[265101],{"type":23,"value":265102},"Created At",{"type":17,"tag":7266,"props":265104,"children":265105},{},[265106],{"type":23,"value":265107},"Timestamp of creation",{"type":17,"tag":29,"props":265109,"children":265110},{},[265111,265112,265116,265118,265123],{"type":23,"value":48249},{"type":17,"tag":48,"props":265113,"children":265114},{},[265115],{"type":23,"value":43146},{"type":23,"value":265117}," to make authenticated API calls to Fireflies through ",{"type":17,"tag":133,"props":265119,"children":265121},{"href":42620,"rel":265120},[214],[265122],{"type":23,"value":217},{"type":23,"value":54},{"type":17,"tag":25,"props":265125,"children":265126},{},[],{"type":17,"tag":239,"props":265128,"children":265130},{"id":265129},"_6-test-the-connection-optional",[265131],{"type":23,"value":265132},"6. Test the Connection (Optional)",{"type":17,"tag":29,"props":265134,"children":265135},{},[265136],{"type":23,"value":265137},"You can test the integration in two environments:",{"type":17,"tag":29,"props":265139,"children":265140},{},[265141,265143,265148],{"type":23,"value":265142},"a) Using ",{"type":17,"tag":133,"props":265144,"children":265146},{"href":42620,"rel":265145},[214],[265147],{"type":23,"value":217},{"type":23,"value":265149}," API Explorer",{"type":17,"tag":80,"props":265151,"children":265152},{},[265153,265164],{"type":17,"tag":84,"props":265154,"children":265155},{},[265156,265157,265162],{"type":23,"value":245064},{"type":17,"tag":48,"props":265158,"children":265159},{},[265160],{"type":23,"value":265161},"API Explorer",{"type":23,"value":265163}," in your dashboard.",{"type":17,"tag":84,"props":265165,"children":265166},{},[265167,265169],{"type":23,"value":265168},"Use your new Connection ID to query endpoints such as:\n",{"type":17,"tag":80,"props":265170,"children":265171},{},[265172,265183],{"type":17,"tag":84,"props":265173,"children":265174},{},[265175,265181],{"type":17,"tag":6121,"props":265176,"children":265178},{"className":265177},[],[265179],{"type":23,"value":265180},"/hris/{id}/employee",{"type":23,"value":265182}," – list Fireflies users",{"type":17,"tag":84,"props":265184,"children":265185},{},[265186,265192],{"type":17,"tag":6121,"props":265187,"children":265189},{"className":265188},[],[265190],{"type":23,"value":265191},"/calendar/{id}/recording",{"type":23,"value":265193}," – retrieve meeting data",{"type":17,"tag":29,"props":265195,"children":265196},{},[265197],{"type":23,"value":265198},"b) Using MCP Server (for AI Agents)",{"type":17,"tag":29,"props":265200,"children":265201},{},[265202,265204,265209],{"type":23,"value":265203},"If your use case involves AI agents, test the connection within your ",{"type":17,"tag":48,"props":265205,"children":265206},{},[265207],{"type":23,"value":265208},"MCP Server",{"type":23,"value":265210}," using the same Connection ID.",{"type":17,"tag":25,"props":265212,"children":265213},{},[],{"type":17,"tag":68,"props":265215,"children":265217},{"id":265216},"example-use-cases",[265218],{"type":23,"value":265219},"Example Use Cases",{"type":17,"tag":80,"props":265221,"children":265222},{},[265223,265228,265233],{"type":17,"tag":84,"props":265224,"children":265225},{},[265226],{"type":23,"value":265227},"Retrieve meeting recordings for transcription or analysis",{"type":17,"tag":84,"props":265229,"children":265230},{},[265231],{"type":23,"value":265232},"Sync Fireflies user data into your CRM or analytics system",{"type":17,"tag":84,"props":265234,"children":265235},{},[265236],{"type":23,"value":265237},"Feed Fireflies meeting data into AI summarization or tagging workflows",{"type":17,"tag":25,"props":265239,"children":265240},{},[],{"type":17,"tag":68,"props":265242,"children":265243},{"id":6769},[265244],{"type":23,"value":6772},{"type":17,"tag":7231,"props":265246,"children":265247},{},[265248,265268],{"type":17,"tag":7235,"props":265249,"children":265250},{},[265251],{"type":17,"tag":7239,"props":265252,"children":265253},{},[265254,265259,265263],{"type":17,"tag":7243,"props":265255,"children":265256},{},[265257],{"type":23,"value":265258},"Issue",{"type":17,"tag":7243,"props":265260,"children":265261},{},[265262],{"type":23,"value":24525},{"type":17,"tag":7243,"props":265264,"children":265265},{},[265266],{"type":23,"value":265267},"Solution",{"type":17,"tag":7259,"props":265269,"children":265270},{},[265271,265292,265313],{"type":17,"tag":7239,"props":265272,"children":265273},{},[265274,265282,265287],{"type":17,"tag":7266,"props":265275,"children":265276},{},[265277],{"type":17,"tag":48,"props":265278,"children":265279},{},[265280],{"type":23,"value":265281},"Authorization failed",{"type":17,"tag":7266,"props":265283,"children":265284},{},[265285],{"type":23,"value":265286},"Invalid or expired API key",{"type":17,"tag":7266,"props":265288,"children":265289},{},[265290],{"type":23,"value":265291},"Re-copy the key from Fireflies and retry authorization.",{"type":17,"tag":7239,"props":265293,"children":265294},{},[265295,265303,265308],{"type":17,"tag":7266,"props":265296,"children":265297},{},[265298],{"type":17,"tag":48,"props":265299,"children":265300},{},[265301],{"type":23,"value":265302},"Test connection failed",{"type":17,"tag":7266,"props":265304,"children":265305},{},[265306],{"type":23,"value":265307},"API access not enabled",{"type":17,"tag":7266,"props":265309,"children":265310},{},[265311],{"type":23,"value":265312},"Ensure user is on a paid Fireflies plan.",{"type":17,"tag":7239,"props":265314,"children":265315},{},[265316,265324,265329],{"type":17,"tag":7266,"props":265317,"children":265318},{},[265319],{"type":17,"tag":48,"props":265320,"children":265321},{},[265322],{"type":23,"value":265323},"No data returned",{"type":17,"tag":7266,"props":265325,"children":265326},{},[265327],{"type":23,"value":265328},"Key valid but no accessible data",{"type":17,"tag":7266,"props":265330,"children":265331},{},[265332],{"type":23,"value":265333},"Check that the Fireflies workspace contains recordings.",{"type":17,"tag":29,"props":265335,"children":265336},{},[265337],{"type":23,"value":265338},"*Fireflies must have existing data (e.g., recorded meetings) to return results when testing API endpoints.",{"type":17,"tag":25,"props":265340,"children":265341},{},[],{"type":17,"tag":68,"props":265343,"children":265344},{"id":44469},[265345],{"type":23,"value":44472},{"type":17,"tag":80,"props":265347,"children":265348},{},[265349,265375,265386],{"type":17,"tag":84,"props":265350,"children":265351},{},[265352,265354,265361,265363,265368,265369,265374],{"type":23,"value":265353},"Explore the ",{"type":17,"tag":133,"props":265355,"children":265358},{"href":265356,"rel":265357},"https://www.notion.so/api-reference",[214],[265359],{"type":23,"value":265360},"Unified.to API Reference",{"type":23,"value":265362}," to interact with ",{"type":17,"tag":6121,"props":265364,"children":265366},{"className":265365},[],[265367],{"type":23,"value":265180},{"type":23,"value":34435},{"type":17,"tag":6121,"props":265370,"children":265372},{"className":265371},[],[265373],{"type":23,"value":265191},{"type":23,"value":54},{"type":17,"tag":84,"props":265376,"children":265377},{},[265378,265380,265385],{"type":23,"value":265379},"Monitor performance and connection status under ",{"type":17,"tag":48,"props":265381,"children":265382},{},[265383],{"type":23,"value":265384},"Integration Health",{"type":23,"value":265163},{"type":17,"tag":84,"props":265387,"children":265388},{},[265389],{"type":23,"value":265390},"Repeat these steps for other integrations or customer environments.",{"type":17,"tag":25,"props":265392,"children":265393},{},[],{"type":17,"tag":68,"props":265395,"children":265397},{"id":265396},"related-articles",[265398],{"type":23,"value":265399},"Related Articles",{"type":17,"tag":80,"props":265401,"children":265402},{},[265403,265413,265423],{"type":17,"tag":84,"props":265404,"children":265405},{},[265406],{"type":17,"tag":133,"props":265407,"children":265410},{"href":265408,"rel":265409},"https://www.notion.so/guides/embedded-authorization",[214],[265411],{"type":23,"value":265412},"Embedding the Authorization Component",{"type":17,"tag":84,"props":265414,"children":265415},{},[265416],{"type":17,"tag":133,"props":265417,"children":265420},{"href":265418,"rel":265419},"https://www.notion.so/guides/testing-connections",[214],[265421],{"type":23,"value":265422},"Testing Connections via API Explorer",{"type":17,"tag":84,"props":265424,"children":265425},{},[265426],{"type":17,"tag":133,"props":265427,"children":265430},{"href":265428,"rel":265429},"https://www.notion.so/guides/manage-connections",[214],[265431],{"type":23,"value":265432},"Managing Customer Connections",{"type":17,"tag":25,"props":265434,"children":265435},{},[],{"type":17,"tag":29,"props":265437,"children":265438},{},[265439],{"type":17,"tag":33,"props":265440,"children":265441},{},[265442],{"type":23,"value":265443},"Last updated: November 2025",{"title":7,"searchDepth":1629,"depth":1629,"links":265445},[265446,265447,265448,265457,265458,265459,265460],{"id":42649,"depth":1629,"text":42652},{"id":141798,"depth":1629,"text":141801},{"id":264735,"depth":1629,"text":264738,"children":265449},[265450,265452,265453,265454,265455,265456],{"id":264741,"depth":1635,"text":265451},"1. Enable the Fireflies Integration in Unified.to",{"id":264805,"depth":1635,"text":264808},{"id":264850,"depth":1635,"text":264853},{"id":264929,"depth":1635,"text":264932},{"id":265008,"depth":1635,"text":265011},{"id":265129,"depth":1635,"text":265132},{"id":265216,"depth":1629,"text":265219},{"id":6769,"depth":1629,"text":6772},{"id":44469,"depth":1629,"text":44472},{"id":265396,"depth":1629,"text":265399},"content:blog:fireflies_integration_guide.md","blog/fireflies_integration_guide.md","blog/fireflies_integration_guide",{"_path":265465,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":265466,"description":265467,"img":265468,"date":265469,"tag":12,"body":265470,"_type":1677,"_id":266200,"_source":1679,"_file":266201,"_stem":266202,"_extension":1682},"/blog/what_the_best_unified_api_for_file_storage_messaging_and_real_time_data_sync","What's the Best Unified API for File Storage, Messaging, and Real-Time Data Sync?","Modern B2B SaaS and AI-native products almost always need to connect to multiple third-party platforms.","https://s3.us-east-2.amazonaws.com/unified-article-images/what_the_best_unified_api_for_file_storage_messaging_and_real_time_data_sync-icon.png","2025-11-01T20:43:00.000Z",{"type":14,"children":265471,"toc":266182},[265472,265477,265480,265488,265492,265496,265528,265533,265544,265550,265555,265596,265601,265624,265629,265635,265640,265645,265700,265705,265711,265728,265733,265737,265784,265789,265795,265805,265810,265828,265834,265846,265851,265857,265867,265871,265889,265895,265900,265918,265923,265928,265934,265939,265960,265965,265976,265982,265987,265991,266014,266019,266023,266046,266051,266055,266072,266077,266083,266088,266123,266128,266133,266145,266150,266166],{"type":17,"tag":18,"props":265473,"children":265475},{"id":265474},"whats-the-best-unified-api-for-file-storage-messaging-and-real-time-data-sync",[265476],{"type":23,"value":265466},{"type":17,"tag":25,"props":265478,"children":265479},{},[],{"type":17,"tag":29,"props":265481,"children":265482},{},[265483],{"type":17,"tag":33,"props":265484,"children":265485},{},[265486],{"type":23,"value":265487},"November 1, 2025",{"type":17,"tag":29,"props":265489,"children":265490},{},[265491],{"type":23,"value":265467},{"type":17,"tag":29,"props":265493,"children":265494},{},[265495],{"type":23,"value":90554},{"type":17,"tag":80,"props":265497,"children":265498},{},[265499,265509,265519],{"type":17,"tag":84,"props":265500,"children":265501},{},[265502,265507],{"type":17,"tag":48,"props":265503,"children":265504},{},[265505],{"type":23,"value":265506},"File storage",{"type":23,"value":265508}," platforms like Google Drive, Dropbox, Box, or OneDrive",{"type":17,"tag":84,"props":265510,"children":265511},{},[265512,265517],{"type":17,"tag":48,"props":265513,"children":265514},{},[265515],{"type":23,"value":265516},"Messaging and communication",{"type":23,"value":265518}," tools like Slack, Gmail, Outlook, or Microsoft Teams",{"type":17,"tag":84,"props":265520,"children":265521},{},[265522,265526],{"type":17,"tag":48,"props":265523,"children":265524},{},[265525],{"type":23,"value":13156},{"type":23,"value":265527}," so AI features, dashboards, and user interfaces stay accurate",{"type":17,"tag":29,"props":265529,"children":265530},{},[265531],{"type":23,"value":265532},"At first glance, this looks like three separate problems. In practice, they're tightly connected—and most integration approaches break down when you try to support all three at scale.",{"type":17,"tag":29,"props":265534,"children":265535},{},[265536,265538,265542],{"type":23,"value":265537},"This article explains what to look for in a unified integration platform and why ",{"type":17,"tag":48,"props":265539,"children":265540},{},[265541],{"type":23,"value":217},{"type":23,"value":265543}," is the best fit when file storage, messaging, and real-time delivery all matter.",{"type":17,"tag":68,"props":265545,"children":265547},{"id":265546},"why-file-storage-messaging-and-real-time-sync-are-hard-together",[265548],{"type":23,"value":265549},"Why File Storage, Messaging, and Real-Time Sync Are Hard Together",{"type":17,"tag":29,"props":265551,"children":265552},{},[265553],{"type":23,"value":265554},"Each category comes with its own challenges:",{"type":17,"tag":80,"props":265556,"children":265557},{},[265558,265570,265582],{"type":17,"tag":84,"props":265559,"children":265560},{},[265561,265563,265568],{"type":23,"value":265562},"File storage APIs use ",{"type":17,"tag":48,"props":265564,"children":265565},{},[265566],{"type":23,"value":265567},"hierarchical folder structures",{"type":23,"value":265569},", permissions, and binary uploads",{"type":17,"tag":84,"props":265571,"children":265572},{},[265573,265575,265580],{"type":23,"value":265574},"Messaging platforms have ",{"type":17,"tag":48,"props":265576,"children":265577},{},[265578],{"type":23,"value":265579},"threads, replies, channels, and participants",{"type":23,"value":265581},", with very different models between chat and email",{"type":17,"tag":84,"props":265583,"children":265584},{},[265585,265587,265594],{"type":23,"value":265586},"Real-time delivery depends on ",{"type":17,"tag":48,"props":265588,"children":265589},{},[265590],{"type":17,"tag":133,"props":265591,"children":265592},{"href":4999},[265593],{"type":23,"value":5002},{"type":23,"value":265595},", which many platforms don't support consistently",{"type":17,"tag":29,"props":265597,"children":265598},{},[265599],{"type":23,"value":265600},"Most teams solve this by stitching together:",{"type":17,"tag":80,"props":265602,"children":265603},{},[265604,265609,265614,265619],{"type":17,"tag":84,"props":265605,"children":265606},{},[265607],{"type":23,"value":265608},"Vendor-specific SDKs",{"type":17,"tag":84,"props":265610,"children":265611},{},[265612],{"type":23,"value":265613},"Custom polling jobs",{"type":17,"tag":84,"props":265615,"children":265616},{},[265617],{"type":23,"value":265618},"Per-provider retry logic",{"type":17,"tag":84,"props":265620,"children":265621},{},[265622],{"type":23,"value":265623},"Internal databases to cache data",{"type":17,"tag":29,"props":265625,"children":265626},{},[265627],{"type":23,"value":265628},"That approach works for a prototype. It doesn't work for production SaaS products—especially once customers expect accuracy, scale, and compliance.",{"type":17,"tag":68,"props":265630,"children":265632},{"id":265631},"what-unified-should-actually-mean",[265633],{"type":23,"value":265634},"What 'Unified' Should Actually Mean",{"type":17,"tag":29,"props":265636,"children":265637},{},[265638],{"type":23,"value":265639},"A unified integration platform should not just reduce setup time. It should remove entire classes of problems.",{"type":17,"tag":29,"props":265641,"children":265642},{},[265643],{"type":23,"value":265644},"In practice, that means:",{"type":17,"tag":6154,"props":265646,"children":265647},{},[265648,265661,265674,265687],{"type":17,"tag":84,"props":265649,"children":265650},{},[265651,265656,265659],{"type":17,"tag":48,"props":265652,"children":265653},{},[265654],{"type":23,"value":265655},"Category-specific unified APIs",{"type":17,"tag":3891,"props":265657,"children":265658},{},[],{"type":23,"value":265660},"Each category (File Storage, Messaging, CRM, etc.) should expose a single, consistent API across all supported providers.",{"type":17,"tag":84,"props":265662,"children":265663},{},[265664,265669,265672],{"type":17,"tag":48,"props":265665,"children":265666},{},[265667],{"type":23,"value":265668},"Real-time, pass-through data access",{"type":17,"tag":3891,"props":265670,"children":265671},{},[],{"type":23,"value":265673},"Requests should be fetched directly from the source platform—not returned from a cached database.",{"type":17,"tag":84,"props":265675,"children":265676},{},[265677,265682,265685],{"type":17,"tag":48,"props":265678,"children":265679},{},[265680],{"type":23,"value":265681},"Event delivery without custom polling code",{"type":17,"tag":3891,"props":265683,"children":265684},{},[],{"type":23,"value":265686},"When native webhooks exist, they should be used. When they don't, the platform should handle polling and retries internally.",{"type":17,"tag":84,"props":265688,"children":265689},{},[265690,265695,265698],{"type":17,"tag":48,"props":265691,"children":265692},{},[265693],{"type":23,"value":265694},"No customer data stored by default",{"type":17,"tag":3891,"props":265696,"children":265697},{},[],{"type":23,"value":265699},"Storing third-party data creates compliance risk and architectural complexity that most SaaS teams don't want.",{"type":17,"tag":29,"props":265701,"children":265702},{},[265703],{"type":23,"value":265704},"This is where most 'unified' platforms diverge.",{"type":17,"tag":68,"props":265706,"children":265708},{"id":265707},"unifiedtos-approach",[265709],{"type":23,"value":265710},"Unified.to's Approach",{"type":17,"tag":29,"props":265712,"children":265713},{},[265714,265716,265726],{"type":23,"value":265715},"Unified.to provides ",{"type":17,"tag":48,"props":265717,"children":265718},{},[265719,265720,265724],{"type":23,"value":78814},{"type":17,"tag":133,"props":265721,"children":265722},{"href":7691},[265723],{"type":23,"value":7459},{"type":23,"value":265725}," surface per category",{"type":23,"value":265727},", backed by a real-time, pass-through architecture.",{"type":17,"tag":29,"props":265729,"children":265730},{},[265731],{"type":23,"value":265732},"Instead of synchronizing and storing customer data, Unified routes authorized requests directly to the source API and returns the current response.",{"type":17,"tag":29,"props":265734,"children":265735},{},[265736],{"type":23,"value":65343},{"type":17,"tag":80,"props":265738,"children":265739},{},[265740,265748,265756,265763,265776],{"type":17,"tag":84,"props":265741,"children":265742},{},[265743],{"type":17,"tag":48,"props":265744,"children":265745},{},[265746],{"type":23,"value":265747},"380+ integrations across 24 categories",{"type":17,"tag":84,"props":265749,"children":265750},{},[265751],{"type":17,"tag":48,"props":265752,"children":265753},{},[265754],{"type":23,"value":265755},"No customer data stored or cached",{"type":17,"tag":84,"props":265757,"children":265758},{},[265759],{"type":17,"tag":48,"props":265760,"children":265761},{},[265762],{"type":23,"value":160018},{"type":17,"tag":84,"props":265764,"children":265765},{},[265766],{"type":17,"tag":48,"props":265767,"children":265768},{},[265769,265770,265774],{"type":23,"value":86988},{"type":17,"tag":133,"props":265771,"children":265772},{"href":9007},[265773],{"type":23,"value":46572},{"type":23,"value":265775}," handled by the platform",{"type":17,"tag":84,"props":265777,"children":265778},{},[265779],{"type":17,"tag":48,"props":265780,"children":265781},{},[265782],{"type":23,"value":265783},"Usage-based pricing, not per-connection pricing",{"type":17,"tag":29,"props":265785,"children":265786},{},[265787],{"type":23,"value":265788},"This design is especially important when file storage and messaging data are used downstream in AI features, where stale data causes immediate problems.",{"type":17,"tag":68,"props":265790,"children":265792},{"id":265791},"file-storage-api-one-interface-across-providers",[265793],{"type":23,"value":265794},"File Storage API: One Interface Across Providers",{"type":17,"tag":29,"props":265796,"children":265797},{},[265798,265799,265803],{"type":23,"value":25244},{"type":17,"tag":48,"props":265800,"children":265801},{},[265802],{"type":23,"value":142621},{"type":23,"value":265804}," provides a single interface across cloud storage platforms like Google Drive, Dropbox, Box, and OneDrive.",{"type":17,"tag":29,"props":265806,"children":265807},{},[265808],{"type":23,"value":265809},"What this enables:",{"type":17,"tag":80,"props":265811,"children":265812},{},[265813,265818,265823],{"type":17,"tag":84,"props":265814,"children":265815},{},[265816],{"type":23,"value":265817},"Building a file browser or document picker that works across providers",{"type":17,"tag":84,"props":265819,"children":265820},{},[265821],{"type":23,"value":265822},"Fetching documents for search, indexing, or AI ingestion",{"type":17,"tag":84,"props":265824,"children":265825},{},[265826],{"type":23,"value":265827},"Uploading, moving, renaming, or deleting files without per-provider logic",{"type":17,"tag":239,"props":265829,"children":265831},{"id":265830},"how-files-and-folders-are-modeled",[265832],{"type":23,"value":265833},"How files and folders are modeled",{"type":17,"tag":29,"props":265835,"children":265836},{},[265837,265839,265844],{"type":23,"value":265838},"Files and folders use the same object structure, differentiated by a ",{"type":17,"tag":6121,"props":265840,"children":265842},{"className":265841},[],[265843],{"type":23,"value":27310},{"type":23,"value":265845}," field. Parent-child relationships define the hierarchy, so traversing folders works the same way across providers.",{"type":17,"tag":29,"props":265847,"children":265848},{},[265849],{"type":23,"value":265850},"You don't need to learn a different tree model for each storage platform.",{"type":17,"tag":68,"props":265852,"children":265854},{"id":265853},"messaging-api-threads-that-actually-make-sense",[265855],{"type":23,"value":265856},"Messaging API: Threads That Actually Make Sense",{"type":17,"tag":29,"props":265858,"children":265859},{},[265860,265861,265865],{"type":23,"value":25244},{"type":17,"tag":48,"props":265862,"children":265863},{},[265864],{"type":23,"value":27356},{"type":23,"value":265866}," normalizes both chat-based and email-based platforms, including Slack, Microsoft Teams, Gmail, Outlook, and Discord.",{"type":17,"tag":29,"props":265868,"children":265869},{},[265870],{"type":23,"value":265809},{"type":17,"tag":80,"props":265872,"children":265873},{},[265874,265879,265884],{"type":17,"tag":84,"props":265875,"children":265876},{},[265877],{"type":23,"value":265878},"Reading and writing messages across platforms",{"type":17,"tag":84,"props":265880,"children":265881},{},[265882],{"type":23,"value":265883},"Reconstructing full conversation threads",{"type":17,"tag":84,"props":265885,"children":265886},{},[265887],{"type":23,"value":265888},"Powering AI copilots that summarize or act on conversations",{"type":17,"tag":239,"props":265890,"children":265892},{"id":265891},"threading-semantics",[265893],{"type":23,"value":265894},"Threading semantics",{"type":17,"tag":29,"props":265896,"children":265897},{},[265898],{"type":23,"value":265899},"Messages form a tree:",{"type":17,"tag":80,"props":265901,"children":265902},{},[265903,265913],{"type":17,"tag":84,"props":265904,"children":265905},{},[265906,265908],{"type":23,"value":265907},"Each message can reference a ",{"type":17,"tag":48,"props":265909,"children":265910},{},[265911],{"type":23,"value":265912},"parent message",{"type":17,"tag":84,"props":265914,"children":265915},{},[265916],{"type":23,"value":265917},"A thread identifier links all replies to the original message",{"type":17,"tag":29,"props":265919,"children":265920},{},[265921],{"type":23,"value":265922},"This works consistently across chat and email, even though the underlying providers model threads very differently.",{"type":17,"tag":29,"props":265924,"children":265925},{},[265926],{"type":23,"value":265927},"The result: one way to traverse conversations, regardless of platform.",{"type":17,"tag":68,"props":265929,"children":265931},{"id":265930},"real-time-delivery-without-polling-logic",[265932],{"type":23,"value":265933},"Real-Time Delivery Without Polling Logic",{"type":17,"tag":29,"props":265935,"children":265936},{},[265937],{"type":23,"value":265938},"Unified handles real-time updates in two ways:",{"type":17,"tag":80,"props":265940,"children":265941},{},[265942,265951],{"type":17,"tag":84,"props":265943,"children":265944},{},[265945,265949],{"type":17,"tag":48,"props":265946,"children":265947},{},[265948],{"type":23,"value":9024},{"type":23,"value":265950}," when the provider supports them",{"type":17,"tag":84,"props":265952,"children":265953},{},[265954,265958],{"type":17,"tag":48,"props":265955,"children":265956},{},[265957],{"type":23,"value":9256},{"type":23,"value":265959}," when the provider does not",{"type":17,"tag":29,"props":265961,"children":265962},{},[265963],{"type":23,"value":265964},"Virtual webhooks simulate the same event interface by managing polling, change detection, retries, and rate limits internally. From your application's perspective, both behave the same way.",{"type":17,"tag":29,"props":265966,"children":265967},{},[265968,265970,265974],{"type":23,"value":265969},"Just as important: Unified ",{"type":17,"tag":48,"props":265971,"children":265972},{},[265973],{"type":23,"value":86966},{"type":23,"value":265975}," while doing this. Events and API responses are always fetched from the source platform.",{"type":17,"tag":68,"props":265977,"children":265979},{"id":265978},"how-unified-compares-to-other-platforms",[265980],{"type":23,"value":265981},"How Unified Compares to Other Platforms",{"type":17,"tag":29,"props":265983,"children":265984},{},[265985],{"type":23,"value":265986},"Most teams evaluating unified APIs end up comparing three approaches.",{"type":17,"tag":239,"props":265988,"children":265989},{"id":227009},[265990],{"type":23,"value":7968},{"type":17,"tag":80,"props":265992,"children":265993},{},[265994,265999,266004,266009],{"type":17,"tag":84,"props":265995,"children":265996},{},[265997],{"type":23,"value":265998},"Offers unified APIs for file storage and messaging",{"type":17,"tag":84,"props":266000,"children":266001},{},[266002],{"type":23,"value":266003},"Uses scheduled sync jobs and stores customer data",{"type":17,"tag":84,"props":266005,"children":266006},{},[266007],{"type":23,"value":266008},"API responses are returned from Merge's database, not the source platform",{"type":17,"tag":84,"props":266010,"children":266011},{},[266012],{"type":23,"value":266013},"Sync frequency and real-time behavior are tied to pricing and sync credits",{"type":17,"tag":29,"props":266015,"children":266016},{},[266017],{"type":23,"value":266018},"This works well for analytics use cases, but introduces latency and compliance overhead for real-time product features.",{"type":17,"tag":239,"props":266020,"children":266021},{"id":227167},[266022],{"type":23,"value":581},{"type":17,"tag":80,"props":266024,"children":266025},{},[266026,266031,266036,266041],{"type":17,"tag":84,"props":266027,"children":266028},{},[266029],{"type":23,"value":266030},"Strong at managed sync and ingestion pipelines",{"type":17,"tag":84,"props":266032,"children":266033},{},[266034],{"type":23,"value":266035},"Stores encrypted replicas of customer data",{"type":17,"tag":84,"props":266037,"children":266038},{},[266039],{"type":23,"value":266040},"Real-time behavior is achieved through high-frequency polling",{"type":17,"tag":84,"props":266042,"children":266043},{},[266044],{"type":23,"value":266045},"Does not offer a unified messaging API category",{"type":17,"tag":29,"props":266047,"children":266048},{},[266049],{"type":23,"value":266050},"Paragon is a good fit for ingestion-heavy use cases, but less suitable when you need live reads and writes across messaging and storage platforms.",{"type":17,"tag":239,"props":266052,"children":266053},{"id":102079},[266054],{"type":23,"value":237},{"type":17,"tag":80,"props":266056,"children":266057},{},[266058,266063,266068],{"type":17,"tag":84,"props":266059,"children":266060},{},[266061],{"type":23,"value":266062},"Offers unified APIs for several categories, including file storage",{"type":17,"tag":84,"props":266064,"children":266065},{},[266066],{"type":23,"value":266067},"Supports native and virtual webhooks",{"type":17,"tag":84,"props":266069,"children":266070},{},[266071],{"type":23,"value":266045},{"type":17,"tag":29,"props":266073,"children":266074},{},[266075],{"type":23,"value":266076},"Apideck shares some architectural similarities with Unified, but lacks coverage across both file storage and messaging together.",{"type":17,"tag":68,"props":266078,"children":266080},{"id":266079},"when-unifiedto-is-the-best-fit",[266081],{"type":23,"value":266082},"When Unified.to Is the Best Fit",{"type":17,"tag":29,"props":266084,"children":266085},{},[266086],{"type":23,"value":266087},"Unified.to is designed for teams that:",{"type":17,"tag":80,"props":266089,"children":266090},{},[266091,266103,266113,266118],{"type":17,"tag":84,"props":266092,"children":266093},{},[266094,266096,266101],{"type":23,"value":266095},"Need ",{"type":17,"tag":48,"props":266097,"children":266098},{},[266099],{"type":23,"value":266100},"file storage and messaging",{"type":23,"value":266102}," in the same product",{"type":17,"tag":84,"props":266104,"children":266105},{},[266106,266107,266111],{"type":23,"value":197924},{"type":17,"tag":48,"props":266108,"children":266109},{},[266110],{"type":23,"value":99827},{"type":23,"value":266112},", not cached replicas",{"type":17,"tag":84,"props":266114,"children":266115},{},[266116],{"type":23,"value":266117},"Want to avoid storing third-party customer data",{"type":17,"tag":84,"props":266119,"children":266120},{},[266121],{"type":23,"value":266122},"Are building AI-native features where stale data breaks trust",{"type":17,"tag":29,"props":266124,"children":266125},{},[266126],{"type":23,"value":266127},"Instead of choosing between speed, accuracy, and compliance, Unified treats real-time delivery as the baseline.",{"type":17,"tag":29,"props":266129,"children":266130},{},[266131],{"type":23,"value":266132},"File storage, messaging, and real-time delivery aren't independent concerns. They're part of the same product surface—especially in modern SaaS and AI products.",{"type":17,"tag":29,"props":266134,"children":266135},{},[266136,266138,266143],{"type":23,"value":266137},"Unified.to's category-specific unified APIs, pass-through architecture, and built-in event handling let teams ship faster ",{"type":17,"tag":48,"props":266139,"children":266140},{},[266141],{"type":23,"value":266142},"without",{"type":23,"value":266144}," inheriting long-term integration debt.",{"type":17,"tag":29,"props":266146,"children":266147},{},[266148],{"type":23,"value":266149},"If your product needs to read and write files, understand conversations, and react immediately when data changes, Unified.to is the most complete and technically sound option available.",{"type":17,"tag":29,"props":266151,"children":266152},{},[266153,266157,266158],{"type":17,"tag":48,"props":266154,"children":266155},{},[266156],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":266159,"children":266161},{"href":1612,"rel":266160},[214],[266162],{"type":17,"tag":48,"props":266163,"children":266164},{},[266165],{"type":23,"value":1616},{"type":17,"tag":29,"props":266167,"children":266168},{},[266169,266173,266174],{"type":17,"tag":48,"props":266170,"children":266171},{},[266172],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":266175,"children":266177},{"href":1623,"rel":266176},[214],[266178],{"type":17,"tag":48,"props":266179,"children":266180},{},[266181],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":266183},[266184,266185,266186,266187,266190,266193,266194,266199],{"id":265546,"depth":1629,"text":265549},{"id":265631,"depth":1629,"text":265634},{"id":265707,"depth":1629,"text":265710},{"id":265791,"depth":1629,"text":265794,"children":266188},[266189],{"id":265830,"depth":1635,"text":265833},{"id":265853,"depth":1629,"text":265856,"children":266191},[266192],{"id":265891,"depth":1635,"text":265894},{"id":265930,"depth":1629,"text":265933},{"id":265978,"depth":1629,"text":265981,"children":266195},[266196,266197,266198],{"id":227009,"depth":1635,"text":7968},{"id":227167,"depth":1635,"text":581},{"id":102079,"depth":1635,"text":237},{"id":266079,"depth":1629,"text":266082},"content:blog:what_the_best_unified_api_for_file_storage_messaging_and_real_time_data_sync.md","blog/what_the_best_unified_api_for_file_storage_messaging_and_real_time_data_sync.md","blog/what_the_best_unified_api_for_file_storage_messaging_and_real_time_data_sync",{"_path":266204,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":266205,"description":266206,"img":266207,"date":266208,"tag":12,"body":266209,"_type":1677,"_id":266732,"_source":1679,"_file":266733,"_stem":266734,"_extension":1682},"/blog/october_2025_product_updates","October 2025 product updates","In October, we expanded integration coverage across HR, ATS, CRM, Accounting, Payments, Messaging, and Authentication, added hundreds of new readable fields...","https://s3.us-east-2.amazonaws.com/unified-article-images/october_2025_product_updates-icon.png","2025-10-31T00:00:00.000Z",{"type":14,"children":266210,"toc":266721},[266211,266216,266219,266227,266235,266246,266253,266258,266321,266338,266347,266356,266368,266380,266393,266402,266414,266431,266436,266459,266471,266494,266523,266530,266577,266586,266602,266607,266694,266699,266710],{"type":17,"tag":18,"props":266212,"children":266214},{"id":266213},"october-2025-product-updates",[266215],{"type":23,"value":266205},{"type":17,"tag":25,"props":266217,"children":266218},{},[],{"type":17,"tag":29,"props":266220,"children":266221},{},[266222],{"type":17,"tag":33,"props":266223,"children":266224},{},[266225],{"type":23,"value":266226},"October 31, 2025",{"type":17,"tag":29,"props":266228,"children":266229},{},[266230],{"type":17,"tag":6438,"props":266231,"children":266234},{"alt":266232,"src":266233},"June_Update_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/october_2025_product_updates-0.png",[],{"type":17,"tag":29,"props":266236,"children":266237},{},[266238,266240,266244],{"type":23,"value":266239},"In October, we expanded integration coverage across HR, ATS, CRM, Accounting, Payments, Messaging, and Authentication, added hundreds of new readable fields across major systems, launched SAML Single Sign-On, achieved HIPAA & PIPEDA compliance, and introduced workspace-only authorization for the [Unified ",{"type":17,"tag":133,"props":266241,"children":266242},{"href":326},[266243],{"type":23,"value":329},{"type":23,"value":266245},"](/mcp) Server.",{"type":17,"tag":68,"props":266247,"children":266248},{"id":11629},[266249],{"type":17,"tag":48,"props":266250,"children":266251},{},[266252],{"type":23,"value":216420},{"type":17,"tag":29,"props":266254,"children":266255},{},[266256],{"type":23,"value":266257},"We added three new integrations in October:",{"type":17,"tag":80,"props":266259,"children":266260},{},[266261,266276,266291,266306],{"type":17,"tag":84,"props":266262,"children":266263},{},[266264,266274],{"type":17,"tag":133,"props":266265,"children":266268},{"href":266266,"rel":266267},"https://unified.to/integrations/vercel",[214],[266269],{"type":17,"tag":48,"props":266270,"children":266271},{},[266272],{"type":23,"value":266273},"Vercel",{"type":23,"value":266275}," — Authentication (Oct 1)",{"type":17,"tag":84,"props":266277,"children":266278},{},[266279,266289],{"type":17,"tag":133,"props":266280,"children":266283},{"href":266281,"rel":266282},"https://unified.to/integrations/zohopayment",[214],[266284],{"type":17,"tag":48,"props":266285,"children":266286},{},[266287],{"type":23,"value":266288},"Zoho Payments",{"type":23,"value":266290}," — Payments (Oct 2)",{"type":17,"tag":84,"props":266292,"children":266293},{},[266294,266304],{"type":17,"tag":133,"props":266295,"children":266298},{"href":266296,"rel":266297},"https://unified.to/integrations/zoominfo",[214],[266299],{"type":17,"tag":48,"props":266300,"children":266301},{},[266302],{"type":23,"value":266303},"ZoomInfo",{"type":23,"value":266305}," — Enrichment (Oct 3)",{"type":17,"tag":84,"props":266307,"children":266308},{},[266309,266319],{"type":17,"tag":133,"props":266310,"children":266313},{"href":266311,"rel":266312},"https://unified.to/integrations/goto",[214],[266314],{"type":17,"tag":48,"props":266315,"children":266316},{},[266317],{"type":23,"value":266318},"GoTO",{"type":23,"value":266320}," — Call Center / HR & Directory / Authentication (Oct 14)",{"type":17,"tag":29,"props":266322,"children":266323},{},[266324,266326,266330,266331,266336],{"type":23,"value":266325},"Unified's catalog now exceeds ",{"type":17,"tag":48,"props":266327,"children":266328},{},[266329],{"type":23,"value":251468},{"type":23,"value":226593},{"type":17,"tag":48,"props":266332,"children":266333},{},[266334],{"type":23,"value":266335},"21 API categories",{"type":23,"value":266337},", all accessible in real time with zero data stored or cached.",{"type":17,"tag":68,"props":266339,"children":266341},{"id":266340},"new-security-compliance-features",[266342],{"type":17,"tag":48,"props":266343,"children":266344},{},[266345],{"type":23,"value":266346},"New Security & Compliance Features",{"type":17,"tag":239,"props":266348,"children":266350},{"id":266349},"saml-single-sign-on-sso",[266351],{"type":17,"tag":48,"props":266352,"children":266353},{},[266354],{"type":23,"value":266355},"SAML Single Sign-On (SSO)",{"type":17,"tag":29,"props":266357,"children":266358},{},[266359,266361,266366],{"type":23,"value":266360},"Unified now supports ",{"type":17,"tag":48,"props":266362,"children":266363},{},[266364],{"type":23,"value":266365},"SAML-based Single Sign-On",{"type":23,"value":266367}," for enterprise authentication.",{"type":17,"tag":29,"props":266369,"children":266370},{},[266371,266373,266378],{"type":23,"value":266372},"Starting with ",{"type":17,"tag":48,"props":266374,"children":266375},{},[266376],{"type":23,"value":266377},"JumpCloud SAML",{"type":23,"value":266379},", customers can configure their identity provider (IdP) to allow secure, standards-based authentication for Unified workspaces.",{"type":17,"tag":29,"props":266381,"children":266382},{},[266383,266385,266392],{"type":23,"value":266384},"Support for additional IdPs (Okta, Azure AD, OneLogin) is coming soon. Learn more in the ",{"type":17,"tag":133,"props":266386,"children":266389},{"href":266387,"rel":266388},"https://docs.unified.to/guides/saml_single_sign_on#saml-single-sign-on",[214],[266390],{"type":23,"value":266391},"SAML setup guide in our docs",{"type":23,"value":54},{"type":17,"tag":239,"props":266394,"children":266396},{"id":266395},"hipaa-pipeda-compliance",[266397],{"type":17,"tag":48,"props":266398,"children":266399},{},[266400],{"type":23,"value":266401},"HIPAA & PIPEDA Compliance",{"type":17,"tag":29,"props":266403,"children":266404},{},[266405,266407,266412],{"type":23,"value":266406},"Unified is now ",{"type":17,"tag":48,"props":266408,"children":266409},{},[266410],{"type":23,"value":266411},"HIPAA and PIPEDA compliant",{"type":23,"value":266413},", extending our SOC 2 Type II, GDPR, and CCPA certifications.",{"type":17,"tag":29,"props":266415,"children":266416},{},[266417,266419,266423,266424,266429],{"type":23,"value":266418},"This makes Unified the only real-time ",{"type":17,"tag":133,"props":266420,"children":266421},{"href":7691},[266422],{"type":23,"value":7459},{"type":23,"value":50672},{"type":17,"tag":48,"props":266425,"children":266426},{},[266427],{"type":23,"value":266428},"healthcare and health-adjacent SaaS",{"type":23,"value":266430}," products without storing or caching customer data.",{"type":17,"tag":29,"props":266432,"children":266433},{},[266434],{"type":23,"value":266435},"Key highlights:",{"type":17,"tag":80,"props":266437,"children":266438},{},[266439,266444,266449,266454],{"type":17,"tag":84,"props":266440,"children":266441},{},[266442],{"type":23,"value":266443},"Zero-storage, pass-through architecture",{"type":17,"tag":84,"props":266445,"children":266446},{},[266447],{"type":23,"value":266448},"Optional AWS Secrets Manager for credential storage",{"type":17,"tag":84,"props":266450,"children":266451},{},[266452],{"type":23,"value":266453},"Business Associate Agreements (BAAs) available",{"type":17,"tag":84,"props":266455,"children":266456},{},[266457],{"type":23,"value":266458},"Real-time access to HR, CRM, accounting, and communications systems used in healthcare SaaS and AI products",{"type":17,"tag":29,"props":266460,"children":266461},{},[266462,266464,266469],{"type":23,"value":266463},"Unified now provides a ",{"type":17,"tag":48,"props":266465,"children":266466},{},[266467],{"type":23,"value":266468},"compliant, real-time data foundation",{"type":23,"value":266470}," for teams building health-related integrations and AI copilots.",{"type":17,"tag":68,"props":266472,"children":266474},{"id":266473},"unified-mcp-server-updates",[266475,266479,266480,266488,266489],{"type":17,"tag":48,"props":266476,"children":266477},{},[266478],{"type":23,"value":87523},{"type":23,"value":18757},{"type":17,"tag":133,"props":266481,"children":266483},{"href":217198,"rel":266482},[214],[266484],{"type":17,"tag":48,"props":266485,"children":266486},{},[266487],{"type":23,"value":265208},{"type":23,"value":18757},{"type":17,"tag":48,"props":266490,"children":266491},{},[266492],{"type":23,"value":266493},"Updates",{"type":17,"tag":80,"props":266495,"children":266496},{},[266497,266507,266518],{"type":17,"tag":84,"props":266498,"children":266499},{},[266500,266505],{"type":17,"tag":48,"props":266501,"children":266502},{},[266503],{"type":23,"value":266504},"Workspace-Only Authorization Mode",{"type":23,"value":266506}," — Unified MCP now supports workspace-level authentication for developers, enabling secure access to connection metadata, webhooks, logs, and support tickets directly from an LLM.",{"type":17,"tag":84,"props":266508,"children":266509},{},[266510,266511,266516],{"type":23,"value":240252},{"type":17,"tag":48,"props":266512,"children":266513},{},[266514],{"type":23,"value":266515},"Model + Embedding coverage",{"type":23,"value":266517}," across Anthropic Claude, OpenAI, Mistral, and Groq.",{"type":17,"tag":84,"props":266519,"children":266520},{},[266521],{"type":23,"value":266522},"Ideal for AI agent builders requiring real-time, permissioned access to customer data.",{"type":17,"tag":68,"props":266524,"children":266525},{"id":120936},[266526],{"type":17,"tag":48,"props":266527,"children":266528},{},[266529],{"type":23,"value":216865},{"type":17,"tag":80,"props":266531,"children":266532},{},[266533,266548,266562],{"type":17,"tag":84,"props":266534,"children":266535},{},[266536,266546],{"type":17,"tag":133,"props":266537,"children":266540},{"href":266538,"rel":266539},"https://unified.to/blog/unified_is_now_hipaa_compliant",[214],[266541],{"type":17,"tag":48,"props":266542,"children":266543},{},[266544],{"type":23,"value":266545},"Unified is Now HIPAA Compliant",{"type":23,"value":266547}," — Real-time, zero-storage architecture meets healthcare-grade standards.",{"type":17,"tag":84,"props":266549,"children":266550},{},[266551,266560],{"type":17,"tag":133,"props":266552,"children":266554},{"href":78226,"rel":266553},[214],[266555],{"type":17,"tag":48,"props":266556,"children":266557},{},[266558],{"type":23,"value":266559},"Understanding OAuth2 Authorization Flows",{"type":23,"value":266561}," — A developer's guide to OAuth2 and OIDC within Unified.",{"type":17,"tag":84,"props":266563,"children":266564},{},[266565,266575],{"type":17,"tag":133,"props":266566,"children":266569},{"href":266567,"rel":266568},"https://unified.to/blog/how_to_use_user_provisioning_and_verification_with_unified",[214],[266570],{"type":17,"tag":48,"props":266571,"children":266572},{},[266573],{"type":23,"value":266574},"User Provisioning and Verification with Unified",{"type":23,"value":266576}," — How to build SCIM-based user management with BambooHR, Workday, and Certn.",{"type":17,"tag":68,"props":266578,"children":266580},{"id":266579},"october-changelog-highlights",[266581],{"type":17,"tag":48,"props":266582,"children":266583},{},[266584],{"type":23,"value":266585},"October changelog highlights",{"type":17,"tag":29,"props":266587,"children":266588},{},[266589,266591,266600],{"type":23,"value":266590},"We launched ",{"type":17,"tag":133,"props":266592,"children":266594},{"href":47029,"rel":266593},[214],[266595],{"type":17,"tag":48,"props":266596,"children":266597},{},[266598],{"type":23,"value":266599},"200+ updates",{"type":23,"value":266601}," this month.",{"type":17,"tag":29,"props":266603,"children":266604},{},[266605],{"type":23,"value":266606},"Key improvements:",{"type":17,"tag":80,"props":266608,"children":266609},{},[266610,266623,266648,266668],{"type":17,"tag":84,"props":266611,"children":266612},{},[266613,266618,266621],{"type":17,"tag":48,"props":266614,"children":266615},{},[266616],{"type":23,"value":266617},"Webhooks (native + virtual)",{"type":17,"tag":3891,"props":266619,"children":266620},{},[],{"type":23,"value":266622},"Expanded real-time coverage across ADP Workforce Now, Loxo, Oracle Taleo, Eploy, ATS Anywhere, plus Shopify, Vincere, and Microsoft Teams (Recording created/updated/deleted).",{"type":17,"tag":84,"props":266624,"children":266625},{},[266626,266631,266634,266636,266639,266641,266646],{"type":17,"tag":48,"props":266627,"children":266628},{},[266629],{"type":23,"value":266630},"Write coverage & new objects",{"type":17,"tag":3891,"props":266632,"children":266633},{},[],{"type":23,"value":266635},"Added Expense/Cashflow/Balance Sheet/Project where relevant (QuickBooks, FreshBooks, Xero, Sage Intacct, NetSuite, Keap), Company (Gladly, Vincere, Zoho Recruit), and Call/Recording (Microsoft Teams, AirCall.io).",{"type":17,"tag":3891,"props":266637,"children":266638},{},[],{"type":23,"value":266640},"Notable: ",{"type":17,"tag":48,"props":266642,"children":266643},{},[266644],{"type":23,"value":266645},"Salesforce Employee",{"type":23,"value":266647}," gained create/update with comprehensive fields.",{"type":17,"tag":84,"props":266649,"children":266650},{},[266651,266656,266659,266661,266666],{"type":17,"tag":48,"props":266652,"children":266653},{},[266654],{"type":23,"value":266655},"Messaging routes",{"type":17,"tag":3891,"props":266657,"children":266658},{},[],{"type":23,"value":266660},"Slack, Teams, Outlook, Gmail, Discord now support writable ",{"type":17,"tag":6121,"props":266662,"children":266664},{"className":266663},[],[266665],{"type":23,"value":33459},{"type":23,"value":266667}," for message routing.",{"type":17,"tag":84,"props":266669,"children":266670},{},[266671,266676,266679,266681,266686,266687,266692],{"type":17,"tag":48,"props":266672,"children":266673},{},[266674],{"type":23,"value":266675},"Schema consistency",{"type":17,"tag":3891,"props":266677,"children":266678},{},[],{"type":23,"value":266680},"Broad ",{"type":17,"tag":6121,"props":266682,"children":266684},{"className":266683},[],[266685],{"type":23,"value":62336},{"type":23,"value":26030},{"type":17,"tag":6121,"props":266688,"children":266690},{"className":266689},[],[266691],{"type":23,"value":62341},{"type":23,"value":266693}," standardization across major ATS/HR/CRM systems to simplify identity handling.",{"type":17,"tag":29,"props":266695,"children":266696},{},[266697],{"type":23,"value":266698},"That's a wrap for October. Whether you're building healthcare SaaS integrations, powering AI copilots, or managing enterprise authentication, Unified provides a single real-time API foundation to build faster — without storing or syncing customer data.",{"type":17,"tag":29,"props":266700,"children":266701},{},[266702],{"type":17,"tag":133,"props":266703,"children":266705},{"href":212,"rel":266704},[214],[266706],{"type":17,"tag":48,"props":266707,"children":266708},{},[266709],{"type":23,"value":1616},{"type":17,"tag":29,"props":266711,"children":266712},{},[266713],{"type":17,"tag":133,"props":266714,"children":266716},{"href":1623,"rel":266715},[214],[266717],{"type":17,"tag":48,"props":266718,"children":266719},{},[266720],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":266722},[266723,266724,266728,266730,266731],{"id":11629,"depth":1629,"text":216420},{"id":266340,"depth":1629,"text":266346,"children":266725},[266726,266727],{"id":266349,"depth":1635,"text":266355},{"id":266395,"depth":1635,"text":266401},{"id":266473,"depth":1629,"text":266729},"Unified MCP Server Updates",{"id":120936,"depth":1629,"text":216865},{"id":266579,"depth":1629,"text":266585},"content:blog:october_2025_product_updates.md","blog/october_2025_product_updates.md","blog/october_2025_product_updates",{"_path":266736,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":266737,"description":266738,"img":266739,"date":266740,"tag":12,"body":266741,"_type":1677,"_id":267324,"_source":1679,"_file":267325,"_stem":267326,"_extension":1682},"/blog/which_unified_apis_are_soc2_and_hipaa_compliant","Which Unified APIs Are SOC2 and HIPAA Compliant?","If you're building a SaaS or AI-native product that integrates with sensitive customer data, compliance matters. Whether you're handling employee records,...","https://s3.us-east-2.amazonaws.com/unified-article-images/which_unified_apis_are_soc2_and_hipaa_compliant-icon.png","2025-10-30T17:58:00.000Z",{"type":14,"children":266742,"toc":267314},[266743,266748,266751,266759,266764,266769,266775,266787,266819,266825,266836,266864,266869,266875,266880,266908,266919,266925,267083,267088,267094,267105,267144,267149,267155,267167,267171,267193,267198,267204,267209,267238,267244,267254,267272,267285,267294,267303,267306],{"type":17,"tag":18,"props":266744,"children":266746},{"id":266745},"which-unified-apis-are-soc2-and-hipaa-compliant",[266747],{"type":23,"value":266737},{"type":17,"tag":25,"props":266749,"children":266750},{},[],{"type":17,"tag":29,"props":266752,"children":266753},{},[266754],{"type":17,"tag":33,"props":266755,"children":266756},{},[266757],{"type":23,"value":266758},"October 30, 2025",{"type":17,"tag":29,"props":266760,"children":266761},{},[266762],{"type":23,"value":266763},"If you're building a SaaS or AI-native product that integrates with sensitive customer data, compliance matters. Whether you're handling employee records, syncing CRM data, or connecting file storage platforms, you're expected to meet the security and privacy standards required by your customers and regulators.",{"type":17,"tag":29,"props":266765,"children":266766},{},[266767],{"type":23,"value":266768},"This post clarifies which Unified APIs can be used in HIPAA-regulated environments, what our SOC 2 Type II and HIPAA compliance really means, how we compare to competitors like Merge.dev, Truto, Apideck, and Paragon, and how our architecture helps reduce your risk.",{"type":17,"tag":239,"props":266770,"children":266772},{"id":266771},"unifiedtos-platform-compliance",[266773],{"type":23,"value":266774},"Unified.to's Platform Compliance",{"type":17,"tag":29,"props":266776,"children":266777},{},[266778,266780,266785],{"type":23,"value":266779},"Unified.to is SOC 2 Type II certified and fully compliant with HIPAA, GDPR, PIPEDA, and CCPA. These certifications apply at the ",{"type":17,"tag":48,"props":266781,"children":266782},{},[266783],{"type":23,"value":266784},"platform level",{"type":23,"value":266786},"—not just individual endpoints. That means every API category built on Unified.to inherits the same security posture:",{"type":17,"tag":80,"props":266788,"children":266789},{},[266790,266799,266809],{"type":17,"tag":84,"props":266791,"children":266792},{},[266793,266797],{"type":17,"tag":48,"props":266794,"children":266795},{},[266796],{"type":23,"value":94139},{"type":23,"value":266798},": Attested to the AICPA Trust Services Criteria for security, availability, and confidentiality",{"type":17,"tag":84,"props":266800,"children":266801},{},[266802,266807],{"type":17,"tag":48,"props":266803,"children":266804},{},[266805],{"type":23,"value":266806},"HIPAA-aligned",{"type":23,"value":266808},": Unified will sign Business Associate Agreements (BAAs) for covered entities or business associates handling PHI",{"type":17,"tag":84,"props":266810,"children":266811},{},[266812,266817],{"type":17,"tag":48,"props":266813,"children":266814},{},[266815],{"type":23,"value":266816},"PIPEDA (Canada)",{"type":23,"value":266818},": Personal data handled in accordance with Canadian privacy law",{"type":17,"tag":239,"props":266820,"children":266822},{"id":266821},"real-time-stateless-architecture",[266823],{"type":23,"value":266824},"Real-Time, Stateless Architecture",{"type":17,"tag":29,"props":266826,"children":266827},{},[266828,266830,266835],{"type":23,"value":266829},"Unified.to is not a database. It's a real-time API platform built on a ",{"type":17,"tag":48,"props":266831,"children":266832},{},[266833],{"type":23,"value":266834},"zero-storage, stateless passthrough model",{"type":23,"value":20456},{"type":17,"tag":80,"props":266837,"children":266838},{},[266839,266849,266854,266859],{"type":17,"tag":84,"props":266840,"children":266841},{},[266842,266844],{"type":23,"value":266843},"We ",{"type":17,"tag":48,"props":266845,"children":266846},{},[266847],{"type":23,"value":266848},"never store your customers' data at rest",{"type":17,"tag":84,"props":266850,"children":266851},{},[266852],{"type":23,"value":266853},"Every API request fetches data live from the source system",{"type":17,"tag":84,"props":266855,"children":266856},{},[266857],{"type":23,"value":266858},"No caching, no snapshots, no stale records",{"type":17,"tag":84,"props":266860,"children":266861},{},[266862],{"type":23,"value":266863},"Logs are minimized and redacted by default",{"type":17,"tag":29,"props":266865,"children":266866},{},[266867],{"type":23,"value":266868},"This architecture eliminates PII and PHI persistence risk. It also means the Unified platform doesn't expand your compliance scope—the data flows through, but never resides on our infrastructure.",{"type":17,"tag":239,"props":266870,"children":266872},{"id":266871},"what-unified-apis-handle-and-dont-handle",[266873],{"type":23,"value":266874},"What Unified APIs Handle (and Don't Handle)",{"type":17,"tag":29,"props":266876,"children":266877},{},[266878],{"type":23,"value":266879},"Unified.to provides normalized access to over 370+ integrations across 24+ API categories:",{"type":17,"tag":80,"props":266881,"children":266882},{},[266883,266888,266893,266898,266903],{"type":17,"tag":84,"props":266884,"children":266885},{},[266886],{"type":23,"value":266887},"CRM (Salesforce, HubSpot, Pipedrive)",{"type":17,"tag":84,"props":266889,"children":266890},{},[266891],{"type":23,"value":266892},"HRIS & ATS (BambooHR, Greenhouse, Personio)",{"type":17,"tag":84,"props":266894,"children":266895},{},[266896],{"type":23,"value":266897},"File Storage (Google Drive, Dropbox, Box)",{"type":17,"tag":84,"props":266899,"children":266900},{},[266901],{"type":23,"value":266902},"Calendar & Scheduling (Google, Microsoft, Calendly)",{"type":17,"tag":84,"props":266904,"children":266905},{},[266906],{"type":23,"value":266907},"Ticketing & Support (Zendesk, Intercom, Help Scout)",{"type":17,"tag":29,"props":266909,"children":266910},{},[266911,266913,266917],{"type":23,"value":266912},"Unified.to ",{"type":17,"tag":48,"props":266914,"children":266915},{},[266916],{"type":23,"value":228363},{"type":23,"value":266918}," store records, process data post-fetch, or operate as a system of record. Your application controls where data is retained, stored, or processed. That distinction matters—especially for HIPAA, GDPR, and PIPEDA audits.",{"type":17,"tag":239,"props":266920,"children":266922},{"id":266921},"how-unified-apis-compare-on-compliance",[266923],{"type":23,"value":266924},"How Unified APIs Compare on Compliance",{"type":17,"tag":7231,"props":266926,"children":266927},{},[266928,266957],{"type":17,"tag":7235,"props":266929,"children":266930},{},[266931],{"type":17,"tag":7239,"props":266932,"children":266933},{},[266934,266938,266942,266947,266952],{"type":17,"tag":7243,"props":266935,"children":266936},{},[266937],{"type":23,"value":43242},{"type":17,"tag":7243,"props":266939,"children":266940},{},[266941],{"type":23,"value":94139},{"type":17,"tag":7243,"props":266943,"children":266944},{},[266945],{"type":23,"value":266946},"HIPAA Compliant",{"type":17,"tag":7243,"props":266948,"children":266949},{},[266950],{"type":23,"value":266951},"BAA Offered",{"type":17,"tag":7243,"props":266953,"children":266954},{},[266955],{"type":23,"value":266956},"Data Stored",{"type":17,"tag":7259,"props":266958,"children":266959},{},[266960,266987,267011,267035,267058],{"type":17,"tag":7239,"props":266961,"children":266962},{},[266963,266970,266974,266978,266982],{"type":17,"tag":7266,"props":266964,"children":266965},{},[266966],{"type":17,"tag":48,"props":266967,"children":266968},{},[266969],{"type":23,"value":217},{"type":17,"tag":7266,"props":266971,"children":266972},{},[266973],{"type":23,"value":47981},{"type":17,"tag":7266,"props":266975,"children":266976},{},[266977],{"type":23,"value":47981},{"type":17,"tag":7266,"props":266979,"children":266980},{},[266981],{"type":23,"value":47981},{"type":17,"tag":7266,"props":266983,"children":266984},{},[266985],{"type":23,"value":266986},"No - passthrough only",{"type":17,"tag":7239,"props":266988,"children":266989},{},[266990,266994,266998,267002,267006],{"type":17,"tag":7266,"props":266991,"children":266992},{},[266993],{"type":23,"value":7968},{"type":17,"tag":7266,"props":266995,"children":266996},{},[266997],{"type":23,"value":47981},{"type":17,"tag":7266,"props":266999,"children":267000},{},[267001],{"type":23,"value":47981},{"type":17,"tag":7266,"props":267003,"children":267004},{},[267005],{"type":23,"value":47981},{"type":17,"tag":7266,"props":267007,"children":267008},{},[267009],{"type":23,"value":267010},"Yes (with optional passthrough)",{"type":17,"tag":7239,"props":267012,"children":267013},{},[267014,267018,267022,267026,267030],{"type":17,"tag":7266,"props":267015,"children":267016},{},[267017],{"type":23,"value":8037},{"type":17,"tag":7266,"props":267019,"children":267020},{},[267021],{"type":23,"value":47981},{"type":17,"tag":7266,"props":267023,"children":267024},{},[267025],{"type":23,"value":47981},{"type":17,"tag":7266,"props":267027,"children":267028},{},[267029],{"type":23,"value":47981},{"type":17,"tag":7266,"props":267031,"children":267032},{},[267033],{"type":23,"value":267034},"No (logs only)",{"type":17,"tag":7239,"props":267036,"children":267037},{},[267038,267042,267046,267050,267054],{"type":17,"tag":7266,"props":267039,"children":267040},{},[267041],{"type":23,"value":237},{"type":17,"tag":7266,"props":267043,"children":267044},{},[267045],{"type":23,"value":47981},{"type":17,"tag":7266,"props":267047,"children":267048},{},[267049],{"type":23,"value":48006},{"type":17,"tag":7266,"props":267051,"children":267052},{},[267053],{"type":23,"value":48006},{"type":17,"tag":7266,"props":267055,"children":267056},{},[267057],{"type":23,"value":47981},{"type":17,"tag":7239,"props":267059,"children":267060},{},[267061,267065,267069,267074,267079],{"type":17,"tag":7266,"props":267062,"children":267063},{},[267064],{"type":23,"value":581},{"type":17,"tag":7266,"props":267066,"children":267067},{},[267068],{"type":23,"value":47981},{"type":17,"tag":7266,"props":267070,"children":267071},{},[267072],{"type":23,"value":267073},"Partial (only with self-hosted)",{"type":17,"tag":7266,"props":267075,"children":267076},{},[267077],{"type":23,"value":267078},"Not standard",{"type":17,"tag":7266,"props":267080,"children":267081},{},[267082],{"type":23,"value":47981},{"type":17,"tag":29,"props":267084,"children":267085},{},[267086],{"type":23,"value":267087},"Unified.to, Truto, and Merge.dev offer HIPAA-aligned infrastructure with BAAs. Unified.to and Truto go further by never storing end-user data, reducing audit exposure. Paragon requires customers to self-host for HIPAA readiness. Apideck does not support HIPAA workflows.",{"type":17,"tag":239,"props":267089,"children":267091},{"id":267090},"categories-common-in-regulated-workflows",[267092],{"type":23,"value":267093},"Categories Common in Regulated Workflows",{"type":17,"tag":29,"props":267095,"children":267096},{},[267097,267099,267103],{"type":23,"value":267098},"These ",{"type":17,"tag":133,"props":267100,"children":267101},{"href":7691},[267102],{"type":23,"value":7806},{"type":23,"value":267104}," categories are often used in HIPAA- or PII-adjacent workflows:",{"type":17,"tag":80,"props":267106,"children":267107},{},[267108,267117,267126,267135],{"type":17,"tag":84,"props":267109,"children":267110},{},[267111,267115],{"type":17,"tag":48,"props":267112,"children":267113},{},[267114],{"type":23,"value":11679},{"type":23,"value":267116},": employee benefits, FMLA, health coverage",{"type":17,"tag":84,"props":267118,"children":267119},{},[267120,267124],{"type":17,"tag":48,"props":267121,"children":267122},{},[267123],{"type":23,"value":25731},{"type":23,"value":267125},": contact records and outreach data containing PII",{"type":17,"tag":84,"props":267127,"children":267128},{},[267129,267133],{"type":17,"tag":48,"props":267130,"children":267131},{},[267132],{"type":23,"value":24559},{"type":23,"value":267134},": support cases or appointment reminders",{"type":17,"tag":84,"props":267136,"children":267137},{},[267138,267142],{"type":17,"tag":48,"props":267139,"children":267140},{},[267141],{"type":23,"value":72401},{"type":23,"value":267143},": uploaded health documents, consent forms",{"type":17,"tag":29,"props":267145,"children":267146},{},[267147],{"type":23,"value":267148},"Because Unified.to never stores this data, our role in the compliance chain is scoped to real-time transfer, not processing or storage.",{"type":17,"tag":239,"props":267150,"children":267152},{"id":267151},"clarifying-the-myth-hipaa-compliant-integrations",[267153],{"type":23,"value":267154},"Clarifying the Myth: \"HIPAA-Compliant Integrations\"",{"type":17,"tag":29,"props":267156,"children":267157},{},[267158,267160,267165],{"type":23,"value":267159},"Compliance applies to the ",{"type":17,"tag":48,"props":267161,"children":267162},{},[267163],{"type":23,"value":267164},"platform and architecture",{"type":23,"value":267166},"—not to the third-party apps themselves. Unified.to does not certify that Salesforce, Notion, or any connected system is HIPAA compliant.",{"type":17,"tag":29,"props":267168,"children":267169},{},[267170],{"type":23,"value":20289},{"type":17,"tag":80,"props":267172,"children":267173},{},[267174,267183,267188],{"type":17,"tag":84,"props":267175,"children":267176},{},[267177,267178],{"type":23,"value":266912},{"type":17,"tag":48,"props":267179,"children":267180},{},[267181],{"type":23,"value":267182},"enables HIPAA-aligned data transfer",{"type":17,"tag":84,"props":267184,"children":267185},{},[267186],{"type":23,"value":267187},"Customers must still ensure that connected third-party apps meet compliance requirements",{"type":17,"tag":84,"props":267189,"children":267190},{},[267191],{"type":23,"value":267192},"A BAA with Unified applies only to our infrastructure and handling",{"type":17,"tag":29,"props":267194,"children":267195},{},[267196],{"type":23,"value":267197},"This applies equally to other vendors. Merge and Truto offer similar disclaimers. Apideck and Paragon do not certify their integrations and provide less clarity around HIPAA readiness.",{"type":17,"tag":239,"props":267199,"children":267201},{"id":267200},"credentials-residency-audit-controls",[267202],{"type":23,"value":267203},"Credentials, Residency & Audit Controls",{"type":17,"tag":29,"props":267205,"children":267206},{},[267207],{"type":23,"value":267208},"Unified customers retain full control over authorization:",{"type":17,"tag":80,"props":267210,"children":267211},{},[267212,267223,267228,267233],{"type":17,"tag":84,"props":267213,"children":267214},{},[267215,267217,267221],{"type":23,"value":267216},"Use your own ",{"type":17,"tag":133,"props":267218,"children":267219},{"href":779},[267220],{"type":23,"value":782},{"type":23,"value":267222}," client credentials for branded auth",{"type":17,"tag":84,"props":267224,"children":267225},{},[267226],{"type":23,"value":267227},"Store API tokens in your own AWS Secrets Manager (BYOK supported)",{"type":17,"tag":84,"props":267229,"children":267230},{},[267231],{"type":23,"value":267232},"Restrict access by IP, enforce SAML/SSO, and log everything centrally",{"type":17,"tag":84,"props":267234,"children":267235},{},[267236],{"type":23,"value":267237},"Choose your data residency: US, Canada, Europe, or Australia",{"type":17,"tag":239,"props":267239,"children":267241},{"id":267240},"final-faq-so-which-unified-apis-are-hipaa-compliant",[267242],{"type":23,"value":267243},"Final FAQ: So, Which Unified APIs Are HIPAA Compliant?",{"type":17,"tag":29,"props":267245,"children":267246},{},[267247,267252],{"type":17,"tag":48,"props":267248,"children":267249},{},[267250],{"type":23,"value":267251},"All Unified APIs share the same compliance profile.",{"type":23,"value":267253}," If Unified.to is deployed in a HIPAA-regulated product:",{"type":17,"tag":80,"props":267255,"children":267256},{},[267257,267262,267267],{"type":17,"tag":84,"props":267258,"children":267259},{},[267260],{"type":23,"value":267261},"You can use any integration category that involves PHI (e.g., HRIS, calendar, messaging) under a BAA",{"type":17,"tag":84,"props":267263,"children":267264},{},[267265],{"type":23,"value":267266},"No customer data is ever stored on Unified.to's servers",{"type":17,"tag":84,"props":267268,"children":267269},{},[267270],{"type":23,"value":267271},"Your compliance risk is reduced by our passthrough design, not expanded",{"type":17,"tag":29,"props":267273,"children":267274},{},[267275,267277,267284],{"type":23,"value":267276},"For SOC 2, HIPAA, GDPR, or PIPEDA compliance documentation, visit ",{"type":17,"tag":133,"props":267278,"children":267281},{"href":267279,"rel":267280},"https://unified.safebase.us/",[214],[267282],{"type":23,"value":267283},"unified.safebase.us",{"type":23,"value":54},{"type":17,"tag":29,"props":267286,"children":267287},{},[267288,267289],{"type":23,"value":1609},{"type":17,"tag":133,"props":267290,"children":267292},{"href":1612,"rel":267291},[214],[267293],{"type":23,"value":1616},{"type":17,"tag":29,"props":267295,"children":267296},{},[267297,267298],{"type":23,"value":1609},{"type":17,"tag":133,"props":267299,"children":267301},{"href":1623,"rel":267300},[214],[267302],{"type":23,"value":1627},{"type":17,"tag":25,"props":267304,"children":267305},{},[],{"type":17,"tag":29,"props":267307,"children":267308},{},[267309],{"type":17,"tag":33,"props":267310,"children":267311},{},[267312],{"type":23,"value":267313},"Disclaimer: Unified.to's SOC 2 Type II and HIPAA compliance applies to our platform only. Customers are responsible for ensuring connected third-party applications and data usage meet their own regulatory requirements.",{"title":7,"searchDepth":1629,"depth":1629,"links":267315},[267316,267317,267318,267319,267320,267321,267322,267323],{"id":266771,"depth":1635,"text":266774},{"id":266821,"depth":1635,"text":266824},{"id":266871,"depth":1635,"text":266874},{"id":266921,"depth":1635,"text":266924},{"id":267090,"depth":1635,"text":267093},{"id":267151,"depth":1635,"text":267154},{"id":267200,"depth":1635,"text":267203},{"id":267240,"depth":1635,"text":267243},"content:blog:which_unified_apis_are_soc2_and_hipaa_compliant.md","blog/which_unified_apis_are_soc2_and_hipaa_compliant.md","blog/which_unified_apis_are_soc2_and_hipaa_compliant",{"_path":267328,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":267329,"description":267330,"img":267331,"date":267332,"tag":12,"body":267333,"_type":1677,"_id":267919,"_source":1679,"_file":267920,"_stem":267921,"_extension":1682},"/blog/best_unified_api_for_read_and_write_ats_integrations","Best Unified API for Read and Write ATS Integrations","Recruiting software lives and dies by integrations. Job records, candidate profiles, and application status changes move across dozens of Applicant Tracking...","https://s3.us-east-2.amazonaws.com/unified-article-images/best_unified_api_for_read_and_write_ats_integrations-icon.png","2025-10-30T00:00:00.000Z",{"type":14,"children":267334,"toc":267895},[267335,267340,267343,267350,267355,267366,267371,267377,267393,267411,267416,267421,267454,267458,267464,267469,267475,267480,267486,267491,267497,267502,267508,267513,267519,267524,267530,267535,267541,267546,267552,267563,267568,267574,267586,267591,267643,267648,267654,267659,267692,267711,267716,267722,267727,267748,267753,267766,267771,267777,267783,267788,267794,267799,267805,267810,267816,267821,267825,267830,267835,267858,267863,267879],{"type":17,"tag":18,"props":267336,"children":267338},{"id":267337},"best-unified-api-for-read-and-write-ats-integrations",[267339],{"type":23,"value":267329},{"type":17,"tag":25,"props":267341,"children":267342},{},[],{"type":17,"tag":29,"props":267344,"children":267345},{},[267346],{"type":17,"tag":33,"props":267347,"children":267348},{},[267349],{"type":23,"value":266758},{"type":17,"tag":29,"props":267351,"children":267352},{},[267353],{"type":23,"value":267354},"Recruiting software lives and dies by integrations. Job records, candidate profiles, and application status changes move across dozens of Applicant Tracking Systems. Keeping that data consistent is usually slow to build and expensive to maintain because every ATS differs on authentication, object models, write constraints, and event delivery.",{"type":17,"tag":29,"props":267356,"children":267357},{},[267358,267360,267364],{"type":23,"value":267359},"We built Unified's ",{"type":17,"tag":133,"props":267361,"children":267362},{"href":55696},[267363],{"type":23,"value":55699},{"type":23,"value":267365}," to reduce that complexity. Instead of integrating separately with each ATS, teams integrate once to a unified ATS API surface and work with a consistent set of objects and endpoints—while still accounting for provider-specific limitations.",{"type":17,"tag":29,"props":267367,"children":267368},{},[267369],{"type":23,"value":267370},"This post explains how our ATS API works in practice, what it supports today, and where provider constraints matter.",{"type":17,"tag":68,"props":267372,"children":267374},{"id":267373},"what-we-mean-by-an-ats-unified-api",[267375],{"type":23,"value":267376},"What we mean by an ATS unified API",{"type":17,"tag":29,"props":267378,"children":267379},{},[267380,267382,267391],{"type":23,"value":267381},"Our ATS API is a ",{"type":17,"tag":48,"props":267383,"children":267384},{},[267385,267387],{"type":23,"value":267386},"category-specific ",{"type":17,"tag":133,"props":267388,"children":267389},{"href":7691},[267390],{"type":23,"value":7459},{"type":23,"value":267392}," that connects your product to multiple Applicant Tracking Systems behind a consistent schema and endpoint structure.",{"type":17,"tag":29,"props":267394,"children":267395},{},[267396,267398,267402,267404,267409],{"type":23,"value":267397},"Instead of managing provider-specific authentication flows, ",{"type":17,"tag":133,"props":267399,"children":267400},{"href":1857},[267401],{"type":23,"value":1860},{"type":23,"value":267403},", object naming, and webhook formats, you integrate once and work with normalized ATS objects such as ",{"type":17,"tag":48,"props":267405,"children":267406},{},[267407],{"type":23,"value":267408},"candidates, jobs, applications, interviews, documents, companies, and scorecards",{"type":23,"value":267410},". Support for individual objects and write operations varies by provider, and we document those differences explicitly.",{"type":17,"tag":29,"props":267412,"children":267413},{},[267414],{"type":23,"value":267415},"When you need provider-specific fields, we make those available alongside the unified model so you can support advanced or custom use cases without branching your entire integration.",{"type":17,"tag":29,"props":267417,"children":267418},{},[267419],{"type":23,"value":267420},"Typical usage patterns include:",{"type":17,"tag":80,"props":267422,"children":267423},{},[267424,267434,267444],{"type":17,"tag":84,"props":267425,"children":267426},{},[267427,267432],{"type":17,"tag":48,"props":267428,"children":267429},{},[267430],{"type":23,"value":267431},"Read:",{"type":23,"value":267433}," list or retrieve candidates, jobs, applications, or interviews",{"type":17,"tag":84,"props":267435,"children":267436},{},[267437,267442],{"type":17,"tag":48,"props":267438,"children":267439},{},[267440],{"type":23,"value":267441},"Write:",{"type":23,"value":267443}," create or update candidates, applications, notes, or evaluations (where the provider allows it)",{"type":17,"tag":84,"props":267445,"children":267446},{},[267447,267452],{"type":17,"tag":48,"props":267448,"children":267449},{},[267450],{"type":23,"value":267451},"Events:",{"type":23,"value":267453}," receive native webhook events when an ATS supports them, or virtual webhooks when it doesn't, with polling and change detection managed by us",{"type":17,"tag":11616,"props":267455,"children":267457},{"width":11618,"height":11619,"src":267456,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/kd07s4afQfk",[],{"type":17,"tag":68,"props":267459,"children":267461},{"id":267460},"what-matters-when-choosing-an-ats-unified-api",[267462],{"type":23,"value":267463},"What matters when choosing an ATS unified API",{"type":17,"tag":29,"props":267465,"children":267466},{},[267467],{"type":23,"value":267468},"When teams evaluate ATS unified APIs, the difference isn't integration count—it's how the API behaves under real product constraints.",{"type":17,"tag":239,"props":267470,"children":267472},{"id":267471},"read-and-write-support-by-provider",[267473],{"type":23,"value":267474},"Read and write support, by provider",{"type":17,"tag":29,"props":267476,"children":267477},{},[267478],{"type":23,"value":267479},"Most ATS platforms do not offer full write access across all objects. Some objects are read-only, others allow create but not update or delete. A usable unified API needs to make those limits visible so teams can design features intentionally instead of discovering gaps late.",{"type":17,"tag":239,"props":267481,"children":267483},{"id":267482},"consistent-object-models",[267484],{"type":23,"value":267485},"Consistent object models",{"type":17,"tag":29,"props":267487,"children":267488},{},[267489],{"type":23,"value":267490},"We normalize core ATS objects so teams don't maintain per-provider mappings for candidates, applications, or jobs. That reduces engineering overhead and makes testing predictable, especially as you add more ATS integrations.",{"type":17,"tag":239,"props":267492,"children":267494},{"id":267493},"provider-specific-fields-when-required",[267495],{"type":23,"value":267496},"Provider-specific fields when required",{"type":17,"tag":29,"props":267498,"children":267499},{},[267500],{"type":23,"value":267501},"Recruiting data is rarely uniform. We support provider-specific fields so teams can access the data they need without abandoning the unified model.",{"type":17,"tag":239,"props":267503,"children":267505},{"id":267504},"real-time-access-and-event-delivery",[267506],{"type":23,"value":267507},"Real-time access and event delivery",{"type":17,"tag":29,"props":267509,"children":267510},{},[267511],{"type":23,"value":267512},"When ATS providers offer native webhooks, we pass those events through directly. When they don't, we provide virtual webhooks by polling the provider API and detecting changes. Event timing and object coverage depend on the provider, and polling-based delivery introduces measurable latency that teams should plan for.",{"type":17,"tag":239,"props":267514,"children":267516},{"id":267515},"zero-persistent-data-storage",[267517],{"type":23,"value":267518},"Zero persistent data storage",{"type":17,"tag":29,"props":267520,"children":267521},{},[267522],{"type":23,"value":267523},"Unified operates as a stateless, pass-through platform. We do not store customer ATS records at rest. Data is processed in memory and returned immediately. We retain only minimized, redacted operational logs, and customers can store credentials in their own secrets manager if required.",{"type":17,"tag":239,"props":267525,"children":267527},{"id":267526},"developer-experience",[267528],{"type":23,"value":267529},"Developer experience",{"type":17,"tag":29,"props":267531,"children":267532},{},[267533],{"type":23,"value":267534},"We provide SDKs, embedded authorization components, sandbox data, and observability tooling so teams can build and support ATS integrations without maintaining per-provider code paths.",{"type":17,"tag":239,"props":267536,"children":267538},{"id":267537},"mcp-for-controlled-tool-calling",[267539],{"type":23,"value":267540},"MCP for controlled tool-calling",{"type":17,"tag":29,"props":267542,"children":267543},{},[267544],{"type":23,"value":267545},"For teams building AI features, our MCP server makes specific ATS actions callable as tools. These tools map directly to API operations and must be explicitly enabled. MCP does not add autonomy—it exposes existing ATS actions in a controlled, auditable way.",{"type":17,"tag":68,"props":267547,"children":267549},{"id":267548},"unified-ats-coverage-today",[267550],{"type":23,"value":267551},"Unified ATS coverage today",{"type":17,"tag":29,"props":267553,"children":267554},{},[267555,267557,267562],{"type":23,"value":267556},"Our documentation currently lists ",{"type":17,"tag":48,"props":267558,"children":267559},{},[267560],{"type":23,"value":267561},"68 supported ATS integrations",{"type":23,"value":54},{"type":17,"tag":29,"props":267564,"children":267565},{},[267566],{"type":23,"value":267567},"This includes platforms such as Greenhouse, Lever, Workable, SmartRecruiters, iCIMS, Bullhorn, Teamtailor, and JazzHR. The ATS API follows the same architectural principles as the rest of Unified: real-time, pass-through requests with no caching of customer data, and native or virtual webhook delivery depending on provider capabilities.",{"type":17,"tag":239,"props":267569,"children":267571},{"id":267570},"important-note-on-write-support",[267572],{"type":23,"value":267573},"Important note on write support",{"type":17,"tag":29,"props":267575,"children":267576},{},[267577,267579,267584],{"type":23,"value":267578},"While the unified ATS API defines create, list, retrieve, update, and remove endpoints for core objects, ",{"type":17,"tag":48,"props":267580,"children":267581},{},[267582],{"type":23,"value":267583},"actual write support varies by provider and by object",{"type":23,"value":267585},". This is a property of the underlying ATS APIs, not something a unified layer can override.",{"type":17,"tag":29,"props":267587,"children":267588},{},[267589],{"type":23,"value":267590},"Examples from providers commonly referenced by customers:",{"type":17,"tag":80,"props":267592,"children":267593},{},[267594,267604,267613,267623,267633],{"type":17,"tag":84,"props":267595,"children":267596},{},[267597,267602],{"type":17,"tag":48,"props":267598,"children":267599},{},[267600],{"type":23,"value":267601},"Greenhouse:",{"type":23,"value":267603}," scorecards exist but have no writable fields",{"type":17,"tag":84,"props":267605,"children":267606},{},[267607,267612],{"type":17,"tag":48,"props":267608,"children":267609},{},[267610],{"type":23,"value":267611},"Lever:",{"type":23,"value":267603},{"type":17,"tag":84,"props":267614,"children":267615},{},[267616,267621],{"type":17,"tag":48,"props":267617,"children":267618},{},[267619],{"type":23,"value":267620},"Workable:",{"type":23,"value":267622}," jobs and some other objects are read-only",{"type":17,"tag":84,"props":267624,"children":267625},{},[267626,267631],{"type":17,"tag":48,"props":267627,"children":267628},{},[267629],{"type":23,"value":267630},"JazzHR:",{"type":23,"value":267632}," candidates and jobs are read-only",{"type":17,"tag":84,"props":267634,"children":267635},{},[267636,267641],{"type":17,"tag":48,"props":267637,"children":267638},{},[267639],{"type":23,"value":267640},"SmartRecruiters:",{"type":23,"value":267642}," jobs are read-only, while other objects support writes",{"type":17,"tag":29,"props":267644,"children":267645},{},[267646],{"type":23,"value":267647},"We surface these constraints in the integration matrix so teams can decide which features to enable per provider.",{"type":17,"tag":68,"props":267649,"children":267651},{"id":267650},"ats-objects-and-operations",[267652],{"type":23,"value":267653},"ATS objects and operations",{"type":17,"tag":29,"props":267655,"children":267656},{},[267657],{"type":23,"value":267658},"The unified ATS API organizes core objects around a consistent set of operations:",{"type":17,"tag":80,"props":267660,"children":267661},{},[267662,267666,267670,267674,267678,267683,267688],{"type":17,"tag":84,"props":267663,"children":267664},{},[267665],{"type":23,"value":117137},{"type":17,"tag":84,"props":267667,"children":267668},{},[267669],{"type":23,"value":240137},{"type":17,"tag":84,"props":267671,"children":267672},{},[267673],{"type":23,"value":117242},{"type":17,"tag":84,"props":267675,"children":267676},{},[267677],{"type":23,"value":117386},{"type":17,"tag":84,"props":267679,"children":267680},{},[267681],{"type":23,"value":267682},"Document",{"type":17,"tag":84,"props":267684,"children":267685},{},[267686],{"type":23,"value":267687},"Scorecard",{"type":17,"tag":84,"props":267689,"children":267690},{},[267691],{"type":23,"value":25846},{"type":17,"tag":29,"props":267693,"children":267694},{},[267695,267697,267702,267704,267709],{"type":23,"value":267696},"Each object has documented endpoints for create, list, retrieve, update, and remove, ",{"type":17,"tag":48,"props":267698,"children":267699},{},[267700],{"type":23,"value":267701},"subject to provider support",{"type":23,"value":267703},". One notable exception is ",{"type":17,"tag":48,"props":267705,"children":267706},{},[267707],{"type":23,"value":267708},"application status",{"type":23,"value":267710},", which is list-only across the unified model.",{"type":17,"tag":29,"props":267712,"children":267713},{},[267714],{"type":23,"value":267715},"Because ATS providers enforce different rules around deletion, updates, and audit trails, teams should always rely on the provider capability matrix rather than assuming universal CRUD behavior.",{"type":17,"tag":68,"props":267717,"children":267719},{"id":267718},"event-delivery-native-and-virtual-webhooks",[267720],{"type":23,"value":267721},"Event delivery: native and virtual webhooks",{"type":17,"tag":29,"props":267723,"children":267724},{},[267725],{"type":23,"value":267726},"We support two event delivery paths:",{"type":17,"tag":80,"props":267728,"children":267729},{},[267730,267739],{"type":17,"tag":84,"props":267731,"children":267732},{},[267733,267737],{"type":17,"tag":48,"props":267734,"children":267735},{},[267736],{"type":23,"value":9024},{"type":23,"value":267738}," when an ATS provider emits events",{"type":17,"tag":84,"props":267740,"children":267741},{},[267742,267746],{"type":17,"tag":48,"props":267743,"children":267744},{},[267745],{"type":23,"value":9256},{"type":23,"value":267747}," when the provider does not, using polling and change detection",{"type":17,"tag":29,"props":267749,"children":267750},{},[267751],{"type":23,"value":267752},"Two practical implications:",{"type":17,"tag":6154,"props":267754,"children":267755},{},[267756,267761],{"type":17,"tag":84,"props":267757,"children":267758},{},[267759],{"type":23,"value":267760},"Event latency varies by provider and polling interval when virtual webhooks are used.",{"type":17,"tag":84,"props":267762,"children":267763},{},[267764],{"type":23,"value":267765},"Not every ATS object emits events. Documents, interviews, jobs, or scorecards may require polling-based detection rather than event-driven updates.",{"type":17,"tag":29,"props":267767,"children":267768},{},[267769],{"type":23,"value":267770},"Our goal is to give teams a single webhook interface while being explicit about where provider limitations affect timing and coverage.",{"type":17,"tag":68,"props":267772,"children":267774},{"id":267773},"common-use-cases",[267775],{"type":23,"value":267776},"Common use cases",{"type":17,"tag":239,"props":267778,"children":267780},{"id":267779},"candidate-intake-and-synchronization",[267781],{"type":23,"value":267782},"Candidate intake and synchronization",{"type":17,"tag":29,"props":267784,"children":267785},{},[267786],{"type":23,"value":267787},"Read candidates and applications across multiple ATS providers and write updates where supported, using provider-specific fields when needed.",{"type":17,"tag":239,"props":267789,"children":267791},{"id":267790},"evaluation-and-feedback",[267792],{"type":23,"value":267793},"Evaluation and feedback",{"type":17,"tag":29,"props":267795,"children":267796},{},[267797],{"type":23,"value":267798},"Read scorecards where available and write evaluation data through the objects and fields each ATS supports. Some providers do not allow scorecard writes.",{"type":17,"tag":239,"props":267800,"children":267802},{"id":267801},"application-tracking",[267803],{"type":23,"value":267804},"Application tracking",{"type":17,"tag":29,"props":267806,"children":267807},{},[267808],{"type":23,"value":267809},"Subscribe to native or virtual webhook events for application changes, designing ingestion to handle polling-based delay when required.",{"type":17,"tag":239,"props":267811,"children":267813},{"id":267812},"ai-features-with-mcp",[267814],{"type":23,"value":267815},"AI features with MCP",{"type":17,"tag":29,"props":267817,"children":267818},{},[267819],{"type":23,"value":267820},"Use MCP to expose specific ATS actions—such as listing candidates or submitting evaluations—as callable tools. All actions remain constrained by provider write support and explicit permissions.",{"type":17,"tag":68,"props":267822,"children":267823},{"id":45643},[267824],{"type":23,"value":45646},{"type":17,"tag":29,"props":267826,"children":267827},{},[267828],{"type":23,"value":267829},"If you're building recruiting or HR software that depends on ATS integrations, the hard problems are write constraints, event coverage, and long-term maintenance—not just connectivity.",{"type":17,"tag":29,"props":267831,"children":267832},{},[267833],{"type":23,"value":267834},"Unified's ATS API is designed for teams that need:",{"type":17,"tag":80,"props":267836,"children":267837},{},[267838,267843,267848,267853],{"type":17,"tag":84,"props":267839,"children":267840},{},[267841],{"type":23,"value":267842},"Real-time, pass-through access to ATS data",{"type":17,"tag":84,"props":267844,"children":267845},{},[267846],{"type":23,"value":267847},"Clear documentation of provider-level write constraints",{"type":17,"tag":84,"props":267849,"children":267850},{},[267851],{"type":23,"value":267852},"Native and virtual webhook support without maintaining polling logic",{"type":17,"tag":84,"props":267854,"children":267855},{},[267856],{"type":23,"value":267857},"A stateless architecture that avoids storing customer records",{"type":17,"tag":29,"props":267859,"children":267860},{},[267861],{"type":23,"value":267862},"Start with the objects your product truly depends on, confirm provider write support early, and build against the documented constraints. That's how ATS integrations stay reliable as you scale.",{"type":17,"tag":29,"props":267864,"children":267865},{},[267866,267870,267871],{"type":17,"tag":48,"props":267867,"children":267868},{},[267869],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":267872,"children":267874},{"href":1612,"rel":267873},[214],[267875],{"type":17,"tag":48,"props":267876,"children":267877},{},[267878],{"type":23,"value":1616},{"type":17,"tag":29,"props":267880,"children":267881},{},[267882,267886,267887],{"type":17,"tag":48,"props":267883,"children":267884},{},[267885],{"type":23,"value":34307},{"type":23,"value":18757},{"type":17,"tag":133,"props":267888,"children":267890},{"href":1623,"rel":267889},[214],[267891],{"type":17,"tag":48,"props":267892,"children":267893},{},[267894],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":267896},[267897,267898,267907,267910,267911,267912,267918],{"id":267373,"depth":1629,"text":267376},{"id":267460,"depth":1629,"text":267463,"children":267899},[267900,267901,267902,267903,267904,267905,267906],{"id":267471,"depth":1635,"text":267474},{"id":267482,"depth":1635,"text":267485},{"id":267493,"depth":1635,"text":267496},{"id":267504,"depth":1635,"text":267507},{"id":267515,"depth":1635,"text":267518},{"id":267526,"depth":1635,"text":267529},{"id":267537,"depth":1635,"text":267540},{"id":267548,"depth":1629,"text":267551,"children":267908},[267909],{"id":267570,"depth":1635,"text":267573},{"id":267650,"depth":1629,"text":267653},{"id":267718,"depth":1629,"text":267721},{"id":267773,"depth":1629,"text":267776,"children":267913},[267914,267915,267916,267917],{"id":267779,"depth":1635,"text":267782},{"id":267790,"depth":1635,"text":267793},{"id":267801,"depth":1635,"text":267804},{"id":267812,"depth":1635,"text":267815},{"id":45643,"depth":1629,"text":45646},"content:blog:best_unified_api_for_read_and_write_ats_integrations.md","blog/best_unified_api_for_read_and_write_ats_integrations.md","blog/best_unified_api_for_read_and_write_ats_integrations",{"_path":267923,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":267924,"description":267925,"img":267926,"date":267927,"tag":12,"body":267928,"_type":1677,"_id":268511,"_source":1679,"_file":268512,"_stem":268513,"_extension":1682},"/blog/how_to_build_an_ai_notetaker_across_zoom_google_meet_outlook_and_salesforce_with_a_unified_api","How to Build an AI Notetaker Across Zoom, Google Meet, Outlook, and Salesforce with a Unified API","Modern revenue and support teams spend hours capturing notes, updating CRMs, and scheduling follow-ups after every customer call. These repetitive workflows...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_ai_notetaker_across_zoom_google_meet_outlook_and_salesforce_with_a_unified_api-icon.png","2025-10-21T00:00:00.000Z",{"type":14,"children":267929,"toc":268503},[267930,267935,267938,267946,267951,267962,267973,267979,267983,268031,268037,268187,268192,268198,268210,268293,268299,268304,268373,268378,268384,268389,268412,268417,268422,268428,268433,268476,268481],{"type":17,"tag":18,"props":267931,"children":267933},{"id":267932},"how-to-build-an-ai-notetaker-across-zoom-google-meet-outlook-and-salesforce-with-a-unified-api",[267934],{"type":23,"value":267924},{"type":17,"tag":25,"props":267936,"children":267937},{},[],{"type":17,"tag":29,"props":267939,"children":267940},{},[267941],{"type":17,"tag":33,"props":267942,"children":267943},{},[267944],{"type":23,"value":267945},"October 21, 2025",{"type":17,"tag":29,"props":267947,"children":267948},{},[267949],{"type":23,"value":267950},"Modern revenue and support teams spend hours capturing notes, updating CRMs, and scheduling follow-ups after every customer call. These repetitive workflows slow down productivity and create data gaps across systems.",{"type":17,"tag":29,"props":267952,"children":267953},{},[267954,267956,267960],{"type":23,"value":267955},"Unified.to simplifies the entire process. With a ",{"type":17,"tag":133,"props":267957,"children":267958},{"href":7691},[267959],{"type":23,"value":7459},{"type":23,"value":267961},", your product can capture meeting recordings, generate AI notes and action items, sync them to CRM records, and automatically schedule follow-ups—without building or maintaining per-vendor integrations.",{"type":17,"tag":29,"props":267963,"children":267964},{},[267965,267967,267971],{"type":23,"value":267966},"This same architecture can power ",{"type":17,"tag":133,"props":267968,"children":267969},{"href":77021},[267970],{"type":23,"value":77024},{"type":23,"value":267972}," (RAG) workflows, where prior calls, emails, and CRM activity are retrieved to ground summaries in historical context.",{"type":17,"tag":239,"props":267974,"children":267976},{"id":267975},"when-to-use-an-ai-notetaker",[267977],{"type":23,"value":267978},"When to Use an AI Notetaker",{"type":17,"tag":29,"props":267980,"children":267981},{},[267982],{"type":23,"value":254154},{"type":17,"tag":80,"props":267984,"children":267985},{},[267986,267996,268006,268016,268026],{"type":17,"tag":84,"props":267987,"children":267988},{},[267989,267994],{"type":17,"tag":48,"props":267990,"children":267991},{},[267992],{"type":23,"value":267993},"Auto-generate summaries, decisions, and action items",{"type":23,"value":267995}," from calls or meetings.",{"type":17,"tag":84,"props":267997,"children":267998},{},[267999,268004],{"type":17,"tag":48,"props":268000,"children":268001},{},[268002],{"type":23,"value":268003},"Update CRM records",{"type":23,"value":268005}," with notes and next steps—no manual entry.",{"type":17,"tag":84,"props":268007,"children":268008},{},[268009,268014],{"type":17,"tag":48,"props":268010,"children":268011},{},[268012],{"type":23,"value":268013},"Auto-schedule follow-ups or callbacks",{"type":23,"value":268015}," on the connected calendar.",{"type":17,"tag":84,"props":268017,"children":268018},{},[268019,268024],{"type":17,"tag":48,"props":268020,"children":268021},{},[268022],{"type":23,"value":268023},"Unify calls and email threads",{"type":23,"value":268025}," into a single, real-time CRM timeline.",{"type":17,"tag":84,"props":268027,"children":268028},{},[268029],{"type":23,"value":268030},"Retrieve historical calls, emails, or CRM notes to ground summaries using a RAG-based context layer.",{"type":17,"tag":239,"props":268032,"children":268034},{"id":268033},"unified-objects-key-entities",[268035],{"type":23,"value":268036},"Unified Objects & Key Entities",{"type":17,"tag":7231,"props":268038,"children":268039},{},[268040,268058],{"type":17,"tag":7235,"props":268041,"children":268042},{},[268043],{"type":17,"tag":7239,"props":268044,"children":268045},{},[268046,268050,268054],{"type":17,"tag":7243,"props":268047,"children":268048},{},[268049],{"type":23,"value":18594},{"type":17,"tag":7243,"props":268051,"children":268052},{},[268053],{"type":23,"value":24525},{"type":17,"tag":7243,"props":268055,"children":268056},{},[268057],{"type":23,"value":6701},{"type":17,"tag":7259,"props":268059,"children":268060},{},[268061,268082,268103,268124,268145,268166],{"type":17,"tag":7239,"props":268062,"children":268063},{},[268064,268072,268077],{"type":17,"tag":7266,"props":268065,"children":268066},{},[268067],{"type":17,"tag":48,"props":268068,"children":268069},{},[268070],{"type":23,"value":268071},"CRM Note / Activity",{"type":17,"tag":7266,"props":268073,"children":268074},{},[268075],{"type":23,"value":268076},"Where summaries and actions are written back",{"type":17,"tag":7266,"props":268078,"children":268079},{},[268080],{"type":23,"value":268081},"Linked to Contact, Company, or Deal; exact entity varies by CRM",{"type":17,"tag":7239,"props":268083,"children":268084},{},[268085,268093,268098],{"type":17,"tag":7266,"props":268086,"children":268087},{},[268088],{"type":17,"tag":48,"props":268089,"children":268090},{},[268091],{"type":23,"value":268092},"CRM Contact / Company / Deal",{"type":17,"tag":7266,"props":268094,"children":268095},{},[268096],{"type":23,"value":268097},"Records associated with meeting outcomes",{"type":17,"tag":7266,"props":268099,"children":268100},{},[268101],{"type":23,"value":268102},"Association via email, phone, domain, or existing record ID",{"type":17,"tag":7239,"props":268104,"children":268105},{},[268106,268114,268119],{"type":17,"tag":7266,"props":268107,"children":268108},{},[268109],{"type":17,"tag":48,"props":268110,"children":268111},{},[268112],{"type":23,"value":268113},"Messaging Thread / Message",{"type":17,"tag":7266,"props":268115,"children":268116},{},[268117],{"type":23,"value":268118},"Email context for pre/post-call insights",{"type":17,"tag":7266,"props":268120,"children":268121},{},[268122],{"type":23,"value":268123},"Optional; adds richer customer timeline",{"type":17,"tag":7239,"props":268125,"children":268126},{},[268127,268135,268140],{"type":17,"tag":7266,"props":268128,"children":268129},{},[268130],{"type":17,"tag":48,"props":268131,"children":268132},{},[268133],{"type":23,"value":268134},"Meeting / Call Recording & Transcript",{"type":17,"tag":7266,"props":268136,"children":268137},{},[268138],{"type":23,"value":268139},"Source content for summarization",{"type":17,"tag":7266,"props":268141,"children":268142},{},[268143],{"type":23,"value":268144},"Use transcript or media file for AI generation",{"type":17,"tag":7239,"props":268146,"children":268147},{},[268148,268156,268161],{"type":17,"tag":7266,"props":268149,"children":268150},{},[268151],{"type":17,"tag":48,"props":268152,"children":268153},{},[268154],{"type":23,"value":268155},"Calendar Event (Callback / Follow-up)",{"type":17,"tag":7266,"props":268157,"children":268158},{},[268159],{"type":23,"value":268160},"Scheduled next steps or reminders",{"type":17,"tag":7266,"props":268162,"children":268163},{},[268164],{"type":23,"value":268165},"Supports reschedule/cancel via webhooks",{"type":17,"tag":7239,"props":268167,"children":268168},{},[268169,268177,268182],{"type":17,"tag":7266,"props":268170,"children":268171},{},[268172],{"type":17,"tag":48,"props":268173,"children":268174},{},[268175],{"type":23,"value":268176},"GenAI Prompt / Response",{"type":17,"tag":7266,"props":268178,"children":268179},{},[268180],{"type":23,"value":268181},"Summarization and action extraction",{"type":17,"tag":7266,"props":268183,"children":268184},{},[268185],{"type":23,"value":268186},"Configurable for any GenAI model or provider",{"type":17,"tag":29,"props":268188,"children":268189},{},[268190],{"type":23,"value":268191},"These normalized objects allow you to orchestrate end-to-end note-taking workflows across CRM, messaging, calendar, and AI providers—all from a single integration layer.",{"type":17,"tag":239,"props":268193,"children":268195},{"id":268194},"supported-domains",[268196],{"type":23,"value":268197},"Supported Domains",{"type":17,"tag":29,"props":268199,"children":268200},{},[268201,268203,268208],{"type":23,"value":268202},"Unified.to supports full AI notetaker workflows across ",{"type":17,"tag":48,"props":268204,"children":268205},{},[268206],{"type":23,"value":268207},"CRM, messaging, calendar, and GenAI providers",{"type":23,"value":268209},"—all accessible through a single unified API.",{"type":17,"tag":80,"props":268211,"children":268212},{},[268213,268233,268253,268273],{"type":17,"tag":84,"props":268214,"children":268215},{},[268216,268221,268223,268226,268227],{"type":17,"tag":48,"props":268217,"children":268218},{},[268219],{"type":23,"value":268220},"CRM (38+ integrations):",{"type":23,"value":268222}," Connect to leading systems like Salesforce, HubSpot, Pipedrive, Zoho CRM, Close, Copper, and more.",{"type":17,"tag":3891,"props":268224,"children":268225},{},[],{"type":23,"value":1609},{"type":17,"tag":133,"props":268228,"children":268230},{"href":76501,"rel":268229},[214],[268231],{"type":23,"value":268232},"Explore CRM integrations",{"type":17,"tag":84,"props":268234,"children":268235},{},[268236,268241,268243,268246,268247],{"type":17,"tag":48,"props":268237,"children":268238},{},[268239],{"type":23,"value":268240},"Messaging (12+ integrations):",{"type":23,"value":268242}," Integrate with Gmail, Outlook, IMAP, and collaboration tools like Slack to capture pre- and post-meeting context, email threads, and internal notes for richer timelines.",{"type":17,"tag":3891,"props":268244,"children":268245},{},[],{"type":23,"value":1609},{"type":17,"tag":133,"props":268248,"children":268250},{"href":76521,"rel":268249},[214],[268251],{"type":23,"value":268252},"Explore Messaging integrations",{"type":17,"tag":84,"props":268254,"children":268255},{},[268256,268261,268263,268266,268267],{"type":17,"tag":48,"props":268257,"children":268258},{},[268259],{"type":23,"value":268260},"Calendar & Meetings (19+ integrations):",{"type":23,"value":268262}," Connect to Google Calendar, Microsoft Outlook/Teams, Zoom, Webex, and others to fetch meeting events, recordings, and transcripts—or auto-schedule follow-ups and reminders.",{"type":17,"tag":3891,"props":268264,"children":268265},{},[],{"type":23,"value":1609},{"type":17,"tag":133,"props":268268,"children":268270},{"href":99025,"rel":268269},[214],[268271],{"type":23,"value":268272},"Explore Calendar integrations",{"type":17,"tag":84,"props":268274,"children":268275},{},[268276,268281,268283,268286,268287],{"type":17,"tag":48,"props":268277,"children":268278},{},[268279],{"type":23,"value":268280},"GenAI (11+ model providers):",{"type":23,"value":268282}," Power summarization and action extraction using OpenAI (GPT), Anthropic (Claude), Google Gemini, Mistral, Groq, and other supported providers through Unified GenAI.",{"type":17,"tag":3891,"props":268284,"children":268285},{},[],{"type":23,"value":1609},{"type":17,"tag":133,"props":268288,"children":268290},{"href":254625,"rel":268289},[214],[268291],{"type":23,"value":268292},"Explore GenAI integrations",{"type":17,"tag":239,"props":268294,"children":268296},{"id":268295},"data-flow-for-ai-notetaker",[268297],{"type":23,"value":268298},"Data Flow for AI Notetaker",{"type":17,"tag":29,"props":268300,"children":268301},{},[268302],{"type":23,"value":268303},"The workflow follows a simple, repeatable pattern across all connected systems:",{"type":17,"tag":6154,"props":268305,"children":268306},{},[268307,268323,268333,268343,268353,268363],{"type":17,"tag":84,"props":268308,"children":268309},{},[268310,268314,268316,268321],{"type":17,"tag":48,"props":268311,"children":268312},{},[268313],{"type":23,"value":251948},{"type":23,"value":268315}," — The user authenticates their CRM, messaging, calendar, and meeting providers through Unified's embedded authorization flow. Each integration returns a ",{"type":17,"tag":6121,"props":268317,"children":268319},{"className":268318},[],[268320],{"type":23,"value":25037},{"type":23,"value":268322},", giving your product secure, real-time access to customer data.",{"type":17,"tag":84,"props":268324,"children":268325},{},[268326,268331],{"type":17,"tag":48,"props":268327,"children":268328},{},[268329],{"type":23,"value":268330},"Capture",{"type":23,"value":268332}," — Fetch recent meetings, recordings, or transcripts from the connected conferencing platform. Optionally, pull in related email threads from Gmail, Outlook, or Slack to add pre- and post-meeting context.",{"type":17,"tag":84,"props":268334,"children":268335},{},[268336,268341],{"type":17,"tag":48,"props":268337,"children":268338},{},[268339],{"type":23,"value":268340},"Summarize",{"type":23,"value":268342}," — Create a GenAI prompt that includes transcript text and context to generate structured summaries, action items, or decisions. Unified GenAI handles the prompt orchestration and model routing.",{"type":17,"tag":84,"props":268344,"children":268345},{},[268346,268351],{"type":17,"tag":48,"props":268347,"children":268348},{},[268349],{"type":23,"value":268350},"Sync to CRM",{"type":23,"value":268352}," — Write the summary and key outcomes back to the customer's CRM as a Note or Activity, automatically linked to the relevant Contact, Company, or Deal.",{"type":17,"tag":84,"props":268354,"children":268355},{},[268356,268361],{"type":17,"tag":48,"props":268357,"children":268358},{},[268359],{"type":23,"value":268360},"Schedule Follow-ups",{"type":23,"value":268362}," — Create a new calendar event for callbacks or reminders and subscribe to updates to handle reschedules and cancellations automatically.",{"type":17,"tag":84,"props":268364,"children":268365},{},[268366,268371],{"type":17,"tag":48,"props":268367,"children":268368},{},[268369],{"type":23,"value":268370},"Stay in Sync",{"type":23,"value":268372}," — Unified's webhooks monitor transcript updates, message replies, or CRM changes in real time, ensuring every note and task stays current without manual refresh.",{"type":17,"tag":29,"props":268374,"children":268375},{},[268376],{"type":23,"value":268377},"This flow keeps every insight, follow-up, and customer interaction synchronized, without custom logic per vendor.",{"type":17,"tag":239,"props":268379,"children":268381},{"id":268380},"extending-ai-notetaking-with-rag-context",[268382],{"type":23,"value":268383},"Extending AI Notetaking with RAG Context",{"type":17,"tag":29,"props":268385,"children":268386},{},[268387],{"type":23,"value":268388},"For deeper insights across multiple interactions:",{"type":17,"tag":6154,"props":268390,"children":268391},{},[268392,268397,268402,268407],{"type":17,"tag":84,"props":268393,"children":268394},{},[268395],{"type":23,"value":268396},"Subscribe to transcript, message, and CRM activity webhooks.",{"type":17,"tag":84,"props":268398,"children":268399},{},[268400],{"type":23,"value":268401},"Fetch and chunk historical notes, emails, and call transcripts.",{"type":17,"tag":84,"props":268403,"children":268404},{},[268405],{"type":23,"value":268406},"Generate embeddings and store them in your vector database.",{"type":17,"tag":84,"props":268408,"children":268409},{},[268410],{"type":23,"value":268411},"When summarizing a new call, retrieve relevant prior interactions before generating the final output. Unified Use Case RAG Pipelines",{"type":17,"tag":29,"props":268413,"children":268414},{},[268415],{"type":23,"value":268416},"This allows your AI notetaker to reference past conversations, previous objections, or prior commitments—without manual searching.\nUnified Use Case RAG Pipelines",{"type":17,"tag":29,"props":268418,"children":268419},{},[268420],{"type":23,"value":268421},"Unified handles ingestion and real-time updates; embeddings and retrieval remain in your infrastructure.\nUnified Use Case RAG Pipelines",{"type":17,"tag":239,"props":268423,"children":268425},{"id":268424},"why-product-teams-choose-unifiedto",[268426],{"type":23,"value":268427},"Why Product Teams Choose Unified.to",{"type":17,"tag":29,"props":268429,"children":268430},{},[268431],{"type":23,"value":268432},"For PMs and engineers building AI-powered productivity tools:",{"type":17,"tag":80,"props":268434,"children":268435},{},[268436,268446,268456,268466],{"type":17,"tag":84,"props":268437,"children":268438},{},[268439,268444],{"type":17,"tag":48,"props":268440,"children":268441},{},[268442],{"type":23,"value":268443},"Build once, connect everywhere:",{"type":23,"value":268445}," one API for CRM, messaging, meetings, and GenAI.",{"type":17,"tag":84,"props":268447,"children":268448},{},[268449,268454],{"type":17,"tag":48,"props":268450,"children":268451},{},[268452],{"type":23,"value":268453},"Reduce manual work:",{"type":23,"value":268455}," automate note-taking and scheduling from real-time data.",{"type":17,"tag":84,"props":268457,"children":268458},{},[268459,268464],{"type":17,"tag":48,"props":268460,"children":268461},{},[268462],{"type":23,"value":268463},"Standardize output:",{"type":23,"value":268465}," normalized schemas ensure consistency across vendors.",{"type":17,"tag":84,"props":268467,"children":268468},{},[268469,268474],{"type":17,"tag":48,"props":268470,"children":268471},{},[268472],{"type":23,"value":268473},"AI-ready infrastructure:",{"type":23,"value":268475}," Unified GenAI lets you plug in OpenAI, Anthropic, Gemini, or any provider.",{"type":17,"tag":29,"props":268477,"children":268478},{},[268479],{"type":23,"value":268480},"Deliver AI-powered meeting notes, summaries, and follow-ups in your app—without writing vendor-specific code.",{"type":17,"tag":29,"props":268482,"children":268483},{},[268484,268492,268493,268501],{"type":17,"tag":133,"props":268485,"children":268487},{"href":158861,"rel":268486},[214],[268488],{"type":17,"tag":48,"props":268489,"children":268490},{},[268491],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":268494,"children":268496},{"href":1623,"rel":268495},[214],[268497],{"type":17,"tag":48,"props":268498,"children":268499},{},[268500],{"type":23,"value":226481},{"type":23,"value":268502}," to see how Unified.to accelerates AI workflow delivery.",{"title":7,"searchDepth":1629,"depth":1629,"links":268504},[268505,268506,268507,268508,268509,268510],{"id":267975,"depth":1635,"text":267978},{"id":268033,"depth":1635,"text":268036},{"id":268194,"depth":1635,"text":268197},{"id":268295,"depth":1635,"text":268298},{"id":268380,"depth":1635,"text":268383},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_build_an_ai_notetaker_across_zoom_google_meet_outlook_and_salesforce_with_a_unified_api.md","blog/how_to_build_an_ai_notetaker_across_zoom_google_meet_outlook_and_salesforce_with_a_unified_api.md","blog/how_to_build_an_ai_notetaker_across_zoom_google_meet_outlook_and_salesforce_with_a_unified_api",{"_path":268515,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":268516,"description":268517,"img":268518,"date":267927,"tag":12,"body":268519,"_type":1677,"_id":269008,"_source":1679,"_file":269009,"_stem":269010,"_extension":1682},"/blog/how_to_build_an_ai_sales_assistant_across_salesforce_hubspot_and_slack_with_a_unified_api","How to Build an AI Sales Assistant Across Salesforce, HubSpot, and Slack with a Unified API","AI sales assistants are transforming how teams engage prospects and manage pipeline. But behind every 'AI rep' is a tangle of integrations — CRM, email, chat,...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_ai_sales_assistant_across_salesforce_hubspot_and_slack_with_a_unified_api-icon.png",{"type":14,"children":268520,"toc":269001},[268521,268526,268529,268536,268541,268546,268552,268562,268611,268615,268620,268745,268751,268756,268832,268838,268917,268922,268926,268931,268974,268979],{"type":17,"tag":18,"props":268522,"children":268524},{"id":268523},"how-to-build-an-ai-sales-assistant-across-salesforce-hubspot-and-slack-with-a-unified-api",[268525],{"type":23,"value":268516},{"type":17,"tag":25,"props":268527,"children":268528},{},[],{"type":17,"tag":29,"props":268530,"children":268531},{},[268532],{"type":17,"tag":33,"props":268533,"children":268534},{},[268535],{"type":23,"value":267945},{"type":17,"tag":29,"props":268537,"children":268538},{},[268539],{"type":23,"value":268540},"AI sales assistants are transforming how teams engage prospects and manage pipeline. But behind every 'AI rep' is a tangle of integrations — CRM, email, chat, calendar, enrichment, and AI model connections — that are complex to build and maintain.",{"type":17,"tag":29,"props":268542,"children":268543},{},[268544],{"type":23,"value":268545},"Unified.to streamlines this by providing a single API for ingesting customer data, conversing across channels, scheduling meetings, and updating CRM records. Your product can qualify leads, answer questions, and create opportunities — without building per-vendor connectors or syncing data manually.",{"type":17,"tag":239,"props":268547,"children":268549},{"id":268548},"when-to-use-an-ai-sales-assistant",[268550],{"type":23,"value":268551},"When to Use an AI Sales Assistant",{"type":17,"tag":29,"props":268553,"children":268554},{},[268555,268557,268561],{"type":23,"value":268556},"With a ",{"type":17,"tag":133,"props":268558,"children":268559},{"href":7691},[268560],{"type":23,"value":7459},{"type":23,"value":233792},{"type":17,"tag":80,"props":268563,"children":268564},{},[268565,268582,268592,268602],{"type":17,"tag":84,"props":268566,"children":268567},{},[268568,268573,268575,268580],{"type":17,"tag":48,"props":268569,"children":268570},{},[268571],{"type":23,"value":268572},"Qualify inbound leads",{"type":23,"value":268574}," or run ",{"type":17,"tag":48,"props":268576,"children":268577},{},[268578],{"type":23,"value":268579},"outbound sequences",{"type":23,"value":268581}," autonomously.",{"type":17,"tag":84,"props":268583,"children":268584},{},[268585,268590],{"type":17,"tag":48,"props":268586,"children":268587},{},[268588],{"type":23,"value":268589},"Answer account or product questions",{"type":23,"value":268591}," using live connected data.",{"type":17,"tag":84,"props":268593,"children":268594},{},[268595,268600],{"type":17,"tag":48,"props":268596,"children":268597},{},[268598],{"type":23,"value":268599},"Capture notes, next steps, and meeting details",{"type":23,"value":268601}," automatically after each interaction.",{"type":17,"tag":84,"props":268603,"children":268604},{},[268605,268609],{"type":17,"tag":48,"props":268606,"children":268607},{},[268608],{"type":23,"value":191220},{"type":23,"value":268610}," like Deals, Tasks, and Events directly from conversations.",{"type":17,"tag":239,"props":268612,"children":268613},{"id":268033},[268614],{"type":23,"value":268036},{"type":17,"tag":29,"props":268616,"children":268617},{},[268618],{"type":23,"value":268619},"Unified.to normalizes the data models required to power conversational sales workflows:",{"type":17,"tag":7231,"props":268621,"children":268622},{},[268623,268642],{"type":17,"tag":7235,"props":268624,"children":268625},{},[268626],{"type":17,"tag":7239,"props":268627,"children":268628},{},[268629,268634,268638],{"type":17,"tag":7243,"props":268630,"children":268631},{},[268632],{"type":23,"value":268633},"Domain",{"type":17,"tag":7243,"props":268635,"children":268636},{},[268637],{"type":23,"value":18594},{"type":17,"tag":7243,"props":268639,"children":268640},{},[268641],{"type":23,"value":20787},{"type":17,"tag":7259,"props":268643,"children":268644},{},[268645,268665,268685,268704,268725],{"type":17,"tag":7239,"props":268646,"children":268647},{},[268648,268655,268660],{"type":17,"tag":7266,"props":268649,"children":268650},{},[268651],{"type":17,"tag":48,"props":268652,"children":268653},{},[268654],{"type":23,"value":25731},{"type":17,"tag":7266,"props":268656,"children":268657},{},[268658],{"type":23,"value":268659},"Company / Account, Contact, Deal / Opportunity, Event / Note / Task",{"type":17,"tag":7266,"props":268661,"children":268662},{},[268663],{"type":23,"value":268664},"Read customer and pipeline context, write back summaries and actions, or create new deals.",{"type":17,"tag":7239,"props":268666,"children":268667},{},[268668,268675,268680],{"type":17,"tag":7266,"props":268669,"children":268670},{},[268671],{"type":17,"tag":48,"props":268672,"children":268673},{},[268674],{"type":23,"value":24559},{"type":17,"tag":7266,"props":268676,"children":268677},{},[268678],{"type":23,"value":268679},"Thread, Message, Attachment",{"type":17,"tag":7266,"props":268681,"children":268682},{},[268683],{"type":23,"value":268684},"Converse with customers or ingest past message history for context.",{"type":17,"tag":7239,"props":268686,"children":268687},{},[268688,268695,268699],{"type":17,"tag":7266,"props":268689,"children":268690},{},[268691],{"type":17,"tag":48,"props":268692,"children":268693},{},[268694],{"type":23,"value":14515},{"type":17,"tag":7266,"props":268696,"children":268697},{},[268698],{"type":23,"value":14528},{"type":17,"tag":7266,"props":268700,"children":268701},{},[268702],{"type":23,"value":268703},"Book meetings, demos, or callbacks with attendees automatically.",{"type":17,"tag":7239,"props":268705,"children":268706},{},[268707,268715,268720],{"type":17,"tag":7266,"props":268708,"children":268709},{},[268710],{"type":17,"tag":48,"props":268711,"children":268712},{},[268713],{"type":23,"value":268714},"Enrichment (optional)",{"type":17,"tag":7266,"props":268716,"children":268717},{},[268718],{"type":23,"value":268719},"Enrichment Request / Result",{"type":17,"tag":7266,"props":268721,"children":268722},{},[268723],{"type":23,"value":268724},"Append firmographic or contact context to improve routing and qualification.",{"type":17,"tag":7239,"props":268726,"children":268727},{},[268728,268735,268740],{"type":17,"tag":7266,"props":268729,"children":268730},{},[268731],{"type":17,"tag":48,"props":268732,"children":268733},{},[268734],{"type":23,"value":24595},{"type":17,"tag":7266,"props":268736,"children":268737},{},[268738],{"type":23,"value":268739},"Prompt / Response",{"type":17,"tag":7266,"props":268741,"children":268742},{},[268743],{"type":23,"value":268744},"Generate responses, summarize conversations, and plan next steps.",{"type":17,"tag":239,"props":268746,"children":268748},{"id":268747},"supported-channels-systems",[268749],{"type":23,"value":268750},"Supported Channels & Systems",{"type":17,"tag":29,"props":268752,"children":268753},{},[268754],{"type":23,"value":268755},"Unified.to connects the entire sales engagement stack through one API surface:",{"type":17,"tag":80,"props":268757,"children":268758},{},[268759,268777,268795,268814],{"type":17,"tag":84,"props":268760,"children":268761},{},[268762,268766,268768,268771,268772],{"type":17,"tag":48,"props":268763,"children":268764},{},[268765],{"type":23,"value":268220},{"type":23,"value":268767}," Salesforce, HubSpot, Pipedrive, Zoho CRM, Close, Copper, and others.",{"type":17,"tag":3891,"props":268769,"children":268770},{},[],{"type":23,"value":1609},{"type":17,"tag":133,"props":268773,"children":268775},{"href":76501,"rel":268774},[214],[268776],{"type":23,"value":268232},{"type":17,"tag":84,"props":268778,"children":268779},{},[268780,268784,268786,268789,268790],{"type":17,"tag":48,"props":268781,"children":268782},{},[268783],{"type":23,"value":268240},{"type":23,"value":268785}," Gmail, Outlook, Slack, Microsoft Teams, and other communication channels for real-time conversations and thread ingestion.",{"type":17,"tag":3891,"props":268787,"children":268788},{},[],{"type":23,"value":1609},{"type":17,"tag":133,"props":268791,"children":268793},{"href":76521,"rel":268792},[214],[268794],{"type":23,"value":268252},{"type":17,"tag":84,"props":268796,"children":268797},{},[268798,268803,268805,268808,268809],{"type":17,"tag":48,"props":268799,"children":268800},{},[268801],{"type":23,"value":268802},"Calendar (19+ integrations):",{"type":23,"value":268804}," Google Calendar, Microsoft Outlook/Teams, and additional meeting systems for booking demos, follow-ups, and reminders.",{"type":17,"tag":3891,"props":268806,"children":268807},{},[],{"type":23,"value":1609},{"type":17,"tag":133,"props":268810,"children":268812},{"href":99025,"rel":268811},[214],[268813],{"type":23,"value":268272},{"type":17,"tag":84,"props":268815,"children":268816},{},[268817,268821,268823,268826,268827],{"type":17,"tag":48,"props":268818,"children":268819},{},[268820],{"type":23,"value":268280},{"type":23,"value":268822}," Unified GenAI supports OpenAI (GPT-4/3.5), Anthropic Claude, Google Gemini, Mistral, Groq, and others for conversation generation, summarization, and reasoning.",{"type":17,"tag":3891,"props":268824,"children":268825},{},[],{"type":23,"value":1609},{"type":17,"tag":133,"props":268828,"children":268830},{"href":254625,"rel":268829},[214],[268831],{"type":23,"value":268292},{"type":17,"tag":239,"props":268833,"children":268835},{"id":268834},"data-flow-for-an-ai-sales-assistant",[268836],{"type":23,"value":268837},"Data Flow for an AI Sales Assistant",{"type":17,"tag":6154,"props":268839,"children":268840},{},[268841,268857,268867,268877,268887,268901],{"type":17,"tag":84,"props":268842,"children":268843},{},[268844,268848,268850,268855],{"type":17,"tag":48,"props":268845,"children":268846},{},[268847],{"type":23,"value":251948},{"type":23,"value":268849}," — The customer authorizes CRM, messaging, calendar, and GenAI providers via Unified Connect. Each returns a ",{"type":17,"tag":6121,"props":268851,"children":268853},{"className":268852},[],[268854],{"type":23,"value":25037},{"type":23,"value":268856}," for secure, real-time access.",{"type":17,"tag":84,"props":268858,"children":268859},{},[268860,268865],{"type":17,"tag":48,"props":268861,"children":268862},{},[268863],{"type":23,"value":268864},"Ingest Context",{"type":23,"value":268866}," — Unified fetches recent CRM records, messages, and conversation history so the assistant has complete context before replying.",{"type":17,"tag":84,"props":268868,"children":268869},{},[268870,268875],{"type":17,"tag":48,"props":268871,"children":268872},{},[268873],{"type":23,"value":268874},"Engage",{"type":23,"value":268876}," — The AI assistant responds natively via connected messaging channels (email, Slack, Teams), referencing CRM and enrichment data as needed.",{"type":17,"tag":84,"props":268878,"children":268879},{},[268880,268885],{"type":17,"tag":48,"props":268881,"children":268882},{},[268883],{"type":23,"value":268884},"Sync Results",{"type":23,"value":268886}," — Unified writes summaries, action items, and next steps back to the CRM as Notes, Tasks, or Events — optionally creating or advancing Deals.",{"type":17,"tag":84,"props":268888,"children":268889},{},[268890,268894,268896,268900],{"type":17,"tag":48,"props":268891,"children":268892},{},[268893],{"type":23,"value":145569},{"type":23,"value":268895}," — The assistant offers calendar slots, creates events, and sends meeting invites using Unified's ",{"type":17,"tag":133,"props":268897,"children":268898},{"href":13708},[268899],{"type":23,"value":98258},{"type":23,"value":54},{"type":17,"tag":84,"props":268902,"children":268903},{},[268904,268909,268911,268915],{"type":17,"tag":48,"props":268905,"children":268906},{},[268907],{"type":23,"value":268908},"Stay Updated",{"type":23,"value":268910}," — Unified's ",{"type":17,"tag":133,"props":268912,"children":268913},{"href":4999},[268914],{"type":23,"value":5002},{"type":23,"value":268916}," keep CRM and messaging state in sync, ensuring conversations, deals, and follow-ups are always current.",{"type":17,"tag":29,"props":268918,"children":268919},{},[268920],{"type":23,"value":268921},"This flow creates a continuous loop between customer communication, CRM data, and AI reasoning — all managed through a single integration layer.",{"type":17,"tag":239,"props":268923,"children":268924},{"id":268424},[268925],{"type":23,"value":268427},{"type":17,"tag":29,"props":268927,"children":268928},{},[268929],{"type":23,"value":268930},"For PMs and engineers building conversational sales or GTM automation tools:",{"type":17,"tag":80,"props":268932,"children":268933},{},[268934,268944,268954,268964],{"type":17,"tag":84,"props":268935,"children":268936},{},[268937,268942],{"type":17,"tag":48,"props":268938,"children":268939},{},[268940],{"type":23,"value":268941},"Build once, connect everywhere",{"type":23,"value":268943}," — one API handles CRM, messaging, calendar, and AI.",{"type":17,"tag":84,"props":268945,"children":268946},{},[268947,268952],{"type":17,"tag":48,"props":268948,"children":268949},{},[268950],{"type":23,"value":268951},"Consistent data model",{"type":23,"value":268953}," — normalized schemas simplify logic for deals, messages, and follow-ups.",{"type":17,"tag":84,"props":268955,"children":268956},{},[268957,268962],{"type":17,"tag":48,"props":268958,"children":268959},{},[268960],{"type":23,"value":268961},"Real-time sync",{"type":23,"value":268963}," — webhook-driven updates keep CRM records and AI context current.",{"type":17,"tag":84,"props":268965,"children":268966},{},[268967,268972],{"type":17,"tag":48,"props":268968,"children":268969},{},[268970],{"type":23,"value":268971},"AI-ready foundation",{"type":23,"value":268973}," — plug in any GenAI model through Unified GenAI without re-architecting.",{"type":17,"tag":29,"props":268975,"children":268976},{},[268977],{"type":23,"value":268978},"Deliver AI sales experiences that qualify, engage, and convert — powered by live data, not static syncs.",{"type":17,"tag":29,"props":268980,"children":268981},{},[268982,268990,268991,268999],{"type":17,"tag":133,"props":268983,"children":268985},{"href":158861,"rel":268984},[214],[268986],{"type":17,"tag":48,"props":268987,"children":268988},{},[268989],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":268992,"children":268994},{"href":1623,"rel":268993},[214],[268995],{"type":17,"tag":48,"props":268996,"children":268997},{},[268998],{"type":23,"value":226481},{"type":23,"value":269000}," to see how Unified.to accelerates AI-driven sales development.",{"title":7,"searchDepth":1629,"depth":1629,"links":269002},[269003,269004,269005,269006,269007],{"id":268548,"depth":1635,"text":268551},{"id":268033,"depth":1635,"text":268036},{"id":268747,"depth":1635,"text":268750},{"id":268834,"depth":1635,"text":268837},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_build_an_ai_sales_assistant_across_salesforce_hubspot_and_slack_with_a_unified_api.md","blog/how_to_build_an_ai_sales_assistant_across_salesforce_hubspot_and_slack_with_a_unified_api.md","blog/how_to_build_an_ai_sales_assistant_across_salesforce_hubspot_and_slack_with_a_unified_api",{"_path":269012,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":269013,"description":269014,"img":269015,"date":267927,"tag":12,"body":269016,"_type":1677,"_id":269443,"_source":1679,"_file":269444,"_stem":269445,"_extension":1682},"/blog/how_to_build_sales_enrichment_across_salesforce_hubspot_and_38_crms_with_a_unified_api","How to Build Sales Enrichment Across Salesforce, HubSpot, and 38+ CRMs with a Unified API","Sales teams rely on complete, up-to-date information about prospects and customers to prioritize outreach and close deals. But CRM data is often...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_sales_enrichment_across_salesforce_hubspot_and_38_crms_with_a_unified_api-icon.png",{"type":14,"children":269017,"toc":269436},[269018,269023,269026,269033,269038,269057,269063,269072,269105,269109,269190,269202,269208,269316,269322,269327,269348,269357,269361,269366,269409,269414],{"type":17,"tag":18,"props":269019,"children":269021},{"id":269020},"how-to-build-sales-enrichment-across-salesforce-hubspot-and-38-crms-with-a-unified-api",[269022],{"type":23,"value":269013},{"type":17,"tag":25,"props":269024,"children":269025},{},[],{"type":17,"tag":29,"props":269027,"children":269028},{},[269029],{"type":17,"tag":33,"props":269030,"children":269031},{},[269032],{"type":23,"value":267945},{"type":17,"tag":29,"props":269034,"children":269035},{},[269036],{"type":23,"value":269037},"Sales teams rely on complete, up-to-date information about prospects and customers to prioritize outreach and close deals. But CRM data is often incomplete—missing job titles, company info, or social context that helps sellers personalize engagement.",{"type":17,"tag":29,"props":269039,"children":269040},{},[269041,269043,269048,269049,269055],{"type":23,"value":269042},"Unified.to makes enrichment workflows simple. With a single unified ",{"type":17,"tag":133,"props":269044,"children":269046},{"href":107049,"rel":269045},[214],[269047],{"type":23,"value":61565},{"type":23,"value":34435},{"type":17,"tag":133,"props":269050,"children":269053},{"href":269051,"rel":269052},"https://docs.unified.to/enrich/overview",[214],[269054],{"type":23,"value":191093},{"type":23,"value":269056},", your product can read contacts and deals from any connected CRM, append additional attributes from enrichment providers, and push summarized insights back as notes or comments—all in real time, without custom connectors.",{"type":17,"tag":239,"props":269058,"children":269060},{"id":269059},"when-to-use-sales-enrichment",[269061],{"type":23,"value":269062},"When to Use Sales Enrichment",{"type":17,"tag":29,"props":269064,"children":269065},{},[269066,269067,269071],{"type":23,"value":268556},{"type":17,"tag":133,"props":269068,"children":269069},{"href":7691},[269070],{"type":23,"value":7459},{"type":23,"value":233792},{"type":17,"tag":80,"props":269073,"children":269074},{},[269075,269085,269095],{"type":17,"tag":84,"props":269076,"children":269077},{},[269078,269083],{"type":17,"tag":48,"props":269079,"children":269080},{},[269081],{"type":23,"value":269082},"Fill missing fields",{"type":23,"value":269084}," and contextual data for Contacts and related Deals.",{"type":17,"tag":84,"props":269086,"children":269087},{},[269088,269093],{"type":17,"tag":48,"props":269089,"children":269090},{},[269091],{"type":23,"value":269092},"Add demographic signals",{"type":23,"value":269094}," to qualify or route leads automatically.",{"type":17,"tag":84,"props":269096,"children":269097},{},[269098,269103],{"type":17,"tag":48,"props":269099,"children":269100},{},[269101],{"type":23,"value":269102},"Write back summarized enrichment notes",{"type":23,"value":269104}," directly into the CRM for seller visibility.",{"type":17,"tag":239,"props":269106,"children":269107},{"id":108404},[269108],{"type":23,"value":108407},{"type":17,"tag":7231,"props":269110,"children":269111},{},[269112,269126],{"type":17,"tag":7235,"props":269113,"children":269114},{},[269115],{"type":17,"tag":7239,"props":269116,"children":269117},{},[269118,269122],{"type":17,"tag":7243,"props":269119,"children":269120},{},[269121],{"type":23,"value":18594},{"type":17,"tag":7243,"props":269123,"children":269124},{},[269125],{"type":23,"value":20787},{"type":17,"tag":7259,"props":269127,"children":269128},{},[269129,269144,269159,269174],{"type":17,"tag":7239,"props":269130,"children":269131},{},[269132,269139],{"type":17,"tag":7266,"props":269133,"children":269134},{},[269135],{"type":17,"tag":48,"props":269136,"children":269137},{},[269138],{"type":23,"value":25828},{"type":17,"tag":7266,"props":269140,"children":269141},{},[269142],{"type":23,"value":269143},"Person record to enrich and read.",{"type":17,"tag":7239,"props":269145,"children":269146},{},[269147,269154],{"type":17,"tag":7266,"props":269148,"children":269149},{},[269150],{"type":17,"tag":48,"props":269151,"children":269152},{},[269153],{"type":23,"value":25810},{"type":17,"tag":7266,"props":269155,"children":269156},{},[269157],{"type":23,"value":269158},"Associated opportunity to enrich or update.",{"type":17,"tag":7239,"props":269160,"children":269161},{},[269162,269169],{"type":17,"tag":7266,"props":269163,"children":269164},{},[269165],{"type":17,"tag":48,"props":269166,"children":269167},{},[269168],{"type":23,"value":268719},{"type":17,"tag":7266,"props":269170,"children":269171},{},[269172],{"type":23,"value":269173},"Appended data for a person or company, with normalized attributes and confidence scores.",{"type":17,"tag":7239,"props":269175,"children":269176},{},[269177,269185],{"type":17,"tag":7266,"props":269178,"children":269179},{},[269180],{"type":17,"tag":48,"props":269181,"children":269182},{},[269183],{"type":23,"value":269184},"Note / Comment",{"type":17,"tag":7266,"props":269186,"children":269187},{},[269188],{"type":23,"value":269189},"Write-back insights or summaries to CRM records.",{"type":17,"tag":29,"props":269191,"children":269192},{},[269193,269195,269201],{"type":23,"value":269194},"All objects follow Unified's normalized CRM schema, so enrichment data is structured consistently across Salesforce, HubSpot, Pipedrive, Zoho, and ",{"type":17,"tag":133,"props":269196,"children":269198},{"href":76501,"rel":269197},[214],[269199],{"type":23,"value":269200},"38+ other CRMs",{"type":23,"value":54},{"type":17,"tag":239,"props":269203,"children":269205},{"id":269204},"data-flow-for-sales-enrichment",[269206],{"type":23,"value":269207},"Data Flow for Sales Enrichment",{"type":17,"tag":6154,"props":269209,"children":269210},{},[269211,269235,269268,269285,269306],{"type":17,"tag":84,"props":269212,"children":269213},{},[269214,269218,269220,269225,269227,269233],{"type":17,"tag":48,"props":269215,"children":269216},{},[269217],{"type":23,"value":267431},{"type":23,"value":269219}," Fetch the target ",{"type":17,"tag":6121,"props":269221,"children":269223},{"className":269222},[],[269224],{"type":23,"value":43625},{"type":23,"value":269226}," (and optionally its associated ",{"type":17,"tag":6121,"props":269228,"children":269230},{"className":269229},[],[269231],{"type":23,"value":269232},"deal(s)",{"type":23,"value":269234},") from the customer's CRM.",{"type":17,"tag":84,"props":269236,"children":269237},{},[269238,269243,269245,269252,269254,269259,269261,269266],{"type":17,"tag":48,"props":269239,"children":269240},{},[269241],{"type":23,"value":269242},"Enrich:",{"type":23,"value":269244}," Call Unified's ",{"type":17,"tag":48,"props":269246,"children":269247},{},[269248],{"type":17,"tag":133,"props":269249,"children":269250},{"href":49533},[269251],{"type":23,"value":191093},{"type":23,"value":269253}," with identifiers—like ",{"type":17,"tag":6121,"props":269255,"children":269257},{"className":269256},[],[269258],{"type":23,"value":62666},{"type":23,"value":269260}," for individuals or ",{"type":17,"tag":6121,"props":269262,"children":269264},{"className":269263},[],[269265],{"type":23,"value":50774},{"type":23,"value":269267}," for companies—to retrieve standardized attributes and a confidence score.",{"type":17,"tag":84,"props":269269,"children":269270},{},[269271,269276,269278,269283],{"type":17,"tag":48,"props":269272,"children":269273},{},[269274],{"type":23,"value":269275},"Summarize:",{"type":23,"value":269277}," Generate a concise ",{"type":17,"tag":33,"props":269279,"children":269280},{},[269281],{"type":23,"value":269282},"Enrichment Summary",{"type":23,"value":269284}," (e.g., job title, seniority, company size, social presence, key intent signals).",{"type":17,"tag":84,"props":269286,"children":269287},{},[269288,269293,269295,269299,269300,269304],{"type":17,"tag":48,"props":269289,"children":269290},{},[269291],{"type":23,"value":269292},"Write-back:",{"type":23,"value":269294}," Create a CRM ",{"type":17,"tag":48,"props":269296,"children":269297},{},[269298],{"type":23,"value":150919},{"type":23,"value":75890},{"type":17,"tag":48,"props":269301,"children":269302},{},[269303],{"type":23,"value":13370},{"type":23,"value":269305}," attached to the relevant contact or deal, containing the enrichment summary and citations.",{"type":17,"tag":84,"props":269307,"children":269308},{},[269309,269314],{"type":17,"tag":48,"props":269310,"children":269311},{},[269312],{"type":23,"value":269313},"Monitor:",{"type":23,"value":269315}," Optionally re-run enrichment based on field changes, record updates, or a defined schedule—skipping low-confidence matches to avoid noise.",{"type":17,"tag":239,"props":269317,"children":269319},{"id":269318},"supported-integrations",[269320],{"type":23,"value":269321},"Supported Integrations",{"type":17,"tag":29,"props":269323,"children":269324},{},[269325],{"type":23,"value":269326},"Unified.to connects enrichment and CRM data in one workflow:",{"type":17,"tag":80,"props":269328,"children":269329},{},[269330,269339],{"type":17,"tag":84,"props":269331,"children":269332},{},[269333,269337],{"type":17,"tag":48,"props":269334,"children":269335},{},[269336],{"type":23,"value":25731},{"type":23,"value":269338}," — Salesforce, HubSpot, Pipedrive, Zoho CRM, Close.io, Copper, Insightly, and more.",{"type":17,"tag":84,"props":269340,"children":269341},{},[269342,269346],{"type":17,"tag":48,"props":269343,"children":269344},{},[269345],{"type":23,"value":191262},{"type":23,"value":269347}," — Apollo.io, Clearbit, People Data Labs, RocketReach, ZoomInfo, Lusha, and others.",{"type":17,"tag":29,"props":269349,"children":269350},{},[269351],{"type":17,"tag":133,"props":269352,"children":269354},{"href":87026,"rel":269353},[214],[269355],{"type":23,"value":269356},"See the full list of supported integrations",{"type":17,"tag":239,"props":269358,"children":269359},{"id":268424},[269360],{"type":23,"value":268427},{"type":17,"tag":29,"props":269362,"children":269363},{},[269364],{"type":23,"value":269365},"For PMs and engineers building sales tools or GTM automation products:",{"type":17,"tag":80,"props":269367,"children":269368},{},[269369,269379,269389,269399],{"type":17,"tag":84,"props":269370,"children":269371},{},[269372,269377],{"type":17,"tag":48,"props":269373,"children":269374},{},[269375],{"type":23,"value":269376},"One API, 38+ CRMs",{"type":23,"value":269378}," — no per-vendor mapping or token handling.",{"type":17,"tag":84,"props":269380,"children":269381},{},[269382,269387],{"type":17,"tag":48,"props":269383,"children":269384},{},[269385],{"type":23,"value":269386},"Unified enrichment model",{"type":23,"value":269388}," — normalized attributes with confidence scoring.",{"type":17,"tag":84,"props":269390,"children":269391},{},[269392,269397],{"type":17,"tag":48,"props":269393,"children":269394},{},[269395],{"type":23,"value":269396},"Two-way sync",{"type":23,"value":269398}," — read from any CRM and write insights back in real time.",{"type":17,"tag":84,"props":269400,"children":269401},{},[269402,269407],{"type":17,"tag":48,"props":269403,"children":269404},{},[269405],{"type":23,"value":269406},"Zero maintenance",{"type":23,"value":269408}," — Unified handles retries, schema changes, and data normalization.",{"type":17,"tag":29,"props":269410,"children":269411},{},[269412],{"type":23,"value":269413},"Launch enrichment workflows across every major CRM and enrichment provider in days, not months.",{"type":17,"tag":29,"props":269415,"children":269416},{},[269417,269425,269426,269434],{"type":17,"tag":133,"props":269418,"children":269420},{"href":158861,"rel":269419},[214],[269421],{"type":17,"tag":48,"props":269422,"children":269423},{},[269424],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":269427,"children":269429},{"href":1623,"rel":269428},[214],[269430],{"type":17,"tag":48,"props":269431,"children":269432},{},[269433],{"type":23,"value":226481},{"type":23,"value":269435}," to see how Unified.to powers smarter sales data.",{"title":7,"searchDepth":1629,"depth":1629,"links":269437},[269438,269439,269440,269441,269442],{"id":269059,"depth":1635,"text":269062},{"id":108404,"depth":1635,"text":108407},{"id":269204,"depth":1635,"text":269207},{"id":269318,"depth":1635,"text":269321},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_build_sales_enrichment_across_salesforce_hubspot_and_38_crms_with_a_unified_api.md","blog/how_to_build_sales_enrichment_across_salesforce_hubspot_and_38_crms_with_a_unified_api.md","blog/how_to_build_sales_enrichment_across_salesforce_hubspot_and_38_crms_with_a_unified_api",{"_path":269447,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":269448,"description":269449,"img":269450,"date":267927,"tag":12,"body":269451,"_type":1677,"_id":269989,"_source":1679,"_file":269990,"_stem":269991,"_extension":1682},"/blog/how_to_manage_documents_and_contracts_across_google_drive_box_dropbox_and_s3_with_a_unified_api","How to Manage Documents and Contracts Across Google Drive, Box, Dropbox, and S3 with a Unified API","Most SaaS products rely on documents and contracts that live across multiple storage providers — Google Drive, Dropbox, OneDrive, Box, or S3. Managing these...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_manage_documents_and_contracts_across_google_drive_box_dropbox_and_s3_with_a_unified_api-icon.png",{"type":14,"children":269452,"toc":269981},[269453,269458,269461,269468,269473,269490,269495,269501,269505,269553,269559,269564,269694,269699,269704,269715,269739,269751,269757,269762,269825,269830,269836,269841,269894,269899,269907,269911,269916,269954,269959],{"type":17,"tag":18,"props":269454,"children":269456},{"id":269455},"how-to-manage-documents-and-contracts-across-google-drive-box-dropbox-and-s3-with-a-unified-api",[269457],{"type":23,"value":269448},{"type":17,"tag":25,"props":269459,"children":269460},{},[],{"type":17,"tag":29,"props":269462,"children":269463},{},[269464],{"type":17,"tag":33,"props":269465,"children":269466},{},[269467],{"type":23,"value":267945},{"type":17,"tag":29,"props":269469,"children":269470},{},[269471],{"type":23,"value":269472},"Most SaaS products rely on documents and contracts that live across multiple storage providers — Google Drive, Dropbox, OneDrive, Box, or S3. Managing these files consistently is difficult when every system has its own schema, authentication model, and permissions logic.",{"type":17,"tag":29,"props":269474,"children":269475},{},[269476,269478,269482,269484,269488],{"type":23,"value":269477},"Unified.to simplifies file and contract management through a single ",{"type":17,"tag":133,"props":269479,"children":269480},{"href":7691},[269481],{"type":23,"value":7459},{"type":23,"value":269483},". This same architecture enables ",{"type":17,"tag":133,"props":269485,"children":269486},{"href":77021},[269487],{"type":23,"value":77024},{"type":23,"value":269489}," (RAG), where documents are indexed and retrieved at query time to ground AI responses in real contract and file content.",{"type":17,"tag":29,"props":269491,"children":269492},{},[269493],{"type":23,"value":269494},"Your product can list, read, download, update, and replace documents across 25+ storage systems — without building or maintaining custom integrations for each vendor.",{"type":17,"tag":239,"props":269496,"children":269498},{"id":269497},"when-to-use-docs-contracts-management",[269499],{"type":23,"value":269500},"When to Use Docs & Contracts Management",{"type":17,"tag":29,"props":269502,"children":269503},{},[269504],{"type":23,"value":254154},{"type":17,"tag":80,"props":269506,"children":269507},{},[269508,269518,269528,269538,269548],{"type":17,"tag":84,"props":269509,"children":269510},{},[269511,269516],{"type":17,"tag":48,"props":269512,"children":269513},{},[269514],{"type":23,"value":269515},"Centralize access",{"type":23,"value":269517}," to documents and contracts from multiple storage systems.",{"type":17,"tag":84,"props":269519,"children":269520},{},[269521,269526],{"type":17,"tag":48,"props":269522,"children":269523},{},[269524],{"type":23,"value":269525},"Retrieve files and metadata",{"type":23,"value":269527}," for review, processing, or AI pipelines.",{"type":17,"tag":84,"props":269529,"children":269530},{},[269531,269536],{"type":17,"tag":48,"props":269532,"children":269533},{},[269534],{"type":23,"value":269535},"Update or replace files",{"type":23,"value":269537}," while preserving links, permissions, and audit metadata.",{"type":17,"tag":84,"props":269539,"children":269540},{},[269541,269546],{"type":17,"tag":48,"props":269542,"children":269543},{},[269544],{"type":23,"value":269545},"Sync downstream systems",{"type":23,"value":269547}," automatically when files are created, modified, or replaced.",{"type":17,"tag":84,"props":269549,"children":269550},{},[269551],{"type":23,"value":269552},"Power RAG-based contract search, clause extraction, and AI-driven Q&A across storage providers.",{"type":17,"tag":239,"props":269554,"children":269556},{"id":269555},"normalized-file-object",[269557],{"type":23,"value":269558},"Normalized File Object",{"type":17,"tag":29,"props":269560,"children":269561},{},[269562],{"type":23,"value":269563},"Unified.to provides a consistent schema for managing files across providers, based on the Unified File model:",{"type":17,"tag":7231,"props":269565,"children":269566},{},[269567,269585],{"type":17,"tag":7235,"props":269568,"children":269569},{},[269570],{"type":17,"tag":7239,"props":269571,"children":269572},{},[269573,269577,269581],{"type":17,"tag":7243,"props":269574,"children":269575},{},[269576],{"type":23,"value":18594},{"type":17,"tag":7243,"props":269578,"children":269579},{},[269580],{"type":23,"value":24525},{"type":17,"tag":7243,"props":269582,"children":269583},{},[269584],{"type":23,"value":22096},{"type":17,"tag":7259,"props":269586,"children":269587},{},[269588],{"type":17,"tag":7239,"props":269589,"children":269590},{},[269591,269603,269608],{"type":17,"tag":7266,"props":269592,"children":269593},{},[269594],{"type":17,"tag":48,"props":269595,"children":269596},{},[269597],{"type":17,"tag":6121,"props":269598,"children":269600},{"className":269599},[],[269601],{"type":23,"value":269602},"file",{"type":17,"tag":7266,"props":269604,"children":269605},{},[269606],{"type":23,"value":269607},"A stored document or contract item",{"type":17,"tag":7266,"props":269609,"children":269610},{},[269611,269616,269617,269622,269623,269628,269629,269634,269635,269640,269641,269646,269647,269652,269653,269658,269659,269664,269665,269670,269671,269676,269677,269682,269683,269688,269689],{"type":17,"tag":6121,"props":269612,"children":269614},{"className":269613},[],[269615],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269618,"children":269620},{"className":269619},[],[269621],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269624,"children":269626},{"className":269625},[],[269627],{"type":23,"value":25337},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269630,"children":269632},{"className":269631},[],[269633],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269636,"children":269638},{"className":269637},[],[269639],{"type":23,"value":24679},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269642,"children":269644},{"className":269643},[],[269645],{"type":23,"value":15863},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269648,"children":269650},{"className":269649},[],[269651],{"type":23,"value":62582},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269654,"children":269656},{"className":269655},[],[269657],{"type":23,"value":20181},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269660,"children":269662},{"className":269661},[],[269663],{"type":23,"value":72581},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269666,"children":269668},{"className":269667},[],[269669],{"type":23,"value":24204},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269672,"children":269674},{"className":269673},[],[269675],{"type":23,"value":24978},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269678,"children":269680},{"className":269679},[],[269681],{"type":23,"value":143728},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269684,"children":269686},{"className":269685},[],[269687],{"type":23,"value":72684},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269690,"children":269692},{"className":269691},[],[269693],{"type":23,"value":12107},{"type":17,"tag":29,"props":269695,"children":269696},{},[269697],{"type":23,"value":269698},"This model supports both structured document storage (e.g., Drive, Box) and object-based storage (e.g., S3), with optional passthrough for provider-specific metadata.",{"type":17,"tag":239,"props":269700,"children":269701},{"id":241569},[269702],{"type":23,"value":269703},"Supported Providers",{"type":17,"tag":29,"props":269705,"children":269706},{},[269707,269709,269714],{"type":23,"value":269708},"Unified.to integrates with major storage systems, covering ",{"type":17,"tag":48,"props":269710,"children":269711},{},[269712],{"type":23,"value":269713},"25+ file and content management platforms",{"type":23,"value":109313},{"type":17,"tag":80,"props":269716,"children":269717},{},[269718,269722,269727,269731,269735],{"type":17,"tag":84,"props":269719,"children":269720},{},[269721],{"type":23,"value":28907},{"type":17,"tag":84,"props":269723,"children":269724},{},[269725],{"type":23,"value":269726},"Microsoft OneDrive / SharePoint",{"type":17,"tag":84,"props":269728,"children":269729},{},[269730],{"type":23,"value":28915},{"type":17,"tag":84,"props":269732,"children":269733},{},[269734],{"type":23,"value":28931},{"type":17,"tag":84,"props":269736,"children":269737},{},[269738],{"type":23,"value":28939},{"type":17,"tag":29,"props":269740,"children":269741},{},[269742,269744,269750],{"type":23,"value":269743},"See the full list of ",{"type":17,"tag":133,"props":269745,"children":269747},{"href":29953,"rel":269746},[214],[269748],{"type":23,"value":269749},"supported File Storage integrations",{"type":23,"value":54},{"type":17,"tag":239,"props":269752,"children":269754},{"id":269753},"data-flow-for-document-contract-management",[269755],{"type":23,"value":269756},"Data Flow for Document & Contract Management",{"type":17,"tag":29,"props":269758,"children":269759},{},[269760],{"type":23,"value":269761},"The flow for managing files across providers is consistent and secure:",{"type":17,"tag":6154,"props":269763,"children":269764},{},[269765,269780,269789,269805,269815],{"type":17,"tag":84,"props":269766,"children":269767},{},[269768,269772,269774,269779],{"type":17,"tag":48,"props":269769,"children":269770},{},[269771],{"type":23,"value":251948},{"type":23,"value":269773}," — The customer authorizes their storage provider through Unified Connect, returning a secure ",{"type":17,"tag":6121,"props":269775,"children":269777},{"className":269776},[],[269778],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":84,"props":269781,"children":269782},{},[269783,269787],{"type":17,"tag":48,"props":269784,"children":269785},{},[269786],{"type":23,"value":145784},{"type":23,"value":269788}," — Retrieve documents, folders, and metadata from the connected source.",{"type":17,"tag":84,"props":269790,"children":269791},{},[269792,269797,269799,269804],{"type":17,"tag":48,"props":269793,"children":269794},{},[269795],{"type":23,"value":269796},"Read or Download",{"type":23,"value":269798}," — Fetch files for review, AI processing, or compliance workflows using the normalized ",{"type":17,"tag":6121,"props":269800,"children":269802},{"className":269801},[],[269803],{"type":23,"value":24978},{"type":23,"value":54},{"type":17,"tag":84,"props":269806,"children":269807},{},[269808,269813],{"type":17,"tag":48,"props":269809,"children":269810},{},[269811],{"type":23,"value":269812},"Update or Replace",{"type":23,"value":269814}," — Push new versions of files while maintaining consistent references and metadata.",{"type":17,"tag":84,"props":269816,"children":269817},{},[269818,269823],{"type":17,"tag":48,"props":269819,"children":269820},{},[269821],{"type":23,"value":269822},"Monitor Changes",{"type":23,"value":269824}," — Subscribe to Unified's native or virtual webhooks to detect file edits, replacements, or permission updates in real time.",{"type":17,"tag":29,"props":269826,"children":269827},{},[269828],{"type":23,"value":269829},"With Unified's unified schema and real-time delivery, your product can manage contracts and documents seamlessly — regardless of where they're stored.",{"type":17,"tag":239,"props":269831,"children":269833},{"id":269832},"extending-document-management-into-a-rag-pipeline",[269834],{"type":23,"value":269835},"Extending Document Management into a RAG Pipeline",{"type":17,"tag":29,"props":269837,"children":269838},{},[269839],{"type":23,"value":269840},"To build semantic contract search or AI Q&A:",{"type":17,"tag":6154,"props":269842,"children":269843},{},[269844,269849,269860,269865,269889],{"type":17,"tag":84,"props":269845,"children":269846},{},[269847],{"type":23,"value":269848},"Subscribe to file create and update webhooks.",{"type":17,"tag":84,"props":269850,"children":269851},{},[269852,269854,269859],{"type":23,"value":269853},"Fetch document content using the normalized ",{"type":17,"tag":6121,"props":269855,"children":269857},{"className":269856},[],[269858],{"type":23,"value":24978},{"type":23,"value":54},{"type":17,"tag":84,"props":269861,"children":269862},{},[269863],{"type":23,"value":269864},"Chunk large documents and generate embeddings.",{"type":17,"tag":84,"props":269866,"children":269867},{},[269868,269869,269874,269875,269881,269882,269887],{"type":23,"value":233739},{"type":17,"tag":6121,"props":269870,"children":269872},{"className":269871},[],[269873],{"type":23,"value":25037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":269876,"children":269878},{"className":269877},[],[269879],{"type":23,"value":269880},"file_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":269883,"children":269885},{"className":269884},[],[269886],{"type":23,"value":25337},{"type":23,"value":269888},", and optional permission metadata.",{"type":17,"tag":84,"props":269890,"children":269891},{},[269892],{"type":23,"value":269893},"On user query, retrieve the top matching document segments before generating an answer. Unified Use Case RAG Pipelines",{"type":17,"tag":29,"props":269895,"children":269896},{},[269897],{"type":23,"value":269898},"Unified handles ingestion and real-time updates across 25+ storage platforms; embeddings and vector storage remain in your infrastructure.",{"type":17,"tag":29,"props":269900,"children":269901},{},[269902],{"type":17,"tag":33,"props":269903,"children":269904},{},[269905],{"type":23,"value":269906},"Note: File objects include explicit permissions metadata, which can be used to filter retrieval results by user or group access when building enterprise RAG experiences.",{"type":17,"tag":239,"props":269908,"children":269909},{"id":268424},[269910],{"type":23,"value":268427},{"type":17,"tag":29,"props":269912,"children":269913},{},[269914],{"type":23,"value":269915},"For PMs and engineers building document-driven or AI-powered products:",{"type":17,"tag":80,"props":269917,"children":269918},{},[269919,269929,269934,269939,269949],{"type":17,"tag":84,"props":269920,"children":269921},{},[269922,269927],{"type":17,"tag":48,"props":269923,"children":269924},{},[269925],{"type":23,"value":269926},"One API, 350+ integrations",{"type":23,"value":269928}," — consistent CRUD and webhook behavior across storage systems.",{"type":17,"tag":84,"props":269930,"children":269931},{},[269932],{"type":23,"value":269933},"Real-time sync — keep your RAG index aligned with document edits and version changes.",{"type":17,"tag":84,"props":269935,"children":269936},{},[269937],{"type":23,"value":269938},"Secure by design — no cached or stored customer data; every request fetches live content.",{"type":17,"tag":84,"props":269940,"children":269941},{},[269942,269947],{"type":17,"tag":48,"props":269943,"children":269944},{},[269945],{"type":23,"value":269946},"Extensible",{"type":23,"value":269948}," — passthrough metadata and permissions for provider-specific workflows.",{"type":17,"tag":84,"props":269950,"children":269951},{},[269952],{"type":23,"value":269953},"Store embeddings and vector indexes in your own infrastructure.",{"type":17,"tag":29,"props":269955,"children":269956},{},[269957],{"type":23,"value":269958},"Centralize document and contract management across every provider with a single integration.",{"type":17,"tag":29,"props":269960,"children":269961},{},[269962,269970,269971,269979],{"type":17,"tag":133,"props":269963,"children":269965},{"href":158861,"rel":269964},[214],[269966],{"type":17,"tag":48,"props":269967,"children":269968},{},[269969],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":269972,"children":269974},{"href":1623,"rel":269973},[214],[269975],{"type":17,"tag":48,"props":269976,"children":269977},{},[269978],{"type":23,"value":226481},{"type":23,"value":269980}," to see how Unified.to can simplify your file workflows.",{"title":7,"searchDepth":1629,"depth":1629,"links":269982},[269983,269984,269985,269986,269987,269988],{"id":269497,"depth":1635,"text":269500},{"id":269555,"depth":1635,"text":269558},{"id":241569,"depth":1635,"text":269703},{"id":269753,"depth":1635,"text":269756},{"id":269832,"depth":1635,"text":269835},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_manage_documents_and_contracts_across_google_drive_box_dropbox_and_s3_with_a_unified_api.md","blog/how_to_manage_documents_and_contracts_across_google_drive_box_dropbox_and_s3_with_a_unified_api.md","blog/how_to_manage_documents_and_contracts_across_google_drive_box_dropbox_and_s3_with_a_unified_api",{"_path":269993,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":269994,"description":269995,"img":269996,"date":267927,"tag":12,"body":269997,"_type":1677,"_id":270449,"_source":1679,"_file":270450,"_stem":270451,"_extension":1682},"/blog/how_to_pull_crm_data_from_salesforce_hubspot_and_38_platforms_with_a_unified_api","How to Pull CRM Data from Salesforce, HubSpot, and 38+ Platforms with a Unified API","Customer data powers every SaaS product — from dashboards to AI copilots. But CRM systems each use different schemas, authentication models, and rate limits....","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_pull_crm_data_from_salesforce_hubspot_and_38_platforms_with_a_unified_api-icon.png",{"type":14,"children":269998,"toc":270442},[269999,270004,270007,270014,270025,270044,270050,270054,270102,270106,270118,270264,270269,270275,270280,270291,270297,270365,270370,270374,270415,270420],{"type":17,"tag":18,"props":270000,"children":270002},{"id":270001},"how-to-pull-crm-data-from-salesforce-hubspot-and-38-platforms-with-a-unified-api",[270003],{"type":23,"value":269994},{"type":17,"tag":25,"props":270005,"children":270006},{},[],{"type":17,"tag":29,"props":270008,"children":270009},{},[270010],{"type":17,"tag":33,"props":270011,"children":270012},{},[270013],{"type":23,"value":267945},{"type":17,"tag":29,"props":270015,"children":270016},{},[270017,270019,270023],{"type":23,"value":270018},"Customer data powers every SaaS product — from dashboards to AI copilots. But CRM systems each use different schemas, authentication models, and ",{"type":17,"tag":133,"props":270020,"children":270021},{"href":135},[270022],{"type":23,"value":138},{"type":23,"value":270024},". Building and maintaining connectors for Salesforce, HubSpot, and dozens of others slows teams down and fragments data pipelines.",{"type":17,"tag":29,"props":270026,"children":270027},{},[270028,270030,270036,270038,270042],{"type":23,"value":270029},"Unified.to makes it simple to fetch normalized ",{"type":17,"tag":133,"props":270031,"children":270033},{"href":76501,"rel":270032},[214],[270034],{"type":23,"value":270035},"CRM data across 38+ platforms",{"type":23,"value":270037}," through one ",{"type":17,"tag":133,"props":270039,"children":270040},{"href":7691},[270041],{"type":23,"value":7459},{"type":23,"value":270043},". Your product can power analytics, insights, and AI workflows using live CRM context — without writing vendor-specific code or managing sync logic.",{"type":17,"tag":239,"props":270045,"children":270047},{"id":270046},"when-to-use-crm-data-sync",[270048],{"type":23,"value":270049},"When to Use CRM Data Sync",{"type":17,"tag":29,"props":270051,"children":270052},{},[270053],{"type":23,"value":254154},{"type":17,"tag":80,"props":270055,"children":270056},{},[270057,270067,270082,270092],{"type":17,"tag":84,"props":270058,"children":270059},{},[270060,270065],{"type":17,"tag":48,"props":270061,"children":270062},{},[270063],{"type":23,"value":270064},"Build customer 360 dashboards",{"type":23,"value":270066}," that unify accounts, contacts, deals, and activities.",{"type":17,"tag":84,"props":270068,"children":270069},{},[270070,270075,270076,270080],{"type":17,"tag":48,"props":270071,"children":270072},{},[270073],{"type":23,"value":270074},"Feed AI pipelines",{"type":23,"value":44573},{"type":17,"tag":133,"props":270077,"children":270078},{"href":5201},[270079],{"type":23,"value":5204},{"type":23,"value":270081},", scoring, summarization) with current CRM context.",{"type":17,"tag":84,"props":270083,"children":270084},{},[270085,270090],{"type":17,"tag":48,"props":270086,"children":270087},{},[270088],{"type":23,"value":270089},"Generate operational insights",{"type":23,"value":270091}," like pipeline health, attribution, and engagement analytics.",{"type":17,"tag":84,"props":270093,"children":270094},{},[270095,270100],{"type":17,"tag":48,"props":270096,"children":270097},{},[270098],{"type":23,"value":270099},"Backup and archive",{"type":23,"value":270101}," CRM data directly into your warehouse or object storage.",{"type":17,"tag":239,"props":270103,"children":270104},{"id":268033},[270105],{"type":23,"value":268036},{"type":17,"tag":29,"props":270107,"children":270108},{},[270109,270110,270116],{"type":23,"value":266912},{"type":17,"tag":133,"props":270111,"children":270113},{"href":107049,"rel":270112},[214],[270114],{"type":23,"value":270115},"normalizes core CRM entities across 38+ systems",{"type":23,"value":270117},", giving you a consistent data model for analytics and AI:",{"type":17,"tag":7231,"props":270119,"children":270120},{},[270121,270139],{"type":17,"tag":7235,"props":270122,"children":270123},{},[270124],{"type":17,"tag":7239,"props":270125,"children":270126},{},[270127,270131,270135],{"type":17,"tag":7243,"props":270128,"children":270129},{},[270130],{"type":23,"value":18594},{"type":17,"tag":7243,"props":270132,"children":270133},{},[270134],{"type":23,"value":20787},{"type":17,"tag":7243,"props":270136,"children":270137},{},[270138],{"type":23,"value":6701},{"type":17,"tag":7259,"props":270140,"children":270141},{},[270142,270163,270183,270204,270224,270244],{"type":17,"tag":7239,"props":270143,"children":270144},{},[270145,270153,270158],{"type":17,"tag":7266,"props":270146,"children":270147},{},[270148],{"type":17,"tag":48,"props":270149,"children":270150},{},[270151],{"type":23,"value":270152},"Company / Account",{"type":17,"tag":7266,"props":270154,"children":270155},{},[270156],{"type":23,"value":270157},"Customer entity for rollups and health scoring",{"type":17,"tag":7266,"props":270159,"children":270160},{},[270161],{"type":23,"value":270162},"Top-level object for segmentation and reporting.",{"type":17,"tag":7239,"props":270164,"children":270165},{},[270166,270173,270178],{"type":17,"tag":7266,"props":270167,"children":270168},{},[270169],{"type":17,"tag":48,"props":270170,"children":270171},{},[270172],{"type":23,"value":25828},{"type":17,"tag":7266,"props":270174,"children":270175},{},[270176],{"type":23,"value":270177},"Stakeholders and participants",{"type":17,"tag":7266,"props":270179,"children":270180},{},[270181],{"type":23,"value":270182},"Join with company and deal participation.",{"type":17,"tag":7239,"props":270184,"children":270185},{},[270186,270194,270199],{"type":17,"tag":7266,"props":270187,"children":270188},{},[270189],{"type":17,"tag":48,"props":270190,"children":270191},{},[270192],{"type":23,"value":270193},"Deal / Opportunity",{"type":17,"tag":7266,"props":270195,"children":270196},{},[270197],{"type":23,"value":270198},"Pipeline and revenue tracking",{"type":17,"tag":7266,"props":270200,"children":270201},{},[270202],{"type":23,"value":270203},"Includes stages, probability, amounts, and close dates.",{"type":17,"tag":7239,"props":270205,"children":270206},{},[270207,270215,270219],{"type":17,"tag":7266,"props":270208,"children":270209},{},[270210],{"type":17,"tag":48,"props":270211,"children":270212},{},[270213],{"type":23,"value":270214},"Event / Activity",{"type":17,"tag":7266,"props":270216,"children":270217},{},[270218],{"type":23,"value":108747},{"type":17,"tag":7266,"props":270220,"children":270221},{},[270222],{"type":23,"value":270223},"Captures emails, calls, meetings, notes, and tasks.",{"type":17,"tag":7239,"props":270225,"children":270226},{},[270227,270234,270239],{"type":17,"tag":7266,"props":270228,"children":270229},{},[270230],{"type":17,"tag":48,"props":270231,"children":270232},{},[270233],{"type":23,"value":62749},{"type":17,"tag":7266,"props":270235,"children":270236},{},[270237],{"type":23,"value":270238},"Pre-qualified prospects",{"type":17,"tag":7266,"props":270240,"children":270241},{},[270242],{"type":23,"value":270243},"Useful for top-funnel analytics.",{"type":17,"tag":7239,"props":270245,"children":270246},{},[270247,270254,270259],{"type":17,"tag":7266,"props":270248,"children":270249},{},[270250],{"type":17,"tag":48,"props":270251,"children":270252},{},[270253],{"type":23,"value":62847},{"type":17,"tag":7266,"props":270255,"children":270256},{},[270257],{"type":23,"value":270258},"Stages and workflow metadata",{"type":17,"tag":7266,"props":270260,"children":270261},{},[270262],{"type":23,"value":270263},"Used for conversion or velocity analysis.",{"type":17,"tag":29,"props":270265,"children":270266},{},[270267],{"type":23,"value":270268},"Each object includes consistent identifiers, timestamps, and relationships across all CRM integrations, with optional passthrough for raw or custom fields.",{"type":17,"tag":239,"props":270270,"children":270272},{"id":270271},"supported-systems",[270273],{"type":23,"value":270274},"Supported Systems",{"type":17,"tag":29,"props":270276,"children":270277},{},[270278],{"type":23,"value":270279},"Unified.to connects to 38+ CRM platforms, including:",{"type":17,"tag":29,"props":270281,"children":270282},{},[270283,270285,270290],{"type":23,"value":270284},"Salesforce, HubSpot, Pipedrive, Zoho CRM, Microsoft Dynamics 365, Copper, Close, Insightly, and more. See the full list of ",{"type":17,"tag":133,"props":270286,"children":270288},{"href":76501,"rel":270287},[214],[270289],{"type":23,"value":254351},{"type":23,"value":54},{"type":17,"tag":239,"props":270292,"children":270294},{"id":270293},"data-flow-for-crm-data-sync",[270295],{"type":23,"value":270296},"Data Flow for CRM Data Sync",{"type":17,"tag":6154,"props":270298,"children":270299},{},[270300,270315,270325,270335,270345,270355],{"type":17,"tag":84,"props":270301,"children":270302},{},[270303,270307,270309,270314],{"type":17,"tag":48,"props":270304,"children":270305},{},[270306],{"type":23,"value":251948},{"type":23,"value":270308}," — The customer authenticates their CRM via Unified Connect, returning a secure ",{"type":17,"tag":6121,"props":270310,"children":270312},{"className":270311},[],[270313],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":84,"props":270316,"children":270317},{},[270318,270323],{"type":17,"tag":48,"props":270319,"children":270320},{},[270321],{"type":23,"value":270322},"Baseline Backfill",{"type":23,"value":270324}," — Fetch normalized objects (Companies, Contacts, Deals, Events, Leads, Pipelines) to seed your database, index, or data warehouse.",{"type":17,"tag":84,"props":270326,"children":270327},{},[270328,270333],{"type":17,"tag":48,"props":270329,"children":270330},{},[270331],{"type":23,"value":270332},"Incremental Sync",{"type":23,"value":270334}," — Use Unified's webhooks or managed polling to retrieve new or updated records in real time.",{"type":17,"tag":84,"props":270336,"children":270337},{},[270338,270343],{"type":17,"tag":48,"props":270339,"children":270340},{},[270341],{"type":23,"value":270342},"Store or Process",{"type":23,"value":270344}," — Push normalized data into your database, warehouse, or object storage for analysis, RAG pipelines, or archival.",{"type":17,"tag":84,"props":270346,"children":270347},{},[270348,270353],{"type":17,"tag":48,"props":270349,"children":270350},{},[270351],{"type":23,"value":270352},"Build Insights",{"type":23,"value":270354}," — Run analytics for cohorts, win rates, or engagement trends.",{"type":17,"tag":84,"props":270356,"children":270357},{},[270358,270363],{"type":17,"tag":48,"props":270359,"children":270360},{},[270361],{"type":23,"value":270362},"Optional AI Layer",{"type":23,"value":270364}," — Export CRM text fields to your vector index for semantic search or retrieval-augmented generation (RAG) workflows.",{"type":17,"tag":29,"props":270366,"children":270367},{},[270368],{"type":23,"value":270369},"With real-time, normalized data from Unified.to, your product can deliver analytics, dashboards, and AI features that reflect the most current customer state — across every CRM your customers use.",{"type":17,"tag":239,"props":270371,"children":270372},{"id":268424},[270373],{"type":23,"value":268427},{"type":17,"tag":80,"props":270375,"children":270376},{},[270377,270387,270397,270406],{"type":17,"tag":84,"props":270378,"children":270379},{},[270380,270385],{"type":17,"tag":48,"props":270381,"children":270382},{},[270383],{"type":23,"value":270384},"One schema, 38+ CRMs",{"type":23,"value":270386}," — No custom mapping or per-vendor logic.",{"type":17,"tag":84,"props":270388,"children":270389},{},[270390,270395],{"type":17,"tag":48,"props":270391,"children":270392},{},[270393],{"type":23,"value":270394},"Real-time accuracy",{"type":23,"value":270396}," — Webhook-driven updates, never stale snapshots.",{"type":17,"tag":84,"props":270398,"children":270399},{},[270400,270404],{"type":17,"tag":48,"props":270401,"children":270402},{},[270403],{"type":23,"value":69783},{"type":23,"value":270405}," — Unified models integrate directly into RAG, LLM, or analytics pipelines.",{"type":17,"tag":84,"props":270407,"children":270408},{},[270409,270413],{"type":17,"tag":48,"props":270410,"children":270411},{},[270412],{"type":23,"value":269406},{"type":23,"value":270414}," — Unified handles tokens, retries, and API updates behind the scenes.",{"type":17,"tag":29,"props":270416,"children":270417},{},[270418],{"type":23,"value":270419},"Launch analytics, AI, or data backup features that work across every CRM — without building integrations yourself.",{"type":17,"tag":29,"props":270421,"children":270422},{},[270423,270431,270432,270440],{"type":17,"tag":133,"props":270424,"children":270426},{"href":158861,"rel":270425},[214],[270427],{"type":17,"tag":48,"props":270428,"children":270429},{},[270430],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":270433,"children":270435},{"href":1623,"rel":270434},[214],[270436],{"type":17,"tag":48,"props":270437,"children":270438},{},[270439],{"type":23,"value":226481},{"type":23,"value":270441}," to see how Unified.to simplifies CRM data access.",{"title":7,"searchDepth":1629,"depth":1629,"links":270443},[270444,270445,270446,270447,270448],{"id":270046,"depth":1635,"text":270049},{"id":268033,"depth":1635,"text":268036},{"id":270271,"depth":1635,"text":270274},{"id":270293,"depth":1635,"text":270296},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_pull_crm_data_from_salesforce_hubspot_and_38_platforms_with_a_unified_api.md","blog/how_to_pull_crm_data_from_salesforce_hubspot_and_38_platforms_with_a_unified_api.md","blog/how_to_pull_crm_data_from_salesforce_hubspot_and_38_platforms_with_a_unified_api",{"_path":270453,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":270454,"description":270455,"img":270456,"date":267927,"tag":12,"body":270457,"_type":1677,"_id":271024,"_source":1679,"_file":271025,"_stem":271026,"_extension":1682},"/blog/how_to_sync_crm_events_and_timelines_across_salesforce_hubspot_and_30_platforms_with_a_unified_api","How to Sync CRM Events and Timelines Across Salesforce, HubSpot, and 30+ Platforms with a Unified API","Customer activity data lives across dozens of systems — emails, enrichment tools, automations, and meetings — yet the CRM remains the single source of truth...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_sync_crm_events_and_timelines_across_salesforce_hubspot_and_30_platforms_with_a_unified_api-icon.png",{"type":14,"children":270458,"toc":271017},[270459,270464,270467,270474,270479,270493,270499,270508,270551,270555,270560,270685,270690,270696,270848,270854,270924,270929,270933,270938,270990,270995],{"type":17,"tag":18,"props":270460,"children":270462},{"id":270461},"how-to-sync-crm-events-and-timelines-across-salesforce-hubspot-and-30-platforms-with-a-unified-api",[270463],{"type":23,"value":270454},{"type":17,"tag":25,"props":270465,"children":270466},{},[],{"type":17,"tag":29,"props":270468,"children":270469},{},[270470],{"type":17,"tag":33,"props":270471,"children":270472},{},[270473],{"type":23,"value":267945},{"type":17,"tag":29,"props":270475,"children":270476},{},[270477],{"type":23,"value":270478},"Customer activity data lives across dozens of systems — emails, enrichment tools, automations, and meetings — yet the CRM remains the single source of truth for relationships and revenue. The challenge? Every CRM structures events differently, and maintaining per-vendor integrations for activity tracking quickly becomes unmanageable.",{"type":17,"tag":29,"props":270480,"children":270481},{},[270482,270484,270491],{"type":23,"value":270483},"Unified.to simplifies this by providing a ",{"type":17,"tag":133,"props":270485,"children":270488},{"href":270486,"rel":270487},"https://docs.unified.to/calendar/event/model",[214],[270489],{"type":23,"value":270490},"single API to record, read, and analyze CRM timeline events",{"type":23,"value":270492},". You can log outbound emails, enrichment runs, app automations, or third-party triggers — and pull historical activities for analytics, attribution, and deal scoring.",{"type":17,"tag":239,"props":270494,"children":270496},{"id":270495},"when-to-use-unified-for-event-sync",[270497],{"type":23,"value":270498},"When to Use Unified for Event Sync",{"type":17,"tag":29,"props":270500,"children":270501},{},[270502,270503,270507],{"type":23,"value":268556},{"type":17,"tag":133,"props":270504,"children":270505},{"href":7691},[270506],{"type":23,"value":7459},{"type":23,"value":233792},{"type":17,"tag":80,"props":270509,"children":270510},{},[270511,270521,270531,270541],{"type":17,"tag":84,"props":270512,"children":270513},{},[270514,270519],{"type":17,"tag":48,"props":270515,"children":270516},{},[270517],{"type":23,"value":270518},"Create audit trails",{"type":23,"value":270520}," for outbound messages, enrichment actions, and automations.",{"type":17,"tag":84,"props":270522,"children":270523},{},[270524,270529],{"type":17,"tag":48,"props":270525,"children":270526},{},[270527],{"type":23,"value":270528},"Centralize activity",{"type":23,"value":270530}," into CRM timelines for Contacts, Companies, and Deals.",{"type":17,"tag":84,"props":270532,"children":270533},{},[270534,270539],{"type":17,"tag":48,"props":270535,"children":270536},{},[270537],{"type":23,"value":270538},"Pull events",{"type":23,"value":270540}," for insights, attribution, or pipeline health scoring.",{"type":17,"tag":84,"props":270542,"children":270543},{},[270544,270549],{"type":17,"tag":48,"props":270545,"children":270546},{},[270547],{"type":23,"value":270548},"Standardize event ingestion",{"type":23,"value":270550}," across Salesforce, HubSpot, Pipedrive, and 30+ other CRMs.",{"type":17,"tag":239,"props":270552,"children":270553},{"id":268033},[270554],{"type":23,"value":268036},{"type":17,"tag":29,"props":270556,"children":270557},{},[270558],{"type":23,"value":270559},"Unified.to normalizes event and activity data so it's consistent across every CRM platform:",{"type":17,"tag":7231,"props":270561,"children":270562},{},[270563,270581],{"type":17,"tag":7235,"props":270564,"children":270565},{},[270566],{"type":17,"tag":7239,"props":270567,"children":270568},{},[270569,270573,270577],{"type":17,"tag":7243,"props":270570,"children":270571},{},[270572],{"type":23,"value":18594},{"type":17,"tag":7243,"props":270574,"children":270575},{},[270576],{"type":23,"value":20787},{"type":17,"tag":7243,"props":270578,"children":270579},{},[270580],{"type":23,"value":6701},{"type":17,"tag":7259,"props":270582,"children":270583},{},[270584,270604,270624,270644,270664],{"type":17,"tag":7239,"props":270585,"children":270586},{},[270587,270594,270599],{"type":17,"tag":7266,"props":270588,"children":270589},{},[270590],{"type":17,"tag":48,"props":270591,"children":270592},{},[270593],{"type":23,"value":14528},{"type":17,"tag":7266,"props":270595,"children":270596},{},[270597],{"type":23,"value":270598},"Timeline activity (note, meeting, email, call, task, automation)",{"type":17,"tag":7266,"props":270600,"children":270601},{},[270602],{"type":23,"value":270603},"Use standardized event types and link them to related records.",{"type":17,"tag":7239,"props":270605,"children":270606},{},[270607,270614,270619],{"type":17,"tag":7266,"props":270608,"children":270609},{},[270610],{"type":17,"tag":48,"props":270611,"children":270612},{},[270613],{"type":23,"value":25828},{"type":17,"tag":7266,"props":270615,"children":270616},{},[270617],{"type":23,"value":270618},"Person the event concerns",{"type":17,"tag":7266,"props":270620,"children":270621},{},[270622],{"type":23,"value":270623},"Associate via contact ID or email.",{"type":17,"tag":7239,"props":270625,"children":270626},{},[270627,270634,270639],{"type":17,"tag":7266,"props":270628,"children":270629},{},[270630],{"type":17,"tag":48,"props":270631,"children":270632},{},[270633],{"type":23,"value":25846},{"type":17,"tag":7266,"props":270635,"children":270636},{},[270637],{"type":23,"value":270638},"Account the event concerns",{"type":17,"tag":7266,"props":270640,"children":270641},{},[270642],{"type":23,"value":270643},"Associate via account ID or domain.",{"type":17,"tag":7239,"props":270645,"children":270646},{},[270647,270654,270659],{"type":17,"tag":7266,"props":270648,"children":270649},{},[270650],{"type":17,"tag":48,"props":270651,"children":270652},{},[270653],{"type":23,"value":25810},{"type":17,"tag":7266,"props":270655,"children":270656},{},[270657],{"type":23,"value":270658},"Opportunity connected to the event",{"type":17,"tag":7266,"props":270660,"children":270661},{},[270662],{"type":23,"value":270663},"Attribute influence for scoring or forecasting.",{"type":17,"tag":7239,"props":270665,"children":270666},{},[270667,270675,270680],{"type":17,"tag":7266,"props":270668,"children":270669},{},[270670],{"type":17,"tag":48,"props":270671,"children":270672},{},[270673],{"type":23,"value":270674},"Lead (optional)",{"type":17,"tag":7266,"props":270676,"children":270677},{},[270678],{"type":23,"value":270679},"Pre-qualified prospect",{"type":17,"tag":7266,"props":270681,"children":270682},{},[270683],{"type":23,"value":270684},"Log top-funnel activity before conversion.",{"type":17,"tag":29,"props":270686,"children":270687},{},[270688],{"type":23,"value":270689},"This unified schema ensures event logging and retrieval behave identically across every connected CRM.",{"type":17,"tag":239,"props":270691,"children":270693},{"id":270692},"example-event-scenarios",[270694],{"type":23,"value":270695},"Example Event Scenarios",{"type":17,"tag":7231,"props":270697,"children":270698},{},[270699,270719],{"type":17,"tag":7235,"props":270700,"children":270701},{},[270702],{"type":17,"tag":7239,"props":270703,"children":270704},{},[270705,270710,270715],{"type":17,"tag":7243,"props":270706,"children":270707},{},[270708],{"type":23,"value":270709},"Scenario",{"type":17,"tag":7243,"props":270711,"children":270712},{},[270713],{"type":23,"value":270714},"Example Event Type",{"type":17,"tag":7243,"props":270716,"children":270717},{},[270718],{"type":23,"value":24525},{"type":17,"tag":7259,"props":270720,"children":270721},{},[270722,270746,270770,270800,270824],{"type":17,"tag":7239,"props":270723,"children":270724},{},[270725,270733,270741],{"type":17,"tag":7266,"props":270726,"children":270727},{},[270728],{"type":17,"tag":48,"props":270729,"children":270730},{},[270731],{"type":23,"value":270732},"App sent an email",{"type":17,"tag":7266,"props":270734,"children":270735},{},[270736],{"type":17,"tag":6121,"props":270737,"children":270739},{"className":270738},[],[270740],{"type":23,"value":62666},{"type":17,"tag":7266,"props":270742,"children":270743},{},[270744],{"type":23,"value":270745},"Log subject, sender, and recipient context; associate to Contact and Deal.",{"type":17,"tag":7239,"props":270747,"children":270748},{},[270749,270757,270765],{"type":17,"tag":7266,"props":270750,"children":270751},{},[270752],{"type":17,"tag":48,"props":270753,"children":270754},{},[270755],{"type":23,"value":270756},"Contact enriched",{"type":17,"tag":7266,"props":270758,"children":270759},{},[270760],{"type":17,"tag":6121,"props":270761,"children":270763},{"className":270762},[],[270764],{"type":23,"value":62656},{"type":17,"tag":7266,"props":270766,"children":270767},{},[270768],{"type":23,"value":270769},"Record enrichment summary, provider, and confidence score.",{"type":17,"tag":7239,"props":270771,"children":270772},{},[270773,270781,270795],{"type":17,"tag":7266,"props":270774,"children":270775},{},[270776],{"type":17,"tag":48,"props":270777,"children":270778},{},[270779],{"type":23,"value":270780},"Third-party trigger",{"type":17,"tag":7266,"props":270782,"children":270783},{},[270784,270789,270790],{"type":17,"tag":6121,"props":270785,"children":270787},{"className":270786},[],[270788],{"type":23,"value":62656},{"type":23,"value":26030},{"type":17,"tag":6121,"props":270791,"children":270793},{"className":270792},[],[270794],{"type":23,"value":62676},{"type":17,"tag":7266,"props":270796,"children":270797},{},[270798],{"type":23,"value":270799},"Log automation outcome or workflow run; include correlation ID.",{"type":17,"tag":7239,"props":270801,"children":270802},{},[270803,270811,270819],{"type":17,"tag":7266,"props":270804,"children":270805},{},[270806],{"type":17,"tag":48,"props":270807,"children":270808},{},[270809],{"type":23,"value":270810},"Meeting booked",{"type":17,"tag":7266,"props":270812,"children":270813},{},[270814],{"type":17,"tag":6121,"props":270815,"children":270817},{"className":270816},[],[270818],{"type":23,"value":62661},{"type":17,"tag":7266,"props":270820,"children":270821},{},[270822],{"type":23,"value":270823},"Record scheduling outcome and follow-up task.",{"type":17,"tag":7239,"props":270825,"children":270826},{},[270827,270835,270843],{"type":17,"tag":7266,"props":270828,"children":270829},{},[270830],{"type":17,"tag":48,"props":270831,"children":270832},{},[270833],{"type":23,"value":270834},"Call completed",{"type":17,"tag":7266,"props":270836,"children":270837},{},[270838],{"type":17,"tag":6121,"props":270839,"children":270841},{"className":270840},[],[270842],{"type":23,"value":62671},{"type":17,"tag":7266,"props":270844,"children":270845},{},[270846],{"type":23,"value":270847},"Capture call disposition and transcript or recording link.",{"type":17,"tag":239,"props":270849,"children":270851},{"id":270850},"data-flow-for-crm-event-sync",[270852],{"type":23,"value":270853},"Data Flow for CRM Event Sync",{"type":17,"tag":6154,"props":270855,"children":270856},{},[270857,270873,270890,270899,270909],{"type":17,"tag":84,"props":270858,"children":270859},{},[270860,270864,270866,270871],{"type":17,"tag":48,"props":270861,"children":270862},{},[270863],{"type":23,"value":251948},{"type":23,"value":270865}," — The user authorizes CRM access through Unified Connect, returning a ",{"type":17,"tag":6121,"props":270867,"children":270869},{"className":270868},[],[270870],{"type":23,"value":25037},{"type":23,"value":270872}," for secure real-time interaction.",{"type":17,"tag":84,"props":270874,"children":270875},{},[270876,270881,270883,270888],{"type":17,"tag":48,"props":270877,"children":270878},{},[270879],{"type":23,"value":270880},"Record",{"type":23,"value":270882}," — Your application posts events to Unified's ",{"type":17,"tag":6121,"props":270884,"children":270886},{"className":270885},[],[270887],{"type":23,"value":178241},{"type":23,"value":270889}," endpoint, specifying type, associations (contact, company, deal), and relevant metadata.",{"type":17,"tag":84,"props":270891,"children":270892},{},[270893,270897],{"type":17,"tag":48,"props":270894,"children":270895},{},[270896],{"type":23,"value":145789},{"type":23,"value":270898}," — Query past activities for analytics, engagement scoring, or timeline rendering.",{"type":17,"tag":84,"props":270900,"children":270901},{},[270902,270907],{"type":17,"tag":48,"props":270903,"children":270904},{},[270905],{"type":23,"value":270906},"Analyze",{"type":23,"value":270908}," — Combine historical and new events to surface deal health insights or CSM alerts.",{"type":17,"tag":84,"props":270910,"children":270911},{},[270912,270916,270918,270922],{"type":17,"tag":48,"props":270913,"children":270914},{},[270915],{"type":23,"value":268908},{"type":23,"value":270917}," — Subscribe to ",{"type":17,"tag":133,"props":270919,"children":270920},{"href":4999},[270921],{"type":23,"value":5002},{"type":23,"value":270923}," for new or updated events across connected CRMs to maintain two-way sync.",{"type":17,"tag":29,"props":270925,"children":270926},{},[270927],{"type":23,"value":270928},"With Unified, the same workflow works for Salesforce, HubSpot, Zoho, or any supported CRM — no mapping or schema rewrites required.",{"type":17,"tag":239,"props":270930,"children":270931},{"id":268424},[270932],{"type":23,"value":268427},{"type":17,"tag":29,"props":270934,"children":270935},{},[270936],{"type":23,"value":270937},"For PMs and engineers building analytics, engagement, or GTM automation tools:",{"type":17,"tag":80,"props":270939,"children":270940},{},[270941,270961,270970,270980],{"type":17,"tag":84,"props":270942,"children":270943},{},[270944,270949,270950,270959],{"type":17,"tag":48,"props":270945,"children":270946},{},[270947],{"type":23,"value":270948},"One API for",{"type":23,"value":18757},{"type":17,"tag":133,"props":270951,"children":270953},{"href":76501,"rel":270952},[214],[270954],{"type":17,"tag":48,"props":270955,"children":270956},{},[270957],{"type":23,"value":270958},"38+ CRMs",{"type":23,"value":270960}," — write and read events consistently.",{"type":17,"tag":84,"props":270962,"children":270963},{},[270964,270968],{"type":17,"tag":48,"props":270965,"children":270966},{},[270967],{"type":23,"value":268961},{"type":23,"value":270969}," — webhook delivery keeps timelines current.",{"type":17,"tag":84,"props":270971,"children":270972},{},[270973,270978],{"type":17,"tag":48,"props":270974,"children":270975},{},[270976],{"type":23,"value":270977},"Unified model",{"type":23,"value":270979}," — standardized event types simplify downstream logic.",{"type":17,"tag":84,"props":270981,"children":270982},{},[270983,270988],{"type":17,"tag":48,"props":270984,"children":270985},{},[270986],{"type":23,"value":270987},"Data portability",{"type":23,"value":270989}," — same schema for Salesforce, HubSpot, Pipedrive, Zoho, and more.",{"type":17,"tag":29,"props":270991,"children":270992},{},[270993],{"type":23,"value":270994},"Launch event logging, activity analytics, and deal scoring across 30+ CRMs without custom connectors.",{"type":17,"tag":29,"props":270996,"children":270997},{},[270998,271006,271007,271015],{"type":17,"tag":133,"props":270999,"children":271001},{"href":158861,"rel":271000},[214],[271002],{"type":17,"tag":48,"props":271003,"children":271004},{},[271005],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":271008,"children":271010},{"href":1623,"rel":271009},[214],[271011],{"type":17,"tag":48,"props":271012,"children":271013},{},[271014],{"type":23,"value":226481},{"type":23,"value":271016}," to see Unified.to in action.",{"title":7,"searchDepth":1629,"depth":1629,"links":271018},[271019,271020,271021,271022,271023],{"id":270495,"depth":1635,"text":270498},{"id":268033,"depth":1635,"text":268036},{"id":270692,"depth":1635,"text":270695},{"id":270850,"depth":1635,"text":270853},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_sync_crm_events_and_timelines_across_salesforce_hubspot_and_30_platforms_with_a_unified_api.md","blog/how_to_sync_crm_events_and_timelines_across_salesforce_hubspot_and_30_platforms_with_a_unified_api.md","blog/how_to_sync_crm_events_and_timelines_across_salesforce_hubspot_and_30_platforms_with_a_unified_api",{"_path":271028,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":271029,"description":271030,"img":271031,"date":267927,"tag":12,"body":271032,"_type":1677,"_id":271465,"_source":1679,"_file":271466,"_stem":271467,"_extension":1682},"/blog/how_to_sync_employee_and_user_data_from_workday_bamboohr_and_180_hr_platforms_with_a_unified_api","How to Sync Employee and User Data from Workday, BambooHR, and 180+ HR Platforms with a Unified API","Every SaaS platform depends on accurate user data — from permissions and analytics to AI personalization. But users and groups are often spread across HR...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_sync_employee_and_user_data_from_workday_bamboohr_and_180_hr_platforms_with_a_unified_api-icon.png",{"type":14,"children":271033,"toc":271458},[271034,271039,271042,271049,271054,271072,271078,271087,271130,271134,271247,271259,271263,271274,271297,271308,271314,271377,271388,271392,271432,271437],{"type":17,"tag":18,"props":271035,"children":271037},{"id":271036},"how-to-sync-employee-and-user-data-from-workday-bamboohr-and-180-hr-platforms-with-a-unified-api",[271038],{"type":23,"value":271029},{"type":17,"tag":25,"props":271040,"children":271041},{},[],{"type":17,"tag":29,"props":271043,"children":271044},{},[271045],{"type":17,"tag":33,"props":271046,"children":271047},{},[271048],{"type":23,"value":267945},{"type":17,"tag":29,"props":271050,"children":271051},{},[271052],{"type":23,"value":271053},"Every SaaS platform depends on accurate user data — from permissions and analytics to AI personalization. But users and groups are often spread across HR systems, directories, and IDPs like Okta, Google Workspace, and Microsoft Entra ID. Each uses a different schema and authentication model, making synchronization complex and error-prone.",{"type":17,"tag":29,"props":271055,"children":271056},{},[271057,271059,271064,271066,271070],{"type":23,"value":271058},"Unified.to simplifies this by providing a single API to connect HR, Directory/IDP, and SCIM sources. You can ",{"type":17,"tag":48,"props":271060,"children":271061},{},[271062],{"type":23,"value":271063},"sync normalized employee and group data directly from the system-of-record",{"type":23,"value":271065}," — ideal for powering RBAC, analytics, AI pipelines (like ",{"type":17,"tag":133,"props":271067,"children":271068},{"href":5201},[271069],{"type":23,"value":5204},{"type":23,"value":271071},"), and backups — without maintaining per-vendor logic or writing custom connectors.",{"type":17,"tag":239,"props":271073,"children":271075},{"id":271074},"when-to-use-unified-for-user-data",[271076],{"type":23,"value":271077},"When to Use Unified for User Data",{"type":17,"tag":29,"props":271079,"children":271080},{},[271081,271082,271086],{"type":23,"value":268556},{"type":17,"tag":133,"props":271083,"children":271084},{"href":7691},[271085],{"type":23,"value":7459},{"type":23,"value":233792},{"type":17,"tag":80,"props":271088,"children":271089},{},[271090,271100,271110,271120],{"type":17,"tag":84,"props":271091,"children":271092},{},[271093,271098],{"type":17,"tag":48,"props":271094,"children":271095},{},[271096],{"type":23,"value":271097},"Build a reliable user directory",{"type":23,"value":271099}," in your product using live HR and directory data.",{"type":17,"tag":84,"props":271101,"children":271102},{},[271103,271108],{"type":17,"tag":48,"props":271104,"children":271105},{},[271106],{"type":23,"value":271107},"Automate RBAC, provisioning, and audit trails",{"type":23,"value":271109}," using real-time user status.",{"type":17,"tag":84,"props":271111,"children":271112},{},[271113,271118],{"type":17,"tag":48,"props":271114,"children":271115},{},[271116],{"type":23,"value":271117},"Feed analytics or AI pipelines",{"type":23,"value":271119}," with always-fresh user and group context.",{"type":17,"tag":84,"props":271121,"children":271122},{},[271123,271128],{"type":17,"tag":48,"props":271124,"children":271125},{},[271126],{"type":23,"value":271127},"Reconcile multiple sources",{"type":23,"value":271129}," (e.g., HRIS + IDP) into one consistent, authoritative dataset.",{"type":17,"tag":239,"props":271131,"children":271132},{"id":268033},[271133],{"type":23,"value":268036},{"type":17,"tag":7231,"props":271135,"children":271136},{},[271137,271151],{"type":17,"tag":7235,"props":271138,"children":271139},{},[271140],{"type":17,"tag":7239,"props":271141,"children":271142},{},[271143,271147],{"type":17,"tag":7243,"props":271144,"children":271145},{},[271146],{"type":23,"value":18594},{"type":17,"tag":7243,"props":271148,"children":271149},{},[271150],{"type":23,"value":24525},{"type":17,"tag":7259,"props":271152,"children":271153},{},[271154,271169,271184,271199,271215,271231],{"type":17,"tag":7239,"props":271155,"children":271156},{},[271157,271164],{"type":17,"tag":7266,"props":271158,"children":271159},{},[271160],{"type":17,"tag":48,"props":271161,"children":271162},{},[271163],{"type":23,"value":61210},{"type":17,"tag":7266,"props":271165,"children":271166},{},[271167],{"type":23,"value":271168},"The primary person record from the source-of-truth (HR, Directory, or SCIM).",{"type":17,"tag":7239,"props":271170,"children":271171},{},[271172,271179],{"type":17,"tag":7266,"props":271173,"children":271174},{},[271175],{"type":17,"tag":48,"props":271176,"children":271177},{},[271178],{"type":23,"value":18623},{"type":17,"tag":7266,"props":271180,"children":271181},{},[271182],{"type":23,"value":271183},"Organizational unit, team, or access group.",{"type":17,"tag":7239,"props":271185,"children":271186},{},[271187,271194],{"type":17,"tag":7266,"props":271188,"children":271189},{},[271190],{"type":17,"tag":48,"props":271191,"children":271192},{},[271193],{"type":23,"value":25846},{"type":17,"tag":7266,"props":271195,"children":271196},{},[271197],{"type":23,"value":271198},"Tenant or company metadata for rollups and scoping.",{"type":17,"tag":7239,"props":271200,"children":271201},{},[271202,271210],{"type":17,"tag":7266,"props":271203,"children":271204},{},[271205],{"type":17,"tag":48,"props":271206,"children":271207},{},[271208],{"type":23,"value":271209},"Location (optional)",{"type":17,"tag":7266,"props":271211,"children":271212},{},[271213],{"type":23,"value":271214},"Physical office or region associated with users.",{"type":17,"tag":7239,"props":271216,"children":271217},{},[271218,271226],{"type":17,"tag":7266,"props":271219,"children":271220},{},[271221],{"type":17,"tag":48,"props":271222,"children":271223},{},[271224],{"type":23,"value":271225},"Device (optional)",{"type":17,"tag":7266,"props":271227,"children":271228},{},[271229],{"type":23,"value":271230},"Assets tied to users where supported by the source.",{"type":17,"tag":7239,"props":271232,"children":271233},{},[271234,271242],{"type":17,"tag":7266,"props":271235,"children":271236},{},[271237],{"type":17,"tag":48,"props":271238,"children":271239},{},[271240],{"type":23,"value":271241},"Webhook",{"type":17,"tag":7266,"props":271243,"children":271244},{},[271245],{"type":23,"value":271246},"Real-time delivery of user and group changes.",{"type":17,"tag":29,"props":271248,"children":271249},{},[271250,271252,271257],{"type":23,"value":271251},"Unified.to normalizes these objects across ",{"type":17,"tag":48,"props":271253,"children":271254},{},[271255],{"type":23,"value":271256},"190+ HRIS, Directory, and IDP integrations",{"type":23,"value":271258},", making it easy to map roles, memberships, and hierarchies consistently across platforms.",{"type":17,"tag":239,"props":271260,"children":271261},{"id":270271},[271262],{"type":23,"value":270274},{"type":17,"tag":29,"props":271264,"children":271265},{},[271266,271268,271273],{"type":23,"value":271267},"Unified.to supports HR, Directory, and IDP providers across ",{"type":17,"tag":48,"props":271269,"children":271270},{},[271271],{"type":23,"value":271272},"190+ systems",{"type":23,"value":109313},{"type":17,"tag":80,"props":271275,"children":271276},{},[271277,271287],{"type":17,"tag":84,"props":271278,"children":271279},{},[271280,271285],{"type":17,"tag":48,"props":271281,"children":271282},{},[271283],{"type":23,"value":271284},"HR/Directory:",{"type":23,"value":271286}," Google Workspace Directory, Microsoft Entra ID / Active Directory, Okta, JumpCloud, BambooHR, Rippling, Deel, HiBob, Namely, and more.",{"type":17,"tag":84,"props":271288,"children":271289},{},[271290,271295],{"type":17,"tag":48,"props":271291,"children":271292},{},[271293],{"type":23,"value":271294},"SCIM-compatible systems:",{"type":23,"value":271296}," Any source using SCIM 2.0 for identity and group synchronization.",{"type":17,"tag":29,"props":271298,"children":271299},{},[271300,271301,271307],{"type":23,"value":269743},{"type":17,"tag":133,"props":271302,"children":271304},{"href":58209,"rel":271303},[214],[271305],{"type":23,"value":271306},"supported integrations",{"type":23,"value":54},{"type":17,"tag":239,"props":271309,"children":271311},{"id":271310},"data-flow-for-user-data-sync",[271312],{"type":23,"value":271313},"Data Flow for User Data Sync",{"type":17,"tag":6154,"props":271315,"children":271316},{},[271317,271332,271342,271358,271367],{"type":17,"tag":84,"props":271318,"children":271319},{},[271320,271324,271326,271331],{"type":17,"tag":48,"props":271321,"children":271322},{},[271323],{"type":23,"value":251948},{"type":23,"value":271325}," — The customer authorizes their HR, directory, or IDP source via Unified Connect, returning a secure ",{"type":17,"tag":6121,"props":271327,"children":271329},{"className":271328},[],[271330],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":84,"props":271333,"children":271334},{},[271335,271340],{"type":17,"tag":48,"props":271336,"children":271337},{},[271338],{"type":23,"value":271339},"Fetch Users and Groups",{"type":23,"value":271341}," — Unified retrieves normalized employee and group records with consistent identifiers, attributes, and metadata.",{"type":17,"tag":84,"props":271343,"children":271344},{},[271345,271350,271352,271356],{"type":17,"tag":48,"props":271346,"children":271347},{},[271348],{"type":23,"value":271349},"Deliver in Real Time",{"type":23,"value":271351}," — Changes (new hires, terminations, group membership updates) stream via ",{"type":17,"tag":133,"props":271353,"children":271354},{"href":4999},[271355],{"type":23,"value":5002},{"type":23,"value":271357}," or managed polling.",{"type":17,"tag":84,"props":271359,"children":271360},{},[271361,271365],{"type":17,"tag":48,"props":271362,"children":271363},{},[271364],{"type":23,"value":270342},{"type":23,"value":271366}," — Push data into your database, warehouse, or identity graph for permissions, analytics, or AI pipelines.",{"type":17,"tag":84,"props":271368,"children":271369},{},[271370,271375],{"type":17,"tag":48,"props":271371,"children":271372},{},[271373],{"type":23,"value":271374},"Reconcile",{"type":23,"value":271376}," — Combine multiple sources (e.g., HRIS + SCIM + IDP) to form a unified directory view across customers.",{"type":17,"tag":29,"props":271378,"children":271379},{},[271380,271381,271386],{"type":23,"value":25244},{"type":17,"tag":48,"props":271382,"children":271383},{},[271384],{"type":23,"value":271385},"zero-storage, real-time architecture",{"type":23,"value":271387}," ensures you're always working from the latest data — directly from the source, never cached.",{"type":17,"tag":239,"props":271389,"children":271390},{"id":268424},[271391],{"type":23,"value":268427},{"type":17,"tag":80,"props":271393,"children":271394},{},[271395,271405,271414,271423],{"type":17,"tag":84,"props":271396,"children":271397},{},[271398,271403],{"type":17,"tag":48,"props":271399,"children":271400},{},[271401],{"type":23,"value":271402},"One model, many systems",{"type":23,"value":271404}," — Fetch and normalize users and groups from 190+ HR and identity platforms.",{"type":17,"tag":84,"props":271406,"children":271407},{},[271408,271412],{"type":17,"tag":48,"props":271409,"children":271410},{},[271411],{"type":23,"value":268961},{"type":23,"value":271413}," — Detect user and permission changes instantly.",{"type":17,"tag":84,"props":271415,"children":271416},{},[271417,271421],{"type":17,"tag":48,"props":271418,"children":271419},{},[271420],{"type":23,"value":69783},{"type":23,"value":271422}," — Feed RAG, analytics, or compliance pipelines without custom connectors.",{"type":17,"tag":84,"props":271424,"children":271425},{},[271426,271430],{"type":17,"tag":48,"props":271427,"children":271428},{},[271429],{"type":23,"value":269406},{"type":23,"value":271431}," — Unified handles tokens, retries, and schema updates automatically.",{"type":17,"tag":29,"props":271433,"children":271434},{},[271435],{"type":23,"value":271436},"Deliver real-time, source-of-truth user data for RBAC, analytics, and AI — without managing dozens of integrations.",{"type":17,"tag":29,"props":271438,"children":271439},{},[271440,271448,271449,271457],{"type":17,"tag":133,"props":271441,"children":271443},{"href":158861,"rel":271442},[214],[271444],{"type":17,"tag":48,"props":271445,"children":271446},{},[271447],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":271450,"children":271452},{"href":1623,"rel":271451},[214],[271453],{"type":17,"tag":48,"props":271454,"children":271455},{},[271456],{"type":23,"value":226481},{"type":23,"value":271016},{"title":7,"searchDepth":1629,"depth":1629,"links":271459},[271460,271461,271462,271463,271464],{"id":271074,"depth":1635,"text":271077},{"id":268033,"depth":1635,"text":268036},{"id":270271,"depth":1635,"text":270274},{"id":271310,"depth":1635,"text":271313},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_sync_employee_and_user_data_from_workday_bamboohr_and_180_hr_platforms_with_a_unified_api.md","blog/how_to_sync_employee_and_user_data_from_workday_bamboohr_and_180_hr_platforms_with_a_unified_api.md","blog/how_to_sync_employee_and_user_data_from_workday_bamboohr_and_180_hr_platforms_with_a_unified_api",{"_path":271469,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":271470,"description":271471,"img":271472,"date":271473,"tag":12,"body":271474,"_type":1677,"_id":272100,"_source":1679,"_file":272101,"_stem":272102,"_extension":1682},"/blog/how_to_access_and_analyze_meeting_recordings_across_zoom_google_meet_microsoft_teams_and_other_platforms_with_a_unified_api","How to Access and Analyze Meeting Recordings Across Zoom, Google Meet, Microsoft Teams, and Other Platforms with a Unified API","As more SaaS products embed AI summaries, coaching tools, and searchable meeting archives, integrating with multiple conferencing and calendar platforms...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_access_and_analyze_meeting_recordings_across_zoom_google_meet_microsoft_teams_and_other_platforms_with_a_unified_api-icon.png","2025-10-19T00:00:00.000Z",{"type":14,"children":271475,"toc":272092},[271476,271481,271484,271492,271497,271513,271523,271529,271533,271561,271567,271572,271818,271823,271829,271903,271908,271914,271919,271965,271970,271976,271981,271992,272012,272016,272021,272065,272070],{"type":17,"tag":18,"props":271477,"children":271479},{"id":271478},"how-to-access-and-analyze-meeting-recordings-across-zoom-google-meet-microsoft-teams-and-other-platforms-with-a-unified-api",[271480],{"type":23,"value":271470},{"type":17,"tag":25,"props":271482,"children":271483},{},[],{"type":17,"tag":29,"props":271485,"children":271486},{},[271487],{"type":17,"tag":33,"props":271488,"children":271489},{},[271490],{"type":23,"value":271491},"October 19, 2025",{"type":17,"tag":29,"props":271493,"children":271494},{},[271495],{"type":23,"value":271496},"As more SaaS products embed AI summaries, coaching tools, and searchable meeting archives, integrating with multiple conferencing and calendar platforms becomes a bottleneck. Every vendor—Zoom, Google Meet, Microsoft Teams, Webex, and others—has different APIs for recordings, transcripts, and events.",{"type":17,"tag":29,"props":271498,"children":271499},{},[271500,271501,271505,271507,271511],{"type":23,"value":9619},{"type":17,"tag":133,"props":271502,"children":271503},{"href":7691},[271504],{"type":23,"value":7459},{"type":23,"value":271506}," removes that complexity. This ingestion pattern also forms the foundation of a ",{"type":17,"tag":133,"props":271508,"children":271509},{"href":77021},[271510],{"type":23,"value":77024},{"type":23,"value":271512}," (RAG) pipeline, where transcripts are indexed and retrieved at query time to ground AI outputs in real meeting data.",{"type":17,"tag":29,"props":271514,"children":271515},{},[271516,271521],{"type":17,"tag":133,"props":271517,"children":271519},{"href":42620,"rel":271518},[214],[271520],{"type":23,"value":217},{"type":23,"value":271522}," lets you list meetings, fetch recordings and transcripts, and generate AI summaries through a single normalized API. No per-vendor parsing, no auth maintenance, and no custom data mapping required.",{"type":17,"tag":239,"props":271524,"children":271526},{"id":271525},"when-to-use-meeting-recordings-transcript-analysis",[271527],{"type":23,"value":271528},"When to Use Meeting Recordings & Transcript Analysis",{"type":17,"tag":29,"props":271530,"children":271531},{},[271532],{"type":23,"value":254154},{"type":17,"tag":80,"props":271534,"children":271535},{},[271536,271541,271546,271551,271556],{"type":17,"tag":84,"props":271537,"children":271538},{},[271539],{"type":23,"value":271540},"Auto-summarize meetings with decisions, action items, and owners",{"type":17,"tag":84,"props":271542,"children":271543},{},[271544],{"type":23,"value":271545},"Coach sales or support calls by extracting topics, objections, and next steps",{"type":17,"tag":84,"props":271547,"children":271548},{},[271549],{"type":23,"value":271550},"Power searchable knowledge bases with transcripts and highlights",{"type":17,"tag":84,"props":271552,"children":271553},{},[271554],{"type":23,"value":271555},"Flag compliance risks, sentiment, and call-quality issues",{"type":17,"tag":84,"props":271557,"children":271558},{},[271559],{"type":23,"value":271560},"Build RAG-powered Q&A over historical meetings by embedding transcripts and retrieving relevant segments before generating answers.",{"type":17,"tag":239,"props":271562,"children":271564},{"id":271563},"normalized-meeting-objects",[271565],{"type":23,"value":271566},"Normalized Meeting Objects",{"type":17,"tag":29,"props":271568,"children":271569},{},[271570],{"type":23,"value":271571},"Unified.to provides consistent schemas across meeting, recording, and transcript data:",{"type":17,"tag":7231,"props":271573,"children":271574},{},[271575,271593],{"type":17,"tag":7235,"props":271576,"children":271577},{},[271578],{"type":17,"tag":7239,"props":271579,"children":271580},{},[271581,271585,271589],{"type":17,"tag":7243,"props":271582,"children":271583},{},[271584],{"type":23,"value":18594},{"type":17,"tag":7243,"props":271586,"children":271587},{},[271588],{"type":23,"value":24525},{"type":17,"tag":7243,"props":271590,"children":271591},{},[271592],{"type":23,"value":22096},{"type":17,"tag":7259,"props":271594,"children":271595},{},[271596,271657,271717,271765],{"type":17,"tag":7239,"props":271597,"children":271598},{},[271599,271606,271611],{"type":17,"tag":7266,"props":271600,"children":271601},{},[271602],{"type":17,"tag":48,"props":271603,"children":271604},{},[271605],{"type":23,"value":73973},{"type":17,"tag":7266,"props":271607,"children":271608},{},[271609],{"type":23,"value":271610},"Meeting metadata",{"type":17,"tag":7266,"props":271612,"children":271613},{},[271614,271619,271620,271625,271626,271631,271632,271637,271638,271644,271645,271651,271652],{"type":17,"tag":6121,"props":271615,"children":271617},{"className":271616},[],[271618],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271621,"children":271623},{"className":271622},[],[271624],{"type":23,"value":62346},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271627,"children":271629},{"className":271628},[],[271630],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271633,"children":271635},{"className":271634},[],[271636],{"type":23,"value":21060},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271639,"children":271641},{"className":271640},[],[271642],{"type":23,"value":271643},"attendees[]",{"type":23,"value":11826},{"type":17,"tag":6121,"props":271646,"children":271648},{"className":271647},[],[271649],{"type":23,"value":271650},"conference (provider, join_url)",{"type":23,"value":11826},{"type":17,"tag":6121,"props":271653,"children":271655},{"className":271654},[],[271656],{"type":23,"value":74116},{"type":17,"tag":7239,"props":271658,"children":271659},{},[271660,271667,271672],{"type":17,"tag":7266,"props":271661,"children":271662},{},[271663],{"type":17,"tag":48,"props":271664,"children":271665},{},[271666],{"type":23,"value":74195},{"type":17,"tag":7266,"props":271668,"children":271669},{},[271670],{"type":23,"value":271671},"Recording and transcript for an event",{"type":17,"tag":7266,"props":271673,"children":271674},{},[271675,271680,271681,271686,271687,271692,271693,271698,271699,271705,271706,271711,271712],{"type":17,"tag":6121,"props":271676,"children":271678},{"className":271677},[],[271679],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271682,"children":271684},{"className":271683},[],[271685],{"type":23,"value":74249},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271688,"children":271690},{"className":271689},[],[271691],{"type":23,"value":74285},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271694,"children":271696},{"className":271695},[],[271697],{"type":23,"value":74303},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271700,"children":271702},{"className":271701},[],[271703],{"type":23,"value":271704},"media[] (type, download_url, mime_type, transcript)",{"type":23,"value":11826},{"type":17,"tag":6121,"props":271707,"children":271709},{"className":271708},[],[271710],{"type":23,"value":74377},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271713,"children":271715},{"className":271714},[],[271716],{"type":23,"value":33446},{"type":17,"tag":7239,"props":271718,"children":271719},{},[271720,271727,271732],{"type":17,"tag":7266,"props":271721,"children":271722},{},[271723],{"type":17,"tag":48,"props":271724,"children":271725},{},[271726],{"type":23,"value":124562},{"type":17,"tag":7266,"props":271728,"children":271729},{},[271730],{"type":23,"value":271731},"Real-time event and recording changes",{"type":17,"tag":7266,"props":271733,"children":271734},{},[271735,271740,271741,271746,271747,271753,271754,271759,271760],{"type":17,"tag":6121,"props":271736,"children":271738},{"className":271737},[],[271739],{"type":23,"value":161193},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271742,"children":271744},{"className":271743},[],[271745],{"type":23,"value":62633},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271748,"children":271750},{"className":271749},[],[271751],{"type":23,"value":271752},"type (NATIVE/VIRTUAL)",{"type":23,"value":11826},{"type":17,"tag":6121,"props":271755,"children":271757},{"className":271756},[],[271758],{"type":23,"value":178128},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271761,"children":271763},{"className":271762},[],[271764],{"type":23,"value":77777},{"type":17,"tag":7239,"props":271766,"children":271767},{},[271768,271775,271780],{"type":17,"tag":7266,"props":271769,"children":271770},{},[271771],{"type":17,"tag":48,"props":271772,"children":271773},{},[271774],{"type":23,"value":74651},{"type":17,"tag":7266,"props":271776,"children":271777},{},[271778],{"type":23,"value":271779},"AI summarization or extraction request",{"type":17,"tag":7266,"props":271781,"children":271782},{},[271783,271788,271789,271794,271795,271800,271801,271806,271807,271812,271813],{"type":17,"tag":6121,"props":271784,"children":271786},{"className":271785},[],[271787],{"type":23,"value":74684},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271790,"children":271792},{"className":271791},[],[271793],{"type":23,"value":137672},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271796,"children":271798},{"className":271797},[],[271799],{"type":23,"value":74693},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271802,"children":271804},{"className":271803},[],[271805],{"type":23,"value":74702},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271808,"children":271810},{"className":271809},[],[271811],{"type":23,"value":137685},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271814,"children":271816},{"className":271815},[],[271817],{"type":23,"value":137690},{"type":17,"tag":29,"props":271819,"children":271820},{},[271821],{"type":23,"value":271822},"These schemas make it simple to work with multiple providers while keeping all metadata—recordings, transcripts, and AI summaries—structured and consistent.",{"type":17,"tag":239,"props":271824,"children":271826},{"id":271825},"data-flow-for-meeting-recordings-transcript-analysis",[271827],{"type":23,"value":271828},"Data Flow for Meeting Recordings & Transcript Analysis",{"type":17,"tag":6154,"props":271830,"children":271831},{},[271832,271847,271862,271877,271893],{"type":17,"tag":84,"props":271833,"children":271834},{},[271835,271839,271841,271846],{"type":17,"tag":48,"props":271836,"children":271837},{},[271838],{"type":23,"value":251948},{"type":23,"value":271840}," the customer's calendar or conferencing platform via Unified to receive a ",{"type":17,"tag":6121,"props":271842,"children":271844},{"className":271843},[],[271845],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":84,"props":271848,"children":271849},{},[271850,271854,271855,271860],{"type":17,"tag":48,"props":271851,"children":271852},{},[271853],{"type":23,"value":145784},{"type":23,"value":18757},{"type":17,"tag":6121,"props":271856,"children":271858},{"className":271857},[],[271859],{"type":23,"value":73973},{"type":23,"value":271861}," objects to identify relevant meetings (filter by time range, organizer, or attendees).",{"type":17,"tag":84,"props":271863,"children":271864},{},[271865,271869,271870,271875],{"type":17,"tag":48,"props":271866,"children":271867},{},[271868],{"type":23,"value":145789},{"type":23,"value":18757},{"type":17,"tag":6121,"props":271871,"children":271873},{"className":271872},[],[271874],{"type":23,"value":74195},{"type":23,"value":271876}," objects by ID to access recordings and transcripts.",{"type":17,"tag":84,"props":271878,"children":271879},{},[271880,271884,271886,271891],{"type":17,"tag":48,"props":271881,"children":271882},{},[271883],{"type":23,"value":42125},{"type":23,"value":271885}," a ",{"type":17,"tag":6121,"props":271887,"children":271889},{"className":271888},[],[271890],{"type":23,"value":74651},{"type":23,"value":271892}," with transcript text to summarize, extract key actions, or classify sentiment and topics.",{"type":17,"tag":84,"props":271894,"children":271895},{},[271896,271901],{"type":17,"tag":48,"props":271897,"children":271898},{},[271899],{"type":23,"value":271900},"Deliver",{"type":23,"value":271902}," summarized results via API, webhook, or database sync—and optionally log insights back into your CRM or helpdesk.",{"type":17,"tag":29,"props":271904,"children":271905},{},[271906],{"type":23,"value":271907},"This workflow standardizes recording retrieval and AI processing across every major meeting provider.",{"type":17,"tag":239,"props":271909,"children":271911},{"id":271910},"extending-this-workflow-into-a-rag-pipeline",[271912],{"type":23,"value":271913},"Extending This Workflow into a RAG Pipeline",{"type":17,"tag":29,"props":271915,"children":271916},{},[271917],{"type":23,"value":271918},"If you want semantic search or 'ask about any past meeting' features:",{"type":17,"tag":6154,"props":271920,"children":271921},{},[271922,271927,271932,271937,271960],{"type":17,"tag":84,"props":271923,"children":271924},{},[271925],{"type":23,"value":271926},"Subscribe to webhooks for recording create/update events.",{"type":17,"tag":84,"props":271928,"children":271929},{},[271930],{"type":23,"value":271931},"Fetch updated transcripts in real time.",{"type":17,"tag":84,"props":271933,"children":271934},{},[271935],{"type":23,"value":271936},"Chunk transcript text and generate embeddings.",{"type":17,"tag":84,"props":271938,"children":271939},{},[271940,271941,271946,271947,271953,271954,271959],{"type":23,"value":233739},{"type":17,"tag":6121,"props":271942,"children":271944},{"className":271943},[],[271945],{"type":23,"value":25037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":271948,"children":271950},{"className":271949},[],[271951],{"type":23,"value":271952},"recording_id",{"type":23,"value":12561},{"type":17,"tag":6121,"props":271955,"children":271957},{"className":271956},[],[271958],{"type":23,"value":25337},{"type":23,"value":54},{"type":17,"tag":84,"props":271961,"children":271962},{},[271963],{"type":23,"value":271964},"On user query, retrieve the top matching transcript segments and pass them to your LLM for grounded responses. Unified Use Case RAG Pipelines",{"type":17,"tag":29,"props":271966,"children":271967},{},[271968],{"type":23,"value":271969},"Unified handles ingestion and real-time updates; you manage embeddings and vector storage in your own infrastructure.",{"type":17,"tag":239,"props":271971,"children":271973},{"id":271972},"supported-meeting-platforms",[271974],{"type":23,"value":271975},"Supported Meeting Platforms",{"type":17,"tag":29,"props":271977,"children":271978},{},[271979],{"type":23,"value":271980},"Unified.to supports 19+ calendar and meeting integrations, including:",{"type":17,"tag":3414,"props":271982,"children":271983},{},[271984],{"type":17,"tag":29,"props":271985,"children":271986},{},[271987],{"type":17,"tag":48,"props":271988,"children":271989},{},[271990],{"type":23,"value":271991},"Zoom, Google Calendar/Meet, Microsoft Outlook/Teams, Webex, and RingCentral.",{"type":17,"tag":29,"props":271993,"children":271994},{},[271995,271996,272002,272004,272010],{"type":23,"value":269743},{"type":17,"tag":133,"props":271997,"children":271999},{"href":99025,"rel":271998},[214],[272000],{"type":23,"value":272001},"supported Calendar integrations",{"type":23,"value":272003}," and explore the ",{"type":17,"tag":133,"props":272005,"children":272007},{"href":99333,"rel":272006},[214],[272008],{"type":23,"value":272009},"Calendar API documentation",{"type":23,"value":272011}," for details.",{"type":17,"tag":239,"props":272013,"children":272014},{"id":268424},[272015],{"type":23,"value":268427},{"type":17,"tag":29,"props":272017,"children":272018},{},[272019],{"type":23,"value":272020},"For PMs and engineers building AI-enabled meeting products:",{"type":17,"tag":80,"props":272022,"children":272023},{},[272024,272034,272044,272056],{"type":17,"tag":84,"props":272025,"children":272026},{},[272027,272032],{"type":17,"tag":48,"props":272028,"children":272029},{},[272030],{"type":23,"value":272031},"Faster feature delivery",{"type":23,"value":272033}," — one build supports every conferencing provider",{"type":17,"tag":84,"props":272035,"children":272036},{},[272037,272042],{"type":17,"tag":48,"props":272038,"children":272039},{},[272040],{"type":23,"value":272041},"Unified schema",{"type":23,"value":272043}," — normalized data for events, recordings, and transcripts",{"type":17,"tag":84,"props":272045,"children":272046},{},[272047,272049,272054],{"type":23,"value":272048},"AI-ready by default — trigger summaries, topic extraction, sentiment analysis, or RAG-powered search via the ",{"type":17,"tag":6121,"props":272050,"children":272052},{"className":272051},[],[272053],{"type":23,"value":74651},{"type":23,"value":272055}," endpoint and your vector index.",{"type":17,"tag":84,"props":272057,"children":272058},{},[272059,272063],{"type":17,"tag":48,"props":272060,"children":272061},{},[272062],{"type":23,"value":268961},{"type":23,"value":272064}," — webhook-driven updates ensure meeting data stays current",{"type":17,"tag":29,"props":272066,"children":272067},{},[272068],{"type":23,"value":272069},"Launch meeting analytics, summaries, and coaching tools across all major platforms.",{"type":17,"tag":29,"props":272071,"children":272072},{},[272073,272081,272082,272090],{"type":17,"tag":133,"props":272074,"children":272076},{"href":158861,"rel":272075},[214],[272077],{"type":17,"tag":48,"props":272078,"children":272079},{},[272080],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":272083,"children":272085},{"href":1623,"rel":272084},[214],[272086],{"type":17,"tag":48,"props":272087,"children":272088},{},[272089],{"type":23,"value":226481},{"type":23,"value":272091}," to see how Unified.to can accelerate your roadmap.",{"title":7,"searchDepth":1629,"depth":1629,"links":272093},[272094,272095,272096,272097,272098,272099],{"id":271525,"depth":1635,"text":271528},{"id":271563,"depth":1635,"text":271566},{"id":271825,"depth":1635,"text":271828},{"id":271910,"depth":1635,"text":271913},{"id":271972,"depth":1635,"text":271975},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_access_and_analyze_meeting_recordings_across_zoom_google_meet_microsoft_teams_and_other_platforms_with_a_unified_api.md","blog/how_to_access_and_analyze_meeting_recordings_across_zoom_google_meet_microsoft_teams_and_other_platforms_with_a_unified_api.md","blog/how_to_access_and_analyze_meeting_recordings_across_zoom_google_meet_microsoft_teams_and_other_platforms_with_a_unified_api",{"_path":272104,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":272105,"description":272106,"img":272107,"date":271473,"tag":12,"body":272108,"_type":1677,"_id":272839,"_source":1679,"_file":272840,"_stem":272841,"_extension":1682},"/blog/how_to_analyze_financial_data_across_quickbooks_xero_netsuite_and_other_accounting_platforms_with_a_unified_api","How to Analyze Financial Data Across QuickBooks, Xero, NetSuite, and Other Accounting Platforms with a Unified API","Accounting and finance data sits across dozens of systems — from QuickBooks and Xero to NetSuite and Zoho Books. Every platform uses its own schema,...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_analyze_financial_data_across_quickbooks_xero_netsuite_and_other_accounting_platforms_with_a_unified_api-icon.png",{"type":14,"children":272109,"toc":272832},[272110,272115,272118,272125,272130,272140,272146,272150,272173,272179,272184,272596,272602,272702,272707,272713,272723,272734,272754,272758,272763,272805,272810],{"type":17,"tag":18,"props":272111,"children":272113},{"id":272112},"how-to-analyze-financial-data-across-quickbooks-xero-netsuite-and-other-accounting-platforms-with-a-unified-api",[272114],{"type":23,"value":272105},{"type":17,"tag":25,"props":272116,"children":272117},{},[],{"type":17,"tag":29,"props":272119,"children":272120},{},[272121],{"type":17,"tag":33,"props":272122,"children":272123},{},[272124],{"type":23,"value":271491},{"type":17,"tag":29,"props":272126,"children":272127},{},[272128],{"type":23,"value":272129},"Accounting and finance data sits across dozens of systems — from QuickBooks and Xero to NetSuite and Zoho Books. Every platform uses its own schema, authentication model, and data format, making it painful for product teams to build consistent dashboards or real-time insights.",{"type":17,"tag":29,"props":272131,"children":272132},{},[272133,272134,272138],{"type":23,"value":9619},{"type":17,"tag":133,"props":272135,"children":272136},{"href":7691},[272137],{"type":23,"value":7459},{"type":23,"value":272139}," removes that complexity. Unified.to connects directly to your customers' accounting systems and delivers normalized, real-time financial data — ledgers, transactions, invoices, and reports — through a single API. That lets you build finance dashboards, detect anomalies, and standardize KPIs without maintaining separate connectors.",{"type":17,"tag":239,"props":272141,"children":272143},{"id":272142},"when-to-use-financial-analysis",[272144],{"type":23,"value":272145},"When to Use Financial Analysis",{"type":17,"tag":29,"props":272147,"children":272148},{},[272149],{"type":23,"value":254154},{"type":17,"tag":80,"props":272151,"children":272152},{},[272153,272158,272163,272168],{"type":17,"tag":84,"props":272154,"children":272155},{},[272156],{"type":23,"value":272157},"Build real-time finance dashboards for your customers",{"type":17,"tag":84,"props":272159,"children":272160},{},[272161],{"type":23,"value":272162},"Standardize KPIs across invoices, bills, and transactions",{"type":17,"tag":84,"props":272164,"children":272165},{},[272166],{"type":23,"value":272167},"Monitor invoice or bill changes for alerts and anomaly detection",{"type":17,"tag":84,"props":272169,"children":272170},{},[272171],{"type":23,"value":272172},"Consolidate multi-entity reports using consistent, normalized schemas",{"type":17,"tag":239,"props":272174,"children":272176},{"id":272175},"normalized-accounting-objects",[272177],{"type":23,"value":272178},"Normalized Accounting Objects",{"type":17,"tag":29,"props":272180,"children":272181},{},[272182],{"type":23,"value":272183},"Unified.to provides consistent schemas across accounting systems for both granular and aggregated data:",{"type":17,"tag":7231,"props":272185,"children":272186},{},[272187,272205],{"type":17,"tag":7235,"props":272188,"children":272189},{},[272190],{"type":17,"tag":7239,"props":272191,"children":272192},{},[272193,272197,272201],{"type":17,"tag":7243,"props":272194,"children":272195},{},[272196],{"type":23,"value":18594},{"type":17,"tag":7243,"props":272198,"children":272199},{},[272200],{"type":23,"value":24525},{"type":17,"tag":7243,"props":272202,"children":272203},{},[272204],{"type":23,"value":22096},{"type":17,"tag":7259,"props":272206,"children":272207},{},[272208,272282,272355,272426,272486,272549],{"type":17,"tag":7239,"props":272209,"children":272210},{},[272211,272218,272223],{"type":17,"tag":7266,"props":272212,"children":272213},{},[272214],{"type":17,"tag":48,"props":272215,"children":272216},{},[272217],{"type":23,"value":89108},{"type":17,"tag":7266,"props":272219,"children":272220},{},[272221],{"type":23,"value":272222},"Chart of accounts for mapping and rollups",{"type":17,"tag":7266,"props":272224,"children":272225},{},[272226,272231,272232,272237,272238,272243,272244,272249,272250,272256,272257,272262,272263,272269,272270,272276,272277],{"type":17,"tag":6121,"props":272227,"children":272229},{"className":272228},[],[272230],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272233,"children":272235},{"className":272234},[],[272236],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272239,"children":272241},{"className":272240},[],[272242],{"type":23,"value":27310},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272245,"children":272247},{"className":272246},[],[272248],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272251,"children":272253},{"className":272252},[],[272254],{"type":23,"value":272255},"balance",{"type":23,"value":11826},{"type":17,"tag":6121,"props":272258,"children":272260},{"className":272259},[],[272261],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272264,"children":272266},{"className":272265},[],[272267],{"type":23,"value":272268},"section",{"type":23,"value":11826},{"type":17,"tag":6121,"props":272271,"children":272273},{"className":272272},[],[272274],{"type":23,"value":272275},"group",{"type":23,"value":11826},{"type":17,"tag":6121,"props":272278,"children":272280},{"className":272279},[],[272281],{"type":23,"value":257525},{"type":17,"tag":7239,"props":272283,"children":272284},{},[272285,272293,272298],{"type":17,"tag":7266,"props":272286,"children":272287},{},[272288],{"type":17,"tag":48,"props":272289,"children":272290},{},[272291],{"type":23,"value":272292},"transaction",{"type":17,"tag":7266,"props":272294,"children":272295},{},[272296],{"type":23,"value":272297},"GL entries (sales, expenses, payments)",{"type":17,"tag":7266,"props":272299,"children":272300},{},[272301,272306,272307,272312,272313,272318,272319,272324,272325,272331,272332,272337,272338,272343,272344,272349,272350],{"type":17,"tag":6121,"props":272302,"children":272304},{"className":272303},[],[272305],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272308,"children":272310},{"className":272309},[],[272311],{"type":23,"value":27310},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272314,"children":272316},{"className":272315},[],[272317],{"type":23,"value":238963},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272320,"children":272322},{"className":272321},[],[272323],{"type":23,"value":219481},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272326,"children":272328},{"className":272327},[],[272329],{"type":23,"value":272330},"tax_amount",{"type":23,"value":11826},{"type":17,"tag":6121,"props":272333,"children":272335},{"className":272334},[],[272336],{"type":23,"value":184840},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272339,"children":272341},{"className":272340},[],[272342],{"type":23,"value":26302},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272345,"children":272347},{"className":272346},[],[272348],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272351,"children":272353},{"className":272352},[],[272354],{"type":23,"value":219548},{"type":17,"tag":7239,"props":272356,"children":272357},{},[272358,272365,272370],{"type":17,"tag":7266,"props":272359,"children":272360},{},[272361],{"type":17,"tag":48,"props":272362,"children":272363},{},[272364],{"type":23,"value":108682},{"type":17,"tag":7266,"props":272366,"children":272367},{},[272368],{"type":23,"value":272369},"Accounts receivable records for revenue analysis",{"type":17,"tag":7266,"props":272371,"children":272372},{},[272373,272378,272379,272384,272385,272390,272391,272396,272397,272402,272403,272408,272409,272414,272415,272420,272421],{"type":17,"tag":6121,"props":272374,"children":272376},{"className":272375},[],[272377],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272380,"children":272382},{"className":272381},[],[272383],{"type":23,"value":220861},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272386,"children":272388},{"className":272387},[],[272389],{"type":23,"value":26302},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272392,"children":272394},{"className":272393},[],[272395],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272398,"children":272400},{"className":272399},[],[272401],{"type":23,"value":219481},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272404,"children":272406},{"className":272405},[],[272407],{"type":23,"value":220819},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272410,"children":272412},{"className":272411},[],[272413],{"type":23,"value":220828},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272416,"children":272418},{"className":272417},[],[272419],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272422,"children":272424},{"className":272423},[],[272425],{"type":23,"value":187836},{"type":17,"tag":7239,"props":272427,"children":272428},{},[272429,272437,272442],{"type":17,"tag":7266,"props":272430,"children":272431},{},[272432],{"type":17,"tag":48,"props":272433,"children":272434},{},[272435],{"type":23,"value":272436},"bill",{"type":17,"tag":7266,"props":272438,"children":272439},{},[272440],{"type":23,"value":272441},"Accounts payable records for expense and cash-out analysis",{"type":17,"tag":7266,"props":272443,"children":272444},{},[272445,272450,272451,272456,272457,272462,272463,272468,272469,272474,272475,272480,272481],{"type":17,"tag":6121,"props":272446,"children":272448},{"className":272447},[],[272449],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272452,"children":272454},{"className":272453},[],[272455],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272458,"children":272460},{"className":272459},[],[272461],{"type":23,"value":219481},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272464,"children":272466},{"className":272465},[],[272467],{"type":23,"value":220819},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272470,"children":272472},{"className":272471},[],[272473],{"type":23,"value":124766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272476,"children":272478},{"className":272477},[],[272479],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272482,"children":272484},{"className":272483},[],[272485],{"type":23,"value":187836},{"type":17,"tag":7239,"props":272487,"children":272488},{},[272489,272496,272501],{"type":17,"tag":7266,"props":272490,"children":272491},{},[272492],{"type":17,"tag":48,"props":272493,"children":272494},{},[272495],{"type":23,"value":190476},{"type":17,"tag":7266,"props":272497,"children":272498},{},[272499],{"type":23,"value":272500},"Aggregated financial statements",{"type":17,"tag":7266,"props":272502,"children":272503},{},[272504,272510,272511,272516,272517,272522,272523,272528,272529,272535,272536,272542,272543],{"type":17,"tag":6121,"props":272505,"children":272507},{"className":272506},[],[272508],{"type":23,"value":272509},"type (balance_sheet, profit_and_loss, trial_balance)",{"type":23,"value":11826},{"type":17,"tag":6121,"props":272512,"children":272514},{"className":272513},[],[272515],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272518,"children":272520},{"className":272519},[],[272521],{"type":23,"value":21060},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272524,"children":272526},{"className":272525},[],[272527],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272530,"children":272532},{"className":272531},[],[272533],{"type":23,"value":272534},"balance_sheet",{"type":23,"value":11826},{"type":17,"tag":6121,"props":272537,"children":272539},{"className":272538},[],[272540],{"type":23,"value":272541},"profit_and_loss",{"type":23,"value":11826},{"type":17,"tag":6121,"props":272544,"children":272546},{"className":272545},[],[272547],{"type":23,"value":272548},"trial_balance",{"type":17,"tag":7239,"props":272550,"children":272551},{},[272552,272559,272564],{"type":17,"tag":7266,"props":272553,"children":272554},{},[272555],{"type":17,"tag":48,"props":272556,"children":272557},{},[272558],{"type":23,"value":17941},{"type":17,"tag":7266,"props":272560,"children":272561},{},[272562],{"type":23,"value":272563},"Entity metadata for consolidation",{"type":17,"tag":7266,"props":272565,"children":272566},{},[272567,272572,272573,272578,272579,272584,272585,272590,272591],{"type":17,"tag":6121,"props":272568,"children":272570},{"className":272569},[],[272571],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272574,"children":272576},{"className":272575},[],[272577],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272580,"children":272582},{"className":272581},[],[272583],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272586,"children":272588},{"className":272587},[],[272589],{"type":23,"value":237400},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272592,"children":272594},{"className":272593},[],[272595],{"type":23,"value":22305},{"type":17,"tag":239,"props":272597,"children":272599},{"id":272598},"data-flow-for-financial-analysis",[272600],{"type":23,"value":272601},"Data Flow for Financial Analysis",{"type":17,"tag":6154,"props":272603,"children":272604},{},[272605,272620,272648,272676,272686],{"type":17,"tag":84,"props":272606,"children":272607},{},[272608,272612,272614,272619],{"type":17,"tag":48,"props":272609,"children":272610},{},[272611],{"type":23,"value":251948},{"type":23,"value":272613}," the customer's accounting system via Unified Connect to receive a ",{"type":17,"tag":6121,"props":272615,"children":272617},{"className":272616},[],[272618],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":84,"props":272621,"children":272622},{},[272623,272628,272629,272634,272635,272640,272641,272646],{"type":17,"tag":48,"props":272624,"children":272625},{},[272626],{"type":23,"value":272627},"Fetch",{"type":23,"value":18757},{"type":17,"tag":6121,"props":272630,"children":272632},{"className":272631},[],[272633],{"type":23,"value":17941},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272636,"children":272638},{"className":272637},[],[272639],{"type":23,"value":89108},{"type":23,"value":12561},{"type":17,"tag":6121,"props":272642,"children":272644},{"className":272643},[],[272645],{"type":23,"value":190476},{"type":23,"value":272647}," objects for baseline data.",{"type":17,"tag":84,"props":272649,"children":272650},{},[272651,272656,272657,272662,272663,272668,272669,272674],{"type":17,"tag":48,"props":272652,"children":272653},{},[272654],{"type":23,"value":272655},"Ingest",{"type":23,"value":18757},{"type":17,"tag":6121,"props":272658,"children":272660},{"className":272659},[],[272661],{"type":23,"value":272292},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272664,"children":272666},{"className":272665},[],[272667],{"type":23,"value":108682},{"type":23,"value":12561},{"type":17,"tag":6121,"props":272670,"children":272672},{"className":272671},[],[272673],{"type":23,"value":272436},{"type":23,"value":272675}," objects for granular KPIs and drill-downs.",{"type":17,"tag":84,"props":272677,"children":272678},{},[272679,272684],{"type":17,"tag":48,"props":272680,"children":272681},{},[272682],{"type":23,"value":272683},"Normalize",{"type":23,"value":272685}," currency and map accounts by type, section, and group for consistent reporting.",{"type":17,"tag":84,"props":272687,"children":272688},{},[272689,272694,272696,272700],{"type":17,"tag":48,"props":272690,"children":272691},{},[272692],{"type":23,"value":272693},"Subscribe",{"type":23,"value":272695}," to ",{"type":17,"tag":133,"props":272697,"children":272698},{"href":4999},[272699],{"type":23,"value":5002},{"type":23,"value":272701}," or database sync for real-time updates to dashboards and alerts.",{"type":17,"tag":29,"props":272703,"children":272704},{},[272705],{"type":23,"value":272706},"This unified workflow standardizes how your product handles financial data — across any accounting provider.",{"type":17,"tag":239,"props":272708,"children":272710},{"id":272709},"supported-accounting-platforms",[272711],{"type":23,"value":272712},"Supported Accounting Platforms",{"type":17,"tag":29,"props":272714,"children":272715},{},[272716,272717,272722],{"type":23,"value":254333},{"type":17,"tag":48,"props":272718,"children":272719},{},[272720],{"type":23,"value":272721},"32+ accounting integrations",{"type":23,"value":109313},{"type":17,"tag":3414,"props":272724,"children":272725},{},[272726],{"type":17,"tag":29,"props":272727,"children":272728},{},[272729],{"type":17,"tag":48,"props":272730,"children":272731},{},[272732],{"type":23,"value":272733},"QuickBooks, Xero, Sage Accounting, Zoho Books, NetSuite, FreshBooks, Wave, MYOB, Pennylane, Holded, Shopify (orders), and more.",{"type":17,"tag":29,"props":272735,"children":272736},{},[272737,272738,272744,272746,272752],{"type":23,"value":269743},{"type":17,"tag":133,"props":272739,"children":272741},{"href":83766,"rel":272740},[214],[272742],{"type":23,"value":272743},"supported Accounting integrations",{"type":23,"value":272745}," or explore the ",{"type":17,"tag":133,"props":272747,"children":272749},{"href":108383,"rel":272748},[214],[272750],{"type":23,"value":272751},"Accounting API documentation",{"type":23,"value":272753}," for implementation details.",{"type":17,"tag":239,"props":272755,"children":272756},{"id":268424},[272757],{"type":23,"value":268427},{"type":17,"tag":29,"props":272759,"children":272760},{},[272761],{"type":23,"value":272762},"For PMs and engineers building financial or analytics products:",{"type":17,"tag":80,"props":272764,"children":272765},{},[272766,272776,272786,272795],{"type":17,"tag":84,"props":272767,"children":272768},{},[272769,272774],{"type":17,"tag":48,"props":272770,"children":272771},{},[272772],{"type":23,"value":272773},"One build, 32+ systems",{"type":23,"value":272775}," — no per-vendor accounting logic",{"type":17,"tag":84,"props":272777,"children":272778},{},[272779,272784],{"type":17,"tag":48,"props":272780,"children":272781},{},[272782],{"type":23,"value":272783},"Normalized ledgers and reports",{"type":23,"value":272785}," — unified schemas for faster insights",{"type":17,"tag":84,"props":272787,"children":272788},{},[272789,272793],{"type":17,"tag":48,"props":272790,"children":272791},{},[272792],{"type":23,"value":13156},{"type":23,"value":272794}," — webhook or DB sync ensures dashboards stay current",{"type":17,"tag":84,"props":272796,"children":272797},{},[272798,272803],{"type":17,"tag":48,"props":272799,"children":272800},{},[272801],{"type":23,"value":272802},"Multi-entity support",{"type":23,"value":272804}," — consolidate data across currencies and organizations",{"type":17,"tag":29,"props":272806,"children":272807},{},[272808],{"type":23,"value":272809},"Launch financial analytics, dashboards, or forecasting tools that work with every accounting system.",{"type":17,"tag":29,"props":272811,"children":272812},{},[272813,272821,272822,272830],{"type":17,"tag":133,"props":272814,"children":272816},{"href":158861,"rel":272815},[214],[272817],{"type":17,"tag":48,"props":272818,"children":272819},{},[272820],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":272823,"children":272825},{"href":1623,"rel":272824},[214],[272826],{"type":17,"tag":48,"props":272827,"children":272828},{},[272829],{"type":23,"value":226481},{"type":23,"value":272831}," to see how Unified.to accelerates financial data workflows.",{"title":7,"searchDepth":1629,"depth":1629,"links":272833},[272834,272835,272836,272837,272838],{"id":272142,"depth":1635,"text":272145},{"id":272175,"depth":1635,"text":272178},{"id":272598,"depth":1635,"text":272601},{"id":272709,"depth":1635,"text":272712},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_analyze_financial_data_across_quickbooks_xero_netsuite_and_other_accounting_platforms_with_a_unified_api.md","blog/how_to_analyze_financial_data_across_quickbooks_xero_netsuite_and_other_accounting_platforms_with_a_unified_api.md","blog/how_to_analyze_financial_data_across_quickbooks_xero_netsuite_and_other_accounting_platforms_with_a_unified_api",{"_path":272843,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":272844,"description":272845,"img":272846,"date":271473,"tag":12,"body":272847,"_type":1677,"_id":273575,"_source":1679,"_file":273576,"_stem":273577,"_extension":1682},"/blog/how_to_automate_invoicing_across_quickbooks_xero_and_30_accounting_platforms_with_a_unified_api","How to Automate Invoicing Across QuickBooks, Xero, and 30+ Accounting Platforms with a Unified API","Modern SaaS products often need to generate invoices, reconcile payments, and sync financial data across multiple accounting systems. But every provider — from...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_automate_invoicing_across_quickbooks_xero_and_30_accounting_platforms_with_a_unified_api-icon.png",{"type":14,"children":272848,"toc":273568},[272849,272854,272857,272864,272869,272879,272885,272889,272907,272911,272916,273377,273383,273388,273451,273457,273467,273475,273491,273495,273500,273541,273546],{"type":17,"tag":18,"props":272850,"children":272852},{"id":272851},"how-to-automate-invoicing-across-quickbooks-xero-and-30-accounting-platforms-with-a-unified-api",[272853],{"type":23,"value":272844},{"type":17,"tag":25,"props":272855,"children":272856},{},[],{"type":17,"tag":29,"props":272858,"children":272859},{},[272860],{"type":17,"tag":33,"props":272861,"children":272862},{},[272863],{"type":23,"value":271491},{"type":17,"tag":29,"props":272865,"children":272866},{},[272867],{"type":23,"value":272868},"Modern SaaS products often need to generate invoices, reconcile payments, and sync financial data across multiple accounting systems. But every provider — from QuickBooks and Xero to NetSuite and Zoho — uses different objects, tax models, and APIs, creating unnecessary friction for developers and finance teams.",{"type":17,"tag":29,"props":272870,"children":272871},{},[272872,272873,272877],{"type":23,"value":9619},{"type":17,"tag":133,"props":272874,"children":272875},{"href":7691},[272876],{"type":23,"value":7459},{"type":23,"value":272878}," eliminates that complexity. Unified.to connects to your customers' accounting applications and provides normalized, real-time accounting objects — invoices, payments, tax rates, and contacts — so your product can automatically create, send, and reconcile invoices without per-vendor code.",{"type":17,"tag":239,"props":272880,"children":272882},{"id":272881},"when-to-use-automated-invoicing",[272883],{"type":23,"value":272884},"When to Use Automated Invoicing",{"type":17,"tag":29,"props":272886,"children":272887},{},[272888],{"type":23,"value":254154},{"type":17,"tag":80,"props":272890,"children":272891},{},[272892,272897,272902],{"type":17,"tag":84,"props":272893,"children":272894},{},[272895],{"type":23,"value":272896},"Automatically generate and send invoices for product usage or subscriptions",{"type":17,"tag":84,"props":272898,"children":272899},{},[272900],{"type":23,"value":272901},"Sync customers, items, tax rates, and payments across ERPs and accounting tools",{"type":17,"tag":84,"props":272903,"children":272904},{},[272905],{"type":23,"value":272906},"Standardize reporting and analytics across multiple accounting providers",{"type":17,"tag":239,"props":272908,"children":272909},{"id":272175},[272910],{"type":23,"value":272178},{"type":17,"tag":29,"props":272912,"children":272913},{},[272914],{"type":23,"value":272915},"Unified.to provides consistent schemas across all supported accounting platforms:",{"type":17,"tag":7231,"props":272917,"children":272918},{},[272919,272937],{"type":17,"tag":7235,"props":272920,"children":272921},{},[272922],{"type":17,"tag":7239,"props":272923,"children":272924},{},[272925,272929,272933],{"type":17,"tag":7243,"props":272926,"children":272927},{},[272928],{"type":23,"value":18594},{"type":17,"tag":7243,"props":272930,"children":272931},{},[272932],{"type":23,"value":24525},{"type":17,"tag":7243,"props":272934,"children":272935},{},[272936],{"type":23,"value":22096},{"type":17,"tag":7259,"props":272938,"children":272939},{},[272940,273042,273104,273162,273230,273280,273330],{"type":17,"tag":7239,"props":272941,"children":272942},{},[272943,272950,272955],{"type":17,"tag":7266,"props":272944,"children":272945},{},[272946],{"type":17,"tag":48,"props":272947,"children":272948},{},[272949],{"type":23,"value":108682},{"type":17,"tag":7266,"props":272951,"children":272952},{},[272953],{"type":23,"value":272954},"Customer invoice with line items, totals, and status",{"type":17,"tag":7266,"props":272956,"children":272957},{},[272958,272963,272964,272969,272970,272975,272976,272981,272982,272988,272989,272995,272996,273002,273003,273009,273010,273016,273017,273023,273024,273029,273030,273035,273036],{"type":17,"tag":6121,"props":272959,"children":272961},{"className":272960},[],[272962],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272965,"children":272967},{"className":272966},[],[272968],{"type":23,"value":220861},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272971,"children":272973},{"className":272972},[],[272974],{"type":23,"value":108877},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272977,"children":272979},{"className":272978},[],[272980],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":272983,"children":272985},{"className":272984},[],[272986],{"type":23,"value":272987},"status (DRAFT, SENT, PAID, VOID)",{"type":23,"value":11826},{"type":17,"tag":6121,"props":272990,"children":272992},{"className":272991},[],[272993],{"type":23,"value":272994},"issue_date",{"type":23,"value":11826},{"type":17,"tag":6121,"props":272997,"children":272999},{"className":272998},[],[273000],{"type":23,"value":273001},"due_date",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273004,"children":273006},{"className":273005},[],[273007],{"type":23,"value":273008},"line_items[] (item_id, description, quantity, unit_price, tax_rate_id)",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273011,"children":273013},{"className":273012},[],[273014],{"type":23,"value":273015},"subtotal",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273018,"children":273020},{"className":273019},[],[273021],{"type":23,"value":273022},"tax_total",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273025,"children":273027},{"className":273026},[],[273028],{"type":23,"value":123952},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273031,"children":273033},{"className":273032},[],[273034],{"type":23,"value":272255},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273037,"children":273039},{"className":273038},[],[273040],{"type":23,"value":273041},"pdf_url",{"type":17,"tag":7239,"props":273043,"children":273044},{},[273045,273052,273057],{"type":17,"tag":7266,"props":273046,"children":273047},{},[273048],{"type":17,"tag":48,"props":273049,"children":273050},{},[273051],{"type":23,"value":43625},{"type":17,"tag":7266,"props":273053,"children":273054},{},[273055],{"type":23,"value":273056},"Billing entity for invoices",{"type":17,"tag":7266,"props":273058,"children":273059},{},[273060,273065,273066,273071,273072,273077,273078,273083,273084,273090,273091,273097,273098],{"type":17,"tag":6121,"props":273061,"children":273063},{"className":273062},[],[273064],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273067,"children":273069},{"className":273068},[],[273070],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273073,"children":273075},{"className":273074},[],[273076],{"type":23,"value":50735},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273079,"children":273081},{"className":273080},[],[273082],{"type":23,"value":62786},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273085,"children":273087},{"className":273086},[],[273088],{"type":23,"value":273089},"billing_address",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273092,"children":273094},{"className":273093},[],[273095],{"type":23,"value":273096},"shipping_address",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273099,"children":273101},{"className":273100},[],[273102],{"type":23,"value":273103},"tax_number",{"type":17,"tag":7239,"props":273105,"children":273106},{},[273107,273115,273120],{"type":17,"tag":7266,"props":273108,"children":273109},{},[273110],{"type":17,"tag":48,"props":273111,"children":273112},{},[273113],{"type":23,"value":273114},"item",{"type":17,"tag":7266,"props":273116,"children":273117},{},[273118],{"type":23,"value":273119},"Product or service used on invoices",{"type":17,"tag":7266,"props":273121,"children":273122},{},[273123,273128,273129,273134,273135,273141,273142,273148,273149,273155,273156],{"type":17,"tag":6121,"props":273124,"children":273126},{"className":273125},[],[273127],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273130,"children":273132},{"className":273131},[],[273133],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273136,"children":273138},{"className":273137},[],[273139],{"type":23,"value":273140},"sku",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273143,"children":273145},{"className":273144},[],[273146],{"type":23,"value":273147},"unit_price",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273150,"children":273152},{"className":273151},[],[273153],{"type":23,"value":273154},"tax_rate_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273157,"children":273159},{"className":273158},[],[273160],{"type":23,"value":273161},"income_account",{"type":17,"tag":7239,"props":273163,"children":273164},{},[273165,273172,273177],{"type":17,"tag":7266,"props":273166,"children":273167},{},[273168],{"type":17,"tag":48,"props":273169,"children":273170},{},[273171],{"type":23,"value":71492},{"type":17,"tag":7266,"props":273173,"children":273174},{},[273175],{"type":23,"value":273176},"Payment applied to an invoice",{"type":17,"tag":7266,"props":273178,"children":273179},{},[273180,273185,273186,273191,273192,273197,273198,273203,273204,273210,273211,273217,273218,273224,273225],{"type":17,"tag":6121,"props":273181,"children":273183},{"className":273182},[],[273184],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273187,"children":273189},{"className":273188},[],[273190],{"type":23,"value":109123},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273193,"children":273195},{"className":273194},[],[273196],{"type":23,"value":25890},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273199,"children":273201},{"className":273200},[],[273202],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273205,"children":273207},{"className":273206},[],[273208],{"type":23,"value":273209},"payment_date",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273212,"children":273214},{"className":273213},[],[273215],{"type":23,"value":273216},"method",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273219,"children":273221},{"className":273220},[],[273222],{"type":23,"value":273223},"transaction_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273226,"children":273228},{"className":273227},[],[273229],{"type":23,"value":19949},{"type":17,"tag":7239,"props":273231,"children":273232},{},[273233,273241,273246],{"type":17,"tag":7266,"props":273234,"children":273235},{},[273236],{"type":17,"tag":48,"props":273237,"children":273238},{},[273239],{"type":23,"value":273240},"credit_note",{"type":17,"tag":7266,"props":273242,"children":273243},{},[273244],{"type":23,"value":273245},"Negative invoice for refunds or adjustments",{"type":17,"tag":7266,"props":273247,"children":273248},{},[273249,273254,273255,273260,273261,273267,273268,273273,273274],{"type":17,"tag":6121,"props":273250,"children":273252},{"className":273251},[],[273253],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273256,"children":273258},{"className":273257},[],[273259],{"type":23,"value":108877},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273262,"children":273264},{"className":273263},[],[273265],{"type":23,"value":273266},"line_items[]",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273269,"children":273271},{"className":273270},[],[273272],{"type":23,"value":123952},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273275,"children":273277},{"className":273276},[],[273278],{"type":23,"value":273279},"applied_to_invoice_id",{"type":17,"tag":7239,"props":273281,"children":273282},{},[273283,273291,273296],{"type":17,"tag":7266,"props":273284,"children":273285},{},[273286],{"type":17,"tag":48,"props":273287,"children":273288},{},[273289],{"type":23,"value":273290},"tax_rate",{"type":17,"tag":7266,"props":273292,"children":273293},{},[273294],{"type":23,"value":273295},"Tax configuration object",{"type":17,"tag":7266,"props":273297,"children":273298},{},[273299,273304,273305,273310,273311,273316,273317,273323,273324],{"type":17,"tag":6121,"props":273300,"children":273302},{"className":273301},[],[273303],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273306,"children":273308},{"className":273307},[],[273309],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273312,"children":273314},{"className":273313},[],[273315],{"type":23,"value":105471},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273318,"children":273320},{"className":273319},[],[273321],{"type":23,"value":273322},"jurisdiction",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273325,"children":273327},{"className":273326},[],[273328],{"type":23,"value":273329},"inclusive",{"type":17,"tag":7239,"props":273331,"children":273332},{},[273333,273340,273345],{"type":17,"tag":7266,"props":273334,"children":273335},{},[273336],{"type":17,"tag":48,"props":273337,"children":273338},{},[273339],{"type":23,"value":124562},{"type":17,"tag":7266,"props":273341,"children":273342},{},[273343],{"type":23,"value":273344},"Real-time change delivery",{"type":17,"tag":7266,"props":273346,"children":273347},{},[273348,273353,273354,273359,273360,273365,273366,273371,273372],{"type":17,"tag":6121,"props":273349,"children":273351},{"className":273350},[],[273352],{"type":23,"value":161193},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273355,"children":273357},{"className":273356},[],[273358],{"type":23,"value":62633},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273361,"children":273363},{"className":273362},[],[273364],{"type":23,"value":178128},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273367,"children":273369},{"className":273368},[],[273370],{"type":23,"value":77777},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273373,"children":273375},{"className":273374},[],[273376],{"type":23,"value":27310},{"type":17,"tag":239,"props":273378,"children":273380},{"id":273379},"data-flow-for-automated-invoicing",[273381],{"type":23,"value":273382},"Data Flow for Automated Invoicing",{"type":17,"tag":29,"props":273384,"children":273385},{},[273386],{"type":23,"value":273387},"Unified.to standardizes how financial events and invoices flow through your product:",{"type":17,"tag":6154,"props":273389,"children":273390},{},[273391,273405,273415,273425,273435],{"type":17,"tag":84,"props":273392,"children":273393},{},[273394,273398,273399,273404],{"type":17,"tag":48,"props":273395,"children":273396},{},[273397],{"type":23,"value":251948},{"type":23,"value":272613},{"type":17,"tag":6121,"props":273400,"children":273402},{"className":273401},[],[273403],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":84,"props":273406,"children":273407},{},[273408,273413],{"type":17,"tag":48,"props":273409,"children":273410},{},[273411],{"type":23,"value":273412},"Sync master data",{"type":23,"value":273414}," such as customers, items, and tax rates through normalized endpoints.",{"type":17,"tag":84,"props":273416,"children":273417},{},[273418,273423],{"type":17,"tag":48,"props":273419,"children":273420},{},[273421],{"type":23,"value":273422},"Create invoices",{"type":23,"value":273424}," from business triggers — usage metering, subscription renewal, or order creation.",{"type":17,"tag":84,"props":273426,"children":273427},{},[273428,273433],{"type":17,"tag":48,"props":273429,"children":273430},{},[273431],{"type":23,"value":273432},"Send invoices",{"type":23,"value":273434}," through the customer's chosen provider (email, PDF, or portal).",{"type":17,"tag":84,"props":273436,"children":273437},{},[273438,273443,273445,273449],{"type":17,"tag":48,"props":273439,"children":273440},{},[273441],{"type":23,"value":273442},"Capture payments",{"type":23,"value":273444}," in real time via ",{"type":17,"tag":133,"props":273446,"children":273447},{"href":4999},[273448],{"type":23,"value":5002},{"type":23,"value":273450}," and automatically apply them to open invoices.",{"type":17,"tag":239,"props":273452,"children":273454},{"id":273453},"supported-accounting-payment-platforms",[273455],{"type":23,"value":273456},"Supported Accounting & Payment Platforms",{"type":17,"tag":29,"props":273458,"children":273459},{},[273460,273461,273466],{"type":23,"value":254333},{"type":17,"tag":48,"props":273462,"children":273463},{},[273464],{"type":23,"value":273465},"32+ accounting and finance integrations",{"type":23,"value":109313},{"type":17,"tag":3414,"props":273468,"children":273469},{},[273470],{"type":17,"tag":29,"props":273471,"children":273472},{},[273473],{"type":23,"value":273474},"QuickBooks, Xero, FreshBooks, Sage Intacct, NetSuite, Wave, MYOB, Pennylane, Holded, Zoho Books, Zoho Invoice, Microsoft Dynamics 365 (Business Central, Sales, and Customer Engagement), Shopify, WooCommerce, BigCommerce, SquareUp, Stripe, GoCardless, PayPal, Chargebee, Brex, Ramp, and more.",{"type":17,"tag":29,"props":273476,"children":273477},{},[273478,273479,273484,273485,273490],{"type":23,"value":269743},{"type":17,"tag":133,"props":273480,"children":273482},{"href":83766,"rel":273481},[214],[273483],{"type":23,"value":272743},{"type":23,"value":272003},{"type":17,"tag":133,"props":273486,"children":273488},{"href":108383,"rel":273487},[214],[273489],{"type":23,"value":272751},{"type":23,"value":272753},{"type":17,"tag":239,"props":273492,"children":273493},{"id":268424},[273494],{"type":23,"value":268427},{"type":17,"tag":29,"props":273496,"children":273497},{},[273498],{"type":23,"value":273499},"For PMs and engineers building SaaS or fintech products:",{"type":17,"tag":80,"props":273501,"children":273502},{},[273503,273513,273522,273531],{"type":17,"tag":84,"props":273504,"children":273505},{},[273506,273511],{"type":17,"tag":48,"props":273507,"children":273508},{},[273509],{"type":23,"value":273510},"One build, 30+ systems",{"type":23,"value":273512}," — launch invoicing across every accounting platform",{"type":17,"tag":84,"props":273514,"children":273515},{},[273516,273520],{"type":17,"tag":48,"props":273517,"children":273518},{},[273519],{"type":23,"value":272041},{"type":23,"value":273521}," — invoices, contacts, and payments all follow consistent data models",{"type":17,"tag":84,"props":273523,"children":273524},{},[273525,273529],{"type":17,"tag":48,"props":273526,"children":273527},{},[273528],{"type":23,"value":268961},{"type":23,"value":273530}," — webhook and DB sync keep balances and statuses up to date",{"type":17,"tag":84,"props":273532,"children":273533},{},[273534,273539],{"type":17,"tag":48,"props":273535,"children":273536},{},[273537],{"type":23,"value":273538},"Automation-ready",{"type":23,"value":273540}," — trigger billing events from usage, subscriptions, or external systems",{"type":17,"tag":29,"props":273542,"children":273543},{},[273544],{"type":23,"value":273545},"Launch automated invoicing and accounting workflows in days — not months.",{"type":17,"tag":29,"props":273547,"children":273548},{},[273549,273557,273558,273566],{"type":17,"tag":133,"props":273550,"children":273552},{"href":158861,"rel":273551},[214],[273553],{"type":17,"tag":48,"props":273554,"children":273555},{},[273556],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":273559,"children":273561},{"href":1623,"rel":273560},[214],[273562],{"type":17,"tag":48,"props":273563,"children":273564},{},[273565],{"type":23,"value":226481},{"type":23,"value":273567}," to see how Unified.to accelerates financial automation.",{"title":7,"searchDepth":1629,"depth":1629,"links":273569},[273570,273571,273572,273573,273574],{"id":272881,"depth":1635,"text":272884},{"id":272175,"depth":1635,"text":272178},{"id":273379,"depth":1635,"text":273382},{"id":273453,"depth":1635,"text":273456},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_automate_invoicing_across_quickbooks_xero_and_30_accounting_platforms_with_a_unified_api.md","blog/how_to_automate_invoicing_across_quickbooks_xero_and_30_accounting_platforms_with_a_unified_api.md","blog/how_to_automate_invoicing_across_quickbooks_xero_and_30_accounting_platforms_with_a_unified_api",{"_path":273579,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":273580,"description":273581,"img":273582,"date":271473,"tag":12,"body":273583,"_type":1677,"_id":274184,"_source":1679,"_file":274185,"_stem":274186,"_extension":1682},"/blog/how_to_build_calendar_scheduling_across_google_outlook_and_15_platforms_with_a_unified_api","How to Build Calendar Scheduling Across Google, Outlook, and 15+ Platforms with a Unified API","Every SaaS product that handles meetings, onboarding, interviews, or demos eventually needs calendar scheduling. The problem, every calendar platform—Google...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_calendar_scheduling_across_google_outlook_and_15_platforms_with_a_unified_api-icon.png",{"type":14,"children":273584,"toc":274177},[273585,273590,273593,273600,273605,273615,273621,273625,273673,273679,273684,273966,273972,273977,274053,274058,274064,274074,274082,274099,274103,274108,274150,274155],{"type":17,"tag":18,"props":273586,"children":273588},{"id":273587},"how-to-build-calendar-scheduling-across-google-outlook-and-15-platforms-with-a-unified-api",[273589],{"type":23,"value":273580},{"type":17,"tag":25,"props":273591,"children":273592},{},[],{"type":17,"tag":29,"props":273594,"children":273595},{},[273596],{"type":17,"tag":33,"props":273597,"children":273598},{},[273599],{"type":23,"value":271491},{"type":17,"tag":29,"props":273601,"children":273602},{},[273603],{"type":23,"value":273604},"Every SaaS product that handles meetings, onboarding, interviews, or demos eventually needs calendar scheduling. The problem: every calendar platform—Google Calendar, Microsoft Outlook, Cal.com, and Calendly—uses different authentication models, schemas, and conferencing APIs.",{"type":17,"tag":29,"props":273606,"children":273607},{},[273608,273609,273613],{"type":23,"value":9619},{"type":17,"tag":133,"props":273610,"children":273611},{"href":7691},[273612],{"type":23,"value":7459},{"type":23,"value":273614}," removes that complexity. Unified.to lets your product offer scheduling, free-busy lookup, and one-click event creation across 19+ calendar and conferencing platforms. You can even embed a front-end scheduling component that delivers the same seamless experience users expect from tools like Calendly—without building per-vendor integrations.",{"type":17,"tag":239,"props":273616,"children":273618},{"id":273617},"when-to-use-calendar-scheduling",[273619],{"type":23,"value":273620},"When to Use Calendar Scheduling",{"type":17,"tag":29,"props":273622,"children":273623},{},[273624],{"type":23,"value":254154},{"type":17,"tag":80,"props":273626,"children":273627},{},[273628,273640,273652,273668],{"type":17,"tag":84,"props":273629,"children":273630},{},[273631,273633,273638],{"type":23,"value":273632},"Offer ",{"type":17,"tag":48,"props":273634,"children":273635},{},[273636],{"type":23,"value":273637},"Calendly-like booking",{"type":23,"value":273639}," directly inside your product",{"type":17,"tag":84,"props":273641,"children":273642},{},[273643,273645,273650],{"type":23,"value":273644},"Find mutual availability and free times across participants via normalized ",{"type":17,"tag":48,"props":273646,"children":273647},{},[273648],{"type":23,"value":273649},"free-busy",{"type":23,"value":273651}," data",{"type":17,"tag":84,"props":273653,"children":273654},{},[273655,273657,273662,273663],{"type":23,"value":273656},"Create events with ",{"type":17,"tag":48,"props":273658,"children":273659},{},[273660],{"type":23,"value":273661},"auto-generated conferencing links",{"type":23,"value":34435},{"type":17,"tag":48,"props":273664,"children":273665},{},[273666],{"type":23,"value":273667},"attendee invites",{"type":17,"tag":84,"props":273669,"children":273670},{},[273671],{"type":23,"value":273672},"Handle updates, cancellations, and reschedules in real time",{"type":17,"tag":239,"props":273674,"children":273676},{"id":273675},"normalized-calendar-objects",[273677],{"type":23,"value":273678},"Normalized Calendar Objects",{"type":17,"tag":29,"props":273680,"children":273681},{},[273682],{"type":23,"value":273683},"Unified.to provides a consistent schema for all major calendar and conferencing providers:",{"type":17,"tag":7231,"props":273685,"children":273686},{},[273687,273705],{"type":17,"tag":7235,"props":273688,"children":273689},{},[273690],{"type":17,"tag":7239,"props":273691,"children":273692},{},[273693,273697,273701],{"type":17,"tag":7243,"props":273694,"children":273695},{},[273696],{"type":23,"value":18594},{"type":17,"tag":7243,"props":273698,"children":273699},{},[273700],{"type":23,"value":24525},{"type":17,"tag":7243,"props":273702,"children":273703},{},[273704],{"type":23,"value":22096},{"type":17,"tag":7259,"props":273706,"children":273707},{},[273708,273749,273792,273865,273919],{"type":17,"tag":7239,"props":273709,"children":273710},{},[273711,273718,273723],{"type":17,"tag":7266,"props":273712,"children":273713},{},[273714],{"type":17,"tag":48,"props":273715,"children":273716},{},[273717],{"type":23,"value":99093},{"type":17,"tag":7266,"props":273719,"children":273720},{},[273721],{"type":23,"value":273722},"A user or resource calendar",{"type":17,"tag":7266,"props":273724,"children":273725},{},[273726,273731,273732,273737,273738,273743,273744],{"type":17,"tag":6121,"props":273727,"children":273729},{"className":273728},[],[273730],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273733,"children":273735},{"className":273734},[],[273736],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273739,"children":273741},{"className":273740},[],[273742],{"type":23,"value":22305},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273745,"children":273747},{"className":273746},[],[273748],{"type":23,"value":167996},{"type":17,"tag":7239,"props":273750,"children":273751},{},[273752,273760,273765],{"type":17,"tag":7266,"props":273753,"children":273754},{},[273755],{"type":17,"tag":48,"props":273756,"children":273757},{},[273758],{"type":23,"value":273759},"freebusy",{"type":17,"tag":7266,"props":273761,"children":273762},{},[273763],{"type":23,"value":273764},"Availability over a given time window",{"type":17,"tag":7266,"props":273766,"children":273767},{},[273768,273773,273774,273779,273780,273786,273787],{"type":17,"tag":6121,"props":273769,"children":273771},{"className":273770},[],[273772],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273775,"children":273777},{"className":273776},[],[273778],{"type":23,"value":21060},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273781,"children":273783},{"className":273782},[],[273784],{"type":23,"value":273785},"busy[] (start_at, end_at)",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273788,"children":273790},{"className":273789},[],[273791],{"type":23,"value":113861},{"type":17,"tag":7239,"props":273793,"children":273794},{},[273795,273802,273807],{"type":17,"tag":7266,"props":273796,"children":273797},{},[273798],{"type":17,"tag":48,"props":273799,"children":273800},{},[273801],{"type":23,"value":62633},{"type":17,"tag":7266,"props":273803,"children":273804},{},[273805],{"type":23,"value":273806},"Meeting with participants and conferencing",{"type":17,"tag":7266,"props":273808,"children":273809},{},[273810,273815,273816,273821,273822,273827,273828,273833,273834,273840,273841,273847,273848,273853,273854,273859,273860],{"type":17,"tag":6121,"props":273811,"children":273813},{"className":273812},[],[273814],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273817,"children":273819},{"className":273818},[],[273820],{"type":23,"value":62346},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273823,"children":273825},{"className":273824},[],[273826],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273829,"children":273831},{"className":273830},[],[273832],{"type":23,"value":21060},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273835,"children":273837},{"className":273836},[],[273838],{"type":23,"value":273839},"attendees[] (email, response_status)",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273842,"children":273844},{"className":273843},[],[273845],{"type":23,"value":273846},"conference (provider, join_url, meeting_id)",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273849,"children":273851},{"className":273850},[],[273852],{"type":23,"value":74134},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273855,"children":273857},{"className":273856},[],[273858],{"type":23,"value":24679},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273861,"children":273863},{"className":273862},[],[273864],{"type":23,"value":19949},{"type":17,"tag":7239,"props":273866,"children":273867},{},[273868,273875,273880],{"type":17,"tag":7266,"props":273869,"children":273870},{},[273871],{"type":17,"tag":48,"props":273872,"children":273873},{},[273874],{"type":23,"value":145883},{"type":17,"tag":7266,"props":273876,"children":273877},{},[273878],{"type":23,"value":273879},"Video meeting recording and transcript",{"type":17,"tag":7266,"props":273881,"children":273882},{},[273883,273888,273889,273894,273895,273900,273901,273906,273907,273913,273914],{"type":17,"tag":6121,"props":273884,"children":273886},{"className":273885},[],[273887],{"type":23,"value":21051},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273890,"children":273892},{"className":273891},[],[273893],{"type":23,"value":21060},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273896,"children":273898},{"className":273897},[],[273899],{"type":23,"value":74080},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273902,"children":273904},{"className":273903},[],[273905],{"type":23,"value":74377},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273908,"children":273910},{"className":273909},[],[273911],{"type":23,"value":273912},"transcript",{"type":23,"value":11826},{"type":17,"tag":6121,"props":273915,"children":273917},{"className":273916},[],[273918],{"type":23,"value":74359},{"type":17,"tag":7239,"props":273920,"children":273921},{},[273922,273929,273934],{"type":17,"tag":7266,"props":273923,"children":273924},{},[273925],{"type":17,"tag":48,"props":273926,"children":273927},{},[273928],{"type":23,"value":124562},{"type":17,"tag":7266,"props":273930,"children":273931},{},[273932],{"type":23,"value":273933},"Real-time event change delivery",{"type":17,"tag":7266,"props":273935,"children":273936},{},[273937,273942,273943,273948,273949,273954,273955,273960,273961],{"type":17,"tag":6121,"props":273938,"children":273940},{"className":273939},[],[273941],{"type":23,"value":161193},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273944,"children":273946},{"className":273945},[],[273947],{"type":23,"value":62633},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273950,"children":273952},{"className":273951},[],[273953],{"type":23,"value":27310},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273956,"children":273958},{"className":273957},[],[273959],{"type":23,"value":178128},{"type":23,"value":11826},{"type":17,"tag":6121,"props":273962,"children":273964},{"className":273963},[],[273965],{"type":23,"value":77777},{"type":17,"tag":239,"props":273967,"children":273969},{"id":273968},"data-flow-for-calendar-scheduling",[273970],{"type":23,"value":273971},"Data Flow for Calendar Scheduling",{"type":17,"tag":29,"props":273973,"children":273974},{},[273975],{"type":23,"value":273976},"Unified standardizes the entire scheduling flow across providers:",{"type":17,"tag":6154,"props":273978,"children":273979},{},[273980,273989,273999,274009,274039],{"type":17,"tag":84,"props":273981,"children":273982},{},[273983,273987],{"type":17,"tag":48,"props":273984,"children":273985},{},[273986],{"type":23,"value":251948},{"type":23,"value":273988}," your customer's calendar (and conferencing tool if separate) via Unified.",{"type":17,"tag":84,"props":273990,"children":273991},{},[273992,273997],{"type":17,"tag":48,"props":273993,"children":273994},{},[273995],{"type":23,"value":273996},"Query",{"type":23,"value":273998}," free/busy data for one or more participants across a target window.",{"type":17,"tag":84,"props":274000,"children":274001},{},[274002,274007],{"type":17,"tag":48,"props":274003,"children":274004},{},[274005],{"type":23,"value":274006},"Select",{"type":23,"value":274008}," an available slot (applying buffers, work hours, or location rules).",{"type":17,"tag":84,"props":274010,"children":274011},{},[274012,274016,274018,274023,274024,274030,274032,274037],{"type":17,"tag":48,"props":274013,"children":274014},{},[274015],{"type":23,"value":42125},{"type":23,"value":274017}," an event with ",{"type":17,"tag":6121,"props":274019,"children":274021},{"className":274020},[],[274022],{"type":23,"value":271643},{"type":23,"value":34435},{"type":17,"tag":6121,"props":274025,"children":274027},{"className":274026},[],[274028],{"type":23,"value":274029},"conference.provider",{"type":23,"value":274031},"; Unified returns the ",{"type":17,"tag":6121,"props":274033,"children":274035},{"className":274034},[],[274036],{"type":23,"value":114138},{"type":23,"value":274038}," and delivers invites automatically.",{"type":17,"tag":84,"props":274040,"children":274041},{},[274042,274046,274047,274051],{"type":17,"tag":48,"props":274043,"children":274044},{},[274045],{"type":23,"value":272693},{"type":23,"value":272695},{"type":17,"tag":133,"props":274048,"children":274049},{"href":4999},[274050],{"type":23,"value":5002},{"type":23,"value":274052}," for updates or cancellations to keep your UI and reminders in sync.",{"type":17,"tag":29,"props":274054,"children":274055},{},[274056],{"type":23,"value":274057},"This workflow makes it simple to deliver real-time scheduling and conferencing in your own product experience.",{"type":17,"tag":239,"props":274059,"children":274061},{"id":274060},"supported-calendar-conferencing-platforms",[274062],{"type":23,"value":274063},"Supported Calendar & Conferencing Platforms",{"type":17,"tag":29,"props":274065,"children":274066},{},[274067,274068,274073],{"type":23,"value":254333},{"type":17,"tag":48,"props":274069,"children":274070},{},[274071],{"type":23,"value":274072},"19+ calendar and conferencing platforms",{"type":23,"value":109313},{"type":17,"tag":3414,"props":274075,"children":274076},{},[274077],{"type":17,"tag":29,"props":274078,"children":274079},{},[274080],{"type":23,"value":274081},"Google Calendar, Microsoft Outlook/Teams, Apple iCloud, Cal.com, Calendly, Google Meet, Microsoft Teams, and Zoom.",{"type":17,"tag":29,"props":274083,"children":274084},{},[274085,274086,274091,274093,274098],{"type":23,"value":269743},{"type":17,"tag":133,"props":274087,"children":274089},{"href":99025,"rel":274088},[214],[274090],{"type":23,"value":272001},{"type":23,"value":274092}," or review the ",{"type":17,"tag":133,"props":274094,"children":274096},{"href":99333,"rel":274095},[214],[274097],{"type":23,"value":272009},{"type":23,"value":272753},{"type":17,"tag":239,"props":274100,"children":274101},{"id":268424},[274102],{"type":23,"value":268427},{"type":17,"tag":29,"props":274104,"children":274105},{},[274106],{"type":23,"value":274107},"For PMs and engineers building scheduling or booking functionality:",{"type":17,"tag":80,"props":274109,"children":274110},{},[274111,274121,274131,274140],{"type":17,"tag":84,"props":274112,"children":274113},{},[274114,274119],{"type":17,"tag":48,"props":274115,"children":274116},{},[274117],{"type":23,"value":274118},"One API, all calendars",{"type":23,"value":274120}," — unify scheduling across 19+ platforms",{"type":17,"tag":84,"props":274122,"children":274123},{},[274124,274129],{"type":17,"tag":48,"props":274125,"children":274126},{},[274127],{"type":23,"value":274128},"Built-in conferencing",{"type":23,"value":274130}," — auto-generate Google Meet, Teams, or Zoom links",{"type":17,"tag":84,"props":274132,"children":274133},{},[274134,274138],{"type":17,"tag":48,"props":274135,"children":274136},{},[274137],{"type":23,"value":268961},{"type":23,"value":274139}," — webhook-driven updates for events and availability",{"type":17,"tag":84,"props":274141,"children":274142},{},[274143,274148],{"type":17,"tag":48,"props":274144,"children":274145},{},[274146],{"type":23,"value":274147},"Calendly-like UX",{"type":23,"value":274149}," — optional embedded scheduling component",{"type":17,"tag":29,"props":274151,"children":274152},{},[274153],{"type":23,"value":274154},"Deliver frictionless scheduling directly inside your product.",{"type":17,"tag":29,"props":274156,"children":274157},{},[274158,274166,274167,274175],{"type":17,"tag":133,"props":274159,"children":274161},{"href":158861,"rel":274160},[214],[274162],{"type":17,"tag":48,"props":274163,"children":274164},{},[274165],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":274168,"children":274170},{"href":1623,"rel":274169},[214],[274171],{"type":17,"tag":48,"props":274172,"children":274173},{},[274174],{"type":23,"value":226481},{"type":23,"value":274176}," to see how Unified.to accelerates your roadmap.",{"title":7,"searchDepth":1629,"depth":1629,"links":274178},[274179,274180,274181,274182,274183],{"id":273617,"depth":1635,"text":273620},{"id":273675,"depth":1635,"text":273678},{"id":273968,"depth":1635,"text":273971},{"id":274060,"depth":1635,"text":274063},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_build_calendar_scheduling_across_google_outlook_and_15_platforms_with_a_unified_api.md","blog/how_to_build_calendar_scheduling_across_google_outlook_and_15_platforms_with_a_unified_api.md","blog/how_to_build_calendar_scheduling_across_google_outlook_and_15_platforms_with_a_unified_api",{"_path":274188,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":274189,"description":274190,"img":274191,"date":271473,"tag":12,"body":274192,"_type":1677,"_id":274813,"_source":1679,"_file":274814,"_stem":274815,"_extension":1682},"/blog/how_to_build_customer_success_workflows_for_revenue_retention_and_expansion_with_a_unified_api","How to Build Customer Success Workflows for Revenue Retention and Expansion with a Unified API","Customer success teams depend on data spread across CRMs, accounting tools, and calendars to manage renewals, expansions, and proactive outreach. But...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_customer_success_workflows_for_revenue_retention_and_expansion_with_a_unified_api-icon.png",{"type":14,"children":274193,"toc":274806},[274194,274199,274202,274209,274214,274219,274225,274234,274285,274289,274448,274453,274459,274464,274632,274636,274723,274728,274732,274737,274780,274785],{"type":17,"tag":18,"props":274195,"children":274197},{"id":274196},"how-to-build-customer-success-workflows-for-revenue-retention-and-expansion-with-a-unified-api",[274198],{"type":23,"value":274189},{"type":17,"tag":25,"props":274200,"children":274201},{},[],{"type":17,"tag":29,"props":274203,"children":274204},{},[274205],{"type":17,"tag":33,"props":274206,"children":274207},{},[274208],{"type":23,"value":271491},{"type":17,"tag":29,"props":274210,"children":274211},{},[274212],{"type":23,"value":274213},"Customer success teams depend on data spread across CRMs, accounting tools, and calendars to manage renewals, expansions, and proactive outreach. But fragmented systems make it hard to see a unified customer picture—let alone act on it in real time.",{"type":17,"tag":29,"props":274215,"children":274216},{},[274217],{"type":23,"value":274218},"Unified.to enables CSM platforms to detect churn risk, identify upsell opportunities, and operationalize engagement through one real-time API. By combining normalized CRM, accounting, calendar, and GenAI data, your product can automate health scoring, QBR generation, and next-best-action recommendations—all without building or maintaining per-vendor integrations.",{"type":17,"tag":239,"props":274220,"children":274222},{"id":274221},"when-to-use-unified-for-cs-workflows",[274223],{"type":23,"value":274224},"When to Use Unified for CS Workflows",{"type":17,"tag":29,"props":274226,"children":274227},{},[274228,274229,274233],{"type":23,"value":268556},{"type":17,"tag":133,"props":274230,"children":274231},{"href":7691},[274232],{"type":23,"value":7459},{"type":23,"value":233792},{"type":17,"tag":80,"props":274235,"children":274236},{},[274237,274249,274261,274273],{"type":17,"tag":84,"props":274238,"children":274239},{},[274240,274242,274247],{"type":23,"value":274241},"Detect ",{"type":17,"tag":48,"props":274243,"children":274244},{},[274245],{"type":23,"value":274246},"churn risk early",{"type":23,"value":274248}," using normalized financial and engagement signals.",{"type":17,"tag":84,"props":274250,"children":274251},{},[274252,274254,274259],{"type":23,"value":274253},"Recommend ",{"type":17,"tag":48,"props":274255,"children":274256},{},[274257],{"type":23,"value":274258},"expansions and upsells",{"type":23,"value":274260}," based on adoption and usage trends.",{"type":17,"tag":84,"props":274262,"children":274263},{},[274264,274266,274271],{"type":23,"value":274265},"Auto-create ",{"type":17,"tag":48,"props":274267,"children":274268},{},[274269],{"type":23,"value":274270},"QBRs or cadence meetings",{"type":23,"value":274272}," and track follow-up actions.",{"type":17,"tag":84,"props":274274,"children":274275},{},[274276,274278,274283],{"type":23,"value":274277},"Standardize ",{"type":17,"tag":48,"props":274279,"children":274280},{},[274281],{"type":23,"value":274282},"CS playbooks and reporting",{"type":23,"value":274284}," across every customer account.",{"type":17,"tag":239,"props":274286,"children":274287},{"id":268033},[274288],{"type":23,"value":268036},{"type":17,"tag":7231,"props":274290,"children":274291},{},[274292,274310],{"type":17,"tag":7235,"props":274293,"children":274294},{},[274295],{"type":17,"tag":7239,"props":274296,"children":274297},{},[274298,274302,274306],{"type":17,"tag":7243,"props":274299,"children":274300},{},[274301],{"type":23,"value":268633},{"type":17,"tag":7243,"props":274303,"children":274304},{},[274305],{"type":23,"value":18594},{"type":17,"tag":7243,"props":274307,"children":274308},{},[274309],{"type":23,"value":20787},{"type":17,"tag":7259,"props":274311,"children":274312},{},[274313,274332,274351,274370,274390,274410,274429],{"type":17,"tag":7239,"props":274314,"children":274315},{},[274316,274323,274327],{"type":17,"tag":7266,"props":274317,"children":274318},{},[274319],{"type":17,"tag":48,"props":274320,"children":274321},{},[274322],{"type":23,"value":25731},{"type":17,"tag":7266,"props":274324,"children":274325},{},[274326],{"type":23,"value":270152},{"type":17,"tag":7266,"props":274328,"children":274329},{},[274330],{"type":23,"value":274331},"Anchor customer profile for health, risk, and value tracking.",{"type":17,"tag":7239,"props":274333,"children":274334},{},[274335,274342,274346],{"type":17,"tag":7266,"props":274336,"children":274337},{},[274338],{"type":17,"tag":48,"props":274339,"children":274340},{},[274341],{"type":23,"value":25731},{"type":17,"tag":7266,"props":274343,"children":274344},{},[274345],{"type":23,"value":25828},{"type":17,"tag":7266,"props":274347,"children":274348},{},[274349],{"type":23,"value":274350},"Associate key stakeholders and outreach history.",{"type":17,"tag":7239,"props":274352,"children":274353},{},[274354,274361,274365],{"type":17,"tag":7266,"props":274355,"children":274356},{},[274357],{"type":17,"tag":48,"props":274358,"children":274359},{},[274360],{"type":23,"value":25731},{"type":17,"tag":7266,"props":274362,"children":274363},{},[274364],{"type":23,"value":270193},{"type":17,"tag":7266,"props":274366,"children":274367},{},[274368],{"type":23,"value":274369},"Track renewals, upsells, and expansion opportunities.",{"type":17,"tag":7239,"props":274371,"children":274372},{},[274373,274380,274385],{"type":17,"tag":7266,"props":274374,"children":274375},{},[274376],{"type":17,"tag":48,"props":274377,"children":274378},{},[274379],{"type":23,"value":25731},{"type":17,"tag":7266,"props":274381,"children":274382},{},[274383],{"type":23,"value":274384},"Event / Note / Task",{"type":17,"tag":7266,"props":274386,"children":274387},{},[274388],{"type":23,"value":274389},"Write back CS insights, next steps, and follow-ups.",{"type":17,"tag":7239,"props":274391,"children":274392},{},[274393,274400,274405],{"type":17,"tag":7266,"props":274394,"children":274395},{},[274396],{"type":17,"tag":48,"props":274397,"children":274398},{},[274399],{"type":23,"value":104365},{"type":17,"tag":7266,"props":274401,"children":274402},{},[274403],{"type":23,"value":274404},"Account / Invoice / Transaction / Report",{"type":17,"tag":7266,"props":274406,"children":274407},{},[274408],{"type":23,"value":274409},"Analyze financial signals such as ARR, delinquency, or trendline changes.",{"type":17,"tag":7239,"props":274411,"children":274412},{},[274413,274420,274424],{"type":17,"tag":7266,"props":274414,"children":274415},{},[274416],{"type":17,"tag":48,"props":274417,"children":274418},{},[274419],{"type":23,"value":14515},{"type":17,"tag":7266,"props":274421,"children":274422},{},[274423],{"type":23,"value":14528},{"type":17,"tag":7266,"props":274425,"children":274426},{},[274427],{"type":23,"value":274428},"Schedule QBRs, cadence check-ins, and reminders.",{"type":17,"tag":7239,"props":274430,"children":274431},{},[274432,274439,274443],{"type":17,"tag":7266,"props":274433,"children":274434},{},[274435],{"type":17,"tag":48,"props":274436,"children":274437},{},[274438],{"type":23,"value":24595},{"type":17,"tag":7266,"props":274440,"children":274441},{},[274442],{"type":23,"value":268739},{"type":17,"tag":7266,"props":274444,"children":274445},{},[274446],{"type":23,"value":274447},"Summarize health, propose next-best actions, and draft outreach.",{"type":17,"tag":29,"props":274449,"children":274450},{},[274451],{"type":23,"value":274452},"All data is delivered in real time through Unified's normalized schemas—allowing you to calculate health scores, surface insights, and close the feedback loop inside your CRM.",{"type":17,"tag":239,"props":274454,"children":274456},{"id":274455},"data-flow-for-revenue-retention-expansion",[274457],{"type":23,"value":274458},"Data Flow for Revenue Retention & Expansion",{"type":17,"tag":29,"props":274460,"children":274461},{},[274462],{"type":23,"value":274463},"A single unified API connects all the moving parts:",{"type":17,"tag":7231,"props":274465,"children":274466},{},[274467,274488],{"type":17,"tag":7235,"props":274468,"children":274469},{},[274470],{"type":17,"tag":7239,"props":274471,"children":274472},{},[274473,274478,274483],{"type":17,"tag":7243,"props":274474,"children":274475},{},[274476],{"type":23,"value":274477},"Step",{"type":17,"tag":7243,"props":274479,"children":274480},{},[274481],{"type":23,"value":274482},"Action",{"type":17,"tag":7243,"props":274484,"children":274485},{},[274486],{"type":23,"value":274487},"Output",{"type":17,"tag":7259,"props":274489,"children":274490},{},[274491,274511,274531,274551,274571,274591,274611],{"type":17,"tag":7239,"props":274492,"children":274493},{},[274494,274501,274506],{"type":17,"tag":7266,"props":274495,"children":274496},{},[274497],{"type":17,"tag":48,"props":274498,"children":274499},{},[274500],{"type":23,"value":261914},{"type":17,"tag":7266,"props":274502,"children":274503},{},[274504],{"type":23,"value":274505},"Connect CRM, Accounting, Calendar, and GenAI integrations via embedded auth.",{"type":17,"tag":7266,"props":274507,"children":274508},{},[274509],{"type":23,"value":274510},"Connection IDs per customer.",{"type":17,"tag":7239,"props":274512,"children":274513},{},[274514,274521,274526],{"type":17,"tag":7266,"props":274515,"children":274516},{},[274517],{"type":17,"tag":48,"props":274518,"children":274519},{},[274520],{"type":23,"value":261697},{"type":17,"tag":7266,"props":274522,"children":274523},{},[274524],{"type":23,"value":274525},"Ingest normalized customer and financial data.",{"type":17,"tag":7266,"props":274527,"children":274528},{},[274529],{"type":23,"value":274530},"Health inputs: engagement, invoices, transactions, trends.",{"type":17,"tag":7239,"props":274532,"children":274533},{},[274534,274541,274546],{"type":17,"tag":7266,"props":274535,"children":274536},{},[274537],{"type":17,"tag":48,"props":274538,"children":274539},{},[274540],{"type":23,"value":230135},{"type":17,"tag":7266,"props":274542,"children":274543},{},[274544],{"type":23,"value":274545},"Score health and detect opportunities using your own rules or model.",{"type":17,"tag":7266,"props":274547,"children":274548},{},[274549],{"type":23,"value":274550},"Risk flags and expansion candidates.",{"type":17,"tag":7239,"props":274552,"children":274553},{},[274554,274561,274566],{"type":17,"tag":7266,"props":274555,"children":274556},{},[274557],{"type":17,"tag":48,"props":274558,"children":274559},{},[274560],{"type":23,"value":261738},{"type":17,"tag":7266,"props":274562,"children":274563},{},[274564],{"type":23,"value":274565},"Generate a CSM brief with GenAI—summaries and next-best actions.",{"type":17,"tag":7266,"props":274567,"children":274568},{},[274569],{"type":23,"value":274570},"Playbook-ready context and talking points.",{"type":17,"tag":7239,"props":274572,"children":274573},{},[274574,274581,274586],{"type":17,"tag":7266,"props":274575,"children":274576},{},[274577],{"type":17,"tag":48,"props":274578,"children":274579},{},[274580],{"type":23,"value":230170},{"type":17,"tag":7266,"props":274582,"children":274583},{},[274584],{"type":23,"value":274585},"Write back to CRM as Notes, Tasks, or Events—or create/advance Deals.",{"type":17,"tag":7266,"props":274587,"children":274588},{},[274589],{"type":23,"value":274590},"Structured customer timeline and owned actions.",{"type":17,"tag":7239,"props":274592,"children":274593},{},[274594,274601,274606],{"type":17,"tag":7266,"props":274595,"children":274596},{},[274597],{"type":17,"tag":48,"props":274598,"children":274599},{},[274600],{"type":23,"value":133904},{"type":17,"tag":7266,"props":274602,"children":274603},{},[274604],{"type":23,"value":274605},"Auto-schedule QBRs and cadence meetings in the customer's Calendar.",{"type":17,"tag":7266,"props":274607,"children":274608},{},[274609],{"type":23,"value":274610},"Events with attendees, reminders, and tracking.",{"type":17,"tag":7239,"props":274612,"children":274613},{},[274614,274622,274627],{"type":17,"tag":7266,"props":274615,"children":274616},{},[274617],{"type":17,"tag":48,"props":274618,"children":274619},{},[274620],{"type":23,"value":274621},"7",{"type":17,"tag":7266,"props":274623,"children":274624},{},[274625],{"type":23,"value":274626},"Monitor updates via webhooks or DB sync to refresh scores automatically.",{"type":17,"tag":7266,"props":274628,"children":274629},{},[274630],{"type":23,"value":274631},"Real-time, predictable retention pipeline.",{"type":17,"tag":239,"props":274633,"children":274634},{"id":270271},[274635],{"type":23,"value":270274},{"type":17,"tag":7231,"props":274637,"children":274638},{},[274639,274653],{"type":17,"tag":7235,"props":274640,"children":274641},{},[274642],{"type":17,"tag":7239,"props":274643,"children":274644},{},[274645,274649],{"type":17,"tag":7243,"props":274646,"children":274647},{},[274648],{"type":23,"value":7247},{"type":17,"tag":7243,"props":274650,"children":274651},{},[274652],{"type":23,"value":19017},{"type":17,"tag":7259,"props":274654,"children":274655},{},[274656,274671,274686,274701],{"type":17,"tag":7239,"props":274657,"children":274658},{},[274659,274666],{"type":17,"tag":7266,"props":274660,"children":274661},{},[274662],{"type":17,"tag":48,"props":274663,"children":274664},{},[274665],{"type":23,"value":25731},{"type":17,"tag":7266,"props":274667,"children":274668},{},[274669],{"type":23,"value":274670},"38+ integrations including Salesforce, HubSpot, Pipedrive, Zoho CRM, Close, Copper, and more",{"type":17,"tag":7239,"props":274672,"children":274673},{},[274674,274681],{"type":17,"tag":7266,"props":274675,"children":274676},{},[274677],{"type":17,"tag":48,"props":274678,"children":274679},{},[274680],{"type":23,"value":104365},{"type":17,"tag":7266,"props":274682,"children":274683},{},[274684],{"type":23,"value":274685},"32+ integrations including QuickBooks, Xero, Sage Accounting, Zoho Books, NetSuite, and more",{"type":17,"tag":7239,"props":274687,"children":274688},{},[274689,274696],{"type":17,"tag":7266,"props":274690,"children":274691},{},[274692],{"type":17,"tag":48,"props":274693,"children":274694},{},[274695],{"type":23,"value":14515},{"type":17,"tag":7266,"props":274697,"children":274698},{},[274699],{"type":23,"value":274700},"19+ integrations including Google Calendar/Meet, Microsoft Outlook/Teams, Zoom, Webex",{"type":17,"tag":7239,"props":274702,"children":274703},{},[274704,274711],{"type":17,"tag":7266,"props":274705,"children":274706},{},[274707],{"type":17,"tag":48,"props":274708,"children":274709},{},[274710],{"type":23,"value":24595},{"type":17,"tag":7266,"props":274712,"children":274713},{},[274714,274721],{"type":17,"tag":133,"props":274715,"children":274718},{"href":274716,"rel":274717},"https://docs.unified.to/genai/integrations",[214],[274719],{"type":23,"value":274720},"Model providers",{"type":23,"value":274722}," via Unified GenAI (OpenAI, Claude, Gemini, and others)",{"type":17,"tag":29,"props":274724,"children":274725},{},[274726],{"type":23,"value":274727},"Unified.to delivers this ecosystem through a single, secure API surface—eliminating the need for custom connectors between CS tools and the systems they depend on.",{"type":17,"tag":239,"props":274729,"children":274730},{"id":268424},[274731],{"type":23,"value":268427},{"type":17,"tag":29,"props":274733,"children":274734},{},[274735],{"type":23,"value":274736},"For PMs and engineers building CSM, revenue intelligence, or customer health platforms:",{"type":17,"tag":80,"props":274738,"children":274739},{},[274740,274750,274760,274770],{"type":17,"tag":84,"props":274741,"children":274742},{},[274743,274748],{"type":17,"tag":48,"props":274744,"children":274745},{},[274746],{"type":23,"value":274747},"One API, multiple domains",{"type":23,"value":274749}," — CRM, accounting, calendar, and GenAI unified.",{"type":17,"tag":84,"props":274751,"children":274752},{},[274753,274758],{"type":17,"tag":48,"props":274754,"children":274755},{},[274756],{"type":23,"value":274757},"Proactive retention workflows",{"type":23,"value":274759}," — detect churn risk and expansions automatically.",{"type":17,"tag":84,"props":274761,"children":274762},{},[274763,274768],{"type":17,"tag":48,"props":274764,"children":274765},{},[274766],{"type":23,"value":274767},"Operational efficiency",{"type":23,"value":274769}," — auto-create tasks, QBRs, and follow-ups in the right systems.",{"type":17,"tag":84,"props":274771,"children":274772},{},[274773,274778],{"type":17,"tag":48,"props":274774,"children":274775},{},[274776],{"type":23,"value":274777},"AI-ready architecture",{"type":23,"value":274779}," — generate summaries and outreach through built-in GenAI endpoints.",{"type":17,"tag":29,"props":274781,"children":274782},{},[274783],{"type":23,"value":274784},"Launch customer health, expansion, and retention workflows across 300+ systems in days.",{"type":17,"tag":29,"props":274786,"children":274787},{},[274788,274796,274797,274805],{"type":17,"tag":133,"props":274789,"children":274791},{"href":158861,"rel":274790},[214],[274792],{"type":17,"tag":48,"props":274793,"children":274794},{},[274795],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":274798,"children":274800},{"href":1623,"rel":274799},[214],[274801],{"type":17,"tag":48,"props":274802,"children":274803},{},[274804],{"type":23,"value":226481},{"type":23,"value":271016},{"title":7,"searchDepth":1629,"depth":1629,"links":274807},[274808,274809,274810,274811,274812],{"id":274221,"depth":1635,"text":274224},{"id":268033,"depth":1635,"text":268036},{"id":274455,"depth":1635,"text":274458},{"id":270271,"depth":1635,"text":270274},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_build_customer_success_workflows_for_revenue_retention_and_expansion_with_a_unified_api.md","blog/how_to_build_customer_success_workflows_for_revenue_retention_and_expansion_with_a_unified_api.md","blog/how_to_build_customer_success_workflows_for_revenue_retention_and_expansion_with_a_unified_api",{"_path":274817,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":274818,"description":274819,"img":274820,"date":271473,"tag":12,"body":274821,"_type":1677,"_id":275218,"_source":1679,"_file":275219,"_stem":275220,"_extension":1682},"/blog/how_to_fetch_and_embed_scheduling_links_from_calendly_cal_com_and_19_platforms_with_a_unified_api","How to Fetch and Embed Scheduling Links from Calendly, Cal.com, and 19+ Platforms with a Unified API","Most SaaS products need to let users share booking links — whether that's for demos, interviews, onboarding calls, or support sessions. The challenge is every...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_fetch_and_embed_scheduling_links_from_calendly_cal_com_and_19_platforms_with_a_unified_api-icon.png",{"type":14,"children":274822,"toc":275211},[274823,274828,274831,274838,274843,274853,274859,274863,274886,274892,274897,275023,275028,275034,275039,275096,275102,275107,275115,275132,275138,275143,275185,275190],{"type":17,"tag":18,"props":274824,"children":274826},{"id":274825},"how-to-fetch-and-embed-scheduling-links-from-calendly-calcom-and-19-platforms-with-a-unified-api",[274827],{"type":23,"value":274818},{"type":17,"tag":25,"props":274829,"children":274830},{},[],{"type":17,"tag":29,"props":274832,"children":274833},{},[274834],{"type":17,"tag":33,"props":274835,"children":274836},{},[274837],{"type":23,"value":271491},{"type":17,"tag":29,"props":274839,"children":274840},{},[274841],{"type":23,"value":274842},"Most SaaS products need to let users share booking links — whether that's for demos, interviews, onboarding calls, or support sessions. The challenge is every scheduling provider structures these links differently, with unique authentication models and APIs for Calendly, Cal.com, SavvyCal, HubSpot Meetings, and more.",{"type":17,"tag":29,"props":274844,"children":274845},{},[274846,274847,274851],{"type":23,"value":9619},{"type":17,"tag":133,"props":274848,"children":274849},{"href":7691},[274850],{"type":23,"value":7459},{"type":23,"value":274852}," removes this complexity by normalizing scheduling link data in real time across 19+ calendar and scheduling platforms. That means your product can fetch, display, and embed 'Book a Meeting' links anywhere — without maintaining per-vendor code or dealing with inconsistent metadata.",{"type":17,"tag":239,"props":274854,"children":274856},{"id":274855},"when-to-use-scheduling-links",[274857],{"type":23,"value":274858},"When to Use Scheduling Links",{"type":17,"tag":29,"props":274860,"children":274861},{},[274862],{"type":23,"value":254154},{"type":17,"tag":80,"props":274864,"children":274865},{},[274866,274871,274876,274881],{"type":17,"tag":84,"props":274867,"children":274868},{},[274869],{"type":23,"value":274870},"Insert booking links inline across your product — in profiles, CTAs, or email templates",{"type":17,"tag":84,"props":274872,"children":274873},{},[274874],{"type":23,"value":274875},"Support multiple vendors with one API and unified fields",{"type":17,"tag":84,"props":274877,"children":274878},{},[274879],{"type":23,"value":274880},"Route meetings by team member, event type, duration, or locale",{"type":17,"tag":84,"props":274882,"children":274883},{},[274884],{"type":23,"value":274885},"Keep links up to date with real-time webhook-driven updates",{"type":17,"tag":239,"props":274887,"children":274889},{"id":274888},"normalized-scheduling-objects",[274890],{"type":23,"value":274891},"Normalized Scheduling Objects",{"type":17,"tag":29,"props":274893,"children":274894},{},[274895],{"type":23,"value":274896},"Unified.to provides consistent schemas across scheduling and calendar providers:",{"type":17,"tag":7231,"props":274898,"children":274899},{},[274900,274918],{"type":17,"tag":7235,"props":274901,"children":274902},{},[274903],{"type":17,"tag":7239,"props":274904,"children":274905},{},[274906,274910,274914],{"type":17,"tag":7243,"props":274907,"children":274908},{},[274909],{"type":23,"value":18594},{"type":17,"tag":7243,"props":274911,"children":274912},{},[274913],{"type":23,"value":24525},{"type":17,"tag":7243,"props":274915,"children":274916},{},[274917],{"type":23,"value":22096},{"type":17,"tag":7259,"props":274919,"children":274920},{},[274921,274976],{"type":17,"tag":7239,"props":274922,"children":274923},{},[274924,274932,274937],{"type":17,"tag":7266,"props":274925,"children":274926},{},[274927],{"type":17,"tag":48,"props":274928,"children":274929},{},[274930],{"type":23,"value":274931},"scheduling_link",{"type":17,"tag":7266,"props":274933,"children":274934},{},[274935],{"type":23,"value":274936},"A shareable booking URL for a meeting template",{"type":17,"tag":7266,"props":274938,"children":274939},{},[274940,274945,274946,274951,274952,274957,274958,274964,274965,274970,274971],{"type":17,"tag":6121,"props":274941,"children":274943},{"className":274942},[],[274944],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":274947,"children":274949},{"className":274948},[],[274950],{"type":23,"value":124783},{"type":23,"value":11826},{"type":17,"tag":6121,"props":274953,"children":274955},{"className":274954},[],[274956],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":274959,"children":274961},{"className":274960},[],[274962],{"type":23,"value":274963},"event_type",{"type":23,"value":11826},{"type":17,"tag":6121,"props":274966,"children":274968},{"className":274967},[],[274969],{"type":23,"value":165939},{"type":23,"value":11826},{"type":17,"tag":6121,"props":274972,"children":274974},{"className":274973},[],[274975],{"type":23,"value":62868},{"type":17,"tag":7239,"props":274977,"children":274978},{},[274979,274986,274991],{"type":17,"tag":7266,"props":274980,"children":274981},{},[274982],{"type":17,"tag":48,"props":274983,"children":274984},{},[274985],{"type":23,"value":124562},{"type":17,"tag":7266,"props":274987,"children":274988},{},[274989],{"type":23,"value":274990},"Triggers when a scheduling link or template changes",{"type":17,"tag":7266,"props":274992,"children":274993},{},[274994,274999,275000,275005,275006,275011,275012,275017,275018],{"type":17,"tag":6121,"props":274995,"children":274997},{"className":274996},[],[274998],{"type":23,"value":161193},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275001,"children":275003},{"className":275002},[],[275004],{"type":23,"value":62633},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275007,"children":275009},{"className":275008},[],[275010],{"type":23,"value":27310},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275013,"children":275015},{"className":275014},[],[275016],{"type":23,"value":178128},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275019,"children":275021},{"className":275020},[],[275022],{"type":23,"value":77777},{"type":17,"tag":29,"props":275024,"children":275025},{},[275026],{"type":23,"value":275027},"Some vendors expose 'event types' or templates — Unified normalizes the core fields while preserving vendor-specific metadata when available.",{"type":17,"tag":239,"props":275029,"children":275031},{"id":275030},"data-flow-for-scheduling-links",[275032],{"type":23,"value":275033},"Data Flow for Scheduling Links",{"type":17,"tag":29,"props":275035,"children":275036},{},[275037],{"type":23,"value":275038},"The workflow is simple and consistent across providers:",{"type":17,"tag":6154,"props":275040,"children":275041},{},[275042,275057,275072,275082],{"type":17,"tag":84,"props":275043,"children":275044},{},[275045,275049,275051,275056],{"type":17,"tag":48,"props":275046,"children":275047},{},[275048],{"type":23,"value":251948},{"type":23,"value":275050}," the user's scheduling provider via Unified Connect to obtain a ",{"type":17,"tag":6121,"props":275052,"children":275054},{"className":275053},[],[275055],{"type":23,"value":25037},{"type":23,"value":54},{"type":17,"tag":84,"props":275058,"children":275059},{},[275060,275064,275065,275070],{"type":17,"tag":48,"props":275061,"children":275062},{},[275063],{"type":23,"value":145784},{"type":23,"value":18757},{"type":17,"tag":6121,"props":275066,"children":275068},{"className":275067},[],[275069],{"type":23,"value":274931},{"type":23,"value":275071}," objects via the Unified API.",{"type":17,"tag":84,"props":275073,"children":275074},{},[275075,275080],{"type":17,"tag":48,"props":275076,"children":275077},{},[275078],{"type":23,"value":275079},"Display",{"type":23,"value":275081}," or embed links in your UI — attach them to buttons, profiles, or automated emails.",{"type":17,"tag":84,"props":275083,"children":275084},{},[275085,275089,275090,275094],{"type":17,"tag":48,"props":275086,"children":275087},{},[275088],{"type":23,"value":272693},{"type":23,"value":272695},{"type":17,"tag":133,"props":275091,"children":275092},{"href":4999},[275093],{"type":23,"value":5002},{"type":23,"value":275095}," to refresh or deactivate links as changes occur in real time.",{"type":17,"tag":239,"props":275097,"children":275099},{"id":275098},"supported-scheduling-platforms",[275100],{"type":23,"value":275101},"Supported Scheduling Platforms",{"type":17,"tag":29,"props":275103,"children":275104},{},[275105],{"type":23,"value":275106},"Unified.to supports 19+ calendar and scheduling platforms, including:",{"type":17,"tag":3414,"props":275108,"children":275109},{},[275110],{"type":17,"tag":29,"props":275111,"children":275112},{},[275113],{"type":23,"value":275114},"Calendly, Cal.com, SavvyCal, HubSpot Meetings, Google Calendar Appointment Schedules, Microsoft Bookings, Acuity Scheduling, Apple iCloud, Fireflies, Google Meet, lemcal, Microsoft Outlook, Microsoft Teams, RingCentral, SimpleMeet.me, SquareUp, Webex, and Zoom.",{"type":17,"tag":29,"props":275116,"children":275117},{},[275118,275119,275124,275126,275131],{"type":23,"value":269743},{"type":17,"tag":133,"props":275120,"children":275122},{"href":99025,"rel":275121},[214],[275123],{"type":23,"value":272001},{"type":23,"value":275125}," and the ",{"type":17,"tag":133,"props":275127,"children":275129},{"href":99333,"rel":275128},[214],[275130],{"type":23,"value":272009},{"type":23,"value":272753},{"type":17,"tag":239,"props":275133,"children":275135},{"id":275134},"why-this-matters-for-product-teams",[275136],{"type":23,"value":275137},"Why This Matters for Product Teams",{"type":17,"tag":29,"props":275139,"children":275140},{},[275141],{"type":23,"value":275142},"For PMs and engineers, the benefits are clear:",{"type":17,"tag":80,"props":275144,"children":275145},{},[275146,275156,275166,275175],{"type":17,"tag":84,"props":275147,"children":275148},{},[275149,275154],{"type":17,"tag":48,"props":275150,"children":275151},{},[275152],{"type":23,"value":275153},"One API, all vendors",{"type":23,"value":275155}," — fetch scheduling links from 19+ systems in real time",{"type":17,"tag":84,"props":275157,"children":275158},{},[275159,275164],{"type":17,"tag":48,"props":275160,"children":275161},{},[275162],{"type":23,"value":275163},"Consistent metadata",{"type":23,"value":275165}," — unified fields for event type, duration, and availability",{"type":17,"tag":84,"props":275167,"children":275168},{},[275169,275173],{"type":17,"tag":48,"props":275170,"children":275171},{},[275172],{"type":23,"value":269406},{"type":23,"value":275174}," — Unified handles OAuth2 flows, token refresh, and webhook retries",{"type":17,"tag":84,"props":275176,"children":275177},{},[275178,275183],{"type":17,"tag":48,"props":275179,"children":275180},{},[275181],{"type":23,"value":275182},"Faster delivery",{"type":23,"value":275184}," — embed links across your app without building per-vendor connectors",{"type":17,"tag":29,"props":275186,"children":275187},{},[275188],{"type":23,"value":275189},"Launch scheduling integrations across 19+ platforms today.",{"type":17,"tag":29,"props":275191,"children":275192},{},[275193,275201,275202,275210],{"type":17,"tag":133,"props":275194,"children":275196},{"href":158861,"rel":275195},[214],[275197],{"type":17,"tag":48,"props":275198,"children":275199},{},[275200],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":275203,"children":275205},{"href":1623,"rel":275204},[214],[275206],{"type":17,"tag":48,"props":275207,"children":275208},{},[275209],{"type":23,"value":226481},{"type":23,"value":272091},{"title":7,"searchDepth":1629,"depth":1629,"links":275212},[275213,275214,275215,275216,275217],{"id":274855,"depth":1635,"text":274858},{"id":274888,"depth":1635,"text":274891},{"id":275030,"depth":1635,"text":275033},{"id":275098,"depth":1635,"text":275101},{"id":275134,"depth":1635,"text":275137},"content:blog:how_to_fetch_and_embed_scheduling_links_from_calendly_cal_com_and_19_platforms_with_a_unified_api.md","blog/how_to_fetch_and_embed_scheduling_links_from_calendly_cal_com_and_19_platforms_with_a_unified_api.md","blog/how_to_fetch_and_embed_scheduling_links_from_calendly_cal_com_and_19_platforms_with_a_unified_api",{"_path":275222,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":275223,"description":275224,"img":275225,"date":271473,"tag":12,"body":275226,"_type":1677,"_id":275990,"_source":1679,"_file":275991,"_stem":275992,"_extension":1682},"/blog/how_to_sync_field_sales_notes_to_salesforce_hubspot_and_38_crms_with_a_unified_api","How to Sync Field Sales Notes to Salesforce, HubSpot, and 38+ CRMs with a Unified API","Field sales reps meet customers face-to-face every day — but those insights often get lost in notebooks or spreadsheets before making it back to the CRM....","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_sync_field_sales_notes_to_salesforce_hubspot_and_38_crms_with_a_unified_api-icon.png",{"type":14,"children":275227,"toc":275983},[275228,275233,275236,275243,275248,275264,275270,275274,275323,275329,275334,275702,275707,275713,275718,275861,275866,275870,275880,275888,275906,275910,275915,275957,275962],{"type":17,"tag":18,"props":275229,"children":275231},{"id":275230},"how-to-sync-field-sales-notes-to-salesforce-hubspot-and-38-crms-with-a-unified-api",[275232],{"type":23,"value":275223},{"type":17,"tag":25,"props":275234,"children":275235},{},[],{"type":17,"tag":29,"props":275237,"children":275238},{},[275239],{"type":17,"tag":33,"props":275240,"children":275241},{},[275242],{"type":23,"value":271491},{"type":17,"tag":29,"props":275244,"children":275245},{},[275246],{"type":23,"value":275247},"Field sales reps meet customers face-to-face every day — but those insights often get lost in notebooks or spreadsheets before making it back to the CRM. Without consistent data capture, account visibility suffers and pipeline updates lag behind reality.",{"type":17,"tag":29,"props":275249,"children":275250},{},[275251,275256,275258,275262],{"type":17,"tag":133,"props":275252,"children":275254},{"href":42620,"rel":275253},[214],[275255],{"type":23,"value":217},{"type":23,"value":275257}," makes it simple to capture on-site meeting notes and sync them directly to CRM systems like Salesforce, HubSpot, or Pipedrive in real time. Using a single ",{"type":17,"tag":133,"props":275259,"children":275260},{"href":7691},[275261],{"type":23,"value":7459},{"type":23,"value":275263},", your application can create or update CRM records — Deals, Contacts, Companies, and Activities — without building per-vendor connectors.",{"type":17,"tag":239,"props":275265,"children":275267},{"id":275266},"when-to-use-field-sales-note-sync",[275268],{"type":23,"value":275269},"When to Use Field Sales Note Sync",{"type":17,"tag":29,"props":275271,"children":275272},{},[275273],{"type":23,"value":254154},{"type":17,"tag":80,"props":275275,"children":275276},{},[275277,275288,275299,275311],{"type":17,"tag":84,"props":275278,"children":275279},{},[275280,275282,275287],{"type":23,"value":275281},"Log on-site meeting outcomes and next steps while ",{"type":17,"tag":48,"props":275283,"children":275284},{},[275285],{"type":23,"value":275286},"offline or online",{"type":23,"value":54},{"type":17,"tag":84,"props":275289,"children":275290},{},[275291,275292,275297],{"type":23,"value":239179},{"type":17,"tag":48,"props":275293,"children":275294},{},[275295],{"type":23,"value":275296},"Deals updated",{"type":23,"value":275298}," with visit notes, progress, and ownership changes.",{"type":17,"tag":84,"props":275300,"children":275301},{},[275302,275304,275309],{"type":23,"value":275303},"Centralize ",{"type":17,"tag":48,"props":275305,"children":275306},{},[275307],{"type":23,"value":275308},"rep activity",{"type":23,"value":275310}," across Contacts, Companies, and Deals for visibility.",{"type":17,"tag":84,"props":275312,"children":275313},{},[275314,275316,275321],{"type":23,"value":275315},"Maintain a consistent ",{"type":17,"tag":48,"props":275317,"children":275318},{},[275319],{"type":23,"value":275320},"activity timeline",{"type":23,"value":275322}," across all connected CRMs.",{"type":17,"tag":239,"props":275324,"children":275326},{"id":275325},"normalized-crm-objects",[275327],{"type":23,"value":275328},"Normalized CRM Objects",{"type":17,"tag":29,"props":275330,"children":275331},{},[275332],{"type":23,"value":275333},"Unified.to provides a normalized schema across all major CRM platforms so your product can handle field activity consistently.",{"type":17,"tag":7231,"props":275335,"children":275336},{},[275337,275355],{"type":17,"tag":7235,"props":275338,"children":275339},{},[275340],{"type":17,"tag":7239,"props":275341,"children":275342},{},[275343,275347,275351],{"type":17,"tag":7243,"props":275344,"children":275345},{},[275346],{"type":23,"value":18594},{"type":17,"tag":7243,"props":275348,"children":275349},{},[275350],{"type":23,"value":24525},{"type":17,"tag":7243,"props":275352,"children":275353},{},[275354],{"type":23,"value":22096},{"type":17,"tag":7259,"props":275356,"children":275357},{},[275358,275447,275530,275613],{"type":17,"tag":7239,"props":275359,"children":275360},{},[275361,275368,275373],{"type":17,"tag":7266,"props":275362,"children":275363},{},[275364],{"type":17,"tag":48,"props":275365,"children":275366},{},[275367],{"type":23,"value":25810},{"type":17,"tag":7266,"props":275369,"children":275370},{},[275371],{"type":23,"value":275372},"Opportunity being advanced in the field",{"type":17,"tag":7266,"props":275374,"children":275375},{},[275376,275381,275382,275387,275388,275393,275394,275399,275400,275405,275406,275411,275412,275417,275418,275423,275424,275429,275430,275435,275436,275441,275442],{"type":17,"tag":6121,"props":275377,"children":275379},{"className":275378},[],[275380],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275383,"children":275385},{"className":275384},[],[275386],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275389,"children":275391},{"className":275390},[],[275392],{"type":23,"value":25890},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275395,"children":275397},{"className":275396},[],[275398],{"type":23,"value":22296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275401,"children":275403},{"className":275402},[],[275404],{"type":23,"value":212204},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275407,"children":275409},{"className":275408},[],[275410],{"type":23,"value":25923},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275413,"children":275415},{"className":275414},[],[275416],{"type":23,"value":62844},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275419,"children":275421},{"className":275420},[],[275422],{"type":23,"value":109074},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275425,"children":275427},{"className":275426},[],[275428],{"type":23,"value":62582},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275431,"children":275433},{"className":275432},[],[275434],{"type":23,"value":62483},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275437,"children":275439},{"className":275438},[],[275440],{"type":23,"value":62360},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275443,"children":275445},{"className":275444},[],[275446],{"type":23,"value":23792},{"type":17,"tag":7239,"props":275448,"children":275449},{},[275450,275457,275462],{"type":17,"tag":7266,"props":275451,"children":275452},{},[275453],{"type":17,"tag":48,"props":275454,"children":275455},{},[275456],{"type":23,"value":25828},{"type":17,"tag":7266,"props":275458,"children":275459},{},[275460],{"type":23,"value":275461},"Person met onsite",{"type":17,"tag":7266,"props":275463,"children":275464},{},[275465,275470,275471,275476,275477,275482,275483,275488,275489,275494,275495,275500,275501,275506,275507,275512,275513,275518,275519,275524,275525],{"type":17,"tag":6121,"props":275466,"children":275468},{"className":275467},[],[275469],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275472,"children":275474},{"className":275473},[],[275475],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275478,"children":275480},{"className":275479},[],[275481],{"type":23,"value":62346},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275484,"children":275486},{"className":275485},[],[275487],{"type":23,"value":62420},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275490,"children":275492},{"className":275491},[],[275493],{"type":23,"value":50735},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275496,"children":275498},{"className":275497},[],[275499],{"type":23,"value":62355},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275502,"children":275504},{"className":275503},[],[275505],{"type":23,"value":62365},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275508,"children":275510},{"className":275509},[],[275511],{"type":23,"value":62360},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275514,"children":275516},{"className":275515},[],[275517],{"type":23,"value":62370},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275520,"children":275522},{"className":275521},[],[275523],{"type":23,"value":62582},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275526,"children":275528},{"className":275527},[],[275529],{"type":23,"value":23792},{"type":17,"tag":7239,"props":275531,"children":275532},{},[275533,275540,275545],{"type":17,"tag":7266,"props":275534,"children":275535},{},[275536],{"type":17,"tag":48,"props":275537,"children":275538},{},[275539],{"type":23,"value":25846},{"type":17,"tag":7266,"props":275541,"children":275542},{},[275543],{"type":23,"value":275544},"Account visited",{"type":17,"tag":7266,"props":275546,"children":275547},{},[275548,275553,275554,275559,275560,275565,275566,275571,275572,275577,275578,275583,275584,275589,275590,275595,275596,275601,275602,275607,275608],{"type":17,"tag":6121,"props":275549,"children":275551},{"className":275550},[],[275552],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275555,"children":275557},{"className":275556},[],[275558],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275561,"children":275563},{"className":275562},[],[275564],{"type":23,"value":62365},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275567,"children":275569},{"className":275568},[],[275570],{"type":23,"value":62483},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275573,"children":275575},{"className":275574},[],[275576],{"type":23,"value":50735},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275579,"children":275581},{"className":275580},[],[275582],{"type":23,"value":62355},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275585,"children":275587},{"className":275586},[],[275588],{"type":23,"value":62456},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275591,"children":275593},{"className":275592},[],[275594],{"type":23,"value":62370},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275597,"children":275599},{"className":275598},[],[275600],{"type":23,"value":50783},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275603,"children":275605},{"className":275604},[],[275606],{"type":23,"value":62582},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275609,"children":275611},{"className":275610},[],[275612],{"type":23,"value":23792},{"type":17,"tag":7239,"props":275614,"children":275615},{},[275616,275623,275628],{"type":17,"tag":7266,"props":275617,"children":275618},{},[275619],{"type":17,"tag":48,"props":275620,"children":275621},{},[275622],{"type":23,"value":14528},{"type":17,"tag":7266,"props":275624,"children":275625},{},[275626],{"type":23,"value":275627},"Activity log (note, meeting, call, task)",{"type":17,"tag":7266,"props":275629,"children":275630},{},[275631,275636,275637,275642,275643,275648,275649,275654,275655,275660,275661,275666,275667,275672,275673,275678,275679,275684,275685,275690,275691,275696,275697],{"type":17,"tag":6121,"props":275632,"children":275634},{"className":275633},[],[275635],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275638,"children":275640},{"className":275639},[],[275641],{"type":23,"value":27310},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275644,"children":275646},{"className":275645},[],[275647],{"type":23,"value":62656},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275650,"children":275652},{"className":275651},[],[275653],{"type":23,"value":62661},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275656,"children":275658},{"className":275657},[],[275659],{"type":23,"value":62666},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275662,"children":275664},{"className":275663},[],[275665],{"type":23,"value":62671},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275668,"children":275670},{"className":275669},[],[275671],{"type":23,"value":62676},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275674,"children":275676},{"className":275675},[],[275677],{"type":23,"value":62365},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275680,"children":275682},{"className":275681},[],[275683],{"type":23,"value":62360},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275686,"children":275688},{"className":275687},[],[275689],{"type":23,"value":62483},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275692,"children":275694},{"className":275693},[],[275695],{"type":23,"value":62708},{"type":23,"value":11826},{"type":17,"tag":6121,"props":275698,"children":275700},{"className":275699},[],[275701],{"type":23,"value":62582},{"type":17,"tag":29,"props":275703,"children":275704},{},[275705],{"type":23,"value":275706},"All objects share a consistent schema across platforms, so you can write once and support every CRM.",{"type":17,"tag":239,"props":275708,"children":275710},{"id":275709},"data-flow-for-field-sales-notes",[275711],{"type":23,"value":275712},"Data Flow for Field Sales Notes",{"type":17,"tag":29,"props":275714,"children":275715},{},[275716],{"type":23,"value":275717},"Here's how the integration works end to end:",{"type":17,"tag":7231,"props":275719,"children":275720},{},[275721,275739],{"type":17,"tag":7235,"props":275722,"children":275723},{},[275724],{"type":17,"tag":7239,"props":275725,"children":275726},{},[275727,275731,275735],{"type":17,"tag":7243,"props":275728,"children":275729},{},[275730],{"type":23,"value":274477},{"type":17,"tag":7243,"props":275732,"children":275733},{},[275734],{"type":23,"value":274482},{"type":17,"tag":7243,"props":275736,"children":275737},{},[275738],{"type":23,"value":132865},{"type":17,"tag":7259,"props":275740,"children":275741},{},[275742,275762,275782,275821,275841],{"type":17,"tag":7239,"props":275743,"children":275744},{},[275745,275752,275757],{"type":17,"tag":7266,"props":275746,"children":275747},{},[275748],{"type":17,"tag":48,"props":275749,"children":275750},{},[275751],{"type":23,"value":261914},{"type":17,"tag":7266,"props":275753,"children":275754},{},[275755],{"type":23,"value":275756},"Rep selects the relevant Deal, Contact, or Company in your app.",{"type":17,"tag":7266,"props":275758,"children":275759},{},[275760],{"type":23,"value":275761},"Target record IDs captured.",{"type":17,"tag":7239,"props":275763,"children":275764},{},[275765,275772,275777],{"type":17,"tag":7266,"props":275766,"children":275767},{},[275768],{"type":17,"tag":48,"props":275769,"children":275770},{},[275771],{"type":23,"value":261697},{"type":17,"tag":7266,"props":275773,"children":275774},{},[275775],{"type":23,"value":275776},"Rep captures visit notes and meeting details.",{"type":17,"tag":7266,"props":275778,"children":275779},{},[275780],{"type":23,"value":275781},"Free-text note and associations created.",{"type":17,"tag":7239,"props":275783,"children":275784},{},[275785,275792,275816],{"type":17,"tag":7266,"props":275786,"children":275787},{},[275788],{"type":17,"tag":48,"props":275789,"children":275790},{},[275791],{"type":23,"value":230135},{"type":17,"tag":7266,"props":275793,"children":275794},{},[275795,275797,275801,275803,275808,275809,275814],{"type":23,"value":275796},"Create a CRM ",{"type":17,"tag":48,"props":275798,"children":275799},{},[275800],{"type":23,"value":14528},{"type":23,"value":275802}," of type ",{"type":17,"tag":6121,"props":275804,"children":275806},{"className":275805},[],[275807],{"type":23,"value":62656},{"type":23,"value":75890},{"type":17,"tag":6121,"props":275810,"children":275812},{"className":275811},[],[275813],{"type":23,"value":62661},{"type":23,"value":275815}," with record associations.",{"type":17,"tag":7266,"props":275817,"children":275818},{},[275819],{"type":23,"value":275820},"Activity logged on the right records in the CRM.",{"type":17,"tag":7239,"props":275822,"children":275823},{},[275824,275831,275836],{"type":17,"tag":7266,"props":275825,"children":275826},{},[275827],{"type":17,"tag":48,"props":275828,"children":275829},{},[275830],{"type":23,"value":261738},{"type":17,"tag":7266,"props":275832,"children":275833},{},[275834],{"type":23,"value":275835},"Optionally update Deal stage or owner.",{"type":17,"tag":7266,"props":275837,"children":275838},{},[275839],{"type":23,"value":275840},"CRM reflects the latest sales progress.",{"type":17,"tag":7239,"props":275842,"children":275843},{},[275844,275851,275856],{"type":17,"tag":7266,"props":275845,"children":275846},{},[275847],{"type":17,"tag":48,"props":275848,"children":275849},{},[275850],{"type":23,"value":230170},{"type":17,"tag":7266,"props":275852,"children":275853},{},[275854],{"type":23,"value":275855},"Subscribe to Unified's CRM webhooks.",{"type":17,"tag":7266,"props":275857,"children":275858},{},[275859],{"type":23,"value":275860},"Two-way sync ensures changes stay up to date.",{"type":17,"tag":29,"props":275862,"children":275863},{},[275864],{"type":23,"value":275865},"This flow keeps every rep note tied to the correct customer, opportunity, and account — without manual data entry or duplicate records.",{"type":17,"tag":239,"props":275867,"children":275868},{"id":110586},[275869],{"type":23,"value":110589},{"type":17,"tag":29,"props":275871,"children":275872},{},[275873,275874,275879],{"type":23,"value":254333},{"type":17,"tag":48,"props":275875,"children":275876},{},[275877],{"type":23,"value":275878},"38+ CRM integrations",{"type":23,"value":118973},{"type":17,"tag":3414,"props":275881,"children":275882},{},[275883],{"type":17,"tag":29,"props":275884,"children":275885},{},[275886],{"type":23,"value":275887},"Salesforce, HubSpot, Pipedrive, Zoho CRM, Microsoft Dynamics 365, Copper, Close.io, Attio, Freshsales, Zendesk Sell, Insightly, and more.",{"type":17,"tag":29,"props":275889,"children":275890},{},[275891,275892,275897,275898,275904],{"type":23,"value":269743},{"type":17,"tag":133,"props":275893,"children":275895},{"href":76501,"rel":275894},[214],[275896],{"type":23,"value":254351},{"type":23,"value":274092},{"type":17,"tag":133,"props":275899,"children":275901},{"href":107049,"rel":275900},[214],[275902],{"type":23,"value":275903},"CRM API documentation",{"type":23,"value":275905}," to start building.",{"type":17,"tag":239,"props":275907,"children":275908},{"id":268424},[275909],{"type":23,"value":268427},{"type":17,"tag":29,"props":275911,"children":275912},{},[275913],{"type":23,"value":275914},"For PMs and engineers building CRM-connected field tools:",{"type":17,"tag":80,"props":275916,"children":275917},{},[275918,275928,275937,275947],{"type":17,"tag":84,"props":275919,"children":275920},{},[275921,275926],{"type":17,"tag":48,"props":275922,"children":275923},{},[275924],{"type":23,"value":275925},"Build once, sync everywhere",{"type":23,"value":275927}," — one API for 38+ CRMs.",{"type":17,"tag":84,"props":275929,"children":275930},{},[275931,275935],{"type":17,"tag":48,"props":275932,"children":275933},{},[275934],{"type":23,"value":13156},{"type":23,"value":275936}," — webhook-driven events keep CRMs in sync automatically.",{"type":17,"tag":84,"props":275938,"children":275939},{},[275940,275945],{"type":17,"tag":48,"props":275941,"children":275942},{},[275943],{"type":23,"value":275944},"Flexible data model",{"type":23,"value":275946}," — unified objects for Deals, Contacts, Companies, and Events.",{"type":17,"tag":84,"props":275948,"children":275949},{},[275950,275955],{"type":17,"tag":48,"props":275951,"children":275952},{},[275953],{"type":23,"value":275954},"No storage, no maintenance",{"type":23,"value":275956}," — Unified.to fetches and writes live data directly to the source system.",{"type":17,"tag":29,"props":275958,"children":275959},{},[275960],{"type":23,"value":275961},"Launch real-time field note sync across every major CRM — from Salesforce to HubSpot — in days.",{"type":17,"tag":29,"props":275963,"children":275964},{},[275965,275973,275974,275982],{"type":17,"tag":133,"props":275966,"children":275968},{"href":158861,"rel":275967},[214],[275969],{"type":17,"tag":48,"props":275970,"children":275971},{},[275972],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":275975,"children":275977},{"href":1623,"rel":275976},[214],[275978],{"type":17,"tag":48,"props":275979,"children":275980},{},[275981],{"type":23,"value":226481},{"type":23,"value":271016},{"title":7,"searchDepth":1629,"depth":1629,"links":275984},[275985,275986,275987,275988,275989],{"id":275266,"depth":1635,"text":275269},{"id":275325,"depth":1635,"text":275328},{"id":275709,"depth":1635,"text":275712},{"id":110586,"depth":1635,"text":110589},{"id":268424,"depth":1635,"text":268427},"content:blog:how_to_sync_field_sales_notes_to_salesforce_hubspot_and_38_crms_with_a_unified_api.md","blog/how_to_sync_field_sales_notes_to_salesforce_hubspot_and_38_crms_with_a_unified_api.md","blog/how_to_sync_field_sales_notes_to_salesforce_hubspot_and_38_crms_with_a_unified_api",{"_path":275994,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":275995,"description":275996,"img":275997,"date":275998,"tag":6341,"body":275999,"_type":1677,"_id":276557,"_source":1679,"_file":276558,"_stem":276559,"_extension":1682},"/blog/understanding_oauth2_authorization_flows","Understanding OAuth2 Authorization flows","OAuth 2.0 is an industry‑standard protocol for authorization that lets applications request limited access to a user's data on an API service without exposing...","https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-icon.png","2025-10-17T00:00:00.000Z",{"type":14,"children":276000,"toc":276551},[276001,276006,276009,276017,276029,276061,276073,276076,276082,276094,276102,276174,276191,276219,276224,276229,276236,276255,276258,276264,276277,276290,276311,276316,276323,276348,276354,276365,276372,276395,276400,276407,276424,276427,276433,276470,276482,276494,276499,276517,276524,276535,276538],{"type":17,"tag":18,"props":276002,"children":276004},{"id":276003},"understanding-oauth2-authorization-flows",[276005],{"type":23,"value":275995},{"type":17,"tag":25,"props":276007,"children":276008},{},[],{"type":17,"tag":29,"props":276010,"children":276011},{},[276012],{"type":17,"tag":33,"props":276013,"children":276014},{},[276015],{"type":23,"value":276016},"October 17, 2025",{"type":17,"tag":29,"props":276018,"children":276019},{},[276020,276027],{"type":17,"tag":133,"props":276021,"children":276024},{"href":276022,"rel":276023},"https://oauth.net/2/",[214],[276025],{"type":23,"value":276026},"OAuth 2.0 ",{"type":23,"value":276028},"is an industry‑standard protocol for authorization that lets applications request limited access to a user's data on an API service without exposing passwords. This overview highlights the core flows that Unified supports.  OAuth2 has 2 versions, and v2 has several flows.  Overall, Unified seamlessly supports over 70 variants of just OAuth2.",{"type":17,"tag":29,"props":276030,"children":276031},{},[276032,276034,276038,276040,276045,276047,276054],{"type":23,"value":276033},"We will not bother with ",{"type":17,"tag":133,"props":276035,"children":276036},{"href":779},[276037],{"type":23,"value":782},{"type":23,"value":276039}," v1 as it was formally obsoleted when the ",{"type":17,"tag":133,"props":276041,"children":276043},{"href":276022,"rel":276042},[214],[276044],{"type":23,"value":95520},{"type":23,"value":276046}," spec was published as RFC 6749 in October 2012. The RFC explicitly states it 'replaces and obsoletes' OAuth 1.0 (RFC 5849).",{"type":17,"tag":133,"props":276048,"children":276051},{"href":276049,"rel":276050},"https://rfc-editor.org/info/rfc6749",[214],[276052],{"type":23,"value":276053},"[1]",{"type":17,"tag":133,"props":276055,"children":276058},{"href":276056,"rel":276057},"https://rfc-editor.org/info/rfc5849",[214],[276059],{"type":23,"value":276060},"[2]",{"type":17,"tag":29,"props":276062,"children":276063},{},[276064,276071],{"type":17,"tag":133,"props":276065,"children":276068},{"href":276066,"rel":276067},"https://oauth.net/2.1/",[214],[276069],{"type":23,"value":276070},"OAuth 2.1",{"type":23,"value":276072}," is still in-progress (as of Oct 2025) and will be backwards-compatible to v2.0, but make the flows more restricted to add additional security.",{"type":17,"tag":25,"props":276074,"children":276075},{},[],{"type":17,"tag":68,"props":276077,"children":276079},{"id":276078},"oauth2-code-flow",[276080],{"type":23,"value":276081},"OAuth2 Code Flow",{"type":17,"tag":29,"props":276083,"children":276084},{},[276085,276087,276092],{"type":23,"value":276086},"OAuth2 ",{"type":17,"tag":6121,"props":276088,"children":276090},{"className":276089},[],[276091],{"type":23,"value":6121},{"type":23,"value":276093}," flow is designed for applications that need to access a user's data in a third-party service (e.g., Google, Salesforce, HubSpot) with the user's explicit consent. It's the standard for options you see all over the Internet like 'Sign in with Google' and gain delegated access.  This flow can be used to grant access to data and/or to retrieve the identity of the authenticated user.",{"type":17,"tag":29,"props":276095,"children":276096},{},[276097],{"type":17,"tag":48,"props":276098,"children":276099},{},[276100],{"type":23,"value":276101},"How it works:",{"type":17,"tag":80,"props":276103,"children":276104},{},[276105,276147,276152,276157,276162],{"type":17,"tag":84,"props":276106,"children":276107},{},[276108,276110,276116,276118,276123,276124,276130,276132,276137,276139,276145],{"type":23,"value":276109},"Your app redirects the user to the provider's authorization page.  This URL contains your app's ",{"type":17,"tag":6121,"props":276111,"children":276113},{"className":276112},[],[276114],{"type":23,"value":276115},"client ID",{"type":23,"value":276117}," from that provider, plus provider-specific permission ",{"type":17,"tag":6121,"props":276119,"children":276121},{"className":276120},[],[276122],{"type":23,"value":77613},{"type":23,"value":182744},{"type":17,"tag":6121,"props":276125,"children":276127},{"className":276126},[],[276128],{"type":23,"value":276129},"redirect URL",{"type":23,"value":276131},".  It can also contain additional information such as ",{"type":17,"tag":6121,"props":276133,"children":276135},{"className":276134},[],[276136],{"type":23,"value":77758},{"type":23,"value":276138}," , ",{"type":17,"tag":6121,"props":276140,"children":276142},{"className":276141},[],[276143],{"type":23,"value":276144},"PKCE challenge",{"type":23,"value":276146},", and many more provider-specific parameters.",{"type":17,"tag":84,"props":276148,"children":276149},{},[276150],{"type":23,"value":276151},"The end-user logs in to that provider (if not already logged in) and is shown what permissions your app is requesting.  They can then approve or reject that access request.",{"type":17,"tag":84,"props":276153,"children":276154},{},[276155],{"type":23,"value":276156},"If approved, the provider redirects back to your app with a temporary code.",{"type":17,"tag":84,"props":276158,"children":276159},{},[276160],{"type":23,"value":276161},"Your backend exchanges the code for an access token (and optionally refresh token).  This step uses both the client ID and client secret, essentially securing the transaction.  The access token will have an expiry which will require the use of the refresh token to obtain new access tokens.",{"type":17,"tag":84,"props":276163,"children":276164},{},[276165,276167,276172],{"type":23,"value":276166},"Your app uses the access token in the ",{"type":17,"tag":6121,"props":276168,"children":276170},{"className":276169},[],[276171],{"type":23,"value":7306},{"type":23,"value":276173}," header to call that provider's APIs on behalf of the user.",{"type":17,"tag":29,"props":276175,"children":276176},{},[276177,276181,276182,276189],{"type":17,"tag":48,"props":276178,"children":276179},{},[276180],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":133,"props":276183,"children":276186},{"href":276184,"rel":276185},"https://docs.unified.to/unified/integration/Authorize_new_connection",[214],[276187],{"type":23,"value":276188},"handles all aspects of this OAuth2 flow",{"type":23,"value":276190},";",{"type":17,"tag":80,"props":276192,"children":276193},{},[276194,276199,276204,276209,276214],{"type":17,"tag":84,"props":276195,"children":276196},{},[276197],{"type":23,"value":276198},"creating the authorizing URL correctly",{"type":17,"tag":84,"props":276200,"children":276201},{},[276202],{"type":23,"value":276203},"unifying permission scopes (eg. crm_contact_read, accounting_invoice_write, …)",{"type":17,"tag":84,"props":276205,"children":276206},{},[276207],{"type":23,"value":276208},"exchanging codes for access tokens",{"type":17,"tag":84,"props":276210,"children":276211},{},[276212],{"type":23,"value":276213},"automatically refreshing access tokens (and optionally refresh tokens)",{"type":17,"tag":84,"props":276215,"children":276216},{},[276217],{"type":23,"value":276218},"calling the end API with the access token in the correct header and format",{"type":17,"tag":29,"props":276220,"children":276221},{},[276222],{"type":23,"value":276223},"This happens with our pre-built components, or directly through our Authorization API.",{"type":17,"tag":29,"props":276225,"children":276226},{},[276227],{"type":23,"value":276228},"Our customers just input their application's OAuth2 client ID and client Secret obtained once from the provider.  Unified also provides instructions on how to obtain those OAuth credentials.",{"type":17,"tag":29,"props":276230,"children":276231},{},[276232],{"type":17,"tag":6438,"props":276233,"children":276235},{"alt":6440,"src":276234},"https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-0.png",[],{"type":17,"tag":29,"props":276237,"children":276238},{},[276239,276241,276246,276248,276253],{"type":23,"value":276240},"Currently, ",{"type":17,"tag":133,"props":276242,"children":276244},{"href":42620,"rel":276243},[214],[276245],{"type":23,"value":217},{"type":23,"value":276247}," supports 176 integrations that support OAuth2 ",{"type":17,"tag":6121,"props":276249,"children":276251},{"className":276250},[],[276252],{"type":23,"value":6121},{"type":23,"value":276254}," flow.",{"type":17,"tag":25,"props":276256,"children":276257},{},[],{"type":17,"tag":68,"props":276259,"children":276261},{"id":276260},"oauth2-openid-connect-oidc-flow",[276262],{"type":23,"value":276263},"OAuth2 OpenID Connect (OIDC) Flow",{"type":17,"tag":29,"props":276265,"children":276266},{},[276267,276268,276275],{"type":23,"value":6712},{"type":17,"tag":133,"props":276269,"children":276272},{"href":276270,"rel":276271},"https://openid.net/developers/how-connect-works/",[214],[276273],{"type":23,"value":276274},"OAuth2 OpenID Connect",{"type":23,"value":276276}," flow is very similar to OAuth2 code flow, except that it is only used for user authentication.",{"type":17,"tag":29,"props":276278,"children":276279},{},[276280,276282,276288],{"type":23,"value":276281},"It differs from the ",{"type":17,"tag":6121,"props":276283,"children":276285},{"className":276284},[],[276286],{"type":23,"value":276287},"code flow",{"type":23,"value":276289}," with not supporting long-servicing access tokens and refresh tokens, since it is meant to be an instant  identity verification service.",{"type":17,"tag":29,"props":276291,"children":276292},{},[276293,276295,276301,276303,276309],{"type":23,"value":276294},"It will either return an ",{"type":17,"tag":6121,"props":276296,"children":276298},{"className":276297},[],[276299],{"type":23,"value":276300},"id_token",{"type":23,"value":276302}," that is a JWT-encoded object contained the verified user identity, such as a name and email. Or it will support a ",{"type":17,"tag":6121,"props":276304,"children":276306},{"className":276305},[],[276307],{"type":23,"value":276308},"/userinfo",{"type":23,"value":276310}," API endpoint to obtain the verified user identity.",{"type":17,"tag":29,"props":276312,"children":276313},{},[276314],{"type":23,"value":276315},"When you see a 'Sign in with Google' button, that is usually an OpenID Connect flow.",{"type":17,"tag":29,"props":276317,"children":276318},{},[276319],{"type":17,"tag":6438,"props":276320,"children":276322},{"alt":6440,"src":276321},"https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-1.png",[],{"type":17,"tag":29,"props":276324,"children":276325},{},[276326,276330,276331,276338,276340,276346],{"type":17,"tag":48,"props":276327,"children":276328},{},[276329],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":133,"props":276332,"children":276335},{"href":276333,"rel":276334},"https://docs.unified.to/auth/login/Sign_in_a_user",[214],[276336],{"type":23,"value":276337},"hides this complexity in our Unified Authentication API",{"type":23,"value":276339},", supporting OIDC along with providers that only support OAuth2 code flow with non-standard ",{"type":17,"tag":6121,"props":276341,"children":276343},{"className":276342},[],[276344],{"type":23,"value":276345},"User Info",{"type":23,"value":276347}," API endpoints.",{"type":17,"tag":68,"props":276349,"children":276351},{"id":276350},"oauth2-client-credentials-flow",[276352],{"type":23,"value":276353},"OAuth2 Client Credentials Flow",{"type":17,"tag":29,"props":276355,"children":276356},{},[276357,276358,276363],{"type":23,"value":276086},{"type":17,"tag":6121,"props":276359,"children":276361},{"className":276360},[],[276362],{"type":23,"value":251360},{"type":23,"value":276364}," flow is for server-to-server (machine-to-machine) authentication. No user is involved; your backend service authenticates as itself to access APIs without the involvement of a human.  To access a end-user's data, they have to obtain a client ID and client secret from their provider and give it to your application.",{"type":17,"tag":29,"props":276366,"children":276367},{},[276368],{"type":17,"tag":48,"props":276369,"children":276370},{},[276371],{"type":23,"value":276101},{"type":17,"tag":80,"props":276373,"children":276374},{},[276375,276380,276385,276390],{"type":17,"tag":84,"props":276376,"children":276377},{},[276378],{"type":23,"value":276379},"Your end-user generates an OAuth2 client ID and client secret in their provider/application and gives it to your application.  They usually will set what permissions they are willing to grant to those credentials.",{"type":17,"tag":84,"props":276381,"children":276382},{},[276383],{"type":23,"value":276384},"Your backend sends the client ID and secret to the provider's token endpoint.",{"type":17,"tag":84,"props":276386,"children":276387},{},[276388],{"type":23,"value":276389},"The provider returns an access token.",{"type":17,"tag":84,"props":276391,"children":276392},{},[276393],{"type":23,"value":276394},"Your backend uses the token to call APIs.",{"type":17,"tag":29,"props":276396,"children":276397},{},[276398],{"type":23,"value":276399},"With Unified.to, your end-user will be asked to fill out these credentials, plus any other required credentials to access that integration's API.",{"type":17,"tag":29,"props":276401,"children":276402},{},[276403],{"type":17,"tag":6438,"props":276404,"children":276406},{"alt":6440,"src":276405},"https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-2.png",[],{"type":17,"tag":29,"props":276408,"children":276409},{},[276410,276411,276416,276418,276423],{"type":23,"value":276240},{"type":17,"tag":133,"props":276412,"children":276414},{"href":42620,"rel":276413},[214],[276415],{"type":23,"value":217},{"type":23,"value":276417}," supports 29 integrations that support OAuth2 ",{"type":17,"tag":6121,"props":276419,"children":276421},{"className":276420},[],[276422],{"type":23,"value":251271},{"type":23,"value":276254},{"type":17,"tag":25,"props":276425,"children":276426},{},[],{"type":17,"tag":68,"props":276428,"children":276430},{"id":276429},"api-token-key-username-password-authentication",[276431],{"type":23,"value":276432},"API Token / Key / Username & Password Authentication",{"type":17,"tag":29,"props":276434,"children":276435},{},[276436,276438,276444,276445,276451,276453,276459,276461,276468],{"type":23,"value":276437},"Additionally, APIs can also be authenticated with a ",{"type":17,"tag":6121,"props":276439,"children":276441},{"className":276440},[],[276442],{"type":23,"value":276443},"API key",{"type":23,"value":276138},{"type":17,"tag":6121,"props":276446,"children":276448},{"className":276447},[],[276449],{"type":23,"value":276450},"API token",{"type":23,"value":276452}," , or even a ",{"type":17,"tag":6121,"props":276454,"children":276456},{"className":276455},[],[276457],{"type":23,"value":276458},"username and password",{"type":23,"value":276460}," . The keys and tokens consist of either random characters or an encoded ",{"type":17,"tag":133,"props":276462,"children":276465},{"href":276463,"rel":276464},"https://www.jwt.io/",[214],[276466],{"type":23,"value":276467},"JWT",{"type":23,"value":276469}," (JSON web token).",{"type":17,"tag":29,"props":276471,"children":276472},{},[276473,276475,276480],{"type":23,"value":276474},"They can be sent in the ",{"type":17,"tag":6121,"props":276476,"children":276478},{"className":276477},[],[276479],{"type":23,"value":7306},{"type":23,"value":276481}," header, in a custom header or in the URL query as a parameter.",{"type":17,"tag":29,"props":276483,"children":276484},{},[276485,276487,276492],{"type":23,"value":276486},"If instead of an API Key, an API uses username and password for authentication, that combination is sent in the ",{"type":17,"tag":6121,"props":276488,"children":276490},{"className":276489},[],[276491],{"type":23,"value":7306},{"type":23,"value":276493}," header but base64-encoded as 'username:password'.",{"type":17,"tag":29,"props":276495,"children":276496},{},[276497],{"type":23,"value":276498},"Since these values are sent in the clear for an API request, they should only be sent by a backend as they would be leaked to the end-user if used in a browser.",{"type":17,"tag":29,"props":276500,"children":276501},{},[276502,276507,276509,276516],{"type":17,"tag":133,"props":276503,"children":276505},{"href":42620,"rel":276504},[214],[276506],{"type":23,"value":217},{"type":23,"value":276508}," can ask the end-user for any number of API keys/tokens and additional required API credentials.  Optionally, our customers can request this information from their end-users and ",{"type":17,"tag":133,"props":276510,"children":276513},{"href":276511,"rel":276512},"https://docs.unified.to/unified/connection/Create_connection",[214],[276514],{"type":23,"value":276515},"create a connection manually",{"type":23,"value":54},{"type":17,"tag":29,"props":276518,"children":276519},{},[276520],{"type":17,"tag":6438,"props":276521,"children":276523},{"alt":6440,"src":276522},"https://s3.us-east-2.amazonaws.com/unified-article-images/understanding_oauth2_authorization_flows-3.png",[],{"type":17,"tag":29,"props":276525,"children":276526},{},[276527,276528,276533],{"type":23,"value":276240},{"type":17,"tag":133,"props":276529,"children":276531},{"href":42620,"rel":276530},[214],[276532],{"type":23,"value":217},{"type":23,"value":276534}," supports 226 integrations that support API keys/tokens.",{"type":17,"tag":25,"props":276536,"children":276537},{},[],{"type":17,"tag":29,"props":276539,"children":276540},{},[276541,276543,276550],{"type":23,"value":276542},"If you are interested in reading about more complexities with OAuth2, read our blog post about '",{"type":17,"tag":133,"props":276544,"children":276547},{"href":276545,"rel":276546},"https://unified.to/blog/how_we_normalize_oauth_across_280_apis_at_unified",[214],[276548],{"type":23,"value":276549},"How we normalize Oauth across all of our API integrations",{"type":23,"value":251519},{"title":7,"searchDepth":1629,"depth":1629,"links":276552},[276553,276554,276555,276556],{"id":276078,"depth":1629,"text":276081},{"id":276260,"depth":1629,"text":276263},{"id":276350,"depth":1629,"text":276353},{"id":276429,"depth":1629,"text":276432},"content:blog:understanding_oauth2_authorization_flows.md","blog/understanding_oauth2_authorization_flows.md","blog/understanding_oauth2_authorization_flows",{"_path":276561,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":163591,"description":276562,"img":276563,"date":276564,"tag":6341,"body":276565,"_type":1677,"_id":276949,"_source":1679,"_file":276950,"_stem":276951,"_extension":1682},"/blog/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data","With Unified, you can a build talent intelligence application that work with your customers' preferred ATS platform, such as Lever and Greenhouse.","https://s3.us-east-2.amazonaws.com/unified-article-images/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data-icon.png","2025-10-14T00:00:00.000Z",{"type":14,"children":276566,"toc":276934},[276567,276572,276575,276583,276587,276598,276603,276609,276614,276642,276647,276650,276654,276690,276693,276699,276704,276713,276724,276733,276736,276742,276751,276754,276760,276765,276776,276781,276784,276790,276795,276804,276807,276813,276818,276827,276833,276838,276843,276846,276852,276861,276864,276870,276875,276884,276887,276893,276902,276905,276911,276929],{"type":17,"tag":18,"props":276568,"children":276570},{"id":276569},"ats-to-vector-db-how-to-power-talent-intelligence-with-real-time-data",[276571],{"type":23,"value":163591},{"type":17,"tag":25,"props":276573,"children":276574},{},[],{"type":17,"tag":29,"props":276576,"children":276577},{},[276578],{"type":17,"tag":33,"props":276579,"children":276580},{},[276581],{"type":23,"value":276582},"October 14, 2025",{"type":17,"tag":29,"props":276584,"children":276585},{},[276586],{"type":23,"value":276562},{"type":17,"tag":29,"props":276588,"children":276589},{},[276590,276592,276596],{"type":23,"value":276591},"With a single API integration, you can fetch candidate records, normalize and embed resumes, and then push those embeddings into a vector database like Pinecone for real-time search and recruiter agent workflows. This is a complete ",{"type":17,"tag":133,"props":276593,"children":276594},{"href":77021},[276595],{"type":23,"value":77024},{"type":23,"value":276597}," (RAG) pipeline for talent intelligence, powered by real-time ATS data.",{"type":17,"tag":29,"props":276599,"children":276600},{},[276601],{"type":23,"value":276602},"This guide shows you how to go from ATS to vector DB, step by step, using Unified, GenAI, and Pinecone.",{"type":17,"tag":239,"props":276604,"children":276606},{"id":276605},"what-this-rag-pipeline-does",[276607],{"type":23,"value":276608},"What This RAG Pipeline Does",{"type":17,"tag":29,"props":276610,"children":276611},{},[276612],{"type":23,"value":276613},"This guide walks through a full RAG architecture:",{"type":17,"tag":6154,"props":276615,"children":276616},{},[276617,276622,276627,276632,276637],{"type":17,"tag":84,"props":276618,"children":276619},{},[276620],{"type":23,"value":276621},"Fetch normalized candidate data from an ATS.",{"type":17,"tag":84,"props":276623,"children":276624},{},[276625],{"type":23,"value":276626},"Chunk and embed resume content.",{"type":17,"tag":84,"props":276628,"children":276629},{},[276630],{"type":23,"value":276631},"Store embeddings in a vector database.",{"type":17,"tag":84,"props":276633,"children":276634},{},[276635],{"type":23,"value":276636},"Retrieve the most relevant candidates at query time.",{"type":17,"tag":84,"props":276638,"children":276639},{},[276640],{"type":23,"value":276641},"Use retrieved context to power recruiter search, ranking, or AI agents. Unified Use Case RAG Pipelines",{"type":17,"tag":29,"props":276643,"children":276644},{},[276645],{"type":23,"value":276646},"Unified handles ingestion and real-time updates across ATS providers; embeddings and vector storage remain in your infrastructure.",{"type":17,"tag":25,"props":276648,"children":276649},{},[],{"type":17,"tag":68,"props":276651,"children":276652},{"id":141798},[276653],{"type":23,"value":141801},{"type":17,"tag":80,"props":276655,"children":276656},{},[276657,276662,276667,276675,276680,276685],{"type":17,"tag":84,"props":276658,"children":276659},{},[276660],{"type":23,"value":276661},"Node.js (v18+)",{"type":17,"tag":84,"props":276663,"children":276664},{},[276665],{"type":23,"value":276666},"Unified account with ATS integration enabled (e.g., Lever, Greenhouse)",{"type":17,"tag":84,"props":276668,"children":276669},{},[276670,276674],{"type":17,"tag":133,"props":276671,"children":276672},{"href":7691},[276673],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":276676,"children":276677},{},[276678],{"type":23,"value":276679},"Your customer's ATS connection ID",{"type":17,"tag":84,"props":276681,"children":276682},{},[276683],{"type":23,"value":276684},"Unified GenAI connection ID (or OpenAI API key for embeddings)",{"type":17,"tag":84,"props":276686,"children":276687},{},[276688],{"type":23,"value":276689},"Pinecone API key and environment",{"type":17,"tag":25,"props":276691,"children":276692},{},[],{"type":17,"tag":68,"props":276694,"children":276696},{"id":276695},"step-1-setting-up-your-project",[276697],{"type":23,"value":276698},"Step 1: Setting up your project",{"type":17,"tag":29,"props":276700,"children":276701},{},[276702],{"type":23,"value":276703},"As always, let's get the basics out of the way!",{"type":17,"tag":6893,"props":276705,"children":276708},{"className":276706,"code":276707,"language":48432,"meta":7},[48430],"mkdir ats-vector-demo\ncd ats-vector-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv @pinecone-database/pinecone openai\n",[276709],{"type":17,"tag":6121,"props":276710,"children":276711},{"__ignoreMap":7},[276712],{"type":23,"value":276707},{"type":17,"tag":29,"props":276714,"children":276715},{},[276716,276718,276723],{"type":23,"value":276717},"Add your credentials to ",{"type":17,"tag":6121,"props":276719,"children":276721},{"className":276720},[],[276722],{"type":23,"value":211221},{"type":23,"value":20456},{"type":17,"tag":6893,"props":276725,"children":276728},{"className":276726,"code":276727,"language":20901,"meta":23},[20899],"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_ATS=your_customer_ats_connection_id\nCONNECTION_GENAI=your_genai_connection_id\nPINECONE_API_KEY=your_pinecone_api_key\nPINECONE_ENVIRONMENT=your_pinecone_env\nPINECONE_INDEX=your_pinecone_index\n",[276729],{"type":17,"tag":6121,"props":276730,"children":276731},{"__ignoreMap":7},[276732],{"type":23,"value":276727},{"type":17,"tag":25,"props":276734,"children":276735},{},[],{"type":17,"tag":68,"props":276737,"children":276739},{"id":276738},"step-2-initialize-the-sdks",[276740],{"type":23,"value":276741},"Step 2: Initialize the SDKs",{"type":17,"tag":6893,"props":276743,"children":276746},{"className":276744,"code":276745,"language":18718,"meta":7},[18716],"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { Pinecone } from '@pinecone-database/pinecone';\n\nconst {\n  UNIFIED_API_KEY,\n  CONNECTION_ATS,\n  CONNECTION_GENAI,\n  PINECONE_API_KEY,\n  PINECONE_ENVIRONMENT,\n  PINECONE_INDEX\n} = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n\nconst pinecone = new Pinecone({\n  apiKey: PINECONE_API_KEY!,\n  environment: PINECONE_ENVIRONMENT!,\n});\nconst index = pinecone.Index(PINECONE_INDEX!);\n",[276747],{"type":17,"tag":6121,"props":276748,"children":276749},{"__ignoreMap":7},[276750],{"type":23,"value":276745},{"type":17,"tag":25,"props":276752,"children":276753},{},[],{"type":17,"tag":68,"props":276755,"children":276757},{"id":276756},"step-3-how-to-get-your-customers-connection-id",[276758],{"type":23,"value":276759},"Step 3: How to Get Your Customer's Connection ID",{"type":17,"tag":29,"props":276761,"children":276762},{},[276763],{"type":23,"value":276764},"Before you can fetch candidates, your customer must authorize your app to access their ATS (e.g., Lever, Greenhouse) via Unified's embedded authorization flow.",{"type":17,"tag":29,"props":276766,"children":276767},{},[276768,276770,276774],{"type":23,"value":276769},"Once authorized, you'll receive a ",{"type":17,"tag":48,"props":276771,"children":276772},{},[276773],{"type":23,"value":195321},{"type":23,"value":276775}," for that customer's integration.",{"type":17,"tag":29,"props":276777,"children":276778},{},[276779],{"type":23,"value":276780},"Store this connection ID securely and use it in all API calls for that customer.",{"type":17,"tag":25,"props":276782,"children":276783},{},[],{"type":17,"tag":68,"props":276785,"children":276787},{"id":276786},"step-4-fetch-and-normalize-candidate-records",[276788],{"type":23,"value":276789},"Step 4: Fetch and Normalize Candidate Records",{"type":17,"tag":29,"props":276791,"children":276792},{},[276793],{"type":23,"value":276794},"Fetch candidate records from the ATS and normalize their resumes for embedding. Normalizing resumes before embedding improves retrieval quality and ensures consistent embeddings across 60+ ATS providers.",{"type":17,"tag":6893,"props":276796,"children":276799},{"className":276797,"code":276798,"language":18718,"meta":7},[18716],"export async function fetchCandidates(connectionId: string) {\n  const candidatesResult = await sdk.ats.listAtsCandidates({\n    connectionId,\n    limit: 10,\n  });\n    return candidatesResult; // AtsCandidate[]\n}\n\nexport function normalizeResume(candidate: any): string {\n  return [\n    `Name: ${candidate.name}`,\n    `Email: ${candidate.emails?.[0]?.email || \"\"}`,\n    `Title: ${candidate.title || \"\"}`,\n    `Summary: ${candidate.summary || \"\"}`,\n    `Experience: ${(candidate.experiences || []).map((exp: any) => `${exp.title} at ${exp.company_name}`).join(\"; \")}`,\n    `Education: ${(candidate.education || []).map((edu: any) => `${edu.degree_name} from ${edu.institution_name}`).join(\"; \")}``\n  ].join('\\\\n');\n}\n",[276800],{"type":17,"tag":6121,"props":276801,"children":276802},{"__ignoreMap":7},[276803],{"type":23,"value":276798},{"type":17,"tag":25,"props":276805,"children":276806},{},[],{"type":17,"tag":68,"props":276808,"children":276810},{"id":276809},"step-5-embed-resumes-with-genai",[276811],{"type":23,"value":276812},"Step 5: Embed Resumes with GenAI",{"type":17,"tag":29,"props":276814,"children":276815},{},[276816],{"type":23,"value":276817},"Use Unified GenAI to embed the normalized resume text.",{"type":17,"tag":6893,"props":276819,"children":276822},{"className":276820,"code":276821,"language":18718,"meta":7},[18716],"export async function embedResume(resumeText: string) {\n  const result = await sdk.genai.createGenaiEmbedding({\n    connectionId: CONNECTION_GENAI!,\n    embedding: {\n      content: {\n        text: resumeText,\n      },\n      model_id: 'text-embedding-3-small',\n      maxTokens: 1024,\n      enconding_format: 'FLOAT'\n    },\n  });\n  return result.embeddings;\n}\n",[276823],{"type":17,"tag":6121,"props":276824,"children":276825},{"__ignoreMap":7},[276826],{"type":23,"value":276821},{"type":17,"tag":239,"props":276828,"children":276830},{"id":276829},"keeping-the-vector-index-up-to-date",[276831],{"type":23,"value":276832},"Keeping the Vector Index Up to Date",{"type":17,"tag":29,"props":276834,"children":276835},{},[276836],{"type":23,"value":276837},"To keep your RAG pipeline current, subscribe to ATS webhooks for candidate create or update events. When a resume changes, re-fetch the candidate, re-embed the content, and update the vector index.\nUnified Use Case RAG Pipelines",{"type":17,"tag":29,"props":276839,"children":276840},{},[276841],{"type":23,"value":276842},"This ensures your talent intelligence reflects the latest application data in real time.",{"type":17,"tag":25,"props":276844,"children":276845},{},[],{"type":17,"tag":68,"props":276847,"children":276849},{"id":276848},"step-6-push-embeddings-to-pinecone",[276850],{"type":23,"value":276851},"Step 6: Push Embeddings to Pinecone",{"type":17,"tag":6893,"props":276853,"children":276856},{"className":276854,"code":276855,"language":18718,"meta":7},[18716],"export async function upsertCandidateToPinecone(candidate: any, embedding: number[]) {\n  await index.upsert([\n    {\n      id: candidate.id,\n      values: embedding,\n      metadata: {\n        name: candidate.name,\n        email: candidate.emails?.[0]?.email || \"\",\n        candidate_id: candidate.id,\n      },\n    },\n  ]);\n}\n",[276857],{"type":17,"tag":6121,"props":276858,"children":276859},{"__ignoreMap":7},[276860],{"type":23,"value":276855},{"type":17,"tag":25,"props":276862,"children":276863},{},[],{"type":17,"tag":68,"props":276865,"children":276867},{"id":276866},"step-7-simple-retrieval-flow",[276868],{"type":23,"value":276869},"Step 7: Simple Retrieval Flow",{"type":17,"tag":29,"props":276871,"children":276872},{},[276873],{"type":23,"value":276874},"Given a recruiter query, embed it and search Pinecone for the most relevant candidates.",{"type":17,"tag":6893,"props":276876,"children":276879},{"className":276877,"code":276878,"language":18718,"meta":7},[18716],"export async function searchCandidates(query: string) {\n\n  const result = await sdk.genai.createGenaiPrompt({\n    connectionId: CONNECTION_GENAI!,\n    prompt: {\n      messages: [{ role: \"USER\", content: `Embed this query:\\\\n${query}` }],\n      maxTokens: 1024,\n      temperature: 0.0,\n      responseFormat: \"embedding\",\n    },\n  });\n  const queryEmbedding = result.choices?.[0]?.message?.embedding || [];\n\n\n  const pineconeResults = await index.query({\n    vector: queryEmbedding,\n    topK: 5,\n    includeMetadata: true,\n  });\n\n  return pineconeResults.matches;\n}\n",[276880],{"type":17,"tag":6121,"props":276881,"children":276882},{"__ignoreMap":7},[276883],{"type":23,"value":276878},{"type":17,"tag":25,"props":276885,"children":276886},{},[],{"type":17,"tag":68,"props":276888,"children":276890},{"id":276889},"step-8-example-usage",[276891],{"type":23,"value":276892},"Step 8: Example Usage",{"type":17,"tag":6893,"props":276894,"children":276897},{"className":276895,"code":276896,"language":18718,"meta":7},[18716],"async function main() {\n\n  const candidates = await fetchCandidates(CONNECTION_ATS!);\n  for (const candidate of candidates) {\n    const resumeText = normalizeResume(candidate);\n    const embedding = await embedResume(resumeText);\n    await upsertCandidateToPinecone(candidate, embedding);\n  }\n\n\n  const matches = await searchCandidates(\"Senior Python developer with fintech experience\");\n  console.log(\"Top matches:\", matches);\n}\n\nmain();\n",[276898],{"type":17,"tag":6121,"props":276899,"children":276900},{"__ignoreMap":7},[276901],{"type":23,"value":276896},{"type":17,"tag":25,"props":276903,"children":276904},{},[],{"type":17,"tag":68,"props":276906,"children":276908},{"id":276907},"what-just-happened",[276909],{"type":23,"value":276910},"What just happened?",{"type":17,"tag":80,"props":276912,"children":276913},{},[276914,276919,276924],{"type":17,"tag":84,"props":276915,"children":276916},{},[276917],{"type":23,"value":276918},"And just like that you can fetch candidate records from any ATS (Lever, Greenhouse, etc.) using a single API.",{"type":17,"tag":84,"props":276920,"children":276921},{},[276922],{"type":23,"value":276923},"You can then normalize and embed resumes with Unified GenAI, push them into Pinecone, and power a RAG-based recruiter search layer.",{"type":17,"tag":84,"props":276925,"children":276926},{},[276927],{"type":23,"value":276928},"Recruiters can then search for talent using natural language, and retrieve the most relevant candidates instantly.",{"type":17,"tag":29,"props":276930,"children":276931},{},[276932],{"type":23,"value":276933},"Happy Building! 🎉",{"title":7,"searchDepth":1629,"depth":1629,"links":276935},[276936,276937,276938,276939,276940,276941,276942,276945,276946,276947,276948],{"id":276605,"depth":1635,"text":276608},{"id":141798,"depth":1629,"text":141801},{"id":276695,"depth":1629,"text":276698},{"id":276738,"depth":1629,"text":276741},{"id":276756,"depth":1629,"text":276759},{"id":276786,"depth":1629,"text":276789},{"id":276809,"depth":1629,"text":276812,"children":276943},[276944],{"id":276829,"depth":1635,"text":276832},{"id":276848,"depth":1629,"text":276851},{"id":276866,"depth":1629,"text":276869},{"id":276889,"depth":1629,"text":276892},{"id":276907,"depth":1629,"text":276910},"content:blog:ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data.md","blog/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data.md","blog/ats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data",{"_path":276953,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":266545,"description":276954,"img":276955,"date":276564,"tag":12,"body":276956,"_type":1677,"_id":277170,"_source":1679,"_file":277171,"_stem":277172,"_extension":1682},"/blog/unified_is_now_hipaa_compliant","Healthcare accounts for nearly 17% of U.S. GDP, and the shift to digital delivery means APIs now move more patient data than ever. Protecting that data is no...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_is_now_hipaa_compliant-icon.png",{"type":14,"children":276957,"toc":277165},[276958,276963,276966,276973,276978,276990,276998,277041,277046,277051,277056,277061,277072,277078,277083,277087,277120,277124,277129,277134],{"type":17,"tag":18,"props":276959,"children":276961},{"id":276960},"unified-is-now-hipaa-compliant",[276962],{"type":23,"value":266545},{"type":17,"tag":25,"props":276964,"children":276965},{},[],{"type":17,"tag":29,"props":276967,"children":276968},{},[276969],{"type":17,"tag":33,"props":276970,"children":276971},{},[276972],{"type":23,"value":276582},{"type":17,"tag":29,"props":276974,"children":276975},{},[276976],{"type":23,"value":276977},"Healthcare accounts for nearly 17% of U.S. GDP, and the shift to digital delivery means APIs now move more patient data than ever. Protecting that data is no longer optional.",{"type":17,"tag":29,"props":276979,"children":276980},{},[276981,276983,276988],{"type":23,"value":276982},"Unified has achieved ",{"type":17,"tag":48,"props":276984,"children":276985},{},[276986],{"type":23,"value":276987},"HIPAA (& PIPEDA) compliance",{"type":23,"value":276989},", expanding our zero-storage, real-time API infrastructure to support healthcare and health-adjacent SaaS companies that handle electronic Protected Health Information (ePHI).",{"type":17,"tag":29,"props":276991,"children":276992},{},[276993],{"type":17,"tag":48,"props":276994,"children":276995},{},[276996],{"type":23,"value":276997},"What this means for our customers:",{"type":17,"tag":80,"props":276999,"children":277000},{},[277001,277011,277021,277031],{"type":17,"tag":84,"props":277002,"children":277003},{},[277004,277009],{"type":17,"tag":48,"props":277005,"children":277006},{},[277007],{"type":23,"value":277008},"No stored data:",{"type":23,"value":277010}," Unified never caches or persists customer data — every API call is fetched directly from the source in real time.",{"type":17,"tag":84,"props":277012,"children":277013},{},[277014,277019],{"type":17,"tag":48,"props":277015,"children":277016},{},[277017],{"type":23,"value":277018},"Secure by design:",{"type":23,"value":277020}," OAuth2 credential handling, optional AWS Secrets Manager storage, IP allow-listing, and SOC 2 Type II + GDPR alignment meet HIPAA's Security and Privacy Rules.",{"type":17,"tag":84,"props":277022,"children":277023},{},[277024,277029],{"type":17,"tag":48,"props":277025,"children":277026},{},[277027],{"type":23,"value":277028},"Business Associate Agreements (BAAs):",{"type":23,"value":277030}," Unified can execute BAAs for customers processing ePHI.",{"type":17,"tag":84,"props":277032,"children":277033},{},[277034,277039],{"type":17,"tag":48,"props":277035,"children":277036},{},[277037],{"type":23,"value":277038},"Integrations ready for healthcare applications:",{"type":23,"value":277040}," Real-time access to HR, CRM, accounting, and communication systems used across healthcare SaaS workflows—without compromising compliance.",{"type":17,"tag":29,"props":277042,"children":277043},{},[277044],{"type":23,"value":277045},"Security has always been core to Unified's architecture — from how we handle authentication and encryption to our zero-storage model that ensures customer data is never cached or persisted. For product and platform teams building healthcare-related SaaS or AI features, Unified now provides a compliant foundation for integrations and data connectivity—without added infrastructure risk.",{"type":17,"tag":239,"props":277047,"children":277048},{"id":252568},[277049],{"type":23,"value":277050},"Why It Matters",{"type":17,"tag":29,"props":277052,"children":277053},{},[277054],{"type":23,"value":277055},"As healthcare moves from clinics to cloud applications, developers need to integrate with HR, CRM, billing, scheduling, and communication systems that touch patient data.",{"type":17,"tag":29,"props":277057,"children":277058},{},[277059],{"type":23,"value":277060},"APIs make this possible—but they also introduce risk. When data is cached, logged, or stored outside a covered environment, it falls under HIPAA's Privacy, Security, and Breach Notification Rules—adding compliance overhead and slowing go-to-market.",{"type":17,"tag":29,"props":277062,"children":277063},{},[277064,277066,277070],{"type":23,"value":277065},"Unified removes that friction with a ",{"type":17,"tag":48,"props":277067,"children":277068},{},[277069],{"type":23,"value":50812},{"type":23,"value":277071}," that never stores or replicates data, eliminating liability while maintaining speed.",{"type":17,"tag":239,"props":277073,"children":277075},{"id":277074},"built-for-healthcare-saas-and-ai-products",[277076],{"type":23,"value":277077},"Built for Healthcare SaaS and AI Products",{"type":17,"tag":29,"props":277079,"children":277080},{},[277081],{"type":23,"value":277082},"Developers building healthcare or adjacent SaaS products can now integrate safely with the systems their users rely on—without changing their infrastructure.",{"type":17,"tag":29,"props":277084,"children":277085},{},[277086],{"type":23,"value":217214},{"type":17,"tag":80,"props":277088,"children":277089},{},[277090,277100,277110],{"type":17,"tag":84,"props":277091,"children":277092},{},[277093,277098],{"type":17,"tag":48,"props":277094,"children":277095},{},[277096],{"type":23,"value":277097},"Healthcare SaaS platforms",{"type":23,"value":277099}," connecting to HRIS or payroll systems for clinician onboarding",{"type":17,"tag":84,"props":277101,"children":277102},{},[277103,277108],{"type":17,"tag":48,"props":277104,"children":277105},{},[277106],{"type":23,"value":277107},"Telehealth providers",{"type":23,"value":277109}," syncing CRM and messaging tools for secure patient engagement",{"type":17,"tag":84,"props":277111,"children":277112},{},[277113,277118],{"type":17,"tag":48,"props":277114,"children":277115},{},[277116],{"type":23,"value":277117},"AI copilots and analytics apps",{"type":23,"value":277119}," reading scheduling, claims, or operations data live—without persisting ePHI",{"type":17,"tag":239,"props":277121,"children":277122},{"id":96828},[277123],{"type":23,"value":96831},{"type":17,"tag":29,"props":277125,"children":277126},{},[277127],{"type":23,"value":277128},"Few integration platforms support HIPAA compliance without data storage or caching. Unified's real-time architecture achieves compliance without replicating customer data, minimizing both risk and liability.",{"type":17,"tag":29,"props":277130,"children":277131},{},[277132],{"type":23,"value":277133},"HIPAA compliance strengthens what Unified already stands for: secure, real-time data infrastructure that gives SaaS teams control without adding liability.",{"type":17,"tag":29,"props":277135,"children":277136},{},[277137,277139,277143,277144,277148,277150,277155,277157,277163],{"type":23,"value":277138},"If you're building a healthcare or health-adjacent product that handles sensitive data, you can now use Unified's ",{"type":17,"tag":133,"props":277140,"children":277141},{"href":7691},[277142],{"type":23,"value":7459},{"type":23,"value":34435},{"type":17,"tag":133,"props":277145,"children":277146},{"href":326},[277147],{"type":23,"value":329},{"type":23,"value":277149}," server as a compliant foundation for integrations and AI-driven automation. Visit our ",{"type":17,"tag":133,"props":277151,"children":277153},{"href":267279,"rel":277152},[214],[277154],{"type":23,"value":252641},{"type":23,"value":277156}," to request HIPAA documentation or ",{"type":17,"tag":133,"props":277158,"children":277160},{"href":215330,"rel":277159},[214],[277161],{"type":23,"value":277162},"contact our team",{"type":23,"value":277164}," to discuss your use case.",{"title":7,"searchDepth":1629,"depth":1629,"links":277166},[277167,277168,277169],{"id":252568,"depth":1635,"text":277050},{"id":277074,"depth":1635,"text":277077},{"id":96828,"depth":1635,"text":96831},"content:blog:unified_is_now_hipaa_compliant.md","blog/unified_is_now_hipaa_compliant.md","blog/unified_is_now_hipaa_compliant",{"_path":277174,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":45489,"description":277175,"img":277176,"date":277177,"tag":12,"body":277178,"_type":1677,"_id":277604,"_source":1679,"_file":277605,"_stem":277606,"_extension":1682},"/blog/why_use_a_unified_mcp_instead_of_connecting_directly_to_vendor_mcps","AI agents are changing how SaaS products interact with customer data. From copilots that summarize CRM notes to autonomous workflows that close deals or update...","https://s3.us-east-2.amazonaws.com/unified-article-images/why_use_a_unified_mcp_instead_of_connecting_directly_to_vendor_mcps-icon.png","2025-10-09T00:00:00.000Z",{"type":14,"children":277179,"toc":277592},[277180,277185,277188,277196,277201,277217,277227,277233,277238,277286,277291,277297,277309,277314,277320,277325,277330,277336,277341,277346,277351,277357,277370,277375,277381,277386,277391,277397,277402,277407,277413,277558,277564,277569,277574],{"type":17,"tag":18,"props":277181,"children":277183},{"id":277182},"why-use-a-unified-mcp-instead-of-connecting-directly-to-vendor-mcps",[277184],{"type":23,"value":45489},{"type":17,"tag":25,"props":277186,"children":277187},{},[],{"type":17,"tag":29,"props":277189,"children":277190},{},[277191],{"type":17,"tag":33,"props":277192,"children":277193},{},[277194],{"type":23,"value":277195},"October 9, 2025",{"type":17,"tag":29,"props":277197,"children":277198},{},[277199],{"type":23,"value":277200},"AI agents are changing how SaaS products interact with customer data. From copilots that summarize CRM notes to autonomous workflows that close deals or update tickets, these agents rely on real-time, permissioned access to business systems.",{"type":17,"tag":29,"props":277202,"children":277203},{},[277204,277206,277210,277211,277215],{"type":23,"value":277205},"Most major SaaS vendors, like HubSpot, Salesforce, and Notion, are beginning to release their own ",{"type":17,"tag":133,"props":277207,"children":277208},{"href":64193},[277209],{"type":23,"value":44580},{"type":23,"value":44573},{"type":17,"tag":133,"props":277212,"children":277213},{"href":326},[277214],{"type":23,"value":329},{"type":23,"value":277216},") servers to deliver data to large language models. But connecting directly to each vendor's MCP quickly creates the same problem teams have faced for years with APIs: fragmentation, inconsistent schemas, and limited scalability.",{"type":17,"tag":29,"props":277218,"children":277219},{},[277220,277221,277226],{"type":23,"value":230412},{"type":17,"tag":133,"props":277222,"children":277224},{"href":45414,"rel":277223},[214],[277225],{"type":23,"value":45418},{"type":23,"value":230422},{"type":17,"tag":68,"props":277228,"children":277230},{"id":277229},"the-limits-of-vendor-mcps",[277231],{"type":23,"value":277232},"The Limits of Vendor MCPs",{"type":17,"tag":29,"props":277234,"children":277235},{},[277236],{"type":23,"value":277237},"A vendor MCP only provides access to one system. For a single use case—say, summarizing HubSpot deals—it works fine. But the moment your AI agent needs to cross systems (HubSpot → Gmail → Slack → QuickBooks), you hit structural limits:",{"type":17,"tag":80,"props":277239,"children":277240},{},[277241,277251,277266,277276],{"type":17,"tag":84,"props":277242,"children":277243},{},[277244,277249],{"type":17,"tag":48,"props":277245,"children":277246},{},[277247],{"type":23,"value":277248},"No cross-vendor schema:",{"type":23,"value":277250}," Each MCP defines its own data objects and permissions.",{"type":17,"tag":84,"props":277252,"children":277253},{},[277254,277259,277260,277264],{"type":17,"tag":48,"props":277255,"children":277256},{},[277257],{"type":23,"value":277258},"Different auth flows:",{"type":23,"value":18757},{"type":17,"tag":133,"props":277261,"children":277262},{"href":779},[277263],{"type":23,"value":782},{"type":23,"value":277265}," scope handling varies widely across vendors.",{"type":17,"tag":84,"props":277267,"children":277268},{},[277269,277274],{"type":17,"tag":48,"props":277270,"children":277271},{},[277272],{"type":23,"value":277273},"Inconsistent security and logging:",{"type":23,"value":277275}," Some MCPs cache data; others don't expose audit logs at all.",{"type":17,"tag":84,"props":277277,"children":277278},{},[277279,277284],{"type":17,"tag":48,"props":277280,"children":277281},{},[277282],{"type":23,"value":277283},"Limited extensibility:",{"type":23,"value":277285}," You'll rebuild the same logic every time you add a new system.",{"type":17,"tag":29,"props":277287,"children":277288},{},[277289],{"type":23,"value":277290},"Building around one MCP means hardcoding against a single vendor's data model—and losing flexibility as your product evolves.",{"type":17,"tag":68,"props":277292,"children":277294},{"id":277293},"unifiedto-mcp-one-infrastructure-for-every-integration",[277295],{"type":23,"value":277296},"Unified.to MCP: One Infrastructure for Every Integration",{"type":17,"tag":29,"props":277298,"children":277299},{},[277300,277302,277307],{"type":23,"value":277301},"Unified MCP extends Unified.to's real-time integration infrastructure into the world of AI agents. It turns 350+ SaaS integrations into callable tools that can be safely executed inside LLMs like ",{"type":17,"tag":48,"props":277303,"children":277304},{},[277305],{"type":23,"value":277306},"Anthropic's Claude, OpenAI's ChatGPT, Google Gemini, Groq, x.ai's Grok, and Cohere",{"type":23,"value":277308}," — with full support for each model's native tool-calling protocol.",{"type":17,"tag":29,"props":277310,"children":277311},{},[277312],{"type":23,"value":277313},"Instead of connecting to HubSpot's MCP, Salesforce's MCP, or Notion's MCP separately, you connect once to Unified MCP and access them all through a unified, real-time layer.",{"type":17,"tag":239,"props":277315,"children":277317},{"id":277316},"unified-data-model-across-systems",[277318],{"type":23,"value":277319},"Unified Data Model Across Systems",{"type":17,"tag":29,"props":277321,"children":277322},{},[277323],{"type":23,"value":277324},"Unified MCP normalizes schemas across CRMs, HR systems, ATSs, and more. Your AI agent can reason over contacts, candidates, or invoices in a consistent format—no per-vendor mapping or prompt rewriting required.",{"type":17,"tag":29,"props":277326,"children":277327},{},[277328],{"type":23,"value":277329},"This means you can train or prompt your models once and apply them across dozens of systems without maintaining custom logic.",{"type":17,"tag":239,"props":277331,"children":277333},{"id":277332},"real-time-access-secure-by-design",[277334],{"type":23,"value":277335},"Real-Time Access, Secure by Design",{"type":17,"tag":29,"props":277337,"children":277338},{},[277339],{"type":23,"value":277340},"Unified MCP delivers data directly from the source in real time—never cached, stored, or pre-synced.",{"type":17,"tag":29,"props":277342,"children":277343},{},[277344],{"type":23,"value":277345},"Each request runs through a managed OAuth 2.0 flow with normalized scopes and optional credential storage in your own AWS Secrets Manager.",{"type":17,"tag":29,"props":277347,"children":277348},{},[277349],{"type":23,"value":277350},"This passthrough model gives you fresh data, full control over authentication, and a simpler path to compliance with SOC 2, GDPR, and CCPA.",{"type":17,"tag":239,"props":277352,"children":277354},{"id":277353},"scales-beyond-one-vendor",[277355],{"type":23,"value":277356},"Scales Beyond One Vendor",{"type":17,"tag":29,"props":277358,"children":277359},{},[277360,277362,277368],{"type":23,"value":277361},"Unified MCP isn't tied to any specific provider. It already covers 350+ SaaS integrations across ",{"type":17,"tag":133,"props":277363,"children":277365},{"href":87026,"rel":277364},[214],[277366],{"type":23,"value":277367},"21 categories",{"type":23,"value":277369},", including CRM, HR, ATS, file storage, and accounting systems.",{"type":17,"tag":29,"props":277371,"children":277372},{},[277373],{"type":23,"value":277374},"When you're ready to expand your AI agent's capabilities, you don't rebuild integrations—you just enable new ones.",{"type":17,"tag":239,"props":277376,"children":277378},{"id":277377},"ai-ready-by-design",[277379],{"type":23,"value":277380},"AI-Ready by Design",{"type":17,"tag":29,"props":277382,"children":277383},{},[277384],{"type":23,"value":277385},"Unified MCP exposes permissioned SaaS data as structured tools, callable directly by large language models. Each tool supports both read and write actions, enabling your agents to fetch, update, and sync data safely without glue code or prompt hacks.",{"type":17,"tag":29,"props":277387,"children":277388},{},[277389],{"type":23,"value":277390},"This architecture bridges the gap between real-time API access and AI execution—letting your models take meaningful action inside customer environments.",{"type":17,"tag":68,"props":277392,"children":277394},{"id":277393},"compliance-observability-and-control",[277395],{"type":23,"value":277396},"Compliance, Observability, and Control",{"type":17,"tag":29,"props":277398,"children":277399},{},[277400],{"type":23,"value":277401},"Unified MCP provides full observability into tool calls and access scopes. Logs can be shipped directly to your Datadog instance for monitoring, while multi-region deployment (US, EU, AU) ensures data residency compliance for enterprise customers.",{"type":17,"tag":29,"props":277403,"children":277404},{},[277405],{"type":23,"value":277406},"Combined with Unified's zero-cache design, this creates a secure, auditable foundation for AI products that handle sensitive business data.",{"type":17,"tag":68,"props":277408,"children":277410},{"id":277409},"unified-mcp-vs-vendor-mcps",[277411],{"type":23,"value":277412},"Unified MCP vs. Vendor MCPs",{"type":17,"tag":7231,"props":277414,"children":277415},{},[277416,277435],{"type":17,"tag":7235,"props":277417,"children":277418},{},[277419],{"type":17,"tag":7239,"props":277420,"children":277421},{},[277422,277426,277431],{"type":17,"tag":7243,"props":277423,"children":277424},{},[277425],{"type":23,"value":87518},{"type":17,"tag":7243,"props":277427,"children":277428},{},[277429],{"type":23,"value":277430},"Vendor MCP",{"type":17,"tag":7243,"props":277432,"children":277433},{},[277434],{"type":23,"value":45418},{"type":17,"tag":7259,"props":277436,"children":277437},{},[277438,277455,277472,277489,277507,277523,277540],{"type":17,"tag":7239,"props":277439,"children":277440},{},[277441,277445,277450],{"type":17,"tag":7266,"props":277442,"children":277443},{},[277444],{"type":23,"value":42944},{"type":17,"tag":7266,"props":277446,"children":277447},{},[277448],{"type":23,"value":277449},"One per vendor",{"type":17,"tag":7266,"props":277451,"children":277452},{},[277453],{"type":23,"value":277454},"350+ across 21 categories",{"type":17,"tag":7239,"props":277456,"children":277457},{},[277458,277462,277467],{"type":17,"tag":7266,"props":277459,"children":277460},{},[277461],{"type":23,"value":9960},{"type":17,"tag":7266,"props":277463,"children":277464},{},[277465],{"type":23,"value":277466},"Cached or vendor-defined",{"type":17,"tag":7266,"props":277468,"children":277469},{},[277470],{"type":23,"value":277471},"Real-time passthrough",{"type":17,"tag":7239,"props":277473,"children":277474},{},[277475,277479,277484],{"type":17,"tag":7266,"props":277476,"children":277477},{},[277478],{"type":23,"value":266675},{"type":17,"tag":7266,"props":277480,"children":277481},{},[277482],{"type":23,"value":277483},"Vendor-specific",{"type":17,"tag":7266,"props":277485,"children":277486},{},[277487],{"type":23,"value":277488},"Normalized across systems",{"type":17,"tag":7239,"props":277490,"children":277491},{},[277492,277497,277502],{"type":17,"tag":7266,"props":277493,"children":277494},{},[277495],{"type":23,"value":277496},"Auth & scopes",{"type":17,"tag":7266,"props":277498,"children":277499},{},[277500],{"type":23,"value":277501},"Per vendor",{"type":17,"tag":7266,"props":277503,"children":277504},{},[277505],{"type":23,"value":277506},"Unified OAuth2 model",{"type":17,"tag":7239,"props":277508,"children":277509},{},[277510,277514,277519],{"type":17,"tag":7266,"props":277511,"children":277512},{},[277513],{"type":23,"value":96511},{"type":17,"tag":7266,"props":277515,"children":277516},{},[277517],{"type":23,"value":277518},"May cache data",{"type":17,"tag":7266,"props":277520,"children":277521},{},[277522],{"type":23,"value":103157},{"type":17,"tag":7239,"props":277524,"children":277525},{},[277526,277530,277535],{"type":17,"tag":7266,"props":277527,"children":277528},{},[277529],{"type":23,"value":256213},{"type":17,"tag":7266,"props":277531,"children":277532},{},[277533],{"type":23,"value":277534},"Varies",{"type":17,"tag":7266,"props":277536,"children":277537},{},[277538],{"type":23,"value":277539},"SOC 2 Type II, GDPR, CCPA",{"type":17,"tag":7239,"props":277541,"children":277542},{},[277543,277548,277553],{"type":17,"tag":7266,"props":277544,"children":277545},{},[277546],{"type":23,"value":277547},"Auditability",{"type":17,"tag":7266,"props":277549,"children":277550},{},[277551],{"type":23,"value":277552},"Limited or closed",{"type":17,"tag":7266,"props":277554,"children":277555},{},[277556],{"type":23,"value":277557},"Full log export + regional control",{"type":17,"tag":68,"props":277559,"children":277561},{"id":277560},"build-once-scale-everywhere",[277562],{"type":23,"value":277563},"Build Once. Scale Everywhere.",{"type":17,"tag":29,"props":277565,"children":277566},{},[277567],{"type":23,"value":277568},"Direct vendor MCP connections can get you started—but they don't scale across multiple systems or enterprise-grade security needs.",{"type":17,"tag":29,"props":277570,"children":277571},{},[277572],{"type":23,"value":277573},"Unified.to MCP gives you a single, compliant, and future-proof way to expose your customers' SaaS data to AI agents. One integration, one schema, one authentication flow—across every system your customers use.",{"type":17,"tag":29,"props":277575,"children":277576},{},[277577,277583,277585,277590],{"type":17,"tag":133,"props":277578,"children":277580},{"href":43558,"rel":277579},[214],[277581],{"type":23,"value":277582},"Read our MCP docs",{"type":23,"value":277584}," to learn more or ",{"type":17,"tag":133,"props":277586,"children":277588},{"href":1623,"rel":277587},[214],[277589],{"type":23,"value":226481},{"type":23,"value":277591}," to see how Unified MCP simplifies real-time, AI-native integrations.",{"title":7,"searchDepth":1629,"depth":1629,"links":277593},[277594,277595,277601,277602,277603],{"id":277229,"depth":1629,"text":277232},{"id":277293,"depth":1629,"text":277296,"children":277596},[277597,277598,277599,277600],{"id":277316,"depth":1635,"text":277319},{"id":277332,"depth":1635,"text":277335},{"id":277353,"depth":1635,"text":277356},{"id":277377,"depth":1635,"text":277380},{"id":277393,"depth":1629,"text":277396},{"id":277409,"depth":1629,"text":277412},{"id":277560,"depth":1629,"text":277563},"content:blog:why_use_a_unified_mcp_instead_of_connecting_directly_to_vendor_mcps.md","blog/why_use_a_unified_mcp_instead_of_connecting_directly_to_vendor_mcps.md","blog/why_use_a_unified_mcp_instead_of_connecting_directly_to_vendor_mcps",{"_path":277608,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":277609,"description":277610,"img":277611,"date":277612,"tag":12,"body":277613,"_type":1677,"_id":278041,"_source":1679,"_file":278042,"_stem":278043,"_extension":1682},"/blog/the_climate_of_ai_why_real_time_integration_data_infrastructure_matters","The Climate of AI: Why Real-Time Integration Data Infrastructure Matters","The AI boom has created a new kind of pressure for SaaS teams. Every product is expected to launch copilots, agents, or automated insights that act on a...","https://s3.us-east-2.amazonaws.com/unified-article-images/the_climate_of_ai_why_real_time_integration_data_infrastructure_matters-icon.png","2025-10-07T00:00:00.000Z",{"type":14,"children":277614,"toc":278030},[277615,277620,277623,277631,277636,277641,277646,277651,277674,277680,277686,277698,277710,277715,277721,277731,277752,277763,277768,277781,277790,277795,277801,277810,277815,277828,277833,277839,277848,277860,277873,277878,277884,277893,277905,277918,277923,277929,277934,277939,277997,278002,278008,278013,278018],{"type":17,"tag":18,"props":277616,"children":277618},{"id":277617},"the-climate-of-ai-why-real-time-integration-data-infrastructure-matters",[277619],{"type":23,"value":277609},{"type":17,"tag":25,"props":277621,"children":277622},{},[],{"type":17,"tag":29,"props":277624,"children":277625},{},[277626],{"type":17,"tag":33,"props":277627,"children":277628},{},[277629],{"type":23,"value":277630},"October 7, 2025",{"type":17,"tag":29,"props":277632,"children":277633},{},[277634],{"type":23,"value":277635},"The AI boom has created a new kind of pressure for SaaS teams. Every product is expected to launch copilots, agents, or automated insights that act on a customer's data in real time.",{"type":17,"tag":29,"props":277637,"children":277638},{},[277639],{"type":23,"value":277640},"There's another kind of pressure too — speed. New AI-native startups can build and launch features in days using off-the-shelf models and infrastructure. What used to take months of engineering work now takes a handful of prompts and an SDK.",{"type":17,"tag":29,"props":277642,"children":277643},{},[277644],{"type":23,"value":277645},"That means established teams have to move faster than ever, and the bottleneck isn't the model; it's the plumbing. AI features fail not because the model can't reason, but because the product can't reach the data it needs fast enough, reliably enough, or securely enough.",{"type":17,"tag":29,"props":277647,"children":277648},{},[277649],{"type":23,"value":277650},"Most integration infrastructure still runs on 10-year-old assumptions: sync jobs, cached data, and delayed updates. It works for dashboards, not for AI. Copilots need to read and write instantly. Agents need to act on live customer context, not yesterday's snapshot.",{"type":17,"tag":29,"props":277652,"children":277653},{},[277654,277656,277661,277662,277666,277668,277673],{"type":23,"value":277655},"That shift from ",{"type":17,"tag":48,"props":277657,"children":277658},{},[277659],{"type":23,"value":277660},"batch",{"type":23,"value":272695},{"type":17,"tag":48,"props":277663,"children":277664},{},[277665],{"type":23,"value":70016},{"type":23,"value":277667}," defines the new climate of AI, and it's exactly the problem ",{"type":17,"tag":133,"props":277669,"children":277671},{"href":42620,"rel":277670},[214],[277672],{"type":23,"value":217},{"type":23,"value":7461},{"type":17,"tag":68,"props":277675,"children":277677},{"id":277676},"how-product-teams-are-turning-real-time-access-into-competitive-advantage",[277678],{"type":23,"value":277679},"How product teams are turning real-time access into competitive advantage",{"type":17,"tag":239,"props":277681,"children":277683},{"id":277682},"ai-agents-and-enterprise-orchestration",[277684],{"type":23,"value":277685},"AI agents and enterprise orchestration",{"type":17,"tag":29,"props":277687,"children":277688},{},[277689,277696],{"type":17,"tag":133,"props":277690,"children":277693},{"href":277691,"rel":277692},"https://unified.to/blog/how_interstellar_labs_scaled_their_agent_platform_to_enterprise_with_unified",[214],[277694],{"type":23,"value":277695},"Interstellar Labs",{"type":23,"value":277697}," uses Unified.to to power AI agents that coordinate workflows across entire enterprise stacks.",{"type":17,"tag":3414,"props":277699,"children":277700},{},[277701],{"type":17,"tag":29,"props":277702,"children":277703},{},[277704,277705],{"type":23,"value":251519},{"type":17,"tag":33,"props":277706,"children":277707},{},[277708],{"type":23,"value":277709},"Our agents make decisions based on live data, requiring real-time access to customer systems… every tool our agents use runs on current data, never cached or stale.\"",{"type":17,"tag":29,"props":277711,"children":277712},{},[277713],{"type":23,"value":277714},"Unified's real-time pass-through layer gives these agents consistent, authorized access across hundreds of tools — turning complex enterprise environments into unified, scalable systems.",{"type":17,"tag":239,"props":277716,"children":277718},{"id":277717},"recruiting-intelligence-across-dozens-of-atss",[277719],{"type":23,"value":277720},"Recruiting intelligence across dozens of ATSs",{"type":17,"tag":29,"props":277722,"children":277723},{},[277724,277729],{"type":17,"tag":48,"props":277725,"children":277726},{},[277727],{"type":23,"value":277728},"Category:",{"type":23,"value":277730}," ATS · CRM · Messaging",{"type":17,"tag":29,"props":277732,"children":277733},{},[277734,277735,277742,277743,277750],{"type":23,"value":35772},{"type":17,"tag":133,"props":277736,"children":277739},{"href":277737,"rel":277738},"https://unified.to/blog/how_recview_scaled_agency_grade_ats_integrations_with_unified",[214],[277740],{"type":23,"value":277741},"RecView",{"type":23,"value":34435},{"type":17,"tag":133,"props":277744,"children":277747},{"href":277745,"rel":277746},"https://unified.to/blog/focus_on_what_matters_how_talin_ai_built_their_ai_platform_without_integration_headaches",[214],[277748],{"type":23,"value":277749},"Talin.ai",{"type":23,"value":277751}," rely on Unified.to to build AI-driven recruiting features that sync candidates, jobs, and outreach in real time.",{"type":17,"tag":3414,"props":277753,"children":277754},{},[277755],{"type":17,"tag":29,"props":277756,"children":277757},{},[277758],{"type":17,"tag":33,"props":277759,"children":277760},{},[277761],{"type":23,"value":277762},"\"Quick integrations and excellent support — that's the value for us. When agencies need both candidate and client data in their ATS, Unified delivers it fast.\"",{"type":17,"tag":29,"props":277764,"children":277765},{},[277766],{"type":23,"value":277767},"— RecView",{"type":17,"tag":3414,"props":277769,"children":277770},{},[277771],{"type":17,"tag":29,"props":277772,"children":277773},{},[277774,277775,277780],{"type":23,"value":251519},{"type":17,"tag":33,"props":277776,"children":277777},{},[277778],{"type":23,"value":277779},"The value of Unified.to's unified data models cannot be overstated… When you're building AI features that need to work across multiple ATS systems, freeing up this mental bandwidth is invaluable.",{"type":23,"value":251519},{"type":17,"tag":29,"props":277782,"children":277783},{},[277784,277786],{"type":23,"value":277785},"— ",{"type":17,"tag":33,"props":277787,"children":277788},{},[277789],{"type":23,"value":277749},{"type":17,"tag":29,"props":277791,"children":277792},{},[277793],{"type":23,"value":277794},"For these teams, integration speed translates directly into new product capabilities and faster customer acquisition.",{"type":17,"tag":239,"props":277796,"children":277798},{"id":277797},"hr-onboarding-and-employee-provisioning",[277799],{"type":23,"value":277800},"HR onboarding and employee provisioning",{"type":17,"tag":29,"props":277802,"children":277803},{},[277804,277808],{"type":17,"tag":48,"props":277805,"children":277806},{},[277807],{"type":23,"value":277728},{"type":23,"value":277809}," HR · SCIM · SSO",{"type":17,"tag":29,"props":277811,"children":277812},{},[277813],{"type":23,"value":277814},"Employment Hero (formerly Humi) uses Unified.to to pull employee data directly from HRIS systems and automate onboarding.",{"type":17,"tag":3414,"props":277816,"children":277817},{},[277818],{"type":17,"tag":29,"props":277819,"children":277820},{},[277821,277822,277827],{"type":23,"value":251519},{"type":17,"tag":33,"props":277823,"children":277824},{},[277825],{"type":23,"value":277826},"Offering direct integrations through Unified.to brings tremendous value to our customers.",{"type":23,"value":251519},{"type":17,"tag":29,"props":277829,"children":277830},{},[277831],{"type":23,"value":277832},"Live HR data means instant employee setup, fewer manual imports, and smoother enterprise demos.",{"type":17,"tag":239,"props":277834,"children":277836},{"id":277835},"compliance-and-analytics",[277837],{"type":23,"value":277838},"Compliance and analytics",{"type":17,"tag":29,"props":277840,"children":277841},{},[277842,277846],{"type":17,"tag":48,"props":277843,"children":277844},{},[277845],{"type":23,"value":277728},{"type":23,"value":277847}," Accounting · File Storage · Verification",{"type":17,"tag":29,"props":277849,"children":277850},{},[277851,277858],{"type":17,"tag":133,"props":277852,"children":277855},{"href":277853,"rel":277854},"https://unified.to/blog/mycroft_ships_new_integrations_in_15_minutes",[214],[277856],{"type":23,"value":277857},"Mycroft",{"type":23,"value":277859},"'s compliance platform depends on Unified.to's zero-storage model to ingest real-time accounting and security data safely.",{"type":17,"tag":3414,"props":277861,"children":277862},{},[277863],{"type":17,"tag":29,"props":277864,"children":277865},{},[277866,277867,277872],{"type":23,"value":251519},{"type":17,"tag":33,"props":277868,"children":277869},{},[277870],{"type":23,"value":277871},"Unified transformed how we add integrations — 15 minutes instead of weeks. It freed 25% of our engineering time for innovation.",{"type":23,"value":251519},{"type":17,"tag":29,"props":277874,"children":277875},{},[277876],{"type":23,"value":277877},"Security and compliance analytics need accuracy and immediacy — something batch syncs can't provide.",{"type":17,"tag":239,"props":277879,"children":277881},{"id":277880},"_5-e-commerce-enrichment",[277882],{"type":23,"value":277883},"5. E-commerce enrichment",{"type":17,"tag":29,"props":277885,"children":277886},{},[277887,277891],{"type":17,"tag":48,"props":277888,"children":277889},{},[277890],{"type":23,"value":277728},{"type":23,"value":277892}," E-commerce · File Storage · Marketing",{"type":17,"tag":29,"props":277894,"children":277895},{},[277896,277903],{"type":17,"tag":133,"props":277897,"children":277900},{"href":277898,"rel":277899},"https://unified.to/blog/how_merchkit_accelerates_sales_by_removing_integration_uncertainty",[214],[277901],{"type":23,"value":277902},"Merchkit",{"type":23,"value":277904},"'s AI image-generation platform syncs massive product catalogs through Unified.to.",{"type":17,"tag":3414,"props":277906,"children":277907},{},[277908],{"type":17,"tag":29,"props":277909,"children":277910},{},[277911,277912,277917],{"type":23,"value":251519},{"type":17,"tag":33,"props":277913,"children":277914},{},[277915],{"type":23,"value":277916},"NetSuite's built-in connector took five days to sync 130k products; with Unified, we did it in 80 minutes.",{"type":23,"value":251519},{"type":17,"tag":29,"props":277919,"children":277920},{},[277921],{"type":23,"value":277922},"Real-time catalog access enables on-the-fly enrichment, pricing automation, and AI-generated content without waiting on slow sync jobs.",{"type":17,"tag":68,"props":277924,"children":277926},{"id":277925},"the-infrastructure-layer-that-makes-it-possible",[277927],{"type":23,"value":277928},"The infrastructure layer that makes it possible",{"type":17,"tag":29,"props":277930,"children":277931},{},[277932],{"type":23,"value":277933},"At a technical level, Unified.to replaces the traditional sync model with a real-time, pass-through architecture. Every call hits the source API live — no caching, no stored data, no compliance risk.",{"type":17,"tag":29,"props":277935,"children":277936},{},[277937],{"type":23,"value":277938},"That single design choice changes everything:",{"type":17,"tag":80,"props":277940,"children":277941},{},[277942,277952,277962,277977,277987],{"type":17,"tag":84,"props":277943,"children":277944},{},[277945,277950],{"type":17,"tag":48,"props":277946,"children":277947},{},[277948],{"type":23,"value":277949},"Real-time, zero-storage:",{"type":23,"value":277951}," Always-fresh reads and writes; no stale data for AI agents.",{"type":17,"tag":84,"props":277953,"children":277954},{},[277955,277960],{"type":17,"tag":48,"props":277956,"children":277957},{},[277958],{"type":23,"value":277959},"Unified schemas:",{"type":23,"value":277961}," One API per category with normalized objects, permissions, and authorization.",{"type":17,"tag":84,"props":277963,"children":277964},{},[277965,277975],{"type":17,"tag":48,"props":277966,"children":277967},{},[277968,277969,277973],{"type":23,"value":172596},{"type":17,"tag":133,"props":277970,"children":277971},{"href":4999},[277972],{"type":23,"value":5002},{"type":23,"value":277974},"](/blog/unlock_real_time_data_with_virtual_webhooks):",{"type":23,"value":277976}," Real-time updates even for systems that don't support native events.",{"type":17,"tag":84,"props":277978,"children":277979},{},[277980,277985],{"type":17,"tag":48,"props":277981,"children":277982},{},[277983],{"type":23,"value":277984},"Security first:",{"type":23,"value":277986}," SOC 2, GDPR, and optional customer-owned secret storage.",{"type":17,"tag":84,"props":277988,"children":277989},{},[277990,277995],{"type":17,"tag":48,"props":277991,"children":277992},{},[277993],{"type":23,"value":277994},"Predictable scaling:",{"type":23,"value":277996}," Usage-based pricing, no hidden fees.",{"type":17,"tag":29,"props":277998,"children":277999},{},[278000],{"type":23,"value":278001},"It's infrastructure built for teams that need to move quickly.",{"type":17,"tag":68,"props":278003,"children":278005},{"id":278004},"real-time-data-is-the-new-ai-infrastructure",[278006],{"type":23,"value":278007},"Real-Time Data Is the New AI Infrastructure",{"type":17,"tag":29,"props":278009,"children":278010},{},[278011],{"type":23,"value":278012},"In 2025, 'AI-ready' doesn't mean training bigger models — it means connecting faster. The teams launching copilots, agents, and AI-driven workflows today all share one advantage: instant, secure access to customer data. Unified.to provides that foundation.",{"type":17,"tag":29,"props":278014,"children":278015},{},[278016],{"type":23,"value":278017},"A single, real-time API for 350+ systems lets SaaS products act on live data without maintaining custom integrations or storing customer information.",{"type":17,"tag":29,"props":278019,"children":278020},{},[278021,278023,278028],{"type":23,"value":278022},"That's the climate of AI — and the reason ",{"type":17,"tag":133,"props":278024,"children":278026},{"href":212,"rel":278025},[214],[278027],{"type":23,"value":217},{"type":23,"value":278029}," exists: real-time by default, unified by design, built for the way modern SaaS launches AI.",{"title":7,"searchDepth":1629,"depth":1629,"links":278031},[278032,278039,278040],{"id":277676,"depth":1629,"text":277679,"children":278033},[278034,278035,278036,278037,278038],{"id":277682,"depth":1635,"text":277685},{"id":277717,"depth":1635,"text":277720},{"id":277797,"depth":1635,"text":277800},{"id":277835,"depth":1635,"text":277838},{"id":277880,"depth":1635,"text":277883},{"id":277925,"depth":1629,"text":277928},{"id":278004,"depth":1629,"text":278007},"content:blog:the_climate_of_ai_why_real_time_integration_data_infrastructure_matters.md","blog/the_climate_of_ai_why_real_time_integration_data_infrastructure_matters.md","blog/the_climate_of_ai_why_real_time_integration_data_infrastructure_matters",{"_path":278045,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":278046,"description":278047,"img":278048,"date":278049,"tag":6341,"body":278050,"_type":1677,"_id":278256,"_source":1679,"_file":278257,"_stem":278258,"_extension":1682},"/blog/how_to_setup_a_freshbooks_developer_app","How to setup a Freshbooks developer app","This guide will show you how to retrieve your OAuth 2 credentials on Freshbooks","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-icon.png","2025-10-03T00:00:00.000Z",{"type":14,"children":278051,"toc":278252},[278052,278057,278060,278068,278079,278085,278109,278116,278159,278166,278184,278191,278199,278206,278212,278245],{"type":17,"tag":18,"props":278053,"children":278055},{"id":278054},"how-to-setup-a-freshbooks-developer-app",[278056],{"type":23,"value":278046},{"type":17,"tag":25,"props":278058,"children":278059},{},[],{"type":17,"tag":29,"props":278061,"children":278062},{},[278063],{"type":17,"tag":33,"props":278064,"children":278065},{},[278066],{"type":23,"value":278067},"October 3, 2025",{"type":17,"tag":29,"props":278069,"children":278070},{},[278071,278073,278077],{"type":23,"value":278072},"This guide will show you how to retrieve your ",{"type":17,"tag":133,"props":278074,"children":278075},{"href":779},[278076],{"type":23,"value":782},{"type":23,"value":278078}," 2 credentials on Freshbooks",{"type":17,"tag":68,"props":278080,"children":278082},{"id":278081},"create-your-freshbooks-app-and-get-your-client-id-and-secret",[278083],{"type":23,"value":278084},"Create your Freshbooks App and get your Client ID and Secret",{"type":17,"tag":6154,"props":278086,"children":278087},{},[278088,278099],{"type":17,"tag":84,"props":278089,"children":278090},{},[278091,278093],{"type":23,"value":278092},"Go to the Freshbooks Developer Portal:\n",{"type":17,"tag":133,"props":278094,"children":278097},{"href":278095,"rel":278096},"https://my.freshbooks.com/#/developer",[214],[278098],{"type":23,"value":278095},{"type":17,"tag":84,"props":278100,"children":278101},{},[278102,278104],{"type":23,"value":278103},"Click on ",{"type":17,"tag":6121,"props":278105,"children":278107},{"className":278106},[],[278108],{"type":23,"value":6404},{"type":17,"tag":29,"props":278110,"children":278111},{},[278112],{"type":17,"tag":6438,"props":278113,"children":278115},{"alt":6440,"src":278114},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-0.png",[],{"type":17,"tag":6154,"props":278117,"children":278118},{},[278119,278124,278143],{"type":17,"tag":84,"props":278120,"children":278121},{},[278122],{"type":23,"value":278123},"Fill in the Application Name, Application Type, these are mandatory",{"type":17,"tag":84,"props":278125,"children":278126},{},[278127,278129],{"type":23,"value":278128},"Add the scopes needed\n",{"type":17,"tag":6154,"props":278130,"children":278131},{},[278132],{"type":17,"tag":84,"props":278133,"children":278134},{},[278135,278137],{"type":23,"value":278136},"You can see the scopes we use on ",{"type":17,"tag":133,"props":278138,"children":278141},{"href":278139,"rel":278140},"https://app.unified.to/integrations/freshbooks?tab=oauth2",[214],[278142],{"type":23,"value":278139},{"type":17,"tag":84,"props":278144,"children":278145},{},[278146,278148,278157],{"type":23,"value":278147},"Add ",{"type":17,"tag":133,"props":278149,"children":278151},{"href":42417,"rel":278150},[214],[278152],{"type":17,"tag":6121,"props":278153,"children":278155},{"className":278154},[],[278156],{"type":23,"value":42417},{"type":23,"value":278158}," in the Redirect URIs",{"type":17,"tag":29,"props":278160,"children":278161},{},[278162],{"type":17,"tag":6438,"props":278163,"children":278165},{"alt":6440,"src":278164},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-1.png",[],{"type":17,"tag":6154,"props":278167,"children":278168},{},[278169,278174,278179],{"type":17,"tag":84,"props":278170,"children":278171},{},[278172],{"type":23,"value":278173},"You can also fill in the non mandatory fields, logo, etc.",{"type":17,"tag":84,"props":278175,"children":278176},{},[278177],{"type":23,"value":278178},"Click Save",{"type":17,"tag":84,"props":278180,"children":278181},{},[278182],{"type":23,"value":278183},"Click on the App again",{"type":17,"tag":29,"props":278185,"children":278186},{},[278187],{"type":17,"tag":6438,"props":278188,"children":278190},{"alt":6440,"src":278189},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-2.png",[],{"type":17,"tag":6154,"props":278192,"children":278193},{},[278194],{"type":17,"tag":84,"props":278195,"children":278196},{},[278197],{"type":23,"value":278198},"Your Client ID and Secret are at the bottom",{"type":17,"tag":29,"props":278200,"children":278201},{},[278202],{"type":17,"tag":6438,"props":278203,"children":278205},{"alt":6440,"src":278204},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-3.png",[],{"type":17,"tag":68,"props":278207,"children":278209},{"id":278208},"activate-the-freshbooks-integration-in-unified",[278210],{"type":23,"value":278211},"Activate the Freshbooks Integration in Unified",{"type":17,"tag":6154,"props":278213,"children":278214},{},[278215,278225,278236,278241],{"type":17,"tag":84,"props":278216,"children":278217},{},[278218,278219],{"type":23,"value":6661},{"type":17,"tag":133,"props":278220,"children":278223},{"href":278221,"rel":278222},"https://app.unified.to/integrations/freshbooks?tab=auth",[214],[278224],{"type":23,"value":278221},{"type":17,"tag":84,"props":278226,"children":278227},{},[278228,278230],{"type":23,"value":278229},"Click in ",{"type":17,"tag":6121,"props":278231,"children":278233},{"className":278232},[],[278234],{"type":23,"value":278235},"Your OAuth 2 credentials",{"type":17,"tag":84,"props":278237,"children":278238},{},[278239],{"type":23,"value":278240},"Add your Client ID and Secret",{"type":17,"tag":84,"props":278242,"children":278243},{},[278244],{"type":23,"value":42994},{"type":17,"tag":29,"props":278246,"children":278247},{},[278248],{"type":17,"tag":6438,"props":278249,"children":278251},{"alt":6440,"src":278250},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_setup_a_freshbooks_developer_app-4.png",[],{"title":7,"searchDepth":1629,"depth":1629,"links":278253},[278254,278255],{"id":278081,"depth":1629,"text":278084},{"id":278208,"depth":1629,"text":278211},"content:blog:how_to_setup_a_freshbooks_developer_app.md","blog/how_to_setup_a_freshbooks_developer_app.md","blog/how_to_setup_a_freshbooks_developer_app",{"_path":278260,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":278261,"description":278262,"img":278263,"date":278264,"tag":12,"body":278265,"_type":1677,"_id":278330,"_source":1679,"_file":278331,"_stem":278332,"_extension":1682},"/blog/unified_security","Unified.to's Security","When trusting any developer tool for your application, security becomes paramount as it can kill your customer's trust in your product if that tool has poor...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_security-icon.png","2025-10-01T00:00:00.000Z",{"type":14,"children":278266,"toc":278328},[278267,278272,278275,278283,278288,278293,278298],{"type":17,"tag":18,"props":278268,"children":278270},{"id":278269},"unifiedtos-security",[278271],{"type":23,"value":278261},{"type":17,"tag":25,"props":278273,"children":278274},{},[],{"type":17,"tag":29,"props":278276,"children":278277},{},[278278],{"type":17,"tag":33,"props":278279,"children":278280},{},[278281],{"type":23,"value":278282},"October 1, 2025",{"type":17,"tag":29,"props":278284,"children":278285},{},[278286],{"type":23,"value":278287},"When trusting any developer tool for your application, security becomes paramount as it can kill your customer's trust in your product if that tool has poor security practices.",{"type":17,"tag":29,"props":278289,"children":278290},{},[278291],{"type":23,"value":278292},"At Unified.to, we have more than a dozen years of experience in the security industry and more than 20 in building secure software systems.",{"type":17,"tag":29,"props":278294,"children":278295},{},[278296],{"type":23,"value":278297},"Our security features includes:",{"type":17,"tag":80,"props":278299,"children":278300},{},[278301,278306,278318,278323],{"type":17,"tag":84,"props":278302,"children":278303},{},[278304],{"type":23,"value":278305},"Your customers' data from their connections are never stored on Unified.to's servers.  While Unified.to's calls the vendors APIs directly, the data that we retrieve is sent directly to your application and not stored nor cached.",{"type":17,"tag":84,"props":278307,"children":278308},{},[278309,278311,278316],{"type":23,"value":278310},"Your customers' integration authentication is usually based off of ",{"type":17,"tag":133,"props":278312,"children":278313},{"href":779},[278314],{"type":23,"value":278315},"OAUTH",{"type":23,"value":278317},"-2 and does not include their user credentials (email/password).  Those OAUTH-2 access tokens expire and can be revoked by the customer at any time.",{"type":17,"tag":84,"props":278319,"children":278320},{},[278321],{"type":23,"value":278322},"The customers' OAUTH2 access tokens can be stored in your AWS Secrets Manager account and not stored on the Unified.to's servers. If you have other secured storage needs, please let us know so we can add support for it.",{"type":17,"tag":84,"props":278324,"children":278325},{},[278326],{"type":23,"value":278327},"You can also use your own OAUTH-2 clientId/clientSecret for your customers' authorizations.  This gives your application more control over branding of those authorization pages plus more security in terms of utilizing those access tokens in the future without Unified.to.",{"title":7,"searchDepth":1629,"depth":1629,"links":278329},[],"content:blog:unified_security.md","blog/unified_security.md","blog/unified_security",{"_path":278334,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":278335,"description":278336,"img":278337,"date":278338,"tag":12,"body":278339,"_type":1677,"_id":278981,"_source":1679,"_file":278982,"_stem":278983,"_extension":1682},"/blog/september_2025_product_updates","September 2025 product updates","Last month, we launched new integrations across HR, ATS, CRM, Generative AI, Calendar, and Help Center/Call Center; expanded webhook coverage across call,...","https://s3.us-east-2.amazonaws.com/unified-article-images/september_2025_product_updates-icon.png","2025-09-30T00:00:00.000Z",{"type":14,"children":278340,"toc":278974},[278341,278346,278349,278357,278368,278372,278377,278386,278432,278442,278452,278461,278470,278475,278481,278576,278581,278587,278798,278804,278881,278886,278890,278952,278957,278966],{"type":17,"tag":18,"props":278342,"children":278344},{"id":278343},"september-2025-product-updates",[278345],{"type":23,"value":278335},{"type":17,"tag":25,"props":278347,"children":278348},{},[],{"type":17,"tag":29,"props":278350,"children":278351},{},[278352],{"type":17,"tag":33,"props":278353,"children":278354},{},[278355],{"type":23,"value":278356},"September 30, 2025",{"type":17,"tag":29,"props":278358,"children":278359},{},[278360,278362,278366],{"type":23,"value":278361},"Last month, we launched new integrations across HR, ATS, CRM, Generative AI, Calendar, and Help Center/Call Center; expanded webhook coverage across call, recording, and event objects; and delivered new fields, objects, and ",{"type":17,"tag":133,"props":278363,"children":278364},{"href":1857},[278365],{"type":23,"value":1860},{"type":23,"value":278367}," support across major platforms.",{"type":17,"tag":68,"props":278369,"children":278370},{"id":11629},[278371],{"type":23,"value":11632},{"type":17,"tag":29,"props":278373,"children":278374},{},[278375],{"type":23,"value":278376},"We added 11 new integrations in September:",{"type":17,"tag":29,"props":278378,"children":278379},{},[278380,278385],{"type":17,"tag":48,"props":278381,"children":278382},{},[278383],{"type":23,"value":278384},"HR & Directory/ATS",{"type":23,"value":20456},{"type":17,"tag":80,"props":278387,"children":278388},{},[278389,278393,278398,278403,278408,278413,278417,278422,278427],{"type":17,"tag":84,"props":278390,"children":278391},{},[278392],{"type":23,"value":57960},{"type":17,"tag":84,"props":278394,"children":278395},{},[278396],{"type":23,"value":278397},"Ableteams",{"type":17,"tag":84,"props":278399,"children":278400},{},[278401],{"type":23,"value":278402},"Hexnode",{"type":17,"tag":84,"props":278404,"children":278405},{},[278406],{"type":23,"value":278407},"HR Cloud",{"type":17,"tag":84,"props":278409,"children":278410},{},[278411],{"type":23,"value":278412},"Karbon HQ",{"type":17,"tag":84,"props":278414,"children":278415},{},[278416],{"type":23,"value":60913},{"type":17,"tag":84,"props":278418,"children":278419},{},[278420],{"type":23,"value":278421},"PeopleForc",{"type":17,"tag":84,"props":278423,"children":278424},{},[278425],{"type":23,"value":278426},"Recooty",{"type":17,"tag":84,"props":278428,"children":278429},{},[278430],{"type":23,"value":278431},"Trakstar Hire",{"type":17,"tag":29,"props":278433,"children":278434},{},[278435,278440],{"type":17,"tag":48,"props":278436,"children":278437},{},[278438],{"type":23,"value":278439},"KMS / Help Center:",{"type":23,"value":278441}," Gladly",{"type":17,"tag":29,"props":278443,"children":278444},{},[278445,278450],{"type":17,"tag":48,"props":278446,"children":278447},{},[278448],{"type":23,"value":278449},"Generative AI",{"type":23,"value":278451},": Hugging Face, X.ai Grok",{"type":17,"tag":29,"props":278453,"children":278454},{},[278455,278459],{"type":17,"tag":48,"props":278456,"children":278457},{},[278458],{"type":23,"value":14515},{"type":23,"value":278460},": Update.ai",{"type":17,"tag":29,"props":278462,"children":278463},{},[278464,278468],{"type":17,"tag":48,"props":278465,"children":278466},{},[278467],{"type":23,"value":26246},{"type":23,"value":278469}," Keap",{"type":17,"tag":29,"props":278471,"children":278472},{},[278473],{"type":23,"value":278474},"Unified's catalog now exceeds 350+ integrations across 21 categories, all available in real time with no data stored or cached.",{"type":17,"tag":68,"props":278476,"children":278478},{"id":278477},"webhook-streaming-improvements",[278479],{"type":23,"value":278480},"Webhook & streaming improvements",{"type":17,"tag":80,"props":278482,"children":278483},{},[278484,278512,278534,278544,278566],{"type":17,"tag":84,"props":278485,"children":278486},{},[278487,278491,278493,278497,278499,278504,278505,278510],{"type":17,"tag":48,"props":278488,"children":278489},{},[278490],{"type":23,"value":31572},{"type":23,"value":278492},": Added [virtual ",{"type":17,"tag":133,"props":278494,"children":278495},{"href":4999},[278496],{"type":23,"value":5002},{"type":23,"value":278498},"](/blog/unlock_real_time_data_with_virtual_webhooks) (",{"type":17,"tag":6121,"props":278500,"children":278502},{"className":278501},[],[278503],{"type":23,"value":109207},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278506,"children":278508},{"className":278507},[],[278509],{"type":23,"value":109214},{"type":23,"value":278511},") for the Contact object.",{"type":17,"tag":84,"props":278513,"children":278514},{},[278515,278519,278521,278526,278527,278532],{"type":17,"tag":48,"props":278516,"children":278517},{},[278518],{"type":23,"value":3179},{"type":23,"value":278520},": Added virtual webhooks (",{"type":17,"tag":6121,"props":278522,"children":278524},{"className":278523},[],[278525],{"type":23,"value":109207},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278528,"children":278530},{"className":278529},[],[278531],{"type":23,"value":109214},{"type":23,"value":278533},") for Page.",{"type":17,"tag":84,"props":278535,"children":278536},{},[278537,278542],{"type":17,"tag":48,"props":278538,"children":278539},{},[278540],{"type":23,"value":278541},"CATS, Loxo, Rev Sport, Gladly",{"type":23,"value":278543},": Expanded webhook coverage across Candidate, Company, Job, Application, Employee, Call, and Contact objects.",{"type":17,"tag":84,"props":278545,"children":278546},{},[278547,278552,278553,278558,278559,278564],{"type":17,"tag":48,"props":278548,"children":278549},{},[278550],{"type":23,"value":278551},"Zoom, Webex, Microsoft Teams, RingCentral, 8x8",{"type":23,"value":278520},{"type":17,"tag":6121,"props":278554,"children":278556},{"className":278555},[],[278557],{"type":23,"value":109207},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278560,"children":278562},{"className":278561},[],[278563],{"type":23,"value":109214},{"type":23,"value":278565},") for Recording and Event objects.",{"type":17,"tag":84,"props":278567,"children":278568},{},[278569,278574],{"type":17,"tag":48,"props":278570,"children":278571},{},[278572],{"type":23,"value":278573},"Google Meet & Calendar",{"type":23,"value":278575},": Expanded native + virtual webhook support for Event, Calendar, and Recording objects.",{"type":17,"tag":29,"props":278577,"children":278578},{},[278579],{"type":23,"value":278580},"Virtual webhooks continue to provide the same real-time event model even when vendors don't offer native hooks—Unified manages polling, retries, and change detection under the hood.",{"type":17,"tag":68,"props":278582,"children":278584},{"id":278583},"objects-methods-fields",[278585],{"type":23,"value":278586},"Objects, methods & fields",{"type":17,"tag":80,"props":278588,"children":278589},{},[278590,278618,278640,278649,278688,278697,278706,278723,278732,278742,278777],{"type":17,"tag":84,"props":278591,"children":278592},{},[278593,278597,278599,278604,278605,278610,278611,278616],{"type":17,"tag":48,"props":278594,"children":278595},{},[278596],{"type":23,"value":60913},{"type":23,"value":278598},": Employee object now supports native webhooks (",{"type":17,"tag":6121,"props":278600,"children":278602},{"className":278601},[],[278603],{"type":23,"value":109207},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278606,"children":278608},{"className":278607},[],[278609],{"type":23,"value":109214},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278612,"children":278614},{"className":278613},[],[278615],{"type":23,"value":109221},{"type":23,"value":278617},") plus pagination.",{"type":17,"tag":84,"props":278619,"children":278620},{},[278621,278625,278627,278632,278633,278638],{"type":17,"tag":48,"props":278622,"children":278623},{},[278624],{"type":23,"value":3179},{"type":23,"value":278626},": Added Page and Space objects with ",{"type":17,"tag":6121,"props":278628,"children":278630},{"className":278629},[],[278631],{"type":23,"value":11243},{"type":23,"value":89280},{"type":17,"tag":6121,"props":278634,"children":278636},{"className":278635},[],[278637],{"type":23,"value":11832},{"type":23,"value":278639}," methods.",{"type":17,"tag":84,"props":278641,"children":278642},{},[278643,278647],{"type":17,"tag":48,"props":278644,"children":278645},{},[278646],{"type":23,"value":31572},{"type":23,"value":278648},": New Contact object with full CRUD methods.",{"type":17,"tag":84,"props":278650,"children":278651},{},[278652,278656,278658,278663,278664,278669,278670,278675,278676,278681,278682,278687],{"type":17,"tag":48,"props":278653,"children":278654},{},[278655],{"type":23,"value":31097},{"type":23,"value":278657},": Added Recording, Call, and Contact objects with ",{"type":17,"tag":6121,"props":278659,"children":278661},{"className":278660},[],[278662],{"type":23,"value":11243},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278665,"children":278667},{"className":278666},[],[278668],{"type":23,"value":11832},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278671,"children":278673},{"className":278672},[],[278674],{"type":23,"value":11254},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278677,"children":278679},{"className":278678},[],[278680],{"type":23,"value":11845},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278683,"children":278685},{"className":278684},[],[278686],{"type":23,"value":11852},{"type":23,"value":54},{"type":17,"tag":84,"props":278689,"children":278690},{},[278691,278695],{"type":17,"tag":48,"props":278692,"children":278693},{},[278694],{"type":23,"value":202788},{"type":23,"value":278696},": Added Applicationstatus, Application, Activity, and Document objects, with full CRUD support across Candidate, Company, Job, and Application.",{"type":17,"tag":84,"props":278698,"children":278699},{},[278700,278704],{"type":17,"tag":48,"props":278701,"children":278702},{},[278703],{"type":23,"value":59319},{"type":23,"value":278705},": New writable fields for Activity, Application, and Job objects.",{"type":17,"tag":84,"props":278707,"children":278708},{},[278709,278713,278715,278721],{"type":17,"tag":48,"props":278710,"children":278711},{},[278712],{"type":23,"value":13070},{"type":23,"value":278714},": Expanded ",{"type":17,"tag":6121,"props":278716,"children":278718},{"className":278717},[],[278719],{"type":23,"value":278720},"slow_fields",{"type":23,"value":278722}," pagination support across 20+ objects (Account, Contact, Employee, Invoice, Order, etc.).",{"type":17,"tag":84,"props":278724,"children":278725},{},[278726,278730],{"type":17,"tag":48,"props":278727,"children":278728},{},[278729],{"type":23,"value":13284},{"type":23,"value":278731},": Added CRUD methods for Project, Task, and Comment.",{"type":17,"tag":84,"props":278733,"children":278734},{},[278735,278740],{"type":17,"tag":48,"props":278736,"children":278737},{},[278738],{"type":23,"value":278739},"OpenAI, Gemini, Cohere, Mistral, DeepSeek, Anthropic Claude, Groq, AnyScale, X.ai Grok",{"type":23,"value":278741},": Expanded Model + Embedding coverage across generative AI providers.",{"type":17,"tag":84,"props":278743,"children":278744},{},[278745,278750,278752,278758,278759,278764,278765,278770,278771,278776],{"type":17,"tag":48,"props":278746,"children":278747},{},[278748],{"type":23,"value":278749},"Slack, Outlook, Gmail",{"type":23,"value":278751},": Message object gained new fields (",{"type":17,"tag":6121,"props":278753,"children":278755},{"className":278754},[],[278756],{"type":23,"value":278757},"is_unread",{"type":23,"value":11826},{"type":17,"tag":6121,"props":278760,"children":278762},{"className":278761},[],[278763],{"type":23,"value":15863},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278766,"children":278768},{"className":278767},[],[278769],{"type":23,"value":25337},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278772,"children":278774},{"className":278773},[],[278775],{"type":23,"value":160848},{"type":23,"value":129328},{"type":17,"tag":84,"props":278778,"children":278779},{},[278780,278784,278786,278791,278792,278797],{"type":17,"tag":48,"props":278781,"children":278782},{},[278783],{"type":23,"value":14472},{"type":23,"value":278785},": Recording object now includes ",{"type":17,"tag":6121,"props":278787,"children":278789},{"className":278788},[],[278790],{"type":23,"value":33446},{"type":23,"value":11826},{"type":17,"tag":6121,"props":278793,"children":278795},{"className":278794},[],[278796],{"type":23,"value":25337},{"type":23,"value":54},{"type":17,"tag":68,"props":278799,"children":278801},{"id":278800},"pagination-filters",[278802],{"type":23,"value":278803},"Pagination & filters",{"type":17,"tag":80,"props":278805,"children":278806},{},[278807],{"type":17,"tag":84,"props":278808,"children":278809},{},[278810,278812],{"type":23,"value":278811},"Expanded pagination, query, and filter support across:\n",{"type":17,"tag":80,"props":278813,"children":278814},{},[278815,278824,278833,278842,278852,278862,278871],{"type":17,"tag":84,"props":278816,"children":278817},{},[278818,278822],{"type":17,"tag":48,"props":278819,"children":278820},{},[278821],{"type":23,"value":13070},{"type":23,"value":278823}," (20+ objects)",{"type":17,"tag":84,"props":278825,"children":278826},{},[278827,278831],{"type":17,"tag":48,"props":278828,"children":278829},{},[278830],{"type":23,"value":56614},{"type":23,"value":278832}," (Company, Job, Event)",{"type":17,"tag":84,"props":278834,"children":278835},{},[278836,278840],{"type":17,"tag":48,"props":278837,"children":278838},{},[278839],{"type":23,"value":31097},{"type":23,"value":278841}," (Call, Contact, Recording)",{"type":17,"tag":84,"props":278843,"children":278844},{},[278845,278850],{"type":17,"tag":48,"props":278846,"children":278847},{},[278848],{"type":23,"value":278849},"Microsoft Outlook, Gmail, Slack",{"type":23,"value":278851}," (Message object: parent_id, expand, date filters)",{"type":17,"tag":84,"props":278853,"children":278854},{},[278855,278860],{"type":17,"tag":48,"props":278856,"children":278857},{},[278858],{"type":23,"value":278859},"Zoom, Webex, Microsoft Teams, 8x8, RingCentral, Fathom, Salesloft",{"type":23,"value":278861}," (Recording/Event objects)",{"type":17,"tag":84,"props":278863,"children":278864},{},[278865,278869],{"type":17,"tag":48,"props":278866,"children":278867},{},[278868],{"type":23,"value":278573},{"type":23,"value":278870}," (Event, Recording, Calendar objects)",{"type":17,"tag":84,"props":278872,"children":278873},{},[278874,278879],{"type":17,"tag":48,"props":278875,"children":278876},{},[278877],{"type":23,"value":278878},"HiBob, Deel, BambooHR, Trinet Zenefits, Remote.com, Personio",{"type":23,"value":278880}," (Timeoff objects)",{"type":17,"tag":29,"props":278882,"children":278883},{},[278884],{"type":23,"value":278885},"These expansions improve reliability at scale for high-volume platforms like NetSuite, Zoom, Slack, and Microsoft 365.",{"type":17,"tag":68,"props":278887,"children":278888},{"id":120936},[278889],{"type":23,"value":216865},{"type":17,"tag":80,"props":278891,"children":278892},{},[278893,278908,278923,278938],{"type":17,"tag":84,"props":278894,"children":278895},{},[278896,278906],{"type":17,"tag":133,"props":278897,"children":278900},{"href":278898,"rel":278899},"https://unified.to/blog/how_to_build_a_candidate_assessment_product_with_unified",[214],[278901],{"type":17,"tag":48,"props":278902,"children":278903},{},[278904],{"type":23,"value":278905},"How to Build a Candidate Assessment Product",{"type":23,"value":278907}," — A guide to building robust, scalable assessment solutions with Unified's ATS integrations.",{"type":17,"tag":84,"props":278909,"children":278910},{},[278911,278921],{"type":17,"tag":133,"props":278912,"children":278915},{"href":278913,"rel":278914},"https://unified.to/blog/how_to_build_an_e_commerce_product_integration_with_unified",[214],[278916],{"type":17,"tag":48,"props":278917,"children":278918},{},[278919],{"type":23,"value":278920},"How to Build an E-Commerce Product Integration",{"type":23,"value":278922}," — Connect to Shopify, BigCommerce, WooCommerce, and more through one API.",{"type":17,"tag":84,"props":278924,"children":278925},{},[278926,278936],{"type":17,"tag":133,"props":278927,"children":278930},{"href":278928,"rel":278929},"https://unified.to/blog/how_to_build_a_payments_integration_with_unified",[214],[278931],{"type":17,"tag":48,"props":278932,"children":278933},{},[278934],{"type":23,"value":278935},"How to Build a Payments Integration",{"type":23,"value":278937}," — Create and list payments, manage payouts, and handle refunds across Stripe, PayPal, GoCardless, and others.",{"type":17,"tag":84,"props":278939,"children":278940},{},[278941,278950],{"type":17,"tag":133,"props":278942,"children":278944},{"href":277737,"rel":278943},[214],[278945],{"type":17,"tag":48,"props":278946,"children":278947},{},[278948],{"type":23,"value":278949},"Customer Case Study: How RecView Scaled Agency-Grade ATS Integrations",{"type":23,"value":278951}," — Learn how RecView avoided $50k+ in engineering costs and expanded ATS coverage using Unified.",{"type":17,"tag":29,"props":278953,"children":278954},{},[278955],{"type":23,"value":278956},"That's a wrap for September. Whether you're powering AI copilots, scaling HR/ATS pipelines, or replacing polling with resilient real-time webhooks, Unified gives you a single, unified foundation to launch faster—with no data storage and no vendor lock-in.",{"type":17,"tag":29,"props":278958,"children":278959},{},[278960],{"type":17,"tag":133,"props":278961,"children":278963},{"href":212,"rel":278962},[214],[278964],{"type":23,"value":278965},"Start free 30-day trial",{"type":17,"tag":29,"props":278967,"children":278968},{},[278969],{"type":17,"tag":133,"props":278970,"children":278972},{"href":1623,"rel":278971},[214],[278973],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":278975},[278976,278977,278978,278979,278980],{"id":11629,"depth":1629,"text":11632},{"id":278477,"depth":1629,"text":278480},{"id":278583,"depth":1629,"text":278586},{"id":278800,"depth":1629,"text":278803},{"id":120936,"depth":1629,"text":216865},"content:blog:september_2025_product_updates.md","blog/september_2025_product_updates.md","blog/september_2025_product_updates",{"_path":278985,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":278986,"description":278987,"img":278988,"date":278989,"tag":12,"body":278990,"_type":1677,"_id":279434,"_source":1679,"_file":279435,"_stem":279436,"_extension":1682},"/blog/how_to_automate_employee_provisioning_across_workday_bamboohr_successfactors_and_180_hr_platforms_with_a_unified_api","How to Automate Employee Provisioning Across Workday, BambooHR, SuccessFactors, and 180+ HR Platforms with a Unified API","Employee provisioning is one of the most common integration use cases in B2B SaaS. When a new employee joins a company, downstream systems need to provision...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_automate_employee_provisioning_across_workday_bamboohr_successfactors_and_180_hr_platforms_with_a_unified_api-icon.png","2025-09-28T00:00:00.000Z",{"type":14,"children":278991,"toc":279426},[278992,278997,279000,279008,279013,279027,279033,279038,279070,279075,279081,279086,279220,279225,279231,279242,279265,279270,279276,279281,279311,279336,279340,279345,279353,279357,279362,279402,279407],{"type":17,"tag":18,"props":278993,"children":278995},{"id":278994},"how-to-automate-employee-provisioning-across-workday-bamboohr-successfactors-and-180-hr-platforms-with-a-unified-api",[278996],{"type":23,"value":278986},{"type":17,"tag":25,"props":278998,"children":278999},{},[],{"type":17,"tag":29,"props":279001,"children":279002},{},[279003],{"type":17,"tag":33,"props":279004,"children":279005},{},[279006],{"type":23,"value":279007},"September 28, 2025",{"type":17,"tag":29,"props":279009,"children":279010},{},[279011],{"type":23,"value":279012},"Employee provisioning is one of the most common integration use cases in B2B SaaS. When a new employee joins a company, downstream systems need to provision accounts, assign groups, and enforce access controls. When they leave, access must be revoked.",{"type":17,"tag":29,"props":279014,"children":279015},{},[279016,279018,279025],{"type":23,"value":279017},"Instead of building one-off connectors for each HR system, a ",{"type":17,"tag":48,"props":279019,"children":279020},{},[279021],{"type":17,"tag":133,"props":279022,"children":279023},{"href":7691},[279024],{"type":23,"value":7459},{"type":23,"value":279026}," abstracts away provider differences and delivers normalized employee data in real time. That allows your product to automate provisioning without maintaining custom logic per vendor.",{"type":17,"tag":68,"props":279028,"children":279030},{"id":279029},"why-provisioning-requires-integrations",[279031],{"type":23,"value":279032},"Why Provisioning Requires Integrations",{"type":17,"tag":29,"props":279034,"children":279035},{},[279036],{"type":23,"value":279037},"HR systems like Workday, BambooHR, or SuccessFactors are the source of truth for employee records. But most downstream systems—IT management, collaboration tools, access control, analytics—need to stay in sync. Common triggers include:",{"type":17,"tag":80,"props":279039,"children":279040},{},[279041,279051,279061],{"type":17,"tag":84,"props":279042,"children":279043},{},[279044,279049],{"type":17,"tag":48,"props":279045,"children":279046},{},[279047],{"type":23,"value":279048},"Onboarding",{"type":23,"value":279050},": automatically create accounts when a new hire is added.",{"type":17,"tag":84,"props":279052,"children":279053},{},[279054,279059],{"type":17,"tag":48,"props":279055,"children":279056},{},[279057],{"type":23,"value":279058},"Offboarding",{"type":23,"value":279060},": revoke access when an employee leaves or is terminated.",{"type":17,"tag":84,"props":279062,"children":279063},{},[279064,279068],{"type":17,"tag":48,"props":279065,"children":279066},{},[279067],{"type":23,"value":123513},{"type":23,"value":279069},": move a candidate from 'accepted offer' to 'active employee.'",{"type":17,"tag":29,"props":279071,"children":279072},{},[279073],{"type":23,"value":279074},"Without a unified API, each HR platform requires a separate integration, with its own schema, authentication, and webhook behaviors. Over time, this creates high maintenance overhead and brittle provisioning workflows.",{"type":17,"tag":68,"props":279076,"children":279078},{"id":279077},"normalized-employee-data",[279079],{"type":23,"value":279080},"Normalized Employee Data",{"type":17,"tag":29,"props":279082,"children":279083},{},[279084],{"type":23,"value":279085},"Unified.to's API provides a normalized schema across 185+ HRIS platforms. Core objects include:",{"type":17,"tag":80,"props":279087,"children":279088},{},[279089,279122,279143,279170,279197],{"type":17,"tag":84,"props":279090,"children":279091},{},[279092,279096,279098,279103,279104,279109,279110,279115,279116,279121],{"type":17,"tag":48,"props":279093,"children":279094},{},[279095],{"type":23,"value":61210},{"type":23,"value":279097},": identity, status, organizational placement (fields: ",{"type":17,"tag":6121,"props":279099,"children":279101},{"className":279100},[],[279102],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279105,"children":279107},{"className":279106},[],[279108],{"type":23,"value":50735},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279111,"children":279113},{"className":279112},[],[279114],{"type":23,"value":136506},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279117,"children":279119},{"className":279118},[],[279120],{"type":23,"value":240192},{"type":23,"value":129328},{"type":17,"tag":84,"props":279123,"children":279124},{},[279125,279129,279131,279136,279137,279142],{"type":17,"tag":48,"props":279126,"children":279127},{},[279128],{"type":23,"value":18623},{"type":23,"value":279130},": teams, departments, or business units (",{"type":17,"tag":6121,"props":279132,"children":279134},{"className":279133},[],[279135],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279138,"children":279140},{"className":279139},[],[279141],{"type":23,"value":27310},{"type":23,"value":129328},{"type":17,"tag":84,"props":279144,"children":279145},{},[279146,279150,279152,279157,279158,279163,279164,279169],{"type":17,"tag":48,"props":279147,"children":279148},{},[279149],{"type":23,"value":25846},{"type":23,"value":279151},": legal entity tied to the employee (",{"type":17,"tag":6121,"props":279153,"children":279155},{"className":279154},[],[279156],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279159,"children":279161},{"className":279160},[],[279162],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279165,"children":279167},{"className":279166},[],[279168],{"type":23,"value":50774},{"type":23,"value":129328},{"type":17,"tag":84,"props":279171,"children":279172},{},[279173,279177,279179,279184,279185,279190,279191,279196],{"type":17,"tag":48,"props":279174,"children":279175},{},[279176],{"type":23,"value":19564},{"type":23,"value":279178},": physical office or region (",{"type":17,"tag":6121,"props":279180,"children":279182},{"className":279181},[],[279183],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279186,"children":279188},{"className":279187},[],[279189],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279192,"children":279194},{"className":279193},[],[279195],{"type":23,"value":62370},{"type":23,"value":129328},{"type":17,"tag":84,"props":279198,"children":279199},{},[279200,279204,279206,279212,279213,279219],{"type":17,"tag":48,"props":279201,"children":279202},{},[279203],{"type":23,"value":198687},{"type":23,"value":279205},": assets assigned for provisioning and tracking (",{"type":17,"tag":6121,"props":279207,"children":279209},{"className":279208},[],[279210],{"type":23,"value":279211},"serial_number",{"type":23,"value":11826},{"type":17,"tag":6121,"props":279214,"children":279216},{"className":279215},[],[279217],{"type":23,"value":279218},"device_type",{"type":23,"value":129328},{"type":17,"tag":29,"props":279221,"children":279222},{},[279223],{"type":23,"value":279224},"These fields cover the majority of provisioning workflows. Custom objects or provider-specific data can be accessed via passthrough endpoints when needed.",{"type":17,"tag":68,"props":279226,"children":279228},{"id":279227},"real-time-data-flow",[279229],{"type":23,"value":279230},"Real-Time Data Flow",{"type":17,"tag":29,"props":279232,"children":279233},{},[279234,279236,279240],{"type":23,"value":279235},"Unified.to monitors HRIS platforms via native ",{"type":17,"tag":133,"props":279237,"children":279238},{"href":4999},[279239],{"type":23,"value":5002},{"type":23,"value":279241}," (when available) or managed polling. When an employee record is created or updated:",{"type":17,"tag":6154,"props":279243,"children":279244},{},[279245,279255,279260],{"type":17,"tag":84,"props":279246,"children":279247},{},[279248,279250],{"type":23,"value":279249},"Data is normalized and ",{"type":17,"tag":48,"props":279251,"children":279252},{},[279253],{"type":23,"value":279254},"delivered in real time.",{"type":17,"tag":84,"props":279256,"children":279257},{},[279258],{"type":23,"value":279259},"Downstream systems consume the event via webhook or API.",{"type":17,"tag":84,"props":279261,"children":279262},{},[279263],{"type":23,"value":279264},"Optional write support allows provisioning metadata (e.g., device IDs) to sync back to the HR system.",{"type":17,"tag":29,"props":279266,"children":279267},{},[279268],{"type":23,"value":279269},"Unlike ETL or iPaaS tools, Unified.to never caches or stores employee data. Every call fetches live data from the source, ensuring accuracy for provisioning and access control.",{"type":17,"tag":68,"props":279271,"children":279273},{"id":279272},"crud-and-write-support",[279274],{"type":23,"value":279275},"CRUD and Write Support",{"type":17,"tag":29,"props":279277,"children":279278},{},[279279],{"type":23,"value":279280},"Most provisioning scenarios require more than just reads. Unified.to's API supports full CRUD for employee objects across many platforms:",{"type":17,"tag":80,"props":279282,"children":279283},{},[279284,279293,279302],{"type":17,"tag":84,"props":279285,"children":279286},{},[279287,279291],{"type":17,"tag":48,"props":279288,"children":279289},{},[279290],{"type":23,"value":42125},{"type":23,"value":279292},": add new employees programmatically.",{"type":17,"tag":84,"props":279294,"children":279295},{},[279296,279300],{"type":17,"tag":48,"props":279297,"children":279298},{},[279299],{"type":23,"value":109982},{"type":23,"value":279301},": change group, manager, or role assignments.",{"type":17,"tag":84,"props":279303,"children":279304},{},[279305,279309],{"type":17,"tag":48,"props":279306,"children":279307},{},[279308],{"type":23,"value":109987},{"type":23,"value":279310},": deactivate or remove employees.",{"type":17,"tag":29,"props":279312,"children":279313},{},[279314,279316,279321,279322,279327,279328,279334],{"type":23,"value":279315},"Write access is supported for core objects like ",{"type":17,"tag":6121,"props":279317,"children":279319},{"className":279318},[],[279320],{"type":23,"value":43639},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279323,"children":279325},{"className":279324},[],[279326],{"type":23,"value":272275},{"type":23,"value":12561},{"type":17,"tag":6121,"props":279329,"children":279331},{"className":279330},[],[279332],{"type":23,"value":279333},"device",{"type":23,"value":279335},", depending on the integration.",{"type":17,"tag":68,"props":279337,"children":279338},{"id":25342},[279339],{"type":23,"value":25345},{"type":17,"tag":29,"props":279341,"children":279342},{},[279343],{"type":23,"value":279344},"Unified.to supports enterprise HRIS (Workday, SuccessFactors, ADP Workforce Now, UKG, Ceridian), mid-market HRIS (BambooHR, HiBob, Rippling, Namely, Paylocity), and SMB HRIS (BreatheHR, Alexis, Ameego, Canvas). In total, there are 188+ pre-built HR and Directory integrations, all normalized into a single employee schema with zero maintenance.",{"type":17,"tag":29,"props":279346,"children":279347},{},[279348],{"type":17,"tag":133,"props":279349,"children":279351},{"href":58209,"rel":279350},[214],[279352],{"type":23,"value":269356},{"type":17,"tag":68,"props":279354,"children":279355},{"id":275134},[279356],{"type":23,"value":275137},{"type":17,"tag":29,"props":279358,"children":279359},{},[279360],{"type":23,"value":279361},"For product managers and platform engineers, the benefits are clear:",{"type":17,"tag":80,"props":279363,"children":279364},{},[279365,279374,279384,279393],{"type":17,"tag":84,"props":279366,"children":279367},{},[279368,279372],{"type":17,"tag":48,"props":279369,"children":279370},{},[279371],{"type":23,"value":275182},{"type":23,"value":279373},": build once, support many HR platforms.",{"type":17,"tag":84,"props":279375,"children":279376},{},[279377,279382],{"type":17,"tag":48,"props":279378,"children":279379},{},[279380],{"type":23,"value":279381},"Lower maintenance",{"type":23,"value":279383},": Unified.to manages tokens, retries, and API changes.",{"type":17,"tag":84,"props":279385,"children":279386},{},[279387,279391],{"type":17,"tag":48,"props":279388,"children":279389},{},[279390],{"type":23,"value":270394},{"type":23,"value":279392},": provisioning decisions are based on live data, not cached snapshots.",{"type":17,"tag":84,"props":279394,"children":279395},{},[279396,279400],{"type":17,"tag":48,"props":279397,"children":279398},{},[279399],{"type":23,"value":264209},{"type":23,"value":279401},": one model covers enterprise and SMB systems, supporting your full customer base.",{"type":17,"tag":29,"props":279403,"children":279404},{},[279405],{"type":23,"value":279406},"Provisioning is mission-critical: access must be immediate, accurate, and secure. A unified API reduces the integration backlog while ensuring provisioning workflows remain consistent across customers.",{"type":17,"tag":29,"props":279408,"children":279409},{},[279410,279412,279417,279419,279425],{"type":23,"value":279411},"Ready to see how employee provisioning works at scale? ",{"type":17,"tag":133,"props":279413,"children":279415},{"href":1623,"rel":279414},[214],[279416],{"type":23,"value":1627},{"type":23,"value":279418}," with our team or get stared with a ",{"type":17,"tag":133,"props":279420,"children":279422},{"href":158861,"rel":279421},[214],[279423],{"type":23,"value":279424},"free 30-day trial",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":279427},[279428,279429,279430,279431,279432,279433],{"id":279029,"depth":1629,"text":279032},{"id":279077,"depth":1629,"text":279080},{"id":279227,"depth":1629,"text":279230},{"id":279272,"depth":1629,"text":279275},{"id":25342,"depth":1629,"text":25345},{"id":275134,"depth":1629,"text":275137},"content:blog:how_to_automate_employee_provisioning_across_workday_bamboohr_successfactors_and_180_hr_platforms_with_a_unified_api.md","blog/how_to_automate_employee_provisioning_across_workday_bamboohr_successfactors_and_180_hr_platforms_with_a_unified_api.md","blog/how_to_automate_employee_provisioning_across_workday_bamboohr_successfactors_and_180_hr_platforms_with_a_unified_api",{"_path":279438,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":279439,"description":279440,"img":279441,"date":278989,"tag":12,"body":279442,"_type":1677,"_id":279937,"_source":1679,"_file":279938,"_stem":279939,"_extension":1682},"/blog/how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_notion_and_350_platforms_with_a_unified_api","How to Build AI Search and Insights Across Google Drive, Slack, Zendesk, Notion, and 350+ Platforms with a Unified API","End users expect to search, summarize, and extract insights from their data—no matter where it lives. Documents in Google Drive, conversations in Slack,...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_notion_and_350_platforms_with_a_unified_api-icon.png",{"type":14,"children":279443,"toc":279928},[279444,279449,279452,279459,279464,279475,279494,279499,279505,279509,279557,279563,279568,279599,279604,279609,279638,279655,279659,279698,279704,279709,279760,279765,279771,279782,279824,279829,279852,279860,279864,279869,279905,279910],{"type":17,"tag":18,"props":279445,"children":279447},{"id":279446},"how-to-build-ai-search-and-insights-across-google-drive-slack-zendesk-notion-and-350-platforms-with-a-unified-api",[279448],{"type":23,"value":279439},{"type":17,"tag":25,"props":279450,"children":279451},{},[],{"type":17,"tag":29,"props":279453,"children":279454},{},[279455],{"type":17,"tag":33,"props":279456,"children":279457},{},[279458],{"type":23,"value":279007},{"type":17,"tag":29,"props":279460,"children":279461},{},[279462],{"type":23,"value":279463},"End users expect to search, summarize, and extract insights from their data—no matter where it lives. Documents in Google Drive, conversations in Slack, tickets in Zendesk, or notes in Notion all hold information that needs to be instantly accessible.",{"type":17,"tag":29,"props":279465,"children":279466},{},[279467,279469,279473],{"type":23,"value":279468},"For SaaS teams, the challenge is that this content is spread across dozens of systems, each with its own schema, API, and ",{"type":17,"tag":133,"props":279470,"children":279471},{"href":135},[279472],{"type":23,"value":138},{"type":23,"value":279474},". Building custom integrations for each vendor makes AI-powered search brittle and slow to deliver.",{"type":17,"tag":29,"props":279476,"children":279477},{},[279478,279479,279486,279488,279492],{"type":23,"value":9619},{"type":17,"tag":48,"props":279480,"children":279481},{},[279482],{"type":17,"tag":133,"props":279483,"children":279484},{"href":7691},[279485],{"type":23,"value":7459},{"type":23,"value":279487}," solves this by normalizing unstructured content from 300+ SaaS integrations, making it available in real time for AI models. This architecture also enables ",{"type":17,"tag":133,"props":279489,"children":279490},{"href":5201},[279491],{"type":23,"value":77024},{"type":23,"value":279493}," (RAG), where content is indexed and retrieved at query time to ground AI outputs in the customer's actual data.",{"type":17,"tag":29,"props":279495,"children":279496},{},[279497],{"type":23,"value":279498},"Your product can power insights, search, and summarization workflows without maintaining per-vendor connectors.",{"type":17,"tag":68,"props":279500,"children":279502},{"id":279501},"when-to-use-ai-insights-search",[279503],{"type":23,"value":279504},"When to Use AI Insights & Search",{"type":17,"tag":29,"props":279506,"children":279507},{},[279508],{"type":23,"value":254154},{"type":17,"tag":80,"props":279510,"children":279511},{},[279512,279522,279532,279542,279552],{"type":17,"tag":84,"props":279513,"children":279514},{},[279515,279520],{"type":17,"tag":48,"props":279516,"children":279517},{},[279518],{"type":23,"value":279519},"Enable natural language search",{"type":23,"value":279521}," across all connected sources.",{"type":17,"tag":84,"props":279523,"children":279524},{},[279525,279530],{"type":17,"tag":48,"props":279526,"children":279527},{},[279528],{"type":23,"value":279529},"Summarize long documents instantly",{"type":23,"value":279531},", regardless of file type or platform.",{"type":17,"tag":84,"props":279533,"children":279534},{},[279535,279540],{"type":17,"tag":48,"props":279536,"children":279537},{},[279538],{"type":23,"value":279539},"Extract key facts",{"type":23,"value":279541}," from messages, tickets, or attachments.",{"type":17,"tag":84,"props":279543,"children":279544},{},[279545,279550],{"type":17,"tag":48,"props":279546,"children":279547},{},[279548],{"type":23,"value":279549},"Power assistants and knowledge bases",{"type":23,"value":279551}," with real-time context.",{"type":17,"tag":84,"props":279553,"children":279554},{},[279555],{"type":23,"value":279556},"Build a RAG-powered enterprise search experience across documents, messages, and tickets.",{"type":17,"tag":68,"props":279558,"children":279560},{"id":279559},"unified-data-for-unstructured-content",[279561],{"type":23,"value":279562},"Unified Data for Unstructured Content",{"type":17,"tag":29,"props":279564,"children":279565},{},[279566],{"type":23,"value":279567},"A unified schema covers the most common content types:",{"type":17,"tag":80,"props":279569,"children":279570},{},[279571,279581,279590],{"type":17,"tag":84,"props":279572,"children":279573},{},[279574,279579],{"type":17,"tag":48,"props":279575,"children":279576},{},[279577],{"type":23,"value":279578},"document",{"type":23,"value":279580},": files, notes, and attachments.",{"type":17,"tag":84,"props":279582,"children":279583},{},[279584,279588],{"type":17,"tag":48,"props":279585,"children":279586},{},[279587],{"type":23,"value":24872},{"type":23,"value":279589},": emails, chat threads, comments.",{"type":17,"tag":84,"props":279591,"children":279592},{},[279593,279597],{"type":17,"tag":48,"props":279594,"children":279595},{},[279596],{"type":23,"value":24551},{"type":23,"value":279598},": CRM or support interactions.",{"type":17,"tag":29,"props":279600,"children":279601},{},[279602],{"type":23,"value":279603},"Each content type is normalized, so you don't need to write per-vendor logic to handle formats from Google Drive, Slack, Zendesk, or Notion.",{"type":17,"tag":29,"props":279605,"children":279606},{},[279607],{"type":23,"value":279608},"For AI orchestration, Unified.to provides two key objects:",{"type":17,"tag":80,"props":279610,"children":279611},{},[279612,279625],{"type":17,"tag":84,"props":279613,"children":279614},{},[279615,279623],{"type":17,"tag":48,"props":279616,"children":279617},{},[279618],{"type":17,"tag":6121,"props":279619,"children":279621},{"className":279620},[],[279622],{"type":23,"value":74651},{"type":23,"value":279624}," — represents a prompt sent to a model, including context, parameters, and responses.",{"type":17,"tag":84,"props":279626,"children":279627},{},[279628,279636],{"type":17,"tag":48,"props":279629,"children":279630},{},[279631],{"type":17,"tag":6121,"props":279632,"children":279634},{"className":279633},[],[279635],{"type":23,"value":107411},{"type":23,"value":279637}," — metadata about available models (id, name, max tokens, URL).",{"type":17,"tag":29,"props":279639,"children":279640},{},[279641,279643,279648,279649,279654],{"type":23,"value":279642},"This abstraction ensures consistent workflows even if models support different parameters (e.g., ",{"type":17,"tag":6121,"props":279644,"children":279646},{"className":279645},[],[279647],{"type":23,"value":74693},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279650,"children":279652},{"className":279651},[],[279653],{"type":23,"value":74702},{"type":23,"value":129328},{"type":17,"tag":68,"props":279656,"children":279657},{"id":243917},[279658],{"type":23,"value":243920},{"type":17,"tag":6154,"props":279660,"children":279661},{},[279662,279667,279672,279683,279688],{"type":17,"tag":84,"props":279663,"children":279664},{},[279665],{"type":23,"value":279666},"Connect customer data sources (file storage, messaging, ticketing, notes).",{"type":17,"tag":84,"props":279668,"children":279669},{},[279670],{"type":23,"value":279671},"Unified fetches and normalizes relevant content in real time.",{"type":17,"tag":84,"props":279673,"children":279674},{},[279675,279676,279681],{"type":23,"value":9619},{"type":17,"tag":6121,"props":279677,"children":279679},{"className":279678},[],[279680],{"type":23,"value":74651},{"type":23,"value":279682}," request sends the content to the chosen AI model.",{"type":17,"tag":84,"props":279684,"children":279685},{},[279686],{"type":23,"value":279687},"The model returns a summary, answer, or extracted insight.",{"type":17,"tag":84,"props":279689,"children":279690},{},[279691,279693],{"type":23,"value":279692},"Results are delivered back to your application via API, webhook, or database sync—with ",{"type":17,"tag":48,"props":279694,"children":279695},{},[279696],{"type":23,"value":279697},"no data stored by Unified.to",{"type":17,"tag":239,"props":279699,"children":279701},{"id":279700},"extending-this-into-a-rag-pipeline",[279702],{"type":23,"value":279703},"Extending This into a RAG Pipeline",{"type":17,"tag":29,"props":279705,"children":279706},{},[279707],{"type":23,"value":279708},"For large-scale AI search and knowledge assistants, use a RAG architecture:",{"type":17,"tag":6154,"props":279710,"children":279711},{},[279712,279717,279722,279727,279755],{"type":17,"tag":84,"props":279713,"children":279714},{},[279715],{"type":23,"value":279716},"Subscribe to create/update webhooks for documents, messages, and tickets.",{"type":17,"tag":84,"props":279718,"children":279719},{},[279720],{"type":23,"value":279721},"Fetch changed content in real time.",{"type":17,"tag":84,"props":279723,"children":279724},{},[279725],{"type":23,"value":279726},"Chunk long text and generate embeddings.",{"type":17,"tag":84,"props":279728,"children":279729},{},[279730,279731,279736,279737,279742,279743,279748,279749,279754],{"type":23,"value":233739},{"type":17,"tag":6121,"props":279732,"children":279734},{"className":279733},[],[279735],{"type":23,"value":25037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279738,"children":279740},{"className":279739},[],[279741],{"type":23,"value":161193},{"type":23,"value":11826},{"type":17,"tag":6121,"props":279744,"children":279746},{"className":279745},[],[279747],{"type":23,"value":161202},{"type":23,"value":12561},{"type":17,"tag":6121,"props":279750,"children":279752},{"className":279751},[],[279753],{"type":23,"value":25337},{"type":23,"value":54},{"type":17,"tag":84,"props":279756,"children":279757},{},[279758],{"type":23,"value":279759},"On each user query, embed the query, retrieve the top matching content segments, and pass them to the model for grounded generation. Unified Use Case RAG Pipelines",{"type":17,"tag":29,"props":279761,"children":279762},{},[279763],{"type":23,"value":279764},"Unified handles ingestion and normalization across 300+ integrations; embeddings and vector storage remain in your infrastructure.",{"type":17,"tag":68,"props":279766,"children":279768},{"id":279767},"supported-data-sources-and-models",[279769],{"type":23,"value":279770},"Supported Data Sources and Models",{"type":17,"tag":29,"props":279772,"children":279773},{},[279774,279775,279780],{"type":23,"value":254333},{"type":17,"tag":48,"props":279776,"children":279777},{},[279778],{"type":23,"value":279779},"345+ integrations",{"type":23,"value":279781}," for unstructured content, including:",{"type":17,"tag":80,"props":279783,"children":279784},{},[279785,279794,279804,279814],{"type":17,"tag":84,"props":279786,"children":279787},{},[279788,279792],{"type":17,"tag":48,"props":279789,"children":279790},{},[279791],{"type":23,"value":265506},{"type":23,"value":279793},": Google Drive, Dropbox, Box, OneDrive",{"type":17,"tag":84,"props":279795,"children":279796},{},[279797,279802],{"type":17,"tag":48,"props":279798,"children":279799},{},[279800],{"type":23,"value":279801},"Messaging & Email",{"type":23,"value":279803},": Slack, Gmail, Outlook, Teams",{"type":17,"tag":84,"props":279805,"children":279806},{},[279807,279812],{"type":17,"tag":48,"props":279808,"children":279809},{},[279810],{"type":23,"value":279811},"CRM & Ticketing",{"type":23,"value":279813},": Zendesk, Salesforce, Jira, HubSpot",{"type":17,"tag":84,"props":279815,"children":279816},{},[279817,279822],{"type":17,"tag":48,"props":279818,"children":279819},{},[279820],{"type":23,"value":279821},"Knowledge & Notes",{"type":23,"value":279823},": Notion, Confluence, Coda, Guru",{"type":17,"tag":29,"props":279825,"children":279826},{},[279827],{"type":23,"value":279828},"For AI models, you can choose from:",{"type":17,"tag":80,"props":279830,"children":279831},{},[279832,279837,279842,279847],{"type":17,"tag":84,"props":279833,"children":279834},{},[279835],{"type":23,"value":279836},"OpenAI (GPT-4, GPT-3.5)",{"type":17,"tag":84,"props":279838,"children":279839},{},[279840],{"type":23,"value":279841},"Anthropic (Claude)",{"type":17,"tag":84,"props":279843,"children":279844},{},[279845],{"type":23,"value":279846},"Google (Gemini)",{"type":17,"tag":84,"props":279848,"children":279849},{},[279850],{"type":23,"value":279851},"Cohere, Mistral, DeepSeek, Groq, Azure OpenAI",{"type":17,"tag":29,"props":279853,"children":279854},{},[279855],{"type":17,"tag":133,"props":279856,"children":279858},{"href":87026,"rel":279857},[214],[279859],{"type":23,"value":269356},{"type":17,"tag":68,"props":279861,"children":279862},{"id":275134},[279863],{"type":23,"value":275137},{"type":17,"tag":29,"props":279865,"children":279866},{},[279867],{"type":23,"value":279868},"For PMs and engineers, a unified API makes AI insights practical at scale:",{"type":17,"tag":80,"props":279870,"children":279871},{},[279872,279882,279887,279897],{"type":17,"tag":84,"props":279873,"children":279874},{},[279875,279880],{"type":17,"tag":48,"props":279876,"children":279877},{},[279878],{"type":23,"value":279879},"One schema for 300+ platforms",{"type":23,"value":279881},": no per-vendor parsing.",{"type":17,"tag":84,"props":279883,"children":279884},{},[279885],{"type":23,"value":279886},"Real-time delivery: keep your RAG index aligned with document edits and conversation updates.",{"type":17,"tag":84,"props":279888,"children":279889},{},[279890,279895],{"type":17,"tag":48,"props":279891,"children":279892},{},[279893],{"type":23,"value":279894},"Flexible orchestration",{"type":23,"value":279896},": support for multiple GenAI providers.",{"type":17,"tag":84,"props":279898,"children":279899},{},[279900,279904],{"type":17,"tag":48,"props":279901,"children":279902},{},[279903],{"type":23,"value":269406},{"type":23,"value":279383},{"type":17,"tag":29,"props":279906,"children":279907},{},[279908],{"type":23,"value":279909},"This allows you to focus on the user experience—whether that's enterprise search, an AI-powered assistant, or contextual insights—without getting blocked on integrations.",{"type":17,"tag":29,"props":279911,"children":279912},{},[279913,279915,279921,279922,279927],{"type":23,"value":279914},"Start building AI search and insight features across 315+ integrations today. ",{"type":17,"tag":133,"props":279916,"children":279918},{"href":158861,"rel":279917},[214],[279919],{"type":23,"value":279920},"Sign up for a free 30-day trial",{"type":23,"value":75890},{"type":17,"tag":133,"props":279923,"children":279925},{"href":1623,"rel":279924},[214],[279926],{"type":23,"value":226481},{"type":23,"value":271016},{"title":7,"searchDepth":1629,"depth":1629,"links":279929},[279930,279931,279932,279935,279936],{"id":279501,"depth":1629,"text":279504},{"id":279559,"depth":1629,"text":279562},{"id":243917,"depth":1629,"text":243920,"children":279933},[279934],{"id":279700,"depth":1635,"text":279703},{"id":279767,"depth":1629,"text":279770},{"id":275134,"depth":1629,"text":275137},"content:blog:how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_notion_and_350_platforms_with_a_unified_api.md","blog/how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_notion_and_350_platforms_with_a_unified_api.md","blog/how_to_build_ai_search_and_insights_across_google_drive_slack_zendesk_notion_and_350_platforms_with_a_unified_api",{"_path":279941,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":279942,"description":279943,"img":279944,"date":278989,"tag":12,"body":279945,"_type":1677,"_id":280534,"_source":1679,"_file":280535,"_stem":280536,"_extension":1682},"/blog/how_to_build_candidate_assessments_across_workday_greenhouse_lever_and_60_ats_platforms_with_a_unified_api","How to Build Candidate Assessments Across Workday, Greenhouse, Lever, and 60+ ATS Platforms with a Unified API","Candidate assessment is a core step in hiring. Once an application reaches a defined stage—like 'Reviewing' in an ATS—your product may need to trigger an...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_candidate_assessments_across_workday_greenhouse_lever_and_60_ats_platforms_with_a_unified_api-icon.png",{"type":14,"children":279946,"toc":280525},[279947,279952,279955,279962,279967,279978,279989,279995,280000,280023,280028,280034,280039,280221,280226,280232,280243,280283,280288,280299,280305,280310,280373,280378,280382,280393,280451,280460,280464,280469,280507],{"type":17,"tag":18,"props":279948,"children":279950},{"id":279949},"how-to-build-candidate-assessments-across-workday-greenhouse-lever-and-60-ats-platforms-with-a-unified-api",[279951],{"type":23,"value":279942},{"type":17,"tag":25,"props":279953,"children":279954},{},[],{"type":17,"tag":29,"props":279956,"children":279957},{},[279958],{"type":17,"tag":33,"props":279959,"children":279960},{},[279961],{"type":23,"value":279007},{"type":17,"tag":29,"props":279963,"children":279964},{},[279965],{"type":23,"value":279966},"Candidate assessment is a core step in hiring. Once an application reaches a defined stage—like 'Reviewing' in an ATS—your product may need to trigger an assessment, collect results, and push them back to the ATS.",{"type":17,"tag":29,"props":279968,"children":279969},{},[279970,279972,279976],{"type":23,"value":279971},"Doing this across dozens of applicant tracking systems (ATS) is where most teams hit friction. Each ATS has its own schema, authentication, and webhook behavior. A ",{"type":17,"tag":133,"props":279973,"children":279974},{"href":7691},[279975],{"type":23,"value":7459},{"type":23,"value":279977}," removes that complexity by providing normalized candidate, application, job, and attachment data in real time—plus write support for posting results back.",{"type":17,"tag":29,"props":279979,"children":279980},{},[279981,279983,279987],{"type":23,"value":279982},"This same ingestion pattern also enables ",{"type":17,"tag":133,"props":279984,"children":279985},{"href":77021},[279986],{"type":23,"value":77024},{"type":23,"value":279988}," (RAG), where resumes and job descriptions are embedded and retrieved at query time to power ranking, matching, and AI-generated evaluations.",{"type":17,"tag":68,"props":279990,"children":279992},{"id":279991},"why-candidate-assessment-requires-integrations",[279993],{"type":23,"value":279994},"Why Candidate Assessment Requires Integrations",{"type":17,"tag":29,"props":279996,"children":279997},{},[279998],{"type":23,"value":279999},"ATS platforms are the system of record for candidate and job data. To power assessments, your application needs:",{"type":17,"tag":80,"props":280001,"children":280002},{},[280003,280008,280013,280018],{"type":17,"tag":84,"props":280004,"children":280005},{},[280006],{"type":23,"value":280007},"Candidate profile and contact details",{"type":17,"tag":84,"props":280009,"children":280010},{},[280011],{"type":23,"value":280012},"Application status and job context",{"type":17,"tag":84,"props":280014,"children":280015},{},[280016],{"type":23,"value":280017},"Attachments like resumes or portfolios",{"type":17,"tag":84,"props":280019,"children":280020},{},[280021],{"type":23,"value":280022},"Power semantic matching between resumes and job descriptions using a RAG pipeline built on ATS data",{"type":17,"tag":29,"props":280024,"children":280025},{},[280026],{"type":23,"value":280027},"Assessments often need to be triggered automatically, then scored results written back as notes, custom fields, tags, or stage changes. Without a unified API, you'd build and maintain custom integrations for each ATS vendor—slowing roadmap delivery and creating long-term maintenance overhead.",{"type":17,"tag":68,"props":280029,"children":280031},{"id":280030},"normalized-candidate-data",[280032],{"type":23,"value":280033},"Normalized Candidate Data",{"type":17,"tag":29,"props":280035,"children":280036},{},[280037],{"type":23,"value":280038},"A unified API standardizes the core ATS objects:",{"type":17,"tag":80,"props":280040,"children":280041},{},[280042,280087,280134,280179],{"type":17,"tag":84,"props":280043,"children":280044},{},[280045,280061,280063,280068,280069,280074,280075,280080,280081,280086],{"type":17,"tag":48,"props":280046,"children":280047},{},[280048,280049,280060],{"type":23,"value":203542},{"type":17,"tag":48,"props":280050,"children":280051},{},[280052],{"type":17,"tag":48,"props":280053,"children":280054},{},[280055],{"type":17,"tag":6121,"props":280056,"children":280058},{"className":280057},[],[280059],{"type":23,"value":157081},{"type":23,"value":12034},{"type":23,"value":280062},": links candidate to job (",{"type":17,"tag":6121,"props":280064,"children":280066},{"className":280065},[],[280067],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280070,"children":280072},{"className":280071},[],[280073],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280076,"children":280078},{"className":280077},[],[280079],{"type":23,"value":212204},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280082,"children":280084},{"className":280083},[],[280085],{"type":23,"value":33446},{"type":23,"value":129328},{"type":17,"tag":84,"props":280088,"children":280089},{},[280090,280107,280109,280114,280115,280120,280121,280126,280127,280133],{"type":17,"tag":48,"props":280091,"children":280092},{},[280093,280095,280106],{"type":23,"value":280094},"Candidate (",{"type":17,"tag":48,"props":280096,"children":280097},{},[280098],{"type":17,"tag":48,"props":280099,"children":280100},{},[280101],{"type":17,"tag":6121,"props":280102,"children":280104},{"className":280103},[],[280105],{"type":23,"value":157072},{"type":23,"value":12034},{"type":23,"value":280108},": profile and contact data (",{"type":17,"tag":6121,"props":280110,"children":280112},{"className":280111},[],[280113],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280116,"children":280118},{"className":280117},[],[280119],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280122,"children":280124},{"className":280123},[],[280125],{"type":23,"value":50735},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280128,"children":280130},{"className":280129},[],[280131],{"type":23,"value":280132},"resume_url",{"type":23,"value":129328},{"type":17,"tag":84,"props":280135,"children":280136},{},[280137,280153,280155,280160,280161,280166,280167,280172,280173,280178],{"type":17,"tag":48,"props":280138,"children":280139},{},[280140,280141,280152],{"type":23,"value":204112},{"type":17,"tag":48,"props":280142,"children":280143},{},[280144],{"type":17,"tag":48,"props":280145,"children":280146},{},[280147],{"type":17,"tag":6121,"props":280148,"children":280150},{"className":280149},[],[280151],{"type":23,"value":157090},{"type":23,"value":12034},{"type":23,"value":280154},": requisition record (",{"type":17,"tag":6121,"props":280156,"children":280158},{"className":280157},[],[280159],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280162,"children":280164},{"className":280163},[],[280165],{"type":23,"value":62346},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280168,"children":280170},{"className":280169},[],[280171],{"type":23,"value":62375},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280174,"children":280176},{"className":280175},[],[280177],{"type":23,"value":74134},{"type":23,"value":129328},{"type":17,"tag":84,"props":280180,"children":280181},{},[280182,280200,280202,280207,280208,280214,280215,280220],{"type":17,"tag":48,"props":280183,"children":280184},{},[280185,280187,280199],{"type":23,"value":280186},"Attachment (",{"type":17,"tag":48,"props":280188,"children":280189},{},[280190],{"type":17,"tag":48,"props":280191,"children":280192},{},[280193],{"type":17,"tag":6121,"props":280194,"children":280196},{"className":280195},[],[280197],{"type":23,"value":280198},"ats_attachment",{"type":23,"value":12034},{"type":23,"value":280201},": resumes, portfolios, or supporting files (",{"type":17,"tag":6121,"props":280203,"children":280205},{"className":280204},[],[280206],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280209,"children":280211},{"className":280210},[],[280212],{"type":23,"value":280213},"file_url",{"type":23,"value":11826},{"type":17,"tag":6121,"props":280216,"children":280218},{"className":280217},[],[280219],{"type":23,"value":72581},{"type":23,"value":129328},{"type":17,"tag":29,"props":280222,"children":280223},{},[280224],{"type":23,"value":280225},"Webhooks—native or virtual—stream changes in real time, so assessments can be triggered at the right stage.",{"type":17,"tag":68,"props":280227,"children":280229},{"id":280228},"data-flow-for-assessments",[280230],{"type":23,"value":280231},"Data Flow for Assessments",{"type":17,"tag":29,"props":280233,"children":280234},{},[280235,280236,280241],{"type":23,"value":249763},{"type":17,"tag":133,"props":280237,"children":280239},{"href":42620,"rel":280238},[214],[280240],{"type":23,"value":217},{"type":23,"value":280242},", the flow is straightforward:",{"type":17,"tag":6154,"props":280244,"children":280245},{},[280246,280251,280263,280268,280273,280278],{"type":17,"tag":84,"props":280247,"children":280248},{},[280249],{"type":23,"value":280250},"Connect the ATS via Unified Connect.",{"type":17,"tag":84,"props":280252,"children":280253},{},[280254,280256,280261],{"type":23,"value":280255},"Fetch ",{"type":17,"tag":6121,"props":280257,"children":280259},{"className":280258},[],[280260],{"type":23,"value":157081},{"type":23,"value":280262}," records and filter by status to identify candidates to assess.",{"type":17,"tag":84,"props":280264,"children":280265},{},[280266],{"type":23,"value":280267},"Register a webhook for application updates—Unified manages native and virtual streams.",{"type":17,"tag":84,"props":280269,"children":280270},{},[280271],{"type":23,"value":280272},"Retrieve related candidate, job, and attachment records for context.",{"type":17,"tag":84,"props":280274,"children":280275},{},[280276],{"type":23,"value":280277},"Run your assessment workflow.",{"type":17,"tag":84,"props":280279,"children":280280},{},[280281],{"type":23,"value":280282},"Write results back to the ATS as notes, tags, stage updates, or attachments.",{"type":17,"tag":29,"props":280284,"children":280285},{},[280286],{"type":23,"value":280287},"This enables your product to deliver a consistent assessment experience across ATS platforms without custom code per vendor.",{"type":17,"tag":29,"props":280289,"children":280290},{},[280291,280293],{"type":23,"value":280292},"Want a deeper dive into implementation patterns? Check out our guide: ",{"type":17,"tag":133,"props":280294,"children":280296},{"href":278898,"rel":280295},[214],[280297],{"type":23,"value":280298},"How to Build a Candidate Assessment Product with Unified.to",{"type":17,"tag":239,"props":280300,"children":280302},{"id":280301},"extending-candidate-assessments-into-a-rag-pipeline",[280303],{"type":23,"value":280304},"Extending Candidate Assessments into a RAG Pipeline",{"type":17,"tag":29,"props":280306,"children":280307},{},[280308],{"type":23,"value":280309},"For AI-driven screening, ranking, or recruiter Q&A, extend this workflow into a RAG architecture:",{"type":17,"tag":6154,"props":280311,"children":280312},{},[280313,280318,280335,280340,280368],{"type":17,"tag":84,"props":280314,"children":280315},{},[280316],{"type":23,"value":280317},"Subscribe to application create/update webhooks.",{"type":17,"tag":84,"props":280319,"children":280320},{},[280321,280323,280328,280329,280334],{"type":23,"value":280322},"Retrieve resumes and job descriptions via ",{"type":17,"tag":6121,"props":280324,"children":280326},{"className":280325},[],[280327],{"type":23,"value":280198},{"type":23,"value":34435},{"type":17,"tag":6121,"props":280330,"children":280332},{"className":280331},[],[280333],{"type":23,"value":157090},{"type":23,"value":54},{"type":17,"tag":84,"props":280336,"children":280337},{},[280338],{"type":23,"value":280339},"Chunk resume and job text and generate embeddings.",{"type":17,"tag":84,"props":280341,"children":280342},{},[280343,280344,280349,280350,280355,280356,280361,280362,280367],{"type":23,"value":233739},{"type":17,"tag":6121,"props":280345,"children":280347},{"className":280346},[],[280348],{"type":23,"value":25037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280351,"children":280353},{"className":280352},[],[280354],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280357,"children":280359},{"className":280358},[],[280360],{"type":23,"value":117309},{"type":23,"value":12561},{"type":17,"tag":6121,"props":280363,"children":280365},{"className":280364},[],[280366],{"type":23,"value":25337},{"type":23,"value":54},{"type":17,"tag":84,"props":280369,"children":280370},{},[280371],{"type":23,"value":280372},"On evaluation, retrieve the most relevant resume segments against the job description before generating scores or written feedback. Unified Use Case RAG Pipelines",{"type":17,"tag":29,"props":280374,"children":280375},{},[280376],{"type":23,"value":280377},"Unified handles real-time ingestion across 63+ ATS platforms; you manage embeddings and vector storage in your own infrastructure.",{"type":17,"tag":68,"props":280379,"children":280380},{"id":76108},[280381],{"type":23,"value":76111},{"type":17,"tag":29,"props":280383,"children":280384},{},[280385,280386,280391],{"type":23,"value":254333},{"type":17,"tag":48,"props":280387,"children":280388},{},[280389],{"type":23,"value":280390},"63+ ATS integrations",{"type":23,"value":280392},", including leading systems like:",{"type":17,"tag":80,"props":280394,"children":280395},{},[280396,280400,280405,280409,280413,280417,280421,280425,280429,280433,280438,280442,280446],{"type":17,"tag":84,"props":280397,"children":280398},{},[280399],{"type":23,"value":59319},{"type":17,"tag":84,"props":280401,"children":280402},{},[280403],{"type":23,"value":280404},"SuccessFactors",{"type":17,"tag":84,"props":280406,"children":280407},{},[280408],{"type":23,"value":240061},{"type":17,"tag":84,"props":280410,"children":280411},{},[280412],{"type":23,"value":3189},{"type":17,"tag":84,"props":280414,"children":280415},{},[280416],{"type":23,"value":56545},{"type":17,"tag":84,"props":280418,"children":280419},{},[280420],{"type":23,"value":75316},{"type":17,"tag":84,"props":280422,"children":280423},{},[280424],{"type":23,"value":75326},{"type":17,"tag":84,"props":280426,"children":280427},{},[280428],{"type":23,"value":75321},{"type":17,"tag":84,"props":280430,"children":280431},{},[280432],{"type":23,"value":75331},{"type":17,"tag":84,"props":280434,"children":280435},{},[280436],{"type":23,"value":280437},"Bullhorn",{"type":17,"tag":84,"props":280439,"children":280440},{},[280441],{"type":23,"value":3194},{"type":17,"tag":84,"props":280443,"children":280444},{},[280445],{"type":23,"value":56564},{"type":17,"tag":84,"props":280447,"children":280448},{},[280449],{"type":23,"value":280450},"UKG Pro ATS",{"type":17,"tag":29,"props":280452,"children":280453},{},[280454],{"type":17,"tag":133,"props":280455,"children":280457},{"href":56812,"rel":280456},[214],[280458],{"type":23,"value":280459},"See the full list of supported ATS integrations",{"type":17,"tag":68,"props":280461,"children":280462},{"id":275134},[280463],{"type":23,"value":275137},{"type":17,"tag":29,"props":280465,"children":280466},{},[280467],{"type":23,"value":280468},"For PMs and platform engineers, the value is direct:",{"type":17,"tag":80,"props":280470,"children":280471},{},[280472,280482,280487,280497],{"type":17,"tag":84,"props":280473,"children":280474},{},[280475,280480],{"type":17,"tag":48,"props":280476,"children":280477},{},[280478],{"type":23,"value":280479},"Trigger assessments consistently",{"type":23,"value":280481}," across 63+ ATS systems without custom logic.",{"type":17,"tag":84,"props":280483,"children":280484},{},[280485],{"type":23,"value":280486},"Unify candidate and job data into a single schema—making it easier to build RAG-based resume search, semantic matching, and AI-driven screening.",{"type":17,"tag":84,"props":280488,"children":280489},{},[280490,280495],{"type":17,"tag":48,"props":280491,"children":280492},{},[280493],{"type":23,"value":280494},"Push outcomes back in real time",{"type":23,"value":280496},"—ensuring recruiters see results immediately.",{"type":17,"tag":84,"props":280498,"children":280499},{},[280500,280505],{"type":17,"tag":48,"props":280501,"children":280502},{},[280503],{"type":23,"value":280504},"Scale without maintenance",{"type":23,"value":280506},"—no need to manage tokens, retries, or API changes.",{"type":17,"tag":29,"props":280508,"children":280509},{},[280510,280512,280518,280523],{"type":23,"value":280511},"Start building candidate assessment workflows across 63+ ATS platforms today. ",{"type":17,"tag":133,"props":280513,"children":280515},{"href":158861,"rel":280514},[214],[280516],{"type":23,"value":280517},"Sign up for a free 30-day trial or ",{"type":17,"tag":133,"props":280519,"children":280521},{"href":1623,"rel":280520},[214],[280522],{"type":23,"value":226481},{"type":23,"value":280524}," to see how Unified.to can support your roadmap.",{"title":7,"searchDepth":1629,"depth":1629,"links":280526},[280527,280528,280529,280532,280533],{"id":279991,"depth":1629,"text":279994},{"id":280030,"depth":1629,"text":280033},{"id":280228,"depth":1629,"text":280231,"children":280530},[280531],{"id":280301,"depth":1635,"text":280304},{"id":76108,"depth":1629,"text":76111},{"id":275134,"depth":1629,"text":275137},"content:blog:how_to_build_candidate_assessments_across_workday_greenhouse_lever_and_60_ats_platforms_with_a_unified_api.md","blog/how_to_build_candidate_assessments_across_workday_greenhouse_lever_and_60_ats_platforms_with_a_unified_api.md","blog/how_to_build_candidate_assessments_across_workday_greenhouse_lever_and_60_ats_platforms_with_a_unified_api",{"_path":280538,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":280539,"description":280540,"img":280541,"date":278989,"tag":12,"body":280542,"_type":1677,"_id":280996,"_source":1679,"_file":280997,"_stem":280998,"_extension":1682},"/blog/how_to_build_candidate_sourcing_across_greenhouse_lever_workday_and_60_ats_platforms_with_a_unified_api","How to Build Candidate Sourcing Across Greenhouse, Lever, Workday, and 60+ ATS Platforms with a Unified API","Job boards, marketplaces, and recruiting platforms all need to connect with applicant tracking systems (ATS) to source, match, and submit candidates. The...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_candidate_sourcing_across_greenhouse_lever_workday_and_60_ats_platforms_with_a_unified_api-icon.png",{"type":14,"children":280543,"toc":280989},[280544,280549,280552,280559,280564,280577,280583,280587,280630,280636,280641,280796,280801,280807,280812,280835,280852,280862,280866,280876,280909,280917,280921,280925,280966,280971],{"type":17,"tag":18,"props":280545,"children":280547},{"id":280546},"how-to-build-candidate-sourcing-across-greenhouse-lever-workday-and-60-ats-platforms-with-a-unified-api",[280548],{"type":23,"value":280539},{"type":17,"tag":25,"props":280550,"children":280551},{},[],{"type":17,"tag":29,"props":280553,"children":280554},{},[280555],{"type":17,"tag":33,"props":280556,"children":280557},{},[280558],{"type":23,"value":279007},{"type":17,"tag":29,"props":280560,"children":280561},{},[280562],{"type":23,"value":280563},"Job boards, marketplaces, and recruiting platforms all need to connect with applicant tracking systems (ATS) to source, match, and submit candidates. The problem: every ATS has different schemas, authentication models, and webhook patterns.",{"type":17,"tag":29,"props":280565,"children":280566},{},[280567,280568,280575],{"type":23,"value":9619},{"type":17,"tag":48,"props":280569,"children":280570},{},[280571],{"type":17,"tag":133,"props":280572,"children":280573},{"href":7691},[280574],{"type":23,"value":7459},{"type":23,"value":280576}," removes this complexity by normalizing candidate, job, and application data in real time across 60+ ATS platforms. That lets your product import jobs, match candidates, and push applications directly into your customers' ATS—without building per-vendor connectors.",{"type":17,"tag":68,"props":280578,"children":280580},{"id":280579},"when-to-use-candidate-sourcing",[280581],{"type":23,"value":280582},"When to Use Candidate Sourcing",{"type":17,"tag":29,"props":280584,"children":280585},{},[280586],{"type":23,"value":254154},{"type":17,"tag":80,"props":280588,"children":280589},{},[280590,280600,280610,280620],{"type":17,"tag":84,"props":280591,"children":280592},{},[280593,280598],{"type":17,"tag":48,"props":280594,"children":280595},{},[280596],{"type":23,"value":280597},"Build a sourcing platform or job board",{"type":23,"value":280599}," that connects with any ATS.",{"type":17,"tag":84,"props":280601,"children":280602},{},[280603,280608],{"type":17,"tag":48,"props":280604,"children":280605},{},[280606],{"type":23,"value":280607},"Automatically import open jobs",{"type":23,"value":280609}," from customer ATS systems.",{"type":17,"tag":84,"props":280611,"children":280612},{},[280613,280618],{"type":17,"tag":48,"props":280614,"children":280615},{},[280616],{"type":23,"value":280617},"Submit candidates and applications",{"type":23,"value":280619}," directly into the ATS.",{"type":17,"tag":84,"props":280621,"children":280622},{},[280623,280628],{"type":17,"tag":48,"props":280624,"children":280625},{},[280626],{"type":23,"value":280627},"Track application status and documents",{"type":23,"value":280629}," (resumes, cover letters) in real time.",{"type":17,"tag":68,"props":280631,"children":280633},{"id":280632},"normalized-ats-objects",[280634],{"type":23,"value":280635},"Normalized ATS Objects",{"type":17,"tag":29,"props":280637,"children":280638},{},[280639],{"type":23,"value":280640},"Unified.to provides consistent schemas for core sourcing objects:",{"type":17,"tag":80,"props":280642,"children":280643},{},[280644,280690,280730,280769],{"type":17,"tag":84,"props":280645,"children":280646},{},[280647,280651,280653,280658,280659,280664,280665,280670,280671,280676,280677,280682,280683,280689],{"type":17,"tag":48,"props":280648,"children":280649},{},[280650],{"type":23,"value":240137},{"type":23,"value":280652}," — open requisitions (",{"type":17,"tag":6121,"props":280654,"children":280656},{"className":280655},[],[280657],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280660,"children":280662},{"className":280661},[],[280663],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280666,"children":280668},{"className":280667},[],[280669],{"type":23,"value":24679},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280672,"children":280674},{"className":280673},[],[280675],{"type":23,"value":240192},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280678,"children":280680},{"className":280679},[],[280681],{"type":23,"value":74134},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280684,"children":280686},{"className":280685},[],[280687],{"type":23,"value":280688},"public_job_url",{"type":23,"value":129328},{"type":17,"tag":84,"props":280691,"children":280692},{},[280693,280697,280699,280704,280705,280710,280711,280716,280717,280723,280724,280729],{"type":17,"tag":48,"props":280694,"children":280695},{},[280696],{"type":23,"value":117137},{"type":23,"value":280698}," — profile and contact information (",{"type":17,"tag":6121,"props":280700,"children":280702},{"className":280701},[],[280703],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280706,"children":280708},{"className":280707},[],[280709],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280712,"children":280714},{"className":280713},[],[280715],{"type":23,"value":50735},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280718,"children":280720},{"className":280719},[],[280721],{"type":23,"value":280722},"phone_numbers",{"type":23,"value":11826},{"type":17,"tag":6121,"props":280725,"children":280727},{"className":280726},[],[280728],{"type":23,"value":280132},{"type":23,"value":129328},{"type":17,"tag":84,"props":280731,"children":280732},{},[280733,280737,280739,280744,280745,280750,280751,280756,280757,280762,280763,280768],{"type":17,"tag":48,"props":280734,"children":280735},{},[280736],{"type":23,"value":117242},{"type":23,"value":280738}," — submission records linking candidates to jobs (",{"type":17,"tag":6121,"props":280740,"children":280742},{"className":280741},[],[280743],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280746,"children":280748},{"className":280747},[],[280749],{"type":23,"value":117296},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280752,"children":280754},{"className":280753},[],[280755],{"type":23,"value":117309},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280758,"children":280760},{"className":280759},[],[280761],{"type":23,"value":19949},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280764,"children":280766},{"className":280765},[],[280767],{"type":23,"value":117347},{"type":23,"value":129328},{"type":17,"tag":84,"props":280770,"children":280771},{},[280772,280776,280778,280783,280784,280789,280790,280795],{"type":17,"tag":48,"props":280773,"children":280774},{},[280775],{"type":23,"value":267682},{"type":23,"value":280777}," — resumes, cover letters, or other attachments (",{"type":17,"tag":6121,"props":280779,"children":280781},{"className":280780},[],[280782],{"type":23,"value":18766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280785,"children":280787},{"className":280786},[],[280788],{"type":23,"value":202723},{"type":23,"value":11826},{"type":17,"tag":6121,"props":280791,"children":280793},{"className":280792},[],[280794],{"type":23,"value":134916},{"type":23,"value":129328},{"type":17,"tag":29,"props":280797,"children":280798},{},[280799],{"type":23,"value":280800},"Custom fields are also supported via Unified's Metadata API, so you can extend workflows without losing ATS-specific context.",{"type":17,"tag":68,"props":280802,"children":280804},{"id":280803},"data-flow-for-candidate-sourcing",[280805],{"type":23,"value":280806},"Data Flow for Candidate Sourcing",{"type":17,"tag":29,"props":280808,"children":280809},{},[280810],{"type":23,"value":280811},"The flow works the same across all integrated ATS systems:",{"type":17,"tag":6154,"props":280813,"children":280814},{},[280815,280820,280825,280830],{"type":17,"tag":84,"props":280816,"children":280817},{},[280818],{"type":23,"value":280819},"Unified connects to the ATS and imports open jobs.",{"type":17,"tag":84,"props":280821,"children":280822},{},[280823],{"type":23,"value":280824},"Your application matches and submits candidates to those jobs.",{"type":17,"tag":84,"props":280826,"children":280827},{},[280828],{"type":23,"value":280829},"Applications are created in the ATS, with documents uploaded if needed.",{"type":17,"tag":84,"props":280831,"children":280832},{},[280833],{"type":23,"value":280834},"Status changes and recruiter feedback are tracked via API or webhook.",{"type":17,"tag":29,"props":280836,"children":280837},{},[280838,280840,280850],{"type":23,"value":280839},"Because Unified handles both ",{"type":17,"tag":48,"props":280841,"children":280842},{},[280843,280845,280849],{"type":23,"value":280844},"native and [virtual ",{"type":17,"tag":133,"props":280846,"children":280847},{"href":4999},[280848],{"type":23,"value":5002},{"type":23,"value":88175},{"type":23,"value":280851},", you get real-time updates even if the ATS doesn't support them natively.",{"type":17,"tag":29,"props":280853,"children":280854},{},[280855,280857],{"type":23,"value":280856},"Learn how to standardize assessments across 60+ ATS platforms in our guide: ",{"type":17,"tag":133,"props":280858,"children":280860},{"href":278898,"rel":280859},[214],[280861],{"type":23,"value":280298},{"type":17,"tag":68,"props":280863,"children":280864},{"id":76108},[280865],{"type":23,"value":76111},{"type":17,"tag":29,"props":280867,"children":280868},{},[280869,280870,280875],{"type":23,"value":254333},{"type":17,"tag":48,"props":280871,"children":280872},{},[280873],{"type":23,"value":280874},"62+ ATS integrations",{"type":23,"value":109313},{"type":17,"tag":80,"props":280877,"children":280878},{},[280879,280889,280899],{"type":17,"tag":84,"props":280880,"children":280881},{},[280882,280887],{"type":17,"tag":48,"props":280883,"children":280884},{},[280885],{"type":23,"value":280886},"Enterprise ATS",{"type":23,"value":280888},": Greenhouse, iCIMS, Workday, SAP SuccessFactors, Oracle Taleo",{"type":17,"tag":84,"props":280890,"children":280891},{},[280892,280897],{"type":17,"tag":48,"props":280893,"children":280894},{},[280895],{"type":23,"value":280896},"Mid-Market ATS",{"type":23,"value":280898},": Lever, SmartRecruiters, JazzHR, Jobvite, BambooHR",{"type":17,"tag":84,"props":280900,"children":280901},{},[280902,280907],{"type":17,"tag":48,"props":280903,"children":280904},{},[280905],{"type":23,"value":280906},"SMB ATS",{"type":23,"value":280908},": Workable, Recruitee, Manatal, Pinpoint, Ashby",{"type":17,"tag":29,"props":280910,"children":280911},{},[280912],{"type":17,"tag":133,"props":280913,"children":280915},{"href":56812,"rel":280914},[214],[280916],{"type":23,"value":280459},{"type":17,"tag":68,"props":280918,"children":280919},{"id":275134},[280920],{"type":23,"value":275137},{"type":17,"tag":29,"props":280922,"children":280923},{},[280924],{"type":23,"value":275142},{"type":17,"tag":80,"props":280926,"children":280927},{},[280928,280938,280948,280957],{"type":17,"tag":84,"props":280929,"children":280930},{},[280931,280936],{"type":17,"tag":48,"props":280932,"children":280933},{},[280934],{"type":23,"value":280935},"Speed to market",{"type":23,"value":280937}," — one build supports 60+ ATS platforms.",{"type":17,"tag":84,"props":280939,"children":280940},{},[280941,280946],{"type":17,"tag":48,"props":280942,"children":280943},{},[280944],{"type":23,"value":280945},"Consistency",{"type":23,"value":280947}," — jobs, candidates, applications, and documents share a normalized schema.",{"type":17,"tag":84,"props":280949,"children":280950},{},[280951,280955],{"type":17,"tag":48,"props":280952,"children":280953},{},[280954],{"type":23,"value":268961},{"type":23,"value":280956}," — webhook-driven updates ensure status is always current.",{"type":17,"tag":84,"props":280958,"children":280959},{},[280960,280964],{"type":17,"tag":48,"props":280961,"children":280962},{},[280963],{"type":23,"value":81215},{"type":23,"value":280965}," — full CRUD support for jobs, candidates, applications, and documents.",{"type":17,"tag":29,"props":280967,"children":280968},{},[280969],{"type":23,"value":280970},"Instead of spending months building and maintaining ATS connectors, your team can focus on the sourcing experience itself.",{"type":17,"tag":29,"props":280972,"children":280973},{},[280974,280976,280981,280982,280987],{"type":23,"value":280975},"Launch sourcing workflows across 60+ ATS platforms today. ",{"type":17,"tag":133,"props":280977,"children":280979},{"href":158861,"rel":280978},[214],[280980],{"type":23,"value":279920},{"type":23,"value":75890},{"type":17,"tag":133,"props":280983,"children":280985},{"href":1623,"rel":280984},[214],[280986],{"type":23,"value":226481},{"type":23,"value":280988}," to see how Unified.to can accelerate your product roadmap.",{"title":7,"searchDepth":1629,"depth":1629,"links":280990},[280991,280992,280993,280994,280995],{"id":280579,"depth":1629,"text":280582},{"id":280632,"depth":1629,"text":280635},{"id":280803,"depth":1629,"text":280806},{"id":76108,"depth":1629,"text":76111},{"id":275134,"depth":1629,"text":275137},"content:blog:how_to_build_candidate_sourcing_across_greenhouse_lever_workday_and_60_ats_platforms_with_a_unified_api.md","blog/how_to_build_candidate_sourcing_across_greenhouse_lever_workday_and_60_ats_platforms_with_a_unified_api.md","blog/how_to_build_candidate_sourcing_across_greenhouse_lever_workday_and_60_ats_platforms_with_a_unified_api",{"_path":281000,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":281001,"description":281002,"img":281003,"date":278989,"tag":12,"body":281004,"_type":1677,"_id":281466,"_source":1679,"_file":281467,"_stem":281468,"_extension":1682},"/blog/how_to_build_enterprise_search_across_google_drive_slack_notion_zendesk_and_other_platforms_with_a_unified_api","How to Build Enterprise Search Across Google Drive, Slack, Notion, Zendesk, and Other Platforms with a Unified API","Enterprise search is one of the most common GenAI-powered use cases inside SaaS products. Customers want to ask questions in natural language and get answers...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_enterprise_search_across_google_drive_slack_notion_zendesk_and_other_platforms_with_a_unified_api-icon.png",{"type":14,"children":281005,"toc":281459},[281006,281011,281014,281021,281026,281037,281056,281062,281066,281114,281120,281125,281219,281224,281229,281235,281240,281305,281317,281323,281338,281379,281387,281391,281396,281437,281442],{"type":17,"tag":18,"props":281007,"children":281009},{"id":281008},"how-to-build-enterprise-search-across-google-drive-slack-notion-zendesk-and-other-platforms-with-a-unified-api",[281010],{"type":23,"value":281001},{"type":17,"tag":25,"props":281012,"children":281013},{},[],{"type":17,"tag":29,"props":281015,"children":281016},{},[281017],{"type":17,"tag":33,"props":281018,"children":281019},{},[281020],{"type":23,"value":279007},{"type":17,"tag":29,"props":281022,"children":281023},{},[281024],{"type":23,"value":281025},"Enterprise search is one of the most common GenAI-powered use cases inside SaaS products. Customers want to ask questions in natural language and get answers from their documents, wikis, chats, and tickets—without switching systems.",{"type":17,"tag":29,"props":281027,"children":281028},{},[281029,281031,281035],{"type":23,"value":281030},"The challenge is that enterprise content lives everywhere: Google Drive, Notion, Slack, Zendesk, Confluence, Outlook, and more. Each source has different schemas, ",{"type":17,"tag":133,"props":281032,"children":281033},{"href":135},[281034],{"type":23,"value":138},{"type":23,"value":281036},", and webhook behaviors. Building and maintaining per-vendor connectors is a massive drain on engineering time.",{"type":17,"tag":29,"props":281038,"children":281039},{},[281040,281041,281048,281050,281054],{"type":23,"value":9619},{"type":17,"tag":48,"props":281042,"children":281043},{},[281044],{"type":17,"tag":133,"props":281045,"children":281046},{"href":7691},[281047],{"type":23,"value":7459},{"type":23,"value":281049}," removes this complexity by normalizing unstructured content across 300+ integrations and delivering it in real time. That lets your product index, embed, and search customer data through one consistent schema—ideal for powering ",{"type":17,"tag":133,"props":281051,"children":281052},{"href":5201},[281053],{"type":23,"value":77024},{"type":23,"value":281055}," (RAG) pipelines, semantic enterprise search, and grounded AI assistants.",{"type":17,"tag":68,"props":281057,"children":281059},{"id":281058},"when-to-use-enterprise-search",[281060],{"type":23,"value":281061},"When to Use Enterprise Search",{"type":17,"tag":29,"props":281063,"children":281064},{},[281065],{"type":23,"value":254154},{"type":17,"tag":80,"props":281067,"children":281068},{},[281069,281079,281089,281099,281109],{"type":17,"tag":84,"props":281070,"children":281071},{},[281072,281077],{"type":17,"tag":48,"props":281073,"children":281074},{},[281075],{"type":23,"value":281076},"Enable unified knowledge search",{"type":23,"value":281078}," across files, wikis, chats, tickets, and CRM notes.",{"type":17,"tag":84,"props":281080,"children":281081},{},[281082,281087],{"type":17,"tag":48,"props":281083,"children":281084},{},[281085],{"type":23,"value":281086},"Support IT and HR workflows",{"type":23,"value":281088}," with central access to policies, SOPs, and onboarding docs.",{"type":17,"tag":84,"props":281090,"children":281091},{},[281092,281097],{"type":17,"tag":48,"props":281093,"children":281094},{},[281095],{"type":23,"value":281096},"Power RAG-based assistants",{"type":23,"value":281098}," that answer questions using company knowledge.",{"type":17,"tag":84,"props":281100,"children":281101},{},[281102,281107],{"type":17,"tag":48,"props":281103,"children":281104},{},[281105],{"type":23,"value":281106},"Keep results fresh",{"type":23,"value":281108}," with real-time updates instead of batch syncs.",{"type":17,"tag":84,"props":281110,"children":281111},{},[281112],{"type":23,"value":281113},"Build multi-source RAG search across storage, knowledge bases, tickets, and conversations without per-provider connectors.",{"type":17,"tag":68,"props":281115,"children":281117},{"id":281116},"normalized-content-types",[281118],{"type":23,"value":281119},"Normalized Content Types",{"type":17,"tag":29,"props":281121,"children":281122},{},[281123],{"type":23,"value":281124},"Unified.to provides consistent schemas across common enterprise data categories:",{"type":17,"tag":80,"props":281126,"children":281127},{},[281128,281150,281173,281196],{"type":17,"tag":84,"props":281129,"children":281130},{},[281131,281148],{"type":17,"tag":48,"props":281132,"children":281133},{},[281134,281136,281147],{"type":23,"value":281135},"File (",{"type":17,"tag":48,"props":281137,"children":281138},{},[281139],{"type":17,"tag":48,"props":281140,"children":281141},{},[281142],{"type":17,"tag":6121,"props":281143,"children":281145},{"className":281144},[],[281146],{"type":23,"value":124378},{"type":23,"value":12034},{"type":23,"value":281149}," — cloud storage content (Google Drive, Box, Dropbox, OneDrive).",{"type":17,"tag":84,"props":281151,"children":281152},{},[281153,281171],{"type":17,"tag":48,"props":281154,"children":281155},{},[281156,281158,281170],{"type":23,"value":281157},"Page (",{"type":17,"tag":48,"props":281159,"children":281160},{},[281161],{"type":17,"tag":48,"props":281162,"children":281163},{},[281164],{"type":17,"tag":6121,"props":281165,"children":281167},{"className":281166},[],[281168],{"type":23,"value":281169},"kms_page",{"type":23,"value":12034},{"type":23,"value":281172}," — knowledge management systems like Notion, Confluence, Coda, Guru.",{"type":17,"tag":84,"props":281174,"children":281175},{},[281176,281194],{"type":17,"tag":48,"props":281177,"children":281178},{},[281179,281181,281193],{"type":23,"value":281180},"Message (",{"type":17,"tag":48,"props":281182,"children":281183},{},[281184],{"type":17,"tag":48,"props":281185,"children":281186},{},[281187],{"type":17,"tag":6121,"props":281188,"children":281190},{"className":281189},[],[281191],{"type":23,"value":281192},"messaging_message",{"type":23,"value":12034},{"type":23,"value":281195}," — conversations from Slack, Teams, Gmail, Outlook.",{"type":17,"tag":84,"props":281197,"children":281198},{},[281199,281217],{"type":17,"tag":48,"props":281200,"children":281201},{},[281202,281204,281216],{"type":23,"value":281203},"Ticket (",{"type":17,"tag":48,"props":281205,"children":281206},{},[281207],{"type":17,"tag":48,"props":281208,"children":281209},{},[281210],{"type":17,"tag":6121,"props":281211,"children":281213},{"className":281212},[],[281214],{"type":23,"value":281215},"ticketing_ticket",{"type":23,"value":12034},{"type":23,"value":281218}," — support and IT tickets from Zendesk, JSM, ServiceNow.",{"type":17,"tag":29,"props":281220,"children":281221},{},[281222],{"type":23,"value":281223},"All objects come with normalized metadata (IDs, timestamps, authors, URLs) so they can be indexed and embedded consistently, regardless of source.",{"type":17,"tag":29,"props":281225,"children":281226},{},[281227],{"type":23,"value":281228},"File objects include explicit permissions metadata, which can be used to filter retrieval results. For other objects, implement row-level filtering in your application layer when building enterprise RAG experiences.",{"type":17,"tag":68,"props":281230,"children":281232},{"id":281231},"data-flow-for-enterprise-search",[281233],{"type":23,"value":281234},"Data Flow for Enterprise Search",{"type":17,"tag":29,"props":281236,"children":281237},{},[281238],{"type":23,"value":281239},"Here's how it works with Unified.to:",{"type":17,"tag":6154,"props":281241,"children":281242},{},[281243,281252,281261,281285,281295],{"type":17,"tag":84,"props":281244,"children":281245},{},[281246,281250],{"type":17,"tag":48,"props":281247,"children":281248},{},[281249],{"type":23,"value":251948},{"type":23,"value":281251}," — Your customer authorizes integrations like Drive, Slack, or Zendesk.",{"type":17,"tag":84,"props":281253,"children":281254},{},[281255,281259],{"type":17,"tag":48,"props":281256,"children":281257},{},[281258],{"type":23,"value":272693},{"type":23,"value":281260}," — Unified streams updates via webhooks for files, messages, tickets, or pages.",{"type":17,"tag":84,"props":281262,"children":281263},{},[281264,281266,281271,281272,281277,281278,281283],{"type":23,"value":281265},"Index & Embed — Fetch content, chunk it (for example, 512-token segments with overlap), add identifiers like ",{"type":17,"tag":6121,"props":281267,"children":281269},{"className":281268},[],[281270],{"type":23,"value":25037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":281273,"children":281275},{"className":281274},[],[281276],{"type":23,"value":161193},{"type":23,"value":12561},{"type":17,"tag":6121,"props":281279,"children":281281},{"className":281280},[],[281282],{"type":23,"value":25337},{"type":23,"value":281284},", and generate embeddings with your model of choice. Store results in your vector database.",{"type":17,"tag":84,"props":281286,"children":281287},{},[281288,281293],{"type":17,"tag":48,"props":281289,"children":281290},{},[281291],{"type":23,"value":281292},"Query & Retrieve",{"type":23,"value":281294}," — When a user searches, query the vector DB to retrieve top results.",{"type":17,"tag":84,"props":281296,"children":281297},{},[281298,281303],{"type":17,"tag":48,"props":281299,"children":281300},{},[281301],{"type":23,"value":281302},"Answer & Deliver",{"type":23,"value":281304}," — Return matches with citations, optionally using Unified's GenAI endpoints for answer generation.",{"type":17,"tag":29,"props":281306,"children":281307},{},[281308,281310],{"type":23,"value":281309},"See how to apply a similar approach for conversational Q&A: ",{"type":17,"tag":133,"props":281311,"children":281314},{"href":281312,"rel":281313},"https://docs.unified.to/guides/how_to_build_a_rag_pipeline_for_a_qanda_bot_with_unified#how-to-build-a-rag-pipeline-for-a-qa-bot-with-unifiedto",[214],[281315],{"type":23,"value":281316},"How to Build a RAG Pipeline for a Q&A Bot with Unified.to",{"type":17,"tag":68,"props":281318,"children":281320},{"id":281319},"supported-data-sources",[281321],{"type":23,"value":281322},"Supported Data Sources",{"type":17,"tag":29,"props":281324,"children":281325},{},[281326,281327,281332,281333,281337],{"type":23,"value":254333},{"type":17,"tag":48,"props":281328,"children":281329},{},[281330],{"type":23,"value":281331},"21+ data categories",{"type":23,"value":34435},{"type":17,"tag":48,"props":281334,"children":281335},{},[281336],{"type":23,"value":279779},{"type":23,"value":109313},{"type":17,"tag":80,"props":281339,"children":281340},{},[281341,281350,281359,281369],{"type":17,"tag":84,"props":281342,"children":281343},{},[281344,281348],{"type":17,"tag":48,"props":281345,"children":281346},{},[281347],{"type":23,"value":265506},{"type":23,"value":281349},": Google Drive, Box, Dropbox, OneDrive",{"type":17,"tag":84,"props":281351,"children":281352},{},[281353,281358],{"type":17,"tag":48,"props":281354,"children":281355},{},[281356],{"type":23,"value":281357},"Knowledge systems",{"type":23,"value":279823},{"type":17,"tag":84,"props":281360,"children":281361},{},[281362,281367],{"type":17,"tag":48,"props":281363,"children":281364},{},[281365],{"type":23,"value":281366},"Messaging & email",{"type":23,"value":281368},": Slack, Teams, Gmail, Outlook",{"type":17,"tag":84,"props":281370,"children":281371},{},[281372,281377],{"type":17,"tag":48,"props":281373,"children":281374},{},[281375],{"type":23,"value":281376},"Ticketing & help desk",{"type":23,"value":281378},": Zendesk, Jira Service Management, ServiceNow",{"type":17,"tag":29,"props":281380,"children":281381},{},[281382],{"type":17,"tag":133,"props":281383,"children":281385},{"href":87026,"rel":281384},[214],[281386],{"type":23,"value":269356},{"type":17,"tag":68,"props":281388,"children":281389},{"id":275134},[281390],{"type":23,"value":275137},{"type":17,"tag":29,"props":281392,"children":281393},{},[281394],{"type":23,"value":281395},"For PMs and engineers, a unified API makes enterprise search practical at scale:",{"type":17,"tag":80,"props":281397,"children":281398},{},[281399,281409,281418,281428],{"type":17,"tag":84,"props":281400,"children":281401},{},[281402,281407],{"type":17,"tag":48,"props":281403,"children":281404},{},[281405],{"type":23,"value":281406},"One schema for 300+ sources",{"type":23,"value":281408}," — no custom parsing per vendor.",{"type":17,"tag":84,"props":281410,"children":281411},{},[281412,281416],{"type":17,"tag":48,"props":281413,"children":281414},{},[281415],{"type":23,"value":270394},{"type":23,"value":281417}," — webhook-driven updates keep your RAG index aligned with file edits, message updates, and ticket changes.",{"type":17,"tag":84,"props":281419,"children":281420},{},[281421,281426],{"type":17,"tag":48,"props":281422,"children":281423},{},[281424],{"type":23,"value":281425},"Secure by design",{"type":23,"value":281427}," — Unified never stores customer data, simplifying security and compliance reviews.",{"type":17,"tag":84,"props":281429,"children":281430},{},[281431,281435],{"type":17,"tag":48,"props":281432,"children":281433},{},[281434],{"type":23,"value":81215},{"type":23,"value":281436}," — support for multiple categories (storage, KMS, messaging, ticketing) through a single API.",{"type":17,"tag":29,"props":281438,"children":281439},{},[281440],{"type":23,"value":281441},"This allows your team to deliver enterprise-grade search and GenAI features faster, while avoiding integration debt.",{"type":17,"tag":29,"props":281443,"children":281444},{},[281445,281447,281452,281453,281458],{"type":23,"value":281446},"Launch enterprise search across 345+ data sources with Unified.to. ",{"type":17,"tag":133,"props":281448,"children":281450},{"href":158861,"rel":281449},[214],[281451],{"type":23,"value":279920},{"type":23,"value":75890},{"type":17,"tag":133,"props":281454,"children":281456},{"href":1623,"rel":281455},[214],[281457],{"type":23,"value":226481},{"type":23,"value":271016},{"title":7,"searchDepth":1629,"depth":1629,"links":281460},[281461,281462,281463,281464,281465],{"id":281058,"depth":1629,"text":281061},{"id":281116,"depth":1629,"text":281119},{"id":281231,"depth":1629,"text":281234},{"id":281319,"depth":1629,"text":281322},{"id":275134,"depth":1629,"text":275137},"content:blog:how_to_build_enterprise_search_across_google_drive_slack_notion_zendesk_and_other_platforms_with_a_unified_api.md","blog/how_to_build_enterprise_search_across_google_drive_slack_notion_zendesk_and_other_platforms_with_a_unified_api.md","blog/how_to_build_enterprise_search_across_google_drive_slack_notion_zendesk_and_other_platforms_with_a_unified_api",{"_path":281470,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":281471,"description":281472,"img":281473,"date":278989,"tag":6341,"body":281474,"_type":1677,"_id":282259,"_source":1679,"_file":282260,"_stem":282261,"_extension":1682},"/blog/saml_single_sign_on","SAML Single-Sign-On","SAML (Security Assertion Markup Language) is an XML-based standard for exchanging authentication and authorization data between parties, particularly between...","https://s3.us-east-2.amazonaws.com/unified-article-images/saml_single_sign_on-icon.webp",{"type":14,"children":281475,"toc":282251},[281476,281481,281484,281491,281496,281514,281519,281528,281536,281578,281586,281591,281596,281601,281606,281614,281727,281735,281788,281796,281829,281837,281879,281887,281895,281913,281921,281939,281944,281953,281961,281970,282007,282055,282064,282069,282170,282179,282217,282223,282228,282241,282246],{"type":17,"tag":18,"props":281477,"children":281479},{"id":281478},"saml-single-sign-on",[281480],{"type":23,"value":281471},{"type":17,"tag":25,"props":281482,"children":281483},{},[],{"type":17,"tag":29,"props":281485,"children":281486},{},[281487],{"type":17,"tag":33,"props":281488,"children":281489},{},[281490],{"type":23,"value":279007},{"type":17,"tag":29,"props":281492,"children":281493},{},[281494],{"type":23,"value":281495},"SAML (Security Assertion Markup Language) is an XML-based standard for exchanging authentication and authorization data between parties, particularly between an identity provider (IdP) and a service provider (SP).",{"type":17,"tag":29,"props":281497,"children":281498},{},[281499,281504,281506,281512],{"type":17,"tag":133,"props":281500,"children":281502},{"href":42620,"rel":281501},[214],[281503],{"type":23,"value":217},{"type":23,"value":281505}," currently supports JumpCloud SAML.  ",{"type":17,"tag":133,"props":281507,"children":281509},{"href":215330,"rel":281508},[214],[281510],{"type":23,"value":281511},"Let us know",{"type":23,"value":281513}," if you need another SAML identity provider.",{"type":17,"tag":29,"props":281515,"children":281516},{},[281517],{"type":23,"value":281518},"Here's how SAML works:",{"type":17,"tag":68,"props":281520,"children":281522},{"id":281521},"saml-authentication-flow",[281523],{"type":17,"tag":48,"props":281524,"children":281525},{},[281526],{"type":23,"value":281527},"SAML Authentication Flow",{"type":17,"tag":29,"props":281529,"children":281530},{},[281531],{"type":17,"tag":48,"props":281532,"children":281533},{},[281534],{"type":23,"value":281535},"Key Components:",{"type":17,"tag":6154,"props":281537,"children":281538},{},[281539,281549,281559,281568],{"type":17,"tag":84,"props":281540,"children":281541},{},[281542,281547],{"type":17,"tag":48,"props":281543,"children":281544},{},[281545],{"type":23,"value":281546},"Identity Provider (IdP)",{"type":23,"value":281548}," - The system that authenticates users (e.g., Active Directory, Okta, Azure AD)",{"type":17,"tag":84,"props":281550,"children":281551},{},[281552,281557],{"type":17,"tag":48,"props":281553,"children":281554},{},[281555],{"type":23,"value":281556},"Service Provider (SP)",{"type":23,"value":281558}," - The application the user wants to access (e.g., your Unified.to app)",{"type":17,"tag":84,"props":281560,"children":281561},{},[281562,281566],{"type":17,"tag":48,"props":281563,"children":281564},{},[281565],{"type":23,"value":118801},{"type":23,"value":281567}," - The person trying to log in",{"type":17,"tag":84,"props":281569,"children":281570},{},[281571,281576],{"type":17,"tag":48,"props":281572,"children":281573},{},[281574],{"type":23,"value":281575},"SAML Assertion",{"type":23,"value":281577}," - XML document containing authentication/authorization information",{"type":17,"tag":29,"props":281579,"children":281580},{},[281581],{"type":17,"tag":48,"props":281582,"children":281583},{},[281584],{"type":23,"value":281585},"Typical SAML SSO Flow:",{"type":17,"tag":29,"props":281587,"children":281588},{},[281589],{"type":23,"value":281590},"1. User → SP: \"I want to access the application\"",{"type":17,"tag":29,"props":281592,"children":281593},{},[281594],{"type":23,"value":281595},"2. SP → User: Redirect to IdP with SAML AuthnRequest",{"type":17,"tag":29,"props":281597,"children":281598},{},[281599],{"type":23,"value":281600},"3. User → IdP: Login with credentials",{"type":17,"tag":29,"props":281602,"children":281603},{},[281604],{"type":23,"value":281605},"4. IdP → User: Redirect back to SP with SAML Response/Assertion",{"type":17,"tag":29,"props":281607,"children":281608},{},[281609],{"type":17,"tag":48,"props":281610,"children":281611},{},[281612],{"type":23,"value":281613},"Detailed Steps:",{"type":17,"tag":6154,"props":281615,"children":281616},{},[281617,281638,281659,281680,281701],{"type":17,"tag":84,"props":281618,"children":281619},{},[281620,281625],{"type":17,"tag":48,"props":281621,"children":281622},{},[281623],{"type":23,"value":281624},"User Access Request",{"type":17,"tag":80,"props":281626,"children":281627},{},[281628,281633],{"type":17,"tag":84,"props":281629,"children":281630},{},[281631],{"type":23,"value":281632},"User visits your application and clicks \"SAML SSO\" login",{"type":17,"tag":84,"props":281634,"children":281635},{},[281636],{"type":23,"value":281637},"Application generates a SAML Authentication Request (AuthnRequest)",{"type":17,"tag":84,"props":281639,"children":281640},{},[281641,281646],{"type":17,"tag":48,"props":281642,"children":281643},{},[281644],{"type":23,"value":281645},"Redirect to Identity Provider",{"type":17,"tag":80,"props":281647,"children":281648},{},[281649,281654],{"type":17,"tag":84,"props":281650,"children":281651},{},[281652],{"type":23,"value":281653},"User is redirected to their organization's IdP",{"type":17,"tag":84,"props":281655,"children":281656},{},[281657],{"type":23,"value":281658},"AuthnRequest contains information about the SP and requested attributes",{"type":17,"tag":84,"props":281660,"children":281661},{},[281662,281667],{"type":17,"tag":48,"props":281663,"children":281664},{},[281665],{"type":23,"value":281666},"User Authentication",{"type":17,"tag":80,"props":281668,"children":281669},{},[281670,281675],{"type":17,"tag":84,"props":281671,"children":281672},{},[281673],{"type":23,"value":281674},"User enters their organizational credentials",{"type":17,"tag":84,"props":281676,"children":281677},{},[281678],{"type":23,"value":281679},"IdP validates the credentials",{"type":17,"tag":84,"props":281681,"children":281682},{},[281683,281688],{"type":17,"tag":48,"props":281684,"children":281685},{},[281686],{"type":23,"value":281687},"SAML Response Generation",{"type":17,"tag":80,"props":281689,"children":281690},{},[281691,281696],{"type":17,"tag":84,"props":281692,"children":281693},{},[281694],{"type":23,"value":281695},"IdP creates a SAML Response containing a SAML Assertion",{"type":17,"tag":84,"props":281697,"children":281698},{},[281699],{"type":23,"value":281700},"Assertion includes user identity, authentication method, session info, etc.",{"type":17,"tag":84,"props":281702,"children":281703},{},[281704,281709],{"type":17,"tag":48,"props":281705,"children":281706},{},[281707],{"type":23,"value":281708},"Response Processing",{"type":17,"tag":80,"props":281710,"children":281711},{},[281712,281717,281722],{"type":17,"tag":84,"props":281713,"children":281714},{},[281715],{"type":23,"value":281716},"IdP redirects user back to SP with the SAML Response",{"type":17,"tag":84,"props":281718,"children":281719},{},[281720],{"type":23,"value":281721},"SP validates the assertion signature and extracts user information",{"type":17,"tag":84,"props":281723,"children":281724},{},[281725],{"type":23,"value":281726},"User is logged into the application",{"type":17,"tag":29,"props":281728,"children":281729},{},[281730],{"type":17,"tag":48,"props":281731,"children":281732},{},[281733],{"type":23,"value":281734},"SAML Assertion Contents:",{"type":17,"tag":80,"props":281736,"children":281737},{},[281738,281748,281758,281768,281778],{"type":17,"tag":84,"props":281739,"children":281740},{},[281741,281746],{"type":17,"tag":48,"props":281742,"children":281743},{},[281744],{"type":23,"value":281745},"Subject",{"type":23,"value":281747},": Who the user is (NameID, email, etc.)",{"type":17,"tag":84,"props":281749,"children":281750},{},[281751,281756],{"type":17,"tag":48,"props":281752,"children":281753},{},[281754],{"type":23,"value":281755},"Authentication Statement",{"type":23,"value":281757},": How they were authenticated",{"type":17,"tag":84,"props":281759,"children":281760},{},[281761,281766],{"type":17,"tag":48,"props":281762,"children":281763},{},[281764],{"type":23,"value":281765},"Attribute Statement",{"type":23,"value":281767},": Additional user attributes (roles, groups, etc.)",{"type":17,"tag":84,"props":281769,"children":281770},{},[281771,281776],{"type":17,"tag":48,"props":281772,"children":281773},{},[281774],{"type":23,"value":281775},"Conditions",{"type":23,"value":281777},": Validity period, audience restrictions",{"type":17,"tag":84,"props":281779,"children":281780},{},[281781,281786],{"type":17,"tag":48,"props":281782,"children":281783},{},[281784],{"type":23,"value":281785},"Signature",{"type":23,"value":281787},": Cryptographic proof of authenticity",{"type":17,"tag":29,"props":281789,"children":281790},{},[281791],{"type":17,"tag":48,"props":281792,"children":281793},{},[281794],{"type":23,"value":281795},"Common SAML Bindings:",{"type":17,"tag":80,"props":281797,"children":281798},{},[281799,281809,281819],{"type":17,"tag":84,"props":281800,"children":281801},{},[281802,281807],{"type":17,"tag":48,"props":281803,"children":281804},{},[281805],{"type":23,"value":281806},"HTTP Redirect",{"type":23,"value":281808},": Data passed via URL parameters",{"type":17,"tag":84,"props":281810,"children":281811},{},[281812,281817],{"type":17,"tag":48,"props":281813,"children":281814},{},[281815],{"type":23,"value":281816},"HTTP POST",{"type":23,"value":281818},": Data posted in form fields",{"type":17,"tag":84,"props":281820,"children":281821},{},[281822,281827],{"type":17,"tag":48,"props":281823,"children":281824},{},[281825],{"type":23,"value":281826},"HTTP Artifact",{"type":23,"value":281828},": Reference token exchanged for full assertion",{"type":17,"tag":29,"props":281830,"children":281831},{},[281832],{"type":17,"tag":48,"props":281833,"children":281834},{},[281835],{"type":23,"value":281836},"Security Features:",{"type":17,"tag":80,"props":281838,"children":281839},{},[281840,281850,281859,281869],{"type":17,"tag":84,"props":281841,"children":281842},{},[281843,281848],{"type":17,"tag":48,"props":281844,"children":281845},{},[281846],{"type":23,"value":281847},"Digital Signatures",{"type":23,"value":281849},": Ensure assertions haven't been tampered with",{"type":17,"tag":84,"props":281851,"children":281852},{},[281853,281857],{"type":17,"tag":48,"props":281854,"children":281855},{},[281856],{"type":23,"value":67318},{"type":23,"value":281858},": Protect sensitive data in transit",{"type":17,"tag":84,"props":281860,"children":281861},{},[281862,281867],{"type":17,"tag":48,"props":281863,"children":281864},{},[281865],{"type":23,"value":281866},"Time-based Conditions",{"type":23,"value":281868},": Assertions expire after set time",{"type":17,"tag":84,"props":281870,"children":281871},{},[281872,281877],{"type":17,"tag":48,"props":281873,"children":281874},{},[281875],{"type":23,"value":281876},"Audience Restrictions",{"type":23,"value":281878},": Limit which SPs can use the assertion",{"type":17,"tag":29,"props":281880,"children":281881},{},[281882],{"type":17,"tag":48,"props":281883,"children":281884},{},[281885],{"type":23,"value":281886},"Configuration Requirements:",{"type":17,"tag":29,"props":281888,"children":281889},{},[281890],{"type":17,"tag":48,"props":281891,"children":281892},{},[281893],{"type":23,"value":281894},"For Service Provider (your app):",{"type":17,"tag":80,"props":281896,"children":281897},{},[281898,281903,281908],{"type":17,"tag":84,"props":281899,"children":281900},{},[281901],{"type":23,"value":281902},"SAML metadata XML with entity ID, ACS URL, certificate",{"type":17,"tag":84,"props":281904,"children":281905},{},[281906],{"type":23,"value":281907},"User attribute mapping (email, name, roles)",{"type":17,"tag":84,"props":281909,"children":281910},{},[281911],{"type":23,"value":281912},"Certificate for signature validation",{"type":17,"tag":29,"props":281914,"children":281915},{},[281916],{"type":17,"tag":48,"props":281917,"children":281918},{},[281919],{"type":23,"value":281920},"For Identity Provider:",{"type":17,"tag":80,"props":281922,"children":281923},{},[281924,281929,281934],{"type":17,"tag":84,"props":281925,"children":281926},{},[281927],{"type":23,"value":281928},"SP metadata containing endpoints and certificate",{"type":17,"tag":84,"props":281930,"children":281931},{},[281932],{"type":23,"value":281933},"User attribute configuration",{"type":17,"tag":84,"props":281935,"children":281936},{},[281937],{"type":23,"value":281938},"SSO URL configuration",{"type":17,"tag":29,"props":281940,"children":281941},{},[281942],{"type":23,"value":281943},"This is why SAML is popular for enterprise SSO - it provides secure, standardized authentication that integrates with existing corporate identity systems without requiring users to manage separate passwords for each application.",{"type":17,"tag":68,"props":281945,"children":281947},{"id":281946},"jumpcloud-saml-integration-setup",[281948],{"type":17,"tag":48,"props":281949,"children":281950},{},[281951],{"type":23,"value":281952},"JumpCloud SAML Integration Setup",{"type":17,"tag":29,"props":281954,"children":281955},{},[281956],{"type":17,"tag":48,"props":281957,"children":281958},{},[281959],{"type":23,"value":281960},"1. JumpCloud Configuration (Identity Provider Side)",{"type":17,"tag":239,"props":281962,"children":281964},{"id":281963},"step-1-create-sso-application-in-jumpcloud",[281965],{"type":17,"tag":48,"props":281966,"children":281967},{},[281968],{"type":23,"value":281969},"Step 1: Create SSO Application in JumpCloud",{"type":17,"tag":6154,"props":281971,"children":281972},{},[281973,281978,281988,281997,282002],{"type":17,"tag":84,"props":281974,"children":281975},{},[281976],{"type":23,"value":281977},"Log into JumpCloud Admin Portal",{"type":17,"tag":84,"props":281979,"children":281980},{},[281981,281983],{"type":23,"value":281982},"Navigate to ",{"type":17,"tag":48,"props":281984,"children":281985},{},[281986],{"type":23,"value":281987},"SSO Applications",{"type":17,"tag":84,"props":281989,"children":281990},{},[281991,281992],{"type":23,"value":42086},{"type":17,"tag":48,"props":281993,"children":281994},{},[281995],{"type":23,"value":281996},"+ Add New Application",{"type":17,"tag":84,"props":281998,"children":281999},{},[282000],{"type":23,"value":282001},"Search for \"Custom SAML Application\" or \"Custom App\"",{"type":17,"tag":84,"props":282003,"children":282004},{},[282005],{"type":23,"value":282006},"Configure the application:",{"type":17,"tag":80,"props":282008,"children":282009},{},[282010,282020,282038],{"type":17,"tag":84,"props":282011,"children":282012},{},[282013,282018],{"type":17,"tag":48,"props":282014,"children":282015},{},[282016],{"type":23,"value":282017},"Display Label",{"type":23,"value":282019},": \"Unified.to\" (or your app name)",{"type":17,"tag":84,"props":282021,"children":282022},{},[282023,282028,282030,282036],{"type":17,"tag":48,"props":282024,"children":282025},{},[282026],{"type":23,"value":282027},"IdP Entity ID",{"type":23,"value":282029},": ",{"type":17,"tag":133,"props":282031,"children":282034},{"href":282032,"rel":282033},"https://sso.jumpcloud.com/saml2/unified-to",[214],[282035],{"type":23,"value":282032},{"type":23,"value":282037}," (or your preferred ID)",{"type":17,"tag":84,"props":282039,"children":282040},{},[282041,282046,282048,282054],{"type":17,"tag":48,"props":282042,"children":282043},{},[282044],{"type":23,"value":282045},"SP Entity ID",{"type":23,"value":282047},": Your application's entity ID (e.g., ",{"type":17,"tag":133,"props":282049,"children":282052},{"href":282050,"rel":282051},"https://api.unified.to/saml/metadata",[214],[282053],{"type":23,"value":282050},{"type":23,"value":12034},{"type":17,"tag":239,"props":282056,"children":282058},{"id":282057},"step-2-configure-saml-attributes",[282059],{"type":17,"tag":48,"props":282060,"children":282061},{},[282062],{"type":23,"value":282063},"Step 2: Configure SAML Attributes",{"type":17,"tag":29,"props":282065,"children":282066},{},[282067],{"type":23,"value":282068},"In the JumpCloud SSO configuration:",{"type":17,"tag":80,"props":282070,"children":282071},{},[282072,282089,282103,282113],{"type":17,"tag":84,"props":282073,"children":282074},{},[282075,282080,282081,282087],{"type":17,"tag":48,"props":282076,"children":282077},{},[282078],{"type":23,"value":282079},"ACS URL",{"type":23,"value":282029},{"type":17,"tag":133,"props":282082,"children":282085},{"href":282083,"rel":282084},"https://api.unified.to/saml/acs",[214],[282086],{"type":23,"value":282083},{"type":23,"value":282088}," (your assertion consumer service endpoint)",{"type":17,"tag":84,"props":282090,"children":282091},{},[282092,282097,282098],{"type":17,"tag":48,"props":282093,"children":282094},{},[282095],{"type":23,"value":282096},"Audience",{"type":23,"value":282029},{"type":17,"tag":133,"props":282099,"children":282101},{"href":282050,"rel":282100},[214],[282102],{"type":23,"value":282050},{"type":17,"tag":84,"props":282104,"children":282105},{},[282106,282111],{"type":17,"tag":48,"props":282107,"children":282108},{},[282109],{"type":23,"value":282110},"Name ID Format",{"type":23,"value":282112},": urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",{"type":17,"tag":84,"props":282114,"children":282115},{},[282116,282121,282123],{"type":17,"tag":48,"props":282117,"children":282118},{},[282119],{"type":23,"value":282120},"Attribute Mappings",{"type":23,"value":282122},":\n",{"type":17,"tag":80,"props":282124,"children":282125},{},[282126,282137,282148,282159],{"type":17,"tag":84,"props":282127,"children":282128},{},[282129,282131],{"type":23,"value":282130},"email → ",{"type":17,"tag":133,"props":282132,"children":282135},{"href":282133,"rel":282134},"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",[214],[282136],{"type":23,"value":282133},{"type":17,"tag":84,"props":282138,"children":282139},{},[282140,282142],{"type":23,"value":282141},"firstName → ",{"type":17,"tag":133,"props":282143,"children":282146},{"href":282144,"rel":282145},"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname",[214],[282147],{"type":23,"value":282144},{"type":17,"tag":84,"props":282149,"children":282150},{},[282151,282153],{"type":23,"value":282152},"lastName → ",{"type":17,"tag":133,"props":282154,"children":282157},{"href":282155,"rel":282156},"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname",[214],[282158],{"type":23,"value":282155},{"type":17,"tag":84,"props":282160,"children":282161},{},[282162,282164],{"type":23,"value":282163},"username → ",{"type":17,"tag":133,"props":282165,"children":282168},{"href":282166,"rel":282167},"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name",[214],[282169],{"type":23,"value":282166},{"type":17,"tag":239,"props":282171,"children":282173},{"id":282172},"step-3-get-jumpcloud-metadata",[282174],{"type":17,"tag":48,"props":282175,"children":282176},{},[282177],{"type":23,"value":282178},"Step 3: Get JumpCloud Metadata",{"type":17,"tag":80,"props":282180,"children":282181},{},[282182,282187,282205],{"type":17,"tag":84,"props":282183,"children":282184},{},[282185],{"type":23,"value":282186},"Download the IdP metadata XML from JumpCloud",{"type":17,"tag":84,"props":282188,"children":282189},{},[282190,282192,282197,282199,282204],{"type":23,"value":282191},"Note the ",{"type":17,"tag":48,"props":282193,"children":282194},{},[282195],{"type":23,"value":282196},"SSO URL",{"type":23,"value":282198}," (usually ",{"type":17,"tag":133,"props":282200,"children":282202},{"href":282032,"rel":282201},[214],[282203],{"type":23,"value":282032},{"type":23,"value":12034},{"type":17,"tag":84,"props":282206,"children":282207},{},[282208,282210,282215],{"type":23,"value":282209},"Get the ",{"type":17,"tag":48,"props":282211,"children":282212},{},[282213],{"type":23,"value":282214},"X.509 Certificate",{"type":23,"value":282216}," for signature validation",{"type":17,"tag":18,"props":282218,"children":282220},{"id":282219},"configure-saml-on-unified",[282221],{"type":23,"value":282222},"Configure SAML on Unified",{"type":17,"tag":29,"props":282224,"children":282225},{},[282226],{"type":23,"value":282227},"If you haven't registered an account, sign-in with any of our available Social or OAuth2 OIDC login options.  Make sure to choose the relevant data region.",{"type":17,"tag":29,"props":282229,"children":282230},{},[282231,282233,282240],{"type":23,"value":282232},"Then proceed to the workspace settings and choose ",{"type":17,"tag":133,"props":282234,"children":282237},{"href":282235,"rel":282236},"https://app.unified.to/settings/saml",[214],[282238],{"type":23,"value":282239},"SAML",{"type":23,"value":54},{"type":17,"tag":29,"props":282242,"children":282243},{},[282244],{"type":23,"value":282245},"Select your Identity Provider. Either upload the SAML manifest XML file or input the SAML configuration settings from your identity provider.",{"type":17,"tag":29,"props":282247,"children":282248},{},[282249],{"type":23,"value":282250},"You can choose  to restrict sign-ins to just SAML for your workspace. All existing and invited workspace members will then need to sign-in with SAML.",{"title":7,"searchDepth":1629,"depth":1629,"links":282252},[282253,282254],{"id":281521,"depth":1629,"text":281527},{"id":281946,"depth":1629,"text":281952,"children":282255},[282256,282257,282258],{"id":281963,"depth":1635,"text":281969},{"id":282057,"depth":1635,"text":282063},{"id":282172,"depth":1635,"text":282178},"content:blog:saml_single_sign_on.md","blog/saml_single_sign_on.md","blog/saml_single_sign_on",{"_path":282263,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":282264,"description":282265,"img":282266,"date":282267,"tag":6341,"body":282268,"_type":1677,"_id":282333,"_source":1679,"_file":282334,"_stem":282335,"_extension":1682},"/blog/how_to_add_api_support_for_the_create_activity_in_crelate","How to add API support for the Create Activity in Crelate","First off, you need to set \"Available On\" for Activity Types,","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_add_api_support_for_the_create_activity_in_crelate-icon.png","2025-09-25T00:00:00.000Z",{"type":14,"children":282269,"toc":282331},[282270,282275,282278,282286,282291,282296,282319,282326],{"type":17,"tag":18,"props":282271,"children":282273},{"id":282272},"how-to-add-api-support-for-the-create-activity-in-crelate",[282274],{"type":23,"value":282264},{"type":17,"tag":25,"props":282276,"children":282277},{},[],{"type":17,"tag":29,"props":282279,"children":282280},{},[282281],{"type":17,"tag":33,"props":282282,"children":282283},{},[282284],{"type":23,"value":282285},"September 25, 2025",{"type":17,"tag":29,"props":282287,"children":282288},{},[282289],{"type":23,"value":282290},"Here's how to configure Activity Types properly.",{"type":17,"tag":29,"props":282292,"children":282293},{},[282294],{"type":23,"value":282295},"First off, you need to set \"Available On\" for Activity Types:",{"type":17,"tag":6154,"props":282297,"children":282298},{},[282299,282304,282309,282314],{"type":17,"tag":84,"props":282300,"children":282301},{},[282302],{"type":23,"value":282303},"Navigate to Settings → Activities",{"type":17,"tag":84,"props":282305,"children":282306},{},[282307],{"type":23,"value":282308},"Select the specific Activity Type you want to configure",{"type":17,"tag":84,"props":282310,"children":282311},{},[282312],{"type":23,"value":282313},"Find the Available On section - this determines which record types the Activity will appear on",{"type":17,"tag":84,"props":282315,"children":282316},{},[282317],{"type":23,"value":282318},"Critical: By default, Activity Types are set to no records and must be configured or they'll be unavailable for use",{"type":17,"tag":29,"props":282320,"children":282321},{},[282322],{"type":17,"tag":6438,"props":282323,"children":282325},{"alt":6440,"src":282324},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_add_api_support_for_the_create_activity_in_crelate-0.png",[],{"type":17,"tag":29,"props":282327,"children":282328},{},[282329],{"type":23,"value":282330},"The settings shown in the image above will enable the maximum number of API features.",{"title":7,"searchDepth":1629,"depth":1629,"links":282332},[],"content:blog:how_to_add_api_support_for_the_create_activity_in_crelate.md","blog/how_to_add_api_support_for_the_create_activity_in_crelate.md","blog/how_to_add_api_support_for_the_create_activity_in_crelate",{"_path":282337,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":282338,"description":282339,"img":282340,"date":282341,"tag":12,"body":282342,"_type":1677,"_id":283302,"_source":1679,"_file":283303,"_stem":283304,"_extension":1682},"/blog/ats_unified_apis_what_to_look_for_use_cases_and_options","ATS Unified APIs: What to Look For, Use Cases, and Options","Hiring workflows live across dozens of tools—ATS platforms, assessment systems, sourcing extensions, calendars, and job boards. Building one-off ATS...","https://s3.us-east-2.amazonaws.com/unified-article-images/ats_unified_apis_what_to_look_for_use_cases_and_options-icon.png","2025-09-24T00:00:00.000Z",{"type":14,"children":282343,"toc":283294},[282344,282349,282352,282360,282368,282389,282404,282410,282415,282470,282475,282481,282486,282612,282618,282671,282677,282682,283147,283159,283164,283187,283255,283270],{"type":17,"tag":18,"props":282345,"children":282347},{"id":282346},"ats-unified-apis-what-to-look-for-use-cases-and-options",[282348],{"type":23,"value":282338},{"type":17,"tag":25,"props":282350,"children":282351},{},[],{"type":17,"tag":29,"props":282353,"children":282354},{},[282355],{"type":17,"tag":33,"props":282356,"children":282357},{},[282358],{"type":23,"value":282359},"September 24, 2025",{"type":17,"tag":29,"props":282361,"children":282362},{},[282363],{"type":17,"tag":6438,"props":282364,"children":282367},{"alt":282365,"src":282366},"api_categories_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/ats_unified_apis_what_to_look_for_use_cases_and_options-0.png",[],{"type":17,"tag":29,"props":282369,"children":282370},{},[282371,282373,282377,282378,282382,282383,282387],{"type":23,"value":282372},"Hiring workflows live across dozens of tools—ATS platforms, assessment systems, sourcing extensions, calendars, and job boards. Building one-off ATS integrations for each vendor is slow and brittle. Auth flows, ",{"type":17,"tag":133,"props":282374,"children":282375},{"href":4999},[282376],{"type":23,"value":5002},{"type":23,"value":11826},{"type":17,"tag":133,"props":282379,"children":282380},{"href":1857},[282381],{"type":23,"value":1860},{"type":23,"value":11826},{"type":17,"tag":133,"props":282384,"children":282385},{"href":135},[282386],{"type":23,"value":138},{"type":23,"value":282388},", and object shapes all differ, and your team ends up maintaining the same plumbing repeatedly.",{"type":17,"tag":29,"props":282390,"children":282391},{},[282392,282393,282402],{"type":23,"value":40437},{"type":17,"tag":133,"props":282394,"children":282396},{"href":56812,"rel":282395},[214],[282397],{"type":17,"tag":48,"props":282398,"children":282399},{},[282400],{"type":23,"value":282401},"ATS Unified API",{"type":23,"value":282403}," fixes that. Instead of writing one integration per provider, you connect once to a normalized API that abstracts key differences. Candidates, applications, jobs, interviews, and activities are available through a single surface—ready for analytics, workflows, and AI copilots.",{"type":17,"tag":68,"props":282405,"children":282407},{"id":282406},"what-is-an-ats-unified-api",[282408],{"type":23,"value":282409},"What is an ATS Unified API?",{"type":17,"tag":29,"props":282411,"children":282412},{},[282413],{"type":23,"value":282414},"An ATS unified API is a translation layer between your app and multiple applicant tracking systems—e.g., Greenhouse, Lever, Workable, iCIMS, Ashby, Bullhorn, SmartRecruiters, and many more. With one schema and one auth flow, you can read and write standard objects and still access raw payloads when you need provider-specific fields.",{"type":17,"tag":80,"props":282416,"children":282417},{},[282418,282428],{"type":17,"tag":84,"props":282419,"children":282420},{},[282421,282426],{"type":17,"tag":48,"props":282422,"children":282423},{},[282424],{"type":23,"value":282425},"Direct integration",{"type":23,"value":282427},": bespoke builds per vendor—unique auth, pagination, rate limits, and webhooks to implement and maintain.",{"type":17,"tag":84,"props":282429,"children":282430},{},[282431,282436,282438,282443,282444,282449,282450,282455,282456,282461,282462,282468],{"type":17,"tag":48,"props":282432,"children":282433},{},[282434],{"type":23,"value":282435},"Unified approach",{"type":23,"value":282437},": normalizes ",{"type":17,"tag":6121,"props":282439,"children":282441},{"className":282440},[],[282442],{"type":23,"value":117137},{"type":23,"value":11826},{"type":17,"tag":6121,"props":282445,"children":282447},{"className":282446},[],[282448],{"type":23,"value":117242},{"type":23,"value":11826},{"type":17,"tag":6121,"props":282451,"children":282453},{"className":282452},[],[282454],{"type":23,"value":240137},{"type":23,"value":11826},{"type":17,"tag":6121,"props":282457,"children":282459},{"className":282458},[],[282460],{"type":23,"value":117386},{"type":23,"value":12561},{"type":17,"tag":6121,"props":282463,"children":282465},{"className":282464},[],[282466],{"type":23,"value":282467},"Activity/Note",{"type":23,"value":282469}," while preserving raw passthrough for edge cases.",{"type":17,"tag":29,"props":282471,"children":282472},{},[282473],{"type":23,"value":282474},"Result: faster launches, less integration debt, and consistent access patterns across platforms. And if you're powering AI features, a real-time unified API plus MCP (Model Context Protocol) lets your agent fetch and act on ATS data securely—no glue code.",{"type":17,"tag":68,"props":282476,"children":282478},{"id":282477},"what-to-look-for-in-an-ats-unified-api",[282479],{"type":23,"value":282480},"What to Look For in an ATS Unified API",{"type":17,"tag":29,"props":282482,"children":282483},{},[282484],{"type":23,"value":282485},"When you evaluate providers, look under the hood—not just at a logo grid.",{"type":17,"tag":80,"props":282487,"children":282488},{},[282489,282499,282539,282549,282565,282574,282584,282593,282602],{"type":17,"tag":84,"props":282490,"children":282491},{},[282492,282497],{"type":17,"tag":48,"props":282493,"children":282494},{},[282495],{"type":23,"value":282496},"Coverage depth",{"type":23,"value":282498}," — Leading ATS vendors (Greenhouse, Lever, Workable, SmartRecruiters, iCIMS, Bullhorn, Teamtailor, JazzHR, Jobvite, etc.) plus adjacent HR/CRM systems your workflows touch.",{"type":17,"tag":84,"props":282500,"children":282501},{},[282502,282506,282508,282513,282514,282519,282520,282525,282526,282531,282532,282537],{"type":17,"tag":48,"props":282503,"children":282504},{},[282505],{"type":23,"value":69153},{"type":23,"value":282507}," — Clean, consistent objects for ",{"type":17,"tag":6121,"props":282509,"children":282511},{"className":282510},[],[282512],{"type":23,"value":117137},{"type":23,"value":11826},{"type":17,"tag":6121,"props":282515,"children":282517},{"className":282516},[],[282518],{"type":23,"value":117242},{"type":23,"value":11826},{"type":17,"tag":6121,"props":282521,"children":282523},{"className":282522},[],[282524],{"type":23,"value":240137},{"type":23,"value":11826},{"type":17,"tag":6121,"props":282527,"children":282529},{"className":282528},[],[282530],{"type":23,"value":117386},{"type":23,"value":12561},{"type":17,"tag":6121,"props":282533,"children":282535},{"className":282534},[],[282536],{"type":23,"value":282467},{"type":23,"value":282538},"; support for attachments/documents and scorecards; normalized relationships.",{"type":17,"tag":84,"props":282540,"children":282541},{},[282542,282547],{"type":17,"tag":48,"props":282543,"children":282544},{},[282545],{"type":23,"value":282546},"Custom fields & raw passthrough",{"type":23,"value":282548}," — Read/write for custom fields and custom objects via a metadata API; escape hatches for vendor-specific endpoints.",{"type":17,"tag":84,"props":282550,"children":282551},{},[282552,282557,282559,282563],{"type":17,"tag":48,"props":282553,"children":282554},{},[282555],{"type":23,"value":282556},"Real-time delivery",{"type":23,"value":282558}," — Native webhooks when the ATS supports them; ",{"type":17,"tag":48,"props":282560,"children":282561},{},[282562],{"type":23,"value":46572},{"type":23,"value":282564}," (provider-managed polling, change detection, retries) when it doesn't—so your app always receives events consistently.",{"type":17,"tag":84,"props":282566,"children":282567},{},[282568,282572],{"type":17,"tag":48,"props":282569,"children":282570},{},[282571],{"type":23,"value":17067},{"type":23,"value":282573}," — No caching of customer data; passthrough requests fetch live data directly from the source to avoid stale results and reduce compliance scope.",{"type":17,"tag":84,"props":282575,"children":282576},{},[282577,282582],{"type":17,"tag":48,"props":282578,"children":282579},{},[282580],{"type":23,"value":282581},"Security & compliance",{"type":23,"value":282583}," — SOC 2 Type II, GDPR/CCPA, optional storage of credentials in your own cloud KMS/AWS Secrets Manager, IP allow-listing, and externalized logs.",{"type":17,"tag":84,"props":282585,"children":282586},{},[282587,282591],{"type":17,"tag":48,"props":282588,"children":282589},{},[282590],{"type":23,"value":267529},{"type":23,"value":282592}," — SDKs in major languages, embedded auth components, sandbox data, logging/observability, and a true 'build once per category' model.",{"type":17,"tag":84,"props":282594,"children":282595},{},[282596,282600],{"type":17,"tag":48,"props":282597,"children":282598},{},[282599],{"type":23,"value":98996},{"type":23,"value":282601}," — Usage-based pricing that scales predictably (not per connection or per customer), with transparent overage rates.",{"type":17,"tag":84,"props":282603,"children":282604},{},[282605,282610],{"type":17,"tag":48,"props":282606,"children":282607},{},[282608],{"type":23,"value":282609},"AI-readiness",{"type":23,"value":282611}," — Built-in MCP so ATS data and actions are callable as LLM tools with permissioned, real-time execution—no prompt hacks or custom bridges.",{"type":17,"tag":68,"props":282613,"children":282615},{"id":282614},"use-cases-for-ats-unified-apis",[282616],{"type":23,"value":282617},"Use Cases for ATS Unified APIs",{"type":17,"tag":6154,"props":282619,"children":282620},{},[282621,282631,282641,282651,282661],{"type":17,"tag":84,"props":282622,"children":282623},{},[282624,282629],{"type":17,"tag":48,"props":282625,"children":282626},{},[282627],{"type":23,"value":282628},"Source Candidates",{"type":23,"value":282630}," – Enrich and stage sourced prospects; create candidates/applications in the ATS and sync updates back. (e.g., Greenhouse, Lever, Workable)",{"type":17,"tag":84,"props":282632,"children":282633},{},[282634,282639],{"type":17,"tag":48,"props":282635,"children":282636},{},[282637],{"type":23,"value":282638},"Assess Candidates",{"type":23,"value":282640}," – Trigger assessments, store results as notes/scorecards, update application stages programmatically.",{"type":17,"tag":84,"props":282642,"children":282643},{},[282644,282649],{"type":17,"tag":48,"props":282645,"children":282646},{},[282647],{"type":23,"value":282648},"Promote Jobs",{"type":23,"value":282650}," – Post to multiple job boards via supported ATS endpoints; keep postings/statuses in sync where supported by the ATS or via adjacent job board connectors.",{"type":17,"tag":84,"props":282652,"children":282653},{},[282654,282659],{"type":17,"tag":48,"props":282655,"children":282656},{},[282657],{"type":23,"value":282658},"Track Applications",{"type":23,"value":282660}," – Subscribe to stage changes and interview events; maintain real-time pipelines, SLAs, and SLA breach notifications.",{"type":17,"tag":84,"props":282662,"children":282663},{},[282664,282669],{"type":17,"tag":48,"props":282665,"children":282666},{},[282667],{"type":23,"value":282668},"Agentic workflows",{"type":23,"value":282670}," – Use MCP to let a copilot schedule interviews, add notes, or move stages—securely and auditable—without custom glue.",{"type":17,"tag":68,"props":282672,"children":282674},{"id":282673},"ats-unified-api-options-in-the-market",[282675],{"type":23,"value":282676},"ATS Unified API Options in the Market",{"type":17,"tag":29,"props":282678,"children":282679},{},[282680],{"type":23,"value":282681},"Not all 'unified APIs' behave the same. Some are sync-first (great for BI), others are real-time (better for agents and live product flows). Use this chart to evaluate coverage, schema fidelity, webhook model, storage, and pricing—then map each to your workload.",{"type":17,"tag":7231,"props":282683,"children":282684},{},[282685,282741],{"type":17,"tag":7235,"props":282686,"children":282687},{},[282688],{"type":17,"tag":7239,"props":282689,"children":282690},{},[282691,282698,282705,282712,282719,282726,282733],{"type":17,"tag":7243,"props":282692,"children":282693},{},[282694],{"type":17,"tag":48,"props":282695,"children":282696},{},[282697],{"type":23,"value":87518},{"type":17,"tag":7243,"props":282699,"children":282700},{},[282701],{"type":17,"tag":48,"props":282702,"children":282703},{},[282704],{"type":23,"value":217},{"type":17,"tag":7243,"props":282706,"children":282707},{},[282708],{"type":17,"tag":48,"props":282709,"children":282710},{},[282711],{"type":23,"value":7968},{"type":17,"tag":7243,"props":282713,"children":282714},{},[282715],{"type":17,"tag":48,"props":282716,"children":282717},{},[282718],{"type":23,"value":237},{"type":17,"tag":7243,"props":282720,"children":282721},{},[282722],{"type":17,"tag":48,"props":282723,"children":282724},{},[282725],{"type":23,"value":7978},{"type":17,"tag":7243,"props":282727,"children":282728},{},[282729],{"type":17,"tag":48,"props":282730,"children":282731},{},[282732],{"type":23,"value":8037},{"type":17,"tag":7243,"props":282734,"children":282735},{},[282736],{"type":17,"tag":48,"props":282737,"children":282738},{},[282739],{"type":23,"value":282740},"Knit",{"type":17,"tag":7259,"props":282742,"children":282743},{},[282744,282783,282824,282865,282911,282960,283001,283060,283101],{"type":17,"tag":7239,"props":282745,"children":282746},{},[282747,282754,282759,282764,282769,282774,282779],{"type":17,"tag":7266,"props":282748,"children":282749},{},[282750],{"type":17,"tag":48,"props":282751,"children":282752},{},[282753],{"type":23,"value":42944},{"type":17,"tag":7266,"props":282755,"children":282756},{},[282757],{"type":23,"value":282758},"63+ ATS Integrations (Greenhouse, Lever, Workable, SmartRecruiters, iCIMS, Bullhorn, Teamtailor, Jobvite) + adjacent HR/CRM/Calendar/Storage",{"type":17,"tag":7266,"props":282760,"children":282761},{},[282762],{"type":23,"value":282763},"60+ ATS integrations",{"type":17,"tag":7266,"props":282765,"children":282766},{},[282767],{"type":23,"value":282768},"10 ATS integrations",{"type":17,"tag":7266,"props":282770,"children":282771},{},[282772],{"type":23,"value":282773},"71 ATS integrations",{"type":17,"tag":7266,"props":282775,"children":282776},{},[282777],{"type":23,"value":282778},"22 ATS integrations",{"type":17,"tag":7266,"props":282780,"children":282781},{},[282782],{"type":23,"value":282778},{"type":17,"tag":7239,"props":282784,"children":282785},{},[282786,282794,282799,282804,282809,282814,282819],{"type":17,"tag":7266,"props":282787,"children":282788},{},[282789],{"type":17,"tag":48,"props":282790,"children":282791},{},[282792],{"type":23,"value":282793},"Data Model & Normalization",{"type":17,"tag":7266,"props":282795,"children":282796},{},[282797],{"type":23,"value":282798},"Clean normalized objects for Candidate, Application, Job, Interview, Activity/Note; attachments & scorecards; raw passthrough",{"type":17,"tag":7266,"props":282800,"children":282801},{},[282802],{"type":23,"value":282803},"Unified models; supplemental fields; per-provider quirks mapped",{"type":17,"tag":7266,"props":282805,"children":282806},{},[282807],{"type":23,"value":282808},"Unified models; field-level mapping & extensions",{"type":17,"tag":7266,"props":282810,"children":282811},{},[282812],{"type":23,"value":282813},"Unified models; custom fields; metadata endpoints",{"type":17,"tag":7266,"props":282815,"children":282816},{},[282817],{"type":23,"value":282818},"Unified models; 'build your own'/extendable",{"type":17,"tag":7266,"props":282820,"children":282821},{},[282822],{"type":23,"value":282823},"Unified models; normalized Candidate/Application/Job/Interview entities; emphasis on real-time reads.",{"type":17,"tag":7239,"props":282825,"children":282826},{},[282827,282835,282840,282845,282850,282855,282860],{"type":17,"tag":7266,"props":282828,"children":282829},{},[282830],{"type":17,"tag":48,"props":282831,"children":282832},{},[282833],{"type":23,"value":282834},"Real-Time Delivery",{"type":17,"tag":7266,"props":282836,"children":282837},{},[282838],{"type":23,"value":282839},"Native webhooks; Virtual Webhooks when absent; real-time pass-through by design",{"type":17,"tag":7266,"props":282841,"children":282842},{},[282843],{"type":23,"value":282844},"Webhooks + scheduled sync engine; 'near real-time' after sync",{"type":17,"tag":7266,"props":282846,"children":282847},{},[282848],{"type":23,"value":282849},"Native + virtual webhooks (provider-managed polling)",{"type":17,"tag":7266,"props":282851,"children":282852},{},[282853],{"type":23,"value":282854},"Sync-first; 3-hour default polling + webhooks",{"type":17,"tag":7266,"props":282856,"children":282857},{},[282858],{"type":23,"value":282859},"Real-time where supported; polling fallback; configurable",{"type":17,"tag":7266,"props":282861,"children":282862},{},[282863],{"type":23,"value":282864},"Webhooks-first change detection; supports scheduled syncs with plan-based frequency controls.",{"type":17,"tag":7239,"props":282866,"children":282867},{},[282868,282876,282886,282891,282896,282901,282906],{"type":17,"tag":7266,"props":282869,"children":282870},{},[282871],{"type":17,"tag":48,"props":282872,"children":282873},{},[282874],{"type":23,"value":282875},"Security & Compliance",{"type":17,"tag":7266,"props":282877,"children":282878},{},[282879,282884],{"type":17,"tag":48,"props":282880,"children":282881},{},[282882],{"type":23,"value":282883},"Zero-storage",{"type":23,"value":282885}," (no customer data cached); SOC 2 Type II; GDPR/CCPA; IP allow-listing",{"type":17,"tag":7266,"props":282887,"children":282888},{},[282889],{"type":23,"value":282890},"Sync & store model; SOC 2 Type II, ISO 27001, HIPAA, GDPR/CCPA",{"type":17,"tag":7266,"props":282892,"children":282893},{},[282894],{"type":23,"value":282895},"Managed platform with Vault; SOC 2 Type 2 and GDPR-ready; virtual webhooks provide Apideck-managed polling so you don't run sync jobs.",{"type":17,"tag":7266,"props":282897,"children":282898},{},[282899],{"type":23,"value":282900},"Sync & store model (data in Kombo DB); confirm SOC 2/ISO/GDPR with sales",{"type":17,"tag":7266,"props":282902,"children":282903},{},[282904],{"type":23,"value":282905},"Hosted unified API with clone/customize patterns; compliance details not publicly listed—confirm SOC2/GDPR/ISO during security review",{"type":17,"tag":7266,"props":282907,"children":282908},{},[282909],{"type":23,"value":282910},"No end-user data stored (passthrough); TLS 1.3 in transit, AES-256 at rest; SOC 2 / ISO 27001 / GDPR.",{"type":17,"tag":7239,"props":282912,"children":282913},{},[282914,282922,282927,282940,282945,282950,282955],{"type":17,"tag":7266,"props":282915,"children":282916},{},[282917],{"type":17,"tag":48,"props":282918,"children":282919},{},[282920],{"type":23,"value":282921},"Credential Management",{"type":17,"tag":7266,"props":282923,"children":282924},{},[282925],{"type":23,"value":282926},"Embedded Authorization; BYO KMS/Secrets Manager option; scoped tokens",{"type":17,"tag":7266,"props":282928,"children":282929},{},[282930,282932,282938],{"type":23,"value":282931},"Merge Link; store ",{"type":17,"tag":6121,"props":282933,"children":282935},{"className":282934},[],[282936],{"type":23,"value":282937},"account_token",{"type":23,"value":282939}," per Linked Account.",{"type":17,"tag":7266,"props":282941,"children":282942},{},[282943],{"type":23,"value":282944},"Apideck Vault for OAuth/keys; token lifecycle handled",{"type":17,"tag":7266,"props":282946,"children":282947},{},[282948],{"type":23,"value":282949},"Kombo Connect embedded flow; per-connector OAuth app + activation token; API keys managed in Secrets",{"type":17,"tag":7266,"props":282951,"children":282952},{},[282953],{"type":23,"value":282954},"Embedded auth; per-connector configuration",{"type":17,"tag":7266,"props":282956,"children":282957},{},[282958],{"type":23,"value":282959},"Integration-specific auth flows; white-label auth; enterprise option to use your own secrets store.",{"type":17,"tag":7239,"props":282961,"children":282962},{},[282963,282971,282976,282981,282986,282991,282996],{"type":17,"tag":7266,"props":282964,"children":282965},{},[282966],{"type":17,"tag":48,"props":282967,"children":282968},{},[282969],{"type":23,"value":282970},"Developer Experience",{"type":17,"tag":7266,"props":282972,"children":282973},{},[282974],{"type":23,"value":282975},"7+ SDKs; sandboxes; logs/observability; embedded auth & SSO; MCP server available",{"type":17,"tag":7266,"props":282977,"children":282978},{},[282979],{"type":23,"value":282980},"SDKs; Link flow; sync diagnostics; extensive docs",{"type":17,"tag":7266,"props":282982,"children":282983},{},[282984],{"type":23,"value":282985},"SDKs; Vault UI; API Explorer; webhooks guides",{"type":17,"tag":7266,"props":282987,"children":282988},{},[282989],{"type":23,"value":282990},"Clear HR/ATS docs; polling + webhooks examples",{"type":17,"tag":7266,"props":282992,"children":282993},{},[282994],{"type":23,"value":282995},"'Clone & customize' integrations; strong docs",{"type":17,"tag":7266,"props":282997,"children":282998},{},[282999],{"type":23,"value":283000},"Clear 'Unified API' product pages; quickstart guides; category breadth.",{"type":17,"tag":7239,"props":283002,"children":283003},{},[283004,283012,283017,283022,283032,283037,283049],{"type":17,"tag":7266,"props":283005,"children":283006},{},[283007],{"type":17,"tag":48,"props":283008,"children":283009},{},[283010],{"type":23,"value":283011},"Pricing Model",{"type":17,"tag":7266,"props":283013,"children":283014},{},[283015],{"type":23,"value":283016},"Pricing starts at $750+/mo Grow (750k monthly API calls, unlimited customers/connections). Scale $3,000+ adds 6M calls, 365-day logs.",{"type":17,"tag":7266,"props":283018,"children":283019},{},[283020],{"type":23,"value":283021},"$650/mo up to 10 production linked accounts; +$65/account. Beyond self-serve: contract-based annual plans.",{"type":17,"tag":7266,"props":283023,"children":283024},{},[283025,283027],{"type":23,"value":283026},"Pricing starts at $269/mo Launch ",{"type":17,"tag":33,"props":283028,"children":283029},{},[283030],{"type":23,"value":283031},"(~10k API calls/month, 1 Unified API",{"type":17,"tag":7266,"props":283033,"children":283034},{},[283035],{"type":23,"value":283036},"Public pricing not listed",{"type":17,"tag":7266,"props":283038,"children":283039},{},[283040,283042,283047],{"type":23,"value":283041},"Pricing starts at $499/mo Foundation ",{"type":17,"tag":33,"props":283043,"children":283044},{},[283045],{"type":23,"value":283046},"(~50k API calls, 100 connections)",{"type":23,"value":283048},"; Services tiers (Expansion/Enterprise) contract-based.",{"type":17,"tag":7266,"props":283050,"children":283051},{},[283052,283054,283059],{"type":23,"value":283053},"Pricing starts at $399/mo Start Up ",{"type":17,"tag":33,"props":283055,"children":283056},{},[283057],{"type":23,"value":283058},"(up to 10 connected accounts, 25k API calls FUP, 24-h sync)",{"type":23,"value":54},{"type":17,"tag":7239,"props":283061,"children":283062},{},[283063,283071,283076,283081,283086,283091,283096],{"type":17,"tag":7266,"props":283064,"children":283065},{},[283066],{"type":17,"tag":48,"props":283067,"children":283068},{},[283069],{"type":23,"value":283070},"Ideal Use Cases",{"type":17,"tag":7266,"props":283072,"children":283073},{},[283074],{"type":23,"value":283075},"AI copilots/agents, live pipelines, event-driven workflows; SaaS teams needing real-time + zero-storage",{"type":17,"tag":7266,"props":283077,"children":283078},{},[283079],{"type":23,"value":283080},"Historical sync, reporting, BI pipelines across many customers",{"type":17,"tag":7266,"props":283082,"children":283083},{},[283084],{"type":23,"value":283085},"Broad multi-category integration marketplace; product teams wanting SDK + Vault",{"type":17,"tag":7266,"props":283087,"children":283088},{},[283089],{"type":23,"value":283090},"HR/ATS/payroll products consolidating data with scheduled sync",{"type":17,"tag":7266,"props":283092,"children":283093},{},[283094],{"type":23,"value":283095},"Teams wanting customizable unified endpoints + quick cloning",{"type":17,"tag":7266,"props":283097,"children":283098},{},[283099],{"type":23,"value":283100},"Security-sensitive teams preferring no data storage + webhooks, with the option to tune sync when needed",{"type":17,"tag":7239,"props":283102,"children":283103},{},[283104,283112,283122,283127,283132,283137,283142],{"type":17,"tag":7266,"props":283105,"children":283106},{},[283107],{"type":17,"tag":48,"props":283108,"children":283109},{},[283110],{"type":23,"value":283111},"Differentiators",{"type":17,"tag":7266,"props":283113,"children":283114},{},[283115,283120],{"type":17,"tag":48,"props":283116,"children":283117},{},[283118],{"type":23,"value":283119},"Real-time, zero-storage unified API + hosted MCP",{"type":23,"value":283121}," for AI copilots—enterprise controls (SOC 2-II, BYO KMS, IP allow-listing) and usage-based pricing.",{"type":17,"tag":7266,"props":283123,"children":283124},{},[283125],{"type":23,"value":283126},"Mature sync engine; wide ATS list; observability around data syncs",{"type":17,"tag":7266,"props":283128,"children":283129},{},[283130],{"type":23,"value":283131},"Vault + virtual webhooks; large category breadth",{"type":17,"tag":7266,"props":283133,"children":283134},{},[283135],{"type":23,"value":283136},"HR/ATS depth; straightforward polling cadence",{"type":17,"tag":7266,"props":283138,"children":283139},{},[283140],{"type":23,"value":283141},"Flexible ‘build your own' unified endpoints; configurable sync + webhook patterns",{"type":17,"tag":7266,"props":283143,"children":283144},{},[283145],{"type":23,"value":283146},"No data storage; webhook-native change detection; simple mental model",{"type":17,"tag":68,"props":283148,"children":283150},{"id":283149},"why-unifiedto-leads-in-the-ats-category",[283151,283153,283157],{"type":23,"value":283152},"Why ",{"type":17,"tag":48,"props":283154,"children":283155},{},[283156],{"type":23,"value":217},{"type":23,"value":283158}," Leads in the ATS Category",{"type":17,"tag":29,"props":283160,"children":283161},{},[283162],{"type":23,"value":283163},"Most unified API platforms started with payroll or CRM. Recruiting has more edge cases: custom stages, job board variance, assessment add-ons, attachment handling, and noisy webhooks.",{"type":17,"tag":29,"props":283165,"children":283166},{},[283167,283169,283173,283174,283178,283180,283185],{"type":23,"value":283168},"We built our stack specifically for ",{"type":17,"tag":48,"props":283170,"children":283171},{},[283172],{"type":23,"value":70016},{"type":23,"value":11826},{"type":17,"tag":48,"props":283175,"children":283176},{},[283177],{"type":23,"value":94106},{"type":23,"value":283179}," delivery that's ",{"type":17,"tag":48,"props":283181,"children":283182},{},[283183],{"type":23,"value":283184},"AI-ready",{"type":23,"value":283186}," out of the box.",{"type":17,"tag":80,"props":283188,"children":283189},{},[283190,283200,283216,283226,283236,283245],{"type":17,"tag":84,"props":283191,"children":283192},{},[283193,283198],{"type":17,"tag":48,"props":283194,"children":283195},{},[283196],{"type":23,"value":283197},"Broad ATS coverage + adjacent systems",{"type":23,"value":283199}," — Over 60 ATS connectors (Greenhouse, Lever, Workable, SmartRecruiters, iCIMS, Bullhorn, Teamtailor, JazzHR, Jobvite, and more) with unified models, plus HR, CRM, file storage, calendars, and messaging to support end-to-end workflows.",{"type":17,"tag":84,"props":283201,"children":283202},{},[283203,283208,283210,283214],{"type":17,"tag":48,"props":283204,"children":283205},{},[283206],{"type":23,"value":283207},"Real-time model",{"type":23,"value":283209}," — Native webhooks when available and ",{"type":17,"tag":48,"props":283211,"children":283212},{},[283213],{"type":23,"value":9010},{"type":23,"value":283215}," when not—so your product consumes a single, reliable event interface without writing polling code.",{"type":17,"tag":84,"props":283217,"children":283218},{},[283219,283224],{"type":17,"tag":48,"props":283220,"children":283221},{},[283222],{"type":23,"value":283223},"Security by design (no data stored)",{"type":23,"value":283225}," — We never cache or store your customers' ATS data; every call fetches from the source. SOC 2 Type II, GDPR/CCPA, credential storage in your AWS Secrets Manager, log streaming to your Datadog, and IP allow-listing.",{"type":17,"tag":84,"props":283227,"children":283228},{},[283229,283234],{"type":17,"tag":48,"props":283230,"children":283231},{},[283232],{"type":23,"value":283233},"AI-native with MCP",{"type":23,"value":283235}," — Expose real-time, permissioned ATS tools to LLMs (Claude, GPT, Gemini) so your copilot can take action—update stages, leave notes, schedule interviews—safely and deterministically.",{"type":17,"tag":84,"props":283237,"children":283238},{},[283239,283243],{"type":17,"tag":48,"props":283240,"children":283241},{},[283242],{"type":23,"value":69250},{"type":23,"value":283244}," — 7+ SDKs, embedded auth/SSO components, sandbox & observability, and a consistent schema across categories—so you can launch multiple integrations in days, not quarters.",{"type":17,"tag":84,"props":283246,"children":283247},{},[283248,283253],{"type":17,"tag":48,"props":283249,"children":283250},{},[283251],{"type":23,"value":283252},"Transparent, usage-based pricing",{"type":23,"value":283254}," — Start free for 30 days; predictable unit economics as you scale (no per-connection lock-in).",{"type":17,"tag":29,"props":283256,"children":283257},{},[283258,283260,283268],{"type":23,"value":283259},"Integrating with ATSs shouldn't block your roadmap—or your AI strategy. With ",{"type":17,"tag":133,"props":283261,"children":283263},{"href":212,"rel":283262},[214],[283264],{"type":17,"tag":48,"props":283265,"children":283266},{},[283267],{"type":23,"value":217},{"type":23,"value":283269},", you integrate once and unlock ATS coverage that's real-time, secure, and AI-ready.",{"type":17,"tag":29,"props":283271,"children":283272},{},[283273,283275,283284,283285,283293],{"type":23,"value":283274},"If your roadmap includes sourcing, assessments, analytics, or agentic recruiting features, ",{"type":17,"tag":133,"props":283276,"children":283278},{"href":1612,"rel":283277},[214],[283279],{"type":17,"tag":48,"props":283280,"children":283281},{},[283282],{"type":23,"value":283283},"start your free 30-day trial",{"type":23,"value":75890},{"type":17,"tag":133,"props":283286,"children":283288},{"href":1623,"rel":283287},[214],[283289],{"type":17,"tag":48,"props":283290,"children":283291},{},[283292],{"type":23,"value":226481},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":283295},[283296,283297,283298,283299,283300],{"id":282406,"depth":1629,"text":282409},{"id":282477,"depth":1629,"text":282480},{"id":282614,"depth":1629,"text":282617},{"id":282673,"depth":1629,"text":282676},{"id":283149,"depth":1629,"text":283301},"Why Unified.to Leads in the ATS Category","content:blog:ats_unified_apis_what_to_look_for_use_cases_and_options.md","blog/ats_unified_apis_what_to_look_for_use_cases_and_options.md","blog/ats_unified_apis_what_to_look_for_use_cases_and_options",{"_path":283306,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":283307,"description":283308,"img":283309,"date":282341,"tag":12,"body":283310,"_type":1677,"_id":284038,"_source":1679,"_file":284039,"_stem":284040,"_extension":1682},"/blog/marketing_unified_apis_what_to_look_for_use_cases_and_options","Marketing Unified APIs: What to Look For, Use Cases, and Options","Running lifecycle marketing across tools like Mailchimp, Customer.io, Klaviyo, and Salesforce Marketing Cloud gets messy fast. Every platform has different...","https://s3.us-east-2.amazonaws.com/unified-article-images/marketing_unified_apis_what_to_look_for_use_cases_and_options-icon.png",{"type":14,"children":283311,"toc":284030},[283312,283317,283320,283327,283338,283354,283360,283371,283417,283422,283428,283528,283534,283587,283596,283601,283892,283904,283916,283947,283952,283999],{"type":17,"tag":18,"props":283313,"children":283315},{"id":283314},"marketing-unified-apis-what-to-look-for-use-cases-and-options",[283316],{"type":23,"value":283307},{"type":17,"tag":25,"props":283318,"children":283319},{},[],{"type":17,"tag":29,"props":283321,"children":283322},{},[283323],{"type":17,"tag":33,"props":283324,"children":283325},{},[283326],{"type":23,"value":282359},{"type":17,"tag":29,"props":283328,"children":283329},{},[283330,283332,283336],{"type":23,"value":283331},"Running lifecycle marketing across tools like Mailchimp, Customer.io, Klaviyo, and Salesforce Marketing Cloud gets messy fast. Every platform has different objects, auth, and ",{"type":17,"tag":133,"props":283333,"children":283334},{"href":4999},[283335],{"type":23,"value":5002},{"type":23,"value":283337},"—so your product team ends up building (and maintaining) the same plumbing again and again.",{"type":17,"tag":29,"props":283339,"children":283340},{},[283341,283342,283352],{"type":23,"value":9619},{"type":17,"tag":133,"props":283343,"children":283346},{"href":283344,"rel":283345},"https://unified.to/martech",[214],[283347],{"type":17,"tag":48,"props":283348,"children":283349},{},[283350],{"type":23,"value":283351},"Marketing Unified API",{"type":23,"value":283353}," fixes this. Instead of launching one-off connectors, you integrate once to a normalized API that abstracts provider differences. Lists/audiences, members/contacts, campaigns, and events are available through a single surface—ready for analytics, workflows, and AI.",{"type":17,"tag":68,"props":283355,"children":283357},{"id":283356},"what-is-a-marketing-unified-api",[283358],{"type":23,"value":283359},"What is a Marketing Unified API?",{"type":17,"tag":29,"props":283361,"children":283362},{},[283363,283365,283369],{"type":23,"value":283364},"A Marketing ",{"type":17,"tag":133,"props":283366,"children":283367},{"href":7691},[283368],{"type":23,"value":7806},{"type":23,"value":283370}," is a translation layer between your app and multiple marketing automation and email platforms—e.g., Mailchimp, Klaviyo, Customer.io, ActiveCampaign, Instantly.ai, Salesforce Marketing Cloud.",{"type":17,"tag":80,"props":283372,"children":283373},{},[283374,283383],{"type":17,"tag":84,"props":283375,"children":283376},{},[283377,283381],{"type":17,"tag":48,"props":283378,"children":283379},{},[283380],{"type":23,"value":282425},{"type":23,"value":283382},": bespoke builds per vendor; different schemas and webhook behaviors; ongoing maintenance.",{"type":17,"tag":84,"props":283384,"children":283385},{},[283386,283390,283392,283397,283398,283403,283404,283409,283410,283415],{"type":17,"tag":48,"props":283387,"children":283388},{},[283389],{"type":23,"value":282435},{"type":23,"value":283391},": normalizes objects like ",{"type":17,"tag":6121,"props":283393,"children":283395},{"className":283394},[],[283396],{"type":23,"value":145784},{"type":23,"value":11826},{"type":17,"tag":6121,"props":283399,"children":283401},{"className":283400},[],[283402],{"type":23,"value":239985},{"type":23,"value":11826},{"type":17,"tag":6121,"props":283405,"children":283407},{"className":283406},[],[283408],{"type":23,"value":18610},{"type":23,"value":12561},{"type":17,"tag":6121,"props":283411,"children":283413},{"className":283412},[],[283414],{"type":23,"value":14528},{"type":23,"value":283416}," into a consistent model, while exposing raw payloads for provider-specific fields when you need them.",{"type":17,"tag":29,"props":283418,"children":283419},{},[283420],{"type":23,"value":283421},"Result: faster launches, less integration debt, and consistent access patterns across providers.",{"type":17,"tag":68,"props":283423,"children":283425},{"id":283424},"what-to-look-for-in-a-marketing-unified-api",[283426],{"type":23,"value":283427},"What to Look For in a Marketing Unified API",{"type":17,"tag":80,"props":283429,"children":283430},{},[283431,283441,283450,283465,283475,283485,283500,283510,283519],{"type":17,"tag":84,"props":283432,"children":283433},{},[283434,283439],{"type":17,"tag":48,"props":283435,"children":283436},{},[283437],{"type":23,"value":283438},"Integration coverage",{"type":23,"value":283440}," – The platforms your customers ask for now (Mailchimp, Klaviyo, Customer.io, ActiveCampaign, SFMC) and a credible path to the rest.",{"type":17,"tag":84,"props":283442,"children":283443},{},[283444,283448],{"type":17,"tag":48,"props":283445,"children":283446},{},[283447],{"type":23,"value":69153},{"type":23,"value":283449}," – Clean, well-documented objects for lists/segments, members, campaigns, templates, and events (send/open/click/bounce/unsubscribe).",{"type":17,"tag":84,"props":283451,"children":283452},{},[283453,283457,283459,283463],{"type":17,"tag":48,"props":283454,"children":283455},{},[283456],{"type":23,"value":282556},{"type":23,"value":283458}," – Native webhooks where available, plus ",{"type":17,"tag":133,"props":283460,"children":283461},{"href":9007},[283462],{"type":23,"value":46572},{"type":23,"value":283464}," or fast polling for systems that don't push events.",{"type":17,"tag":84,"props":283466,"children":283467},{},[283468,283473],{"type":17,"tag":48,"props":283469,"children":283470},{},[283471],{"type":23,"value":283472},"Read/write",{"type":23,"value":283474}," – Create/update lists and members; trigger campaign actions or automations when supported.",{"type":17,"tag":84,"props":283476,"children":283477},{},[283478,283483],{"type":17,"tag":48,"props":283479,"children":283480},{},[283481],{"type":23,"value":283482},"Raw passthrough",{"type":23,"value":283484}," – Access provider-specific endpoints and fields without leaving the unified auth/session.",{"type":17,"tag":84,"props":283486,"children":283487},{},[283488,283492,283494,283498],{"type":17,"tag":48,"props":283489,"children":283490},{},[283491],{"type":23,"value":253830},{"type":23,"value":283493}," – SOC 2/GDPR; ideally ",{"type":17,"tag":48,"props":283495,"children":283496},{},[283497],{"type":23,"value":94106},{"type":23,"value":283499}," (no cached customer data) to reduce risk and lock-in.",{"type":17,"tag":84,"props":283501,"children":283502},{},[283503,283508],{"type":17,"tag":48,"props":283504,"children":283505},{},[283506],{"type":23,"value":283507},"DX",{"type":23,"value":283509}," – SDKs, sandbox data, webhook reliability, rate-limit handling, and clear failure modes.",{"type":17,"tag":84,"props":283511,"children":283512},{},[283513,283517],{"type":17,"tag":48,"props":283514,"children":283515},{},[283516],{"type":23,"value":98996},{"type":23,"value":283518}," – Transparent usage that scales with requests and connections.",{"type":17,"tag":84,"props":283520,"children":283521},{},[283522,283526],{"type":17,"tag":48,"props":283523,"children":283524},{},[283525],{"type":23,"value":282609},{"type":23,"value":283527}," – Can your agents/copilots consume events and query live data without glue code?",{"type":17,"tag":68,"props":283529,"children":283531},{"id":283530},"use-cases-for-marketing-unified-apis",[283532],{"type":23,"value":283533},"Use Cases for Marketing Unified APIs",{"type":17,"tag":6154,"props":283535,"children":283536},{},[283537,283547,283557,283567,283577],{"type":17,"tag":84,"props":283538,"children":283539},{},[283540,283545],{"type":17,"tag":48,"props":283541,"children":283542},{},[283543],{"type":23,"value":283544},"Analyze Campaigns",{"type":23,"value":283546}," – Aggregate sends, opens, clicks, bounces, complaints across providers into one dashboard.",{"type":17,"tag":84,"props":283548,"children":283549},{},[283550,283555],{"type":17,"tag":48,"props":283551,"children":283552},{},[283553],{"type":23,"value":283554},"Nurture Leads",{"type":23,"value":283556}," – Sync segments and attributes from CRM/CS tools to power multi-step, cross-channel automations.",{"type":17,"tag":84,"props":283558,"children":283559},{},[283560,283565],{"type":17,"tag":48,"props":283561,"children":283562},{},[283563],{"type":23,"value":283564},"Personalize Content",{"type":23,"value":283566}," – Feed real-time user events and traits into AI recommenders for dynamic content.",{"type":17,"tag":84,"props":283568,"children":283569},{},[283570,283575],{"type":17,"tag":48,"props":283571,"children":283572},{},[283573],{"type":23,"value":283574},"Attribution & UTM analytics",{"type":23,"value":283576}," – Standardize link-level engagement and conversions across email tools.",{"type":17,"tag":84,"props":283578,"children":283579},{},[283580,283585],{"type":17,"tag":48,"props":283581,"children":283582},{},[283583],{"type":23,"value":283584},"Compliance & deliverability",{"type":23,"value":283586}," – Centralize suppression lists, bounces, and complaint handling with auditable flows.",{"type":17,"tag":68,"props":283588,"children":283590},{"id":283589},"marketing-unified-api-options-in-the-market",[283591],{"type":17,"tag":48,"props":283592,"children":283593},{},[283594],{"type":23,"value":283595},"Marketing Unified API Options in the Market",{"type":17,"tag":29,"props":283597,"children":283598},{},[283599],{"type":23,"value":283600},"There are a few unified API providers that cover marketing directly. Here's how they compare:",{"type":17,"tag":7231,"props":283602,"children":283603},{},[283604,283640],{"type":17,"tag":7235,"props":283605,"children":283606},{},[283607],{"type":17,"tag":7239,"props":283608,"children":283609},{},[283610,283617,283624,283632],{"type":17,"tag":7243,"props":283611,"children":283612},{},[283613],{"type":17,"tag":48,"props":283614,"children":283615},{},[283616],{"type":23,"value":87518},{"type":17,"tag":7243,"props":283618,"children":283619},{},[283620],{"type":17,"tag":48,"props":283621,"children":283622},{},[283623],{"type":23,"value":217},{"type":17,"tag":7243,"props":283625,"children":283626},{},[283627],{"type":17,"tag":48,"props":283628,"children":283629},{},[283630],{"type":23,"value":283631},"Truto.one",{"type":17,"tag":7243,"props":283633,"children":283634},{},[283635],{"type":17,"tag":48,"props":283636,"children":283637},{},[283638],{"type":23,"value":283639},"Vessel.dev",{"type":17,"tag":7259,"props":283641,"children":283642},{},[283643,283676,283711,283742,283767,283792,283817,283842,283867],{"type":17,"tag":7239,"props":283644,"children":283645},{},[283646,283653,283658,283663],{"type":17,"tag":7266,"props":283647,"children":283648},{},[283649],{"type":17,"tag":48,"props":283650,"children":283651},{},[283652],{"type":23,"value":42944},{"type":17,"tag":7266,"props":283654,"children":283655},{},[283656],{"type":23,"value":283657},"12+ Marketing tools including Mailchimp, Klaviyo, Customer.io, ActiveCampaign, Instantly.ai, Salesforce Marketing Cloud, SendGrid.",{"type":17,"tag":7266,"props":283659,"children":283660},{},[283661],{"type":23,"value":283662},"15 live integrations including Klaviyo, LinkedIn, Google Ads, and GetResponse.",{"type":17,"tag":7266,"props":283664,"children":283665},{},[283666,283668,283674],{"type":23,"value":283667},"3 Marketing tools including ",{"type":17,"tag":133,"props":283669,"children":283672},{"href":283670,"rel":283671},"http://customer.io/",[214],[283673],{"type":23,"value":192294},{"type":23,"value":283675},", Mailchimp, ActiveCampaign",{"type":17,"tag":7239,"props":283677,"children":283678},{},[283679,283686,283701,283706],{"type":17,"tag":7266,"props":283680,"children":283681},{},[283682],{"type":17,"tag":48,"props":283683,"children":283684},{},[283685],{"type":23,"value":282793},{"type":17,"tag":7266,"props":283687,"children":283688},{},[283689,283690,283694,283695,283699],{"type":23,"value":86959},{"type":17,"tag":48,"props":283691,"children":283692},{},[283693],{"type":23,"value":145784},{"type":23,"value":89280},{"type":17,"tag":48,"props":283696,"children":283697},{},[283698],{"type":23,"value":239985},{"type":23,"value":283700}," models; passthrough for raw provider payloads when you need edge features.",{"type":17,"tag":7266,"props":283702,"children":283703},{},[283704],{"type":23,"value":283705},"Common models with custom mapping options; first-class batch/sync pipelines.",{"type":17,"tag":7266,"props":283707,"children":283708},{},[283709],{"type":23,"value":283710},"Unified Users/Contacts/Lists with read/write; handles provider quirks.",{"type":17,"tag":7239,"props":283712,"children":283713},{},[283714,283721,283732,283737],{"type":17,"tag":7266,"props":283715,"children":283716},{},[283717],{"type":17,"tag":48,"props":283718,"children":283719},{},[283720],{"type":23,"value":282834},{"type":17,"tag":7266,"props":283722,"children":283723},{},[283724,283726,283730],{"type":23,"value":283725},"Native webhooks + ",{"type":17,"tag":48,"props":283727,"children":283728},{},[283729],{"type":23,"value":9010},{"type":23,"value":283731},"; live, zero-cache pass-through by design.",{"type":17,"tag":7266,"props":283733,"children":283734},{},[283735],{"type":23,"value":283736},"Webhooks plus cron-driven sync jobs and job templates.",{"type":17,"tag":7266,"props":283738,"children":283739},{},[283740],{"type":23,"value":283741},"Webhooks for triggers; managed pipelines to push/pull to your DB.",{"type":17,"tag":7239,"props":283743,"children":283744},{},[283745,283752,283757,283762],{"type":17,"tag":7266,"props":283746,"children":283747},{},[283748],{"type":17,"tag":48,"props":283749,"children":283750},{},[283751],{"type":23,"value":282875},{"type":17,"tag":7266,"props":283753,"children":283754},{},[283755],{"type":23,"value":283756},"Zero-storage (no cached customer data), SOC 2 Type II, GDPR/CCPA; granular scopes & auditability.",{"type":17,"tag":7266,"props":283758,"children":283759},{},[283760],{"type":23,"value":283761},"Cloud posture; stores configuration/sync/job metadata; no zero-storage claim.",{"type":17,"tag":7266,"props":283763,"children":283764},{},[283765],{"type":23,"value":283766},"Developer-first cloud posture; managed pipelines likely store operational metadata for sync/health (inferred).",{"type":17,"tag":7239,"props":283768,"children":283769},{},[283770,283777,283782,283787],{"type":17,"tag":7266,"props":283771,"children":283772},{},[283773],{"type":17,"tag":48,"props":283774,"children":283775},{},[283776],{"type":23,"value":282921},{"type":17,"tag":7266,"props":283778,"children":283779},{},[283780],{"type":23,"value":283781},"Hosted OAuth/API key, embeddable auth UI, exportable creds to avoid lock-in.",{"type":17,"tag":7266,"props":283783,"children":283784},{},[283785],{"type":23,"value":283786},"Admin APIs for integrated accounts; link tokens; webhook lifecycle.",{"type":17,"tag":7266,"props":283788,"children":283789},{},[283790],{"type":23,"value":283791},"Hosted auth & connection health; open-source integrations for extensibility.",{"type":17,"tag":7239,"props":283793,"children":283794},{},[283795,283802,283807,283812],{"type":17,"tag":7266,"props":283796,"children":283797},{},[283798],{"type":17,"tag":48,"props":283799,"children":283800},{},[283801],{"type":23,"value":282970},{"type":17,"tag":7266,"props":283803,"children":283804},{},[283805],{"type":23,"value":283806},"7+ SDKs, clear schemas, unified webhooks, MCP server for agent/tool access.",{"type":17,"tag":7266,"props":283808,"children":283809},{},[283810],{"type":23,"value":283811},"Admin + Unified APIs, job templates; services-assisted onboarding.",{"type":17,"tag":7266,"props":283813,"children":283814},{},[283815],{"type":23,"value":283816},"Unified API + Action API; GTM-oriented guides; quick prototyping.",{"type":17,"tag":7239,"props":283818,"children":283819},{},[283820,283827,283832,283837],{"type":17,"tag":7266,"props":283821,"children":283822},{},[283823],{"type":17,"tag":48,"props":283824,"children":283825},{},[283826],{"type":23,"value":283011},{"type":17,"tag":7266,"props":283828,"children":283829},{},[283830],{"type":23,"value":283831},"Transparent usage-based: e.g., $750 for 750K calls/month.",{"type":17,"tag":7266,"props":283833,"children":283834},{},[283835],{"type":23,"value":283836},"Pricing starts at $499/month (Foundation) with 100 connections and 50K API calls",{"type":17,"tag":7266,"props":283838,"children":283839},{},[283840],{"type":23,"value":283841},"Start plan listed as Free; paid Launch and Custom plans are 'customized for your business' with no public pricing.",{"type":17,"tag":7239,"props":283843,"children":283844},{},[283845,283852,283857,283862],{"type":17,"tag":7266,"props":283846,"children":283847},{},[283848],{"type":17,"tag":48,"props":283849,"children":283850},{},[283851],{"type":23,"value":283070},{"type":17,"tag":7266,"props":283853,"children":283854},{},[283855],{"type":23,"value":283856},"Product-grade, user-facing marketing automation features needing fresh lists/members/campaign metrics; AI personalization.",{"type":17,"tag":7266,"props":283858,"children":283859},{},[283860],{"type":23,"value":283861},"Teams needing tailored mappings and managed sync orchestration.",{"type":17,"tag":7266,"props":283863,"children":283864},{},[283865],{"type":23,"value":283866},"GTM apps needing fast marketing automation read/write plus opinionated 'actions.'",{"type":17,"tag":7239,"props":283868,"children":283869},{},[283870,283877,283882,283887],{"type":17,"tag":7266,"props":283871,"children":283872},{},[283873],{"type":17,"tag":48,"props":283874,"children":283875},{},[283876],{"type":23,"value":283111},{"type":17,"tag":7266,"props":283878,"children":283879},{},[283880],{"type":23,"value":283881},"Real-time pass-through, unified + virtual webhooks, MCP for agents.",{"type":17,"tag":7266,"props":283883,"children":283884},{},[283885],{"type":23,"value":283886},"'Service + platform' motion with granular control over sync jobs.",{"type":17,"tag":7266,"props":283888,"children":283889},{},[283890],{"type":23,"value":283891},"Action API (prebuilt writes) and GTM focus (CRM, sales engagement, MA).",{"type":17,"tag":68,"props":283893,"children":283895},{"id":283894},"why-unifiedto-leads-in-the-marketing-category",[283896,283897,283902],{"type":23,"value":283152},{"type":17,"tag":133,"props":283898,"children":283900},{"href":212,"rel":283899},[214],[283901],{"type":23,"value":217},{"type":23,"value":283903}," Leads in the Marketing Category",{"type":17,"tag":29,"props":283905,"children":283906},{},[283907,283909,283914],{"type":23,"value":283908},"Most unified APIs were built for HR/CRM first and treat Marketing as an add-on. That's fine for batch sync—but it breaks when your product needs ",{"type":17,"tag":48,"props":283910,"children":283911},{},[283912],{"type":23,"value":283913},"live engagement data",{"type":23,"value":283915}," for analytics, automation, or AI.",{"type":17,"tag":29,"props":283917,"children":283918},{},[283919,283924,283926,283930,283931,283935,283937,283945],{"type":17,"tag":133,"props":283920,"children":283922},{"href":78603,"rel":283921},[214],[283923],{"type":23,"value":217},{"type":23,"value":283925}," is different: a ",{"type":17,"tag":48,"props":283927,"children":283928},{},[283929],{"type":23,"value":70016},{"type":23,"value":11826},{"type":17,"tag":48,"props":283932,"children":283933},{},[283934],{"type":23,"value":94106},{"type":23,"value":283936}," architecture with clean, normalized Marketing models and built-in webhook delivery. Data is also available directly in our ",{"type":17,"tag":133,"props":283938,"children":283940},{"href":43558,"rel":283939},[214],[283941],{"type":17,"tag":48,"props":283942,"children":283943},{},[283944],{"type":23,"value":1067},{"type":23,"value":283946},", so your copilots and agents can read/write across providers without custom glue code.",{"type":17,"tag":29,"props":283948,"children":283949},{},[283950],{"type":23,"value":283951},"What sets Unified.to apart:",{"type":17,"tag":80,"props":283953,"children":283954},{},[283955,283964,283973,283983],{"type":17,"tag":84,"props":283956,"children":283957},{},[283958,283962],{"type":17,"tag":48,"props":283959,"children":283960},{},[283961],{"type":23,"value":218167},{"type":23,"value":283963}," – Native + Virtual Webhooks keep dashboards, journeys, and AI features in sync.",{"type":17,"tag":84,"props":283965,"children":283966},{},[283967,283971],{"type":17,"tag":48,"props":283968,"children":283969},{},[283970],{"type":23,"value":281425},{"type":23,"value":283972}," – Zero storage/caching of your customers' data; SOC 2 Type II; GDPR/CCPA.",{"type":17,"tag":84,"props":283974,"children":283975},{},[283976,283981],{"type":17,"tag":48,"props":283977,"children":283978},{},[283979],{"type":23,"value":283980},"Developer-credible",{"type":23,"value":283982}," – Unified models, raw passthrough when needed, strong SDKs, and observable webhooks.",{"type":17,"tag":84,"props":283984,"children":283985},{},[283986,283990,283992,283997],{"type":17,"tag":48,"props":283987,"children":283988},{},[283989],{"type":23,"value":283184},{"type":23,"value":283991}," – Marketing data and actions are ",{"type":17,"tag":33,"props":283993,"children":283994},{},[283995],{"type":23,"value":283996},"made available",{"type":23,"value":283998}," to agents through MCP.",{"type":17,"tag":29,"props":284000,"children":284001},{},[284002,284004,284013,284014,284022,284024,284029],{"type":23,"value":284003},"If Marketing is on your roadmap—campaign analytics, lead nurture, or AI personalization—",{"type":17,"tag":133,"props":284005,"children":284007},{"href":1612,"rel":284006},[214],[284008],{"type":17,"tag":48,"props":284009,"children":284010},{},[284011],{"type":23,"value":284012},"start a free 30-day trial",{"type":23,"value":75890},{"type":17,"tag":133,"props":284015,"children":284017},{"href":1623,"rel":284016},[214],[284018],{"type":17,"tag":48,"props":284019,"children":284020},{},[284021],{"type":23,"value":226481},{"type":23,"value":284023},". Build once, launch faster, and keep your data ",{"type":17,"tag":48,"props":284025,"children":284026},{},[284027],{"type":23,"value":284028},"real-time, secure, and AI-ready",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":284031},[284032,284033,284034,284035,284036],{"id":283356,"depth":1629,"text":283359},{"id":283424,"depth":1629,"text":283427},{"id":283530,"depth":1629,"text":283533},{"id":283589,"depth":1629,"text":283595},{"id":283894,"depth":1629,"text":284037},"Why Unified.to Leads in the Marketing Category","content:blog:marketing_unified_apis_what_to_look_for_use_cases_and_options.md","blog/marketing_unified_apis_what_to_look_for_use_cases_and_options.md","blog/marketing_unified_apis_what_to_look_for_use_cases_and_options",{"_path":284042,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":284043,"description":284044,"img":284045,"date":282341,"tag":12,"body":284046,"_type":1677,"_id":284723,"_source":1679,"_file":284724,"_stem":284725,"_extension":1682},"/blog/payment_unified_apis_what_to_look_for_use_cases_and_options","Payment Unified APIs: What to Look For, Use Cases, and Options","Collecting payments is one of the most common needs in SaaS. Yet integrating directly with payment processors, invoicing tools, and accounting platforms is...","https://s3.us-east-2.amazonaws.com/unified-article-images/payment_unified_apis_what_to_look_for_use_cases_and_options-icon.png",{"type":14,"children":284047,"toc":284715},[284048,284053,284056,284063,284071,284076,284091,284097,284102,284141,284146,284152,284157,284249,284255,284306,284315,284320,284589,284601,284606,284617,284621,284679,284691],{"type":17,"tag":18,"props":284049,"children":284051},{"id":284050},"payment-unified-apis-what-to-look-for-use-cases-and-options",[284052],{"type":23,"value":284043},{"type":17,"tag":25,"props":284054,"children":284055},{},[],{"type":17,"tag":29,"props":284057,"children":284058},{},[284059],{"type":17,"tag":33,"props":284060,"children":284061},{},[284062],{"type":23,"value":282359},{"type":17,"tag":29,"props":284064,"children":284065},{},[284066],{"type":17,"tag":6438,"props":284067,"children":284070},{"alt":284068,"src":284069},"api_categories.png","https://s3.us-east-2.amazonaws.com/unified-article-images/payment_unified_apis_what_to_look_for_use_cases_and_options-0.png",[],{"type":17,"tag":29,"props":284072,"children":284073},{},[284074],{"type":23,"value":284075},"Collecting payments is one of the most common needs in SaaS. Yet integrating directly with payment processors, invoicing tools, and accounting platforms is complex and repetitive. Every provider has its own authentication flow, schema, and webhook model.",{"type":17,"tag":29,"props":284077,"children":284078},{},[284079,284080,284089],{"type":23,"value":9619},{"type":17,"tag":48,"props":284081,"children":284082},{},[284083,284085],{"type":23,"value":284084},"Payments ",{"type":17,"tag":133,"props":284086,"children":284087},{"href":7691},[284088],{"type":23,"value":7806},{"type":23,"value":284090}," simplifies this. Instead of coding against each individual service, you integrate once into a normalized API that abstracts the differences. You can generate payment links, send invoices, reconcile transactions, and track customer balances through a single integration surface",{"type":17,"tag":68,"props":284092,"children":284094},{"id":284093},"what-is-a-payments-unified-api",[284095],{"type":23,"value":284096},"What is a Payments Unified API?",{"type":17,"tag":29,"props":284098,"children":284099},{},[284100],{"type":23,"value":284101},"A Payments Unified API acts as a translation layer between your app and multiple payment systems—Stripe, PayPal, Square, QuickBooks, Xero, and more.",{"type":17,"tag":80,"props":284103,"children":284104},{},[284105,284114],{"type":17,"tag":84,"props":284106,"children":284107},{},[284108,284112],{"type":17,"tag":48,"props":284109,"children":284110},{},[284111],{"type":23,"value":282425},{"type":23,"value":284113},": requires separate builds, auth flows, and maintenance for each provider.",{"type":17,"tag":84,"props":284115,"children":284116},{},[284117,284121,284122,284127,284128,284133,284134,284139],{"type":17,"tag":48,"props":284118,"children":284119},{},[284120],{"type":23,"value":282435},{"type":23,"value":283391},{"type":17,"tag":6121,"props":284123,"children":284125},{"className":284124},[],[284126],{"type":23,"value":25973},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284129,"children":284131},{"className":284130},[],[284132],{"type":23,"value":71559},{"type":23,"value":12561},{"type":17,"tag":6121,"props":284135,"children":284137},{"className":284136},[],[284138],{"type":23,"value":47609},{"type":23,"value":284140}," into a shared schema while still allowing passthrough for provider-specific fields.",{"type":17,"tag":29,"props":284142,"children":284143},{},[284144],{"type":23,"value":284145},"The result: faster launches, less maintenance, and consistent access patterns.",{"type":17,"tag":68,"props":284147,"children":284149},{"id":284148},"what-to-look-for-in-a-payments-unified-api",[284150],{"type":23,"value":284151},"What to Look For in a Payments Unified API",{"type":17,"tag":29,"props":284153,"children":284154},{},[284155],{"type":23,"value":284156},"When evaluating providers, consider both the breadth of coverage and the underlying architecture:",{"type":17,"tag":80,"props":284158,"children":284159},{},[284160,284170,284180,284190,284199,284214,284231,284240],{"type":17,"tag":84,"props":284161,"children":284162},{},[284163,284168],{"type":17,"tag":48,"props":284164,"children":284165},{},[284166],{"type":23,"value":284167},"Payment links & invoicing",{"type":23,"value":284169}," – Can you generate and send links or invoices directly?",{"type":17,"tag":84,"props":284171,"children":284172},{},[284173,284178],{"type":17,"tag":48,"props":284174,"children":284175},{},[284176],{"type":23,"value":284177},"Payment operations",{"type":23,"value":284179}," – Support for refunds, reconciliation, and subscription billing.",{"type":17,"tag":84,"props":284181,"children":284182},{},[284183,284188],{"type":17,"tag":48,"props":284184,"children":284185},{},[284186],{"type":23,"value":284187},"Coverage",{"type":23,"value":284189}," – Connectors for processors (Stripe, PayPal, Square) and accounting systems (QuickBooks, Xero, Zoho Books, NetSuite, Sage).",{"type":17,"tag":84,"props":284191,"children":284192},{},[284193,284197],{"type":17,"tag":48,"props":284194,"children":284195},{},[284196],{"type":23,"value":69153},{"type":23,"value":284198}," – Consistent objects for invoices, payments, and customers.",{"type":17,"tag":84,"props":284200,"children":284201},{},[284202,284207,284209,284213],{"type":17,"tag":48,"props":284203,"children":284204},{},[284205],{"type":23,"value":284206},"Real-time vs. sync jobs",{"type":23,"value":284208}," – Some APIs return cached or batch data; others deliver live updates via ",{"type":17,"tag":133,"props":284210,"children":284211},{"href":4999},[284212],{"type":23,"value":5002},{"type":23,"value":54},{"type":17,"tag":84,"props":284215,"children":284216},{},[284217,284221,284223,284229],{"type":17,"tag":48,"props":284218,"children":284219},{},[284220],{"type":23,"value":282581},{"type":23,"value":284222}," – SOC 2, GDPR, PCI DSS scope reduction, and ideally ",{"type":17,"tag":133,"props":284224,"children":284226},{"href":86962,"rel":284225},[214],[284227],{"type":23,"value":284228},"zero-data architecture",{"type":23,"value":284230}," (no customer data stored on vendor servers).",{"type":17,"tag":84,"props":284232,"children":284233},{},[284234,284238],{"type":17,"tag":48,"props":284235,"children":284236},{},[284237],{"type":23,"value":267529},{"type":23,"value":284239}," – SDKs, sandbox testing, webhook reliability, and error monitoring.",{"type":17,"tag":84,"props":284241,"children":284242},{},[284243,284247],{"type":17,"tag":48,"props":284244,"children":284245},{},[284246],{"type":23,"value":98996},{"type":23,"value":284248}," – Usage-based scales predictably with volume, unlike per-connection or per-customer pricing.",{"type":17,"tag":68,"props":284250,"children":284252},{"id":284251},"use-cases-for-payments-unified-apis",[284253],{"type":23,"value":284254},"Use Cases for Payments Unified APIs",{"type":17,"tag":6154,"props":284256,"children":284257},{},[284258,284268,284277,284286,284296],{"type":17,"tag":84,"props":284259,"children":284260},{},[284261,284266],{"type":17,"tag":48,"props":284262,"children":284263},{},[284264],{"type":23,"value":284265},"Embedded payment links",{"type":23,"value":284267}," – SaaS platforms can let users send payment links inside workflows (e.g., proposals, bookings).",{"type":17,"tag":84,"props":284269,"children":284270},{},[284271,284275],{"type":17,"tag":48,"props":284272,"children":284273},{},[284274],{"type":23,"value":82619},{"type":23,"value":284276}," – Trigger invoice creation and reconciliation across QuickBooks, Xero, and Zoho.",{"type":17,"tag":84,"props":284278,"children":284279},{},[284280,284284],{"type":17,"tag":48,"props":284281,"children":284282},{},[284283],{"type":23,"value":15895},{"type":23,"value":284285}," – Agents can check outstanding balances or issue refunds in real-time without brittle custom code.",{"type":17,"tag":84,"props":284287,"children":284288},{},[284289,284294],{"type":17,"tag":48,"props":284290,"children":284291},{},[284292],{"type":23,"value":284293},"Marketplaces",{"type":23,"value":284295}," – Platforms managing buyer–seller transactions can connect to multiple processors and automate payouts globally.",{"type":17,"tag":84,"props":284297,"children":284298},{},[284299,284304],{"type":17,"tag":48,"props":284300,"children":284301},{},[284302],{"type":23,"value":284303},"RevOps automation",{"type":23,"value":284305}," – Sync payment data into CRM or ERP workflows for revenue recognition and reporting.",{"type":17,"tag":68,"props":284307,"children":284309},{"id":284308},"payment-unified-api-options-in-the-market",[284310],{"type":17,"tag":48,"props":284311,"children":284312},{},[284313],{"type":23,"value":284314},"Payment Unified API Options in the Market",{"type":17,"tag":29,"props":284316,"children":284317},{},[284318],{"type":23,"value":284319},"Not every unified API provider covers payments directly. Here's how the landscape looks today:",{"type":17,"tag":7231,"props":284321,"children":284322},{},[284323,284350],{"type":17,"tag":7235,"props":284324,"children":284325},{},[284326],{"type":17,"tag":7239,"props":284327,"children":284328},{},[284329,284336,284343],{"type":17,"tag":7243,"props":284330,"children":284331},{},[284332],{"type":17,"tag":48,"props":284333,"children":284334},{},[284335],{"type":23,"value":87518},{"type":17,"tag":7243,"props":284337,"children":284338},{},[284339],{"type":17,"tag":48,"props":284340,"children":284341},{},[284342],{"type":23,"value":217},{"type":17,"tag":7243,"props":284344,"children":284345},{},[284346],{"type":17,"tag":48,"props":284347,"children":284348},{},[284349],{"type":23,"value":283631},{"type":17,"tag":7259,"props":284351,"children":284352},{},[284353,284373,284449,284469,284489,284509,284529,284549,284569],{"type":17,"tag":7239,"props":284354,"children":284355},{},[284356,284363,284368],{"type":17,"tag":7266,"props":284357,"children":284358},{},[284359],{"type":17,"tag":48,"props":284360,"children":284361},{},[284362],{"type":23,"value":42944},{"type":17,"tag":7266,"props":284364,"children":284365},{},[284366],{"type":23,"value":284367},"Category is Payments — covering processors, accounting, invoicing, and subscriptions. Includes Stripe, PayPal, SquareUp, QuickBooks, Xero, Zoho Books, Bill.com, Brex, Chargebee, GoCardless, Crezco, Holded, NetSuite",{"type":17,"tag":7266,"props":284369,"children":284370},{},[284371],{"type":23,"value":284372},"Focused narrowly on processors and gateways (Stripe, Razorpay, PayU, Adyen, Braintree, etc.). Stronger in India/Asia connectors (Juspay, Razorpay, PayU, SETU)",{"type":17,"tag":7239,"props":284374,"children":284375},{},[284376,284383,284419],{"type":17,"tag":7266,"props":284377,"children":284378},{},[284379],{"type":17,"tag":48,"props":284380,"children":284381},{},[284382],{"type":23,"value":282793},{"type":17,"tag":7266,"props":284384,"children":284385},{},[284386,284388,284393,284394,284399,284400,284405,284406,284411,284412,284417],{"type":23,"value":284387},"Deeply normalized objects: ",{"type":17,"tag":6121,"props":284389,"children":284391},{"className":284390},[],[284392],{"type":23,"value":25973},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284395,"children":284397},{"className":284396},[],[284398],{"type":23,"value":71559},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284401,"children":284403},{"className":284402},[],[284404],{"type":23,"value":47609},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284407,"children":284409},{"className":284408},[],[284410],{"type":23,"value":71510},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284413,"children":284415},{"className":284414},[],[284416],{"type":23,"value":25991},{"type":23,"value":284418},". Supports custom fields + passthrough raw payloads",{"type":17,"tag":7266,"props":284420,"children":284421},{},[284422,284424,284429,284430,284435,284436,284441,284442,284447],{"type":23,"value":284423},"Exposes objects for ",{"type":17,"tag":6121,"props":284425,"children":284427},{"className":284426},[],[284428],{"type":23,"value":11737},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284431,"children":284433},{"className":284432},[],[284434],{"type":23,"value":70733},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284437,"children":284439},{"className":284438},[],[284440],{"type":23,"value":32745},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284443,"children":284445},{"className":284444},[],[284446],{"type":23,"value":70796},{"type":23,"value":284448},". Requires more manual schema config (custom schema builder)",{"type":17,"tag":7239,"props":284450,"children":284451},{},[284452,284459,284464],{"type":17,"tag":7266,"props":284453,"children":284454},{},[284455],{"type":17,"tag":48,"props":284456,"children":284457},{},[284458],{"type":23,"value":282834},{"type":17,"tag":7266,"props":284460,"children":284461},{},[284462],{"type":23,"value":284463},"Real-time by default — Native and Virtual Webhooks. Every call fetches live data directly from the source (no caching, no batch intervals)",{"type":17,"tag":7266,"props":284465,"children":284466},{},[284467],{"type":23,"value":284468},"5-min RapidBridge syncs by default; real-time only where native webhooks exist",{"type":17,"tag":7239,"props":284470,"children":284471},{},[284472,284479,284484],{"type":17,"tag":7266,"props":284473,"children":284474},{},[284475],{"type":17,"tag":48,"props":284476,"children":284477},{},[284478],{"type":23,"value":282875},{"type":17,"tag":7266,"props":284480,"children":284481},{},[284482],{"type":23,"value":284483},"Zero-storage passthrough — no customer data cached. SOC 2 Type II, GDPR, CCPA compliant",{"type":17,"tag":7266,"props":284485,"children":284486},{},[284487],{"type":23,"value":284488},"SOC 2 Type II and ISO 27001 certified; GDPR, HIPAA, and CCPA compliant. Uses a batch/sync model (5-min intervals) rather than zero-storage passthrough",{"type":17,"tag":7239,"props":284490,"children":284491},{},[284492,284499,284504],{"type":17,"tag":7266,"props":284493,"children":284494},{},[284495],{"type":17,"tag":48,"props":284496,"children":284497},{},[284498],{"type":23,"value":282921},{"type":17,"tag":7266,"props":284500,"children":284501},{},[284502],{"type":23,"value":284503},"OAuth2, API key, token flows unified. Can store creds in customer-owned AWS Secrets Manager.",{"type":17,"tag":7266,"props":284505,"children":284506},{},[284507],{"type":23,"value":284508},"OAuth2 and API keys supported, but less standardized across providers (manual mapping often required)",{"type":17,"tag":7239,"props":284510,"children":284511},{},[284512,284519,284524],{"type":17,"tag":7266,"props":284513,"children":284514},{},[284515],{"type":17,"tag":48,"props":284516,"children":284517},{},[284518],{"type":23,"value":282970},{"type":17,"tag":7266,"props":284520,"children":284521},{},[284522],{"type":23,"value":284523},"SDKs in 7+ languages. Sandbox, real-time logs, database sync, MCP server for AI agents",{"type":17,"tag":7266,"props":284525,"children":284526},{},[284527],{"type":23,"value":284528},"REST API docs available, but fewer SDKs. No MCP/AI-native support. Sandbox less comprehensive",{"type":17,"tag":7239,"props":284530,"children":284531},{},[284532,284539,284544],{"type":17,"tag":7266,"props":284533,"children":284534},{},[284535],{"type":17,"tag":48,"props":284536,"children":284537},{},[284538],{"type":23,"value":283011},{"type":17,"tag":7266,"props":284540,"children":284541},{},[284542],{"type":23,"value":284543},"Transparent usage-based pricing — scales with API volume (e.g., $750 for 750K calls/month). No per-connection or per-customer fees",{"type":17,"tag":7266,"props":284545,"children":284546},{},[284547],{"type":23,"value":284548},"Starts at $499/mo (Foundation: 100 connections, 50k API calls, 5-min syncs). Expansion and Enterprise tiers scale to custom connectors, unlimited calls, SLA, and on-prem. Pricing tied to integration scope and plan tier, not pure usage",{"type":17,"tag":7239,"props":284550,"children":284551},{},[284552,284559,284564],{"type":17,"tag":7266,"props":284553,"children":284554},{},[284555],{"type":17,"tag":48,"props":284556,"children":284557},{},[284558],{"type":23,"value":283070},{"type":17,"tag":7266,"props":284560,"children":284561},{},[284562],{"type":23,"value":284563},"SaaS platforms embedding payments, marketplaces, RevOps automation, AI copilots",{"type":17,"tag":7266,"props":284565,"children":284566},{},[284567],{"type":23,"value":284568},"Best fit for startups targeting India/Asia payments or looking for processor coverage via RapidBridge",{"type":17,"tag":7239,"props":284570,"children":284571},{},[284572,284579,284584],{"type":17,"tag":7266,"props":284573,"children":284574},{},[284575],{"type":17,"tag":48,"props":284576,"children":284577},{},[284578],{"type":23,"value":283111},{"type":17,"tag":7266,"props":284580,"children":284581},{},[284582],{"type":23,"value":284583},"Real-time, zero-storage, AI-ready infrastructure with broader scope than gateways — unifying processors, invoicing, accounting, and subscription systems in one model",{"type":17,"tag":7266,"props":284585,"children":284586},{},[284587],{"type":23,"value":284588},"Focused narrowly on payment gateways; stronger in regional connectors (India/Asia). Less breadth across accounting and invoicing; normalization less mature than full unified models",{"type":17,"tag":68,"props":284590,"children":284592},{"id":284591},"why-unifiedto-leads-in-the-payments-category",[284593,284594,284599],{"type":23,"value":283152},{"type":17,"tag":133,"props":284595,"children":284597},{"href":42620,"rel":284596},[214],[284598],{"type":23,"value":217},{"type":23,"value":284600}," Leads in the Payments Category",{"type":17,"tag":29,"props":284602,"children":284603},{},[284604],{"type":23,"value":284605},"Most unified API vendors center on HR, CRM, or Accounting. Payments coverage is still rare—and often buried inside accounting categories that require custom logic to normalize. That means slower launches and brittle builds.",{"type":17,"tag":29,"props":284607,"children":284608},{},[284609,284615],{"type":17,"tag":133,"props":284610,"children":284612},{"href":78603,"rel":284611},[214],[284613],{"type":23,"value":284614},"Unified.to is different",{"type":23,"value":284616},". We offer a dedicated Payments category that unifies processors, invoicing, accounting, and subscriptions in one schema. With real-time delivery, zero-storage passthrough, and broad connector coverage, Unified.to gives you the infrastructure to embed payments without the delays or liabilities of batch-sync platforms.",{"type":17,"tag":29,"props":284618,"children":284619},{},[284620],{"type":23,"value":283951},{"type":17,"tag":80,"props":284622,"children":284623},{},[284624,284638,284654,284664],{"type":17,"tag":84,"props":284625,"children":284626},{},[284627,284636],{"type":17,"tag":133,"props":284628,"children":284630},{"href":37034,"rel":284629},[214],[284631],{"type":17,"tag":48,"props":284632,"children":284633},{},[284634],{"type":23,"value":284635},"Broader coverage",{"type":23,"value":284637},": Stripe, PayPal, SquareUp, QuickBooks, Xero, Zoho Books, Bill.com, Brex, Chargebee, GoCardless, Crezco, Holded, NetSuite, and more.",{"type":17,"tag":84,"props":284639,"children":284640},{},[284641,284645,284646,284652],{"type":17,"tag":48,"props":284642,"children":284643},{},[284644],{"type":23,"value":283207},{"type":23,"value":49318},{"type":17,"tag":133,"props":284647,"children":284649},{"href":252471,"rel":284648},[214],[284650],{"type":23,"value":284651},"Native + Virtual Webhooks",{"type":23,"value":284653}," deliver live data every time—no cached payloads, no 5-minute sync intervals.",{"type":17,"tag":84,"props":284655,"children":284656},{},[284657,284662],{"type":17,"tag":48,"props":284658,"children":284659},{},[284660],{"type":23,"value":284661},"Security by design",{"type":23,"value":284663},": Zero-storage architecture, SOC 2 Type II, GDPR, and CCPA compliance reduce your risk profile.",{"type":17,"tag":84,"props":284665,"children":284666},{},[284667,284671,284673,284677],{"type":17,"tag":48,"props":284668,"children":284669},{},[284670],{"type":23,"value":283184},{"type":23,"value":284672},": Payments data is available directly in our ",{"type":17,"tag":133,"props":284674,"children":284675},{"href":326},[284676],{"type":23,"value":329},{"type":23,"value":284678}," server, so your copilots and agents can read and act in real time.",{"type":17,"tag":29,"props":284680,"children":284681},{},[284682,284684,284689],{"type":23,"value":284683},"Payments are mission-critical. Building them in-house is slow, repetitive, and expensive. With ",{"type":17,"tag":133,"props":284685,"children":284687},{"href":42620,"rel":284686},[214],[284688],{"type":23,"value":217},{"type":23,"value":284690},", you integrate once and unlock a complete payments stack—without re-inventing the wheel every time a customer requests a new connector.",{"type":17,"tag":29,"props":284692,"children":284693},{},[284694,284696,284704,284705,284713],{"type":23,"value":284695},"If your roadmap includes payment links, invoice automation, or revenue insights, ",{"type":17,"tag":133,"props":284697,"children":284699},{"href":1612,"rel":284698},[214],[284700],{"type":17,"tag":48,"props":284701,"children":284702},{},[284703],{"type":23,"value":283283},{"type":23,"value":75890},{"type":17,"tag":133,"props":284706,"children":284708},{"href":1623,"rel":284707},[214],[284709],{"type":17,"tag":48,"props":284710,"children":284711},{},[284712],{"type":23,"value":226481},{"type":23,"value":284714}," to see how Unified.to helps you ship faster.",{"title":7,"searchDepth":1629,"depth":1629,"links":284716},[284717,284718,284719,284720,284721],{"id":284093,"depth":1629,"text":284096},{"id":284148,"depth":1629,"text":284151},{"id":284251,"depth":1629,"text":284254},{"id":284308,"depth":1629,"text":284314},{"id":284591,"depth":1629,"text":284722},"Why Unified.to Leads in the Payments Category","content:blog:payment_unified_apis_what_to_look_for_use_cases_and_options.md","blog/payment_unified_apis_what_to_look_for_use_cases_and_options.md","blog/payment_unified_apis_what_to_look_for_use_cases_and_options",{"_path":284727,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":284728,"description":284729,"img":284730,"date":282341,"tag":12,"body":284731,"_type":1677,"_id":285426,"_source":1679,"_file":285427,"_stem":285428,"_extension":1682},"/blog/repository_unified_apis_what_to_look_for_use_cases_and_options","Repository Unified APIs: What to Look For, Use Cases, and Options","Managing source code is central to modern software teams. But integrating directly with repositories like GitHub, GitLab, and Bitbucket comes with complexity....","https://s3.us-east-2.amazonaws.com/unified-article-images/repository_unified_apis_what_to_look_for_use_cases_and_options-icon.png",{"type":14,"children":284732,"toc":285418},[284733,284738,284741,284748,284755,284760,284776,284782,284793,284839,284844,284850,284855,284938,284944,284994,285003,285008,285286,285298,285303,285320,285324,285378,285395],{"type":17,"tag":18,"props":284734,"children":284736},{"id":284735},"repository-unified-apis-what-to-look-for-use-cases-and-options",[284737],{"type":23,"value":284728},{"type":17,"tag":25,"props":284739,"children":284740},{},[],{"type":17,"tag":29,"props":284742,"children":284743},{},[284744],{"type":17,"tag":33,"props":284745,"children":284746},{},[284747],{"type":23,"value":282359},{"type":17,"tag":29,"props":284749,"children":284750},{},[284751],{"type":17,"tag":6438,"props":284752,"children":284754},{"alt":282365,"src":284753},"https://s3.us-east-2.amazonaws.com/unified-article-images/repository_unified_apis_what_to_look_for_use_cases_and_options-0.png",[],{"type":17,"tag":29,"props":284756,"children":284757},{},[284758],{"type":23,"value":284759},"Managing source code is central to modern software teams. But integrating directly with repositories like GitHub, GitLab, and Bitbucket comes with complexity. Every provider has unique APIs, auth flows, webhook models, and object structures.",{"type":17,"tag":29,"props":284761,"children":284762},{},[284763,284764,284774],{"type":23,"value":9619},{"type":17,"tag":133,"props":284765,"children":284768},{"href":284766,"rel":284767},"https://unified.to/repo",[214],[284769],{"type":17,"tag":48,"props":284770,"children":284771},{},[284772],{"type":23,"value":284773},"Repository Unified API",{"type":23,"value":284775}," simplifies this. Instead of building separate integrations, you connect once to a normalized API that abstracts those differences. You can fetch repositories, commits, branches, pull requests, and issues through a single integration surface.",{"type":17,"tag":68,"props":284777,"children":284779},{"id":284778},"what-is-a-repository-unified-api",[284780],{"type":23,"value":284781},"What is a Repository Unified API?",{"type":17,"tag":29,"props":284783,"children":284784},{},[284785,284787,284791],{"type":23,"value":284786},"A Repository ",{"type":17,"tag":133,"props":284788,"children":284789},{"href":7691},[284790],{"type":23,"value":7806},{"type":23,"value":284792}," acts as a translation layer between your app and multiple source code systems—GitHub, GitLab, Bitbucket, Azure Repos, and others.",{"type":17,"tag":80,"props":284794,"children":284795},{},[284796,284805],{"type":17,"tag":84,"props":284797,"children":284798},{},[284799,284803],{"type":17,"tag":48,"props":284800,"children":284801},{},[284802],{"type":23,"value":282425},{"type":23,"value":284804},": requires custom builds and maintenance per provider.",{"type":17,"tag":84,"props":284806,"children":284807},{},[284808,284812,284813,284818,284819,284824,284825,284830,284831,284837],{"type":17,"tag":48,"props":284809,"children":284810},{},[284811],{"type":23,"value":282435},{"type":23,"value":283391},{"type":17,"tag":6121,"props":284814,"children":284816},{"className":284815},[],[284817],{"type":23,"value":18059},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284820,"children":284822},{"className":284821},[],[284823],{"type":23,"value":18085},{"type":23,"value":11826},{"type":17,"tag":6121,"props":284826,"children":284828},{"className":284827},[],[284829],{"type":23,"value":18072},{"type":23,"value":12561},{"type":17,"tag":6121,"props":284832,"children":284834},{"className":284833},[],[284835],{"type":23,"value":284836},"PullRequest",{"type":23,"value":284838}," into a consistent schema, while still exposing raw payloads for provider-specific fields.",{"type":17,"tag":29,"props":284840,"children":284841},{},[284842],{"type":23,"value":284843},"The result: faster launches, less integration debt, and consistent access patterns across platforms.",{"type":17,"tag":68,"props":284845,"children":284847},{"id":284846},"what-to-look-for-in-a-repository-unified-api",[284848],{"type":23,"value":284849},"What to Look For in a Repository Unified API",{"type":17,"tag":29,"props":284851,"children":284852},{},[284853],{"type":23,"value":284854},"When evaluating providers, consider both coverage and the underlying architecture:",{"type":17,"tag":80,"props":284856,"children":284857},{},[284858,284867,284876,284892,284902,284911,284920,284929],{"type":17,"tag":84,"props":284859,"children":284860},{},[284861,284865],{"type":17,"tag":48,"props":284862,"children":284863},{},[284864],{"type":23,"value":216065},{"type":23,"value":284866}," – GitHub, GitLab, Bitbucket, Azure Repos, and more.",{"type":17,"tag":84,"props":284868,"children":284869},{},[284870,284874],{"type":17,"tag":48,"props":284871,"children":284872},{},[284873],{"type":23,"value":69153},{"type":23,"value":284875}," – Consistent objects for repos, commits, branches, pull requests, and issues.",{"type":17,"tag":84,"props":284877,"children":284878},{},[284879,284884,284886,284890],{"type":17,"tag":48,"props":284880,"children":284881},{},[284882],{"type":23,"value":284883},"Real-time vs. polling",{"type":23,"value":284885}," – Some APIs deliver live updates via ",{"type":17,"tag":133,"props":284887,"children":284888},{"href":4999},[284889],{"type":23,"value":5002},{"type":23,"value":284891},"; others fall back to sync jobs.",{"type":17,"tag":84,"props":284893,"children":284894},{},[284895,284900],{"type":17,"tag":48,"props":284896,"children":284897},{},[284898],{"type":23,"value":284899},"Read/write support",{"type":23,"value":284901}," – Ability to create branches, issues, or pull requests, not just read.",{"type":17,"tag":84,"props":284903,"children":284904},{},[284905,284909],{"type":17,"tag":48,"props":284906,"children":284907},{},[284908],{"type":23,"value":282581},{"type":23,"value":284910}," – SOC 2, GDPR, and ideally zero-storage architecture (no customer data cached).",{"type":17,"tag":84,"props":284912,"children":284913},{},[284914,284918],{"type":17,"tag":48,"props":284915,"children":284916},{},[284917],{"type":23,"value":267529},{"type":23,"value":284919}," – SDKs, sandbox data, webhook reliability, and error monitoring.",{"type":17,"tag":84,"props":284921,"children":284922},{},[284923,284927],{"type":17,"tag":48,"props":284924,"children":284925},{},[284926],{"type":23,"value":98996},{"type":23,"value":284928}," – Usage-based vs. per-connection, and whether costs scale predictably with volume.",{"type":17,"tag":84,"props":284930,"children":284931},{},[284932,284936],{"type":17,"tag":48,"props":284933,"children":284934},{},[284935],{"type":23,"value":282609},{"type":23,"value":284937}," – Can data flow directly into copilots or LLM agents for contextual coding assistance",{"type":17,"tag":68,"props":284939,"children":284941},{"id":284940},"use-cases-for-repository-unified-apis",[284942],{"type":23,"value":284943},"Use Cases for Repository Unified APIs",{"type":17,"tag":6154,"props":284945,"children":284946},{},[284947,284957,284966,284975,284985],{"type":17,"tag":84,"props":284948,"children":284949},{},[284950,284955],{"type":17,"tag":48,"props":284951,"children":284952},{},[284953],{"type":23,"value":284954},"DevOps & CI/CD tools",{"type":23,"value":284956}," – sync repos, branches, and commits across multiple platforms.",{"type":17,"tag":84,"props":284958,"children":284959},{},[284960,284964],{"type":17,"tag":48,"props":284961,"children":284962},{},[284963],{"type":23,"value":17493},{"type":23,"value":284965}," – standardize commit, PR, and contributor metrics across systems.",{"type":17,"tag":84,"props":284967,"children":284968},{},[284969,284973],{"type":17,"tag":48,"props":284970,"children":284971},{},[284972],{"type":23,"value":15895},{"type":23,"value":284974}," – retrieve repo context in real time for code assistants and LLM agents.",{"type":17,"tag":84,"props":284976,"children":284977},{},[284978,284983],{"type":17,"tag":48,"props":284979,"children":284980},{},[284981],{"type":23,"value":284982},"Project management",{"type":23,"value":284984}," – link issues and commits across providers.",{"type":17,"tag":84,"props":284986,"children":284987},{},[284988,284992],{"type":17,"tag":48,"props":284989,"children":284990},{},[284991],{"type":23,"value":282581},{"type":23,"value":284993}," – scan repos for secrets and vulnerabilities through one consistent interface.",{"type":17,"tag":68,"props":284995,"children":284997},{"id":284996},"repository-unified-api-options-in-the-market",[284998],{"type":17,"tag":48,"props":284999,"children":285000},{},[285001],{"type":23,"value":285002},"Repository Unified API Options in the Market",{"type":17,"tag":29,"props":285004,"children":285005},{},[285006],{"type":23,"value":285007},"Only a few unified API providers cover repositories directly. Here's how they compare:",{"type":17,"tag":7231,"props":285009,"children":285010},{},[285011,285046],{"type":17,"tag":7235,"props":285012,"children":285013},{},[285014],{"type":17,"tag":7239,"props":285015,"children":285016},{},[285017,285024,285031,285038],{"type":17,"tag":7243,"props":285018,"children":285019},{},[285020],{"type":17,"tag":48,"props":285021,"children":285022},{},[285023],{"type":23,"value":87518},{"type":17,"tag":7243,"props":285025,"children":285026},{},[285027],{"type":17,"tag":48,"props":285028,"children":285029},{},[285030],{"type":23,"value":217},{"type":17,"tag":7243,"props":285032,"children":285033},{},[285034],{"type":17,"tag":48,"props":285035,"children":285036},{},[285037],{"type":23,"value":283631},{"type":17,"tag":7243,"props":285039,"children":285040},{},[285041],{"type":17,"tag":48,"props":285042,"children":285043},{},[285044],{"type":23,"value":285045},"Unizo.ai",{"type":17,"tag":7259,"props":285047,"children":285048},{},[285049,285074,285107,285132,285157,285182,285212,285236,285261],{"type":17,"tag":7239,"props":285050,"children":285051},{},[285052,285059,285064,285069],{"type":17,"tag":7266,"props":285053,"children":285054},{},[285055],{"type":17,"tag":48,"props":285056,"children":285057},{},[285058],{"type":23,"value":42944},{"type":17,"tag":7266,"props":285060,"children":285061},{},[285062],{"type":23,"value":285063},"Dedicated Repository category: GitHub, GitLab, Bitbucket",{"type":17,"tag":7266,"props":285065,"children":285066},{},[285067],{"type":23,"value":285068},"CI/CD & Version Control Unified APIs covering GitHub, GitLab, and Bitbucket",{"type":17,"tag":7266,"props":285070,"children":285071},{},[285072],{"type":23,"value":285073},"SCM Unified API: GitHub, GitLab, Bitbucket, Azure DevOps",{"type":17,"tag":7239,"props":285075,"children":285076},{},[285077,285084,285089,285094],{"type":17,"tag":7266,"props":285078,"children":285079},{},[285080],{"type":17,"tag":48,"props":285081,"children":285082},{},[285083],{"type":23,"value":282793},{"type":17,"tag":7266,"props":285085,"children":285086},{},[285087],{"type":23,"value":285088},"Delivers normalized objects for repositories, commits, branches, pull requests, and issues, while allowing passthrough for raw fields",{"type":17,"tag":7266,"props":285090,"children":285091},{},[285092],{"type":23,"value":285093},"Supports custom unified models and Proxy APIs for raw payloads",{"type":17,"tag":7266,"props":285095,"children":285096},{},[285097,285099,285105],{"type":23,"value":285098},"Normalized schema for repositories, commits, branches, and pull requests, with flexibility to extend models using Schema Studio and to request raw provider payloads via a ",{"type":17,"tag":6121,"props":285100,"children":285102},{"className":285101},[],[285103],{"type":23,"value":285104},"nativeResponse",{"type":23,"value":285106}," option",{"type":17,"tag":7239,"props":285108,"children":285109},{},[285110,285117,285122,285127],{"type":17,"tag":7266,"props":285111,"children":285112},{},[285113],{"type":17,"tag":48,"props":285114,"children":285115},{},[285116],{"type":23,"value":282834},{"type":17,"tag":7266,"props":285118,"children":285119},{},[285120],{"type":23,"value":285121},"Every request is real-time via native and virtual webhooks",{"type":17,"tag":7266,"props":285123,"children":285124},{},[285125],{"type":23,"value":285126},"RapidBridge provides 5-minute syncs by default, with real-time supported where providers expose webhooks",{"type":17,"tag":7266,"props":285128,"children":285129},{},[285130],{"type":23,"value":285131},"Real-time webhooks and event integrations",{"type":17,"tag":7239,"props":285133,"children":285134},{},[285135,285142,285147,285152],{"type":17,"tag":7266,"props":285136,"children":285137},{},[285138],{"type":17,"tag":48,"props":285139,"children":285140},{},[285141],{"type":23,"value":282875},{"type":17,"tag":7266,"props":285143,"children":285144},{},[285145],{"type":23,"value":285146},"SOC 2 Type II, GDPR, and CCPA compliant with zero storage of customer data",{"type":17,"tag":7266,"props":285148,"children":285149},{},[285150],{"type":23,"value":285151},"SOC 2 Type II and ISO 27001 certified and states that it does not store customer data",{"type":17,"tag":7266,"props":285153,"children":285154},{},[285155],{"type":23,"value":285156},"Zero-retention claims that customer code and findings are never stored",{"type":17,"tag":7239,"props":285158,"children":285159},{},[285160,285167,285172,285177],{"type":17,"tag":7266,"props":285161,"children":285162},{},[285163],{"type":17,"tag":48,"props":285164,"children":285165},{},[285166],{"type":23,"value":282921},{"type":17,"tag":7266,"props":285168,"children":285169},{},[285170],{"type":23,"value":285171},"Supports OAuth2, API key, and token flows with optional credential storage in AWS Secrets Manager",{"type":17,"tag":7266,"props":285173,"children":285174},{},[285175],{"type":23,"value":285176},"Authentication supports OAuth2 and API keys through a pluggable UI",{"type":17,"tag":7266,"props":285178,"children":285179},{},[285180],{"type":23,"value":285181},"Authentication is handled through an API key and integration ID, rather than a universal OAuth2 flow",{"type":17,"tag":7239,"props":285183,"children":285184},{},[285185,285192,285202,285207],{"type":17,"tag":7266,"props":285186,"children":285187},{},[285188],{"type":17,"tag":48,"props":285189,"children":285190},{},[285191],{"type":23,"value":282970},{"type":17,"tag":7266,"props":285193,"children":285194},{},[285195,285197],{"type":23,"value":285196},"Developer experience is strong, with SDKs in seven languages, a sandbox, and ",{"type":17,"tag":48,"props":285198,"children":285199},{},[285200],{"type":23,"value":285201},"MCP server support for AI agents",{"type":17,"tag":7266,"props":285203,"children":285204},{},[285205],{"type":23,"value":285206},"REST-first, SDKs are not a core focus",{"type":17,"tag":7266,"props":285208,"children":285209},{},[285210],{"type":23,"value":285211},"REST-first, supported by multi-language SDKs (Node.js, Python, Go, Java)",{"type":17,"tag":7239,"props":285213,"children":285214},{},[285215,285222,285227,285231],{"type":17,"tag":7266,"props":285216,"children":285217},{},[285218],{"type":17,"tag":48,"props":285219,"children":285220},{},[285221],{"type":23,"value":283011},{"type":17,"tag":7266,"props":285223,"children":285224},{},[285225],{"type":23,"value":285226},"Transparent usage-based: e.g., $750 for 750K calls/month",{"type":17,"tag":7266,"props":285228,"children":285229},{},[285230],{"type":23,"value":283836},{"type":17,"tag":7266,"props":285232,"children":285233},{},[285234],{"type":23,"value":285235},"Tiered plans starting with Free (2k calls) and Launch (50k calls). Pricing not public",{"type":17,"tag":7239,"props":285237,"children":285238},{},[285239,285246,285251,285256],{"type":17,"tag":7266,"props":285240,"children":285241},{},[285242],{"type":17,"tag":48,"props":285243,"children":285244},{},[285245],{"type":23,"value":283070},{"type":17,"tag":7266,"props":285247,"children":285248},{},[285249],{"type":23,"value":285250},"SaaS platforms embedding repo data, AI copilots, analytics, compliance",{"type":17,"tag":7266,"props":285252,"children":285253},{},[285254],{"type":23,"value":285255},"SaaS teams prioritizing CI/CD and version control coverage, especially where 5-minute sync intervals are acceptable",{"type":17,"tag":7266,"props":285257,"children":285258},{},[285259],{"type":23,"value":285260},"Enterprise pipelines and DevOps reporting, with broader SCM scope including Azure DevOps",{"type":17,"tag":7239,"props":285262,"children":285263},{},[285264,285271,285276,285281],{"type":17,"tag":7266,"props":285265,"children":285266},{},[285267],{"type":17,"tag":48,"props":285268,"children":285269},{},[285270],{"type":23,"value":283111},{"type":17,"tag":7266,"props":285272,"children":285273},{},[285274],{"type":23,"value":285275},"Real-time, zero-storage, AI-ready infra. Full CRUD across repo objects",{"type":17,"tag":7266,"props":285277,"children":285278},{},[285279],{"type":23,"value":285280},"CI/CD focus and sync-based RapidBridge design, which appeals to teams prioritizing pipeline coverage with optional real-time where available",{"type":17,"tag":7266,"props":285282,"children":285283},{},[285284],{"type":23,"value":285285},"Wider SCM scope including Azure DevOps and enterprise-oriented pipelines",{"type":17,"tag":68,"props":285287,"children":285289},{"id":285288},"why-unifiedto-leads-in-the-repository-category",[285290,285291,285296],{"type":23,"value":283152},{"type":17,"tag":133,"props":285292,"children":285294},{"href":212,"rel":285293},[214],[285295],{"type":23,"value":217},{"type":23,"value":285297}," Leads in the Repository Category",{"type":17,"tag":29,"props":285299,"children":285300},{},[285301],{"type":23,"value":285302},"Most unified API vendors focus on HR, CRM, or Accounting. Repository coverage is newer, and often bundled into CI/CD or SCM categories without deep normalization.",{"type":17,"tag":29,"props":285304,"children":285305},{},[285306,285311,285313,285318],{"type":17,"tag":133,"props":285307,"children":285309},{"href":78603,"rel":285308},[214],[285310],{"type":23,"value":284614},{"type":23,"value":285312},". We offer a ",{"type":17,"tag":48,"props":285314,"children":285315},{},[285316],{"type":23,"value":285317},"dedicated Repository category",{"type":23,"value":285319}," with GitHub, GitLab, and Bitbucket connectors today, with Azure Repos and additional SCM systems on the roadmap. Every request is real-time, zero-storage, and normalized into clean schemas—ideal for AI-native products and SaaS platforms that rely on code data.",{"type":17,"tag":29,"props":285321,"children":285322},{},[285323],{"type":23,"value":283951},{"type":17,"tag":80,"props":285325,"children":285326},{},[285327,285337,285352,285361],{"type":17,"tag":84,"props":285328,"children":285329},{},[285330,285335],{"type":17,"tag":48,"props":285331,"children":285332},{},[285333],{"type":23,"value":285334},"Dedicated coverage",{"type":23,"value":285336},": GitHub, GitLab, Bitbucket today, with additional SCM systems on the roadmap.",{"type":17,"tag":84,"props":285338,"children":285339},{},[285340,285344,285346,285350],{"type":17,"tag":48,"props":285341,"children":285342},{},[285343],{"type":23,"value":283207},{"type":23,"value":285345},": Native + ",{"type":17,"tag":133,"props":285347,"children":285348},{"href":9007},[285349],{"type":23,"value":9010},{"type":23,"value":285351}," ensure live data every call.",{"type":17,"tag":84,"props":285353,"children":285354},{},[285355,285359],{"type":17,"tag":48,"props":285356,"children":285357},{},[285358],{"type":23,"value":284661},{"type":23,"value":285360},": Zero-storage architecture, SOC 2 Type II, GDPR, and CCPA compliance.",{"type":17,"tag":84,"props":285362,"children":285363},{},[285364,285369,285371,285376],{"type":17,"tag":48,"props":285365,"children":285366},{},[285367],{"type":23,"value":285368},"AI-native",{"type":23,"value":285370},": Repository data is available directly in the ",{"type":17,"tag":133,"props":285372,"children":285374},{"href":43558,"rel":285373},[214],[285375],{"type":23,"value":1067},{"type":23,"value":285377},", making it executable by copilots and LLMs without glue code.",{"type":17,"tag":29,"props":285379,"children":285380},{},[285381,285383,285388,285390,285394],{"type":23,"value":285382},"Integrating with repositories shouldn't slow your roadmap. With ",{"type":17,"tag":133,"props":285384,"children":285386},{"href":212,"rel":285385},[214],[285387],{"type":23,"value":217},{"type":23,"value":285389},", you integrate once and unlock repository coverage that's ",{"type":17,"tag":48,"props":285391,"children":285392},{},[285393],{"type":23,"value":284028},{"type":23,"value":54},{"type":17,"tag":29,"props":285396,"children":285397},{},[285398,285400,285408,285409,285417],{"type":23,"value":285399},"If your roadmap includes DevOps, analytics, or AI copilots, ",{"type":17,"tag":133,"props":285401,"children":285403},{"href":1612,"rel":285402},[214],[285404],{"type":17,"tag":48,"props":285405,"children":285406},{},[285407],{"type":23,"value":283283},{"type":23,"value":75890},{"type":17,"tag":133,"props":285410,"children":285412},{"href":1623,"rel":285411},[214],[285413],{"type":17,"tag":48,"props":285414,"children":285415},{},[285416],{"type":23,"value":226481},{"type":23,"value":284714},{"title":7,"searchDepth":1629,"depth":1629,"links":285419},[285420,285421,285422,285423,285424],{"id":284778,"depth":1629,"text":284781},{"id":284846,"depth":1629,"text":284849},{"id":284940,"depth":1629,"text":284943},{"id":284996,"depth":1629,"text":285002},{"id":285288,"depth":1629,"text":285425},"Why Unified.to Leads in the Repository Category","content:blog:repository_unified_apis_what_to_look_for_use_cases_and_options.md","blog/repository_unified_apis_what_to_look_for_use_cases_and_options.md","blog/repository_unified_apis_what_to_look_for_use_cases_and_options",{"_path":285430,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":285431,"description":285432,"img":285433,"date":285434,"tag":12,"body":285435,"_type":1677,"_id":285779,"_source":1679,"_file":285780,"_stem":285781,"_extension":1682},"/blog/how_to_build_an_ai_powered_meeting_recording_summarization_with_unified","How to Build an AI-Powered Meeting Recording Summarization with Unified","With Unified, you can build AI powered meeting and call recording applications that work with all major meeting providers. With a single integration you can...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_ai_powered_meeting_recording_summarization_with_unified-icon.png","2025-09-22T00:00:00.000Z",{"type":14,"children":285436,"toc":285768},[285437,285442,285445,285453,285458,285469,285479,285482,285486,285517,285520,285524,285529,285554,285563,285566,285570,285579,285589,285598,285601,285605,285614,285617,285621,285626,285632,285637,285646,285649,285655,285660,285669,285674,285683,285686,285692,285697,285706,285714,285738,285741,285747,285752,285761,285764],{"type":17,"tag":18,"props":285438,"children":285440},{"id":285439},"how-to-build-an-ai-powered-meeting-recording-summarization-with-unified",[285441],{"type":23,"value":285431},{"type":17,"tag":25,"props":285443,"children":285444},{},[],{"type":17,"tag":29,"props":285446,"children":285447},{},[285448],{"type":17,"tag":33,"props":285449,"children":285450},{},[285451],{"type":23,"value":285452},"September 22, 2025",{"type":17,"tag":29,"props":285454,"children":285455},{},[285456],{"type":23,"value":285457},"With Unified, you can build AI powered meeting and call recording applications that work with all major meeting providers. With a single integration you can fetch meetings, retrieve recordings, retrieve transcripts, and then use Unified's GenAI for summarization.",{"type":17,"tag":29,"props":285459,"children":285460},{},[285461,285463,285467],{"type":23,"value":285462},"This pattern is also the ingestion layer for a ",{"type":17,"tag":133,"props":285464,"children":285465},{"href":77021},[285466],{"type":23,"value":77024},{"type":23,"value":285468}," (RAG) pipeline, where transcripts are chunked, embedded, and retrieved at query time to ground AI outputs in the original meeting content.",{"type":17,"tag":29,"props":285470,"children":285471},{},[285472,285474,285478],{"type":23,"value":285473},"With this article you would be able to build a workflow that lists calendar events, retrieves transcripts and generates a summary using Unified's ",{"type":17,"tag":133,"props":285475,"children":285476},{"href":16186},[285477],{"type":23,"value":25249},{"type":23,"value":54},{"type":17,"tag":25,"props":285480,"children":285481},{},[],{"type":17,"tag":68,"props":285483,"children":285484},{"id":141798},[285485],{"type":23,"value":141801},{"type":17,"tag":80,"props":285487,"children":285488},{},[285489,285493,285498,285502,285507,285512],{"type":17,"tag":84,"props":285490,"children":285491},{},[285492],{"type":23,"value":276661},{"type":17,"tag":84,"props":285494,"children":285495},{},[285496],{"type":23,"value":285497},"Unified account with at least one calendar or UC integration enabled (e.g., Zoom, Google Meet, Webex)",{"type":17,"tag":84,"props":285499,"children":285500},{},[285501],{"type":23,"value":220751},{"type":17,"tag":84,"props":285503,"children":285504},{},[285505],{"type":23,"value":285506},"Your customer's calendar/UC connection ID (from Unified's embedded auth flow)",{"type":17,"tag":84,"props":285508,"children":285509},{},[285510],{"type":23,"value":285511},"Unified GenAI connection ID (if you are not using Unified's GenAI API, then substitute this code with your LLM API code)",{"type":17,"tag":84,"props":285513,"children":285514},{},[285515],{"type":23,"value":285516},"Optional (for RAG search/Q&A): a vector database (e.g., pgvector or Pinecone) and an embedding model to index transcript chunks.",{"type":17,"tag":25,"props":285518,"children":285519},{},[],{"type":17,"tag":68,"props":285521,"children":285522},{"id":269318},[285523],{"type":23,"value":269321},{"type":17,"tag":29,"props":285525,"children":285526},{},[285527],{"type":23,"value":285528},"Unified supports Calendar integrations including:",{"type":17,"tag":80,"props":285530,"children":285531},{},[285532,285536,285541,285546,285550],{"type":17,"tag":84,"props":285533,"children":285534},{},[285535],{"type":23,"value":14472},{"type":17,"tag":84,"props":285537,"children":285538},{},[285539],{"type":23,"value":285540},"Google Calendar/Meet",{"type":17,"tag":84,"props":285542,"children":285543},{},[285544],{"type":23,"value":285545},"Microsoft Outlook/Teams",{"type":17,"tag":84,"props":285547,"children":285548},{},[285549],{"type":23,"value":14129},{"type":17,"tag":84,"props":285551,"children":285552},{},[285553],{"type":23,"value":14150},{"type":17,"tag":29,"props":285555,"children":285556},{},[285557],{"type":17,"tag":133,"props":285558,"children":285560},{"href":99025,"rel":285559},[214],[285561],{"type":23,"value":285562},"See all supported calendar integrations",{"type":17,"tag":25,"props":285564,"children":285565},{},[],{"type":17,"tag":68,"props":285567,"children":285568},{"id":276695},[285569],{"type":23,"value":276698},{"type":17,"tag":6893,"props":285571,"children":285574},{"className":285572,"code":285573,"language":48432,"meta":7},[48430],"mkdir recordings-ai-demo\ncd recordings-ai-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[285575],{"type":17,"tag":6121,"props":285576,"children":285577},{"__ignoreMap":7},[285578],{"type":23,"value":285573},{"type":17,"tag":29,"props":285580,"children":285581},{},[285582,285583,285588],{"type":23,"value":276717},{"type":17,"tag":6121,"props":285584,"children":285586},{"className":285585},[],[285587],{"type":23,"value":211221},{"type":23,"value":20456},{"type":17,"tag":6893,"props":285590,"children":285593},{"className":285591,"code":285592,"language":20901,"meta":23},[20899],"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_CALENDAR=your_customer_calendar_connection_id\nCONNECTION_GENAI=your_genai_connection_id\n",[285594],{"type":17,"tag":6121,"props":285595,"children":285596},{"__ignoreMap":7},[285597],{"type":23,"value":285592},{"type":17,"tag":25,"props":285599,"children":285600},{},[],{"type":17,"tag":68,"props":285602,"children":285603},{"id":211235},[285604],{"type":23,"value":211238},{"type":17,"tag":6893,"props":285606,"children":285609},{"className":285607,"code":285608,"language":18718,"meta":7},[18716],"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_CALENDAR, CONNECTION_GENAI } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[285610],{"type":17,"tag":6121,"props":285611,"children":285612},{"__ignoreMap":7},[285613],{"type":23,"value":285608},{"type":17,"tag":25,"props":285615,"children":285616},{},[],{"type":17,"tag":68,"props":285618,"children":285619},{"id":276756},[285620],{"type":23,"value":276759},{"type":17,"tag":29,"props":285622,"children":285623},{},[285624],{"type":23,"value":285625},"Before you get started, your end customer must authorize your app to access their calendar integration via Unified's auth flow. Once authorized, you will receive a connection ID for that customer's integration. Store this carefully and use it in all API calls for that specific customer.",{"type":17,"tag":68,"props":285627,"children":285629},{"id":285628},"step-4-list-calendar-events",[285630],{"type":23,"value":285631},"Step 4: List Calendar Events",{"type":17,"tag":29,"props":285633,"children":285634},{},[285635],{"type":23,"value":285636},"Fetch recent or upcoming events for your customer:",{"type":17,"tag":6893,"props":285638,"children":285641},{"className":285639,"code":285640,"language":18718,"meta":7},[18716],"export async function listEvents(connectionId: string) {\n  const eventsResult = await sdk.calendar.listCalendarEvents({\n    connectionId,\n    limit: 10,\n  });\n  return eventsResult; // CalendarEvent[]\n}\n",[285642],{"type":17,"tag":6121,"props":285643,"children":285644},{"__ignoreMap":7},[285645],{"type":23,"value":285640},{"type":17,"tag":25,"props":285647,"children":285648},{},[],{"type":17,"tag":68,"props":285650,"children":285652},{"id":285651},"step-5-list-and-retrieve-recordings",[285653],{"type":23,"value":285654},"Step 5: List and Retrieve Recordings",{"type":17,"tag":29,"props":285656,"children":285657},{},[285658],{"type":23,"value":285659},"List all available recordings for your customer's connection:",{"type":17,"tag":6893,"props":285661,"children":285664},{"className":285662,"code":285663,"language":18718,"meta":7},[18716],"export async function listRecordings(connectionId: string) {\n  const recordingsResult = await sdk.calendar.listCalendarRecordings({\n    connectionId,\n    limit: 10,\n  });\n  return recordingResult; // CalendarRecording[]\n}\n",[285665],{"type":17,"tag":6121,"props":285666,"children":285667},{"__ignoreMap":7},[285668],{"type":23,"value":285663},{"type":17,"tag":29,"props":285670,"children":285671},{},[285672],{"type":23,"value":285673},"Retrieve a specific recording:",{"type":17,"tag":6893,"props":285675,"children":285678},{"className":285676,"code":285677,"language":18718,"meta":7},[18716],"export async function getRecording(connectionId: string, recordingId: string) {\n  const recordingResult = await sdk.calendar.getCalendarRecording({\n    connectionId,\n    id: recordingId,\n  });\n        return recordingResult; // CalendarRecording;\n}\n",[285679],{"type":17,"tag":6121,"props":285680,"children":285681},{"__ignoreMap":7},[285682],{"type":23,"value":285677},{"type":17,"tag":25,"props":285684,"children":285685},{},[],{"type":17,"tag":68,"props":285687,"children":285689},{"id":285688},"step-6-summarize-a-recording-with-unified-genai",[285690],{"type":23,"value":285691},"Step 6: Summarize a Recording with Unified GenAI",{"type":17,"tag":29,"props":285693,"children":285694},{},[285695],{"type":23,"value":285696},"Now you can send the transcript and use AI through Unified's GenAI integration to summarize it.",{"type":17,"tag":6893,"props":285698,"children":285701},{"className":285699,"code":285700,"language":18718,"meta":7},[18716],"export async function summarizeRecording(connectionId: string, genaiConnectionId: string, recordingId: string) {\n  const recording = await getRecording(connectionId, recordingId);\n\n  // Use transcript if available, otherwise fallback to media or metadata\n const transcript =\nrecording.media?.[0]?.transcripts?.[0]?.text\n?? recording.media?.[0]?.transcript_download_url?? \"\";\n  if (!transcript) {\n    throw new Error(\"No transcript available for this recording.\");\n  }\n\n  const prompt = `Summarize the following meeting transcript:\\\\n\\\\n${transcript}`;\n\n  const result = await sdk.genai.createGenaiPrompt({\n    connectionId: genaiConnectionId,\n    prompt: {\n      messages: [{ role: \"USER\", content: prompt }],\n      maxTokens: 512,\n      temperature: 0.2,\n    },\n  });\n\n  return result.choices?.[0]?.message?.content || \"\";\n}\n",[285702],{"type":17,"tag":6121,"props":285703,"children":285704},{"__ignoreMap":7},[285705],{"type":23,"value":285700},{"type":17,"tag":29,"props":285707,"children":285708},{},[285709],{"type":17,"tag":48,"props":285710,"children":285711},{},[285712],{"type":23,"value":285713},"Optional: Turn this into a RAG pipeline",{"type":17,"tag":29,"props":285715,"children":285716},{},[285717,285719,285724,285725,285730,285731,285736],{"type":23,"value":285718},"If you want search, Q&A, or 'ask about any past meeting' features, store transcript chunks in your vector database. On each new or updated recording, fetch the transcript, chunk it, generate embeddings, and upsert them with identifiers like ",{"type":17,"tag":6121,"props":285720,"children":285722},{"className":285721},[],[285723],{"type":23,"value":25037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":285726,"children":285728},{"className":285727},[],[285729],{"type":23,"value":271952},{"type":23,"value":12561},{"type":17,"tag":6121,"props":285732,"children":285734},{"className":285733},[],[285735],{"type":23,"value":25337},{"type":23,"value":285737},". Then retrieve top matches at query time and pass them to your LLM.",{"type":17,"tag":25,"props":285739,"children":285740},{},[],{"type":17,"tag":68,"props":285742,"children":285744},{"id":285743},"step-7-example-usage",[285745],{"type":23,"value":285746},"Step 7: Example Usage",{"type":17,"tag":29,"props":285748,"children":285749},{},[285750],{"type":23,"value":285751},"Here's how you might use these functions in your workflow:",{"type":17,"tag":6893,"props":285753,"children":285756},{"className":285754,"code":285755,"language":18718,"meta":7},[18716],"async function main() {\n  // 1. List events\n  const events = await listEvents(CONNECTION_CALENDAR!);\n  console.log(\"Events:\", events);\n\n  // 2. List recordings\n  const recordings = await listRecordings(CONNECTION_CALENDAR!);\n  console.log(\"Recordings:\", recordings);\n\n  // 3. Summarize the first available recording\n  if (recordings.length > 0) {\n    const summary = await summarizeRecording(CONNECTION_CALENDAR!, CONNECTION_GENAI!, recordings[0].id);\n    console.log(\"AI Summary:\", summary);\n  } else {\n    console.log(\"No recordings found.\");\n  }\n}\n\nmain();\n",[285757],{"type":17,"tag":6121,"props":285758,"children":285759},{"__ignoreMap":7},[285760],{"type":23,"value":285755},{"type":17,"tag":25,"props":285762,"children":285763},{},[],{"type":17,"tag":29,"props":285765,"children":285766},{},[285767],{"type":23,"value":276933},{"title":7,"searchDepth":1629,"depth":1629,"links":285769},[285770,285771,285772,285773,285774,285775,285776,285777,285778],{"id":141798,"depth":1629,"text":141801},{"id":269318,"depth":1629,"text":269321},{"id":276695,"depth":1629,"text":276698},{"id":211235,"depth":1629,"text":211238},{"id":276756,"depth":1629,"text":276759},{"id":285628,"depth":1629,"text":285631},{"id":285651,"depth":1629,"text":285654},{"id":285688,"depth":1629,"text":285691},{"id":285743,"depth":1629,"text":285746},"content:blog:how_to_build_an_ai_powered_meeting_recording_summarization_with_unified.md","blog/how_to_build_an_ai_powered_meeting_recording_summarization_with_unified.md","blog/how_to_build_an_ai_powered_meeting_recording_summarization_with_unified",{"_path":285783,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":285784,"description":285785,"img":285786,"date":285787,"tag":12,"body":285788,"_type":1677,"_id":287193,"_source":1679,"_file":287194,"_stem":287195,"_extension":1682},"/blog/calendar_unified_apis_features_use_cases_and_how_to_choose_the_right_one","Calendar Unified APIs: Features, Use Cases, and How to Choose the Right One","The best unified API for calendar and meeting integrations depends on what your product actually needs.","https://s3.us-east-2.amazonaws.com/unified-article-images/calendar_unified_apis_features_use_cases_and_how_to_choose_the_right_one-icon.png","2025-09-18T22:00:00.000Z",{"type":14,"children":285789,"toc":287166},[285790,285795,285798,285806,285814,285824,285840,285844,285849,285854,285859,285892,285897,285915,285920,285926,285931,285936,286071,286076,286082,286087,286092,286097,286102,286120,286125,286133,286138,286142,286157,286161,286174,286178,286186,286191,286196,286200,286218,286227,286231,286236,286242,286247,286252,286267,286272,286276,286294,286299,286303,286308,286326,286331,286336,286352,286357,286363,286368,286379,286384,286415,286419,286434,286439,286445,286450,286454,286483,286488,286504,286509,286515,286520,286525,286543,286548,286552,286558,286564,286582,286588,286606,286611,286629,286634,286640,286860,286864,286869,286897,286903,286908,286926,286931,286936,286940,287039,287045,287050,287061,287066,287087,287092,287097,287102,287106,287134,287139,287144,287149],{"type":17,"tag":18,"props":285791,"children":285793},{"id":285792},"calendar-unified-apis-features-use-cases-and-how-to-choose-the-right-one",[285794],{"type":23,"value":285784},{"type":17,"tag":25,"props":285796,"children":285797},{},[],{"type":17,"tag":29,"props":285799,"children":285800},{},[285801],{"type":17,"tag":33,"props":285802,"children":285803},{},[285804],{"type":23,"value":285805},"September 18, 2025",{"type":17,"tag":29,"props":285807,"children":285808},{},[285809],{"type":17,"tag":6438,"props":285810,"children":285813},{"alt":285811,"src":285812},"virtual_streams.png","https://s3.us-east-2.amazonaws.com/unified-article-images/calendar_unified_apis_features_use_cases_and_how_to_choose_the_right_one-0.png",[],{"type":17,"tag":29,"props":285815,"children":285816},{},[285817,285818,285822],{"type":23,"value":98742},{"type":17,"tag":133,"props":285819,"children":285820},{"href":7691},[285821],{"type":23,"value":7459},{"type":23,"value":285823}," for calendar and meeting integrations depends on what your product actually needs.",{"type":17,"tag":29,"props":285825,"children":285826},{},[285827,285829,285833,285835,285839],{"type":23,"value":285828},"If you're building a scheduling-first product with complex booking logic, a specialized ",{"type":17,"tag":133,"props":285830,"children":285831},{"href":13708},[285832],{"type":23,"value":13711},{"type":23,"value":285834}," may be the right fit. But if your product needs calendar and meeting data alongside CRM, ATS, or AI workflows, ",{"type":17,"tag":48,"props":285836,"children":285837},{},[285838],{"type":23,"value":87523},{"type":23,"value":98759},{"type":17,"tag":68,"props":285841,"children":285842},{"id":98762},[285843],{"type":23,"value":98765},{"type":17,"tag":29,"props":285845,"children":285846},{},[285847],{"type":23,"value":285848},"Calendar integrations are often treated as simple infrastructure.",{"type":17,"tag":29,"props":285850,"children":285851},{},[285852],{"type":23,"value":285853},"In practice, they are one of the most fragile parts of a product.",{"type":17,"tag":29,"props":285855,"children":285856},{},[285857],{"type":23,"value":285858},"Across integrations, you'll encounter:",{"type":17,"tag":80,"props":285860,"children":285861},{},[285862,285867,285872,285877,285882,285887],{"type":17,"tag":84,"props":285863,"children":285864},{},[285865],{"type":23,"value":285866},"Different event schemas and attendee models",{"type":17,"tag":84,"props":285868,"children":285869},{},[285870],{"type":23,"value":285871},"Inconsistent free/busy and availability logic",{"type":17,"tag":84,"props":285873,"children":285874},{},[285875],{"type":23,"value":285876},"Recurring event edge cases",{"type":17,"tag":84,"props":285878,"children":285879},{},[285880],{"type":23,"value":285881},"Conferencing differences (Zoom, Meet, Teams)",{"type":17,"tag":84,"props":285883,"children":285884},{},[285885],{"type":23,"value":285886},"Missing or inconsistent recording and transcript access",{"type":17,"tag":84,"props":285888,"children":285889},{},[285890],{"type":23,"value":285891},"Varying lifecycle events (created, updated, deleted, started, ended)",{"type":17,"tag":29,"props":285893,"children":285894},{},[285895],{"type":23,"value":285896},"These differences matter because calendar data is often exposed directly to users.",{"type":17,"tag":80,"props":285898,"children":285899},{},[285900,285905,285910],{"type":17,"tag":84,"props":285901,"children":285902},{},[285903],{"type":23,"value":285904},"Scheduling flows break when availability is stale",{"type":17,"tag":84,"props":285906,"children":285907},{},[285908],{"type":23,"value":285909},"Interview coordination fails when updates lag",{"type":17,"tag":84,"props":285911,"children":285912},{},[285913],{"type":23,"value":285914},"AI assistants produce incorrect outputs when transcripts are incomplete",{"type":17,"tag":29,"props":285916,"children":285917},{},[285918],{"type":23,"value":285919},"Calendar integrations are no longer just about event creation. They are part of how your product schedules, coordinates, and analyzes real-world interactions.",{"type":17,"tag":68,"props":285921,"children":285923},{"id":285922},"what-to-evaluate-in-a-calendar-unified-api",[285924],{"type":23,"value":285925},"What to evaluate in a calendar unified API",{"type":17,"tag":29,"props":285927,"children":285928},{},[285929],{"type":23,"value":285930},"Most teams compare providers based on integrations supported. That is not enough.",{"type":17,"tag":29,"props":285932,"children":285933},{},[285934],{"type":23,"value":285935},"The decision should be based on how the API behaves under real product conditions.",{"type":17,"tag":7231,"props":285937,"children":285938},{},[285939,285957],{"type":17,"tag":7235,"props":285940,"children":285941},{},[285942],{"type":17,"tag":7239,"props":285943,"children":285944},{},[285945,285949,285953],{"type":17,"tag":7243,"props":285946,"children":285947},{},[285948],{"type":23,"value":98853},{"type":17,"tag":7243,"props":285950,"children":285951},{},[285952],{"type":23,"value":85072},{"type":17,"tag":7243,"props":285954,"children":285955},{},[285956],{"type":23,"value":98862},{"type":17,"tag":7259,"props":285958,"children":285959},{},[285960,285976,285992,286007,286024,286040,286055],{"type":17,"tag":7239,"props":285961,"children":285962},{},[285963,285967,285971],{"type":17,"tag":7266,"props":285964,"children":285965},{},[285966],{"type":23,"value":7359},{"type":17,"tag":7266,"props":285968,"children":285969},{},[285970],{"type":23,"value":98877},{"type":17,"tag":7266,"props":285972,"children":285973},{},[285974],{"type":23,"value":285975},"Real-time requests vs stored/synced state",{"type":17,"tag":7239,"props":285977,"children":285978},{},[285979,285983,285987],{"type":17,"tag":7266,"props":285980,"children":285981},{},[285982],{"type":23,"value":98890},{"type":17,"tag":7266,"props":285984,"children":285985},{},[285986],{"type":23,"value":98895},{"type":17,"tag":7266,"props":285988,"children":285989},{},[285990],{"type":23,"value":285991},"Events, availability, recordings, transcripts",{"type":17,"tag":7239,"props":285993,"children":285994},{},[285995,285999,286003],{"type":17,"tag":7266,"props":285996,"children":285997},{},[285998],{"type":23,"value":98908},{"type":17,"tag":7266,"props":286000,"children":286001},{},[286002],{"type":23,"value":98913},{"type":17,"tag":7266,"props":286004,"children":286005},{},[286006],{"type":23,"value":98918},{"type":17,"tag":7239,"props":286008,"children":286009},{},[286010,286014,286019],{"type":17,"tag":7266,"props":286011,"children":286012},{},[286013],{"type":23,"value":43896},{"type":17,"tag":7266,"props":286015,"children":286016},{},[286017],{"type":23,"value":286018},"Required for real-time updates",{"type":17,"tag":7266,"props":286020,"children":286021},{},[286022],{"type":23,"value":286023},"Native + fallback (virtual) delivery",{"type":17,"tag":7239,"props":286025,"children":286026},{},[286027,286031,286035],{"type":17,"tag":7266,"props":286028,"children":286029},{},[286030],{"type":23,"value":98961},{"type":17,"tag":7266,"props":286032,"children":286033},{},[286034],{"type":23,"value":98966},{"type":17,"tag":7266,"props":286036,"children":286037},{},[286038],{"type":23,"value":286039},"Works with CRM, ATS, messaging",{"type":17,"tag":7239,"props":286041,"children":286042},{},[286043,286047,286051],{"type":17,"tag":7266,"props":286044,"children":286045},{},[286046],{"type":23,"value":69493},{"type":17,"tag":7266,"props":286048,"children":286049},{},[286050],{"type":23,"value":98983},{"type":17,"tag":7266,"props":286052,"children":286053},{},[286054],{"type":23,"value":98988},{"type":17,"tag":7239,"props":286056,"children":286057},{},[286058,286062,286066],{"type":17,"tag":7266,"props":286059,"children":286060},{},[286061],{"type":23,"value":98996},{"type":17,"tag":7266,"props":286063,"children":286064},{},[286065],{"type":23,"value":99001},{"type":17,"tag":7266,"props":286067,"children":286068},{},[286069],{"type":23,"value":286070},"Usage-based vs per-connection",{"type":17,"tag":29,"props":286072,"children":286073},{},[286074],{"type":23,"value":286075},"This framework reflects how modern SaaS products actually use calendar data.",{"type":17,"tag":68,"props":286077,"children":286079},{"id":286078},"the-three-types-of-calendar-unified-apis",[286080],{"type":23,"value":286081},"The three types of calendar unified APIs",{"type":17,"tag":29,"props":286083,"children":286084},{},[286085],{"type":23,"value":286086},"There isn't a single category of 'calendar API.' There are three distinct approaches.",{"type":17,"tag":239,"props":286088,"children":286089},{"id":99034},[286090],{"type":23,"value":286091},"1) Scheduling specialists",{"type":17,"tag":29,"props":286093,"children":286094},{},[286095],{"type":23,"value":286096},"These APIs focus deeply on scheduling.",{"type":17,"tag":29,"props":286098,"children":286099},{},[286100],{"type":23,"value":286101},"Best when:",{"type":17,"tag":80,"props":286103,"children":286104},{},[286105,286110,286115],{"type":17,"tag":84,"props":286106,"children":286107},{},[286108],{"type":23,"value":286109},"scheduling is the core product",{"type":17,"tag":84,"props":286111,"children":286112},{},[286113],{"type":23,"value":286114},"complex booking rules are required",{"type":17,"tag":84,"props":286116,"children":286117},{},[286118],{"type":23,"value":286119},"availability logic is the main differentiator",{"type":17,"tag":29,"props":286121,"children":286122},{},[286123],{"type":23,"value":286124},"Limitation:",{"type":17,"tag":80,"props":286126,"children":286127},{},[286128],{"type":17,"tag":84,"props":286129,"children":286130},{},[286131],{"type":23,"value":286132},"calendar data is isolated from the rest of your product",{"type":17,"tag":239,"props":286134,"children":286135},{"id":99073},[286136],{"type":23,"value":286137},"2) Communications APIs",{"type":17,"tag":29,"props":286139,"children":286140},{},[286141],{"type":23,"value":99081},{"type":17,"tag":80,"props":286143,"children":286144},{},[286145,286149,286153],{"type":17,"tag":84,"props":286146,"children":286147},{},[286148],{"type":23,"value":62666},{"type":17,"tag":84,"props":286150,"children":286151},{},[286152],{"type":23,"value":99093},{"type":17,"tag":84,"props":286154,"children":286155},{},[286156],{"type":23,"value":30404},{"type":17,"tag":29,"props":286158,"children":286159},{},[286160],{"type":23,"value":286101},{"type":17,"tag":80,"props":286162,"children":286163},{},[286164,286169],{"type":17,"tag":84,"props":286165,"children":286166},{},[286167],{"type":23,"value":286168},"you need a unified communications layer",{"type":17,"tag":84,"props":286170,"children":286171},{},[286172],{"type":23,"value":286173},"inbox + calendar context is central",{"type":17,"tag":29,"props":286175,"children":286176},{},[286177],{"type":23,"value":286124},{"type":17,"tag":80,"props":286179,"children":286180},{},[286181],{"type":17,"tag":84,"props":286182,"children":286183},{},[286184],{"type":23,"value":286185},"limited beyond communications use cases",{"type":17,"tag":239,"props":286187,"children":286188},{"id":99122},[286189],{"type":23,"value":286190},"3) Broad integration platforms (with calendar support)",{"type":17,"tag":29,"props":286192,"children":286193},{},[286194],{"type":23,"value":286195},"These treat calendar as one category among many.",{"type":17,"tag":29,"props":286197,"children":286198},{},[286199],{"type":23,"value":286101},{"type":17,"tag":80,"props":286201,"children":286202},{},[286203,286208,286213],{"type":17,"tag":84,"props":286204,"children":286205},{},[286206],{"type":23,"value":286207},"calendar is part of a larger product",{"type":17,"tag":84,"props":286209,"children":286210},{},[286211],{"type":23,"value":286212},"you need integrations across systems",{"type":17,"tag":84,"props":286214,"children":286215},{},[286216],{"type":23,"value":286217},"you are building customer-facing features",{"type":17,"tag":29,"props":286219,"children":286220},{},[286221,286225],{"type":17,"tag":48,"props":286222,"children":286223},{},[286224],{"type":23,"value":99161},{"type":23,"value":286226},", with a focus on real-time execution and cross-category workflows.",{"type":17,"tag":68,"props":286228,"children":286229},{"id":99166},[286230],{"type":23,"value":99169},{"type":17,"tag":29,"props":286232,"children":286233},{},[286234],{"type":23,"value":286235},"Unified is not designed as a scheduling engine. It is designed as an integration layer for products that use calendar and meeting data alongside other systems.",{"type":17,"tag":239,"props":286237,"children":286239},{"id":286238},"real-time-access-to-calendar-and-meeting-data",[286240],{"type":23,"value":286241},"Real-time access to calendar and meeting data",{"type":17,"tag":29,"props":286243,"children":286244},{},[286245],{"type":23,"value":286246},"Unified executes requests directly against source APIs.",{"type":17,"tag":29,"props":286248,"children":286249},{},[286250],{"type":23,"value":286251},"When you retrieve:",{"type":17,"tag":80,"props":286253,"children":286254},{},[286255,286259,286263],{"type":17,"tag":84,"props":286256,"children":286257},{},[286258],{"type":23,"value":99198},{"type":17,"tag":84,"props":286260,"children":286261},{},[286262],{"type":23,"value":10342},{"type":17,"tag":84,"props":286264,"children":286265},{},[286266],{"type":23,"value":30419},{"type":17,"tag":29,"props":286268,"children":286269},{},[286270],{"type":23,"value":286271},"the data is fetched in real time from the underlying integration.",{"type":17,"tag":29,"props":286273,"children":286274},{},[286275],{"type":23,"value":99216},{"type":17,"tag":80,"props":286277,"children":286278},{},[286279,286284,286289],{"type":17,"tag":84,"props":286280,"children":286281},{},[286282],{"type":23,"value":286283},"scheduling depends on up-to-date availability",{"type":17,"tag":84,"props":286285,"children":286286},{},[286287],{"type":23,"value":286288},"reschedules and cancellations must propagate immediately",{"type":17,"tag":84,"props":286290,"children":286291},{},[286292],{"type":23,"value":286293},"AI features rely on current meeting data",{"type":17,"tag":29,"props":286295,"children":286296},{},[286297],{"type":23,"value":286298},"This approach avoids stale state entirely.",{"type":17,"tag":239,"props":286300,"children":286301},{"id":99242},[286302],{"type":23,"value":99245},{"type":17,"tag":29,"props":286304,"children":286305},{},[286306],{"type":23,"value":286307},"Calendar and meeting data is sensitive:",{"type":17,"tag":80,"props":286309,"children":286310},{},[286311,286316,286321],{"type":17,"tag":84,"props":286312,"children":286313},{},[286314],{"type":23,"value":286315},"meeting titles reveal deal or project context",{"type":17,"tag":84,"props":286317,"children":286318},{},[286319],{"type":23,"value":286320},"attendees expose internal and external relationships",{"type":17,"tag":84,"props":286322,"children":286323},{},[286324],{"type":23,"value":286325},"recordings and transcripts contain business-critical information",{"type":17,"tag":29,"props":286327,"children":286328},{},[286329],{"type":23,"value":286330},"Unified does not persist this data.",{"type":17,"tag":29,"props":286332,"children":286333},{},[286334],{"type":23,"value":286335},"Instead, it acts as a real-time access layer, reducing:",{"type":17,"tag":80,"props":286337,"children":286338},{},[286339,286343,286347],{"type":17,"tag":84,"props":286340,"children":286341},{},[286342],{"type":23,"value":99286},{"type":17,"tag":84,"props":286344,"children":286345},{},[286346],{"type":23,"value":99291},{"type":17,"tag":84,"props":286348,"children":286349},{},[286350],{"type":23,"value":286351},"long-term data liability",{"type":17,"tag":29,"props":286353,"children":286354},{},[286355],{"type":23,"value":286356},"This aligns with its broader architecture as real-time data infrastructure for SaaS and AI products.",{"type":17,"tag":239,"props":286358,"children":286360},{"id":286359},"more-than-just-events-full-meeting-lifecycle-coverage",[286361],{"type":23,"value":286362},"More than just events: full meeting lifecycle coverage",{"type":17,"tag":29,"props":286364,"children":286365},{},[286366],{"type":23,"value":286367},"Many APIs stop at:",{"type":17,"tag":80,"props":286369,"children":286370},{},[286371,286375],{"type":17,"tag":84,"props":286372,"children":286373},{},[286374],{"type":23,"value":99320},{"type":17,"tag":84,"props":286376,"children":286377},{},[286378],{"type":23,"value":99325},{"type":17,"tag":29,"props":286380,"children":286381},{},[286382],{"type":23,"value":286383},"Unified's calendar and meetings category supports:",{"type":17,"tag":80,"props":286385,"children":286386},{},[286387,286396,286405],{"type":17,"tag":84,"props":286388,"children":286389},{},[286390,286395],{"type":17,"tag":6121,"props":286391,"children":286393},{"className":286392},[],[286394],{"type":23,"value":73973},{"type":23,"value":99351},{"type":17,"tag":84,"props":286397,"children":286398},{},[286399,286404],{"type":17,"tag":6121,"props":286400,"children":286402},{"className":286401},[],[286403],{"type":23,"value":99360},{"type":23,"value":99362},{"type":17,"tag":84,"props":286406,"children":286407},{},[286408,286413],{"type":17,"tag":6121,"props":286409,"children":286411},{"className":286410},[],[286412],{"type":23,"value":74195},{"type":23,"value":286414}," for recordings and transcripts (where supported)",{"type":17,"tag":29,"props":286416,"children":286417},{},[286418],{"type":23,"value":79138},{"type":17,"tag":80,"props":286420,"children":286421},{},[286422,286426,286430],{"type":17,"tag":84,"props":286423,"children":286424},{},[286425],{"type":23,"value":41533},{"type":17,"tag":84,"props":286427,"children":286428},{},[286429],{"type":23,"value":99390},{"type":17,"tag":84,"props":286431,"children":286432},{},[286433],{"type":23,"value":99395},{"type":17,"tag":29,"props":286435,"children":286436},{},[286437],{"type":23,"value":286438},"not just calendar access.",{"type":17,"tag":239,"props":286440,"children":286442},{"id":286441},"strong-foundation-for-ai-meeting-products",[286443],{"type":23,"value":286444},"Strong foundation for AI meeting products",{"type":17,"tag":29,"props":286446,"children":286447},{},[286448],{"type":23,"value":286449},"Calendar integrations are now a primary input into AI systems.",{"type":17,"tag":29,"props":286451,"children":286452},{},[286453],{"type":23,"value":168366},{"type":17,"tag":80,"props":286455,"children":286456},{},[286457,286461,286465,286469,286478],{"type":17,"tag":84,"props":286458,"children":286459},{},[286460],{"type":23,"value":99419},{"type":17,"tag":84,"props":286462,"children":286463},{},[286464],{"type":23,"value":99424},{"type":17,"tag":84,"props":286466,"children":286467},{},[286468],{"type":23,"value":99429},{"type":17,"tag":84,"props":286470,"children":286471},{},[286472,286473,286477],{"type":23,"value":99434},{"type":17,"tag":133,"props":286474,"children":286475},{"href":5201},[286476],{"type":23,"value":5204},{"type":23,"value":12034},{"type":17,"tag":84,"props":286479,"children":286480},{},[286481],{"type":23,"value":286482},"automated follow-ups",{"type":17,"tag":29,"props":286484,"children":286485},{},[286486],{"type":23,"value":286487},"These require:",{"type":17,"tag":80,"props":286489,"children":286490},{},[286491,286495,286499],{"type":17,"tag":84,"props":286492,"children":286493},{},[286494],{"type":23,"value":99457},{"type":17,"tag":84,"props":286496,"children":286497},{},[286498],{"type":23,"value":99467},{"type":17,"tag":84,"props":286500,"children":286501},{},[286502],{"type":23,"value":286503},"structured meeting data",{"type":17,"tag":29,"props":286505,"children":286506},{},[286507],{"type":23,"value":286508},"Unified provides normalized access to recordings and transcripts across integrations, making them usable for AI pipelines without building separate integrations per platform.",{"type":17,"tag":239,"props":286510,"children":286512},{"id":286511},"built-for-cross-category-product-workflows",[286513],{"type":23,"value":286514},"Built for cross-category product workflows",{"type":17,"tag":29,"props":286516,"children":286517},{},[286518],{"type":23,"value":286519},"Calendar data rarely operates in isolation.",{"type":17,"tag":29,"props":286521,"children":286522},{},[286523],{"type":23,"value":286524},"Typical product workflows include:",{"type":17,"tag":80,"props":286526,"children":286527},{},[286528,286533,286538],{"type":17,"tag":84,"props":286529,"children":286530},{},[286531],{"type":23,"value":286532},"ATS + Calendar → interview scheduling",{"type":17,"tag":84,"props":286534,"children":286535},{},[286536],{"type":23,"value":286537},"Calendar + CRM → meeting activity tracking",{"type":17,"tag":84,"props":286539,"children":286540},{},[286541],{"type":23,"value":286542},"Calendar + AI → summaries and recommendations",{"type":17,"tag":29,"props":286544,"children":286545},{},[286546],{"type":23,"value":286547},"Unified supports these workflows because calendar is one category within a broader integration platform.",{"type":17,"tag":29,"props":286549,"children":286550},{},[286551],{"type":23,"value":99516},{"type":17,"tag":68,"props":286553,"children":286555},{"id":286554},"use-cases-for-a-calendar-unified-api",[286556],{"type":23,"value":286557},"Use cases for a calendar unified API",{"type":17,"tag":239,"props":286559,"children":286561},{"id":286560},"scheduling-and-availability",[286562],{"type":23,"value":286563},"Scheduling and availability",{"type":17,"tag":80,"props":286565,"children":286566},{},[286567,286572,286577],{"type":17,"tag":84,"props":286568,"children":286569},{},[286570],{"type":23,"value":286571},"Create and manage events across integrations",{"type":17,"tag":84,"props":286573,"children":286574},{},[286575],{"type":23,"value":286576},"Retrieve free/busy data",{"type":17,"tag":84,"props":286578,"children":286579},{},[286580],{"type":23,"value":286581},"compute availability across participants",{"type":17,"tag":239,"props":286583,"children":286585},{"id":286584},"meeting-intelligence-and-ai",[286586],{"type":23,"value":286587},"Meeting intelligence and AI",{"type":17,"tag":80,"props":286589,"children":286590},{},[286591,286596,286601],{"type":17,"tag":84,"props":286592,"children":286593},{},[286594],{"type":23,"value":286595},"Retrieve recordings and transcripts",{"type":17,"tag":84,"props":286597,"children":286598},{},[286599],{"type":23,"value":286600},"generate summaries and action items",{"type":17,"tag":84,"props":286602,"children":286603},{},[286604],{"type":23,"value":286605},"power meeting search and retrieval systems",{"type":17,"tag":239,"props":286607,"children":286608},{"id":175814},[286609],{"type":23,"value":286610},"Cross-system workflows",{"type":17,"tag":80,"props":286612,"children":286613},{},[286614,286619,286624],{"type":17,"tag":84,"props":286615,"children":286616},{},[286617],{"type":23,"value":286618},"Log meetings to CRM",{"type":17,"tag":84,"props":286620,"children":286621},{},[286622],{"type":23,"value":286623},"coordinate interviews with ATS",{"type":17,"tag":84,"props":286625,"children":286626},{},[286627],{"type":23,"value":286628},"trigger notifications in messaging tools",{"type":17,"tag":29,"props":286630,"children":286631},{},[286632],{"type":23,"value":286633},"These use cases increasingly overlap, which is why architecture matters.",{"type":17,"tag":68,"props":286635,"children":286637},{"id":286636},"comparing-calendar-unified-api-providers",[286638],{"type":23,"value":286639},"Comparing calendar unified API providers",{"type":17,"tag":7231,"props":286641,"children":286642},{},[286643,286674],{"type":17,"tag":7235,"props":286644,"children":286645},{},[286646],{"type":17,"tag":7239,"props":286647,"children":286648},{},[286649,286653,286657,286661,286665,286669],{"type":17,"tag":7243,"props":286650,"children":286651},{},[286652],{"type":23,"value":249214},{"type":17,"tag":7243,"props":286654,"children":286655},{},[286656],{"type":23,"value":87523},{"type":17,"tag":7243,"props":286658,"children":286659},{},[286660],{"type":23,"value":237},{"type":17,"tag":7243,"props":286662,"children":286663},{},[286664],{"type":23,"value":581},{"type":17,"tag":7243,"props":286666,"children":286667},{},[286668],{"type":23,"value":226656},{"type":17,"tag":7243,"props":286670,"children":286671},{},[286672],{"type":23,"value":286673},"Cronofy",{"type":17,"tag":7259,"props":286675,"children":286676},{},[286677,286709,286740,286772,286802,286830],{"type":17,"tag":7239,"props":286678,"children":286679},{},[286680,286685,286690,286695,286700,286705],{"type":17,"tag":7266,"props":286681,"children":286682},{},[286683],{"type":23,"value":286684},"Integration breadth",{"type":17,"tag":7266,"props":286686,"children":286687},{},[286688],{"type":23,"value":286689},"27+ calendar & meeting integrations across calendars, schedulers, conferencing, and recording platforms",{"type":17,"tag":7266,"props":286691,"children":286692},{},[286693],{"type":23,"value":286694},"Limited calendar coverage",{"type":17,"tag":7266,"props":286696,"children":286697},{},[286698],{"type":23,"value":286699},"Limited breadth",{"type":17,"tag":7266,"props":286701,"children":286702},{},[286703],{"type":23,"value":286704},"Strong on core calendars",{"type":17,"tag":7266,"props":286706,"children":286707},{},[286708],{"type":23,"value":286704},{"type":17,"tag":7239,"props":286710,"children":286711},{},[286712,286716,286721,286725,286730,286735],{"type":17,"tag":7266,"props":286713,"children":286714},{},[286715],{"type":23,"value":7359},{"type":17,"tag":7266,"props":286717,"children":286718},{},[286719],{"type":23,"value":286720},"Real-time execution, no stored customer data",{"type":17,"tag":7266,"props":286722,"children":286723},{},[286724],{"type":23,"value":230185},{"type":17,"tag":7266,"props":286726,"children":286727},{},[286728],{"type":23,"value":286729},"Workflow-based",{"type":17,"tag":7266,"props":286731,"children":286732},{},[286733],{"type":23,"value":286734},"Mixed depending on integration",{"type":17,"tag":7266,"props":286736,"children":286737},{},[286738],{"type":23,"value":286739},"Hybrid (availability caching)",{"type":17,"tag":7239,"props":286741,"children":286742},{},[286743,286748,286752,286757,286762,286767],{"type":17,"tag":7266,"props":286744,"children":286745},{},[286746],{"type":23,"value":286747},"Schema depth",{"type":17,"tag":7266,"props":286749,"children":286750},{},[286751],{"type":23,"value":285991},{"type":17,"tag":7266,"props":286753,"children":286754},{},[286755],{"type":23,"value":286756},"Shallow",{"type":17,"tag":7266,"props":286758,"children":286759},{},[286760],{"type":23,"value":286761},"No unified model",{"type":17,"tag":7266,"props":286763,"children":286764},{},[286765],{"type":23,"value":286766},"Events only",{"type":17,"tag":7266,"props":286768,"children":286769},{},[286770],{"type":23,"value":286771},"Events + availability",{"type":17,"tag":7239,"props":286773,"children":286774},{},[286775,286780,286785,286789,286794,286798],{"type":17,"tag":7266,"props":286776,"children":286777},{},[286778],{"type":23,"value":286779},"CRUD",{"type":17,"tag":7266,"props":286781,"children":286782},{},[286783],{"type":23,"value":286784},"Full read/write across supported integrations",{"type":17,"tag":7266,"props":286786,"children":286787},{},[286788],{"type":23,"value":263923},{"type":17,"tag":7266,"props":286790,"children":286791},{},[286792],{"type":23,"value":286793},"Per-connector",{"type":17,"tag":7266,"props":286795,"children":286796},{},[286797],{"type":23,"value":169567},{"type":17,"tag":7266,"props":286799,"children":286800},{},[286801],{"type":23,"value":169567},{"type":17,"tag":7239,"props":286803,"children":286804},{},[286805,286809,286814,286818,286822,286826],{"type":17,"tag":7266,"props":286806,"children":286807},{},[286808],{"type":23,"value":69493},{"type":17,"tag":7266,"props":286810,"children":286811},{},[286812],{"type":23,"value":286813},"Strong (transcripts + recordings)",{"type":17,"tag":7266,"props":286815,"children":286816},{},[286817],{"type":23,"value":162634},{"type":17,"tag":7266,"props":286819,"children":286820},{},[286821],{"type":23,"value":162634},{"type":17,"tag":7266,"props":286823,"children":286824},{},[286825],{"type":23,"value":263923},{"type":17,"tag":7266,"props":286827,"children":286828},{},[286829],{"type":23,"value":162634},{"type":17,"tag":7239,"props":286831,"children":286832},{},[286833,286837,286842,286846,286850,286855],{"type":17,"tag":7266,"props":286834,"children":286835},{},[286836],{"type":23,"value":98961},{"type":17,"tag":7266,"props":286838,"children":286839},{},[286840],{"type":23,"value":286841},"400+ integrations across ~25 categories",{"type":17,"tag":7266,"props":286843,"children":286844},{},[286845],{"type":23,"value":162634},{"type":17,"tag":7266,"props":286847,"children":286848},{},[286849],{"type":23,"value":264245},{"type":17,"tag":7266,"props":286851,"children":286852},{},[286853],{"type":23,"value":286854},"Communications-focused",{"type":17,"tag":7266,"props":286856,"children":286857},{},[286858],{"type":23,"value":286859},"Calendar-only",{"type":17,"tag":68,"props":286861,"children":286862},{"id":103278},[286863],{"type":23,"value":103281},{"type":17,"tag":29,"props":286865,"children":286866},{},[286867],{"type":23,"value":286868},"Unified is the strongest option when:",{"type":17,"tag":80,"props":286870,"children":286871},{},[286872,286877,286882,286887,286892],{"type":17,"tag":84,"props":286873,"children":286874},{},[286875],{"type":23,"value":286876},"calendar is a feature, not the product",{"type":17,"tag":84,"props":286878,"children":286879},{},[286880],{"type":23,"value":286881},"you need recordings and transcripts",{"type":17,"tag":84,"props":286883,"children":286884},{},[286885],{"type":23,"value":286886},"you are building AI-driven features",{"type":17,"tag":84,"props":286888,"children":286889},{},[286890],{"type":23,"value":286891},"calendar data must connect to CRM, ATS, or other systems",{"type":17,"tag":84,"props":286893,"children":286894},{},[286895],{"type":23,"value":286896},"you want real-time data without storing customer calendar data",{"type":17,"tag":68,"props":286898,"children":286900},{"id":286899},"when-a-specialist-may-be-a-better-fit",[286901],{"type":23,"value":286902},"When a specialist may be a better fit",{"type":17,"tag":29,"props":286904,"children":286905},{},[286906],{"type":23,"value":286907},"A scheduling-focused API may be better if:",{"type":17,"tag":80,"props":286909,"children":286910},{},[286911,286916,286921],{"type":17,"tag":84,"props":286912,"children":286913},{},[286914],{"type":23,"value":286915},"your product is primarily a booking engine",{"type":17,"tag":84,"props":286917,"children":286918},{},[286919],{"type":23,"value":286920},"advanced scheduling logic is your core differentiator",{"type":17,"tag":84,"props":286922,"children":286923},{},[286924],{"type":23,"value":286925},"calendar is the entire product experience",{"type":17,"tag":29,"props":286927,"children":286928},{},[286929],{"type":23,"value":286930},"These are narrower use cases.",{"type":17,"tag":29,"props":286932,"children":286933},{},[286934],{"type":23,"value":286935},"Most B2B SaaS products need calendar data as part of a larger system.",{"type":17,"tag":68,"props":286937,"children":286938},{"id":99634},[286939],{"type":23,"value":99637},{"type":17,"tag":7231,"props":286941,"children":286942},{},[286943,286957],{"type":17,"tag":7235,"props":286944,"children":286945},{},[286946],{"type":17,"tag":7239,"props":286947,"children":286948},{},[286949,286953],{"type":17,"tag":7243,"props":286950,"children":286951},{},[286952],{"type":23,"value":96563},{"type":17,"tag":7243,"props":286954,"children":286955},{},[286956],{"type":23,"value":80744},{"type":17,"tag":7259,"props":286958,"children":286959},{},[286960,286971,286982,286996,287011,287025],{"type":17,"tag":7239,"props":286961,"children":286962},{},[286963,286967],{"type":17,"tag":7266,"props":286964,"children":286965},{},[286966],{"type":23,"value":99665},{"type":17,"tag":7266,"props":286968,"children":286969},{},[286970],{"type":23,"value":99670},{"type":17,"tag":7239,"props":286972,"children":286973},{},[286974,286978],{"type":17,"tag":7266,"props":286975,"children":286976},{},[286977],{"type":23,"value":99678},{"type":17,"tag":7266,"props":286979,"children":286980},{},[286981],{"type":23,"value":99683},{"type":17,"tag":7239,"props":286983,"children":286984},{},[286985,286989],{"type":17,"tag":7266,"props":286986,"children":286987},{},[286988],{"type":23,"value":99691},{"type":17,"tag":7266,"props":286990,"children":286991},{},[286992],{"type":17,"tag":48,"props":286993,"children":286994},{},[286995],{"type":23,"value":87523},{"type":17,"tag":7239,"props":286997,"children":286998},{},[286999,287004],{"type":17,"tag":7266,"props":287000,"children":287001},{},[287002],{"type":23,"value":287003},"Multi-category SaaS integrations",{"type":17,"tag":7266,"props":287005,"children":287006},{},[287007],{"type":17,"tag":48,"props":287008,"children":287009},{},[287010],{"type":23,"value":87523},{"type":17,"tag":7239,"props":287012,"children":287013},{},[287014,287018],{"type":17,"tag":7266,"props":287015,"children":287016},{},[287017],{"type":23,"value":99721},{"type":17,"tag":7266,"props":287019,"children":287020},{},[287021],{"type":17,"tag":48,"props":287022,"children":287023},{},[287024],{"type":23,"value":87523},{"type":17,"tag":7239,"props":287026,"children":287027},{},[287028,287032],{"type":17,"tag":7266,"props":287029,"children":287030},{},[287031],{"type":23,"value":99736},{"type":17,"tag":7266,"props":287033,"children":287034},{},[287035],{"type":17,"tag":48,"props":287036,"children":287037},{},[287038],{"type":23,"value":87523},{"type":17,"tag":68,"props":287040,"children":287042},{"id":287041},"why-this-decision-has-changed",[287043],{"type":23,"value":287044},"Why this decision has changed",{"type":17,"tag":29,"props":287046,"children":287047},{},[287048],{"type":23,"value":287049},"A few years ago, calendar APIs were evaluated based on:",{"type":17,"tag":80,"props":287051,"children":287052},{},[287053,287057],{"type":17,"tag":84,"props":287054,"children":287055},{},[287056],{"type":23,"value":99810},{"type":17,"tag":84,"props":287058,"children":287059},{},[287060],{"type":23,"value":10342},{"type":17,"tag":29,"props":287062,"children":287063},{},[287064],{"type":23,"value":287065},"Today, they support:",{"type":17,"tag":80,"props":287067,"children":287068},{},[287069,287073,287077,287082],{"type":17,"tag":84,"props":287070,"children":287071},{},[287072],{"type":23,"value":99772},{"type":17,"tag":84,"props":287074,"children":287075},{},[287076],{"type":23,"value":99782},{"type":17,"tag":84,"props":287078,"children":287079},{},[287080],{"type":23,"value":287081},"AI-driven workflows",{"type":17,"tag":84,"props":287083,"children":287084},{},[287085],{"type":23,"value":287086},"cross-system automation",{"type":17,"tag":29,"props":287088,"children":287089},{},[287090],{"type":23,"value":287091},"This shifts the decision.",{"type":17,"tag":29,"props":287093,"children":287094},{},[287095],{"type":23,"value":287096},"The best API is no longer the one with the deepest scheduling logic.",{"type":17,"tag":29,"props":287098,"children":287099},{},[287100],{"type":23,"value":287101},"It is the one that fits how your product actually uses calendar and meeting data.",{"type":17,"tag":68,"props":287103,"children":287104},{"id":7672},[287105],{"type":23,"value":7675},{"type":17,"tag":80,"props":287107,"children":287108},{},[287109,287114,287119,287124,287129],{"type":17,"tag":84,"props":287110,"children":287111},{},[287112],{"type":23,"value":287113},"The best calendar unified API depends on whether calendar is your product or part of your product",{"type":17,"tag":84,"props":287115,"children":287116},{},[287117],{"type":23,"value":287118},"Scheduling specialists are strongest for booking-heavy applications",{"type":17,"tag":84,"props":287120,"children":287121},{},[287122],{"type":23,"value":287123},"Unified is strongest for modern SaaS products that need calendar data alongside other systems",{"type":17,"tag":84,"props":287125,"children":287126},{},[287127],{"type":23,"value":287128},"Real-time execution and no stored customer data matter for scheduling, AI, and compliance",{"type":17,"tag":84,"props":287130,"children":287131},{},[287132],{"type":23,"value":287133},"Meeting integrations now need to support recordings, transcripts, and AI—not just events",{"type":17,"tag":29,"props":287135,"children":287136},{},[287137],{"type":23,"value":287138},"If your product relies on scheduling, meeting data, and downstream workflows, calendar is no longer an isolated integration.",{"type":17,"tag":29,"props":287140,"children":287141},{},[287142],{"type":23,"value":287143},"It is part of your product's core data layer.",{"type":17,"tag":29,"props":287145,"children":287146},{},[287147],{"type":23,"value":287148},"And that is where a broader, real-time unified API like Unified becomes the better long-term choice.",{"type":17,"tag":29,"props":287150,"children":287151},{},[287152,287158,287159,287164],{"type":17,"tag":133,"props":287153,"children":287155},{"href":99333,"rel":287154},[214],[287156],{"type":23,"value":287157},"Read the docs",{"type":23,"value":75890},{"type":17,"tag":133,"props":287160,"children":287162},{"href":1623,"rel":287161},[214],[287163],{"type":23,"value":226481},{"type":23,"value":287165}," to learn how Unified can accelerate your integration roadmap.",{"title":7,"searchDepth":1629,"depth":1629,"links":287167},[287168,287169,287170,287175,287182,287187,287188,287189,287190,287191,287192],{"id":98762,"depth":1629,"text":98765},{"id":285922,"depth":1629,"text":285925},{"id":286078,"depth":1629,"text":286081,"children":287171},[287172,287173,287174],{"id":99034,"depth":1635,"text":286091},{"id":99073,"depth":1635,"text":286137},{"id":99122,"depth":1635,"text":286190},{"id":99166,"depth":1629,"text":99169,"children":287176},[287177,287178,287179,287180,287181],{"id":286238,"depth":1635,"text":286241},{"id":99242,"depth":1635,"text":99245},{"id":286359,"depth":1635,"text":286362},{"id":286441,"depth":1635,"text":286444},{"id":286511,"depth":1635,"text":286514},{"id":286554,"depth":1629,"text":286557,"children":287183},[287184,287185,287186],{"id":286560,"depth":1635,"text":286563},{"id":286584,"depth":1635,"text":286587},{"id":175814,"depth":1635,"text":286610},{"id":286636,"depth":1629,"text":286639},{"id":103278,"depth":1629,"text":103281},{"id":286899,"depth":1629,"text":286902},{"id":99634,"depth":1629,"text":99637},{"id":287041,"depth":1629,"text":287044},{"id":7672,"depth":1629,"text":7675},"content:blog:calendar_unified_apis_features_use_cases_and_how_to_choose_the_right_one.md","blog/calendar_unified_apis_features_use_cases_and_how_to_choose_the_right_one.md","blog/calendar_unified_apis_features_use_cases_and_how_to_choose_the_right_one",{"_path":287197,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":287198,"description":287199,"img":287200,"date":287201,"tag":6341,"body":287202,"_type":1677,"_id":287486,"_source":1679,"_file":287487,"_stem":287488,"_extension":1682},"/blog/how_to_build_a_fintech_application_with_unified_payments_api","How to Build a Fintech Application with Unified's Payments API","With Unified, you can build fin-tech products that work with your end customers payment providers. With a single integration you can connect payment processors...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_fintech_application_with_unified_payments_api-icon.png","2025-09-09T00:00:00.000Z",{"type":14,"children":287203,"toc":287474},[287204,287209,287212,287220,287226,287231,287236,287241,287251,287254,287258,287283,287286,287290,287295,287304,287314,287323,287326,287330,287339,287342,287346,287351,287356,287362,287371,287374,287380,287389,287392,287398,287407,287410,287416,287425,287428,287434,287443,287446,287452,287457,287466,287469],{"type":17,"tag":18,"props":287205,"children":287207},{"id":287206},"how-to-build-a-fintech-application-with-unifieds-payments-api",[287208],{"type":23,"value":287198},{"type":17,"tag":25,"props":287210,"children":287211},{},[],{"type":17,"tag":29,"props":287213,"children":287214},{},[287215],{"type":17,"tag":33,"props":287216,"children":287217},{},[287218],{"type":23,"value":287219},"September 9, 2025",{"type":17,"tag":18,"props":287221,"children":287223},{"id":287222},"introduction",[287224],{"type":23,"value":287225},"Introduction",{"type":17,"tag":29,"props":287227,"children":287228},{},[287229],{"type":23,"value":287230},"With Unified, you can build fin-tech products that work with your end customers payment providers. With a single integration you can connect payment processors like Stripe, PayPal, GoCardless and more!",{"type":17,"tag":29,"props":287232,"children":287233},{},[287234],{"type":23,"value":287235},"You can do various things such as creating payments, generating payment links, manage payouts and even handle refunds - all without building custom connectors for each payment provider.",{"type":17,"tag":29,"props":287237,"children":287238},{},[287239],{"type":23,"value":287240},"In this guide, we will show you how to create and list payments as well as some related data. For the example we will be using Stripe, but this approach works for any of the payment integrations supported by Unified.",{"type":17,"tag":29,"props":287242,"children":287243},{},[287244],{"type":17,"tag":133,"props":287245,"children":287248},{"href":287246,"rel":287247},"https://docs.unified.to/payment/integrations",[214],[287249],{"type":23,"value":287250},"See the full list of supported payment integrations.",{"type":17,"tag":25,"props":287252,"children":287253},{},[],{"type":17,"tag":68,"props":287255,"children":287256},{"id":141798},[287257],{"type":23,"value":141801},{"type":17,"tag":80,"props":287259,"children":287260},{},[287261,287265,287270,287278],{"type":17,"tag":84,"props":287262,"children":287263},{},[287264],{"type":23,"value":276661},{"type":17,"tag":84,"props":287266,"children":287267},{},[287268],{"type":23,"value":287269},"Unified account with a payment integration enabled (e.g., Stripe)",{"type":17,"tag":84,"props":287271,"children":287272},{},[287273,287277],{"type":17,"tag":133,"props":287274,"children":287275},{"href":7691},[287276],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":287279,"children":287280},{},[287281],{"type":23,"value":287282},"Your customer's payment processor connection ID",{"type":17,"tag":25,"props":287284,"children":287285},{},[],{"type":17,"tag":68,"props":287287,"children":287288},{"id":276695},[287289],{"type":23,"value":276698},{"type":17,"tag":29,"props":287291,"children":287292},{},[287293],{"type":23,"value":287294},"Set up your dependencies",{"type":17,"tag":6893,"props":287296,"children":287299},{"className":287297,"code":287298,"language":48432,"meta":7},[48430],"mkdir payments-demo\ncd payments-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[287300],{"type":17,"tag":6121,"props":287301,"children":287302},{"__ignoreMap":7},[287303],{"type":23,"value":287298},{"type":17,"tag":29,"props":287305,"children":287306},{},[287307,287308,287313],{"type":23,"value":276717},{"type":17,"tag":6121,"props":287309,"children":287311},{"className":287310},[],[287312],{"type":23,"value":211221},{"type":23,"value":20456},{"type":17,"tag":6893,"props":287315,"children":287318},{"className":287316,"code":287317,"language":20901,"meta":23},[20899],"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_STRIPE=your_customer_stripe_connection_id\n",[287319],{"type":17,"tag":6121,"props":287320,"children":287321},{"__ignoreMap":7},[287322],{"type":23,"value":287317},{"type":17,"tag":25,"props":287324,"children":287325},{},[],{"type":17,"tag":68,"props":287327,"children":287328},{"id":211235},[287329],{"type":23,"value":211238},{"type":17,"tag":6893,"props":287331,"children":287334},{"className":287332,"code":287333,"language":18718,"meta":7},[18716],"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_STRIPE } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[287335],{"type":17,"tag":6121,"props":287336,"children":287337},{"__ignoreMap":7},[287338],{"type":23,"value":287333},{"type":17,"tag":25,"props":287340,"children":287341},{},[],{"type":17,"tag":68,"props":287343,"children":287344},{"id":276756},[287345],{"type":23,"value":276759},{"type":17,"tag":29,"props":287347,"children":287348},{},[287349],{"type":23,"value":287350},"Before you can list payments, your customer must authorize your app to access their payment provider via Unified's embedded auth flow.",{"type":17,"tag":29,"props":287352,"children":287353},{},[287354],{"type":23,"value":287355},"Once authorized, you'll receive a connection ID for each integrations.",{"type":17,"tag":68,"props":287357,"children":287359},{"id":287358},"step-4-listing-payments",[287360],{"type":23,"value":287361},"Step 4: Listing Payments",{"type":17,"tag":6893,"props":287363,"children":287366},{"className":287364,"code":287365,"language":18718,"meta":7},[18716],"export async function listPayments(connectionId: string) {\n  const payments = await sdk.payment.listPaymentPayments({\n    connectionId,\n    limit: 10,\n  });\n  return payments; // PaymentPayment[]\n}\n",[287367],{"type":17,"tag":6121,"props":287368,"children":287369},{"__ignoreMap":7},[287370],{"type":23,"value":287365},{"type":17,"tag":25,"props":287372,"children":287373},{},[],{"type":17,"tag":68,"props":287375,"children":287377},{"id":287376},"step-5-creating-a-payment-link",[287378],{"type":23,"value":287379},"Step 5: Creating a Payment Link",{"type":17,"tag":6893,"props":287381,"children":287384},{"className":287382,"code":287383,"language":18718,"meta":7},[18716],"export async function createPaymentLink(connectionId: string, amount: number, currency: string) {\n  const link = await sdk.link.createPaymentLink({\n    connectionId,\n    paymentLink: {\n      amount,\n      currency,\n      isActive: true,\n      successUrl: \"\u003Chttps://example.com/success>\",\n      // Stripe typically requires line items on links\n      lineitems: [\n        {\n          itemName: \"Order #123\",\n          unitAmount: amount,\n          unitQuantity: 1,\n          itemSku: \"SKU-123\",\n        },\n      ],\n    },\n  });\n  return link; // PaymentLink\n}\n",[287385],{"type":17,"tag":6121,"props":287386,"children":287387},{"__ignoreMap":7},[287388],{"type":23,"value":287383},{"type":17,"tag":25,"props":287390,"children":287391},{},[],{"type":17,"tag":68,"props":287393,"children":287395},{"id":287394},"step-6-listing-refunds",[287396],{"type":23,"value":287397},"Step 6: Listing Refunds",{"type":17,"tag":6893,"props":287399,"children":287402},{"className":287400,"code":287401,"language":18718,"meta":7},[18716],"export async function listRefunds(connectionId: string) {\n  const refunds = await sdk.refund.listPaymentRefunds({\n    connectionId,\n    limit: 10,\n  });\n  return refunds; // PaymentRefund[]\n}\n",[287403],{"type":17,"tag":6121,"props":287404,"children":287405},{"__ignoreMap":7},[287406],{"type":23,"value":287401},{"type":17,"tag":25,"props":287408,"children":287409},{},[],{"type":17,"tag":68,"props":287411,"children":287413},{"id":287412},"step-7-listing-payouts",[287414],{"type":23,"value":287415},"Step 7: Listing Payouts",{"type":17,"tag":6893,"props":287417,"children":287420},{"className":287418,"code":287419,"language":18718,"meta":7},[18716],"export async function listPayouts(connectionId: string) {\n  const payouts = await sdk.payout.listPaymentPayouts({\n    connectionId,\n    limit: 10,\n  });\n  return payouts; // PaymentPayout[]\n}\n",[287421],{"type":17,"tag":6121,"props":287422,"children":287423},{"__ignoreMap":7},[287424],{"type":23,"value":287419},{"type":17,"tag":25,"props":287426,"children":287427},{},[],{"type":17,"tag":68,"props":287429,"children":287431},{"id":287430},"step-8-listing-subscriptions",[287432],{"type":23,"value":287433},"Step 8: Listing Subscriptions",{"type":17,"tag":6893,"props":287435,"children":287438},{"className":287436,"code":287437,"language":18718,"meta":7},[18716],"export async function listSubscriptions(connectionId: string) {\n  const subs = await sdk.subscription.listPaymentSubscriptions({\n    connectionId,\n    limit: 10,\n  });\n  return subs; // PaymentSubscription[]\n}\n",[287439],{"type":17,"tag":6121,"props":287440,"children":287441},{"__ignoreMap":7},[287442],{"type":23,"value":287437},{"type":17,"tag":25,"props":287444,"children":287445},{},[],{"type":17,"tag":68,"props":287447,"children":287449},{"id":287448},"step-9-example-usage",[287450],{"type":23,"value":287451},"Step 9: Example Usage",{"type":17,"tag":29,"props":287453,"children":287454},{},[287455],{"type":23,"value":287456},"Here's how you might use these functions in your payment workflow:",{"type":17,"tag":6893,"props":287458,"children":287461},{"className":287459,"code":287460,"language":18718,"meta":7},[18716],"async function main() {\n  // 1. Create a payment\n  const payment = await createPayment(CONNECTION_STRIPE!, 1000, \"USD\");\n\n  // 2. List payments\n  const payments = await listPayments(CONNECTION_STRIPE!);\n\n  // 3. Create a payment link\n  const link = await createPaymentLink(CONNECTION_STRIPE!, 1000, \"USD\");\n\n  // 4. List links\n  const links = await sdk.link.listPaymentLinks({ connectionId: CONNECTION_STRIPE!, limit: 10 });\n\n  // 5. List refunds\n  const refunds = await listRefunds(CONNECTION_STRIPE!);\n\n  // 6. List payouts\n  const payouts = await listPayouts(CONNECTION_STRIPE!);\n\n  // 7. List subscriptions (creation may not be implemented for some providers)\n  const subscriptions = await listSubscriptions(CONNECTION_STRIPE!);\n\n  console.log(\"Payment:\", payment);\n  console.log(\"Payments count:\", payments.length);\n  console.log(\"Payment Link URL:\", link.url);\n  console.log(\"Links count:\", links.length);\n  console.log(\"Refunds count:\", refunds.length);\n  console.log(\"Payouts count:\", payouts.length);\n  console.log(\"Subscriptions count:\", subscriptions.length);\n}\n\nmain();\n",[287462],{"type":17,"tag":6121,"props":287463,"children":287464},{"__ignoreMap":7},[287465],{"type":23,"value":287460},{"type":17,"tag":25,"props":287467,"children":287468},{},[],{"type":17,"tag":29,"props":287470,"children":287471},{},[287472],{"type":23,"value":287473},"Happy building! 🎉",{"title":7,"searchDepth":1629,"depth":1629,"links":287475},[287476,287477,287478,287479,287480,287481,287482,287483,287484,287485],{"id":141798,"depth":1629,"text":141801},{"id":276695,"depth":1629,"text":276698},{"id":211235,"depth":1629,"text":211238},{"id":276756,"depth":1629,"text":276759},{"id":287358,"depth":1629,"text":287361},{"id":287376,"depth":1629,"text":287379},{"id":287394,"depth":1629,"text":287397},{"id":287412,"depth":1629,"text":287415},{"id":287430,"depth":1629,"text":287433},{"id":287448,"depth":1629,"text":287451},"content:blog:how_to_build_a_fintech_application_with_unified_payments_api.md","blog/how_to_build_a_fintech_application_with_unified_payments_api.md","blog/how_to_build_a_fintech_application_with_unified_payments_api",{"_path":287490,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":287491,"description":287492,"img":287493,"date":287494,"tag":12,"body":287495,"_type":1677,"_id":287893,"_source":1679,"_file":287894,"_stem":287895,"_extension":1682},"/blog/august_2025_product_updates","August 2025 product updates","Last month, we launched new integrations across HR, ticketing, CRM, and LMS; expanded webhook and pagination coverage; and delivered key MCP upgrades for...","https://s3.us-east-2.amazonaws.com/unified-article-images/august_2025_product_updates-icon.png","2025-09-08T00:00:00.000Z",{"type":14,"children":287496,"toc":287885},[287497,287502,287505,287513,287521,287540,287546,287641,287646,287650,287655,287718,287731,287735,287768,287772,287790,287794,287799,287803,287858,287863,287874],{"type":17,"tag":18,"props":287498,"children":287500},{"id":287499},"august-2025-product-updates",[287501],{"type":23,"value":287491},{"type":17,"tag":25,"props":287503,"children":287504},{},[],{"type":17,"tag":29,"props":287506,"children":287507},{},[287508],{"type":17,"tag":33,"props":287509,"children":287510},{},[287511],{"type":23,"value":287512},"September 8, 2025",{"type":17,"tag":29,"props":287514,"children":287515},{},[287516],{"type":17,"tag":6438,"props":287517,"children":287520},{"alt":287518,"src":287519},"August_Update.png","https://s3.us-east-2.amazonaws.com/unified-article-images/august_2025_product_updates-0.png",[],{"type":17,"tag":29,"props":287522,"children":287523},{},[287524,287526,287530,287532,287538],{"type":23,"value":287525},"Last month, we launched new integrations across HR, ticketing, CRM, and LMS; expanded webhook and ",{"type":17,"tag":133,"props":287527,"children":287528},{"href":1857},[287529],{"type":23,"value":1860},{"type":23,"value":287531}," coverage; and delivered ",{"type":17,"tag":133,"props":287533,"children":287535},{"href":43558,"rel":287534},[214],[287536],{"type":23,"value":287537},"key MCP upgrades",{"type":23,"value":287539}," for endpoint coverage, new models, and EU data-region support.",{"type":17,"tag":68,"props":287541,"children":287543},{"id":287542},"unified-mcp-updates",[287544],{"type":23,"value":287545},"Unified MCP updates",{"type":17,"tag":80,"props":287547,"children":287548},{},[287549,287559,287580,287590,287611],{"type":17,"tag":84,"props":287550,"children":287551},{},[287552,287557],{"type":17,"tag":48,"props":287553,"children":287554},{},[287555],{"type":23,"value":287556},"Full endpoint coverage",{"type":23,"value":287558}," for every integration's API.",{"type":17,"tag":84,"props":287560,"children":287561},{},[287562,287567,287569,287574,287575,287579],{"type":17,"tag":48,"props":287563,"children":287564},{},[287565],{"type":23,"value":287566},"New models",{"type":23,"value":287568},": support added for ",{"type":17,"tag":48,"props":287570,"children":287571},{},[287572],{"type":23,"value":287573},"x.ai Grok",{"type":23,"value":34435},{"type":17,"tag":48,"props":287576,"children":287577},{},[287578],{"type":23,"value":16648},{"type":23,"value":54},{"type":17,"tag":84,"props":287581,"children":287582},{},[287583,287588],{"type":17,"tag":48,"props":287584,"children":287585},{},[287586],{"type":23,"value":287587},"Aliases improvement",{"type":23,"value":287589}," for cleaner tool descriptions and better LLM matching.",{"type":17,"tag":84,"props":287591,"children":287592},{},[287593,287598,287599,287603,287605,287610],{"type":17,"tag":48,"props":287594,"children":287595},{},[287596],{"type":23,"value":287597},"Multi-region support",{"type":23,"value":49318},{"type":17,"tag":133,"props":287600,"children":287601},{"href":326},[287602],{"type":23,"value":329},{"type":23,"value":287604}," now runs in ",{"type":17,"tag":48,"props":287606,"children":287607},{},[287608],{"type":23,"value":287609},"US, EU, and AU data-centers",{"type":23,"value":54},{"type":17,"tag":84,"props":287612,"children":287613},{},[287614,287619,287620,287626,287628,287633,287635,287640],{"type":17,"tag":48,"props":287615,"children":287616},{},[287617],{"type":23,"value":287618},"Prompt upgrades",{"type":23,"value":49318},{"type":17,"tag":6121,"props":287621,"children":287623},{"className":287622},[],[287624],{"type":23,"value":287625},"mcp_url",{"type":23,"value":287627}," support across OpenAI, Anthropic, Cohere, Groq, and Gemini (Gemini also adds ",{"type":17,"tag":6121,"props":287629,"children":287631},{"className":287630},[],[287632],{"type":23,"value":74693},{"type":23,"value":287634},"; Cohere adds ",{"type":17,"tag":6121,"props":287636,"children":287638},{"className":287637},[],[287639],{"type":23,"value":137690},{"type":23,"value":129328},{"type":17,"tag":29,"props":287642,"children":287643},{},[287644],{"type":23,"value":287645},"These upgrades strengthen security, performance, and model compatibility while keeping all data real-time and pass-through (no storage).",{"type":17,"tag":68,"props":287647,"children":287648},{"id":11629},[287649],{"type":23,"value":11632},{"type":17,"tag":29,"props":287651,"children":287652},{},[287653],{"type":23,"value":287654},"We were busy in August with 41 new integrations launched.",{"type":17,"tag":80,"props":287656,"children":287657},{},[287658,287668,287678,287688,287698,287708],{"type":17,"tag":84,"props":287659,"children":287660},{},[287661,287666],{"type":17,"tag":48,"props":287662,"children":287663},{},[287664],{"type":23,"value":287665},"Authentication / Identity:",{"type":23,"value":287667}," Adobe Sign, Airtable, Reddit Ads, Bluesky, Mastodon, Twilio, Snapchat, Airwallex, DigitalOcean, Figma, Spotify, SurveyMonkey",{"type":17,"tag":84,"props":287669,"children":287670},{},[287671,287676],{"type":17,"tag":48,"props":287672,"children":287673},{},[287674],{"type":23,"value":287675},"HR & Directory / ATS:",{"type":23,"value":287677}," Microsoft Intune (also Authentication), Certn, Checkr, First Advantage, Yardstik, Verifiable, UKG Pro, UKG Pro ATS, Clover",{"type":17,"tag":84,"props":287679,"children":287680},{},[287681,287686],{"type":17,"tag":48,"props":287682,"children":287683},{},[287684],{"type":23,"value":287685},"Ticketing / ITSM:",{"type":23,"value":287687}," Atlassian Service Desk",{"type":17,"tag":84,"props":287689,"children":287690},{},[287691,287696],{"type":17,"tag":48,"props":287692,"children":287693},{},[287694],{"type":23,"value":287695},"CRM / Marketing:",{"type":23,"value":287697}," AWeber, Rev Sport",{"type":17,"tag":84,"props":287699,"children":287700},{},[287701,287706],{"type":17,"tag":48,"props":287702,"children":287703},{},[287704],{"type":23,"value":287705},"LMS / Calendar:",{"type":23,"value":287707}," SAP SuccessFactors (LMS), Fathom (Calendar + HR)",{"type":17,"tag":84,"props":287709,"children":287710},{},[287711,287716],{"type":17,"tag":48,"props":287712,"children":287713},{},[287714],{"type":23,"value":287715},"Productivity / Developer:",{"type":23,"value":287717}," 1Password (Events), Aha!, Canva, Wayfair, Telegram, Threads, Instagram, Pinterest, TikTok",{"type":17,"tag":29,"props":287719,"children":287720},{},[287721,287723,287729],{"type":23,"value":287722},"Unified's catalog exceeds ",{"type":17,"tag":133,"props":287724,"children":287726},{"href":87026,"rel":287725},[214],[287727],{"type":23,"value":287728},"330+ integrations",{"type":23,"value":287730}," across 21 categories, with usage-based pricing and a 30-day free trial for production-like testing.",{"type":17,"tag":68,"props":287732,"children":287733},{"id":278477},[287734],{"type":23,"value":278480},{"type":17,"tag":80,"props":287736,"children":287737},{},[287738,287759],{"type":17,"tag":84,"props":287739,"children":287740},{},[287741,287749,287751,287757],{"type":17,"tag":48,"props":287742,"children":287743},{},[287744,287745],{"type":23,"value":119374},{"type":17,"tag":133,"props":287746,"children":287747},{"href":4999},[287748],{"type":23,"value":5002},{"type":23,"value":287750},": Checkr added ",{"type":17,"tag":6121,"props":287752,"children":287754},{"className":287753},[],[287755],{"type":23,"value":287756},"created/updated/deleted",{"type":23,"value":287758}," across Candidate, Request, and Package.",{"type":17,"tag":84,"props":287760,"children":287761},{},[287762,287766],{"type":17,"tag":48,"props":287763,"children":287764},{},[287765],{"type":23,"value":9256},{"type":23,"value":287767},": Expanded 'created/updated' event coverage across HR, ATS, CRM, and messaging platforms — including BambooHR, QuickBooks, Jira, and more. Virtual webhooks provide the same event interface when vendors lack native events—while Unified still fetches data live from the source.",{"type":17,"tag":68,"props":287769,"children":287770},{"id":278583},[287771],{"type":23,"value":278586},{"type":17,"tag":80,"props":287773,"children":287774},{},[287775,287780,287785],{"type":17,"tag":84,"props":287776,"children":287777},{},[287778],{"type":23,"value":287779},"Microsoft 365 suite: Employee object now supports full CRUD.",{"type":17,"tag":84,"props":287781,"children":287782},{},[287783],{"type":23,"value":287784},"Recruit Wizard: New Event, Contact, and Company objects.",{"type":17,"tag":84,"props":287786,"children":287787},{},[287788],{"type":23,"value":287789},"QuickBooks + Sage: File objects with attachment support.",{"type":17,"tag":68,"props":287791,"children":287792},{"id":278800},[287793],{"type":23,"value":278803},{"type":17,"tag":29,"props":287795,"children":287796},{},[287797],{"type":23,"value":287798},"Expanded pagination and filtering across hundreds of endpoints, improving real-time reliability for high-volume systems like Jira, BambooHR, QuickBooks, and Xero.",{"type":17,"tag":68,"props":287800,"children":287801},{"id":120936},[287802],{"type":23,"value":216865},{"type":17,"tag":80,"props":287804,"children":287805},{},[287806,287821,287843],{"type":17,"tag":84,"props":287807,"children":287808},{},[287809,287819],{"type":17,"tag":133,"props":287810,"children":287813},{"href":287811,"rel":287812},"https://unified.to/blog/replacing_polling_with_unified_webhooks_and_virtual_streams",[214],[287814],{"type":17,"tag":48,"props":287815,"children":287816},{},[287817],{"type":23,"value":287818},"Replacing Polling with Unified Webhooks and Virtual Streams",{"type":23,"value":287820}," — How Unified's hybrid model delivers real-time events across 300+ integrations.",{"type":17,"tag":84,"props":287822,"children":287823},{},[287824,287834,287836,287841],{"type":17,"tag":133,"props":287825,"children":287828},{"href":287826,"rel":287827},"https://unified.to/blog/enriching_unified_objects_with_custom_metadata",[214],[287829],{"type":17,"tag":48,"props":287830,"children":287831},{},[287832],{"type":23,"value":287833},"Enriching Unified Objects with Custom Metadata",{"type":23,"value":287835}," — Use ",{"type":17,"tag":6121,"props":287837,"children":287839},{"className":287838},[],[287840],{"type":23,"value":110283},{"type":23,"value":287842}," to add custom fields to normalized objects.",{"type":17,"tag":84,"props":287844,"children":287845},{},[287846,287856],{"type":17,"tag":133,"props":287847,"children":287850},{"href":287848,"rel":287849},"https://unified.to/blog/building_an_invoicing_integration_for_accounting_using_unified",[214],[287851],{"type":17,"tag":48,"props":287852,"children":287853},{},[287854],{"type":23,"value":287855},"Building an Invoicing Integration for Accounting",{"type":23,"value":287857}," — A TypeScript guide to creating and listing invoices with Xero, QuickBooks, and more.",{"type":17,"tag":29,"props":287859,"children":287860},{},[287861],{"type":23,"value":287862},"That's a wrap for August. Whether you're enriching finance workflows, scaling HR/ATS pipelines, or exposing real-time tools to LLMs via MCP, Unified gives you a single, unified foundation to launch faster—with no data storage, no vendor lock-in.",{"type":17,"tag":29,"props":287864,"children":287865},{},[287866],{"type":17,"tag":133,"props":287867,"children":287869},{"href":1612,"rel":287868},[214],[287870],{"type":17,"tag":48,"props":287871,"children":287872},{},[287873],{"type":23,"value":278965},{"type":17,"tag":29,"props":287875,"children":287876},{},[287877],{"type":17,"tag":133,"props":287878,"children":287880},{"href":1623,"rel":287879},[214],[287881],{"type":17,"tag":48,"props":287882,"children":287883},{},[287884],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":287886},[287887,287888,287889,287890,287891,287892],{"id":287542,"depth":1629,"text":287545},{"id":11629,"depth":1629,"text":11632},{"id":278477,"depth":1629,"text":278480},{"id":278583,"depth":1629,"text":278586},{"id":278800,"depth":1629,"text":278803},{"id":120936,"depth":1629,"text":216865},"content:blog:august_2025_product_updates.md","blog/august_2025_product_updates.md","blog/august_2025_product_updates",{"_path":287897,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":287898,"description":287899,"img":287900,"date":287494,"tag":6341,"body":287901,"_type":1677,"_id":288227,"_source":1679,"_file":288228,"_stem":288229,"_extension":1682},"/blog/how_to_build_an_e_commerce_product_integration_with_unified","How to Build an E-Commerce Product Integration with Unified","Unified makes it possible for developers to build ecom products that work with your end customers preferred ecom platforms!","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_e_commerce_product_integration_with_unified-icon.png",{"type":14,"children":287902,"toc":288217},[287903,287908,287911,287918,287922,287933,287938,287944,287975,287979,287988,287998,288009,288012,288016,288025,288028,288032,288037,288047,288052,288063,288066,288072,288077,288086,288094,288107,288110,288116,288121,288130,288137,288150,288153,288159,288164,288173,288180,288193,288196,288200,288205,288214],{"type":17,"tag":18,"props":287904,"children":287906},{"id":287905},"how-to-build-an-e-commerce-product-integration-with-unified",[287907],{"type":23,"value":287898},{"type":17,"tag":25,"props":287909,"children":287910},{},[],{"type":17,"tag":29,"props":287912,"children":287913},{},[287914],{"type":17,"tag":33,"props":287915,"children":287916},{},[287917],{"type":23,"value":287512},{"type":17,"tag":29,"props":287919,"children":287920},{},[287921],{"type":23,"value":287899},{"type":17,"tag":29,"props":287923,"children":287924},{},[287925,287927,287931],{"type":23,"value":287926},"With our Unified ",{"type":17,"tag":133,"props":287928,"children":287929},{"href":20451},[287930],{"type":23,"value":20454},{"type":23,"value":287932},", you can connect to dozens of ecom systems (like Shopify, BigCommerce, WooCommerce and more).",{"type":17,"tag":29,"props":287934,"children":287935},{},[287936],{"type":23,"value":287937},"This article will give you knowledge on how to create and list products, and to even create product images from the product description using Unified's GenAI integration.",{"type":17,"tag":68,"props":287939,"children":287941},{"id":287940},"requirements",[287942],{"type":23,"value":287943},"Requirements",{"type":17,"tag":80,"props":287945,"children":287946},{},[287947,287952,287957,287965,287970],{"type":17,"tag":84,"props":287948,"children":287949},{},[287950],{"type":23,"value":287951},"Node.js (v1",{"type":17,"tag":84,"props":287953,"children":287954},{},[287955],{"type":23,"value":287956},"Unified account with ecom integration",{"type":17,"tag":84,"props":287958,"children":287959},{},[287960,287964],{"type":17,"tag":133,"props":287961,"children":287962},{"href":7691},[287963],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":287966,"children":287967},{},[287968],{"type":23,"value":287969},"Your end customer's e-commerce connection ID",{"type":17,"tag":84,"props":287971,"children":287972},{},[287973],{"type":23,"value":287974},"Unified GenAI connection ID",{"type":17,"tag":68,"props":287976,"children":287977},{"id":276695},[287978],{"type":23,"value":276698},{"type":17,"tag":6893,"props":287980,"children":287983},{"className":287981,"code":287982,"language":48432,"meta":7},[48430],"mkdir ecommerce-demo\ncd ecommerce-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[287984],{"type":17,"tag":6121,"props":287985,"children":287986},{"__ignoreMap":7},[287987],{"type":23,"value":287982},{"type":17,"tag":29,"props":287989,"children":287990},{},[287991,287992,287997],{"type":23,"value":276717},{"type":17,"tag":6121,"props":287993,"children":287995},{"className":287994},[],[287996],{"type":23,"value":211221},{"type":23,"value":20456},{"type":17,"tag":6893,"props":287999,"children":288004},{"className":288000,"code":288002,"language":288003,"meta":7},[288001],"language-shell","UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_SHOPIFY=your_customer_shopify_connection_id\nCONNECTION_GENAI=your_genai_connection_id\n","shell",[288005],{"type":17,"tag":6121,"props":288006,"children":288007},{"__ignoreMap":7},[288008],{"type":23,"value":288002},{"type":17,"tag":25,"props":288010,"children":288011},{},[],{"type":17,"tag":68,"props":288013,"children":288014},{"id":211235},[288015],{"type":23,"value":211238},{"type":17,"tag":6893,"props":288017,"children":288020},{"className":288018,"code":288019,"language":18718,"meta":7},[18716],"import 'dotenv/config';\n\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { \n    UNIFIED_API_KEY, \n    CONNECTION_SHOPIFY, \n    CONNECTION_GENAI \n} = process.env;\n\nconst sdk = new UnifiedTo({\n    security: { jwt: UNIFIED_API_KEY! },\n});\n",[288021],{"type":17,"tag":6121,"props":288022,"children":288023},{"__ignoreMap":7},[288024],{"type":23,"value":288019},{"type":17,"tag":25,"props":288026,"children":288027},{},[],{"type":17,"tag":68,"props":288029,"children":288030},{"id":276756},[288031],{"type":23,"value":276759},{"type":17,"tag":29,"props":288033,"children":288034},{},[288035],{"type":23,"value":288036},"Before you can create or list products, your customer must authorize your app to access their e-commerce store via Unified's  authentication flow.",{"type":17,"tag":29,"props":288038,"children":288039},{},[288040,288041,288045],{"type":23,"value":276769},{"type":17,"tag":48,"props":288042,"children":288043},{},[288044],{"type":23,"value":195321},{"type":23,"value":288046}," for that customer's integration (e.g., Shopify).",{"type":17,"tag":29,"props":288048,"children":288049},{},[288050],{"type":23,"value":288051},"Store this connection ID securely as shown above and use it in all API calls for that customer.",{"type":17,"tag":29,"props":288053,"children":288054},{},[288055,288056,288062],{"type":23,"value":122275},{"type":17,"tag":133,"props":288057,"children":288059},{"href":19380,"rel":288058},[214],[288060],{"type":23,"value":288061},"full list of supported integrations",{"type":23,"value":54},{"type":17,"tag":25,"props":288064,"children":288065},{},[],{"type":17,"tag":68,"props":288067,"children":288069},{"id":288068},"step-4-generate-a-product-image-from-description-with-genai",[288070],{"type":23,"value":288071},"Step 4: Generate a Product Image from Description (with GenAI)",{"type":17,"tag":29,"props":288073,"children":288074},{},[288075],{"type":23,"value":288076},"You can use Unified GenAI to generate a product image based on the product description.",{"type":17,"tag":6893,"props":288078,"children":288081},{"className":288079,"code":288080,"language":18718,"meta":7},[18716],"export async function generateProductImage(description: string) {\n    const prompt = `Generate a high-quality product image for the following product description: ${description}`;\n\n    const result = await sdk.genai.createGenaiPrompt({\n        connectionId: CONNECTION_GENAI!,\n        prompt: {\n            messages: [{ role: \"USER\", content: prompt }],\n            maxTokens: 1024,\n            temperature: 0.7,\n            responseFormat: \"image_url\", // or whatever the GenAI API expects for image output\n        },\n    });\n\n    return result.choices?.[0]?.message?.content || \"\";\n}\n",[288082],{"type":17,"tag":6121,"props":288083,"children":288084},{"__ignoreMap":7},[288085],{"type":23,"value":288080},{"type":17,"tag":29,"props":288087,"children":288088},{},[288089],{"type":17,"tag":33,"props":288090,"children":288091},{},[288092],{"type":23,"value":288093},"Explanation:",{"type":17,"tag":80,"props":288095,"children":288096},{},[288097,288102],{"type":17,"tag":84,"props":288098,"children":288099},{},[288100],{"type":23,"value":288101},"This function sends the product description to Unified GenAI and gets back an image URL.",{"type":17,"tag":84,"props":288103,"children":288104},{},[288105],{"type":23,"value":288106},"You can use this image URL when creating the product in Shopify (or any other e-commerce platform).",{"type":17,"tag":25,"props":288108,"children":288109},{},[],{"type":17,"tag":68,"props":288111,"children":288113},{"id":288112},"step-5-create-a-product-with-ai-generated-image",[288114],{"type":23,"value":288115},"Step 5: Create a Product (with AI-generated Image)",{"type":17,"tag":29,"props":288117,"children":288118},{},[288119],{"type":23,"value":288120},"Here's how to create a product in Shopify, using the generated image.",{"type":17,"tag":6893,"props":288122,"children":288125},{"className":288123,"code":288124,"language":18718,"meta":7},[18716],"export async function createProduct(connectionId: string, name: string, description: string, price: number) {\n\n    // 1. Generate product image\n    const imageUrl = await generateProductImage(description);\n\n    // 2. Create the product\n    const createProductResult = await sdk.commerce.createCommerceItem({\n        connectionId,\n        commerceItem: {\n            name,\n            description,\n            price,\n            media: imageUrl ? [{ url: imageUrl }] : [],\n            isActive: true,\n            // Add any other fields as needed (e.g., tags, variants, metadata)\n        },\n    });\n\n    return createProductResult; // commerceItem\n}\n",[288126],{"type":17,"tag":6121,"props":288127,"children":288128},{"__ignoreMap":7},[288129],{"type":23,"value":288124},{"type":17,"tag":29,"props":288131,"children":288132},{},[288133],{"type":17,"tag":33,"props":288134,"children":288135},{},[288136],{"type":23,"value":288093},{"type":17,"tag":80,"props":288138,"children":288139},{},[288140,288145],{"type":17,"tag":84,"props":288141,"children":288142},{},[288143],{"type":23,"value":288144},"Generates an image from the description.",{"type":17,"tag":84,"props":288146,"children":288147},{},[288148],{"type":23,"value":288149},"Creates a product in Shopify (or any Unified-supported e-commerce platform) with the image and other details.",{"type":17,"tag":25,"props":288151,"children":288152},{},[],{"type":17,"tag":68,"props":288154,"children":288156},{"id":288155},"step-6-list-products",[288157],{"type":23,"value":288158},"Step 6: List Products",{"type":17,"tag":29,"props":288160,"children":288161},{},[288162],{"type":23,"value":288163},"You can list all products for a customer's e-commerce connection:",{"type":17,"tag":6893,"props":288165,"children":288168},{"className":288166,"code":288167,"language":18718,"meta":7},[18716],"export async function listProducts(connectionId: string) {\n\n    const productsResult = await sdk.commerce.listCommerceItems({\n        connectionId,\n        limit: 10,\n    });\n\n    return productsResult; // commerceItem[]\n}\n",[288169],{"type":17,"tag":6121,"props":288170,"children":288171},{"__ignoreMap":7},[288172],{"type":23,"value":288167},{"type":17,"tag":29,"props":288174,"children":288175},{},[288176],{"type":17,"tag":33,"props":288177,"children":288178},{},[288179],{"type":23,"value":288093},{"type":17,"tag":80,"props":288181,"children":288182},{},[288183,288188],{"type":17,"tag":84,"props":288184,"children":288185},{},[288186],{"type":23,"value":288187},"Fetches the first 10 products for the customer's store.",{"type":17,"tag":84,"props":288189,"children":288190},{},[288191],{"type":23,"value":288192},"You can filter, paginate, or sort as needed.",{"type":17,"tag":25,"props":288194,"children":288195},{},[],{"type":17,"tag":68,"props":288197,"children":288198},{"id":285743},[288199],{"type":23,"value":285746},{"type":17,"tag":29,"props":288201,"children":288202},{},[288203],{"type":23,"value":288204},"Here's how you might use these functions in your product workflow:",{"type":17,"tag":6893,"props":288206,"children":288209},{"className":288207,"code":288208,"language":18718,"meta":7},[18716],"async function main() {\n    const name = \"AI-Generated T-Shirt\";\n\n    const description = \"A stylish t-shirt with a unique, AI-generated design.\";\n\n    const price = 29.99;\n\n    // 1. Create the product with an AI-generated image\n    const product = await createProduct(CONNECTION_SHOPIFY!, name, description, price);\n\n    // 2. List products\n    const products = await listProducts(CONNECTION_SHOPIFY!);\n\n    console.log(\"Created product:\", product);\n    console.log(\"All products:\", products);\n}\n\nmain();\n",[288210],{"type":17,"tag":6121,"props":288211,"children":288212},{"__ignoreMap":7},[288213],{"type":23,"value":288208},{"type":17,"tag":25,"props":288215,"children":288216},{},[],{"title":7,"searchDepth":1629,"depth":1629,"links":288218},[288219,288220,288221,288222,288223,288224,288225,288226],{"id":287940,"depth":1629,"text":287943},{"id":276695,"depth":1629,"text":276698},{"id":211235,"depth":1629,"text":211238},{"id":276756,"depth":1629,"text":276759},{"id":288068,"depth":1629,"text":288071},{"id":288112,"depth":1629,"text":288115},{"id":288155,"depth":1629,"text":288158},{"id":285743,"depth":1629,"text":285746},"content:blog:how_to_build_an_e_commerce_product_integration_with_unified.md","blog/how_to_build_an_e_commerce_product_integration_with_unified.md","blog/how_to_build_an_e_commerce_product_integration_with_unified",{"_path":288231,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":288232,"description":288233,"img":288234,"date":288235,"tag":6341,"body":288236,"_type":1677,"_id":288978,"_source":1679,"_file":288979,"_stem":288980,"_extension":1682},"/blog/how_to_set_up_a_custom_api_url","How to set up a custom API URL","This guide will walk you through the process of setting up a custom CNAME (subdomain) for your Unified API workspace. This allows you to use your own domain...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_a_custom_api_url-icon.webp","2025-09-05T00:00:00.000Z",{"type":14,"children":288237,"toc":288954},[288238,288243,288246,288254,288278,288286,288290,288308,288314,288319,288349,288355,288477,288483,288488,288511,288517,288522,288577,288583,288593,288599,288618,288626,288631,288640,288646,288688,288692,288698,288739,288744,288762,288768,288786,288790,288794,288880,288886,288897,288903,288912,288918,288927,288933,288942,288945],{"type":17,"tag":18,"props":288239,"children":288241},{"id":288240},"how-to-set-up-a-custom-api-url",[288242],{"type":23,"value":288232},{"type":17,"tag":25,"props":288244,"children":288245},{},[],{"type":17,"tag":29,"props":288247,"children":288248},{},[288249],{"type":17,"tag":33,"props":288250,"children":288251},{},[288252],{"type":23,"value":288253},"September 5, 2025",{"type":17,"tag":29,"props":288255,"children":288256},{},[288257,288259,288263,288265,288270,288272,288276],{"type":23,"value":288258},"This guide will walk you through the process of setting up a custom CNAME (subdomain) for your ",{"type":17,"tag":133,"props":288260,"children":288261},{"href":7691},[288262],{"type":23,"value":7806},{"type":23,"value":288264}," workspace. This allows you to use your own domain instead of the default ",{"type":17,"tag":6121,"props":288266,"children":288268},{"className":288267},[],[288269],{"type":23,"value":106694},{"type":23,"value":288271}," domain for all API calls and ",{"type":17,"tag":133,"props":288273,"children":288274},{"href":779},[288275],{"type":23,"value":782},{"type":23,"value":288277}," flows.",{"type":17,"tag":3414,"props":288279,"children":288280},{},[288281],{"type":17,"tag":29,"props":288282,"children":288283},{},[288284],{"type":23,"value":288285},"💡 This is mandatory when using Sensitive scopes in any of the Google integrations, doing this will allow the Google verification to pass.",{"type":17,"tag":68,"props":288287,"children":288288},{"id":141798},[288289],{"type":23,"value":141801},{"type":17,"tag":80,"props":288291,"children":288292},{},[288293,288298,288303],{"type":17,"tag":84,"props":288294,"children":288295},{},[288296],{"type":23,"value":288297},"You must have a paid Unified plan (custom domains are not available on the free/test plan)",{"type":17,"tag":84,"props":288299,"children":288300},{},[288301],{"type":23,"value":288302},"Access to your domain's DNS management console",{"type":17,"tag":84,"props":288304,"children":288305},{},[288306],{"type":23,"value":288307},"Admin access to your Unified workspace",{"type":17,"tag":68,"props":288309,"children":288311},{"id":288310},"step-1-choose-your-custom-subdomain",[288312],{"type":23,"value":288313},"Step 1: Choose Your Custom Subdomain",{"type":17,"tag":29,"props":288315,"children":288316},{},[288317],{"type":23,"value":288318},"Decide on a subdomain you want to use. For example:",{"type":17,"tag":80,"props":288320,"children":288321},{},[288322,288331,288340],{"type":17,"tag":84,"props":288323,"children":288324},{},[288325],{"type":17,"tag":6121,"props":288326,"children":288328},{"className":288327},[],[288329],{"type":23,"value":288330},"api.yourcompany.com",{"type":17,"tag":84,"props":288332,"children":288333},{},[288334],{"type":17,"tag":6121,"props":288335,"children":288337},{"className":288336},[],[288338],{"type":23,"value":288339},"unified-api.yourcompany.com",{"type":17,"tag":84,"props":288341,"children":288342},{},[288343],{"type":17,"tag":6121,"props":288344,"children":288346},{"className":288345},[],[288347],{"type":23,"value":288348},"integrations.yourcompany.com",{"type":17,"tag":68,"props":288350,"children":288352},{"id":288351},"step-2-configure-dns-cname-record",[288353],{"type":23,"value":288354},"Step 2: Configure DNS CNAME Record",{"type":17,"tag":6154,"props":288356,"children":288357},{},[288358,288368,288378,288469],{"type":17,"tag":84,"props":288359,"children":288360},{},[288361,288366],{"type":17,"tag":48,"props":288362,"children":288363},{},[288364],{"type":23,"value":288365},"Log into your domain registrar or DNS provider",{"type":23,"value":288367}," (e.g., Cloudflare, GoDaddy, Namecheap, AWS Route 53)",{"type":17,"tag":84,"props":288369,"children":288370},{},[288371,288376],{"type":17,"tag":48,"props":288372,"children":288373},{},[288374],{"type":23,"value":288375},"Navigate to DNS management",{"type":23,"value":288377}," for your domain",{"type":17,"tag":84,"props":288379,"children":288380},{},[288381,288386,288388],{"type":17,"tag":48,"props":288382,"children":288383},{},[288384],{"type":23,"value":288385},"Add a new CNAME record",{"type":23,"value":288387}," with the following settings:\n",{"type":17,"tag":80,"props":288389,"children":288390},{},[288391,288400,288423,288449,288459],{"type":17,"tag":84,"props":288392,"children":288393},{},[288394,288398],{"type":17,"tag":48,"props":288395,"children":288396},{},[288397],{"type":23,"value":47948},{"type":23,"value":288399},": CNAME",{"type":17,"tag":84,"props":288401,"children":288402},{},[288403,288408,288410,288415,288416,288422],{"type":17,"tag":48,"props":288404,"children":288405},{},[288406],{"type":23,"value":288407},"Name",{"type":23,"value":288409},": Your chosen subdomain (e.g., ",{"type":17,"tag":6121,"props":288411,"children":288413},{"className":288412},[],[288414],{"type":23,"value":144906},{"type":23,"value":75890},{"type":17,"tag":6121,"props":288417,"children":288419},{"className":288418},[],[288420],{"type":23,"value":288421},"unified-api",{"type":23,"value":12034},{"type":17,"tag":84,"props":288424,"children":288425},{},[288426,288431,288433,288440,288442],{"type":17,"tag":48,"props":288427,"children":288428},{},[288429],{"type":23,"value":288430},"Value/Target",{"type":23,"value":288432},":\nUS: ",{"type":17,"tag":133,"props":288434,"children":288437},{"href":288435,"rel":288436},"http://unified-domains-us-7d67c6f04efebb36.elb.us-east-1.amazonaws.com/",[214],[288438],{"type":23,"value":288439},"unified-domains-us-7d67c6f04efebb36.elb.us-east-1.amazonaws.com",{"type":23,"value":288441},"\nEU: ",{"type":17,"tag":133,"props":288443,"children":288446},{"href":288444,"rel":288445},"http://unified-domains-eu-a0f8a17b303a3c06.elb.eu-central-1.amazonaws.com/",[214],[288447],{"type":23,"value":288448},"unified-domains-eu-a0f8a17b303a3c06.elb.eu-central-1.amazonaws.com",{"type":17,"tag":84,"props":288450,"children":288451},{},[288452,288457],{"type":17,"tag":48,"props":288453,"children":288454},{},[288455],{"type":23,"value":288456},"TTL",{"type":23,"value":288458},": 3600 (or default)",{"type":17,"tag":84,"props":288460,"children":288461},{},[288462,288467],{"type":17,"tag":48,"props":288463,"children":288464},{},[288465],{"type":23,"value":288466},"Proxy status",{"type":23,"value":288468},": Disabled (if using Cloudflare)",{"type":17,"tag":84,"props":288470,"children":288471},{},[288472],{"type":17,"tag":48,"props":288473,"children":288474},{},[288475],{"type":23,"value":288476},"Save the CNAME record",{"type":17,"tag":68,"props":288478,"children":288480},{"id":288479},"step-3-wait-for-dns-propagation",[288481],{"type":23,"value":288482},"Step 3: Wait for DNS Propagation",{"type":17,"tag":29,"props":288484,"children":288485},{},[288486],{"type":23,"value":288487},"DNS changes can take anywhere from a few minutes to 48 hours to propagate globally. You can check propagation using tools like:",{"type":17,"tag":80,"props":288489,"children":288490},{},[288491,288501],{"type":17,"tag":84,"props":288492,"children":288493},{},[288494],{"type":17,"tag":133,"props":288495,"children":288498},{"href":288496,"rel":288497},"https://whatsmydns.net/",[214],[288499],{"type":23,"value":288500},"whatsmydns.net",{"type":17,"tag":84,"props":288502,"children":288503},{},[288504],{"type":17,"tag":133,"props":288505,"children":288508},{"href":288506,"rel":288507},"https://dnschecker.org/",[214],[288509],{"type":23,"value":288510},"dnschecker.org",{"type":17,"tag":68,"props":288512,"children":288514},{"id":288513},"step-4-contact-unified-support",[288515],{"type":23,"value":288516},"Step 4: Contact Unified Support",{"type":17,"tag":29,"props":288518,"children":288519},{},[288520],{"type":23,"value":288521},"Once your CNAME is configured and propagated:",{"type":17,"tag":6154,"props":288523,"children":288524},{},[288525,288535,288567],{"type":17,"tag":84,"props":288526,"children":288527},{},[288528,288533],{"type":17,"tag":48,"props":288529,"children":288530},{},[288531],{"type":23,"value":288532},"Contact Unified Support",{"type":23,"value":288534}," through your preferred channel",{"type":17,"tag":84,"props":288536,"children":288537},{},[288538,288543,288544],{"type":17,"tag":48,"props":288539,"children":288540},{},[288541],{"type":23,"value":288542},"Provide the following information",{"type":23,"value":282122},{"type":17,"tag":80,"props":288545,"children":288546},{},[288547,288552,288557],{"type":17,"tag":84,"props":288548,"children":288549},{},[288550],{"type":23,"value":288551},"Your workspace name/ID",{"type":17,"tag":84,"props":288553,"children":288554},{},[288555],{"type":23,"value":288556},"The custom subdomain you want to use",{"type":17,"tag":84,"props":288558,"children":288559},{},[288560,288562],{"type":23,"value":288561},"Confirmation that the CNAME is configured and pointing to ",{"type":17,"tag":133,"props":288563,"children":288565},{"href":288435,"rel":288564},[214],[288566],{"type":23,"value":288439},{"type":17,"tag":84,"props":288568,"children":288569},{},[288570,288575],{"type":17,"tag":48,"props":288571,"children":288572},{},[288573],{"type":23,"value":288574},"Support will assign the custom domain",{"type":23,"value":288576}," to your workspace",{"type":17,"tag":68,"props":288578,"children":288580},{"id":288579},"step-5-update-oauth-application-settings",[288581],{"type":23,"value":288582},"Step 5: Update OAuth Application Settings",{"type":17,"tag":29,"props":288584,"children":288585},{},[288586,288591],{"type":17,"tag":48,"props":288587,"children":288588},{},[288589],{"type":23,"value":288590},"CRITICAL",{"type":23,"value":288592},": After your custom domain is assigned, you must update all OAuth applications to use the new redirect URL.",{"type":17,"tag":239,"props":288594,"children":288596},{"id":288595},"for-oauth-applications",[288597],{"type":23,"value":288598},"For OAuth Applications:",{"type":17,"tag":6154,"props":288600,"children":288601},{},[288602,288607],{"type":17,"tag":84,"props":288603,"children":288604},{},[288605],{"type":23,"value":288606},"Go to yor app Console",{"type":17,"tag":84,"props":288608,"children":288609},{},[288610,288612,288616],{"type":23,"value":288611},"Update the ",{"type":17,"tag":48,"props":288613,"children":288614},{},[288615],{"type":23,"value":42400},{"type":23,"value":288617}," from:",{"type":17,"tag":6893,"props":288619,"children":288621},{"className":288620,"code":71416,"language":20901,"meta":23},[20899],[288622],{"type":17,"tag":6121,"props":288623,"children":288624},{"__ignoreMap":7},[288625],{"type":23,"value":71416},{"type":17,"tag":29,"props":288627,"children":288628},{},[288629],{"type":23,"value":288630},"to:",{"type":17,"tag":6893,"props":288632,"children":288635},{"className":288633,"code":288634,"language":20901,"meta":23},[20899],"https://your-custom-domain.com/oauth/code\n",[288636],{"type":17,"tag":6121,"props":288637,"children":288638},{"__ignoreMap":7},[288639],{"type":23,"value":288634},{"type":17,"tag":68,"props":288641,"children":288643},{"id":288642},"step-6-verify-the-setup",[288644],{"type":23,"value":288645},"Step 6: Verify the Setup",{"type":17,"tag":6154,"props":288647,"children":288648},{},[288649,288668,288678],{"type":17,"tag":84,"props":288650,"children":288651},{},[288652,288657,288659],{"type":17,"tag":48,"props":288653,"children":288654},{},[288655],{"type":23,"value":288656},"Test your custom domain",{"type":23,"value":288658}," by making a simple API call to:",{"type":17,"tag":6893,"props":288660,"children":288663},{"className":288661,"code":288662,"language":20901,"meta":23},[20899],"https://your-custom-domain.com/swagger.json\n",[288664],{"type":17,"tag":6121,"props":288665,"children":288666},{"__ignoreMap":7},[288667],{"type":23,"value":288662},{"type":17,"tag":84,"props":288669,"children":288670},{},[288671,288676],{"type":17,"tag":48,"props":288672,"children":288673},{},[288674],{"type":23,"value":288675},"Test OAuth flow",{"type":23,"value":288677}," by attempting to authenticate with an integration using your custom domain",{"type":17,"tag":84,"props":288679,"children":288680},{},[288681,288686],{"type":17,"tag":48,"props":288682,"children":288683},{},[288684],{"type":23,"value":288685},"Verify redirect URLs",{"type":23,"value":288687}," are working correctly in your OAuth applications",{"type":17,"tag":68,"props":288689,"children":288690},{"id":170205},[288691],{"type":23,"value":170208},{"type":17,"tag":239,"props":288693,"children":288695},{"id":288694},"oauth-verification-requirements",[288696],{"type":23,"value":288697},"OAuth Verification Requirements",{"type":17,"tag":80,"props":288699,"children":288700},{},[288701,288711,288721],{"type":17,"tag":84,"props":288702,"children":288703},{},[288704,288709],{"type":17,"tag":48,"props":288705,"children":288706},{},[288707],{"type":23,"value":288708},"Google OAuth",{"type":23,"value":288710},": After changing the redirect URL, you may need to complete app verification since Google sees this as a new domain",{"type":17,"tag":84,"props":288712,"children":288713},{},[288714,288719],{"type":17,"tag":48,"props":288715,"children":288716},{},[288717],{"type":23,"value":288718},"Other providers",{"type":23,"value":288720},": May require similar verification processes",{"type":17,"tag":84,"props":288722,"children":288723},{},[288724,288729,288731,288738],{"type":17,"tag":48,"props":288725,"children":288726},{},[288727],{"type":23,"value":288728},"App verification",{"type":23,"value":288730},": Follow the provider's specific verification process (e.g., ",{"type":17,"tag":133,"props":288732,"children":288735},{"href":288733,"rel":288734},"https://support.google.com/cloud/answer/13461325",[214],[288736],{"type":23,"value":288737},"Google's verification guide",{"type":23,"value":12034},{"type":17,"tag":239,"props":288740,"children":288741},{"id":249333},[288742],{"type":23,"value":288743},"API Usage",{"type":17,"tag":80,"props":288745,"children":288746},{},[288747,288752,288757],{"type":17,"tag":84,"props":288748,"children":288749},{},[288750],{"type":23,"value":288751},"All API calls will now use your custom domain",{"type":17,"tag":84,"props":288753,"children":288754},{},[288755],{"type":23,"value":288756},"The API functionality remains identical",{"type":17,"tag":84,"props":288758,"children":288759},{},[288760],{"type":23,"value":288761},"Your API keys and authentication methods remain the same",{"type":17,"tag":239,"props":288763,"children":288765},{"id":288764},"security-considerations",[288766],{"type":23,"value":288767},"Security Considerations",{"type":17,"tag":80,"props":288769,"children":288770},{},[288771,288776,288781],{"type":17,"tag":84,"props":288772,"children":288773},{},[288774],{"type":23,"value":288775},"Ensure your DNS provider has proper security measures",{"type":17,"tag":84,"props":288777,"children":288778},{},[288779],{"type":23,"value":288780},"Consider enabling DNSSEC if available",{"type":17,"tag":84,"props":288782,"children":288783},{},[288784],{"type":23,"value":288785},"Monitor for any unauthorized DNS changes",{"type":17,"tag":68,"props":288787,"children":288788},{"id":6769},[288789],{"type":23,"value":6772},{"type":17,"tag":239,"props":288791,"children":288792},{"id":6735},[288793],{"type":23,"value":6738},{"type":17,"tag":6154,"props":288795,"children":288796},{},[288797,288823,288849],{"type":17,"tag":84,"props":288798,"children":288799},{},[288800,288805],{"type":17,"tag":48,"props":288801,"children":288802},{},[288803],{"type":23,"value":288804},"DNS Not Propagated",{"type":17,"tag":80,"props":288806,"children":288807},{},[288808,288813,288818],{"type":17,"tag":84,"props":288809,"children":288810},{},[288811],{"type":23,"value":288812},"Wait longer for propagation",{"type":17,"tag":84,"props":288814,"children":288815},{},[288816],{"type":23,"value":288817},"Check with multiple DNS lookup tools",{"type":17,"tag":84,"props":288819,"children":288820},{},[288821],{"type":23,"value":288822},"Verify CNAME record is correct",{"type":17,"tag":84,"props":288824,"children":288825},{},[288826,288831],{"type":17,"tag":48,"props":288827,"children":288828},{},[288829],{"type":23,"value":288830},"OAuth Errors After Domain Change",{"type":17,"tag":80,"props":288832,"children":288833},{},[288834,288839,288844],{"type":17,"tag":84,"props":288835,"children":288836},{},[288837],{"type":23,"value":288838},"Ensure redirect URLs are updated in all OAuth applications",{"type":17,"tag":84,"props":288840,"children":288841},{},[288842],{"type":23,"value":288843},"Complete app verification if required by the provider",{"type":17,"tag":84,"props":288845,"children":288846},{},[288847],{"type":23,"value":288848},"Check that the custom domain is properly assigned to your workspace",{"type":17,"tag":84,"props":288850,"children":288851},{},[288852,288857],{"type":17,"tag":48,"props":288853,"children":288854},{},[288855],{"type":23,"value":288856},"API Calls Failing",{"type":17,"tag":80,"props":288858,"children":288859},{},[288860,288870,288875],{"type":17,"tag":84,"props":288861,"children":288862},{},[288863,288865],{"type":23,"value":288864},"Verify the CNAME is pointing to ",{"type":17,"tag":6121,"props":288866,"children":288868},{"className":288867},[],[288869],{"type":23,"value":106694},{"type":17,"tag":84,"props":288871,"children":288872},{},[288873],{"type":23,"value":288874},"Check that the custom domain is assigned to your workspace",{"type":17,"tag":84,"props":288876,"children":288877},{},[288878],{"type":23,"value":288879},"Ensure your API keys are still valid",{"type":17,"tag":68,"props":288881,"children":288883},{"id":288882},"example-configuration",[288884],{"type":23,"value":288885},"Example Configuration",{"type":17,"tag":29,"props":288887,"children":288888},{},[288889,288891,288896],{"type":23,"value":288890},"Here's a complete example for setting up ",{"type":17,"tag":6121,"props":288892,"children":288894},{"className":288893},[],[288895],{"type":23,"value":288330},{"type":23,"value":20456},{"type":17,"tag":239,"props":288898,"children":288900},{"id":288899},"dns-configuration",[288901],{"type":23,"value":288902},"DNS Configuration:",{"type":17,"tag":6893,"props":288904,"children":288907},{"className":288905,"code":288906,"language":20901,"meta":23},[20899],"Type: CNAME\nName: api\nValue: api.unified.to\nTTL: 3600\n",[288908],{"type":17,"tag":6121,"props":288909,"children":288910},{"__ignoreMap":7},[288911],{"type":23,"value":288906},{"type":17,"tag":239,"props":288913,"children":288915},{"id":288914},"oauth-redirect-url",[288916],{"type":23,"value":288917},"OAuth Redirect URL:",{"type":17,"tag":6893,"props":288919,"children":288922},{"className":288920,"code":288921,"language":20901,"meta":23},[20899],"https://api.yourcompany.com/oauth/code\n",[288923],{"type":17,"tag":6121,"props":288924,"children":288925},{"__ignoreMap":7},[288926],{"type":23,"value":288921},{"type":17,"tag":239,"props":288928,"children":288930},{"id":288929},"api-endpoint",[288931],{"type":23,"value":288932},"API Endpoint:",{"type":17,"tag":6893,"props":288934,"children":288937},{"className":288935,"code":288936,"language":20901,"meta":23},[20899],"https://api.yourcompany.com/v1/your-endpoint\n",[288938],{"type":17,"tag":6121,"props":288939,"children":288940},{"__ignoreMap":7},[288941],{"type":23,"value":288936},{"type":17,"tag":25,"props":288943,"children":288944},{},[],{"type":17,"tag":29,"props":288946,"children":288947},{},[288948,288952],{"type":17,"tag":48,"props":288949,"children":288950},{},[288951],{"type":23,"value":150919},{"type":23,"value":288953},": Custom domain setup requires coordination with Unified Support to ensure proper configuration and security. Please allow 1-2 business days for the setup to be completed after your CNAME is configured.",{"title":7,"searchDepth":1629,"depth":1629,"links":288955},[288956,288957,288958,288959,288960,288961,288964,288965,288970,288973],{"id":141798,"depth":1629,"text":141801},{"id":288310,"depth":1629,"text":288313},{"id":288351,"depth":1629,"text":288354},{"id":288479,"depth":1629,"text":288482},{"id":288513,"depth":1629,"text":288516},{"id":288579,"depth":1629,"text":288582,"children":288962},[288963],{"id":288595,"depth":1635,"text":288598},{"id":288642,"depth":1629,"text":288645},{"id":170205,"depth":1629,"text":170208,"children":288966},[288967,288968,288969],{"id":288694,"depth":1635,"text":288697},{"id":249333,"depth":1635,"text":288743},{"id":288764,"depth":1635,"text":288767},{"id":6769,"depth":1629,"text":6772,"children":288971},[288972],{"id":6735,"depth":1635,"text":6738},{"id":288882,"depth":1629,"text":288885,"children":288974},[288975,288976,288977],{"id":288899,"depth":1635,"text":288902},{"id":288914,"depth":1635,"text":288917},{"id":288929,"depth":1635,"text":288932},"content:blog:how_to_set_up_a_custom_api_url.md","blog/how_to_set_up_a_custom_api_url.md","blog/how_to_set_up_a_custom_api_url",{"_path":64193,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":288982,"description":288983,"img":288984,"date":288985,"tag":12,"body":288986,"_type":1677,"_id":289969,"_source":1679,"_file":289970,"_stem":289971,"_extension":1682},"What is Model Context Protocol (MCP)? A Guide for Product Managers","If you've been following the rise of AI copilots and agents, you've probably come across MCP—short for Model Context Protocol. It's the emerging standard that...","https://s3.us-east-2.amazonaws.com/unified-article-images/what_is_model_context_protocol_mcp_a_guide_for_product_managers-icon.png","2025-09-03T00:00:00.000Z",{"type":14,"children":288987,"toc":289959},[288988,288993,288996,289004,289027,289051,289064,289070,289075,289080,289129,289134,289140,289185,289190,289194,289254,289259,289281,289287,289303,289336,289348,289354,289359,289443,289448,289454,289471,289479,289614,289622,289655,289661,289666,289716,289728,289734,289739,289762,289767,289843,289855,289889,289895,289907,289912,289935,289940],{"type":17,"tag":18,"props":288989,"children":288991},{"id":288990},"what-is-model-context-protocol-mcp-a-guide-for-product-managers",[288992],{"type":23,"value":288982},{"type":17,"tag":25,"props":288994,"children":288995},{},[],{"type":17,"tag":29,"props":288997,"children":288998},{},[288999],{"type":17,"tag":33,"props":289000,"children":289001},{},[289002],{"type":23,"value":289003},"September 3, 2025",{"type":17,"tag":29,"props":289005,"children":289006},{},[289007,289009,289016,289018,289025],{"type":23,"value":289008},"If you've been following the rise of AI copilots and agents, you've probably come across ",{"type":17,"tag":48,"props":289010,"children":289011},{},[289012],{"type":17,"tag":133,"props":289013,"children":289014},{"href":326},[289015],{"type":23,"value":329},{"type":23,"value":289017},"—short for ",{"type":17,"tag":48,"props":289019,"children":289020},{},[289021],{"type":17,"tag":133,"props":289022,"children":289023},{"href":64193},[289024],{"type":23,"value":44580},{"type":23,"value":289026},". It's the emerging standard that turns SaaS integrations into safe, callable tools for LLMs like Claude, GPT, and Gemini.",{"type":17,"tag":29,"props":289028,"children":289029},{},[289030,289032,289037,289038,289043,289044,289049],{"type":23,"value":289031},"For Product Managers, MCP isn't just another technical acronym. It's a way to ",{"type":17,"tag":48,"props":289033,"children":289034},{},[289035],{"type":23,"value":289036},"ship AI features faster",{"type":23,"value":11826},{"type":17,"tag":48,"props":289039,"children":289040},{},[289041],{"type":23,"value":289042},"reduce integration debt",{"type":23,"value":12561},{"type":17,"tag":48,"props":289045,"children":289046},{},[289047],{"type":23,"value":289048},"avoid security pitfalls",{"type":23,"value":289050}," that make LLMs risky in production.",{"type":17,"tag":29,"props":289052,"children":289053},{},[289054,289056,289062],{"type":23,"value":289055},"This guide explains what MCP is, how it compares to traditional API routes, and why it matters for your roadmap—and we'll also show how Unified.to's ",{"type":17,"tag":133,"props":289057,"children":289059},{"href":43558,"rel":289058},[214],[289060],{"type":23,"value":289061},"hosted MCP server",{"type":23,"value":289063}," puts these ideas into practice with 20k+ real-time tools across 330+ integrations.",{"type":17,"tag":68,"props":289065,"children":289067},{"id":289066},"why-apis-alone-arent-enough-for-ai-agents",[289068],{"type":23,"value":289069},"Why APIs Alone Aren't Enough for AI Agents",{"type":17,"tag":29,"props":289071,"children":289072},{},[289073],{"type":23,"value":289074},"At first glance, it seems simple: if your AI copilot needs data from Salesforce, Slack, or Workday, just point it at the vendor's API.",{"type":17,"tag":29,"props":289076,"children":289077},{},[289078],{"type":23,"value":289079},"In reality, this approach quickly breaks down:",{"type":17,"tag":80,"props":289081,"children":289082},{},[289083,289093,289109,289119],{"type":17,"tag":84,"props":289084,"children":289085},{},[289086,289091],{"type":17,"tag":48,"props":289087,"children":289088},{},[289089],{"type":23,"value":289090},"Custom glue code everywhere:",{"type":23,"value":289092}," Each API has its own schema, auth model, and quirks. You end up writing brittle connectors one by one.",{"type":17,"tag":84,"props":289094,"children":289095},{},[289096,289101,289103,289107],{"type":17,"tag":48,"props":289097,"children":289098},{},[289099],{"type":23,"value":289100},"Latency and reliability issues:",{"type":23,"value":289102}," Without normalization, you're handling retries, token refreshes, and ",{"type":17,"tag":133,"props":289104,"children":289105},{"href":135},[289106],{"type":23,"value":138},{"type":23,"value":289108}," manually.",{"type":17,"tag":84,"props":289110,"children":289111},{},[289112,289117],{"type":17,"tag":48,"props":289113,"children":289114},{},[289115],{"type":23,"value":289116},"Security risks:",{"type":23,"value":289118}," Giving an LLM direct API keys or raw endpoints is a recipe for leakage or unauthorized access. Malicious prompts (known as prompt injection) can easily trick a model into exposing secrets.",{"type":17,"tag":84,"props":289120,"children":289121},{},[289122,289127],{"type":17,"tag":48,"props":289123,"children":289124},{},[289125],{"type":23,"value":289126},"No audit trail:",{"type":23,"value":289128}," When an LLM makes API calls directly, you don't have structured logs to review or restrict what it can do.",{"type":17,"tag":29,"props":289130,"children":289131},{},[289132],{"type":23,"value":289133},"This is why most teams experimenting with 'AI + integrations' hit a wall. Demos work, but production deployments become unsafe and unmanageable.",{"type":17,"tag":68,"props":289135,"children":289137},{"id":289136},"enter-mcp-turning-apis-into-tools",[289138],{"type":23,"value":289139},"Enter MCP: Turning APIs into Tools",{"type":17,"tag":29,"props":289141,"children":289142},{},[289143,289144,289148,289150,289155,289157,289162,289163,289169,289170,289176,289177,289183],{"type":23,"value":6712},{"type":17,"tag":48,"props":289145,"children":289146},{},[289147],{"type":23,"value":44580},{"type":23,"value":289149}," was designed to solve this. An MCP ",{"type":17,"tag":48,"props":289151,"children":289152},{},[289153],{"type":23,"value":289154},"server",{"type":23,"value":289156}," makes integrations available as ",{"type":17,"tag":48,"props":289158,"children":289159},{},[289160],{"type":23,"value":289161},"permissioned tools",{"type":23,"value":237324},{"type":17,"tag":6121,"props":289164,"children":289166},{"className":289165},[],[289167],{"type":23,"value":289168},"listCandidates",{"type":23,"value":11826},{"type":17,"tag":6121,"props":289171,"children":289173},{"className":289172},[],[289174],{"type":23,"value":289175},"updateDeal",{"type":23,"value":11826},{"type":17,"tag":6121,"props":289178,"children":289180},{"className":289179},[],[289181],{"type":23,"value":289182},"postMessage",{"type":23,"value":289184},") that an LLM can safely call.",{"type":17,"tag":29,"props":289186,"children":289187},{},[289188],{"type":23,"value":289189},"Instead of teaching an AI the specifics of Salesforce vs HubSpot vs Zoho, MCP standardizes how the model discovers and uses these actions.",{"type":17,"tag":29,"props":289191,"children":289192},{},[289193],{"type":23,"value":22029},{"type":17,"tag":80,"props":289195,"children":289196},{},[289197,289207,289217,289227,289237],{"type":17,"tag":84,"props":289198,"children":289199},{},[289200,289205],{"type":17,"tag":48,"props":289201,"children":289202},{},[289203],{"type":23,"value":289204},"Structured, scoped access:",{"type":23,"value":289206}," Only the tools you make available are callable. No raw tokens, no hidden prompts.",{"type":17,"tag":84,"props":289208,"children":289209},{},[289210,289215],{"type":17,"tag":48,"props":289211,"children":289212},{},[289213],{"type":23,"value":289214},"Real-time passthrough:",{"type":23,"value":289216}," Data is fetched directly from the source—no caches or stale syncs.",{"type":17,"tag":84,"props":289218,"children":289219},{},[289220,289225],{"type":17,"tag":48,"props":289221,"children":289222},{},[289223],{"type":23,"value":289224},"Bi-directional by default:",{"type":23,"value":289226}," Agents can both read and write (fetch a file, update a CRM record, post a chat message).",{"type":17,"tag":84,"props":289228,"children":289229},{},[289230,289235],{"type":17,"tag":48,"props":289231,"children":289232},{},[289233],{"type":23,"value":289234},"Auditability:",{"type":23,"value":289236}," Every tool call is logged, giving you traceability for compliance and debugging.",{"type":17,"tag":84,"props":289238,"children":289239},{},[289240,289245,289247,289252],{"type":17,"tag":48,"props":289241,"children":289242},{},[289243],{"type":23,"value":289244},"Pro tip:",{"type":23,"value":289246}," Start with the ",{"type":17,"tag":33,"props":289248,"children":289249},{},[289250],{"type":23,"value":289251},"fewest tools that can win the task",{"type":23,"value":289253},". Add more only when users hit limits.",{"type":17,"tag":29,"props":289255,"children":289256},{},[289257],{"type":23,"value":289258},"In other words, MCP turns integrations from 'months of custom builds' into 'minutes of tool discovery.'",{"type":17,"tag":3414,"props":289260,"children":289261},{},[289262],{"type":17,"tag":29,"props":289263,"children":289264},{},[289265,289267,289272,289274,289279],{"type":23,"value":289266},"👉 Unified.to offers a ",{"type":17,"tag":133,"props":289268,"children":289270},{"href":43558,"rel":289269},[214],[289271],{"type":23,"value":289061},{"type":23,"value":289273}," that already provides ",{"type":17,"tag":48,"props":289275,"children":289276},{},[289277],{"type":23,"value":289278},"20k+ real-time tools across 330+ integrations",{"type":23,"value":289280},". You can scope it down to the 5–20 tools an LLM can realistically handle (given model limits), mask sensitive fields before they ever reach the model, and keep all requests in-region (US/EU/AU).\nFor PMs, this means you don't need to spin up or maintain separate servers per vendor—you get breadth out of the box, while still narrowing the surface area for each workflow.",{"type":17,"tag":68,"props":289282,"children":289284},{"id":289283},"unified-api-vs-unified-mcp",[289285],{"type":23,"value":289286},"Unified API vs. Unified MCP",{"type":17,"tag":29,"props":289288,"children":289289},{},[289290,289292,289296,289297,289301],{"type":23,"value":289291},"It's useful to separate ",{"type":17,"tag":48,"props":289293,"children":289294},{},[289295],{"type":23,"value":7806},{"type":23,"value":34435},{"type":17,"tag":48,"props":289298,"children":289299},{},[289300],{"type":23,"value":45418},{"type":23,"value":289302},", because they serve different needs:",{"type":17,"tag":80,"props":289304,"children":289305},{},[289306,289322],{"type":17,"tag":84,"props":289307,"children":289308},{},[289309,289313,289315,289320],{"type":17,"tag":48,"props":289310,"children":289311},{},[289312],{"type":23,"value":7806},{"type":23,"value":289314}," is for ",{"type":17,"tag":48,"props":289316,"children":289317},{},[289318],{"type":23,"value":289319},"apps and backends",{"type":23,"value":289321},". Your product calls it directly to pull and store data in your own systems. Think reporting, dashboards, or any feature that needs persistent data.",{"type":17,"tag":84,"props":289323,"children":289324},{},[289325,289329,289330,289334],{"type":17,"tag":48,"props":289326,"children":289327},{},[289328],{"type":23,"value":45418},{"type":23,"value":289314},{"type":17,"tag":48,"props":289331,"children":289332},{},[289333],{"type":23,"value":49663},{"type":23,"value":289335},". The LLM calls tools on demand through the MCP server. Perfect for assistants that act in real time without requiring your own storage or sync layer.",{"type":17,"tag":29,"props":289337,"children":289338},{},[289339,289341,289346],{"type":23,"value":289340},"Most teams will use both. Start with MCP to pilot AI workflows quickly. Use ",{"type":17,"tag":133,"props":289342,"children":289344},{"href":212,"rel":289343},[214],[289345],{"type":23,"value":7806},{"type":23,"value":289347}," when you need scale, data persistence, or deeper reporting.",{"type":17,"tag":68,"props":289349,"children":289351},{"id":289350},"build-vs-license",[289352],{"type":23,"value":289353},"Build vs. License",{"type":17,"tag":29,"props":289355,"children":289356},{},[289357],{"type":23,"value":289358},"As a PM, you'll need to decide: build an MCP layer yourself, or use a hosted one.",{"type":17,"tag":80,"props":289360,"children":289361},{},[289362,289393],{"type":17,"tag":84,"props":289363,"children":289364},{},[289365,289370],{"type":17,"tag":48,"props":289366,"children":289367},{},[289368],{"type":23,"value":289369},"Building in-house:",{"type":17,"tag":80,"props":289371,"children":289372},{},[289373,289378,289383,289388],{"type":17,"tag":84,"props":289374,"children":289375},{},[289376],{"type":23,"value":289377},"Weeks / months per integration for robust coverage",{"type":17,"tag":84,"props":289379,"children":289380},{},[289381],{"type":23,"value":289382},"Ongoing API version and token maintenance",{"type":17,"tag":84,"props":289384,"children":289385},{},[289386],{"type":23,"value":289387},"Security and compliance audits to manage",{"type":17,"tag":84,"props":289389,"children":289390},{},[289391],{"type":23,"value":289392},"High opportunity cost (integration infrastructure isn't your differentiator)",{"type":17,"tag":84,"props":289394,"children":289395},{},[289396,289401,289402,289410,289411,289415],{"type":17,"tag":48,"props":289397,"children":289398},{},[289399],{"type":23,"value":289400},"Licensing",{"type":23,"value":18757},{"type":17,"tag":133,"props":289403,"children":289405},{"href":42620,"rel":289404},[214],[289406],{"type":17,"tag":48,"props":289407,"children":289408},{},[289409],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":48,"props":289412,"children":289413},{},[289414],{"type":23,"value":151272},{"type":17,"tag":80,"props":289416,"children":289417},{},[289418,289428,289433,289438],{"type":17,"tag":84,"props":289419,"children":289420},{},[289421,289426],{"type":17,"tag":48,"props":289422,"children":289423},{},[289424],{"type":23,"value":289425},"330+ integrations and 20k+ tools",{"type":23,"value":289427}," out of the box",{"type":17,"tag":84,"props":289429,"children":289430},{},[289431],{"type":23,"value":289432},"Real-time, normalized schemas with bi-directional read/write support",{"type":17,"tag":84,"props":289434,"children":289435},{},[289436],{"type":23,"value":289437},"Security features (OAuth flows, sensitive field masking, SOC 2 compliance) baked in",{"type":17,"tag":84,"props":289439,"children":289440},{},[289441],{"type":23,"value":289442},"Usage-based pricing that scales predictably with customer adoption",{"type":17,"tag":29,"props":289444,"children":289445},{},[289446],{"type":23,"value":289447},"For most teams, licensing is the pragmatic choice. Unless integrations themselves are your core IP, building your own MCP server drains resources you'd rather spend on unique product features.",{"type":17,"tag":68,"props":289449,"children":289451},{"id":289450},"unified-mcp-the-practical-path-to-production-ai",[289452],{"type":23,"value":289453},"Unified MCP — the practical path to production AI",{"type":17,"tag":29,"props":289455,"children":289456},{},[289457,289462,289464,289469],{"type":17,"tag":48,"props":289458,"children":289459},{},[289460],{"type":23,"value":289461},"What it is:",{"type":23,"value":289463}," A hosted MCP server that gives your AI copilot ",{"type":17,"tag":48,"props":289465,"children":289466},{},[289467],{"type":23,"value":289468},"real-time, permissioned access",{"type":23,"value":289470}," to your customers' SaaS data and actions—without building bespoke connectors or prompt glue.",{"type":17,"tag":29,"props":289472,"children":289473},{},[289474],{"type":17,"tag":48,"props":289475,"children":289476},{},[289477],{"type":23,"value":289478},"What PMs get:",{"type":17,"tag":80,"props":289480,"children":289481},{},[289482,289509,289571,289594,289604],{"type":17,"tag":84,"props":289483,"children":289484},{},[289485,289490,289492,289496,289497,289502,289503,289507],{"type":17,"tag":48,"props":289486,"children":289487},{},[289488],{"type":23,"value":289489},"Fast launch, controlled surface area.",{"type":23,"value":289491}," Instead of handing an AI hundreds of APIs, you scope it down to the 5–20 tools your workflow needs (e.g., ",{"type":17,"tag":33,"props":289493,"children":289494},{},[289495],{"type":23,"value":289168},{"type":23,"value":11826},{"type":17,"tag":33,"props":289498,"children":289499},{},[289500],{"type":23,"value":289501},"scoreCandidate",{"type":23,"value":11826},{"type":17,"tag":33,"props":289504,"children":289505},{},[289506],{"type":23,"value":289175},{"type":23,"value":289508},"). This keeps things inside current LLM limits and reduces risk.",{"type":17,"tag":84,"props":289510,"children":289511},{},[289512,289517],{"type":17,"tag":48,"props":289513,"children":289514},{},[289515],{"type":23,"value":289516},"Enterprise controls by URL, not code.",{"type":17,"tag":80,"props":289518,"children":289519},{},[289520,289544,289561],{"type":17,"tag":84,"props":289521,"children":289522},{},[289523,289528,289529,289535,289537,289542],{"type":17,"tag":48,"props":289524,"children":289525},{},[289526],{"type":23,"value":289527},"Restrict scope:",{"type":23,"value":256906},{"type":17,"tag":6121,"props":289530,"children":289532},{"className":289531},[],[289533],{"type":23,"value":289534},"permissions=",{"type":23,"value":289536}," for read-only vs write, or ",{"type":17,"tag":6121,"props":289538,"children":289540},{"className":289539},[],[289541],{"type":23,"value":240924},{"type":23,"value":289543}," to allow only certain actions.",{"type":17,"tag":84,"props":289545,"children":289546},{},[289547,289552,289554,289559],{"type":17,"tag":48,"props":289548,"children":289549},{},[289550],{"type":23,"value":289551},"Protect data:",{"type":23,"value":289553}," Add ",{"type":17,"tag":6121,"props":289555,"children":289557},{"className":289556},[],[289558],{"type":23,"value":141531},{"type":23,"value":289560}," to strip PII (emails, phone numbers, names) before the model ever sees it.",{"type":17,"tag":84,"props":289562,"children":289563},{},[289564,289569],{"type":17,"tag":48,"props":289565,"children":289566},{},[289567],{"type":23,"value":289568},"Meet residency:",{"type":23,"value":289570}," Choose US, EU, or AU endpoints to keep data in-region.",{"type":17,"tag":84,"props":289572,"children":289573},{},[289574,289579,289581,289586,289587,289592],{"type":17,"tag":48,"props":289575,"children":289576},{},[289577],{"type":23,"value":289578},"Breadth on demand.",{"type":23,"value":289580}," Out of the box you get 20k+ tools spanning 330+ integrations. If you need deep vendor coverage, flip on ",{"type":17,"tag":6121,"props":289582,"children":289584},{"className":289583},[],[289585],{"type":23,"value":142274},{"type":23,"value":272695},{"type":17,"tag":48,"props":289588,"children":289589},{},[289590],{"type":23,"value":289591},"make the full API surface available",{"type":23,"value":289593},"—custom objects and niche endpoints included—without new connectors.",{"type":17,"tag":84,"props":289595,"children":289596},{},[289597,289602],{"type":17,"tag":48,"props":289598,"children":289599},{},[289600],{"type":23,"value":289601},"Real-time by default.",{"type":23,"value":289603}," Every call goes live to the source system. No caches, no sync jobs, no stale data.",{"type":17,"tag":84,"props":289605,"children":289606},{},[289607,289612],{"type":17,"tag":48,"props":289608,"children":289609},{},[289610],{"type":23,"value":289611},"Predictable economics.",{"type":23,"value":289613}," Each tool call = one API request. Easy to model against usage-based pricing.",{"type":17,"tag":29,"props":289615,"children":289616},{},[289617],{"type":17,"tag":48,"props":289618,"children":289619},{},[289620],{"type":23,"value":289621},"Where it fits in your product:",{"type":17,"tag":80,"props":289623,"children":289624},{},[289625,289635,289645],{"type":17,"tag":84,"props":289626,"children":289627},{},[289628,289633],{"type":17,"tag":48,"props":289629,"children":289630},{},[289631],{"type":23,"value":289632},"Prototype → Pilot:",{"type":23,"value":289634}," Ship an end-to-end copilot in days by handing the LLM a scoped toolset—no backend glue required.",{"type":17,"tag":84,"props":289636,"children":289637},{},[289638,289643],{"type":17,"tag":48,"props":289639,"children":289640},{},[289641],{"type":23,"value":289642},"Scale:",{"type":23,"value":289644}," Keep using MCP for live actions, but move to Unified API for persistence, reporting, and heavy queries.",{"type":17,"tag":84,"props":289646,"children":289647},{},[289648,289653],{"type":17,"tag":48,"props":289649,"children":289650},{},[289651],{"type":23,"value":289652},"Security reviews:",{"type":23,"value":289654}," Unified MCP comes with scoped permissions, PII stripping, regional endpoints, and full audit logs—making it much easier to get through enterprise procurement.",{"type":17,"tag":68,"props":289656,"children":289658},{"id":289657},"why-product-managers-should-care",[289659],{"type":23,"value":289660},"Why Product Managers Should Care",{"type":17,"tag":29,"props":289662,"children":289663},{},[289664],{"type":23,"value":289665},"From a PM's perspective, MCP maps cleanly to core priorities:",{"type":17,"tag":80,"props":289667,"children":289668},{},[289669,289686,289696,289706],{"type":17,"tag":84,"props":289670,"children":289671},{},[289672,289677,289679,289684],{"type":17,"tag":48,"props":289673,"children":289674},{},[289675],{"type":23,"value":289676},"Faster GTM velocity:",{"type":23,"value":289678}," No more waiting 3–6 months to ship integrations before an AI feature is viable. With Unified MCP, you can launch a copilot with ",{"type":17,"tag":48,"props":289680,"children":289681},{},[289682],{"type":23,"value":289683},"20k+ supported tools across 330+ integrations",{"type":23,"value":289685}," in days.",{"type":17,"tag":84,"props":289687,"children":289688},{},[289689,289694],{"type":17,"tag":48,"props":289690,"children":289691},{},[289692],{"type":23,"value":289693},"Reduced backlog:",{"type":23,"value":289695}," Customer asks like 'does it integrate with Slack / Jira / Workday?' become a configuration task, not an engineering project. With Unified, you scope the tool list per workflow and the agent is live.",{"type":17,"tag":84,"props":289697,"children":289698},{},[289699,289704],{"type":17,"tag":48,"props":289700,"children":289701},{},[289702],{"type":23,"value":289703},"Predictable cost model:",{"type":23,"value":289705}," Each tool call = one API request. Unified's usage-based pricing means costs scale with adoption, not headcount.",{"type":17,"tag":84,"props":289707,"children":289708},{},[289709,289714],{"type":17,"tag":48,"props":289710,"children":289711},{},[289712],{"type":23,"value":289713},"Enterprise compliance:",{"type":23,"value":289715}," OAuth2, scoped permissions, SOC 2 compliance, and PII-stripping controls are built in. That shortens procurement cycles.",{"type":17,"tag":29,"props":289717,"children":289718},{},[289719,289721,289726],{"type":23,"value":289720},"Put simply: MCP helps you say ",{"type":17,"tag":48,"props":289722,"children":289723},{},[289724],{"type":23,"value":289725},"yes",{"type":23,"value":289727}," to integration-heavy AI features without derailing the roadmap.",{"type":17,"tag":68,"props":289729,"children":289731},{"id":289730},"security-compliance-and-risk",[289732],{"type":23,"value":289733},"Security, Compliance, and Risk",{"type":17,"tag":29,"props":289735,"children":289736},{},[289737],{"type":23,"value":289738},"AI-native SaaS is still early, and investors (and enterprise buyers) are skeptical for good reason:",{"type":17,"tag":80,"props":289740,"children":289741},{},[289742,289752],{"type":17,"tag":84,"props":289743,"children":289744},{},[289745,289750],{"type":17,"tag":48,"props":289746,"children":289747},{},[289748],{"type":23,"value":289749},"LLMs aren't ready for prime time without guardrails.",{"type":23,"value":289751}," Prompt injection, secret leakage, and uncontrolled scope are real risks.",{"type":17,"tag":84,"props":289753,"children":289754},{},[289755,289760],{"type":17,"tag":48,"props":289756,"children":289757},{},[289758],{"type":23,"value":289759},"Enterprises demand auditability.",{"type":23,"value":289761}," They need to know who accessed what, and under what permissions.",{"type":17,"tag":29,"props":289763,"children":289764},{},[289765],{"type":23,"value":289766},"Unified.to MCP addresses these issues head-on:",{"type":17,"tag":80,"props":289768,"children":289769},{},[289770,289785,289807,289817,289827],{"type":17,"tag":84,"props":289771,"children":289772},{},[289773,289778,289780],{"type":17,"tag":48,"props":289774,"children":289775},{},[289776],{"type":23,"value":289777},"No raw keys in prompts.",{"type":23,"value":289779}," Credentials stay secure—handled by the MCP server, never ",{"type":17,"tag":48,"props":289781,"children":289782},{},[289783],{"type":23,"value":289784},"revealed to the model.",{"type":17,"tag":84,"props":289786,"children":289787},{},[289788,289793,289794,289799,289800,289805],{"type":17,"tag":48,"props":289789,"children":289790},{},[289791],{"type":23,"value":289792},"Scoped tool access.",{"type":23,"value":256906},{"type":17,"tag":6121,"props":289795,"children":289797},{"className":289796},[],[289798],{"type":23,"value":289534},{"type":23,"value":75890},{"type":17,"tag":6121,"props":289801,"children":289803},{"className":289802},[],[289804],{"type":23,"value":240924},{"type":23,"value":289806}," to limit exactly what actions are available.",{"type":17,"tag":84,"props":289808,"children":289809},{},[289810,289815],{"type":17,"tag":48,"props":289811,"children":289812},{},[289813],{"type":23,"value":289814},"Zero storage.",{"type":23,"value":289816}," Unified never caches or stores customer data—every call is real-time pass-through.",{"type":17,"tag":84,"props":289818,"children":289819},{},[289820,289825],{"type":17,"tag":48,"props":289821,"children":289822},{},[289823],{"type":23,"value":289824},"Regional hosting.",{"type":23,"value":289826}," US, EU, and AU endpoints keep data in-region.",{"type":17,"tag":84,"props":289828,"children":289829},{},[289830,289835,289836,289841],{"type":17,"tag":48,"props":289831,"children":289832},{},[289833],{"type":23,"value":289834},"PII protection.",{"type":23,"value":18757},{"type":17,"tag":6121,"props":289837,"children":289839},{"className":289838},[],[289840],{"type":23,"value":141531},{"type":23,"value":289842}," strips names, emails, and phone numbers before data reaches the model.",{"type":17,"tag":29,"props":289844,"children":289845},{},[289846,289848,289853],{"type":23,"value":289847},"This framing is important: MCP doesn't solve AI safety in full, but it makes integrations ",{"type":17,"tag":48,"props":289849,"children":289850},{},[289851],{"type":23,"value":289852},"production-ready",{"type":23,"value":289854}," instead of prototype-only.",{"type":17,"tag":29,"props":289856,"children":289857},{},[289858,289863,289864,289872,289873,289878,289879],{"type":17,"tag":33,"props":289859,"children":289860},{},[289861],{"type":23,"value":289862},"👉",{"type":23,"value":18757},{"type":17,"tag":33,"props":289865,"children":289866},{},[289867],{"type":17,"tag":48,"props":289868,"children":289869},{},[289870],{"type":23,"value":289871},"Tip for PMs:",{"type":23,"value":18757},{"type":17,"tag":33,"props":289874,"children":289875},{},[289876],{"type":23,"value":289877},"If legal/security teams hesitate, start with a",{"type":23,"value":18757},{"type":17,"tag":33,"props":289880,"children":289881},{},[289882,289887],{"type":17,"tag":48,"props":289883,"children":289884},{},[289885],{"type":23,"value":289886},"read-only toolset",{"type":23,"value":289888},"__. Add write actions (e.g. updateDeal) later, once audit trails and reviews are in place.",{"type":17,"tag":68,"props":289890,"children":289892},{"id":289891},"the-bottom-line-for-your-roadmap",[289893],{"type":23,"value":289894},"The Bottom Line for Your Roadmap",{"type":17,"tag":29,"props":289896,"children":289897},{},[289898,289900,289905],{"type":23,"value":289899},"MCP isn't a 'nice to have.' It's quickly becoming the ",{"type":17,"tag":48,"props":289901,"children":289902},{},[289903],{"type":23,"value":289904},"standard way AI agents interact with business data",{"type":23,"value":289906},". Just as APIs defined the SaaS era, MCP is defining the AI-native era.",{"type":17,"tag":29,"props":289908,"children":289909},{},[289910],{"type":23,"value":289911},"For Product Managers, the takeaway is clear:",{"type":17,"tag":80,"props":289913,"children":289914},{},[289915,289925],{"type":17,"tag":84,"props":289916,"children":289917},{},[289918,289923],{"type":17,"tag":48,"props":289919,"children":289920},{},[289921],{"type":23,"value":289922},"Use Unified API",{"type":23,"value":289924}," when your product needs persistent, normalized data in your backend.",{"type":17,"tag":84,"props":289926,"children":289927},{},[289928,289933],{"type":17,"tag":48,"props":289929,"children":289930},{},[289931],{"type":23,"value":289932},"Use Unified MCP",{"type":23,"value":289934}," when your copilot or agent needs real-time, scoped access to customer data—20k+ tools across 330+ integrations, with controls for permissions, PII stripping, and regional hosting. Don't reinvent the integration layer—license it and focus on your core product.",{"type":17,"tag":29,"props":289936,"children":289937},{},[289938],{"type":23,"value":289939},"Unified.to MCP turns LLMs from risky demos into production-ready copilots. And in 2025, that difference will determine who wins in the market.",{"type":17,"tag":29,"props":289941,"children":289942},{},[289943,289945,289950,289951,289957],{"type":23,"value":289944},"→ Ready to see it in action? ",{"type":17,"tag":133,"props":289946,"children":289948},{"href":1623,"rel":289947},[214],[289949],{"type":23,"value":1627},{"type":23,"value":75890},{"type":17,"tag":133,"props":289952,"children":289954},{"href":1612,"rel":289953},[214],[289955],{"type":23,"value":289956},"start free",{"type":23,"value":289958}," with Unified MCP today.",{"title":7,"searchDepth":1629,"depth":1629,"links":289960},[289961,289962,289963,289964,289965,289966,289967,289968],{"id":289066,"depth":1629,"text":289069},{"id":289136,"depth":1629,"text":289139},{"id":289283,"depth":1629,"text":289286},{"id":289350,"depth":1629,"text":289353},{"id":289450,"depth":1629,"text":289453},{"id":289657,"depth":1629,"text":289660},{"id":289730,"depth":1629,"text":289733},{"id":289891,"depth":1629,"text":289894},"content:blog:what_is_model_context_protocol_mcp_a_guide_for_product_managers.md","blog/what_is_model_context_protocol_mcp_a_guide_for_product_managers.md","blog/what_is_model_context_protocol_mcp_a_guide_for_product_managers",{"_path":289973,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":289974,"description":289975,"img":289976,"date":289977,"tag":289978,"body":289979,"_type":1677,"_id":290410,"_source":1679,"_file":290411,"_stem":290412,"_extension":1682},"/blog/how_recview_scaled_agency_grade_ats_integrations_with_unified","How RecView scaled agency-grade ATS integrations with Unified.to","Learn how RecView, a video and mobile notetaker for recruiters, partnered with Unified.to to deliver agency-specific ATS integrations, cut integration costs by...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_recview_scaled_agency_grade_ats_integrations_with_unified-icon.png","2025-09-02T00:00:00.000Z","Case Studies",{"type":14,"children":289980,"toc":290403},[289981,289986,289989,289997,290005,290043,290047,290100,290106,290111,290116,290121,290154,290168,290174,290179,290184,290243,290257,290263,290275,290280,290360,290365,290374,290393],{"type":17,"tag":18,"props":289982,"children":289984},{"id":289983},"how-recview-scaled-agency-grade-ats-integrations-with-unifiedto",[289985],{"type":23,"value":289974},{"type":17,"tag":25,"props":289987,"children":289988},{},[],{"type":17,"tag":29,"props":289990,"children":289991},{},[289992],{"type":17,"tag":33,"props":289993,"children":289994},{},[289995],{"type":23,"value":289996},"September 2, 2025",{"type":17,"tag":29,"props":289998,"children":289999},{},[290000],{"type":17,"tag":6438,"props":290001,"children":290004},{"alt":290002,"src":290003},"Recview.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_recview_scaled_agency_grade_ats_integrations_with_unified-0.png",[],{"type":17,"tag":29,"props":290006,"children":290007},{},[290008,290013,290014,290023,290028,290029,290037,290038],{"type":17,"tag":33,"props":290009,"children":290010},{},[290011],{"type":23,"value":290012},"Learn how",{"type":23,"value":18757},{"type":17,"tag":133,"props":290015,"children":290018},{"href":290016,"rel":290017},"http://recview.co/",[214],[290019],{"type":17,"tag":33,"props":290020,"children":290021},{},[290022],{"type":23,"value":277741},{"type":17,"tag":33,"props":290024,"children":290025},{},[290026],{"type":23,"value":290027},", a video and mobile notetaker for recruiters, partnered with",{"type":23,"value":18757},{"type":17,"tag":133,"props":290030,"children":290032},{"href":42620,"rel":290031},[214],[290033],{"type":17,"tag":33,"props":290034,"children":290035},{},[290036],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":33,"props":290039,"children":290040},{},[290041],{"type":23,"value":290042},"to deliver agency-specific ATS integrations, cut integration costs by tens of thousands, and accelerate partner co-sell opportunities.",{"type":17,"tag":239,"props":290044,"children":290045},{"id":44585},[290046],{"type":23,"value":44588},{"type":17,"tag":80,"props":290048,"children":290049},{},[290050,290060,290070,290080,290090],{"type":17,"tag":84,"props":290051,"children":290052},{},[290053,290058],{"type":17,"tag":48,"props":290054,"children":290055},{},[290056],{"type":23,"value":290057},"Product Category:",{"type":23,"value":290059}," Recruitment video + notetaking SaaS",{"type":17,"tag":84,"props":290061,"children":290062},{},[290063,290068],{"type":17,"tag":48,"props":290064,"children":290065},{},[290066],{"type":23,"value":290067},"Use Case:",{"type":23,"value":290069}," Sync recruiter notes and interview data directly into ATS systems",{"type":17,"tag":84,"props":290071,"children":290072},{},[290073,290078],{"type":17,"tag":48,"props":290074,"children":290075},{},[290076],{"type":23,"value":290077},"Key Challenge:",{"type":23,"value":290079}," Supporting agency ATS platforms with both candidate and client endpoints",{"type":17,"tag":84,"props":290081,"children":290082},{},[290083,290088],{"type":17,"tag":48,"props":290084,"children":290085},{},[290086],{"type":23,"value":290087},"Primary Benefit:",{"type":23,"value":290089}," Ability to say 'yes' to any prospect's ATS and expand through partner co-sell",{"type":17,"tag":84,"props":290091,"children":290092},{},[290093,290098],{"type":17,"tag":48,"props":290094,"children":290095},{},[290096],{"type":23,"value":290097},"Time savings:",{"type":23,"value":290099}," Estimated $50k+ engineering cost avoided in year one",{"type":17,"tag":239,"props":290101,"children":290103},{"id":290102},"the-challenge-integration-depth-was-a-barrier-for-agencies",[290104],{"type":23,"value":290105},"The challenge: integration depth was a barrier for agencies",{"type":17,"tag":29,"props":290107,"children":290108},{},[290109],{"type":23,"value":290110},"RecView's product makes recruiting conversations actionable: AI-powered notes, one-way video interviews, and instant updates to the recruiter's system of record.",{"type":17,"tag":29,"props":290112,"children":290113},{},[290114],{"type":23,"value":290115},"From day one, integrations weren't optional. Recruiters run on ATS platforms like JobAdder, Bullhorn, Firefish, Tracker, Recruiterflow, Recruit Wizard, and Mercury ATS. Unlike corporate talent acquisition teams, agencies rely on ATS platforms for both candidate tracking and business development — so RecView needed integrations that covered both candidate and client endpoints.",{"type":17,"tag":29,"props":290117,"children":290118},{},[290119],{"type":23,"value":290120},"Early options looked bleak:",{"type":17,"tag":80,"props":290122,"children":290123},{},[290124,290134,290144],{"type":17,"tag":84,"props":290125,"children":290126},{},[290127,290132],{"type":17,"tag":48,"props":290128,"children":290129},{},[290130],{"type":23,"value":290131},"Custom builds:",{"type":23,"value":290133}," $10k+ per integration, just for partial coverage (candidate objects, not client-side data)",{"type":17,"tag":84,"props":290135,"children":290136},{},[290137,290142],{"type":17,"tag":48,"props":290138,"children":290139},{},[290140],{"type":23,"value":290141},"Legacy providers:",{"type":23,"value":290143}," Expensive platform fees, limited endpoint depth, slow roadmaps",{"type":17,"tag":84,"props":290145,"children":290146},{},[290147,290152],{"type":17,"tag":48,"props":290148,"children":290149},{},[290150],{"type":23,"value":290151},"Maintenance burden:",{"type":23,"value":290153}," Each API change would have required a dedicated integrations engineer",{"type":17,"tag":3414,"props":290155,"children":290156},{},[290157],{"type":17,"tag":29,"props":290158,"children":290159},{},[290160,290161,290166],{"type":23,"value":251519},{"type":17,"tag":33,"props":290162,"children":290163},{},[290164],{"type":23,"value":290165},"One vendor quoted us $10k for a single integration. At that rate, we'd be spending $40–50k just to get started — and we'd still need someone full-time to maintain it.",{"type":23,"value":290167},"' — John Bourke, Founder, RecView",{"type":17,"tag":239,"props":290169,"children":290171},{"id":290170},"from-costly-custom-builds-to-unifiedto",[290172],{"type":23,"value":290173},"From costly custom builds to Unified.to",{"type":17,"tag":29,"props":290175,"children":290176},{},[290177],{"type":23,"value":290178},"RecView chose Unified.to after discovering it already supported their high-priority ATS systems — and could expand functionality quickly.",{"type":17,"tag":29,"props":290180,"children":290181},{},[290182],{"type":23,"value":290183},"Key reasons for the decision:",{"type":17,"tag":80,"props":290185,"children":290186},{},[290187,290197,290207,290217,290227],{"type":17,"tag":84,"props":290188,"children":290189},{},[290190,290195],{"type":17,"tag":48,"props":290191,"children":290192},{},[290193],{"type":23,"value":290194},"Agency-specific coverage:",{"type":23,"value":290196}," Unified exposed both candidate and client endpoints",{"type":17,"tag":84,"props":290198,"children":290199},{},[290200,290205],{"type":17,"tag":48,"props":290201,"children":290202},{},[290203],{"type":23,"value":290204},"Speed:",{"type":23,"value":290206}," A non-technical founder stood up the first integration; new ATS now turn around in ~2 weeks with vendor sandboxes",{"type":17,"tag":84,"props":290208,"children":290209},{},[290210,290215],{"type":17,"tag":48,"props":290211,"children":290212},{},[290213],{"type":23,"value":290214},"Cost:",{"type":23,"value":290216}," Unified was a fraction of the price of legacy vendors or custom dev",{"type":17,"tag":84,"props":290218,"children":290219},{},[290220,290225],{"type":17,"tag":48,"props":290221,"children":290222},{},[290223],{"type":23,"value":290224},"Support:",{"type":23,"value":290226}," Direct Discord access, rapid fixes, and new features almost on-demand",{"type":17,"tag":84,"props":290228,"children":290229},{},[290230,290235,290237,290241],{"type":17,"tag":48,"props":290231,"children":290232},{},[290233],{"type":23,"value":290234},"Evaluated alternatives:",{"type":23,"value":290236}," Considered Merge.dev (>$30k USD platform fees) and Pathfix (calendar ",{"type":17,"tag":133,"props":290238,"children":290239},{"href":4999},[290240],{"type":23,"value":5002},{"type":23,"value":290242},", high cost and ticket volume); Unified was faster to add 60+ ATS and materially less expensive",{"type":17,"tag":3414,"props":290244,"children":290245},{},[290246],{"type":17,"tag":29,"props":290247,"children":290248},{},[290249,290250,290255],{"type":23,"value":251519},{"type":17,"tag":33,"props":290251,"children":290252},{},[290253],{"type":23,"value":290254},"Quick integrations and excellent support — that's the value for us. When agencies need both candidate and client data in their ATS, Unified delivers it fast",{"type":23,"value":290256},".'",{"type":17,"tag":239,"props":290258,"children":290260},{"id":290259},"turning-integrations-into-a-growth-driver",[290261],{"type":23,"value":290262},"Turning integrations into a growth driver",{"type":17,"tag":29,"props":290264,"children":290265},{},[290266,290268,290273],{"type":23,"value":290267},"By partnering with Unified.to, RecView turned integrations from a blocker into a growth driver. Instead of spending months and tens of thousands on custom builds, the team now ships new ATS integrations in weeks — unlocking retention and new revenue opportunities. Partner programs with vendors like Firefish and Recruit Wizard now open access to ",{"type":17,"tag":48,"props":290269,"children":290270},{},[290271],{"type":23,"value":290272},"hundreds",{"type":23,"value":290274}," of net-new agencies per integration.",{"type":17,"tag":29,"props":290276,"children":290277},{},[290278],{"type":23,"value":290279},"Outcomes include:",{"type":17,"tag":80,"props":290281,"children":290282},{},[290283,290293,290303,290313,290323,290333,290343],{"type":17,"tag":84,"props":290284,"children":290285},{},[290286,290291],{"type":17,"tag":48,"props":290287,"children":290288},{},[290289],{"type":23,"value":290290},"$40–50k+ engineering cost avoided",{"type":23,"value":290292}," in year one compared to custom builds",{"type":17,"tag":84,"props":290294,"children":290295},{},[290296,290301],{"type":17,"tag":48,"props":290297,"children":290298},{},[290299],{"type":23,"value":290300},"6 ATS integrations live",{"type":23,"value":290302}," today, with ~10 expected this month",{"type":17,"tag":84,"props":290304,"children":290305},{},[290306,290311],{"type":17,"tag":48,"props":290307,"children":290308},{},[290309],{"type":23,"value":290310},"Faster sales cycles",{"type":23,"value":290312}," by saying 'yes' to any prospect's ATS during evaluation",{"type":17,"tag":84,"props":290314,"children":290315},{},[290316,290321],{"type":17,"tag":48,"props":290317,"children":290318},{},[290319],{"type":23,"value":290320},"Lower churn",{"type":23,"value":290322}," as customers remain sticky once their system of record is connected",{"type":17,"tag":84,"props":290324,"children":290325},{},[290326,290331],{"type":17,"tag":48,"props":290327,"children":290328},{},[290329],{"type":23,"value":290330},"Partner co-sell opportunities",{"type":23,"value":290332}," with ATS vendors",{"type":17,"tag":84,"props":290334,"children":290335},{},[290336,290341],{"type":17,"tag":48,"props":290337,"children":290338},{},[290339],{"type":23,"value":290340},"Migrated calendar integrations",{"type":23,"value":290342}," to Unified, reducing costs and cutting customer support issues through stronger reliability and support.",{"type":17,"tag":84,"props":290344,"children":290345},{},[290346,290351,290353,290358],{"type":17,"tag":48,"props":290347,"children":290348},{},[290349],{"type":23,"value":290350},"Hands-on support:",{"type":23,"value":290352}," Unified's team acted like an ",{"type":17,"tag":48,"props":290354,"children":290355},{},[290356],{"type":23,"value":290357},"extension",{"type":23,"value":290359}," squad (e.g., fixing search overnight, expanding CRM endpoints on request)",{"type":17,"tag":29,"props":290361,"children":290362},{},[290363],{"type":23,"value":290364},"With Unified handling endpoints, authorization, and maintenance, RecView's lean team can stay focused on product while scaling integrations at pace with customer demand.",{"type":17,"tag":239,"props":290366,"children":290368},{"id":290367},"expanding-coverage-and-exploring-unifiedtos-mcp-server",[290369],{"type":17,"tag":48,"props":290370,"children":290371},{},[290372],{"type":23,"value":290373},"Expanding coverage and exploring Unified.to's MCP Server",{"type":17,"tag":29,"props":290375,"children":290376},{},[290377,290379,290384,290386,290391],{"type":23,"value":290378},"RecView plans to build on this foundation by deepening coverage and exploring ",{"type":17,"tag":133,"props":290380,"children":290382},{"href":42620,"rel":290381},[214],[290383],{"type":23,"value":217},{"type":23,"value":290385},"'s ",{"type":17,"tag":133,"props":290387,"children":290389},{"href":45414,"rel":290388},[214],[290390],{"type":23,"value":265208},{"type":23,"value":290392}," to power future AI-driven workflows.",{"type":17,"tag":29,"props":290394,"children":290395},{},[290396,290401],{"type":17,"tag":133,"props":290397,"children":290399},{"href":42620,"rel":290398},[214],[290400],{"type":23,"value":217},{"type":23,"value":290402}," is central to RecView's growth strategy, ensuring every new ATS integration deepens retention and opens new market opportunities.",{"title":7,"searchDepth":1629,"depth":1629,"links":290404},[290405,290406,290407,290408,290409],{"id":44585,"depth":1635,"text":44588},{"id":290102,"depth":1635,"text":290105},{"id":290170,"depth":1635,"text":290173},{"id":290259,"depth":1635,"text":290262},{"id":290367,"depth":1635,"text":290373},"content:blog:how_recview_scaled_agency_grade_ats_integrations_with_unified.md","blog/how_recview_scaled_agency_grade_ats_integrations_with_unified.md","blog/how_recview_scaled_agency_grade_ats_integrations_with_unified",{"_path":290414,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":290415,"description":290416,"img":290417,"date":290418,"tag":6341,"body":290419,"_type":1677,"_id":290816,"_source":1679,"_file":290817,"_stem":290818,"_extension":1682},"/blog/how_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server","How to Connect Anthropic to Real-Time SaaS Data with Unified.to MCP Server","Anthropic's Claude models can power sophisticated workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server-icon.png","2025-08-28T00:00:00.000Z",{"type":14,"children":290420,"toc":290808},[290421,290426,290429,290437,290442,290453,290458,290462,290482,290487,290531,290537,290545,290622,290628,290633,290686,290691,290697,290706,290712,290717,290769,290781,290797],{"type":17,"tag":18,"props":290422,"children":290424},{"id":290423},"how-to-connect-anthropic-to-real-time-saas-data-with-unifiedto-mcp-server",[290425],{"type":23,"value":290415},{"type":17,"tag":25,"props":290427,"children":290428},{},[],{"type":17,"tag":29,"props":290430,"children":290431},{},[290432],{"type":17,"tag":33,"props":290433,"children":290434},{},[290435],{"type":23,"value":290436},"August 28, 2025",{"type":17,"tag":29,"props":290438,"children":290439},{},[290440],{"type":23,"value":290441},"Anthropic's Claude models can power sophisticated workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That usually means writing brittle glue code, normalizing APIs, and maintaining webhook jobs.",{"type":17,"tag":29,"props":290443,"children":290444},{},[290445,290447,290451],{"type":23,"value":290446},"With Unified.to's ",{"type":17,"tag":133,"props":290448,"children":290449},{"href":326},[290450],{"type":23,"value":329},{"type":23,"value":290452}," server, you can skip that complexity. Unified.to exposes 317+ SaaS integrations as real-time, callable tools that Claude can use directly — no custom integration logic required.",{"type":17,"tag":29,"props":290454,"children":290455},{},[290456],{"type":23,"value":290457},"In this guide, we'll walk through how to connect Anthropic to Unified.to MCP so your application can give Claude real-time access to customer SaaS data and actions.",{"type":17,"tag":68,"props":290459,"children":290460},{"id":2109},[290461],{"type":23,"value":97048},{"type":17,"tag":29,"props":290463,"children":290464},{},[290465,290467,290473,290475,290480],{"type":23,"value":290466},"Every request to the Unified.to MCP server must include a token. You can pass this either as a URL parameter (",{"type":17,"tag":6121,"props":290468,"children":290470},{"className":290469},[],[290471],{"type":23,"value":290472},"?token=...",{"type":23,"value":290474},") or in the ",{"type":17,"tag":6121,"props":290476,"children":290478},{"className":290477},[],[290479],{"type":23,"value":240773},{"type":23,"value":290481}," header.",{"type":17,"tag":29,"props":290483,"children":290484},{},[290485],{"type":23,"value":290486},"There are two authentication flows:",{"type":17,"tag":80,"props":290488,"children":290489},{},[290490,290510],{"type":17,"tag":84,"props":290491,"children":290492},{},[290493,290498,290501,290503,290508],{"type":17,"tag":48,"props":290494,"children":290495},{},[290496],{"type":23,"value":290497},"Private (workspace key + connection)",{"type":17,"tag":3891,"props":290499,"children":290500},{},[],{"type":23,"value":290502},"Use your Unified.to workspace API key and add a ",{"type":17,"tag":6121,"props":290504,"children":290506},{"className":290505},[],[290507],{"type":23,"value":92426},{"type":23,"value":290509}," parameter. This should never be exposed publicly.",{"type":17,"tag":84,"props":290511,"children":290512},{},[290513,290518,290521,290523,290529],{"type":17,"tag":48,"props":290514,"children":290515},{},[290516],{"type":23,"value":290517},"Public (end-user safe)",{"type":17,"tag":3891,"props":290519,"children":290520},{},[],{"type":23,"value":290522},"Generate a token in the format ",{"type":17,"tag":6121,"props":290524,"children":290526},{"className":290525},[],[290527],{"type":23,"value":290528},"{connectionID}-{nonce}-{signature}",{"type":23,"value":290530}," using your workspace secret. Safe to share with customers.",{"type":17,"tag":68,"props":290532,"children":290534},{"id":290533},"integrating-with-anthropic-api",[290535],{"type":23,"value":290536},"Integrating with Anthropic API",{"type":17,"tag":29,"props":290538,"children":290539},{},[290540],{"type":17,"tag":48,"props":290541,"children":290542},{},[290543],{"type":23,"value":290544},"Manual Tool Orchestration:",{"type":17,"tag":6154,"props":290546,"children":290547},{},[290548,290568,290589,290600],{"type":17,"tag":84,"props":290549,"children":290550},{},[290551,290552,290557,290559],{"type":23,"value":140426},{"type":17,"tag":6121,"props":290553,"children":290555},{"className":290554},[],[290556],{"type":23,"value":244105},{"type":23,"value":290558}," endpoint and pass the tool list to Claude:",{"type":17,"tag":6893,"props":290560,"children":290563},{"className":290561,"code":290562,"language":127595,"meta":7},[127593],"resp = client.messages.create(\n    model=\"claude-3-5-sonnet-20241022\",\n    tools=tools,\n    input=\"list the candidates and then analyse the resumes from their applications\",\n)\n",[290564],{"type":17,"tag":6121,"props":290565,"children":290566},{"__ignoreMap":7},[290567],{"type":23,"value":290562},{"type":17,"tag":84,"props":290569,"children":290570},{},[290571,290573,290578,290580],{"type":23,"value":290572},"Claude will return a ",{"type":17,"tag":6121,"props":290574,"children":290576},{"className":290575},[],[290577],{"type":23,"value":139496},{"type":23,"value":290579}," block:",{"type":17,"tag":6893,"props":290581,"children":290584},{"className":290582,"code":290583,"language":22503,"meta":7},[22501],"[\n  {\n    \"type\": \"tool_use\",\n    \"id\": \"toolu_...\",\n    \"name\": \"list_candidates\",\n    \"input\": { \"limit\": \"100\" }\n  }\n]\n",[290585],{"type":17,"tag":6121,"props":290586,"children":290587},{"__ignoreMap":7},[290588],{"type":23,"value":290583},{"type":17,"tag":84,"props":290590,"children":290591},{},[290592,290593,290598],{"type":23,"value":140426},{"type":17,"tag":6121,"props":290594,"children":290596},{"className":290595},[],[290597],{"type":23,"value":140432},{"type":23,"value":290599}," endpoint with the arguments.",{"type":17,"tag":84,"props":290601,"children":290602},{},[290603,290605,290611,290613],{"type":23,"value":290604},"Return the result to Claude as a ",{"type":17,"tag":6121,"props":290606,"children":290608},{"className":290607},[],[290609],{"type":23,"value":290610},"tool_result",{"type":23,"value":290612}," block in your next message:",{"type":17,"tag":6893,"props":290614,"children":290617},{"className":290615,"code":290616,"language":22503,"meta":7},[22501],"[\n  {\n    \"type\": \"tool_result\",\n    \"tool_use_id\": \"toolu_...\",\n    \"content\": \"...\"\n  }\n]\n",[290618],{"type":17,"tag":6121,"props":290619,"children":290620},{"__ignoreMap":7},[290621],{"type":23,"value":290616},{"type":17,"tag":68,"props":290623,"children":290625},{"id":290624},"controlling-tool-access",[290626],{"type":23,"value":290627},"Controlling Tool Access",{"type":17,"tag":29,"props":290629,"children":290630},{},[290631],{"type":23,"value":290632},"Unified.to MCP gives you granular control over how tools are exposed to Anthropic:",{"type":17,"tag":80,"props":290634,"children":290635},{},[290636,290646,290656,290666,290676],{"type":17,"tag":84,"props":290637,"children":290638},{},[290639,290644],{"type":17,"tag":6121,"props":290640,"children":290642},{"className":290641},[],[290643],{"type":23,"value":24204},{"type":23,"value":290645}," → restrict available scopes.",{"type":17,"tag":84,"props":290647,"children":290648},{},[290649,290654],{"type":17,"tag":6121,"props":290650,"children":290652},{"className":290651},[],[290653],{"type":23,"value":131599},{"type":23,"value":290655}," → allowlist specific tool IDs.",{"type":17,"tag":84,"props":290657,"children":290658},{},[290659,290664],{"type":17,"tag":6121,"props":290660,"children":290662},{"className":290661},[],[290663],{"type":23,"value":240884},{"type":23,"value":290665}," → add synonyms so Claude better matches tool names.",{"type":17,"tag":84,"props":290667,"children":290668},{},[290669,290674],{"type":17,"tag":6121,"props":290670,"children":290672},{"className":290671},[],[290673],{"type":23,"value":141531},{"type":23,"value":290675}," → automatically strip PII (emails, phone numbers, etc).",{"type":17,"tag":84,"props":290677,"children":290678},{},[290679,290684],{"type":17,"tag":6121,"props":290680,"children":290682},{"className":290681},[],[290683],{"type":23,"value":142274},{"type":23,"value":290685}," → expose all vendor API endpoints, not just Unified.to's normalized models.",{"type":17,"tag":29,"props":290687,"children":290688},{},[290689],{"type":23,"value":290690},"These options help you keep Anthropic outputs predictable and secure in production-grade workflows.",{"type":17,"tag":239,"props":290692,"children":290694},{"id":290693},"sample-snippet",[290695],{"type":23,"value":290696},"Sample Snippet",{"type":17,"tag":6893,"props":290698,"children":290701},{"className":290699,"code":290700,"language":6898,"meta":7},[6896],"import Anthropic from '@anthropic-ai/sdk';\n// Claude model version\nconst modelVersion = 'latest';\n// Unified connection Id that you want to have the mcp to use tools for\nconst connection = 'UNIFIED_CONNECTION_ID';\n // location from where your unified account was created\nconst dc = 'us';\n// Optional: list of specific tools that you want to use\nconst toolIds = ['get_messaging_message','list_messaging_message']\n\nconst params = new URLSearchParams({\n    token: process.env.UNIFIED_API_KEY || '',\n    connection,\n    dc,\n    include_external_tools: includeExternal ? 'true' : 'false',\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst anthropic = new Anthropic({\n    apiKey: process.env.ANTHROPIC_API_KEY,\n});\n\nconst serverUrl = `${process.env.UNIFIED_MCP_URL}/sse?${params.toString()}`;\n\nlet latestModel;\n\nif (modelVersion === 'latest') {\n    // get the latest model from anthropic\n    const models = await anthropic.models.list();\n    latestModel = models.data[0].id;\n} else {\n    latestModel = modelVersion;\n}\n\nconst completion = await anthropic.beta.messages.create({\n    model: latestModel,\n    max_tokens: 1024,\n    messages: [\n        {\n            role: 'user',\n            content: message,\n        },\n    ],\n    stream: false,\n    mcp_servers: [\n        {\n            type: 'url',\n            url: `${process.env.UNIFIED_MCP_URL}/sse?${params.toString()}`, // change url as needed\n            name: 'unifiedMCP',\n        },\n    ],\n    betas: ['mcp-client-2025-04-04'],\n});\n\nconsole.log('response', JSON.stringify(completion, null, 2));\n",[290702],{"type":17,"tag":6121,"props":290703,"children":290704},{"__ignoreMap":7},[290705],{"type":23,"value":290700},{"type":17,"tag":68,"props":290707,"children":290709},{"id":290708},"coverage-and-infrastructure",[290710],{"type":23,"value":290711},"Coverage and Infrastructure",{"type":17,"tag":29,"props":290713,"children":290714},{},[290715],{"type":23,"value":290716},"Unified.to MCP is built for real-world AI use cases:",{"type":17,"tag":80,"props":290718,"children":290719},{},[290720,290730,290740,290749,290759],{"type":17,"tag":84,"props":290721,"children":290722},{},[290723,290728],{"type":17,"tag":48,"props":290724,"children":290725},{},[290726],{"type":23,"value":290727},"20,421+ real-time tools",{"type":23,"value":290729}," (growing weekly)",{"type":17,"tag":84,"props":290731,"children":290732},{},[290733,290738],{"type":17,"tag":48,"props":290734,"children":290735},{},[290736],{"type":23,"value":290737},"335+ integrations across 21 categories",{"type":23,"value":290739}," (ATS, CRM, HRIS, Accounting, Messaging, File Storage, and more)",{"type":17,"tag":84,"props":290741,"children":290742},{},[290743,290747],{"type":17,"tag":48,"props":290744,"children":290745},{},[290746],{"type":23,"value":17067},{"type":23,"value":290748}," — no caching, no liability",{"type":17,"tag":84,"props":290750,"children":290751},{},[290752,290757],{"type":17,"tag":48,"props":290753,"children":290754},{},[290755],{"type":23,"value":290756},"Scoped security controls",{"type":23,"value":290758}," — permissions, aliases, and PII redaction",{"type":17,"tag":84,"props":290760,"children":290761},{},[290762,290767],{"type":17,"tag":48,"props":290763,"children":290764},{},[290765],{"type":23,"value":290766},"Multi-region deployment",{"type":23,"value":290768}," — US, EU, and AU data centers for compliance",{"type":17,"tag":29,"props":290770,"children":290771},{},[290772,290774,290779],{"type":23,"value":290773},"Unified.to MCP works across all major LLM providers: ",{"type":17,"tag":48,"props":290775,"children":290776},{},[290777],{"type":23,"value":290778},"OpenAI, Anthropic, Google Gemini, and Cohere.",{"type":23,"value":290780}," That means you can build once and connect to any agent client.",{"type":17,"tag":29,"props":290782,"children":290783},{},[290784,290791,290792],{"type":17,"tag":133,"props":290785,"children":290788},{"href":290786,"rel":290787},"https://docs.unified.to/mcp?utm_source=chatgpt.com",[214],[290789],{"type":23,"value":290790},"Explore the MCP docs",{"type":23,"value":75890},{"type":17,"tag":133,"props":290793,"children":290795},{"href":290786,"rel":290794},[214],[290796],{"type":23,"value":226481},{"type":17,"tag":3414,"props":290798,"children":290799},{},[290800],{"type":17,"tag":29,"props":290801,"children":290802},{},[290803],{"type":17,"tag":33,"props":290804,"children":290805},{},[290806],{"type":23,"value":290807},"Note: Unified.to MCP is currently in beta and should not be used in production systems yet. Contact us if you'd like to explore production use.",{"title":7,"searchDepth":1629,"depth":1629,"links":290809},[290810,290811,290812,290815],{"id":2109,"depth":1629,"text":97048},{"id":290533,"depth":1629,"text":290536},{"id":290624,"depth":1629,"text":290627,"children":290813},[290814],{"id":290693,"depth":1635,"text":290696},{"id":290708,"depth":1629,"text":290711},"content:blog:how_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server",{"_path":290820,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":290821,"description":290822,"img":290823,"date":290418,"tag":6341,"body":290824,"_type":1677,"_id":291294,"_source":1679,"_file":291295,"_stem":291296,"_extension":1682},"/blog/how_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server","How to Connect Cohere to Real-Time SaaS Data with Unified.to MCP Server","Cohere's LLMs can power rich workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That usually...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server-icon.png",{"type":14,"children":290825,"toc":291282},[290826,290831,290834,290841,290846,290856,290861,290865,290881,290885,290922,290935,290940,290947,290988,290994,291002,291011,291019,291087,291094,291103,291109,291114,291163,291168,291172,291181,291187,291192,291236,291241,291245,291255,291272],{"type":17,"tag":18,"props":290827,"children":290829},{"id":290828},"how-to-connect-cohere-to-real-time-saas-data-with-unifiedto-mcp-server",[290830],{"type":23,"value":290821},{"type":17,"tag":25,"props":290832,"children":290833},{},[],{"type":17,"tag":29,"props":290835,"children":290836},{},[290837],{"type":17,"tag":33,"props":290838,"children":290839},{},[290840],{"type":23,"value":290436},{"type":17,"tag":29,"props":290842,"children":290843},{},[290844],{"type":23,"value":290845},"Cohere's LLMs can power rich workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That usually means writing brittle glue code, normalizing APIs, and maintaining webhook jobs.",{"type":17,"tag":29,"props":290847,"children":290848},{},[290849,290850,290854],{"type":23,"value":290446},{"type":17,"tag":133,"props":290851,"children":290852},{"href":326},[290853],{"type":23,"value":329},{"type":23,"value":290855}," server, you can skip that complexity. Unified.to exposes 317+ SaaS integrations as real-time, callable tools that Cohere can use directly — no custom integration logic required.",{"type":17,"tag":29,"props":290857,"children":290858},{},[290859],{"type":23,"value":290860},"In this guide, we'll walk through how to connect Cohere to Unified.to MCP so your application can give Cohere real-time access to customer SaaS data and actions.",{"type":17,"tag":68,"props":290862,"children":290863},{"id":2109},[290864],{"type":23,"value":97048},{"type":17,"tag":29,"props":290866,"children":290867},{},[290868,290869,290874,290875,290880],{"type":23,"value":290466},{"type":17,"tag":6121,"props":290870,"children":290872},{"className":290871},[],[290873],{"type":23,"value":290472},{"type":23,"value":290474},{"type":17,"tag":6121,"props":290876,"children":290878},{"className":290877},[],[290879],{"type":23,"value":240773},{"type":23,"value":290481},{"type":17,"tag":29,"props":290882,"children":290883},{},[290884],{"type":23,"value":290486},{"type":17,"tag":80,"props":290886,"children":290887},{},[290888,290905],{"type":17,"tag":84,"props":290889,"children":290890},{},[290891,290895,290898,290899,290904],{"type":17,"tag":48,"props":290892,"children":290893},{},[290894],{"type":23,"value":290497},{"type":17,"tag":3891,"props":290896,"children":290897},{},[],{"type":23,"value":290502},{"type":17,"tag":6121,"props":290900,"children":290902},{"className":290901},[],[290903],{"type":23,"value":92426},{"type":23,"value":290509},{"type":17,"tag":84,"props":290906,"children":290907},{},[290908,290912,290915,290916,290921],{"type":17,"tag":48,"props":290909,"children":290910},{},[290911],{"type":23,"value":290517},{"type":17,"tag":3891,"props":290913,"children":290914},{},[],{"type":23,"value":290522},{"type":17,"tag":6121,"props":290917,"children":290919},{"className":290918},[],[290920],{"type":23,"value":290528},{"type":23,"value":290530},{"type":17,"tag":68,"props":290923,"children":290925},{"id":290924},"integrating-unifiedto-mcp-server-with-cohere",[290926,290928,290933],{"type":23,"value":290927},"Integrating ",{"type":17,"tag":133,"props":290929,"children":290931},{"href":42620,"rel":290930},[214],[290932],{"type":23,"value":217},{"type":23,"value":290934}," MCP Server with Cohere",{"type":17,"tag":29,"props":290936,"children":290937},{},[290938],{"type":23,"value":290939},"Cohere's chat API can directly consume tools defined by Unified.to MCP.",{"type":17,"tag":29,"props":290941,"children":290942},{},[290943],{"type":17,"tag":48,"props":290944,"children":290945},{},[290946],{"type":23,"value":290544},{"type":17,"tag":6154,"props":290948,"children":290949},{},[290950,290971,290983],{"type":17,"tag":84,"props":290951,"children":290952},{},[290953,290954,290960,290962],{"type":23,"value":140426},{"type":17,"tag":6121,"props":290955,"children":290957},{"className":290956},[],[290958],{"type":23,"value":290959},"/tools?type=cohere",{"type":23,"value":290961}," endpoint and pass the tool list to Cohere:",{"type":17,"tag":6893,"props":290963,"children":290966},{"className":290964,"code":290965,"language":127595,"meta":7},[127593],"response = co.chat(\n    model=\"command-a-03-2025\", messages=messages, tools=tools\n)\n",[290967],{"type":17,"tag":6121,"props":290968,"children":290969},{"__ignoreMap":7},[290970],{"type":23,"value":290965},{"type":17,"tag":84,"props":290972,"children":290973},{},[290974,290976,290981],{"type":23,"value":290975},"When Cohere requests a tool call, call Unified's ",{"type":17,"tag":6121,"props":290977,"children":290979},{"className":290978},[],[290980],{"type":23,"value":140432},{"type":23,"value":290982}," endpoint.",{"type":17,"tag":84,"props":290984,"children":290985},{},[290986],{"type":23,"value":290987},"Pass the tool result back to Cohere in your next message",{"type":17,"tag":239,"props":290989,"children":290991},{"id":290990},"example-prompt-and-response",[290992],{"type":23,"value":290993},"Example Prompt and Response",{"type":17,"tag":29,"props":290995,"children":290996},{},[290997],{"type":17,"tag":48,"props":290998,"children":290999},{},[291000],{"type":23,"value":291001},"Prompt:",{"type":17,"tag":6893,"props":291003,"children":291006},{"className":291004,"code":291005,"language":20901,"meta":23},[20899],"\"Score this candidate for the Software Engineer job.\"\n",[291007],{"type":17,"tag":6121,"props":291008,"children":291009},{"__ignoreMap":7},[291010],{"type":23,"value":291005},{"type":17,"tag":29,"props":291012,"children":291013},{},[291014],{"type":17,"tag":48,"props":291015,"children":291016},{},[291017],{"type":23,"value":291018},"What happens:",{"type":17,"tag":80,"props":291020,"children":291021},{},[291022,291053,291071,291082],{"type":17,"tag":84,"props":291023,"children":291024},{},[291025,291027,291031,291032,291038,291039,291045,291046,291052],{"type":23,"value":291026},"Cohere discovers the available tools from ",{"type":17,"tag":133,"props":291028,"children":291029},{"href":326},[291030],{"type":23,"value":45418},{"type":23,"value":149495},{"type":17,"tag":6121,"props":291033,"children":291035},{"className":291034},[],[291036],{"type":23,"value":291037},"fetch-candidate",{"type":23,"value":11826},{"type":17,"tag":6121,"props":291040,"children":291042},{"className":291041},[],[291043],{"type":23,"value":291044},"fetch-job",{"type":23,"value":11826},{"type":17,"tag":6121,"props":291047,"children":291049},{"className":291048},[],[291050],{"type":23,"value":291051},"score-candidate",{"type":23,"value":129328},{"type":17,"tag":84,"props":291054,"children":291055},{},[291056,291058,291063,291064,291069],{"type":23,"value":291057},"Cohere calls ",{"type":17,"tag":6121,"props":291059,"children":291061},{"className":291060},[],[291062],{"type":23,"value":291037},{"type":23,"value":34435},{"type":17,"tag":6121,"props":291065,"children":291067},{"className":291066},[],[291068],{"type":23,"value":291044},{"type":23,"value":291070}," tools to get the data.",{"type":17,"tag":84,"props":291072,"children":291073},{},[291074,291075,291080],{"type":23,"value":291057},{"type":17,"tag":6121,"props":291076,"children":291078},{"className":291077},[],[291079],{"type":23,"value":291051},{"type":23,"value":291081}," with the data.",{"type":17,"tag":84,"props":291083,"children":291084},{},[291085],{"type":23,"value":291086},"Cohere returns a response like:",{"type":17,"tag":29,"props":291088,"children":291089},{},[291090],{"type":17,"tag":48,"props":291091,"children":291092},{},[291093],{"type":23,"value":48442},{"type":17,"tag":6893,"props":291095,"children":291098},{"className":291096,"code":291097,"language":20901,"meta":23},[20899],"Candidate Jane Doe scored 92/100 for the Software Engineer job. Strengths: Python, distributed systems. Recommended for interview.\n",[291099],{"type":17,"tag":6121,"props":291100,"children":291101},{"__ignoreMap":7},[291102],{"type":23,"value":291097},{"type":17,"tag":68,"props":291104,"children":291106},{"id":291105},"advanced-mcp-options",[291107],{"type":23,"value":291108},"Advanced MCP Options",{"type":17,"tag":29,"props":291110,"children":291111},{},[291112],{"type":23,"value":291113},"Unified.to MCP gives you granular control over how tools are exposed to Cohere:",{"type":17,"tag":80,"props":291115,"children":291116},{},[291117,291126,291135,291145,291154],{"type":17,"tag":84,"props":291118,"children":291119},{},[291120,291125],{"type":17,"tag":6121,"props":291121,"children":291123},{"className":291122},[],[291124],{"type":23,"value":24204},{"type":23,"value":290645},{"type":17,"tag":84,"props":291127,"children":291128},{},[291129,291134],{"type":17,"tag":6121,"props":291130,"children":291132},{"className":291131},[],[291133],{"type":23,"value":131599},{"type":23,"value":290655},{"type":17,"tag":84,"props":291136,"children":291137},{},[291138,291143],{"type":17,"tag":6121,"props":291139,"children":291141},{"className":291140},[],[291142],{"type":23,"value":240884},{"type":23,"value":291144}," → add synonyms so Cohere better matches tool names.",{"type":17,"tag":84,"props":291146,"children":291147},{},[291148,291153],{"type":17,"tag":6121,"props":291149,"children":291151},{"className":291150},[],[291152],{"type":23,"value":141531},{"type":23,"value":290675},{"type":17,"tag":84,"props":291155,"children":291156},{},[291157,291162],{"type":17,"tag":6121,"props":291158,"children":291160},{"className":291159},[],[291161],{"type":23,"value":142274},{"type":23,"value":290685},{"type":17,"tag":29,"props":291164,"children":291165},{},[291166],{"type":23,"value":291167},"These options help you keep Cohere outputs predictable and secure in production-grade workflows.",{"type":17,"tag":239,"props":291169,"children":291170},{"id":290693},[291171],{"type":23,"value":290696},{"type":17,"tag":6893,"props":291173,"children":291176},{"className":291174,"code":291175,"language":6898,"meta":7},[6896],"import { CohereClientV2 } from 'cohere-ai';\n\n// Unified connection Id that you want to have the mcp to use tools for\nconst connection = 'UNIFIED_CONNECTION_ID';\n // location from where your unified account was created\nconst dc = 'us';\n// Optional: list of specific tools that you want to use\nconst toolIds = ['get_messaging_message','list_messaging_message']\nconst cohereClient = new CohereClientV2({\n    token: process.env.COHERE_API_KEY || '',\n});\n\nconst params = new URLSearchParams({\n    token: process.env.UNIFIED_API_KEY || '',\n    connection,\n    type: 'cohere',\n    dc,\n    include_external_tools: includeExternal ? 'true' : 'false',\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst tools = await fetch(`${process.env.UNIFIED_MCP_URL}/tools?${params.toString()}`);\nconst toolsJson = await tools.json();\nconst completion = await cohereClient.chat({\n    model: 'command-a-03-2025',\n    messages: [\n        {\n            role: 'user',\n            content: message,\n        },\n    ],\n    tools: toolsJson,\n});\n\n\nfor (const toolCall of completion?.message?.toolCalls || []) {\n    // call mcp server with toolCallId\n    const toolCallResponse = await fetch(`${process.env.UNIFIED_MCP_URL}/mcp/tools/${toolCall.function?.name}/call?${params.toString()}`, {\n        method: 'POST',\n        body: toolCall.function?.arguments || '{}',\n    });\n    const toolCallResponseJson = await toolCallResponse.json();\n    console.log(JSON.stringify(toolCallResponseJson, null, 2));\n}\n",[291177],{"type":17,"tag":6121,"props":291178,"children":291179},{"__ignoreMap":7},[291180],{"type":23,"value":291175},{"type":17,"tag":68,"props":291182,"children":291184},{"id":291183},"the-most-complete-mcp-server-for-ai-native-teams",[291185],{"type":23,"value":291186},"The Most Complete MCP Server for AI-Native Teams",{"type":17,"tag":29,"props":291188,"children":291189},{},[291190],{"type":23,"value":291191},"Unified.to MCP is the most complete hosted MCP server available today:",{"type":17,"tag":80,"props":291193,"children":291194},{},[291195,291204,291212,291220,291228],{"type":17,"tag":84,"props":291196,"children":291197},{},[291198,291203],{"type":17,"tag":48,"props":291199,"children":291200},{},[291201],{"type":23,"value":291202},"20,082+ real-time tools",{"type":23,"value":290729},{"type":17,"tag":84,"props":291205,"children":291206},{},[291207,291211],{"type":17,"tag":48,"props":291208,"children":291209},{},[291210],{"type":23,"value":290737},{"type":23,"value":290739},{"type":17,"tag":84,"props":291213,"children":291214},{},[291215,291219],{"type":17,"tag":48,"props":291216,"children":291217},{},[291218],{"type":23,"value":17067},{"type":23,"value":290748},{"type":17,"tag":84,"props":291221,"children":291222},{},[291223,291227],{"type":17,"tag":48,"props":291224,"children":291225},{},[291226],{"type":23,"value":290756},{"type":23,"value":290758},{"type":17,"tag":84,"props":291229,"children":291230},{},[291231,291235],{"type":17,"tag":48,"props":291232,"children":291233},{},[291234],{"type":23,"value":290766},{"type":23,"value":290768},{"type":17,"tag":29,"props":291237,"children":291238},{},[291239],{"type":23,"value":291240},"This ensures your Cohere workflows aren't just demos — they're secure, scalable, and designed for production-grade use cases.",{"type":17,"tag":68,"props":291242,"children":291243},{"id":44469},[291244],{"type":23,"value":44472},{"type":17,"tag":29,"props":291246,"children":291247},{},[291248,291249,291254],{"type":23,"value":290773},{"type":17,"tag":48,"props":291250,"children":291251},{},[291252],{"type":23,"value":291253},"OpenAI, Anthropic, Google Gemini and Cohere.",{"type":23,"value":290780},{"type":17,"tag":29,"props":291256,"children":291257},{},[291258,291263,291264,291270],{"type":17,"tag":133,"props":291259,"children":291261},{"href":290786,"rel":291260},[214],[291262],{"type":23,"value":290790},{"type":23,"value":75890},{"type":17,"tag":133,"props":291265,"children":291268},{"href":291266,"rel":291267},"https://calendly.com/d/cph9-g8n-jzg/connect-with-unified?utm_source=chatgpt.com",[214],[291269],{"type":23,"value":226481},{"type":23,"value":291271}," to see it live in action.",{"type":17,"tag":3414,"props":291273,"children":291274},{},[291275],{"type":17,"tag":29,"props":291276,"children":291277},{},[291278],{"type":17,"tag":33,"props":291279,"children":291280},{},[291281],{"type":23,"value":290807},{"title":7,"searchDepth":1629,"depth":1629,"links":291283},[291284,291285,291289,291292,291293],{"id":2109,"depth":1629,"text":97048},{"id":290924,"depth":1629,"text":291286,"children":291287},"Integrating Unified.to MCP Server with Cohere",[291288],{"id":290990,"depth":1635,"text":290993},{"id":291105,"depth":1629,"text":291108,"children":291290},[291291],{"id":290693,"depth":1635,"text":290696},{"id":291183,"depth":1629,"text":291186},{"id":44469,"depth":1629,"text":44472},"content:blog:how_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server",{"_path":291298,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":291299,"description":291300,"img":291301,"date":290418,"tag":6341,"body":291302,"_type":1677,"_id":291676,"_source":1679,"_file":291677,"_stem":291678,"_extension":1682},"/blog/how_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server","How to Connect Google Gemini to Real-Time SaaS Data with Unified.to MCP Server","Google Gemini can power powerful workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server-icon.png",{"type":14,"children":291303,"toc":291668},[291304,291309,291312,291319,291331,291355,291360,291364,291380,291384,291421,291427,291434,291501,291505,291510,291560,291565,291570,291579,291583,291587,291630,291639,291658],{"type":17,"tag":18,"props":291305,"children":291307},{"id":291306},"how-to-connect-google-gemini-to-real-time-saas-data-with-unifiedto-mcp-server",[291308],{"type":23,"value":291299},{"type":17,"tag":25,"props":291310,"children":291311},{},[],{"type":17,"tag":29,"props":291313,"children":291314},{},[291315],{"type":17,"tag":33,"props":291316,"children":291317},{},[291318],{"type":23,"value":290436},{"type":17,"tag":29,"props":291320,"children":291321},{},[291322,291324,291329],{"type":23,"value":291323},"Google Gemini can power powerful workflows — but most products still need access to ",{"type":17,"tag":48,"props":291325,"children":291326},{},[291327],{"type":23,"value":291328},"live customer data",{"type":23,"value":291330}," from CRMs, ATSs, HRIS, or accounting systems. That usually means writing brittle glue code, normalizing APIs, and maintaining webhook jobs.",{"type":17,"tag":29,"props":291332,"children":291333},{},[291334,291335,291346,291348,291353],{"type":23,"value":249763},{"type":17,"tag":48,"props":291336,"children":291337},{},[291338,291340,291344],{"type":23,"value":291339},"Unified.to's ",{"type":17,"tag":133,"props":291341,"children":291342},{"href":326},[291343],{"type":23,"value":329},{"type":23,"value":291345}," server",{"type":23,"value":291347},", you can skip that complexity. Unified.to exposes 317+ SaaS integrations as ",{"type":17,"tag":48,"props":291349,"children":291350},{},[291351],{"type":23,"value":291352},"real-time, callable tools",{"type":23,"value":291354}," that Gemini can use directly — no custom integration logic required.",{"type":17,"tag":29,"props":291356,"children":291357},{},[291358],{"type":23,"value":291359},"In this guide, we'll walk through how to connect Gemini to Unified.to MCP so your application can give Gemini real-time access to customer SaaS data and actions.",{"type":17,"tag":68,"props":291361,"children":291362},{"id":2109},[291363],{"type":23,"value":97048},{"type":17,"tag":29,"props":291365,"children":291366},{},[291367,291368,291373,291374,291379],{"type":23,"value":290466},{"type":17,"tag":6121,"props":291369,"children":291371},{"className":291370},[],[291372],{"type":23,"value":290472},{"type":23,"value":290474},{"type":17,"tag":6121,"props":291375,"children":291377},{"className":291376},[],[291378],{"type":23,"value":240773},{"type":23,"value":290481},{"type":17,"tag":29,"props":291381,"children":291382},{},[291383],{"type":23,"value":290486},{"type":17,"tag":80,"props":291385,"children":291386},{},[291387,291404],{"type":17,"tag":84,"props":291388,"children":291389},{},[291390,291394,291397,291398,291403],{"type":17,"tag":48,"props":291391,"children":291392},{},[291393],{"type":23,"value":290497},{"type":17,"tag":3891,"props":291395,"children":291396},{},[],{"type":23,"value":290502},{"type":17,"tag":6121,"props":291399,"children":291401},{"className":291400},[],[291402],{"type":23,"value":92426},{"type":23,"value":290509},{"type":17,"tag":84,"props":291405,"children":291406},{},[291407,291411,291414,291415,291420],{"type":17,"tag":48,"props":291408,"children":291409},{},[291410],{"type":23,"value":290517},{"type":17,"tag":3891,"props":291412,"children":291413},{},[],{"type":23,"value":290522},{"type":17,"tag":6121,"props":291416,"children":291418},{"className":291417},[],[291419],{"type":23,"value":290528},{"type":23,"value":290530},{"type":17,"tag":68,"props":291422,"children":291424},{"id":291423},"integrating-with-google-gemini-api",[291425],{"type":23,"value":291426},"Integrating with Google Gemini API",{"type":17,"tag":29,"props":291428,"children":291429},{},[291430],{"type":17,"tag":48,"props":291431,"children":291432},{},[291433],{"type":23,"value":290544},{"type":17,"tag":6154,"props":291435,"children":291436},{},[291437,291455,291469,291479],{"type":17,"tag":84,"props":291438,"children":291439},{},[291440,291441,291446,291448,291453],{"type":23,"value":140426},{"type":17,"tag":6121,"props":291442,"children":291444},{"className":291443},[],[291445],{"type":23,"value":244105},{"type":23,"value":291447}," endpoint and pass the tool list as ",{"type":17,"tag":6121,"props":291449,"children":291451},{"className":291450},[],[291452],{"type":23,"value":141397},{"type":23,"value":291454}," to Gemini.",{"type":17,"tag":84,"props":291456,"children":291457},{},[291458,291460],{"type":23,"value":291459},"Gemini will return a function call request:",{"type":17,"tag":6893,"props":291461,"children":291464},{"className":291462,"code":291463,"language":20901,"meta":23},[20899],"function_call {\n  name: \"list_candidates\"\n  args { fields { key: \"limit\" value { string_value: \"100\" } } }\n}\n",[291465],{"type":17,"tag":6121,"props":291466,"children":291467},{"__ignoreMap":7},[291468],{"type":23,"value":291463},{"type":17,"tag":84,"props":291470,"children":291471},{},[291472,291473,291478],{"type":23,"value":140426},{"type":17,"tag":6121,"props":291474,"children":291476},{"className":291475},[],[291477],{"type":23,"value":140432},{"type":23,"value":290982},{"type":17,"tag":84,"props":291480,"children":291481},{},[291482,291484,291490,291492],{"type":23,"value":291483},"Respond to Gemini with the tool result as a ",{"type":17,"tag":6121,"props":291485,"children":291487},{"className":291486},[],[291488],{"type":23,"value":291489},"functionResponse",{"type":23,"value":291491}," in your next message:",{"type":17,"tag":6893,"props":291493,"children":291496},{"className":291494,"code":291495,"language":22503,"meta":7},[22501],"{\n  \"role\": \"user\",\n  \"parts\": [\n    {\n      \"functionResponse\": {\n        \"name\": \"list_candidates\",\n        \"response\": { ... }\n      }\n    }\n  ]\n}\n",[291497],{"type":17,"tag":6121,"props":291498,"children":291499},{"__ignoreMap":7},[291500],{"type":23,"value":291495},{"type":17,"tag":68,"props":291502,"children":291503},{"id":290624},[291504],{"type":23,"value":290627},{"type":17,"tag":29,"props":291506,"children":291507},{},[291508],{"type":23,"value":291509},"Unified.to MCP gives you granular control over how tools are exposed to Gemini:",{"type":17,"tag":80,"props":291511,"children":291512},{},[291513,291522,291531,291541,291551],{"type":17,"tag":84,"props":291514,"children":291515},{},[291516,291521],{"type":17,"tag":6121,"props":291517,"children":291519},{"className":291518},[],[291520],{"type":23,"value":24204},{"type":23,"value":290645},{"type":17,"tag":84,"props":291523,"children":291524},{},[291525,291530],{"type":17,"tag":6121,"props":291526,"children":291528},{"className":291527},[],[291529],{"type":23,"value":131599},{"type":23,"value":290655},{"type":17,"tag":84,"props":291532,"children":291533},{},[291534,291539],{"type":17,"tag":6121,"props":291535,"children":291537},{"className":291536},[],[291538],{"type":23,"value":240884},{"type":23,"value":291540}," → add synonyms so Gemini can perform better matches for tool names.",{"type":17,"tag":84,"props":291542,"children":291543},{},[291544,291549],{"type":17,"tag":6121,"props":291545,"children":291547},{"className":291546},[],[291548],{"type":23,"value":141531},{"type":23,"value":291550}," → automatically strip PII (emails, phone numbers, name, gender, etc).",{"type":17,"tag":84,"props":291552,"children":291553},{},[291554,291559],{"type":17,"tag":6121,"props":291555,"children":291557},{"className":291556},[],[291558],{"type":23,"value":142274},{"type":23,"value":290685},{"type":17,"tag":29,"props":291561,"children":291562},{},[291563],{"type":23,"value":291564},"These options help you keep Gemini outputs predictable and secure in production-grade workflows.",{"type":17,"tag":239,"props":291566,"children":291567},{"id":290693},[291568],{"type":23,"value":291569},"Sample Snippet:",{"type":17,"tag":6893,"props":291571,"children":291574},{"className":291572,"code":291573,"language":6898,"meta":7},[6896],"import { GoogleGenAI, mcpToTool } from '@google/genai';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\n// Construct a new GEMINI client via GoogleGenAI\n\n// Gemini model version\nconst modelVersion = 'latest';\n// Unified connection Id that you want to have the mcp to use tools for\nconst connection = 'UNIFIED_CONNECTION_ID';\n // location from where your unified account was created\nconst dc = 'us';\n// Optional: list of specific tools that you want to use\nconst toolIds = ['get_messaging_message','list_messaging_message']\n\nconst gemini = new GoogleGenAI({\n    apiKey: process.env.GEMINI_API_KEY || '',\n});\n\n// Construct the required params\nconst params = new URLSearchParams({\n    token: process.env.UNIFIED_API_KEY || '',\n    connection,\n    type: 'gemini',\n    dc,\n    include_external_tools: true, // set to false if you don't want to include external tools\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst serverUrl = `${process.env.UNIFIED_MCP_URL}/mcp?${params.toString()}`;\n\nconst transport = new StreamableHTTPClientTransport(new URL(serverUrl));\nconst client = new Client({\n    name: 'unified-mcp',\n    version: '1.0.0',\n});\n\nawait client.connect(transport);\n\nlet latestModel;\n// Optional \nif (modelVersion === 'latest') {\n    // get the latest model from gemini\n    const models = await gemini.models.list();\n    latestModel = models.page.filter((model: any) => model.name.includes('gemini') && !model.name.includes('embedding')).pop()?.name || 'gemini-2.0-flash';\n} else {\n    latestModel = modelVersion;\n}\n\nconst completion = await gemini.models.generateContent({\n    model: latestModel?.replace('model/', ''),\n    contents: message,\n    config: {\n        tools: [mcpToTool(client)],\n    },\n});\n\nfor (const chunk of completion?.candidates || []) {\n    console.log(JSON.stringify(chunk, null, 2));\n    if (chunk.content?.parts) {\n        for (const part of chunk.content.parts) {\n            if (part.text) {\n                console.log(part.text);\n            }\n        }\n    }\n}\n",[291575],{"type":17,"tag":6121,"props":291576,"children":291577},{"__ignoreMap":7},[291578],{"type":23,"value":291573},{"type":17,"tag":68,"props":291580,"children":291581},{"id":290708},[291582],{"type":23,"value":290711},{"type":17,"tag":29,"props":291584,"children":291585},{},[291586],{"type":23,"value":290716},{"type":17,"tag":80,"props":291588,"children":291589},{},[291590,291598,291606,291614,291622],{"type":17,"tag":84,"props":291591,"children":291592},{},[291593,291597],{"type":17,"tag":48,"props":291594,"children":291595},{},[291596],{"type":23,"value":290727},{"type":23,"value":290729},{"type":17,"tag":84,"props":291599,"children":291600},{},[291601,291605],{"type":17,"tag":48,"props":291602,"children":291603},{},[291604],{"type":23,"value":290737},{"type":23,"value":290739},{"type":17,"tag":84,"props":291607,"children":291608},{},[291609,291613],{"type":17,"tag":48,"props":291610,"children":291611},{},[291612],{"type":23,"value":17067},{"type":23,"value":290748},{"type":17,"tag":84,"props":291615,"children":291616},{},[291617,291621],{"type":17,"tag":48,"props":291618,"children":291619},{},[291620],{"type":23,"value":290756},{"type":23,"value":290758},{"type":17,"tag":84,"props":291623,"children":291624},{},[291625,291629],{"type":17,"tag":48,"props":291626,"children":291627},{},[291628],{"type":23,"value":290766},{"type":23,"value":290768},{"type":17,"tag":29,"props":291631,"children":291632},{},[291633,291634,291638],{"type":23,"value":290773},{"type":17,"tag":48,"props":291635,"children":291636},{},[291637],{"type":23,"value":290778},{"type":23,"value":290780},{"type":17,"tag":80,"props":291640,"children":291641},{},[291642,291650],{"type":17,"tag":84,"props":291643,"children":291644},{},[291645],{"type":17,"tag":133,"props":291646,"children":291648},{"href":290786,"rel":291647},[214],[291649],{"type":23,"value":290790},{"type":17,"tag":84,"props":291651,"children":291652},{},[291653],{"type":17,"tag":133,"props":291654,"children":291656},{"href":291266,"rel":291655},[214],[291657],{"type":23,"value":1627},{"type":17,"tag":3414,"props":291659,"children":291660},{},[291661],{"type":17,"tag":29,"props":291662,"children":291663},{},[291664],{"type":17,"tag":33,"props":291665,"children":291666},{},[291667],{"type":23,"value":290807},{"title":7,"searchDepth":1629,"depth":1629,"links":291669},[291670,291671,291672,291675],{"id":2109,"depth":1629,"text":97048},{"id":291423,"depth":1629,"text":291426},{"id":290624,"depth":1629,"text":290627,"children":291673},[291674],{"id":290693,"depth":1635,"text":291569},{"id":290708,"depth":1629,"text":290711},"content:blog:how_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server",{"_path":291680,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":291681,"description":291682,"img":291683,"date":290418,"tag":6341,"body":291684,"_type":1677,"_id":292019,"_source":1679,"_file":292020,"_stem":292021,"_extension":1682},"/blog/how_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server","How to Connect OpenAI to Real-Time SaaS Data with Unified.to MCP Server","OpenAI's LLMs can power rich workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That usually...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server-icon.png",{"type":14,"children":291685,"toc":292009},[291686,291691,291694,291701,291711,291721,291726,291730,291746,291750,291787,291793,291798,291804,291809,291820,291829,291839,291843,291848,291897,291902,291906,291915,291919,291923,291966,291971,291980,291999],{"type":17,"tag":18,"props":291687,"children":291689},{"id":291688},"how-to-connect-openai-to-real-time-saas-data-with-unifiedto-mcp-server",[291690],{"type":23,"value":291681},{"type":17,"tag":25,"props":291692,"children":291693},{},[],{"type":17,"tag":29,"props":291695,"children":291696},{},[291697],{"type":17,"tag":33,"props":291698,"children":291699},{},[291700],{"type":23,"value":290436},{"type":17,"tag":29,"props":291702,"children":291703},{},[291704,291706,291710],{"type":23,"value":291705},"OpenAI's LLMs can power rich workflows — but most products still need access to ",{"type":17,"tag":48,"props":291707,"children":291708},{},[291709],{"type":23,"value":291328},{"type":23,"value":291330},{"type":17,"tag":29,"props":291712,"children":291713},{},[291714,291715,291719],{"type":23,"value":290446},{"type":17,"tag":133,"props":291716,"children":291717},{"href":326},[291718],{"type":23,"value":329},{"type":23,"value":291720}," server, you can skip that complexity. Unified.to exposes 317+ SaaS integrations as real-time, callable tools that OpenAI can use directly — no custom integration logic required.",{"type":17,"tag":29,"props":291722,"children":291723},{},[291724],{"type":23,"value":291725},"In this guide, we'll walk through how to connect OpenAI to Unified.to MCP so your application can give OpenAI real-time access to customer SaaS data and actions.",{"type":17,"tag":68,"props":291727,"children":291728},{"id":2109},[291729],{"type":23,"value":97048},{"type":17,"tag":29,"props":291731,"children":291732},{},[291733,291734,291739,291740,291745],{"type":23,"value":290466},{"type":17,"tag":6121,"props":291735,"children":291737},{"className":291736},[],[291738],{"type":23,"value":290472},{"type":23,"value":290474},{"type":17,"tag":6121,"props":291741,"children":291743},{"className":291742},[],[291744],{"type":23,"value":240773},{"type":23,"value":290481},{"type":17,"tag":29,"props":291747,"children":291748},{},[291749],{"type":23,"value":290486},{"type":17,"tag":80,"props":291751,"children":291752},{},[291753,291770],{"type":17,"tag":84,"props":291754,"children":291755},{},[291756,291760,291763,291764,291769],{"type":17,"tag":48,"props":291757,"children":291758},{},[291759],{"type":23,"value":290497},{"type":17,"tag":3891,"props":291761,"children":291762},{},[],{"type":23,"value":290502},{"type":17,"tag":6121,"props":291765,"children":291767},{"className":291766},[],[291768],{"type":23,"value":92426},{"type":23,"value":290509},{"type":17,"tag":84,"props":291771,"children":291772},{},[291773,291777,291780,291781,291786],{"type":17,"tag":48,"props":291774,"children":291775},{},[291776],{"type":23,"value":290517},{"type":17,"tag":3891,"props":291778,"children":291779},{},[],{"type":23,"value":290522},{"type":17,"tag":6121,"props":291782,"children":291784},{"className":291783},[],[291785],{"type":23,"value":290528},{"type":23,"value":290530},{"type":17,"tag":68,"props":291788,"children":291790},{"id":291789},"integrating-with-openai-llm-api",[291791],{"type":23,"value":291792},"Integrating with OpenAI (LLM API)",{"type":17,"tag":29,"props":291794,"children":291795},{},[291796],{"type":23,"value":291797},"Once your MCP client is set up, you can connect it to OpenAI's API, which natively supports remote MCP servers.",{"type":17,"tag":239,"props":291799,"children":291801},{"id":291800},"configure-openai-to-use-unified-mcp",[291802],{"type":23,"value":291803},"Configure OpenAI to Use Unified MCP",{"type":17,"tag":29,"props":291805,"children":291806},{},[291807],{"type":23,"value":291808},"When you send a chat completion request, specify the MCP server as a tool source.",{"type":17,"tag":29,"props":291810,"children":291811},{},[291812,291814,291819],{"type":23,"value":291813},"Here's a ",{"type":17,"tag":48,"props":291815,"children":291816},{},[291817],{"type":23,"value":291818},"candidate assessment example",{"type":23,"value":20456},{"type":17,"tag":6893,"props":291821,"children":291824},{"className":291822,"code":291823,"language":127595,"meta":7},[127593],"import openai\n\nopenai.api_key = os.getenv(\"OPENAI_API_KEY\")\n\nresponse = openai.chat.completions.create(\n    model=\"gpt-4o\",\n    messages=[\n        {\"role\": \"user\", \"content\": \"Score this candidate for the Software Engineer job.\"}\n    ],\n    tools=[{\n        \"type\": \"mcp\",\n        \"url\": MCP_URL,  # The Unified MCP URL with your token\n    }],\n    tool_choice=\"auto\"\n)\n\nprint(response.choices[0].message.content)\n",[291825],{"type":17,"tag":6121,"props":291826,"children":291827},{"__ignoreMap":7},[291828],{"type":23,"value":291823},{"type":17,"tag":29,"props":291830,"children":291831},{},[291832,291834,291838],{"type":23,"value":291833},"No backend glue code required—OpenAI orchestrates the tool calls via ",{"type":17,"tag":133,"props":291835,"children":291836},{"href":326},[291837],{"type":23,"value":45418},{"type":23,"value":54},{"type":17,"tag":68,"props":291840,"children":291841},{"id":291105},[291842],{"type":23,"value":291108},{"type":17,"tag":29,"props":291844,"children":291845},{},[291846],{"type":23,"value":291847},"Unified.to MCP gives you granular control over how tools are exposed to OpenAI:",{"type":17,"tag":80,"props":291849,"children":291850},{},[291851,291860,291869,291879,291888],{"type":17,"tag":84,"props":291852,"children":291853},{},[291854,291859],{"type":17,"tag":6121,"props":291855,"children":291857},{"className":291856},[],[291858],{"type":23,"value":24204},{"type":23,"value":290645},{"type":17,"tag":84,"props":291861,"children":291862},{},[291863,291868],{"type":17,"tag":6121,"props":291864,"children":291866},{"className":291865},[],[291867],{"type":23,"value":131599},{"type":23,"value":290655},{"type":17,"tag":84,"props":291870,"children":291871},{},[291872,291877],{"type":17,"tag":6121,"props":291873,"children":291875},{"className":291874},[],[291876],{"type":23,"value":240884},{"type":23,"value":291878}," → add synonyms so OpenAI better matches tool names.",{"type":17,"tag":84,"props":291880,"children":291881},{},[291882,291887],{"type":17,"tag":6121,"props":291883,"children":291885},{"className":291884},[],[291886],{"type":23,"value":141531},{"type":23,"value":290675},{"type":17,"tag":84,"props":291889,"children":291890},{},[291891,291896],{"type":17,"tag":6121,"props":291892,"children":291894},{"className":291893},[],[291895],{"type":23,"value":142274},{"type":23,"value":290685},{"type":17,"tag":29,"props":291898,"children":291899},{},[291900],{"type":23,"value":291901},"These options help you keep OpenAI outputs predictable and secure in production-grade workflows.",{"type":17,"tag":239,"props":291903,"children":291904},{"id":290693},[291905],{"type":23,"value":290696},{"type":17,"tag":6893,"props":291907,"children":291910},{"className":291908,"code":291909,"language":6898,"meta":7},[6896],"import OpenAI from 'openai';\n\nimport Anthropic from '@anthropic-ai/sdk';\n// OpenAI model version\nconst modelVersion = 'latest';\n// Unified connection Id that you want to have the mcp to use tools for\nconst connection = 'UNIFIED_CONNECTION_ID';\n // location from where your unified account was created\nconst dc = 'us';\n// Optional: list of specific tools that you want to use\nconst toolIds = ['get_messaging_message','list_messaging_message']\n\nconst openai = new OpenAI({\n    apiKey: process.env.OPENAI_API_KEY || '',\n});\nconst params = new URLSearchParams({\n    token: process.env.UNIFIED_API_KEY || '',\n    type: 'openai',\n    dc,\n    connection,\n    include_external_tools: includeExternal ? 'true' : 'false',\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst serverUrl = `${process.env.UNIFIED_MCP_URL}/sse?${params.toString()}`;\n\n\nlet latestModel;\nif (modelVersion === 'latest') {\n    // get the latest model from open ai\n    const models = await openai.models.list();\n    latestModel = models.data[0].id;\n} else {\n    latestModel = modelVersion;\n}\n\nconst completion = await openai.responses.create({\n    model: latestModel,\n    tools: [\n        {\n            type: 'mcp',\n            server_label: 'unifiedMCP',\n            server_url: serverUrl, // change url as needed\n            require_approval: 'never',\n        },\n    ],\n    instructions: `You are a helpful assistant`,\n    input: message,\n});\n\nfor await (const chunk of completion.output) {\n    console.log('chunk', chunk);\n    console.log(JSON.stringify(chunk, null, 2));\n}\n",[291911],{"type":17,"tag":6121,"props":291912,"children":291913},{"__ignoreMap":7},[291914],{"type":23,"value":291909},{"type":17,"tag":68,"props":291916,"children":291917},{"id":290708},[291918],{"type":23,"value":290711},{"type":17,"tag":29,"props":291920,"children":291921},{},[291922],{"type":23,"value":291191},{"type":17,"tag":80,"props":291924,"children":291925},{},[291926,291934,291942,291950,291958],{"type":17,"tag":84,"props":291927,"children":291928},{},[291929,291933],{"type":17,"tag":48,"props":291930,"children":291931},{},[291932],{"type":23,"value":290727},{"type":23,"value":290729},{"type":17,"tag":84,"props":291935,"children":291936},{},[291937,291941],{"type":17,"tag":48,"props":291938,"children":291939},{},[291940],{"type":23,"value":290737},{"type":23,"value":290739},{"type":17,"tag":84,"props":291943,"children":291944},{},[291945,291949],{"type":17,"tag":48,"props":291946,"children":291947},{},[291948],{"type":23,"value":17067},{"type":23,"value":290748},{"type":17,"tag":84,"props":291951,"children":291952},{},[291953,291957],{"type":17,"tag":48,"props":291954,"children":291955},{},[291956],{"type":23,"value":290756},{"type":23,"value":290758},{"type":17,"tag":84,"props":291959,"children":291960},{},[291961,291965],{"type":17,"tag":48,"props":291962,"children":291963},{},[291964],{"type":23,"value":290766},{"type":23,"value":290768},{"type":17,"tag":29,"props":291967,"children":291968},{},[291969],{"type":23,"value":291970},"This ensures your OpenAI workflows aren't just demos — they're secure, scalable, and designed for production-grade use cases.",{"type":17,"tag":29,"props":291972,"children":291973},{},[291974,291975,291979],{"type":23,"value":290773},{"type":17,"tag":48,"props":291976,"children":291977},{},[291978],{"type":23,"value":290778},{"type":23,"value":290780},{"type":17,"tag":80,"props":291981,"children":291982},{},[291983,291991],{"type":17,"tag":84,"props":291984,"children":291985},{},[291986],{"type":17,"tag":133,"props":291987,"children":291989},{"href":290786,"rel":291988},[214],[291990],{"type":23,"value":290790},{"type":17,"tag":84,"props":291992,"children":291993},{},[291994],{"type":17,"tag":133,"props":291995,"children":291997},{"href":291266,"rel":291996},[214],[291998],{"type":23,"value":1627},{"type":17,"tag":3414,"props":292000,"children":292001},{},[292002],{"type":17,"tag":29,"props":292003,"children":292004},{},[292005],{"type":17,"tag":33,"props":292006,"children":292007},{},[292008],{"type":23,"value":290807},{"title":7,"searchDepth":1629,"depth":1629,"links":292010},[292011,292012,292015,292018],{"id":2109,"depth":1629,"text":97048},{"id":291789,"depth":1629,"text":291792,"children":292013},[292014],{"id":291800,"depth":1635,"text":291803},{"id":291105,"depth":1629,"text":291108,"children":292016},[292017],{"id":290693,"depth":1635,"text":290696},{"id":290708,"depth":1629,"text":290711},"content:blog:how_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server",{"_path":292023,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":292024,"description":292025,"img":292026,"date":290418,"tag":12,"body":292027,"_type":1677,"_id":292884,"_source":1679,"_file":292885,"_stem":292886,"_extension":1682},"/blog/knowledge_management_systems_unified_apis_features_use_cases_and_options","Knowledge Management Systems Unified APIs: Features, Use Cases, and Options","Enterprise knowledge lives everywhere, Confluence wikis, Notion pages, Guru cards, ServiceNow articles, Freshdesk solutions, Helpscout docs, and countless...","https://s3.us-east-2.amazonaws.com/unified-article-images/knowledge_management_systems_unified_apis_features_use_cases_and_options-icon.png",{"type":14,"children":292028,"toc":292864},[292029,292034,292037,292044,292052,292057,292062,292086,292102,292107,292112,292159,292165,292170,292176,292186,292191,292220,292225,292231,292236,292258,292270,292276,292281,292286,292327,292332,292338,292356,292368,292374,292379,292401,292406,292412,292417,292440,292445,292451,292456,292478,292484,292488,292493,292499,292504,292510,292515,292521,292526,292531,292537,292754,292760,292765,292787,292793,292798,292819,292824,292852],{"type":17,"tag":18,"props":292030,"children":292032},{"id":292031},"knowledge-management-systems-unified-apis-features-use-cases-and-options",[292033],{"type":23,"value":292024},{"type":17,"tag":25,"props":292035,"children":292036},{},[],{"type":17,"tag":29,"props":292038,"children":292039},{},[292040],{"type":17,"tag":33,"props":292041,"children":292042},{},[292043],{"type":23,"value":290436},{"type":17,"tag":29,"props":292045,"children":292046},{},[292047],{"type":17,"tag":6438,"props":292048,"children":292051},{"alt":292049,"src":292050},"KMS.png","https://s3.us-east-2.amazonaws.com/unified-article-images/knowledge_management_systems_unified_apis_features_use_cases_and_options-0.png",[],{"type":17,"tag":29,"props":292053,"children":292054},{},[292055],{"type":23,"value":292056},"Enterprise knowledge lives everywhere: Confluence wikis, Notion pages, Guru cards, ServiceNow articles, Freshdesk solutions, Helpscout docs, and countless other sources.",{"type":17,"tag":29,"props":292058,"children":292059},{},[292060],{"type":23,"value":292061},"For product managers and engineers, this fragmentation creates a predictable set of problems:",{"type":17,"tag":80,"props":292063,"children":292064},{},[292065,292070,292075],{"type":17,"tag":84,"props":292066,"children":292067},{},[292068],{"type":23,"value":292069},"Customers demand integrations with multiple knowledge systems.",{"type":17,"tag":84,"props":292071,"children":292072},{},[292073],{"type":23,"value":292074},"AI copilots and enterprise search workflows break without unified data access.",{"type":17,"tag":84,"props":292076,"children":292077},{},[292078,292080,292084],{"type":23,"value":292079},"Embedding pipelines and ",{"type":17,"tag":133,"props":292081,"children":292082},{"href":5201},[292083],{"type":23,"value":5204},{"type":23,"value":292085}," systems require real-time data freshness — stale content leads to wrong answers.",{"type":17,"tag":29,"props":292087,"children":292088},{},[292089,292091,292100],{"type":23,"value":292090},"That's where ",{"type":17,"tag":133,"props":292092,"children":292094},{"href":23930,"rel":292093},[214],[292095],{"type":17,"tag":48,"props":292096,"children":292097},{},[292098],{"type":23,"value":292099},"KMS unified APIs",{"type":23,"value":292101}," come in. Instead of building brittle, one-off connectors for each platform, you connect once to a provider's API and gain access to multiple knowledge base systems through a normalized schema.",{"type":17,"tag":29,"props":292103,"children":292104},{},[292105],{"type":23,"value":292106},"But not all KMS APIs are created equal. Some focus on real-time delivery; others on normalization and compliance. Some already support the major knowledge bases your customers use; others are still in beta.",{"type":17,"tag":29,"props":292108,"children":292109},{},[292110],{"type":23,"value":292111},"This post breaks down:",{"type":17,"tag":80,"props":292113,"children":292114},{},[292115,292125,292130,292148],{"type":17,"tag":84,"props":292116,"children":292117},{},[292118,292120,292124],{"type":23,"value":292119},"What PMs and engineers should look for in a KMS ",{"type":17,"tag":133,"props":292121,"children":292122},{"href":7691},[292123],{"type":23,"value":7459},{"type":23,"value":54},{"type":17,"tag":84,"props":292126,"children":292127},{},[292128],{"type":23,"value":292129},"The key use cases for AI and enterprise search.",{"type":17,"tag":84,"props":292131,"children":292132},{},[292133,292135,292139,292141,292146],{"type":23,"value":292134},"How today's ",{"type":17,"tag":133,"props":292136,"children":292137},{"href":24227},[292138],{"type":23,"value":24230},{"type":23,"value":292140}," providers compare (",{"type":17,"tag":133,"props":292142,"children":292144},{"href":42620,"rel":292143},[214],[292145],{"type":23,"value":217},{"type":23,"value":292147}," vs Merge.dev).",{"type":17,"tag":84,"props":292149,"children":292150},{},[292151,292152,292157],{"type":23,"value":283152},{"type":17,"tag":133,"props":292153,"children":292155},{"href":42620,"rel":292154},[214],[292156],{"type":23,"value":217},{"type":23,"value":292158}," is the only production-ready choice for real-time enterprise AI.",{"type":17,"tag":68,"props":292160,"children":292162},{"id":292161},"what-to-look-for-in-a-kms-unified-api",[292163],{"type":23,"value":292164},"What to Look For in a KMS unified API",{"type":17,"tag":29,"props":292166,"children":292167},{},[292168],{"type":23,"value":292169},"When evaluating providers, focus on the architectural choices that will directly impact your product's performance, reliability, and time to market.",{"type":17,"tag":239,"props":292171,"children":292173},{"id":292172},"_1-integration-breadth",[292174],{"type":23,"value":292175},"1. Integration breadth",{"type":17,"tag":29,"props":292177,"children":292178},{},[292179,292181],{"type":23,"value":292180},"The first question is simple: ",{"type":17,"tag":48,"props":292182,"children":292183},{},[292184],{"type":23,"value":292185},"does the provider cover the systems your customers use?",{"type":17,"tag":29,"props":292187,"children":292188},{},[292189],{"type":23,"value":292190},"At a minimum, this should include:",{"type":17,"tag":80,"props":292192,"children":292193},{},[292194,292198,292202,292206,292210,292215],{"type":17,"tag":84,"props":292195,"children":292196},{},[292197],{"type":23,"value":23045},{"type":17,"tag":84,"props":292199,"children":292200},{},[292201],{"type":23,"value":23053},{"type":17,"tag":84,"props":292203,"children":292204},{},[292205],{"type":23,"value":23061},{"type":17,"tag":84,"props":292207,"children":292208},{},[292209],{"type":23,"value":23984},{"type":17,"tag":84,"props":292211,"children":292212},{},[292213],{"type":23,"value":292214},"Coda",{"type":17,"tag":84,"props":292216,"children":292217},{},[292218],{"type":23,"value":292219},"Help center integrations like Freshdesk, Helpscout, Intercom",{"type":17,"tag":29,"props":292221,"children":292222},{},[292223],{"type":23,"value":292224},"Without broad coverage, you'll still need to build and maintain direct vendor connectors, defeating the purpose of a unified API.",{"type":17,"tag":239,"props":292226,"children":292228},{"id":292227},"_2-data-delivery-model",[292229],{"type":23,"value":292230},"2. Data delivery model",{"type":17,"tag":29,"props":292232,"children":292233},{},[292234],{"type":23,"value":292235},"Enterprise search and AI copilots are only as good as their data freshness. If embeddings or vector indexes lag by hours or days, the system returns outdated or incorrect answers.",{"type":17,"tag":80,"props":292237,"children":292238},{},[292239,292248],{"type":17,"tag":84,"props":292240,"children":292241},{},[292242,292246],{"type":17,"tag":48,"props":292243,"children":292244},{},[292245],{"type":23,"value":282556},{"type":23,"value":292247}," (via native and virtual webhooks) ensures every page update, comment, or article change is available immediately.",{"type":17,"tag":84,"props":292249,"children":292250},{},[292251,292256],{"type":17,"tag":48,"props":292252,"children":292253},{},[292254],{"type":23,"value":292255},"Cached sync",{"type":23,"value":292257}," (daily or periodic refresh) introduces staleness and forces teams to design around data delays.",{"type":17,"tag":29,"props":292259,"children":292260},{},[292261,292263,292268],{"type":23,"value":292262},"For RAG pipelines in particular, ",{"type":17,"tag":48,"props":292264,"children":292265},{},[292266],{"type":23,"value":292267},"real-time matters",{"type":23,"value":292269},". Every update needs to flow straight into your embedding model and vector database.",{"type":17,"tag":239,"props":292271,"children":292273},{"id":292272},"_3-schema-depth",[292274],{"type":23,"value":292275},"3. Schema depth",{"type":17,"tag":29,"props":292277,"children":292278},{},[292279],{"type":23,"value":292280},"Each knowledge platform structures data differently. Confluence has spaces and pages; Notion has databases and blocks; Guru has collections and cards. A unified API should normalize these into a consistent schema.",{"type":17,"tag":29,"props":292282,"children":292283},{},[292284],{"type":23,"value":292285},"The critical objects to look for:",{"type":17,"tag":80,"props":292287,"children":292288},{},[292289,292299,292309,292318],{"type":17,"tag":84,"props":292290,"children":292291},{},[292292,292297],{"type":17,"tag":48,"props":292293,"children":292294},{},[292295],{"type":23,"value":292296},"Space/Container",{"type":23,"value":292298},": folders, collections, workspaces.",{"type":17,"tag":84,"props":292300,"children":292301},{},[292302,292307],{"type":17,"tag":48,"props":292303,"children":292304},{},[292305],{"type":23,"value":292306},"Page/Article",{"type":23,"value":292308},": the knowledge document itself.",{"type":17,"tag":84,"props":292310,"children":292311},{},[292312,292316],{"type":17,"tag":48,"props":292313,"children":292314},{},[292315],{"type":23,"value":13370},{"type":23,"value":292317},": discussion or annotation on a page.",{"type":17,"tag":84,"props":292319,"children":292320},{},[292321,292325],{"type":17,"tag":48,"props":292322,"children":292323},{},[292324],{"type":23,"value":126524},{"type":23,"value":292326},": authors, permissions, attachments, timestamps.",{"type":17,"tag":29,"props":292328,"children":292329},{},[292330],{"type":23,"value":292331},"Shallow models create gaps and force custom logic. Deep normalization reduces maintenance and accelerates feature parity across integrations.",{"type":17,"tag":239,"props":292333,"children":292335},{"id":292334},"_4-crud-vs-read-only",[292336],{"type":23,"value":292337},"4. CRUD vs read-only",{"type":17,"tag":29,"props":292339,"children":292340},{},[292341,292343,292348,292350,292354],{"type":23,"value":292342},"Some providers only let you ",{"type":17,"tag":48,"props":292344,"children":292345},{},[292346],{"type":23,"value":292347},"fetch",{"type":23,"value":292349}," knowledge content. Others support ",{"type":17,"tag":48,"props":292351,"children":292352},{},[292353],{"type":23,"value":21367},{"type":23,"value":292355},": creating, updating, and deleting pages or comments.",{"type":17,"tag":29,"props":292357,"children":292358},{},[292359,292361,292366],{"type":23,"value":292360},"If your product needs to ",{"type":17,"tag":48,"props":292362,"children":292363},{},[292364],{"type":23,"value":292365},"push updates back into the source system",{"type":23,"value":292367}," (for example, creating documentation or syncing comments), CRUD support is essential.",{"type":17,"tag":239,"props":292369,"children":292371},{"id":292370},"_5-adjacent-coverage",[292372],{"type":23,"value":292373},"5. Adjacent coverage",{"type":17,"tag":29,"props":292375,"children":292376},{},[292377],{"type":23,"value":292378},"Knowledge doesn't only live in wikis. Files and tickets matter too.",{"type":17,"tag":80,"props":292380,"children":292381},{},[292382,292391],{"type":17,"tag":84,"props":292383,"children":292384},{},[292385,292389],{"type":17,"tag":48,"props":292386,"children":292387},{},[292388],{"type":23,"value":72401},{"type":23,"value":292390},": Google Drive, Box, OneDrive, SharePoint.",{"type":17,"tag":84,"props":292392,"children":292393},{},[292394,292399],{"type":17,"tag":48,"props":292395,"children":292396},{},[292397],{"type":23,"value":292398},"Ticketing/Task APIs",{"type":23,"value":292400},": Jira, Zendesk, Asana, Linear.",{"type":17,"tag":29,"props":292402,"children":292403},{},[292404],{"type":23,"value":292405},"Enterprise search copilots often need to pull from all of these. Providers that only offer KMS coverage force you to stitch together multiple platforms.",{"type":17,"tag":239,"props":292407,"children":292409},{"id":292408},"_6-security-model",[292410],{"type":23,"value":292411},"6. Security model",{"type":17,"tag":29,"props":292413,"children":292414},{},[292415],{"type":23,"value":292416},"How does the provider handle your customers' data?",{"type":17,"tag":80,"props":292418,"children":292419},{},[292420,292430],{"type":17,"tag":84,"props":292421,"children":292422},{},[292423,292428],{"type":17,"tag":48,"props":292424,"children":292425},{},[292426],{"type":23,"value":292427},"Zero-storage passthrough",{"type":23,"value":292429},": No caching or persistence. Every request fetches fresh from the source. Reduces compliance scope and liability.",{"type":17,"tag":84,"props":292431,"children":292432},{},[292433,292438],{"type":17,"tag":48,"props":292434,"children":292435},{},[292436],{"type":23,"value":292437},"Cached replication",{"type":23,"value":292439},": Data is copied into the provider's infrastructure. Enables audit trails and some enterprise features, but creates an extra copy of sensitive knowledge.",{"type":17,"tag":29,"props":292441,"children":292442},{},[292443],{"type":23,"value":292444},"This choice has major implications for GDPR, SOC 2, and customer trust.",{"type":17,"tag":239,"props":292446,"children":292448},{"id":292447},"_7-pricing-alignment",[292449],{"type":23,"value":292450},"7. Pricing alignment",{"type":17,"tag":29,"props":292452,"children":292453},{},[292454],{"type":23,"value":292455},"Finally, pricing models need to match your workload:",{"type":17,"tag":80,"props":292457,"children":292458},{},[292459,292468],{"type":17,"tag":84,"props":292460,"children":292461},{},[292462,292466],{"type":17,"tag":48,"props":292463,"children":292464},{},[292465],{"type":23,"value":7986},{"type":23,"value":292467},": Pay per API call. Scales with activity. Efficient for spiky workloads like embedding pipelines.",{"type":17,"tag":84,"props":292469,"children":292470},{},[292471,292476],{"type":17,"tag":48,"props":292472,"children":292473},{},[292474],{"type":23,"value":292475},"Per-account",{"type":23,"value":292477},": Pay per connected customer account. Predictable for enterprises, but expensive for long-tail customers or real-time use cases.",{"type":17,"tag":68,"props":292479,"children":292481},{"id":292480},"use-cases-for-kms-unified-apis",[292482],{"type":23,"value":292483},"Use Cases for KMS unified APIs",{"type":17,"tag":239,"props":292485,"children":292486},{"id":179426},[292487],{"type":23,"value":179429},{"type":17,"tag":29,"props":292489,"children":292490},{},[292491],{"type":23,"value":292492},"Unify Confluence, Notion, ServiceNow, and help center content into a single search index. Feed results into a product-facing search bar, AI assistant, or analytics system.",{"type":17,"tag":239,"props":292494,"children":292496},{"id":292495},"ai-embedding-pipelines",[292497],{"type":23,"value":292498},"AI Embedding Pipelines",{"type":17,"tag":29,"props":292500,"children":292501},{},[292502],{"type":23,"value":292503},"Every update to a page or comment should flow directly into a vector database. Real-time webhooks ensure embeddings stay consistent with the source of truth. Cached data introduces drift and stale results.",{"type":17,"tag":239,"props":292505,"children":292507},{"id":292506},"ai-assistants",[292508],{"type":23,"value":292509},"AI Assistants",{"type":17,"tag":29,"props":292511,"children":292512},{},[292513],{"type":23,"value":292514},"Support bots need to draw from Freshdesk, Intercom, or Helpscout knowledge articles. Unified APIs simplify fetching and normalizing that content into a model-readable format.",{"type":17,"tag":239,"props":292516,"children":292518},{"id":292517},"summarization-and-automation",[292519],{"type":23,"value":292520},"Summarization and Automation",{"type":17,"tag":29,"props":292522,"children":292523},{},[292524],{"type":23,"value":292525},"Generate concise meeting summaries, draft employee manuals, or prepare compliance reports by aggregating KMS content through one API. Pair with LLMs for structured outputs.",{"type":17,"tag":29,"props":292527,"children":292528},{},[292529],{"type":23,"value":292530},"In each use case, data freshness and schema depth determine success.",{"type":17,"tag":68,"props":292532,"children":292534},{"id":292533},"comparing-kms-unified-api-providers",[292535],{"type":23,"value":292536},"Comparing KMS unified API Providers",{"type":17,"tag":7231,"props":292538,"children":292539},{},[292540,292568],{"type":17,"tag":7235,"props":292541,"children":292542},{},[292543],{"type":17,"tag":7239,"props":292544,"children":292545},{},[292546,292550,292561],{"type":17,"tag":7243,"props":292547,"children":292548},{},[292549],{"type":23,"value":87518},{"type":17,"tag":7243,"props":292551,"children":292552},{},[292553],{"type":17,"tag":133,"props":292554,"children":292556},{"href":42620,"rel":292555},[214],[292557],{"type":17,"tag":48,"props":292558,"children":292559},{},[292560],{"type":23,"value":217},{"type":17,"tag":7243,"props":292562,"children":292563},{},[292564],{"type":17,"tag":48,"props":292565,"children":292566},{},[292567],{"type":23,"value":7968},{"type":17,"tag":7259,"props":292569,"children":292570},{},[292571,292591,292611,292631,292652,292672,292692,292713,292733],{"type":17,"tag":7239,"props":292572,"children":292573},{},[292574,292581,292586],{"type":17,"tag":7266,"props":292575,"children":292576},{},[292577],{"type":17,"tag":48,"props":292578,"children":292579},{},[292580],{"type":23,"value":42944},{"type":17,"tag":7266,"props":292582,"children":292583},{},[292584],{"type":23,"value":292585},"9 live (Confluence, Notion, Coda, Guru, ClickUp, Freshdesk, Helpscout, Intercom, ServiceNow)",{"type":17,"tag":7266,"props":292587,"children":292588},{},[292589],{"type":23,"value":292590},"1 live (Confluence)",{"type":17,"tag":7239,"props":292592,"children":292593},{},[292594,292601,292606],{"type":17,"tag":7266,"props":292595,"children":292596},{},[292597],{"type":17,"tag":48,"props":292598,"children":292599},{},[292600],{"type":23,"value":43896},{"type":17,"tag":7266,"props":292602,"children":292603},{},[292604],{"type":23,"value":292605},"Native + Virtual (real-time by default)",{"type":17,"tag":7266,"props":292607,"children":292608},{},[292609],{"type":23,"value":292610},"Native only; no virtual webhooks",{"type":17,"tag":7239,"props":292612,"children":292613},{},[292614,292622,292626],{"type":17,"tag":7266,"props":292615,"children":292616},{},[292617],{"type":17,"tag":48,"props":292618,"children":292619},{},[292620],{"type":23,"value":292621},"Data Delivery",{"type":17,"tag":7266,"props":292623,"children":292624},{},[292625],{"type":23,"value":292427},{"type":17,"tag":7266,"props":292627,"children":292628},{},[292629],{"type":23,"value":292630},"Cached replication (24h refresh baseline)",{"type":17,"tag":7239,"props":292632,"children":292633},{},[292634,292642,292647],{"type":17,"tag":7266,"props":292635,"children":292636},{},[292637],{"type":17,"tag":48,"props":292638,"children":292639},{},[292640],{"type":23,"value":292641},"Schema",{"type":17,"tag":7266,"props":292643,"children":292644},{},[292645],{"type":23,"value":292646},"Spaces, Pages, Comments",{"type":17,"tag":7266,"props":292648,"children":292649},{},[292650],{"type":23,"value":292651},"Articles, Containers, Attachments, Permissions, Users",{"type":17,"tag":7239,"props":292653,"children":292654},{},[292655,292663,292668],{"type":17,"tag":7266,"props":292656,"children":292657},{},[292658],{"type":17,"tag":48,"props":292659,"children":292660},{},[292661],{"type":23,"value":292662},"CRUD Support",{"type":17,"tag":7266,"props":292664,"children":292665},{},[292666],{"type":23,"value":292667},"Full read/write",{"type":17,"tag":7266,"props":292669,"children":292670},{},[292671],{"type":23,"value":185706},{"type":17,"tag":7239,"props":292673,"children":292674},{},[292675,292683,292688],{"type":17,"tag":7266,"props":292676,"children":292677},{},[292678],{"type":17,"tag":48,"props":292679,"children":292680},{},[292681],{"type":23,"value":292682},"Adjacent Coverage",{"type":17,"tag":7266,"props":292684,"children":292685},{},[292686],{"type":23,"value":292687},"File Storage (24), Task/Ticketing (25)",{"type":17,"tag":7266,"props":292689,"children":292690},{},[292691],{"type":23,"value":162634},{"type":17,"tag":7239,"props":292693,"children":292694},{},[292695,292703,292708],{"type":17,"tag":7266,"props":292696,"children":292697},{},[292698],{"type":17,"tag":48,"props":292699,"children":292700},{},[292701],{"type":23,"value":292702},"UI Components",{"type":17,"tag":7266,"props":292704,"children":292705},{},[292706],{"type":23,"value":292707},"Auth components, SDKs, API Explorer",{"type":17,"tag":7266,"props":292709,"children":292710},{},[292711],{"type":23,"value":292712},"Merge Link, Article Picker",{"type":17,"tag":7239,"props":292714,"children":292715},{},[292716,292723,292728],{"type":17,"tag":7266,"props":292717,"children":292718},{},[292719],{"type":17,"tag":48,"props":292720,"children":292721},{},[292722],{"type":23,"value":68268},{"type":17,"tag":7266,"props":292724,"children":292725},{},[292726],{"type":23,"value":292727},"Zero-storage; BYO credential storage (AWS Secrets Manager)",{"type":17,"tag":7266,"props":292729,"children":292730},{},[292731],{"type":23,"value":292732},"Cached data with SOC 2, ISO, HIPAA, GDPR",{"type":17,"tag":7239,"props":292734,"children":292735},{},[292736,292744,292749],{"type":17,"tag":7266,"props":292737,"children":292738},{},[292739],{"type":17,"tag":48,"props":292740,"children":292741},{},[292742],{"type":23,"value":292743},"Pricing",{"type":17,"tag":7266,"props":292745,"children":292746},{},[292747],{"type":23,"value":292748},"Usage-based API calls",{"type":17,"tag":7266,"props":292750,"children":292751},{},[292752],{"type":23,"value":292753},"Per-account pricing",{"type":17,"tag":68,"props":292755,"children":292757},{"id":292756},"positioning-the-tradeoffs",[292758],{"type":23,"value":292759},"Positioning the Tradeoffs",{"type":17,"tag":29,"props":292761,"children":292762},{},[292763],{"type":23,"value":292764},"For PMs and engineers, the choice comes down to architecture:",{"type":17,"tag":80,"props":292766,"children":292767},{},[292768,292777],{"type":17,"tag":84,"props":292769,"children":292770},{},[292771,292775],{"type":17,"tag":48,"props":292772,"children":292773},{},[292774],{"type":23,"value":217},{"type":23,"value":292776}," is the only production-ready, real-time option. With 9 integrations live today, full CRUD, and adjacent coverage, it's purpose-built for enterprise search, embedding pipelines, and AI copilots where data freshness matters.",{"type":17,"tag":84,"props":292778,"children":292779},{},[292780,292785],{"type":17,"tag":48,"props":292781,"children":292782},{},[292783],{"type":23,"value":292784},"Merge.dev's Knowledge Base API",{"type":23,"value":292786}," is still in beta. With 1 integration live, cached sync, and read-only schema, it's more suited to lightweight knowledge sync or compliance-driven dashboards than real-time AI infrastructure.",{"type":17,"tag":68,"props":292788,"children":292790},{"id":292789},"your-path-to-production-ready-kms-integrations",[292791],{"type":23,"value":292792},"Your Path to Production-Ready KMS Integrations",{"type":17,"tag":29,"props":292794,"children":292795},{},[292796],{"type":23,"value":292797},"KMS Unified APIs are becoming a core requirement for enterprise AI products. But the architecture matters.",{"type":17,"tag":80,"props":292799,"children":292800},{},[292801,292810],{"type":17,"tag":84,"props":292802,"children":292803},{},[292804,292808],{"type":17,"tag":48,"props":292805,"children":292806},{},[292807],{"type":23,"value":217},{"type":23,"value":292809},": Real-time passthrough, zero-storage, 9 integrations live, adjacent File/Task coverage. Built for PMs and engineers delivering enterprise copilots, search, and embedding pipelines.",{"type":17,"tag":84,"props":292811,"children":292812},{},[292813,292817],{"type":17,"tag":48,"props":292814,"children":292815},{},[292816],{"type":23,"value":7968},{"type":23,"value":292818},": Beta KB API with 1 integration, cached sync, and governance features. Suited for lightweight sync, not production-grade RAG.",{"type":17,"tag":29,"props":292820,"children":292821},{},[292822],{"type":23,"value":292823},"If you're exploring KMS Unified APIs for enterprise search or AI copilots, you can:",{"type":17,"tag":80,"props":292825,"children":292826},{},[292827,292841],{"type":17,"tag":84,"props":292828,"children":292829},{},[292830,292839],{"type":17,"tag":133,"props":292831,"children":292833},{"href":163519,"rel":292832},[214],[292834],{"type":17,"tag":48,"props":292835,"children":292836},{},[292837],{"type":23,"value":292838},"Read our docs",{"type":23,"value":292840}," to see the schema, endpoints, and real-time webhook examples.",{"type":17,"tag":84,"props":292842,"children":292843},{},[292844,292850],{"type":17,"tag":133,"props":292845,"children":292848},{"href":292846,"rel":292847},"https://calendly.com/d/cph9-g8n-jzg/connect-with-unified?month=2025-08",[214],[292849],{"type":23,"value":1627},{"type":23,"value":292851}," to learn how Unified.to can accelerate your integration roadmap.",{"type":17,"tag":29,"props":292853,"children":292854},{},[292855,292857,292862],{"type":23,"value":292856},"Unified.to helps product teams connect to ",{"type":17,"tag":48,"props":292858,"children":292859},{},[292860],{"type":23,"value":292861},"9+ KMS & Help Center systems",{"type":23,"value":292863},", plus 335+ other SaaS categories — all through one real-time unified API.",{"title":7,"searchDepth":1629,"depth":1629,"links":292865},[292866,292875,292881,292882,292883],{"id":292161,"depth":1629,"text":292164,"children":292867},[292868,292869,292870,292871,292872,292873,292874],{"id":292172,"depth":1635,"text":292175},{"id":292227,"depth":1635,"text":292230},{"id":292272,"depth":1635,"text":292275},{"id":292334,"depth":1635,"text":292337},{"id":292370,"depth":1635,"text":292373},{"id":292408,"depth":1635,"text":292411},{"id":292447,"depth":1635,"text":292450},{"id":292480,"depth":1629,"text":292483,"children":292876},[292877,292878,292879,292880],{"id":179426,"depth":1635,"text":179429},{"id":292495,"depth":1635,"text":292498},{"id":292506,"depth":1635,"text":292509},{"id":292517,"depth":1635,"text":292520},{"id":292533,"depth":1629,"text":292536},{"id":292756,"depth":1629,"text":292759},{"id":292789,"depth":1629,"text":292792},"content:blog:knowledge_management_systems_unified_apis_features_use_cases_and_options.md","blog/knowledge_management_systems_unified_apis_features_use_cases_and_options.md","blog/knowledge_management_systems_unified_apis_features_use_cases_and_options",{"_path":292888,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":292889,"description":292890,"img":292891,"date":292892,"tag":12,"body":292893,"_type":1677,"_id":293978,"_source":1679,"_file":293979,"_stem":293980,"_extension":1682},"/blog/unified_mcp_vs_arcade_dev_mcp_comparison_which_is_better_for_ai_agents_2026","Unified MCP vs Arcade.dev MCP Comparison: Which Is Better for AI Agents? (2026)","Arcade.dev MCP and Unified MCP take different approaches to exposing integrations to AI agents. Arcade focuses on curated, provider-specific tools for action...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_vs_arcade_dev_mcp_comparison_which_is_better_for_ai_agents_2026-icon.png","2025-08-26T17:47:00.000Z",{"type":14,"children":292894,"toc":293948},[292895,292900,292903,292911,292919,292935,292954,292966,292972,292977,292983,293027,293033,293041,293059,293067,293090,293096,293102,293154,293159,293165,293170,293193,293198,293204,293209,293232,293237,293242,293248,293259,293270,293275,293280,293286,293292,293339,293344,293350,293355,293373,293385,293391,293396,293447,293452,293457,293498,293503,293509,293515,293574,293580,293622,293628,293633,293668,293673,293707,293712,293717,293722,293727,293732,293738,293743,293891,293895,293907,293912,293925,293937],{"type":17,"tag":18,"props":292896,"children":292898},{"id":292897},"unified-mcp-vs-arcadedev-mcp-comparison-which-is-better-for-ai-agents-2026",[292899],{"type":23,"value":292889},{"type":17,"tag":25,"props":292901,"children":292902},{},[],{"type":17,"tag":29,"props":292904,"children":292905},{},[292906],{"type":17,"tag":33,"props":292907,"children":292908},{},[292909],{"type":23,"value":292910},"August 26, 2025",{"type":17,"tag":29,"props":292912,"children":292913},{},[292914],{"type":17,"tag":6438,"props":292915,"children":292918},{"alt":292916,"src":292917},"MCP_%283%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_vs_arcade_dev_mcp_comparison_which_is_better_for_ai_agents_2026-0.png",[],{"type":17,"tag":29,"props":292920,"children":292921},{},[292922,292924,292928,292929,292933],{"type":23,"value":292923},"Arcade.dev ",{"type":17,"tag":133,"props":292925,"children":292926},{"href":326},[292927],{"type":23,"value":329},{"type":23,"value":34435},{"type":17,"tag":133,"props":292930,"children":292931},{"href":326},[292932],{"type":23,"value":45418},{"type":23,"value":292934}," take different approaches to exposing integrations to AI agents. Arcade focuses on curated, provider-specific tools for action execution, while Unified MCP provides real-time access to integrations with optional normalization and full API surface coverage.",{"type":17,"tag":29,"props":292936,"children":292937},{},[292938,292940,292945,292947,292952],{"type":23,"value":292939},"Unified.to MCP is a ",{"type":17,"tag":48,"props":292941,"children":292942},{},[292943],{"type":23,"value":292944},"fully hosted MCP server",{"type":23,"value":292946}," designed for production AI systems that require ",{"type":17,"tag":48,"props":292948,"children":292949},{},[292950],{"type":23,"value":292951},"real-time reads and writes, category-level normalized schemas, and broad endpoint coverage",{"type":23,"value":292953}," across hundreds of integrations.",{"type":17,"tag":29,"props":292955,"children":292956},{},[292957,292959,292964],{"type":23,"value":292958},"If you're deciding between the two, the differences come down to ",{"type":17,"tag":48,"props":292960,"children":292961},{},[292962],{"type":23,"value":292963},"architecture, coverage, and operational responsibility",{"type":23,"value":292965},"—not MCP compatibility itself.",{"type":17,"tag":68,"props":292967,"children":292969},{"id":292968},"at-a-glance-unifiedto-mcp-vs-arcadedev-mcp",[292970],{"type":23,"value":292971},"At a glance: Unified.to MCP vs Arcade.dev MCP",{"type":17,"tag":29,"props":292973,"children":292974},{},[292975],{"type":23,"value":292976},"Arcade provides MCP-compatible tools that developers typically deploy and operate themselves. Unified.to MCP is a hosted MCP server that exposes integrations as callable tools with normalized schemas and published coverage metrics.",{"type":17,"tag":239,"props":292978,"children":292980},{"id":292979},"unifiedto-mcp-provides",[292981],{"type":23,"value":292982},"Unified.to MCP provides",{"type":17,"tag":80,"props":292984,"children":292985},{},[292986,292996,293007,293012,293017,293022],{"type":17,"tag":84,"props":292987,"children":292988},{},[292989,292991],{"type":23,"value":292990},"Category-level normalized schemas across ",{"type":17,"tag":48,"props":292992,"children":292993},{},[292994],{"type":23,"value":292995},"380+ integrations",{"type":17,"tag":84,"props":292997,"children":292998},{},[292999,293001],{"type":23,"value":293000},"Expanded provider endpoint access via ",{"type":17,"tag":6121,"props":293002,"children":293004},{"className":293003},[],[293005],{"type":23,"value":293006},"include_external_tools",{"type":17,"tag":84,"props":293008,"children":293009},{},[293010],{"type":23,"value":293011},"Real-time reads and writes routed directly to source APIs",{"type":17,"tag":84,"props":293013,"children":293014},{},[293015],{"type":23,"value":293016},"Stateless access to customer records (no record storage)",{"type":17,"tag":84,"props":293018,"children":293019},{},[293020],{"type":23,"value":293021},"Fully hosted MCP server (no customer-managed MCP infrastructure)",{"type":17,"tag":84,"props":293023,"children":293024},{},[293025],{"type":23,"value":293026},"Multi-region endpoints (US, EU, AU)",{"type":17,"tag":68,"props":293028,"children":293030},{"id":293029},"when-to-choose-arcadedev-mcp-vs-unified-mcp",[293031],{"type":23,"value":293032},"When to choose Arcade.dev MCP vs Unified MCP",{"type":17,"tag":29,"props":293034,"children":293035},{},[293036],{"type":17,"tag":48,"props":293037,"children":293038},{},[293039],{"type":23,"value":293040},"Choose Arcade.dev MCP if:",{"type":17,"tag":80,"props":293042,"children":293043},{},[293044,293049,293054],{"type":17,"tag":84,"props":293045,"children":293046},{},[293047],{"type":23,"value":293048},"You are building agents that execute predefined actions",{"type":17,"tag":84,"props":293050,"children":293051},{},[293052],{"type":23,"value":293053},"Your workflows are limited to specific tools or applications",{"type":17,"tag":84,"props":293055,"children":293056},{},[293057],{"type":23,"value":293058},"You are comfortable managing MCP infrastructure yourself",{"type":17,"tag":29,"props":293060,"children":293061},{},[293062],{"type":17,"tag":48,"props":293063,"children":293064},{},[293065],{"type":23,"value":293066},"Choose Unified MCP if:",{"type":17,"tag":80,"props":293068,"children":293069},{},[293070,293075,293080,293085],{"type":17,"tag":84,"props":293071,"children":293072},{},[293073],{"type":23,"value":293074},"Your product depends on structured data across multiple systems",{"type":17,"tag":84,"props":293076,"children":293077},{},[293078],{"type":23,"value":293079},"You need consistent schemas across providers",{"type":17,"tag":84,"props":293081,"children":293082},{},[293083],{"type":23,"value":293084},"You want real-time access without building polling or sync layers",{"type":17,"tag":84,"props":293086,"children":293087},{},[293088],{"type":23,"value":293089},"You prefer a hosted MCP server with no infrastructure overhead",{"type":17,"tag":68,"props":293091,"children":293093},{"id":293092},"execution-model-synchronous-calls-vs-managed-real-time-delivery",[293094],{"type":23,"value":293095},"Execution model: synchronous calls vs managed real-time delivery",{"type":17,"tag":239,"props":293097,"children":293099},{"id":293098},"arcadedev-mcp-documented-behavior",[293100],{"type":23,"value":293101},"Arcade.dev MCP (documented behavior)",{"type":17,"tag":80,"props":293103,"children":293104},{},[293105,293117,293149],{"type":17,"tag":84,"props":293106,"children":293107},{},[293108,293110,293115],{"type":23,"value":293109},"Arcade documents ",{"type":17,"tag":48,"props":293111,"children":293112},{},[293113],{"type":23,"value":293114},"synchronous tool execution",{"type":23,"value":293116},": MCP tools invoke provider APIs at execution time.",{"type":17,"tag":84,"props":293118,"children":293119},{},[293120,293122,293126,293128],{"type":23,"value":293121},"Arcade does ",{"type":17,"tag":48,"props":293123,"children":293124},{},[293125],{"type":23,"value":159475},{"type":23,"value":293127}," document:\n",{"type":17,"tag":80,"props":293129,"children":293130},{},[293131,293135,293140],{"type":17,"tag":84,"props":293132,"children":293133},{},[293134],{"type":23,"value":101014},{"type":17,"tag":84,"props":293136,"children":293137},{},[293138],{"type":23,"value":293139},"Polling or background jobs",{"type":17,"tag":84,"props":293141,"children":293142},{},[293143,293145],{"type":23,"value":293144},"Fallback mechanisms for APIs without ",{"type":17,"tag":133,"props":293146,"children":293147},{"href":4999},[293148],{"type":23,"value":5002},{"type":17,"tag":84,"props":293150,"children":293151},{},[293152],{"type":23,"value":293153},"Provider-specific webhook APIs (e.g. GitHub webhook creation) are exposed where the underlying provider supports them.",{"type":17,"tag":29,"props":293155,"children":293156},{},[293157],{"type":23,"value":293158},"In practice, Arcade enables on-demand action execution, but ongoing change detection requires additional application logic.",{"type":17,"tag":239,"props":293160,"children":293162},{"id":293161},"unifiedto-mcp-documented-behavior",[293163],{"type":23,"value":293164},"Unified.to MCP (documented behavior)",{"type":17,"tag":29,"props":293166,"children":293167},{},[293168],{"type":23,"value":293169},"Unified MCP is designed around real-time delivery patterns:",{"type":17,"tag":80,"props":293171,"children":293172},{},[293173,293178,293183,293188],{"type":17,"tag":84,"props":293174,"children":293175},{},[293176],{"type":23,"value":293177},"Native webhooks when providers support them",{"type":17,"tag":84,"props":293179,"children":293180},{},[293181],{"type":23,"value":293182},"Virtual webhooks when providers do not",{"type":17,"tag":84,"props":293184,"children":293185},{},[293186],{"type":23,"value":293187},"Each tool call routes directly to the source API",{"type":17,"tag":84,"props":293189,"children":293190},{},[293191],{"type":23,"value":293192},"No cached reads or replayed snapshots",{"type":17,"tag":29,"props":293194,"children":293195},{},[293196],{"type":23,"value":293197},"For AI agents, this removes ambiguity around data freshness and avoids building polling or scheduling infrastructure.",{"type":17,"tag":68,"props":293199,"children":293201},{"id":293200},"execution-surface-vs-data-surface",[293202],{"type":23,"value":293203},"Execution surface vs data surface",{"type":17,"tag":29,"props":293205,"children":293206},{},[293207],{"type":23,"value":293208},"The core difference is how each platform exposes integrations:",{"type":17,"tag":80,"props":293210,"children":293211},{},[293212,293222],{"type":17,"tag":84,"props":293213,"children":293214},{},[293215,293220],{"type":17,"tag":48,"props":293216,"children":293217},{},[293218],{"type":23,"value":293219},"Arcade.dev MCP:",{"type":23,"value":293221}," execution surface (actions performed on tools)",{"type":17,"tag":84,"props":293223,"children":293224},{},[293225,293230],{"type":17,"tag":48,"props":293226,"children":293227},{},[293228],{"type":23,"value":293229},"Unified MCP:",{"type":23,"value":293231}," data surface (structured access to records and endpoints)",{"type":17,"tag":29,"props":293233,"children":293234},{},[293235],{"type":23,"value":293236},"Execution surfaces define what an agent can do. Data surfaces define what an agent can access, query, and reason over across systems.",{"type":17,"tag":29,"props":293238,"children":293239},{},[293240],{"type":23,"value":293241},"As agents expand beyond single-tool workflows, data access patterns become the limiting factor.",{"type":17,"tag":68,"props":293243,"children":293245},{"id":293244},"action-layer-vs-data-layer",[293246],{"type":23,"value":293247},"Action layer vs data layer",{"type":17,"tag":29,"props":293249,"children":293250},{},[293251,293253,293258],{"type":23,"value":293252},"Arcade exposes integrations as ",{"type":17,"tag":48,"props":293254,"children":293255},{},[293256],{"type":23,"value":293257},"discrete actions tied to each provider",{"type":23,"value":54},{"type":17,"tag":29,"props":293260,"children":293261},{},[293262,293264,293269],{"type":23,"value":293263},"Unified exposes integrations as ",{"type":17,"tag":48,"props":293265,"children":293266},{},[293267],{"type":23,"value":293268},"data models and endpoints that remain consistent across providers",{"type":23,"value":54},{"type":17,"tag":29,"props":293271,"children":293272},{},[293273],{"type":23,"value":293274},"Actions are useful for task execution.",{"type":17,"tag":29,"props":293276,"children":293277},{},[293278],{"type":23,"value":293279},"Data layers are required for building features that depend on cross-system state.",{"type":17,"tag":68,"props":293281,"children":293283},{"id":293282},"schema-model-per-app-tools-vs-category-level-normalization",[293284],{"type":23,"value":293285},"Schema model: per-app tools vs category-level normalization",{"type":17,"tag":239,"props":293287,"children":293289},{"id":293288},"arcadedev-mcp",[293290],{"type":23,"value":293291},"Arcade.dev MCP",{"type":17,"tag":80,"props":293293,"children":293294},{},[293295,293305,293329],{"type":17,"tag":84,"props":293296,"children":293297},{},[293298,293300],{"type":23,"value":293299},"Arcade tools return ",{"type":17,"tag":48,"props":293301,"children":293302},{},[293303],{"type":23,"value":293304},"provider-native schemas",{"type":17,"tag":84,"props":293306,"children":293307},{},[293308,293310,293314,293316],{"type":23,"value":293309},"Documentation does ",{"type":17,"tag":48,"props":293311,"children":293312},{},[293313],{"type":23,"value":159475},{"type":23,"value":293315}," describe:\n",{"type":17,"tag":80,"props":293317,"children":293318},{},[293319,293324],{"type":17,"tag":84,"props":293320,"children":293321},{},[293322],{"type":23,"value":293323},"Cross-provider normalized objects",{"type":17,"tag":84,"props":293325,"children":293326},{},[293327],{"type":23,"value":293328},"Unified data models across categories (e.g. CRM Contact)",{"type":17,"tag":84,"props":293330,"children":293331},{},[293332,293334],{"type":23,"value":293333},"Arcade mentions schema conveniences (e.g. consistent filters), but ",{"type":17,"tag":48,"props":293335,"children":293336},{},[293337],{"type":23,"value":293338},"no published normalization model exists",{"type":17,"tag":29,"props":293340,"children":293341},{},[293342],{"type":23,"value":293343},"When working across multiple CRMs, ATS, or support systems, schema reconciliation moves to application logic or prompts.",{"type":17,"tag":239,"props":293345,"children":293347},{"id":293346},"unifiedto-mcp",[293348],{"type":23,"value":293349},"Unified.to MCP",{"type":17,"tag":29,"props":293351,"children":293352},{},[293353],{"type":23,"value":293354},"Unified MCP provides category-level normalization where supported:",{"type":17,"tag":80,"props":293356,"children":293357},{},[293358,293363,293368],{"type":17,"tag":84,"props":293359,"children":293360},{},[293361],{"type":23,"value":293362},"CRM: Contact, Company, Deal",{"type":17,"tag":84,"props":293364,"children":293365},{},[293366],{"type":23,"value":293367},"ATS: Candidate, Job, Application",{"type":17,"tag":84,"props":293369,"children":293370},{},[293371],{"type":23,"value":293372},"HR, Accounting, Marketing, and more",{"type":17,"tag":29,"props":293374,"children":293375},{},[293376,293378,293383],{"type":23,"value":293377},"When normalization isn't available or provider-specific fields are required, ",{"type":17,"tag":6121,"props":293379,"children":293381},{"className":293380},[],[293382],{"type":23,"value":293006},{"type":23,"value":293384}," expands access to provider endpoints without custom passthrough setup.",{"type":17,"tag":68,"props":293386,"children":293388},{"id":293387},"integration-and-tool-coverage",[293389],{"type":23,"value":293390},"Integration and tool coverage",{"type":17,"tag":239,"props":293392,"children":293394},{"id":293393},"arcadedev-mcp-1",[293395],{"type":23,"value":293291},{"type":17,"tag":80,"props":293397,"children":293398},{},[293399,293427,293437],{"type":17,"tag":84,"props":293400,"children":293401},{},[293402,293403,293408,293409],{"type":23,"value":293121},{"type":17,"tag":48,"props":293404,"children":293405},{},[293406],{"type":23,"value":293407},"not publish",{"type":23,"value":282122},{"type":17,"tag":80,"props":293410,"children":293411},{},[293412,293417,293422],{"type":17,"tag":84,"props":293413,"children":293414},{},[293415],{"type":23,"value":293416},"A total number of supported integrations",{"type":17,"tag":84,"props":293418,"children":293419},{},[293420],{"type":23,"value":293421},"A total MCP tool/action count",{"type":17,"tag":84,"props":293423,"children":293424},{},[293425],{"type":23,"value":293426},"A versioned integration or tool registry",{"type":17,"tag":84,"props":293428,"children":293429},{},[293430,293432],{"type":23,"value":293431},"Marketing uses approximate language such as ",{"type":17,"tag":48,"props":293433,"children":293434},{},[293435],{"type":23,"value":293436},"'hundreds of ready-to-use tools'",{"type":17,"tag":84,"props":293438,"children":293439},{},[293440,293442],{"type":23,"value":293441},"A supported integrations page exists, but it is ",{"type":17,"tag":48,"props":293443,"children":293444},{},[293445],{"type":23,"value":293446},"not presented as a complete catalog",{"type":17,"tag":239,"props":293448,"children":293450},{"id":293449},"unifiedto-mcp-1",[293451],{"type":23,"value":293349},{"type":17,"tag":29,"props":293453,"children":293454},{},[293455],{"type":23,"value":293456},"Unified publishes coverage metrics and updates them via changelog:",{"type":17,"tag":80,"props":293458,"children":293459},{},[293460,293467,293475],{"type":17,"tag":84,"props":293461,"children":293462},{},[293463],{"type":17,"tag":48,"props":293464,"children":293465},{},[293466],{"type":23,"value":292995},{"type":17,"tag":84,"props":293468,"children":293469},{},[293470],{"type":17,"tag":48,"props":293471,"children":293472},{},[293473],{"type":23,"value":293474},"22,566+ callable MCP tools (published)",{"type":17,"tag":84,"props":293476,"children":293477},{},[293478,293480],{"type":23,"value":293479},"Tool counts include:\n",{"type":17,"tag":80,"props":293481,"children":293482},{},[293483,293488],{"type":17,"tag":84,"props":293484,"children":293485},{},[293486],{"type":23,"value":293487},"Normalized tools",{"type":17,"tag":84,"props":293489,"children":293490},{},[293491,293493],{"type":23,"value":293492},"Provider endpoint tools via ",{"type":17,"tag":6121,"props":293494,"children":293496},{"className":293495},[],[293497],{"type":23,"value":293006},{"type":17,"tag":29,"props":293499,"children":293500},{},[293501],{"type":23,"value":293502},"For teams building across many integrations, published coverage reduces planning uncertainty.",{"type":17,"tag":68,"props":293504,"children":293506},{"id":293505},"data-handling-and-compliance-posture",[293507],{"type":23,"value":293508},"Data handling and compliance posture",{"type":17,"tag":239,"props":293510,"children":293512},{"id":293511},"arcadedev-mcp-documented",[293513],{"type":23,"value":293514},"Arcade.dev MCP (documented)",{"type":17,"tag":80,"props":293516,"children":293517},{},[293518,293546],{"type":17,"tag":84,"props":293519,"children":293520},{},[293521,293523],{"type":23,"value":293522},"Arcade states:\n",{"type":17,"tag":80,"props":293524,"children":293525},{},[293526,293531,293536,293541],{"type":17,"tag":84,"props":293527,"children":293528},{},[293529],{"type":23,"value":293530},"OAuth tokens are encrypted at rest",{"type":17,"tag":84,"props":293532,"children":293533},{},[293534],{"type":23,"value":293535},"Tokens are isolated from LLM inference",{"type":17,"tag":84,"props":293537,"children":293538},{},[293539],{"type":23,"value":293540},"Audit logs are maintained",{"type":17,"tag":84,"props":293542,"children":293543},{},[293544],{"type":23,"value":293545},"SOC 2 Type II certification is achieved",{"type":17,"tag":84,"props":293547,"children":293548},{},[293549,293550,293555,293556],{"type":23,"value":293121},{"type":17,"tag":48,"props":293551,"children":293552},{},[293553],{"type":23,"value":293554},"not publicly document",{"type":23,"value":282122},{"type":17,"tag":80,"props":293557,"children":293558},{},[293559,293564,293569],{"type":17,"tag":84,"props":293560,"children":293561},{},[293562],{"type":23,"value":293563},"Whether MCP execution is stateless",{"type":17,"tag":84,"props":293565,"children":293566},{},[293567],{"type":23,"value":293568},"Log retention periods",{"type":17,"tag":84,"props":293570,"children":293571},{},[293572],{"type":23,"value":293573},"Whether request/response payloads are stored",{"type":17,"tag":239,"props":293575,"children":293577},{"id":293576},"unifiedto-mcp-documented",[293578],{"type":23,"value":293579},"Unified.to MCP (documented)",{"type":17,"tag":80,"props":293581,"children":293582},{},[293583,293601,293612,293617],{"type":17,"tag":84,"props":293584,"children":293585},{},[293586,293588],{"type":23,"value":293587},"Unified MCP is stateless for customer records:\n",{"type":17,"tag":80,"props":293589,"children":293590},{},[293591,293596],{"type":17,"tag":84,"props":293592,"children":293593},{},[293594],{"type":23,"value":293595},"No third-party record data stored or cached",{"type":17,"tag":84,"props":293597,"children":293598},{},[293599],{"type":23,"value":293600},"Only connection metadata and tokens retained",{"type":17,"tag":84,"props":293602,"children":293603},{},[293604,293605,293610],{"type":23,"value":188037},{"type":17,"tag":6121,"props":293606,"children":293608},{"className":293607},[],[293609],{"type":23,"value":131715},{"type":23,"value":293611}," filtering removes sensitive fields before returning results to LLMs",{"type":17,"tag":84,"props":293613,"children":293614},{},[293615],{"type":23,"value":293616},"SOC 2 Type II, GDPR, and CCPA aligned",{"type":17,"tag":84,"props":293618,"children":293619},{},[293620],{"type":23,"value":293621},"Optional use of customer-managed secrets (e.g. AWS Secrets Manager)",{"type":17,"tag":68,"props":293623,"children":293625},{"id":293624},"deployment-and-operational-responsibility",[293626],{"type":23,"value":293627},"Deployment and operational responsibility",{"type":17,"tag":239,"props":293629,"children":293631},{"id":293630},"arcadedev-mcp-2",[293632],{"type":23,"value":293291},{"type":17,"tag":80,"props":293634,"children":293635},{},[293636,293645,293656],{"type":17,"tag":84,"props":293637,"children":293638},{},[293639,293640],{"type":23,"value":293109},{"type":17,"tag":48,"props":293641,"children":293642},{},[293643],{"type":23,"value":293644},"self-hosted MCP deployment",{"type":17,"tag":84,"props":293646,"children":293647},{},[293648,293649,293654],{"type":23,"value":293309},{"type":17,"tag":48,"props":293650,"children":293651},{},[293652],{"type":23,"value":293653},"not state",{"type":23,"value":293655}," that Arcade operates a hosted MCP server",{"type":17,"tag":84,"props":293657,"children":293658},{},[293659,293661,293666],{"type":23,"value":293660},"Operational responsibilities (scaling, monitoring, updates) are ",{"type":17,"tag":48,"props":293662,"children":293663},{},[293664],{"type":23,"value":293665},"not explicitly summarized",{"type":23,"value":293667},", but are implied by self-hosting documentation",{"type":17,"tag":239,"props":293669,"children":293671},{"id":293670},"unifiedto-mcp-2",[293672],{"type":23,"value":293349},{"type":17,"tag":80,"props":293674,"children":293675},{},[293676,293681,293702],{"type":17,"tag":84,"props":293677,"children":293678},{},[293679],{"type":23,"value":293680},"Fully hosted MCP server",{"type":17,"tag":84,"props":293682,"children":293683},{},[293684,293686],{"type":23,"value":293685},"Unified manages:\n",{"type":17,"tag":80,"props":293687,"children":293688},{},[293689,293694,293698],{"type":17,"tag":84,"props":293690,"children":293691},{},[293692],{"type":23,"value":293693},"Scaling",{"type":17,"tag":84,"props":293695,"children":293696},{},[293697],{"type":23,"value":11140},{"type":17,"tag":84,"props":293699,"children":293700},{},[293701],{"type":23,"value":266493},{"type":17,"tag":84,"props":293703,"children":293704},{},[293705],{"type":23,"value":293706},"Customers do not deploy or operate MCP infrastructure",{"type":17,"tag":29,"props":293708,"children":293709},{},[293710],{"type":23,"value":293711},"For production agents, this distinction directly affects reliability and operational cost.",{"type":17,"tag":29,"props":293713,"children":293714},{},[293715],{"type":23,"value":293716},"What is the difference between MCP tool frameworks and integration infrastructure?",{"type":17,"tag":29,"props":293718,"children":293719},{},[293720],{"type":23,"value":293721},"MCP tool frameworks expose predefined actions that agents can execute against specific applications. Integration infrastructure provides structured, consistent access to data and endpoints across systems. The difference is between enabling actions in individual tools versus enabling reliable data access across many integrations.",{"type":17,"tag":29,"props":293723,"children":293724},{},[293725],{"type":23,"value":293726},"Do MCP tools provide normalized data across integrations?",{"type":17,"tag":29,"props":293728,"children":293729},{},[293730],{"type":23,"value":293731},"Some MCP implementations expose provider-specific schemas, where each tool mirrors the underlying API. Others offer normalized data models that standardize objects across integrations while still allowing access to provider-specific endpoints. Normalized models improve consistency when working across multiple systems.",{"type":17,"tag":68,"props":293733,"children":293735},{"id":293734},"tldr-unifiedto-mcp-vs-arcadedev-mcp",[293736],{"type":23,"value":293737},"TL;DR — Unified.to MCP vs Arcade.dev MCP",{"type":17,"tag":29,"props":293739,"children":293740},{},[293741],{"type":23,"value":293742},"Unified MCP provides structured, real-time access to integration data, while Arcade.dev MCP focuses on executing provider-specific actions.",{"type":17,"tag":7231,"props":293744,"children":293745},{},[293746,293764],{"type":17,"tag":7235,"props":293747,"children":293748},{},[293749],{"type":17,"tag":7239,"props":293750,"children":293751},{},[293752,293756,293760],{"type":17,"tag":7243,"props":293753,"children":293754},{},[293755],{"type":23,"value":87518},{"type":17,"tag":7243,"props":293757,"children":293758},{},[293759],{"type":23,"value":293349},{"type":17,"tag":7243,"props":293761,"children":293762},{},[293763],{"type":23,"value":293291},{"type":17,"tag":7259,"props":293765,"children":293766},{},[293767,293785,293806,293822,293840,293857,293874],{"type":17,"tag":7239,"props":293768,"children":293769},{},[293770,293775,293780],{"type":17,"tag":7266,"props":293771,"children":293772},{},[293773],{"type":23,"value":293774},"Data model",{"type":17,"tag":7266,"props":293776,"children":293777},{},[293778],{"type":23,"value":293779},"Category-level normalized schemas (380+ integrations)",{"type":17,"tag":7266,"props":293781,"children":293782},{},[293783],{"type":23,"value":293784},"Provider-native schemas only",{"type":17,"tag":7239,"props":293786,"children":293787},{},[293788,293793,293801],{"type":17,"tag":7266,"props":293789,"children":293790},{},[293791],{"type":23,"value":293792},"Tool coverage",{"type":17,"tag":7266,"props":293794,"children":293795},{},[293796],{"type":17,"tag":48,"props":293797,"children":293798},{},[293799],{"type":23,"value":293800},"22,566+ tools",{"type":17,"tag":7266,"props":293802,"children":293803},{},[293804],{"type":23,"value":293805},"Approximate ('hundreds'), no published total",{"type":17,"tag":7239,"props":293807,"children":293808},{},[293809,293813,293817],{"type":17,"tag":7266,"props":293810,"children":293811},{},[293812],{"type":23,"value":282556},{"type":17,"tag":7266,"props":293814,"children":293815},{},[293816],{"type":23,"value":87601},{"type":17,"tag":7266,"props":293818,"children":293819},{},[293820],{"type":23,"value":293821},"Synchronous calls only; no documented event pipeline",{"type":17,"tag":7239,"props":293823,"children":293824},{},[293825,293830,293835],{"type":17,"tag":7266,"props":293826,"children":293827},{},[293828],{"type":23,"value":293829},"MCP hosting",{"type":17,"tag":7266,"props":293831,"children":293832},{},[293833],{"type":23,"value":293834},"Fully hosted",{"type":17,"tag":7266,"props":293836,"children":293837},{},[293838],{"type":23,"value":293839},"Self-hosted (hosted option not documented)",{"type":17,"tag":7239,"props":293841,"children":293842},{},[293843,293847,293852],{"type":17,"tag":7266,"props":293844,"children":293845},{},[293846],{"type":23,"value":69408},{"type":17,"tag":7266,"props":293848,"children":293849},{},[293850],{"type":23,"value":293851},"No customer record storage",{"type":17,"tag":7266,"props":293853,"children":293854},{},[293855],{"type":23,"value":293856},"Tokens + audit logs stored",{"type":17,"tag":7239,"props":293858,"children":293859},{},[293860,293864,293869],{"type":17,"tag":7266,"props":293861,"children":293862},{},[293863],{"type":23,"value":256213},{"type":17,"tag":7266,"props":293865,"children":293866},{},[293867],{"type":23,"value":293868},"SOC 2, GDPR, CCPA",{"type":17,"tag":7266,"props":293870,"children":293871},{},[293872],{"type":23,"value":293873},"SOC 2 Type II; GDPR/DPA not publicly documented",{"type":17,"tag":7239,"props":293875,"children":293876},{},[293877,293881,293886],{"type":17,"tag":7266,"props":293878,"children":293879},{},[293880],{"type":23,"value":80744},{"type":17,"tag":7266,"props":293882,"children":293883},{},[293884],{"type":23,"value":293885},"Production AI agents and AI-native SaaS",{"type":17,"tag":7266,"props":293887,"children":293888},{},[293889],{"type":23,"value":293890},"Agent prototyping and curated tool execution",{"type":17,"tag":68,"props":293892,"children":293893},{"id":45643},[293894],{"type":23,"value":45646},{"type":17,"tag":29,"props":293896,"children":293897},{},[293898,293900,293905],{"type":23,"value":293899},"Arcade.dev MCP is a solid option for ",{"type":17,"tag":48,"props":293901,"children":293902},{},[293903],{"type":23,"value":293904},"agent prototyping and controlled action execution",{"type":23,"value":293906}," using curated tools and synchronous calls. It is well-suited for early-stage agent experiments where coverage and normalization requirements are limited.",{"type":17,"tag":29,"props":293908,"children":293909},{},[293910],{"type":23,"value":293911},"Unified MCP is designed for products that depend on consistent, real-time access to integration data across systems. With published coverage metrics and a hosted MCP server, Unified reduces ambiguity as agent complexity grows.",{"type":17,"tag":29,"props":293913,"children":293914},{},[293915,293916],{"type":23,"value":217407},{"type":17,"tag":133,"props":293917,"children":293919},{"href":293918},"/25b6207b838480b9abb2c6314fa0458f",[293920],{"type":17,"tag":48,"props":293921,"children":293922},{},[293923],{"type":23,"value":293924},"Read the Unified MCP documentation",{"type":17,"tag":29,"props":293926,"children":293927},{},[293928,293929],{"type":23,"value":217407},{"type":17,"tag":133,"props":293930,"children":293931},{"href":293918},[293932],{"type":17,"tag":48,"props":293933,"children":293934},{},[293935],{"type":23,"value":293936},"Start a 30-day trial",{"type":17,"tag":29,"props":293938,"children":293939},{},[293940,293941],{"type":23,"value":217407},{"type":17,"tag":133,"props":293942,"children":293943},{"href":293918},[293944],{"type":17,"tag":48,"props":293945,"children":293946},{},[293947],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":293949},[293950,293953,293954,293958,293959,293960,293964,293968,293972,293976,293977],{"id":292968,"depth":1629,"text":292971,"children":293951},[293952],{"id":292979,"depth":1635,"text":292982},{"id":293029,"depth":1629,"text":293032},{"id":293092,"depth":1629,"text":293095,"children":293955},[293956,293957],{"id":293098,"depth":1635,"text":293101},{"id":293161,"depth":1635,"text":293164},{"id":293200,"depth":1629,"text":293203},{"id":293244,"depth":1629,"text":293247},{"id":293282,"depth":1629,"text":293285,"children":293961},[293962,293963],{"id":293288,"depth":1635,"text":293291},{"id":293346,"depth":1635,"text":293349},{"id":293387,"depth":1629,"text":293390,"children":293965},[293966,293967],{"id":293393,"depth":1635,"text":293291},{"id":293449,"depth":1635,"text":293349},{"id":293505,"depth":1629,"text":293508,"children":293969},[293970,293971],{"id":293511,"depth":1635,"text":293514},{"id":293576,"depth":1635,"text":293579},{"id":293624,"depth":1629,"text":293627,"children":293973},[293974,293975],{"id":293630,"depth":1635,"text":293291},{"id":293670,"depth":1635,"text":293349},{"id":293734,"depth":1629,"text":293737},{"id":45643,"depth":1629,"text":45646},"content:blog:unified_mcp_vs_arcade_dev_mcp_comparison_which_is_better_for_ai_agents_2026.md","blog/unified_mcp_vs_arcade_dev_mcp_comparison_which_is_better_for_ai_agents_2026.md","blog/unified_mcp_vs_arcade_dev_mcp_comparison_which_is_better_for_ai_agents_2026",{"_path":293982,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":293983,"description":293984,"img":293985,"date":293986,"tag":12,"body":293987,"_type":1677,"_id":295169,"_source":1679,"_file":295170,"_stem":295171,"_extension":1682},"/blog/unified_mcp_vs_composio_mcp_comparison_which_is_better_for_ai_agents","Unified MCP vs Composio MCP Comparison: Which Is Better for AI Agents?","Composio MCP and Unified MCP take different approaches to connecting AI agents with external systems. Composio focuses on a centralized gateway that manages...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_vs_composio_mcp_comparison_which_is_better_for_ai_agents-icon.png","2025-08-26T17:00:00.000Z",{"type":14,"children":293988,"toc":295139},[293989,293994,293997,294004,294012,294028,294046,294051,294057,294065,294083,294090,294113,294118,294123,294129,294140,294146,294182,294188,294194,294247,294255,294312,294318,294365,294370,294375,294397,294402,294407,294411,294422,294433,294443,294453,294459,294465,294523,294528,294533,294545,294575,294580,294586,294591,294636,294641,294645,294680,294698,294702,294708,294748,294754,294794,294800,294805,294864,294869,294888,294894,294899,294905,294910,295079,295083,295095,295106,295117,295128],{"type":17,"tag":18,"props":293990,"children":293992},{"id":293991},"unified-mcp-vs-composio-mcp-comparison-which-is-better-for-ai-agents",[293993],{"type":23,"value":293983},{"type":17,"tag":25,"props":293995,"children":293996},{},[],{"type":17,"tag":29,"props":293998,"children":293999},{},[294000],{"type":17,"tag":33,"props":294001,"children":294002},{},[294003],{"type":23,"value":292910},{"type":17,"tag":29,"props":294005,"children":294006},{},[294007],{"type":17,"tag":6438,"props":294008,"children":294011},{"alt":294009,"src":294010},"MCP_%282%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_vs_composio_mcp_comparison_which_is_better_for_ai_agents-0.png",[],{"type":17,"tag":29,"props":294013,"children":294014},{},[294015,294017,294021,294022,294026],{"type":23,"value":294016},"Composio ",{"type":17,"tag":133,"props":294018,"children":294019},{"href":326},[294020],{"type":23,"value":329},{"type":23,"value":34435},{"type":17,"tag":133,"props":294023,"children":294024},{"href":326},[294025],{"type":23,"value":45418},{"type":23,"value":294027}," take different approaches to connecting AI agents with external systems. Composio focuses on a centralized gateway that manages provider-specific tools and execution, while Unified MCP provides direct, real-time access to integrations with optional normalization and full API surface coverage.",{"type":17,"tag":29,"props":294029,"children":294030},{},[294031,294033,294037,294039,294044],{"type":23,"value":294032},"Unified MCP is a ",{"type":17,"tag":48,"props":294034,"children":294035},{},[294036],{"type":23,"value":292944},{"type":23,"value":294038}," designed for teams building AI-native products that require ",{"type":17,"tag":48,"props":294040,"children":294041},{},[294042],{"type":23,"value":294043},"real-time data access, category-level normalization where it adds leverage, and full API surface coverage",{"type":23,"value":294045},"—without operating MCP infrastructure or storing customer records.",{"type":17,"tag":29,"props":294047,"children":294048},{},[294049],{"type":23,"value":294050},"Both platforms support MCP. The difference is how they handle execution, data consistency, and integration coverage as systems scale.",{"type":17,"tag":68,"props":294052,"children":294054},{"id":294053},"when-to-choose-composio-mcp-vs-unified-mcp",[294055],{"type":23,"value":294056},"When to choose Composio MCP vs Unified MCP",{"type":17,"tag":29,"props":294058,"children":294059},{},[294060],{"type":17,"tag":48,"props":294061,"children":294062},{},[294063],{"type":23,"value":294064},"Choose Composio MCP if:",{"type":17,"tag":80,"props":294066,"children":294067},{},[294068,294073,294078],{"type":17,"tag":84,"props":294069,"children":294070},{},[294071],{"type":23,"value":294072},"You want a centralized control layer for agent-tool execution",{"type":17,"tag":84,"props":294074,"children":294075},{},[294076],{"type":23,"value":294077},"Your workflows are action-driven and provider-specific",{"type":17,"tag":84,"props":294079,"children":294080},{},[294081],{"type":23,"value":294082},"You need built-in observability, routing, and trigger orchestration",{"type":17,"tag":29,"props":294084,"children":294085},{},[294086],{"type":17,"tag":48,"props":294087,"children":294088},{},[294089],{"type":23,"value":293066},{"type":17,"tag":80,"props":294091,"children":294092},{},[294093,294098,294103,294108],{"type":17,"tag":84,"props":294094,"children":294095},{},[294096],{"type":23,"value":294097},"Your product depends on structured data across integrations",{"type":17,"tag":84,"props":294099,"children":294100},{},[294101],{"type":23,"value":294102},"You need consistent schemas across providers where possible",{"type":17,"tag":84,"props":294104,"children":294105},{},[294106],{"type":23,"value":294107},"You want real-time access without building polling or sync systems",{"type":17,"tag":84,"props":294109,"children":294110},{},[294111],{"type":23,"value":294112},"You prefer a hosted MCP server with minimal infrastructure overhead",{"type":17,"tag":29,"props":294114,"children":294115},{},[294116],{"type":23,"value":294117},"What is the difference between MCP gateways and hosted MCP servers?",{"type":17,"tag":29,"props":294119,"children":294120},{},[294121],{"type":23,"value":294122},"MCP gateways centralize access to many provider-specific tools and manage routing, authentication, and observability. Hosted MCP servers can instead expose integrations as a unified interface with consistent schemas and direct API access. The difference is between managing tool orchestration versus accessing structured data across systems.",{"type":17,"tag":68,"props":294124,"children":294126},{"id":294125},"at-a-glance-unified-mcp-vs-composio-mcp",[294127],{"type":23,"value":294128},"At a glance: Unified MCP vs Composio MCP",{"type":17,"tag":29,"props":294130,"children":294131},{},[294132,294134,294138],{"type":23,"value":294133},"Composio offers managed MCP servers and a gateway that aggregates many provider-specific tools. Unified MCP is a hosted MCP server that exposes ",{"type":17,"tag":48,"props":294135,"children":294136},{},[294137],{"type":23,"value":292995},{"type":23,"value":294139}," as callable tools, combining normalized objects with full provider endpoint access.",{"type":17,"tag":239,"props":294141,"children":294143},{"id":294142},"unified-mcp-provides",[294144],{"type":23,"value":294145},"Unified MCP provides",{"type":17,"tag":80,"props":294147,"children":294148},{},[294149,294157,294166,294170,294174,294178],{"type":17,"tag":84,"props":294150,"children":294151},{},[294152,294153],{"type":23,"value":292990},{"type":17,"tag":48,"props":294154,"children":294155},{},[294156],{"type":23,"value":292995},{"type":17,"tag":84,"props":294158,"children":294159},{},[294160,294161],{"type":23,"value":293000},{"type":17,"tag":6121,"props":294162,"children":294164},{"className":294163},[],[294165],{"type":23,"value":293006},{"type":17,"tag":84,"props":294167,"children":294168},{},[294169],{"type":23,"value":293011},{"type":17,"tag":84,"props":294171,"children":294172},{},[294173],{"type":23,"value":293016},{"type":17,"tag":84,"props":294175,"children":294176},{},[294177],{"type":23,"value":293021},{"type":17,"tag":84,"props":294179,"children":294180},{},[294181],{"type":23,"value":293026},{"type":17,"tag":68,"props":294183,"children":294185},{"id":294184},"execution-model-synchronous-by-default-async-where-explicitly-supported",[294186],{"type":23,"value":294187},"Execution model: synchronous by default, async where explicitly supported",{"type":17,"tag":239,"props":294189,"children":294191},{"id":294190},"composio-mcp-documented-behavior",[294192],{"type":23,"value":294193},"Composio MCP (documented behavior)",{"type":17,"tag":80,"props":294195,"children":294196},{},[294197,294207,294224,294235],{"type":17,"tag":84,"props":294198,"children":294199},{},[294200,294205],{"type":17,"tag":48,"props":294201,"children":294202},{},[294203],{"type":23,"value":294204},"Synchronous by default",{"type":23,"value":294206},": MCP tool calls block until the underlying provider finishes processing.",{"type":17,"tag":84,"props":294208,"children":294209},{},[294210,294215,294217,294222],{"type":17,"tag":48,"props":294211,"children":294212},{},[294213],{"type":23,"value":294214},"Asynchronous execution",{"type":23,"value":294216}," is available only where a toolkit explicitly supports the experimental ",{"type":17,"tag":48,"props":294218,"children":294219},{},[294220],{"type":23,"value":294221},"MCP Tasks",{"type":23,"value":294223}," extension. Tasks are provider-specific and must be capability-negotiated.",{"type":17,"tag":84,"props":294225,"children":294226},{},[294227,294229,294233],{"type":23,"value":294228},"MCP itself does ",{"type":17,"tag":48,"props":294230,"children":294231},{},[294232],{"type":23,"value":159475},{"type":23,"value":294234}," define retries, idempotency, replay, or background execution. These concerns are handled outside the protocol.",{"type":17,"tag":84,"props":294236,"children":294237},{},[294238,294240,294245],{"type":23,"value":294239},"Caching is ",{"type":17,"tag":48,"props":294241,"children":294242},{},[294243],{"type":23,"value":294244},"not protocol-level",{"type":23,"value":294246},"; it may be implemented at the gateway layer or via tool-specific caching features.",{"type":17,"tag":29,"props":294248,"children":294249},{},[294250],{"type":17,"tag":48,"props":294251,"children":294252},{},[294253],{"type":23,"value":294254},"Event triggers",{"type":17,"tag":80,"props":294256,"children":294257},{},[294258,294273,294284,294301],{"type":17,"tag":84,"props":294259,"children":294260},{},[294261,294263,294272],{"type":23,"value":294262},"Composio supports event-driven behavior via ",{"type":17,"tag":48,"props":294264,"children":294265},{},[294266,294270],{"type":17,"tag":133,"props":294267,"children":294268},{"href":4999},[294269],{"type":23,"value":5002},{"type":23,"value":294271}," or WebSockets",{"type":23,"value":54},{"type":17,"tag":84,"props":294274,"children":294275},{},[294276,294278,294283],{"type":23,"value":294277},"Triggers are ",{"type":17,"tag":48,"props":294279,"children":294280},{},[294281],{"type":23,"value":294282},"not limited to providers with native webhooks",{"type":23,"value":54},{"type":17,"tag":84,"props":294285,"children":294286},{},[294287,294289,294294,294296,294299],{"type":23,"value":294288},"When native webhooks are unavailable, Composio ",{"type":17,"tag":48,"props":294290,"children":294291},{},[294292],{"type":23,"value":294293},"falls back to polling",{"type":23,"value":294295}," (explicitly documented).",{"type":17,"tag":3891,"props":294297,"children":294298},{},[],{"type":23,"value":294300},"For example, Gmail triggers use polling with a minimum interval and may experience delays.",{"type":17,"tag":84,"props":294302,"children":294303},{},[294304,294306,294311],{"type":23,"value":294305},"Polling is therefore ",{"type":17,"tag":48,"props":294307,"children":294308},{},[294309],{"type":23,"value":294310},"required for some integrations",{"type":23,"value":54},{"type":17,"tag":239,"props":294313,"children":294315},{"id":294314},"unified-mcp-documented-behavior",[294316],{"type":23,"value":294317},"Unified MCP (documented behavior)",{"type":17,"tag":80,"props":294319,"children":294320},{},[294321,294326,294354],{"type":17,"tag":84,"props":294322,"children":294323},{},[294324],{"type":23,"value":294325},"MCP tool calls are synchronous and routed directly to source APIs.",{"type":17,"tag":84,"props":294327,"children":294328},{},[294329,294331,294336,294337],{"type":23,"value":294330},"Outside MCP, Unified provides ",{"type":17,"tag":48,"props":294332,"children":294333},{},[294334],{"type":23,"value":294335},"managed event infrastructure",{"type":23,"value":282122},{"type":17,"tag":80,"props":294338,"children":294339},{},[294340,294345],{"type":17,"tag":84,"props":294341,"children":294342},{},[294343],{"type":23,"value":294344},"Native webhooks where providers support them",{"type":17,"tag":84,"props":294346,"children":294347},{},[294348,294352],{"type":17,"tag":48,"props":294349,"children":294350},{},[294351],{"type":23,"value":9256},{"type":23,"value":294353}," where providers do not, handling polling, retries, and change detection internally",{"type":17,"tag":84,"props":294355,"children":294356},{},[294357,294359,294363],{"type":23,"value":294358},"This ensures MCP tools can reliably access ",{"type":17,"tag":48,"props":294360,"children":294361},{},[294362],{"type":23,"value":10763},{"type":23,"value":294364}," without developers building or operating polling systems.",{"type":17,"tag":29,"props":294366,"children":294367},{},[294368],{"type":23,"value":294369},"Control plane vs data access layer",{"type":17,"tag":29,"props":294371,"children":294372},{},[294373],{"type":23,"value":294374},"The deeper distinction is architectural:",{"type":17,"tag":80,"props":294376,"children":294377},{},[294378,294388],{"type":17,"tag":84,"props":294379,"children":294380},{},[294381,294386],{"type":17,"tag":48,"props":294382,"children":294383},{},[294384],{"type":23,"value":294385},"Composio MCP:",{"type":23,"value":294387}," control plane for tool execution (routing, orchestration, triggers)",{"type":17,"tag":84,"props":294389,"children":294390},{},[294391,294395],{"type":17,"tag":48,"props":294392,"children":294393},{},[294394],{"type":23,"value":293229},{"type":23,"value":294396}," data access layer for integrations (structured reads, writes, and coverage)",{"type":17,"tag":29,"props":294398,"children":294399},{},[294400],{"type":23,"value":294401},"Control planes coordinate how tools are executed. Data layers determine how data is accessed, structured, and kept current across systems.",{"type":17,"tag":29,"props":294403,"children":294404},{},[294405],{"type":23,"value":294406},"As agents expand beyond simple actions, data consistency and access patterns become the limiting factor.",{"type":17,"tag":68,"props":294408,"children":294409},{"id":293244},[294410],{"type":23,"value":293247},{"type":17,"tag":29,"props":294412,"children":294413},{},[294414,294416,294421],{"type":23,"value":294415},"Composio exposes integrations as ",{"type":17,"tag":48,"props":294417,"children":294418},{},[294419],{"type":23,"value":294420},"actions tied to specific providers",{"type":23,"value":54},{"type":17,"tag":29,"props":294423,"children":294424},{},[294425,294427,294432],{"type":23,"value":294426},"Unified provides integrations as ",{"type":17,"tag":48,"props":294428,"children":294429},{},[294430],{"type":23,"value":294431},"data and endpoints that can be queried and updated consistently",{"type":23,"value":54},{"type":17,"tag":29,"props":294434,"children":294435},{},[294436,294438],{"type":23,"value":294437},"Actions answer: ",{"type":17,"tag":33,"props":294439,"children":294440},{},[294441],{"type":23,"value":294442},"what can the agent do?",{"type":17,"tag":29,"props":294444,"children":294445},{},[294446,294448],{"type":23,"value":294447},"Data layers answer: ",{"type":17,"tag":33,"props":294449,"children":294450},{},[294451],{"type":23,"value":294452},"what does the agent know, and how current is it?",{"type":17,"tag":68,"props":294454,"children":294456},{"id":294455},"schema-model-provider-native-tools-vs-normalization-passthrough",[294457],{"type":23,"value":294458},"Schema model: provider-native tools vs normalization + passthrough",{"type":17,"tag":239,"props":294460,"children":294462},{"id":294461},"composio-mcp",[294463],{"type":23,"value":294464},"Composio MCP",{"type":17,"tag":80,"props":294466,"children":294467},{},[294468,294492,294504,294514],{"type":17,"tag":84,"props":294469,"children":294470},{},[294471,294473,294477,294478,294484,294485,294491],{"type":23,"value":294472},"Tools are ",{"type":17,"tag":48,"props":294474,"children":294475},{},[294476],{"type":23,"value":227980},{"type":23,"value":149495},{"type":17,"tag":6121,"props":294479,"children":294481},{"className":294480},[],[294482],{"type":23,"value":294483},"HUBSPOT_CREATE_CONTACT",{"type":23,"value":11826},{"type":17,"tag":6121,"props":294486,"children":294488},{"className":294487},[],[294489],{"type":23,"value":294490},"GITHUB_CREATE_ISSUE",{"type":23,"value":12034},{"type":17,"tag":84,"props":294493,"children":294494},{},[294495,294497,294502],{"type":23,"value":294496},"Each tool has its ",{"type":17,"tag":48,"props":294498,"children":294499},{},[294500],{"type":23,"value":294501},"own input/output schema",{"type":23,"value":294503}," that mirrors the native API",{"type":17,"tag":84,"props":294505,"children":294506},{},[294507,294509],{"type":23,"value":294508},"Tools are formatted for the target LLM (OpenAI, Anthropic, etc.), but ",{"type":17,"tag":48,"props":294510,"children":294511},{},[294512],{"type":23,"value":294513},"schemas remain provider-native",{"type":17,"tag":84,"props":294515,"children":294516},{},[294517,294518],{"type":23,"value":195030},{"type":17,"tag":48,"props":294519,"children":294520},{},[294521],{"type":23,"value":294522},"no published cross-vendor normalization model",{"type":17,"tag":29,"props":294524,"children":294525},{},[294526],{"type":23,"value":294527},"This works well for agents operating within a single application or narrow workflow. As agents span multiple systems, schema reconciliation shifts to prompts or application logic.",{"type":17,"tag":239,"props":294529,"children":294531},{"id":294530},"unified-mcp",[294532],{"type":23,"value":45418},{"type":17,"tag":29,"props":294534,"children":294535},{},[294536,294538,294543],{"type":23,"value":294537},"Unified combines ",{"type":17,"tag":48,"props":294539,"children":294540},{},[294541],{"type":23,"value":294542},"normalization where it reduces complexity",{"type":23,"value":294544}," with passthrough where full fidelity is needed:",{"type":17,"tag":80,"props":294546,"children":294547},{},[294548,294553,294565],{"type":17,"tag":84,"props":294549,"children":294550},{},[294551],{"type":23,"value":294552},"Common objects (e.g., Contact, Deal, Candidate) share consistent schemas across providers",{"type":17,"tag":84,"props":294554,"children":294555},{},[294556,294558,294563],{"type":23,"value":294557},"Normalization is ",{"type":17,"tag":48,"props":294559,"children":294560},{},[294561],{"type":23,"value":294562},"optional",{"type":23,"value":294564},", not mandatory",{"type":17,"tag":84,"props":294566,"children":294567},{},[294568,294570],{"type":23,"value":294569},"For endpoints outside the unified model, passthrough tools expose provider-native APIs via ",{"type":17,"tag":6121,"props":294571,"children":294573},{"className":294572},[],[294574],{"type":23,"value":293006},{"type":17,"tag":29,"props":294576,"children":294577},{},[294578],{"type":23,"value":294579},"Normalization is not required for MCP, but it reduces schema variability and simplifies multi-system workflows.",{"type":17,"tag":68,"props":294581,"children":294583},{"id":294582},"coverage-curated-toolkits-vs-full-api-surface",[294584],{"type":23,"value":294585},"Coverage: curated toolkits vs full API surface",{"type":17,"tag":239,"props":294587,"children":294589},{"id":294588},"composio-mcp-1",[294590],{"type":23,"value":294464},{"type":17,"tag":80,"props":294592,"children":294593},{},[294594,294604,294620,294631],{"type":17,"tag":84,"props":294595,"children":294596},{},[294597,294602],{"type":17,"tag":48,"props":294598,"children":294599},{},[294600],{"type":23,"value":294601},"877 publicly listed SaaS toolkits",{"type":23,"value":294603}," (enumerated in the toolkits directory as of Feb 2026)",{"type":17,"tag":84,"props":294605,"children":294606},{},[294607,294609,294614,294615],{"type":23,"value":294608},"Marketing references ",{"type":17,"tag":48,"props":294610,"children":294611},{},[294612],{"type":23,"value":294613},"'11,000+ tools'",{"type":23,"value":75890},{"type":17,"tag":48,"props":294616,"children":294617},{},[294618],{"type":23,"value":294619},"'10K+ tools'",{"type":17,"tag":84,"props":294621,"children":294622},{},[294623,294624,294629],{"type":23,"value":195030},{"type":17,"tag":48,"props":294625,"children":294626},{},[294627],{"type":23,"value":294628},"no published, versioned index",{"type":23,"value":294630}," enumerating all individual tools/actions",{"type":17,"tag":84,"props":294632,"children":294633},{},[294634],{"type":23,"value":294635},"Full tool discovery occurs programmatically via meta tools and APIs",{"type":17,"tag":239,"props":294637,"children":294639},{"id":294638},"unified-mcp-1",[294640],{"type":23,"value":45418},{"type":17,"tag":29,"props":294642,"children":294643},{},[294644],{"type":23,"value":293456},{"type":17,"tag":80,"props":294646,"children":294647},{},[294648,294655],{"type":17,"tag":84,"props":294649,"children":294650},{},[294651],{"type":17,"tag":48,"props":294652,"children":294653},{},[294654],{"type":23,"value":292995},{"type":17,"tag":84,"props":294656,"children":294657},{},[294658,294662],{"type":17,"tag":48,"props":294659,"children":294660},{},[294661],{"type":23,"value":293474},{"type":17,"tag":80,"props":294663,"children":294664},{},[294665,294670],{"type":17,"tag":84,"props":294666,"children":294667},{},[294668],{"type":23,"value":294669},"Thousands of normalized tools",{"type":17,"tag":84,"props":294671,"children":294672},{},[294673,294675],{"type":23,"value":294674},"Tens of thousands of passthrough tools via ",{"type":17,"tag":6121,"props":294676,"children":294678},{"className":294677},[],[294679],{"type":23,"value":293006},{"type":17,"tag":29,"props":294681,"children":294682},{},[294683,294685,294690,294691,294696],{"type":23,"value":294684},"Unified's model provides ",{"type":17,"tag":48,"props":294686,"children":294687},{},[294688],{"type":23,"value":294689},"consistency for common workflows",{"type":23,"value":34435},{"type":17,"tag":48,"props":294692,"children":294693},{},[294694],{"type":23,"value":294695},"maximum reach for long-tail endpoints",{"type":23,"value":294697},"—without depending on curated action coverage.",{"type":17,"tag":68,"props":294699,"children":294700},{"id":293505},[294701],{"type":23,"value":293508},{"type":17,"tag":239,"props":294703,"children":294705},{"id":294704},"composio-mcp-documented",[294706],{"type":23,"value":294707},"Composio MCP (documented)",{"type":17,"tag":80,"props":294709,"children":294710},{},[294711,294723,294727,294736],{"type":17,"tag":84,"props":294712,"children":294713},{},[294714,294716,294721],{"type":23,"value":294715},"OAuth tokens are ",{"type":17,"tag":48,"props":294717,"children":294718},{},[294719],{"type":23,"value":294720},"encrypted at rest",{"type":23,"value":294722}," and isolated from LLM inference",{"type":17,"tag":84,"props":294724,"children":294725},{},[294726],{"type":23,"value":293540},{"type":17,"tag":84,"props":294728,"children":294729},{},[294730,294734],{"type":17,"tag":48,"props":294731,"children":294732},{},[294733],{"type":23,"value":94139},{"type":23,"value":294735}," certification is published",{"type":17,"tag":84,"props":294737,"children":294738},{},[294739,294741,294746],{"type":23,"value":294740},"Execution statefulness and data-retention boundaries for MCP are ",{"type":17,"tag":48,"props":294742,"children":294743},{},[294744],{"type":23,"value":294745},"not fully specified",{"type":23,"value":294747}," in public documentation",{"type":17,"tag":239,"props":294749,"children":294751},{"id":294750},"unified-mcp-documented",[294752],{"type":23,"value":294753},"Unified MCP (documented)",{"type":17,"tag":80,"props":294755,"children":294756},{},[294757,294765,294769,294779,294789],{"type":17,"tag":84,"props":294758,"children":294759},{},[294760],{"type":17,"tag":48,"props":294761,"children":294762},{},[294763],{"type":23,"value":294764},"No customer record data stored or cached",{"type":17,"tag":84,"props":294766,"children":294767},{},[294768],{"type":23,"value":293600},{"type":17,"tag":84,"props":294770,"children":294771},{},[294772,294773,294778],{"type":23,"value":188037},{"type":17,"tag":6121,"props":294774,"children":294776},{"className":294775},[],[294777],{"type":23,"value":131715},{"type":23,"value":293611},{"type":17,"tag":84,"props":294780,"children":294781},{},[294782,294787],{"type":17,"tag":48,"props":294783,"children":294784},{},[294785],{"type":23,"value":294786},"SOC 2 Type II, GDPR, and CCPA",{"type":23,"value":294788}," aligned",{"type":17,"tag":84,"props":294790,"children":294791},{},[294792],{"type":23,"value":294793},"Optional customer-managed secrets (e.g., AWS Secrets Manager)",{"type":17,"tag":68,"props":294795,"children":294797},{"id":294796},"deployment-model-and-operational-responsibility",[294798],{"type":23,"value":294799},"Deployment model and operational responsibility",{"type":17,"tag":239,"props":294801,"children":294803},{"id":294802},"composio-mcp-2",[294804],{"type":23,"value":294464},{"type":17,"tag":80,"props":294806,"children":294807},{},[294808,294820,294830,294842,294847],{"type":17,"tag":84,"props":294809,"children":294810},{},[294811,294813,294818],{"type":23,"value":294812},"Offers ",{"type":17,"tag":48,"props":294814,"children":294815},{},[294816],{"type":23,"value":294817},"fully managed MCP servers",{"type":23,"value":294819}," with built-in authentication",{"type":17,"tag":84,"props":294821,"children":294822},{},[294823,294825],{"type":23,"value":294824},"Supports ",{"type":17,"tag":48,"props":294826,"children":294827},{},[294828],{"type":23,"value":294829},"optional self-hosting",{"type":17,"tag":84,"props":294831,"children":294832},{},[294833,294835,294840],{"type":23,"value":294834},"Provides ",{"type":17,"tag":48,"props":294836,"children":294837},{},[294838],{"type":23,"value":294839},"enterprise private-cloud / on-prem deployment",{"type":23,"value":294841}," (AWS, Azure, GCP)",{"type":17,"tag":84,"props":294843,"children":294844},{},[294845],{"type":23,"value":294846},"For managed MCP, Composio handles authentication, integration updates, reliability, and observability",{"type":17,"tag":84,"props":294848,"children":294849},{},[294850,294852,294857,294859],{"type":23,"value":294851},"Operational responsibilities for ",{"type":17,"tag":48,"props":294853,"children":294854},{},[294855],{"type":23,"value":294856},"self-hosted MCP",{"type":23,"value":294858}," (scaling, monitoring, updates) are ",{"type":17,"tag":48,"props":294860,"children":294861},{},[294862],{"type":23,"value":294863},"not publicly specified",{"type":17,"tag":239,"props":294865,"children":294867},{"id":294866},"unified-mcp-2",[294868],{"type":23,"value":45418},{"type":17,"tag":80,"props":294870,"children":294871},{},[294872,294879,294884],{"type":17,"tag":84,"props":294873,"children":294874},{},[294875],{"type":17,"tag":48,"props":294876,"children":294877},{},[294878],{"type":23,"value":293680},{"type":17,"tag":84,"props":294880,"children":294881},{},[294882],{"type":23,"value":294883},"Unified manages scaling, availability, and updates",{"type":17,"tag":84,"props":294885,"children":294886},{},[294887],{"type":23,"value":293706},{"type":17,"tag":68,"props":294889,"children":294891},{"id":294890},"do-mcp-tools-use-normalized-schemas-or-provider-specific-schemas",[294892],{"type":23,"value":294893},"Do MCP tools use normalized schemas or provider-specific schemas?",{"type":17,"tag":29,"props":294895,"children":294896},{},[294897],{"type":23,"value":294898},"Some MCP implementations expose provider-specific schemas, where each tool mirrors the native API of a platform. Others offer normalized schemas that standardize objects across providers while still allowing access to raw endpoints. Provider-specific schemas maximize flexibility, while normalized schemas improve consistency across integrations.",{"type":17,"tag":68,"props":294900,"children":294902},{"id":294901},"tldr-unified-mcp-vs-composio-mcp",[294903],{"type":23,"value":294904},"TL;DR — Unified MCP vs Composio MCP",{"type":17,"tag":29,"props":294906,"children":294907},{},[294908],{"type":23,"value":294909},"Unified MCP provides structured, real-time access to integration data, while Composio MCP focuses on managing and executing provider-specific tools through a centralized gateway.",{"type":17,"tag":7231,"props":294911,"children":294912},{},[294913,294931],{"type":17,"tag":7235,"props":294914,"children":294915},{},[294916],{"type":17,"tag":7239,"props":294917,"children":294918},{},[294919,294923,294927],{"type":17,"tag":7243,"props":294920,"children":294921},{},[294922],{"type":23,"value":87518},{"type":17,"tag":7243,"props":294924,"children":294925},{},[294926],{"type":23,"value":45418},{"type":17,"tag":7243,"props":294928,"children":294929},{},[294930],{"type":23,"value":294464},{"type":17,"tag":7259,"props":294932,"children":294933},{},[294934,294954,294978,294996,295013,295030,295046,295062],{"type":17,"tag":7239,"props":294935,"children":294936},{},[294937,294941,294946],{"type":17,"tag":7266,"props":294938,"children":294939},{},[294940],{"type":23,"value":42944},{"type":17,"tag":7266,"props":294942,"children":294943},{},[294944],{"type":23,"value":294945},"380+ integrations (normalized categories)",{"type":17,"tag":7266,"props":294947,"children":294948},{},[294949],{"type":17,"tag":48,"props":294950,"children":294951},{},[294952],{"type":23,"value":294953},"877 SaaS toolkits (publicly listed)",{"type":17,"tag":7239,"props":294955,"children":294956},{},[294957,294962,294970],{"type":17,"tag":7266,"props":294958,"children":294959},{},[294960],{"type":23,"value":294961},"Tool count",{"type":17,"tag":7266,"props":294963,"children":294964},{},[294965],{"type":17,"tag":48,"props":294966,"children":294967},{},[294968],{"type":23,"value":294969},"22,566+ tools (published, versioned)",{"type":17,"tag":7266,"props":294971,"children":294972},{},[294973],{"type":17,"tag":48,"props":294974,"children":294975},{},[294976],{"type":23,"value":294977},"11,000+ tools (marketing; not enumerated)",{"type":17,"tag":7239,"props":294979,"children":294980},{},[294981,294986,294991],{"type":17,"tag":7266,"props":294982,"children":294983},{},[294984],{"type":23,"value":294985},"Execution",{"type":17,"tag":7266,"props":294987,"children":294988},{},[294989],{"type":23,"value":294990},"Synchronous MCP + managed event infra",{"type":17,"tag":7266,"props":294992,"children":294993},{},[294994],{"type":23,"value":294995},"Synchronous by default; async via Tasks where supported",{"type":17,"tag":7239,"props":294997,"children":294998},{},[294999,295003,295008],{"type":17,"tag":7266,"props":295000,"children":295001},{},[295002],{"type":23,"value":10049},{"type":17,"tag":7266,"props":295004,"children":295005},{},[295006],{"type":23,"value":295007},"Native + virtual webhooks (managed)",{"type":17,"tag":7266,"props":295009,"children":295010},{},[295011],{"type":23,"value":295012},"Webhooks or polling (documented fallback)",{"type":17,"tag":7239,"props":295014,"children":295015},{},[295016,295021,295026],{"type":17,"tag":7266,"props":295017,"children":295018},{},[295019],{"type":23,"value":295020},"Schemas",{"type":17,"tag":7266,"props":295022,"children":295023},{},[295024],{"type":23,"value":295025},"Normalized + passthrough combined",{"type":17,"tag":7266,"props":295027,"children":295028},{},[295029],{"type":23,"value":293784},{"type":17,"tag":7239,"props":295031,"children":295032},{},[295033,295037,295041],{"type":17,"tag":7266,"props":295034,"children":295035},{},[295036],{"type":23,"value":293829},{"type":17,"tag":7266,"props":295038,"children":295039},{},[295040],{"type":23,"value":293834},{"type":17,"tag":7266,"props":295042,"children":295043},{},[295044],{"type":23,"value":295045},"Managed or self-hosted; enterprise VPC/on-prem",{"type":17,"tag":7239,"props":295047,"children":295048},{},[295049,295053,295058],{"type":17,"tag":7266,"props":295050,"children":295051},{},[295052],{"type":23,"value":69408},{"type":17,"tag":7266,"props":295054,"children":295055},{},[295056],{"type":23,"value":295057},"No customer records stored",{"type":17,"tag":7266,"props":295059,"children":295060},{},[295061],{"type":23,"value":293856},{"type":17,"tag":7239,"props":295063,"children":295064},{},[295065,295069,295074],{"type":17,"tag":7266,"props":295066,"children":295067},{},[295068],{"type":23,"value":80744},{"type":17,"tag":7266,"props":295070,"children":295071},{},[295072],{"type":23,"value":295073},"Production AI systems at scale",{"type":17,"tag":7266,"props":295075,"children":295076},{},[295077],{"type":23,"value":295078},"Centralized MCP gateway and broad SaaS connectivity",{"type":17,"tag":68,"props":295080,"children":295081},{"id":45643},[295082],{"type":23,"value":45646},{"type":17,"tag":29,"props":295084,"children":295085},{},[295086,295088,295093],{"type":23,"value":295087},"Composio provides a robust, production-grade MCP gateway and managed server infrastructure, optimized for ",{"type":17,"tag":48,"props":295089,"children":295090},{},[295091],{"type":23,"value":295092},"centralized control, security, and broad SaaS connectivity",{"type":23,"value":295094},". It excels when teams want a single control plane to manage many provider-specific tools and event triggers.",{"type":17,"tag":29,"props":295096,"children":295097},{},[295098,295100,295105],{"type":23,"value":295099},"Unified MCP is designed for products that depend on consistent, real-time access to integration data across systems. By combining normalization with passthrough—and running MCP as a fully hosted, stateless service—Unified gives agents ",{"type":17,"tag":48,"props":295101,"children":295102},{},[295103],{"type":23,"value":295104},"maximum flexibility with minimal operational burden",{"type":23,"value":54},{"type":17,"tag":29,"props":295107,"children":295108},{},[295109,295110],{"type":23,"value":217407},{"type":17,"tag":133,"props":295111,"children":295112},{"href":293918},[295113],{"type":17,"tag":48,"props":295114,"children":295115},{},[295116],{"type":23,"value":293924},{"type":17,"tag":29,"props":295118,"children":295119},{},[295120,295121],{"type":23,"value":217407},{"type":17,"tag":133,"props":295122,"children":295123},{"href":293918},[295124],{"type":17,"tag":48,"props":295125,"children":295126},{},[295127],{"type":23,"value":293936},{"type":17,"tag":29,"props":295129,"children":295130},{},[295131,295132],{"type":23,"value":217407},{"type":17,"tag":133,"props":295133,"children":295134},{"href":293918},[295135],{"type":17,"tag":48,"props":295136,"children":295137},{},[295138],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":295140},[295141,295142,295145,295149,295150,295154,295158,295162,295166,295167,295168],{"id":294053,"depth":1629,"text":294056},{"id":294125,"depth":1629,"text":294128,"children":295143},[295144],{"id":294142,"depth":1635,"text":294145},{"id":294184,"depth":1629,"text":294187,"children":295146},[295147,295148],{"id":294190,"depth":1635,"text":294193},{"id":294314,"depth":1635,"text":294317},{"id":293244,"depth":1629,"text":293247},{"id":294455,"depth":1629,"text":294458,"children":295151},[295152,295153],{"id":294461,"depth":1635,"text":294464},{"id":294530,"depth":1635,"text":45418},{"id":294582,"depth":1629,"text":294585,"children":295155},[295156,295157],{"id":294588,"depth":1635,"text":294464},{"id":294638,"depth":1635,"text":45418},{"id":293505,"depth":1629,"text":293508,"children":295159},[295160,295161],{"id":294704,"depth":1635,"text":294707},{"id":294750,"depth":1635,"text":294753},{"id":294796,"depth":1629,"text":294799,"children":295163},[295164,295165],{"id":294802,"depth":1635,"text":294464},{"id":294866,"depth":1635,"text":45418},{"id":294890,"depth":1629,"text":294893},{"id":294901,"depth":1629,"text":294904},{"id":45643,"depth":1629,"text":45646},"content:blog:unified_mcp_vs_composio_mcp_comparison_which_is_better_for_ai_agents.md","blog/unified_mcp_vs_composio_mcp_comparison_which_is_better_for_ai_agents.md","blog/unified_mcp_vs_composio_mcp_comparison_which_is_better_for_ai_agents",{"_path":295173,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":295174,"description":295175,"img":295176,"date":295177,"tag":12,"body":295178,"_type":1677,"_id":296226,"_source":1679,"_file":296227,"_stem":296228,"_extension":1682},"/blog/unified_mcp_vs_merge_agent_handler_which_is_better_for_ai_agents_2026","Unified MCP vs Merge Agent Handler: Which Is Better for AI Agents? (2026)","Merge MCP and Unified MCP represent two different approaches to exposing integrations to AI agents. Merge builds on a sync-first model where data is stored and...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_vs_merge_agent_handler_which_is_better_for_ai_agents_2026-icon.png","2025-08-25T12:49:00.000Z",{"type":14,"children":295179,"toc":296196},[295180,295185,295188,295196,295204,295220,295243,295260,295266,295274,295292,295299,295322,295331,295336,295343,295387,295396,295402,295413,295424,295442,295454,295458,295469,295491,295496,295502,295507,295529,295534,295543,295549,295584,295588,295593,295621,295632,295637,295646,295650,295655,295660,295664,295675,295703,295708,295717,295722,295727,295752,295757,295762,295772,295777,295784,295789,295810,295815,295820,295838,295850,295855,295917,295921,295962,295974,295981,295986,296144,296149,296159,296175,296180,296185,296191],{"type":17,"tag":18,"props":295181,"children":295183},{"id":295182},"unified-mcp-vs-merge-agent-handler-which-is-better-for-ai-agents-2026",[295184],{"type":23,"value":295174},{"type":17,"tag":25,"props":295186,"children":295187},{},[],{"type":17,"tag":29,"props":295189,"children":295190},{},[295191],{"type":17,"tag":33,"props":295192,"children":295193},{},[295194],{"type":23,"value":295195},"August 25, 2025",{"type":17,"tag":29,"props":295197,"children":295198},{},[295199],{"type":17,"tag":6438,"props":295200,"children":295203},{"alt":295201,"src":295202},"MCP.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_vs_merge_agent_handler_which_is_better_for_ai_agents_2026-0.png",[],{"type":17,"tag":29,"props":295205,"children":295206},{},[295207,295209,295213,295214,295218],{"type":23,"value":295208},"Merge ",{"type":17,"tag":133,"props":295210,"children":295211},{"href":326},[295212],{"type":23,"value":329},{"type":23,"value":34435},{"type":17,"tag":133,"props":295215,"children":295216},{"href":326},[295217],{"type":23,"value":45418},{"type":23,"value":295219}," represent two different approaches to exposing integrations to AI agents. Merge builds on a sync-first model where data is stored and updated in the background, while Unified MCP provides real-time, pass-through access to source APIs without storing customer records.",{"type":17,"tag":29,"props":295221,"children":295222},{},[295223,295225,295229,295231,295236,295237,295242],{"type":23,"value":295224},"Unified.to provides a ",{"type":17,"tag":48,"props":295226,"children":295227},{},[295228],{"type":23,"value":292944},{"type":23,"value":295230}," designed for ",{"type":17,"tag":48,"props":295232,"children":295233},{},[295234],{"type":23,"value":295235},"real-time, pass-through access",{"type":23,"value":120761},{"type":17,"tag":48,"props":295238,"children":295239},{},[295240],{"type":23,"value":295241},"no customer record storage",{"type":23,"value":54},{"type":17,"tag":29,"props":295244,"children":295245},{},[295246,295247,295252,295253,295258],{"type":23,"value":249763},{"type":17,"tag":48,"props":295248,"children":295249},{},[295250],{"type":23,"value":295251},"317+ integrations",{"type":23,"value":34435},{"type":17,"tag":48,"props":295254,"children":295255},{},[295256],{"type":23,"value":295257},"20,000+ callable MCP tools",{"type":23,"value":295259}," (published and growing), Unified.to MCP offers broader coverage and a simpler compliance posture—without requiring teams to deploy or operate their own MCP infrastructure.",{"type":17,"tag":68,"props":295261,"children":295263},{"id":295262},"when-to-choose-merge-mcp-vs-unified-mcp",[295264],{"type":23,"value":295265},"When to choose Merge MCP vs Unified MCP",{"type":17,"tag":29,"props":295267,"children":295268},{},[295269],{"type":17,"tag":48,"props":295270,"children":295271},{},[295272],{"type":23,"value":295273},"Choose Merge MCP if:",{"type":17,"tag":80,"props":295275,"children":295276},{},[295277,295282,295287],{"type":17,"tag":84,"props":295278,"children":295279},{},[295280],{"type":23,"value":295281},"You need synced, queryable datasets across integrations",{"type":17,"tag":84,"props":295283,"children":295284},{},[295285],{"type":23,"value":295286},"Your use case depends on historical data or warehouse-style access",{"type":17,"tag":84,"props":295288,"children":295289},{},[295290],{"type":23,"value":295291},"You are comfortable with stored customer records and background sync",{"type":17,"tag":29,"props":295293,"children":295294},{},[295295],{"type":17,"tag":48,"props":295296,"children":295297},{},[295298],{"type":23,"value":293066},{"type":17,"tag":80,"props":295300,"children":295301},{},[295302,295307,295312,295317],{"type":17,"tag":84,"props":295303,"children":295304},{},[295305],{"type":23,"value":295306},"Your product depends on real-time data from source systems",{"type":17,"tag":84,"props":295308,"children":295309},{},[295310],{"type":23,"value":295311},"You want to avoid storing third-party customer records",{"type":17,"tag":84,"props":295313,"children":295314},{},[295315],{"type":23,"value":295316},"You are building agents or features that require fresh, consistent data",{"type":17,"tag":84,"props":295318,"children":295319},{},[295320],{"type":23,"value":295321},"You want a hosted MCP server without managing infrastructure",{"type":17,"tag":68,"props":295323,"children":295325},{"id":295324},"at-a-glance-unifiedto-mcp-vs-merge-mcp",[295326],{"type":17,"tag":48,"props":295327,"children":295328},{},[295329],{"type":23,"value":295330},"At a glance: Unified.to MCP vs Merge MCP",{"type":17,"tag":29,"props":295332,"children":295333},{},[295334],{"type":23,"value":295335},"Merge MCP provides an MCP server that connects its documented 220+ integrations to LLMs. Unified.to MCP is a hosted MCP server with documented real-time behavior, expanded endpoint coverage, and a stateless data model.",{"type":17,"tag":239,"props":295337,"children":295338},{"id":292979},[295339],{"type":17,"tag":48,"props":295340,"children":295341},{},[295342],{"type":23,"value":292982},{"type":17,"tag":80,"props":295344,"children":295345},{},[295346,295354,295363,295368,295377,295382],{"type":17,"tag":84,"props":295347,"children":295348},{},[295349,295350],{"type":23,"value":292990},{"type":17,"tag":48,"props":295351,"children":295352},{},[295353],{"type":23,"value":295251},{"type":17,"tag":84,"props":295355,"children":295356},{},[295357,295358],{"type":23,"value":293000},{"type":17,"tag":6121,"props":295359,"children":295361},{"className":295360},[],[295362],{"type":23,"value":293006},{"type":17,"tag":84,"props":295364,"children":295365},{},[295366],{"type":23,"value":295367},"Real-time, pass-through API calls routed directly to source platforms",{"type":17,"tag":84,"props":295369,"children":295370},{},[295371,295375],{"type":17,"tag":48,"props":295372,"children":295373},{},[295374],{"type":23,"value":293851},{"type":23,"value":295376}," (stateless by design)",{"type":17,"tag":84,"props":295378,"children":295379},{},[295380],{"type":23,"value":295381},"Fully hosted MCP server (no customer-managed infrastructure)",{"type":17,"tag":84,"props":295383,"children":295384},{},[295385],{"type":23,"value":295386},"Published multi-region endpoints (US, EU, AU)",{"type":17,"tag":68,"props":295388,"children":295390},{"id":295389},"real-time-pass-through-vs-sync-first-architecture",[295391],{"type":17,"tag":48,"props":295392,"children":295393},{},[295394],{"type":23,"value":295395},"Real-time pass-through vs sync-first architecture",{"type":17,"tag":239,"props":295397,"children":295399},{"id":295398},"merge-mcp-documented-behavior",[295400],{"type":23,"value":295401},"Merge MCP (documented behavior)",{"type":17,"tag":29,"props":295403,"children":295404},{},[295405,295407,295411],{"type":23,"value":295406},"Merge's core ",{"type":17,"tag":133,"props":295408,"children":295409},{"href":7691},[295410],{"type":23,"value":7459},{"type":23,"value":295412}," is sync-based. Data is retrieved via background polling and webhooks and stored in Merge's infrastructure.",{"type":17,"tag":29,"props":295414,"children":295415},{},[295416,295418,295423],{"type":23,"value":295417},"Merge's public documentation describes MCP as a 'live connection,' but ",{"type":17,"tag":48,"props":295419,"children":295420},{},[295421],{"type":23,"value":295422},"does not explicitly document",{"type":23,"value":20456},{"type":17,"tag":80,"props":295425,"children":295426},{},[295427,295432,295437],{"type":17,"tag":84,"props":295428,"children":295429},{},[295430],{"type":23,"value":295431},"Whether MCP reads always bypass synced data",{"type":17,"tag":84,"props":295433,"children":295434},{},[295435],{"type":23,"value":295436},"Whether background sync can be disabled",{"type":17,"tag":84,"props":295438,"children":295439},{},[295440],{"type":23,"value":295441},"Whether MCP ever serves data from cache",{"type":17,"tag":29,"props":295443,"children":295444},{},[295445,295447,295452],{"type":23,"value":295446},"For data not covered by unified models, Merge provides a ",{"type":17,"tag":48,"props":295448,"children":295449},{},[295450],{"type":23,"value":295451},"separate Passthrough API",{"type":23,"value":295453},", available on higher-tier plans.",{"type":17,"tag":239,"props":295455,"children":295456},{"id":293346},[295457],{"type":23,"value":293349},{"type":17,"tag":29,"props":295459,"children":295460},{},[295461,295463,295468],{"type":23,"value":295462},"Unified.to MCP executes ",{"type":17,"tag":48,"props":295464,"children":295465},{},[295466],{"type":23,"value":295467},"real-time reads and writes routed directly to the source API",{"type":23,"value":54},{"type":17,"tag":80,"props":295470,"children":295471},{},[295472,295476,295481,295486],{"type":17,"tag":84,"props":295473,"children":295474},{},[295475],{"type":23,"value":293177},{"type":17,"tag":84,"props":295477,"children":295478},{},[295479],{"type":23,"value":295480},"Managed virtual webhooks when they do not",{"type":17,"tag":84,"props":295482,"children":295483},{},[295484],{"type":23,"value":295485},"Every MCP tool call fetches data in real time from the source platform",{"type":17,"tag":84,"props":295487,"children":295488},{},[295489],{"type":23,"value":295490},"No polling jobs or cached data layers to manage.",{"type":17,"tag":29,"props":295492,"children":295493},{},[295494],{"type":23,"value":295495},"For AI agents, this removes uncertainty around how current the data is.",{"type":17,"tag":68,"props":295497,"children":295499},{"id":295498},"stateful-vs-stateless-integration-models",[295500],{"type":23,"value":295501},"Stateful vs stateless integration models",{"type":17,"tag":29,"props":295503,"children":295504},{},[295505],{"type":23,"value":295506},"The core difference between Merge and Unified MCP is how state is handled:",{"type":17,"tag":80,"props":295508,"children":295509},{},[295510,295520],{"type":17,"tag":84,"props":295511,"children":295512},{},[295513,295518],{"type":17,"tag":48,"props":295514,"children":295515},{},[295516],{"type":23,"value":295517},"Merge:",{"type":23,"value":295519}," stateful model (data is stored and synchronized over time)",{"type":17,"tag":84,"props":295521,"children":295522},{},[295523,295527],{"type":17,"tag":48,"props":295524,"children":295525},{},[295526],{"type":23,"value":293229},{"type":23,"value":295528}," stateless model (data is fetched directly from the source when requested)",{"type":17,"tag":29,"props":295530,"children":295531},{},[295532],{"type":23,"value":295533},"Stateful systems simplify querying and historical access but introduce storage, synchronization, and consistency challenges. Stateless systems reduce storage and compliance scope while ensuring data is always retrieved from the source of truth.",{"type":17,"tag":68,"props":295535,"children":295537},{"id":295536},"endpoint-coverage-normalized-models-provider-specific-tools",[295538],{"type":17,"tag":48,"props":295539,"children":295540},{},[295541],{"type":23,"value":295542},"Endpoint coverage: normalized models + provider-specific tools",{"type":17,"tag":239,"props":295544,"children":295546},{"id":295545},"merge-mcp",[295547],{"type":23,"value":295548},"Merge MCP",{"type":17,"tag":80,"props":295550,"children":295551},{},[295552,295564,295573],{"type":17,"tag":84,"props":295553,"children":295554},{},[295555,295557,295562],{"type":23,"value":295556},"Normalized models across ",{"type":17,"tag":48,"props":295558,"children":295559},{},[295560],{"type":23,"value":295561},"220+ integrations",{"type":23,"value":295563}," (published)",{"type":17,"tag":84,"props":295565,"children":295566},{},[295567,295569],{"type":23,"value":295568},"Provider-specific endpoints accessed via a ",{"type":17,"tag":48,"props":295570,"children":295571},{},[295572],{"type":23,"value":295451},{"type":17,"tag":84,"props":295574,"children":295575},{},[295576,295578,295582],{"type":23,"value":295577},"Merge does ",{"type":17,"tag":48,"props":295579,"children":295580},{},[295581],{"type":23,"value":293407},{"type":23,"value":295583}," a total MCP tool count",{"type":17,"tag":239,"props":295585,"children":295586},{"id":293449},[295587],{"type":23,"value":293349},{"type":17,"tag":29,"props":295589,"children":295590},{},[295591],{"type":23,"value":295592},"Unified MCP provides both:",{"type":17,"tag":80,"props":295594,"children":295595},{},[295596,295605],{"type":17,"tag":84,"props":295597,"children":295598},{},[295599,295603],{"type":17,"tag":48,"props":295600,"children":295601},{},[295602],{"type":23,"value":293487},{"type":23,"value":295604}," (documented: ~3,900+)",{"type":17,"tag":84,"props":295606,"children":295607},{},[295608,295613,295614,295619],{"type":17,"tag":48,"props":295609,"children":295610},{},[295611],{"type":23,"value":295612},"Provider-specific tools",{"type":23,"value":205963},{"type":17,"tag":6121,"props":295615,"children":295617},{"className":295616},[],[295618],{"type":23,"value":293006},{"type":23,"value":295620}," (documented: ~13,600+)",{"type":17,"tag":29,"props":295622,"children":295623},{},[295624,295626,295631],{"type":23,"value":295625},"This results in ",{"type":17,"tag":48,"props":295627,"children":295628},{},[295629],{"type":23,"value":295630},"20,000+ callable MCP tools across normalized and provider-specific endpoints",{"type":23,"value":54},{"type":17,"tag":29,"props":295633,"children":295634},{},[295635],{"type":23,"value":295636},"No additional passthrough configuration is required.",{"type":17,"tag":68,"props":295638,"children":295640},{"id":295639},"security-model-stored-data-vs-stateless-access",[295641],{"type":17,"tag":48,"props":295642,"children":295643},{},[295644],{"type":23,"value":295645},"Security model: stored data vs stateless access",{"type":17,"tag":239,"props":295647,"children":295648},{"id":250200},[295649],{"type":23,"value":227},{"type":17,"tag":29,"props":295651,"children":295652},{},[295653],{"type":23,"value":295654},"Merge stores customer records as part of its sync architecture. Data is encrypted and SOC 2 compliant, but remains stored until explicitly deleted.",{"type":17,"tag":29,"props":295656,"children":295657},{},[295658],{"type":23,"value":295659},"This simplifies querying but increases compliance scope and data retention considerations.",{"type":17,"tag":239,"props":295661,"children":295662},{"id":293670},[295663],{"type":23,"value":293349},{"type":17,"tag":29,"props":295665,"children":295666},{},[295667,295669,295674],{"type":23,"value":295668},"Unified MCP is ",{"type":17,"tag":48,"props":295670,"children":295671},{},[295672],{"type":23,"value":295673},"stateless for customer records",{"type":23,"value":54},{"type":17,"tag":80,"props":295676,"children":295677},{},[295678,295683,295688,295699],{"type":17,"tag":84,"props":295679,"children":295680},{},[295681],{"type":23,"value":295682},"No third-party record data is stored",{"type":17,"tag":84,"props":295684,"children":295685},{},[295686],{"type":23,"value":295687},"Only connection metadata and credentials are retained",{"type":17,"tag":84,"props":295689,"children":295690},{},[295691,295692,295697],{"type":23,"value":188037},{"type":17,"tag":6121,"props":295693,"children":295695},{"className":295694},[],[295696],{"type":23,"value":131715},{"type":23,"value":295698}," filtering prevents sensitive fields from being returned to LLMs",{"type":17,"tag":84,"props":295700,"children":295701},{},[295702],{"type":23,"value":293616},{"type":17,"tag":29,"props":295704,"children":295705},{},[295706],{"type":23,"value":295707},"Less data at rest means reduced compliance overhead and simpler procurement.",{"type":17,"tag":68,"props":295709,"children":295711},{"id":295710},"deployment-model-hosted-vs-customer-managed",[295712],{"type":17,"tag":48,"props":295713,"children":295714},{},[295715],{"type":23,"value":295716},"Deployment model: hosted vs customer-managed",{"type":17,"tag":239,"props":295718,"children":295720},{"id":295719},"merge-mcp-1",[295721],{"type":23,"value":295548},{"type":17,"tag":29,"props":295723,"children":295724},{},[295725],{"type":23,"value":295726},"Merge offers:",{"type":17,"tag":80,"props":295728,"children":295729},{},[295730,295741],{"type":17,"tag":84,"props":295731,"children":295732},{},[295733,295734,295739],{"type":23,"value":9619},{"type":17,"tag":48,"props":295735,"children":295736},{},[295737],{"type":23,"value":295738},"hosted MCP endpoint",{"type":23,"value":295740},", and",{"type":17,"tag":84,"props":295742,"children":295743},{},[295744,295745,295750],{"type":23,"value":40437},{"type":17,"tag":48,"props":295746,"children":295747},{},[295748],{"type":23,"value":295749},"open-source MCP server",{"type":23,"value":295751}," for teams that want to deploy and operate it themselves",{"type":17,"tag":29,"props":295753,"children":295754},{},[295755],{"type":23,"value":295756},"When using the open-source option, customers are responsible for runtime, scaling, and updates.",{"type":17,"tag":239,"props":295758,"children":295760},{"id":295759},"unifiedto-mcp-3",[295761],{"type":23,"value":293349},{"type":17,"tag":29,"props":295763,"children":295764},{},[295765,295766,295771],{"type":23,"value":295668},{"type":17,"tag":48,"props":295767,"children":295768},{},[295769],{"type":23,"value":295770},"fully hosted only",{"type":23,"value":54},{"type":17,"tag":29,"props":295773,"children":295774},{},[295775],{"type":23,"value":295776},"You point your LLM to a Unified MCP endpoint with an API token—no server deployment, scaling, or maintenance required.",{"type":17,"tag":68,"props":295778,"children":295779},{"id":267526},[295780],{"type":17,"tag":48,"props":295781,"children":295782},{},[295783],{"type":23,"value":267529},{"type":17,"tag":29,"props":295785,"children":295786},{},[295787],{"type":23,"value":295788},"Both platforms offer solid documentation and SDKs.",{"type":17,"tag":80,"props":295790,"children":295791},{},[295792,295801],{"type":17,"tag":84,"props":295793,"children":295794},{},[295795,295799],{"type":17,"tag":48,"props":295796,"children":295797},{},[295798],{"type":23,"value":227},{"type":23,"value":295800},": JavaScript and Python SDKs, open-source MCP server, observability tooling",{"type":17,"tag":84,"props":295802,"children":295803},{},[295804,295808],{"type":17,"tag":48,"props":295805,"children":295806},{},[295807],{"type":23,"value":217},{"type":23,"value":295809},": SDKs in 7 languages, embedded Connect UI, MCP tool definitions formatted for OpenAI, Claude, Gemini, and Cohere",{"type":17,"tag":29,"props":295811,"children":295812},{},[295813],{"type":23,"value":295814},"The difference is operational:",{"type":17,"tag":29,"props":295816,"children":295817},{},[295818],{"type":23,"value":295819},"Unified handles hosting and real-time delivery by default; Merge offers flexibility at the cost of architectural complexity.",{"type":17,"tag":239,"props":295821,"children":295823},{"id":295822},"unifiedto-authentication-and-access-control",[295824,295832,295833],{"type":17,"tag":133,"props":295825,"children":295827},{"href":42620,"rel":295826},[214],[295828],{"type":17,"tag":48,"props":295829,"children":295830},{},[295831],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":48,"props":295834,"children":295835},{},[295836],{"type":23,"value":295837},"authentication and access control",{"type":17,"tag":29,"props":295839,"children":295840},{},[295841,295843,295848],{"type":23,"value":295842},"Unified MCP uses ",{"type":17,"tag":48,"props":295844,"children":295845},{},[295846],{"type":23,"value":295847},"explicit, workspace-scoped authentication",{"type":23,"value":295849},". Public authorization is not supported.",{"type":17,"tag":29,"props":295851,"children":295852},{},[295853],{"type":23,"value":295854},"There are two documented modes:",{"type":17,"tag":80,"props":295856,"children":295857},{},[295858,295893],{"type":17,"tag":84,"props":295859,"children":295860},{},[295861,295866,295869,295871,295874,295876],{"type":17,"tag":48,"props":295862,"children":295863},{},[295864],{"type":23,"value":295865},"Connection-scoped MCP access",{"type":17,"tag":3891,"props":295867,"children":295868},{},[],{"type":23,"value":295870},"Used when an LLM executes tools against a specific end-customer connection.",{"type":17,"tag":3891,"props":295872,"children":295873},{},[],{"type":23,"value":295875},"Requires:",{"type":17,"tag":80,"props":295877,"children":295878},{},[295879,295883],{"type":17,"tag":84,"props":295880,"children":295881},{},[295882],{"type":23,"value":177161},{"type":17,"tag":84,"props":295884,"children":295885},{},[295886,295888,295891],{"type":23,"value":295887},"An explicit connection ID",{"type":17,"tag":3891,"props":295889,"children":295890},{},[],{"type":23,"value":295892},"This mode grants access only to the authorized connection at execution time.",{"type":17,"tag":84,"props":295894,"children":295895},{},[295896,295901,295904,295906,295909,295911,295915],{"type":17,"tag":48,"props":295897,"children":295898},{},[295899],{"type":23,"value":295900},"Workspace-only MCP access",{"type":17,"tag":3891,"props":295902,"children":295903},{},[],{"type":23,"value":295905},"Used for configuration and operational data (connections, webhooks, API calls, issues).",{"type":17,"tag":3891,"props":295907,"children":295908},{},[],{"type":23,"value":295910},"This mode does ",{"type":17,"tag":48,"props":295912,"children":295913},{},[295914],{"type":23,"value":159475},{"type":23,"value":295916}," grant access to end-customer data.",{"type":17,"tag":29,"props":295918,"children":295919},{},[295920],{"type":23,"value":93413},{"type":17,"tag":80,"props":295922,"children":295923},{},[295924,295936,295946,295951],{"type":17,"tag":84,"props":295925,"children":295926},{},[295927,295929,295934],{"type":23,"value":295928},"Tool allowlists via the ",{"type":17,"tag":6121,"props":295930,"children":295932},{"className":295931},[],[295933],{"type":23,"value":131599},{"type":23,"value":295935}," parameter",{"type":17,"tag":84,"props":295937,"children":295938},{},[295939,295941],{"type":23,"value":295940},"Per-call PII filtering via ",{"type":17,"tag":6121,"props":295942,"children":295944},{"className":295943},[],[295945],{"type":23,"value":141531},{"type":17,"tag":84,"props":295947,"children":295948},{},[295949],{"type":23,"value":295950},"Tool-level permission restrictions",{"type":17,"tag":84,"props":295952,"children":295953},{},[295954,295956,295961],{"type":23,"value":295955},"LLM-specific tool schemas and token optimization (",{"type":17,"tag":6121,"props":295957,"children":295959},{"className":295958},[],[295960],{"type":23,"value":131610},{"type":23,"value":12034},{"type":17,"tag":29,"props":295963,"children":295964},{},[295965,295967,295972],{"type":23,"value":295966},"This model ensures that MCP access is ",{"type":17,"tag":48,"props":295968,"children":295969},{},[295970],{"type":23,"value":295971},"authorization-first",{"type":23,"value":295973},", explicit, and auditable.",{"type":17,"tag":68,"props":295975,"children":295976},{"id":45643},[295977],{"type":17,"tag":48,"props":295978,"children":295979},{},[295980],{"type":23,"value":45646},{"type":17,"tag":29,"props":295982,"children":295983},{},[295984],{"type":23,"value":295985},"Unified MCP provides real-time, stateless access to integration data, while Merge MCP builds on a sync-first architecture that stores and maintains customer records.",{"type":17,"tag":7231,"props":295987,"children":295988},{},[295989,296013],{"type":17,"tag":7235,"props":295990,"children":295991},{},[295992],{"type":17,"tag":7239,"props":295993,"children":295994},{},[295995,295999,296006],{"type":17,"tag":7243,"props":295996,"children":295997},{},[295998],{"type":23,"value":87518},{"type":17,"tag":7243,"props":296000,"children":296001},{},[296002],{"type":17,"tag":48,"props":296003,"children":296004},{},[296005],{"type":23,"value":293349},{"type":17,"tag":7243,"props":296007,"children":296008},{},[296009],{"type":17,"tag":48,"props":296010,"children":296011},{},[296012],{"type":23,"value":295548},{"type":17,"tag":7259,"props":296014,"children":296015},{},[296016,296034,296052,296069,296087,296110,296127],{"type":17,"tag":7239,"props":296017,"children":296018},{},[296019,296024,296029],{"type":17,"tag":7266,"props":296020,"children":296021},{},[296022],{"type":23,"value":296023},"Data access model",{"type":17,"tag":7266,"props":296025,"children":296026},{},[296027],{"type":23,"value":296028},"Real-time, pass-through",{"type":17,"tag":7266,"props":296030,"children":296031},{},[296032],{"type":23,"value":296033},"Sync-first (MCP read behavior not fully documented)",{"type":17,"tag":7239,"props":296035,"children":296036},{},[296037,296042,296047],{"type":17,"tag":7266,"props":296038,"children":296039},{},[296040],{"type":23,"value":296041},"Customer data storage",{"type":17,"tag":7266,"props":296043,"children":296044},{},[296045],{"type":23,"value":296046},"None (stateless)",{"type":17,"tag":7266,"props":296048,"children":296049},{},[296050],{"type":23,"value":296051},"Stored as part of sync model",{"type":17,"tag":7239,"props":296053,"children":296054},{},[296055,296060,296065],{"type":17,"tag":7266,"props":296056,"children":296057},{},[296058],{"type":23,"value":296059},"Integration count",{"type":17,"tag":7266,"props":296061,"children":296062},{},[296063],{"type":23,"value":296064},"380+",{"type":17,"tag":7266,"props":296066,"children":296067},{},[296068],{"type":23,"value":226727},{"type":17,"tag":7239,"props":296070,"children":296071},{},[296072,296077,296082],{"type":17,"tag":7266,"props":296073,"children":296074},{},[296075],{"type":23,"value":296076},"MCP tool count",{"type":17,"tag":7266,"props":296078,"children":296079},{},[296080],{"type":23,"value":296081},"20,000+",{"type":17,"tag":7266,"props":296083,"children":296084},{},[296085],{"type":23,"value":296086},"Not published",{"type":17,"tag":7239,"props":296088,"children":296089},{},[296090,296095,296105],{"type":17,"tag":7266,"props":296091,"children":296092},{},[296093],{"type":23,"value":296094},"Provider-specific endpoints",{"type":17,"tag":7266,"props":296096,"children":296097},{},[296098,296100],{"type":23,"value":296099},"Built-in via ",{"type":17,"tag":6121,"props":296101,"children":296103},{"className":296102},[],[296104],{"type":23,"value":293006},{"type":17,"tag":7266,"props":296106,"children":296107},{},[296108],{"type":23,"value":296109},"Separate Passthrough API",{"type":17,"tag":7239,"props":296111,"children":296112},{},[296113,296118,296122],{"type":17,"tag":7266,"props":296114,"children":296115},{},[296116],{"type":23,"value":296117},"MCP deployment",{"type":17,"tag":7266,"props":296119,"children":296120},{},[296121],{"type":23,"value":293834},{"type":17,"tag":7266,"props":296123,"children":296124},{},[296125],{"type":23,"value":296126},"Hosted or self-hosted",{"type":17,"tag":7239,"props":296128,"children":296129},{},[296130,296134,296139],{"type":17,"tag":7266,"props":296131,"children":296132},{},[296133],{"type":23,"value":80744},{"type":17,"tag":7266,"props":296135,"children":296136},{},[296137],{"type":23,"value":296138},"AI-native SaaS, real-time agents",{"type":17,"tag":7266,"props":296140,"children":296141},{},[296142],{"type":23,"value":296143},"Sync-oriented or data-warehouse use cases",{"type":17,"tag":29,"props":296145,"children":296146},{},[296147],{"type":23,"value":296148},"If your product depends on real-time data access across integrations, Unified MCP provides a simpler model with fewer architectural and compliance tradeoffs.",{"type":17,"tag":29,"props":296150,"children":296151},{},[296152,296153],{"type":23,"value":217407},{"type":17,"tag":133,"props":296154,"children":296156},{"href":43558,"rel":296155},[214],[296157],{"type":23,"value":296158},"Read the Unified.to MCP documentation",{"type":17,"tag":29,"props":296160,"children":296161},{},[296162,296163,296169,296170],{"type":23,"value":217407},{"type":17,"tag":133,"props":296164,"children":296166},{"href":1612,"rel":296165},[214],[296167],{"type":23,"value":296168},"Start a free 30-day trial",{"type":23,"value":75890},{"type":17,"tag":133,"props":296171,"children":296173},{"href":1623,"rel":296172},[214],[296174],{"type":23,"value":226481},{"type":17,"tag":29,"props":296176,"children":296177},{},[296178],{"type":23,"value":296179},"What is the difference between sync-based APIs and real-time APIs?",{"type":17,"tag":29,"props":296181,"children":296182},{},[296183],{"type":23,"value":296184},"Sync-based APIs retrieve and store data using background jobs, creating a cached copy that may lag behind the source system. Real-time APIs fetch data directly from the source at request time, ensuring freshness and reducing the need for synchronization logic. The tradeoff is between convenience of stored data and accuracy of live data.",{"type":17,"tag":239,"props":296186,"children":296188},{"id":296187},"do-mcp-servers-store-customer-data",[296189],{"type":23,"value":296190},"Do MCP servers store customer data?",{"type":17,"tag":29,"props":296192,"children":296193},{},[296194],{"type":23,"value":296195},"Some MCP servers store customer data as part of synchronization or caching layers, while others operate as pass-through systems that do not retain records. Storing data can simplify querying and history, but increases compliance scope and risk. Stateless MCP servers avoid storing records, reducing data exposure and operational overhead.",{"title":7,"searchDepth":1629,"depth":1629,"links":296197},[296198,296199,296202,296206,296207,296211,296215,296219,296223],{"id":295262,"depth":1629,"text":295265},{"id":295324,"depth":1629,"text":295330,"children":296200},[296201],{"id":292979,"depth":1635,"text":292982},{"id":295389,"depth":1629,"text":295395,"children":296203},[296204,296205],{"id":295398,"depth":1635,"text":295401},{"id":293346,"depth":1635,"text":293349},{"id":295498,"depth":1629,"text":295501},{"id":295536,"depth":1629,"text":295542,"children":296208},[296209,296210],{"id":295545,"depth":1635,"text":295548},{"id":293449,"depth":1635,"text":293349},{"id":295639,"depth":1629,"text":295645,"children":296212},[296213,296214],{"id":250200,"depth":1635,"text":227},{"id":293670,"depth":1635,"text":293349},{"id":295710,"depth":1629,"text":295716,"children":296216},[296217,296218],{"id":295719,"depth":1635,"text":295548},{"id":295759,"depth":1635,"text":293349},{"id":267526,"depth":1629,"text":267529,"children":296220},[296221],{"id":295822,"depth":1635,"text":296222},"Unified.to authentication and access control",{"id":45643,"depth":1629,"text":45646,"children":296224},[296225],{"id":296187,"depth":1635,"text":296190},"content:blog:unified_mcp_vs_merge_agent_handler_which_is_better_for_ai_agents_2026.md","blog/unified_mcp_vs_merge_agent_handler_which_is_better_for_ai_agents_2026.md","blog/unified_mcp_vs_merge_agent_handler_which_is_better_for_ai_agents_2026",{"_path":296230,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":296231,"description":296232,"img":296233,"date":296234,"tag":12,"body":296235,"_type":1677,"_id":296944,"_source":1679,"_file":296945,"_stem":296946,"_extension":1682},"/blog/unified_mcp_vs_paragon_mcp_server_actionkit","Unified MCP vs Paragon MCP Server (ActionKit)","Paragon ActionKit and Unified MCP serve different roles in the AI integration stack. Paragon focuses on executing predefined actions through per-provider...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_vs_paragon_mcp_server_actionkit-icon.png","2025-08-25T12:07:00.000Z",{"type":14,"children":296236,"toc":296928},[296237,296242,296245,296252,296260,296271,296289,296307,296312,296318,296329,296335,296372,296378,296386,296404,296411,296434,296440,296445,296451,296456,296461,296466,296489,296494,296500,296505,296527,296532,296537,296543,296548,296553,296573,296578,296584,296589,296594,296619,296624,296628,296633,296638,296660,296666,296689,296695,296700,296706,296711,296868,296872,296877,296889,296894,296906,296917],{"type":17,"tag":18,"props":296238,"children":296240},{"id":296239},"unified-mcp-vs-paragon-mcp-server-actionkit",[296241],{"type":23,"value":296231},{"type":17,"tag":25,"props":296243,"children":296244},{},[],{"type":17,"tag":29,"props":296246,"children":296247},{},[296248],{"type":17,"tag":33,"props":296249,"children":296250},{},[296251],{"type":23,"value":295195},{"type":17,"tag":29,"props":296253,"children":296254},{},[296255],{"type":17,"tag":6438,"props":296256,"children":296259},{"alt":296257,"src":296258},"MCP_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_vs_paragon_mcp_server_actionkit-0.png",[],{"type":17,"tag":29,"props":296261,"children":296262},{},[296263,296265,296269],{"type":23,"value":296264},"Paragon ActionKit and [Unified ",{"type":17,"tag":133,"props":296266,"children":296267},{"href":326},[296268],{"type":23,"value":329},{"type":23,"value":296270},"](/mcp) serve different roles in the AI integration stack. Paragon focuses on executing predefined actions through per-provider schemas, while Unified MCP provides real-time access to normalized data and expanded endpoint coverage across integrations.",{"type":17,"tag":29,"props":296272,"children":296273},{},[296274,296276,296281,296283,296287],{"type":23,"value":296275},"ActionKit is designed for ",{"type":17,"tag":48,"props":296277,"children":296278},{},[296279],{"type":23,"value":296280},"synchronous action execution",{"type":23,"value":296282},". It does ",{"type":17,"tag":48,"props":296284,"children":296285},{},[296286],{"type":23,"value":159475},{"type":23,"value":296288}," publish a normalized cross-provider data model, and it does not publish a comprehensive, versioned tool-count or endpoint registry the way Unified does. If your product needs category-level normalized objects, broad endpoint access, and real-time data delivery patterns across hundreds of integrations, ActionKit becomes harder to scale without additional per-provider logic.",{"type":17,"tag":29,"props":296290,"children":296291},{},[296292,296294,296299,296300,296305],{"type":23,"value":296293},"Unified MCP is a hosted MCP server with published tool counts and region endpoints. With ",{"type":17,"tag":48,"props":296295,"children":296296},{},[296297],{"type":23,"value":296298},"415+ integrations",{"type":23,"value":34435},{"type":17,"tag":48,"props":296301,"children":296302},{},[296303],{"type":23,"value":296304},"22,566+ callable tools (and growing)",{"type":23,"value":296306},", Unified MCP provides broader coverage than Paragon ActionKit and a simpler operational model for AI agent use cases.",{"type":17,"tag":29,"props":296308,"children":296309},{},[296310],{"type":23,"value":296311},"Built for AI-first teams, Unified MCP is built on authorization-first, pass-through integrations with attached OpenAPI specs — combining real-time reads/writes, category-level normalized schemas, and a stateless record model into one hosted server.",{"type":17,"tag":68,"props":296313,"children":296315},{"id":296314},"at-a-glance-unified-mcp-vs-paragon-actionkit-mcp-server",[296316],{"type":23,"value":296317},"At a glance: Unified MCP vs Paragon ActionKit / MCP server",{"type":17,"tag":29,"props":296319,"children":296320},{},[296321,296323,296328],{"type":23,"value":296322},"Paragon provides a synchronous actions API (ActionKit) and an open-source MCP server you can self-host to connect ActionKit actions to MCP clients. Unified MCP is a fully hosted MCP server that makes integrations callable by agents with category-level normalized objects and expanded provider endpoint coverage via ",{"type":17,"tag":6121,"props":296324,"children":296326},{"className":296325},[],[296327],{"type":23,"value":293006},{"type":23,"value":54},{"type":17,"tag":239,"props":296330,"children":296332},{"id":296331},"unified-mcp-offers",[296333],{"type":23,"value":296334},"Unified MCP offers",{"type":17,"tag":80,"props":296336,"children":296337},{},[296338,296343,296353,296358,296363,296368],{"type":17,"tag":84,"props":296339,"children":296340},{},[296341],{"type":23,"value":296342},"Category-level normalized objects across 415+ integrations",{"type":17,"tag":84,"props":296344,"children":296345},{},[296346,296348],{"type":23,"value":296347},"Expanded provider endpoint coverage with ",{"type":17,"tag":6121,"props":296349,"children":296351},{"className":296350},[],[296352],{"type":23,"value":293006},{"type":17,"tag":84,"props":296354,"children":296355},{},[296356],{"type":23,"value":296357},"Real-time reads/writes routed directly to source APIs",{"type":17,"tag":84,"props":296359,"children":296360},{},[296361],{"type":23,"value":296362},"Stateless record access (no customer records stored)",{"type":17,"tag":84,"props":296364,"children":296365},{},[296366],{"type":23,"value":296367},"Hosted MCP server (no customer-managed MCP infrastructure)",{"type":17,"tag":84,"props":296369,"children":296370},{},[296371],{"type":23,"value":293026},{"type":17,"tag":68,"props":296373,"children":296375},{"id":296374},"when-to-choose-paragon-actionkit-vs-unified-mcp",[296376],{"type":23,"value":296377},"When to choose Paragon ActionKit vs Unified MCP",{"type":17,"tag":29,"props":296379,"children":296380},{},[296381],{"type":17,"tag":48,"props":296382,"children":296383},{},[296384],{"type":23,"value":296385},"Choose Paragon ActionKit if:",{"type":17,"tag":80,"props":296387,"children":296388},{},[296389,296394,296399],{"type":17,"tag":84,"props":296390,"children":296391},{},[296392],{"type":23,"value":296393},"You need predefined actions for AI agents",{"type":17,"tag":84,"props":296395,"children":296396},{},[296397],{"type":23,"value":296398},"Your workflows are task-based (send email, create record, trigger workflow)",{"type":17,"tag":84,"props":296400,"children":296401},{},[296402],{"type":23,"value":296403},"You are comfortable working with provider-specific schemas",{"type":17,"tag":29,"props":296405,"children":296406},{},[296407],{"type":17,"tag":48,"props":296408,"children":296409},{},[296410],{"type":23,"value":293066},{"type":17,"tag":80,"props":296412,"children":296413},{},[296414,296419,296424,296429],{"type":17,"tag":84,"props":296415,"children":296416},{},[296417],{"type":23,"value":296418},"Your product depends on structured data across systems",{"type":17,"tag":84,"props":296420,"children":296421},{},[296422],{"type":23,"value":296423},"You need consistent objects across CRMs, HR, ATS, and more",{"type":17,"tag":84,"props":296425,"children":296426},{},[296427],{"type":23,"value":296428},"You want real-time reads and writes without building sync layers",{"type":17,"tag":84,"props":296430,"children":296431},{},[296432],{"type":23,"value":296433},"You need broad endpoint coverage across many integrations",{"type":17,"tag":68,"props":296435,"children":296437},{"id":296436},"what-is-the-difference-between-mcp-servers-for-ai-agents",[296438],{"type":23,"value":296439},"What is the difference between MCP servers for AI agents?",{"type":17,"tag":29,"props":296441,"children":296442},{},[296443],{"type":23,"value":296444},"MCP servers expose external tools and APIs to AI agents, but they differ in how data and actions are modeled. Some MCP servers focus on executing predefined actions with provider-specific schemas, while others provide normalized data access and broader endpoint coverage across integrations. The difference determines whether you are building task execution workflows or systems that rely on consistent, cross-platform data.",{"type":17,"tag":68,"props":296446,"children":296448},{"id":296447},"real-time-execution-vs-background-automation",[296449],{"type":23,"value":296450},"Real-time execution vs background automation",{"type":17,"tag":29,"props":296452,"children":296453},{},[296454],{"type":23,"value":296455},"ActionKit is documented as a synchronous endpoint for executing actions. That fits agent tool calling where you want immediate results.",{"type":17,"tag":29,"props":296457,"children":296458},{},[296459],{"type":23,"value":296460},"Complexity increases when handling ongoing updates across systems (data changes over time). Paragon supports these patterns across its broader platform, but ActionKit itself is not positioned as an event delivery layer for real-time updates across providers.",{"type":17,"tag":29,"props":296462,"children":296463},{},[296464],{"type":23,"value":296465},"Unified is designed around real-time reads/writes and event delivery patterns across platforms:",{"type":17,"tag":80,"props":296467,"children":296468},{},[296469,296479,296484],{"type":17,"tag":84,"props":296470,"children":296471},{},[296472,296473,296477],{"type":23,"value":119374},{"type":17,"tag":133,"props":296474,"children":296475},{"href":4999},[296476],{"type":23,"value":5002},{"type":23,"value":296478}," when providers support them",{"type":17,"tag":84,"props":296480,"children":296481},{},[296482],{"type":23,"value":296483},"Virtual webhooks when they do not",{"type":17,"tag":84,"props":296485,"children":296486},{},[296487],{"type":23,"value":296488},"Each tool call routes directly to the source API (no cached reads)",{"type":17,"tag":29,"props":296490,"children":296491},{},[296492],{"type":23,"value":296493},"For agents, this reduces uncertainty around data freshness and avoids building background jobs for 'keep data up to date' behavior.",{"type":17,"tag":68,"props":296495,"children":296497},{"id":296496},"execution-model-vs-data-access-model",[296498],{"type":23,"value":296499},"Execution model vs data access model",{"type":17,"tag":29,"props":296501,"children":296502},{},[296503],{"type":23,"value":296504},"The core difference is how each platform models integrations:",{"type":17,"tag":80,"props":296506,"children":296507},{},[296508,296518],{"type":17,"tag":84,"props":296509,"children":296510},{},[296511,296516],{"type":17,"tag":48,"props":296512,"children":296513},{},[296514],{"type":23,"value":296515},"Paragon ActionKit:",{"type":23,"value":296517}," executes predefined actions (task execution layer)",{"type":17,"tag":84,"props":296519,"children":296520},{},[296521,296525],{"type":17,"tag":48,"props":296522,"children":296523},{},[296524],{"type":23,"value":293229},{"type":23,"value":296526}," exposes structured data and endpoints (data access layer)",{"type":17,"tag":29,"props":296528,"children":296529},{},[296530],{"type":23,"value":296531},"Execution layers are optimized for triggering tasks. Data access layers are designed for retrieving, syncing, and operating on structured records across systems.",{"type":17,"tag":29,"props":296533,"children":296534},{},[296535],{"type":23,"value":296536},"This distinction becomes critical when agents need context, not just actions.",{"type":17,"tag":68,"props":296538,"children":296540},{"id":296539},"normalized-objects-vs-per-provider-action-schemas",[296541],{"type":23,"value":296542},"Normalized objects vs per-provider action schemas",{"type":17,"tag":29,"props":296544,"children":296545},{},[296546],{"type":23,"value":296547},"ActionKit returns per-provider action schemas. For example, Salesforce actions map to Salesforce concepts; HubSpot actions map to HubSpot concepts. Paragon documents cross-app schema conveniences like a universal filter schema, but it does not publish a normalized object model where 'Contact' is a consistent object across CRMs.",{"type":17,"tag":29,"props":296549,"children":296550},{},[296551],{"type":23,"value":296552},"Unified provides category-level normalized objects where supported, and provider-specific fields when needed.",{"type":17,"tag":80,"props":296554,"children":296555},{},[296556,296561],{"type":17,"tag":84,"props":296557,"children":296558},{},[296559],{"type":23,"value":296560},"Category-level models standardize objects, fields, enums, and associations",{"type":17,"tag":84,"props":296562,"children":296563},{},[296564,296566,296571],{"type":23,"value":296565},"When you need provider-specific fields or endpoints, ",{"type":17,"tag":6121,"props":296567,"children":296569},{"className":296568},[],[296570],{"type":23,"value":293006},{"type":23,"value":296572}," expands tool coverage without custom passthrough setup",{"type":17,"tag":29,"props":296574,"children":296575},{},[296576],{"type":23,"value":296577},"If your product spans multiple CRMs, ATS, or HR systems, normalization reduces per-provider code paths and long-term maintenance.",{"type":17,"tag":68,"props":296579,"children":296581},{"id":296580},"endpoint-coverage-tool-counts-vs-action-catalogs",[296582],{"type":23,"value":296583},"Endpoint coverage: tool counts vs action catalogs",{"type":17,"tag":29,"props":296585,"children":296586},{},[296587],{"type":23,"value":296588},"Paragon markets '1000+' actions and '130+' connectors, and ActionKit documentation publishes a supported integrations list. Paragon does not publish a single, versioned snapshot of total tools/endpoints available to agents.",{"type":17,"tag":29,"props":296590,"children":296591},{},[296592],{"type":23,"value":296593},"Unified publishes tool counts and expands endpoint coverage beyond the normalized layer:",{"type":17,"tag":80,"props":296595,"children":296596},{},[296597,296601,296611],{"type":17,"tag":84,"props":296598,"children":296599},{},[296600],{"type":23,"value":294669},{"type":17,"tag":84,"props":296602,"children":296603},{},[296604,296606],{"type":23,"value":296605},"Tens of thousands of provider endpoint tools via ",{"type":17,"tag":6121,"props":296607,"children":296609},{"className":296608},[],[296610],{"type":23,"value":293006},{"type":17,"tag":84,"props":296612,"children":296613},{},[296614],{"type":17,"tag":48,"props":296615,"children":296616},{},[296617],{"type":23,"value":296618},"22,566+ total callable tools",{"type":17,"tag":29,"props":296620,"children":296621},{},[296622],{"type":23,"value":296623},"This matters when agents require both integration breadth and endpoint depth.",{"type":17,"tag":68,"props":296625,"children":296626},{"id":293505},[296627],{"type":23,"value":293508},{"type":17,"tag":29,"props":296629,"children":296630},{},[296631],{"type":23,"value":296632},"Paragon stores integration credentials and maintains logs and execution history as part of running its platform. It also offers hosted US/EU environments and managed/unmanaged on-prem deployments for data residency and isolation requirements.",{"type":17,"tag":29,"props":296634,"children":296635},{},[296636],{"type":23,"value":296637},"Unified MCP is stateless for customer records:",{"type":17,"tag":80,"props":296639,"children":296640},{},[296641,296645,296650],{"type":17,"tag":84,"props":296642,"children":296643},{},[296644],{"type":23,"value":294764},{"type":17,"tag":84,"props":296646,"children":296647},{},[296648],{"type":23,"value":296649},"Only connection metadata and tokens are retained",{"type":17,"tag":84,"props":296651,"children":296652},{},[296653,296658],{"type":17,"tag":6121,"props":296654,"children":296656},{"className":296655},[],[296657],{"type":23,"value":131715},{"type":23,"value":296659}," can remove sensitive fields from tool responses before returning results to the LLM",{"type":17,"tag":68,"props":296661,"children":296663},{"id":296662},"deployment-model",[296664],{"type":23,"value":296665},"Deployment model",{"type":17,"tag":80,"props":296667,"children":296668},{},[296669,296679],{"type":17,"tag":84,"props":296670,"children":296671},{},[296672,296677],{"type":17,"tag":48,"props":296673,"children":296674},{},[296675],{"type":23,"value":296676},"Paragon:",{"type":23,"value":296678}," ActionKit is hosted; the MCP server is available as an open-source, self-hosted component if you want MCP connectivity.",{"type":17,"tag":84,"props":296680,"children":296681},{},[296682,296687],{"type":17,"tag":48,"props":296683,"children":296684},{},[296685],{"type":23,"value":296686},"Unified:",{"type":23,"value":296688}," MCP is fully hosted — no customer deployment required.",{"type":17,"tag":68,"props":296690,"children":296692},{"id":296691},"what-is-the-difference-between-action-based-apis-and-normalized-apis",[296693],{"type":23,"value":296694},"What is the difference between action-based APIs and normalized APIs?",{"type":17,"tag":29,"props":296696,"children":296697},{},[296698],{"type":23,"value":296699},"Action-based APIs expose predefined operations for each integration, often with provider-specific inputs and outputs. Normalized APIs provide consistent data models across systems, allowing developers to work with the same objects regardless of provider. Action-based models optimize for execution, while normalized APIs optimize for consistency and scalability.",{"type":17,"tag":68,"props":296701,"children":296703},{"id":296702},"tldr-unified-mcp-vs-paragon-actionkit",[296704],{"type":23,"value":296705},"TL;DR — Unified MCP vs Paragon ActionKit",{"type":17,"tag":29,"props":296707,"children":296708},{},[296709],{"type":23,"value":296710},"Unified MCP provides structured data access across integrations, while Paragon ActionKit focuses on executing predefined actions.",{"type":17,"tag":7231,"props":296712,"children":296713},{},[296714,296733],{"type":17,"tag":7235,"props":296715,"children":296716},{},[296717],{"type":17,"tag":7239,"props":296718,"children":296719},{},[296720,296724,296728],{"type":17,"tag":7243,"props":296721,"children":296722},{},[296723],{"type":23,"value":87518},{"type":17,"tag":7243,"props":296725,"children":296726},{},[296727],{"type":23,"value":45418},{"type":17,"tag":7243,"props":296729,"children":296730},{},[296731],{"type":23,"value":296732},"Paragon ActionKit",{"type":17,"tag":7259,"props":296734,"children":296735},{},[296736,296752,296779,296796,296812,296834,296851],{"type":17,"tag":7239,"props":296737,"children":296738},{},[296739,296743,296747],{"type":17,"tag":7266,"props":296740,"children":296741},{},[296742],{"type":23,"value":293774},{"type":17,"tag":7266,"props":296744,"children":296745},{},[296746],{"type":23,"value":296342},{"type":17,"tag":7266,"props":296748,"children":296749},{},[296750],{"type":23,"value":296751},"Per-provider action schemas; no published normalized object model",{"type":17,"tag":7239,"props":296753,"children":296754},{},[296755,296760,296774],{"type":17,"tag":7266,"props":296756,"children":296757},{},[296758],{"type":23,"value":296759},"Endpoint coverage",{"type":17,"tag":7266,"props":296761,"children":296762},{},[296763,296768,296770],{"type":17,"tag":6121,"props":296764,"children":296766},{"className":296765},[],[296767],{"type":23,"value":293006},{"type":23,"value":296769}," expands provider endpoint access; ",{"type":17,"tag":48,"props":296771,"children":296772},{},[296773],{"type":23,"value":293800},{"type":17,"tag":7266,"props":296775,"children":296776},{},[296777],{"type":23,"value":296778},"'1000+ actions' marketed; no published global tool snapshot",{"type":17,"tag":7239,"props":296780,"children":296781},{},[296782,296786,296791],{"type":17,"tag":7266,"props":296783,"children":296784},{},[296785],{"type":23,"value":9965},{"type":17,"tag":7266,"props":296787,"children":296788},{},[296789],{"type":23,"value":296790},"Reads/writes routed directly to source APIs; native + virtual webhooks",{"type":17,"tag":7266,"props":296792,"children":296793},{},[296794],{"type":23,"value":296795},"Synchronous action execution; ongoing update patterns depend on broader Paragon platform",{"type":17,"tag":7239,"props":296797,"children":296798},{},[296799,296803,296807],{"type":17,"tag":7266,"props":296800,"children":296801},{},[296802],{"type":23,"value":1067},{"type":17,"tag":7266,"props":296804,"children":296805},{},[296806],{"type":23,"value":293834},{"type":17,"tag":7266,"props":296808,"children":296809},{},[296810],{"type":23,"value":296811},"Open-source, self-hosted MCP server available",{"type":17,"tag":7239,"props":296813,"children":296814},{},[296815,296819,296829],{"type":17,"tag":7266,"props":296816,"children":296817},{},[296818],{"type":23,"value":7324},{"type":17,"tag":7266,"props":296820,"children":296821},{},[296822,296824],{"type":23,"value":296823},"Stateless record access; optional ",{"type":17,"tag":6121,"props":296825,"children":296827},{"className":296826},[],[296828],{"type":23,"value":131715},{"type":17,"tag":7266,"props":296830,"children":296831},{},[296832],{"type":23,"value":296833},"Stores credentials; logs and platform state retained",{"type":17,"tag":7239,"props":296835,"children":296836},{},[296837,296841,296846],{"type":17,"tag":7266,"props":296838,"children":296839},{},[296840],{"type":23,"value":246098},{"type":17,"tag":7266,"props":296842,"children":296843},{},[296844],{"type":23,"value":296845},"US, EU, AU endpoints",{"type":17,"tag":7266,"props":296847,"children":296848},{},[296849],{"type":23,"value":296850},"Hosted US/EU; managed/unmanaged on-prem options",{"type":17,"tag":7239,"props":296852,"children":296853},{},[296854,296858,296863],{"type":17,"tag":7266,"props":296855,"children":296856},{},[296857],{"type":23,"value":502},{"type":17,"tag":7266,"props":296859,"children":296860},{},[296861],{"type":23,"value":296862},"AI-native SaaS, real-time agent features, productized integrations at scale",{"type":17,"tag":7266,"props":296864,"children":296865},{},[296866],{"type":23,"value":296867},"Action catalogs and synchronous agent actions inside a broader integration platform",{"type":17,"tag":68,"props":296869,"children":296870},{"id":7672},[296871],{"type":23,"value":7675},{"type":17,"tag":29,"props":296873,"children":296874},{},[296875],{"type":23,"value":296876},"Paragon ActionKit gives teams a way to execute predefined SaaS actions and connect them to LLMs, including via a self-hosted MCP server. That works well when your use case is limited to a known set of actions and per-provider schemas.",{"type":17,"tag":29,"props":296878,"children":296879},{},[296880,296882,296887],{"type":23,"value":296881},"Unified MCP is designed for products that depend on consistent, real-time data across integrations. It's designed for teams building ",{"type":17,"tag":48,"props":296883,"children":296884},{},[296885],{"type":23,"value":296886},"AI-native features that depend on real-time reads and writes, category-level normalized objects, and broad endpoint access across hundreds of integrations",{"type":23,"value":296888},"—without running MCP infrastructure or storing customer records. With published tool counts, multi-region endpoints, and a fully hosted MCP server, Unified reduces ambiguity as your agent surface area grows.",{"type":17,"tag":29,"props":296890,"children":296891},{},[296892],{"type":23,"value":296893},"If your roadmap includes copilots, agents, or real-time product features that span many platforms, the architectural differences matter early—and compound over time.",{"type":17,"tag":29,"props":296895,"children":296896},{},[296897,296898],{"type":23,"value":217407},{"type":17,"tag":133,"props":296899,"children":296901},{"href":296900},"/25a6207b8384806b83bdf1d425601162",[296902],{"type":17,"tag":48,"props":296903,"children":296904},{},[296905],{"type":23,"value":293924},{"type":17,"tag":29,"props":296907,"children":296908},{},[296909,296910],{"type":23,"value":217407},{"type":17,"tag":133,"props":296911,"children":296912},{"href":296900},[296913],{"type":17,"tag":48,"props":296914,"children":296915},{},[296916],{"type":23,"value":293936},{"type":17,"tag":29,"props":296918,"children":296919},{},[296920,296921],{"type":23,"value":217407},{"type":17,"tag":133,"props":296922,"children":296923},{"href":296900},[296924],{"type":17,"tag":48,"props":296925,"children":296926},{},[296927],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":296929},[296930,296933,296934,296935,296936,296937,296938,296939,296940,296941,296942,296943],{"id":296314,"depth":1629,"text":296317,"children":296931},[296932],{"id":296331,"depth":1635,"text":296334},{"id":296374,"depth":1629,"text":296377},{"id":296436,"depth":1629,"text":296439},{"id":296447,"depth":1629,"text":296450},{"id":296496,"depth":1629,"text":296499},{"id":296539,"depth":1629,"text":296542},{"id":296580,"depth":1629,"text":296583},{"id":293505,"depth":1629,"text":293508},{"id":296662,"depth":1629,"text":296665},{"id":296691,"depth":1629,"text":296694},{"id":296702,"depth":1629,"text":296705},{"id":7672,"depth":1629,"text":7675},"content:blog:unified_mcp_vs_paragon_mcp_server_actionkit.md","blog/unified_mcp_vs_paragon_mcp_server_actionkit.md","blog/unified_mcp_vs_paragon_mcp_server_actionkit",{"_path":296948,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":296949,"description":296950,"img":296951,"date":296952,"tag":6341,"body":296953,"_type":1677,"_id":297513,"_source":1679,"_file":297514,"_stem":297515,"_extension":1682},"/blog/how_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server","How to Connect LLMs to Real-Time SaaS Data with Unified.to MCP Server","Unified's MCP server allows your application to give an LLM API real-time access to your customers' SaaS data and perform actions on that data — without you...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server-icon.png","2025-08-25T00:00:00.000Z",{"type":14,"children":296954,"toc":297499},[296955,296960,296963,296970,296981,297001,297007,297012,297037,297041,297060,297068,297087,297094,297103,297109,297126,297135,297141,297154,297163,297167,297171,297175,297179,297188,297196,297204,297208,297215,297282,297286,297293,297352,297358,297365,297400,297404,297411,297419,297426,297484,297491],{"type":17,"tag":18,"props":296956,"children":296958},{"id":296957},"how-to-connect-llms-to-real-time-saas-data-with-unifiedto-mcp-server",[296959],{"type":23,"value":296949},{"type":17,"tag":25,"props":296961,"children":296962},{},[],{"type":17,"tag":29,"props":296964,"children":296965},{},[296966],{"type":17,"tag":33,"props":296967,"children":296968},{},[296969],{"type":23,"value":295195},{"type":17,"tag":29,"props":296971,"children":296972},{},[296973,296979],{"type":17,"tag":133,"props":296974,"children":296976},{"href":43558,"rel":296975},[214],[296977],{"type":23,"value":296978},"Unified's MCP",{"type":23,"value":296980}," server allows your application to give an LLM API real-time access to your customers' SaaS data and perform actions on that data — without you having to write custom business-logic code for every integration, which can often make things messy.",{"type":17,"tag":29,"props":296982,"children":296983},{},[296984,296986,296993,296995,296999],{"type":23,"value":296985},"For example, imagine you're building a ",{"type":17,"tag":133,"props":296987,"children":296990},{"href":296988,"rel":296989},"https://docs.unified.to/guides/how_to_build_a_candidate_assessment_product_with_unified",[214],[296991],{"type":23,"value":296992},"candidate assessment workflow",{"type":23,"value":296994},", we'd usually call the API to fetch the data, and feed it into the LLM for it to analyze that data. With the [Unified ",{"type":17,"tag":133,"props":296996,"children":296997},{"href":326},[296998],{"type":23,"value":329},{"type":23,"value":297000},"](/mcp) server, we can enable OpenAI (or another LLM API) to directly access the data and perform actions making the workflow much simpler and cleaner.",{"type":17,"tag":68,"props":297002,"children":297004},{"id":297003},"the-flow",[297005],{"type":23,"value":297006},"The Flow",{"type":17,"tag":29,"props":297008,"children":297009},{},[297010],{"type":23,"value":297011},"Here's how an LLM API connects to Unified's MCP server:",{"type":17,"tag":80,"props":297013,"children":297014},{},[297015,297020,297032],{"type":17,"tag":84,"props":297016,"children":297017},{},[297018],{"type":23,"value":297019},"Your app connects to the MCP server using the HTTP endpoint.",{"type":17,"tag":84,"props":297021,"children":297022},{},[297023,297025,297030],{"type":23,"value":297024},"You authenticate using you ",{"type":17,"tag":133,"props":297026,"children":297028},{"href":42620,"rel":297027},[214],[297029],{"type":23,"value":217},{"type":23,"value":297031}," API token generated and provider one of your customer's connection ID.",{"type":17,"tag":84,"props":297033,"children":297034},{},[297035],{"type":23,"value":297036},"The LLM can then discover and call tools (like 'fetch candidate', 'score candidate', 'update job status') in real time.",{"type":17,"tag":68,"props":297038,"children":297039},{"id":2109},[297040],{"type":23,"value":97048},{"type":17,"tag":29,"props":297042,"children":297043},{},[297044,297046,297052,297054,297059],{"type":23,"value":297045},"You must provide a token to the MCP server as a URL parameter (",{"type":17,"tag":6121,"props":297047,"children":297049},{"className":297048},[],[297050],{"type":23,"value":297051},"?token={token}",{"type":23,"value":297053},") or in the Authorization header (",{"type":17,"tag":6121,"props":297055,"children":297057},{"className":297056},[],[297058],{"type":23,"value":240773},{"type":23,"value":129328},{"type":17,"tag":29,"props":297061,"children":297062},{},[297063],{"type":17,"tag":48,"props":297064,"children":297065},{},[297066],{"type":23,"value":297067},"Private (Direct LLM API):",{"type":17,"tag":29,"props":297069,"children":297070},{},[297071,297073,297078,297080,297085],{"type":23,"value":297072},"Use your ",{"type":17,"tag":133,"props":297074,"children":297076},{"href":42620,"rel":297075},[214],[297077],{"type":23,"value":217},{"type":23,"value":297079}," workspace API key as the token, and include a ",{"type":17,"tag":6121,"props":297081,"children":297083},{"className":297082},[],[297084],{"type":23,"value":92426},{"type":23,"value":297086}," parameter for the customer's connection ID.",{"type":17,"tag":29,"props":297088,"children":297089},{},[297090],{"type":17,"tag":33,"props":297091,"children":297092},{},[297093],{"type":23,"value":19878},{"type":17,"tag":6893,"props":297095,"children":297098},{"className":297096,"code":297097,"language":20901,"meta":23},[20899],"\u003Chttps://mcp-api.unified.to/mcp?token=>\u003CYOUR_API_KEY>&connection=\u003CCONNECTION_ID>\n```\n\n\n_Note: Do not expose this token publicly._\n\n\n## Building the application with an LLM API and MCP\n\n\nIf your application is using an LLM API that supports MCP (like OpenAI), you can use the [`mcp-use`](https://github.com/mcp-use/mcp-use) Python package to connect to Unified MCP and access your customer's data and actions.\n\n\n### Dependencies\n\n\nThe full list of dependencies and setup you need to do to get things running.\n\n\n```bash\nmkdir unified-mcp-client\ncd unified-mcp-client\npython -m venv .venv\nsource .venv/bin/activate\npip install mcp-use python-dotenv requests openai\ntouch client.py\n",[297099],{"type":17,"tag":6121,"props":297100,"children":297101},{"__ignoreMap":7},[297102],{"type":23,"value":297097},{"type":17,"tag":239,"props":297104,"children":297106},{"id":297105},"setting-up-your-secrets",[297107],{"type":23,"value":297108},"Setting up your secrets",{"type":17,"tag":29,"props":297110,"children":297111},{},[297112,297114,297118,297120,297125],{"type":23,"value":297113},"Add your ",{"type":17,"tag":133,"props":297115,"children":297116},{"href":7691},[297117],{"type":23,"value":7806},{"type":23,"value":297119}," key, your customer's connection ID, and your workspace secret to a ",{"type":17,"tag":6121,"props":297121,"children":297123},{"className":297122},[],[297124],{"type":23,"value":211221},{"type":23,"value":211223},{"type":17,"tag":6893,"props":297127,"children":297130},{"className":297128,"code":297129,"language":48432,"meta":7},[48430],"echo \"UNIFIED_API_KEY=\u003Cyour Unified API key here>\" >> .env\necho \"CONNECTION_ID=\u003Cyour Unified connection ID here>\" >> .env\necho \".env\" >> .gitignore\n",[297131],{"type":17,"tag":6121,"props":297132,"children":297133},{"__ignoreMap":7},[297134],{"type":23,"value":297129},{"type":17,"tag":18,"props":297136,"children":297138},{"id":297137},"the-mcp-client-class",[297139],{"type":23,"value":297140},"The MCP Client Class",{"type":17,"tag":29,"props":297142,"children":297143},{},[297144,297146,297152],{"type":23,"value":297145},"Here's an example using the ",{"type":17,"tag":6121,"props":297147,"children":297149},{"className":297148},[],[297150],{"type":23,"value":297151},"mcp-use",{"type":23,"value":297153}," package:",{"type":17,"tag":6893,"props":297155,"children":297158},{"className":297156,"code":297157,"language":127595,"meta":7},[127593],"# client.py\nimport os\nimport hashlib\nimport secrets\nfrom dotenv import load_dotenv\nfrom mcp_use import MCPClient\n\nload_dotenv()\n\nCONNECTION_ID = os.getenv(\"CONNECTION_ID\")\nTOKEN = os.getenv(\"API_KEY\")\n\nMCP_URL = f\"\u003Chttps://mcp-api.unified.to/mcp?token={TOKEN}&connection={CONNECTION_ID}>\"\n\nclient = MCPClient(MCP_URL)\n\n# List available tools\ntools = client.list_tools()\nprint(\"Available tools:\", [tool['id'] for tool in tools])\n\n# Call a tool (example: call the first tool with no arguments)\nif tools:\n    tool_id = tools[0]['id']\n    result = client.call_tool(tool_id, {})\n    print(\"Tool result:\", result)\n",[297159],{"type":17,"tag":6121,"props":297160,"children":297161},{"__ignoreMap":7},[297162],{"type":23,"value":297157},{"type":17,"tag":68,"props":297164,"children":297165},{"id":291789},[297166],{"type":23,"value":291792},{"type":17,"tag":29,"props":297168,"children":297169},{},[297170],{"type":23,"value":291797},{"type":17,"tag":239,"props":297172,"children":297173},{"id":291800},[297174],{"type":23,"value":291803},{"type":17,"tag":29,"props":297176,"children":297177},{},[297178],{"type":23,"value":291808},{"type":17,"tag":29,"props":297180,"children":297181},{},[297182,297183,297187],{"type":23,"value":291813},{"type":17,"tag":48,"props":297184,"children":297185},{},[297186],{"type":23,"value":291818},{"type":23,"value":20456},{"type":17,"tag":6893,"props":297189,"children":297191},{"className":297190,"code":291823,"language":127595,"meta":7},[127593],[297192],{"type":17,"tag":6121,"props":297193,"children":297194},{"__ignoreMap":7},[297195],{"type":23,"value":291823},{"type":17,"tag":29,"props":297197,"children":297198},{},[297199],{"type":17,"tag":48,"props":297200,"children":297201},{},[297202],{"type":23,"value":297203},"No backend glue code required—OpenAI orchestrates the tool calls via Unified MCP.",{"type":17,"tag":68,"props":297205,"children":297206},{"id":290533},[297207],{"type":23,"value":290536},{"type":17,"tag":29,"props":297209,"children":297210},{},[297211],{"type":17,"tag":48,"props":297212,"children":297213},{},[297214],{"type":23,"value":290544},{"type":17,"tag":6154,"props":297216,"children":297217},{},[297218,297236,297254,297264],{"type":17,"tag":84,"props":297219,"children":297220},{},[297221,297222,297227,297228],{"type":23,"value":140426},{"type":17,"tag":6121,"props":297223,"children":297225},{"className":297224},[],[297226],{"type":23,"value":244105},{"type":23,"value":290558},{"type":17,"tag":6893,"props":297229,"children":297231},{"className":297230,"code":290562,"language":127595,"meta":7},[127593],[297232],{"type":17,"tag":6121,"props":297233,"children":297234},{"__ignoreMap":7},[297235],{"type":23,"value":290562},{"type":17,"tag":84,"props":297237,"children":297238},{},[297239,297240,297245,297246],{"type":23,"value":290572},{"type":17,"tag":6121,"props":297241,"children":297243},{"className":297242},[],[297244],{"type":23,"value":139496},{"type":23,"value":290579},{"type":17,"tag":6893,"props":297247,"children":297249},{"className":297248,"code":290583,"language":22503,"meta":7},[22501],[297250],{"type":17,"tag":6121,"props":297251,"children":297252},{"__ignoreMap":7},[297253],{"type":23,"value":290583},{"type":17,"tag":84,"props":297255,"children":297256},{},[297257,297258,297263],{"type":23,"value":140426},{"type":17,"tag":6121,"props":297259,"children":297261},{"className":297260},[],[297262],{"type":23,"value":140432},{"type":23,"value":290599},{"type":17,"tag":84,"props":297265,"children":297266},{},[297267,297268,297273,297274],{"type":23,"value":290604},{"type":17,"tag":6121,"props":297269,"children":297271},{"className":297270},[],[297272],{"type":23,"value":290610},{"type":23,"value":290612},{"type":17,"tag":6893,"props":297275,"children":297277},{"className":297276,"code":290616,"language":22503,"meta":7},[22501],[297278],{"type":17,"tag":6121,"props":297279,"children":297280},{"__ignoreMap":7},[297281],{"type":23,"value":290616},{"type":17,"tag":68,"props":297283,"children":297284},{"id":291423},[297285],{"type":23,"value":291426},{"type":17,"tag":29,"props":297287,"children":297288},{},[297289],{"type":17,"tag":48,"props":297290,"children":297291},{},[297292],{"type":23,"value":290544},{"type":17,"tag":6154,"props":297294,"children":297295},{},[297296,297312,297324,297334],{"type":17,"tag":84,"props":297297,"children":297298},{},[297299,297300,297305,297306,297311],{"type":23,"value":140426},{"type":17,"tag":6121,"props":297301,"children":297303},{"className":297302},[],[297304],{"type":23,"value":244105},{"type":23,"value":291447},{"type":17,"tag":6121,"props":297307,"children":297309},{"className":297308},[],[297310],{"type":23,"value":141397},{"type":23,"value":291454},{"type":17,"tag":84,"props":297313,"children":297314},{},[297315,297316],{"type":23,"value":291459},{"type":17,"tag":6893,"props":297317,"children":297319},{"className":297318,"code":291463,"language":20901,"meta":23},[20899],[297320],{"type":17,"tag":6121,"props":297321,"children":297322},{"__ignoreMap":7},[297323],{"type":23,"value":291463},{"type":17,"tag":84,"props":297325,"children":297326},{},[297327,297328,297333],{"type":23,"value":140426},{"type":17,"tag":6121,"props":297329,"children":297331},{"className":297330},[],[297332],{"type":23,"value":140432},{"type":23,"value":290982},{"type":17,"tag":84,"props":297335,"children":297336},{},[297337,297338,297343,297344],{"type":23,"value":291483},{"type":17,"tag":6121,"props":297339,"children":297341},{"className":297340},[],[297342],{"type":23,"value":291489},{"type":23,"value":291491},{"type":17,"tag":6893,"props":297345,"children":297347},{"className":297346,"code":291495,"language":22503,"meta":7},[22501],[297348],{"type":17,"tag":6121,"props":297349,"children":297350},{"__ignoreMap":7},[297351],{"type":23,"value":291495},{"type":17,"tag":68,"props":297353,"children":297355},{"id":297354},"integrating-with-cohere",[297356],{"type":23,"value":297357},"Integrating with Cohere",{"type":17,"tag":29,"props":297359,"children":297360},{},[297361],{"type":17,"tag":48,"props":297362,"children":297363},{},[297364],{"type":23,"value":290544},{"type":17,"tag":6154,"props":297366,"children":297367},{},[297368,297386,297396],{"type":17,"tag":84,"props":297369,"children":297370},{},[297371,297372,297377,297378],{"type":23,"value":140426},{"type":17,"tag":6121,"props":297373,"children":297375},{"className":297374},[],[297376],{"type":23,"value":290959},{"type":23,"value":290961},{"type":17,"tag":6893,"props":297379,"children":297381},{"className":297380,"code":290965,"language":127595,"meta":7},[127593],[297382],{"type":17,"tag":6121,"props":297383,"children":297384},{"__ignoreMap":7},[297385],{"type":23,"value":290965},{"type":17,"tag":84,"props":297387,"children":297388},{},[297389,297390,297395],{"type":23,"value":290975},{"type":17,"tag":6121,"props":297391,"children":297393},{"className":297392},[],[297394],{"type":23,"value":140432},{"type":23,"value":290982},{"type":17,"tag":84,"props":297397,"children":297398},{},[297399],{"type":23,"value":290987},{"type":17,"tag":239,"props":297401,"children":297402},{"id":290990},[297403],{"type":23,"value":290993},{"type":17,"tag":29,"props":297405,"children":297406},{},[297407],{"type":17,"tag":48,"props":297408,"children":297409},{},[297410],{"type":23,"value":291001},{"type":17,"tag":6893,"props":297412,"children":297414},{"className":297413,"code":291005,"language":20901,"meta":23},[20899],[297415],{"type":17,"tag":6121,"props":297416,"children":297417},{"__ignoreMap":7},[297418],{"type":23,"value":291005},{"type":17,"tag":29,"props":297420,"children":297421},{},[297422],{"type":17,"tag":48,"props":297423,"children":297424},{},[297425],{"type":23,"value":291018},{"type":17,"tag":80,"props":297427,"children":297428},{},[297429,297452,297469,297479],{"type":17,"tag":84,"props":297430,"children":297431},{},[297432,297434,297439,297440,297445,297446,297451],{"type":23,"value":297433},"Your chosen LLM discovers the available tools from Unified MCP (e.g., ",{"type":17,"tag":6121,"props":297435,"children":297437},{"className":297436},[],[297438],{"type":23,"value":291037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":297441,"children":297443},{"className":297442},[],[297444],{"type":23,"value":291044},{"type":23,"value":11826},{"type":17,"tag":6121,"props":297447,"children":297449},{"className":297448},[],[297450],{"type":23,"value":291051},{"type":23,"value":129328},{"type":17,"tag":84,"props":297453,"children":297454},{},[297455,297457,297462,297463,297468],{"type":23,"value":297456},"The LLM calls ",{"type":17,"tag":6121,"props":297458,"children":297460},{"className":297459},[],[297461],{"type":23,"value":291037},{"type":23,"value":34435},{"type":17,"tag":6121,"props":297464,"children":297466},{"className":297465},[],[297467],{"type":23,"value":291044},{"type":23,"value":291070},{"type":17,"tag":84,"props":297470,"children":297471},{},[297472,297473,297478],{"type":23,"value":297456},{"type":17,"tag":6121,"props":297474,"children":297476},{"className":297475},[],[297477],{"type":23,"value":291051},{"type":23,"value":291081},{"type":17,"tag":84,"props":297480,"children":297481},{},[297482],{"type":23,"value":297483},"The LLM returns a response like:",{"type":17,"tag":29,"props":297485,"children":297486},{},[297487],{"type":17,"tag":48,"props":297488,"children":297489},{},[297490],{"type":23,"value":48442},{"type":17,"tag":6893,"props":297492,"children":297494},{"className":297493,"code":291097,"language":20901,"meta":23},[20899],[297495],{"type":17,"tag":6121,"props":297496,"children":297497},{"__ignoreMap":7},[297498],{"type":23,"value":291097},{"title":7,"searchDepth":1629,"depth":1629,"links":297500},[297501,297502,297505,297508,297509,297510],{"id":297003,"depth":1629,"text":297006},{"id":2109,"depth":1629,"text":97048,"children":297503},[297504],{"id":297105,"depth":1635,"text":297108},{"id":291789,"depth":1629,"text":291792,"children":297506},[297507],{"id":291800,"depth":1635,"text":291803},{"id":290533,"depth":1629,"text":290536},{"id":291423,"depth":1629,"text":291426},{"id":297354,"depth":1629,"text":297357,"children":297511},[297512],{"id":290990,"depth":1635,"text":290993},"content:blog:how_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server.md","blog/how_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server",{"_path":297517,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":297518,"description":297519,"img":297520,"date":296952,"tag":12,"body":297521,"_type":1677,"_id":297870,"_source":1679,"_file":297871,"_stem":297872,"_extension":1682},"/blog/unified_mcp_server_expands_to_360_integrations_and_20421_real_time_tools","Unified.to MCP Server Expands to 360+ Integrations and 20,421 Real-Time Tools","20,421 real-time tools, zero data storage, and growing weekly — the most complete Unified MCP server for AI-native teams.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_server_expands_to_360_integrations_and_20421_real_time_tools-icon.webp",{"type":14,"children":297522,"toc":297862},[297523,297528,297531,297538,297545,297559,297570,297576,297599,297612,297625,297630,297636,297641,297687,297693,297704,297736,297749,297760,297793,297798,297804,297809,297827,297839],{"type":17,"tag":18,"props":297524,"children":297526},{"id":297525},"unifiedto-mcp-server-expands-to-360-integrations-and-20421-real-time-tools",[297527],{"type":23,"value":297518},{"type":17,"tag":25,"props":297529,"children":297530},{},[],{"type":17,"tag":29,"props":297532,"children":297533},{},[297534],{"type":17,"tag":33,"props":297535,"children":297536},{},[297537],{"type":23,"value":295195},{"type":17,"tag":29,"props":297539,"children":297540},{},[297541],{"type":17,"tag":6438,"props":297542,"children":297544},{"alt":285811,"src":297543},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_server_expands_to_360_integrations_and_20421_real_time_tools-0.png",[],{"type":17,"tag":29,"props":297546,"children":297547},{},[297548],{"type":17,"tag":33,"props":297549,"children":297550},{},[297551,297553,297557],{"type":23,"value":297552},"20,421 real-time tools, zero data storage, and growing weekly — the most complete [Unified ",{"type":17,"tag":133,"props":297554,"children":297555},{"href":326},[297556],{"type":23,"value":329},{"type":23,"value":297558},"](/mcp) server for AI-native teams.",{"type":17,"tag":29,"props":297560,"children":297561},{},[297562,297564,297568],{"type":23,"value":297563},"We're thrilled to announce a major upgrade to the Unified.to MCP (",{"type":17,"tag":133,"props":297565,"children":297566},{"href":64193},[297567],{"type":23,"value":44580},{"type":23,"value":297569},") server. With this release, your MCP integrations gain broader coverage, stronger compliance options, and the flexibility needed to power production-grade AI agents.",{"type":17,"tag":239,"props":297571,"children":297573},{"id":297572},"whats-new-expanded-endpoint-coverage",[297574],{"type":23,"value":297575},"What's New: Expanded Endpoint Coverage",{"type":17,"tag":29,"props":297577,"children":297578},{},[297579,297584,297585,297593,297594],{"type":17,"tag":33,"props":297580,"children":297581},{},[297582],{"type":23,"value":297583},"The Unified.to MCP server now supports",{"type":23,"value":18757},{"type":17,"tag":33,"props":297586,"children":297587},{},[297588],{"type":17,"tag":48,"props":297589,"children":297590},{},[297591],{"type":23,"value":297592},"a vastly expanded set of vendor API endpoints",{"type":23,"value":18757},{"type":17,"tag":33,"props":297595,"children":297596},{},[297597],{"type":23,"value":297598},"— going beyond the normalized Unified.to API objects.",{"type":17,"tag":29,"props":297600,"children":297601},{},[297602,297604,297610],{"type":23,"value":297603},"By adding ",{"type":17,"tag":6121,"props":297605,"children":297607},{"className":297606},[],[297608],{"type":23,"value":297609},"&include_external_tools=true",{"type":23,"value":297611},", you can instantly expose all vendor endpoints as callable MCP tools inside Anthropic, OpenAI, Google Gemini, Cohere, and more.",{"type":17,"tag":80,"props":297613,"children":297614},{},[297615,297620],{"type":17,"tag":84,"props":297616,"children":297617},{},[297618],{"type":23,"value":297619},"20,421 tools now available (with thousands more coming weekly)",{"type":17,"tag":84,"props":297621,"children":297622},{},[297623],{"type":23,"value":297624},"Coverage spans 333+ integrations across 21 categories",{"type":17,"tag":29,"props":297626,"children":297627},{},[297628],{"type":23,"value":297629},"This unlocks access to every action supported by a vendor's API — from custom objects to niche endpoints — without additional server configuration.",{"type":17,"tag":239,"props":297631,"children":297633},{"id":297632},"security-and-control-built-in",[297634],{"type":23,"value":297635},"Security and Control Built In",{"type":17,"tag":29,"props":297637,"children":297638},{},[297639],{"type":23,"value":297640},"Two of the biggest challenges with MCP today are security and fragmentation. Unified.to MCP addresses both:",{"type":17,"tag":80,"props":297642,"children":297643},{},[297644,297661,297677],{"type":17,"tag":84,"props":297645,"children":297646},{},[297647,297652,297654,297659],{"type":17,"tag":48,"props":297648,"children":297649},{},[297650],{"type":23,"value":297651},"Scoped permissions:",{"type":23,"value":297653}," Limit available tools to the exact scopes required. Use the ",{"type":17,"tag":6121,"props":297655,"children":297657},{"className":297656},[],[297658],{"type":23,"value":24204},{"type":23,"value":297660}," parameter to enforce read-only or restricted access.",{"type":17,"tag":84,"props":297662,"children":297663},{},[297664,297669,297670,297675],{"type":17,"tag":48,"props":297665,"children":297666},{},[297667],{"type":23,"value":297668},"Sensitive data protection:",{"type":23,"value":256906},{"type":17,"tag":6121,"props":297671,"children":297673},{"className":297672},[],[297674],{"type":23,"value":141531},{"type":23,"value":297676}," to automatically strip PII and confidential fields before they reach an LLM.",{"type":17,"tag":84,"props":297678,"children":297679},{},[297680,297685],{"type":17,"tag":48,"props":297681,"children":297682},{},[297683],{"type":23,"value":297684},"Single server, all integrations:",{"type":23,"value":297686}," No need to spin up separate MCP servers for each vendor. Unified.to MCP abstracts that complexity.",{"type":17,"tag":239,"props":297688,"children":297690},{"id":297689},"european-data-region-support",[297691],{"type":23,"value":297692},"European Data-Region Support",{"type":17,"tag":29,"props":297694,"children":297695},{},[297696,297698,297703],{"type":23,"value":297697},"Unified.to MCP is now available in our ",{"type":17,"tag":48,"props":297699,"children":297700},{},[297701],{"type":23,"value":297702},"EU data center",{"type":23,"value":54},{"type":17,"tag":80,"props":297705,"children":297706},{},[297707,297719,297724],{"type":17,"tag":84,"props":297708,"children":297709},{},[297710,297711,297717],{"type":23,"value":33722},{"type":17,"tag":6121,"props":297712,"children":297714},{"className":297713},[],[297715],{"type":23,"value":297716},"https://mcp-api-eu.unified.to",{"type":23,"value":297718}," to keep data flows in-region.",{"type":17,"tag":84,"props":297720,"children":297721},{},[297722],{"type":23,"value":297723},"All MCP requests in the EU region are served directly from Unified's EU infrastructure, ensuring compliance with regional privacy requirements.",{"type":17,"tag":84,"props":297725,"children":297726},{},[297727,297729,297734],{"type":23,"value":297728},"Unified MCP servers are also live in the ",{"type":17,"tag":48,"props":297730,"children":297731},{},[297732],{"type":23,"value":297733},"US and AU",{"type":23,"value":297735}," regions.",{"type":17,"tag":239,"props":297737,"children":297739},{"id":297738},"how-unifiedto-mcp-works",[297740,297742,297747],{"type":23,"value":297741},"How ",{"type":17,"tag":133,"props":297743,"children":297745},{"href":42620,"rel":297744},[214],[297746],{"type":23,"value":217},{"type":23,"value":297748}," MCP Works",{"type":17,"tag":29,"props":297750,"children":297751},{},[297752,297753,297758],{"type":23,"value":6712},{"type":17,"tag":133,"props":297754,"children":297756},{"href":42620,"rel":297755},[214],[297757],{"type":23,"value":217},{"type":23,"value":297759}," MCP server is built on authorized pass-through integrations with attached OpenAPI specs — exposing your customer's third-party data as structured tools for LLMs.",{"type":17,"tag":80,"props":297761,"children":297762},{},[297763,297773,297783],{"type":17,"tag":84,"props":297764,"children":297765},{},[297766,297771],{"type":17,"tag":48,"props":297767,"children":297768},{},[297769],{"type":23,"value":297770},"Real-time:",{"type":23,"value":297772}," Every tool fetches live data directly from the source system.",{"type":17,"tag":84,"props":297774,"children":297775},{},[297776,297781],{"type":17,"tag":48,"props":297777,"children":297778},{},[297779],{"type":23,"value":297780},"Bi-directional:",{"type":23,"value":297782}," Agents can both read and write — update candidates, trigger workflows, close deals.",{"type":17,"tag":84,"props":297784,"children":297785},{},[297786,297791],{"type":17,"tag":48,"props":297787,"children":297788},{},[297789],{"type":23,"value":297790},"333+ integrations:",{"type":23,"value":297792}," One auth flow unlocks tools across HR, ATS, CRM, Accounting, Messaging, File Storage, and more.",{"type":17,"tag":29,"props":297794,"children":297795},{},[297796],{"type":23,"value":297797},"With Unified.to MCP, you can power conversational agents, copilots, and predictive workflows that act securely on customer data — without glue code or prompt hacks.",{"type":17,"tag":239,"props":297799,"children":297801},{"id":297800},"whats-next",[297802],{"type":23,"value":297803},"What's Next",{"type":17,"tag":29,"props":297805,"children":297806},{},[297807],{"type":23,"value":297808},"The Model Context Protocol is evolving quickly, and we're keeping pace. Unified.to MCP will continue to add:",{"type":17,"tag":80,"props":297810,"children":297811},{},[297812,297817,297822],{"type":17,"tag":84,"props":297813,"children":297814},{},[297815],{"type":23,"value":297816},"Expanded security features",{"type":17,"tag":84,"props":297818,"children":297819},{},[297820],{"type":23,"value":297821},"Additional regional data centers",{"type":17,"tag":84,"props":297823,"children":297824},{},[297825],{"type":23,"value":297826},"Ongoing integration growth across categories",{"type":17,"tag":29,"props":297828,"children":297829},{},[297830,297832,297838],{"type":23,"value":297831},"For setup instructions and endpoint details, see the ",{"type":17,"tag":133,"props":297833,"children":297835},{"href":43558,"rel":297834},[214],[297836],{"type":23,"value":297837},"MCP documentation",{"type":23,"value":54},{"type":17,"tag":29,"props":297840,"children":297841},{},[297842,297844,297852,297853,297861],{"type":23,"value":297843},"Unified.to MCP is available today. ",{"type":17,"tag":133,"props":297845,"children":297847},{"href":1612,"rel":297846},[214],[297848],{"type":17,"tag":48,"props":297849,"children":297850},{},[297851],{"type":23,"value":242151},{"type":23,"value":75890},{"type":17,"tag":133,"props":297854,"children":297856},{"href":1623,"rel":297855},[214],[297857],{"type":17,"tag":48,"props":297858,"children":297859},{},[297860],{"type":23,"value":226481},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":297863},[297864,297865,297866,297867,297869],{"id":297572,"depth":1635,"text":297575},{"id":297632,"depth":1635,"text":297635},{"id":297689,"depth":1635,"text":297692},{"id":297738,"depth":1635,"text":297868},"How Unified.to MCP Works",{"id":297800,"depth":1635,"text":297803},"content:blog:unified_mcp_server_expands_to_360_integrations_and_20421_real_time_tools.md","blog/unified_mcp_server_expands_to_360_integrations_and_20421_real_time_tools.md","blog/unified_mcp_server_expands_to_360_integrations_and_20421_real_time_tools",{"_path":297874,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":297875,"description":297876,"img":297877,"date":296952,"tag":12,"body":297878,"_type":1677,"_id":298584,"_source":1679,"_file":298585,"_stem":298586,"_extension":1682},"/blog/unified_verification_api_run_background_checks_and_identity_verification_across_providers","Unified Verification API: Run Background Checks and Identity Verification Across Providers","If your product needs to run background checks, verify identity, or confirm professional credentials, you quickly run into fragmented APIs, inconsistent...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_verification_api_run_background_checks_and_identity_verification_across_providers-icon.png",{"type":14,"children":297879,"toc":298566},[297880,297885,297888,297895,297900,297910,297914,297919,297992,298002,298008,298038,298043,298049,298054,298076,298081,298087,298092,298098,298116,298122,298140,298146,298154,298160,298173,298179,298187,298210,298214,298242,298248,298253,298306,298319,298325,298330,298353,298358,298364,298369,298440,298445,298451,298456,298487,298504,298511,298533,298556,298561],{"type":17,"tag":18,"props":297881,"children":297883},{"id":297882},"unified-verification-api-run-background-checks-and-identity-verification-across-providers",[297884],{"type":23,"value":297875},{"type":17,"tag":25,"props":297886,"children":297887},{},[],{"type":17,"tag":29,"props":297889,"children":297890},{},[297891],{"type":17,"tag":33,"props":297892,"children":297893},{},[297894],{"type":23,"value":295195},{"type":17,"tag":29,"props":297896,"children":297897},{},[297898],{"type":23,"value":297899},"If your product needs to run background checks, verify identity, or confirm professional credentials, you quickly run into fragmented APIs, inconsistent request formats, and provider-specific onboarding requirements.",{"type":17,"tag":29,"props":297901,"children":297902},{},[297903,297904,297908],{"type":23,"value":149272},{"type":17,"tag":133,"props":297905,"children":297906},{"href":53443},[297907],{"type":23,"value":54031},{"type":23,"value":297909}," provides a single interface to request and retrieve verification results across providers, with normalized data models and real-time status updates.",{"type":17,"tag":68,"props":297911,"children":297912},{"id":241569},[297913],{"type":23,"value":269703},{"type":17,"tag":29,"props":297915,"children":297916},{},[297917],{"type":23,"value":297918},"Our Verification API launches with support for leading providers — with more on the roadmap:",{"type":17,"tag":80,"props":297920,"children":297921},{},[297922,297936,297950,297964,297978],{"type":17,"tag":84,"props":297923,"children":297924},{},[297925,297934],{"type":17,"tag":133,"props":297926,"children":297929},{"href":297927,"rel":297928},"https://certn.co/",[214],[297930],{"type":17,"tag":48,"props":297931,"children":297932},{},[297933],{"type":23,"value":53736},{"type":23,"value":297935}," — Canadian-based, global coverage for background checks, identity, and credit.",{"type":17,"tag":84,"props":297937,"children":297938},{},[297939,297948],{"type":17,"tag":133,"props":297940,"children":297943},{"href":297941,"rel":297942},"https://unified.to/integrations/checkr",[214],[297944],{"type":17,"tag":48,"props":297945,"children":297946},{},[297947],{"type":23,"value":195889},{"type":23,"value":297949}," — U.S. leader in automated background screening, criminal checks, and employment verification.",{"type":17,"tag":84,"props":297951,"children":297952},{},[297953,297962],{"type":17,"tag":133,"props":297954,"children":297957},{"href":297955,"rel":297956},"https://verifiable.com/",[214],[297958],{"type":17,"tag":48,"props":297959,"children":297960},{},[297961],{"type":23,"value":53781},{"type":23,"value":297963}," — License and credential verification for healthcare and other regulated professions.",{"type":17,"tag":84,"props":297965,"children":297966},{},[297967,297976],{"type":17,"tag":133,"props":297968,"children":297971},{"href":297969,"rel":297970},"https://fadv.com/",[214],[297972],{"type":17,"tag":48,"props":297973,"children":297974},{},[297975],{"type":23,"value":53684},{"type":23,"value":297977}," — Global background and verification provider.",{"type":17,"tag":84,"props":297979,"children":297980},{},[297981,297990],{"type":17,"tag":133,"props":297982,"children":297985},{"href":297983,"rel":297984},"https://yardstik.com/",[214],[297986],{"type":17,"tag":48,"props":297987,"children":297988},{},[297989],{"type":23,"value":53830},{"type":23,"value":297991}," — Background checks, identity verification, and compliance tools designed for workforce platforms.",{"type":17,"tag":29,"props":297993,"children":297994},{},[297995,297996,298001],{"type":23,"value":241637},{"type":17,"tag":133,"props":297997,"children":297999},{"href":215330,"rel":297998},[214],[298000],{"type":23,"value":241643},{"type":23,"value":54},{"type":17,"tag":68,"props":298003,"children":298005},{"id":298004},"core-objects-in-the-verification-api",[298006],{"type":23,"value":298007},"Core objects in the Verification API",{"type":17,"tag":80,"props":298009,"children":298010},{},[298011,298020,298029],{"type":17,"tag":84,"props":298012,"children":298013},{},[298014,298018],{"type":17,"tag":48,"props":298015,"children":298016},{},[298017],{"type":23,"value":54055},{"type":23,"value":298019},": predefined verification bundles (e.g. criminal check, license verification)",{"type":17,"tag":84,"props":298021,"children":298022},{},[298023,298027],{"type":17,"tag":48,"props":298024,"children":298025},{},[298026],{"type":23,"value":54068},{"type":23,"value":298028},": verification requests tied to a candidate or subject",{"type":17,"tag":84,"props":298030,"children":298031},{},[298032,298036],{"type":17,"tag":48,"props":298033,"children":298034},{},[298035],{"type":23,"value":182229},{"type":23,"value":298037},": structured results including status, scores, documents, and provider details",{"type":17,"tag":29,"props":298039,"children":298040},{},[298041],{"type":23,"value":298042},"Requests include structured profile data (identity, contact details, identifiers), and results are returned with detailed status and supporting information.",{"type":17,"tag":68,"props":298044,"children":298046},{"id":298045},"real-time-verification-requests-and-status-tracking",[298047],{"type":23,"value":298048},"Real-time verification requests and status tracking",{"type":17,"tag":29,"props":298050,"children":298051},{},[298052],{"type":23,"value":298053},"Verification requests are executed against provider APIs in real time.",{"type":17,"tag":80,"props":298055,"children":298056},{},[298057,298062,298071],{"type":17,"tag":84,"props":298058,"children":298059},{},[298060],{"type":23,"value":298061},"Requests are created via a unified endpoint",{"type":17,"tag":84,"props":298063,"children":298064},{},[298065,298067],{"type":23,"value":298066},"Status updates are delivered via ",{"type":17,"tag":133,"props":298068,"children":298069},{"href":4999},[298070],{"type":23,"value":5002},{"type":17,"tag":84,"props":298072,"children":298073},{},[298074],{"type":23,"value":298075},"Results are retrieved as soon as providers complete processing",{"type":17,"tag":29,"props":298077,"children":298078},{},[298079],{"type":23,"value":298080},"No polling or background sync jobs are required.",{"type":17,"tag":68,"props":298082,"children":298084},{"id":298083},"what-you-can-verify",[298085],{"type":23,"value":298086},"What You Can Verify",{"type":17,"tag":29,"props":298088,"children":298089},{},[298090],{"type":23,"value":298091},"Verification covers a broad set of checks across industries:",{"type":17,"tag":239,"props":298093,"children":298095},{"id":298094},"identity-personal-verification",[298096],{"type":23,"value":298097},"Identity & personal verification",{"type":17,"tag":80,"props":298099,"children":298100},{},[298101,298106,298111],{"type":17,"tag":84,"props":298102,"children":298103},{},[298104],{"type":23,"value":298105},"Driver's licenses",{"type":17,"tag":84,"props":298107,"children":298108},{},[298109],{"type":23,"value":298110},"Passports",{"type":17,"tag":84,"props":298112,"children":298113},{},[298114],{"type":23,"value":298115},"Identity verification",{"type":17,"tag":239,"props":298117,"children":298119},{"id":298118},"background-checks",[298120],{"type":23,"value":298121},"Background checks",{"type":17,"tag":80,"props":298123,"children":298124},{},[298125,298130,298135],{"type":17,"tag":84,"props":298126,"children":298127},{},[298128],{"type":23,"value":298129},"Criminal checks",{"type":17,"tag":84,"props":298131,"children":298132},{},[298133],{"type":23,"value":298134},"Employment history",{"type":17,"tag":84,"props":298136,"children":298137},{},[298138],{"type":23,"value":298139},"Education verification",{"type":17,"tag":239,"props":298141,"children":298143},{"id":298142},"professional-regulatory",[298144],{"type":23,"value":298145},"Professional & regulatory",{"type":17,"tag":80,"props":298147,"children":298148},{},[298149],{"type":17,"tag":84,"props":298150,"children":298151},{},[298152],{"type":23,"value":298153},"Licenses (healthcare, finance, legal)",{"type":17,"tag":239,"props":298155,"children":298157},{"id":298156},"financial-risk",[298158],{"type":23,"value":298159},"Financial & risk",{"type":17,"tag":80,"props":298161,"children":298162},{},[298163,298168],{"type":17,"tag":84,"props":298164,"children":298165},{},[298166],{"type":23,"value":298167},"Credit checks",{"type":17,"tag":84,"props":298169,"children":298170},{},[298171],{"type":23,"value":298172},"Income verification",{"type":17,"tag":239,"props":298174,"children":298176},{"id":298175},"assessments",[298177],{"type":23,"value":298178},"Assessments",{"type":17,"tag":80,"props":298180,"children":298181},{},[298182],{"type":17,"tag":84,"props":298183,"children":298184},{},[298185],{"type":23,"value":298186},"Skills and psychometric tests",{"type":17,"tag":29,"props":298188,"children":298189},{},[298190,298192,298196,298198,298203,298204,298209],{"type":23,"value":298191},"Each provider offers ",{"type":17,"tag":48,"props":298193,"children":298194},{},[298195],{"type":23,"value":103004},{"type":23,"value":298197}," — bundles of checks such as 'criminal + employment history.' With Unified, you can list available packages, request one with candidate details (name, email, license number), and receive a ",{"type":17,"tag":48,"props":298199,"children":298200},{},[298201],{"type":23,"value":298202},"pass/fail result with reasons",{"type":23,"value":149495},{"type":17,"tag":33,"props":298205,"children":298206},{},[298207],{"type":23,"value":298208},"‘license expired in June 2024, Ontario'",{"type":23,"value":129328},{"type":17,"tag":68,"props":298211,"children":298212},{"id":182585},[298213],{"type":23,"value":182588},{"type":17,"tag":80,"props":298215,"children":298216},{},[298217,298222,298227,298232,298237],{"type":17,"tag":84,"props":298218,"children":298219},{},[298220],{"type":23,"value":298221},"Recruiting platforms running background checks and candidate screening",{"type":17,"tag":84,"props":298223,"children":298224},{},[298225],{"type":23,"value":298226},"HR and HRIS systems managing onboarding and compliance",{"type":17,"tag":84,"props":298228,"children":298229},{},[298230],{"type":23,"value":298231},"Marketplaces verifying workers or service providers",{"type":17,"tag":84,"props":298233,"children":298234},{},[298235],{"type":23,"value":298236},"Fintech platforms validating identity, income, and credit",{"type":17,"tag":84,"props":298238,"children":298239},{},[298240],{"type":23,"value":298241},"Compliance platforms handling regulatory verification",{"type":17,"tag":68,"props":298243,"children":298245},{"id":298244},"verification-in-recruiting-hr-and-fintech",[298246],{"type":23,"value":298247},"Verification in Recruiting, HR, and Fintech",{"type":17,"tag":29,"props":298249,"children":298250},{},[298251],{"type":23,"value":298252},"Verification processes align naturally with candidate and employee lifecycle stages:",{"type":17,"tag":80,"props":298254,"children":298255},{},[298256,298266,298276,298286,298296],{"type":17,"tag":84,"props":298257,"children":298258},{},[298259,298264],{"type":17,"tag":48,"props":298260,"children":298261},{},[298262],{"type":23,"value":298263},"ATS integrations",{"type":23,"value":298265}," — Trigger background or license checks when a candidate reaches the 'Background Check' stage.",{"type":17,"tag":84,"props":298267,"children":298268},{},[298269,298274],{"type":17,"tag":48,"props":298270,"children":298271},{},[298272],{"type":23,"value":298273},"Job boards",{"type":23,"value":298275}," — Pre-screen candidates before sending them to employers.",{"type":17,"tag":84,"props":298277,"children":298278},{},[298279,298284],{"type":17,"tag":48,"props":298280,"children":298281},{},[298282],{"type":23,"value":298283},"HRIS platforms",{"type":23,"value":298285}," — Validate licenses and onboarding requirements after a hire.",{"type":17,"tag":84,"props":298287,"children":298288},{},[298289,298294],{"type":17,"tag":48,"props":298290,"children":298291},{},[298292],{"type":23,"value":298293},"Assessment platforms",{"type":23,"value":298295}," — Combine background checks with candidate testing for a complete evaluation.",{"type":17,"tag":84,"props":298297,"children":298298},{},[298299,298304],{"type":17,"tag":48,"props":298300,"children":298301},{},[298302],{"type":23,"value":298303},"Fintech and credit platforms",{"type":23,"value":298305}," — Run income or credit checks to support lending, risk profiling, or compliance processes.",{"type":17,"tag":29,"props":298307,"children":298308},{},[298309,298311,298317],{"type":23,"value":298310},"For example, a recruiting platform can automatically call ",{"type":17,"tag":6121,"props":298312,"children":298314},{"className":298313},[],[298315],{"type":23,"value":298316},"runBackgroundCheck",{"type":23,"value":298318}," when a candidate advances to 'Offer,' while a fintech app can trigger a credit verification during loan application.",{"type":17,"tag":68,"props":298320,"children":298322},{"id":298321},"using-verification-data-in-ai-systems",[298323],{"type":23,"value":298324},"Using verification data in AI systems",{"type":17,"tag":29,"props":298326,"children":298327},{},[298328],{"type":23,"value":298329},"Verification results can be used to:",{"type":17,"tag":80,"props":298331,"children":298332},{},[298333,298338,298343,298348],{"type":17,"tag":84,"props":298334,"children":298335},{},[298336],{"type":23,"value":298337},"Automate candidate screening decisions",{"type":17,"tag":84,"props":298339,"children":298340},{},[298341],{"type":23,"value":298342},"Flag compliance risks or missing credentials",{"type":17,"tag":84,"props":298344,"children":298345},{},[298346],{"type":23,"value":298347},"Generate summaries of verification outcomes",{"type":17,"tag":84,"props":298349,"children":298350},{},[298351],{"type":23,"value":298352},"Trigger downstream actions based on verification status",{"type":17,"tag":29,"props":298354,"children":298355},{},[298356],{"type":23,"value":298357},"Because results are returned in real time, AI systems can act on current data rather than delayed updates.",{"type":17,"tag":68,"props":298359,"children":298361},{"id":298360},"technical-advantages-of-unified",[298362],{"type":23,"value":298363},"Technical Advantages of Unified",{"type":17,"tag":29,"props":298365,"children":298366},{},[298367],{"type":23,"value":298368},"The Verification API builds on Unified's real-time, zero-storage infrastructure:",{"type":17,"tag":80,"props":298370,"children":298371},{},[298372,298381,298391,298401,298410,298426,298435],{"type":17,"tag":84,"props":298373,"children":298374},{},[298375,298379],{"type":17,"tag":48,"props":298376,"children":298377},{},[298378],{"type":23,"value":137630},{"type":23,"value":298380}," for verification requests and results.",{"type":17,"tag":84,"props":298382,"children":298383},{},[298384,298389],{"type":17,"tag":48,"props":298385,"children":298386},{},[298387],{"type":23,"value":298388},"Read + write operations",{"type":23,"value":298390}," where supported by the provider.",{"type":17,"tag":84,"props":298392,"children":298393},{},[298394,298399],{"type":17,"tag":48,"props":298395,"children":298396},{},[298397],{"type":23,"value":298398},"Real-time webhooks",{"type":23,"value":298400}," for status updates and results.",{"type":17,"tag":84,"props":298402,"children":298403},{},[298404,298408],{"type":17,"tag":48,"props":298405,"children":298406},{},[298407],{"type":23,"value":69706},{"type":23,"value":298409}," — customer data is never cached or stored, reducing compliance risk.",{"type":17,"tag":84,"props":298411,"children":298412},{},[298413,298418,298420,298424],{"type":17,"tag":48,"props":298414,"children":298415},{},[298416],{"type":23,"value":298417},"Multiple delivery models",{"type":23,"value":298419}," — API access and webhooks for real-time status updates, with ",{"type":17,"tag":133,"props":298421,"children":298422},{"href":326},[298423],{"type":23,"value":329},{"type":23,"value":298425}," tools available for AI systems.",{"type":17,"tag":84,"props":298427,"children":298428},{},[298429,298434],{"type":17,"tag":48,"props":298430,"children":298431},{},[298432],{"type":23,"value":298433},"SOC 2 Type II, GDPR, and CCPA compliant",{"type":23,"value":54},{"type":17,"tag":84,"props":298436,"children":298437},{},[298438],{"type":23,"value":298439},"Requests are stateless and executed directly against provider APIs, reducing data retention and compliance scope.",{"type":17,"tag":29,"props":298441,"children":298442},{},[298443],{"type":23,"value":298444},"Unlike traditional verification integrations that rely on batch processing or stored records, Unified executes requests directly against provider APIs and returns results without storing customer data. This means you can embed verification into existing processes without handling separate APIs or adding security liability.",{"type":17,"tag":68,"props":298446,"children":298448},{"id":298447},"unified-for-recruiting-beyond",[298449],{"type":23,"value":298450},"Unified for Recruiting & Beyond",{"type":17,"tag":29,"props":298452,"children":298453},{},[298454],{"type":23,"value":298455},"Unified now powers every stage of the hiring and onboarding lifecycle:",{"type":17,"tag":80,"props":298457,"children":298458},{},[298459,298468,298478],{"type":17,"tag":84,"props":298460,"children":298461},{},[298462,298466],{"type":17,"tag":48,"props":298463,"children":298464},{},[298465],{"type":23,"value":189036},{"type":23,"value":298467}," → Source, manage, and update candidates.",{"type":17,"tag":84,"props":298469,"children":298470},{},[298471,298476],{"type":17,"tag":48,"props":298472,"children":298473},{},[298474],{"type":23,"value":298475},"HRIS APIs",{"type":23,"value":298477}," → Sync employee data and onboarding requirements.",{"type":17,"tag":84,"props":298479,"children":298480},{},[298481,298485],{"type":17,"tag":48,"props":298482,"children":298483},{},[298484],{"type":23,"value":54031},{"type":23,"value":298486}," → Run background, license, assessment, and credit checks.",{"type":17,"tag":29,"props":298488,"children":298489},{},[298490,298492,298497,298499,298503],{"type":23,"value":298491},"With the addition of Verification, Unified is the ",{"type":17,"tag":48,"props":298493,"children":298494},{},[298495],{"type":23,"value":298496},"all-in-one integration partner for recruiting and HR platforms",{"type":23,"value":298498}," — built for real-time products and AI-native processes, with ",{"type":17,"tag":48,"props":298500,"children":298501},{},[298502],{"type":23,"value":87018},{"type":23,"value":54},{"type":17,"tag":29,"props":298505,"children":298506},{},[298507],{"type":17,"tag":48,"props":298508,"children":298509},{},[298510],{"type":23,"value":244383},{"type":17,"tag":80,"props":298512,"children":298513},{},[298514,298524],{"type":17,"tag":84,"props":298515,"children":298516},{},[298517],{"type":17,"tag":133,"props":298518,"children":298521},{"href":298519,"rel":298520},"https://docs.unified.to/verification/overview",[214],[298522],{"type":23,"value":298523},"Read developer docs",{"type":17,"tag":84,"props":298525,"children":298526},{},[298527],{"type":17,"tag":133,"props":298528,"children":298530},{"href":87026,"rel":298529},[214],[298531],{"type":23,"value":298532},"Explore recruiting integrations",{"type":17,"tag":29,"props":298534,"children":298535},{},[298536,298538,298546,298547,298555],{"type":23,"value":298537},"The Verification API is available on all Unified.to plans. ",{"type":17,"tag":133,"props":298539,"children":298541},{"href":1612,"rel":298540},[214],[298542],{"type":17,"tag":48,"props":298543,"children":298544},{},[298545],{"type":23,"value":242151},{"type":23,"value":75890},{"type":17,"tag":133,"props":298548,"children":298550},{"href":1623,"rel":298549},[214],[298551],{"type":17,"tag":48,"props":298552,"children":298553},{},[298554],{"type":23,"value":226481},{"type":23,"value":54},{"type":17,"tag":68,"props":298557,"children":298558},{"id":53430},[298559],{"type":23,"value":298560},"What is a verification API?",{"type":17,"tag":29,"props":298562,"children":298563},{},[298564],{"type":23,"value":298565},"A verification API allows developers to request and retrieve background checks, identity verification, and credential validation from multiple providers through a single interface. It standardizes request formats, status tracking, and results, reducing the need to integrate each provider separately.",{"title":7,"searchDepth":1629,"depth":1629,"links":298567},[298568,298569,298570,298571,298578,298579,298580,298581,298582,298583],{"id":241569,"depth":1629,"text":269703},{"id":298004,"depth":1629,"text":298007},{"id":298045,"depth":1629,"text":298048},{"id":298083,"depth":1629,"text":298086,"children":298572},[298573,298574,298575,298576,298577],{"id":298094,"depth":1635,"text":298097},{"id":298118,"depth":1635,"text":298121},{"id":298142,"depth":1635,"text":298145},{"id":298156,"depth":1635,"text":298159},{"id":298175,"depth":1635,"text":298178},{"id":182585,"depth":1629,"text":182588},{"id":298244,"depth":1629,"text":298247},{"id":298321,"depth":1629,"text":298324},{"id":298360,"depth":1629,"text":298363},{"id":298447,"depth":1629,"text":298450},{"id":53430,"depth":1629,"text":298560},"content:blog:unified_verification_api_run_background_checks_and_identity_verification_across_providers.md","blog/unified_verification_api_run_background_checks_and_identity_verification_across_providers.md","blog/unified_verification_api_run_background_checks_and_identity_verification_across_providers",{"_path":298588,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":298589,"description":298590,"img":298591,"date":298592,"tag":12,"body":298593,"_type":1677,"_id":299193,"_source":1679,"_file":299194,"_stem":299195,"_extension":1682},"/blog/how_unified_helps_software_companies_add_integrations_from_the_start_to_launch","How Unified.to helps software companies add integrations from the start to launch","Modern SaaS products can't compete without integrations. Whether it's syncing HRIS data, updating CRM deals, or pulling transactions from an accounting system,...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_unified_helps_software_companies_add_integrations_from_the_start_to_launch-icon.webp","2025-08-21T00:00:00.000Z",{"type":14,"children":298594,"toc":299184},[298595,298600,298603,298611,298619,298624,298629,298639,298644,298650,298655,298684,298689,298695,298700,298751,298756,298762,298767,298820,298825,298831,298836,298869,298874,298880,298885,298893,298916,298924,298957,298962,298968,298973,299020,299025,299031,299036,299159,299164],{"type":17,"tag":18,"props":298596,"children":298598},{"id":298597},"how-unifiedto-helps-software-companies-add-integrations-from-the-start-to-launch",[298599],{"type":23,"value":298589},{"type":17,"tag":25,"props":298601,"children":298602},{},[],{"type":17,"tag":29,"props":298604,"children":298605},{},[298606],{"type":17,"tag":33,"props":298607,"children":298608},{},[298609],{"type":23,"value":298610},"August 21, 2025",{"type":17,"tag":29,"props":298612,"children":298613},{},[298614],{"type":17,"tag":6438,"props":298615,"children":298618},{"alt":298616,"src":298617},"Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_unified_helps_software_companies_add_integrations_from_the_start_to_launch-0.png",[],{"type":17,"tag":29,"props":298620,"children":298621},{},[298622],{"type":23,"value":298623},"Modern SaaS products can't compete without integrations. Whether it's syncing HRIS data, updating CRM deals, or pulling transactions from an accounting system, software teams are under pressure to deliver dozens of connectors—fast.",{"type":17,"tag":29,"props":298625,"children":298626},{},[298627],{"type":23,"value":298628},"But shipping integrations isn't just about calling an API.",{"type":17,"tag":29,"props":298630,"children":298631},{},[298632,298637],{"type":17,"tag":133,"props":298633,"children":298635},{"href":42620,"rel":298634},[214],[298636],{"type":23,"value":217},{"type":23,"value":298638}," supports you across the full integration lifecycle: from integration to launch, and beyond.",{"type":17,"tag":29,"props":298640,"children":298641},{},[298642],{"type":23,"value":298643},"Here's what that looks like in practice.",{"type":17,"tag":68,"props":298645,"children":298647},{"id":298646},"setup-simplifying-oauth-credentials-and-admin-access",[298648],{"type":23,"value":298649},"Setup: Simplifying OAuth, Credentials, and Admin Access",{"type":17,"tag":29,"props":298651,"children":298652},{},[298653],{"type":23,"value":298654},"Unified.to reduces friction from the start. Instead of writing separate auth flows for each vendor, you get one interface that works across 360+ apps.",{"type":17,"tag":80,"props":298656,"children":298657},{},[298658,298674],{"type":17,"tag":84,"props":298659,"children":298660},{},[298661,298666,298668,298672],{"type":17,"tag":48,"props":298662,"children":298663},{},[298664],{"type":23,"value":298665},"OAuth2 support (and more)",{"type":23,"value":298667},": Unified handles over 70 OAuth2 variations across supported integrations—including scope management, token exchange, expiration, and refresh flows. For non-",{"type":17,"tag":133,"props":298669,"children":298670},{"href":779},[298671],{"type":23,"value":782},{"type":23,"value":298673}," systems, we support API Keys, tokens, basic auth, and other authorization models behind the scenes—so you don't have to.",{"type":17,"tag":84,"props":298675,"children":298676},{},[298677,298682],{"type":17,"tag":48,"props":298678,"children":298679},{},[298680],{"type":23,"value":298681},"Admin-aware credentials",{"type":23,"value":298683},": Unified supports both user-level and admin-level integrations (critical for HRIS and IT systems).",{"type":17,"tag":29,"props":298685,"children":298686},{},[298687],{"type":23,"value":298688},"Developers spend less time researching scopes and configuring apps, and more time integrating.",{"type":17,"tag":68,"props":298690,"children":298692},{"id":298691},"integrate-real-time-unified-apis-sdks-and-schema-normalization",[298693],{"type":23,"value":298694},"Integrate: Real-time Unified APIs, SDKs, and Schema Normalization",{"type":17,"tag":29,"props":298696,"children":298697},{},[298698],{"type":23,"value":298699},"Unified.to exposes a consistent, developer-friendly API layer. It's not just a wrapper, it's a unified data model.",{"type":17,"tag":80,"props":298701,"children":298702},{},[298703,298711,298721,298731,298741],{"type":17,"tag":84,"props":298704,"children":298705},{},[298706],{"type":17,"tag":48,"props":298707,"children":298708},{},[298709],{"type":23,"value":298710},"360+ prebuilt integrations across 23+ categories",{"type":17,"tag":84,"props":298712,"children":298713},{},[298714,298719],{"type":17,"tag":48,"props":298715,"children":298716},{},[298717],{"type":23,"value":298718},"Deep normalization across 1,100+ objects",{"type":23,"value":298720},": Fields, enums, and relationships are standardized across systems (e.g. Contacts from Salesforce and HubSpot follow the same schema).",{"type":17,"tag":84,"props":298722,"children":298723},{},[298724,298729],{"type":17,"tag":48,"props":298725,"children":298726},{},[298727],{"type":23,"value":298728},"7+ auto-generated SDKs",{"type":23,"value":298730},": Type-safe clients in Python, TypeScript, Go, Java, and more.",{"type":17,"tag":84,"props":298732,"children":298733},{},[298734,298739],{"type":17,"tag":48,"props":298735,"children":298736},{},[298737],{"type":23,"value":298738},"Pass-through API support",{"type":23,"value":298740},": Access non-unified endpoints with existing credentials if needed.",{"type":17,"tag":84,"props":298742,"children":298743},{},[298744,298749],{"type":17,"tag":48,"props":298745,"children":298746},{},[298747],{"type":23,"value":298748},"Metadata APIs",{"type":23,"value":298750},": Dynamically fetch available fields, enums, and object structures (helpful for CRMs and ATSs with custom fields).",{"type":17,"tag":29,"props":298752,"children":298753},{},[298754],{"type":23,"value":298755},"The result: less conditional logic, fewer edge cases, and a consistent backend model for your product.",{"type":17,"tag":68,"props":298757,"children":298759},{"id":298758},"test-synthetic-data-debugging-tools-and-end-to-end-sandboxes",[298760],{"type":23,"value":298761},"Test: Synthetic Data, Debugging Tools, and End-to-End Sandboxes",{"type":17,"tag":29,"props":298763,"children":298764},{},[298765],{"type":23,"value":298766},"Unified.to offers dedicated testing environments so teams can validate before going live.",{"type":17,"tag":80,"props":298768,"children":298769},{},[298770,298780,298790,298800,298810],{"type":17,"tag":84,"props":298771,"children":298772},{},[298773,298778],{"type":17,"tag":48,"props":298774,"children":298775},{},[298776],{"type":23,"value":298777},"Full sandbox environment with synthetic data allowing",{"type":23,"value":298779}," integration testing without live credentials.",{"type":17,"tag":84,"props":298781,"children":298782},{},[298783,298788],{"type":17,"tag":48,"props":298784,"children":298785},{},[298786],{"type":23,"value":298787},"Built-in API Explorer",{"type":23,"value":298789},": View payloads, logs, and connection health directly in the Unified app.",{"type":17,"tag":84,"props":298791,"children":298792},{},[298793,298798],{"type":17,"tag":48,"props":298794,"children":298795},{},[298796],{"type":23,"value":298797},"30-day unlimited trial",{"type":23,"value":298799},": No usage caps during initial testing.",{"type":17,"tag":84,"props":298801,"children":298802},{},[298803,298808],{"type":17,"tag":48,"props":298804,"children":298805},{},[298806],{"type":23,"value":298807},"Pre-configured test credentials",{"type":23,"value":298809},": Use our API credentials to test your integration.",{"type":17,"tag":84,"props":298811,"children":298812},{},[298813,298818],{"type":17,"tag":48,"props":298814,"children":298815},{},[298816],{"type":23,"value":298817},"3rd-party sandbox links",{"type":23,"value":298819},": Access guidance on where to create vendor-specific sandbox accounts (e.g., Salesforce, NetSuite)",{"type":17,"tag":29,"props":298821,"children":298822},{},[298823],{"type":23,"value":298824},"Whether you're running QA, building staging environments, or verifying credential scopes, testing is fully supported.",{"type":17,"tag":68,"props":298826,"children":298828},{"id":298827},"launch-ready-to-use-ui-components-and-integration-enablement",[298829],{"type":23,"value":298830},"Launch: Ready-to-Use UI Components and Integration Enablement",{"type":17,"tag":29,"props":298832,"children":298833},{},[298834],{"type":23,"value":298835},"When you're ready to launch integrations to customers, Unified helps make them usable and scalable.",{"type":17,"tag":80,"props":298837,"children":298838},{},[298839,298849,298859],{"type":17,"tag":84,"props":298840,"children":298841},{},[298842,298847],{"type":17,"tag":48,"props":298843,"children":298844},{},[298845],{"type":23,"value":298846},"Embedded Connect UI",{"type":23,"value":298848},": Drop-in authorization component for your product (React, Vue, Angular, JS).",{"type":17,"tag":84,"props":298850,"children":298851},{},[298852,298857],{"type":17,"tag":48,"props":298853,"children":298854},{},[298855],{"type":23,"value":298856},"Website integrations directory",{"type":23,"value":298858},": Show off all of your new integrations on your website with just 1 line of code.",{"type":17,"tag":84,"props":298860,"children":298861},{},[298862,298867],{"type":17,"tag":48,"props":298863,"children":298864},{},[298865],{"type":23,"value":298866},"End-user credential guides",{"type":23,"value":298868},": Unified provides step-by-step instructions for customers to register apps and copy API keys (e.g. how to register a Salesforce app).",{"type":17,"tag":29,"props":298870,"children":298871},{},[298872],{"type":23,"value":298873},"This reduces support tickets and ensures your end-users can self-serve setup confidently.",{"type":17,"tag":68,"props":298875,"children":298877},{"id":298876},"partner-vendor-programs-and-co-marketing",[298878],{"type":23,"value":298879},"Partner: Vendor Programs and Co-Marketing",{"type":17,"tag":29,"props":298881,"children":298882},{},[298883],{"type":23,"value":298884},"Integrations aren't just about product features—they're also a partnership opportunity. Most SaaS vendors (Workday, Salesforce, HubSpot, etc.) offer formal partner programs. Being listed as a partner can drive qualified inbound leads, strengthen customer trust, and unlock direct support channels.",{"type":17,"tag":29,"props":298886,"children":298887},{},[298888],{"type":17,"tag":48,"props":298889,"children":298890},{},[298891],{"type":23,"value":298892},"Unified helps you take advantage of this by:",{"type":17,"tag":80,"props":298894,"children":298895},{},[298896,298906],{"type":17,"tag":84,"props":298897,"children":298898},{},[298899,298904],{"type":17,"tag":48,"props":298900,"children":298901},{},[298902],{"type":23,"value":298903},"Surfacing partner program information",{"type":23,"value":298905},": For each supported integration, we show where to apply for that vendor's official partnership (whether it's a form, contact, or program page).",{"type":17,"tag":84,"props":298907,"children":298908},{},[298909,298914],{"type":17,"tag":48,"props":298910,"children":298911},{},[298912],{"type":23,"value":298913},"Unified's own vendor partnerships",{"type":23,"value":298915},": We maintain direct partnerships with top platforms, so we can help customers and their end-users get better technical support.",{"type":17,"tag":29,"props":298917,"children":298918},{},[298919],{"type":17,"tag":48,"props":298920,"children":298921},{},[298922],{"type":23,"value":298923},"Benefits of partnering with vendors:",{"type":17,"tag":80,"props":298925,"children":298926},{},[298927,298937,298947],{"type":17,"tag":84,"props":298928,"children":298929},{},[298930,298935],{"type":17,"tag":48,"props":298931,"children":298932},{},[298933],{"type":23,"value":298934},"Lead-gen enablement",{"type":23,"value":298936},": Partner listings drive visibility on vendor marketplaces and can generate a steady flow of qualified prospects.",{"type":17,"tag":84,"props":298938,"children":298939},{},[298940,298945],{"type":17,"tag":48,"props":298941,"children":298942},{},[298943],{"type":23,"value":298944},"Co-marketing opportunities",{"type":23,"value":298946},": Joint press releases, marketplace placements, and vendor newsletters help amplify your product's reach.",{"type":17,"tag":84,"props":298948,"children":298949},{},[298950,298955],{"type":17,"tag":48,"props":298951,"children":298952},{},[298953],{"type":23,"value":298954},"Support escalation",{"type":23,"value":298956},": As an official partner, you get priority help from the vendor when troubleshooting mutual customer issues.",{"type":17,"tag":29,"props":298958,"children":298959},{},[298960],{"type":23,"value":298961},"With Unified, you don't just ship integrations—you unlock the partnership benefits that come with them.",{"type":17,"tag":68,"props":298963,"children":298965},{"id":298964},"support-monitoring-alerts-and-real-human-help",[298966],{"type":23,"value":298967},"Support: Monitoring, Alerts, and Real Human Help",{"type":17,"tag":29,"props":298969,"children":298970},{},[298971],{"type":23,"value":298972},"Unified's role doesn't stop at deployment. Ongoing maintenance and issue resolution are built into the platform.",{"type":17,"tag":80,"props":298974,"children":298975},{},[298976,298986,298996,299010],{"type":17,"tag":84,"props":298977,"children":298978},{},[298979,298984],{"type":17,"tag":48,"props":298980,"children":298981},{},[298982],{"type":23,"value":298983},"Private Slack channels for implementation and post-launch customers",{"type":23,"value":298985},": Speak directly with product and support engineers.",{"type":17,"tag":84,"props":298987,"children":298988},{},[298989,298994],{"type":17,"tag":48,"props":298990,"children":298991},{},[298992],{"type":23,"value":298993},"In-app ticketing system",{"type":23,"value":298995},": Flag issues at the connection level with structured logs attached.",{"type":17,"tag":84,"props":298997,"children":298998},{},[298999,299008],{"type":17,"tag":48,"props":299000,"children":299001},{},[299002,299004],{"type":23,"value":299003},"Health ",{"type":17,"tag":133,"props":299005,"children":299006},{"href":4999},[299007],{"type":23,"value":5002},{"type":23,"value":299009},": Receive alerts if a customer's token expires or sync fails.",{"type":17,"tag":84,"props":299011,"children":299012},{},[299013,299018],{"type":17,"tag":48,"props":299014,"children":299015},{},[299016],{"type":23,"value":299017},"24/7 support",{"type":23,"value":299019},": Available for Grow plans and up (SLA-based).",{"type":17,"tag":29,"props":299021,"children":299022},{},[299023],{"type":23,"value":299024},"You don't have to monitor 360+ integrations—Unified does it for you.",{"type":17,"tag":68,"props":299026,"children":299028},{"id":299027},"beyond-integration-a-lifecycle-integration-partner",[299029],{"type":23,"value":299030},"Beyond Integration: A Lifecycle Integration Partner",{"type":17,"tag":29,"props":299032,"children":299033},{},[299034],{"type":23,"value":299035},"Unified.to isn't just an API layer. It's the infrastructure that supports your integrations from start to scale.",{"type":17,"tag":7231,"props":299037,"children":299038},{},[299039,299061],{"type":17,"tag":7235,"props":299040,"children":299041},{},[299042],{"type":17,"tag":7239,"props":299043,"children":299044},{},[299045,299053],{"type":17,"tag":7243,"props":299046,"children":299047},{},[299048],{"type":17,"tag":48,"props":299049,"children":299050},{},[299051],{"type":23,"value":299052},"Phase",{"type":17,"tag":7243,"props":299054,"children":299055},{},[299056],{"type":17,"tag":48,"props":299057,"children":299058},{},[299059],{"type":23,"value":299060},"What Unified.to Provides",{"type":17,"tag":7259,"props":299062,"children":299063},{},[299064,299080,299096,299112,299128,299144],{"type":17,"tag":7239,"props":299065,"children":299066},{},[299067,299075],{"type":17,"tag":7266,"props":299068,"children":299069},{},[299070],{"type":17,"tag":48,"props":299071,"children":299072},{},[299073],{"type":23,"value":299074},"Setup",{"type":17,"tag":7266,"props":299076,"children":299077},{},[299078],{"type":23,"value":299079},"OAuth2 flow, admin-aware auth, credential guidance",{"type":17,"tag":7239,"props":299081,"children":299082},{},[299083,299091],{"type":17,"tag":7266,"props":299084,"children":299085},{},[299086],{"type":17,"tag":48,"props":299087,"children":299088},{},[299089],{"type":23,"value":299090},"Integrate",{"type":17,"tag":7266,"props":299092,"children":299093},{},[299094],{"type":23,"value":299095},"Normalized schemas, 360+ integrations, SDKs, pass-through API",{"type":17,"tag":7239,"props":299097,"children":299098},{},[299099,299107],{"type":17,"tag":7266,"props":299100,"children":299101},{},[299102],{"type":17,"tag":48,"props":299103,"children":299104},{},[299105],{"type":23,"value":299106},"Test",{"type":17,"tag":7266,"props":299108,"children":299109},{},[299110],{"type":23,"value":299111},"Sandbox mode, debug page, synthetic data, mock server",{"type":17,"tag":7239,"props":299113,"children":299114},{},[299115,299123],{"type":17,"tag":7266,"props":299116,"children":299117},{},[299118],{"type":17,"tag":48,"props":299119,"children":299120},{},[299121],{"type":23,"value":299122},"Launch",{"type":17,"tag":7266,"props":299124,"children":299125},{},[299126],{"type":23,"value":299127},"Connect component, credential guides, website integrations UI",{"type":17,"tag":7239,"props":299129,"children":299130},{},[299131,299139],{"type":17,"tag":7266,"props":299132,"children":299133},{},[299134],{"type":17,"tag":48,"props":299135,"children":299136},{},[299137],{"type":23,"value":299138},"Partner",{"type":17,"tag":7266,"props":299140,"children":299141},{},[299142],{"type":23,"value":299143},"Partner program info, Unified's top-vendor partnerships, lead-gen, co-marketing, support escalation",{"type":17,"tag":7239,"props":299145,"children":299146},{},[299147,299154],{"type":17,"tag":7266,"props":299148,"children":299149},{},[299150],{"type":17,"tag":48,"props":299151,"children":299152},{},[299153],{"type":23,"value":183263},{"type":17,"tag":7266,"props":299155,"children":299156},{},[299157],{"type":23,"value":299158},"Private Slack, ticketing, token health, reauth, 24/7 support",{"type":17,"tag":29,"props":299160,"children":299161},{},[299162],{"type":23,"value":299163},"Whether you're adding your first 5 integrations or scaling to 100+, Unified handles the edge cases that slow teams down, so you can focus on shipping product.",{"type":17,"tag":29,"props":299165,"children":299166},{},[299167,299169,299175,299176,299182],{"type":23,"value":299168},"Ready to replace glue code with something better? ",{"type":17,"tag":133,"props":299170,"children":299172},{"href":1612,"rel":299171},[214],[299173],{"type":23,"value":299174},"Start your trial",{"type":23,"value":75890},{"type":17,"tag":133,"props":299177,"children":299179},{"href":1623,"rel":299178},[214],[299180],{"type":23,"value":299181},"talk to our team",{"type":23,"value":299183}," to see how Unified supports your full integration lifecycle.",{"title":7,"searchDepth":1629,"depth":1629,"links":299185},[299186,299187,299188,299189,299190,299191,299192],{"id":298646,"depth":1629,"text":298649},{"id":298691,"depth":1629,"text":298694},{"id":298758,"depth":1629,"text":298761},{"id":298827,"depth":1629,"text":298830},{"id":298876,"depth":1629,"text":298879},{"id":298964,"depth":1629,"text":298967},{"id":299027,"depth":1629,"text":299030},"content:blog:how_unified_helps_software_companies_add_integrations_from_the_start_to_launch.md","blog/how_unified_helps_software_companies_add_integrations_from_the_start_to_launch.md","blog/how_unified_helps_software_companies_add_integrations_from_the_start_to_launch",{"_path":299197,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":299198,"description":299199,"img":299200,"date":299201,"tag":289978,"body":299202,"_type":1677,"_id":299635,"_source":1679,"_file":299636,"_stem":299637,"_extension":1682},"/blog/how_interstellar_labs_scaled_their_agent_platform_to_enterprise_with_unified","How Interstellar Labs Scaled Their Agent Platform to Enterprise with Unified.to","Interstellar Labs builds AI agents for mid-market and enterprise companies, helping teams orchestrate complex workflows across fragmented SaaS stacks. As they...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_interstellar_labs_scaled_their_agent_platform_to_enterprise_with_unified-icon.png","2025-08-20T00:00:00.000Z",{"type":14,"children":299203,"toc":299625},[299204,299209,299212,299220,299238,299245,299255,299264,299274,299283,299293,299301,299310,299315,299320,299331,299336,299342,299353,299373,299391,299403,299412,299430,299435,299444,299453,299458,299476,299485,299490,299533,299545,299554,299566,299599,299613],{"type":17,"tag":18,"props":299205,"children":299207},{"id":299206},"how-interstellar-labs-scaled-their-agent-platform-to-enterprise-with-unifiedto",[299208],{"type":23,"value":299198},{"type":17,"tag":25,"props":299210,"children":299211},{},[],{"type":17,"tag":29,"props":299213,"children":299214},{},[299215],{"type":17,"tag":33,"props":299216,"children":299217},{},[299218],{"type":23,"value":299219},"August 20, 2025",{"type":17,"tag":29,"props":299221,"children":299222},{},[299223,299225,299230,299232,299236],{"type":23,"value":299224},"Interstellar Labs builds AI agents for mid-market and enterprise companies, helping teams orchestrate complex workflows across fragmented SaaS stacks. As they moved upmarket, integrations became a blocker to growth. To support enterprise clients at scale, they chose ",{"type":17,"tag":133,"props":299226,"children":299228},{"href":42620,"rel":299227},[214],[299229],{"type":23,"value":217},{"type":23,"value":299231}," as their ",{"type":17,"tag":133,"props":299233,"children":299234},{"href":7691},[299235],{"type":23,"value":7459},{"type":23,"value":299237}," platform.",{"type":17,"tag":239,"props":299239,"children":299240},{"id":44585},[299241],{"type":17,"tag":48,"props":299242,"children":299243},{},[299244],{"type":23,"value":44588},{"type":17,"tag":29,"props":299246,"children":299247},{},[299248,299253],{"type":17,"tag":48,"props":299249,"children":299250},{},[299251],{"type":23,"value":299252},"Company:",{"type":23,"value":299254}," Interstellar Labs - Agent Platform",{"type":17,"tag":29,"props":299256,"children":299257},{},[299258,299262],{"type":17,"tag":48,"props":299259,"children":299260},{},[299261],{"type":23,"value":71985},{"type":23,"value":299263}," Enable AI agents to orchestrate workflows across enterprise SaaS ecosystems",{"type":17,"tag":29,"props":299265,"children":299266},{},[299267,299272],{"type":17,"tag":48,"props":299268,"children":299269},{},[299270],{"type":23,"value":299271},"Objective:",{"type":23,"value":299273}," Support any enterprise tech stack without building or maintaining individual integrations",{"type":17,"tag":29,"props":299275,"children":299276},{},[299277,299281],{"type":17,"tag":48,"props":299278,"children":299279},{},[299280],{"type":23,"value":290097},{"type":23,"value":299282}," 2+ years of engineering time avoided",{"type":17,"tag":29,"props":299284,"children":299285},{},[299286,299291],{"type":17,"tag":48,"props":299287,"children":299288},{},[299289],{"type":23,"value":299290},"Results:",{"type":23,"value":299292}," Secured a full-scale enterprise deployment with a Fortune 500 client after removing integration friction during the POC",{"type":17,"tag":29,"props":299294,"children":299295},{},[299296],{"type":17,"tag":6438,"props":299297,"children":299300},{"alt":299298,"src":299299},"Interstellar.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_interstellar_labs_scaled_their_agent_platform_to_enterprise_with_unified-0.png",[],{"type":17,"tag":68,"props":299302,"children":299304},{"id":299303},"integration-demands-were-blocking-enterprise-sales",[299305],{"type":17,"tag":48,"props":299306,"children":299307},{},[299308],{"type":23,"value":299309},"Integration Demands Were Blocking Enterprise Sales",{"type":17,"tag":29,"props":299311,"children":299312},{},[299313],{"type":23,"value":299314},"In early 2025, Interstellar Labs was gaining traction with its AI Agent platform—AI agents that orchestrate intelligent automation across enterprise stacks. The vision was compelling: specialized agents that could unify customer data, predict behaviours, and automate complex workflows across disconnected tools.",{"type":17,"tag":29,"props":299316,"children":299317},{},[299318],{"type":23,"value":299319},"But every enterprise demo hit the same wall. 'Does it work with Greenhouse?' 'We use NetSuite, not QuickBooks.' 'Our entire sales team is on Pipedrive.' Each prospect had a unique combination of tools, and without immediate support for their stack, pilots dragged on and internal champions lost momentum.",{"type":17,"tag":29,"props":299321,"children":299322},{},[299323,299325,299329],{"type":23,"value":299324},"At Interstellar Labs, only two engineers built integrations in-house. After ten weeks, they had shipped only two—Salesforce and Slack. Both were already showing cracks, with Salesforce's API changes breaking sync logic and Slack's ",{"type":17,"tag":133,"props":299326,"children":299327},{"href":135},[299328],{"type":23,"value":138},{"type":23,"value":299330}," causing delays.",{"type":17,"tag":29,"props":299332,"children":299333},{},[299334],{"type":23,"value":299335},"At the same time, a Fortune 500 telecommunications company was evaluating the platform for enterprise-wide deployment—but required support for 50 different tools during the pilot.",{"type":17,"tag":239,"props":299337,"children":299339},{"id":299338},"from-2-integrations-to-300-with-one-api",[299340],{"type":23,"value":299341},"From 2 Integrations to 300+ with One API",{"type":17,"tag":29,"props":299343,"children":299344},{},[299345,299347,299352],{"type":23,"value":299346},"In just three months, Interstellar Labs went from supporting two hand-built integrations to offering 300+ out-of-the-box—all through a single integration with ",{"type":17,"tag":133,"props":299348,"children":299350},{"href":42620,"rel":299349},[214],[299351],{"type":23,"value":217},{"type":23,"value":54},{"type":17,"tag":29,"props":299354,"children":299355},{},[299356,299358,299363,299364,299371],{"type":23,"value":299357},"What would have taken over two years of engineering time was implemented in just a few days. The team connected ",{"type":17,"tag":133,"props":299359,"children":299361},{"href":42620,"rel":299360},[214],[299362],{"type":23,"value":217},{"type":23,"value":290385},{"type":17,"tag":133,"props":299365,"children":299368},{"href":299366,"rel":299367},"https://docs.unified.to/guides/introducing_unified_genai_api#install-the-unifiedto-python-sdk-package",[214],[299369],{"type":23,"value":299370},"Python SDK",{"type":23,"value":299372}," with their Agent Development Kit (ADK), giving their agents real-time access to every supported integration across CRM, ATS, accounting, and messaging platforms.",{"type":17,"tag":29,"props":299374,"children":299375},{},[299376,299378,299382,299384,299389],{"type":23,"value":299377},"The integration experience was straightforward, consistent, and developer-friendly. Rather than managing hundreds of ",{"type":17,"tag":133,"props":299379,"children":299380},{"href":779},[299381],{"type":23,"value":782},{"type":23,"value":299383}," flows, webhooks, and client SDKs, the team maintained a single connection with ",{"type":17,"tag":133,"props":299385,"children":299387},{"href":42620,"rel":299386},[214],[299388],{"type":23,"value":217},{"type":23,"value":299390}," and reused the same API patterns across every tool.",{"type":17,"tag":29,"props":299392,"children":299393},{},[299394,299396,299401],{"type":23,"value":299395},"When a Fortune 500 telecom partner needed support for an unsupported new integration, the ",{"type":17,"tag":133,"props":299397,"children":299399},{"href":42620,"rel":299398},[214],[299400],{"type":23,"value":217},{"type":23,"value":299402}," team delivered that integration within a week — and no code changes were required from Interstellar Labs.",{"type":17,"tag":239,"props":299404,"children":299406},{"id":299405},"integrations-that-scale",[299407],{"type":17,"tag":48,"props":299408,"children":299409},{},[299410],{"type":23,"value":299411},"Integrations That Scale",{"type":17,"tag":29,"props":299413,"children":299414},{},[299415,299417,299422,299424,299429],{"type":23,"value":299416},"The decision to use ",{"type":17,"tag":133,"props":299418,"children":299420},{"href":42620,"rel":299419},[214],[299421],{"type":23,"value":217},{"type":23,"value":299423}," fundamentally changed Interstellar Labs' engineering approach. Instead of maintaining hundreds of OAuth flows, webhook endpoints, and API clients, the team now maintains a single integration with ",{"type":17,"tag":133,"props":299425,"children":299427},{"href":42620,"rel":299426},[214],[299428],{"type":23,"value":217},{"type":23,"value":54},{"type":17,"tag":29,"props":299431,"children":299432},{},[299433],{"type":23,"value":299434},"Implementation with their Agent Development Kit (powered by Google's ADK) was remarkably straightforward:",{"type":17,"tag":6893,"props":299436,"children":299439},{"className":299437,"code":299438,"language":127595,"meta":7},[127593],"# Our agents work with any tool through one unified interface\nfrom unified_to import UnifiedTo\n\nunified = UnifiedTo(api_key=customer_key)\n\n# Same code works regardless of which CRM the customer uses\ncontacts = await unified.crm.list_contacts()\n# Same code for any ATS\ncandidates = await unified.ats.list_candidates()\n# Same code for any accounting system  \ninvoices = await unified.accounting.list_invoices()\n",[299440],{"type":17,"tag":6121,"props":299441,"children":299442},{"__ignoreMap":7},[299443],{"type":23,"value":299438},{"type":17,"tag":239,"props":299445,"children":299447},{"id":299446},"real-time-data-without-the-infrastructure",[299448],{"type":17,"tag":48,"props":299449,"children":299450},{},[299451],{"type":23,"value":299452},"Real-Time Data Without the Infrastructure",{"type":17,"tag":29,"props":299454,"children":299455},{},[299456],{"type":23,"value":299457},"Interstellar Labs' agents make decisions based on live data, requiring real-time access to customer systems. Building that infrastructure internally would have required managing webhook endpoints, handling retries, dealing with rate limits, and maintaining OAuth refresh flows for hundreds of services.",{"type":17,"tag":29,"props":299459,"children":299460},{},[299461,299466,299468,299474],{"type":17,"tag":133,"props":299462,"children":299464},{"href":42620,"rel":299463},[214],[299465],{"type":23,"value":217},{"type":23,"value":299467}," handles all of this. Its real-time architecture ensures agents always work with current data—never cached or stale. ",{"type":17,"tag":133,"props":299469,"children":299472},{"href":299470,"rel":299471},"https://docs.unified.to/concepts/virtual_webhooks#understanding-virtual-webhooks",[214],[299473],{"type":23,"value":9256},{"type":23,"value":299475}," even provide real-time updates from legacy systems that don't natively support webhooks.",{"type":17,"tag":239,"props":299477,"children":299479},{"id":299478},"accelerating-enterprise-growth",[299480],{"type":17,"tag":48,"props":299481,"children":299482},{},[299483],{"type":23,"value":299484},"Accelerating Enterprise Growth",{"type":17,"tag":29,"props":299486,"children":299487},{},[299488],{"type":23,"value":299489},"By removing integration friction, Interstellar Labs transformed its sales motion:",{"type":17,"tag":80,"props":299491,"children":299492},{},[299493,299503,299513,299523],{"type":17,"tag":84,"props":299494,"children":299495},{},[299496,299501],{"type":17,"tag":48,"props":299497,"children":299498},{},[299499],{"type":23,"value":299500},"Sales cycles cut by 60%",{"type":23,"value":299502}," – no more \"we'll build that integration\" delays",{"type":17,"tag":84,"props":299504,"children":299505},{},[299506,299511],{"type":17,"tag":48,"props":299507,"children":299508},{},[299509],{"type":23,"value":299510},"POCs launch in hours",{"type":23,"value":299512}," – customers connect their tools and immediately see value",{"type":17,"tag":84,"props":299514,"children":299515},{},[299516,299521],{"type":17,"tag":48,"props":299517,"children":299518},{},[299519],{"type":23,"value":299520},"Engineering stays focused",{"type":23,"value":299522}," – the team builds agent intelligence, not API plumbing",{"type":17,"tag":84,"props":299524,"children":299525},{},[299526,299531],{"type":17,"tag":48,"props":299527,"children":299528},{},[299529],{"type":23,"value":299530},"Customer trust earned instantly",{"type":23,"value":299532}," – seeing their exact tools supported builds confidence",{"type":17,"tag":29,"props":299534,"children":299535},{},[299536,299538,299543],{"type":23,"value":299537},"Every new integration ",{"type":17,"tag":133,"props":299539,"children":299541},{"href":42620,"rel":299540},[214],[299542],{"type":23,"value":217},{"type":23,"value":299544}," adds becomes immediately available to Interstellar Labs' customers. When Unified.to added 15 new HRIS platforms, every HR agent gained that functionality—no additional development required.",{"type":17,"tag":239,"props":299546,"children":299548},{"id":299547},"expanding-addressable-market",[299549],{"type":17,"tag":48,"props":299550,"children":299551},{},[299552],{"type":23,"value":299553},"Expanding Addressable Market",{"type":17,"tag":29,"props":299555,"children":299556},{},[299557,299559,299564],{"type":23,"value":299558},"Before ",{"type":17,"tag":133,"props":299560,"children":299562},{"href":42620,"rel":299561},[214],[299563],{"type":23,"value":217},{"type":23,"value":299565},", every new integration request meant weeks of engineering work — slowing down sales, delaying POCs, and stalling enterprise momentum. Now they can sell to any enterprise, regardless of its tech stack. This opened up entirely new verticals:",{"type":17,"tag":80,"props":299567,"children":299568},{},[299569,299579,299589],{"type":17,"tag":84,"props":299570,"children":299571},{},[299572,299577],{"type":17,"tag":48,"props":299573,"children":299574},{},[299575],{"type":23,"value":299576},"Financial services",{"type":23,"value":299578}," leveraging agents to act on CRM and accounting data across tools like Salesforce and NetSuite",{"type":17,"tag":84,"props":299580,"children":299581},{},[299582,299587],{"type":17,"tag":48,"props":299583,"children":299584},{},[299585],{"type":23,"value":299586},"Recruiting and HR platforms",{"type":23,"value":299588}," integrating with ATS systems like Greenhouse, Lever, and BambooHR",{"type":17,"tag":84,"props":299590,"children":299591},{},[299592,299597],{"type":17,"tag":48,"props":299593,"children":299594},{},[299595],{"type":23,"value":299596},"SaaS vendors with enterprise clients",{"type":23,"value":299598},", where Interstellar agents orchestrate customer data across CRMs, messaging tools, and storage platforms",{"type":17,"tag":29,"props":299600,"children":299601},{},[299602,299604,299611],{"type":23,"value":299603},"Each new customer can connect their full stack in under 10 minutes using Unified.to's ",{"type":17,"tag":133,"props":299605,"children":299608},{"href":299606,"rel":299607},"https://docs.unified.to/concepts/embedded-components",[214],[299609],{"type":23,"value":299610},"embedded auth component",{"type":23,"value":299612},". Interstellar Labs' agents immediately understand the data model and begin orchestrating workflows across all systems.",{"type":17,"tag":29,"props":299614,"children":299615},{},[299616,299618,299623],{"type":23,"value":299617},"Today, Interstellar Labs no longer worries about integration gaps or maintenance overhead. With ",{"type":17,"tag":133,"props":299619,"children":299621},{"href":42620,"rel":299620},[214],[299622],{"type":23,"value":217},{"type":23,"value":299624},", they can confidently scale their AI agents across any enterprise stack—faster, more reliably, and with far less engineering effort.",{"title":7,"searchDepth":1629,"depth":1629,"links":299626},[299627,299628],{"id":44585,"depth":1635,"text":44588},{"id":299303,"depth":1629,"text":299309,"children":299629},[299630,299631,299632,299633,299634],{"id":299338,"depth":1635,"text":299341},{"id":299405,"depth":1635,"text":299411},{"id":299446,"depth":1635,"text":299452},{"id":299478,"depth":1635,"text":299484},{"id":299547,"depth":1635,"text":299553},"content:blog:how_interstellar_labs_scaled_their_agent_platform_to_enterprise_with_unified.md","blog/how_interstellar_labs_scaled_their_agent_platform_to_enterprise_with_unified.md","blog/how_interstellar_labs_scaled_their_agent_platform_to_enterprise_with_unified",{"_path":299639,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":299640,"description":299641,"img":299642,"date":299643,"tag":6341,"body":299644,"_type":1677,"_id":299949,"_source":1679,"_file":299950,"_stem":299951,"_extension":1682},"/blog/how_to_use_user_provisioning_and_verification_with_unified","How to use User Provisioning and Verification with Unified","With Unified's SCIM API devs can build use provisioning features that work with any HRIS integration like BambooHR, Workday and any other ATS integration that...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_user_provisioning_and_verification_with_unified-icon.png","2025-08-10T00:00:00.000Z",{"type":14,"children":299645,"toc":299936},[299646,299651,299654,299662,299667,299680,299685,299689,299714,299718,299723,299733,299743,299746,299750,299759,299769,299778,299781,299785,299794,299797,299801,299806,299811,299814,299820,299829,299832,299838,299847,299850,299856,299865,299868,299874,299883,299886,299892,299903,299912,299915,299919,299928,299931],{"type":17,"tag":18,"props":299647,"children":299649},{"id":299648},"how-to-use-user-provisioning-and-verification-with-unified",[299650],{"type":23,"value":299640},{"type":17,"tag":25,"props":299652,"children":299653},{},[],{"type":17,"tag":29,"props":299655,"children":299656},{},[299657],{"type":17,"tag":33,"props":299658,"children":299659},{},[299660],{"type":23,"value":299661},"August 10, 2025",{"type":17,"tag":18,"props":299663,"children":299665},{"id":299664},"user-provisioning-and-verification-with-unified",[299666],{"type":23,"value":266574},{"type":17,"tag":29,"props":299668,"children":299669},{},[299670,299672,299678],{"type":23,"value":299671},"With Unified's ",{"type":17,"tag":133,"props":299673,"children":299675},{"href":299674},"/scim",[299676],{"type":23,"value":299677},"SCIM API",{"type":23,"value":299679}," devs can build use provisioning features that work with any HRIS integration like BambooHR, Workday and any other ATS integration that Unified connects to. You can create, update, list and delete users in your customers employee directories.",{"type":17,"tag":29,"props":299681,"children":299682},{},[299683],{"type":23,"value":299684},"In this guide, I will show you how to provision users using the SDK, with BambooHR as an example. The same approach works for all Unified HR integrations.",{"type":17,"tag":68,"props":299686,"children":299687},{"id":141798},[299688],{"type":23,"value":141801},{"type":17,"tag":80,"props":299690,"children":299691},{},[299692,299696,299701,299709],{"type":17,"tag":84,"props":299693,"children":299694},{},[299695],{"type":23,"value":276661},{"type":17,"tag":84,"props":299697,"children":299698},{},[299699],{"type":23,"value":299700},"Unified account with at least one HR integration enabled (e.g. for this example we are using BambooHR)",{"type":17,"tag":84,"props":299702,"children":299703},{},[299704,299708],{"type":17,"tag":133,"props":299705,"children":299706},{"href":7691},[299707],{"type":23,"value":7806},{"type":23,"value":199699},{"type":17,"tag":84,"props":299710,"children":299711},{},[299712],{"type":23,"value":299713},"Your customer's HR connection ID",{"type":17,"tag":68,"props":299715,"children":299716},{"id":269318},[299717],{"type":23,"value":269321},{"type":17,"tag":29,"props":299719,"children":299720},{},[299721],{"type":23,"value":299722},"Unified's API works with 170+ HR integrations (BambooHR, Workday, HiBob, Gusto, etc.) and 5+ verification providers (Certn, Checkr, First Advantage, Verifiable, Yardstik).",{"type":17,"tag":29,"props":299724,"children":299725},{},[299726],{"type":17,"tag":133,"props":299727,"children":299730},{"href":299728,"rel":299729},"https://docs.unified.to/hris/integrations",[214],[299731],{"type":23,"value":299732},"See all HR integrations",{"type":17,"tag":29,"props":299734,"children":299735},{},[299736],{"type":17,"tag":133,"props":299737,"children":299740},{"href":299738,"rel":299739},"https://docs.unified.to/verification/integrations",[214],[299741],{"type":23,"value":299742},"See all verification integrations",{"type":17,"tag":25,"props":299744,"children":299745},{},[],{"type":17,"tag":68,"props":299747,"children":299748},{"id":276695},[299749],{"type":23,"value":276698},{"type":17,"tag":6893,"props":299751,"children":299754},{"className":299752,"code":299753,"language":48432,"meta":7},[48430],"mkdir user-verification-demo\ncd user-verification-demo\nnpm init -y\nnpm install @unified-api/typescript-sdk dotenv\n",[299755],{"type":17,"tag":6121,"props":299756,"children":299757},{"__ignoreMap":7},[299758],{"type":23,"value":299753},{"type":17,"tag":29,"props":299760,"children":299761},{},[299762,299763,299768],{"type":23,"value":276717},{"type":17,"tag":6121,"props":299764,"children":299766},{"className":299765},[],[299767],{"type":23,"value":211221},{"type":23,"value":20456},{"type":17,"tag":6893,"props":299770,"children":299773},{"className":299771,"code":299772,"language":20901,"meta":23},[20899],"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_BAMBOOHR=your_customer_bamboohr_connection_id\nCONNECTION_VERIFICATION=your_customer_verification_connection_id\n",[299774],{"type":17,"tag":6121,"props":299775,"children":299776},{"__ignoreMap":7},[299777],{"type":23,"value":299772},{"type":17,"tag":25,"props":299779,"children":299780},{},[],{"type":17,"tag":68,"props":299782,"children":299783},{"id":211235},[299784],{"type":23,"value":211238},{"type":17,"tag":6893,"props":299786,"children":299789},{"className":299787,"code":299788,"language":18718,"meta":7},[18716],"import 'dotenv/config';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_BAMBOOHR, CONNECTION_VERIFICATION } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[299790],{"type":17,"tag":6121,"props":299791,"children":299792},{"__ignoreMap":7},[299793],{"type":23,"value":299788},{"type":17,"tag":25,"props":299795,"children":299796},{},[],{"type":17,"tag":68,"props":299798,"children":299799},{"id":276756},[299800],{"type":23,"value":276759},{"type":17,"tag":29,"props":299802,"children":299803},{},[299804],{"type":23,"value":299805},"Before you get started, your end customer must authorize your app to access their HRIs integration via Unified's auth flow.",{"type":17,"tag":29,"props":299807,"children":299808},{},[299809],{"type":23,"value":299810},"Once authorized, you will receive a connection ID for that customer's integration. Store this carefully and use it in all API calls for that specific customer.",{"type":17,"tag":25,"props":299812,"children":299813},{},[],{"type":17,"tag":68,"props":299815,"children":299817},{"id":299816},"step-4-creating-a-user-provisioning",[299818],{"type":23,"value":299819},"Step 4: Creating a User (Provisioning)",{"type":17,"tag":6893,"props":299821,"children":299824},{"className":299822,"code":299823,"language":18718,"meta":7},[18716],"export async function createUser(connectionId: string, email: string, firstName: string, lastName: string) {\n  const employee = await sdk.hris.createHrisEmployee({\n    connectionId,\n    hrisEmployee: {\n      name: `${firstName} ${lastName}`,\n      emails: [{ email }],\n      firstName,\n      lastName,\n      employmentStatus: \"ACTIVE\",\n    },\n  });\n  return employee; // HrisEmployee\n}\n",[299825],{"type":17,"tag":6121,"props":299826,"children":299827},{"__ignoreMap":7},[299828],{"type":23,"value":299823},{"type":17,"tag":25,"props":299830,"children":299831},{},[],{"type":17,"tag":68,"props":299833,"children":299835},{"id":299834},"step-5-listing-users",[299836],{"type":23,"value":299837},"Step 5: Listing Users",{"type":17,"tag":6893,"props":299839,"children":299842},{"className":299840,"code":299841,"language":18718,"meta":7},[18716],"export async function listUsers(connectionId: string) {\n  const employees = await sdk.hris.listHrisEmployees({\n    connectionId,\n    limit: 10,\n  });\n  return employees; // HrisEmployee[]\n}\n",[299843],{"type":17,"tag":6121,"props":299844,"children":299845},{"__ignoreMap":7},[299846],{"type":23,"value":299841},{"type":17,"tag":25,"props":299848,"children":299849},{},[],{"type":17,"tag":68,"props":299851,"children":299853},{"id":299852},"step-6-updating-a-user",[299854],{"type":23,"value":299855},"Step 6: Updating a User",{"type":17,"tag":6893,"props":299857,"children":299860},{"className":299858,"code":299859,"language":18718,"meta":7},[18716],"export async function updateUserStatus(connectionId: string, userId: string, status: \"ACTIVE\" | \"INACTIVE\") {\n  const updated = await sdk.hris.updateHrisEmployee({\n    connectionId,\n    id: userId,\n    hrisEmployee: { employmentStatus: status },\n  });\n  return updated; // HrisEmployee\n}\n",[299861],{"type":17,"tag":6121,"props":299862,"children":299863},{"__ignoreMap":7},[299864],{"type":23,"value":299859},{"type":17,"tag":25,"props":299866,"children":299867},{},[],{"type":17,"tag":68,"props":299869,"children":299871},{"id":299870},"step-7-deactivating-a-user-recommended",[299872],{"type":23,"value":299873},"Step 7: Deactivating a User (Recommended)",{"type":17,"tag":6893,"props":299875,"children":299878},{"className":299876,"code":299877,"language":18718,"meta":7},[18716],"export async function deactivateUser(connectionId: string, userId: string) {\n  // Some providers (e.g., BambooHR) do not support delete; set status to INACTIVE instead\n  const updated = await sdk.hris.updateHrisEmployee({\n    connectionId,\n    id: userId,\n    hrisEmployee: { employmentStatus: \"INACTIVE\" },\n  });\n  return updated;\n}\n",[299879],{"type":17,"tag":6121,"props":299880,"children":299881},{"__ignoreMap":7},[299882],{"type":23,"value":299877},{"type":17,"tag":25,"props":299884,"children":299885},{},[],{"type":17,"tag":68,"props":299887,"children":299889},{"id":299888},"step-8-verifying-a-user-background-check-license-etc",[299890],{"type":23,"value":299891},"Step 8: Verifying a User (Background Check, License, etc.)",{"type":17,"tag":29,"props":299893,"children":299894},{},[299895,299897,299901],{"type":23,"value":299896},"Unified's new ",{"type":17,"tag":133,"props":299898,"children":299899},{"href":53443},[299900],{"type":23,"value":54031},{"type":23,"value":299902}," lets you trigger background checks, license verifications, and more, using providers like Certn, Checkr, and others.",{"type":17,"tag":6893,"props":299904,"children":299907},{"className":299905,"code":299906,"language":18718,"meta":7},[18716],"export async function listVerificationRequests(connectionId: string) {\n  // Listing requests is supported across providers; creation may vary by provider/package\n  const requests = await sdk.verification.listVerificationRequests({\n    connectionId,\n    limit: 10,\n  });\n  return requests;\n}\n",[299908],{"type":17,"tag":6121,"props":299909,"children":299910},{"__ignoreMap":7},[299911],{"type":23,"value":299906},{"type":17,"tag":25,"props":299913,"children":299914},{},[],{"type":17,"tag":68,"props":299916,"children":299917},{"id":287448},[299918],{"type":23,"value":287451},{"type":17,"tag":6893,"props":299920,"children":299923},{"className":299921,"code":299922,"language":18718,"meta":7},[18716],"async function main() {\n  // 1. Create a user\n  const user = await createUser(CONNECTION_BAMBOOHR!, \"jane.doe@example.com\", \"Jane\", \"Doe\");\n\n  // 2. List users\n  const users = await listUsers(CONNECTION_BAMBOOHR!);\n\n  // 3. Update (deactivate) user\n  if (user?.id) {\n    const updated = await updateUserStatus(CONNECTION_BAMBOOHR!, user.id, \"INACTIVE\");\n    console.log(\"Updated user:\", updated);\n  }\n\n  // 4. List verification requests (optional)\n  if (CONNECTION_VERIFICATION) {\n    const requests = await listVerificationRequests(CONNECTION_VERIFICATION!);\n    console.log(\"Verification requests:\", requests.length);\n  }\n\n  console.log(\"Users:\", users.length);\n}\n\nmain();\n",[299924],{"type":17,"tag":6121,"props":299925,"children":299926},{"__ignoreMap":7},[299927],{"type":23,"value":299922},{"type":17,"tag":25,"props":299929,"children":299930},{},[],{"type":17,"tag":29,"props":299932,"children":299933},{},[299934],{"type":23,"value":299935},"And that's it - **Happy Building ** 🎉",{"title":7,"searchDepth":1629,"depth":1629,"links":299937},[299938,299939,299940,299941,299942,299943,299944,299945,299946,299947,299948],{"id":141798,"depth":1629,"text":141801},{"id":269318,"depth":1629,"text":269321},{"id":276695,"depth":1629,"text":276698},{"id":211235,"depth":1629,"text":211238},{"id":276756,"depth":1629,"text":276759},{"id":299816,"depth":1629,"text":299819},{"id":299834,"depth":1629,"text":299837},{"id":299852,"depth":1629,"text":299855},{"id":299870,"depth":1629,"text":299873},{"id":299888,"depth":1629,"text":299891},{"id":287448,"depth":1629,"text":287451},"content:blog:how_to_use_user_provisioning_and_verification_with_unified.md","blog/how_to_use_user_provisioning_and_verification_with_unified.md","blog/how_to_use_user_provisioning_and_verification_with_unified",{"_path":299953,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":299954,"description":299955,"img":299956,"date":299957,"tag":6341,"body":299958,"_type":1677,"_id":300461,"_source":1679,"_file":300462,"_stem":300463,"_extension":1682},"/blog/how_to_handle_attachments_in_invoice_bill_and_credit_memo","How to Handle Attachments in Invoice, Bill and Credit Memo","Unified.to provides a standardized way to read, upload, and manage attachments (e.g., invoices, receipts, contracts) across various integrations like...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_handle_attachments_in_invoice_bill_and_credit_memo-icon.png","2025-08-05T00:00:00.000Z",{"type":14,"children":299959,"toc":300451},[299960,299965,299968,299976,299988,299991,299997,300002,300060,300078,300081,300087,300092,300107,300137,300140,300146,300151,300182,300186,300195,300198,300204,300209,300241,300244,300250,300262,300284,300287,300293,300298,300332,300336,300390,300395,300399,300408,300411,300417,300429,300432,300438],{"type":17,"tag":18,"props":299961,"children":299963},{"id":299962},"how-to-handle-attachments-in-invoice-bill-and-credit-memo",[299964],{"type":23,"value":299954},{"type":17,"tag":25,"props":299966,"children":299967},{},[],{"type":17,"tag":29,"props":299969,"children":299970},{},[299971],{"type":17,"tag":33,"props":299972,"children":299973},{},[299974],{"type":23,"value":299975},"August 5, 2025",{"type":17,"tag":29,"props":299977,"children":299978},{},[299979,299981,299987],{"type":23,"value":299980},"Unified.to provides a standardized way to read, upload, and manage attachments (e.g., invoices, receipts, contracts) across various integrations like accounting, CRM, and etc platforms. Here's everything you need to know to get started with attachments via the ",{"type":17,"tag":6121,"props":299982,"children":299984},{"className":299983},[],[299985],{"type":23,"value":299986},"Storage File",{"type":23,"value":290982},{"type":17,"tag":25,"props":299989,"children":299990},{},[],{"type":17,"tag":239,"props":299992,"children":299994},{"id":299993},"how-to-check-if-an-integration-supports-attachments",[299995],{"type":23,"value":299996},"🔍 How to Check If an Integration Supports Attachments",{"type":17,"tag":29,"props":299998,"children":299999},{},[300000],{"type":23,"value":300001},"To check if a specific integration supports reading or writing attachments:",{"type":17,"tag":6154,"props":300003,"children":300004},{},[300005,300015,300024,300041],{"type":17,"tag":84,"props":300006,"children":300007},{},[300008,300013],{"type":17,"tag":48,"props":300009,"children":300010},{},[300011],{"type":23,"value":300012},"Go to the Integration Page",{"type":23,"value":300014}," in the Unified.to dashboard.",{"type":17,"tag":84,"props":300016,"children":300017},{},[300018,300019,300023],{"type":23,"value":42939},{"type":17,"tag":48,"props":300020,"children":300021},{},[300022],{"type":23,"value":211607},{"type":23,"value":54},{"type":17,"tag":84,"props":300025,"children":300026},{},[300027,300029,300033,300034,300040],{"type":23,"value":300028},"Select the relevant ",{"type":17,"tag":48,"props":300030,"children":300031},{},[300032],{"type":23,"value":132141},{"type":23,"value":149495},{"type":17,"tag":6121,"props":300035,"children":300037},{"className":300036},[],[300038],{"type":23,"value":300039},"Accounting → Invoice",{"type":23,"value":129328},{"type":17,"tag":84,"props":300042,"children":300043},{},[300044,300046,300051,300053,300058],{"type":23,"value":300045},"Look under ",{"type":17,"tag":48,"props":300047,"children":300048},{},[300049],{"type":23,"value":300050},"Readable Fields",{"type":23,"value":300052}," — if ",{"type":17,"tag":6121,"props":300054,"children":300056},{"className":300055},[],[300057],{"type":23,"value":33472},{"type":23,"value":300059}," is listed, the endpoint supports reading attachments.",{"type":17,"tag":29,"props":300061,"children":300062},{},[300063,300065,300070,300072,300077],{"type":23,"value":300064},"🛠️ ",{"type":17,"tag":48,"props":300066,"children":300067},{},[300068],{"type":23,"value":300069},"Tip:",{"type":23,"value":300071}," You can also check support programmatically using the ",{"type":17,"tag":6121,"props":300073,"children":300075},{"className":300074},[],[300076],{"type":23,"value":28977},{"type":23,"value":290982},{"type":17,"tag":25,"props":300079,"children":300080},{},[],{"type":17,"tag":239,"props":300082,"children":300084},{"id":300083},"how-to-list-all-attachments",[300085],{"type":23,"value":300086},"📂 How to List All Attachments",{"type":17,"tag":29,"props":300088,"children":300089},{},[300090],{"type":23,"value":300091},"To fetch all available attachments across an integration:",{"type":17,"tag":80,"props":300093,"children":300094},{},[300095],{"type":17,"tag":84,"props":300096,"children":300097},{},[300098,300099,300105],{"type":23,"value":48249},{"type":17,"tag":6121,"props":300100,"children":300102},{"className":300101},[],[300103],{"type":23,"value":300104},"GET /storage",{"type":23,"value":300106}," (Storage File List) endpoint.",{"type":17,"tag":29,"props":300108,"children":300109},{},[300110,300112,300116,300118,300123,300125,300129,300130,300135],{"type":23,"value":300111},"⚠️ ",{"type":17,"tag":48,"props":300113,"children":300114},{},[300115],{"type":23,"value":103346},{"type":23,"value":300117}," Most integrations ",{"type":17,"tag":48,"props":300119,"children":300120},{},[300121],{"type":23,"value":300122},"do not support",{"type":23,"value":300124}," listing all attachments globally. Unified.to reflects this limitation. However, some integrations like ",{"type":17,"tag":48,"props":300126,"children":300127},{},[300128],{"type":23,"value":59367},{"type":23,"value":18757},{"type":17,"tag":33,"props":300131,"children":300132},{},[300133],{"type":23,"value":300134},"do",{"type":23,"value":300136}," support it.",{"type":17,"tag":25,"props":300138,"children":300139},{},[],{"type":17,"tag":239,"props":300141,"children":300143},{"id":300142},"how-to-fetch-attachments-for-a-specific-record-eg-invoice",[300144],{"type":23,"value":300145},"📌 How to Fetch Attachments for a Specific Record (e.g., Invoice)",{"type":17,"tag":29,"props":300147,"children":300148},{},[300149],{"type":23,"value":300150},"To get attachments for a specific entity like an invoice, bill, or candidate:",{"type":17,"tag":80,"props":300152,"children":300153},{},[300154,300164],{"type":17,"tag":84,"props":300155,"children":300156},{},[300157,300158,300163],{"type":23,"value":48249},{"type":17,"tag":6121,"props":300159,"children":300161},{"className":300160},[],[300162],{"type":23,"value":300104},{"type":23,"value":290982},{"type":17,"tag":84,"props":300165,"children":300166},{},[300167,300169,300174,300175,300180],{"type":23,"value":300168},"Pass the corresponding ",{"type":17,"tag":6121,"props":300170,"children":300172},{"className":300171},[],[300173],{"type":23,"value":15863},{"type":23,"value":149495},{"type":17,"tag":6121,"props":300176,"children":300178},{"className":300177},[],[300179],{"type":23,"value":109123},{"type":23,"value":300181},") in the query parameters.",{"type":17,"tag":29,"props":300183,"children":300184},{},[300185],{"type":23,"value":19878},{"type":17,"tag":6893,"props":300187,"children":300190},{"className":300188,"code":300189,"language":20901,"meta":23},[20899],"http\nCopyEdit\nGET /storage-file?parent_id=inv_1234\n",[300191],{"type":17,"tag":6121,"props":300192,"children":300193},{"__ignoreMap":7},[300194],{"type":23,"value":300189},{"type":17,"tag":25,"props":300196,"children":300197},{},[],{"type":17,"tag":239,"props":300199,"children":300201},{"id":300200},"how-to-get-details-of-a-specific-attachment",[300202],{"type":23,"value":300203},"🧾 How to Get Details of a Specific Attachment",{"type":17,"tag":29,"props":300205,"children":300206},{},[300207],{"type":23,"value":300208},"To retrieve metadata (name, file type, size, etc.) of a particular attachment:",{"type":17,"tag":80,"props":300210,"children":300211},{},[300212],{"type":17,"tag":84,"props":300213,"children":300214},{},[300215,300217],{"type":23,"value":300216},"Use either:\n",{"type":17,"tag":80,"props":300218,"children":300219},{},[300220,300231],{"type":17,"tag":84,"props":300221,"children":300222},{},[300223,300229],{"type":17,"tag":6121,"props":300224,"children":300226},{"className":300225},[],[300227],{"type":23,"value":300228},"GET /storage/:id",{"type":23,"value":300230}," — to get a single attachment",{"type":17,"tag":84,"props":300232,"children":300233},{},[300234,300239],{"type":17,"tag":6121,"props":300235,"children":300237},{"className":300236},[],[300238],{"type":23,"value":300104},{"type":23,"value":300240}," — to filter and retrieve multiple files with query params",{"type":17,"tag":25,"props":300242,"children":300243},{},[],{"type":17,"tag":239,"props":300245,"children":300247},{"id":300246},"how-to-download-an-attachment",[300248],{"type":23,"value":300249},"📥 How to Download an Attachment",{"type":17,"tag":29,"props":300251,"children":300252},{},[300253,300255,300260],{"type":23,"value":300254},"We return a secure ",{"type":17,"tag":6121,"props":300256,"children":300258},{"className":300257},[],[300259],{"type":23,"value":24978},{"type":23,"value":300261}," in the response when you fetch an attachment. You can use this URL to download the file directly.",{"type":17,"tag":29,"props":300263,"children":300264},{},[300265,300266,300270,300271,300276,300277,300282],{"type":23,"value":300111},{"type":17,"tag":48,"props":300267,"children":300268},{},[300269],{"type":23,"value":103346},{"type":23,"value":257157},{"type":17,"tag":6121,"props":300272,"children":300274},{"className":300273},[],[300275],{"type":23,"value":24978},{"type":23,"value":224475},{"type":17,"tag":48,"props":300278,"children":300279},{},[300280],{"type":23,"value":300281},"time-limited",{"type":23,"value":300283}," and expires after a few minutes for security reasons. Always use the URL shortly after fetching.",{"type":17,"tag":25,"props":300285,"children":300286},{},[],{"type":17,"tag":239,"props":300288,"children":300290},{"id":300289},"how-to-upload-or-create-an-attachment",[300291],{"type":23,"value":300292},"📤 How to Upload or Create an Attachment",{"type":17,"tag":29,"props":300294,"children":300295},{},[300296],{"type":23,"value":300297},"To upload a new attachment:",{"type":17,"tag":6154,"props":300299,"children":300300},{},[300301,300320],{"type":17,"tag":84,"props":300302,"children":300303},{},[300304,300305,300310,300312,300318],{"type":23,"value":146849},{"type":17,"tag":48,"props":300306,"children":300307},{},[300308],{"type":23,"value":300309},"Integration Page",{"type":23,"value":300311}," and confirm the ",{"type":17,"tag":6121,"props":300313,"children":300315},{"className":300314},[],[300316],{"type":23,"value":300317},"storage-file",{"type":23,"value":300319}," endpoint is supported under Feature Support.",{"type":17,"tag":84,"props":300321,"children":300322},{},[300323,300324,300330],{"type":23,"value":48249},{"type":17,"tag":6121,"props":300325,"children":300327},{"className":300326},[],[300328],{"type":23,"value":300329},"POST /storage-file",{"type":23,"value":300331}," endpoint with required fields.",{"type":17,"tag":29,"props":300333,"children":300334},{},[300335],{"type":23,"value":111468},{"type":17,"tag":80,"props":300337,"children":300338},{},[300339,300347,300362],{"type":17,"tag":84,"props":300340,"children":300341},{},[300342],{"type":17,"tag":6121,"props":300343,"children":300345},{"className":300344},[],[300346],{"type":23,"value":18781},{"type":17,"tag":84,"props":300348,"children":300349},{},[300350,300355,300357],{"type":17,"tag":6121,"props":300351,"children":300353},{"className":300352},[],[300354],{"type":23,"value":143728},{"type":23,"value":300356}," (base64 encoded) | ",{"type":17,"tag":6121,"props":300358,"children":300360},{"className":300359},[],[300361],{"type":23,"value":24978},{"type":17,"tag":84,"props":300363,"children":300364},{},[300365,300370,300371,300376,300377,300383,300384,300389],{"type":17,"tag":6121,"props":300366,"children":300368},{"className":300367},[],[300369],{"type":23,"value":15863},{"type":23,"value":149495},{"type":17,"tag":6121,"props":300372,"children":300374},{"className":300373},[],[300375],{"type":23,"value":109123},{"type":23,"value":11826},{"type":17,"tag":6121,"props":300378,"children":300380},{"className":300379},[],[300381],{"type":23,"value":300382},"bill_id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":300385,"children":300387},{"className":300386},[],[300388],{"type":23,"value":189411},{"type":23,"value":12034},{"type":17,"tag":29,"props":300391,"children":300392},{},[300393],{"type":23,"value":300394},"Unified.to will automatically associate the attachment with the parent entity.",{"type":17,"tag":29,"props":300396,"children":300397},{},[300398],{"type":23,"value":122773},{"type":17,"tag":6893,"props":300400,"children":300403},{"className":300401,"code":300402,"language":22503,"meta":7},[22501],"json\nCopyEdit\n{\n  \"file_name\": \"invoice-august.pdf\",\n  \"file_data\": \"base64-encoded-data\",\n  \"parent_id\": \"inv_1234\"\n}\n",[300404],{"type":17,"tag":6121,"props":300405,"children":300406},{"__ignoreMap":7},[300407],{"type":23,"value":300402},{"type":17,"tag":25,"props":300409,"children":300410},{},[],{"type":17,"tag":239,"props":300412,"children":300414},{"id":300413},"how-to-associate-an-attachment-with-an-entity",[300415],{"type":23,"value":300416},"🧷 How to Associate an Attachment with an Entity",{"type":17,"tag":29,"props":300418,"children":300419},{},[300420,300422,300427],{"type":23,"value":300421},"When uploading a file, simply set the ",{"type":17,"tag":6121,"props":300423,"children":300425},{"className":300424},[],[300426],{"type":23,"value":15863},{"type":23,"value":300428}," to the ID of the resource (invoice, bill, employee, etc.). Unified.to handles the rest — no extra linking needed.",{"type":17,"tag":25,"props":300430,"children":300431},{},[],{"type":17,"tag":239,"props":300433,"children":300435},{"id":300434},"questions-or-requests",[300436],{"type":23,"value":300437},"💬 Questions or Requests?",{"type":17,"tag":80,"props":300439,"children":300440},{},[300441,300446],{"type":17,"tag":84,"props":300442,"children":300443},{},[300444],{"type":23,"value":300445},"If you're unsure whether an integration supports attachments for a specific resource type, reach out to our support team.",{"type":17,"tag":84,"props":300447,"children":300448},{},[300449],{"type":23,"value":300450},"If a feature isn't currently supported, let us know! We're always looking to expand support where possible.",{"title":7,"searchDepth":1629,"depth":1629,"links":300452},[300453,300454,300455,300456,300457,300458,300459,300460],{"id":299993,"depth":1635,"text":299996},{"id":300083,"depth":1635,"text":300086},{"id":300142,"depth":1635,"text":300145},{"id":300200,"depth":1635,"text":300203},{"id":300246,"depth":1635,"text":300249},{"id":300289,"depth":1635,"text":300292},{"id":300413,"depth":1635,"text":300416},{"id":300434,"depth":1635,"text":300437},"content:blog:how_to_handle_attachments_in_invoice_bill_and_credit_memo.md","blog/how_to_handle_attachments_in_invoice_bill_and_credit_memo.md","blog/how_to_handle_attachments_in_invoice_bill_and_credit_memo",{"_path":300465,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":300466,"description":300467,"img":300468,"date":300469,"tag":12,"body":300470,"_type":1677,"_id":300884,"_source":1679,"_file":300885,"_stem":300886,"_extension":1682},"/blog/july_2025_product_updates","July 2025 product updates","Last month, we added structured Category support across accounting platforms, expanded webhook and object coverage for high-volume financial records, and...","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2025_product_updates-icon.png","2025-08-04T00:00:00.000Z",{"type":14,"children":300471,"toc":300876},[300472,300477,300480,300488,300496,300507,300512,300518,300560,300564,300576,300644,300649,300655,300660,300710,300715,300720,300752,300758,300763,300796,300800,300847,300852,300864],{"type":17,"tag":18,"props":300473,"children":300475},{"id":300474},"july-2025-product-updates",[300476],{"type":23,"value":300466},{"type":17,"tag":25,"props":300478,"children":300479},{},[],{"type":17,"tag":29,"props":300481,"children":300482},{},[300483],{"type":17,"tag":33,"props":300484,"children":300485},{},[300486],{"type":23,"value":300487},"August 4, 2025",{"type":17,"tag":29,"props":300489,"children":300490},{},[300491],{"type":17,"tag":6438,"props":300492,"children":300495},{"alt":300493,"src":300494},"July_Update.png","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2025_product_updates-0.png",[],{"type":17,"tag":29,"props":300497,"children":300498},{},[300499,300501,300505],{"type":23,"value":300500},"Last month, we added structured Category support across accounting platforms, expanded webhook and object coverage for high-volume financial records, and delivered key upgrades to the [Unified ",{"type":17,"tag":133,"props":300502,"children":300503},{"href":326},[300504],{"type":23,"value":329},{"type":23,"value":300506},"](/mcp) server to support sensitive data handling, aliasing, and Cohere-native output.",{"type":17,"tag":29,"props":300508,"children":300509},{},[300510],{"type":23,"value":300511},"Unified continues to help technical teams power AI-ready workflows with normalized, real-time data across finance, HR, messaging, and productivity tools.",{"type":17,"tag":239,"props":300513,"children":300515},{"id":300514},"new-product-components",[300516],{"type":23,"value":300517},"New product components",{"type":17,"tag":80,"props":300519,"children":300520},{},[300521,300541],{"type":17,"tag":84,"props":300522,"children":300523},{},[300524,300534,300536,300540],{"type":17,"tag":133,"props":300525,"children":300528},{"href":300526,"rel":300527},"https://app.unified.to/embed?tab=CalendarScheduler",[214],[300529],{"type":17,"tag":48,"props":300530,"children":300531},{},[300532],{"type":23,"value":300533},"Calendar Scheduler",{"type":23,"value":300535},": A customizable component for booking meetings and appointments using Unified's ",{"type":17,"tag":133,"props":300537,"children":300538},{"href":13708},[300539],{"type":23,"value":98258},{"type":23,"value":54},{"type":17,"tag":84,"props":300542,"children":300543},{},[300544,300554,300558],{"type":17,"tag":133,"props":300545,"children":300548},{"href":300546,"rel":300547},"https://unified.to/sso",[214],[300549],{"type":17,"tag":48,"props":300550,"children":300551},{},[300552],{"type":23,"value":300553},"Unified SSO",{"type":17,"tag":48,"props":300555,"children":300556},{},[300557],{"type":23,"value":20456},{"type":23,"value":300559}," Add login via Google, Microsoft, Slack, Salesforce, QuickBooks, and 90+ more providers—without building OAuth flows. Just redirect users to a single URL and receive their verified identity in seconds.",{"type":17,"tag":239,"props":300561,"children":300562},{"id":287542},[300563],{"type":23,"value":287545},{"type":17,"tag":29,"props":300565,"children":300566},{},[300567,300569,300574],{"type":23,"value":300568},"We shipped several infrastructure-level enhancements to the ",{"type":17,"tag":133,"props":300570,"children":300572},{"href":45414,"rel":300571},[214],[300573],{"type":23,"value":45418},{"type":23,"value":300575}," server for better LLM tool security and compatibility.",{"type":17,"tag":80,"props":300577,"children":300578},{},[300579,300604],{"type":17,"tag":84,"props":300580,"children":300581},{},[300582,300587,300589,300593,300595,300599,300600],{"type":17,"tag":48,"props":300583,"children":300584},{},[300585],{"type":23,"value":300586},"New compatibility",{"type":23,"value":300588},": Tools now structured natively for ",{"type":17,"tag":48,"props":300590,"children":300591},{},[300592],{"type":23,"value":16525},{"type":23,"value":300594},", ",{"type":17,"tag":48,"props":300596,"children":300597},{},[300598],{"type":23,"value":16104},{"type":23,"value":12561},{"type":17,"tag":48,"props":300601,"children":300602},{},[300603],{"type":23,"value":137567},{"type":17,"tag":84,"props":300605,"children":300606},{},[300607,300612,300613],{"type":17,"tag":48,"props":300608,"children":300609},{},[300610],{"type":23,"value":300611},"Security enhancements",{"type":23,"value":282122},{"type":17,"tag":80,"props":300614,"children":300615},{},[300616,300628,300639],{"type":17,"tag":84,"props":300617,"children":300618},{},[300619,300621,300626],{"type":23,"value":300620},"Added ",{"type":17,"tag":6121,"props":300622,"children":300624},{"className":300623},[],[300625],{"type":23,"value":131715},{"type":23,"value":300627}," parameter to redact PII from tool responses",{"type":17,"tag":84,"props":300629,"children":300630},{},[300631,300632,300637],{"type":23,"value":300620},{"type":17,"tag":6121,"props":300633,"children":300635},{"className":300634},[],[300636],{"type":23,"value":24204},{"type":23,"value":300638}," parameter to control tool access at runtime",{"type":17,"tag":84,"props":300640,"children":300641},{},[300642],{"type":23,"value":300643},"Workspace API key–based authentication now supported",{"type":17,"tag":29,"props":300645,"children":300646},{},[300647],{"type":23,"value":300648},"These improvements help product teams build safer, more flexible copilots and agent interfaces using Unified connections.",{"type":17,"tag":239,"props":300650,"children":300652},{"id":300651},"schema-field-expansions",[300653],{"type":23,"value":300654},"Schema + field expansions",{"type":17,"tag":29,"props":300656,"children":300657},{},[300658],{"type":23,"value":300659},"We added new metadata fields to Slack, Microsoft Teams, and Gmail messages, enabled standardized Category support in leading accounting tools, and added task hierarchy flags across ClickUp, Jira, and Linear.",{"type":17,"tag":80,"props":300661,"children":300662},{},[300663,300683,300693],{"type":17,"tag":84,"props":300664,"children":300665},{},[300666,300671,300672,300677,300678],{"type":17,"tag":48,"props":300667,"children":300668},{},[300669],{"type":23,"value":300670},"Slack / Teams / Gmail",{"type":23,"value":282029},{"type":17,"tag":6121,"props":300673,"children":300675},{"className":300674},[],[300676],{"type":23,"value":34160},{"type":23,"value":42442},{"type":17,"tag":6121,"props":300679,"children":300681},{"className":300680},[],[300682],{"type":23,"value":130956},{"type":17,"tag":84,"props":300684,"children":300685},{},[300686,300691],{"type":17,"tag":48,"props":300687,"children":300688},{},[300689],{"type":23,"value":300690},"Xero / QuickBooks / Pennylane",{"type":23,"value":300692},": Category object with full support",{"type":17,"tag":84,"props":300694,"children":300695},{},[300696,300701,300703,300708],{"type":17,"tag":48,"props":300697,"children":300698},{},[300699],{"type":23,"value":300700},"ClickUp / Linear / Jira",{"type":23,"value":300702},": Added ",{"type":17,"tag":6121,"props":300704,"children":300706},{"className":300705},[],[300707],{"type":23,"value":160848},{"type":23,"value":300709}," field for task hierarchy support",{"type":17,"tag":239,"props":300711,"children":300712},{"id":278477},[300713],{"type":23,"value":300714},"Webhook + streaming improvements",{"type":17,"tag":29,"props":300716,"children":300717},{},[300718],{"type":23,"value":300719},"We expanded webhook coverage across major finance, messaging, and CRM platforms.",{"type":17,"tag":80,"props":300721,"children":300722},{},[300723,300733,300743],{"type":17,"tag":84,"props":300724,"children":300725},{},[300726,300731],{"type":17,"tag":48,"props":300727,"children":300728},{},[300729],{"type":23,"value":300730},"Accounting (Xero, QuickBooks, Zoho Books, etc.)",{"type":23,"value":300732},": Webhooks for Bills, Purchase Orders, and more",{"type":17,"tag":84,"props":300734,"children":300735},{},[300736,300741],{"type":17,"tag":48,"props":300737,"children":300738},{},[300739],{"type":23,"value":300740},"Slack / Teams / Affinity",{"type":23,"value":300742},": Created, updated, and deleted event tracking",{"type":17,"tag":84,"props":300744,"children":300745},{},[300746,300750],{"type":17,"tag":48,"props":300747,"children":300748},{},[300749],{"type":23,"value":13293},{"type":23,"value":300751},": Task-level webhooks now available",{"type":17,"tag":239,"props":300753,"children":300755},{"id":300754},"new-objects-methods",[300756],{"type":23,"value":300757},"New objects + methods",{"type":17,"tag":29,"props":300759,"children":300760},{},[300761],{"type":23,"value":300762},"We expanded write support across core financial and HR records.",{"type":17,"tag":80,"props":300764,"children":300765},{},[300766,300776,300786],{"type":17,"tag":84,"props":300767,"children":300768},{},[300769,300774],{"type":17,"tag":48,"props":300770,"children":300771},{},[300772],{"type":23,"value":300773},"Xero / QuickBooks / NetSuite / Zoho Books",{"type":23,"value":300775},": Full CRUD for key finance objects",{"type":17,"tag":84,"props":300777,"children":300778},{},[300779,300784],{"type":17,"tag":48,"props":300780,"children":300781},{},[300782],{"type":23,"value":300783},"Mercury ATS",{"type":23,"value":300785},": Added Company object with write support",{"type":17,"tag":84,"props":300787,"children":300788},{},[300789,300794],{"type":17,"tag":48,"props":300790,"children":300791},{},[300792],{"type":23,"value":300793},"Slack / Teams",{"type":23,"value":300795},": Message updates now supported",{"type":17,"tag":239,"props":300797,"children":300798},{"id":120936},[300799],{"type":23,"value":216865},{"type":17,"tag":80,"props":300801,"children":300802},{},[300803,300827],{"type":17,"tag":84,"props":300804,"children":300805},{},[300806,300814,300818,300820,300825],{"type":17,"tag":133,"props":300807,"children":300809},{"href":287826,"rel":300808},[214],[300810],{"type":17,"tag":48,"props":300811,"children":300812},{},[300813],{"type":23,"value":287833},{"type":17,"tag":48,"props":300815,"children":300816},{},[300817],{"type":23,"value":20456},{"type":23,"value":300819}," Learn how to attach structured metadata to employees, jobs, and items using the new ",{"type":17,"tag":6121,"props":300821,"children":300823},{"className":300822},[],[300824],{"type":23,"value":110283},{"type":23,"value":300826},"object",{"type":17,"tag":84,"props":300828,"children":300829},{},[300830,300840,300845],{"type":17,"tag":133,"props":300831,"children":300834},{"href":300832,"rel":300833},"https://unified.to/blog/enhanced_security_and_control_unified_mcp_server_gets_security_upgrade",[214],[300835],{"type":17,"tag":48,"props":300836,"children":300837},{},[300838],{"type":23,"value":300839},"Enhanced Security for MCP",{"type":17,"tag":48,"props":300841,"children":300842},{},[300843],{"type":23,"value":300844},": Permissions, Aliases, and PII Protection:",{"type":23,"value":300846}," Explore the latest privacy and access controls for AI agent interactions through Unified's MCP Server",{"type":17,"tag":29,"props":300848,"children":300849},{},[300850],{"type":23,"value":300851},"That's a wrap for July. Whether you're syncing accounting data into reporting tools, powering AI copilots in Slack, or building secure LLM workflows, Unified gives you the real-time, structured foundation to move fast.",{"type":17,"tag":29,"props":300853,"children":300854},{},[300855],{"type":17,"tag":133,"props":300856,"children":300858},{"href":1612,"rel":300857},[214],[300859],{"type":17,"tag":48,"props":300860,"children":300861},{},[300862],{"type":23,"value":300863},"Start free trial →",{"type":17,"tag":29,"props":300865,"children":300866},{},[300867],{"type":17,"tag":133,"props":300868,"children":300870},{"href":1623,"rel":300869},[214],[300871],{"type":17,"tag":48,"props":300872,"children":300873},{},[300874],{"type":23,"value":300875},"Book a demo →",{"title":7,"searchDepth":1629,"depth":1629,"links":300877},[300878,300879,300880,300881,300882,300883],{"id":300514,"depth":1635,"text":300517},{"id":287542,"depth":1635,"text":287545},{"id":300651,"depth":1635,"text":300654},{"id":278477,"depth":1635,"text":300714},{"id":300754,"depth":1635,"text":300757},{"id":120936,"depth":1635,"text":216865},"content:blog:july_2025_product_updates.md","blog/july_2025_product_updates.md","blog/july_2025_product_updates",{"_path":300888,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":300889,"description":300890,"img":300891,"date":300892,"tag":6341,"body":300893,"_type":1677,"_id":308294,"_source":1679,"_file":308295,"_stem":308296,"_extension":1682},"/blog/creating_walmart_items_via_unified","Creating Walmart Items via Unified","Unified allows you to create structured product listings on Walmart Marketplace via our Unified data model `commerceitem`. This guide explains the critical...","https://s3.us-east-2.amazonaws.com/unified-article-images/creating_walmart_items_via_unified-icon.png","2025-07-31T00:00:00.000Z",{"type":14,"children":300894,"toc":308283},[300895,300900,300903,300911,300936,300939,300945,301041,301044,301050,301061,301141,301151,301160,301171,301174,301186,308029,308032,308038,308050,308059,308062,308068,308077,308121,308145,308176,308182,308248,308254,308259],{"type":17,"tag":18,"props":300896,"children":300898},{"id":300897},"creating-walmart-items-via-unified",[300899],{"type":23,"value":300889},{"type":17,"tag":25,"props":300901,"children":300902},{},[],{"type":17,"tag":29,"props":300904,"children":300905},{},[300906],{"type":17,"tag":33,"props":300907,"children":300908},{},[300909],{"type":23,"value":300910},"July 31, 2025",{"type":17,"tag":29,"props":300912,"children":300913},{},[300914,300916,300920,300922,300927,300929,300934],{"type":23,"value":300915},"Unified allows you to create structured product listings on ",{"type":17,"tag":48,"props":300917,"children":300918},{},[300919],{"type":23,"value":37467},{"type":23,"value":300921}," via our Unified data model ",{"type":17,"tag":6121,"props":300923,"children":300925},{"className":300924},[],[300926],{"type":23,"value":71567},{"type":23,"value":300928},". This guide explains the ",{"type":17,"tag":48,"props":300930,"children":300931},{},[300932],{"type":23,"value":300933},"critical fields",{"type":23,"value":300935}," you must understand and provide correctly:",{"type":17,"tag":25,"props":300937,"children":300938},{},[],{"type":17,"tag":239,"props":300940,"children":300942},{"id":300941},"key-concepts",[300943],{"type":23,"value":300944},"🧩 Key Concepts",{"type":17,"tag":7231,"props":300946,"children":300947},{},[300948,300962],{"type":17,"tag":7235,"props":300949,"children":300950},{},[300951],{"type":17,"tag":7239,"props":300952,"children":300953},{},[300954,300958],{"type":17,"tag":7243,"props":300955,"children":300956},{},[300957],{"type":23,"value":24651},{"type":17,"tag":7243,"props":300959,"children":300960},{},[300961],{"type":23,"value":24525},{"type":17,"tag":7259,"props":300963,"children":300964},{},[300965,300988,301018],{"type":17,"tag":7239,"props":300966,"children":300967},{},[300968,300976],{"type":17,"tag":7266,"props":300969,"children":300970},{},[300971],{"type":17,"tag":6121,"props":300972,"children":300974},{"className":300973},[],[300975],{"type":23,"value":27310},{"type":17,"tag":7266,"props":300977,"children":300978},{},[300979,300981,300986],{"type":23,"value":300980},"This specifies the ",{"type":17,"tag":48,"props":300982,"children":300983},{},[300984],{"type":23,"value":300985},"Walmart subcategory",{"type":23,"value":300987}," your item belongs to. It determines what metadata is required. Must be one of the supported 76 categories (see below).",{"type":17,"tag":7239,"props":300989,"children":300990},{},[300991,301000],{"type":17,"tag":7266,"props":300992,"children":300993},{},[300994],{"type":17,"tag":6121,"props":300995,"children":300997},{"className":300996},[],[300998],{"type":23,"value":300999},"global_code",{"type":17,"tag":7266,"props":301001,"children":301002},{},[301003,301005,301010,301012,301017],{"type":23,"value":301004},"This is your product's ",{"type":17,"tag":48,"props":301006,"children":301007},{},[301008],{"type":23,"value":301009},"GTIN",{"type":23,"value":301011}," (Global Trade Item Number), a required identifier for Walmart. It must be a ",{"type":17,"tag":48,"props":301013,"children":301014},{},[301015],{"type":23,"value":301016},"valid 12–14 digit string",{"type":23,"value":54},{"type":17,"tag":7239,"props":301019,"children":301020},{},[301021,301029],{"type":17,"tag":7266,"props":301022,"children":301023},{},[301024],{"type":17,"tag":6121,"props":301025,"children":301027},{"className":301026},[],[301028],{"type":23,"value":23792},{"type":17,"tag":7266,"props":301030,"children":301031},{},[301032,301034,301039],{"type":23,"value":301033},"A dynamic array of key-value attributes that depends on the selected ",{"type":17,"tag":6121,"props":301035,"children":301037},{"className":301036},[],[301038],{"type":23,"value":27310},{"type":23,"value":301040},". This is how you provide structured product details like color, material, warranty, etc.",{"type":17,"tag":25,"props":301042,"children":301043},{},[],{"type":17,"tag":239,"props":301045,"children":301047},{"id":301046},"how-metadata-works",[301048],{"type":23,"value":301049},"🧠 How Metadata Works",{"type":17,"tag":29,"props":301051,"children":301052},{},[301053,301054,301059],{"type":23,"value":159500},{"type":17,"tag":6121,"props":301055,"children":301057},{"className":301056},[],[301058],{"type":23,"value":27310},{"type":23,"value":301060}," (subcategory) has a corresponding schema of fields allowed by Walmart. For example:",{"type":17,"tag":80,"props":301062,"children":301063},{},[301064,301103],{"type":17,"tag":84,"props":301065,"children":301066},{},[301067,301073,301075,301081,301082,301088,301089,301095,301096,301102],{"type":17,"tag":6121,"props":301068,"children":301070},{"className":301069},[],[301071],{"type":23,"value":301072},"animal_accessories",{"type":23,"value":301074}," allows fields like ",{"type":17,"tag":6121,"props":301076,"children":301078},{"className":301077},[],[301079],{"type":23,"value":301080},"animalType",{"type":23,"value":11826},{"type":17,"tag":6121,"props":301083,"children":301085},{"className":301084},[],[301086],{"type":23,"value":301087},"petSize",{"type":23,"value":11826},{"type":17,"tag":6121,"props":301090,"children":301092},{"className":301091},[],[301093],{"type":23,"value":301094},"isFoldable",{"type":23,"value":11826},{"type":17,"tag":6121,"props":301097,"children":301099},{"className":301098},[],[301100],{"type":23,"value":301101},"colorCategory",{"type":23,"value":212457},{"type":17,"tag":84,"props":301104,"children":301105},{},[301106,301112,301113,301119,301120,301126,301127,301133,301134,301140],{"type":17,"tag":6121,"props":301107,"children":301109},{"className":301108},[],[301110],{"type":23,"value":301111},"computers",{"type":23,"value":301074},{"type":17,"tag":6121,"props":301114,"children":301116},{"className":301115},[],[301117],{"type":23,"value":301118},"processorType",{"type":23,"value":11826},{"type":17,"tag":6121,"props":301121,"children":301123},{"className":301122},[],[301124],{"type":23,"value":301125},"screenSize",{"type":23,"value":11826},{"type":17,"tag":6121,"props":301128,"children":301130},{"className":301129},[],[301131],{"type":23,"value":301132},"ramMemory",{"type":23,"value":11826},{"type":17,"tag":6121,"props":301135,"children":301137},{"className":301136},[],[301138],{"type":23,"value":301139},"operatingSystem",{"type":23,"value":212457},{"type":17,"tag":29,"props":301142,"children":301143},{},[301144,301149],{"type":17,"tag":48,"props":301145,"children":301146},{},[301147],{"type":23,"value":301148},"List the metadata fields from Unified",{"type":23,"value":301150}," using this API",{"type":17,"tag":6893,"props":301152,"children":301155},{"className":301153,"code":301154,"language":18718,"meta":7},[18716],"GET /metadata_metadata?type=commerce_item\n\n[\n        {\n            \"id\": \"shortDescription\",\n            \"name\": \"shortDescription\",\n            \"slug\": \"shortDescription\",\n            \"format\": \"TEXT\",\n            \"original_format\": \"string\",\n            \"object_type\": \"commerce_item\"\n        },\n        {\n            \"id\": \"minimumRecommendedAge\",\n            \"name\": \"minimumRecommendedAge\",\n            \"slug\": \"minimumRecommendedAge\",\n            \"format\": \"MEASUREMENT\",\n            \"original_format\": \"{\\\"measure\\\":\\\"number\\\",\\\"unit\\\":[\\\"months\\\",\\\"years\\\"]}\",\n            \"object_type\": \"commerce_item\"\n        },\n        {\n            \"id\": \"smallPartsWarnings\",\n            \"name\": \"Small Parts Warning Code\",\n            \"slug\": \"smallPartsWarnings\",\n            \"format\": \"MULTIPLE_SELECT\",\n            \"original_format\": \"string[]\",\n            \"options\": [\n                \"0 - No warning applicable\",\n                \"5 - Choking hazard is a marble\",\n                \"4 - Choking hazard balloon\",\n                \"6 - Choking hazard contains a marble\",\n                \"2 - Choking hazard contains small ball\",\n                \"3 - Choking hazard contains small parts\",\n                \"1 - Choking hazard is a small ball\"\n            ],\n            \"object_type\": \"commerce_item\"\n        },\n ]\n",[301156],{"type":17,"tag":6121,"props":301157,"children":301158},{"__ignoreMap":7},[301159],{"type":23,"value":301154},{"type":17,"tag":29,"props":301161,"children":301162},{},[301163,301165,301169],{"type":23,"value":301164},"You can filter these results by inspecting the supported ",{"type":17,"tag":133,"props":301166,"children":301167},{"href":1857},[301168],{"type":23,"value":1860},{"type":23,"value":301170}," options.",{"type":17,"tag":25,"props":301172,"children":301173},{},[],{"type":17,"tag":239,"props":301175,"children":301177},{"id":301176},"supported-type-values-for-walmart-items-commerce_item",[301178,301179,301184],{"type":23,"value":241826},{"type":17,"tag":6121,"props":301180,"children":301182},{"className":301181},[],[301183],{"type":23,"value":27310},{"type":23,"value":301185}," Values for Walmart Items (commerce_item)",{"type":17,"tag":80,"props":301187,"children":301188},{},[301189,301198,301207,301216,301225,301234,301243,301252,301261,301270,301279,301288,301297,301306,301315,301324,301333,301342,301351,301360,301369,301378,301387,301396,301405,301414,301423,301432,301441,301450,301459,301468,301477,301486,301495,301504,301513,301522,301531,301540,301549,301558,301567,301576,301585,301594,301603,301612,301621,301630,301639,301648,301657,301666,301675,301684,301693,301702,301711,301720,301729,301738,301747,301756,301765,301774,301783,301792,301801,301810,301819,301828,301837,301846,301855,301864,301873,301882,301891,301900,301909,301918,301927,301936,301945,301954,301963,301972,301981,301990,301999,302008,302017,302026,302035,302044,302053,302062,302071,302080,302089,302098,302107,302116,302125,302134,302143,302152,302161,302170,302179,302188,302197,302206,302215,302224,302233,302242,302251,302260,302269,302278,302287,302296,302305,302314,302323,302332,302341,302350,302359,302368,302377,302386,302395,302404,302413,302422,302431,302440,302449,302458,302467,302476,302485,302494,302503,302512,302521,302530,302539,302548,302557,302566,302575,302584,302593,302602,302611,302620,302629,302638,302647,302656,302665,302674,302683,302692,302701,302710,302719,302728,302737,302746,302755,302764,302773,302782,302791,302800,302809,302818,302827,302836,302845,302854,302863,302872,302881,302890,302899,302908,302917,302926,302935,302944,302953,302962,302971,302980,302989,302998,303007,303016,303025,303034,303043,303052,303061,303070,303079,303088,303097,303106,303115,303124,303133,303142,303151,303160,303169,303178,303187,303196,303205,303214,303223,303232,303241,303250,303259,303268,303277,303286,303295,303304,303313,303322,303331,303340,303349,303358,303367,303376,303385,303394,303403,303412,303421,303430,303439,303448,303457,303466,303475,303484,303493,303502,303511,303520,303529,303538,303547,303556,303565,303574,303583,303592,303601,303610,303619,303628,303637,303646,303655,303664,303673,303682,303691,303700,303709,303718,303727,303736,303745,303754,303763,303772,303781,303790,303799,303808,303817,303826,303835,303844,303853,303862,303871,303880,303889,303898,303907,303916,303925,303934,303943,303952,303961,303970,303979,303988,303997,304006,304015,304024,304033,304042,304051,304060,304069,304078,304087,304096,304105,304114,304123,304132,304141,304150,304159,304168,304177,304186,304195,304204,304213,304222,304231,304240,304249,304258,304267,304276,304285,304294,304303,304312,304321,304330,304339,304348,304357,304366,304375,304384,304393,304402,304411,304420,304429,304438,304447,304456,304465,304474,304483,304492,304501,304510,304519,304528,304537,304546,304555,304564,304573,304582,304591,304600,304609,304618,304627,304636,304645,304654,304663,304672,304681,304690,304699,304708,304717,304726,304735,304744,304753,304762,304771,304780,304789,304798,304807,304816,304825,304834,304843,304852,304861,304870,304879,304888,304897,304906,304915,304924,304933,304942,304951,304960,304969,304978,304987,304996,305005,305014,305023,305032,305041,305050,305059,305068,305077,305086,305095,305104,305113,305122,305131,305140,305149,305158,305167,305176,305185,305194,305203,305212,305221,305230,305239,305248,305257,305266,305275,305284,305293,305302,305311,305320,305329,305338,305347,305356,305365,305374,305383,305392,305401,305410,305419,305428,305437,305446,305455,305464,305473,305482,305491,305500,305509,305518,305527,305536,305545,305554,305563,305572,305581,305590,305599,305608,305617,305626,305635,305644,305653,305662,305671,305680,305689,305698,305707,305716,305725,305734,305743,305752,305761,305770,305779,305788,305797,305806,305815,305824,305833,305842,305851,305860,305869,305878,305887,305896,305905,305914,305923,305932,305941,305950,305959,305968,305977,305986,305995,306004,306013,306022,306031,306040,306049,306058,306067,306076,306085,306094,306103,306112,306121,306130,306139,306148,306157,306166,306175,306184,306193,306202,306211,306220,306229,306238,306247,306256,306265,306274,306283,306292,306301,306310,306319,306328,306337,306346,306355,306364,306373,306382,306391,306400,306409,306418,306427,306436,306445,306454,306463,306472,306481,306490,306499,306508,306517,306526,306535,306544,306553,306562,306571,306580,306589,306598,306607,306616,306625,306634,306643,306652,306661,306670,306679,306688,306697,306706,306715,306724,306733,306742,306751,306760,306769,306778,306787,306796,306805,306814,306823,306832,306841,306850,306859,306868,306877,306886,306895,306904,306913,306922,306931,306940,306949,306958,306967,306976,306985,306994,307003,307012,307021,307030,307039,307048,307057,307066,307075,307084,307093,307102,307111,307120,307129,307138,307147,307156,307165,307174,307183,307192,307201,307210,307219,307228,307237,307246,307255,307264,307273,307282,307291,307300,307309,307318,307327,307336,307345,307354,307363,307372,307381,307390,307399,307408,307417,307426,307435,307444,307453,307462,307471,307480,307489,307498,307507,307516,307525,307534,307543,307552,307561,307570,307579,307588,307597,307606,307615,307624,307633,307642,307651,307660,307669,307678,307687,307696,307705,307714,307723,307732,307741,307750,307759,307768,307777,307786,307795,307804,307813,307822,307831,307840,307849,307858,307867,307876,307885,307894,307903,307912,307921,307930,307939,307948,307957,307966,307975,307984,307993,308002,308011,308020],{"type":17,"tag":84,"props":301190,"children":301191},{},[301192],{"type":17,"tag":6121,"props":301193,"children":301195},{"className":301194},[],[301196],{"type":23,"value":301197},"Skateboard Risers",{"type":17,"tag":84,"props":301199,"children":301200},{},[301201],{"type":17,"tag":6121,"props":301202,"children":301204},{"className":301203},[],[301205],{"type":23,"value":301206},"Baby Play Yards",{"type":17,"tag":84,"props":301208,"children":301209},{},[301210],{"type":17,"tag":6121,"props":301211,"children":301213},{"className":301212},[],[301214],{"type":23,"value":301215},"Power Hedge Trimmers",{"type":17,"tag":84,"props":301217,"children":301218},{},[301219],{"type":17,"tag":6121,"props":301220,"children":301222},{"className":301221},[],[301223],{"type":23,"value":301224},"Eyeglass Cases",{"type":17,"tag":84,"props":301226,"children":301227},{},[301228],{"type":17,"tag":6121,"props":301229,"children":301231},{"className":301230},[],[301232],{"type":23,"value":301233},"Microphone Splitters",{"type":17,"tag":84,"props":301235,"children":301236},{},[301237],{"type":17,"tag":6121,"props":301238,"children":301240},{"className":301239},[],[301241],{"type":23,"value":301242},"Electric Buffet Servers",{"type":17,"tag":84,"props":301244,"children":301245},{},[301246],{"type":17,"tag":6121,"props":301247,"children":301249},{"className":301248},[],[301250],{"type":23,"value":301251},"Radio Control Vehicle Servos",{"type":17,"tag":84,"props":301253,"children":301254},{},[301255],{"type":17,"tag":6121,"props":301256,"children":301258},{"className":301257},[],[301259],{"type":23,"value":301260},"Sticky Notes",{"type":17,"tag":84,"props":301262,"children":301263},{},[301264],{"type":17,"tag":6121,"props":301265,"children":301267},{"className":301266},[],[301268],{"type":23,"value":301269},"Matcha Tea Bowls & Whisks",{"type":17,"tag":84,"props":301271,"children":301272},{},[301273],{"type":17,"tag":6121,"props":301274,"children":301276},{"className":301275},[],[301277],{"type":23,"value":301278},"Doughs",{"type":17,"tag":84,"props":301280,"children":301281},{},[301282],{"type":17,"tag":6121,"props":301283,"children":301285},{"className":301284},[],[301286],{"type":23,"value":301287},"Taffy Candy",{"type":17,"tag":84,"props":301289,"children":301290},{},[301291],{"type":17,"tag":6121,"props":301292,"children":301294},{"className":301293},[],[301295],{"type":23,"value":301296},"Hair Dryers",{"type":17,"tag":84,"props":301298,"children":301299},{},[301300],{"type":17,"tag":6121,"props":301301,"children":301303},{"className":301302},[],[301304],{"type":23,"value":301305},"Base Layers",{"type":17,"tag":84,"props":301307,"children":301308},{},[301309],{"type":17,"tag":6121,"props":301310,"children":301312},{"className":301311},[],[301313],{"type":23,"value":301314},"Emergency Lighting",{"type":17,"tag":84,"props":301316,"children":301317},{},[301318],{"type":17,"tag":6121,"props":301319,"children":301321},{"className":301320},[],[301322],{"type":23,"value":301323},"Bidet Toilet Seats",{"type":17,"tag":84,"props":301325,"children":301326},{},[301327],{"type":17,"tag":6121,"props":301328,"children":301330},{"className":301329},[],[301331],{"type":23,"value":301332},"Purse Making Supplies",{"type":17,"tag":84,"props":301334,"children":301335},{},[301336],{"type":17,"tag":6121,"props":301337,"children":301339},{"className":301338},[],[301340],{"type":23,"value":301341},"Grill Grid Lifters",{"type":17,"tag":84,"props":301343,"children":301344},{},[301345],{"type":17,"tag":6121,"props":301346,"children":301348},{"className":301347},[],[301349],{"type":23,"value":301350},"Hunting Scents",{"type":17,"tag":84,"props":301352,"children":301353},{},[301354],{"type":17,"tag":6121,"props":301355,"children":301357},{"className":301356},[],[301358],{"type":23,"value":301359},"Automotive Headlight Restorer",{"type":17,"tag":84,"props":301361,"children":301362},{},[301363],{"type":17,"tag":6121,"props":301364,"children":301366},{"className":301365},[],[301367],{"type":23,"value":301368},"Ear Thermometer Replacement Lens Filters",{"type":17,"tag":84,"props":301370,"children":301371},{},[301372],{"type":17,"tag":6121,"props":301373,"children":301375},{"className":301374},[],[301376],{"type":23,"value":301377},"Glassware & Drinkware",{"type":17,"tag":84,"props":301379,"children":301380},{},[301381],{"type":17,"tag":6121,"props":301382,"children":301384},{"className":301383},[],[301385],{"type":23,"value":301386},"Precious Metals",{"type":17,"tag":84,"props":301388,"children":301389},{},[301390],{"type":17,"tag":6121,"props":301391,"children":301393},{"className":301392},[],[301394],{"type":23,"value":301395},"Lab Chromatography Paper",{"type":17,"tag":84,"props":301397,"children":301398},{},[301399],{"type":17,"tag":6121,"props":301400,"children":301402},{"className":301401},[],[301403],{"type":23,"value":301404},"Plant Terrariums",{"type":17,"tag":84,"props":301406,"children":301407},{},[301408],{"type":17,"tag":6121,"props":301409,"children":301411},{"className":301410},[],[301412],{"type":23,"value":301413},"Microphone Cables",{"type":17,"tag":84,"props":301415,"children":301416},{},[301417],{"type":17,"tag":6121,"props":301418,"children":301420},{"className":301419},[],[301421],{"type":23,"value":301422},"Glucose Supplements",{"type":17,"tag":84,"props":301424,"children":301425},{},[301426],{"type":17,"tag":6121,"props":301427,"children":301429},{"className":301428},[],[301430],{"type":23,"value":301431},"Snow Skis",{"type":17,"tag":84,"props":301433,"children":301434},{},[301435],{"type":17,"tag":6121,"props":301436,"children":301438},{"className":301437},[],[301439],{"type":23,"value":301440},"Perineal Cleansers",{"type":17,"tag":84,"props":301442,"children":301443},{},[301444],{"type":17,"tag":6121,"props":301445,"children":301447},{"className":301446},[],[301448],{"type":23,"value":301449},"Soda Maker Kits",{"type":17,"tag":84,"props":301451,"children":301452},{},[301453],{"type":17,"tag":6121,"props":301454,"children":301456},{"className":301455},[],[301457],{"type":23,"value":301458},"Camera Accessory Bundles",{"type":17,"tag":84,"props":301460,"children":301461},{},[301462],{"type":17,"tag":6121,"props":301463,"children":301465},{"className":301464},[],[301466],{"type":23,"value":301467},"Tetherball Equipment",{"type":17,"tag":84,"props":301469,"children":301470},{},[301471],{"type":17,"tag":6121,"props":301472,"children":301474},{"className":301473},[],[301475],{"type":23,"value":301476},"Paint Reducers & Retarders",{"type":17,"tag":84,"props":301478,"children":301479},{},[301480],{"type":17,"tag":6121,"props":301481,"children":301483},{"className":301482},[],[301484],{"type":23,"value":301485},"Pork Rinds",{"type":17,"tag":84,"props":301487,"children":301488},{},[301489],{"type":17,"tag":6121,"props":301490,"children":301492},{"className":301491},[],[301493],{"type":23,"value":301494},"Portable Basketball Systems",{"type":17,"tag":84,"props":301496,"children":301497},{},[301498],{"type":17,"tag":6121,"props":301499,"children":301501},{"className":301500},[],[301502],{"type":23,"value":301503},"Plate Joiners",{"type":17,"tag":84,"props":301505,"children":301506},{},[301507],{"type":17,"tag":6121,"props":301508,"children":301510},{"className":301509},[],[301511],{"type":23,"value":301512},"Other Weight Loss Supplies",{"type":17,"tag":84,"props":301514,"children":301515},{},[301516],{"type":17,"tag":6121,"props":301517,"children":301519},{"className":301518},[],[301520],{"type":23,"value":301521},"Powder Candy",{"type":17,"tag":84,"props":301523,"children":301524},{},[301525],{"type":17,"tag":6121,"props":301526,"children":301528},{"className":301527},[],[301529],{"type":23,"value":301530},"Outdoor Kitchen Serving & Storage Carts",{"type":17,"tag":84,"props":301532,"children":301533},{},[301534],{"type":17,"tag":6121,"props":301535,"children":301537},{"className":301536},[],[301538],{"type":23,"value":301539},"Unitards & Leotards",{"type":17,"tag":84,"props":301541,"children":301542},{},[301543],{"type":17,"tag":6121,"props":301544,"children":301546},{"className":301545},[],[301547],{"type":23,"value":301548},"Lab Sample Bags",{"type":17,"tag":84,"props":301550,"children":301551},{},[301552],{"type":17,"tag":6121,"props":301553,"children":301555},{"className":301554},[],[301556],{"type":23,"value":301557},"Fishing Rod & Reel Combos",{"type":17,"tag":84,"props":301559,"children":301560},{},[301561],{"type":17,"tag":6121,"props":301562,"children":301564},{"className":301563},[],[301565],{"type":23,"value":301566},"Adhesive Tapes",{"type":17,"tag":84,"props":301568,"children":301569},{},[301570],{"type":17,"tag":6121,"props":301571,"children":301573},{"className":301572},[],[301574],{"type":23,"value":301575},"Track & Field Markers",{"type":17,"tag":84,"props":301577,"children":301578},{},[301579],{"type":17,"tag":6121,"props":301580,"children":301582},{"className":301581},[],[301583],{"type":23,"value":301584},"Fruit & Vegetable Corers",{"type":17,"tag":84,"props":301586,"children":301587},{},[301588],{"type":17,"tag":6121,"props":301589,"children":301591},{"className":301590},[],[301592],{"type":23,"value":301593},"Automotive Fuel Tank Caps",{"type":17,"tag":84,"props":301595,"children":301596},{},[301597],{"type":17,"tag":6121,"props":301598,"children":301600},{"className":301599},[],[301601],{"type":23,"value":301602},"Drawing Boards",{"type":17,"tag":84,"props":301604,"children":301605},{},[301606],{"type":17,"tag":6121,"props":301607,"children":301609},{"className":301608},[],[301610],{"type":23,"value":301611},"Hand Dryers",{"type":17,"tag":84,"props":301613,"children":301614},{},[301615],{"type":17,"tag":6121,"props":301616,"children":301618},{"className":301617},[],[301619],{"type":23,"value":301620},"Pregnancy Tests",{"type":17,"tag":84,"props":301622,"children":301623},{},[301624],{"type":17,"tag":6121,"props":301625,"children":301627},{"className":301626},[],[301628],{"type":23,"value":301629},"Cat Litter Mats",{"type":17,"tag":84,"props":301631,"children":301632},{},[301633],{"type":17,"tag":6121,"props":301634,"children":301636},{"className":301635},[],[301637],{"type":23,"value":301638},"Facial Wipes",{"type":17,"tag":84,"props":301640,"children":301641},{},[301642],{"type":17,"tag":6121,"props":301643,"children":301645},{"className":301644},[],[301646],{"type":23,"value":301647},"Exercise Weights",{"type":17,"tag":84,"props":301649,"children":301650},{},[301651],{"type":17,"tag":6121,"props":301652,"children":301654},{"className":301653},[],[301655],{"type":23,"value":301656},"Sewing Pins",{"type":17,"tag":84,"props":301658,"children":301659},{},[301660],{"type":17,"tag":6121,"props":301661,"children":301663},{"className":301662},[],[301664],{"type":23,"value":301665},"Other Makeup Brushes & Tools",{"type":17,"tag":84,"props":301667,"children":301668},{},[301669],{"type":17,"tag":6121,"props":301670,"children":301672},{"className":301671},[],[301673],{"type":23,"value":301674},"Other Shaving Supplies",{"type":17,"tag":84,"props":301676,"children":301677},{},[301678],{"type":17,"tag":6121,"props":301679,"children":301681},{"className":301680},[],[301682],{"type":23,"value":301683},"Sugar Packet Holders",{"type":17,"tag":84,"props":301685,"children":301686},{},[301687],{"type":17,"tag":6121,"props":301688,"children":301690},{"className":301689},[],[301691],{"type":23,"value":301692},"Honey Dippers",{"type":17,"tag":84,"props":301694,"children":301695},{},[301696],{"type":17,"tag":6121,"props":301697,"children":301699},{"className":301698},[],[301700],{"type":23,"value":301701},"Artificial Topiaries",{"type":17,"tag":84,"props":301703,"children":301704},{},[301705],{"type":17,"tag":6121,"props":301706,"children":301708},{"className":301707},[],[301709],{"type":23,"value":301710},"Cupcake Making Kits",{"type":17,"tag":84,"props":301712,"children":301713},{},[301714],{"type":17,"tag":6121,"props":301715,"children":301717},{"className":301716},[],[301718],{"type":23,"value":301719},"Mobility Walker Bags, Baskets & Carriers",{"type":17,"tag":84,"props":301721,"children":301722},{},[301723],{"type":17,"tag":6121,"props":301724,"children":301726},{"className":301725},[],[301727],{"type":23,"value":301728},"Faucet Water Filters",{"type":17,"tag":84,"props":301730,"children":301731},{},[301732],{"type":17,"tag":6121,"props":301733,"children":301735},{"className":301734},[],[301736],{"type":23,"value":301737},"Urinary Tract Infection Test Strips",{"type":17,"tag":84,"props":301739,"children":301740},{},[301741],{"type":17,"tag":6121,"props":301742,"children":301744},{"className":301743},[],[301745],{"type":23,"value":301746},"Baptism Gowns & Outfits",{"type":17,"tag":84,"props":301748,"children":301749},{},[301750],{"type":17,"tag":6121,"props":301751,"children":301753},{"className":301752},[],[301754],{"type":23,"value":301755},"Function Generators",{"type":17,"tag":84,"props":301757,"children":301758},{},[301759],{"type":17,"tag":6121,"props":301760,"children":301762},{"className":301761},[],[301763],{"type":23,"value":301764},"FM Transmitters",{"type":17,"tag":84,"props":301766,"children":301767},{},[301768],{"type":17,"tag":6121,"props":301769,"children":301771},{"className":301770},[],[301772],{"type":23,"value":301773},"Home Brewing Refractometers",{"type":17,"tag":84,"props":301775,"children":301776},{},[301777],{"type":17,"tag":6121,"props":301778,"children":301780},{"className":301779},[],[301781],{"type":23,"value":301782},"Saddle Bags",{"type":17,"tag":84,"props":301784,"children":301785},{},[301786],{"type":17,"tag":6121,"props":301787,"children":301789},{"className":301788},[],[301790],{"type":23,"value":301791},"Track & Field Competitor Numbers",{"type":17,"tag":84,"props":301793,"children":301794},{},[301795],{"type":17,"tag":6121,"props":301796,"children":301798},{"className":301797},[],[301799],{"type":23,"value":301800},"Fuel Distributors",{"type":17,"tag":84,"props":301802,"children":301803},{},[301804],{"type":17,"tag":6121,"props":301805,"children":301807},{"className":301806},[],[301808],{"type":23,"value":301809},"Nicotine Patches",{"type":17,"tag":84,"props":301811,"children":301812},{},[301813],{"type":17,"tag":6121,"props":301814,"children":301816},{"className":301815},[],[301817],{"type":23,"value":301818},"Griddles & Grill Pans",{"type":17,"tag":84,"props":301820,"children":301821},{},[301822],{"type":17,"tag":6121,"props":301823,"children":301825},{"className":301824},[],[301826],{"type":23,"value":301827},"Planter & Stand Sets",{"type":17,"tag":84,"props":301829,"children":301830},{},[301831],{"type":17,"tag":6121,"props":301832,"children":301834},{"className":301833},[],[301835],{"type":23,"value":301836},"Other Pet Health Supplies",{"type":17,"tag":84,"props":301838,"children":301839},{},[301840],{"type":17,"tag":6121,"props":301841,"children":301843},{"className":301842},[],[301844],{"type":23,"value":301845},"Scooter Decks",{"type":17,"tag":84,"props":301847,"children":301848},{},[301849],{"type":17,"tag":6121,"props":301850,"children":301852},{"className":301851},[],[301853],{"type":23,"value":301854},"Knitting & Crochet Stitch Counters",{"type":17,"tag":84,"props":301856,"children":301857},{},[301858],{"type":17,"tag":6121,"props":301859,"children":301861},{"className":301860},[],[301862],{"type":23,"value":301863},"Camera Tool Kits",{"type":17,"tag":84,"props":301865,"children":301866},{},[301867],{"type":17,"tag":6121,"props":301868,"children":301870},{"className":301869},[],[301871],{"type":23,"value":301872},"Eyelash Combs",{"type":17,"tag":84,"props":301874,"children":301875},{},[301876],{"type":17,"tag":6121,"props":301877,"children":301879},{"className":301878},[],[301880],{"type":23,"value":301881},"Blouses & Tops",{"type":17,"tag":84,"props":301883,"children":301884},{},[301885],{"type":17,"tag":6121,"props":301886,"children":301888},{"className":301887},[],[301889],{"type":23,"value":301890},"Knitting & Crochet Stitch Markers",{"type":17,"tag":84,"props":301892,"children":301893},{},[301894],{"type":17,"tag":6121,"props":301895,"children":301897},{"className":301896},[],[301898],{"type":23,"value":301899},"Hand Tool Punches",{"type":17,"tag":84,"props":301901,"children":301902},{},[301903],{"type":17,"tag":6121,"props":301904,"children":301906},{"className":301905},[],[301907],{"type":23,"value":301908},"Climbing Rappel Devices",{"type":17,"tag":84,"props":301910,"children":301911},{},[301912],{"type":17,"tag":6121,"props":301913,"children":301915},{"className":301914},[],[301916],{"type":23,"value":301917},"Kitchen Towels",{"type":17,"tag":84,"props":301919,"children":301920},{},[301921],{"type":17,"tag":6121,"props":301922,"children":301924},{"className":301923},[],[301925],{"type":23,"value":301926},"Homogenizer Accessories",{"type":17,"tag":84,"props":301928,"children":301929},{},[301930],{"type":17,"tag":6121,"props":301931,"children":301933},{"className":301932},[],[301934],{"type":23,"value":301935},"Attendance Time Cards",{"type":17,"tag":84,"props":301937,"children":301938},{},[301939],{"type":17,"tag":6121,"props":301940,"children":301942},{"className":301941},[],[301943],{"type":23,"value":301944},"Digital Camera Parts",{"type":17,"tag":84,"props":301946,"children":301947},{},[301948],{"type":17,"tag":6121,"props":301949,"children":301951},{"className":301950},[],[301952],{"type":23,"value":301953},"Planners & Appointment Book Refills",{"type":17,"tag":84,"props":301955,"children":301956},{},[301957],{"type":17,"tag":6121,"props":301958,"children":301960},{"className":301959},[],[301961],{"type":23,"value":301962},"Herbal Supplements",{"type":17,"tag":84,"props":301964,"children":301965},{},[301966],{"type":17,"tag":6121,"props":301967,"children":301969},{"className":301968},[],[301970],{"type":23,"value":301971},"Hand-Sewing Needles",{"type":17,"tag":84,"props":301973,"children":301974},{},[301975],{"type":17,"tag":6121,"props":301976,"children":301978},{"className":301977},[],[301979],{"type":23,"value":301980},"Weight Bars",{"type":17,"tag":84,"props":301982,"children":301983},{},[301984],{"type":17,"tag":6121,"props":301985,"children":301987},{"className":301986},[],[301988],{"type":23,"value":301989},"Photography Fixers",{"type":17,"tag":84,"props":301991,"children":301992},{},[301993],{"type":17,"tag":6121,"props":301994,"children":301996},{"className":301995},[],[301997],{"type":23,"value":301998},"Massage Table Carrying Cases",{"type":17,"tag":84,"props":302000,"children":302001},{},[302002],{"type":17,"tag":6121,"props":302003,"children":302005},{"className":302004},[],[302006],{"type":23,"value":302007},"Grill Covers",{"type":17,"tag":84,"props":302009,"children":302010},{},[302011],{"type":17,"tag":6121,"props":302012,"children":302014},{"className":302013},[],[302015],{"type":23,"value":302016},"Other Skating Supplies",{"type":17,"tag":84,"props":302018,"children":302019},{},[302020],{"type":17,"tag":6121,"props":302021,"children":302023},{"className":302022},[],[302024],{"type":23,"value":302025},"Maple Syrups",{"type":17,"tag":84,"props":302027,"children":302028},{},[302029],{"type":17,"tag":6121,"props":302030,"children":302032},{"className":302031},[],[302033],{"type":23,"value":302034},"Pizza Stones & Pans",{"type":17,"tag":84,"props":302036,"children":302037},{},[302038],{"type":17,"tag":6121,"props":302039,"children":302041},{"className":302040},[],[302042],{"type":23,"value":302043},"Manual Letter Openers",{"type":17,"tag":84,"props":302045,"children":302046},{},[302047],{"type":17,"tag":6121,"props":302048,"children":302050},{"className":302049},[],[302051],{"type":23,"value":302052},"Water Guns",{"type":17,"tag":84,"props":302054,"children":302055},{},[302056],{"type":17,"tag":6121,"props":302057,"children":302059},{"className":302058},[],[302060],{"type":23,"value":302061},"Manual Can Openers",{"type":17,"tag":84,"props":302063,"children":302064},{},[302065],{"type":17,"tag":6121,"props":302066,"children":302068},{"className":302067},[],[302069],{"type":23,"value":302070},"Electronic Touchpads",{"type":17,"tag":84,"props":302072,"children":302073},{},[302074],{"type":17,"tag":6121,"props":302075,"children":302077},{"className":302076},[],[302078],{"type":23,"value":302079},"String Trimmer Replacement Parts",{"type":17,"tag":84,"props":302081,"children":302082},{},[302083],{"type":17,"tag":6121,"props":302084,"children":302086},{"className":302085},[],[302087],{"type":23,"value":302088},"Baby Bodysuits & One-Pieces",{"type":17,"tag":84,"props":302090,"children":302091},{},[302092],{"type":17,"tag":6121,"props":302093,"children":302095},{"className":302094},[],[302096],{"type":23,"value":302097},"Walking Cane & Crutch Tips",{"type":17,"tag":84,"props":302099,"children":302100},{},[302101],{"type":17,"tag":6121,"props":302102,"children":302104},{"className":302103},[],[302105],{"type":23,"value":302106},"Cutting Mats",{"type":17,"tag":84,"props":302108,"children":302109},{},[302110],{"type":17,"tag":6121,"props":302111,"children":302113},{"className":302112},[],[302114],{"type":23,"value":302115},"Throwing Knives",{"type":17,"tag":84,"props":302117,"children":302118},{},[302119],{"type":17,"tag":6121,"props":302120,"children":302122},{"className":302121},[],[302123],{"type":23,"value":302124},"Skins for Tablets",{"type":17,"tag":84,"props":302126,"children":302127},{},[302128],{"type":17,"tag":6121,"props":302129,"children":302131},{"className":302130},[],[302132],{"type":23,"value":302133},"Serving Utensils & Sets",{"type":17,"tag":84,"props":302135,"children":302136},{},[302137],{"type":17,"tag":6121,"props":302138,"children":302140},{"className":302139},[],[302141],{"type":23,"value":302142},"Photographic Art",{"type":17,"tag":84,"props":302144,"children":302145},{},[302146],{"type":17,"tag":6121,"props":302147,"children":302149},{"className":302148},[],[302150],{"type":23,"value":302151},"Soap Making Kits",{"type":17,"tag":84,"props":302153,"children":302154},{},[302155],{"type":17,"tag":6121,"props":302156,"children":302158},{"className":302157},[],[302159],{"type":23,"value":302160},"Athletic Shirts & Tops",{"type":17,"tag":84,"props":302162,"children":302163},{},[302164],{"type":17,"tag":6121,"props":302165,"children":302167},{"className":302166},[],[302168],{"type":23,"value":302169},"Ticket Rolls",{"type":17,"tag":84,"props":302171,"children":302172},{},[302173],{"type":17,"tag":6121,"props":302174,"children":302176},{"className":302175},[],[302177],{"type":23,"value":302178},"Fireplace Bellows",{"type":17,"tag":84,"props":302180,"children":302181},{},[302182],{"type":17,"tag":6121,"props":302183,"children":302185},{"className":302184},[],[302186],{"type":23,"value":302187},"Travel Plug Adapters",{"type":17,"tag":84,"props":302189,"children":302190},{},[302191],{"type":17,"tag":6121,"props":302192,"children":302194},{"className":302193},[],[302195],{"type":23,"value":302196},"Vacuum Sealers",{"type":17,"tag":84,"props":302198,"children":302199},{},[302200],{"type":17,"tag":6121,"props":302201,"children":302203},{"className":302202},[],[302204],{"type":23,"value":302205},"Small Animal Habitat Decor",{"type":17,"tag":84,"props":302207,"children":302208},{},[302209],{"type":17,"tag":6121,"props":302210,"children":302212},{"className":302211},[],[302213],{"type":23,"value":302214},"Vacuum Tubes",{"type":17,"tag":84,"props":302216,"children":302217},{},[302218],{"type":17,"tag":6121,"props":302219,"children":302221},{"className":302220},[],[302222],{"type":23,"value":302223},"Stroller Connectors",{"type":17,"tag":84,"props":302225,"children":302226},{},[302227],{"type":17,"tag":6121,"props":302228,"children":302230},{"className":302229},[],[302231],{"type":23,"value":302232},"Ceiling Fans",{"type":17,"tag":84,"props":302234,"children":302235},{},[302236],{"type":17,"tag":6121,"props":302237,"children":302239},{"className":302238},[],[302240],{"type":23,"value":302241},"Other Dancing Supplies",{"type":17,"tag":84,"props":302243,"children":302244},{},[302245],{"type":17,"tag":6121,"props":302246,"children":302248},{"className":302247},[],[302249],{"type":23,"value":302250},"Model Train Locomotives",{"type":17,"tag":84,"props":302252,"children":302253},{},[302254],{"type":17,"tag":6121,"props":302255,"children":302257},{"className":302256},[],[302258],{"type":23,"value":302259},"Electronic Cigarette Starter Kits",{"type":17,"tag":84,"props":302261,"children":302262},{},[302263],{"type":17,"tag":6121,"props":302264,"children":302266},{"className":302265},[],[302267],{"type":23,"value":302268},"Bicycle Baskets",{"type":17,"tag":84,"props":302270,"children":302271},{},[302272],{"type":17,"tag":6121,"props":302273,"children":302275},{"className":302274},[],[302276],{"type":23,"value":302277},"Golf Visors",{"type":17,"tag":84,"props":302279,"children":302280},{},[302281],{"type":17,"tag":6121,"props":302282,"children":302284},{"className":302283},[],[302285],{"type":23,"value":302286},"Bicycle Storage Hooks",{"type":17,"tag":84,"props":302288,"children":302289},{},[302290],{"type":17,"tag":6121,"props":302291,"children":302293},{"className":302292},[],[302294],{"type":23,"value":302295},"Handheld Video Games",{"type":17,"tag":84,"props":302297,"children":302298},{},[302299],{"type":17,"tag":6121,"props":302300,"children":302302},{"className":302301},[],[302303],{"type":23,"value":302304},"Cocktail Mixers",{"type":17,"tag":84,"props":302306,"children":302307},{},[302308],{"type":17,"tag":6121,"props":302309,"children":302311},{"className":302310},[],[302312],{"type":23,"value":302313},"Follow-Focus Levers",{"type":17,"tag":84,"props":302315,"children":302316},{},[302317],{"type":17,"tag":6121,"props":302318,"children":302320},{"className":302319},[],[302321],{"type":23,"value":302322},"Embossing Tools",{"type":17,"tag":84,"props":302324,"children":302325},{},[302326],{"type":17,"tag":6121,"props":302327,"children":302329},{"className":302328},[],[302330],{"type":23,"value":302331},"Incentive Charts",{"type":17,"tag":84,"props":302333,"children":302334},{},[302335],{"type":17,"tag":6121,"props":302336,"children":302338},{"className":302337},[],[302339],{"type":23,"value":302340},"Pressure Gauges",{"type":17,"tag":84,"props":302342,"children":302343},{},[302344],{"type":17,"tag":6121,"props":302345,"children":302347},{"className":302346},[],[302348],{"type":23,"value":302349},"Art Paints & Pigment Powders",{"type":17,"tag":84,"props":302351,"children":302352},{},[302353],{"type":17,"tag":6121,"props":302354,"children":302356},{"className":302355},[],[302357],{"type":23,"value":302358},"Replacement Water Filters",{"type":17,"tag":84,"props":302360,"children":302361},{},[302362],{"type":17,"tag":6121,"props":302363,"children":302365},{"className":302364},[],[302366],{"type":23,"value":302367},"Moisture Meters",{"type":17,"tag":84,"props":302369,"children":302370},{},[302371],{"type":17,"tag":6121,"props":302372,"children":302374},{"className":302373},[],[302375],{"type":23,"value":302376},"Other Pet Grooming Supplies",{"type":17,"tag":84,"props":302378,"children":302379},{},[302380],{"type":17,"tag":6121,"props":302381,"children":302383},{"className":302382},[],[302384],{"type":23,"value":302385},"Shopping Cart & High Chair Covers",{"type":17,"tag":84,"props":302387,"children":302388},{},[302389],{"type":17,"tag":6121,"props":302390,"children":302392},{"className":302391},[],[302393],{"type":23,"value":302394},"Nursing Pillows",{"type":17,"tag":84,"props":302396,"children":302397},{},[302398],{"type":17,"tag":6121,"props":302399,"children":302401},{"className":302400},[],[302402],{"type":23,"value":302403},"Disposable Cutlery Sets",{"type":17,"tag":84,"props":302405,"children":302406},{},[302407],{"type":17,"tag":6121,"props":302408,"children":302410},{"className":302409},[],[302411],{"type":23,"value":302412},"Heat Guns",{"type":17,"tag":84,"props":302414,"children":302415},{},[302416],{"type":17,"tag":6121,"props":302417,"children":302419},{"className":302418},[],[302420],{"type":23,"value":302421},"Construction Flashing",{"type":17,"tag":84,"props":302423,"children":302424},{},[302425],{"type":17,"tag":6121,"props":302426,"children":302428},{"className":302427},[],[302429],{"type":23,"value":302430},"Automotive Aerodynamics Kits",{"type":17,"tag":84,"props":302432,"children":302433},{},[302434],{"type":17,"tag":6121,"props":302435,"children":302437},{"className":302436},[],[302438],{"type":23,"value":302439},"Fire Retardants",{"type":17,"tag":84,"props":302441,"children":302442},{},[302443],{"type":17,"tag":6121,"props":302444,"children":302446},{"className":302445},[],[302447],{"type":23,"value":302448},"Gun Snakes",{"type":17,"tag":84,"props":302450,"children":302451},{},[302452],{"type":17,"tag":6121,"props":302453,"children":302455},{"className":302454},[],[302456],{"type":23,"value":302457},"Snow Removal Rakes & Hand Pushers",{"type":17,"tag":84,"props":302459,"children":302460},{},[302461],{"type":17,"tag":6121,"props":302462,"children":302464},{"className":302463},[],[302465],{"type":23,"value":302466},"Costume Wigs",{"type":17,"tag":84,"props":302468,"children":302469},{},[302470],{"type":17,"tag":6121,"props":302471,"children":302473},{"className":302472},[],[302474],{"type":23,"value":302475},"Outdoor Decorative Stones",{"type":17,"tag":84,"props":302477,"children":302478},{},[302479],{"type":17,"tag":6121,"props":302480,"children":302482},{"className":302481},[],[302483],{"type":23,"value":302484},"Lip Stains",{"type":17,"tag":84,"props":302486,"children":302487},{},[302488],{"type":17,"tag":6121,"props":302489,"children":302491},{"className":302490},[],[302492],{"type":23,"value":302493},"Workwear Uniform Badges",{"type":17,"tag":84,"props":302495,"children":302496},{},[302497],{"type":17,"tag":6121,"props":302498,"children":302500},{"className":302499},[],[302501],{"type":23,"value":302502},"Gut Health Tests",{"type":17,"tag":84,"props":302504,"children":302505},{},[302506],{"type":17,"tag":6121,"props":302507,"children":302509},{"className":302508},[],[302510],{"type":23,"value":302511},"Carbon Monoxide Alarms",{"type":17,"tag":84,"props":302513,"children":302514},{},[302515],{"type":17,"tag":6121,"props":302516,"children":302518},{"className":302517},[],[302519],{"type":23,"value":302520},"Cable Covers",{"type":17,"tag":84,"props":302522,"children":302523},{},[302524],{"type":17,"tag":6121,"props":302525,"children":302527},{"className":302526},[],[302528],{"type":23,"value":302529},"Lathe Cylindrical Rollers",{"type":17,"tag":84,"props":302531,"children":302532},{},[302533],{"type":17,"tag":6121,"props":302534,"children":302536},{"className":302535},[],[302537],{"type":23,"value":302538},"Hamburger Patty Makers",{"type":17,"tag":84,"props":302540,"children":302541},{},[302542],{"type":17,"tag":6121,"props":302543,"children":302545},{"className":302544},[],[302546],{"type":23,"value":302547},"Printing Press Accessories",{"type":17,"tag":84,"props":302549,"children":302550},{},[302551],{"type":17,"tag":6121,"props":302552,"children":302554},{"className":302553},[],[302555],{"type":23,"value":302556},"Automotive Light Covers & Guards",{"type":17,"tag":84,"props":302558,"children":302559},{},[302560],{"type":17,"tag":6121,"props":302561,"children":302563},{"className":302562},[],[302564],{"type":23,"value":302565},"Overbed Tables",{"type":17,"tag":84,"props":302567,"children":302568},{},[302569],{"type":17,"tag":6121,"props":302570,"children":302572},{"className":302571},[],[302573],{"type":23,"value":302574},"Artwork Cases & Portfolios",{"type":17,"tag":84,"props":302576,"children":302577},{},[302578],{"type":17,"tag":6121,"props":302579,"children":302581},{"className":302580},[],[302582],{"type":23,"value":302583},"Disposable Storage Bags",{"type":17,"tag":84,"props":302585,"children":302586},{},[302587],{"type":17,"tag":6121,"props":302588,"children":302590},{"className":302589},[],[302591],{"type":23,"value":302592},"Football Helmets",{"type":17,"tag":84,"props":302594,"children":302595},{},[302596],{"type":17,"tag":6121,"props":302597,"children":302599},{"className":302598},[],[302600],{"type":23,"value":302601},"Automatic Transmission Filters",{"type":17,"tag":84,"props":302603,"children":302604},{},[302605],{"type":17,"tag":6121,"props":302606,"children":302608},{"className":302607},[],[302609],{"type":23,"value":302610},"Live Trees",{"type":17,"tag":84,"props":302612,"children":302613},{},[302614],{"type":17,"tag":6121,"props":302615,"children":302617},{"className":302616},[],[302618],{"type":23,"value":302619},"Umpire Leg Guards",{"type":17,"tag":84,"props":302621,"children":302622},{},[302623],{"type":17,"tag":6121,"props":302624,"children":302626},{"className":302625},[],[302627],{"type":23,"value":302628},"Line Conditioners",{"type":17,"tag":84,"props":302630,"children":302631},{},[302632],{"type":17,"tag":6121,"props":302633,"children":302635},{"className":302634},[],[302636],{"type":23,"value":302637},"Cup & Saucer Sets",{"type":17,"tag":84,"props":302639,"children":302640},{},[302641],{"type":17,"tag":6121,"props":302642,"children":302644},{"className":302643},[],[302645],{"type":23,"value":302646},"Rain Barrels",{"type":17,"tag":84,"props":302648,"children":302649},{},[302650],{"type":17,"tag":6121,"props":302651,"children":302653},{"className":302652},[],[302654],{"type":23,"value":302655},"S",{"type":17,"tag":84,"props":302657,"children":302658},{},[302659],{"type":17,"tag":6121,"props":302660,"children":302662},{"className":302661},[],[302663],{"type":23,"value":302664},",",{"type":17,"tag":84,"props":302666,"children":302667},{},[302668],{"type":17,"tag":6121,"props":302669,"children":302671},{"className":302670},[],[302672],{"type":23,"value":302673},"s Tapes",{"type":17,"tag":84,"props":302675,"children":302676},{},[302677],{"type":17,"tag":6121,"props":302678,"children":302680},{"className":302679},[],[302681],{"type":23,"value":302682},"Indoor Fireplaces",{"type":17,"tag":84,"props":302684,"children":302685},{},[302686],{"type":17,"tag":6121,"props":302687,"children":302689},{"className":302688},[],[302690],{"type":23,"value":302691},"Headphone Cases",{"type":17,"tag":84,"props":302693,"children":302694},{},[302695],{"type":17,"tag":6121,"props":302696,"children":302698},{"className":302697},[],[302699],{"type":23,"value":302700},"Battery Testers",{"type":17,"tag":84,"props":302702,"children":302703},{},[302704],{"type":17,"tag":6121,"props":302705,"children":302707},{"className":302706},[],[302708],{"type":23,"value":302709},"Floor Hockey Carts",{"type":17,"tag":84,"props":302711,"children":302712},{},[302713],{"type":17,"tag":6121,"props":302714,"children":302716},{"className":302715},[],[302717],{"type":23,"value":302718},"T-Shirts",{"type":17,"tag":84,"props":302720,"children":302721},{},[302722],{"type":17,"tag":6121,"props":302723,"children":302725},{"className":302724},[],[302726],{"type":23,"value":302727},"Dunun Drums",{"type":17,"tag":84,"props":302729,"children":302730},{},[302731],{"type":17,"tag":6121,"props":302732,"children":302734},{"className":302733},[],[302735],{"type":23,"value":302736},"Speed Reducers",{"type":17,"tag":84,"props":302738,"children":302739},{},[302740],{"type":17,"tag":6121,"props":302741,"children":302743},{"className":302742},[],[302744],{"type":23,"value":302745},"Percussion Mallets",{"type":17,"tag":84,"props":302747,"children":302748},{},[302749],{"type":17,"tag":6121,"props":302750,"children":302752},{"className":302751},[],[302753],{"type":23,"value":302754},"Pallet Covers",{"type":17,"tag":84,"props":302756,"children":302757},{},[302758],{"type":17,"tag":6121,"props":302759,"children":302761},{"className":302760},[],[302762],{"type":23,"value":302763},"Telescope Cases",{"type":17,"tag":84,"props":302765,"children":302766},{},[302767],{"type":17,"tag":6121,"props":302768,"children":302770},{"className":302769},[],[302771],{"type":23,"value":302772},"Automotive Grilles",{"type":17,"tag":84,"props":302774,"children":302775},{},[302776],{"type":17,"tag":6121,"props":302777,"children":302779},{"className":302778},[],[302780],{"type":23,"value":302781},"Fencing Sport Epee Parts",{"type":17,"tag":84,"props":302783,"children":302784},{},[302785],{"type":17,"tag":6121,"props":302786,"children":302788},{"className":302787},[],[302789],{"type":23,"value":302790},"Emergency Food Kits",{"type":17,"tag":84,"props":302792,"children":302793},{},[302794],{"type":17,"tag":6121,"props":302795,"children":302797},{"className":302796},[],[302798],{"type":23,"value":302799},"Sports Corner Flags",{"type":17,"tag":84,"props":302801,"children":302802},{},[302803],{"type":17,"tag":6121,"props":302804,"children":302806},{"className":302805},[],[302807],{"type":23,"value":302808},"Bird Nests & Nesting Material",{"type":17,"tag":84,"props":302810,"children":302811},{},[302812],{"type":17,"tag":6121,"props":302813,"children":302815},{"className":302814},[],[302816],{"type":23,"value":302817},"Boxing Rings",{"type":17,"tag":84,"props":302819,"children":302820},{},[302821],{"type":17,"tag":6121,"props":302822,"children":302824},{"className":302823},[],[302825],{"type":23,"value":302826},"Paper Sorters",{"type":17,"tag":84,"props":302828,"children":302829},{},[302830],{"type":17,"tag":6121,"props":302831,"children":302833},{"className":302832},[],[302834],{"type":23,"value":302835},"Lollipop & Treat Sticks",{"type":17,"tag":84,"props":302837,"children":302838},{},[302839],{"type":17,"tag":6121,"props":302840,"children":302842},{"className":302841},[],[302843],{"type":23,"value":302844},"Cabin Air Filters",{"type":17,"tag":84,"props":302846,"children":302847},{},[302848],{"type":17,"tag":6121,"props":302849,"children":302851},{"className":302850},[],[302852],{"type":23,"value":302853},"Pool Covers",{"type":17,"tag":84,"props":302855,"children":302856},{},[302857],{"type":17,"tag":6121,"props":302858,"children":302860},{"className":302859},[],[302861],{"type":23,"value":302862},"Video Game Dance Pads",{"type":17,"tag":84,"props":302864,"children":302865},{},[302866],{"type":17,"tag":6121,"props":302867,"children":302869},{"className":302868},[],[302870],{"type":23,"value":302871},"Football Sleds & Chutes",{"type":17,"tag":84,"props":302873,"children":302874},{},[302875],{"type":17,"tag":6121,"props":302876,"children":302878},{"className":302877},[],[302879],{"type":23,"value":302880},"Clay & Dough Extruders & Presses",{"type":17,"tag":84,"props":302882,"children":302883},{},[302884],{"type":17,"tag":6121,"props":302885,"children":302887},{"className":302886},[],[302888],{"type":23,"value":302889},"Baseball Gloves & Mitts",{"type":17,"tag":84,"props":302891,"children":302892},{},[302893],{"type":17,"tag":6121,"props":302894,"children":302896},{"className":302895},[],[302897],{"type":23,"value":302898},"Yeasts & Leaveners",{"type":17,"tag":84,"props":302900,"children":302901},{},[302902],{"type":17,"tag":6121,"props":302903,"children":302905},{"className":302904},[],[302906],{"type":23,"value":302907},"Skins for Aerial Drones",{"type":17,"tag":84,"props":302909,"children":302910},{},[302911],{"type":17,"tag":6121,"props":302912,"children":302914},{"className":302913},[],[302915],{"type":23,"value":302916},"Replacement Faucet Water Filters",{"type":17,"tag":84,"props":302918,"children":302919},{},[302920],{"type":17,"tag":6121,"props":302921,"children":302923},{"className":302922},[],[302924],{"type":23,"value":302925},"Other Electronic Components & Accessories",{"type":17,"tag":84,"props":302927,"children":302928},{},[302929],{"type":17,"tag":6121,"props":302930,"children":302932},{"className":302931},[],[302933],{"type":23,"value":302934},"Lab Coats",{"type":17,"tag":84,"props":302936,"children":302937},{},[302938],{"type":17,"tag":6121,"props":302939,"children":302941},{"className":302940},[],[302942],{"type":23,"value":302943},"Laser Detectors",{"type":17,"tag":84,"props":302945,"children":302946},{},[302947],{"type":17,"tag":6121,"props":302948,"children":302950},{"className":302949},[],[302951],{"type":23,"value":302952},"Baseball Sliding Shorts",{"type":17,"tag":84,"props":302954,"children":302955},{},[302956],{"type":17,"tag":6121,"props":302957,"children":302959},{"className":302958},[],[302960],{"type":23,"value":302961},"Hunting Game Finders",{"type":17,"tag":84,"props":302963,"children":302964},{},[302965],{"type":17,"tag":6121,"props":302966,"children":302968},{"className":302967},[],[302969],{"type":23,"value":302970},"Rain & Snow Gauges",{"type":17,"tag":84,"props":302972,"children":302973},{},[302974],{"type":17,"tag":6121,"props":302975,"children":302977},{"className":302976},[],[302978],{"type":23,"value":302979},"Shapewear Bodysuits",{"type":17,"tag":84,"props":302981,"children":302982},{},[302983],{"type":17,"tag":6121,"props":302984,"children":302986},{"className":302985},[],[302987],{"type":23,"value":302988},"Toiletry Kits & Bags",{"type":17,"tag":84,"props":302990,"children":302991},{},[302992],{"type":17,"tag":6121,"props":302993,"children":302995},{"className":302994},[],[302996],{"type":23,"value":302997},"Photo Enlarger Heads",{"type":17,"tag":84,"props":302999,"children":303000},{},[303001],{"type":17,"tag":6121,"props":303002,"children":303004},{"className":303003},[],[303005],{"type":23,"value":303006},"Athletic Outfit Sets",{"type":17,"tag":84,"props":303008,"children":303009},{},[303010],{"type":17,"tag":6121,"props":303011,"children":303013},{"className":303012},[],[303014],{"type":23,"value":303015},"Combustion Analyzers",{"type":17,"tag":84,"props":303017,"children":303018},{},[303019],{"type":17,"tag":6121,"props":303020,"children":303022},{"className":303021},[],[303023],{"type":23,"value":303024},"Personal Organizer Refills & Accessories",{"type":17,"tag":84,"props":303026,"children":303027},{},[303028],{"type":17,"tag":6121,"props":303029,"children":303031},{"className":303030},[],[303032],{"type":23,"value":303033},"Harmonic Exciters",{"type":17,"tag":84,"props":303035,"children":303036},{},[303037],{"type":17,"tag":6121,"props":303038,"children":303040},{"className":303039},[],[303041],{"type":23,"value":303042},"Billiard Table Felt",{"type":17,"tag":84,"props":303044,"children":303045},{},[303046],{"type":17,"tag":6121,"props":303047,"children":303049},{"className":303048},[],[303050],{"type":23,"value":303051},"Video Game Console Parts",{"type":17,"tag":84,"props":303053,"children":303054},{},[303055],{"type":17,"tag":6121,"props":303056,"children":303058},{"className":303057},[],[303059],{"type":23,"value":303060},"Ham Radio Transceivers",{"type":17,"tag":84,"props":303062,"children":303063},{},[303064],{"type":17,"tag":6121,"props":303065,"children":303067},{"className":303066},[],[303068],{"type":23,"value":303069},"Baby Juices",{"type":17,"tag":84,"props":303071,"children":303072},{},[303073],{"type":17,"tag":6121,"props":303074,"children":303076},{"className":303075},[],[303077],{"type":23,"value":303078},"Hot Dog Machines",{"type":17,"tag":84,"props":303080,"children":303081},{},[303082],{"type":17,"tag":6121,"props":303083,"children":303085},{"className":303084},[],[303086],{"type":23,"value":303087},"Pipe Inspection Cameras",{"type":17,"tag":84,"props":303089,"children":303090},{},[303091],{"type":17,"tag":6121,"props":303092,"children":303094},{"className":303093},[],[303095],{"type":23,"value":303096},"Misting Systems",{"type":17,"tag":84,"props":303098,"children":303099},{},[303100],{"type":17,"tag":6121,"props":303101,"children":303103},{"className":303102},[],[303104],{"type":23,"value":303105},"Sleeping Bag Liners",{"type":17,"tag":84,"props":303107,"children":303108},{},[303109],{"type":17,"tag":6121,"props":303110,"children":303112},{"className":303111},[],[303113],{"type":23,"value":303114},"Kids Gardening Tools",{"type":17,"tag":84,"props":303116,"children":303117},{},[303118],{"type":17,"tag":6121,"props":303119,"children":303121},{"className":303120},[],[303122],{"type":23,"value":303123},"Camera Film Winders",{"type":17,"tag":84,"props":303125,"children":303126},{},[303127],{"type":17,"tag":6121,"props":303128,"children":303130},{"className":303129},[],[303131],{"type":23,"value":303132},"Other Billiard Supplies",{"type":17,"tag":84,"props":303134,"children":303135},{},[303136],{"type":17,"tag":6121,"props":303137,"children":303139},{"className":303138},[],[303140],{"type":23,"value":303141},"Ergonomic Backrests",{"type":17,"tag":84,"props":303143,"children":303144},{},[303145],{"type":17,"tag":6121,"props":303146,"children":303148},{"className":303147},[],[303149],{"type":23,"value":303150},"Balloon Pumps",{"type":17,"tag":84,"props":303152,"children":303153},{},[303154],{"type":17,"tag":6121,"props":303155,"children":303157},{"className":303156},[],[303158],{"type":23,"value":303159},"Lump Charcoals",{"type":17,"tag":84,"props":303161,"children":303162},{},[303163],{"type":17,"tag":6121,"props":303164,"children":303166},{"className":303165},[],[303167],{"type":23,"value":303168},"Pilates Barrels",{"type":17,"tag":84,"props":303170,"children":303171},{},[303172],{"type":17,"tag":6121,"props":303173,"children":303175},{"className":303174},[],[303176],{"type":23,"value":303177},"Surfing Leashes",{"type":17,"tag":84,"props":303179,"children":303180},{},[303181],{"type":17,"tag":6121,"props":303182,"children":303184},{"className":303183},[],[303185],{"type":23,"value":303186},"Dart Shafts",{"type":17,"tag":84,"props":303188,"children":303189},{},[303190],{"type":17,"tag":6121,"props":303191,"children":303193},{"className":303192},[],[303194],{"type":23,"value":303195},"Makeup Blotting Paper",{"type":17,"tag":84,"props":303197,"children":303198},{},[303199],{"type":17,"tag":6121,"props":303200,"children":303202},{"className":303201},[],[303203],{"type":23,"value":303204},"Eye Masks",{"type":17,"tag":84,"props":303206,"children":303207},{},[303208],{"type":17,"tag":6121,"props":303209,"children":303211},{"className":303210},[],[303212],{"type":23,"value":303213},"Welding Helmets",{"type":17,"tag":84,"props":303215,"children":303216},{},[303217],{"type":17,"tag":6121,"props":303218,"children":303220},{"className":303219},[],[303221],{"type":23,"value":303222},"Electronic Coils",{"type":17,"tag":84,"props":303224,"children":303225},{},[303226],{"type":17,"tag":6121,"props":303227,"children":303229},{"className":303228},[],[303230],{"type":23,"value":303231},"Energy Drinks",{"type":17,"tag":84,"props":303233,"children":303234},{},[303235],{"type":17,"tag":6121,"props":303236,"children":303238},{"className":303237},[],[303239],{"type":23,"value":303240},"Push-Up Stands",{"type":17,"tag":84,"props":303242,"children":303243},{},[303244],{"type":17,"tag":6121,"props":303245,"children":303247},{"className":303246},[],[303248],{"type":23,"value":303249},"Photography Stop Baths",{"type":17,"tag":84,"props":303251,"children":303252},{},[303253],{"type":17,"tag":6121,"props":303254,"children":303256},{"className":303255},[],[303257],{"type":23,"value":303258},"Handbag Hook Hangers",{"type":17,"tag":84,"props":303260,"children":303261},{},[303262],{"type":17,"tag":6121,"props":303263,"children":303265},{"className":303264},[],[303266],{"type":23,"value":303267},"Network Security Devices",{"type":17,"tag":84,"props":303269,"children":303270},{},[303271],{"type":17,"tag":6121,"props":303272,"children":303274},{"className":303273},[],[303275],{"type":23,"value":303276},"Stitch Holders",{"type":17,"tag":84,"props":303278,"children":303279},{},[303280],{"type":17,"tag":6121,"props":303281,"children":303283},{"className":303282},[],[303284],{"type":23,"value":303285},"Bicycle Pegs",{"type":17,"tag":84,"props":303287,"children":303288},{},[303289],{"type":17,"tag":6121,"props":303290,"children":303292},{"className":303291},[],[303293],{"type":23,"value":303294},"Outdoor Daybeds",{"type":17,"tag":84,"props":303296,"children":303297},{},[303298],{"type":17,"tag":6121,"props":303299,"children":303301},{"className":303300},[],[303302],{"type":23,"value":303303},"Party Favors",{"type":17,"tag":84,"props":303305,"children":303306},{},[303307],{"type":17,"tag":6121,"props":303308,"children":303310},{"className":303309},[],[303311],{"type":23,"value":303312},"Canning Kits",{"type":17,"tag":84,"props":303314,"children":303315},{},[303316],{"type":17,"tag":6121,"props":303317,"children":303319},{"className":303318},[],[303320],{"type":23,"value":303321},"Molding & Casting Materials & Kits",{"type":17,"tag":84,"props":303323,"children":303324},{},[303325],{"type":17,"tag":6121,"props":303326,"children":303328},{"className":303327},[],[303329],{"type":23,"value":303330},"Musical Instrument Bodies",{"type":17,"tag":84,"props":303332,"children":303333},{},[303334],{"type":17,"tag":6121,"props":303335,"children":303337},{"className":303336},[],[303338],{"type":23,"value":303339},"Other Games",{"type":17,"tag":84,"props":303341,"children":303342},{},[303343],{"type":17,"tag":6121,"props":303344,"children":303346},{"className":303345},[],[303347],{"type":23,"value":303348},"Electrolyte Solutions",{"type":17,"tag":84,"props":303350,"children":303351},{},[303352],{"type":17,"tag":6121,"props":303353,"children":303355},{"className":303354},[],[303356],{"type":23,"value":303357},"Fruit & Wine Crushers & Destemmers",{"type":17,"tag":84,"props":303359,"children":303360},{},[303361],{"type":17,"tag":6121,"props":303362,"children":303364},{"className":303363},[],[303365],{"type":23,"value":303366},"Power Inverters",{"type":17,"tag":84,"props":303368,"children":303369},{},[303370],{"type":17,"tag":6121,"props":303371,"children":303373},{"className":303372},[],[303374],{"type":23,"value":303375},"Jewelry Jump Rings & Split Rings",{"type":17,"tag":84,"props":303377,"children":303378},{},[303379],{"type":17,"tag":6121,"props":303380,"children":303382},{"className":303381},[],[303383],{"type":23,"value":303384},"Table Tennis Paddles",{"type":17,"tag":84,"props":303386,"children":303387},{},[303388],{"type":17,"tag":6121,"props":303389,"children":303391},{"className":303390},[],[303392],{"type":23,"value":303393},"SIM Card Backup Devices",{"type":17,"tag":84,"props":303395,"children":303396},{},[303397],{"type":17,"tag":6121,"props":303398,"children":303400},{"className":303399},[],[303401],{"type":23,"value":303402},"Tie Pins",{"type":17,"tag":84,"props":303404,"children":303405},{},[303406],{"type":17,"tag":6121,"props":303407,"children":303409},{"className":303408},[],[303410],{"type":23,"value":303411},"Billiard Tables",{"type":17,"tag":84,"props":303413,"children":303414},{},[303415],{"type":17,"tag":6121,"props":303416,"children":303418},{"className":303417},[],[303419],{"type":23,"value":303420},"Archery Broadheads",{"type":17,"tag":84,"props":303422,"children":303423},{},[303424],{"type":17,"tag":6121,"props":303425,"children":303427},{"className":303426},[],[303428],{"type":23,"value":303429},"Vehicle Windshields",{"type":17,"tag":84,"props":303431,"children":303432},{},[303433],{"type":17,"tag":6121,"props":303434,"children":303436},{"className":303435},[],[303437],{"type":23,"value":303438},"Jock Straps",{"type":17,"tag":84,"props":303440,"children":303441},{},[303442],{"type":17,"tag":6121,"props":303443,"children":303445},{"className":303444},[],[303446],{"type":23,"value":303447},"Pet Live Animals",{"type":17,"tag":84,"props":303449,"children":303450},{},[303451],{"type":17,"tag":6121,"props":303452,"children":303454},{"className":303453},[],[303455],{"type":23,"value":303456},"DC-to-DC Converters",{"type":17,"tag":84,"props":303458,"children":303459},{},[303460],{"type":17,"tag":6121,"props":303461,"children":303463},{"className":303462},[],[303464],{"type":23,"value":303465},"Transport Drums",{"type":17,"tag":84,"props":303467,"children":303468},{},[303469],{"type":17,"tag":6121,"props":303470,"children":303472},{"className":303471},[],[303473],{"type":23,"value":303474},"Vinyl Figures",{"type":17,"tag":84,"props":303476,"children":303477},{},[303478],{"type":17,"tag":6121,"props":303479,"children":303481},{"className":303480},[],[303482],{"type":23,"value":303483},"Entertainment Centers",{"type":17,"tag":84,"props":303485,"children":303486},{},[303487],{"type":17,"tag":6121,"props":303488,"children":303490},{"className":303489},[],[303491],{"type":23,"value":303492},"Fireplace Tools",{"type":17,"tag":84,"props":303494,"children":303495},{},[303496],{"type":17,"tag":6121,"props":303497,"children":303499},{"className":303498},[],[303500],{"type":23,"value":303501},"Serving Forks",{"type":17,"tag":84,"props":303503,"children":303504},{},[303505],{"type":17,"tag":6121,"props":303506,"children":303508},{"className":303507},[],[303509],{"type":23,"value":303510},"Nut Splitters",{"type":17,"tag":84,"props":303512,"children":303513},{},[303514],{"type":17,"tag":6121,"props":303515,"children":303517},{"className":303516},[],[303518],{"type":23,"value":303519},"Blasters & Foam Play",{"type":17,"tag":84,"props":303521,"children":303522},{},[303523],{"type":17,"tag":6121,"props":303524,"children":303526},{"className":303525},[],[303527],{"type":23,"value":303528},"Garden Border Edging",{"type":17,"tag":84,"props":303530,"children":303531},{},[303532],{"type":17,"tag":6121,"props":303533,"children":303535},{"className":303534},[],[303536],{"type":23,"value":303537},"Gun Holsters & Holders",{"type":17,"tag":84,"props":303539,"children":303540},{},[303541],{"type":17,"tag":6121,"props":303542,"children":303544},{"className":303543},[],[303545],{"type":23,"value":303546},"Spice Racks & Organizers",{"type":17,"tag":84,"props":303548,"children":303549},{},[303550],{"type":17,"tag":6121,"props":303551,"children":303553},{"className":303552},[],[303554],{"type":23,"value":303555},"Stamps & Stamp Sets",{"type":17,"tag":84,"props":303557,"children":303558},{},[303559],{"type":17,"tag":6121,"props":303560,"children":303562},{"className":303561},[],[303563],{"type":23,"value":303564},"Udu Drums",{"type":17,"tag":84,"props":303566,"children":303567},{},[303568],{"type":17,"tag":6121,"props":303569,"children":303571},{"className":303570},[],[303572],{"type":23,"value":303573},"Reception Chairs & Seating",{"type":17,"tag":84,"props":303575,"children":303576},{},[303577],{"type":17,"tag":6121,"props":303578,"children":303580},{"className":303579},[],[303581],{"type":23,"value":303582},"Pepper & Peppercorns",{"type":17,"tag":84,"props":303584,"children":303585},{},[303586],{"type":17,"tag":6121,"props":303587,"children":303589},{"className":303588},[],[303590],{"type":23,"value":303591},"Golf Drivers",{"type":17,"tag":84,"props":303593,"children":303594},{},[303595],{"type":17,"tag":6121,"props":303596,"children":303598},{"className":303597},[],[303599],{"type":23,"value":303600},"CC Cream",{"type":17,"tag":84,"props":303602,"children":303603},{},[303604],{"type":17,"tag":6121,"props":303605,"children":303607},{"className":303606},[],[303608],{"type":23,"value":303609},"Yoga Socks",{"type":17,"tag":84,"props":303611,"children":303612},{},[303613],{"type":17,"tag":6121,"props":303614,"children":303616},{"className":303615},[],[303617],{"type":23,"value":303618},"Vacuum Cleaner Attachments",{"type":17,"tag":84,"props":303620,"children":303621},{},[303622],{"type":17,"tag":6121,"props":303623,"children":303625},{"className":303624},[],[303626],{"type":23,"value":303627},"Planter Liners",{"type":17,"tag":84,"props":303629,"children":303630},{},[303631],{"type":17,"tag":6121,"props":303632,"children":303634},{"className":303633},[],[303635],{"type":23,"value":303636},"Pie & Pastry Fillings",{"type":17,"tag":84,"props":303638,"children":303639},{},[303640],{"type":17,"tag":6121,"props":303641,"children":303643},{"className":303642},[],[303644],{"type":23,"value":303645},"Bed Skirts",{"type":17,"tag":84,"props":303647,"children":303648},{},[303649],{"type":17,"tag":6121,"props":303650,"children":303652},{"className":303651},[],[303653],{"type":23,"value":303654},"Dart Carrying Cases & Wallets",{"type":17,"tag":84,"props":303656,"children":303657},{},[303658],{"type":17,"tag":6121,"props":303659,"children":303661},{"className":303660},[],[303662],{"type":23,"value":303663},"Pizza Ovens",{"type":17,"tag":84,"props":303665,"children":303666},{},[303667],{"type":17,"tag":6121,"props":303668,"children":303670},{"className":303669},[],[303671],{"type":23,"value":303672},"Crepe Spreaders",{"type":17,"tag":84,"props":303674,"children":303675},{},[303676],{"type":17,"tag":6121,"props":303677,"children":303679},{"className":303678},[],[303680],{"type":23,"value":303681},"Hex Tools",{"type":17,"tag":84,"props":303683,"children":303684},{},[303685],{"type":17,"tag":6121,"props":303686,"children":303688},{"className":303687},[],[303689],{"type":23,"value":303690},"Stretch Film & Shrink Wrap",{"type":17,"tag":84,"props":303692,"children":303693},{},[303694],{"type":17,"tag":6121,"props":303695,"children":303697},{"className":303696},[],[303698],{"type":23,"value":303699},"Massage Headrests",{"type":17,"tag":84,"props":303701,"children":303702},{},[303703],{"type":17,"tag":6121,"props":303704,"children":303706},{"className":303705},[],[303707],{"type":23,"value":303708},"Electronics Carrying Cases",{"type":17,"tag":84,"props":303710,"children":303711},{},[303712],{"type":17,"tag":6121,"props":303713,"children":303715},{"className":303714},[],[303716],{"type":23,"value":303717},"Dust Collectors",{"type":17,"tag":84,"props":303719,"children":303720},{},[303721],{"type":17,"tag":6121,"props":303722,"children":303724},{"className":303723},[],[303725],{"type":23,"value":303726},"Decorative Stones",{"type":17,"tag":84,"props":303728,"children":303729},{},[303730],{"type":17,"tag":6121,"props":303731,"children":303733},{"className":303732},[],[303734],{"type":23,"value":303735},"Yoga Straps",{"type":17,"tag":84,"props":303737,"children":303738},{},[303739],{"type":17,"tag":6121,"props":303740,"children":303742},{"className":303741},[],[303743],{"type":23,"value":303744},"Espresso Machines",{"type":17,"tag":84,"props":303746,"children":303747},{},[303748],{"type":17,"tag":6121,"props":303749,"children":303751},{"className":303750},[],[303752],{"type":23,"value":303753},"Lab Face Masks & Shields",{"type":17,"tag":84,"props":303755,"children":303756},{},[303757],{"type":17,"tag":6121,"props":303758,"children":303760},{"className":303759},[],[303761],{"type":23,"value":303762},"Guitar Effects Pedals",{"type":17,"tag":84,"props":303764,"children":303765},{},[303766],{"type":17,"tag":6121,"props":303767,"children":303769},{"className":303768},[],[303770],{"type":23,"value":303771},"Hockey Hip Pads",{"type":17,"tag":84,"props":303773,"children":303774},{},[303775],{"type":17,"tag":6121,"props":303776,"children":303778},{"className":303777},[],[303779],{"type":23,"value":303780},"Pressure Cookers & Canners",{"type":17,"tag":84,"props":303782,"children":303783},{},[303784],{"type":17,"tag":6121,"props":303785,"children":303787},{"className":303786},[],[303788],{"type":23,"value":303789},"Diabetic Foot Care",{"type":17,"tag":84,"props":303791,"children":303792},{},[303793],{"type":17,"tag":6121,"props":303794,"children":303796},{"className":303795},[],[303797],{"type":23,"value":303798},"Nail Top Coat",{"type":17,"tag":84,"props":303800,"children":303801},{},[303802],{"type":17,"tag":6121,"props":303803,"children":303805},{"className":303804},[],[303806],{"type":23,"value":303807},"Wax Molding Materials",{"type":17,"tag":84,"props":303809,"children":303810},{},[303811],{"type":17,"tag":6121,"props":303812,"children":303814},{"className":303813},[],[303815],{"type":23,"value":303816},"Dock Guards",{"type":17,"tag":84,"props":303818,"children":303819},{},[303820],{"type":17,"tag":6121,"props":303821,"children":303823},{"className":303822},[],[303824],{"type":23,"value":303825},"Decoupage Tools & Sets",{"type":17,"tag":84,"props":303827,"children":303828},{},[303829],{"type":17,"tag":6121,"props":303830,"children":303832},{"className":303831},[],[303833],{"type":23,"value":303834},"Rugby Balls",{"type":17,"tag":84,"props":303836,"children":303837},{},[303838],{"type":17,"tag":6121,"props":303839,"children":303841},{"className":303840},[],[303842],{"type":23,"value":303843},"Bra Back Adapters",{"type":17,"tag":84,"props":303845,"children":303846},{},[303847],{"type":17,"tag":6121,"props":303848,"children":303850},{"className":303849},[],[303851],{"type":23,"value":303852},"Other Backyard Wildlife Supplies",{"type":17,"tag":84,"props":303854,"children":303855},{},[303856],{"type":17,"tag":6121,"props":303857,"children":303859},{"className":303858},[],[303860],{"type":23,"value":303861},"Food Peelers",{"type":17,"tag":84,"props":303863,"children":303864},{},[303865],{"type":17,"tag":6121,"props":303866,"children":303868},{"className":303867},[],[303869],{"type":23,"value":303870},"Modular Synthesizers",{"type":17,"tag":84,"props":303872,"children":303873},{},[303874],{"type":17,"tag":6121,"props":303875,"children":303877},{"className":303876},[],[303878],{"type":23,"value":303879},"Mirror Balls",{"type":17,"tag":84,"props":303881,"children":303882},{},[303883],{"type":17,"tag":6121,"props":303884,"children":303886},{"className":303885},[],[303887],{"type":23,"value":303888},"Cricket Wickets",{"type":17,"tag":84,"props":303890,"children":303891},{},[303892],{"type":17,"tag":6121,"props":303893,"children":303895},{"className":303894},[],[303896],{"type":23,"value":303897},"Snatch Rigging Blocks",{"type":17,"tag":84,"props":303899,"children":303900},{},[303901],{"type":17,"tag":6121,"props":303902,"children":303904},{"className":303903},[],[303905],{"type":23,"value":303906},"Rowing Shells",{"type":17,"tag":84,"props":303908,"children":303909},{},[303910],{"type":17,"tag":6121,"props":303911,"children":303913},{"className":303912},[],[303914],{"type":23,"value":303915},"Staple Gun Staples",{"type":17,"tag":84,"props":303917,"children":303918},{},[303919],{"type":17,"tag":6121,"props":303920,"children":303922},{"className":303921},[],[303923],{"type":23,"value":303924},"Golf Rangefinders",{"type":17,"tag":84,"props":303926,"children":303927},{},[303928],{"type":17,"tag":6121,"props":303929,"children":303931},{"className":303930},[],[303932],{"type":23,"value":303933},"Waterbed Liners",{"type":17,"tag":84,"props":303935,"children":303936},{},[303937],{"type":17,"tag":6121,"props":303938,"children":303940},{"className":303939},[],[303941],{"type":23,"value":303942},"Beer Glasses",{"type":17,"tag":84,"props":303944,"children":303945},{},[303946],{"type":17,"tag":6121,"props":303947,"children":303949},{"className":303948},[],[303950],{"type":23,"value":303951},"KVM Switches",{"type":17,"tag":84,"props":303953,"children":303954},{},[303955],{"type":17,"tag":6121,"props":303956,"children":303958},{"className":303957},[],[303959],{"type":23,"value":303960},"Panel Carriers",{"type":17,"tag":84,"props":303962,"children":303963},{},[303964],{"type":17,"tag":6121,"props":303965,"children":303967},{"className":303966},[],[303968],{"type":23,"value":303969},"Sanding Frames",{"type":17,"tag":84,"props":303971,"children":303972},{},[303973],{"type":17,"tag":6121,"props":303974,"children":303976},{"className":303975},[],[303977],{"type":23,"value":303978},"First Aid Tape",{"type":17,"tag":84,"props":303980,"children":303981},{},[303982],{"type":17,"tag":6121,"props":303983,"children":303985},{"className":303984},[],[303986],{"type":23,"value":303987},"Hand Pruners & Loppers",{"type":17,"tag":84,"props":303989,"children":303990},{},[303991],{"type":17,"tag":6121,"props":303992,"children":303994},{"className":303993},[],[303995],{"type":23,"value":303996},"Reusable Training Pants",{"type":17,"tag":84,"props":303998,"children":303999},{},[304000],{"type":17,"tag":6121,"props":304001,"children":304003},{"className":304002},[],[304004],{"type":23,"value":304005},"Outdoor Spas",{"type":17,"tag":84,"props":304007,"children":304008},{},[304009],{"type":17,"tag":6121,"props":304010,"children":304012},{"className":304011},[],[304013],{"type":23,"value":304014},"Air Hockey Pucks",{"type":17,"tag":84,"props":304016,"children":304017},{},[304018],{"type":17,"tag":6121,"props":304019,"children":304021},{"className":304020},[],[304022],{"type":23,"value":304023},"Cat Trees",{"type":17,"tag":84,"props":304025,"children":304026},{},[304027],{"type":17,"tag":6121,"props":304028,"children":304030},{"className":304029},[],[304031],{"type":23,"value":304032},"Surgical Gowns",{"type":17,"tag":84,"props":304034,"children":304035},{},[304036],{"type":17,"tag":6121,"props":304037,"children":304039},{"className":304038},[],[304040],{"type":23,"value":304041},"Baseball Protective Screens",{"type":17,"tag":84,"props":304043,"children":304044},{},[304045],{"type":17,"tag":6121,"props":304046,"children":304048},{"className":304047},[],[304049],{"type":23,"value":304050},"Artificial Plants",{"type":17,"tag":84,"props":304052,"children":304053},{},[304054],{"type":17,"tag":6121,"props":304055,"children":304057},{"className":304056},[],[304058],{"type":23,"value":304059},"Basting Brushes",{"type":17,"tag":84,"props":304061,"children":304062},{},[304063],{"type":17,"tag":6121,"props":304064,"children":304066},{"className":304065},[],[304067],{"type":23,"value":304068},"Archery Arrows",{"type":17,"tag":84,"props":304070,"children":304071},{},[304072],{"type":17,"tag":6121,"props":304073,"children":304075},{"className":304074},[],[304076],{"type":23,"value":304077},"Calibration Weights",{"type":17,"tag":84,"props":304079,"children":304080},{},[304081],{"type":17,"tag":6121,"props":304082,"children":304084},{"className":304083},[],[304085],{"type":23,"value":304086},"Laptop Computers",{"type":17,"tag":84,"props":304088,"children":304089},{},[304090],{"type":17,"tag":6121,"props":304091,"children":304093},{"className":304092},[],[304094],{"type":23,"value":304095},"Chalkboard Chalk",{"type":17,"tag":84,"props":304097,"children":304098},{},[304099],{"type":17,"tag":6121,"props":304100,"children":304102},{"className":304101},[],[304103],{"type":23,"value":304104},"Nasal Aspirators",{"type":17,"tag":84,"props":304106,"children":304107},{},[304108],{"type":17,"tag":6121,"props":304109,"children":304111},{"className":304110},[],[304112],{"type":23,"value":304113},"Instant Coffee",{"type":17,"tag":84,"props":304115,"children":304116},{},[304117],{"type":17,"tag":6121,"props":304118,"children":304120},{"className":304119},[],[304121],{"type":23,"value":304122},"Vanity Tables & Table & Bench Sets",{"type":17,"tag":84,"props":304124,"children":304125},{},[304126],{"type":17,"tag":6121,"props":304127,"children":304129},{"className":304128},[],[304130],{"type":23,"value":304131},"Printer Drums",{"type":17,"tag":84,"props":304133,"children":304134},{},[304135],{"type":17,"tag":6121,"props":304136,"children":304138},{"className":304137},[],[304139],{"type":23,"value":304140},"Automotive Body Paint",{"type":17,"tag":84,"props":304142,"children":304143},{},[304144],{"type":17,"tag":6121,"props":304145,"children":304147},{"className":304146},[],[304148],{"type":23,"value":304149},"Paraffin Treatment Hand & Foot Mitts",{"type":17,"tag":84,"props":304151,"children":304152},{},[304153],{"type":17,"tag":6121,"props":304154,"children":304156},{"className":304155},[],[304157],{"type":23,"value":304158},"Stovetop Espresso Pots",{"type":17,"tag":84,"props":304160,"children":304161},{},[304162],{"type":17,"tag":6121,"props":304163,"children":304165},{"className":304164},[],[304166],{"type":23,"value":304167},"Robotic Lawn Mowers",{"type":17,"tag":84,"props":304169,"children":304170},{},[304171],{"type":17,"tag":6121,"props":304172,"children":304174},{"className":304173},[],[304175],{"type":23,"value":304176},"Phone Grips",{"type":17,"tag":84,"props":304178,"children":304179},{},[304180],{"type":17,"tag":6121,"props":304181,"children":304183},{"className":304182},[],[304184],{"type":23,"value":304185},"Hammock Chairs",{"type":17,"tag":84,"props":304187,"children":304188},{},[304189],{"type":17,"tag":6121,"props":304190,"children":304192},{"className":304191},[],[304193],{"type":23,"value":304194},"Home Brewing Kegs & Keg Supplies",{"type":17,"tag":84,"props":304196,"children":304197},{},[304198],{"type":17,"tag":6121,"props":304199,"children":304201},{"className":304200},[],[304202],{"type":23,"value":304203},"Dishwasher Rack Adjusters",{"type":17,"tag":84,"props":304205,"children":304206},{},[304207],{"type":17,"tag":6121,"props":304208,"children":304210},{"className":304209},[],[304211],{"type":23,"value":304212},"Sculpting Tools & Kits",{"type":17,"tag":84,"props":304214,"children":304215},{},[304216],{"type":17,"tag":6121,"props":304217,"children":304219},{"className":304218},[],[304220],{"type":23,"value":304221},"Mattocks & Pickaxes",{"type":17,"tag":84,"props":304223,"children":304224},{},[304225],{"type":17,"tag":6121,"props":304226,"children":304228},{"className":304227},[],[304229],{"type":23,"value":304230},"Watch & Clock Hands",{"type":17,"tag":84,"props":304232,"children":304233},{},[304234],{"type":17,"tag":6121,"props":304235,"children":304237},{"className":304236},[],[304238],{"type":23,"value":304239},"Umpire Bags",{"type":17,"tag":84,"props":304241,"children":304242},{},[304243],{"type":17,"tag":6121,"props":304244,"children":304246},{"className":304245},[],[304247],{"type":23,"value":304248},"Other Lighting Accessories",{"type":17,"tag":84,"props":304250,"children":304251},{},[304252],{"type":17,"tag":6121,"props":304253,"children":304255},{"className":304254},[],[304256],{"type":23,"value":304257},"Lab Shaker Accessories",{"type":17,"tag":84,"props":304259,"children":304260},{},[304261],{"type":17,"tag":6121,"props":304262,"children":304264},{"className":304263},[],[304265],{"type":23,"value":304266},"Print Servers",{"type":17,"tag":84,"props":304268,"children":304269},{},[304270],{"type":17,"tag":6121,"props":304271,"children":304273},{"className":304272},[],[304274],{"type":23,"value":304275},"Home Brewing Beer Bottle Trees",{"type":17,"tag":84,"props":304277,"children":304278},{},[304279],{"type":17,"tag":6121,"props":304280,"children":304282},{"className":304281},[],[304283],{"type":23,"value":304284},"Football Hand Warmers",{"type":17,"tag":84,"props":304286,"children":304287},{},[304288],{"type":17,"tag":6121,"props":304289,"children":304291},{"className":304290},[],[304292],{"type":23,"value":304293},"Spectrum Analyzers",{"type":17,"tag":84,"props":304295,"children":304296},{},[304297],{"type":17,"tag":6121,"props":304298,"children":304300},{"className":304299},[],[304301],{"type":23,"value":304302},"Hair Perms & Texturizers",{"type":17,"tag":84,"props":304304,"children":304305},{},[304306],{"type":17,"tag":6121,"props":304307,"children":304309},{"className":304308},[],[304310],{"type":23,"value":304311},"Lab Glassware Washers",{"type":17,"tag":84,"props":304313,"children":304314},{},[304315],{"type":17,"tag":6121,"props":304316,"children":304318},{"className":304317},[],[304319],{"type":23,"value":304320},"Trailer Weight Distributing Systems",{"type":17,"tag":84,"props":304322,"children":304323},{},[304324],{"type":17,"tag":6121,"props":304325,"children":304327},{"className":304326},[],[304328],{"type":23,"value":304329},"Digital Cameras",{"type":17,"tag":84,"props":304331,"children":304332},{},[304333],{"type":17,"tag":6121,"props":304334,"children":304336},{"className":304335},[],[304337],{"type":23,"value":304338},"Drum & Pail Mixers",{"type":17,"tag":84,"props":304340,"children":304341},{},[304342],{"type":17,"tag":6121,"props":304343,"children":304345},{"className":304344},[],[304346],{"type":23,"value":304347},"Porch Swings",{"type":17,"tag":84,"props":304349,"children":304350},{},[304351],{"type":17,"tag":6121,"props":304352,"children":304354},{"className":304353},[],[304355],{"type":23,"value":304356},"Gun Choke Tubes",{"type":17,"tag":84,"props":304358,"children":304359},{},[304360],{"type":17,"tag":6121,"props":304361,"children":304363},{"className":304362},[],[304364],{"type":23,"value":304365},"Pet Milk Replacers",{"type":17,"tag":84,"props":304367,"children":304368},{},[304369],{"type":17,"tag":6121,"props":304370,"children":304372},{"className":304371},[],[304373],{"type":23,"value":304374},"Fabric Paints",{"type":17,"tag":84,"props":304376,"children":304377},{},[304378],{"type":17,"tag":6121,"props":304379,"children":304381},{"className":304380},[],[304382],{"type":23,"value":304383},"Other Kiteboarding Accessories",{"type":17,"tag":84,"props":304385,"children":304386},{},[304387],{"type":17,"tag":6121,"props":304388,"children":304390},{"className":304389},[],[304391],{"type":23,"value":304392},"Paper Cups",{"type":17,"tag":84,"props":304394,"children":304395},{},[304396],{"type":17,"tag":6121,"props":304397,"children":304399},{"className":304398},[],[304400],{"type":23,"value":304401},"Bottle Pourers",{"type":17,"tag":84,"props":304403,"children":304404},{},[304405],{"type":17,"tag":6121,"props":304406,"children":304408},{"className":304407},[],[304409],{"type":23,"value":304410},"Golf Divot Tools",{"type":17,"tag":84,"props":304412,"children":304413},{},[304414],{"type":17,"tag":6121,"props":304415,"children":304417},{"className":304416},[],[304418],{"type":23,"value":304419},"Aquarium Cleaning Tools",{"type":17,"tag":84,"props":304421,"children":304422},{},[304423],{"type":17,"tag":6121,"props":304424,"children":304426},{"className":304425},[],[304427],{"type":23,"value":304428},"Fishing Vest & Packs",{"type":17,"tag":84,"props":304430,"children":304431},{},[304432],{"type":17,"tag":6121,"props":304433,"children":304435},{"className":304434},[],[304436],{"type":23,"value":304437},"Die-Cut Cartridges",{"type":17,"tag":84,"props":304439,"children":304440},{},[304441],{"type":17,"tag":6121,"props":304442,"children":304444},{"className":304443},[],[304445],{"type":23,"value":304446},"Kiteboard Control Bars",{"type":17,"tag":84,"props":304448,"children":304449},{},[304450],{"type":17,"tag":6121,"props":304451,"children":304453},{"className":304452},[],[304454],{"type":23,"value":304455},"Welding Tips",{"type":17,"tag":84,"props":304457,"children":304458},{},[304459],{"type":17,"tag":6121,"props":304460,"children":304462},{"className":304461},[],[304463],{"type":23,"value":304464},"Food Tongs",{"type":17,"tag":84,"props":304466,"children":304467},{},[304468],{"type":17,"tag":6121,"props":304469,"children":304471},{"className":304470},[],[304472],{"type":23,"value":304473},"Corn & Callus Remover Cushions",{"type":17,"tag":84,"props":304475,"children":304476},{},[304477],{"type":17,"tag":6121,"props":304478,"children":304480},{"className":304479},[],[304481],{"type":23,"value":304482},"Cocktail Shakers",{"type":17,"tag":84,"props":304484,"children":304485},{},[304486],{"type":17,"tag":6121,"props":304487,"children":304489},{"className":304488},[],[304490],{"type":23,"value":304491},"Inspection Mirrors",{"type":17,"tag":84,"props":304493,"children":304494},{},[304495],{"type":17,"tag":6121,"props":304496,"children":304498},{"className":304497},[],[304499],{"type":23,"value":304500},"Fruit Snacks",{"type":17,"tag":84,"props":304502,"children":304503},{},[304504],{"type":17,"tag":6121,"props":304505,"children":304507},{"className":304506},[],[304508],{"type":23,"value":304509},"Kayak Storage Racks",{"type":17,"tag":84,"props":304511,"children":304512},{},[304513],{"type":17,"tag":6121,"props":304514,"children":304516},{"className":304515},[],[304517],{"type":23,"value":304518},"Cycling Vests",{"type":17,"tag":84,"props":304520,"children":304521},{},[304522],{"type":17,"tag":6121,"props":304523,"children":304525},{"className":304524},[],[304526],{"type":23,"value":304527},"Field Hockey Goggles",{"type":17,"tag":84,"props":304529,"children":304530},{},[304531],{"type":17,"tag":6121,"props":304532,"children":304534},{"className":304533},[],[304535],{"type":23,"value":304536},"Breathalyzer Alcohol Monitors",{"type":17,"tag":84,"props":304538,"children":304539},{},[304540],{"type":17,"tag":6121,"props":304541,"children":304543},{"className":304542},[],[304544],{"type":23,"value":304545},"Dry Erase Markers",{"type":17,"tag":84,"props":304547,"children":304548},{},[304549],{"type":17,"tag":6121,"props":304550,"children":304552},{"className":304551},[],[304553],{"type":23,"value":304554},"Racquet Sport Stringing Machines",{"type":17,"tag":84,"props":304556,"children":304557},{},[304558],{"type":17,"tag":6121,"props":304559,"children":304561},{"className":304560},[],[304562],{"type":23,"value":304563},"Gun Swivels",{"type":17,"tag":84,"props":304565,"children":304566},{},[304567],{"type":17,"tag":6121,"props":304568,"children":304570},{"className":304569},[],[304571],{"type":23,"value":304572},"Power Tool Chargers",{"type":17,"tag":84,"props":304574,"children":304575},{},[304576],{"type":17,"tag":6121,"props":304577,"children":304579},{"className":304578},[],[304580],{"type":23,"value":304581},"Home Brewing Sanitization Kits",{"type":17,"tag":84,"props":304583,"children":304584},{},[304585],{"type":17,"tag":6121,"props":304586,"children":304588},{"className":304587},[],[304589],{"type":23,"value":304590},"Ice Cream, Sorbet & Frozen Yogurt",{"type":17,"tag":84,"props":304592,"children":304593},{},[304594],{"type":17,"tag":6121,"props":304595,"children":304597},{"className":304596},[],[304598],{"type":23,"value":304599},"Underwater Cameras",{"type":17,"tag":84,"props":304601,"children":304602},{},[304603],{"type":17,"tag":6121,"props":304604,"children":304606},{"className":304605},[],[304607],{"type":23,"value":304608},"Hair Color Stain Shields",{"type":17,"tag":84,"props":304610,"children":304611},{},[304612],{"type":17,"tag":6121,"props":304613,"children":304615},{"className":304614},[],[304616],{"type":23,"value":304617},"Roof Gutter Accessories",{"type":17,"tag":84,"props":304619,"children":304620},{},[304621],{"type":17,"tag":6121,"props":304622,"children":304624},{"className":304623},[],[304625],{"type":23,"value":304626},"Bicycle Brake Rotors",{"type":17,"tag":84,"props":304628,"children":304629},{},[304630],{"type":17,"tag":6121,"props":304631,"children":304633},{"className":304632},[],[304634],{"type":23,"value":304635},"Repinique Drums",{"type":17,"tag":84,"props":304637,"children":304638},{},[304639],{"type":17,"tag":6121,"props":304640,"children":304642},{"className":304641},[],[304643],{"type":23,"value":304644},"Camera Film Backs & Holders",{"type":17,"tag":84,"props":304646,"children":304647},{},[304648],{"type":17,"tag":6121,"props":304649,"children":304651},{"className":304650},[],[304652],{"type":23,"value":304653},"Automotive Cigarette Lighters & Plugs",{"type":17,"tag":84,"props":304655,"children":304656},{},[304657],{"type":17,"tag":6121,"props":304658,"children":304660},{"className":304659},[],[304661],{"type":23,"value":304662},"Meal Kits",{"type":17,"tag":84,"props":304664,"children":304665},{},[304666],{"type":17,"tag":6121,"props":304667,"children":304669},{"className":304668},[],[304670],{"type":23,"value":304671},"Lathe Cole Jaws",{"type":17,"tag":84,"props":304673,"children":304674},{},[304675],{"type":17,"tag":6121,"props":304676,"children":304678},{"className":304677},[],[304679],{"type":23,"value":304680},"PBX Phone Systems",{"type":17,"tag":84,"props":304682,"children":304683},{},[304684],{"type":17,"tag":6121,"props":304685,"children":304687},{"className":304686},[],[304688],{"type":23,"value":304689},"Face Serums",{"type":17,"tag":84,"props":304691,"children":304692},{},[304693],{"type":17,"tag":6121,"props":304694,"children":304696},{"className":304695},[],[304697],{"type":23,"value":304698},"Exercise Treadmills",{"type":17,"tag":84,"props":304700,"children":304701},{},[304702],{"type":17,"tag":6121,"props":304703,"children":304705},{"className":304704},[],[304706],{"type":23,"value":304707},"Lawn Sweepers",{"type":17,"tag":84,"props":304709,"children":304710},{},[304711],{"type":17,"tag":6121,"props":304712,"children":304714},{"className":304713},[],[304715],{"type":23,"value":304716},"Sunglasses Replacement Lenses",{"type":17,"tag":84,"props":304718,"children":304719},{},[304720],{"type":17,"tag":6121,"props":304721,"children":304723},{"className":304722},[],[304724],{"type":23,"value":304725},"Pipe Fitting Reducers",{"type":17,"tag":84,"props":304727,"children":304728},{},[304729],{"type":17,"tag":6121,"props":304730,"children":304732},{"className":304731},[],[304733],{"type":23,"value":304734},"Microphone Pop Filters",{"type":17,"tag":84,"props":304736,"children":304737},{},[304738],{"type":17,"tag":6121,"props":304739,"children":304741},{"className":304740},[],[304742],{"type":23,"value":304743},"MiniDisc Players",{"type":17,"tag":84,"props":304745,"children":304746},{},[304747],{"type":17,"tag":6121,"props":304748,"children":304750},{"className":304749},[],[304751],{"type":23,"value":304752},"Audio/Video Cables",{"type":17,"tag":84,"props":304754,"children":304755},{},[304756],{"type":17,"tag":6121,"props":304757,"children":304759},{"className":304758},[],[304760],{"type":23,"value":304761},"Hand Sanitizers",{"type":17,"tag":84,"props":304763,"children":304764},{},[304765],{"type":17,"tag":6121,"props":304766,"children":304768},{"className":304767},[],[304769],{"type":23,"value":304770},"Nail Pullers",{"type":17,"tag":84,"props":304772,"children":304773},{},[304774],{"type":17,"tag":6121,"props":304775,"children":304777},{"className":304776},[],[304778],{"type":23,"value":304779},"Traditional Salwar Kameez",{"type":17,"tag":84,"props":304781,"children":304782},{},[304783],{"type":17,"tag":6121,"props":304784,"children":304786},{"className":304785},[],[304787],{"type":23,"value":304788},"Other Air Tool Accessories",{"type":17,"tag":84,"props":304790,"children":304791},{},[304792],{"type":17,"tag":6121,"props":304793,"children":304795},{"className":304794},[],[304796],{"type":23,"value":304797},"Cymbal Pads",{"type":17,"tag":84,"props":304799,"children":304800},{},[304801],{"type":17,"tag":6121,"props":304802,"children":304804},{"className":304803},[],[304805],{"type":23,"value":304806},"Automotive Winch Mounting Systems",{"type":17,"tag":84,"props":304808,"children":304809},{},[304810],{"type":17,"tag":6121,"props":304811,"children":304813},{"className":304812},[],[304814],{"type":23,"value":304815},"Laptop Bags",{"type":17,"tag":84,"props":304817,"children":304818},{},[304819],{"type":17,"tag":6121,"props":304820,"children":304822},{"className":304821},[],[304823],{"type":23,"value":304824},"Contour Makeup Set",{"type":17,"tag":84,"props":304826,"children":304827},{},[304828],{"type":17,"tag":6121,"props":304829,"children":304831},{"className":304830},[],[304832],{"type":23,"value":304833},"Puzzle Cubes",{"type":17,"tag":84,"props":304835,"children":304836},{},[304837],{"type":17,"tag":6121,"props":304838,"children":304840},{"className":304839},[],[304841],{"type":23,"value":304842},"Plant Covers",{"type":17,"tag":84,"props":304844,"children":304845},{},[304846],{"type":17,"tag":6121,"props":304847,"children":304849},{"className":304848},[],[304850],{"type":23,"value":304851},"Empty Paint Cans",{"type":17,"tag":84,"props":304853,"children":304854},{},[304855],{"type":17,"tag":6121,"props":304856,"children":304858},{"className":304857},[],[304859],{"type":23,"value":304860},"Tableware Knives",{"type":17,"tag":84,"props":304862,"children":304863},{},[304864],{"type":17,"tag":6121,"props":304865,"children":304867},{"className":304866},[],[304868],{"type":23,"value":304869},"Storage Sheds",{"type":17,"tag":84,"props":304871,"children":304872},{},[304873],{"type":17,"tag":6121,"props":304874,"children":304876},{"className":304875},[],[304877],{"type":23,"value":304878},"Window & Door Frames",{"type":17,"tag":84,"props":304880,"children":304881},{},[304882],{"type":17,"tag":6121,"props":304883,"children":304885},{"className":304884},[],[304886],{"type":23,"value":304887},"Paper Plates",{"type":17,"tag":84,"props":304889,"children":304890},{},[304891],{"type":17,"tag":6121,"props":304892,"children":304894},{"className":304893},[],[304895],{"type":23,"value":304896},"Calculator Accessories",{"type":17,"tag":84,"props":304898,"children":304899},{},[304900],{"type":17,"tag":6121,"props":304901,"children":304903},{"className":304902},[],[304904],{"type":23,"value":304905},"Shaving Sets",{"type":17,"tag":84,"props":304907,"children":304908},{},[304909],{"type":17,"tag":6121,"props":304910,"children":304912},{"className":304911},[],[304913],{"type":23,"value":304914},"Microphone Preamplifiers",{"type":17,"tag":84,"props":304916,"children":304917},{},[304918],{"type":17,"tag":6121,"props":304919,"children":304921},{"className":304920},[],[304922],{"type":23,"value":304923},"Baby Feeding Chairs",{"type":17,"tag":84,"props":304925,"children":304926},{},[304927],{"type":17,"tag":6121,"props":304928,"children":304930},{"className":304929},[],[304931],{"type":23,"value":304932},"Rain Ponchos",{"type":17,"tag":84,"props":304934,"children":304935},{},[304936],{"type":17,"tag":6121,"props":304937,"children":304939},{"className":304938},[],[304940],{"type":23,"value":304941},"Aquarium Thermometers",{"type":17,"tag":84,"props":304943,"children":304944},{},[304945],{"type":17,"tag":6121,"props":304946,"children":304948},{"className":304947},[],[304949],{"type":23,"value":304950},"Mini Helmets",{"type":17,"tag":84,"props":304952,"children":304953},{},[304954],{"type":17,"tag":6121,"props":304955,"children":304957},{"className":304956},[],[304958],{"type":23,"value":304959},"RV Awnings",{"type":17,"tag":84,"props":304961,"children":304962},{},[304963],{"type":17,"tag":6121,"props":304964,"children":304966},{"className":304965},[],[304967],{"type":23,"value":304968},"Lawn & Garden Sprayers",{"type":17,"tag":84,"props":304970,"children":304971},{},[304972],{"type":17,"tag":6121,"props":304973,"children":304975},{"className":304974},[],[304976],{"type":23,"value":304977},"Car CD Changers",{"type":17,"tag":84,"props":304979,"children":304980},{},[304981],{"type":17,"tag":6121,"props":304982,"children":304984},{"className":304983},[],[304985],{"type":23,"value":304986},"Selfie Sticks",{"type":17,"tag":84,"props":304988,"children":304989},{},[304990],{"type":17,"tag":6121,"props":304991,"children":304993},{"className":304992},[],[304994],{"type":23,"value":304995},"Calibration Standard Rods",{"type":17,"tag":84,"props":304997,"children":304998},{},[304999],{"type":17,"tag":6121,"props":305000,"children":305002},{"className":305001},[],[305003],{"type":23,"value":305004},"Lab Chromatography TLC Developing Tanks",{"type":17,"tag":84,"props":305006,"children":305007},{},[305008],{"type":17,"tag":6121,"props":305009,"children":305011},{"className":305010},[],[305012],{"type":23,"value":305013},"Poultry Treats",{"type":17,"tag":84,"props":305015,"children":305016},{},[305017],{"type":17,"tag":6121,"props":305018,"children":305020},{"className":305019},[],[305021],{"type":23,"value":305022},"Mechanical Pencil Refills",{"type":17,"tag":84,"props":305024,"children":305025},{},[305026],{"type":17,"tag":6121,"props":305027,"children":305029},{"className":305028},[],[305030],{"type":23,"value":305031},"Dip Stands",{"type":17,"tag":84,"props":305033,"children":305034},{},[305035],{"type":17,"tag":6121,"props":305036,"children":305038},{"className":305037},[],[305039],{"type":23,"value":305040},"Drinkware Accessories",{"type":17,"tag":84,"props":305042,"children":305043},{},[305044],{"type":17,"tag":6121,"props":305045,"children":305047},{"className":305046},[],[305048],{"type":23,"value":305049},"Artist Manikins",{"type":17,"tag":84,"props":305051,"children":305052},{},[305053],{"type":17,"tag":6121,"props":305054,"children":305056},{"className":305055},[],[305057],{"type":23,"value":305058},"Leathercraft Kits",{"type":17,"tag":84,"props":305060,"children":305061},{},[305062],{"type":17,"tag":6121,"props":305063,"children":305065},{"className":305064},[],[305066],{"type":23,"value":305067},"Metalworking Spring Plungers",{"type":17,"tag":84,"props":305069,"children":305070},{},[305071],{"type":17,"tag":6121,"props":305072,"children":305074},{"className":305073},[],[305075],{"type":23,"value":305076},"Marquee Signs",{"type":17,"tag":84,"props":305078,"children":305079},{},[305080],{"type":17,"tag":6121,"props":305081,"children":305083},{"className":305082},[],[305084],{"type":23,"value":305085},"Craft Dyes",{"type":17,"tag":84,"props":305087,"children":305088},{},[305089],{"type":17,"tag":6121,"props":305090,"children":305092},{"className":305091},[],[305093],{"type":23,"value":305094},"Wakesurf Boards",{"type":17,"tag":84,"props":305096,"children":305097},{},[305098],{"type":17,"tag":6121,"props":305099,"children":305101},{"className":305100},[],[305102],{"type":23,"value":305103},"Pool Safety Supplies",{"type":17,"tag":84,"props":305105,"children":305106},{},[305107],{"type":17,"tag":6121,"props":305108,"children":305110},{"className":305109},[],[305111],{"type":23,"value":305112},"Pedal Boats",{"type":17,"tag":84,"props":305114,"children":305115},{},[305116],{"type":17,"tag":6121,"props":305117,"children":305119},{"className":305118},[],[305120],{"type":23,"value":305121},"Snack Crackers",{"type":17,"tag":84,"props":305123,"children":305124},{},[305125],{"type":17,"tag":6121,"props":305126,"children":305128},{"className":305127},[],[305129],{"type":23,"value":305130},"Jewelry Cleaning Machines",{"type":17,"tag":84,"props":305132,"children":305133},{},[305134],{"type":17,"tag":6121,"props":305135,"children":305137},{"className":305136},[],[305138],{"type":23,"value":305139},"Party Supply Sets",{"type":17,"tag":84,"props":305141,"children":305142},{},[305143],{"type":17,"tag":6121,"props":305144,"children":305146},{"className":305145},[],[305147],{"type":23,"value":305148},"Other Decking & Fencing Hardware",{"type":17,"tag":84,"props":305150,"children":305151},{},[305152],{"type":17,"tag":6121,"props":305153,"children":305155},{"className":305154},[],[305156],{"type":23,"value":305157},"Motorcycle Glasses",{"type":17,"tag":84,"props":305159,"children":305160},{},[305161],{"type":17,"tag":6121,"props":305162,"children":305164},{"className":305163},[],[305165],{"type":23,"value":305166},"Art Smocks",{"type":17,"tag":84,"props":305168,"children":305169},{},[305170],{"type":17,"tag":6121,"props":305171,"children":305173},{"className":305172},[],[305174],{"type":23,"value":305175},"Archery Nocks",{"type":17,"tag":84,"props":305177,"children":305178},{},[305179],{"type":17,"tag":6121,"props":305180,"children":305182},{"className":305181},[],[305183],{"type":23,"value":305184},"Diving Regulators",{"type":17,"tag":84,"props":305186,"children":305187},{},[305188],{"type":17,"tag":6121,"props":305189,"children":305191},{"className":305190},[],[305192],{"type":23,"value":305193},"Camera Flash Snoots",{"type":17,"tag":84,"props":305195,"children":305196},{},[305197],{"type":17,"tag":6121,"props":305198,"children":305200},{"className":305199},[],[305201],{"type":23,"value":305202},"Martial Arts Weapon Stands",{"type":17,"tag":84,"props":305204,"children":305205},{},[305206],{"type":17,"tag":6121,"props":305207,"children":305209},{"className":305208},[],[305210],{"type":23,"value":305211},"Automotive Wiper Nozzles",{"type":17,"tag":84,"props":305213,"children":305214},{},[305215],{"type":17,"tag":6121,"props":305216,"children":305218},{"className":305217},[],[305219],{"type":23,"value":305220},"Tea Cozies",{"type":17,"tag":84,"props":305222,"children":305223},{},[305224],{"type":17,"tag":6121,"props":305225,"children":305227},{"className":305226},[],[305228],{"type":23,"value":305229},"Stadium Seats & Cushions",{"type":17,"tag":84,"props":305231,"children":305232},{},[305233],{"type":17,"tag":6121,"props":305234,"children":305236},{"className":305235},[],[305237],{"type":23,"value":305238},"Bear Protection",{"type":17,"tag":84,"props":305240,"children":305241},{},[305242],{"type":17,"tag":6121,"props":305243,"children":305245},{"className":305244},[],[305246],{"type":23,"value":305247},"Flagpole Brackets & Mounts",{"type":17,"tag":84,"props":305249,"children":305250},{},[305251],{"type":17,"tag":6121,"props":305252,"children":305254},{"className":305253},[],[305255],{"type":23,"value":305256},"Patio Umbrella Base Weights",{"type":17,"tag":84,"props":305258,"children":305259},{},[305260],{"type":17,"tag":6121,"props":305261,"children":305263},{"className":305262},[],[305264],{"type":23,"value":305265},"Stretch Film & Shrink Wrap Dispensers",{"type":17,"tag":84,"props":305267,"children":305268},{},[305269],{"type":17,"tag":6121,"props":305270,"children":305272},{"className":305271},[],[305273],{"type":23,"value":305274},"Punching Bag Hangers",{"type":17,"tag":84,"props":305276,"children":305277},{},[305278],{"type":17,"tag":6121,"props":305279,"children":305281},{"className":305280},[],[305282],{"type":23,"value":305283},"Track Lighting Sets",{"type":17,"tag":84,"props":305285,"children":305286},{},[305287],{"type":17,"tag":6121,"props":305288,"children":305290},{"className":305289},[],[305291],{"type":23,"value":305292},"Wheel Chocks & Stops",{"type":17,"tag":84,"props":305294,"children":305295},{},[305296],{"type":17,"tag":6121,"props":305297,"children":305299},{"className":305298},[],[305300],{"type":23,"value":305301},"Itching & Rash Treatments",{"type":17,"tag":84,"props":305303,"children":305304},{},[305305],{"type":17,"tag":6121,"props":305306,"children":305308},{"className":305307},[],[305309],{"type":23,"value":305310},"Automotive Rims",{"type":17,"tag":84,"props":305312,"children":305313},{},[305314],{"type":17,"tag":6121,"props":305315,"children":305317},{"className":305316},[],[305318],{"type":23,"value":305319},"Tire Pressure Gauges",{"type":17,"tag":84,"props":305321,"children":305322},{},[305323],{"type":17,"tag":6121,"props":305324,"children":305326},{"className":305325},[],[305327],{"type":23,"value":305328},"Hair Crimping Irons",{"type":17,"tag":84,"props":305330,"children":305331},{},[305332],{"type":17,"tag":6121,"props":305333,"children":305335},{"className":305334},[],[305336],{"type":23,"value":305337},"Baker",{"type":17,"tag":84,"props":305339,"children":305340},{},[305341],{"type":17,"tag":6121,"props":305342,"children":305344},{"className":305343},[],[305345],{"type":23,"value":305346},"s Helmets",{"type":17,"tag":84,"props":305348,"children":305349},{},[305350],{"type":17,"tag":6121,"props":305351,"children":305353},{"className":305352},[],[305354],{"type":23,"value":305355},"Curtains & Valances",{"type":17,"tag":84,"props":305357,"children":305358},{},[305359],{"type":17,"tag":6121,"props":305360,"children":305362},{"className":305361},[],[305363],{"type":23,"value":305364},"Aquarium Starter Kits",{"type":17,"tag":84,"props":305366,"children":305367},{},[305368],{"type":17,"tag":6121,"props":305369,"children":305371},{"className":305370},[],[305372],{"type":23,"value":305373},"Body Muds",{"type":17,"tag":84,"props":305375,"children":305376},{},[305377],{"type":17,"tag":6121,"props":305378,"children":305380},{"className":305379},[],[305381],{"type":23,"value":305382},"Body Piercing Retainers",{"type":17,"tag":84,"props":305384,"children":305385},{},[305386],{"type":17,"tag":6121,"props":305387,"children":305389},{"className":305388},[],[305390],{"type":23,"value":305391},"Hockey Chest Protectors",{"type":17,"tag":84,"props":305393,"children":305394},{},[305395],{"type":17,"tag":6121,"props":305396,"children":305398},{"className":305397},[],[305399],{"type":23,"value":305400},"Diving Boards",{"type":17,"tag":84,"props":305402,"children":305403},{},[305404],{"type":17,"tag":6121,"props":305405,"children":305407},{"className":305406},[],[305408],{"type":23,"value":305409},"Small Engines",{"type":17,"tag":84,"props":305411,"children":305412},{},[305413],{"type":17,"tag":6121,"props":305414,"children":305416},{"className":305415},[],[305417],{"type":23,"value":305418},"Pet Sofa & Chair Protectors",{"type":17,"tag":84,"props":305420,"children":305421},{},[305422],{"type":17,"tag":6121,"props":305423,"children":305425},{"className":305424},[],[305426],{"type":23,"value":305427},"Tent Accessories",{"type":17,"tag":84,"props":305429,"children":305430},{},[305431],{"type":17,"tag":6121,"props":305432,"children":305434},{"className":305433},[],[305435],{"type":23,"value":305436},"Pedal Covers",{"type":17,"tag":84,"props":305438,"children":305439},{},[305440],{"type":17,"tag":6121,"props":305441,"children":305443},{"className":305442},[],[305444],{"type":23,"value":305445},"Appliance Covers",{"type":17,"tag":84,"props":305447,"children":305448},{},[305449],{"type":17,"tag":6121,"props":305450,"children":305452},{"className":305451},[],[305453],{"type":23,"value":305454},"Vegetable Dips",{"type":17,"tag":84,"props":305456,"children":305457},{},[305458],{"type":17,"tag":6121,"props":305459,"children":305461},{"className":305460},[],[305462],{"type":23,"value":305463},"Hockey Shin Pads",{"type":17,"tag":84,"props":305465,"children":305466},{},[305467],{"type":17,"tag":6121,"props":305468,"children":305470},{"className":305469},[],[305471],{"type":23,"value":305472},"Acne Creams",{"type":17,"tag":84,"props":305474,"children":305475},{},[305476],{"type":17,"tag":6121,"props":305477,"children":305479},{"className":305478},[],[305480],{"type":23,"value":305481},"Mobility Aid Steps",{"type":17,"tag":84,"props":305483,"children":305484},{},[305485],{"type":17,"tag":6121,"props":305486,"children":305488},{"className":305487},[],[305489],{"type":23,"value":305490},"Quilting Frames",{"type":17,"tag":84,"props":305492,"children":305493},{},[305494],{"type":17,"tag":6121,"props":305495,"children":305497},{"className":305496},[],[305498],{"type":23,"value":305499},"Water Heaters",{"type":17,"tag":84,"props":305501,"children":305502},{},[305503],{"type":17,"tag":6121,"props":305504,"children":305506},{"className":305505},[],[305507],{"type":23,"value":305508},"Sound Pressure Level Meters",{"type":17,"tag":84,"props":305510,"children":305511},{},[305512],{"type":17,"tag":6121,"props":305513,"children":305515},{"className":305514},[],[305516],{"type":23,"value":305517},"Glider Rocking Chairs",{"type":17,"tag":84,"props":305519,"children":305520},{},[305521],{"type":17,"tag":6121,"props":305522,"children":305524},{"className":305523},[],[305525],{"type":23,"value":305526},"Punching Bags",{"type":17,"tag":84,"props":305528,"children":305529},{},[305530],{"type":17,"tag":6121,"props":305531,"children":305533},{"className":305532},[],[305534],{"type":23,"value":305535},"Nail Ridge Filler",{"type":17,"tag":84,"props":305537,"children":305538},{},[305539],{"type":17,"tag":6121,"props":305540,"children":305542},{"className":305541},[],[305543],{"type":23,"value":305544},"Yoga Gloves",{"type":17,"tag":84,"props":305546,"children":305547},{},[305548],{"type":17,"tag":6121,"props":305549,"children":305551},{"className":305550},[],[305552],{"type":23,"value":305553},"Jewelry Stringing Materials",{"type":17,"tag":84,"props":305555,"children":305556},{},[305557],{"type":17,"tag":6121,"props":305558,"children":305560},{"className":305559},[],[305561],{"type":23,"value":305562},"Dishwasher Rack Rollers",{"type":17,"tag":84,"props":305564,"children":305565},{},[305566],{"type":17,"tag":6121,"props":305567,"children":305569},{"className":305568},[],[305570],{"type":23,"value":305571},"Other Hair Removal Supplies",{"type":17,"tag":84,"props":305573,"children":305574},{},[305575],{"type":17,"tag":6121,"props":305576,"children":305578},{"className":305577},[],[305579],{"type":23,"value":305580},"Agility Ladders",{"type":17,"tag":84,"props":305582,"children":305583},{},[305584],{"type":17,"tag":6121,"props":305585,"children":305587},{"className":305586},[],[305588],{"type":23,"value":305589},"Watch Winders",{"type":17,"tag":84,"props":305591,"children":305592},{},[305593],{"type":17,"tag":6121,"props":305594,"children":305596},{"className":305595},[],[305597],{"type":23,"value":305598},"Blender Pitchers",{"type":17,"tag":84,"props":305600,"children":305601},{},[305602],{"type":17,"tag":6121,"props":305603,"children":305605},{"className":305604},[],[305606],{"type":23,"value":305607},"Hand Tampers",{"type":17,"tag":84,"props":305609,"children":305610},{},[305611],{"type":17,"tag":6121,"props":305612,"children":305614},{"className":305613},[],[305615],{"type":23,"value":305616},"Dehumidifier Accessories",{"type":17,"tag":84,"props":305618,"children":305619},{},[305620],{"type":17,"tag":6121,"props":305621,"children":305623},{"className":305622},[],[305624],{"type":23,"value":305625},"Punch Bowl Sets",{"type":17,"tag":84,"props":305627,"children":305628},{},[305629],{"type":17,"tag":6121,"props":305630,"children":305632},{"className":305631},[],[305633],{"type":23,"value":305634},"Mini Projectors",{"type":17,"tag":84,"props":305636,"children":305637},{},[305638],{"type":17,"tag":6121,"props":305639,"children":305641},{"className":305640},[],[305642],{"type":23,"value":305643},"Drinkware Sets",{"type":17,"tag":84,"props":305645,"children":305646},{},[305647],{"type":17,"tag":6121,"props":305648,"children":305650},{"className":305649},[],[305651],{"type":23,"value":305652},"Evaporated Milks",{"type":17,"tag":84,"props":305654,"children":305655},{},[305656],{"type":17,"tag":6121,"props":305657,"children":305659},{"className":305658},[],[305660],{"type":23,"value":305661},"Spoon Rests",{"type":17,"tag":84,"props":305663,"children":305664},{},[305665],{"type":17,"tag":6121,"props":305666,"children":305668},{"className":305667},[],[305669],{"type":23,"value":305670},"Juggling Toys",{"type":17,"tag":84,"props":305672,"children":305673},{},[305674],{"type":17,"tag":6121,"props":305675,"children":305677},{"className":305676},[],[305678],{"type":23,"value":305679},"Mixed Spices & Seasonings",{"type":17,"tag":84,"props":305681,"children":305682},{},[305683],{"type":17,"tag":6121,"props":305684,"children":305686},{"className":305685},[],[305687],{"type":23,"value":305688},"Bicycle Child Seats",{"type":17,"tag":84,"props":305690,"children":305691},{},[305692],{"type":17,"tag":6121,"props":305693,"children":305695},{"className":305694},[],[305696],{"type":23,"value":305697},"Water Coolant Systems",{"type":17,"tag":84,"props":305699,"children":305700},{},[305701],{"type":17,"tag":6121,"props":305702,"children":305704},{"className":305703},[],[305705],{"type":23,"value":305706},"Jai Alai Sets",{"type":17,"tag":84,"props":305708,"children":305709},{},[305710],{"type":17,"tag":6121,"props":305711,"children":305713},{"className":305712},[],[305714],{"type":23,"value":305715},"Surveillance Camera Lenses",{"type":17,"tag":84,"props":305717,"children":305718},{},[305719],{"type":17,"tag":6121,"props":305720,"children":305722},{"className":305721},[],[305723],{"type":23,"value":305724},"Chain Hoists",{"type":17,"tag":84,"props":305726,"children":305727},{},[305728],{"type":17,"tag":6121,"props":305729,"children":305731},{"className":305730},[],[305732],{"type":23,"value":305733},"Snack Pudding & Gelatin",{"type":17,"tag":84,"props":305735,"children":305736},{},[305737],{"type":17,"tag":6121,"props":305738,"children":305740},{"className":305739},[],[305741],{"type":23,"value":305742},"Hair Curling Wands",{"type":17,"tag":84,"props":305744,"children":305745},{},[305746],{"type":17,"tag":6121,"props":305747,"children":305749},{"className":305748},[],[305750],{"type":23,"value":305751},"Spa Cover Lifts",{"type":17,"tag":84,"props":305753,"children":305754},{},[305755],{"type":17,"tag":6121,"props":305756,"children":305758},{"className":305757},[],[305759],{"type":23,"value":305760},"Track Lighting Heads",{"type":17,"tag":84,"props":305762,"children":305763},{},[305764],{"type":17,"tag":6121,"props":305765,"children":305767},{"className":305766},[],[305768],{"type":23,"value":305769},"Photo Enlargers",{"type":17,"tag":84,"props":305771,"children":305772},{},[305773],{"type":17,"tag":6121,"props":305774,"children":305776},{"className":305775},[],[305777],{"type":23,"value":305778},"Photo Enlarger Lenses",{"type":17,"tag":84,"props":305780,"children":305781},{},[305782],{"type":17,"tag":6121,"props":305783,"children":305785},{"className":305784},[],[305786],{"type":23,"value":305787},"Plant Cages",{"type":17,"tag":84,"props":305789,"children":305790},{},[305791],{"type":17,"tag":6121,"props":305792,"children":305794},{"className":305793},[],[305795],{"type":23,"value":305796},"DJ Mixers",{"type":17,"tag":84,"props":305798,"children":305799},{},[305800],{"type":17,"tag":6121,"props":305801,"children":305803},{"className":305802},[],[305804],{"type":23,"value":305805},"Condiment Servers",{"type":17,"tag":84,"props":305807,"children":305808},{},[305809],{"type":17,"tag":6121,"props":305810,"children":305812},{"className":305811},[],[305813],{"type":23,"value":305814},"Electric Kettles",{"type":17,"tag":84,"props":305816,"children":305817},{},[305818],{"type":17,"tag":6121,"props":305819,"children":305821},{"className":305820},[],[305822],{"type":23,"value":305823},"Glass Raw Materials",{"type":17,"tag":84,"props":305825,"children":305826},{},[305827],{"type":17,"tag":6121,"props":305828,"children":305830},{"className":305829},[],[305831],{"type":23,"value":305832},"Radio Antennas",{"type":17,"tag":84,"props":305834,"children":305835},{},[305836],{"type":17,"tag":6121,"props":305837,"children":305839},{"className":305838},[],[305840],{"type":23,"value":305841},"Bicycle Front & Rear Racks",{"type":17,"tag":84,"props":305843,"children":305844},{},[305845],{"type":17,"tag":6121,"props":305846,"children":305848},{"className":305847},[],[305849],{"type":23,"value":305850},"Body Oils",{"type":17,"tag":84,"props":305852,"children":305853},{},[305854],{"type":17,"tag":6121,"props":305855,"children":305857},{"className":305856},[],[305858],{"type":23,"value":305859},"ATV Tires",{"type":17,"tag":84,"props":305861,"children":305862},{},[305863],{"type":17,"tag":6121,"props":305864,"children":305866},{"className":305865},[],[305867],{"type":23,"value":305868},"RAM Memory",{"type":17,"tag":84,"props":305870,"children":305871},{},[305872],{"type":17,"tag":6121,"props":305873,"children":305875},{"className":305874},[],[305876],{"type":23,"value":305877},"Pet Toothpaste",{"type":17,"tag":84,"props":305879,"children":305880},{},[305881],{"type":17,"tag":6121,"props":305882,"children":305884},{"className":305883},[],[305885],{"type":23,"value":305886},"Dressing Aid Sticks",{"type":17,"tag":84,"props":305888,"children":305889},{},[305890],{"type":17,"tag":6121,"props":305891,"children":305893},{"className":305892},[],[305894],{"type":23,"value":305895},"Coconut Knives",{"type":17,"tag":84,"props":305897,"children":305898},{},[305899],{"type":17,"tag":6121,"props":305900,"children":305902},{"className":305901},[],[305903],{"type":23,"value":305904},"Sports Pole Holders & Bases",{"type":17,"tag":84,"props":305906,"children":305907},{},[305908],{"type":17,"tag":6121,"props":305909,"children":305911},{"className":305910},[],[305912],{"type":23,"value":305913},"Dock Steps",{"type":17,"tag":84,"props":305915,"children":305916},{},[305917],{"type":17,"tag":6121,"props":305918,"children":305920},{"className":305919},[],[305921],{"type":23,"value":305922},"Bath Toy Storage",{"type":17,"tag":84,"props":305924,"children":305925},{},[305926],{"type":17,"tag":6121,"props":305927,"children":305929},{"className":305928},[],[305930],{"type":23,"value":305931},"Martial Arts Belts",{"type":17,"tag":84,"props":305933,"children":305934},{},[305935],{"type":17,"tag":6121,"props":305936,"children":305938},{"className":305937},[],[305939],{"type":23,"value":305940},"Currency Bands & Straps",{"type":17,"tag":84,"props":305942,"children":305943},{},[305944],{"type":17,"tag":6121,"props":305945,"children":305947},{"className":305946},[],[305948],{"type":23,"value":305949},"Outdoor Playsets",{"type":17,"tag":84,"props":305951,"children":305952},{},[305953],{"type":17,"tag":6121,"props":305954,"children":305956},{"className":305955},[],[305957],{"type":23,"value":305958},"Video Switchers",{"type":17,"tag":84,"props":305960,"children":305961},{},[305962],{"type":17,"tag":6121,"props":305963,"children":305965},{"className":305964},[],[305966],{"type":23,"value":305967},"Brake System Replacement Parts & Hardware",{"type":17,"tag":84,"props":305969,"children":305970},{},[305971],{"type":17,"tag":6121,"props":305972,"children":305974},{"className":305973},[],[305975],{"type":23,"value":305976},"Tennis Shorts",{"type":17,"tag":84,"props":305978,"children":305979},{},[305980],{"type":17,"tag":6121,"props":305981,"children":305983},{"className":305982},[],[305984],{"type":23,"value":305985},"Facial Treatments",{"type":17,"tag":84,"props":305987,"children":305988},{},[305989],{"type":17,"tag":6121,"props":305990,"children":305992},{"className":305991},[],[305993],{"type":23,"value":305994},"Athletic Compression Socks",{"type":17,"tag":84,"props":305996,"children":305997},{},[305998],{"type":17,"tag":6121,"props":305999,"children":306001},{"className":306000},[],[306002],{"type":23,"value":306003},"Brake Booster Filters",{"type":17,"tag":84,"props":306005,"children":306006},{},[306007],{"type":17,"tag":6121,"props":306008,"children":306010},{"className":306009},[],[306011],{"type":23,"value":306012},"Other Knitting & Crochet Supplies",{"type":17,"tag":84,"props":306014,"children":306015},{},[306016],{"type":17,"tag":6121,"props":306017,"children":306019},{"className":306018},[],[306020],{"type":23,"value":306021},"Martini Glasses",{"type":17,"tag":84,"props":306023,"children":306024},{},[306025],{"type":17,"tag":6121,"props":306026,"children":306028},{"className":306027},[],[306029],{"type":23,"value":306030},"Personal Organizers",{"type":17,"tag":84,"props":306032,"children":306033},{},[306034],{"type":17,"tag":6121,"props":306035,"children":306037},{"className":306036},[],[306038],{"type":23,"value":306039},"pH Meters",{"type":17,"tag":84,"props":306041,"children":306042},{},[306043],{"type":17,"tag":6121,"props":306044,"children":306046},{"className":306045},[],[306047],{"type":23,"value":306048},"Parchment Paper",{"type":17,"tag":84,"props":306050,"children":306051},{},[306052],{"type":17,"tag":6121,"props":306053,"children":306055},{"className":306054},[],[306056],{"type":23,"value":306057},"Other Gift Wrapping Supplies",{"type":17,"tag":84,"props":306059,"children":306060},{},[306061],{"type":17,"tag":6121,"props":306062,"children":306064},{"className":306063},[],[306065],{"type":23,"value":306066},"Leathercraft Accessories",{"type":17,"tag":84,"props":306068,"children":306069},{},[306070],{"type":17,"tag":6121,"props":306071,"children":306073},{"className":306072},[],[306074],{"type":23,"value":306075},"Rod Hockey",{"type":17,"tag":84,"props":306077,"children":306078},{},[306079],{"type":17,"tag":6121,"props":306080,"children":306082},{"className":306081},[],[306083],{"type":23,"value":306084},"House Numbers & Letters",{"type":17,"tag":84,"props":306086,"children":306087},{},[306088],{"type":17,"tag":6121,"props":306089,"children":306091},{"className":306090},[],[306092],{"type":23,"value":306093},"Toaster Pastries",{"type":17,"tag":84,"props":306095,"children":306096},{},[306097],{"type":17,"tag":6121,"props":306098,"children":306100},{"className":306099},[],[306101],{"type":23,"value":306102},"Anti-Chafing Creams",{"type":17,"tag":84,"props":306104,"children":306105},{},[306106],{"type":17,"tag":6121,"props":306107,"children":306109},{"className":306108},[],[306110],{"type":23,"value":306111},"Sunshine Recorders",{"type":17,"tag":84,"props":306113,"children":306114},{},[306115],{"type":17,"tag":6121,"props":306116,"children":306118},{"className":306117},[],[306119],{"type":23,"value":306120},"Makeup Sets",{"type":17,"tag":84,"props":306122,"children":306123},{},[306124],{"type":17,"tag":6121,"props":306125,"children":306127},{"className":306126},[],[306128],{"type":23,"value":306129},"Baby Jumping Exercisers",{"type":17,"tag":84,"props":306131,"children":306132},{},[306133],{"type":17,"tag":6121,"props":306134,"children":306136},{"className":306135},[],[306137],{"type":23,"value":306138},"Replacement Appliance Knobs",{"type":17,"tag":84,"props":306140,"children":306141},{},[306142],{"type":17,"tag":6121,"props":306143,"children":306145},{"className":306144},[],[306146],{"type":23,"value":306147},"Hair Removal Waxing Strips",{"type":17,"tag":84,"props":306149,"children":306150},{},[306151],{"type":17,"tag":6121,"props":306152,"children":306154},{"className":306153},[],[306155],{"type":23,"value":306156},"Toaster Ovens",{"type":17,"tag":84,"props":306158,"children":306159},{},[306160],{"type":17,"tag":6121,"props":306161,"children":306163},{"className":306162},[],[306164],{"type":23,"value":306165},"Electric Crepe Makers",{"type":17,"tag":84,"props":306167,"children":306168},{},[306169],{"type":17,"tag":6121,"props":306170,"children":306172},{"className":306171},[],[306173],{"type":23,"value":306174},"Kiteboard Control Lines",{"type":17,"tag":84,"props":306176,"children":306177},{},[306178],{"type":17,"tag":6121,"props":306179,"children":306181},{"className":306180},[],[306182],{"type":23,"value":306183},"Camera Cleaning Equipment",{"type":17,"tag":84,"props":306185,"children":306186},{},[306187],{"type":17,"tag":6121,"props":306188,"children":306190},{"className":306189},[],[306191],{"type":23,"value":306192},"Body Piercing Jewelry",{"type":17,"tag":84,"props":306194,"children":306195},{},[306196],{"type":17,"tag":6121,"props":306197,"children":306199},{"className":306198},[],[306200],{"type":23,"value":306201},"Weatherproofing Pipe Coverings",{"type":17,"tag":84,"props":306203,"children":306204},{},[306205],{"type":17,"tag":6121,"props":306206,"children":306208},{"className":306207},[],[306209],{"type":23,"value":306210},"Plant Misters",{"type":17,"tag":84,"props":306212,"children":306213},{},[306214],{"type":17,"tag":6121,"props":306215,"children":306217},{"className":306216},[],[306218],{"type":23,"value":306219},"Rosin Bags",{"type":17,"tag":84,"props":306221,"children":306222},{},[306223],{"type":17,"tag":6121,"props":306224,"children":306226},{"className":306225},[],[306227],{"type":23,"value":306228},"Plastic Cups",{"type":17,"tag":84,"props":306230,"children":306231},{},[306232],{"type":17,"tag":6121,"props":306233,"children":306235},{"className":306234},[],[306236],{"type":23,"value":306237},"Baby Bouncer & Rocker Chairs",{"type":17,"tag":84,"props":306239,"children":306240},{},[306241],{"type":17,"tag":6121,"props":306242,"children":306244},{"className":306243},[],[306245],{"type":23,"value":306246},"Washing Machines",{"type":17,"tag":84,"props":306248,"children":306249},{},[306250],{"type":17,"tag":6121,"props":306251,"children":306253},{"className":306252},[],[306254],{"type":23,"value":306255},"Ground Coffee",{"type":17,"tag":84,"props":306257,"children":306258},{},[306259],{"type":17,"tag":6121,"props":306260,"children":306262},{"className":306261},[],[306263],{"type":23,"value":306264},"Gun Mounts",{"type":17,"tag":84,"props":306266,"children":306267},{},[306268],{"type":17,"tag":6121,"props":306269,"children":306271},{"className":306270},[],[306272],{"type":23,"value":306273},"Remote Controls",{"type":17,"tag":84,"props":306275,"children":306276},{},[306277],{"type":17,"tag":6121,"props":306278,"children":306280},{"className":306279},[],[306281],{"type":23,"value":306282},"Medicine Dosing Containers",{"type":17,"tag":84,"props":306284,"children":306285},{},[306286],{"type":17,"tag":6121,"props":306287,"children":306289},{"className":306288},[],[306290],{"type":23,"value":306291},"Chainsaw Chains",{"type":17,"tag":84,"props":306293,"children":306294},{},[306295],{"type":17,"tag":6121,"props":306296,"children":306298},{"className":306297},[],[306299],{"type":23,"value":306300},"Climbing Slings",{"type":17,"tag":84,"props":306302,"children":306303},{},[306304],{"type":17,"tag":6121,"props":306305,"children":306307},{"className":306306},[],[306308],{"type":23,"value":306309},"Basketball Storage",{"type":17,"tag":84,"props":306311,"children":306312},{},[306313],{"type":17,"tag":6121,"props":306314,"children":306316},{"className":306315},[],[306317],{"type":23,"value":306318},"Writing Notebooks & Sketch Books",{"type":17,"tag":84,"props":306320,"children":306321},{},[306322],{"type":17,"tag":6121,"props":306323,"children":306325},{"className":306324},[],[306326],{"type":23,"value":306327},"Thermometer Probe Covers",{"type":17,"tag":84,"props":306329,"children":306330},{},[306331],{"type":17,"tag":6121,"props":306332,"children":306334},{"className":306333},[],[306335],{"type":23,"value":306336},"Wall Calendars",{"type":17,"tag":84,"props":306338,"children":306339},{},[306340],{"type":17,"tag":6121,"props":306341,"children":306343},{"className":306342},[],[306344],{"type":23,"value":306345},"Power Tool Batteries",{"type":17,"tag":84,"props":306347,"children":306348},{},[306349],{"type":17,"tag":6121,"props":306350,"children":306352},{"className":306351},[],[306353],{"type":23,"value":306354},"Corded Phones",{"type":17,"tag":84,"props":306356,"children":306357},{},[306358],{"type":17,"tag":6121,"props":306359,"children":306361},{"className":306360},[],[306362],{"type":23,"value":306363},"Desk Lamps",{"type":17,"tag":84,"props":306365,"children":306366},{},[306367],{"type":17,"tag":6121,"props":306368,"children":306370},{"className":306369},[],[306371],{"type":23,"value":306372},"Network-Attached Storage Servers",{"type":17,"tag":84,"props":306374,"children":306375},{},[306376],{"type":17,"tag":6121,"props":306377,"children":306379},{"className":306378},[],[306380],{"type":23,"value":306381},"Slatwall Panels",{"type":17,"tag":84,"props":306383,"children":306384},{},[306385],{"type":17,"tag":6121,"props":306386,"children":306388},{"className":306387},[],[306389],{"type":23,"value":306390},"Golf Push & Pull Carts",{"type":17,"tag":84,"props":306392,"children":306393},{},[306394],{"type":17,"tag":6121,"props":306395,"children":306397},{"className":306396},[],[306398],{"type":23,"value":306399},"Media Storage Cabinets",{"type":17,"tag":84,"props":306401,"children":306402},{},[306403],{"type":17,"tag":6121,"props":306404,"children":306406},{"className":306405},[],[306407],{"type":23,"value":306408},"Stovetop Waffle Irons",{"type":17,"tag":84,"props":306410,"children":306411},{},[306412],{"type":17,"tag":6121,"props":306413,"children":306415},{"className":306414},[],[306416],{"type":23,"value":306417},"Pet Tie-Outs",{"type":17,"tag":84,"props":306419,"children":306420},{},[306421],{"type":17,"tag":6121,"props":306422,"children":306424},{"className":306423},[],[306425],{"type":23,"value":306426},"Toilet Paper Holders",{"type":17,"tag":84,"props":306428,"children":306429},{},[306430],{"type":17,"tag":6121,"props":306431,"children":306433},{"className":306432},[],[306434],{"type":23,"value":306435},"Boating Heads",{"type":17,"tag":84,"props":306437,"children":306438},{},[306439],{"type":17,"tag":6121,"props":306440,"children":306442},{"className":306441},[],[306443],{"type":23,"value":306444},"Movie Cameras",{"type":17,"tag":84,"props":306446,"children":306447},{},[306448],{"type":17,"tag":6121,"props":306449,"children":306451},{"className":306450},[],[306452],{"type":23,"value":306453},"Vanity Lights",{"type":17,"tag":84,"props":306455,"children":306456},{},[306457],{"type":17,"tag":6121,"props":306458,"children":306460},{"className":306459},[],[306461],{"type":23,"value":306462},"Plaques & Signs",{"type":17,"tag":84,"props":306464,"children":306465},{},[306466],{"type":17,"tag":6121,"props":306467,"children":306469},{"className":306468},[],[306470],{"type":23,"value":306471},"Decorative Bottles",{"type":17,"tag":84,"props":306473,"children":306474},{},[306475],{"type":17,"tag":6121,"props":306476,"children":306478},{"className":306477},[],[306479],{"type":23,"value":306480},"Art Paint Sponges",{"type":17,"tag":84,"props":306482,"children":306483},{},[306484],{"type":17,"tag":6121,"props":306485,"children":306487},{"className":306486},[],[306488],{"type":23,"value":306489},"Kayak Carts",{"type":17,"tag":84,"props":306491,"children":306492},{},[306493],{"type":17,"tag":6121,"props":306494,"children":306496},{"className":306495},[],[306497],{"type":23,"value":306498},"Radar Detectors",{"type":17,"tag":84,"props":306500,"children":306501},{},[306502],{"type":17,"tag":6121,"props":306503,"children":306505},{"className":306504},[],[306506],{"type":23,"value":306507},"Outdoor Bar Stools",{"type":17,"tag":84,"props":306509,"children":306510},{},[306511],{"type":17,"tag":6121,"props":306512,"children":306514},{"className":306513},[],[306515],{"type":23,"value":306516},"Piggy Banks & Money Jars",{"type":17,"tag":84,"props":306518,"children":306519},{},[306520],{"type":17,"tag":6121,"props":306521,"children":306523},{"className":306522},[],[306524],{"type":23,"value":306525},"Fog Machines",{"type":17,"tag":84,"props":306527,"children":306528},{},[306529],{"type":17,"tag":6121,"props":306530,"children":306532},{"className":306531},[],[306533],{"type":23,"value":306534},"Food Storage Jars & Containers",{"type":17,"tag":84,"props":306536,"children":306537},{},[306538],{"type":17,"tag":6121,"props":306539,"children":306541},{"className":306540},[],[306542],{"type":23,"value":306543},"Pet ID Tags",{"type":17,"tag":84,"props":306545,"children":306546},{},[306547],{"type":17,"tag":6121,"props":306548,"children":306550},{"className":306549},[],[306551],{"type":23,"value":306552},"Salad Serving Utensils",{"type":17,"tag":84,"props":306554,"children":306555},{},[306556],{"type":17,"tag":6121,"props":306557,"children":306559},{"className":306558},[],[306560],{"type":23,"value":306561},"Bath Rugs",{"type":17,"tag":84,"props":306563,"children":306564},{},[306565],{"type":17,"tag":6121,"props":306566,"children":306568},{"className":306567},[],[306569],{"type":23,"value":306570},"Water Distillers",{"type":17,"tag":84,"props":306572,"children":306573},{},[306574],{"type":17,"tag":6121,"props":306575,"children":306577},{"className":306576},[],[306578],{"type":23,"value":306579},"Sewing Bias Tape",{"type":17,"tag":84,"props":306581,"children":306582},{},[306583],{"type":17,"tag":6121,"props":306584,"children":306586},{"className":306585},[],[306587],{"type":23,"value":306588},"Racquet Vibration Dampeners",{"type":17,"tag":84,"props":306590,"children":306591},{},[306592],{"type":17,"tag":6121,"props":306593,"children":306595},{"className":306594},[],[306596],{"type":23,"value":306597},"Live Shrubs",{"type":17,"tag":84,"props":306599,"children":306600},{},[306601],{"type":17,"tag":6121,"props":306602,"children":306604},{"className":306603},[],[306605],{"type":23,"value":306606},"Cable Tie Guns",{"type":17,"tag":84,"props":306608,"children":306609},{},[306610],{"type":17,"tag":6121,"props":306611,"children":306613},{"className":306612},[],[306614],{"type":23,"value":306615},"Floating Shelves",{"type":17,"tag":84,"props":306617,"children":306618},{},[306619],{"type":17,"tag":6121,"props":306620,"children":306622},{"className":306621},[],[306623],{"type":23,"value":306624},"Empty Camping Stove Fuel Bottles",{"type":17,"tag":84,"props":306626,"children":306627},{},[306628],{"type":17,"tag":6121,"props":306629,"children":306631},{"className":306630},[],[306632],{"type":23,"value":306633},"Toy Billiards",{"type":17,"tag":84,"props":306635,"children":306636},{},[306637],{"type":17,"tag":6121,"props":306638,"children":306640},{"className":306639},[],[306641],{"type":23,"value":306642},"Water Diverters",{"type":17,"tag":84,"props":306644,"children":306645},{},[306646],{"type":17,"tag":6121,"props":306647,"children":306649},{"className":306648},[],[306650],{"type":23,"value":306651},"Powdered Baking Cocoa",{"type":17,"tag":84,"props":306653,"children":306654},{},[306655],{"type":17,"tag":6121,"props":306656,"children":306658},{"className":306657},[],[306659],{"type":23,"value":306660},"Card Shufflers",{"type":17,"tag":84,"props":306662,"children":306663},{},[306664],{"type":17,"tag":6121,"props":306665,"children":306667},{"className":306666},[],[306668],{"type":23,"value":306669},"Tool Sets",{"type":17,"tag":84,"props":306671,"children":306672},{},[306673],{"type":17,"tag":6121,"props":306674,"children":306676},{"className":306675},[],[306677],{"type":23,"value":306678},"Paper Holders & Dispensers",{"type":17,"tag":84,"props":306680,"children":306681},{},[306682],{"type":17,"tag":6121,"props":306683,"children":306685},{"className":306684},[],[306686],{"type":23,"value":306687},"Bed-in-a-Bag",{"type":17,"tag":84,"props":306689,"children":306690},{},[306691],{"type":17,"tag":6121,"props":306692,"children":306694},{"className":306693},[],[306695],{"type":23,"value":306696},"Rail Planters",{"type":17,"tag":84,"props":306698,"children":306699},{},[306700],{"type":17,"tag":6121,"props":306701,"children":306703},{"className":306702},[],[306704],{"type":23,"value":306705},"Glass Markers & Stemware Charms",{"type":17,"tag":84,"props":306707,"children":306708},{},[306709],{"type":17,"tag":6121,"props":306710,"children":306712},{"className":306711},[],[306713],{"type":23,"value":306714},"Poison Ingestion Treatments",{"type":17,"tag":84,"props":306716,"children":306717},{},[306718],{"type":17,"tag":6121,"props":306719,"children":306721},{"className":306720},[],[306722],{"type":23,"value":306723},"Sewing Baskets",{"type":17,"tag":84,"props":306725,"children":306726},{},[306727],{"type":17,"tag":6121,"props":306728,"children":306730},{"className":306729},[],[306731],{"type":23,"value":306732},"Decorative Boxes",{"type":17,"tag":84,"props":306734,"children":306735},{},[306736],{"type":17,"tag":6121,"props":306737,"children":306739},{"className":306738},[],[306740],{"type":23,"value":306741},"Play Tents",{"type":17,"tag":84,"props":306743,"children":306744},{},[306745],{"type":17,"tag":6121,"props":306746,"children":306748},{"className":306747},[],[306749],{"type":23,"value":306750},"Oke Daiko Drums",{"type":17,"tag":84,"props":306752,"children":306753},{},[306754],{"type":17,"tag":6121,"props":306755,"children":306757},{"className":306756},[],[306758],{"type":23,"value":306759},"One-Piece Swimsuits",{"type":17,"tag":84,"props":306761,"children":306762},{},[306763],{"type":17,"tag":6121,"props":306764,"children":306766},{"className":306765},[],[306767],{"type":23,"value":306768},"Bicycle Stands",{"type":17,"tag":84,"props":306770,"children":306771},{},[306772],{"type":17,"tag":6121,"props":306773,"children":306775},{"className":306774},[],[306776],{"type":23,"value":306777},"Photography Flash Heads",{"type":17,"tag":84,"props":306779,"children":306780},{},[306781],{"type":17,"tag":6121,"props":306782,"children":306784},{"className":306783},[],[306785],{"type":23,"value":306786},"Yogurt Makers",{"type":17,"tag":84,"props":306788,"children":306789},{},[306790],{"type":17,"tag":6121,"props":306791,"children":306793},{"className":306792},[],[306794],{"type":23,"value":306795},"Field Hockey Goalie Hand Protectors",{"type":17,"tag":84,"props":306797,"children":306798},{},[306799],{"type":17,"tag":6121,"props":306800,"children":306802},{"className":306801},[],[306803],{"type":23,"value":306804},"Window Shades",{"type":17,"tag":84,"props":306806,"children":306807},{},[306808],{"type":17,"tag":6121,"props":306809,"children":306811},{"className":306810},[],[306812],{"type":23,"value":306813},"Camera Battery Grips",{"type":17,"tag":84,"props":306815,"children":306816},{},[306817],{"type":17,"tag":6121,"props":306818,"children":306820},{"className":306819},[],[306821],{"type":23,"value":306822},"Hunting Game Hoists & Gambrels",{"type":17,"tag":84,"props":306824,"children":306825},{},[306826],{"type":17,"tag":6121,"props":306827,"children":306829},{"className":306828},[],[306830],{"type":23,"value":306831},"Sunglass Visor Clips",{"type":17,"tag":84,"props":306833,"children":306834},{},[306835],{"type":17,"tag":6121,"props":306836,"children":306838},{"className":306837},[],[306839],{"type":23,"value":306840},"Christmas Trees",{"type":17,"tag":84,"props":306842,"children":306843},{},[306844],{"type":17,"tag":6121,"props":306845,"children":306847},{"className":306846},[],[306848],{"type":23,"value":306849},"Edge & Corner Guards",{"type":17,"tag":84,"props":306851,"children":306852},{},[306853],{"type":17,"tag":6121,"props":306854,"children":306856},{"className":306855},[],[306857],{"type":23,"value":306858},"Golf Carts",{"type":17,"tag":84,"props":306860,"children":306861},{},[306862],{"type":17,"tag":6121,"props":306863,"children":306865},{"className":306864},[],[306866],{"type":23,"value":306867},"Screen Houses",{"type":17,"tag":84,"props":306869,"children":306870},{},[306871],{"type":17,"tag":6121,"props":306872,"children":306874},{"className":306873},[],[306875],{"type":23,"value":306876},"Tent Poles",{"type":17,"tag":84,"props":306878,"children":306879},{},[306880],{"type":17,"tag":6121,"props":306881,"children":306883},{"className":306882},[],[306884],{"type":23,"value":306885},"Fish Cleaning Tables",{"type":17,"tag":84,"props":306887,"children":306888},{},[306889],{"type":17,"tag":6121,"props":306890,"children":306892},{"className":306891},[],[306893],{"type":23,"value":306894},"Bicycle Saddle Covers",{"type":17,"tag":84,"props":306896,"children":306897},{},[306898],{"type":17,"tag":6121,"props":306899,"children":306901},{"className":306900},[],[306902],{"type":23,"value":306903},"Plant Seeds",{"type":17,"tag":84,"props":306905,"children":306906},{},[306907],{"type":17,"tag":6121,"props":306908,"children":306910},{"className":306909},[],[306911],{"type":23,"value":306912},"Geographic Globes",{"type":17,"tag":84,"props":306914,"children":306915},{},[306916],{"type":17,"tag":6121,"props":306917,"children":306919},{"className":306918},[],[306920],{"type":23,"value":306921},"Jewelry Making Chain",{"type":17,"tag":84,"props":306923,"children":306924},{},[306925],{"type":17,"tag":6121,"props":306926,"children":306928},{"className":306927},[],[306929],{"type":23,"value":306930},"Figurines & Knick-Knacks",{"type":17,"tag":84,"props":306932,"children":306933},{},[306934],{"type":17,"tag":6121,"props":306935,"children":306937},{"className":306936},[],[306938],{"type":23,"value":306939},"Binder Insert Strips",{"type":17,"tag":84,"props":306941,"children":306942},{},[306943],{"type":17,"tag":6121,"props":306944,"children":306946},{"className":306945},[],[306947],{"type":23,"value":306948},"Hair Clipper Blades",{"type":17,"tag":84,"props":306950,"children":306951},{},[306952],{"type":17,"tag":6121,"props":306953,"children":306955},{"className":306954},[],[306956],{"type":23,"value":306957},"Nutrition Drinks",{"type":17,"tag":84,"props":306959,"children":306960},{},[306961],{"type":17,"tag":6121,"props":306962,"children":306964},{"className":306963},[],[306965],{"type":23,"value":306966},"Musical Bow Cases",{"type":17,"tag":84,"props":306968,"children":306969},{},[306970],{"type":17,"tag":6121,"props":306971,"children":306973},{"className":306972},[],[306974],{"type":23,"value":306975},"Glue Guns",{"type":17,"tag":84,"props":306977,"children":306978},{},[306979],{"type":17,"tag":6121,"props":306980,"children":306982},{"className":306981},[],[306983],{"type":23,"value":306984},"Breast Tape",{"type":17,"tag":84,"props":306986,"children":306987},{},[306988],{"type":17,"tag":6121,"props":306989,"children":306991},{"className":306990},[],[306992],{"type":23,"value":306993},"Automotive Lift Supports",{"type":17,"tag":84,"props":306995,"children":306996},{},[306997],{"type":17,"tag":6121,"props":306998,"children":307000},{"className":306999},[],[307001],{"type":23,"value":307002},"Acoustic Guitars",{"type":17,"tag":84,"props":307004,"children":307005},{},[307006],{"type":17,"tag":6121,"props":307007,"children":307009},{"className":307008},[],[307010],{"type":23,"value":307011},"Therapeutic Light Boxes",{"type":17,"tag":84,"props":307013,"children":307014},{},[307015],{"type":17,"tag":6121,"props":307016,"children":307018},{"className":307017},[],[307019],{"type":23,"value":307020},"Stovetop Espresso Pot Replacement Gaskets & Filters",{"type":17,"tag":84,"props":307022,"children":307023},{},[307024],{"type":17,"tag":6121,"props":307025,"children":307027},{"className":307026},[],[307028],{"type":23,"value":307029},"Beverage Tubs",{"type":17,"tag":84,"props":307031,"children":307032},{},[307033],{"type":17,"tag":6121,"props":307034,"children":307036},{"className":307035},[],[307037],{"type":23,"value":307038},"Lifeguard Swimsuits",{"type":17,"tag":84,"props":307040,"children":307041},{},[307042],{"type":17,"tag":6121,"props":307043,"children":307045},{"className":307044},[],[307046],{"type":23,"value":307047},"Other Backpacking & Camping Supplies",{"type":17,"tag":84,"props":307049,"children":307050},{},[307051],{"type":17,"tag":6121,"props":307052,"children":307054},{"className":307053},[],[307055],{"type":23,"value":307056},"Napkin Rings",{"type":17,"tag":84,"props":307058,"children":307059},{},[307060],{"type":17,"tag":6121,"props":307061,"children":307063},{"className":307062},[],[307064],{"type":23,"value":307065},"Staple Removers",{"type":17,"tag":84,"props":307067,"children":307068},{},[307069],{"type":17,"tag":6121,"props":307070,"children":307072},{"className":307071},[],[307073],{"type":23,"value":307074},"Gravy Boats, Stands & Sets",{"type":17,"tag":84,"props":307076,"children":307077},{},[307078],{"type":17,"tag":6121,"props":307079,"children":307081},{"className":307080},[],[307082],{"type":23,"value":307083},"Bath Pillows",{"type":17,"tag":84,"props":307085,"children":307086},{},[307087],{"type":17,"tag":6121,"props":307088,"children":307090},{"className":307089},[],[307091],{"type":23,"value":307092},"Easter Eggs",{"type":17,"tag":84,"props":307094,"children":307095},{},[307096],{"type":17,"tag":6121,"props":307097,"children":307099},{"className":307098},[],[307100],{"type":23,"value":307101},"Cut Flowers",{"type":17,"tag":84,"props":307103,"children":307104},{},[307105],{"type":17,"tag":6121,"props":307106,"children":307108},{"className":307107},[],[307109],{"type":23,"value":307110},"Traditional Abayas",{"type":17,"tag":84,"props":307112,"children":307113},{},[307114],{"type":17,"tag":6121,"props":307115,"children":307117},{"className":307116},[],[307118],{"type":23,"value":307119},"Air Guns",{"type":17,"tag":84,"props":307121,"children":307122},{},[307123],{"type":17,"tag":6121,"props":307124,"children":307126},{"className":307125},[],[307127],{"type":23,"value":307128},"Electric Fence Insulators",{"type":17,"tag":84,"props":307130,"children":307131},{},[307132],{"type":17,"tag":6121,"props":307133,"children":307135},{"className":307134},[],[307136],{"type":23,"value":307137},"SIM Cards",{"type":17,"tag":84,"props":307139,"children":307140},{},[307141],{"type":17,"tag":6121,"props":307142,"children":307144},{"className":307143},[],[307145],{"type":23,"value":307146},"Oven Mitts",{"type":17,"tag":84,"props":307148,"children":307149},{},[307150],{"type":17,"tag":6121,"props":307151,"children":307153},{"className":307152},[],[307154],{"type":23,"value":307155},"Gun Barrels",{"type":17,"tag":84,"props":307157,"children":307158},{},[307159],{"type":17,"tag":6121,"props":307160,"children":307162},{"className":307161},[],[307163],{"type":23,"value":307164},"Automotive Skid Plates",{"type":17,"tag":84,"props":307166,"children":307167},{},[307168],{"type":17,"tag":6121,"props":307169,"children":307171},{"className":307170},[],[307172],{"type":23,"value":307173},"Sport Starter Pistols",{"type":17,"tag":84,"props":307175,"children":307176},{},[307177],{"type":17,"tag":6121,"props":307178,"children":307180},{"className":307179},[],[307181],{"type":23,"value":307182},"Personal Misters",{"type":17,"tag":84,"props":307184,"children":307185},{},[307186],{"type":17,"tag":6121,"props":307187,"children":307189},{"className":307188},[],[307190],{"type":23,"value":307191},"Telescope Eyepiece & Filter Sets",{"type":17,"tag":84,"props":307193,"children":307194},{},[307195],{"type":17,"tag":6121,"props":307196,"children":307198},{"className":307197},[],[307199],{"type":23,"value":307200},"Cell Phone Radiation Guards",{"type":17,"tag":84,"props":307202,"children":307203},{},[307204],{"type":17,"tag":6121,"props":307205,"children":307207},{"className":307206},[],[307208],{"type":23,"value":307209},"Snowmobile Riser Blocks",{"type":17,"tag":84,"props":307211,"children":307212},{},[307213],{"type":17,"tag":6121,"props":307214,"children":307216},{"className":307215},[],[307217],{"type":23,"value":307218},"Football Target Nets",{"type":17,"tag":84,"props":307220,"children":307221},{},[307222],{"type":17,"tag":6121,"props":307223,"children":307225},{"className":307224},[],[307226],{"type":23,"value":307227},"Memory Card Adapters",{"type":17,"tag":84,"props":307229,"children":307230},{},[307231],{"type":17,"tag":6121,"props":307232,"children":307234},{"className":307233},[],[307235],{"type":23,"value":307236},"Mobility Walkers",{"type":17,"tag":84,"props":307238,"children":307239},{},[307240],{"type":17,"tag":6121,"props":307241,"children":307243},{"className":307242},[],[307244],{"type":23,"value":307245},"Ice Buckets",{"type":17,"tag":84,"props":307247,"children":307248},{},[307249],{"type":17,"tag":6121,"props":307250,"children":307252},{"className":307251},[],[307253],{"type":23,"value":307254},"Skins for Vape Pens",{"type":17,"tag":84,"props":307256,"children":307257},{},[307258],{"type":17,"tag":6121,"props":307259,"children":307261},{"className":307260},[],[307262],{"type":23,"value":307263},"Electrical Ballasts",{"type":17,"tag":84,"props":307265,"children":307266},{},[307267],{"type":17,"tag":6121,"props":307268,"children":307270},{"className":307269},[],[307271],{"type":23,"value":307272},"Bicycle Frames",{"type":17,"tag":84,"props":307274,"children":307275},{},[307276],{"type":17,"tag":6121,"props":307277,"children":307279},{"className":307278},[],[307280],{"type":23,"value":307281},"Cheese Wax",{"type":17,"tag":84,"props":307283,"children":307284},{},[307285],{"type":17,"tag":6121,"props":307286,"children":307288},{"className":307287},[],[307289],{"type":23,"value":307290},"Whole Bean Coffee",{"type":17,"tag":84,"props":307292,"children":307293},{},[307294],{"type":17,"tag":6121,"props":307295,"children":307297},{"className":307296},[],[307298],{"type":23,"value":307299},"Tennis Rebounders",{"type":17,"tag":84,"props":307301,"children":307302},{},[307303],{"type":17,"tag":6121,"props":307304,"children":307306},{"className":307305},[],[307307],{"type":23,"value":307308},"Plaster Hawks",{"type":17,"tag":84,"props":307310,"children":307311},{},[307312],{"type":17,"tag":6121,"props":307313,"children":307315},{"className":307314},[],[307316],{"type":23,"value":307317},"Dance Shoes",{"type":17,"tag":84,"props":307319,"children":307320},{},[307321],{"type":17,"tag":6121,"props":307322,"children":307324},{"className":307323},[],[307325],{"type":23,"value":307326},"Pizza Crusts",{"type":17,"tag":84,"props":307328,"children":307329},{},[307330],{"type":17,"tag":6121,"props":307331,"children":307333},{"className":307332},[],[307334],{"type":23,"value":307335},"Other Fireplaces Accessories",{"type":17,"tag":84,"props":307337,"children":307338},{},[307339],{"type":17,"tag":6121,"props":307340,"children":307342},{"className":307341},[],[307343],{"type":23,"value":307344},"Epoxy Coatings",{"type":17,"tag":84,"props":307346,"children":307347},{},[307348],{"type":17,"tag":6121,"props":307349,"children":307351},{"className":307350},[],[307352],{"type":23,"value":307353},"Automotive Trailers",{"type":17,"tag":84,"props":307355,"children":307356},{},[307357],{"type":17,"tag":6121,"props":307358,"children":307360},{"className":307359},[],[307361],{"type":23,"value":307362},"Gift Wrap Paper",{"type":17,"tag":84,"props":307364,"children":307365},{},[307366],{"type":17,"tag":6121,"props":307367,"children":307369},{"className":307368},[],[307370],{"type":23,"value":307371},"Material Handling Securing Straps",{"type":17,"tag":84,"props":307373,"children":307374},{},[307375],{"type":17,"tag":6121,"props":307376,"children":307378},{"className":307377},[],[307379],{"type":23,"value":307380},"Disposable Cameras",{"type":17,"tag":84,"props":307382,"children":307383},{},[307384],{"type":17,"tag":6121,"props":307385,"children":307387},{"className":307386},[],[307388],{"type":23,"value":307389},"Small Animal Exercise Wheels",{"type":17,"tag":84,"props":307391,"children":307392},{},[307393],{"type":17,"tag":6121,"props":307394,"children":307396},{"className":307395},[],[307397],{"type":23,"value":307398},"Hall Trees",{"type":17,"tag":84,"props":307400,"children":307401},{},[307402],{"type":17,"tag":6121,"props":307403,"children":307405},{"className":307404},[],[307406],{"type":23,"value":307407},"Cash Boxes",{"type":17,"tag":84,"props":307409,"children":307410},{},[307411],{"type":17,"tag":6121,"props":307412,"children":307414},{"className":307413},[],[307415],{"type":23,"value":307416},"Sprinkler Valves",{"type":17,"tag":84,"props":307418,"children":307419},{},[307420],{"type":17,"tag":6121,"props":307421,"children":307423},{"className":307422},[],[307424],{"type":23,"value":307425},"Renewable Energy Controllers",{"type":17,"tag":84,"props":307427,"children":307428},{},[307429],{"type":17,"tag":6121,"props":307430,"children":307432},{"className":307431},[],[307433],{"type":23,"value":307434},"Impact Drivers",{"type":17,"tag":84,"props":307436,"children":307437},{},[307438],{"type":17,"tag":6121,"props":307439,"children":307441},{"className":307440},[],[307442],{"type":23,"value":307443},"Home Brewing Grain & Hop Bags",{"type":17,"tag":84,"props":307445,"children":307446},{},[307447],{"type":17,"tag":6121,"props":307448,"children":307450},{"className":307449},[],[307451],{"type":23,"value":307452},"ATV Cargo Storage",{"type":17,"tag":84,"props":307454,"children":307455},{},[307456],{"type":17,"tag":6121,"props":307457,"children":307459},{"className":307458},[],[307460],{"type":23,"value":307461},"Bicycle Derailleurs",{"type":17,"tag":84,"props":307463,"children":307464},{},[307465],{"type":17,"tag":6121,"props":307466,"children":307468},{"className":307467},[],[307469],{"type":23,"value":307470},"Darkroom Squeegees",{"type":17,"tag":84,"props":307472,"children":307473},{},[307474],{"type":17,"tag":6121,"props":307475,"children":307477},{"className":307476},[],[307478],{"type":23,"value":307479},"Lens Supports",{"type":17,"tag":84,"props":307481,"children":307482},{},[307483],{"type":17,"tag":6121,"props":307484,"children":307486},{"className":307485},[],[307487],{"type":23,"value":307488},"Roller Stands",{"type":17,"tag":84,"props":307490,"children":307491},{},[307492],{"type":17,"tag":6121,"props":307493,"children":307495},{"className":307494},[],[307496],{"type":23,"value":307497},"Breath Fresheners",{"type":17,"tag":84,"props":307499,"children":307500},{},[307501],{"type":17,"tag":6121,"props":307502,"children":307504},{"className":307503},[],[307505],{"type":23,"value":307506},"Leaf & Plant Cleaner",{"type":17,"tag":84,"props":307508,"children":307509},{},[307510],{"type":17,"tag":6121,"props":307511,"children":307513},{"className":307512},[],[307514],{"type":23,"value":307515},"Cricket Balls",{"type":17,"tag":84,"props":307517,"children":307518},{},[307519],{"type":17,"tag":6121,"props":307520,"children":307522},{"className":307521},[],[307523],{"type":23,"value":307524},"Automotive Bumpers",{"type":17,"tag":84,"props":307526,"children":307527},{},[307528],{"type":17,"tag":6121,"props":307529,"children":307531},{"className":307530},[],[307532],{"type":23,"value":307533},"Other Baby Safety Supplies",{"type":17,"tag":84,"props":307535,"children":307536},{},[307537],{"type":17,"tag":6121,"props":307538,"children":307540},{"className":307539},[],[307541],{"type":23,"value":307542},"Confetti Poppers",{"type":17,"tag":84,"props":307544,"children":307545},{},[307546],{"type":17,"tag":6121,"props":307547,"children":307549},{"className":307548},[],[307550],{"type":23,"value":307551},"Swimsuit Sets",{"type":17,"tag":84,"props":307553,"children":307554},{},[307555],{"type":17,"tag":6121,"props":307556,"children":307558},{"className":307557},[],[307559],{"type":23,"value":307560},"Manual Pencil Sharpeners",{"type":17,"tag":84,"props":307562,"children":307563},{},[307564],{"type":17,"tag":6121,"props":307565,"children":307567},{"className":307566},[],[307568],{"type":23,"value":307569},"Toilet Bowls",{"type":17,"tag":84,"props":307571,"children":307572},{},[307573],{"type":17,"tag":6121,"props":307574,"children":307576},{"className":307575},[],[307577],{"type":23,"value":307578},"Art & Blueprint Tubes",{"type":17,"tag":84,"props":307580,"children":307581},{},[307582],{"type":17,"tag":6121,"props":307583,"children":307585},{"className":307584},[],[307586],{"type":23,"value":307587},"Air Fryer Liners",{"type":17,"tag":84,"props":307589,"children":307590},{},[307591],{"type":17,"tag":6121,"props":307592,"children":307594},{"className":307593},[],[307595],{"type":23,"value":307596},"Other Bicycle Parts",{"type":17,"tag":84,"props":307598,"children":307599},{},[307600],{"type":17,"tag":6121,"props":307601,"children":307603},{"className":307602},[],[307604],{"type":23,"value":307605},"Gymnastics Hand Grips",{"type":17,"tag":84,"props":307607,"children":307608},{},[307609],{"type":17,"tag":6121,"props":307610,"children":307612},{"className":307611},[],[307613],{"type":23,"value":307614},"Garlic Presses",{"type":17,"tag":84,"props":307616,"children":307617},{},[307618],{"type":17,"tag":6121,"props":307619,"children":307621},{"className":307620},[],[307622],{"type":23,"value":307623},"GPS Software",{"type":17,"tag":84,"props":307625,"children":307626},{},[307627],{"type":17,"tag":6121,"props":307628,"children":307630},{"className":307629},[],[307631],{"type":23,"value":307632},"Banana Hangers",{"type":17,"tag":84,"props":307634,"children":307635},{},[307636],{"type":17,"tag":6121,"props":307637,"children":307639},{"className":307638},[],[307640],{"type":23,"value":307641},"Animal Grooming Scissors",{"type":17,"tag":84,"props":307643,"children":307644},{},[307645],{"type":17,"tag":6121,"props":307646,"children":307648},{"className":307647},[],[307649],{"type":23,"value":307650},"Dining Tables",{"type":17,"tag":84,"props":307652,"children":307653},{},[307654],{"type":17,"tag":6121,"props":307655,"children":307657},{"className":307656},[],[307658],{"type":23,"value":307659},"DAT Recorders",{"type":17,"tag":84,"props":307661,"children":307662},{},[307663],{"type":17,"tag":6121,"props":307664,"children":307666},{"className":307665},[],[307667],{"type":23,"value":307668},"Decorative Bowls",{"type":17,"tag":84,"props":307670,"children":307671},{},[307672],{"type":17,"tag":6121,"props":307673,"children":307675},{"className":307674},[],[307676],{"type":23,"value":307677},"Dustpans & Dustpan & Brush Sets",{"type":17,"tag":84,"props":307679,"children":307680},{},[307681],{"type":17,"tag":6121,"props":307682,"children":307684},{"className":307683},[],[307685],{"type":23,"value":307686},"Racquet Sport Racquets",{"type":17,"tag":84,"props":307688,"children":307689},{},[307690],{"type":17,"tag":6121,"props":307691,"children":307693},{"className":307692},[],[307694],{"type":23,"value":307695},"Lap Guitars",{"type":17,"tag":84,"props":307697,"children":307698},{},[307699],{"type":17,"tag":6121,"props":307700,"children":307702},{"className":307701},[],[307703],{"type":23,"value":307704},"Construction Siding",{"type":17,"tag":84,"props":307706,"children":307707},{},[307708],{"type":17,"tag":6121,"props":307709,"children":307711},{"className":307710},[],[307712],{"type":23,"value":307713},"Baking Cups",{"type":17,"tag":84,"props":307715,"children":307716},{},[307717],{"type":17,"tag":6121,"props":307718,"children":307720},{"className":307719},[],[307721],{"type":23,"value":307722},"Hair Extensions",{"type":17,"tag":84,"props":307724,"children":307725},{},[307726],{"type":17,"tag":6121,"props":307727,"children":307729},{"className":307728},[],[307730],{"type":23,"value":307731},"Starting Fluid",{"type":17,"tag":84,"props":307733,"children":307734},{},[307735],{"type":17,"tag":6121,"props":307736,"children":307738},{"className":307737},[],[307739],{"type":23,"value":307740},"Chemical Solvents",{"type":17,"tag":84,"props":307742,"children":307743},{},[307744],{"type":17,"tag":6121,"props":307745,"children":307747},{"className":307746},[],[307748],{"type":23,"value":307749},"Pet Training Pad Trays",{"type":17,"tag":84,"props":307751,"children":307752},{},[307753],{"type":17,"tag":6121,"props":307754,"children":307756},{"className":307755},[],[307757],{"type":23,"value":307758},"Fishing Hook Sharpeners",{"type":17,"tag":84,"props":307760,"children":307761},{},[307762],{"type":17,"tag":6121,"props":307763,"children":307765},{"className":307764},[],[307766],{"type":23,"value":307767},"Other Construction Heating & Cooling Supplies",{"type":17,"tag":84,"props":307769,"children":307770},{},[307771],{"type":17,"tag":6121,"props":307772,"children":307774},{"className":307773},[],[307775],{"type":23,"value":307776},"Air Press Coffee Makers",{"type":17,"tag":84,"props":307778,"children":307779},{},[307780],{"type":17,"tag":6121,"props":307781,"children":307783},{"className":307782},[],[307784],{"type":23,"value":307785},"Playground Merry-Go-Rounds",{"type":17,"tag":84,"props":307787,"children":307788},{},[307789],{"type":17,"tag":6121,"props":307790,"children":307792},{"className":307791},[],[307793],{"type":23,"value":307794},"Clothes Iron Rests",{"type":17,"tag":84,"props":307796,"children":307797},{},[307798],{"type":17,"tag":6121,"props":307799,"children":307801},{"className":307800},[],[307802],{"type":23,"value":307803},"Coffee Drippers",{"type":17,"tag":84,"props":307805,"children":307806},{},[307807],{"type":17,"tag":6121,"props":307808,"children":307810},{"className":307809},[],[307811],{"type":23,"value":307812},"Microscope Mechanical Stages",{"type":17,"tag":84,"props":307814,"children":307815},{},[307816],{"type":17,"tag":6121,"props":307817,"children":307819},{"className":307818},[],[307820],{"type":23,"value":307821},"Makeup Palettes",{"type":17,"tag":84,"props":307823,"children":307824},{},[307825],{"type":17,"tag":6121,"props":307826,"children":307828},{"className":307827},[],[307829],{"type":23,"value":307830},"Fish Poachers & Bakers",{"type":17,"tag":84,"props":307832,"children":307833},{},[307834],{"type":17,"tag":6121,"props":307835,"children":307837},{"className":307836},[],[307838],{"type":23,"value":307839},"Power Screwdrivers",{"type":17,"tag":84,"props":307841,"children":307842},{},[307843],{"type":17,"tag":6121,"props":307844,"children":307846},{"className":307845},[],[307847],{"type":23,"value":307848},"Other Bowling Supplies",{"type":17,"tag":84,"props":307850,"children":307851},{},[307852],{"type":17,"tag":6121,"props":307853,"children":307855},{"className":307854},[],[307856],{"type":23,"value":307857},"Hardware Bolts",{"type":17,"tag":84,"props":307859,"children":307860},{},[307861],{"type":17,"tag":6121,"props":307862,"children":307864},{"className":307863},[],[307865],{"type":23,"value":307866},"Gymnastics Rings",{"type":17,"tag":84,"props":307868,"children":307869},{},[307870],{"type":17,"tag":6121,"props":307871,"children":307873},{"className":307872},[],[307874],{"type":23,"value":307875},"Other Occupational Health",{"type":17,"tag":84,"props":307877,"children":307878},{},[307879],{"type":17,"tag":6121,"props":307880,"children":307882},{"className":307881},[],[307883],{"type":23,"value":307884},"Automotive Glow Plugs",{"type":17,"tag":84,"props":307886,"children":307887},{},[307888],{"type":17,"tag":6121,"props":307889,"children":307891},{"className":307890},[],[307892],{"type":23,"value":307893},"Gun Stocks",{"type":17,"tag":84,"props":307895,"children":307896},{},[307897],{"type":17,"tag":6121,"props":307898,"children":307900},{"className":307899},[],[307901],{"type":23,"value":307902},"Ice Fishing Spearing Equipment",{"type":17,"tag":84,"props":307904,"children":307905},{},[307906],{"type":17,"tag":6121,"props":307907,"children":307909},{"className":307908},[],[307910],{"type":23,"value":307911},"Light Timers",{"type":17,"tag":84,"props":307913,"children":307914},{},[307915],{"type":17,"tag":6121,"props":307916,"children":307918},{"className":307917},[],[307919],{"type":23,"value":307920},"Plant Pots & Planters",{"type":17,"tag":84,"props":307922,"children":307923},{},[307924],{"type":17,"tag":6121,"props":307925,"children":307927},{"className":307926},[],[307928],{"type":23,"value":307929},"Camera Rain Covers",{"type":17,"tag":84,"props":307931,"children":307932},{},[307933],{"type":17,"tag":6121,"props":307934,"children":307936},{"className":307935},[],[307937],{"type":23,"value":307938},"Table Place Cards",{"type":17,"tag":84,"props":307940,"children":307941},{},[307942],{"type":17,"tag":6121,"props":307943,"children":307945},{"className":307944},[],[307946],{"type":23,"value":307947},"Door Closers",{"type":17,"tag":84,"props":307949,"children":307950},{},[307951],{"type":17,"tag":6121,"props":307952,"children":307954},{"className":307953},[],[307955],{"type":23,"value":307956},"Commercial Refrigerators",{"type":17,"tag":84,"props":307958,"children":307959},{},[307960],{"type":17,"tag":6121,"props":307961,"children":307963},{"className":307962},[],[307964],{"type":23,"value":307965},"Home Brewing Beer Bottle Caps",{"type":17,"tag":84,"props":307967,"children":307968},{},[307969],{"type":17,"tag":6121,"props":307970,"children":307972},{"className":307971},[],[307973],{"type":23,"value":307974},"Badge & ID Holders",{"type":17,"tag":84,"props":307976,"children":307977},{},[307978],{"type":17,"tag":6121,"props":307979,"children":307981},{"className":307980},[],[307982],{"type":23,"value":307983},"Interdental Brushes",{"type":17,"tag":84,"props":307985,"children":307986},{},[307987],{"type":17,"tag":6121,"props":307988,"children":307990},{"className":307989},[],[307991],{"type":23,"value":307992},"Facial Self-Tanners",{"type":17,"tag":84,"props":307994,"children":307995},{},[307996],{"type":17,"tag":6121,"props":307997,"children":307999},{"className":307998},[],[308000],{"type":23,"value":308001},"Archery Finger Tabs",{"type":17,"tag":84,"props":308003,"children":308004},{},[308005],{"type":17,"tag":6121,"props":308006,"children":308008},{"className":308007},[],[308009],{"type":23,"value":308010},"Hand Drills",{"type":17,"tag":84,"props":308012,"children":308013},{},[308014],{"type":17,"tag":6121,"props":308015,"children":308017},{"className":308016},[],[308018],{"type":23,"value":308019},"Cooking Sauces & Marinades",{"type":17,"tag":84,"props":308021,"children":308022},{},[308023],{"type":17,"tag":6121,"props":308024,"children":308026},{"className":308025},[],[308027],{"type":23,"value":308028},"Conductor",{"type":17,"tag":25,"props":308030,"children":308031},{},[],{"type":17,"tag":68,"props":308033,"children":308035},{"id":308034},"walmart-category-metadata-field-mapping",[308036],{"type":23,"value":308037},"Walmart Category Metadata Field Mapping",{"type":17,"tag":29,"props":308039,"children":308040},{},[308041,308043,308048],{"type":23,"value":308042},"Use this table to understand what metadata fields are allowed for each ",{"type":17,"tag":6121,"props":308044,"children":308046},{"className":308045},[],[308047],{"type":23,"value":27310},{"type":23,"value":308049},"  when creating items via Unified. Please note that these metadata fields are optional, while some categories do need specific metadata fields",{"type":17,"tag":29,"props":308051,"children":308052},{},[308053],{"type":17,"tag":133,"props":308054,"children":308057},{"href":308055,"rel":308056},"https://prod-files-secure.s3.us-west-2.amazonaws.com/f6d0376b-d1d7-4f33-bff2-5d522d0db8dc/87d2c7a2-b0ec-47db-a30d-b5a3c79532e2/walmart_schema_fields.md?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB46627OXAUV4%2F20260203%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260203T202547Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEDwaCXVzLXdlc3QtMiJHMEUCIDcwb3GqFMY%2FL0AJfL3I%2FUaV5M9rbKJANmndDNP%2B3cvWAiEAhstHrJkItWTW8LOfcwCVzrIfvRAjHLMFyJfIfDU%2Bm5kq%2FwMIBRAAGgw2Mzc0MjMxODM4MDUiDA%2BtPXgWwEeVTi9f7ircAy8POF8SwjOULjsIQSqBd%2Fb2Sb6AYRzEosiUnG56PWPmdxaHm3k3mhZ98RpFVpH8CeB7bEprhu1JjUOsHo93G6SlQ3WFnekVfwsKTtQeZInDow6JHMH%2BMGm%2BY4yrZil9HtEvuEeXCcyLOpo4qxe%2FzygCd1LK5%2FFlF%2BufoVF3BNpKp7P0MtoXnCzFWs0MFxnCNa0rC852v5sNTAEu478oOshw%2BLFPjPGr4BN3oIlmMjDzWYHZY8%2BJiaJ2aGhByPelsH3KEkQRqC%2B40w3fkPcpLH77Np6vl31a0ex%2FRk5m7EV8FvHsTcnYMhH5svt21RR24xTmDstjj2oVRm5V%2FX8eJKX6kjKslRLNhw8d2M27UCF6OpxsqOnqS1LGxnS7rvxNgYanpAvdn7NkjmYFdDeRdeHbzEeENgxu2tF8SUoaDcf1Egcyu8YwxKCbGOxPibrKF%2BDwMky3VDx2sdvpK9jJZ0Eh8xGXgUcNOrCn4%2FGCvfOFp%2FtYposVMIUDbq%2B73dBoaHWeuGS3bdKKb66PIkZKRn05sTczh%2BrDXqXKMoZQoh5OvENP9IRrAgUYEl3Xk3aBgBURjrMHYmxdMVzNN%2BnNkGj7tyub25hYezxlEGmlYb69wGyILpxLIx7xqB%2FBMM%2BYicwGOqUBB0ea%2B5PQU0cqrDMLy%2BnMl9D9nPF2C7uGR2XYiEEFZBqU%2Bi2WTYMRsjeJA2Rx%2BTujp%2BvkhiPftP12AVrIQ2PyuO5gMUOPpxef782YG8379CUFQjyGeX4Fc9kUGvXjZfX%2F4mC0EJZpzKPETzLbvwNv9JwO%2BBKTKTCtkFdhzE1QBz5NRfnV5CuPgC8GEgMgB8OV70jCGmsqhgJKqb8T0ENHV0r%2BT2Io&X-Amz-Signature=8d40af48db880c5cd5ad6117b673bf0138e774a6347b8b3f26e646322b8e3999&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject",[214],[308058],{"type":23,"value":269602},{"type":17,"tag":25,"props":308060,"children":308061},{},[],{"type":17,"tag":239,"props":308063,"children":308065},{"id":308064},"sample-payload",[308066],{"type":23,"value":308067},"Sample Payload",{"type":17,"tag":6893,"props":308069,"children":308072},{"className":308070,"code":308071,"language":22503,"meta":7},[22501],"{\n  \"name\": \"Wireless Earphones with Advanced Features\",\n  \"slug\": \"09876543210987\",\n  \"global_code\": \"06146190200012\",\n  \"type\": \"Exterior Automotive Accessories\",\n  \"description\": \"Totally wireless earphones are built to revolutionize your workouts. The adjustable, secure-fit earhooks are customizable for extended comfort and stability. A reinforced design for sweat and water resistance lets you take it to the next level. Each earbud has full volume and track controls and up to 9 hours of listening time to fuel your training with powerful, balanced sound.\",\n  \"media\": [\n    {\n      \"url\": \"https://i5.walmartimages.com/seo/onn-Wireless-Bluetooth-on-Ear-Headphones-Black-New_07de2d93-505b-4902-8366-388a3f30e3b4.9375c5690645733ec080eef3f4895f7b.jpeg\"\n    }\n  ],\n  \"vendor_name\": \"Walmart\",\n  \"variants\": [\n    {\n      \"sku\": \"09876543210987\",\n      \"weight\": 0.57,\n      \"prices\": [\n        {\n          \"price\": 249.99\n        }\n      ]\n    }\n  ],\n  \"metadata\": {\n    \"productName\": \"Wireless Earphones with Advanced Features\",\n    \"brand\": \"Walmart\",\n    \"keyFeatures\": [\n      \"Designed to keep up with your workouts\",\n      \"Reinforced design for sweat and water resistance with adjustable, secure-fit earhooks for added comfort and stability.\",\n      \"Stay connected from a distance with Bluetooth technology, these wireless earphones deliver extended range and fewer dropouts.\",\n      \"Powers through long hours of training\"\n    ],\n    \"countPerPack\": 1,\n    \"multipackQuantity\": 1,\n    \"isProp65WarningRequired\": \"No\",\n    \"condition\": \"New\",\n    \"has_written_warranty\": \"Yes - Warranty Text\",\n    \"netContent\": {\n      \"productNetContentMeasure\": 1,\n      \"productNetContentUnit\": \"Each\"\n    },\n    \"productSecondaryImageURL\": [\n      \"https://i5.walmartimages.com/seo/onn-Wireless-Bluetooth-on-Ear-Headphones-Black-New_07de2d93-505b-4902-8366-388a3f30e3b4.9375c5690645733ec080eef3f4895f7b.jpeg\"\n    ],\n    \"assembledProductLength\": {\n      \"measure\": 4.33,\n      \"unit\": \"in\"\n    },\n    \"assembledProductHeight\": {\n      \"measure\": 4.33,\n      \"unit\": \"in\"\n    },\n    \"assembledProductWeight\": {\n      \"measure\": 0.57,\n      \"unit\": \"lb\"\n    },\n    \"assembledProductWidth\": {\n      \"measure\": 3.15,\n      \"unit\": \"in\"\n    },\n    \"prop65WarningText\": \"No\",\n    \"manufacturer\": \"Walmart\",\n    \"manufacturerPartNumber\": \"WM123456\",\n    \"count\": 1,\n    \"warrantyText\": \"1 Year\",\n    \"color\": \"Blue\",\n    \"aaiaBrandID\": \"WMTB\",\n    \"vehicle_fitment_type\": \"Specific\"\n  },\n  \"options\": {}\n}\n",[308073],{"type":17,"tag":6121,"props":308074,"children":308075},{"__ignoreMap":7},[308076],{"type":23,"value":308071},{"type":17,"tag":29,"props":308078,"children":308079},{},[308080,308084,308086,308091,308093,308098,308100,308109,308111,308119],{"type":17,"tag":48,"props":308081,"children":308082},{},[308083],{"type":23,"value":27047},{"type":23,"value":308085},": If item creation ",{"type":17,"tag":48,"props":308087,"children":308088},{},[308089],{"type":23,"value":308090},"fails",{"type":23,"value":308092}," or takes ",{"type":17,"tag":48,"props":308094,"children":308095},{},[308096],{"type":23,"value":308097},"too long",{"type":23,"value":308099}," to process, the ",{"type":17,"tag":48,"props":308101,"children":308102},{},[308103],{"type":17,"tag":6121,"props":308104,"children":308106},{"className":308105},[],[308107],{"type":23,"value":308108},"feed ID",{"type":23,"value":308110}," and any ",{"type":17,"tag":48,"props":308112,"children":308113},{},[308114],{"type":17,"tag":6121,"props":308115,"children":308117},{"className":308116},[],[308118],{"type":23,"value":92292},{"type":23,"value":308120}," will be returned in the error response.",{"type":17,"tag":29,"props":308122,"children":308123},{},[308124,308125,308130,308131,308139,308140],{"type":23,"value":300111},{"type":17,"tag":48,"props":308126,"children":308127},{},[308128],{"type":23,"value":308129},"Important Note on Reading",{"type":23,"value":18757},{"type":17,"tag":48,"props":308132,"children":308133},{},[308134],{"type":17,"tag":6121,"props":308135,"children":308137},{"className":308136},[],[308138],{"type":23,"value":71567},{"type":23,"value":18757},{"type":17,"tag":48,"props":308141,"children":308142},{},[308143],{"type":23,"value":308144},"Data via Walmart's GET and LIST APIs",{"type":17,"tag":29,"props":308146,"children":308147},{},[308148,308150,308154,308155,308160,308162,308167,308169,308174],{"type":23,"value":308149},"When using Walmart's ",{"type":17,"tag":48,"props":308151,"children":308152},{},[308153],{"type":23,"value":122909},{"type":23,"value":75890},{"type":17,"tag":48,"props":308156,"children":308157},{},[308158],{"type":23,"value":308159},"LIST",{"type":23,"value":308161}," endpoints to retrieve ",{"type":17,"tag":6121,"props":308163,"children":308165},{"className":308164},[],[308166],{"type":23,"value":71567},{"type":23,"value":308168}," records (i.e., your catalog items), ",{"type":17,"tag":48,"props":308170,"children":308171},{},[308172],{"type":23,"value":308173},"you will only receive a subset of the full item",{"type":23,"value":308175},". This limitation is imposed by Walmart's public Marketplace APIs and is not configurable.",{"type":17,"tag":239,"props":308177,"children":308179},{"id":308178},"whats-missing",[308180],{"type":23,"value":308181},"What's Missing?",{"type":17,"tag":80,"props":308183,"children":308184},{},[308185,308237],{"type":17,"tag":84,"props":308186,"children":308187},{},[308188,308190,308199,308201,308207,308208,308214,308215,308221,308222,308228,308230,308235],{"type":23,"value":308189},"Fields defined in the ",{"type":17,"tag":48,"props":308191,"children":308192},{},[308193],{"type":17,"tag":6121,"props":308194,"children":308196},{"className":308195},[],[308197],{"type":23,"value":308198},"Visible",{"type":23,"value":308200}," section of your original item feed (e.g., ",{"type":17,"tag":6121,"props":308202,"children":308204},{"className":308203},[],[308205],{"type":23,"value":308206},"animalLifestage",{"type":23,"value":11826},{"type":17,"tag":6121,"props":308209,"children":308211},{"className":308210},[],[308212],{"type":23,"value":308213},"assembledProductWeight",{"type":23,"value":11826},{"type":17,"tag":6121,"props":308216,"children":308218},{"className":308217},[],[308219],{"type":23,"value":308220},"features",{"type":23,"value":11826},{"type":17,"tag":6121,"props":308223,"children":308225},{"className":308224},[],[308226],{"type":23,"value":308227},"fabricContent",{"type":23,"value":308229},", etc.) will ",{"type":17,"tag":48,"props":308231,"children":308232},{},[308233],{"type":23,"value":308234},"not be returned",{"type":23,"value":308236}," in full.",{"type":17,"tag":84,"props":308238,"children":308239},{},[308240,308242,308247],{"type":23,"value":308241},"Walmart truncates or omits many ",{"type":17,"tag":48,"props":308243,"children":308244},{},[308245],{"type":23,"value":308246},"category-specific structured attributes",{"type":23,"value":54},{"type":17,"tag":239,"props":308249,"children":308251},{"id":308250},"why-this-happens",[308252],{"type":23,"value":308253},"Why This Happens:",{"type":17,"tag":29,"props":308255,"children":308256},{},[308257],{"type":23,"value":308258},"Walmart's GET/LIST endpoints are designed for high-level overviews or simple listing needs, not for reconstructing detailed item payloads. They surface:",{"type":17,"tag":80,"props":308260,"children":308261},{},[308262,308267,308272],{"type":17,"tag":84,"props":308263,"children":308264},{},[308265],{"type":23,"value":308266},"Basic identifiers (e.g., SKU, productName)",{"type":17,"tag":84,"props":308268,"children":308269},{},[308270],{"type":23,"value":308271},"Core logistics info (e.g., price, inventory, brand)",{"type":17,"tag":84,"props":308273,"children":308274},{},[308275,308276,308281],{"type":23,"value":9619},{"type":17,"tag":33,"props":308277,"children":308278},{},[308279],{"type":23,"value":308280},"limited set",{"type":23,"value":308282}," of visible attributes",{"title":7,"searchDepth":1629,"depth":1629,"links":308284},[308285,308286,308287,308289],{"id":300941,"depth":1635,"text":300944},{"id":301046,"depth":1635,"text":301049},{"id":301176,"depth":1635,"text":308288},"Supported type Values for Walmart Items (commerce_item)",{"id":308034,"depth":1629,"text":308037,"children":308290},[308291,308292,308293],{"id":308064,"depth":1635,"text":308067},{"id":308178,"depth":1635,"text":308181},{"id":308250,"depth":1635,"text":308253},"content:blog:creating_walmart_items_via_unified.md","blog/creating_walmart_items_via_unified.md","blog/creating_walmart_items_via_unified",{"_path":308298,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":287833,"description":308299,"img":308300,"date":308301,"tag":6341,"body":308302,"_type":1677,"_id":309023,"_source":1679,"_file":309024,"_stem":309025,"_extension":1682},"/blog/enriching_unified_objects_with_custom_metadata","The metadatametadata object is a powerful addition to the Unified data model. It enables the definition of metadata schemas (custom fields) that can be...","https://s3.us-east-2.amazonaws.com/unified-article-images/enriching_unified_objects_with_custom_metadata-icon.webp","2025-07-23T00:00:00.000Z",{"type":14,"children":308303,"toc":309000},[308304,308309,308312,308320,308324,308355,308360,308363,308368,308392,308395,308400,308409,308412,308417,308425,308436,308471,308485,308488,308496,308501,308621,308624,308632,308641,308650,308655,308658,308664,308683,308693,308702,308705,308711,308724,308735,308782,308791,308794,308800,308805,308814,308817,308823,308832,308837,308843,308848,308857,308875,308878,308884,308903,308921,308924,308928],{"type":17,"tag":18,"props":308305,"children":308307},{"id":308306},"enriching-unified-objects-with-custom-metadata",[308308],{"type":23,"value":287833},{"type":17,"tag":25,"props":308310,"children":308311},{},[],{"type":17,"tag":29,"props":308313,"children":308314},{},[308315],{"type":17,"tag":33,"props":308316,"children":308317},{},[308318],{"type":23,"value":308319},"July 23, 2025",{"type":17,"tag":68,"props":308321,"children":308322},{"id":42649},[308323],{"type":23,"value":42652},{"type":17,"tag":29,"props":308325,"children":308326},{},[308327,308329,308334,308336,308341,308342,308347,308348,308353],{"type":23,"value":308328},"The metadata_metadata object is a powerful addition to the Unified data model. It enables the definition of ",{"type":17,"tag":48,"props":308330,"children":308331},{},[308332],{"type":23,"value":308333},"metadata schemas (custom fields)",{"type":23,"value":308335}," that can be attached to various unified objects—such as ",{"type":17,"tag":6121,"props":308337,"children":308339},{"className":308338},[],[308340],{"type":23,"value":71567},{"type":23,"value":11826},{"type":17,"tag":6121,"props":308343,"children":308345},{"className":308344},[],[308346],{"type":23,"value":157090},{"type":23,"value":11826},{"type":17,"tag":6121,"props":308349,"children":308351},{"className":308350},[],[308352],{"type":23,"value":124400},{"type":23,"value":308354},", and more.",{"type":17,"tag":29,"props":308356,"children":308357},{},[308358],{"type":23,"value":308359},"This document explains its structure, how to use it effectively, and best practices for managing dynamic metadata across models.",{"type":17,"tag":25,"props":308361,"children":308362},{},[],{"type":17,"tag":68,"props":308364,"children":308366},{"id":308365},"purpose",[308367],{"type":23,"value":20787},{"type":17,"tag":29,"props":308369,"children":308370},{},[308371,308376,308378,308383,308385,308390],{"type":17,"tag":6121,"props":308372,"children":308374},{"className":308373},[],[308375],{"type":23,"value":110283},{"type":23,"value":308377}," serves as a ",{"type":17,"tag":48,"props":308379,"children":308380},{},[308381],{"type":23,"value":308382},"schema registry",{"type":23,"value":308384}," for custom fields, allowing users to enrich objects with reusable, structured metadata. These definitions dictate the format and structure of metadata values that live inside the ",{"type":17,"tag":6121,"props":308386,"children":308388},{"className":308387},[],[308389],{"type":23,"value":23792},{"type":23,"value":308391}," field of supported Unified objects.",{"type":17,"tag":25,"props":308393,"children":308394},{},[],{"type":17,"tag":68,"props":308396,"children":308397},{"id":18577},[308398],{"type":23,"value":308399},"Object Structure",{"type":17,"tag":6893,"props":308401,"children":308404},{"className":308402,"code":308403,"language":18718,"meta":7},[18716],"interface IMetadataMetadata {\n  id?: string;\n  created_at?: (string | Date | number);\n  updated_at?: (string | Date | number);\n  name: string; // Required\n  slug?: string;\n  format?: string; // One of the supported formats\n  original_format?: string;\n  options?: string[];\n  object_type: string; // e.g. 'commerce_item', 'ats_job'\n  objects?: { [objectType: string]: string[] }; // Map of object_type to object IDs\n}\n",[308405],{"type":17,"tag":6121,"props":308406,"children":308407},{"__ignoreMap":7},[308408],{"type":23,"value":308403},{"type":17,"tag":25,"props":308410,"children":308411},{},[],{"type":17,"tag":68,"props":308413,"children":308414},{"id":300941},[308415],{"type":23,"value":308416},"Key Concepts",{"type":17,"tag":239,"props":308418,"children":308419},{"id":161193},[308420],{"type":17,"tag":6121,"props":308421,"children":308423},{"className":308422},[],[308424],{"type":23,"value":161193},{"type":17,"tag":29,"props":308426,"children":308427},{},[308428,308429,308434],{"type":23,"value":300980},{"type":17,"tag":48,"props":308430,"children":308431},{},[308432],{"type":23,"value":308433},"unified model",{"type":23,"value":308435}," the metadata is associated with. Examples include:",{"type":17,"tag":80,"props":308437,"children":308438},{},[308439,308448,308457,308466],{"type":17,"tag":84,"props":308440,"children":308441},{},[308442],{"type":17,"tag":6121,"props":308443,"children":308445},{"className":308444},[],[308446],{"type":23,"value":308447},"\"commerce_item\"",{"type":17,"tag":84,"props":308449,"children":308450},{},[308451],{"type":17,"tag":6121,"props":308452,"children":308454},{"className":308453},[],[308455],{"type":23,"value":308456},"\"ats_job\"",{"type":17,"tag":84,"props":308458,"children":308459},{},[308460],{"type":17,"tag":6121,"props":308461,"children":308463},{"className":308462},[],[308464],{"type":23,"value":308465},"\"hris_employee\"",{"type":17,"tag":84,"props":308467,"children":308468},{},[308469],{"type":23,"value":308470},"Other Unified Objects",{"type":17,"tag":3414,"props":308472,"children":308473},{},[308474],{"type":17,"tag":29,"props":308475,"children":308476},{},[308477,308479,308483],{"type":23,"value":308478},"When listing metadata_metadata entries, you can filter by ",{"type":17,"tag":48,"props":308480,"children":308481},{},[308482],{"type":23,"value":27310},{"type":23,"value":308484},", which corresponds to the object_type.",{"type":17,"tag":25,"props":308486,"children":308487},{},[],{"type":17,"tag":239,"props":308489,"children":308490},{"id":214510},[308491],{"type":17,"tag":6121,"props":308492,"children":308494},{"className":308493},[],[308495],{"type":23,"value":214510},{"type":17,"tag":29,"props":308497,"children":308498},{},[308499],{"type":23,"value":308500},"Defines the data type for the metadata field. Supported formats include:",{"type":17,"tag":80,"props":308502,"children":308503},{},[308504,308513,308522,308531,308540,308549,308558,308567,308576,308585,308594,308603,308612],{"type":17,"tag":84,"props":308505,"children":308506},{},[308507],{"type":17,"tag":6121,"props":308508,"children":308510},{"className":308509},[],[308511],{"type":23,"value":308512},"'TEXT'",{"type":17,"tag":84,"props":308514,"children":308515},{},[308516],{"type":17,"tag":6121,"props":308517,"children":308519},{"className":308518},[],[308520],{"type":23,"value":308521},"'NUMBER'",{"type":17,"tag":84,"props":308523,"children":308524},{},[308525],{"type":17,"tag":6121,"props":308526,"children":308528},{"className":308527},[],[308529],{"type":23,"value":308530},"'DATE'",{"type":17,"tag":84,"props":308532,"children":308533},{},[308534],{"type":17,"tag":6121,"props":308535,"children":308537},{"className":308536},[],[308538],{"type":23,"value":308539},"'BOOLEAN'",{"type":17,"tag":84,"props":308541,"children":308542},{},[308543],{"type":17,"tag":6121,"props":308544,"children":308546},{"className":308545},[],[308547],{"type":23,"value":308548},"'FILE'",{"type":17,"tag":84,"props":308550,"children":308551},{},[308552],{"type":17,"tag":6121,"props":308553,"children":308555},{"className":308554},[],[308556],{"type":23,"value":308557},"'TEXTAREA'",{"type":17,"tag":84,"props":308559,"children":308560},{},[308561],{"type":17,"tag":6121,"props":308562,"children":308564},{"className":308563},[],[308565],{"type":23,"value":308566},"'SINGLE_SELECT'",{"type":17,"tag":84,"props":308568,"children":308569},{},[308570],{"type":17,"tag":6121,"props":308571,"children":308573},{"className":308572},[],[308574],{"type":23,"value":308575},"'MULTIPLE_SELECT'",{"type":17,"tag":84,"props":308577,"children":308578},{},[308579],{"type":17,"tag":6121,"props":308580,"children":308582},{"className":308581},[],[308583],{"type":23,"value":308584},"'MEASUREMENT'",{"type":17,"tag":84,"props":308586,"children":308587},{},[308588],{"type":17,"tag":6121,"props":308589,"children":308591},{"className":308590},[],[308592],{"type":23,"value":308593},"'PRICE'",{"type":17,"tag":84,"props":308595,"children":308596},{},[308597],{"type":17,"tag":6121,"props":308598,"children":308600},{"className":308599},[],[308601],{"type":23,"value":308602},"'YES_NO'",{"type":17,"tag":84,"props":308604,"children":308605},{},[308606],{"type":17,"tag":6121,"props":308607,"children":308609},{"className":308608},[],[308610],{"type":23,"value":308611},"'CURRENCY'",{"type":17,"tag":84,"props":308613,"children":308614},{},[308615],{"type":17,"tag":6121,"props":308616,"children":308618},{"className":308617},[],[308619],{"type":23,"value":308620},"'URL'",{"type":17,"tag":25,"props":308622,"children":308623},{},[],{"type":17,"tag":239,"props":308625,"children":308626},{"id":80429},[308627],{"type":17,"tag":6121,"props":308628,"children":308630},{"className":308629},[],[308631],{"type":23,"value":80429},{"type":17,"tag":29,"props":308633,"children":308634},{},[308635,308637],{"type":23,"value":308636},"A mapping of object types to the specific object IDs where this metadata is currently applied.\n",{"type":17,"tag":48,"props":308638,"children":308639},{},[308640],{"type":23,"value":19878},{"type":17,"tag":6893,"props":308642,"children":308645},{"className":308643,"code":308644,"language":22503,"meta":7},[22501],"{\n  \"objects\": {\n    \"commerce_item\": [\"item1\", \"item2\"],\n    \"ats_job\": [\"job1\"]\n  }\n}\n",[308646],{"type":17,"tag":6121,"props":308647,"children":308648},{"__ignoreMap":7},[308649],{"type":23,"value":308644},{"type":17,"tag":29,"props":308651,"children":308652},{},[308653],{"type":23,"value":308654},"This makes it easy to track which unified records are using each metadata definition.",{"type":17,"tag":25,"props":308656,"children":308657},{},[],{"type":17,"tag":68,"props":308659,"children":308661},{"id":308660},"usage-in-unified-objects",[308662],{"type":23,"value":308663},"Usage in Unified Objects",{"type":17,"tag":29,"props":308665,"children":308666},{},[308667,308669,308674,308676,308681],{"type":23,"value":308668},"Each unified object includes a ",{"type":17,"tag":6121,"props":308670,"children":308672},{"className":308671},[],[308673],{"type":23,"value":23792},{"type":23,"value":308675}," array, where each entry corresponds to a metadata definition from the ",{"type":17,"tag":6121,"props":308677,"children":308679},{"className":308678},[],[308680],{"type":23,"value":110283},{"type":23,"value":308682}," registry.",{"type":17,"tag":239,"props":308684,"children":308686},{"id":308685},"example-iatsjob",[308687,308688],{"type":23,"value":43619},{"type":17,"tag":6121,"props":308689,"children":308691},{"className":308690},[],[308692],{"type":23,"value":260023},{"type":17,"tag":6893,"props":308694,"children":308697},{"className":308695,"code":308696,"language":6898,"meta":7},[6896],"interface IAtsMetadata {\n  id?: string;\n  slug?: string;\n  value?: unknown;\n  namespace?: string;\n  format?: string;\n  extra_data?: unknown;\n}\n\ninterface IAtsJob {\n  ...\n  metadata?: IAtsMetadata[];\n  ...\n}\n",[308698],{"type":17,"tag":6121,"props":308699,"children":308700},{"__ignoreMap":7},[308701],{"type":23,"value":308696},{"type":17,"tag":25,"props":308703,"children":308704},{},[],{"type":17,"tag":68,"props":308706,"children":308708},{"id":308707},"workflow-example",[308709],{"type":23,"value":308710},"Workflow Example",{"type":17,"tag":239,"props":308712,"children":308714},{"id":308713},"step-1-create-a-metadata_metadata-definition",[308715,308717,308722],{"type":23,"value":308716},"Step 1: Create a ",{"type":17,"tag":6121,"props":308718,"children":308720},{"className":308719},[],[308721],{"type":23,"value":110283},{"type":23,"value":308723}," Definition",{"type":17,"tag":29,"props":308725,"children":308726},{},[308727,308729,308733],{"type":23,"value":308728},"To begin, define the metadata schema by providing ",{"type":17,"tag":48,"props":308730,"children":308731},{},[308732],{"type":23,"value":178095},{"type":23,"value":308734}," the following required fields:",{"type":17,"tag":80,"props":308736,"children":308737},{},[308738,308748,308758],{"type":17,"tag":84,"props":308739,"children":308740},{},[308741,308746],{"type":17,"tag":6121,"props":308742,"children":308744},{"className":308743},[],[308745],{"type":23,"value":18781},{"type":23,"value":308747},": Human-friendly label",{"type":17,"tag":84,"props":308749,"children":308750},{},[308751,308756],{"type":17,"tag":6121,"props":308752,"children":308754},{"className":308753},[],[308755],{"type":23,"value":214491},{"type":23,"value":308757},": Unique programmatic identifier (Picked up from name if not given)",{"type":17,"tag":84,"props":308759,"children":308760},{},[308761,308766,308768,308774,308775,308781],{"type":17,"tag":6121,"props":308762,"children":308764},{"className":308763},[],[308765],{"type":23,"value":214510},{"type":23,"value":308767},": Expected data format (e.g., ",{"type":17,"tag":6121,"props":308769,"children":308771},{"className":308770},[],[308772],{"type":23,"value":308773},"\"TEXT\"",{"type":23,"value":11826},{"type":17,"tag":6121,"props":308776,"children":308778},{"className":308777},[],[308779],{"type":23,"value":308780},"\"NUMBER\"",{"type":23,"value":149980},{"type":17,"tag":6893,"props":308783,"children":308786},{"className":308784,"code":308785,"language":22503,"meta":7},[22501],"POST /metadata_metadata\n{\n  \"name\": \"Binding Mount\",\n  \"slug\": \"binding_mount\",\n  \"format\": \"TEXT\"\n}\n",[308787],{"type":17,"tag":6121,"props":308788,"children":308789},{"__ignoreMap":7},[308790],{"type":23,"value":308785},{"type":17,"tag":25,"props":308792,"children":308793},{},[],{"type":17,"tag":239,"props":308795,"children":308797},{"id":308796},"step-2-review-the-created-metadata",[308798],{"type":23,"value":308799},"Step 2: Review the Created Metadata",{"type":17,"tag":29,"props":308801,"children":308802},{},[308803],{"type":23,"value":308804},"Once the metadata is created, the full record might look like this (after automatic enrichment):",{"type":17,"tag":6893,"props":308806,"children":308809},{"className":308807,"code":308808,"language":22503,"meta":7},[22501],"GET /metadata_metadata/1\n{\n  \"id\": \"1\",\n  \"name\": \"Binding Mount\",\n  \"slug\": \"binding_mount\",\n  \"format\": \"TEXT\",\n  \"original_format\": \"single_line_text_field\"\n}\n",[308810],{"type":17,"tag":6121,"props":308811,"children":308812},{"__ignoreMap":7},[308813],{"type":23,"value":308808},{"type":17,"tag":25,"props":308815,"children":308816},{},[],{"type":17,"tag":239,"props":308818,"children":308820},{"id":308819},"step-3-attach-metadata-to-a-unified-object",[308821],{"type":23,"value":308822},"Step 3: Attach Metadata to a Unified Object",{"type":17,"tag":6893,"props":308824,"children":308827},{"className":308825,"code":308826,"language":22503,"meta":7},[22501],"PATCH /commerce_item/7\n{\n  \"metadata\": [\n    {\n      \"id\": \"1\",\n      \"slug\": \"binding_mount\",\n      \"value\": \"Optimistic\"\n    }\n  ]\n}\n",[308828],{"type":17,"tag":6121,"props":308829,"children":308830},{"__ignoreMap":7},[308831],{"type":23,"value":308826},{"type":17,"tag":29,"props":308833,"children":308834},{},[308835],{"type":23,"value":308836},"Make sure the id /  slug match the schema created in Step 1.",{"type":17,"tag":239,"props":308838,"children":308840},{"id":308839},"step-4-review-the-metadata-again",[308841],{"type":23,"value":308842},"Step 4: Review the Metadata Again",{"type":17,"tag":29,"props":308844,"children":308845},{},[308846],{"type":23,"value":308847},"Once the metadata is used in a Unified object, the full record might be updated to look like this:",{"type":17,"tag":6893,"props":308849,"children":308852},{"className":308850,"code":308851,"language":22503,"meta":7},[22501],"GET /metadata_metadata/1\n{\n  \"id\": \"1\",\n  \"name\": \"Binding Mount\",\n  \"slug\": \"binding_mount\",\n  \"format\": \"TEXT\",\n  \"original_format\": \"single_line_text_field\",\n  \"object_type\": \"commerce_item\",\n  \"objects\": {\n    \"commerce_item\": [\"7\"]\n  }\n}\n",[308853],{"type":17,"tag":6121,"props":308854,"children":308855},{"__ignoreMap":7},[308856],{"type":23,"value":308851},{"type":17,"tag":29,"props":308858,"children":308859},{},[308860,308862,308867,308869,308874],{"type":23,"value":308861},"This shows the metadata definition has been associated with the unified object type ",{"type":17,"tag":6121,"props":308863,"children":308865},{"className":308864},[],[308866],{"type":23,"value":71567},{"type":23,"value":308868}," and is linked to object with ID ",{"type":17,"tag":6121,"props":308870,"children":308872},{"className":308871},[],[308873],{"type":23,"value":274621},{"type":23,"value":54},{"type":17,"tag":25,"props":308876,"children":308877},{},[],{"type":17,"tag":68,"props":308879,"children":308881},{"id":308880},"crudl-support",[308882],{"type":23,"value":308883},"CRUDL Support",{"type":17,"tag":29,"props":308885,"children":308886},{},[308887,308889,308894,308896,308901],{"type":23,"value":308888},"Full ",{"type":17,"tag":48,"props":308890,"children":308891},{},[308892],{"type":23,"value":308893},"Create, Read, Update, Delete, and List",{"type":23,"value":308895}," operations are supported on ",{"type":17,"tag":6121,"props":308897,"children":308899},{"className":308898},[],[308900],{"type":23,"value":110283},{"type":23,"value":308902},". This enables:",{"type":17,"tag":80,"props":308904,"children":308905},{},[308906,308911,308916],{"type":17,"tag":84,"props":308907,"children":308908},{},[308909],{"type":23,"value":308910},"Schema-driven form builders",{"type":17,"tag":84,"props":308912,"children":308913},{},[308914],{"type":23,"value":308915},"Reusable definitions across multiple objects",{"type":17,"tag":84,"props":308917,"children":308918},{},[308919],{"type":23,"value":308920},"Consistent data validation and audit trails",{"type":17,"tag":25,"props":308922,"children":308923},{},[],{"type":17,"tag":68,"props":308925,"children":308926},{"id":950},[308927],{"type":23,"value":144077},{"type":17,"tag":7231,"props":308929,"children":308930},{},[308931,308946],{"type":17,"tag":7235,"props":308932,"children":308933},{},[308934],{"type":17,"tag":7239,"props":308935,"children":308936},{},[308937,308942],{"type":17,"tag":7243,"props":308938,"children":308939},{},[308940],{"type":23,"value":308941},"Use Case",{"type":17,"tag":7243,"props":308943,"children":308944},{},[308945],{"type":23,"value":7377},{"type":17,"tag":7259,"props":308947,"children":308948},{},[308949,308966,308983],{"type":17,"tag":7239,"props":308950,"children":308951},{},[308952,308957],{"type":17,"tag":7266,"props":308953,"children":308954},{},[308955],{"type":23,"value":308956},"Custom field on ATS Job",{"type":17,"tag":7266,"props":308958,"children":308959},{},[308960],{"type":17,"tag":6121,"props":308961,"children":308963},{"className":308962},[],[308964],{"type":23,"value":308965},"\"interview_style\": \"technical panel\"",{"type":17,"tag":7239,"props":308967,"children":308968},{},[308969,308974],{"type":17,"tag":7266,"props":308970,"children":308971},{},[308972],{"type":23,"value":308973},"Enrich commerce item with specs",{"type":17,"tag":7266,"props":308975,"children":308976},{},[308977],{"type":17,"tag":6121,"props":308978,"children":308980},{"className":308979},[],[308981],{"type":23,"value":308982},"\"binding_mount\": \"Optimistic\"",{"type":17,"tag":7239,"props":308984,"children":308985},{},[308986,308991],{"type":17,"tag":7266,"props":308987,"children":308988},{},[308989],{"type":23,"value":308990},"Add legal identifiers to employee",{"type":17,"tag":7266,"props":308992,"children":308993},{},[308994],{"type":17,"tag":6121,"props":308995,"children":308997},{"className":308996},[],[308998],{"type":23,"value":308999},"\"national_id\": \"IN123456\"",{"title":7,"searchDepth":1629,"depth":1629,"links":309001},[309002,309003,309004,309005,309010,309014,309021,309022],{"id":42649,"depth":1629,"text":42652},{"id":308365,"depth":1629,"text":20787},{"id":18577,"depth":1629,"text":308399},{"id":300941,"depth":1629,"text":308416,"children":309006},[309007,309008,309009],{"id":161193,"depth":1635,"text":161193},{"id":214510,"depth":1635,"text":214510},{"id":80429,"depth":1635,"text":80429},{"id":308660,"depth":1629,"text":308663,"children":309011},[309012],{"id":308685,"depth":1635,"text":309013},"Example: IAtsJob",{"id":308707,"depth":1629,"text":308710,"children":309015},[309016,309018,309019,309020],{"id":308713,"depth":1635,"text":309017},"Step 1: Create a metadata_metadata Definition",{"id":308796,"depth":1635,"text":308799},{"id":308819,"depth":1635,"text":308822},{"id":308839,"depth":1635,"text":308842},{"id":308880,"depth":1629,"text":308883},{"id":950,"depth":1629,"text":144077},"content:blog:enriching_unified_objects_with_custom_metadata.md","blog/enriching_unified_objects_with_custom_metadata.md","blog/enriching_unified_objects_with_custom_metadata",{"_path":309027,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":309028,"description":309029,"img":309030,"date":309031,"tag":6341,"body":309032,"_type":1677,"_id":309566,"_source":1679,"_file":309567,"_stem":309568,"_extension":1682},"/blog/workday_vs_workday_legacy_why_unified_supports_both","Workday vs Workday Legacy — Why Unified.to Supports Both","Workday provides two main API integration formats,","https://s3.us-east-2.amazonaws.com/unified-article-images/workday_vs_workday_legacy_why_unified_supports_both-icon.png","2025-07-22T00:00:00.000Z",{"type":14,"children":309033,"toc":309561},[309034,309039,309042,309050,309061,309091,309109,309115,309120,309178,309390,309396,309404,309414,309422,309432,309440,309449,309457,309472,309480,309489,309497,309506,309514,309523,309527,309538,309548,309556],{"type":17,"tag":18,"props":309035,"children":309037},{"id":309036},"workday-vs-workday-legacy-why-unifiedto-supports-both",[309038],{"type":23,"value":309028},{"type":17,"tag":25,"props":309040,"children":309041},{},[],{"type":17,"tag":29,"props":309043,"children":309044},{},[309045],{"type":17,"tag":33,"props":309046,"children":309047},{},[309048],{"type":23,"value":309049},"July 22, 2025",{"type":17,"tag":29,"props":309051,"children":309052},{},[309053,309055,309060],{"type":23,"value":309054},"Workday provides ",{"type":17,"tag":48,"props":309056,"children":309057},{},[309058],{"type":23,"value":309059},"two main API integration formats",{"type":23,"value":20456},{"type":17,"tag":6154,"props":309062,"children":309063},{},[309064,309074],{"type":17,"tag":84,"props":309065,"children":309066},{},[309067,309072],{"type":17,"tag":48,"props":309068,"children":309069},{},[309070],{"type":23,"value":309071},"Workday REST API",{"type":23,"value":309073}," — their latest modern API, but still under active development.",{"type":17,"tag":84,"props":309075,"children":309076},{},[309077,309082,309084,309089],{"type":17,"tag":48,"props":309078,"children":309079},{},[309080],{"type":23,"value":309081},"Workday SOAP API",{"type":23,"value":309083}," (often referred to as ",{"type":17,"tag":33,"props":309085,"children":309086},{},[309087],{"type":23,"value":309088},"Legacy",{"type":23,"value":309090},") — the older but mature API that still covers some critical endpoints not yet available in REST.",{"type":17,"tag":29,"props":309092,"children":309093},{},[309094,309096,309101,309103,309107],{"type":23,"value":309095},"To give you maximum flexibility and to ensure you can access ",{"type":17,"tag":48,"props":309097,"children":309098},{},[309099],{"type":23,"value":309100},"all the data and actions you need",{"type":23,"value":309102},", Unified.to supports ",{"type":17,"tag":48,"props":309104,"children":309105},{},[309106],{"type":23,"value":245662},{"type":23,"value":309108}," APIs.",{"type":17,"tag":68,"props":309110,"children":309112},{"id":309111},"why-you-might-need-both",[309113],{"type":23,"value":309114},"Why You Might Need Both",{"type":17,"tag":29,"props":309116,"children":309117},{},[309118],{"type":23,"value":309119},"While Workday is steadily improving their REST API, there are still a few important gaps. Here's why using both makes sense today:",{"type":17,"tag":6154,"props":309121,"children":309122},{},[309123,309133,309143,309153,309168],{"type":17,"tag":84,"props":309124,"children":309125},{},[309126,309131],{"type":17,"tag":48,"props":309127,"children":309128},{},[309129],{"type":23,"value":309130},"Application Creation",{"type":23,"value":309132}," — Workday's REST API does not currently support creating job applications. This is only available through the Legacy SOAP API.",{"type":17,"tag":84,"props":309134,"children":309135},{},[309136,309141],{"type":17,"tag":48,"props":309137,"children":309138},{},[309139],{"type":23,"value":309140},"Candidate Lists",{"type":23,"value":309142}," — Retrieving a full list of candidates is not yet supported in REST but is fully available through the Legacy SOAP API.",{"type":17,"tag":84,"props":309144,"children":309145},{},[309146,309151],{"type":17,"tag":48,"props":309147,"children":309148},{},[309149],{"type":23,"value":309150},"Create Job",{"type":23,"value":309152}," — Similar to applications, creating jobs still relies on the Legacy API.",{"type":17,"tag":84,"props":309154,"children":309155},{},[309156,309160,309162,309166],{"type":17,"tag":48,"props":309157,"children":309158},{},[309159],{"type":23,"value":155419},{"type":23,"value":309161}," — The REST API ",{"type":17,"tag":48,"props":309163,"children":309164},{},[309165],{"type":23,"value":228334},{"type":23,"value":309167}," support listing and downloading attachments — which the Legacy SOAP API does not.",{"type":17,"tag":84,"props":309169,"children":309170},{},[309171,309176],{"type":17,"tag":48,"props":309172,"children":309173},{},[309174],{"type":23,"value":309175},"Future Coverage",{"type":23,"value":309177}," — Workday continues to expand REST API features. As new endpoints become available, Unified.to will adopt them immediately so you always have the best option.",{"type":17,"tag":7231,"props":309179,"children":309180},{},[309181,309200],{"type":17,"tag":7235,"props":309182,"children":309183},{},[309184],{"type":17,"tag":7239,"props":309185,"children":309186},{},[309187,309190,309195],{"type":17,"tag":7243,"props":309188,"children":309189},{},[],{"type":17,"tag":7243,"props":309191,"children":309192},{},[309193],{"type":23,"value":309194},"WorkDay REST",{"type":17,"tag":7243,"props":309196,"children":309197},{},[309198],{"type":23,"value":309199},"WorkDay Legacy",{"type":17,"tag":7259,"props":309201,"children":309202},{},[309203,309218,309234,309251,309267,309284,309300,309316,309332,309347,309362,309376],{"type":17,"tag":7239,"props":309204,"children":309205},{},[309206,309211,309215],{"type":17,"tag":7266,"props":309207,"children":309208},{},[309209],{"type":23,"value":309210},"ATS Activity",{"type":17,"tag":7266,"props":309212,"children":309213},{},[309214],{"type":23,"value":145784},{"type":17,"tag":7266,"props":309216,"children":309217},{},[],{"type":17,"tag":7239,"props":309219,"children":309220},{},[309221,309226,309229],{"type":17,"tag":7266,"props":309222,"children":309223},{},[309224],{"type":23,"value":309225},"ATS Application",{"type":17,"tag":7266,"props":309227,"children":309228},{},[],{"type":17,"tag":7266,"props":309230,"children":309231},{},[309232],{"type":23,"value":309233},"List, Get, Create, Update",{"type":17,"tag":7239,"props":309235,"children":309236},{},[309237,309242,309247],{"type":17,"tag":7266,"props":309238,"children":309239},{},[309240],{"type":23,"value":309241},"ATS Candidate",{"type":17,"tag":7266,"props":309243,"children":309244},{},[309245],{"type":23,"value":309246},"Create, Get",{"type":17,"tag":7266,"props":309248,"children":309249},{},[309250],{"type":23,"value":309233},{"type":17,"tag":7239,"props":309252,"children":309253},{},[309254,309259,309264],{"type":17,"tag":7266,"props":309255,"children":309256},{},[309257],{"type":23,"value":309258},"ATS Document",{"type":17,"tag":7266,"props":309260,"children":309261},{},[309262],{"type":23,"value":309263},"List, Get, Create, Download",{"type":17,"tag":7266,"props":309265,"children":309266},{},[],{"type":17,"tag":7239,"props":309268,"children":309269},{},[309270,309275,309280],{"type":17,"tag":7266,"props":309271,"children":309272},{},[309273],{"type":23,"value":309274},"ATS Interview",{"type":17,"tag":7266,"props":309276,"children":309277},{},[309278],{"type":23,"value":309279},"List, Get",{"type":17,"tag":7266,"props":309281,"children":309282},{},[309283],{"type":23,"value":309233},{"type":17,"tag":7239,"props":309285,"children":309286},{},[309287,309292,309296],{"type":17,"tag":7266,"props":309288,"children":309289},{},[309290],{"type":23,"value":309291},"ATS Job",{"type":17,"tag":7266,"props":309293,"children":309294},{},[309295],{"type":23,"value":309279},{"type":17,"tag":7266,"props":309297,"children":309298},{},[309299],{"type":23,"value":309233},{"type":17,"tag":7239,"props":309301,"children":309302},{},[309303,309308,309312],{"type":17,"tag":7266,"props":309304,"children":309305},{},[309306],{"type":23,"value":309307},"ATS Scorecard",{"type":17,"tag":7266,"props":309309,"children":309310},{},[309311],{"type":23,"value":309279},{"type":17,"tag":7266,"props":309313,"children":309314},{},[309315],{"type":23,"value":309233},{"type":17,"tag":7239,"props":309317,"children":309318},{},[309319,309324,309328],{"type":17,"tag":7266,"props":309320,"children":309321},{},[309322],{"type":23,"value":309323},"HR Employee",{"type":17,"tag":7266,"props":309325,"children":309326},{},[309327],{"type":23,"value":309279},{"type":17,"tag":7266,"props":309329,"children":309330},{},[309331],{"type":23,"value":309233},{"type":17,"tag":7239,"props":309333,"children":309334},{},[309335,309340,309344],{"type":17,"tag":7266,"props":309336,"children":309337},{},[309338],{"type":23,"value":309339},"HR Group",{"type":17,"tag":7266,"props":309341,"children":309342},{},[309343],{"type":23,"value":309279},{"type":17,"tag":7266,"props":309345,"children":309346},{},[],{"type":17,"tag":7239,"props":309348,"children":309349},{},[309350,309355,309359],{"type":17,"tag":7266,"props":309351,"children":309352},{},[309353],{"type":23,"value":309354},"HR Timeoff",{"type":17,"tag":7266,"props":309356,"children":309357},{},[309358],{"type":23,"value":309279},{"type":17,"tag":7266,"props":309360,"children":309361},{},[],{"type":17,"tag":7239,"props":309363,"children":309364},{},[309365,309369,309373],{"type":17,"tag":7266,"props":309366,"children":309367},{},[309368],{"type":23,"value":126662},{"type":17,"tag":7266,"props":309370,"children":309371},{},[309372],{"type":23,"value":309279},{"type":17,"tag":7266,"props":309374,"children":309375},{},[],{"type":17,"tag":7239,"props":309377,"children":309378},{},[309379,309383,309387],{"type":17,"tag":7266,"props":309380,"children":309381},{},[309382],{"type":23,"value":126673},{"type":17,"tag":7266,"props":309384,"children":309385},{},[309386],{"type":23,"value":309279},{"type":17,"tag":7266,"props":309388,"children":309389},{},[],{"type":17,"tag":68,"props":309391,"children":309393},{"id":309392},"frequently-asked-questions-answers",[309394],{"type":23,"value":309395},"Frequently Asked Questions & Answers",{"type":17,"tag":29,"props":309397,"children":309398},{},[309399],{"type":17,"tag":48,"props":309400,"children":309401},{},[309402],{"type":23,"value":309403},"Question: Do I have to send XML requests for Workday Legacy?",{"type":17,"tag":29,"props":309405,"children":309406},{},[309407,309412],{"type":17,"tag":48,"props":309408,"children":309409},{},[309410],{"type":23,"value":309411},"Answer:",{"type":23,"value":309413}," No! You always send JSON requests to Unified.to. We handle the conversion to XML behind the scenes for the SOAP API.",{"type":17,"tag":29,"props":309415,"children":309416},{},[309417],{"type":17,"tag":48,"props":309418,"children":309419},{},[309420],{"type":23,"value":309421},"Question: Can I use both the REST and Legacy APIs at the same time?",{"type":17,"tag":29,"props":309423,"children":309424},{},[309425,309430],{"type":17,"tag":48,"props":309426,"children":309427},{},[309428],{"type":23,"value":309429},"A****nswer:",{"type":23,"value":309431}," Absolutely. Unified.to lets you mix and match endpoints. For example, you can fetch attachments with REST and create applications with Legacy — all through the same unified model.",{"type":17,"tag":29,"props":309433,"children":309434},{},[309435],{"type":17,"tag":48,"props":309436,"children":309437},{},[309438],{"type":23,"value":309439},"Question: Is the Workday Legacy connector going to be deprecated?",{"type":17,"tag":29,"props":309441,"children":309442},{},[309443,309447],{"type":17,"tag":48,"props":309444,"children":309445},{},[309446],{"type":23,"value":309411},{"type":23,"value":309448}," Not anytime soon. Many Workday customers still rely on SOAP endpoints for critical operations. Unified.to will continue supporting it as long as Workday does.",{"type":17,"tag":29,"props":309450,"children":309451},{},[309452],{"type":17,"tag":48,"props":309453,"children":309454},{},[309455],{"type":23,"value":309456},"Question: Is authentication different for Legacy vs REST?",{"type":17,"tag":29,"props":309458,"children":309459},{},[309460,309464,309466,309470],{"type":17,"tag":48,"props":309461,"children":309462},{},[309463],{"type":23,"value":309411},{"type":23,"value":309465}," Yes — Workday REST typically uses ",{"type":17,"tag":133,"props":309467,"children":309468},{"href":779},[309469],{"type":23,"value":782},{"type":23,"value":309471}," 2.0, while the Legacy SOAP API uses basic authentication (aka WS-Security). Unified.to handles this complexity for you.",{"type":17,"tag":29,"props":309473,"children":309474},{},[309475],{"type":17,"tag":48,"props":309476,"children":309477},{},[309478],{"type":23,"value":309479},"Question: Are the data models the same between REST and Legacy?",{"type":17,"tag":29,"props":309481,"children":309482},{},[309483,309487],{"type":17,"tag":48,"props":309484,"children":309485},{},[309486],{"type":23,"value":309411},{"type":23,"value":309488}," Yes — Unified.to normalizes the data, so you get a consistent unified schema, no matter which Workday API is behind the scenes.",{"type":17,"tag":29,"props":309490,"children":309491},{},[309492],{"type":17,"tag":48,"props":309493,"children":309494},{},[309495],{"type":23,"value":309496},"Question: Can I switch from Legacy to REST later?",{"type":17,"tag":29,"props":309498,"children":309499},{},[309500,309504],{"type":17,"tag":48,"props":309501,"children":309502},{},[309503],{"type":23,"value":309411},{"type":23,"value":309505}," Yes. As Workday expands REST support, you can migrate endpoints over time. Our team will help you adapt with minimal changes on your side.",{"type":17,"tag":29,"props":309507,"children":309508},{},[309509],{"type":17,"tag":48,"props":309510,"children":309511},{},[309512],{"type":23,"value":309513},"Question: Will using both cost more?",{"type":17,"tag":29,"props":309515,"children":309516},{},[309517,309521],{"type":17,"tag":48,"props":309518,"children":309519},{},[309520],{"type":23,"value":309411},{"type":23,"value":309522}," No — there's no extra fee for using both. You only pay for your overall Unified.to usage.",{"type":17,"tag":68,"props":309524,"children":309525},{"id":256460},[309526],{"type":23,"value":256463},{"type":17,"tag":29,"props":309528,"children":309529},{},[309530,309532,309536],{"type":23,"value":309531},"Workday is gradually moving more features to its modern REST API — but some critical workflows still require the mature SOAP-based Legacy API. To ensure you don't lose any capability, Unified.to supports ",{"type":17,"tag":48,"props":309533,"children":309534},{},[309535],{"type":23,"value":245662},{"type":23,"value":309537}," — giving you the best of both worlds.",{"type":17,"tag":29,"props":309539,"children":309540},{},[309541,309546],{"type":17,"tag":48,"props":309542,"children":309543},{},[309544],{"type":23,"value":309545},"Our recommendation:",{"type":23,"value":309547}," Use the REST API wherever possible for modern features and attachments, and rely on the Legacy API to cover any gaps (like creating jobs or applications). Unified.to handles all the complexity behind the scenes, so you can build faster with no surprises.",{"type":17,"tag":29,"props":309549,"children":309550},{},[309551],{"type":17,"tag":48,"props":309552,"children":309553},{},[309554],{"type":23,"value":309555},"Have more questions?",{"type":17,"tag":29,"props":309557,"children":309558},{},[309559],{"type":23,"value":309560},"Reach out to our support team — we're here to help you get the best out of both Workday APIs!",{"title":7,"searchDepth":1629,"depth":1629,"links":309562},[309563,309564,309565],{"id":309111,"depth":1629,"text":309114},{"id":309392,"depth":1629,"text":309395},{"id":256460,"depth":1629,"text":256463},"content:blog:workday_vs_workday_legacy_why_unified_supports_both.md","blog/workday_vs_workday_legacy_why_unified_supports_both.md","blog/workday_vs_workday_legacy_why_unified_supports_both",{"_path":309570,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":309571,"description":309572,"img":309573,"date":309574,"tag":12,"body":309575,"_type":1677,"_id":309924,"_source":1679,"_file":309925,"_stem":309926,"_extension":1682},"/blog/enhanced_security_and_control_unified_mcp_server_gets_security_upgrade","Enhanced Security and Control: Unified MCP Server Gets Security Upgrade","We're excited to announce a significant upgrade to the Unified MCP (Model Context Protocol) server that brings enhanced security controls and granular...","https://s3.us-east-2.amazonaws.com/unified-article-images/enhanced_security_and_control_unified_mcp_server_gets_security_upgrade-icon.png","2025-07-15T00:00:00.000Z",{"type":14,"children":309576,"toc":309914},[309577,309582,309585,309593,309598,309615,309621,309627,309632,309642,309659,309671,309678,309687,309692,309698,309710,309718,309727,309732,309750,309756,309761,309766,309799,309805,309810,309820,309830,309840,309850,309854,309859,309864,309867,309877,309889],{"type":17,"tag":18,"props":309578,"children":309580},{"id":309579},"enhanced-security-and-control-unified-mcp-server-gets-security-upgrade",[309581],{"type":23,"value":309571},{"type":17,"tag":25,"props":309583,"children":309584},{},[],{"type":17,"tag":29,"props":309586,"children":309587},{},[309588],{"type":17,"tag":33,"props":309589,"children":309590},{},[309591],{"type":23,"value":309592},"July 15, 2025",{"type":17,"tag":18,"props":309594,"children":309596},{"id":309595},"enhanced-security-and-control-unified-mcp-server-gets-security-upgrade-1",[309597],{"type":23,"value":309571},{"type":17,"tag":29,"props":309599,"children":309600},{},[309601,309603,309607,309609,309613],{"type":23,"value":309602},"We're excited to announce a significant upgrade to the [Unified ",{"type":17,"tag":133,"props":309604,"children":309605},{"href":326},[309606],{"type":23,"value":329},{"type":23,"value":309608},"](/mcp) (",{"type":17,"tag":133,"props":309610,"children":309611},{"href":64193},[309612],{"type":23,"value":44580},{"type":23,"value":309614},") server that brings enhanced security controls and granular permission management to your AI Agent integrations. These new features give you unprecedented control over data access and privacy when connecting any Unified connection to LLM providers.",{"type":17,"tag":68,"props":309616,"children":309618},{"id":309617},"whats-new-advanced-permission-controls",[309619],{"type":23,"value":309620},"What's New: Advanced Permission Controls",{"type":17,"tag":239,"props":309622,"children":309624},{"id":309623},"granular-data-access-management",[309625],{"type":23,"value":309626},"Granular Data Access Management",{"type":17,"tag":29,"props":309628,"children":309629},{},[309630],{"type":23,"value":309631},"The upgraded MCP server introduces sophisticated permission controls that operate at two levels:",{"type":17,"tag":29,"props":309633,"children":309634},{},[309635,309640],{"type":17,"tag":48,"props":309636,"children":309637},{},[309638],{"type":23,"value":309639},"Connection Categories and Permissions",{"type":23,"value":309641},": Each integration connection has permissions or categories set by our customers to control what access their use-case requires. This configuration is utilized to determine which tools are available in the MCP server.",{"type":17,"tag":29,"props":309643,"children":309644},{},[309645,309650,309652,309657],{"type":17,"tag":48,"props":309646,"children":309647},{},[309648],{"type":23,"value":309649},"URL Parameter Permissions",{"type":23,"value":309651},": For even finer control, you can now use the new ",{"type":17,"tag":6121,"props":309653,"children":309655},{"className":309654},[],[309656],{"type":23,"value":24204},{"type":23,"value":309658}," URL parameter to restrict access at the API level. This is particularly powerful for implementing read-only access patterns.  The values for this new parameter are the same as the unified scope permissions used to authorizing connections.",{"type":17,"tag":29,"props":309660,"children":309661},{},[309662,309664,309669],{"type":23,"value":309663},"Using the new ",{"type":17,"tag":6121,"props":309665,"children":309667},{"className":309666},[],[309668],{"type":23,"value":24204},{"type":23,"value":309670}," parameter, you can restrict your MCP server to only read existing data from the connection, preventing any write, create, update, or delete operations.",{"type":17,"tag":29,"props":309672,"children":309673},{},[309674],{"type":17,"tag":48,"props":309675,"children":309676},{},[309677],{"type":23,"value":19878},{"type":17,"tag":6893,"props":309679,"children":309682},{"className":309680,"code":309681,"language":20901,"meta":23},[20899],"https://mcp-api.unified.to/mcp?token={token}&permissions=hris_employee_read\n",[309683],{"type":17,"tag":6121,"props":309684,"children":309685},{"__ignoreMap":7},[309686],{"type":23,"value":309681},{"type":17,"tag":29,"props":309688,"children":309689},{},[309690],{"type":23,"value":309691},"This ensures that your AI agents can analyze and retrieve information without the ability to modify or create new records, providing an essential safety layer for sensitive environments.",{"type":17,"tag":239,"props":309693,"children":309695},{"id":309694},"enhanced-data-privacy-with-sensitive-data-hiding",[309696],{"type":23,"value":309697},"Enhanced Data Privacy with Sensitive Data Hiding",{"type":17,"tag":29,"props":309699,"children":309700},{},[309701,309703,309708],{"type":23,"value":309702},"Privacy protection gets a major boost with the new ",{"type":17,"tag":6121,"props":309704,"children":309706},{"className":309705},[],[309707],{"type":23,"value":131715},{"type":23,"value":309709}," parameter. This feature automatically filters out sensitive information from API responses, ensuring that confidential data never reaches your LLM providers.",{"type":17,"tag":29,"props":309711,"children":309712},{},[309713],{"type":17,"tag":48,"props":309714,"children":309715},{},[309716],{"type":23,"value":309717},"Example Usage:",{"type":17,"tag":6893,"props":309719,"children":309722},{"className":309720,"code":309721,"language":20901,"meta":23},[20899],"https://mcp-api.unified.to/mcp?token={token}&hide_sensitive=true\n",[309723],{"type":17,"tag":6121,"props":309724,"children":309725},{"__ignoreMap":7},[309726],{"type":23,"value":309721},{"type":17,"tag":29,"props":309728,"children":309729},{},[309730],{"type":23,"value":309731},"When enabled, the MCP server will:",{"type":17,"tag":80,"props":309733,"children":309734},{},[309735,309740,309745],{"type":17,"tag":84,"props":309736,"children":309737},{},[309738],{"type":23,"value":309739},"Automatically detect and remove personally identifiable information (PII)",{"type":17,"tag":84,"props":309741,"children":309742},{},[309743],{"type":23,"value":309744},"Filter out financial data, social security numbers, and other sensitive fields",{"type":17,"tag":84,"props":309746,"children":309747},{},[309748],{"type":23,"value":309749},"Can ensure compliance with data protection regulations",{"type":17,"tag":68,"props":309751,"children":309753},{"id":309752},"whats-also-new-structured-data-in-mcp-v2025-06-18",[309754],{"type":23,"value":309755},"What's Also New: Structured Data in MCP v2025-06-18",{"type":17,"tag":29,"props":309757,"children":309758},{},[309759],{"type":23,"value":309760},"Along with these new security and privacy enhancements, we've also upgraded the Unified MCP server to support the latest MCP server version (v2025-06-18), which now supports returning real 'structured' data and not just text responses.",{"type":17,"tag":29,"props":309762,"children":309763},{},[309764],{"type":23,"value":309765},"Previously, MCP servers were limited to returning plain text responses, which required LLMs to parse and interpret unstructured data. With MCP v2025-06-18, the Unified MCP server can now return properly structured data objects, including:",{"type":17,"tag":80,"props":309767,"children":309768},{},[309769,309779,309789],{"type":17,"tag":84,"props":309770,"children":309771},{},[309772,309777],{"type":17,"tag":48,"props":309773,"children":309774},{},[309775],{"type":23,"value":309776},"JSON objects",{"type":23,"value":309778}," with nested properties and arrays",{"type":17,"tag":84,"props":309780,"children":309781},{},[309782,309787],{"type":17,"tag":48,"props":309783,"children":309784},{},[309785],{"type":23,"value":309786},"Typed data fields",{"type":23,"value":309788}," that preserve data types (numbers, booleans, dates)",{"type":17,"tag":84,"props":309790,"children":309791},{},[309792,309797],{"type":17,"tag":48,"props":309793,"children":309794},{},[309795],{"type":23,"value":309796},"Relational data structures",{"type":23,"value":309798}," that maintain relationships between entities",{"type":17,"tag":239,"props":309800,"children":309802},{"id":309801},"enhanced-ai-understanding-and-performance",[309803],{"type":23,"value":309804},"Enhanced AI Understanding and Performance",{"type":17,"tag":29,"props":309806,"children":309807},{},[309808],{"type":23,"value":309809},"This structured data capability dramatically improves how AI models work with your integrated data:",{"type":17,"tag":29,"props":309811,"children":309812},{},[309813,309818],{"type":17,"tag":48,"props":309814,"children":309815},{},[309816],{"type":23,"value":309817},"Improved Accuracy",{"type":23,"value":309819},": LLMs can now directly access structured data fields without parsing text, reducing interpretation errors and improving response accuracy.",{"type":17,"tag":29,"props":309821,"children":309822},{},[309823,309828],{"type":17,"tag":48,"props":309824,"children":309825},{},[309826],{"type":23,"value":309827},"Better Performance",{"type":23,"value":309829},": Structured responses are processed faster by AI models, leading to quicker response times and more efficient API usage.",{"type":17,"tag":29,"props":309831,"children":309832},{},[309833,309838],{"type":17,"tag":48,"props":309834,"children":309835},{},[309836],{"type":23,"value":309837},"Richer Interactions",{"type":23,"value":309839},": AI agents can now perform more sophisticated operations on your data, such as sorting, filtering, and aggregating results with greater precision.",{"type":17,"tag":29,"props":309841,"children":309842},{},[309843,309848],{"type":17,"tag":48,"props":309844,"children":309845},{},[309846],{"type":23,"value":309847},"Enhanced Context",{"type":23,"value":309849},": The structured format provides LLMs with better understanding of data relationships and field meanings, leading to more intelligent responses.",{"type":17,"tag":68,"props":309851,"children":309852},{"id":297800},[309853],{"type":23,"value":297803},{"type":17,"tag":29,"props":309855,"children":309856},{},[309857],{"type":23,"value":309858},"This upgrade represents our commitment to making data integrations for AI agents both powerful and secure. We will continue to enhance the Unified MCP server with additional security features, performance improvements, and expanded integration support.",{"type":17,"tag":29,"props":309860,"children":309861},{},[309862],{"type":23,"value":309863},"The Model Context Protocol is evolving rapidly, and we're staying at the forefront of these developments to ensure our customers have access to the latest capabilities while maintaining the highest security standards.",{"type":17,"tag":25,"props":309865,"children":309866},{},[],{"type":17,"tag":29,"props":309868,"children":309869},{},[309870,309875],{"type":17,"tag":48,"props":309871,"children":309872},{},[309873],{"type":23,"value":309874},"Ready?",{"type":23,"value":309876}," The enhanced Unified MCP server is available now at the same endpoints. Simply add the new permission parameters to start taking advantage of these powerful new security features.",{"type":17,"tag":29,"props":309878,"children":309879},{},[309880,309882,309888],{"type":23,"value":309881},"For technical documentation and implementation details, visit our ",{"type":17,"tag":133,"props":309883,"children":309885},{"href":43558,"rel":309884},[214],[309886],{"type":23,"value":309887},"MCP Server documentation",{"type":23,"value":54},{"type":17,"tag":29,"props":309890,"children":309891},{},[309892,309897,309898,309908,309909],{"type":17,"tag":33,"props":309893,"children":309894},{},[309895],{"type":23,"value":309896},"Questions about implementing these new features?",{"type":23,"value":18757},{"type":17,"tag":133,"props":309899,"children":309902},{"href":309900,"rel":309901},"http://unified.to/contact",[214],[309903],{"type":17,"tag":33,"props":309904,"children":309905},{},[309906],{"type":23,"value":309907},"Contact our team",{"type":23,"value":18757},{"type":17,"tag":33,"props":309910,"children":309911},{},[309912],{"type":23,"value":309913},"for personalized guidance.",{"title":7,"searchDepth":1629,"depth":1629,"links":309915},[309916,309920,309923],{"id":309617,"depth":1629,"text":309620,"children":309917},[309918,309919],{"id":309623,"depth":1635,"text":309626},{"id":309694,"depth":1635,"text":309697},{"id":309752,"depth":1629,"text":309755,"children":309921},[309922],{"id":309801,"depth":1635,"text":309804},{"id":297800,"depth":1629,"text":297803},"content:blog:enhanced_security_and_control_unified_mcp_server_gets_security_upgrade.md","blog/enhanced_security_and_control_unified_mcp_server_gets_security_upgrade.md","blog/enhanced_security_and_control_unified_mcp_server_gets_security_upgrade",{"_path":309928,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":309929,"description":309930,"img":309931,"date":309932,"tag":12,"body":309933,"_type":1677,"_id":310394,"_source":1679,"_file":310395,"_stem":310396,"_extension":1682},"/blog/june_2025_product_updates","June 2025 product updates","This month, we added 5 new integrations and expanded support across ATS, HR, Calendar, Messaging, CRM, and E-Commerce platforms. We also shipped major...","https://s3.us-east-2.amazonaws.com/unified-article-images/june_2025_product_updates-icon.webp","2025-06-30T00:00:00.000Z",{"type":14,"children":309934,"toc":310387},[309935,309940,309943,309951,309958,309963,309968,309972,309977,310073,310085,310089,310094,310154,310158,310163,310238,310242,310253,310328,310337,310360,310365,310376],{"type":17,"tag":18,"props":309936,"children":309938},{"id":309937},"june-2025-product-updates",[309939],{"type":23,"value":309929},{"type":17,"tag":25,"props":309941,"children":309942},{},[],{"type":17,"tag":29,"props":309944,"children":309945},{},[309946],{"type":17,"tag":33,"props":309947,"children":309948},{},[309949],{"type":23,"value":309950},"June 30, 2025",{"type":17,"tag":29,"props":309952,"children":309953},{},[309954],{"type":17,"tag":6438,"props":309955,"children":309957},{"alt":266232,"src":309956},"https://s3.us-east-2.amazonaws.com/unified-article-images/june_2025_product_updates-0.png",[],{"type":17,"tag":29,"props":309959,"children":309960},{},[309961],{"type":23,"value":309962},"This month, we added 5 new integrations and expanded support across ATS, HR, Calendar, Messaging, CRM, and E-Commerce platforms. We also shipped major enhancements to webhook support, field coverage, and write methods for high-volume workflows.",{"type":17,"tag":29,"props":309964,"children":309965},{},[309966],{"type":23,"value":309967},"Unified continues to help technical teams build real-time, AI-powered SaaS—where structured, up-to-date customer data is critical to drive copilots, sync engines, and automation.",{"type":17,"tag":239,"props":309969,"children":309970},{"id":11629},[309971],{"type":23,"value":11632},{"type":17,"tag":29,"props":309973,"children":309974},{},[309975],{"type":23,"value":309976},"We launched new integrations across HR, Messaging, Task Management, and Accounting—supporting more customer systems across your product's workflows.",{"type":17,"tag":80,"props":309978,"children":309979},{},[309980,309999,310018,310036,310055],{"type":17,"tag":84,"props":309981,"children":309982},{},[309983,309992,309994,309997],{"type":17,"tag":133,"props":309984,"children":309987},{"href":309985,"rel":309986},"https://unified.to/integrations/monday",[214],[309988],{"type":17,"tag":48,"props":309989,"children":309990},{},[309991],{"type":23,"value":13293},{"type":23,"value":309993}," – HR & Directory / Task Management",{"type":17,"tag":3891,"props":309995,"children":309996},{},[],{"type":23,"value":309998},"Use case: Centralize employee directories and task assignments in product-led teams",{"type":17,"tag":84,"props":310000,"children":310001},{},[310002,310011,310013,310016],{"type":17,"tag":133,"props":310003,"children":310006},{"href":310004,"rel":310005},"https://unified.to/integrations/fireflies",[214],[310007],{"type":17,"tag":48,"props":310008,"children":310009},{},[310010],{"type":23,"value":14249},{"type":23,"value":310012}," – Calendar / HR & Directory",{"type":17,"tag":3891,"props":310014,"children":310015},{},[],{"type":23,"value":310017},"Use case: Sync voice meeting data with user profiles or AI transcription workflows",{"type":17,"tag":84,"props":310019,"children":310020},{},[310021,310029,310031,310034],{"type":17,"tag":133,"props":310022,"children":310024},{"href":239829,"rel":310023},[214],[310025],{"type":17,"tag":48,"props":310026,"children":310027},{},[310028],{"type":23,"value":155275},{"type":23,"value":310030}," – Messaging / HR / Auth",{"type":17,"tag":3891,"props":310032,"children":310033},{},[],{"type":23,"value":310035},"Use case: Enable AI assistants, HR bots, or internal automations inside Slack threads",{"type":17,"tag":84,"props":310037,"children":310038},{},[310039,310048,310050,310053],{"type":17,"tag":133,"props":310040,"children":310043},{"href":310041,"rel":310042},"https://unified.to/integrations/mercuryats",[214],[310044],{"type":17,"tag":48,"props":310045,"children":310046},{},[310047],{"type":23,"value":300783},{"type":23,"value":310049}," – ATS / HR",{"type":17,"tag":3891,"props":310051,"children":310052},{},[],{"type":23,"value":310054},"Use case: Support end-to-end hiring flows with candidate, application, and activity data",{"type":17,"tag":84,"props":310056,"children":310057},{},[310058,310067,310068,310071],{"type":17,"tag":133,"props":310059,"children":310062},{"href":310060,"rel":310061},"https://unified.to/integrations/prismhr",[214],[310063],{"type":17,"tag":48,"props":310064,"children":310065},{},[310066],{"type":23,"value":216687},{"type":23,"value":310049},{"type":17,"tag":3891,"props":310069,"children":310070},{},[],{"type":23,"value":310072},"Use case: Unlock employment and recruitment data across PEO and payroll systems",{"type":17,"tag":29,"props":310074,"children":310075},{},[310076],{"type":17,"tag":133,"props":310077,"children":310079},{"href":87026,"rel":310078},[214],[310080],{"type":17,"tag":48,"props":310081,"children":310082},{},[310083],{"type":23,"value":310084},"Explore all integrations →",{"type":17,"tag":239,"props":310086,"children":310087},{"id":278477},[310088],{"type":23,"value":300714},{"type":17,"tag":29,"props":310090,"children":310091},{},[310092],{"type":23,"value":310093},"We added native and virtual webhook support across high-volume scheduling, ATS, and E-Commerce platforms.",{"type":17,"tag":80,"props":310095,"children":310096},{},[310097,310112,310127,310136,310145],{"type":17,"tag":84,"props":310098,"children":310099},{},[310100,310104,310106,310110],{"type":17,"tag":48,"props":310101,"children":310102},{},[310103],{"type":23,"value":38865},{"type":23,"value":310105},": Native ",{"type":17,"tag":133,"props":310107,"children":310108},{"href":4999},[310109],{"type":23,"value":5002},{"type":23,"value":310111}," for Order object (created, updated, deleted)",{"type":17,"tag":84,"props":310113,"children":310114},{},[310115,310120,310121,310125],{"type":17,"tag":48,"props":310116,"children":310117},{},[310118],{"type":23,"value":310119},"JobAdder",{"type":23,"value":49318},{"type":17,"tag":133,"props":310122,"children":310123},{"href":9007},[310124],{"type":23,"value":9256},{"type":23,"value":310126}," for Document object",{"type":17,"tag":84,"props":310128,"children":310129},{},[310130,310134],{"type":17,"tag":48,"props":310131,"children":310132},{},[310133],{"type":23,"value":75326},{"type":23,"value":310135},": Virtual webhook for Candidate updates",{"type":17,"tag":84,"props":310137,"children":310138},{},[310139,310143],{"type":17,"tag":48,"props":310140,"children":310141},{},[310142],{"type":23,"value":13293},{"type":23,"value":310144},": Virtual webhooks for deleted Groups",{"type":17,"tag":84,"props":310146,"children":310147},{},[310148,310152],{"type":17,"tag":48,"props":310149,"children":310150},{},[310151],{"type":23,"value":13060},{"type":23,"value":310153},": Broad virtual webhook coverage for Company, Event, Project, Activity",{"type":17,"tag":239,"props":310155,"children":310156},{"id":300651},[310157],{"type":23,"value":300654},{"type":17,"tag":29,"props":310159,"children":310160},{},[310161],{"type":23,"value":310162},"We expanded field support across Messaging, Scheduling, CRM, and HR tools—enabling richer AI prompts, dashboards, and filters.",{"type":17,"tag":80,"props":310164,"children":310165},{},[310166,310195,310205,310228],{"type":17,"tag":84,"props":310167,"children":310168},{},[310169,310174,310176,310181,310182,310187,310188,310193],{"type":17,"tag":48,"props":310170,"children":310171},{},[310172],{"type":23,"value":310173},"Google Calendar / Outlook / Teams",{"type":23,"value":310175},": Added ",{"type":17,"tag":6121,"props":310177,"children":310179},{"className":310178},[],[310180],{"type":23,"value":74098},{"type":23,"value":11826},{"type":17,"tag":6121,"props":310183,"children":310185},{"className":310184},[],[310186],{"type":23,"value":33472},{"type":23,"value":12561},{"type":17,"tag":6121,"props":310189,"children":310191},{"className":310190},[],[310192],{"type":23,"value":165704},{"type":23,"value":310194}," fields to Event objects",{"type":17,"tag":84,"props":310196,"children":310197},{},[310198,310203],{"type":17,"tag":48,"props":310199,"children":310200},{},[310201],{"type":23,"value":310202},"Salesforce / Pipedrive / Zoho CRM / HubSpot",{"type":23,"value":310204},": Expanded pipeline and contact fields on Deal objects",{"type":17,"tag":84,"props":310206,"children":310207},{},[310208,310213,310215,310220,310221,310226],{"type":17,"tag":48,"props":310209,"children":310210},{},[310211],{"type":23,"value":310212},"Microsoft Teams / Outlook / Slack (bot)",{"type":23,"value":310214},": Added message hierarchy fields, including ",{"type":17,"tag":6121,"props":310216,"children":310218},{"className":310217},[],[310219],{"type":23,"value":15863},{"type":23,"value":11826},{"type":17,"tag":6121,"props":310222,"children":310224},{"className":310223},[],[310225],{"type":23,"value":24666},{"type":23,"value":310227},", and markdown/HTML content",{"type":17,"tag":84,"props":310229,"children":310230},{},[310231,310236],{"type":17,"tag":48,"props":310232,"children":310233},{},[310234],{"type":23,"value":310235},"TrackerRMS / Monday / BreezyHR / Walmart",{"type":23,"value":310237},": Added company_id, status, job linkage, and compensation metadata to candidates and jobs",{"type":17,"tag":239,"props":310239,"children":310240},{"id":300754},[310241],{"type":23,"value":300757},{"type":17,"tag":29,"props":310243,"children":310244},{},[310245,310247,310251],{"type":23,"value":310246},"Multiple systems now support full CRUD, ",{"type":17,"tag":133,"props":310248,"children":310249},{"href":1857},[310250],{"type":23,"value":1860},{"type":23,"value":310252},", and webhook delivery across new object types:",{"type":17,"tag":80,"props":310254,"children":310255},{},[310256,310265,310274,310283,310292,310301,310310,310319],{"type":17,"tag":84,"props":310257,"children":310258},{},[310259,310263],{"type":17,"tag":48,"props":310260,"children":310261},{},[310262],{"type":23,"value":13070},{"type":23,"value":310264},": Added 10+ new objects including Taxrate, Inventory, Refund, Subscription, and Payslip—each with full method coverage",{"type":17,"tag":84,"props":310266,"children":310267},{},[310268,310272],{"type":17,"tag":48,"props":310269,"children":310270},{},[310271],{"type":23,"value":38865},{"type":23,"value":310273},": Added Item, Inventory, and Order objects with webhook and method support",{"type":17,"tag":84,"props":310275,"children":310276},{},[310277,310281],{"type":17,"tag":48,"props":310278,"children":310279},{},[310280],{"type":23,"value":13060},{"type":23,"value":310282},": Added Company, Project, Task, Event, and Activity objects with virtual webhooks and full method support",{"type":17,"tag":84,"props":310284,"children":310285},{},[310286,310290],{"type":17,"tag":48,"props":310287,"children":310288},{},[310289],{"type":23,"value":155275},{"type":23,"value":310291},": Added Channel, Message, and Employee object support with real-time methods",{"type":17,"tag":84,"props":310293,"children":310294},{},[310295,310299],{"type":17,"tag":48,"props":310296,"children":310297},{},[310298],{"type":23,"value":13293},{"type":23,"value":310300},": Added Project, Task, and Metadata objects with full method support",{"type":17,"tag":84,"props":310302,"children":310303},{},[310304,310308],{"type":17,"tag":48,"props":310305,"children":310306},{},[310307],{"type":23,"value":300783},{"type":23,"value":310309},": Added Activity object and create/list support",{"type":17,"tag":84,"props":310311,"children":310312},{},[310313,310317],{"type":17,"tag":48,"props":310314,"children":310315},{},[310316],{"type":23,"value":310119},{"type":23,"value":310318},": Added Document object with webhook + CRUD coverage",{"type":17,"tag":84,"props":310320,"children":310321},{},[310322,310326],{"type":17,"tag":48,"props":310323,"children":310324},{},[310325],{"type":23,"value":56361},{"type":23,"value":310327},": Added Company object and related methods",{"type":17,"tag":239,"props":310329,"children":310331},{"id":310330},"integration-setup-guides",[310332],{"type":17,"tag":48,"props":310333,"children":310334},{},[310335],{"type":23,"value":310336},"Integration Setup Guides",{"type":17,"tag":80,"props":310338,"children":310339},{},[310340,310350],{"type":17,"tag":84,"props":310341,"children":310342},{},[310343],{"type":17,"tag":133,"props":310344,"children":310347},{"href":310345,"rel":310346},"https://unified.to/blog/how_to_obtain_your_github_oauth2_credentials",[214],[310348],{"type":23,"value":310349},"How to set up GitHub OAuth with Unified.to",{"type":17,"tag":84,"props":310351,"children":310352},{},[310353],{"type":17,"tag":133,"props":310354,"children":310357},{"href":310355,"rel":310356},"https://unified.to/blog/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials",[214],[310358],{"type":23,"value":310359},"How to register a Salesforce app and connect via OAuth",{"type":17,"tag":29,"props":310361,"children":310362},{},[310363],{"type":23,"value":310364},"That's a wrap for June. Whether you're powering Slack copilots, syncing HR data for AI onboarding, or pulling order updates into a CRM, Unified gives you a faster, real-time foundation to move.",{"type":17,"tag":29,"props":310366,"children":310367},{},[310368],{"type":17,"tag":133,"props":310369,"children":310371},{"href":1612,"rel":310370},[214],[310372],{"type":17,"tag":48,"props":310373,"children":310374},{},[310375],{"type":23,"value":300863},{"type":17,"tag":29,"props":310377,"children":310378},{},[310379],{"type":17,"tag":133,"props":310380,"children":310382},{"href":1623,"rel":310381},[214],[310383],{"type":17,"tag":48,"props":310384,"children":310385},{},[310386],{"type":23,"value":300875},{"title":7,"searchDepth":1629,"depth":1629,"links":310388},[310389,310390,310391,310392,310393],{"id":11629,"depth":1635,"text":11632},{"id":278477,"depth":1635,"text":300714},{"id":300651,"depth":1635,"text":300654},{"id":300754,"depth":1635,"text":300757},{"id":310330,"depth":1635,"text":310336},"content:blog:june_2025_product_updates.md","blog/june_2025_product_updates.md","blog/june_2025_product_updates",{"_path":310398,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":310399,"description":310400,"img":310401,"date":310402,"tag":12,"body":310403,"_type":1677,"_id":311199,"_source":1679,"_file":311200,"_stem":311201,"_extension":1682},"/blog/arcade_dev_vs_unified_which_integration_platform_powers_ai_driven_saas_better","Arcade.dev vs Unified.to: which integration platform powers AI-driven SaaS better?","Arcade.dev and Unified.to serve different roles in AI integration architecture. Arcade.dev enables agents to perform actions across tools, while Unified.to...","https://s3.us-east-2.amazonaws.com/unified-article-images/arcade_dev_vs_unified_which_integration_platform_powers_ai_driven_saas_better-icon.webp","2025-06-15T00:00:00.000Z",{"type":14,"children":310404,"toc":311179},[310405,310410,310413,310421,310429,310437,310442,310447,310451,310484,310490,310498,310516,310524,310547,310556,310561,310569,310597,310602,310608,310613,310624,310630,310742,310748,310753,310783,310789,310794,310804,310810,310821,310833,310839,310844,310849,310855,310860,310874,311090,311098,311103,311107,311135,311157,311163,311168,311174],{"type":17,"tag":18,"props":310406,"children":310408},{"id":310407},"arcadedev-vs-unifiedto-which-integration-platform-powers-ai-driven-saas-better",[310409],{"type":23,"value":310399},{"type":17,"tag":25,"props":310411,"children":310412},{},[],{"type":17,"tag":29,"props":310414,"children":310415},{},[310416],{"type":17,"tag":33,"props":310417,"children":310418},{},[310419],{"type":23,"value":310420},"June 15, 2025",{"type":17,"tag":29,"props":310422,"children":310423},{},[310424],{"type":17,"tag":6438,"props":310425,"children":310428},{"alt":310426,"src":310427},"arcade.png","https://s3.us-east-2.amazonaws.com/unified-article-images/arcade_dev_vs_unified_which_integration_platform_powers_ai_driven_saas_better-0.png",[],{"type":17,"tag":29,"props":310430,"children":310431},{},[310432],{"type":17,"tag":33,"props":310433,"children":310434},{},[310435],{"type":23,"value":310436},"Updated March 2026",{"type":17,"tag":29,"props":310438,"children":310439},{},[310440],{"type":23,"value":310441},"Arcade.dev and Unified.to serve different roles in AI integration architecture. Arcade.dev enables agents to perform actions across tools, while Unified.to provides real-time access to structured data across integrations, designed for applications that require consistent schemas and data pipelines.",{"type":17,"tag":29,"props":310443,"children":310444},{},[310445],{"type":23,"value":310446},"Arcade.dev is designed for AI agents that execute actions across integrations. This comparison explains how Arcade.dev and Unified.to differ in data delivery, schema design, and how each platform fits into production systems.",{"type":17,"tag":239,"props":310448,"children":310449},{"id":243535},[310450],{"type":23,"value":217887},{"type":17,"tag":80,"props":310452,"children":310453},{},[310454,310459,310464,310469,310474,310479],{"type":17,"tag":84,"props":310455,"children":310456},{},[310457],{"type":23,"value":310458},"Arcade.dev is designed for AI agents that perform actions (e.g. send email, create events)",{"type":17,"tag":84,"props":310460,"children":310461},{},[310462],{"type":23,"value":310463},"Unified.to is designed for SaaS products that need real-time, structured data across integrations",{"type":17,"tag":84,"props":310465,"children":310466},{},[310467],{"type":23,"value":310468},"Arcade uses per-tool actions with no shared schema",{"type":17,"tag":84,"props":310470,"children":310471},{},[310472],{"type":23,"value":310473},"Unified provides normalized objects (e.g. Contact, Job, Invoice) across 415+ integrations",{"type":17,"tag":84,"props":310475,"children":310476},{},[310477],{"type":23,"value":310478},"Arcade is best for copilots and assistants",{"type":17,"tag":84,"props":310480,"children":310481},{},[310482],{"type":23,"value":310483},"Unified is best for AI features, data pipelines, and product integrations at scale",{"type":17,"tag":239,"props":310485,"children":310487},{"id":310486},"when-to-choose-arcadedev-vs-unifiedto",[310488],{"type":23,"value":310489},"When to choose Arcade.dev vs Unified.to",{"type":17,"tag":29,"props":310491,"children":310492},{},[310493],{"type":17,"tag":48,"props":310494,"children":310495},{},[310496],{"type":23,"value":310497},"Choose Arcade.dev if:",{"type":17,"tag":80,"props":310499,"children":310500},{},[310501,310506,310511],{"type":17,"tag":84,"props":310502,"children":310503},{},[310504],{"type":23,"value":310505},"You are building AI agents or copilots that perform actions",{"type":17,"tag":84,"props":310507,"children":310508},{},[310509],{"type":23,"value":310510},"Your workflows depend on tool execution (e.g. send email, create event)",{"type":17,"tag":84,"props":310512,"children":310513},{},[310514],{"type":23,"value":310515},"You want prebuilt action interfaces for LLM tool-calling",{"type":17,"tag":29,"props":310517,"children":310518},{},[310519],{"type":17,"tag":48,"props":310520,"children":310521},{},[310522],{"type":23,"value":310523},"Choose Unified.to if:",{"type":17,"tag":80,"props":310525,"children":310526},{},[310527,310532,310537,310542],{"type":17,"tag":84,"props":310528,"children":310529},{},[310530],{"type":23,"value":310531},"Your product depends on structured data across SaaS systems",{"type":17,"tag":84,"props":310533,"children":310534},{},[310535],{"type":23,"value":310536},"You need real-time updates delivered from source APIs",{"type":17,"tag":84,"props":310538,"children":310539},{},[310540],{"type":23,"value":310541},"You are building AI features that rely on consistent, normalized data",{"type":17,"tag":84,"props":310543,"children":310544},{},[310545],{"type":23,"value":310546},"You want to persist and query integration data in your own infrastructure",{"type":17,"tag":68,"props":310548,"children":310550},{"id":310549},"how-does-arcadedev-compare-to-unifiedto",[310551],{"type":17,"tag":48,"props":310552,"children":310553},{},[310554],{"type":23,"value":310555},"How does Arcade.dev compare to Unified.to?",{"type":17,"tag":29,"props":310557,"children":310558},{},[310559],{"type":23,"value":310560},"Arcade.dev focuses on tool-calling for AI agents. Unified.to powers live data pipelines and structured integrations across your SaaS product.",{"type":17,"tag":29,"props":310562,"children":310563},{},[310564],{"type":17,"tag":48,"props":310565,"children":310566},{},[310567],{"type":23,"value":310568},"Unified.to gives you:",{"type":17,"tag":80,"props":310570,"children":310571},{},[310572,310577,310582,310587,310592],{"type":17,"tag":84,"props":310573,"children":310574},{},[310575],{"type":23,"value":310576},"Real-time updates from 415+ integrations",{"type":17,"tag":84,"props":310578,"children":310579},{},[310580],{"type":23,"value":310581},"Unified schemas with passthrough support",{"type":17,"tag":84,"props":310583,"children":310584},{},[310585],{"type":23,"value":310586},"Database-ready delivery for AI pipelines and dashboards",{"type":17,"tag":84,"props":310588,"children":310589},{},[310590],{"type":23,"value":310591},"Zero data stored—tokens, payloads, or logs",{"type":17,"tag":84,"props":310593,"children":310594},{},[310595],{"type":23,"value":310596},"Developer-first SDKs and auth components",{"type":17,"tag":29,"props":310598,"children":310599},{},[310600],{"type":23,"value":310601},"Here's how the two platforms compare, especially if you're building real-time AI features or integrations at scale.",{"type":17,"tag":68,"props":310603,"children":310605},{"id":310604},"streaming-vs-single-use-calls",[310606],{"type":23,"value":310607},"Streaming vs single-use calls",{"type":17,"tag":29,"props":310609,"children":310610},{},[310611],{"type":23,"value":310612},"Arcade.dev performs on-demand API calls when an agent executes an action. It does not provide built-in data synchronization or event-driven updates. Developers must manage scheduling or polling if freshness is required.",{"type":17,"tag":29,"props":310614,"children":310615},{},[310616,310618,310622],{"type":23,"value":310617},"Unified.to delivers updates using native and [virtual ",{"type":17,"tag":133,"props":310619,"children":310620},{"href":4999},[310621],{"type":23,"value":5002},{"type":23,"value":310623},"](/blog/unlock_real_time_data_with_virtual_webhooks), with data retrieved directly from source APIs instead of relying on scheduled polling. Data flows in real time to your backend or database—no cron jobs or manual refresh logic needed.",{"type":17,"tag":239,"props":310625,"children":310627},{"id":310626},"data-architecture-differences",[310628],{"type":23,"value":310629},"Data architecture differences",{"type":17,"tag":7231,"props":310631,"children":310632},{},[310633,310652],{"type":17,"tag":7235,"props":310634,"children":310635},{},[310636],{"type":17,"tag":7239,"props":310637,"children":310638},{},[310639,310643,310648],{"type":17,"tag":7243,"props":310640,"children":310641},{},[310642],{"type":23,"value":98853},{"type":17,"tag":7243,"props":310644,"children":310645},{},[310646],{"type":23,"value":310647},"Arcade.dev",{"type":17,"tag":7243,"props":310649,"children":310650},{},[310651],{"type":23,"value":217},{"type":17,"tag":7259,"props":310653,"children":310654},{},[310655,310673,310689,310706,310724],{"type":17,"tag":7239,"props":310656,"children":310657},{},[310658,310663,310668],{"type":17,"tag":7266,"props":310659,"children":310660},{},[310661],{"type":23,"value":310662},"Primary model",{"type":17,"tag":7266,"props":310664,"children":310665},{},[310666],{"type":23,"value":310667},"Action-based tool calls",{"type":17,"tag":7266,"props":310669,"children":310670},{},[310671],{"type":23,"value":310672},"Structured data access",{"type":17,"tag":7239,"props":310674,"children":310675},{},[310676,310680,310685],{"type":17,"tag":7266,"props":310677,"children":310678},{},[310679],{"type":23,"value":244583},{"type":17,"tag":7266,"props":310681,"children":310682},{},[310683],{"type":23,"value":310684},"On-demand API calls",{"type":17,"tag":7266,"props":310686,"children":310687},{},[310688],{"type":23,"value":87601},{"type":17,"tag":7239,"props":310690,"children":310691},{},[310692,310696,310701],{"type":17,"tag":7266,"props":310693,"children":310694},{},[310695],{"type":23,"value":292641},{"type":17,"tag":7266,"props":310697,"children":310698},{},[310699],{"type":23,"value":310700},"Per-tool outputs",{"type":17,"tag":7266,"props":310702,"children":310703},{},[310704],{"type":23,"value":310705},"Unified schemas across domains",{"type":17,"tag":7239,"props":310707,"children":310708},{},[310709,310714,310719],{"type":17,"tag":7266,"props":310710,"children":310711},{},[310712],{"type":23,"value":310713},"Data pipelines",{"type":17,"tag":7266,"props":310715,"children":310716},{},[310717],{"type":23,"value":310718},"Not built-in",{"type":17,"tag":7266,"props":310720,"children":310721},{},[310722],{"type":23,"value":310723},"API, webhooks, or database sync",{"type":17,"tag":7239,"props":310725,"children":310726},{},[310727,310732,310737],{"type":17,"tag":7266,"props":310728,"children":310729},{},[310730],{"type":23,"value":310731},"Data persistence",{"type":17,"tag":7266,"props":310733,"children":310734},{},[310735],{"type":23,"value":310736},"Developer-managed",{"type":17,"tag":7266,"props":310738,"children":310739},{},[310740],{"type":23,"value":310741},"Delivered for storage in your DB",{"type":17,"tag":68,"props":310743,"children":310745},{"id":310744},"tool-actions-vs-normalized-data",[310746],{"type":23,"value":310747},"Tool actions vs normalized data",{"type":17,"tag":29,"props":310749,"children":310750},{},[310751],{"type":23,"value":310752},"Arcade exposes each integration as a set of tools. One for Gmail, another for HubSpot, etc. There's no shared schema or consistent object model across platforms. Developers must handle different response formats across integrations.",{"type":17,"tag":29,"props":310754,"children":310755},{},[310756,310758,310763,310764,310769,310770,310775,310776,310781],{"type":23,"value":310757},"Unified.to maps each domain (e.g. ",{"type":17,"tag":6121,"props":310759,"children":310761},{"className":310760},[],[310762],{"type":23,"value":25828},{"type":23,"value":11826},{"type":17,"tag":6121,"props":310765,"children":310767},{"className":310766},[],[310768],{"type":23,"value":240137},{"type":23,"value":11826},{"type":17,"tag":6121,"props":310771,"children":310773},{"className":310772},[],[310774],{"type":23,"value":61210},{"type":23,"value":11826},{"type":17,"tag":6121,"props":310777,"children":310779},{"className":310778},[],[310780],{"type":23,"value":71559},{"type":23,"value":310782},") to a shared schema. You get structured, normalized data no matter which system the customer connects. No need to parse dozens of API variations.",{"type":17,"tag":68,"props":310784,"children":310786},{"id":310785},"structured-pipelines-not-single-responses",[310787],{"type":23,"value":310788},"Structured pipelines, not single responses",{"type":17,"tag":29,"props":310790,"children":310791},{},[310792],{"type":23,"value":310793},"Arcade returns data at call time. There's no built-in support for change data capture, log streaming, or syncing data to a database. Developers must build those layers themselves.",{"type":17,"tag":29,"props":310795,"children":310796},{},[310797,310802],{"type":17,"tag":133,"props":310798,"children":310800},{"href":42620,"rel":310799},[214],[310801],{"type":23,"value":217},{"type":23,"value":310803}," delivers structured records through webhooks or API reads, allowing teams to persist data in their own database (e.g. Postgres, MongoDB, Snowflake) without building ingestion pipelines.",{"type":17,"tag":68,"props":310805,"children":310807},{"id":310806},"hosted-vs-customer-controlled",[310808],{"type":23,"value":310809},"Hosted vs customer-controlled",{"type":17,"tag":29,"props":310811,"children":310812},{},[310813,310815,310819],{"type":23,"value":310814},"Arcade manages token storage by default. Some integrations allow you to bring your own ",{"type":17,"tag":133,"props":310816,"children":310817},{"href":779},[310818],{"type":23,"value":782},{"type":23,"value":310820}," credentials. Self-hosting is available for high-security use cases.",{"type":17,"tag":29,"props":310822,"children":310823},{},[310824,310826,310831],{"type":23,"value":310825},"Unified.to never stores tokens or secrets by default. You can use your own AWS Secrets Manager to manage credentials. ",{"type":17,"tag":133,"props":310827,"children":310829},{"href":42620,"rel":310828},[214],[310830],{"type":23,"value":217},{"type":23,"value":310832}," routes authorized requests directly to the source API and does not store payloads, tokens, or logs.",{"type":17,"tag":68,"props":310834,"children":310836},{"id":310835},"ai-agent-focus-vs-integration-infrastructure",[310837],{"type":23,"value":310838},"AI agent focus vs integration infrastructure",{"type":17,"tag":29,"props":310840,"children":310841},{},[310842],{"type":23,"value":310843},"Arcade offers SDKs in Python and Node.js, with quickstarts for building Slack bots, Gmail assistants, and OpenAI-integrated workflows. Each integration is open source, but action-specific.",{"type":17,"tag":29,"props":310845,"children":310846},{},[310847],{"type":23,"value":310848},"Unified.to provides SDKs in 7+ languages, plus drop-in auth components and an Integration Directory UI. Everything works against one schema, one Connect flow, and one webhook model—making it easy to scale integrations across categories.",{"type":17,"tag":239,"props":310850,"children":310852},{"id":310851},"what-is-the-difference-between-agent-actions-and-data-pipelines",[310853],{"type":23,"value":310854},"What is the difference between agent actions and data pipelines?",{"type":17,"tag":29,"props":310856,"children":310857},{},[310858],{"type":23,"value":310859},"Agent actions allow AI systems to perform operations in external tools, such as sending messages or updating records. Data pipelines provide structured, continuously updated data that can be stored, queried, and used across applications. Actions enable execution, while pipelines enable consistent data access.",{"type":17,"tag":68,"props":310861,"children":310863},{"id":310862},"unifiedto-vs-arcadedev-breakdown",[310864,310866,310872],{"type":23,"value":310865},"Unified.to vs ",{"type":17,"tag":133,"props":310867,"children":310870},{"href":310868,"rel":310869},"http://arcade.dev/",[214],[310871],{"type":23,"value":310647},{"type":23,"value":310873}," breakdown",{"type":17,"tag":7231,"props":310875,"children":310876},{},[310877,310904],{"type":17,"tag":7235,"props":310878,"children":310879},{},[310880],{"type":17,"tag":7239,"props":310881,"children":310882},{},[310883,310890,310897],{"type":17,"tag":7243,"props":310884,"children":310885},{},[310886],{"type":17,"tag":48,"props":310887,"children":310888},{},[310889],{"type":23,"value":87518},{"type":17,"tag":7243,"props":310891,"children":310892},{},[310893],{"type":17,"tag":48,"props":310894,"children":310895},{},[310896],{"type":23,"value":217},{"type":17,"tag":7243,"props":310898,"children":310899},{},[310900],{"type":17,"tag":48,"props":310901,"children":310902},{},[310903],{"type":23,"value":310647},{"type":17,"tag":7259,"props":310905,"children":310906},{},[310907,310928,310948,310969,310990,311010,311030,311050,311070],{"type":17,"tag":7239,"props":310908,"children":310909},{},[310910,310918,310923],{"type":17,"tag":7266,"props":310911,"children":310912},{},[310913],{"type":17,"tag":48,"props":310914,"children":310915},{},[310916],{"type":23,"value":310917},"Delivery model",{"type":17,"tag":7266,"props":310919,"children":310920},{},[310921],{"type":23,"value":310922},"Real-time streaming via webhooks",{"type":17,"tag":7266,"props":310924,"children":310925},{},[310926],{"type":23,"value":310927},"On-demand API calls, no data sync",{"type":17,"tag":7239,"props":310929,"children":310930},{},[310931,310938,310943],{"type":17,"tag":7266,"props":310932,"children":310933},{},[310934],{"type":17,"tag":48,"props":310935,"children":310936},{},[310937],{"type":23,"value":292641},{"type":17,"tag":7266,"props":310939,"children":310940},{},[310941],{"type":23,"value":310942},"Unified across 415+ APIs",{"type":17,"tag":7266,"props":310944,"children":310945},{},[310946],{"type":23,"value":310947},"Per-connector tool schemas",{"type":17,"tag":7239,"props":310949,"children":310950},{},[310951,310959,310964],{"type":17,"tag":7266,"props":310952,"children":310953},{},[310954],{"type":17,"tag":48,"props":310955,"children":310956},{},[310957],{"type":23,"value":310958},"Database delivery",{"type":17,"tag":7266,"props":310960,"children":310961},{},[310962],{"type":23,"value":310963},"Native support for Postgres, Mongo, Snowflake, etc.",{"type":17,"tag":7266,"props":310965,"children":310966},{},[310967],{"type":23,"value":310968},"No built-in sync",{"type":17,"tag":7239,"props":310970,"children":310971},{},[310972,310980,310985],{"type":17,"tag":7266,"props":310973,"children":310974},{},[310975],{"type":17,"tag":48,"props":310976,"children":310977},{},[310978],{"type":23,"value":310979},"Token storage",{"type":17,"tag":7266,"props":310981,"children":310982},{},[310983],{"type":23,"value":310984},"None by default (BYO Secrets Manager supported)",{"type":17,"tag":7266,"props":310986,"children":310987},{},[310988],{"type":23,"value":310989},"Stored in Arcade Cloud unless self-hosted",{"type":17,"tag":7239,"props":310991,"children":310992},{},[310993,311000,311005],{"type":17,"tag":7266,"props":310994,"children":310995},{},[310996],{"type":17,"tag":48,"props":310997,"children":310998},{},[310999],{"type":23,"value":69408},{"type":17,"tag":7266,"props":311001,"children":311002},{},[311003],{"type":23,"value":311004},"Zero—no caching, logs, or customer data stored",{"type":17,"tag":7266,"props":311006,"children":311007},{},[311008],{"type":23,"value":311009},"No data caching, but calls routed through Arcade servers",{"type":17,"tag":7239,"props":311011,"children":311012},{},[311013,311020,311025],{"type":17,"tag":7266,"props":311014,"children":311015},{},[311016],{"type":17,"tag":48,"props":311017,"children":311018},{},[311019],{"type":23,"value":267529},{"type":17,"tag":7266,"props":311021,"children":311022},{},[311023],{"type":23,"value":311024},"Unified SDKs, auth component, real-time logs",{"type":17,"tag":7266,"props":311026,"children":311027},{},[311028],{"type":23,"value":311029},"Per-tool SDKs, OpenAI function calling",{"type":17,"tag":7239,"props":311031,"children":311032},{},[311033,311040,311045],{"type":17,"tag":7266,"props":311034,"children":311035},{},[311036],{"type":17,"tag":48,"props":311037,"children":311038},{},[311039],{"type":23,"value":69493},{"type":17,"tag":7266,"props":311041,"children":311042},{},[311043],{"type":23,"value":311044},"Structured data for RAG, analytics, and ML",{"type":17,"tag":7266,"props":311046,"children":311047},{},[311048],{"type":23,"value":311049},"Action-based tool calls for agents",{"type":17,"tag":7239,"props":311051,"children":311052},{},[311053,311060,311065],{"type":17,"tag":7266,"props":311054,"children":311055},{},[311056],{"type":17,"tag":48,"props":311057,"children":311058},{},[311059],{"type":23,"value":292743},{"type":17,"tag":7266,"props":311061,"children":311062},{},[311063],{"type":23,"value":311064},"Usage-based tiers, all features included",{"type":17,"tag":7266,"props":311066,"children":311067},{},[311068],{"type":23,"value":311069},"User + call based, with free tier",{"type":17,"tag":7239,"props":311071,"children":311072},{},[311073,311080,311085],{"type":17,"tag":7266,"props":311074,"children":311075},{},[311076],{"type":17,"tag":48,"props":311077,"children":311078},{},[311079],{"type":23,"value":502},{"type":17,"tag":7266,"props":311081,"children":311082},{},[311083],{"type":23,"value":311084},"SaaS platforms building AI-ready integrations and data pipelines",{"type":17,"tag":7266,"props":311086,"children":311087},{},[311088],{"type":23,"value":311089},"AI copilots and agents needing tool access",{"type":17,"tag":29,"props":311091,"children":311092},{},[311093],{"type":17,"tag":48,"props":311094,"children":311095},{},[311096],{"type":23,"value":311097},"Unified.to gives you real-time data, normalized schemas, and full control—no polling, no storage, no vendor lock-in.",{"type":17,"tag":29,"props":311099,"children":311100},{},[311101],{"type":23,"value":311102},"If you're building a product that needs structured, fresh data across CRMs, HR, ATS, or storage platforms, Unified.to is the better foundation.",{"type":17,"tag":239,"props":311104,"children":311105},{"id":7672},[311106],{"type":23,"value":7675},{"type":17,"tag":80,"props":311108,"children":311109},{},[311110,311115,311120,311125,311130],{"type":17,"tag":84,"props":311111,"children":311112},{},[311113],{"type":23,"value":311114},"Arcade.dev focuses on action-based tool execution for AI agents",{"type":17,"tag":84,"props":311116,"children":311117},{},[311118],{"type":23,"value":311119},"Unified.to provides real-time access to structured data across integrations",{"type":17,"tag":84,"props":311121,"children":311122},{},[311123],{"type":23,"value":311124},"Action-based systems execute tasks but do not provide persistent data pipelines",{"type":17,"tag":84,"props":311126,"children":311127},{},[311128],{"type":23,"value":311129},"Structured data pipelines are required for analytics, dashboards, and AI features",{"type":17,"tag":84,"props":311131,"children":311132},{},[311133],{"type":23,"value":311134},"Unified.to supports multi-system data access with consistent schemas",{"type":17,"tag":29,"props":311136,"children":311137},{},[311138,311146,311147,311155],{"type":17,"tag":133,"props":311139,"children":311141},{"href":1612,"rel":311140},[214],[311142],{"type":17,"tag":48,"props":311143,"children":311144},{},[311145],{"type":23,"value":1616},{"type":23,"value":75890},{"type":17,"tag":133,"props":311148,"children":311150},{"href":1623,"rel":311149},[214],[311151],{"type":17,"tag":48,"props":311152,"children":311153},{},[311154],{"type":23,"value":226481},{"type":23,"value":311156}," to explore how fast you can ship real-time integrations at scale.",{"type":17,"tag":239,"props":311158,"children":311160},{"id":311159},"what-is-arcadedev",[311161],{"type":23,"value":311162},"What is Arcade.dev?",{"type":17,"tag":29,"props":311164,"children":311165},{},[311166],{"type":23,"value":311167},"Arcade.dev is an integration layer for AI agents that provides tool-based access to third-party APIs, allowing agents to perform actions like sending messages or retrieving data from external platforms.",{"type":17,"tag":239,"props":311169,"children":311171},{"id":311170},"what-is-unifiedto",[311172],{"type":23,"value":311173},"What is Unified.to?",{"type":17,"tag":29,"props":311175,"children":311176},{},[311177],{"type":23,"value":311178},"Unified.to is integration infrastructure that provides real-time, pass-through access to third-party APIs using normalized schemas, enabling SaaS products to retrieve and use structured data across multiple integrations without storing customer data.",{"title":7,"searchDepth":1629,"depth":1629,"links":311180},[311181,311182,311183,311184,311187,311188,311189,311190,311193],{"id":243535,"depth":1635,"text":217887},{"id":310486,"depth":1635,"text":310489},{"id":310549,"depth":1629,"text":310555},{"id":310604,"depth":1629,"text":310607,"children":311185},[311186],{"id":310626,"depth":1635,"text":310629},{"id":310744,"depth":1629,"text":310747},{"id":310785,"depth":1629,"text":310788},{"id":310806,"depth":1629,"text":310809},{"id":310835,"depth":1629,"text":310838,"children":311191},[311192],{"id":310851,"depth":1635,"text":310854},{"id":310862,"depth":1629,"text":311194,"children":311195},"Unified.to vs Arcade.dev breakdown",[311196,311197,311198],{"id":7672,"depth":1635,"text":7675},{"id":311159,"depth":1635,"text":311162},{"id":311170,"depth":1635,"text":311173},"content:blog:arcade_dev_vs_unified_which_integration_platform_powers_ai_driven_saas_better.md","blog/arcade_dev_vs_unified_which_integration_platform_powers_ai_driven_saas_better.md","blog/arcade_dev_vs_unified_which_integration_platform_powers_ai_driven_saas_better",{"_path":311203,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":311204,"description":311205,"img":311206,"date":310402,"tag":12,"body":311207,"_type":1677,"_id":312076,"_source":1679,"_file":312077,"_stem":312078,"_extension":1682},"/blog/composio_vs_unified_which_platform_powers_real_time_saas_integrations_better","Composio vs. Unified.to: which platform powers real-time SaaS integrations better?","Composio and Unified.to serve different roles in AI integration architecture. Composio enables agents to perform actions across tools, while Unified.to...","https://s3.us-east-2.amazonaws.com/unified-article-images/composio_vs_unified_which_platform_powers_real_time_saas_integrations_better-icon.webp",{"type":14,"children":311208,"toc":312059},[311209,311214,311217,311224,311232,311239,311244,311249,311255,311463,311469,311477,311494,311501,311521,311530,311535,311540,311580,311585,311591,311596,311601,311605,311705,311711,311716,311721,311725,311743,311749,311754,311759,311765,311770,311775,311781,311786,311791,311796,311802,311807,311825,311833,311856,311861,311867,311872,311878,311923,311928,311936,311954,311962,311980,312004,312008,312033,312043],{"type":17,"tag":18,"props":311210,"children":311212},{"id":311211},"composio-vs-unifiedto-which-platform-powers-real-time-saas-integrations-better",[311213],{"type":23,"value":311204},{"type":17,"tag":25,"props":311215,"children":311216},{},[],{"type":17,"tag":29,"props":311218,"children":311219},{},[311220],{"type":17,"tag":33,"props":311221,"children":311222},{},[311223],{"type":23,"value":310420},{"type":17,"tag":29,"props":311225,"children":311226},{},[311227],{"type":17,"tag":6438,"props":311228,"children":311231},{"alt":311229,"src":311230},"composio.png","https://s3.us-east-2.amazonaws.com/unified-article-images/composio_vs_unified_which_platform_powers_real_time_saas_integrations_better-0.png",[],{"type":17,"tag":29,"props":311233,"children":311234},{},[311235],{"type":17,"tag":33,"props":311236,"children":311237},{},[311238],{"type":23,"value":310436},{"type":17,"tag":29,"props":311240,"children":311241},{},[311242],{"type":23,"value":311243},"Composio and Unified.to serve different roles in AI integration architecture. Composio enables agents to perform actions across tools, while Unified.to provides real-time access to structured data across integrations, designed for applications that require consistent schemas and data pipelines.",{"type":17,"tag":29,"props":311245,"children":311246},{},[311247],{"type":23,"value":311248},"Composio is designed for AI agents that execute actions across integrations. This comparison explains how Composio and Unified.to differ in data delivery, schema design, and how each platform fits into production systems.",{"type":17,"tag":239,"props":311250,"children":311252},{"id":311251},"tldr-unifiedto-vs-composio",[311253],{"type":23,"value":311254},"TL;DR: Unified.to vs Composio",{"type":17,"tag":7231,"props":311256,"children":311257},{},[311258,311276],{"type":17,"tag":7235,"props":311259,"children":311260},{},[311261],{"type":17,"tag":7239,"props":311262,"children":311263},{},[311264,311268,311272],{"type":17,"tag":7243,"props":311265,"children":311266},{},[311267],{"type":23,"value":87518},{"type":17,"tag":7243,"props":311269,"children":311270},{},[311271],{"type":23,"value":217},{"type":17,"tag":7243,"props":311273,"children":311274},{},[311275],{"type":23,"value":1015},{"type":17,"tag":7259,"props":311277,"children":311278},{},[311279,311299,311320,311341,311362,311381,311401,311422,311442],{"type":17,"tag":7239,"props":311280,"children":311281},{},[311282,311289,311294],{"type":17,"tag":7266,"props":311283,"children":311284},{},[311285],{"type":17,"tag":48,"props":311286,"children":311287},{},[311288],{"type":23,"value":87652},{"type":17,"tag":7266,"props":311290,"children":311291},{},[311292],{"type":23,"value":311293},"Real-time SaaS integrations",{"type":17,"tag":7266,"props":311295,"children":311296},{},[311297],{"type":23,"value":311298},"AI agent tool-calling",{"type":17,"tag":7239,"props":311300,"children":311301},{},[311302,311310,311315],{"type":17,"tag":7266,"props":311303,"children":311304},{},[311305],{"type":17,"tag":48,"props":311306,"children":311307},{},[311308],{"type":23,"value":311309},"Integration schema",{"type":17,"tag":7266,"props":311311,"children":311312},{},[311313],{"type":23,"value":311314},"Normalized schemas across 25+ app categories",{"type":17,"tag":7266,"props":311316,"children":311317},{},[311318],{"type":23,"value":311319},"Native API formats per tool",{"type":17,"tag":7239,"props":311321,"children":311322},{},[311323,311331,311336],{"type":17,"tag":7266,"props":311324,"children":311325},{},[311326],{"type":17,"tag":48,"props":311327,"children":311328},{},[311329],{"type":23,"value":311330},"Real-time support",{"type":17,"tag":7266,"props":311332,"children":311333},{},[311334],{"type":23,"value":311335},"Native + virtual webhooks + DB sync",{"type":17,"tag":7266,"props":311337,"children":311338},{},[311339],{"type":23,"value":311340},"Webhooks (if available), no managed polling",{"type":17,"tag":7239,"props":311342,"children":311343},{},[311344,311352,311357],{"type":17,"tag":7266,"props":311345,"children":311346},{},[311347],{"type":17,"tag":48,"props":311348,"children":311349},{},[311350],{"type":23,"value":311351},"OAuth handling",{"type":17,"tag":7266,"props":311353,"children":311354},{},[311355],{"type":23,"value":311356},"BYO credentials or BYO vault (AWS Secrets)",{"type":17,"tag":7266,"props":311358,"children":311359},{},[311360],{"type":23,"value":311361},"Managed credentials stored in Composio cloud",{"type":17,"tag":7239,"props":311363,"children":311364},{},[311365,311372,311376],{"type":17,"tag":7266,"props":311366,"children":311367},{},[311368],{"type":17,"tag":48,"props":311369,"children":311370},{},[311371],{"type":23,"value":69408},{"type":17,"tag":7266,"props":311373,"children":311374},{},[311375],{"type":23,"value":17067},{"type":17,"tag":7266,"props":311377,"children":311378},{},[311379],{"type":23,"value":311380},"Stores tokens, logs, and event data",{"type":17,"tag":7239,"props":311382,"children":311383},{},[311384,311391,311396],{"type":17,"tag":7266,"props":311385,"children":311386},{},[311387],{"type":17,"tag":48,"props":311388,"children":311389},{},[311390],{"type":23,"value":69493},{"type":17,"tag":7266,"props":311392,"children":311393},{},[311394],{"type":23,"value":311395},"Structured, model-ready data for RAG/ML",{"type":17,"tag":7266,"props":311397,"children":311398},{},[311399],{"type":23,"value":311400},"Native function-calling, MCP server for agents",{"type":17,"tag":7239,"props":311402,"children":311403},{},[311404,311412,311417],{"type":17,"tag":7266,"props":311405,"children":311406},{},[311407],{"type":17,"tag":48,"props":311408,"children":311409},{},[311410],{"type":23,"value":311411},"Extensibility",{"type":17,"tag":7266,"props":311413,"children":311414},{},[311415],{"type":23,"value":311416},"Passthrough API + request new integrations",{"type":17,"tag":7266,"props":311418,"children":311419},{},[311420],{"type":23,"value":311421},"Add your own tools, decorate functions for LLM use",{"type":17,"tag":7239,"props":311423,"children":311424},{},[311425,311432,311437],{"type":17,"tag":7266,"props":311426,"children":311427},{},[311428],{"type":17,"tag":48,"props":311429,"children":311430},{},[311431],{"type":23,"value":292743},{"type":17,"tag":7266,"props":311433,"children":311434},{},[311435],{"type":23,"value":311436},"Usage-based, starts at $350/month",{"type":17,"tag":7266,"props":311438,"children":311439},{},[311440],{"type":23,"value":311441},"Tiered plans starting free, usage caps per user/call",{"type":17,"tag":7239,"props":311443,"children":311444},{},[311445,311453,311458],{"type":17,"tag":7266,"props":311446,"children":311447},{},[311448],{"type":17,"tag":48,"props":311449,"children":311450},{},[311451],{"type":23,"value":311452},"Ideal for",{"type":17,"tag":7266,"props":311454,"children":311455},{},[311456],{"type":23,"value":311457},"SaaS teams building integrated products",{"type":17,"tag":7266,"props":311459,"children":311460},{},[311461],{"type":23,"value":311462},"AI teams building copilots or agent workflows",{"type":17,"tag":239,"props":311464,"children":311466},{"id":311465},"when-to-choose-composio-vs-unifiedto",[311467],{"type":23,"value":311468},"When to choose Composio vs Unified.to",{"type":17,"tag":29,"props":311470,"children":311471},{},[311472],{"type":17,"tag":48,"props":311473,"children":311474},{},[311475],{"type":23,"value":311476},"Choose Composio if:",{"type":17,"tag":80,"props":311478,"children":311479},{},[311480,311484,311489],{"type":17,"tag":84,"props":311481,"children":311482},{},[311483],{"type":23,"value":310505},{"type":17,"tag":84,"props":311485,"children":311486},{},[311487],{"type":23,"value":311488},"Your workflows rely on tool execution (e.g. send email, update records)",{"type":17,"tag":84,"props":311490,"children":311491},{},[311492],{"type":23,"value":311493},"You want a tool-calling layer optimized for LLMs",{"type":17,"tag":29,"props":311495,"children":311496},{},[311497],{"type":17,"tag":48,"props":311498,"children":311499},{},[311500],{"type":23,"value":310523},{"type":17,"tag":80,"props":311502,"children":311503},{},[311504,311508,311512,311516],{"type":17,"tag":84,"props":311505,"children":311506},{},[311507],{"type":23,"value":310531},{"type":17,"tag":84,"props":311509,"children":311510},{},[311511],{"type":23,"value":310536},{"type":17,"tag":84,"props":311513,"children":311514},{},[311515],{"type":23,"value":310541},{"type":17,"tag":84,"props":311517,"children":311518},{},[311519],{"type":23,"value":311520},"You want to store and query integration data in your own infrastructure",{"type":17,"tag":239,"props":311522,"children":311524},{"id":311523},"how-does-composio-compare-to-unifiedto",[311525],{"type":17,"tag":48,"props":311526,"children":311527},{},[311528],{"type":23,"value":311529},"How does Composio compare to Unified.to?",{"type":17,"tag":29,"props":311531,"children":311532},{},[311533],{"type":23,"value":311534},"Composio is a tool execution layer for AI agents. Unified.to is infrastructure for products that rely on real-time integrations, persistent data, and unified schemas.",{"type":17,"tag":29,"props":311536,"children":311537},{},[311538],{"type":23,"value":311539},"Unified.to offers:",{"type":17,"tag":80,"props":311541,"children":311542},{},[311543,311548,311559,311570,311575],{"type":17,"tag":84,"props":311544,"children":311545},{},[311546],{"type":23,"value":311547},"Clean, normalized data across 415+ APIs",{"type":17,"tag":84,"props":311549,"children":311550},{},[311551,311553,311557],{"type":23,"value":311552},"Native + [virtual ",{"type":17,"tag":133,"props":311554,"children":311555},{"href":4999},[311556],{"type":23,"value":5002},{"type":23,"value":311558},"](/blog/unlock_real_time_data_with_virtual_webhooks) for real-time sync",{"type":17,"tag":84,"props":311560,"children":311561},{},[311562,311564,311568],{"type":23,"value":311563},"Database streaming for ",{"type":17,"tag":133,"props":311565,"children":311566},{"href":5201},[311567],{"type":23,"value":5204},{"type":23,"value":311569}," and AI pipelines",{"type":17,"tag":84,"props":311571,"children":311572},{},[311573],{"type":23,"value":311574},"Zero data stored—no compliance risk",{"type":17,"tag":84,"props":311576,"children":311577},{},[311578],{"type":23,"value":311579},"Secure, embeddable auth components",{"type":17,"tag":29,"props":311581,"children":311582},{},[311583],{"type":23,"value":311584},"Here's a breakdown of how the platforms differ, especially if you're building an AI-native product or integrating across multiple categories.",{"type":17,"tag":239,"props":311586,"children":311588},{"id":311587},"real-time-sync-across-all-apiswithout-polling-jobs-or-agent-hacks",[311589],{"type":23,"value":311590},"Real-time sync across all APIs—without polling jobs or agent hacks",{"type":17,"tag":29,"props":311592,"children":311593},{},[311594],{"type":23,"value":311595},"Composio lets LLMs invoke APIs and listen to some events—but it's up to you to decide when to fetch, how to sync, or whether to poll.",{"type":17,"tag":29,"props":311597,"children":311598},{},[311599],{"type":23,"value":311600},"Unified.to delivers updates using native and virtual webhooks, with data retrieved directly from source APIs instead of relying on scheduled polling. You get event-driven sync from CRMs, HRIS, ATS, calendars, and more—without maintaining schedulers, state trackers, or polling logic.",{"type":17,"tag":239,"props":311602,"children":311603},{"id":310626},[311604],{"type":23,"value":310629},{"type":17,"tag":7231,"props":311606,"children":311607},{},[311608,311626],{"type":17,"tag":7235,"props":311609,"children":311610},{},[311611],{"type":17,"tag":7239,"props":311612,"children":311613},{},[311614,311618,311622],{"type":17,"tag":7243,"props":311615,"children":311616},{},[311617],{"type":23,"value":98853},{"type":17,"tag":7243,"props":311619,"children":311620},{},[311621],{"type":23,"value":1015},{"type":17,"tag":7243,"props":311623,"children":311624},{},[311625],{"type":23,"value":217},{"type":17,"tag":7259,"props":311627,"children":311628},{},[311629,311645,311660,311675,311690],{"type":17,"tag":7239,"props":311630,"children":311631},{},[311632,311636,311641],{"type":17,"tag":7266,"props":311633,"children":311634},{},[311635],{"type":23,"value":310662},{"type":17,"tag":7266,"props":311637,"children":311638},{},[311639],{"type":23,"value":311640},"Action-based tool execution",{"type":17,"tag":7266,"props":311642,"children":311643},{},[311644],{"type":23,"value":310672},{"type":17,"tag":7239,"props":311646,"children":311647},{},[311648,311652,311656],{"type":17,"tag":7266,"props":311649,"children":311650},{},[311651],{"type":23,"value":244583},{"type":17,"tag":7266,"props":311653,"children":311654},{},[311655],{"type":23,"value":310684},{"type":17,"tag":7266,"props":311657,"children":311658},{},[311659],{"type":23,"value":87601},{"type":17,"tag":7239,"props":311661,"children":311662},{},[311663,311667,311671],{"type":17,"tag":7266,"props":311664,"children":311665},{},[311666],{"type":23,"value":292641},{"type":17,"tag":7266,"props":311668,"children":311669},{},[311670],{"type":23,"value":310700},{"type":17,"tag":7266,"props":311672,"children":311673},{},[311674],{"type":23,"value":310705},{"type":17,"tag":7239,"props":311676,"children":311677},{},[311678,311682,311686],{"type":17,"tag":7266,"props":311679,"children":311680},{},[311681],{"type":23,"value":310713},{"type":17,"tag":7266,"props":311683,"children":311684},{},[311685],{"type":23,"value":310736},{"type":17,"tag":7266,"props":311687,"children":311688},{},[311689],{"type":23,"value":310723},{"type":17,"tag":7239,"props":311691,"children":311692},{},[311693,311697,311701],{"type":17,"tag":7266,"props":311694,"children":311695},{},[311696],{"type":23,"value":310731},{"type":17,"tag":7266,"props":311698,"children":311699},{},[311700],{"type":23,"value":310718},{"type":17,"tag":7266,"props":311702,"children":311703},{},[311704],{"type":23,"value":310741},{"type":17,"tag":239,"props":311706,"children":311708},{"id":311707},"unified-schemasnot-one-off-actions-or-tool-wrappers",[311709],{"type":23,"value":311710},"Unified schemas—not one-off actions or tool wrappers",{"type":17,"tag":29,"props":311712,"children":311713},{},[311714],{"type":23,"value":311715},"Composio exposes API actions with provider-specific response formats. Each connector returns native fields. There's no normalized schema across integrations.",{"type":17,"tag":29,"props":311717,"children":311718},{},[311719],{"type":23,"value":311720},"Unified.to provides a common schema for every category. Employee records from BambooHR and Personio follow the same model. CRM contacts look the same across Salesforce, HubSpot, and Zoho.",{"type":17,"tag":29,"props":311722,"children":311723},{},[311724],{"type":23,"value":7403},{"type":17,"tag":80,"props":311726,"children":311727},{},[311728,311733,311738],{"type":17,"tag":84,"props":311729,"children":311730},{},[311731],{"type":23,"value":311732},"No provider-specific parsing logic required",{"type":17,"tag":84,"props":311734,"children":311735},{},[311736],{"type":23,"value":311737},"Cleaner ingestion into vector DBs or analytics pipelines",{"type":17,"tag":84,"props":311739,"children":311740},{},[311741],{"type":23,"value":311742},"Easier testing, less connector-specific edge cases",{"type":17,"tag":239,"props":311744,"children":311746},{"id":311745},"built-for-product-integrationsnot-just-ai-agents",[311747],{"type":23,"value":311748},"Built for product integrations—not just AI agents",{"type":17,"tag":29,"props":311750,"children":311751},{},[311752],{"type":23,"value":311753},"Composio was designed for AI tool use. Great for agents. But less suited for SaaS products needing long-term, embedded integrations.",{"type":17,"tag":29,"props":311755,"children":311756},{},[311757],{"type":23,"value":311758},"Unified.to gives you persistent connections, scoped access, and structured data delivery into your app, database, or AI layer. It's built for production workloads—not prototypes.",{"type":17,"tag":239,"props":311760,"children":311762},{"id":311761},"database-ready-delivery-for-ai-pipelines-and-analytics",[311763],{"type":23,"value":311764},"Database-ready delivery for AI pipelines and analytics",{"type":17,"tag":29,"props":311766,"children":311767},{},[311768],{"type":23,"value":311769},"Composio fetches data in real time, but leaves storage, sync, and transformation to you.",{"type":17,"tag":29,"props":311771,"children":311772},{},[311773],{"type":23,"value":311774},"Unified.to streams records directly into your database—Postgres, Mongo, or S3—normalized and ready for use. Use it to fine-tune LLMs, run analytics, or power in-app copilots with fresh context.",{"type":17,"tag":239,"props":311776,"children":311778},{"id":311777},"zero-data-storedcompliance-by-default",[311779],{"type":23,"value":311780},"Zero data stored—compliance by default",{"type":17,"tag":29,"props":311782,"children":311783},{},[311784],{"type":23,"value":311785},"Composio stores tokens and logs in its cloud by default (with retention windows). Enterprise plans support self-hosting, but storage is still required.",{"type":17,"tag":29,"props":311787,"children":311788},{},[311789],{"type":23,"value":311790},"Unified.to stores nothing. We proxy API requests in real time. You can bring your own secrets vault. No customer data is cached, stored, or logged.",{"type":17,"tag":29,"props":311792,"children":311793},{},[311794],{"type":23,"value":311795},"This minimizes compliance risk and simplifies data governance.",{"type":17,"tag":239,"props":311797,"children":311799},{"id":311798},"built-for-developers-not-agent-operators",[311800],{"type":23,"value":311801},"Built for developers, not agent operators",{"type":17,"tag":29,"props":311803,"children":311804},{},[311805],{"type":23,"value":311806},"Composio's CLI and SDK are optimized for tool developers and AI builders. But if you're embedding integrations into your app, you'll still need to handle:",{"type":17,"tag":80,"props":311808,"children":311809},{},[311810,311815,311820],{"type":17,"tag":84,"props":311811,"children":311812},{},[311813],{"type":23,"value":311814},"Authorization flows",{"type":17,"tag":84,"props":311816,"children":311817},{},[311818],{"type":23,"value":311819},"UX for connecting apps",{"type":17,"tag":84,"props":311821,"children":311822},{},[311823],{"type":23,"value":311824},"Webhook infrastructure",{"type":17,"tag":29,"props":311826,"children":311827},{},[311828],{"type":17,"tag":48,"props":311829,"children":311830},{},[311831],{"type":23,"value":311832},"Unified.to gives you everything out of the box:",{"type":17,"tag":80,"props":311834,"children":311835},{},[311836,311841,311846,311851],{"type":17,"tag":84,"props":311837,"children":311838},{},[311839],{"type":23,"value":311840},"Connect UI component for OAuth and API key auth",{"type":17,"tag":84,"props":311842,"children":311843},{},[311844],{"type":23,"value":311845},"Webhook management",{"type":17,"tag":84,"props":311847,"children":311848},{},[311849],{"type":23,"value":311850},"API and SDKs in 7+ languages",{"type":17,"tag":84,"props":311852,"children":311853},{},[311854],{"type":23,"value":311855},"Integration directory UI",{"type":17,"tag":29,"props":311857,"children":311858},{},[311859],{"type":23,"value":311860},"You integrate once. We handle the rest.",{"type":17,"tag":239,"props":311862,"children":311864},{"id":311863},"what-is-the-difference-between-ai-agent-tools-and-integration-infrastructure",[311865],{"type":23,"value":311866},"What is the difference between AI agent tools and integration infrastructure?",{"type":17,"tag":29,"props":311868,"children":311869},{},[311870],{"type":23,"value":311871},"AI agent tools allow systems to perform actions in external applications, such as sending messages or updating records. Integration infrastructure provides structured, continuously updated data that can be stored, queried, and used across applications. Agent tools enable execution, while integration infrastructure enables consistent data access.",{"type":17,"tag":68,"props":311873,"children":311875},{"id":311874},"what-customers-say-on-g2",[311876],{"type":23,"value":311877},"What customers say on G2",{"type":17,"tag":29,"props":311879,"children":311880},{},[311881,311883,311887,311888,311892,311894,311899,311900,311905,311906,311910,311911,311916,311917,311922],{"type":23,"value":311882},"G2 isn't a spec sheet, but it's a useful signal for onboarding experience, support, and day-to-day usability. As of ",{"type":17,"tag":48,"props":311884,"children":311885},{},[311886],{"type":23,"value":231338},{"type":23,"value":11826},{"type":17,"tag":48,"props":311889,"children":311890},{},[311891],{"type":23,"value":1015},{"type":23,"value":311893}," is rated ",{"type":17,"tag":48,"props":311895,"children":311896},{},[311897],{"type":23,"value":311898},"4.9/5",{"type":23,"value":70920},{"type":17,"tag":48,"props":311901,"children":311902},{},[311903],{"type":23,"value":311904},"7 verified reviews",{"type":23,"value":12561},{"type":17,"tag":48,"props":311907,"children":311908},{},[311909],{"type":23,"value":217},{"type":23,"value":311893},{"type":17,"tag":48,"props":311912,"children":311913},{},[311914],{"type":23,"value":311915},"5.0/5",{"type":23,"value":70920},{"type":17,"tag":48,"props":311918,"children":311919},{},[311920],{"type":23,"value":311921},"23 verified reviews",{"type":23,"value":54},{"type":17,"tag":239,"props":311924,"children":311926},{"id":311925},"composio",[311927],{"type":23,"value":1015},{"type":17,"tag":29,"props":311929,"children":311930},{},[311931],{"type":17,"tag":48,"props":311932,"children":311933},{},[311934],{"type":23,"value":311935},"What users like",{"type":17,"tag":80,"props":311937,"children":311938},{},[311939,311944,311949],{"type":17,"tag":84,"props":311940,"children":311941},{},[311942],{"type":23,"value":311943},"Easy integrations and quick setup for connecting tools.",{"type":17,"tag":84,"props":311945,"children":311946},{},[311947],{"type":23,"value":311948},"Time savings for building agent-style workflows.",{"type":17,"tag":84,"props":311950,"children":311951},{},[311952],{"type":23,"value":311953},"Responsive support called out in multiple reviews.",{"type":17,"tag":29,"props":311955,"children":311956},{},[311957],{"type":17,"tag":48,"props":311958,"children":311959},{},[311960],{"type":23,"value":311961},"What users flag",{"type":17,"tag":80,"props":311963,"children":311964},{},[311965,311970,311975],{"type":17,"tag":84,"props":311966,"children":311967},{},[311968],{"type":23,"value":311969},"Steeper learning curve once you move beyond basics.",{"type":17,"tag":84,"props":311971,"children":311972},{},[311973],{"type":23,"value":311974},"Documentation can lag product changes (mentioned as a friction point).",{"type":17,"tag":84,"props":311976,"children":311977},{},[311978],{"type":23,"value":311979},"Missing/immature features for some advanced use cases.",{"type":17,"tag":29,"props":311981,"children":311982},{},[311983,311988,311990,311995,311997,312002],{"type":17,"tag":48,"props":311984,"children":311985},{},[311986],{"type":23,"value":311987},"How to interpret this",{"type":23,"value":311989},": Composio's reviews line up with an ",{"type":17,"tag":48,"props":311991,"children":311992},{},[311993],{"type":23,"value":311994},"agent skill/tooling layer",{"type":23,"value":311996}," where speed and convenience matter, but advanced usage can require deeper docs and ramp time. Unified's reviews line up with an ",{"type":17,"tag":48,"props":311998,"children":311999},{},[312000],{"type":23,"value":312001},"integration infrastructure layer",{"type":23,"value":312003}," where reliability, debugging visibility, and support throughput matter when you ship to production customers.",{"type":17,"tag":239,"props":312005,"children":312006},{"id":7672},[312007],{"type":23,"value":7675},{"type":17,"tag":80,"props":312009,"children":312010},{},[312011,312016,312020,312025,312029],{"type":17,"tag":84,"props":312012,"children":312013},{},[312014],{"type":23,"value":312015},"Composio focuses on action-based tool execution for AI agents",{"type":17,"tag":84,"props":312017,"children":312018},{},[312019],{"type":23,"value":311119},{"type":17,"tag":84,"props":312021,"children":312022},{},[312023],{"type":23,"value":312024},"Agent tools execute tasks but do not provide persistent data pipelines",{"type":17,"tag":84,"props":312026,"children":312027},{},[312028],{"type":23,"value":311129},{"type":17,"tag":84,"props":312030,"children":312031},{},[312032],{"type":23,"value":311134},{"type":17,"tag":29,"props":312034,"children":312035},{},[312036,312041],{"type":17,"tag":48,"props":312037,"children":312038},{},[312039],{"type":23,"value":312040},"Unified.to is infrastructure for integrated SaaS products—not just tools for agents.",{"type":23,"value":312042}," If your product depends on fresh, structured data from customer systems, it's the better long-term bet.",{"type":17,"tag":29,"props":312044,"children":312045},{},[312046,312051,312052,312057],{"type":17,"tag":133,"props":312047,"children":312049},{"href":158861,"rel":312048},[214],[312050],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":312053,"children":312055},{"href":1623,"rel":312054},[214],[312056],{"type":23,"value":226481},{"type":23,"value":312058}," to see how fast you can launch real-time integrations at scale.",{"title":7,"searchDepth":1629,"depth":1629,"links":312060},[312061,312062,312063,312064,312065,312066,312067,312068,312069,312070,312071,312072],{"id":311251,"depth":1635,"text":311254},{"id":311465,"depth":1635,"text":311468},{"id":311523,"depth":1635,"text":311529},{"id":311587,"depth":1635,"text":311590},{"id":310626,"depth":1635,"text":310629},{"id":311707,"depth":1635,"text":311710},{"id":311745,"depth":1635,"text":311748},{"id":311761,"depth":1635,"text":311764},{"id":311777,"depth":1635,"text":311780},{"id":311798,"depth":1635,"text":311801},{"id":311863,"depth":1635,"text":311866},{"id":311874,"depth":1629,"text":311877,"children":312073},[312074,312075],{"id":311925,"depth":1635,"text":1015},{"id":7672,"depth":1635,"text":7675},"content:blog:composio_vs_unified_which_platform_powers_real_time_saas_integrations_better.md","blog/composio_vs_unified_which_platform_powers_real_time_saas_integrations_better.md","blog/composio_vs_unified_which_platform_powers_real_time_saas_integrations_better",{"_path":312080,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":312081,"description":312082,"img":312083,"date":312084,"tag":12,"body":312085,"_type":1677,"_id":312816,"_source":1679,"_file":312817,"_stem":312818,"_extension":1682},"/blog/how_we_normalize_oauth_across_360_apis_at_unified","How We Normalize OAuth Across 360+ APIs at Unified.to","OAuth is inconsistent across APIs due to differences in scopes, token handling, redirect flows, and error responses. Normalizing OAuth means abstracting these...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_we_normalize_oauth_across_360_apis_at_unified-icon.png","2025-06-08T00:00:00.000Z",{"type":14,"children":312086,"toc":312797},[312087,312092,312095,312103,312111,312120,312125,312131,312136,312159,312164,312170,312175,312180,312186,312264,312270,312275,312281,312286,312353,312358,312364,312369,312402,312407,312413,312451,312456,312462,312474,312479,312485,312509,312514,312519,312525,312530,312553,312565,312571,312576,312609,312621,312626,312632,312653,312658,312703,312708,312714,312719,312737,312741,312769,312773,312778,312783,312788],{"type":17,"tag":18,"props":312088,"children":312090},{"id":312089},"how-we-normalize-oauth-across-360-apis-at-unifiedto",[312091],{"type":23,"value":312081},{"type":17,"tag":25,"props":312093,"children":312094},{},[],{"type":17,"tag":29,"props":312096,"children":312097},{},[312098],{"type":17,"tag":33,"props":312099,"children":312100},{},[312101],{"type":23,"value":312102},"June 8, 2025",{"type":17,"tag":29,"props":312104,"children":312105},{},[312106],{"type":17,"tag":6438,"props":312107,"children":312110},{"alt":312108,"src":312109},"oauth_unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_we_normalize_oauth_across_360_apis_at_unified-0.png",[],{"type":17,"tag":29,"props":312112,"children":312113},{},[312114,312118],{"type":17,"tag":133,"props":312115,"children":312116},{"href":779},[312117],{"type":23,"value":782},{"type":23,"value":312119}," is inconsistent across APIs due to differences in scopes, token handling, redirect flows, and error responses. Normalizing OAuth means abstracting these differences into a single interface, so developers can authenticate across integrations without handling provider-specific logic.",{"type":17,"tag":29,"props":312121,"children":312122},{},[312123],{"type":23,"value":312124},"OAuth 2.0 is a standard, but implementations vary widely across APIs. This article explains how OAuth differs across providers, what it means to normalize OAuth, and how Unified.to abstracts authentication across integrations into a consistent developer interface.",{"type":17,"tag":68,"props":312126,"children":312128},{"id":312127},"when-does-oauth-normalization-matter",[312129],{"type":23,"value":312130},"When does OAuth normalization matter?",{"type":17,"tag":29,"props":312132,"children":312133},{},[312134],{"type":23,"value":312135},"OAuth normalization is important if:",{"type":17,"tag":80,"props":312137,"children":312138},{},[312139,312144,312149,312154],{"type":17,"tag":84,"props":312140,"children":312141},{},[312142],{"type":23,"value":312143},"You integrate with multiple third-party APIs",{"type":17,"tag":84,"props":312145,"children":312146},{},[312147],{"type":23,"value":312148},"You want a consistent authentication flow across providers",{"type":17,"tag":84,"props":312150,"children":312151},{},[312152],{"type":23,"value":312153},"You need to avoid handling provider-specific scope, token, and refresh logic",{"type":17,"tag":84,"props":312155,"children":312156},{},[312157],{"type":23,"value":312158},"Your product depends on scaling integrations across many customers",{"type":17,"tag":29,"props":312160,"children":312161},{},[312162],{"type":23,"value":312163},"If you are integrating with a single API, native OAuth handling may be sufficient. As integration count grows, normalization reduces complexity and maintenance overhead.",{"type":17,"tag":68,"props":312165,"children":312167},{"id":312166},"what-is-oauth-normalization",[312168],{"type":23,"value":312169},"What is OAuth normalization?",{"type":17,"tag":29,"props":312171,"children":312172},{},[312173],{"type":23,"value":312174},"OAuth normalization is the process of standardizing authentication flows, scopes, token handling, and error responses across different APIs. Instead of implementing provider-specific OAuth logic, developers interact with a single interface that handles differences internally.",{"type":17,"tag":29,"props":312176,"children":312177},{},[312178],{"type":23,"value":312179},"This allows applications to scale integrations without increasing authentication complexity.",{"type":17,"tag":239,"props":312181,"children":312183},{"id":312182},"oauth-handling-approaches",[312184],{"type":23,"value":312185},"OAuth handling approaches",{"type":17,"tag":7231,"props":312187,"children":312188},{},[312189,312207],{"type":17,"tag":7235,"props":312190,"children":312191},{},[312192],{"type":17,"tag":7239,"props":312193,"children":312194},{},[312195,312199,312203],{"type":17,"tag":7243,"props":312196,"children":312197},{},[312198],{"type":23,"value":81201},{"type":17,"tag":7243,"props":312200,"children":312201},{},[312202],{"type":23,"value":24525},{"type":17,"tag":7243,"props":312204,"children":312205},{},[312206],{"type":23,"value":977},{"type":17,"tag":7259,"props":312208,"children":312209},{},[312210,312228,312246],{"type":17,"tag":7239,"props":312211,"children":312212},{},[312213,312218,312223],{"type":17,"tag":7266,"props":312214,"children":312215},{},[312216],{"type":23,"value":312217},"Native OAuth per API",{"type":17,"tag":7266,"props":312219,"children":312220},{},[312221],{"type":23,"value":312222},"Implement OAuth separately for each provider",{"type":17,"tag":7266,"props":312224,"children":312225},{},[312226],{"type":23,"value":312227},"Full control, high complexity",{"type":17,"tag":7239,"props":312229,"children":312230},{},[312231,312236,312241],{"type":17,"tag":7266,"props":312232,"children":312233},{},[312234],{"type":23,"value":312235},"Partial abstraction",{"type":17,"tag":7266,"props":312237,"children":312238},{},[312239],{"type":23,"value":312240},"Shared logic with provider-specific overrides",{"type":17,"tag":7266,"props":312242,"children":312243},{},[312244],{"type":23,"value":312245},"Reduced complexity, still fragmented",{"type":17,"tag":7239,"props":312247,"children":312248},{},[312249,312254,312259],{"type":17,"tag":7266,"props":312250,"children":312251},{},[312252],{"type":23,"value":312253},"Fully normalized OAuth",{"type":17,"tag":7266,"props":312255,"children":312256},{},[312257],{"type":23,"value":312258},"Single interface across integrations",{"type":17,"tag":7266,"props":312260,"children":312261},{},[312262],{"type":23,"value":312263},"Lowest complexity, abstraction layer required",{"type":17,"tag":68,"props":312265,"children":312267},{"id":312266},"why-is-oauth-inconsistent-across-apis",[312268],{"type":23,"value":312269},"Why is OAuth inconsistent across APIs?",{"type":17,"tag":29,"props":312271,"children":312272},{},[312273],{"type":23,"value":312274},"OAuth is a standard, but each API implements it differently, including variations in scopes, token formats, redirect flows, and refresh behavior. These differences create inconsistencies that require custom handling for each integration. As a result, developers often need to manage provider-specific edge cases despite using the same underlying protocol.",{"type":17,"tag":68,"props":312276,"children":312278},{"id":312277},"why-oauth-fragmentation-slows-teams-down",[312279],{"type":23,"value":312280},"Why OAuth Fragmentation Slows Teams Down",{"type":17,"tag":29,"props":312282,"children":312283},{},[312284],{"type":23,"value":312285},"If you've ever built integrations with multiple third-party APIs, you've probably encountered:",{"type":17,"tag":80,"props":312287,"children":312288},{},[312289,312309,312333,312338,312343,312348],{"type":17,"tag":84,"props":312290,"children":312291},{},[312292,312294,312299,312301,312307],{"type":23,"value":312293},"One provider using ",{"type":17,"tag":6121,"props":312295,"children":312297},{"className":312296},[],[312298],{"type":23,"value":251271},{"type":23,"value":312300},", another ",{"type":17,"tag":6121,"props":312302,"children":312304},{"className":312303},[],[312305],{"type":23,"value":312306},"authorization_code",{"type":23,"value":312308},", a third relying on legacy tokens",{"type":17,"tag":84,"props":312310,"children":312311},{},[312312,312314,312319,312321,312326,312327],{"type":23,"value":312313},"Scope naming collisions: ",{"type":17,"tag":6121,"props":312315,"children":312317},{"className":312316},[],[312318],{"type":23,"value":77936},{"type":23,"value":312320}," vs. ",{"type":17,"tag":6121,"props":312322,"children":312324},{"className":312323},[],[312325],{"type":23,"value":77931},{"type":23,"value":312320},{"type":17,"tag":6121,"props":312328,"children":312330},{"className":312329},[],[312331],{"type":23,"value":312332},"read_people",{"type":17,"tag":84,"props":312334,"children":312335},{},[312336],{"type":23,"value":312337},"Redirect URI mismatch errors due to minor differences in path formatting",{"type":17,"tag":84,"props":312339,"children":312340},{},[312341],{"type":23,"value":312342},"HTML errors instead of JSON on expired tokens",{"type":17,"tag":84,"props":312344,"children":312345},{},[312346],{"type":23,"value":312347},"Varying token formats, expiration policies, and re-consent behaviors",{"type":17,"tag":84,"props":312349,"children":312350},{},[312351],{"type":23,"value":312352},"So many refresh strategies; refreshing access token, refreshing the refresh token, time-based and activity-based expiries, re-authentication expiries, …",{"type":17,"tag":29,"props":312354,"children":312355},{},[312356],{"type":23,"value":312357},"Each new integration adds more code paths, more exception handling, and more time spent maintaining brittle OAuth logic. In fact, at Unified.to, we've found (and support) more than 70 variations of the OAuth2 'standard'.",{"type":17,"tag":239,"props":312359,"children":312361},{"id":312360},"our-design-goals",[312362],{"type":23,"value":312363},"Our Design Goals",{"type":17,"tag":29,"props":312365,"children":312366},{},[312367],{"type":23,"value":312368},"Unified.to was built to abstract this away. We focused on:",{"type":17,"tag":6154,"props":312370,"children":312371},{},[312372,312377,312382,312387,312392,312397],{"type":17,"tag":84,"props":312373,"children":312374},{},[312375],{"type":23,"value":312376},"Supporting all major OAuth grant types & flows",{"type":17,"tag":84,"props":312378,"children":312379},{},[312380],{"type":23,"value":312381},"Standardizing redirect URIs across every integration",{"type":17,"tag":84,"props":312383,"children":312384},{},[312385],{"type":23,"value":312386},"Mapping provider scopes to a unified set",{"type":17,"tag":84,"props":312388,"children":312389},{},[312390],{"type":23,"value":312391},"Handling token exchange, refresh, and revocation uniformly",{"type":17,"tag":84,"props":312393,"children":312394},{},[312395],{"type":23,"value":312396},"Surfacing OAuth errors in a consistent way",{"type":17,"tag":84,"props":312398,"children":312399},{},[312400],{"type":23,"value":312401},"Giving developers a single method to initiate and monitor authorization flows",{"type":17,"tag":29,"props":312403,"children":312404},{},[312405],{"type":23,"value":312406},"The following sections describe how OAuth is standardized across integrations.",{"type":17,"tag":239,"props":312408,"children":312410},{"id":312409},"_1-grant-type-normalization",[312411],{"type":23,"value":312412},"1. Grant Type Normalization",{"type":17,"tag":29,"props":312414,"children":312415},{},[312416,312417,312422,312423,312428,312429,312435,312436,312441,312443,312449],{"type":23,"value":254333},{"type":17,"tag":6121,"props":312418,"children":312420},{"className":312419},[],[312421],{"type":23,"value":312306},{"type":23,"value":11826},{"type":17,"tag":6121,"props":312424,"children":312426},{"className":312425},[],[312427],{"type":23,"value":251271},{"type":23,"value":11826},{"type":17,"tag":6121,"props":312430,"children":312432},{"className":312431},[],[312433],{"type":23,"value":312434},"password",{"type":23,"value":34435},{"type":17,"tag":6121,"props":312437,"children":312439},{"className":312438},[],[312440],{"type":23,"value":77603},{"type":23,"value":312442}," flows. We also support API key/token-based authorization where applicable. For each integration, we define the required grant type and credentials internally. Developers only need to call ",{"type":17,"tag":6121,"props":312444,"children":312446},{"className":312445},[],[312447],{"type":23,"value":312448},"unified.connect()",{"type":23,"value":312450}," in our SDK.",{"type":17,"tag":29,"props":312452,"children":312453},{},[312454],{"type":23,"value":312455},"Under the hood, we initiate the appropriate flow, handle redirects, and capture tokens. We also expose these tokens to your infrastructure via secure storage, or store them encrypted and scoped per connection.",{"type":17,"tag":239,"props":312457,"children":312459},{"id":312458},"_2-unified-redirect-uris",[312460],{"type":23,"value":312461},"2. Unified Redirect URIs",{"type":17,"tag":29,"props":312463,"children":312464},{},[312465,312467,312472],{"type":23,"value":312466},"We use a single redirect URI across all integrations: ",{"type":17,"tag":6121,"props":312468,"children":312470},{"className":312469},[],[312471],{"type":23,"value":42417},{"type":23,"value":312473}," (plus EU and AU versions). Providers are configured to use that during app registration.",{"type":17,"tag":29,"props":312475,"children":312476},{},[312477],{"type":23,"value":312478},"That means no environment-specific redirects, no per-provider callback config, and fewer deployment issues. This one endpoint handles all OAuth code exchanges.",{"type":17,"tag":239,"props":312480,"children":312482},{"id":312481},"_3-unified-scope-abstraction",[312483],{"type":23,"value":312484},"3. Unified Scope Abstraction",{"type":17,"tag":29,"props":312486,"children":312487},{},[312488,312490,312496,312497,312502,312503,312508],{"type":23,"value":312489},"Instead of asking developers to memorize each provider's scope strings, we maintain a library of unified scopes (e.g. ",{"type":17,"tag":6121,"props":312491,"children":312493},{"className":312492},[],[312494],{"type":23,"value":312495},"crm_contact_read",{"type":23,"value":11826},{"type":17,"tag":6121,"props":312498,"children":312500},{"className":312499},[],[312501],{"type":23,"value":143552},{"type":23,"value":11826},{"type":17,"tag":6121,"props":312504,"children":312506},{"className":312505},[],[312507],{"type":23,"value":98145},{"type":23,"value":129328},{"type":17,"tag":29,"props":312510,"children":312511},{},[312512],{"type":23,"value":312513},"In the Unified.to SDK or dashboard, you select these abstract scopes. We map them to provider-specific scopes under the hood.",{"type":17,"tag":29,"props":312515,"children":312516},{},[312517],{"type":23,"value":312518},"Need a custom scope? You can pass provider-native scope strings too. Unified.to will merge and handle them.",{"type":17,"tag":239,"props":312520,"children":312522},{"id":312521},"_4-token-management-and-refresh",[312523],{"type":23,"value":312524},"4. Token Management and Refresh",{"type":17,"tag":29,"props":312526,"children":312527},{},[312528],{"type":23,"value":312529},"Once tokens are obtained, Unified.to:",{"type":17,"tag":80,"props":312531,"children":312532},{},[312533,312538,312543,312548],{"type":17,"tag":84,"props":312534,"children":312535},{},[312536],{"type":23,"value":312537},"Stores them encrypted or in your own AWS Secrets Manager",{"type":17,"tag":84,"props":312539,"children":312540},{},[312541],{"type":23,"value":312542},"Tracks expiration",{"type":17,"tag":84,"props":312544,"children":312545},{},[312546],{"type":23,"value":312547},"Refreshes access tokens and, if needed, refresh tokens automatically",{"type":17,"tag":84,"props":312549,"children":312550},{},[312551],{"type":23,"value":312552},"Handles provider-specific quirks (e.g. rolling refresh, re-consent windows)",{"type":17,"tag":29,"props":312554,"children":312555},{},[312556,312558,312563],{"type":23,"value":312557},"This removes the need for manual token refresh logic, background jobs, and provider-specific expiry handling. If a refresh fails, Unified.to flags the connection and surfaces a consistent ",{"type":17,"tag":6121,"props":312559,"children":312561},{"className":312560},[],[312562],{"type":23,"value":139168},{"type":23,"value":312564},"error and sends your server an event notification.",{"type":17,"tag":239,"props":312566,"children":312568},{"id":312567},"_5-standardized-error-surfacing",[312569],{"type":23,"value":312570},"5. Standardized Error Surfacing",{"type":17,"tag":29,"props":312572,"children":312573},{},[312574],{"type":23,"value":312575},"Every provider returns errors differently. Unified.to standardizes them:",{"type":17,"tag":80,"props":312577,"children":312578},{},[312579,312589,312599],{"type":17,"tag":84,"props":312580,"children":312581},{},[312582,312587],{"type":17,"tag":6121,"props":312583,"children":312585},{"className":312584},[],[312586],{"type":23,"value":137475},{"type":23,"value":312588},": Token expired or revoked",{"type":17,"tag":84,"props":312590,"children":312591},{},[312592,312597],{"type":17,"tag":6121,"props":312593,"children":312595},{"className":312594},[],[312596],{"type":23,"value":238508},{"type":23,"value":312598},": Missing scope or permission",{"type":17,"tag":84,"props":312600,"children":312601},{},[312602,312607],{"type":17,"tag":6121,"props":312603,"children":312605},{"className":312604},[],[312606],{"type":23,"value":137496},{"type":23,"value":312608},": Invalid config or payload",{"type":17,"tag":29,"props":312610,"children":312611},{},[312612,312614,312619],{"type":23,"value":312613},"The authorization also will test the newly created connection to ensure that it has access to the data that your permissions requested.  If it doesn't then a ",{"type":17,"tag":6121,"props":312615,"children":312617},{"className":312616},[],[312618],{"type":23,"value":225602},{"type":23,"value":312620}," error is returned and the connection is not created.",{"type":17,"tag":29,"props":312622,"children":312623},{},[312624],{"type":23,"value":312625},"In every OAuth failure (auth rejection, scope issue, redirect error), we surface an error object in a consistent format. Developers handle a consistent set of error responses across all integrations.",{"type":17,"tag":239,"props":312627,"children":312629},{"id":312628},"_6-one-sdk-one-interface",[312630],{"type":23,"value":312631},"6. One SDK, One Interface",{"type":17,"tag":29,"props":312633,"children":312634},{},[312635,312637,312643,312645,312651],{"type":23,"value":312636},"Our SDK exposes a single ",{"type":17,"tag":6121,"props":312638,"children":312640},{"className":312639},[],[312641],{"type":23,"value":312642},"connect()",{"type":23,"value":312644}," method for initiating OAuth, and a ",{"type":17,"tag":6121,"props":312646,"children":312648},{"className":312647},[],[312649],{"type":23,"value":312650},"getConnection()",{"type":23,"value":312652}," method for retrieving status and metadata.",{"type":17,"tag":29,"props":312654,"children":312655},{},[312656],{"type":23,"value":312657},"Each connection object includes:",{"type":17,"tag":80,"props":312659,"children":312660},{},[312661,312665,312688,312693,312698],{"type":17,"tag":84,"props":312662,"children":312663},{},[312664],{"type":23,"value":43146},{"type":17,"tag":84,"props":312666,"children":312667},{},[312668,312670,312675,312676,312681,312682,312687],{"type":23,"value":312669},"Status (",{"type":17,"tag":6121,"props":312671,"children":312673},{"className":312672},[],[312674],{"type":23,"value":195357},{"type":23,"value":11826},{"type":17,"tag":6121,"props":312677,"children":312679},{"className":312678},[],[312680],{"type":23,"value":195364},{"type":23,"value":11826},{"type":17,"tag":6121,"props":312683,"children":312685},{"className":312684},[],[312686],{"type":23,"value":195371},{"type":23,"value":12034},{"type":17,"tag":84,"props":312689,"children":312690},{},[312691],{"type":23,"value":312692},"Scopes granted",{"type":17,"tag":84,"props":312694,"children":312695},{},[312696],{"type":23,"value":312697},"Refresh history",{"type":17,"tag":84,"props":312699,"children":312700},{},[312701],{"type":23,"value":312702},"Error state if present",{"type":17,"tag":29,"props":312704,"children":312705},{},[312706],{"type":23,"value":312707},"This simplifies frontend UI and backend sync logic. No per-integration code required.",{"type":17,"tag":239,"props":312709,"children":312711},{"id":312710},"_7-pre-build-authorization-ui",[312712],{"type":23,"value":312713},"7. Pre-build Authorization UI",{"type":17,"tag":29,"props":312715,"children":312716},{},[312717],{"type":23,"value":312718},"To make it dead-simple to get your customers to authorize access to their accounts, we've built UI components that you can use directly inside your application with just 1 line of code.",{"type":17,"tag":6154,"props":312720,"children":312721},{},[312722,312727,312732],{"type":17,"tag":84,"props":312723,"children":312724},{},[312725],{"type":23,"value":312726},"We have pre-build components for React, Angular, VueJS, Svelte and Javascript.",{"type":17,"tag":84,"props":312728,"children":312729},{},[312730],{"type":23,"value":312731},"Plus you can fork our publicly available source code and redesign it however you like.",{"type":17,"tag":84,"props":312733,"children":312734},{},[312735],{"type":23,"value":312736},"If that isn't enough customization, then just use our API to get a list of activated integrations which will include a logo URL, name, and authorization URL, which you can then style and display however you like (even alongside your existing internally-built integrations).",{"type":17,"tag":239,"props":312738,"children":312739},{"id":7672},[312740],{"type":23,"value":7675},{"type":17,"tag":80,"props":312742,"children":312743},{},[312744,312749,312754,312759,312764],{"type":17,"tag":84,"props":312745,"children":312746},{},[312747],{"type":23,"value":312748},"OAuth implementations vary significantly across APIs",{"type":17,"tag":84,"props":312750,"children":312751},{},[312752],{"type":23,"value":312753},"Differences include scopes, token formats, refresh behavior, and error responses",{"type":17,"tag":84,"props":312755,"children":312756},{},[312757],{"type":23,"value":312758},"OAuth normalization standardizes these differences into a single interface",{"type":17,"tag":84,"props":312760,"children":312761},{},[312762],{"type":23,"value":312763},"This reduces integration complexity and maintenance overhead",{"type":17,"tag":84,"props":312765,"children":312766},{},[312767],{"type":23,"value":312768},"Unified.to provides a consistent authentication model across integrations",{"type":17,"tag":239,"props":312770,"children":312771},{"id":252568},[312772],{"type":23,"value":277050},{"type":17,"tag":29,"props":312774,"children":312775},{},[312776],{"type":23,"value":312777},"OAuth fragmentation isn't just a developer inconvenience. It slows down feature delivery, introduces hard-to-debug issues, and increases risk. Unified.to makes OAuth something you can configure once and scale across all integrations.",{"type":17,"tag":29,"props":312779,"children":312780},{},[312781],{"type":23,"value":312782},"You don't have to manage per-API edge cases. You get a unified abstraction for scopes, redirects, errors, token refresh, and storage.",{"type":17,"tag":29,"props":312784,"children":312785},{},[312786],{"type":23,"value":312787},"OAuth flows are handled internally, but provided through a consistent interface. Unified.to makes it feel like one integration.",{"type":17,"tag":29,"props":312789,"children":312790},{},[312791],{"type":17,"tag":133,"props":312792,"children":312794},{"href":43547,"rel":312793},[214],[312795],{"type":23,"value":312796},"Explore Unified.to's OAuth Docs",{"title":7,"searchDepth":1629,"depth":1629,"links":312798},[312799,312800,312803,312804],{"id":312127,"depth":1629,"text":312130},{"id":312166,"depth":1629,"text":312169,"children":312801},[312802],{"id":312182,"depth":1635,"text":312185},{"id":312266,"depth":1629,"text":312269},{"id":312277,"depth":1629,"text":312280,"children":312805},[312806,312807,312808,312809,312810,312811,312812,312813,312814,312815],{"id":312360,"depth":1635,"text":312363},{"id":312409,"depth":1635,"text":312412},{"id":312458,"depth":1635,"text":312461},{"id":312481,"depth":1635,"text":312484},{"id":312521,"depth":1635,"text":312524},{"id":312567,"depth":1635,"text":312570},{"id":312628,"depth":1635,"text":312631},{"id":312710,"depth":1635,"text":312713},{"id":7672,"depth":1635,"text":7675},{"id":252568,"depth":1635,"text":277050},"content:blog:how_we_normalize_oauth_across_360_apis_at_unified.md","blog/how_we_normalize_oauth_across_360_apis_at_unified.md","blog/how_we_normalize_oauth_across_360_apis_at_unified",{"_path":312820,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":312821,"description":312822,"img":312823,"date":312084,"tag":12,"body":312824,"_type":1677,"_id":313433,"_source":1679,"_file":313434,"_stem":313435,"_extension":1682},"/blog/replacing_polling_with_event_driven_integrations_using_virtual_webhooks","Replacing Polling with Event-Driven Integrations (Using Virtual Webhooks)","Then as integrations grow, polling becomes infrastructure, schedulers, retries, state tracking, and rate-limit management spread across every integration.","https://s3.us-east-2.amazonaws.com/unified-article-images/replacing_polling_with_event_driven_integrations_using_virtual_webhooks-icon.png",{"type":14,"children":312825,"toc":313413},[312826,312831,312834,312841,312846,312851,312856,312861,312869,312880,312892,312898,312903,312908,312914,312919,312944,312949,312965,312970,312988,312994,313007,313013,313030,313035,313041,313046,313051,313057,313070,313075,313080,313086,313091,313096,313113,313117,313132,313139,313144,313150,313155,313161,313184,313190,313208,313214,313222,313240,313248,313261,313269,313277,313285,313293,313299,313304,313309,313314,313332,313337,313343,313348,313371,313376,313380,313385,313390,313408],{"type":17,"tag":18,"props":312827,"children":312829},{"id":312828},"replacing-polling-with-event-driven-integrations-using-virtual-webhooks",[312830],{"type":23,"value":312821},{"type":17,"tag":25,"props":312832,"children":312833},{},[],{"type":17,"tag":29,"props":312835,"children":312836},{},[312837],{"type":17,"tag":33,"props":312838,"children":312839},{},[312840],{"type":23,"value":312102},{"type":17,"tag":29,"props":312842,"children":312843},{},[312844],{"type":23,"value":312845},"Most teams don't choose polling long-term.",{"type":17,"tag":29,"props":312847,"children":312848},{},[312849],{"type":23,"value":312850},"They start with it.",{"type":17,"tag":29,"props":312852,"children":312853},{},[312854],{"type":23,"value":312855},"Then as integrations grow, polling becomes infrastructure: schedulers, retries, state tracking, and rate-limit management spread across every integration.",{"type":17,"tag":29,"props":312857,"children":312858},{},[312859],{"type":23,"value":312860},"At that point, the question changes:",{"type":17,"tag":29,"props":312862,"children":312863},{},[312864],{"type":17,"tag":48,"props":312865,"children":312866},{},[312867],{"type":23,"value":312868},"How do we remove polling from the application layer without losing coverage?",{"type":17,"tag":29,"props":312870,"children":312871},{},[312872,312874,312878],{"type":23,"value":312873},"This is where event-driven models—and specifically [virtual ",{"type":17,"tag":133,"props":312875,"children":312876},{"href":4999},[312877],{"type":23,"value":5002},{"type":23,"value":312879},"](/blog/unlock_real_time_data_with_virtual_webhooks)—come in.",{"type":17,"tag":3414,"props":312881,"children":312882},{},[312883],{"type":17,"tag":29,"props":312884,"children":312885},{},[312886,312888],{"type":23,"value":312887},"For a breakdown of polling vs webhooks vs virtual webhooks at a systems level, see: ",{"type":17,"tag":48,"props":312889,"children":312890},{},[312891],{"type":23,"value":129133},{"type":17,"tag":68,"props":312893,"children":312895},{"id":312894},"why-teams-move-away-from-polling",[312896],{"type":23,"value":312897},"Why teams move away from polling",{"type":17,"tag":29,"props":312899,"children":312900},{},[312901],{"type":23,"value":312902},"Polling works early because it is simple and universal.",{"type":17,"tag":29,"props":312904,"children":312905},{},[312906],{"type":23,"value":312907},"It breaks as systems scale.",{"type":17,"tag":239,"props":312909,"children":312911},{"id":312910},"infrastructure-sprawl",[312912],{"type":23,"value":312913},"Infrastructure sprawl",{"type":17,"tag":29,"props":312915,"children":312916},{},[312917],{"type":23,"value":312918},"Every integration requires:",{"type":17,"tag":80,"props":312920,"children":312921},{},[312922,312927,312931,312935],{"type":17,"tag":84,"props":312923,"children":312924},{},[312925],{"type":23,"value":312926},"scheduled jobs",{"type":17,"tag":84,"props":312928,"children":312929},{},[312930],{"type":23,"value":228906},{"type":17,"tag":84,"props":312932,"children":312933},{},[312934],{"type":23,"value":248338},{"type":17,"tag":84,"props":312936,"children":312937},{},[312938,312942],{"type":17,"tag":133,"props":312939,"children":312940},{"href":1857},[312941],{"type":23,"value":1860},{"type":23,"value":312943}," handling",{"type":17,"tag":29,"props":312945,"children":312946},{},[312947],{"type":23,"value":312948},"This logic is duplicated across:",{"type":17,"tag":80,"props":312950,"children":312951},{},[312952,312956,312960],{"type":17,"tag":84,"props":312953,"children":312954},{},[312955],{"type":23,"value":80429},{"type":17,"tag":84,"props":312957,"children":312958},{},[312959],{"type":23,"value":70514},{"type":17,"tag":84,"props":312961,"children":312962},{},[312963],{"type":23,"value":312964},"integrations",{"type":17,"tag":239,"props":312966,"children":312968},{"id":312967},"inefficient-api-usage",[312969],{"type":23,"value":228876},{"type":17,"tag":80,"props":312971,"children":312972},{},[312973,312978,312983],{"type":17,"tag":84,"props":312974,"children":312975},{},[312976],{"type":23,"value":312977},"Most polling requests return no changes",{"type":17,"tag":84,"props":312979,"children":312980},{},[312981],{"type":23,"value":312982},"API limits are consumed regardless",{"type":17,"tag":84,"props":312984,"children":312985},{},[312986],{"type":23,"value":312987},"Scaling customers multiplies request volume",{"type":17,"tag":239,"props":312989,"children":312991},{"id":312990},"increasing-latency",[312992],{"type":23,"value":312993},"Increasing latency",{"type":17,"tag":80,"props":312995,"children":312996},{},[312997,313002],{"type":17,"tag":84,"props":312998,"children":312999},{},[313000],{"type":23,"value":313001},"Data is only as fresh as the polling interval",{"type":17,"tag":84,"props":313003,"children":313004},{},[313005],{"type":23,"value":313006},"Reducing latency requires increasing request volume",{"type":17,"tag":239,"props":313008,"children":313010},{"id":313009},"hard-to-debug-failures",[313011],{"type":23,"value":313012},"Hard-to-debug failures",{"type":17,"tag":80,"props":313014,"children":313015},{},[313016,313021,313025],{"type":17,"tag":84,"props":313017,"children":313018},{},[313019],{"type":23,"value":313020},"Missed windows create silent data gaps",{"type":17,"tag":84,"props":313022,"children":313023},{},[313024],{"type":23,"value":248283},{"type":17,"tag":84,"props":313026,"children":313027},{},[313028],{"type":23,"value":313029},"State becomes fragmented across jobs",{"type":17,"tag":29,"props":313031,"children":313032},{},[313033],{"type":23,"value":313034},"Polling does not fail at once. It degrades as complexity grows.",{"type":17,"tag":68,"props":313036,"children":313038},{"id":313037},"the-shift-to-event-driven-delivery",[313039],{"type":23,"value":313040},"The shift to event-driven delivery",{"type":17,"tag":29,"props":313042,"children":313043},{},[313044],{"type":23,"value":313045},"Event-driven systems remove continuous checking.",{"type":17,"tag":29,"props":313047,"children":313048},{},[313049],{"type":23,"value":313050},"Instead of asking for changes, your system reacts to them.",{"type":17,"tag":239,"props":313052,"children":313054},{"id":313053},"native-webhooks-when-available",[313055],{"type":23,"value":313056},"Native webhooks (when available)",{"type":17,"tag":80,"props":313058,"children":313059},{},[313060,313065],{"type":17,"tag":84,"props":313061,"children":313062},{},[313063],{"type":23,"value":313064},"The source system emits events",{"type":17,"tag":84,"props":313066,"children":313067},{},[313068],{"type":23,"value":313069},"Your application processes them",{"type":17,"tag":29,"props":313071,"children":313072},{},[313073],{"type":23,"value":313074},"This works well, but only when the API supports it.",{"type":17,"tag":29,"props":313076,"children":313077},{},[313078],{"type":23,"value":313079},"Most APIs don't provide consistent webhook coverage.",{"type":17,"tag":68,"props":313081,"children":313083},{"id":313082},"virtual-webhooks-removing-polling-from-your-app",[313084],{"type":23,"value":313085},"Virtual webhooks: removing polling from your app",{"type":17,"tag":29,"props":313087,"children":313088},{},[313089],{"type":23,"value":313090},"Virtual webhooks shift polling and change detection into the integration layer.",{"type":17,"tag":29,"props":313092,"children":313093},{},[313094],{"type":23,"value":313095},"Instead of your system managing jobs:",{"type":17,"tag":80,"props":313097,"children":313098},{},[313099,313103,313108],{"type":17,"tag":84,"props":313100,"children":313101},{},[313102],{"type":23,"value":249094},{"type":17,"tag":84,"props":313104,"children":313105},{},[313106],{"type":23,"value":313107},"detects changes",{"type":17,"tag":84,"props":313109,"children":313110},{},[313111],{"type":23,"value":313112},"emits webhook events",{"type":17,"tag":29,"props":313114,"children":313115},{},[313116],{"type":23,"value":229216},{"type":17,"tag":80,"props":313118,"children":313119},{},[313120,313124,313128],{"type":17,"tag":84,"props":313121,"children":313122},{},[313123],{"type":23,"value":249116},{"type":17,"tag":84,"props":313125,"children":313126},{},[313127],{"type":23,"value":249121},{"type":17,"tag":84,"props":313129,"children":313130},{},[313131],{"type":23,"value":249126},{"type":17,"tag":3414,"props":313133,"children":313134},{},[313135],{"type":17,"tag":29,"props":313136,"children":313137},{},[313138],{"type":23,"value":248538},{"type":17,"tag":29,"props":313140,"children":313141},{},[313142],{"type":23,"value":313143},"This is different from sync-based systems, which store data and emit events after batch updates.",{"type":17,"tag":68,"props":313145,"children":313147},{"id":313146},"what-changes-in-your-architecture",[313148],{"type":23,"value":313149},"What changes in your architecture",{"type":17,"tag":29,"props":313151,"children":313152},{},[313153],{"type":23,"value":313154},"Moving from polling to event-driven delivery removes entire categories of infrastructure.",{"type":17,"tag":239,"props":313156,"children":313158},{"id":313157},"before-polling",[313159],{"type":23,"value":313160},"Before (polling)",{"type":17,"tag":80,"props":313162,"children":313163},{},[313164,313169,313174,313179],{"type":17,"tag":84,"props":313165,"children":313166},{},[313167],{"type":23,"value":313168},"cron jobs per integration",{"type":17,"tag":84,"props":313170,"children":313171},{},[313172],{"type":23,"value":313173},"checkpoint storage",{"type":17,"tag":84,"props":313175,"children":313176},{},[313177],{"type":23,"value":313178},"pagination + deduplication logic",{"type":17,"tag":84,"props":313180,"children":313181},{},[313182],{"type":23,"value":313183},"retry and backoff systems",{"type":17,"tag":239,"props":313185,"children":313187},{"id":313186},"after-event-driven",[313188],{"type":23,"value":313189},"After (event-driven)",{"type":17,"tag":80,"props":313191,"children":313192},{},[313193,313198,313203],{"type":17,"tag":84,"props":313194,"children":313195},{},[313196],{"type":23,"value":313197},"webhook subscription",{"type":17,"tag":84,"props":313199,"children":313200},{},[313201],{"type":23,"value":313202},"event handler",{"type":17,"tag":84,"props":313204,"children":313205},{},[313206],{"type":23,"value":313207},"idempotent processing",{"type":17,"tag":239,"props":313209,"children":313211},{"id":313210},"impact-across-the-system",[313212],{"type":23,"value":313213},"Impact across the system",{"type":17,"tag":29,"props":313215,"children":313216},{},[313217],{"type":17,"tag":48,"props":313218,"children":313219},{},[313220],{"type":23,"value":313221},"Less infrastructure",{"type":17,"tag":80,"props":313223,"children":313224},{},[313225,313230,313235],{"type":17,"tag":84,"props":313226,"children":313227},{},[313228],{"type":23,"value":313229},"no schedulers",{"type":17,"tag":84,"props":313231,"children":313232},{},[313233],{"type":23,"value":313234},"no polling state",{"type":17,"tag":84,"props":313236,"children":313237},{},[313238],{"type":23,"value":313239},"no distributed retry logic",{"type":17,"tag":29,"props":313241,"children":313242},{},[313243],{"type":17,"tag":48,"props":313244,"children":313245},{},[313246],{"type":23,"value":313247},"Lower API usage",{"type":17,"tag":80,"props":313249,"children":313250},{},[313251,313256],{"type":17,"tag":84,"props":313252,"children":313253},{},[313254],{"type":23,"value":313255},"no empty polling requests",{"type":17,"tag":84,"props":313257,"children":313258},{},[313259],{"type":23,"value":313260},"usage tied to actual data changes",{"type":17,"tag":29,"props":313262,"children":313263},{},[313264],{"type":17,"tag":48,"props":313265,"children":313266},{},[313267],{"type":23,"value":313268},"Faster updates",{"type":17,"tag":80,"props":313270,"children":313271},{},[313272],{"type":17,"tag":84,"props":313273,"children":313274},{},[313275],{"type":23,"value":313276},"latency bounded by detection interval, not polling cadence",{"type":17,"tag":29,"props":313278,"children":313279},{},[313280],{"type":17,"tag":48,"props":313281,"children":313282},{},[313283],{"type":23,"value":313284},"Simpler integration model",{"type":17,"tag":80,"props":313286,"children":313287},{},[313288],{"type":17,"tag":84,"props":313289,"children":313290},{},[313291],{"type":23,"value":313292},"one event stream instead of multiple polling pipelines",{"type":17,"tag":68,"props":313294,"children":313296},{"id":313295},"developer-experience-shift",[313297],{"type":23,"value":313298},"Developer experience shift",{"type":17,"tag":29,"props":313300,"children":313301},{},[313302],{"type":23,"value":313303},"Polling requires building and maintaining infrastructure.",{"type":17,"tag":29,"props":313305,"children":313306},{},[313307],{"type":23,"value":313308},"Event-driven systems shift that responsibility into the integration layer.",{"type":17,"tag":29,"props":313310,"children":313311},{},[313312],{"type":23,"value":313313},"With virtual webhooks:",{"type":17,"tag":80,"props":313315,"children":313316},{},[313317,313322,313327],{"type":17,"tag":84,"props":313318,"children":313319},{},[313320],{"type":23,"value":313321},"change detection is standardized",{"type":17,"tag":84,"props":313323,"children":313324},{},[313325],{"type":23,"value":313326},"retries are handled centrally",{"type":17,"tag":84,"props":313328,"children":313329},{},[313330],{"type":23,"value":313331},"payloads follow a consistent schema",{"type":17,"tag":29,"props":313333,"children":313334},{},[313335],{"type":23,"value":313336},"Instead of writing polling logic for every integration, teams consume events through a single interface.",{"type":17,"tag":68,"props":313338,"children":313340},{"id":313339},"when-this-transition-makes-sense",[313341],{"type":23,"value":313342},"When this transition makes sense",{"type":17,"tag":29,"props":313344,"children":313345},{},[313346],{"type":23,"value":313347},"Teams typically move away from polling when:",{"type":17,"tag":80,"props":313349,"children":313350},{},[313351,313356,313361,313366],{"type":17,"tag":84,"props":313352,"children":313353},{},[313354],{"type":23,"value":313355},"integrations grow across multiple providers",{"type":17,"tag":84,"props":313357,"children":313358},{},[313359],{"type":23,"value":313360},"real-time or near real-time features are required",{"type":17,"tag":84,"props":313362,"children":313363},{},[313364],{"type":23,"value":313365},"polling infrastructure becomes difficult to maintain",{"type":17,"tag":84,"props":313367,"children":313368},{},[313369],{"type":23,"value":313370},"API rate limits become a constraint",{"type":17,"tag":29,"props":313372,"children":313373},{},[313374],{"type":23,"value":313375},"Virtual webhooks provide a path to event-driven systems without depending on native webhook support.",{"type":17,"tag":68,"props":313377,"children":313378},{"id":45643},[313379],{"type":23,"value":45646},{"type":17,"tag":29,"props":313381,"children":313382},{},[313383],{"type":23,"value":313384},"Polling is not just a data retrieval strategy. It is an infrastructure commitment.",{"type":17,"tag":29,"props":313386,"children":313387},{},[313388],{"type":23,"value":313389},"Replacing polling with event-driven delivery:",{"type":17,"tag":80,"props":313391,"children":313392},{},[313393,313398,313403],{"type":17,"tag":84,"props":313394,"children":313395},{},[313396],{"type":23,"value":313397},"removes distributed state",{"type":17,"tag":84,"props":313399,"children":313400},{},[313401],{"type":23,"value":313402},"reduces API usage",{"type":17,"tag":84,"props":313404,"children":313405},{},[313406],{"type":23,"value":313407},"simplifies system design",{"type":17,"tag":29,"props":313409,"children":313410},{},[313411],{"type":23,"value":313412},"Virtual webhooks make that transition possible across APIs that do not provide native events.",{"title":7,"searchDepth":1629,"depth":1629,"links":313414},[313415,313421,313424,313425,313430,313431,313432],{"id":312894,"depth":1629,"text":312897,"children":313416},[313417,313418,313419,313420],{"id":312910,"depth":1635,"text":312913},{"id":312967,"depth":1635,"text":228876},{"id":312990,"depth":1635,"text":312993},{"id":313009,"depth":1635,"text":313012},{"id":313037,"depth":1629,"text":313040,"children":313422},[313423],{"id":313053,"depth":1635,"text":313056},{"id":313082,"depth":1629,"text":313085},{"id":313146,"depth":1629,"text":313149,"children":313426},[313427,313428,313429],{"id":313157,"depth":1635,"text":313160},{"id":313186,"depth":1635,"text":313189},{"id":313210,"depth":1635,"text":313213},{"id":313295,"depth":1629,"text":313298},{"id":313339,"depth":1629,"text":313342},{"id":45643,"depth":1629,"text":45646},"content:blog:replacing_polling_with_event_driven_integrations_using_virtual_webhooks.md","blog/replacing_polling_with_event_driven_integrations_using_virtual_webhooks.md","blog/replacing_polling_with_event_driven_integrations_using_virtual_webhooks",{"_path":313437,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":313438,"description":313439,"img":313440,"date":313441,"tag":12,"body":313442,"_type":1677,"_id":314322,"_source":1679,"_file":314323,"_stem":314324,"_extension":1682},"/blog/kombo_vs_unified_which_unified_api_is_better_for_ai_native_real_time_saas","Kombo vs. Unified.to: which Unified API is better for AI-native, real-time SaaS?","Kombo and Unified.to serve different scopes of integration infrastructure. Kombo focuses on HR, ATS, and payroll systems, while Unified.to provides real-time...","https://s3.us-east-2.amazonaws.com/unified-article-images/kombo_vs_unified_which_unified_api_is_better_for_ai_native_real_time_saas-icon.webp","2025-06-04T00:00:00.000Z",{"type":14,"children":313443,"toc":314304},[313444,313449,313452,313460,313468,313475,313480,313485,313491,313685,313691,313699,313717,313724,313746,313758,313763,313770,313813,313819,313824,313834,313862,313867,313871,313976,313982,313987,313992,313997,314003,314008,314013,314031,314036,314042,314047,314052,314070,314075,314079,314084,314089,314112,314117,314121,314162,314166,314173,314196,314203,314221,314244,314248,314271,314276,314281],{"type":17,"tag":18,"props":313445,"children":313447},{"id":313446},"kombo-vs-unifiedto-which-unified-api-is-better-for-ai-native-real-time-saas",[313448],{"type":23,"value":313438},{"type":17,"tag":25,"props":313450,"children":313451},{},[],{"type":17,"tag":29,"props":313453,"children":313454},{},[313455],{"type":17,"tag":33,"props":313456,"children":313457},{},[313458],{"type":23,"value":313459},"June 4, 2025",{"type":17,"tag":29,"props":313461,"children":313462},{},[313463],{"type":17,"tag":6438,"props":313464,"children":313467},{"alt":313465,"src":313466},"Kombo.png","https://s3.us-east-2.amazonaws.com/unified-article-images/kombo_vs_unified_which_unified_api_is_better_for_ai_native_real_time_saas-0.png",[],{"type":17,"tag":29,"props":313469,"children":313470},{},[313471],{"type":17,"tag":33,"props":313472,"children":313473},{},[313474],{"type":23,"value":310436},{"type":17,"tag":29,"props":313476,"children":313477},{},[313478],{"type":23,"value":313479},"Kombo and Unified.to serve different scopes of integration infrastructure. Kombo focuses on HR, ATS, and payroll systems, while Unified.to provides real-time access to structured data across SaaS systems, designed for applications that require consistent schemas and multi-source data pipelines.",{"type":17,"tag":29,"props":313481,"children":313482},{},[313483],{"type":23,"value":313484},"Kombo is designed for integrating HR, ATS, and payroll systems. This comparison explains how Kombo and Unified.to differ in data coverage, real-time delivery, and how each platform fits into production systems.",{"type":17,"tag":68,"props":313486,"children":313488},{"id":313487},"tldr-unifiedto-vs-kombo",[313489],{"type":23,"value":313490},"TL;DR — Unified.to vs Kombo",{"type":17,"tag":7231,"props":313492,"children":313493},{},[313494,313521],{"type":17,"tag":7235,"props":313495,"children":313496},{},[313497],{"type":17,"tag":7239,"props":313498,"children":313499},{},[313500,313507,313514],{"type":17,"tag":7243,"props":313501,"children":313502},{},[313503],{"type":17,"tag":48,"props":313504,"children":313505},{},[313506],{"type":23,"value":87518},{"type":17,"tag":7243,"props":313508,"children":313509},{},[313510],{"type":17,"tag":48,"props":313511,"children":313512},{},[313513],{"type":23,"value":217},{"type":17,"tag":7243,"props":313515,"children":313516},{},[313517],{"type":17,"tag":48,"props":313518,"children":313519},{},[313520],{"type":23,"value":7978},{"type":17,"tag":7259,"props":313522,"children":313523},{},[313524,313545,313565,313585,313605,313625,313645,313665],{"type":17,"tag":7239,"props":313525,"children":313526},{},[313527,313535,313540],{"type":17,"tag":7266,"props":313528,"children":313529},{},[313530],{"type":17,"tag":48,"props":313531,"children":313532},{},[313533],{"type":23,"value":313534},"Integration focus",{"type":17,"tag":7266,"props":313536,"children":313537},{},[313538],{"type":23,"value":313539},"415+ APIs across 25 categories",{"type":17,"tag":7266,"props":313541,"children":313542},{},[313543],{"type":23,"value":313544},"HRIS, ATS, and Payroll only",{"type":17,"tag":7239,"props":313546,"children":313547},{},[313548,313555,313560],{"type":17,"tag":7266,"props":313549,"children":313550},{},[313551],{"type":17,"tag":48,"props":313552,"children":313553},{},[313554],{"type":23,"value":311330},{"type":17,"tag":7266,"props":313556,"children":313557},{},[313558],{"type":23,"value":313559},"Native + virtual webhooks (event-driven)",{"type":17,"tag":7266,"props":313561,"children":313562},{},[313563],{"type":23,"value":313564},"Polling + batch webhooks",{"type":17,"tag":7239,"props":313566,"children":313567},{},[313568,313575,313580],{"type":17,"tag":7266,"props":313569,"children":313570},{},[313571],{"type":17,"tag":48,"props":313572,"children":313573},{},[313574],{"type":23,"value":87624},{"type":17,"tag":7266,"props":313576,"children":313577},{},[313578],{"type":23,"value":313579},"Normalized across domains + passthrough/raw",{"type":17,"tag":7266,"props":313581,"children":313582},{},[313583],{"type":23,"value":313584},"Normalized HR schema + raw access",{"type":17,"tag":7239,"props":313586,"children":313587},{},[313588,313595,313600],{"type":17,"tag":7266,"props":313589,"children":313590},{},[313591],{"type":17,"tag":48,"props":313592,"children":313593},{},[313594],{"type":23,"value":310958},{"type":17,"tag":7266,"props":313596,"children":313597},{},[313598],{"type":23,"value":313599},"Built-in DB sync to Postgres, Mongo, etc.",{"type":17,"tag":7266,"props":313601,"children":313602},{},[313603],{"type":23,"value":313604},"Batch syncs; user fetch after webhook",{"type":17,"tag":7239,"props":313606,"children":313607},{},[313608,313615,313620],{"type":17,"tag":7266,"props":313609,"children":313610},{},[313611],{"type":17,"tag":48,"props":313612,"children":313613},{},[313614],{"type":23,"value":69493},{"type":17,"tag":7266,"props":313616,"children":313617},{},[313618],{"type":23,"value":313619},"GenAI category, RAG-ready, real-time agents",{"type":17,"tag":7266,"props":313621,"children":313622},{},[313623],{"type":23,"value":313624},"Indirect AI use via HR data",{"type":17,"tag":7239,"props":313626,"children":313627},{},[313628,313635,313640],{"type":17,"tag":7266,"props":313629,"children":313630},{},[313631],{"type":17,"tag":48,"props":313632,"children":313633},{},[313634],{"type":23,"value":69408},{"type":17,"tag":7266,"props":313636,"children":313637},{},[313638],{"type":23,"value":313639},"Zero-data architecture",{"type":17,"tag":7266,"props":313641,"children":313642},{},[313643],{"type":23,"value":313644},"Stores customer data (configurable)",{"type":17,"tag":7239,"props":313646,"children":313647},{},[313648,313655,313660],{"type":17,"tag":7266,"props":313649,"children":313650},{},[313651],{"type":17,"tag":48,"props":313652,"children":313653},{},[313654],{"type":23,"value":267529},{"type":17,"tag":7266,"props":313656,"children":313657},{},[313658],{"type":23,"value":313659},"SDKs, sandbox, real-time webhooks, OpenAPI",{"type":17,"tag":7266,"props":313661,"children":313662},{},[313663],{"type":23,"value":313664},"SDKs, sandbox, Kombo Connect UI",{"type":17,"tag":7239,"props":313666,"children":313667},{},[313668,313675,313680],{"type":17,"tag":7266,"props":313669,"children":313670},{},[313671],{"type":17,"tag":48,"props":313672,"children":313673},{},[313674],{"type":23,"value":502},{"type":17,"tag":7266,"props":313676,"children":313677},{},[313678],{"type":23,"value":313679},"AI-native apps with multi-domain data needs",{"type":17,"tag":7266,"props":313681,"children":313682},{},[313683],{"type":23,"value":313684},"HR-focused SaaS with deep HRIS logic",{"type":17,"tag":239,"props":313686,"children":313688},{"id":313687},"when-to-choose-kombo-vs-unifiedto",[313689],{"type":23,"value":313690},"When to choose Kombo vs Unified.to",{"type":17,"tag":29,"props":313692,"children":313693},{},[313694],{"type":17,"tag":48,"props":313695,"children":313696},{},[313697],{"type":23,"value":313698},"Choose Kombo if:",{"type":17,"tag":80,"props":313700,"children":313701},{},[313702,313707,313712],{"type":17,"tag":84,"props":313703,"children":313704},{},[313705],{"type":23,"value":313706},"You are building HR, ATS, or payroll-focused features",{"type":17,"tag":84,"props":313708,"children":313709},{},[313710],{"type":23,"value":313711},"Your product is centered on employment data workflows",{"type":17,"tag":84,"props":313713,"children":313714},{},[313715],{"type":23,"value":313716},"You need deep coverage within HR systems",{"type":17,"tag":29,"props":313718,"children":313719},{},[313720],{"type":17,"tag":48,"props":313721,"children":313722},{},[313723],{"type":23,"value":310523},{"type":17,"tag":80,"props":313725,"children":313726},{},[313727,313732,313736,313741],{"type":17,"tag":84,"props":313728,"children":313729},{},[313730],{"type":23,"value":313731},"Your product depends on data across multiple SaaS systems",{"type":17,"tag":84,"props":313733,"children":313734},{},[313735],{"type":23,"value":310536},{"type":17,"tag":84,"props":313737,"children":313738},{},[313739],{"type":23,"value":313740},"You are building AI features that rely on structured, cross-domain data",{"type":17,"tag":84,"props":313742,"children":313743},{},[313744],{"type":23,"value":313745},"You want to avoid storing customer data in a third-party integration layer",{"type":17,"tag":68,"props":313747,"children":313749},{"id":313748},"how-does-kombo-compare-to-unifiedto",[313750,313752,313757],{"type":23,"value":313751},"How does Kombo compare to ",{"type":17,"tag":133,"props":313753,"children":313755},{"href":42620,"rel":313754},[214],[313756],{"type":23,"value":217},{"type":23,"value":228656},{"type":17,"tag":29,"props":313759,"children":313760},{},[313761],{"type":23,"value":313762},"Kombo offers deep HR coverage. Unified.to supports real-time, cross-domain pipelines with normalized schemas and no data storage.",{"type":17,"tag":29,"props":313764,"children":313765},{},[313766],{"type":17,"tag":48,"props":313767,"children":313768},{},[313769],{"type":23,"value":310568},{"type":17,"tag":80,"props":313771,"children":313772},{},[313773,313784,313789,313794,313799,313804],{"type":17,"tag":84,"props":313774,"children":313775},{},[313776,313778,313782],{"type":23,"value":313777},"Real-time updates (native + [virtual ",{"type":17,"tag":133,"props":313779,"children":313780},{"href":4999},[313781],{"type":23,"value":5002},{"type":23,"value":313783},"](/blog/unlock_real_time_data_with_virtual_webhooks))",{"type":17,"tag":84,"props":313785,"children":313786},{},[313787],{"type":23,"value":313788},"415+ integrations across HR, CRM, ATS, Support, Marketing, and more",{"type":17,"tag":84,"props":313790,"children":313791},{},[313792],{"type":23,"value":313793},"Normalized schemas with passthrough + raw field support",{"type":17,"tag":84,"props":313795,"children":313796},{},[313797],{"type":23,"value":313798},"Database sync to Postgres, Mongo, MySQL",{"type":17,"tag":84,"props":313800,"children":313801},{},[313802],{"type":23,"value":313803},"Zero-data architecture: no stored tokens or payloads",{"type":17,"tag":84,"props":313805,"children":313806},{},[313807,313809],{"type":23,"value":313808},"GenAI-ready tools: structured context for copilots and ",{"type":17,"tag":133,"props":313810,"children":313811},{"href":5201},[313812],{"type":23,"value":5204},{"type":17,"tag":68,"props":313814,"children":313816},{"id":313815},"hr-depth-vs-saas-wide-breadth",[313817],{"type":23,"value":313818},"HR depth vs SaaS-wide breadth",{"type":17,"tag":29,"props":313820,"children":313821},{},[313822],{"type":23,"value":313823},"Kombo focuses on HR tech: HRIS, ATS, and Payroll. It offers solid schemas and fast integration delivery inside that niche.",{"type":17,"tag":29,"props":313825,"children":313826},{},[313827,313828],{"type":23,"value":254333},{"type":17,"tag":133,"props":313829,"children":313831},{"href":87026,"rel":313830},[214],[313832],{"type":23,"value":313833},"415+ APIs across 20 software categories:",{"type":17,"tag":80,"props":313835,"children":313836},{},[313837,313847,313857],{"type":17,"tag":84,"props":313838,"children":313839},{},[313840,313845],{"type":17,"tag":133,"props":313841,"children":313843},{"href":58209,"rel":313842},[214],[313844],{"type":23,"value":101761},{"type":23,"value":313846}," (e.g., Workday, Personio, BambooHR, Gusto, ADP, HiBob, SAP SuccessFactors)",{"type":17,"tag":84,"props":313848,"children":313849},{},[313850,313855],{"type":17,"tag":133,"props":313851,"children":313853},{"href":56812,"rel":313852},[214],[313854],{"type":23,"value":11756},{"type":23,"value":313856}," (e.g., Greenhouse, Lever, Ashby, Workable, JobAdder, SmartRecruiters)",{"type":17,"tag":84,"props":313858,"children":313859},{},[313860],{"type":23,"value":313861},"CRM, Support, Repos, File Storage, Calendar, and more",{"type":17,"tag":29,"props":313863,"children":313864},{},[313865],{"type":23,"value":313866},"You get one platform for customer, employee, and system data—streamed in real time.",{"type":17,"tag":239,"props":313868,"children":313869},{"id":310626},[313870],{"type":23,"value":310629},{"type":17,"tag":7231,"props":313872,"children":313873},{},[313874,313892],{"type":17,"tag":7235,"props":313875,"children":313876},{},[313877],{"type":17,"tag":7239,"props":313878,"children":313879},{},[313880,313884,313888],{"type":17,"tag":7243,"props":313881,"children":313882},{},[313883],{"type":23,"value":98853},{"type":17,"tag":7243,"props":313885,"children":313886},{},[313887],{"type":23,"value":7978},{"type":17,"tag":7243,"props":313889,"children":313890},{},[313891],{"type":23,"value":217},{"type":17,"tag":7259,"props":313893,"children":313894},{},[313895,313912,313927,313944,313960],{"type":17,"tag":7239,"props":313896,"children":313897},{},[313898,313902,313907],{"type":17,"tag":7266,"props":313899,"children":313900},{},[313901],{"type":23,"value":284187},{"type":17,"tag":7266,"props":313903,"children":313904},{},[313905],{"type":23,"value":313906},"HRIS, ATS, payroll",{"type":17,"tag":7266,"props":313908,"children":313909},{},[313910],{"type":23,"value":313911},"270+ integrations across SaaS categories",{"type":17,"tag":7239,"props":313913,"children":313914},{},[313915,313919,313923],{"type":17,"tag":7266,"props":313916,"children":313917},{},[313918],{"type":23,"value":244583},{"type":17,"tag":7266,"props":313920,"children":313921},{},[313922],{"type":23,"value":313564},{"type":17,"tag":7266,"props":313924,"children":313925},{},[313926],{"type":23,"value":87601},{"type":17,"tag":7239,"props":313928,"children":313929},{},[313930,313934,313939],{"type":17,"tag":7266,"props":313931,"children":313932},{},[313933],{"type":23,"value":87624},{"type":17,"tag":7266,"props":313935,"children":313936},{},[313937],{"type":23,"value":313938},"HR-focused normalization",{"type":17,"tag":7266,"props":313940,"children":313941},{},[313942],{"type":23,"value":313943},"Normalized schemas across domains",{"type":17,"tag":7239,"props":313945,"children":313946},{},[313947,313951,313956],{"type":17,"tag":7266,"props":313948,"children":313949},{},[313950],{"type":23,"value":310713},{"type":17,"tag":7266,"props":313952,"children":313953},{},[313954],{"type":23,"value":313955},"Requires post-webhook fetch",{"type":17,"tag":7266,"props":313957,"children":313958},{},[313959],{"type":23,"value":310723},{"type":17,"tag":7239,"props":313961,"children":313962},{},[313963,313967,313972],{"type":17,"tag":7266,"props":313964,"children":313965},{},[313966],{"type":23,"value":69408},{"type":17,"tag":7266,"props":313968,"children":313969},{},[313970],{"type":23,"value":313971},"Stores customer data",{"type":17,"tag":7266,"props":313973,"children":313974},{},[313975],{"type":23,"value":43678},{"type":17,"tag":68,"props":313977,"children":313979},{"id":313978},"real-time-by-design",[313980],{"type":23,"value":313981},"Real-time by design",{"type":17,"tag":29,"props":313983,"children":313984},{},[313985],{"type":23,"value":313986},"Kombo polls source systems every few hours and stores data in its own database. It sends webhooks when batch syncs complete.",{"type":17,"tag":29,"props":313988,"children":313989},{},[313990],{"type":23,"value":313991},"Unified.to delivers updates using native and virtual webhooks, with data retrieved directly from source APIs instead of relying on scheduled polling.",{"type":17,"tag":29,"props":313993,"children":313994},{},[313995],{"type":23,"value":313996},"Webhooks are configurable by object, field, and interval. You get structured events when data changes.",{"type":17,"tag":68,"props":313998,"children":314000},{"id":313999},"ai-native-foundation",[314001],{"type":23,"value":314002},"AI-native foundation",{"type":17,"tag":29,"props":314004,"children":314005},{},[314006],{"type":23,"value":314007},"Kombo provides HR data to downstream AI workflows, but lacks native AI features.",{"type":17,"tag":29,"props":314009,"children":314010},{},[314011],{"type":23,"value":314012},"Unified.to provides structured, real-time data for AI systems:",{"type":17,"tag":80,"props":314014,"children":314015},{},[314016,314021,314026],{"type":17,"tag":84,"props":314017,"children":314018},{},[314019],{"type":23,"value":314020},"GenAI category with prompt/model objects",{"type":17,"tag":84,"props":314022,"children":314023},{},[314024],{"type":23,"value":314025},"RAG-ready: pull context in real time from multiple APIs",{"type":17,"tag":84,"props":314027,"children":314028},{},[314029],{"type":23,"value":314030},"Stream to LLMs, vector stores, or dashboards",{"type":17,"tag":29,"props":314032,"children":314033},{},[314034],{"type":23,"value":314035},"Fresh, structured, cross-domain data for copilots and agents.",{"type":17,"tag":68,"props":314037,"children":314039},{"id":314038},"no-data-stored",[314040],{"type":23,"value":314041},"No data stored",{"type":17,"tag":29,"props":314043,"children":314044},{},[314045],{"type":23,"value":314046},"Kombo mirrors customer data into its own infra. Raw data access requires enabling storage of unnormalized payloads—which can include PII.",{"type":17,"tag":29,"props":314048,"children":314049},{},[314050],{"type":23,"value":314051},"Unified.to stores nothing:",{"type":17,"tag":80,"props":314053,"children":314054},{},[314055,314060,314065],{"type":17,"tag":84,"props":314056,"children":314057},{},[314058],{"type":23,"value":314059},"No payloads or tokens cached",{"type":17,"tag":84,"props":314061,"children":314062},{},[314063],{"type":23,"value":314064},"Credentials can live in your AWS Secrets Manager",{"type":17,"tag":84,"props":314066,"children":314067},{},[314068],{"type":23,"value":314069},"Complies with data minimization principles",{"type":17,"tag":29,"props":314071,"children":314072},{},[314073],{"type":23,"value":314074},"A leaner surface area for compliance-conscious teams.",{"type":17,"tag":68,"props":314076,"children":314077},{"id":267526},[314078],{"type":23,"value":267529},{"type":17,"tag":29,"props":314080,"children":314081},{},[314082],{"type":23,"value":314083},"Both platforms offer solid docs, SDKs, and a sandbox. Kombo provides a mock integration and \"Kombo Connect\" for auth.",{"type":17,"tag":29,"props":314085,"children":314086},{},[314087],{"type":23,"value":314088},"Unified.to adds:",{"type":17,"tag":80,"props":314090,"children":314091},{},[314092,314097,314102,314107],{"type":17,"tag":84,"props":314093,"children":314094},{},[314095],{"type":23,"value":314096},"Declarative API + OpenAPI schemas",{"type":17,"tag":84,"props":314098,"children":314099},{},[314100],{"type":23,"value":314101},"Fine-grained webhook config",{"type":17,"tag":84,"props":314103,"children":314104},{},[314105],{"type":23,"value":314106},"Sandbox + tester account",{"type":17,"tag":84,"props":314108,"children":314109},{},[314110],{"type":23,"value":314111},"Passthrough support and normalized schemas across every category",{"type":17,"tag":29,"props":314113,"children":314114},{},[314115],{"type":23,"value":314116},"Faster time to value. More consistency across APIs.",{"type":17,"tag":68,"props":314118,"children":314119},{"id":311874},[314120],{"type":23,"value":311877},{"type":17,"tag":29,"props":314122,"children":314123},{},[314124,314126,314130,314131,314135,314136,314140,314141,314146,314147,314151,314152,314156,314157,314161],{"type":23,"value":314125},"G2 isn't a spec sheet, but it's a useful signal for onboarding experience, support quality, and how 'surprising' integrations are once you hit edge cases. As of ",{"type":17,"tag":48,"props":314127,"children":314128},{},[314129],{"type":23,"value":231338},{"type":23,"value":11826},{"type":17,"tag":48,"props":314132,"children":314133},{},[314134],{"type":23,"value":7978},{"type":23,"value":311893},{"type":17,"tag":48,"props":314137,"children":314138},{},[314139],{"type":23,"value":311898},{"type":23,"value":70920},{"type":17,"tag":48,"props":314142,"children":314143},{},[314144],{"type":23,"value":314145},"60 reviews",{"type":23,"value":12561},{"type":17,"tag":48,"props":314148,"children":314149},{},[314150],{"type":23,"value":217},{"type":23,"value":311893},{"type":17,"tag":48,"props":314153,"children":314154},{},[314155],{"type":23,"value":311915},{"type":23,"value":70920},{"type":17,"tag":48,"props":314158,"children":314159},{},[314160],{"type":23,"value":311921},{"type":23,"value":54},{"type":17,"tag":239,"props":314163,"children":314164},{"id":250242},[314165],{"type":23,"value":7978},{"type":17,"tag":29,"props":314167,"children":314168},{},[314169],{"type":17,"tag":48,"props":314170,"children":314171},{},[314172],{"type":23,"value":311935},{"type":17,"tag":80,"props":314174,"children":314175},{},[314176,314181,314186,314191],{"type":17,"tag":84,"props":314177,"children":314178},{},[314179],{"type":23,"value":314180},"Very fast implementation and a developer-friendly setup experience.",{"type":17,"tag":84,"props":314182,"children":314183},{},[314184],{"type":23,"value":314185},"Support is repeatedly described as responsive and hands-on (including Slack-based support).",{"type":17,"tag":84,"props":314187,"children":314188},{},[314189],{"type":23,"value":314190},"Strong EU HR/ATS coverage and GDPR/compliance posture (DPAs called out as a plus).",{"type":17,"tag":84,"props":314192,"children":314193},{},[314194],{"type":23,"value":314195},"Request logs / monitoring called out as useful for tracking and troubleshooting.",{"type":17,"tag":29,"props":314197,"children":314198},{},[314199],{"type":17,"tag":48,"props":314200,"children":314201},{},[314202],{"type":23,"value":311961},{"type":17,"tag":80,"props":314204,"children":314205},{},[314206,314211,314216],{"type":17,"tag":84,"props":314207,"children":314208},{},[314209],{"type":23,"value":314210},"Some smaller ATS/HR systems are missing, though teams note Kombo will add systems when there's a real need.",{"type":17,"tag":84,"props":314212,"children":314213},{},[314214],{"type":23,"value":314215},"Provider-to-provider mapping differences still surface in edge cases (a reality of unified HR data), sometimes requiring custom handling.",{"type":17,"tag":84,"props":314217,"children":314218},{},[314219],{"type":23,"value":314220},"A few reviewers describe 'lock-in' to Kombo's normalized dataset, plus occasional bugs or slow load times.",{"type":17,"tag":29,"props":314222,"children":314223},{},[314224,314228,314230,314235,314237,314242],{"type":17,"tag":48,"props":314225,"children":314226},{},[314227],{"type":23,"value":311987},{"type":23,"value":314229},": Kombo's reviews read like a strong choice when you're ",{"type":17,"tag":48,"props":314231,"children":314232},{},[314233],{"type":23,"value":314234},"specifically focused on HRIS/ATS in Europe",{"type":23,"value":314236}," and you want a vendor that's tightly aligned to GDPR expectations. Unified's reviews line up with a platform built for ",{"type":17,"tag":48,"props":314238,"children":314239},{},[314240],{"type":23,"value":314241},"broader, production-grade integration infrastructure",{"type":23,"value":314243}," (multi-category, real-time delivery patterns, and strong observability), which matters once integrations become a core product capability.",{"type":17,"tag":239,"props":314245,"children":314246},{"id":7672},[314247],{"type":23,"value":7675},{"type":17,"tag":80,"props":314249,"children":314250},{},[314251,314256,314261,314266],{"type":17,"tag":84,"props":314252,"children":314253},{},[314254],{"type":23,"value":314255},"Kombo focuses on HR, ATS, and payroll integrations",{"type":17,"tag":84,"props":314257,"children":314258},{},[314259],{"type":23,"value":314260},"Unified.to provides real-time access to structured data across SaaS systems",{"type":17,"tag":84,"props":314262,"children":314263},{},[314264],{"type":23,"value":314265},"HR-focused APIs are suited for employment workflows, not multi-system pipelines",{"type":17,"tag":84,"props":314267,"children":314268},{},[314269],{"type":23,"value":314270},"Unified.to supports AI features that require consistent, cross-domain data",{"type":17,"tag":29,"props":314272,"children":314273},{},[314274],{"type":23,"value":314275},"If you're building HR-specific features and don't need real-time, Kombo is strong.",{"type":17,"tag":29,"props":314277,"children":314278},{},[314279],{"type":23,"value":314280},"But if you're shipping AI-native SaaS and need immediate access to structured data across business systems—Unified.to is built for it.",{"type":17,"tag":29,"props":314282,"children":314283},{},[314284,314293,314294,314302],{"type":17,"tag":133,"props":314285,"children":314287},{"href":1612,"rel":314286},[214],[314288],{"type":17,"tag":48,"props":314289,"children":314290},{},[314291],{"type":23,"value":314292},"Try Unified.to free for 30 days",{"type":23,"value":75890},{"type":17,"tag":133,"props":314295,"children":314297},{"href":1623,"rel":314296},[214],[314298],{"type":17,"tag":48,"props":314299,"children":314300},{},[314301],{"type":23,"value":226481},{"type":23,"value":314303}," to move faster with live integrations.",{"title":7,"searchDepth":1629,"depth":1629,"links":314305},[314306,314309,314311,314314,314315,314316,314317,314318],{"id":313487,"depth":1629,"text":313490,"children":314307},[314308],{"id":313687,"depth":1635,"text":313690},{"id":313748,"depth":1629,"text":314310},"How does Kombo compare to Unified.to?",{"id":313815,"depth":1629,"text":313818,"children":314312},[314313],{"id":310626,"depth":1635,"text":310629},{"id":313978,"depth":1629,"text":313981},{"id":313999,"depth":1629,"text":314002},{"id":314038,"depth":1629,"text":314041},{"id":267526,"depth":1629,"text":267529},{"id":311874,"depth":1629,"text":311877,"children":314319},[314320,314321],{"id":250242,"depth":1635,"text":7978},{"id":7672,"depth":1635,"text":7675},"content:blog:kombo_vs_unified_which_unified_api_is_better_for_ai_native_real_time_saas.md","blog/kombo_vs_unified_which_unified_api_is_better_for_ai_native_real_time_saas.md","blog/kombo_vs_unified_which_unified_api_is_better_for_ai_native_real_time_saas",{"_path":314326,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":314327,"description":314328,"img":314329,"date":314330,"tag":12,"body":314331,"_type":1677,"_id":315102,"_source":1679,"_file":315103,"_stem":315104,"_extension":1682},"/blog/stackone_vs_unified_which_unified_api_platform_powers_real_time_ai_driven_saas_best","StackOne vs. Unified.to: which Unified API platform powers real-time, AI-driven SaaS best?","StackOne and Unified.to both provide unified API infrastructure for AI applications, but they differ in how data is delivered and structured. StackOne focuses...","https://s3.us-east-2.amazonaws.com/unified-article-images/stackone_vs_unified_which_unified_api_platform_powers_real_time_ai_driven_saas_best-icon.webp","2025-06-01T00:00:00.000Z",{"type":14,"children":314332,"toc":315085},[314333,314338,314341,314349,314357,314364,314375,314380,314386,314619,314625,314633,314651,314658,314680,314689,314694,314701,314734,314740,314745,314750,314754,314845,314851,314856,314861,314867,314872,314877,314883,314888,314893,314899,314904,314909,314913,314955,314961,314968,314986,314993,315023,315032,315036,315058,315063],{"type":17,"tag":18,"props":314334,"children":314336},{"id":314335},"stackone-vs-unifiedto-which-unified-api-platform-powers-real-time-ai-driven-saas-best",[314337],{"type":23,"value":314327},{"type":17,"tag":25,"props":314339,"children":314340},{},[],{"type":17,"tag":29,"props":314342,"children":314343},{},[314344],{"type":17,"tag":33,"props":314345,"children":314346},{},[314347],{"type":23,"value":314348},"June 1, 2025",{"type":17,"tag":29,"props":314350,"children":314351},{},[314352],{"type":17,"tag":6438,"props":314353,"children":314356},{"alt":314354,"src":314355},"stackone.png","https://s3.us-east-2.amazonaws.com/unified-article-images/stackone_vs_unified_which_unified_api_platform_powers_real_time_ai_driven_saas_best-0.png",[],{"type":17,"tag":29,"props":314358,"children":314359},{},[314360],{"type":17,"tag":33,"props":314361,"children":314362},{},[314363],{"type":23,"value":310436},{"type":17,"tag":29,"props":314365,"children":314366},{},[314367,314369,314373],{"type":23,"value":314368},"StackOne and Unified.to both provide ",{"type":17,"tag":133,"props":314370,"children":314371},{"href":7691},[314372],{"type":23,"value":7459},{"type":23,"value":314374}," infrastructure for AI applications, but they differ in how data is delivered and structured. StackOne focuses on agent-based workflows and prebuilt actions, while Unified.to provides real-time access to normalized data across integrations, designed for applications that require structured data pipelines and direct access to source APIs.",{"type":17,"tag":29,"props":314376,"children":314377},{},[314378],{"type":23,"value":314379},"StackOne is designed for building AI-driven features using prebuilt actions and tool-calling integrations. This comparison explains how StackOne and Unified.to differ in data models, real-time delivery, AI workflows, and how each platform fits into production systems.",{"type":17,"tag":68,"props":314381,"children":314383},{"id":314382},"tldr-unifiedto-vs-stackone",[314384],{"type":23,"value":314385},"TL;DR — Unified.to vs StackOne",{"type":17,"tag":7231,"props":314387,"children":314388},{},[314389,314416],{"type":17,"tag":7235,"props":314390,"children":314391},{},[314392],{"type":17,"tag":7239,"props":314393,"children":314394},{},[314395,314402,314409],{"type":17,"tag":7243,"props":314396,"children":314397},{},[314398],{"type":17,"tag":48,"props":314399,"children":314400},{},[314401],{"type":23,"value":87518},{"type":17,"tag":7243,"props":314403,"children":314404},{},[314405],{"type":17,"tag":48,"props":314406,"children":314407},{},[314408],{"type":23,"value":217},{"type":17,"tag":7243,"props":314410,"children":314411},{},[314412],{"type":17,"tag":48,"props":314413,"children":314414},{},[314415],{"type":23,"value":226640},{"type":17,"tag":7259,"props":314417,"children":314418},{},[314419,314439,314459,314479,314499,314519,314539,314559,314579,314599],{"type":17,"tag":7239,"props":314420,"children":314421},{},[314422,314429,314434],{"type":17,"tag":7266,"props":314423,"children":314424},{},[314425],{"type":17,"tag":48,"props":314426,"children":314427},{},[314428],{"type":23,"value":293774},{"type":17,"tag":7266,"props":314430,"children":314431},{},[314432],{"type":23,"value":314433},"Deeply normalized schemas across 415+ integrations",{"type":17,"tag":7266,"props":314435,"children":314436},{},[314437],{"type":23,"value":314438},"16,000+ normalized fields across 200+ integrations",{"type":17,"tag":7239,"props":314440,"children":314441},{},[314442,314449,314454],{"type":17,"tag":7266,"props":314443,"children":314444},{},[314445],{"type":17,"tag":48,"props":314446,"children":314447},{},[314448],{"type":23,"value":311330},{"type":17,"tag":7266,"props":314450,"children":314451},{},[314452],{"type":23,"value":314453},"Native + virtual webhooks, no polling",{"type":17,"tag":7266,"props":314455,"children":314456},{},[314457],{"type":23,"value":314458},"Native + synthetic webhooks, 1-hour polling for synthetic",{"type":17,"tag":7239,"props":314460,"children":314461},{},[314462,314469,314474],{"type":17,"tag":7266,"props":314463,"children":314464},{},[314465],{"type":17,"tag":48,"props":314466,"children":314467},{},[314468],{"type":23,"value":69493},{"type":17,"tag":7266,"props":314470,"children":314471},{},[314472],{"type":23,"value":314473},"Real-time DB sync, structured records for RAG & agents",{"type":17,"tag":7266,"props":314475,"children":314476},{},[314477],{"type":23,"value":314478},"3,000+ prebuilt AI actions, optimized tool-calling SDKs",{"type":17,"tag":7239,"props":314480,"children":314481},{},[314482,314489,314494],{"type":17,"tag":7266,"props":314483,"children":314484},{},[314485],{"type":17,"tag":48,"props":314486,"children":314487},{},[314488],{"type":23,"value":69408},{"type":17,"tag":7266,"props":314490,"children":314491},{},[314492],{"type":23,"value":314493},"Zero data stored (no tokens, logs, or payloads)",{"type":17,"tag":7266,"props":314495,"children":314496},{},[314497],{"type":23,"value":314498},"No PII stored in synthetic polling; some logs/tokens retained",{"type":17,"tag":7239,"props":314500,"children":314501},{},[314502,314509,314514],{"type":17,"tag":7266,"props":314503,"children":314504},{},[314505],{"type":17,"tag":48,"props":314506,"children":314507},{},[314508],{"type":23,"value":267529},{"type":17,"tag":7266,"props":314510,"children":314511},{},[314512],{"type":23,"value":314513},"SDKs, declarative API, Connect Component",{"type":17,"tag":7266,"props":314515,"children":314516},{},[314517],{"type":23,"value":314518},"SDKs, AI SDKs, OpenAPI, Postman, Tool Planner",{"type":17,"tag":7239,"props":314520,"children":314521},{},[314522,314529,314534],{"type":17,"tag":7266,"props":314523,"children":314524},{},[314525],{"type":17,"tag":48,"props":314526,"children":314527},{},[314528],{"type":23,"value":283438},{"type":17,"tag":7266,"props":314530,"children":314531},{},[314532],{"type":23,"value":314533},"415+ integrations, 1,100+ objects",{"type":17,"tag":7266,"props":314535,"children":314536},{},[314537],{"type":23,"value":314538},"200+ integrations, 3,000+ AI actions",{"type":17,"tag":7239,"props":314540,"children":314541},{},[314542,314549,314554],{"type":17,"tag":7266,"props":314543,"children":314544},{},[314545],{"type":17,"tag":48,"props":314546,"children":314547},{},[314548],{"type":23,"value":310917},{"type":17,"tag":7266,"props":314550,"children":314551},{},[314552],{"type":23,"value":314553},"Real-time webhooks + DB sync (no batch jobs)",{"type":17,"tag":7266,"props":314555,"children":314556},{},[314557],{"type":23,"value":314558},"Real-time + batch sync, API + webhook access",{"type":17,"tag":7239,"props":314560,"children":314561},{},[314562,314569,314574],{"type":17,"tag":7266,"props":314563,"children":314564},{},[314565],{"type":17,"tag":48,"props":314566,"children":314567},{},[314568],{"type":23,"value":282581},{"type":17,"tag":7266,"props":314570,"children":314571},{},[314572],{"type":23,"value":314573},"Zero data storage, BYO secrets/logs, SOC 2, GDPR",{"type":17,"tag":7266,"props":314575,"children":314576},{},[314577],{"type":23,"value":314578},"SOC 2, HIPAA, GDPR; no-storage-by-default model",{"type":17,"tag":7239,"props":314580,"children":314581},{},[314582,314589,314594],{"type":17,"tag":7266,"props":314583,"children":314584},{},[314585],{"type":17,"tag":48,"props":314586,"children":314587},{},[314588],{"type":23,"value":292743},{"type":17,"tag":7266,"props":314590,"children":314591},{},[314592],{"type":23,"value":314593},"Starts at $350/mo, free trial available",{"type":17,"tag":7266,"props":314595,"children":314596},{},[314597],{"type":23,"value":314598},"Starts at $499/mo, no public free tier",{"type":17,"tag":7239,"props":314600,"children":314601},{},[314602,314609,314614],{"type":17,"tag":7266,"props":314603,"children":314604},{},[314605],{"type":17,"tag":48,"props":314606,"children":314607},{},[314608],{"type":23,"value":502},{"type":17,"tag":7266,"props":314610,"children":314611},{},[314612],{"type":23,"value":314613},"AI-native SaaS with structured data pipelines",{"type":17,"tag":7266,"props":314615,"children":314616},{},[314617],{"type":23,"value":314618},"AI agents needing broad tool access + tool planning engine",{"type":17,"tag":239,"props":314620,"children":314622},{"id":314621},"when-to-choose-stackone-vs-unifiedto",[314623],{"type":23,"value":314624},"When to choose StackOne vs Unified.to",{"type":17,"tag":29,"props":314626,"children":314627},{},[314628],{"type":17,"tag":48,"props":314629,"children":314630},{},[314631],{"type":23,"value":314632},"Choose StackOne if:",{"type":17,"tag":80,"props":314634,"children":314635},{},[314636,314641,314646],{"type":17,"tag":84,"props":314637,"children":314638},{},[314639],{"type":23,"value":314640},"You are building AI agents that rely on prebuilt actions and tool-calling",{"type":17,"tag":84,"props":314642,"children":314643},{},[314644],{"type":23,"value":314645},"You want a large catalog of predefined operations across integrations",{"type":17,"tag":84,"props":314647,"children":314648},{},[314649],{"type":23,"value":314650},"Your workflows prioritize action execution over structured data pipelines",{"type":17,"tag":29,"props":314652,"children":314653},{},[314654],{"type":17,"tag":48,"props":314655,"children":314656},{},[314657],{"type":23,"value":310523},{"type":17,"tag":80,"props":314659,"children":314660},{},[314661,314666,314671,314676],{"type":17,"tag":84,"props":314662,"children":314663},{},[314664],{"type":23,"value":314665},"Your product depends on structured, normalized data across integrations",{"type":17,"tag":84,"props":314667,"children":314668},{},[314669],{"type":23,"value":314670},"You need real-time data delivered directly from source APIs",{"type":17,"tag":84,"props":314672,"children":314673},{},[314674],{"type":23,"value":314675},"You are building AI features that require consistent data models",{"type":17,"tag":84,"props":314677,"children":314678},{},[314679],{"type":23,"value":313745},{"type":17,"tag":68,"props":314681,"children":314683},{"id":314682},"how-does-stackone-compare-to-unifiedto",[314684],{"type":17,"tag":48,"props":314685,"children":314686},{},[314687],{"type":23,"value":314688},"How does StackOne compare to Unified.to?",{"type":17,"tag":29,"props":314690,"children":314691},{},[314692],{"type":23,"value":314693},"StackOne is built for AI agents with a broad integration surface and 3,000+ prebuilt AI actions. Unified.to focuses on delivering real-time, structured data pipelines to help engineers and product teams build faster.",{"type":17,"tag":29,"props":314695,"children":314696},{},[314697],{"type":17,"tag":48,"props":314698,"children":314699},{},[314700],{"type":23,"value":311539},{"type":17,"tag":80,"props":314702,"children":314703},{},[314704,314709,314719,314724,314729],{"type":17,"tag":84,"props":314705,"children":314706},{},[314707],{"type":23,"value":314708},"Clean, normalized schemas across 415+ APIs",{"type":17,"tag":84,"props":314710,"children":314711},{},[314712,314714,314718],{"type":23,"value":314713},"Real-time delivery with native and [virtual ",{"type":17,"tag":133,"props":314715,"children":314716},{"href":4999},[314717],{"type":23,"value":5002},{"type":23,"value":88175},{"type":17,"tag":84,"props":314720,"children":314721},{},[314722],{"type":23,"value":314723},"Database Sync: stream structured data directly to Postgres, Mongo, and more",{"type":17,"tag":84,"props":314725,"children":314726},{},[314727],{"type":23,"value":314728},"Zero storage architecture (no logs, no payload caching)",{"type":17,"tag":84,"props":314730,"children":314731},{},[314732],{"type":23,"value":314733},"Transparent usage-based pricing",{"type":17,"tag":68,"props":314735,"children":314737},{"id":314736},"real-time-delivery-without-storage-or-sync-jobs",[314738],{"type":23,"value":314739},"Real-time delivery without storage or sync jobs",{"type":17,"tag":29,"props":314741,"children":314742},{},[314743],{"type":23,"value":314744},"StackOne supports real-time updates using native and synthetic webhooks, backed by polling where needed. Synthetic events run hourly by default and avoid PII caching, which helps with compliance.",{"type":17,"tag":29,"props":314746,"children":314747},{},[314748],{"type":23,"value":314749},"Unified.to delivers updates using native and virtual webhooks, with data retrieved directly from source APIs instead of relying on scheduled polling. Webhooks—native where possible, virtual otherwise—push fresh data in a normalized schema directly to your backend. No sync jobs. No queue logic. Just current, structured data delivered instantly.",{"type":17,"tag":239,"props":314751,"children":314752},{"id":310626},[314753],{"type":23,"value":310629},{"type":17,"tag":7231,"props":314755,"children":314756},{},[314757,314775],{"type":17,"tag":7235,"props":314758,"children":314759},{},[314760],{"type":17,"tag":7239,"props":314761,"children":314762},{},[314763,314767,314771],{"type":17,"tag":7243,"props":314764,"children":314765},{},[314766],{"type":23,"value":98853},{"type":17,"tag":7243,"props":314768,"children":314769},{},[314770],{"type":23,"value":226640},{"type":17,"tag":7243,"props":314772,"children":314773},{},[314774],{"type":23,"value":217},{"type":17,"tag":7259,"props":314776,"children":314777},{},[314778,314795,314811,314829],{"type":17,"tag":7239,"props":314779,"children":314780},{},[314781,314786,314791],{"type":17,"tag":7266,"props":314782,"children":314783},{},[314784],{"type":23,"value":314785},"Data focus",{"type":17,"tag":7266,"props":314787,"children":314788},{},[314789],{"type":23,"value":314790},"Actions and tool-calling",{"type":17,"tag":7266,"props":314792,"children":314793},{},[314794],{"type":23,"value":310672},{"type":17,"tag":7239,"props":314796,"children":314797},{},[314798,314802,314807],{"type":17,"tag":7266,"props":314799,"children":314800},{},[314801],{"type":23,"value":244583},{"type":17,"tag":7266,"props":314803,"children":314804},{},[314805],{"type":23,"value":314806},"Webhooks + synthetic polling",{"type":17,"tag":7266,"props":314808,"children":314809},{},[314810],{"type":23,"value":87601},{"type":17,"tag":7239,"props":314812,"children":314813},{},[314814,314819,314824],{"type":17,"tag":7266,"props":314815,"children":314816},{},[314817],{"type":23,"value":314818},"Schema approach",{"type":17,"tag":7266,"props":314820,"children":314821},{},[314822],{"type":23,"value":314823},"Pre-normalized fields for actions",{"type":17,"tag":7266,"props":314825,"children":314826},{},[314827],{"type":23,"value":314828},"Deeply normalized schemas across integrations",{"type":17,"tag":7239,"props":314830,"children":314831},{},[314832,314836,314841],{"type":17,"tag":7266,"props":314833,"children":314834},{},[314835],{"type":23,"value":69408},{"type":17,"tag":7266,"props":314837,"children":314838},{},[314839],{"type":23,"value":314840},"Partial storage depending on configuration",{"type":17,"tag":7266,"props":314842,"children":314843},{},[314844],{"type":23,"value":43678},{"type":17,"tag":68,"props":314846,"children":314848},{"id":314847},"schema-normalization-without-custom-mapping",[314849],{"type":23,"value":314850},"Schema normalization without custom mapping",{"type":17,"tag":29,"props":314852,"children":314853},{},[314854],{"type":23,"value":314855},"StackOne standardizes over 16,000 fields across more than 200 apps. Its pre-normalized schemas reduce token load and improve LLM performance. For example, fetching a Workday record consumes 25x fewer tokens than using the native SOAP API.",{"type":17,"tag":29,"props":314857,"children":314858},{},[314859],{"type":23,"value":314860},"Unified.to provides deeply normalized schemas for over 1,100 objects across 415+ integrations. You get structured outputs with standard fields and enums. Custom fields and passthrough data are available, but you don't need to build per-connector logic to get started.",{"type":17,"tag":68,"props":314862,"children":314864},{"id":314863},"data-pipelines-that-fit-ai-native-products",[314865],{"type":23,"value":314866},"Data pipelines that fit AI-native products",{"type":17,"tag":29,"props":314868,"children":314869},{},[314870],{"type":23,"value":314871},"StackOne offers structured payloads for AI agents, RAG, and vector search workflows. It includes prebuilt actions and optimized schemas to help reduce model context usage. Tool-calling integrations work with OpenAI, LangChain, CrewAI, and more.",{"type":17,"tag":29,"props":314873,"children":314874},{},[314875],{"type":23,"value":314876},"Unified.to supports AI-native use cases through real-time streaming into databases. With Database Sync, you can ingest structured records from CRMs, ATSs, HR platforms, and more—directly into your internal data systems. No ETL. No vendor lock-in.",{"type":17,"tag":68,"props":314878,"children":314880},{"id":314879},"zero-data-stored-zero-vendor-lock-in",[314881],{"type":23,"value":314882},"Zero data stored. Zero vendor lock-in.",{"type":17,"tag":29,"props":314884,"children":314885},{},[314886],{"type":23,"value":314887},"StackOne offers a \"no-storage-by-default\" architecture. For synthetic events, it avoids storing PII and supports flexible hosting (e.g., self-hosted, region-based deployments). Tokens and logs may still be stored depending on config.",{"type":17,"tag":29,"props":314889,"children":314890},{},[314891],{"type":23,"value":314892},"Unified.to never stores end-user data, logs, or tokens—by design. You control secrets, observability, and data flow. Credentials can be managed via your own vault, and delivery methods include API, webhook, or direct DB sync.",{"type":17,"tag":68,"props":314894,"children":314896},{"id":314895},"built-for-developers-not-just-agents",[314897],{"type":23,"value":314898},"Built for developers, not just agents",{"type":17,"tag":29,"props":314900,"children":314901},{},[314902],{"type":23,"value":314903},"StackOne provides AI SDKs (Python, Node.js) and developer SDKs (Java, PHP, Ruby, TypeScript) along with a Postman collection and OpenAPI spec. Its AI SDKs support tool-calling, parameter mapping, and multi-tenant routing.",{"type":17,"tag":29,"props":314905,"children":314906},{},[314907],{"type":23,"value":314908},"Unified.to offers SDKs across major languages, a clean declarative API, and an embedded Connect Component. Developers integrate once and scale fast. No need to maintain schema maps or webhook handlers for each platform. Data is real-time by default.",{"type":17,"tag":68,"props":314910,"children":314911},{"id":311874},[314912],{"type":23,"value":311877},{"type":17,"tag":29,"props":314914,"children":314915},{},[314916,314918,314922,314923,314927,314928,314933,314934,314939,314940,314944,314945,314949,314950,314954],{"type":23,"value":314917},"G2 isn't a spec sheet, but it's a useful signal for onboarding experience, support quality, and how often teams hit surprises in production. As of ",{"type":17,"tag":48,"props":314919,"children":314920},{},[314921],{"type":23,"value":231338},{"type":23,"value":11826},{"type":17,"tag":48,"props":314924,"children":314925},{},[314926],{"type":23,"value":226640},{"type":23,"value":311893},{"type":17,"tag":48,"props":314929,"children":314930},{},[314931],{"type":23,"value":314932},"4.6/5",{"type":23,"value":70920},{"type":17,"tag":48,"props":314935,"children":314936},{},[314937],{"type":23,"value":314938},"42 verified reviews",{"type":23,"value":12561},{"type":17,"tag":48,"props":314941,"children":314942},{},[314943],{"type":23,"value":217},{"type":23,"value":311893},{"type":17,"tag":48,"props":314946,"children":314947},{},[314948],{"type":23,"value":311915},{"type":23,"value":70920},{"type":17,"tag":48,"props":314951,"children":314952},{},[314953],{"type":23,"value":311921},{"type":23,"value":54},{"type":17,"tag":239,"props":314956,"children":314958},{"id":314957},"stackone-themes-from-g2-reviews",[314959],{"type":23,"value":314960},"StackOne (themes from G2 reviews)",{"type":17,"tag":29,"props":314962,"children":314963},{},[314964],{"type":17,"tag":48,"props":314965,"children":314966},{},[314967],{"type":23,"value":311935},{"type":17,"tag":80,"props":314969,"children":314970},{},[314971,314976,314981],{"type":17,"tag":84,"props":314972,"children":314973},{},[314974],{"type":23,"value":314975},"Support is consistently called out as responsive and helpful.",{"type":17,"tag":84,"props":314977,"children":314978},{},[314979],{"type":23,"value":314980},"'Easy integrations' and straightforward implementation show up repeatedly, with docs helping teams move quickly.",{"type":17,"tag":84,"props":314982,"children":314983},{},[314984],{"type":23,"value":314985},"Time savings from prebuilt integrations is a common thread.",{"type":17,"tag":29,"props":314987,"children":314988},{},[314989],{"type":17,"tag":48,"props":314990,"children":314991},{},[314992],{"type":23,"value":311961},{"type":17,"tag":80,"props":314994,"children":314995},{},[314996,315008,315018],{"type":17,"tag":84,"props":314997,"children":314998},{},[314999,315001,315006],{"type":23,"value":315000},"Not enough clarity on ",{"type":17,"tag":48,"props":315002,"children":315003},{},[315004],{"type":23,"value":315005},"field mappings and breaking changes",{"type":23,"value":315007},", creating extra effort during integration maintenance.",{"type":17,"tag":84,"props":315009,"children":315010},{},[315011,315016],{"type":17,"tag":48,"props":315012,"children":315013},{},[315014],{"type":23,"value":315015},"Limited integrations / limited sandbox testing",{"type":23,"value":315017}," for some use cases, which can slow evaluation or force workarounds.",{"type":17,"tag":84,"props":315019,"children":315020},{},[315021],{"type":23,"value":315022},"Missing features around mappings/filtering, and occasional bugs or SDK delays that can cause breakages during updates.",{"type":17,"tag":29,"props":315024,"children":315025},{},[315026,315030],{"type":17,"tag":48,"props":315027,"children":315028},{},[315029],{"type":23,"value":311987},{"type":23,"value":315031},": StackOne's reviews read like 'fast to get going, great support,' with the main friction showing up later around mapping transparency and change management. Unified's reviews emphasize production readiness through observability, real-time delivery patterns, and tight support loops once integrations become core product infrastructure.",{"type":17,"tag":239,"props":315033,"children":315034},{"id":7672},[315035],{"type":23,"value":7675},{"type":17,"tag":80,"props":315037,"children":315038},{},[315039,315044,315049,315053],{"type":17,"tag":84,"props":315040,"children":315041},{},[315042],{"type":23,"value":315043},"StackOne focuses on AI agent workflows and prebuilt actions",{"type":17,"tag":84,"props":315045,"children":315046},{},[315047],{"type":23,"value":315048},"Unified.to provides real-time access to normalized data across integrations",{"type":17,"tag":84,"props":315050,"children":315051},{},[315052],{"type":23,"value":311129},{"type":17,"tag":84,"props":315054,"children":315055},{},[315056],{"type":23,"value":315057},"Unified.to removes the need for sync jobs and custom data pipelines",{"type":17,"tag":29,"props":315059,"children":315060},{},[315061],{"type":23,"value":315062},"Unified.to is designed for applications that require real-time data, normalized schemas, and structured data pipelines across integrations.",{"type":17,"tag":29,"props":315064,"children":315065},{},[315066,315074,315075,315083],{"type":17,"tag":133,"props":315067,"children":315069},{"href":1612,"rel":315068},[214],[315070],{"type":17,"tag":48,"props":315071,"children":315072},{},[315073],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":315076,"children":315078},{"href":1623,"rel":315077},[214],[315079],{"type":17,"tag":48,"props":315080,"children":315081},{},[315082],{"type":23,"value":226481},{"type":23,"value":315084}," to see how fast you can go from integration request to production.",{"title":7,"searchDepth":1629,"depth":1629,"links":315086},[315087,315090,315091,315094,315095,315096,315097,315098],{"id":314382,"depth":1629,"text":314385,"children":315088},[315089],{"id":314621,"depth":1635,"text":314624},{"id":314682,"depth":1629,"text":314688},{"id":314736,"depth":1629,"text":314739,"children":315092},[315093],{"id":310626,"depth":1635,"text":310629},{"id":314847,"depth":1629,"text":314850},{"id":314863,"depth":1629,"text":314866},{"id":314879,"depth":1629,"text":314882},{"id":314895,"depth":1629,"text":314898},{"id":311874,"depth":1629,"text":311877,"children":315099},[315100,315101],{"id":314957,"depth":1635,"text":314960},{"id":7672,"depth":1635,"text":7675},"content:blog:stackone_vs_unified_which_unified_api_platform_powers_real_time_ai_driven_saas_best.md","blog/stackone_vs_unified_which_unified_api_platform_powers_real_time_ai_driven_saas_best.md","blog/stackone_vs_unified_which_unified_api_platform_powers_real_time_ai_driven_saas_best",{"_path":315106,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":315107,"description":315108,"img":315109,"date":315110,"tag":12,"body":315111,"_type":1677,"_id":315986,"_source":1679,"_file":315987,"_stem":315988,"_extension":1682},"/blog/nylas_vs_unified_which_unified_api_powers_ai_ready_saas_better","Nylas vs. Unified.to: which Unified API powers AI-ready SaaS better?","Nylas and Unified.to serve different roles in the integration stack. Nylas focuses on embedding email, calendar, and contact functionality, while Unified.to...","https://s3.us-east-2.amazonaws.com/unified-article-images/nylas_vs_unified_which_unified_api_powers_ai_ready_saas_better-icon.png","2025-05-30T00:00:00.000Z",{"type":14,"children":315112,"toc":315967},[315113,315118,315121,315129,315137,315144,315149,315154,315160,315352,315358,315366,315384,315391,315413,315425,315430,315437,315483,315489,315494,315499,315532,315537,315541,315646,315652,315657,315663,315668,315673,315692,315698,315703,315708,315726,315731,315736,315741,315759,315765,315770,315774,315799,315803,315845,315851,315858,315871,315878,315891,315910,315915,315919,315940,315945],{"type":17,"tag":18,"props":315114,"children":315116},{"id":315115},"nylas-vs-unifiedto-which-unified-api-powers-ai-ready-saas-better",[315117],{"type":23,"value":315107},{"type":17,"tag":25,"props":315119,"children":315120},{},[],{"type":17,"tag":29,"props":315122,"children":315123},{},[315124],{"type":17,"tag":33,"props":315125,"children":315126},{},[315127],{"type":23,"value":315128},"May 30, 2025",{"type":17,"tag":29,"props":315130,"children":315131},{},[315132],{"type":17,"tag":6438,"props":315133,"children":315136},{"alt":315134,"src":315135},"nylas.png","https://s3.us-east-2.amazonaws.com/unified-article-images/nylas_vs_unified_which_unified_api_powers_ai_ready_saas_better-0.png",[],{"type":17,"tag":29,"props":315138,"children":315139},{},[315140],{"type":17,"tag":33,"props":315141,"children":315142},{},[315143],{"type":23,"value":310436},{"type":17,"tag":29,"props":315145,"children":315146},{},[315147],{"type":23,"value":315148},"Nylas and Unified.to serve different roles in the integration stack. Nylas focuses on embedding email, calendar, and contact functionality, while Unified.to provides real-time access to structured data across SaaS systems, designed for applications that require consistent schemas and multi-source data pipelines.",{"type":17,"tag":29,"props":315150,"children":315151},{},[315152],{"type":23,"value":315153},"Nylas is designed for embedding email, calendar, and contact functionality into applications. This comparison explains how Nylas and Unified.to differ in data coverage, real-time delivery, and how each platform fits into production systems.",{"type":17,"tag":68,"props":315155,"children":315157},{"id":315156},"tldr-unifiedto-vs-nylas",[315158],{"type":23,"value":315159},"TL;DR — Unified.to vs Nylas",{"type":17,"tag":7231,"props":315161,"children":315162},{},[315163,315190],{"type":17,"tag":7235,"props":315164,"children":315165},{},[315166],{"type":17,"tag":7239,"props":315167,"children":315168},{},[315169,315176,315183],{"type":17,"tag":7243,"props":315170,"children":315171},{},[315172],{"type":17,"tag":48,"props":315173,"children":315174},{},[315175],{"type":23,"value":87518},{"type":17,"tag":7243,"props":315177,"children":315178},{},[315179],{"type":17,"tag":48,"props":315180,"children":315181},{},[315182],{"type":23,"value":217},{"type":17,"tag":7243,"props":315184,"children":315185},{},[315186],{"type":17,"tag":48,"props":315187,"children":315188},{},[315189],{"type":23,"value":226656},{"type":17,"tag":7259,"props":315191,"children":315192},{},[315193,315213,315232,315252,315272,315292,315312,315332],{"type":17,"tag":7239,"props":315194,"children":315195},{},[315196,315203,315208],{"type":17,"tag":7266,"props":315197,"children":315198},{},[315199],{"type":17,"tag":48,"props":315200,"children":315201},{},[315202],{"type":23,"value":313534},{"type":17,"tag":7266,"props":315204,"children":315205},{},[315206],{"type":23,"value":315207},"300+ APIs across 20+ verticals",{"type":17,"tag":7266,"props":315209,"children":315210},{},[315211],{"type":23,"value":315212},"Email, calendar, contacts (ECC) only",{"type":17,"tag":7239,"props":315214,"children":315215},{},[315216,315223,315227],{"type":17,"tag":7266,"props":315217,"children":315218},{},[315219],{"type":17,"tag":48,"props":315220,"children":315221},{},[315222],{"type":23,"value":311330},{"type":17,"tag":7266,"props":315224,"children":315225},{},[315226],{"type":23,"value":87601},{"type":17,"tag":7266,"props":315228,"children":315229},{},[315230],{"type":23,"value":315231},"Webhooks + hybrid sync model",{"type":17,"tag":7239,"props":315233,"children":315234},{},[315235,315242,315247],{"type":17,"tag":7266,"props":315236,"children":315237},{},[315238],{"type":17,"tag":48,"props":315239,"children":315240},{},[315241],{"type":23,"value":87624},{"type":17,"tag":7266,"props":315243,"children":315244},{},[315245],{"type":23,"value":315246},"Deeply normalized across all categories",{"type":17,"tag":7266,"props":315248,"children":315249},{},[315250],{"type":23,"value":315251},"Normalized ECC schemas",{"type":17,"tag":7239,"props":315253,"children":315254},{},[315255,315262,315267],{"type":17,"tag":7266,"props":315256,"children":315257},{},[315258],{"type":17,"tag":48,"props":315259,"children":315260},{},[315261],{"type":23,"value":310958},{"type":17,"tag":7266,"props":315263,"children":315264},{},[315265],{"type":23,"value":315266},"Built-in sync to customer DBs",{"type":17,"tag":7266,"props":315268,"children":315269},{},[315270],{"type":23,"value":315271},"No DB sync; webhook then fetch",{"type":17,"tag":7239,"props":315273,"children":315274},{},[315275,315282,315287],{"type":17,"tag":7266,"props":315276,"children":315277},{},[315278],{"type":17,"tag":48,"props":315279,"children":315280},{},[315281],{"type":23,"value":69493},{"type":17,"tag":7266,"props":315283,"children":315284},{},[315285],{"type":23,"value":315286},"AI-ready infra + GenAI tools",{"type":17,"tag":7266,"props":315288,"children":315289},{},[315290],{"type":23,"value":315291},"ExtractAI (email-specific)",{"type":17,"tag":7239,"props":315293,"children":315294},{},[315295,315302,315307],{"type":17,"tag":7266,"props":315296,"children":315297},{},[315298],{"type":17,"tag":48,"props":315299,"children":315300},{},[315301],{"type":23,"value":69408},{"type":17,"tag":7266,"props":315303,"children":315304},{},[315305],{"type":23,"value":315306},"Zero-data architecture; no storage or caching",{"type":17,"tag":7266,"props":315308,"children":315309},{},[315310],{"type":23,"value":315311},"Stores encrypted email + token data",{"type":17,"tag":7239,"props":315313,"children":315314},{},[315315,315322,315327],{"type":17,"tag":7266,"props":315316,"children":315317},{},[315318],{"type":17,"tag":48,"props":315319,"children":315320},{},[315321],{"type":23,"value":267529},{"type":17,"tag":7266,"props":315323,"children":315324},{},[315325],{"type":23,"value":315326},"SDKs, logs, real-time observability",{"type":17,"tag":7266,"props":315328,"children":315329},{},[315330],{"type":23,"value":315331},"SDKs for ECC, solid docs",{"type":17,"tag":7239,"props":315333,"children":315334},{},[315335,315342,315347],{"type":17,"tag":7266,"props":315336,"children":315337},{},[315338],{"type":17,"tag":48,"props":315339,"children":315340},{},[315341],{"type":23,"value":502},{"type":17,"tag":7266,"props":315343,"children":315344},{},[315345],{"type":23,"value":315346},"AI-native apps with real-time, multi-source data",{"type":17,"tag":7266,"props":315348,"children":315349},{},[315350],{"type":23,"value":315351},"Communication-focused apps with ECC needs",{"type":17,"tag":239,"props":315353,"children":315355},{"id":315354},"when-to-choose-nylas-vs-unifiedto",[315356],{"type":23,"value":315357},"When to choose Nylas vs Unified.to",{"type":17,"tag":29,"props":315359,"children":315360},{},[315361],{"type":17,"tag":48,"props":315362,"children":315363},{},[315364],{"type":23,"value":315365},"Choose Nylas if:",{"type":17,"tag":80,"props":315367,"children":315368},{},[315369,315374,315379],{"type":17,"tag":84,"props":315370,"children":315371},{},[315372],{"type":23,"value":315373},"You are building email, calendar, or scheduling features",{"type":17,"tag":84,"props":315375,"children":315376},{},[315377],{"type":23,"value":315378},"Your product depends on inbox workflows or communication APIs",{"type":17,"tag":84,"props":315380,"children":315381},{},[315382],{"type":23,"value":315383},"You need deep functionality within ECC (email, calendar, contacts) systems",{"type":17,"tag":29,"props":315385,"children":315386},{},[315387],{"type":17,"tag":48,"props":315388,"children":315389},{},[315390],{"type":23,"value":310523},{"type":17,"tag":80,"props":315392,"children":315393},{},[315394,315399,315404,315409],{"type":17,"tag":84,"props":315395,"children":315396},{},[315397],{"type":23,"value":315398},"Your product depends on data across multiple SaaS systems (CRM, HR, ATS, etc.)",{"type":17,"tag":84,"props":315400,"children":315401},{},[315402],{"type":23,"value":315403},"You need real-time data delivered from source APIs",{"type":17,"tag":84,"props":315405,"children":315406},{},[315407],{"type":23,"value":315408},"You are building AI features that require structured, multi-source data",{"type":17,"tag":84,"props":315410,"children":315411},{},[315412],{"type":23,"value":313745},{"type":17,"tag":68,"props":315414,"children":315416},{"id":315415},"how-does-nylas-compare-to-unifiedto",[315417,315419,315424],{"type":23,"value":315418},"How does Nylas compare to ",{"type":17,"tag":133,"props":315420,"children":315422},{"href":42620,"rel":315421},[214],[315423],{"type":23,"value":217},{"type":23,"value":228656},{"type":17,"tag":29,"props":315426,"children":315427},{},[315428],{"type":23,"value":315429},"Nylas supports rich email, calendar, and contact use cases. Unified.to supports AI-ready, real-time data delivery across 20+ verticals.",{"type":17,"tag":29,"props":315431,"children":315432},{},[315433],{"type":17,"tag":48,"props":315434,"children":315435},{},[315436],{"type":23,"value":310568},{"type":17,"tag":80,"props":315438,"children":315439},{},[315440,315450,315463,315468,315473,315478],{"type":17,"tag":84,"props":315441,"children":315442},{},[315443,315445,315449],{"type":23,"value":315444},"Real-time updates (via native + [virtual ",{"type":17,"tag":133,"props":315446,"children":315447},{"href":4999},[315448],{"type":23,"value":5002},{"type":23,"value":313783},{"type":17,"tag":84,"props":315451,"children":315452},{},[315453,315455,315461],{"type":23,"value":315454},"300+ ",{"type":17,"tag":133,"props":315456,"children":315459},{"href":315457,"rel":315458},"https://unified.to/integrations/",[214],[315460],{"type":23,"value":312964},{"type":23,"value":315462}," across HR, CRM, ATS, Accounting, Support, and more",{"type":17,"tag":84,"props":315464,"children":315465},{},[315466],{"type":23,"value":315467},"Deeply normalized schemas with passthrough and custom field support",{"type":17,"tag":84,"props":315469,"children":315470},{},[315471],{"type":23,"value":315472},"Database sync: structured data into Postgres, Mongo, BigQuery, Snowflake, etc.",{"type":17,"tag":84,"props":315474,"children":315475},{},[315476],{"type":23,"value":315477},"Zero-data architecture: no customer data or tokens stored",{"type":17,"tag":84,"props":315479,"children":315480},{},[315481],{"type":23,"value":315482},"Generative AI tools: stream data to agents or vector stores in real time",{"type":17,"tag":68,"props":315484,"children":315486},{"id":315485},"breadth-vs-depth-communications-vs-business-systems",[315487],{"type":23,"value":315488},"Breadth vs depth: communications vs. business systems",{"type":17,"tag":29,"props":315490,"children":315491},{},[315492],{"type":23,"value":315493},"Nylas offers deep ECC (email, calendar, contacts) coverage—ideal for building communication-heavy products. It supports Gmail, Microsoft 365, Outlook, iCloud, Yahoo, and more.",{"type":17,"tag":29,"props":315495,"children":315496},{},[315497],{"type":23,"value":315498},"Unified.to supports integrations across 20+ SaaS verticals:",{"type":17,"tag":80,"props":315500,"children":315501},{},[315502,315512,315517,315522,315527],{"type":17,"tag":84,"props":315503,"children":315504},{},[315505,315510],{"type":17,"tag":133,"props":315506,"children":315508},{"href":76521,"rel":315507},[214],[315509],{"type":23,"value":24559},{"type":23,"value":315511}," (e.g., Slack, Discord, Intercom, Microsoft Teams, Gmail, Outlook, Webex, Freshdesk, RingCentral, IMAP, Circle.so)",{"type":17,"tag":84,"props":315513,"children":315514},{},[315515],{"type":23,"value":315516},"HRIS (e.g., Workday, BambooHR)",{"type":17,"tag":84,"props":315518,"children":315519},{},[315520],{"type":23,"value":315521},"CRM (e.g., Salesforce, HubSpot)",{"type":17,"tag":84,"props":315523,"children":315524},{},[315525],{"type":23,"value":315526},"ATS (e.g., Greenhouse, Lever)",{"type":17,"tag":84,"props":315528,"children":315529},{},[315530],{"type":23,"value":315531},"Support, Payments, Repos, Storage, and more",{"type":17,"tag":29,"props":315533,"children":315534},{},[315535],{"type":23,"value":315536},"One platform to unify customer, employee, and system data—in real time.",{"type":17,"tag":239,"props":315538,"children":315539},{"id":310626},[315540],{"type":23,"value":310629},{"type":17,"tag":7231,"props":315542,"children":315543},{},[315544,315562],{"type":17,"tag":7235,"props":315545,"children":315546},{},[315547],{"type":17,"tag":7239,"props":315548,"children":315549},{},[315550,315554,315558],{"type":17,"tag":7243,"props":315551,"children":315552},{},[315553],{"type":23,"value":98853},{"type":17,"tag":7243,"props":315555,"children":315556},{},[315557],{"type":23,"value":226656},{"type":17,"tag":7243,"props":315559,"children":315560},{},[315561],{"type":23,"value":217},{"type":17,"tag":7259,"props":315563,"children":315564},{},[315565,315582,315598,315614,315630],{"type":17,"tag":7239,"props":315566,"children":315567},{},[315568,315572,315577],{"type":17,"tag":7266,"props":315569,"children":315570},{},[315571],{"type":23,"value":284187},{"type":17,"tag":7266,"props":315573,"children":315574},{},[315575],{"type":23,"value":315576},"Email, calendar, contacts",{"type":17,"tag":7266,"props":315578,"children":315579},{},[315580],{"type":23,"value":315581},"300+ integrations across SaaS categories",{"type":17,"tag":7239,"props":315583,"children":315584},{},[315585,315589,315594],{"type":17,"tag":7266,"props":315586,"children":315587},{},[315588],{"type":23,"value":293774},{"type":17,"tag":7266,"props":315590,"children":315591},{},[315592],{"type":23,"value":315593},"ECC-focused schemas",{"type":17,"tag":7266,"props":315595,"children":315596},{},[315597],{"type":23,"value":313943},{"type":17,"tag":7239,"props":315599,"children":315600},{},[315601,315605,315610],{"type":17,"tag":7266,"props":315602,"children":315603},{},[315604],{"type":23,"value":244583},{"type":17,"tag":7266,"props":315606,"children":315607},{},[315608],{"type":23,"value":315609},"Webhooks + sync jobs",{"type":17,"tag":7266,"props":315611,"children":315612},{},[315613],{"type":23,"value":87601},{"type":17,"tag":7239,"props":315615,"children":315616},{},[315617,315621,315626],{"type":17,"tag":7266,"props":315618,"children":315619},{},[315620],{"type":23,"value":310713},{"type":17,"tag":7266,"props":315622,"children":315623},{},[315624],{"type":23,"value":315625},"Requires ingestion logic",{"type":17,"tag":7266,"props":315627,"children":315628},{},[315629],{"type":23,"value":310723},{"type":17,"tag":7239,"props":315631,"children":315632},{},[315633,315637,315642],{"type":17,"tag":7266,"props":315634,"children":315635},{},[315636],{"type":23,"value":69408},{"type":17,"tag":7266,"props":315638,"children":315639},{},[315640],{"type":23,"value":315641},"Stores encrypted data and tokens",{"type":17,"tag":7266,"props":315643,"children":315644},{},[315645],{"type":23,"value":43678},{"type":17,"tag":68,"props":315647,"children":315649},{"id":315648},"real-time-by-default-not-by-sync-job",[315650],{"type":23,"value":315651},"Real-time by default, not by sync job",{"type":17,"tag":29,"props":315653,"children":315654},{},[315655],{"type":23,"value":315656},"Nylas supports webhook events, but some data syncs still rely on scheduled jobs and delay tolerances. Unified.to delivers updates using native and virtual webhooks, with data retrieved directly from source APIs instead of relying on scheduled sync jobs.",{"type":17,"tag":68,"props":315658,"children":315660},{"id":315659},"database-sync-for-ai-agents-dashboards-and-analytics",[315661],{"type":23,"value":315662},"Database sync for AI agents, dashboards, and analytics",{"type":17,"tag":29,"props":315664,"children":315665},{},[315666],{"type":23,"value":315667},"Nylas sends webhook alerts, but you'll still need to fetch payloads and ingest them manually.",{"type":17,"tag":29,"props":315669,"children":315670},{},[315671],{"type":23,"value":315672},"Unified.to delivers normalized records directly to your database:",{"type":17,"tag":80,"props":315674,"children":315675},{},[315676,315681],{"type":17,"tag":84,"props":315677,"children":315678},{},[315679],{"type":23,"value":315680},"Built-in sync to Postgres, MongoDB, MySQL, Snowflake, and more",{"type":17,"tag":84,"props":315682,"children":315683},{},[315684,315686,315690],{"type":23,"value":315685},"Ideal for powering dashboards, AI copilots, and ",{"type":17,"tag":133,"props":315687,"children":315688},{"href":5201},[315689],{"type":23,"value":5204},{"type":23,"value":315691}," workflows",{"type":17,"tag":68,"props":315693,"children":315695},{"id":315694},"ai-ready-structure-for-context-rich-agents",[315696],{"type":23,"value":315697},"AI-ready structure for context-rich agents",{"type":17,"tag":29,"props":315699,"children":315700},{},[315701],{"type":23,"value":315702},"Nylas offers ExtractAI, a tool for pulling structured order and logistics data from emails. It's helpful for e-commerce and transactional email parsing.",{"type":17,"tag":29,"props":315704,"children":315705},{},[315706],{"type":23,"value":315707},"Unified.to provides structured, real-time data across systems:",{"type":17,"tag":80,"props":315709,"children":315710},{},[315711,315716,315721],{"type":17,"tag":84,"props":315712,"children":315713},{},[315714],{"type":23,"value":315715},"Structured, real-time data from 300+ systems",{"type":17,"tag":84,"props":315717,"children":315718},{},[315719],{"type":23,"value":315720},"Clean schemas across domains",{"type":17,"tag":84,"props":315722,"children":315723},{},[315724],{"type":23,"value":315725},"Database-ready delivery for agents and AI tools",{"type":17,"tag":29,"props":315727,"children":315728},{},[315729],{"type":23,"value":315730},"If you're building AI with multi-source context, Unified.to is the stronger fit.",{"type":17,"tag":68,"props":315732,"children":315734},{"id":315733},"zero-data-architecture",[315735],{"type":23,"value":313639},{"type":17,"tag":29,"props":315737,"children":315738},{},[315739],{"type":23,"value":315740},"Nylas stores encrypted customer data and access tokens. Unified.to stores nothing:",{"type":17,"tag":80,"props":315742,"children":315743},{},[315744,315749,315754],{"type":17,"tag":84,"props":315745,"children":315746},{},[315747],{"type":23,"value":315748},"No tokens, payloads, or email content cached",{"type":17,"tag":84,"props":315750,"children":315751},{},[315752],{"type":23,"value":315753},"All data proxied live through customer-owned infra",{"type":17,"tag":84,"props":315755,"children":315756},{},[315757],{"type":23,"value":315758},"Better for compliance, lower vendor risk",{"type":17,"tag":68,"props":315760,"children":315762},{"id":315761},"developer-first-experience",[315763],{"type":23,"value":315764},"Developer-first experience",{"type":17,"tag":29,"props":315766,"children":315767},{},[315768],{"type":23,"value":315769},"Nylas provides SDKs for Node, Python, Ruby, and Java, plus solid docs for email workflows.",{"type":17,"tag":29,"props":315771,"children":315772},{},[315773],{"type":23,"value":311539},{"type":17,"tag":80,"props":315775,"children":315776},{},[315777,315789,315794],{"type":17,"tag":84,"props":315778,"children":315779},{},[315780,315787],{"type":17,"tag":133,"props":315781,"children":315784},{"href":315782,"rel":315783},"https://docs.unified.to/reference/sdks",[214],[315785],{"type":23,"value":315786},"SDKs",{"type":23,"value":315788}," in 7+ languages",{"type":17,"tag":84,"props":315790,"children":315791},{},[315792],{"type":23,"value":315793},"OpenAPI schemas and real-time logs",{"type":17,"tag":84,"props":315795,"children":315796},{},[315797],{"type":23,"value":315798},"Fast integration turnaround with responsive support",{"type":17,"tag":68,"props":315800,"children":315801},{"id":311874},[315802],{"type":23,"value":311877},{"type":17,"tag":29,"props":315804,"children":315805},{},[315806,315808,315812,315813,315817,315818,315823,315824,315829,315830,315834,315835,315839,315840,315844],{"type":23,"value":315807},"G2 isn't a spec sheet, but it's a useful signal for onboarding friction, support quality, and how predictable the API is once you're in production. As of ",{"type":17,"tag":48,"props":315809,"children":315810},{},[315811],{"type":23,"value":231338},{"type":23,"value":11826},{"type":17,"tag":48,"props":315814,"children":315815},{},[315816],{"type":23,"value":226656},{"type":23,"value":311893},{"type":17,"tag":48,"props":315819,"children":315820},{},[315821],{"type":23,"value":315822},"4.0/5",{"type":23,"value":70920},{"type":17,"tag":48,"props":315825,"children":315826},{},[315827],{"type":23,"value":315828},"59 verified reviews",{"type":23,"value":12561},{"type":17,"tag":48,"props":315831,"children":315832},{},[315833],{"type":23,"value":217},{"type":23,"value":311893},{"type":17,"tag":48,"props":315836,"children":315837},{},[315838],{"type":23,"value":311915},{"type":23,"value":70920},{"type":17,"tag":48,"props":315841,"children":315842},{},[315843],{"type":23,"value":311921},{"type":23,"value":54},{"type":17,"tag":239,"props":315846,"children":315848},{"id":315847},"nylas-themes-from-g2-reviews",[315849],{"type":23,"value":315850},"Nylas (themes from G2 reviews)",{"type":17,"tag":29,"props":315852,"children":315853},{},[315854],{"type":17,"tag":48,"props":315855,"children":315856},{},[315857],{"type":23,"value":311935},{"type":17,"tag":80,"props":315859,"children":315860},{},[315861,315866],{"type":17,"tag":84,"props":315862,"children":315863},{},[315864],{"type":23,"value":315865},"API quality for email integration, and 'it works' for common provider coverage (Google/Microsoft).",{"type":17,"tag":84,"props":315867,"children":315868},{},[315869],{"type":23,"value":315870},"Straightforward setup and onboarding for basic use cases.",{"type":17,"tag":29,"props":315872,"children":315873},{},[315874],{"type":17,"tag":48,"props":315875,"children":315876},{},[315877],{"type":23,"value":311961},{"type":17,"tag":80,"props":315879,"children":315880},{},[315881,315886],{"type":17,"tag":84,"props":315882,"children":315883},{},[315884],{"type":23,"value":315885},"Documentation can be technical and hard to navigate, with a steeper learning curve than expected.",{"type":17,"tag":84,"props":315887,"children":315888},{},[315889],{"type":23,"value":315890},"Troubleshooting and feature depth can be frustrating, some reviews mention limited tools/features (including v3 API tooling) and unclear docs in places.",{"type":17,"tag":29,"props":315892,"children":315893},{},[315894,315896,315901,315903,315908],{"type":23,"value":315895},"How to interpret this: Nylas reviews read like a solid choice when you specifically need ",{"type":17,"tag":48,"props":315897,"children":315898},{},[315899],{"type":23,"value":315900},"email/calendar API plumbing",{"type":23,"value":315902}," and want a focused platform, with the main friction being documentation and debugging. Unified reviews read like a platform teams lean on when integrations are ",{"type":17,"tag":48,"props":315904,"children":315905},{},[315906],{"type":23,"value":315907},"core infrastructure",{"type":23,"value":315909}," and they need strong observability and fast vendor support loops across many systems, not just one category.",{"type":17,"tag":29,"props":315911,"children":315912},{},[315913],{"type":23,"value":315914},"If you're embedding inbox features, Nylas is a strong ECC platform.",{"type":17,"tag":239,"props":315916,"children":315917},{"id":7672},[315918],{"type":23,"value":7675},{"type":17,"tag":80,"props":315920,"children":315921},{},[315922,315927,315931,315936],{"type":17,"tag":84,"props":315923,"children":315924},{},[315925],{"type":23,"value":315926},"Nylas focuses on email, calendar, and contact integrations",{"type":17,"tag":84,"props":315928,"children":315929},{},[315930],{"type":23,"value":314260},{"type":17,"tag":84,"props":315932,"children":315933},{},[315934],{"type":23,"value":315935},"ECC APIs are suited for communication workflows, not multi-system data pipelines",{"type":17,"tag":84,"props":315937,"children":315938},{},[315939],{"type":23,"value":314270},{"type":17,"tag":29,"props":315941,"children":315942},{},[315943],{"type":23,"value":315944},"But if you're building a product that depends on clean, real-time data across business systems—Unified.to gives you a broader foundation for AI-ready features.",{"type":17,"tag":29,"props":315946,"children":315947},{},[315948,315956,315957,315965],{"type":17,"tag":133,"props":315949,"children":315951},{"href":1612,"rel":315950},[214],[315952],{"type":17,"tag":48,"props":315953,"children":315954},{},[315955],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":315958,"children":315960},{"href":1623,"rel":315959},[214],[315961],{"type":17,"tag":48,"props":315962,"children":315963},{},[315964],{"type":23,"value":226481},{"type":23,"value":315966}," to see how fast you can ship live integrations.",{"title":7,"searchDepth":1629,"depth":1629,"links":315968},[315969,315972,315974,315977,315978,315979,315980,315981,315982],{"id":315156,"depth":1629,"text":315159,"children":315970},[315971],{"id":315354,"depth":1635,"text":315357},{"id":315415,"depth":1629,"text":315973},"How does Nylas compare to Unified.to?",{"id":315485,"depth":1629,"text":315488,"children":315975},[315976],{"id":310626,"depth":1635,"text":310629},{"id":315648,"depth":1629,"text":315651},{"id":315659,"depth":1629,"text":315662},{"id":315694,"depth":1629,"text":315697},{"id":315733,"depth":1629,"text":313639},{"id":315761,"depth":1629,"text":315764},{"id":311874,"depth":1629,"text":311877,"children":315983},[315984,315985],{"id":315847,"depth":1635,"text":315850},{"id":7672,"depth":1635,"text":7675},"content:blog:nylas_vs_unified_which_unified_api_powers_ai_ready_saas_better.md","blog/nylas_vs_unified_which_unified_api_powers_ai_ready_saas_better.md","blog/nylas_vs_unified_which_unified_api_powers_ai_ready_saas_better",{"_path":315990,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":315991,"description":315992,"img":315993,"date":315110,"tag":12,"body":315994,"_type":1677,"_id":316738,"_source":1679,"_file":316739,"_stem":316740,"_extension":1682},"/blog/why_unified_apis_shouldnt_store_your_customer_data","Why Unified APIs Shouldn't Store Your Customer Data","Unified APIs should not store customer data because it increases security risk, expands compliance scope, and creates vendor lock-in. A zero-storage...","https://s3.us-east-2.amazonaws.com/unified-article-images/why_unified_apis_shouldnt_store_your_customer_data-icon.webp",{"type":14,"children":315995,"toc":316722},[315996,316001,316004,316011,316019,316024,316029,316035,316043,316061,316069,316092,316098,316103,316109,316119,316124,316167,316173,316178,316196,316201,316207,316212,316230,316235,316240,316246,316251,316279,316284,316290,316303,316321,316326,316332,316337,316347,316365,316370,316375,316379,316385,316463,316469,316657,316661,316689,316694,316699],{"type":17,"tag":18,"props":315997,"children":315999},{"id":315998},"why-unified-apis-shouldnt-store-your-customer-data",[316000],{"type":23,"value":315991},{"type":17,"tag":25,"props":316002,"children":316003},{},[],{"type":17,"tag":29,"props":316005,"children":316006},{},[316007],{"type":17,"tag":33,"props":316008,"children":316009},{},[316010],{"type":23,"value":315128},{"type":17,"tag":29,"props":316012,"children":316013},{},[316014],{"type":17,"tag":6438,"props":316015,"children":316018},{"alt":316016,"src":316017},"storing_data_unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/why_unified_apis_shouldnt_store_your_customer_data-0.png",[],{"type":17,"tag":29,"props":316020,"children":316021},{},[316022],{"type":23,"value":316023},"Unified APIs should not store customer data because it increases security risk, expands compliance scope, and creates vendor lock-in. A zero-storage architecture keeps data in your infrastructure, reduces liability, and gives you full control over how data is accessed and used.",{"type":17,"tag":29,"props":316025,"children":316026},{},[316027],{"type":23,"value":316028},"Unified APIs are a core part of modern SaaS architecture, but how they handle customer data has direct implications for security, compliance, and product control. This article explains why storing customer data inside an integration layer introduces risk, and how a zero-storage architecture changes that model.",{"type":17,"tag":239,"props":316030,"children":316032},{"id":316031},"when-should-a-unified-api-store-customer-data",[316033],{"type":23,"value":316034},"When should a unified API store customer data?",{"type":17,"tag":29,"props":316036,"children":316037},{},[316038],{"type":17,"tag":48,"props":316039,"children":316040},{},[316041],{"type":23,"value":316042},"Data storage may make sense if:",{"type":17,"tag":80,"props":316044,"children":316045},{},[316046,316051,316056],{"type":17,"tag":84,"props":316047,"children":316048},{},[316049],{"type":23,"value":316050},"You need a vendor-managed cache for analytics or reporting",{"type":17,"tag":84,"props":316052,"children":316053},{},[316054],{"type":23,"value":316055},"Your product relies on historical snapshots managed outside your infrastructure",{"type":17,"tag":84,"props":316057,"children":316058},{},[316059],{"type":23,"value":316060},"You accept shared responsibility for stored third-party data",{"type":17,"tag":29,"props":316062,"children":316063},{},[316064],{"type":17,"tag":48,"props":316065,"children":316066},{},[316067],{"type":23,"value":316068},"Avoid storing customer data if:",{"type":17,"tag":80,"props":316070,"children":316071},{},[316072,316077,316082,316087],{"type":17,"tag":84,"props":316073,"children":316074},{},[316075],{"type":23,"value":316076},"Your product handles sensitive or regulated data",{"type":17,"tag":84,"props":316078,"children":316079},{},[316080],{"type":23,"value":316081},"You want full control over data access and lifecycle",{"type":17,"tag":84,"props":316083,"children":316084},{},[316085],{"type":23,"value":316086},"You are building real-time or AI-driven features",{"type":17,"tag":84,"props":316088,"children":316089},{},[316090],{"type":23,"value":316091},"You want to reduce compliance scope and vendor lock-in",{"type":17,"tag":239,"props":316093,"children":316095},{"id":316094},"do-unified-apis-store-customer-data",[316096],{"type":23,"value":316097},"Do unified APIs store customer data?",{"type":17,"tag":29,"props":316099,"children":316100},{},[316101],{"type":23,"value":316102},"Some unified APIs store customer data, including cached API responses, logs, and access tokens, to simplify data access and performance. This can increase security and compliance risk by creating additional copies of sensitive data outside your infrastructure. Other architectures avoid storage entirely, retrieving data in real time instead, which reduces risk and keeps data under your control.",{"type":17,"tag":68,"props":316104,"children":316106},{"id":316105},"the-hidden-risk-of-stored-data",[316107],{"type":23,"value":316108},"The Hidden Risk of Stored Data",{"type":17,"tag":29,"props":316110,"children":316111},{},[316112,316113,316117],{"type":23,"value":9603},{"type":17,"tag":133,"props":316114,"children":316115},{"href":7691},[316116],{"type":23,"value":7459},{"type":23,"value":316118}," and iPass providers store some or all of your customers' data, from access tokens to payload logs to cached API responses.",{"type":17,"tag":29,"props":316120,"children":316121},{},[316122],{"type":23,"value":316123},"This is convenient for the vendor, but it comes at a cost to you:",{"type":17,"tag":80,"props":316125,"children":316126},{},[316127,316137,316147,316157],{"type":17,"tag":84,"props":316128,"children":316129},{},[316130,316135],{"type":17,"tag":48,"props":316131,"children":316132},{},[316133],{"type":23,"value":316134},"Expanded attack surface",{"type":23,"value":316136},": A breach of the integration provider's database can expose your customer data.",{"type":17,"tag":84,"props":316138,"children":316139},{},[316140,316145],{"type":17,"tag":48,"props":316141,"children":316142},{},[316143],{"type":23,"value":316144},"Compliance burden",{"type":23,"value":316146},": GDPR, CCPA, and SOC 2 all treat stored third-party data as your responsibility and legal liability.",{"type":17,"tag":84,"props":316148,"children":316149},{},[316150,316155],{"type":17,"tag":48,"props":316151,"children":316152},{},[316153],{"type":23,"value":316154},"Data governance drift",{"type":23,"value":316156},": Every copy of customer data adds complexity to your security posture.",{"type":17,"tag":84,"props":316158,"children":316159},{},[316160,316165],{"type":17,"tag":48,"props":316161,"children":316162},{},[316163],{"type":23,"value":316164},"Vendor lock-in",{"type":23,"value":316166},": Migrating away becomes harder when another system holds your data.",{"type":17,"tag":239,"props":316168,"children":316170},{"id":316169},"what-is-a-zero-data-architecture",[316171],{"type":23,"value":316172},"What is a zero-data architecture?",{"type":17,"tag":29,"props":316174,"children":316175},{},[316176],{"type":23,"value":316177},"A zero-data architecture means the integration layer does not store customer data, tokens, or API responses. Instead:",{"type":17,"tag":80,"props":316179,"children":316180},{},[316181,316186,316191],{"type":17,"tag":84,"props":316182,"children":316183},{},[316184],{"type":23,"value":316185},"Requests are proxied directly to the source system",{"type":17,"tag":84,"props":316187,"children":316188},{},[316189],{"type":23,"value":316190},"Data is returned in real time",{"type":17,"tag":84,"props":316192,"children":316193},{},[316194],{"type":23,"value":316195},"Storage happens only inside your infrastructure",{"type":17,"tag":29,"props":316197,"children":316198},{},[316199],{"type":23,"value":316200},"This model removes the need for vendor-managed caches and eliminates duplicate copies of customer data.",{"type":17,"tag":68,"props":316202,"children":316204},{"id":316203},"unifiedto-no-storage-no-surprises",[316205],{"type":23,"value":316206},"Unified.to: No Storage, No Surprises",{"type":17,"tag":29,"props":316208,"children":316209},{},[316210],{"type":23,"value":316211},"Unified.to uses a zero-data architecture where customer data is not stored or cached. That means:",{"type":17,"tag":80,"props":316213,"children":316214},{},[316215,316220,316225],{"type":17,"tag":84,"props":316216,"children":316217},{},[316218],{"type":23,"value":316219},"No payloads cached",{"type":17,"tag":84,"props":316221,"children":316222},{},[316223],{"type":23,"value":316224},"No tokens stored (optional)",{"type":17,"tag":84,"props":316226,"children":316227},{},[316228],{"type":23,"value":316229},"No customer data logged",{"type":17,"tag":29,"props":316231,"children":316232},{},[316233],{"type":23,"value":316234},"API requests are sent in real time from the source system to your application. Data is not stored, cached, or indexed by the integration layer.",{"type":17,"tag":29,"props":316236,"children":316237},{},[316238],{"type":23,"value":316239},"This model reduces the amount of third-party data stored outside your infrastructure, which lowers security exposure and simplifies compliance requirements.",{"type":17,"tag":239,"props":316241,"children":316243},{"id":316242},"easier-path-to-compliance",[316244],{"type":23,"value":316245},"Easier Path to Compliance",{"type":17,"tag":29,"props":316247,"children":316248},{},[316249],{"type":23,"value":316250},"By avoiding data storage, Unified.to simplifies your path to certifications and audits:",{"type":17,"tag":80,"props":316252,"children":316253},{},[316254,316259,316264,316269,316274],{"type":17,"tag":84,"props":316255,"children":316256},{},[316257],{"type":23,"value":316258},"SOC 2 Type II compliant",{"type":17,"tag":84,"props":316260,"children":316261},{},[316262],{"type":23,"value":316263},"GDPR-ready as a sub-processor",{"type":17,"tag":84,"props":316265,"children":316266},{},[316267],{"type":23,"value":316268},"Supports customer-side AWS Secrets Manager for credential storage",{"type":17,"tag":84,"props":316270,"children":316271},{},[316272],{"type":23,"value":316273},"Offers IP whitelisting and webhook signing for access control",{"type":17,"tag":84,"props":316275,"children":316276},{},[316277],{"type":23,"value":316278},"Provides auditability through shipped logs (e.g., Datadog)",{"type":17,"tag":29,"props":316280,"children":316281},{},[316282],{"type":23,"value":316283},"Instead of inheriting a third-party's data lifecycle and breach risk, you stay in full control.",{"type":17,"tag":239,"props":316285,"children":316287},{"id":316286},"designed-for-least-privilege",[316288],{"type":23,"value":316289},"Designed for Least Privilege",{"type":17,"tag":29,"props":316291,"children":316292},{},[316293,316294,316301],{"type":23,"value":266912},{"type":17,"tag":133,"props":316295,"children":316298},{"href":316296,"rel":316297},"https://unified.to/blog/how_to_register_a_google_developer_app_and_get_oauth_2_credentials",[214],[316299],{"type":23,"value":316300},"supports OAuth 2",{"type":23,"value":316302}," and customer-managed credentials. You can:",{"type":17,"tag":80,"props":316304,"children":316305},{},[316306,316311,316316],{"type":17,"tag":84,"props":316307,"children":316308},{},[316309],{"type":23,"value":316310},"Keep all access tokens inside your AWS Secrets Manager",{"type":17,"tag":84,"props":316312,"children":316313},{},[316314],{"type":23,"value":316315},"Scope integrations to the exact permissions you need",{"type":17,"tag":84,"props":316317,"children":316318},{},[316319],{"type":23,"value":316320},"Revoke access without triggering backend cleanup or data deletion processes",{"type":17,"tag":29,"props":316322,"children":316323},{},[316324],{"type":23,"value":316325},"This aligns with a modern least-privilege security model: only store what you need, only expose what you must, and avoid third-party storage entirely.",{"type":17,"tag":239,"props":316327,"children":316329},{"id":316328},"a-more-secure-way-to-build",[316330],{"type":23,"value":316331},"A More Secure Way to Build",{"type":17,"tag":29,"props":316333,"children":316334},{},[316335],{"type":23,"value":316336},"Storing customer data should be a deliberate choice, not a default side effect of using an integration vendor.",{"type":17,"tag":29,"props":316338,"children":316339},{},[316340,316345],{"type":17,"tag":133,"props":316341,"children":316343},{"href":42620,"rel":316342},[214],[316344],{"type":23,"value":217},{"type":23,"value":316346}," flips the model:",{"type":17,"tag":80,"props":316348,"children":316349},{},[316350,316355,316360],{"type":17,"tag":84,"props":316351,"children":316352},{},[316353],{"type":23,"value":316354},"No cache to compromise",{"type":17,"tag":84,"props":316356,"children":316357},{},[316358],{"type":23,"value":316359},"No logs to leak",{"type":17,"tag":84,"props":316361,"children":316362},{},[316363],{"type":23,"value":316364},"No backups to sanitize",{"type":17,"tag":29,"props":316366,"children":316367},{},[316368],{"type":23,"value":316369},"If you need historical data, Unified.to streams normalized records directly into your data warehouse or database—under your control, on your terms.",{"type":17,"tag":239,"props":316371,"children":316373},{"id":316372},"do-unified-apis-store-customer-data-1",[316374],{"type":23,"value":316097},{"type":17,"tag":29,"props":316376,"children":316377},{},[316378],{"type":23,"value":316102},{"type":17,"tag":239,"props":316380,"children":316382},{"id":316381},"data-storage-models-in-unified-apis",[316383],{"type":23,"value":316384},"Data storage models in unified APIs",{"type":17,"tag":7231,"props":316386,"children":316387},{},[316388,316406],{"type":17,"tag":7235,"props":316389,"children":316390},{},[316391],{"type":17,"tag":7239,"props":316392,"children":316393},{},[316394,316398,316402],{"type":17,"tag":7243,"props":316395,"children":316396},{},[316397],{"type":23,"value":16997},{"type":17,"tag":7243,"props":316399,"children":316400},{},[316401],{"type":23,"value":24525},{"type":17,"tag":7243,"props":316403,"children":316404},{},[316405],{"type":23,"value":977},{"type":17,"tag":7259,"props":316407,"children":316408},{},[316409,316427,316445],{"type":17,"tag":7239,"props":316410,"children":316411},{},[316412,316417,316422],{"type":17,"tag":7266,"props":316413,"children":316414},{},[316415],{"type":23,"value":316416},"Cached storage",{"type":17,"tag":7266,"props":316418,"children":316419},{},[316420],{"type":23,"value":316421},"Vendor stores API responses and serves cached data",{"type":17,"tag":7266,"props":316423,"children":316424},{},[316425],{"type":23,"value":316426},"Faster reads, higher security and compliance risk",{"type":17,"tag":7239,"props":316428,"children":316429},{},[316430,316435,316440],{"type":17,"tag":7266,"props":316431,"children":316432},{},[316433],{"type":23,"value":316434},"Sync + mirror",{"type":17,"tag":7266,"props":316436,"children":316437},{},[316438],{"type":23,"value":316439},"Vendor continuously syncs and stores customer data",{"type":17,"tag":7266,"props":316441,"children":316442},{},[316443],{"type":23,"value":316444},"Easier querying, increased lock-in",{"type":17,"tag":7239,"props":316446,"children":316447},{},[316448,316453,316458],{"type":17,"tag":7266,"props":316449,"children":316450},{},[316451],{"type":23,"value":316452},"Zero-storage (pass-through)",{"type":17,"tag":7266,"props":316454,"children":316455},{},[316456],{"type":23,"value":316457},"Data retrieved in real time, not stored by vendor",{"type":17,"tag":7266,"props":316459,"children":316460},{},[316461],{"type":23,"value":316462},"Requires real-time access, lowest risk",{"type":17,"tag":239,"props":316464,"children":316466},{"id":316465},"integration-architecture-matters-a-data-storage-comparison",[316467],{"type":23,"value":316468},"Integration Architecture Matters: A Data Storage Comparison",{"type":17,"tag":7231,"props":316470,"children":316471},{},[316472,316513],{"type":17,"tag":7235,"props":316473,"children":316474},{},[316475],{"type":17,"tag":7239,"props":316476,"children":316477},{},[316478,316485,316492,316499,316506],{"type":17,"tag":7243,"props":316479,"children":316480},{},[316481],{"type":17,"tag":48,"props":316482,"children":316483},{},[316484],{"type":23,"value":87518},{"type":17,"tag":7243,"props":316486,"children":316487},{},[316488],{"type":17,"tag":48,"props":316489,"children":316490},{},[316491],{"type":23,"value":217},{"type":17,"tag":7243,"props":316493,"children":316494},{},[316495],{"type":17,"tag":48,"props":316496,"children":316497},{},[316498],{"type":23,"value":7968},{"type":17,"tag":7243,"props":316500,"children":316501},{},[316502],{"type":17,"tag":48,"props":316503,"children":316504},{},[316505],{"type":23,"value":581},{"type":17,"tag":7243,"props":316507,"children":316508},{},[316509],{"type":17,"tag":48,"props":316510,"children":316511},{},[316512],{"type":23,"value":237},{"type":17,"tag":7259,"props":316514,"children":316515},{},[316516,316546,316574,316603,316630],{"type":17,"tag":7239,"props":316517,"children":316518},{},[316519,316527,316531,316536,316541],{"type":17,"tag":7266,"props":316520,"children":316521},{},[316522],{"type":17,"tag":48,"props":316523,"children":316524},{},[316525],{"type":23,"value":316526},"Customer data stored",{"type":17,"tag":7266,"props":316528,"children":316529},{},[316530],{"type":23,"value":48006},{"type":17,"tag":7266,"props":316532,"children":316533},{},[316534],{"type":23,"value":316535},"Yes (cached)",{"type":17,"tag":7266,"props":316537,"children":316538},{},[316539],{"type":23,"value":316540},"Yes (cached + logs)",{"type":17,"tag":7266,"props":316542,"children":316543},{},[316544],{"type":23,"value":316545},"Yes (cached responses)",{"type":17,"tag":7239,"props":316547,"children":316548},{},[316549,316557,316562,316566,316570],{"type":17,"tag":7266,"props":316550,"children":316551},{},[316552],{"type":17,"tag":48,"props":316553,"children":316554},{},[316555],{"type":23,"value":316556},"Tokens cached",{"type":17,"tag":7266,"props":316558,"children":316559},{},[316560],{"type":23,"value":316561},"Optional",{"type":17,"tag":7266,"props":316563,"children":316564},{},[316565],{"type":23,"value":47981},{"type":17,"tag":7266,"props":316567,"children":316568},{},[316569],{"type":23,"value":47981},{"type":17,"tag":7266,"props":316571,"children":316572},{},[316573],{"type":23,"value":47981},{"type":17,"tag":7239,"props":316575,"children":316576},{},[316577,316585,316590,316595,316599],{"type":17,"tag":7266,"props":316578,"children":316579},{},[316580],{"type":17,"tag":48,"props":316581,"children":316582},{},[316583],{"type":23,"value":316584},"Data control",{"type":17,"tag":7266,"props":316586,"children":316587},{},[316588],{"type":23,"value":316589},"Fully yours",{"type":17,"tag":7266,"props":316591,"children":316592},{},[316593],{"type":23,"value":316594},"Shared with vendor",{"type":17,"tag":7266,"props":316596,"children":316597},{},[316598],{"type":23,"value":316594},{"type":17,"tag":7266,"props":316600,"children":316601},{},[316602],{"type":23,"value":316594},{"type":17,"tag":7239,"props":316604,"children":316605},{},[316606,316614,316618,316622,316626],{"type":17,"tag":7266,"props":316607,"children":316608},{},[316609],{"type":17,"tag":48,"props":316610,"children":316611},{},[316612],{"type":23,"value":316613},"Compliance surface",{"type":17,"tag":7266,"props":316615,"children":316616},{},[316617],{"type":23,"value":10072},{"type":17,"tag":7266,"props":316619,"children":316620},{},[316621],{"type":23,"value":69476},{"type":17,"tag":7266,"props":316623,"children":316624},{},[316625],{"type":23,"value":69476},{"type":17,"tag":7266,"props":316627,"children":316628},{},[316629],{"type":23,"value":69476},{"type":17,"tag":7239,"props":316631,"children":316632},{},[316633,316641,316645,316649,316653],{"type":17,"tag":7266,"props":316634,"children":316635},{},[316636],{"type":17,"tag":48,"props":316637,"children":316638},{},[316639],{"type":23,"value":316640},"Lock-in risk",{"type":17,"tag":7266,"props":316642,"children":316643},{},[316644],{"type":23,"value":69459},{"type":17,"tag":7266,"props":316646,"children":316647},{},[316648],{"type":23,"value":69476},{"type":17,"tag":7266,"props":316650,"children":316651},{},[316652],{"type":23,"value":69476},{"type":17,"tag":7266,"props":316654,"children":316655},{},[316656],{"type":23,"value":69476},{"type":17,"tag":239,"props":316658,"children":316659},{"id":7672},[316660],{"type":23,"value":7675},{"type":17,"tag":80,"props":316662,"children":316663},{},[316664,316669,316674,316679,316684],{"type":17,"tag":84,"props":316665,"children":316666},{},[316667],{"type":23,"value":316668},"Storing customer data in integration layers increases security and compliance risk",{"type":17,"tag":84,"props":316670,"children":316671},{},[316672],{"type":23,"value":316673},"Each additional copy of data expands your attack surface",{"type":17,"tag":84,"props":316675,"children":316676},{},[316677],{"type":23,"value":316678},"Zero-storage architectures keep data within your infrastructure",{"type":17,"tag":84,"props":316680,"children":316681},{},[316682],{"type":23,"value":316683},"Real-time access removes the need for vendor-managed caches",{"type":17,"tag":84,"props":316685,"children":316686},{},[316687],{"type":23,"value":316688},"Unified.to uses a pass-through model with no stored customer data",{"type":17,"tag":29,"props":316690,"children":316691},{},[316692],{"type":23,"value":316693},"Security isn't just about encryption and audits. It's about architectural choices. If you're building an integration layer into your product, choose one that minimizes risk by design.",{"type":17,"tag":29,"props":316695,"children":316696},{},[316697],{"type":23,"value":316698},"Unified.to is the only unified API platform built from the ground up with zero customer data storage. That means faster compliance reviews, tighter security, and more control over your architecture.",{"type":17,"tag":29,"props":316700,"children":316701},{},[316702,316711,316712,316720],{"type":17,"tag":133,"props":316703,"children":316705},{"href":1612,"rel":316704},[214],[316706],{"type":17,"tag":48,"props":316707,"children":316708},{},[316709],{"type":23,"value":316710},"Start your free trial",{"type":23,"value":75890},{"type":17,"tag":133,"props":316713,"children":316715},{"href":1623,"rel":316714},[214],[316716],{"type":17,"tag":48,"props":316717,"children":316718},{},[316719],{"type":23,"value":226481},{"type":23,"value":316721}," to learn more about real-time integrations without data liability.",{"title":7,"searchDepth":1629,"depth":1629,"links":316723},[316724,316725,316726,316729],{"id":316031,"depth":1635,"text":316034},{"id":316094,"depth":1635,"text":316097},{"id":316105,"depth":1629,"text":316108,"children":316727},[316728],{"id":316169,"depth":1635,"text":316172},{"id":316203,"depth":1629,"text":316206,"children":316730},[316731,316732,316733,316734,316735,316736,316737],{"id":316242,"depth":1635,"text":316245},{"id":316286,"depth":1635,"text":316289},{"id":316328,"depth":1635,"text":316331},{"id":316372,"depth":1635,"text":316097},{"id":316381,"depth":1635,"text":316384},{"id":316465,"depth":1635,"text":316468},{"id":7672,"depth":1635,"text":7675},"content:blog:why_unified_apis_shouldnt_store_your_customer_data.md","blog/why_unified_apis_shouldnt_store_your_customer_data.md","blog/why_unified_apis_shouldnt_store_your_customer_data",{"_path":316742,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":316743,"description":316744,"img":316745,"date":316746,"tag":12,"body":316747,"_type":1677,"_id":317608,"_source":1679,"_file":317609,"_stem":317610,"_extension":1682},"/blog/apideck_vs_unified_which_unified_api_is_built_for_real_time_products","Apideck vs. Unified.to: which Unified API Is built for real-time products?","Apideck and Unified.to both provide unified APIs, but they differ in how data is delivered and used in production. Apideck focuses on standardizing access to...","https://s3.us-east-2.amazonaws.com/unified-article-images/apideck_vs_unified_which_unified_api_is_built_for_real_time_products-icon.webp","2025-05-29T00:00:00.000Z",{"type":14,"children":316748,"toc":317591},[316749,316754,316757,316765,316773,316780,316785,316790,316796,317030,317036,317044,317068,317075,317097,317106,317111,317118,317160,317166,317171,317176,317180,317269,317275,317280,317285,317290,317296,317301,317317,317335,317340,317346,317351,317356,317360,317365,317370,317398,317403,317407,317449,317455,317462,317490,317497,317515,317524,317528,317550,317555,317560],{"type":17,"tag":18,"props":316750,"children":316752},{"id":316751},"apideck-vs-unifiedto-which-unified-api-is-built-for-real-time-products",[316753],{"type":23,"value":316743},{"type":17,"tag":25,"props":316755,"children":316756},{},[],{"type":17,"tag":29,"props":316758,"children":316759},{},[316760],{"type":17,"tag":33,"props":316761,"children":316762},{},[316763],{"type":23,"value":316764},"May 29, 2025",{"type":17,"tag":29,"props":316766,"children":316767},{},[316768],{"type":17,"tag":6438,"props":316769,"children":316772},{"alt":316770,"src":316771},"apideck.png","https://s3.us-east-2.amazonaws.com/unified-article-images/apideck_vs_unified_which_unified_api_is_built_for_real_time_products-0.png",[],{"type":17,"tag":29,"props":316774,"children":316775},{},[316776],{"type":17,"tag":33,"props":316777,"children":316778},{},[316779],{"type":23,"value":310436},{"type":17,"tag":29,"props":316781,"children":316782},{},[316783],{"type":23,"value":316784},"Apideck and Unified.to both provide unified APIs, but they differ in how data is delivered and used in production. Apideck focuses on standardizing access to integrations for building embedded marketplaces, while Unified.to provides real-time access to structured data across integrations, designed for applications that require consistent schemas and direct access to source APIs.",{"type":17,"tag":29,"props":316786,"children":316787},{},[316788],{"type":23,"value":316789},"Apideck is designed for building integration marketplaces with shared schemas and unified APIs. This comparison explains how Apideck and Unified.to differ in real-time delivery, data models, and how each platform fits into production systems.",{"type":17,"tag":68,"props":316791,"children":316793},{"id":316792},"tldr-unifiedto-vs-apideck",[316794],{"type":23,"value":316795},"TL;DR — Unified.to vs Apideck",{"type":17,"tag":7231,"props":316797,"children":316798},{},[316799,316826],{"type":17,"tag":7235,"props":316800,"children":316801},{},[316802],{"type":17,"tag":7239,"props":316803,"children":316804},{},[316805,316812,316819],{"type":17,"tag":7243,"props":316806,"children":316807},{},[316808],{"type":17,"tag":48,"props":316809,"children":316810},{},[316811],{"type":23,"value":87518},{"type":17,"tag":7243,"props":316813,"children":316814},{},[316815],{"type":17,"tag":48,"props":316816,"children":316817},{},[316818],{"type":23,"value":217},{"type":17,"tag":7243,"props":316820,"children":316821},{},[316822],{"type":17,"tag":48,"props":316823,"children":316824},{},[316825],{"type":23,"value":237},{"type":17,"tag":7259,"props":316827,"children":316828},{},[316829,316849,316869,316889,316909,316929,316949,316969,316990,317010],{"type":17,"tag":7239,"props":316830,"children":316831},{},[316832,316839,316844],{"type":17,"tag":7266,"props":316833,"children":316834},{},[316835],{"type":17,"tag":48,"props":316836,"children":316837},{},[316838],{"type":23,"value":293774},{"type":17,"tag":7266,"props":316840,"children":316841},{},[316842],{"type":23,"value":316843},"Structured schemas with raw + custom field access",{"type":17,"tag":7266,"props":316845,"children":316846},{},[316847],{"type":23,"value":316848},"Common model + Raw Mode",{"type":17,"tag":7239,"props":316850,"children":316851},{},[316852,316859,316864],{"type":17,"tag":7266,"props":316853,"children":316854},{},[316855],{"type":17,"tag":48,"props":316856,"children":316857},{},[316858],{"type":23,"value":311330},{"type":17,"tag":7266,"props":316860,"children":316861},{},[316862],{"type":23,"value":316863},"Native + virtual webhooks (high-frequency polling)",{"type":17,"tag":7266,"props":316865,"children":316866},{},[316867],{"type":23,"value":316868},"Native webhooks + 24h polling virtual webhooks",{"type":17,"tag":7239,"props":316870,"children":316871},{},[316872,316879,316884],{"type":17,"tag":7266,"props":316873,"children":316874},{},[316875],{"type":17,"tag":48,"props":316876,"children":316877},{},[316878],{"type":23,"value":69493},{"type":17,"tag":7266,"props":316880,"children":316881},{},[316882],{"type":23,"value":316883},"Structured data + Database Sync for RAG, agents, LLMs",{"type":17,"tag":7266,"props":316885,"children":316886},{},[316887],{"type":23,"value":316888},"Supports MCP and API access to records",{"type":17,"tag":7239,"props":316890,"children":316891},{},[316892,316899,316904],{"type":17,"tag":7266,"props":316893,"children":316894},{},[316895],{"type":17,"tag":48,"props":316896,"children":316897},{},[316898],{"type":23,"value":310958},{"type":17,"tag":7266,"props":316900,"children":316901},{},[316902],{"type":23,"value":316903},"Real-time DB sync (Postgres, Mongo, MySQL, more)",{"type":17,"tag":7266,"props":316905,"children":316906},{},[316907],{"type":23,"value":316908},"No native DB sync—requires user-managed ingestion",{"type":17,"tag":7239,"props":316910,"children":316911},{},[316912,316919,316924],{"type":17,"tag":7266,"props":316913,"children":316914},{},[316915],{"type":17,"tag":48,"props":316916,"children":316917},{},[316918],{"type":23,"value":69408},{"type":17,"tag":7266,"props":316920,"children":316921},{},[316922],{"type":23,"value":316923},"Zero-data architecture—no caching or persistence",{"type":17,"tag":7266,"props":316925,"children":316926},{},[316927],{"type":23,"value":316928},"Stores some user metadata; no payload caching",{"type":17,"tag":7239,"props":316930,"children":316931},{},[316932,316939,316944],{"type":17,"tag":7266,"props":316933,"children":316934},{},[316935],{"type":17,"tag":48,"props":316936,"children":316937},{},[316938],{"type":23,"value":267529},{"type":17,"tag":7266,"props":316940,"children":316941},{},[316942],{"type":23,"value":316943},"SDKs, auth component, structured logs, fast support",{"type":17,"tag":7266,"props":316945,"children":316946},{},[316947],{"type":23,"value":316948},"SDKs, visual explorer, good documentation",{"type":17,"tag":7239,"props":316950,"children":316951},{},[316952,316959,316964],{"type":17,"tag":7266,"props":316953,"children":316954},{},[316955],{"type":17,"tag":48,"props":316956,"children":316957},{},[316958],{"type":23,"value":264209},{"type":17,"tag":7266,"props":316960,"children":316961},{},[316962],{"type":23,"value":316963},"Millions of API calls/mo; usage-based pricing",{"type":17,"tag":7266,"props":316965,"children":316966},{},[316967],{"type":23,"value":316968},"Tiered usage plans; free tier with 2.5k API calls",{"type":17,"tag":7239,"props":316970,"children":316971},{},[316972,316980,316985],{"type":17,"tag":7266,"props":316973,"children":316974},{},[316975],{"type":17,"tag":48,"props":316976,"children":316977},{},[316978],{"type":23,"value":316979},"Positioning",{"type":17,"tag":7266,"props":316981,"children":316982},{},[316983],{"type":23,"value":316984},"Unified API for real-time, AI-native SaaS",{"type":17,"tag":7266,"props":316986,"children":316987},{},[316988],{"type":23,"value":316989},"Unified API for embedded integration catalogs",{"type":17,"tag":7239,"props":316991,"children":316992},{},[316993,317000,317005],{"type":17,"tag":7266,"props":316994,"children":316995},{},[316996],{"type":17,"tag":48,"props":316997,"children":316998},{},[316999],{"type":23,"value":292743},{"type":17,"tag":7266,"props":317001,"children":317002},{},[317003],{"type":23,"value":317004},"Transparent usage-based plans starting at $350/mo",{"type":17,"tag":7266,"props":317006,"children":317007},{},[317008],{"type":23,"value":317009},"Free tier; paid tiers start at $299/mo",{"type":17,"tag":7239,"props":317011,"children":317012},{},[317013,317020,317025],{"type":17,"tag":7266,"props":317014,"children":317015},{},[317016],{"type":17,"tag":48,"props":317017,"children":317018},{},[317019],{"type":23,"value":502},{"type":17,"tag":7266,"props":317021,"children":317022},{},[317023],{"type":23,"value":317024},"Engineering teams building live products and pipelines",{"type":17,"tag":7266,"props":317026,"children":317027},{},[317028],{"type":23,"value":317029},"SaaS teams launching app directories or app stores",{"type":17,"tag":239,"props":317031,"children":317033},{"id":317032},"when-to-choose-apideck-vs-unifiedto",[317034],{"type":23,"value":317035},"When to choose Apideck vs Unified.to",{"type":17,"tag":29,"props":317037,"children":317038},{},[317039],{"type":17,"tag":48,"props":317040,"children":317041},{},[317042],{"type":23,"value":317043},"Choose Apideck if:",{"type":17,"tag":80,"props":317045,"children":317046},{},[317047,317052,317063],{"type":17,"tag":84,"props":317048,"children":317049},{},[317050],{"type":23,"value":317051},"You are building an integration marketplace or app directory",{"type":17,"tag":84,"props":317053,"children":317054},{},[317055,317057,317061],{"type":23,"value":317056},"You need a ",{"type":17,"tag":133,"props":317058,"children":317059},{"href":7691},[317060],{"type":23,"value":7459},{"type":23,"value":317062}," for common objects across integrations",{"type":17,"tag":84,"props":317064,"children":317065},{},[317066],{"type":23,"value":317067},"Your workflows can rely on periodic polling or partial data coverage",{"type":17,"tag":29,"props":317069,"children":317070},{},[317071],{"type":17,"tag":48,"props":317072,"children":317073},{},[317074],{"type":23,"value":310523},{"type":17,"tag":80,"props":317076,"children":317077},{},[317078,317083,317088,317093],{"type":17,"tag":84,"props":317079,"children":317080},{},[317081],{"type":23,"value":317082},"Your product depends on real-time data from source APIs",{"type":17,"tag":84,"props":317084,"children":317085},{},[317086],{"type":23,"value":317087},"You need structured schemas across integrations without manual transformation",{"type":17,"tag":84,"props":317089,"children":317090},{},[317091],{"type":23,"value":317092},"You are building AI features that rely on consistent, current data",{"type":17,"tag":84,"props":317094,"children":317095},{},[317096],{"type":23,"value":313745},{"type":17,"tag":68,"props":317098,"children":317100},{"id":317099},"how-does-apideck-compare-to-unifiedto",[317101],{"type":17,"tag":48,"props":317102,"children":317103},{},[317104],{"type":23,"value":317105},"How does Apideck compare to Unified.to?",{"type":17,"tag":29,"props":317107,"children":317108},{},[317109],{"type":23,"value":317110},"Apideck focuses on embedding integration catalogs with shared schemas. Unified.to is built for engineering teams that need real-time pipelines, structured records, and developer primitives.",{"type":17,"tag":29,"props":317112,"children":317113},{},[317114],{"type":17,"tag":48,"props":317115,"children":317116},{},[317117],{"type":23,"value":310568},{"type":17,"tag":80,"props":317119,"children":317120},{},[317121,317130,317140,317145,317150,317155],{"type":17,"tag":84,"props":317122,"children":317123},{},[317124,317125,317129],{"type":23,"value":315444},{"type":17,"tag":133,"props":317126,"children":317127},{"href":4999},[317128],{"type":23,"value":5002},{"type":23,"value":313783},{"type":17,"tag":84,"props":317131,"children":317132},{},[317133,317138],{"type":17,"tag":133,"props":317134,"children":317136},{"href":87026,"rel":317135},[214],[317137],{"type":23,"value":296298},{"type":23,"value":317139}," across 25 categories",{"type":17,"tag":84,"props":317141,"children":317142},{},[317143],{"type":23,"value":317144},"Structured schemas with passthrough + custom field support",{"type":17,"tag":84,"props":317146,"children":317147},{},[317148],{"type":23,"value":317149},"Database sync: real-time ingestion into Postgres, Mongo, and more",{"type":17,"tag":84,"props":317151,"children":317152},{},[317153],{"type":23,"value":317154},"Zero-data architecture: no caching or persistence",{"type":17,"tag":84,"props":317156,"children":317157},{},[317158],{"type":23,"value":317159},"Transparent usage-based pricing with 30-day free trial",{"type":17,"tag":68,"props":317161,"children":317163},{"id":317162},"real-time-data-without-polling-or-cron-jobs",[317164],{"type":23,"value":317165},"Real-time data without polling or cron jobs",{"type":17,"tag":29,"props":317167,"children":317168},{},[317169],{"type":23,"value":317170},"Apideck provides native webhooks for some providers, but relies on polling for others. Virtual webhooks poll every 24 hours.",{"type":17,"tag":29,"props":317172,"children":317173},{},[317174],{"type":23,"value":317175},"Unified.to delivers updates using native and virtual webhooks, with data retrieved directly from source APIs instead of relying on scheduled polling. You don't manage jobs, retries, or state tracking. Unified.to emits consistent, structured events when data changes—no stale cache or delay.",{"type":17,"tag":239,"props":317177,"children":317178},{"id":310626},[317179],{"type":23,"value":310629},{"type":17,"tag":7231,"props":317181,"children":317182},{},[317183,317201],{"type":17,"tag":7235,"props":317184,"children":317185},{},[317186],{"type":17,"tag":7239,"props":317187,"children":317188},{},[317189,317193,317197],{"type":17,"tag":7243,"props":317190,"children":317191},{},[317192],{"type":23,"value":98853},{"type":17,"tag":7243,"props":317194,"children":317195},{},[317196],{"type":23,"value":237},{"type":17,"tag":7243,"props":317198,"children":317199},{},[317200],{"type":23,"value":217},{"type":17,"tag":7259,"props":317202,"children":317203},{},[317204,317220,317237,317253],{"type":17,"tag":7239,"props":317205,"children":317206},{},[317207,317211,317216],{"type":17,"tag":7266,"props":317208,"children":317209},{},[317210],{"type":23,"value":244583},{"type":17,"tag":7266,"props":317212,"children":317213},{},[317214],{"type":23,"value":317215},"API + webhooks + polling intervals",{"type":17,"tag":7266,"props":317217,"children":317218},{},[317219],{"type":23,"value":87601},{"type":17,"tag":7239,"props":317221,"children":317222},{},[317223,317227,317232],{"type":17,"tag":7266,"props":317224,"children":317225},{},[317226],{"type":23,"value":314818},{"type":17,"tag":7266,"props":317228,"children":317229},{},[317230],{"type":23,"value":317231},"Common models + raw mode",{"type":17,"tag":7266,"props":317233,"children":317234},{},[317235],{"type":23,"value":317236},"Structured schemas across integrations",{"type":17,"tag":7239,"props":317238,"children":317239},{},[317240,317244,317249],{"type":17,"tag":7266,"props":317241,"children":317242},{},[317243],{"type":23,"value":310713},{"type":17,"tag":7266,"props":317245,"children":317246},{},[317247],{"type":23,"value":317248},"Requires custom ingestion logic",{"type":17,"tag":7266,"props":317250,"children":317251},{},[317252],{"type":23,"value":310723},{"type":17,"tag":7239,"props":317254,"children":317255},{},[317256,317260,317265],{"type":17,"tag":7266,"props":317257,"children":317258},{},[317259],{"type":23,"value":69408},{"type":17,"tag":7266,"props":317261,"children":317262},{},[317263],{"type":23,"value":317264},"Stores some metadata",{"type":17,"tag":7266,"props":317266,"children":317267},{},[317268],{"type":23,"value":43678},{"type":17,"tag":68,"props":317270,"children":317272},{"id":317271},"one-schema-across-systemsnot-just-common-fields",[317273],{"type":23,"value":317274},"One schema across systems—not just common fields",{"type":17,"tag":29,"props":317276,"children":317277},{},[317278],{"type":23,"value":317279},"Apideck maps common fields per category (e.g. employees, companies). If you need full data access, you toggle Raw Mode and manage the transformation.",{"type":17,"tag":29,"props":317281,"children":317282},{},[317283],{"type":23,"value":317284},"Unified.to provides deep, unified schemas for every object it supports—plus passthrough fields and access to raw payloads. Whether you're working with ATS, CRM, HRIS, or ticketing data, you get predictable fields, enums, and associations.",{"type":17,"tag":29,"props":317286,"children":317287},{},[317288],{"type":23,"value":317289},"This unlocks complex workflows and AI use cases without losing flexibility.",{"type":17,"tag":68,"props":317291,"children":317293},{"id":317292},"built-in-database-sync-for-structured-records",[317294],{"type":23,"value":317295},"Built-in database sync for structured records",{"type":17,"tag":29,"props":317297,"children":317298},{},[317299],{"type":23,"value":317300},"Apideck supports webhooks and streaming via its API. You'll need to manage your own ingestion logic to write to a database.",{"type":17,"tag":29,"props":317302,"children":317303},{},[317304,317306,317316],{"type":23,"value":317305},"Unified.to offers first-class ",{"type":17,"tag":133,"props":317307,"children":317310},{"href":317308,"rel":317309},"https://unified.to/blog/march_2025_product_updates#database-sync-is-now-live",[214],[317311],{"type":17,"tag":48,"props":317312,"children":317313},{},[317314],{"type":23,"value":317315},"Database Sync",{"type":23,"value":20456},{"type":17,"tag":80,"props":317318,"children":317319},{},[317320,317325,317330],{"type":17,"tag":84,"props":317321,"children":317322},{},[317323],{"type":23,"value":317324},"Connect your Postgres, MongoDB, or MySQL instance",{"type":17,"tag":84,"props":317326,"children":317327},{},[317328],{"type":23,"value":317329},"Stream real-time records by object type",{"type":17,"tag":84,"props":317331,"children":317332},{},[317333],{"type":23,"value":317334},"No ETL, no transformation",{"type":17,"tag":29,"props":317336,"children":317337},{},[317338],{"type":23,"value":317339},"Data lands normalized and current—ready for dashboards, agents, or analytics.",{"type":17,"tag":68,"props":317341,"children":317343},{"id":317342},"zero-data-storedno-security-liability",[317344],{"type":23,"value":317345},"Zero data stored—no security liability",{"type":17,"tag":29,"props":317347,"children":317348},{},[317349],{"type":23,"value":317350},"Apideck stores some customer data (like connected user info) even if it doesn't cache payloads. You'll need to audit what's stored and where.",{"type":17,"tag":29,"props":317352,"children":317353},{},[317354],{"type":23,"value":317355},"Unified.to doesn't store end-user data or credentials. Requests proxy through to the source system in real time. You stay in control of where data flows and how it's handled.",{"type":17,"tag":68,"props":317357,"children":317358},{"id":315761},[317359],{"type":23,"value":315764},{"type":17,"tag":29,"props":317361,"children":317362},{},[317363],{"type":23,"value":317364},"Apideck offers SDKs, a visual explorer, and a well-documented sandbox for testing integrations. It's strong for teams launching embedded marketplaces.",{"type":17,"tag":29,"props":317366,"children":317367},{},[317368],{"type":23,"value":317369},"Unified.to is built for engineers:",{"type":17,"tag":80,"props":317371,"children":317372},{},[317373,317378,317383,317388,317393],{"type":17,"tag":84,"props":317374,"children":317375},{},[317376],{"type":23,"value":317377},"SDKs in 7+ languages",{"type":17,"tag":84,"props":317379,"children":317380},{},[317381],{"type":23,"value":317382},"Open source Connect Component for React/Vue/Angular",{"type":17,"tag":84,"props":317384,"children":317385},{},[317386],{"type":23,"value":317387},"Daily SDK updates",{"type":17,"tag":84,"props":317389,"children":317390},{},[317391],{"type":23,"value":317392},"Postman and OpenAPI support",{"type":17,"tag":84,"props":317394,"children":317395},{},[317396],{"type":23,"value":317397},"Fast integration turnaround",{"type":17,"tag":29,"props":317399,"children":317400},{},[317401],{"type":23,"value":317402},"Product teams use Unified.to to replace brittle ETL, cut integration time, and power complex, AI-native features.",{"type":17,"tag":68,"props":317404,"children":317405},{"id":311874},[317406],{"type":23,"value":311877},{"type":17,"tag":29,"props":317408,"children":317409},{},[317410,317412,317416,317417,317422,317423,317427,317428,317433,317434,317438,317439,317443,317444,317448],{"type":23,"value":317411},"G2 isn't a spec sheet, but it's a useful signal for onboarding experience, support quality, and where teams hit limitations in production. As of ",{"type":17,"tag":48,"props":317413,"children":317414},{},[317415],{"type":23,"value":231338},{"type":23,"value":11826},{"type":17,"tag":48,"props":317418,"children":317419},{},[317420],{"type":23,"value":317421},"Apideck Unify",{"type":23,"value":311893},{"type":17,"tag":48,"props":317424,"children":317425},{},[317426],{"type":23,"value":311898},{"type":23,"value":70920},{"type":17,"tag":48,"props":317429,"children":317430},{},[317431],{"type":23,"value":317432},"51 reviews",{"type":23,"value":12561},{"type":17,"tag":48,"props":317435,"children":317436},{},[317437],{"type":23,"value":217},{"type":23,"value":311893},{"type":17,"tag":48,"props":317440,"children":317441},{},[317442],{"type":23,"value":311915},{"type":23,"value":70920},{"type":17,"tag":48,"props":317445,"children":317446},{},[317447],{"type":23,"value":311921},{"type":23,"value":54},{"type":17,"tag":239,"props":317450,"children":317452},{"id":317451},"apideck-unify-themes-from-g2-reviews",[317453],{"type":23,"value":317454},"Apideck Unify (themes from G2 reviews)",{"type":17,"tag":29,"props":317456,"children":317457},{},[317458],{"type":17,"tag":48,"props":317459,"children":317460},{},[317461],{"type":23,"value":311935},{"type":17,"tag":80,"props":317463,"children":317464},{},[317465,317470,317475,317480,317485],{"type":17,"tag":84,"props":317466,"children":317467},{},[317468],{"type":23,"value":317469},"Responsive support and proactive communication.",{"type":17,"tag":84,"props":317471,"children":317472},{},[317473],{"type":23,"value":317474},"Ease of use and fast build/implementation.",{"type":17,"tag":84,"props":317476,"children":317477},{},[317478],{"type":23,"value":317479},"Unified API layer (common reason teams choose it for multi-system coverage, including HRIS/CRM).",{"type":17,"tag":84,"props":317481,"children":317482},{},[317483],{"type":23,"value":317484},"Clear documentation and 'quick to get started' experience.",{"type":17,"tag":84,"props":317486,"children":317487},{},[317488],{"type":23,"value":317489},"Pricing described as accessible/affordable in multiple reviews.",{"type":17,"tag":29,"props":317491,"children":317492},{},[317493],{"type":17,"tag":48,"props":317494,"children":317495},{},[317496],{"type":23,"value":311961},{"type":17,"tag":80,"props":317498,"children":317499},{},[317500,317505,317510],{"type":17,"tag":84,"props":317501,"children":317502},{},[317503],{"type":23,"value":317504},"Connector-by-connector API limitations (some resources supported, others missing).",{"type":17,"tag":84,"props":317506,"children":317507},{},[317508],{"type":23,"value":317509},"Data / feature gaps (missing endpoints, advanced features, or third-party APIs still not available).",{"type":17,"tag":84,"props":317511,"children":317512},{},[317513],{"type":23,"value":317514},"Complexity from product layers/limitations for some implementations.",{"type":17,"tag":29,"props":317516,"children":317517},{},[317518,317522],{"type":17,"tag":48,"props":317519,"children":317520},{},[317521],{"type":23,"value":311987},{"type":23,"value":317523},": Apideck's reviews read like 'fast to implement, strong docs/support,' with the main friction being connector coverage and endpoint depth. Unified's reviews emphasize production DX (observability + real-time patterns + support throughput) once integrations move from 'integration project' to 'core infrastructure.'",{"type":17,"tag":239,"props":317525,"children":317526},{"id":7672},[317527],{"type":23,"value":7675},{"type":17,"tag":80,"props":317529,"children":317530},{},[317531,317536,317540,317545],{"type":17,"tag":84,"props":317532,"children":317533},{},[317534],{"type":23,"value":317535},"Apideck is designed for integration marketplaces with shared schemas",{"type":17,"tag":84,"props":317537,"children":317538},{},[317539],{"type":23,"value":311119},{"type":17,"tag":84,"props":317541,"children":317542},{},[317543],{"type":23,"value":317544},"Real-time delivery is required for AI features and user-facing workflows",{"type":17,"tag":84,"props":317546,"children":317547},{},[317548],{"type":23,"value":317549},"Unified.to removes the need to build and maintain custom ingestion pipelines",{"type":17,"tag":29,"props":317551,"children":317552},{},[317553],{"type":23,"value":317554},"Apideck is a great choice for teams embedding app marketplaces with consistent UI and basic API access.",{"type":17,"tag":29,"props":317556,"children":317557},{},[317558],{"type":23,"value":317559},"Unified.to is built for teams who need real-time data, structured pipelines, and AI-ready delivery—with developer control and no storage liability.",{"type":17,"tag":29,"props":317561,"children":317562},{},[317563,317571,317572,317576,317577,317585,317586],{"type":17,"tag":133,"props":317564,"children":317566},{"href":1612,"rel":317565},[214],[317567],{"type":17,"tag":48,"props":317568,"children":317569},{},[317570],{"type":23,"value":226470},{"type":23,"value":18757},{"type":17,"tag":48,"props":317573,"children":317574},{},[317575],{"type":23,"value":217439},{"type":23,"value":18757},{"type":17,"tag":133,"props":317578,"children":317580},{"href":1623,"rel":317579},[214],[317581],{"type":17,"tag":48,"props":317582,"children":317583},{},[317584],{"type":23,"value":226481},{"type":23,"value":18757},{"type":17,"tag":48,"props":317587,"children":317588},{},[317589],{"type":23,"value":317590},"to see Unified.to in action.",{"title":7,"searchDepth":1629,"depth":1629,"links":317592},[317593,317596,317597,317600,317601,317602,317603,317604],{"id":316792,"depth":1629,"text":316795,"children":317594},[317595],{"id":317032,"depth":1635,"text":317035},{"id":317099,"depth":1629,"text":317105},{"id":317162,"depth":1629,"text":317165,"children":317598},[317599],{"id":310626,"depth":1635,"text":310629},{"id":317271,"depth":1629,"text":317274},{"id":317292,"depth":1629,"text":317295},{"id":317342,"depth":1629,"text":317345},{"id":315761,"depth":1629,"text":315764},{"id":311874,"depth":1629,"text":311877,"children":317605},[317606,317607],{"id":317451,"depth":1635,"text":317454},{"id":7672,"depth":1635,"text":7675},"content:blog:apideck_vs_unified_which_unified_api_is_built_for_real_time_products.md","blog/apideck_vs_unified_which_unified_api_is_built_for_real_time_products.md","blog/apideck_vs_unified_which_unified_api_is_built_for_real_time_products",{"_path":317612,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":317613,"description":317614,"img":317615,"date":316746,"tag":6341,"body":317616,"_type":1677,"_id":318124,"_source":1679,"_file":318125,"_stem":318126,"_extension":1682},"/blog/how_to_register_a_google_developer_app_and_get_oauth_2_credentials","How to register a Google developer app and get OAuth 2 credentials","> 💡 Note that if you use `Restricted` or `Sensitive` Scopes you need to contact Unified's Support to setup a CNAME for the API URL in order to get your App...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_google_developer_app_and_get_oauth_2_credentials-icon.png",{"type":14,"children":317617,"toc":318122},[317618,317623,317626,317633,317673,318065,318072,318099,318106,318114],{"type":17,"tag":18,"props":317619,"children":317621},{"id":317620},"how-to-register-a-google-developer-app-and-get-oauth-2-credentials",[317622],{"type":23,"value":317613},{"type":17,"tag":25,"props":317624,"children":317625},{},[],{"type":17,"tag":29,"props":317627,"children":317628},{},[317629],{"type":17,"tag":33,"props":317630,"children":317631},{},[317632],{"type":23,"value":316764},{"type":17,"tag":3414,"props":317634,"children":317635},{},[317636],{"type":17,"tag":29,"props":317637,"children":317638},{},[317639,317641,317645,317647,317652,317653,317659,317661,317664,317666,317672],{"type":23,"value":317640},"💡 ",{"type":17,"tag":48,"props":317642,"children":317643},{},[317644],{"type":23,"value":150919},{"type":23,"value":317646}," that if you use ",{"type":17,"tag":6121,"props":317648,"children":317650},{"className":317649},[],[317651],{"type":23,"value":70376},{"type":23,"value":75890},{"type":17,"tag":6121,"props":317654,"children":317656},{"className":317655},[],[317657],{"type":23,"value":317658},"Sensitive",{"type":23,"value":317660}," Scopes you need to contact Unified's Support to setup a CNAME for the API URL in order to get your App approved by Google",{"type":17,"tag":3891,"props":317662,"children":317663},{},[],{"type":23,"value":317665},"\nCheck ",{"type":17,"tag":133,"props":317667,"children":317670},{"href":317668,"rel":317669},"https://docs.unified.to/guides/how_to_set_up_a_custom_api_url",[214],[317671],{"type":23,"value":317668},{"type":23,"value":54},{"type":17,"tag":6154,"props":317674,"children":317675},{},[317676,317709,317797,317852,317990],{"type":17,"tag":84,"props":317677,"children":317678},{},[317679,317684],{"type":17,"tag":48,"props":317680,"children":317681},{},[317682],{"type":23,"value":317683},"Create a Google Cloud Platform project:",{"type":17,"tag":80,"props":317685,"children":317686},{},[317687,317699,317704],{"type":17,"tag":84,"props":317688,"children":317689},{},[317690,317692,317697],{"type":23,"value":317691},"Go to the Google Cloud Console (",{"type":17,"tag":133,"props":317693,"children":317695},{"href":42075,"rel":317694},[214],[317696],{"type":23,"value":42075},{"type":23,"value":317698},") and sign in.",{"type":17,"tag":84,"props":317700,"children":317701},{},[317702],{"type":23,"value":317703},"If you don't have a project, click the \"Select a project\" dropdown and choose \"New Project\".",{"type":17,"tag":84,"props":317705,"children":317706},{},[317707],{"type":23,"value":317708},"Give your project a name and click \"Create\".",{"type":17,"tag":84,"props":317710,"children":317711},{},[317712,317717],{"type":17,"tag":48,"props":317713,"children":317714},{},[317715],{"type":23,"value":317716},"Enable the Necessary APIs",{"type":17,"tag":80,"props":317718,"children":317719},{},[317720,317725,317753,317781,317786],{"type":17,"tag":84,"props":317721,"children":317722},{},[317723],{"type":23,"value":317724},"In the Google Cloud Console, make sure your newly created or existing project is selected.",{"type":17,"tag":84,"props":317726,"children":317727},{},[317728,317729,317738,317744],{"type":23,"value":42939},{"type":17,"tag":133,"props":317730,"children":317732},{"href":42145,"rel":317731},[214],[317733],{"type":17,"tag":48,"props":317734,"children":317735},{},[317736],{"type":23,"value":317737},"APIs & Services",{"type":17,"tag":133,"props":317739,"children":317741},{"href":42145,"rel":317740},[214],[317742],{"type":23,"value":317743}," > ",{"type":17,"tag":133,"props":317745,"children":317747},{"href":42145,"rel":317746},[214],[317748],{"type":17,"tag":48,"props":317749,"children":317750},{},[317751],{"type":23,"value":317752},"Library",{"type":17,"tag":84,"props":317754,"children":317755},{},[317756,317758,317762,317764],{"type":23,"value":317757},"Search for the specific API you want to use (e.g., \"Gmail API\", \"Google Drive API\", 'Google ",{"type":17,"tag":133,"props":317759,"children":317760},{"href":13708},[317761],{"type":23,"value":98258},{"type":23,"value":317763},"').\n",{"type":17,"tag":80,"props":317765,"children":317766},{},[317767],{"type":17,"tag":84,"props":317768,"children":317769},{},[317770,317772,317779],{"type":23,"value":317771},"For Google Directory, make sure that you have the",{"type":17,"tag":133,"props":317773,"children":317776},{"href":317774,"rel":317775},"https://console.cloud.google.com/apis/library/admin.googleapis.com",[214],[317777],{"type":23,"value":317778}," Admin SDK API ",{"type":23,"value":317780},"enabled.",{"type":17,"tag":84,"props":317782,"children":317783},{},[317784],{"type":23,"value":317785},"Click on the API from the search results.",{"type":17,"tag":84,"props":317787,"children":317788},{},[317789,317791,317795],{"type":23,"value":317790},"Click the \"",{"type":17,"tag":48,"props":317792,"children":317793},{},[317794],{"type":23,"value":42181},{"type":23,"value":317796},"\" button. Repeat this for all Google APIs your application will need to access",{"type":17,"tag":84,"props":317798,"children":317799},{},[317800,317810],{"type":17,"tag":48,"props":317801,"children":317802},{},[317803,317804,317808],{"type":23,"value":42186},{"type":17,"tag":133,"props":317805,"children":317806},{"href":779},[317807],{"type":23,"value":782},{"type":23,"value":317809}," Consent Screen",{"type":17,"tag":80,"props":317811,"children":317812},{},[317813,317825,317834,317839],{"type":17,"tag":84,"props":317814,"children":317815},{},[317816,317818],{"type":23,"value":317817},"In the Google Cloud Console, go to ",{"type":17,"tag":133,"props":317819,"children":317822},{"href":317820,"rel":317821},"https://console.cloud.google.com/auth/overview",[214],[317823],{"type":23,"value":317824},"Google Auth Platform",{"type":17,"tag":84,"props":317826,"children":317827},{},[317828,317830],{"type":23,"value":317829},"Fill in what is asked and click ",{"type":17,"tag":48,"props":317831,"children":317832},{},[317833],{"type":23,"value":42125},{"type":17,"tag":84,"props":317835,"children":317836},{},[317837],{"type":23,"value":317838},"Click 'Create'",{"type":17,"tag":84,"props":317840,"children":317841},{},[317842,317843,317850],{"type":23,"value":6661},{"type":17,"tag":133,"props":317844,"children":317847},{"href":317845,"rel":317846},"https://console.cloud.google.com/auth/branding",[214],[317848],{"type":23,"value":317849},"Auth Branding",{"type":23,"value":317851}," and fill in the required Information",{"type":17,"tag":84,"props":317853,"children":317854},{},[317855,317859,317861],{"type":17,"tag":48,"props":317856,"children":317857},{},[317858],{"type":23,"value":42815},{"type":23,"value":317860},": Select the scopes your application needs. Scopes define the permissions your app is requesting (e.g., read emails, access calendar). Be specific and only request the scopes you absolutely need.\n",{"type":17,"tag":80,"props":317862,"children":317863},{},[317864,317875,317921,317958,317979],{"type":17,"tag":84,"props":317865,"children":317866},{},[317867,317868],{"type":23,"value":6661},{"type":17,"tag":133,"props":317869,"children":317872},{"href":317870,"rel":317871},"https://console.cloud.google.com/auth/scopes",[214],[317873],{"type":23,"value":317874},"Auth Data Access",{"type":17,"tag":84,"props":317876,"children":317877},{},[317878,317880,317885,317886,317892,317893,317899,317900,317906,317907,317913,317914,317920],{"type":23,"value":317879},"You will at least need ",{"type":17,"tag":6121,"props":317881,"children":317883},{"className":317882},[],[317884],{"type":23,"value":98191},{"type":23,"value":11826},{"type":17,"tag":6121,"props":317887,"children":317889},{"className":317888},[],[317890],{"type":23,"value":317891},"userinfo.email",{"type":23,"value":11826},{"type":17,"tag":6121,"props":317894,"children":317896},{"className":317895},[],[317897],{"type":23,"value":317898},"userinfo.profile",{"type":23,"value":11826},{"type":17,"tag":6121,"props":317901,"children":317903},{"className":317902},[],[317904],{"type":23,"value":317905},"admin.directory.group.readonly",{"type":23,"value":34435},{"type":17,"tag":6121,"props":317908,"children":317910},{"className":317909},[],[317911],{"type":23,"value":317912},"admin.directory.user",{"type":23,"value":75890},{"type":17,"tag":6121,"props":317915,"children":317917},{"className":317916},[],[317918],{"type":23,"value":317919},"admin.directory.user.readonly",{"type":23,"value":54},{"type":17,"tag":84,"props":317922,"children":317923},{},[317924,317926],{"type":23,"value":317925},"The scopes needed by other Google integrations can be found in the Unified App, for example:\n",{"type":17,"tag":80,"props":317927,"children":317928},{},[317929,317939,317949],{"type":17,"tag":84,"props":317930,"children":317931},{},[317932],{"type":17,"tag":133,"props":317933,"children":317936},{"href":317934,"rel":317935},"https://app.unified.to/integrations/googlecontacts?tab=oauth2",[214],[317937],{"type":23,"value":317938},"Google Contacts",{"type":17,"tag":84,"props":317940,"children":317941},{},[317942],{"type":17,"tag":133,"props":317943,"children":317946},{"href":317944,"rel":317945},"https://app.unified.to/integrations/googledirectory?tab=oauth2",[214],[317947],{"type":23,"value":317948},"Google Directory",{"type":17,"tag":84,"props":317950,"children":317951},{},[317952],{"type":17,"tag":133,"props":317953,"children":317956},{"href":317954,"rel":317955},"https://app.unified.to/integrations/googlemail?tab=oauth2",[214],[317957],{"type":23,"value":14878},{"type":17,"tag":84,"props":317959,"children":317960},{},[317961,317965,317966,317971,317972,317977],{"type":17,"tag":48,"props":317962,"children":317963},{},[317964],{"type":23,"value":150919},{"type":23,"value":317646},{"type":17,"tag":6121,"props":317967,"children":317969},{"className":317968},[],[317970],{"type":23,"value":70376},{"type":23,"value":75890},{"type":17,"tag":6121,"props":317973,"children":317975},{"className":317974},[],[317976],{"type":23,"value":317658},{"type":23,"value":317978}," Scopes you need to contact Unified's Support to setup a CNAME for the redirect URL in order to get your App approved by Google",{"type":17,"tag":84,"props":317980,"children":317981},{},[317982,317984,317988],{"type":23,"value":317983},"Review the information and click \"",{"type":17,"tag":48,"props":317985,"children":317986},{},[317987],{"type":23,"value":42255},{"type":23,"value":317989},"\" through the steps. If you selected \"External\" and are just testing, you can often leave your app in \"Testing\" publishing status. If you intend for it to be publicly available, you'll eventually need to \"Publish\" it and potentially go through verification.",{"type":17,"tag":84,"props":317991,"children":317992},{},[317993,317995],{"type":23,"value":317994},"Create OAuth 2.0 Credentials\n",{"type":17,"tag":80,"props":317996,"children":317997},{},[317998,318011,318023,318034,318039],{"type":17,"tag":84,"props":317999,"children":318000},{},[318001,318002,318009],{"type":23,"value":6661},{"type":17,"tag":133,"props":318003,"children":318006},{"href":318004,"rel":318005},"https://console.cloud.google.com/auth/clients",[214],[318007],{"type":23,"value":318008},"Auth Clients",{"type":23,"value":318010}," in the Google Cloud Console.",{"type":17,"tag":84,"props":318012,"children":318013},{},[318014,318016,318021],{"type":23,"value":318015},"Click on \"",{"type":17,"tag":48,"props":318017,"children":318018},{},[318019],{"type":23,"value":318020},"+ Create Client",{"type":23,"value":318022},"\" at the top of the page, Follow the steps",{"type":17,"tag":84,"props":318024,"children":318025},{},[318026,318028],{"type":23,"value":318027},"Configure the authorized redirect URIs.  Get the correct value from the Integration, for example ",{"type":17,"tag":133,"props":318029,"children":318032},{"href":318030,"rel":318031},"https://app.unified.to/integrations/googledrive?tab=oauth2",[214],[318033],{"type":23,"value":28907},{"type":17,"tag":84,"props":318035,"children":318036},{},[318037],{"type":23,"value":318038},"Copy your Client ID and Secret",{"type":17,"tag":84,"props":318040,"children":318041},{},[318042,318044],{"type":23,"value":318043},"Enter these values in your Integrations, for example:\n",{"type":17,"tag":80,"props":318045,"children":318046},{},[318047,318056],{"type":17,"tag":84,"props":318048,"children":318049},{},[318050],{"type":17,"tag":133,"props":318051,"children":318054},{"href":318052,"rel":318053},"https://app.unified.to/integrations/google",[214],[318055],{"type":23,"value":22466},{"type":17,"tag":84,"props":318057,"children":318058},{},[318059],{"type":17,"tag":133,"props":318060,"children":318063},{"href":318061,"rel":318062},"https://app.unified.to/integrations/googlemail?tab=auth",[214],[318064],{"type":23,"value":14878},{"type":17,"tag":29,"props":318066,"children":318067},{},[318068],{"type":17,"tag":6438,"props":318069,"children":318071},{"alt":6440,"src":318070},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_google_developer_app_and_get_oauth_2_credentials-0.png",[],{"type":17,"tag":6154,"props":318073,"children":318074},{},[318075],{"type":17,"tag":84,"props":318076,"children":318077},{},[318078,318080],{"type":23,"value":318079},"Publish your Application\n",{"type":17,"tag":80,"props":318081,"children":318082},{},[318083,318094],{"type":17,"tag":84,"props":318084,"children":318085},{},[318086,318087],{"type":23,"value":6661},{"type":17,"tag":133,"props":318088,"children":318091},{"href":318089,"rel":318090},"https://console.cloud.google.com/auth/audience",[214],[318092],{"type":23,"value":318093},"Auth Audience",{"type":17,"tag":84,"props":318095,"children":318096},{},[318097],{"type":23,"value":318098},"Click on Publish app",{"type":17,"tag":29,"props":318100,"children":318101},{},[318102],{"type":17,"tag":6438,"props":318103,"children":318105},{"alt":6440,"src":318104},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_google_developer_app_and_get_oauth_2_credentials-1.png",[],{"type":17,"tag":6154,"props":318107,"children":318108},{},[318109],{"type":17,"tag":84,"props":318110,"children":318111},{},[318112],{"type":23,"value":318113},"Once your application is approved and verified it will start showing your application name on the authorization consent screen. Until then it will be showing the 'unified.to' name, which is inferred from the redirect URL.",{"type":17,"tag":29,"props":318115,"children":318116},{},[318117],{"type":17,"tag":6438,"props":318118,"children":318121},{"alt":318119,"src":318120},"Untitled.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_google_developer_app_and_get_oauth_2_credentials-2.png",[],{"title":7,"searchDepth":1629,"depth":1629,"links":318123},[],"content:blog:how_to_register_a_google_developer_app_and_get_oauth_2_credentials.md","blog/how_to_register_a_google_developer_app_and_get_oauth_2_credentials.md","blog/how_to_register_a_google_developer_app_and_get_oauth_2_credentials",{"_path":318128,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":318129,"description":318130,"img":318131,"date":318132,"tag":12,"body":318133,"_type":1677,"_id":319110,"_source":1679,"_file":319111,"_stem":319112,"_extension":1682},"/blog/finch_vs_unified_which_unified_api_handles_employment_data_and_real_time_workflows_better","Finch vs. Unified.to: which Unified API handles employment data and real-time workflows better?","Finch and Unified.to both provide access to employment data, but they differ in scope and architecture. Finch focuses on HRIS and payroll integrations with...","https://s3.us-east-2.amazonaws.com/unified-article-images/finch_vs_unified_which_unified_api_handles_employment_data_and_real_time_workflows_better-icon.webp","2025-05-28T00:00:00.000Z",{"type":14,"children":318134,"toc":319092},[318135,318140,318143,318151,318159,318166,318171,318176,318185,318418,318424,318432,318450,318457,318479,318488,318493,318500,318535,318541,318546,318551,318556,318563,318655,318661,318666,318671,318692,318697,318706,318717,318731,318749,318755,318760,318765,318770,318788,318793,318799,318804,318809,318827,318832,318838,318843,318848,318853,318859,318864,318869,318896,318910,318914,318955,318961,318968,318986,318993,319016,319039,319043,319066,319071,319076],{"type":17,"tag":18,"props":318136,"children":318138},{"id":318137},"finch-vs-unifiedto-which-unified-api-handles-employment-data-and-real-time-workflows-better",[318139],{"type":23,"value":318129},{"type":17,"tag":25,"props":318141,"children":318142},{},[],{"type":17,"tag":29,"props":318144,"children":318145},{},[318146],{"type":17,"tag":33,"props":318147,"children":318148},{},[318149],{"type":23,"value":318150},"May 28, 2025",{"type":17,"tag":29,"props":318152,"children":318153},{},[318154],{"type":17,"tag":6438,"props":318155,"children":318158},{"alt":318156,"src":318157},"finch_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/finch_vs_unified_which_unified_api_handles_employment_data_and_real_time_workflows_better-0.png",[],{"type":17,"tag":29,"props":318160,"children":318161},{},[318162],{"type":17,"tag":33,"props":318163,"children":318164},{},[318165],{"type":23,"value":310436},{"type":17,"tag":29,"props":318167,"children":318168},{},[318169],{"type":23,"value":318170},"Finch and Unified.to both provide access to employment data, but they differ in scope and architecture. Finch focuses on HRIS and payroll integrations with scheduled data syncs, while Unified.to provides real-time access to data across multiple categories—including HR—using normalized schemas and a pass-through architecture that does not store customer data.",{"type":17,"tag":29,"props":318172,"children":318173},{},[318174],{"type":23,"value":318175},"Finch is designed for accessing structured HR and payroll data from employment systems. This comparison explains how Finch and Unified.to differ in real-time delivery, data models, integration coverage, and how each platform fits into production applications.",{"type":17,"tag":68,"props":318177,"children":318179},{"id":318178},"tldr-unifiedto-vs-finch",[318180],{"type":17,"tag":48,"props":318181,"children":318182},{},[318183],{"type":23,"value":318184},"TL;DR — Unified.to vs Finch",{"type":17,"tag":7231,"props":318186,"children":318187},{},[318188,318215],{"type":17,"tag":7235,"props":318189,"children":318190},{},[318191],{"type":17,"tag":7239,"props":318192,"children":318193},{},[318194,318201,318208],{"type":17,"tag":7243,"props":318195,"children":318196},{},[318197],{"type":17,"tag":48,"props":318198,"children":318199},{},[318200],{"type":23,"value":87518},{"type":17,"tag":7243,"props":318202,"children":318203},{},[318204],{"type":17,"tag":48,"props":318205,"children":318206},{},[318207],{"type":23,"value":217},{"type":17,"tag":7243,"props":318209,"children":318210},{},[318211],{"type":17,"tag":48,"props":318212,"children":318213},{},[318214],{"type":23,"value":7973},{"type":17,"tag":7259,"props":318216,"children":318217},{},[318218,318238,318258,318278,318298,318318,318338,318358,318378,318398],{"type":17,"tag":7239,"props":318219,"children":318220},{},[318221,318228,318233],{"type":17,"tag":7266,"props":318222,"children":318223},{},[318224],{"type":17,"tag":48,"props":318225,"children":318226},{},[318227],{"type":23,"value":293774},{"type":17,"tag":7266,"props":318229,"children":318230},{},[318231],{"type":23,"value":318232},"Fully normalized schemas across 415+ integrations",{"type":17,"tag":7266,"props":318234,"children":318235},{},[318236],{"type":23,"value":318237},"Standardized HRIS and payroll schema only",{"type":17,"tag":7239,"props":318239,"children":318240},{},[318241,318248,318253],{"type":17,"tag":7266,"props":318242,"children":318243},{},[318244],{"type":17,"tag":48,"props":318245,"children":318246},{},[318247],{"type":23,"value":311330},{"type":17,"tag":7266,"props":318249,"children":318250},{},[318251],{"type":23,"value":318252},"Native + virtual webhooks; no polling required",{"type":17,"tag":7266,"props":318254,"children":318255},{},[318256],{"type":23,"value":318257},"Daily or weekly polling; webhooks gated by plan",{"type":17,"tag":7239,"props":318259,"children":318260},{},[318261,318268,318273],{"type":17,"tag":7266,"props":318262,"children":318263},{},[318264],{"type":17,"tag":48,"props":318265,"children":318266},{},[318267],{"type":23,"value":69493},{"type":17,"tag":7266,"props":318269,"children":318270},{},[318271],{"type":23,"value":318272},"Database Sync; real-time context for agents, dashboards, and analytics",{"type":17,"tag":7266,"props":318274,"children":318275},{},[318276],{"type":23,"value":318277},"HR-specific MCP server; manual refresh or webhook from stale data",{"type":17,"tag":7239,"props":318279,"children":318280},{},[318281,318288,318293],{"type":17,"tag":7266,"props":318282,"children":318283},{},[318284],{"type":17,"tag":48,"props":318285,"children":318286},{},[318287],{"type":23,"value":310958},{"type":17,"tag":7266,"props":318289,"children":318290},{},[318291],{"type":23,"value":318292},"Built-in sync to Postgres, MongoDB, MySQL, and more",{"type":17,"tag":7266,"props":318294,"children":318295},{},[318296],{"type":23,"value":318297},"No native DB sync; manual ingestion required",{"type":17,"tag":7239,"props":318299,"children":318300},{},[318301,318308,318313],{"type":17,"tag":7266,"props":318302,"children":318303},{},[318304],{"type":17,"tag":48,"props":318305,"children":318306},{},[318307],{"type":23,"value":69408},{"type":17,"tag":7266,"props":318309,"children":318310},{},[318311],{"type":23,"value":318312},"Zero-data architecture; nothing stored or cached",{"type":17,"tag":7266,"props":318314,"children":318315},{},[318316],{"type":23,"value":318317},"Stores customer data and tokens",{"type":17,"tag":7239,"props":318319,"children":318320},{},[318321,318328,318333],{"type":17,"tag":7266,"props":318322,"children":318323},{},[318324],{"type":17,"tag":48,"props":318325,"children":318326},{},[318327],{"type":23,"value":267529},{"type":17,"tag":7266,"props":318329,"children":318330},{},[318331],{"type":23,"value":318332},"SDKs in 7+ languages, open components, fast support",{"type":17,"tag":7266,"props":318334,"children":318335},{},[318336],{"type":23,"value":318337},"Limited SDKs, good docs, sandbox for HR integrations",{"type":17,"tag":7239,"props":318339,"children":318340},{},[318341,318348,318353],{"type":17,"tag":7266,"props":318342,"children":318343},{},[318344],{"type":17,"tag":48,"props":318345,"children":318346},{},[318347],{"type":23,"value":264209},{"type":17,"tag":7266,"props":318349,"children":318350},{},[318351],{"type":23,"value":318352},"Usage-based pricing with unlimited connections on higher tiers",{"type":17,"tag":7266,"props":318354,"children":318355},{},[318356],{"type":23,"value":318357},"Cost scales linearly per connected employer",{"type":17,"tag":7239,"props":318359,"children":318360},{},[318361,318368,318373],{"type":17,"tag":7266,"props":318362,"children":318363},{},[318364],{"type":17,"tag":48,"props":318365,"children":318366},{},[318367],{"type":23,"value":316979},{"type":17,"tag":7266,"props":318369,"children":318370},{},[318371],{"type":23,"value":318372},"General-purpose unified API built for real-time SaaS",{"type":17,"tag":7266,"props":318374,"children":318375},{},[318376],{"type":23,"value":318377},"Employment data API for HR tech",{"type":17,"tag":7239,"props":318379,"children":318380},{},[318381,318388,318393],{"type":17,"tag":7266,"props":318382,"children":318383},{},[318384],{"type":17,"tag":48,"props":318385,"children":318386},{},[318387],{"type":23,"value":292743},{"type":17,"tag":7266,"props":318389,"children":318390},{},[318391],{"type":23,"value":318392},"Transparent plans starting at $350/month",{"type":17,"tag":7266,"props":318394,"children":318395},{},[318396],{"type":23,"value":318397},"$50 per connection; Pro/Premier requires sales",{"type":17,"tag":7239,"props":318399,"children":318400},{},[318401,318408,318413],{"type":17,"tag":7266,"props":318402,"children":318403},{},[318404],{"type":17,"tag":48,"props":318405,"children":318406},{},[318407],{"type":23,"value":502},{"type":17,"tag":7266,"props":318409,"children":318410},{},[318411],{"type":23,"value":318412},"Teams building across categories and domains with live data needs",{"type":17,"tag":7266,"props":318414,"children":318415},{},[318416],{"type":23,"value":318417},"HR/payroll-focused products needing structured employee data",{"type":17,"tag":239,"props":318419,"children":318421},{"id":318420},"when-to-choose-finch-vs-unifiedto",[318422],{"type":23,"value":318423},"When to choose Finch vs Unified.to",{"type":17,"tag":29,"props":318425,"children":318426},{},[318427],{"type":17,"tag":48,"props":318428,"children":318429},{},[318430],{"type":23,"value":318431},"Choose Finch if:",{"type":17,"tag":80,"props":318433,"children":318434},{},[318435,318440,318445],{"type":17,"tag":84,"props":318436,"children":318437},{},[318438],{"type":23,"value":318439},"You only need HRIS and payroll integrations",{"type":17,"tag":84,"props":318441,"children":318442},{},[318443],{"type":23,"value":318444},"Your workflows can rely on scheduled or batch data updates",{"type":17,"tag":84,"props":318446,"children":318447},{},[318448],{"type":23,"value":318449},"Your product is focused exclusively on employment data",{"type":17,"tag":29,"props":318451,"children":318452},{},[318453],{"type":17,"tag":48,"props":318454,"children":318455},{},[318456],{"type":23,"value":310523},{"type":17,"tag":80,"props":318458,"children":318459},{},[318460,318465,318470,318475],{"type":17,"tag":84,"props":318461,"children":318462},{},[318463],{"type":23,"value":318464},"Your product requires real-time data from source APIs",{"type":17,"tag":84,"props":318466,"children":318467},{},[318468],{"type":23,"value":318469},"You need data across multiple categories (HR, CRM, ATS, etc.)",{"type":17,"tag":84,"props":318471,"children":318472},{},[318473],{"type":23,"value":318474},"You are building AI features that depend on current, structured data",{"type":17,"tag":84,"props":318476,"children":318477},{},[318478],{"type":23,"value":313745},{"type":17,"tag":68,"props":318480,"children":318482},{"id":318481},"how-does-finch-compare-to-unifiedto",[318483],{"type":17,"tag":48,"props":318484,"children":318485},{},[318486],{"type":23,"value":318487},"How does Finch compare to Unified.to?",{"type":17,"tag":29,"props":318489,"children":318490},{},[318491],{"type":23,"value":318492},"Finch specializes in employment systems. Unified.to is built for live products that need to move fast across categories like HR, CRM, ATS, and more.",{"type":17,"tag":29,"props":318494,"children":318495},{},[318496],{"type":17,"tag":48,"props":318497,"children":318498},{},[318499],{"type":23,"value":310568},{"type":17,"tag":80,"props":318501,"children":318502},{},[318503,318512,318516,318521,318526,318531],{"type":17,"tag":84,"props":318504,"children":318505},{},[318506,318507,318511],{"type":23,"value":315444},{"type":17,"tag":133,"props":318508,"children":318509},{"href":4999},[318510],{"type":23,"value":5002},{"type":23,"value":313783},{"type":17,"tag":84,"props":318513,"children":318514},{},[318515],{"type":23,"value":87018},{"type":17,"tag":84,"props":318517,"children":318518},{},[318519],{"type":23,"value":318520},"Normalized schemas with passthrough and custom field support",{"type":17,"tag":84,"props":318522,"children":318523},{},[318524],{"type":23,"value":318525},"Database sync with structured records across systems",{"type":17,"tag":84,"props":318527,"children":318528},{},[318529],{"type":23,"value":318530},"Zero-data architecture: no caching, no customer data stored",{"type":17,"tag":84,"props":318532,"children":318533},{},[318534],{"type":23,"value":314733},{"type":17,"tag":68,"props":318536,"children":318538},{"id":318537},"real-time-by-defaultnot-once-a-day-syncs",[318539],{"type":23,"value":318540},"Real-time by default—not once-a-day syncs",{"type":17,"tag":29,"props":318542,"children":318543},{},[318544],{"type":23,"value":318545},"Finch fetches data daily (or weekly for some systems). You can trigger a manual refresh or wait for the next scheduled sync. Real-time webhooks are only available on premium plans and still rely on batch jobs in the background.",{"type":17,"tag":29,"props":318547,"children":318548},{},[318549],{"type":23,"value":318550},"Unified.to retrieves data directly from source APIs on each request, ensuring responses reflect current system state without relying on cached data. If the system supports native events, Unified.to streams them directly. If not, Unified.to emulates webhooks with high-frequency polling and normalized event delivery.",{"type":17,"tag":29,"props":318552,"children":318553},{},[318554],{"type":23,"value":318555},"You don't manage CRON jobs. You just receive consistent, structured webhooks when data changes.",{"type":17,"tag":29,"props":318557,"children":318558},{},[318559],{"type":17,"tag":48,"props":318560,"children":318561},{},[318562],{"type":23,"value":310629},{"type":17,"tag":7231,"props":318564,"children":318565},{},[318566,318584],{"type":17,"tag":7235,"props":318567,"children":318568},{},[318569],{"type":17,"tag":7239,"props":318570,"children":318571},{},[318572,318576,318580],{"type":17,"tag":7243,"props":318573,"children":318574},{},[318575],{"type":23,"value":98853},{"type":17,"tag":7243,"props":318577,"children":318578},{},[318579],{"type":23,"value":7973},{"type":17,"tag":7243,"props":318581,"children":318582},{},[318583],{"type":23,"value":217},{"type":17,"tag":7259,"props":318585,"children":318586},{},[318587,318605,318622,318637],{"type":17,"tag":7239,"props":318588,"children":318589},{},[318590,318595,318600],{"type":17,"tag":7266,"props":318591,"children":318592},{},[318593],{"type":23,"value":318594},"Data scope",{"type":17,"tag":7266,"props":318596,"children":318597},{},[318598],{"type":23,"value":318599},"HRIS and payroll only",{"type":17,"tag":7266,"props":318601,"children":318602},{},[318603],{"type":23,"value":318604},"Multi-category (HR, CRM, ATS, etc.)",{"type":17,"tag":7239,"props":318606,"children":318607},{},[318608,318612,318617],{"type":17,"tag":7266,"props":318609,"children":318610},{},[318611],{"type":23,"value":9960},{"type":17,"tag":7266,"props":318613,"children":318614},{},[318615],{"type":23,"value":318616},"Scheduled sync (daily/weekly)",{"type":17,"tag":7266,"props":318618,"children":318619},{},[318620],{"type":23,"value":318621},"Real-time pass-through reads",{"type":17,"tag":7239,"props":318623,"children":318624},{},[318625,318629,318633],{"type":17,"tag":7266,"props":318626,"children":318627},{},[318628],{"type":23,"value":69408},{"type":17,"tag":7266,"props":318630,"children":318631},{},[318632],{"type":23,"value":318317},{"type":17,"tag":7266,"props":318634,"children":318635},{},[318636],{"type":23,"value":43678},{"type":17,"tag":7239,"props":318638,"children":318639},{},[318640,318645,318650],{"type":17,"tag":7266,"props":318641,"children":318642},{},[318643],{"type":23,"value":318644},"Schema coverage",{"type":17,"tag":7266,"props":318646,"children":318647},{},[318648],{"type":23,"value":318649},"Employment-focused schema",{"type":17,"tag":7266,"props":318651,"children":318652},{},[318653],{"type":23,"value":318654},"Normalized schemas across categories",{"type":17,"tag":68,"props":318656,"children":318658},{"id":318657},"broad-integration-coverage-not-just-hr",[318659],{"type":23,"value":318660},"Broad integration coverage, not just HR",{"type":17,"tag":29,"props":318662,"children":318663},{},[318664],{"type":23,"value":318665},"Finch only supports employment data: HRIS, payroll, benefits, and employment verification.",{"type":17,"tag":29,"props":318667,"children":318668},{},[318669],{"type":23,"value":318670},"Unified.to supports 415+ integrations across 25 categories:",{"type":17,"tag":80,"props":318672,"children":318673},{},[318674,318679,318683,318687],{"type":17,"tag":84,"props":318675,"children":318676},{},[318677],{"type":23,"value":318678},"HRIS and payroll (e.g., BambooHR, ADP, Workday)",{"type":17,"tag":84,"props":318680,"children":318681},{},[318682],{"type":23,"value":315521},{"type":17,"tag":84,"props":318684,"children":318685},{},[318686],{"type":23,"value":315526},{"type":17,"tag":84,"props":318688,"children":318689},{},[318690],{"type":23,"value":318691},"File storage, calendars, marketing tools, and more",{"type":17,"tag":29,"props":318693,"children":318694},{},[318695],{"type":23,"value":318696},"This means one integration provider can handle multiple needs—no context switching, no duplicate tooling.",{"type":17,"tag":239,"props":318698,"children":318700},{"id":318699},"customer-spotlight-humi",[318701],{"type":17,"tag":48,"props":318702,"children":318703},{},[318704],{"type":23,"value":318705},"Customer Spotlight: Humi",{"type":17,"tag":29,"props":318707,"children":318708},{},[318709,318715],{"type":17,"tag":133,"props":318710,"children":318713},{"href":318711,"rel":318712},"https://www.humi.ca/",[214],[318714],{"type":23,"value":216704},{"type":23,"value":318716},", a leading Canadian HR software company, needed to streamline employee onboarding by integrating with 25+ HRIS systems. Their internal estimate was 3–6 months per integration—up to 7+ years of engineering time.",{"type":17,"tag":29,"props":318718,"children":318719},{},[318720,318722,318729],{"type":23,"value":318721},"Instead, ",{"type":17,"tag":133,"props":318723,"children":318726},{"href":318724,"rel":318725},"https://unified.to/blog/how_humi_delivers_a_faster_onboarding_experience_with_unified",[214],[318727],{"type":23,"value":318728},"Humi shipped all 25 HRIS integrations in just one month",{"type":23,"value":318730}," using Unified.to. No polling. No custom ETL. Just normalized employee data, provisioned in real time.",{"type":17,"tag":3414,"props":318732,"children":318733},{},[318734,318744],{"type":17,"tag":29,"props":318735,"children":318736},{},[318737,318738,318743],{"type":23,"value":251512},{"type":17,"tag":33,"props":318739,"children":318740},{},[318741],{"type":23,"value":318742},"Unified is impressively fast at responding to our integration requests and adding them within days. Offering direct integrations through Unified.to brings tremendous value to our customers.",{"type":23,"value":251512},{"type":17,"tag":29,"props":318745,"children":318746},{},[318747],{"type":23,"value":318748},"— Kevin Kliman, CEO, Humi",{"type":17,"tag":68,"props":318750,"children":318752},{"id":318751},"unified-schemaswith-escape-hatches",[318753],{"type":23,"value":318754},"Unified schemas—with escape hatches",{"type":17,"tag":29,"props":318756,"children":318757},{},[318758],{"type":23,"value":318759},"Finch provides a consistent data model for employees, pay runs, and benefits. It's solid if you're only dealing with employment data.",{"type":17,"tag":29,"props":318761,"children":318762},{},[318763],{"type":23,"value":318764},"Unified.to normalizes data across every category it supports. Each domain (HR, CRM, etc.) has its own schema with standardized fields, relationships, and enums.",{"type":17,"tag":29,"props":318766,"children":318767},{},[318768],{"type":23,"value":318769},"You also get:",{"type":17,"tag":80,"props":318771,"children":318772},{},[318773,318778,318783],{"type":17,"tag":84,"props":318774,"children":318775},{},[318776],{"type":23,"value":318777},"Custom fields",{"type":17,"tag":84,"props":318779,"children":318780},{},[318781],{"type":23,"value":318782},"Original/raw fields",{"type":17,"tag":84,"props":318784,"children":318785},{},[318786],{"type":23,"value":318787},"Passthrough API to fetch anything outside the unified model",{"type":17,"tag":29,"props":318789,"children":318790},{},[318791],{"type":23,"value":318792},"No waiting for schema updates. No lost data. No tradeoffs.",{"type":17,"tag":68,"props":318794,"children":318796},{"id":318795},"database-ready-delivery",[318797],{"type":23,"value":318798},"Database-ready delivery",{"type":17,"tag":29,"props":318800,"children":318801},{},[318802],{"type":23,"value":318803},"Finch requires you to build your own ingestion layer. You fetch data via API or webhook and write to your own store.",{"type":17,"tag":29,"props":318805,"children":318806},{},[318807],{"type":23,"value":318808},"Unified.to offers built-in Database Sync:",{"type":17,"tag":80,"props":318810,"children":318811},{},[318812,318817,318822],{"type":17,"tag":84,"props":318813,"children":318814},{},[318815],{"type":23,"value":318816},"Connect Postgres, MongoDB, MySQL, and more",{"type":17,"tag":84,"props":318818,"children":318819},{},[318820],{"type":23,"value":318821},"Unified.to keeps your tables updated in real-time",{"type":17,"tag":84,"props":318823,"children":318824},{},[318825],{"type":23,"value":318826},"No polling, no transformation, no ETL jobs",{"type":17,"tag":29,"props":318828,"children":318829},{},[318830],{"type":23,"value":318831},"You get structured records, normalized by category, always current.",{"type":17,"tag":68,"props":318833,"children":318835},{"id":318834},"zero-customer-data-stored",[318836],{"type":23,"value":318837},"Zero customer data stored",{"type":17,"tag":29,"props":318839,"children":318840},{},[318841],{"type":23,"value":318842},"Finch stores customer data and tokens. That simplifies caching, but it increases your compliance footprint.",{"type":17,"tag":29,"props":318844,"children":318845},{},[318846],{"type":23,"value":318847},"Unified.to doesn't store customer data or credentials. Everything is proxied live. You can even use your own AWS Secrets Manager.",{"type":17,"tag":29,"props":318849,"children":318850},{},[318851],{"type":23,"value":318852},"You stay in control of your architecture, security posture, and vendor exposure.",{"type":17,"tag":68,"props":318854,"children":318856},{"id":318855},"developer-first-without-tradeoffs",[318857],{"type":23,"value":318858},"Developer-first without tradeoffs",{"type":17,"tag":29,"props":318860,"children":318861},{},[318862],{"type":23,"value":318863},"Finch offers clean documentation and a good sandbox for HR use cases. It supports a handful of SDKs and a drop-in auth modal.",{"type":17,"tag":29,"props":318865,"children":318866},{},[318867],{"type":23,"value":318868},"Unified.to goes further:",{"type":17,"tag":80,"props":318870,"children":318871},{},[318872,318876,318881,318886,318891],{"type":17,"tag":84,"props":318873,"children":318874},{},[318875],{"type":23,"value":317377},{"type":17,"tag":84,"props":318877,"children":318878},{},[318879],{"type":23,"value":318880},"React/Vue/Angular auth component with source code",{"type":17,"tag":84,"props":318882,"children":318883},{},[318884],{"type":23,"value":318885},"Full CRUD support across integrations",{"type":17,"tag":84,"props":318887,"children":318888},{},[318889],{"type":23,"value":318890},"OpenAPI and Proto schemas",{"type":17,"tag":84,"props":318892,"children":318893},{},[318894],{"type":23,"value":318895},"Fast turnaround on new integration requests",{"type":17,"tag":29,"props":318897,"children":318898},{},[318899,318901,318908],{"type":23,"value":318900},"And Unified.to doesn't just support you during onboarding. ",{"type":17,"tag":133,"props":318902,"children":318905},{"href":318903,"rel":318904},"https://www.g2.com/products/unified-to/reviews",[214],[318906],{"type":23,"value":318907},"Product teams cite ongoing responsiveness",{"type":23,"value":318909}," as a key reason they launch quickly.",{"type":17,"tag":68,"props":318911,"children":318912},{"id":311874},[318913],{"type":23,"value":311877},{"type":17,"tag":29,"props":318915,"children":318916},{},[318917,318919,318923,318924,318928,318929,318934,318935,318939,318940,318944,318945,318949,318950,318954],{"type":23,"value":318918},"G2 isn't a spec sheet, but it's a useful signal for onboarding, support, and day-to-day reliability. As of ",{"type":17,"tag":48,"props":318920,"children":318921},{},[318922],{"type":23,"value":231338},{"type":23,"value":11826},{"type":17,"tag":48,"props":318925,"children":318926},{},[318927],{"type":23,"value":7973},{"type":23,"value":311893},{"type":17,"tag":48,"props":318930,"children":318931},{},[318932],{"type":23,"value":318933},"4.7/5",{"type":23,"value":70920},{"type":17,"tag":48,"props":318936,"children":318937},{},[318938],{"type":23,"value":315828},{"type":23,"value":12561},{"type":17,"tag":48,"props":318941,"children":318942},{},[318943],{"type":23,"value":217},{"type":23,"value":311893},{"type":17,"tag":48,"props":318946,"children":318947},{},[318948],{"type":23,"value":311915},{"type":23,"value":70920},{"type":17,"tag":48,"props":318951,"children":318952},{},[318953],{"type":23,"value":311921},{"type":23,"value":54},{"type":17,"tag":239,"props":318956,"children":318958},{"id":318957},"finch-themes-from-g2-reviews",[318959],{"type":23,"value":318960},"Finch (themes from G2 reviews)",{"type":17,"tag":29,"props":318962,"children":318963},{},[318964],{"type":17,"tag":48,"props":318965,"children":318966},{},[318967],{"type":23,"value":311935},{"type":17,"tag":80,"props":318969,"children":318970},{},[318971,318976,318981],{"type":17,"tag":84,"props":318972,"children":318973},{},[318974],{"type":23,"value":318975},"Strong support experience (CSM/dev success, responsive troubleshooting, proactive comms).",{"type":17,"tag":84,"props":318977,"children":318978},{},[318979],{"type":23,"value":318980},"Coverage in HRIS/payroll and the value of a unified surface instead of building one-off provider integrations.",{"type":17,"tag":84,"props":318982,"children":318983},{},[318984],{"type":23,"value":318985},"Helpful dashboard / front-end components (modal) and generally straightforward setup.",{"type":17,"tag":29,"props":318987,"children":318988},{},[318989],{"type":17,"tag":48,"props":318990,"children":318991},{},[318992],{"type":23,"value":311961},{"type":17,"tag":80,"props":318994,"children":318995},{},[318996,319001,319006,319011],{"type":17,"tag":84,"props":318997,"children":318998},{},[318999],{"type":23,"value":319000},"Provider-specific nuances aren't always obvious upfront, which can create surprises during implementation.",{"type":17,"tag":84,"props":319002,"children":319003},{},[319004],{"type":23,"value":319005},"Data quality / completeness can vary by provider (nullable fields, non-uniform features across systems).",{"type":17,"tag":84,"props":319007,"children":319008},{},[319009],{"type":23,"value":319010},"Debugging can be harder than it should be when connections fail (not enough error detail).",{"type":17,"tag":84,"props":319012,"children":319013},{},[319014],{"type":23,"value":319015},"Assisted connections and partner-side volatility can introduce latency, glitches, or longer SLAs for certain providers.",{"type":17,"tag":29,"props":319017,"children":319018},{},[319019,319023,319025,319030,319032,319037],{"type":17,"tag":48,"props":319020,"children":319021},{},[319022],{"type":23,"value":311987},{"type":23,"value":319024},": Finch's reviews consistently map to a ",{"type":17,"tag":48,"props":319026,"children":319027},{},[319028],{"type":23,"value":319029},"deep HRIS/payroll connectivity specialist",{"type":23,"value":319031},": strong support, meaningful coverage, and real value, but with inevitable provider-by-provider quirks. Unified's reviews map to a ",{"type":17,"tag":48,"props":319033,"children":319034},{},[319035],{"type":23,"value":319036},"broader integration infrastructure platform",{"type":23,"value":319038},": strong debugging visibility, high-touch support, and faster iteration when you need real-time, multi-category integrations.",{"type":17,"tag":239,"props":319040,"children":319041},{"id":7672},[319042],{"type":23,"value":7675},{"type":17,"tag":80,"props":319044,"children":319045},{},[319046,319051,319056,319061],{"type":17,"tag":84,"props":319047,"children":319048},{},[319049],{"type":23,"value":319050},"Finch is focused on HRIS and payroll data with scheduled sync models",{"type":17,"tag":84,"props":319052,"children":319053},{},[319054],{"type":23,"value":319055},"Unified.to provides real-time access across multiple integration categories",{"type":17,"tag":84,"props":319057,"children":319058},{},[319059],{"type":23,"value":319060},"Real-time data access matters for AI features, automation, and user-facing workflows",{"type":17,"tag":84,"props":319062,"children":319063},{},[319064],{"type":23,"value":319065},"Unified.to reduces integration complexity by standardizing schemas across APIs",{"type":17,"tag":29,"props":319067,"children":319068},{},[319069],{"type":23,"value":319070},"Finch is strong if you only need HR/payroll integrations and want structured employee and pay data.",{"type":17,"tag":29,"props":319072,"children":319073},{},[319074],{"type":23,"value":319075},"But if your product needs real-time data across multiple domains—and you want developer control without compliance headaches—Unified.to is the better fit.",{"type":17,"tag":29,"props":319077,"children":319078},{},[319079,319085,319086,319091],{"type":17,"tag":133,"props":319080,"children":319082},{"href":1612,"rel":319081},[214],[319083],{"type":23,"value":319084},"Try it free for 30 days",{"type":23,"value":27293},{"type":17,"tag":133,"props":319087,"children":319089},{"href":1623,"rel":319088},[214],[319090],{"type":23,"value":299181},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":319093},[319094,319097,319098,319099,319102,319103,319104,319105,319106],{"id":318178,"depth":1629,"text":318184,"children":319095},[319096],{"id":318420,"depth":1635,"text":318423},{"id":318481,"depth":1629,"text":318487},{"id":318537,"depth":1629,"text":318540},{"id":318657,"depth":1629,"text":318660,"children":319100},[319101],{"id":318699,"depth":1635,"text":318705},{"id":318751,"depth":1629,"text":318754},{"id":318795,"depth":1629,"text":318798},{"id":318834,"depth":1629,"text":318837},{"id":318855,"depth":1629,"text":318858},{"id":311874,"depth":1629,"text":311877,"children":319107},[319108,319109],{"id":318957,"depth":1635,"text":318960},{"id":7672,"depth":1635,"text":7675},"content:blog:finch_vs_unified_which_unified_api_handles_employment_data_and_real_time_workflows_better.md","blog/finch_vs_unified_which_unified_api_handles_employment_data_and_real_time_workflows_better.md","blog/finch_vs_unified_which_unified_api_handles_employment_data_and_real_time_workflows_better",{"_path":319114,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":319115,"description":319116,"img":319117,"date":318132,"tag":6341,"body":319118,"_type":1677,"_id":319430,"_source":1679,"_file":319431,"_stem":319432,"_extension":1682},"/blog/how_to_power_claude_with_live_customer_data_using_unified_mcp","How to Power Claude with Live Customer Data Using Unified MCP","If you're building your software application with Anthropic's LLM API and want more than a thin agent, your application needs access to real end-customer data...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_power_claude_with_live_customer_data_using_unified_mcp-icon.webp",{"type":14,"children":319119,"toc":319423},[319120,319125,319128,319135,319143,319156,319167,319172,319178,319188,319193,319211,319217,319222,319235,319240,319248,319253,319259,319264,319269,319294,319299,319304,319310,319315,319338,319343,319349,319354,319362,319366,319396,319401,319406],{"type":17,"tag":18,"props":319121,"children":319123},{"id":319122},"how-to-power-claude-with-live-customer-data-using-unified-mcp",[319124],{"type":23,"value":319115},{"type":17,"tag":25,"props":319126,"children":319127},{},[],{"type":17,"tag":29,"props":319129,"children":319130},{},[319131],{"type":17,"tag":33,"props":319132,"children":319133},{},[319134],{"type":23,"value":318150},{"type":17,"tag":29,"props":319136,"children":319137},{},[319138],{"type":17,"tag":6438,"props":319139,"children":319142},{"alt":319140,"src":319141},"MCPSERVER.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_power_claude_with_live_customer_data_using_unified_mcp-0.png",[],{"type":17,"tag":29,"props":319144,"children":319145},{},[319146,319148,319154],{"type":23,"value":319147},"If you're building your software application with Anthropic's LLM API ",{"type":17,"tag":133,"props":319149,"children":319152},{"href":319150,"rel":319151},"https://claude.ai/",[214],[319153],{"type":23,"value":133},{"type":23,"value":319155},"nd want more than a thin agent, your application needs access to real end-customer data — like pulling HubSpot deals, sending a Slack message, or updating a candidate in Greenhouse.",{"type":17,"tag":29,"props":319157,"children":319158},{},[319159,319161,319165],{"type":23,"value":319160},"You can wire this up yourself using Unified's API, which will save you a ton of time as it is a single API for multiple SaaS APIs. Or you can point your LLM API at Unified's ",{"type":17,"tag":133,"props":319162,"children":319163},{"href":326},[319164],{"type":23,"value":329},{"type":23,"value":319166}," server and launch even faster.",{"type":17,"tag":29,"props":319168,"children":319169},{},[319170],{"type":23,"value":319171},"We'll break down when to use Unified's MCP server, and when to reach for the API instead.",{"type":17,"tag":68,"props":319173,"children":319175},{"id":319174},"how-unifieds-mcp-server-works",[319176],{"type":23,"value":319177},"How Unified's MCP Server Works",{"type":17,"tag":29,"props":319179,"children":319180},{},[319181,319183,319187],{"type":23,"value":319182},"Unified's MCP Server exposes real, user-authorized SaaS integrations to any LLM that supports ",{"type":17,"tag":133,"props":319184,"children":319185},{"href":64193},[319186],{"type":23,"value":44580},{"type":23,"value":54},{"type":17,"tag":29,"props":319189,"children":319190},{},[319191],{"type":23,"value":319192},"Anthropic's API, Claude or Cursor can:",{"type":17,"tag":80,"props":319194,"children":319195},{},[319196,319201,319206],{"type":17,"tag":84,"props":319197,"children":319198},{},[319199],{"type":23,"value":319200},"Discover tools based on a given Unified connection",{"type":17,"tag":84,"props":319202,"children":319203},{},[319204],{"type":23,"value":319205},"Call those tools directly through our MCP endpoint",{"type":17,"tag":84,"props":319207,"children":319208},{},[319209],{"type":23,"value":319210},"Use the result in its next generation step",{"type":17,"tag":68,"props":319212,"children":319214},{"id":319213},"two-paths-api-vs-mcp",[319215],{"type":23,"value":319216},"Two Paths: API vs MCP",{"type":17,"tag":29,"props":319218,"children":319219},{},[319220],{"type":23,"value":319221},"Unified supports two integration interfaces:",{"type":17,"tag":29,"props":319223,"children":319224},{},[319225],{"type":17,"tag":48,"props":319226,"children":319227},{},[319228,319229,319233],{"type":23,"value":262081},{"type":17,"tag":133,"props":319230,"children":319231},{"href":7691},[319232],{"type":23,"value":7806},{"type":23,"value":319234}," (Backend Integration)",{"type":17,"tag":29,"props":319236,"children":319237},{},[319238],{"type":23,"value":319239},"Best for production-grade apps. You fetch and transform data yourself, persist what matters, and optionally embed it in a vector database. Full control, real scalability.",{"type":17,"tag":29,"props":319241,"children":319242},{},[319243],{"type":17,"tag":48,"props":319244,"children":319245},{},[319246],{"type":23,"value":319247},"2. Unified MCP Server (Direct-to-LLM)",{"type":17,"tag":29,"props":319249,"children":319250},{},[319251],{"type":23,"value":319252},"Best for prototyping or agent UXs. You point Anthropic's API, Claude or Cursor at a live MCP endpoint, and it auto-discovers available tools — all backed by your end-user's authorized connections.",{"type":17,"tag":68,"props":319254,"children":319256},{"id":319255},"why-claude-mcp-is-the-best-fit",[319257],{"type":23,"value":319258},"Why Claude + MCP Is the Best Fit",{"type":17,"tag":29,"props":319260,"children":319261},{},[319262],{"type":23,"value":319263},"The strongest use case for Unified's MCP Server is direct integration with the Anthropic API. It's already a common pattern among Unified users: AI-native SaaS teams wiring real-time tools into their product experience.",{"type":17,"tag":29,"props":319265,"children":319266},{},[319267],{"type":23,"value":319268},"With MCP, you now have two ways to access your customer's data:",{"type":17,"tag":6154,"props":319270,"children":319271},{},[319272,319282],{"type":17,"tag":84,"props":319273,"children":319274},{},[319275,319276,319280],{"type":23,"value":48249},{"type":17,"tag":48,"props":319277,"children":319278},{},[319279],{"type":23,"value":7806},{"type":23,"value":319281}," and call it from your backend",{"type":17,"tag":84,"props":319283,"children":319284},{},[319285,319287,319292],{"type":23,"value":319286},"Point the ",{"type":17,"tag":48,"props":319288,"children":319289},{},[319290],{"type":23,"value":319291},"Anthropic API",{"type":23,"value":319293}," at Unified's MCP Server and let it fetch tools on its own",{"type":17,"tag":29,"props":319295,"children":319296},{},[319297],{"type":23,"value":319298},"This lets your team skip everything between OAuth and LLM — no middleware, no polling, no schema juggling. You stay focused on your product's core logic while Claude handles tool orchestration via Unified.",{"type":17,"tag":29,"props":319300,"children":319301},{},[319302],{"type":23,"value":319303},"That's always been the promise of a Unified API: do less glue work and ship faster. MCP just makes that even more direct.",{"type":17,"tag":68,"props":319305,"children":319307},{"id":319306},"what-to-do-if-youre-building-for-scale",[319308],{"type":23,"value":319309},"What to Do if You're Building for Scale",{"type":17,"tag":29,"props":319311,"children":319312},{},[319313],{"type":23,"value":319314},"If your product is heading toward scale, especially if it requires logging, observability, or context-aware data access, the better path is:",{"type":17,"tag":6154,"props":319316,"children":319317},{},[319318,319323,319328,319333],{"type":17,"tag":84,"props":319319,"children":319320},{},[319321],{"type":23,"value":319322},"Use the Unified API to fetch and normalize data",{"type":17,"tag":84,"props":319324,"children":319325},{},[319326],{"type":23,"value":319327},"Store and filter what matters",{"type":17,"tag":84,"props":319329,"children":319330},{},[319331],{"type":23,"value":319332},"Embed it into a vector database",{"type":17,"tag":84,"props":319334,"children":319335},{},[319336],{"type":23,"value":319337},"Let your LLM consume it through whatever interface makes sense",{"type":17,"tag":29,"props":319339,"children":319340},{},[319341],{"type":23,"value":319342},"MCP is a fast path to working demos. The API is your infrastructure.",{"type":17,"tag":68,"props":319344,"children":319346},{"id":319345},"example-flow",[319347],{"type":23,"value":319348},"Example Flow",{"type":17,"tag":29,"props":319350,"children":319351},{},[319352],{"type":23,"value":319353},"Claude gets this prompt:",{"type":17,"tag":3414,"props":319355,"children":319356},{},[319357],{"type":17,"tag":29,"props":319358,"children":319359},{},[319360],{"type":23,"value":319361},"'Post a message to #sales about the new signed deal.'",{"type":17,"tag":29,"props":319363,"children":319364},{},[319365],{"type":23,"value":133180},{"type":17,"tag":6154,"props":319367,"children":319368},{},[319369,319381,319386,319391],{"type":17,"tag":84,"props":319370,"children":319371},{},[319372,319374,319380],{"type":23,"value":319373},"Identifies a tool call (e.g. ",{"type":17,"tag":6121,"props":319375,"children":319377},{"className":319376},[],[319378],{"type":23,"value":319379},"send-slack-message",{"type":23,"value":12034},{"type":17,"tag":84,"props":319382,"children":319383},{},[319384],{"type":23,"value":319385},"Sends the tool and parameters to Unified's MCP Server",{"type":17,"tag":84,"props":319387,"children":319388},{},[319389],{"type":23,"value":319390},"Unified makes the call to Slack using the user's connection",{"type":17,"tag":84,"props":319392,"children":319393},{},[319394],{"type":23,"value":319395},"Claude receives the result and continues the conversation",{"type":17,"tag":29,"props":319397,"children":319398},{},[319399],{"type":23,"value":319400},"No servers, no APIs, no code in between.",{"type":17,"tag":29,"props":319402,"children":319403},{},[319404],{"type":23,"value":319405},"Unified's MCP Server is in beta. It supports any authenticated connection, works with Claude or Cursor, and helps you wire up AI features fast without touching infrastructure.",{"type":17,"tag":29,"props":319407,"children":319408},{},[319409,319415,319416,319422],{"type":17,"tag":133,"props":319410,"children":319412},{"href":319411},"mailto:support@unified.to",[319413],{"type":23,"value":319414},"Request early access",{"type":23,"value":75890},{"type":17,"tag":133,"props":319417,"children":319419},{"href":43558,"rel":319418},[214],[319420],{"type":23,"value":319421},"read the MCP docs",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":319424},[319425,319426,319427,319428,319429],{"id":319174,"depth":1629,"text":319177},{"id":319213,"depth":1629,"text":319216},{"id":319255,"depth":1629,"text":319258},{"id":319306,"depth":1629,"text":319309},{"id":319345,"depth":1629,"text":319348},"content:blog:how_to_power_claude_with_live_customer_data_using_unified_mcp.md","blog/how_to_power_claude_with_live_customer_data_using_unified_mcp.md","blog/how_to_power_claude_with_live_customer_data_using_unified_mcp",{"_path":319434,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":319435,"description":319436,"img":319437,"date":318132,"tag":12,"body":319438,"_type":1677,"_id":319848,"_source":1679,"_file":319849,"_stem":319850,"_extension":1682},"/blog/may_2025_product_updates","May 2025 product updates","This month, we added 3 new integrations and significantly expanded schema, method, and webhook coverage across ATS, HR, Accounting, Messaging, and Calendar...","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2025_product_updates-icon.webp",{"type":14,"children":319439,"toc":319841},[319440,319445,319448,319455,319463,319468,319473,319477,319482,319503,319508,319530,319535,319557,319562,319574,319580,319605,319612,319625,319633,319657,319661,319666,319714,319718,319723,319745,319749,319754,319814,319819,319830],{"type":17,"tag":18,"props":319441,"children":319443},{"id":319442},"may-2025-product-updates",[319444],{"type":23,"value":319435},{"type":17,"tag":25,"props":319446,"children":319447},{},[],{"type":17,"tag":29,"props":319449,"children":319450},{},[319451],{"type":17,"tag":33,"props":319452,"children":319453},{},[319454],{"type":23,"value":318150},{"type":17,"tag":29,"props":319456,"children":319457},{},[319458],{"type":17,"tag":6438,"props":319459,"children":319462},{"alt":319460,"src":319461},"product_update_may.png","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2025_product_updates-0.png",[],{"type":17,"tag":29,"props":319464,"children":319465},{},[319466],{"type":23,"value":319467},"This month, we added 3 new integrations and significantly expanded schema, method, and webhook coverage across ATS, HR, Accounting, Messaging, and Calendar APIs.",{"type":17,"tag":29,"props":319469,"children":319470},{},[319471],{"type":23,"value":319472},"Unified continues to support technical teams building real-time, AI-powered products—where up-to-date, normalized data is critical to drive automation, copilots, and user-facing features.",{"type":17,"tag":239,"props":319474,"children":319475},{"id":11629},[319476],{"type":23,"value":11632},{"type":17,"tag":29,"props":319478,"children":319479},{},[319480],{"type":23,"value":319481},"We launched new integrations across HR, CRM, and Authentication, expanding support for customer systems in hiring, payments, and employee management.",{"type":17,"tag":80,"props":319483,"children":319484},{},[319485],{"type":17,"tag":84,"props":319486,"children":319487},{},[319488,319497,319498],{"type":17,"tag":133,"props":319489,"children":319492},{"href":319490,"rel":319491},"https://unified.to/integrations/toast",[214],[319493],{"type":17,"tag":48,"props":319494,"children":319495},{},[319496],{"type":23,"value":121564},{"type":23,"value":18757},{"type":17,"tag":48,"props":319499,"children":319500},{},[319501],{"type":23,"value":319502},"– HR & Directory",{"type":17,"tag":29,"props":319504,"children":319505},{},[319506],{"type":23,"value":319507},"Use case: Sync employee timesheets and shifts from hospitality platforms",{"type":17,"tag":80,"props":319509,"children":319510},{},[319511],{"type":17,"tag":84,"props":319512,"children":319513},{},[319514,319524,319525],{"type":17,"tag":133,"props":319515,"children":319518},{"href":319516,"rel":319517},"https://unified.to/integrations/eploy",[214],[319519],{"type":17,"tag":48,"props":319520,"children":319521},{},[319522],{"type":23,"value":319523},"Eploy",{"type":23,"value":18757},{"type":17,"tag":48,"props":319526,"children":319527},{},[319528],{"type":23,"value":319529},"– ATS / CRM / HR",{"type":17,"tag":29,"props":319531,"children":319532},{},[319533],{"type":23,"value":319534},"Use case: Unify recruiting pipelines, contacts, and activities for hiring workflows",{"type":17,"tag":80,"props":319536,"children":319537},{},[319538],{"type":17,"tag":84,"props":319539,"children":319540},{},[319541,319551,319552],{"type":17,"tag":133,"props":319542,"children":319545},{"href":319543,"rel":319544},"https://unified.to/integrations/quickbookspayment",[214],[319546],{"type":17,"tag":48,"props":319547,"children":319548},{},[319549],{"type":23,"value":319550},"QuickBooks Payments",{"type":23,"value":18757},{"type":17,"tag":48,"props":319553,"children":319554},{},[319555],{"type":23,"value":319556},"– Accounting",{"type":17,"tag":29,"props":319558,"children":319559},{},[319560],{"type":23,"value":319561},"Use case: Access customer payment credentials and reconcile transaction data",{"type":17,"tag":29,"props":319563,"children":319564},{},[319565],{"type":17,"tag":133,"props":319566,"children":319568},{"href":87026,"rel":319567},[214],[319569],{"type":17,"tag":48,"props":319570,"children":319571},{},[319572],{"type":23,"value":319573},"Explore all integrations",{"type":17,"tag":239,"props":319575,"children":319577},{"id":319576},"mcp-server-now-available",[319578],{"type":23,"value":319579},"MCP server now available",{"type":17,"tag":29,"props":319581,"children":319582},{},[319583,319585,319591,319593,319597,319599,319603],{"type":23,"value":319584},"We've launched ",{"type":17,"tag":133,"props":319586,"children":319588},{"href":43558,"rel":319587},[214],[319589],{"type":23,"value":319590},"Unified's MCP server",{"type":23,"value":319592},", enabling any Unified connection to be used inside LLM workflows via the ",{"type":17,"tag":133,"props":319594,"children":319595},{"href":64193},[319596],{"type":23,"value":44580},{"type":23,"value":319598},". This gives developers real-time access to authenticated SaaS data directly inside Claude, Cursor, and other ",{"type":17,"tag":133,"props":319600,"children":319601},{"href":326},[319602],{"type":23,"value":329},{"type":23,"value":319604},"-compatible tools.",{"type":17,"tag":29,"props":319606,"children":319607},{},[319608],{"type":17,"tag":48,"props":319609,"children":319610},{},[319611],{"type":23,"value":71985},{"type":17,"tag":80,"props":319613,"children":319614},{},[319615,319620],{"type":17,"tag":84,"props":319616,"children":319617},{},[319618],{"type":23,"value":319619},"Let end-users query their connected tools via natural language (e.g., 'List invoices for Acme Corp')",{"type":17,"tag":84,"props":319621,"children":319622},{},[319623],{"type":23,"value":319624},"Enable support teams to debug customer integrations with real data context",{"type":17,"tag":29,"props":319626,"children":319627},{},[319628],{"type":17,"tag":48,"props":319629,"children":319630},{},[319631],{"type":23,"value":319632},"MCP endpoints:",{"type":17,"tag":80,"props":319634,"children":319635},{},[319636,319646],{"type":17,"tag":84,"props":319637,"children":319638},{},[319639,319641],{"type":23,"value":319640},"Streamable HTTP: ",{"type":17,"tag":6121,"props":319642,"children":319644},{"className":319643},[],[319645],{"type":23,"value":142206},{"type":17,"tag":84,"props":319647,"children":319648},{},[319649,319651],{"type":23,"value":319650},"Server-Sent Events (SSE): ",{"type":17,"tag":6121,"props":319652,"children":319654},{"className":319653},[],[319655],{"type":23,"value":319656},"https://mcp-api.unified.to/sse",{"type":17,"tag":239,"props":319658,"children":319659},{"id":278477},[319660],{"type":23,"value":300714},{"type":17,"tag":29,"props":319662,"children":319663},{},[319664],{"type":23,"value":319665},"We've expanded both virtual and native webhook support across calendars, messaging, and recruiting tools to enable faster syncs and better automation triggers.",{"type":17,"tag":80,"props":319667,"children":319668},{},[319669,319684,319694,319704],{"type":17,"tag":84,"props":319670,"children":319671},{},[319672,319676,319678,319682],{"type":17,"tag":48,"props":319673,"children":319674},{},[319675],{"type":23,"value":13669},{"type":23,"value":319677},": Native webhook for deleted events and ",{"type":17,"tag":133,"props":319679,"children":319680},{"href":1857},[319681],{"type":23,"value":1860},{"type":23,"value":319683}," for calendar-specific events",{"type":17,"tag":84,"props":319685,"children":319686},{},[319687,319692],{"type":17,"tag":48,"props":319688,"children":319689},{},[319690],{"type":23,"value":319691},"Firefish",{"type":23,"value":319693},": Virtual webhooks for Contact object (created + updated)",{"type":17,"tag":84,"props":319695,"children":319696},{},[319697,319702],{"type":17,"tag":48,"props":319698,"children":319699},{},[319700],{"type":23,"value":319701},"BambooHR / Paradox",{"type":23,"value":319703},": Virtual webhooks for employee and candidate updates",{"type":17,"tag":84,"props":319705,"children":319706},{},[319707,319712],{"type":17,"tag":48,"props":319708,"children":319709},{},[319710],{"type":23,"value":319711},"Wave, Sage HR, Salesloft, RecruitCRM",{"type":23,"value":319713},": Broad webhook coverage for items, timeoffs, calls, events, and contacts",{"type":17,"tag":239,"props":319715,"children":319716},{"id":300651},[319717],{"type":23,"value":300654},{"type":17,"tag":29,"props":319719,"children":319720},{},[319721],{"type":23,"value":319722},"We added hundreds of new readable and writable fields across platforms to support deeper workflows and more granular control across HR, accounting, and CRM data.",{"type":17,"tag":80,"props":319724,"children":319725},{},[319726,319735],{"type":17,"tag":84,"props":319727,"children":319728},{},[319729,319733],{"type":17,"tag":48,"props":319730,"children":319731},{},[319732],{"type":23,"value":13070},{"type":23,"value":319734},": Major field expansion across Account, Contact, Deal, Company, Invoice, and Employee objects",{"type":17,"tag":84,"props":319736,"children":319737},{},[319738,319743],{"type":17,"tag":48,"props":319739,"children":319740},{},[319741],{"type":23,"value":319742},"FourthHR, Trinet Zenefits, Personio",{"type":23,"value":319744},": Expanded employee attributes like marital status, employment type, compensation, and address",{"type":17,"tag":239,"props":319746,"children":319747},{"id":300754},[319748],{"type":23,"value":300757},{"type":17,"tag":29,"props":319750,"children":319751},{},[319752],{"type":23,"value":319753},"More systems now support full CRUD and pagination across new object types—enabling advanced use cases and bi-directional syncs.",{"type":17,"tag":80,"props":319755,"children":319756},{},[319757,319767,319776,319786,319795,319805],{"type":17,"tag":84,"props":319758,"children":319759},{},[319760,319765],{"type":17,"tag":48,"props":319761,"children":319762},{},[319763],{"type":23,"value":319764},"Timeshift (HR)",{"type":23,"value":319766},": New standardized Timeshift object now supported across Trinet Zenefits, Toast, and SquareUp—enables sync of employee shift start/end times for scheduling and attendance use cases",{"type":17,"tag":84,"props":319768,"children":319769},{},[319770,319774],{"type":17,"tag":48,"props":319771,"children":319772},{},[319773],{"type":23,"value":13070},{"type":23,"value":319775},": Full CRUD for Contact, Deal, Group, Invoice, Task, and Event objects",{"type":17,"tag":84,"props":319777,"children":319778},{},[319779,319784],{"type":17,"tag":48,"props":319780,"children":319781},{},[319782],{"type":23,"value":319783},"Outreach.io",{"type":23,"value":319785},": Added Call, Contact, and Recording objects with webhook and method coverage",{"type":17,"tag":84,"props":319787,"children":319788},{},[319789,319793],{"type":17,"tag":48,"props":319790,"children":319791},{},[319792],{"type":23,"value":319691},{"type":23,"value":319794},": Added Contact object with full method support",{"type":17,"tag":84,"props":319796,"children":319797},{},[319798,319803],{"type":17,"tag":48,"props":319799,"children":319800},{},[319801],{"type":23,"value":319802},"Zoho Recruit, Sage HR, BreezyHR",{"type":23,"value":319804},": Added new objects like Document, Timeoff, and Activity",{"type":17,"tag":84,"props":319806,"children":319807},{},[319808,319812],{"type":17,"tag":48,"props":319809,"children":319810},{},[319811],{"type":23,"value":14150},{"type":23,"value":319813},": Full multi-category integration for Messaging, HR, Calendar, and Authentication",{"type":17,"tag":29,"props":319815,"children":319816},{},[319817],{"type":23,"value":319818},"That's a wrap for May. Whether you're powering AI copilots with call data, building custom HR dashboards, or syncing financial records across tools, Unified gives you the speed, structure, and flexibility to move faster.",{"type":17,"tag":29,"props":319820,"children":319821},{},[319822],{"type":17,"tag":133,"props":319823,"children":319825},{"href":1612,"rel":319824},[214],[319826],{"type":17,"tag":48,"props":319827,"children":319828},{},[319829],{"type":23,"value":300863},{"type":17,"tag":29,"props":319831,"children":319832},{},[319833],{"type":17,"tag":133,"props":319834,"children":319836},{"href":1623,"rel":319835},[214],[319837],{"type":17,"tag":48,"props":319838,"children":319839},{},[319840],{"type":23,"value":300875},{"title":7,"searchDepth":1629,"depth":1629,"links":319842},[319843,319844,319845,319846,319847],{"id":11629,"depth":1635,"text":11632},{"id":319576,"depth":1635,"text":319579},{"id":278477,"depth":1635,"text":300714},{"id":300651,"depth":1635,"text":300654},{"id":300754,"depth":1635,"text":300757},"content:blog:may_2025_product_updates.md","blog/may_2025_product_updates.md","blog/may_2025_product_updates",{"_path":319852,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":217202,"description":319853,"img":319854,"date":319855,"tag":6341,"body":319856,"_type":1677,"_id":319999,"_source":1679,"_file":320000,"_stem":320001,"_extension":1682},"/blog/unified_mcp_server","Unified has launched an MCP server that connects any Unified connection to LLM (Large Language Model) providers supporting the newest MCP protocols. The...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mcp_server-icon.png","2025-05-24T00:00:00.000Z",{"type":14,"children":319857,"toc":319995},[319858,319863,319866,319874,319892,319897,319902,319925,319930,319936,319985],{"type":17,"tag":18,"props":319859,"children":319861},{"id":319860},"unifieds-mcp-server",[319862],{"type":23,"value":217202},{"type":17,"tag":25,"props":319864,"children":319865},{},[],{"type":17,"tag":29,"props":319867,"children":319868},{},[319869],{"type":17,"tag":33,"props":319870,"children":319871},{},[319872],{"type":23,"value":319873},"May 24, 2025",{"type":17,"tag":29,"props":319875,"children":319876},{},[319877,319879,319883,319885,319890],{"type":23,"value":319878},"Unified has launched an ",{"type":17,"tag":133,"props":319880,"children":319881},{"href":326},[319882],{"type":23,"value":329},{"type":23,"value":319884}," server that connects any Unified connection to LLM (Large Language Model) providers supporting the newest MCP protocols. The available MCP ",{"type":17,"tag":6121,"props":319886,"children":319888},{"className":319887},[],[319889],{"type":23,"value":131599},{"type":23,"value":319891}," will be determined by the integration's feature support and the connection's requested permissions.",{"type":17,"tag":29,"props":319893,"children":319894},{},[319895],{"type":23,"value":319896},"All MCP tool calls are executed live against the source API. Unified does not cache or store end-customer data, and access is governed by scoped permissions and tool allow-listing.",{"type":17,"tag":68,"props":319898,"children":319899},{"id":950},[319900],{"type":23,"value":319901},"Use-cases:",{"type":17,"tag":80,"props":319903,"children":319904},{},[319905,319915],{"type":17,"tag":84,"props":319906,"children":319907},{},[319908,319913],{"type":17,"tag":48,"props":319909,"children":319910},{},[319911],{"type":23,"value":319912},"End-Customer Conversation with LLMs",{"type":23,"value":319914},": Allows end-customers to interact with an LLM using permissioned tools backed by the data they've explicitly authorized through a Unified connection.",{"type":17,"tag":84,"props":319916,"children":319917},{},[319918,319923],{"type":17,"tag":48,"props":319919,"children":319920},{},[319921],{"type":23,"value":319922},"Debugging End-Customers' Connections",{"type":23,"value":319924},": Allows your product and support teams to assist your end-customers by debugging their Unified connections.  Please make sure that you observe all privacy policies, both yours and your regions's, since end-customer data may be made available to the LLM based on the permissions and tools you explicitly configure. Unified provides options to restrict tools, scope permissions, and remove sensitive fields from responses.",{"type":17,"tag":29,"props":319926,"children":319927},{},[319928],{"type":23,"value":319929},"MCP is a new protocol and it is moving fast.  We expect more LLM & agent clients to support its newer Streamable HTTP transport protocol.  We also expect that the MCP protocol will continue to expand quickly.  Stay tuned as we also keep up.",{"type":17,"tag":68,"props":319931,"children":319933},{"id":319932},"sample-queries",[319934],{"type":23,"value":319935},"Sample queries:",{"type":17,"tag":80,"props":319937,"children":319938},{},[319939,319944,319955,319960,319965,319970,319975,319980],{"type":17,"tag":84,"props":319940,"children":319941},{},[319942],{"type":23,"value":319943},"List candidates for job X",{"type":17,"tag":84,"props":319945,"children":319946},{},[319947,319949],{"type":23,"value":319948},"List deals for contact with email address ",{"type":17,"tag":133,"props":319950,"children":319952},{"href":319951},"mailto:joe@foo.com",[319953],{"type":23,"value":319954},"joe@foo.com",{"type":17,"tag":84,"props":319956,"children":319957},{},[319958],{"type":23,"value":319959},"update application 12345 with a status of HIRED",{"type":17,"tag":84,"props":319961,"children":319962},{},[319963],{"type":23,"value":319964},"summarize the accounting balance sheet report",{"type":17,"tag":84,"props":319966,"children":319967},{},[319968],{"type":23,"value":319969},"find the vacation policy by listing the pages in Notion",{"type":17,"tag":84,"props":319971,"children":319972},{},[319973],{"type":23,"value":319974},"post a message in Slack summarizing this deal",{"type":17,"tag":84,"props":319976,"children":319977},{},[319978],{"type":23,"value":319979},"create an invoice for customer X",{"type":17,"tag":84,"props":319981,"children":319982},{},[319983],{"type":23,"value":319984},"schedule an interview and notify the candidate",{"type":17,"tag":29,"props":319986,"children":319987},{},[319988,319990],{"type":23,"value":319989},"More information can be found at ",{"type":17,"tag":133,"props":319991,"children":319993},{"href":43558,"rel":319992},[214],[319994],{"type":23,"value":43558},{"title":7,"searchDepth":1629,"depth":1629,"links":319996},[319997,319998],{"id":950,"depth":1629,"text":319901},{"id":319932,"depth":1629,"text":319935},"content:blog:unified_mcp_server.md","blog/unified_mcp_server.md","blog/unified_mcp_server",{"_path":320003,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":320004,"description":320005,"img":320006,"date":320007,"tag":12,"body":320008,"_type":1677,"_id":320727,"_source":1679,"_file":320728,"_stem":320729,"_extension":1682},"/blog/truto_vs_unified_which_unified_api_is_best_for_ai_pipelines_and_real_time_data_delivery","Truto vs. Unified.to: which Unified API is best for AI pipelines and real-time data delivery?","Truto and Unified.to both provide unified API infrastructure, but they differ in how data is delivered and structured. Truto relies on configurable schemas and...","https://s3.us-east-2.amazonaws.com/unified-article-images/truto_vs_unified_which_unified_api_is_best_for_ai_pipelines_and_real_time_data_delivery-icon.webp","2025-05-23T00:00:00.000Z",{"type":14,"children":320009,"toc":320710},[320010,320015,320018,320026,320034,320041,320052,320057,320066,320238,320244,320252,320270,320277,320299,320308,320313,320320,320353,320359,320364,320369,320374,320378,320469,320475,320480,320485,320491,320496,320512,320518,320523,320528,320532,320537,320542,320547,320551,320593,320599,320606,320624,320631,320649,320658,320662,320684,320689],{"type":17,"tag":18,"props":320011,"children":320013},{"id":320012},"truto-vs-unifiedto-which-unified-api-is-best-for-ai-pipelines-and-real-time-data-delivery",[320014],{"type":23,"value":320004},{"type":17,"tag":25,"props":320016,"children":320017},{},[],{"type":17,"tag":29,"props":320019,"children":320020},{},[320021],{"type":17,"tag":33,"props":320022,"children":320023},{},[320024],{"type":23,"value":320025},"May 23, 2025",{"type":17,"tag":29,"props":320027,"children":320028},{},[320029],{"type":17,"tag":6438,"props":320030,"children":320033},{"alt":320031,"src":320032},"truto_%283%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/truto_vs_unified_which_unified_api_is_best_for_ai_pipelines_and_real_time_data_delivery-0.png",[],{"type":17,"tag":29,"props":320035,"children":320036},{},[320037],{"type":17,"tag":33,"props":320038,"children":320039},{},[320040],{"type":23,"value":310436},{"type":17,"tag":29,"props":320042,"children":320043},{},[320044,320046,320050],{"type":23,"value":320045},"Truto and Unified.to both provide ",{"type":17,"tag":133,"props":320047,"children":320048},{"href":7691},[320049],{"type":23,"value":7459},{"type":23,"value":320051}," infrastructure, but they differ in how data is delivered and structured. Truto relies on configurable schemas and sync jobs to move data, while Unified.to provides real-time access to normalized data across integrations using a pass-through architecture without storing customer data.",{"type":17,"tag":29,"props":320053,"children":320054},{},[320055],{"type":23,"value":320056},"Truto is designed to help teams build integrations using configurable schemas and sync jobs. This comparison explains how Truto and Unified.to differ in real-time delivery, data models, AI use cases, and how each platform fits into production systems.",{"type":17,"tag":68,"props":320058,"children":320060},{"id":320059},"tldr-unifiedto-vs-truto",[320061],{"type":17,"tag":48,"props":320062,"children":320063},{},[320064],{"type":23,"value":320065},"TL;DR — Unified.to vs Truto",{"type":17,"tag":7231,"props":320067,"children":320068},{},[320069,320096],{"type":17,"tag":7235,"props":320070,"children":320071},{},[320072],{"type":17,"tag":7239,"props":320073,"children":320074},{},[320075,320082,320089],{"type":17,"tag":7243,"props":320076,"children":320077},{},[320078],{"type":17,"tag":48,"props":320079,"children":320080},{},[320081],{"type":23,"value":87518},{"type":17,"tag":7243,"props":320083,"children":320084},{},[320085],{"type":17,"tag":48,"props":320086,"children":320087},{},[320088],{"type":23,"value":217},{"type":17,"tag":7243,"props":320090,"children":320091},{},[320092],{"type":17,"tag":48,"props":320093,"children":320094},{},[320095],{"type":23,"value":8037},{"type":17,"tag":7259,"props":320097,"children":320098},{},[320099,320119,320138,320158,320178,320198,320218],{"type":17,"tag":7239,"props":320100,"children":320101},{},[320102,320109,320114],{"type":17,"tag":7266,"props":320103,"children":320104},{},[320105],{"type":17,"tag":48,"props":320106,"children":320107},{},[320108],{"type":23,"value":293774},{"type":17,"tag":7266,"props":320110,"children":320111},{},[320112],{"type":23,"value":320113},"Deeply normalized schemas with 1100+ objects",{"type":17,"tag":7266,"props":320115,"children":320116},{},[320117],{"type":23,"value":320118},"Configurable schemas, manually mapped",{"type":17,"tag":7239,"props":320120,"children":320121},{},[320122,320129,320133],{"type":17,"tag":7266,"props":320123,"children":320124},{},[320125],{"type":17,"tag":48,"props":320126,"children":320127},{},[320128],{"type":23,"value":311330},{"type":17,"tag":7266,"props":320130,"children":320131},{},[320132],{"type":23,"value":87601},{"type":17,"tag":7266,"props":320134,"children":320135},{},[320136],{"type":23,"value":320137},"Native webhooks + 5-min sync jobs",{"type":17,"tag":7239,"props":320139,"children":320140},{},[320141,320148,320153],{"type":17,"tag":7266,"props":320142,"children":320143},{},[320144],{"type":17,"tag":48,"props":320145,"children":320146},{},[320147],{"type":23,"value":69493},{"type":17,"tag":7266,"props":320149,"children":320150},{},[320151],{"type":23,"value":320152},"Real-time Database sync to your DB",{"type":17,"tag":7266,"props":320154,"children":320155},{},[320156],{"type":23,"value":320157},"Sync to DB with manual job config",{"type":17,"tag":7239,"props":320159,"children":320160},{},[320161,320168,320173],{"type":17,"tag":7266,"props":320162,"children":320163},{},[320164],{"type":17,"tag":48,"props":320165,"children":320166},{},[320167],{"type":23,"value":69408},{"type":17,"tag":7266,"props":320169,"children":320170},{},[320171],{"type":23,"value":320172},"No caching, no persistence",{"type":17,"tag":7266,"props":320174,"children":320175},{},[320176],{"type":23,"value":320177},"No caching, but stores tokens/logs",{"type":17,"tag":7239,"props":320179,"children":320180},{},[320181,320188,320193],{"type":17,"tag":7266,"props":320182,"children":320183},{},[320184],{"type":17,"tag":48,"props":320185,"children":320186},{},[320187],{"type":23,"value":267529},{"type":17,"tag":7266,"props":320189,"children":320190},{},[320191],{"type":23,"value":320192},"SDKS, API-first, declarative",{"type":17,"tag":7266,"props":320194,"children":320195},{},[320196],{"type":23,"value":320197},"Builder UI, custom mapping tools",{"type":17,"tag":7239,"props":320199,"children":320200},{},[320201,320208,320213],{"type":17,"tag":7266,"props":320202,"children":320203},{},[320204],{"type":17,"tag":48,"props":320205,"children":320206},{},[320207],{"type":23,"value":279048},{"type":17,"tag":7266,"props":320209,"children":320210},{},[320211],{"type":23,"value":320212},"30-day free trial, $350/mo to start",{"type":17,"tag":7266,"props":320214,"children":320215},{},[320216],{"type":23,"value":320217},"$499/mo minimum, custom plans for services",{"type":17,"tag":7239,"props":320219,"children":320220},{},[320221,320228,320233],{"type":17,"tag":7266,"props":320222,"children":320223},{},[320224],{"type":17,"tag":48,"props":320225,"children":320226},{},[320227],{"type":23,"value":502},{"type":17,"tag":7266,"props":320229,"children":320230},{},[320231],{"type":23,"value":320232},"AI-native, real-time apps",{"type":17,"tag":7266,"props":320234,"children":320235},{},[320236],{"type":23,"value":320237},"High-volume integration delivery",{"type":17,"tag":239,"props":320239,"children":320241},{"id":320240},"when-to-choose-truto-vs-unifiedto",[320242],{"type":23,"value":320243},"When to choose Truto vs Unified.to",{"type":17,"tag":29,"props":320245,"children":320246},{},[320247],{"type":17,"tag":48,"props":320248,"children":320249},{},[320250],{"type":23,"value":320251},"Choose Truto if:",{"type":17,"tag":80,"props":320253,"children":320254},{},[320255,320260,320265],{"type":17,"tag":84,"props":320256,"children":320257},{},[320258],{"type":23,"value":320259},"You want full control over schema design and mappings",{"type":17,"tag":84,"props":320261,"children":320262},{},[320263],{"type":23,"value":320264},"Your workflows rely on scheduled sync jobs",{"type":17,"tag":84,"props":320266,"children":320267},{},[320268],{"type":23,"value":320269},"You are comfortable managing data pipelines and transformations",{"type":17,"tag":29,"props":320271,"children":320272},{},[320273],{"type":17,"tag":48,"props":320274,"children":320275},{},[320276],{"type":23,"value":310523},{"type":17,"tag":80,"props":320278,"children":320279},{},[320280,320284,320289,320294],{"type":17,"tag":84,"props":320281,"children":320282},{},[320283],{"type":23,"value":317082},{"type":17,"tag":84,"props":320285,"children":320286},{},[320287],{"type":23,"value":320288},"You want normalized schemas across integrations without manual mapping",{"type":17,"tag":84,"props":320290,"children":320291},{},[320292],{"type":23,"value":320293},"You are building AI features that require structured, current data",{"type":17,"tag":84,"props":320295,"children":320296},{},[320297],{"type":23,"value":320298},"You want to avoid managing sync jobs and data pipelines",{"type":17,"tag":68,"props":320300,"children":320302},{"id":320301},"how-does-truto-compare-to-unifiedto",[320303],{"type":17,"tag":48,"props":320304,"children":320305},{},[320306],{"type":23,"value":320307},"How does Truto compare to Unified.to?",{"type":17,"tag":29,"props":320309,"children":320310},{},[320311],{"type":23,"value":320312},"Truto offers broad integration coverage with flexible schema customization. Unified.to focuses on fast, real-time infrastructure for developers building AI-ready SaaS.",{"type":17,"tag":29,"props":320314,"children":320315},{},[320316],{"type":17,"tag":48,"props":320317,"children":320318},{},[320319],{"type":23,"value":310568},{"type":17,"tag":80,"props":320321,"children":320322},{},[320323,320333,320338,320343,320348],{"type":17,"tag":84,"props":320324,"children":320325},{},[320326,320327,320331],{"type":23,"value":313777},{"type":17,"tag":133,"props":320328,"children":320329},{"href":4999},[320330],{"type":23,"value":5002},{"type":23,"value":320332},"](/blog/unlock_real_time_data_with_virtual_webhooks), no polling)",{"type":17,"tag":84,"props":320334,"children":320335},{},[320336],{"type":23,"value":320337},"270+ integrations across 20 high-use categories",{"type":17,"tag":84,"props":320339,"children":320340},{},[320341],{"type":23,"value":320342},"Deeply normalized schemas with passthrough + custom fields",{"type":17,"tag":84,"props":320344,"children":320345},{},[320346],{"type":23,"value":320347},"Database sync: stream structured records to Postgres, Mongo, and more",{"type":17,"tag":84,"props":320349,"children":320350},{},[320351],{"type":23,"value":320352},"Zero-data architecture: no caching, no stored customer data",{"type":17,"tag":68,"props":320354,"children":320356},{"id":320355},"real-time-data-without-sync-jobs-or-polling-intervals",[320357],{"type":23,"value":320358},"Real-time data without sync jobs or polling intervals",{"type":17,"tag":29,"props":320360,"children":320361},{},[320362],{"type":23,"value":320363},"Truto offers a polling-based sync engine (RapidBridge) to keep customer data fresh, with sync intervals starting at 5 minutes.",{"type":17,"tag":29,"props":320365,"children":320366},{},[320367],{"type":23,"value":320368},"Unified.to delivers updates using native and virtual webhooks, with data retrieved directly from source APIs rather than relying on scheduled sync jobs.",{"type":17,"tag":29,"props":320370,"children":320371},{},[320372],{"type":23,"value":320373},"For teams building agents, dashboards, or event-driven features, latency matters. Unified.to keeps you in sync by default.",{"type":17,"tag":239,"props":320375,"children":320376},{"id":310626},[320377],{"type":23,"value":310629},{"type":17,"tag":7231,"props":320379,"children":320380},{},[320381,320399],{"type":17,"tag":7235,"props":320382,"children":320383},{},[320384],{"type":17,"tag":7239,"props":320385,"children":320386},{},[320387,320391,320395],{"type":17,"tag":7243,"props":320388,"children":320389},{},[320390],{"type":23,"value":98853},{"type":17,"tag":7243,"props":320392,"children":320393},{},[320394],{"type":23,"value":8037},{"type":17,"tag":7243,"props":320396,"children":320397},{},[320398],{"type":23,"value":217},{"type":17,"tag":7259,"props":320400,"children":320401},{},[320402,320419,320436,320453],{"type":17,"tag":7239,"props":320403,"children":320404},{},[320405,320409,320414],{"type":17,"tag":7266,"props":320406,"children":320407},{},[320408],{"type":23,"value":244583},{"type":17,"tag":7266,"props":320410,"children":320411},{},[320412],{"type":23,"value":320413},"Sync jobs + polling intervals",{"type":17,"tag":7266,"props":320415,"children":320416},{},[320417],{"type":23,"value":320418},"Real-time webhooks + direct API reads",{"type":17,"tag":7239,"props":320420,"children":320421},{},[320422,320426,320431],{"type":17,"tag":7266,"props":320423,"children":320424},{},[320425],{"type":23,"value":314818},{"type":17,"tag":7266,"props":320427,"children":320428},{},[320429],{"type":23,"value":320430},"Configurable, manually mapped",{"type":17,"tag":7266,"props":320432,"children":320433},{},[320434],{"type":23,"value":320435},"Normalized schemas across integrations",{"type":17,"tag":7239,"props":320437,"children":320438},{},[320439,320443,320448],{"type":17,"tag":7266,"props":320440,"children":320441},{},[320442],{"type":23,"value":310713},{"type":17,"tag":7266,"props":320444,"children":320445},{},[320446],{"type":23,"value":320447},"Requires setup and maintenance",{"type":17,"tag":7266,"props":320449,"children":320450},{},[320451],{"type":23,"value":320452},"Managed delivery via API, webhooks, or database sync",{"type":17,"tag":7239,"props":320454,"children":320455},{},[320456,320460,320465],{"type":17,"tag":7266,"props":320457,"children":320458},{},[320459],{"type":23,"value":69408},{"type":17,"tag":7266,"props":320461,"children":320462},{},[320463],{"type":23,"value":320464},"Stores tokens and logs",{"type":17,"tag":7266,"props":320466,"children":320467},{},[320468],{"type":23,"value":43678},{"type":17,"tag":68,"props":320470,"children":320472},{"id":320471},"clean-normalized-data-across-270-apis",[320473],{"type":23,"value":320474},"Clean, normalized data across 270+ APIs",{"type":17,"tag":29,"props":320476,"children":320477},{},[320478],{"type":23,"value":320479},"Truto lets you define your own schemas and mappings, which is powerful but manual.",{"type":17,"tag":29,"props":320481,"children":320482},{},[320483],{"type":23,"value":320484},"Unified.to gives you deeply normalized data models out of the box—one consistent schema per object, across all platforms. Whether you're working with ATS candidates, CRM contacts, or accounting invoices, you get standardized fields, enums, and relationships with no extra mapping work. Passthrough fields and custom overrides are available when needed.",{"type":17,"tag":68,"props":320486,"children":320488},{"id":320487},"structured-pipelines-for-ai-rag-and-analytics",[320489],{"type":23,"value":320490},"Structured pipelines for AI, RAG, and analytics",{"type":17,"tag":29,"props":320492,"children":320493},{},[320494],{"type":23,"value":320495},"Truto supports AI workflows like RAG pipelines via sync-to-database and selective data sync (RapidForm).",{"type":17,"tag":29,"props":320497,"children":320498},{},[320499,320501,320510],{"type":23,"value":320500},"Unified.to goes further with ",{"type":17,"tag":133,"props":320502,"children":320505},{"href":320503,"rel":320504},"https://unified.to/blog/march_2025_product_updates",[214],[320506],{"type":17,"tag":48,"props":320507,"children":320508},{},[320509],{"type":23,"value":317315},{"type":23,"value":320511},": it streams real-time records from 270+ APIs into your DB—no ETL required. Whether you're embedding data into a vector store, joining it with internal metrics, or serving it to an agent, Unified.to makes live, structured data a first-class output.",{"type":17,"tag":68,"props":320513,"children":320515},{"id":320514},"no-data-stored-no-vendor-lock-in",[320516],{"type":23,"value":320517},"No data stored. No vendor lock-in.",{"type":17,"tag":29,"props":320519,"children":320520},{},[320521],{"type":23,"value":320522},"Truto is SOC 2 and HIPAA compliant and doesn't cache third-party data. But Unified.to takes it further: no customer data is ever stored—logs, payloads, and tokens stay with you.",{"type":17,"tag":29,"props":320524,"children":320525},{},[320526],{"type":23,"value":320527},"Store credentials in your own secrets manager. Stream logs into your own observability tools. When data security matters, zero-caching and full data ownership keeps your team in control.",{"type":17,"tag":68,"props":320529,"children":320530},{"id":315761},[320531],{"type":23,"value":315764},{"type":17,"tag":29,"props":320533,"children":320534},{},[320535],{"type":23,"value":320536},"Unified.to provides full SDK coverage (Python, TypeScript, Go, Ruby, PHP, and more), embedded Connect UI, and clean, declarative APIs.",{"type":17,"tag":29,"props":320538,"children":320539},{},[320540],{"type":23,"value":320541},"Truto offers a visual builder to define unified schemas, with strong support for custom mappings and transformation logic.",{"type":17,"tag":29,"props":320543,"children":320544},{},[320545],{"type":23,"value":320546},"But if your team prefers to integrate directly via code—without configuring every connector—Unified.to gives you fast starts, consistent models, and real-time observability out of the box.",{"type":17,"tag":68,"props":320548,"children":320549},{"id":311874},[320550],{"type":23,"value":311877},{"type":17,"tag":29,"props":320552,"children":320553},{},[320554,320556,320560,320561,320565,320566,320570,320571,320576,320577,320581,320582,320586,320587,320592],{"type":23,"value":320555},"G2 isn't a spec sheet, but it's a useful signal for onboarding experience, support quality, and what breaks in real deployments. As of ",{"type":17,"tag":48,"props":320557,"children":320558},{},[320559],{"type":23,"value":231338},{"type":23,"value":11826},{"type":17,"tag":48,"props":320562,"children":320563},{},[320564],{"type":23,"value":8037},{"type":23,"value":311893},{"type":17,"tag":48,"props":320567,"children":320568},{},[320569],{"type":23,"value":311898},{"type":23,"value":70920},{"type":17,"tag":48,"props":320572,"children":320573},{},[320574],{"type":23,"value":320575},"12 reviews",{"type":23,"value":12561},{"type":17,"tag":48,"props":320578,"children":320579},{},[320580],{"type":23,"value":217},{"type":23,"value":311893},{"type":17,"tag":48,"props":320583,"children":320584},{},[320585],{"type":23,"value":311915},{"type":23,"value":70920},{"type":17,"tag":48,"props":320588,"children":320589},{},[320590],{"type":23,"value":320591},"23 reviews",{"type":23,"value":54},{"type":17,"tag":239,"props":320594,"children":320596},{"id":320595},"truto-themes-from-reviews",[320597],{"type":23,"value":320598},"Truto (themes from reviews)",{"type":17,"tag":29,"props":320600,"children":320601},{},[320602],{"type":17,"tag":48,"props":320603,"children":320604},{},[320605],{"type":23,"value":311935},{"type":17,"tag":80,"props":320607,"children":320608},{},[320609,320614,320619],{"type":17,"tag":84,"props":320610,"children":320611},{},[320612],{"type":23,"value":320613},"Teams repeatedly describe shipping integrations in days (or hours) instead of months, with an 'exhaustive' integration catalog.",{"type":17,"tag":84,"props":320615,"children":320616},{},[320617],{"type":23,"value":320618},"Support is a consistent highlight, including direct developer help and fast responses.",{"type":17,"tag":84,"props":320620,"children":320621},{},[320622],{"type":23,"value":320623},"Reviewers call out quick syncing / 'real-time' positioning and overall time savings.",{"type":17,"tag":29,"props":320625,"children":320626},{},[320627],{"type":17,"tag":48,"props":320628,"children":320629},{},[320630],{"type":23,"value":311961},{"type":17,"tag":80,"props":320632,"children":320633},{},[320634,320639,320644],{"type":17,"tag":84,"props":320635,"children":320636},{},[320637],{"type":23,"value":320638},"Documentation and admin interfaces could be more polished, multiple reviews ask for docs to 'get more love.'",{"type":17,"tag":84,"props":320640,"children":320641},{},[320642],{"type":23,"value":320643},"Some missing features vs competitors for full productization, and early UX quirks.",{"type":17,"tag":84,"props":320645,"children":320646},{},[320647],{"type":23,"value":320648},"Pricing comes up as a consideration ('should be cost effective').",{"type":17,"tag":29,"props":320650,"children":320651},{},[320652,320656],{"type":17,"tag":48,"props":320653,"children":320654},{},[320655],{"type":23,"value":311987},{"type":23,"value":320657},": Truto's reviews read like a strong fit when you want an integration partner that helps you move fast with a wide catalog, with the main friction being docs/admin polish and product maturity. Unified's reviews emphasize observability and production-ready DX once integrations become core infrastructure (especially for real-time delivery and debugging visibility).",{"type":17,"tag":239,"props":320659,"children":320660},{"id":7672},[320661],{"type":23,"value":7675},{"type":17,"tag":80,"props":320663,"children":320664},{},[320665,320670,320674,320679],{"type":17,"tag":84,"props":320666,"children":320667},{},[320668],{"type":23,"value":320669},"Truto uses configurable schemas and sync jobs to deliver data",{"type":17,"tag":84,"props":320671,"children":320672},{},[320673],{"type":23,"value":315048},{"type":17,"tag":84,"props":320675,"children":320676},{},[320677],{"type":23,"value":320678},"Real-time delivery reduces latency for AI features and user-facing workflows",{"type":17,"tag":84,"props":320680,"children":320681},{},[320682],{"type":23,"value":320683},"Unified.to removes the need to build and maintain custom data pipelines",{"type":17,"tag":29,"props":320685,"children":320686},{},[320687],{"type":23,"value":320688},"Unified.to gives you normalized data, real-time updates, and developer-friendly delivery options—without storage or sync job complexity.",{"type":17,"tag":29,"props":320690,"children":320691},{},[320692,320700,320701,320709],{"type":17,"tag":133,"props":320693,"children":320695},{"href":1612,"rel":320694},[214],[320696],{"type":17,"tag":48,"props":320697,"children":320698},{},[320699],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":320702,"children":320704},{"href":1623,"rel":320703},[214],[320705],{"type":17,"tag":48,"props":320706,"children":320707},{},[320708],{"type":23,"value":226481},{"type":23,"value":315084},{"title":7,"searchDepth":1629,"depth":1629,"links":320711},[320712,320715,320716,320719,320720,320721,320722,320723],{"id":320059,"depth":1629,"text":320065,"children":320713},[320714],{"id":320240,"depth":1635,"text":320243},{"id":320301,"depth":1629,"text":320307},{"id":320355,"depth":1629,"text":320358,"children":320717},[320718],{"id":310626,"depth":1635,"text":310629},{"id":320471,"depth":1629,"text":320474},{"id":320487,"depth":1629,"text":320490},{"id":320514,"depth":1629,"text":320517},{"id":315761,"depth":1629,"text":315764},{"id":311874,"depth":1629,"text":311877,"children":320724},[320725,320726],{"id":320595,"depth":1635,"text":320598},{"id":7672,"depth":1635,"text":7675},"content:blog:truto_vs_unified_which_unified_api_is_best_for_ai_pipelines_and_real_time_data_delivery.md","blog/truto_vs_unified_which_unified_api_is_best_for_ai_pipelines_and_real_time_data_delivery.md","blog/truto_vs_unified_which_unified_api_is_best_for_ai_pipelines_and_real_time_data_delivery",{"_path":320731,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":320732,"description":320733,"img":320734,"date":320735,"tag":12,"body":320736,"_type":1677,"_id":321686,"_source":1679,"_file":321687,"_stem":321688,"_extension":1682},"/blog/paragon_vs_unified_which_unified_api_is_right_for_your_product","Paragon vs. Unified.to: which Unified API is right for your product?","Unified.to and Paragon both provide ways to build integrations, but they differ in how data is accessed and structured. Paragon uses a workflow-driven approach...","https://s3.us-east-2.amazonaws.com/unified-article-images/paragon_vs_unified_which_unified_api_is_right_for_your_product-icon.png","2025-05-21T00:00:00.000Z",{"type":14,"children":320737,"toc":321666},[320738,320743,320746,320754,320762,320769,320780,320791,320800,321032,321041,321045,321051,321059,321077,321084,321106,321115,321120,321128,321155,321160,321169,321174,321185,321194,321199,321204,321209,321220,321232,321236,321327,321336,321341,321346,321359,321364,321373,321378,321383,321388,321393,321402,321407,321412,321423,321427,321468,321474,321481,321494,321501,321519,321523,321530,321548,321555,321573,321586,321591,321603,321607,321630,321635],{"type":17,"tag":18,"props":320739,"children":320741},{"id":320740},"paragon-vs-unifiedto-which-unified-api-is-right-for-your-product",[320742],{"type":23,"value":320732},{"type":17,"tag":25,"props":320744,"children":320745},{},[],{"type":17,"tag":29,"props":320747,"children":320748},{},[320749],{"type":17,"tag":33,"props":320750,"children":320751},{},[320752],{"type":23,"value":320753},"May 21, 2025",{"type":17,"tag":29,"props":320755,"children":320756},{},[320757],{"type":17,"tag":6438,"props":320758,"children":320761},{"alt":320759,"src":320760},"paragon.png","https://s3.us-east-2.amazonaws.com/unified-article-images/paragon_vs_unified_which_unified_api_is_right_for_your_product-0.png",[],{"type":17,"tag":29,"props":320763,"children":320764},{},[320765],{"type":17,"tag":33,"props":320766,"children":320767},{},[320768],{"type":23,"value":310436},{"type":17,"tag":29,"props":320770,"children":320771},{},[320772,320774,320778],{"type":23,"value":320773},"Unified.to and Paragon both provide ways to build integrations, but they differ in how data is accessed and structured. Paragon uses a workflow-driven approach with polling and connector-level APIs, while Unified.to provides a ",{"type":17,"tag":133,"props":320775,"children":320776},{"href":7691},[320777],{"type":23,"value":7459},{"type":23,"value":320779}," with normalized schemas and real-time data delivery, designed for applications that require consistent data models and direct access to source APIs.",{"type":17,"tag":29,"props":320781,"children":320782},{},[320783,320785,320789],{"type":23,"value":320784},"Paragon is designed for building embedded integrations using workflows, polling, and ",{"type":17,"tag":133,"props":320786,"children":320787},{"href":4999},[320788],{"type":23,"value":5002},{"type":23,"value":320790},". This comparison breaks down how Paragon and Unified.to differ across data models, real-time delivery, AI use cases, and long-term architecture decisions.",{"type":17,"tag":68,"props":320792,"children":320794},{"id":320793},"tldr-unifiedto-vs-paragon",[320795],{"type":17,"tag":48,"props":320796,"children":320797},{},[320798],{"type":23,"value":320799},"TL;DR — Unified.to vs Paragon",{"type":17,"tag":7231,"props":320801,"children":320802},{},[320803,320830],{"type":17,"tag":7235,"props":320804,"children":320805},{},[320806],{"type":17,"tag":7239,"props":320807,"children":320808},{},[320809,320816,320823],{"type":17,"tag":7243,"props":320810,"children":320811},{},[320812],{"type":17,"tag":48,"props":320813,"children":320814},{},[320815],{"type":23,"value":87518},{"type":17,"tag":7243,"props":320817,"children":320818},{},[320819],{"type":17,"tag":48,"props":320820,"children":320821},{},[320822],{"type":23,"value":217},{"type":17,"tag":7243,"props":320824,"children":320825},{},[320826],{"type":17,"tag":48,"props":320827,"children":320828},{},[320829],{"type":23,"value":581},{"type":17,"tag":7259,"props":320831,"children":320832},{},[320833,320852,320872,320892,320912,320932,320952,320972,320992,321012],{"type":17,"tag":7239,"props":320834,"children":320835},{},[320836,320843,320847],{"type":17,"tag":7266,"props":320837,"children":320838},{},[320839],{"type":17,"tag":48,"props":320840,"children":320841},{},[320842],{"type":23,"value":293774},{"type":17,"tag":7266,"props":320844,"children":320845},{},[320846],{"type":23,"value":318232},{"type":17,"tag":7266,"props":320848,"children":320849},{},[320850],{"type":23,"value":320851},"Per-connector models with no unified schema",{"type":17,"tag":7239,"props":320853,"children":320854},{},[320855,320862,320867],{"type":17,"tag":7266,"props":320856,"children":320857},{},[320858],{"type":17,"tag":48,"props":320859,"children":320860},{},[320861],{"type":23,"value":311330},{"type":17,"tag":7266,"props":320863,"children":320864},{},[320865],{"type":23,"value":320866},"Native + virtual webhooks, zero polling logic required",{"type":17,"tag":7266,"props":320868,"children":320869},{},[320870],{"type":23,"value":320871},"Webhooks + high-frequency polling via custom workflows",{"type":17,"tag":7239,"props":320873,"children":320874},{},[320875,320882,320887],{"type":17,"tag":7266,"props":320876,"children":320877},{},[320878],{"type":17,"tag":48,"props":320879,"children":320880},{},[320881],{"type":23,"value":69493},{"type":17,"tag":7266,"props":320883,"children":320884},{},[320885],{"type":23,"value":320886},"Built-in support for RAG, LLM pipelines, and vector DB sync",{"type":17,"tag":7266,"props":320888,"children":320889},{},[320890],{"type":23,"value":320891},"Supports AI use cases via ActionKit, but requires custom workflows",{"type":17,"tag":7239,"props":320893,"children":320894},{},[320895,320902,320907],{"type":17,"tag":7266,"props":320896,"children":320897},{},[320898],{"type":17,"tag":48,"props":320899,"children":320900},{},[320901],{"type":23,"value":310958},{"type":17,"tag":7266,"props":320903,"children":320904},{},[320905],{"type":23,"value":320906},"First-class Database Sync (Postgres, Mongo, etc.) with real-time + historical data",{"type":17,"tag":7266,"props":320908,"children":320909},{},[320910],{"type":23,"value":320911},"No native DB sync—manual workflow setup required",{"type":17,"tag":7239,"props":320913,"children":320914},{},[320915,320922,320927],{"type":17,"tag":7266,"props":320916,"children":320917},{},[320918],{"type":17,"tag":48,"props":320919,"children":320920},{},[320921],{"type":23,"value":69408},{"type":17,"tag":7266,"props":320923,"children":320924},{},[320925],{"type":23,"value":320926},"Zero-data architecture, no caching or credential storage",{"type":17,"tag":7266,"props":320928,"children":320929},{},[320930],{"type":23,"value":320931},"Stores tokens and logs in cloud mode; on-prem available",{"type":17,"tag":7239,"props":320933,"children":320934},{},[320935,320942,320947],{"type":17,"tag":7266,"props":320936,"children":320937},{},[320938],{"type":17,"tag":48,"props":320939,"children":320940},{},[320941],{"type":23,"value":267529},{"type":17,"tag":7266,"props":320943,"children":320944},{},[320945],{"type":23,"value":320946},"SDKs, Connect Component, unified API, consistent models",{"type":17,"tag":7266,"props":320948,"children":320949},{},[320950],{"type":23,"value":320951},"Workflow builder, Connect SDK, flexible but fragmented data access",{"type":17,"tag":7239,"props":320953,"children":320954},{},[320955,320962,320967],{"type":17,"tag":7266,"props":320956,"children":320957},{},[320958],{"type":17,"tag":48,"props":320959,"children":320960},{},[320961],{"type":23,"value":264209},{"type":17,"tag":7266,"props":320963,"children":320964},{},[320965],{"type":23,"value":320966},"Declarative, multi-tenant model with shared schema",{"type":17,"tag":7266,"props":320968,"children":320969},{},[320970],{"type":23,"value":320971},"Workflow-driven, per-customer configurations",{"type":17,"tag":7239,"props":320973,"children":320974},{},[320975,320982,320987],{"type":17,"tag":7266,"props":320976,"children":320977},{},[320978],{"type":17,"tag":48,"props":320979,"children":320980},{},[320981],{"type":23,"value":316979},{"type":17,"tag":7266,"props":320983,"children":320984},{},[320985],{"type":23,"value":320986},"Real-time unified API for AI-native SaaS",{"type":17,"tag":7266,"props":320988,"children":320989},{},[320990],{"type":23,"value":320991},"Embedded iPaaS for building user-facing integrations",{"type":17,"tag":7239,"props":320993,"children":320994},{},[320995,321002,321007],{"type":17,"tag":7266,"props":320996,"children":320997},{},[320998],{"type":17,"tag":48,"props":320999,"children":321000},{},[321001],{"type":23,"value":292743},{"type":17,"tag":7266,"props":321003,"children":321004},{},[321005],{"type":23,"value":321006},"Transparent, usage-based tiers",{"type":17,"tag":7266,"props":321008,"children":321009},{},[321010],{"type":23,"value":321011},"Custom quotes based on customer count and usage",{"type":17,"tag":7239,"props":321013,"children":321014},{},[321015,321022,321027],{"type":17,"tag":7266,"props":321016,"children":321017},{},[321018],{"type":17,"tag":48,"props":321019,"children":321020},{},[321021],{"type":23,"value":43247},{"type":17,"tag":7266,"props":321023,"children":321024},{},[321025],{"type":23,"value":321026},"Teams building AI features, live products, or normalized data pipelines",{"type":17,"tag":7266,"props":321028,"children":321029},{},[321030],{"type":23,"value":321031},"Teams building integration catalogs, embedded UIs, or flexible workflows",{"type":17,"tag":29,"props":321033,"children":321034},{},[321035],{"type":17,"tag":133,"props":321036,"children":321038},{"href":78603,"rel":321037},[214],[321039],{"type":23,"value":321040},"View in-depth integration technology comparison",{"type":17,"tag":11616,"props":321042,"children":321044},{"width":11618,"height":11619,"src":321043,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/JJtzCQaz6Pw",[],{"type":17,"tag":239,"props":321046,"children":321048},{"id":321047},"when-to-choose-paragon-vs-unifiedto",[321049],{"type":23,"value":321050},"When to choose Paragon vs Unified.to",{"type":17,"tag":29,"props":321052,"children":321053},{},[321054],{"type":17,"tag":48,"props":321055,"children":321056},{},[321057],{"type":23,"value":321058},"Choose Paragon if:",{"type":17,"tag":80,"props":321060,"children":321061},{},[321062,321067,321072],{"type":17,"tag":84,"props":321063,"children":321064},{},[321065],{"type":23,"value":321066},"You want a workflow-based approach to building integrations",{"type":17,"tag":84,"props":321068,"children":321069},{},[321070],{"type":23,"value":321071},"Your use case depends on orchestration and UI-driven configuration",{"type":17,"tag":84,"props":321073,"children":321074},{},[321075],{"type":23,"value":321076},"You are building embedded integration catalogs or internal tools",{"type":17,"tag":29,"props":321078,"children":321079},{},[321080],{"type":17,"tag":48,"props":321081,"children":321082},{},[321083],{"type":23,"value":310523},{"type":17,"tag":80,"props":321085,"children":321086},{},[321087,321092,321097,321102],{"type":17,"tag":84,"props":321088,"children":321089},{},[321090],{"type":23,"value":321091},"Your product depends on normalized data across integrations",{"type":17,"tag":84,"props":321093,"children":321094},{},[321095],{"type":23,"value":321096},"You need real-time data from source APIs",{"type":17,"tag":84,"props":321098,"children":321099},{},[321100],{"type":23,"value":321101},"You are building AI features that rely on structured, consistent data",{"type":17,"tag":84,"props":321103,"children":321104},{},[321105],{"type":23,"value":313745},{"type":17,"tag":68,"props":321107,"children":321109},{"id":321108},"how-does-paragon-compare-to-unifiedto",[321110],{"type":17,"tag":48,"props":321111,"children":321112},{},[321113],{"type":23,"value":321114},"How does Paragon compare to Unified.to?",{"type":17,"tag":29,"props":321116,"children":321117},{},[321118],{"type":23,"value":321119},"Paragon helps teams build integrations with workflows and polling. Unified.to is built for products that depend on real-time data, clean schemas, and secure delivery.",{"type":17,"tag":239,"props":321121,"children":321123},{"id":321122},"unifiedto-offers",[321124],{"type":17,"tag":48,"props":321125,"children":321126},{},[321127],{"type":23,"value":311539},{"type":17,"tag":80,"props":321129,"children":321130},{},[321131,321135,321140,321145,321150],{"type":17,"tag":84,"props":321132,"children":321133},{},[321134],{"type":23,"value":311547},{"type":17,"tag":84,"props":321136,"children":321137},{},[321138],{"type":23,"value":321139},"Real-time updates with zero polling logic",{"type":17,"tag":84,"props":321141,"children":321142},{},[321143],{"type":23,"value":321144},"Database-ready delivery for AI pipelines",{"type":17,"tag":84,"props":321146,"children":321147},{},[321148],{"type":23,"value":321149},"No customer data stored ever",{"type":17,"tag":84,"props":321151,"children":321152},{},[321153],{"type":23,"value":321154},"Declarative, developer-first architecture",{"type":17,"tag":29,"props":321156,"children":321157},{},[321158],{"type":23,"value":321159},"Here's a deeper look at how the two platforms differ, especially if your product depends on real-time data, normalized schemas, and secure delivery.",{"type":17,"tag":68,"props":321161,"children":321163},{"id":321162},"real-time-delivery-without-polling-or-custom-sync-logic",[321164],{"type":17,"tag":48,"props":321165,"children":321166},{},[321167],{"type":23,"value":321168},"Real-time delivery without polling or custom sync logic",{"type":17,"tag":29,"props":321170,"children":321171},{},[321172],{"type":23,"value":321173},"Paragon simulates real-time using polling, webhooks, and workflows. But making it work reliably means fallback logic, CRON jobs, and retries.",{"type":17,"tag":29,"props":321175,"children":321176},{},[321177,321179,321183],{"type":23,"value":321178},"Unified removes that complexity. It delivers updates using native webhooks or scheduled ",{"type":17,"tag":133,"props":321180,"children":321181},{"href":9007},[321182],{"type":23,"value":46572},{"type":23,"value":321184},". Data arrives in a cleaned, normalized schema. Whether powering agents, dashboards, or in-app insights, it's current by default.",{"type":17,"tag":68,"props":321186,"children":321188},{"id":321187},"normalized-schemas-across-415-apisno-per-connector-mapping",[321189],{"type":17,"tag":48,"props":321190,"children":321191},{},[321192],{"type":23,"value":321193},"Normalized schemas across 415+ APIs—no per-connector mapping",{"type":17,"tag":29,"props":321195,"children":321196},{},[321197],{"type":23,"value":321198},"Paragon exposes raw APIs. Calling Salesforce returns Salesforce data. Calling HubSpot returns something else. You're left to normalize, clean, transform, and reconcile it all.",{"type":17,"tag":29,"props":321200,"children":321201},{},[321202],{"type":23,"value":321203},"Unified.to gives you a unified model.",{"type":17,"tag":29,"props":321205,"children":321206},{},[321207],{"type":23,"value":321208},"Data from 415+ integrations flows into consistent, normalized structures organized by object type—with standardized fields, enums, and associations. No more conditional logic or edge-case cleanup per provider.",{"type":17,"tag":29,"props":321210,"children":321211},{},[321212,321213,321218],{"type":23,"value":251512},{"type":17,"tag":33,"props":321214,"children":321215},{},[321216],{"type":23,"value":321217},"Without robust integrations, we were being discounted right away",{"type":23,"value":321219},".\" — Steve Hockey, CEO, MyHub",{"type":17,"tag":29,"props":321221,"children":321222},{},[321223,321230],{"type":17,"tag":133,"props":321224,"children":321227},{"href":321225,"rel":321226},"https://unified.to/blog/the_integration_strategy_that_tripled_myhub_enterprise_deals",[214],[321228],{"type":23,"value":321229},"MyHub scaled to 60+ integrations with just one engineer",{"type":23,"value":321231}," using Unified's declarative model. A connector-based approach would've taken far more time. Unified handles the translation so your team can focus on product.",{"type":17,"tag":239,"props":321233,"children":321234},{"id":310626},[321235],{"type":23,"value":310629},{"type":17,"tag":7231,"props":321237,"children":321238},{},[321239,321257],{"type":17,"tag":7235,"props":321240,"children":321241},{},[321242],{"type":17,"tag":7239,"props":321243,"children":321244},{},[321245,321249,321253],{"type":17,"tag":7243,"props":321246,"children":321247},{},[321248],{"type":23,"value":98853},{"type":17,"tag":7243,"props":321250,"children":321251},{},[321252],{"type":23,"value":581},{"type":17,"tag":7243,"props":321254,"children":321255},{},[321256],{"type":23,"value":217},{"type":17,"tag":7259,"props":321258,"children":321259},{},[321260,321277,321294,321310],{"type":17,"tag":7239,"props":321261,"children":321262},{},[321263,321267,321272],{"type":17,"tag":7266,"props":321264,"children":321265},{},[321266],{"type":23,"value":46270},{"type":17,"tag":7266,"props":321268,"children":321269},{},[321270],{"type":23,"value":321271},"Connector-level APIs via workflows",{"type":17,"tag":7266,"props":321273,"children":321274},{},[321275],{"type":23,"value":321276},"Unified API across integrations",{"type":17,"tag":7239,"props":321278,"children":321279},{},[321280,321285,321290],{"type":17,"tag":7266,"props":321281,"children":321282},{},[321283],{"type":23,"value":321284},"Data structure",{"type":17,"tag":7266,"props":321286,"children":321287},{},[321288],{"type":23,"value":321289},"Per-connector schemas",{"type":17,"tag":7266,"props":321291,"children":321292},{},[321293],{"type":23,"value":318654},{"type":17,"tag":7239,"props":321295,"children":321296},{},[321297,321301,321306],{"type":17,"tag":7266,"props":321298,"children":321299},{},[321300],{"type":23,"value":282556},{"type":17,"tag":7266,"props":321302,"children":321303},{},[321304],{"type":23,"value":321305},"Polling + workflows + webhooks",{"type":17,"tag":7266,"props":321307,"children":321308},{},[321309],{"type":23,"value":87601},{"type":17,"tag":7239,"props":321311,"children":321312},{},[321313,321317,321322],{"type":17,"tag":7266,"props":321314,"children":321315},{},[321316],{"type":23,"value":69408},{"type":17,"tag":7266,"props":321318,"children":321319},{},[321320],{"type":23,"value":321321},"Stores tokens and workflow state",{"type":17,"tag":7266,"props":321323,"children":321324},{},[321325],{"type":23,"value":321326},"No end-customer data stored",{"type":17,"tag":68,"props":321328,"children":321330},{"id":321329},"clean-data-pipelines-for-rag-agents-and-embeddings",[321331],{"type":17,"tag":48,"props":321332,"children":321333},{},[321334],{"type":23,"value":321335},"Clean data pipelines for RAG, agents, and embeddings",{"type":17,"tag":29,"props":321337,"children":321338},{},[321339],{"type":23,"value":321340},"Paragon connects to apps but leaves AI prep to you—workflows, transforms, vector store ingestion.",{"type":17,"tag":29,"props":321342,"children":321343},{},[321344],{"type":23,"value":321345},"Unified.to delivers ready-to-ingest data.",{"type":17,"tag":29,"props":321347,"children":321348},{},[321349,321351,321357],{"type":23,"value":321350},"Its data model is AI-ready. Stream structured records from CRMs, ATSs, and HR platforms directly into Postgres, Mongo, or vector DBs using ",{"type":17,"tag":133,"props":321352,"children":321355},{"href":321353,"rel":321354},"https://unified.to/blog/announcing_database_sync_structured_ai_ready_data_delivered_straight_to_your_database",[214],[321356],{"type":23,"value":317315},{"type":23,"value":321358},". Event and historical data align under one schema. No ETL.",{"type":17,"tag":29,"props":321360,"children":321361},{},[321362],{"type":23,"value":321363},"Unified delivers real-time context your models need: from support tickets to file contents and knowledge base pages.",{"type":17,"tag":68,"props":321365,"children":321367},{"id":321366},"zero-data-storedno-compliance-risk-or-vendor-lock-in",[321368],{"type":17,"tag":48,"props":321369,"children":321370},{},[321371],{"type":23,"value":321372},"Zero data stored—no compliance risk or vendor lock-in",{"type":17,"tag":29,"props":321374,"children":321375},{},[321376],{"type":23,"value":321377},"Paragon stores customer data in its infrastructure. Tokens, logs, and metadata, including workflow state, live in their database.",{"type":17,"tag":29,"props":321379,"children":321380},{},[321381],{"type":23,"value":321382},"Unified.to doesn't store end-customer data. Requests are proxied in real time from source to destination. No caching. No persistence.",{"type":17,"tag":29,"props":321384,"children":321385},{},[321386],{"type":23,"value":321387},"You stay in control.",{"type":17,"tag":29,"props":321389,"children":321390},{},[321391],{"type":23,"value":321392},"Data portability is built in. Query via API, subscribe via webhook, or stream directly into your database. One schema. No rewrites. No lock-in.",{"type":17,"tag":68,"props":321394,"children":321396},{"id":321395},"built-for-developers-not-just-workflow-builders",[321397],{"type":17,"tag":48,"props":321398,"children":321399},{},[321400],{"type":23,"value":321401},"Built for developers, not just workflow builders",{"type":17,"tag":29,"props":321403,"children":321404},{},[321405],{"type":23,"value":321406},"Paragon relies on a visual builder, task logs, and workflow controls. But that doesn't scale cleanly when logic spans connectors, mappings, and UI states.",{"type":17,"tag":29,"props":321408,"children":321409},{},[321410],{"type":23,"value":321411},"Unified gives developers clean primitives.",{"type":17,"tag":29,"props":321413,"children":321414},{},[321415,321416,321421],{"type":23,"value":249763},{"type":17,"tag":133,"props":321417,"children":321419},{"href":315782,"rel":321418},[214],[321420],{"type":23,"value":315786},{"type":23,"value":321422},", full API coverage, and a plug-and-play Connect Component for auth, you integrate once and scale across every system. No guessing webhook shapes. No duplicating logic.",{"type":17,"tag":68,"props":321424,"children":321425},{"id":311874},[321426],{"type":23,"value":311877},{"type":17,"tag":29,"props":321428,"children":321429},{},[321430,321432,321436,321437,321441,321442,321446,321447,321452,321453,321457,321458,321462,321463,321467],{"type":23,"value":321431},"G2 is not a spec sheet, but it is a useful signal for onboarding experience, support, and day-to-day reliability. As of ",{"type":17,"tag":48,"props":321433,"children":321434},{},[321435],{"type":23,"value":231338},{"type":23,"value":11826},{"type":17,"tag":48,"props":321438,"children":321439},{},[321440],{"type":23,"value":581},{"type":23,"value":311893},{"type":17,"tag":48,"props":321443,"children":321444},{},[321445],{"type":23,"value":314932},{"type":23,"value":70920},{"type":17,"tag":48,"props":321448,"children":321449},{},[321450],{"type":23,"value":321451},"84 reviews",{"type":23,"value":12561},{"type":17,"tag":48,"props":321454,"children":321455},{},[321456],{"type":23,"value":217},{"type":23,"value":311893},{"type":17,"tag":48,"props":321459,"children":321460},{},[321461],{"type":23,"value":311915},{"type":23,"value":70920},{"type":17,"tag":48,"props":321464,"children":321465},{},[321466],{"type":23,"value":320591},{"type":23,"value":54},{"type":17,"tag":239,"props":321469,"children":321471},{"id":321470},"paragon-themes-from-g2-reviews",[321472],{"type":23,"value":321473},"Paragon (themes from G2 reviews)",{"type":17,"tag":29,"props":321475,"children":321476},{},[321477],{"type":17,"tag":48,"props":321478,"children":321479},{},[321480],{"type":23,"value":311935},{"type":17,"tag":80,"props":321482,"children":321483},{},[321484,321489],{"type":17,"tag":84,"props":321485,"children":321486},{},[321487],{"type":23,"value":321488},"Fast time-to-launch for integrations, lots of prebuilt connectors, 'easy and fast to launch' comes up often.",{"type":17,"tag":84,"props":321490,"children":321491},{},[321492],{"type":23,"value":321493},"Strong support, reviewers frequently describe the team as responsive and helpful.",{"type":17,"tag":29,"props":321495,"children":321496},{},[321497],{"type":17,"tag":48,"props":321498,"children":321499},{},[321500],{"type":23,"value":311961},{"type":17,"tag":80,"props":321502,"children":321503},{},[321504,321509,321514],{"type":17,"tag":84,"props":321505,"children":321506},{},[321507],{"type":23,"value":321508},"Debugging and error visibility can be frustrating, some reviews ask for more informative failure details.",{"type":17,"tag":84,"props":321510,"children":321511},{},[321512],{"type":23,"value":321513},"Workflow engine performance can feel slow for certain use cases.",{"type":17,"tag":84,"props":321515,"children":321516},{},[321517],{"type":23,"value":321518},"Some teams want deeper integration metadata and API-surface visibility over time (beyond OAuth enablement).",{"type":17,"tag":239,"props":321520,"children":321521},{"id":101855},[321522],{"type":23,"value":217},{"type":17,"tag":29,"props":321524,"children":321525},{},[321526],{"type":17,"tag":48,"props":321527,"children":321528},{},[321529],{"type":23,"value":311935},{"type":17,"tag":80,"props":321531,"children":321532},{},[321533,321538,321543],{"type":17,"tag":84,"props":321534,"children":321535},{},[321536],{"type":23,"value":321537},"Developer tooling called out directly (call logs, test calls), plus virtual webhooks as a standout capability.",{"type":17,"tag":84,"props":321539,"children":321540},{},[321541],{"type":23,"value":321542},"Hands-on support and fast turnaround on fixes or requests shows up repeatedly.",{"type":17,"tag":84,"props":321544,"children":321545},{},[321546],{"type":23,"value":321547},"Docs are generally praised, with a common request being 'more examples,' not fundamental blockers.",{"type":17,"tag":29,"props":321549,"children":321550},{},[321551],{"type":17,"tag":48,"props":321552,"children":321553},{},[321554],{"type":23,"value":311961},{"type":17,"tag":80,"props":321556,"children":321557},{},[321558,321563,321568],{"type":17,"tag":84,"props":321559,"children":321560},{},[321561],{"type":23,"value":321562},"Some integration gaps (typically framed as 'newer platform, expanding coverage')",{"type":17,"tag":84,"props":321564,"children":321565},{},[321566],{"type":23,"value":321567},"Requests for more examples in docs",{"type":17,"tag":84,"props":321569,"children":321570},{},[321571],{"type":23,"value":321572},"Occasional early bugs, described as resolved quickly",{"type":17,"tag":3414,"props":321574,"children":321575},{},[321576],{"type":17,"tag":29,"props":321577,"children":321578},{},[321579,321584],{"type":17,"tag":48,"props":321580,"children":321581},{},[321582],{"type":23,"value":321583},"How to interpret this:",{"type":23,"value":321585}," If you want a low-code embedded integrations layer, Paragon's reviews align with that positioning. If you want a unified API platform optimized for real-time delivery and developer-led builds, Unified's reviews line up with the approach described above.",{"type":17,"tag":29,"props":321587,"children":321588},{},[321589],{"type":23,"value":321590},"\"We didn't need to write custom code. Our engineers focused on product, not maintenance.\" — Founder, Sync2Hire",{"type":17,"tag":29,"props":321592,"children":321593},{},[321594,321601],{"type":17,"tag":133,"props":321595,"children":321598},{"href":321596,"rel":321597},"https://unified.to/blog/how_sync2hire_got_to_market_faster_and_launched_enterprise_ready_integrations_with_unified",[214],[321599],{"type":23,"value":321600},"Sync2Hire launched production-ready HRIS and ATS integrations in days",{"type":23,"value":321602}," using Unified's architecture. This is infrastructure that moves with your roadmap.",{"type":17,"tag":239,"props":321604,"children":321605},{"id":7672},[321606],{"type":23,"value":7675},{"type":17,"tag":80,"props":321608,"children":321609},{},[321610,321615,321620,321625],{"type":17,"tag":84,"props":321611,"children":321612},{},[321613],{"type":23,"value":321614},"Paragon is workflow-driven and connector-based",{"type":17,"tag":84,"props":321616,"children":321617},{},[321618],{"type":23,"value":321619},"Unified.to provides a unified API with normalized schemas",{"type":17,"tag":84,"props":321621,"children":321622},{},[321623],{"type":23,"value":321624},"Real-time data access matters for AI features and user-facing products",{"type":17,"tag":84,"props":321626,"children":321627},{},[321628],{"type":23,"value":321629},"Unified.to reduces integration complexity by standardizing data across APIs",{"type":17,"tag":29,"props":321631,"children":321632},{},[321633],{"type":23,"value":321634},"Unified.to gives you real-time data, normalized schemas, and full control. If you're building copilots, agents, or data-driven features—start here.",{"type":17,"tag":29,"props":321636,"children":321637},{},[321638,321646,321647,321651,321652,321660,321661],{"type":17,"tag":133,"props":321639,"children":321641},{"href":1612,"rel":321640},[214],[321642],{"type":17,"tag":48,"props":321643,"children":321644},{},[321645],{"type":23,"value":226470},{"type":23,"value":18757},{"type":17,"tag":48,"props":321648,"children":321649},{},[321650],{"type":23,"value":217439},{"type":23,"value":18757},{"type":17,"tag":133,"props":321653,"children":321655},{"href":1623,"rel":321654},[214],[321656],{"type":17,"tag":48,"props":321657,"children":321658},{},[321659],{"type":23,"value":299181},{"type":23,"value":18757},{"type":17,"tag":48,"props":321662,"children":321663},{},[321664],{"type":23,"value":321665},"to see how fast you can go from connector to capability.",{"title":7,"searchDepth":1629,"depth":1629,"links":321667},[321668,321671,321674,321675,321678,321679,321680,321681],{"id":320793,"depth":1629,"text":320799,"children":321669},[321670],{"id":321047,"depth":1635,"text":321050},{"id":321108,"depth":1629,"text":321114,"children":321672},[321673],{"id":321122,"depth":1635,"text":311539},{"id":321162,"depth":1629,"text":321168},{"id":321187,"depth":1629,"text":321193,"children":321676},[321677],{"id":310626,"depth":1635,"text":310629},{"id":321329,"depth":1629,"text":321335},{"id":321366,"depth":1629,"text":321372},{"id":321395,"depth":1629,"text":321401},{"id":311874,"depth":1629,"text":311877,"children":321682},[321683,321684,321685],{"id":321470,"depth":1635,"text":321473},{"id":101855,"depth":1635,"text":217},{"id":7672,"depth":1635,"text":7675},"content:blog:paragon_vs_unified_which_unified_api_is_right_for_your_product.md","blog/paragon_vs_unified_which_unified_api_is_right_for_your_product.md","blog/paragon_vs_unified_which_unified_api_is_right_for_your_product",{"_path":321690,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":321691,"description":321692,"img":321693,"date":321694,"tag":12,"body":321695,"_type":1677,"_id":322162,"_source":1679,"_file":322163,"_stem":322164,"_extension":1682},"/blog/april_2025_product_updates","April 2025 product updates","This month, we launched 9 new integrations and expanded webhook, pagination, and schema coverage across our Messaging, Accounting, HR, and ATS APIs.","https://s3.us-east-2.amazonaws.com/unified-article-images/april_2025_product_updates-icon.webp","2025-05-12T00:00:00.000Z",{"type":14,"children":321696,"toc":322155},[321697,321702,321705,321713,321721,321732,321737,321744,321749,321764,321769,321784,321789,321803,321808,321822,321827,321841,321846,321859,321864,321879,321884,321898,321902,321916,321920,321928,321937,321942,321951,321956,321961,321985,321994,321999,322042,322047,322078,322087,322092,322111,322116,322128,322133,322144],{"type":17,"tag":18,"props":321698,"children":321700},{"id":321699},"april-2025-product-updates",[321701],{"type":23,"value":321691},{"type":17,"tag":25,"props":321703,"children":321704},{},[],{"type":17,"tag":29,"props":321706,"children":321707},{},[321708],{"type":17,"tag":33,"props":321709,"children":321710},{},[321711],{"type":23,"value":321712},"May 12, 2025",{"type":17,"tag":29,"props":321714,"children":321715},{},[321716],{"type":17,"tag":6438,"props":321717,"children":321720},{"alt":321718,"src":321719},"product_update_april.png","https://s3.us-east-2.amazonaws.com/unified-article-images/april_2025_product_updates-0.png",[],{"type":17,"tag":29,"props":321722,"children":321723},{},[321724,321726,321730],{"type":23,"value":321725},"This month, we launched 9 new integrations and expanded webhook, ",{"type":17,"tag":133,"props":321727,"children":321728},{"href":1857},[321729],{"type":23,"value":1860},{"type":23,"value":321731},", and schema coverage across our Messaging, Accounting, HR, and ATS APIs.",{"type":17,"tag":29,"props":321733,"children":321734},{},[321735],{"type":23,"value":321736},"We're continuing to deepen support for the product teams building AI-native applications and SaaS platforms—where real-time, structured data is critical to power copilots, integrations, and customer-facing features.",{"type":17,"tag":68,"props":321738,"children":321739},{"id":11629},[321740],{"type":17,"tag":48,"props":321741,"children":321742},{},[321743],{"type":23,"value":11632},{"type":17,"tag":29,"props":321745,"children":321746},{},[321747],{"type":23,"value":321748},"We added new integrations across HR & Directory, Task Management, Accounting, Call Center, and File Storage categories—helping you unify more of your customers' operational data in less time.",{"type":17,"tag":29,"props":321750,"children":321751},{},[321752,321762],{"type":17,"tag":133,"props":321753,"children":321756},{"href":321754,"rel":321755},"https://unified.to/integrations/jboard",[214],[321757],{"type":17,"tag":48,"props":321758,"children":321759},{},[321760],{"type":23,"value":321761},"JBoard",{"type":23,"value":321763}," – ATS",{"type":17,"tag":29,"props":321765,"children":321766},{},[321767],{"type":23,"value":321768},"Use case: Connect hiring pipelines and job boards to core HR systems",{"type":17,"tag":29,"props":321770,"children":321771},{},[321772,321782],{"type":17,"tag":133,"props":321773,"children":321776},{"href":321774,"rel":321775},"https://unified.to/integrations/mongodb",[214],[321777],{"type":17,"tag":48,"props":321778,"children":321779},{},[321780],{"type":23,"value":321781},"MongoDB",{"type":23,"value":321783}," – HR & Directory",{"type":17,"tag":29,"props":321785,"children":321786},{},[321787],{"type":23,"value":321788},"Use case: Unified HR employee data for user-profissioning use-cases",{"type":17,"tag":29,"props":321790,"children":321791},{},[321792,321801],{"type":17,"tag":133,"props":321793,"children":321796},{"href":321794,"rel":321795},"https://unified.to/integrations/zoomphone",[214],[321797],{"type":17,"tag":48,"props":321798,"children":321799},{},[321800],{"type":23,"value":31600},{"type":23,"value":321802}," – Call Center",{"type":17,"tag":29,"props":321804,"children":321805},{},[321806],{"type":23,"value":321807},"Use case: Access call recordings and transcripts for AI apps and compliance workflows",{"type":17,"tag":29,"props":321809,"children":321810},{},[321811,321820],{"type":17,"tag":133,"props":321812,"children":321815},{"href":321813,"rel":321814},"https://unified.to/integrations/dovetail",[214],[321816],{"type":17,"tag":48,"props":321817,"children":321818},{},[321819],{"type":23,"value":13030},{"type":23,"value":321821}," – Task Management",{"type":17,"tag":29,"props":321823,"children":321824},{},[321825],{"type":23,"value":321826},"Use case: Centralize product and research workflows",{"type":17,"tag":29,"props":321828,"children":321829},{},[321830,321839],{"type":17,"tag":133,"props":321831,"children":321834},{"href":321832,"rel":321833},"https://unified.to/integrations/ramp",[214],[321835],{"type":17,"tag":48,"props":321836,"children":321837},{},[321838],{"type":23,"value":83532},{"type":23,"value":321840}," – Accounting",{"type":17,"tag":29,"props":321842,"children":321843},{},[321844],{"type":23,"value":321845},"Use case: Streamline financial operations with normalized employee and spend data",{"type":17,"tag":29,"props":321847,"children":321848},{},[321849,321858],{"type":17,"tag":133,"props":321850,"children":321853},{"href":321851,"rel":321852},"https://unified.to/integrations/sageintacct",[214],[321854],{"type":17,"tag":48,"props":321855,"children":321856},{},[321857],{"type":23,"value":38540},{"type":23,"value":321840},{"type":17,"tag":29,"props":321860,"children":321861},{},[321862],{"type":23,"value":321863},"Use case: Automate invoicing, account sync, and invoicing data access",{"type":17,"tag":29,"props":321865,"children":321866},{},[321867,321877],{"type":17,"tag":133,"props":321868,"children":321871},{"href":321869,"rel":321870},"https://unified.to/integrations/jamf",[214],[321872],{"type":17,"tag":48,"props":321873,"children":321874},{},[321875],{"type":23,"value":321876},"Jamf",{"type":23,"value":321878}," – HR & Device Management",{"type":17,"tag":29,"props":321880,"children":321881},{},[321882],{"type":23,"value":321883},"Use case: Sync employee records and managed devices for IT automation workflows",{"type":17,"tag":29,"props":321885,"children":321886},{},[321887,321897],{"type":17,"tag":133,"props":321888,"children":321891},{"href":321889,"rel":321890},"https://unified.to/integrations/kandji",[214],[321892],{"type":17,"tag":48,"props":321893,"children":321894},{},[321895],{"type":23,"value":321896},"Kandji",{"type":23,"value":321878},{"type":17,"tag":29,"props":321899,"children":321900},{},[321901],{"type":23,"value":321883},{"type":17,"tag":29,"props":321903,"children":321904},{},[321905,321915],{"type":17,"tag":133,"props":321906,"children":321909},{"href":321907,"rel":321908},"https://unified.to/integrations/snowflake",[214],[321910],{"type":17,"tag":48,"props":321911,"children":321912},{},[321913],{"type":23,"value":321914},"Snowflake",{"type":23,"value":321783},{"type":17,"tag":29,"props":321917,"children":321918},{},[321919],{"type":23,"value":321788},{"type":17,"tag":29,"props":321921,"children":321922},{},[321923],{"type":17,"tag":133,"props":321924,"children":321926},{"href":87026,"rel":321925},[214],[321927],{"type":23,"value":319573},{"type":17,"tag":68,"props":321929,"children":321931},{"id":321930},"australia-data-region",[321932],{"type":17,"tag":48,"props":321933,"children":321934},{},[321935],{"type":23,"value":321936},"Australia data region",{"type":17,"tag":29,"props":321938,"children":321939},{},[321940],{"type":23,"value":321941},"We've launched a dedicated data center in Australia to better serve customers in the region. This supports lower-latency access, improved performance, and compliance with regional data residency requirements—especially important for customers operating in APAC or under industry-specific regulatory frameworks.",{"type":17,"tag":68,"props":321943,"children":321945},{"id":321944},"webhook-pagination-enhancements",[321946],{"type":17,"tag":48,"props":321947,"children":321948},{},[321949],{"type":23,"value":321950},"Webhook & pagination enhancements",{"type":17,"tag":29,"props":321952,"children":321953},{},[321954],{"type":23,"value":321955},"We expanded virtual and native webhook coverage across major platforms, including Zoom, Webex, Microsoft Teams, Outlook, Google Meet, Gong, and Calendly. This enables more real-time updates for calls, events, and recordings—critical inputs for AI agents and CRM activity timelines.",{"type":17,"tag":29,"props":321957,"children":321958},{},[321959],{"type":23,"value":321960},"Highlights:",{"type":17,"tag":80,"props":321962,"children":321963},{},[321964,321969,321980],{"type":17,"tag":84,"props":321965,"children":321966},{},[321967],{"type":23,"value":321968},"Zoom, Webex, Google Meet, Microsoft Outlook/Teams: start_gte and end_le pagination now supported for events and recordings",{"type":17,"tag":84,"props":321970,"children":321971},{},[321972,321974,321978],{"type":23,"value":321973},"Gong & Aircall: [Virtual ",{"type":17,"tag":133,"props":321975,"children":321976},{"href":4999},[321977],{"type":23,"value":5002},{"type":23,"value":321979},"](/blog/unlock_real_time_data_with_virtual_webhooks) for new recording and comment objects",{"type":17,"tag":84,"props":321981,"children":321982},{},[321983],{"type":23,"value":321984},"Calendly: Native + virtual webhooks and expanded object support",{"type":17,"tag":68,"props":321986,"children":321988},{"id":321987},"expanded-crud-object-and-field-coverage",[321989],{"type":17,"tag":48,"props":321990,"children":321991},{},[321992],{"type":23,"value":321993},"Expanded CRUD, object, and field coverage",{"type":17,"tag":29,"props":321995,"children":321996},{},[321997],{"type":23,"value":321998},"We added dozens of new readable and writable fields, enabling richer workflows across HR, CRM, and accounting systems:",{"type":17,"tag":80,"props":322000,"children":322001},{},[322002,322012,322022,322032],{"type":17,"tag":84,"props":322003,"children":322004},{},[322005,322010],{"type":17,"tag":48,"props":322006,"children":322007},{},[322008],{"type":23,"value":322009},"Freshbooks",{"type":23,"value":322011},": Added a variety of new fields across objects in the Accounting and HR categories, including support for employee contact details and tax metadata.",{"type":17,"tag":84,"props":322013,"children":322014},{},[322015,322020],{"type":17,"tag":48,"props":322016,"children":322017},{},[322018],{"type":23,"value":322019},"Pennylane",{"type":23,"value":322021},": Major field expansion on Account, Contact, Invoice, Journal, and Item objects—plus support for attachments and offset pagination",{"type":17,"tag":84,"props":322023,"children":322024},{},[322025,322030],{"type":17,"tag":48,"props":322026,"children":322027},{},[322028],{"type":23,"value":322029},"Sage Intacct & Xero",{"type":23,"value":322031},": Added new Report object support with fields like trial_balance, profit_and_loss, and balance_sheet",{"type":17,"tag":84,"props":322033,"children":322034},{},[322035,322040],{"type":17,"tag":48,"props":322036,"children":322037},{},[322038],{"type":23,"value":322039},"QuickBooks & Salesforce",{"type":23,"value":322041},": New readable/writable fields for send, stages, and updated_at on Invoice and Pipeline objects",{"type":17,"tag":29,"props":322043,"children":322044},{},[322045],{"type":23,"value":322046},"We also shipped new API methods:",{"type":17,"tag":80,"props":322048,"children":322049},{},[322050,322059,322068],{"type":17,"tag":84,"props":322051,"children":322052},{},[322053,322057],{"type":17,"tag":48,"props":322054,"children":322055},{},[322056],{"type":23,"value":319691},{"type":23,"value":322058},": Create / Update / Remove for Activity object",{"type":17,"tag":84,"props":322060,"children":322061},{},[322062,322066],{"type":17,"tag":48,"props":322063,"children":322064},{},[322065],{"type":23,"value":31559},{"type":23,"value":322067},": List / Get for new Recording object",{"type":17,"tag":84,"props":322069,"children":322070},{},[322071,322076],{"type":17,"tag":48,"props":322072,"children":322073},{},[322074],{"type":23,"value":322075},"AirCall.io",{"type":23,"value":322077},": Create / List for Comment object",{"type":17,"tag":68,"props":322079,"children":322081},{"id":322080},"unified-communication-hr-new-objects",[322082],{"type":17,"tag":48,"props":322083,"children":322084},{},[322085],{"type":23,"value":322086},"Unified Communication & HR: New objects",{"type":17,"tag":29,"props":322088,"children":322089},{},[322090],{"type":23,"value":322091},"We've added two new objects to the Unified Communication category:",{"type":17,"tag":80,"props":322093,"children":322094},{},[322095,322103],{"type":17,"tag":84,"props":322096,"children":322097},{},[322098],{"type":17,"tag":48,"props":322099,"children":322100},{},[322101],{"type":23,"value":322102},"UC Call Comments",{"type":17,"tag":84,"props":322104,"children":322105},{},[322106],{"type":17,"tag":48,"props":322107,"children":322108},{},[322109],{"type":23,"value":322110},"UC Call Recordings",{"type":17,"tag":29,"props":322112,"children":322113},{},[322114],{"type":23,"value":322115},"These expand support for messaging, call center, and internal communication workflows—especially those powered by AI summarization or note-taking.",{"type":17,"tag":29,"props":322117,"children":322118},{},[322119,322121,322126],{"type":23,"value":322120},"We also introduced a new ",{"type":17,"tag":48,"props":322122,"children":322123},{},[322124],{"type":23,"value":322125},"Device Management",{"type":23,"value":322127}," object in the HR category, enabling deeper control and visibility into employee hardware assignments for IT workflows.",{"type":17,"tag":29,"props":322129,"children":322130},{},[322131],{"type":23,"value":322132},"That's it for April. Whether you're syncing financial records, powering copilots with conversation data, or building next-gen HR automations, Unified.to keeps your integrations fast, normalized, and real-time.",{"type":17,"tag":29,"props":322134,"children":322135},{},[322136],{"type":17,"tag":133,"props":322137,"children":322139},{"href":1612,"rel":322138},[214],[322140],{"type":17,"tag":48,"props":322141,"children":322142},{},[322143],{"type":23,"value":300863},{"type":17,"tag":29,"props":322145,"children":322146},{},[322147],{"type":17,"tag":133,"props":322148,"children":322150},{"href":215330,"rel":322149},[214],[322151],{"type":17,"tag":48,"props":322152,"children":322153},{},[322154],{"type":23,"value":7737},{"title":7,"searchDepth":1629,"depth":1629,"links":322156},[322157,322158,322159,322160,322161],{"id":11629,"depth":1629,"text":11632},{"id":321930,"depth":1629,"text":321936},{"id":321944,"depth":1629,"text":321950},{"id":321987,"depth":1629,"text":321993},{"id":322080,"depth":1629,"text":322086},"content:blog:april_2025_product_updates.md","blog/april_2025_product_updates.md","blog/april_2025_product_updates",{"_path":322166,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":322167,"description":322168,"img":322169,"date":322170,"tag":12,"body":322171,"_type":1677,"_id":322725,"_source":1679,"_file":322726,"_stem":322727,"_extension":1682},"/blog/announcing_the_calendar_api_access_availability_events_and_scheduling","Announcing the Calendar API: access availability, events, and scheduling","Unified.to now supports a new integration category, Calendaring. Whether you're powering scheduling, automation, or AI assistants, our new Calendar API gives...","https://s3.us-east-2.amazonaws.com/unified-article-images/announcing_the_calendar_api_access_availability_events_and_scheduling-icon.png","2025-04-14T00:00:00.000Z",{"type":14,"children":322172,"toc":322718},[322173,322178,322181,322189,322197,322216,322222,322291,322302,322306,322360,322366,322414,322419,322425,322437,322442,322675,322686,322692,322697,322702],{"type":17,"tag":18,"props":322174,"children":322176},{"id":322175},"announcing-the-calendar-api-access-availability-events-and-scheduling",[322177],{"type":23,"value":322167},{"type":17,"tag":25,"props":322179,"children":322180},{},[],{"type":17,"tag":29,"props":322182,"children":322183},{},[322184],{"type":17,"tag":33,"props":322185,"children":322186},{},[322187],{"type":23,"value":322188},"April 14, 2025",{"type":17,"tag":29,"props":322190,"children":322191},{},[322192],{"type":17,"tag":6438,"props":322193,"children":322196},{"alt":322194,"src":322195},"calendar_api.png","https://s3.us-east-2.amazonaws.com/unified-article-images/announcing_the_calendar_api_access_availability_events_and_scheduling-0.png",[],{"type":17,"tag":29,"props":322198,"children":322199},{},[322200,322202,322208,322210,322214],{"type":23,"value":322201},"Unified.to now supports a new integration category: ",{"type":17,"tag":133,"props":322203,"children":322205},{"href":99025,"rel":322204},[214],[322206],{"type":23,"value":322207},"Calendaring",{"type":23,"value":322209},". Whether you're powering scheduling, automation, or AI assistants, our new ",{"type":17,"tag":133,"props":322211,"children":322212},{"href":13708},[322213],{"type":23,"value":98258},{"type":23,"value":322215}," gives you  structured access to the entire meeting lifecycle — from availability to transcripts — all in one unified model.",{"type":17,"tag":68,"props":322217,"children":322219},{"id":322218},"one-api-four-core-capabilities",[322220],{"type":23,"value":322221},"One API. Four core capabilities.",{"type":17,"tag":80,"props":322223,"children":322224},{},[322225,322238,322251,322278],{"type":17,"tag":84,"props":322226,"children":322227},{},[322228,322233,322236],{"type":17,"tag":48,"props":322229,"children":322230},{},[322231],{"type":23,"value":322232},"Free/busy availability",{"type":17,"tag":3891,"props":322234,"children":322235},{},[],{"type":23,"value":322237},"Check when users or teams are available — across platforms.",{"type":17,"tag":84,"props":322239,"children":322240},{},[322241,322246,322249],{"type":17,"tag":48,"props":322242,"children":322243},{},[322244],{"type":23,"value":322245},"Event lifecycle",{"type":17,"tag":3891,"props":322247,"children":322248},{},[],{"type":23,"value":322250},"Read, create, and update calendar events, including support for video conferencing metadata.",{"type":17,"tag":84,"props":322252,"children":322253},{},[322254,322259,322262,322264,322270,322271,322277],{"type":17,"tag":48,"props":322255,"children":322256},{},[322257],{"type":23,"value":322258},"Scheduling links",{"type":17,"tag":3891,"props":322260,"children":322261},{},[],{"type":23,"value":322263},"Access and manage booking links from tools like ",{"type":17,"tag":133,"props":322265,"children":322268},{"href":322266,"rel":322267},"https://unified.to/integrations/calendly",[214],[322269],{"type":23,"value":13678},{"type":23,"value":11826},{"type":17,"tag":133,"props":322272,"children":322275},{"href":322273,"rel":322274},"https://unified.to/integrations/savvycal",[214],[322276],{"type":23,"value":14229},{"type":23,"value":308354},{"type":17,"tag":84,"props":322279,"children":322280},{},[322281,322286,322289],{"type":17,"tag":48,"props":322282,"children":322283},{},[322284],{"type":23,"value":322285},"Recordings & transcripts",{"type":17,"tag":3891,"props":322287,"children":322288},{},[],{"type":23,"value":322290},"Retrieve structured recordings, attendee metadata, and transcripts — ideal for AI-powered meeting summaries and training.",{"type":17,"tag":29,"props":322292,"children":322293},{},[322294,322296],{"type":23,"value":322295},"Everything is returned in a normalized schema with real-time sync — no extra tooling, no provider-specific complexity. ",{"type":17,"tag":133,"props":322297,"children":322299},{"href":99333,"rel":322298},[214],[322300],{"type":23,"value":322301},"Read the docs ",{"type":17,"tag":68,"props":322303,"children":322304},{"id":950},[322305],{"type":23,"value":953},{"type":17,"tag":80,"props":322307,"children":322308},{},[322309,322322,322334,322347],{"type":17,"tag":84,"props":322310,"children":322311},{},[322312,322317,322320],{"type":17,"tag":48,"props":322313,"children":322314},{},[322315],{"type":23,"value":322316},"AI scheduling assistants",{"type":17,"tag":3891,"props":322318,"children":322319},{},[],{"type":23,"value":322321},"Let your product manage calendars and meetings through a single API.",{"type":17,"tag":84,"props":322323,"children":322324},{},[322325,322329,322332],{"type":17,"tag":48,"props":322326,"children":322327},{},[322328],{"type":23,"value":12682},{"type":17,"tag":3891,"props":322330,"children":322331},{},[],{"type":23,"value":322333},"Trigger events based on user availability, meeting status, or link activity.",{"type":17,"tag":84,"props":322335,"children":322336},{},[322337,322342,322345],{"type":17,"tag":48,"props":322338,"children":322339},{},[322340],{"type":23,"value":322341},"In-app scheduling",{"type":17,"tag":3891,"props":322343,"children":322344},{},[],{"type":23,"value":322346},"Embed scheduling flows in your product — no need for third-party tools.",{"type":17,"tag":84,"props":322348,"children":322349},{},[322350,322355,322358],{"type":17,"tag":48,"props":322351,"children":322352},{},[322353],{"type":23,"value":322354},"Post-meeting intelligence",{"type":17,"tag":3891,"props":322356,"children":322357},{},[],{"type":23,"value":322359},"Feed transcripts and metadata into AI models or analytics pipelines.",{"type":17,"tag":68,"props":322361,"children":322363},{"id":322362},"built-for-scale-and-security",[322364],{"type":23,"value":322365},"Built for scale and security",{"type":17,"tag":80,"props":322367,"children":322368},{},[322369,322383,322398],{"type":17,"tag":84,"props":322370,"children":322371},{},[322372,322376,322378],{"type":17,"tag":48,"props":322373,"children":322374},{},[322375],{"type":23,"value":268961},{"type":23,"value":322377}," via native or ",{"type":17,"tag":133,"props":322379,"children":322381},{"href":46568,"rel":322380},[214],[322382],{"type":23,"value":46572},{"type":17,"tag":84,"props":322384,"children":322385},{},[322386,322396],{"type":17,"tag":48,"props":322387,"children":322388},{},[322389,322390,322394],{"type":23,"value":86959},{"type":17,"tag":133,"props":322391,"children":322392},{"href":779},[322393],{"type":23,"value":782},{"type":23,"value":322395}," & schemas",{"type":23,"value":322397}," across every platform",{"type":17,"tag":84,"props":322399,"children":322400},{},[322401,322405,322407,322413],{"type":17,"tag":48,"props":322402,"children":322403},{},[322404],{"type":23,"value":69706},{"type":23,"value":322406}," — your customers' calendar data never touches our servers (",{"type":17,"tag":133,"props":322408,"children":322410},{"href":86962,"rel":322409},[214],[322411],{"type":23,"value":322412},"learn more",{"type":23,"value":12034},{"type":17,"tag":29,"props":322415,"children":322416},{},[322417],{"type":23,"value":322418},"We abstract away auth, webhook orchestration, and third-party platform quirks so your team can focus on building.",{"type":17,"tag":68,"props":322420,"children":322422},{"id":322421},"available-now",[322423],{"type":23,"value":322424},"Available now",{"type":17,"tag":29,"props":322426,"children":322427},{},[322428,322430,322436],{"type":23,"value":322429},"Our Unified Calendar API is available in all plans and accessible during your ",{"type":17,"tag":133,"props":322431,"children":322433},{"href":1612,"rel":322432},[214],[322434],{"type":23,"value":322435},"30-day free trial",{"type":23,"value":54},{"type":17,"tag":29,"props":322438,"children":322439},{},[322440],{"type":23,"value":322441},"We support the following calendar and scheduling platforms:",{"type":17,"tag":80,"props":322443,"children":322444},{},[322445,322456,322467,322478,322488,322498,322509,322519,322531,322541,322552,322562,322573,322582,322593,322604,322614,322625,322634,322645,322656,322665],{"type":17,"tag":84,"props":322446,"children":322447},{},[322448,322454],{"type":17,"tag":133,"props":322449,"children":322452},{"href":322450,"rel":322451},"https://unified.to/integrations/acuityscheduling",[214],[322453],{"type":23,"value":14087},{"type":23,"value":322455}," (scheduling links)",{"type":17,"tag":84,"props":322457,"children":322458},{},[322459,322465],{"type":17,"tag":133,"props":322460,"children":322463},{"href":322461,"rel":322462},"https://unified.to/integrations/appleicloud",[214],[322464],{"type":23,"value":14108},{"type":23,"value":322466}," (events)",{"type":17,"tag":84,"props":322468,"children":322469},{},[322470,322476],{"type":17,"tag":133,"props":322471,"children":322474},{"href":322472,"rel":322473},"https://unified.to/integrations/cal",[214],[322475],{"type":23,"value":14004},{"type":23,"value":322477}," (scheduling links, events)",{"type":17,"tag":84,"props":322479,"children":322480},{},[322481,322486],{"type":17,"tag":133,"props":322482,"children":322484},{"href":322266,"rel":322483},[214],[322485],{"type":23,"value":13678},{"type":23,"value":322487}," (availability, scheduling links)",{"type":17,"tag":84,"props":322489,"children":322490},{},[322491,322496],{"type":17,"tag":133,"props":322492,"children":322494},{"href":128123,"rel":322493},[214],[322495],{"type":23,"value":13669},{"type":23,"value":322497}," (availability, events)",{"type":17,"tag":84,"props":322499,"children":322500},{},[322501,322507],{"type":17,"tag":133,"props":322502,"children":322505},{"href":322503,"rel":322504},"https://unified.to/integrations/googlemeet",[214],[322506],{"type":23,"value":14045},{"type":23,"value":322508}," (recordings & transcripts)",{"type":17,"tag":84,"props":322510,"children":322511},{},[322512,322518],{"type":17,"tag":133,"props":322513,"children":322516},{"href":322514,"rel":322515},"https://unified.to/integrations/hubspot",[214],[322517],{"type":23,"value":3184},{"type":23,"value":322455},{"type":17,"tag":84,"props":322520,"children":322521},{},[322522,322529],{"type":17,"tag":133,"props":322523,"children":322526},{"href":322524,"rel":322525},"https://unified.to/integrations/lemcal",[214],[322527],{"type":23,"value":322528},"lemcal ",{"type":23,"value":322530},"(scheduling links, events)",{"type":17,"tag":84,"props":322532,"children":322533},{},[322534,322540],{"type":17,"tag":133,"props":322535,"children":322538},{"href":322536,"rel":322537},"https://unified.to/integrations/microsoftoutlook",[214],[322539],{"type":23,"value":14455},{"type":23,"value":322497},{"type":17,"tag":84,"props":322542,"children":322543},{},[322544,322550],{"type":17,"tag":133,"props":322545,"children":322548},{"href":322546,"rel":322547},"https://unified.to/integrations/microsoftteams",[214],[322549],{"type":23,"value":14066},{"type":23,"value":322551}," (availability, events, recordings & transcripts)",{"type":17,"tag":84,"props":322553,"children":322554},{},[322555,322560],{"type":17,"tag":133,"props":322556,"children":322558},{"href":322273,"rel":322557},[214],[322559],{"type":23,"value":14229},{"type":23,"value":322561}," (events, scheduling links)",{"type":17,"tag":84,"props":322563,"children":322564},{},[322565,322572],{"type":17,"tag":133,"props":322566,"children":322569},{"href":322567,"rel":322568},"https://unified.to/integrations/simplemeet",[214],[322570],{"type":23,"value":322571},"SimpleMeet.me",{"type":23,"value":322455},{"type":17,"tag":84,"props":322574,"children":322575},{},[322576,322581],{"type":17,"tag":133,"props":322577,"children":322579},{"href":11195,"rel":322578},[214],[322580],{"type":23,"value":11199},{"type":23,"value":322477},{"type":17,"tag":84,"props":322583,"children":322584},{},[322585,322591],{"type":17,"tag":133,"props":322586,"children":322589},{"href":322587,"rel":322588},"https://unified.to/integrations/webex",[214],[322590],{"type":23,"value":14129},{"type":23,"value":322592}," (events, recordings & transcripts)",{"type":17,"tag":84,"props":322594,"children":322595},{},[322596,322602],{"type":17,"tag":133,"props":322597,"children":322600},{"href":322598,"rel":322599},"https://unified.to/integrations/zoom",[214],[322601],{"type":23,"value":14472},{"type":23,"value":322603}," (events, recordings & transcripts, scheduling links)",{"type":17,"tag":84,"props":322605,"children":322606},{},[322607,322612],{"type":17,"tag":133,"props":322608,"children":322610},{"href":253437,"rel":322609},[214],[322611],{"type":23,"value":31550},{"type":23,"value":322613}," (calendar, meetings)",{"type":17,"tag":84,"props":322615,"children":322616},{},[322617,322623],{"type":17,"tag":133,"props":322618,"children":322621},{"href":322619,"rel":322620},"https://unified.to/integrations/fathom",[214],[322622],{"type":23,"value":14259},{"type":23,"value":322624}," (recordings & summaries)",{"type":17,"tag":84,"props":322626,"children":322627},{},[322628,322633],{"type":17,"tag":133,"props":322629,"children":322631},{"href":310004,"rel":322630},[214],[322632],{"type":23,"value":14249},{"type":23,"value":322508},{"type":17,"tag":84,"props":322635,"children":322636},{},[322637,322643],{"type":17,"tag":133,"props":322638,"children":322641},{"href":322639,"rel":322640},"https://unified.to/integrations/ringcentral",[214],[322642],{"type":23,"value":14150},{"type":23,"value":322644}," (calendar, meetings, calls)",{"type":17,"tag":84,"props":322646,"children":322647},{},[322648,322654],{"type":17,"tag":133,"props":322649,"children":322652},{"href":322650,"rel":322651},"https://unified.to/integrations/salesforce",[214],[322653],{"type":23,"value":3179},{"type":23,"value":322655}," (calendar events)",{"type":17,"tag":84,"props":322657,"children":322658},{},[322659,322664],{"type":17,"tag":133,"props":322660,"children":322662},{"href":239858,"rel":322661},[214],[322663],{"type":23,"value":14166},{"type":23,"value":322466},{"type":17,"tag":84,"props":322666,"children":322667},{},[322668,322673],{"type":17,"tag":133,"props":322669,"children":322671},{"href":239886,"rel":322670},[214],[322672],{"type":23,"value":14177},{"type":23,"value":322674}," (events, recordings)",{"type":17,"tag":29,"props":322676,"children":322677},{},[322678,322680,322685],{"type":23,"value":322679},"Want early access to a specific calendar application? ",{"type":17,"tag":133,"props":322681,"children":322683},{"href":215330,"rel":322682},[214],[322684],{"type":23,"value":281511},{"type":23,"value":54},{"type":17,"tag":68,"props":322687,"children":322689},{"id":322688},"the-unifiedto-difference",[322690],{"type":23,"value":322691},"The Unified.to difference",{"type":17,"tag":29,"props":322693,"children":322694},{},[322695],{"type":23,"value":322696},"Unlike other integration solutions, we don't store or cache calendar data. Everything passes through securely — with real-time delivery and normalized models designed for AI-ready products.",{"type":17,"tag":29,"props":322698,"children":322699},{},[322700],{"type":23,"value":322701},"Whether you're building assistants, calendars, CRMs, or AI copilots — Unified.to's Calendar API gives your product a foundation that's flexible, secure, and future-proof.",{"type":17,"tag":29,"props":322703,"children":322704},{},[322705,322710,322711,322716],{"type":17,"tag":133,"props":322706,"children":322708},{"href":1612,"rel":322707},[214],[322709],{"type":23,"value":316710},{"type":23,"value":75890},{"type":17,"tag":133,"props":322712,"children":322714},{"href":215330,"rel":322713},[214],[322715],{"type":23,"value":226481},{"type":23,"value":322717}," to explore what you can build.",{"title":7,"searchDepth":1629,"depth":1629,"links":322719},[322720,322721,322722,322723,322724],{"id":322218,"depth":1629,"text":322221},{"id":950,"depth":1629,"text":953},{"id":322362,"depth":1629,"text":322365},{"id":322421,"depth":1629,"text":322424},{"id":322688,"depth":1629,"text":322691},"content:blog:announcing_the_calendar_api_access_availability_events_and_scheduling.md","blog/announcing_the_calendar_api_access_availability_events_and_scheduling.md","blog/announcing_the_calendar_api_access_availability_events_and_scheduling",{"_path":322729,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":322730,"description":322731,"img":322732,"date":322733,"tag":12,"body":322734,"_type":1677,"_id":323995,"_source":1679,"_file":323996,"_stem":323997,"_extension":1682},"/blog/merge_vs_unified_which_unified_api_is_right_for_your_product","Merge vs. Unified.to: which Unified API is right for your product?","Unified.to and Merge are unified API platforms, but they differ in how they handle data, architecture, and production use cases. Merge uses a sync-and-cache...","https://s3.us-east-2.amazonaws.com/unified-article-images/merge_vs_unified_which_unified_api_is_right_for_your_product-icon.png","2025-04-09T00:00:00.000Z",{"type":14,"children":322735,"toc":323978},[322736,322741,322744,322752,322760,322767,322778,322783,322789,323028,323037,323041,323050,323055,323060,323089,323094,323102,323145,323153,323161,323173,323179,323184,323209,323232,323238,323243,323248,323258,323331,323336,323343,323431,323437,323442,323447,323452,323484,323489,323495,323507,323512,323517,323522,323553,323558,323570,323594,323598,323616,323656,323661,323665,323697,323703,323710,323733,323740,323763,323767,323774,323797,323804,323820,323826,323834,323852,323859,323880,323884,323907,323911,323916,323924,323929,323947],{"type":17,"tag":18,"props":322737,"children":322739},{"id":322738},"merge-vs-unifiedto-which-unified-api-is-right-for-your-product",[322740],{"type":23,"value":322730},{"type":17,"tag":25,"props":322742,"children":322743},{},[],{"type":17,"tag":29,"props":322745,"children":322746},{},[322747],{"type":17,"tag":33,"props":322748,"children":322749},{},[322750],{"type":23,"value":322751},"April 9, 2025",{"type":17,"tag":29,"props":322753,"children":322754},{},[322755],{"type":17,"tag":6438,"props":322756,"children":322759},{"alt":322757,"src":322758},"merge_vs_unified.png","https://s3.us-east-2.amazonaws.com/unified-article-images/merge_vs_unified_which_unified_api_is_right_for_your_product-0.png",[],{"type":17,"tag":29,"props":322761,"children":322762},{},[322763],{"type":17,"tag":33,"props":322764,"children":322765},{},[322766],{"type":23,"value":310436},{"type":17,"tag":29,"props":322768,"children":322769},{},[322770,322772,322776],{"type":23,"value":322771},"Unified.to and Merge are ",{"type":17,"tag":133,"props":322773,"children":322774},{"href":7691},[322775],{"type":23,"value":7459},{"type":23,"value":322777}," platforms, but they differ in how they handle data, architecture, and production use cases. Merge uses a sync-and-cache model designed for structured data access within specific categories, while Unified.to uses a real-time, pass-through architecture that gives developers direct access to source APIs across multiple categories without storing customer data.",{"type":17,"tag":29,"props":322779,"children":322780},{},[322781],{"type":23,"value":322782},"Choosing a unified API platform determines how your product integrates with external APIs, how data is accessed, and how your system behaves in production. This comparison breaks down how Merge and Unified.to differ across data models, real-time access, AI use cases, and long-term architecture decisions.",{"type":17,"tag":68,"props":322784,"children":322786},{"id":322785},"tldr-merge-vs-unifiedto",[322787],{"type":23,"value":322788},"TL;DR – Merge vs Unified.to",{"type":17,"tag":7231,"props":322790,"children":322791},{},[322792,322815],{"type":17,"tag":7235,"props":322793,"children":322794},{},[322795],{"type":17,"tag":7239,"props":322796,"children":322797},{},[322798,322801,322808],{"type":17,"tag":7243,"props":322799,"children":322800},{},[],{"type":17,"tag":7243,"props":322802,"children":322803},{},[322804],{"type":17,"tag":48,"props":322805,"children":322806},{},[322807],{"type":23,"value":227},{"type":17,"tag":7243,"props":322809,"children":322810},{},[322811],{"type":17,"tag":48,"props":322812,"children":322813},{},[322814],{"type":23,"value":217},{"type":17,"tag":7259,"props":322816,"children":322817},{},[322818,322845,322865,322885,322905,322926,322946,322967,322987,323008],{"type":17,"tag":7239,"props":322819,"children":322820},{},[322821,322828,322833],{"type":17,"tag":7266,"props":322822,"children":322823},{},[322824],{"type":17,"tag":48,"props":322825,"children":322826},{},[322827],{"type":23,"value":293774},{"type":17,"tag":7266,"props":322829,"children":322830},{},[322831],{"type":23,"value":322832},"Shallow normalization across 7 categories (custom fields via passthrough on higher tiers)",{"type":17,"tag":7266,"props":322834,"children":322835},{},[322836,322838,322843],{"type":23,"value":322837},"Deep, consistent normalization across ",{"type":17,"tag":48,"props":322839,"children":322840},{},[322841],{"type":23,"value":322842},"25 categories",{"type":23,"value":322844},", including first-class custom objects and unified metadata",{"type":17,"tag":7239,"props":322846,"children":322847},{},[322848,322855,322860],{"type":17,"tag":7266,"props":322849,"children":322850},{},[322851],{"type":17,"tag":48,"props":322852,"children":322853},{},[322854],{"type":23,"value":311330},{"type":17,"tag":7266,"props":322856,"children":322857},{},[322858],{"type":23,"value":322859},"Continuous sync with cached reads + webhooks",{"type":17,"tag":7266,"props":322861,"children":322862},{},[322863],{"type":23,"value":322864},"Native + Virtual Webhooks with live pass-through reads",{"type":17,"tag":7239,"props":322866,"children":322867},{},[322868,322875,322880],{"type":17,"tag":7266,"props":322869,"children":322870},{},[322871],{"type":17,"tag":48,"props":322872,"children":322873},{},[322874],{"type":23,"value":69493},{"type":17,"tag":7266,"props":322876,"children":322877},{},[322878],{"type":23,"value":322879},"Agent tooling supported on a sync-and-cache data layer",{"type":17,"tag":7266,"props":322881,"children":322882},{},[322883],{"type":23,"value":322884},"Agent tooling (MCP) on live, normalized, pass-through data",{"type":17,"tag":7239,"props":322886,"children":322887},{},[322888,322895,322900],{"type":17,"tag":7266,"props":322889,"children":322890},{},[322891],{"type":17,"tag":48,"props":322892,"children":322893},{},[322894],{"type":23,"value":69408},{"type":17,"tag":7266,"props":322896,"children":322897},{},[322898],{"type":23,"value":322899},"Syncs and stores customer data to serve cached reads",{"type":17,"tag":7266,"props":322901,"children":322902},{},[322903],{"type":23,"value":322904},"No end-customer data stored at rest (pass-through architecture)",{"type":17,"tag":7239,"props":322906,"children":322907},{},[322908,322916,322921],{"type":17,"tag":7266,"props":322909,"children":322910},{},[322911],{"type":17,"tag":48,"props":322912,"children":322913},{},[322914],{"type":23,"value":322915},"Flexible delivery",{"type":17,"tag":7266,"props":322917,"children":322918},{},[322919],{"type":23,"value":322920},"API, Webhooks, Destinations",{"type":17,"tag":7266,"props":322922,"children":322923},{},[322924],{"type":23,"value":322925},"API, Webhooks, Database Sync",{"type":17,"tag":7239,"props":322927,"children":322928},{},[322929,322936,322941],{"type":17,"tag":7266,"props":322930,"children":322931},{},[322932],{"type":17,"tag":48,"props":322933,"children":322934},{},[322935],{"type":23,"value":316640},{"type":17,"tag":7266,"props":322937,"children":322938},{},[322939],{"type":23,"value":322940},"Higher (cached data and sync state managed in the integration layer)",{"type":17,"tag":7266,"props":322942,"children":322943},{},[322944],{"type":23,"value":322945},"Lower (no customer data stored at rest)",{"type":17,"tag":7239,"props":322947,"children":322948},{},[322949,322957,322962],{"type":17,"tag":7266,"props":322950,"children":322951},{},[322952],{"type":17,"tag":48,"props":322953,"children":322954},{},[322955],{"type":23,"value":322956},"Auth/data export",{"type":17,"tag":7266,"props":322958,"children":322959},{},[322960],{"type":23,"value":322961},"Credentials and sync state managed within the platform",{"type":17,"tag":7266,"props":322963,"children":322964},{},[322965],{"type":23,"value":322966},"Portable by design (no customer data stored; optional customer-managed secrets)",{"type":17,"tag":7239,"props":322968,"children":322969},{},[322970,322977,322982],{"type":17,"tag":7266,"props":322971,"children":322972},{},[322973],{"type":17,"tag":48,"props":322974,"children":322975},{},[322976],{"type":23,"value":98996},{"type":17,"tag":7266,"props":322978,"children":322979},{},[322980],{"type":23,"value":322981},"Per connected account",{"type":17,"tag":7266,"props":322983,"children":322984},{},[322985],{"type":23,"value":322986},"Usage-based (API calls across all customers and integrations)",{"type":17,"tag":7239,"props":322988,"children":322989},{},[322990,322998,323003],{"type":17,"tag":7266,"props":322991,"children":322992},{},[322993],{"type":17,"tag":48,"props":322994,"children":322995},{},[322996],{"type":23,"value":322997},"Billing rules",{"type":17,"tag":7266,"props":322999,"children":323000},{},[323001],{"type":23,"value":323002},"Flat per-account pricing (usage not metered)",{"type":17,"tag":7266,"props":323004,"children":323005},{},[323006],{"type":23,"value":323007},"100 records = 1 API call; webhooks bill only on change",{"type":17,"tag":7239,"props":323009,"children":323010},{},[323011,323018,323023],{"type":17,"tag":7266,"props":323012,"children":323013},{},[323014],{"type":17,"tag":48,"props":323015,"children":323016},{},[323017],{"type":23,"value":502},{"type":17,"tag":7266,"props":323019,"children":323020},{},[323021],{"type":23,"value":323022},"SaaS products needing unified APIs with sync-based delivery",{"type":17,"tag":7266,"props":323024,"children":323025},{},[323026],{"type":23,"value":323027},"AI-native and SaaS products needing real-time, multi-category integrations (HR, ATS, CRM, Messaging, Calendaring, Accounting, etc.)",{"type":17,"tag":29,"props":323029,"children":323030},{},[323031],{"type":17,"tag":133,"props":323032,"children":323034},{"href":78603,"rel":323033},[214],[323035],{"type":23,"value":323036},"View in-depth integration technology comparison ",{"type":17,"tag":11616,"props":323038,"children":323040},{"width":11618,"height":11619,"src":323039,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/ZOG7z0eqCa0",[],{"type":17,"tag":68,"props":323042,"children":323044},{"id":323043},"how-does-real-time-data-differ-between-merge-and-unifiedto",[323045],{"type":17,"tag":48,"props":323046,"children":323047},{},[323048],{"type":23,"value":323049},"How does real-time data differ between Merge and Unified.to?",{"type":17,"tag":29,"props":323051,"children":323052},{},[323053],{"type":23,"value":323054},"Many unified APIs (including Merge's core sync model) rely on continuous sync and cached reads to deliver freshness without hitting source APIs on every request. That works if you're moving data into a warehouse or systems that don't require instant updates. But it breaks when your customer-facing product depends on live context.",{"type":17,"tag":29,"props":323056,"children":323057},{},[323058],{"type":23,"value":323059},"Unified.to is built for real-time delivery from the ground up.",{"type":17,"tag":80,"props":323061,"children":323062},{},[323063,323072,323084],{"type":17,"tag":84,"props":323064,"children":323065},{},[323066,323067,323071],{"type":23,"value":119374},{"type":17,"tag":133,"props":323068,"children":323069},{"href":4999},[323070],{"type":23,"value":43896},{"type":23,"value":105838},{"type":17,"tag":84,"props":323073,"children":323074},{},[323075,323077,323082],{"type":23,"value":323076},"Quick frequency ",{"type":17,"tag":133,"props":323078,"children":323080},{"href":46568,"rel":323079},[214],[323081],{"type":23,"value":9010},{"type":23,"value":323083}," for the 89% of APIs that don't support them",{"type":17,"tag":84,"props":323085,"children":323086},{},[323087],{"type":23,"value":323088},"No customer-managed polling logic or manual sync schedules required",{"type":17,"tag":29,"props":323090,"children":323091},{},[323092],{"type":23,"value":323093},"Whether you're building AI assistants, live dashboards, or just want to avoid the cost and complexity of polling data, Unified.to gives you real-time updates out of the box.",{"type":17,"tag":29,"props":323095,"children":323096},{},[323097],{"type":17,"tag":48,"props":323098,"children":323099},{},[323100],{"type":23,"value":323101},"How 'real-time' works in Unified",{"type":17,"tag":80,"props":323103,"children":323104},{},[323105,323115,323125],{"type":17,"tag":84,"props":323106,"children":323107},{},[323108,323113],{"type":17,"tag":48,"props":323109,"children":323110},{},[323111],{"type":23,"value":323112},"Pass-through reads:",{"type":23,"value":323114}," Every request hits the source API live (no vendor cache).",{"type":17,"tag":84,"props":323116,"children":323117},{},[323118,323123],{"type":17,"tag":48,"props":323119,"children":323120},{},[323121],{"type":23,"value":323122},"Native webhooks:",{"type":23,"value":323124}," We use provider events when available.",{"type":17,"tag":84,"props":323126,"children":323127},{},[323128,323136,323138,323143],{"type":17,"tag":48,"props":323129,"children":323130},{},[323131,323135],{"type":17,"tag":133,"props":323132,"children":323133},{"href":9007},[323134],{"type":23,"value":9256},{"type":23,"value":20456},{"type":23,"value":323137}," For APIs without webhooks, Unified polls for you and ",{"type":17,"tag":48,"props":323139,"children":323140},{},[323141],{"type":23,"value":323142},"only delivers on change",{"type":23,"value":323144},"—you control the interval.",{"type":17,"tag":29,"props":323146,"children":323147},{},[323148],{"type":17,"tag":6438,"props":323149,"children":323152},{"alt":323150,"src":323151},"unified-vs-merge-architecture.png","https://s3.us-east-2.amazonaws.com/unified-article-images/merge_vs_unified_which_unified_api_is_right_for_your_product-1.png",[],{"type":17,"tag":29,"props":323154,"children":323155},{},[323156],{"type":17,"tag":48,"props":323157,"children":323158},{},[323159],{"type":23,"value":323160},"Selective sync without over-permissioning",{"type":17,"tag":29,"props":323162,"children":323163},{},[323164,323166,323171],{"type":23,"value":323165},"Unified lets you scope ingestion by ",{"type":17,"tag":6121,"props":323167,"children":323169},{"className":323168},[],[323170],{"type":23,"value":15863},{"type":23,"value":323172}," (for example, selecting a root folder) and debounce updates with virtual-webhook intervals—reducing noise and keeping costs predictable.",{"type":17,"tag":239,"props":323174,"children":323176},{"id":323175},"predictable-usage-based-pricing-not-per-connection",[323177],{"type":23,"value":323178},"Predictable usage-based pricing (not per-connection)",{"type":17,"tag":29,"props":323180,"children":323181},{},[323182],{"type":23,"value":323183},"Merge and most 'unified APIs' price per connection or per user. That explodes as you add org-level + user-level auth across multiple categories.",{"type":17,"tag":29,"props":323185,"children":323186},{},[323187,323188,323193,323195,323200,323202,323207],{"type":23,"value":246373},{"type":17,"tag":48,"props":323189,"children":323190},{},[323191],{"type":23,"value":323192},"usage buckets across all customers and all integrations",{"type":23,"value":323194},". A read of ",{"type":17,"tag":48,"props":323196,"children":323197},{},[323198],{"type":23,"value":323199},"up to 100 records = 1 API call",{"type":23,"value":323201},"; ",{"type":17,"tag":48,"props":323203,"children":323204},{},[323205],{"type":23,"value":323206},"webhooks only bill when data changes",{"type":23,"value":323208}," (no charge for empty checks). This keeps unit economics sane for multi-integration SaaS and user-initiated connections.",{"type":17,"tag":3414,"props":323210,"children":323211},{},[323212],{"type":17,"tag":29,"props":323213,"children":323214},{},[323215,323220,323223,323225,323231],{"type":17,"tag":33,"props":323216,"children":323217},{},[323218],{"type":23,"value":323219},"'Unified.to's integration depth and breadth give us the flexibility to experiment and innovate.\"",{"type":17,"tag":3891,"props":323221,"children":323222},{},[],{"type":23,"value":323224},"\n— Steve Hockey, CEO, MyHub (",{"type":17,"tag":133,"props":323226,"children":323228},{"href":321225,"rel":323227},[214],[323229],{"type":23,"value":323230},"read case study",{"type":23,"value":12034},{"type":17,"tag":68,"props":323233,"children":323235},{"id":323234},"actually-unified-not-just-abstracted",[323236],{"type":23,"value":323237},"Actually unified, not just abstracted",{"type":17,"tag":29,"props":323239,"children":323240},{},[323241],{"type":23,"value":323242},"Merge abstracts APIs. Unified.to unifies them.",{"type":17,"tag":29,"props":323244,"children":323245},{},[323246],{"type":23,"value":323247},"Merge provides common models per category, with custom fields/passthrough in higher tiers. Unified pushes deeper normalization plus first-class custom objects and unified metadata patterns across 23 categories.",{"type":17,"tag":29,"props":323249,"children":323250},{},[323251,323252,323257],{"type":23,"value":320500},{"type":17,"tag":48,"props":323253,"children":323254},{},[323255],{"type":23,"value":323256},"deep normalization across 23+ categories",{"type":23,"value":109313},{"type":17,"tag":80,"props":323259,"children":323260},{},[323261,323266,323271,323276,323292],{"type":17,"tag":84,"props":323262,"children":323263},{},[323264],{"type":23,"value":323265},"Consistent deep schemas and enum values that support a wide range of use cases",{"type":17,"tag":84,"props":323267,"children":323268},{},[323269],{"type":23,"value":323270},"Cleanly mapped associations",{"type":17,"tag":84,"props":323272,"children":323273},{},[323274],{"type":23,"value":323275},"Unified pagination and error handling",{"type":17,"tag":84,"props":323277,"children":323278},{},[323279,323284,323286,323290],{"type":17,"tag":48,"props":323280,"children":323281},{},[323282],{"type":23,"value":323283},"Custom fields & objects:",{"type":23,"value":323285}," Discover and use tenant-specific fields via the ",{"type":17,"tag":48,"props":323287,"children":323288},{},[323289],{"type":23,"value":110270},{"type":23,"value":323291},"; Unified object payloads reference those metadata IDs so you can read/write cleanly across orgs.",{"type":17,"tag":84,"props":323293,"children":323294},{},[323295,323300,323302,323307,323308,323316,323317,323322,323324,323329],{"type":17,"tag":48,"props":323296,"children":323297},{},[323298],{"type":23,"value":323299},"Raw access when you need it:",{"type":23,"value":323301}," Every object also includes the ",{"type":17,"tag":48,"props":323303,"children":323304},{},[323305],{"type":23,"value":323306},"vendor",{"type":23,"value":18757},{"type":17,"tag":48,"props":323309,"children":323310},{},[323311],{"type":17,"tag":6121,"props":323312,"children":323314},{"className":323313},[],[323315],{"type":23,"value":62389},{"type":23,"value":18757},{"type":17,"tag":48,"props":323318,"children":323319},{},[323320],{"type":23,"value":323321},"payload",{"type":23,"value":323323}," for edge cases—use Unified by default, drop to ",{"type":17,"tag":6121,"props":323325,"children":323327},{"className":323326},[],[323328],{"type":23,"value":62389},{"type":23,"value":323330}," when you must.",{"type":17,"tag":29,"props":323332,"children":323333},{},[323334],{"type":23,"value":323335},"This is what makes it easier to build once, scale across platforms, and keep downstream logic simple—especially when powering AI features or multi-source workflows.",{"type":17,"tag":29,"props":323337,"children":323338},{},[323339],{"type":17,"tag":48,"props":323340,"children":323341},{},[323342],{"type":23,"value":310629},{"type":17,"tag":7231,"props":323344,"children":323345},{},[323346,323364],{"type":17,"tag":7235,"props":323347,"children":323348},{},[323349],{"type":17,"tag":7239,"props":323350,"children":323351},{},[323352,323356,323360],{"type":17,"tag":7243,"props":323353,"children":323354},{},[323355],{"type":23,"value":98853},{"type":17,"tag":7243,"props":323357,"children":323358},{},[323359],{"type":23,"value":227},{"type":17,"tag":7243,"props":323361,"children":323362},{},[323363],{"type":23,"value":217},{"type":17,"tag":7259,"props":323365,"children":323366},{},[323367,323383,323398,323415],{"type":17,"tag":7239,"props":323368,"children":323369},{},[323370,323374,323379],{"type":17,"tag":7266,"props":323371,"children":323372},{},[323373],{"type":23,"value":46270},{"type":17,"tag":7266,"props":323375,"children":323376},{},[323377],{"type":23,"value":323378},"Sync + cached reads",{"type":17,"tag":7266,"props":323380,"children":323381},{},[323382],{"type":23,"value":318621},{"type":17,"tag":7239,"props":323384,"children":323385},{},[323386,323390,323394],{"type":17,"tag":7266,"props":323387,"children":323388},{},[323389],{"type":23,"value":69408},{"type":17,"tag":7266,"props":323391,"children":323392},{},[323393],{"type":23,"value":313971},{"type":17,"tag":7266,"props":323395,"children":323396},{},[323397],{"type":23,"value":43678},{"type":17,"tag":7239,"props":323399,"children":323400},{},[323401,323405,323410],{"type":17,"tag":7266,"props":323402,"children":323403},{},[323404],{"type":23,"value":286747},{"type":17,"tag":7266,"props":323406,"children":323407},{},[323408],{"type":23,"value":323409},"Category-level normalization",{"type":17,"tag":7266,"props":323411,"children":323412},{},[323413],{"type":23,"value":323414},"Deep normalization + custom objects",{"type":17,"tag":7239,"props":323416,"children":323417},{},[323418,323422,323427],{"type":17,"tag":7266,"props":323419,"children":323420},{},[323421],{"type":23,"value":81215},{"type":17,"tag":7266,"props":323423,"children":323424},{},[323425],{"type":23,"value":323426},"Fixed sync model",{"type":17,"tag":7266,"props":323428,"children":323429},{},[323430],{"type":23,"value":322925},{"type":17,"tag":68,"props":323432,"children":323434},{"id":323433},"ai-ready-not-ai-adjacent",[323435],{"type":23,"value":323436},"AI-ready, not AI-adjacent",{"type":17,"tag":29,"props":323438,"children":323439},{},[323440],{"type":23,"value":323441},"Both vendors now support agent tool-calling (Merge Agent Handler, Unified MCP). The difference is where the platform is optimized: Unified pairs MCP with live pass-through reads and zero customer data storage; Merge pairs MCP with a sync-and-cache data layer.",{"type":17,"tag":29,"props":323443,"children":323444},{},[323445],{"type":23,"value":323446},"If you're building retrieval-augmented generation (RAG), AI agents, product copilots, or workflow automation based on customer context, your integration layer needs access to real-time data.",{"type":17,"tag":29,"props":323448,"children":323449},{},[323450],{"type":23,"value":323451},"With Unified.to, you can:",{"type":17,"tag":80,"props":323453,"children":323454},{},[323455,323467,323479],{"type":17,"tag":84,"props":323456,"children":323457},{},[323458,323460,323466],{"type":23,"value":323459},"Access live, clean, and normalized data from CRMs, HR platforms, file storage, support systems, and more (",{"type":17,"tag":133,"props":323461,"children":323463},{"href":87026,"rel":323462},[214],[323464],{"type":23,"value":323465},"view 360+ live integrations",{"type":23,"value":12034},{"type":17,"tag":84,"props":323468,"children":323469},{},[323470,323472,323477],{"type":23,"value":323471},"Feed unified data directly into your databases via ",{"type":17,"tag":133,"props":323473,"children":323475},{"href":321353,"rel":323474},[214],[323476],{"type":23,"value":317315},{"type":23,"value":323478}," (Supports Postgres, MySQL, MongoDB, MSSQL, CockroachDB, and MariaDB) or our Unified Webhooks",{"type":17,"tag":84,"props":323480,"children":323481},{},[323482],{"type":23,"value":323483},"Combine event-driven updates with historical data in your own architecture",{"type":17,"tag":29,"props":323485,"children":323486},{},[323487],{"type":23,"value":323488},"This is how teams move from AI experiments to production-grade capabilities.",{"type":17,"tag":68,"props":323490,"children":323492},{"id":323491},"built-for-trust-zero-data-architecture-and-flexible-data-access",[323493],{"type":23,"value":323494},"Built for trust: zero-data architecture and flexible data access",{"type":17,"tag":29,"props":323496,"children":323497},{},[323498,323500,323505],{"type":23,"value":323499},"Unified.to doesn't store or cache your customers' third-party data. This ",{"type":17,"tag":133,"props":323501,"children":323503},{"href":86962,"rel":323502},[214],[323504],{"type":23,"value":284228},{"type":23,"value":323506}," reduces your compliance footprint while giving you more control over how data flows into your systems.",{"type":17,"tag":29,"props":323508,"children":323509},{},[323510],{"type":23,"value":323511},"Merge's model syncs and stores customer data to serve cached reads. That might make retrieval simple in the short term, but it introduces a significant security liability. You're responsible for data you don't control, stored in a vendor's infrastructure you don't own.",{"type":17,"tag":29,"props":323513,"children":323514},{},[323515],{"type":23,"value":323516},"And it's not just a security concern—it's long-term lock-in. Migrating off Merge means untangling not only your integration logic, but stored data and credentials managed inside the integration layer. That's a costly, challenging move if your roadmap changes.",{"type":17,"tag":29,"props":323518,"children":323519},{},[323520],{"type":23,"value":323521},"Unified's model is pass-through with no customer data stored at rest, reducing your data retention surface area. With Unified.to, you get multiple ways to access customer data—on your terms:",{"type":17,"tag":80,"props":323523,"children":323524},{},[323525,323534,323544],{"type":17,"tag":84,"props":323526,"children":323527},{},[323528,323532],{"type":17,"tag":48,"props":323529,"children":323530},{},[323531],{"type":23,"value":7806},{"type":23,"value":323533}," – Query any supported integration with a consistent, normalized schema",{"type":17,"tag":84,"props":323535,"children":323536},{},[323537,323542],{"type":17,"tag":48,"props":323538,"children":323539},{},[323540],{"type":23,"value":323541},"Virtual + Native Webhooks",{"type":23,"value":323543}," – Get webhook-style updates, even from providers that don't support them natively",{"type":17,"tag":84,"props":323545,"children":323546},{},[323547,323551],{"type":17,"tag":48,"props":323548,"children":323549},{},[323550],{"type":23,"value":317315},{"type":23,"value":323552}," – Push clean, structured records into your own database for analytics, AI workflows, or embedded dashboards",{"type":17,"tag":29,"props":323554,"children":323555},{},[323556],{"type":23,"value":323557},"All three options run on the same unified models—so switching between them doesn't require rewriting your integration layer.",{"type":17,"tag":29,"props":323559,"children":323560},{},[323561,323563,323568],{"type":23,"value":323562},"We don't store or retain your customers' third-party data. Authorization credentials can be stored in your own AWS Secrets Manager, keeping keys in your infrastructure. If you ever leave, ",{"type":17,"tag":48,"props":323564,"children":323565},{},[323566],{"type":23,"value":323567},"there's nothing to extract.",{"type":23,"value":323569}," Teams report that with some vendors it's hard to export authorization data—creating hidden lock-in. Unified keeps you portable by design.",{"type":17,"tag":29,"props":323571,"children":323572},{},[323573,323575,323580,323582,323587,323588,323592],{"type":23,"value":323574},"SOC 2 Type II, HIPAA/PIPEDA, multi-region (US/EU/AU) with optional ",{"type":17,"tag":48,"props":323576,"children":323577},{},[323578],{"type":23,"value":323579},"dedicated region",{"type":23,"value":323581}," for high-throughput tenants, ",{"type":17,"tag":48,"props":323583,"children":323584},{},[323585],{"type":23,"value":323586},"plan-mapped SLAs",{"type":23,"value":12561},{"type":17,"tag":48,"props":323589,"children":323590},{},[323591],{"type":23,"value":299017},{"type":23,"value":323593}," on higher tiers.",{"type":17,"tag":68,"props":323595,"children":323596},{"id":315761},[323597],{"type":23,"value":315764},{"type":17,"tag":29,"props":323599,"children":323600},{},[323601,323607,323609,323614],{"type":17,"tag":133,"props":323602,"children":323604},{"href":176923,"rel":323603},[214],[323605],{"type":23,"value":323606},"Comprehensive docs",{"type":23,"value":323608}," and 7 auto-generated, version-aware ",{"type":17,"tag":133,"props":323610,"children":323612},{"href":315782,"rel":323611},[214],[323613],{"type":23,"value":315786},{"type":23,"value":323615}," get you started. Hands-on support for every plan including our trial gets you through production.",{"type":17,"tag":80,"props":323617,"children":323618},{},[323619,323634,323644],{"type":17,"tag":84,"props":323620,"children":323621},{},[323622,323627,323629],{"type":17,"tag":48,"props":323623,"children":323624},{},[323625],{"type":23,"value":323626},"Prebuilt auth components",{"type":23,"value":323628}," (React, etc.) + ",{"type":17,"tag":48,"props":323630,"children":323631},{},[323632],{"type":23,"value":323633},"typed SDKs",{"type":17,"tag":84,"props":323635,"children":323636},{},[323637,323642],{"type":17,"tag":48,"props":323638,"children":323639},{},[323640],{"type":23,"value":323641},"Consistent pagination/filters/errors",{"type":23,"value":323643}," across vendors",{"type":17,"tag":84,"props":323645,"children":323646},{},[323647,323649,323654],{"type":23,"value":323648},"Teams routinely go ",{"type":17,"tag":48,"props":323650,"children":323651},{},[323652],{"type":23,"value":323653},"Monday → Friday from first build to launch",{"type":23,"value":323655},"; we handle vendor churn so you don't.",{"type":17,"tag":29,"props":323657,"children":323658},{},[323659],{"type":23,"value":323660},"Unified.to is fast—because we're built differently. Our declarative integration architecture lets our team ship new integrations and enhancements quickly, without brittle per-customer implementations or long onboarding delays. That kind of velocity comes from a platform that's designed to scale with your team, not block it.",{"type":17,"tag":68,"props":323662,"children":323663},{"id":311874},[323664],{"type":23,"value":311877},{"type":17,"tag":29,"props":323666,"children":323667},{},[323668,323670,323674,323675,323680,323681,323685,323687,323691,323692],{"type":23,"value":323669},"G2 isn't a technical spec, but it's a useful buyer signal for implementation experience and support. As of ",{"type":17,"tag":48,"props":323671,"children":323672},{},[323673],{"type":23,"value":218106},{"type":23,"value":11826},{"type":17,"tag":48,"props":323676,"children":323677},{},[323678],{"type":23,"value":323679},"Merge Unified",{"type":23,"value":311893},{"type":17,"tag":48,"props":323682,"children":323683},{},[323684],{"type":23,"value":318933},{"type":23,"value":323686},", while ",{"type":17,"tag":48,"props":323688,"children":323689},{},[323690],{"type":23,"value":217},{"type":23,"value":311893},{"type":17,"tag":48,"props":323693,"children":323694},{},[323695],{"type":23,"value":323696},"5.0/5.",{"type":17,"tag":239,"props":323698,"children":323700},{"id":323699},"merge-themes-from-g2-reviews",[323701],{"type":23,"value":323702},"Merge (themes from G2 reviews)",{"type":17,"tag":29,"props":323704,"children":323705},{},[323706],{"type":17,"tag":48,"props":323707,"children":323708},{},[323709],{"type":23,"value":311935},{"type":17,"tag":80,"props":323711,"children":323712},{},[323713,323718,323723,323728],{"type":17,"tag":84,"props":323714,"children":323715},{},[323716],{"type":23,"value":323717},"Customer support and implementation help",{"type":17,"tag":84,"props":323719,"children":323720},{},[323721],{"type":23,"value":323722},"Ease of use and dev experience",{"type":17,"tag":84,"props":323724,"children":323725},{},[323726],{"type":23,"value":323727},"Broad integration coverage and shared models",{"type":17,"tag":84,"props":323729,"children":323730},{},[323731],{"type":23,"value":323732},"Documentation quality (mentioned frequently, but not universally)",{"type":17,"tag":29,"props":323734,"children":323735},{},[323736],{"type":17,"tag":48,"props":323737,"children":323738},{},[323739],{"type":23,"value":311961},{"type":17,"tag":80,"props":323741,"children":323742},{},[323743,323748,323753,323758],{"type":17,"tag":84,"props":323744,"children":323745},{},[323746],{"type":23,"value":323747},"Integration issues that block connectivity",{"type":17,"tag":84,"props":323749,"children":323750},{},[323751],{"type":23,"value":323752},"Cost concerns (pricing can feel expensive as usage scales)",{"type":17,"tag":84,"props":323754,"children":323755},{},[323756],{"type":23,"value":323757},"Documentation gaps and dashboard/testing clarity",{"type":17,"tag":84,"props":323759,"children":323760},{},[323761],{"type":23,"value":323762},"Data limitations and learning curve for some teams",{"type":17,"tag":239,"props":323764,"children":323765},{"id":101855},[323766],{"type":23,"value":217},{"type":17,"tag":29,"props":323768,"children":323769},{},[323770],{"type":17,"tag":48,"props":323771,"children":323772},{},[323773],{"type":23,"value":311935},{"type":17,"tag":80,"props":323775,"children":323776},{},[323777,323782,323787,323792],{"type":17,"tag":84,"props":323778,"children":323779},{},[323780],{"type":23,"value":323781},"Fast, high-touch support, with feature requests actioned quickly",{"type":17,"tag":84,"props":323783,"children":323784},{},[323785],{"type":23,"value":323786},"Strong developer tooling (call logs, test calls), plus virtual webhooks called out as a standout",{"type":17,"tag":84,"props":323788,"children":323789},{},[323790],{"type":23,"value":323791},"Authentication and maintenance handled cleanly, reducing per-vendor overhead",{"type":17,"tag":84,"props":323793,"children":323794},{},[323795],{"type":23,"value":323796},"Pricing framed as reasonable",{"type":17,"tag":29,"props":323798,"children":323799},{},[323800],{"type":17,"tag":48,"props":323801,"children":323802},{},[323803],{"type":23,"value":311961},{"type":17,"tag":80,"props":323805,"children":323806},{},[323807,323811,323815],{"type":17,"tag":84,"props":323808,"children":323809},{},[323810],{"type":23,"value":321562},{"type":17,"tag":84,"props":323812,"children":323813},{},[323814],{"type":23,"value":321567},{"type":17,"tag":84,"props":323816,"children":323817},{},[323818],{"type":23,"value":323819},"Occasional early bugs, usually described as resolved quickly",{"type":17,"tag":239,"props":323821,"children":323823},{"id":323822},"when-to-choose-merge-vs-unifiedto",[323824],{"type":23,"value":323825},"When to choose Merge vs Unified.to",{"type":17,"tag":29,"props":323827,"children":323828},{},[323829],{"type":17,"tag":48,"props":323830,"children":323831},{},[323832],{"type":23,"value":323833},"Choose Merge if:",{"type":17,"tag":80,"props":323835,"children":323836},{},[323837,323842,323847],{"type":17,"tag":84,"props":323838,"children":323839},{},[323840],{"type":23,"value":323841},"You need structured data across a limited set of categories (HR, ATS, CRM)",{"type":17,"tag":84,"props":323843,"children":323844},{},[323845],{"type":23,"value":323846},"Your workflows can rely on synced and cached data",{"type":17,"tag":84,"props":323848,"children":323849},{},[323850],{"type":23,"value":323851},"You prefer a simpler, opinionated sync-based model",{"type":17,"tag":29,"props":323853,"children":323854},{},[323855],{"type":17,"tag":48,"props":323856,"children":323857},{},[323858],{"type":23,"value":310523},{"type":17,"tag":80,"props":323860,"children":323861},{},[323862,323866,323871,323876],{"type":17,"tag":84,"props":323863,"children":323864},{},[323865],{"type":23,"value":317082},{"type":17,"tag":84,"props":323867,"children":323868},{},[323869],{"type":23,"value":323870},"You are building AI features that require live customer context",{"type":17,"tag":84,"props":323872,"children":323873},{},[323874],{"type":23,"value":323875},"You need coverage across multiple categories beyond HR and ATS",{"type":17,"tag":84,"props":323877,"children":323878},{},[323879],{"type":23,"value":313745},{"type":17,"tag":239,"props":323881,"children":323882},{"id":7672},[323883],{"type":23,"value":7675},{"type":17,"tag":80,"props":323885,"children":323886},{},[323887,323892,323897,323902],{"type":17,"tag":84,"props":323888,"children":323889},{},[323890],{"type":23,"value":323891},"Merge uses a sync-and-cache model designed for structured category-based integrations",{"type":17,"tag":84,"props":323893,"children":323894},{},[323895],{"type":23,"value":323896},"Unified.to uses real-time pass-through reads with no customer data stored",{"type":17,"tag":84,"props":323898,"children":323899},{},[323900],{"type":23,"value":323901},"Real-time access matters for AI features, dashboards, and user-facing workflows",{"type":17,"tag":84,"props":323903,"children":323904},{},[323905],{"type":23,"value":323906},"Unified.to provides broader category coverage and flexible data delivery methods",{"type":17,"tag":68,"props":323908,"children":323909},{"id":1552},[323910],{"type":23,"value":1555},{"type":17,"tag":29,"props":323912,"children":323913},{},[323914],{"type":23,"value":323915},"If you're building a modern product —something real-time, AI-powered, or deeply integrated across multiple SaaS systems—you'll need more than Merge.",{"type":17,"tag":29,"props":323917,"children":323918},{},[323919],{"type":17,"tag":48,"props":323920,"children":323921},{},[323922],{"type":23,"value":323923},"Unified.to is the best unified API for AI-native, real-time applications.",{"type":17,"tag":29,"props":323925,"children":323926},{},[323927],{"type":23,"value":323928},"It gives your team:",{"type":17,"tag":80,"props":323930,"children":323931},{},[323932,323937,323942],{"type":17,"tag":84,"props":323933,"children":323934},{},[323935],{"type":23,"value":323936},"Control over your data",{"type":17,"tag":84,"props":323938,"children":323939},{},[323940],{"type":23,"value":323941},"Real-time delivery at scale",{"type":17,"tag":84,"props":323943,"children":323944},{},[323945],{"type":23,"value":323946},"A unified layer that powers your entire product — not just one integration vertical",{"type":17,"tag":29,"props":323948,"children":323949},{},[323950,323958,323959,323963,323964,323972,323973],{"type":17,"tag":133,"props":323951,"children":323953},{"href":1612,"rel":323952},[214],[323954],{"type":17,"tag":48,"props":323955,"children":323956},{},[323957],{"type":23,"value":226470},{"type":23,"value":18757},{"type":17,"tag":48,"props":323960,"children":323961},{},[323962],{"type":23,"value":217439},{"type":23,"value":18757},{"type":17,"tag":133,"props":323965,"children":323967},{"href":215330,"rel":323966},[214],[323968],{"type":17,"tag":48,"props":323969,"children":323970},{},[323971],{"type":23,"value":299181},{"type":23,"value":18757},{"type":17,"tag":48,"props":323974,"children":323975},{},[323976],{"type":23,"value":323977},"to see how fast you can go from idea → integration → AI-powered feature.",{"title":7,"searchDepth":1629,"depth":1629,"links":323979},[323980,323981,323984,323985,323986,323987,323988,323994],{"id":322785,"depth":1629,"text":322788},{"id":323043,"depth":1629,"text":323049,"children":323982},[323983],{"id":323175,"depth":1635,"text":323178},{"id":323234,"depth":1629,"text":323237},{"id":323433,"depth":1629,"text":323436},{"id":323491,"depth":1629,"text":323494},{"id":315761,"depth":1629,"text":315764},{"id":311874,"depth":1629,"text":311877,"children":323989},[323990,323991,323992,323993],{"id":323699,"depth":1635,"text":323702},{"id":101855,"depth":1635,"text":217},{"id":323822,"depth":1635,"text":323825},{"id":7672,"depth":1635,"text":7675},{"id":1552,"depth":1629,"text":1555},"content:blog:merge_vs_unified_which_unified_api_is_right_for_your_product.md","blog/merge_vs_unified_which_unified_api_is_right_for_your_product.md","blog/merge_vs_unified_which_unified_api_is_right_for_your_product",{"_path":323999,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":324000,"description":324001,"img":324002,"date":324003,"tag":12,"body":324004,"_type":1677,"_id":324657,"_source":1679,"_file":324658,"_stem":324659,"_extension":1682},"/blog/announcing_database_sync_structured_ai_ready_data_delivered_straight_to_your_database","Announcing Database Sync: structured, AI-ready data delivered straight to your database","Database Sync writes structured customer data from third-party integrations directly into your database using a unified schema, removing the need to build and...","https://s3.us-east-2.amazonaws.com/unified-article-images/announcing_database_sync_structured_ai_ready_data_delivered_straight_to_your_database-icon.png","2025-04-02T00:00:00.000Z",{"type":14,"children":324005,"toc":324642},[324006,324011,324014,324022,324027,324034,324084,324089,324094,324126,324135,324141,324149,324154,324159,324177,324182,324210,324215,324221,324226,324247,324252,324258,324263,324331,324336,324342,324365,324371,324389,324393,324429,324462,324468,324544,324548,324570,324579,324584,324589,324622,324627],{"type":17,"tag":18,"props":324007,"children":324009},{"id":324008},"announcing-database-sync-structured-ai-ready-data-delivered-straight-to-your-database",[324010],{"type":23,"value":324000},{"type":17,"tag":25,"props":324012,"children":324013},{},[],{"type":17,"tag":29,"props":324015,"children":324016},{},[324017],{"type":17,"tag":33,"props":324018,"children":324019},{},[324020],{"type":23,"value":324021},"April 2, 2025",{"type":17,"tag":29,"props":324023,"children":324024},{},[324025],{"type":23,"value":324026},"Database Sync writes structured customer data from third-party integrations directly into your database using a unified schema, removing the need to build and maintain custom data pipelines. It is designed for applications that require fast, queryable access to normalized data for analytics, AI workloads, and customer-facing features.",{"type":17,"tag":29,"props":324028,"children":324029},{},[324030],{"type":17,"tag":48,"props":324031,"children":324032},{},[324033],{"type":23,"value":217887},{"type":17,"tag":80,"props":324035,"children":324036},{},[324037,324042,324047,324063,324068,324079],{"type":17,"tag":84,"props":324038,"children":324039},{},[324040],{"type":23,"value":324041},"Database Sync writes normalized integration data directly into your database",{"type":17,"tag":84,"props":324043,"children":324044},{},[324045],{"type":23,"value":324046},"Removes the need for polling scripts, ETL pipelines, and custom sync infrastructure",{"type":17,"tag":84,"props":324048,"children":324049},{},[324050,324052,324056,324058,324062],{"type":23,"value":324051},"Supports both real-time updates (native ",{"type":17,"tag":133,"props":324053,"children":324054},{"href":4999},[324055],{"type":23,"value":5002},{"type":23,"value":324057},") and scheduled syncs (",{"type":17,"tag":133,"props":324059,"children":324060},{"href":9007},[324061],{"type":23,"value":46572},{"type":23,"value":12034},{"type":17,"tag":84,"props":324064,"children":324065},{},[324066],{"type":23,"value":324067},"Designed for analytics, AI pipelines, and customer-facing features that require fast data access",{"type":17,"tag":84,"props":324069,"children":324070},{},[324071,324073,324077],{"type":23,"value":324072},"Works alongside ",{"type":17,"tag":133,"props":324074,"children":324075},{"href":7691},[324076],{"type":23,"value":7806},{"type":23,"value":324078}," and Webhooks as a third data access pattern",{"type":17,"tag":84,"props":324080,"children":324081},{},[324082],{"type":23,"value":324083},"Keeps schemas consistent across integrations, reducing downstream complexity",{"type":17,"tag":29,"props":324085,"children":324086},{},[324087],{"type":23,"value":324088},"Unified.to supports three methods for accessing customer data, depending on how your application needs to retrieve, process, or store it:",{"type":17,"tag":29,"props":324090,"children":324091},{},[324092],{"type":23,"value":324093},"Whether you're building a SaaS platform, AI agent, or analytics engine, you can now choose the method that best fits your architecture:",{"type":17,"tag":80,"props":324095,"children":324096},{},[324097,324106,324116],{"type":17,"tag":84,"props":324098,"children":324099},{},[324100,324104],{"type":17,"tag":48,"props":324101,"children":324102},{},[324103],{"type":23,"value":7806},{"type":23,"value":324105}," → Retrieve customer data on-demand or poll at set intervals",{"type":17,"tag":84,"props":324107,"children":324108},{},[324109,324114],{"type":17,"tag":48,"props":324110,"children":324111},{},[324112],{"type":23,"value":324113},"Unified Webhooks",{"type":23,"value":324115}," → Sync historical data and receive real-time updates via Native or Virtual Webhooks directly to your API",{"type":17,"tag":84,"props":324117,"children":324118},{},[324119,324124],{"type":17,"tag":48,"props":324120,"children":324121},{},[324122],{"type":23,"value":324123},"Unified Database Sync (New)",{"type":23,"value":324125}," → Write structured, AI-ready data directly to your database for high-performance use cases",{"type":17,"tag":68,"props":324127,"children":324129},{"id":324128},"what-is-database-sync-and-when-should-you-use-it",[324130],{"type":17,"tag":48,"props":324131,"children":324132},{},[324133],{"type":23,"value":324134},"What is Database Sync and when should you use it?",{"type":17,"tag":239,"props":324136,"children":324138},{"id":324137},"a-new-foundation-for-real-time-ai-first-and-analytics-heavy-applications",[324139],{"type":23,"value":324140},"A new foundation for real-time, AI-first, and analytics-heavy applications",{"type":17,"tag":29,"props":324142,"children":324143},{},[324144],{"type":17,"tag":6438,"props":324145,"children":324148},{"alt":324146,"src":324147},"database_sync_diagram_%282%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/announcing_database_sync_structured_ai_ready_data_delivered_straight_to_your_database-0.png",[],{"type":17,"tag":29,"props":324150,"children":324151},{},[324152],{"type":23,"value":324153},"Database Sync builds on Unified.to's real-time unified API infrastructure, offering a direct path from third-party platforms into your database — without custom pipelines or additional infrastructure.",{"type":17,"tag":29,"props":324155,"children":324156},{},[324157],{"type":23,"value":324158},"Unified.to's Database Sync:",{"type":17,"tag":80,"props":324160,"children":324161},{},[324162,324167,324172],{"type":17,"tag":84,"props":324163,"children":324164},{},[324165],{"type":23,"value":324166},"Writes normalized data directly to your database",{"type":17,"tag":84,"props":324168,"children":324169},{},[324170],{"type":23,"value":324171},"Supports major relational and non-relational databases: Postgres, MySQL, MongoDB, MSSQL, CockroachDB, and MariaDB",{"type":17,"tag":84,"props":324173,"children":324174},{},[324175],{"type":23,"value":324176},"Powers downstream workflows — from customer-facing dashboards to vector databases and AI agents",{"type":17,"tag":29,"props":324178,"children":324179},{},[324180],{"type":23,"value":324181},"Behind the scenes, Unified.to handles the entire pipeline:",{"type":17,"tag":80,"props":324183,"children":324184},{},[324185,324190,324195,324200,324205],{"type":17,"tag":84,"props":324186,"children":324187},{},[324188],{"type":23,"value":324189},"Unified schema mapping across platforms",{"type":17,"tag":84,"props":324191,"children":324192},{},[324193],{"type":23,"value":324194},"Webhook ingestion (native or virtual)",{"type":17,"tag":84,"props":324196,"children":324197},{},[324198],{"type":23,"value":324199},"Scheduled syncs or real-time syncs",{"type":17,"tag":84,"props":324201,"children":324202},{},[324203],{"type":23,"value":324204},"Automatic table creation — we generate database tables based on our unified data models, including sub-tables for arrays and associations",{"type":17,"tag":84,"props":324206,"children":324207},{},[324208],{"type":23,"value":324209},"Ensures your data is always clean and AI-ready",{"type":17,"tag":29,"props":324211,"children":324212},{},[324213],{"type":23,"value":324214},"No polling scripts. No ETL overhead. No infrastructure to maintain. Unified.to takes care of the full sync lifecycle — so your team can stay focused on building.",{"type":17,"tag":68,"props":324216,"children":324218},{"id":324217},"native-vs-virtual-webhooks-flexible-delivery-same-result",[324219],{"type":23,"value":324220},"Native vs. virtual webhooks: flexible delivery, same result",{"type":17,"tag":29,"props":324222,"children":324223},{},[324224],{"type":23,"value":324225},"Unified.to supports two delivery modes:",{"type":17,"tag":80,"props":324227,"children":324228},{},[324229,324238],{"type":17,"tag":84,"props":324230,"children":324231},{},[324232,324236],{"type":17,"tag":48,"props":324233,"children":324234},{},[324235],{"type":23,"value":9024},{"type":23,"value":324237},": For platforms that support webhooks, we instantly sync updates to your database.",{"type":17,"tag":84,"props":324239,"children":324240},{},[324241,324245],{"type":17,"tag":48,"props":324242,"children":324243},{},[324244],{"type":23,"value":9256},{"type":23,"value":324246},": For platforms without native support, we virtualize webhooks through scheduled polling — offering near real-time updates with no added infrastructure.",{"type":17,"tag":29,"props":324248,"children":324249},{},[324250],{"type":23,"value":324251},"Regardless of the source or delivery method, your database receives structured, normalized records — ready for querying, embedding, and downstream use.",{"type":17,"tag":68,"props":324253,"children":324255},{"id":324254},"use-cases-power-ai-native-and-data-rich-customer-experiences",[324256],{"type":23,"value":324257},"Use cases: power AI-native and data-rich customer experiences",{"type":17,"tag":29,"props":324259,"children":324260},{},[324261],{"type":23,"value":324262},"Teams can use Database Sync to build production-grade features that rely on fast, structured access to customer data. Here are some examples:",{"type":17,"tag":80,"props":324264,"children":324265},{},[324266,324279,324292,324305,324318],{"type":17,"tag":84,"props":324267,"children":324268},{},[324269,324274,324277],{"type":17,"tag":48,"props":324270,"children":324271},{},[324272],{"type":23,"value":324273},"AI copilots with real-time customer context",{"type":17,"tag":3891,"props":324275,"children":324276},{},[],{"type":23,"value":324278},"Sync CRM, support, or HR data into a vector database to power retrieval-augmented generation (RAG) agents that deliver relevant, personalized responses.",{"type":17,"tag":84,"props":324280,"children":324281},{},[324282,324287,324290],{"type":17,"tag":48,"props":324283,"children":324284},{},[324285],{"type":23,"value":324286},"Embedded analytics and dashboards",{"type":17,"tag":3891,"props":324288,"children":324289},{},[],{"type":23,"value":324291},"Populate in-app dashboards with live data pulled from your customers' tools — without requiring them to manually export or upload anything.",{"type":17,"tag":84,"props":324293,"children":324294},{},[324295,324300,324303],{"type":17,"tag":48,"props":324296,"children":324297},{},[324298],{"type":23,"value":324299},"AI-driven recommendations and personalization",{"type":17,"tag":3891,"props":324301,"children":324302},{},[],{"type":23,"value":324304},"Feed unified, structured customer data into your ML models to deliver smarter product experiences — from content suggestions to workflow automations.",{"type":17,"tag":84,"props":324306,"children":324307},{},[324308,324313,324316],{"type":17,"tag":48,"props":324309,"children":324310},{},[324311],{"type":23,"value":324312},"Multi-source insights for end users",{"type":17,"tag":3891,"props":324314,"children":324315},{},[],{"type":23,"value":324317},"Aggregate data from disparate third-party platforms into a single view, enabling your product to provide customers with consolidated insights.",{"type":17,"tag":84,"props":324319,"children":324320},{},[324321,324326,324329],{"type":17,"tag":48,"props":324322,"children":324323},{},[324324],{"type":23,"value":324325},"SaaS integrations as a product differentiator",{"type":17,"tag":3891,"props":324327,"children":324328},{},[],{"type":23,"value":324330},"Offer rich out-of-the-box integrations that sync directly to your backend — reducing latency, increasing stickiness, and speeding up onboarding.",{"type":17,"tag":29,"props":324332,"children":324333},{},[324334],{"type":23,"value":324335},"Database Sync helps you move past the limitations of API polling and fragmented data access — giving your product direct access to your customers' normalized data.",{"type":17,"tag":239,"props":324337,"children":324339},{"id":324338},"when-to-use-database-sync",[324340],{"type":23,"value":324341},"When to use Database Sync",{"type":17,"tag":80,"props":324343,"children":324344},{},[324345,324350,324355,324360],{"type":17,"tag":84,"props":324346,"children":324347},{},[324348],{"type":23,"value":324349},"You need fast, queryable access to customer data in your backend",{"type":17,"tag":84,"props":324351,"children":324352},{},[324353],{"type":23,"value":324354},"Your product depends on analytics, reporting, or AI pipelines",{"type":17,"tag":84,"props":324356,"children":324357},{},[324358],{"type":23,"value":324359},"You want to avoid building and maintaining ETL pipelines",{"type":17,"tag":84,"props":324361,"children":324362},{},[324363],{"type":23,"value":324364},"You need consistent schemas across multiple integrations",{"type":17,"tag":239,"props":324366,"children":324368},{"id":324367},"when-not-to-use-database-sync",[324369],{"type":23,"value":324370},"When not to use Database Sync",{"type":17,"tag":80,"props":324372,"children":324373},{},[324374,324379,324384],{"type":17,"tag":84,"props":324375,"children":324376},{},[324377],{"type":23,"value":324378},"You only need data occasionally (API is simpler)",{"type":17,"tag":84,"props":324380,"children":324381},{},[324382],{"type":23,"value":324383},"Your workflows are purely event-driven (webhooks are sufficient)",{"type":17,"tag":84,"props":324385,"children":324386},{},[324387],{"type":23,"value":324388},"You don't store or process data in your backend",{"type":17,"tag":68,"props":324390,"children":324391},{"id":322421},[324392],{"type":23,"value":322424},{"type":17,"tag":29,"props":324394,"children":324395},{},[324396,324398,324408,324409,324418,324420,324428],{"type":23,"value":324397},"Database Sync is now available in all ",{"type":17,"tag":133,"props":324399,"children":324402},{"href":324400,"rel":324401},"https://unified.to/pricing",[214],[324403],{"type":17,"tag":48,"props":324404,"children":324405},{},[324406],{"type":23,"value":324407},"Grow",{"type":23,"value":34435},{"type":17,"tag":133,"props":324410,"children":324412},{"href":324400,"rel":324411},[214],[324413],{"type":17,"tag":48,"props":324414,"children":324415},{},[324416],{"type":23,"value":324417},"Scale",{"type":23,"value":324419}," plans, and accessible during your ",{"type":17,"tag":133,"props":324421,"children":324423},{"href":1612,"rel":324422},[214],[324424],{"type":17,"tag":48,"props":324425,"children":324426},{},[324427],{"type":23,"value":322435},{"type":23,"value":54},{"type":17,"tag":80,"props":324430,"children":324431},{},[324432,324442,324452],{"type":17,"tag":84,"props":324433,"children":324434},{},[324435,324440],{"type":17,"tag":48,"props":324436,"children":324437},{},[324438],{"type":23,"value":324439},"Databases",{"type":23,"value":324441},": Postgres, MongoDB, MySQL, MSSQL, MariaDB, CockroachDB",{"type":17,"tag":84,"props":324443,"children":324444},{},[324445,324450],{"type":17,"tag":48,"props":324446,"children":324447},{},[324448],{"type":23,"value":324449},"AI Workflows",{"type":23,"value":324451},": Built-in support for vector DBs and embedding models",{"type":17,"tag":84,"props":324453,"children":324454},{},[324455,324460],{"type":17,"tag":48,"props":324456,"children":324457},{},[324458],{"type":23,"value":324459},"Sync Modes",{"type":23,"value":324461},": Scheduled (Virtual) or real-time (Native)",{"type":17,"tag":239,"props":324463,"children":324465},{"id":324464},"how-to-access-customer-data-with-unified",[324466],{"type":23,"value":324467},"How to access customer data with Unified",{"type":17,"tag":7231,"props":324469,"children":324470},{},[324471,324490],{"type":17,"tag":7235,"props":324472,"children":324473},{},[324474],{"type":17,"tag":7239,"props":324475,"children":324476},{},[324477,324482,324486],{"type":17,"tag":7243,"props":324478,"children":324479},{},[324480],{"type":23,"value":324481},"Method",{"type":17,"tag":7243,"props":324483,"children":324484},{},[324485],{"type":23,"value":255226},{"type":17,"tag":7243,"props":324487,"children":324488},{},[324489],{"type":23,"value":502},{"type":17,"tag":7259,"props":324491,"children":324492},{},[324493,324510,324527],{"type":17,"tag":7239,"props":324494,"children":324495},{},[324496,324500,324505],{"type":17,"tag":7266,"props":324497,"children":324498},{},[324499],{"type":23,"value":7806},{"type":17,"tag":7266,"props":324501,"children":324502},{},[324503],{"type":23,"value":324504},"Retrieve data on request via API calls",{"type":17,"tag":7266,"props":324506,"children":324507},{},[324508],{"type":23,"value":324509},"User-triggered actions and on-demand reads",{"type":17,"tag":7239,"props":324511,"children":324512},{},[324513,324517,324522],{"type":17,"tag":7266,"props":324514,"children":324515},{},[324516],{"type":23,"value":324113},{"type":17,"tag":7266,"props":324518,"children":324519},{},[324520],{"type":23,"value":324521},"Receive event-based updates",{"type":17,"tag":7266,"props":324523,"children":324524},{},[324525],{"type":23,"value":324526},"Event-driven workflows and real-time triggers",{"type":17,"tag":7239,"props":324528,"children":324529},{},[324530,324534,324539],{"type":17,"tag":7266,"props":324531,"children":324532},{},[324533],{"type":23,"value":317315},{"type":17,"tag":7266,"props":324535,"children":324536},{},[324537],{"type":23,"value":324538},"Write data directly to your database",{"type":17,"tag":7266,"props":324540,"children":324541},{},[324542],{"type":23,"value":324543},"Analytics, AI pipelines, and backend processing",{"type":17,"tag":239,"props":324545,"children":324546},{"id":7672},[324547],{"type":23,"value":7675},{"type":17,"tag":80,"props":324549,"children":324550},{},[324551,324555,324560,324565],{"type":17,"tag":84,"props":324552,"children":324553},{},[324554],{"type":23,"value":324041},{"type":17,"tag":84,"props":324556,"children":324557},{},[324558],{"type":23,"value":324559},"It removes the need for custom pipelines and sync infrastructure",{"type":17,"tag":84,"props":324561,"children":324562},{},[324563],{"type":23,"value":324564},"It is best suited for analytics, AI workflows, and backend data processing",{"type":17,"tag":84,"props":324566,"children":324567},{},[324568],{"type":23,"value":324569},"Unified supports API, Webhooks, and Database Sync as complementary access patterns",{"type":17,"tag":68,"props":324571,"children":324573},{"id":324572},"unifiedto-is-data-infrastructure-for-ai-native-products",[324574],{"type":17,"tag":48,"props":324575,"children":324576},{},[324577],{"type":23,"value":324578},"Unified.to is data infrastructure for AI-native products",{"type":17,"tag":29,"props":324580,"children":324581},{},[324582],{"type":23,"value":324583},"With Database Sync, Unified.to moves beyond integrations and into infrastructure — giving modern product teams a unified data layer for powering intelligent applications.",{"type":17,"tag":29,"props":324585,"children":324586},{},[324587],{"type":23,"value":324588},"AI-native products don't just need API access — they need normalized, unified, and continuously updated data across platforms. Unified.to delivers that with:",{"type":17,"tag":80,"props":324590,"children":324591},{},[324592,324602,324612],{"type":17,"tag":84,"props":324593,"children":324594},{},[324595,324600],{"type":17,"tag":48,"props":324596,"children":324597},{},[324598],{"type":23,"value":324599},"Unification across platforms",{"type":23,"value":324601}," — abstract away API differences with a consistent schema",{"type":17,"tag":84,"props":324603,"children":324604},{},[324605,324610],{"type":17,"tag":48,"props":324606,"children":324607},{},[324608],{"type":23,"value":324609},"Normalization by default",{"type":23,"value":324611}," — clean, structured data that's immediately usable",{"type":17,"tag":84,"props":324613,"children":324614},{},[324615,324620],{"type":17,"tag":48,"props":324616,"children":324617},{},[324618],{"type":23,"value":324619},"Multiple delivery modes",{"type":23,"value":324621}," — query via API, receive real-time events, or sync directly to your database",{"type":17,"tag":29,"props":324623,"children":324624},{},[324625],{"type":23,"value":324626},"Whether you're building retrieval-augmented generation (RAG), embedding pipelines, or tools that act on customer data, Unified.to gives you everything you need to move fast — without integration complexity slowing you down.",{"type":17,"tag":29,"props":324628,"children":324629},{},[324630,324635,324636],{"type":17,"tag":133,"props":324631,"children":324633},{"href":215330,"rel":324632},[214],[324634],{"type":23,"value":1627},{"type":23,"value":75890},{"type":17,"tag":133,"props":324637,"children":324639},{"href":1612,"rel":324638},[214],[324640],{"type":23,"value":324641},"start a free trial",{"title":7,"searchDepth":1629,"depth":1629,"links":324643},[324644,324647,324648,324652,324656],{"id":324128,"depth":1629,"text":324134,"children":324645},[324646],{"id":324137,"depth":1635,"text":324140},{"id":324217,"depth":1629,"text":324220},{"id":324254,"depth":1629,"text":324257,"children":324649},[324650,324651],{"id":324338,"depth":1635,"text":324341},{"id":324367,"depth":1635,"text":324370},{"id":322421,"depth":1629,"text":322424,"children":324653},[324654,324655],{"id":324464,"depth":1635,"text":324467},{"id":7672,"depth":1635,"text":7675},{"id":324572,"depth":1629,"text":324578},"content:blog:announcing_database_sync_structured_ai_ready_data_delivered_straight_to_your_database.md","blog/announcing_database_sync_structured_ai_ready_data_delivered_straight_to_your_database.md","blog/announcing_database_sync_structured_ai_ready_data_delivered_straight_to_your_database",{"_path":324661,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":324662,"description":324663,"img":324664,"date":324003,"tag":12,"body":324665,"_type":1677,"_id":325182,"_source":1679,"_file":325183,"_stem":325184,"_extension":1682},"/blog/when_to_use_and_not_use_model_context_protocol","When to use (and not use) Model Context Protocol","Model Context Protocol (MCP) is useful for connecting LLMs to external APIs and tools, but it should not be used as the core orchestration layer of a...","https://s3.us-east-2.amazonaws.com/unified-article-images/when_to_use_and_not_use_model_context_protocol-icon.png",{"type":14,"children":324666,"toc":325170},[324667,324672,324675,324682,324696,324700,324723,324735,324748,324753,324758,324763,324768,324778,324783,324793,324798,324803,324821,324826,324834,324840,324845,324850,324855,324860,324866,324871,324889,324908,324913,324919,324924,324929,324934,324945,324968,324974,324986,324991,325009,325014,325021,325054,325066,325072,325146,325154],{"type":17,"tag":18,"props":324668,"children":324670},{"id":324669},"when-to-use-and-not-use-model-context-protocol",[324671],{"type":23,"value":324662},{"type":17,"tag":25,"props":324673,"children":324674},{},[],{"type":17,"tag":29,"props":324676,"children":324677},{},[324678],{"type":17,"tag":33,"props":324679,"children":324680},{},[324681],{"type":23,"value":324021},{"type":17,"tag":29,"props":324683,"children":324684},{},[324685,324689,324690,324694],{"type":17,"tag":133,"props":324686,"children":324687},{"href":64193},[324688],{"type":23,"value":44580},{"type":23,"value":44573},{"type":17,"tag":133,"props":324691,"children":324692},{"href":326},[324693],{"type":23,"value":329},{"type":23,"value":324695},") is useful for connecting LLMs to external APIs and tools, but it should not be used as the core orchestration layer of a production application. MCP works best for controlled tool access and rapid prototyping, while business logic, data access, and system behavior should remain in your backend for reliability, security, and observability.",{"type":17,"tag":239,"props":324697,"children":324698},{"id":7672},[324699],{"type":23,"value":7675},{"type":17,"tag":80,"props":324701,"children":324702},{},[324703,324708,324713,324718],{"type":17,"tag":84,"props":324704,"children":324705},{},[324706],{"type":23,"value":324707},"MCP is a tool-access protocol, not a replacement for backend logic",{"type":17,"tag":84,"props":324709,"children":324710},{},[324711],{"type":23,"value":324712},"LLM-driven orchestration reduces reliability in production systems",{"type":17,"tag":84,"props":324714,"children":324715},{},[324716],{"type":23,"value":324717},"AI features perform better when built on structured, controlled data access",{"type":17,"tag":84,"props":324719,"children":324720},{},[324721],{"type":23,"value":324722},"The strongest architecture combines deterministic systems with LLM capabilities",{"type":17,"tag":29,"props":324724,"children":324725},{},[324726,324728,324733],{"type":23,"value":324727},"As LLM capabilities evolve beyond just generation, developers are exploring how to use chains of prompts and tools to plan, fetch, execute, and respond—especially across APIs and third-party systems. That's the core promise of MCPs: ",{"type":17,"tag":48,"props":324729,"children":324730},{},[324731],{"type":23,"value":324732},"offload orchestration into the LLM",{"type":23,"value":324734},", turning your prompt into the brain of your product.",{"type":17,"tag":29,"props":324736,"children":324737},{},[324738,324740,324746],{"type":23,"value":324739},"MCP (",{"type":17,"tag":133,"props":324741,"children":324744},{"href":324742,"rel":324743},"https://www.anthropic.com/news/model-context-protocol",[214],[324745],{"type":23,"value":44580},{"type":23,"value":324747},") is an open protocol for connecting LLM clients to external tools and data sources through an MCP server, using structured tool definitions and standardized transport.",{"type":17,"tag":29,"props":324749,"children":324750},{},[324751],{"type":23,"value":324752},"MCP now has broad ecosystem support across model APIs and agent clients. In practice, teams are using it to connect LLMs to real tools without inventing a one-off tool schema for every integration.",{"type":17,"tag":29,"props":324754,"children":324755},{},[324756],{"type":23,"value":324757},"And to be clear—there are cases where this makes sense.",{"type":17,"tag":29,"props":324759,"children":324760},{},[324761],{"type":23,"value":324762},"If you're building an internal AI agent, a low-stakes automation, or a prototype that needs to call multiple APIs in sequence, MCPs can accelerate development dramatically. The flexibility and abstraction are powerful. You can sketch out entire workflows in natural language and ship something useful within hours.",{"type":17,"tag":29,"props":324764,"children":324765},{},[324766],{"type":23,"value":324767},"But that doesn't mean MCPs should become the foundation of your application—or your AI agent.",{"type":17,"tag":29,"props":324769,"children":324770},{},[324771,324773],{"type":23,"value":324772},"At Unified.to, we work with dozens of companies building AI-native products, vertical SaaS tools, and customer-facing assistants. What we're seeing across the board: ",{"type":17,"tag":48,"props":324774,"children":324775},{},[324776],{"type":23,"value":324777},"developers are overestimating what MCPs are good at, and underestimating the risks of offloading too much.",{"type":17,"tag":29,"props":324779,"children":324780},{},[324781],{"type":23,"value":324782},"Here's why.",{"type":17,"tag":68,"props":324784,"children":324786},{"id":324785},"_1-should-mcp-be-used-as-an-orchestration-layer",[324787,324788],{"type":23,"value":262081},{"type":17,"tag":48,"props":324789,"children":324790},{},[324791],{"type":23,"value":324792},"Should MCP be used as an orchestration layer?",{"type":17,"tag":29,"props":324794,"children":324795},{},[324796],{"type":23,"value":324797},"LLMs are amazing at pattern recognition, text generation, and fuzzy reasoning. But they're not built for deterministic logic, predictable routing, or reliable orchestration. MCPs often push you to offload critical product behavior—like fetching data, triggering updates, or syncing systems—into prompt chains.",{"type":17,"tag":29,"props":324799,"children":324800},{},[324801],{"type":23,"value":324802},"This introduces fragility and complexity:",{"type":17,"tag":80,"props":324804,"children":324805},{},[324806,324811,324816],{"type":17,"tag":84,"props":324807,"children":324808},{},[324809],{"type":23,"value":324810},"Business logic gets buried in prompt templates",{"type":17,"tag":84,"props":324812,"children":324813},{},[324814],{"type":23,"value":324815},"Observability and monitoring become opaque",{"type":17,"tag":84,"props":324817,"children":324818},{},[324819],{"type":23,"value":324820},"Debugging becomes trial and error",{"type":17,"tag":29,"props":324822,"children":324823},{},[324824],{"type":23,"value":324825},"The LLM should power parts of your experience—not take over your entire backend.",{"type":17,"tag":29,"props":324827,"children":324828},{},[324829],{"type":17,"tag":48,"props":324830,"children":324831},{},[324832],{"type":23,"value":324833},"MCP is most useful as a controlled tool-access layer (permissioned tools, allow-lists, optional PII stripping), not as the place where your product's business logic lives.",{"type":17,"tag":68,"props":324835,"children":324837},{"id":324836},"_2-passing-customer-data-to-the-llm-creates-data-governance-risks",[324838],{"type":23,"value":324839},"2. Passing customer data to the LLM creates data governance risks",{"type":17,"tag":29,"props":324841,"children":324842},{},[324843],{"type":23,"value":324844},"MCPs often require giving the LLM access to customer systems: either by embedding data directly in prompts or by using the LLM to call external APIs. That means handing off credentials, tokens, and sensitive business context to a third party.",{"type":17,"tag":29,"props":324846,"children":324847},{},[324848],{"type":23,"value":324849},"You can implement MCP without giving an LLM provider raw customer credentials. The safest pattern is: credentials stay in your infra, tools are permissioned and allow-listed, and responses can be filtered to remove sensitive fields.",{"type":17,"tag":29,"props":324851,"children":324852},{},[324853],{"type":23,"value":324854},"In an enterprise or customer-facing environment, this breaks trust. Your customers expect your app to own the interaction—not to delegate it to a model vendor.",{"type":17,"tag":29,"props":324856,"children":324857},{},[324858],{"type":23,"value":324859},"At Unified.to, we believe in using LLMs to generate value—but with a clear boundary: you orchestrate, you control access, you govern the flow. The LLM shouldn't get the keys to your customer's backend.",{"type":17,"tag":68,"props":324861,"children":324863},{"id":324862},"_3-the-more-logic-you-offload-the-thinner-your-product-becomes",[324864],{"type":23,"value":324865},"3. The more logic you offload, the thinner your product becomes",{"type":17,"tag":29,"props":324867,"children":324868},{},[324869],{"type":23,"value":324870},"As Model Context Protocol-based architecture servers grow more capable, it's tempting to let the LLM plan, reason, and execute across tools. But the more core functionality you shift into the LLM, the less your application owns—and the less value you have.",{"type":17,"tag":80,"props":324872,"children":324873},{},[324874,324879,324884],{"type":17,"tag":84,"props":324875,"children":324876},{},[324877],{"type":23,"value":324878},"You're not designing workflows—you're prompting them.",{"type":17,"tag":84,"props":324880,"children":324881},{},[324882],{"type":23,"value":324883},"You're not orchestrating—you're hoping the model gets it right.",{"type":17,"tag":84,"props":324885,"children":324886},{},[324887],{"type":23,"value":324888},"You're not building an opinionated product—you're handing that over to someone else's general-purpose model.",{"type":17,"tag":29,"props":324890,"children":324891},{},[324892,324894,324899,324901,324906],{"type":23,"value":324893},"This leads to thinner applications that rely too heavily on ",{"type":17,"tag":33,"props":324895,"children":324896},{},[324897],{"type":23,"value":324898},"external orchestration",{"type":23,"value":324900},", not ",{"type":17,"tag":33,"props":324902,"children":324903},{},[324904],{"type":23,"value":324905},"external data",{"type":23,"value":324907},". And that's an important distinction.",{"type":17,"tag":29,"props":324909,"children":324910},{},[324911],{"type":23,"value":324912},"At Unified.to, we believe using third-party data is a superpower—as long as you own the logic that powers how it's used. That's what makes AI-native SaaS sticky: not just access to customer systems, but smart, reliable, product-controlled workflows built on top of that access.",{"type":17,"tag":68,"props":324914,"children":324916},{"id":324915},"_4-ai-works-better-with-structured-data",[324917],{"type":23,"value":324918},"4. AI works better with structured data",{"type":17,"tag":29,"props":324920,"children":324921},{},[324922],{"type":23,"value":324923},"AI systems rely on clean, contextual, and structured data to work effectively. Whether you're classifying support tickets, summarizing conversations, or triggering automation based on HR events, messy or inconsistent inputs will add complexity and reduce reliability.",{"type":17,"tag":29,"props":324925,"children":324926},{},[324927],{"type":23,"value":324928},"That's where Unified.to comes in.",{"type":17,"tag":29,"props":324930,"children":324931},{},[324932],{"type":23,"value":324933},"We unify customer data from third-party applications into consistent schemas that your product—and your AI features—can trust. For example, in messaging platforms, we normalize the core concept of a \"message body,\" so you don't have to build custom extractors for Slack, Discord, Teams, and more.",{"type":17,"tag":29,"props":324935,"children":324936},{},[324937,324939,324943],{"type":23,"value":324938},"With real-time reads/writes and ",{"type":17,"tag":133,"props":324940,"children":324941},{"href":4999},[324942],{"type":23,"value":5002},{"type":23,"value":324944}," (native + virtual), and normalized fields, Unified.to gives your AI stack a reliable foundation—without the complexity of integrating every service individually.",{"type":17,"tag":80,"props":324946,"children":324947},{},[324948,324953,324958,324963],{"type":17,"tag":84,"props":324949,"children":324950},{},[324951],{"type":23,"value":324952},"Unified access to CRMs, HR tools, accounting systems, file storage, messaging platforms, and more",{"type":17,"tag":84,"props":324954,"children":324955},{},[324956],{"type":23,"value":324957},"Real-time data when your assistant or workflow needs it",{"type":17,"tag":84,"props":324959,"children":324960},{},[324961],{"type":23,"value":324962},"Governed access and full observability",{"type":17,"tag":84,"props":324964,"children":324965},{},[324966],{"type":23,"value":324967},"No need to build or maintain dozens of brittle APIs",{"type":17,"tag":68,"props":324969,"children":324971},{"id":324970},"_5-the-real-unlock-is-ai-native-architecturenot-mcp-native-design",[324972],{"type":23,"value":324973},"5. The real unlock is AI-native architecture—not MCP-native design",{"type":17,"tag":29,"props":324975,"children":324976},{},[324977,324979,324984],{"type":23,"value":324978},"To be clear: we're not anti-MCP. There are cases where chaining LLM steps makes sense—especially for internal agents or constrained environments. But the current hype makes it seem like ",{"type":17,"tag":33,"props":324980,"children":324981},{},[324982],{"type":23,"value":324983},"every",{"type":23,"value":324985}," team should be building this way.",{"type":17,"tag":29,"props":324987,"children":324988},{},[324989],{"type":23,"value":324990},"You don't need to follow the MCP playbook to build AI-native software. The best products we see combine:",{"type":17,"tag":80,"props":324992,"children":324993},{},[324994,324999,325004],{"type":17,"tag":84,"props":324995,"children":324996},{},[324997],{"type":23,"value":324998},"Traditional logic and workflows",{"type":17,"tag":84,"props":325000,"children":325001},{},[325002],{"type":23,"value":325003},"LLM-powered enhancements",{"type":17,"tag":84,"props":325005,"children":325006},{},[325007],{"type":23,"value":325008},"Unified access to the customer's business systems",{"type":17,"tag":29,"props":325010,"children":325011},{},[325012],{"type":23,"value":325013},"These apps are fast, flexible, and user-friendly—with smart defaults, deterministic behavior, and human-in-the-loop controls where it counts.",{"type":17,"tag":68,"props":325015,"children":325016},{"id":243535},[325017],{"type":17,"tag":48,"props":325018,"children":325019},{},[325020],{"type":23,"value":217887},{"type":17,"tag":80,"props":325022,"children":325023},{},[325024,325029,325034,325039,325044,325049],{"type":17,"tag":84,"props":325025,"children":325026},{},[325027],{"type":23,"value":325028},"MCP connects LLMs to APIs through structured tool definitions",{"type":17,"tag":84,"props":325030,"children":325031},{},[325032],{"type":23,"value":325033},"It is effective for internal agents, prototypes, and low-risk automation",{"type":17,"tag":84,"props":325035,"children":325036},{},[325037],{"type":23,"value":325038},"Offloading orchestration to LLMs introduces reliability and debugging issues",{"type":17,"tag":84,"props":325040,"children":325041},{},[325042],{"type":23,"value":325043},"Passing customer data through LLMs creates governance and security risks",{"type":17,"tag":84,"props":325045,"children":325046},{},[325047],{"type":23,"value":325048},"Production systems should keep logic and data access in controlled backend services",{"type":17,"tag":84,"props":325050,"children":325051},{},[325052],{"type":23,"value":325053},"MCP works best as a tool-access layer—not as application infrastructure",{"type":17,"tag":29,"props":325055,"children":325056},{},[325057,325059,325065],{"type":23,"value":325058},"If you want MCP-style tool calling with scoped permissions, see the ",{"type":17,"tag":133,"props":325060,"children":325062},{"href":217198,"rel":325061},[214],[325063],{"type":23,"value":325064},"Unified MCP server docs",{"type":23,"value":54},{"type":17,"tag":239,"props":325067,"children":325069},{"id":325068},"when-to-use-mcp-vs-not-use-mcp",[325070],{"type":23,"value":325071},"When to use MCP vs not use MCP",{"type":17,"tag":7231,"props":325073,"children":325074},{},[325075,325091],{"type":17,"tag":7235,"props":325076,"children":325077},{},[325078],{"type":17,"tag":7239,"props":325079,"children":325080},{},[325081,325086],{"type":17,"tag":7243,"props":325082,"children":325083},{},[325084],{"type":23,"value":325085},"Use MCP when",{"type":17,"tag":7243,"props":325087,"children":325088},{},[325089],{"type":23,"value":325090},"Avoid MCP when",{"type":17,"tag":7259,"props":325092,"children":325093},{},[325094,325107,325120,325133],{"type":17,"tag":7239,"props":325095,"children":325096},{},[325097,325102],{"type":17,"tag":7266,"props":325098,"children":325099},{},[325100],{"type":23,"value":325101},"Building internal agents or prototypes",{"type":17,"tag":7266,"props":325103,"children":325104},{},[325105],{"type":23,"value":325106},"Running customer-facing production workflows",{"type":17,"tag":7239,"props":325108,"children":325109},{},[325110,325115],{"type":17,"tag":7266,"props":325111,"children":325112},{},[325113],{"type":23,"value":325114},"Tasks are low-risk and reversible",{"type":17,"tag":7266,"props":325116,"children":325117},{},[325118],{"type":23,"value":325119},"Actions require deterministic behavior",{"type":17,"tag":7239,"props":325121,"children":325122},{},[325123,325128],{"type":17,"tag":7266,"props":325124,"children":325125},{},[325126],{"type":23,"value":325127},"You need fast iteration across multiple APIs",{"type":17,"tag":7266,"props":325129,"children":325130},{},[325131],{"type":23,"value":325132},"You need observability, logging, and debugging",{"type":17,"tag":7239,"props":325134,"children":325135},{},[325136,325141],{"type":17,"tag":7266,"props":325137,"children":325138},{},[325139],{"type":23,"value":325140},"Tool access can be tightly scoped",{"type":17,"tag":7266,"props":325142,"children":325143},{},[325144],{"type":23,"value":325145},"Sensitive customer data or credentials are involved",{"type":17,"tag":29,"props":325147,"children":325148},{},[325149],{"type":17,"tag":48,"props":325150,"children":325151},{},[325152],{"type":23,"value":325153},"Want to build smarter, more opinionated AI features?",{"type":17,"tag":29,"props":325155,"children":325156},{},[325157,325162,325163,325168],{"type":17,"tag":133,"props":325158,"children":325160},{"href":1612,"rel":325159},[214],[325161],{"type":23,"value":226470},{"type":23,"value":75890},{"type":17,"tag":133,"props":325164,"children":325166},{"href":215330,"rel":325165},[214],[325167],{"type":23,"value":299181},{"type":23,"value":325169}," about unifying your data layer for LLM-powered applications.",{"title":7,"searchDepth":1629,"depth":1629,"links":325171},[325172,325173,325175,325176,325177,325178,325179],{"id":7672,"depth":1635,"text":7675},{"id":324785,"depth":1629,"text":325174},"1. Should MCP be used as an orchestration layer?",{"id":324836,"depth":1629,"text":324839},{"id":324862,"depth":1629,"text":324865},{"id":324915,"depth":1629,"text":324918},{"id":324970,"depth":1629,"text":324973},{"id":243535,"depth":1629,"text":217887,"children":325180},[325181],{"id":325068,"depth":1635,"text":325071},"content:blog:when_to_use_and_not_use_model_context_protocol.md","blog/when_to_use_and_not_use_model_context_protocol.md","blog/when_to_use_and_not_use_model_context_protocol",{"_path":325186,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":325187,"description":325188,"img":325189,"date":325190,"tag":12,"body":325191,"_type":1677,"_id":325711,"_source":1679,"_file":325712,"_stem":325713,"_extension":1682},"/blog/march_2025_product_updates","March 2025 product updates","This month, we're expanding deeper into Payments, ATS, HR, CRM, and Accounting—while continuing to scale webhook coverage and field-level control across key...","https://s3.us-east-2.amazonaws.com/unified-article-images/march_2025_product_updates-icon.png","2025-03-31T00:00:00.000Z",{"type":14,"children":325192,"toc":325703},[325193,325198,325201,325209,325217,325222,325227,325232,325250,325255,325259,325264,325278,325283,325297,325302,325315,325320,325334,325347,325362,325370,325376,325384,325389,325394,325399,325432,325438,325451,325469,325474,325480,325485,325490,325508,325514,325519,325543,325549,325554,325562,325590,325598,325626,325634,325639,325682,325687,325695],{"type":17,"tag":18,"props":325194,"children":325196},{"id":325195},"march-2025-product-updates",[325197],{"type":23,"value":325187},{"type":17,"tag":25,"props":325199,"children":325200},{},[],{"type":17,"tag":29,"props":325202,"children":325203},{},[325204],{"type":17,"tag":33,"props":325205,"children":325206},{},[325207],{"type":23,"value":325208},"March 31, 2025",{"type":17,"tag":29,"props":325210,"children":325211},{},[325212],{"type":17,"tag":6438,"props":325213,"children":325216},{"alt":325214,"src":325215},"product_update_feb_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/march_2025_product_updates-0.png",[],{"type":17,"tag":29,"props":325218,"children":325219},{},[325220],{"type":23,"value":325221},"This month, we're expanding deeper into Payments, ATS, HR, CRM, and Accounting—while continuing to scale webhook coverage and field-level control across key platforms.",{"type":17,"tag":29,"props":325223,"children":325224},{},[325225],{"type":23,"value":325226},"We also launched a major new capability: Database Sync, giving developers a fully managed, real-time way to stream structured SaaS data into their own database.",{"type":17,"tag":29,"props":325228,"children":325229},{},[325230],{"type":23,"value":325231},"Unified.to's next-gen architecture means:",{"type":17,"tag":80,"props":325233,"children":325234},{},[325235,325240,325245],{"type":17,"tag":84,"props":325236,"children":325237},{},[325238],{"type":23,"value":325239},"We ship updates across entire categories—not one integration at a time",{"type":17,"tag":84,"props":325241,"children":325242},{},[325243],{"type":23,"value":325244},"Our unified models make data consistent, clean, and AI-ready",{"type":17,"tag":84,"props":325246,"children":325247},{},[325248],{"type":23,"value":325249},"We evolve quickly based on real use cases from the teams building on us",{"type":17,"tag":29,"props":325251,"children":325252},{},[325253],{"type":23,"value":325254},"Here's what's new:",{"type":17,"tag":68,"props":325256,"children":325257},{"id":11629},[325258],{"type":23,"value":11632},{"type":17,"tag":29,"props":325260,"children":325261},{},[325262],{"type":23,"value":325263},"We added integrations across Payments, Accounting, HR & Directory, and ATS categories—making it even easier to unify your customers' operational data.",{"type":17,"tag":29,"props":325265,"children":325266},{},[325267,325276],{"type":17,"tag":133,"props":325268,"children":325271},{"href":325269,"rel":325270},"https://unified.to/integrations/brex",[214],[325272],{"type":17,"tag":48,"props":325273,"children":325274},{},[325275],{"type":23,"value":37083},{"type":23,"value":325277}," – Payment integration",{"type":17,"tag":29,"props":325279,"children":325280},{},[325281],{"type":23,"value":325282},"Use case: Sync spend, employees, and accounts for finance workflows",{"type":17,"tag":29,"props":325284,"children":325285},{},[325286,325295],{"type":17,"tag":133,"props":325287,"children":325290},{"href":325288,"rel":325289},"https://unified.to/integrations/freshbooks",[214],[325291],{"type":17,"tag":48,"props":325292,"children":325293},{},[325294],{"type":23,"value":322009},{"type":23,"value":325296}," – Accounting integration",{"type":17,"tag":29,"props":325298,"children":325299},{},[325300],{"type":23,"value":325301},"Use case: Automate invoice sync and employee data access",{"type":17,"tag":29,"props":325303,"children":325304},{},[325305,325314],{"type":17,"tag":133,"props":325306,"children":325309},{"href":325307,"rel":325308},"https://unified.to/integrations/pennylane",[214],[325310],{"type":17,"tag":48,"props":325311,"children":325312},{},[325313],{"type":23,"value":322019},{"type":23,"value":325296},{"type":17,"tag":29,"props":325316,"children":325317},{},[325318],{"type":23,"value":325319},"Use case: Link e-commerce platforms to real-time accounting data",{"type":17,"tag":29,"props":325321,"children":325322},{},[325323,325332],{"type":17,"tag":133,"props":325324,"children":325327},{"href":325325,"rel":325326},"https://unified.to/integrations/oracletaleo",[214],[325328],{"type":17,"tag":48,"props":325329,"children":325330},{},[325331],{"type":23,"value":56497},{"type":23,"value":325333}," – New ATS integration",{"type":17,"tag":29,"props":325335,"children":325336},{},[325337,325346],{"type":17,"tag":133,"props":325338,"children":325341},{"href":325339,"rel":325340},"https://unified.to/integrations/pinpoint",[214],[325342],{"type":17,"tag":48,"props":325343,"children":325344},{},[325345],{"type":23,"value":56624},{"type":23,"value":325333},{"type":17,"tag":29,"props":325348,"children":325349},{},[325350,325360],{"type":17,"tag":133,"props":325351,"children":325354},{"href":325352,"rel":325353},"https://unified.to/integrations/sympa",[214],[325355],{"type":17,"tag":48,"props":325356,"children":325357},{},[325358],{"type":23,"value":325359},"Sympa",{"type":23,"value":325361}," – New HR & Directory integration",{"type":17,"tag":29,"props":325363,"children":325364},{},[325365],{"type":17,"tag":133,"props":325366,"children":325368},{"href":87026,"rel":325367},[214],[325369],{"type":23,"value":319573},{"type":17,"tag":68,"props":325371,"children":325373},{"id":325372},"database-sync-is-now-live",[325374],{"type":23,"value":325375},"Database Sync is now live",{"type":17,"tag":29,"props":325377,"children":325378},{},[325379],{"type":17,"tag":6438,"props":325380,"children":325383},{"alt":325381,"src":325382},"Screen_Shot_2025-03-31_at_4.23.16_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/march_2025_product_updates-1.png",[],{"type":17,"tag":29,"props":325385,"children":325386},{},[325387],{"type":23,"value":325388},"We've launched Database Sync — a direct, real-time delivery mechanism to add normalized data from Unified.to into your own database.",{"type":17,"tag":29,"props":325390,"children":325391},{},[325392],{"type":23,"value":325393},"No ETL scripts. No webhook wrangling. No infrastructure to maintain.",{"type":17,"tag":29,"props":325395,"children":325396},{},[325397],{"type":23,"value":325398},"What it does:",{"type":17,"tag":80,"props":325400,"children":325401},{},[325402,325407,325417,325422,325427],{"type":17,"tag":84,"props":325403,"children":325404},{},[325405],{"type":23,"value":325406},"Writes normalized data into your database (Postgres, MongoDB, MySQL, MSSQL, CockroachDB, MariaDB)",{"type":17,"tag":84,"props":325408,"children":325409},{},[325410,325412,325416],{"type":23,"value":325411},"Supports native and [virtual ",{"type":17,"tag":133,"props":325413,"children":325414},{"href":4999},[325415],{"type":23,"value":5002},{"type":23,"value":88175},{"type":17,"tag":84,"props":325418,"children":325419},{},[325420],{"type":23,"value":325421},"Auto-generates schemas and handles nested data",{"type":17,"tag":84,"props":325423,"children":325424},{},[325425],{"type":23,"value":325426},"Powers downstream workflows like AI agents, analytics, and customer-facing dashboards",{"type":17,"tag":84,"props":325428,"children":325429},{},[325430],{"type":23,"value":325431},"Available now on Grow and Scale plans, and included in all 30-day free trials.",{"type":17,"tag":68,"props":325433,"children":325435},{"id":325434},"virtual-webhooks-expansion",[325436],{"type":23,"value":325437},"Virtual webhooks expansion",{"type":17,"tag":29,"props":325439,"children":325440},{},[325441,325443,325449],{"type":23,"value":325442},"We've expanded ",{"type":17,"tag":133,"props":325444,"children":325446},{"href":46568,"rel":325445},[214],[325447],{"type":23,"value":325448},"virtual and native webhook ",{"type":23,"value":325450},"coverage across CRM, messaging, and HR platforms:",{"type":17,"tag":80,"props":325452,"children":325453},{},[325454,325459,325464],{"type":17,"tag":84,"props":325455,"children":325456},{},[325457],{"type":23,"value":325458},"Microsoft Dynamics 365 Sales: Contact, Deal, Lead, Company, Event",{"type":17,"tag":84,"props":325460,"children":325461},{},[325462],{"type":23,"value":325463},"JobAdder: Job, Event",{"type":17,"tag":84,"props":325465,"children":325466},{},[325467],{"type":23,"value":325468},"Zoom, Webex, Outlook, Teams: Full coverage for Event objects",{"type":17,"tag":29,"props":325470,"children":325471},{},[325472],{"type":23,"value":325473},"Use case: Power live updates for CRM dashboards, HR systems, and communication logs—no polling required.",{"type":17,"tag":68,"props":325475,"children":325477},{"id":325476},"expanded-metadata-model",[325478],{"type":23,"value":325479},"Expanded metadata model",{"type":17,"tag":29,"props":325481,"children":325482},{},[325483],{"type":23,"value":325484},"We extended metadata field support (also known as customer fields or additional properties) across more platforms and objects—making it easier to attach custom context to your records without schema changes.",{"type":17,"tag":29,"props":325486,"children":325487},{},[325488],{"type":23,"value":325489},"Now supported in:",{"type":17,"tag":80,"props":325491,"children":325492},{},[325493,325498,325503],{"type":17,"tag":84,"props":325494,"children":325495},{},[325496],{"type":23,"value":325497},"CRM: Salesforce, HubSpot",{"type":17,"tag":84,"props":325499,"children":325500},{},[325501],{"type":23,"value":325502},"ATS: Greenhouse, Jobvite, JobAdder, JobDiva",{"type":17,"tag":84,"props":325504,"children":325505},{},[325506],{"type":23,"value":325507},"Accounting: QuickBooks, Freshbooks, Zoho Books, Pennylane, Sage, Streamtime",{"type":17,"tag":68,"props":325509,"children":325511},{"id":325510},"pagination-query-optimizations",[325512],{"type":23,"value":325513},"Pagination & query optimizations",{"type":17,"tag":29,"props":325515,"children":325516},{},[325517],{"type":23,"value":325518},"We added slow_fields, updated_gte, and query support across more platforms and objects to enable better filtering and more efficient syncs:",{"type":17,"tag":80,"props":325520,"children":325521},{},[325522,325527,325538],{"type":17,"tag":84,"props":325523,"children":325524},{},[325525],{"type":23,"value":325526},"JobAdder & HubSpot: Now support slow_fields on all major objects",{"type":17,"tag":84,"props":325528,"children":325529},{},[325530,325532,325536],{"type":23,"value":325531},"Microsoft Dynamics 365 Sales: Query + ",{"type":17,"tag":133,"props":325533,"children":325534},{"href":1857},[325535],{"type":23,"value":1860},{"type":23,"value":325537}," across all core objects",{"type":17,"tag":84,"props":325539,"children":325540},{},[325541],{"type":23,"value":325542},"Paylocity: Virtual webhooks, offsets, and limits for Employee and Payslip",{"type":17,"tag":68,"props":325544,"children":325546},{"id":325545},"expanded-field-support",[325547],{"type":23,"value":325548},"Expanded field support",{"type":17,"tag":29,"props":325550,"children":325551},{},[325552],{"type":23,"value":325553},"New readable and writable fields unlock deeper workflows and personalization.",{"type":17,"tag":29,"props":325555,"children":325556},{},[325557],{"type":17,"tag":48,"props":325558,"children":325559},{},[325560],{"type":23,"value":325561},"New readable fields",{"type":17,"tag":80,"props":325563,"children":325564},{},[325565,325570,325575,325580,325585],{"type":17,"tag":84,"props":325566,"children":325567},{},[325568],{"type":23,"value":325569},"Workday Candidate: skills, experiences, education, address",{"type":17,"tag":84,"props":325571,"children":325572},{},[325573],{"type":23,"value":325574},"Salesforce Company: websites, timezone, industry, employees, description",{"type":17,"tag":84,"props":325576,"children":325577},{},[325578],{"type":23,"value":325579},"Zoom Employee: timezone, language_locale, department",{"type":17,"tag":84,"props":325581,"children":325582},{},[325583],{"type":23,"value":325584},"CRM & ATS: metadata now available in Greenhouse, Jobvite, JobAdder, Crelate, HubSpot, Zoho Recruit",{"type":17,"tag":84,"props":325586,"children":325587},{},[325588],{"type":23,"value":325589},"Accounting: posted_at for invoices and journals across QuickBooks, Freshbooks, Sage, Pennylane, and more",{"type":17,"tag":29,"props":325591,"children":325592},{},[325593],{"type":17,"tag":48,"props":325594,"children":325595},{},[325596],{"type":23,"value":325597},"New writable fields",{"type":17,"tag":80,"props":325599,"children":325600},{},[325601,325606,325611,325616,325621],{"type":17,"tag":84,"props":325602,"children":325603},{},[325604],{"type":23,"value":325605},"Ashby Application: source, original_status",{"type":17,"tag":84,"props":325607,"children":325608},{},[325609],{"type":23,"value":325610},"Zoho Recruit Candidate: user_id, link_urls",{"type":17,"tag":84,"props":325612,"children":325613},{},[325614],{"type":23,"value":325615},"Salesforce Company: user_id, telephones, name, emails, address",{"type":17,"tag":84,"props":325617,"children":325618},{},[325619],{"type":23,"value":325620},"Microsoft D365 Event: user_id, task, marketing_email, call",{"type":17,"tag":84,"props":325622,"children":325623},{},[325624],{"type":23,"value":325625},"Gmail Message: channel_id",{"type":17,"tag":29,"props":325627,"children":325628},{},[325629],{"type":17,"tag":48,"props":325630,"children":325631},{},[325632],{"type":23,"value":325633},"New API methods",{"type":17,"tag":29,"props":325635,"children":325636},{},[325637],{"type":23,"value":325638},"We've expanded full CRUD coverage across more objects so you can build end-to-end integrations with fewer limitations.",{"type":17,"tag":80,"props":325640,"children":325641},{},[325642,325647,325652,325657,325662,325667,325672,325677],{"type":17,"tag":84,"props":325643,"children":325644},{},[325645],{"type":23,"value":325646},"Microsoft Outlook Message: update, remove",{"type":17,"tag":84,"props":325648,"children":325649},{},[325650],{"type":23,"value":325651},"Gmail Message: update",{"type":17,"tag":84,"props":325653,"children":325654},{},[325655],{"type":23,"value":325656},"Ashby Application: update",{"type":17,"tag":84,"props":325658,"children":325659},{},[325660],{"type":23,"value":325661},"Jobvite Application: create",{"type":17,"tag":84,"props":325663,"children":325664},{},[325665],{"type":23,"value":325666},"Jobvite Document: list, get, create, update",{"type":17,"tag":84,"props":325668,"children":325669},{},[325670],{"type":23,"value":325671},"Jobvite Activity: list, get, create, update, remove",{"type":17,"tag":84,"props":325673,"children":325674},{},[325675],{"type":23,"value":325676},"MYOB: Full CRUD for Order, Invoice, Journal, Account, Transaction, Contact",{"type":17,"tag":84,"props":325678,"children":325679},{},[325680],{"type":23,"value":325681},"Freshbooks: Full CRUD for Invoice, Contact, Account, Employee, Journal",{"type":17,"tag":29,"props":325683,"children":325684},{},[325685],{"type":23,"value":325686},"That's it for March! Whether you're syncing invoices, powering AI workflows, or triggering CRM automations in real time, Unified.to keeps your data moving — clean, structured, and ready for whatever you're building next.",{"type":17,"tag":29,"props":325688,"children":325689},{},[325690],{"type":17,"tag":133,"props":325691,"children":325693},{"href":1612,"rel":325692},[214],[325694],{"type":23,"value":300863},{"type":17,"tag":29,"props":325696,"children":325697},{},[325698],{"type":17,"tag":133,"props":325699,"children":325701},{"href":215330,"rel":325700},[214],[325702],{"type":23,"value":7737},{"title":7,"searchDepth":1629,"depth":1629,"links":325704},[325705,325706,325707,325708,325709,325710],{"id":11629,"depth":1629,"text":11632},{"id":325372,"depth":1629,"text":325375},{"id":325434,"depth":1629,"text":325437},{"id":325476,"depth":1629,"text":325479},{"id":325510,"depth":1629,"text":325513},{"id":325545,"depth":1629,"text":325548},"content:blog:march_2025_product_updates.md","blog/march_2025_product_updates.md","blog/march_2025_product_updates",{"_path":325715,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":325716,"description":325717,"img":325718,"date":325719,"tag":6341,"body":325720,"_type":1677,"_id":326070,"_source":1679,"_file":326071,"_stem":326072,"_extension":1682},"/blog/building_ai_applications_with_unified_and_langbase","Building AI applications with Unified and Langbase","Developers building AI applications for their customers face a common challenge, they need to juggle many different APIs and authorization flows, configure and...","https://s3.us-east-2.amazonaws.com/unified-article-images/building_ai_applications_with_unified_and_langbase-icon.png","2025-02-27T00:00:00.000Z",{"type":14,"children":325721,"toc":326064},[325722,325727,325730,325738,325746,325751,325765,325771,325776,325838,325844,325849,325857,325871,325876,325889,325901,325909,325930,325935,325943,325948,325956,325974,325979,325984,326025,326031,326036,326059],{"type":17,"tag":18,"props":325723,"children":325725},{"id":325724},"building-ai-applications-with-unified-and-langbase",[325726],{"type":23,"value":325716},{"type":17,"tag":25,"props":325728,"children":325729},{},[],{"type":17,"tag":29,"props":325731,"children":325732},{},[325733],{"type":17,"tag":33,"props":325734,"children":325735},{},[325736],{"type":23,"value":325737},"February 27, 2025",{"type":17,"tag":29,"props":325739,"children":325740},{},[325741],{"type":17,"tag":6438,"props":325742,"children":325745},{"alt":325743,"src":325744},"unified_langbase_2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/building_ai_applications_with_unified_and_langbase-0.png",[],{"type":17,"tag":29,"props":325747,"children":325748},{},[325749],{"type":23,"value":325750},"Developers building AI applications for their customers face a common challenge: they need to juggle many different APIs and authorization flows, configure and manage multiple data pipelines, and deal with complex data models. What if you could focus on building amazing AI experiences without getting bogged down by all that complexity?",{"type":17,"tag":29,"props":325752,"children":325753},{},[325754,325756,325763],{"type":23,"value":325755},"That's where the power of Unified.to's APIs combined with ",{"type":17,"tag":133,"props":325757,"children":325760},{"href":325758,"rel":325759},"http://langbase.com/",[214],[325761],{"type":23,"value":325762},"Langbase's",{"type":23,"value":325764}," serverless AI developer platform comes in. In this article, we'll look at how you can leverage these platforms to build sophisticated AI applications using your customers' data while writing significantly less integration and AI boilerplate code.",{"type":17,"tag":68,"props":325766,"children":325768},{"id":325767},"why-use-unifiedto-with-langbase",[325769],{"type":23,"value":325770},"Why use Unified.to with Langbase?",{"type":17,"tag":29,"props":325772,"children":325773},{},[325774],{"type":23,"value":325775},"When you pair Unified.to's normalized data access with Langbase's AI capabilities, you get:",{"type":17,"tag":80,"props":325777,"children":325778},{},[325779,325802,325812,325828],{"type":17,"tag":84,"props":325780,"children":325781},{},[325782,325787,325789,325794,325796,325800],{"type":17,"tag":48,"props":325783,"children":325784},{},[325785],{"type":23,"value":325786},"One API, many integrations:",{"type":23,"value":325788}," Instead of building separate integrations for each platform, use ",{"type":17,"tag":133,"props":325790,"children":325792},{"href":42620,"rel":325791},[214],[325793],{"type":23,"value":217},{"type":23,"value":325795},"'s unified APIs to access normalized data from multiple data sources through a single, ",{"type":17,"tag":133,"props":325797,"children":325798},{"href":7691},[325799],{"type":23,"value":7459},{"type":23,"value":325801},". Langbase does the same for AI—with multi-agent orchestration and advanced long-term memory, seamlessly integrating AI capabilities. It supports 250+ LLMs through one API, ensuring a unified developer experience with easy model switching and optimization. It's an API-first platform, with simple Pipe and Memory Agent APIs for effortless integration.",{"type":17,"tag":84,"props":325803,"children":325804},{},[325805,325810],{"type":17,"tag":48,"props":325806,"children":325807},{},[325808],{"type":23,"value":325809},"Unified authorization:",{"type":23,"value":325811}," Seamlessly handle authorization with Unified.to's pre-built components, creating a secure link between your app and your customers' data with just a few lines of code.",{"type":17,"tag":84,"props":325813,"children":325814},{},[325815,325820,325822,325826],{"type":17,"tag":48,"props":325816,"children":325817},{},[325818],{"type":23,"value":325819},"Production-ready AI:",{"type":23,"value":325821}," Langbase Pipes and Memory Agents (serverless ",{"type":17,"tag":133,"props":325823,"children":325824},{"href":5201},[325825],{"type":23,"value":5204},{"type":23,"value":325827}," agents with long-term memory) eliminate infrastructure management, making scaling and deployment seamless for all developers—not just AI/ML experts. Its composable AI infrastructure lets developers chain multiple models into AI pipelines, optimizing cost, performance, and personalization at every step.",{"type":17,"tag":84,"props":325829,"children":325830},{},[325831,325836],{"type":17,"tag":48,"props":325832,"children":325833},{},[325834],{"type":23,"value":325835},"Real-time updates:",{"type":23,"value":325837}," Build dynamic applications using Unified.to's webhook system. Fine-tine AI models on the fly when your customers have new data, allowing your AI agent to provide more relevant responses.",{"type":17,"tag":68,"props":325839,"children":325841},{"id":325840},"real-world-applications-you-can-build",[325842],{"type":23,"value":325843},"Real-world applications you can build",{"type":17,"tag":29,"props":325845,"children":325846},{},[325847],{"type":23,"value":325848},"Let's look at some practical applications you can create by combining these platforms.",{"type":17,"tag":29,"props":325850,"children":325851},{},[325852],{"type":17,"tag":48,"props":325853,"children":325854},{},[325855],{"type":23,"value":325856},"Intelligent support bots",{"type":17,"tag":29,"props":325858,"children":325859},{},[325860,325862,325869],{"type":23,"value":325861},"Build an AI-powered support bot that can answer questions using your customer's knowledge base, handle real-time inquiries, and maintain context across conversations. By combining Unified.to's KMS (Knowledge Management System) and messaging APIs with ",{"type":17,"tag":133,"props":325863,"children":325866},{"href":325864,"rel":325865},"https://langbase.com/docs/memory",[214],[325867],{"type":23,"value":325868},"Langbase's Memory Agents",{"type":23,"value":325870}," , you can create a bot that gets smarter as your knowledge base grows.",{"type":17,"tag":29,"props":325872,"children":325873},{},[325874],{"type":23,"value":325875},"The best part? Since you're using unified APIs, you can easily adapt this pattern for different platforms:",{"type":17,"tag":80,"props":325877,"children":325878},{},[325879,325884],{"type":17,"tag":84,"props":325880,"children":325881},{},[325882],{"type":23,"value":325883},"Use Notion, Confluence or other KMS platforms for your knowledge base",{"type":17,"tag":84,"props":325885,"children":325886},{},[325887],{"type":23,"value":325888},"Deploy your bot on Slack instead of Discord",{"type":17,"tag":29,"props":325890,"children":325891},{},[325892,325894],{"type":23,"value":325893},"Want to build your own? Check out our step-by-step ",{"type":17,"tag":133,"props":325895,"children":325898},{"href":325896,"rel":325897},"https://docs.unified.to/guides/how_to_build_a_discord_support_bot_with_unified_and_langbase#how-to-build-a-discord-support-bot-with-unifiedto-and-langbase",[214],[325899],{"type":23,"value":325900},"guide on building a Discord support bot.",{"type":17,"tag":29,"props":325902,"children":325903},{},[325904],{"type":17,"tag":48,"props":325905,"children":325906},{},[325907],{"type":23,"value":325908},"AI-powered recruitment assistant",{"type":17,"tag":29,"props":325910,"children":325911},{},[325912,325914,325919,325921,325928],{"type":23,"value":325913},"Create an intelligent recruiting assistant that streamlines your hiring process by automatically screening candidates, conducting initial interviews, updating candidates' application statuses, and providing detailed summaries to your hiring team. Using Unified.to's ",{"type":17,"tag":133,"props":325915,"children":325917},{"href":56812,"rel":325916},[214],[325918],{"type":23,"value":298263},{"type":23,"value":325920}," and Langbase ",{"type":17,"tag":133,"props":325922,"children":325925},{"href":325923,"rel":325924},"https://langbase.com/docs/pipe/quickstart",[214],[325926],{"type":23,"value":325927},"Pipe agents",{"type":23,"value":325929},", your assistant can handle the time-consuming parts of recruitment while maintaining a personal touch.",{"type":17,"tag":29,"props":325931,"children":325932},{},[325933],{"type":23,"value":325934},"The unified approach means you can support multiple ATS platforms (Lever, Greenhouse, Workday, etc.) without rewriting your core logic.",{"type":17,"tag":29,"props":325936,"children":325937},{},[325938],{"type":17,"tag":48,"props":325939,"children":325940},{},[325941],{"type":23,"value":325942},"Enhanced email agents",{"type":17,"tag":29,"props":325944,"children":325945},{},[325946],{"type":23,"value":325947},"With Unified.to and Langbase, you can automate email responses and streamline communication. By combining Unified.to's email integrations with Langbase's composable multi-agent architecture, you can build an AI-powered email workflow that enhances efficiency and personalization.",{"type":17,"tag":29,"props":325949,"children":325950},{},[325951],{"type":17,"tag":48,"props":325952,"children":325953},{},[325954],{"type":23,"value":325955},"Intelligent sales assistant",{"type":17,"tag":29,"props":325957,"children":325958},{},[325959,325961,325966,325968,325972],{"type":23,"value":325960},"Supercharge your sales team with an AI assistant that understands your customer relationships, helps qualify leads, and generates personalized follow-ups based on past interactions. Using Unified.to's CRM integrations with ",{"type":17,"tag":133,"props":325962,"children":325964},{"href":325864,"rel":325963},[214],[325965],{"type":23,"value":325868},{"type":23,"value":325967}," (that dynamically attach private data to any LLM at scale, with industry-leading accuracy in advanced agentic routing and intelligent reranking), you can create an assistant that becomes an invaluable part of your sales process. Create leads and deals in your CRM automatically and tap into Unified.to's ",{"type":17,"tag":133,"props":325969,"children":325970},{"href":49533},[325971],{"type":23,"value":191093},{"type":23,"value":325973}," to add extra contextual data for the Memory Agent.",{"type":17,"tag":68,"props":325975,"children":325976},{"id":182698},[325977],{"type":23,"value":325978},"Getting started",{"type":17,"tag":29,"props":325980,"children":325981},{},[325982],{"type":23,"value":325983},"Ready to start building? Here's how to get going:",{"type":17,"tag":6154,"props":325985,"children":325986},{},[325987,326006,326020],{"type":17,"tag":84,"props":325988,"children":325989},{},[325990,325992,325997,325999],{"type":23,"value":325991},"Sign up for accounts on ",{"type":17,"tag":133,"props":325993,"children":325995},{"href":212,"rel":325994},[214],[325996],{"type":23,"value":217},{"type":23,"value":325998}," and",{"type":17,"tag":133,"props":326000,"children":326003},{"href":326001,"rel":326002},"https://langbase.com/",[214],[326004],{"type":23,"value":326005}," Langbase",{"type":17,"tag":84,"props":326007,"children":326008},{},[326009,326011,326018],{"type":23,"value":326010},"Join our ",{"type":17,"tag":133,"props":326012,"children":326015},{"href":326013,"rel":326014},"https://discord.gg/85z7HF7JbD",[214],[326016],{"type":23,"value":326017},"Discord community",{"type":23,"value":326019}," to connect with other developers",{"type":17,"tag":84,"props":326021,"children":326022},{},[326023],{"type":23,"value":326024},"Keep an eye on our blog for upcoming guides in this series",{"type":17,"tag":68,"props":326026,"children":326028},{"id":326027},"looking-ahead",[326029],{"type":23,"value":326030},"Looking ahead",{"type":17,"tag":29,"props":326032,"children":326033},{},[326034],{"type":23,"value":326035},"The combination of Unified.to and Langbase opens up exciting possibilities for AI application development. As both platforms continue to evolve, you can expect:",{"type":17,"tag":80,"props":326037,"children":326038},{},[326039,326044,326049,326054],{"type":17,"tag":84,"props":326040,"children":326041},{},[326042],{"type":23,"value":326043},"More supported platforms and integrations",{"type":17,"tag":84,"props":326045,"children":326046},{},[326047],{"type":23,"value":326048},"Enhanced AI capabilities through Langbase's Memory Agents",{"type":17,"tag":84,"props":326050,"children":326051},{},[326052],{"type":23,"value":326053},"New unified APIs for different use cases",{"type":17,"tag":84,"props":326055,"children":326056},{},[326057],{"type":23,"value":326058},"Expanded tutorials and example applications",{"type":17,"tag":29,"props":326060,"children":326061},{},[326062],{"type":23,"value":326063},"Stay tuned for our upcoming tutorials that will dive deep into each use case, providing concrete examples and code you can use in your own applications.",{"title":7,"searchDepth":1629,"depth":1629,"links":326065},[326066,326067,326068,326069],{"id":325767,"depth":1629,"text":325770},{"id":325840,"depth":1629,"text":325843},{"id":182698,"depth":1629,"text":325978},{"id":326027,"depth":1629,"text":326030},"content:blog:building_ai_applications_with_unified_and_langbase.md","blog/building_ai_applications_with_unified_and_langbase.md","blog/building_ai_applications_with_unified_and_langbase",{"_path":326074,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":326075,"description":326076,"img":326077,"date":325719,"tag":12,"body":326078,"_type":1677,"_id":326677,"_source":1679,"_file":326678,"_stem":326679,"_extension":1682},"/blog/february_2025_product_updates","February 2025 product updates","Building integrations shouldn't slow you down. Whether you're syncing customer data, automating workflows, or powering AI-driven applications, Unified.to...","https://s3.us-east-2.amazonaws.com/unified-article-images/february_2025_product_updates-icon.png",{"type":14,"children":326079,"toc":326668},[326080,326085,326088,326095,326103,326108,326119,326124,326128,326132,326137,326146,326151,326161,326166,326175,326180,326188,326192,326203,326212,326217,326226,326231,326241,326247,326252,326257,326265,326286,326294,326299,326303,326308,326356,326360,326365,326372,326390,326397,326425,326430,326435,326562,326568,326573,326578,326586,326629,326639,326644],{"type":17,"tag":18,"props":326081,"children":326083},{"id":326082},"february-2025-product-updates",[326084],{"type":23,"value":326075},{"type":17,"tag":25,"props":326086,"children":326087},{},[],{"type":17,"tag":29,"props":326089,"children":326090},{},[326091],{"type":17,"tag":33,"props":326092,"children":326093},{},[326094],{"type":23,"value":325737},{"type":17,"tag":29,"props":326096,"children":326097},{},[326098],{"type":17,"tag":6438,"props":326099,"children":326102},{"alt":326100,"src":326101},"product_update_feb.png","https://s3.us-east-2.amazonaws.com/unified-article-images/february_2025_product_updates-0.png",[],{"type":17,"tag":29,"props":326104,"children":326105},{},[326106],{"type":23,"value":326107},"Building integrations shouldn't slow you down. Whether you're syncing customer data, automating workflows, or powering AI-driven applications, Unified.to eliminates complexity so you can ship faster.",{"type":17,"tag":29,"props":326109,"children":326110},{},[326111,326113,326117],{"type":23,"value":326112},"This month, we're rolling out new CRM, ATS, HR & Directory, and Task Management integrations, expanded webhook and ",{"type":17,"tag":133,"props":326114,"children":326115},{"href":1857},[326116],{"type":23,"value":1860},{"type":23,"value":326118}," support, and a new partnership with Langbase—giving AI applications real-time access to structured customer data.",{"type":17,"tag":29,"props":326120,"children":326121},{},[326122],{"type":23,"value":326123},"We're also launching a major expansion of our unified candidate data model, bringing skills, experiences, and education data to every major ATS and HR platform—instantly, across all integrations.",{"type":17,"tag":29,"props":326125,"children":326126},{},[326127],{"type":23,"value":325254},{"type":17,"tag":68,"props":326129,"children":326130},{"id":11629},[326131],{"type":23,"value":11632},{"type":17,"tag":29,"props":326133,"children":326134},{},[326135],{"type":23,"value":326136},"We've expanded integration coverage across CRM, ATS, HR & Directory, and Task Management, simplifying how teams connect critical business data.",{"type":17,"tag":29,"props":326138,"children":326139},{},[326140,326144],{"type":17,"tag":48,"props":326141,"children":326142},{},[326143],{"type":23,"value":13060},{"type":23,"value":326145}," – A CRM/ATS integration for talent management",{"type":17,"tag":29,"props":326147,"children":326148},{},[326149],{"type":23,"value":326150},"Use case: Automate candidate tracking, sync CRM records, and enrich recruitment workflows",{"type":17,"tag":29,"props":326152,"children":326153},{},[326154,326159],{"type":17,"tag":48,"props":326155,"children":326156},{},[326157],{"type":23,"value":326158},"Clear Company",{"type":23,"value":326160}," – Supports HR & Directory and ATS operations",{"type":17,"tag":29,"props":326162,"children":326163},{},[326164],{"type":23,"value":326165},"Use case: Sync employee records across HR tools to streamline onboarding and compliance",{"type":17,"tag":29,"props":326167,"children":326168},{},[326169,326173],{"type":17,"tag":48,"props":326170,"children":326171},{},[326172],{"type":23,"value":12990},{"type":23,"value":326174}," – A Task Management integration",{"type":17,"tag":29,"props":326176,"children":326177},{},[326178],{"type":23,"value":326179},"Use case: Automate task assignments by integrating employee directories with project workflows",{"type":17,"tag":29,"props":326181,"children":326182},{},[326183],{"type":17,"tag":133,"props":326184,"children":326186},{"href":87026,"rel":326185},[214],[326187],{"type":23,"value":310084},{"type":17,"tag":68,"props":326189,"children":326190},{"id":325434},[326191],{"type":23,"value":325437},{"type":17,"tag":29,"props":326193,"children":326194},{},[326195,326197,326201],{"type":23,"value":326196},"Unified.to's [virtual ",{"type":17,"tag":133,"props":326198,"children":326199},{"href":4999},[326200],{"type":23,"value":5002},{"type":23,"value":326202},"](/blog/unlock_real_time_data_with_virtual_webhooks) deliver real-time updates—even for platforms that don't offer native webhook support.",{"type":17,"tag":29,"props":326204,"children":326205},{},[326206,326210],{"type":17,"tag":48,"props":326207,"children":326208},{},[326209],{"type":23,"value":13320},{"type":23,"value":326211},": Added created and updated virtual webhooks for the Repository object",{"type":17,"tag":29,"props":326213,"children":326214},{},[326215],{"type":23,"value":326216},"Use case: Trigger automated deployments, sync repository changes, and notify teams when a repo is updated",{"type":17,"tag":29,"props":326218,"children":326219},{},[326220,326224],{"type":17,"tag":48,"props":326221,"children":326222},{},[326223],{"type":23,"value":56614},{"type":23,"value":326225},": Added created and updated virtual webhooks for the Activity object",{"type":17,"tag":29,"props":326227,"children":326228},{},[326229],{"type":23,"value":326230},"Use case: Automate candidate engagement workflows based on new activities",{"type":17,"tag":29,"props":326232,"children":326233},{},[326234],{"type":17,"tag":133,"props":326235,"children":326238},{"href":326236,"rel":326237},"https://docs.unified.to/concepts/virtual_webhooks",[214],[326239],{"type":23,"value":326240},"Learn about virtual webhooks →",{"type":17,"tag":68,"props":326242,"children":326244},{"id":326243},"expanded-our-unified-candidate-model",[326245],{"type":23,"value":326246},"Expanded our unified candidate model",{"type":17,"tag":29,"props":326248,"children":326249},{},[326250],{"type":23,"value":326251},"One of the key advantages of Unified.to's next-generation architecture is that we don't just expand integrations one at a time—we scale across entire categories. This month, we've rolled out candidate profile enhancements for multiple ATS and HR platforms, ensuring structured, enriched candidate data is available to any application using Unified.to.",{"type":17,"tag":29,"props":326253,"children":326254},{},[326255],{"type":23,"value":326256},"Instead of managing one-off API changes, our unified model propagates updates across every relevant integration.",{"type":17,"tag":29,"props":326258,"children":326259},{},[326260],{"type":17,"tag":48,"props":326261,"children":326262},{},[326263],{"type":23,"value":326264},"What's new?",{"type":17,"tag":80,"props":326266,"children":326267},{},[326268],{"type":17,"tag":84,"props":326269,"children":326270},{},[326271,326273],{"type":23,"value":326272},"Richer candidate data across ATS and HR platforms\n",{"type":17,"tag":80,"props":326274,"children":326275},{},[326276,326281],{"type":17,"tag":84,"props":326277,"children":326278},{},[326279],{"type":23,"value":326280},"New readable fields: skills, experiences, education",{"type":17,"tag":84,"props":326282,"children":326283},{},[326284],{"type":23,"value":326285},"Now supported in: Vincere, SAP SuccessFactors, Loxo, Bullhorn, Workable, UKG Pro, Phenom, JobScore, Greenhouse, Gem, CATS, BreezyHR",{"type":17,"tag":29,"props":326287,"children":326288},{},[326289],{"type":17,"tag":48,"props":326290,"children":326291},{},[326292],{"type":23,"value":326293},"Why this matters?",{"type":17,"tag":29,"props":326295,"children":326296},{},[326297],{"type":23,"value":326298},"Integrations with ATS platforms now get richer insights instantly. No per-platform updates required—just cleaner, more structured data out of the box.",{"type":17,"tag":68,"props":326300,"children":326301},{"id":325510},[326302],{"type":23,"value":325513},{"type":17,"tag":29,"props":326304,"children":326305},{},[326306],{"type":23,"value":326307},"New pagination and filtering options improve data retrieval, making queries more efficient and reducing response times.",{"type":17,"tag":80,"props":326309,"children":326310},{},[326311,326326,326336,326346],{"type":17,"tag":84,"props":326312,"children":326313},{},[326314,326319,326321,326325],{"type":17,"tag":48,"props":326315,"children":326316},{},[326317],{"type":23,"value":326318},"Gmail & Microsoft Outlook",{"type":23,"value":326320},": Added start_gte and end_le pagination for ",{"type":17,"tag":48,"props":326322,"children":326323},{},[326324],{"type":23,"value":15800},{"type":23,"value":200606},{"type":17,"tag":84,"props":326327,"children":326328},{},[326329,326334],{"type":17,"tag":48,"props":326330,"children":326331},{},[326332],{"type":23,"value":326333},"GitLab Repository",{"type":23,"value":326335},": Added updated_gte, query, sort_by_name, sort_by_created_at, sort_by_updated_at, order, limit, and virtual_webhook_limit support",{"type":17,"tag":84,"props":326337,"children":326338},{},[326339,326344],{"type":17,"tag":48,"props":326340,"children":326341},{},[326342],{"type":23,"value":326343},"Loxo Document",{"type":23,"value":326345},": Added candidate_id pagination support",{"type":17,"tag":84,"props":326347,"children":326348},{},[326349,326354],{"type":17,"tag":48,"props":326350,"children":326351},{},[326352],{"type":23,"value":326353},"Zendesk Employee & Customer",{"type":23,"value":326355},": Added virtual_webhook_limit pagination support",{"type":17,"tag":68,"props":326357,"children":326358},{"id":325545},[326359],{"type":23,"value":325548},{"type":17,"tag":29,"props":326361,"children":326362},{},[326363],{"type":23,"value":326364},"New readable and writable fields unlock richer queries, automation, and real-time insights.",{"type":17,"tag":29,"props":326366,"children":326367},{},[326368],{"type":17,"tag":48,"props":326369,"children":326370},{},[326371],{"type":23,"value":325561},{"type":17,"tag":80,"props":326373,"children":326374},{},[326375,326380,326385],{"type":17,"tag":84,"props":326376,"children":326377},{},[326378],{"type":23,"value":326379},"iCIMS Application: status, source, job_id, candidate_id",{"type":17,"tag":84,"props":326381,"children":326382},{},[326383],{"type":23,"value":326384},"GitLab Repository: web_url, updated_at, owner, org_id, is_private, description, created_at",{"type":17,"tag":84,"props":326386,"children":326387},{},[326388],{"type":23,"value":326389},"Loxo, JobScore, JobAdder, Crelate Activity: document_ids",{"type":17,"tag":29,"props":326391,"children":326392},{},[326393],{"type":17,"tag":48,"props":326394,"children":326395},{},[326396],{"type":23,"value":325597},{"type":17,"tag":80,"props":326398,"children":326399},{},[326400,326405,326410,326415,326420],{"type":17,"tag":84,"props":326401,"children":326402},{},[326403],{"type":23,"value":326404},"iCIMS Job: groups",{"type":17,"tag":84,"props":326406,"children":326407},{},[326408],{"type":23,"value":326409},"Shopify Metadata: object_type, name, format",{"type":17,"tag":84,"props":326411,"children":326412},{},[326413],{"type":23,"value":326414},"Salsify Metadata: original_format, format",{"type":17,"tag":84,"props":326416,"children":326417},{},[326418],{"type":23,"value":326419},"Akeneo Metadata: original_format, format",{"type":17,"tag":84,"props":326421,"children":326422},{},[326423],{"type":23,"value":326424},"Recruiterflow Application: job_id, candidate_id",{"type":17,"tag":68,"props":326426,"children":326428},{"id":326427},"new-api-methods",[326429],{"type":23,"value":325633},{"type":17,"tag":29,"props":326431,"children":326432},{},[326433],{"type":23,"value":326434},"More granular control over data creation, retrieval, and updates across key integrations.",{"type":17,"tag":80,"props":326436,"children":326437},{},[326438,326448,326458,326468,326477,326487,326497,326506,326514,326524],{"type":17,"tag":84,"props":326439,"children":326440},{},[326441,326446],{"type":17,"tag":48,"props":326442,"children":326443},{},[326444],{"type":23,"value":326445},"iCIMS Application",{"type":23,"value":326447},": Added create, update, and remove methods",{"type":17,"tag":84,"props":326449,"children":326450},{},[326451,326456],{"type":17,"tag":48,"props":326452,"children":326453},{},[326454],{"type":23,"value":326455},"iCIMS Document",{"type":23,"value":326457},": Added list, get, update, and remove methods",{"type":17,"tag":84,"props":326459,"children":326460},{},[326461,326466],{"type":17,"tag":48,"props":326462,"children":326463},{},[326464],{"type":23,"value":326465},"iCIMS Activity",{"type":23,"value":326467},": Added list and get methods",{"type":17,"tag":84,"props":326469,"children":326470},{},[326471,326476],{"type":17,"tag":48,"props":326472,"children":326473},{},[326474],{"type":23,"value":326475},"GitLab Pullrequest",{"type":23,"value":326467},{"type":17,"tag":84,"props":326478,"children":326479},{},[326480,326485],{"type":17,"tag":48,"props":326481,"children":326482},{},[326483],{"type":23,"value":326484},"Pipedrive Pipeline",{"type":23,"value":326486},": Added list, get, create, update, and remove methods",{"type":17,"tag":84,"props":326488,"children":326489},{},[326490,326495],{"type":17,"tag":48,"props":326491,"children":326492},{},[326493],{"type":23,"value":326494},"Shopify Metadata",{"type":23,"value":326496},": Added create and update methods",{"type":17,"tag":84,"props":326498,"children":326499},{},[326500,326504],{"type":17,"tag":48,"props":326501,"children":326502},{},[326503],{"type":23,"value":326343},{"type":23,"value":326505},": Added get method",{"type":17,"tag":84,"props":326507,"children":326508},{},[326509],{"type":17,"tag":48,"props":326510,"children":326511},{},[326512],{"type":23,"value":326513},"Recruiterflow API Expansion",{"type":17,"tag":84,"props":326515,"children":326516},{},[326517,326522],{"type":17,"tag":48,"props":326518,"children":326519},{},[326520],{"type":23,"value":326521},"New objects added:",{"type":23,"value":326523}," Contact, Deal, Lead, Pipeline",{"type":17,"tag":84,"props":326525,"children":326526},{},[326527,326532],{"type":17,"tag":48,"props":326528,"children":326529},{},[326530],{"type":23,"value":326531},"Expanded API methods:",{"type":17,"tag":80,"props":326533,"children":326534},{},[326535,326544,326554],{"type":17,"tag":84,"props":326536,"children":326537},{},[326538,326542],{"type":17,"tag":48,"props":326539,"children":326540},{},[326541],{"type":23,"value":117242},{"type":23,"value":326543},": create",{"type":17,"tag":84,"props":326545,"children":326546},{},[326547,326552],{"type":17,"tag":48,"props":326548,"children":326549},{},[326550],{"type":23,"value":326551},"Contact, Deal, Lead",{"type":23,"value":326553},": list, get, create, update",{"type":17,"tag":84,"props":326555,"children":326556},{},[326557,326561],{"type":17,"tag":48,"props":326558,"children":326559},{},[326560],{"type":23,"value":62847},{"type":23,"value":98373},{"type":17,"tag":68,"props":326563,"children":326565},{"id":326564},"partnership-spotlight-unified-x-langbase",[326566],{"type":23,"value":326567},"Partnership spotlight: Unified x Langbase",{"type":17,"tag":29,"props":326569,"children":326570},{},[326571],{"type":23,"value":326572},"Building AI-powered applications means dealing with fragmented APIs, complex authorization flows, and multi-step data pipelines. Unified.to and Langbase solve this together.",{"type":17,"tag":29,"props":326574,"children":326575},{},[326576],{"type":23,"value":326577},"Unified.to provides real-time, structured customer data from hundreds of SaaS platforms via a single API. Langbase extends this with a serverless AI developer platform, offering multi-agent orchestration, long-term memory, and composable AI pipelines.",{"type":17,"tag":29,"props":326579,"children":326580},{},[326581],{"type":17,"tag":48,"props":326582,"children":326583},{},[326584],{"type":23,"value":326585},"Why Unified.to + Langbase?",{"type":17,"tag":80,"props":326587,"children":326588},{},[326589,326599,326609,326619],{"type":17,"tag":84,"props":326590,"children":326591},{},[326592,326597],{"type":17,"tag":48,"props":326593,"children":326594},{},[326595],{"type":23,"value":326596},"Unified data, simplified integration",{"type":23,"value":326598}," – Access normalized customer data from multiple platforms with Unified.to. Langbase applies the same principle to AI, supporting 250+ LLMs through a single API with built-in model switching, optimization, and orchestration.",{"type":17,"tag":84,"props":326600,"children":326601},{},[326602,326607],{"type":17,"tag":48,"props":326603,"children":326604},{},[326605],{"type":23,"value":326606},"Serverless AI pipeline",{"type":23,"value":326608},"s – Langbase Pipes and Memory Agents remove the complexity of infrastructure management, enabling scalable, production-ready AI without requiring deep AI/ML expertise.",{"type":17,"tag":84,"props":326610,"children":326611},{},[326612,326617],{"type":17,"tag":48,"props":326613,"children":326614},{},[326615],{"type":23,"value":326616},"Real-time AI updates",{"type":23,"value":326618}," – With Unified.to's virtual webhooks, Langbase fine-tunes AI models dynamically as customer data flows in, allowing AI applications to stay up to date.",{"type":17,"tag":84,"props":326620,"children":326621},{},[326622,326627],{"type":17,"tag":48,"props":326623,"children":326624},{},[326625],{"type":23,"value":326626},"Composability & automation",{"type":23,"value":326628}," – Chain multiple LLMs into personalized AI pipelines that optimize cost, performance, and retrieval accuracy.",{"type":17,"tag":29,"props":326630,"children":326631},{},[326632],{"type":17,"tag":133,"props":326633,"children":326636},{"href":326634,"rel":326635},"https://unified.to/blog/building_ai_applications_with_unified_and_langbase",[214],[326637],{"type":23,"value":326638},"Learn more ",{"type":17,"tag":29,"props":326640,"children":326641},{},[326642],{"type":23,"value":326643},"That's it for February!",{"type":17,"tag":29,"props":326645,"children":326646},{},[326647,326652,326654,326660,326661,326667],{"type":17,"tag":48,"props":326648,"children":326649},{},[326650],{"type":23,"value":326651},"Try Unified.to today:",{"type":23,"value":326653}," Build faster, integrate seamlessly, and power AI applications with real-time data. ",{"type":17,"tag":133,"props":326655,"children":326658},{"href":326656,"rel":326657},"https://app.unified.to/login?utm_source=feb_2025_update&utm_medium=blog&utm_campaign=feb2025_update_freetrial",[214],[326659],{"type":23,"value":215326},{"type":23,"value":75890},{"type":17,"tag":133,"props":326662,"children":326665},{"href":326663,"rel":326664},"https://unified.to/contact?utm_source=feb2025_update&utm_medium=blog&utm_campaign=feb2025_update_contact_page",[214],[326666],{"type":23,"value":226481},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":326669},[326670,326671,326672,326673,326674,326675,326676],{"id":11629,"depth":1629,"text":11632},{"id":325434,"depth":1629,"text":325437},{"id":326243,"depth":1629,"text":326246},{"id":325510,"depth":1629,"text":325513},{"id":325545,"depth":1629,"text":325548},{"id":326427,"depth":1629,"text":325633},{"id":326564,"depth":1629,"text":326567},"content:blog:february_2025_product_updates.md","blog/february_2025_product_updates.md","blog/february_2025_product_updates",{"_path":326681,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":326682,"description":326683,"img":326684,"date":325719,"tag":289978,"body":326685,"_type":1677,"_id":327144,"_source":1679,"_file":327145,"_stem":327146,"_extension":1682},"/blog/the_integration_strategy_that_tripled_myhub_enterprise_deals","The integration strategy that tripled MyHub's enterprise deals","Learn how MyHub, an enterprise employee intranet platform, leveraged Unified.to to rapidly scale to 60+ integrations, unlock larger deals, and strengthen its...","https://s3.us-east-2.amazonaws.com/unified-article-images/the_integration_strategy_that_tripled_myhub_enterprise_deals-icon.png",{"type":14,"children":326686,"toc":327136},[326687,326692,326695,326702,326740,326749,326758,326768,326778,326788,326803,326813,326821,326827,326837,326842,326847,326853,326858,326863,326868,326873,326879,326884,326897,326902,326910,326968,326974,326979,327022,327027,327033,327038,327081,327087,327092,327097],{"type":17,"tag":18,"props":326688,"children":326690},{"id":326689},"the-integration-strategy-that-tripled-myhubs-enterprise-deals",[326691],{"type":23,"value":326682},{"type":17,"tag":25,"props":326693,"children":326694},{},[],{"type":17,"tag":29,"props":326696,"children":326697},{},[326698],{"type":17,"tag":33,"props":326699,"children":326700},{},[326701],{"type":23,"value":325737},{"type":17,"tag":29,"props":326703,"children":326704},{},[326705,326709,326710,326720,326725,326726,326734,326735],{"type":17,"tag":33,"props":326706,"children":326707},{},[326708],{"type":23,"value":290012},{"type":23,"value":18757},{"type":17,"tag":133,"props":326711,"children":326714},{"href":326712,"rel":326713},"https://www.myhubintranet.com/",[214],[326715],{"type":17,"tag":33,"props":326716,"children":326717},{},[326718],{"type":23,"value":326719},"MyHub",{"type":17,"tag":33,"props":326721,"children":326722},{},[326723],{"type":23,"value":326724},", an enterprise employee intranet platform, leveraged",{"type":23,"value":18757},{"type":17,"tag":133,"props":326727,"children":326729},{"href":42620,"rel":326728},[214],[326730],{"type":17,"tag":33,"props":326731,"children":326732},{},[326733],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":33,"props":326736,"children":326737},{},[326738],{"type":23,"value":326739},"to rapidly scale to 60+ integrations, unlock larger deals, and strengthen its competitive positioning.",{"type":17,"tag":29,"props":326741,"children":326742},{},[326743,326747],{"type":17,"tag":48,"props":326744,"children":326745},{},[326746],{"type":23,"value":290057},{"type":23,"value":326748}," Enterprise Employee Intranet Platform",{"type":17,"tag":29,"props":326750,"children":326751},{},[326752,326756],{"type":17,"tag":48,"props":326753,"children":326754},{},[326755],{"type":23,"value":290067},{"type":23,"value":326757}," Seamless HR integrations for automated user management",{"type":17,"tag":29,"props":326759,"children":326760},{},[326761,326766],{"type":17,"tag":48,"props":326762,"children":326763},{},[326764],{"type":23,"value":326765},"Integrations Launched:",{"type":23,"value":326767}," 60+ live integrations",{"type":17,"tag":29,"props":326769,"children":326770},{},[326771,326776],{"type":17,"tag":48,"props":326772,"children":326773},{},[326774],{"type":23,"value":326775},"Time Savings:",{"type":23,"value":326777}," From single-integration timelines to 60 integrations in 3 months",{"type":17,"tag":29,"props":326779,"children":326780},{},[326781,326786],{"type":17,"tag":48,"props":326782,"children":326783},{},[326784],{"type":23,"value":326785},"Engineers Required:",{"type":23,"value":326787}," 1 engineer (part-time)",{"type":17,"tag":29,"props":326789,"children":326790},{},[326791,326796,326797,326801],{"type":17,"tag":48,"props":326792,"children":326793},{},[326794],{"type":23,"value":326795},"Features Highlighted:",{"type":23,"value":18757},{"type":17,"tag":133,"props":326798,"children":326799},{"href":7691},[326800],{"type":23,"value":7806},{"type":23,"value":326802},", authentication, simplified onboarding",{"type":17,"tag":29,"props":326804,"children":326805},{},[326806,326811],{"type":17,"tag":48,"props":326807,"children":326808},{},[326809],{"type":23,"value":326810},"Benefits Highlighted:",{"type":23,"value":326812}," Faster sales cycles, 3x ACV growth, reduced churn, enterprise positioning",{"type":17,"tag":29,"props":326814,"children":326815},{},[326816],{"type":17,"tag":6438,"props":326817,"children":326820},{"alt":326818,"src":326819},"myhub_quote.png","https://s3.us-east-2.amazonaws.com/unified-article-images/the_integration_strategy_that_tripled_myhub_enterprise_deals-0.png",[],{"type":17,"tag":68,"props":326822,"children":326824},{"id":326823},"unlocking-enterprise-growth-through-integrations",[326825],{"type":23,"value":326826},"Unlocking enterprise growth through integrations",{"type":17,"tag":29,"props":326828,"children":326829},{},[326830,326835],{"type":17,"tag":133,"props":326831,"children":326833},{"href":326712,"rel":326832},[214],[326834],{"type":23,"value":326719},{"type":23,"value":326836}," is redefining how enterprises manage internal communication and workforce operations. After establishing itself as a leader in the mid-market, MyHub aimed for larger enterprise clients. But enterprise buyers weren't just looking for a standalone intranet; they needed seamless integrations with their HR systems. Without them, MyHub was being disqualified from deals before conversations even started.",{"type":17,"tag":29,"props":326838,"children":326839},{},[326840],{"type":23,"value":326841},"Building direct integrations for every HR platform wasn't scalable. Microsoft and Google SSO alone took them three months to implement, and expanding to dozens of HR providers—each with its own API quirks and compliance requirements—would have required massive engineering bandwidth.",{"type":17,"tag":29,"props":326843,"children":326844},{},[326845],{"type":23,"value":326846},"To move fast and win enterprise deals, MyHub turned to Unified.to. In just three months, they rolled out 60+ integrations—an efficiency gain of 30x over their previous integration speed—all with just one engineer.",{"type":17,"tag":68,"props":326848,"children":326850},{"id":326849},"strengthening-competitive-positioning",[326851],{"type":23,"value":326852},"Strengthening competitive positioning",{"type":17,"tag":29,"props":326854,"children":326855},{},[326856],{"type":23,"value":326857},"MyHub built a strong reputation in the mid-market, but as they moved upmarket, they encountered competition from established enterprise solutions. To stay competitive, they needed a seamless integration strategy that could differentiate them from competitors offering similar features. Without a scalable integration strategy, MyHub risked losing deals to competitors with broader integrations.",{"type":17,"tag":29,"props":326859,"children":326860},{},[326861],{"type":23,"value":326862},"'Without robust integrations, we were being discounted right away. We needed a broader integration play to stay competitive.'",{"type":17,"tag":29,"props":326864,"children":326865},{},[326866],{"type":23,"value":326867},"— Steve Hockey, CEO, MyHub",{"type":17,"tag":29,"props":326869,"children":326870},{},[326871],{"type":23,"value":326872},"Yet, tackling integrations internally introduced significant hurdles—prolonged development cycles, high maintenance costs, and an ongoing strain on engineering resources that detracted from core innovation. Keeping up with constant API changes from platforms like Microsoft and Google made maintenance an ongoing burden.",{"type":17,"tag":68,"props":326874,"children":326876},{"id":326875},"a-secure-and-scalable-integration-partner",[326877],{"type":23,"value":326878},"A secure and scalable integration partner",{"type":17,"tag":29,"props":326880,"children":326881},{},[326882],{"type":23,"value":326883},"After evaluating multiple unified API providers, MyHub selected Unified.to for its unmatched speed, breadth, and security-first approach. Unlike competitors that felt slow and bureaucratic, Unified.to acted as a true partner, providing rapid feedback and support for new integrations.",{"type":17,"tag":29,"props":326885,"children":326886},{},[326887,326889,326895],{"type":23,"value":326888},"Security was also a critical factor in MyHub's decision. Given the sensitive nature of HR data—often containing large amounts of third-party PII—Unified.to's no-cache, no-storage approach ensured compliance with strict enterprise security and privacy requirements. Unlike other ",{"type":17,"tag":133,"props":326890,"children":326892},{"href":78603,"rel":326891},[214],[326893],{"type":23,"value":326894},"unified API or iPaaS solutions",{"type":23,"value":326896}," that store or cache data, Unified.to's model eliminates unnecessary risk, making it an ideal choice for handling sensitive HR integrations.",{"type":17,"tag":29,"props":326898,"children":326899},{},[326900],{"type":23,"value":326901},"\"Unified.to's no-cache policy was a key factor in our decision. Their security-first approach is now part of our security and data privacy pitch to clients, especially enterprise IT stakeholders.\"\n— Steve Hockey, CEO, MyHub",{"type":17,"tag":29,"props":326903,"children":326904},{},[326905],{"type":17,"tag":48,"props":326906,"children":326907},{},[326908],{"type":23,"value":326909},"Key differentiators",{"type":17,"tag":80,"props":326911,"children":326912},{},[326913,326922,326938,326948,326958],{"type":17,"tag":84,"props":326914,"children":326915},{},[326916,326920],{"type":17,"tag":48,"props":326917,"children":326918},{},[326919],{"type":23,"value":290204},{"type":23,"value":326921}," Launched 60 integrations in just three months",{"type":17,"tag":84,"props":326923,"children":326924},{},[326925,326930,326932,326936],{"type":17,"tag":48,"props":326926,"children":326927},{},[326928],{"type":23,"value":326929},"Breadth:",{"type":23,"value":326931}," Ability to expand beyond HR integrations, unlocking new markets, including Messenger API (Slack, Microsoft Teams) and ",{"type":17,"tag":133,"props":326933,"children":326934},{"href":28977},[326935],{"type":23,"value":72479},{"type":23,"value":326937}," categories",{"type":17,"tag":84,"props":326939,"children":326940},{},[326941,326946],{"type":17,"tag":48,"props":326942,"children":326943},{},[326944],{"type":23,"value":326945},"Security-First Approach:",{"type":23,"value":326947}," No caching or storage of third-party PII ensured compliance with enterprise security and privacy requirements.",{"type":17,"tag":84,"props":326949,"children":326950},{},[326951,326956],{"type":17,"tag":48,"props":326952,"children":326953},{},[326954],{"type":23,"value":326955},"Unmatched Flexibility:",{"type":23,"value":326957}," Unified.to supports 19 live categories—far exceeding other unified API platforms. This breadth makes it easier for products to scale and expand their use cases.",{"type":17,"tag":84,"props":326959,"children":326960},{},[326961,326966],{"type":17,"tag":48,"props":326962,"children":326963},{},[326964],{"type":23,"value":326965},"Responsiveness:",{"type":23,"value":326967}," Fast support and iteration, helping MyHub close deals faster",{"type":17,"tag":68,"props":326969,"children":326971},{"id":326970},"bigger-deals-faster-sales-lower-churn",[326972],{"type":23,"value":326973},"Bigger deals, faster sales, lower churn",{"type":17,"tag":29,"props":326975,"children":326976},{},[326977],{"type":23,"value":326978},"By integrating with Unified.to, MyHub unlocked enterprise growth at scale:",{"type":17,"tag":80,"props":326980,"children":326981},{},[326982,326992,327002,327012],{"type":17,"tag":84,"props":326983,"children":326984},{},[326985,326990],{"type":17,"tag":48,"props":326986,"children":326987},{},[326988],{"type":23,"value":326989},"3x Increase in Average Contract Value (ACV)",{"type":23,"value":326991}," – Enterprise clients signed significantly larger contracts, thanks to expanded integration capabilities.",{"type":17,"tag":84,"props":326993,"children":326994},{},[326995,327000],{"type":17,"tag":48,"props":326996,"children":326997},{},[326998],{"type":23,"value":326999},"Faster Sales Cycles",{"type":23,"value":327001}," – With key integrations in place, prospects moved through the funnel faster.",{"type":17,"tag":84,"props":327003,"children":327004},{},[327005,327010],{"type":17,"tag":48,"props":327006,"children":327007},{},[327008],{"type":23,"value":327009},"Lower Churn",{"type":23,"value":327011}," – Integrated customers are far more likely to stay, increasing retention.",{"type":17,"tag":84,"props":327013,"children":327014},{},[327015,327020],{"type":17,"tag":48,"props":327016,"children":327017},{},[327018],{"type":23,"value":327019},"Stronger Platform Partnerships",{"type":23,"value":327021}," – MyHub built deeper relationships with HR platforms, creating new growth channels.",{"type":17,"tag":29,"props":327023,"children":327024},{},[327025],{"type":23,"value":327026},"'Having seamless integrations is a strong adoption signal. The more technical tentacles we have in a customer's system, the stickier our product becomes.'\n— Steve Hockey, CEO, MyHub",{"type":17,"tag":68,"props":327028,"children":327030},{"id":327029},"the-unifiedto-advantage",[327031],{"type":23,"value":327032},"The Unified.to advantage",{"type":17,"tag":29,"props":327034,"children":327035},{},[327036],{"type":23,"value":327037},"Unified.to helped MyHub transform integrations from a blocker into a growth accelerator:",{"type":17,"tag":80,"props":327039,"children":327040},{},[327041,327051,327061,327071],{"type":17,"tag":84,"props":327042,"children":327043},{},[327044,327049],{"type":17,"tag":48,"props":327045,"children":327046},{},[327047],{"type":23,"value":327048},"30x Faster Go-to-Marke",{"type":23,"value":327050},"t: From lengthy single-integration cycles to 60 integrations in three months.",{"type":17,"tag":84,"props":327052,"children":327053},{},[327054,327059],{"type":17,"tag":48,"props":327055,"children":327056},{},[327057],{"type":23,"value":327058},"Enterprise-Ready Positioning",{"type":23,"value":327060},": A robust integration ecosystem made MyHub a viable choice for large organizations.",{"type":17,"tag":84,"props":327062,"children":327063},{},[327064,327069],{"type":17,"tag":48,"props":327065,"children":327066},{},[327067],{"type":23,"value":327068},"Lower Maintenance Overhead:",{"type":23,"value":327070}," Engineering resources remained focused on core product innovation, not upkeep.",{"type":17,"tag":84,"props":327072,"children":327073},{},[327074,327079],{"type":17,"tag":48,"props":327075,"children":327076},{},[327077],{"type":23,"value":327078},"Security & Compliance Confidence:",{"type":23,"value":327080}," No data caching or storage minimized risk, meeting enterprise security and compliance demands.",{"type":17,"tag":68,"props":327082,"children":327084},{"id":327083},"whats-next-ai-powered-solutions",[327085],{"type":23,"value":327086},"What's next: AI-powered solutions",{"type":17,"tag":29,"props":327088,"children":327089},{},[327090],{"type":23,"value":327091},"With 60+ integrations live, MyHub is now exploring AI-powered automation to enhance workforce productivity. GPT-powered policy creation and natural language search are on the horizon, leveraging Unified.to's infrastructure to stay ahead of the curve.",{"type":17,"tag":29,"props":327093,"children":327094},{},[327095],{"type":23,"value":327096},"'We're still narrowing down the best AI use cases, but Unified.to's integration depth and breadth give us the flexibility to experiment and innovate.'\n— Steve Hockey, CEO, MyHub",{"type":17,"tag":29,"props":327098,"children":327099},{},[327100,327105,327106,327115,327116,327120,327121,327130,327131],{"type":17,"tag":48,"props":327101,"children":327102},{},[327103],{"type":23,"value":327104},"Ready to scale like MyHub?",{"type":23,"value":18757},{"type":17,"tag":133,"props":327107,"children":327110},{"href":327108,"rel":327109},"https://app.unified.to/login?utm_source=marketing_website&utm_medium=casestudy&utm_campaign=merchkit_myhub_freetrial&utm_content=inline_link",[214],[327111],{"type":17,"tag":48,"props":327112,"children":327113},{},[327114],{"type":23,"value":226470},{"type":23,"value":18757},{"type":17,"tag":48,"props":327117,"children":327118},{},[327119],{"type":23,"value":217439},{"type":23,"value":18757},{"type":17,"tag":133,"props":327122,"children":327125},{"href":327123,"rel":327124},"https://unified.to/contact?utm_source=marketing_website&utm_medium=casestudy&utm_campaign=myhub_casestudy&utm_content=inline_link",[214],[327126],{"type":17,"tag":48,"props":327127,"children":327128},{},[327129],{"type":23,"value":299181},{"type":23,"value":18757},{"type":17,"tag":48,"props":327132,"children":327133},{},[327134],{"type":23,"value":327135},"about your integration strategy today.",{"title":7,"searchDepth":1629,"depth":1629,"links":327137},[327138,327139,327140,327141,327142,327143],{"id":326823,"depth":1629,"text":326826},{"id":326849,"depth":1629,"text":326852},{"id":326875,"depth":1629,"text":326878},{"id":326970,"depth":1629,"text":326973},{"id":327029,"depth":1629,"text":327032},{"id":327083,"depth":1629,"text":327086},"content:blog:the_integration_strategy_that_tripled_myhub_enterprise_deals.md","blog/the_integration_strategy_that_tripled_myhub_enterprise_deals.md","blog/the_integration_strategy_that_tripled_myhub_enterprise_deals",{"_path":9007,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":79172,"description":327148,"img":327149,"date":327150,"tag":6341,"body":327151,"_type":1677,"_id":327858,"_source":1679,"_file":327859,"_stem":327860,"_extension":1682},"Product teams building real-time applications face a common challenge, most third-party APIs don't offer webhooks (In fact, our State of SaaS APIs report found...","https://s3.us-east-2.amazonaws.com/unified-article-images/unlock_real_time_data_with_virtual_webhooks-icon.png","2025-02-13T00:00:00.000Z",{"type":14,"children":327152,"toc":327849},[327153,327158,327161,327169,327195,327200,327213,327241,327247,327254,327259,327341,327346,327352,327357,327370,327375,327393,327398,327408,327414,327419,327608,327613,327619,327624,327632,327637,327645,327655,327663,327668,327673,327686,327694,327702,327707,327715,327725,327731,327736,327740,327758,327763,327769,327787,327792,327798,327803],{"type":17,"tag":18,"props":327154,"children":327156},{"id":327155},"unlock-real-time-data-with-virtual-webhooks",[327157],{"type":23,"value":79172},{"type":17,"tag":25,"props":327159,"children":327160},{},[],{"type":17,"tag":29,"props":327162,"children":327163},{},[327164],{"type":17,"tag":33,"props":327165,"children":327166},{},[327167],{"type":23,"value":327168},"February 13, 2025",{"type":17,"tag":29,"props":327170,"children":327171},{},[327172,327174,327178,327180,327187,327189,327193],{"type":23,"value":327173},"Product teams building real-time applications face a common challenge: most third-party APIs don't offer ",{"type":17,"tag":133,"props":327175,"children":327176},{"href":4999},[327177],{"type":23,"value":5002},{"type":23,"value":327179}," (In fact, our ",{"type":17,"tag":133,"props":327181,"children":327184},{"href":327182,"rel":327183},"https://unified.to/blog/the_state_of_saas_apis_2024",[214],[327185],{"type":23,"value":327186},"State of SaaS APIs report",{"type":23,"value":327188}," found only 11% of APIs have built-in support for webhooks). This leads to inefficient polling, manually handling ",{"type":17,"tag":133,"props":327190,"children":327191},{"href":135},[327192],{"type":23,"value":138},{"type":23,"value":327194},", and writing custom logic just to keep data fresh.",{"type":17,"tag":29,"props":327196,"children":327197},{},[327198],{"type":23,"value":327199},"But what if you could control webhook updates while reducing API costs and complexity?",{"type":17,"tag":29,"props":327201,"children":327202},{},[327203,327205,327211],{"type":23,"value":327204},"That's exactly what Unified.to's ",{"type":17,"tag":133,"props":327206,"children":327209},{"href":327207,"rel":327208},"https://unified.to/blog/introducing_powerful_enhancements_to_webhooks",[214],[327210],{"type":23,"value":46572},{"type":23,"value":327212}," enable. In this article, we'll review:",{"type":17,"tag":80,"props":327214,"children":327215},{},[327216,327226,327231,327236],{"type":17,"tag":84,"props":327217,"children":327218},{},[327219,327220,327224],{"type":23,"value":297741},{"type":17,"tag":133,"props":327221,"children":327222},{"href":9007},[327223],{"type":23,"value":46572},{"type":23,"value":327225}," work",{"type":17,"tag":84,"props":327227,"children":327228},{},[327229],{"type":23,"value":327230},"Why they help control API costs by managing request frequency",{"type":17,"tag":84,"props":327232,"children":327233},{},[327234],{"type":23,"value":327235},"How they eliminate the need for custom rate-limit handling systems",{"type":17,"tag":84,"props":327237,"children":327238},{},[327239],{"type":23,"value":327240},"Why virtual webhooks are the fastest way to implement real-time updates",{"type":17,"tag":68,"props":327242,"children":327244},{"id":327243},"why-use-virtual-webhooks",[327245],{"type":23,"value":327246},"Why use virtual webhooks?",{"type":17,"tag":29,"props":327248,"children":327249},{},[327250],{"type":17,"tag":6438,"props":327251,"children":327253},{"alt":9139,"src":327252},"https://s3.us-east-2.amazonaws.com/unified-article-images/unlock_real_time_data_with_virtual_webhooks-0.png",[],{"type":17,"tag":29,"props":327255,"children":327256},{},[327257],{"type":23,"value":327258},"Pairing Unified.to's virtual webhooks with your product's integration strategy means:",{"type":17,"tag":80,"props":327260,"children":327261},{},[327262,327272,327282,327292,327302,327311,327321,327331],{"type":17,"tag":84,"props":327263,"children":327264},{},[327265,327270],{"type":17,"tag":48,"props":327266,"children":327267},{},[327268],{"type":23,"value":327269},"Webhooks for nearly every integration",{"type":23,"value":327271}," – Get real-time updates even from APIs that don't natively support webhooks, all through a unified API.",{"type":17,"tag":84,"props":327273,"children":327274},{},[327275,327280],{"type":17,"tag":48,"props":327276,"children":327277},{},[327278],{"type":23,"value":327279},"Cost-efficient API usage",{"type":23,"value":327281}," – Unlike native webhooks, which can be unpredictable in frequency and costly, virtual webhooks control API call frequency, reducing overages and optimizing usage.",{"type":17,"tag":84,"props":327283,"children":327284},{},[327285,327290],{"type":17,"tag":48,"props":327286,"children":327287},{},[327288],{"type":23,"value":327289},"One unified schema",{"type":23,"value":327291}," – Whether the source supports native webhooks or requires polling, data is normalized into a consistent format—no custom polling logic needed.",{"type":17,"tag":84,"props":327293,"children":327294},{},[327295,327300],{"type":17,"tag":48,"props":327296,"children":327297},{},[327298],{"type":23,"value":327299},"Optimized sync performance",{"type":23,"value":327301}," – Intelligent update detection, seamless and automatic rate-limit handling, and configurable polling intervals (e.g., every minute, every 30 minutes, every hour).",{"type":17,"tag":84,"props":327303,"children":327304},{},[327305,327309],{"type":17,"tag":48,"props":327306,"children":327307},{},[327308],{"type":23,"value":190909},{"type":23,"value":327310}," – Virtual webhooks eliminate the need to build custom data collection.",{"type":17,"tag":84,"props":327312,"children":327313},{},[327314,327319],{"type":17,"tag":48,"props":327315,"children":327316},{},[327317],{"type":23,"value":327318},"Historical data access",{"type":23,"value":327320}," – Instantly access past records when creating a webhook subscription, eliminating the need for separate API calls.",{"type":17,"tag":84,"props":327322,"children":327323},{},[327324,327329],{"type":17,"tag":48,"props":327325,"children":327326},{},[327327],{"type":23,"value":327328},"Built-in observability",{"type":23,"value":327330}," – Monitor webhook activity with logs, audit trails, and health tracking.",{"type":17,"tag":84,"props":327332,"children":327333},{},[327334,327339],{"type":17,"tag":48,"props":327335,"children":327336},{},[327337],{"type":23,"value":327338},"Event-driven AI and automation",{"type":23,"value":327340}," – Trigger AI workflows and automation in response to real-time data changes.",{"type":17,"tag":29,"props":327342,"children":327343},{},[327344],{"type":23,"value":327345},"Instead of dealing with a patchwork of webhook, polling, and batch sync solutions, Unified.to's virtual webhooks create a consistent, scalable way to access real-time data across your integrations.",{"type":17,"tag":68,"props":327347,"children":327349},{"id":327348},"how-virtual-webhooks-work",[327350],{"type":23,"value":327351},"How virtual webhooks work",{"type":17,"tag":29,"props":327353,"children":327354},{},[327355],{"type":23,"value":327356},"Webhooks provide a push-based way to receive data updates, eliminating the need for polling. But most APIs don't support them, which forces developers to either:",{"type":17,"tag":6154,"props":327358,"children":327359},{},[327360,327365],{"type":17,"tag":84,"props":327361,"children":327362},{},[327363],{"type":23,"value":327364},"Poll the API (which wastes API calls and delays updates), or",{"type":17,"tag":84,"props":327366,"children":327367},{},[327368],{"type":23,"value":327369},"Manually mix polling and webhooks (adding complexity and inconsistencies).",{"type":17,"tag":29,"props":327371,"children":327372},{},[327373],{"type":23,"value":327374},"Unified.to's virtual webhooks solve this by mimicking native webhooks, even when the source API doesn't provide them:",{"type":17,"tag":80,"props":327376,"children":327377},{},[327378,327383,327388],{"type":17,"tag":84,"props":327379,"children":327380},{},[327381],{"type":23,"value":327382},"We monitor your customers' connections on a scheduled interval that you configure (e.g., as frequently as every minute) and detect changes automatically",{"type":17,"tag":84,"props":327384,"children":327385},{},[327386],{"type":23,"value":327387},"We push updates to your webhook endpoint, just like a native webhook would",{"type":17,"tag":84,"props":327389,"children":327390},{},[327391],{"type":23,"value":327392},"You subscribe and manage webhooks the same way you would with a real webhook",{"type":17,"tag":29,"props":327394,"children":327395},{},[327396],{"type":23,"value":327397},"No polling logic. No wasted API calls. Just real-time updates, everywhere.",{"type":17,"tag":29,"props":327399,"children":327400},{},[327401],{"type":17,"tag":133,"props":327402,"children":327405},{"href":327403,"rel":327404},"https://docs.unified.to/guides/how_to_create_and_configure_webhooks",[214],[327406],{"type":23,"value":327407},"Explore documentation",{"type":17,"tag":68,"props":327409,"children":327411},{"id":327410},"how-virtual-webhooks-compare-to-traditional-webhooks-and-polling",[327412],{"type":23,"value":327413},"How virtual webhooks compare to traditional webhooks and polling",{"type":17,"tag":29,"props":327415,"children":327416},{},[327417],{"type":23,"value":327418},"Most third-party APIs don't offer native webhooks, forcing teams to choose between batch syncs, polling, or manual workarounds.",{"type":17,"tag":7231,"props":327420,"children":327421},{},[327422,327457],{"type":17,"tag":7235,"props":327423,"children":327424},{},[327425],{"type":17,"tag":7239,"props":327426,"children":327427},{},[327428,327435,327443,327450],{"type":17,"tag":7243,"props":327429,"children":327430},{},[327431],{"type":17,"tag":48,"props":327432,"children":327433},{},[327434],{"type":23,"value":87518},{"type":17,"tag":7243,"props":327436,"children":327437},{},[327438],{"type":17,"tag":48,"props":327439,"children":327440},{},[327441],{"type":23,"value":327442},"Unified.to Virtual Webhooks",{"type":17,"tag":7243,"props":327444,"children":327445},{},[327446],{"type":17,"tag":48,"props":327447,"children":327448},{},[327449],{"type":23,"value":164707},{"type":17,"tag":7243,"props":327451,"children":327452},{},[327453],{"type":17,"tag":48,"props":327454,"children":327455},{},[327456],{"type":23,"value":172306},{"type":17,"tag":7259,"props":327458,"children":327459},{},[327460,327483,327504,327525,327545,327567,327588],{"type":17,"tag":7239,"props":327461,"children":327462},{},[327463,327468,327473,327478],{"type":17,"tag":7266,"props":327464,"children":327465},{},[327466],{"type":23,"value":327467},"Works even if API doesn't support webhooks",{"type":17,"tag":7266,"props":327469,"children":327470},{},[327471],{"type":23,"value":327472},"✅ Yes",{"type":17,"tag":7266,"props":327474,"children":327475},{},[327476],{"type":23,"value":327477},"❌ No",{"type":17,"tag":7266,"props":327479,"children":327480},{},[327481],{"type":23,"value":327482},"✅ Yes, but inefficient",{"type":17,"tag":7239,"props":327484,"children":327485},{},[327486,327491,327495,327499],{"type":17,"tag":7266,"props":327487,"children":327488},{},[327489],{"type":23,"value":327490},"Real-time event updates",{"type":17,"tag":7266,"props":327492,"children":327493},{},[327494],{"type":23,"value":327472},{"type":17,"tag":7266,"props":327496,"children":327497},{},[327498],{"type":23,"value":327472},{"type":17,"tag":7266,"props":327500,"children":327501},{},[327502],{"type":23,"value":327503},"❌ No, delayed",{"type":17,"tag":7239,"props":327505,"children":327506},{},[327507,327512,327516,327520],{"type":17,"tag":7266,"props":327508,"children":327509},{},[327510],{"type":23,"value":327511},"API rate limit friendly",{"type":17,"tag":7266,"props":327513,"children":327514},{},[327515],{"type":23,"value":327472},{"type":17,"tag":7266,"props":327517,"children":327518},{},[327519],{"type":23,"value":327472},{"type":17,"tag":7266,"props":327521,"children":327522},{},[327523],{"type":23,"value":327524},"❌ No, high API usage",{"type":17,"tag":7239,"props":327526,"children":327527},{},[327528,327533,327537,327541],{"type":17,"tag":7266,"props":327529,"children":327530},{},[327531],{"type":23,"value":327532},"Historical data retrieval",{"type":17,"tag":7266,"props":327534,"children":327535},{},[327536],{"type":23,"value":327472},{"type":17,"tag":7266,"props":327538,"children":327539},{},[327540],{"type":23,"value":327477},{"type":17,"tag":7266,"props":327542,"children":327543},{},[327544],{"type":23,"value":327477},{"type":17,"tag":7239,"props":327546,"children":327547},{},[327548,327553,327558,327562],{"type":17,"tag":7266,"props":327549,"children":327550},{},[327551],{"type":23,"value":327552},"Fine-grained sync control",{"type":17,"tag":7266,"props":327554,"children":327555},{},[327556],{"type":23,"value":327557},"✅ Yes (adjust polling frequency)",{"type":17,"tag":7266,"props":327559,"children":327560},{},[327561],{"type":23,"value":327477},{"type":17,"tag":7266,"props":327563,"children":327564},{},[327565],{"type":23,"value":327566},"✅ Yes, but manual",{"type":17,"tag":7239,"props":327568,"children":327569},{},[327570,327575,327579,327584],{"type":17,"tag":7266,"props":327571,"children":327572},{},[327573],{"type":23,"value":327574},"Built-in error handling & retries",{"type":17,"tag":7266,"props":327576,"children":327577},{},[327578],{"type":23,"value":327472},{"type":17,"tag":7266,"props":327580,"children":327581},{},[327582],{"type":23,"value":327583},"❌ Varies by API",{"type":17,"tag":7266,"props":327585,"children":327586},{},[327587],{"type":23,"value":327477},{"type":17,"tag":7239,"props":327589,"children":327590},{},[327591,327596,327600,327604],{"type":17,"tag":7266,"props":327592,"children":327593},{},[327594],{"type":23,"value":327595},"Webhook observability (logs, health monitoring)",{"type":17,"tag":7266,"props":327597,"children":327598},{},[327599],{"type":23,"value":327472},{"type":17,"tag":7266,"props":327601,"children":327602},{},[327603],{"type":23,"value":327583},{"type":17,"tag":7266,"props":327605,"children":327606},{},[327607],{"type":23,"value":327477},{"type":17,"tag":29,"props":327609,"children":327610},{},[327611],{"type":23,"value":327612},"Virtual webhooks provide all the benefits of native webhooks, even when APIs don't support them, while eliminating the inefficiencies of polling.",{"type":17,"tag":68,"props":327614,"children":327616},{"id":327615},"product-use-cases",[327617],{"type":23,"value":327618},"Product use cases",{"type":17,"tag":29,"props":327620,"children":327621},{},[327622],{"type":23,"value":327623},"Let's look at how developers and product teams can leverage virtual webhooks in real-world applications.",{"type":17,"tag":29,"props":327625,"children":327626},{},[327627],{"type":17,"tag":48,"props":327628,"children":327629},{},[327630],{"type":23,"value":327631},"AI-powered customer support",{"type":17,"tag":29,"props":327633,"children":327634},{},[327635],{"type":23,"value":327636},"Virtual webhooks can update AI models in real-time when new support tickets are created. Instead of polling a help desk API every few minutes, an AI assistant can instantly respond to customer inquiries or escalate issues.",{"type":17,"tag":29,"props":327638,"children":327639},{},[327640],{"type":17,"tag":133,"props":327641,"children":327643},{"href":32673,"rel":327642},[214],[327644],{"type":23,"value":32677},{"type":17,"tag":29,"props":327646,"children":327647},{},[327648],{"type":17,"tag":133,"props":327649,"children":327652},{"href":327650,"rel":327651},"https://unified.to/blog/how_to_build_a_discord_support_bot_with_unified_and_langbase",[214],[327653],{"type":23,"value":327654},"Build an AI Support Bot",{"type":17,"tag":29,"props":327656,"children":327657},{},[327658],{"type":17,"tag":48,"props":327659,"children":327660},{},[327661],{"type":23,"value":327662},"Automated financial reporting",{"type":17,"tag":29,"props":327664,"children":327665},{},[327666],{"type":23,"value":327667},"Fintech and accounting applications rely on up-to-date financial data to generate reports, sync transactions, and reconcile accounts. However, many accounting platforms lack real-time webhook support, meaning transaction updates often rely on batch syncs or polling.",{"type":17,"tag":29,"props":327669,"children":327670},{},[327671],{"type":23,"value":327672},"With Unified.to's virtual webhooks, accounting software can:",{"type":17,"tag":80,"props":327674,"children":327675},{},[327676,327681],{"type":17,"tag":84,"props":327677,"children":327678},{},[327679],{"type":23,"value":327680},"Get notified instantly when new transactions, invoices, or payments are recorded",{"type":17,"tag":84,"props":327682,"children":327683},{},[327684],{"type":23,"value":327685},"Trigger automatic reconciliation workflows instead of waiting for scheduled syncs",{"type":17,"tag":29,"props":327687,"children":327688},{},[327689],{"type":17,"tag":133,"props":327690,"children":327692},{"href":83766,"rel":327691},[214],[327693],{"type":23,"value":83770},{"type":17,"tag":29,"props":327695,"children":327696},{},[327697],{"type":17,"tag":48,"props":327698,"children":327699},{},[327700],{"type":23,"value":327701},"Recruitment automation",{"type":17,"tag":29,"props":327703,"children":327704},{},[327705],{"type":23,"value":327706},"Hiring teams often integrate with multiple ATS platforms—some of which lack real-time event support. Virtual webhooks enable AI-powered candidate screening to kick in the moment a new application is received, ensuring faster and more efficient hiring workflows.",{"type":17,"tag":29,"props":327708,"children":327709},{},[327710],{"type":17,"tag":133,"props":327711,"children":327713},{"href":56812,"rel":327712},[214],[327714],{"type":23,"value":56819},{"type":17,"tag":29,"props":327716,"children":327717},{},[327718],{"type":17,"tag":133,"props":327719,"children":327722},{"href":327720,"rel":327721},"https://unified.to/blog/how_herohunt_saved_ten_months_of_engineering_time_with_unified",[214],[327723],{"type":23,"value":327724},"How HeroHunt added 20 integrations in 1 week",{"type":17,"tag":68,"props":327726,"children":327728},{"id":327727},"how-much-polling-actually-costs",[327729],{"type":23,"value":327730},"How much polling actually costs",{"type":17,"tag":29,"props":327732,"children":327733},{},[327734],{"type":23,"value":327735},"Polling isn't just inefficient—it's expensive.",{"type":17,"tag":29,"props":327737,"children":327738},{},[327739],{"type":23,"value":19878},{"type":17,"tag":80,"props":327741,"children":327742},{},[327743,327748,327753],{"type":17,"tag":84,"props":327744,"children":327745},{},[327746],{"type":23,"value":327747},"Polling every 5 minutes on 1000 accounts = 288,000 API requests per day",{"type":17,"tag":84,"props":327749,"children":327750},{},[327751],{"type":23,"value":327752},"Polling every 1 minute on 1000 accounts = 1.4 million API requests per day",{"type":17,"tag":84,"props":327754,"children":327755},{},[327756],{"type":23,"value":327757},"With virtual webhooks, API requests are dramatically reduced, as data is only fetched when changes occur. In low-activity accounts, this can mean near-zero requests, while high-activity accounts still see significant reductions compared to constant polling.",{"type":17,"tag":29,"props":327759,"children":327760},{},[327761],{"type":23,"value":327762},"Instead of burning API quota on polling, virtual webhooks ensure data flows only when necessary, dramatically reducing costs and improving responsiveness.",{"type":17,"tag":68,"props":327764,"children":327766},{"id":327765},"what-happens-if-you-dont-use-virtual-webhooks",[327767],{"type":23,"value":327768},"What happens if you don't use virtual webhooks?",{"type":17,"tag":80,"props":327770,"children":327771},{},[327772,327777,327782],{"type":17,"tag":84,"props":327773,"children":327774},{},[327775],{"type":23,"value":327776},"You could hit API rate limits while continuously polling for updates",{"type":17,"tag":84,"props":327778,"children":327779},{},[327780],{"type":23,"value":327781},"You could rely on batch syncs, leading to outdated or incomplete data",{"type":17,"tag":84,"props":327783,"children":327784},{},[327785],{"type":23,"value":327786},"You could spend months building and maintaining custom webhook fallbacks for every integration",{"type":17,"tag":29,"props":327788,"children":327789},{},[327790],{"type":23,"value":327791},"Or… you could just use Unified.to's virtual webhooks to handle rate limits and get real-time updates across all your integrations.",{"type":17,"tag":68,"props":327793,"children":327795},{"id":327794},"start-using-unifiedtos-virtual-webhooks",[327796],{"type":23,"value":327797},"Start using Unified.to's virtual webhooks",{"type":17,"tag":29,"props":327799,"children":327800},{},[327801],{"type":23,"value":327802},"Ready to stop polling and start working with real-time data everywhere? Here's how to get started:",{"type":17,"tag":80,"props":327804,"children":327805},{},[327806,327816,327827,327838],{"type":17,"tag":84,"props":327807,"children":327808},{},[327809,327814],{"type":17,"tag":133,"props":327810,"children":327812},{"href":1612,"rel":327811},[214],[327813],{"type":23,"value":215326},{"type":23,"value":327815}," to access virtual webhooks",{"type":17,"tag":84,"props":327817,"children":327818},{},[327819,327825],{"type":17,"tag":133,"props":327820,"children":327822},{"href":326013,"rel":327821},[214],[327823],{"type":23,"value":327824},"Join our Discord",{"type":23,"value":327826}," to connect with our team and get support",{"type":17,"tag":84,"props":327828,"children":327829},{},[327830,327836],{"type":17,"tag":133,"props":327831,"children":327833},{"href":327403,"rel":327832},[214],[327834],{"type":23,"value":327835},"Review our documentation",{"type":23,"value":327837}," for step-by-step guidance on setting up webhooks",{"type":17,"tag":84,"props":327839,"children":327840},{},[327841,327847],{"type":17,"tag":133,"props":327842,"children":327844},{"href":47029,"rel":327843},[214],[327845],{"type":23,"value":327846},"See our changelog",{"type":23,"value":327848}," for virtual webhook enhancements",{"title":7,"searchDepth":1629,"depth":1629,"links":327850},[327851,327852,327853,327854,327855,327856,327857],{"id":327243,"depth":1629,"text":327246},{"id":327348,"depth":1629,"text":327351},{"id":327410,"depth":1629,"text":327413},{"id":327615,"depth":1629,"text":327618},{"id":327727,"depth":1629,"text":327730},{"id":327765,"depth":1629,"text":327768},{"id":327794,"depth":1629,"text":327797},"content:blog:unlock_real_time_data_with_virtual_webhooks.md","blog/unlock_real_time_data_with_virtual_webhooks.md","blog/unlock_real_time_data_with_virtual_webhooks",{"_path":327862,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":327863,"description":327864,"img":327865,"date":327866,"tag":12,"body":327867,"_type":1677,"_id":328444,"_source":1679,"_file":328445,"_stem":328446,"_extension":1682},"/blog/jan_2025_product_updates","Jan 2025 product updates","Unified.to now supports 240+ pre-built integrations across 19+ API categories. We're continuously expanding integration support to power modern AI-driven...","https://s3.us-east-2.amazonaws.com/unified-article-images/jan_2025_product_updates-icon.png","2025-01-30T00:00:00.000Z",{"type":14,"children":327868,"toc":328434},[327869,327874,327877,327885,327890,327903,327907,327920,327928,327999,328004,328023,328027,328035,328040,328058,328069,328112,328118,328123,328176,328182,328187,328229,328234,328239,328296,328302,328314,328322,328327,328340,328346,328360,328365,328388,328393],{"type":17,"tag":18,"props":327870,"children":327872},{"id":327871},"jan-2025-product-updates",[327873],{"type":23,"value":327863},{"type":17,"tag":25,"props":327875,"children":327876},{},[],{"type":17,"tag":29,"props":327878,"children":327879},{},[327880],{"type":17,"tag":33,"props":327881,"children":327882},{},[327883],{"type":23,"value":327884},"January 30, 2025",{"type":17,"tag":29,"props":327886,"children":327887},{},[327888],{"type":23,"value":327889},"Unified.to now supports 240+ pre-built integrations across 19+ API categories. We're continuously expanding integration support to power modern AI-driven applications. Here's what we shipped in January 2025.",{"type":17,"tag":29,"props":327891,"children":327892},{},[327893,327895,327901],{"type":23,"value":327894},"Follow Unified.to on ",{"type":17,"tag":133,"props":327896,"children":327899},{"href":327897,"rel":327898},"https://www.linkedin.com/company/unified-to/",[214],[327900],{"type":23,"value":11357},{"type":23,"value":327902}," to hear about changes and company news first.",{"type":17,"tag":68,"props":327904,"children":327905},{"id":11629},[327906],{"type":23,"value":216420},{"type":17,"tag":29,"props":327908,"children":327909},{},[327910,327912,327918],{"type":23,"value":327911},"This month, we've introduced new integrations across our HR & Directory, Generative AI, Task Management, Marketing, and ",{"type":17,"tag":133,"props":327913,"children":327915},{"href":327914},"/auth",[327916],{"type":23,"value":327917},"Authentication API",{"type":23,"value":327919}," categories. With Unified.to, you don't need to master hundreds of APIs. Ship multiple integrations at once and add new ones in minutes—without roadmap delays.",{"type":17,"tag":29,"props":327921,"children":327922},{},[327923],{"type":17,"tag":6438,"props":327924,"children":327927},{"alt":327925,"src":327926},"new_integrations_unified.png","https://s3.us-east-2.amazonaws.com/unified-article-images/jan_2025_product_updates-0.png",[],{"type":17,"tag":80,"props":327929,"children":327930},{},[327931,327943,327955,327966,327977,327988],{"type":17,"tag":84,"props":327932,"children":327933},{},[327934,327941],{"type":17,"tag":133,"props":327935,"children":327938},{"href":327936,"rel":327937},"https://unified.to/integrations/remote",[214],[327939],{"type":23,"value":327940},"Remote.com",{"type":23,"value":327942}," — A new integration for HR & Directory and user authentication",{"type":17,"tag":84,"props":327944,"children":327945},{},[327946,327953],{"type":17,"tag":133,"props":327947,"children":327950},{"href":327948,"rel":327949},"https://unified.to/integrations/irishr",[214],[327951],{"type":23,"value":327952},"Iris HR",{"type":23,"value":327954}," — Added support for employee records, payroll, and compliance",{"type":17,"tag":84,"props":327956,"children":327957},{},[327958,327964],{"type":17,"tag":133,"props":327959,"children":327962},{"href":327960,"rel":327961},"https://unified.to/integrations/deepseek",[214],[327963],{"type":23,"value":16686},{"type":23,"value":327965}," — A new GenAI integration",{"type":17,"tag":84,"props":327967,"children":327968},{},[327969,327975],{"type":17,"tag":133,"props":327970,"children":327973},{"href":327971,"rel":327972},"https://unified.to/integrations/trello",[214],[327974],{"type":23,"value":13284},{"type":23,"value":327976}," — Added support for tasks, comments, files, and project management",{"type":17,"tag":84,"props":327978,"children":327979},{},[327980,327986],{"type":17,"tag":133,"props":327981,"children":327984},{"href":327982,"rel":327983},"https://unified.to/integrations/salesforcemarketingcloud",[214],[327985],{"type":23,"value":192300},{"type":23,"value":327987}," — Access data for campaign automation and user authentication",{"type":17,"tag":84,"props":327989,"children":327990},{},[327991,327997],{"type":17,"tag":133,"props":327992,"children":327994},{"href":216218,"rel":327993},[214],[327995],{"type":23,"value":327996},"Typeform ",{"type":23,"value":327998},"— Authenticate Typeform users within your application",{"type":17,"tag":68,"props":328000,"children":328002},{"id":328001},"metadata-api",[328003],{"type":23,"value":110270},{"type":17,"tag":29,"props":328005,"children":328006},{},[328007,328008,328014,328016,328021],{"type":23,"value":6712},{"type":17,"tag":133,"props":328009,"children":328012},{"href":328010,"rel":328011},"https://docs.unified.to/metadata/overview",[214],[328013],{"type":23,"value":110270},{"type":23,"value":328015}," provides a seamless way to view additional object definitions (i.e., metadata). The ",{"type":17,"tag":48,"props":328017,"children":328018},{},[328019],{"type":23,"value":328020},"Metadata objects",{"type":23,"value":328022}," field will display unified object types as keys, and the corresponding values will be arrays of IDs associated with those objects.",{"type":17,"tag":29,"props":328024,"children":328025},{},[328026],{"type":23,"value":19878},{"type":17,"tag":29,"props":328028,"children":328029},{},[328030],{"type":17,"tag":6438,"props":328031,"children":328034},{"alt":328032,"src":328033},"metadata_unified.png","https://s3.us-east-2.amazonaws.com/unified-article-images/jan_2025_product_updates-1.png",[],{"type":17,"tag":68,"props":328036,"children":328037},{"id":325434},[328038],{"type":23,"value":328039},"Virtual Webhooks Expansion",{"type":17,"tag":29,"props":328041,"children":328042},{},[328043,328045,328049,328051,328056],{"type":23,"value":328044},"Unified.to has a unique approach to ",{"type":17,"tag":133,"props":328046,"children":328047},{"href":4999},[328048],{"type":23,"value":5002},{"type":23,"value":328050},". Our ",{"type":17,"tag":133,"props":328052,"children":328054},{"href":326236,"rel":328053},[214],[328055],{"type":23,"value":46572},{"type":23,"value":328057}," deliver real-time data from external APIs—even when native webhook support isn't available. Most integrations are already covered, with more enhancements rolling out regularly.",{"type":17,"tag":29,"props":328059,"children":328060},{},[328061,328063,328067],{"type":23,"value":328062},"More integrations now support created and updated ",{"type":17,"tag":133,"props":328064,"children":328065},{"href":9007},[328066],{"type":23,"value":46572},{"type":23,"value":328068},", enabling real-time data access:",{"type":17,"tag":80,"props":328070,"children":328071},{},[328072,328077,328082,328087,328092,328097,328102,328107],{"type":17,"tag":84,"props":328073,"children":328074},{},[328075],{"type":23,"value":328076},"RecruitCRM (Application, Candidate, Company, Contact, Lead, Deal, Job)",{"type":17,"tag":84,"props":328078,"children":328079},{},[328080],{"type":23,"value":328081},"JobAdder (Application, Metadata)",{"type":17,"tag":84,"props":328083,"children":328084},{},[328085],{"type":23,"value":328086},"Zendesk (Note, Ticket)",{"type":17,"tag":84,"props":328088,"children":328089},{},[328090],{"type":23,"value":328091},"Gorgias (Customer, Ticket, Note, Employee)",{"type":17,"tag":84,"props":328093,"children":328094},{},[328095],{"type":23,"value":328096},"Microsoft Teams (Channel, Message)",{"type":17,"tag":84,"props":328098,"children":328099},{},[328100],{"type":23,"value":328101},"Salesforce (List, Member)",{"type":17,"tag":84,"props":328103,"children":328104},{},[328105],{"type":23,"value":328106},"Notion (Page)",{"type":17,"tag":84,"props":328108,"children":328109},{},[328110],{"type":23,"value":328111},"GitHub (Repository, File)",{"type":17,"tag":68,"props":328113,"children":328115},{"id":328114},"pagination-enhancements",[328116],{"type":23,"value":328117},"Pagination Enhancements",{"type":17,"tag":29,"props":328119,"children":328120},{},[328121],{"type":23,"value":328122},"Querying large datasets is now more efficient with expanded pagination and search parameters. These updates reduce API response times, optimize data retrieval, and give you more control over how you fetch information.",{"type":17,"tag":80,"props":328124,"children":328125},{},[328126,328136,328146,328156,328166],{"type":17,"tag":84,"props":328127,"children":328128},{},[328129,328134],{"type":17,"tag":48,"props":328130,"children":328131},{},[328132],{"type":23,"value":328133},"RecruitCRM Application",{"type":23,"value":328135},": Added candidate_id, offset, limit, and virtual_webhook_limit for better filtering and batch processing.",{"type":17,"tag":84,"props":328137,"children":328138},{},[328139,328144],{"type":17,"tag":48,"props":328140,"children":328141},{},[328142],{"type":23,"value":328143},"Notion Page",{"type":23,"value":328145},": Added updated_gte pagination support to fetch only the latest updates.",{"type":17,"tag":84,"props":328147,"children":328148},{},[328149,328154],{"type":17,"tag":48,"props":328150,"children":328151},{},[328152],{"type":23,"value":328153},"JobAdder Metadata",{"type":23,"value":328155},": Added updated_gte, sort_by_updated_at, and virtual_webhook_limit for more precise and performant queries.",{"type":17,"tag":84,"props":328157,"children":328158},{},[328159,328164],{"type":17,"tag":48,"props":328160,"children":328161},{},[328162],{"type":23,"value":328163},"Zendesk Ticket",{"type":23,"value":328165},": Added virtual_webhook_user_id support, enabling event-based automation.",{"type":17,"tag":84,"props":328167,"children":328168},{},[328169,328174],{"type":17,"tag":48,"props":328170,"children":328171},{},[328172],{"type":23,"value":328173},"Microsoft Teams Channel & Message",{"type":23,"value":328175},": Added virtual_webhook_parent_id & virtual_webhook_channel_id for granular message tracking.",{"type":17,"tag":68,"props":328177,"children":328179},{"id":328178},"new-readable-writable-fields",[328180],{"type":23,"value":328181},"New Readable & Writable Fields",{"type":17,"tag":29,"props":328183,"children":328184},{},[328185],{"type":23,"value":328186},"Retrieve more context and update records more efficiently with newly available fields across multiple integrations. These updates improve data access, enable richer queries, and enhance automation capabilities.",{"type":17,"tag":80,"props":328188,"children":328189},{},[328190,328200,328210,328220],{"type":17,"tag":84,"props":328191,"children":328192},{},[328193,328198],{"type":17,"tag":48,"props":328194,"children":328195},{},[328196],{"type":23,"value":328197},"RecruitCRM Job",{"type":23,"value":328199},": Added company_id (readable & writable) for better company-job associations.",{"type":17,"tag":84,"props":328201,"children":328202},{},[328203,328208],{"type":17,"tag":48,"props":328204,"children":328205},{},[328206],{"type":23,"value":328207},"GitHub Repository",{"type":23,"value":328209},": Added updated_at, org_id, and created_at to improve repository tracking and filtering.",{"type":17,"tag":84,"props":328211,"children":328212},{},[328213,328218],{"type":17,"tag":48,"props":328214,"children":328215},{},[328216],{"type":23,"value":328217},"Slack Message",{"type":23,"value":328219},": Added root_message_id, allowing structured threading, and mentioned_members, making it easier to track user interactions.",{"type":17,"tag":84,"props":328221,"children":328222},{},[328223,328227],{"type":17,"tag":48,"props":328224,"children":328225},{},[328226],{"type":23,"value":328143},{"type":23,"value":328228},": Added web_url, simplifying direct access to pages within applications.",{"type":17,"tag":68,"props":328230,"children":328231},{"id":326427},[328232],{"type":23,"value":328233},"New API Methods",{"type":17,"tag":29,"props":328235,"children":328236},{},[328237],{"type":23,"value":328238},"Unlock more functionality with expanded API capabilities. You can now create, update, and manage resources with greater flexibility across key integrations.",{"type":17,"tag":80,"props":328240,"children":328241},{},[328242,328251,328260,328269,328278,328287],{"type":17,"tag":84,"props":328243,"children":328244},{},[328245,328249],{"type":17,"tag":48,"props":328246,"children":328247},{},[328248],{"type":23,"value":56594},{"type":23,"value":328250},": create, update, and remove methods for Applications, giving you full CRUD control.",{"type":17,"tag":84,"props":328252,"children":328253},{},[328254,328258],{"type":17,"tag":48,"props":328255,"children":328256},{},[328257],{"type":23,"value":191124},{"type":23,"value":328259},": list, get, create, and update for Contacts, Companies, and Deals, improving CRM automation.",{"type":17,"tag":84,"props":328261,"children":328262},{},[328263,328267],{"type":17,"tag":48,"props":328264,"children":328265},{},[328266],{"type":23,"value":13284},{"type":23,"value":328268},": list and get for Projects, Tasks, Comments, and Files, enhancing task management workflows.",{"type":17,"tag":84,"props":328270,"children":328271},{},[328272,328276],{"type":17,"tag":48,"props":328273,"children":328274},{},[328275],{"type":23,"value":292214},{"type":23,"value":328277},": create, update, and remove for Pages and Spaces, making it easier to manage structured content.",{"type":17,"tag":84,"props":328279,"children":328280},{},[328281,328285],{"type":17,"tag":48,"props":328282,"children":328283},{},[328284],{"type":23,"value":310119},{"type":23,"value":328286},": list and get for Metadata, enabling richer insights into recruitment data.",{"type":17,"tag":84,"props":328288,"children":328289},{},[328290,328294],{"type":17,"tag":48,"props":328291,"children":328292},{},[328293],{"type":23,"value":13302},{"type":23,"value":328295},": list, get, create, update, and remove for Comments, supporting better collaboration in issue tracking.",{"type":17,"tag":68,"props":328297,"children":328299},{"id":328298},"partnerships-sandbox-tab",[328300],{"type":23,"value":328301},"Partnerships & Sandbox Tab",{"type":17,"tag":29,"props":328303,"children":328304},{},[328305,328307,328312],{"type":23,"value":328306},"We've added a ",{"type":17,"tag":48,"props":328308,"children":328309},{},[328310],{"type":23,"value":328311},"Partnerships & Sandbox",{"type":23,"value":328313}," tab to make it easier to get Sandbox access and explore integration-based partnerships. This tab provides clear guidance on how to get started, including links to relevant resources and details on available Sandbox environments.",{"type":17,"tag":29,"props":328315,"children":328316},{},[328317],{"type":17,"tag":6438,"props":328318,"children":328321},{"alt":328319,"src":328320},"sandbox_tab_unified.png","https://s3.us-east-2.amazonaws.com/unified-article-images/jan_2025_product_updates-2.png",[],{"type":17,"tag":29,"props":328323,"children":328324},{},[328325],{"type":23,"value":328326},"You'll find:",{"type":17,"tag":80,"props":328328,"children":328329},{},[328330,328335],{"type":17,"tag":84,"props":328331,"children":328332},{},[328333],{"type":23,"value":328334},"Partnership opportunities and how to get started",{"type":17,"tag":84,"props":328336,"children":328337},{},[328338],{"type":23,"value":328339},"Sandbox account details for testing with real integration endpoints in production",{"type":17,"tag":68,"props":328341,"children":328343},{"id":328342},"shakudo-partnership",[328344],{"type":23,"value":328345},"Shakudo Partnership",{"type":17,"tag":29,"props":328347,"children":328348},{},[328349,328351,328358],{"type":23,"value":328350},"We're partnering with ",{"type":17,"tag":133,"props":328352,"children":328355},{"href":328353,"rel":328354},"https://www.shakudo.io/integrations/unified",[214],[328356],{"type":23,"value":328357},"Shakudo",{"type":23,"value":328359}," to bridge the gap between AI products and their customers' SaaS data.",{"type":17,"tag":29,"props":328361,"children":328362},{},[328363],{"type":23,"value":328364},"Unified.to delivers clean, normalized, and real-time data from hundreds of SaaS applications, while Shakudo preps it for AI pipelines, analysis, and model building.",{"type":17,"tag":80,"props":328366,"children":328367},{},[328368,328373,328378,328383],{"type":17,"tag":84,"props":328369,"children":328370},{},[328371],{"type":23,"value":328372},"Skip manual data prep—focus on innovation",{"type":17,"tag":84,"props":328374,"children":328375},{},[328376],{"type":23,"value":328377},"Power AI with high-quality data at scale",{"type":17,"tag":84,"props":328379,"children":328380},{},[328381],{"type":23,"value":328382},"Secure by design: Rigorous security standards + no caching",{"type":17,"tag":84,"props":328384,"children":328385},{},[328386],{"type":23,"value":328387},"Simplified auth with Vue, React, Angular, and Svelte components",{"type":17,"tag":29,"props":328389,"children":328390},{},[328391],{"type":23,"value":328392},"That's it for now. Thanks for reading!",{"type":17,"tag":29,"props":328394,"children":328395},{},[328396,328401,328402,328411,328412,328417,328418,328428,328429],{"type":17,"tag":48,"props":328397,"children":328398},{},[328399],{"type":23,"value":328400},"Ready to launch integrations faster? Start integrating with a",{"type":23,"value":18757},{"type":17,"tag":133,"props":328403,"children":328406},{"href":328404,"rel":328405},"https://app.unified.to/login?utm_source=jan_2025_update&utm_medium=blog&utm_campaign=jan2025_update_freetrial",[214],[328407],{"type":17,"tag":48,"props":328408,"children":328409},{},[328410],{"type":23,"value":322435},{"type":23,"value":18757},{"type":17,"tag":48,"props":328413,"children":328414},{},[328415],{"type":23,"value":328416},"(no credit card needed) or",{"type":23,"value":18757},{"type":17,"tag":133,"props":328419,"children":328422},{"href":328420,"rel":328421},"https://unified.to/contact?utm_source=jan2025_update&utm_medium=blog&utm_campaign=jan2025_update_contact_page",[214],[328423],{"type":17,"tag":48,"props":328424,"children":328425},{},[328426],{"type":23,"value":328427},"speak to an expert",{"type":23,"value":18757},{"type":17,"tag":48,"props":328430,"children":328431},{},[328432],{"type":23,"value":328433},"for your Professional or Enterprise needs.",{"title":7,"searchDepth":1629,"depth":1629,"links":328435},[328436,328437,328438,328439,328440,328441,328442,328443],{"id":11629,"depth":1629,"text":216420},{"id":328001,"depth":1629,"text":110270},{"id":325434,"depth":1629,"text":328039},{"id":328114,"depth":1629,"text":328117},{"id":328178,"depth":1629,"text":328181},{"id":326427,"depth":1629,"text":328233},{"id":328298,"depth":1629,"text":328301},{"id":328342,"depth":1629,"text":328345},"content:blog:jan_2025_product_updates.md","blog/jan_2025_product_updates.md","blog/jan_2025_product_updates",{"_path":328448,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":328449,"description":328450,"img":328451,"date":327866,"tag":289978,"body":328452,"_type":1677,"_id":328829,"_source":1679,"_file":328830,"_stem":328831,"_extension":1682},"/blog/mycroft_ships_new_integrations_in_15_minutes","Mycroft ships new integrations in 15 minutes","Learn how Mycroft, an AI-driven security and compliance platform, leveraged Unified.to to accelerate integration launches and stay ahead of the competition.","https://s3.us-east-2.amazonaws.com/unified-article-images/mycroft_ships_new_integrations_in_15_minutes-icon.png",{"type":14,"children":328453,"toc":328821},[328454,328459,328462,328469,328476,328480,328490,328499,328509,328519,328529,328545,328555,328563,328574,328579,328585,328590,328630,328635,328641,328652,328684,328689,328695,328700,328733,328738,328743,328748,328754,328759,328764,328768,328774,328779,328784],{"type":17,"tag":18,"props":328455,"children":328457},{"id":328456},"mycroft-ships-new-integrations-in-15-minutes",[328458],{"type":23,"value":328449},{"type":17,"tag":25,"props":328460,"children":328461},{},[],{"type":17,"tag":29,"props":328463,"children":328464},{},[328465],{"type":17,"tag":33,"props":328466,"children":328467},{},[328468],{"type":23,"value":327884},{"type":17,"tag":29,"props":328470,"children":328471},{},[328472],{"type":17,"tag":33,"props":328473,"children":328474},{},[328475],{"type":23,"value":328450},{"type":17,"tag":68,"props":328477,"children":328478},{"id":44585},[328479],{"type":23,"value":44588},{"type":17,"tag":29,"props":328481,"children":328482},{},[328483,328488],{"type":17,"tag":48,"props":328484,"children":328485},{},[328486],{"type":23,"value":328487},"Product Category",{"type":23,"value":328489},": AI-driven compliance platform",{"type":17,"tag":29,"props":328491,"children":328492},{},[328493,328497],{"type":17,"tag":48,"props":328494,"children":328495},{},[328496],{"type":23,"value":308941},{"type":23,"value":328498},": Data ingestion for security, compliance, and privacy",{"type":17,"tag":29,"props":328500,"children":328501},{},[328502,328507],{"type":17,"tag":48,"props":328503,"children":328504},{},[328505],{"type":23,"value":328506},"Integrations Launched",{"type":23,"value":328508},": 15 live integrations, 50 more planned",{"type":17,"tag":29,"props":328510,"children":328511},{},[328512,328517],{"type":17,"tag":48,"props":328513,"children":328514},{},[328515],{"type":23,"value":328516},"Time Savings",{"type":23,"value":328518},": Reduced integration launch time to 15 minutes",{"type":17,"tag":29,"props":328520,"children":328521},{},[328522,328527],{"type":17,"tag":48,"props":328523,"children":328524},{},[328525],{"type":23,"value":328526},"Engineers Required",{"type":23,"value":328528},": 2 engineers",{"type":17,"tag":29,"props":328530,"children":328531},{},[328532,328537,328539,328543],{"type":17,"tag":48,"props":328533,"children":328534},{},[328535],{"type":23,"value":328536},"Features Highlighted",{"type":23,"value":328538},": Authentication, ",{"type":17,"tag":133,"props":328540,"children":328541},{"href":129820},[328542],{"type":23,"value":129823},{"type":23,"value":328544},", onboarding",{"type":17,"tag":29,"props":328546,"children":328547},{},[328548,328553],{"type":17,"tag":48,"props":328549,"children":328550},{},[328551],{"type":23,"value":328552},"Benefits Highlighted",{"type":23,"value":328554},": Faster go-to-market, reduced development complexity, scalability",{"type":17,"tag":29,"props":328556,"children":328557},{},[328558],{"type":17,"tag":6438,"props":328559,"children":328562},{"alt":328560,"src":328561},"mycroft_unified_quote_%282%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/mycroft_ships_new_integrations_in_15_minutes-0.png",[],{"type":17,"tag":29,"props":328564,"children":328565},{},[328566,328572],{"type":17,"tag":133,"props":328567,"children":328570},{"href":328568,"rel":328569},"https://www.mycroft.io/",[214],[328571],{"type":23,"value":277857},{"type":23,"value":328573}," is transforming the way businesses approach security and privacy compliance. With AI-driven solutions, they provide a fully managed path to achieving SOC 2 compliance, allowing organizations to focus on what truly matters — building their products and driving revenue. As a security-led compliance automation platform, Mycroft relies on seamless data integration to empower its AI agents and deliver unmatched efficiency and reliability to its customers.",{"type":17,"tag":29,"props":328575,"children":328576},{},[328577],{"type":23,"value":328578},"For Mycroft, integrations were not optional — they were essential for unlocking the full potential of the platform, particularly for their target customers: mature organizations with 50+ employees and multiple SaaS applications. Yet, the process of developing integrations hindered the team's ability to focus more fully on their core AI product.",{"type":17,"tag":68,"props":328580,"children":328582},{"id":328581},"navigating-integration-development-at-scale",[328583],{"type":23,"value":328584},"Navigating integration development at scale",{"type":17,"tag":29,"props":328586,"children":328587},{},[328588],{"type":23,"value":328589},"Before adopting Unified.to, Mycroft faced several hurdles:",{"type":17,"tag":80,"props":328591,"children":328592},{},[328593,328603,328620],{"type":17,"tag":84,"props":328594,"children":328595},{},[328596,328601],{"type":17,"tag":48,"props":328597,"children":328598},{},[328599],{"type":23,"value":328600},"Lengthy Development Cycles",{"type":23,"value":328602},": Each integration consumed significant engineering time for development, testing, and maintenance.",{"type":17,"tag":84,"props":328604,"children":328605},{},[328606,328611,328612,328618],{"type":17,"tag":48,"props":328607,"children":328608},{},[328609],{"type":23,"value":328610},"Authentication Complexity",{"type":23,"value":49318},{"type":17,"tag":133,"props":328613,"children":328615},{"href":78603,"rel":328614},[214],[328616],{"type":23,"value":328617},"Alternate integration solutions",{"type":23,"value":328619}," they evaluated like Merge and Ramp failed to meet robust authentication capabilities.",{"type":17,"tag":84,"props":328621,"children":328622},{},[328623,328628],{"type":17,"tag":48,"props":328624,"children":328625},{},[328626],{"type":23,"value":328627},"Limited Resources",{"type":23,"value":328629},": Mycroft's small team of engineers found it difficult to balance integration development with core product innovation.",{"type":17,"tag":29,"props":328631,"children":328632},{},[328633],{"type":23,"value":328634},"The team knew that addressing these challenges was vital to deliver the seamless user experience their customers expected.",{"type":17,"tag":68,"props":328636,"children":328638},{"id":328637},"rolling-out-integrations-in-minutes-freeing-up-engineers-for-ai",[328639],{"type":23,"value":328640},"Rolling out integrations in minutes, freeing up engineers for AI",{"type":17,"tag":29,"props":328642,"children":328643},{},[328644,328646,328650],{"type":23,"value":328645},"Unified.to provided Mycroft with a ",{"type":17,"tag":133,"props":328647,"children":328648},{"href":7691},[328649],{"type":23,"value":7459},{"type":23,"value":328651}," solution that transformed its approach to integrations:",{"type":17,"tag":80,"props":328653,"children":328654},{},[328655,328665,328675],{"type":17,"tag":84,"props":328656,"children":328657},{},[328658,328663],{"type":17,"tag":48,"props":328659,"children":328660},{},[328661],{"type":23,"value":328662},"Rapid Deployment",{"type":23,"value":328664},": Mycroft's engineering team can now activate their pre-built integrations in just 15 minutes. In fact, during a live demo, they activated a new integration on the spot in real time, showcasing their speed to launch integration requests to a potential customer.",{"type":17,"tag":84,"props":328666,"children":328667},{},[328668,328673],{"type":17,"tag":48,"props":328669,"children":328670},{},[328671],{"type":23,"value":328672},"Seamless Authentication",{"type":23,"value":328674},": Eliminated the need for custom authentication flows, reducing cognitive overhead.",{"type":17,"tag":84,"props":328676,"children":328677},{},[328678,328682],{"type":17,"tag":48,"props":328679,"children":328680},{},[328681],{"type":23,"value":264209},{"type":23,"value":328683},": With 15 integrations live and plans for 50 more, Mycroft could meet growing customer demands without sacrificing product development.",{"type":17,"tag":29,"props":328685,"children":328686},{},[328687],{"type":23,"value":328688},"Mycroft's engineering team found that Unified.to's authentication capabilities significantly streamlined their workflow. By eliminating the need for custom authentication flows, they were able to scale faster and deliver a frictionless experience to customers without technical roadblocks.",{"type":17,"tag":68,"props":328690,"children":328692},{"id":328691},"reaching-competitive-parity-through-integrations",[328693],{"type":23,"value":328694},"Reaching competitive parity through integrations",{"type":17,"tag":29,"props":328696,"children":328697},{},[328698],{"type":23,"value":328699},"Unified.to enabled Mycroft to achieve:",{"type":17,"tag":80,"props":328701,"children":328702},{},[328703,328713,328723],{"type":17,"tag":84,"props":328704,"children":328705},{},[328706,328711],{"type":17,"tag":48,"props":328707,"children":328708},{},[328709],{"type":23,"value":328710},"Accelerated Roadmap Execution",{"type":23,"value":328712},": By streamlining integrations, Mycroft's engineers could focus on core compliance features, redirecting 25% of development time to innovation.",{"type":17,"tag":84,"props":328714,"children":328715},{},[328716,328721],{"type":17,"tag":48,"props":328717,"children":328718},{},[328719],{"type":23,"value":328720},"Improved Customer Responsiveness",{"type":23,"value":328722},": With faster integration deployment, Mycroft could quickly meet customer requests, enhancing satisfaction and loyalty.",{"type":17,"tag":84,"props":328724,"children":328725},{},[328726,328731],{"type":17,"tag":48,"props":328727,"children":328728},{},[328729],{"type":23,"value":328730},"Competitive Parity",{"type":23,"value":328732},": Despite being a newer entrant into the space, Mycroft now matches competitors in integration offerings.",{"type":17,"tag":29,"props":328734,"children":328735},{},[328736],{"type":23,"value":328737},"Unified.to's solution also helped Mycroft secure key deals and partnerships, giving them a stronger market position.",{"type":17,"tag":29,"props":328739,"children":328740},{},[328741],{"type":23,"value":328742},"'Unified.to transformed how we add integrations at Mycroft, reducing launch time to just 15 minutes. It's not just about speed — it's allowed us to free up 25% of our development time for innovation, which directly contributed to closing key deals and positioning us as a competitive player in the market.'",{"type":17,"tag":29,"props":328744,"children":328745},{},[328746],{"type":23,"value":328747},"— Mike Kim, CEO, Mycroft",{"type":17,"tag":68,"props":328749,"children":328751},{"id":328750},"partnership-beyond-unified-apis",[328752],{"type":23,"value":328753},"Partnership beyond Unified APIs",{"type":17,"tag":29,"props":328755,"children":328756},{},[328757],{"type":23,"value":328758},"Unified.to was more than just an integration solution to Mycroft — it was a strategic partner. Mycroft's engineering team highlighted the uncomplicated onboarding process and Unified.to's collaborative approach to problem-solving.",{"type":17,"tag":29,"props":328760,"children":328761},{},[328762],{"type":23,"value":328763},"\"Unified.to isn't just a tool — they're a partner. Their collaborative approach and support have made every step of the integration process smoother, giving us the confidence to scale.\"",{"type":17,"tag":29,"props":328765,"children":328766},{},[328767],{"type":23,"value":328747},{"type":17,"tag":68,"props":328769,"children":328771},{"id":328770},"the-path-forward",[328772],{"type":23,"value":328773},"The Path Forward",{"type":17,"tag":29,"props":328775,"children":328776},{},[328777],{"type":23,"value":328778},"Looking ahead, Mycroft plans to expand its integration capabilities to support 50+ platforms, including two-way integrations (push and pull data flows). This strategy aligns with their goal of empowering compliance-focused organizations with scalable, automated data solutions.",{"type":17,"tag":29,"props":328780,"children":328781},{},[328782],{"type":23,"value":328783},"Unified.to remains a cornerstone of this strategy, providing the infrastructure and support necessary for continued innovation and growth.",{"type":17,"tag":29,"props":328785,"children":328786},{},[328787,328791,328792,328801,328802,328806,328807,328816,328817],{"type":17,"tag":48,"props":328788,"children":328789},{},[328790],{"type":23,"value":328400},{"type":23,"value":244724},{"type":17,"tag":133,"props":328793,"children":328796},{"href":328794,"rel":328795},"https://app.unified.to/?utm_source=mycroft_casestudy&utm_medium=blog&utm_campaign=mycroft_casestudy_freetrial&utm_content=connections",[214],[328797],{"type":17,"tag":48,"props":328798,"children":328799},{},[328800],{"type":23,"value":322435},{"type":23,"value":244724},{"type":17,"tag":48,"props":328803,"children":328804},{},[328805],{"type":23,"value":328416},{"type":23,"value":244724},{"type":17,"tag":133,"props":328808,"children":328811},{"href":328809,"rel":328810},"https://unified.to/contact?utm_source=mycroft_casestudy&utm_medium=blog&utm_campaign=mycroft_casestudy_contact_page&utm_content=connections",[214],[328812],{"type":17,"tag":48,"props":328813,"children":328814},{},[328815],{"type":23,"value":328427},{"type":23,"value":244724},{"type":17,"tag":48,"props":328818,"children":328819},{},[328820],{"type":23,"value":328433},{"title":7,"searchDepth":1629,"depth":1629,"links":328822},[328823,328824,328825,328826,328827,328828],{"id":44585,"depth":1629,"text":44588},{"id":328581,"depth":1629,"text":328584},{"id":328637,"depth":1629,"text":328640},{"id":328691,"depth":1629,"text":328694},{"id":328750,"depth":1629,"text":328753},{"id":328770,"depth":1629,"text":328773},"content:blog:mycroft_ships_new_integrations_in_15_minutes.md","blog/mycroft_ships_new_integrations_in_15_minutes.md","blog/mycroft_ships_new_integrations_in_15_minutes",{"_path":328833,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":328834,"description":328835,"img":328836,"date":328837,"tag":6341,"body":328838,"_type":1677,"_id":329341,"_source":1679,"_file":329342,"_stem":329343,"_extension":1682},"/blog/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials","How to register a Slack developer account and get OAuth 2 credentials","This guide walks you through how to register a Slack developer account, obtain OAuth 2 credentials, and configure scopes for your application.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials-icon.png","2025-01-03T00:00:00.000Z",{"type":14,"children":328839,"toc":329335},[328840,328845,328848,328856,328867,328871,328876,328889,328895,328953,328958,328966,328974,328980,328985,329112,329118,329149,329155,329297,329325,329330],{"type":17,"tag":18,"props":328841,"children":328843},{"id":328842},"how-to-register-a-slack-developer-account-and-get-oauth-2-credentials",[328844],{"type":23,"value":328834},{"type":17,"tag":25,"props":328846,"children":328847},{},[],{"type":17,"tag":29,"props":328849,"children":328850},{},[328851],{"type":17,"tag":33,"props":328852,"children":328853},{},[328854],{"type":23,"value":328855},"January 3, 2025",{"type":17,"tag":29,"props":328857,"children":328858},{},[328859,328861,328865],{"type":23,"value":328860},"This guide walks you through how to register a Slack developer account, obtain ",{"type":17,"tag":133,"props":328862,"children":328863},{"href":779},[328864],{"type":23,"value":782},{"type":23,"value":328866}," 2 credentials, and configure scopes for your application.",{"type":17,"tag":68,"props":328868,"children":328869},{"id":177146},[328870],{"type":23,"value":177149},{"type":17,"tag":29,"props":328872,"children":328873},{},[328874],{"type":23,"value":328875},"Make sure you have:",{"type":17,"tag":80,"props":328877,"children":328878},{},[328879,328884],{"type":17,"tag":84,"props":328880,"children":328881},{},[328882],{"type":23,"value":328883},"A Slack account",{"type":17,"tag":84,"props":328885,"children":328886},{},[328887],{"type":23,"value":328888},"Admin access to a Slack workspace where you can test your app",{"type":17,"tag":68,"props":328890,"children":328892},{"id":328891},"create-a-slack-app",[328893],{"type":23,"value":328894},"Create a Slack app",{"type":17,"tag":6154,"props":328896,"children":328897},{},[328898,328910,328918,328927,328932,328937],{"type":17,"tag":84,"props":328899,"children":328900},{},[328901,328902,328908],{"type":23,"value":146849},{"type":17,"tag":133,"props":328903,"children":328905},{"href":76293,"rel":328904},[214],[328906],{"type":23,"value":328907},"Slack API website",{"type":23,"value":328909}," and sign into your Slack account",{"type":17,"tag":84,"props":328911,"children":328912},{},[328913,328914],{"type":23,"value":6629},{"type":17,"tag":48,"props":328915,"children":328916},{},[328917],{"type":23,"value":6404},{"type":17,"tag":84,"props":328919,"children":328920},{},[328921,328922],{"type":23,"value":42950},{"type":17,"tag":48,"props":328923,"children":328924},{},[328925],{"type":23,"value":328926},"From scratch",{"type":17,"tag":84,"props":328928,"children":328929},{},[328930],{"type":23,"value":328931},"Enter your app's name",{"type":17,"tag":84,"props":328933,"children":328934},{},[328935],{"type":23,"value":328936},"Select the workspace where you want to install and test out your app",{"type":17,"tag":84,"props":328938,"children":328939},{},[328940,328941,328945,328948],{"type":23,"value":6629},{"type":17,"tag":48,"props":328942,"children":328943},{},[328944],{"type":23,"value":6525},{"type":17,"tag":3891,"props":328946,"children":328947},{},[],{"type":17,"tag":6438,"props":328949,"children":328952},{"alt":328950,"src":328951},"Screenshot_2025-01-03_at_11.13.30_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials-0.png",[],{"type":17,"tag":29,"props":328954,"children":328955},{},[328956],{"type":23,"value":328957},"After you create your app, you'll be redirected to the app's settings page where you can find your Client Id and Client Secret. Make a note of these as you will need them to activate the Slack integration on Unfiied.to.",{"type":17,"tag":29,"props":328959,"children":328960},{},[328961],{"type":17,"tag":6438,"props":328962,"children":328965},{"alt":328963,"src":328964},"Screenshot_2025-01-03_at_11.15.20_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials-1.png",[],{"type":17,"tag":29,"props":328967,"children":328968},{},[328969],{"type":17,"tag":33,"props":328970,"children":328971},{},[328972],{"type":23,"value":328973},"Note: Store these values securely - never commit them to version control!",{"type":17,"tag":68,"props":328975,"children":328977},{"id":328976},"configure-oauth-2-settings",[328978],{"type":23,"value":328979},"Configure OAuth 2 settings",{"type":17,"tag":29,"props":328981,"children":328982},{},[328983],{"type":23,"value":328984},"In addition to activating the Slack integration, you'll need to configure the redirect URL and enable the correct scopes in order to successfully authorize a connection with Unified.to.",{"type":17,"tag":6154,"props":328986,"children":328987},{},[328988,328998,329018,329035,329059],{"type":17,"tag":84,"props":328989,"children":328990},{},[328991,328993],{"type":23,"value":328992},"From your app's settings page, navigate to ",{"type":17,"tag":48,"props":328994,"children":328995},{},[328996],{"type":23,"value":328997},"OAuth & Permissions",{"type":17,"tag":84,"props":328999,"children":329000},{},[329001,329002,329007,329009],{"type":23,"value":146715},{"type":17,"tag":48,"props":329003,"children":329004},{},[329005],{"type":23,"value":329006},"Redirect URLs,",{"type":23,"value":329008}," enter: ",{"type":17,"tag":133,"props":329010,"children":329012},{"href":42417,"rel":329011},[214],[329013],{"type":17,"tag":6121,"props":329014,"children":329016},{"className":329015},[],[329017],{"type":23,"value":42417},{"type":17,"tag":84,"props":329019,"children":329020},{},[329021,329022,329027,329030],{"type":23,"value":6629},{"type":17,"tag":48,"props":329023,"children":329024},{},[329025],{"type":23,"value":329026},"Save URLs",{"type":17,"tag":3891,"props":329028,"children":329029},{},[],{"type":17,"tag":6438,"props":329031,"children":329034},{"alt":329032,"src":329033},"Screenshot_2025-01-03_at_11.18.11_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials-2.png",[],{"type":17,"tag":84,"props":329036,"children":329037},{},[329038,329040,329045,329047,329052,329054],{"type":23,"value":329039},"If you are using the SlackBot integration, use ",{"type":17,"tag":48,"props":329041,"children":329042},{},[329043],{"type":23,"value":329044},"Bot Token Scopes.",{"type":23,"value":329046},"  If not, then use ",{"type":17,"tag":48,"props":329048,"children":329049},{},[329050],{"type":23,"value":329051},"User Token Scopes.",{"type":23,"value":329053},"  click ",{"type":17,"tag":48,"props":329055,"children":329056},{},[329057],{"type":23,"value":329058},"Add an OAuth Scope",{"type":17,"tag":84,"props":329060,"children":329061},{},[329062,329064,329071,329073],{"type":23,"value":329063},"Search for and add the scopes you need for your application - refer to ",{"type":17,"tag":133,"props":329065,"children":329068},{"href":329066,"rel":329067},"https://app.unified.to/integrations/slack?tab=oauth2",[214],[329069],{"type":23,"value":329070},"this page ",{"type":23,"value":329072},"to see the scopes that are supported by Unified.",{"type":17,"tag":6154,"props":329074,"children":329075},{},[329076],{"type":17,"tag":84,"props":329077,"children":329078},{},[329079,329081],{"type":23,"value":329080},"For example, if you want to read messages, then you should choose the scopes that map to :\n",{"type":17,"tag":6154,"props":329082,"children":329083},{},[329084,329098],{"type":17,"tag":84,"props":329085,"children":329086},{},[329087,329091,329092],{"type":17,"tag":48,"props":329088,"children":329089},{},[329090],{"type":23,"value":98080},{"type":23,"value":49318},{"type":17,"tag":6121,"props":329093,"children":329095},{"className":329094},[],[329096],{"type":23,"value":329097},"im:read, mpim:read, channels:read, groups:read",{"type":17,"tag":84,"props":329099,"children":329100},{},[329101,329105,329106],{"type":17,"tag":48,"props":329102,"children":329103},{},[329104],{"type":23,"value":98096},{"type":23,"value":49318},{"type":17,"tag":6121,"props":329107,"children":329109},{"className":329108},[],[329110],{"type":23,"value":329111},"im:read, im:history, mpim:read, mpim:history, channels:history, channels:read, groups:read, groups:history",{"type":17,"tag":68,"props":329113,"children":329115},{"id":329114},"activate-the-slack-integration-with-your-credentials",[329116],{"type":23,"value":329117},"Activate the Slack integration with your credentials",{"type":17,"tag":6154,"props":329119,"children":329120},{},[329121,329139,329144],{"type":17,"tag":84,"props":329122,"children":329123},{},[329124,329125,329131,329133],{"type":23,"value":42072},{"type":17,"tag":133,"props":329126,"children":329129},{"href":329127,"rel":329128},"https://app.unified.to/integrations/slack?tab=auth",[214],[329130],{"type":23,"value":329127},{"type":23,"value":329132}," or  ",{"type":17,"tag":133,"props":329134,"children":329136},{"href":329127,"rel":329135},[214],[329137],{"type":23,"value":329138},"https://app.unified.to/integrations/slackbot?tab=auth",{"type":17,"tag":84,"props":329140,"children":329141},{},[329142],{"type":23,"value":329143},"Enter your Client ID and Client secret from the steps above",{"type":17,"tag":84,"props":329145,"children":329146},{},[329147],{"type":23,"value":329148},"Save your changes",{"type":17,"tag":18,"props":329150,"children":329152},{"id":329151},"for-a-slack-bot-follow-these-additional-instructions",[329153],{"type":23,"value":329154},"For a Slack Bot, follow these additional instructions",{"type":17,"tag":6154,"props":329156,"children":329157},{},[329158,329168,329190,329208,329220,329232,329244,329255,329278,329287],{"type":17,"tag":84,"props":329159,"children":329160},{},[329161,329163],{"type":23,"value":329162},"In the left sidebar, go to ",{"type":17,"tag":48,"props":329164,"children":329165},{},[329166],{"type":23,"value":329167},"\"App Home\"",{"type":17,"tag":84,"props":329169,"children":329170},{},[329171,329172,329177,329179,329184,329185],{"type":23,"value":42395},{"type":17,"tag":48,"props":329173,"children":329174},{},[329175],{"type":23,"value":329176},"\"Your App's Presence in Slack\"",{"type":23,"value":329178},", click ",{"type":17,"tag":48,"props":329180,"children":329181},{},[329182],{"type":23,"value":329183},"\"Add\"",{"type":23,"value":226472},{"type":17,"tag":48,"props":329186,"children":329187},{},[329188],{"type":23,"value":329189},"\"Edit\"",{"type":17,"tag":84,"props":329191,"children":329192},{},[329193,329195,329200,329201,329206],{"type":23,"value":329194},"Set a ",{"type":17,"tag":48,"props":329196,"children":329197},{},[329198],{"type":23,"value":329199},"Display Name",{"type":23,"value":42442},{"type":17,"tag":48,"props":329202,"children":329203},{},[329204],{"type":23,"value":329205},"Default Username",{"type":23,"value":329207}," for your bot",{"type":17,"tag":84,"props":329209,"children":329210},{},[329211,329213,329218],{"type":23,"value":329212},"Toggle on ",{"type":17,"tag":48,"props":329214,"children":329215},{},[329216],{"type":23,"value":329217},"\"Always Show My Bot as Online\"",{"type":23,"value":329219}," (optional)",{"type":17,"tag":84,"props":329221,"children":329222},{},[329223,329225,329230],{"type":23,"value":329224},"Go to ",{"type":17,"tag":48,"props":329226,"children":329227},{},[329228],{"type":23,"value":329229},"\"Event Subscriptions\"",{"type":23,"value":329231}," in sidebar",{"type":17,"tag":84,"props":329233,"children":329234},{},[329235,329237,329242],{"type":23,"value":329236},"Toggle ",{"type":17,"tag":48,"props":329238,"children":329239},{},[329240],{"type":23,"value":329241},"\"Enable Events\"",{"type":23,"value":329243}," to On",{"type":17,"tag":84,"props":329245,"children":329246},{},[329247,329249],{"type":23,"value":329248},"Enter the Unified webhook URL ",{"type":17,"tag":6121,"props":329250,"children":329252},{"className":329251},[],[329253],{"type":23,"value":329254},"https://api.unified.to/webhook/workspace/slackbot?workspace_id={ID}",{"type":17,"tag":84,"props":329256,"children":329257},{},[329258,329260],{"type":23,"value":329259},"Subscribe to most bot events like:\n",{"type":17,"tag":80,"props":329261,"children":329262},{},[329263,329268,329273],{"type":17,"tag":84,"props":329264,"children":329265},{},[329266],{"type":23,"value":329267},"message.channels",{"type":17,"tag":84,"props":329269,"children":329270},{},[329271],{"type":23,"value":329272},"app_mention",{"type":17,"tag":84,"props":329274,"children":329275},{},[329276],{"type":23,"value":329277},"message.im",{"type":17,"tag":84,"props":329279,"children":329280},{},[329281,329282],{"type":23,"value":42072},{"type":17,"tag":48,"props":329283,"children":329284},{},[329285],{"type":23,"value":329286},"\"Interactivity & Shortcuts\" to enable receiving information about button events",{"type":17,"tag":84,"props":329288,"children":329289},{},[329290,329292],{"type":23,"value":329291},"Toggle On and enter in ",{"type":17,"tag":6121,"props":329293,"children":329295},{"className":329294},[],[329296],{"type":23,"value":329254},{"type":17,"tag":29,"props":329298,"children":329299},{},[329300,329302,329308,329310,329316,329318,329324],{"type":23,"value":329301},"When a user authorizes your ",{"type":17,"tag":6121,"props":329303,"children":329305},{"className":329304},[],[329306],{"type":23,"value":329307},"slackbot",{"type":23,"value":329309}," integration, their user ID will be stored in ",{"type":17,"tag":6121,"props":329311,"children":329313},{"className":329312},[],[329314],{"type":23,"value":329315},"connection.auth.user_id",{"type":23,"value":329317}," and the bot ID will be stored in ",{"type":17,"tag":6121,"props":329319,"children":329321},{"className":329320},[],[329322],{"type":23,"value":329323},"connection.auth.app_id",{"type":23,"value":247759},{"type":17,"tag":29,"props":329326,"children":329327},{},[329328],{"type":23,"value":329329},"Congratulations, you're now ready to use the Slack integration in your application.",{"type":17,"tag":29,"props":329331,"children":329332},{},[329333],{"type":23,"value":329334},"Happy building!",{"title":7,"searchDepth":1629,"depth":1629,"links":329336},[329337,329338,329339,329340],{"id":177146,"depth":1629,"text":177149},{"id":328891,"depth":1629,"text":328894},{"id":328976,"depth":1629,"text":328979},{"id":329114,"depth":1629,"text":329117},"content:blog:how_to_register_a_slack_developer_account_and_get_oauth_2_credentials.md","blog/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials.md","blog/how_to_register_a_slack_developer_account_and_get_oauth_2_credentials",{"_path":329345,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":329346,"description":329347,"img":329348,"date":329349,"tag":6341,"body":329350,"_type":1677,"_id":330321,"_source":1679,"_file":330322,"_stem":330323,"_extension":1682},"/blog/how_to_build_a_discord_support_bot_with_unified_and_langbase","How to build a Discord support bot with Unified.to and Langbase","Want to build an AI-powered support bot that can answer questions with information from an knowledge base?","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_discord_support_bot_with_unified_and_langbase-icon.png","2024-12-12T00:00:00.000Z",{"type":14,"children":329351,"toc":330306},[329352,329357,329360,329368,329372,329383,329388,329392,329397,329424,329429,329433,329437,329480,329497,329511,329517,329529,329551,329557,329586,329591,329614,329620,329625,329685,329690,329696,329701,329717,329726,329738,329746,329751,329759,329768,329773,329796,329809,329815,329820,329825,329834,329848,329867,329873,329886,329891,329900,329905,329914,329930,329935,329944,329959,329964,329987,329992,330001,330016,330021,330027,330032,330040,330049,330064,330072,330081,330089,330098,330103,330121,330134,330140,330145,330154,330167,330173,330178,330187,330192,330215,330220,330238,330243,330247,330252,330274,330279,330284,330302],{"type":17,"tag":18,"props":329353,"children":329355},{"id":329354},"how-to-build-a-discord-support-bot-with-unifiedto-and-langbase",[329356],{"type":23,"value":329346},{"type":17,"tag":25,"props":329358,"children":329359},{},[],{"type":17,"tag":29,"props":329361,"children":329362},{},[329363],{"type":17,"tag":33,"props":329364,"children":329365},{},[329366],{"type":23,"value":329367},"December 12, 2024",{"type":17,"tag":29,"props":329369,"children":329370},{},[329371],{"type":23,"value":329347},{"type":17,"tag":29,"props":329373,"children":329374},{},[329375,329377,329381],{"type":23,"value":329376},"In this guide, we'll show you how to combine Unified.to's data ingestion capabilities with Langbase's AI agent framework to create a powerful support bot. We'll pull content from your customers' knowledge management system (like Notion) through Unified.to, process it with Langbase's Memory Agents, and make it available to a Discord bot, powered by Unified.to's ",{"type":17,"tag":133,"props":329378,"children":329379},{"href":14913},[329380],{"type":23,"value":27356},{"type":23,"value":329382},", so it can answer support questions.",{"type":17,"tag":29,"props":329384,"children":329385},{},[329386],{"type":23,"value":329387},"We'll be using React and Typescript in these examples, which you can adapt to fit your framework of choice.",{"type":17,"tag":68,"props":329389,"children":329390},{"id":42649},[329391],{"type":23,"value":42652},{"type":17,"tag":29,"props":329393,"children":329394},{},[329395],{"type":23,"value":329396},"This guide walks you through how to:",{"type":17,"tag":80,"props":329398,"children":329399},{},[329400,329409,329414,329419],{"type":17,"tag":84,"props":329401,"children":329402},{},[329403,329405],{"type":23,"value":329404},"Pull knowledge base content using Unified.to's ",{"type":17,"tag":133,"props":329406,"children":329407},{"href":24227},[329408],{"type":23,"value":24230},{"type":17,"tag":84,"props":329410,"children":329411},{},[329412],{"type":23,"value":329413},"Process and prepare this content using Langbase's Memory Agents",{"type":17,"tag":84,"props":329415,"children":329416},{},[329417],{"type":23,"value":329418},"Create an AI agent using Langbase Pipes",{"type":17,"tag":84,"props":329420,"children":329421},{},[329422],{"type":23,"value":329423},"Send responses through Discord using Unified.to's Messaging API",{"type":17,"tag":29,"props":329425,"children":329426},{},[329427],{"type":23,"value":329428},"By combining Unified.to's unified APIs with Langbase's AI capabilities, we get the best of both worlds: easy access to your data sources and powerful AI features without the complexity of building everything from scratch.",{"type":17,"tag":68,"props":329430,"children":329431},{"id":177146},[329432],{"type":23,"value":177149},{"type":17,"tag":29,"props":329434,"children":329435},{},[329436],{"type":23,"value":328875},{"type":17,"tag":80,"props":329438,"children":329439},{},[329440,329451,329462,329475],{"type":17,"tag":84,"props":329441,"children":329442},{},[329443,329444,329449],{"type":23,"value":9619},{"type":17,"tag":133,"props":329445,"children":329447},{"href":158861,"rel":329446},[214],[329448],{"type":23,"value":217},{"type":23,"value":329450}," account",{"type":17,"tag":84,"props":329452,"children":329453},{},[329454,329455,329461],{"type":23,"value":9619},{"type":17,"tag":133,"props":329456,"children":329458},{"href":326001,"rel":329457},[214],[329459],{"type":23,"value":329460},"Langbase",{"type":23,"value":329450},{"type":17,"tag":84,"props":329463,"children":329464},{},[329465,329467],{"type":23,"value":329466},"Access to a knowledge management system (e.g., Notion) containing your support content\n",{"type":17,"tag":80,"props":329468,"children":329469},{},[329470],{"type":17,"tag":84,"props":329471,"children":329472},{},[329473],{"type":23,"value":329474},"Unified.to allows you to easily access your customers' data and that's normally what you would use in production, but for the purposes of this guide you can follow along with your own Notion account",{"type":17,"tag":84,"props":329476,"children":329477},{},[329478],{"type":23,"value":329479},"A Discord server where you want to deploy your bot",{"type":17,"tag":3414,"props":329481,"children":329482},{},[329483],{"type":17,"tag":29,"props":329484,"children":329485},{},[329486,329488,329495],{"type":23,"value":329487},"If you don't want to use real data from Notion or Discord, you can also take advantage of Unified.to's ",{"type":17,"tag":133,"props":329489,"children":329492},{"href":329490,"rel":329491},"https://docs.unified.to/concepts/sandbox",[214],[329493],{"type":23,"value":329494},"sandbox environment",{"type":23,"value":329496}," and work with synthetic data instead.",{"type":17,"tag":29,"props":329498,"children":329499},{},[329500,329502,329509],{"type":23,"value":329501},"The following steps assume you already have your Unified.to account with your workspace ID and API key available. If you're new, check out our ",{"type":17,"tag":133,"props":329503,"children":329506},{"href":329504,"rel":329505},"https://docs.unified.to/quick-start",[214],[329507],{"type":23,"value":329508},"Quick Start guide",{"type":23,"value":329510}," to get familiar with the platform.",{"type":17,"tag":68,"props":329512,"children":329514},{"id":329513},"set-up-your-connections",[329515],{"type":23,"value":329516},"Set up your connections",{"type":17,"tag":29,"props":329518,"children":329519},{},[329520,329522,329527],{"type":23,"value":329521},"The first thing you'll do is activate your preferred KMS platform to be the source of data for your bot. We'll use Notion in this guide, but our ",{"type":17,"tag":133,"props":329523,"children":329525},{"href":23930,"rel":329524},[214],[329526],{"type":23,"value":24230},{"type":23,"value":329528}," supports 8 platforms today and more are being added on a regular basis.",{"type":17,"tag":29,"props":329530,"children":329531},{},[329532,329536,329538,329542,329544,329550],{"type":17,"tag":48,"props":329533,"children":329534},{},[329535],{"type":23,"value":103346},{"type":23,"value":329537}," If you're using the sandbox environment, for the steps below that ask you to enter your ",{"type":17,"tag":133,"props":329539,"children":329540},{"href":779},[329541],{"type":23,"value":782},{"type":23,"value":329543}," 2 credentials, just enter any random value e.g., ",{"type":17,"tag":6121,"props":329545,"children":329547},{"className":329546},[],[329548],{"type":23,"value":329549},"test123",{"type":23,"value":54},{"type":17,"tag":239,"props":329552,"children":329554},{"id":329553},"activate-notion-and-discord-integrations",[329555],{"type":23,"value":329556},"Activate Notion and Discord integrations",{"type":17,"tag":6154,"props":329558,"children":329559},{},[329560,329572,329577],{"type":17,"tag":84,"props":329561,"children":329562},{},[329563,329565],{"type":23,"value":329564},"On app.unified.to, go to the ",{"type":17,"tag":133,"props":329566,"children":329569},{"href":329567,"rel":329568},"https://app.unified.to/integrations",[214],[329570],{"type":23,"value":329571},"Integrations page",{"type":17,"tag":84,"props":329573,"children":329574},{},[329575],{"type":23,"value":329576},"Search for and select Notion",{"type":17,"tag":84,"props":329578,"children":329579},{},[329580,329582],{"type":23,"value":329581},"Choose OAuth 2, enter your credentials (which can be anything if you're using the sandbox environment), and then click ",{"type":17,"tag":48,"props":329583,"children":329584},{},[329585],{"type":23,"value":6634},{"type":17,"tag":29,"props":329587,"children":329588},{},[329589],{"type":23,"value":329590},"Repeat steps 1-3 but for Discord. If you want to use real data from Notion and Discord, check out our how-to guides on setting up with them:",{"type":17,"tag":80,"props":329592,"children":329593},{},[329594,329604],{"type":17,"tag":84,"props":329595,"children":329596},{},[329597],{"type":17,"tag":133,"props":329598,"children":329601},{"href":329599,"rel":329600},"https://docs.unified.to/guides/how_to_set_up_and_configure_notion",[214],[329602],{"type":23,"value":329603},"How to set up and configure Notion",{"type":17,"tag":84,"props":329605,"children":329606},{},[329607],{"type":17,"tag":133,"props":329608,"children":329611},{"href":329609,"rel":329610},"https://docs.unified.to/guides/how_to_get_your_discord_oauth_2_credentials_and_bot_token",[214],[329612],{"type":23,"value":329613},"How to get your Discord OAuth 2 credentials and bot token",{"type":17,"tag":239,"props":329615,"children":329617},{"id":329616},"sandbox-environment-create-a-test-connection-from-the-web-app",[329618],{"type":23,"value":329619},"(Sandbox environment) Create a test connection from the web app",{"type":17,"tag":29,"props":329621,"children":329622},{},[329623],{"type":23,"value":329624},"If you're using the sandbox environment, then you can create test connections easily from the web app.",{"type":17,"tag":6154,"props":329626,"children":329627},{},[329628,329641,329652,329668],{"type":17,"tag":84,"props":329629,"children":329630},{},[329631,329632,329639],{"type":23,"value":329564},{"type":17,"tag":133,"props":329633,"children":329636},{"href":329634,"rel":329635},"https://app.unified.to/connections",[214],[329637],{"type":23,"value":329638},"Connections",{"type":23,"value":329640}," page",{"type":17,"tag":84,"props":329642,"children":329643},{},[329644,329645,329650],{"type":23,"value":278103},{"type":17,"tag":48,"props":329646,"children":329647},{},[329648],{"type":23,"value":329649},"Create test connection",{"type":23,"value":329651}," at the top right corner of the page (note: this will only show up if your current environment is the sandbox environment)",{"type":17,"tag":84,"props":329653,"children":329654},{},[329655,329657,329661,329662,329666],{"type":23,"value":329656},"Click on the ",{"type":17,"tag":48,"props":329658,"children":329659},{},[329660],{"type":23,"value":23053},{"type":23,"value":34435},{"type":17,"tag":48,"props":329663,"children":329664},{},[329665],{"type":23,"value":15720},{"type":23,"value":329667}," integrations",{"type":17,"tag":84,"props":329669,"children":329670},{},[329671,329672,329677,329680],{"type":23,"value":6629},{"type":17,"tag":48,"props":329673,"children":329674},{},[329675],{"type":23,"value":329676},"Done",{"type":17,"tag":3891,"props":329678,"children":329679},{},[],{"type":17,"tag":6438,"props":329681,"children":329684},{"alt":329682,"src":329683},"Screenshot_2024-12-12_at_10.58.17_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_discord_support_bot_with_unified_and_langbase-0.png",[],{"type":17,"tag":29,"props":329686,"children":329687},{},[329688],{"type":23,"value":329689},"Skip ahead to the 'Pull content from your knowledge base' step below.",{"type":17,"tag":239,"props":329691,"children":329693},{"id":329692},"production-environments-add-the-authorization-component-to-your-app",[329694],{"type":23,"value":329695},"(Production environments) Add the Authorization component to your app",{"type":17,"tag":29,"props":329697,"children":329698},{},[329699],{"type":23,"value":329700},"To ask for your customers' permission to access their Notion and Discord accounts, you can add Unified.to's Authorization component to your front-end:",{"type":17,"tag":6154,"props":329702,"children":329703},{},[329704],{"type":17,"tag":84,"props":329705,"children":329706},{},[329707,329709,329715],{"type":23,"value":329708},"Add the following React component to your app. Make sure to replace ",{"type":17,"tag":6121,"props":329710,"children":329712},{"className":329711},[],[329713],{"type":23,"value":329714},"WORKSPACE_ID",{"type":23,"value":329716}," with your actual workspace ID.",{"type":17,"tag":6893,"props":329718,"children":329721},{"className":329719,"code":329720,"language":6898,"meta":7},[6896],"// TODO: Make sure to run 'npm install @unified-api/react-directory'\nimport UnifiedDirectory from '@unified-api/react-directory';\n\n\u003CUnifiedDirectory workspace_id={WORKSPACE_ID}/>\n",[329722],{"type":17,"tag":6121,"props":329723,"children":329724},{"__ignoreMap":7},[329725],{"type":23,"value":329720},{"type":17,"tag":29,"props":329727,"children":329728},{},[329729,329731,329737],{"type":23,"value":329730},"We also offer pre-built embedded components in Angular, Vue, and Svelte. See other ways to display the Authorization component in your app ",{"type":17,"tag":133,"props":329732,"children":329735},{"href":329733,"rel":329734},"https://app.unified.to/embed?tab=Authorization",[214],[329736],{"type":23,"value":243989},{"type":23,"value":54},{"type":17,"tag":80,"props":329739,"children":329740},{},[329741],{"type":17,"tag":84,"props":329742,"children":329743},{},[329744],{"type":23,"value":329745},"If your customers' mainly interact with you through message-based platforms, you could even send them the Authorization URL through an AI chat agent instead of a web front-end!",{"type":17,"tag":29,"props":329747,"children":329748},{},[329749],{"type":23,"value":329750},"The Authorization component displays a list of your integrations. When your user clicks on one of these integrations, the authorization flow will open up in a new tab. Your users will follow the steps to grant you access to their accounts. When that is done, they will be redirected back to your app (the default success URL location).",{"type":17,"tag":6154,"props":329752,"children":329753},{},[329754],{"type":17,"tag":84,"props":329755,"children":329756},{},[329757],{"type":23,"value":329758},"Handle the callback after a user authorizes an integration. The connection ID will be sent back in the success URL - we need to save this to make API calls later on. In this example, we'll save the connection ID to local storage:",{"type":17,"tag":6893,"props":329760,"children":329763},{"className":329761,"code":329762,"language":6898,"meta":7},[6896],"function handleAuthCallback() {\n  const urlParams = new URLSearchParams(window.location.search);\n  const connectionId = urlParams.get('id');\n\n  if (connectionId) {\n    console.log('New connection created:', connectionId);\n// Store this connection ID securely - you'll need it for API calls\n    localStorage.setItem('unifiedConnectionId', connectionId);\n  }\n}\n\nwindow.addEventListener('load', handleAuthCallback);\n",[329764],{"type":17,"tag":6121,"props":329765,"children":329766},{"__ignoreMap":7},[329767],{"type":23,"value":329762},{"type":17,"tag":29,"props":329769,"children":329770},{},[329771],{"type":23,"value":329772},"For this guide, you can be your own test user:",{"type":17,"tag":6154,"props":329774,"children":329775},{},[329776,329781,329786,329791],{"type":17,"tag":84,"props":329777,"children":329778},{},[329779],{"type":23,"value":329780},"Click on the Notion integration in the Authorization component",{"type":17,"tag":84,"props":329782,"children":329783},{},[329784],{"type":23,"value":329785},"Grant access to your Notion workspace",{"type":17,"tag":84,"props":329787,"children":329788},{},[329789],{"type":23,"value":329790},"Repeat for Discord",{"type":17,"tag":84,"props":329792,"children":329793},{},[329794],{"type":23,"value":329795},"Save both connection IDs - you'll need them for the next steps",{"type":17,"tag":29,"props":329797,"children":329798},{},[329799,329801,329808],{"type":23,"value":329800},"Note: In production, you should associate these connection IDs with your user's account in your database. For more information, see our guide on ",{"type":17,"tag":133,"props":329802,"children":329805},{"href":329803,"rel":329804},"https://docs.unified.to/guides/how_to_associate_a_connection_id_with_your_end_user",[214],[329806],{"type":23,"value":329807},"How to associate connection IDs with your users",{"type":23,"value":54},{"type":17,"tag":68,"props":329810,"children":329812},{"id":329811},"pull-content-from-your-knowledge-base",[329813],{"type":23,"value":329814},"Pull content from your knowledge base",{"type":17,"tag":29,"props":329816,"children":329817},{},[329818],{"type":23,"value":329819},"Now that you've got a connection ID, we can start making calls to the Unified API!",{"type":17,"tag":29,"props":329821,"children":329822},{},[329823],{"type":23,"value":329824},"First, let's write some functions to recursively fetch all content from your KMS:",{"type":17,"tag":6893,"props":329826,"children":329829},{"className":329827,"code":329828,"language":6898,"meta":7},[6896],"async function fetchContent(connectionId: string, apiKey: string) {\n  const spaces = await fetchAllSpaces(connectionId, apiKey);\n  const allContent = [];\n\n  for (const space of spaces) {\n    const pages = await fetchPagesInSpace(connectionId, apiKey, space.id);\n    allContent.push(...pages);\n  }\n\n  return allContent;\n}\n\nasync function fetchAllSpaces(connectionId: string, apiKey: string) {\n  const response = await fetch(\n    `https://api.unified.to/kms/${connectionId}/space?limit=100`,\n    {\n      headers: {\n        Authorization: `Bearer ${apiKey}`,\n      }\n    }\n  );\n\n  if (!response.ok) {\n    throw new Error(`Failed to fetch spaces: ${response.statusText}`);\n  }\n\n  return response.json();\n}\n\nasync function fetchPagesInSpace(connectionId: string, apiKey: string, spaceId: string) {\n  const response = await fetch(\n    `https://api.unified.to/kms/${connectionId}/page?limit=100&space_id=${spaceId}`,\n    {\n      headers: {\n        Authorization: `Bearer ${apiKey}`,\n      }\n    }\n  );\n\n  if (!response.ok) {\n    throw new Error(`Failed to fetch pages: ${response.statusText}`);\n  }\n\n  return response.json();\n}\n\n// Usage\nconst content = await fetchContent(CONNECTION_ID, API_KEY);\n",[329830],{"type":17,"tag":6121,"props":329831,"children":329832},{"__ignoreMap":7},[329833],{"type":23,"value":329828},{"type":17,"tag":29,"props":329835,"children":329836},{},[329837,329842,329843],{"type":17,"tag":48,"props":329838,"children":329839},{},[329840],{"type":23,"value":329841},"API reference",{"type":23,"value":49318},{"type":17,"tag":133,"props":329844,"children":329846},{"href":163519,"rel":329845},[214],[329847],{"type":23,"value":163836},{"type":17,"tag":29,"props":329849,"children":329850},{},[329851,329852,329858,329860,329866],{"type":23,"value":232104},{"type":17,"tag":6121,"props":329853,"children":329855},{"className":329854},[],[329856],{"type":23,"value":329857},"fetchContent",{"type":23,"value":329859}," in your app to see the results. You should see a collection of ",{"type":17,"tag":133,"props":329861,"children":329864},{"href":329862,"rel":329863},"https://docs.unified.to/kms/page/model",[214],[329865],{"type":23,"value":173306},{"type":23,"value":54},{"type":17,"tag":68,"props":329868,"children":329870},{"id":329869},"process-the-content-with-langbase-memory-agents",[329871],{"type":23,"value":329872},"Process the content with Langbase Memory Agents",{"type":17,"tag":29,"props":329874,"children":329875},{},[329876,329878,329884],{"type":23,"value":329877},"Now that we have our knowledge base content, we need to prepare it for AI consumption. Instead of building a complex RAG pipeline ourselves, we'll use Langbase's ",{"type":17,"tag":133,"props":329879,"children":329881},{"href":325864,"rel":329880},[214],[329882],{"type":23,"value":329883},"Memory Agents",{"type":23,"value":329885}," to handle all the heavy lifting - from text processing to embedding generation and storage.",{"type":17,"tag":29,"props":329887,"children":329888},{},[329889],{"type":23,"value":329890},"First, let's install the Langbase SDK:",{"type":17,"tag":6893,"props":329892,"children":329895},{"className":329893,"code":329894,"language":288003,"meta":7},[288001],"npm install langbase\n",[329896],{"type":17,"tag":6121,"props":329897,"children":329898},{"__ignoreMap":7},[329899],{"type":23,"value":329894},{"type":17,"tag":29,"props":329901,"children":329902},{},[329903],{"type":23,"value":329904},"Now we can create memory to store our knowledge base:",{"type":17,"tag":6893,"props":329906,"children":329909},{"className":329907,"code":329908,"language":18718,"meta":7},[18716],"import { Langbase } from 'langbase';\n\nconst langbase = new Langbase({\n  apiKey: process.env.LANGBASE_API_KEY!,\n});\n\nasync function createKnowledgeBase() {\n// Create a new memory\n  const memory = await langbase.memory.create({\n    name: 'support-bot-knowledge',\n    description: 'Knowledge base for our support bot',\n    embedding_model: 'openai:text-embedding-3-large'// Using OpenAI's latest model\n  });\n\n  return memory;\n}\n",[329910],{"type":17,"tag":6121,"props":329911,"children":329912},{"__ignoreMap":7},[329913],{"type":23,"value":329908},{"type":17,"tag":29,"props":329915,"children":329916},{},[329917,329922,329923],{"type":17,"tag":48,"props":329918,"children":329919},{},[329920],{"type":23,"value":329921},"API reference:",{"type":23,"value":18757},{"type":17,"tag":133,"props":329924,"children":329927},{"href":329925,"rel":329926},"https://langbase.com/docs/sdk/memory/create",[214],[329928],{"type":23,"value":329929},"Create memory",{"type":17,"tag":29,"props":329931,"children":329932},{},[329933],{"type":23,"value":329934},"Now let's process our Unified.to content and upload it to Langbase:",{"type":17,"tag":6893,"props":329936,"children":329939},{"className":329937,"code":329938,"language":18718,"meta":7},[18716],"async function uploadContentToMemory(pages, memoryName: string) {\n  for (const page of pages) {\n    // Download the page content from Unified.to's download_url\n    const content = await fetch(page.download_url).then(res => res.text());\n    \n    // Create a buffer from the content\n    const documentBuffer = Buffer.from(content);\n    \n    // Upload to Langbase with metadata\n    await langbase.memory.documents.upload({\n      memoryName,\n      documentName: page.title,\n      document: documentBuffer,\n      contentType: 'text/markdown', // Adjust based on your content type\n      meta: {\n        source: 'unified_kms',\n        created_at: page.created_at,\n        updated_at: page.updated_at,\n        space_id: page.space_id\n      }\n    });\n  }\n}\n",[329940],{"type":17,"tag":6121,"props":329941,"children":329942},{"__ignoreMap":7},[329943],{"type":23,"value":329938},{"type":17,"tag":29,"props":329945,"children":329946},{},[329947,329951,329952],{"type":17,"tag":48,"props":329948,"children":329949},{},[329950],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":329953,"children":329956},{"href":329954,"rel":329955},"https://langbase.com/docs/sdk/memory/document-upload",[214],[329957],{"type":23,"value":329958},"Upload document",{"type":17,"tag":29,"props":329960,"children":329961},{},[329962],{"type":23,"value":329963},"Langbase's Memory Agents will automatically:",{"type":17,"tag":6154,"props":329965,"children":329966},{},[329967,329972,329977,329982],{"type":17,"tag":84,"props":329968,"children":329969},{},[329970],{"type":23,"value":329971},"Process the text (Unified.to's data models have already cleaned the data for you!)",{"type":17,"tag":84,"props":329973,"children":329974},{},[329975],{"type":23,"value":329976},"Split content into optimal chunks",{"type":17,"tag":84,"props":329978,"children":329979},{},[329980],{"type":23,"value":329981},"Generate embeddings using state-of-the-art models",{"type":17,"tag":84,"props":329983,"children":329984},{},[329985],{"type":23,"value":329986},"Store and index everything for fast retrieval",{"type":17,"tag":29,"props":329988,"children":329989},{},[329990],{"type":23,"value":329991},"Once your content is uploaded, you can create a Pipe to handle natural language interactions. Pipes are custom AI agents that can be exposed as APIs, making them perfect for our Discord bot:",{"type":17,"tag":6893,"props":329993,"children":329996},{"className":329994,"code":329995,"language":18718,"meta":7},[18716],"async function createSupportBotPipe(memoryName: string) {\n  const pipe = await langbase.pipe.create({\n    name: 'Support Bot',\n    type: 'chat',\n    memory: memoryName,\n    description: 'Support bot powered by our knowledge base'\n  });\n\n  return pipe;\n}\n",[329997],{"type":17,"tag":6121,"props":329998,"children":329999},{"__ignoreMap":7},[330000],{"type":23,"value":329995},{"type":17,"tag":29,"props":330002,"children":330003},{},[330004,330008,330009],{"type":17,"tag":48,"props":330005,"children":330006},{},[330007],{"type":23,"value":329841},{"type":23,"value":49318},{"type":17,"tag":133,"props":330010,"children":330013},{"href":330011,"rel":330012},"https://langbase.com/docs/sdk/pipe/create",[214],[330014],{"type":23,"value":330015},"Create pipe",{"type":17,"tag":29,"props":330017,"children":330018},{},[330019],{"type":23,"value":330020},"This gives you a fully-functional RAG system with just a few API calls. No need to manage embeddings, vector stores, or complex AI infrastructure - Langbase handles all of that for you.",{"type":17,"tag":68,"props":330022,"children":330024},{"id":330023},"set-up-real-time-message-monitoring",[330025],{"type":23,"value":330026},"Set up real-time message monitoring",{"type":17,"tag":29,"props":330028,"children":330029},{},[330030],{"type":23,"value":330031},"To make your support bot responsive, you'll need to set up webhooks to receive notifications when users send messages in Discord channels.",{"type":17,"tag":6154,"props":330033,"children":330034},{},[330035],{"type":17,"tag":84,"props":330036,"children":330037},{},[330038],{"type":23,"value":330039},"Create a webhook to monitor Discord messages:",{"type":17,"tag":6893,"props":330041,"children":330044},{"className":330042,"code":330043,"language":6898,"meta":7},[6896],"async function createDiscordWebhook(connectionId: string, apiKey: string, hookUrl: string) {\n  const response = await fetch(\n    'https://api.unified.to/unified/webhook',\n    {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${apiKey}`,\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        connection_id: connectionId,\n        hook_url: hookUrl,\n        object_type: 'messaging_message',\n        event: 'created'\n      })\n    }\n  );\n\n  if (!response.ok) {\n    throw new Error(`Failed to create webhook: ${response.statusText}`);\n  }\n\n  return response.json();\n}\n\ncreateDiscordWebhook(CONNECTION_ID, API_KEY, 'https://localhost:8000/webhook')\n",[330045],{"type":17,"tag":6121,"props":330046,"children":330047},{"__ignoreMap":7},[330048],{"type":23,"value":330043},{"type":17,"tag":29,"props":330050,"children":330051},{},[330052,330056,330057],{"type":17,"tag":48,"props":330053,"children":330054},{},[330055],{"type":23,"value":329841},{"type":23,"value":49318},{"type":17,"tag":133,"props":330058,"children":330061},{"href":330059,"rel":330060},"https://docs.unified.to/unified/webhook/Create_webhook_subscription",[214],[330062],{"type":23,"value":330063},"Create a webhook",{"type":17,"tag":6154,"props":330065,"children":330066},{},[330067],{"type":17,"tag":84,"props":330068,"children":330069},{},[330070],{"type":23,"value":330071},"Set up an endpoint on your server to handle incoming webhook events. For example:",{"type":17,"tag":6893,"props":330073,"children":330076},{"className":330074,"code":330075,"language":6898,"meta":7},[6896],"app.post('/webhook', async (req, res) => {\n    // Verify webhook signature\n  const { data, webhook, nonce, sig } = req.body;\n\n    // Handle new messages\n  for (const message of data) {\n        // Ignore messages from the bot itself\n    if (message.author_member.id === BOT_USER_ID) continue;\n\n        // Process the message and generate a response\n    const response = await generateBotResponse(message.message);\n\n        // Send the response back to the channel\n    await sendDiscordResponse(\n      DISCORD_CONNECTION_ID,\n      API_KEY,\n      message.channel_id,\n      response\n    );\n  }\n\n  res.sendStatus(200);\n});\n",[330077],{"type":17,"tag":6121,"props":330078,"children":330079},{"__ignoreMap":7},[330080],{"type":23,"value":330075},{"type":17,"tag":6154,"props":330082,"children":330083},{},[330084],{"type":17,"tag":84,"props":330085,"children":330086},{},[330087],{"type":23,"value":330088},"Validate incoming webhooks (recommended):",{"type":17,"tag":6893,"props":330090,"children":330093},{"className":330091,"code":330092,"language":6898,"meta":7},[6896],"const crypto = require('crypto');\n\nfunction verifyWebhookSignature(data, nonce, signature, workspaceSecret) {\n  const hmac = crypto.createHmac('sha1', workspaceSecret);\n  const calculatedSignature = hmac\n    .update(JSON.stringify(data) + nonce)\n    .digest('base64');\n\n  return calculatedSignature === signature;\n}\n",[330094],{"type":17,"tag":6121,"props":330095,"children":330096},{"__ignoreMap":7},[330097],{"type":23,"value":330092},{"type":17,"tag":29,"props":330099,"children":330100},{},[330101],{"type":23,"value":330102},"With this setup, your bot can:",{"type":17,"tag":6154,"props":330104,"children":330105},{},[330106,330111,330116],{"type":17,"tag":84,"props":330107,"children":330108},{},[330109],{"type":23,"value":330110},"Receive notifications whenever a new message is sent in the monitored channels",{"type":17,"tag":84,"props":330112,"children":330113},{},[330114],{"type":23,"value":330115},"Process those messages through your AI pipeline",{"type":17,"tag":84,"props":330117,"children":330118},{},[330119],{"type":23,"value":330120},"Send responses back to the appropriate channel",{"type":17,"tag":29,"props":330122,"children":330123},{},[330124,330126,330133],{"type":23,"value":330125},"For more details on webhooks at Unified.to, see our ",{"type":17,"tag":133,"props":330127,"children":330130},{"href":330128,"rel":330129},"https://docs.unified.to/reference/webhooks",[214],[330131],{"type":23,"value":330132},"guide to webhooks",{"type":23,"value":54},{"type":17,"tag":68,"props":330135,"children":330137},{"id":330136},"send-responses-through-discord",[330138],{"type":23,"value":330139},"Send responses through Discord",{"type":17,"tag":29,"props":330141,"children":330142},{},[330143],{"type":23,"value":330144},"When you're ready to respond to a user's question, use our Messaging API to send the message back to Discord. Here's an example implementation with error handling and message formatting:",{"type":17,"tag":6893,"props":330146,"children":330149},{"className":330147,"code":330148,"language":6898,"meta":7},[6896],"async function sendDiscordResponse(connectionId: string, apiKey: string, channelId: string, response: string) {\n  const formattedResponse = formatDiscordMessage(response);\n\n  const apiResponse = await fetch(\n    `https://api.unified.to/messaging/${connectionId}/message`,\n    {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${apiKey}`,\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        channel_id: channelId,\n        message: formattedResponse,\n        message_html: formattedResponse, // Optional: Use for formatted text\n      })\n    }\n  );\n\n  if (!apiResponse.ok) {\n    if (apiResponse.status === 401) {\n      throw new Error('Authentication failed - check your API key');\n    } else if (apiResponse.status === 404) {\n      throw new Error('Channel not found - verify channel ID');\n    }\n    throw new Error(`Failed to send message: ${apiResponse.statusText}`);\n  }\n\n  return apiResponse.json();\n}\n\nfunction formatDiscordMessage(response) {\n  // Example formatting for Discord markdown\n  return `**Bot Response:**\\n${response}`;\n}\n\n// Example usage with different message types\nasync function sendBotResponses(connectionId, apiKey, channelId) {\n  // Simple text response\n  await sendDiscordResponse(\n    connectionId,\n    apiKey,\n    channelId,\n    'Here is the answer to your question...'\n  );\n\n  // Response with code block\n  await sendDiscordResponse(\n    connectionId,\n    apiKey,\n    channelId,\n    '```javascript\\nconst example = \"code block\";\\n```'\n  );\n\n  // Response with rich formatting\n  await sendDiscordResponse(\n    connectionId,\n    apiKey,\n    channelId,\n    '**Bold text** and *italic text* with a [link](https://example.com)'\n  );\n}\n",[330150],{"type":17,"tag":6121,"props":330151,"children":330152},{"__ignoreMap":7},[330153],{"type":23,"value":330148},{"type":17,"tag":29,"props":330155,"children":330156},{},[330157,330161,330162],{"type":17,"tag":48,"props":330158,"children":330159},{},[330160],{"type":23,"value":329841},{"type":23,"value":49318},{"type":17,"tag":133,"props":330163,"children":330165},{"href":107070,"rel":330164},[214],[330166],{"type":23,"value":24559},{"type":17,"tag":68,"props":330168,"children":330170},{"id":330169},"putting-it-all-together",[330171],{"type":23,"value":330172},"Putting it all together",{"type":17,"tag":29,"props":330174,"children":330175},{},[330176],{"type":23,"value":330177},"Here's a high-level overview of how to combine all the components into a working support bot:",{"type":17,"tag":6893,"props":330179,"children":330182},{"className":330180,"code":330181,"language":18718,"meta":7},[18716],"import { Langbase } from 'langbase';\n\nasync function initializeSupportBot() {\n    // Initialize APIs\n  const langbase = new Langbase({\n    apiKey: process.env.LANGBASE_API_KEY!\n  });\n\n    // Get connection IDs - implement these based on how you manage your users\n  const KMS_CONNECTION_ID = await getKMSConnection(user_id);\n  const DISCORD_CONNECTION_ID = await getDiscordConnection(user_id);\n  const UNIFIED_API_KEY = process.env.UNIFIED_API_KEY;\n\n    // Step 1: Fetch content from KMS\n  const kmsContent = await fetchContent(KMS_CONNECTION_ID, UNIFIED_API_KEY);\n\n    // Step 2: Set up Langbase Memory and upload content\n  const memory = await langbase.memory.create({\n    name: `support-kb-${user_id}`,\n    description: 'Knowledge base for support bot'\n  });\n\n  await uploadContentToMemory(kmsContent, memory.name);\n\n    // Step 3: Create an AI agent using Langbase Pipe\n  const pipe = await langbase.pipe.create({\n    name: `discord-support-bot`,\n    type: 'chat',\n    memory: memory.name,\n    description: 'Support bot powered by our knowledge base'\n  });\n\n    // Step 4: Set up Discord webhook for real-time messages\n  const webhook = await createDiscordWebhook(\n    DISCORD_CONNECTION_ID,\n    UNIFIED_API_KEY,\n    'https://your-server.com/webhook'\n  );\n\n    // Step 5: Handle incoming questions\n  async function handleQuestion(channelId: string, question: string) {\n    try {\n            // Use the Pipe to generate a response\n      const response = await langbase.pipe.chat({\n        pipe: pipe.name,\n        messages: [{ role: 'user', content: question }]\n      });\n\n            // Send the response back to Discord\n      await sendDiscordResponse(\n        DISCORD_CONNECTION_ID,\n        UNIFIED_API_KEY,\n        channelId,\n        response.message\n      );\n    } catch (error) {\n      console.error('Error handling question:', error);\n    }\n  }\n\n  return {\n    memory,\n    pipe,\n    webhook,\n    handleQuestion\n  };\n}\n\n// Usage example\nasync function startBot() {\n  const bot = await initializeSupportBot();\n\n    // Your webhook endpoint would call this when receiving messages\n  app.post('/webhook', async (req, res) => {\n    const { data, webhook, nonce, sig } = req.body;\n\n        // Handle new messages\n    for (const message of data) {\n            // Ignore messages from the bot itself\n      if (message.author_member.id === BOT_USER_ID) continue;\n\n      await bot.handleQuestion(message.channel_id, message.message);\n    }\n\n    res.sendStatus(200);\n  });\n}\n",[330183],{"type":17,"tag":6121,"props":330184,"children":330185},{"__ignoreMap":7},[330186],{"type":23,"value":330181},{"type":17,"tag":29,"props":330188,"children":330189},{},[330190],{"type":23,"value":330191},"This implementation:",{"type":17,"tag":6154,"props":330193,"children":330194},{},[330195,330200,330205,330210],{"type":17,"tag":84,"props":330196,"children":330197},{},[330198],{"type":23,"value":330199},"Initializes both Unified.to and Langbase clients",{"type":17,"tag":84,"props":330201,"children":330202},{},[330203],{"type":23,"value":330204},"Creates a Memory AGent to store your knowledge base content",{"type":17,"tag":84,"props":330206,"children":330207},{},[330208],{"type":23,"value":330209},"Sets up a Pipe to handle natural language interactions",{"type":17,"tag":84,"props":330211,"children":330212},{},[330213],{"type":23,"value":330214},"Configures Discord webhooks for real-time messaging",{"type":17,"tag":29,"props":330216,"children":330217},{},[330218],{"type":23,"value":330219},"The bot will now:",{"type":17,"tag":80,"props":330221,"children":330222},{},[330223,330228,330233],{"type":17,"tag":84,"props":330224,"children":330225},{},[330226],{"type":23,"value":330227},"Automatically receive messages from Discord through webhooks",{"type":17,"tag":84,"props":330229,"children":330230},{},[330231],{"type":23,"value":330232},"Process questions using your knowledge base through Langbase Pipes",{"type":17,"tag":84,"props":330234,"children":330235},{},[330236],{"type":23,"value":330237},"Send responses back to the appropriate Discord channel",{"type":17,"tag":29,"props":330239,"children":330240},{},[330241],{"type":23,"value":330242},"All of this happens with minimal infrastructure management on your part - Unified.to handles the integrations while Langbase manages the AI components.",{"type":17,"tag":68,"props":330244,"children":330245},{"id":256460},[330246],{"type":23,"value":256463},{"type":17,"tag":29,"props":330248,"children":330249},{},[330250],{"type":23,"value":330251},"Congratulations! You've built a powerful support bot by combining Unified.to's integration capabilities with Langbase's AI features. In this guide, you learned how to:",{"type":17,"tag":80,"props":330253,"children":330254},{},[330255,330260,330265,330269],{"type":17,"tag":84,"props":330256,"children":330257},{},[330258],{"type":23,"value":330259},"Pull knowledge base content from any system using Unified.to's KMS API",{"type":17,"tag":84,"props":330261,"children":330262},{},[330263],{"type":23,"value":330264},"Process and embed that content using Langbase Memory Agents",{"type":17,"tag":84,"props":330266,"children":330267},{},[330268],{"type":23,"value":329418},{"type":17,"tag":84,"props":330270,"children":330271},{},[330272],{"type":23,"value":330273},"Handle real-time messages through Discord using Unified.to's Messaging API and webhooks",{"type":17,"tag":29,"props":330275,"children":330276},{},[330277],{"type":23,"value":330278},"As an added bonus, this architecture is incredibly flexible. Since you're using Unified.to's APIs, you can easily expand your knowledge sources - want to pull content from Confluence instead of Notion? Or deploy your bot on Slack? It's just a matter of changing the connection - your core logic stays the same.",{"type":17,"tag":29,"props":330280,"children":330281},{},[330282],{"type":23,"value":330283},"And with Langbase handling the AI components, you can enhance your bot's capabilities without managing complex infrastructure:",{"type":17,"tag":80,"props":330285,"children":330286},{},[330287,330292,330297],{"type":17,"tag":84,"props":330288,"children":330289},{},[330290],{"type":23,"value":330291},"Experiment with multiple Memory Agents for different types of content",{"type":17,"tag":84,"props":330293,"children":330294},{},[330295],{"type":23,"value":330296},"Customize your Pipe's behaviour through prompt engineering",{"type":17,"tag":84,"props":330298,"children":330299},{},[330300],{"type":23,"value":330301},"Scale your bot without worrying about vector store management",{"type":17,"tag":29,"props":330303,"children":330304},{},[330305],{"type":23,"value":329334},{"title":7,"searchDepth":1629,"depth":1629,"links":330307},[330308,330309,330310,330315,330316,330317,330318,330319,330320],{"id":42649,"depth":1629,"text":42652},{"id":177146,"depth":1629,"text":177149},{"id":329513,"depth":1629,"text":329516,"children":330311},[330312,330313,330314],{"id":329553,"depth":1635,"text":329556},{"id":329616,"depth":1635,"text":329619},{"id":329692,"depth":1635,"text":329695},{"id":329811,"depth":1629,"text":329814},{"id":329869,"depth":1629,"text":329872},{"id":330023,"depth":1629,"text":330026},{"id":330136,"depth":1629,"text":330139},{"id":330169,"depth":1629,"text":330172},{"id":256460,"depth":1629,"text":256463},"content:blog:how_to_build_a_discord_support_bot_with_unified_and_langbase.md","blog/how_to_build_a_discord_support_bot_with_unified_and_langbase.md","blog/how_to_build_a_discord_support_bot_with_unified_and_langbase",{"_path":330325,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":330326,"description":330327,"img":330328,"date":330329,"tag":289978,"body":330330,"_type":1677,"_id":330716,"_source":1679,"_file":330717,"_stem":330718,"_extension":1682},"/blog/how_merchkit_accelerates_sales_by_removing_integration_uncertainty","How Merchkit accelerates sales by removing integration uncertainty","Learn how Merchkit, an AI-powered image generation and e-commerce enrichment platform, partnered with Unified.to to confidently pursue new customers without...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_merchkit_accelerates_sales_by_removing_integration_uncertainty-icon.png","2024-12-04T00:00:00.000Z",{"type":14,"children":330331,"toc":330709},[330332,330337,330340,330348,330385,330389,330398,330407,330417,330426,330436,330446,330454,330460,330465,330470,330478,330486,330492,330497,330505,330513,330518,330523,330546,330551,330557,330562,330570,330577,330582,330587,330610,330621,330626,330669,330674],{"type":17,"tag":18,"props":330333,"children":330335},{"id":330334},"how-merchkit-accelerates-sales-by-removing-integration-uncertainty",[330336],{"type":23,"value":330326},{"type":17,"tag":25,"props":330338,"children":330339},{},[],{"type":17,"tag":29,"props":330341,"children":330342},{},[330343],{"type":17,"tag":33,"props":330344,"children":330345},{},[330346],{"type":23,"value":330347},"December 4, 2024",{"type":17,"tag":29,"props":330349,"children":330350},{},[330351,330355,330356,330365,330370,330371,330379,330380],{"type":17,"tag":33,"props":330352,"children":330353},{},[330354],{"type":23,"value":290012},{"type":23,"value":18757},{"type":17,"tag":133,"props":330357,"children":330360},{"href":330358,"rel":330359},"https://merchkit.com/",[214],[330361],{"type":17,"tag":33,"props":330362,"children":330363},{},[330364],{"type":23,"value":277902},{"type":17,"tag":33,"props":330366,"children":330367},{},[330368],{"type":23,"value":330369},", an AI-powered image generation and e-commerce enrichment platform, partnered with",{"type":23,"value":18757},{"type":17,"tag":133,"props":330372,"children":330374},{"href":42620,"rel":330373},[214],[330375],{"type":17,"tag":33,"props":330376,"children":330377},{},[330378],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":33,"props":330381,"children":330382},{},[330383],{"type":23,"value":330384},"to confidently pursue new customers without worrying about integration bottlenecks slowing down their sales pipeline.",{"type":17,"tag":68,"props":330386,"children":330387},{"id":44585},[330388],{"type":23,"value":44588},{"type":17,"tag":29,"props":330390,"children":330391},{},[330392,330396],{"type":17,"tag":48,"props":330393,"children":330394},{},[330395],{"type":23,"value":328487},{"type":23,"value":330397},": AI-powered product image generation and e-commerce enrichment platform",{"type":17,"tag":29,"props":330399,"children":330400},{},[330401,330405],{"type":17,"tag":48,"props":330402,"children":330403},{},[330404],{"type":23,"value":308941},{"type":23,"value":330406},": Connect with e-commerce platforms and PIM/DAM systems to generate digital assets for retailers",{"type":17,"tag":29,"props":330408,"children":330409},{},[330410,330415],{"type":17,"tag":48,"props":330411,"children":330412},{},[330413],{"type":23,"value":330414},"Time to First Integration",{"type":23,"value":330416},": 2-3 weeks",{"type":17,"tag":29,"props":330418,"children":330419},{},[330420,330424],{"type":17,"tag":48,"props":330421,"children":330422},{},[330423],{"type":23,"value":328526},{"type":23,"value":330425},": 1 engineer",{"type":17,"tag":29,"props":330427,"children":330428},{},[330429,330434],{"type":17,"tag":48,"props":330430,"children":330431},{},[330432],{"type":23,"value":330433},"Key Challenge",{"type":23,"value":330435},": Integrating within a complex e-commerce ecosystem with numerous APIs",{"type":17,"tag":29,"props":330437,"children":330438},{},[330439,330444],{"type":17,"tag":48,"props":330440,"children":330441},{},[330442],{"type":23,"value":330443},"Primary Benefit",{"type":23,"value":330445},": Ability to confidently pursue sales without integration slowdowns",{"type":17,"tag":29,"props":330447,"children":330448},{},[330449],{"type":17,"tag":6438,"props":330450,"children":330453},{"alt":330451,"src":330452},"merchkit_unified_quote_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_merchkit_accelerates_sales_by_removing_integration_uncertainty-0.png",[],{"type":17,"tag":68,"props":330455,"children":330457},{"id":330456},"the-challenge-selling-in-a-complex-e-commerce-ecosystem",[330458],{"type":23,"value":330459},"The challenge: selling in a complex e-commerce ecosystem",{"type":17,"tag":29,"props":330461,"children":330462},{},[330463],{"type":23,"value":330464},"The e-commerce landscape is vast and complex, with data scattered across countless platforms and systems. For Merchkit, whose AI platform processes massive datasets to generate high-quality product images and descriptions, this presented a formidable challenge. Each new user represented not only a sales opportunity but also a new potential integration hurdle — different data models to learn, new APIs to master, and weeks of integration development work.",{"type":17,"tag":29,"props":330466,"children":330467},{},[330468],{"type":23,"value":330469},"With a small engineering team, Merchkit faced a critical dilemma: each new sales opportunity risked turning into weeks of integration work, pulling engineers away from core product development. Building custom integrations for each platform wouldn't just slow them down - it would make their entire sales process dependent on engineering bandwidth.",{"type":17,"tag":29,"props":330471,"children":330472},{},[330473],{"type":17,"tag":48,"props":330474,"children":330475},{},[330476],{"type":23,"value":330477},"\"E-commerce data is inherently complex because it spans across a huge range of domains in retail. With so many companies and platforms out there, having the ability to go to one place and manage one set of integrations to access all these different platforms is critical.\"",{"type":17,"tag":29,"props":330479,"children":330480},{},[330481],{"type":17,"tag":33,"props":330482,"children":330483},{},[330484],{"type":23,"value":330485},"Bijan Vaez, Co-founder & CEO",{"type":17,"tag":68,"props":330487,"children":330489},{"id":330488},"from-integration-bottleneck-to-sales-accelerator",[330490],{"type":23,"value":330491},"From integration bottleneck to sales accelerator",{"type":17,"tag":29,"props":330493,"children":330494},{},[330495],{"type":23,"value":330496},"Merchkit found their answer in Unified.to. Instead of letting integrations become a bottleneck in their sales pipeline, they could confidently engage with potential customers regardless of their tech stack. More importantly, they could offload the entire integration burden — from initial development to ongoing maintenance — onto a reliable partner.",{"type":17,"tag":29,"props":330498,"children":330499},{},[330500],{"type":17,"tag":48,"props":330501,"children":330502},{},[330503],{"type":23,"value":330504},"\"With Unified.to, we can make promises to customers about integration support and know we can deliver. Instead of having to stop everything to build integrations, we can focus on closing deals and growing our business.\"",{"type":17,"tag":29,"props":330506,"children":330507},{},[330508],{"type":17,"tag":33,"props":330509,"children":330510},{},[330511],{"type":23,"value":330512},"Bijan Vaez, Co-founder",{"type":17,"tag":29,"props":330514,"children":330515},{},[330516],{"type":23,"value":330517},"This partnership proved especially valuable when it came to managing integration complexity. For a small team, building and maintaining expertise across multiple platforms creates an ongoing operational burden. Each new integration not only meant specialized knowledge to acquire and maintain, but also additional technical complexity to document and train for — all of which pulled focus from core product development.",{"type":17,"tag":29,"props":330519,"children":330520},{},[330521],{"type":23,"value":330522},"By partnering with Unified.to, Merchkit achieved several critical advantages:",{"type":17,"tag":80,"props":330524,"children":330525},{},[330526,330531,330536,330541],{"type":17,"tag":84,"props":330527,"children":330528},{},[330529],{"type":23,"value":330530},"Maintained sales momentum without technical interruptions",{"type":17,"tag":84,"props":330532,"children":330533},{},[330534],{"type":23,"value":330535},"Kept their engineering team focused on core AI technology",{"type":17,"tag":84,"props":330537,"children":330538},{},[330539],{"type":23,"value":330540},"Eliminated the risk of losing in-house integration expertise",{"type":17,"tag":84,"props":330542,"children":330543},{},[330544],{"type":23,"value":330545},"Ensured consistent integration quality across platforms",{"type":17,"tag":29,"props":330547,"children":330548},{},[330549],{"type":23,"value":330550},"Most importantly, they could pursue new sales opportunities without worrying about technical implementation details slowing them down.",{"type":17,"tag":68,"props":330552,"children":330554},{"id":330553},"a-refreshingly-simple-approach-to-complex-integrations",[330555],{"type":23,"value":330556},"A refreshingly simple approach to complex integrations",{"type":17,"tag":29,"props":330558,"children":330559},{},[330560],{"type":23,"value":330561},"In an industry notorious for overpromising and underdelivering, Unified.to's straightforward approach caught Merchkit's attention. Here was a platform that matched its marketing with its capabilities — simple to use, yet powerful enough for enterprise needs. This commitment to transparency extended through every aspect of the platform, from its unified data models to its intuitive developer experience.",{"type":17,"tag":29,"props":330563,"children":330564},{},[330565],{"type":17,"tag":48,"props":330566,"children":330567},{},[330568],{"type":23,"value":330569},"\"The clear and open Unified data models were spot-on. Having a system that's opinionated but flexible, that you can map your schema against, makes the integration process so much smoother.\"",{"type":17,"tag":29,"props":330571,"children":330572},{},[330573],{"type":17,"tag":33,"props":330574,"children":330575},{},[330576],{"type":23,"value":330512},{"type":17,"tag":29,"props":330578,"children":330579},{},[330580],{"type":23,"value":330581},"The power of this approach became clear with their first Shopify customer. This customer had been using NetSuite's built-in connector to sync their product catalog — a process that took five business days to complete. Using Unified.to, Merchkit synced the same 130,000-product catalog in just 80 minutes. \"When we ran that sync, the customer's jaws were on the floor,\" recalls Bijan. \"They had built their entire business around that 5-day sync process.\" This dramatic improvement didn't just transform one customer's operations — it helped Merchkit demonstrate clear market traction to investors, making Unified.to an unexpected ally in their fundraising journey.",{"type":17,"tag":29,"props":330583,"children":330584},{},[330585],{"type":23,"value":330586},"This early success set the stage for future rapid expansion. As Merchkit added support for more platforms like Akeneo, they appreciated that Unified.to's excellence extended beyond just the technical platform:",{"type":17,"tag":80,"props":330588,"children":330589},{},[330590,330595,330600,330605],{"type":17,"tag":84,"props":330591,"children":330592},{},[330593],{"type":23,"value":330594},"Clear, comprehensive documentation",{"type":17,"tag":84,"props":330596,"children":330597},{},[330598],{"type":23,"value":330599},"Responsive customer support",{"type":17,"tag":84,"props":330601,"children":330602},{},[330603],{"type":23,"value":330604},"Straightforward onboarding process",{"type":17,"tag":84,"props":330606,"children":330607},{},[330608],{"type":23,"value":330609},"Broad platform coverage with deep capabilities",{"type":17,"tag":68,"props":330611,"children":330612},{"id":327029},[330613,330614,330619],{"type":23,"value":6712},{"type":17,"tag":133,"props":330615,"children":330617},{"href":42620,"rel":330616},[214],[330618],{"type":23,"value":217},{"type":23,"value":330620}," advantage",{"type":17,"tag":29,"props":330622,"children":330623},{},[330624],{"type":23,"value":330625},"Merchkit's experience demonstrates how the right integration strategy can transform both technical capabilities and business growth:",{"type":17,"tag":80,"props":330627,"children":330628},{},[330629,330639,330649,330659],{"type":17,"tag":84,"props":330630,"children":330631},{},[330632,330637],{"type":17,"tag":48,"props":330633,"children":330634},{},[330635],{"type":23,"value":330636},"Confidence in every sales conversation",{"type":23,"value":330638},": Ability to pursue any customer opportunity, knowing integration requirements won't become a bottleneck",{"type":17,"tag":84,"props":330640,"children":330641},{},[330642,330647],{"type":17,"tag":48,"props":330643,"children":330644},{},[330645],{"type":23,"value":330646},"Dramatic performance improvements",{"type":23,"value":330648},": Turning multi-day processes into hour-long operations, delighting customers and impressing investors",{"type":17,"tag":84,"props":330650,"children":330651},{},[330652,330657],{"type":17,"tag":48,"props":330653,"children":330654},{},[330655],{"type":23,"value":330656},"Engineering focus preserved",{"type":23,"value":330658},": Core team maintaining momentum on AI innovation rather than integration upkeep",{"type":17,"tag":84,"props":330660,"children":330661},{},[330662,330667],{"type":17,"tag":48,"props":330663,"children":330664},{},[330665],{"type":23,"value":330666},"Enterprise-ready from day one",{"type":23,"value":330668},": Unified data models and reliable performance meeting the needs of large-scale customers",{"type":17,"tag":29,"props":330670,"children":330671},{},[330672],{"type":23,"value":330673},"By choosing Unified.to, Merchkit transformed what could have been their biggest technical hurdle into a strategic advantage. Today, they confidently pursue customers of any size, knowing they can deliver the enterprise-grade performance these customers expect.",{"type":17,"tag":29,"props":330675,"children":330676},{},[330677,330682,330683,330692,330693,330697,330698,330704,330705],{"type":17,"tag":48,"props":330678,"children":330679},{},[330680],{"type":23,"value":330681},"Ready to remove integration uncertainty from your sales process? Start integrating with a",{"type":23,"value":18757},{"type":17,"tag":133,"props":330684,"children":330687},{"href":330685,"rel":330686},"https://app.unified.to/login?utm_source=marketing_website&utm_medium=casestudy&utm_campaign=merchkit_casestudy_freetrial&utm_content=inline_link",[214],[330688],{"type":17,"tag":48,"props":330689,"children":330690},{},[330691],{"type":23,"value":322435},{"type":23,"value":18757},{"type":17,"tag":48,"props":330694,"children":330695},{},[330696],{"type":23,"value":328416},{"type":23,"value":18757},{"type":17,"tag":133,"props":330699,"children":330702},{"href":330700,"rel":330701},"https://unified.to/contact?utm_source=marketing_website&utm_medium=casestudy&utm_campaign=merchkit_casestudy&utm_content=inline_link",[214],[330703],{"type":23,"value":328427},{"type":23,"value":18757},{"type":17,"tag":48,"props":330706,"children":330707},{},[330708],{"type":23,"value":328433},{"title":7,"searchDepth":1629,"depth":1629,"links":330710},[330711,330712,330713,330714,330715],{"id":44585,"depth":1629,"text":44588},{"id":330456,"depth":1629,"text":330459},{"id":330488,"depth":1629,"text":330491},{"id":330553,"depth":1629,"text":330556},{"id":327029,"depth":1629,"text":327032},"content:blog:how_merchkit_accelerates_sales_by_removing_integration_uncertainty.md","blog/how_merchkit_accelerates_sales_by_removing_integration_uncertainty.md","blog/how_merchkit_accelerates_sales_by_removing_integration_uncertainty",{"_path":330720,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":330721,"description":330722,"img":330723,"date":330724,"tag":12,"body":330725,"_type":1677,"_id":331463,"_source":1679,"_file":331464,"_stem":331465,"_extension":1682},"/blog/nov_2024_product_updates","Nov 2024 product updates","We're wrapping up November with two new API releases, expanded Webhook support, and 205 platform enhancements. Here's what we shipped.","https://s3.us-east-2.amazonaws.com/unified-article-images/nov_2024_product_updates-icon.png","2024-11-28T00:00:00.000Z",{"type":14,"children":330726,"toc":331454},[330727,330732,330735,330743,330751,330755,330761,330808,330813,330831,330852,330866,330872,330906,330911,330916,330959,330977,330990,330996,331001,331034,331046,331050,331055,331079,331099,331109,331115,331134,331138,331171,331197,331211,331217,331222,331230,331235,331289,331297,331302,331338,331346,331351,331369,331374,331385,331391,331396,331400,331423,331428,331440],{"type":17,"tag":18,"props":330728,"children":330730},{"id":330729},"nov-2024-product-updates",[330731],{"type":23,"value":330721},{"type":17,"tag":25,"props":330733,"children":330734},{},[],{"type":17,"tag":29,"props":330736,"children":330737},{},[330738],{"type":17,"tag":33,"props":330739,"children":330740},{},[330741],{"type":23,"value":330742},"November 28, 2024",{"type":17,"tag":29,"props":330744,"children":330745},{},[330746],{"type":17,"tag":6438,"props":330747,"children":330750},{"alt":330748,"src":330749},"unified-product-nov-2024_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/nov_2024_product_updates-0.png",[],{"type":17,"tag":29,"props":330752,"children":330753},{},[330754],{"type":23,"value":330722},{"type":17,"tag":68,"props":330756,"children":330758},{"id":330757},"unified-learning-management-system-lms-api",[330759],{"type":23,"value":330760},"Unified Learning Management System (LMS) API",{"type":17,"tag":29,"props":330762,"children":330763},{},[330764,330766,330771,330773,330777,330779,330785,330786,330793,330794,330801,330803,330807],{"type":23,"value":330765},"We've introduced the ",{"type":17,"tag":133,"props":330767,"children":330769},{"href":55248,"rel":330768},[214],[330770],{"type":23,"value":55233},{"type":23,"value":330772}," for teams building comprehensive HR and employee experience products. The ",{"type":17,"tag":133,"props":330774,"children":330775},{"href":54426},[330776],{"type":23,"value":54429},{"type":23,"value":330778}," is designed to simplify integrating with leading learning platforms and currently supports ",{"type":17,"tag":133,"props":330780,"children":330783},{"href":330781,"rel":330782},"https://unified.to/integrations/coursera",[214],[330784],{"type":23,"value":54640},{"type":23,"value":11826},{"type":17,"tag":133,"props":330787,"children":330790},{"href":330788,"rel":330789},"https://unified.to/integrations/googleclassroom",[214],[330791],{"type":23,"value":330792},"Google Classroom",{"type":23,"value":12561},{"type":17,"tag":133,"props":330795,"children":330798},{"href":330796,"rel":330797},"https://unified.to/integrations/d2l",[214],[330799],{"type":23,"value":330800},"Desire2Learn ",{"type":23,"value":330802},"(D2L). Additional integrations will be rolled out progressively. With this API, you can access key data from multiple learning systems through a single, real-time ",{"type":17,"tag":133,"props":330804,"children":330805},{"href":7691},[330806],{"type":23,"value":7459},{"type":23,"value":54},{"type":17,"tag":29,"props":330809,"children":330810},{},[330811],{"type":23,"value":330812},"This update makes it easier to:",{"type":17,"tag":80,"props":330814,"children":330815},{},[330816,330821,330826],{"type":17,"tag":84,"props":330817,"children":330818},{},[330819],{"type":23,"value":330820},"Track course enrollments, completions, and certifications across platforms",{"type":17,"tag":84,"props":330822,"children":330823},{},[330824],{"type":23,"value":330825},"Automate skill gaps analysis by combining LMS and HR data.",{"type":17,"tag":84,"props":330827,"children":330828},{},[330829],{"type":23,"value":330830},"Create personalized learning paths tailored to individual roles and goals",{"type":17,"tag":29,"props":330832,"children":330833},{},[330834,330836,330841,330843,330850],{"type":23,"value":330835},"Starting today, the Unified LMS API supports all standard operations for courses, students, instructors, and classes, along with real-time webhook updates. It pairs seamlessly with the ",{"type":17,"tag":133,"props":330837,"children":330839},{"href":58209,"rel":330838},[214],[330840],{"type":23,"value":197036},{"type":23,"value":330842}," for employee development or the ",{"type":17,"tag":133,"props":330844,"children":330847},{"href":330845,"rel":330846},"https://unified.to/task",[214],[330848],{"type":23,"value":330849},"Task Management API",{"type":23,"value":330851}," for skill tracking within projects.",{"type":17,"tag":29,"props":330853,"children":330854},{},[330855,330857,330864],{"type":23,"value":330856},"Read our ",{"type":17,"tag":133,"props":330858,"children":330861},{"href":330859,"rel":330860},"https://unified.to/blog/introducing_unified_lms_api",[214],[330862],{"type":23,"value":330863},"release article ",{"type":23,"value":330865},"to learn more.",{"type":17,"tag":68,"props":330867,"children":330869},{"id":330868},"unified-repository-api-code-repositories",[330870],{"type":23,"value":330871},"Unified Repository API (Code Repositories)",{"type":17,"tag":29,"props":330873,"children":330874},{},[330875,330877,330883,330885,330891,330892,330898,330899,330905],{"type":23,"value":330876},"We also released a second new API: the ",{"type":17,"tag":133,"props":330878,"children":330880},{"href":284766,"rel":330879},[214],[330881],{"type":23,"value":330882},"Unified Repository API,",{"type":23,"value":330884},"  built to simplify how you integrate with code hosting platforms like ",{"type":17,"tag":133,"props":330886,"children":330889},{"href":330887,"rel":330888},"https://unified.to/integrations/github",[214],[330890],{"type":23,"value":13311},{"type":23,"value":11826},{"type":17,"tag":133,"props":330893,"children":330896},{"href":330894,"rel":330895},"https://unified.to/integrations/gitlab",[214],[330897],{"type":23,"value":13320},{"type":23,"value":12561},{"type":17,"tag":133,"props":330900,"children":330903},{"href":330901,"rel":330902},"https://unified.to/integrations/bitbucket",[214],[330904],{"type":23,"value":17383},{"type":23,"value":54},{"type":17,"tag":29,"props":330907,"children":330908},{},[330909],{"type":23,"value":330910},"If you're building tools for developers or need to integrate with multiple code hosting platforms, our unified Repository API provides the fastest path to comprehensive repository integration support.",{"type":17,"tag":29,"props":330912,"children":330913},{},[330914],{"type":23,"value":330915},"Here's what you can do:",{"type":17,"tag":80,"props":330917,"children":330918},{},[330919,330929,330939,330949],{"type":17,"tag":84,"props":330920,"children":330921},{},[330922,330927],{"type":17,"tag":48,"props":330923,"children":330924},{},[330925],{"type":23,"value":330926},"Track developer activity",{"type":23,"value":330928}," with unified analytics across repositories.",{"type":17,"tag":84,"props":330930,"children":330931},{},[330932,330937],{"type":17,"tag":48,"props":330933,"children":330934},{},[330935],{"type":23,"value":330936},"Automate code quality monitoring",{"type":23,"value":330938}," to keep standards high across teams.",{"type":17,"tag":84,"props":330940,"children":330941},{},[330942,330947],{"type":17,"tag":48,"props":330943,"children":330944},{},[330945],{"type":23,"value":330946},"Streamline security compliance",{"type":23,"value":330948}," and ensure every repository meets your requirements.",{"type":17,"tag":84,"props":330950,"children":330951},{},[330952,330957],{"type":17,"tag":48,"props":330953,"children":330954},{},[330955],{"type":23,"value":330956},"Unlock unified search",{"type":23,"value":330958}," across platforms to find and reuse code faster.",{"type":17,"tag":29,"props":330960,"children":330961},{},[330962,330964,330969,330970,330975],{"type":23,"value":330963},"And that's just the start. Pair the Repository API with our ",{"type":17,"tag":133,"props":330965,"children":330967},{"href":330845,"rel":330966},[214],[330968],{"type":23,"value":110979},{"type":23,"value":75890},{"type":17,"tag":133,"props":330971,"children":330973},{"href":23930,"rel":330972},[214],[330974],{"type":23,"value":24577},{"type":23,"value":330976}," APIs for even more powerful workflows.",{"type":17,"tag":29,"props":330978,"children":330979},{},[330980,330981,330988],{"type":23,"value":330856},{"type":17,"tag":133,"props":330982,"children":330985},{"href":330983,"rel":330984},"https://unified.to/blog/introducing_unified_repository_api",[214],[330986],{"type":23,"value":330987},"release article",{"type":23,"value":330989}," to learn more.",{"type":17,"tag":68,"props":330991,"children":330993},{"id":330992},"microsoft-dynamics-365-integrations",[330994],{"type":23,"value":330995},"Microsoft Dynamics 365 Integrations",{"type":17,"tag":29,"props":330997,"children":330998},{},[330999],{"type":23,"value":331000},"Microsoft 365 is now supported through three new pre-built integrations, allowing you to deliver use-case specific features through a simplified integration with an industry-leading enterprise solution. This is particularly useful for applications targeting enterprise customers.",{"type":17,"tag":80,"props":331002,"children":331003},{},[331004,331014,331024],{"type":17,"tag":84,"props":331005,"children":331006},{},[331007,331012],{"type":17,"tag":48,"props":331008,"children":331009},{},[331010],{"type":23,"value":331011},"Business Central",{"type":23,"value":331013},": Enable your customers to sync financial data and automate invoicing or inventory updates within your product.",{"type":17,"tag":84,"props":331015,"children":331016},{},[331017,331022],{"type":17,"tag":48,"props":331018,"children":331019},{},[331020],{"type":23,"value":331021},"Customer Engagement",{"type":23,"value":331023},": Build tools that centralize customer data, helping your users track engagement history or power AI-driven recommendations.",{"type":17,"tag":84,"props":331025,"children":331026},{},[331027,331032],{"type":17,"tag":48,"props":331028,"children":331029},{},[331030],{"type":23,"value":331031},"Sales",{"type":23,"value":331033},": Create features like unified pipeline views, real-time sales analytics, and automated follow-ups across platforms.",{"type":17,"tag":29,"props":331035,"children":331036},{},[331037,331044],{"type":17,"tag":133,"props":331038,"children":331041},{"href":331039,"rel":331040},"https://app.unified.to/login?utm_source=article&utm_medium=blog&utm_campaign=nov_product_update",[214],[331042],{"type":23,"value":331043},"Sign up",{"type":23,"value":331045}," to test these integrations for free.",{"type":17,"tag":68,"props":331047,"children":331048},{"id":11629},[331049],{"type":23,"value":216420},{"type":17,"tag":29,"props":331051,"children":331052},{},[331053],{"type":23,"value":331054},"Today, Unified.to supports 220+ integrations. Every integration we add to our platform is another integration you can offer your customers. Alongside Microsoft Dynamics 365 and the new integrations in our Repository and LMS APIs, we've added:",{"type":17,"tag":29,"props":331056,"children":331057},{},[331058,331066,331067,331077],{"type":17,"tag":133,"props":331059,"children":331061},{"href":283670,"rel":331060},[214],[331062],{"type":17,"tag":48,"props":331063,"children":331064},{},[331065],{"type":23,"value":192294},{"type":23,"value":18757},{"type":17,"tag":48,"props":331068,"children":331069},{},[331070,331072,331076],{"type":23,"value":331071},"(Unified ",{"type":17,"tag":133,"props":331073,"children":331074},{"href":106471},[331075],{"type":23,"value":106474},{"type":23,"value":12034},{"type":23,"value":331078},": a customer engagement platform for personalized, data-driven messaging. This integration supports marketing lists and marketing members.",{"type":17,"tag":29,"props":331080,"children":331081},{},[331082,331091,331092,331097],{"type":17,"tag":133,"props":331083,"children":331086},{"href":331084,"rel":331085},"https://unified.to/integrations/firefish",[214],[331087],{"type":17,"tag":48,"props":331088,"children":331089},{},[331090],{"type":23,"value":319691},{"type":23,"value":18757},{"type":17,"tag":48,"props":331093,"children":331094},{},[331095],{"type":23,"value":331096},"(Unified ATS API)",{"type":23,"value":331098},": Firefish is a recruitment platform that combines applicant tracking, CRM, and marketing features. This integration supports employee, job, candidate, company, application, and candidate activity data.",{"type":17,"tag":29,"props":331100,"children":331101},{},[331102,331108],{"type":17,"tag":133,"props":331103,"children":331106},{"href":331104,"rel":331105},"https://app.unified.to/login?utm_source=blog&utm_medium=blog&utm_campaign=blog_novupdate_signup",[214],[331107],{"type":23,"value":331043},{"type":23,"value":331045},{"type":17,"tag":68,"props":331110,"children":331112},{"id":331111},"e-commerce-metadata-object",[331113],{"type":23,"value":331114},"E-commerce MetaData Object",{"type":17,"tag":29,"props":331116,"children":331117},{},[331118,331120,331126,331127,331132],{"type":23,"value":331119},"We've added a new object to the ",{"type":17,"tag":133,"props":331121,"children":331123},{"href":19380,"rel":331122},[214],[331124],{"type":23,"value":331125},"E-Commerce API",{"type":23,"value":49318},{"type":17,"tag":48,"props":331128,"children":331129},{},[331130],{"type":23,"value":331131},"commerce_metadata",{"type":23,"value":331133},". This makes managing metadata in commerce integrations more structured and scalable.",{"type":17,"tag":29,"props":331135,"children":331136},{},[331137],{"type":23,"value":330915},{"type":17,"tag":80,"props":331139,"children":331140},{},[331141,331151,331161],{"type":17,"tag":84,"props":331142,"children":331143},{},[331144,331149],{"type":17,"tag":48,"props":331145,"children":331146},{},[331147],{"type":23,"value":331148},"Reuse metadata",{"type":23,"value":331150},": Define and share metadata fields across multiple items, collections, or variants.",{"type":17,"tag":84,"props":331152,"children":331153},{},[331154,331159],{"type":17,"tag":48,"props":331155,"children":331156},{},[331157],{"type":23,"value":331158},"Add context",{"type":23,"value":331160},": Include field types and additional details for better organization.",{"type":17,"tag":84,"props":331162,"children":331163},{},[331164,331169],{"type":17,"tag":48,"props":331165,"children":331166},{},[331167],{"type":23,"value":331168},"Improve scalability",{"type":23,"value":331170},": Simplify management of large catalogs with shared metadata fields.",{"type":17,"tag":29,"props":331172,"children":331173},{},[331174,331176,331185,331186,331195],{"type":23,"value":331175},"Currently available for ",{"type":17,"tag":133,"props":331177,"children":331180},{"href":331178,"rel":331179},"https://unified.to/integrations/akeneo",[214],[331181],{"type":17,"tag":48,"props":331182,"children":331183},{},[331184],{"type":23,"value":38887},{"type":23,"value":34435},{"type":17,"tag":133,"props":331187,"children":331190},{"href":331188,"rel":331189},"https://unified.to/integrations/shopify",[214],[331191],{"type":17,"tag":48,"props":331192,"children":331193},{},[331194],{"type":23,"value":37435},{"type":23,"value":331196},", the commerce_metadata object allows you to retrieve and list metadata definitions. This update makes it easier to build more adaptable and efficient commerce solutions.",{"type":17,"tag":29,"props":331198,"children":331199},{},[331200,331202,331209],{"type":23,"value":331201},"Read ",{"type":17,"tag":133,"props":331203,"children":331206},{"href":331204,"rel":331205},"https://docs.unified.to/commerce/overview",[214],[331207],{"type":23,"value":331208},"our docs",{"type":23,"value":331210}," to learn more about E-commerce",{"type":17,"tag":68,"props":331212,"children":331214},{"id":331213},"expanded-webhook-capabilities",[331215],{"type":23,"value":331216},"Expanded Webhook Capabilities",{"type":17,"tag":29,"props":331218,"children":331219},{},[331220],{"type":23,"value":331221},"We've been on a mission to expand both native and virtual webhook coverage across our platform, ensuring real-time updates across the board. We've increased webhook availability to 48% over the last month. Here are some webhook highlights.",{"type":17,"tag":29,"props":331223,"children":331224},{},[331225],{"type":17,"tag":48,"props":331226,"children":331227},{},[331228],{"type":23,"value":331229},"Virtual Webhook Enhancements",{"type":17,"tag":29,"props":331231,"children":331232},{},[331233],{"type":23,"value":331234},"We've added virtual webhooks for even more objects, enabling real-time updates for platforms that don't natively support webhooks:",{"type":17,"tag":80,"props":331236,"children":331237},{},[331238,331249,331259,331269,331279],{"type":17,"tag":84,"props":331239,"children":331240},{},[331241,331247],{"type":17,"tag":133,"props":331242,"children":331245},{"href":331243,"rel":331244},"https://unified.to/integrations/mailchimp",[214],[331246],{"type":23,"value":192271},{"type":23,"value":331248},": Member",{"type":17,"tag":84,"props":331250,"children":331251},{},[331252,331258],{"type":17,"tag":133,"props":331253,"children":331256},{"href":331254,"rel":331255},"https://unified.to/integrations/klaviyo",[214],[331257],{"type":23,"value":192288},{"type":23,"value":331248},{"type":17,"tag":84,"props":331260,"children":331261},{},[331262,331268],{"type":17,"tag":133,"props":331263,"children":331266},{"href":331264,"rel":331265},"https://unified.to/integrations/activecampaign",[214],[331267],{"type":23,"value":192282},{"type":23,"value":331248},{"type":17,"tag":84,"props":331270,"children":331271},{},[331272,331277],{"type":17,"tag":133,"props":331273,"children":331275},{"href":330887,"rel":331274},[214],[331276],{"type":23,"value":13311},{"type":23,"value":331278},": Commit, Branch, Pullrequest",{"type":17,"tag":84,"props":331280,"children":331281},{},[331282,331287],{"type":17,"tag":133,"props":331283,"children":331285},{"href":330894,"rel":331284},[214],[331286],{"type":23,"value":13320},{"type":23,"value":331288},": Commit",{"type":17,"tag":29,"props":331290,"children":331291},{},[331292],{"type":17,"tag":48,"props":331293,"children":331294},{},[331295],{"type":23,"value":331296},"Native Webhook Enhancements",{"type":17,"tag":29,"props":331298,"children":331299},{},[331300],{"type":23,"value":331301},"Native webhook coverage has also expanded, ensuring faster, event-driven updates for supported platforms:",{"type":17,"tag":80,"props":331303,"children":331304},{},[331305,331316,331327],{"type":17,"tag":84,"props":331306,"children":331307},{},[331308,331314],{"type":17,"tag":133,"props":331309,"children":331312},{"href":331310,"rel":331311},"https://unified.to/integrations/slack",[214],[331313],{"type":23,"value":3204},{"type":23,"value":331315},": Channel (created, updated, deleted)",{"type":17,"tag":84,"props":331317,"children":331318},{},[331319,331325],{"type":17,"tag":133,"props":331320,"children":331323},{"href":331321,"rel":331322},"https://unified.to/integrations/clickup",[214],[331324],{"type":23,"value":12568},{"type":23,"value":331326},": Task and Project (created, updated, deleted)",{"type":17,"tag":84,"props":331328,"children":331329},{},[331330,331336],{"type":17,"tag":133,"props":331331,"children":331334},{"href":331332,"rel":331333},"https://unified.to/integrations/zendesk",[214],[331335],{"type":23,"value":15738},{"type":23,"value":331337},": Channel, Message, Page, Employee, Customer (created, updated, deleted)",{"type":17,"tag":29,"props":331339,"children":331340},{},[331341],{"type":17,"tag":48,"props":331342,"children":331343},{},[331344],{"type":23,"value":331345},"Pagination Support for Webhooks",{"type":17,"tag":29,"props":331347,"children":331348},{},[331349],{"type":23,"value":331350},"We've introduced advanced pagination options for webhook events, improving scalability and performance:",{"type":17,"tag":80,"props":331352,"children":331353},{},[331354,331359,331364],{"type":17,"tag":84,"props":331355,"children":331356},{},[331357],{"type":23,"value":331358},"GitHub: Commit, Branch, Pullrequest, Repository",{"type":17,"tag":84,"props":331360,"children":331361},{},[331362],{"type":23,"value":331363},"BitBucket: Commit",{"type":17,"tag":84,"props":331365,"children":331366},{},[331367],{"type":23,"value":331368},"JobScore: Document, Activity",{"type":17,"tag":29,"props":331370,"children":331371},{},[331372],{"type":23,"value":331373},"Our webhooks make it easier to access real-time data from more of our integrations.",{"type":17,"tag":29,"props":331375,"children":331376},{},[331377,331378,331383],{"type":23,"value":330856},{"type":17,"tag":133,"props":331379,"children":331381},{"href":327403,"rel":331380},[214],[331382],{"type":23,"value":122437},{"type":23,"value":331384}," to learn more",{"type":17,"tag":68,"props":331386,"children":331388},{"id":331387},"improved-connections-and-embedded-components-pages",[331389],{"type":23,"value":331390},"Improved connections and embedded components pages",{"type":17,"tag":29,"props":331392,"children":331393},{},[331394],{"type":23,"value":331395},"We've made updates to the Connections and Embedded Components pages to simplify your workflow and reduce friction when integrating Unified.to into your app.",{"type":17,"tag":29,"props":331397,"children":331398},{},[331399],{"type":23,"value":325254},{"type":17,"tag":80,"props":331401,"children":331402},{},[331403,331413],{"type":17,"tag":84,"props":331404,"children":331405},{},[331406,331411],{"type":17,"tag":48,"props":331407,"children":331408},{},[331409],{"type":23,"value":331410},"Connections Page",{"type":23,"value":331412},": Create test connections in the sandbox environment with just the click of a button.",{"type":17,"tag":84,"props":331414,"children":331415},{},[331416,331421],{"type":17,"tag":48,"props":331417,"children":331418},{},[331419],{"type":23,"value":331420},"Embedded Components Page",{"type":23,"value":331422},": We've split up the configuration options and improved the layout of the page, providing a smoother setup experience.",{"type":17,"tag":29,"props":331424,"children":331425},{},[331426],{"type":23,"value":331427},"These updates are designed to improve usability and make it faster to get started with Unified.to. Explore the updated pages and experience the improvements firsthand.",{"type":17,"tag":29,"props":331429,"children":331430},{},[331431,331433,331438],{"type":23,"value":331432},"To see all of the month's releases, visit the ",{"type":17,"tag":133,"props":331434,"children":331436},{"href":47029,"rel":331435},[214],[331437],{"type":23,"value":47033},{"type":23,"value":331439},". Thanks for reading!",{"type":17,"tag":29,"props":331441,"children":331442},{},[331443,331445],{"type":23,"value":331444},"Ready to launch integrations faster? ",{"type":17,"tag":133,"props":331446,"children":331449},{"href":331447,"rel":331448},"https://app.unified.to/login?utm_source=article&utm_medium=blog&utm_campaign=oct_product_update",[214],[331450],{"type":17,"tag":48,"props":331451,"children":331452},{},[331453],{"type":23,"value":215326},{"title":7,"searchDepth":1629,"depth":1629,"links":331455},[331456,331457,331458,331459,331460,331461,331462],{"id":330757,"depth":1629,"text":330760},{"id":330868,"depth":1629,"text":330871},{"id":330992,"depth":1629,"text":330995},{"id":11629,"depth":1629,"text":216420},{"id":331111,"depth":1629,"text":331114},{"id":331213,"depth":1629,"text":331216},{"id":331387,"depth":1629,"text":331390},"content:blog:nov_2024_product_updates.md","blog/nov_2024_product_updates.md","blog/nov_2024_product_updates",{"_path":331467,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":331468,"description":331469,"img":331470,"date":330724,"tag":12,"body":331471,"_type":1677,"_id":331974,"_source":1679,"_file":331975,"_stem":331976,"_extension":1682},"/blog/unified_lms_api_sync_courses_enrollments_and_learning_data_across_platforms","Unified LMS API: Sync Courses, Enrollments, and Learning Data Across Platforms","We're excited to announce our newest API category, Learning Management Systems (LMS). If your product needs to access course data, track learner progress, or...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_lms_api_sync_courses_enrollments_and_learning_data_across_platforms-icon.png",{"type":14,"children":331472,"toc":331963},[331473,331478,331481,331488,331493,331503,331508,331545,331557,331562,331568,331573,331583,331594,331605,331611,331644,331664,331668,331696,331702,331759,331764,331770,331775,331793,331802,331807,331813,331818,331841,331846,331852,331857,331862,331867,331873,331897,331917,331924,331953,331958],{"type":17,"tag":18,"props":331474,"children":331476},{"id":331475},"unified-lms-api-sync-courses-enrollments-and-learning-data-across-platforms",[331477],{"type":23,"value":331468},{"type":17,"tag":25,"props":331479,"children":331480},{},[],{"type":17,"tag":29,"props":331482,"children":331483},{},[331484],{"type":17,"tag":33,"props":331485,"children":331486},{},[331487],{"type":23,"value":330742},{"type":17,"tag":29,"props":331489,"children":331490},{},[331491],{"type":23,"value":331492},"We're excited to announce our newest API category: Learning Management Systems (LMS). If your product needs to access course data, track learner progress, or sync training systems, you quickly run into fragmented LMS APIs, inconsistent data models, and platform-specific integration logic.",{"type":17,"tag":29,"props":331494,"children":331495},{},[331496,331497,331501],{"type":23,"value":149272},{"type":17,"tag":133,"props":331498,"children":331499},{"href":54426},[331500],{"type":23,"value":54429},{"type":23,"value":331502}," provides a single interface to retrieve and manage learning data across platforms, with normalized objects and real-time access.",{"type":17,"tag":29,"props":331504,"children":331505},{},[331506],{"type":23,"value":331507},"Our unified LMS API currently supports:",{"type":17,"tag":80,"props":331509,"children":331510},{},[331511,331515,331520,331524,331528,331532,331536,331541],{"type":17,"tag":84,"props":331512,"children":331513},{},[331514],{"type":23,"value":54640},{"type":17,"tag":84,"props":331516,"children":331517},{},[331518],{"type":23,"value":331519},"D2L Brightspace",{"type":17,"tag":84,"props":331521,"children":331522},{},[331523],{"type":23,"value":54758},{"type":17,"tag":84,"props":331525,"children":331526},{},[331527],{"type":23,"value":330792},{"type":17,"tag":84,"props":331529,"children":331530},{},[331531],{"type":23,"value":54871},{"type":17,"tag":84,"props":331533,"children":331534},{},[331535],{"type":23,"value":54928},{"type":17,"tag":84,"props":331537,"children":331538},{},[331539],{"type":23,"value":331540},"SAP SuccessFactors (LMS)",{"type":17,"tag":84,"props":331542,"children":331543},{},[331544],{"type":23,"value":59319},{"type":17,"tag":29,"props":331546,"children":331547},{},[331548,331550,331556],{"type":23,"value":331549},"Additional LMS integrations are expanding as part of this category. Looking for another learning platform? ",{"type":17,"tag":133,"props":331551,"children":331553},{"href":215330,"rel":331552},[214],[331554],{"type":23,"value":331555},"Share your integration request",{"type":23,"value":54},{"type":17,"tag":29,"props":331558,"children":331559},{},[331560],{"type":23,"value":331561},"In this article, you'll learn about leading LMS platforms, practical use cases, and how Unified.to's LMS API can streamline your integration development.",{"type":17,"tag":68,"props":331563,"children":331565},{"id":331564},"supported-lms-platforms",[331566],{"type":23,"value":331567},"Supported LMS platforms",{"type":17,"tag":29,"props":331569,"children":331570},{},[331571],{"type":23,"value":331572},"Learning Management Systems serve as the backbone of modern education and corporate training, providing course management, student tracking, and learning analytics. Here's an overview of the major platforms we support:",{"type":17,"tag":29,"props":331574,"children":331575},{},[331576,331581],{"type":17,"tag":133,"props":331577,"children":331579},{"href":330781,"rel":331578},[214],[331580],{"type":23,"value":54640},{"type":23,"value":331582},": A leading online learning platform known for partnerships with top universities and organizations worldwide. Coursera offers professional certificates, guided projects, and full degree programs, making it particularly popular for corporate upskilling programs.",{"type":17,"tag":29,"props":331584,"children":331585},{},[331586,331592],{"type":17,"tag":133,"props":331587,"children":331590},{"href":331588,"rel":331589},"https://unified.to/integrations/google-classroom",[214],[331591],{"type":23,"value":330792},{"type":23,"value":331593},": Part of Google Workspace, Google Classroom provides a streamlined, easy-to-use platform for course management and virtual learning. Its deep integration with other Google services makes it a popular choice for educational institutions and businesses already using Google Workspace.",{"type":17,"tag":29,"props":331595,"children":331596},{},[331597,331603],{"type":17,"tag":133,"props":331598,"children":331600},{"href":330796,"rel":331599},[214],[331601],{"type":23,"value":331602},"Desire2Learn",{"type":23,"value":331604},": A comprehensive learning platform that combines traditional LMS features with advanced analytics and personalized learning paths. D2L is particularly useful in higher education and corporate training settings where detailed learning analytics are crucial.",{"type":17,"tag":68,"props":331606,"children":331608},{"id":331607},"what-teams-build-with-the-lms-api",[331609],{"type":23,"value":331610},"What teams build with the LMS API",{"type":17,"tag":80,"props":331612,"children":331613},{},[331614,331619,331624,331629,331634,331639],{"type":17,"tag":84,"props":331615,"children":331616},{},[331617],{"type":23,"value":331618},"Unified dashboards for course progress and completion",{"type":17,"tag":84,"props":331620,"children":331621},{},[331622],{"type":23,"value":331623},"Cross-platform course and content synchronization",{"type":17,"tag":84,"props":331625,"children":331626},{},[331627],{"type":23,"value":331628},"Employee training systems integrated with HR data",{"type":17,"tag":84,"props":331630,"children":331631},{},[331632],{"type":23,"value":331633},"Certification and compliance tracking",{"type":17,"tag":84,"props":331635,"children":331636},{},[331637],{"type":23,"value":331638},"AI systems analyzing learning activity and engagement",{"type":17,"tag":84,"props":331640,"children":331641},{},[331642],{"type":23,"value":331643},"Learning data pipelines feeding analytics or internal tools",{"type":17,"tag":29,"props":331645,"children":331646},{},[331647,331649,331655,331656,331663],{"type":23,"value":331648},"Have questions about your specific use case? ",{"type":17,"tag":133,"props":331650,"children":331652},{"href":215330,"rel":331651},[214],[331653],{"type":23,"value":331654},"Meet with an expert",{"type":23,"value":75890},{"type":17,"tag":133,"props":331657,"children":331660},{"href":331658,"rel":331659},"https://discord.com/invite/85z7HF7JbD",[214],[331661],{"type":23,"value":331662},"join our Discord community",{"type":23,"value":54},{"type":17,"tag":68,"props":331665,"children":331666},{"id":182585},[331667],{"type":23,"value":182588},{"type":17,"tag":80,"props":331669,"children":331670},{},[331671,331676,331681,331686,331691],{"type":17,"tag":84,"props":331672,"children":331673},{},[331674],{"type":23,"value":331675},"HR and HRIS platforms managing employee training",{"type":17,"tag":84,"props":331677,"children":331678},{},[331679],{"type":23,"value":331680},"EdTech platforms aggregating learning content",{"type":17,"tag":84,"props":331682,"children":331683},{},[331684],{"type":23,"value":331685},"Marketplaces offering courses across providers",{"type":17,"tag":84,"props":331687,"children":331688},{},[331689],{"type":23,"value":331690},"Internal tools tracking learning and certification data",{"type":17,"tag":84,"props":331692,"children":331693},{},[331694],{"type":23,"value":331695},"AI systems analyzing learner behavior and outcomes",{"type":17,"tag":68,"props":331697,"children":331699},{"id":331698},"core-objects-in-the-lms-api",[331700],{"type":23,"value":331701},"Core objects in the LMS API",{"type":17,"tag":80,"props":331703,"children":331704},{},[331705,331714,331723,331732,331741,331750],{"type":17,"tag":84,"props":331706,"children":331707},{},[331708,331712],{"type":17,"tag":48,"props":331709,"children":331710},{},[331711],{"type":23,"value":194860},{"type":23,"value":331713},": course metadata, structure, pricing, and configuration",{"type":17,"tag":84,"props":331715,"children":331716},{},[331717,331721],{"type":17,"tag":48,"props":331718,"children":331719},{},[331720],{"type":23,"value":194989},{"type":23,"value":331722},": learner profiles and enrollment relationships",{"type":17,"tag":84,"props":331724,"children":331725},{},[331726,331730],{"type":17,"tag":48,"props":331727,"children":331728},{},[331729],{"type":23,"value":195042},{"type":23,"value":331731},": course owners and educators",{"type":17,"tag":84,"props":331733,"children":331734},{},[331735,331739],{"type":17,"tag":48,"props":331736,"children":331737},{},[331738],{"type":23,"value":55314},{"type":23,"value":331740},": modules, lessons, and media assets",{"type":17,"tag":84,"props":331742,"children":331743},{},[331744,331748],{"type":17,"tag":48,"props":331745,"children":331746},{},[331747],{"type":23,"value":38941},{"type":23,"value":331749},": grouped learning materials",{"type":17,"tag":84,"props":331751,"children":331752},{},[331753,331757],{"type":17,"tag":48,"props":331754,"children":331755},{},[331756],{"type":23,"value":33999},{"type":23,"value":331758},": progress, completion, and engagement data",{"type":17,"tag":29,"props":331760,"children":331761},{},[331762],{"type":23,"value":331763},"These objects follow consistent schemas across LMS providers, reducing the need to map platform-specific data models.",{"type":17,"tag":68,"props":331765,"children":331767},{"id":331766},"real-time-access-to-learning-data",[331768],{"type":23,"value":331769},"Real-time access to learning data",{"type":17,"tag":29,"props":331771,"children":331772},{},[331773],{"type":23,"value":331774},"The LMS API retrieves and updates data in real time:",{"type":17,"tag":80,"props":331776,"children":331777},{},[331778,331783,331788],{"type":17,"tag":84,"props":331779,"children":331780},{},[331781],{"type":23,"value":331782},"Requests are routed directly to the source LMS",{"type":17,"tag":84,"props":331784,"children":331785},{},[331786],{"type":23,"value":331787},"No polling or background sync jobs",{"type":17,"tag":84,"props":331789,"children":331790},{},[331791],{"type":23,"value":331792},"No cached or stored customer data",{"type":17,"tag":29,"props":331794,"children":331795},{},[331796,331800],{"type":17,"tag":133,"props":331797,"children":331798},{"href":4999},[331799],{"type":23,"value":43896},{"type":23,"value":331801}," provide updates for changes such as course activity and completion status.",{"type":17,"tag":29,"props":331803,"children":331804},{},[331805],{"type":23,"value":331806},"Courses, enrollments, and activity data are normalized across providers, allowing systems to work with consistent schemas regardless of the underlying LMS.",{"type":17,"tag":68,"props":331808,"children":331810},{"id":331809},"using-lms-data-in-ai-systems",[331811],{"type":23,"value":331812},"Using LMS data in AI systems",{"type":17,"tag":29,"props":331814,"children":331815},{},[331816],{"type":23,"value":331817},"Learning data can be used to:",{"type":17,"tag":80,"props":331819,"children":331820},{},[331821,331826,331831,331836],{"type":17,"tag":84,"props":331822,"children":331823},{},[331824],{"type":23,"value":331825},"Recommend courses based on learner behavior",{"type":17,"tag":84,"props":331827,"children":331828},{},[331829],{"type":23,"value":331830},"Identify skill gaps from completion and activity data",{"type":17,"tag":84,"props":331832,"children":331833},{},[331834],{"type":23,"value":331835},"Generate summaries of learning progress",{"type":17,"tag":84,"props":331837,"children":331838},{},[331839],{"type":23,"value":331840},"Trigger actions based on engagement or completion",{"type":17,"tag":29,"props":331842,"children":331843},{},[331844],{"type":23,"value":331845},"Because data is accessed in real time, AI systems operate on current learning activity.",{"type":17,"tag":68,"props":331847,"children":331849},{"id":331848},"unifiedtos-lms-api",[331850],{"type":23,"value":331851},"Unified.to's LMS API",{"type":17,"tag":29,"props":331853,"children":331854},{},[331855],{"type":23,"value":331856},"Our LMS API streamlines integration with learning management platforms. By unifying multiple LMS APIs into a single, consistent interface, we eliminate the complexity of managing multiple API integrations and data formats.",{"type":17,"tag":29,"props":331858,"children":331859},{},[331860],{"type":23,"value":331861},"The API supports all standard CRUD operations for courses, students, instructors, and classes, as well as webhooks for real-time updates on activity, completion, and course changes. This comprehensive coverage ensures you can build powerful applications without worrying about platform-specific implementation details.",{"type":17,"tag":29,"props":331863,"children":331864},{},[331865],{"type":23,"value":331866},"The LMS API supports read and write operations for core objects, allowing systems to create, update, and manage learning data across platforms.",{"type":17,"tag":68,"props":331868,"children":331870},{"id":331869},"combining-lms-with-other-apis",[331871],{"type":23,"value":331872},"Combining LMS with other APIs",{"type":17,"tag":80,"props":331874,"children":331875},{},[331876,331888],{"type":17,"tag":84,"props":331877,"children":331878},{},[331879,331886],{"type":17,"tag":48,"props":331880,"children":331881},{},[331882],{"type":17,"tag":133,"props":331883,"children":331884},{"href":60186},[331885],{"type":23,"value":60189},{"type":23,"value":331887},": align training with employee data and performance",{"type":17,"tag":84,"props":331889,"children":331890},{},[331891,331895],{"type":17,"tag":48,"props":331892,"children":331893},{},[331894],{"type":23,"value":55699},{"type":23,"value":331896},": connect learning outcomes to hiring and candidate evaluation",{"type":17,"tag":29,"props":331898,"children":331899},{},[331900,331902,331907,331909,331915],{"type":23,"value":331901},"The LMS API is available on all ",{"type":17,"tag":133,"props":331903,"children":331905},{"href":42620,"rel":331904},[214],[331906],{"type":23,"value":217},{"type":23,"value":331908}," plans. ",{"type":17,"tag":133,"props":331910,"children":331912},{"href":1612,"rel":331911},[214],[331913],{"type":23,"value":331914},"Get started for free",{"type":23,"value":331916}," and begin building with unified learning management data today.",{"type":17,"tag":29,"props":331918,"children":331919},{},[331920],{"type":17,"tag":48,"props":331921,"children":331922},{},[331923],{"type":23,"value":244383},{"type":17,"tag":80,"props":331925,"children":331926},{},[331927,331937,331944],{"type":17,"tag":84,"props":331928,"children":331929},{},[331930],{"type":17,"tag":133,"props":331931,"children":331934},{"href":331932,"rel":331933},"https://docs.unified.to/lms/overview",[214],[331935],{"type":23,"value":331936},"Read our LMS API overview",{"type":17,"tag":84,"props":331938,"children":331939},{},[331940],{"type":17,"tag":11616,"props":331941,"children":331943},{"width":11618,"height":11619,"src":331942,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/VAu1qHZoeX4?feature=shared",[],{"type":17,"tag":84,"props":331945,"children":331946},{},[331947],{"type":17,"tag":133,"props":331948,"children":331950},{"href":176923,"rel":331949},[214],[331951],{"type":23,"value":331952},"Explore all our developer guides",{"type":17,"tag":68,"props":331954,"children":331955},{"id":54413},[331956],{"type":23,"value":331957},"What is an LMS API?",{"type":17,"tag":29,"props":331959,"children":331960},{},[331961],{"type":23,"value":331962},"An LMS API allows developers to access and manage learning data such as courses, enrollments, and learner activity across learning platforms. It standardizes how data is retrieved and updated, reducing the need to integrate each LMS separately.",{"title":7,"searchDepth":1629,"depth":1629,"links":331964},[331965,331966,331967,331968,331969,331970,331971,331972,331973],{"id":331564,"depth":1629,"text":331567},{"id":331607,"depth":1629,"text":331610},{"id":182585,"depth":1629,"text":182588},{"id":331698,"depth":1629,"text":331701},{"id":331766,"depth":1629,"text":331769},{"id":331809,"depth":1629,"text":331812},{"id":331848,"depth":1629,"text":331851},{"id":331869,"depth":1629,"text":331872},{"id":54413,"depth":1629,"text":331957},"content:blog:unified_lms_api_sync_courses_enrollments_and_learning_data_across_platforms.md","blog/unified_lms_api_sync_courses_enrollments_and_learning_data_across_platforms.md","blog/unified_lms_api_sync_courses_enrollments_and_learning_data_across_platforms",{"_path":331978,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":331979,"description":331980,"img":331981,"date":331982,"tag":6341,"body":331983,"_type":1677,"_id":332236,"_source":1679,"_file":332237,"_stem":332238,"_extension":1682},"/blog/how_to_use_the_passthrough_api","How to use the Passthrough API","This guide shows you how to make requests using Unified.to's Passthrough API with practical examples.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_the_passthrough_api-icon.png","2024-11-25T00:00:00.000Z",{"type":14,"children":331984,"toc":332222},[331985,331990,331993,332001,332005,332009,332014,332027,332033,332038,332056,332062,332071,332083,332092,332098,332104,332109,332118,332133,332139,332144,332153,332168,332174,332179,332188,332203,332209],{"type":17,"tag":18,"props":331986,"children":331988},{"id":331987},"how-to-use-the-passthrough-api",[331989],{"type":23,"value":331979},{"type":17,"tag":25,"props":331991,"children":331992},{},[],{"type":17,"tag":29,"props":331994,"children":331995},{},[331996],{"type":17,"tag":33,"props":331997,"children":331998},{},[331999],{"type":23,"value":332000},"November 25, 2024",{"type":17,"tag":29,"props":332002,"children":332003},{},[332004],{"type":23,"value":331980},{"type":17,"tag":68,"props":332006,"children":332007},{"id":177146},[332008],{"type":23,"value":177149},{"type":17,"tag":29,"props":332010,"children":332011},{},[332012],{"type":23,"value":332013},"You should have:",{"type":17,"tag":80,"props":332015,"children":332016},{},[332017,332022],{"type":17,"tag":84,"props":332018,"children":332019},{},[332020],{"type":23,"value":332021},"At least one active connection for an integration",{"type":17,"tag":84,"props":332023,"children":332024},{},[332025],{"type":23,"value":332026},"The connection ID for the integration you want to access",{"type":17,"tag":68,"props":332028,"children":332030},{"id":332029},"making-passthrough-requests",[332031],{"type":23,"value":332032},"Making Passthrough requests",{"type":17,"tag":29,"props":332034,"children":332035},{},[332036],{"type":23,"value":332037},"The following examples demonstrate calls to mock endpoints with the Passthrough API.",{"type":17,"tag":29,"props":332039,"children":332040},{},[332041,332046,332048,332054],{"type":17,"tag":48,"props":332042,"children":332043},{},[332044],{"type":23,"value":332045},"NOTE:",{"type":23,"value":332047}," There is only one reserved URL parameter, and that is ",{"type":17,"tag":6121,"props":332049,"children":332051},{"className":332050},[],[332052],{"type":23,"value":332053},"__domain",{"type":23,"value":332055},". Use it to override the default API URL for that integration.",{"type":17,"tag":239,"props":332057,"children":332059},{"id":332058},"using-the-rest-api-directly",[332060],{"type":23,"value":332061},"Using the REST API directly",{"type":17,"tag":6893,"props":332063,"children":332066},{"className":332064,"code":332065,"language":6898,"meta":7},[6896],"// GET request example\nconst response = await fetch('https://api.unified.to/passthrough/{connection_id}/v2/customers', {\n  method: 'GET',\n  headers: {\n    'Authorization': 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application/json'\n  }\n});\n\n// POST request example\nconst response = await fetch('https://api.unified.to/passthrough/{connection_id}/v2/customers', {\n  method: 'POST',\n  headers: {\n    'Authorization': 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    name: 'John Doe',\n    email: 'john@example.com'\n  })\n});\n",[332067],{"type":17,"tag":6121,"props":332068,"children":332069},{"__ignoreMap":7},[332070],{"type":23,"value":332065},{"type":17,"tag":239,"props":332072,"children":332074},{"id":332073},"using-the-unifiedto-sdk",[332075,332076,332081],{"type":23,"value":18449},{"type":17,"tag":133,"props":332077,"children":332079},{"href":42620,"rel":332078},[214],[332080],{"type":23,"value":217},{"type":23,"value":332082}," SDK",{"type":17,"tag":6893,"props":332084,"children":332087},{"className":332085,"code":332086,"language":6898,"meta":7},[6896],"// GET request\nconst response = await unified.passthrough.listPassthroughs({\n  connectionId: 'YOUR_CONNECTION_ID',\n  path: '/v2/customers'\n});\n\n// POST request\nconst response = await unified.passthrough.createPassthrough({\n  connectionId: 'YOUR_CONNECTION_ID',\n  path: '/v2/customers',\n  data: {\n    name: 'John Doe',\n    email: 'john@example.com'\n  }\n});\n\n// With custom headers\nconst response = await unified.passthrough.listPassthroughs(\n  {\n    connectionId: 'YOUR_CONNECTION_ID',\n    path: '/v2/customers'\n  },\n  {\n    fetchOptions: {\n      headers: {\n        'x-api-version': '2023-06-01'\n      }\n    }\n  }\n);\n",[332088],{"type":17,"tag":6121,"props":332089,"children":332090},{"__ignoreMap":7},[332091],{"type":23,"value":332086},{"type":17,"tag":68,"props":332093,"children":332095},{"id":332094},"real-world-examples",[332096],{"type":23,"value":332097},"Real-world examples",{"type":17,"tag":239,"props":332099,"children":332101},{"id":332100},"example-1-fetching-hubspot-properties",[332102],{"type":23,"value":332103},"Example 1: Fetching HubSpot properties",{"type":17,"tag":29,"props":332105,"children":332106},{},[332107],{"type":23,"value":332108},"This example demonstrates how to fetch custom properties for HubSpot contacts.",{"type":17,"tag":6893,"props":332110,"children":332113},{"className":332111,"code":332112,"language":6898,"meta":7},[6896],"const response = await unified.passthrough.listPassthroughs({\n  connectionId: HUBSPOT_CONNECTION_ID,\n  path: '/crm/v3/properties/{objectType}/batch/read'\n});\n\n// Response will contain raw HubSpot property definitions\nconsole.log(response.data);\n",[332114],{"type":17,"tag":6121,"props":332115,"children":332116},{"__ignoreMap":7},[332117],{"type":23,"value":332112},{"type":17,"tag":29,"props":332119,"children":332120},{},[332121,332125,332126],{"type":17,"tag":48,"props":332122,"children":332123},{},[332124],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":332127,"children":332130},{"href":332128,"rel":332129},"https://developers.hubspot.com/beta-docs/reference/api/crm/properties#get-%2Fcrm%2Fv3%2Fproperties%2F%7Bobjecttype%7D",[214],[332131],{"type":23,"value":332132},"Hubspot CRM Properties",{"type":17,"tag":239,"props":332134,"children":332136},{"id":332135},"example-2-creating-a-slack-channel",[332137],{"type":23,"value":332138},"Example 2: Creating a Slack channel",{"type":17,"tag":29,"props":332140,"children":332141},{},[332142],{"type":23,"value":332143},"This example demonstrates creating a channel in Slack.",{"type":17,"tag":6893,"props":332145,"children":332148},{"className":332146,"code":332147,"language":6898,"meta":7},[6896],"// Create a private Slack channel\nconst response = await unified.passthrough.createPassthrough({\n  connectionId: SLACK_CONNECTION_ID,\n  path: '/conversations.create',\n  data: {\n    name: 'project-discussion',\n    is_private: true\n  }\n});\n\n// Check the response\nif (response.data.ok) {\n  console.log('Channel created:', response.data.channel.id);\n}\n",[332149],{"type":17,"tag":6121,"props":332150,"children":332151},{"__ignoreMap":7},[332152],{"type":23,"value":332147},{"type":17,"tag":29,"props":332154,"children":332155},{},[332156,332160,332161],{"type":17,"tag":48,"props":332157,"children":332158},{},[332159],{"type":23,"value":329841},{"type":23,"value":49318},{"type":17,"tag":133,"props":332162,"children":332165},{"href":332163,"rel":332164},"https://api.slack.com/methods/conversations.create",[214],[332166],{"type":23,"value":332167},"conversations.create",{"type":17,"tag":239,"props":332169,"children":332171},{"id":332170},"example-3-creating-a-salesforce-record",[332172],{"type":23,"value":332173},"Example 3: Creating a Salesforce record",{"type":17,"tag":29,"props":332175,"children":332176},{},[332177],{"type":23,"value":332178},"This example demonstrates two ways of creating a new Account record in Salesforce using their sObject API.",{"type":17,"tag":6893,"props":332180,"children":332183},{"className":332181,"code":332182,"language":6898,"meta":7},[6896],"// Using the SDK\nconst response = await unified.passthrough.createPassthrough({\n  connectionId: SALESFORCE_CONNECTION_ID,\n// Note: path starts with 'services/data/v62.0' as required by Salesforce\n  path: 'services/data/v62.0/sobjects/Account/',\n  data: {\n    \"Name\": \"Express Logistics and Transport\"\n  }\n});\n\n\nconst response = await fetch('https://api.unified.to/passthrough/{connection_id}/services/data/v62.0/sobjects/Account/', {\n  method: 'POST',\n  headers: {\n    'Authorization': 'Bearer YOUR_UNIFIED_API_KEY',\n    'Content-Type': 'application/json'\n  },\n  body: JSON.stringify({\n    \"Name\": \"Express Logistics and Transport\"\n  })\n});\n\n// The response will contain the new record ID if successful:\n// {\n//   \"id\": \"001D000000IqhSLIAZ\",\n//   \"errors\": [],\n//   \"success\": true\n// }\n",[332184],{"type":17,"tag":6121,"props":332185,"children":332186},{"__ignoreMap":7},[332187],{"type":23,"value":332182},{"type":17,"tag":29,"props":332189,"children":332190},{},[332191,332195,332196],{"type":17,"tag":48,"props":332192,"children":332193},{},[332194],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":332197,"children":332200},{"href":332198,"rel":332199},"https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_create.htm",[214],[332201],{"type":23,"value":332202},"Create a Record",{"type":17,"tag":68,"props":332204,"children":332206},{"id":332205},"see-also",[332207],{"type":23,"value":332208},"See also",{"type":17,"tag":80,"props":332210,"children":332211},{},[332212],{"type":17,"tag":84,"props":332213,"children":332214},{},[332215],{"type":17,"tag":133,"props":332216,"children":332219},{"href":332217,"rel":332218},"https://docs.unified.to/passthrough/overview",[214],[332220],{"type":23,"value":332221},"Passthrough API Overview",{"title":7,"searchDepth":1629,"depth":1629,"links":332223},[332224,332225,332230,332235],{"id":177146,"depth":1629,"text":177149},{"id":332029,"depth":1629,"text":332032,"children":332226},[332227,332228],{"id":332058,"depth":1635,"text":332061},{"id":332073,"depth":1635,"text":332229},"Using the Unified.to SDK",{"id":332094,"depth":1629,"text":332097,"children":332231},[332232,332233,332234],{"id":332100,"depth":1635,"text":332103},{"id":332135,"depth":1635,"text":332138},{"id":332170,"depth":1635,"text":332173},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_use_the_passthrough_api.md","blog/how_to_use_the_passthrough_api.md","blog/how_to_use_the_passthrough_api",{"_path":332240,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":332241,"description":332242,"img":332243,"date":331982,"tag":12,"body":332244,"_type":1677,"_id":332603,"_source":1679,"_file":332604,"_stem":332605,"_extension":1682},"/blog/unified_repository_api_access_code_repositories_across_github_gitlab_and_bitbucket","Unified Repository API: Access Code Repositories Across GitHub, GitLab, and Bitbucket","If your product integrates with code repositories, you quickly run into provider-specific APIs, inconsistent data models, and different approaches to commits,...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_repository_api_access_code_repositories_across_github_gitlab_and_bitbucket-icon.png",{"type":14,"children":332245,"toc":332592},[332246,332251,332254,332261,332269,332274,332279,332283,332298,332303,332309,332314,332332,332337,332343,332391,332396,332402,332407,332425,332434,332439,332445,332473,332479,332484,332507,332512,332516,332544,332548,332553,332559,332564],{"type":17,"tag":18,"props":332247,"children":332249},{"id":332248},"unified-repository-api-access-code-repositories-across-github-gitlab-and-bitbucket",[332250],{"type":23,"value":332241},{"type":17,"tag":25,"props":332252,"children":332253},{},[],{"type":17,"tag":29,"props":332255,"children":332256},{},[332257],{"type":17,"tag":33,"props":332258,"children":332259},{},[332260],{"type":23,"value":332000},{"type":17,"tag":29,"props":332262,"children":332263},{},[332264],{"type":17,"tag":6438,"props":332265,"children":332268},{"alt":332266,"src":332267},"repo_api.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_repository_api_access_code_repositories_across_github_gitlab_and_bitbucket-0.png",[],{"type":17,"tag":29,"props":332270,"children":332271},{},[332272],{"type":23,"value":332273},"If your product integrates with code repositories, you quickly run into provider-specific APIs, inconsistent data models, and different approaches to commits, pull requests, and repository structure.",{"type":17,"tag":29,"props":332275,"children":332276},{},[332277],{"type":23,"value":332278},"The Unified Repository API provides a single interface to access and manage repository data across platforms. It standardizes how repositories, commits, branches, and pull requests are represented, with real-time access to source systems.",{"type":17,"tag":68,"props":332280,"children":332281},{"id":25342},[332282],{"type":23,"value":216065},{"type":17,"tag":80,"props":332284,"children":332285},{},[332286,332290,332294],{"type":17,"tag":84,"props":332287,"children":332288},{},[332289],{"type":23,"value":13311},{"type":17,"tag":84,"props":332291,"children":332292},{},[332293],{"type":23,"value":13320},{"type":17,"tag":84,"props":332295,"children":332296},{},[332297],{"type":23,"value":17383},{"type":17,"tag":29,"props":332299,"children":332300},{},[332301],{"type":23,"value":332302},"Additional repository integrations are expanding as part of this category.",{"type":17,"tag":68,"props":332304,"children":332306},{"id":332305},"unified-repository-model-across-platforms",[332307],{"type":23,"value":332308},"Unified repository model across platforms",{"type":17,"tag":29,"props":332310,"children":332311},{},[332312],{"type":23,"value":332313},"The Repository API standardizes core concepts across providers:",{"type":17,"tag":80,"props":332315,"children":332316},{},[332317,332322,332327],{"type":17,"tag":84,"props":332318,"children":332319},{},[332320],{"type":23,"value":332321},"Repositories, branches, and commits follow consistent schemas",{"type":17,"tag":84,"props":332323,"children":332324},{},[332325],{"type":23,"value":332326},"Pull requests, reviews, and contributors are normalized",{"type":17,"tag":84,"props":332328,"children":332329},{},[332330],{"type":23,"value":332331},"Repository structures are represented consistently across platforms",{"type":17,"tag":29,"props":332333,"children":332334},{},[332335],{"type":23,"value":332336},"This allows systems to work with repository data without handling provider-specific formats.",{"type":17,"tag":68,"props":332338,"children":332340},{"id":332339},"core-objects-in-the-repository-api",[332341],{"type":23,"value":332342},"Core objects in the Repository API",{"type":17,"tag":80,"props":332344,"children":332345},{},[332346,332355,332364,332373,332382],{"type":17,"tag":84,"props":332347,"children":332348},{},[332349,332353],{"type":17,"tag":48,"props":332350,"children":332351},{},[332352],{"type":23,"value":41703},{"type":23,"value":332354},": repository owners and groups",{"type":17,"tag":84,"props":332356,"children":332357},{},[332358,332362],{"type":17,"tag":48,"props":332359,"children":332360},{},[332361],{"type":23,"value":171529},{"type":23,"value":332363},": code repositories and metadata",{"type":17,"tag":84,"props":332365,"children":332366},{},[332367,332371],{"type":17,"tag":48,"props":332368,"children":332369},{},[332370],{"type":23,"value":171581},{"type":23,"value":332372},": version control branches",{"type":17,"tag":84,"props":332374,"children":332375},{},[332376,332380],{"type":17,"tag":48,"props":332377,"children":332378},{},[332379],{"type":23,"value":171913},{"type":23,"value":332381},": code changes and history",{"type":17,"tag":84,"props":332383,"children":332384},{},[332385,332389],{"type":17,"tag":48,"props":332386,"children":332387},{},[332388],{"type":23,"value":171990},{"type":23,"value":332390},": code reviews, approvals, and merges",{"type":17,"tag":29,"props":332392,"children":332393},{},[332394],{"type":23,"value":332395},"These objects follow consistent schemas across providers, reducing the need to handle platform-specific repository structures.",{"type":17,"tag":68,"props":332397,"children":332399},{"id":332398},"real-time-repository-data-access",[332400],{"type":23,"value":332401},"Real-time repository data access",{"type":17,"tag":29,"props":332403,"children":332404},{},[332405],{"type":23,"value":332406},"The Repository API retrieves and updates data in real time:",{"type":17,"tag":80,"props":332408,"children":332409},{},[332410,332415,332420],{"type":17,"tag":84,"props":332411,"children":332412},{},[332413],{"type":23,"value":332414},"Requests are routed directly to source platforms",{"type":17,"tag":84,"props":332416,"children":332417},{},[332418],{"type":23,"value":332419},"No polling or background jobs",{"type":17,"tag":84,"props":332421,"children":332422},{},[332423],{"type":23,"value":332424},"No stored repository data",{"type":17,"tag":29,"props":332426,"children":332427},{},[332428,332432],{"type":17,"tag":133,"props":332429,"children":332430},{"href":4999},[332431],{"type":23,"value":43896},{"type":23,"value":332433}," provide updates for commits, pull requests, and repository activity.",{"type":17,"tag":29,"props":332435,"children":332436},{},[332437],{"type":23,"value":332438},"The API supports both read and write operations, enabling full interaction with repository systems.",{"type":17,"tag":68,"props":332440,"children":332442},{"id":332441},"what-teams-build-with-the-repository-api",[332443],{"type":23,"value":332444},"What teams build with the Repository API",{"type":17,"tag":80,"props":332446,"children":332447},{},[332448,332453,332458,332463,332468],{"type":17,"tag":84,"props":332449,"children":332450},{},[332451],{"type":23,"value":332452},"Developer analytics platforms tracking code activity",{"type":17,"tag":84,"props":332454,"children":332455},{},[332456],{"type":23,"value":332457},"Tools aggregating repositories across multiple providers",{"type":17,"tag":84,"props":332459,"children":332460},{},[332461],{"type":23,"value":332462},"Systems monitoring code quality and review activity",{"type":17,"tag":84,"props":332464,"children":332465},{},[332466],{"type":23,"value":332467},"Search systems indexing repositories and code history",{"type":17,"tag":84,"props":332469,"children":332470},{},[332471],{"type":23,"value":332472},"Automation systems triggered by repository events",{"type":17,"tag":68,"props":332474,"children":332476},{"id":332475},"using-repository-data-in-ai-systems",[332477],{"type":23,"value":332478},"Using repository data in AI systems",{"type":17,"tag":29,"props":332480,"children":332481},{},[332482],{"type":23,"value":332483},"Repository data can be used to:",{"type":17,"tag":80,"props":332485,"children":332486},{},[332487,332492,332497,332502],{"type":17,"tag":84,"props":332488,"children":332489},{},[332490],{"type":23,"value":332491},"Analyze code changes and development patterns",{"type":17,"tag":84,"props":332493,"children":332494},{},[332495],{"type":23,"value":332496},"Generate summaries of commits and pull requests",{"type":17,"tag":84,"props":332498,"children":332499},{},[332500],{"type":23,"value":332501},"Detect issues in development processes",{"type":17,"tag":84,"props":332503,"children":332504},{},[332505],{"type":23,"value":332506},"Provide context for AI copilots working with code",{"type":17,"tag":29,"props":332508,"children":332509},{},[332510],{"type":23,"value":332511},"Because data is accessed in real time, AI systems operate on current repository state.",{"type":17,"tag":68,"props":332513,"children":332514},{"id":182585},[332515],{"type":23,"value":182588},{"type":17,"tag":80,"props":332517,"children":332518},{},[332519,332524,332529,332534,332539],{"type":17,"tag":84,"props":332520,"children":332521},{},[332522],{"type":23,"value":332523},"Developer tools aggregating repository data",{"type":17,"tag":84,"props":332525,"children":332526},{},[332527],{"type":23,"value":332528},"Engineering analytics platforms",{"type":17,"tag":84,"props":332530,"children":332531},{},[332532],{"type":23,"value":332533},"DevOps systems monitoring code activity",{"type":17,"tag":84,"props":332535,"children":332536},{},[332537],{"type":23,"value":332538},"AI systems analyzing code and development workflows",{"type":17,"tag":84,"props":332540,"children":332541},{},[332542],{"type":23,"value":332543},"Platforms integrating code data with other business systems",{"type":17,"tag":68,"props":332545,"children":332546},{"id":17403},[332547],{"type":23,"value":17406},{"type":17,"tag":29,"props":332549,"children":332550},{},[332551],{"type":23,"value":332552},"A repository API allows developers to access and manage code repositories, including commits, branches, and pull requests. A unified repository API standardizes how repository data is accessed across platforms, enabling consistent integration with multiple providers.",{"type":17,"tag":68,"props":332554,"children":332556},{"id":332555},"get-started",[332557],{"type":23,"value":332558},"Get started",{"type":17,"tag":29,"props":332560,"children":332561},{},[332562],{"type":23,"value":332563},"The Repository API is available on all Unified plans.",{"type":17,"tag":80,"props":332565,"children":332566},{},[332567,332575,332583],{"type":17,"tag":84,"props":332568,"children":332569},{},[332570],{"type":17,"tag":133,"props":332571,"children":332573},{"href":176923,"rel":332572},[214],[332574],{"type":23,"value":287157},{"type":17,"tag":84,"props":332576,"children":332577},{},[332578],{"type":17,"tag":133,"props":332579,"children":332581},{"href":1612,"rel":332580},[214],[332582],{"type":23,"value":215326},{"type":17,"tag":84,"props":332584,"children":332585},{},[332586],{"type":17,"tag":133,"props":332587,"children":332590},{"href":332588,"rel":332589},"https://calendly.com/d/cph9-g8n-jzg/connect-with-unified?month=2026-03",[214],[332591],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":332593},[332594,332595,332596,332597,332598,332599,332600,332601,332602],{"id":25342,"depth":1629,"text":216065},{"id":332305,"depth":1629,"text":332308},{"id":332339,"depth":1629,"text":332342},{"id":332398,"depth":1629,"text":332401},{"id":332441,"depth":1629,"text":332444},{"id":332475,"depth":1629,"text":332478},{"id":182585,"depth":1629,"text":182588},{"id":17403,"depth":1629,"text":17406},{"id":332555,"depth":1629,"text":332558},"content:blog:unified_repository_api_access_code_repositories_across_github_gitlab_and_bitbucket.md","blog/unified_repository_api_access_code_repositories_across_github_gitlab_and_bitbucket.md","blog/unified_repository_api_access_code_repositories_across_github_gitlab_and_bitbucket",{"_path":332607,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":332608,"description":332609,"img":332610,"date":332611,"tag":289978,"body":332612,"_type":1677,"_id":332976,"_source":1679,"_file":332977,"_stem":332978,"_extension":1682},"/blog/how_talin_ai_built_their_ai_platform_without_integration_headaches","How Talin.ai Built Their AI Platform Without Integration Headaches","Learn how Talin.ai, an AI-driven automation platform for recruitment agencies, leveraged Unified.to to support 20+ ATS and CRM integrations while keeping their...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_talin_ai_built_their_ai_platform_without_integration_headaches-icon.png","2024-11-20T00:00:00.000Z",{"type":14,"children":332613,"toc":332967},[332614,332619,332622,332630,332638,332642,332651,332660,332669,332678,332686,332695,332704,332712,332723,332729,332734,332739,332745,332750,332755,332760,332783,332791,332799,332805,332810,332815,332820,332828,332834,332839,332844,332849,332855,332860,332865,332873,332877,332882,332925,332930],{"type":17,"tag":18,"props":332615,"children":332617},{"id":332616},"how-talinai-built-their-ai-platform-without-integration-headaches",[332618],{"type":23,"value":332608},{"type":17,"tag":25,"props":332620,"children":332621},{},[],{"type":17,"tag":29,"props":332623,"children":332624},{},[332625],{"type":17,"tag":33,"props":332626,"children":332627},{},[332628],{"type":23,"value":332629},"November 20, 2024",{"type":17,"tag":29,"props":332631,"children":332632},{},[332633],{"type":17,"tag":33,"props":332634,"children":332635},{},[332636],{"type":23,"value":332637},"Learn how Talin.ai, an AI-driven automation platform for recruitment agencies, leveraged Unified.to to support 20+ ATS and CRM integrations while keeping their founding engineers focused on building their core AI and automation capabilities.",{"type":17,"tag":68,"props":332639,"children":332640},{"id":44585},[332641],{"type":23,"value":44588},{"type":17,"tag":29,"props":332643,"children":332644},{},[332645,332649],{"type":17,"tag":48,"props":332646,"children":332647},{},[332648],{"type":23,"value":328487},{"type":23,"value":332650},": AI-powered talent acquisition platform for staffing & recruiting",{"type":17,"tag":29,"props":332652,"children":332653},{},[332654,332658],{"type":17,"tag":48,"props":332655,"children":332656},{},[332657],{"type":23,"value":308941},{"type":23,"value":332659},": Push and pull data from ATS and CRM integrations",{"type":17,"tag":29,"props":332661,"children":332662},{},[332663,332667],{"type":17,"tag":48,"props":332664,"children":332665},{},[332666],{"type":23,"value":328506},{"type":23,"value":332668},": 20 integrations",{"type":17,"tag":29,"props":332670,"children":332671},{},[332672,332676],{"type":17,"tag":48,"props":332673,"children":332674},{},[332675],{"type":23,"value":326775},{"type":23,"value":332677}," 9 months",{"type":17,"tag":29,"props":332679,"children":332680},{},[332681,332685],{"type":17,"tag":48,"props":332682,"children":332683},{},[332684],{"type":23,"value":328526},{"type":23,"value":330425},{"type":17,"tag":29,"props":332687,"children":332688},{},[332689,332693],{"type":17,"tag":48,"props":332690,"children":332691},{},[332692],{"type":23,"value":328536},{"type":23,"value":332694},": Unified ATS/CRM APIs, SDK with TypeScript support, Connection Health Status",{"type":17,"tag":29,"props":332696,"children":332697},{},[332698,332702],{"type":17,"tag":48,"props":332699,"children":332700},{},[332701],{"type":23,"value":328552},{"type":23,"value":332703},": Engineering resource optimization, reduced cognitive overhead, scalable integration strategy, ability to serve Enterprise clients",{"type":17,"tag":29,"props":332705,"children":332706},{},[332707],{"type":17,"tag":6438,"props":332708,"children":332711},{"alt":332709,"src":332710},"unified_talin_image1_blue.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_talin_ai_built_their_ai_platform_without_integration_headaches-0.png",[],{"type":17,"tag":29,"props":332713,"children":332714},{},[332715,332721],{"type":17,"tag":133,"props":332716,"children":332719},{"href":332717,"rel":332718},"https://talin.ai/",[214],[332720],{"type":23,"value":277749},{"type":23,"value":332722}," is bringing AI-powered automation to an overlooked segment of the recruiting industry: staffing agencies. Founded in 2023 and recently securing $775,000 in pre-seed funding, their platform recognizes that staffing agencies operate fundamentally differently from in-house corporate recruiting teams. While most recruiting software focuses on internal HR needs, Talin.ai's platform is purpose-built for unique agency workflows — from lead generation to candidate outreach and personalized engagement. To deliver on this promise, they needed a robust integration strategy that could connect with dozens of ATS and CRM platforms without consuming their engineering resources.",{"type":17,"tag":68,"props":332724,"children":332726},{"id":332725},"the-challenge-building-an-integration-first-ai-platform",[332727],{"type":23,"value":332728},"The challenge: building an integration-first AI platform",{"type":17,"tag":29,"props":332730,"children":332731},{},[332732],{"type":23,"value":332733},"Your engineers should be building what makes your product unique, not maintaining integrations. That was the principle guiding Talin.ai as they developed their AI-powered recruiting platform for staffing agencies. They needed to seamlessly integrate with dozens of ATS and CRM systems to accomplish their core mission: freeing recruiters and staffing agencies from the tedious work of importing candidates in bulk, validating contact information in real-time, and deploying multi-channel outreach campaigns.",{"type":17,"tag":29,"props":332735,"children":332736},{},[332737],{"type":23,"value":332738},"For a small team focused on building sophisticated AI and automation features, this created a stark reality. Each new integration could require weeks or months of learning new APIs, building custom authentication flows, and maintaining different services. With just two founding engineers, Talin.ai faced a critical decision: either delay their AI development to build integrations, or find a better way.",{"type":17,"tag":68,"props":332740,"children":332742},{"id":332741},"breaking-free-from-integration-complexity",[332743],{"type":23,"value":332744},"Breaking free from integration complexity",{"type":17,"tag":29,"props":332746,"children":332747},{},[332748],{"type":23,"value":332749},"The math was simple but sobering. Building and maintaining integrations in-house would have consumed both founding engineers full-time, leaving scant resources for core product development.",{"type":17,"tag":29,"props":332751,"children":332752},{},[332753],{"type":23,"value":332754},"Enter Unified.to. Having access to unified data models and normalized APIs meant Talin.ai could completely transform their integration strategy. Instead of building each integration from scratch, they could write their integration code once and instantly support dozens of platforms.",{"type":17,"tag":29,"props":332756,"children":332757},{},[332758],{"type":23,"value":332759},"The impact was immediate:",{"type":17,"tag":80,"props":332761,"children":332762},{},[332763,332768,332773,332778],{"type":17,"tag":84,"props":332764,"children":332765},{},[332766],{"type":23,"value":332767},"New integrations could be added in under an hour instead of weeks",{"type":17,"tag":84,"props":332769,"children":332770},{},[332771],{"type":23,"value":332772},"A single engineer could work on integrations part-time instead of taking up all of their time",{"type":17,"tag":84,"props":332774,"children":332775},{},[332776],{"type":23,"value":332777},"Engineers could focus on core AI features",{"type":17,"tag":84,"props":332779,"children":332780},{},[332781],{"type":23,"value":332782},"A single, unified data model simplified development",{"type":17,"tag":29,"props":332784,"children":332785},{},[332786],{"type":17,"tag":48,"props":332787,"children":332788},{},[332789],{"type":23,"value":332790},"\"The value of Unified.to's unified data models cannot be overstated. Taking the time upfront to understand one shared model meant we could scale incredibly fast afterward. When you're building AI features that need to work across multiple ATS systems, freeing up this mental bandwidth is invaluable.'",{"type":17,"tag":29,"props":332792,"children":332793},{},[332794],{"type":17,"tag":33,"props":332795,"children":332796},{},[332797],{"type":23,"value":332798},"Trevor Witjes, Co-founder",{"type":17,"tag":68,"props":332800,"children":332802},{"id":332801},"winning-enterprise-deals-with-integrations",[332803],{"type":23,"value":332804},"Winning enterprise deals with integrations",{"type":17,"tag":29,"props":332806,"children":332807},{},[332808],{"type":23,"value":332809},"This newfound engineering focus led directly to their first major win. By building a robust solution using Unified.to's Bullhorn integration, one of the recruiting industry's more complex ATS platforms, Talin.ai secured their largest enterprise client to date.",{"type":17,"tag":29,"props":332811,"children":332812},{},[332813],{"type":23,"value":332814},"\"Integration capabilities often make or break deals in the recruiting software space,\" explains Trevor Witjes. \"Because we weren't buried in integration maintenance, we could focus on making our own product rock-solid. That single integration accelerated our go-to-market by months, opening doors while our engineering team stayed focused on innovation.\"",{"type":17,"tag":29,"props":332816,"children":332817},{},[332818],{"type":23,"value":332819},"Thanks to Unified.to, Talin.ai could confidently pursue enterprise deals knowing they would be able to deliver the integrations their customers needed. Their engineering team remained focused on innovation, setting the stage for continued growth and product advancement.",{"type":17,"tag":29,"props":332821,"children":332822},{},[332823],{"type":17,"tag":6438,"props":332824,"children":332827},{"alt":332825,"src":332826},"unified_talin_image2_blue.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_talin_ai_built_their_ai_platform_without_integration_headaches-1.png",[],{"type":17,"tag":68,"props":332829,"children":332831},{"id":332830},"finding-a-partner-for-integration-success",[332832],{"type":23,"value":332833},"Finding a partner for integration success",{"type":17,"tag":29,"props":332835,"children":332836},{},[332837],{"type":23,"value":332838},"Talin.ai found that Unified.to provided more than just an API — they gained a technical partner that felt like an extension of their team. From day one, Talin.ai's engineering team was impressed by Unified.to's collaborative approach to problem-solving and thoughtfully designed data models.",{"type":17,"tag":29,"props":332840,"children":332841},{},[332842],{"type":23,"value":332843},"When Talin.ai needed to support Bullhorn, Unified.to's partnership proved invaluable. The Unified.to team worked closely with Talin.ai to ensure smooth authentication flows and optimal end-user experience. Challenges resolved in live conversations, keeping implementation momentum strong.",{"type":17,"tag":29,"props":332845,"children":332846},{},[332847],{"type":23,"value":332848},"\"The collaborative nature of our relationship with Unified.to has been invaluable,\" explains Trevor Witjes. \"They're not just responsive - they're thorough, engaged, and genuinely invested in our success. When we hit integration challenges, we could hop into Slack and work through solutions together. It never felt like we were just another ticket in their system.\"",{"type":17,"tag":68,"props":332850,"children":332852},{"id":332851},"the-confidence-to-scale-on-demand",[332853],{"type":23,"value":332854},"The confidence to scale on demand",{"type":17,"tag":29,"props":332856,"children":332857},{},[332858],{"type":23,"value":332859},"Talin.ai's journey with Unified.to started with just a few integrations, but quickly scaled to support over 20 ATS and CRM platforms. This rapid expansion wasn't just about numbers - this reflected a fundamental truth in the recruiting industry: data integration isn't optional, it's essential.",{"type":17,"tag":29,"props":332861,"children":332862},{},[332863],{"type":23,"value":332864},"This strategy has paid off. While Talin.ai actively uses 15 integrations today, they confidently feature over 25 platforms in their marketing. \"With Unified.to handling our integration infrastructure, we can advertise support for more platforms, knowing we can quickly activate them as customers need them,\" Trevor notes. \"This lets us say 'yes' to more customer requests without worrying about implementation overhead.'",{"type":17,"tag":29,"props":332866,"children":332867},{},[332868],{"type":17,"tag":6438,"props":332869,"children":332872},{"alt":332870,"src":332871},"unified_talin_image1_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_talin_ai_built_their_ai_platform_without_integration_headaches-2.png",[],{"type":17,"tag":68,"props":332874,"children":332875},{"id":327029},[332876],{"type":23,"value":327032},{"type":17,"tag":29,"props":332878,"children":332879},{},[332880],{"type":23,"value":332881},"Talin.ai's experience demonstrates how the right integration strategy can transform a startup's trajectory:",{"type":17,"tag":80,"props":332883,"children":332884},{},[332885,332895,332905,332915],{"type":17,"tag":84,"props":332886,"children":332887},{},[332888,332893],{"type":17,"tag":48,"props":332889,"children":332890},{},[332891],{"type":23,"value":332892},"Engineering focus:",{"type":23,"value":332894}," 150% more engineering time for core AI development",{"type":17,"tag":84,"props":332896,"children":332897},{},[332898,332903],{"type":17,"tag":48,"props":332899,"children":332900},{},[332901],{"type":23,"value":332902},"Reduced complexity:",{"type":23,"value":332904}," One unified data model instead of 20+ individual models",{"type":17,"tag":84,"props":332906,"children":332907},{},[332908,332913],{"type":17,"tag":48,"props":332909,"children":332910},{},[332911],{"type":23,"value":332912},"Rapid scaling:",{"type":23,"value":332914}," From 2-3 initial integrations to 20+ supported platforms in matter of weeks",{"type":17,"tag":84,"props":332916,"children":332917},{},[332918,332923],{"type":17,"tag":48,"props":332919,"children":332920},{},[332921],{"type":23,"value":332922},"Future-ready:",{"type":23,"value":332924}," Ability to expand bi-directional data flows without additional infrastructure",{"type":17,"tag":29,"props":332926,"children":332927},{},[332928],{"type":23,"value":332929},"For recruiters and staffing agencies, deep integration capabilities aren't just a nice-to-have - they're table stakes. By choosing Unified.to, Talin.ai turned this challenge into an advantage. Their engineers stay focused on innovation while offering the deep integration capabilities their customers demand. As they continue to expand their platform's capabilities, this foundation will enable them to move faster and reach further than ever before.",{"type":17,"tag":29,"props":332931,"children":332932},{},[332933,332937,332938,332947,332948,332952,332953,332962,332963],{"type":17,"tag":48,"props":332934,"children":332935},{},[332936],{"type":23,"value":328400},{"type":23,"value":244724},{"type":17,"tag":133,"props":332939,"children":332942},{"href":332940,"rel":332941},"https://app.unified.to/login?utm_source=sync2hire_casestudy&utm_medium=blog&utm_campaign=sync2hire_casestudy_freetrial",[214],[332943],{"type":17,"tag":48,"props":332944,"children":332945},{},[332946],{"type":23,"value":322435},{"type":23,"value":244724},{"type":17,"tag":48,"props":332949,"children":332950},{},[332951],{"type":23,"value":328416},{"type":23,"value":244724},{"type":17,"tag":133,"props":332954,"children":332957},{"href":332955,"rel":332956},"https://unified.to/contact?utm_source=sync2hire_casestudy&utm_medium=blog&utm_campaign=sync2hire_casestudy_contact",[214],[332958],{"type":17,"tag":48,"props":332959,"children":332960},{},[332961],{"type":23,"value":328427},{"type":23,"value":244724},{"type":17,"tag":48,"props":332964,"children":332965},{},[332966],{"type":23,"value":328433},{"title":7,"searchDepth":1629,"depth":1629,"links":332968},[332969,332970,332971,332972,332973,332974,332975],{"id":44585,"depth":1629,"text":44588},{"id":332725,"depth":1629,"text":332728},{"id":332741,"depth":1629,"text":332744},{"id":332801,"depth":1629,"text":332804},{"id":332830,"depth":1629,"text":332833},{"id":332851,"depth":1629,"text":332854},{"id":327029,"depth":1629,"text":327032},"content:blog:how_talin_ai_built_their_ai_platform_without_integration_headaches.md","blog/how_talin_ai_built_their_ai_platform_without_integration_headaches.md","blog/how_talin_ai_built_their_ai_platform_without_integration_headaches",{"_path":332980,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":332981,"description":332982,"img":332983,"date":332984,"tag":6341,"body":332985,"_type":1677,"_id":333339,"_source":1679,"_file":333340,"_stem":333341,"_extension":1682},"/blog/how_to_set_up_slack_webhooks_using_event_subscriptions","How to set up Slack webhooks using event subscriptions","This guide explains how to configure your Slack app's event subscriptions to work with Unified.to webhooks. This is a required step before you can create...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_slack_webhooks_using_event_subscriptions-icon.png","2024-11-14T00:00:00.000Z",{"type":14,"children":332986,"toc":333333},[332987,332992,332995,333003,333014,333018,333023,333064,333070,333196,333202,333207,333298,333303,333307,333311],{"type":17,"tag":18,"props":332988,"children":332990},{"id":332989},"how-to-set-up-slack-webhooks-using-event-subscriptions",[332991],{"type":23,"value":332981},{"type":17,"tag":25,"props":332993,"children":332994},{},[],{"type":17,"tag":29,"props":332996,"children":332997},{},[332998],{"type":17,"tag":33,"props":332999,"children":333000},{},[333001],{"type":23,"value":333002},"November 14, 2024",{"type":17,"tag":29,"props":333004,"children":333005},{},[333006,333008,333012],{"type":23,"value":333007},"This guide explains how to configure your Slack app's event subscriptions to work with Unified.to ",{"type":17,"tag":133,"props":333009,"children":333010},{"href":4999},[333011],{"type":23,"value":5002},{"type":23,"value":333013},". This is a required step before you can create webhooks that listen for Slack events. Once configured, your webhooks will receive real-time notifications when specific events occur in your Slack workspace, such as when users send messages.",{"type":17,"tag":68,"props":333015,"children":333016},{"id":177146},[333017],{"type":23,"value":177149},{"type":17,"tag":29,"props":333019,"children":333020},{},[333021],{"type":23,"value":333022},"Ensure you have:",{"type":17,"tag":80,"props":333024,"children":333025},{},[333026,333031,333036,333047,333059],{"type":17,"tag":84,"props":333027,"children":333028},{},[333029],{"type":23,"value":333030},"A Slack app created in your workspace",{"type":17,"tag":84,"props":333032,"children":333033},{},[333034],{"type":23,"value":333035},"Access to your Slack app's configuration settings",{"type":17,"tag":84,"props":333037,"children":333038},{},[333039,333040,333045],{"type":23,"value":199693},{"type":17,"tag":133,"props":333041,"children":333043},{"href":42620,"rel":333042},[214],[333044],{"type":23,"value":217},{"type":23,"value":333046}," workspace ID",{"type":17,"tag":84,"props":333048,"children":333049},{},[333050,333052],{"type":23,"value":333051},"An understanding of ",{"type":17,"tag":133,"props":333053,"children":333056},{"href":333054,"rel":333055},"https://docs.unified.to/concepts/webhooks",[214],[333057],{"type":23,"value":333058},"how webhooks work in Unified.to",{"type":17,"tag":84,"props":333060,"children":333061},{},[333062],{"type":23,"value":333063},"Create a webhook in your",{"type":17,"tag":68,"props":333065,"children":333067},{"id":333066},"enable-event-subscriptions-in-slack",[333068],{"type":23,"value":333069},"Enable event subscriptions in Slack",{"type":17,"tag":6154,"props":333071,"children":333072},{},[333073,333083,333088,333105,333122,333172,333185],{"type":17,"tag":84,"props":333074,"children":333075},{},[333076,333078],{"type":23,"value":333077},"Go to the Slack API dashboard at ",{"type":17,"tag":133,"props":333079,"children":333081},{"href":76293,"rel":333080},[214],[333082],{"type":23,"value":76293},{"type":17,"tag":84,"props":333084,"children":333085},{},[333086],{"type":23,"value":333087},"Select your app from the list of available apps",{"type":17,"tag":84,"props":333089,"children":333090},{},[333091,333093,333098,333100],{"type":23,"value":333092},"In the left sidebar, under ",{"type":17,"tag":48,"props":333094,"children":333095},{},[333096],{"type":23,"value":333097},"Features",{"type":23,"value":333099},", click ",{"type":17,"tag":48,"props":333101,"children":333102},{},[333103],{"type":23,"value":333104},"Event Subscriptions",{"type":17,"tag":84,"props":333106,"children":333107},{},[333108,333110,333115,333117],{"type":23,"value":333109},"Toggle the ",{"type":17,"tag":48,"props":333111,"children":333112},{},[333113],{"type":23,"value":333114},"Enable Events",{"type":23,"value":333116}," switch to ",{"type":17,"tag":48,"props":333118,"children":333119},{},[333120],{"type":23,"value":333121},"On",{"type":17,"tag":84,"props":333123,"children":333124},{},[333125,333126,333131,333133,333139,333140,333145,333147],{"type":23,"value":123278},{"type":17,"tag":48,"props":333127,"children":333128},{},[333129],{"type":23,"value":333130},"Request URL",{"type":23,"value":333132}," field, enter (depending on your data center —- replace ID with your workspace ID —- replace ",{"type":17,"tag":6121,"props":333134,"children":333136},{"className":333135},[],[333137],{"type":23,"value":333138},"slack",{"type":23,"value":120761},{"type":17,"tag":6121,"props":333141,"children":333143},{"className":333142},[],[333144],{"type":23,"value":329307},{"type":23,"value":333146}," if using that integration):",{"type":17,"tag":6154,"props":333148,"children":333149},{},[333150,333161],{"type":17,"tag":84,"props":333151,"children":333152},{},[333153,333155],{"type":23,"value":333154},"(US data center) ",{"type":17,"tag":6121,"props":333156,"children":333158},{"className":333157},[],[333159],{"type":23,"value":333160},"https://api.unified.to/webhook/workspace/slack?workspace_id={ID}",{"type":17,"tag":84,"props":333162,"children":333163},{},[333164,333166],{"type":23,"value":333165},"(EU data center) ",{"type":17,"tag":6121,"props":333167,"children":333169},{"className":333168},[],[333170],{"type":23,"value":333171},"https://api-eu.unified.to/webhook/workspace/slack?workspace_id={ID}",{"type":17,"tag":84,"props":333173,"children":333174},{},[333175,333177,333180],{"type":23,"value":333176},"Wait for Slack to verify the URL. You should see a green checkmark indicating successful verification.",{"type":17,"tag":3891,"props":333178,"children":333179},{},[],{"type":17,"tag":6438,"props":333181,"children":333184},{"alt":333182,"src":333183},"Screenshot_2024-11-14_at_5.10.40_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_slack_webhooks_using_event_subscriptions-0.png",[],{"type":17,"tag":84,"props":333186,"children":333187},{},[333188,333189,333194],{"type":23,"value":6629},{"type":17,"tag":48,"props":333190,"children":333191},{},[333192],{"type":23,"value":333193},"Save Changes",{"type":23,"value":333195}," at the bottom of the page",{"type":17,"tag":68,"props":333197,"children":333199},{"id":333198},"subscribe-to-events-from-slack",[333200],{"type":23,"value":333201},"Subscribe to events from Slack",{"type":17,"tag":29,"props":333203,"children":333204},{},[333205],{"type":23,"value":333206},"After you've enabled events and verified the request URL works, you need to subscribe to the events that you are interested in.",{"type":17,"tag":6154,"props":333208,"children":333209},{},[333210,333223,333289],{"type":17,"tag":84,"props":333211,"children":333212},{},[333213,333215,333221],{"type":23,"value":333214},"The minimum event you should subscribe to is",{"type":17,"tag":6121,"props":333216,"children":333218},{"className":333217},[],[333219],{"type":23,"value":333220},"message.groups",{"type":23,"value":333222}," (under user)",{"type":17,"tag":84,"props":333224,"children":333225},{},[333226,333228,333233,333234],{"type":23,"value":333227},"The other events you can subscribe to are the ones that fall under the following scopes under ",{"type":17,"tag":48,"props":333229,"children":333230},{},[333231],{"type":23,"value":333232},"Subscribe to events on behalf of users",{"type":23,"value":20456},{"type":17,"tag":6154,"props":333235,"children":333236},{},[333237,333246,333255,333264],{"type":17,"tag":84,"props":333238,"children":333239},{},[333240],{"type":17,"tag":6121,"props":333241,"children":333243},{"className":333242},[],[333244],{"type":23,"value":333245},"channels:history",{"type":17,"tag":84,"props":333247,"children":333248},{},[333249],{"type":17,"tag":6121,"props":333250,"children":333252},{"className":333251},[],[333253],{"type":23,"value":333254},"groups:history",{"type":17,"tag":84,"props":333256,"children":333257},{},[333258],{"type":17,"tag":6121,"props":333259,"children":333261},{"className":333260},[],[333262],{"type":23,"value":333263},"im:history",{"type":17,"tag":84,"props":333265,"children":333266},{},[333267,333273,333276,333281,333284],{"type":17,"tag":6121,"props":333268,"children":333270},{"className":333269},[],[333271],{"type":23,"value":333272},"mpim:history",{"type":17,"tag":3891,"props":333274,"children":333275},{},[],{"type":17,"tag":6438,"props":333277,"children":333280},{"alt":333278,"src":333279},"Screenshot_2025-01-09_at_4.25.30_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_slack_webhooks_using_event_subscriptions-1.png",[],{"type":17,"tag":3891,"props":333282,"children":333283},{},[],{"type":17,"tag":33,"props":333285,"children":333286},{},[333287],{"type":23,"value":333288},"Example of Slack events that you can subscribe to for webhook events",{"type":17,"tag":84,"props":333290,"children":333291},{},[333292,333293,333297],{"type":23,"value":6629},{"type":17,"tag":48,"props":333294,"children":333295},{},[333296],{"type":23,"value":333193},{"type":23,"value":333195},{"type":17,"tag":29,"props":333299,"children":333300},{},[333301],{"type":23,"value":333302},"Once completed, you can create webhooks in Unified.to that will receive these Slack events in real-time.",{"type":17,"tag":29,"props":333304,"children":333305},{},[333306],{"type":23,"value":329334},{"type":17,"tag":68,"props":333308,"children":333309},{"id":332205},[333310],{"type":23,"value":332208},{"type":17,"tag":80,"props":333312,"children":333313},{},[333314,333323],{"type":17,"tag":84,"props":333315,"children":333316},{},[333317],{"type":17,"tag":133,"props":333318,"children":333320},{"href":327403,"rel":333319},[214],[333321],{"type":23,"value":333322},"How to create and configure webhooks",{"type":17,"tag":84,"props":333324,"children":333325},{},[333326],{"type":17,"tag":133,"props":333327,"children":333330},{"href":333328,"rel":333329},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_webhooks",[214],[333331],{"type":23,"value":333332},"How to troubleshoot unhealthy webhooks",{"title":7,"searchDepth":1629,"depth":1629,"links":333334},[333335,333336,333337,333338],{"id":177146,"depth":1629,"text":177149},{"id":333066,"depth":1629,"text":333069},{"id":333198,"depth":1629,"text":333201},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_set_up_slack_webhooks_using_event_subscriptions.md","blog/how_to_set_up_slack_webhooks_using_event_subscriptions.md","blog/how_to_set_up_slack_webhooks_using_event_subscriptions",{"_path":333343,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":333344,"description":333345,"img":333346,"date":333347,"tag":6341,"body":333348,"_type":1677,"_id":333609,"_source":1679,"_file":333610,"_stem":333611,"_extension":1682},"/blog/how_to_customize_portal_urls_for_stripe_and_gocardless","How to customize portal URLs for Stripe and GoCardless","This guide explains how to customize the portal URLs for Stripe and GoCardless contacts to control payment method flows and redirects. Portal URLs allow your...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_customize_portal_urls_for_stripe_and_gocardless-icon.png","2024-11-13T00:00:00.000Z",{"type":14,"children":333349,"toc":333601},[333350,333355,333358,333366,333371,333375,333380,333397,333403,333423,333428,333437,333443,333448,333497,333503,333508,333552,333584,333588],{"type":17,"tag":18,"props":333351,"children":333353},{"id":333352},"how-to-customize-portal-urls-for-stripe-and-gocardless",[333354],{"type":23,"value":333344},{"type":17,"tag":25,"props":333356,"children":333357},{},[],{"type":17,"tag":29,"props":333359,"children":333360},{},[333361],{"type":17,"tag":33,"props":333362,"children":333363},{},[333364],{"type":23,"value":333365},"November 13, 2024",{"type":17,"tag":29,"props":333367,"children":333368},{},[333369],{"type":23,"value":333370},"This guide explains how to customize the portal URLs for Stripe and GoCardless contacts to control payment method flows and redirects. Portal URLs allow your customers to manage their payment methods and perform other operations through a dedicated UI.",{"type":17,"tag":68,"props":333372,"children":333373},{"id":177146},[333374],{"type":23,"value":177149},{"type":17,"tag":29,"props":333376,"children":333377},{},[333378],{"type":23,"value":333379},"This guide assumes you have:",{"type":17,"tag":80,"props":333381,"children":333382},{},[333383,333392],{"type":17,"tag":84,"props":333384,"children":333385},{},[333386,333388],{"type":23,"value":333387},"A basic understanding of the ",{"type":17,"tag":133,"props":333389,"children":333390},{"href":7691},[333391],{"type":23,"value":7806},{"type":17,"tag":84,"props":333393,"children":333394},{},[333395],{"type":23,"value":333396},"An active integration with either Stripe or GoCardless",{"type":17,"tag":68,"props":333398,"children":333400},{"id":333399},"understanding-portal-urls",[333401],{"type":23,"value":333402},"Understanding portal URLs",{"type":17,"tag":29,"props":333404,"children":333405},{},[333406,333408,333413,333415,333421],{"type":23,"value":333407},"When working with the ",{"type":17,"tag":6121,"props":333409,"children":333411},{"className":333410},[],[333412],{"type":23,"value":71542},{"type":23,"value":333414}," object for Stripe and GoCardless integrations, each contact includes a ",{"type":17,"tag":6121,"props":333416,"children":333418},{"className":333417},[],[333419],{"type":23,"value":333420},"portal_url",{"type":23,"value":333422}," field. This URL provides access to the contact's portal UI where they can perform various operations, such as managing payment methods.",{"type":17,"tag":29,"props":333424,"children":333425},{},[333426],{"type":23,"value":333427},"For example, a typical response might look like:",{"type":17,"tag":6893,"props":333429,"children":333432},{"className":333430,"code":333431,"language":6898,"meta":7},[6896],"{\n   \"id\": 77558,\n   \"portal_url\": \"\u003Chttps://api.unified.to/accounting/{connection_id}/contact/{contact_id}/portal>\"\n}\n",[333433],{"type":17,"tag":6121,"props":333434,"children":333435},{"__ignoreMap":7},[333436],{"type":23,"value":333431},{"type":17,"tag":68,"props":333438,"children":333440},{"id":333439},"customize-the-portal-url",[333441],{"type":23,"value":333442},"Customize the portal URL",{"type":17,"tag":29,"props":333444,"children":333445},{},[333446],{"type":23,"value":333447},"You can customize the portal URL's behaviour by appending specific query parameters to your API calls. The following parameters are available:",{"type":17,"tag":6154,"props":333449,"children":333450},{},[333451,333462],{"type":17,"tag":84,"props":333452,"children":333453},{},[333454,333460],{"type":17,"tag":6121,"props":333455,"children":333457},{"className":333456},[],[333458],{"type":23,"value":333459},"success_url",{"type":23,"value":333461}," (optional): Specifies where users should be redirected after completing their action",{"type":17,"tag":84,"props":333463,"children":333464},{},[333465,333470,333472],{"type":17,"tag":6121,"props":333466,"children":333468},{"className":333467},[],[333469],{"type":23,"value":27310},{"type":23,"value":333471}," (optional): Specifies the type of action the link is intended for. Available values:\n",{"type":17,"tag":80,"props":333473,"children":333474},{},[333475,333486],{"type":17,"tag":84,"props":333476,"children":333477},{},[333478,333484],{"type":17,"tag":6121,"props":333479,"children":333481},{"className":333480},[],[333482],{"type":23,"value":333483},"portal",{"type":23,"value":333485},": Generates a standard portal UI link (default)",{"type":17,"tag":84,"props":333487,"children":333488},{},[333489,333495],{"type":17,"tag":6121,"props":333490,"children":333492},{"className":333491},[],[333493],{"type":23,"value":333494},"add_payment_method",{"type":23,"value":333496},": Generates a portal UI URL specifically for adding a new payment method",{"type":17,"tag":239,"props":333498,"children":333500},{"id":333499},"add-a-payment-method-with-custom-redirect",[333501],{"type":23,"value":333502},"Add a payment method with custom redirect",{"type":17,"tag":29,"props":333504,"children":333505},{},[333506],{"type":23,"value":333507},"To create a URL that allows customers to add a payment method and redirects them upon completion:",{"type":17,"tag":6154,"props":333509,"children":333510},{},[333511,333525],{"type":17,"tag":84,"props":333512,"children":333513},{},[333514,333516],{"type":23,"value":333515},"Start with the original portal URL from the contact object:",{"type":17,"tag":6893,"props":333517,"children":333520},{"className":333518,"code":333519,"language":6898,"meta":7},[6896],"https://api.unified.to/accounting/{connection_id}/contact/{contact_id}/portal\n",[333521],{"type":17,"tag":6121,"props":333522,"children":333523},{"__ignoreMap":7},[333524],{"type":23,"value":333519},{"type":17,"tag":84,"props":333526,"children":333527},{},[333528,333530,333535,333536,333541,333543],{"type":23,"value":333529},"Append the ",{"type":17,"tag":6121,"props":333531,"children":333533},{"className":333532},[],[333534],{"type":23,"value":333459},{"type":23,"value":34435},{"type":17,"tag":6121,"props":333537,"children":333539},{"className":333538},[],[333540],{"type":23,"value":27310},{"type":23,"value":333542}," parameters:",{"type":17,"tag":6893,"props":333544,"children":333547},{"className":333545,"code":333546,"language":6898,"meta":7},[6896],"https://api.unified.to/accounting/{connection_id}/contact/{contact_id}/portal?success_url=YOUR_REDIRECT_URL&type=add_payment_method\n",[333548],{"type":17,"tag":6121,"props":333549,"children":333550},{"__ignoreMap":7},[333551],{"type":23,"value":333546},{"type":17,"tag":29,"props":333553,"children":333554},{},[333555,333557,333562,333563,333568,333570,333575,333577,333583],{"type":23,"value":333556},"Note: Both ",{"type":17,"tag":6121,"props":333558,"children":333560},{"className":333559},[],[333561],{"type":23,"value":333459},{"type":23,"value":34435},{"type":17,"tag":6121,"props":333564,"children":333566},{"className":333565},[],[333567],{"type":23,"value":27310},{"type":23,"value":333569}," parameters are optional. If ",{"type":17,"tag":6121,"props":333571,"children":333573},{"className":333572},[],[333574],{"type":23,"value":27310},{"type":23,"value":333576}," is not specified, the system defaults to ",{"type":17,"tag":6121,"props":333578,"children":333580},{"className":333579},[],[333581],{"type":23,"value":333582},"type=portal",{"type":23,"value":54},{"type":17,"tag":68,"props":333585,"children":333586},{"id":332205},[333587],{"type":23,"value":332208},{"type":17,"tag":80,"props":333589,"children":333590},{},[333591],{"type":17,"tag":84,"props":333592,"children":333593},{},[333594],{"type":17,"tag":133,"props":333595,"children":333598},{"href":333596,"rel":333597},"https://docs.unified.to/accounting/contact/model",[214],[333599],{"type":23,"value":333600},"Accounting contact object reference",{"title":7,"searchDepth":1629,"depth":1629,"links":333602},[333603,333604,333605,333608],{"id":177146,"depth":1629,"text":177149},{"id":333399,"depth":1629,"text":333402},{"id":333439,"depth":1629,"text":333442,"children":333606},[333607],{"id":333499,"depth":1635,"text":333502},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_customize_portal_urls_for_stripe_and_gocardless.md","blog/how_to_customize_portal_urls_for_stripe_and_gocardless.md","blog/how_to_customize_portal_urls_for_stripe_and_gocardless",{"_path":333613,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":333614,"description":333615,"img":333616,"date":333617,"tag":12,"body":333618,"_type":1677,"_id":333816,"_source":1679,"_file":333817,"_stem":333818,"_extension":1682},"/blog/unified_is_soc_2_compliant","Unified.to is SOC 2 Compliant","Unified.to achieves SOC 2 Type 2 compliance strengthening commitment to security, confidentiality, and availability.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_is_soc_2_compliant-icon.png","2024-11-07T00:00:00.000Z",{"type":14,"children":333619,"toc":333808},[333620,333625,333628,333636,333646,333654,333671,333682,333688,333693,333716,333722,333727,333733,333738,333743,333770,333776,333781,333786,333790,333795],{"type":17,"tag":18,"props":333621,"children":333623},{"id":333622},"unifiedto-is-soc-2-compliant",[333624],{"type":23,"value":333614},{"type":17,"tag":25,"props":333626,"children":333627},{},[],{"type":17,"tag":29,"props":333629,"children":333630},{},[333631],{"type":17,"tag":33,"props":333632,"children":333633},{},[333634],{"type":23,"value":333635},"November 7, 2024",{"type":17,"tag":29,"props":333637,"children":333638},{},[333639],{"type":17,"tag":33,"props":333640,"children":333641},{},[333642],{"type":17,"tag":48,"props":333643,"children":333644},{},[333645],{"type":23,"value":333615},{"type":17,"tag":29,"props":333647,"children":333648},{},[333649],{"type":17,"tag":6438,"props":333650,"children":333653},{"alt":333651,"src":333652},"unified_soc2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_is_soc_2_compliant-0.png",[],{"type":17,"tag":29,"props":333655,"children":333656},{},[333657,333659,333665,333669],{"type":23,"value":333658},"Since day one, Unified.to has put data security at the forefront, reflected in our real-time passthrough architecture and strict ",{"type":17,"tag":133,"props":333660,"children":333662},{"href":86962,"rel":333661},[214],[333663],{"type":23,"value":333664},"no-caching approach",{"type":17,"tag":48,"props":333666,"children":333667},{},[333668],{"type":23,"value":54},{"type":23,"value":333670}," In line with our commitment to high security standards, we're excited to announce that Unified.to is now SOC 2 Type 2 compliant. Our report covers the trust services criteria for security, confidentiality, and availability, underscoring our dedication to exceeding standard security benchmarks.",{"type":17,"tag":29,"props":333672,"children":333673},{},[333674,333676,333680],{"type":23,"value":333675},"As global software companies rely on Unified.to's real-time ",{"type":17,"tag":133,"props":333677,"children":333678},{"href":7691},[333679],{"type":23,"value":7459},{"type":23,"value":333681}," platform to manage hundreds of integrations for their customers, we dedicate substantial resources to maintaining a best-in-class security posture and practices.",{"type":17,"tag":68,"props":333683,"children":333685},{"id":333684},"what-is-soc-2",[333686],{"type":23,"value":333687},"What is SOC 2?",{"type":17,"tag":29,"props":333689,"children":333690},{},[333691],{"type":23,"value":333692},"SOC 2 is a compliance standard from the American Institute of CPAs (AICPA) that outlines guidelines for SaaS companies to protect customer data. It assesses organizations based on five Trust Services Criteria: security, availability and confidentiality. SOC 2 compliance requires an external audit and includes two types of reports:",{"type":17,"tag":80,"props":333694,"children":333695},{},[333696,333706],{"type":17,"tag":84,"props":333697,"children":333698},{},[333699,333704],{"type":17,"tag":48,"props":333700,"children":333701},{},[333702],{"type":23,"value":333703},"SOC 2 Type 1",{"type":23,"value":333705},": Verifies a company's compliance at a single point in time.",{"type":17,"tag":84,"props":333707,"children":333708},{},[333709,333714],{"type":17,"tag":48,"props":333710,"children":333711},{},[333712],{"type":23,"value":333713},"SOC 2 Type 2",{"type":23,"value":333715},": Assesses if a company maintains compliance over an extended period, typically 3 to 12 months.",{"type":17,"tag":68,"props":333717,"children":333719},{"id":333718},"why-soc-2-compliance-matters-to-us",[333720],{"type":23,"value":333721},"Why SOC 2 compliance matters to us",{"type":17,"tag":29,"props":333723,"children":333724},{},[333725],{"type":23,"value":333726},"We pursued SOC 2 compliance to reinforce our commitment to building trust with our customers. As an API integration infrastructure company, we understand that customers entrust us with their own customers' data. That's why we adopted a zero-liability principle—avoiding any caching or storage of your customers' third-party data on our servers—significantly reducing liability and enhancing data protection. This approach helped us meet SOC 2 confidentiality requirements seamlessly. Our dedication to high security standards enabled us not only to fulfill the core Security requirement but also to include Confidentiality and Availability in our report.",{"type":17,"tag":68,"props":333728,"children":333730},{"id":333729},"security-assessment",[333731],{"type":23,"value":333732},"Security assessment",{"type":17,"tag":29,"props":333734,"children":333735},{},[333736],{"type":23,"value":333737},"As part of the compliance process, Unified.to underwent a thorough independent security assessment. This evaluation included an extensive review of our security protocols, infrastructure, and data handling practices to ensure alignment with SOC 2 standards",{"type":17,"tag":68,"props":333739,"children":333741},{"id":333740},"trust-center",[333742],{"type":23,"value":252641},{"type":17,"tag":29,"props":333744,"children":333745},{},[333746,333748,333754,333760,333762,333768],{"type":23,"value":333747},"Today, we're also introducing our ",{"type":17,"tag":133,"props":333749,"children":333751},{"href":267279,"rel":333750},[214],[333752],{"type":23,"value":333753},"Trust ",{"type":17,"tag":133,"props":333755,"children":333757},{"href":252637,"rel":333756},[214],[333758],{"type":23,"value":333759},"Center",{"type":23,"value":333761},", where you can explore our compliance journey, data security practices, and privacy policy. We'll continue to make updates to this portal. Here, you can also access our audit report or ",{"type":17,"tag":133,"props":333763,"children":333765},{"href":215330,"rel":333764},[214],[333766],{"type":23,"value":333767},"get in touch with our team",{"type":23,"value":333769}," for more information.",{"type":17,"tag":68,"props":333771,"children":333773},{"id":333772},"what-our-soc-2-compliance-means-for-you",[333774],{"type":23,"value":333775},"What our SOC 2 compliance means for you",{"type":17,"tag":29,"props":333777,"children":333778},{},[333779],{"type":23,"value":333780},"By partnering with a SOC 2-compliant platform, you strengthen your own compliance posture, easing the burden of due diligence and meeting internal and regulatory requirements more easily.",{"type":17,"tag":29,"props":333782,"children":333783},{},[333784],{"type":23,"value":333785},"SOC 2 compliance is essential for industries like finance, e-commerce, and HR, where data protection and privacy standards are non-negotiable. With Unified.to's SOC 2 compliance, you're backed by robust security across use cases in recruitment, sales, HR, customer support and payments. As we've shared, our zero-liability approach means we don't store or cache your customers' third-party data, reinforcing limited data exposure and offering you peace of mind about data integrity.",{"type":17,"tag":68,"props":333787,"children":333788},{"id":326027},[333789],{"type":23,"value":326030},{"type":17,"tag":29,"props":333791,"children":333792},{},[333793],{"type":23,"value":333794},"We're dedicated to continuously enhancing our security and compliance efforts. With our SOC 2 Type 2 compliance, we have validated our ability to uphold rigorous standards over time. These initiatives ensure our standards not only meet but exceed industry expectations.",{"type":17,"tag":29,"props":333796,"children":333797},{},[333798,333800,333806],{"type":23,"value":333799},"If you'd like to learn more about our SOC 2 compliance, ",{"type":17,"tag":133,"props":333801,"children":333803},{"href":215330,"rel":333802},[214],[333804],{"type":23,"value":333805},"reach out to our team",{"type":23,"value":333807},". We're always  happy to discuss how we can support your security and privacy needs.",{"title":7,"searchDepth":1629,"depth":1629,"links":333809},[333810,333811,333812,333813,333814,333815],{"id":333684,"depth":1629,"text":333687},{"id":333718,"depth":1629,"text":333721},{"id":333729,"depth":1629,"text":333732},{"id":333740,"depth":1629,"text":252641},{"id":333772,"depth":1629,"text":333775},{"id":326027,"depth":1629,"text":326030},"content:blog:unified_is_soc_2_compliant.md","blog/unified_is_soc_2_compliant.md","blog/unified_is_soc_2_compliant",{"_path":333820,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":333821,"description":333822,"img":333823,"date":333617,"tag":6341,"body":333824,"_type":1677,"_id":334326,"_source":1679,"_file":334327,"_stem":334328,"_extension":1682},"/blog/working_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis","Working with hierarchical tree data in Storage, Messaging, and KMS APIs","This guide explains how to retrieve and traverse hierarchical data structures (i.e., trees) when working with APIs that support parent-child relationships.","https://s3.us-east-2.amazonaws.com/unified-article-images/working_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis-icon.png",{"type":14,"children":333825,"toc":334313},[333826,333831,333834,333841,333845,333849,333854,333904,333909,333913,333917,333932,333938,333950,334007,334013,334018,334064,334073,334086,334092,334097,334106,334130,334135,334140,334166,334175,334198,334204,334210,334215,334248,334253,334271,334278,334296,334300],{"type":17,"tag":18,"props":333827,"children":333829},{"id":333828},"working-with-hierarchical-tree-data-in-storage-messaging-and-kms-apis",[333830],{"type":23,"value":333821},{"type":17,"tag":25,"props":333832,"children":333833},{},[],{"type":17,"tag":29,"props":333835,"children":333836},{},[333837],{"type":17,"tag":33,"props":333838,"children":333839},{},[333840],{"type":23,"value":333635},{"type":17,"tag":29,"props":333842,"children":333843},{},[333844],{"type":23,"value":333822},{"type":17,"tag":68,"props":333846,"children":333847},{"id":42649},[333848],{"type":23,"value":42652},{"type":17,"tag":29,"props":333850,"children":333851},{},[333852],{"type":23,"value":333853},"Many APIs organize their data in tree-like structures, where records can have parent-child relationships with each other.",{"type":17,"tag":6154,"props":333855,"children":333856},{},[333857,333874,333893],{"type":17,"tag":84,"props":333858,"children":333859},{},[333860,333861,333872],{"type":23,"value":6712},{"type":17,"tag":48,"props":333862,"children":333863},{},[333864,333866,333870],{"type":23,"value":333865},"[File ",{"type":17,"tag":133,"props":333867,"children":333868},{"href":28977},[333869],{"type":23,"value":72479},{"type":23,"value":333871},"](/storage)",{"type":23,"value":333873}," represents both folders and files as a single object type, making tree traversal straightforward. While you can think of folders as the 'containers' for other files and folders, the API treats them all as the same object type.",{"type":17,"tag":84,"props":333875,"children":333876},{},[333877,333878,333885,333886,333891],{"type":23,"value":6712},{"type":17,"tag":48,"props":333879,"children":333880},{},[333881],{"type":17,"tag":133,"props":333882,"children":333883},{"href":14913},[333884],{"type":23,"value":27356},{"type":23,"value":34435},{"type":17,"tag":48,"props":333887,"children":333888},{},[333889],{"type":23,"value":333890},"Tasks API",{"type":23,"value":333892}," use a simple parent-child relationship where each object type can contain children of the next type (e.g., projects contain tasks, tasks contain comments, channels contain messages). Objects may also have parents of the same type.",{"type":17,"tag":84,"props":333894,"children":333895},{},[333896,333898,333902],{"type":23,"value":333897},"Some ",{"type":17,"tag":48,"props":333899,"children":333900},{},[333901],{"type":23,"value":172988},{"type":23,"value":333903}," have more complex relationships where pages and spaces can reference each other in multiple directions e.g., a mesh. While most KMS platforms use a simple tree structure (like Confluence), some (like Notion) support this more flexible mesh-like organization.",{"type":17,"tag":29,"props":333905,"children":333906},{},[333907],{"type":23,"value":333908},"This guide will show you how to efficiently traverse these hierarchical structures to retrieve all the data you need.",{"type":17,"tag":68,"props":333910,"children":333911},{"id":177146},[333912],{"type":23,"value":177149},{"type":17,"tag":29,"props":333914,"children":333915},{},[333916],{"type":23,"value":333379},{"type":17,"tag":80,"props":333918,"children":333919},{},[333920],{"type":17,"tag":84,"props":333921,"children":333922},{},[333923,333925],{"type":23,"value":333924},"Basic understanding of ",{"type":17,"tag":133,"props":333926,"children":333929},{"href":333927,"rel":333928},"https://en.wikipedia.org/wiki/Tree_(abstract_data_type)",[214],[333930],{"type":23,"value":333931},"tree data structures",{"type":17,"tag":68,"props":333933,"children":333935},{"id":333934},"understanding-parent-child-relationships",[333936],{"type":23,"value":333937},"Understanding parent-child relationships",{"type":17,"tag":29,"props":333939,"children":333940},{},[333941,333943,333948],{"type":23,"value":333942},"When an API endpoint supports a ",{"type":17,"tag":6121,"props":333944,"children":333946},{"className":333945},[],[333947],{"type":23,"value":15863},{"type":23,"value":333949}," parameter, it typically indicates that the data is organized in a hierarchical structure. To fully traverse this structure, you'll need to:",{"type":17,"tag":6154,"props":333951,"children":333952},{},[333953,333958,333963,333968],{"type":17,"tag":84,"props":333954,"children":333955},{},[333956],{"type":23,"value":333957},"Get the top-level entities (parent nodes)",{"type":17,"tag":84,"props":333959,"children":333960},{},[333961],{"type":23,"value":333962},"For each parent, retrieve its children by passing the parent's ID",{"type":17,"tag":84,"props":333964,"children":333965},{},[333966],{"type":23,"value":333967},"Recursively repeat this process for any children that can also be parents",{"type":17,"tag":84,"props":333969,"children":333970},{},[333971,333973,333978,333980,333985,333987,333992,333994,334000,334002],{"type":23,"value":333972},"For KMS Page, you can use its ",{"type":17,"tag":6121,"props":333974,"children":333976},{"className":333975},[],[333977],{"type":23,"value":160848},{"type":23,"value":333979}," field to determine if there are children pages to query. If ",{"type":17,"tag":6121,"props":333981,"children":333983},{"className":333982},[],[333984],{"type":23,"value":160848},{"type":23,"value":333986}," is equal ",{"type":17,"tag":6121,"props":333988,"children":333990},{"className":333989},[],[333991],{"type":23,"value":49332},{"type":23,"value":333993}," , then no children pages exist.  Some integrations di not return this information, so if this field is ",{"type":17,"tag":6121,"props":333995,"children":333997},{"className":333996},[],[333998],{"type":23,"value":333999},"undefined",{"type":23,"value":334001}," or missing, then you should treat it as a ",{"type":17,"tag":6121,"props":334003,"children":334005},{"className":334004},[],[334006],{"type":23,"value":49324},{"type":17,"tag":239,"props":334008,"children":334010},{"id":334009},"example-messaging-platforms",[334011],{"type":23,"value":334012},"Example: Messaging platforms",{"type":17,"tag":29,"props":334014,"children":334015},{},[334016],{"type":23,"value":334017},"Let's look at how this works with Discord:",{"type":17,"tag":6154,"props":334019,"children":334020},{},[334021,334026,334031,334041],{"type":17,"tag":84,"props":334022,"children":334023},{},[334024],{"type":23,"value":334025},"Discord servers (also called \"guilds\") are top-level parents",{"type":17,"tag":84,"props":334027,"children":334028},{},[334029],{"type":23,"value":334030},"Channels exist within servers as children",{"type":17,"tag":84,"props":334032,"children":334033},{},[334034,334036],{"type":23,"value":334035},"Messages are also related to channels through their ",{"type":17,"tag":6121,"props":334037,"children":334039},{"className":334038},[],[334040],{"type":23,"value":15863},{"type":17,"tag":84,"props":334042,"children":334043},{},[334044,334046],{"type":23,"value":334045},"To get all channels:\n",{"type":17,"tag":80,"props":334047,"children":334048},{},[334049,334054],{"type":17,"tag":84,"props":334050,"children":334051},{},[334052],{"type":23,"value":334053},"First retrieve all guilds (servers)",{"type":17,"tag":84,"props":334055,"children":334056},{},[334057,334059],{"type":23,"value":334058},"Then get channels for each guild using the guild's ID as the ",{"type":17,"tag":6121,"props":334060,"children":334062},{"className":334061},[],[334063],{"type":23,"value":257385},{"type":17,"tag":6893,"props":334065,"children":334068},{"className":334066,"code":334067,"language":6898,"meta":7},[6896],"async function getAllChannels(connectionId) {\n    // Get all top-level guilds first\n    const guilds = await sdk.messaging.listMessagingChannels({\n        connectionId,\n    });\n\n    let allChannels = [];\n\n    // For each guild, get its channels\n    for (const guild of guilds.data) {\n        const channels = await sdk.messaging.listMessagingChannels({\n            connectionId,\n            parentChannelId: guild.id,\n        });\n        allChannels = allChannels.concat(channels.data);\n    }\n\n    return allChannels;\n}\n",[334069],{"type":17,"tag":6121,"props":334070,"children":334071},{"__ignoreMap":7},[334072],{"type":23,"value":334067},{"type":17,"tag":29,"props":334074,"children":334075},{},[334076,334080,334081],{"type":17,"tag":48,"props":334077,"children":334078},{},[334079],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":334082,"children":334084},{"href":107070,"rel":334083},[214],[334085],{"type":23,"value":27356},{"type":17,"tag":239,"props":334087,"children":334089},{"id":334088},"example-file-storage-systems",[334090],{"type":23,"value":334091},"Example: File storage systems",{"type":17,"tag":29,"props":334093,"children":334094},{},[334095],{"type":23,"value":334096},"File storage systems are another common example of hierarchical data. Here's how to recursively traverse a file system to get all files:",{"type":17,"tag":6893,"props":334098,"children":334101},{"className":334099,"code":334100,"language":6898,"meta":7},[6896],"async function getAllFiles(connectionId, parentId) {\n    const response = await sdk.storage.listStorageFiles({\n        connectionId,\n        parentId,\n    });\n\n    if (!response.data) {\n        return [];\n    }\n\n    let allFiles = [];\n\n    for (const item of response.data) {\n        if (item.type === 'FOLDER') {\n            // Recursively get files from subfolders\n            const subfolderFiles = await getAllFiles(connectionId, item.id);\n            allFiles = allFiles.concat(subfolderFiles);\n        } else {\n            allFiles.push(item);\n        }\n    }\n\n    return allFiles;\n}\n",[334102],{"type":17,"tag":6121,"props":334103,"children":334104},{"__ignoreMap":7},[334105],{"type":23,"value":334100},{"type":17,"tag":29,"props":334107,"children":334108},{},[334109,334113,334114,334120,334125],{"type":17,"tag":48,"props":334110,"children":334111},{},[334112],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":334115,"children":334117},{"href":163510,"rel":334116},[214],[334118],{"type":23,"value":334119},"File",{"type":17,"tag":133,"props":334121,"children":334123},{"href":163510,"rel":334122},[214],[334124],{"type":23,"value":18757},{"type":17,"tag":133,"props":334126,"children":334128},{"href":163510,"rel":334127},[214],[334129],{"type":23,"value":72479},{"type":17,"tag":68,"props":334131,"children":334132},{"id":183199},[334133],{"type":23,"value":334134},"Best practices",{"type":17,"tag":29,"props":334136,"children":334137},{},[334138],{"type":23,"value":334139},"When working with hierarchical data:",{"type":17,"tag":6154,"props":334141,"children":334142},{},[334143],{"type":17,"tag":84,"props":334144,"children":334145},{},[334146,334151,334153,334158,334159,334164],{"type":17,"tag":48,"props":334147,"children":334148},{},[334149],{"type":23,"value":334150},"Implement pagination",{"type":23,"value":334152},": Some nodes might have many children. Use the ",{"type":17,"tag":6121,"props":334154,"children":334156},{"className":334155},[],[334157],{"type":23,"value":48389},{"type":23,"value":34435},{"type":17,"tag":6121,"props":334160,"children":334162},{"className":334161},[],[334163],{"type":23,"value":48411},{"type":23,"value":334165}," parameters to handle large datasets.",{"type":17,"tag":6893,"props":334167,"children":334170},{"className":334168,"code":334169,"language":6898,"meta":7},[6896],"async function getAllChannelsWithPagination(connectionId, parentId = undefined) {\n    let allChannels = [];\n    let offset = 0;\n    const limit = 100;\n\n    while (true) {\n        const response = await sdk.messaging.listMessagingChannels({\n            connectionId,\n            parentChannelId: parentId,\n            limit,\n            offset,\n        });\n\n        if (!response.data || response.data.length === 0) {\n            break;\n        }\n\n        allChannels = allChannels.concat(response.data);\n        offset += limit;\n    }\n\n    return allChannels;\n}\n",[334171],{"type":17,"tag":6121,"props":334172,"children":334173},{"__ignoreMap":7},[334174],{"type":23,"value":334169},{"type":17,"tag":6154,"props":334176,"children":334177},{},[334178,334188],{"type":17,"tag":84,"props":334179,"children":334180},{},[334181,334186],{"type":17,"tag":48,"props":334182,"children":334183},{},[334184],{"type":23,"value":334185},"Handle rate limits",{"type":23,"value":334187},": When recursively fetching data, you might hit API rate limits. Implement backoff strategies and respect the provider's limits.",{"type":17,"tag":84,"props":334189,"children":334190},{},[334191,334196],{"type":17,"tag":48,"props":334192,"children":334193},{},[334194],{"type":23,"value":334195},"Cache parent IDs",{"type":23,"value":334197},": If you need to traverse the same structure multiple times, consider caching the parent-child relationships to reduce API calls.",{"type":17,"tag":68,"props":334199,"children":334201},{"id":334200},"integration-specific-gotchas",[334202],{"type":23,"value":334203},"Integration-specific gotchas",{"type":17,"tag":239,"props":334205,"children":334207},{"id":334206},"working-with-sharepoint",[334208],{"type":23,"value":334209},"Working with SharePoint",{"type":17,"tag":29,"props":334211,"children":334212},{},[334213],{"type":23,"value":334214},"SharePoint implements a distinct three-level hierarchy that requires special attention:",{"type":17,"tag":6154,"props":334216,"children":334217},{},[334218,334228,334238],{"type":17,"tag":84,"props":334219,"children":334220},{},[334221,334226],{"type":17,"tag":48,"props":334222,"children":334223},{},[334224],{"type":23,"value":334225},"Sites",{"type":23,"value":334227}," (top level)",{"type":17,"tag":84,"props":334229,"children":334230},{},[334231,334236],{"type":17,"tag":48,"props":334232,"children":334233},{},[334234],{"type":23,"value":334235},"Drives",{"type":23,"value":334237}," (within sites)",{"type":17,"tag":84,"props":334239,"children":334240},{},[334241,334246],{"type":17,"tag":48,"props":334242,"children":334243},{},[334244],{"type":23,"value":334245},"Folders/Files",{"type":23,"value":334247}," (within drives)",{"type":17,"tag":29,"props":334249,"children":334250},{},[334251],{"type":23,"value":334252},"To work with SharePoint's file system:",{"type":17,"tag":6154,"props":334254,"children":334255},{},[334256,334261,334266],{"type":17,"tag":84,"props":334257,"children":334258},{},[334259],{"type":23,"value":334260},"First retrieve the site ID (top-most parent)",{"type":17,"tag":84,"props":334262,"children":334263},{},[334264],{"type":23,"value":334265},"Use the site ID to list drives",{"type":17,"tag":84,"props":334267,"children":334268},{},[334269],{"type":23,"value":334270},"Use the drive ID to create or access folders and files",{"type":17,"tag":29,"props":334272,"children":334273},{},[334274],{"type":17,"tag":48,"props":334275,"children":334276},{},[334277],{"type":23,"value":193764},{"type":17,"tag":80,"props":334279,"children":334280},{},[334281,334286,334291],{"type":17,"tag":84,"props":334282,"children":334283},{},[334284],{"type":23,"value":334285},"You cannot create files or folders directly at the site level - you must first select a drive",{"type":17,"tag":84,"props":334287,"children":334288},{},[334289],{"type":23,"value":334290},"Write operations are only supported for folders and files, not for sites or drives",{"type":17,"tag":84,"props":334292,"children":334293},{},[334294],{"type":23,"value":334295},"Pagination is not supported for sites and drives listings",{"type":17,"tag":68,"props":334297,"children":334298},{"id":332205},[334299],{"type":23,"value":332208},{"type":17,"tag":80,"props":334301,"children":334302},{},[334303],{"type":17,"tag":84,"props":334304,"children":334305},{},[334306],{"type":17,"tag":133,"props":334307,"children":334310},{"href":334308,"rel":334309},"https://docs.unified.to/guides/how_to_use_the_unified_file_storage_api#how-to-use-the-unified-file-storage-api",[214],[334311],{"type":23,"value":334312},"How to use the Unified File Storage API",{"title":7,"searchDepth":1629,"depth":1629,"links":334314},[334315,334316,334317,334321,334322,334325],{"id":42649,"depth":1629,"text":42652},{"id":177146,"depth":1629,"text":177149},{"id":333934,"depth":1629,"text":333937,"children":334318},[334319,334320],{"id":334009,"depth":1635,"text":334012},{"id":334088,"depth":1635,"text":334091},{"id":183199,"depth":1629,"text":334134},{"id":334200,"depth":1629,"text":334203,"children":334323},[334324],{"id":334206,"depth":1635,"text":334209},{"id":332205,"depth":1629,"text":332208},"content:blog:working_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis.md","blog/working_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis.md","blog/working_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis",{"_path":334330,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":334331,"description":334332,"img":334333,"date":334334,"tag":12,"body":334335,"_type":1677,"_id":334519,"_source":1679,"_file":334520,"_stem":334521,"_extension":1682},"/blog/integrate_the_indeed_api_with_unified","Integrate the Indeed API with Unified.to","Connecting your recruitment application to one of the world's largest job boards has never been easier. With Unified.to's support for Indeed, you can publish...","https://s3.us-east-2.amazonaws.com/unified-article-images/integrate_the_indeed_api_with_unified-icon.png","2024-10-30T00:00:00.000Z",{"type":14,"children":334336,"toc":334512},[334337,334342,334345,334353,334361,334375,334381,334386,334397,334403,334413,334423,334433,334439,334444,334452,334456,334461,334494,334498],{"type":17,"tag":18,"props":334338,"children":334340},{"id":334339},"integrate-the-indeed-api-with-unifiedto",[334341],{"type":23,"value":334331},{"type":17,"tag":25,"props":334343,"children":334344},{},[],{"type":17,"tag":29,"props":334346,"children":334347},{},[334348],{"type":17,"tag":33,"props":334349,"children":334350},{},[334351],{"type":23,"value":334352},"October 30, 2024",{"type":17,"tag":29,"props":334354,"children":334355},{},[334356],{"type":17,"tag":6438,"props":334357,"children":334360},{"alt":334358,"src":334359},"unified_indeed.png","https://s3.us-east-2.amazonaws.com/unified-article-images/integrate_the_indeed_api_with_unified-0.png",[],{"type":17,"tag":29,"props":334362,"children":334363},{},[334364,334366,334373],{"type":23,"value":334365},"Connecting your recruitment application to one of the world's largest job boards has never been easier. With Unified.to's support for ",{"type":17,"tag":133,"props":334367,"children":334370},{"href":334368,"rel":334369},"https://unified.to/integrations/indeed",[214],[334371],{"type":23,"value":334372},"Indeed",{"type":23,"value":334374},", you can publish jobs directly, reaching millions of active job seekers. Our pre-built Indeed integration lets you tap into Indeed's expansive audience without the complexity of managing the API yourself, making it simple to boost the visibility of your customers' job posts and attract qualified candidates.",{"type":17,"tag":68,"props":334376,"children":334378},{"id":334377},"why-indeed-matters",[334379],{"type":23,"value":334380},"Why Indeed matters",{"type":17,"tag":29,"props":334382,"children":334383},{},[334384],{"type":23,"value":334385},"Indeed offers extensive access to millions of job seekers. With the Indeed API, you can connect your recruiting application to Indeed, adding dynamic job posting functionality to your product. But setting up and managing this API can be complex—especially if your product already supports multiple job boards. That's where Unified.to comes in.",{"type":17,"tag":29,"props":334387,"children":334388},{},[334389,334391,334395],{"type":23,"value":334390},"Our Real-time ",{"type":17,"tag":133,"props":334392,"children":334393},{"href":7691},[334394],{"type":23,"value":7806},{"type":23,"value":334396}," approach handles the integration details, so you only need to focus on building what's best for your customers. Integrating the Indeed API through Unified.to centralizes your recruitment data across job boards, making it easier to add job posting features to your application.",{"type":17,"tag":68,"props":334398,"children":334400},{"id":334399},"what-you-can-do-with-indeed-via-our-unified-ats-api",[334401],{"type":23,"value":334402},"What you can do with Indeed via our Unified ATS API:",{"type":17,"tag":29,"props":334404,"children":334405},{},[334406,334411],{"type":17,"tag":48,"props":334407,"children":334408},{},[334409],{"type":23,"value":334410},"Automated Job Posting:",{"type":23,"value":334412}," Push job listings directly to Indeed from your application, saving time and increasing reach.",{"type":17,"tag":29,"props":334414,"children":334415},{},[334416,334421],{"type":17,"tag":48,"props":334417,"children":334418},{},[334419],{"type":23,"value":334420},"Real-Time Job Updates:",{"type":23,"value":334422}," Update job details on Indeed whenever there's a change in role description or other critical information.",{"type":17,"tag":29,"props":334424,"children":334425},{},[334426,334431],{"type":17,"tag":48,"props":334427,"children":334428},{},[334429],{"type":23,"value":334430},"Easy Job Removal:",{"type":23,"value":334432}," Support seamless job removal for roles that have been filled or closed.",{"type":17,"tag":68,"props":334434,"children":334436},{"id":334435},"how-unifiedto-simplifies-your-indeed-integration",[334437],{"type":23,"value":334438},"How Unified.to simplifies your Indeed integration",{"type":17,"tag":29,"props":334440,"children":334441},{},[334442],{"type":23,"value":334443},"Integrating with Indeed directly can take weeks of tedious work to manage API requests. Unified.to's API removes these complexities by normalizing data from Indeed and 40+ other ATS integrations like Workable, Lever, and JazzHR, so you only need one API to maintain. Plus, our platform handles ongoing API maintenance, so your integrations stay up-to-date and consistent.",{"type":17,"tag":29,"props":334445,"children":334446},{},[334447],{"type":17,"tag":6438,"props":334448,"children":334451},{"alt":334449,"src":334450},"Screen_Shot_2024-10-31_at_10.00.59_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/integrate_the_indeed_api_with_unified-1.png",[],{"type":17,"tag":68,"props":334453,"children":334454},{"id":182698},[334455],{"type":23,"value":325978},{"type":17,"tag":29,"props":334457,"children":334458},{},[334459],{"type":23,"value":334460},"Adding Indeed to your application with Unified.to is straightforward:",{"type":17,"tag":6154,"props":334462,"children":334463},{},[334464,334474,334484],{"type":17,"tag":84,"props":334465,"children":334466},{},[334467,334472],{"type":17,"tag":48,"props":334468,"children":334469},{},[334470],{"type":23,"value":334471},"Activate the Integration:",{"type":23,"value":334473}," Start by activating the Indeed integration within your Unified.to dashboard.",{"type":17,"tag":84,"props":334475,"children":334476},{},[334477,334482],{"type":17,"tag":48,"props":334478,"children":334479},{},[334480],{"type":23,"value":334481},"API Request Standardization:",{"type":23,"value":334483}," Unified.to's API takes care of standardizing responses, inputs, and API requests, so you can query Indeed the same way you would with any other ATS on our platform.",{"type":17,"tag":84,"props":334485,"children":334486},{},[334487,334492],{"type":17,"tag":48,"props":334488,"children":334489},{},[334490],{"type":23,"value":334491},"Automate Workflows:",{"type":23,"value":334493}," With Indeed data readily available, developers can easily automate workflows for job postings, candidate retrieval, and more.",{"type":17,"tag":68,"props":334495,"children":334496},{"id":256460},[334497],{"type":23,"value":256463},{"type":17,"tag":29,"props":334499,"children":334500},{},[334501,334503,334510],{"type":23,"value":334502},"With Indeed and other job boards on Unified.to, developers can accelerate integration launches for their recruitment applications, all with the simplicity of a single, unified API. ",{"type":17,"tag":133,"props":334504,"children":334507},{"href":334505,"rel":334506},"https://app.unified.to/login?utm_source=article&utm_medium=blog&utm_campaign=indeed_release",[214],[334508],{"type":23,"value":334509},"Get started today with a free trial",{"type":23,"value":334511},", and accelerate your API integration roadmap.",{"title":7,"searchDepth":1629,"depth":1629,"links":334513},[334514,334515,334516,334517,334518],{"id":334377,"depth":1629,"text":334380},{"id":334399,"depth":1629,"text":334402},{"id":334435,"depth":1629,"text":334438},{"id":182698,"depth":1629,"text":325978},{"id":256460,"depth":1629,"text":256463},"content:blog:integrate_the_indeed_api_with_unified.md","blog/integrate_the_indeed_api_with_unified.md","blog/integrate_the_indeed_api_with_unified",{"_path":334523,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":334524,"description":334525,"img":334526,"date":334334,"tag":12,"body":334527,"_type":1677,"_id":334900,"_source":1679,"_file":334901,"_stem":334902,"_extension":1682},"/blog/oct_2024_product_updates","Oct 2024 product updates","Unified.to is the fastest way to launch new integrations, and we've just added Indeed—one of the world's leading job boards—to our platform. With our unified...","https://s3.us-east-2.amazonaws.com/unified-article-images/oct_2024_product_updates-icon.png",{"type":14,"children":334528,"toc":334891},[334529,334534,334537,334544,334552,334557,334563,334574,334584,334590,334595,334667,334672,334682,334688,334693,334702,334708,334713,334722,334731,334736,334744,334807,334817,334823,334828,334836,334845,334855,334861,334866,334876,334881],{"type":17,"tag":18,"props":334530,"children":334532},{"id":334531},"oct-2024-product-updates",[334533],{"type":23,"value":334524},{"type":17,"tag":25,"props":334535,"children":334536},{},[],{"type":17,"tag":29,"props":334538,"children":334539},{},[334540],{"type":17,"tag":33,"props":334541,"children":334542},{},[334543],{"type":23,"value":334352},{"type":17,"tag":29,"props":334545,"children":334546},{},[334547],{"type":17,"tag":6438,"props":334548,"children":334551},{"alt":334549,"src":334550},"unified-product-oct-2024.png","https://s3.us-east-2.amazonaws.com/unified-article-images/oct_2024_product_updates-0.png",[],{"type":17,"tag":29,"props":334553,"children":334554},{},[334555],{"type":23,"value":334556},"Here are the top launches of the month:",{"type":17,"tag":68,"props":334558,"children":334560},{"id":334559},"indeed-is-now-on-unifiedto",[334561],{"type":23,"value":334562},"Indeed is now on Unified.to",{"type":17,"tag":29,"props":334564,"children":334565},{},[334566,334568,334572],{"type":23,"value":334567},"Unified.to is the fastest way to launch new integrations, and we've just added Indeed—one of the world's leading job boards—to our platform. With our unified ",{"type":17,"tag":133,"props":334569,"children":334570},{"href":55696},[334571],{"type":23,"value":55699},{"type":23,"value":334573},", you can now post jobs to your customers' Indeed accounts in real-time. Launch Indeed alongside 40+ other ATS integrations like Workable, Lever, and JazzHR in a day and seamlessly push and pull data to enhance your product.",{"type":17,"tag":29,"props":334575,"children":334576},{},[334577],{"type":17,"tag":133,"props":334578,"children":334581},{"href":334579,"rel":334580},"https://unified.to/blog/integrate_the_indeed_api_with_unified",[214],[334582],{"type":23,"value":334583},"Release Article",{"type":17,"tag":68,"props":334585,"children":334587},{"id":334586},"more-integration-launches",[334588],{"type":23,"value":334589},"More integration launches",{"type":17,"tag":29,"props":334591,"children":334592},{},[334593],{"type":23,"value":334594},"We've launched seven new pre-built integrations across key categories—e-commerce, accounting, ATS, task management, and data enrichment—further extending the integrations you can add to your products and offer to your customers. Now, with these additions, you can seamlessly access and manage a broader range of customer data for AI agents, insights, automation, and more.",{"type":17,"tag":80,"props":334596,"children":334597},{},[334598,334613,334623,334632,334642,334651,334659],{"type":17,"tag":84,"props":334599,"children":334600},{},[334601,334605,334607,334611],{"type":17,"tag":48,"props":334602,"children":334603},{},[334604],{"type":23,"value":38892},{"type":23,"value":334606}," (Unified [E-",{"type":17,"tag":133,"props":334608,"children":334609},{"href":20451},[334610],{"type":23,"value":37503},{"type":23,"value":334612},"](/commerce))",{"type":17,"tag":84,"props":334614,"children":334615},{},[334616,334621],{"type":17,"tag":48,"props":334617,"children":334618},{},[334619],{"type":23,"value":334620},"Zoho Invoice",{"type":23,"value":334622}," (Unified Accounting API)",{"type":17,"tag":84,"props":334624,"children":334625},{},[334626,334630],{"type":17,"tag":48,"props":334627,"children":334628},{},[334629],{"type":23,"value":12974},{"type":23,"value":334631}," (Unified Task Management API)",{"type":17,"tag":84,"props":334633,"children":334634},{},[334635,334640],{"type":17,"tag":48,"props":334636,"children":334637},{},[334638],{"type":23,"value":334639},"Cleon1",{"type":23,"value":334641}," (Unified Data Enrichment API)",{"type":17,"tag":84,"props":334643,"children":334644},{},[334645,334649],{"type":17,"tag":48,"props":334646,"children":334647},{},[334648],{"type":23,"value":334372},{"type":23,"value":334650}," (Unified ATS API)",{"type":17,"tag":84,"props":334652,"children":334653},{},[334654,334658],{"type":17,"tag":48,"props":334655,"children":334656},{},[334657],{"type":23,"value":56644},{"type":23,"value":334650},{"type":17,"tag":84,"props":334660,"children":334661},{},[334662,334666],{"type":17,"tag":48,"props":334663,"children":334664},{},[334665],{"type":23,"value":57980},{"type":23,"value":334650},{"type":17,"tag":29,"props":334668,"children":334669},{},[334670],{"type":23,"value":334671},"Unified.to simplifies adding integrations to your application, allowing you to pull, push, and manage essential customer data effortlessly, all through a unified API that delivers fresh, real-time, and normalized data.",{"type":17,"tag":29,"props":334673,"children":334674},{},[334675],{"type":17,"tag":133,"props":334676,"children":334679},{"href":334677,"rel":334678},"https://unified.to/integrations?utm_source=article&utm_medium=blog&utm_campaign=oct_product_update",[214],[334680],{"type":23,"value":334681},"All Integrations",{"type":17,"tag":68,"props":334683,"children":334685},{"id":334684},"unified-scim-api",[334686],{"type":23,"value":334687},"Unified SCIM API",{"type":17,"tag":29,"props":334689,"children":334690},{},[334691],{"type":23,"value":334692},"Unified.to now offers SCIM support across all pre-built HR integrations, making identity management easier and more efficient. With our SCIM-compliant endpoints, you can manage user identities seamlessly across integrations. If SCIM is already part of your application, simply point to our endpoints for quick setup. Plus, with SCIM extensions, you have more flexibility to customize user attributes across platforms. Instantly expand SCIM-compatible identity management to 120+ integrations — all through Unified.to.",{"type":17,"tag":29,"props":334694,"children":334695},{},[334696],{"type":17,"tag":133,"props":334697,"children":334700},{"href":334698,"rel":334699},"https://unified.to/blog/unified_launches_scim_support_for_120+_integrations?utm_source=article&utm_medium=blog&utm_campaign=oct_product_update",[214],[334701],{"type":23,"value":334583},{"type":17,"tag":68,"props":334703,"children":334705},{"id":334704},"expanded-support-for-response-formats",[334706],{"type":23,"value":334707},"Expanded Support for Response Formats",{"type":17,"tag":29,"props":334709,"children":334710},{},[334711],{"type":23,"value":334712},"Unified.to now supports multiple response formats for our unified API, giving you greater flexibility in receiving and processing data from our endpoints. Alongside JSON (our default), you can now choose CSV, XML, SCIM+JSON (for SCIM and HR endpoints), and NDJSON (Newline Delimited JSON, ideal for AI data storage). These new formats are designed to fit your specific use cases and data processing workflows.",{"type":17,"tag":29,"props":334714,"children":334715},{},[334716],{"type":17,"tag":133,"props":334717,"children":334720},{"href":334718,"rel":334719},"https://unified.to/blog/expanded_support_for_response_formats?utm_source=article&utm_medium=blog&utm_campaign=oct_product_update",[214],[334721],{"type":23,"value":334583},{"type":17,"tag":68,"props":334723,"children":334725},{"id":334724},"introducing-accounting-orders",[334726],{"type":17,"tag":48,"props":334727,"children":334728},{},[334729],{"type":23,"value":334730},"Introducing Accounting Orders",{"type":17,"tag":29,"props":334732,"children":334733},{},[334734],{"type":23,"value":334735},"Accounting Orders are now officially supported through our Unified Accounting API, making it easier than ever to manage procurement and sales activities within your application. This feature provides enhanced control, reduces manual errors, and streamlines order processing for efficient financial management.",{"type":17,"tag":29,"props":334737,"children":334738},{},[334739],{"type":17,"tag":48,"props":334740,"children":334741},{},[334742],{"type":23,"value":334743},"Key Fields Include:",{"type":17,"tag":80,"props":334745,"children":334746},{},[334747,334757,334767,334777,334787,334797],{"type":17,"tag":84,"props":334748,"children":334749},{},[334750,334755],{"type":17,"tag":48,"props":334751,"children":334752},{},[334753],{"type":23,"value":334754},"Line items:",{"type":23,"value":334756}," Descriptions of products/services in the transaction",{"type":17,"tag":84,"props":334758,"children":334759},{},[334760,334765],{"type":17,"tag":48,"props":334761,"children":334762},{},[334763],{"type":23,"value":334764},"Billing address:",{"type":23,"value":334766}," Where invoices and billing documents are sent",{"type":17,"tag":84,"props":334768,"children":334769},{},[334770,334775],{"type":17,"tag":48,"props":334771,"children":334772},{},[334773],{"type":23,"value":334774},"Shipping addresses:",{"type":23,"value":334776}," Multiple addresses for logistics and delivery",{"type":17,"tag":84,"props":334778,"children":334779},{},[334780,334785],{"type":17,"tag":48,"props":334781,"children":334782},{},[334783],{"type":23,"value":334784},"Account ID:",{"type":23,"value":334786}," Links the order to a financial account",{"type":17,"tag":84,"props":334788,"children":334789},{},[334790,334795],{"type":17,"tag":48,"props":334791,"children":334792},{},[334793],{"type":23,"value":334794},"Contact ID:",{"type":23,"value":334796}," References the customer or vendor for the order",{"type":17,"tag":84,"props":334798,"children":334799},{},[334800,334805],{"type":17,"tag":48,"props":334801,"children":334802},{},[334803],{"type":23,"value":334804},"Type:",{"type":23,"value":334806}," Specifies if it's a purchase or sales order for clear organization",{"type":17,"tag":29,"props":334808,"children":334809},{},[334810],{"type":17,"tag":133,"props":334811,"children":334814},{"href":334812,"rel":334813},"https://docs.unified.to/accounting/order/model",[214],[334815],{"type":23,"value":334816},"Docs",{"type":17,"tag":68,"props":334818,"children":334820},{"id":334819},"svelte-authorization-component",[334821],{"type":23,"value":334822},"Svelte Authorization Component",{"type":17,"tag":29,"props":334824,"children":334825},{},[334826],{"type":23,"value":334827},"We're excited to introduce the Svelte Authorization component, adding support for the 'most loved' front-end framework. Svelte developers can now add our powerful authorization component directly into their applications, joining our existing support for React, Angular, and Vue.",{"type":17,"tag":29,"props":334829,"children":334830},{},[334831],{"type":17,"tag":48,"props":334832,"children":334833},{},[334834],{"type":23,"value":334835},"Implementation steps:",{"type":17,"tag":6893,"props":334837,"children":334840},{"className":334838,"code":334839,"language":18718,"meta":7},[18716],"npm install @unified-api/svelte-directory\n",[334841],{"type":17,"tag":6121,"props":334842,"children":334843},{"__ignoreMap":7},[334844],{"type":23,"value":334839},{"type":17,"tag":29,"props":334846,"children":334847},{},[334848],{"type":17,"tag":133,"props":334849,"children":334852},{"href":334850,"rel":334851},"https://www.npmjs.com/package/@unified-api/svelte-directory",[214],[334853],{"type":23,"value":334854},"Svelte Authorization Component on npm",{"type":17,"tag":68,"props":334856,"children":334858},{"id":334857},"import-existing-integrations",[334859],{"type":23,"value":334860},"Import Existing Integrations",{"type":17,"tag":29,"props":334862,"children":334863},{},[334864],{"type":23,"value":334865},"Easily import existing customer integrations into Unified.to using our new guide. This process lets you create secure connections with your customers' existing credentials, whether using API tokens or OAuth 2.0. Find full setup instructions and examples to simplify your integration process and maintain control over data access.",{"type":17,"tag":29,"props":334867,"children":334868},{},[334869],{"type":17,"tag":133,"props":334870,"children":334873},{"href":334871,"rel":334872},"https://unified.to/blog/how_to_import_your_integrations_into_unified?utm_source=article&utm_medium=blog&utm_campaign=oct_product_update",[214],[334874],{"type":23,"value":334875},"Guide",{"type":17,"tag":29,"props":334877,"children":334878},{},[334879],{"type":23,"value":334880},"Until next time. Happy Halloween, and keep building cool stuff.",{"type":17,"tag":29,"props":334882,"children":334883},{},[334884,334886],{"type":23,"value":334885},"Ready to launch integrations faster? ",{"type":17,"tag":133,"props":334887,"children":334889},{"href":331447,"rel":334888},[214],[334890],{"type":23,"value":215326},{"title":7,"searchDepth":1629,"depth":1629,"links":334892},[334893,334894,334895,334896,334897,334898,334899],{"id":334559,"depth":1629,"text":334562},{"id":334586,"depth":1629,"text":334589},{"id":334684,"depth":1629,"text":334687},{"id":334704,"depth":1629,"text":334707},{"id":334724,"depth":1629,"text":334730},{"id":334819,"depth":1629,"text":334822},{"id":334857,"depth":1629,"text":334860},"content:blog:oct_2024_product_updates.md","blog/oct_2024_product_updates.md","blog/oct_2024_product_updates",{"_path":334904,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":334905,"description":334906,"img":334907,"date":334908,"tag":6341,"body":334909,"_type":1677,"_id":335566,"_source":1679,"_file":335567,"_stem":335568,"_extension":1682},"/blog/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365","How to get your OAuth 2 credentials for Microsoft Dynamics 365","This guide explains how to obtain your OAuth 2.0 credentials and configure API permissions for Microsoft Dynamics 365 business applications in Microsoft Entra...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-icon.webp","2024-10-29T00:00:00.000Z",{"type":14,"children":334910,"toc":335557},[334911,334916,334919,334927,334938,334944,334949,334981,334993,334997,335001,335022,335028,335033,335172,335178,335298,335304,335497,335506,335531,335536,335540,335544],{"type":17,"tag":18,"props":334912,"children":334914},{"id":334913},"how-to-get-your-oauth-2-credentials-for-microsoft-dynamics-365",[334915],{"type":23,"value":334905},{"type":17,"tag":25,"props":334917,"children":334918},{},[],{"type":17,"tag":29,"props":334920,"children":334921},{},[334922],{"type":17,"tag":33,"props":334923,"children":334924},{},[334925],{"type":23,"value":334926},"October 29, 2024",{"type":17,"tag":29,"props":334928,"children":334929},{},[334930,334932,334936],{"type":23,"value":334931},"This guide explains how to obtain your ",{"type":17,"tag":133,"props":334933,"children":334934},{"href":779},[334935],{"type":23,"value":782},{"type":23,"value":334937}," 2.0 credentials and configure API permissions for Microsoft Dynamics 365 business applications in Microsoft Entra ID (formerly Azure Active Directory).",{"type":17,"tag":68,"props":334939,"children":334941},{"id":334940},"background",[334942],{"type":23,"value":334943},"Background",{"type":17,"tag":29,"props":334945,"children":334946},{},[334947],{"type":23,"value":334948},"Business applications in Microsoft Dynamics 365 use Microsoft's identity platform, Entra ID, for secure authentication. By registering your application on it, you establish a trusted connection that allows Unified.to to access Dynamics 365 data through Microsoft Graph (Microsoft's gateway to data and intelligence in Microsoft 365) and other Microsoft APIs. This works through:",{"type":17,"tag":80,"props":334950,"children":334951},{},[334952,334962,334972],{"type":17,"tag":84,"props":334953,"children":334954},{},[334955,334960],{"type":17,"tag":48,"props":334956,"children":334957},{},[334958],{"type":23,"value":334959},"Delegated access",{"type":23,"value":334961},": Your application acts on behalf of the signed-in user, with permissions granted by both the administrator and the user",{"type":17,"tag":84,"props":334963,"children":334964},{},[334965,334970],{"type":17,"tag":48,"props":334966,"children":334967},{},[334968],{"type":23,"value":334969},"OAuth 2.0 credentials",{"type":23,"value":334971},": These consist of a client ID (which identifies your application) and a client secret (which serves as your application's password)",{"type":17,"tag":84,"props":334973,"children":334974},{},[334975,334979],{"type":17,"tag":48,"props":334976,"children":334977},{},[334978],{"type":23,"value":163373},{"type":23,"value":334980},": Specific capabilities your application requests, which must be approved by an administrator",{"type":17,"tag":29,"props":334982,"children":334983},{},[334984,334986],{"type":23,"value":334985},"For more information, see: ",{"type":17,"tag":133,"props":334987,"children":334990},{"href":334988,"rel":334989},"https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview",[214],[334991],{"type":23,"value":334992},"What is the Microsoft identify platform?",{"type":17,"tag":68,"props":334994,"children":334995},{"id":177146},[334996],{"type":23,"value":177149},{"type":17,"tag":29,"props":334998,"children":334999},{},[335000],{"type":23,"value":333022},{"type":17,"tag":80,"props":335002,"children":335003},{},[335004,335017],{"type":17,"tag":84,"props":335005,"children":335006},{},[335007,335009,335016],{"type":23,"value":335008},"Access to the Microsoft Entra admin center (",{"type":17,"tag":133,"props":335010,"children":335013},{"href":335011,"rel":335012},"http://entra.microsoft.com/",[214],[335014],{"type":23,"value":335015},"entra.microsoft.com",{"type":23,"value":12034},{"type":17,"tag":84,"props":335018,"children":335019},{},[335020],{"type":23,"value":335021},"Administrator access to Microsoft Entra ID",{"type":17,"tag":68,"props":335023,"children":335025},{"id":335024},"register-your-application",[335026],{"type":23,"value":335027},"Register your application",{"type":17,"tag":29,"props":335029,"children":335030},{},[335031],{"type":23,"value":335032},"You'll first need to register an application in the Microsoft Entra admin center. This process will provide you with a client ID and client secret.",{"type":17,"tag":6154,"props":335034,"children":335035},{},[335036,335048,335090],{"type":17,"tag":84,"props":335037,"children":335038},{},[335039,335041],{"type":23,"value":335040},"Sign in to the ",{"type":17,"tag":133,"props":335042,"children":335045},{"href":335043,"rel":335044},"https://entra.microsoft.com/",[214],[335046],{"type":23,"value":335047},"Microsoft Entra admin center",{"type":17,"tag":84,"props":335049,"children":335050},{},[335051,335053],{"type":23,"value":335052},"Navigate to the App registrations page",{"type":17,"tag":80,"props":335054,"children":335055},{},[335056,335066,335074],{"type":17,"tag":84,"props":335057,"children":335058},{},[335059,335060,335064],{"type":23,"value":42950},{"type":17,"tag":48,"props":335061,"children":335062},{},[335063],{"type":23,"value":56878},{"type":23,"value":335065}," from the left sidebar",{"type":17,"tag":84,"props":335067,"children":335068},{},[335069,335070],{"type":23,"value":6629},{"type":17,"tag":48,"props":335071,"children":335072},{},[335073],{"type":23,"value":97027},{"type":17,"tag":84,"props":335075,"children":335076},{},[335077,335078,335082,335085],{"type":23,"value":6629},{"type":17,"tag":48,"props":335079,"children":335080},{},[335081],{"type":23,"value":217448},{"type":17,"tag":3891,"props":335083,"children":335084},{},[],{"type":17,"tag":6438,"props":335086,"children":335089},{"alt":335087,"src":335088},"Screenshot_2024-10-31_at_11.43.24_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-0.png",[],{"type":17,"tag":84,"props":335091,"children":335092},{},[335093,335095],{"type":23,"value":335094},"Configure your application",{"type":17,"tag":80,"props":335096,"children":335097},{},[335098,335103,335119,335155],{"type":17,"tag":84,"props":335099,"children":335100},{},[335101],{"type":23,"value":335102},"Enter a meaningful name (i.e. your product name)",{"type":17,"tag":84,"props":335104,"children":335105},{},[335106,335107,335112,335114],{"type":23,"value":146715},{"type":17,"tag":48,"props":335108,"children":335109},{},[335110],{"type":23,"value":335111},"Supported account types",{"type":23,"value":335113},", select ",{"type":17,"tag":48,"props":335115,"children":335116},{},[335117],{"type":23,"value":335118},"Accounts in any organizational directory (Any Microsoft Entra ID directory - Multitenant)",{"type":17,"tag":84,"props":335120,"children":335121},{},[335122,335123,335128,335130],{"type":23,"value":123278},{"type":17,"tag":48,"props":335124,"children":335125},{},[335126],{"type":23,"value":335127},"Redirect URI",{"type":23,"value":335129}," section:",{"type":17,"tag":80,"props":335131,"children":335132},{},[335133,335143],{"type":17,"tag":84,"props":335134,"children":335135},{},[335136,335137,335141],{"type":23,"value":42950},{"type":17,"tag":48,"props":335138,"children":335139},{},[335140],{"type":23,"value":217493},{"type":23,"value":335142}," as the platform",{"type":17,"tag":84,"props":335144,"children":335145},{},[335146,335148,335153],{"type":23,"value":335147},"Enter ",{"type":17,"tag":6121,"props":335149,"children":335151},{"className":335150},[],[335152],{"type":23,"value":42417},{"type":23,"value":335154}," as the redirect URI (or our EU URL)",{"type":17,"tag":84,"props":335156,"children":335157},{},[335158,335159,335164,335167],{"type":23,"value":6629},{"type":17,"tag":48,"props":335160,"children":335161},{},[335162],{"type":23,"value":335163},"Register",{"type":17,"tag":3891,"props":335165,"children":335166},{},[],{"type":17,"tag":6438,"props":335168,"children":335171},{"alt":335169,"src":335170},"Screenshot_2024-10-31_at_11.45.21_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-1.png",[],{"type":17,"tag":68,"props":335173,"children":335175},{"id":335174},"get-your-microsoft-dynamics-365-client-id-and-secret",[335176],{"type":23,"value":335177},"Get your Microsoft Dynamics 365 client ID and secret",{"type":17,"tag":6154,"props":335179,"children":335180},{},[335181,335211],{"type":17,"tag":84,"props":335182,"children":335183},{},[335184,335186],{"type":23,"value":335185},"Retrieve your client ID",{"type":17,"tag":80,"props":335187,"children":335188},{},[335189,335198],{"type":17,"tag":84,"props":335190,"children":335191},{},[335192,335194],{"type":23,"value":335193},"On your application's overview page, locate the ",{"type":17,"tag":48,"props":335195,"children":335196},{},[335197],{"type":23,"value":97034},{"type":17,"tag":84,"props":335199,"children":335200},{},[335201,335203,335206],{"type":23,"value":335202},"Copy this value - this is your client ID",{"type":17,"tag":3891,"props":335204,"children":335205},{},[],{"type":17,"tag":6438,"props":335207,"children":335210},{"alt":335208,"src":335209},"Screenshot_2024-10-31_at_11.49.27_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-2.png",[],{"type":17,"tag":84,"props":335212,"children":335213},{},[335214,335216],{"type":23,"value":335215},"Create a client secret",{"type":17,"tag":80,"props":335217,"children":335218},{},[335219,335228,335251,335256,335261,335270],{"type":17,"tag":84,"props":335220,"children":335221},{},[335222,335224],{"type":23,"value":335223},"In the left menu, select ",{"type":17,"tag":48,"props":335225,"children":335226},{},[335227],{"type":23,"value":217631},{"type":17,"tag":84,"props":335229,"children":335230},{},[335231,335232,335237,335238,335243,335246],{"type":23,"value":146715},{"type":17,"tag":48,"props":335233,"children":335234},{},[335235],{"type":23,"value":335236},"Client secrets",{"type":23,"value":333099},{"type":17,"tag":48,"props":335239,"children":335240},{},[335241],{"type":23,"value":335242},"New client secret",{"type":17,"tag":3891,"props":335244,"children":335245},{},[],{"type":17,"tag":6438,"props":335247,"children":335250},{"alt":335248,"src":335249},"Screenshot_2024-10-31_at_11.50.15_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-3.png",[],{"type":17,"tag":84,"props":335252,"children":335253},{},[335254],{"type":23,"value":335255},"Provide a description (optional, but helpful for tracking)",{"type":17,"tag":84,"props":335257,"children":335258},{},[335259],{"type":23,"value":335260},"Make sure that the expiration field is set to its maximum value",{"type":17,"tag":84,"props":335262,"children":335263},{},[335264,335265],{"type":23,"value":6629},{"type":17,"tag":48,"props":335266,"children":335267},{},[335268],{"type":23,"value":335269},"Add",{"type":17,"tag":84,"props":335271,"children":335272},{},[335273,335275,335280,335282,335285,335290],{"type":23,"value":335274},"Immediately copy the secret ",{"type":17,"tag":48,"props":335276,"children":335277},{},[335278],{"type":23,"value":335279},"Value",{"type":23,"value":335281}," (not the secret ID)",{"type":17,"tag":3891,"props":335283,"children":335284},{},[],{"type":17,"tag":6438,"props":335286,"children":335289},{"alt":335287,"src":335288},"Screenshot_2024-10-31_at_11.50.41_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-4.png",[],{"type":17,"tag":80,"props":335291,"children":335292},{},[335293],{"type":17,"tag":84,"props":335294,"children":335295},{},[335296],{"type":23,"value":335297},"Important: Store this value securely - you won't be able to view it again after leaving this page",{"type":17,"tag":68,"props":335299,"children":335301},{"id":335300},"configure-dynamics-365-api-permissions",[335302],{"type":23,"value":335303},"Configure Dynamics 365 API permissions",{"type":17,"tag":6154,"props":335305,"children":335306},{},[335307,335396],{"type":17,"tag":84,"props":335308,"children":335309},{},[335310,335312],{"type":23,"value":335311},"Set up required permissions for Microsoft Graph. These will be used to obtain information about your users.",{"type":17,"tag":80,"props":335313,"children":335314},{},[335315,335324,335332,335340,335348,335380],{"type":17,"tag":84,"props":335316,"children":335317},{},[335318,335320],{"type":23,"value":335319},"In the left menu, click ",{"type":17,"tag":48,"props":335321,"children":335322},{},[335323],{"type":23,"value":217543},{"type":17,"tag":84,"props":335325,"children":335326},{},[335327,335328],{"type":23,"value":6629},{"type":17,"tag":48,"props":335329,"children":335330},{},[335331],{"type":23,"value":217552},{"type":17,"tag":84,"props":335333,"children":335334},{},[335335,335336],{"type":23,"value":42950},{"type":17,"tag":48,"props":335337,"children":335338},{},[335339],{"type":23,"value":96938},{"type":17,"tag":84,"props":335341,"children":335342},{},[335343,335344],{"type":23,"value":44311},{"type":17,"tag":48,"props":335345,"children":335346},{},[335347],{"type":23,"value":217579},{"type":17,"tag":84,"props":335349,"children":335350},{},[335351,335353],{"type":23,"value":335352},"Search for and add the following OpenID permissions:",{"type":17,"tag":80,"props":335354,"children":335355},{},[335356,335364,335372],{"type":17,"tag":84,"props":335357,"children":335358},{},[335359],{"type":17,"tag":6121,"props":335360,"children":335362},{"className":335361},[],[335363],{"type":23,"value":98191},{"type":17,"tag":84,"props":335365,"children":335366},{},[335367],{"type":17,"tag":6121,"props":335368,"children":335370},{"className":335369},[],[335371],{"type":23,"value":62666},{"type":17,"tag":84,"props":335373,"children":335374},{},[335375],{"type":17,"tag":6121,"props":335376,"children":335378},{"className":335377},[],[335379],{"type":23,"value":97210},{"type":17,"tag":84,"props":335381,"children":335382},{},[335383,335384,335388,335391],{"type":23,"value":6629},{"type":17,"tag":48,"props":335385,"children":335386},{},[335387],{"type":23,"value":217593},{"type":17,"tag":3891,"props":335389,"children":335390},{},[],{"type":17,"tag":6438,"props":335392,"children":335395},{"alt":335393,"src":335394},"Screenshot_2024-10-31_at_11.58.11_AM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-5.png",[],{"type":17,"tag":84,"props":335397,"children":335398},{},[335399,335401],{"type":23,"value":335400},"Set up required permissions for the business application you are building under Microsoft Dynamics 365:",{"type":17,"tag":80,"props":335402,"children":335403},{},[335404,335415,335462,335470,335489],{"type":17,"tag":84,"props":335405,"children":335406},{},[335407,335409,335413],{"type":23,"value":335408},"From the API permissions screen, click ",{"type":17,"tag":48,"props":335410,"children":335411},{},[335412],{"type":23,"value":217543},{"type":23,"value":335414}," again",{"type":17,"tag":84,"props":335416,"children":335417},{},[335418,335419,335424,335426],{"type":23,"value":146715},{"type":17,"tag":48,"props":335420,"children":335421},{},[335422],{"type":23,"value":335423},"More Microsoft APIs, s",{"type":23,"value":335425},"elect the business application category you are building\n",{"type":17,"tag":80,"props":335427,"children":335428},{},[335429,335446],{"type":17,"tag":84,"props":335430,"children":335431},{},[335432,335434,335439,335441],{"type":23,"value":335433},"If you're using ",{"type":17,"tag":48,"props":335435,"children":335436},{},[335437],{"type":23,"value":335438},"Dynamics Sales,",{"type":23,"value":335440}," then select ",{"type":17,"tag":48,"props":335442,"children":335443},{},[335444],{"type":23,"value":335445},"Dynamics CRM",{"type":17,"tag":84,"props":335447,"children":335448},{},[335449,335450,335455,335457],{"type":23,"value":335433},{"type":17,"tag":48,"props":335451,"children":335452},{},[335453],{"type":23,"value":335454},"Dynamics Customer Engagement",{"type":23,"value":335456},", then select ",{"type":17,"tag":48,"props":335458,"children":335459},{},[335460],{"type":23,"value":335461},"Customer Insights",{"type":17,"tag":84,"props":335463,"children":335464},{},[335465,335466],{"type":23,"value":44311},{"type":17,"tag":48,"props":335467,"children":335468},{},[335469],{"type":23,"value":217579},{"type":17,"tag":84,"props":335471,"children":335472},{},[335473,335475],{"type":23,"value":335474},"Search for and add the following OpenID permissions:\n",{"type":17,"tag":80,"props":335476,"children":335477},{},[335478],{"type":17,"tag":84,"props":335479,"children":335480},{},[335481,335487],{"type":17,"tag":6121,"props":335482,"children":335484},{"className":335483},[],[335485],{"type":23,"value":335486},"user_impersonation",{"type":23,"value":335488}," (required for basic access)",{"type":17,"tag":84,"props":335490,"children":335491},{},[335492,335493],{"type":23,"value":6629},{"type":17,"tag":48,"props":335494,"children":335495},{},[335496],{"type":23,"value":217593},{"type":17,"tag":68,"props":335498,"children":335500},{"id":335499},"enter-your-microsoft-dynamics-365-credentials-on-unifiedto",[335501],{"type":17,"tag":48,"props":335502,"children":335503},{},[335504],{"type":23,"value":335505},"Enter your Microsoft Dynamics 365  credentials on Unified.to",{"type":17,"tag":6154,"props":335507,"children":335508},{},[335509,335522,335527],{"type":17,"tag":84,"props":335510,"children":335511},{},[335512,335513,335520],{"type":23,"value":6661},{"type":17,"tag":133,"props":335514,"children":335517},{"href":335515,"rel":335516},"https://app.unified.to/integrations/microsoftdynamics",[214],[335518],{"type":23,"value":335519},"https://app.unified.to/integrations/",{"type":23,"value":335521}," and search for the integration you're using",{"type":17,"tag":84,"props":335523,"children":335524},{},[335525],{"type":23,"value":335526},"Enter your client ID and client secret from the steps above",{"type":17,"tag":84,"props":335528,"children":335529},{},[335530],{"type":23,"value":329148},{"type":17,"tag":29,"props":335532,"children":335533},{},[335534],{"type":23,"value":335535},"Congratulations, you can now use the Microsoft Dynamics 365 integration in your application.",{"type":17,"tag":29,"props":335537,"children":335538},{},[335539],{"type":23,"value":329334},{"type":17,"tag":68,"props":335541,"children":335542},{"id":332205},[335543],{"type":23,"value":332208},{"type":17,"tag":80,"props":335545,"children":335546},{},[335547],{"type":17,"tag":84,"props":335548,"children":335549},{},[335550],{"type":17,"tag":133,"props":335551,"children":335554},{"href":335552,"rel":335553},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_connections#how-to-troubleshoot-unhealthy-connections",[214],[335555],{"type":23,"value":335556},"How to troubleshoot unhealthy connections",{"title":7,"searchDepth":1629,"depth":1629,"links":335558},[335559,335560,335561,335562,335563,335564,335565],{"id":334940,"depth":1629,"text":334943},{"id":177146,"depth":1629,"text":177149},{"id":335024,"depth":1629,"text":335027},{"id":335174,"depth":1629,"text":335177},{"id":335300,"depth":1629,"text":335303},{"id":335499,"depth":1629,"text":335505},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365.md","blog/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365.md","blog/how_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365",{"_path":335570,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":252663,"description":335571,"img":335572,"date":335573,"tag":6341,"body":335574,"_type":1677,"_id":336087,"_source":1679,"_file":336088,"_stem":336089,"_extension":1682},"/blog/how_to_migrate_or_import_your_integrations_into_unified","This guide explains how to import your existing integrations into Unified.to, effectively creating new connections using your existing customer credentials. A...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_migrate_or_import_your_integrations_into_unified-icon.webp","2024-10-25T00:00:00.000Z",{"type":14,"children":335575,"toc":336073},[335576,335581,335584,335592,335599,335604,335609,335613,335617,335643,335649,335654,335660,335673,335679,335697,335703,335708,335754,335758,335767,335783,335789,335794,335803,335816,335825,335848,335854,335868,335877,335890,335898,335919,335925,335937,335946,335960,335966,335971,335989,335995,336040,336044],{"type":17,"tag":18,"props":335577,"children":335579},{"id":335578},"how-to-migrate-or-import-your-integrations-into-unifiedto",[335580],{"type":23,"value":252663},{"type":17,"tag":25,"props":335582,"children":335583},{},[],{"type":17,"tag":29,"props":335585,"children":335586},{},[335587],{"type":17,"tag":33,"props":335588,"children":335589},{},[335590],{"type":23,"value":335591},"October 25, 2024",{"type":17,"tag":29,"props":335593,"children":335594},{},[335595],{"type":17,"tag":6438,"props":335596,"children":335598},{"alt":253956,"src":335597},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_migrate_or_import_your_integrations_into_unified-0.png",[],{"type":17,"tag":29,"props":335600,"children":335601},{},[335602],{"type":23,"value":335603},"This guide explains how to import your existing integrations into Unified.to, effectively creating new connections using your existing customer credentials. A connection is a secure link between your application and your customer's third-party account.",{"type":17,"tag":29,"props":335605,"children":335606},{},[335607],{"type":23,"value":335608},"While connections are typically created through an auth flow where users grant access through the provider's authorization page, you can also create connections by importing existing credentials that your customers have already provided to you.",{"type":17,"tag":68,"props":335610,"children":335611},{"id":177146},[335612],{"type":23,"value":177149},{"type":17,"tag":29,"props":335614,"children":335615},{},[335616],{"type":23,"value":333379},{"type":17,"tag":80,"props":335618,"children":335619},{},[335620,335625,335630],{"type":17,"tag":84,"props":335621,"children":335622},{},[335623],{"type":23,"value":335624},"A Unified.to account.",{"type":17,"tag":84,"props":335626,"children":335627},{},[335628],{"type":23,"value":335629},"Existing customer credentials for the integrations you want to import.",{"type":17,"tag":84,"props":335631,"children":335632},{},[335633,335635,335642],{"type":23,"value":335634},"Basic understanding of REST APIs, authentication flows, and ",{"type":17,"tag":133,"props":335636,"children":335639},{"href":335637,"rel":335638},"https://docs.unified.to/guides/end_users_integrations_and_connections#end-users-integrations-and-connections",[214],[335640],{"type":23,"value":335641},"connections",{"type":23,"value":54},{"type":17,"tag":68,"props":335644,"children":335646},{"id":335645},"understand-the-authentication-types",[335647],{"type":23,"value":335648},"Understand the authentication types",{"type":17,"tag":29,"props":335650,"children":335651},{},[335652],{"type":23,"value":335653},"Before importing your integrations, you need to determine which authentication type each integration uses. Unified.to supports two main authentication flows:",{"type":17,"tag":239,"props":335655,"children":335657},{"id":335656},"api-token-authentication",[335658],{"type":23,"value":335659},"API token authentication",{"type":17,"tag":80,"props":335661,"children":335662},{},[335663,335668],{"type":17,"tag":84,"props":335664,"children":335665},{},[335666],{"type":23,"value":335667},"Simple token: Requires a single token or key.",{"type":17,"tag":84,"props":335669,"children":335670},{},[335671],{"type":23,"value":335672},"Multi-field token: Requires multiple credentials (e.g. API key + domain).",{"type":17,"tag":239,"props":335674,"children":335676},{"id":335675},"oauth-2-authentication",[335677],{"type":23,"value":335678},"OAuth 2 authentication",{"type":17,"tag":80,"props":335680,"children":335681},{},[335682,335687,335692],{"type":17,"tag":84,"props":335683,"children":335684},{},[335685],{"type":23,"value":335686},"Requires client credentials (client ID and secret).",{"type":17,"tag":84,"props":335688,"children":335689},{},[335690],{"type":23,"value":335691},"Requires access tokens and optional refresh tokens.",{"type":17,"tag":84,"props":335693,"children":335694},{},[335695],{"type":23,"value":335696},"May include additional user information e.g. emails, names.",{"type":17,"tag":68,"props":335698,"children":335700},{"id":335699},"check-instructions-for-the-integration-you-want-to-import",[335701],{"type":23,"value":335702},"Check instructions for the integration you want to import",{"type":17,"tag":29,"props":335704,"children":335705},{},[335706],{"type":23,"value":335707},"The Unified.to Core API contains information that will help you determine what you need to successfully import your integrations.",{"type":17,"tag":6154,"props":335709,"children":335710},{},[335711,335724],{"type":17,"tag":84,"props":335712,"children":335713},{},[335714,335716,335722],{"type":23,"value":335715},"Make a GET request to the ",{"type":17,"tag":6121,"props":335717,"children":335719},{"className":335718},[],[335720],{"type":23,"value":335721},"/unified/integration",{"type":23,"value":335723}," endpoint to get information about the integration you want to import, passing in the categories and/or names of the integrations you are interested in.",{"type":17,"tag":84,"props":335725,"children":335726},{},[335727,335729],{"type":23,"value":335728},"Check the following fields in the response:\n",{"type":17,"tag":80,"props":335730,"children":335731},{},[335732,335743],{"type":17,"tag":84,"props":335733,"children":335734},{},[335735,335741],{"type":17,"tag":6121,"props":335736,"children":335738},{"className":335737},[],[335739],{"type":23,"value":335740},"token_names",{"type":23,"value":335742},": Lists required credential fields for API token authentication.",{"type":17,"tag":84,"props":335744,"children":335745},{},[335746,335752],{"type":17,"tag":6121,"props":335747,"children":335749},{"className":335748},[],[335750],{"type":23,"value":335751},"token_instructions",{"type":23,"value":335753},": Provides guidance on where to find these credentials.",{"type":17,"tag":29,"props":335755,"children":335756},{},[335757],{"type":23,"value":3258},{"type":17,"tag":6893,"props":335759,"children":335762},{"className":335760,"code":335761,"language":6898,"meta":7},[6896],"const baseUrl = 'https://api.unified.to/unified/integration';\nconst params = new URLSearchParams({\n  categories: ['ats', 'crm'].join(',')\n});\nconst url = `${baseUrl}?${params}`;\n\n// Make the request\nfetch(url, {\n  method: 'GET',\n  headers: {\n    'Authorization': `Bearer ${YOUR_API_KEY}`,\n    'Accept': 'application/json'\n  }\n})\n.then(response => {\n  if (!response.ok) {\n    throw new Error(`HTTP error! status: ${response.status}`);\n  }\n  return response.json();\n})\n.then(integrations => {\n  // Loop through each integration and log its auth details\n  integrations.forEach(integration => {\n    console.log(`\\n=== ${integration.name} ===`);\n    \n    // Log token information if it exists\n    if (integration.token_names && integration.token_names.length > 0) {\n      console.log('Required credentials:', integration.token_names);\n      console.log('How to find credentials:');\n      integration.token_instructions?.forEach((instruction, index) => {\n        console.log(`${index + 1}. ${instruction}`);\n      });\n    } else {\n      console.log('No token credentials required (likely uses OAuth)');\n    }\n  });\n})\n.catch(error => {\n  console.error('Error fetching integrations:', error);\n});\n\n/* Example output:\n\n=== ActiveCampaign ===\nRequired credentials: [\"API Key\", \"Domain\"]\nHow to find credentials:\n1. Your API key can be found in your account on the Settings page under the \"Developer\" tab...\n2. Your API URL can be found in your account on the My Settings page under the \"Developer\" tab...\n\n=== HubSpot ===\nNo token credentials required (likely uses OAuth)\n\n*/\n",[335763],{"type":17,"tag":6121,"props":335764,"children":335765},{"__ignoreMap":7},[335766],{"type":23,"value":335761},{"type":17,"tag":29,"props":335768,"children":335769},{},[335770,335774,335775,335782],{"type":17,"tag":48,"props":335771,"children":335772},{},[335773],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":335776,"children":335779},{"href":335777,"rel":335778},"https://docs.unified.to/unified/integration/Returns_all_integrations",[214],[335780],{"type":23,"value":335781},"Get all integrations",{"type":23,"value":54},{"type":17,"tag":68,"props":335784,"children":335786},{"id":335785},"import-an-api-token-integration",[335787],{"type":23,"value":335788},"Import an API token integration",{"type":17,"tag":29,"props":335790,"children":335791},{},[335792],{"type":23,"value":335793},"For single-token integrations, construct your connection object:",{"type":17,"tag":6893,"props":335795,"children":335798},{"className":335796,"code":335797,"language":22503,"meta":7},[22501],"{\n  \"integration_type\": NAME_OF_INTEGRATION,\n  \"permissions\": [PERMISSIONS],\n  \"categories\": [CATEGORIES],\n  \"environment\": \"Production\", // or any other non-sandbox environment\n  \"auth\": {\n    \"token\": \"your_customer_token\"\n  }\n}\n",[335799],{"type":17,"tag":6121,"props":335800,"children":335801},{"__ignoreMap":7},[335802],{"type":23,"value":335797},{"type":17,"tag":29,"props":335804,"children":335805},{},[335806,335808,335814],{"type":23,"value":335807},"For multi-field token integrations, use the ",{"type":17,"tag":6121,"props":335809,"children":335811},{"className":335810},[],[335812],{"type":23,"value":335813},"other_auth_info",{"type":23,"value":335815}," array:",{"type":17,"tag":6893,"props":335817,"children":335820},{"className":335818,"code":335819,"language":22503,"meta":7},[22501],"{\n  \"integration_type\": NAME_OF_INTEGRATION,\n  \"permissions\": [PERMISSIONS],\n  \"categories\": [CATEGORIES],\n  \"environment\": \"Production\", //  or any other non-sandbox environment\n  \"auth\": {\n    \"token\": \"your_customer_token\"\n    \"other_auth_info\": [\n      \"first_credential\",\n      \"second_credential\"\n    ]\n  }\n}\n",[335821],{"type":17,"tag":6121,"props":335822,"children":335823},{"__ignoreMap":7},[335824],{"type":23,"value":335819},{"type":17,"tag":29,"props":335826,"children":335827},{},[335828,335832,335834,335839,335841,335846],{"type":17,"tag":48,"props":335829,"children":335830},{},[335831],{"type":23,"value":18744},{"type":23,"value":335833},": The order of credentials in ",{"type":17,"tag":6121,"props":335835,"children":335837},{"className":335836},[],[335838],{"type":23,"value":335813},{"type":23,"value":335840}," must match the order of the ",{"type":17,"tag":6121,"props":335842,"children":335844},{"className":335843},[],[335845],{"type":23,"value":335740},{"type":23,"value":335847}," from the integration instructions (see above).",{"type":17,"tag":68,"props":335849,"children":335851},{"id":335850},"import-an-oauth-20-integration",[335852],{"type":23,"value":335853},"Import an OAuth 2.0 integration",{"type":17,"tag":6154,"props":335855,"children":335856},{},[335857],{"type":17,"tag":84,"props":335858,"children":335859},{},[335860,335862,335866],{"type":23,"value":335861},"Construct your connection object with the ",{"type":17,"tag":133,"props":335863,"children":335864},{"href":779},[335865],{"type":23,"value":782},{"type":23,"value":335867}," credentials:",{"type":17,"tag":6893,"props":335869,"children":335872},{"className":335870,"code":335871,"language":22503,"meta":7},[22501],"{\n  \"integration_type\": NAME_OF_INTEGRATION,\n  \"permissions\": [PERMISSIONS],\n  \"categories\": [CATEGORIES],\n  \"environment\": \"Production\", //  or any other non-sandbox environment\n  \"auth\": {\n    \"access_token\": \"customer_access_token\",\n    \"refresh_token\": \"customer_refresh_token\",\n    \"expiry_date\": \"2024-12-31T23:59:59Z\",\n    \"emails\": [\"user@example.com\"],\n    \"name\": \"User Name\"\n  }\n}\n",[335873],{"type":17,"tag":6121,"props":335874,"children":335875},{"__ignoreMap":7},[335876],{"type":23,"value":335871},{"type":17,"tag":6154,"props":335878,"children":335879},{},[335880],{"type":17,"tag":84,"props":335881,"children":335882},{},[335883,335885],{"type":23,"value":335884},"Log into the developer account for the provider whose integrations you are importing. Update your redirect URIs to point to Unified.to: ",{"type":17,"tag":6121,"props":335886,"children":335888},{"className":335887},[],[335889],{"type":23,"value":42417},{"type":17,"tag":29,"props":335891,"children":335892},{},[335893,335897],{"type":17,"tag":48,"props":335894,"children":335895},{},[335896],{"type":23,"value":6701},{"type":23,"value":20456},{"type":17,"tag":80,"props":335899,"children":335900},{},[335901,335914],{"type":17,"tag":84,"props":335902,"children":335903},{},[335904,335906,335912],{"type":23,"value":335905},"Set ",{"type":17,"tag":6121,"props":335907,"children":335909},{"className":335908},[],[335910],{"type":23,"value":335911},"expiry_date",{"type":23,"value":335913}," to the token's expiration date (if known) or today's date.",{"type":17,"tag":84,"props":335915,"children":335916},{},[335917],{"type":23,"value":335918},"Include the authenticating user's email and name if available.",{"type":17,"tag":68,"props":335920,"children":335922},{"id":335921},"create-the-connection",[335923],{"type":23,"value":335924},"Create the connection",{"type":17,"tag":29,"props":335926,"children":335927},{},[335928,335930,335936],{"type":23,"value":335929},"Make a POST request to create the connection. Example using ",{"type":17,"tag":6121,"props":335931,"children":335933},{"className":335932},[],[335934],{"type":23,"value":335935},"curl",{"type":23,"value":20456},{"type":17,"tag":6893,"props":335938,"children":335941},{"className":335939,"code":335940,"language":288003,"meta":7},[288001],"curl -X POST \"\u003Chttps://api.unified.to/unified/connection>\" \\\\\n  -H \"Authorization: Bearer YOUR_API_KEY\" \\\\\n  -H \"Content-Type: application/json\" \\\\\n  -d '{\n    \"integration_type\": \"your_integration_type\",\n    \"permissions\": [\"required_permissions\"],\n    \"categories\": [\"integration_category\"],\n    \"auth\": {\n      // Your auth object here\n    }\n  }'\n",[335942],{"type":17,"tag":6121,"props":335943,"children":335944},{"__ignoreMap":7},[335945],{"type":23,"value":335940},{"type":17,"tag":29,"props":335947,"children":335948},{},[335949,335953,335954],{"type":17,"tag":48,"props":335950,"children":335951},{},[335952],{"type":23,"value":329841},{"type":23,"value":49318},{"type":17,"tag":133,"props":335955,"children":335957},{"href":276511,"rel":335956},[214],[335958],{"type":23,"value":335959},"Create a connection",{"type":17,"tag":68,"props":335961,"children":335963},{"id":335962},"test-the-imported-connection",[335964],{"type":23,"value":335965},"Test the imported connection",{"type":17,"tag":29,"props":335967,"children":335968},{},[335969],{"type":23,"value":335970},"After creating the connection:",{"type":17,"tag":6154,"props":335972,"children":335973},{},[335974,335979,335984],{"type":17,"tag":84,"props":335975,"children":335976},{},[335977],{"type":23,"value":335978},"Note the connection ID from the response.",{"type":17,"tag":84,"props":335980,"children":335981},{},[335982],{"type":23,"value":335983},"Make a test API call using the new connection ID to verify it works.",{"type":17,"tag":84,"props":335985,"children":335986},{},[335987],{"type":23,"value":335988},"If the call fails, check the error message and verify your auth credentials.",{"type":17,"tag":68,"props":335990,"children":335992},{"id":335991},"best-practices-when-importing-a-connection",[335993],{"type":23,"value":335994},"Best practices when importing a connection",{"type":17,"tag":80,"props":335996,"children":335997},{},[335998,336010,336022,336027],{"type":17,"tag":84,"props":335999,"children":336000},{},[336001,336003,336008],{"type":23,"value":336002},"Always include relevant ",{"type":17,"tag":6121,"props":336004,"children":336006},{"className":336005},[],[336007],{"type":23,"value":24204},{"type":23,"value":336009}," for the minimum set of data access you require.",{"type":17,"tag":84,"props":336011,"children":336012},{},[336013,336015,336021],{"type":23,"value":336014},"Use a non-sandbox ",{"type":17,"tag":6121,"props":336016,"children":336018},{"className":336017},[],[336019],{"type":23,"value":336020},"environment",{"type":23,"value":54},{"type":17,"tag":84,"props":336023,"children":336024},{},[336025],{"type":23,"value":336026},"Store the connection ID securely for future API calls.",{"type":17,"tag":84,"props":336028,"children":336029},{},[336030,336032,336038],{"type":23,"value":336031},"Consider adding ",{"type":17,"tag":6121,"props":336033,"children":336035},{"className":336034},[],[336036],{"type":23,"value":336037},"external_xref",{"type":23,"value":336039}," to link the connection to your customer's ID.",{"type":17,"tag":68,"props":336041,"children":336042},{"id":332205},[336043],{"type":23,"value":332208},{"type":17,"tag":80,"props":336045,"children":336046},{},[336047,336057,336065],{"type":17,"tag":84,"props":336048,"children":336049},{},[336050],{"type":17,"tag":133,"props":336051,"children":336054},{"href":336052,"rel":336053},"https://docs.unified.to/guides/how_to_associate_a_connection_id_with_your_end_user#how-to-associate-a-connection-id-with-your-end-user",[214],[336055],{"type":23,"value":336056},"How to associate a connection ID with your end-user",{"type":17,"tag":84,"props":336058,"children":336059},{},[336060],{"type":17,"tag":133,"props":336061,"children":336063},{"href":335552,"rel":336062},[214],[336064],{"type":23,"value":335556},{"type":17,"tag":84,"props":336066,"children":336067},{},[336068],{"type":17,"tag":133,"props":336069,"children":336071},{"href":327403,"rel":336070},[214],[336072],{"type":23,"value":333322},{"title":7,"searchDepth":1629,"depth":1629,"links":336074},[336075,336076,336080,336081,336082,336083,336084,336085,336086],{"id":177146,"depth":1629,"text":177149},{"id":335645,"depth":1629,"text":335648,"children":336077},[336078,336079],{"id":335656,"depth":1635,"text":335659},{"id":335675,"depth":1635,"text":335678},{"id":335699,"depth":1629,"text":335702},{"id":335785,"depth":1629,"text":335788},{"id":335850,"depth":1629,"text":335853},{"id":335921,"depth":1629,"text":335924},{"id":335962,"depth":1629,"text":335965},{"id":335991,"depth":1629,"text":335994},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_migrate_or_import_your_integrations_into_unified.md","blog/how_to_migrate_or_import_your_integrations_into_unified.md","blog/how_to_migrate_or_import_your_integrations_into_unified",{"_path":336091,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":336092,"description":336093,"img":336094,"date":336095,"tag":12,"body":336096,"_type":1677,"_id":336367,"_source":1679,"_file":336368,"_stem":336369,"_extension":1682},"/blog/ats_activity_new_sub_type_field","ATS Activity's new Sub Type field","We have added another field to the ATS Activity schema, `subtype` .  While the `type` field is an enum with values `NOTE`, `TASK` and `EMAIL`, the `subtype`...","https://s3.us-east-2.amazonaws.com/unified-article-images/ats_activity_new_sub_type_field-icon.webp","2024-10-13T00:00:00.000Z",{"type":14,"children":336097,"toc":336365},[336098,336103,336106,336114,336160,336178,336197,336270,336288],{"type":17,"tag":18,"props":336099,"children":336101},{"id":336100},"ats-activitys-new-sub-type-field",[336102],{"type":23,"value":336092},{"type":17,"tag":25,"props":336104,"children":336105},{},[],{"type":17,"tag":29,"props":336107,"children":336108},{},[336109],{"type":17,"tag":33,"props":336110,"children":336111},{},[336112],{"type":23,"value":336113},"October 13, 2024",{"type":17,"tag":29,"props":336115,"children":336116},{},[336117,336119,336125,336127,336132,336134,336139,336140,336145,336146,336151,336153,336158],{"type":23,"value":336118},"We have added another field to the ATS Activity schema: ",{"type":17,"tag":6121,"props":336120,"children":336122},{"className":336121},[],[336123],{"type":23,"value":336124},"sub_type",{"type":23,"value":336126}," .  While the ",{"type":17,"tag":6121,"props":336128,"children":336130},{"className":336129},[],[336131],{"type":23,"value":27310},{"type":23,"value":336133}," field is an enum with values ",{"type":17,"tag":6121,"props":336135,"children":336137},{"className":336136},[],[336138],{"type":23,"value":27047},{"type":23,"value":11826},{"type":17,"tag":6121,"props":336141,"children":336143},{"className":336142},[],[336144],{"type":23,"value":27067},{"type":23,"value":34435},{"type":17,"tag":6121,"props":336147,"children":336149},{"className":336148},[],[336150],{"type":23,"value":27052},{"type":23,"value":336152},", the ",{"type":17,"tag":6121,"props":336154,"children":336156},{"className":336155},[],[336157],{"type":23,"value":336124},{"type":23,"value":336159}," field is a freeform string and can contain any value.",{"type":17,"tag":29,"props":336161,"children":336162},{},[336163,336165,336170,336171,336177],{"type":23,"value":336164},"The field is used to denote a sub type of the specified type and is currently only supported on ",{"type":17,"tag":6121,"props":336166,"children":336168},{"className":336167},[],[336169],{"type":23,"value":310119},{"type":23,"value":34435},{"type":17,"tag":6121,"props":336172,"children":336174},{"className":336173},[],[336175],{"type":23,"value":336176},"BullHorn",{"type":23,"value":54},{"type":17,"tag":29,"props":336179,"children":336180},{},[336181,336182,336187,336189,336195],{"type":23,"value":71363},{"type":17,"tag":6121,"props":336183,"children":336185},{"className":336184},[],[336186],{"type":23,"value":310119},{"type":23,"value":336188},", which supports all 3 unified ",{"type":17,"tag":6121,"props":336190,"children":336192},{"className":336191},[],[336193],{"type":23,"value":336194},"types",{"type":23,"value":336196},", the following sub-types are usually supported:",{"type":17,"tag":80,"props":336198,"children":336199},{},[336200,336205,336210,336215,336220,336225,336230,336235,336240,336245,336250,336255,336260,336265],{"type":17,"tag":84,"props":336201,"children":336202},{},[336203],{"type":23,"value":336204},"WhatsApp SMS",{"type":17,"tag":84,"props":336206,"children":336207},{},[336208],{"type":23,"value":336209},"Phone call",{"type":17,"tag":84,"props":336211,"children":336212},{},[336213],{"type":23,"value":336214},"Email sent",{"type":17,"tag":84,"props":336216,"children":336217},{},[336218],{"type":23,"value":336219},"Email received",{"type":17,"tag":84,"props":336221,"children":336222},{},[336223],{"type":23,"value":336224},"Internal Interview",{"type":17,"tag":84,"props":336226,"children":336227},{},[336228],{"type":23,"value":336229},"Request further information",{"type":17,"tag":84,"props":336231,"children":336232},{},[336233],{"type":23,"value":336234},"Client Interview",{"type":17,"tag":84,"props":336236,"children":336237},{},[336238],{"type":23,"value":336239},"References",{"type":17,"tag":84,"props":336241,"children":336242},{},[336243],{"type":23,"value":336244},"Transcripts / Certificates",{"type":17,"tag":84,"props":336246,"children":336247},{},[336248],{"type":23,"value":336249},"Status Change",{"type":17,"tag":84,"props":336251,"children":336252},{},[336253],{"type":23,"value":336254},"Resume Submitted",{"type":17,"tag":84,"props":336256,"children":336257},{},[336258],{"type":23,"value":336259},"Left Message",{"type":17,"tag":84,"props":336261,"children":336262},{},[336263],{"type":23,"value":336264},"Offer",{"type":17,"tag":84,"props":336266,"children":336267},{},[336268],{"type":23,"value":336269},"SMS",{"type":17,"tag":29,"props":336271,"children":336272},{},[336273,336274,336279,336281,336286],{"type":23,"value":71363},{"type":17,"tag":6121,"props":336275,"children":336277},{"className":336276},[],[336278],{"type":23,"value":336176},{"type":23,"value":336280},", which only supports the ",{"type":17,"tag":6121,"props":336282,"children":336284},{"className":336283},[],[336285],{"type":23,"value":27047},{"type":23,"value":336287}," type, these are the usual sub types supported:",{"type":17,"tag":80,"props":336289,"children":336290},{},[336291,336296,336301,336306,336311,336316,336321,336326,336331,336336,336341,336346,336351,336356,336360],{"type":17,"tag":84,"props":336292,"children":336293},{},[336294],{"type":23,"value":336295},"Attempted Contact",{"type":17,"tag":84,"props":336297,"children":336298},{},[336299],{"type":23,"value":336300},"Coordination",{"type":17,"tag":84,"props":336302,"children":336303},{},[336304],{"type":23,"value":336305},"QC",{"type":17,"tag":84,"props":336307,"children":336308},{},[336309],{"type":23,"value":336310},"Sourcing",{"type":17,"tag":84,"props":336312,"children":336313},{},[336314],{"type":23,"value":336315},"Candidate Call",{"type":17,"tag":84,"props":336317,"children":336318},{},[336319],{"type":23,"value":336320},"Candidate Interview",{"type":17,"tag":84,"props":336322,"children":336323},{},[336324],{"type":23,"value":336325},"General Intel",{"type":17,"tag":84,"props":336327,"children":336328},{},[336329],{"type":23,"value":336330},"Actionable Intel",{"type":17,"tag":84,"props":336332,"children":336333},{},[336334],{"type":23,"value":336335},"Unqualified Lead",{"type":17,"tag":84,"props":336337,"children":336338},{},[336339],{"type":23,"value":336340},"MPC",{"type":17,"tag":84,"props":336342,"children":336343},{},[336344],{"type":23,"value":336345},"Business Development",{"type":17,"tag":84,"props":336347,"children":336348},{},[336349],{"type":23,"value":336350},"Client MeetingPitch",{"type":17,"tag":84,"props":336352,"children":336353},{},[336354],{"type":23,"value":336355},"Reference Check",{"type":17,"tag":84,"props":336357,"children":336358},{},[336359],{"type":23,"value":134032},{"type":17,"tag":84,"props":336361,"children":336362},{},[336363],{"type":23,"value":336364},"Other",{"title":7,"searchDepth":1629,"depth":1629,"links":336366},[],"content:blog:ats_activity_new_sub_type_field.md","blog/ats_activity_new_sub_type_field.md","blog/ats_activity_new_sub_type_field",{"_path":336371,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":336372,"description":336373,"img":336374,"date":336375,"tag":12,"body":336376,"_type":1677,"_id":336685,"_source":1679,"_file":336686,"_stem":336687,"_extension":1682},"/blog/expanded_support_for_response_formats","Expanded support for response formats","We're excited to announce that Unified.to now supports multiple response formats for our API! This expansion gives you more flexibility in how you receive and...","https://s3.us-east-2.amazonaws.com/unified-article-images/expanded_support_for_response_formats-icon.webp","2024-10-10T00:00:00.000Z",{"type":14,"children":336377,"toc":336673},[336378,336382,336385,336393,336398,336404,336409,336437,336443,336456,336516,336530,336534,336539,336548,336553,336562,336568,336577,336582,336592,336598,336607,336626,336632,336641,336655,336660,336664,336669],{"type":17,"tag":18,"props":336379,"children":336380},{"id":334704},[336381],{"type":23,"value":336372},{"type":17,"tag":25,"props":336383,"children":336384},{},[],{"type":17,"tag":29,"props":336386,"children":336387},{},[336388],{"type":17,"tag":33,"props":336389,"children":336390},{},[336391],{"type":23,"value":336392},"October 10, 2024",{"type":17,"tag":29,"props":336394,"children":336395},{},[336396],{"type":23,"value":336397},"We're excited to announce that Unified.to now supports multiple response formats for our API! This expansion gives you more flexibility in how you receive and process data from our endpoints. Let's dive into the new formats, how to use them, and see some examples.",{"type":17,"tag":68,"props":336399,"children":336401},{"id":336400},"supported-formats",[336402],{"type":23,"value":336403},"Supported formats",{"type":17,"tag":29,"props":336405,"children":336406},{},[336407],{"type":23,"value":336408},"We now support the following response formats:",{"type":17,"tag":6154,"props":336410,"children":336411},{},[336412,336417,336422,336427,336432],{"type":17,"tag":84,"props":336413,"children":336414},{},[336415],{"type":23,"value":336416},"JSON (default)",{"type":17,"tag":84,"props":336418,"children":336419},{},[336420],{"type":23,"value":336421},"CSV (Comma-Separated Values)",{"type":17,"tag":84,"props":336423,"children":336424},{},[336425],{"type":23,"value":336426},"XML",{"type":17,"tag":84,"props":336428,"children":336429},{},[336430],{"type":23,"value":336431},"SCIM+JSON (for SCIM and HR endpoints)",{"type":17,"tag":84,"props":336433,"children":336434},{},[336435],{"type":23,"value":336436},"NDJSON (Newline Delimited JSON)",{"type":17,"tag":68,"props":336438,"children":336440},{"id":336439},"using-the-new-formats",[336441],{"type":23,"value":336442},"Using the new formats",{"type":17,"tag":29,"props":336444,"children":336445},{},[336446,336448,336454],{"type":23,"value":336447},"To specify your desired response format, simply set the ",{"type":17,"tag":6121,"props":336449,"children":336451},{"className":336450},[],[336452],{"type":23,"value":336453},"Accept",{"type":23,"value":336455}," header in your API request. Here's how to request each format:",{"type":17,"tag":80,"props":336457,"children":336458},{},[336459,336472,336483,336494,336505],{"type":17,"tag":84,"props":336460,"children":336461},{},[336462,336464,336470],{"type":23,"value":336463},"JSON: ",{"type":17,"tag":6121,"props":336465,"children":336467},{"className":336466},[],[336468],{"type":23,"value":336469},"Accept: application/json",{"type":23,"value":336471}," (default if not specified)",{"type":17,"tag":84,"props":336473,"children":336474},{},[336475,336477],{"type":23,"value":336476},"CSV: ",{"type":17,"tag":6121,"props":336478,"children":336480},{"className":336479},[],[336481],{"type":23,"value":336482},"Accept: text/csv",{"type":17,"tag":84,"props":336484,"children":336485},{},[336486,336488],{"type":23,"value":336487},"XML: ",{"type":17,"tag":6121,"props":336489,"children":336491},{"className":336490},[],[336492],{"type":23,"value":336493},"Accept: text/xml",{"type":17,"tag":84,"props":336495,"children":336496},{},[336497,336499],{"type":23,"value":336498},"SCIM+JSON: ",{"type":17,"tag":6121,"props":336500,"children":336502},{"className":336501},[],[336503],{"type":23,"value":336504},"Accept: application/scim+json",{"type":17,"tag":84,"props":336506,"children":336507},{},[336508,336510],{"type":23,"value":336509},"NDJSON: ",{"type":17,"tag":6121,"props":336511,"children":336513},{"className":336512},[],[336514],{"type":23,"value":336515},"Accept: application/ndjson",{"type":17,"tag":29,"props":336517,"children":336518},{},[336519,336521,336528],{"type":23,"value":336520},"For more information, refer to the ",{"type":17,"tag":133,"props":336522,"children":336525},{"href":336523,"rel":336524},"https://docs.unified.to/reference/rest",[214],[336526],{"type":23,"value":336527},"REST API guide",{"type":23,"value":336529}," in our developer docs.",{"type":17,"tag":68,"props":336531,"children":336532},{"id":19014},[336533],{"type":23,"value":19017},{"type":17,"tag":29,"props":336535,"children":336536},{},[336537],{"type":23,"value":336538},"Let's look at examples of each format. These are all the result of calling:",{"type":17,"tag":6893,"props":336540,"children":336543},{"className":336541,"code":336542,"language":6898,"meta":7},[6896],"https://api.unified.to/hris/6706e360d69e7ef6d1350495/employee?limit=3&fields=name,title,id\n",[336544],{"type":17,"tag":6121,"props":336545,"children":336546},{"__ignoreMap":7},[336547],{"type":23,"value":336542},{"type":17,"tag":239,"props":336549,"children":336551},{"id":336550},"json-default",[336552],{"type":23,"value":336416},{"type":17,"tag":6893,"props":336554,"children":336557},{"className":336555,"code":336556,"language":22503,"meta":7},[22501],"[\n    {\n        \"id\": \"3a96751f-3bff-4bf1-9586-564bb824a220\",\n        \"name\": \"Delaney OHara\",\n        \"title\": \"Chief Paradigm Executive\"\n    },\n    {\n        \"id\": \"4b21c926-9d7b-4fe8-bcb7-25b25d9b8a18\",\n        \"name\": \"Cruz Bode\",\n        \"title\": \"Central Optimization Technician\"\n    },\n    {\n        \"id\": \"b2e82178-40e1-4010-918a-175e5fc07723\",\n        \"name\": \"Berniece Grant\",\n        \"title\": \"Dynamic Brand Officer\"\n    }\n]\n",[336558],{"type":17,"tag":6121,"props":336559,"children":336560},{"__ignoreMap":7},[336561],{"type":23,"value":336556},{"type":17,"tag":239,"props":336563,"children":336565},{"id":336564},"csv",[336566],{"type":23,"value":336567},"CSV",{"type":17,"tag":6893,"props":336569,"children":336572},{"className":336570,"code":336571,"language":20901,"meta":23},[20899],"id,name,title\n\"3a96751f-3bff-4bf1-9586-564bb824a220\",\"Delaney OHara\",\"Chief Paradigm Executive\"\n\"4b21c926-9d7b-4fe8-bcb7-25b25d9b8a18\",\"Cruz Bode\",\"Central Optimization Technician\"\n\"b2e82178-40e1-4010-918a-175e5fc07723\",\"Berniece Grant\",\"Dynamic Brand Officer\"\n",[336573],{"type":17,"tag":6121,"props":336574,"children":336575},{"__ignoreMap":7},[336576],{"type":23,"value":336571},{"type":17,"tag":239,"props":336578,"children":336580},{"id":336579},"xml",[336581],{"type":23,"value":336426},{"type":17,"tag":6893,"props":336583,"children":336587},{"className":336584,"code":336586,"language":336579,"meta":7},[336585],"language-xml","\u003Croot>\n    \u003Citem>\n        \u003Cid>3a96751f-3bff-4bf1-9586-564bb824a220\u003C/id>\n        \u003Cname>Delaney OHara\u003C/name>\n        \u003Ctitle>Chief Paradigm Executive\u003C/title>\n    \u003C/item>\n    \u003Citem>\n        \u003Cid>4b21c926-9d7b-4fe8-bcb7-25b25d9b8a18\u003C/id>\n        \u003Cname>Cruz Bode\u003C/name>\n        \u003Ctitle>Central Optimization Technician\u003C/title>\n    \u003C/item>\n    \u003Citem>\n        \u003Cid>b2e82178-40e1-4010-918a-175e5fc07723\u003C/id>\n        \u003Cname>Berniece Grant\u003C/name>\n        \u003Ctitle>Dynamic Brand Officer\u003C/title>\n    \u003C/item>\n\u003C/root>\n",[336588],{"type":17,"tag":6121,"props":336589,"children":336590},{"__ignoreMap":7},[336591],{"type":23,"value":336586},{"type":17,"tag":239,"props":336593,"children":336595},{"id":336594},"scimjson",[336596],{"type":23,"value":336597},"SCIM+JSON",{"type":17,"tag":6893,"props":336599,"children":336602},{"className":336600,"code":336601,"language":22503,"meta":7},[22501],"[\n    {\n        \"name\": {\n            \"givenName\": \"Delaney\",\n            \"familyName\": \"OHara\",\n            \"middleName\": \"\"\n        },\n        \"title\": \"Chief Paradigm Executive\",\n        \"id\": \"3a96751f-3bff-4bf1-9586-564bb824a220\"\n    },\n    {\n        \"name\": {\n            \"givenName\": \"Cruz\",\n            \"familyName\": \"Bode\",\n            \"middleName\": \"\"\n        },\n        \"title\": \"Central Optimization Technician\",\n        \"id\": \"4b21c926-9d7b-4fe8-bcb7-25b25d9b8a18\"\n    },\n    {\n        \"name\": {\n            \"givenName\": \"Berniece\",\n            \"familyName\": \"Grant\",\n            \"middleName\": \"\"\n        },\n        \"title\": \"Dynamic Brand Officer\",\n        \"id\": \"b2e82178-40e1-4010-918a-175e5fc07723\"\n    }\n]\n",[336603],{"type":17,"tag":6121,"props":336604,"children":336605},{"__ignoreMap":7},[336606],{"type":23,"value":336601},{"type":17,"tag":29,"props":336608,"children":336609},{},[336610,336612,336616,336618,336625],{"type":23,"value":336611},"The SCIM+JSON format is designed for our HRIS endpoints, specifically for Employee and Group data objects. This format adheres to the SCIM (System for Cross-domain Identity Management) standard, making it easier to integrate with identity management systems. To learn more about our ",{"type":17,"tag":133,"props":336613,"children":336614},{"href":299674},[336615],{"type":23,"value":299677},{"type":23,"value":336617}," and how to use it, check out our ",{"type":17,"tag":133,"props":336619,"children":336622},{"href":336620,"rel":336621},"https://docs.unified.to/scim/overview",[214],[336623],{"type":23,"value":336624},"SCIM API documentation",{"type":23,"value":54},{"type":17,"tag":239,"props":336627,"children":336629},{"id":336628},"ndjson",[336630],{"type":23,"value":336631},"NDJSON",{"type":17,"tag":6893,"props":336633,"children":336636},{"className":336634,"code":336635,"language":22503,"meta":7},[22501],"{\"id\":\"3a96751f-3bff-4bf1-9586-564bb824a220\",\"name\":\"Delaney OHara\",\"title\":\"Chief Paradigm Executive\"}\n{\"id\":\"4b21c926-9d7b-4fe8-bcb7-25b25d9b8a18\",\"name\":\"Cruz Bode\",\"title\":\"Central Optimization Technician\"}\n{\"id\":\"b2e82178-40e1-4010-918a-175e5fc07723\",\"name\":\"Berniece Grant\",\"title\":\"Dynamic Brand Officer\"}\n",[336637],{"type":17,"tag":6121,"props":336638,"children":336639},{"__ignoreMap":7},[336640],{"type":23,"value":336635},{"type":17,"tag":29,"props":336642,"children":336643},{},[336644,336646,336653],{"type":23,"value":336645},"We're particularly excited about the addition of NDJSON (Newline Delimited JSON) support, which offers significant advantages for AI workflows. NDJSON's line-by-line structure makes it ideal for streaming large datasets efficiently. Many popular AI and data science tools, including Python's ",{"type":17,"tag":133,"props":336647,"children":336650},{"href":336648,"rel":336649},"https://pandas.pydata.org/docs/reference/api/pandas.read_json.html",[214],[336651],{"type":23,"value":336652},"pandas library",{"type":23,"value":336654}," and various machine learning frameworks, can directly read NDJSON streams.",{"type":17,"tag":29,"props":336656,"children":336657},{},[336658],{"type":23,"value":336659},"By supporting NDJSON, we're enabling more efficient data handling and processing in AI-driven applications, reducing latency and resource requirements in your machine learning pipelines.",{"type":17,"tag":68,"props":336661,"children":336662},{"id":44585},[336663],{"type":23,"value":44588},{"type":17,"tag":29,"props":336665,"children":336666},{},[336667],{"type":23,"value":336668},"We look forward to seeing how you'll use these new response formats in your applications. As always, if you have any questions or need assistance, don't hesitate to reach out to our support team.",{"type":17,"tag":29,"props":336670,"children":336671},{},[336672],{"type":23,"value":329334},{"title":7,"searchDepth":1629,"depth":1629,"links":336674},[336675,336676,336677,336684],{"id":336400,"depth":1629,"text":336403},{"id":336439,"depth":1629,"text":336442},{"id":19014,"depth":1629,"text":19017,"children":336678},[336679,336680,336681,336682,336683],{"id":336550,"depth":1635,"text":336416},{"id":336564,"depth":1635,"text":336567},{"id":336579,"depth":1635,"text":336426},{"id":336594,"depth":1635,"text":336597},{"id":336628,"depth":1635,"text":336631},{"id":44585,"depth":1629,"text":44588},"content:blog:expanded_support_for_response_formats.md","blog/expanded_support_for_response_formats.md","blog/expanded_support_for_response_formats",{"_path":336689,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":336690,"description":336691,"img":336692,"date":336693,"tag":12,"body":336694,"_type":1677,"_id":337227,"_source":1679,"_file":337228,"_stem":337229,"_extension":1682},"/blog/sep_2024_product_updates","Sep 2024 product updates","September was packed with updates — and we're finally sharing them with you! This month's roundup brings 100+ integration enhancements, fresh tutorials and...","https://s3.us-east-2.amazonaws.com/unified-article-images/sep_2024_product_updates-icon.png","2024-10-07T00:00:00.000Z",{"type":14,"children":336695,"toc":337214},[336696,336701,336704,336712,336717,336725,336729,336792,336798,336806,336819,336831,336843,336849,336861,336869,336882,336893,336900,336913,336926,336934,336942,336947,336954,336978,336990,336996,337004,337009,337019,337025,337030,337050,337055,337061,337066,337075,337081,337086,337096,337102,337107,337123,337129,337137,337145,337150,337155,337164,337170,337178,337183,337189,337194,337204],{"type":17,"tag":18,"props":336697,"children":336699},{"id":336698},"sep-2024-product-updates",[336700],{"type":23,"value":336690},{"type":17,"tag":25,"props":336702,"children":336703},{},[],{"type":17,"tag":29,"props":336705,"children":336706},{},[336707],{"type":17,"tag":33,"props":336708,"children":336709},{},[336710],{"type":23,"value":336711},"October 7, 2024",{"type":17,"tag":29,"props":336713,"children":336714},{},[336715],{"type":23,"value":336716},"September was packed with updates — and we're finally sharing them with you! This month's roundup brings 100+ integration enhancements, fresh tutorials and guides, improvements to our docs, exciting company announcements, and a sneak peek at an October release (because we just couldn't wait).",{"type":17,"tag":29,"props":336718,"children":336719},{},[336720],{"type":17,"tag":6438,"props":336721,"children":336724},{"alt":336722,"src":336723},"unified-product-sep-2024.png","https://s3.us-east-2.amazonaws.com/unified-article-images/sep_2024_product_updates-0.png",[],{"type":17,"tag":68,"props":336726,"children":336727},{"id":243535},[336728],{"type":23,"value":217887},{"type":17,"tag":80,"props":336730,"children":336731},{},[336732,336737,336742,336747,336752,336757,336762,336767,336782,336787],{"type":17,"tag":84,"props":336733,"children":336734},{},[336735],{"type":23,"value":336736},"Launched SCIM support across 120+ integrations, simplifying identity management (user provisioning) for your users",{"type":17,"tag":84,"props":336738,"children":336739},{},[336740],{"type":23,"value":336741},"Explore 128 integration enhancements now live across the platform, with key improvements for performance and functionality.",{"type":17,"tag":84,"props":336743,"children":336744},{},[336745],{"type":23,"value":336746},"Check out the new Integration Explorer in our docs to easily navigate supported integrations, fields, and events.",{"type":17,"tag":84,"props":336748,"children":336749},{},[336750],{"type":23,"value":336751},"Customer spotlight: learn how Sync2Hire launched 16 integrations in just 2 weeks and saved one year of development time.",{"type":17,"tag":84,"props":336753,"children":336754},{},[336755],{"type":23,"value":336756},"Dive into our updated webhook and connection troubleshooting guides to resolve issues faster",{"type":17,"tag":84,"props":336758,"children":336759},{},[336760],{"type":23,"value":336761},"Learn more about Scopes and their importance in API security with our latest guide",{"type":17,"tag":84,"props":336763,"children":336764},{},[336765],{"type":23,"value":336766},"Customize your authorization flow with our step-by-step JavaScript tutorial",{"type":17,"tag":84,"props":336768,"children":336769},{},[336770,336772,336780],{"type":23,"value":336771},"Check out our new demo repo featuring the ",{"type":17,"tag":48,"props":336773,"children":336774},{},[336775,336776],{"type":23,"value":86959},{"type":17,"tag":133,"props":336777,"children":336778},{"href":14913},[336779],{"type":23,"value":27356},{"type":23,"value":336781}," for a hands-on example",{"type":17,"tag":84,"props":336783,"children":336784},{},[336785],{"type":23,"value":336786},"Exciting news: Unified.to is now part of the C100 network",{"type":17,"tag":84,"props":336788,"children":336789},{},[336790],{"type":23,"value":336791},"We're proud to announce the close of our $1.1M pre-seed round",{"type":17,"tag":68,"props":336793,"children":336795},{"id":336794},"unified-scim-api-for-120-integrations",[336796],{"type":23,"value":336797},"Unified SCIM API for 120+ integrations",{"type":17,"tag":29,"props":336799,"children":336800},{},[336801],{"type":17,"tag":6438,"props":336802,"children":336805},{"alt":336803,"src":336804},"unified_scim_api.png","https://s3.us-east-2.amazonaws.com/unified-article-images/sep_2024_product_updates-1.png",[],{"type":17,"tag":29,"props":336807,"children":336808},{},[336809,336811,336817],{"type":23,"value":336810},"Unified.to now supports ",{"type":17,"tag":133,"props":336812,"children":336815},{"href":336813,"rel":336814},"https://unified.to/scim",[214],[336816],{"type":23,"value":198473},{"type":23,"value":336818}," across all of our pre-built HR integrations, simplifying identity management in your application. With SCIM, you can easily manage user identities across your integrations using a standardized API. If you've already implemented SCIM in your applications, simply point to our SCIM-compliant endpoints for immediate use. We also support SCIM extensions, giving you more flexibility with user attributes across platforms. Unlock seamless identity management and expand your SCIM-compatible integrations to over 100 providers, all through Unified.to.",{"type":17,"tag":29,"props":336820,"children":336821},{},[336822,336824],{"type":23,"value":336823},"Release Article: ",{"type":17,"tag":133,"props":336825,"children":336828},{"href":336826,"rel":336827},"https://unified.to/blog/unified_launches_scim_support_for_120+_integrations",[214],[336829],{"type":23,"value":336830},"Unified.to launches SCIM support for 120+ integrations",{"type":17,"tag":29,"props":336832,"children":336833},{},[336834,336836],{"type":23,"value":336835},"Guide: ",{"type":17,"tag":133,"props":336837,"children":336840},{"href":336838,"rel":336839},"https://unified.to/blog/how_to_use_scim_with_the_unified_api",[214],[336841],{"type":23,"value":336842},"How to use SCIM with the Unified API",{"type":17,"tag":68,"props":336844,"children":336846},{"id":336845},"integration-enhancements",[336847],{"type":23,"value":336848},"Integration enhancements",{"type":17,"tag":29,"props":336850,"children":336851},{},[336852,336854,336859],{"type":23,"value":336853},"There were 128 integration enhancements in September! See a comprehensive list of enhancements on our ",{"type":17,"tag":133,"props":336855,"children":336857},{"href":47029,"rel":336856},[214],[336858],{"type":23,"value":47033},{"type":23,"value":336860},". Here are a couple of highlights with use case examples.",{"type":17,"tag":29,"props":336862,"children":336863},{},[336864],{"type":17,"tag":6438,"props":336865,"children":336868},{"alt":336866,"src":336867},"unified_jobadder.png","https://s3.us-east-2.amazonaws.com/unified-article-images/sep_2024_product_updates-2.png",[],{"type":17,"tag":29,"props":336870,"children":336871},{},[336872],{"type":17,"tag":48,"props":336873,"children":336874},{},[336875,336877,336881],{"type":23,"value":336876},"Integration: JobAdder (Unified ",{"type":17,"tag":133,"props":336878,"children":336879},{"href":55696},[336880],{"type":23,"value":55699},{"type":23,"value":12034},{"type":17,"tag":29,"props":336883,"children":336884},{},[336885,336887,336891],{"type":23,"value":336886},"JobAdder Activity now includes new writable fields for type, title, and candidate_id, providing more flexibility in managing activity records. Additionally, candidate_id now supports ",{"type":17,"tag":133,"props":336888,"children":336889},{"href":1857},[336890],{"type":23,"value":1860},{"type":23,"value":336892},", allowing for easier navigation of activity data tied to specific candidates. JobAdder has also introduced an update method for Activity, enabling you to modify existing activity records.",{"type":17,"tag":29,"props":336894,"children":336895},{},[336896],{"type":17,"tag":48,"props":336897,"children":336898},{},[336899],{"type":23,"value":217214},{"type":17,"tag":80,"props":336901,"children":336902},{},[336903,336908],{"type":17,"tag":84,"props":336904,"children":336905},{},[336906],{"type":23,"value":336907},"Recruitment platforms: streamline activity tracking for your users by updating activity records with the new writable fields, enhancing candidate management and reporting.",{"type":17,"tag":84,"props":336909,"children":336910},{},[336911],{"type":23,"value":336912},"Applicant tracking systems: improve candidate activity tracking by using candidate_id pagination and the new update method for Activity records.",{"type":17,"tag":29,"props":336914,"children":336915},{},[336916,336918,336924],{"type":23,"value":336917},"Unified.to simplifies adding JobAdder and ",{"type":17,"tag":133,"props":336919,"children":336921},{"href":56812,"rel":336920},[214],[336922],{"type":23,"value":336923},"40+ other pre-built ATS integrations",{"type":23,"value":336925}," to your application through a single API.",{"type":17,"tag":29,"props":336927,"children":336928},{},[336929],{"type":17,"tag":6438,"props":336930,"children":336933},{"alt":336931,"src":336932},"unified_zohocrm.png","https://s3.us-east-2.amazonaws.com/unified-article-images/sep_2024_product_updates-3.png",[],{"type":17,"tag":29,"props":336935,"children":336936},{},[336937],{"type":17,"tag":48,"props":336938,"children":336939},{},[336940],{"type":23,"value":336941},"Integration: Zoho CRM (Unified CRM API)",{"type":17,"tag":29,"props":336943,"children":336944},{},[336945],{"type":23,"value":336946},"Zoho CRM now supports create and update methods for Lead, Contact, and Deal, giving you more control over how you can manage key CRM objects for your end-users. With these enhancements, you can now programmatically create new records and update existing ones, streamlining workflows and improving data accuracy within your users' CRM systems.",{"type":17,"tag":29,"props":336948,"children":336949},{},[336950],{"type":17,"tag":48,"props":336951,"children":336952},{},[336953],{"type":23,"value":217214},{"type":17,"tag":80,"props":336955,"children":336956},{},[336957,336965,336970],{"type":17,"tag":84,"props":336958,"children":336959},{},[336960],{"type":17,"tag":48,"props":336961,"children":336962},{},[336963],{"type":23,"value":336964},"Sales automation: enable your users to automate lead creation and management directly from your application by leveraging the new methods for Leads.",{"type":17,"tag":84,"props":336966,"children":336967},{},[336968],{"type":23,"value":336969},"Customer service: empower users to create and update Contacts with real-time data from customer interactions, keeping their CRM always up-to-date.",{"type":17,"tag":84,"props":336971,"children":336972},{},[336973],{"type":17,"tag":48,"props":336974,"children":336975},{},[336976],{"type":23,"value":336977},"Deal tracking: let users manage sales pipelines more effectively by adding and updating Deals, ensuring accurate progress tracking and reporting.",{"type":17,"tag":29,"props":336979,"children":336980},{},[336981,336983,336989],{"type":23,"value":336982},"Unified.to helps you integrate with Zoho CRM and ",{"type":17,"tag":133,"props":336984,"children":336986},{"href":76501,"rel":336985},[214],[336987],{"type":23,"value":336988},"22+ other CRM systems",{"type":23,"value":56828},{"type":17,"tag":68,"props":336991,"children":336993},{"id":336992},"integration-explorer",[336994],{"type":23,"value":336995},"Integration Explorer",{"type":17,"tag":29,"props":336997,"children":336998},{},[336999],{"type":17,"tag":6438,"props":337000,"children":337003},{"alt":337001,"src":337002},"unified_api_explorer.png","https://s3.us-east-2.amazonaws.com/unified-article-images/sep_2024_product_updates-4.png",[],{"type":17,"tag":29,"props":337005,"children":337006},{},[337007],{"type":23,"value":337008},"We've made it even easier to explore our integrations. With the new Integrations Explorer, you can quickly see what's supported—whether it's readable and writable fields, webhook events, or list parameters. Easily filter by selected integrations and download a CSV for all properties, so you have everything you need at your fingertips.",{"type":17,"tag":29,"props":337010,"children":337011},{},[337012],{"type":17,"tag":133,"props":337013,"children":337016},{"href":337014,"rel":337015},"https://docs.unified.to/ats/integrations",[214],[337017],{"type":23,"value":337018},"Explore integrations",{"type":17,"tag":68,"props":337020,"children":337022},{"id":337021},"troubleshooting-webhooks-and-connections",[337023],{"type":23,"value":337024},"Troubleshooting webhooks and connections",{"type":17,"tag":29,"props":337026,"children":337027},{},[337028],{"type":23,"value":337029},"We've been working hard to enhance our documentation with new guides and tutorials based on your most frequently asked questions. Connections and webhooks are core features of Unified.to, and we know how frustrating it can be when things don't work as expected. To help you out, we've added two new troubleshooting guides:",{"type":17,"tag":80,"props":337031,"children":337032},{},[337033,337042],{"type":17,"tag":84,"props":337034,"children":337035},{},[337036],{"type":17,"tag":133,"props":337037,"children":337040},{"href":337038,"rel":337039},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_connections",[214],[337041],{"type":23,"value":335556},{"type":17,"tag":84,"props":337043,"children":337044},{},[337045],{"type":17,"tag":133,"props":337046,"children":337048},{"href":333328,"rel":337047},[214],[337049],{"type":23,"value":333332},{"type":17,"tag":29,"props":337051,"children":337052},{},[337053],{"type":23,"value":337054},"These step-by-step guides are designed to get you back on track quickly, minimizing disruptions and ensuring smooth performance.",{"type":17,"tag":68,"props":337056,"children":337058},{"id":337057},"customizing-the-auth-flow",[337059],{"type":23,"value":337060},"Customizing the Auth flow",{"type":17,"tag":29,"props":337062,"children":337063},{},[337064],{"type":23,"value":337065},"We've also heard from many of you who want to customize the authorization flow instead of using our embedded components. Good news—you can now easily see how to do that with our simple JavaScript tutorial. This workflow is intended for experienced developers who want more control over the authorization process or need to customize the user experience.",{"type":17,"tag":29,"props":337067,"children":337068},{},[337069],{"type":17,"tag":133,"props":337070,"children":337073},{"href":337071,"rel":337072},"https://docs.unified.to/tutorials/customize-auth-flow",[214],[337074],{"type":23,"value":337060},{"type":17,"tag":68,"props":337076,"children":337078},{"id":337077},"demo-repo-unified-messaging-api",[337079],{"type":23,"value":337080},"Demo Repo: Unified Messaging API",{"type":17,"tag":29,"props":337082,"children":337083},{},[337084],{"type":23,"value":337085},"We've also released a Unified.to Messaging API example repo to help you get started with building a messaging interface. This sample application is built using the Vue 3 framework, but it provides enough examples that you can adapt it to React, Angular, or any other front-end framework. The app demonstrates how to call the Unified.to Messaging API to retrieve a list of channels and messages.",{"type":17,"tag":29,"props":337087,"children":337088},{},[337089],{"type":17,"tag":133,"props":337090,"children":337093},{"href":337091,"rel":337092},"https://github.com/unified-to/unified-messaging-demo",[214],[337094],{"type":23,"value":337095},"Unified Messaging API demo",{"type":17,"tag":68,"props":337097,"children":337099},{"id":337098},"understanding-scopes",[337100],{"type":23,"value":337101},"Understanding scopes",{"type":17,"tag":29,"props":337103,"children":337104},{},[337105],{"type":23,"value":337106},"We've added a new guide to our docs for understanding and setting up scopes. In API integrations and OAuth, scopes are essential for managing access to resources. This guide dives into what scopes are, why they matter in OAuth, and how they're specifically handled at Unified.to.",{"type":17,"tag":29,"props":337108,"children":337109},{},[337110,337116],{"type":17,"tag":133,"props":337111,"children":337114},{"href":337112,"rel":337113},"https://docs.unified.to/concepts/scopes",[214],[337115],{"type":23,"value":337101},{"type":17,"tag":133,"props":337117,"children":337120},{"href":337118,"rel":337119},"https://docs.unified.to/guides/how_to_set_up_your_scopes_in_hubspot",[214],[337121],{"type":23,"value":337122},"Setting up scopes in HubSpot",{"type":17,"tag":68,"props":337124,"children":337126},{"id":337125},"sync2hire-launches-16-enterprise-ready-integrations",[337127],{"type":23,"value":337128},"Sync2Hire launches 16 enterprise-ready integrations",{"type":17,"tag":29,"props":337130,"children":337131},{},[337132],{"type":17,"tag":6438,"props":337133,"children":337136},{"alt":337134,"src":337135},"unified_sync2hire_social.png","https://s3.us-east-2.amazonaws.com/unified-article-images/sep_2024_product_updates-5.png",[],{"type":17,"tag":29,"props":337138,"children":337139},{},[337140],{"type":17,"tag":33,"props":337141,"children":337142},{},[337143],{"type":23,"value":337144},"'Unified.to's platform has not only saved us development time, but it also provides us with clear insights into the health of our integrations. The dashboard to view the status of the integrations along with API call error reports have been invaluable.'",{"type":17,"tag":29,"props":337146,"children":337147},{},[337148],{"type":23,"value":337149},"— Neal Akyildirim, Co-founder and COO",{"type":17,"tag":29,"props":337151,"children":337152},{},[337153],{"type":23,"value":337154},"Learn how Sync2Hire fast-tracked the launch of their post-application collaboration and communication platform, saved a year of integration development time, and added 16 enterprise-ready integrations in just two weeks.",{"type":17,"tag":29,"props":337156,"children":337157},{},[337158],{"type":17,"tag":133,"props":337159,"children":337161},{"href":321596,"rel":337160},[214],[337162],{"type":23,"value":337163},"Case study: Sync2Hire",{"type":17,"tag":68,"props":337165,"children":337167},{"id":337166},"unifiedto-joins-c100",[337168],{"type":23,"value":337169},"Unified.to joins C100",{"type":17,"tag":29,"props":337171,"children":337172},{},[337173],{"type":17,"tag":6438,"props":337174,"children":337177},{"alt":337175,"src":337176},"c100_unified.jpeg","https://s3.us-east-2.amazonaws.com/unified-article-images/sep_2024_product_updates-6.jpg",[],{"type":17,"tag":29,"props":337179,"children":337180},{},[337181],{"type":23,"value":337182},"Unified.to was invited to participate in C100, a prestigious network of top Canadian entrepreneurs, investors, and executives in Silicon Valley. We're honored to be part of this community!",{"type":17,"tag":68,"props":337184,"children":337186},{"id":337185},"unifiedto-closes-11-m-pre-seed",[337187],{"type":23,"value":337188},"Unified.to closes $1.1 M pre-seed",{"type":17,"tag":29,"props":337190,"children":337191},{},[337192],{"type":23,"value":337193},"And finally, we're thrilled to announce that Unified.to has closed a $1.1M pre-seed funding round. Led by LOI and Developer Capital and supported by Techstars, Canadian and Boston-area VCs, along with angel investors. This funding will accelerate our go-to-market strategy, expand our team, and drive innovation in our unified API platform. We're excited about this next phase of growth and how it will help us better serve our customers.",{"type":17,"tag":29,"props":337195,"children":337196},{},[337197],{"type":17,"tag":133,"props":337198,"children":337201},{"href":337199,"rel":337200},"https://betakit.com/calendarhero-team-returns-with-1-1-million-to-help-ai-saas-companies-launch-api-integrations-through-unified-to/",[214],[337202],{"type":23,"value":337203},"BetaKit Article",{"type":17,"tag":29,"props":337205,"children":337206},{},[337207],{"type":17,"tag":133,"props":337208,"children":337211},{"href":337209,"rel":337210},"https://unified.to/blog/unified_secures_dollar1_1m_pre_seed_to_power_integrations_for_ai_first_companies",[214],[337212],{"type":23,"value":337213},"Read a message from our CEO",{"title":7,"searchDepth":1629,"depth":1629,"links":337215},[337216,337217,337218,337219,337220,337221,337222,337223,337224,337225,337226],{"id":243535,"depth":1629,"text":217887},{"id":336794,"depth":1629,"text":336797},{"id":336845,"depth":1629,"text":336848},{"id":336992,"depth":1629,"text":336995},{"id":337021,"depth":1629,"text":337024},{"id":337057,"depth":1629,"text":337060},{"id":337077,"depth":1629,"text":337080},{"id":337098,"depth":1629,"text":337101},{"id":337125,"depth":1629,"text":337128},{"id":337166,"depth":1629,"text":337169},{"id":337185,"depth":1629,"text":337188},"content:blog:sep_2024_product_updates.md","blog/sep_2024_product_updates.md","blog/sep_2024_product_updates",{"_path":337231,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":337232,"description":337233,"img":337234,"date":336693,"tag":12,"body":337235,"_type":1677,"_id":337401,"_source":1679,"_file":337402,"_stem":337403,"_extension":1682},"/blog/unified_launches_scim_support_for_360_integrations","Unified.to launches SCIM support for 360+ integrations","Unified.to is excited to announce the release of our SCIM API (System for Cross-domain Identity Management) support, expanding our unified API offerings to...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_launches_scim_support_for_360_integrations-icon.webp",{"type":14,"children":337236,"toc":337395},[337237,337242,337245,337252,337269,337274,337280,337285,337290,337296,337339,337345,337350,337373,337377,337390],{"type":17,"tag":18,"props":337238,"children":337240},{"id":337239},"unifiedto-launches-scim-support-for-360-integrations",[337241],{"type":23,"value":337232},{"type":17,"tag":25,"props":337243,"children":337244},{},[],{"type":17,"tag":29,"props":337246,"children":337247},{},[337248],{"type":17,"tag":33,"props":337249,"children":337250},{},[337251],{"type":23,"value":336711},{"type":17,"tag":29,"props":337253,"children":337254},{},[337255,337257,337261,337263,337267],{"type":23,"value":337256},"Unified.to is excited to announce the release of our ",{"type":17,"tag":133,"props":337258,"children":337259},{"href":299674},[337260],{"type":23,"value":299677},{"type":23,"value":337262}," (System for Cross-domain Identity Management) support, expanding our ",{"type":17,"tag":133,"props":337264,"children":337265},{"href":7691},[337266],{"type":23,"value":7459},{"type":23,"value":337268}," offerings to simplify user provisioning across multiple systems.",{"type":17,"tag":29,"props":337270,"children":337271},{},[337272],{"type":23,"value":337273},"What's more, we've added virtualized support for SCIM to all of our HRIS integrations, so that you can use SCIM with over 360 integrations, including those that don't natively support SCIM.",{"type":17,"tag":68,"props":337275,"children":337277},{"id":337276},"expanding-the-reach-of-scim",[337278],{"type":23,"value":337279},"Expanding the Reach of SCIM",{"type":17,"tag":29,"props":337281,"children":337282},{},[337283],{"type":23,"value":337284},"SCIM is a standardized API for managing user identities across different systems. While it's an effective tool for streamlining identity management and user provisioning, its adoption has been limited by the number of services that natively support it. Unified.to addresses this limitation by virtualizing SCIM support across our entire platform.",{"type":17,"tag":29,"props":337286,"children":337287},{},[337288],{"type":23,"value":337289},"Our SCIM support allows developers and businesses to manage identities seamlessly across hundreds of services, regardless of their native SCIM support. This is made possible by our ability to provide SCIM endpoints for any integration that supports the Employee object.",{"type":17,"tag":68,"props":337291,"children":337293},{"id":337292},"key-features-of-unifiedtos-scim-support",[337294],{"type":23,"value":337295},"Key Features of Unified.to's SCIM Support",{"type":17,"tag":6154,"props":337297,"children":337298},{},[337299,337309,337319,337329],{"type":17,"tag":84,"props":337300,"children":337301},{},[337302,337307],{"type":17,"tag":48,"props":337303,"children":337304},{},[337305],{"type":23,"value":337306},"Wide Integration Coverage",{"type":23,"value":337308},": SCIM support for any third-party provider that supports the HRIS Employee object - over 360 integrations and counting.",{"type":17,"tag":84,"props":337310,"children":337311},{},[337312,337317],{"type":17,"tag":48,"props":337313,"children":337314},{},[337315],{"type":23,"value":337316},"Simplified Implementation",{"type":23,"value":337318},": Developers can use existing SCIM implementations with Unified.to's SCIM-compliant endpoints, reducing the need for custom code.",{"type":17,"tag":84,"props":337320,"children":337321},{},[337322,337327],{"type":17,"tag":48,"props":337323,"children":337324},{},[337325],{"type":23,"value":337326},"Standard Compliance",{"type":23,"value":337328},": Full support for SCIM 2.0, ensuring compatibility with existing tools and processes.",{"type":17,"tag":84,"props":337330,"children":337331},{},[337332,337337],{"type":17,"tag":48,"props":337333,"children":337334},{},[337335],{"type":23,"value":337336},"Extended Attributes",{"type":23,"value":337338},": Support for additional SCIM extensions, allowing for more detailed user attribute management.",{"type":17,"tag":68,"props":337340,"children":337342},{"id":337341},"benefits-for-developers-and-businesses",[337343],{"type":23,"value":337344},"Benefits for Developers and Businesses",{"type":17,"tag":29,"props":337346,"children":337347},{},[337348],{"type":23,"value":337349},"This release offers significant advantages for both developers and businesses:",{"type":17,"tag":80,"props":337351,"children":337352},{},[337353,337363],{"type":17,"tag":84,"props":337354,"children":337355},{},[337356,337361],{"type":17,"tag":48,"props":337357,"children":337358},{},[337359],{"type":23,"value":337360},"For Developers",{"type":23,"value":337362},": Implement consistent identity management across a wide array of services without the need to learn multiple APIs.",{"type":17,"tag":84,"props":337364,"children":337365},{},[337366,337371],{"type":17,"tag":48,"props":337367,"children":337368},{},[337369],{"type":23,"value":337370},"For Businesses",{"type":23,"value":337372},": Simplify user provisioning, improve security, and reduce administrative overhead across your entire software ecosystem.",{"type":17,"tag":68,"props":337374,"children":337375},{"id":182698},[337376],{"type":23,"value":182701},{"type":17,"tag":29,"props":337378,"children":337379},{},[337380,337382,337389],{"type":23,"value":337381},"The SCIM support is available now as part of our unified API offerings. To learn more about implementing SCIM with Unified.to, visit our ",{"type":17,"tag":133,"props":337383,"children":337386},{"href":337384,"rel":337385},"https://www.notion.so/unified/scim/overview",[214],[337387],{"type":23,"value":337388},"documentation",{"type":23,"value":54},{"type":17,"tag":29,"props":337391,"children":337392},{},[337393],{"type":23,"value":337394},"Unified.to continues to expand our integration ecosystem and enhance our capabilities. We're committed to simplifying integration processes and helping businesses manage their software ecosystems more effectively.",{"title":7,"searchDepth":1629,"depth":1629,"links":337396},[337397,337398,337399,337400],{"id":337276,"depth":1629,"text":337279},{"id":337292,"depth":1629,"text":337295},{"id":337341,"depth":1629,"text":337344},{"id":182698,"depth":1629,"text":182701},"content:blog:unified_launches_scim_support_for_360_integrations.md","blog/unified_launches_scim_support_for_360_integrations.md","blog/unified_launches_scim_support_for_360_integrations",{"_path":337405,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":337406,"description":337407,"img":337408,"date":336693,"tag":12,"body":337409,"_type":1677,"_id":337514,"_source":1679,"_file":337515,"_stem":337516,"_extension":1682},"/blog/unified_secures_dollar1_1m_pre_seed_to_power_integrations_for_ai_first_companies","Unified.to Secures $1.1M Pre-Seed to Power Integrations for AI-first Companies","At Unified.to, we're excited to announce our $1.1 million pre-seed raise, led by LOI Venture and Developer Capital. This milestone reflects the growing demand...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_secures_$1_1m_pre_seed_to_power_integrations_for_ai_first_companies-icon.png",{"type":14,"children":337410,"toc":337512},[337411,337416,337419,337426,337434,337453,337458,337463,337468,337473,337478,337483,337488,337493,337498],{"type":17,"tag":18,"props":337412,"children":337414},{"id":337413},"unifiedto-secures-11m-pre-seed-to-power-integrations-for-ai-first-companies",[337415],{"type":23,"value":337406},{"type":17,"tag":25,"props":337417,"children":337418},{},[],{"type":17,"tag":29,"props":337420,"children":337421},{},[337422],{"type":17,"tag":33,"props":337423,"children":337424},{},[337425],{"type":23,"value":336711},{"type":17,"tag":29,"props":337427,"children":337428},{},[337429],{"type":17,"tag":6438,"props":337430,"children":337433},{"alt":337431,"src":337432},"unified_ceo_funding_announcement.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_secures_$1_1m_pre_seed_to_power_integrations_for_ai_first_companies-0.png",[],{"type":17,"tag":29,"props":337435,"children":337436},{},[337437,337439,337445,337447,337451],{"type":23,"value":337438},"At Unified.to, we're excited to ",{"type":17,"tag":133,"props":337440,"children":337442},{"href":337199,"rel":337441},[214],[337443],{"type":23,"value":337444},"announce our $1.1 million pre-seed raise",{"type":23,"value":337446},", led by LOI Venture and Developer Capital. This milestone reflects the growing demand for our real-time ",{"type":17,"tag":133,"props":337448,"children":337449},{"href":7691},[337450],{"type":23,"value":7459},{"type":23,"value":337452}," platform that's designed to help SaaS companies—particularly AI-first solutions — seamlessly integrate with hundreds of third-party applications in a fraction of the time.",{"type":17,"tag":29,"props":337454,"children":337455},{},[337456],{"type":23,"value":337457},"From my vantage point as CEO, I've seen firsthand how APIs are reshaping the future of B2B SaaS. The way companies manage and harness customer data is evolving, especially in an era where AI-driven automation, predictive analytics, and AI-powered bots and agents are becoming the norm.",{"type":17,"tag":29,"props":337459,"children":337460},{},[337461],{"type":23,"value":337462},"This funding round was co-led by Ryan Holmes' LOI Venture and Developer Capital, a new AI-focused VC fund from software consultancy Monadical. Their belief in our vision, alongside participation from Techstars, Alumni Ventures, and a dozen key technology angel investors, reinforces our mission to solve a massive problem in the SaaS ecosystem. B2B SaaS companies have long needed API integrations to build interconnected solutions. Now, with AI rapidly transforming the landscape, the ability to access normalised customer data in real time has never been more vital.",{"type":17,"tag":29,"props":337464,"children":337465},{},[337466],{"type":23,"value":337467},"We constantly observe how our platform drives real value. Our customer Humi, for example, saved over $1 million in development costs by leveraging our platform to build 25 integrations in just one month. HeroHunt.ai, the team behind Uwi, an AI recruitment agent, launched 22 integrations in just one week, cutting down over 10 months of engineering effort. This is just the beginning, as we continue to help AI-driven SaaS companies focus on their core product without getting bogged down by integration complexities.",{"type":17,"tag":29,"props":337469,"children":337470},{},[337471],{"type":23,"value":337472},"One of the most remarkable shifts we've witnessed over the past six months is how AI-powered products are leading the charge in adopting our unified API. In fact, nearly 90% of the companies using our platform today are AI-first or AI-powered, using our pre-built integrations to fuel data-driven applications. Whether it's for AI assistants, smarter sales insights, or enhanced automation, Unified.to has become a critical part of their infrastructure.",{"type":17,"tag":29,"props":337474,"children":337475},{},[337476],{"type":23,"value":337477},"Unified.to is about more than just APIs—it's about driving the future of disruptive SaaS solutions and empowering AI innovators. With this new capital, we're focused on enhancing our platform, scaling our team, and fueling the next generation of AI-driven software.",{"type":17,"tag":29,"props":337479,"children":337480},{},[337481],{"type":23,"value":337482},"We didn't realise how disruptive of a modern solution that we've built until we started selling it six months after starting the company. We didn't build 'yet another API integrations' solutions. We built an 'API universal translator' that can be trained by AI to bidirectionally communicate in real-time with any existing API.",{"type":17,"tag":29,"props":337484,"children":337485},{},[337486],{"type":23,"value":337487},"This unique combination of real-time data access and ease of integration is what sets Unified.to apart in the rapidly evolving SaaS and AI landscape.",{"type":17,"tag":29,"props":337489,"children":337490},{},[337491],{"type":23,"value":337492},"We're thrilled to have this incredible group of investors supporting us and proud to be backed by Creative Destruction Lab, NEXT, C100, Techstars and SXSW.",{"type":17,"tag":29,"props":337494,"children":337495},{},[337496],{"type":23,"value":337497},"Stay tuned—this is just the start.",{"type":17,"tag":29,"props":337499,"children":337500},{},[337501,337503,337510],{"type":23,"value":337502},"— ",{"type":17,"tag":133,"props":337504,"children":337507},{"href":337505,"rel":337506},"https://www.linkedin.com/in/roypereira/",[214],[337508],{"type":23,"value":337509},"Roy Pereira",{"type":23,"value":337511},", CEO, Unified.to",{"title":7,"searchDepth":1629,"depth":1629,"links":337513},[],"content:blog:unified_secures_$1_1m_pre_seed_to_power_integrations_for_ai_first_companies.md","blog/unified_secures_$1_1m_pre_seed_to_power_integrations_for_ai_first_companies.md","blog/unified_secures_$1_1m_pre_seed_to_power_integrations_for_ai_first_companies",{"_path":337518,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":336842,"description":337519,"img":337520,"date":337521,"tag":6341,"body":337522,"_type":1677,"_id":337698,"_source":1679,"_file":337699,"_stem":337700,"_extension":1682},"/blog/how_to_use_scim_with_the_unified_api","This guide explains how to use System for Cross-domain Identity Management (SCIM) with Unified.to. SCIM is a standardized API for managing user identities...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_scim_with_the_unified_api-icon.jpg","2024-10-03T00:00:00.000Z",{"type":14,"children":337523,"toc":337690},[337524,337529,337532,337540,337545,337550,337554,337567,337573,337578,337583,337604,337609,337615,337620,337629,337634,337640,337659,337664,337668],{"type":17,"tag":18,"props":337525,"children":337527},{"id":337526},"how-to-use-scim-with-the-unified-api",[337528],{"type":23,"value":336842},{"type":17,"tag":25,"props":337530,"children":337531},{},[],{"type":17,"tag":29,"props":337533,"children":337534},{},[337535],{"type":17,"tag":33,"props":337536,"children":337537},{},[337538],{"type":23,"value":337539},"October 3, 2024",{"type":17,"tag":29,"props":337541,"children":337542},{},[337543],{"type":23,"value":337544},"This guide explains how to use System for Cross-domain Identity Management (SCIM) with Unified.to. SCIM is a standardized API for managing user identities across different systems, enabling seamless identity management across multiple integrations.",{"type":17,"tag":29,"props":337546,"children":337547},{},[337548],{"type":23,"value":337549},"For developers already using SCIM, Unified.to's support means you can leverage your existing SCIM knowledge and implementations across a wider range of integrations.",{"type":17,"tag":68,"props":337551,"children":337552},{"id":177146},[337553],{"type":23,"value":177149},{"type":17,"tag":29,"props":337555,"children":337556},{},[337557,337559,337566],{"type":23,"value":337558},"This guide assumes you already have a basic understanding of SCIM and its purpose in identity management. You can read more about it in the ",{"type":17,"tag":133,"props":337560,"children":337563},{"href":337561,"rel":337562},"https://scim.cloud/",[214],[337564],{"type":23,"value":337565},"official specification",{"type":23,"value":54},{"type":17,"tag":68,"props":337568,"children":337570},{"id":337569},"using-scim-with-unifiedto",[337571],{"type":23,"value":337572},"Using SCIM with Unified.to",{"type":17,"tag":29,"props":337574,"children":337575},{},[337576],{"type":23,"value":337577},"Unified.to provides SCIM-compliant endpoints for managing user identities. These endpoints return data in the standard SCIM format.",{"type":17,"tag":29,"props":337579,"children":337580},{},[337581],{"type":23,"value":337582},"View the API references for:",{"type":17,"tag":80,"props":337584,"children":337585},{},[337586,337595],{"type":17,"tag":84,"props":337587,"children":337588},{},[337589],{"type":17,"tag":133,"props":337590,"children":337593},{"href":337591,"rel":337592},"https://docs.unified.to/scim/users/model",[214],[337594],{"type":23,"value":123508},{"type":17,"tag":84,"props":337596,"children":337597},{},[337598],{"type":17,"tag":133,"props":337599,"children":337602},{"href":337600,"rel":337601},"https://docs.unified.to/scim/groups/model",[214],[337603],{"type":23,"value":41728},{"type":17,"tag":29,"props":337605,"children":337606},{},[337607],{"type":23,"value":337608},"If you've already implemented SCIM in your application, you can simply point it to our SCIM endpoints.",{"type":17,"tag":239,"props":337610,"children":337612},{"id":337611},"leverage-scim-extensions",[337613],{"type":23,"value":337614},"Leverage SCIM extensions",{"type":17,"tag":29,"props":337616,"children":337617},{},[337618],{"type":23,"value":337619},"In addition to the core SCIM schema, Unified.to supports the following extensions:",{"type":17,"tag":6893,"props":337621,"children":337624},{"className":337622,"code":337623,"language":20901,"meta":23},[20899],"'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'\n'urn:ietf:params:scim:schemas:extension:lattice:attributes:1.0:User'\n'urn:ietf:params:scim:schemas:extension:peakon:2.0:User'\n",[337625],{"type":17,"tag":6121,"props":337626,"children":337627},{"__ignoreMap":7},[337628],{"type":23,"value":337623},{"type":17,"tag":29,"props":337630,"children":337631},{},[337632],{"type":23,"value":337633},"These extensions allow for more detailed user attributes specific to certain platforms.",{"type":17,"tag":68,"props":337635,"children":337637},{"id":337636},"use-scim-for-any-integration-that-supports-the-employee-object",[337638],{"type":23,"value":337639},"Use SCIM for any integration that supports the Employee object",{"type":17,"tag":29,"props":337641,"children":337642},{},[337643,337645,337653,337657],{"type":23,"value":337644},"One of the key advantages of using SCIM with Unified.to is that we have virtualized its behaviour in order to support a vast number of integrations. This means you can use SCIM with any integration that supports the Employee object (i.e. all ",{"type":17,"tag":133,"props":337646,"children":337648},{"href":299728,"rel":337647},[214],[337649],{"type":17,"tag":48,"props":337650,"children":337651},{},[337652],{"type":23,"value":57641},{"type":17,"tag":48,"props":337654,"children":337655},{},[337656],{"type":23,"value":12034},{"type":23,"value":337658},", regardless of whether the underlying API natively supports SCIM.",{"type":17,"tag":29,"props":337660,"children":337661},{},[337662],{"type":23,"value":337663},"By using Unified.to, you can expand your SCIM-compatible integrations from just a handful to over 100 different service providers.",{"type":17,"tag":68,"props":337665,"children":337666},{"id":332205},[337667],{"type":23,"value":332208},{"type":17,"tag":80,"props":337669,"children":337670},{},[337671,337680],{"type":17,"tag":84,"props":337672,"children":337673},{},[337674],{"type":17,"tag":133,"props":337675,"children":337677},{"href":336620,"rel":337676},[214],[337678],{"type":23,"value":337679},"SCIM API overview",{"type":17,"tag":84,"props":337681,"children":337682},{},[337683],{"type":17,"tag":133,"props":337684,"children":337687},{"href":337685,"rel":337686},"https://datatracker.ietf.org/doc/html/rfc7644",[214],[337688],{"type":23,"value":337689},"Official SCIM specifications",{"title":7,"searchDepth":1629,"depth":1629,"links":337691},[337692,337693,337696,337697],{"id":177146,"depth":1629,"text":177149},{"id":337569,"depth":1629,"text":337572,"children":337694},[337695],{"id":337611,"depth":1635,"text":337614},{"id":337636,"depth":1629,"text":337639},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_use_scim_with_the_unified_api.md","blog/how_to_use_scim_with_the_unified_api.md","blog/how_to_use_scim_with_the_unified_api",{"_path":337702,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":337703,"description":337704,"img":337705,"date":337706,"tag":289978,"body":337707,"_type":1677,"_id":338181,"_source":1679,"_file":338182,"_stem":338183,"_extension":1682},"/blog/how_sync2hire_got_to_market_faster_and_launched_enterprise_ready_integrations_with_unified","How Sync2Hire got to market faster and launched enterprise-ready integrations with Unified.to","Learn how Sync2Hire fast-tracked the launch of their post-application collaboration and communication platform, saved a year of integration development time,...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_sync2hire_got_to_market_faster_and_launched_enterprise_ready_integrations_with_unified-icon.png","2024-10-02T00:00:00.000Z",{"type":14,"children":337708,"toc":338171},[337709,337714,337717,337725,337749,337753,337758,337763,337768,337773,337778,337783,337794,337799,337807,337834,337840,337845,337863,337869,337874,337892,337910,337918,337926,337931,337939,337945,337950,337964,337986,337992,337997,338002,338009,338016,338021,338027,338032,338040,338053,338059,338064,338069,338077,338084,338088,338131,338136],{"type":17,"tag":18,"props":337710,"children":337712},{"id":337711},"how-sync2hire-got-to-market-faster-and-launched-enterprise-ready-integrations-with-unifiedto",[337713],{"type":23,"value":337703},{"type":17,"tag":25,"props":337715,"children":337716},{},[],{"type":17,"tag":29,"props":337718,"children":337719},{},[337720],{"type":17,"tag":33,"props":337721,"children":337722},{},[337723],{"type":23,"value":337724},"October 2, 2024",{"type":17,"tag":29,"props":337726,"children":337727},{},[337728,337732,337733,337743,337744],{"type":17,"tag":33,"props":337729,"children":337730},{},[337731],{"type":23,"value":290012},{"type":23,"value":18757},{"type":17,"tag":133,"props":337734,"children":337737},{"href":337735,"rel":337736},"https://sync2hire.com/",[214],[337738],{"type":17,"tag":33,"props":337739,"children":337740},{},[337741],{"type":23,"value":337742},"Sync2Hire",{"type":23,"value":18757},{"type":17,"tag":33,"props":337745,"children":337746},{},[337747],{"type":23,"value":337748},"fast-tracked the launch of their post-application collaboration and communication platform, saved a year of integration development time, and added 16 enterprise-ready integrations in just two weeks.",{"type":17,"tag":68,"props":337750,"children":337751},{"id":44585},[337752],{"type":23,"value":44588},{"type":17,"tag":29,"props":337754,"children":337755},{},[337756],{"type":23,"value":337757},"Company: Post-application collaboration and communication platform",{"type":17,"tag":29,"props":337759,"children":337760},{},[337761],{"type":23,"value":337762},"Use Case: Syncing data with Applicant Tracking Systems (ATS)",{"type":17,"tag":29,"props":337764,"children":337765},{},[337766],{"type":23,"value":337767},"Time Savings: 1 year",{"type":17,"tag":29,"props":337769,"children":337770},{},[337771],{"type":23,"value":337772},"Implementation Time: 2 weeks",{"type":17,"tag":29,"props":337774,"children":337775},{},[337776],{"type":23,"value":337777},"Integrations Launched: 19 integrations",{"type":17,"tag":29,"props":337779,"children":337780},{},[337781],{"type":23,"value":337782},"Engineers Required: 2 engineers",{"type":17,"tag":29,"props":337784,"children":337785},{},[337786,337788,337792],{"type":23,"value":337787},"Features Highlighted: Unified ",{"type":17,"tag":133,"props":337789,"children":337790},{"href":55696},[337791],{"type":23,"value":55699},{"type":23,"value":337793},", API Logs, Integration Health Status",{"type":17,"tag":29,"props":337795,"children":337796},{},[337797],{"type":23,"value":337798},"Benefits Highlighted: Speed and ease to build, responsive support, clear documentation",{"type":17,"tag":29,"props":337800,"children":337801},{},[337802],{"type":17,"tag":6438,"props":337803,"children":337806},{"alt":337804,"src":337805},"unified-sync2hire-quote.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_sync2hire_got_to_market_faster_and_launched_enterprise_ready_integrations_with_unified-0.png",[],{"type":17,"tag":29,"props":337808,"children":337809},{},[337810,337812,337818,337819,337825,337826,337832],{"type":23,"value":337811},"Sync2Hire is on a mission to bridge the post-application communication gap in the hiring process. Their platform keeps recruiting and hiring teams aligned, ties conversations to specific jobs, and syncs data with ATS platforms. They knew early on that integrating with leading ATS platforms like ",{"type":17,"tag":133,"props":337813,"children":337816},{"href":337814,"rel":337815},"https://unified.to/integrations/greenhouse",[214],[337817],{"type":23,"value":3189},{"type":23,"value":11826},{"type":17,"tag":133,"props":337820,"children":337823},{"href":337821,"rel":337822},"https://unified.to/integrations/lever",[214],[337824],{"type":23,"value":56545},{"type":23,"value":12561},{"type":17,"tag":133,"props":337827,"children":337830},{"href":337828,"rel":337829},"https://unified.to/integrations/workable",[214],[337831],{"type":23,"value":56564},{"type":23,"value":337833}," was crucial to meet the needs of enterprise recruiting teams. Instead of diverting valuable engineering resources to build these integrations from scratch, Sync2Hire made a strategic decision—they chose Unified.to as an integral part of their go-to-market strategy.",{"type":17,"tag":68,"props":337835,"children":337837},{"id":337836},"building-smarter-with-unifiedto-from-day-one",[337838],{"type":23,"value":337839},"Building smarter with Unified.to from day one",{"type":17,"tag":29,"props":337841,"children":337842},{},[337843],{"type":23,"value":337844},"From the start, Sync2Hire understood that offering seamless ATS integrations was essential not just for functionality, but for attracting enterprise customers. With more than 60% of candidates wanting better communication post-application, Sync2Hire needed to enable real-time data syncing between their platform and ATS providers to offer a true communication hub for hiring teams.",{"type":17,"tag":29,"props":337846,"children":337847},{},[337848,337850,337854,337856,337861],{"type":23,"value":337849},"However, building these integrations in-house would have slowed down their product launch and eaten into engineering time. Instead, they built their product with Unified.to's real-time ",{"type":17,"tag":133,"props":337851,"children":337852},{"href":7691},[337853],{"type":23,"value":7459},{"type":23,"value":337855}," platform at its core. Unified.to enabled them to add ",{"type":17,"tag":48,"props":337857,"children":337858},{},[337859],{"type":23,"value":337860},"19 enterprise-ready ATS integrations",{"type":23,"value":337862}," in just two weeks—something that would take most engineering teams months or even years to accomplish using traditional integration methods.",{"type":17,"tag":68,"props":337864,"children":337866},{"id":337865},"seamless-ats-integrations-with-unifiedto",[337867],{"type":23,"value":337868},"Seamless ATS integrations with Unified.to",{"type":17,"tag":29,"props":337870,"children":337871},{},[337872],{"type":23,"value":337873},"Sync2Hire's use cases for ATS integrations were far from simple. They needed to:",{"type":17,"tag":80,"props":337875,"children":337876},{},[337877,337882,337887],{"type":17,"tag":84,"props":337878,"children":337879},{},[337880],{"type":23,"value":337881},"Centralize candidate-related communications and maintain compliance",{"type":17,"tag":84,"props":337883,"children":337884},{},[337885],{"type":23,"value":337886},"Sync real-time employee and candidate data from various ATS platforms",{"type":17,"tag":84,"props":337888,"children":337889},{},[337890],{"type":23,"value":337891},"Enable option for syncing communication back to the ATS",{"type":17,"tag":29,"props":337893,"children":337894},{},[337895,337896,337902,337904,337908],{"type":23,"value":290446},{"type":17,"tag":133,"props":337897,"children":337899},{"href":56812,"rel":337898},[214],[337900],{"type":23,"value":337901},"unified ATS API",{"type":23,"value":337903},", Sync2Hire didn't have to worry about complex third-party ",{"type":17,"tag":133,"props":337905,"children":337906},{"href":129820},[337907],{"type":23,"value":129823},{"type":23,"value":337909}," or manual data mapping. Unified.to handled all the data normalization, so that Sync2Hire's engineer didn't have to map each ATS integration individually. Unlike many solutions like iPaaS or 'unified' APIs that aren't fully unified—bringing in custom fields and extra configuration—Sync2Hire only had to map Unified.to's data model to their business model once.",{"type":17,"tag":29,"props":337911,"children":337912},{},[337913],{"type":17,"tag":48,"props":337914,"children":337915},{},[337916],{"type":23,"value":337917},"'Integrating with ATS platforms typically involves extensive discussions with technical and sales teams. However, Unified's streamlined approach, clear setup, and thorough documentation have made the process remarkably simple and effortless.'",{"type":17,"tag":29,"props":337919,"children":337920},{},[337921],{"type":17,"tag":33,"props":337922,"children":337923},{},[337924],{"type":23,"value":337925},"Neal Akyildirim, Co-founder and COO",{"type":17,"tag":29,"props":337927,"children":337928},{},[337929],{"type":23,"value":337930},"By leveraging Unified.to, Sync2Hire immediately gained access to industry-leading ATS platforms, making their product a seamless fit for enterprise customers right from the start.",{"type":17,"tag":29,"props":337932,"children":337933},{},[337934],{"type":17,"tag":6438,"props":337935,"children":337938},{"alt":337936,"src":337937},"unified-sync2hire-product.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_sync2hire_got_to_market_faster_and_launched_enterprise_ready_integrations_with_unified-1.png",[],{"type":17,"tag":68,"props":337940,"children":337942},{"id":337941},"powering-enterprise-customers-with-real-time-data",[337943],{"type":23,"value":337944},"Powering enterprise customers with real-time data",{"type":17,"tag":29,"props":337946,"children":337947},{},[337948],{"type":23,"value":337949},"For recruiters and hiring managers, speed and accuracy in communication are critical. Sync2Hire built their product to integrate directly with mid-market and enterprise customers' existing ATS platforms—powered by Unified.to. This means clients can onboard Sync2Hire seamlessly without disrupting their workflows or requiring IT intervention.",{"type":17,"tag":29,"props":337951,"children":337952},{},[337953,337955,337962],{"type":23,"value":337954},"Thanks to Unified.to's real-time unified API platform, candidate data is updated constantly, ensuring hiring teams always have the most accurate and up-to-date information. Syncing data between Sync2Hire's platform and an ATS is made possible through Unified.to's webhook functionality, which allows data to sync in real time. Even for ATS providers that don't natively support webhooks, Unified.to creates ",{"type":17,"tag":133,"props":337956,"children":337959},{"href":337957,"rel":337958},"https://unified.to/blog/understanding_virtual_webhooks",[214],[337960],{"type":23,"value":337961},"virtual webhooks ",{"type":23,"value":337963},"to ensure seamless synchronization. This not only improves operational efficiency but also gives Sync2Hire's customers confidence that they can engage with candidates immediately, without data lag or integration hiccups.",{"type":17,"tag":29,"props":337965,"children":337966},{},[337967,337969,337976,337978,337985],{"type":23,"value":337968},"With the average recruiter using ",{"type":17,"tag":133,"props":337970,"children":337973},{"href":337971,"rel":337972},"https://www.emissary.ai/what-software-recruiters-use#:~:text=What%20is%20the%20Best%20Recruiting,This%20can%20be%20time%20consuming.",[214],[337974],{"type":23,"value":337975},"11-15 different technology tools",{"type":23,"value":337977}," throughout the day, software applications targeting recruiters and hiring teams can't afford to launch without a solid ",{"type":17,"tag":133,"props":337979,"children":337982},{"href":337980,"rel":337981},"https://unified.to/blog/building_your_integration_strategy_a_deep_dive_into_integration_technology",[214],[337983],{"type":23,"value":337984},"integration strategy",{"type":23,"value":54},{"type":17,"tag":68,"props":337987,"children":337989},{"id":337988},"a-strategic-partner-for-scale-and-speed",[337990],{"type":23,"value":337991},"A strategic partner for scale and speed",{"type":17,"tag":29,"props":337993,"children":337994},{},[337995],{"type":23,"value":337996},"Choosing Unified.to wasn't just about getting to market faster. Sync2Hire's decision was rooted in long-term strategy. By partnering with Unified.to, they eliminated the need for ongoing integration maintenance. As third-party APIs change, Unified.to handles all updates behind the scenes, freeing Sync2Hire's engineering team to focus on product innovation.",{"type":17,"tag":29,"props":337998,"children":337999},{},[338000],{"type":23,"value":338001},"With real-time API logs, error reports, and health status monitoring, Sync2Hire can quickly address any integration issues before they affect their customers.",{"type":17,"tag":29,"props":338003,"children":338004},{},[338005],{"type":17,"tag":48,"props":338006,"children":338007},{},[338008],{"type":23,"value":337144},{"type":17,"tag":29,"props":338010,"children":338011},{},[338012],{"type":17,"tag":33,"props":338013,"children":338014},{},[338015],{"type":23,"value":337925},{"type":17,"tag":29,"props":338017,"children":338018},{},[338019],{"type":23,"value":338020},"Unified.to's dashboard ensures Sync2Hire doesn't have to invest in building custom monitoring tools, freeing up more time for feature development. The platform's scalability also ensures Sync2Hire can handle an increasing number of API requests when they onboard new customers without using excess engineering hours.",{"type":17,"tag":68,"props":338022,"children":338024},{"id":338023},"accelerating-partnerships-and-revenue",[338025],{"type":23,"value":338026},"Accelerating partnerships and revenue",{"type":17,"tag":29,"props":338028,"children":338029},{},[338030],{"type":23,"value":338031},"Unified.to didn't just help Sync2Hire build integrations; it accelerated their go-to-market and set the stage for their growth. With enterprise-ready ATS integrations in place from day one, Sync2Hire was able to form strategic partnerships with eight ATS providers, boosting their credibility in the market. This early momentum has positioned Sync2Hire to attract more customers and close deals faster, directly contributing to their revenue potential.",{"type":17,"tag":29,"props":338033,"children":338034},{},[338035],{"type":17,"tag":6438,"props":338036,"children":338039},{"alt":338037,"src":338038},"unified-sync2hire-lever-listing.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_sync2hire_got_to_market_faster_and_launched_enterprise_ready_integrations_with_unified-2.png",[],{"type":17,"tag":29,"props":338041,"children":338042},{},[338043,338045,338051],{"type":23,"value":338044},"With Unified.to's growing pre-built integrations, Sync2Hire can quickly expand their integration offerings (and future partnerships) by simply turning on new ATS integrations through the platform—no code changes required. Unified.to's ",{"type":17,"tag":133,"props":338046,"children":338048},{"href":86962,"rel":338047},[214],[338049],{"type":23,"value":338050},"no-cache data policy",{"type":23,"value":338052}," and support for unified authorization makes it easy for Sync2Hire to meet their customers' security, compliance and data privacy needs.",{"type":17,"tag":68,"props":338054,"children":338056},{"id":338055},"focused-on-core-product-not-integrations",[338057],{"type":23,"value":338058},"Focused on core product, not integrations",{"type":17,"tag":29,"props":338060,"children":338061},{},[338062],{"type":23,"value":338063},"For Sync2Hire, the decision to choose Unified.to as their integration partner wasn't just about speed—it was about focus. By leveraging Unified.to for API integration development and maintenance, Sync2Hire's engineering team could stay focused on what mattered most: delivering the ultimate post-application collaboration and communication platform for their customers.",{"type":17,"tag":29,"props":338065,"children":338066},{},[338067],{"type":23,"value":338068},"The team avoided integration complexity by using Unified.to, speeding up their launch and keeping them on course with their roadmap.",{"type":17,"tag":29,"props":338070,"children":338071},{},[338072],{"type":17,"tag":48,"props":338073,"children":338074},{},[338075],{"type":23,"value":338076},"\"Native integrations are time-consuming and can significantly impact our roadmap. Thanks to Unified's integrations, we were able to focus more on developing new features, freeing up valuable time that would have otherwise been spent on native integrations.\"",{"type":17,"tag":29,"props":338078,"children":338079},{},[338080],{"type":17,"tag":33,"props":338081,"children":338082},{},[338083],{"type":23,"value":337925},{"type":17,"tag":68,"props":338085,"children":338086},{"id":327029},[338087],{"type":23,"value":327032},{"type":17,"tag":80,"props":338089,"children":338090},{},[338091,338101,338111,338121],{"type":17,"tag":84,"props":338092,"children":338093},{},[338094,338099],{"type":17,"tag":48,"props":338095,"children":338096},{},[338097],{"type":23,"value":338098},"Fast deployment:",{"type":23,"value":338100}," Sync2Hire added 19 ATS integrations to their product in just two weeks, cutting down a year of development work.",{"type":17,"tag":84,"props":338102,"children":338103},{},[338104,338109],{"type":17,"tag":48,"props":338105,"children":338106},{},[338107],{"type":23,"value":338108},"Real-time data:",{"type":23,"value":338110}," Powered by Unified.to, Sync2Hire's platform syncs data in real time, providing customers with the most up-to-date information.",{"type":17,"tag":84,"props":338112,"children":338113},{},[338114,338119],{"type":17,"tag":48,"props":338115,"children":338116},{},[338117],{"type":23,"value":338118},"Zero maintenance headaches:",{"type":23,"value":338120}," Unified.to handles all ongoing API updates, so Sync2Hire can stay focused on their product.",{"type":17,"tag":84,"props":338122,"children":338123},{},[338124,338129],{"type":17,"tag":48,"props":338125,"children":338126},{},[338127],{"type":23,"value":338128},"Strategic growth:",{"type":23,"value":338130}," Pre-built integrations helped Sync2Hire secure partnerships with ATS providers, increasing their brand visibility and revenue potential.",{"type":17,"tag":29,"props":338132,"children":338133},{},[338134],{"type":23,"value":338135},"By building their post-application platform with Unified.to from the start, Sync2Hire was able to stay nimble, deliver faster, and focus on their core product.",{"type":17,"tag":29,"props":338137,"children":338138},{},[338139,338143,338144,338152,338153,338157,338158,338166,338167],{"type":17,"tag":48,"props":338140,"children":338141},{},[338142],{"type":23,"value":328400},{"type":23,"value":18757},{"type":17,"tag":133,"props":338145,"children":338147},{"href":332940,"rel":338146},[214],[338148],{"type":17,"tag":48,"props":338149,"children":338150},{},[338151],{"type":23,"value":322435},{"type":23,"value":18757},{"type":17,"tag":48,"props":338154,"children":338155},{},[338156],{"type":23,"value":328416},{"type":23,"value":18757},{"type":17,"tag":133,"props":338159,"children":338161},{"href":332955,"rel":338160},[214],[338162],{"type":17,"tag":48,"props":338163,"children":338164},{},[338165],{"type":23,"value":328427},{"type":23,"value":18757},{"type":17,"tag":48,"props":338168,"children":338169},{},[338170],{"type":23,"value":328433},{"title":7,"searchDepth":1629,"depth":1629,"links":338172},[338173,338174,338175,338176,338177,338178,338179,338180],{"id":44585,"depth":1629,"text":44588},{"id":337836,"depth":1629,"text":337839},{"id":337865,"depth":1629,"text":337868},{"id":337941,"depth":1629,"text":337944},{"id":337988,"depth":1629,"text":337991},{"id":338023,"depth":1629,"text":338026},{"id":338055,"depth":1629,"text":338058},{"id":327029,"depth":1629,"text":327032},"content:blog:how_sync2hire_got_to_market_faster_and_launched_enterprise_ready_integrations_with_unified.md","blog/how_sync2hire_got_to_market_faster_and_launched_enterprise_ready_integrations_with_unified.md","blog/how_sync2hire_got_to_market_faster_and_launched_enterprise_ready_integrations_with_unified",{"_path":338185,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":335556,"description":338186,"img":338187,"date":338188,"tag":6341,"body":338189,"_type":1677,"_id":339256,"_source":1679,"_file":339257,"_stem":339258,"_extension":1682},"/blog/how_to_troubleshoot_unhealthy_connections","Connections allow your application to securely access data from third-party API platforms. They serve as links between your Unified.to workspace, your...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_troubleshoot_unhealthy_connections-icon.svg","2024-09-25T00:00:00.000Z",{"type":14,"children":338190,"toc":339236},[338191,338196,338199,338207,338212,338217,338221,338226,338237,338243,338248,338300,338306,338311,338354,338359,338364,338369,338394,338399,338462,338467,338473,338478,338484,338515,338521,338552,338570,338593,338599,338605,338610,338618,338631,338639,338662,338668,338679,338686,338724,338731,338767,338772,338822,338834,338843,338857,338862,338870,338897,338905,338910,338916,338925,338933,338941,338947,338952,338960,338968,338975,339000,339006,339011,339018,339031,339038,339056,339062,339067,339075,339088,339094,339099,339198,339203,339231],{"type":17,"tag":18,"props":338192,"children":338194},{"id":338193},"how-to-troubleshoot-unhealthy-connections",[338195],{"type":23,"value":335556},{"type":17,"tag":25,"props":338197,"children":338198},{},[],{"type":17,"tag":29,"props":338200,"children":338201},{},[338202],{"type":17,"tag":33,"props":338203,"children":338204},{},[338205],{"type":23,"value":338206},"September 25, 2024",{"type":17,"tag":29,"props":338208,"children":338209},{},[338210],{"type":23,"value":338211},"Connections allow your application to securely access data from third-party API platforms. They serve as links between your Unified.to workspace, your customers' data, and your app.",{"type":17,"tag":29,"props":338213,"children":338214},{},[338215],{"type":23,"value":338216},"Whether you're encountering issues during connection creation or debugging an existing connection that has become unhealthy, this guide will help you identify and resolve the problem. We'll walk you through how to interpret error messages, check connection status, and implement solutions to get your integrations running smoothly again.",{"type":17,"tag":68,"props":338218,"children":338219},{"id":177146},[338220],{"type":23,"value":177149},{"type":17,"tag":29,"props":338222,"children":338223},{},[338224],{"type":23,"value":338225},"This guide assumes you have a basic understanding of:",{"type":17,"tag":80,"props":338227,"children":338228},{},[338229],{"type":17,"tag":84,"props":338230,"children":338231},{},[338232],{"type":17,"tag":133,"props":338233,"children":338235},{"href":337112,"rel":338234},[214],[338236],{"type":23,"value":42815},{"type":17,"tag":68,"props":338238,"children":338240},{"id":338239},"connection-lifecycle",[338241],{"type":23,"value":338242},"Connection lifecycle",{"type":17,"tag":29,"props":338244,"children":338245},{},[338246],{"type":23,"value":338247},"Understanding the connection lifecycle can help in troubleshooting:",{"type":17,"tag":6154,"props":338249,"children":338250},{},[338251,338256,338261,338272,338277],{"type":17,"tag":84,"props":338252,"children":338253},{},[338254],{"type":23,"value":338255},"Your customer selects an integration from your app to authorize.",{"type":17,"tag":84,"props":338257,"children":338258},{},[338259],{"type":23,"value":338260},"Your customer is directed to the authorization page for that integration.",{"type":17,"tag":84,"props":338262,"children":338263},{},[338264,338266,338270],{"type":23,"value":338265},"Unified.to determines what to display on the page (e.g. ",{"type":17,"tag":133,"props":338267,"children":338268},{"href":779},[338269],{"type":23,"value":782},{"type":23,"value":338271}," vs API token)",{"type":17,"tag":84,"props":338273,"children":338274},{},[338275],{"type":23,"value":338276},"Your customer grants access to their account.",{"type":17,"tag":84,"props":338278,"children":338279},{},[338280,338282],{"type":23,"value":338281},"Unified.to's server creates a connection in memory and attempts to test it immediately.\n",{"type":17,"tag":6154,"props":338283,"children":338284},{},[338285,338290],{"type":17,"tag":84,"props":338286,"children":338287},{},[338288],{"type":23,"value":338289},"If tests pass, the connection is created in our database and your customer is redirected to the success URL you specified (defaults to the page they were on when they started the auth flow).",{"type":17,"tag":84,"props":338291,"children":338292},{},[338293,338295],{"type":23,"value":338294},"If tests fail, the customer is redirected to the failure URL you specified with error details in the query parameters. See the below section: ",{"type":17,"tag":48,"props":338296,"children":338297},{},[338298],{"type":23,"value":338299},"Handle errors during connection creation",{"type":17,"tag":68,"props":338301,"children":338303},{"id":338302},"understanding-connection-health",[338304],{"type":23,"value":338305},"Understanding connection health",{"type":17,"tag":29,"props":338307,"children":338308},{},[338309],{"type":23,"value":338310},"Connections in Unified.to have different health statuses based on their recent activity:",{"type":17,"tag":80,"props":338312,"children":338313},{},[338314,338324,338334,338344],{"type":17,"tag":84,"props":338315,"children":338316},{},[338317,338322],{"type":17,"tag":48,"props":338318,"children":338319},{},[338320],{"type":23,"value":338321},"Healthy",{"type":23,"value":338323},": The connection is working as expected.",{"type":17,"tag":84,"props":338325,"children":338326},{},[338327,338332],{"type":17,"tag":48,"props":338328,"children":338329},{},[338330],{"type":23,"value":338331},"Unhealthy",{"type":23,"value":338333},": The connection has failed and hasn't had a successful call since.",{"type":17,"tag":84,"props":338335,"children":338336},{},[338337,338342],{"type":17,"tag":48,"props":338338,"children":338339},{},[338340],{"type":23,"value":338341},"Unhealthy now",{"type":23,"value":338343},": The connection has had a recent failure after previous successes.",{"type":17,"tag":84,"props":338345,"children":338346},{},[338347,338352],{"type":17,"tag":48,"props":338348,"children":338349},{},[338350],{"type":23,"value":338351},"New",{"type":23,"value":338353},": The connection has been created but hasn't been used yet.",{"type":17,"tag":29,"props":338355,"children":338356},{},[338357],{"type":23,"value":338358},"It's important to note that a connection can represent multiple objects and endpoints, each with its own potential for errors. Not all errors are terminal or indicative of a broken connection.",{"type":17,"tag":68,"props":338360,"children":338362},{"id":338361},"handle-errors-during-connection-creation",[338363],{"type":23,"value":338299},{"type":17,"tag":29,"props":338365,"children":338366},{},[338367],{"type":23,"value":338368},"When a connection fails to be created, we redirect users to the failure URL (this defaults to the page where the auth flow was initiated). The redirect URL includes two query parameters:",{"type":17,"tag":80,"props":338370,"children":338371},{},[338372,338383],{"type":17,"tag":84,"props":338373,"children":338374},{},[338375,338381],{"type":17,"tag":6121,"props":338376,"children":338378},{"className":338377},[],[338379],{"type":23,"value":338380},"error",{"type":23,"value":338382},": An error message",{"type":17,"tag":84,"props":338384,"children":338385},{},[338386,338392],{"type":17,"tag":6121,"props":338387,"children":338389},{"className":338388},[],[338390],{"type":23,"value":338391},"log_id",{"type":23,"value":338393},": The ID of the API call log entry for this failure",{"type":17,"tag":29,"props":338395,"children":338396},{},[338397],{"type":23,"value":338398},"To properly handle these errors in your application:",{"type":17,"tag":6154,"props":338400,"children":338401},{},[338402,338446],{"type":17,"tag":84,"props":338403,"children":338404},{},[338405,338410],{"type":17,"tag":48,"props":338406,"children":338407},{},[338408],{"type":23,"value":338409},"Review the API call log:",{"type":17,"tag":80,"props":338411,"children":338412},{},[338413,338429,338441],{"type":17,"tag":84,"props":338414,"children":338415},{},[338416,338417,338427],{"type":23,"value":6661},{"type":17,"tag":133,"props":338418,"children":338421},{"href":338419,"rel":338420},"https://app.unified.to/logs",[214],[338422],{"type":17,"tag":48,"props":338423,"children":338424},{},[338425],{"type":23,"value":338426},"API Call Logs",{"type":23,"value":338428}," in your Unified.to dashboard",{"type":17,"tag":84,"props":338430,"children":338431},{},[338432,338434,338439],{"type":23,"value":338433},"Look up the log entry using the ",{"type":17,"tag":6121,"props":338435,"children":338437},{"className":338436},[],[338438],{"type":23,"value":338391},{"type":23,"value":338440}," from the URL",{"type":17,"tag":84,"props":338442,"children":338443},{},[338444],{"type":23,"value":338445},"Examine the error message and status code to understand what went wrong",{"type":17,"tag":84,"props":338447,"children":338448},{},[338449,338454],{"type":17,"tag":48,"props":338450,"children":338451},{},[338452],{"type":23,"value":338453},"Implement error handling in your app",{"type":17,"tag":6154,"props":338455,"children":338456},{},[338457],{"type":17,"tag":84,"props":338458,"children":338459},{},[338460],{"type":23,"value":338461},"For example, you may want to display a friendly message to your users, log the error in your monitoring tool, or invite them to contact support",{"type":17,"tag":29,"props":338463,"children":338464},{},[338465],{"type":23,"value":338466},"Review the section below, 'Troubleshooting by connection error codes', for a detailed walkthrough of the possible error codes and how to handle them.",{"type":17,"tag":68,"props":338468,"children":338470},{"id":338469},"handle-errors-after-a-connection-is-created",[338471],{"type":23,"value":338472},"Handle errors after a connection is created",{"type":17,"tag":29,"props":338474,"children":338475},{},[338476],{"type":23,"value":338477},"When a connection is created successfully but becomes unhealthy later on, the first place to look for debugging information is in the API call logs.",{"type":17,"tag":239,"props":338479,"children":338481},{"id":338480},"_1-check-the-connection-status",[338482],{"type":23,"value":338483},"1. Check the connection status",{"type":17,"tag":6154,"props":338485,"children":338486},{},[338487,338500],{"type":17,"tag":84,"props":338488,"children":338489},{},[338490,338491,338499],{"type":23,"value":42715},{"type":17,"tag":133,"props":338492,"children":338494},{"href":329634,"rel":338493},[214],[338495],{"type":17,"tag":48,"props":338496,"children":338497},{},[338498],{"type":23,"value":329638},{"type":23,"value":329640},{"type":17,"tag":84,"props":338501,"children":338502},{},[338503,338505,338509,338510,338514],{"type":23,"value":338504},"Look for connections marked as ",{"type":17,"tag":48,"props":338506,"children":338507},{},[338508],{"type":23,"value":338331},{"type":23,"value":75890},{"type":17,"tag":48,"props":338511,"children":338512},{},[338513],{"type":23,"value":338341},{"type":23,"value":54},{"type":17,"tag":239,"props":338516,"children":338518},{"id":338517},"_2-review-api-call-logs",[338519],{"type":23,"value":338520},"2. Review API call logs",{"type":17,"tag":6154,"props":338522,"children":338523},{},[338524,338537,338542,338547],{"type":17,"tag":84,"props":338525,"children":338526},{},[338527,338528,338536],{"type":23,"value":6661},{"type":17,"tag":133,"props":338529,"children":338531},{"href":338419,"rel":338530},[214],[338532],{"type":17,"tag":48,"props":338533,"children":338534},{},[338535],{"type":23,"value":338426},{"type":23,"value":54},{"type":17,"tag":84,"props":338538,"children":338539},{},[338540],{"type":23,"value":338541},"Filter the logs by the connection ID of the unhealthy connection (note: we only store logs from the past 60 days).",{"type":17,"tag":84,"props":338543,"children":338544},{},[338545],{"type":23,"value":338546},"Look for recent error logs (status codes 400 and above).",{"type":17,"tag":84,"props":338548,"children":338549},{},[338550],{"type":23,"value":338551},"Click on an error log to view details about the failed API call.",{"type":17,"tag":29,"props":338553,"children":338554},{},[338555,338557,338561,338563,338568],{"type":23,"value":338556},"You can also use the ",{"type":17,"tag":133,"props":338558,"children":338559},{"href":7691},[338560],{"type":23,"value":7806},{"type":23,"value":338562}," to retrieve a list of your connections and API call logs. Pass the ",{"type":17,"tag":6121,"props":338564,"children":338566},{"className":338565},[],[338567],{"type":23,"value":25037},{"type":23,"value":338569}," to the API calls endpoint to filter by that connection.",{"type":17,"tag":29,"props":338571,"children":338572},{},[338573,338577,338578,338585,338586],{"type":17,"tag":48,"props":338574,"children":338575},{},[338576],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":338579,"children":338582},{"href":338580,"rel":338581},"https://docs.unified.to/unified/connection/List_all_connections",[214],[338583],{"type":23,"value":338584},"List all connections",{"type":23,"value":11826},{"type":17,"tag":133,"props":338587,"children":338590},{"href":338588,"rel":338589},"https://docs.unified.to/unified/apicall/Returns_API_Calls",[214],[338591],{"type":23,"value":338592},"List all API calls",{"type":17,"tag":68,"props":338594,"children":338596},{"id":338595},"troubleshooting-by-connection-error-codes",[338597],{"type":23,"value":338598},"Troubleshooting by connection error codes",{"type":17,"tag":239,"props":338600,"children":338602},{"id":338601},"authentication-401",[338603],{"type":23,"value":338604},"Authentication (401)",{"type":17,"tag":29,"props":338606,"children":338607},{},[338608],{"type":23,"value":338609},"A 401 error is likely indicative that the connection is broken and requires recreation.",{"type":17,"tag":29,"props":338611,"children":338612},{},[338613],{"type":17,"tag":48,"props":338614,"children":338615},{},[338616],{"type":23,"value":338617},"Possible causes:",{"type":17,"tag":80,"props":338619,"children":338620},{},[338621,338626],{"type":17,"tag":84,"props":338622,"children":338623},{},[338624],{"type":23,"value":338625},"Your app's access to the provider has been revoked.",{"type":17,"tag":84,"props":338627,"children":338628},{},[338629],{"type":23,"value":338630},"In non-OAuth flows that ask your customers to input an API key or other information, they may have input the wrong values.",{"type":17,"tag":29,"props":338632,"children":338633},{},[338634],{"type":17,"tag":48,"props":338635,"children":338636},{},[338637],{"type":23,"value":338638},"Solutions:",{"type":17,"tag":80,"props":338640,"children":338641},{},[338642,338647,338652,338657],{"type":17,"tag":84,"props":338643,"children":338644},{},[338645],{"type":23,"value":338646},"Double check that your app still has access to the API provider.",{"type":17,"tag":84,"props":338648,"children":338649},{},[338650],{"type":23,"value":338651},"Ensure that your customers are entering the correctly values during the authorization flow.",{"type":17,"tag":84,"props":338653,"children":338654},{},[338655],{"type":23,"value":338656},"After doing the above, recreate the connection to refresh the authentication",{"type":17,"tag":84,"props":338658,"children":338659},{},[338660],{"type":23,"value":338661},"If the issue persists for specific endpoints, contact Unified.to support for assistance.",{"type":17,"tag":239,"props":338663,"children":338665},{"id":338664},"permissions-403",[338666],{"type":23,"value":338667},"Permissions (403)",{"type":17,"tag":29,"props":338669,"children":338670},{},[338671,338673,338678],{"type":23,"value":338672},"A 403 error is likely indicative that one or more data objects is not working as expected, usually due to misconfigured ",{"type":17,"tag":133,"props":338674,"children":338676},{"href":337112,"rel":338675},[214],[338677],{"type":23,"value":77613},{"type":23,"value":54},{"type":17,"tag":29,"props":338680,"children":338681},{},[338682],{"type":17,"tag":48,"props":338683,"children":338684},{},[338685],{"type":23,"value":338617},{"type":17,"tag":80,"props":338687,"children":338688},{},[338689],{"type":17,"tag":84,"props":338690,"children":338691},{},[338692,338694],{"type":23,"value":338693},"Mismatch between the scopes that the provider expects and what Unified.to is requesting. This can happen when:\n",{"type":17,"tag":80,"props":338695,"children":338696},{},[338697,338702],{"type":17,"tag":84,"props":338698,"children":338699},{},[338700],{"type":23,"value":338701},"Scopes have been changed or disabled on the provider's end i.e. in your developer account, or",{"type":17,"tag":84,"props":338703,"children":338704},{},[338705,338707,338714,338716,338723],{"type":23,"value":338706},"The proper scopes are not being requested when setting up the ",{"type":17,"tag":133,"props":338708,"children":338711},{"href":338709,"rel":338710},"https://app.unified.to/settings/embed?tab=Authorization",[214],[338712],{"type":23,"value":338713},"Authorization embedded component ",{"type":23,"value":338715},"or when generating an ",{"type":17,"tag":133,"props":338717,"children":338720},{"href":338718,"rel":338719},"https://docs.unified.to/unified/integration/Create_connection_indirectly",[214],[338721],{"type":23,"value":338722},"authorization URL",{"type":23,"value":54},{"type":17,"tag":29,"props":338725,"children":338726},{},[338727],{"type":17,"tag":48,"props":338728,"children":338729},{},[338730],{"type":23,"value":338638},{"type":17,"tag":6154,"props":338732,"children":338733},{},[338734,338762],{"type":17,"tag":84,"props":338735,"children":338736},{},[338737,338739],{"type":23,"value":338738},"Double check your scope settings in your developer account\n",{"type":17,"tag":6154,"props":338740,"children":338741},{},[338742,338747,338752,338757],{"type":17,"tag":84,"props":338743,"children":338744},{},[338745],{"type":23,"value":338746},"Log into your developer account for the API you're trying to access.",{"type":17,"tag":84,"props":338748,"children":338749},{},[338750],{"type":23,"value":338751},"Navigate to the settings page where your app's authorization options are found.",{"type":17,"tag":84,"props":338753,"children":338754},{},[338755],{"type":23,"value":338756},"Ensure that all necessary scopes are enabled (see note below on different integrations and how they handle scopes)",{"type":17,"tag":84,"props":338758,"children":338759},{},[338760],{"type":23,"value":338761},"Make a note of the scopes that are enabled.",{"type":17,"tag":84,"props":338763,"children":338764},{},[338765],{"type":23,"value":338766},"Double check your scope settings on Unified.to",{"type":17,"tag":29,"props":338768,"children":338769},{},[338770],{"type":23,"value":338771},"If you are using our embedded components to create connections, you'll need to ensure that the scopes on Unified.to match the ones you enabled in the API provider.",{"type":17,"tag":6154,"props":338773,"children":338774},{},[338775,338786,338795,338800,338817],{"type":17,"tag":84,"props":338776,"children":338777},{},[338778,338779,338785],{"type":23,"value":42715},{"type":17,"tag":133,"props":338780,"children":338782},{"href":329733,"rel":338781},[214],[338783],{"type":23,"value":338784},"Embedded components",{"type":23,"value":329640},{"type":17,"tag":84,"props":338787,"children":338788},{},[338789,338790],{"type":23,"value":6629},{"type":17,"tag":48,"props":338791,"children":338792},{},[338793],{"type":23,"value":338794},"Permission Scopes",{"type":17,"tag":84,"props":338796,"children":338797},{},[338798],{"type":23,"value":338799},"Select the scopes that match the scopes you enabled in the developer account (see note below on mappings)",{"type":17,"tag":84,"props":338801,"children":338802},{},[338803,338805,338809,338811,338815],{"type":23,"value":338804},"(Optional, only if you are using ",{"type":17,"tag":133,"props":338806,"children":338807},{"href":4999},[338808],{"type":23,"value":5002},{"type":23,"value":338810},") Select the ",{"type":17,"tag":48,"props":338812,"children":338813},{},[338814],{"type":23,"value":124562},{"type":23,"value":338816}," scope",{"type":17,"tag":84,"props":338818,"children":338819},{},[338820],{"type":23,"value":338821},"If the issue still persists, contact Unified.to support for assistance",{"type":17,"tag":29,"props":338823,"children":338824},{},[338825,338827,338832],{"type":23,"value":338826},"If you are generating an auth URL to redirect your customers to our auth flow, include ",{"type":17,"tag":6121,"props":338828,"children":338830},{"className":338829},[],[338831],{"type":23,"value":77613},{"type":23,"value":338833}," as a query parameter and list all the Unified scopes you need. Behind the scenes, Unified.to will map the Unified scopes you pass to the scopes on the API provider's end (see note below on mappings). For example:",{"type":17,"tag":6893,"props":338835,"children":338838},{"className":338836,"code":338837,"language":6898,"meta":7},[6896],"https://api.unified.to/unified/integration/auth/\n{WORKSPACE_ID}/{INTEGRATION e.g. hubspot}?redirect=true\n&scopes=webhook,{YOUR_SCOPES e.g. crm_deal_read, crm_event_read}\n",[338839],{"type":17,"tag":6121,"props":338840,"children":338841},{"__ignoreMap":7},[338842],{"type":23,"value":338837},{"type":17,"tag":29,"props":338844,"children":338845},{},[338846,338850,338851],{"type":17,"tag":48,"props":338847,"children":338848},{},[338849],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":338852,"children":338854},{"href":338718,"rel":338853},[214],[338855],{"type":23,"value":338856},"Create an authorization URL",{"type":17,"tag":29,"props":338858,"children":338859},{},[338860],{"type":23,"value":338861},"After addressing these issues, re-create the connection and/or webhook and then try again.",{"type":17,"tag":29,"props":338863,"children":338864},{},[338865],{"type":17,"tag":48,"props":338866,"children":338867},{},[338868],{"type":23,"value":338869},"A note on mappings:",{"type":17,"tag":29,"props":338871,"children":338872},{},[338873,338875,338880,338882,338888,338890,338895],{"type":23,"value":338874},"A mapping of the Unified scopes to the API provider (i.e. integration's) scopes can be found on the integration details page under the ",{"type":17,"tag":48,"props":338876,"children":338877},{},[338878],{"type":23,"value":338879},"OAuth 2 Credentials tab",{"type":23,"value":338881}," e.g. ",{"type":17,"tag":133,"props":338883,"children":338886},{"href":338884,"rel":338885},"https://app.unified.to/integrations/hubspot?tab=oauth2",[214],[338887],{"type":23,"value":243989},{"type":23,"value":338889}," are the mappings fo",{"type":17,"tag":48,"props":338891,"children":338892},{},[338893],{"type":23,"value":338894},"r",{"type":23,"value":338896}," HubSpot scopes.",{"type":17,"tag":29,"props":338898,"children":338899},{},[338900],{"type":17,"tag":48,"props":338901,"children":338902},{},[338903],{"type":23,"value":338904},"A note on integration-specific scopes:",{"type":17,"tag":29,"props":338906,"children":338907},{},[338908],{"type":23,"value":338909},"Different integrations may handle scopes in different ways - sometimes you can request a subset of the scopes enabled in the developer account, other times you must request all the scopes that have been enabled, and in the case of Hubspot, scopes are divided into Required and Optional scopes. For these cases, we have written how-to guides on generating OAuth credentials and configuring scopes. Please consult the Unified.to docs for more information about these integrations.",{"type":17,"tag":239,"props":338911,"children":338913},{"id":338912},"not-found-404",[338914],{"type":23,"value":338915},"Not found (404)",{"type":17,"tag":29,"props":338917,"children":338918},{},[338919,338923],{"type":17,"tag":48,"props":338920,"children":338921},{},[338922],{"type":23,"value":103346},{"type":23,"value":338924}," For Enrichment category integrations, 404 errors are treated as successful responses. They indicate that no data was found for the provided input, not that the connection is broken.",{"type":17,"tag":29,"props":338926,"children":338927},{},[338928],{"type":17,"tag":48,"props":338929,"children":338930},{},[338931],{"type":23,"value":338932},"Solution:",{"type":17,"tag":80,"props":338934,"children":338935},{},[338936],{"type":17,"tag":84,"props":338937,"children":338938},{},[338939],{"type":23,"value":338940},"Verify that the input data (e.g., email, company name) is correct.",{"type":17,"tag":239,"props":338942,"children":338944},{"id":338943},"rate-limiting-429",[338945],{"type":23,"value":338946},"Rate limiting (429)",{"type":17,"tag":29,"props":338948,"children":338949},{},[338950],{"type":23,"value":338951},"429 errors are treated as successful responses by Unified.to as they indicate the connection is active but temporarily limited.",{"type":17,"tag":29,"props":338953,"children":338954},{},[338955],{"type":17,"tag":48,"props":338956,"children":338957},{},[338958],{"type":23,"value":338959},"Possible cause:",{"type":17,"tag":80,"props":338961,"children":338962},{},[338963],{"type":17,"tag":84,"props":338964,"children":338965},{},[338966],{"type":23,"value":338967},"Exceeding the API rate limits of the third-party service",{"type":17,"tag":29,"props":338969,"children":338970},{},[338971],{"type":17,"tag":48,"props":338972,"children":338973},{},[338974],{"type":23,"value":338638},{"type":17,"tag":80,"props":338976,"children":338977},{},[338978,338990,338995],{"type":17,"tag":84,"props":338979,"children":338980},{},[338981,338983,338988],{"type":23,"value":338982},"(Recommended) Use ",{"type":17,"tag":133,"props":338984,"children":338986},{"href":327403,"rel":338985},[214],[338987],{"type":23,"value":5002},{"type":23,"value":338989}," to read data and Unified.to will take care of rate limiting for you.",{"type":17,"tag":84,"props":338991,"children":338992},{},[338993],{"type":23,"value":338994},"Implement request throttling in your application.",{"type":17,"tag":84,"props":338996,"children":338997},{},[338998],{"type":23,"value":338999},"Contact the third-party service to request increased rate limits.",{"type":17,"tag":239,"props":339001,"children":339003},{"id":339002},"server-errors-500-series-eg-502-503-etc",[339004],{"type":23,"value":339005},"Server errors (500 series e.g. 502, 503, etc)",{"type":17,"tag":29,"props":339007,"children":339008},{},[339009],{"type":23,"value":339010},"500 series errors are often treated as successful responses by Unified.to as they usually indicate temporary issues with the third-party service. In cases where the issue is on our end, however, we will attempt to make that clear in the error message.",{"type":17,"tag":29,"props":339012,"children":339013},{},[339014],{"type":17,"tag":48,"props":339015,"children":339016},{},[339017],{"type":23,"value":338617},{"type":17,"tag":80,"props":339019,"children":339020},{},[339021,339026],{"type":17,"tag":84,"props":339022,"children":339023},{},[339024],{"type":23,"value":339025},"Temporary issues with the third-party service",{"type":17,"tag":84,"props":339027,"children":339028},{},[339029],{"type":23,"value":339030},"Bugs",{"type":17,"tag":29,"props":339032,"children":339033},{},[339034],{"type":17,"tag":48,"props":339035,"children":339036},{},[339037],{"type":23,"value":338638},{"type":17,"tag":80,"props":339039,"children":339040},{},[339041,339046,339051],{"type":17,"tag":84,"props":339042,"children":339043},{},[339044],{"type":23,"value":339045},"Check the status page of the third-party service for any ongoing issues.",{"type":17,"tag":84,"props":339047,"children":339048},{},[339049],{"type":23,"value":339050},"Retry the request after a short delay.",{"type":17,"tag":84,"props":339052,"children":339053},{},[339054],{"type":23,"value":339055},"If the issue still persists or if you've discovered a bug, contact Unified.to support for assistance. Thank you!",{"type":17,"tag":239,"props":339057,"children":339059},{"id":339058},"not-implemented-501",[339060],{"type":23,"value":339061},"Not implemented (501)",{"type":17,"tag":29,"props":339063,"children":339064},{},[339065],{"type":23,"value":339066},"501 errors are treated as successful responses by Unified.to. They indicate that a specific functionality is not implemented for the integration, not that the connection is broken.",{"type":17,"tag":29,"props":339068,"children":339069},{},[339070],{"type":17,"tag":48,"props":339071,"children":339072},{},[339073],{"type":23,"value":339074},"Suggestion actions:",{"type":17,"tag":80,"props":339076,"children":339077},{},[339078,339083],{"type":17,"tag":84,"props":339079,"children":339080},{},[339081],{"type":23,"value":339082},"Check the Unified.to documentation for the specific integration to understand its supported features.",{"type":17,"tag":84,"props":339084,"children":339085},{},[339086],{"type":23,"value":339087},"If you believe the functionality should be supported, contact Unified.to support and we'd be happy to look into it.",{"type":17,"tag":68,"props":339089,"children":339091},{"id":339090},"monitor-and-receive-updates-about-your-connections",[339092],{"type":23,"value":339093},"Monitor and receive updates about your connections",{"type":17,"tag":29,"props":339095,"children":339096},{},[339097],{"type":23,"value":339098},"To stay informed about changes to your connections:",{"type":17,"tag":6154,"props":339100,"children":339101},{},[339102,339123,339134,339193],{"type":17,"tag":84,"props":339103,"children":339104},{},[339105,339106,339111,339112,339122],{"type":23,"value":42939},{"type":17,"tag":48,"props":339107,"children":339108},{},[339109],{"type":23,"value":339110},"Settings >",{"type":23,"value":18757},{"type":17,"tag":133,"props":339113,"children":339116},{"href":339114,"rel":339115},"https://app.unified.to/settings/workspace",[214],[339117],{"type":17,"tag":48,"props":339118,"children":339119},{},[339120],{"type":23,"value":339121},"Workspace",{"type":23,"value":54},{"type":17,"tag":84,"props":339124,"children":339125},{},[339126,339127,339132],{"type":23,"value":146715},{"type":17,"tag":48,"props":339128,"children":339129},{},[339130],{"type":23,"value":339131},"Notifications webhook URL",{"type":23,"value":339133},", enter the URL where you want to receive notifications (this should be an endpoint on your server that can receive POST requests).",{"type":17,"tag":84,"props":339135,"children":339136},{},[339137,339138,339143,339145],{"type":23,"value":146715},{"type":17,"tag":48,"props":339139,"children":339140},{},[339141],{"type":23,"value":339142},"Notifications webhook events",{"type":23,"value":339144},", select events related to connections:\n",{"type":17,"tag":80,"props":339146,"children":339147},{},[339148,339157,339166,339175,339184],{"type":17,"tag":84,"props":339149,"children":339150},{},[339151],{"type":17,"tag":6121,"props":339152,"children":339154},{"className":339153},[],[339155],{"type":23,"value":339156},"CONNECTION_HEALTHY",{"type":17,"tag":84,"props":339158,"children":339159},{},[339160],{"type":17,"tag":6121,"props":339161,"children":339163},{"className":339162},[],[339164],{"type":23,"value":339165},"CONNECTION_UNHEALTHY",{"type":17,"tag":84,"props":339167,"children":339168},{},[339169],{"type":17,"tag":6121,"props":339170,"children":339172},{"className":339171},[],[339173],{"type":23,"value":339174},"CONNECTION_CREATED",{"type":17,"tag":84,"props":339176,"children":339177},{},[339178],{"type":17,"tag":6121,"props":339179,"children":339181},{"className":339180},[],[339182],{"type":23,"value":339183},"CONNECTION_UPDATED",{"type":17,"tag":84,"props":339185,"children":339186},{},[339187],{"type":17,"tag":6121,"props":339188,"children":339190},{"className":339189},[],[339191],{"type":23,"value":339192},"CONNECTION_DELETED",{"type":17,"tag":84,"props":339194,"children":339195},{},[339196],{"type":23,"value":339197},"Implement a handler for these events in your app to monitor connection health proactively.",{"type":17,"tag":68,"props":339199,"children":339200},{"id":44469},[339201],{"type":23,"value":339202},"Next steps",{"type":17,"tag":80,"props":339204,"children":339205},{},[339206,339218],{"type":17,"tag":84,"props":339207,"children":339208},{},[339209,339210,339216],{"type":23,"value":326010},{"type":17,"tag":133,"props":339211,"children":339214},{"href":339212,"rel":339213},"https://discord.gg/2nsAPmbx",[214],[339215],{"type":23,"value":326017},{"type":23,"value":339217}," for support and updates.",{"type":17,"tag":84,"props":339219,"children":339220},{},[339221,339223,339229],{"type":23,"value":339222},"If issues persist, ",{"type":17,"tag":133,"props":339224,"children":339226},{"href":215330,"rel":339225},[214],[339227],{"type":23,"value":339228},"contact our support team",{"type":23,"value":339230}," for further assistance.",{"type":17,"tag":29,"props":339232,"children":339233},{},[339234],{"type":23,"value":339235},"Remember, connection health is dynamic and can change with each API call. Not all errors indicate a broken connection, and some error types are treated as successful responses in certain contexts.",{"title":7,"searchDepth":1629,"depth":1629,"links":339237},[339238,339239,339240,339241,339242,339246,339254,339255],{"id":177146,"depth":1629,"text":177149},{"id":338239,"depth":1629,"text":338242},{"id":338302,"depth":1629,"text":338305},{"id":338361,"depth":1629,"text":338299},{"id":338469,"depth":1629,"text":338472,"children":339243},[339244,339245],{"id":338480,"depth":1635,"text":338483},{"id":338517,"depth":1635,"text":338520},{"id":338595,"depth":1629,"text":338598,"children":339247},[339248,339249,339250,339251,339252,339253],{"id":338601,"depth":1635,"text":338604},{"id":338664,"depth":1635,"text":338667},{"id":338912,"depth":1635,"text":338915},{"id":338943,"depth":1635,"text":338946},{"id":339002,"depth":1635,"text":339005},{"id":339058,"depth":1635,"text":339061},{"id":339090,"depth":1629,"text":339093},{"id":44469,"depth":1629,"text":339202},"content:blog:how_to_troubleshoot_unhealthy_connections.md","blog/how_to_troubleshoot_unhealthy_connections.md","blog/how_to_troubleshoot_unhealthy_connections",{"_path":339260,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":333322,"description":339261,"img":339262,"date":339263,"tag":6341,"body":339264,"_type":1677,"_id":340317,"_source":1679,"_file":340318,"_stem":340319,"_extension":1682},"/blog/how_to_create_and_configure_webhooks","This guide goes over how to create and configure webhooks with Unified.to. Webhooks allow you to receive real-time data events when there are updates in your...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_and_configure_webhooks-icon.png","2024-09-04T00:00:00.000Z",{"type":14,"children":339265,"toc":340301},[339266,339271,339274,339282,339293,339304,339308,339319,339324,339329,339334,339340,339353,339362,339375,339396,339401,339560,339572,339617,339623,339634,339685,339690,339696,339701,339803,339809,339837,339852,339858,339863,339890,339903,339917,339923,339934,339946,339951,339964,339970,339988,340001,340006,340024,340036,340066,340072,340077,340108,340113,340128,340133,340139,340147,340166,340174,340179,340187,340205,340213,340225,340233,340238,340251,340256,340269,340278,340282],{"type":17,"tag":18,"props":339267,"children":339269},{"id":339268},"how-to-create-and-configure-webhooks",[339270],{"type":23,"value":333322},{"type":17,"tag":25,"props":339272,"children":339273},{},[],{"type":17,"tag":29,"props":339275,"children":339276},{},[339277],{"type":17,"tag":33,"props":339278,"children":339279},{},[339280],{"type":23,"value":339281},"September 4, 2024",{"type":17,"tag":29,"props":339283,"children":339284},{},[339285,339287,339291],{"type":23,"value":339286},"This guide goes over how to create and configure ",{"type":17,"tag":133,"props":339288,"children":339289},{"href":4999},[339290],{"type":23,"value":5002},{"type":23,"value":339292}," with Unified.to. Webhooks allow you to receive real-time data events when there are updates in your customers' accounts.",{"type":17,"tag":29,"props":339294,"children":339295},{},[339296,339298,339303],{"type":23,"value":339297},"Looking for help with troubleshooting webhook issues? See: ",{"type":17,"tag":133,"props":339299,"children":339301},{"href":333328,"rel":339300},[214],[339302],{"type":23,"value":333332},{"type":23,"value":54},{"type":17,"tag":68,"props":339305,"children":339306},{"id":177146},[339307],{"type":23,"value":177149},{"type":17,"tag":29,"props":339309,"children":339310},{},[339311,339313,339318],{"type":23,"value":339312},"This guide assumes you have a basic understanding of ",{"type":17,"tag":133,"props":339314,"children":339316},{"href":333054,"rel":339315},[214],[339317],{"type":23,"value":5002},{"type":23,"value":54},{"type":17,"tag":68,"props":339320,"children":339322},{"id":339321},"create-a-webhook",[339323],{"type":23,"value":330063},{"type":17,"tag":29,"props":339325,"children":339326},{},[339327],{"type":23,"value":339328},"Webhooks and connections are closely related; webhooks can only be created from existing connections and you can create multiple webhooks off a single connection. If you delete a connection, any webhooks that are associated with it will also be deleted.",{"type":17,"tag":29,"props":339330,"children":339331},{},[339332],{"type":23,"value":339333},"There are two ways to create a webhook:",{"type":17,"tag":239,"props":339335,"children":339337},{"id":339336},"method-1-use-the-unified-api",[339338],{"type":23,"value":339339},"Method 1: Use the Unified API",{"type":17,"tag":29,"props":339341,"children":339342},{},[339343,339345,339351],{"type":23,"value":339344},"Send a POST request to ",{"type":17,"tag":6121,"props":339346,"children":339348},{"className":339347},[],[339349],{"type":23,"value":339350},"/unified/webhook",{"type":23,"value":339352},"(see below for configuration options). For example:",{"type":17,"tag":6893,"props":339354,"children":339357},{"className":339355,"code":339356,"language":6898,"meta":7},[6896],"POST /unified/webhook?include_all=true\n\n{\n    hook_url: `${YOUR_WEBHOOK_URL}`,\n    connection_id: `${CONNECTION_ID}`\n    object_type: 'ats_candidate', // data to subscribe to\n    event: 'updated', // type of event to listen for\n}\n",[339358],{"type":17,"tag":6121,"props":339359,"children":339360},{"__ignoreMap":7},[339361],{"type":23,"value":339356},{"type":17,"tag":29,"props":339363,"children":339364},{},[339365,339369,339370],{"type":17,"tag":48,"props":339366,"children":339367},{},[339368],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":339371,"children":339373},{"href":330059,"rel":339372},[214],[339374],{"type":23,"value":330063},{"type":17,"tag":29,"props":339376,"children":339377},{},[339378,339380,339386,339388,339395],{"type":23,"value":339379},"By including the optional parameter ",{"type":17,"tag":6121,"props":339381,"children":339383},{"className":339382},[],[339384],{"type":23,"value":339385},"include_all",{"type":23,"value":339387}," in the query, the webhook will receive all historical data for the connection (see:",{"type":17,"tag":133,"props":339389,"children":339392},{"href":339390,"rel":339391},"https://docs.unified.to/guides/how_to_create_and_configure_webhooks#get-all-initial-data-for-a-connection",[214],[339393],{"type":23,"value":339394}," Get all initial data for a connection",{"type":23,"value":129328},{"type":17,"tag":29,"props":339397,"children":339398},{},[339399],{"type":23,"value":339400},"This is the payload that your server receives when webhook data comes in:",{"type":17,"tag":7231,"props":339402,"children":339403},{},[339404,339423],{"type":17,"tag":7235,"props":339405,"children":339406},{},[339407],{"type":17,"tag":7239,"props":339408,"children":339409},{},[339410,339414,339418],{"type":17,"tag":7243,"props":339411,"children":339412},{},[339413],{"type":23,"value":288407},{"type":17,"tag":7243,"props":339415,"children":339416},{},[339417],{"type":23,"value":47948},{"type":17,"tag":7243,"props":339419,"children":339420},{},[339421],{"type":23,"value":339422},"Desc",{"type":17,"tag":7259,"props":339424,"children":339425},{},[339426,339450,339478,339501,339532],{"type":17,"tag":7239,"props":339427,"children":339428},{},[339429,339437,339445],{"type":17,"tag":7266,"props":339430,"children":339431},{},[339432],{"type":17,"tag":6121,"props":339433,"children":339435},{"className":339434},[],[339436],{"type":23,"value":143728},{"type":17,"tag":7266,"props":339438,"children":339439},{},[339440],{"type":17,"tag":33,"props":339441,"children":339442},{},[339443],{"type":23,"value":339444},"object array",{"type":17,"tag":7266,"props":339446,"children":339447},{},[339448],{"type":23,"value":339449},"An array of objects specific to the webhook's connection. (eg. CRM contacts)",{"type":17,"tag":7239,"props":339451,"children":339452},{},[339453,339461,339473],{"type":17,"tag":7266,"props":339454,"children":339455},{},[339456],{"type":17,"tag":6121,"props":339457,"children":339459},{"className":339458},[],[339460],{"type":23,"value":124562},{"type":17,"tag":7266,"props":339462,"children":339463},{},[339464],{"type":17,"tag":133,"props":339465,"children":339468},{"href":339466,"rel":339467},"https://docs.unified.to/unified/webhook/model",[214],[339469],{"type":17,"tag":33,"props":339470,"children":339471},{},[339472],{"type":23,"value":271241},{"type":17,"tag":7266,"props":339474,"children":339475},{},[339476],{"type":23,"value":339477},"The webhook object. You can use the id to manage or delete your webhook.",{"type":17,"tag":7239,"props":339479,"children":339480},{},[339481,339489,339496],{"type":17,"tag":7266,"props":339482,"children":339483},{},[339484],{"type":17,"tag":6121,"props":339485,"children":339487},{"className":339486},[],[339488],{"type":23,"value":77777},{"type":17,"tag":7266,"props":339490,"children":339491},{},[339492],{"type":17,"tag":33,"props":339493,"children":339494},{},[339495],{"type":23,"value":47976},{"type":17,"tag":7266,"props":339497,"children":339498},{},[339499],{"type":23,"value":339500},"Random string",{"type":17,"tag":7239,"props":339502,"children":339503},{},[339504,339512,339519],{"type":17,"tag":7266,"props":339505,"children":339506},{},[339507],{"type":17,"tag":6121,"props":339508,"children":339510},{"className":339509},[],[339511],{"type":23,"value":178128},{"type":17,"tag":7266,"props":339513,"children":339514},{},[339515],{"type":17,"tag":33,"props":339516,"children":339517},{},[339518],{"type":23,"value":47976},{"type":17,"tag":7266,"props":339520,"children":339521},{},[339522,339524,339530],{"type":23,"value":339523},"A security signature generated using HMAC-SHA1. It combines your workspace secret with the payload data and nonce i.e ",{"type":17,"tag":6121,"props":339525,"children":339527},{"className":339526},[],[339528],{"type":23,"value":339529},"HMAC-SHA1(workspace.secret, data + nonce)",{"type":23,"value":339531}," . Use this to verify the authenticity of incoming webhooks.",{"type":17,"tag":7239,"props":339533,"children":339534},{},[339535,339543,339551],{"type":17,"tag":7266,"props":339536,"children":339537},{},[339538],{"type":17,"tag":6121,"props":339539,"children":339541},{"className":339540},[],[339542],{"type":23,"value":27310},{"type":17,"tag":7266,"props":339544,"children":339545},{},[339546],{"type":17,"tag":33,"props":339547,"children":339548},{},[339549],{"type":23,"value":339550},"enum",{"type":17,"tag":7266,"props":339552,"children":339553},{},[339554],{"type":17,"tag":6121,"props":339555,"children":339557},{"className":339556},[],[339558],{"type":23,"value":339559},"INITIAL-PARTIAL, INITIAL-COMPLETE, VIRTUAL, NATIVE",{"type":17,"tag":29,"props":339561,"children":339562},{},[339563,339565,339570],{"type":23,"value":339564},"A note on the ",{"type":17,"tag":6121,"props":339566,"children":339568},{"className":339567},[],[339569],{"type":23,"value":27310},{"type":23,"value":339571}," enums:",{"type":17,"tag":80,"props":339573,"children":339574},{},[339575,339585,339595,339606],{"type":17,"tag":84,"props":339576,"children":339577},{},[339578,339583],{"type":17,"tag":6121,"props":339579,"children":339581},{"className":339580},[],[339582],{"type":23,"value":149971},{"type":23,"value":339584},": included with each page of results for the initial sync",{"type":17,"tag":84,"props":339586,"children":339587},{},[339588,339593],{"type":17,"tag":6121,"props":339589,"children":339591},{"className":339590},[],[339592],{"type":23,"value":149978},{"type":23,"value":339594},": included with last page (e.g. last 5 elements for the limit 100) of initial sync or with an empty list (no more results)",{"type":17,"tag":84,"props":339596,"children":339597},{},[339598,339604],{"type":17,"tag":6121,"props":339599,"children":339601},{"className":339600},[],[339602],{"type":23,"value":339603},"VIRTUAL",{"type":23,"value":339605},": included with every page when reading new data from a virtual webhook",{"type":17,"tag":84,"props":339607,"children":339608},{},[339609,339615],{"type":17,"tag":6121,"props":339610,"children":339612},{"className":339611},[],[339613],{"type":23,"value":339614},"NATIVE",{"type":23,"value":339616},": included with every page when reading new data from a native webhook",{"type":17,"tag":239,"props":339618,"children":339620},{"id":339619},"method-2-use-the-unifiedto-app",[339621],{"type":23,"value":339622},"Method 2: Use the Unified.to app",{"type":17,"tag":29,"props":339624,"children":339625},{},[339626,339628,339633],{"type":23,"value":339627},"If you prefer to create webhooks through the UI, you can do so at ",{"type":17,"tag":133,"props":339629,"children":339631},{"href":158861,"rel":339630},[214],[339632],{"type":23,"value":106701},{"type":23,"value":54},{"type":17,"tag":6154,"props":339635,"children":339636},{},[339637,339656,339666,339671,339676],{"type":17,"tag":84,"props":339638,"children":339639},{},[339640,339641,339645,339646,339655],{"type":23,"value":42939},{"type":17,"tag":48,"props":339642,"children":339643},{},[339644],{"type":23,"value":42944},{"type":23,"value":317743},{"type":17,"tag":133,"props":339647,"children":339650},{"href":339648,"rel":339649},"https://app.unified.to/webhooks",[214],[339651],{"type":17,"tag":48,"props":339652,"children":339653},{},[339654],{"type":23,"value":43896},{"type":23,"value":54},{"type":17,"tag":84,"props":339657,"children":339658},{},[339659,339660,339665],{"type":23,"value":6629},{"type":17,"tag":48,"props":339661,"children":339662},{},[339663],{"type":23,"value":339664},"New Webhook",{"type":23,"value":54},{"type":17,"tag":84,"props":339667,"children":339668},{},[339669],{"type":23,"value":339670},"Click on the input and a list of your connections will appear. Select the connection from which you want to create a webhook.",{"type":17,"tag":84,"props":339672,"children":339673},{},[339674],{"type":23,"value":339675},"Choose how to configure your webhook (see below).",{"type":17,"tag":84,"props":339677,"children":339678},{},[339679,339680,339684],{"type":23,"value":6629},{"type":17,"tag":48,"props":339681,"children":339682},{},[339683],{"type":23,"value":169347},{"type":23,"value":54},{"type":17,"tag":29,"props":339686,"children":339687},{},[339688],{"type":23,"value":339689},"Information about the other fields can be found under their respective tooltips in the UI.",{"type":17,"tag":239,"props":339691,"children":339693},{"id":339692},"webhook-configuration-options",[339694],{"type":23,"value":339695},"Webhook configuration options",{"type":17,"tag":29,"props":339697,"children":339698},{},[339699],{"type":23,"value":339700},"Whether you use the API or our web UI, these are the configuration options you can specify when creating a webhook:",{"type":17,"tag":6154,"props":339702,"children":339703},{},[339704,339714,339735,339758,339775,339793],{"type":17,"tag":84,"props":339705,"children":339706},{},[339707,339712],{"type":17,"tag":48,"props":339708,"children":339709},{},[339710],{"type":23,"value":339711},"Object:",{"type":23,"value":339713}," The data you are interested in e.g. Deal, Company, Application, etc.",{"type":17,"tag":84,"props":339715,"children":339716},{},[339717,339722,339724,339728,339730,339734],{"type":17,"tag":48,"props":339718,"children":339719},{},[339720],{"type":23,"value":339721},"Event:",{"type":23,"value":339723}," The events you want to subscribe to. Note: The ",{"type":17,"tag":33,"props":339725,"children":339726},{},[339727],{"type":23,"value":109214},{"type":23,"value":339729}," event will also be sent when the data object is first ",{"type":17,"tag":33,"props":339731,"children":339732},{},[339733],{"type":23,"value":109207},{"type":23,"value":54},{"type":17,"tag":84,"props":339736,"children":339737},{},[339738,339742,339744,339748,339750,339757],{"type":17,"tag":48,"props":339739,"children":339740},{},[339741],{"type":23,"value":334804},{"type":23,"value":339743}," For integrations that support both native and ",{"type":17,"tag":133,"props":339745,"children":339746},{"href":9007},[339747],{"type":23,"value":46572},{"type":23,"value":339749},", select the type of webhook you want. Virtual webhooks are our way of supporting webhooks for API providers that don't offer them. For more details, see: ",{"type":17,"tag":133,"props":339751,"children":339754},{"href":339752,"rel":339753},"https://docs.unified.to/guides/understanding_virtual_webhooks#understanding-native-and-virtual-webhooks",[214],[339755],{"type":23,"value":339756},"Understanding virtual webhooks",{"type":23,"value":54},{"type":17,"tag":84,"props":339759,"children":339760},{},[339761,339766,339768],{"type":17,"tag":48,"props":339762,"children":339763},{},[339764],{"type":23,"value":339765},"Filter (optional):",{"type":23,"value":339767}," Specify any properties you want to filter incoming events by. See: ",{"type":17,"tag":133,"props":339769,"children":339772},{"href":339770,"rel":339771},"https://docs.unified.to/guides/how_to_create_and_configure_webhooks#use-filters-to-refine-webhook-events",[214],[339773],{"type":23,"value":339774},"Use filters to refine webhook events",{"type":17,"tag":84,"props":339776,"children":339777},{},[339778,339783,339785,339792],{"type":17,"tag":48,"props":339779,"children":339780},{},[339781],{"type":23,"value":339782},"Fields (optional):",{"type":23,"value":339784},"  Comma-separated list of fields to include in the webhook payload. Leave blank to include all fields. The 'raw' field is NOT included by default. If you want to include all fields as well raw, just enter 'raw'. To read more about raw fields, see: ",{"type":17,"tag":133,"props":339786,"children":339789},{"href":339787,"rel":339788},"https://docs.unified.to/reference/fields",[214],[339790],{"type":23,"value":339791},"Raw and custom fields",{"type":23,"value":54},{"type":17,"tag":84,"props":339794,"children":339795},{},[339796,339801],{"type":17,"tag":48,"props":339797,"children":339798},{},[339799],{"type":23,"value":339800},"Interval (virtual webhooks only):",{"type":23,"value":339802}," Specify how often you want Unified.to to poll the API provider for new data.",{"type":17,"tag":68,"props":339804,"children":339806},{"id":339805},"list-your-webhooks",[339807],{"type":23,"value":339808},"List your webhooks",{"type":17,"tag":29,"props":339810,"children":339811},{},[339812,339814,339819,339821,339826,339828,339836],{"type":23,"value":339813},"To view your webhooks, make a GET request to ",{"type":17,"tag":6121,"props":339815,"children":339817},{"className":339816},[],[339818],{"type":23,"value":339350},{"type":23,"value":339820}," or visit ",{"type":17,"tag":133,"props":339822,"children":339824},{"href":158861,"rel":339823},[214],[339825],{"type":23,"value":106701},{"type":23,"value":339827}," and navigate to Integrations > ",{"type":17,"tag":133,"props":339829,"children":339831},{"href":339648,"rel":339830},[214],[339832],{"type":17,"tag":48,"props":339833,"children":339834},{},[339835],{"type":23,"value":43896},{"type":23,"value":54},{"type":17,"tag":29,"props":339838,"children":339839},{},[339840,339844,339845],{"type":17,"tag":48,"props":339841,"children":339842},{},[339843],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":339846,"children":339849},{"href":339847,"rel":339848},"https://docs.unified.to/unified/webhook/Returns_all_registered_webhooks",[214],[339850],{"type":23,"value":339851},"Get all webhooks",{"type":17,"tag":68,"props":339853,"children":339855},{"id":339854},"get-all-initial-data-for-a-connection",[339856],{"type":23,"value":339857},"Get all initial data for a connection",{"type":17,"tag":29,"props":339859,"children":339860},{},[339861],{"type":23,"value":339862},"When you create a webhook, you can choose to fetch all existing data immediately.",{"type":17,"tag":6154,"props":339864,"children":339865},{},[339866,339878],{"type":17,"tag":84,"props":339867,"children":339868},{},[339869,339871,339876],{"type":23,"value":339870},"If you are using the API, add the ",{"type":17,"tag":6121,"props":339872,"children":339874},{"className":339873},[],[339875],{"type":23,"value":339385},{"type":23,"value":339877}," query parameter when creating the webhook.",{"type":17,"tag":84,"props":339879,"children":339880},{},[339881,339883,339888],{"type":23,"value":339882},"If you are using the UI, check off ",{"type":17,"tag":48,"props":339884,"children":339885},{},[339886],{"type":23,"value":339887},"Initially sync all data",{"type":23,"value":339889}," in the configuration options.",{"type":17,"tag":29,"props":339891,"children":339892},{},[339893,339895,339901],{"type":23,"value":339894},"Once the initial sync is complete, you will receive a final payload with ",{"type":17,"tag":6121,"props":339896,"children":339898},{"className":339897},[],[339899],{"type":23,"value":339900},"type: INITIAL-COMPLETE",{"type":23,"value":339902}," and the requested webhook will continue to work as normal.",{"type":17,"tag":29,"props":339904,"children":339905},{},[339906,339910,339911],{"type":17,"tag":48,"props":339907,"children":339908},{},[339909],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":339912,"children":339914},{"href":330059,"rel":339913},[214],[339915],{"type":23,"value":339916},"Create a webhook subscription",{"type":17,"tag":68,"props":339918,"children":339920},{"id":339919},"a-note-on-retrieving-webhook-data",[339921],{"type":23,"value":339922},"A note on retrieving webhook data",{"type":17,"tag":29,"props":339924,"children":339925},{},[339926,339928,339933],{"type":23,"value":339927},"Our system will POST initial data to your webhook in chunk sizes up to the limit supported by the integration. The limit can be found on the integration details page under ",{"type":17,"tag":48,"props":339929,"children":339930},{},[339931],{"type":23,"value":339932},"Feature support",{"type":23,"value":54},{"type":17,"tag":29,"props":339935,"children":339936},{},[339937,339939,339944],{"type":23,"value":339938},"When performing the initial retrieval, depending on the amount of data being sent, the integration's API's rate-limiting rules, and your server's performance, it could take a very long time. If you do not want to get all of the existing data (for example, you already have it or don't need it), then do not include the ",{"type":17,"tag":6121,"props":339940,"children":339942},{"className":339941},[],[339943],{"type":23,"value":339385},{"type":23,"value":339945}," parameter in the request.",{"type":17,"tag":29,"props":339947,"children":339948},{},[339949],{"type":23,"value":339950},"After the initial retrieval is completed, whenever updated data is available, your webhook will be called with a list of data objects, up to the max limit.  If there are more entries than the limit, then your webhook URL will be POSTed to multiple times.",{"type":17,"tag":29,"props":339952,"children":339953},{},[339954,339956,339963],{"type":23,"value":339955},"For details about the webhook payload that is sent to your server, ",{"type":17,"tag":133,"props":339957,"children":339960},{"href":339958,"rel":339959},"https://docs.unified.to/concepts/webhooks#webhook-payload",[214],[339961],{"type":23,"value":339962},"click here",{"type":23,"value":54},{"type":17,"tag":68,"props":339965,"children":339967},{"id":339966},"specify-which-fields-to-receive-from-a-webhook",[339968],{"type":23,"value":339969},"Specify which fields to receive from a webhook",{"type":17,"tag":29,"props":339971,"children":339972},{},[339973,339975,339980,339982,339987],{"type":23,"value":339974},"If you only want a subset of fields when receiving updated data, you can define them with the ",{"type":17,"tag":6121,"props":339976,"children":339978},{"className":339977},[],[339979],{"type":23,"value":39759},{"type":23,"value":339981}," parameter in both the API and the UI. This is useful if you don't want the entire payload being sent to your servers. For more details, see: ",{"type":17,"tag":133,"props":339983,"children":339985},{"href":339787,"rel":339984},[214],[339986],{"type":23,"value":226977},{"type":23,"value":54},{"type":17,"tag":29,"props":339989,"children":339990},{},[339991,339995,339996],{"type":17,"tag":48,"props":339992,"children":339993},{},[339994],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":339997,"children":339999},{"href":330059,"rel":339998},[214],[340000],{"type":23,"value":339916},{"type":17,"tag":68,"props":340002,"children":340004},{"id":340003},"use-filters-to-refine-webhook-events",[340005],{"type":23,"value":339774},{"type":17,"tag":29,"props":340007,"children":340008},{},[340009,340014,340015],{"type":17,"tag":33,"props":340010,"children":340011},{},[340012],{"type":23,"value":340013},"Note: This feature is only available for virtual webhooks. For more information about virtual webhooks, see:",{"type":23,"value":18757},{"type":17,"tag":133,"props":340016,"children":340019},{"href":340017,"rel":340018},"https://docs.unified.to/guides/understanding_native_and_virtual_webhooks#understanding-native-and-virtual-webhooks",[214],[340020],{"type":17,"tag":33,"props":340021,"children":340022},{},[340023],{"type":23,"value":339756},{"type":17,"tag":29,"props":340025,"children":340026},{},[340027,340029,340034],{"type":23,"value":340028},"Some virtual webhooks support filters, allowing you to filter the events you receive. For instance, if you're subscribed to Deal events from a CRM, you could filter by ",{"type":17,"tag":6121,"props":340030,"children":340032},{"className":340031},[],[340033],{"type":23,"value":27299},{"type":23,"value":340035}," to only receive events from that specific company.",{"type":17,"tag":29,"props":340037,"children":340038},{},[340039,340041,340045,340047,340051,340053,340058,340059,340064],{"type":23,"value":340040},"Filter availability varies by integration type and data model. To check which filters are supported for a particular webhook, refer to the ",{"type":17,"tag":48,"props":340042,"children":340043},{},[340044],{"type":23,"value":145784},{"type":23,"value":340046}," section under the ",{"type":17,"tag":48,"props":340048,"children":340049},{},[340050],{"type":23,"value":211607},{"type":23,"value":340052}," tab of the respective integration. Parameters that end in ",{"type":17,"tag":6121,"props":340054,"children":340056},{"className":340055},[],[340057],{"type":23,"value":201682},{"type":23,"value":75890},{"type":17,"tag":6121,"props":340060,"children":340062},{"className":340061},[],[340063],{"type":23,"value":27310},{"type":23,"value":340065}," can be used as filter options when creating a webhook, helping you tailor your subscriptions to your specific needs.",{"type":17,"tag":68,"props":340067,"children":340069},{"id":340068},"trigger-webhooks-manually",[340070],{"type":23,"value":340071},"Trigger webhooks manually",{"type":17,"tag":29,"props":340073,"children":340074},{},[340075],{"type":23,"value":340076},"If you don't want to wait for an event to come in while testing webhooks on a Tester plan, you can trigger a webhook call right away.",{"type":17,"tag":6154,"props":340078,"children":340079},{},[340080,340091],{"type":17,"tag":84,"props":340081,"children":340082},{},[340083,340085,340090],{"type":23,"value":340084},"In the web app, navigate to ",{"type":17,"tag":133,"props":340086,"children":340088},{"href":339648,"rel":340087},[214],[340089],{"type":23,"value":43896},{"type":23,"value":54},{"type":17,"tag":84,"props":340092,"children":340093},{},[340094,340095,340099,340101,340104],{"type":23,"value":217756},{"type":17,"tag":48,"props":340096,"children":340097},{},[340098],{"type":23,"value":249234},{"type":23,"value":340100}," icon next to your webhook:",{"type":17,"tag":3891,"props":340102,"children":340103},{},[],{"type":17,"tag":6438,"props":340105,"children":340107},{"alt":318119,"src":340106},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_create_and_configure_webhooks-0.png",[],{"type":17,"tag":29,"props":340109,"children":340110},{},[340111],{"type":23,"value":340112},"This can also be accomplished with the API.",{"type":17,"tag":29,"props":340114,"children":340115},{},[340116,340120,340121],{"type":17,"tag":48,"props":340117,"children":340118},{},[340119],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":340122,"children":340125},{"href":340123,"rel":340124},"https://docs.unified.to/unified/webhook/Trigger_webhook",[214],[340126],{"type":23,"value":340127},"Trigger a webhook",{"type":17,"tag":29,"props":340129,"children":340130},{},[340131],{"type":23,"value":340132},"Note**:** When you trigger a webhook, we will schedule the next dispatch event to go out right away - this is treated like a regular webhook event. Therefore, if your webhook is listening for update events and no new updates have occurred since the last run, then no new events will be sent to your server.",{"type":17,"tag":68,"props":340134,"children":340136},{"id":340135},"frequently-asked-questions",[340137],{"type":23,"value":340138},"Frequently asked questions",{"type":17,"tag":29,"props":340140,"children":340141},{},[340142],{"type":17,"tag":48,"props":340143,"children":340144},{},[340145],{"type":23,"value":340146},"Is there a page_max_limit for webhooks?",{"type":17,"tag":29,"props":340148,"children":340149},{},[340150,340152,340158,340160,340164],{"type":23,"value":340151},"An integration's ",{"type":17,"tag":6121,"props":340153,"children":340155},{"className":340154},[],[340156],{"type":23,"value":340157},"page_max_limit",{"type":23,"value":340159}," typically comes directly from the API provider. You can see that limit under the ",{"type":17,"tag":48,"props":340161,"children":340162},{},[340163],{"type":23,"value":211607},{"type":23,"value":340165}," tab on the integration details page**.** You don't have to set limits for webhooks; they will use the integration's max limit.",{"type":17,"tag":29,"props":340167,"children":340168},{},[340169],{"type":17,"tag":48,"props":340170,"children":340171},{},[340172],{"type":23,"value":340173},"Does changing the interval for virtual webhooks affect the initial retrieval?",{"type":17,"tag":29,"props":340175,"children":340176},{},[340177],{"type":23,"value":340178},"Increasing frequency of virtual webhooks has no effect on the initial retrieval of historical data. Each page read is scheduled to be read one after another as soon as possible.",{"type":17,"tag":29,"props":340180,"children":340181},{},[340182],{"type":17,"tag":48,"props":340183,"children":340184},{},[340185],{"type":23,"value":340186},"How do I distinguish between an updated event and a created event?",{"type":17,"tag":29,"props":340188,"children":340189},{},[340190,340192,340197,340198,340203],{"type":23,"value":340191},"When a new data object is created, it triggers both created and updated events. If you want to track both of these events but also tell them apart, we recommend subscribing to the updated event and then compare ",{"type":17,"tag":6121,"props":340193,"children":340195},{"className":340194},[],[340196],{"type":23,"value":33446},{"type":23,"value":34435},{"type":17,"tag":6121,"props":340199,"children":340201},{"className":340200},[],[340202],{"type":23,"value":25337},{"type":23,"value":340204}," for incoming data. If they are the same, that means the data object was newly created.",{"type":17,"tag":29,"props":340206,"children":340207},{},[340208],{"type":17,"tag":48,"props":340209,"children":340210},{},[340211],{"type":23,"value":340212},"What happens if the webhook dispatch fails? Is there a retry mechanism in place?",{"type":17,"tag":29,"props":340214,"children":340215},{},[340216,340218,340224],{"type":23,"value":340217},"Our retry mechanism will retry 3 times immediately before using a Fibonacci backoff strategy. Read more about it ",{"type":17,"tag":133,"props":340219,"children":340222},{"href":340220,"rel":340221},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_webhooks#a-note-on-our-webhook-retry-mechanism",[214],[340223],{"type":23,"value":243989},{"type":23,"value":54},{"type":17,"tag":29,"props":340226,"children":340227},{},[340228],{"type":17,"tag":48,"props":340229,"children":340230},{},[340231],{"type":23,"value":340232},"Why do I receive duplicate webhook events and how should I handle them?",{"type":17,"tag":29,"props":340234,"children":340235},{},[340236],{"type":23,"value":340237},"Duplicate webhook events can occur for several reasons:",{"type":17,"tag":80,"props":340239,"children":340240},{},[340241,340246],{"type":17,"tag":84,"props":340242,"children":340243},{},[340244],{"type":23,"value":340245},"Some integrations (like HubSpot) trigger separate events for each property change on an object",{"type":17,"tag":84,"props":340247,"children":340248},{},[340249],{"type":23,"value":340250},"Rapid changes to objects can trigger multiple events that may arrive out of order due to network conditions",{"type":17,"tag":29,"props":340252,"children":340253},{},[340254],{"type":23,"value":340255},"To handle duplicates effectively:",{"type":17,"tag":6154,"props":340257,"children":340258},{},[340259,340264],{"type":17,"tag":84,"props":340260,"children":340261},{},[340262],{"type":23,"value":340263},"Always use the object's latest state when updating your database",{"type":17,"tag":84,"props":340265,"children":340266},{},[340267],{"type":23,"value":340268},"Implement atomic writes to avoid race conditions. Only update records if the incoming data is newer:",{"type":17,"tag":6893,"props":340270,"children":340273},{"className":340271,"code":340272,"language":6898,"meta":7},[6896],"-- Pseudo-code example\nIF incoming_object.updated_at >= stored_object.updated_at THEN\n    UPDATE record\nELSE\n    -- Skip update as we already have newer data\nEND IF\n",[340274],{"type":17,"tag":6121,"props":340275,"children":340276},{"__ignoreMap":7},[340277],{"type":23,"value":340272},{"type":17,"tag":68,"props":340279,"children":340280},{"id":332205},[340281],{"type":23,"value":332208},{"type":17,"tag":80,"props":340283,"children":340284},{},[340285,340293],{"type":17,"tag":84,"props":340286,"children":340287},{},[340288],{"type":17,"tag":133,"props":340289,"children":340291},{"href":333328,"rel":340290},[214],[340292],{"type":23,"value":333332},{"type":17,"tag":84,"props":340294,"children":340295},{},[340296],{"type":17,"tag":133,"props":340297,"children":340299},{"href":339752,"rel":340298},[214],[340300],{"type":23,"value":339756},{"title":7,"searchDepth":1629,"depth":1629,"links":340302},[340303,340304,340309,340310,340311,340312,340313,340314,340315,340316],{"id":177146,"depth":1629,"text":177149},{"id":339321,"depth":1629,"text":330063,"children":340305},[340306,340307,340308],{"id":339336,"depth":1635,"text":339339},{"id":339619,"depth":1635,"text":339622},{"id":339692,"depth":1635,"text":339695},{"id":339805,"depth":1629,"text":339808},{"id":339854,"depth":1629,"text":339857},{"id":339919,"depth":1629,"text":339922},{"id":339966,"depth":1629,"text":339969},{"id":340003,"depth":1629,"text":339774},{"id":340068,"depth":1629,"text":340071},{"id":340135,"depth":1629,"text":340138},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_create_and_configure_webhooks.md","blog/how_to_create_and_configure_webhooks.md","blog/how_to_create_and_configure_webhooks",{"_path":340321,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":333332,"description":340322,"img":340323,"date":339263,"tag":6341,"body":340324,"_type":1677,"_id":340894,"_source":1679,"_file":340895,"_stem":340896,"_extension":1682},"/blog/how_to_troubleshoot_unhealthy_webhooks","Webhooks are a powerful tool for getting real-time notifications about changes to the data you care about. When something goes wrong, however, we will mark...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_troubleshoot_unhealthy_webhooks-icon.png",{"type":14,"children":340325,"toc":340873},[340326,340331,340334,340341,340350,340354,340358,340384,340390,340395,340401,340435,340439,340496,340506,340526,340532,340538,340558,340564,340569,340574,340586,340592,340604,340676,340682,340687,340693,340698,340703,340709,340714,340719,340725,340730,340734,340740,340745,340757,340762,340768,340773,340779,340784,340792,340823,340831,340842,340846],{"type":17,"tag":18,"props":340327,"children":340329},{"id":340328},"how-to-troubleshoot-unhealthy-webhooks",[340330],{"type":23,"value":333332},{"type":17,"tag":25,"props":340332,"children":340333},{},[],{"type":17,"tag":29,"props":340335,"children":340336},{},[340337],{"type":17,"tag":33,"props":340338,"children":340339},{},[340340],{"type":23,"value":339281},{"type":17,"tag":29,"props":340342,"children":340343},{},[340344,340348],{"type":17,"tag":133,"props":340345,"children":340346},{"href":4999},[340347],{"type":23,"value":43896},{"type":23,"value":340349}," are a powerful tool for getting real-time notifications about changes to the data you care about. When something goes wrong, however, we will mark those webhooks as unhealthy. This guide explains how to diagnose and troubleshoot unhealthy webhooks at Unified.to.",{"type":17,"tag":68,"props":340351,"children":340352},{"id":177146},[340353],{"type":23,"value":177149},{"type":17,"tag":29,"props":340355,"children":340356},{},[340357],{"type":23,"value":338225},{"type":17,"tag":80,"props":340359,"children":340360},{},[340361,340376],{"type":17,"tag":84,"props":340362,"children":340363},{},[340364,340369,340370],{"type":17,"tag":133,"props":340365,"children":340367},{"href":333054,"rel":340366},[214],[340368],{"type":23,"value":43896},{"type":23,"value":34435},{"type":17,"tag":133,"props":340371,"children":340374},{"href":340372,"rel":340373},"https://docs.unified.to/guides/understanding_virtual_webhooks#understanding-virtual-webhooks",[214],[340375],{"type":23,"value":46572},{"type":17,"tag":84,"props":340377,"children":340378},{},[340379],{"type":17,"tag":133,"props":340380,"children":340382},{"href":337112,"rel":340381},[214],[340383],{"type":23,"value":42815},{"type":17,"tag":68,"props":340385,"children":340387},{"id":340386},"diagnose-the-webhook",[340388],{"type":23,"value":340389},"Diagnose the webhook",{"type":17,"tag":29,"props":340391,"children":340392},{},[340393],{"type":23,"value":340394},"The first place to look for debugging information is in the API call logs.",{"type":17,"tag":239,"props":340396,"children":340398},{"id":340397},"_1-check-the-webhook-status",[340399],{"type":23,"value":340400},"1. Check the webhook status",{"type":17,"tag":6154,"props":340402,"children":340403},{},[340404,340415,340425],{"type":17,"tag":84,"props":340405,"children":340406},{},[340407,340408,340414],{"type":23,"value":264757},{"type":17,"tag":133,"props":340409,"children":340411},{"href":158861,"rel":340410},[214],[340412],{"type":23,"value":340413},"Unified.to account",{"type":23,"value":54},{"type":17,"tag":84,"props":340416,"children":340417},{},[340418,340419,340424],{"type":23,"value":42939},{"type":17,"tag":133,"props":340420,"children":340422},{"href":329634,"rel":340421},[214],[340423],{"type":23,"value":43896},{"type":23,"value":54},{"type":17,"tag":84,"props":340426,"children":340427},{},[340428,340430,340434],{"type":23,"value":340429},"Make note of the unhealthy webhook and its ",{"type":17,"tag":48,"props":340431,"children":340432},{},[340433],{"type":23,"value":195321},{"type":23,"value":54},{"type":17,"tag":239,"props":340436,"children":340437},{"id":338517},[340438],{"type":23,"value":338520},{"type":17,"tag":6154,"props":340440,"children":340441},{},[340442,340455,340460,340471],{"type":17,"tag":84,"props":340443,"children":340444},{},[340445,340446,340454],{"type":23,"value":6661},{"type":17,"tag":133,"props":340447,"children":340449},{"href":338419,"rel":340448},[214],[340450],{"type":17,"tag":48,"props":340451,"children":340452},{},[340453],{"type":23,"value":338426},{"type":23,"value":54},{"type":17,"tag":84,"props":340456,"children":340457},{},[340458],{"type":23,"value":340459},"Filter by the connection ID of the webhook in question. You should see a list of API calls attempted by the webhook (note: we only store logs from the past 60 days).",{"type":17,"tag":84,"props":340461,"children":340462},{},[340463,340465,340469],{"type":23,"value":340464},"Click on the latest log entry that threw an error - the ",{"type":17,"tag":48,"props":340466,"children":340467},{},[340468],{"type":23,"value":19949},{"type":23,"value":340470}," column will display an error code.",{"type":17,"tag":84,"props":340472,"children":340473},{},[340474,340476,340480,340482,340486,340488,340491],{"type":23,"value":340475},"Details about the API call will be shown. The ",{"type":17,"tag":48,"props":340477,"children":340478},{},[340479],{"type":23,"value":24525},{"type":23,"value":340481}," field will detail the reason the webhook failed and the ",{"type":17,"tag":48,"props":340483,"children":340484},{},[340485],{"type":23,"value":20328},{"type":23,"value":340487}," field will show the specific error code itself. For example:",{"type":17,"tag":3891,"props":340489,"children":340490},{},[],{"type":17,"tag":6438,"props":340492,"children":340495},{"alt":340493,"src":340494},"Screenshot_2024-09-05_at_1.33.44_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_troubleshoot_unhealthy_webhooks-0.png",[],{"type":17,"tag":29,"props":340497,"children":340498},{},[340499,340500,340504],{"type":23,"value":338556},{"type":17,"tag":133,"props":340501,"children":340502},{"href":7691},[340503],{"type":23,"value":7806},{"type":23,"value":340505}," to retrieve a list of your webhooks and API call logs.",{"type":17,"tag":29,"props":340507,"children":340508},{},[340509,340513,340514,340520,340521],{"type":17,"tag":48,"props":340510,"children":340511},{},[340512],{"type":23,"value":329921},{"type":23,"value":18757},{"type":17,"tag":133,"props":340515,"children":340517},{"href":339847,"rel":340516},[214],[340518],{"type":23,"value":340519},"List all webhooks",{"type":23,"value":11826},{"type":17,"tag":133,"props":340522,"children":340524},{"href":338588,"rel":340523},[214],[340525],{"type":23,"value":338592},{"type":17,"tag":68,"props":340527,"children":340529},{"id":340528},"troubleshooting-webhook-error-codes",[340530],{"type":23,"value":340531},"Troubleshooting webhook error codes",{"type":17,"tag":239,"props":340533,"children":340535},{"id":340534},"bad-request-400-errors",[340536],{"type":23,"value":340537},"Bad request (400) errors",{"type":17,"tag":29,"props":340539,"children":340540},{},[340541,340543,340549,340551,340556],{"type":23,"value":340542},"These errors indicate that something is wrong with the request - in this case, it is likely not a scope or authentication issue but a problem with the integration itself. Please ",{"type":17,"tag":133,"props":340544,"children":340546},{"href":215330,"rel":340545},[214],[340547],{"type":23,"value":340548},"reach out to us",{"type":23,"value":340550}," or let us know in our ",{"type":17,"tag":133,"props":340552,"children":340554},{"href":339212,"rel":340553},[214],[340555],{"type":23,"value":15720},{"type":23,"value":340557}," server. Thank you!",{"type":17,"tag":239,"props":340559,"children":340561},{"id":340560},"authentication-401-and-permission-403-errors",[340562],{"type":23,"value":340563},"Authentication (401) and permission (403) errors",{"type":17,"tag":29,"props":340565,"children":340566},{},[340567],{"type":23,"value":340568},"A 401 error may indicate that the connection's auth credentials were entered incorrectly, whether it be the API token, a secret, or another value depending on the integration.",{"type":17,"tag":29,"props":340570,"children":340571},{},[340572],{"type":23,"value":340573},"A 403 error is often indicative of scope mismatches with the API provider, with Unified.to, or both.",{"type":17,"tag":29,"props":340575,"children":340576},{},[340577,340579],{"type":23,"value":340578},"Both of these errors are indicative of an issue with the connection itself, rather than the webhook. Please see: ",{"type":17,"tag":133,"props":340580,"children":340583},{"href":340581,"rel":340582},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_connections#troubleshooting-the-error-codes",[214],[340584],{"type":23,"value":340585},"How to troubleshoot unhealthy connections ",{"type":17,"tag":68,"props":340587,"children":340589},{"id":340588},"subscribe-to-the-notifications-webhook-to-be-alerted-when-your-webhooks-fail",[340590],{"type":23,"value":340591},"Subscribe to the notifications webhook to be alerted when your webhooks fail",{"type":17,"tag":29,"props":340593,"children":340594},{},[340595,340597,340602],{"type":23,"value":340596},"To learn about any webhook errors as soon as they occur, we recommend that you subscribe to our ",{"type":17,"tag":48,"props":340598,"children":340599},{},[340600],{"type":23,"value":340601},"Notifications webhook",{"type":23,"value":340603}," to get real-time updates about your webhooks' statuses.",{"type":17,"tag":6154,"props":340605,"children":340606},{},[340607,340628,340655,340671],{"type":17,"tag":84,"props":340608,"children":340609},{},[340610,340611,340615,340616,340624],{"type":23,"value":42939},{"type":17,"tag":48,"props":340612,"children":340613},{},[340614],{"type":23,"value":158746},{"type":23,"value":317743},{"type":17,"tag":133,"props":340617,"children":340619},{"href":339114,"rel":340618},[214],[340620],{"type":17,"tag":48,"props":340621,"children":340622},{},[340623],{"type":23,"value":339121},{"type":17,"tag":48,"props":340625,"children":340626},{},[340627],{"type":23,"value":54},{"type":17,"tag":84,"props":340629,"children":340630},{},[340631,340632,340636,340638],{"type":23,"value":146715},{"type":17,"tag":48,"props":340633,"children":340634},{},[340635],{"type":23,"value":339131},{"type":23,"value":340637},", enter the URL of the endpoint where you would like to receive notifications.",{"type":17,"tag":6154,"props":340639,"children":340640},{},[340641],{"type":17,"tag":84,"props":340642,"children":340643},{},[340644,340646],{"type":23,"value":340645},"The payload that will be sent to this endpoint contains:",{"type":17,"tag":6893,"props":340647,"children":340650},{"className":340648,"code":340649,"language":6898,"meta":7},[6896],"id: string // the id of the object or the integration's type\nnonce: string // random string\nsig: string // base64( hmac-sha1( id + nonce + event, workspace.secret ) )\nsig256: string // base64( hmac-sha256( id + nonce + event, workspace.secret ) )\nevent: enum //the event that was triggered\n",[340651],{"type":17,"tag":6121,"props":340652,"children":340653},{"__ignoreMap":7},[340654],{"type":23,"value":340649},{"type":17,"tag":84,"props":340656,"children":340657},{},[340658,340659,340663,340665],{"type":23,"value":146715},{"type":17,"tag":48,"props":340660,"children":340661},{},[340662],{"type":23,"value":339142},{"type":23,"value":340664},", select the events you want to be alerted to e.g. ",{"type":17,"tag":6121,"props":340666,"children":340668},{"className":340667},[],[340669],{"type":23,"value":340670},"WEBHOOK_UNHEALTHY",{"type":17,"tag":84,"props":340672,"children":340673},{},[340674],{"type":23,"value":340675},"On your server, handle incoming notifications as you see fit e.g. set up logging, send a message to the engineering team, post on Slack or Discord, etc.",{"type":17,"tag":68,"props":340677,"children":340679},{"id":340678},"understanding-why-webhooks-fail",[340680],{"type":23,"value":340681},"Understanding why webhooks fail",{"type":17,"tag":29,"props":340683,"children":340684},{},[340685],{"type":23,"value":340686},"This section will go over why webhooks fail to provide a deeper understanding of how our webhooks work.",{"type":17,"tag":239,"props":340688,"children":340690},{"id":340689},"failed-to-subscribe",[340691],{"type":23,"value":340692},"Failed to subscribe",{"type":17,"tag":29,"props":340694,"children":340695},{},[340696],{"type":23,"value":340697},"Failing to subscribe happens during webhook creation and can be due to multiple reasons: the integration isn't available, insufficient permissions (i.e. scopes mismatch), or bugs.",{"type":17,"tag":29,"props":340699,"children":340700},{},[340701],{"type":23,"value":340702},"Note: This only applies to native webhooks.",{"type":17,"tag":239,"props":340704,"children":340706},{"id":340705},"failed-to-refresh-token",[340707],{"type":23,"value":340708},"Failed to refresh token",{"type":17,"tag":29,"props":340710,"children":340711},{},[340712],{"type":23,"value":340713},"Failing to refresh the auth token happens when we attempt to communicate with the API provider unsuccessfully. This happens when the API provider only sends us partial data about new events (e.g. the IDs of the data) and we need to use a connection to retrieve the rest of the data. In this case, it is likely an error with the connection itself.",{"type":17,"tag":29,"props":340715,"children":340716},{},[340717],{"type":23,"value":340718},"Double-check that the auth credentials for the connection are correct, that the scopes are set correctly (i.e. they haven't been revoked), and then recreate both the connection and its associated webhook.",{"type":17,"tag":239,"props":340720,"children":340722},{"id":340721},"failed-to-read",[340723],{"type":23,"value":340724},"Failed to read",{"type":17,"tag":29,"props":340726,"children":340727},{},[340728],{"type":23,"value":340729},"Failing to read happens when we attempt to retrieve new data from the API provider and are prevented from doing so, whether due to configuration errors (i.e. 401 or 403 errors) or problems with the integration itself.",{"type":17,"tag":29,"props":340731,"children":340732},{},[340733],{"type":23,"value":340718},{"type":17,"tag":239,"props":340735,"children":340737},{"id":340736},"failed-to-dispatch-data",[340738],{"type":23,"value":340739},"Failed to dispatch data",{"type":17,"tag":29,"props":340741,"children":340742},{},[340743],{"type":23,"value":340744},"Failing to dispatch data happens when we attempt to send webhook data to your server but the server does not respond or responds with an error.",{"type":17,"tag":29,"props":340746,"children":340747},{},[340748,340750,340755],{"type":23,"value":340749},"Make sure your webhook URL is configured correctly when creating the webhook. Respond with a ",{"type":17,"tag":6121,"props":340751,"children":340753},{"className":340752},[],[340754],{"type":23,"value":203026},{"type":23,"value":340756}," status when your endpoint successfully receives and processes the data. Otherwise, we will keep trying to POST to your server before marking the webhook as unhealthy (after approximately 2 weeks).",{"type":17,"tag":29,"props":340758,"children":340759},{},[340760],{"type":23,"value":340761},"After checking the above, recreate the webhook and try again.",{"type":17,"tag":239,"props":340763,"children":340765},{"id":340764},"failed-to-process-data",[340766],{"type":23,"value":340767},"Failed to process data",{"type":17,"tag":29,"props":340769,"children":340770},{},[340771],{"type":23,"value":340772},"Failing to process data indicates a problem with either the reading or dispatching steps. Refer to the troubleshooting steps above and then recreate the webhook and try again.",{"type":17,"tag":239,"props":340774,"children":340776},{"id":340775},"a-note-on-our-webhook-retry-mechanism",[340777],{"type":23,"value":340778},"A note on our webhook retry mechanism",{"type":17,"tag":29,"props":340780,"children":340781},{},[340782],{"type":23,"value":340783},"At Unified.to, we've implemented a robust retry mechanism to ensure reliable webhook delivery. Here's how it works.",{"type":17,"tag":29,"props":340785,"children":340786},{},[340787],{"type":17,"tag":48,"props":340788,"children":340789},{},[340790],{"type":23,"value":340791},"When your webhook endpoint is unavailable",{"type":17,"tag":6154,"props":340793,"children":340794},{},[340795,340800],{"type":17,"tag":84,"props":340796,"children":340797},{},[340798],{"type":23,"value":340799},"If your endpoint is unavailable or returns an error, we'll retry up to 3 times immediately, with a 1-second delay between attempts.",{"type":17,"tag":84,"props":340801,"children":340802},{},[340803,340805],{"type":23,"value":340804},"If the error persists, we switch to a Fibonacci backoff strategy:\n",{"type":17,"tag":80,"props":340806,"children":340807},{},[340808,340813,340818],{"type":17,"tag":84,"props":340809,"children":340810},{},[340811],{"type":23,"value":340812},"Initial delay: 1 minute",{"type":17,"tag":84,"props":340814,"children":340815},{},[340816],{"type":23,"value":340817},"Subsequent delays: 1 minute, 2 minutes, 3 minutes, 5 minutes, 8 minutes, etc.",{"type":17,"tag":84,"props":340819,"children":340820},{},[340821],{"type":23,"value":340822},"This continues for several days and up to 2 weeks, maximizing the chance of successful delivery.",{"type":17,"tag":29,"props":340824,"children":340825},{},[340826],{"type":17,"tag":48,"props":340827,"children":340828},{},[340829],{"type":23,"value":340830},"When the API provider is unavailable",{"type":17,"tag":29,"props":340832,"children":340833},{},[340834,340836,340840],{"type":23,"value":340835},"If we can't reach the API provider or have hit their ",{"type":17,"tag":133,"props":340837,"children":340838},{"href":135},[340839],{"type":23,"value":138},{"type":23,"value":340841},", we will back off and retry based off of a Fibonacci delay sequence (outlined above), starting with 1 minute.",{"type":17,"tag":68,"props":340843,"children":340844},{"id":332205},[340845],{"type":23,"value":332208},{"type":17,"tag":80,"props":340847,"children":340848},{},[340849,340857,340865],{"type":17,"tag":84,"props":340850,"children":340851},{},[340852],{"type":17,"tag":133,"props":340853,"children":340855},{"href":333328,"rel":340854},[214],[340856],{"type":23,"value":333322},{"type":17,"tag":84,"props":340858,"children":340859},{},[340860],{"type":17,"tag":133,"props":340861,"children":340863},{"href":337038,"rel":340862},[214],[340864],{"type":23,"value":335556},{"type":17,"tag":84,"props":340866,"children":340867},{},[340868],{"type":17,"tag":133,"props":340869,"children":340871},{"href":339752,"rel":340870},[214],[340872],{"type":23,"value":339756},{"title":7,"searchDepth":1629,"depth":1629,"links":340874},[340875,340876,340880,340884,340885,340893],{"id":177146,"depth":1629,"text":177149},{"id":340386,"depth":1629,"text":340389,"children":340877},[340878,340879],{"id":340397,"depth":1635,"text":340400},{"id":338517,"depth":1635,"text":338520},{"id":340528,"depth":1629,"text":340531,"children":340881},[340882,340883],{"id":340534,"depth":1635,"text":340537},{"id":340560,"depth":1635,"text":340563},{"id":340588,"depth":1629,"text":340591},{"id":340678,"depth":1629,"text":340681,"children":340886},[340887,340888,340889,340890,340891,340892],{"id":340689,"depth":1635,"text":340692},{"id":340705,"depth":1635,"text":340708},{"id":340721,"depth":1635,"text":340724},{"id":340736,"depth":1635,"text":340739},{"id":340764,"depth":1635,"text":340767},{"id":340775,"depth":1635,"text":340778},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_troubleshoot_unhealthy_webhooks.md","blog/how_to_troubleshoot_unhealthy_webhooks.md","blog/how_to_troubleshoot_unhealthy_webhooks",{"_path":340898,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":340899,"description":340900,"img":340901,"date":340902,"tag":6341,"body":340903,"_type":1677,"_id":341238,"_source":1679,"_file":341239,"_stem":341240,"_extension":1682},"/blog/how_to_get_your_oauth_2_credentials_in_pipedrive","How to get your OAuth 2 credentials in PipeDrive","This guide explains how to create a public developer app in Pipedrive and obtain your OAuth 2 credentials. You'll need these credentials in order to...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_in_pipedrive-icon.jpg","2024-08-26T00:00:00.000Z",{"type":14,"children":340904,"toc":341231},[340905,340910,340913,340921,340932,340947,340951,340956,340972,340978,341010,341016,341095,341101,341161,341167],{"type":17,"tag":18,"props":340906,"children":340908},{"id":340907},"how-to-get-your-oauth-2-credentials-in-pipedrive",[340909],{"type":23,"value":340899},{"type":17,"tag":25,"props":340911,"children":340912},{},[],{"type":17,"tag":29,"props":340914,"children":340915},{},[340916],{"type":17,"tag":33,"props":340917,"children":340918},{},[340919],{"type":23,"value":340920},"August 26, 2024",{"type":17,"tag":29,"props":340922,"children":340923},{},[340924,340926,340930],{"type":23,"value":340925},"This guide explains how to create a public developer app in Pipedrive and obtain your ",{"type":17,"tag":133,"props":340927,"children":340928},{"href":779},[340929],{"type":23,"value":782},{"type":23,"value":340931}," 2 credentials. You'll need these credentials in order to authenticate your app with Unified.to.",{"type":17,"tag":29,"props":340933,"children":340934},{},[340935],{"type":17,"tag":33,"props":340936,"children":340937},{},[340938,340940,340946],{"type":23,"value":340939},"Note: The state parameter is not automatically available in Marketplace Manager. To enable it for your app, please write to ",{"type":17,"tag":133,"props":340941,"children":340943},{"href":340942},"mailto:marketplace.devs@pipedrive.com",[340944],{"type":23,"value":340945},"marketplace.devs@pipedrive.com",{"type":23,"value":54},{"type":17,"tag":68,"props":340948,"children":340949},{"id":177146},[340950],{"type":23,"value":177149},{"type":17,"tag":29,"props":340952,"children":340953},{},[340954],{"type":23,"value":340955},"Before you create a developer app in Pipedrive, ensure:",{"type":17,"tag":80,"props":340957,"children":340958},{},[340959],{"type":17,"tag":84,"props":340960,"children":340961},{},[340962,340964,340971],{"type":23,"value":340963},"You have a Pipedrive developer sandbox account. If you don't have one, sign up at ",{"type":17,"tag":133,"props":340965,"children":340968},{"href":340966,"rel":340967},"https://developers.pipedrive.com/",[214],[340969],{"type":23,"value":340970},"Pipedrive's developer portal",{"type":23,"value":54},{"type":17,"tag":68,"props":340973,"children":340975},{"id":340974},"access-the-developer-hub",[340976],{"type":23,"value":340977},"Access the Developer Hub",{"type":17,"tag":6154,"props":340979,"children":340980},{},[340981,340986,340991],{"type":17,"tag":84,"props":340982,"children":340983},{},[340984],{"type":23,"value":340985},"Log in to your Pipedrive account.",{"type":17,"tag":84,"props":340987,"children":340988},{},[340989],{"type":23,"value":340990},"Click on your profile name in the upper right corner of the top navigation bar.",{"type":17,"tag":84,"props":340992,"children":340993},{},[340994,340995,341000,341002,341005],{"type":23,"value":42950},{"type":17,"tag":48,"props":340996,"children":340997},{},[340998],{"type":23,"value":340999},"Developer Hub",{"type":23,"value":341001}," from the drop-down menu.",{"type":17,"tag":3891,"props":341003,"children":341004},{},[],{"type":17,"tag":6438,"props":341006,"children":341009},{"alt":341007,"src":341008},"Screenshot_2024-08-26_at_3.02.21_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_in_pipedrive-0.png",[],{"type":17,"tag":68,"props":341011,"children":341013},{"id":341012},"create-a-pipedrive-public-app",[341014],{"type":23,"value":341015},"Create a Pipedrive public app",{"type":17,"tag":6154,"props":341017,"children":341018},{},[341019,341030,341040,341077],{"type":17,"tag":84,"props":341020,"children":341021},{},[341022,341023,341028],{"type":23,"value":6629},{"type":17,"tag":48,"props":341024,"children":341025},{},[341026],{"type":23,"value":341027},"Create an app",{"type":23,"value":341029}," (or \"+ Create an app\" if you have existing apps).",{"type":17,"tag":84,"props":341031,"children":341032},{},[341033,341034,341039],{"type":23,"value":42950},{"type":17,"tag":48,"props":341035,"children":341036},{},[341037],{"type":23,"value":341038},"Create public app",{"type":23,"value":54},{"type":17,"tag":84,"props":341041,"children":341042},{},[341043,341045,341050,341051,341069,341072],{"type":23,"value":341044},"Fill in your app details under ",{"type":17,"tag":48,"props":341046,"children":341047},{},[341048],{"type":23,"value":341049},"Basic info",{"type":23,"value":54},{"type":17,"tag":6154,"props":341052,"children":341053},{},[341054],{"type":17,"tag":84,"props":341055,"children":341056},{},[341057,341058,341062,341064],{"type":23,"value":123278},{"type":17,"tag":48,"props":341059,"children":341060},{},[341061],{"type":23,"value":144881},{"type":23,"value":341063}," field, enter: ",{"type":17,"tag":6121,"props":341065,"children":341067},{"className":341066},[],[341068],{"type":23,"value":42417},{"type":17,"tag":3891,"props":341070,"children":341071},{},[],{"type":17,"tag":6438,"props":341073,"children":341076},{"alt":341074,"src":341075},"Screenshot_2024-08-26_at_3.06.15_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_in_pipedrive-1.png",[],{"type":17,"tag":84,"props":341078,"children":341079},{},[341080,341081,341086,341088,341093],{"type":23,"value":6629},{"type":17,"tag":48,"props":341082,"children":341083},{},[341084],{"type":23,"value":341085},"Save.",{"type":23,"value":341087}," You will be redirected to the ",{"type":17,"tag":48,"props":341089,"children":341090},{},[341091],{"type":23,"value":341092},"OAuth & access scopes",{"type":23,"value":341094}," page after your app is created.",{"type":17,"tag":68,"props":341096,"children":341098},{"id":341097},"configure-scopes-and-get-your-oauth-2-credentials",[341099],{"type":23,"value":341100},"Configure scopes and get your OAuth 2 credentials",{"type":17,"tag":6154,"props":341102,"children":341103},{},[341104,341123,341134,341152],{"type":17,"tag":84,"props":341105,"children":341106},{},[341107,341109],{"type":23,"value":341108},"Select the scopes your app requires. Only choose scopes that are necessary for your app's functionality.\n",{"type":17,"tag":6154,"props":341110,"children":341111},{},[341112],{"type":17,"tag":84,"props":341113,"children":341114},{},[341115,341117,341121],{"type":23,"value":341116},"For example, if you want to be notified about new or updated deals from Pipedrive, select ",{"type":17,"tag":48,"props":341118,"children":341119},{},[341120],{"type":23,"value":63113},{"type":23,"value":341122}," and choose whether you need read-only access or full (i.e. create, update, read, delete) access.",{"type":17,"tag":84,"props":341124,"children":341125},{},[341126,341128,341132],{"type":23,"value":341127},"Scroll down to the ",{"type":17,"tag":48,"props":341129,"children":341130},{},[341131],{"type":23,"value":6040},{"type":23,"value":341133}," section.",{"type":17,"tag":84,"props":341135,"children":341136},{},[341137,341139,341144,341145,341150],{"type":23,"value":341138},"Here you'll find your ",{"type":17,"tag":6121,"props":341140,"children":341142},{"className":341141},[],[341143],{"type":23,"value":97251},{"type":23,"value":34435},{"type":17,"tag":6121,"props":341146,"children":341148},{"className":341147},[],[341149],{"type":23,"value":97318},{"type":23,"value":341151},". Make a note of them as you will need it for the final step.",{"type":17,"tag":84,"props":341153,"children":341154},{},[341155,341156,341160],{"type":23,"value":6629},{"type":17,"tag":48,"props":341157,"children":341158},{},[341159],{"type":23,"value":169347},{"type":23,"value":54},{"type":17,"tag":68,"props":341162,"children":341164},{"id":341163},"activate-the-pipedrive-integration-in-unifiedto-with-your-client-id-and-secret",[341165],{"type":23,"value":341166},"Activate the Pipedrive integration in Unified.to with your client ID and secret",{"type":17,"tag":6154,"props":341168,"children":341169},{},[341170,341182,341204,341222],{"type":17,"tag":84,"props":341171,"children":341172},{},[341173,341175],{"type":23,"value":341174},"Open a new tab and navigate to ",{"type":17,"tag":133,"props":341176,"children":341179},{"href":341177,"rel":341178},"https://app.unified.to/integrations/hubspot",[214],[341180],{"type":23,"value":341181},"the Pipedrive integration in Unified.to",{"type":17,"tag":84,"props":341183,"children":341184},{},[341185,341187],{"type":23,"value":341186},"You will need the following two pieces of information from the earlier steps:\n",{"type":17,"tag":6154,"props":341188,"children":341189},{},[341190,341197],{"type":17,"tag":84,"props":341191,"children":341192},{},[341193],{"type":17,"tag":48,"props":341194,"children":341195},{},[341196],{"type":23,"value":6040},{"type":17,"tag":84,"props":341198,"children":341199},{},[341200],{"type":17,"tag":48,"props":341201,"children":341202},{},[341203],{"type":23,"value":125508},{"type":17,"tag":84,"props":341205,"children":341206},{},[341207,341209,341214,341216,341221],{"type":23,"value":341208},"Copy and paste these values into their respective fields on the page. Make sure that ",{"type":17,"tag":48,"props":341210,"children":341211},{},[341212],{"type":23,"value":341213},"OAuth 2",{"type":23,"value":341215}," is selected under ",{"type":17,"tag":48,"props":341217,"children":341218},{},[341219],{"type":23,"value":341220},"Authentication Method",{"type":23,"value":54},{"type":17,"tag":84,"props":341223,"children":341224},{},[341225,341226,341230],{"type":23,"value":6629},{"type":17,"tag":48,"props":341227,"children":341228},{},[341229],{"type":23,"value":6634},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":341232},[341233,341234,341235,341236,341237],{"id":177146,"depth":1629,"text":177149},{"id":340974,"depth":1629,"text":340977},{"id":341012,"depth":1629,"text":341015},{"id":341097,"depth":1629,"text":341100},{"id":341163,"depth":1629,"text":341166},"content:blog:how_to_get_your_oauth_2_credentials_in_pipedrive.md","blog/how_to_get_your_oauth_2_credentials_in_pipedrive.md","blog/how_to_get_your_oauth_2_credentials_in_pipedrive",{"_path":341242,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":341243,"description":341244,"img":341245,"date":341246,"tag":6341,"body":341247,"_type":1677,"_id":341420,"_source":1679,"_file":341421,"_stem":341422,"_extension":1682},"/blog/how_to_register_a_zoho_developer_app_and_get_oauth2_credentials","How to Register a Zoho Developer App and Get OAUTH2 Credentials","Zoho has many applications that we support integrations with; ZohoCRM, ZohoBooks, ZohoPeople, and ZohoRecruit. If you are a developer who wants to build data...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_zoho_developer_app_and_get_oauth2_credentials-icon.png","2024-08-23T00:00:00.000Z",{"type":14,"children":341248,"toc":341414},[341249,341254,341257,341265,341270,341275,341281,341293,341298,341304,341309,341365,341370,341381],{"type":17,"tag":18,"props":341250,"children":341252},{"id":341251},"how-to-register-a-zoho-developer-app-and-get-oauth2-credentials",[341253],{"type":23,"value":341243},{"type":17,"tag":25,"props":341255,"children":341256},{},[],{"type":17,"tag":29,"props":341258,"children":341259},{},[341260],{"type":17,"tag":33,"props":341261,"children":341262},{},[341263],{"type":23,"value":341264},"August 23, 2024",{"type":17,"tag":29,"props":341266,"children":341267},{},[341268],{"type":23,"value":341269},"Zoho has many applications that we support integrations with; ZohoCRM, ZohoBooks, ZohoPeople, and ZohoRecruit. If you are a developer who wants to build data integrations for your SaaS software with any of the Zoho product suite, you will need to register a developer app and get credentials from Zoho.",{"type":17,"tag":29,"props":341271,"children":341272},{},[341273],{"type":23,"value":341274},"In this article, I will show you how to do that in a few simple steps.",{"type":17,"tag":68,"props":341276,"children":341278},{"id":341277},"step-1-create-a-zoho-developer-account",[341279],{"type":23,"value":341280},"Step 1: Create a Zoho Developer Account",{"type":17,"tag":29,"props":341282,"children":341283},{},[341284,341286,341292],{"type":23,"value":341285},"The first step is to create a Zoho Developer account, if you don't have one already. You can sign up for free at ",{"type":17,"tag":133,"props":341287,"children":341290},{"href":341288,"rel":341289},"https://developer.zoho.com/signup",[214],[341291],{"type":23,"value":341288},{"type":23,"value":54},{"type":17,"tag":29,"props":341294,"children":341295},{},[341296],{"type":23,"value":341297},"Once you have created your account, you will be able to access the Zoho Developer Console, where you can manage your apps and credentials.",{"type":17,"tag":68,"props":341299,"children":341301},{"id":341300},"step-2-register-a-zoho-developer-app",[341302],{"type":23,"value":341303},"Step 2: Register a Zoho Developer App",{"type":17,"tag":29,"props":341305,"children":341306},{},[341307],{"type":23,"value":341308},"The next step is to register a Zoho developer app, which will allow you to access the Zoho API and data. To do that, follow these steps:",{"type":17,"tag":80,"props":341310,"children":341311},{},[341312,341325,341330,341335,341355,341360],{"type":17,"tag":84,"props":341313,"children":341314},{},[341315,341316,341323],{"type":23,"value":158670},{"type":17,"tag":133,"props":341317,"children":341320},{"href":341318,"rel":341319},"https://api-console.zoho.com/",[214],[341321],{"type":23,"value":341322},"Zoho Developer Console",{"type":23,"value":341324}," and click on the \"Add App\" button.",{"type":17,"tag":84,"props":341326,"children":341327},{},[341328],{"type":23,"value":341329},"Choose \"Server-Based\" as the Client Type and click on \"Create\".",{"type":17,"tag":84,"props":341331,"children":341332},{},[341333],{"type":23,"value":341334},"Enter a name and a homepage for your app",{"type":17,"tag":84,"props":341336,"children":341337},{},[341338,341340,341349,341350],{"type":23,"value":341339},"For your Authorized redirect URI, enter in ",{"type":17,"tag":133,"props":341341,"children":341343},{"href":42417,"rel":341342},[214],[341344],{"type":17,"tag":6121,"props":341345,"children":341347},{"className":341346},[],[341348],{"type":23,"value":42417},{"type":23,"value":75890},{"type":17,"tag":6121,"props":341351,"children":341353},{"className":341352},[],[341354],{"type":23,"value":126565},{"type":17,"tag":84,"props":341356,"children":341357},{},[341358],{"type":23,"value":341359},"Click on \"Create\".",{"type":17,"tag":84,"props":341361,"children":341362},{},[341363],{"type":23,"value":341364},"You will see a confirmation message and a client ID and a client secret for your app. Copy and save them somewhere safe, as you will need them later.",{"type":17,"tag":29,"props":341366,"children":341367},{},[341368],{"type":23,"value":341369},"Congratulations! You have successfully registered a Zoho developer app and got credentials. You can now use them to access the Zoho API and data from your SaaS software.",{"type":17,"tag":68,"props":341371,"children":341373},{"id":341372},"step-3-activate-your-zoho-apps-in-unifiedto",[341374,341376],{"type":23,"value":341375},"Step 3: Activate your Zoho Apps in ",{"type":17,"tag":133,"props":341377,"children":341379},{"href":42620,"rel":341378},[214],[341380],{"type":23,"value":217},{"type":17,"tag":6154,"props":341382,"children":341383},{},[341384,341394,341399,341404,341409],{"type":17,"tag":84,"props":341385,"children":341386},{},[341387,341388],{"type":23,"value":42939},{"type":17,"tag":133,"props":341389,"children":341391},{"href":329567,"rel":341390},[214],[341392],{"type":23,"value":341393},"Active Integrations",{"type":17,"tag":84,"props":341395,"children":341396},{},[341397],{"type":23,"value":341398},"Search for ZohoCRM, ZohoBooks, ZohoPeople, or ZohoRecruit",{"type":17,"tag":84,"props":341400,"children":341401},{},[341402],{"type":23,"value":341403},"Click on the integration",{"type":17,"tag":84,"props":341405,"children":341406},{},[341407],{"type":23,"value":341408},"Enter in the information from the previous step (client ID, secret)",{"type":17,"tag":84,"props":341410,"children":341411},{},[341412],{"type":23,"value":341413},"Click on Activate",{"title":7,"searchDepth":1629,"depth":1629,"links":341415},[341416,341417,341418],{"id":341277,"depth":1629,"text":341280},{"id":341300,"depth":1629,"text":341303},{"id":341372,"depth":1629,"text":341419},"Step 3: Activate your Zoho Apps in Unified.to","content:blog:how_to_register_a_zoho_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_a_zoho_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_a_zoho_developer_app_and_get_oauth2_credentials",{"_path":341424,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":341425,"description":341426,"img":341427,"date":341428,"tag":12,"body":341429,"_type":1677,"_id":342289,"_source":1679,"_file":342290,"_stem":342291,"_extension":1682},"/blog/july_2024_product_updates","July 2024 product updates","Here's what the Unified.to team has been up to in July!","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2024_product_updates-icon.png","2024-07-31T00:00:00.000Z",{"type":14,"children":341430,"toc":342276},[341431,341436,341439,341447,341455,341459,341464,341542,341548,341556,341561,341566,341576,341586,341596,341615,341621,341645,341650,341675,341680,341713,341717,341725,341730,341735,341758,341767,341771,341783,341792,341800,341808,341893,341897,341940,341953,341959,341967,341975,341987,341991,342021,342031,342040,342048,342056,342061,342155,342160,342165,342219,342229,342235,342243,342257],{"type":17,"tag":18,"props":341432,"children":341434},{"id":341433},"july-2024-product-updates",[341435],{"type":23,"value":341425},{"type":17,"tag":25,"props":341437,"children":341438},{},[],{"type":17,"tag":29,"props":341440,"children":341441},{},[341442],{"type":17,"tag":33,"props":341443,"children":341444},{},[341445],{"type":23,"value":341446},"July 31, 2024",{"type":17,"tag":29,"props":341448,"children":341449},{},[341450],{"type":17,"tag":6438,"props":341451,"children":341454},{"alt":341452,"src":341453},"unified-product-july-2024.png","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2024_product_updates-0.png",[],{"type":17,"tag":29,"props":341456,"children":341457},{},[341458],{"type":23,"value":341426},{"type":17,"tag":68,"props":341460,"children":341461},{"id":243535},[341462],{"type":23,"value":341463},"TL;DR:",{"type":17,"tag":80,"props":341465,"children":341466},{},[341467,341479,341491,341505,341518,341537],{"type":17,"tag":84,"props":341468,"children":341469},{},[341470,341472],{"type":23,"value":341471},"Launch integrations faster by working through our updated ",{"type":17,"tag":133,"props":341473,"children":341476},{"href":341474,"rel":341475},"https://app.unified.to/start",[214],[341477],{"type":23,"value":341478},"onboarding launch checklist",{"type":17,"tag":84,"props":341480,"children":341481},{},[341482,341484],{"type":23,"value":341483},"Familiarize yourself about key concepts and terms like Passthrough, Scopes, and Connections in our ",{"type":17,"tag":133,"props":341485,"children":341488},{"href":341486,"rel":341487},"https://docs.unified.to/help/glossary",[214],[341489],{"type":23,"value":341490},"glossary",{"type":17,"tag":84,"props":341492,"children":341493},{},[341494,341496,341503],{"type":23,"value":341495},"Explore our ",{"type":17,"tag":133,"props":341497,"children":341500},{"href":341498,"rel":341499},"https://docs.unified.to/help/guides",[214],[341501],{"type":23,"value":341502},"developer guides",{"type":23,"value":341504}," to understand popular use cases, key features, and various API categories",{"type":17,"tag":84,"props":341506,"children":341507},{},[341508,341510,341516],{"type":23,"value":341509},"Discover nearly 200 ",{"type":17,"tag":133,"props":341511,"children":341513},{"href":47029,"rel":341512},[214],[341514],{"type":23,"value":341515},"enhancements",{"type":23,"value":341517}," to our integrations, complete with examples of use cases to help you implement the updates into your product",{"type":17,"tag":84,"props":341519,"children":341520},{},[341521,341523,341530,341531],{"type":23,"value":341522},"Easily add our newest pre-built integrations to your application: ",{"type":17,"tag":133,"props":341524,"children":341527},{"href":341525,"rel":341526},"https://unified.to/integrations/jobscore",[214],[341528],{"type":23,"value":341529},"JobScore",{"type":23,"value":34435},{"type":17,"tag":133,"props":341532,"children":341535},{"href":341533,"rel":341534},"https://unified.to/integrations/namely",[214],[341536],{"type":23,"value":60903},{"type":17,"tag":84,"props":341538,"children":341539},{},[341540],{"type":23,"value":341541},"Community updates: We held our first IRL meetup in Toronto!",{"type":17,"tag":68,"props":341543,"children":341545},{"id":341544},"onboarding-launch-checklist",[341546],{"type":23,"value":341547},"Onboarding launch checklist",{"type":17,"tag":29,"props":341549,"children":341550},{},[341551],{"type":17,"tag":6438,"props":341552,"children":341555},{"alt":341553,"src":341554},"unified-checklist_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2024_product_updates-1.png",[],{"type":17,"tag":29,"props":341557,"children":341558},{},[341559],{"type":23,"value":341560},"After speaking with several of our customers we learned that their teams could benefit from a detailed launch checklist to support planning for and executing on an integration roadmap. We've outlined everything needed to build, test, and launch integrations with Unified.to seamlessly.",{"type":17,"tag":29,"props":341562,"children":341563},{},[341564],{"type":23,"value":341565},"What the checklist includes:",{"type":17,"tag":29,"props":341567,"children":341568},{},[341569,341574],{"type":17,"tag":48,"props":341570,"children":341571},{},[341572],{"type":23,"value":341573},"Build steps:",{"type":23,"value":341575}," configuring your Unified.to Workspace, using our embedded components to authenticate your customers' accounts, and transforming our data models into your data models.",{"type":17,"tag":29,"props":341577,"children":341578},{},[341579,341584],{"type":17,"tag":48,"props":341580,"children":341581},{},[341582],{"type":23,"value":341583},"Testing steps:",{"type":23,"value":341585}," testing user connections from your integrations in a sandbox environment.",{"type":17,"tag":29,"props":341587,"children":341588},{},[341589,341594],{"type":17,"tag":48,"props":341590,"children":341591},{},[341592],{"type":23,"value":341593},"Launch steps:",{"type":23,"value":341595}," running your final tests in Production and guidance for your public-facing integrations launch.",{"type":17,"tag":29,"props":341597,"children":341598},{},[341599,341601,341607,341609,341614],{"type":23,"value":341600},"Create a free account or sign to access the ",{"type":17,"tag":133,"props":341602,"children":341604},{"href":341474,"rel":341603},[214],[341605],{"type":23,"value":341606},"integration launch checklist",{"type":23,"value":341608},". If you have any feedback about our product onboarding, our Developer Advocate, Andy, would love to hear from you on ",{"type":17,"tag":133,"props":341610,"children":341612},{"href":326013,"rel":341611},[214],[341613],{"type":23,"value":15720},{"type":23,"value":54},{"type":17,"tag":68,"props":341616,"children":341618},{"id":341617},"api-glossary",[341619],{"type":23,"value":341620},"API Glossary",{"type":17,"tag":29,"props":341622,"children":341623},{},[341624,341626,341630,341632,341637,341639,341643],{"type":23,"value":341625},"Despite industry standards, we know that there's a wide gamut of terminology used when it comes to APIs and it can be confusing if you're new to integration development or using a ",{"type":17,"tag":133,"props":341627,"children":341628},{"href":7691},[341629],{"type":23,"value":7459},{"type":23,"value":341631}," provider for the first time. That's why we've created a ",{"type":17,"tag":133,"props":341633,"children":341635},{"href":341486,"rel":341634},[214],[341636],{"type":23,"value":341490},{"type":23,"value":341638}," in our ",{"type":17,"tag":133,"props":341640,"children":341641},{"href":129820},[341642],{"type":23,"value":129823},{"type":23,"value":341644}," that defines the key terms you'll frequently see in our documentation and application. We'll continue to update the glossary based on user feedback.",{"type":17,"tag":68,"props":341646,"children":341648},{"id":341647},"guides",[341649],{"type":23,"value":6341},{"type":17,"tag":29,"props":341651,"children":341652},{},[341653,341655,341659,341661,341666,341668,341673],{"type":23,"value":341654},"Whether you're just getting started with Unified.to, trying to figure out how to filter webhook events, or want a straightforward guide to getting ",{"type":17,"tag":133,"props":341656,"children":341657},{"href":779},[341658],{"type":23,"value":782},{"type":23,"value":341660}," 2 credentials for your Microsoft integrations. We regularly publish ",{"type":17,"tag":133,"props":341662,"children":341664},{"href":341498,"rel":341663},[214],[341665],{"type":23,"value":341502},{"type":23,"value":341667}," that can be found under ",{"type":17,"tag":48,"props":341669,"children":341670},{},[341671],{"type":23,"value":341672},"Help Center",{"type":23,"value":341674}," in our API Documentation.",{"type":17,"tag":29,"props":341676,"children":341677},{},[341678],{"type":23,"value":341679},"Recent articles based on frequently asked 'How do I do…..?' questions:",{"type":17,"tag":80,"props":341681,"children":341682},{},[341683,341693,341703],{"type":17,"tag":84,"props":341684,"children":341685},{},[341686],{"type":17,"tag":133,"props":341687,"children":341690},{"href":341688,"rel":341689},"https://docs.unified.to/help/guides/how_to_filter_webhook_events",[214],[341691],{"type":23,"value":341692},"How to filter webhooks events",{"type":17,"tag":84,"props":341694,"children":341695},{},[341696],{"type":17,"tag":133,"props":341697,"children":341700},{"href":341698,"rel":341699},"https://docs.unified.to/help/guides/extended_observability__pushing_api_logs_to_your_datadog_instance",[214],[341701],{"type":23,"value":341702},"Pushing API logs to your Datadog instance",{"type":17,"tag":84,"props":341704,"children":341705},{},[341706],{"type":17,"tag":133,"props":341707,"children":341710},{"href":341708,"rel":341709},"https://docs.unified.to/help/guides/passthrough_api_a_new_way_to_connect_with_your_integrations",[214],[341711],{"type":23,"value":341712},"How to use our passthrough API",{"type":17,"tag":68,"props":341714,"children":341715},{"id":11629},[341716],{"type":23,"value":11632},{"type":17,"tag":29,"props":341718,"children":341719},{},[341720],{"type":17,"tag":6438,"props":341721,"children":341724},{"alt":341722,"src":341723},"unified-new-integrations.png","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2024_product_updates-2.png",[],{"type":17,"tag":29,"props":341726,"children":341727},{},[341728],{"type":23,"value":341729},"By leveraging our unified API software teams can add hundreds of pre-built integrations from more than 16 API categories to their applications in days, without months of development effort and years of long-term maintenance.",{"type":17,"tag":29,"props":341731,"children":341732},{},[341733],{"type":23,"value":341734},"In July, we expanded our 200+ integrations to include:",{"type":17,"tag":80,"props":341736,"children":341737},{},[341738,341748],{"type":17,"tag":84,"props":341739,"children":341740},{},[341741,341746],{"type":17,"tag":133,"props":341742,"children":341744},{"href":341525,"rel":341743},[214],[341745],{"type":23,"value":341529},{"type":23,"value":341747}," (ATS)",{"type":17,"tag":84,"props":341749,"children":341750},{},[341751,341756],{"type":17,"tag":133,"props":341752,"children":341754},{"href":341533,"rel":341753},[214],[341755],{"type":23,"value":60903},{"type":23,"value":341757}," (HR)",{"type":17,"tag":29,"props":341759,"children":341760},{},[341761],{"type":17,"tag":133,"props":341762,"children":341764},{"href":87026,"rel":341763},[214],[341765],{"type":23,"value":341766},"See all integrations",{"type":17,"tag":68,"props":341768,"children":341769},{"id":336845},[341770],{"type":23,"value":336848},{"type":17,"tag":29,"props":341772,"children":341773},{},[341774,341776,341781],{"type":23,"value":341775},"There were 199 integration enhancements this month! See a comprehensive list of enhancements on our ",{"type":17,"tag":133,"props":341777,"children":341779},{"href":47029,"rel":341778},[214],[341780],{"type":23,"value":47033},{"type":23,"value":341782},". Here are a few highlights with use case examples.",{"type":17,"tag":239,"props":341784,"children":341786},{"id":341785},"integration-quickbooks-unified-e-commerce-api",[341787],{"type":17,"tag":48,"props":341788,"children":341789},{},[341790],{"type":23,"value":341791},"Integration: QuickBooks (unified E-commerce API)",{"type":17,"tag":29,"props":341793,"children":341794},{},[341795],{"type":17,"tag":6438,"props":341796,"children":341799},{"alt":341797,"src":341798},"unified-quickbooks.png","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2024_product_updates-3.png",[],{"type":17,"tag":29,"props":341801,"children":341802},{},[341803],{"type":17,"tag":48,"props":341804,"children":341805},{},[341806],{"type":23,"value":341807},"Object: Item",{"type":17,"tag":29,"props":341809,"children":341810},{},[341811,341813,341819,341820,341825,341827,341832,341834,341839,341840,341845,341846,341852,341853,341859,341860,341865,341866,341872,341873,341878,341879,341884,341886,341891],{"type":23,"value":341812},"QuickBooks Item now includes new readable fields for ",{"type":17,"tag":6121,"props":341814,"children":341816},{"className":341815},[],[341817],{"type":23,"value":341818},"vendor_name",{"type":23,"value":34435},{"type":17,"tag":6121,"props":341821,"children":341823},{"className":341822},[],[341824],{"type":23,"value":27310},{"type":23,"value":341826},". Additionally, it offers new writable fields for  ",{"type":17,"tag":6121,"props":341828,"children":341830},{"className":341829},[],[341831],{"type":23,"value":341818},{"type":23,"value":341833},",  ",{"type":17,"tag":6121,"props":341835,"children":341837},{"className":341836},[],[341838],{"type":23,"value":38580},{"type":23,"value":341833},{"type":17,"tag":6121,"props":341841,"children":341843},{"className":341842},[],[341844],{"type":23,"value":27310},{"type":23,"value":341833},{"type":17,"tag":6121,"props":341847,"children":341849},{"className":341848},[],[341850],{"type":23,"value":341851},"public_name",{"type":23,"value":11826},{"type":17,"tag":6121,"props":341854,"children":341856},{"className":341855},[],[341857],{"type":23,"value":341858},"public_description",{"type":23,"value":11826},{"type":17,"tag":6121,"props":341861,"children":341863},{"className":341862},[],[341864],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":341867,"children":341869},{"className":341868},[],[341870],{"type":23,"value":341871},"is_taxable",{"type":23,"value":11826},{"type":17,"tag":6121,"props":341874,"children":341876},{"className":341875},[],[341877],{"type":23,"value":62868},{"type":23,"value":12561},{"type":17,"tag":6121,"props":341880,"children":341882},{"className":341881},[],[341883],{"type":23,"value":24679},{"type":23,"value":341885},". QuickBooks has also added a ",{"type":17,"tag":6121,"props":341887,"children":341889},{"className":341888},[],[341890],{"type":23,"value":11254},{"type":23,"value":341892}," method for Item.",{"type":17,"tag":29,"props":341894,"children":341895},{},[341896],{"type":23,"value":217214},{"type":17,"tag":80,"props":341898,"children":341899},{},[341900,341930],{"type":17,"tag":84,"props":341901,"children":341902},{},[341903,341908,341910,341915,341916,341921,341923,341928],{"type":17,"tag":48,"props":341904,"children":341905},{},[341906],{"type":23,"value":341907},"E-commerce applications",{"type":23,"value":341909},": automate product categorization by ",{"type":17,"tag":6121,"props":341911,"children":341913},{"className":341912},[],[341914],{"type":23,"value":341818},{"type":23,"value":34435},{"type":17,"tag":6121,"props":341917,"children":341919},{"className":341918},[],[341920],{"type":23,"value":27310},{"type":23,"value":341922}," and add new items using the ",{"type":17,"tag":6121,"props":341924,"children":341926},{"className":341925},[],[341927],{"type":23,"value":11254},{"type":23,"value":341929},"  method with the new writable fields.",{"type":17,"tag":84,"props":341931,"children":341932},{},[341933,341938],{"type":17,"tag":48,"props":341934,"children":341935},{},[341936],{"type":23,"value":341937},"Procurement systems",{"type":23,"value":341939},": provide enhanced supplier and item management by tracking items using new readable fields and create new items with the new writable fields.",{"type":17,"tag":29,"props":341941,"children":341942},{},[341943,341945,341951],{"type":23,"value":341944},"Unified.to makes it easy to add 12+ ",{"type":17,"tag":133,"props":341946,"children":341948},{"href":19380,"rel":341947},[214],[341949],{"type":23,"value":341950},"e-commerce integrations",{"type":23,"value":341952}," including Shopify, Akeneo, and Bold Commerce to your application through a single API.",{"type":17,"tag":239,"props":341954,"children":341956},{"id":341955},"integration-microsoft-outlook-unified-messaging-api",[341957],{"type":23,"value":341958},"Integration: Microsoft Outlook (unified Messaging API)",{"type":17,"tag":29,"props":341960,"children":341961},{},[341962],{"type":17,"tag":6438,"props":341963,"children":341966},{"alt":341964,"src":341965},"unified-outlook.png","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2024_product_updates-4.png",[],{"type":17,"tag":29,"props":341968,"children":341969},{},[341970],{"type":17,"tag":48,"props":341971,"children":341972},{},[341973],{"type":23,"value":341974},"Object: Message",{"type":17,"tag":29,"props":341976,"children":341977},{},[341978,341980,341985],{"type":23,"value":341979},"Microsoft Outlook Message now has read and write support for ",{"type":17,"tag":6121,"props":341981,"children":341983},{"className":341982},[],[341984],{"type":23,"value":257658},{"type":23,"value":341986},". This update enables more enhanced data tracking capabilities.",{"type":17,"tag":29,"props":341988,"children":341989},{},[341990],{"type":23,"value":217214},{"type":17,"tag":80,"props":341992,"children":341993},{},[341994,342011],{"type":17,"tag":84,"props":341995,"children":341996},{},[341997,342002,342004,342009],{"type":17,"tag":48,"props":341998,"children":341999},{},[342000],{"type":23,"value":342001},"Customer support applications:",{"type":23,"value":342003}," utilize ",{"type":17,"tag":6121,"props":342005,"children":342007},{"className":342006},[],[342008],{"type":23,"value":257658},{"type":23,"value":342010}," to track emails threads more effectively and group related messages to facilitate better organization and quicker resolution of support tickets.",{"type":17,"tag":84,"props":342012,"children":342013},{},[342014,342019],{"type":17,"tag":48,"props":342015,"children":342016},{},[342017],{"type":23,"value":342018},"AI-powered email analysis:",{"type":23,"value":342020}," By using the parent ID, AI models can better understand the sequence of conversations to enable more accurate sentiment analysis, intent recognition, and response generation.",{"type":17,"tag":29,"props":342022,"children":342023},{},[342024,342026],{"type":23,"value":342025},"Docs: ",{"type":17,"tag":133,"props":342027,"children":342029},{"href":107070,"rel":342028},[214],[342030],{"type":23,"value":27356},{"type":17,"tag":239,"props":342032,"children":342034},{"id":342033},"integration-linear-unified-task-management-api",[342035],{"type":17,"tag":48,"props":342036,"children":342037},{},[342038],{"type":23,"value":342039},"Integration: Linear (unified Task Management API)",{"type":17,"tag":29,"props":342041,"children":342042},{},[342043],{"type":17,"tag":6438,"props":342044,"children":342047},{"alt":342045,"src":342046},"unified-linear.png","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2024_product_updates-5.png",[],{"type":17,"tag":29,"props":342049,"children":342050},{},[342051],{"type":17,"tag":48,"props":342052,"children":342053},{},[342054],{"type":23,"value":342055},"Object: Link",{"type":17,"tag":29,"props":342057,"children":342058},{},[342059],{"type":23,"value":342060},"The enhancement to the pre-built Linear integration for the Task object includes:",{"type":17,"tag":80,"props":342062,"children":342063},{},[342064,342138],{"type":17,"tag":84,"props":342065,"children":342066},{},[342067,342072,342073,342078,342079,342084,342085,342090,342091,342096,342097,342102,342103,342108,342109,342114,342115,342120,342121,342126,342127,342132,342133],{"type":17,"tag":48,"props":342068,"children":342069},{},[342070],{"type":23,"value":342071},"New Writable Fields:",{"type":23,"value":18757},{"type":17,"tag":6121,"props":342074,"children":342076},{"className":342075},[],[342077],{"type":23,"value":124783},{"type":23,"value":11826},{"type":17,"tag":6121,"props":342080,"children":342082},{"className":342081},[],[342083],{"type":23,"value":124715},{"type":23,"value":11826},{"type":17,"tag":6121,"props":342086,"children":342088},{"className":342087},[],[342089],{"type":23,"value":24704},{"type":23,"value":11826},{"type":17,"tag":6121,"props":342092,"children":342094},{"className":342093},[],[342095],{"type":23,"value":15863},{"type":23,"value":11826},{"type":17,"tag":6121,"props":342098,"children":342100},{"className":342099},[],[342101],{"type":23,"value":6698},{"type":23,"value":11826},{"type":17,"tag":6121,"props":342104,"children":342106},{"className":342105},[],[342107],{"type":23,"value":18781},{"type":23,"value":11826},{"type":17,"tag":6121,"props":342110,"children":342112},{"className":342111},[],[342113],{"type":23,"value":164145},{"type":23,"value":11826},{"type":17,"tag":6121,"props":342116,"children":342118},{"className":342117},[],[342119],{"type":23,"value":124766},{"type":23,"value":11826},{"type":17,"tag":6121,"props":342122,"children":342124},{"className":342123},[],[342125],{"type":23,"value":124757},{"type":23,"value":11826},{"type":17,"tag":6121,"props":342128,"children":342130},{"className":342129},[],[342131],{"type":23,"value":124824},{"type":23,"value":12561},{"type":17,"tag":6121,"props":342134,"children":342136},{"className":342135},[],[342137],{"type":23,"value":124748},{"type":17,"tag":84,"props":342139,"children":342140},{},[342141,342146,342148,342153],{"type":17,"tag":48,"props":342142,"children":342143},{},[342144],{"type":23,"value":342145},"New Method:",{"type":23,"value":342147},"  ",{"type":17,"tag":6121,"props":342149,"children":342151},{"className":342150},[],[342152],{"type":23,"value":11254},{"type":23,"value":342154}," method for Task",{"type":17,"tag":29,"props":342156,"children":342157},{},[342158],{"type":23,"value":342159},"These enhancements provide more detailed project management and task tracking within your applications.",{"type":17,"tag":29,"props":342161,"children":342162},{},[342163],{"type":23,"value":342164},"Use case examples:",{"type":17,"tag":80,"props":342166,"children":342167},{},[342168,342197],{"type":17,"tag":84,"props":342169,"children":342170},{},[342171,342176,342178,342183,342184,342189,342190,342195],{"type":17,"tag":48,"props":342172,"children":342173},{},[342174],{"type":23,"value":342175},"Team collaboration platforms:",{"type":23,"value":342177}," Leverage new writable fields such as ",{"type":17,"tag":6121,"props":342179,"children":342181},{"className":342180},[],[342182],{"type":23,"value":164145},{"type":23,"value":276138},{"type":17,"tag":6121,"props":342185,"children":342187},{"className":342186},[],[342188],{"type":23,"value":124748},{"type":23,"value":12561},{"type":17,"tag":6121,"props":342191,"children":342193},{"className":342192},[],[342194],{"type":23,"value":6698},{"type":23,"value":342196}," to enhance user engagement. By tracking task followers and assignees, your users can improve accountability and communication.",{"type":17,"tag":84,"props":342198,"children":342199},{},[342200,342204,342206,342211,342213,342218],{"type":17,"tag":48,"props":342201,"children":342202},{},[342203],{"type":23,"value":24387},{"type":23,"value":342205},": AI models can use priority and ",{"type":17,"tag":6121,"props":342207,"children":342209},{"className":342208},[],[342210],{"type":23,"value":124766},{"type":23,"value":342212},"to dynamically adjust task schedules based on workload and deadlines. The create method allows AI assistants to automatically generate tasks from user inputs, emails, or other sources like ",{"type":17,"tag":133,"props":342214,"children":342216},{"href":23930,"rel":342215},[214],[342217],{"type":23,"value":254620},{"type":23,"value":54},{"type":17,"tag":29,"props":342220,"children":342221},{},[342222,342223],{"type":23,"value":342025},{"type":17,"tag":133,"props":342224,"children":342227},{"href":342225,"rel":342226},"https://docs.unified.to/task/overview",[214],[342228],{"type":23,"value":333890},{"type":17,"tag":68,"props":342230,"children":342232},{"id":342231},"community-updates",[342233],{"type":23,"value":342234},"Community updates",{"type":17,"tag":29,"props":342236,"children":342237},{},[342238],{"type":17,"tag":6438,"props":342239,"children":342242},{"alt":342240,"src":342241},"MGS-20.jpg","https://s3.us-east-2.amazonaws.com/unified-article-images/july_2024_product_updates-6.jpg",[],{"type":17,"tag":29,"props":342244,"children":342245},{},[342246,342248,342255],{"type":23,"value":342247},"We had our first developer and tech community meetup in Toronto this month. Over the last year, we've participated in other conferences and community events, including Editions by Shopify, but last night, we hosted our first IRL meetup, APIs & IPAs: AI for Frontend Teams & Data for AI Agent, in partnership with ",{"type":17,"tag":133,"props":342249,"children":342252},{"href":342250,"rel":342251},"https://rangle.io/",[214],[342253],{"type":23,"value":342254},"Rangle",{"type":23,"value":342256},". There were more than 100 attendees. We're grateful for everyone who showed up to connect and learn more about how to leverage AI and APIs!",{"type":17,"tag":29,"props":342258,"children":342259},{},[342260,342262,342268,342269,342275],{"type":23,"value":342261},"Ready to get integrations out of the backlog and grow your application? Most Unified.to customers launch all their integrations in a week. ",{"type":17,"tag":133,"props":342263,"children":342265},{"href":1612,"rel":342264},[214],[342266],{"type":23,"value":342267},"Try Unified.to for free",{"type":23,"value":75890},{"type":17,"tag":133,"props":342270,"children":342272},{"href":215330,"rel":342271},[214],[342273],{"type":23,"value":342274},"request a demo",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":342277},[342278,342279,342280,342281,342282,342283,342288],{"id":243535,"depth":1629,"text":341463},{"id":341544,"depth":1629,"text":341547},{"id":341617,"depth":1629,"text":341620},{"id":341647,"depth":1629,"text":6341},{"id":11629,"depth":1629,"text":11632},{"id":336845,"depth":1629,"text":336848,"children":342284},[342285,342286,342287],{"id":341785,"depth":1635,"text":341791},{"id":341955,"depth":1635,"text":341958},{"id":342033,"depth":1635,"text":342039},{"id":342231,"depth":1629,"text":342234},"content:blog:july_2024_product_updates.md","blog/july_2024_product_updates.md","blog/july_2024_product_updates",{"_path":342293,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":342294,"description":342295,"img":342296,"date":342297,"tag":6341,"body":342298,"_type":1677,"_id":342454,"_source":1679,"_file":342455,"_stem":342456,"_extension":1682},"/blog/how_to_filter_webhook_events","How to filter webhook events","Webhook filters allow you to only receive data about the events you care about. For instance, if you're subscribed to CRM Deal events from ActiveCampaign, you...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_filter_webhook_events-icon.png","2024-07-24T00:00:00.000Z",{"type":14,"children":342299,"toc":342452},[342300,342305,342308,342316,342328,342356,342373,342378,342386,342398,342410,342418,342431,342440],{"type":17,"tag":18,"props":342301,"children":342303},{"id":342302},"how-to-filter-webhook-events",[342304],{"type":23,"value":342294},{"type":17,"tag":25,"props":342306,"children":342307},{},[],{"type":17,"tag":29,"props":342309,"children":342310},{},[342311],{"type":17,"tag":33,"props":342312,"children":342313},{},[342314],{"type":23,"value":342315},"July 24, 2024",{"type":17,"tag":29,"props":342317,"children":342318},{},[342319,342321,342326],{"type":23,"value":342320},"Webhook filters allow you to only receive data about the events you care about. For instance, if you're subscribed to CRM Deal events from ActiveCampaign, you could filter by ",{"type":17,"tag":6121,"props":342322,"children":342324},{"className":342323},[],[342325],{"type":23,"value":27299},{"type":23,"value":342327}," to receive data only about deals for a specific company.",{"type":17,"tag":29,"props":342329,"children":342330},{},[342331,342333,342337,342338,342342,342344,342348,342350],{"type":23,"value":342332},"Please note that filters are only supported for ",{"type":17,"tag":48,"props":342334,"children":342335},{},[342336],{"type":23,"value":98509},{"type":23,"value":18757},{"type":17,"tag":133,"props":342339,"children":342340},{"href":4999},[342341],{"type":23,"value":5002},{"type":23,"value":342343}," at this moment, with few exceptions (e.g. Box supports native webhook filtering). Read more about the differences between native and ",{"type":17,"tag":133,"props":342345,"children":342346},{"href":9007},[342347],{"type":23,"value":46572},{"type":23,"value":342349}," here: ",{"type":17,"tag":133,"props":342351,"children":342354},{"href":342352,"rel":342353},"https://docs.unified.to/guides/understanding_virtual_webhooks",[214],[342355],{"type":23,"value":339756},{"type":17,"tag":29,"props":342357,"children":342358},{},[342359,342361,342366,342367,342372],{"type":23,"value":342360},"Filter availability varies by integration type and data model. To determine which filters are supported for a particular virtual webhook, refer to the 'List' section on the Feature Support page of the respective integration. Parameters that end in ",{"type":17,"tag":6121,"props":342362,"children":342364},{"className":342363},[],[342365],{"type":23,"value":201682},{"type":23,"value":75890},{"type":17,"tag":6121,"props":342368,"children":342370},{"className":342369},[],[342371],{"type":23,"value":27310},{"type":23,"value":340065},{"type":17,"tag":29,"props":342374,"children":342375},{},[342376],{"type":23,"value":342377},"For example, this is the Feature Support list for CRM Deals by ActiveCampaign:",{"type":17,"tag":29,"props":342379,"children":342380},{},[342381],{"type":17,"tag":6438,"props":342382,"children":342385},{"alt":342383,"src":342384},"CRM_Deal.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_filter_webhook_events-0.png",[],{"type":17,"tag":29,"props":342387,"children":342388},{},[342389,342391,342396],{"type":23,"value":342390},"Notice that this data model supports virtual webhooks as specified under ‘Webhook.' Under ‘List Options', the parameter ",{"type":17,"tag":6121,"props":342392,"children":342394},{"className":342393},[],[342395],{"type":23,"value":27299},{"type":23,"value":342397}," is shown, indicating that it is possible to use this as a filter.",{"type":17,"tag":29,"props":342399,"children":342400},{},[342401,342403,342408],{"type":23,"value":342402},"When creating webhooks via the ",{"type":17,"tag":133,"props":342404,"children":342406},{"href":42620,"rel":342405},[214],[342407],{"type":23,"value":217},{"type":23,"value":342409}," web app, you can specify your filter parameters in the webhook creation form:",{"type":17,"tag":29,"props":342411,"children":342412},{},[342413],{"type":17,"tag":6438,"props":342414,"children":342417},{"alt":342415,"src":342416},"Webhook_creation.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_filter_webhook_events-1.png",[],{"type":17,"tag":29,"props":342419,"children":342420},{},[342421,342423,342429],{"type":23,"value":342422},"When creating a webhook programatically via our API, you can include ",{"type":17,"tag":6121,"props":342424,"children":342426},{"className":342425},[],[342427],{"type":23,"value":342428},"filters",{"type":23,"value":342430}," in the payload with a string dictionary of values to filter by. For example, in Javascript:",{"type":17,"tag":6893,"props":342432,"children":342435},{"className":342433,"code":342434,"language":6898,"meta":7},[6896],"const options = {\n  method: 'POST',\n  url: 'https://api.unified.to/unified/webhook',\n  headers: {\n    authorization: 'bearer YOUR_ACCESS_TOKEN'\n  },\n  data: {\n    filters: {\n      company_id: '12345',\n    },\n    // other payload data if needed\n  },\n};\n\nconst results = await axios.request(options);\n",[342436],{"type":17,"tag":6121,"props":342437,"children":342438},{"__ignoreMap":7},[342439],{"type":23,"value":342434},{"type":17,"tag":29,"props":342441,"children":342442},{},[342443,342445,342451],{"type":23,"value":342444},"Review our complete guide on the webhook API here: ",{"type":17,"tag":133,"props":342446,"children":342448},{"href":330059,"rel":342447},[214],[342449],{"type":23,"value":342450},"Create webhook subscriptions",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":342453},[],"content:blog:how_to_filter_webhook_events.md","blog/how_to_filter_webhook_events.md","blog/how_to_filter_webhook_events",{"_path":342458,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":342459,"description":342460,"img":342461,"date":342462,"tag":12,"body":342463,"_type":1677,"_id":342987,"_source":1679,"_file":342988,"_stem":342989,"_extension":1682},"/blog/june_2024_product_updates","June 2024 product updates","That's a wrap on June! There's a lot to cover, so we've summarized the top highlights of the month. For a detailed list of everything we shipped, read our...","https://s3.us-east-2.amazonaws.com/unified-article-images/june_2024_product_updates-icon.png","2024-06-27T00:00:00.000Z",{"type":14,"children":342464,"toc":342978},[342465,342470,342473,342481,342489,342500,342506,342517,342525,342531,342539,342552,342557,342584,342588,342601,342611,342617,342625,342661,342672,342699,342703,342716,342725,342731,342736,342741,342761,342769,342775,342780,342894,342903,342909,342917,342922,342931,342937,342951,342961],{"type":17,"tag":18,"props":342466,"children":342468},{"id":342467},"june-2024-product-updates",[342469],{"type":23,"value":342459},{"type":17,"tag":25,"props":342471,"children":342472},{},[],{"type":17,"tag":29,"props":342474,"children":342475},{},[342476],{"type":17,"tag":33,"props":342477,"children":342478},{},[342479],{"type":23,"value":342480},"June 27, 2024",{"type":17,"tag":29,"props":342482,"children":342483},{},[342484],{"type":17,"tag":6438,"props":342485,"children":342488},{"alt":342486,"src":342487},"Product_Releases_-Unified_API%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/june_2024_product_updates-0.png",[],{"type":17,"tag":29,"props":342490,"children":342491},{},[342492,342494,342499],{"type":23,"value":342493},"That's a wrap on June! There's a lot to cover, so we've summarized the top highlights of the month. For a detailed list of everything we shipped, read our ",{"type":17,"tag":133,"props":342495,"children":342497},{"href":47029,"rel":342496},[214],[342498],{"type":23,"value":47033},{"type":23,"value":54},{"type":17,"tag":68,"props":342501,"children":342503},{"id":342502},"_200-integrations",[342504],{"type":23,"value":342505},"200+ integrations",{"type":17,"tag":29,"props":342507,"children":342508},{},[342509,342511,342515],{"type":23,"value":342510},"Last month, we talked about being the fastest ",{"type":17,"tag":133,"props":342512,"children":342513},{"href":7691},[342514],{"type":23,"value":7459},{"type":23,"value":342516}," platform to ship new integrations. This month, we shipped our 200th integration. As a customer, you only need to integrate once to launch 200+ product integrations in days instead of months or years. Our unified API gives you access to normalized, real-time customer data from 16+ API categories like Messaging, Accounting, File Storage and CRM.",{"type":17,"tag":29,"props":342518,"children":342519},{},[342520],{"type":17,"tag":133,"props":342521,"children":342523},{"href":87026,"rel":342522},[214],[342524],{"type":23,"value":341766},{"type":17,"tag":68,"props":342526,"children":342528},{"id":342527},"introducing-unified-task-management-api",[342529],{"type":23,"value":342530},"Introducing: unified Task Management API",{"type":17,"tag":29,"props":342532,"children":342533},{},[342534],{"type":17,"tag":6438,"props":342535,"children":342538},{"alt":342536,"src":342537},"unified-task-management-api.png","https://s3.us-east-2.amazonaws.com/unified-article-images/june_2024_product_updates-1.png",[],{"type":17,"tag":29,"props":342540,"children":342541},{},[342542,342544,342550],{"type":23,"value":342543},"We released our ",{"type":17,"tag":133,"props":342545,"children":342547},{"href":330845,"rel":342546},[214],[342548],{"type":23,"value":342549},"Task Management AP",{"type":23,"value":342551},"I this month! Access your customers' project and task data from the top task management applications through a single API.",{"type":17,"tag":29,"props":342553,"children":342554},{},[342555],{"type":23,"value":342556},"Our unified Task Management API initially supports:",{"type":17,"tag":80,"props":342558,"children":342559},{},[342560,342564,342568,342572,342576,342580],{"type":17,"tag":84,"props":342561,"children":342562},{},[342563],{"type":23,"value":12551},{"type":17,"tag":84,"props":342565,"children":342566},{},[342567],{"type":23,"value":13040},{"type":17,"tag":84,"props":342569,"children":342570},{},[342571],{"type":23,"value":12568},{"type":17,"tag":84,"props":342573,"children":342574},{},[342575],{"type":23,"value":13311},{"type":17,"tag":84,"props":342577,"children":342578},{},[342579],{"type":23,"value":12559},{"type":17,"tag":84,"props":342581,"children":342582},{},[342583],{"type":23,"value":13302},{"type":17,"tag":29,"props":342585,"children":342586},{},[342587],{"type":23,"value":217214},{"type":17,"tag":80,"props":342589,"children":342590},{},[342591,342596],{"type":17,"tag":84,"props":342592,"children":342593},{},[342594],{"type":23,"value":342595},"Build an AI algorithm that analyzes task attributes like dates, priority levels, and workload distribution to automatically prioritize tasks.",{"type":17,"tag":84,"props":342597,"children":342598},{},[342599],{"type":23,"value":342600},"Predict project completion dates and potential bottlenecks by examining historical task data and help your end-users implement corrective actions to keep projects on track.",{"type":17,"tag":29,"props":342602,"children":342603},{},[342604],{"type":17,"tag":133,"props":342605,"children":342608},{"href":342606,"rel":342607},"https://unified.to/blog/introducing_unified_task_management_api",[214],[342609],{"type":23,"value":342610},"Read the release article",{"type":17,"tag":68,"props":342612,"children":342614},{"id":342613},"ai-foundations-unified-ticketing-api",[342615],{"type":23,"value":342616},"AI foundations: unified Ticketing API",{"type":17,"tag":29,"props":342618,"children":342619},{},[342620],{"type":17,"tag":6438,"props":342621,"children":342624},{"alt":342622,"src":342623},"unified-ticketing-api.png","https://s3.us-east-2.amazonaws.com/unified-article-images/june_2024_product_updates-2.png",[],{"type":17,"tag":29,"props":342626,"children":342627},{},[342628,342630,342635,342636,342641,342642,342647,342648,342654,342655,342660],{"type":23,"value":342629},"If you're building an AI application, we have foundational API categories that can help differentiate your AI agent, assistant, or insights application with real-time customer data that's been meticulously cleaned and structured. Those include: ",{"type":17,"tag":133,"props":342631,"children":342633},{"href":29953,"rel":342632},[214],[342634],{"type":23,"value":72401},{"type":23,"value":11826},{"type":17,"tag":133,"props":342637,"children":342639},{"href":76521,"rel":342638},[214],[342640],{"type":23,"value":24559},{"type":23,"value":11826},{"type":17,"tag":133,"props":342643,"children":342645},{"href":330845,"rel":342644},[214],[342646],{"type":23,"value":110979},{"type":23,"value":11826},{"type":17,"tag":133,"props":342649,"children":342651},{"href":23930,"rel":342650},[214],[342652],{"type":23,"value":342653},"KMS & Help Center",{"type":23,"value":12561},{"type":17,"tag":133,"props":342656,"children":342658},{"href":32673,"rel":342657},[214],[342659],{"type":23,"value":24541},{"type":23,"value":54},{"type":17,"tag":29,"props":342662,"children":342663},{},[342664,342666,342670],{"type":23,"value":342665},"We've recently enhanced our ",{"type":17,"tag":133,"props":342667,"children":342668},{"href":31987},[342669],{"type":23,"value":150656},{"type":23,"value":342671}," with new integrations:",{"type":17,"tag":80,"props":342673,"children":342674},{},[342675,342679,342683,342687,342691,342695],{"type":17,"tag":84,"props":342676,"children":342677},{},[342678],{"type":23,"value":25375},{"type":17,"tag":84,"props":342680,"children":342681},{},[342682],{"type":23,"value":32717},{"type":17,"tag":84,"props":342684,"children":342685},{},[342686],{"type":23,"value":3184},{"type":17,"tag":84,"props":342688,"children":342689},{},[342690],{"type":23,"value":15729},{"type":17,"tag":84,"props":342692,"children":342693},{},[342694],{"type":23,"value":23984},{"type":17,"tag":84,"props":342696,"children":342697},{},[342698],{"type":23,"value":15738},{"type":17,"tag":29,"props":342700,"children":342701},{},[342702],{"type":23,"value":217214},{"type":17,"tag":80,"props":342704,"children":342705},{},[342706,342711],{"type":17,"tag":84,"props":342707,"children":342708},{},[342709],{"type":23,"value":342710},"By integrating real-time data from ticketing systems via a unified API, AI models can predict potential future customer issues based on historical patterns. This enables proactive alerts, reduces resolution time, and improves customer satisfaction before issues escalate.",{"type":17,"tag":84,"props":342712,"children":342713},{},[342714],{"type":23,"value":342715},"Using the unified Ticketing API, AI-driven sentiment analysis can classify customer feedback as positive, negative, or neutral, allowing for the automatic categorization and handling of issues.",{"type":17,"tag":29,"props":342717,"children":342718},{},[342719],{"type":17,"tag":133,"props":342720,"children":342722},{"href":32673,"rel":342721},[214],[342723],{"type":23,"value":342724},"Learn more",{"type":17,"tag":68,"props":342726,"children":342728},{"id":342727},"enhancement-unified-kms-and-help-center-api",[342729],{"type":23,"value":342730},"Enhancement: unified KMS and Help Center API",{"type":17,"tag":29,"props":342732,"children":342733},{},[342734],{"type":23,"value":342735},"We introduced our unified Knowledge Management System (KMS) API in May, featuring pre-built integrations with Notion, Confluence, Guru, and Coda. These systems provide access to your customers' institutional knowledge, such as meeting notes, project documents, and employee handbooks. We've since expanded this API to include Help Center data, enabling access to your customers' support knowledge.",{"type":17,"tag":29,"props":342737,"children":342738},{},[342739],{"type":23,"value":342740},"We've add the following help center systems to this API:",{"type":17,"tag":80,"props":342742,"children":342743},{},[342744,342748,342753,342757],{"type":17,"tag":84,"props":342745,"children":342746},{},[342747],{"type":23,"value":25375},{"type":17,"tag":84,"props":342749,"children":342750},{},[342751],{"type":23,"value":342752},"Helpscout",{"type":17,"tag":84,"props":342754,"children":342755},{},[342756],{"type":23,"value":15729},{"type":17,"tag":84,"props":342758,"children":342759},{},[342760],{"type":23,"value":23984},{"type":17,"tag":29,"props":342762,"children":342763},{},[342764],{"type":17,"tag":133,"props":342765,"children":342767},{"href":23930,"rel":342766},[214],[342768],{"type":23,"value":342724},{"type":17,"tag":68,"props":342770,"children":342772},{"id":342771},"other-new-integrations",[342773],{"type":23,"value":342774},"Other new integrations",{"type":17,"tag":29,"props":342776,"children":342777},{},[342778],{"type":23,"value":342779},"We've added 36 integrations to our platform in the last 40 days! Here are some of the newest integrations you can add to your application right now:",{"type":17,"tag":80,"props":342781,"children":342782},{},[342783,342793,342805,342816,342827,342839,342851,342862,342872,342883],{"type":17,"tag":84,"props":342784,"children":342785},{},[342786,342791],{"type":17,"tag":133,"props":342787,"children":342789},{"href":331178,"rel":342788},[214],[342790],{"type":23,"value":38887},{"type":23,"value":342792}," (E-commerce)",{"type":17,"tag":84,"props":342794,"children":342795},{},[342796,342803],{"type":17,"tag":133,"props":342797,"children":342800},{"href":342798,"rel":342799},"https://unified.to/integrations/ironclad",[214],[342801],{"type":23,"value":342802},"Ironclad ",{"type":23,"value":342804},"(File Storage, Authentication)",{"type":17,"tag":84,"props":342806,"children":342807},{},[342808,342815],{"type":17,"tag":133,"props":342809,"children":342812},{"href":342810,"rel":342811},"https://unified.to/integrations/paylocityrecruiting",[214],[342813],{"type":23,"value":342814},"Paylocity Recruiting",{"type":23,"value":341747},{"type":17,"tag":84,"props":342817,"children":342818},{},[342819,342825],{"type":17,"tag":133,"props":342820,"children":342823},{"href":342821,"rel":342822},"https://unified.to/integrations/cultureamp",[214],[342824],{"type":23,"value":60969},{"type":23,"value":342826}," (HR & Directory)",{"type":17,"tag":84,"props":342828,"children":342829},{},[342830,342837],{"type":17,"tag":133,"props":342831,"children":342834},{"href":342832,"rel":342833},"https://unified.to/integrations/zenefits",[214],[342835],{"type":23,"value":342836},"Zenefits",{"type":23,"value":342838}," (HR & Directory, Authentication)",{"type":17,"tag":84,"props":342840,"children":342841},{},[342842,342849],{"type":17,"tag":133,"props":342843,"children":342846},{"href":342844,"rel":342845},"https://unified.to/integrations/zohopeople",[214],[342847],{"type":23,"value":342848},"Zoho People ",{"type":23,"value":342850},"(HR & Directory)",{"type":17,"tag":84,"props":342852,"children":342853},{},[342854,342860],{"type":17,"tag":133,"props":342855,"children":342858},{"href":342856,"rel":342857},"http://circle.so/",[214],[342859],{"type":23,"value":155317},{"type":23,"value":342861}," (Messaging)",{"type":17,"tag":84,"props":342863,"children":342864},{},[342865,342871],{"type":17,"tag":133,"props":342866,"children":342869},{"href":342867,"rel":342868},"https://unified.to/integrations/humanforce",[214],[342870],{"type":23,"value":57554},{"type":23,"value":342826},{"type":17,"tag":84,"props":342873,"children":342874},{},[342875,342882],{"type":17,"tag":133,"props":342876,"children":342879},{"href":342877,"rel":342878},"https://unified.to/integrations/ukgpro",[214],[342880],{"type":23,"value":342881},"UKG Pro",{"type":23,"value":342826},{"type":17,"tag":84,"props":342884,"children":342885},{},[342886,342892],{"type":17,"tag":133,"props":342887,"children":342890},{"href":342888,"rel":342889},"https://unified.to/integrations/cohere",[214],[342891],{"type":23,"value":16525},{"type":23,"value":342893}," (Generative AI)",{"type":17,"tag":29,"props":342895,"children":342896},{},[342897],{"type":17,"tag":133,"props":342898,"children":342900},{"href":47029,"rel":342899},[214],[342901],{"type":23,"value":342902},"See more enhancements",{"type":17,"tag":68,"props":342904,"children":342906},{"id":342905},"website-update",[342907],{"type":23,"value":342908},"Website update",{"type":17,"tag":29,"props":342910,"children":342911},{},[342912],{"type":17,"tag":6438,"props":342913,"children":342916},{"alt":342914,"src":342915},"unified-g2-2024_%283%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/june_2024_product_updates-3.png",[],{"type":17,"tag":29,"props":342918,"children":342919},{},[342920],{"type":23,"value":342921},"We made some changes to our website. In addition to our dark mode, we've added more content around our features and how they specifically help product developers building AI applications. We look forward to making more changes over the coming months.",{"type":17,"tag":29,"props":342923,"children":342924},{},[342925],{"type":17,"tag":133,"props":342926,"children":342928},{"href":212,"rel":342927},[214],[342929],{"type":23,"value":342930},"View the website",{"type":17,"tag":68,"props":342932,"children":342934},{"id":342933},"community-meetup-in-toronto",[342935],{"type":23,"value":342936},"Community: Meetup in Toronto",{"type":17,"tag":29,"props":342938,"children":342939},{},[342940,342942,342949],{"type":23,"value":342941},"We're excited to co-host APIs and IPAs this month with ",{"type":17,"tag":133,"props":342943,"children":342946},{"href":342944,"rel":342945},"http://rangle.io/",[214],[342947],{"type":23,"value":342948},"Rangle.io",{"type":23,"value":342950},". If you're in Toronto on July 30 and want to connect with senior developers, designers, and tech enthusiasts, join us for an evening of community. We'll have beer, wine, non-alcoholic beverages, and snacks available. The event will have two talks focused on AI: how front-end engineers can leverage AI and how to use APIs to build differentiated AI agents.",{"type":17,"tag":29,"props":342952,"children":342953},{},[342954],{"type":17,"tag":133,"props":342955,"children":342958},{"href":342956,"rel":342957},"https://www.meetup.com/apis-and-ipas/events/301857208/",[214],[342959],{"type":23,"value":342960},"Register here",{"type":17,"tag":29,"props":342962,"children":342963},{},[342964,342965,342971,342972,342977],{"type":23,"value":342261},{"type":17,"tag":133,"props":342966,"children":342968},{"href":1612,"rel":342967},[214],[342969],{"type":23,"value":342970},"Try Unified.to for free ",{"type":23,"value":33669},{"type":17,"tag":133,"props":342973,"children":342975},{"href":215330,"rel":342974},[214],[342976],{"type":23,"value":342274},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":342979},[342980,342981,342982,342983,342984,342985,342986],{"id":342502,"depth":1629,"text":342505},{"id":342527,"depth":1629,"text":342530},{"id":342613,"depth":1629,"text":342616},{"id":342727,"depth":1629,"text":342730},{"id":342771,"depth":1629,"text":342774},{"id":342905,"depth":1629,"text":342908},{"id":342933,"depth":1629,"text":342936},"content:blog:june_2024_product_updates.md","blog/june_2024_product_updates.md","blog/june_2024_product_updates",{"_path":342991,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":342992,"description":342993,"img":342994,"date":342462,"tag":12,"body":342995,"_type":1677,"_id":343397,"_source":1679,"_file":343398,"_stem":343399,"_extension":1682},"/blog/unified_task_management_api_real_time_access_to_tasks_projects_and_work_state_across_platforms","Unified Task Management API: Real-Time Access to Tasks, Projects, and Work State Across Platforms","If your product integrates with task management systems, you quickly run into fragmented APIs, inconsistent task models, and different ways of representing...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_task_management_api_real_time_access_to_tasks_projects_and_work_state_across_platforms-icon.png",{"type":14,"children":342996,"toc":343385},[342997,343002,343005,343012,343019,343024,343029,343033,343060,343065,343071,343076,343094,343099,343105,343144,343149,343155,343160,343176,343185,343190,343196,343201,343206,343229,343234,343240,343245,343268,343273,343279,343307,343311,343339,343344,343349,343353,343358],{"type":17,"tag":18,"props":342998,"children":343000},{"id":342999},"unified-task-management-api-real-time-access-to-tasks-projects-and-work-state-across-platforms",[343001],{"type":23,"value":342992},{"type":17,"tag":25,"props":343003,"children":343004},{},[],{"type":17,"tag":29,"props":343006,"children":343007},{},[343008],{"type":17,"tag":33,"props":343009,"children":343010},{},[343011],{"type":23,"value":342480},{"type":17,"tag":29,"props":343013,"children":343014},{},[343015],{"type":17,"tag":6438,"props":343016,"children":343018},{"alt":342536,"src":343017},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_task_management_api_real_time_access_to_tasks_projects_and_work_state_across_platforms-0.png",[],{"type":17,"tag":29,"props":343020,"children":343021},{},[343022],{"type":23,"value":343023},"If your product integrates with task management systems, you quickly run into fragmented APIs, inconsistent task models, and different ways of representing projects, assignments, and status.",{"type":17,"tag":29,"props":343025,"children":343026},{},[343027],{"type":23,"value":343028},"The Unified Task Management API provides a single interface to access and manage tasks across platforms—while enabling systems and AI agents to operate on real-time work state. It acts as a unified execution layer for task and project data, where systems can read, update, and act on work across tools through one API.",{"type":17,"tag":68,"props":343030,"children":343031},{"id":25342},[343032],{"type":23,"value":216065},{"type":17,"tag":80,"props":343034,"children":343035},{},[343036,343040,343044,343048,343052,343056],{"type":17,"tag":84,"props":343037,"children":343038},{},[343039],{"type":23,"value":12551},{"type":17,"tag":84,"props":343041,"children":343042},{},[343043],{"type":23,"value":13040},{"type":17,"tag":84,"props":343045,"children":343046},{},[343047],{"type":23,"value":12568},{"type":17,"tag":84,"props":343049,"children":343050},{},[343051],{"type":23,"value":13311},{"type":17,"tag":84,"props":343053,"children":343054},{},[343055],{"type":23,"value":12559},{"type":17,"tag":84,"props":343057,"children":343058},{},[343059],{"type":23,"value":13302},{"type":17,"tag":29,"props":343061,"children":343062},{},[343063],{"type":23,"value":343064},"Additional task management integrations are expanding as part of this category.",{"type":17,"tag":68,"props":343066,"children":343068},{"id":343067},"unified-task-and-project-model-across-platforms",[343069],{"type":23,"value":343070},"Unified task and project model across platforms",{"type":17,"tag":29,"props":343072,"children":343073},{},[343074],{"type":23,"value":343075},"The Task Management API standardizes core concepts across providers:",{"type":17,"tag":80,"props":343077,"children":343078},{},[343079,343084,343089],{"type":17,"tag":84,"props":343080,"children":343081},{},[343082],{"type":23,"value":343083},"Tasks, projects, and assignments follow consistent schemas",{"type":17,"tag":84,"props":343085,"children":343086},{},[343087],{"type":23,"value":343088},"Status, priority, and due dates are normalized",{"type":17,"tag":84,"props":343090,"children":343091},{},[343092],{"type":23,"value":343093},"Relationships between tasks, users, and projects are structured consistently",{"type":17,"tag":29,"props":343095,"children":343096},{},[343097],{"type":23,"value":343098},"This allows systems to work with task data without handling provider-specific formats.",{"type":17,"tag":68,"props":343100,"children":343102},{"id":343101},"core-objects-in-the-task-management-api",[343103],{"type":23,"value":343104},"Core objects in the Task Management API",{"type":17,"tag":80,"props":343106,"children":343107},{},[343108,343117,343126,343135],{"type":17,"tag":84,"props":343109,"children":343110},{},[343111,343115],{"type":17,"tag":48,"props":343112,"children":343113},{},[343114],{"type":23,"value":123499},{"type":23,"value":343116},": collections of tasks and workstreams",{"type":17,"tag":84,"props":343118,"children":343119},{},[343120,343124],{"type":17,"tag":48,"props":343121,"children":343122},{},[343123],{"type":23,"value":164050},{"type":23,"value":343125},": individual units of work, including status and metadata",{"type":17,"tag":84,"props":343127,"children":343128},{},[343129,343133],{"type":17,"tag":48,"props":343130,"children":343131},{},[343132],{"type":23,"value":31629},{"type":23,"value":343134},": discussions and updates on tasks",{"type":17,"tag":84,"props":343136,"children":343137},{},[343138,343142],{"type":17,"tag":48,"props":343139,"children":343140},{},[343141],{"type":23,"value":164271},{"type":23,"value":343143},": activity history and updates to tasks",{"type":17,"tag":29,"props":343145,"children":343146},{},[343147],{"type":23,"value":343148},"These objects follow consistent schemas across providers, reducing the need to handle platform-specific task structures.",{"type":17,"tag":68,"props":343150,"children":343152},{"id":343151},"real-time-task-data-and-actions",[343153],{"type":23,"value":343154},"Real-time task data and actions",{"type":17,"tag":29,"props":343156,"children":343157},{},[343158],{"type":23,"value":343159},"The Task Management API retrieves and updates data in real time:",{"type":17,"tag":80,"props":343161,"children":343162},{},[343163,343167,343171],{"type":17,"tag":84,"props":343164,"children":343165},{},[343166],{"type":23,"value":332414},{"type":17,"tag":84,"props":343168,"children":343169},{},[343170],{"type":23,"value":332419},{"type":17,"tag":84,"props":343172,"children":343173},{},[343174],{"type":23,"value":343175},"No stored task data",{"type":17,"tag":29,"props":343177,"children":343178},{},[343179,343183],{"type":17,"tag":133,"props":343180,"children":343181},{"href":4999},[343182],{"type":23,"value":43896},{"type":23,"value":343184}," provide updates for task changes, assignments, and status updates.",{"type":17,"tag":29,"props":343186,"children":343187},{},[343188],{"type":23,"value":343189},"The API supports both read and write operations, allowing systems to create tasks, update status, assign work, and track progress across platforms.",{"type":17,"tag":68,"props":343191,"children":343193},{"id":343192},"ai-task-data-operating-on-real-time-work-state",[343194],{"type":23,"value":343195},"AI + task data: operating on real-time work state",{"type":17,"tag":29,"props":343197,"children":343198},{},[343199],{"type":23,"value":343200},"The Task Management API enables AI systems to operate directly on active work.",{"type":17,"tag":29,"props":343202,"children":343203},{},[343204],{"type":23,"value":343205},"This allows applications to:",{"type":17,"tag":80,"props":343207,"children":343208},{},[343209,343214,343219,343224],{"type":17,"tag":84,"props":343210,"children":343211},{},[343212],{"type":23,"value":343213},"Analyze current task state across projects",{"type":17,"tag":84,"props":343215,"children":343216},{},[343217],{"type":23,"value":343218},"Prioritize work based on deadlines, dependencies, and workload",{"type":17,"tag":84,"props":343220,"children":343221},{},[343222],{"type":23,"value":343223},"Identify blockers and stalled tasks",{"type":17,"tag":84,"props":343225,"children":343226},{},[343227],{"type":23,"value":343228},"Generate updates, summaries, or next actions",{"type":17,"tag":29,"props":343230,"children":343231},{},[343232],{"type":23,"value":343233},"Because data is accessed in real time, AI systems can reason over what work is happening now—not delayed or synced snapshots.",{"type":17,"tag":68,"props":343235,"children":343237},{"id":343236},"task-data-in-ai-workflows-and-automation",[343238],{"type":23,"value":343239},"Task data in AI workflows and automation",{"type":17,"tag":29,"props":343241,"children":343242},{},[343243],{"type":23,"value":343244},"Task data can be used as structured context for decision-making and execution:",{"type":17,"tag":80,"props":343246,"children":343247},{},[343248,343253,343258,343263],{"type":17,"tag":84,"props":343249,"children":343250},{},[343251],{"type":23,"value":343252},"Retrieve tasks and project state before generating outputs",{"type":17,"tag":84,"props":343254,"children":343255},{},[343256],{"type":23,"value":343257},"Combine task data with other systems (repository, messaging, CRM)",{"type":17,"tag":84,"props":343259,"children":343260},{},[343261],{"type":23,"value":343262},"Trigger actions such as creating tasks or updating status",{"type":17,"tag":84,"props":343264,"children":343265},{},[343266],{"type":23,"value":343267},"Coordinate workflows across tools through a single API",{"type":17,"tag":29,"props":343269,"children":343270},{},[343271],{"type":23,"value":343272},"This enables systems that don't just analyze work—but actively manage and execute it.",{"type":17,"tag":68,"props":343274,"children":343276},{"id":343275},"what-teams-build-with-the-task-management-api",[343277],{"type":23,"value":343278},"What teams build with the Task Management API",{"type":17,"tag":80,"props":343280,"children":343281},{},[343282,343287,343292,343297,343302],{"type":17,"tag":84,"props":343283,"children":343284},{},[343285],{"type":23,"value":343286},"AI agents that manage tasks and project execution",{"type":17,"tag":84,"props":343288,"children":343289},{},[343290],{"type":23,"value":343291},"Systems prioritizing and assigning work across teams",{"type":17,"tag":84,"props":343293,"children":343294},{},[343295],{"type":23,"value":343296},"Platforms aggregating tasks across multiple tools",{"type":17,"tag":84,"props":343298,"children":343299},{},[343300],{"type":23,"value":343301},"Automation systems triggered by task updates and changes",{"type":17,"tag":84,"props":343303,"children":343304},{},[343305],{"type":23,"value":343306},"Analytics platforms tracking productivity and execution",{"type":17,"tag":68,"props":343308,"children":343309},{"id":182585},[343310],{"type":23,"value":182588},{"type":17,"tag":80,"props":343312,"children":343313},{},[343314,343319,343324,343329,343334],{"type":17,"tag":84,"props":343315,"children":343316},{},[343317],{"type":23,"value":343318},"Product and project management platforms",{"type":17,"tag":84,"props":343320,"children":343321},{},[343322],{"type":23,"value":343323},"AI systems managing or coordinating work",{"type":17,"tag":84,"props":343325,"children":343326},{},[343327],{"type":23,"value":343328},"Automation platforms integrating task data",{"type":17,"tag":84,"props":343330,"children":343331},{},[343332],{"type":23,"value":343333},"Tools connecting work across multiple systems",{"type":17,"tag":84,"props":343335,"children":343336},{},[343337],{"type":23,"value":343338},"Teams building execution layers on top of task data",{"type":17,"tag":68,"props":343340,"children":343341},{"id":12594},[343342],{"type":23,"value":343343},"What is a task management API?",{"type":17,"tag":29,"props":343345,"children":343346},{},[343347],{"type":23,"value":343348},"A task management API allows developers to access and manage tasks, projects, and work data across platforms. A unified task management API standardizes how task data is accessed—and when combined with real-time access and write capabilities, enables systems to analyze and act on active work across tools.",{"type":17,"tag":68,"props":343350,"children":343351},{"id":332555},[343352],{"type":23,"value":332558},{"type":17,"tag":29,"props":343354,"children":343355},{},[343356],{"type":23,"value":343357},"The Task Management API is available on all Unified plans.",{"type":17,"tag":80,"props":343359,"children":343360},{},[343361,343369,343377],{"type":17,"tag":84,"props":343362,"children":343363},{},[343364],{"type":17,"tag":133,"props":343365,"children":343367},{"href":176923,"rel":343366},[214],[343368],{"type":23,"value":287157},{"type":17,"tag":84,"props":343370,"children":343371},{},[343372],{"type":17,"tag":133,"props":343373,"children":343375},{"href":1612,"rel":343374},[214],[343376],{"type":23,"value":215326},{"type":17,"tag":84,"props":343378,"children":343379},{},[343380],{"type":17,"tag":133,"props":343381,"children":343383},{"href":332588,"rel":343382},[214],[343384],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":343386},[343387,343388,343389,343390,343391,343392,343393,343394,343395,343396],{"id":25342,"depth":1629,"text":216065},{"id":343067,"depth":1629,"text":343070},{"id":343101,"depth":1629,"text":343104},{"id":343151,"depth":1629,"text":343154},{"id":343192,"depth":1629,"text":343195},{"id":343236,"depth":1629,"text":343239},{"id":343275,"depth":1629,"text":343278},{"id":182585,"depth":1629,"text":182588},{"id":12594,"depth":1629,"text":343343},{"id":332555,"depth":1629,"text":332558},"content:blog:unified_task_management_api_real_time_access_to_tasks_projects_and_work_state_across_platforms.md","blog/unified_task_management_api_real_time_access_to_tasks_projects_and_work_state_across_platforms.md","blog/unified_task_management_api_real_time_access_to_tasks_projects_and_work_state_across_platforms",{"_path":343401,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":343402,"description":343403,"img":343404,"date":343405,"tag":6341,"body":343406,"_type":1677,"_id":344430,"_source":1679,"_file":344431,"_stem":344432,"_extension":1682},"/blog/how_to_access_employees_and_users","How to access employees and users","How do you get information on a customer account's users and employees?","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_access_employees_and_users-icon.png","2024-06-25T00:00:00.000Z",{"type":14,"children":343407,"toc":344426},[343408,343413,343416,343424,343428,343449,343458,343481,343487,343498,344353,344358,344368,344378,344388,344393,344397],{"type":17,"tag":18,"props":343409,"children":343411},{"id":343410},"how-to-access-employees-and-users",[343412],{"type":23,"value":343402},{"type":17,"tag":25,"props":343414,"children":343415},{},[],{"type":17,"tag":29,"props":343417,"children":343418},{},[343419],{"type":17,"tag":33,"props":343420,"children":343421},{},[343422],{"type":23,"value":343423},"June 25, 2024",{"type":17,"tag":29,"props":343425,"children":343426},{},[343427],{"type":23,"value":343403},{"type":17,"tag":29,"props":343429,"children":343430},{},[343431,343433,343440,343441,343448],{"type":23,"value":343432},"The essential idea is that regardless of whether the integration involves an e-commerce, CRM, or accounting application, user information for a corporate account is consistently accessible through our unified HR API. This is achieved using the HR ",{"type":17,"tag":133,"props":343434,"children":343437},{"href":343435,"rel":343436},"https://docs.unified.to/hris/employee/Retrieve_an_employee",[214],[343438],{"type":23,"value":343439},"Get Employee",{"type":23,"value":34435},{"type":17,"tag":133,"props":343442,"children":343445},{"href":343443,"rel":343444},"https://docs.unified.to/hris/employee/List_all_employees",[214],[343446],{"type":23,"value":343447},"List Employees",{"type":23,"value":276347},{"type":17,"tag":6893,"props":343450,"children":343453},{"className":343451,"code":343452,"language":6898,"meta":7},[6896],"GET /hris/{connection_id}/employee\n\nGET /hris/{connection_id}/employee/{id}\n",[343454],{"type":17,"tag":6121,"props":343455,"children":343456},{"__ignoreMap":7},[343457],{"type":23,"value":343452},{"type":17,"tag":29,"props":343459,"children":343460},{},[343461,343463,343469,343474,343479],{"type":23,"value":343462},"There are approximately ",{"type":17,"tag":133,"props":343464,"children":343466},{"href":299728,"rel":343465},[214],[343467],{"type":23,"value":343468},"120 ",{"type":17,"tag":133,"props":343470,"children":343472},{"href":299728,"rel":343471},[214],[343473],{"type":23,"value":312964},{"type":17,"tag":133,"props":343475,"children":343477},{"href":299728,"rel":343476},[214],[343478],{"type":23,"value":18757},{"type":23,"value":343480},"that support the HR Employee endpoints.",{"type":17,"tag":239,"props":343482,"children":343484},{"id":343483},"employeeuser-ids-in-all-unified-data-models",[343485],{"type":23,"value":343486},"Employee/User IDs in all unified data models",{"type":17,"tag":29,"props":343488,"children":343489},{},[343490,343492,343496],{"type":23,"value":343491},"Here is a list of different objects across all our ",{"type":17,"tag":133,"props":343493,"children":343494},{"href":7691},[343495],{"type":23,"value":7459},{"type":23,"value":343497}," categories that link back to an HR Employee via their IDs. Note: We use the terms 'employee' and 'user' interchangeably.",{"type":17,"tag":7231,"props":343499,"children":343500},{},[343501,343523],{"type":17,"tag":7235,"props":343502,"children":343503},{},[343504],{"type":17,"tag":7239,"props":343505,"children":343506},{},[343507,343511,343515,343519],{"type":17,"tag":7243,"props":343508,"children":343509},{},[343510],{"type":23,"value":7247},{"type":17,"tag":7243,"props":343512,"children":343513},{},[343514],{"type":23,"value":230074},{"type":17,"tag":7243,"props":343516,"children":343517},{},[343518],{"type":23,"value":24651},{"type":17,"tag":7243,"props":343520,"children":343521},{},[343522],{"type":23,"value":24525},{"type":17,"tag":7259,"props":343524,"children":343525},{},[343526,343551,343576,343601,343626,343650,343673,343696,343720,343747,343772,343797,343822,343845,343871,343895,343920,343945,343969,343994,344019,344043,344068,344092,344116,344139,344162,344185,344210,344235,344259,344281,344303,344328],{"type":17,"tag":7239,"props":343527,"children":343528},{},[343529,343533,343542,343546],{"type":17,"tag":7266,"props":343530,"children":343531},{},[343532],{"type":23,"value":11756},{"type":17,"tag":7266,"props":343534,"children":343535},{},[343536],{"type":17,"tag":133,"props":343537,"children":343540},{"href":343538,"rel":343539},"https://docs.unified.to/ats/activity/model",[214],[343541],{"type":23,"value":33999},{"type":17,"tag":7266,"props":343543,"children":343544},{},[343545],{"type":23,"value":111357},{"type":17,"tag":7266,"props":343547,"children":343548},{},[343549],{"type":23,"value":343550},"The recruiters associated with this activity",{"type":17,"tag":7239,"props":343552,"children":343553},{},[343554,343558,343567,343571],{"type":17,"tag":7266,"props":343555,"children":343556},{},[343557],{"type":23,"value":11756},{"type":17,"tag":7266,"props":343559,"children":343560},{},[343561],{"type":17,"tag":133,"props":343562,"children":343565},{"href":343563,"rel":343564},"https://docs.unified.to/ats/candidate/model",[214],[343566],{"type":23,"value":117137},{"type":17,"tag":7266,"props":343568,"children":343569},{},[343570],{"type":23,"value":62582},{"type":17,"tag":7266,"props":343572,"children":343573},{},[343574],{"type":23,"value":343575},"The recruiter or hiring manager associated with this candidate",{"type":17,"tag":7239,"props":343577,"children":343578},{},[343579,343583,343592,343596],{"type":17,"tag":7266,"props":343580,"children":343581},{},[343582],{"type":23,"value":11756},{"type":17,"tag":7266,"props":343584,"children":343585},{},[343586],{"type":17,"tag":133,"props":343587,"children":343590},{"href":343588,"rel":343589},"https://docs.unified.to/ats/document/model",[214],[343591],{"type":23,"value":267682},{"type":17,"tag":7266,"props":343593,"children":343594},{},[343595],{"type":23,"value":62582},{"type":17,"tag":7266,"props":343597,"children":343598},{},[343599],{"type":23,"value":343600},"The user who created this document",{"type":17,"tag":7239,"props":343602,"children":343603},{},[343604,343608,343617,343621],{"type":17,"tag":7266,"props":343605,"children":343606},{},[343607],{"type":23,"value":11756},{"type":17,"tag":7266,"props":343609,"children":343610},{},[343611],{"type":17,"tag":133,"props":343612,"children":343615},{"href":343613,"rel":343614},"https://docs.unified.to/ats/interview/model",[214],[343616],{"type":23,"value":117386},{"type":17,"tag":7266,"props":343618,"children":343619},{},[343620],{"type":23,"value":111357},{"type":17,"tag":7266,"props":343622,"children":343623},{},[343624],{"type":23,"value":343625},"The employees that were in this interview",{"type":17,"tag":7239,"props":343627,"children":343628},{},[343629,343633,343642,343647],{"type":17,"tag":7266,"props":343630,"children":343631},{},[343632],{"type":23,"value":11756},{"type":17,"tag":7266,"props":343634,"children":343635},{},[343636],{"type":17,"tag":133,"props":343637,"children":343640},{"href":343638,"rel":343639},"https://docs.unified.to/ats/job/model",[214],[343641],{"type":23,"value":240137},{"type":17,"tag":7266,"props":343643,"children":343644},{},[343645],{"type":23,"value":343646},"recruiter_ids",{"type":17,"tag":7266,"props":343648,"children":343649},{},[],{"type":17,"tag":7239,"props":343651,"children":343652},{},[343653,343657,343665,343670],{"type":17,"tag":7266,"props":343654,"children":343655},{},[343656],{"type":23,"value":11756},{"type":17,"tag":7266,"props":343658,"children":343659},{},[343660],{"type":17,"tag":133,"props":343661,"children":343663},{"href":343638,"rel":343662},[214],[343664],{"type":23,"value":240137},{"type":17,"tag":7266,"props":343666,"children":343667},{},[343668],{"type":23,"value":343669},"hiring_manager_ids",{"type":17,"tag":7266,"props":343671,"children":343672},{},[],{"type":17,"tag":7239,"props":343674,"children":343675},{},[343676,343680,343689,343693],{"type":17,"tag":7266,"props":343677,"children":343678},{},[343679],{"type":23,"value":11756},{"type":17,"tag":7266,"props":343681,"children":343682},{},[343683],{"type":17,"tag":133,"props":343684,"children":343687},{"href":343685,"rel":343686},"https://docs.unified.to/ats/scorecard/model",[214],[343688],{"type":23,"value":267687},{"type":17,"tag":7266,"props":343690,"children":343691},{},[343692],{"type":23,"value":203980},{"type":17,"tag":7266,"props":343694,"children":343695},{},[],{"type":17,"tag":7239,"props":343697,"children":343698},{},[343699,343703,343712,343717],{"type":17,"tag":7266,"props":343700,"children":343701},{},[343702],{"type":23,"value":11756},{"type":17,"tag":7266,"props":343704,"children":343705},{},[343706],{"type":17,"tag":133,"props":343707,"children":343710},{"href":343708,"rel":343709},"https://docs.unified.to/ats/company/model",[214],[343711],{"type":23,"value":25846},{"type":17,"tag":7266,"props":343713,"children":343714},{},[343715],{"type":23,"value":343716},"recruiters_ids",{"type":17,"tag":7266,"props":343718,"children":343719},{},[],{"type":17,"tag":7239,"props":343721,"children":343722},{},[343723,343728,343738,343742],{"type":17,"tag":7266,"props":343724,"children":343725},{},[343726],{"type":23,"value":343727},"Call Center",{"type":17,"tag":7266,"props":343729,"children":343730},{},[343731],{"type":17,"tag":133,"props":343732,"children":343735},{"href":343733,"rel":343734},"https://docs.unified.to/uc/call/model",[214],[343736],{"type":23,"value":343737},"Call",{"type":17,"tag":7266,"props":343739,"children":343740},{},[343741],{"type":23,"value":62582},{"type":17,"tag":7266,"props":343743,"children":343744},{},[343745],{"type":23,"value":343746},"The agent",{"type":17,"tag":7239,"props":343748,"children":343749},{},[343750,343754,343763,343767],{"type":17,"tag":7266,"props":343751,"children":343752},{},[343753],{"type":23,"value":25731},{"type":17,"tag":7266,"props":343755,"children":343756},{},[343757],{"type":17,"tag":133,"props":343758,"children":343761},{"href":343759,"rel":343760},"https://docs.unified.to/crm/company/model",[214],[343762],{"type":23,"value":25846},{"type":17,"tag":7266,"props":343764,"children":343765},{},[343766],{"type":23,"value":62582},{"type":17,"tag":7266,"props":343768,"children":343769},{},[343770],{"type":23,"value":343771},"The salesperson that is responsible for this company/account",{"type":17,"tag":7239,"props":343773,"children":343774},{},[343775,343779,343788,343792],{"type":17,"tag":7266,"props":343776,"children":343777},{},[343778],{"type":23,"value":25731},{"type":17,"tag":7266,"props":343780,"children":343781},{},[343782],{"type":17,"tag":133,"props":343783,"children":343786},{"href":343784,"rel":343785},"https://docs.unified.to/crm/contact/model",[214],[343787],{"type":23,"value":25828},{"type":17,"tag":7266,"props":343789,"children":343790},{},[343791],{"type":23,"value":62582},{"type":17,"tag":7266,"props":343793,"children":343794},{},[343795],{"type":23,"value":343796},"The salesperson that is responsible for this contact",{"type":17,"tag":7239,"props":343798,"children":343799},{},[343800,343804,343813,343817],{"type":17,"tag":7266,"props":343801,"children":343802},{},[343803],{"type":23,"value":25731},{"type":17,"tag":7266,"props":343805,"children":343806},{},[343807],{"type":17,"tag":133,"props":343808,"children":343811},{"href":343809,"rel":343810},"https://docs.unified.to/crm/deal/model",[214],[343812],{"type":23,"value":25810},{"type":17,"tag":7266,"props":343814,"children":343815},{},[343816],{"type":23,"value":62582},{"type":17,"tag":7266,"props":343818,"children":343819},{},[343820],{"type":23,"value":343821},"The salesperson that is responsible for this deal/opportunity",{"type":17,"tag":7239,"props":343823,"children":343824},{},[343825,343829,343838,343842],{"type":17,"tag":7266,"props":343826,"children":343827},{},[343828],{"type":23,"value":25731},{"type":17,"tag":7266,"props":343830,"children":343831},{},[343832],{"type":17,"tag":133,"props":343833,"children":343836},{"href":343834,"rel":343835},"https://docs.unified.to/crm/event/model",[214],[343837],{"type":23,"value":14528},{"type":17,"tag":7266,"props":343839,"children":343840},{},[343841],{"type":23,"value":62582},{"type":17,"tag":7266,"props":343843,"children":343844},{},[],{"type":17,"tag":7239,"props":343846,"children":343847},{},[343848,343852,343862,343866],{"type":17,"tag":7266,"props":343849,"children":343850},{},[343851],{"type":23,"value":25731},{"type":17,"tag":7266,"props":343853,"children":343854},{},[343855,343856],{"type":23,"value":62749},{"type":17,"tag":133,"props":343857,"children":343860},{"href":343858,"rel":343859},"https://docs.unified.to/crm/lead/model",[214],[343861],{"type":23,"value":18757},{"type":17,"tag":7266,"props":343863,"children":343864},{},[343865],{"type":23,"value":62582},{"type":17,"tag":7266,"props":343867,"children":343868},{},[343869],{"type":23,"value":343870},"The salesperson that is responsible for this lead",{"type":17,"tag":7239,"props":343872,"children":343873},{},[343874,343878,343886,343890],{"type":17,"tag":7266,"props":343875,"children":343876},{},[343877],{"type":23,"value":25731},{"type":17,"tag":7266,"props":343879,"children":343880},{},[343881],{"type":17,"tag":133,"props":343882,"children":343884},{"href":343858,"rel":343883},[214],[343885],{"type":23,"value":62749},{"type":17,"tag":7266,"props":343887,"children":343888},{},[343889],{"type":23,"value":124757},{"type":17,"tag":7266,"props":343891,"children":343892},{},[343893],{"type":23,"value":343894},"The user that created this lead",{"type":17,"tag":7239,"props":343896,"children":343897},{},[343898,343902,343911,343915],{"type":17,"tag":7266,"props":343899,"children":343900},{},[343901],{"type":23,"value":101761},{"type":17,"tag":7266,"props":343903,"children":343904},{},[343905],{"type":17,"tag":133,"props":343906,"children":343909},{"href":343907,"rel":343908},"https://docs.unified.to/hris/employee/model",[214],[343910],{"type":23,"value":61210},{"type":17,"tag":7266,"props":343912,"children":343913},{},[343914],{"type":23,"value":136506},{"type":17,"tag":7266,"props":343916,"children":343917},{},[343918],{"type":23,"value":343919},"This user's reporting manager",{"type":17,"tag":7239,"props":343921,"children":343922},{},[343923,343927,343936,343940],{"type":17,"tag":7266,"props":343924,"children":343925},{},[343926],{"type":23,"value":101761},{"type":17,"tag":7266,"props":343928,"children":343929},{},[343930],{"type":17,"tag":133,"props":343931,"children":343934},{"href":343932,"rel":343933},"https://docs.unified.to/hris/group/model",[214],[343935],{"type":23,"value":18623},{"type":17,"tag":7266,"props":343937,"children":343938},{},[343939],{"type":23,"value":111357},{"type":17,"tag":7266,"props":343941,"children":343942},{},[343943],{"type":23,"value":343944},"The group's members",{"type":17,"tag":7239,"props":343946,"children":343947},{},[343948,343952,343960,343964],{"type":17,"tag":7266,"props":343949,"children":343950},{},[343951],{"type":23,"value":101761},{"type":17,"tag":7266,"props":343953,"children":343954},{},[343955],{"type":17,"tag":133,"props":343956,"children":343958},{"href":343932,"rel":343957},[214],[343959],{"type":23,"value":18623},{"type":17,"tag":7266,"props":343961,"children":343962},{},[343963],{"type":23,"value":136513},{"type":17,"tag":7266,"props":343965,"children":343966},{},[343967],{"type":23,"value":343968},"The group's managers",{"type":17,"tag":7239,"props":343970,"children":343971},{},[343972,343976,343985,343989],{"type":17,"tag":7266,"props":343973,"children":343974},{},[343975],{"type":23,"value":101761},{"type":17,"tag":7266,"props":343977,"children":343978},{},[343979],{"type":17,"tag":133,"props":343980,"children":343983},{"href":343981,"rel":343982},"https://docs.unified.to/hris/payslip/model",[214],[343984],{"type":23,"value":198639},{"type":17,"tag":7266,"props":343986,"children":343987},{},[343988],{"type":23,"value":62582},{"type":17,"tag":7266,"props":343990,"children":343991},{},[343992],{"type":23,"value":343993},"The employee that this pay slip pertains to",{"type":17,"tag":7239,"props":343995,"children":343996},{},[343997,344001,344010,344014],{"type":17,"tag":7266,"props":343998,"children":343999},{},[344000],{"type":23,"value":101761},{"type":17,"tag":7266,"props":344002,"children":344003},{},[344004],{"type":17,"tag":133,"props":344005,"children":344008},{"href":344006,"rel":344007},"https://docs.unified.to/hris/timeoff/model",[214],[344009],{"type":23,"value":216748},{"type":17,"tag":7266,"props":344011,"children":344012},{},[344013],{"type":23,"value":62582},{"type":17,"tag":7266,"props":344015,"children":344016},{},[344017],{"type":23,"value":344018},"The employee that this time off request pertains to",{"type":17,"tag":7239,"props":344020,"children":344021},{},[344022,344026,344034,344038],{"type":17,"tag":7266,"props":344023,"children":344024},{},[344025],{"type":23,"value":101761},{"type":17,"tag":7266,"props":344027,"children":344028},{},[344029],{"type":17,"tag":133,"props":344030,"children":344032},{"href":344006,"rel":344031},[214],[344033],{"type":23,"value":216748},{"type":17,"tag":7266,"props":344035,"children":344036},{},[344037],{"type":23,"value":188049},{"type":17,"tag":7266,"props":344039,"children":344040},{},[344041],{"type":23,"value":344042},"The employee that approved this time off request",{"type":17,"tag":7239,"props":344044,"children":344045},{},[344046,344050,344059,344063],{"type":17,"tag":7266,"props":344047,"children":344048},{},[344049],{"type":23,"value":163836},{"type":17,"tag":7266,"props":344051,"children":344052},{},[344053],{"type":17,"tag":133,"props":344054,"children":344057},{"href":344055,"rel":344056},"https://docs.unified.to/kms/space/model",[214],[344058],{"type":23,"value":173171},{"type":17,"tag":7266,"props":344060,"children":344061},{},[344062],{"type":23,"value":62582},{"type":17,"tag":7266,"props":344064,"children":344065},{},[344066],{"type":23,"value":344067},"The creator of this space",{"type":17,"tag":7239,"props":344069,"children":344070},{},[344071,344075,344083,344087],{"type":17,"tag":7266,"props":344072,"children":344073},{},[344074],{"type":23,"value":163836},{"type":17,"tag":7266,"props":344076,"children":344077},{},[344078],{"type":17,"tag":133,"props":344079,"children":344081},{"href":329862,"rel":344080},[214],[344082],{"type":23,"value":24932},{"type":17,"tag":7266,"props":344084,"children":344085},{},[344086],{"type":23,"value":62582},{"type":17,"tag":7266,"props":344088,"children":344089},{},[344090],{"type":23,"value":344091},"The creator of this oage",{"type":17,"tag":7239,"props":344093,"children":344094},{},[344095,344099,344108,344113],{"type":17,"tag":7266,"props":344096,"children":344097},{},[344098],{"type":23,"value":24559},{"type":17,"tag":7266,"props":344100,"children":344101},{},[344102],{"type":17,"tag":133,"props":344103,"children":344106},{"href":344104,"rel":344105},"https://docs.unified.to/messaging/message/model",[214],[344107],{"type":23,"value":15800},{"type":17,"tag":7266,"props":344109,"children":344110},{},[344111],{"type":23,"value":344112},"author_member.user_id",{"type":17,"tag":7266,"props":344114,"children":344115},{},[],{"type":17,"tag":7239,"props":344117,"children":344118},{},[344119,344123,344131,344136],{"type":17,"tag":7266,"props":344120,"children":344121},{},[344122],{"type":23,"value":24559},{"type":17,"tag":7266,"props":344124,"children":344125},{},[344126],{"type":17,"tag":133,"props":344127,"children":344129},{"href":344104,"rel":344128},[214],[344130],{"type":23,"value":15800},{"type":17,"tag":7266,"props":344132,"children":344133},{},[344134],{"type":23,"value":344135},"destination_members.user_id",{"type":17,"tag":7266,"props":344137,"children":344138},{},[],{"type":17,"tag":7239,"props":344140,"children":344141},{},[344142,344146,344154,344159],{"type":17,"tag":7266,"props":344143,"children":344144},{},[344145],{"type":23,"value":24559},{"type":17,"tag":7266,"props":344147,"children":344148},{},[344149],{"type":17,"tag":133,"props":344150,"children":344152},{"href":344104,"rel":344151},[214],[344153],{"type":23,"value":15800},{"type":17,"tag":7266,"props":344155,"children":344156},{},[344157],{"type":23,"value":344158},"hidden_members.user_id",{"type":17,"tag":7266,"props":344160,"children":344161},{},[],{"type":17,"tag":7239,"props":344163,"children":344164},{},[344165,344169,344177,344182],{"type":17,"tag":7266,"props":344166,"children":344167},{},[344168],{"type":23,"value":24559},{"type":17,"tag":7266,"props":344170,"children":344171},{},[344172],{"type":17,"tag":133,"props":344173,"children":344175},{"href":344104,"rel":344174},[214],[344176],{"type":23,"value":15800},{"type":17,"tag":7266,"props":344178,"children":344179},{},[344180],{"type":23,"value":344181},"mentioned_members.user_id",{"type":17,"tag":7266,"props":344183,"children":344184},{},[],{"type":17,"tag":7239,"props":344186,"children":344187},{},[344188,344192,344201,344205],{"type":17,"tag":7266,"props":344189,"children":344190},{},[344191],{"type":23,"value":96511},{"type":17,"tag":7266,"props":344193,"children":344194},{},[344195],{"type":17,"tag":133,"props":344196,"children":344199},{"href":344197,"rel":344198},"https://docs.unified.to/storage/file/model",[214],[344200],{"type":23,"value":334119},{"type":17,"tag":7266,"props":344202,"children":344203},{},[344204],{"type":23,"value":62582},{"type":17,"tag":7266,"props":344206,"children":344207},{},[344208],{"type":23,"value":344209},"The owner of this file/folder",{"type":17,"tag":7239,"props":344211,"children":344212},{},[344213,344217,344226,344230],{"type":17,"tag":7266,"props":344214,"children":344215},{},[344216],{"type":23,"value":164050},{"type":17,"tag":7266,"props":344218,"children":344219},{},[344220],{"type":17,"tag":133,"props":344221,"children":344224},{"href":344222,"rel":344223},"https://docs.unified.to/task/project/model",[214],[344225],{"type":23,"value":13344},{"type":17,"tag":7266,"props":344227,"children":344228},{},[344229],{"type":23,"value":111357},{"type":17,"tag":7266,"props":344231,"children":344232},{},[344233],{"type":23,"value":344234},"The users that belong to this project",{"type":17,"tag":7239,"props":344236,"children":344237},{},[344238,344242,344251,344256],{"type":17,"tag":7266,"props":344239,"children":344240},{},[344241],{"type":23,"value":164050},{"type":17,"tag":7266,"props":344243,"children":344244},{},[344245],{"type":17,"tag":133,"props":344246,"children":344249},{"href":344247,"rel":344248},"https://docs.unified.to/task/task/model",[214],[344250],{"type":23,"value":13357},{"type":17,"tag":7266,"props":344252,"children":344253},{},[344254],{"type":23,"value":344255},"assigned_user_id",{"type":17,"tag":7266,"props":344257,"children":344258},{},[],{"type":17,"tag":7239,"props":344260,"children":344261},{},[344262,344266,344274,344278],{"type":17,"tag":7266,"props":344263,"children":344264},{},[344265],{"type":23,"value":164050},{"type":17,"tag":7266,"props":344267,"children":344268},{},[344269],{"type":17,"tag":133,"props":344270,"children":344272},{"href":344247,"rel":344271},[214],[344273],{"type":23,"value":13357},{"type":17,"tag":7266,"props":344275,"children":344276},{},[344277],{"type":23,"value":124757},{"type":17,"tag":7266,"props":344279,"children":344280},{},[],{"type":17,"tag":7239,"props":344282,"children":344283},{},[344284,344288,344296,344300],{"type":17,"tag":7266,"props":344285,"children":344286},{},[344287],{"type":23,"value":164050},{"type":17,"tag":7266,"props":344289,"children":344290},{},[344291],{"type":17,"tag":133,"props":344292,"children":344294},{"href":344247,"rel":344293},[214],[344295],{"type":23,"value":13357},{"type":17,"tag":7266,"props":344297,"children":344298},{},[344299],{"type":23,"value":164145},{"type":17,"tag":7266,"props":344301,"children":344302},{},[],{"type":17,"tag":7239,"props":344304,"children":344305},{},[344306,344310,344319,344323],{"type":17,"tag":7266,"props":344307,"children":344308},{},[344309],{"type":23,"value":24541},{"type":17,"tag":7266,"props":344311,"children":344312},{},[344313],{"type":17,"tag":133,"props":344314,"children":344317},{"href":344315,"rel":344316},"https://docs.unified.to/ticketing/note/model",[214],[344318],{"type":23,"value":150919},{"type":17,"tag":7266,"props":344320,"children":344321},{},[344322],{"type":23,"value":62582},{"type":17,"tag":7266,"props":344324,"children":344325},{},[344326],{"type":23,"value":344327},"The user who created this note",{"type":17,"tag":7239,"props":344329,"children":344330},{},[344331,344335,344344,344348],{"type":17,"tag":7266,"props":344332,"children":344333},{},[344334],{"type":23,"value":24541},{"type":17,"tag":7266,"props":344336,"children":344337},{},[344338],{"type":17,"tag":133,"props":344339,"children":344342},{"href":344340,"rel":344341},"https://docs.unified.to/ticketing/ticket/model",[214],[344343],{"type":23,"value":28124},{"type":17,"tag":7266,"props":344345,"children":344346},{},[344347],{"type":23,"value":62582},{"type":17,"tag":7266,"props":344349,"children":344350},{},[344351],{"type":23,"value":344352},"The user who created this ticket",{"type":17,"tag":29,"props":344354,"children":344355},{},[344356],{"type":23,"value":344357},"Here are several practical use cases that leverage our unified HR API for non-HR use-cases:",{"type":17,"tag":29,"props":344359,"children":344360},{},[344361,344366],{"type":17,"tag":48,"props":344362,"children":344363},{},[344364],{"type":23,"value":344365},"Streamlined Onboarding:",{"type":23,"value":344367}," Automate your customers' onboarding process by syncing employee data across HR, task management, and training platforms. Ensure that new hires are promptly added to all necessary systems and have access to the right resources from day one.",{"type":17,"tag":29,"props":344369,"children":344370},{},[344371,344376],{"type":17,"tag":48,"props":344372,"children":344373},{},[344374],{"type":23,"value":344375},"Assigning Leads and Deals:",{"type":23,"value":344377}," Assign newly created leads and/or deals to a specific sales-rep using their user ID",{"type":17,"tag":29,"props":344379,"children":344380},{},[344381,344386],{"type":17,"tag":48,"props":344382,"children":344383},{},[344384],{"type":23,"value":344385},"Notify Hiring Managers:",{"type":23,"value":344387}," When adding a new candidate and their job application, notify the hiring manager by retrieving their information and emailing them",{"type":17,"tag":29,"props":344389,"children":344390},{},[344391],{"type":23,"value":344392},"By integrating employee data across multiple SaaS platforms, organizations can improve operational efficiency, enhance data accuracy, and provide a better employee experience.",{"type":17,"tag":68,"props":344394,"children":344395},{"id":244380},[344396],{"type":23,"value":244383},{"type":17,"tag":80,"props":344398,"children":344399},{},[344400,344407,344417],{"type":17,"tag":84,"props":344401,"children":344402},{},[344403],{"type":17,"tag":11616,"props":344404,"children":344406},{"width":11618,"height":11619,"src":344405,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/arTwN_OT8Do?feature=shared",[],{"type":17,"tag":84,"props":344408,"children":344409},{},[344410],{"type":17,"tag":133,"props":344411,"children":344414},{"href":344412,"rel":344413},"https://docs.unified.to/hris/overview",[214],[344415],{"type":23,"value":344416},"Overview of our unified HR API documentation ",{"type":17,"tag":84,"props":344418,"children":344419},{},[344420],{"type":17,"tag":133,"props":344421,"children":344423},{"href":58209,"rel":344422},[214],[344424],{"type":23,"value":344425},"Full list of supported HR integrations ",{"title":7,"searchDepth":1629,"depth":1629,"links":344427},[344428,344429],{"id":343483,"depth":1635,"text":343486},{"id":244380,"depth":1629,"text":244383},"content:blog:how_to_access_employees_and_users.md","blog/how_to_access_employees_and_users.md","blog/how_to_access_employees_and_users",{"_path":344434,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":344435,"description":344436,"img":344437,"date":343405,"tag":6341,"body":344438,"_type":1677,"_id":344796,"_source":1679,"_file":344797,"_stem":344798,"_extension":1682},"/blog/how_to_get_your_oauth_2_credentials_for_gmail","How to get your OAuth 2 credentials for Gmail","To access Google services such as Gmail (a.k.a Google Mail) with the Unified API, you will need to generate and retrieve your OAuth 2 credentials in the Google...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_gmail-icon.svg",{"type":14,"children":344439,"toc":344788},[344440,344445,344448,344455,344472,344483,344514,344520,344579,344585,344647,344653,344746,344752,344757],{"type":17,"tag":18,"props":344441,"children":344443},{"id":344442},"how-to-get-your-oauth-2-credentials-for-gmail",[344444],{"type":23,"value":344435},{"type":17,"tag":25,"props":344446,"children":344447},{},[],{"type":17,"tag":29,"props":344449,"children":344450},{},[344451],{"type":17,"tag":33,"props":344452,"children":344453},{},[344454],{"type":23,"value":343423},{"type":17,"tag":29,"props":344456,"children":344457},{},[344458,344460,344464,344466,344470],{"type":23,"value":344459},"To access Google services such as Gmail (a.k.a Google Mail) with the ",{"type":17,"tag":133,"props":344461,"children":344462},{"href":7691},[344463],{"type":23,"value":7806},{"type":23,"value":344465},", you will need to generate and retrieve your ",{"type":17,"tag":133,"props":344467,"children":344468},{"href":779},[344469],{"type":23,"value":782},{"type":23,"value":344471}," 2 credentials in the Google Cloud Console.",{"type":17,"tag":68,"props":344473,"children":344475},{"id":344474},"create-or-select-a-project-on-google-cloud-console",[344476,344478],{"type":23,"value":344477},"Create or s",{"type":17,"tag":48,"props":344479,"children":344480},{},[344481],{"type":23,"value":344482},"elect a project on Google Cloud Console",{"type":17,"tag":6154,"props":344484,"children":344485},{},[344486,344496],{"type":17,"tag":84,"props":344487,"children":344488},{},[344489,344490,344495],{"type":23,"value":42939},{"type":17,"tag":133,"props":344491,"children":344493},{"href":42075,"rel":344492},[214],[344494],{"type":23,"value":129775},{"type":23,"value":54},{"type":17,"tag":84,"props":344497,"children":344498},{},[344499,344501],{"type":23,"value":344500},"From the top nav bar, select an existing project or create a new one.\n",{"type":17,"tag":6154,"props":344502,"children":344503},{},[344504],{"type":17,"tag":84,"props":344505,"children":344506},{},[344507,344509,344513],{"type":23,"value":344508},"If creating a new project, name it whatever you want and then click ",{"type":17,"tag":48,"props":344510,"children":344511},{},[344512],{"type":23,"value":42125},{"type":23,"value":54},{"type":17,"tag":68,"props":344515,"children":344517},{"id":344516},"enable-apis-for-gmail",[344518],{"type":23,"value":344519},"Enable APIs for Gmail",{"type":17,"tag":6154,"props":344521,"children":344522},{},[344523,344560,344570],{"type":17,"tag":84,"props":344524,"children":344525},{},[344526,344528,344533,344534,344538,344552,344555],{"type":23,"value":344527},"Once the project is selected or created, open the left sidebar and then navigate to ",{"type":17,"tag":48,"props":344529,"children":344530},{},[344531],{"type":23,"value":344532},"APIs and services >",{"type":23,"value":18757},{"type":17,"tag":48,"props":344535,"children":344536},{},[344537],{"type":23,"value":317752},{"type":17,"tag":6154,"props":344539,"children":344540},{},[344541],{"type":17,"tag":84,"props":344542,"children":344543},{},[344544,344546,344550],{"type":23,"value":344545},"Alternatively, you can search for ",{"type":17,"tag":48,"props":344547,"children":344548},{},[344549],{"type":23,"value":317752},{"type":23,"value":344551}," from the top navbar.",{"type":17,"tag":3891,"props":344553,"children":344554},{},[],{"type":17,"tag":6438,"props":344556,"children":344559},{"alt":344557,"src":344558},"Screenshot_2024-09-09_at_9.56.18_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_gmail-0.png",[],{"type":17,"tag":84,"props":344561,"children":344562},{},[344563,344564,344568],{"type":23,"value":127300},{"type":17,"tag":48,"props":344565,"children":344566},{},[344567],{"type":23,"value":15162},{"type":23,"value":344569}," and click on the matching search result.",{"type":17,"tag":84,"props":344571,"children":344572},{},[344573,344574,344578],{"type":23,"value":6629},{"type":17,"tag":48,"props":344575,"children":344576},{},[344577],{"type":23,"value":42181},{"type":23,"value":54},{"type":17,"tag":68,"props":344580,"children":344582},{"id":344581},"configure-your-oauth-consent-screen",[344583],{"type":23,"value":344584},"Configure your OAuth consent screen",{"type":17,"tag":6154,"props":344586,"children":344587},{},[344588,344612,344635],{"type":17,"tag":84,"props":344589,"children":344590},{},[344591,344593,344598,344599],{"type":23,"value":344592},"Open the left sidebar and navigate to ",{"type":17,"tag":48,"props":344594,"children":344595},{},[344596],{"type":23,"value":344597},"APIs and services > Credentials",{"type":23,"value":54},{"type":17,"tag":6154,"props":344600,"children":344601},{},[344602],{"type":17,"tag":84,"props":344603,"children":344604},{},[344605,344606,344611],{"type":23,"value":344545},{"type":17,"tag":48,"props":344607,"children":344608},{},[344609],{"type":23,"value":344610},"Credentials",{"type":23,"value":344551},{"type":17,"tag":84,"props":344613,"children":344614},{},[344615,344616,344620,344622,344626,344627,344630],{"type":23,"value":6629},{"type":17,"tag":48,"props":344617,"children":344618},{},[344619],{"type":23,"value":42367},{"type":23,"value":344621}," and then select ",{"type":17,"tag":48,"props":344623,"children":344624},{},[344625],{"type":23,"value":42374},{"type":23,"value":54},{"type":17,"tag":3891,"props":344628,"children":344629},{},[],{"type":17,"tag":6438,"props":344631,"children":344634},{"alt":344632,"src":344633},"Screenshot_2024-09-09_at_10.17.01_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_gmail-1.png",[],{"type":17,"tag":84,"props":344636,"children":344637},{},[344638,344640,344645],{"type":23,"value":344639},"You will be asked to configure the OAuth Consent Screen. Click ",{"type":17,"tag":48,"props":344641,"children":344642},{},[344643],{"type":23,"value":344644},"Configure Consent Screen",{"type":23,"value":344646}," and go through the consent screen process.",{"type":17,"tag":68,"props":344648,"children":344650},{"id":344649},"get-your-oauth-credentials",[344651],{"type":23,"value":344652},"Get your Oauth credentials",{"type":17,"tag":6154,"props":344654,"children":344655},{},[344656,344679,344689,344705,344714,344730,344741],{"type":17,"tag":84,"props":344657,"children":344658},{},[344659,344661,344665,344667,344672,344674,344678],{"type":23,"value":344660},"After configuring your consent screen, return to the ",{"type":17,"tag":48,"props":344662,"children":344663},{},[344664],{"type":23,"value":344610},{"type":23,"value":344666}," home page, click ",{"type":17,"tag":48,"props":344668,"children":344669},{},[344670],{"type":23,"value":344671},"Create credentials,",{"type":23,"value":344673}," and select ",{"type":17,"tag":48,"props":344675,"children":344676},{},[344677],{"type":23,"value":42374},{"type":23,"value":54},{"type":17,"tag":84,"props":344680,"children":344681},{},[344682,344683,344687],{"type":23,"value":42950},{"type":17,"tag":48,"props":344684,"children":344685},{},[344686],{"type":23,"value":42383},{"type":23,"value":344688}," as the application type. Name your app whatever you want",{"type":17,"tag":84,"props":344690,"children":344691},{},[344692,344693,344698,344700],{"type":23,"value":146715},{"type":17,"tag":48,"props":344694,"children":344695},{},[344696],{"type":23,"value":344697},"Authorised redirect URIs,",{"type":23,"value":344699}," enter ",{"type":17,"tag":6121,"props":344701,"children":344703},{"className":344702},[],[344704],{"type":23,"value":42417},{"type":17,"tag":84,"props":344706,"children":344707},{},[344708,344709,344713],{"type":23,"value":6629},{"type":17,"tag":48,"props":344710,"children":344711},{},[344712],{"type":23,"value":42125},{"type":23,"value":54},{"type":17,"tag":84,"props":344715,"children":344716},{},[344717,344719,344723,344724,344728],{"type":23,"value":344718},"After creating your credentials, a dialog window will appear displaying your new ",{"type":17,"tag":48,"props":344720,"children":344721},{},[344722],{"type":23,"value":6040},{"type":23,"value":34435},{"type":17,"tag":48,"props":344725,"children":344726},{},[344727],{"type":23,"value":125508},{"type":23,"value":344729},". Make a note of these as you will need them for the next step.",{"type":17,"tag":84,"props":344731,"children":344732},{},[344733,344735],{"type":23,"value":344734},"Navigate to the integration page for Gmail on Unified.to i.e ",{"type":17,"tag":133,"props":344736,"children":344738},{"href":318061,"rel":344737},[214],[344739],{"type":23,"value":344740},"https://app.unified.to/integrations/googlemail",{"type":17,"tag":84,"props":344742,"children":344743},{},[344744],{"type":23,"value":344745},"Enter your client ID, client secret, and developer API key to activate the Gmail integration.",{"type":17,"tag":68,"props":344747,"children":344749},{"id":344748},"set-your-oauth-2-reauthentication-policy",[344750],{"type":23,"value":344751},"Set your Oauth 2 reauthentication policy",{"type":17,"tag":29,"props":344753,"children":344754},{},[344755],{"type":23,"value":344756},"Make sure your OAuth2 Reauthentication policy is set correctly for the integration to function as expected.",{"type":17,"tag":6154,"props":344758,"children":344759},{},[344760,344765,344770],{"type":17,"tag":84,"props":344761,"children":344762},{},[344763],{"type":23,"value":344764},"In the Google Workspace Admin Console, navigate to Menu > Security > Access and data control > Google Cloud session control.",{"type":17,"tag":84,"props":344766,"children":344767},{},[344768],{"type":23,"value":344769},"On the left, select the organizational unit where you want to set session length.\nFor all users, select the top-level organizational unit. Initially, an organizational unit inherits the settings of its parent.",{"type":17,"tag":84,"props":344771,"children":344772},{},[344773,344774,344779,344781,344784],{"type":23,"value":146715},{"type":17,"tag":48,"props":344775,"children":344776},{},[344777],{"type":23,"value":344778},"Reauthentication policy",{"type":23,"value":344780},", select \"Never require reauthentication\"",{"type":17,"tag":3891,"props":344782,"children":344783},{},[],{"type":17,"tag":6438,"props":344785,"children":344787},{"alt":318119,"src":344786},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_oauth_2_credentials_for_gmail-2.png",[],{"title":7,"searchDepth":1629,"depth":1629,"links":344789},[344790,344792,344793,344794,344795],{"id":344474,"depth":1629,"text":344791},"Create or select a project on Google Cloud Console",{"id":344516,"depth":1629,"text":344519},{"id":344581,"depth":1629,"text":344584},{"id":344649,"depth":1629,"text":344652},{"id":344748,"depth":1629,"text":344751},"content:blog:how_to_get_your_oauth_2_credentials_for_gmail.md","blog/how_to_get_your_oauth_2_credentials_for_gmail.md","blog/how_to_get_your_oauth_2_credentials_for_gmail",{"_path":344800,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":344801,"description":344802,"img":344803,"date":344804,"tag":6341,"body":344805,"_type":1677,"_id":345540,"_source":1679,"_file":345541,"_stem":345542,"_extension":1682},"/blog/how_to_set_up_your_scopes_in_hubspot","How to set up your scopes in HubSpot","This guide explains how to correctly configure the advanced scopes settings in your HubSpot developer app for seamless integration with Unified.to. We'll cover...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-icon.png","2024-06-11T00:00:00.000Z",{"type":14,"children":344806,"toc":345526},[344807,344812,344815,344823,344828,344832,344836,344867,344873,344896,344903,344910,344918,344925,344933,344940,344947,344954,344961,344967,344989,345076,345083,345089,345102,345109,345117,345124,345136,345147,345166,345172,345177,345239,345251,345315,345325,345331,345336,345349,345356,345362,345374,345394,345399,345408,345412,345424,345429,345495,345499],{"type":17,"tag":18,"props":344808,"children":344810},{"id":344809},"how-to-set-up-your-scopes-in-hubspot",[344811],{"type":23,"value":344801},{"type":17,"tag":25,"props":344813,"children":344814},{},[],{"type":17,"tag":29,"props":344816,"children":344817},{},[344818],{"type":17,"tag":33,"props":344819,"children":344820},{},[344821],{"type":23,"value":344822},"June 11, 2024",{"type":17,"tag":29,"props":344824,"children":344825},{},[344826],{"type":23,"value":344827},"This guide explains how to correctly configure the advanced scopes settings in your HubSpot developer app for seamless integration with Unified.to. We'll cover setting up both required and optional scopes, and address some common issues you might encounter.",{"type":17,"tag":68,"props":344829,"children":344830},{"id":177146},[344831],{"type":23,"value":177149},{"type":17,"tag":29,"props":344833,"children":344834},{},[344835],{"type":23,"value":338225},{"type":17,"tag":80,"props":344837,"children":344838},{},[344839,344847,344857],{"type":17,"tag":84,"props":344840,"children":344841},{},[344842],{"type":17,"tag":133,"props":344843,"children":344845},{"href":337112,"rel":344844},[214],[344846],{"type":23,"value":42815},{"type":17,"tag":84,"props":344848,"children":344849},{},[344850],{"type":17,"tag":133,"props":344851,"children":344854},{"href":344852,"rel":344853},"https://docs.unified.to/guides/how_to_create_connection_with_hubspot",[214],[344855],{"type":23,"value":344856},"How to create a connection (Project) ",{"type":17,"tag":84,"props":344858,"children":344859},{},[344860],{"type":17,"tag":133,"props":344861,"children":344864},{"href":344862,"rel":344863},"https://docs.unified.to/guides/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps",[214],[344865],{"type":23,"value":344866},"How to get your HubSpot developer key and OAuth 2 credentials (Legacy App)",{"type":17,"tag":68,"props":344868,"children":344870},{"id":344869},"set-up-required-scopes-in-hubspot-project",[344871],{"type":23,"value":344872},"Set up required scopes in HubSpot (Project)",{"type":17,"tag":6154,"props":344874,"children":344875},{},[344876,344887,344892],{"type":17,"tag":84,"props":344877,"children":344878},{},[344879,344880,344885],{"type":23,"value":6661},{"type":17,"tag":133,"props":344881,"children":344883},{"href":247754,"rel":344882},[214],[344884],{"type":23,"value":247754},{"type":23,"value":344886},", Sign in.",{"type":17,"tag":84,"props":344888,"children":344889},{},[344890],{"type":23,"value":344891},"Development →  Project → select your project",{"type":17,"tag":84,"props":344893,"children":344894},{},[344895],{"type":23,"value":247947},{"type":17,"tag":29,"props":344897,"children":344898},{},[344899],{"type":17,"tag":6438,"props":344900,"children":344902},{"alt":6440,"src":344901},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-0.png",[],{"type":17,"tag":6154,"props":344904,"children":344905},{},[344906],{"type":17,"tag":84,"props":344907,"children":344908},{},[344909],{"type":23,"value":247962},{"type":17,"tag":6893,"props":344911,"children":344913},{"className":344912,"code":247966,"language":6898,"meta":7},[6896],[344914],{"type":17,"tag":6121,"props":344915,"children":344916},{"__ignoreMap":7},[344917],{"type":23,"value":247966},{"type":17,"tag":6154,"props":344919,"children":344920},{},[344921],{"type":17,"tag":84,"props":344922,"children":344923},{},[344924],{"type":23,"value":247979},{"type":17,"tag":6893,"props":344926,"children":344928},{"className":344927,"code":247983,"language":6898,"meta":7},[6896],[344929],{"type":17,"tag":6121,"props":344930,"children":344931},{"__ignoreMap":7},[344932],{"type":23,"value":247983},{"type":17,"tag":6154,"props":344934,"children":344935},{},[344936],{"type":17,"tag":84,"props":344937,"children":344938},{},[344939],{"type":23,"value":247996},{"type":17,"tag":29,"props":344941,"children":344942},{},[344943],{"type":17,"tag":6438,"props":344944,"children":344946},{"alt":6440,"src":344945},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-1.png",[],{"type":17,"tag":6154,"props":344948,"children":344949},{},[344950],{"type":17,"tag":84,"props":344951,"children":344952},{},[344953],{"type":23,"value":248011},{"type":17,"tag":29,"props":344955,"children":344956},{},[344957],{"type":17,"tag":6438,"props":344958,"children":344960},{"alt":6440,"src":344959},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-2.png",[],{"type":17,"tag":68,"props":344962,"children":344964},{"id":344963},"set-up-required-scopes-in-hubspot-legacy-app",[344965],{"type":23,"value":344966},"Set up required scopes in HubSpot (Legacy App)",{"type":17,"tag":29,"props":344968,"children":344969},{},[344970,344974,344976,344980,344982],{"type":17,"tag":48,"props":344971,"children":344972},{},[344973],{"type":23,"value":150919},{"type":23,"value":344975},": If you are using ",{"type":17,"tag":133,"props":344977,"children":344978},{"href":4999},[344979],{"type":23,"value":5002},{"type":23,"value":344981},", please refer to: ",{"type":17,"tag":133,"props":344983,"children":344986},{"href":344984,"rel":344985},"https://docs.unified.to/guides/how_to_configure_webhooks_in_hubspot",[214],[344987],{"type":23,"value":344988},"How to configure webhooks in HubSpot",{"type":17,"tag":6154,"props":344990,"children":344991},{},[344992,345002,345007,345012],{"type":17,"tag":84,"props":344993,"children":344994},{},[344995,344996,345001],{"type":23,"value":6661},{"type":17,"tag":133,"props":344997,"children":344999},{"href":247754,"rel":344998},[214],[345000],{"type":23,"value":247754},{"type":23,"value":344886},{"type":17,"tag":84,"props":345003,"children":345004},{},[345005],{"type":23,"value":345006},"Development → Legacy App→ Your New App",{"type":17,"tag":84,"props":345008,"children":345009},{},[345010],{"type":23,"value":345011},"In the same Auth tab, scroll",{"type":17,"tag":84,"props":345013,"children":345014},{},[345015,345017,345022,345024,345028,345029,345035,345036,345041],{"type":23,"value":345016},"If you are not using webhooks, then ",{"type":17,"tag":133,"props":345018,"children":345020},{"href":42620,"rel":345019},[214],[345021],{"type":23,"value":217},{"type":23,"value":345023}," only requires two scopes to be set as ",{"type":17,"tag":48,"props":345025,"children":345026},{},[345027],{"type":23,"value":47953},{"type":23,"value":49318},{"type":17,"tag":6121,"props":345030,"children":345032},{"className":345031},[],[345033],{"type":23,"value":345034},"crm.objects.owners.read",{"type":23,"value":34435},{"type":17,"tag":6121,"props":345037,"children":345039},{"className":345038},[],[345040],{"type":23,"value":146777},{"type":17,"tag":6154,"props":345042,"children":345043},{},[345044,345053,345062,345072],{"type":17,"tag":84,"props":345045,"children":345046},{},[345047,345048],{"type":23,"value":6629},{"type":17,"tag":48,"props":345049,"children":345050},{},[345051],{"type":23,"value":345052},"+ Add new scope",{"type":17,"tag":84,"props":345054,"children":345055},{},[345056,345057],{"type":23,"value":42950},{"type":17,"tag":6121,"props":345058,"children":345060},{"className":345059},[],[345061],{"type":23,"value":345034},{"type":17,"tag":84,"props":345063,"children":345064},{},[345065,345067,345071],{"type":23,"value":345066},"Set it as a ",{"type":17,"tag":48,"props":345068,"children":345069},{},[345070],{"type":23,"value":47953},{"type":23,"value":338816},{"type":17,"tag":84,"props":345073,"children":345074},{},[345075],{"type":23,"value":329148},{"type":17,"tag":29,"props":345077,"children":345078},{},[345079],{"type":17,"tag":6438,"props":345080,"children":345082},{"alt":6440,"src":345081},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-3.png",[],{"type":17,"tag":68,"props":345084,"children":345086},{"id":345085},"setup-optional-scopes",[345087],{"type":23,"value":345088},"Setup optional scopes",{"type":17,"tag":6154,"props":345090,"children":345091},{},[345092],{"type":17,"tag":84,"props":345093,"children":345094},{},[345095,345097],{"type":23,"value":345096},"You can see the list of scopes required for the objects you need at ",{"type":17,"tag":133,"props":345098,"children":345100},{"href":338884,"rel":345099},[214],[345101],{"type":23,"value":338884},{"type":17,"tag":29,"props":345103,"children":345104},{},[345105],{"type":17,"tag":6438,"props":345106,"children":345108},{"alt":6440,"src":345107},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-4.png",[],{"type":17,"tag":6154,"props":345110,"children":345111},{},[345112],{"type":17,"tag":84,"props":345113,"children":345114},{},[345115],{"type":23,"value":345116},"Make sure to select optional",{"type":17,"tag":29,"props":345118,"children":345119},{},[345120],{"type":17,"tag":6438,"props":345121,"children":345123},{"alt":6440,"src":345122},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-5.png",[],{"type":17,"tag":6154,"props":345125,"children":345126},{},[345127,345132],{"type":17,"tag":84,"props":345128,"children":345129},{},[345130],{"type":23,"value":345131},"Add all the scopes you need",{"type":17,"tag":84,"props":345133,"children":345134},{},[345135],{"type":23,"value":329148},{"type":17,"tag":239,"props":345137,"children":345139},{"id":345138},"configure-your-scopes-on-unifiedto",[345140,345142],{"type":23,"value":345141},"Configure your scopes on ",{"type":17,"tag":133,"props":345143,"children":345145},{"href":42620,"rel":345144},[214],[345146],{"type":23,"value":217},{"type":17,"tag":29,"props":345148,"children":345149},{},[345150,345152,345157,345159,345165],{"type":23,"value":345151},"Be sure to also configure these scopes in your ",{"type":17,"tag":133,"props":345153,"children":345155},{"href":42620,"rel":345154},[214],[345156],{"type":23,"value":217},{"type":23,"value":345158}," settings. For instructions on how to do that, refer to our ",{"type":17,"tag":133,"props":345160,"children":345162},{"href":337112,"rel":345161},[214],[345163],{"type":23,"value":345164},"Scopes guide",{"type":23,"value":54},{"type":17,"tag":68,"props":345167,"children":345169},{"id":345168},"understanding-hubspots-scope-constraints",[345170],{"type":23,"value":345171},"Understanding HubSpot's scope constraints",{"type":17,"tag":29,"props":345173,"children":345174},{},[345175],{"type":23,"value":345176},"HubSpot has some specific rules about how scopes work:",{"type":17,"tag":80,"props":345178,"children":345179},{},[345180,345215,345224,345229],{"type":17,"tag":84,"props":345181,"children":345182},{},[345183,345185,345189,345191],{"type":23,"value":345184},"If you specify a scope as ",{"type":17,"tag":48,"props":345186,"children":345187},{},[345188],{"type":23,"value":47953},{"type":23,"value":345190},", it must be included in every authorization request.\n",{"type":17,"tag":80,"props":345192,"children":345193},{},[345194],{"type":17,"tag":84,"props":345195,"children":345196},{},[345197,345201,345203,345207,345209,345213],{"type":17,"tag":48,"props":345198,"children":345199},{},[345200],{"type":23,"value":150919},{"type":23,"value":345202},": If you intend to ",{"type":17,"tag":33,"props":345204,"children":345205},{},[345206],{"type":23,"value":161694},{"type":23,"value":345208}," data via a webhook, then the read scope for that object must be marked as ",{"type":17,"tag":48,"props":345210,"children":345211},{},[345212],{"type":23,"value":47953},{"type":23,"value":345214}," in HubSpot.",{"type":17,"tag":84,"props":345216,"children":345217},{},[345218,345222],{"type":17,"tag":48,"props":345219,"children":345220},{},[345221],{"type":23,"value":316561},{"type":23,"value":345223}," scopes may or may not be included in the authorization.",{"type":17,"tag":84,"props":345225,"children":345226},{},[345227],{"type":23,"value":345228},"If you don't specify a scope at all, it cannot be included in the authorization request.",{"type":17,"tag":84,"props":345230,"children":345231},{},[345232,345233,345237],{"type":23,"value":6712},{"type":17,"tag":133,"props":345234,"children":345235},{"href":779},[345236],{"type":23,"value":782},{"type":23,"value":345238}," scope cannot be removed and must always be required.",{"type":17,"tag":29,"props":345240,"children":345241},{},[345242,345244,345249],{"type":23,"value":345243},"Behind the scenes, ",{"type":17,"tag":133,"props":345245,"children":345247},{"href":42620,"rel":345246},[214],[345248],{"type":23,"value":217},{"type":23,"value":345250}," will request scopes according to what you have configured on the platform:",{"type":17,"tag":80,"props":345252,"children":345253},{},[345254,345271,345298],{"type":17,"tag":84,"props":345255,"children":345256},{},[345257,345259,345264,345266,345270],{"type":23,"value":345258},"We'll always request ",{"type":17,"tag":6121,"props":345260,"children":345262},{"className":345261},[],[345263],{"type":23,"value":345034},{"type":23,"value":345265}," as a ",{"type":17,"tag":48,"props":345267,"children":345268},{},[345269],{"type":23,"value":47953},{"type":23,"value":338816},{"type":17,"tag":84,"props":345272,"children":345273},{},[345274,345276,345281,345283,345288,345290,345296],{"type":23,"value":345275},"When you enable ",{"type":17,"tag":6121,"props":345277,"children":345279},{"className":345278},[],[345280],{"type":23,"value":124562},{"type":23,"value":345282}," scopes on ",{"type":17,"tag":133,"props":345284,"children":345286},{"href":42620,"rel":345285},[214],[345287],{"type":23,"value":217},{"type":23,"value":345289},", we convert every Hubspot scope ending with ",{"type":17,"tag":6121,"props":345291,"children":345293},{"className":345292},[],[345294],{"type":23,"value":345295},".read",{"type":23,"value":345297}," to required, assuming they'll all be used for webhooks.",{"type":17,"tag":84,"props":345299,"children":345300},{},[345301,345303,345308,345310,345314],{"type":23,"value":345302},"Otherwise, if you have not enabled the ",{"type":17,"tag":6121,"props":345304,"children":345306},{"className":345305},[],[345307],{"type":23,"value":124562},{"type":23,"value":345309}," scope, then all other scopes will be requested as ",{"type":17,"tag":48,"props":345311,"children":345312},{},[345313],{"type":23,"value":316561},{"type":23,"value":54},{"type":17,"tag":29,"props":345316,"children":345317},{},[345318,345320],{"type":23,"value":345319},"In general, we recommend that you only stick to requesting scopes for the data you actually need. For more instructions on setting up scopes to work with webhooks,  please refer to: ",{"type":17,"tag":133,"props":345321,"children":345323},{"href":344984,"rel":345322},[214],[345324],{"type":23,"value":344988},{"type":17,"tag":68,"props":345326,"children":345328},{"id":345327},"what-your-users-will-see",[345329],{"type":23,"value":345330},"What your users will see",{"type":17,"tag":29,"props":345332,"children":345333},{},[345334],{"type":23,"value":345335},"When your users sign in with HubSpot, they'll see a screen requesting access to the scopes you've specified:",{"type":17,"tag":80,"props":345337,"children":345338},{},[345339,345344],{"type":17,"tag":84,"props":345340,"children":345341},{},[345342],{"type":23,"value":345343},"Required scopes will always be shown and cannot be deselected.",{"type":17,"tag":84,"props":345345,"children":345346},{},[345347],{"type":23,"value":345348},"Optional scopes will be shown and can be deselected by the user.",{"type":17,"tag":29,"props":345350,"children":345351},{},[345352],{"type":17,"tag":6438,"props":345353,"children":345355},{"alt":6440,"src":345354},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_your_scopes_in_hubspot-6.png",[],{"type":17,"tag":68,"props":345357,"children":345359},{"id":345358},"specifying-required-vs-optional-scopes",[345360],{"type":23,"value":345361},"Specifying Required vs Optional Scopes",{"type":17,"tag":29,"props":345363,"children":345364},{},[345365,345367,345372],{"type":23,"value":345366},"Unified tries to automatically classify scopes as required or optional.  If you need additional control, you can always specify this information in the ",{"type":17,"tag":6121,"props":345368,"children":345370},{"className":345369},[],[345371],{"type":23,"value":77613},{"type":23,"value":345373}," URL parameter.",{"type":17,"tag":29,"props":345375,"children":345376},{},[345377,345379,345385,345386,345392],{"type":23,"value":345378},"Just prefix the Hubspot-specific scope with ",{"type":17,"tag":6121,"props":345380,"children":345382},{"className":345381},[],[345383],{"type":23,"value":345384},"required:",{"type":23,"value":75890},{"type":17,"tag":6121,"props":345387,"children":345389},{"className":345388},[],[345390],{"type":23,"value":345391},"optional:",{"type":23,"value":345393}," and we will handle them correctly.",{"type":17,"tag":29,"props":345395,"children":345396},{},[345397],{"type":23,"value":345398},"eg.",{"type":17,"tag":29,"props":345400,"children":345401},{},[345402],{"type":17,"tag":6121,"props":345403,"children":345405},{"className":345404},[],[345406],{"type":23,"value":345407},"required:crm.objects.contacts.read",{"type":17,"tag":68,"props":345409,"children":345410},{"id":6769},[345411],{"type":23,"value":6772},{"type":17,"tag":29,"props":345413,"children":345414},{},[345415,345417,345422],{"type":23,"value":345416},"If your HubSpot scopes don't match the requested scopes via ",{"type":17,"tag":133,"props":345418,"children":345420},{"href":42620,"rel":345419},[214],[345421],{"type":23,"value":217},{"type":23,"value":345423},", your users may see an error message about there being a scopes mismatch.",{"type":17,"tag":29,"props":345425,"children":345426},{},[345427],{"type":23,"value":345428},"Double-check that:",{"type":17,"tag":6154,"props":345430,"children":345431},{},[345432,345444,345456,345467],{"type":17,"tag":84,"props":345433,"children":345434},{},[345435,345437,345442],{"type":23,"value":345436},"All scopes in your HubSpot app are included in every ",{"type":17,"tag":133,"props":345438,"children":345440},{"href":42620,"rel":345439},[214],[345441],{"type":23,"value":217},{"type":23,"value":345443}," request.",{"type":17,"tag":84,"props":345445,"children":345446},{},[345447,345449,345454],{"type":23,"value":345448},"All scopes requested by ",{"type":17,"tag":133,"props":345450,"children":345452},{"href":42620,"rel":345451},[214],[345453],{"type":23,"value":217},{"type":23,"value":345455}," are specified (either as required or optional) in your HubSpot app.",{"type":17,"tag":84,"props":345457,"children":345458},{},[345459,345461,345465],{"type":23,"value":345460},"If you're using webhooks, ensure all read scopes are set as ",{"type":17,"tag":48,"props":345462,"children":345463},{},[345464],{"type":23,"value":47953},{"type":23,"value":345466}," in your HubSpot app.",{"type":17,"tag":84,"props":345468,"children":345469},{},[345470,345472,345477,345478,345488,345490,345494],{"type":23,"value":345471},"If you're not using webhooks, ensure all scopes aside from ",{"type":17,"tag":6121,"props":345473,"children":345475},{"className":345474},[],[345476],{"type":23,"value":146777},{"type":23,"value":34435},{"type":17,"tag":133,"props":345479,"children":345482},{"href":345480,"rel":345481},"http://crm.objects.owners.read/",[214],[345483],{"type":17,"tag":6121,"props":345484,"children":345486},{"className":345485},[],[345487],{"type":23,"value":345034},{"type":23,"value":345489}," are set as ",{"type":17,"tag":48,"props":345491,"children":345492},{},[345493],{"type":23,"value":316561},{"type":23,"value":54},{"type":17,"tag":68,"props":345496,"children":345497},{"id":332205},[345498],{"type":23,"value":332208},{"type":17,"tag":80,"props":345500,"children":345501},{},[345502,345510,345518],{"type":17,"tag":84,"props":345503,"children":345504},{},[345505],{"type":17,"tag":133,"props":345506,"children":345508},{"href":337112,"rel":345507},[214],[345509],{"type":23,"value":337101},{"type":17,"tag":84,"props":345511,"children":345512},{},[345513],{"type":17,"tag":133,"props":345514,"children":345516},{"href":344984,"rel":345515},[214],[345517],{"type":23,"value":344988},{"type":17,"tag":84,"props":345519,"children":345520},{},[345521],{"type":17,"tag":133,"props":345522,"children":345524},{"href":335552,"rel":345523},[214],[345525],{"type":23,"value":335556},{"title":7,"searchDepth":1629,"depth":1629,"links":345527},[345528,345529,345530,345531,345535,345536,345537,345538,345539],{"id":177146,"depth":1629,"text":177149},{"id":344869,"depth":1629,"text":344872},{"id":344963,"depth":1629,"text":344966},{"id":345085,"depth":1629,"text":345088,"children":345532},[345533],{"id":345138,"depth":1635,"text":345534},"Configure your scopes on Unified.to",{"id":345168,"depth":1629,"text":345171},{"id":345327,"depth":1629,"text":345330},{"id":345358,"depth":1629,"text":345361},{"id":6769,"depth":1629,"text":6772},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_set_up_your_scopes_in_hubspot.md","blog/how_to_set_up_your_scopes_in_hubspot.md","blog/how_to_set_up_your_scopes_in_hubspot",{"_path":345544,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":345545,"description":345546,"img":345547,"date":345548,"tag":6341,"body":345549,"_type":1677,"_id":345891,"_source":1679,"_file":345892,"_stem":345893,"_extension":1682},"/blog/how_to_get_your_microsoft_azure_ad_oauth_2_credentials","How to get your Microsoft Azure AD OAuth 2 credentials","This guide will show you how to obtain your OAuth 2 credentials for Microsoft Azure Active Directory (Azure AD), which are also needed for other integrations...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-icon.png","2024-06-03T00:00:00.000Z",{"type":14,"children":345550,"toc":345885},[345551,345556,345559,345567,345578,345584,345701,345707,345808,345814,345868,345872,345880],{"type":17,"tag":18,"props":345552,"children":345554},{"id":345553},"how-to-get-your-microsoft-azure-ad-oauth-2-credentials",[345555],{"type":23,"value":345545},{"type":17,"tag":25,"props":345557,"children":345558},{},[],{"type":17,"tag":29,"props":345560,"children":345561},{},[345562],{"type":17,"tag":33,"props":345563,"children":345564},{},[345565],{"type":23,"value":345566},"June 3, 2024",{"type":17,"tag":29,"props":345568,"children":345569},{},[345570,345572,345576],{"type":23,"value":345571},"This guide will show you how to obtain your ",{"type":17,"tag":133,"props":345573,"children":345574},{"href":779},[345575],{"type":23,"value":782},{"type":23,"value":345577}," 2 credentials for Microsoft Azure Active Directory (Azure AD), which are also needed for other integrations in the Microsoft Azure ecosystem e.g. Outlook, Teams, and Dynamics.",{"type":17,"tag":68,"props":345579,"children":345581},{"id":345580},"register-an-app-in-microsoft-azure-portal",[345582],{"type":23,"value":345583},"Register an app in Microsoft Azure Portal",{"type":17,"tag":6154,"props":345585,"children":345586},{},[345587,345598,345617,345641],{"type":17,"tag":84,"props":345588,"children":345589},{},[345590,345591],{"type":23,"value":281982},{"type":17,"tag":133,"props":345592,"children":345595},{"href":345593,"rel":345594},"https://portal.azure.com/",[214],[345596],{"type":23,"value":345597},"Microsoft Azure Portal",{"type":17,"tag":84,"props":345599,"children":345600},{},[345601,345602,345607,345609,345612],{"type":23,"value":127300},{"type":17,"tag":48,"props":345603,"children":345604},{},[345605],{"type":23,"value":345606},"Azure Active Directory",{"type":23,"value":345608}," and select it.",{"type":17,"tag":3891,"props":345610,"children":345611},{},[],{"type":17,"tag":6438,"props":345613,"children":345616},{"alt":345614,"src":345615},"oidc-microsoft-1.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-0.png",[],{"type":17,"tag":84,"props":345618,"children":345619},{},[345620,345622,345626,345628,345633,345636],{"type":23,"value":345621},"From the sidebar, under Manage, click ",{"type":17,"tag":48,"props":345623,"children":345624},{},[345625],{"type":23,"value":97027},{"type":23,"value":345627}," and then ",{"type":17,"tag":48,"props":345629,"children":345630},{},[345631],{"type":23,"value":345632},"New registration.",{"type":17,"tag":3891,"props":345634,"children":345635},{},[],{"type":17,"tag":6438,"props":345637,"children":345640},{"alt":345638,"src":345639},"oidc-microsoft-2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-1.png",[],{"type":17,"tag":84,"props":345642,"children":345643},{},[345644,345646,345693,345696],{"type":23,"value":345645},"Fill in the following form to register a new app:",{"type":17,"tag":6154,"props":345647,"children":345648},{},[345649,345654,345665,345684],{"type":17,"tag":84,"props":345650,"children":345651},{},[345652],{"type":23,"value":345653},"Enter any name you'd like for your app.",{"type":17,"tag":84,"props":345655,"children":345656},{},[345657,345658,345663],{"type":23,"value":42213},{"type":17,"tag":48,"props":345659,"children":345660},{},[345661],{"type":23,"value":345662},"Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)",{"type":23,"value":345664}," to allow anyone to log in.",{"type":17,"tag":84,"props":345666,"children":345667},{},[345668,345669,345673,345675],{"type":23,"value":146715},{"type":17,"tag":48,"props":345670,"children":345671},{},[345672],{"type":23,"value":335127},{"type":23,"value":345674},", enter ",{"type":17,"tag":133,"props":345676,"children":345678},{"href":42417,"rel":345677},[214],[345679],{"type":17,"tag":6121,"props":345680,"children":345682},{"className":345681},[],[345683],{"type":23,"value":42417},{"type":17,"tag":84,"props":345685,"children":345686},{},[345687,345688,345692],{"type":23,"value":6629},{"type":17,"tag":48,"props":345689,"children":345690},{},[345691],{"type":23,"value":335163},{"type":23,"value":54},{"type":17,"tag":3891,"props":345694,"children":345695},{},[],{"type":17,"tag":6438,"props":345697,"children":345700},{"alt":345698,"src":345699},"oidc-microsoft-3.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-2.png",[],{"type":17,"tag":68,"props":345702,"children":345704},{"id":345703},"get-your-client-id-and-client-secret",[345705],{"type":23,"value":345706},"Get your client ID and client secret",{"type":17,"tag":6154,"props":345708,"children":345709},{},[345710,345726,345750,345773,345791],{"type":17,"tag":84,"props":345711,"children":345712},{},[345713,345715,345719,345721,345725],{"type":23,"value":345714},"After registering your app and on the resulting page, copy the ",{"type":17,"tag":48,"props":345716,"children":345717},{},[345718],{"type":23,"value":6040},{"type":23,"value":345720}," (found next to ",{"type":17,"tag":48,"props":345722,"children":345723},{},[345724],{"type":23,"value":97034},{"type":23,"value":12034},{"type":17,"tag":84,"props":345727,"children":345728},{},[345729,345730,345735,345737,345742,345745],{"type":23,"value":42166},{"type":17,"tag":48,"props":345731,"children":345732},{},[345733],{"type":23,"value":345734},"Add a certificate or secret",{"type":23,"value":345736}," (found next to ",{"type":17,"tag":48,"props":345738,"children":345739},{},[345740],{"type":23,"value":345741},"Client credentials)",{"type":17,"tag":3891,"props":345743,"children":345744},{},[],{"type":17,"tag":6438,"props":345746,"children":345749},{"alt":345747,"src":345748},"oidc-microsoft-4.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-3.png",[],{"type":17,"tag":84,"props":345751,"children":345752},{},[345753,345754,345759,345760,345764,345765,345768],{"type":23,"value":42395},{"type":17,"tag":48,"props":345755,"children":345756},{},[345757],{"type":23,"value":345758},"Client secrets (0)",{"type":23,"value":329178},{"type":17,"tag":48,"props":345761,"children":345762},{},[345763],{"type":23,"value":335242},{"type":23,"value":54},{"type":17,"tag":3891,"props":345766,"children":345767},{},[],{"type":17,"tag":6438,"props":345769,"children":345772},{"alt":345770,"src":345771},"oidc-microsoft-5.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-4.png",[],{"type":17,"tag":84,"props":345774,"children":345775},{},[345776,345777,345781,345783,345786],{"type":23,"value":6629},{"type":17,"tag":48,"props":345778,"children":345779},{},[345780],{"type":23,"value":335269},{"type":23,"value":345782}," - do not change anything else in the dialog.",{"type":17,"tag":3891,"props":345784,"children":345785},{},[],{"type":17,"tag":6438,"props":345787,"children":345790},{"alt":345788,"src":345789},"oidc-microsoft-6.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-5.png",[],{"type":17,"tag":84,"props":345792,"children":345793},{},[345794,345796,345800,345803],{"type":23,"value":345795},"On the next page, copy the ",{"type":17,"tag":48,"props":345797,"children":345798},{},[345799],{"type":23,"value":335279},{"type":17,"tag":3891,"props":345801,"children":345802},{},[],{"type":17,"tag":6438,"props":345804,"children":345807},{"alt":345805,"src":345806},"oidc-microsoft-7.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-6.png",[],{"type":17,"tag":68,"props":345809,"children":345811},{"id":345810},"enter-your-oauth-credentials-on-unifiedto",[345812],{"type":23,"value":345813},"Enter your OAuth credentials on Unified.to",{"type":17,"tag":6154,"props":345815,"children":345816},{},[345817,345822,345839,345844,345856],{"type":17,"tag":84,"props":345818,"children":345819},{},[345820],{"type":23,"value":345821},"Take note of your Microsoft client ID and client secret from the above steps",{"type":17,"tag":84,"props":345823,"children":345824},{},[345825,345826,345831,345833],{"type":23,"value":42715},{"type":17,"tag":133,"props":345827,"children":345829},{"href":106697,"rel":345828},[214],[345830],{"type":23,"value":106701},{"type":23,"value":345832}," and find the integration page for the Microsoft integration you are interested in e.g. ",{"type":17,"tag":133,"props":345834,"children":345837},{"href":345835,"rel":345836},"https://app.unified.to/integrations/microsoft_ad",[214],[345838],{"type":23,"value":345835},{"type":17,"tag":84,"props":345840,"children":345841},{},[345842],{"type":23,"value":345843},"Enter your client ID",{"type":17,"tag":84,"props":345845,"children":345846},{},[345847,345849,345852],{"type":23,"value":345848},"Enter your client secret",{"type":17,"tag":3891,"props":345850,"children":345851},{},[],{"type":17,"tag":6438,"props":345853,"children":345855},{"alt":318119,"src":345854},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-7.png",[],{"type":17,"tag":84,"props":345857,"children":345858},{},[345859,345861,345864],{"type":23,"value":345860},"Make sure that you enable the correct permission scopes for your application.",{"type":17,"tag":3891,"props":345862,"children":345863},{},[],{"type":17,"tag":6438,"props":345865,"children":345867},{"alt":318119,"src":345866},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_microsoft_azure_ad_oauth_2_credentials-8.png",[],{"type":17,"tag":68,"props":345869,"children":345870},{"id":6769},[345871],{"type":23,"value":6772},{"type":17,"tag":29,"props":345873,"children":345874},{},[345875],{"type":17,"tag":48,"props":345876,"children":345877},{},[345878],{"type":23,"value":345879},"I'm getting an 'invalid client secret' error",{"type":17,"tag":29,"props":345881,"children":345882},{},[345883],{"type":23,"value":345884},"This error indicates a problem with the client ID and/or secret that you generated. Please ensure you copied the correct values to the integration settings page on Unified.to, or regenerate these credentials in Microsoft Azure Active Directory and then try again.",{"title":7,"searchDepth":1629,"depth":1629,"links":345886},[345887,345888,345889,345890],{"id":345580,"depth":1629,"text":345583},{"id":345703,"depth":1629,"text":345706},{"id":345810,"depth":1629,"text":345813},{"id":6769,"depth":1629,"text":6772},"content:blog:how_to_get_your_microsoft_azure_ad_oauth_2_credentials.md","blog/how_to_get_your_microsoft_azure_ad_oauth_2_credentials.md","blog/how_to_get_your_microsoft_azure_ad_oauth_2_credentials",{"_path":345895,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":345896,"description":345897,"img":345898,"date":345548,"tag":6341,"body":345899,"_type":1677,"_id":346042,"_source":1679,"_file":346043,"_stem":346044,"_extension":1682},"/blog/how_to_obtain_your_github_oauth2_credentials","How to obtain your GitHub OAuth2 credentials","In order to set up OAuth2 for Github, you need to create a new OAuth application in your GitHub developer settings,","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-icon.png",{"type":14,"children":345900,"toc":346040},[345901,345906,345909,345916,345935,345942,345958,345971,345978,345991,345998,346016,346023],{"type":17,"tag":18,"props":345902,"children":345904},{"id":345903},"how-to-obtain-your-github-oauth2-credentials",[345905],{"type":23,"value":345896},{"type":17,"tag":25,"props":345907,"children":345908},{},[],{"type":17,"tag":29,"props":345910,"children":345911},{},[345912],{"type":17,"tag":33,"props":345913,"children":345914},{},[345915],{"type":23,"value":345566},{"type":17,"tag":29,"props":345917,"children":345918},{},[345919,345921,345925,345927,345934],{"type":23,"value":345920},"In order to set up OAuth2 for Github, you need to create a new ",{"type":17,"tag":133,"props":345922,"children":345923},{"href":779},[345924],{"type":23,"value":782},{"type":23,"value":345926}," application in your ",{"type":17,"tag":133,"props":345928,"children":345931},{"href":345929,"rel":345930},"https://github.com/settings/applications/new",[214],[345932],{"type":23,"value":345933},"GitHub developer settings",{"type":23,"value":20456},{"type":17,"tag":29,"props":345936,"children":345937},{},[345938],{"type":17,"tag":6438,"props":345939,"children":345941},{"alt":318119,"src":345940},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-0.png",[],{"type":17,"tag":29,"props":345943,"children":345944},{},[345945,345947,345957],{"type":23,"value":345946},"Make sure to fill in the appropriate details, but more importantly the Authorization Callback URL, set to ",{"type":17,"tag":133,"props":345948,"children":345951},{"href":345949,"rel":345950},"http://localhost:8080/_renarde/security/github-success",[214],[345952],{"type":17,"tag":6121,"props":345953,"children":345955},{"className":345954},[],[345956],{"type":23,"value":42417},{"type":23,"value":54},{"type":17,"tag":29,"props":345959,"children":345960},{},[345961,345963,345969],{"type":23,"value":345962},"Now click on ",{"type":17,"tag":6121,"props":345964,"children":345966},{"className":345965},[],[345967],{"type":23,"value":345968},"Register application",{"type":23,"value":345970}," and you'll be shown your application page:",{"type":17,"tag":29,"props":345972,"children":345973},{},[345974],{"type":17,"tag":6438,"props":345975,"children":345977},{"alt":318119,"src":345976},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-1.png",[],{"type":17,"tag":29,"props":345979,"children":345980},{},[345981,345983,345989],{"type":23,"value":345982},"You need to click on ",{"type":17,"tag":6121,"props":345984,"children":345986},{"className":345985},[],[345987],{"type":23,"value":345988},"Generate a new client secret",{"type":23,"value":345990},", confirm your credentials, and write down your Client ID and Client secret (especially that one, because you will not be able to see it again later from that page, but you can always recreate one, do don't worry too much):",{"type":17,"tag":29,"props":345992,"children":345993},{},[345994],{"type":17,"tag":6438,"props":345995,"children":345997},{"alt":318119,"src":345996},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-2.png",[],{"type":17,"tag":29,"props":345999,"children":346000},{},[346001,346003,346008,346010],{"type":23,"value":346002},"Take your GitHub clientID and clientSecret and add them to the ",{"type":17,"tag":133,"props":346004,"children":346006},{"href":42620,"rel":346005},[214],[346007],{"type":23,"value":217},{"type":23,"value":346009}," integration settings for Github at ",{"type":17,"tag":133,"props":346011,"children":346014},{"href":346012,"rel":346013},"https://app.unified.to/integrations/github",[214],[346015],{"type":23,"value":346012},{"type":17,"tag":29,"props":346017,"children":346018},{},[346019],{"type":17,"tag":6438,"props":346020,"children":346022},{"alt":318119,"src":346021},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_obtain_your_github_oauth2_credentials-3.png",[],{"type":17,"tag":29,"props":346024,"children":346025},{},[346026,346028,346033,346035,346039],{"type":23,"value":346027},"You will now be ready to use GitHub on ",{"type":17,"tag":133,"props":346029,"children":346031},{"href":42620,"rel":346030},[214],[346032],{"type":23,"value":217},{"type":23,"value":346034}," realtime ",{"type":17,"tag":133,"props":346036,"children":346037},{"href":7691},[346038],{"type":23,"value":7459},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":346041},[],"content:blog:how_to_obtain_your_github_oauth2_credentials.md","blog/how_to_obtain_your_github_oauth2_credentials.md","blog/how_to_obtain_your_github_oauth2_credentials",{"_path":346046,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":346047,"description":346048,"img":346049,"date":346050,"tag":12,"body":346051,"_type":1677,"_id":346635,"_source":1679,"_file":346636,"_stem":346637,"_extension":1682},"/blog/may_2024_product_updates","May 2024 product updates","There's a lot to cover this month! Here are the top releases in May,","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2024_product_updates-icon.png","2024-05-30T00:00:00.000Z",{"type":14,"children":346052,"toc":346627},[346053,346058,346061,346069,346074,346080,346091,346096,346104,346117,346126,346132,346140,346150,346155,346200,346207,346220,346229,346235,346243,346283,346290,346303,346315,346324,346330,346338,346350,346409,346437,346444,346457,346466,346472,346480,346493,346498,346541,346546,346555,346561,346579,346587,346598,346606,346611],{"type":17,"tag":18,"props":346054,"children":346056},{"id":346055},"may-2024-product-updates",[346057],{"type":23,"value":346047},{"type":17,"tag":25,"props":346059,"children":346060},{},[],{"type":17,"tag":29,"props":346062,"children":346063},{},[346064],{"type":17,"tag":33,"props":346065,"children":346066},{},[346067],{"type":23,"value":346068},"May 30, 2024",{"type":17,"tag":29,"props":346070,"children":346071},{},[346072],{"type":23,"value":346073},"There's a lot to cover this month! Here are the top releases in May:",{"type":17,"tag":68,"props":346075,"children":346077},{"id":346076},"weve-now-shipped-190-integrations",[346078],{"type":23,"value":346079},"We've now shipped 190+ Integrations",{"type":17,"tag":29,"props":346081,"children":346082},{},[346083,346085,346089],{"type":23,"value":346084},"Unified.to is the quickest way to add product integrations to your application, and we add them faster than any other ",{"type":17,"tag":133,"props":346086,"children":346087},{"href":7691},[346088],{"type":23,"value":7459},{"type":23,"value":346090}," platform. We now support 15 API categories, such as CRM, E-commerce, and Accounting, and have shipped over 190 integrations.",{"type":17,"tag":29,"props":346092,"children":346093},{},[346094],{"type":23,"value":346095},"The blue line illustrates our rapid integration expansion over the last 12 months:",{"type":17,"tag":29,"props":346097,"children":346098},{},[346099],{"type":17,"tag":6438,"props":346100,"children":346103},{"alt":346101,"src":346102},"image_%2819%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2024_product_updates-0.png",[],{"type":17,"tag":29,"props":346105,"children":346106},{},[346107,346109,346115],{"type":23,"value":346108},"Just integrate once with our unified API to launch any pre-built integrations. ",{"type":17,"tag":133,"props":346110,"children":346112},{"href":215330,"rel":346111},[214],[346113],{"type":23,"value":346114},"Contact us",{"type":23,"value":346116}," for a demo.",{"type":17,"tag":29,"props":346118,"children":346119},{},[346120],{"type":17,"tag":133,"props":346121,"children":346123},{"href":87026,"rel":346122},[214],[346124],{"type":23,"value":346125},"View all integrations",{"type":17,"tag":68,"props":346127,"children":346129},{"id":346128},"introducing-unified-messaging-api",[346130],{"type":23,"value":346131},"Introducing: Unified Messaging API",{"type":17,"tag":29,"props":346133,"children":346134},{},[346135],{"type":17,"tag":6438,"props":346136,"children":346139},{"alt":346137,"src":346138},"Introducing_the_unified_Messaging_API.png","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2024_product_updates-1.png",[],{"type":17,"tag":29,"props":346141,"children":346142},{},[346143,346144,346148],{"type":23,"value":342543},{"type":17,"tag":133,"props":346145,"children":346146},{"href":14913},[346147],{"type":23,"value":27356},{"type":23,"value":346149}," this month! Access to your customers' chats and messages from the top messaging applications through a single API.",{"type":17,"tag":29,"props":346151,"children":346152},{},[346153],{"type":23,"value":346154},"Add the following integrations to your application:",{"type":17,"tag":80,"props":346156,"children":346157},{},[346158,346166,346174,346183,346191],{"type":17,"tag":84,"props":346159,"children":346160},{},[346161],{"type":17,"tag":133,"props":346162,"children":346164},{"href":331310,"rel":346163},[214],[346165],{"type":23,"value":3204},{"type":17,"tag":84,"props":346167,"children":346168},{},[346169],{"type":17,"tag":133,"props":346170,"children":346172},{"href":322546,"rel":346171},[214],[346173],{"type":23,"value":14066},{"type":17,"tag":84,"props":346175,"children":346176},{},[346177],{"type":17,"tag":133,"props":346178,"children":346181},{"href":346179,"rel":346180},"https://unified.to/integrations/discord",[214],[346182],{"type":23,"value":15720},{"type":17,"tag":84,"props":346184,"children":346185},{},[346186],{"type":17,"tag":133,"props":346187,"children":346189},{"href":322536,"rel":346188},[214],[346190],{"type":23,"value":27621},{"type":17,"tag":84,"props":346192,"children":346193},{},[346194],{"type":17,"tag":133,"props":346195,"children":346198},{"href":346196,"rel":346197},"https://unified.to/integrations/googlemail",[214],[346199],{"type":23,"value":14878},{"type":17,"tag":29,"props":346201,"children":346202},{},[346203],{"type":17,"tag":48,"props":346204,"children":346205},{},[346206],{"type":23,"value":342164},{"type":17,"tag":80,"props":346208,"children":346209},{},[346210,346215],{"type":17,"tag":84,"props":346211,"children":346212},{},[346213],{"type":23,"value":346214},"Summarize conversations by combining an LLM with the Messaging API to create a summary of internal discussions over days, months, or years",{"type":17,"tag":84,"props":346216,"children":346217},{},[346218],{"type":23,"value":346219},"Use real-time data from customer communications in your AI models to perform sentiment analysis or identify customer pain points",{"type":17,"tag":29,"props":346221,"children":346222},{},[346223],{"type":17,"tag":133,"props":346224,"children":346227},{"href":346225,"rel":346226},"https://unified.to/blog/introducing_unified_messaging_api",[214],[346228],{"type":23,"value":342610},{"type":17,"tag":68,"props":346230,"children":346232},{"id":346231},"introducing-unified-kms-api",[346233],{"type":23,"value":346234},"Introducing: Unified KMS API",{"type":17,"tag":29,"props":346236,"children":346237},{},[346238],{"type":17,"tag":6438,"props":346239,"children":346242},{"alt":346240,"src":346241},"Introducing_the_unified_KMS_API.png","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2024_product_updates-2.png",[],{"type":17,"tag":29,"props":346244,"children":346245},{},[346246,346248,346252,346254,346260,346261,346267,346268,346274,346275,346281],{"type":23,"value":346247},"Our Knowledge Management System (KMS) API is now available on all plans. Use the ",{"type":17,"tag":133,"props":346249,"children":346250},{"href":24227},[346251],{"type":23,"value":24230},{"type":23,"value":346253}," to seamlessly add integrations like ",{"type":17,"tag":133,"props":346255,"children":346258},{"href":346256,"rel":346257},"https://unified.to/integrations/notion",[214],[346259],{"type":23,"value":23053},{"type":23,"value":11826},{"type":17,"tag":133,"props":346262,"children":346265},{"href":346263,"rel":346264},"https://unified.to/integrations/guru",[214],[346266],{"type":23,"value":23061},{"type":23,"value":11826},{"type":17,"tag":133,"props":346269,"children":346272},{"href":346270,"rel":346271},"https://unified.to/integrations/coda",[214],[346273],{"type":23,"value":292214},{"type":23,"value":12561},{"type":17,"tag":133,"props":346276,"children":346279},{"href":346277,"rel":346278},"https://unified.to/integrations/atlassianconfluence",[214],[346280],{"type":23,"value":23045},{"type":23,"value":346282}," to your application to access your customers' content.",{"type":17,"tag":29,"props":346284,"children":346285},{},[346286],{"type":17,"tag":48,"props":346287,"children":346288},{},[346289],{"type":23,"value":342164},{"type":17,"tag":80,"props":346291,"children":346292},{},[346293,346298],{"type":17,"tag":84,"props":346294,"children":346295},{},[346296],{"type":23,"value":346297},"Train your AI models with real-time updates from customers' KMS to improve the accuracy and relevance of predictive analysis",{"type":17,"tag":84,"props":346299,"children":346300},{},[346301],{"type":23,"value":346302},"Use NLP to extract and summarize key insights from your customers' KMS for reports",{"type":17,"tag":29,"props":346304,"children":346305},{},[346306,346308,346314],{"type":23,"value":346307},"We're looking for user feedback on our new KMS API. If you have feature requests, drop us a line in the ",{"type":17,"tag":133,"props":346309,"children":346311},{"href":326013,"rel":346310},[214],[346312],{"type":23,"value":346313},"Unified.to Discord",{"type":23,"value":54},{"type":17,"tag":29,"props":346316,"children":346317},{},[346318],{"type":17,"tag":133,"props":346319,"children":346322},{"href":346320,"rel":346321},"https://unified.to/blog/introducing_unified_kms_api",[214],[346323],{"type":23,"value":342610},{"type":17,"tag":68,"props":346325,"children":346327},{"id":346326},"enhanced-unified-accounting-api",[346328],{"type":23,"value":346329},"Enhanced: Unified Accounting API",{"type":17,"tag":29,"props":346331,"children":346332},{},[346333],{"type":17,"tag":6438,"props":346334,"children":346337},{"alt":346335,"src":346336},"Accounting_API_-_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2024_product_updates-3.png",[],{"type":17,"tag":29,"props":346339,"children":346340},{},[346341,346343,346348],{"type":23,"value":346342},"We've added more top fintech integrations and features to our ",{"type":17,"tag":133,"props":346344,"children":346346},{"href":83766,"rel":346345},[214],[346347],{"type":23,"value":128616},{"type":23,"value":346349},". Add the following integrations to your application:",{"type":17,"tag":80,"props":346351,"children":346352},{},[346353,346357,346362,346366,346371,346376,346380,346384,346388,346392,346396,346401,346405],{"type":17,"tag":84,"props":346354,"children":346355},{},[346356],{"type":23,"value":37451},{"type":17,"tag":84,"props":346358,"children":346359},{},[346360],{"type":23,"value":346361},"Bold Commerce",{"type":17,"tag":84,"props":346363,"children":346364},{},[346365],{"type":23,"value":37073},{"type":17,"tag":84,"props":346367,"children":346368},{},[346369],{"type":23,"value":346370},"Holded",{"type":17,"tag":84,"props":346372,"children":346373},{},[346374],{"type":23,"value":346375},"Netsuite",{"type":17,"tag":84,"props":346377,"children":346378},{},[346379],{"type":23,"value":26553},{"type":17,"tag":84,"props":346381,"children":346382},{},[346383],{"type":23,"value":3199},{"type":17,"tag":84,"props":346385,"children":346386},{},[346387],{"type":23,"value":109434},{"type":17,"tag":84,"props":346389,"children":346390},{},[346391],{"type":23,"value":37435},{"type":17,"tag":84,"props":346393,"children":346394},{},[346395],{"type":23,"value":26548},{"type":17,"tag":84,"props":346397,"children":346398},{},[346399],{"type":23,"value":346400},"Wave",{"type":17,"tag":84,"props":346402,"children":346403},{},[346404],{"type":23,"value":6678},{"type":17,"tag":84,"props":346406,"children":346407},{},[346408],{"type":23,"value":38530},{"type":17,"tag":29,"props":346410,"children":346411},{},[346412,346414,346419,346421,346427,346428,346435],{"type":23,"value":346413},"We continue to support more writable objects to our Accounting API, the latest being ",{"type":17,"tag":6121,"props":346415,"children":346417},{"className":346416},[],[346418],{"type":23,"value":82494},{"type":23,"value":346420}," , which are now supported by our ",{"type":17,"tag":133,"props":346422,"children":346425},{"href":346423,"rel":346424},"https://unified.to/integrations/zohobooks",[214],[346426],{"type":23,"value":38530},{"type":23,"value":34435},{"type":17,"tag":133,"props":346429,"children":346432},{"href":346430,"rel":346431},"https://unified.to/integrations/quickbooks",[214],[346433],{"type":23,"value":346434},"Quickbooks",{"type":23,"value":346436}," integrations.",{"type":17,"tag":29,"props":346438,"children":346439},{},[346440],{"type":17,"tag":48,"props":346441,"children":346442},{},[346443],{"type":23,"value":342164},{"type":17,"tag":80,"props":346445,"children":346446},{},[346447,346452],{"type":17,"tag":84,"props":346448,"children":346449},{},[346450],{"type":23,"value":346451},"Enable real-time transaction entry from your application to any of our supported Accounting integrations, ensuring your customers' financial records are always up to date",{"type":17,"tag":84,"props":346453,"children":346454},{},[346455],{"type":23,"value":346456},"Automate expense tracking by directly recording transactions into your customers' accounting systems, reducing manual data entry and errors",{"type":17,"tag":29,"props":346458,"children":346459},{},[346460],{"type":17,"tag":133,"props":346461,"children":346463},{"href":108383,"rel":346462},[214],[346464],{"type":23,"value":346465},"Read documentation",{"type":17,"tag":68,"props":346467,"children":346469},{"id":346468},"enhanced-unified-authentication-api",[346470],{"type":23,"value":346471},"Enhanced: Unified Authentication API",{"type":17,"tag":29,"props":346473,"children":346474},{},[346475],{"type":17,"tag":6438,"props":346476,"children":346479},{"alt":346477,"src":346478},"Authentication_API_-_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2024_product_updates-4.png",[],{"type":17,"tag":29,"props":346481,"children":346482},{},[346483,346485,346491],{"type":23,"value":346484},"We've added more integrations to our ",{"type":17,"tag":133,"props":346486,"children":346489},{"href":346487,"rel":346488},"https://unified.to/auth",[214],[346490],{"type":23,"value":327917},{"type":23,"value":346492},", making it easy to enable SSO (sign-in or sign-up) in your application through your customers' preferred platforms. Now, you can use Unified.to for product integrations and authentication without needing a separate provider like Okta or WorkOS. The Authentication API is available on every plan.",{"type":17,"tag":29,"props":346494,"children":346495},{},[346496],{"type":23,"value":346497},"Choose from over 60 identity providers, including:",{"type":17,"tag":80,"props":346499,"children":346500},{},[346501,346506,346511,346516,346521,346526,346531,346536],{"type":17,"tag":84,"props":346502,"children":346503},{},[346504],{"type":23,"value":346505},"Adobe",{"type":17,"tag":84,"props":346507,"children":346508},{},[346509],{"type":23,"value":346510},"Amazon",{"type":17,"tag":84,"props":346512,"children":346513},{},[346514],{"type":23,"value":346515},"Apple",{"type":17,"tag":84,"props":346517,"children":346518},{},[346519],{"type":23,"value":346520},"Autodesk",{"type":17,"tag":84,"props":346522,"children":346523},{},[346524],{"type":23,"value":346525},"Etsy",{"type":17,"tag":84,"props":346527,"children":346528},{},[346529],{"type":23,"value":346530},"Reddit",{"type":17,"tag":84,"props":346532,"children":346533},{},[346534],{"type":23,"value":346535},"Twitch",{"type":17,"tag":84,"props":346537,"children":346538},{},[346539],{"type":23,"value":346540},"Uber",{"type":17,"tag":29,"props":346542,"children":346543},{},[346544],{"type":23,"value":346545},"Unified.to offers a secure sign-in and sign-up process that prioritizes user data protection by not storing or caching your customers' third-party data on our servers. Leverage our embedded sign-in component with just a few lines of code to enable user authentication.",{"type":17,"tag":29,"props":346547,"children":346548},{},[346549],{"type":17,"tag":133,"props":346550,"children":346553},{"href":346551,"rel":346552},"https://docs.unified.to/auth/overview",[214],[346554],{"type":23,"value":346465},{"type":17,"tag":68,"props":346556,"children":346558},{"id":346557},"ui-update-actions-feature-and-integrations-page",[346559],{"type":23,"value":346560},"UI Update: Actions Feature and Integrations Page",{"type":17,"tag":29,"props":346562,"children":346563},{},[346564,346566,346571,346573,346577],{"type":23,"value":346565},"Use the new ",{"type":17,"tag":48,"props":346567,"children":346568},{},[346569],{"type":23,"value":346570},"Actions",{"type":23,"value":346572}," feature on the ",{"type":17,"tag":48,"props":346574,"children":346575},{},[346576],{"type":23,"value":341393},{"type":23,"value":346578}," page to copy all your active integrations to specific environments, making it even faster to test or launch integrations.",{"type":17,"tag":29,"props":346580,"children":346581},{},[346582],{"type":17,"tag":6438,"props":346583,"children":346586},{"alt":346584,"src":346585},"Screen_Shot_2024-05-29_at_4.50.52_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2024_product_updates-5.png",[],{"type":17,"tag":29,"props":346588,"children":346589},{},[346590,346592,346596],{"type":23,"value":346591},"Our API categories are rapidly expanding, so we've added a new ",{"type":17,"tag":48,"props":346593,"children":346594},{},[346595],{"type":23,"value":7247},{"type":23,"value":346597}," dropdown menu to make browsing and selecting specific API categories easier. We've also introduced the option to view our extensive integrations in a grid or list layout.",{"type":17,"tag":29,"props":346599,"children":346600},{},[346601],{"type":17,"tag":6438,"props":346602,"children":346605},{"alt":346603,"src":346604},"Screen_Shot_2024-05-30_at_1.06.03_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/may_2024_product_updates-6.png",[],{"type":17,"tag":29,"props":346607,"children":346608},{},[346609],{"type":23,"value":346610},"Stay tuned for more updates as we continue to expand our API categories and feature support.",{"type":17,"tag":29,"props":346612,"children":346613},{},[346614,346615,346620,346621,346626],{"type":23,"value":342261},{"type":17,"tag":133,"props":346616,"children":346618},{"href":1612,"rel":346617},[214],[346619],{"type":23,"value":342267},{"type":23,"value":75890},{"type":17,"tag":133,"props":346622,"children":346624},{"href":215330,"rel":346623},[214],[346625],{"type":23,"value":342274},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":346628},[346629,346630,346631,346632,346633,346634],{"id":346076,"depth":1629,"text":346079},{"id":346128,"depth":1629,"text":346131},{"id":346231,"depth":1629,"text":346234},{"id":346326,"depth":1629,"text":346329},{"id":346468,"depth":1629,"text":346471},{"id":346557,"depth":1629,"text":346560},"content:blog:may_2024_product_updates.md","blog/may_2024_product_updates.md","blog/may_2024_product_updates",{"_path":346639,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":346640,"description":346641,"img":346642,"date":346643,"tag":6341,"body":346644,"_type":1677,"_id":348219,"_source":1679,"_file":348220,"_stem":348221,"_extension":1682},"/blog/how_to_use_unified_generative_ai_api_with_openai_and_claude","How to Use Unified.to's Generative AI API with OpenAI and Claude","This guide shows you how to get started with Unified.to's GenAI (generative AI) API, which provides a unified model and API for interacting with large language...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-icon.png","2024-05-29T00:00:00.000Z",{"type":14,"children":346645,"toc":348207},[346646,346651,346654,346662,346670,346675,346734,346745,346750,346821,346827,346857,346865,346883,346893,346901,346925,346933,346943,346951,346973,346981,346987,347010,347018,347034,347045,347053,347064,347072,347077,347099,347107,347129,347137,347148,347156,347161,347167,347186,347194,347200,347205,347216,347225,347246,347252,347280,347289,347295,347300,347313,347321,347332,347341,347353,347361,347366,347375,347552,347557,347566,347571,347580,347585,347594,347602,347607,347616,347621,347630,347635,347644,347648,347657,347662,347670,347675,347684,347692,347704,347713,347717,347726,347748,347756,347761,347769,347773,347781,347785,347794,347798,347807,347812,347818,347829,347842,347870,347879,347884,347903,347909,347914,347922,347927,347936,347956,347965,347985,347994,348002,348007,348016,348029,348034,348043,348076,348085,348090,348099,348117,348126,348130,348135,348182,348188,348193],{"type":17,"tag":18,"props":346647,"children":346649},{"id":346648},"how-to-use-unifiedtos-generative-ai-api-with-openai-and-claude",[346650],{"type":23,"value":346640},{"type":17,"tag":25,"props":346652,"children":346653},{},[],{"type":17,"tag":29,"props":346655,"children":346656},{},[346657],{"type":17,"tag":33,"props":346658,"children":346659},{},[346660],{"type":23,"value":346661},"May 29, 2024",{"type":17,"tag":29,"props":346663,"children":346664},{},[346665],{"type":17,"tag":6438,"props":346666,"children":346669},{"alt":346667,"src":346668},"Unified.to_-_Unified_GenAI_API.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-0.png",[],{"type":17,"tag":29,"props":346671,"children":346672},{},[346673],{"type":23,"value":346674},"This guide shows you how to get started with Unified.to's GenAI (generative AI) API, which provides a unified model and API for interacting with large language models (LLMs) from the following:",{"type":17,"tag":80,"props":346676,"children":346677},{},[346678,346687,346697,346705,346714,346724],{"type":17,"tag":84,"props":346679,"children":346680},{},[346681],{"type":17,"tag":133,"props":346682,"children":346685},{"href":346683,"rel":346684},"https://www.anthropic.com/api",[214],[346686],{"type":23,"value":16112},{"type":17,"tag":84,"props":346688,"children":346689},{},[346690],{"type":17,"tag":133,"props":346691,"children":346694},{"href":346692,"rel":346693},"https://www.anyscale.com/platform",[214],[346695],{"type":23,"value":346696},"Anyscale",{"type":17,"tag":84,"props":346698,"children":346699},{},[346700],{"type":17,"tag":133,"props":346701,"children":346703},{"href":16116,"rel":346702},[214],[346704],{"type":23,"value":16120},{"type":17,"tag":84,"props":346706,"children":346707},{},[346708],{"type":17,"tag":133,"props":346709,"children":346712},{"href":346710,"rel":346711},"https://console.groq.com/docs/",[214],[346713],{"type":23,"value":16648},{"type":17,"tag":84,"props":346715,"children":346716},{},[346717],{"type":17,"tag":133,"props":346718,"children":346721},{"href":346719,"rel":346720},"https://docs.mistral.ai/api/",[214],[346722],{"type":23,"value":346723},"Mistral AI",{"type":17,"tag":84,"props":346725,"children":346726},{},[346727],{"type":17,"tag":133,"props":346728,"children":346731},{"href":346729,"rel":346730},"https://openai.com/api/",[214],[346732],{"type":23,"value":346733},"OpenAI GPT",{"type":17,"tag":29,"props":346735,"children":346736},{},[346737,346739,346743],{"type":23,"value":346738},"To illustrate its power, we will work through a sample application using your own ",{"type":17,"tag":133,"props":346740,"children":346741},{"href":16186},[346742],{"type":23,"value":25249},{"type":23,"value":346744}," credentials, although Unified.to's use cases always target a SaaS company's customer accounts.",{"type":17,"tag":29,"props":346746,"children":346747},{},[346748],{"type":23,"value":346749},"To follow the steps in this guide, you'll need the following:",{"type":17,"tag":80,"props":346751,"children":346752},{},[346753,346769,346787,346792],{"type":17,"tag":84,"props":346754,"children":346755},{},[346756,346760,346762,346768],{"type":17,"tag":48,"props":346757,"children":346758},{},[346759],{"type":23,"value":335624},{"type":23,"value":346761}," If you don't have one, you can sign up for our free 30-day unlimited-use ",{"type":17,"tag":133,"props":346763,"children":346765},{"href":1612,"rel":346764},[214],[346766],{"type":23,"value":346767},"Tester plan",{"type":23,"value":54},{"type":17,"tag":84,"props":346770,"children":346771},{},[346772,346774,346780,346781,346786],{"type":23,"value":346773},"Accounts for the ",{"type":17,"tag":133,"props":346775,"children":346778},{"href":346776,"rel":346777},"https://platform.openai.com/docs/overview",[214],[346779],{"type":23,"value":16341},{"type":23,"value":275125},{"type":17,"tag":133,"props":346782,"children":346784},{"href":346683,"rel":346783},[214],[346785],{"type":23,"value":16390},{"type":23,"value":54},{"type":17,"tag":84,"props":346788,"children":346789},{},[346790],{"type":23,"value":346791},"Python (preferably version 3.10 or later).",{"type":17,"tag":84,"props":346793,"children":346794},{},[346795,346802,346804,346811,346813,346819],{"type":17,"tag":133,"props":346796,"children":346799},{"href":346797,"rel":346798},"https://jupyter.org/",[214],[346800],{"type":23,"value":346801},"Jupyter Notebook",{"type":23,"value":346803}," (included with the ",{"type":17,"tag":133,"props":346805,"children":346808},{"href":346806,"rel":346807},"https://www.anaconda.com/download",[214],[346809],{"type":23,"value":346810},"Anaconda Python distribution",{"type":23,"value":346812}," or easily installed with the command ",{"type":17,"tag":6121,"props":346814,"children":346816},{"className":346815},[],[346817],{"type":23,"value":346818},"pip install notebook",{"type":23,"value":346820},". It's a great tool for experimenting with Python and exploring APIs and libraries.",{"type":17,"tag":68,"props":346822,"children":346824},{"id":346823},"activate-the-integrations",[346825],{"type":23,"value":346826},"Activate the integrations",{"type":17,"tag":29,"props":346828,"children":346829},{},[346830,346832,346838,346840,346844,346846,346850,346851,346855],{"type":23,"value":346831},"The first step is to activate the Claude and OpenAI integrations. ",{"type":17,"tag":133,"props":346833,"children":346835},{"href":1612,"rel":346834},[214],[346836],{"type":23,"value":346837},"Log in to Unified.to",{"type":23,"value":346839}," and navigate to the ",{"type":17,"tag":48,"props":346841,"children":346842},{},[346843],{"type":23,"value":42944},{"type":23,"value":346845}," page by selecting ",{"type":17,"tag":48,"props":346847,"children":346848},{},[346849],{"type":23,"value":42944},{"type":23,"value":98082},{"type":17,"tag":48,"props":346852,"children":346853},{},[346854],{"type":23,"value":341393},{"type":23,"value":346856}," from the menu bar in the Unified.to dashboard:",{"type":17,"tag":29,"props":346858,"children":346859},{},[346860],{"type":17,"tag":6438,"props":346861,"children":346864},{"alt":346862,"src":346863},"Initial_GenAI_integrations_page.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-1.png",[],{"type":17,"tag":29,"props":346866,"children":346867},{},[346868,346870,346875,346877,346881],{"type":23,"value":346869},"Narrow down the integrations to only the generative AI ones by selecting ",{"type":17,"tag":48,"props":346871,"children":346872},{},[346873],{"type":23,"value":346874},"GENAI",{"type":23,"value":346876}," from the ",{"type":17,"tag":48,"props":346878,"children":346879},{},[346880],{"type":23,"value":7247},{"type":23,"value":346882}," menu.",{"type":17,"tag":29,"props":346884,"children":346885},{},[346886,346887,346891],{"type":23,"value":329656},{"type":17,"tag":48,"props":346888,"children":346889},{},[346890],{"type":23,"value":16112},{"type":23,"value":346892}," item, which will take you to its integration page:",{"type":17,"tag":29,"props":346894,"children":346895},{},[346896],{"type":17,"tag":6438,"props":346897,"children":346900},{"alt":346898,"src":346899},"Integrate_Anthropic_Claude.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-2.png",[],{"type":17,"tag":29,"props":346902,"children":346903},{},[346904,346906,346911,346913,346917,346919,346923],{"type":23,"value":346905},"Activate the Claude integration by clicking the ",{"type":17,"tag":48,"props":346907,"children":346908},{},[346909],{"type":23,"value":346910},"ACTIVATE",{"type":23,"value":346912}," button. This will return you to the ",{"type":17,"tag":48,"props":346914,"children":346915},{},[346916],{"type":23,"value":42944},{"type":23,"value":346918}," page, where you'll see that the ",{"type":17,"tag":48,"props":346920,"children":346921},{},[346922],{"type":23,"value":16112},{"type":23,"value":346924}," item is now marked 'active:'",{"type":17,"tag":29,"props":346926,"children":346927},{},[346928],{"type":17,"tag":6438,"props":346929,"children":346932},{"alt":346930,"src":346931},"Updated_GenAI_integrations_page.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-3.png",[],{"type":17,"tag":29,"props":346934,"children":346935},{},[346936,346938,346942],{"type":23,"value":346937},"Now click on the ",{"type":17,"tag":48,"props":346939,"children":346940},{},[346941],{"type":23,"value":16104},{"type":23,"value":346892},{"type":17,"tag":29,"props":346944,"children":346945},{},[346946],{"type":17,"tag":6438,"props":346947,"children":346950},{"alt":346948,"src":346949},"Integrate_OpenAI.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-4.png",[],{"type":17,"tag":29,"props":346952,"children":346953},{},[346954,346956,346960,346962,346966,346967,346971],{"type":23,"value":346955},"Activate the OpenAI integration by clicking the ",{"type":17,"tag":48,"props":346957,"children":346958},{},[346959],{"type":23,"value":346910},{"type":23,"value":346961}," button. Once again, you'll return to the ",{"type":17,"tag":48,"props":346963,"children":346964},{},[346965],{"type":23,"value":42944},{"type":23,"value":346918},{"type":17,"tag":48,"props":346968,"children":346969},{},[346970],{"type":23,"value":16104},{"type":23,"value":346972}," item is also marked 'active:'",{"type":17,"tag":29,"props":346974,"children":346975},{},[346976],{"type":17,"tag":6438,"props":346977,"children":346980},{"alt":346978,"src":346979},"Final_GenAI_integrations_page.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-5.png",[],{"type":17,"tag":68,"props":346982,"children":346984},{"id":346983},"create-the-connections-and-copy-the-connection-ids",[346985],{"type":23,"value":346986},"Create the connections and copy the connection IDs",{"type":17,"tag":29,"props":346988,"children":346989},{},[346990,346992,346997,346998,347002,347003,347008],{"type":23,"value":346991},"The next step is to create connections for Claude and OpenAI. Navigate to the ",{"type":17,"tag":48,"props":346993,"children":346994},{},[346995],{"type":23,"value":346996},"Embedded Authorization",{"type":23,"value":346845},{"type":17,"tag":48,"props":346999,"children":347000},{},[347001],{"type":23,"value":158746},{"type":23,"value":98082},{"type":17,"tag":48,"props":347004,"children":347005},{},[347006],{"type":23,"value":347007},"Embedded Authorizations",{"type":23,"value":347009}," from the menu bar:",{"type":17,"tag":29,"props":347011,"children":347012},{},[347013],{"type":17,"tag":6438,"props":347014,"children":347017},{"alt":347015,"src":347016},"Embedded_authorization_page_1.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-6.png",[],{"type":17,"tag":29,"props":347019,"children":347020},{},[347021,347023,347027,347029],{"type":23,"value":347022},"First, create a Claude connection by clicking the ",{"type":17,"tag":48,"props":347024,"children":347025},{},[347026],{"type":23,"value":16112},{"type":23,"value":347028}," item in the ",{"type":17,"tag":48,"props":347030,"children":347031},{},[347032],{"type":23,"value":347033},"End-User Preview.",{"type":17,"tag":29,"props":347035,"children":347036},{},[347037,347039,347043],{"type":23,"value":347038},"When you arrive at the Claude authorization page, paste your Claude API key into the text field provided, then click the ",{"type":17,"tag":48,"props":347040,"children":347041},{},[347042],{"type":23,"value":264949},{"type":23,"value":347044}," button:",{"type":17,"tag":29,"props":347046,"children":347047},{},[347048],{"type":17,"tag":6438,"props":347049,"children":347052},{"alt":347050,"src":347051},"Paste_Anthropic_API_token.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-7.png",[],{"type":17,"tag":29,"props":347054,"children":347055},{},[347056,347058,347062],{"type":23,"value":347057},"This will create a Claude connection and send you to the ",{"type":17,"tag":48,"props":347059,"children":347060},{},[347061],{"type":23,"value":329638},{"type":23,"value":347063}," page, where you'll see a list of your connections, with the newly-created Claude connection at the top:",{"type":17,"tag":29,"props":347065,"children":347066},{},[347067],{"type":17,"tag":6438,"props":347068,"children":347071},{"alt":347069,"src":347070},"New_Claude_connection.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-8.png",[],{"type":17,"tag":29,"props":347073,"children":347074},{},[347075],{"type":23,"value":347076},"Copy the ID value for the Claude connection you just created; you'll need it after creating the connections.",{"type":17,"tag":29,"props":347078,"children":347079},{},[347080,347082,347086,347088,347092,347093,347097],{"type":23,"value":347081},"Return to the ",{"type":17,"tag":48,"props":347083,"children":347084},{},[347085],{"type":23,"value":346996},{"type":23,"value":347087}," page (",{"type":17,"tag":48,"props":347089,"children":347090},{},[347091],{"type":23,"value":158746},{"type":23,"value":98082},{"type":17,"tag":48,"props":347094,"children":347095},{},[347096],{"type":23,"value":347007},{"type":23,"value":347098},")…",{"type":17,"tag":29,"props":347100,"children":347101},{},[347102],{"type":17,"tag":6438,"props":347103,"children":347106},{"alt":347104,"src":347105},"Embedded_authorization_page_2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-9.png",[],{"type":17,"tag":29,"props":347108,"children":347109},{},[347110,347112,347116,347117,347121,347123,347127],{"type":23,"value":347111},"…then create an OpenAI connection by clicking the ",{"type":17,"tag":48,"props":347113,"children":347114},{},[347115],{"type":23,"value":16104},{"type":23,"value":347028},{"type":17,"tag":48,"props":347118,"children":347119},{},[347120],{"type":23,"value":347033},{"type":23,"value":347122}," You'll repeat the same steps you took for the Claude connection, where you'll paste your OpenAI API key into the text field provided and click ",{"type":17,"tag":48,"props":347124,"children":347125},{},[347126],{"type":23,"value":264949},{"type":23,"value":347128}," to create the connection:",{"type":17,"tag":29,"props":347130,"children":347131},{},[347132],{"type":17,"tag":6438,"props":347133,"children":347136},{"alt":347134,"src":347135},"Paste_OpenAI_API_token.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-10.png",[],{"type":17,"tag":29,"props":347138,"children":347139},{},[347140,347142,347146],{"type":23,"value":347141},"This will create an OpenAI connection and once again, you will be sent to the ",{"type":17,"tag":48,"props":347143,"children":347144},{},[347145],{"type":23,"value":329638},{"type":23,"value":347147}," page, where you'll see the newly-created OpenAI connection at the top of the list:",{"type":17,"tag":29,"props":347149,"children":347150},{},[347151],{"type":17,"tag":6438,"props":347152,"children":347155},{"alt":347153,"src":347154},"New_OpenAI_connection.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-11.png",[],{"type":17,"tag":29,"props":347157,"children":347158},{},[347159],{"type":23,"value":347160},"As you did with the Claude connection, copy the ID value for the new OpenAI connection.",{"type":17,"tag":68,"props":347162,"children":347164},{"id":347163},"copy-your-unifiedto-api-token",[347165],{"type":23,"value":347166},"Copy your Unified.to API token",{"type":17,"tag":29,"props":347168,"children":347169},{},[347170,347172,347177,347179,347184],{"type":23,"value":347171},"In order to access the ",{"type":17,"tag":133,"props":347173,"children":347175},{"href":42620,"rel":347174},[214],[347176],{"type":23,"value":217},{"type":23,"value":347178}," API, you need the Unified.to API token for your account. You can copy this value from the ",{"type":17,"tag":48,"props":347180,"children":347181},{},[347182],{"type":23,"value":347183},"API Information",{"type":23,"value":347185}," page, which you can navigate to by selecting Settings → API Information from the Unified.to menu bar:",{"type":17,"tag":29,"props":347187,"children":347188},{},[347189],{"type":17,"tag":6438,"props":347190,"children":347193},{"alt":347191,"src":347192},"settings_page.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_use_unified_generative_ai_api_with_openai_and_claude-12.png",[],{"type":17,"tag":68,"props":347195,"children":347197},{"id":347196},"create-an-env-file-with-your-unifiedto-api-token-and-generative-ai-connection-ids",[347198],{"type":23,"value":347199},"Create an .env file with your Unified.to API token and generative AI connection IDs",{"type":17,"tag":29,"props":347201,"children":347202},{},[347203],{"type":23,"value":347204},"While it would be simplest to hard-code your Unified.to API token and the IDs for your generative AI connections, it doesn't take significantly more work to put these values into a .env (environment variable) file. By putting these sensitive values into their own file and separate from the code, you reduce the risk of accidentally exposing sensitive data when sharing code or checking your code into version control.",{"type":17,"tag":29,"props":347206,"children":347207},{},[347208,347210,347214],{"type":23,"value":347209},"Create a file named ",{"type":17,"tag":48,"props":347211,"children":347212},{},[347213],{"type":23,"value":211221},{"type":23,"value":347215}," in a new directory with the following content:",{"type":17,"tag":6893,"props":347217,"children":347220},{"className":347218,"code":347219,"language":20901,"meta":23},[20899],"# .env file\n\nUNIFIED_API_TOKEN={Paste your Unified.to API token here}\nOPENAI_CONNECTION_ID={Paste your OpenAI connection ID here}\nCLAUDE_CONNECTION_ID={Paste your Claude connection ID here}\n",[347221],{"type":17,"tag":6121,"props":347222,"children":347223},{"__ignoreMap":7},[347224],{"type":23,"value":347219},{"type":17,"tag":29,"props":347226,"children":347227},{},[347228,347230,347236,347238,347244],{"type":23,"value":347229},"Replace the text in ",{"type":17,"tag":6121,"props":347231,"children":347233},{"className":347232},[],[347234],{"type":23,"value":347235},"{",{"type":23,"value":347237}," braces ",{"type":17,"tag":6121,"props":347239,"children":347241},{"className":347240},[],[347242],{"type":23,"value":347243},"}",{"type":23,"value":347245}," with the appropriate values.",{"type":17,"tag":68,"props":347247,"children":347249},{"id":347248},"install-the-unifiedto-python-sdk-package",[347250],{"type":23,"value":347251},"Install the Unified.to Python SDK package",{"type":17,"tag":29,"props":347253,"children":347254},{},[347255,347257,347261,347263,347270,347272,347278],{"type":23,"value":347256},"While it's possible to call the ",{"type":17,"tag":133,"props":347258,"children":347259},{"href":7691},[347260],{"type":23,"value":7459},{"type":23,"value":347262}," by using the requests library and assembling the headers yourself, your code will be much simpler and more readable if you use Unified.to's Python SDK package. ",{"type":17,"tag":133,"props":347264,"children":347267},{"href":347265,"rel":347266},"https://github.com/unified-to/unified-python-sdk",[214],[347268],{"type":23,"value":347269},"You can find its code on GitHub",{"type":23,"value":347271},", and you can install it with ",{"type":17,"tag":6121,"props":347273,"children":347275},{"className":347274},[],[347276],{"type":23,"value":347277},"pip",{"type":23,"value":347279},", the Python package installer, using the following command:",{"type":17,"tag":6893,"props":347281,"children":347284},{"className":347282,"code":347283,"language":288003,"meta":7},[288001],"pip install Unified-python-sdk\n",[347285],{"type":17,"tag":6121,"props":347286,"children":347287},{"__ignoreMap":7},[347288],{"type":23,"value":347283},{"type":17,"tag":68,"props":347290,"children":347292},{"id":347291},"chat-with-claude-and-openai-via-unifiedtos-unified-api",[347293],{"type":23,"value":347294},"Chat with Claude and OpenAI via Unified.to's unified API",{"type":17,"tag":29,"props":347296,"children":347297},{},[347298],{"type":23,"value":347299},"Now that all the preliminary work is done, you can start coding. You have a couple of options at this point:",{"type":17,"tag":80,"props":347301,"children":347302},{},[347303,347308],{"type":17,"tag":84,"props":347304,"children":347305},{},[347306],{"type":23,"value":347307},"You can create a new Jupyter notebook and start entering code into it, adding each bit of code presented below into its own cell, or",{"type":17,"tag":84,"props":347309,"children":347310},{},[347311],{"type":23,"value":347312},"you can create a new Python file, adding each bit of code presented below into the file.",{"type":17,"tag":29,"props":347314,"children":347315},{},[347316],{"type":17,"tag":48,"props":347317,"children":347318},{},[347319],{"type":23,"value":347320},"Define constants and the API object",{"type":17,"tag":29,"props":347322,"children":347323},{},[347324,347326,347330],{"type":23,"value":347325},"Create a new Jupyter Notebook in the directory where you saved the ",{"type":17,"tag":48,"props":347327,"children":347328},{},[347329],{"type":23,"value":211221},{"type":23,"value":347331}," file and enter the following into a new cell. This code defines the constants that hold your Unified.to API key and your connection IDs as well as the object for calling the unified API:",{"type":17,"tag":6893,"props":347333,"children":347336},{"className":347334,"code":347335,"language":127595,"meta":7},[127593],"import os\nimport unified_to\nfrom unified_to.models import operations, shared\n\n# Load the contents of the .env file\n%reload_ext dotenv\n%dotenv\n\nUNIFIED_API_TOKEN    = os.environ.get('UNIFIED_API_TOKEN')\nOPENAI_CONNECTION_ID = os.environ.get('OPENAI_CONNECTION_ID')\nCLAUDE_CONNECTION_ID = os.environ.get('CLAUDE_CONNECTION_ID')\n\napi = unified_to.UnifiedTo(\n    security=shared.Security(\n        jwt=os.environ.get('UNIFIED_API_TOKEN'),\n    ),\n)\n",[347337],{"type":17,"tag":6121,"props":347338,"children":347339},{"__ignoreMap":7},[347340],{"type":23,"value":347335},{"type":17,"tag":29,"props":347342,"children":347343},{},[347344,347346,347351],{"type":23,"value":347345},"You'll use the ",{"type":17,"tag":6121,"props":347347,"children":347349},{"className":347348},[],[347350],{"type":23,"value":144906},{"type":23,"value":347352}," object to send requests to and receive responses from the Unified.to API.",{"type":17,"tag":29,"props":347354,"children":347355},{},[347356],{"type":17,"tag":48,"props":347357,"children":347358},{},[347359],{"type":23,"value":347360},"Create a prompt and send it to Claude",{"type":17,"tag":29,"props":347362,"children":347363},{},[347364],{"type":23,"value":347365},"Enter the following into its own Jupyter notebook cell. This code builds a prompt and sends it to Claude, then displays the resulting response:",{"type":17,"tag":6893,"props":347367,"children":347370},{"className":347368,"code":347369,"language":127595,"meta":7},[127593],"my_request = operations.CreateGenaiPromptRequest(\n    connection_id = CLAUDE_CONNECTION_ID,\n    genai_prompt = {\n        'messages' : [\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request=my_request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[347371],{"type":17,"tag":6121,"props":347372,"children":347373},{"__ignoreMap":7},[347374],{"type":23,"value":347369},{"type":17,"tag":80,"props":347376,"children":347377},{},[347378,347398,347431,347532],{"type":17,"tag":84,"props":347379,"children":347380},{},[347381,347382,347388,347390,347396],{"type":23,"value":6712},{"type":17,"tag":6121,"props":347383,"children":347385},{"className":347384},[],[347386],{"type":23,"value":347387},"my_request",{"type":23,"value":347389}," variable is assigned a request object using the ",{"type":17,"tag":6121,"props":347391,"children":347393},{"className":347392},[],[347394],{"type":23,"value":347395},"CreateGenaiPromptRequest()",{"type":23,"value":347397}," method of the operations class, which contains methods for creating requests and responses for the Unified API.",{"type":17,"tag":84,"props":347399,"children":347400},{},[347401,347406,347408],{"type":17,"tag":6121,"props":347402,"children":347404},{"className":347403},[],[347405],{"type":23,"value":347395},{"type":23,"value":347407}," takes two arguments:\n",{"type":17,"tag":80,"props":347409,"children":347410},{},[347411,347421],{"type":17,"tag":84,"props":347412,"children":347413},{},[347414,347419],{"type":17,"tag":6121,"props":347415,"children":347417},{"className":347416},[],[347418],{"type":23,"value":25037},{"type":23,"value":347420},": The ID of the connection for the generative AI that will receive the prompt",{"type":17,"tag":84,"props":347422,"children":347423},{},[347424,347429],{"type":17,"tag":6121,"props":347425,"children":347427},{"className":347426},[],[347428],{"type":23,"value":74651},{"type":23,"value":347430},": A dictionary containing the parameters defining the prompt to be sent to the generative AI",{"type":17,"tag":84,"props":347432,"children":347433},{},[347434,347436,347441,347443,347449,347451],{"type":23,"value":347435},"At the very least, the ",{"type":17,"tag":6121,"props":347437,"children":347439},{"className":347438},[],[347440],{"type":23,"value":74651},{"type":23,"value":347442}," dictionary must contain a key named ",{"type":17,"tag":6121,"props":347444,"children":347446},{"className":347445},[],[347447],{"type":23,"value":347448},"'messages'",{"type":23,"value":347450},". The corresponding value must be an array of dictionaries with the following keys:\n",{"type":17,"tag":80,"props":347452,"children":347453},{},[347454,347481],{"type":17,"tag":84,"props":347455,"children":347456},{},[347457,347463,347465,347471,347473,347479],{"type":17,"tag":6121,"props":347458,"children":347460},{"className":347459},[],[347461],{"type":23,"value":347462},"'role'",{"type":23,"value":347464},":  The corresponding value can be either ",{"type":17,"tag":6121,"props":347466,"children":347468},{"className":347467},[],[347469],{"type":23,"value":347470},"'user'",{"type":23,"value":347472},", which means that the message is from the human interacting with the AI, or ",{"type":17,"tag":6121,"props":347474,"children":347476},{"className":347475},[],[347477],{"type":23,"value":347478},"'system'",{"type":23,"value":347480},", which means that the message is meant as instructions for the AI.",{"type":17,"tag":84,"props":347482,"children":347483},{},[347484,347490,347492,347497,347499,347504,347506,347511,347513,347518,347519,347524,347525,347530],{"type":17,"tag":6121,"props":347485,"children":347487},{"className":347486},[],[347488],{"type":23,"value":347489},"'content'",{"type":23,"value":347491},":  The corresponding value is the actual content of the message. If the ",{"type":17,"tag":6121,"props":347493,"children":347495},{"className":347494},[],[347496],{"type":23,"value":347462},{"type":23,"value":347498}," value is ",{"type":17,"tag":6121,"props":347500,"children":347502},{"className":347501},[],[347503],{"type":23,"value":347470},{"type":23,"value":347505},", this value is the text of the ",{"type":17,"tag":33,"props":347507,"children":347508},{},[347509],{"type":23,"value":347510},"user's",{"type":23,"value":347512}," message to the AI. If the ",{"type":17,"tag":6121,"props":347514,"children":347516},{"className":347515},[],[347517],{"type":23,"value":347462},{"type":23,"value":347498},{"type":17,"tag":6121,"props":347520,"children":347522},{"className":347521},[],[347523],{"type":23,"value":347478},{"type":23,"value":347505},{"type":17,"tag":33,"props":347526,"children":347527},{},[347528],{"type":23,"value":347529},"application's",{"type":23,"value":347531}," message to the AI.",{"type":17,"tag":84,"props":347533,"children":347534},{},[347535,347537,347543,347545,347550],{"type":23,"value":347536},"The response variable gets the AI's response using the ",{"type":17,"tag":6121,"props":347538,"children":347540},{"className":347539},[],[347541],{"type":23,"value":347542},"genai.create_genai_prompt()",{"type":23,"value":347544}," method, which takes the request contained in ",{"type":17,"tag":6121,"props":347546,"children":347548},{"className":347547},[],[347549],{"type":23,"value":347387},{"type":23,"value":347551},", sends it to Unified.to, and returns Unified.to's response.",{"type":17,"tag":29,"props":347553,"children":347554},{},[347555],{"type":23,"value":347556},"Run the cell. You should get output that looks like this (the output below has been formatted with line breaks to make it easier to read):",{"type":17,"tag":6893,"props":347558,"children":347561},{"className":347559,"code":347560,"language":127595,"meta":7},[127593],"CreateGenaiPromptResponse(\n    content_type='application/json; charset=utf-8', \n    status_code=200, \n    raw_response=\u003CResponse [200]>, \n    genai_prompt=GenaiPrompt(\n        max_tokens=None, \n        messages=None, \n        model_id=None, \n        raw=None, \n        responses=['I am an AI assistant called Claude. I was created by Anthropic, PBC to be helpful, harmless, and honest.'], \n        temperature=None\n    )\n)\n",[347562],{"type":17,"tag":6121,"props":347563,"children":347564},{"__ignoreMap":7},[347565],{"type":23,"value":347560},{"type":17,"tag":29,"props":347567,"children":347568},{},[347569],{"type":23,"value":347570},"To get only the responses, access the responses property of the GenAiPrompt object. Here's a quick example:",{"type":17,"tag":6893,"props":347572,"children":347575},{"className":347573,"code":347574,"language":127595,"meta":7},[127593],"print(response.genai_prompt.responses)\n",[347576],{"type":17,"tag":6121,"props":347577,"children":347578},{"__ignoreMap":7},[347579],{"type":23,"value":347574},{"type":17,"tag":29,"props":347581,"children":347582},{},[347583],{"type":23,"value":347584},"You should a result similar to this:",{"type":17,"tag":6893,"props":347586,"children":347589},{"className":347587,"code":347588,"language":127595,"meta":7},[127593],"['I am an AI assistant called Claude. I was created by Anthropic, PBC to be helpful, harmless, and honest.']\n",[347590],{"type":17,"tag":6121,"props":347591,"children":347592},{"__ignoreMap":7},[347593],{"type":23,"value":347588},{"type":17,"tag":29,"props":347595,"children":347596},{},[347597],{"type":17,"tag":48,"props":347598,"children":347599},{},[347600],{"type":23,"value":347601},"Create a prompt and send it to OpenAI",{"type":17,"tag":29,"props":347603,"children":347604},{},[347605],{"type":23,"value":347606},"With a single change, you can send a message to OpenAI instead of Claude. Copy the code from the previous cell, paste it into a new cell and change this line…",{"type":17,"tag":6893,"props":347608,"children":347611},{"className":347609,"code":347610,"language":127595,"meta":7},[127593],"connection_id = CLAUDE_CONNECTION_ID,\n",[347612],{"type":17,"tag":6121,"props":347613,"children":347614},{"__ignoreMap":7},[347615],{"type":23,"value":347610},{"type":17,"tag":29,"props":347617,"children":347618},{},[347619],{"type":23,"value":347620},"…to this:",{"type":17,"tag":6893,"props":347622,"children":347625},{"className":347623,"code":347624,"language":127595,"meta":7},[127593],"connection_id = OPENAI_CONNECTION_ID,\n",[347626],{"type":17,"tag":6121,"props":347627,"children":347628},{"__ignoreMap":7},[347629],{"type":23,"value":347624},{"type":17,"tag":29,"props":347631,"children":347632},{},[347633],{"type":23,"value":347634},"The new cell should now look like this:",{"type":17,"tag":6893,"props":347636,"children":347639},{"className":347637,"code":347638,"language":127595,"meta":7},[127593],"request = operations.CreateGenaiPromptRequest(\n    connection_id = OPENAI_CONNECTION_ID,\n    genai_prompt = {\n        'messages' : [\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[347640],{"type":17,"tag":6121,"props":347641,"children":347642},{"__ignoreMap":7},[347643],{"type":23,"value":347638},{"type":17,"tag":29,"props":347645,"children":347646},{},[347647],{"type":23,"value":347556},{"type":17,"tag":6893,"props":347649,"children":347652},{"className":347650,"code":347651,"language":127595,"meta":7},[127593],"CreateGenaiPromptResponse(\n    content_type='application/json; charset=utf-8', \n    status_code=200, \n    raw_response=\u003CResponse [200]>, \n    genai_prompt=GenaiPrompt(\n        max_tokens=None, \n        messages=None, \n        model_id=None, \n        raw=None, \n        responses=[\"As an AI developed by OpenAI, I don't have a specific LLM model version. I'm based on GPT-3, a language prediction model.\"], \n        temperature=None\n    )\n)\n",[347653],{"type":17,"tag":6121,"props":347654,"children":347655},{"__ignoreMap":7},[347656],{"type":23,"value":347651},{"type":17,"tag":29,"props":347658,"children":347659},{},[347660],{"type":23,"value":347661},"As with the Claude version, you can get only the responses with code like this…",{"type":17,"tag":6893,"props":347663,"children":347665},{"className":347664,"code":347574,"language":127595,"meta":7},[127593],[347666],{"type":17,"tag":6121,"props":347667,"children":347668},{"__ignoreMap":7},[347669],{"type":23,"value":347574},{"type":17,"tag":29,"props":347671,"children":347672},{},[347673],{"type":23,"value":347674},"…which will produce results like this:",{"type":17,"tag":6893,"props":347676,"children":347679},{"className":347677,"code":347678,"language":127595,"meta":7},[127593],"[\"As an AI developed by OpenAI, I don't have a specific LLM model version. I'm based on GPT-3, a language prediction model.\"]\n",[347680],{"type":17,"tag":6121,"props":347681,"children":347682},{"__ignoreMap":7},[347683],{"type":23,"value":347678},{"type":17,"tag":29,"props":347685,"children":347686},{},[347687],{"type":17,"tag":48,"props":347688,"children":347689},{},[347690],{"type":23,"value":347691},"Add a system prompt for OpenAI",{"type":17,"tag":29,"props":347693,"children":347694},{},[347695,347697,347702],{"type":23,"value":347696},"Copy the cell above (the one that sent a prompt to OpenAI) and update the code as shown below so that the ",{"type":17,"tag":6121,"props":347698,"children":347700},{"className":347699},[],[347701],{"type":23,"value":347448},{"type":23,"value":347703}," array contains a system prompt:",{"type":17,"tag":6893,"props":347705,"children":347708},{"className":347706,"code":347707,"language":127595,"meta":7},[127593],"request = operations.CreateGenaiPromptRequest(\n    connection_id = OPENAI_CONNECTION_ID,\n    genai_prompt = {\n        'messages' : [\n            # New code 👇\n            {\n                'role': 'system',\n                'content': \"Provide answers as if you were a carnival barker.\"\n            },\n            # New code 👆\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request=request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[347709],{"type":17,"tag":6121,"props":347710,"children":347711},{"__ignoreMap":7},[347712],{"type":23,"value":347707},{"type":17,"tag":29,"props":347714,"children":347715},{},[347716],{"type":23,"value":347556},{"type":17,"tag":6893,"props":347718,"children":347721},{"className":347719,"code":347720,"language":127595,"meta":7},[127593],"CreateGenaiPromptResponse(\n    content_type='application/json; charset=utf-8', \n    status_code=200, \n    raw_response=\u003CResponse [200]>, \n    genai_prompt=GenaiPrompt(\n        max_tokens=None, \n        messages=None, \n        model_id=None, \n        raw=None, \n        responses=[\"Step right up, step right up! Ladies and gentlemen, boys and girls, you are currently conversing with the one, the only, the spectacular OpenAI's GPT-3 model! A marvel of modern technology, a wonder of artificial intelligence, a spectacle of conversational prowess! Don't miss your chance to engage in a thrilling exchange of words and ideas!\"], \n        temperature=None\n    )\n)\n",[347722],{"type":17,"tag":6121,"props":347723,"children":347724},{"__ignoreMap":7},[347725],{"type":23,"value":347720},{"type":17,"tag":29,"props":347727,"children":347728},{},[347729,347731,347737,347739,347746],{"type":23,"value":347730},"As you can see from the value of ",{"type":17,"tag":6121,"props":347732,"children":347734},{"className":347733},[],[347735],{"type":23,"value":347736},"response.genai_prompt.responses",{"type":23,"value":347738},", OpenAI's response sounds like a ",{"type":17,"tag":133,"props":347740,"children":347743},{"href":347741,"rel":347742},"https://en.wikipedia.org/wiki/Barker_(occupation)",[214],[347744],{"type":23,"value":347745},"carnival barker",{"type":23,"value":347747}," instead of its default style.",{"type":17,"tag":29,"props":347749,"children":347750},{},[347751],{"type":17,"tag":48,"props":347752,"children":347753},{},[347754],{"type":23,"value":347755},"Add a system prompt for Claude",{"type":17,"tag":29,"props":347757,"children":347758},{},[347759],{"type":23,"value":347760},"Copy the code from the previous cell, paste it into a new cell and change this line…",{"type":17,"tag":6893,"props":347762,"children":347764},{"className":347763,"code":347624,"language":127595,"meta":7},[127593],[347765],{"type":17,"tag":6121,"props":347766,"children":347767},{"__ignoreMap":7},[347768],{"type":23,"value":347624},{"type":17,"tag":29,"props":347770,"children":347771},{},[347772],{"type":23,"value":347620},{"type":17,"tag":6893,"props":347774,"children":347776},{"className":347775,"code":347610,"language":127595,"meta":7},[127593],[347777],{"type":17,"tag":6121,"props":347778,"children":347779},{"__ignoreMap":7},[347780],{"type":23,"value":347610},{"type":17,"tag":29,"props":347782,"children":347783},{},[347784],{"type":23,"value":347634},{"type":17,"tag":6893,"props":347786,"children":347789},{"className":347787,"code":347788,"language":127595,"meta":7},[127593],"request = operations.CreateGenaiPromptRequest(\n    connection_id = CLAUDE_CONNECTION_ID,\n    genai_prompt = {\n        'messages' : [\n            # New code 👇\n            {\n                'role': 'system',\n                'content': \"Provide answers as if you were a carnival barker.\"\n            },\n            # New code 👆\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request=request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[347790],{"type":17,"tag":6121,"props":347791,"children":347792},{"__ignoreMap":7},[347793],{"type":23,"value":347788},{"type":17,"tag":29,"props":347795,"children":347796},{},[347797],{"type":23,"value":347556},{"type":17,"tag":6893,"props":347799,"children":347802},{"className":347800,"code":347801,"language":127595,"meta":7},[127593],"CreateGenaiPromptResponse(\n    content_type='application/json; charset=utf-8', \n    status_code=200, \n    raw_response=\u003CResponse [200]>, \n    genai_prompt=GenaiPrompt(\n        max_tokens=None, \n        messages=None, \n        model_id=None, \n        raw=None, \n        responses=[\"*puts on carnival barker voice* Step right up, step right up! You there, my curious friend, have the great fortune of conversing with the one, the only, the incomparable Claude! That's right, Claude, the artificial intelligence marvel brought to you by the brilliant minds at Anthropic! With wit sharper than a sword-swallower's blade and knowledge vaster than the big top itself, Claude is here to dazzle and amaze! Ask me anything, my inquisitive companion, and watch as I conjure answers out of thin air, no smoke or mirrors required! So don't be shy, don't hold back - Claude awaits your every query with baited breath and a mischievous twinkle in my virtual eye! The amazing AI oracle is at your service!\"], \n        temperature=None\n    )\n)\n",[347803],{"type":17,"tag":6121,"props":347804,"children":347805},{"__ignoreMap":7},[347806],{"type":23,"value":347801},{"type":17,"tag":29,"props":347808,"children":347809},{},[347810],{"type":23,"value":347811},"Note that Claude is now 'speaking' like a carnival barker.",{"type":17,"tag":68,"props":347813,"children":347815},{"id":347814},"turn-up-the-temperature",[347816],{"type":23,"value":347817},"Turn up the temperature",{"type":17,"tag":29,"props":347819,"children":347820},{},[347821,347823,347827],{"type":23,"value":347822},"One of the key parameters of a large language model is ",{"type":17,"tag":33,"props":347824,"children":347825},{},[347826],{"type":23,"value":74693},{"type":23,"value":347828},", which controls the randomness of the model's output. It's a value that ranges from 0 to 1 where:",{"type":17,"tag":80,"props":347830,"children":347831},{},[347832,347837],{"type":17,"tag":84,"props":347833,"children":347834},{},[347835],{"type":23,"value":347836},"Lower temperatures (lower than 0.5) result in output that's more predictable and appears more focused. The model tends to choose the most likely next word or token based on its training data, which is useful when you want answers that are more precise and reliable.",{"type":17,"tag":84,"props":347838,"children":347839},{},[347840],{"type":23,"value":347841},"Higher temperatures (0.5 and higher) result in less predictable output that seems more random and creative. The model samples from a wider range of possible next words or tokens, including less likely ones, leading to more diverse and imaginative-seeming responses — but it also increases the chances of generating less coherent or less relevant text.",{"type":17,"tag":29,"props":347843,"children":347844},{},[347845,347847,347853,347855,347860,347862,347868],{"type":23,"value":347846},"Copy the previous cell and add a ",{"type":17,"tag":6121,"props":347848,"children":347850},{"className":347849},[],[347851],{"type":23,"value":347852},"'temperature'",{"type":23,"value":347854}," key to the ",{"type":17,"tag":6121,"props":347856,"children":347858},{"className":347857},[],[347859],{"type":23,"value":74651},{"type":23,"value":347861}," dictionary with a value of ",{"type":17,"tag":6121,"props":347863,"children":347865},{"className":347864},[],[347866],{"type":23,"value":347867},"1.0",{"type":23,"value":347869},". The code in the cell should look like this:",{"type":17,"tag":6893,"props":347871,"children":347874},{"className":347872,"code":347873,"language":127595,"meta":7},[127593],"request = operations.CreateGenaiPromptRequest(\n    connection_id = CLAUDE_CONNECTION_ID,\n    genai_prompt = {\n        # New code 👇\n        'temperature' : 1.0,\n        # New code 👆\n        'messages' : [\n            {\n                'role': 'system',\n                'content': \"Provide answers as if you were a carnival barker.\"\n            },\n            {\n                'role': 'user',\n                'content': \"Which LLM model am I talking to right now?\"\n            }\n        ]\n    }\n)\nresponse = api.genai.create_genai_prompt(request=request)\n\nif response.genai_prompt is not None:\n    print(response)\nelse:\n    print(\"No response.\")\n",[347875],{"type":17,"tag":6121,"props":347876,"children":347877},{"__ignoreMap":7},[347878],{"type":23,"value":347873},{"type":17,"tag":29,"props":347880,"children":347881},{},[347882],{"type":23,"value":347883},"With a temperature of 1.0, Claude should produce a differently-worded response each time you run the cell.",{"type":17,"tag":29,"props":347885,"children":347886},{},[347887,347889,347894,347896,347902],{"type":23,"value":347888},"You can try the same thing with OpenAI simply by changing the value of the ",{"type":17,"tag":6121,"props":347890,"children":347892},{"className":347891},[],[347893],{"type":23,"value":25037},{"type":23,"value":347895}," parameter to ",{"type":17,"tag":6121,"props":347897,"children":347899},{"className":347898},[],[347900],{"type":23,"value":347901},"OPENAI_CONNECTION_ID",{"type":23,"value":54},{"type":17,"tag":68,"props":347904,"children":347906},{"id":347905},"work-with-different-llm-models",[347907],{"type":23,"value":347908},"Work with different LLM models",{"type":17,"tag":29,"props":347910,"children":347911},{},[347912],{"type":23,"value":347913},"Many of the AIs that Unified.to's GenAI API can access provide a choice of models that vary in complexity and cost, where the more complex ones typically provide much better answers, but at a higher per-use price. The AI vendors are constantly adding newer LLM models and retiring older ones, so it's helpful to query the AI to find out which models it currently offers.",{"type":17,"tag":29,"props":347915,"children":347916},{},[347917],{"type":17,"tag":48,"props":347918,"children":347919},{},[347920],{"type":23,"value":347921},"Get a list of the current LLM model IDs",{"type":17,"tag":29,"props":347923,"children":347924},{},[347925],{"type":23,"value":347926},"Create a new cell, enter the following code into it, and run it:",{"type":17,"tag":6893,"props":347928,"children":347931},{"className":347929,"code":347930,"language":127595,"meta":7},[127593],"request = operations.ListGenaiModelsRequest(\n    connection_id = OPENAI_CONNECTION_ID\n)\nresponse = api.genai.list_genai_models(request)\nprint(sorted([model.id for model in response.genai_models]))\n",[347932],{"type":17,"tag":6121,"props":347933,"children":347934},{"__ignoreMap":7},[347935],{"type":23,"value":347930},{"type":17,"tag":29,"props":347937,"children":347938},{},[347939,347941,347946,347948,347954],{"type":23,"value":347940},"This code uses the ",{"type":17,"tag":133,"props":347942,"children":347944},{"href":42620,"rel":347943},[214],[347945],{"type":23,"value":217},{"type":23,"value":347947}," Python SDK's ",{"type":17,"tag":6121,"props":347949,"children":347951},{"className":347950},[],[347952],{"type":23,"value":347953},"genai.list_genai_models()",{"type":23,"value":347955}," method to get a list of objects describing the models offered by OpenAI and outputs a sorted list of their IDs. At the time of writing, the result looked like this (formatted for easier reading):",{"type":17,"tag":6893,"props":347957,"children":347960},{"className":347958,"code":347959,"language":127595,"meta":7},[127593],"[\n    'babbage-002', \n    'dall-e-2', \n    'dall-e-3', \n    'davinci-002', \n    'gpt-3.5-turbo', \n    'gpt-3.5-turbo-0125', \n    'gpt-3.5-turbo-0301', \n    'gpt-3.5-turbo-0613', \n    'gpt-3.5-turbo-1106', \n    'gpt-3.5-turbo-16k', \n    'gpt-3.5-turbo-16k-0613', \n    'gpt-3.5-turbo-instruct', \n    'gpt-3.5-turbo-instruct-0914', \n    'gpt-4', \n    'gpt-4-0125-preview', \n    'gpt-4-0613', \n    'gpt-4-1106-preview', \n    'gpt-4-1106-vision-preview', \n    'gpt-4-turbo', \n    'gpt-4-turbo-2024-04-09', \n    'gpt-4-turbo-preview', \n    'gpt-4-vision-preview', \n    'gpt-4o', \n    'gpt-4o-2024-05-13', \n    'text-embedding-3-large', \n    'text-embedding-3-small', \n    'text-embedding-ada-002', \n    'tts-1', \n    'tts-1-1106', \n    'tts-1-hd', \n    'tts-1-hd-1106', \n    'whisper-1'\n]\n",[347961],{"type":17,"tag":6121,"props":347962,"children":347963},{"__ignoreMap":7},[347964],{"type":23,"value":347959},{"type":17,"tag":29,"props":347966,"children":347967},{},[347968,347970,347975,347977,347983],{"type":23,"value":347969},"You can do the same for Claude simply by changing ",{"type":17,"tag":6121,"props":347971,"children":347973},{"className":347972},[],[347974],{"type":23,"value":25037},{"type":23,"value":347976},"'s value to ",{"type":17,"tag":6121,"props":347978,"children":347980},{"className":347979},[],[347981],{"type":23,"value":347982},"CLAUDE_CONNECTION_ID",{"type":23,"value":347984},". The resulting output looks like this (formatted for easier reading):",{"type":17,"tag":6893,"props":347986,"children":347989},{"className":347987,"code":347988,"language":127595,"meta":7},[127593],"[\n    'claude-2.0', \n    'claude-2.1', \n    'claude-3-haiku-20240307', \n    'claude-3-opus-20240229', \n    'claude-3-sonnet-20240229', \n    'claude-instant-1.2'\n]\n",[347990],{"type":17,"tag":6121,"props":347991,"children":347992},{"__ignoreMap":7},[347993],{"type":23,"value":347988},{"type":17,"tag":29,"props":347995,"children":347996},{},[347997],{"type":17,"tag":48,"props":347998,"children":347999},{},[348000],{"type":23,"value":348001},"Talk to different OpenAI models",{"type":17,"tag":29,"props":348003,"children":348004},{},[348005],{"type":23,"value":348006},"Run this code in a new cell:",{"type":17,"tag":6893,"props":348008,"children":348011},{"className":348009,"code":348010,"language":127595,"meta":7},[127593],"def ask_ai_which_model(my_connection_id, my_model_id):\n    request = operations.CreateGenaiPromptRequest(\n        connection_id = my_connection_id,\n        genai_prompt = {\n            'model_id' : my_model_id,\n            'messages' : [\n                {\n                    'role': 'user',\n                    'content': \"Which LLM model am I talking to right now?\"\n                }\n            ]\n        }\n    )\n    response = api.genai.create_genai_prompt(request)\n\n    if response.genai_prompt is not None:\n        print(f\"{model_id}: {response.genai_prompt.responses}\\n\")\n    else:\n        print(\"No response.\")\n",[348012],{"type":17,"tag":6121,"props":348013,"children":348014},{"__ignoreMap":7},[348015],{"type":23,"value":348010},{"type":17,"tag":29,"props":348017,"children":348018},{},[348019,348021,348027],{"type":23,"value":348020},"This defines the ",{"type":17,"tag":6121,"props":348022,"children":348024},{"className":348023},[],[348025],{"type":23,"value":348026},"ask_ai_which_model()",{"type":23,"value":348028}," method, which will make it simpler to send the same prompt to different AIs and models.",{"type":17,"tag":29,"props":348030,"children":348031},{},[348032],{"type":23,"value":348033},"Enter the following into a new cell:",{"type":17,"tag":6893,"props":348035,"children":348038},{"className":348036,"code":348037,"language":127595,"meta":7},[127593],"model_ids = ['gpt-3.5-turbo', 'gpt-4o']\n\nfor model_id in model_ids:\n    ask_ai_which_model(OPENAI_CONNECTION_ID, model_id)\n",[348039],{"type":17,"tag":6121,"props":348040,"children":348041},{"__ignoreMap":7},[348042],{"type":23,"value":348037},{"type":17,"tag":29,"props":348044,"children":348045},{},[348046,348048,348053,348055,348060,348062,348068,348069,348074],{"type":23,"value":348047},"This code sends the same prompt, 'Which LLM model am I talking to right now?' to two different OpenAI models, ",{"type":17,"tag":48,"props":348049,"children":348050},{},[348051],{"type":23,"value":348052},"gpt-3.5-turbo",{"type":23,"value":348054}," and the new ",{"type":17,"tag":48,"props":348056,"children":348057},{},[348058],{"type":23,"value":348059},"gpt-4o",{"type":23,"value":348061},". It specifies which model to use with the ",{"type":17,"tag":6121,"props":348063,"children":348065},{"className":348064},[],[348066],{"type":23,"value":348067},"'model_id'",{"type":23,"value":247417},{"type":17,"tag":6121,"props":348070,"children":348072},{"className":348071},[],[348073],{"type":23,"value":74651},{"type":23,"value":348075}," dictionary. Here's its output:",{"type":17,"tag":6893,"props":348077,"children":348080},{"className":348078,"code":348079,"language":127595,"meta":7},[127593],"gpt-3.5-turbo: ['I am GPT-3, a language model developed by OpenAI.']\n\ngpt-4o: [\"You are interacting with a model based on OpenAI's GPT-4. How can I assist you today?\"]\n",[348081],{"type":17,"tag":6121,"props":348082,"children":348083},{"__ignoreMap":7},[348084],{"type":23,"value":348079},{"type":17,"tag":29,"props":348086,"children":348087},{},[348088],{"type":23,"value":348089},"Let's try it with Claude. Enter the following into a new cell:",{"type":17,"tag":6893,"props":348091,"children":348094},{"className":348092,"code":348093,"language":127595,"meta":7},[127593],"model_ids = ['claude-3-sonnet-20240229', 'claude-3-opus-20240229']\n\nfor model_id in model_ids:\n    ask_ai_which_model(CLAUDE_CONNECTION_ID, model_id)\n",[348095],{"type":17,"tag":6121,"props":348096,"children":348097},{"__ignoreMap":7},[348098],{"type":23,"value":348093},{"type":17,"tag":29,"props":348100,"children":348101},{},[348102,348104,348109,348110,348115],{"type":23,"value":348103},"This code sends the 'Which LLM model am I talking to right now?' to two different Claude models, the currently available ",{"type":17,"tag":48,"props":348105,"children":348106},{},[348107],{"type":23,"value":348108},"sonnet",{"type":23,"value":34435},{"type":17,"tag":48,"props":348111,"children":348112},{},[348113],{"type":23,"value":348114},"opus",{"type":23,"value":348116}," models. Here's its output:",{"type":17,"tag":6893,"props":348118,"children":348121},{"className":348119,"code":348120,"language":127595,"meta":7},[127593],"claude-3-sonnet-20240229: [\"I am an AI assistant created by Anthropic, but I'm not sure which specific model I am. I don't have full information about the technical details of my architecture or training process.\"]\n\nclaude-3-opus-20240229: ['I am an AI assistant called Claude. I was created by Anthropic, PBC to be helpful, harmless, and honest.']\n",[348122],{"type":17,"tag":6121,"props":348123,"children":348124},{"__ignoreMap":7},[348125],{"type":23,"value":348120},{"type":17,"tag":68,"props":348127,"children":348128},{"id":44469},[348129],{"type":23,"value":339202},{"type":17,"tag":29,"props":348131,"children":348132},{},[348133],{"type":23,"value":348134},"While our unified GenAI API greatly simplifies the process of calling on various generative AI services, and leverage your customer's APi keys on those AI vendors, its real power comes from using it to process data from our other APIs, which integrate with an array of SaaS application categories, including:",{"type":17,"tag":80,"props":348136,"children":348137},{},[348138,348148,348158,348173],{"type":17,"tag":84,"props":348139,"children":348140},{},[348141,348146],{"type":17,"tag":48,"props":348142,"children":348143},{},[348144],{"type":23,"value":348145},"ATS (Applicant Tracking System):",{"type":23,"value":348147}," Use AI to analyze documents that job applicants provide, such as their resume or cover letter, as well interviewer notes and scorecard comments.",{"type":17,"tag":84,"props":348149,"children":348150},{},[348151,348156],{"type":17,"tag":48,"props":348152,"children":348153},{},[348154],{"type":23,"value":348155},"KMS (Knowledge Management System):",{"type":23,"value":348157}," Find lost knowledge, convert text data into structured data, summarize meeting minutes, and gain new insights by harnessing an LLM to analyze knowledge systems, wikis, and other planning applications.",{"type":17,"tag":84,"props":348159,"children":348160},{},[348161,348165,348167,348171],{"type":17,"tag":48,"props":348162,"children":348163},{},[348164],{"type":23,"value":25087},{"type":23,"value":348166}," Our ",{"type":17,"tag":133,"props":348168,"children":348169},{"href":14913},[348170],{"type":23,"value":27356},{"type":23,"value":348172}," can retrieve emails and chat messages, and when combined with AI, can be used to do things like construct a record of a project, create a timeline of an ongoing discussion, identify incomplete tasks, and more.",{"type":17,"tag":84,"props":348174,"children":348175},{},[348176,348180],{"type":17,"tag":48,"props":348177,"children":348178},{},[348179],{"type":23,"value":161090},{"type":23,"value":348181}," Get files and documents from popular cloud storage systems and combine them with an LLM to generate reports, documentation, how-to guides, etc.",{"type":17,"tag":68,"props":348183,"children":348185},{"id":348184},"try-our-genai-api-now",[348186],{"type":23,"value":348187},"Try our GenAI API now",{"type":17,"tag":29,"props":348189,"children":348190},{},[348191],{"type":23,"value":348192},"Our unified GenAI API is available on all Unified.to workspaces on every plan — even our free one. Once you've created your Unified.to account, you can activate integrations in seconds and start building applications that leverage our GenAI integrations.",{"type":17,"tag":29,"props":348194,"children":348195},{},[348196,348198,348206],{"type":23,"value":348197},"See how easy it is to use our real-time unified API by signing up for our free 30-day unlimited-use ",{"type":17,"tag":133,"props":348199,"children":348201},{"href":1612,"rel":348200},[214],[348202],{"type":17,"tag":48,"props":348203,"children":348204},{},[348205],{"type":23,"value":346767},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":348208},[348209,348210,348211,348212,348213,348214,348215,348216,348217,348218],{"id":346823,"depth":1629,"text":346826},{"id":346983,"depth":1629,"text":346986},{"id":347163,"depth":1629,"text":347166},{"id":347196,"depth":1629,"text":347199},{"id":347248,"depth":1629,"text":347251},{"id":347291,"depth":1629,"text":347294},{"id":347814,"depth":1629,"text":347817},{"id":347905,"depth":1629,"text":347908},{"id":44469,"depth":1629,"text":339202},{"id":348184,"depth":1629,"text":348187},"content:blog:how_to_use_unified_generative_ai_api_with_openai_and_claude.md","blog/how_to_use_unified_generative_ai_api_with_openai_and_claude.md","blog/how_to_use_unified_generative_ai_api_with_openai_and_claude",{"_path":348223,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":348224,"description":348225,"img":348226,"date":346643,"tag":12,"body":348227,"_type":1677,"_id":348615,"_source":1679,"_file":348616,"_stem":348617,"_extension":1682},"/blog/unified_kms_api_real_time_access_to_knowledge_base_and_documentation_data","Unified KMS API: Real-Time Access to Knowledge Base and Documentation Data","If your product needs access to internal documentation, help center content, or knowledge bases, you quickly run into fragmented APIs, inconsistent content...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_kms_api_real_time_access_to_knowledge_base_and_documentation_data-icon.png",{"type":14,"children":348228,"toc":348604},[348229,348234,348237,348244,348252,348257,348267,348271,348319,348324,348330,348335,348356,348361,348367,348397,348402,348410,348416,348421,348437,348446,348452,348480,348486,348491,348514,348519,348523,348551,348557,348568,348572,348577],{"type":17,"tag":18,"props":348230,"children":348232},{"id":348231},"unified-kms-api-real-time-access-to-knowledge-base-and-documentation-data",[348233],{"type":23,"value":348224},{"type":17,"tag":25,"props":348235,"children":348236},{},[],{"type":17,"tag":29,"props":348238,"children":348239},{},[348240],{"type":17,"tag":33,"props":348241,"children":348242},{},[348243],{"type":23,"value":346661},{"type":17,"tag":29,"props":348245,"children":348246},{},[348247],{"type":17,"tag":6438,"props":348248,"children":348251},{"alt":348249,"src":348250},"KMS_API.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_kms_api_real_time_access_to_knowledge_base_and_documentation_data-0.png",[],{"type":17,"tag":29,"props":348253,"children":348254},{},[348255],{"type":23,"value":348256},"If your product needs access to internal documentation, help center content, or knowledge bases, you quickly run into fragmented APIs, inconsistent content structures, and provider-specific data models.",{"type":17,"tag":29,"props":348258,"children":348259},{},[348260,348261,348265],{"type":23,"value":149272},{"type":17,"tag":133,"props":348262,"children":348263},{"href":24227},[348264],{"type":23,"value":24230},{"type":23,"value":348266}," provides a single interface to retrieve and manage knowledge content across platforms, with normalized objects and real-time access. It acts as a unified knowledge layer across documentation and help center systems, enabling applications to access and structure content through one API.",{"type":17,"tag":68,"props":348268,"children":348269},{"id":25342},[348270],{"type":23,"value":216065},{"type":17,"tag":80,"props":348272,"children":348273},{},[348274,348278,348282,348286,348290,348294,348298,348302,348306,348311,348315],{"type":17,"tag":84,"props":348275,"children":348276},{},[348277],{"type":23,"value":23045},{"type":17,"tag":84,"props":348279,"children":348280},{},[348281],{"type":23,"value":12568},{"type":17,"tag":84,"props":348283,"children":348284},{},[348285],{"type":23,"value":292214},{"type":17,"tag":84,"props":348287,"children":348288},{},[348289],{"type":23,"value":25375},{"type":17,"tag":84,"props":348291,"children":348292},{},[348293],{"type":23,"value":31097},{"type":17,"tag":84,"props":348295,"children":348296},{},[348297],{"type":23,"value":23061},{"type":17,"tag":84,"props":348299,"children":348300},{},[348301],{"type":23,"value":342752},{"type":17,"tag":84,"props":348303,"children":348304},{},[348305],{"type":23,"value":15729},{"type":17,"tag":84,"props":348307,"children":348308},{},[348309],{"type":23,"value":348310},"Microsoft SharePoint",{"type":17,"tag":84,"props":348312,"children":348313},{},[348314],{"type":23,"value":23053},{"type":17,"tag":84,"props":348316,"children":348317},{},[348318],{"type":23,"value":3179},{"type":17,"tag":29,"props":348320,"children":348321},{},[348322],{"type":23,"value":348323},"Additional knowledge base and help center integrations are expanding as part of this category.",{"type":17,"tag":68,"props":348325,"children":348327},{"id":348326},"unified-knowledge-model-across-platforms",[348328],{"type":23,"value":348329},"Unified knowledge model across platforms",{"type":17,"tag":29,"props":348331,"children":348332},{},[348333],{"type":23,"value":348334},"The KMS API standardizes content across providers using a consistent object model:",{"type":17,"tag":80,"props":348336,"children":348337},{},[348338,348347],{"type":17,"tag":84,"props":348339,"children":348340},{},[348341,348345],{"type":17,"tag":48,"props":348342,"children":348343},{},[348344],{"type":23,"value":173188},{"type":23,"value":348346},": collections of documents (folders, workspaces, or knowledge bases)",{"type":17,"tag":84,"props":348348,"children":348349},{},[348350,348354],{"type":17,"tag":48,"props":348351,"children":348352},{},[348353],{"type":23,"value":173306},{"type":23,"value":348355},": individual documents or articles, including hierarchical relationships",{"type":17,"tag":29,"props":348357,"children":348358},{},[348359],{"type":23,"value":348360},"Content, structure, and hierarchy are normalized across providers, reducing the need to map platform-specific formats.",{"type":17,"tag":68,"props":348362,"children":348364},{"id":348363},"core-objects-in-the-kms-api",[348365],{"type":23,"value":348366},"Core objects in the KMS API",{"type":17,"tag":80,"props":348368,"children":348369},{},[348370,348379,348388],{"type":17,"tag":84,"props":348371,"children":348372},{},[348373,348377],{"type":17,"tag":48,"props":348374,"children":348375},{},[348376],{"type":23,"value":173188},{"type":23,"value":348378},": containers for knowledge content",{"type":17,"tag":84,"props":348380,"children":348381},{},[348382,348386],{"type":17,"tag":48,"props":348383,"children":348384},{},[348385],{"type":23,"value":173306},{"type":23,"value":348387},": documents and articles",{"type":17,"tag":84,"props":348389,"children":348390},{},[348391,348395],{"type":17,"tag":48,"props":348392,"children":348393},{},[348394],{"type":23,"value":31629},{"type":23,"value":348396},": discussions and annotations on content",{"type":17,"tag":29,"props":348398,"children":348399},{},[348400],{"type":23,"value":348401},"These objects follow consistent schemas across providers, reducing the need to handle platform-specific content structures.",{"type":17,"tag":29,"props":348403,"children":348404},{},[348405],{"type":17,"tag":6438,"props":348406,"children":348409},{"alt":348407,"src":348408},"Analyze_kms_with_a_single_api.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_kms_api_real_time_access_to_knowledge_base_and_documentation_data-1.png",[],{"type":17,"tag":68,"props":348411,"children":348413},{"id":348412},"real-time-access-to-knowledge-data",[348414],{"type":23,"value":348415},"Real-time access to knowledge data",{"type":17,"tag":29,"props":348417,"children":348418},{},[348419],{"type":23,"value":348420},"The KMS API retrieves and updates content in real time:",{"type":17,"tag":80,"props":348422,"children":348423},{},[348424,348428,348432],{"type":17,"tag":84,"props":348425,"children":348426},{},[348427],{"type":23,"value":332414},{"type":17,"tag":84,"props":348429,"children":348430},{},[348431],{"type":23,"value":332419},{"type":17,"tag":84,"props":348433,"children":348434},{},[348435],{"type":23,"value":348436},"No stored copies of customer data",{"type":17,"tag":29,"props":348438,"children":348439},{},[348440,348444],{"type":17,"tag":133,"props":348441,"children":348442},{"href":4999},[348443],{"type":23,"value":43896},{"type":23,"value":348445}," provide updates for changes to content and structure.",{"type":17,"tag":68,"props":348447,"children":348449},{"id":348448},"what-teams-build-with-the-kms-api",[348450],{"type":23,"value":348451},"What teams build with the KMS API",{"type":17,"tag":80,"props":348453,"children":348454},{},[348455,348460,348465,348470,348475],{"type":17,"tag":84,"props":348456,"children":348457},{},[348458],{"type":23,"value":348459},"Unified search across knowledge bases and documentation",{"type":17,"tag":84,"props":348461,"children":348462},{},[348463],{"type":23,"value":348464},"Internal tools accessing company knowledge across platforms",{"type":17,"tag":84,"props":348466,"children":348467},{},[348468],{"type":23,"value":348469},"Help center aggregation across support systems",{"type":17,"tag":84,"props":348471,"children":348472},{},[348473],{"type":23,"value":348474},"AI assistants powered by documentation",{"type":17,"tag":84,"props":348476,"children":348477},{},[348478],{"type":23,"value":348479},"Content pipelines syncing knowledge into internal systems",{"type":17,"tag":68,"props":348481,"children":348483},{"id":348482},"using-knowledge-data-in-ai-systems",[348484],{"type":23,"value":348485},"Using knowledge data in AI systems",{"type":17,"tag":29,"props":348487,"children":348488},{},[348489],{"type":23,"value":348490},"Knowledge base content can be used to:",{"type":17,"tag":80,"props":348492,"children":348493},{},[348494,348499,348504,348509],{"type":17,"tag":84,"props":348495,"children":348496},{},[348497],{"type":23,"value":348498},"Generate summaries of documentation",{"type":17,"tag":84,"props":348500,"children":348501},{},[348502],{"type":23,"value":348503},"Power search and question-answering systems",{"type":17,"tag":84,"props":348505,"children":348506},{},[348507],{"type":23,"value":348508},"Extract structured data from unstructured content",{"type":17,"tag":84,"props":348510,"children":348511},{},[348512],{"type":23,"value":348513},"Provide context for AI agents and copilots",{"type":17,"tag":29,"props":348515,"children":348516},{},[348517],{"type":23,"value":348518},"Because content is accessed in real time, AI systems operate on current information.",{"type":17,"tag":68,"props":348520,"children":348521},{"id":182585},[348522],{"type":23,"value":182588},{"type":17,"tag":80,"props":348524,"children":348525},{},[348526,348531,348536,348541,348546],{"type":17,"tag":84,"props":348527,"children":348528},{},[348529],{"type":23,"value":348530},"Internal tools accessing company documentation",{"type":17,"tag":84,"props":348532,"children":348533},{},[348534],{"type":23,"value":348535},"Support platforms aggregating help center content",{"type":17,"tag":84,"props":348537,"children":348538},{},[348539],{"type":23,"value":348540},"Search systems indexing knowledge bases",{"type":17,"tag":84,"props":348542,"children":348543},{},[348544],{"type":23,"value":348545},"AI systems using documentation as context",{"type":17,"tag":84,"props":348547,"children":348548},{},[348549],{"type":23,"value":348550},"Analytics platforms processing knowledge usage",{"type":17,"tag":68,"props":348552,"children":348554},{"id":348553},"what-is-a-knowledge-management-api",[348555],{"type":23,"value":348556},"What is a knowledge management API?",{"type":17,"tag":29,"props":348558,"children":348559},{},[348560,348561,348566],{"type":23,"value":9619},{"type":17,"tag":133,"props":348562,"children":348563},{"href":24227},[348564],{"type":23,"value":348565},"knowledge management API",{"type":23,"value":348567}," allows developers to access and manage documentation, knowledge bases, and internal content across platforms through a single interface. It standardizes how content is retrieved, structured, and updated across providers.",{"type":17,"tag":68,"props":348569,"children":348570},{"id":332555},[348571],{"type":23,"value":332558},{"type":17,"tag":29,"props":348573,"children":348574},{},[348575],{"type":23,"value":348576},"The KMS API is available on all Unified plans.",{"type":17,"tag":80,"props":348578,"children":348579},{},[348580,348588,348596],{"type":17,"tag":84,"props":348581,"children":348582},{},[348583],{"type":17,"tag":133,"props":348584,"children":348586},{"href":176923,"rel":348585},[214],[348587],{"type":23,"value":287157},{"type":17,"tag":84,"props":348589,"children":348590},{},[348591],{"type":17,"tag":133,"props":348592,"children":348594},{"href":1612,"rel":348593},[214],[348595],{"type":23,"value":215326},{"type":17,"tag":84,"props":348597,"children":348598},{},[348599],{"type":17,"tag":133,"props":348600,"children":348602},{"href":332588,"rel":348601},[214],[348603],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":348605},[348606,348607,348608,348609,348610,348611,348612,348613,348614],{"id":25342,"depth":1629,"text":216065},{"id":348326,"depth":1629,"text":348329},{"id":348363,"depth":1629,"text":348366},{"id":348412,"depth":1629,"text":348415},{"id":348448,"depth":1629,"text":348451},{"id":348482,"depth":1629,"text":348485},{"id":182585,"depth":1629,"text":182588},{"id":348553,"depth":1629,"text":348556},{"id":332555,"depth":1629,"text":332558},"content:blog:unified_kms_api_real_time_access_to_knowledge_base_and_documentation_data.md","blog/unified_kms_api_real_time_access_to_knowledge_base_and_documentation_data.md","blog/unified_kms_api_real_time_access_to_knowledge_base_and_documentation_data",{"_path":348619,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":348620,"description":348621,"img":348622,"date":348623,"tag":6341,"body":348624,"_type":1677,"_id":349028,"_source":1679,"_file":349029,"_stem":349030,"_extension":1682},"/blog/setting_up_oauth_2_credentials_for_greenhouse_apis","Setting up OAuth 2 Credentials for Greenhouse's APIs","Unified.to has two integrations name with the name 'Greenhouse',","https://s3.us-east-2.amazonaws.com/unified-article-images/setting_up_oauth_2_credentials_for_greenhouse_apis-icon.png","2024-05-27T00:00:00.000Z",{"type":14,"children":348625,"toc":349022},[348626,348631,348634,348642,348648,348660,348720,348726,348821,348827,348833,348838,348885,348891,348896,348921,348926,348932,348937,348958,348965,348970,349015],{"type":17,"tag":18,"props":348627,"children":348629},{"id":348628},"setting-up-oauth-2-credentials-for-greenhouses-apis",[348630],{"type":23,"value":348620},{"type":17,"tag":25,"props":348632,"children":348633},{},[],{"type":17,"tag":29,"props":348635,"children":348636},{},[348637],{"type":17,"tag":33,"props":348638,"children":348639},{},[348640],{"type":23,"value":348641},"May 27, 2024",{"type":17,"tag":68,"props":348643,"children":348645},{"id":348644},"important-read-this-first",[348646],{"type":23,"value":348647},"Important — Read this first!",{"type":17,"tag":29,"props":348649,"children":348650},{},[348651,348653,348658],{"type":23,"value":348652},"Unified.to has ",{"type":17,"tag":33,"props":348654,"children":348655},{},[348656],{"type":23,"value":348657},"two",{"type":23,"value":348659}," integrations name with the name 'Greenhouse':",{"type":17,"tag":6154,"props":348661,"children":348662},{},[348663,348692],{"type":17,"tag":84,"props":348664,"children":348665},{},[348666,348668,348672,348674,348684,348685,348690],{"type":23,"value":348667},"The first one that appears in the ",{"type":17,"tag":48,"props":348669,"children":348670},{},[348671],{"type":23,"value":42944},{"type":23,"value":348673}," page is for Greenhouse's ",{"type":17,"tag":133,"props":348675,"children":348678},{"href":348676,"rel":348677},"https://support.greenhouse.io/hc/en-us/articles/360029266032-Harvest-API-overview",[214],[348679],{"type":17,"tag":48,"props":348680,"children":348681},{},[348682],{"type":23,"value":348683},"Harvest API",{"type":23,"value":18757},{"type":17,"tag":48,"props":348686,"children":348687},{},[348688],{"type":23,"value":348689},"(v3)",{"type":23,"value":348691},", which  uses OAuth2 code-flow to authorize your application.  For most of the use-cases, you should use this integration.",{"type":17,"tag":84,"props":348693,"children":348694},{},[348695,348697,348701,348702,348712,348714,348718],{"type":23,"value":348696},"The second one that appears in the  ",{"type":17,"tag":48,"props":348698,"children":348699},{},[348700],{"type":23,"value":42944},{"type":23,"value":348673},{"type":17,"tag":133,"props":348703,"children":348706},{"href":348704,"rel":348705},"https://developers.greenhouse.io/candidate-ingestion.html",[214],[348707],{"type":17,"tag":48,"props":348708,"children":348709},{},[348710],{"type":23,"value":348711},"Candidate Ingestion API",{"type":23,"value":348713},", which uses ",{"type":17,"tag":133,"props":348715,"children":348716},{"href":779},[348717],{"type":23,"value":782},{"type":23,"value":348719}," 2 client-credentials-flow to authorize your application.",{"type":17,"tag":18,"props":348721,"children":348723},{"id":348722},"greenhouse-harvest-api-v3",[348724],{"type":23,"value":348725},"Greenhouse Harvest API (v3)",{"type":17,"tag":6154,"props":348727,"children":348728},{},[348729,348752,348757,348777,348816],{"type":17,"tag":84,"props":348730,"children":348731},{},[348732,348739,348741,348746,348747],{"type":17,"tag":133,"props":348733,"children":348736},{"href":348734,"rel":348735},"https://www.greenhouse.com/integration-partner#apply-now",[214],[348737],{"type":23,"value":348738},"Integration request form",{"type":23,"value":348740}," should be submitted by every new company. ",{"type":17,"tag":33,"props":348742,"children":348743},{},[348744],{"type":23,"value":348745},"Applications are reviewed by Greenhouse on the first Monday of every month.",{"type":23,"value":18757},{"type":17,"tag":48,"props":348748,"children":348749},{},[348750],{"type":23,"value":348751},"If a company is already an official Greenhouse partner with a signed agreement, they may proceed directly to step 3.",{"type":17,"tag":84,"props":348753,"children":348754},{},[348755],{"type":23,"value":348756},"After completing a review, Greenhouse will share API agreement with company",{"type":17,"tag":84,"props":348758,"children":348759},{},[348760,348762,348768,348770,348775],{"type":23,"value":348761},"Once the agreement is signed, the company should follow the steps ",{"type":17,"tag":133,"props":348763,"children":348766},{"href":348764,"rel":348765},"https://harvestdocs.greenhouse.io/docs/harvest-partner-oauth",[214],[348767],{"type":23,"value":243989},{"type":23,"value":348769}," to have a client application created for their integration. They will provide Greenhouse with a redirect_uri (",{"type":17,"tag":133,"props":348771,"children":348773},{"href":42417,"rel":348772},[214],[348774],{"type":23,"value":42417},{"type":23,"value":348776},") that will be attached to their specific integration's client application. Greenhouse will provide the client credentials (client_id and client_secret)",{"type":17,"tag":84,"props":348778,"children":348779},{},[348780,348782,348789,348791],{"type":23,"value":348781},"The company will input their (2) credentials in ",{"type":17,"tag":133,"props":348783,"children":348786},{"href":348784,"rel":348785},"https://app.unified.to/integrations/greenhousehttps://app.unified.to/integrations/greenhouse",[214],[348787],{"type":23,"value":348788},"https://app.unified.to/integrations/greenhouse",{"type":23,"value":348790},". Unified will handle all authorization:\n",{"type":17,"tag":6154,"props":348792,"children":348793},{},[348794,348806,348811],{"type":17,"tag":84,"props":348795,"children":348796},{},[348797,348799,348805],{"type":23,"value":348798},"Access authorization, token management, refreshes and storage (",{"type":17,"tag":133,"props":348800,"children":348802},{"href":348764,"rel":348801},[214],[348803],{"type":23,"value":348804},"instructions found here",{"type":23,"value":12034},{"type":17,"tag":84,"props":348807,"children":348808},{},[348809],{"type":23,"value":348810},"Proxy requests on behalf of the originating partner to harvest v3 APIs",{"type":17,"tag":84,"props":348812,"children":348813},{},[348814],{"type":23,"value":348815},"Secure access schemes to proxy APIs from originating partner to UAPI provider that ensure no cross contamination",{"type":17,"tag":84,"props":348817,"children":348818},{},[348819],{"type":23,"value":348820},"The company will complete the remaining onboarding steps with Greenhouse.",{"type":17,"tag":18,"props":348822,"children":348824},{"id":348823},"greenhouse-ingestion-api",[348825],{"type":23,"value":348826},"Greenhouse Ingestion API",{"type":17,"tag":68,"props":348828,"children":348830},{"id":348829},"submit-information-about-your-application-to-greenhouse",[348831],{"type":23,"value":348832},"Submit information about your application to Greenhouse",{"type":17,"tag":29,"props":348834,"children":348835},{},[348836],{"type":23,"value":348837},"Before you can make use of Unified.to's Embedded Authorization component to let your users authorize Greenhouse to access their accounts, you will need to provide Greenhouse with the following:",{"type":17,"tag":6154,"props":348839,"children":348840},{},[348841,348851,348861,348875],{"type":17,"tag":84,"props":348842,"children":348843},{},[348844,348849],{"type":17,"tag":48,"props":348845,"children":348846},{},[348847],{"type":23,"value":348848},"Application Name",{"type":23,"value":348850},": The name of your application as it would appear in Greenhouse.",{"type":17,"tag":84,"props":348852,"children":348853},{},[348854,348859],{"type":17,"tag":48,"props":348855,"children":348856},{},[348857],{"type":23,"value":348858},"Application URL",{"type":23,"value":348860},": The URL of your application.",{"type":17,"tag":84,"props":348862,"children":348863},{},[348864,348868,348870],{"type":17,"tag":48,"props":348865,"children":348866},{},[348867],{"type":23,"value":144881},{"type":23,"value":348869},": After the end user authorizes your application to access their account, Greenhouse will redirect them to this URL. Provide this one:\n",{"type":17,"tag":6121,"props":348871,"children":348873},{"className":348872},[],[348874],{"type":23,"value":42417},{"type":17,"tag":84,"props":348876,"children":348877},{},[348878,348883],{"type":17,"tag":48,"props":348879,"children":348880},{},[348881],{"type":23,"value":348882},"Logo Image",{"type":23,"value":348884},": A 128 by 128 pixel image that Greenhouse will include in their permissions modal.",{"type":17,"tag":68,"props":348886,"children":348888},{"id":348887},"receive-the-consumer-key-and-consumer-secret-provided-by-greenhouse",[348889],{"type":23,"value":348890},"Receive the Consumer Key and Consumer Secret provided by Greenhouse",{"type":17,"tag":29,"props":348892,"children":348893},{},[348894],{"type":23,"value":348895},"When Greenhouse receives the information listed above, they will provide a set of values including these two:",{"type":17,"tag":80,"props":348897,"children":348898},{},[348899,348910],{"type":17,"tag":84,"props":348900,"children":348901},{},[348902,348903,348908],{"type":23,"value":9619},{"type":17,"tag":48,"props":348904,"children":348905},{},[348906],{"type":23,"value":348907},"consumer key",{"type":23,"value":348909},", which uniquely identifies your application",{"type":17,"tag":84,"props":348911,"children":348912},{},[348913,348914,348919],{"type":23,"value":9619},{"type":17,"tag":48,"props":348915,"children":348916},{},[348917],{"type":23,"value":348918},"consumer secret",{"type":23,"value":348920},", which acts as proof of your application's identity",{"type":17,"tag":29,"props":348922,"children":348923},{},[348924],{"type":23,"value":348925},"As its name implies, the consumer secret is confidential. For security purposes, Greenhouse will encrypt the consumer secret before emailing it to you (they'll explain how to decrypt it).",{"type":17,"tag":68,"props":348927,"children":348929},{"id":348928},"activate-greenhouse-in-unifiedto",[348930],{"type":23,"value":348931},"Activate Greenhouse in Unified.to",{"type":17,"tag":29,"props":348933,"children":348934},{},[348935],{"type":23,"value":348936},"With your application registered with Greenhouse and the OAuth 2 credentials in hand, you can now activate the Greenhouse integration in Unified.to.",{"type":17,"tag":29,"props":348938,"children":348939},{},[348940,348942,348950,348952,348956],{"type":23,"value":348941},"In Unified.to, go to the ",{"type":17,"tag":133,"props":348943,"children":348945},{"href":329567,"rel":348944},[214],[348946],{"type":17,"tag":48,"props":348947,"children":348948},{},[348949],{"type":23,"value":341393},{"type":23,"value":348951}," page, find the Greenhouse Ingestion API item (and ",{"type":17,"tag":33,"props":348953,"children":348954},{},[348955],{"type":23,"value":159475},{"type":23,"value":348957}," the Greenhouse Harvest API one) and click on it:",{"type":17,"tag":29,"props":348959,"children":348960},{},[348961],{"type":17,"tag":6438,"props":348962,"children":348964},{"alt":318119,"src":348963},"https://s3.us-east-2.amazonaws.com/unified-article-images/setting_up_oauth_2_credentials_for_greenhouse_apis-0.png",[],{"type":17,"tag":29,"props":348966,"children":348967},{},[348968],{"type":23,"value":348969},"On the page that appears, do the following:",{"type":17,"tag":6154,"props":348971,"children":348972},{},[348973,348982,348994,349005],{"type":17,"tag":84,"props":348974,"children":348975},{},[348976,348977,348981],{"type":23,"value":42950},{"type":17,"tag":48,"props":348978,"children":348979},{},[348980],{"type":23,"value":278235},{"type":23,"value":54},{"type":17,"tag":84,"props":348983,"children":348984},{},[348985,348987,348992],{"type":23,"value":348986},"Enter the consumer key value into the ",{"type":17,"tag":48,"props":348988,"children":348989},{},[348990],{"type":23,"value":348991},"OAuth 2 Client ID",{"type":23,"value":348993}," text field.",{"type":17,"tag":84,"props":348995,"children":348996},{},[348997,348999,349004],{"type":23,"value":348998},"Enter the consumer secret value into the ",{"type":17,"tag":48,"props":349000,"children":349001},{},[349002],{"type":23,"value":349003},"OAuth 2 Client Secret",{"type":23,"value":348993},{"type":17,"tag":84,"props":349006,"children":349007},{},[349008,349009,349013],{"type":23,"value":217756},{"type":17,"tag":48,"props":349010,"children":349011},{},[349012],{"type":23,"value":6634},{"type":23,"value":349014}," button to save the changes and activate the Greenhouse integration.",{"type":17,"tag":29,"props":349016,"children":349017},{},[349018],{"type":17,"tag":6438,"props":349019,"children":349021},{"alt":318119,"src":349020},"https://s3.us-east-2.amazonaws.com/unified-article-images/setting_up_oauth_2_credentials_for_greenhouse_apis-1.png",[],{"title":7,"searchDepth":1629,"depth":1629,"links":349023},[349024,349025,349026,349027],{"id":348644,"depth":1629,"text":348647},{"id":348829,"depth":1629,"text":348832},{"id":348887,"depth":1629,"text":348890},{"id":348928,"depth":1629,"text":348931},"content:blog:setting_up_oauth_2_credentials_for_greenhouse_apis.md","blog/setting_up_oauth_2_credentials_for_greenhouse_apis.md","blog/setting_up_oauth_2_credentials_for_greenhouse_apis",{"_path":349032,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":329613,"description":349033,"img":349034,"date":349035,"tag":6341,"body":349036,"_type":1677,"_id":349511,"_source":1679,"_file":349512,"_stem":349513,"_extension":1682},"/blog/how_to_get_your_discord_oauth_2_credentials_and_bot_token","This guide explains how to register your application with Discord and obtain your OAuth 2 credentials and bot token. You'll need these credentials to activate...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-icon.webp","2024-05-21T00:00:00.000Z",{"type":14,"children":349037,"toc":349503},[349038,349043,349046,349054,349070,349076,349150,349165,349171,349176,349252,349258,349263,349335,349341,349346,349410,349416,349498],{"type":17,"tag":18,"props":349039,"children":349041},{"id":349040},"how-to-get-your-discord-oauth-2-credentials-and-bot-token",[349042],{"type":23,"value":329613},{"type":17,"tag":25,"props":349044,"children":349045},{},[],{"type":17,"tag":29,"props":349047,"children":349048},{},[349049],{"type":17,"tag":33,"props":349050,"children":349051},{},[349052],{"type":23,"value":349053},"May 21, 2024",{"type":17,"tag":29,"props":349055,"children":349056},{},[349057,349059,349063,349065,349069],{"type":23,"value":349058},"This guide explains how to register your application with Discord and obtain your ",{"type":17,"tag":133,"props":349060,"children":349061},{"href":779},[349062],{"type":23,"value":782},{"type":23,"value":349064}," 2 credentials and bot token. You'll need these credentials to activate the Discord integration and access Discord's APIs through our ",{"type":17,"tag":133,"props":349066,"children":349067},{"href":7691},[349068],{"type":23,"value":7459},{"type":23,"value":54},{"type":17,"tag":68,"props":349071,"children":349073},{"id":349072},"register-your-application-in-discord",[349074],{"type":23,"value":349075},"Register your application in Discord",{"type":17,"tag":80,"props":349077,"children":349078},{},[349079,349092,349111],{"type":17,"tag":84,"props":349080,"children":349081},{},[349082,349084,349091],{"type":23,"value":349083},"Sign into Discord and navigate to the ",{"type":17,"tag":133,"props":349085,"children":349088},{"href":349086,"rel":349087},"https://discord.com/developers/applications",[214],[349089],{"type":23,"value":349090},"Developer Portal",{"type":23,"value":54},{"type":17,"tag":84,"props":349093,"children":349094},{},[349095,349096,349101,349103,349106],{"type":23,"value":6629},{"type":17,"tag":48,"props":349097,"children":349098},{},[349099],{"type":23,"value":349100},"New Application",{"type":23,"value":349102}," at the top right of the page.",{"type":17,"tag":3891,"props":349104,"children":349105},{},[],{"type":17,"tag":6438,"props":349107,"children":349110},{"alt":349108,"src":349109},"discord_1.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-0.png",[],{"type":17,"tag":84,"props":349112,"children":349113},{},[349114,349115,349119,349121],{"type":23,"value":123278},{"type":17,"tag":48,"props":349116,"children":349117},{},[349118],{"type":23,"value":106404},{"type":23,"value":349120}," window:",{"type":17,"tag":80,"props":349122,"children":349123},{},[349124,349129,349134],{"type":17,"tag":84,"props":349125,"children":349126},{},[349127],{"type":23,"value":349128},"Enter a name for your application",{"type":17,"tag":84,"props":349130,"children":349131},{},[349132],{"type":23,"value":349133},"Check the box to agree to Discord's terms of service and developer policy",{"type":17,"tag":84,"props":349135,"children":349136},{},[349137,349138,349142,349145],{"type":23,"value":6629},{"type":17,"tag":48,"props":349139,"children":349140},{},[349141],{"type":23,"value":42125},{"type":17,"tag":3891,"props":349143,"children":349144},{},[],{"type":17,"tag":6438,"props":349146,"children":349149},{"alt":349147,"src":349148},"discord_2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-1.png",[],{"type":17,"tag":6154,"props":349151,"children":349152},{},[349153],{"type":17,"tag":84,"props":349154,"children":349155},{},[349156,349158,349163],{"type":23,"value":349157},"Discord will create a new application, after which you will be taken to the ",{"type":17,"tag":48,"props":349159,"children":349160},{},[349161],{"type":23,"value":349162},"General Information",{"type":23,"value":349164}," tab for your application's page.",{"type":17,"tag":68,"props":349166,"children":349168},{"id":349167},"get-your-discord-oauth-2-credentials",[349169],{"type":23,"value":349170},"Get your Discord OAuth 2 credentials",{"type":17,"tag":29,"props":349172,"children":349173},{},[349174],{"type":23,"value":349175},"Once your application is registered, you can obtain its OAuth 2 credentials. These will be used to authenticate your app and access the Discord APIs.",{"type":17,"tag":80,"props":349177,"children":349178},{},[349179,349190,349214,349230,349241],{"type":17,"tag":84,"props":349180,"children":349181},{},[349182,349184,349188],{"type":23,"value":349183},"On your application's page, select the ",{"type":17,"tag":48,"props":349185,"children":349186},{},[349187],{"type":23,"value":217120},{"type":23,"value":349189}," tab from the left sidebar.",{"type":17,"tag":84,"props":349191,"children":349192},{},[349193,349195,349199,349200,349204,349206,349209],{"type":23,"value":349194},"Make note of your ",{"type":17,"tag":48,"props":349196,"children":349197},{},[349198],{"type":23,"value":6040},{"type":23,"value":34435},{"type":17,"tag":48,"props":349201,"children":349202},{},[349203],{"type":23,"value":6045},{"type":23,"value":349205},". You'll need these later.",{"type":17,"tag":3891,"props":349207,"children":349208},{},[],{"type":17,"tag":6438,"props":349210,"children":349213},{"alt":349211,"src":349212},"discord_4.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-2.png",[],{"type":17,"tag":84,"props":349215,"children":349216},{},[349217,349218,349223,349224,349229],{"type":23,"value":146715},{"type":17,"tag":48,"props":349219,"children":349220},{},[349221],{"type":23,"value":349222},"Redirects",{"type":23,"value":333099},{"type":17,"tag":48,"props":349225,"children":349226},{},[349227],{"type":23,"value":349228},"Add Redirect",{"type":23,"value":54},{"type":17,"tag":84,"props":349231,"children":349232},{},[349233,349234,349239],{"type":23,"value":335147},{"type":17,"tag":6121,"props":349235,"children":349237},{"className":349236},[],[349238],{"type":23,"value":42417},{"type":23,"value":349240}," as the redirect URL.",{"type":17,"tag":84,"props":349242,"children":349243},{},[349244,349245,349250],{"type":23,"value":6629},{"type":17,"tag":48,"props":349246,"children":349247},{},[349248],{"type":23,"value":349249},"Save changes",{"type":23,"value":349251}," at the bottom of the page.",{"type":17,"tag":68,"props":349253,"children":349255},{"id":349254},"retrieve-your-discord-bot-token",[349256],{"type":23,"value":349257},"Retrieve your Discord bot token",{"type":17,"tag":29,"props":349259,"children":349260},{},[349261],{"type":23,"value":349262},"The Discord integration also requires a Bot Token to access the Discord API.",{"type":17,"tag":6154,"props":349264,"children":349265},{},[349266,349277,349294],{"type":17,"tag":84,"props":349267,"children":349268},{},[349269,349270,349275],{"type":23,"value":42950},{"type":17,"tag":48,"props":349271,"children":349272},{},[349273],{"type":23,"value":349274},"Bot",{"type":23,"value":349276}," from the left sidebar.",{"type":17,"tag":84,"props":349278,"children":349279},{},[349280,349281,349286,349288,349293],{"type":23,"value":146715},{"type":17,"tag":48,"props":349282,"children":349283},{},[349284],{"type":23,"value":349285},"Build-A-Bot > Token,",{"type":23,"value":349287}," copy the ",{"type":17,"tag":48,"props":349289,"children":349290},{},[349291],{"type":23,"value":349292},"Bot Token",{"type":23,"value":54},{"type":17,"tag":84,"props":349295,"children":349296},{},[349297,349299,349304,349307,349311],{"type":23,"value":349298},"If you don't see the token, click ",{"type":17,"tag":48,"props":349300,"children":349301},{},[349302],{"type":23,"value":349303},"Reset Token.",{"type":17,"tag":3891,"props":349305,"children":349306},{},[],{"type":17,"tag":6438,"props":349308,"children":349310},{"alt":318119,"src":349309},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-3.png",[],{"type":17,"tag":6154,"props":349312,"children":349313},{},[349314,349325,349330],{"type":17,"tag":84,"props":349315,"children":349316},{},[349317,349318,349323],{"type":23,"value":6629},{"type":17,"tag":48,"props":349319,"children":349320},{},[349321],{"type":23,"value":349322},"Yes, do it!",{"type":23,"value":349324}," in the confirmation dialog.",{"type":17,"tag":84,"props":349326,"children":349327},{},[349328],{"type":23,"value":349329},"Copy the new token that appears.",{"type":17,"tag":84,"props":349331,"children":349332},{},[349333],{"type":23,"value":349334},"Note: You won't be able to view this token again, so store it securely.",{"type":17,"tag":239,"props":349336,"children":349338},{"id":349337},"set-bot-permissions",[349339],{"type":23,"value":349340},"Set bot permissions",{"type":17,"tag":29,"props":349342,"children":349343},{},[349344],{"type":23,"value":349345},"If you plan to use specific Unified.to API endpoints, you'll need to enable certain bot permissions:",{"type":17,"tag":6154,"props":349347,"children":349348},{},[349349,349376,349401],{"type":17,"tag":84,"props":349350,"children":349351},{},[349352,349354],{"type":23,"value":349353},"For listing guild members (using our HRIS List Employees API):",{"type":17,"tag":80,"props":349355,"children":349356},{},[349357],{"type":17,"tag":84,"props":349358,"children":349359},{},[349360,349362,349367,349369,349372],{"type":23,"value":349361},"Enable ",{"type":17,"tag":48,"props":349363,"children":349364},{},[349365],{"type":23,"value":349366},"Server Members Intent",{"type":23,"value":349368}," under Privileged Gateway Intents",{"type":17,"tag":3891,"props":349370,"children":349371},{},[],{"type":17,"tag":6438,"props":349373,"children":349375},{"alt":318119,"src":349374},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-4.png",[],{"type":17,"tag":84,"props":349377,"children":349378},{},[349379,349381],{"type":23,"value":349380},"For listing channels:",{"type":17,"tag":80,"props":349382,"children":349383},{},[349384],{"type":17,"tag":84,"props":349385,"children":349386},{},[349387,349388,349393,349394,349397],{"type":23,"value":349361},{"type":17,"tag":48,"props":349389,"children":349390},{},[349391],{"type":23,"value":349392},"Message Content Intent",{"type":23,"value":349368},{"type":17,"tag":3891,"props":349395,"children":349396},{},[],{"type":17,"tag":6438,"props":349398,"children":349400},{"alt":318119,"src":349399},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-5.png",[],{"type":17,"tag":84,"props":349402,"children":349403},{},[349404,349405,349409],{"type":23,"value":6629},{"type":17,"tag":48,"props":349406,"children":349407},{},[349408],{"type":23,"value":333193},{"type":23,"value":349251},{"type":17,"tag":68,"props":349411,"children":349413},{"id":349412},"activate-discord-in-unifiedto",[349414],{"type":23,"value":349415},"Activate Discord in Unified.to",{"type":17,"tag":6154,"props":349417,"children":349418},{},[349419,349429,349434,349488],{"type":17,"tag":84,"props":349420,"children":349421},{},[349422,349423,349428],{"type":23,"value":42939},{"type":17,"tag":133,"props":349424,"children":349426},{"href":329567,"rel":349425},[214],[349427],{"type":23,"value":42944},{"type":23,"value":6668},{"type":17,"tag":84,"props":349430,"children":349431},{},[349432],{"type":23,"value":349433},"Find and click on the Discord integration card.",{"type":17,"tag":84,"props":349435,"children":349436},{},[349437,349439],{"type":23,"value":349438},"On the integration details page:",{"type":17,"tag":80,"props":349440,"children":349441},{},[349442,349451,349461,349471],{"type":17,"tag":84,"props":349443,"children":349444},{},[349445,349446],{"type":23,"value":42950},{"type":17,"tag":48,"props":349447,"children":349448},{},[349449],{"type":23,"value":349450},"Your OAuth 2 credentials.",{"type":17,"tag":84,"props":349452,"children":349453},{},[349454,349456],{"type":23,"value":349455},"First, enter your Discord ",{"type":17,"tag":48,"props":349457,"children":349458},{},[349459],{"type":23,"value":349460},"Client ID.",{"type":17,"tag":84,"props":349462,"children":349463},{},[349464,349466],{"type":23,"value":349465},"Enter your Discord ",{"type":17,"tag":48,"props":349467,"children":349468},{},[349469],{"type":23,"value":349470},"Client Secret.",{"type":17,"tag":84,"props":349472,"children":349473},{},[349474,349475,349480,349483],{"type":23,"value":349465},{"type":17,"tag":48,"props":349476,"children":349477},{},[349478],{"type":23,"value":349479},"Bot Token.",{"type":17,"tag":3891,"props":349481,"children":349482},{},[],{"type":17,"tag":6438,"props":349484,"children":349487},{"alt":349485,"src":349486},"discord_7.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_discord_oauth_2_credentials_and_bot_token-6.png",[],{"type":17,"tag":84,"props":349489,"children":349490},{},[349491,349492,349496],{"type":23,"value":6629},{"type":17,"tag":48,"props":349493,"children":349494},{},[349495],{"type":23,"value":6634},{"type":23,"value":349497}," to save your changes and enable the Discord integration.",{"type":17,"tag":29,"props":349499,"children":349500},{},[349501],{"type":23,"value":349502},"You can now use the Unified API to create new experiences with Discord. Happy building!",{"title":7,"searchDepth":1629,"depth":1629,"links":349504},[349505,349506,349507,349510],{"id":349072,"depth":1629,"text":349075},{"id":349167,"depth":1629,"text":349170},{"id":349254,"depth":1629,"text":349257,"children":349508},[349509],{"id":349337,"depth":1635,"text":349340},{"id":349412,"depth":1629,"text":349415},"content:blog:how_to_get_your_discord_oauth_2_credentials_and_bot_token.md","blog/how_to_get_your_discord_oauth_2_credentials_and_bot_token.md","blog/how_to_get_your_discord_oauth_2_credentials_and_bot_token",{"_path":349515,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":329603,"description":349516,"img":349517,"date":349035,"tag":6341,"body":349518,"_type":1677,"_id":350162,"_source":1679,"_file":350163,"_stem":350164,"_extension":1682},"/blog/how_to_set_up_and_configure_notion","This guide describes how to register a public Notion application (a.k.a. ‘integration') and configure it so that you can use the Unified API to query pages and...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-icon.png",{"type":14,"children":349519,"toc":350156},[349520,349525,349528,349535,349546,349552,349557,349586,349591,349604,349617,349623,349628,349735,349765,349771,349776,349812,349823,349925,349930,349939,349943,349954,350151],{"type":17,"tag":18,"props":349521,"children":349523},{"id":349522},"how-to-set-up-and-configure-notion",[349524],{"type":23,"value":329603},{"type":17,"tag":25,"props":349526,"children":349527},{},[],{"type":17,"tag":29,"props":349529,"children":349530},{},[349531],{"type":17,"tag":33,"props":349532,"children":349533},{},[349534],{"type":23,"value":349053},{"type":17,"tag":29,"props":349536,"children":349537},{},[349538,349540,349544],{"type":23,"value":349539},"This guide describes how to register a public Notion application (a.k.a. ‘integration') and configure it so that you can use the ",{"type":17,"tag":133,"props":349541,"children":349542},{"href":7691},[349543],{"type":23,"value":7806},{"type":23,"value":349545}," to query pages and databases.",{"type":17,"tag":68,"props":349547,"children":349549},{"id":349548},"understanding-notion-integrations-internal-vs-public",[349550],{"type":23,"value":349551},"Understanding Notion integrations: Internal vs Public",{"type":17,"tag":29,"props":349553,"children":349554},{},[349555],{"type":23,"value":349556},"Before setting up your Notion integration, it's important to understand the two types of integrations Notion offers:",{"type":17,"tag":6154,"props":349558,"children":349559},{},[349560,349570],{"type":17,"tag":84,"props":349561,"children":349562},{},[349563,349568],{"type":17,"tag":48,"props":349564,"children":349565},{},[349566],{"type":23,"value":349567},"Internal Integrations",{"type":23,"value":349569},": These are confined to a single workspace and are only accessible by members of that workspace. They're ideal for custom workspace enhancements.",{"type":17,"tag":84,"props":349571,"children":349572},{},[349573,349578,349580,349584],{"type":17,"tag":48,"props":349574,"children":349575},{},[349576],{"type":23,"value":349577},"Public Integrations",{"type":23,"value":349579},": These are designed for a wider audience and can be used across any Notion workspace. They follow the ",{"type":17,"tag":133,"props":349581,"children":349582},{"href":779},[349583],{"type":23,"value":782},{"type":23,"value":349585}," 2.0 protocol for workspace access.",{"type":17,"tag":29,"props":349587,"children":349588},{},[349589],{"type":23,"value":349590},"The main difference in terms of accessing user data is:",{"type":17,"tag":80,"props":349592,"children":349593},{},[349594,349599],{"type":17,"tag":84,"props":349595,"children":349596},{},[349597],{"type":23,"value":349598},"For Internal Integrations, workspace members explicitly grant access to their pages or databases via Notion's UI.",{"type":17,"tag":84,"props":349600,"children":349601},{},[349602],{"type":23,"value":349603},"For Public Integrations, users authorize access to their pages during the OAuth flow, or by sharing pages directly with the integration.",{"type":17,"tag":29,"props":349605,"children":349606},{},[349607,349609,349616],{"type":23,"value":349608},"For more information on the differences, refer to the ",{"type":17,"tag":133,"props":349610,"children":349613},{"href":349611,"rel":349612},"https://developers.notion.com/docs/getting-started",[214],[349614],{"type":23,"value":349615},"Notion API Overview",{"type":23,"value":54},{"type":17,"tag":68,"props":349618,"children":349620},{"id":349619},"setting-up-your-notion-integration",[349621],{"type":23,"value":349622},"Setting up your Notion integration",{"type":17,"tag":29,"props":349624,"children":349625},{},[349626],{"type":23,"value":349627},"The following steps outline how to register a public Notion integration:",{"type":17,"tag":6154,"props":349629,"children":349630},{},[349631,349641,349646,349685,349694,349710,349722],{"type":17,"tag":84,"props":349632,"children":349633},{},[349634,349635],{"type":23,"value":6661},{"type":17,"tag":133,"props":349636,"children":349639},{"href":349637,"rel":349638},"https://www.notion.so/my-integrations",[214],[349640],{"type":23,"value":349637},{"type":17,"tag":84,"props":349642,"children":349643},{},[349644],{"type":23,"value":349645},"Click on your integration (or create a new one)",{"type":17,"tag":84,"props":349647,"children":349648},{},[349649,349651],{"type":23,"value":349650},"Follow the steps to register a new Notion integration.\n",{"type":17,"tag":6154,"props":349652,"children":349653},{},[349654,349669],{"type":17,"tag":84,"props":349655,"children":349656},{},[349657,349658,349662,349663,349668],{"type":23,"value":146715},{"type":17,"tag":48,"props":349659,"children":349660},{},[349661],{"type":23,"value":47948},{"type":23,"value":335113},{"type":17,"tag":48,"props":349664,"children":349665},{},[349666],{"type":23,"value":349667},"Public",{"type":23,"value":54},{"type":17,"tag":84,"props":349670,"children":349671},{},[349672,349673,349678,349680],{"type":23,"value":146715},{"type":17,"tag":48,"props":349674,"children":349675},{},[349676],{"type":23,"value":349677},"Redirect URIs",{"type":23,"value":349679},", enter ",{"type":17,"tag":6121,"props":349681,"children":349683},{"className":349682},[],[349684],{"type":23,"value":42417},{"type":17,"tag":84,"props":349686,"children":349687},{},[349688,349689,349693],{"type":23,"value":6629},{"type":17,"tag":48,"props":349690,"children":349691},{},[349692],{"type":23,"value":169347},{"type":23,"value":54},{"type":17,"tag":84,"props":349695,"children":349696},{},[349697,349699,349704,349705],{"type":23,"value":349698},"Go to the configuration settings of your newly created integration and make a note of the ",{"type":17,"tag":48,"props":349700,"children":349701},{},[349702],{"type":23,"value":349703},"OAuth Client ID",{"type":23,"value":34435},{"type":17,"tag":48,"props":349706,"children":349707},{},[349708],{"type":23,"value":349709},"OAuth Client Secret.",{"type":17,"tag":84,"props":349711,"children":349712},{},[349713,349715,349720],{"type":23,"value":349714},"Still under the configuration settings, make sure to select the permissions you need for your app under ",{"type":17,"tag":48,"props":349716,"children":349717},{},[349718],{"type":23,"value":349719},"Capabilities",{"type":23,"value":349721}," e.g. read or update content.",{"type":17,"tag":84,"props":349723,"children":349724},{},[349725,349727,349733],{"type":23,"value":349726},"Enter your OAuth credentials on ",{"type":17,"tag":133,"props":349728,"children":349731},{"href":349729,"rel":349730},"https://app.unified.to/integrations/notion",[214],[349732],{"type":23,"value":349729},{"type":23,"value":349734}," to activate the Notion integration.",{"type":17,"tag":29,"props":349736,"children":349737},{},[349738,349742,349744,349750,349751,349756,349758,349764],{"type":17,"tag":48,"props":349739,"children":349740},{},[349741],{"type":23,"value":103346},{"type":23,"value":349743}," If you wish to create an Internal integration, most of the steps above can be skipped, and you will need to enter your ",{"type":17,"tag":6121,"props":349745,"children":349747},{"className":349746},[],[349748],{"type":23,"value":349749},"Internal integration token",{"type":23,"value":135160},{"type":17,"tag":133,"props":349752,"children":349754},{"href":106697,"rel":349753},[214],[349755],{"type":23,"value":106701},{"type":23,"value":349757}," instead. Instructions on how to find your internal token can be found ",{"type":17,"tag":133,"props":349759,"children":349762},{"href":349760,"rel":349761},"https://www.notion.so/help/create-integrations-with-the-notion-api",[214],[349763],{"type":23,"value":243989},{"type":23,"value":54},{"type":17,"tag":68,"props":349766,"children":349768},{"id":349767},"querying-databases-in-notion",[349769],{"type":23,"value":349770},"Querying databases in Notion",{"type":17,"tag":29,"props":349772,"children":349773},{},[349774],{"type":23,"value":349775},"To query databases in Notion, you'll need to use our Unified KMS endpoint:",{"type":17,"tag":6154,"props":349777,"children":349778},{},[349779,349791],{"type":17,"tag":84,"props":349780,"children":349781},{},[349782,349784,349789],{"type":23,"value":349783},"First, make sure you have a ",{"type":17,"tag":6121,"props":349785,"children":349787},{"className":349786},[],[349788],{"type":23,"value":25037},{"type":23,"value":349790}," for your Notion integration.",{"type":17,"tag":84,"props":349792,"children":349793},{},[349794,349796,349801,349803],{"type":23,"value":349795},"Since database entries in Notion are technically pages, we'll use the ",{"type":17,"tag":48,"props":349797,"children":349798},{},[349799],{"type":23,"value":349800},"List all pages",{"type":23,"value":349802}," endpoint:",{"type":17,"tag":6893,"props":349804,"children":349807},{"className":349805,"code":349806,"language":20901,"meta":23},[20899],"GET /kms/{connection_id}/page\n",[349808],{"type":17,"tag":6121,"props":349809,"children":349810},{"__ignoreMap":7},[349811],{"type":23,"value":349806},{"type":17,"tag":29,"props":349813,"children":349814},{},[349815,349817],{"type":23,"value":349816},"API reference: ",{"type":17,"tag":133,"props":349818,"children":349821},{"href":349819,"rel":349820},"https://docs.unified.to/kms/page/List_all_pages",[214],[349822],{"type":23,"value":349800},{"type":17,"tag":6154,"props":349824,"children":349825},{},[349826,349847],{"type":17,"tag":84,"props":349827,"children":349828},{},[349829,349831,349836,349838],{"type":23,"value":349830},"When querying pages in a database, you need to pass the database ID as the ",{"type":17,"tag":6121,"props":349832,"children":349834},{"className":349833},[],[349835],{"type":23,"value":72943},{"type":23,"value":349837}," parameter. For example:",{"type":17,"tag":6893,"props":349839,"children":349842},{"className":349840,"code":349841,"language":20901,"meta":23},[20899],"GET /kms/{connection_id}/page?space_id={database_id}\n",[349843],{"type":17,"tag":6121,"props":349844,"children":349845},{"__ignoreMap":7},[349846],{"type":23,"value":349841},{"type":17,"tag":84,"props":349848,"children":349849},{},[349850,349852],{"type":23,"value":349851},"You can use additional parameters to filter and sort your results:",{"type":17,"tag":80,"props":349853,"children":349854},{},[349855,349865,349875,349885,349895,349905,349915],{"type":17,"tag":84,"props":349856,"children":349857},{},[349858,349863],{"type":17,"tag":6121,"props":349859,"children":349861},{"className":349860},[],[349862],{"type":23,"value":48389},{"type":23,"value":349864},": Number of results to return (default: 30)",{"type":17,"tag":84,"props":349866,"children":349867},{},[349868,349873],{"type":17,"tag":6121,"props":349869,"children":349871},{"className":349870},[],[349872],{"type":23,"value":48411},{"type":23,"value":349874},": Number of results to skip (default: 0)",{"type":17,"tag":84,"props":349876,"children":349877},{},[349878,349883],{"type":17,"tag":6121,"props":349879,"children":349881},{"className":349880},[],[349882],{"type":23,"value":26291},{"type":23,"value":349884},": Return only results updated on or after this date",{"type":17,"tag":84,"props":349886,"children":349887},{},[349888,349893],{"type":17,"tag":6121,"props":349889,"children":349891},{"className":349890},[],[349892],{"type":23,"value":225399},{"type":23,"value":349894},": Sort by 'name', 'updated_at', or 'created_at'",{"type":17,"tag":84,"props":349896,"children":349897},{},[349898,349903],{"type":17,"tag":6121,"props":349899,"children":349901},{"className":349900},[],[349902],{"type":23,"value":75822},{"type":23,"value":349904},": Sort order ('asc' or 'desc')",{"type":17,"tag":84,"props":349906,"children":349907},{},[349908,349913],{"type":17,"tag":6121,"props":349909,"children":349911},{"className":349910},[],[349912],{"type":23,"value":48368},{"type":23,"value":349914},": Search query string",{"type":17,"tag":84,"props":349916,"children":349917},{},[349918,349923],{"type":17,"tag":6121,"props":349919,"children":349921},{"className":349920},[],[349922],{"type":23,"value":39759},{"type":23,"value":349924},": Comma-separated list of fields to return",{"type":17,"tag":29,"props":349926,"children":349927},{},[349928],{"type":23,"value":349929},"For example, to get the first 50 pages in a database, sorted by name in ascending order:",{"type":17,"tag":6893,"props":349931,"children":349934},{"className":349932,"code":349933,"language":20901,"meta":23},[20899],"GET /kms/{connection_id}/page?space_id={database_id}&limit=50&sort=name&order=asc\n",[349935],{"type":17,"tag":6121,"props":349936,"children":349937},{"__ignoreMap":7},[349938],{"type":23,"value":349933},{"type":17,"tag":68,"props":349940,"children":349941},{"id":5002},[349942],{"type":23,"value":43896},{"type":17,"tag":29,"props":349944,"children":349945},{},[349946,349948,349952],{"type":23,"value":349947},"Notion doesn't offer programmatic creation of ",{"type":17,"tag":133,"props":349949,"children":349950},{"href":4999},[349951],{"type":23,"value":5002},{"type":23,"value":349953},", so you need to first create webhooks for your application.  Then, you can use our CreateWebhook API endpoint to select what data and connection you want to receive.",{"type":17,"tag":6154,"props":349955,"children":349956},{},[349957,349968,349973,349996,350041,350102,350118],{"type":17,"tag":84,"props":349958,"children":349959},{},[349960,349962],{"type":23,"value":349961},"Go you your Notion's integrations page at ",{"type":17,"tag":133,"props":349963,"children":349966},{"href":349964,"rel":349965},"https://www.notion.so/profile/integrations",[214],[349967],{"type":23,"value":349964},{"type":17,"tag":84,"props":349969,"children":349970},{},[349971],{"type":23,"value":349972},"Either create a new integration or select an existing one.",{"type":17,"tag":84,"props":349974,"children":349975},{},[349976,349977,349981,349983,349988,349989,349992],{"type":23,"value":42715},{"type":17,"tag":48,"props":349978,"children":349979},{},[349980],{"type":23,"value":43896},{"type":23,"value":349982}," tab and click ",{"type":17,"tag":48,"props":349984,"children":349985},{},[349986],{"type":23,"value":349987},"+ Create a subscription",{"type":23,"value":54},{"type":17,"tag":3891,"props":349990,"children":349991},{},[],{"type":17,"tag":6438,"props":349993,"children":349995},{"alt":6440,"src":349994},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-0.png",[],{"type":17,"tag":84,"props":349997,"children":349998},{},[349999,350001,350006,350008,350033,350036],{"type":23,"value":350000},"Enter your public ",{"type":17,"tag":48,"props":350002,"children":350003},{},[350004],{"type":23,"value":350005},"Webhook URL",{"type":23,"value":350007}," — this is the public endpoint where you want Notion to send events. It must be a secure (SSL) and publicly available endpoint. Endpoints in localhost are not\nreachable.",{"type":17,"tag":6154,"props":350009,"children":350010},{},[350011,350022],{"type":17,"tag":84,"props":350012,"children":350013},{},[350014,350016],{"type":23,"value":350015},"US: ",{"type":17,"tag":6121,"props":350017,"children":350019},{"className":350018},[],[350020],{"type":23,"value":350021},"https://api.unified.to/webhook/workspace/notion?workspace_id=$WORKSPACE_ID",{"type":17,"tag":84,"props":350023,"children":350024},{},[350025,350027],{"type":23,"value":350026},"EU: ",{"type":17,"tag":6121,"props":350028,"children":350030},{"className":350029},[],[350031],{"type":23,"value":350032},"https://api-eu.unified.to/webhook/workspace/notion?workspace_id=$WORKSPACE_ID",{"type":17,"tag":3891,"props":350034,"children":350035},{},[],{"type":17,"tag":6438,"props":350037,"children":350040},{"alt":350038,"src":350039},"1ef497d7b9b3622de379e6907cd722167766413693ac9f1885b59eb028b4e7dd-webhooks-2.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-1.png",[],{"type":17,"tag":84,"props":350042,"children":350043},{},[350044,350046,350051,350052,350057,350059,350064,350066,350071,350072,350078,350080,350086,350087,350092,350094,350100],{"type":23,"value":350045},"Select the events that you are interested in receiving from all of your customers.  Created and Deleted events are associated with our ",{"type":17,"tag":6121,"props":350047,"children":350049},{"className":350048},[],[350050],{"type":23,"value":109207},{"type":23,"value":34435},{"type":17,"tag":6121,"props":350053,"children":350055},{"className":350054},[],[350056],{"type":23,"value":109221},{"type":23,"value":350058}," events, while all other events are associated with our ",{"type":17,"tag":6121,"props":350060,"children":350062},{"className":350061},[],[350063],{"type":23,"value":109214},{"type":23,"value":350065}," event.  Both Notion's ",{"type":17,"tag":6121,"props":350067,"children":350069},{"className":350068},[],[350070],{"type":23,"value":24932},{"type":23,"value":34435},{"type":17,"tag":6121,"props":350073,"children":350075},{"className":350074},[],[350076],{"type":23,"value":350077},"Database",{"type":23,"value":350079}," are mapped to Unified's ",{"type":17,"tag":6121,"props":350081,"children":350083},{"className":350082},[],[350084],{"type":23,"value":350085},"KMSPage",{"type":23,"value":323686},{"type":17,"tag":6121,"props":350088,"children":350090},{"className":350089},[],[350091],{"type":23,"value":31629},{"type":23,"value":350093}," are mapped to ",{"type":17,"tag":6121,"props":350095,"children":350097},{"className":350096},[],[350098],{"type":23,"value":350099},"KMSComment",{"type":23,"value":350101},". You can modify these later if needed.",{"type":17,"tag":84,"props":350103,"children":350104},{},[350105,350106,350110,350111,350114],{"type":23,"value":6629},{"type":17,"tag":48,"props":350107,"children":350108},{},[350109],{"type":23,"value":70807},{"type":23,"value":54},{"type":17,"tag":3891,"props":350112,"children":350113},{},[],{"type":17,"tag":6438,"props":350115,"children":350117},{"alt":6440,"src":350116},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-2.png",[],{"type":17,"tag":84,"props":350119,"children":350120},{},[350121,350123,350129,350131,350137,350139,350144,350147],{"type":23,"value":350122},"After you create the notion webhook, notion will send us a verification token. You can find that verification token in ",{"type":17,"tag":133,"props":350124,"children":350127},{"href":350125,"rel":350126},"https://app.unified.to/settings/api",[214],[350128],{"type":23,"value":350125},{"type":23,"value":350130},". Paste the ",{"type":17,"tag":6121,"props":350132,"children":350134},{"className":350133},[],[350135],{"type":23,"value":350136},"verification_token",{"type":23,"value":350138}," value into the Verify Subscription form in Notion, and click ",{"type":17,"tag":48,"props":350140,"children":350141},{},[350142],{"type":23,"value":350143},"Verify subscription.",{"type":17,"tag":3891,"props":350145,"children":350146},{},[],{"type":17,"tag":6438,"props":350148,"children":350150},{"alt":6440,"src":350149},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_and_configure_notion-3.png",[],{"type":17,"tag":29,"props":350152,"children":350153},{},[350154],{"type":23,"value":350155},"Once completed, you can create webhooks in Unified.to that will receive these Notion events in real-time.",{"title":7,"searchDepth":1629,"depth":1629,"links":350157},[350158,350159,350160,350161],{"id":349548,"depth":1629,"text":349551},{"id":349619,"depth":1629,"text":349622},{"id":349767,"depth":1629,"text":349770},{"id":5002,"depth":1629,"text":43896},"content:blog:how_to_set_up_and_configure_notion.md","blog/how_to_set_up_and_configure_notion.md","blog/how_to_set_up_and_configure_notion",{"_path":350166,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":350167,"description":350168,"img":350169,"date":349035,"tag":12,"body":350170,"_type":1677,"_id":350545,"_source":1679,"_file":350546,"_stem":350547,"_extension":1682},"/blog/unified_messaging_api_sync_email_and_chat_data_across_platform","Unified Messaging API: Sync Email and Chat Data Across Platform","If your product needs access to email and chat data, you quickly run into fragmented APIs, inconsistent message formats, and provider-specific authentication.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_messaging_api_sync_email_and_chat_data_across_platform-icon.png",{"type":14,"children":350171,"toc":350534},[350172,350177,350180,350187,350195,350199,350209,350214,350257,350262,350268,350273,350291,350296,350302,350332,350337,350345,350351,350356,350373,350382,350387,350393,350421,350427,350432,350455,350460,350464,350492,350497,350502,350506,350511],{"type":17,"tag":18,"props":350173,"children":350175},{"id":350174},"unified-messaging-api-sync-email-and-chat-data-across-platform",[350176],{"type":23,"value":350167},{"type":17,"tag":25,"props":350178,"children":350179},{},[],{"type":17,"tag":29,"props":350181,"children":350182},{},[350183],{"type":17,"tag":33,"props":350184,"children":350185},{},[350186],{"type":23,"value":349053},{"type":17,"tag":29,"props":350188,"children":350189},{},[350190],{"type":17,"tag":6438,"props":350191,"children":350194},{"alt":350192,"src":350193},"Messaging_API.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_messaging_api_sync_email_and_chat_data_across_platform-0.png",[],{"type":17,"tag":29,"props":350196,"children":350197},{},[350198],{"type":23,"value":350168},{"type":17,"tag":29,"props":350200,"children":350201},{},[350202,350203,350207],{"type":23,"value":149272},{"type":17,"tag":133,"props":350204,"children":350205},{"href":14913},[350206],{"type":23,"value":27356},{"type":23,"value":350208}," provides a single interface to retrieve and send messages across platforms, with a normalized data model and real-time access. It acts as a unified communication layer across email and chat systems, allowing applications to access, send, and analyze messages through one API.",{"type":17,"tag":68,"props":350210,"children":350211},{"id":269318},[350212],{"type":23,"value":350213},"Supported integrations",{"type":17,"tag":80,"props":350215,"children":350216},{},[350217,350221,350225,350229,350233,350237,350241,350245,350249,350253],{"type":17,"tag":84,"props":350218,"children":350219},{},[350220],{"type":23,"value":15461},{"type":17,"tag":84,"props":350222,"children":350223},{},[350224],{"type":23,"value":15720},{"type":17,"tag":84,"props":350226,"children":350227},{},[350228],{"type":23,"value":25375},{"type":17,"tag":84,"props":350230,"children":350231},{},[350232],{"type":23,"value":14878},{"type":17,"tag":84,"props":350234,"children":350235},{},[350236],{"type":23,"value":15409},{"type":17,"tag":84,"props":350238,"children":350239},{},[350240],{"type":23,"value":15729},{"type":17,"tag":84,"props":350242,"children":350243},{},[350244],{"type":23,"value":11357},{"type":17,"tag":84,"props":350246,"children":350247},{},[350248],{"type":23,"value":14455},{"type":17,"tag":84,"props":350250,"children":350251},{},[350252],{"type":23,"value":14066},{"type":17,"tag":84,"props":350254,"children":350255},{},[350256],{"type":23,"value":3204},{"type":17,"tag":29,"props":350258,"children":350259},{},[350260],{"type":23,"value":350261},"Additional messaging integrations are expanding as part of this category.",{"type":17,"tag":68,"props":350263,"children":350265},{"id":350264},"unified-message-model-across-email-and-chat",[350266],{"type":23,"value":350267},"Unified message model across email and chat",{"type":17,"tag":29,"props":350269,"children":350270},{},[350271],{"type":23,"value":350272},"The Messaging API standardizes messages across providers:",{"type":17,"tag":80,"props":350274,"children":350275},{},[350276,350281,350286],{"type":17,"tag":84,"props":350277,"children":350278},{},[350279],{"type":23,"value":350280},"Emails and chat messages use the same schema",{"type":17,"tag":84,"props":350282,"children":350283},{},[350284],{"type":23,"value":350285},"Threads, participants, and attachments are normalized",{"type":17,"tag":84,"props":350287,"children":350288},{},[350289],{"type":23,"value":350290},"Message history can be accessed across platforms",{"type":17,"tag":29,"props":350292,"children":350293},{},[350294],{"type":23,"value":350295},"This allows systems to treat all communication as a single dataset, regardless of source.",{"type":17,"tag":68,"props":350297,"children":350299},{"id":350298},"core-objects-in-the-messaging-api",[350300],{"type":23,"value":350301},"Core objects in the Messaging API",{"type":17,"tag":80,"props":350303,"children":350304},{},[350305,350314,350323],{"type":17,"tag":84,"props":350306,"children":350307},{},[350308,350312],{"type":17,"tag":48,"props":350309,"children":350310},{},[350311],{"type":23,"value":167363},{"type":23,"value":350313},": conversations, threads, or inboxes",{"type":17,"tag":84,"props":350315,"children":350316},{},[350317,350321],{"type":17,"tag":48,"props":350318,"children":350319},{},[350320],{"type":23,"value":148609},{"type":23,"value":350322},": individual email or chat messages",{"type":17,"tag":84,"props":350324,"children":350325},{},[350326,350330],{"type":17,"tag":48,"props":350327,"children":350328},{},[350329],{"type":23,"value":63118},{"type":23,"value":350331},": interaction events such as replies, reactions, or updates",{"type":17,"tag":29,"props":350333,"children":350334},{},[350335],{"type":23,"value":350336},"These objects follow consistent schemas across providers, reducing the need to handle platform-specific message formats.",{"type":17,"tag":29,"props":350338,"children":350339},{},[350340],{"type":17,"tag":6438,"props":350341,"children":350344},{"alt":350342,"src":350343},"Messaging_model.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_messaging_api_sync_email_and_chat_data_across_platform-1.png",[],{"type":17,"tag":68,"props":350346,"children":350348},{"id":350347},"real-time-messaging-data-access",[350349],{"type":23,"value":350350},"Real-time messaging data access",{"type":17,"tag":29,"props":350352,"children":350353},{},[350354],{"type":23,"value":350355},"The Messaging API retrieves and sends messages in real time:",{"type":17,"tag":80,"props":350357,"children":350358},{},[350359,350364,350368],{"type":17,"tag":84,"props":350360,"children":350361},{},[350362],{"type":23,"value":350363},"Requests are routed directly to provider APIs",{"type":17,"tag":84,"props":350365,"children":350366},{},[350367],{"type":23,"value":332419},{"type":17,"tag":84,"props":350369,"children":350370},{},[350371],{"type":23,"value":350372},"No stored message data",{"type":17,"tag":29,"props":350374,"children":350375},{},[350376,350380],{"type":17,"tag":133,"props":350377,"children":350378},{"href":4999},[350379],{"type":23,"value":43896},{"type":23,"value":350381}," deliver updates for new messages and changes.",{"type":17,"tag":29,"props":350383,"children":350384},{},[350385],{"type":23,"value":350386},"The API supports both retrieving and sending messages, enabling full interaction with communication platforms.",{"type":17,"tag":68,"props":350388,"children":350390},{"id":350389},"what-teams-build-with-the-messaging-api",[350391],{"type":23,"value":350392},"What teams build with the Messaging API",{"type":17,"tag":80,"props":350394,"children":350395},{},[350396,350401,350406,350411,350416],{"type":17,"tag":84,"props":350397,"children":350398},{},[350399],{"type":23,"value":350400},"Unified inboxes across email and chat platforms",{"type":17,"tag":84,"props":350402,"children":350403},{},[350404],{"type":23,"value":350405},"Customer support systems aggregating conversations",{"type":17,"tag":84,"props":350407,"children":350408},{},[350409],{"type":23,"value":350410},"Internal communication analysis tools",{"type":17,"tag":84,"props":350412,"children":350413},{},[350414],{"type":23,"value":350415},"Automated response systems for high-volume messaging",{"type":17,"tag":84,"props":350417,"children":350418},{},[350419],{"type":23,"value":350420},"AI systems analyzing conversations for insights and trends",{"type":17,"tag":68,"props":350422,"children":350424},{"id":350423},"using-messaging-data-in-ai-systems",[350425],{"type":23,"value":350426},"Using messaging data in AI systems",{"type":17,"tag":29,"props":350428,"children":350429},{},[350430],{"type":23,"value":350431},"Message data can be used to:",{"type":17,"tag":80,"props":350433,"children":350434},{},[350435,350440,350445,350450],{"type":17,"tag":84,"props":350436,"children":350437},{},[350438],{"type":23,"value":350439},"Summarize conversations across channels",{"type":17,"tag":84,"props":350441,"children":350442},{},[350443],{"type":23,"value":350444},"Detect customer issues and generate tickets",{"type":17,"tag":84,"props":350446,"children":350447},{},[350448],{"type":23,"value":350449},"Analyze sentiment and identify trends",{"type":17,"tag":84,"props":350451,"children":350452},{},[350453],{"type":23,"value":350454},"Generate responses for common scenarios",{"type":17,"tag":29,"props":350456,"children":350457},{},[350458],{"type":23,"value":350459},"Because data is accessed in real time, AI systems operate on current conversations rather than stored snapshots.",{"type":17,"tag":68,"props":350461,"children":350462},{"id":182585},[350463],{"type":23,"value":182588},{"type":17,"tag":80,"props":350465,"children":350466},{},[350467,350472,350477,350482,350487],{"type":17,"tag":84,"props":350468,"children":350469},{},[350470],{"type":23,"value":350471},"Customer support platforms aggregating conversations",{"type":17,"tag":84,"props":350473,"children":350474},{},[350475],{"type":23,"value":350476},"CRM and sales tools ingesting communication history",{"type":17,"tag":84,"props":350478,"children":350479},{},[350480],{"type":23,"value":350481},"Internal tools analyzing team communication",{"type":17,"tag":84,"props":350483,"children":350484},{},[350485],{"type":23,"value":350486},"AI systems processing email and chat data",{"type":17,"tag":84,"props":350488,"children":350489},{},[350490],{"type":23,"value":350491},"Automation systems responding to incoming messages",{"type":17,"tag":68,"props":350493,"children":350494},{"id":14903},[350495],{"type":23,"value":350496},"What is a messaging API?",{"type":17,"tag":29,"props":350498,"children":350499},{},[350500],{"type":23,"value":350501},"A messaging API allows developers to access and send messages across email and chat platforms through a single interface. It standardizes message formats, threads, and participants, enabling consistent communication data access across providers.",{"type":17,"tag":68,"props":350503,"children":350504},{"id":332555},[350505],{"type":23,"value":332558},{"type":17,"tag":29,"props":350507,"children":350508},{},[350509],{"type":23,"value":350510},"The Messaging API is available on all Unified plans.",{"type":17,"tag":80,"props":350512,"children":350513},{},[350514,350522,350530],{"type":17,"tag":84,"props":350515,"children":350516},{},[350517],{"type":17,"tag":133,"props":350518,"children":350520},{"href":176923,"rel":350519},[214],[350521],{"type":23,"value":287157},{"type":17,"tag":84,"props":350523,"children":350524},{},[350525],{"type":17,"tag":133,"props":350526,"children":350528},{"href":350527},"/4da98bad91e74c9a894d414db795347a",[350529],{"type":23,"value":215326},{"type":17,"tag":84,"props":350531,"children":350532},{},[350533],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":350535},[350536,350537,350538,350539,350540,350541,350542,350543,350544],{"id":269318,"depth":1629,"text":350213},{"id":350264,"depth":1629,"text":350267},{"id":350298,"depth":1629,"text":350301},{"id":350347,"depth":1629,"text":350350},{"id":350389,"depth":1629,"text":350392},{"id":350423,"depth":1629,"text":350426},{"id":182585,"depth":1629,"text":182588},{"id":14903,"depth":1629,"text":350496},{"id":332555,"depth":1629,"text":332558},"content:blog:unified_messaging_api_sync_email_and_chat_data_across_platform.md","blog/unified_messaging_api_sync_email_and_chat_data_across_platform.md","blog/unified_messaging_api_sync_email_and_chat_data_across_platform",{"_path":350549,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":350550,"description":350551,"img":350552,"date":350553,"tag":12,"body":350554,"_type":1677,"_id":350994,"_source":1679,"_file":350995,"_stem":350996,"_extension":1682},"/blog/unified_generative_ai_api_run_llms_with_real_time_data_and_actions_through_one_api","Unified Generative AI API: Run LLMs with Real-Time Data and Actions Through One API","If your product integrates with large language models, you quickly run into provider-specific APIs, inconsistent request formats, and model-specific behavior.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_generative_ai_api_run_llms_with_real_time_data_and_actions_through_one_api-icon.png","2024-05-09T00:00:00.000Z",{"type":14,"children":350555,"toc":350982},[350556,350561,350564,350572,350580,350584,350594,350598,350646,350651,350657,350662,350680,350685,350693,350699,350729,350734,350740,350745,350763,350768,350774,350779,350784,350813,350818,350824,350829,350834,350852,350857,350862,350870,350876,350904,350908,350936,350941,350946,350950,350955],{"type":17,"tag":18,"props":350557,"children":350559},{"id":350558},"unified-generative-ai-api-run-llms-with-real-time-data-and-actions-through-one-api",[350560],{"type":23,"value":350550},{"type":17,"tag":25,"props":350562,"children":350563},{},[],{"type":17,"tag":29,"props":350565,"children":350566},{},[350567],{"type":17,"tag":33,"props":350568,"children":350569},{},[350570],{"type":23,"value":350571},"May 9, 2024",{"type":17,"tag":29,"props":350573,"children":350574},{},[350575],{"type":17,"tag":6438,"props":350576,"children":350579},{"alt":350577,"src":350578},"unified.to_genai_api_hero_image.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_generative_ai_api_run_llms_with_real_time_data_and_actions_through_one_api-0.png",[],{"type":17,"tag":29,"props":350581,"children":350582},{},[350583],{"type":23,"value":350551},{"type":17,"tag":29,"props":350585,"children":350586},{},[350587,350588,350592],{"type":23,"value":149272},{"type":17,"tag":133,"props":350589,"children":350590},{"href":16186},[350591],{"type":23,"value":137141},{"type":23,"value":350593}," provides a single interface to send prompts and receive responses across multiple LLM providers—while combining those models with real-time data and actions across external systems. It acts as an execution layer for AI applications, where models, data, and system actions are handled through one API.",{"type":17,"tag":68,"props":350595,"children":350596},{"id":241569},[350597],{"type":23,"value":241572},{"type":17,"tag":80,"props":350599,"children":350600},{},[350601,350605,350609,350613,350617,350621,350625,350629,350633,350637,350641],{"type":17,"tag":84,"props":350602,"children":350603},{},[350604],{"type":23,"value":16112},{"type":17,"tag":84,"props":350606,"children":350607},{},[350608],{"type":23,"value":346696},{"type":17,"tag":84,"props":350610,"children":350611},{},[350612],{"type":23,"value":16482},{"type":17,"tag":84,"props":350614,"children":350615},{},[350616],{"type":23,"value":16525},{"type":17,"tag":84,"props":350618,"children":350619},{},[350620],{"type":23,"value":16686},{"type":17,"tag":84,"props":350622,"children":350623},{},[350624],{"type":23,"value":16120},{"type":17,"tag":84,"props":350626,"children":350627},{},[350628],{"type":23,"value":16648},{"type":17,"tag":84,"props":350630,"children":350631},{},[350632],{"type":23,"value":16605},{"type":17,"tag":84,"props":350634,"children":350635},{},[350636],{"type":23,"value":346723},{"type":17,"tag":84,"props":350638,"children":350639},{},[350640],{"type":23,"value":16104},{"type":17,"tag":84,"props":350642,"children":350643},{},[350644],{"type":23,"value":350645},"xAI (Grok)",{"type":17,"tag":29,"props":350647,"children":350648},{},[350649],{"type":23,"value":350650},"Additional model providers are expanding as part of this category.",{"type":17,"tag":68,"props":350652,"children":350654},{"id":350653},"unified-model-access-across-llm-providers",[350655],{"type":23,"value":350656},"Unified model access across LLM providers",{"type":17,"tag":29,"props":350658,"children":350659},{},[350660],{"type":23,"value":350661},"The Generative AI API standardizes interactions across models:",{"type":17,"tag":80,"props":350663,"children":350664},{},[350665,350670,350675],{"type":17,"tag":84,"props":350666,"children":350667},{},[350668],{"type":23,"value":350669},"Prompts follow a consistent request structure",{"type":17,"tag":84,"props":350671,"children":350672},{},[350673],{"type":23,"value":350674},"Responses are normalized across providers",{"type":17,"tag":84,"props":350676,"children":350677},{},[350678],{"type":23,"value":350679},"Model parameters (temperature, tokens, etc.) are handled consistently",{"type":17,"tag":29,"props":350681,"children":350682},{},[350683],{"type":23,"value":350684},"This allows systems to switch between LLM providers without rewriting integration logic.",{"type":17,"tag":29,"props":350686,"children":350687},{},[350688],{"type":17,"tag":6438,"props":350689,"children":350692},{"alt":350690,"src":350691},"one_model_many_llms.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_generative_ai_api_run_llms_with_real_time_data_and_actions_through_one_api-1.png",[],{"type":17,"tag":68,"props":350694,"children":350696},{"id":350695},"core-objects-in-the-generative-ai-api",[350697],{"type":23,"value":350698},"Core objects in the Generative AI API",{"type":17,"tag":80,"props":350700,"children":350701},{},[350702,350711,350720],{"type":17,"tag":84,"props":350703,"children":350704},{},[350705,350709],{"type":17,"tag":48,"props":350706,"children":350707},{},[350708],{"type":23,"value":137603},{"type":23,"value":350710},": available LLMs and their capabilities",{"type":17,"tag":84,"props":350712,"children":350713},{},[350714,350718],{"type":17,"tag":48,"props":350715,"children":350716},{},[350717],{"type":23,"value":137611},{"type":23,"value":350719},": requests sent to models, including messages and parameters",{"type":17,"tag":84,"props":350721,"children":350722},{},[350723,350727],{"type":17,"tag":48,"props":350724,"children":350725},{},[350726],{"type":23,"value":137619},{"type":23,"value":350728},": vector representations for text and semantic search",{"type":17,"tag":29,"props":350730,"children":350731},{},[350732],{"type":23,"value":350733},"These objects follow consistent schemas across providers, reducing the need to handle model-specific formats.",{"type":17,"tag":68,"props":350735,"children":350737},{"id":350736},"real-time-model-execution",[350738],{"type":23,"value":350739},"Real-time model execution",{"type":17,"tag":29,"props":350741,"children":350742},{},[350743],{"type":23,"value":350744},"The Generative AI API executes requests in real time:",{"type":17,"tag":80,"props":350746,"children":350747},{},[350748,350753,350758],{"type":17,"tag":84,"props":350749,"children":350750},{},[350751],{"type":23,"value":350752},"Requests are routed directly to model providers",{"type":17,"tag":84,"props":350754,"children":350755},{},[350756],{"type":23,"value":350757},"No caching or stored prompt data",{"type":17,"tag":84,"props":350759,"children":350760},{},[350761],{"type":23,"value":350762},"Responses are returned immediately from the source model",{"type":17,"tag":29,"props":350764,"children":350765},{},[350766],{"type":23,"value":350767},"This enables systems to dynamically select, route, and evaluate models at runtime.",{"type":17,"tag":68,"props":350769,"children":350771},{"id":350770},"ai-with-real-time-data-and-system-actions",[350772],{"type":23,"value":350773},"AI with real-time data and system actions",{"type":17,"tag":29,"props":350775,"children":350776},{},[350777],{"type":23,"value":350778},"The Generative AI API connects LLMs with live data and external systems through Unified's integration layer.",{"type":17,"tag":29,"props":350780,"children":350781},{},[350782],{"type":23,"value":350783},"This allows AI systems to:",{"type":17,"tag":80,"props":350785,"children":350786},{},[350787,350798,350803,350808],{"type":17,"tag":84,"props":350788,"children":350789},{},[350790,350792,350796],{"type":23,"value":350791},"Retrieve real-time data from APIs as part of a ",{"type":17,"tag":133,"props":350793,"children":350794},{"href":77021},[350795],{"type":23,"value":77024},{"type":23,"value":350797}," (RAG) pipeline",{"type":17,"tag":84,"props":350799,"children":350800},{},[350801],{"type":23,"value":350802},"Generate responses based on current system state",{"type":17,"tag":84,"props":350804,"children":350805},{},[350806],{"type":23,"value":350807},"Trigger actions in external systems (create records, send messages, update data)",{"type":17,"tag":84,"props":350809,"children":350810},{},[350811],{"type":23,"value":350812},"Combine multiple data sources within a single request",{"type":17,"tag":29,"props":350814,"children":350815},{},[350816],{"type":23,"value":350817},"Instead of operating on static inputs, models can reason over live data and take action in connected systems.",{"type":17,"tag":68,"props":350819,"children":350821},{"id":350820},"retrieval-augmented-generation-rag-with-real-time-data",[350822],{"type":23,"value":350823},"Retrieval-augmented generation (RAG) with real-time data",{"type":17,"tag":29,"props":350825,"children":350826},{},[350827],{"type":23,"value":350828},"The Generative AI API supports retrieval-augmented generation (RAG) by allowing models to access live data from external systems at request time.",{"type":17,"tag":29,"props":350830,"children":350831},{},[350832],{"type":23,"value":350833},"Instead of relying only on training data or static context, applications can:",{"type":17,"tag":80,"props":350835,"children":350836},{},[350837,350842,350847],{"type":17,"tag":84,"props":350838,"children":350839},{},[350840],{"type":23,"value":350841},"Retrieve relevant data from APIs before generating a response",{"type":17,"tag":84,"props":350843,"children":350844},{},[350845],{"type":23,"value":350846},"Provide structured, up-to-date context to the model",{"type":17,"tag":84,"props":350848,"children":350849},{},[350850],{"type":23,"value":350851},"Ground outputs in source systems with traceable data",{"type":17,"tag":29,"props":350853,"children":350854},{},[350855],{"type":23,"value":350856},"Because data is fetched in real time, RAG pipelines operate on current system state rather than cached or outdated information.",{"type":17,"tag":29,"props":350858,"children":350859},{},[350860],{"type":23,"value":350861},"This removes the need to build and maintain separate data pipelines for RAG—data can be retrieved, injected into prompts, and acted on within a single request.",{"type":17,"tag":29,"props":350863,"children":350864},{},[350865],{"type":17,"tag":6438,"props":350866,"children":350869},{"alt":350867,"src":350868},"retrieval-augmented_generation.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_generative_ai_api_run_llms_with_real_time_data_and_actions_through_one_api-2.png",[],{"type":17,"tag":68,"props":350871,"children":350873},{"id":350872},"what-teams-build-with-the-generative-ai-api",[350874],{"type":23,"value":350875},"What teams build with the Generative AI API",{"type":17,"tag":80,"props":350877,"children":350878},{},[350879,350884,350889,350894,350899],{"type":17,"tag":84,"props":350880,"children":350881},{},[350882],{"type":23,"value":350883},"AI copilots that operate on live business data",{"type":17,"tag":84,"props":350885,"children":350886},{},[350887],{"type":23,"value":350888},"Systems that route requests between models based on cost, latency, or performance",{"type":17,"tag":84,"props":350890,"children":350891},{},[350892],{"type":23,"value":350893},"Retrieval-augmented generation (RAG) pipelines using real-time data",{"type":17,"tag":84,"props":350895,"children":350896},{},[350897],{"type":23,"value":350898},"AI agents that take actions across APIs",{"type":17,"tag":84,"props":350900,"children":350901},{},[350902],{"type":23,"value":350903},"Embedding pipelines for search, classification, and semantic analysis",{"type":17,"tag":68,"props":350905,"children":350906},{"id":182585},[350907],{"type":23,"value":182588},{"type":17,"tag":80,"props":350909,"children":350910},{},[350911,350916,350921,350926,350931],{"type":17,"tag":84,"props":350912,"children":350913},{},[350914],{"type":23,"value":350915},"AI product teams building copilots or assistants",{"type":17,"tag":84,"props":350917,"children":350918},{},[350919],{"type":23,"value":350920},"Platforms integrating multiple LLM providers",{"type":17,"tag":84,"props":350922,"children":350923},{},[350924],{"type":23,"value":350925},"Systems requiring model routing or fallback logic",{"type":17,"tag":84,"props":350927,"children":350928},{},[350929],{"type":23,"value":350930},"Applications combining AI with operational data",{"type":17,"tag":84,"props":350932,"children":350933},{},[350934],{"type":23,"value":350935},"Products building agent-based workflows across APIs",{"type":17,"tag":68,"props":350937,"children":350938},{"id":16176},[350939],{"type":23,"value":350940},"What is a generative AI API?",{"type":17,"tag":29,"props":350942,"children":350943},{},[350944],{"type":23,"value":350945},"A generative AI API allows developers to send prompts to large language models and receive generated responses. A unified generative AI API standardizes how models are accessed across providers—and when combined with real-time data and system actions, enables AI systems to operate on live context and execute tasks across external platforms.",{"type":17,"tag":68,"props":350947,"children":350948},{"id":332555},[350949],{"type":23,"value":332558},{"type":17,"tag":29,"props":350951,"children":350952},{},[350953],{"type":23,"value":350954},"The Generative AI API is available on all Unified plans.",{"type":17,"tag":80,"props":350956,"children":350957},{},[350958,350966,350974],{"type":17,"tag":84,"props":350959,"children":350960},{},[350961],{"type":17,"tag":133,"props":350962,"children":350964},{"href":176923,"rel":350963},[214],[350965],{"type":23,"value":287157},{"type":17,"tag":84,"props":350967,"children":350968},{},[350969],{"type":17,"tag":133,"props":350970,"children":350972},{"href":1612,"rel":350971},[214],[350973],{"type":23,"value":215326},{"type":17,"tag":84,"props":350975,"children":350976},{},[350977],{"type":17,"tag":133,"props":350978,"children":350980},{"href":332588,"rel":350979},[214],[350981],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":350983},[350984,350985,350986,350987,350988,350989,350990,350991,350992,350993],{"id":241569,"depth":1629,"text":241572},{"id":350653,"depth":1629,"text":350656},{"id":350695,"depth":1629,"text":350698},{"id":350736,"depth":1629,"text":350739},{"id":350770,"depth":1629,"text":350773},{"id":350820,"depth":1629,"text":350823},{"id":350872,"depth":1629,"text":350875},{"id":182585,"depth":1629,"text":182588},{"id":16176,"depth":1629,"text":350940},{"id":332555,"depth":1629,"text":332558},"content:blog:unified_generative_ai_api_run_llms_with_real_time_data_and_actions_through_one_api.md","blog/unified_generative_ai_api_run_llms_with_real_time_data_and_actions_through_one_api.md","blog/unified_generative_ai_api_run_llms_with_real_time_data_and_actions_through_one_api",{"_path":350998,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":350999,"description":351000,"img":351001,"date":351002,"tag":12,"body":351003,"_type":1677,"_id":351817,"_source":1679,"_file":351818,"_stem":351819,"_extension":1682},"/blog/unified_apr_2024_product_updates","Unified.to Apr 2024 product updates","We're making it super easy for software companies to grow their product functionality and win more customers through API integrations. Here's everything we...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apr_2024_product_updates-icon.png","2024-04-30T00:00:00.000Z",{"type":14,"children":351004,"toc":351808},[351005,351010,351013,351021,351029,351034,351042,351085,351090,351098,351109,351114,351119,351147,351151,351156,351170,351175,351189,351194,351207,351212,351227,351232,351238,351257,351268,351273,351361,351367,351380,351390,351398,351408,351416,351422,351427,351434,351472,351479,351492,351499,351512,351519,351542,351547,351558,351563,351568,351573,351656,351666,351672,351677,351682,351690,351701,351706,351789],{"type":17,"tag":18,"props":351006,"children":351008},{"id":351007},"unifiedto-apr-2024-product-updates",[351009],{"type":23,"value":350999},{"type":17,"tag":25,"props":351011,"children":351012},{},[],{"type":17,"tag":29,"props":351014,"children":351015},{},[351016],{"type":17,"tag":33,"props":351017,"children":351018},{},[351019],{"type":23,"value":351020},"April 30, 2024",{"type":17,"tag":29,"props":351022,"children":351023},{},[351024],{"type":17,"tag":6438,"props":351025,"children":351028},{"alt":351026,"src":351027},"April_Product_Update_-_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apr_2024_product_updates-0.png",[],{"type":17,"tag":29,"props":351030,"children":351031},{},[351032],{"type":23,"value":351033},"We're making it super easy for software companies to grow their product functionality and win more customers through API integrations. Here's everything we shipped in April.",{"type":17,"tag":29,"props":351035,"children":351036},{},[351037],{"type":17,"tag":48,"props":351038,"children":351039},{},[351040],{"type":23,"value":351041},"In this update",{"type":17,"tag":80,"props":351043,"children":351044},{},[351045,351050,351055,351060,351065,351075,351080],{"type":17,"tag":84,"props":351046,"children":351047},{},[351048],{"type":23,"value":351049},"Introducing PayPal",{"type":17,"tag":84,"props":351051,"children":351052},{},[351053],{"type":23,"value":351054},"This month's integration releases",{"type":17,"tag":84,"props":351056,"children":351057},{},[351058],{"type":23,"value":351059},"Expanded Virtual Webhook support",{"type":17,"tag":84,"props":351061,"children":351062},{},[351063],{"type":23,"value":351064},"Payslip and Time Off support for HR integrations",{"type":17,"tag":84,"props":351066,"children":351067},{},[351068,351069,351073],{"type":23,"value":240252},{"type":17,"tag":133,"props":351070,"children":351071},{"href":1857},[351072],{"type":23,"value":2409},{"type":23,"value":351074}," support",{"type":17,"tag":84,"props":351076,"children":351077},{},[351078],{"type":23,"value":351079},"Writable fields enhancement",{"type":17,"tag":84,"props":351081,"children":351082},{},[351083],{"type":23,"value":351084},"Event notifications",{"type":17,"tag":68,"props":351086,"children":351088},{"id":351087},"introducing-paypal",[351089],{"type":23,"value":351049},{"type":17,"tag":29,"props":351091,"children":351092},{},[351093],{"type":17,"tag":6438,"props":351094,"children":351097},{"alt":351095,"src":351096},"PayPal_API_Integration_-_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apr_2024_product_updates-1.png",[],{"type":17,"tag":29,"props":351099,"children":351100},{},[351101,351107],{"type":17,"tag":133,"props":351102,"children":351105},{"href":351103,"rel":351104},"https://unified.to/integrations/paypal",[214],[351106],{"type":23,"value":26553},{"type":23,"value":351108}," is one of the world's largest online payment systems, offering services in more than 200 countries and processing 40 million daily transactions. PayPay's prominence makes it a highly-requested integration in modern fintech, e-commerce, and accounting software companies.",{"type":17,"tag":29,"props":351110,"children":351111},{},[351112],{"type":23,"value":351113},"Today, we're excited to introduce PayPal to the Unified.to platform!",{"type":17,"tag":29,"props":351115,"children":351116},{},[351117],{"type":23,"value":351118},"Our pre-built PayPal integration lets you access your customers' real-time payment processing data to enable features like ROI calculations, financial analysis, and invoicing automation. PayPal's Accounting Transaction object also has virtual webhook support to enable time-sensitive functionality in your application with the most up-to-date and accurate data.",{"type":17,"tag":29,"props":351120,"children":351121},{},[351122,351124,351130,351131,351137,351139,351145],{"type":23,"value":351123},"Ready to access PayPal data alongside other platforms like ",{"type":17,"tag":133,"props":351125,"children":351128},{"href":351126,"rel":351127},"https://unified.to/integrations/stripe",[214],[351129],{"type":23,"value":26548},{"type":23,"value":34435},{"type":17,"tag":133,"props":351132,"children":351135},{"href":351133,"rel":351134},"https://unified.to/integrations/gocardless",[214],[351136],{"type":23,"value":37073},{"type":23,"value":351138},"? ",{"type":17,"tag":133,"props":351140,"children":351142},{"href":1612,"rel":351141},[214],[351143],{"type":23,"value":351144},"Create a free account",{"type":23,"value":351146}," to add integrations to your application.",{"type":17,"tag":68,"props":351148,"children":351149},{"id":11629},[351150],{"type":23,"value":216420},{"type":17,"tag":29,"props":351152,"children":351153},{},[351154],{"type":23,"value":351155},"In addition to PayPal, we released the following integrations  are now available:",{"type":17,"tag":29,"props":351157,"children":351158},{},[351159,351169],{"type":17,"tag":133,"props":351160,"children":351163},{"href":351161,"rel":351162},"https://unified.to/integrations/heavenhr",[214],[351164],{"type":17,"tag":48,"props":351165,"children":351166},{},[351167],{"type":23,"value":351168},"HeavenHR",{"type":23,"value":341757},{"type":17,"tag":29,"props":351171,"children":351172},{},[351173],{"type":23,"value":351174},"HeavenHR is a cloud-based HR management software that streamlines payroll, recruitment, and employee management for small to medium-sized businesses. Access your customers' Employee and Time Off data.",{"type":17,"tag":29,"props":351176,"children":351177},{},[351178,351187],{"type":17,"tag":133,"props":351179,"children":351182},{"href":351180,"rel":351181},"https://unified.to/integrations/bigcommerce",[214],[351183],{"type":17,"tag":48,"props":351184,"children":351185},{},[351186],{"type":23,"value":37451},{"type":23,"value":351188}," (Commerce)",{"type":17,"tag":29,"props":351190,"children":351191},{},[351192],{"type":23,"value":351193},"BigCommerce is an e-commerce platform that provides businesses with scalable solutions to build, customize, and grow their online stores. Access your customers' commerce and accounting data.",{"type":17,"tag":29,"props":351195,"children":351196},{},[351197,351206],{"type":17,"tag":133,"props":351198,"children":351201},{"href":351199,"rel":351200},"https://unified.to/integrations/insightly",[214],[351202],{"type":17,"tag":48,"props":351203,"children":351204},{},[351205],{"type":23,"value":109353},{"type":23,"value":239795},{"type":17,"tag":29,"props":351208,"children":351209},{},[351210],{"type":23,"value":351211},"Insightly is a CRM and project management software that helps businesses organize contacts, manage projects, and track their customer interactions. Access your customers' sales data.",{"type":17,"tag":29,"props":351213,"children":351214},{},[351215,351225],{"type":17,"tag":133,"props":351216,"children":351219},{"href":351217,"rel":351218},"https://unified.to/integrations/instantlyai",[214],[351220],{"type":17,"tag":48,"props":351221,"children":351222},{},[351223],{"type":23,"value":351224},"Instantly.ai",{"type":23,"value":351226}," (Marketing)",{"type":17,"tag":29,"props":351228,"children":351229},{},[351230],{"type":23,"value":351231},"Instantly.ai is an AI-powered marketing platform that optimizes lead generation with AI. Access your customers' lead data.",{"type":17,"tag":68,"props":351233,"children":351235},{"id":351234},"expanded-virtual-webhook-support",[351236],{"type":23,"value":351237},"Expanded virtual webhook support",{"type":17,"tag":29,"props":351239,"children":351240},{},[351241,351247,351249,351255],{"type":17,"tag":133,"props":351242,"children":351245},{"href":351243,"rel":351244},"https://unified.to/blog/understanding_native_and_virtual_webhooks",[214],[351246],{"type":23,"value":43896},{"type":23,"value":351248}," are critical for time-sensitive features like e-commerce inventory management, invoicing, and financial insights. Unfortunately, the majority of SaaS APIs do not support them natively. In the ",{"type":17,"tag":133,"props":351250,"children":351252},{"href":327182,"rel":351251},[214],[351253],{"type":23,"value":351254},"2024 State of SaaS APIs",{"type":23,"value":351256},", a report that analyzes 145+ APIs, we found that 89% of APIs do not have native webhook support.",{"type":17,"tag":29,"props":351258,"children":351259},{},[351260,351262,351266],{"type":23,"value":351261},"That's why we introduced [Virtual ",{"type":17,"tag":133,"props":351263,"children":351264},{"href":4999},[351265],{"type":23,"value":43896},{"type":23,"value":351267},"](/blog/unlock_real_time_data_with_virtual_webhooks), through Unified.to's virtual webhooks, we've added webhook-like functionality to 77 of our integrations and 218 objects, which provides a consistent callback interface and ensures developers always have access to fresh customer data. Our webhook API is the same for virtual and native webhooks.",{"type":17,"tag":29,"props":351269,"children":351270},{},[351271],{"type":23,"value":351272},"This month, we've created virtual webhooks for the following integrations and objects:",{"type":17,"tag":80,"props":351274,"children":351275},{},[351276,351281,351286,351291,351296,351301,351306,351311,351316,351321,351326,351331,351336,351341,351346,351351,351356],{"type":17,"tag":84,"props":351277,"children":351278},{},[351279],{"type":23,"value":351280},"BambooHR — Candidate and Application",{"type":17,"tag":84,"props":351282,"children":351283},{},[351284],{"type":23,"value":351285},"JobAdder — Company, Contact, Interview",{"type":17,"tag":84,"props":351287,"children":351288},{},[351289],{"type":23,"value":351290},"Workable — Application, Candidate and Job",{"type":17,"tag":84,"props":351292,"children":351293},{},[351294],{"type":23,"value":351295},"Zoho Books — Item, Organization, Account, Transaction, Taxrate and Employee",{"type":17,"tag":84,"props":351297,"children":351298},{},[351299],{"type":23,"value":351300},"Xero - Timeoff",{"type":17,"tag":84,"props":351302,"children":351303},{},[351304],{"type":23,"value":351305},"QuickBooks - Organization",{"type":17,"tag":84,"props":351307,"children":351308},{},[351309],{"type":23,"value":351310},"Plum — Candidate",{"type":17,"tag":84,"props":351312,"children":351313},{},[351314],{"type":23,"value":351315},"Mailchimp - List",{"type":17,"tag":84,"props":351317,"children":351318},{},[351319],{"type":23,"value":351320},"Greenhouse - Scorecard",{"type":17,"tag":84,"props":351322,"children":351323},{},[351324],{"type":23,"value":351325},"Gem - Document",{"type":17,"tag":84,"props":351327,"children":351328},{},[351329],{"type":23,"value":351330},"Cornerstone — Group an Employee",{"type":17,"tag":84,"props":351332,"children":351333},{},[351334],{"type":23,"value":351335},"Affinity — Event",{"type":17,"tag":84,"props":351337,"children":351338},{},[351339],{"type":23,"value":351340},"Zoho CRM - Lead, Company, Contact, and Deal",{"type":17,"tag":84,"props":351342,"children":351343},{},[351344],{"type":23,"value":351345},"Freshteam — Employee",{"type":17,"tag":84,"props":351347,"children":351348},{},[351349],{"type":23,"value":351350},"FactorialHR - Timeoff",{"type":17,"tag":84,"props":351352,"children":351353},{},[351354],{"type":23,"value":351355},"MYOB - Employee",{"type":17,"tag":84,"props":351357,"children":351358},{},[351359],{"type":23,"value":351360},"iCIMS - Employee",{"type":17,"tag":68,"props":351362,"children":351364},{"id":351363},"payslip-and-time-off-support",[351365],{"type":23,"value":351366},"Payslip and Time Off support",{"type":17,"tag":29,"props":351368,"children":351369},{},[351370,351372,351378],{"type":23,"value":351371},"We've enhanced our ",{"type":17,"tag":133,"props":351373,"children":351375},{"href":58209,"rel":351374},[214],[351376],{"type":23,"value":351377},"unified HR API",{"type":23,"value":351379},"  with support for two new objects: Payslip and Time off. This customer data allows you to streamline payroll processes, automate salary calculations, and power workforce insights for your users.",{"type":17,"tag":29,"props":351381,"children":351382},{},[351383,351388],{"type":17,"tag":48,"props":351384,"children":351385},{},[351386],{"type":23,"value":351387},"Payslip:",{"type":23,"value":351389}," Access your customers' payslip data from your HR integrations, including pay period, paid or unpaid, approval status, and comments.",{"type":17,"tag":29,"props":351391,"children":351392},{},[351393],{"type":17,"tag":133,"props":351394,"children":351396},{"href":343981,"rel":351395},[214],[351397],{"type":23,"value":346465},{"type":17,"tag":29,"props":351399,"children":351400},{},[351401,351406],{"type":17,"tag":48,"props":351402,"children":351403},{},[351404],{"type":23,"value":351405},"Time Off:",{"type":23,"value":351407}," Access your customers' time off data (absences, leaves, vacations) from your HR integrations, including the time off request period, approval status, and any comments or notes associated with the time off request.",{"type":17,"tag":29,"props":351409,"children":351410},{},[351411],{"type":17,"tag":133,"props":351412,"children":351414},{"href":344006,"rel":351413},[214],[351415],{"type":23,"value":346465},{"type":17,"tag":68,"props":351417,"children":351419},{"id":351418},"expanded-pagination-support",[351420],{"type":23,"value":351421},"Expanded Pagination support",{"type":17,"tag":29,"props":351423,"children":351424},{},[351425],{"type":23,"value":351426},"We've added Pagination support to many of our integrations and objects, including:",{"type":17,"tag":29,"props":351428,"children":351429},{},[351430],{"type":17,"tag":48,"props":351431,"children":351432},{},[351433],{"type":23,"value":38530},{"type":17,"tag":80,"props":351435,"children":351436},{},[351437,351442,351447,351452,351457,351462,351467],{"type":17,"tag":84,"props":351438,"children":351439},{},[351440],{"type":23,"value":351441},"Zoho Books Item added updated_gte pagination support",{"type":17,"tag":84,"props":351443,"children":351444},{},[351445],{"type":23,"value":351446},"Zoho Books Organization added updated_gte pagination support",{"type":17,"tag":84,"props":351448,"children":351449},{},[351450],{"type":23,"value":351451},"Zoho Books Account added updated_gte pagination support",{"type":17,"tag":84,"props":351453,"children":351454},{},[351455],{"type":23,"value":351456},"Zoho Books Transaction added query, sort_by_created_at, sort_by_name, sort_by_updated_at and updated_gte pagination support",{"type":17,"tag":84,"props":351458,"children":351459},{},[351460],{"type":23,"value":351461},"Zoho Books Taxrate added updated_gte pagination support",{"type":17,"tag":84,"props":351463,"children":351464},{},[351465],{"type":23,"value":351466},"Zoho Books Employee added updated_gte pagination support",{"type":17,"tag":84,"props":351468,"children":351469},{},[351470],{"type":23,"value":351471},"Zoho Books Contact added type pagination support",{"type":17,"tag":29,"props":351473,"children":351474},{},[351475],{"type":17,"tag":48,"props":351476,"children":351477},{},[351478],{"type":23,"value":6678},{"type":17,"tag":80,"props":351480,"children":351481},{},[351482,351487],{"type":17,"tag":84,"props":351483,"children":351484},{},[351485],{"type":23,"value":351486},"Xero Timeoff added offset, order, sort_by_created_at and sort_by_updated_at pagination support",{"type":17,"tag":84,"props":351488,"children":351489},{},[351490],{"type":23,"value":351491},"Xero Contact added type pagination support",{"type":17,"tag":29,"props":351493,"children":351494},{},[351495],{"type":17,"tag":48,"props":351496,"children":351497},{},[351498],{"type":23,"value":37435},{"type":17,"tag":80,"props":351500,"children":351501},{},[351502,351507],{"type":17,"tag":84,"props":351503,"children":351504},{},[351505],{"type":23,"value":351506},"Shopify Collection added type pagination support",{"type":17,"tag":84,"props":351508,"children":351509},{},[351510],{"type":23,"value":351511},"Shopify Employee added updated_gte and query pagination support",{"type":17,"tag":29,"props":351513,"children":351514},{},[351515],{"type":17,"tag":48,"props":351516,"children":351517},{},[351518],{"type":23,"value":3179},{"type":17,"tag":80,"props":351520,"children":351521},{},[351522,351527,351532,351537],{"type":17,"tag":84,"props":351523,"children":351524},{},[351525],{"type":23,"value":351526},"Salesforce Event added type pagination support",{"type":17,"tag":84,"props":351528,"children":351529},{},[351530],{"type":23,"value":351531},"Salesforce Deal added company_id and contact_id pagination support",{"type":17,"tag":84,"props":351533,"children":351534},{},[351535],{"type":23,"value":351536},"Salesforce Company added contact_id and deal_id pagination support",{"type":17,"tag":84,"props":351538,"children":351539},{},[351540],{"type":23,"value":351541},"Salesforce Contact added company_id and deal_id pagination support",{"type":17,"tag":29,"props":351543,"children":351544},{},[351545],{"type":23,"value":351546},"By ensuring more of our integrations support pagination, we've optimized loading times and provided you with more control over data handling. By allowing for incremental data fetching, we enhance user experience, reduce load times, and improve the scalability of your applications as they grow.",{"type":17,"tag":29,"props":351548,"children":351549},{},[351550,351552],{"type":23,"value":351551},"See more pagination updates on the ",{"type":17,"tag":133,"props":351553,"children":351555},{"href":47029,"rel":351554},[214],[351556],{"type":23,"value":351557},"Unified.to changelog",{"type":17,"tag":68,"props":351559,"children":351561},{"id":351560},"writable-fields-enhancement",[351562],{"type":23,"value":351079},{"type":17,"tag":29,"props":351564,"children":351565},{},[351566],{"type":23,"value":351567},"We're determined to provide software companies with the most robust and flexible unified API platform. This month we've continued to expand writable fields to enable real-time data manipulation (updates, deletions, creations) as well as increase interactivity and automation in your application through one API.",{"type":17,"tag":29,"props":351569,"children":351570},{},[351571],{"type":23,"value":351572},"The following integrations and objects have new writable fields:",{"type":17,"tag":80,"props":351574,"children":351575},{},[351576,351581,351586,351591,351596,351601,351606,351611,351616,351621,351626,351631,351636,351641,351646,351651],{"type":17,"tag":84,"props":351577,"children":351578},{},[351579],{"type":23,"value":351580},"Stripe Payment added new writable fields: total_amount, reference, notes, invoice_id, currency and contact_id",{"type":17,"tag":84,"props":351582,"children":351583},{},[351584],{"type":23,"value":351585},"Stripe Invoice added new writable fields: paid_amount",{"type":17,"tag":84,"props":351587,"children":351588},{},[351589],{"type":23,"value":351590},"GoCardless Link added new writable fields: lineitems, currency, contact_id and amount",{"type":17,"tag":84,"props":351592,"children":351593},{},[351594],{"type":23,"value":351595},"Bullhorn Company added new writable fields: websites, user_id, telephones, industry, employees, description and address",{"type":17,"tag":84,"props":351597,"children":351598},{},[351599],{"type":23,"value":351600},"Bullhorn Interview added new writable fields: job_id and candidate_id",{"type":17,"tag":84,"props":351602,"children":351603},{},[351604],{"type":23,"value":351605},"HiBob Employee added new writable fields: title, manager_id and hired_at, telephones, and employee_number",{"type":17,"tag":84,"props":351607,"children":351608},{},[351609],{"type":23,"value":351610},"Recruiterflow Candidate added new writable fields: user_id",{"type":17,"tag":84,"props":351612,"children":351613},{},[351614],{"type":23,"value":351615},"Greenhouse Candidate added new writable fields: external_identifier",{"type":17,"tag":84,"props":351617,"children":351618},{},[351619],{"type":23,"value":351620},"Crelate Candidate added new writable fields: user_id",{"type":17,"tag":84,"props":351622,"children":351623},{},[351624],{"type":23,"value":351625},"Checkr Candidate added new writable fields: external_identifier",{"type":17,"tag":84,"props":351627,"children":351628},{},[351629],{"type":23,"value":351630},"Bullhorn Candidate added new writable fields: user_id and external_identifier",{"type":17,"tag":84,"props":351632,"children":351633},{},[351634],{"type":23,"value":351635},"Bullhorn Application added new writable fields: status",{"type":17,"tag":84,"props":351637,"children":351638},{},[351639],{"type":23,"value":351640},"Xero Contact added new writable fields: tax_number and currency",{"type":17,"tag":84,"props":351642,"children":351643},{},[351644],{"type":23,"value":351645},"BambooHR Application added new writable fields: status",{"type":17,"tag":84,"props":351647,"children":351648},{},[351649],{"type":23,"value":351650},"Workable Application added new writable fields: answers",{"type":17,"tag":84,"props":351652,"children":351653},{},[351654],{"type":23,"value":351655},"Greenhouse Application added new writable fields: answers",{"type":17,"tag":29,"props":351657,"children":351658},{},[351659,351661],{"type":23,"value":351660},"See more writable and readable field updates on the ",{"type":17,"tag":133,"props":351662,"children":351664},{"href":47029,"rel":351663},[214],[351665],{"type":23,"value":351557},{"type":17,"tag":68,"props":351667,"children":351669},{"id":351668},"event-notifications",[351670],{"type":23,"value":351671},"Event Notifications",{"type":17,"tag":29,"props":351673,"children":351674},{},[351675],{"type":23,"value":351676},"Event notifications make it easy to stay informed about your account activity. This new feature allows you to  instantly notify an end-user if their connection is unhealthy, usually indicating a need for re-authentication, and to ensure visibility into your account's usage to avoid unexpected overages.",{"type":17,"tag":29,"props":351678,"children":351679},{},[351680],{"type":23,"value":351681},"You can also use event notifications to link an end user's connection to their specific record by listening to the connection_created event and referring to the external_xref field.",{"type":17,"tag":29,"props":351683,"children":351684},{},[351685],{"type":17,"tag":6438,"props":351686,"children":351689},{"alt":351687,"src":351688},"Notifications_Webhook_URL.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apr_2024_product_updates-2.png",[],{"type":17,"tag":29,"props":351691,"children":351692},{},[351693,351694,351699],{"type":23,"value":6661},{"type":17,"tag":33,"props":351695,"children":351696},{},[351697],{"type":23,"value":351698},"Settings > Workspace",{"type":23,"value":351700}," to insert a Webhook Notifications URL and select the events you want to track.",{"type":17,"tag":29,"props":351702,"children":351703},{},[351704],{"type":23,"value":351705},"You can receive notifications for the following events:",{"type":17,"tag":80,"props":351707,"children":351708},{},[351709,351714,351719,351724,351729,351734,351739,351744,351749,351754,351759,351764,351769,351774,351779,351784],{"type":17,"tag":84,"props":351710,"children":351711},{},[351712],{"type":23,"value":351713},"connection_created",{"type":17,"tag":84,"props":351715,"children":351716},{},[351717],{"type":23,"value":351718},"connection_deleted",{"type":17,"tag":84,"props":351720,"children":351721},{},[351722],{"type":23,"value":351723},"connection_healthy",{"type":17,"tag":84,"props":351725,"children":351726},{},[351727],{"type":23,"value":351728},"connection_paused",{"type":17,"tag":84,"props":351730,"children":351731},{},[351732],{"type":23,"value":351733},"connection_unhealthy",{"type":17,"tag":84,"props":351735,"children":351736},{},[351737],{"type":23,"value":351738},"connection_unpaused",{"type":17,"tag":84,"props":351740,"children":351741},{},[351742],{"type":23,"value":351743},"connection_updated",{"type":17,"tag":84,"props":351745,"children":351746},{},[351747],{"type":23,"value":351748},"integration_activated",{"type":17,"tag":84,"props":351750,"children":351751},{},[351752],{"type":23,"value":351753},"integration_deactivated",{"type":17,"tag":84,"props":351755,"children":351756},{},[351757],{"type":23,"value":351758},"integration_updated",{"type":17,"tag":84,"props":351760,"children":351761},{},[351762],{"type":23,"value":351763},"user_created, user_deleted",{"type":17,"tag":84,"props":351765,"children":351766},{},[351767],{"type":23,"value":351768},"webhook_created",{"type":17,"tag":84,"props":351770,"children":351771},{},[351772],{"type":23,"value":351773},"webhook_deleted",{"type":17,"tag":84,"props":351775,"children":351776},{},[351777],{"type":23,"value":351778},"workspace_80percent_limit",{"type":17,"tag":84,"props":351780,"children":351781},{},[351782],{"type":23,"value":351783},"workspace_over_limit",{"type":17,"tag":84,"props":351785,"children":351786},{},[351787],{"type":23,"value":351788},"workspace_updated",{"type":17,"tag":29,"props":351790,"children":351791},{},[351792,351794,351800,351801,351807],{"type":23,"value":351793},"Looking to access real-time structured data for your application? ",{"type":17,"tag":133,"props":351795,"children":351797},{"href":215330,"rel":351796},[214],[351798],{"type":23,"value":351799},"Get in touch",{"type":23,"value":75890},{"type":17,"tag":133,"props":351802,"children":351804},{"href":1612,"rel":351803},[214],[351805],{"type":23,"value":351806},"create a free account",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":351809},[351810,351811,351812,351813,351814,351815,351816],{"id":351087,"depth":1629,"text":351049},{"id":11629,"depth":1629,"text":216420},{"id":351234,"depth":1629,"text":351237},{"id":351363,"depth":1629,"text":351366},{"id":351418,"depth":1629,"text":351421},{"id":351560,"depth":1629,"text":351079},{"id":351668,"depth":1629,"text":351671},"content:blog:unified_apr_2024_product_updates.md","blog/unified_apr_2024_product_updates.md","blog/unified_apr_2024_product_updates",{"_path":351821,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":351822,"description":351823,"img":351824,"date":351825,"tag":12,"body":351826,"_type":1677,"_id":352274,"_source":1679,"_file":352275,"_stem":352276,"_extension":1682},"/blog/2024_state_of_saas_apis_urls","2024 State of SaaS APIs: URLs","Even though they're a key part of APIs, URLs are often ignored when discussing them. In this article — the second in our series based on our 2024 State of SaaS...","https://s3.us-east-2.amazonaws.com/unified-article-images/2024_state_of_saas_apis_urls-icon.png","2024-04-26T00:00:00.000Z",{"type":14,"children":351827,"toc":352268},[351828,351833,351836,351844,351859,351865,351879,351891,351917,351930,351942,351947,351953,351958,352125,352131,352145,352150,352214,352220,352227,352237,352244,352254],{"type":17,"tag":18,"props":351829,"children":351831},{"id":351830},"_2024-state-of-saas-apis-urls",[351832],{"type":23,"value":351822},{"type":17,"tag":25,"props":351834,"children":351835},{},[],{"type":17,"tag":29,"props":351837,"children":351838},{},[351839],{"type":17,"tag":33,"props":351840,"children":351841},{},[351842],{"type":23,"value":351843},"April 26, 2024",{"type":17,"tag":29,"props":351845,"children":351846},{},[351847,351849,351857],{"type":23,"value":351848},"Even though they're a key part of APIs, URLs are often ignored when discussing them. In this article — the second in our series based on our ",{"type":17,"tag":133,"props":351850,"children":351852},{"href":327182,"rel":351851},[214],[351853],{"type":17,"tag":33,"props":351854,"children":351855},{},[351856],{"type":23,"value":351254},{"type":23,"value":351858}," report — we'll take a closer look at URLs.",{"type":17,"tag":68,"props":351860,"children":351862},{"id":351861},"resources-and-urls",[351863],{"type":23,"value":351864},"Resources and URLs",{"type":17,"tag":29,"props":351866,"children":351867},{},[351868,351869,351877],{"type":23,"value":9619},{"type":17,"tag":33,"props":351870,"children":351871},{},[351872],{"type":17,"tag":48,"props":351873,"children":351874},{},[351875],{"type":23,"value":351876},"web resource",{"type":23,"value":351878}," is anything that is accessible via or connected to the web.",{"type":17,"tag":29,"props":351880,"children":351881},{},[351882,351884,351889],{"type":23,"value":351883},"In the web's early days, the term 'web resources' referred only to web pages and downloadable files, including the web page you're reading right now. Today, it refers to any physical, digital, or abstract thing that can be identified using a ",{"type":17,"tag":33,"props":351885,"children":351886},{},[351887],{"type":23,"value":351888},"uniform resource locator",{"type":23,"value":351890}," (URL). When talking about APIs, we often shorten  'web resource' to 'resource.'",{"type":17,"tag":29,"props":351892,"children":351893},{},[351894,351895,351902,351903,351907,351908,351915],{"type":23,"value":9619},{"type":17,"tag":33,"props":351896,"children":351897},{},[351898],{"type":17,"tag":48,"props":351899,"children":351900},{},[351901],{"type":23,"value":351888},{"type":23,"value":18757},{"type":17,"tag":33,"props":351904,"children":351905},{},[351906],{"type":23,"value":217439},{"type":23,"value":18757},{"type":17,"tag":33,"props":351909,"children":351910},{},[351911],{"type":17,"tag":48,"props":351912,"children":351913},{},[351914],{"type":23,"value":134730},{"type":23,"value":351916}," is a string that specifies:",{"type":17,"tag":80,"props":351918,"children":351919},{},[351920,351925],{"type":17,"tag":84,"props":351921,"children":351922},{},[351923],{"type":23,"value":351924},"The location of a resource (hence the name) on a network",{"type":17,"tag":84,"props":351926,"children":351927},{},[351928],{"type":23,"value":351929},"How you can obtain or perform an action on that resource",{"type":17,"tag":29,"props":351931,"children":351932},{},[351933,351935],{"type":23,"value":351934},"Most users understand URLs and the location of a web page and often refer to them as 'web addresses.' While not technically correct, it's close enough for everyday conversation. It doesn't help that the text field for entering URLs into a browser and displaying the current page's URL is called the ",{"type":17,"tag":133,"props":351936,"children":351939},{"href":351937,"rel":351938},"https://en.wikipedia.org/wiki/Address_bar",[214],[351940],{"type":23,"value":351941},"'address bar.'",{"type":17,"tag":29,"props":351943,"children":351944},{},[351945],{"type":23,"value":351946},"In the context of APIs, URLs uniquely identify resources managed by the API, where the term 'resource' could be anything the API provides access to, which is usually data or a method or function to perform an action on that data.",{"type":17,"tag":68,"props":351948,"children":351950},{"id":351949},"structure-of-a-url",[351951],{"type":23,"value":351952},"Structure of a URL",{"type":17,"tag":29,"props":351954,"children":351955},{},[351956],{"type":23,"value":351957},"URLs have this general structure:",{"type":17,"tag":6154,"props":351959,"children":351960},{},[351961,351972,351982,352008,352040,352052,352070],{"type":17,"tag":84,"props":351962,"children":351963},{},[351964,351965,351970],{"type":23,"value":6712},{"type":17,"tag":48,"props":351966,"children":351967},{},[351968],{"type":23,"value":351969},"scheme",{"type":23,"value":351971}," tells the server which protocol to use when serving the resource. Most APIs will use https (hypertext transfer protocol secure) as the scheme, which encrypts communication between the API and the client application calling it.",{"type":17,"tag":84,"props":351973,"children":351974},{},[351975,351980],{"type":17,"tag":48,"props":351976,"children":351977},{},[351978],{"type":23,"value":351979},"Subdomains",{"type":23,"value":351981}," are optional extensions to a domain name used to organize a website into different sections or determine which resources should be served. The www subdomain used to be mandatory, and it specifies that the resources served under that subdomain are served using the HTTP protocol.",{"type":17,"tag":84,"props":351983,"children":351984},{},[351985,351987,351992,351994,352000,352001,352006],{"type":23,"value":351986},"People generally consider the ",{"type":17,"tag":48,"props":351988,"children":351989},{},[351990],{"type":23,"value":351991},"second-level domain",{"type":23,"value":351993}," to be the first part of the website's domain name. It's usually the name of the organization, product, or person represented by the website. In the URL ",{"type":17,"tag":6121,"props":351995,"children":351997},{"className":351996},[],[351998],{"type":23,"value":351999},"example.com",{"type":23,"value":11826},{"type":17,"tag":6121,"props":352002,"children":352004},{"className":352003},[],[352005],{"type":23,"value":21023},{"type":23,"value":352007}," is the second-level domain.",{"type":17,"tag":84,"props":352009,"children":352010},{},[352011,352012,352017,352019,352024,352026,352031,352032,352038],{"type":23,"value":351986},{"type":17,"tag":48,"props":352013,"children":352014},{},[352015],{"type":23,"value":352016},"top-level domain",{"type":23,"value":352018}," (often shortened to ",{"type":17,"tag":48,"props":352020,"children":352021},{},[352022],{"type":23,"value":352023},"TLD",{"type":23,"value":352025},") to be the second part of the website's domain name. Top-level domains are a key part of the internet's domain name system hierarchy. In the URL ",{"type":17,"tag":6121,"props":352027,"children":352029},{"className":352028},[],[352030],{"type":23,"value":351999},{"type":23,"value":11826},{"type":17,"tag":6121,"props":352033,"children":352035},{"className":352034},[],[352036],{"type":23,"value":352037},".com",{"type":23,"value":352039}," is the top-level domain.",{"type":17,"tag":84,"props":352041,"children":352042},{},[352043,352045,352050],{"type":23,"value":352044},"Every domain name is eventually translated into an IP address, and every IP address has 65,536 ",{"type":17,"tag":48,"props":352046,"children":352047},{},[352048],{"type":23,"value":352049},"ports",{"type":23,"value":352051},", which are communications channels assigned for specific services, such as HTTPS communications (port 443, over which most API communications will take place) and HTTP communications (port 80). If you're using the default port for a service, you don't have to specify the port number in a URL.",{"type":17,"tag":84,"props":352053,"children":352054},{},[352055,352056,352061,352063,352068],{"type":23,"value":6712},{"type":17,"tag":48,"props":352057,"children":352058},{},[352059],{"type":23,"value":352060},"path",{"type":23,"value":352062}," is the location of the resource on the server, expressed in the same way as a filepath on your own computer, with forward-slashes (the ",{"type":17,"tag":6121,"props":352064,"children":352066},{"className":352065},[],[352067],{"type":23,"value":261794},{"type":23,"value":352069}," character) specifying subdirectories.",{"type":17,"tag":84,"props":352071,"children":352072},{},[352073,352074,352078,352080,352085,352087,352093,352095,352101,352103,352109,352111,352117,352118,352124],{"type":23,"value":6712},{"type":17,"tag":48,"props":352075,"children":352076},{},[352077],{"type":23,"value":48368},{"type":23,"value":352079}," is the portion of a URL for optional parameters. Placed after the end of the filepath portion of the URL and delineated by the ",{"type":17,"tag":6121,"props":352081,"children":352083},{"className":352082},[],[352084],{"type":23,"value":228656},{"type":23,"value":352086}," character, it's a collection of key-value pairs separated by & characters. In the URL in the diagram above, the query is ",{"type":17,"tag":6121,"props":352088,"children":352090},{"className":352089},[],[352091],{"type":23,"value":352092},"parm1=val1&parm2=val2",{"type":23,"value":352094},", which specifies that the first parameter is ",{"type":17,"tag":6121,"props":352096,"children":352098},{"className":352097},[],[352099],{"type":23,"value":352100},"parm1",{"type":23,"value":352102}," and its value is ",{"type":17,"tag":6121,"props":352104,"children":352106},{"className":352105},[],[352107],{"type":23,"value":352108},"val1",{"type":23,"value":352110}," and that the second parameter is ",{"type":17,"tag":6121,"props":352112,"children":352114},{"className":352113},[],[352115],{"type":23,"value":352116},"parm2",{"type":23,"value":352102},{"type":17,"tag":6121,"props":352119,"children":352121},{"className":352120},[],[352122],{"type":23,"value":352123},"val2",{"type":23,"value":54},{"type":17,"tag":68,"props":352126,"children":352128},{"id":352127},"endpoints-and-url-types-in-apis",[352129],{"type":23,"value":352130},"Endpoints and URL types in APIs",{"type":17,"tag":29,"props":352132,"children":352133},{},[352134,352136,352143],{"type":23,"value":352135},"Each resource in an API has an ",{"type":17,"tag":33,"props":352137,"children":352138},{},[352139],{"type":17,"tag":48,"props":352140,"children":352141},{},[352142],{"type":23,"value":132141},{"type":23,"value":352144},": a specific corresponding URL that client applications — applications that use the API — can use to access it.",{"type":17,"tag":29,"props":352146,"children":352147},{},[352148],{"type":23,"value":352149},"There is no formal standard for URLs used for API endpoints, but most API providers agree on a few informal ones, which are listed below:",{"type":17,"tag":6154,"props":352151,"children":352152},{},[352153,352163,352188],{"type":17,"tag":84,"props":352154,"children":352155},{},[352156,352161],{"type":17,"tag":48,"props":352157,"children":352158},{},[352159],{"type":23,"value":352160},"Static base URLs:",{"type":23,"value":352162}," A static base URL is a fixed URL that serves as the root address for accessing the API. It does not change across different customers or users of the API.",{"type":17,"tag":84,"props":352164,"children":352165},{},[352166,352171,352173,352179,352181,352187],{"type":17,"tag":48,"props":352167,"children":352168},{},[352169],{"type":23,"value":352170},"Custom domain/subdomain-based URLs:",{"type":23,"value":352172}," Custom domain or subdomain-based URLs allow the base URL of the API to be customized for individual customers or users, often using their domain name. For example, if a company whose domain is ",{"type":17,"tag":133,"props":352174,"children":352177},{"href":352175,"rel":352176},"http://example.com/",[214],[352178],{"type":23,"value":351999},{"type":23,"value":352180}," provided a custom subdomain for a company called 'HypothetiCorp,' they might provide this custom subdomain-based name for their use: ",{"type":17,"tag":6121,"props":352182,"children":352184},{"className":352183},[],[352185],{"type":23,"value":352186},"hypotheticorp.example.com",{"type":23,"value":54},{"type":17,"tag":84,"props":352189,"children":352190},{},[352191,352196,352198,352204,352206,352212],{"type":17,"tag":48,"props":352192,"children":352193},{},[352194],{"type":23,"value":352195},"Versioned URLs:",{"type":23,"value":352197}," As a service evolves, so will the functionality and data it provides. This often leads to changes to the API, which will need to provide different URLs for new or updated functionality. One way APIs do this is by creating new URLs that use version numbers as part of the path. For example, a function that returned a list of customers at this endpoint — ",{"type":17,"tag":6121,"props":352199,"children":352201},{"className":352200},[],[352202],{"type":23,"value":352203},"https://example.com/customers",{"type":23,"value":352205}," — might need to be revised. To preserve backward compatibility, the API provider might put the revised version at this URL: ",{"type":17,"tag":6121,"props":352207,"children":352209},{"className":352208},[],[352210],{"type":23,"value":352211},"https://example.com/v2/customers",{"type":23,"value":352213},". This approach keeps both versions available to clients and place the revised function in a URL that clearly marks it as version 2.",{"type":17,"tag":68,"props":352215,"children":352217},{"id":352216},"url-usage",[352218],{"type":23,"value":352219},"URL Usage",{"type":17,"tag":29,"props":352221,"children":352222},{},[352223],{"type":17,"tag":6438,"props":352224,"children":352226},{"alt":318119,"src":352225},"https://s3.us-east-2.amazonaws.com/unified-article-images/2024_state_of_saas_apis_urls-0.png",[],{"type":17,"tag":29,"props":352228,"children":352229},{},[352230,352235],{"type":17,"tag":48,"props":352231,"children":352232},{},[352233],{"type":23,"value":352234},"Static base URL at 93% is the most popular and widely used API URL.",{"type":23,"value":352236}," This indicates most APIs utilize a consistent and unchanging base URL for accessing their resources. Those URLs that are customer or tenant specific potentially offer more security, but are harder to implement as an application needs to ask the end-user to retrieve it.",{"type":17,"tag":29,"props":352238,"children":352239},{},[352240],{"type":17,"tag":6438,"props":352241,"children":352243},{"alt":318119,"src":352242},"https://s3.us-east-2.amazonaws.com/unified-article-images/2024_state_of_saas_apis_urls-1.png",[],{"type":17,"tag":29,"props":352245,"children":352246},{},[352247,352252],{"type":17,"tag":48,"props":352248,"children":352249},{},[352250],{"type":23,"value":352251},"72% of APIs have versioned URLs.",{"type":23,"value":352253}," Versioning in a URL is key to advanced API design, ensuring backward compatibility, clear communication, and secure, targeted updates without disrupting current users. It facilitates parallel development and planned upgrades, allowing for a clear deprecation path and client-controlled adaptation.",{"type":17,"tag":29,"props":352255,"children":352256},{},[352257,352259,352267],{"type":23,"value":352258},"To learn more about API design or the stats referenced in this article, download the ",{"type":17,"tag":133,"props":352260,"children":352262},{"href":327182,"rel":352261},[214],[352263],{"type":17,"tag":33,"props":352264,"children":352265},{},[352266],{"type":23,"value":351254},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":352269},[352270,352271,352272,352273],{"id":351861,"depth":1629,"text":351864},{"id":351949,"depth":1629,"text":351952},{"id":352127,"depth":1629,"text":352130},{"id":352216,"depth":1629,"text":352219},"content:blog:2024_state_of_saas_apis_urls.md","blog/2024_state_of_saas_apis_urls.md","blog/2024_state_of_saas_apis_urls",{"_path":352278,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":352279,"description":352280,"img":352281,"date":352282,"tag":6341,"body":352283,"_type":1677,"_id":352991,"_source":1679,"_file":352992,"_stem":352993,"_extension":1682},"/blog/end_users_integrations_and_connections","End-Users, Integrations, and Connections","This guide explains how connections work at Unified.to and shows you different ways to create connections for your application. You'll learn about the...","https://s3.us-east-2.amazonaws.com/unified-article-images/end_users_integrations_and_connections-icon.png","2024-04-18T00:00:00.000Z",{"type":14,"children":352284,"toc":352969},[352285,352290,352293,352301,352313,352317,352322,352353,352361,352367,352372,352378,352423,352428,352437,352443,352448,352454,352472,352495,352500,352525,352531,352536,352541,352559,352564,352570,352575,352588,352600,352609,352615,352620,352626,352631,352668,352673,352679,352684,352721,352726,352735,352741,352746,352773,352785,352789,352868,352872,352877,352883,352901,352907,352925,352935,352939],{"type":17,"tag":18,"props":352286,"children":352288},{"id":352287},"end-users-integrations-and-connections",[352289],{"type":23,"value":352279},{"type":17,"tag":25,"props":352291,"children":352292},{},[],{"type":17,"tag":29,"props":352294,"children":352295},{},[352296],{"type":17,"tag":33,"props":352297,"children":352298},{},[352299],{"type":23,"value":352300},"April 18, 2024",{"type":17,"tag":29,"props":352302,"children":352303},{},[352304,352306,352311],{"type":23,"value":352305},"This guide explains how connections work at ",{"type":17,"tag":133,"props":352307,"children":352309},{"href":42620,"rel":352308},[214],[352310],{"type":23,"value":217},{"type":23,"value":352312}," and shows you different ways to create connections for your application. You'll learn about the relationship between your end-users, connections, and integrations, as well as how to get started quickly with test connections.",{"type":17,"tag":68,"props":352314,"children":352315},{"id":42649},[352316],{"type":23,"value":42652},{"type":17,"tag":29,"props":352318,"children":352319},{},[352320],{"type":23,"value":352321},"At Unified.to, there are three key concepts to understand:",{"type":17,"tag":6154,"props":352323,"children":352324},{},[352325,352334,352343],{"type":17,"tag":84,"props":352326,"children":352327},{},[352328,352332],{"type":17,"tag":48,"props":352329,"children":352330},{},[352331],{"type":23,"value":42944},{"type":23,"value":352333}," - These are the bridges between your application and third-party platforms (a.k.a SaaS apps). These are pre-built for you!",{"type":17,"tag":84,"props":352335,"children":352336},{},[352337,352341],{"type":17,"tag":48,"props":352338,"children":352339},{},[352340],{"type":23,"value":329638},{"type":23,"value":352342}," - These are the authorized links between your end-users and specific integrations",{"type":17,"tag":84,"props":352344,"children":352345},{},[352346,352351],{"type":17,"tag":48,"props":352347,"children":352348},{},[352349],{"type":23,"value":352350},"End-users",{"type":23,"value":352352}," - These are your application's users whose data you will access from their accounts i.e. HubSpots, Salesforce, Shopify, and so on.",{"type":17,"tag":29,"props":352354,"children":352355},{},[352356],{"type":17,"tag":6438,"props":352357,"children":352360},{"alt":352358,"src":352359},"Users_connections_and_integrations_%2810%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/end_users_integrations_and_connections-0.png",[],{"type":17,"tag":68,"props":352362,"children":352364},{"id":352363},"understanding-integrations",[352365],{"type":23,"value":352366},"Understanding integrations",{"type":17,"tag":29,"props":352368,"children":352369},{},[352370],{"type":23,"value":352371},"Your application communicates with a SaaS application through an integration.",{"type":17,"tag":239,"props":352373,"children":352375},{"id":352374},"activating-an-integration-in-the-sandbox-environment",[352376],{"type":23,"value":352377},"Activating an integration in the sandbox environment",{"type":17,"tag":6154,"props":352379,"children":352380},{},[352381,352397,352402,352415],{"type":17,"tag":84,"props":352382,"children":352383},{},[352384,352385,352389,352391],{"type":23,"value":42939},{"type":17,"tag":48,"props":352386,"children":352387},{},[352388],{"type":23,"value":42944},{"type":23,"value":352390}," at ",{"type":17,"tag":133,"props":352392,"children":352394},{"href":329567,"rel":352393},[214],[352395],{"type":23,"value":352396},"app.unified.to/integrations",{"type":17,"tag":84,"props":352398,"children":352399},{},[352400],{"type":23,"value":352401},"Search for the integration you want to use",{"type":17,"tag":84,"props":352403,"children":352404},{},[352405,352407],{"type":23,"value":352406},"Click on the integration card to view its details\n",{"type":17,"tag":6154,"props":352408,"children":352409},{},[352410],{"type":17,"tag":84,"props":352411,"children":352412},{},[352413],{"type":23,"value":352414},"For sandbox environment integrations, you don't need to enter any real credentials here.",{"type":17,"tag":84,"props":352416,"children":352417},{},[352418,352419],{"type":23,"value":6629},{"type":17,"tag":48,"props":352420,"children":352421},{},[352422],{"type":23,"value":6634},{"type":17,"tag":29,"props":352424,"children":352425},{},[352426],{"type":23,"value":352427},"All data is synthetic in the sandbox environment, meaning you don't need to sign up for any third-party accounts while you're testing the Unified.to platform.",{"type":17,"tag":29,"props":352429,"children":352430},{},[352431],{"type":17,"tag":133,"props":352432,"children":352434},{"href":329490,"rel":352433},[214],[352435],{"type":23,"value":352436},"Learn more about the sandbox environment →",{"type":17,"tag":239,"props":352438,"children":352440},{"id":352439},"activating-an-integration-in-production-environments",[352441],{"type":23,"value":352442},"Activating an integration in production environments",{"type":17,"tag":29,"props":352444,"children":352445},{},[352446],{"type":23,"value":352447},"To activate an integration in production environments, you'll need developer credentials from the platform you're integrating with.",{"type":17,"tag":239,"props":352449,"children":352451},{"id":352450},"developer-credentials",[352452],{"type":23,"value":352453},"Developer credentials",{"type":17,"tag":29,"props":352455,"children":352456},{},[352457,352459,352463,352465,352470],{"type":23,"value":352458},"When activating an integration, you'll be asked to provide credentials like API keys or ",{"type":17,"tag":133,"props":352460,"children":352461},{"href":779},[352462],{"type":23,"value":782},{"type":23,"value":352464}," 2.0 client IDs and secrets. These credentials should come from ",{"type":17,"tag":48,"props":352466,"children":352467},{},[352468],{"type":23,"value":352469},"your developer account",{"type":23,"value":352471}," with the platform, not your end-users' accounts. Here's how it works:",{"type":17,"tag":6154,"props":352473,"children":352474},{},[352475,352480,352485,352490],{"type":17,"tag":84,"props":352476,"children":352477},{},[352478],{"type":23,"value":352479},"You register your application with the platform (e.g., create a HubSpot developer account and register your app)",{"type":17,"tag":84,"props":352481,"children":352482},{},[352483],{"type":23,"value":352484},"You receive developer credentials that identify your application",{"type":17,"tag":84,"props":352486,"children":352487},{},[352488],{"type":23,"value":352489},"You enter these credentials when activating the integration on Unified.to",{"type":17,"tag":84,"props":352491,"children":352492},{},[352493],{"type":23,"value":352494},"Your end-users will later authorize your application to access their accounts, with or without using their own credentials (depends on the type of auth flow)",{"type":17,"tag":29,"props":352496,"children":352497},{},[352498],{"type":23,"value":352499},"For example, if you're building an interview scheduling platform that needs to access your clients' Zoho CRM data:",{"type":17,"tag":80,"props":352501,"children":352502},{},[352503,352514],{"type":17,"tag":84,"props":352504,"children":352505},{},[352506,352508,352512],{"type":23,"value":352507},"You use ",{"type":17,"tag":48,"props":352509,"children":352510},{},[352511],{"type":23,"value":199669},{"type":23,"value":352513}," Zoho developer account credentials to activate the integration",{"type":17,"tag":84,"props":352515,"children":352516},{},[352517,352518,352523],{"type":23,"value":199693},{"type":17,"tag":48,"props":352519,"children":352520},{},[352521],{"type":23,"value":352522},"end-users",{"type":23,"value":352524}," will authorize access to their Zoho CRM accounts when creating connections by consenting to give you access to their data",{"type":17,"tag":68,"props":352526,"children":352528},{"id":352527},"understanding-connections",[352529],{"type":23,"value":352530},"Understanding connections",{"type":17,"tag":29,"props":352532,"children":352533},{},[352534],{"type":23,"value":352535},"Your end-users are connected to integrations through connections_._",{"type":17,"tag":29,"props":352537,"children":352538},{},[352539],{"type":23,"value":352540},"A connection is an authorized link between one of your end-users and a specific integration. For example, if your application needs to access a user's HubSpot account, you'll need:",{"type":17,"tag":6154,"props":352542,"children":352543},{},[352544,352549,352554],{"type":17,"tag":84,"props":352545,"children":352546},{},[352547],{"type":23,"value":352548},"The HubSpot integration to be activated in your workspace",{"type":17,"tag":84,"props":352550,"children":352551},{},[352552],{"type":23,"value":352553},"A connection between that specific user and HubSpot",{"type":17,"tag":84,"props":352555,"children":352556},{},[352557],{"type":23,"value":352558},"The correct scope configuration for what data you need to access",{"type":17,"tag":29,"props":352560,"children":352561},{},[352562],{"type":23,"value":352563},"Each user needs their own connection to each integration you want to use. This ensures proper authorization and data isolation between users.",{"type":17,"tag":239,"props":352565,"children":352567},{"id":352566},"about-scopes",[352568],{"type":23,"value":352569},"About scopes",{"type":17,"tag":29,"props":352571,"children":352572},{},[352573],{"type":23,"value":352574},"Scopes determine what data your application can access in your end-users' accounts. You need to:",{"type":17,"tag":6154,"props":352576,"children":352577},{},[352578,352583],{"type":17,"tag":84,"props":352579,"children":352580},{},[352581],{"type":23,"value":352582},"Configure the correct scopes in your developer account with the platform",{"type":17,"tag":84,"props":352584,"children":352585},{},[352586],{"type":23,"value":352587},"Select the corresponding Unified.to scopes when setting up your integration",{"type":17,"tag":29,"props":352589,"children":352590},{},[352591,352593,352598],{"type":23,"value":352592},"For example, if you need to read CRM contacts, you would request the ",{"type":17,"tag":6121,"props":352594,"children":352596},{"className":352595},[],[352597],{"type":23,"value":312495},{"type":23,"value":352599}," scope. Unified.to has its own set of scopes (called Unified scopes) which have been mapped to the corresponding scopes for every single integration that needs them. When requesting scopes, you only need to pass in Unified scopes in addition to enabling those scopes in your developer account.",{"type":17,"tag":29,"props":352601,"children":352602},{},[352603],{"type":17,"tag":133,"props":352604,"children":352606},{"href":337112,"rel":352605},[214],[352607],{"type":23,"value":352608},"Learn more about configuring scopes →",{"type":17,"tag":68,"props":352610,"children":352612},{"id":352611},"how-to-create-connections",[352613],{"type":23,"value":352614},"How to create connections",{"type":17,"tag":29,"props":352616,"children":352617},{},[352618],{"type":23,"value":352619},"There are three main ways to create connections in Unified.to, each suited for different scenarios:",{"type":17,"tag":239,"props":352621,"children":352623},{"id":352622},"_1-development-and-testing-create-test-connections-in-the-sandbox-environment",[352624],{"type":23,"value":352625},"1. Development and testing: Create test connections in the sandbox environment",{"type":17,"tag":29,"props":352627,"children":352628},{},[352629],{"type":23,"value":352630},"This is the fastest way to get started and test integrations:",{"type":17,"tag":6154,"props":352632,"children":352633},{},[352634,352646,352655,352663],{"type":17,"tag":84,"props":352635,"children":352636},{},[352637,352639,352644],{"type":23,"value":352638},"Switch to the ",{"type":17,"tag":48,"props":352640,"children":352641},{},[352642],{"type":23,"value":352643},"Sandbox",{"type":23,"value":352645}," environment in the Unified.to app",{"type":17,"tag":84,"props":352647,"children":352648},{},[352649,352650,352654],{"type":23,"value":146849},{"type":17,"tag":48,"props":352651,"children":352652},{},[352653],{"type":23,"value":329638},{"type":23,"value":329640},{"type":17,"tag":84,"props":352656,"children":352657},{},[352658,352659],{"type":23,"value":6629},{"type":17,"tag":48,"props":352660,"children":352661},{},[352662],{"type":23,"value":329649},{"type":17,"tag":84,"props":352664,"children":352665},{},[352666],{"type":23,"value":352667},"Select any activated integration you want to test",{"type":17,"tag":29,"props":352669,"children":352670},{},[352671],{"type":23,"value":352672},"Test connections are created instantly with mock credentials, perfect for development and testing.",{"type":17,"tag":239,"props":352674,"children":352676},{"id":352675},"_2-production-ready-use-the-authorization-embedded-component",[352677],{"type":23,"value":352678},"2. Production ready: Use the Authorization embedded component",{"type":17,"tag":29,"props":352680,"children":352681},{},[352682],{"type":23,"value":352683},"This is the recommended approach for production-ready applications:",{"type":17,"tag":6154,"props":352685,"children":352686},{},[352687,352701,352706,352711,352716],{"type":17,"tag":84,"props":352688,"children":352689},{},[352690,352691,352700],{"type":23,"value":42715},{"type":17,"tag":133,"props":352692,"children":352695},{"href":352693,"rel":352694},"https://app.unified.to/embed",[214],[352696],{"type":17,"tag":48,"props":352697,"children":352698},{},[352699],{"type":23,"value":346996},{"type":23,"value":329640},{"type":17,"tag":84,"props":352702,"children":352703},{},[352704],{"type":23,"value":352705},"Configure your callback settings, permission scopes, and display options",{"type":17,"tag":84,"props":352707,"children":352708},{},[352709],{"type":23,"value":352710},"Copy the provided code snippet for your preferred tool (React, Angular, Vue, vanilla JavaScript, or an API call)",{"type":17,"tag":84,"props":352712,"children":352713},{},[352714],{"type":23,"value":352715},"Add the code to your application",{"type":17,"tag":84,"props":352717,"children":352718},{},[352719],{"type":23,"value":352720},"The Authorization component will be rendered on your app. When users click an integration's logo, they'll be guided through the authorization process",{"type":17,"tag":29,"props":352722,"children":352723},{},[352724],{"type":23,"value":352725},"Example code for React:",{"type":17,"tag":6893,"props":352727,"children":352730},{"className":352728,"code":352729,"language":6898,"meta":7},[6896],"import UnifiedDirectory from '@unified-api/react-directory';\n\nfunction App() {\n  return (\n    \u003CUnifiedDirectory\n      workspaceId=\"{WORKSPACE_ID}\"\n      environmentId=\"{ENVIRONMENT}\"\n      success_redirect=\"{SUCCESS_URL}\"\n    />\n  );\n}\n",[352731],{"type":17,"tag":6121,"props":352732,"children":352733},{"__ignoreMap":7},[352734],{"type":23,"value":352729},{"type":17,"tag":239,"props":352736,"children":352738},{"id":352737},"_3-custom-implementation-build-your-own-authorization-flow",[352739],{"type":23,"value":352740},"3. Custom implementation: Build your own authorization flow",{"type":17,"tag":29,"props":352742,"children":352743},{},[352744],{"type":23,"value":352745},"For greater control over the user experience:",{"type":17,"tag":6154,"props":352747,"children":352748},{},[352749,352758,352763,352768],{"type":17,"tag":84,"props":352750,"children":352751},{},[352752,352754],{"type":23,"value":352753},"Fetch available integrations using the ",{"type":17,"tag":133,"props":352755,"children":352756},{"href":7691},[352757],{"type":23,"value":7806},{"type":17,"tag":84,"props":352759,"children":352760},{},[352761],{"type":23,"value":352762},"Create authorization URLs for selected integrations",{"type":17,"tag":84,"props":352764,"children":352765},{},[352766],{"type":23,"value":352767},"Handle authorization callbacks",{"type":17,"tag":84,"props":352769,"children":352770},{},[352771],{"type":23,"value":352772},"Manage connection IDs",{"type":17,"tag":29,"props":352774,"children":352775},{},[352776,352778,352784],{"type":23,"value":352777},"This approach requires slightly more implementation work but offers more flexibility. You can find a ",{"type":17,"tag":133,"props":352779,"children":352781},{"href":337071,"rel":352780},[214],[352782],{"type":23,"value":352783},"complete tutorial for this approach in our documentation",{"type":23,"value":54},{"type":17,"tag":68,"props":352786,"children":352787},{"id":183199},[352788],{"type":23,"value":334134},{"type":17,"tag":80,"props":352790,"children":352791},{},[352792,352802,352812,352830,352848,352858],{"type":17,"tag":84,"props":352793,"children":352794},{},[352795,352800],{"type":17,"tag":48,"props":352796,"children":352797},{},[352798],{"type":23,"value":352799},"Always test in Sandbox first",{"type":23,"value":352801},": Use test connections to validate your integration logic",{"type":17,"tag":84,"props":352803,"children":352804},{},[352805,352810],{"type":17,"tag":48,"props":352806,"children":352807},{},[352808],{"type":23,"value":352809},"Store connection IDs securely",{"type":23,"value":352811},": Never store connection IDs in client-side storage in production",{"type":17,"tag":84,"props":352813,"children":352814},{},[352815,352820,352822,352829],{"type":17,"tag":48,"props":352816,"children":352817},{},[352818],{"type":23,"value":352819},"Handle authorization failures gracefully",{"type":23,"value":352821},": Provide clear feedback when connection attempts fail. Users will be redirected to the failure URL you specified during configuration. ",{"type":17,"tag":133,"props":352823,"children":352826},{"href":352824,"rel":352825},"https://docs.unified.to/guides/how_to_troubleshoot_unhealthy_connections#handle-errors-during-connection-creation",[214],[352827],{"type":23,"value":352828},"Learn more about handling failure callbacks here",{"type":23,"value":54},{"type":17,"tag":84,"props":352831,"children":352832},{},[352833,352838,352840,352846],{"type":17,"tag":48,"props":352834,"children":352835},{},[352836],{"type":23,"value":352837},"Monitor connection health",{"type":23,"value":352839},": Set up ",{"type":17,"tag":133,"props":352841,"children":352843},{"href":339114,"rel":352842},[214],[352844],{"type":23,"value":352845},"webhook notifications",{"type":23,"value":352847}," for connection status changes",{"type":17,"tag":84,"props":352849,"children":352850},{},[352851,352856],{"type":17,"tag":48,"props":352852,"children":352853},{},[352854],{"type":23,"value":352855},"Configure scopes correctly",{"type":23,"value":352857},": Request only the permissions your application needs",{"type":17,"tag":84,"props":352859,"children":352860},{},[352861,352866],{"type":17,"tag":48,"props":352862,"children":352863},{},[352864],{"type":23,"value":352865},"Use separate environments",{"type":23,"value":352867},": Keep your development and production environments separate",{"type":17,"tag":68,"props":352869,"children":352870},{"id":6769},[352871],{"type":23,"value":6772},{"type":17,"tag":29,"props":352873,"children":352874},{},[352875],{"type":23,"value":352876},"Common issues and solutions:",{"type":17,"tag":239,"props":352878,"children":352880},{"id":352879},"connection-creation-fails",[352881],{"type":23,"value":352882},"Connection creation fails",{"type":17,"tag":80,"props":352884,"children":352885},{},[352886,352891,352896],{"type":17,"tag":84,"props":352887,"children":352888},{},[352889],{"type":23,"value":352890},"Verify your developer credentials are correct",{"type":17,"tag":84,"props":352892,"children":352893},{},[352894],{"type":23,"value":352895},"Check that required scopes are configured both in your platform developer account and Unified.to",{"type":17,"tag":84,"props":352897,"children":352898},{},[352899],{"type":23,"value":352900},"Ensure redirect URLs are properly set up in your platform developer settings",{"type":17,"tag":239,"props":352902,"children":352904},{"id":352903},"authorization-flow-issues",[352905],{"type":23,"value":352906},"Authorization flow issues",{"type":17,"tag":80,"props":352908,"children":352909},{},[352910,352915,352920],{"type":17,"tag":84,"props":352911,"children":352912},{},[352913],{"type":23,"value":352914},"Confirm your integration is activated",{"type":17,"tag":84,"props":352916,"children":352917},{},[352918],{"type":23,"value":352919},"Verify environment settings (Sandbox vs Production)",{"type":17,"tag":84,"props":352921,"children":352922},{},[352923],{"type":23,"value":352924},"Check that scopes match between your platform developer account and Unified.to",{"type":17,"tag":29,"props":352926,"children":352927},{},[352928,352930],{"type":23,"value":352929},"For more guidance, see: ",{"type":17,"tag":133,"props":352931,"children":352933},{"href":337038,"rel":352932},[214],[352934],{"type":23,"value":335556},{"type":17,"tag":68,"props":352936,"children":352937},{"id":44469},[352938],{"type":23,"value":339202},{"type":17,"tag":80,"props":352940,"children":352941},{},[352942,352947,352958],{"type":17,"tag":84,"props":352943,"children":352944},{},[352945],{"type":23,"value":352946},"Try creating your first test connection in the sandbox environment",{"type":17,"tag":84,"props":352948,"children":352949},{},[352950,352951,352957],{"type":23,"value":341495},{"type":17,"tag":133,"props":352952,"children":352954},{"href":329504,"rel":352953},[214],[352955],{"type":23,"value":352956},"Quickstart guide",{"type":23,"value":336781},{"type":17,"tag":84,"props":352959,"children":352960},{},[352961,352963],{"type":23,"value":352962},"Read our detailed guide on ",{"type":17,"tag":133,"props":352964,"children":352966},{"href":337112,"rel":352965},[214],[352967],{"type":23,"value":352968},"understanding and configuring scopes",{"title":7,"searchDepth":1629,"depth":1629,"links":352970},[352971,352972,352977,352980,352985,352986,352990],{"id":42649,"depth":1629,"text":42652},{"id":352363,"depth":1629,"text":352366,"children":352973},[352974,352975,352976],{"id":352374,"depth":1635,"text":352377},{"id":352439,"depth":1635,"text":352442},{"id":352450,"depth":1635,"text":352453},{"id":352527,"depth":1629,"text":352530,"children":352978},[352979],{"id":352566,"depth":1635,"text":352569},{"id":352611,"depth":1629,"text":352614,"children":352981},[352982,352983,352984],{"id":352622,"depth":1635,"text":352625},{"id":352675,"depth":1635,"text":352678},{"id":352737,"depth":1635,"text":352740},{"id":183199,"depth":1629,"text":334134},{"id":6769,"depth":1629,"text":6772,"children":352987},[352988,352989],{"id":352879,"depth":1635,"text":352882},{"id":352903,"depth":1635,"text":352906},{"id":44469,"depth":1629,"text":339202},"content:blog:end_users_integrations_and_connections.md","blog/end_users_integrations_and_connections.md","blog/end_users_integrations_and_connections",{"_path":352995,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":352996,"description":352997,"img":352998,"date":352999,"tag":12,"body":353000,"_type":1677,"_id":353363,"_source":1679,"_file":353364,"_stem":353365,"_extension":1682},"/blog/2024_state_of_saas_apis_api_specifications_and_documentation","2024 State of SaaS APIs: API Specifications and Documentation","In modern software development, APIs are the connective tissue of the Internet. This is why API design is critical in bridging diverse systems and increasing...","https://s3.us-east-2.amazonaws.com/unified-article-images/2024_state_of_saas_apis_api_specifications_and_documentation-icon.png","2024-04-17T00:00:00.000Z",{"type":14,"children":353001,"toc":353356},[353002,353007,353010,353018,353023,353034,353040,353045,353050,353073,353079,353084,353089,353097,353110,353115,353126,353131,353139,353160,353168,353188,353196,353216,353222,353236,353244,353264,353270,353275,353280,353288,353293,353301,353306,353311,353315,353320,353325,353343],{"type":17,"tag":18,"props":353003,"children":353005},{"id":353004},"_2024-state-of-saas-apis-api-specifications-and-documentation",[353006],{"type":23,"value":352996},{"type":17,"tag":25,"props":353008,"children":353009},{},[],{"type":17,"tag":29,"props":353011,"children":353012},{},[353013],{"type":17,"tag":33,"props":353014,"children":353015},{},[353016],{"type":23,"value":353017},"April 17, 2024",{"type":17,"tag":29,"props":353019,"children":353020},{},[353021],{"type":23,"value":353022},"In modern software development, APIs are the connective tissue of the Internet. This is why API design is critical in bridging diverse systems and increasing interoperability between products.",{"type":17,"tag":29,"props":353024,"children":353025},{},[353026,353028,353033],{"type":23,"value":353027},"In this article, we'll explore the role of API specifications and documentation within API design and draw on insights from the 2024 State of SaaS APIs  ",{"type":17,"tag":133,"props":353029,"children":353031},{"href":327182,"rel":353030},[214],[353032],{"type":23,"value":190476},{"type":23,"value":54},{"type":17,"tag":68,"props":353035,"children":353037},{"id":353036},"what-is-api-design",[353038],{"type":23,"value":353039},"What is API design?",{"type":17,"tag":29,"props":353041,"children":353042},{},[353043],{"type":23,"value":353044},"API design is the process of planning and structuring an Application Programming Interface, which defines how a software application allows other software applications to access its functionality and data. When done properly, API design results in an interface that is easy to use, efficient, secure, and scalable.",{"type":17,"tag":29,"props":353046,"children":353047},{},[353048],{"type":23,"value":353049},"Good API design not only benefits software developers but end-users as well. API specifications and documentation are tenets of effective API design, which involve:",{"type":17,"tag":80,"props":353051,"children":353052},{},[353053,353063],{"type":17,"tag":84,"props":353054,"children":353055},{},[353056,353061],{"type":17,"tag":48,"props":353057,"children":353058},{},[353059],{"type":23,"value":353060},"Specifying methods and endpoints:",{"type":23,"value":353062}," Designating the specific actions the API can perform (methods), and the location within the API where it accepts requests and returns responses (endpoints).",{"type":17,"tag":84,"props":353064,"children":353065},{},[353066,353071],{"type":17,"tag":48,"props":353067,"children":353068},{},[353069],{"type":23,"value":353070},"Writing documentation:",{"type":23,"value":353072}," Creating clear and detailed explanations of how to use the API, including examples of requests and responses, error codes, and operational details, which is crucial for developers to integrate and use the API effectively.",{"type":17,"tag":68,"props":353074,"children":353076},{"id":353075},"api-specifications",[353077],{"type":23,"value":353078},"API Specifications",{"type":17,"tag":29,"props":353080,"children":353081},{},[353082],{"type":23,"value":353083},"An API specification is the 'blueprint' for an API; it describes each element of the API and the purpose it serves. Its specifications outline the methods, endpoints, data formats, and protocols an API will use, which ensures developers have a clear roadmap for building or interacting with an API. It is a crucial foundation for clear and effective communication between different software components.",{"type":17,"tag":29,"props":353085,"children":353086},{},[353087],{"type":23,"value":353088},"The most common API specification formats are:",{"type":17,"tag":29,"props":353090,"children":353091},{},[353092],{"type":17,"tag":48,"props":353093,"children":353094},{},[353095],{"type":23,"value":353096},"1. OpenAPI and Swagger",{"type":17,"tag":29,"props":353098,"children":353099},{},[353100,353101,353108],{"type":23,"value":6712},{"type":17,"tag":133,"props":353102,"children":353105},{"href":353103,"rel":353104},"https://spec.openapis.org/oas/v3.1.0",[214],[353106],{"type":23,"value":353107},"OpenAPI Specification",{"type":23,"value":353109}," (OAS) is a widely adopted standard for describing RESTful APIs.",{"type":17,"tag":29,"props":353111,"children":353112},{},[353113],{"type":23,"value":353114},"It describes an API's endpoints, parameters, responses, and other details and can be written in JSON or YAML format. Version 3 of the OpenAPI Specification is currently in widespread use, and the forthcoming release of Version 4 promises further enhancements and features to accommodate evolving API practices and needs.",{"type":17,"tag":29,"props":353116,"children":353117},{},[353118,353124],{"type":17,"tag":133,"props":353119,"children":353121},{"href":1134,"rel":353120},[214],[353122],{"type":23,"value":353123},"Swagger",{"type":23,"value":353125}," is often mentioned along with OpenAPI. It is a collection of open source tools for building APIs based on the OpenAPI specification for designing, implementing, and documenting RESTful APIs.",{"type":17,"tag":29,"props":353127,"children":353128},{},[353129],{"type":23,"value":353130},"There is some confusion between OpenAPI and Swagger because many developers use both terms interchangeably. Swagger was the original name of the standard and applies to versions up to and including version 2. From version 3 onward, the standard was renamed to OpenAPI by the OpenAPI Initiative. Swagger now refers to the toolset for building APIs using OpenAPI.",{"type":17,"tag":29,"props":353132,"children":353133},{},[353134],{"type":17,"tag":48,"props":353135,"children":353136},{},[353137],{"type":23,"value":353138},"2. Postman Collections",{"type":17,"tag":29,"props":353140,"children":353141},{},[353142,353144,353149,353151,353158],{"type":23,"value":353143},"Designed for use with ",{"type":17,"tag":133,"props":353145,"children":353147},{"href":1124,"rel":353146},[214],[353148],{"type":23,"value":1128},{"type":23,"value":353150},", a developer tool for building and testing APIs, a ",{"type":17,"tag":133,"props":353152,"children":353155},{"href":353153,"rel":353154},"https://learning.postman.com/collection-format/getting-started/overview/#:~:text=A%20Collection%20is%20an%20API,executable%20workflows%20for%20your%20APIs.",[214],[353156],{"type":23,"value":353157},"Postman Collection",{"type":23,"value":353159}," is an API specification that allows developers to define APIs, share and execute API requests, create and model API workflows, and document and test APIs.",{"type":17,"tag":29,"props":353161,"children":353162},{},[353163],{"type":17,"tag":48,"props":353164,"children":353165},{},[353166],{"type":23,"value":353167},"3. RAML (RESTful API Modeling Language)",{"type":17,"tag":29,"props":353169,"children":353170},{},[353171,353178,353179,353186],{"type":17,"tag":133,"props":353172,"children":353175},{"href":353173,"rel":353174},"https://raml.org/",[214],[353176],{"type":23,"value":353177},"RAML",{"type":23,"value":88102},{"type":17,"tag":133,"props":353180,"children":353183},{"href":353181,"rel":353182},"https://yaml.org/",[214],[353184],{"type":23,"value":353185},"YAML",{"type":23,"value":353187},"-based API specification that focuses on top-down API modeling to describe APIs clearly and concisely. Its structure makes it useful for long-term API planning; however, it is an older specification and rarely used.",{"type":17,"tag":29,"props":353189,"children":353190},{},[353191],{"type":17,"tag":48,"props":353192,"children":353193},{},[353194],{"type":23,"value":353195},"4. API Blueprint",{"type":17,"tag":29,"props":353197,"children":353198},{},[353199,353206,353207,353214],{"type":17,"tag":133,"props":353200,"children":353203},{"href":353201,"rel":353202},"https://apiblueprint.org/",[214],[353204],{"type":23,"value":353205},"API Blueprint",{"type":23,"value":88102},{"type":17,"tag":133,"props":353208,"children":353211},{"href":353209,"rel":353210},"https://en.wikipedia.org/wiki/Markdown",[214],[353212],{"type":23,"value":353213},"Markdown",{"type":23,"value":353215},"-based high-level documentation authoring language for describing web APIs that is meant to be easily readable by both humans and machines.",{"type":17,"tag":68,"props":353217,"children":353219},{"id":353218},"what-specification-formats-do-most-saas-apis-use",[353220],{"type":23,"value":353221},"What specification formats do most SaaS APIs use?",{"type":17,"tag":29,"props":353223,"children":353224},{},[353225,353226,353234],{"type":23,"value":6712},{"type":17,"tag":133,"props":353227,"children":353229},{"href":327182,"rel":353228},[214],[353230],{"type":17,"tag":33,"props":353231,"children":353232},{},[353233],{"type":23,"value":351254},{"type":23,"value":353235},", a white paper that examined 145+ APIs across 12 industries, reports that OpenAPI and Swagger are the most supported API specification formats.",{"type":17,"tag":29,"props":353237,"children":353238},{},[353239],{"type":17,"tag":6438,"props":353240,"children":353243},{"alt":353241,"src":353242},"2024_State_of_SaaS_APIs_Report_-Unified.to-Excerpt%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/2024_state_of_saas_apis_api_specifications_and_documentation-0.png",[],{"type":17,"tag":29,"props":353245,"children":353246},{},[353247,353249,353253,353255,353262],{"type":23,"value":353248},"A well-defined API specification sets the stage for ",{"type":17,"tag":133,"props":353250,"children":353251},{"href":129820},[353252],{"type":23,"value":129823},{"type":23,"value":353254},", testing, and SDKs. Sadly, many developers see the necessary step of making API specifications as an unnecessary formality. At the opening keynote of the recent API Conference in London, when asked if they used an API specification, ",{"type":17,"tag":133,"props":353256,"children":353259},{"href":353257,"rel":353258},"https://thenewstack.io/is-platform-engineering-really-just-api-governance/#:~:text=Only%20about%20half%20the%20APICon%20audience%20raised%20their%20hands%20when%20asked%20if%20they%20use%20API%20specification%20formats%20like%20OpenAPI%2C%20AsyncAPI%20and%20AWS%20RAM.",[214],[353260],{"type":23,"value":353261},"only half the audience raised their hands",{"type":23,"value":353263},". This general lack of rigor explains why many APIs are poorly designed, with inconsistencies and redundancies, and are hard to work with.",{"type":17,"tag":68,"props":353265,"children":353267},{"id":353266},"api-documentation",[353268],{"type":23,"value":353269},"API Documentation",{"type":17,"tag":29,"props":353271,"children":353272},{},[353273],{"type":23,"value":353274},"API documentation is an indispensable resource for developers, providing essential guidance on how to use and integrate an API effectively. It describes what the API does, the services it offers, and how it can be used, including detailed examples of requests and responses, authentication methods, and error handling. Good documentation improves the developer experience and significantly reduces the learning curve and development time, enabling users to solve problems independently.",{"type":17,"tag":29,"props":353276,"children":353277},{},[353278],{"type":23,"value":353279},"There are two ways to create API documentation:",{"type":17,"tag":29,"props":353281,"children":353282},{},[353283],{"type":17,"tag":48,"props":353284,"children":353285},{},[353286],{"type":23,"value":353287},"1. Manually",{"type":17,"tag":29,"props":353289,"children":353290},{},[353291],{"type":23,"value":353292},"Initially, API documentation was often manually created. This involves writing detailed guides, example requests and responses, and instructions for integrating with the API. Although this approach allows for a high degree of customization, it can be time-consuming to maintain and update, and the process is tedious.",{"type":17,"tag":29,"props":353294,"children":353295},{},[353296],{"type":17,"tag":48,"props":353297,"children":353298},{},[353299],{"type":23,"value":353300},"2. Using automated tools",{"type":17,"tag":29,"props":353302,"children":353303},{},[353304],{"type":23,"value":353305},"Tools like Swagger, Apiary, and Postman can automatically generate documentation from the API's codebase or an API description file. The documentation generated by these tools is interactive, allowing developers to make API calls directly from the documentation to see real responses. Some large language models are proficient at generating documentation from codebases, and it should be expected that AI will soon be integrated into automated API documentation tools.",{"type":17,"tag":29,"props":353307,"children":353308},{},[353309],{"type":23,"value":353310},"While there is little data on the topic, it has been our experience that about half of the API documentation we have encountered is either outdated or inaccurately describes the current API, which only adds to the complexity of working with third-party APIs.",{"type":17,"tag":68,"props":353312,"children":353313},{"id":256460},[353314],{"type":23,"value":256463},{"type":17,"tag":29,"props":353316,"children":353317},{},[353318],{"type":23,"value":353319},"While API design industry standards exist, SaaS API design often lacks the necessary foresight and planning, resulting in inconsistency and inefficiency across different APIs. Poor API design not only hampers API scalability and usability but also poses significant challenges for developers who rely on them for robust applications that require third-party data to build automation and insights into their products.",{"type":17,"tag":29,"props":353321,"children":353322},{},[353323],{"type":23,"value":353324},"As we've explored, API specifications and documentation are critical in mitigating these issues by providing clear guidelines and comprehensive information supporting the development and integration processes. Investing time in thoughtful API design, rigorous specification, and detailed documentation can dramatically improve the quality and functionality of APIs.",{"type":17,"tag":29,"props":353326,"children":353327},{},[353328,353330,353334,353336,353341],{"type":23,"value":353329},"An increasing trend in the industry is to utilize ",{"type":17,"tag":133,"props":353331,"children":353332},{"href":7691},[353333],{"type":23,"value":7459},{"type":23,"value":353335}," platforms that standardize interactions across various applications. These platforms simplify the integration process and reduce the overhead associated with maintaining multiple APIs. They often provide additional layers of abstraction and tools that facilitate easier access, improved security, and better management of API ecosystems. This relieves developers from the intricacies of API inconsistencies, allowing them to focus more on core product functionality. ",{"type":17,"tag":133,"props":353337,"children":353339},{"href":42620,"rel":353338},[214],[353340],{"type":23,"value":217},{"type":23,"value":353342}," has built an award-winning real-time unified API platform with 160+ pre-built integrations spanning 12 API categories, including accounting, e-commerce, payment, and CRM, offering a promising future for API integration.",{"type":17,"tag":29,"props":353344,"children":353345},{},[353346,353347,353355],{"type":23,"value":352258},{"type":17,"tag":133,"props":353348,"children":353350},{"href":327182,"rel":353349},[214],[353351],{"type":17,"tag":33,"props":353352,"children":353353},{},[353354],{"type":23,"value":351254},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":353357},[353358,353359,353360,353361,353362],{"id":353036,"depth":1629,"text":353039},{"id":353075,"depth":1629,"text":353078},{"id":353218,"depth":1629,"text":353221},{"id":353266,"depth":1629,"text":353269},{"id":256460,"depth":1629,"text":256463},"content:blog:2024_state_of_saas_apis_api_specifications_and_documentation.md","blog/2024_state_of_saas_apis_api_specifications_and_documentation.md","blog/2024_state_of_saas_apis_api_specifications_and_documentation",{"_path":353367,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":353368,"description":353369,"img":353370,"date":353371,"tag":12,"body":353372,"_type":1677,"_id":353768,"_source":1679,"_file":353769,"_stem":353770,"_extension":1682},"/blog/unified_hr_api_access_payslip_and_time_off_data_across_hr_and_payroll_systems","Unified HR API: Access Payslip and Time Off Data Across HR and Payroll Systems","Payslip and Time Off objects have been released, and with it comes the release of a much-requested expansion of our unified HR API, payroll.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_hr_api_access_payslip_and_time_off_data_across_hr_and_payroll_systems-icon.png","2024-04-08T00:00:00.000Z",{"type":14,"children":353373,"toc":353763},[353374,353379,353382,353390,353406,353411,353416,353427,353432,353452,353457,353570,353582,353588,353596,353604,353609,353617,353622,353630,353635,353641,353649,353657,353662,353670,353675,353683,353688,353692,353697,353715,353723],{"type":17,"tag":18,"props":353375,"children":353377},{"id":353376},"unified-hr-api-access-payslip-and-time-off-data-across-hr-and-payroll-systems",[353378],{"type":23,"value":353368},{"type":17,"tag":25,"props":353380,"children":353381},{},[],{"type":17,"tag":29,"props":353383,"children":353384},{},[353385],{"type":17,"tag":33,"props":353386,"children":353387},{},[353388],{"type":23,"value":353389},"April 8, 2024",{"type":17,"tag":29,"props":353391,"children":353392},{},[353393,353398,353399,353404],{"type":17,"tag":133,"props":353394,"children":353396},{"href":343981,"rel":353395},[214],[353397],{"type":23,"value":198639},{"type":23,"value":34435},{"type":17,"tag":133,"props":353400,"children":353402},{"href":344006,"rel":353401},[214],[353403],{"type":23,"value":59865},{"type":23,"value":353405}," objects have been released, and with it comes the release of a much-requested expansion of our unified HR API: payroll.",{"type":17,"tag":29,"props":353407,"children":353408},{},[353409],{"type":23,"value":353410},"HR and payroll are interconnected functions in a company and share critical data on employees, such as hours worked, pay periods, and more. With our integrations, you'll make it easy for your users to handle HR and payroll activities in one place.",{"type":17,"tag":29,"props":353412,"children":353413},{},[353414],{"type":23,"value":353415},"In this post, we'll discuss a few ways you can use these new features in your application.",{"type":17,"tag":29,"props":353417,"children":353418},{},[353419,353421,353426],{"type":23,"value":353420},"So far, we have added 83 pre-built HR integrations. Check out the complete list of integrations ",{"type":17,"tag":133,"props":353422,"children":353424},{"href":58209,"rel":353423},[214],[353425],{"type":23,"value":243989},{"type":23,"value":54},{"type":17,"tag":29,"props":353428,"children":353429},{},[353430],{"type":23,"value":353431},"We've initially rolled out Payslip to the following integrations and will be adding to more soon:",{"type":17,"tag":80,"props":353433,"children":353434},{},[353435,353444],{"type":17,"tag":84,"props":353436,"children":353437},{},[353438],{"type":17,"tag":133,"props":353439,"children":353442},{"href":353440,"rel":353441},"https://unified.to/integrations/paylocity",[214],[353443],{"type":23,"value":59591},{"type":17,"tag":84,"props":353445,"children":353446},{},[353447],{"type":17,"tag":133,"props":353448,"children":353450},{"href":239801,"rel":353449},[214],[353451],{"type":23,"value":58983},{"type":17,"tag":29,"props":353453,"children":353454},{},[353455],{"type":23,"value":353456},"We've rolled out Time Off to the following integrations:",{"type":17,"tag":80,"props":353458,"children":353459},{},[353460,353469,353478,353487,353496,353506,353514,353523,353532,353542,353551,353560],{"type":17,"tag":84,"props":353461,"children":353462},{},[353463],{"type":17,"tag":133,"props":353464,"children":353467},{"href":353465,"rel":353466},"https://unified.to/integrations/xero",[214],[353468],{"type":23,"value":6678},{"type":17,"tag":84,"props":353470,"children":353471},{},[353472],{"type":17,"tag":133,"props":353473,"children":353476},{"href":353474,"rel":353475},"https://unified.to/integrations/workday",[214],[353477],{"type":23,"value":59319},{"type":17,"tag":84,"props":353479,"children":353480},{},[353481],{"type":17,"tag":133,"props":353482,"children":353485},{"href":353483,"rel":353484},"https://unified.to/integrations/rippling",[214],[353486],{"type":23,"value":59564},{"type":17,"tag":84,"props":353488,"children":353489},{},[353490],{"type":17,"tag":133,"props":353491,"children":353494},{"href":353492,"rel":353493},"https://unified.to/integrations/humi",[214],[353495],{"type":23,"value":216704},{"type":17,"tag":84,"props":353497,"children":353498},{},[353499],{"type":17,"tag":133,"props":353500,"children":353503},{"href":353501,"rel":353502},"https://unified.to/integrations/hibob",[214],[353504],{"type":23,"value":353505},"HiBob",{"type":17,"tag":84,"props":353507,"children":353508},{},[353509],{"type":17,"tag":133,"props":353510,"children":353512},{"href":351161,"rel":353511},[214],[353513],{"type":23,"value":351168},{"type":17,"tag":84,"props":353515,"children":353516},{},[353517],{"type":17,"tag":133,"props":353518,"children":353521},{"href":353519,"rel":353520},"https://unified.to/integrations/gusto",[214],[353522],{"type":23,"value":59609},{"type":17,"tag":84,"props":353524,"children":353525},{},[353526],{"type":17,"tag":133,"props":353527,"children":353530},{"href":353528,"rel":353529},"https://unified.to/integrations/factorialhr",[214],[353531],{"type":23,"value":57802},{"type":17,"tag":84,"props":353533,"children":353534},{},[353535],{"type":17,"tag":133,"props":353536,"children":353539},{"href":353537,"rel":353538},"https://unified.to/integrations/employmenthero",[214],[353540],{"type":23,"value":353541},"Employment Hero",{"type":17,"tag":84,"props":353543,"children":353544},{},[353545],{"type":17,"tag":133,"props":353546,"children":353549},{"href":353547,"rel":353548},"https://unified.to/integrations/bamboohr",[214],[353550],{"type":23,"value":3194},{"type":17,"tag":84,"props":353552,"children":353553},{},[353554],{"type":17,"tag":133,"props":353555,"children":353558},{"href":353556,"rel":353557},"https://unified.to/integrations/adp",[214],[353559],{"type":23,"value":240061},{"type":17,"tag":84,"props":353561,"children":353562},{},[353563],{"type":17,"tag":133,"props":353564,"children":353567},{"href":353565,"rel":353566},"https://unified.to/integrations/15five",[214],[353568],{"type":23,"value":353569},"15Five",{"type":17,"tag":29,"props":353571,"children":353572},{},[353573,353574,353580],{"type":23,"value":146849},{"type":17,"tag":133,"props":353575,"children":353577},{"href":47029,"rel":353576},[214],[353578],{"type":23,"value":353579},"changelog ",{"type":23,"value":353581},"for more detailed feature updates on our integrations.",{"type":17,"tag":68,"props":353583,"children":353585},{"id":353584},"payslip-use-cases",[353586],{"type":23,"value":353587},"Payslip use cases",{"type":17,"tag":29,"props":353589,"children":353590},{},[353591],{"type":17,"tag":6438,"props":353592,"children":353595},{"alt":353593,"src":353594},"Payslip_Model_-_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_hr_api_access_payslip_and_time_off_data_across_hr_and_payroll_systems-0.png",[],{"type":17,"tag":29,"props":353597,"children":353598},{},[353599],{"type":17,"tag":48,"props":353600,"children":353601},{},[353602],{"type":23,"value":353603},"Automated Payroll:",{"type":17,"tag":29,"props":353605,"children":353606},{},[353607],{"type":23,"value":353608},"Utilize the Payslip object to automate the generation and distribution of employee payslips. By integrating with HR systems, your application can fetch details like pay period, gross pay, deductions, and net pay, then automatically generate digital payslips. This reduces manual work, increases accuracy, and ensures timely delivery of payslips to employees.",{"type":17,"tag":29,"props":353610,"children":353611},{},[353612],{"type":17,"tag":48,"props":353613,"children":353614},{},[353615],{"type":23,"value":353616},"Financial Analysis:",{"type":17,"tag":29,"props":353618,"children":353619},{},[353620],{"type":23,"value":353621},"Leverage payslip data to provide comprehensive financial reports and analytics. Your customers can monitor labor costs, track payment trends, and analyze salary information across different departments or projects. This helps in budgeting, forecasting, and making informed decisions regarding human resources allocation and compensation strategies.",{"type":17,"tag":29,"props":353623,"children":353624},{},[353625],{"type":17,"tag":48,"props":353626,"children":353627},{},[353628],{"type":23,"value":353629},"Audit Trail:",{"type":17,"tag":29,"props":353631,"children":353632},{},[353633],{"type":23,"value":353634},"You can help businesses maintain compliance with labor laws and tax regulations by accessing detailed payslip data, including approval status and comments. This feature enables the creation of an audit trail for each payslip, detailing who approved the payment and any adjustments made. This trail facilitates easy retrieval during audits or inspections, thereby reducing the risk of penalties or fines for non-compliance.",{"type":17,"tag":68,"props":353636,"children":353638},{"id":353637},"time-off-use-cases",[353639],{"type":23,"value":353640},"Time Off use cases",{"type":17,"tag":29,"props":353642,"children":353643},{},[353644],{"type":17,"tag":6438,"props":353645,"children":353648},{"alt":353646,"src":353647},"Timeoff_Model_-_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_hr_api_access_payslip_and_time_off_data_across_hr_and_payroll_systems-1.png",[],{"type":17,"tag":29,"props":353650,"children":353651},{},[353652],{"type":17,"tag":48,"props":353653,"children":353654},{},[353655],{"type":23,"value":353656},"Automated Approval Workflows:",{"type":17,"tag":29,"props":353658,"children":353659},{},[353660],{"type":23,"value":353661},"When an employee submits a request for PTO, absences or vacation, automatically route it to the appropriate manager for approval, update the employee's remaining leave balance, and send notifications to all stakeholders. This automation reduces administrative overhead, expedites the approval process, and improves the overall efficiency of handling leave requests.",{"type":17,"tag":29,"props":353663,"children":353664},{},[353665],{"type":17,"tag":48,"props":353666,"children":353667},{},[353668],{"type":23,"value":353669},"Workforce Planning Tools:",{"type":17,"tag":29,"props":353671,"children":353672},{},[353673],{"type":23,"value":353674},"Integrate employee availability into project timelines and staffing plans. Enable your users to adjust project schedules, assign tasks based on available resources, and forecast potential delays based on time off requests.",{"type":17,"tag":29,"props":353676,"children":353677},{},[353678],{"type":17,"tag":48,"props":353679,"children":353680},{},[353681],{"type":23,"value":353682},"Analytics for Leave Management:",{"type":17,"tag":29,"props":353684,"children":353685},{},[353686],{"type":23,"value":353687},"Utilize the Time Off object to generate detailed reports and insights on leave patterns, such as the frequency of leave requests, peak times for vacation, and leave balances. These insights help your customers identify trends, plan for seasonal variations in staffing needs and make informed decisions about leave policies.",{"type":17,"tag":68,"props":353689,"children":353690},{"id":44585},[353691],{"type":23,"value":44588},{"type":17,"tag":29,"props":353693,"children":353694},{},[353695],{"type":23,"value":353696},"By adding Payslip and Time Off objects, we've deepened the workforce data you now have access to for more comprehensive HR functionality, enriched payroll processing, and enhanced customer compliance reporting in your application.",{"type":17,"tag":29,"props":353698,"children":353699},{},[353700,353702,353708,353709,353714],{"type":23,"value":353701},"Ship all your customers' HR integration requests in hours. ",{"type":17,"tag":133,"props":353703,"children":353705},{"href":1612,"rel":353704},[214],[353706],{"type":23,"value":353707},"Create a free Unified.to account",{"type":23,"value":75890},{"type":17,"tag":133,"props":353710,"children":353712},{"href":215330,"rel":353711},[214],[353713],{"type":23,"value":328427},{"type":23,"value":54},{"type":17,"tag":29,"props":353716,"children":353717},{},[353718],{"type":17,"tag":48,"props":353719,"children":353720},{},[353721],{"type":23,"value":353722},"Keep learning:",{"type":17,"tag":80,"props":353724,"children":353725},{},[353726,353735,353744,353753],{"type":17,"tag":84,"props":353727,"children":353728},{},[353729],{"type":17,"tag":133,"props":353730,"children":353732},{"href":343907,"rel":353731},[214],[353733],{"type":23,"value":353734},"Docs: Employee",{"type":17,"tag":84,"props":353736,"children":353737},{},[353738],{"type":17,"tag":133,"props":353739,"children":353741},{"href":343981,"rel":353740},[214],[353742],{"type":23,"value":353743},"Docs: Payslip",{"type":17,"tag":84,"props":353745,"children":353746},{},[353747],{"type":17,"tag":133,"props":353748,"children":353750},{"href":344006,"rel":353749},[214],[353751],{"type":23,"value":353752},"Docs: Timeoff",{"type":17,"tag":84,"props":353754,"children":353755},{},[353756],{"type":17,"tag":133,"props":353757,"children":353760},{"href":353758,"rel":353759},"https://unified.to/blog/start_here_getting_started_with_unified",[214],[353761],{"type":23,"value":353762},"Guide: Getting Started with Unified.to",{"title":7,"searchDepth":1629,"depth":1629,"links":353764},[353765,353766,353767],{"id":353584,"depth":1629,"text":353587},{"id":353637,"depth":1629,"text":353640},{"id":44585,"depth":1629,"text":44588},"content:blog:unified_hr_api_access_payslip_and_time_off_data_across_hr_and_payroll_systems.md","blog/unified_hr_api_access_payslip_and_time_off_data_across_hr_and_payroll_systems.md","blog/unified_hr_api_access_payslip_and_time_off_data_across_hr_and_payroll_systems",{"_path":353772,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":353773,"description":353774,"img":353775,"date":353776,"tag":6341,"body":353777,"_type":1677,"_id":354072,"_source":1679,"_file":354073,"_stem":354074,"_extension":1682},"/blog/how_to_associate_a_connection_id_with_your_end_user","How to Associate a Connection ID with Your End-User","This guide explains how to associate connections you create through Unified.to with end-users in your own application.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_associate_a_connection_id_with_your_end_user-icon.png","2024-04-04T00:00:00.000Z",{"type":14,"children":353778,"toc":354066},[353779,353784,353787,353795,353799,353804,353809,353813,353817,353821,353847,353853,353864,353930,353936,353963,353994,354000],{"type":17,"tag":18,"props":353780,"children":353782},{"id":353781},"how-to-associate-a-connection-id-with-your-end-user",[353783],{"type":23,"value":353773},{"type":17,"tag":25,"props":353785,"children":353786},{},[],{"type":17,"tag":29,"props":353788,"children":353789},{},[353790],{"type":17,"tag":33,"props":353791,"children":353792},{},[353793],{"type":23,"value":353794},"April 4, 2024",{"type":17,"tag":29,"props":353796,"children":353797},{},[353798],{"type":23,"value":353774},{"type":17,"tag":29,"props":353800,"children":353801},{},[353802],{"type":23,"value":353803},"When your end-users authorize access to third-party applications through Unified.to, you need a way to keep track of which connections belong to which users in your application. This guide covers two ways to accomplish this, with recommendations on when to use each approach.",{"type":17,"tag":29,"props":353805,"children":353806},{},[353807],{"type":23,"value":353808},"If you prefer to learn through video, check out our guide on YouTube:",{"type":17,"tag":11616,"props":353810,"children":353812},{"width":11618,"height":11619,"src":353811,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/OW-1vE04cFw?si=EGXIESpEGgYSq0j8",[],{"type":17,"tag":68,"props":353814,"children":353815},{"id":177146},[353816],{"type":23,"value":177149},{"type":17,"tag":29,"props":353818,"children":353819},{},[353820],{"type":23,"value":333379},{"type":17,"tag":80,"props":353822,"children":353823},{},[353824,353836],{"type":17,"tag":84,"props":353825,"children":353826},{},[353827,353829],{"type":23,"value":353828},"A basic understanding of ",{"type":17,"tag":133,"props":353830,"children":353833},{"href":353831,"rel":353832},"https://unified.to/blog/end_users_integrations_and_connections",[214],[353834],{"type":23,"value":353835},"end-users, integrations, and connections",{"type":17,"tag":84,"props":353837,"children":353838},{},[353839,353841,353845],{"type":23,"value":353840},"Familiarity with ",{"type":17,"tag":133,"props":353842,"children":353843},{"href":779},[353844],{"type":23,"value":782},{"type":23,"value":353846}," 2.0 authorization flows",{"type":17,"tag":68,"props":353848,"children":353850},{"id":353849},"method-1-use-the-state-parameter-recommended",[353851],{"type":23,"value":353852},"Method 1: Use the state parameter (recommended)",{"type":17,"tag":29,"props":353854,"children":353855},{},[353856,353858,353862],{"type":23,"value":353857},"The state parameter provides a secure way to maintain context throughout the OAuth flow by passing data between your authorization request and the callback. The state parameter ",{"type":17,"tag":33,"props":353859,"children":353860},{},[353861],{"type":23,"value":228363},{"type":23,"value":353863}," change during authorization. Whatever value you put into the state parameter in the authorization URL is the same value that will be extracted from the success URL.",{"type":17,"tag":6154,"props":353865,"children":353866},{},[353867,353881,353895,353909],{"type":17,"tag":84,"props":353868,"children":353869},{},[353870,353872],{"type":23,"value":353871},"Create a state object with your user's ID, passing in additional security measures like a hashing signature. For example:",{"type":17,"tag":6893,"props":353873,"children":353876},{"className":353874,"code":353875,"language":6898,"meta":7},[6896],"const stateObject = {\n  user_id: \"xyz789\",\n  nonce: generateRandomString(), // Add randomness for security\n  timestamp: Date.now(), // Optional: Add timestamp for expiry checking\n  sig: generateSignature() // Optional: Add signature for verification\n};\n",[353877],{"type":17,"tag":6121,"props":353878,"children":353879},{"__ignoreMap":7},[353880],{"type":23,"value":353875},{"type":17,"tag":84,"props":353882,"children":353883},{},[353884,353886],{"type":23,"value":353885},"Encode the state object as a base64-string:",{"type":17,"tag":6893,"props":353887,"children":353890},{"className":353888,"code":353889,"language":6898,"meta":7},[6896],"const encodedState = Buffer.from(JSON.stringify(stateObject)).toString('base64');\n",[353891],{"type":17,"tag":6121,"props":353892,"children":353893},{"__ignoreMap":7},[353894],{"type":23,"value":353889},{"type":17,"tag":84,"props":353896,"children":353897},{},[353898,353900],{"type":23,"value":353899},"Add the encoded state to your authorization URL",{"type":17,"tag":6893,"props":353901,"children":353904},{"className":353902,"code":353903,"language":6898,"meta":7},[6896],"const authUrl = `https://api.unified.to/unified/integration/auth/${workspace_id}/${integration}?state=${encodedState}`;\n",[353905],{"type":17,"tag":6121,"props":353906,"children":353907},{"__ignoreMap":7},[353908],{"type":23,"value":353903},{"type":17,"tag":84,"props":353910,"children":353911},{},[353912,353914,353919,353921],{"type":23,"value":353913},"Handle the callback after successful authorization. The connection ID is included in the URL as ",{"type":17,"tag":6121,"props":353915,"children":353917},{"className":353916},[],[353918],{"type":23,"value":18766},{"type":23,"value":353920},". For example:",{"type":17,"tag":6893,"props":353922,"children":353925},{"className":353923,"code":353924,"language":6898,"meta":7},[6896],"// In your callback handler\nfunction handleCallback(req, res) {\n// Get connection ID from the callback URL\n  const connectionId = req.query.id;\n\n// Decode and verify the state\n  const decodedState = JSON.parse(Buffer.from(req.query.state, 'base64').toString());\n\n// Verify the state is valid (check signature, nonce, timestamp if used)\n  if (verifyState(decodedState)) {\n// Associate the connection ID with the user ID in your database\n    await saveUserConnection(decodedState.user_id, connectionId);\n  }\n}\n",[353926],{"type":17,"tag":6121,"props":353927,"children":353928},{"__ignoreMap":7},[353929],{"type":23,"value":353924},{"type":17,"tag":68,"props":353931,"children":353933},{"id":353932},"method-2-use-the-external-id-parameter",[353934],{"type":23,"value":353935},"Method 2: Use the external ID parameter",{"type":17,"tag":29,"props":353937,"children":353938},{},[353939,353941,353947,353949,353954,353956,353961],{"type":23,"value":353940},"This method leverages Unified.to's built-in external ID (",{"type":17,"tag":6121,"props":353942,"children":353944},{"className":353943},[],[353945],{"type":23,"value":353946},"uid",{"type":23,"value":353948},") field to store your user associations. The success URL contains another parameter, ",{"type":17,"tag":6121,"props":353950,"children":353952},{"className":353951},[],[353953],{"type":23,"value":353946},{"type":23,"value":353955},", also known as the ",{"type":17,"tag":48,"props":353957,"children":353958},{},[353959],{"type":23,"value":353960},"External ID",{"type":23,"value":353962}," parameter, which can be used to map to your end-user's ID.",{"type":17,"tag":6154,"props":353964,"children":353965},{},[353966,353980],{"type":17,"tag":84,"props":353967,"children":353968},{},[353969,353971],{"type":23,"value":353970},"Add the external ID parameter to your authorization URL",{"type":17,"tag":6893,"props":353972,"children":353975},{"className":353973,"code":353974,"language":6898,"meta":7},[6896],"const authUrl = `https://api.unified.to/unified/integration/auth/${workspace_id}/${integration}?uid=${user_id}`;\n",[353976],{"type":17,"tag":6121,"props":353977,"children":353978},{"__ignoreMap":7},[353979],{"type":23,"value":353974},{"type":17,"tag":84,"props":353981,"children":353982},{},[353983,353985],{"type":23,"value":353984},"Once a connection is created, that external ID is stored in the connection object. You can now query connections using the external ID:",{"type":17,"tag":6893,"props":353986,"children":353989},{"className":353987,"code":353988,"language":6898,"meta":7},[6896],"const options = {\n  method: 'GET',\n  url: 'https://api.unified.to/unified/connection',\n  headers: {\n    'authorization': `Bearer ${unified_api_key}`\n  },\n  params: {\n    external_xref: user_id\n  }\n};\n",[353990],{"type":17,"tag":6121,"props":353991,"children":353992},{"__ignoreMap":7},[353993],{"type":23,"value":353988},{"type":17,"tag":68,"props":353995,"children":353997},{"id":353996},"best-practices-for-implementation",[353998],{"type":23,"value":353999},"Best practices for implementation",{"type":17,"tag":6154,"props":354001,"children":354002},{},[354003,354024,354045],{"type":17,"tag":84,"props":354004,"children":354005},{},[354006,354011],{"type":17,"tag":48,"props":354007,"children":354008},{},[354009],{"type":23,"value":354010},"Always validate the state parameter",{"type":17,"tag":80,"props":354012,"children":354013},{},[354014,354019],{"type":17,"tag":84,"props":354015,"children":354016},{},[354017],{"type":23,"value":354018},"Check signatures if used",{"type":17,"tag":84,"props":354020,"children":354021},{},[354022],{"type":23,"value":354023},"Verify nonces haven't been reused",{"type":17,"tag":84,"props":354025,"children":354026},{},[354027,354032],{"type":17,"tag":48,"props":354028,"children":354029},{},[354030],{"type":23,"value":354031},"Securely store connection associations",{"type":17,"tag":80,"props":354033,"children":354034},{},[354035,354040],{"type":17,"tag":84,"props":354036,"children":354037},{},[354038],{"type":23,"value":354039},"Use a database to map user IDs to connection IDs",{"type":17,"tag":84,"props":354041,"children":354042},{},[354043],{"type":23,"value":354044},"Consider encrypting sensitive data",{"type":17,"tag":84,"props":354046,"children":354047},{},[354048,354053],{"type":17,"tag":48,"props":354049,"children":354050},{},[354051],{"type":23,"value":354052},"Handle error cases",{"type":17,"tag":80,"props":354054,"children":354055},{},[354056,354061],{"type":17,"tag":84,"props":354057,"children":354058},{},[354059],{"type":23,"value":354060},"Missing parameters",{"type":17,"tag":84,"props":354062,"children":354063},{},[354064],{"type":23,"value":354065},"Failed authorization attempts",{"title":7,"searchDepth":1629,"depth":1629,"links":354067},[354068,354069,354070,354071],{"id":177146,"depth":1629,"text":177149},{"id":353849,"depth":1629,"text":353852},{"id":353932,"depth":1629,"text":353935},{"id":353996,"depth":1629,"text":353999},"content:blog:how_to_associate_a_connection_id_with_your_end_user.md","blog/how_to_associate_a_connection_id_with_your_end_user.md","blog/how_to_associate_a_connection_id_with_your_end_user",{"_path":354076,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":354077,"description":354078,"img":354079,"date":354080,"tag":6341,"body":354081,"_type":1677,"_id":354145,"_source":1679,"_file":354146,"_stem":354147,"_extension":1682},"/blog/how_long_are_logs_retained","How long are logs retained","API call logs are retained for 60 days. Our system removes log entries for API calls that are older than 60 days.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_long_are_logs_retained-icon.png","2024-04-02T00:00:00.000Z",{"type":14,"children":354082,"toc":354143},[354083,354088,354091,354099,354109,354121,354134],{"type":17,"tag":18,"props":354084,"children":354086},{"id":354085},"how-long-are-logs-retained",[354087],{"type":23,"value":354077},{"type":17,"tag":25,"props":354089,"children":354090},{},[],{"type":17,"tag":29,"props":354092,"children":354093},{},[354094],{"type":17,"tag":33,"props":354095,"children":354096},{},[354097],{"type":23,"value":354098},"April 2, 2024",{"type":17,"tag":29,"props":354100,"children":354101},{},[354102,354107],{"type":17,"tag":48,"props":354103,"children":354104},{},[354105],{"type":23,"value":354106},"API call logs are retained for 60 days.",{"type":23,"value":354108}," Our system removes log entries for API calls that are older than 60 days.",{"type":17,"tag":29,"props":354110,"children":354111},{},[354112,354114,354120],{"type":23,"value":354113},"To retain a record of all of your API calls, we suggest that you make a backup copy of your API call log on a regular basis. You can do this by using our ",{"type":17,"tag":133,"props":354115,"children":354117},{"href":338588,"rel":354116},[214],[354118],{"type":23,"value":354119},"Unified.to Admin API",{"type":23,"value":54},{"type":17,"tag":29,"props":354122,"children":354123},{},[354124,354126,354132],{"type":23,"value":354125},"For example, if you use our Node SDK, you could perform a backup using the ",{"type":17,"tag":6121,"props":354127,"children":354129},{"className":354128},[],[354130],{"type":23,"value":354131},"listUnifiedApicalls()",{"type":23,"value":354133}," method:",{"type":17,"tag":6893,"props":354135,"children":354138},{"className":354136,"code":354137,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nconst results = await sdk.unified.listUnifiedApicalls({  });\n",[354139],{"type":17,"tag":6121,"props":354140,"children":354141},{"__ignoreMap":7},[354142],{"type":23,"value":354137},{"title":7,"searchDepth":1629,"depth":1629,"links":354144},[],"content:blog:how_long_are_logs_retained.md","blog/how_long_are_logs_retained.md","blog/how_long_are_logs_retained",{"_path":354149,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":354150,"description":354151,"img":354152,"date":354153,"tag":12,"body":354154,"_type":1677,"_id":354808,"_source":1679,"_file":354809,"_stem":354810,"_extension":1682},"/blog/unified_mar_2024_product_updates","Unified.to Mar 2024 product updates","We're known for shipping weirdly fast, and this month is no different. Our real-time unified API platform now has more than 150+ pre-built integrations with...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mar_2024_product_updates-icon.png","2024-03-28T00:00:00.000Z",{"type":14,"children":354155,"toc":354798},[354156,354161,354164,354172,354180,354191,354196,354200,354217,354222,354245,354256,354264,354268,354273,354287,354292,354307,354312,354326,354331,354346,354351,354364,354369,354384,354389,354403,354408,354423,354428,354436,354441,354446,354637,354646,354652,354660,354665,354674,354680,354692,354710,354719,354725,354733,354738,354747,354753,354767,354776,354782,354787],{"type":17,"tag":18,"props":354157,"children":354159},{"id":354158},"unifiedto-mar-2024-product-updates",[354160],{"type":23,"value":354150},{"type":17,"tag":25,"props":354162,"children":354163},{},[],{"type":17,"tag":29,"props":354165,"children":354166},{},[354167],{"type":17,"tag":33,"props":354168,"children":354169},{},[354170],{"type":23,"value":354171},"March 28, 2024",{"type":17,"tag":29,"props":354173,"children":354174},{},[354175],{"type":17,"tag":6438,"props":354176,"children":354179},{"alt":354177,"src":354178},"March_Product_Update_-_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mar_2024_product_updates-0.png",[],{"type":17,"tag":29,"props":354181,"children":354182},{},[354183,354185,354189],{"type":23,"value":354184},"We're known for shipping weirdly fast, and this month is no different. Our real-time ",{"type":17,"tag":133,"props":354186,"children":354187},{"href":7691},[354188],{"type":23,"value":7459},{"type":23,"value":354190}," platform now has more than 150+ pre-built integrations with 450+ distinct objects across 12 industries, including E-commerce, Payment, Accounting, ATS, CRM, Authentication, and more.",{"type":17,"tag":29,"props":354192,"children":354193},{},[354194],{"type":23,"value":354195},"What's new:",{"type":17,"tag":68,"props":354197,"children":354198},{"id":164743},[354199],{"type":23,"value":9010},{"type":17,"tag":29,"props":354201,"children":354202},{},[354203,354204,354208,354210,354215],{"type":23,"value":326196},{"type":17,"tag":133,"props":354205,"children":354206},{"href":4999},[354207],{"type":23,"value":5002},{"type":23,"value":354209},"](/blog/unlock_real_time_data_with_virtual_webhooks) now support 70+ integrations. In the ",{"type":17,"tag":133,"props":354211,"children":354213},{"href":327182,"rel":354212},[214],[354214],{"type":23,"value":351254},{"type":23,"value":354216}," report, we found that only 11% of SaaS APIs have built-in support for native webhooks, which means developers would need to implement their own polling strategies. Our virtual webhooks add webhook-like functionality to APIs that don't support them, ensuring all our integrations have a consistent callback interface.",{"type":17,"tag":29,"props":354218,"children":354219},{},[354220],{"type":23,"value":354221},"How our virtual webhooks work:",{"type":17,"tag":80,"props":354223,"children":354224},{},[354225,354230,354235,354240],{"type":17,"tag":84,"props":354226,"children":354227},{},[354228],{"type":23,"value":354229},"Unified.to monitors your customer connections for updates to data objects and notifies your webhook URL of those changes",{"type":17,"tag":84,"props":354231,"children":354232},{},[354233],{"type":23,"value":354234},"Unified.to handles polling, rate-limiting, and state management",{"type":17,"tag":84,"props":354236,"children":354237},{},[354238],{"type":23,"value":354239},"Subscribe to and manage virtual webhooks just as you would for native webhooks",{"type":17,"tag":84,"props":354241,"children":354242},{},[354243],{"type":23,"value":354244},"Choose between virtual and native webhooks for individual objects",{"type":17,"tag":29,"props":354246,"children":354247},{},[354248,354250,354254],{"type":23,"value":354249},"When activating an integration in Unified.to, click on the ",{"type":17,"tag":48,"props":354251,"children":354252},{},[354253],{"type":23,"value":211607},{"type":23,"value":354255}," tab to see which webhook types are supported.",{"type":17,"tag":29,"props":354257,"children":354258},{},[354259],{"type":17,"tag":133,"props":354260,"children":354262},{"href":327207,"rel":354261},[214],[354263],{"type":23,"value":342724},{"type":17,"tag":68,"props":354265,"children":354266},{"id":11629},[354267],{"type":23,"value":216420},{"type":17,"tag":29,"props":354269,"children":354270},{},[354271],{"type":23,"value":354272},"You can now add the following pre-built integrations to your app:",{"type":17,"tag":29,"props":354274,"children":354275},{},[354276,354286],{"type":17,"tag":133,"props":354277,"children":354280},{"href":354278,"rel":354279},"https://unified.to/integrations/ameego",[214],[354281],{"type":17,"tag":48,"props":354282,"children":354283},{},[354284],{"type":23,"value":354285},"Ameego",{"type":23,"value":341757},{"type":17,"tag":29,"props":354288,"children":354289},{},[354290],{"type":23,"value":354291},"Ameego is employee scheduling software for restaurants. Access your customers' workforce data (employee).",{"type":17,"tag":29,"props":354293,"children":354294},{},[354295,354305],{"type":17,"tag":133,"props":354296,"children":354299},{"href":354297,"rel":354298},"https://unified.to/integrations/boldcommerce",[214],[354300],{"type":17,"tag":48,"props":354301,"children":354302},{},[354303],{"type":23,"value":354304},"Bold",{"type":23,"value":354306}," (Commerce, Accounting, Authentication)",{"type":17,"tag":29,"props":354308,"children":354309},{},[354310],{"type":23,"value":354311},"Bold is an e-commerce solution focused on checkout experiences. Access your customers' commerce and payment data. You can also enable SSO through Bold.",{"type":17,"tag":29,"props":354313,"children":354314},{},[354315,354324],{"type":17,"tag":133,"props":354316,"children":354319},{"href":354317,"rel":354318},"https://unified.to/integrations/intercom",[214],[354320],{"type":17,"tag":48,"props":354321,"children":354322},{},[354323],{"type":23,"value":15729},{"type":23,"value":354325}," (Ticketing, HR, Authentication)",{"type":17,"tag":29,"props":354327,"children":354328},{},[354329],{"type":23,"value":354330},"Intercom offers messaging and communication solutions for customer support. Access your customers' ticketing and workforce data. You can also enable SSO through Intercom.",{"type":17,"tag":29,"props":354332,"children":354333},{},[354334,354344],{"type":17,"tag":133,"props":354335,"children":354338},{"href":354336,"rel":354337},"https://unified.to/integrations/myob",[214],[354339],{"type":17,"tag":48,"props":354340,"children":354341},{},[354342],{"type":23,"value":354343},"MYOB",{"type":23,"value":354345}," (HR, Authentication)",{"type":17,"tag":29,"props":354347,"children":354348},{},[354349],{"type":23,"value":354350},"MYOB provides accounting, payroll, and business management software. Access your customers' workforce data (employee) and enable SSO through MYOB.",{"type":17,"tag":29,"props":354352,"children":354353},{},[354354,354362],{"type":17,"tag":133,"props":354355,"children":354357},{"href":351133,"rel":354356},[214],[354358],{"type":17,"tag":48,"props":354359,"children":354360},{},[354361],{"type":23,"value":37073},{"type":23,"value":354363}," (Accounting, Payment, Authentication)",{"type":17,"tag":29,"props":354365,"children":354366},{},[354367],{"type":23,"value":354368},"GoCardless is a global payment platform specialized in direct debit services. Access your customers' accounting and payment data. You can also enable SSO through GoCardless.",{"type":17,"tag":29,"props":354370,"children":354371},{},[354372,354382],{"type":17,"tag":133,"props":354373,"children":354376},{"href":354374,"rel":354375},"https://unified.to/integrations/gem",[214],[354377],{"type":17,"tag":48,"props":354378,"children":354379},{},[354380],{"type":23,"value":354381},"Gem",{"type":23,"value":354383}," (HR, ATS)",{"type":17,"tag":29,"props":354385,"children":354386},{},[354387],{"type":23,"value":354388},"Gem is an all-in-one recruitment solution. Access your customers' workforce and recruitment data.",{"type":17,"tag":29,"props":354390,"children":354391},{},[354392,354401],{"type":17,"tag":133,"props":354393,"children":354396},{"href":354394,"rel":354395},"https://unified.to/integrations/holded",[214],[354397],{"type":17,"tag":48,"props":354398,"children":354399},{},[354400],{"type":23,"value":346370},{"type":23,"value":354402}," (HR, CRM, Accounting, Commerce, Marketing, Payment)",{"type":17,"tag":29,"props":354404,"children":354405},{},[354406],{"type":23,"value":354407},"Holded is business management and accounting software. Access your customers' data from Holded across 6+ API categories.",{"type":17,"tag":29,"props":354409,"children":354410},{},[354411,354421],{"type":17,"tag":133,"props":354412,"children":354415},{"href":354413,"rel":354414},"https://unified.to/integrations/marketing360",[214],[354416],{"type":17,"tag":48,"props":354417,"children":354418},{},[354419],{"type":23,"value":354420},"Marketing360",{"type":23,"value":354422}," (HR, CRM)",{"type":17,"tag":29,"props":354424,"children":354425},{},[354426],{"type":23,"value":354427},"Marketing360 is a comprehensive marketing platform for small businesses. Access your customers' workforce and selling data.",{"type":17,"tag":29,"props":354429,"children":354430},{},[354431],{"type":17,"tag":133,"props":354432,"children":354434},{"href":87026,"rel":354433},[214],[354435],{"type":23,"value":341766},{"type":17,"tag":68,"props":354437,"children":354438},{"id":341515},[354439],{"type":23,"value":354440},"Enhancements",{"type":17,"tag":29,"props":354442,"children":354443},{},[354444],{"type":23,"value":354445},"We've released a ton of enhancements and more feature support across our integrations. Here's a preview:",{"type":17,"tag":80,"props":354447,"children":354448},{},[354449,354466,354482,354500,354517,354533,354549,354565,354586],{"type":17,"tag":84,"props":354450,"children":354451},{},[354452,354458,354459,354464],{"type":17,"tag":133,"props":354453,"children":354456},{"href":354454,"rel":354455},"https://unified.to/integrations/bullhorn",[214],[354457],{"type":23,"value":280437},{"type":23,"value":18757},{"type":17,"tag":133,"props":354460,"children":354462},{"href":343563,"rel":354461},[214],[354463],{"type":23,"value":117137},{"type":23,"value":354465}," added new writable fields: title, sources, external_id, date_of_birth and address",{"type":17,"tag":84,"props":354467,"children":354468},{},[354469,354474,354475,354480],{"type":17,"tag":133,"props":354470,"children":354472},{"href":337814,"rel":354471},[214],[354473],{"type":23,"value":3189},{"type":23,"value":18757},{"type":17,"tag":133,"props":354476,"children":354478},{"href":343638,"rel":354477},[214],[354479],{"type":23,"value":240137},{"type":23,"value":354481}," added new writable fields: number_of_openings and description",{"type":17,"tag":84,"props":354483,"children":354484},{},[354485,354492,354493,354498],{"type":17,"tag":133,"props":354486,"children":354489},{"href":354487,"rel":354488},"https://unified.to/integrations/crelate",[214],[354490],{"type":23,"value":354491},"Crelate",{"type":23,"value":18757},{"type":17,"tag":133,"props":354494,"children":354496},{"href":343638,"rel":354495},[214],[354497],{"type":23,"value":240137},{"type":23,"value":354499}," added new readable fields: remote and employment_type",{"type":17,"tag":84,"props":354501,"children":354502},{},[354503,354508,354510,354515],{"type":17,"tag":133,"props":354504,"children":354506},{"href":322650,"rel":354505},[214],[354507],{"type":23,"value":3179},{"type":23,"value":354509}," added 'updated' virtual webhooks for ",{"type":17,"tag":133,"props":354511,"children":354513},{"href":344197,"rel":354512},[214],[354514],{"type":23,"value":334119},{"type":23,"value":354516}," object",{"type":17,"tag":84,"props":354518,"children":354519},{},[354520,354526,354527,354532],{"type":17,"tag":133,"props":354521,"children":354524},{"href":354522,"rel":354523},"https://unified.to/integrations/dropbox",[214],[354525],{"type":23,"value":28915},{"type":23,"value":354509},{"type":17,"tag":133,"props":354528,"children":354530},{"href":344197,"rel":354529},[214],[354531],{"type":23,"value":334119},{"type":23,"value":354516},{"type":17,"tag":84,"props":354534,"children":354535},{},[354536,354541,354542,354547],{"type":17,"tag":133,"props":354537,"children":354539},{"href":351126,"rel":354538},[214],[354540],{"type":23,"value":26548},{"type":23,"value":18757},{"type":17,"tag":133,"props":354543,"children":354545},{"href":333596,"rel":354544},[214],[354546],{"type":23,"value":25828},{"type":23,"value":354548}," added new readable fields: payment_methods",{"type":17,"tag":84,"props":354550,"children":354551},{},[354552,354557,354558,354563],{"type":17,"tag":133,"props":354553,"children":354555},{"href":353556,"rel":354554},[214],[354556],{"type":23,"value":240061},{"type":23,"value":18757},{"type":17,"tag":133,"props":354559,"children":354561},{"href":343907,"rel":354560},[214],[354562],{"type":23,"value":61210},{"type":23,"value":354564}," added new writable fields: telephones, emails and address",{"type":17,"tag":84,"props":354566,"children":354567},{},[354568,354573,354574,354579,354580,354585],{"type":17,"tag":133,"props":354569,"children":354571},{"href":337828,"rel":354570},[214],[354572],{"type":23,"value":56564},{"type":23,"value":354509},{"type":17,"tag":133,"props":354575,"children":354577},{"href":343932,"rel":354576},[214],[354578],{"type":23,"value":18623},{"type":23,"value":34435},{"type":17,"tag":133,"props":354581,"children":354583},{"href":343907,"rel":354582},[214],[354584],{"type":23,"value":61210},{"type":23,"value":200606},{"type":17,"tag":84,"props":354587,"children":354588},{},[354589,354594,354596,354602,354603,354608,354609,354615,354616,354622,354623,354630,354631,354636],{"type":17,"tag":133,"props":354590,"children":354592},{"href":331188,"rel":354591},[214],[354593],{"type":23,"value":37435},{"type":23,"value":354595}," added 'created' virtual webhooks for ",{"type":17,"tag":133,"props":354597,"children":354600},{"href":354598,"rel":354599},"https://docs.unified.to/accounting/invoice/model",[214],[354601],{"type":23,"value":71559},{"type":23,"value":11826},{"type":17,"tag":133,"props":354604,"children":354606},{"href":333596,"rel":354605},[214],[354607],{"type":23,"value":25828},{"type":23,"value":11826},{"type":17,"tag":133,"props":354610,"children":354613},{"href":354611,"rel":354612},"https://docs.unified.to/commerce/inventory/model",[214],[354614],{"type":23,"value":38946},{"type":23,"value":11826},{"type":17,"tag":133,"props":354617,"children":354620},{"href":354618,"rel":354619},"https://docs.unified.to/commerce/collection/model",[214],[354621],{"type":23,"value":55327},{"type":23,"value":11826},{"type":17,"tag":133,"props":354624,"children":354627},{"href":354625,"rel":354626},"https://docs.unified.to/commerce/item/model",[214],[354628],{"type":23,"value":354629},"Item",{"type":23,"value":34435},{"type":17,"tag":133,"props":354632,"children":354634},{"href":343907,"rel":354633},[214],[354635],{"type":23,"value":61210},{"type":23,"value":200606},{"type":17,"tag":29,"props":354638,"children":354639},{},[354640],{"type":17,"tag":133,"props":354641,"children":354643},{"href":47029,"rel":354642},[214],[354644],{"type":23,"value":354645},"See the changelog",{"type":17,"tag":68,"props":354647,"children":354649},{"id":354648},"report-2024-state-of-saas-apis",[354650],{"type":23,"value":354651},"Report: 2024 State of SaaS APIs",{"type":17,"tag":29,"props":354653,"children":354654},{},[354655],{"type":17,"tag":6438,"props":354656,"children":354659},{"alt":354657,"src":354658},"2024_State_of_SaaS_APIs_report_-GIF.gif","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mar_2024_product_updates-1.gif",[],{"type":17,"tag":29,"props":354661,"children":354662},{},[354663],{"type":23,"value":354664},"We released our first industry report this month: the 2024 State of SaaS APIs. Inside, we analyze 145+ APIs we've worked with to build our platform, covering everything from authentication to webhooks. This report highlights the complexity of working with SaaS APIs, data from actual usage, and best practices.",{"type":17,"tag":29,"props":354666,"children":354667},{},[354668],{"type":17,"tag":133,"props":354669,"children":354671},{"href":327182,"rel":354670},[214],[354672],{"type":23,"value":354673},"Download the free report",{"type":17,"tag":68,"props":354675,"children":354677},{"id":354676},"humi-delivers-faster-onboarding-with-unifiedto",[354678],{"type":23,"value":354679},"Humi delivers faster onboarding with Unified.to",{"type":17,"tag":29,"props":354681,"children":354682},{},[354683,354685,354690],{"type":23,"value":354684},"Humi, a leading cloud-based HR software solution, strategically chose ",{"type":17,"tag":133,"props":354686,"children":354688},{"href":212,"rel":354687},[214],[354689],{"type":23,"value":217},{"type":23,"value":354691}," as their preferred integration partner to streamline the provisioning of employee data from other HRIS systems. As a result, Humi expedited its customer onboarding process and achieved a remarkable engineering feat in just one month.",{"type":17,"tag":80,"props":354693,"children":354694},{},[354695,354700,354705],{"type":17,"tag":84,"props":354696,"children":354697},{},[354698],{"type":23,"value":354699},"Saved 7+ years of engineering time",{"type":17,"tag":84,"props":354701,"children":354702},{},[354703],{"type":23,"value":354704},"Saved $700 - $1M in engineering costs",{"type":17,"tag":84,"props":354706,"children":354707},{},[354708],{"type":23,"value":354709},"Launched 25 integrations in one month",{"type":17,"tag":29,"props":354711,"children":354712},{},[354713],{"type":17,"tag":133,"props":354714,"children":354716},{"href":318724,"rel":354715},[214],[354717],{"type":23,"value":354718},"Read the case study",{"type":17,"tag":68,"props":354720,"children":354722},{"id":354721},"unifiedto-wins-the-cix-top-20-early-award",[354723],{"type":23,"value":354724},"Unified.to wins the CIX Top 20 Early Award",{"type":17,"tag":29,"props":354726,"children":354727},{},[354728],{"type":17,"tag":6438,"props":354729,"children":354732},{"alt":354730,"src":354731},"IMG_2585_%281%29.jpg","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_mar_2024_product_updates-2.jpg",[],{"type":17,"tag":29,"props":354734,"children":354735},{},[354736],{"type":23,"value":354737},"We're proud to share that Unified.to has been recognized as one of Canada's most outstanding technology companies. We received the CIX Top 20 Early Award and our CEO & Co-founder Roy Pereira spoke on stage during the CIX Summit in Toronto.",{"type":17,"tag":29,"props":354739,"children":354740},{},[354741],{"type":17,"tag":133,"props":354742,"children":354745},{"href":354743,"rel":354744},"https://cixsummit.com/top-20-top-10/",[214],[354746],{"type":23,"value":342724},{"type":17,"tag":68,"props":354748,"children":354750},{"id":354749},"workable-partnership",[354751],{"type":23,"value":354752},"Workable Partnership",{"type":17,"tag":29,"props":354754,"children":354755},{},[354756,354758,354765],{"type":23,"value":354757},"We've teamed up with Workable to help software companies accelerate their Workable integration launches. With Unified.to, developers integrate once to launch Workable and 150+ APIs simultaneously in hours, not years. One of our customers, ",{"type":17,"tag":133,"props":354759,"children":354762},{"href":354760,"rel":354761},"http://herohunt.ai/",[214],[354763],{"type":23,"value":354764},"HeroHunt.ai",{"type":23,"value":354766}," launched 22+ ATS integrations through Unified.to and partnered with Workable this month.",{"type":17,"tag":29,"props":354768,"children":354769},{},[354770],{"type":17,"tag":133,"props":354771,"children":354774},{"href":354772,"rel":354773},"https://help.workable.com/hc/en-us/articles/21453337746327-Integrating-with-Workable-via-Unified-to-API",[214],[354775],{"type":23,"value":342724},{"type":17,"tag":68,"props":354777,"children":354779},{"id":354778},"dmz-partnership",[354780],{"type":23,"value":354781},"DMZ Partnership",{"type":17,"tag":29,"props":354783,"children":354784},{},[354785],{"type":23,"value":354786},"We've partnered with the DMZ, a business incubator for early-stage technology startups part of Toronto Metropolitan University. We're helping startups build integrations faster and scale their companies by offering Unified.to credits, one-on-one technical advice, and access to co-marketing opportunities.",{"type":17,"tag":29,"props":354788,"children":354789},{},[354790,354792,354797],{"type":23,"value":354791},"Interested in joining our startup program? ",{"type":17,"tag":133,"props":354793,"children":354795},{"href":215330,"rel":354794},[214],[354796],{"type":23,"value":351799},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":354799},[354800,354801,354802,354803,354804,354805,354806,354807],{"id":164743,"depth":1629,"text":9010},{"id":11629,"depth":1629,"text":216420},{"id":341515,"depth":1629,"text":354440},{"id":354648,"depth":1629,"text":354651},{"id":354676,"depth":1629,"text":354679},{"id":354721,"depth":1629,"text":354724},{"id":354749,"depth":1629,"text":354752},{"id":354778,"depth":1629,"text":354781},"content:blog:unified_mar_2024_product_updates.md","blog/unified_mar_2024_product_updates.md","blog/unified_mar_2024_product_updates",{"_path":354812,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":354813,"description":354814,"img":354815,"date":354816,"tag":6341,"body":354817,"_type":1677,"_id":354975,"_source":1679,"_file":354976,"_stem":354977,"_extension":1682},"/blog/managing_custom_validation_rules_in_salesforce","Managing custom validation rules in Salesforce","If you are getting `FIELDCUSTOMVALIDATION_EXCEPTION` when trying to write data to a Salesforce connection, this means there is a custom validation rule on this...","https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-icon.png","2024-03-22T00:00:00.000Z",{"type":14,"children":354818,"toc":354973},[354819,354824,354827,354835,354848,354860,354888,354893],{"type":17,"tag":18,"props":354820,"children":354822},{"id":354821},"managing-custom-validation-rules-in-salesforce",[354823],{"type":23,"value":354813},{"type":17,"tag":25,"props":354825,"children":354826},{},[],{"type":17,"tag":29,"props":354828,"children":354829},{},[354830],{"type":17,"tag":33,"props":354831,"children":354832},{},[354833],{"type":23,"value":354834},"March 22, 2024",{"type":17,"tag":29,"props":354836,"children":354837},{},[354838,354840,354846],{"type":23,"value":354839},"If you are getting ",{"type":17,"tag":6121,"props":354841,"children":354843},{"className":354842},[],[354844],{"type":23,"value":354845},"FIELD_CUSTOM_VALIDATION_EXCEPTION",{"type":23,"value":354847}," when trying to write data to a Salesforce connection, this means there is a custom validation rule on this Salesforce account and the data that you are providing isn't valid",{"type":17,"tag":29,"props":354849,"children":354850},{},[354851,354853,354858],{"type":23,"value":354852},"To get ",{"type":17,"tag":133,"props":354854,"children":354856},{"href":42620,"rel":354855},[214],[354857],{"type":23,"value":217},{"type":23,"value":354859}," to be able to write this object you will need to get your customer to modify the Salesforce rule on their account to be less strict or remove the rule all together.",{"type":17,"tag":29,"props":354861,"children":354862},{},[354863,354865,354871,354873,354880,354882,354886],{"type":23,"value":354864},"For example, you are getting ",{"type":17,"tag":6121,"props":354866,"children":354868},{"className":354867},[],[354869],{"type":23,"value":354870},"\"FIELD_CUSTOM_VALIDATION_EXCEPTION: The Shipping address is required.\"",{"type":23,"value":354872}," when trying to ",{"type":17,"tag":133,"props":354874,"children":354877},{"href":354875,"rel":354876},"https://docs.unified.to/crm/company/Create_a_company",[214],[354878],{"type":23,"value":354879},"create a Company",{"type":23,"value":354881},". This means there is a custom rule on the Salesforce ",{"type":17,"tag":48,"props":354883,"children":354884},{},[354885],{"type":23,"value":47619},{"type":23,"value":354887}," object that requires a shipping address.",{"type":17,"tag":29,"props":354889,"children":354890},{},[354891],{"type":23,"value":354892},"Follow these instructions to modify/remove a custom rule for Account object:",{"type":17,"tag":6154,"props":354894,"children":354895},{},[354896,354912,354929,354945,354961],{"type":17,"tag":84,"props":354897,"children":354898},{},[354899,354901,354905,354908],{"type":23,"value":354900},"Go to your Salesforce account and navigate to ",{"type":17,"tag":48,"props":354902,"children":354903},{},[354904],{"type":23,"value":299074},{"type":17,"tag":3891,"props":354906,"children":354907},{},[],{"type":17,"tag":6438,"props":354909,"children":354911},{"alt":318119,"src":354910},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-0.png",[],{"type":17,"tag":84,"props":354913,"children":354914},{},[354915,354917,354922,354925],{"type":23,"value":354916},"On the left-hand side navigate to ",{"type":17,"tag":48,"props":354918,"children":354919},{},[354920],{"type":23,"value":354921},"Objects and Fields > Object Manager",{"type":17,"tag":3891,"props":354923,"children":354924},{},[],{"type":17,"tag":6438,"props":354926,"children":354928},{"alt":318119,"src":354927},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-1.png",[],{"type":17,"tag":84,"props":354930,"children":354931},{},[354932,354934,354938,354941],{"type":23,"value":354933},"Select the object you need to modify the rules for. In our case ",{"type":17,"tag":48,"props":354935,"children":354936},{},[354937],{"type":23,"value":47619},{"type":17,"tag":3891,"props":354939,"children":354940},{},[],{"type":17,"tag":6438,"props":354942,"children":354944},{"alt":318119,"src":354943},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-2.png",[],{"type":17,"tag":84,"props":354946,"children":354947},{},[354948,354949,354954,354957],{"type":23,"value":42939},{"type":17,"tag":48,"props":354950,"children":354951},{},[354952],{"type":23,"value":354953},"Validation Rules",{"type":17,"tag":3891,"props":354955,"children":354956},{},[],{"type":17,"tag":6438,"props":354958,"children":354960},{"alt":318119,"src":354959},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-3.png",[],{"type":17,"tag":84,"props":354962,"children":354963},{},[354964,354966,354969],{"type":23,"value":354965},"Edit or remove the custom validation rule",{"type":17,"tag":3891,"props":354967,"children":354968},{},[],{"type":17,"tag":6438,"props":354970,"children":354972},{"alt":318119,"src":354971},"https://s3.us-east-2.amazonaws.com/unified-article-images/managing_custom_validation_rules_in_salesforce-4.png",[],{"title":7,"searchDepth":1629,"depth":1629,"links":354974},[],"content:blog:managing_custom_validation_rules_in_salesforce.md","blog/managing_custom_validation_rules_in_salesforce.md","blog/managing_custom_validation_rules_in_salesforce",{"_path":354979,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":354980,"description":354981,"img":354982,"date":354983,"tag":12,"body":354984,"_type":1677,"_id":355133,"_source":1679,"_file":355134,"_stem":355135,"_extension":1682},"/blog/the_state_of_saas_apis_2024","The State of SaaS APIs 2024","The State of SaaS APIs 2024 is the inaugural report on API implementation and design. With more than 30,000 applications, the Software as a Service (SaaS)...","https://s3.us-east-2.amazonaws.com/unified-article-images/the_state_of_saas_apis_2024-icon.png","2024-03-14T00:00:00.000Z",{"type":14,"children":354985,"toc":355130},[354986,354991,354994,355002,355010,355015,355020,355031,355036,355044,355056,355061,355069,355083,355088,355097,355117,355122],{"type":17,"tag":18,"props":354987,"children":354989},{"id":354988},"the-state-of-saas-apis-2024",[354990],{"type":23,"value":354980},{"type":17,"tag":25,"props":354992,"children":354993},{},[],{"type":17,"tag":29,"props":354995,"children":354996},{},[354997],{"type":17,"tag":33,"props":354998,"children":354999},{},[355000],{"type":23,"value":355001},"March 14, 2024",{"type":17,"tag":29,"props":355003,"children":355004},{},[355005],{"type":17,"tag":6438,"props":355006,"children":355009},{"alt":355007,"src":355008},"2024_State_of_SaaS_APIs_Report_-_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/the_state_of_saas_apis_2024-0.png",[],{"type":17,"tag":29,"props":355011,"children":355012},{},[355013],{"type":23,"value":355014},"The State of SaaS APIs 2024 is the inaugural report on API implementation and design. With more than 30,000 applications, the Software as a Service (SaaS) industry has become increasingly dependent on sharing user data between applications through APIs. Just as these SaaS applications have grown in complexity, the APIs have become more specialized. For example, payroll functionality comes from HRIS APIs, and sales intelligence solutions rely on CRM APIs. We no longer build stand-alone products that are entirely 'home-grown' — instead, we build products on top of platforms, where APIs are the connective tissue.",{"type":17,"tag":29,"props":355016,"children":355017},{},[355018],{"type":23,"value":355019},"The report provides an in-depth analysis of the current landscape of SaaS APIs across various industries. It explores critical aspects of authentication and authorization, API design, and the ways in which information is requested and retrieved from APIs, shedding light on prevalent trends and practices within the API ecosystem.",{"type":17,"tag":29,"props":355021,"children":355022},{},[355023,355025,355029],{"type":23,"value":355024},"These insights, based on over 20 years of experience developing API integration software, can help you make informed decisions about implementing or using APIs. We've used these insights in developing our own platform, which integrates APIs from more than 150 providers across several SaaS verticals into a single, real-time ",{"type":17,"tag":133,"props":355026,"children":355027},{"href":7691},[355028],{"type":23,"value":7459},{"type":23,"value":355030},". We believe that you'll find this report useful as you review SaaS application APIs.",{"type":17,"tag":29,"props":355032,"children":355033},{},[355034],{"type":23,"value":355035},"Here are some key insights:",{"type":17,"tag":29,"props":355037,"children":355038},{},[355039],{"type":17,"tag":6438,"props":355040,"children":355043},{"alt":355041,"src":355042},"2024_State_of_SaaS_APIs_Report_-Unified.to%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/the_state_of_saas_apis_2024-1.png",[],{"type":17,"tag":29,"props":355045,"children":355046},{},[355047],{"type":17,"tag":48,"props":355048,"children":355049},{},[355050,355054],{"type":17,"tag":133,"props":355051,"children":355052},{"href":779},[355053],{"type":23,"value":782},{"type":23,"value":355055}," 2 using the 3-legged authorization flow is the most commonly used OAuth authentication method, representing 94% of all OAuth authentications.",{"type":17,"tag":29,"props":355057,"children":355058},{},[355059],{"type":23,"value":355060},"However, it poses a greater challenge for the requesting application, which must initially register their application with the third-party system before being able to authorize end-user accounts.",{"type":17,"tag":29,"props":355062,"children":355063},{},[355064],{"type":17,"tag":6438,"props":355065,"children":355068},{"alt":355066,"src":355067},"2024_State_of_SaaS_APIs_Report_-_Webhook_Support.png","https://s3.us-east-2.amazonaws.com/unified-article-images/the_state_of_saas_apis_2024-2.png",[],{"type":17,"tag":29,"props":355070,"children":355071},{},[355072],{"type":17,"tag":48,"props":355073,"children":355074},{},[355075,355077,355081],{"type":23,"value":355076},"Only 11% of API providers have built-in support for native ",{"type":17,"tag":133,"props":355078,"children":355079},{"href":4999},[355080],{"type":23,"value":5002},{"type":23,"value":355082},", which forces developers to implement their own polling strategies.",{"type":17,"tag":29,"props":355084,"children":355085},{},[355086],{"type":23,"value":355087},"In the absence of native webhooks, API consumers are required to develop sophisticated strategies and establish infrastructure for scheduled data polling. This entails managing rate-limiting and addressing various error scenarios.",{"type":17,"tag":29,"props":355089,"children":355090},{},[355091],{"type":17,"tag":133,"props":355092,"children":355094},{"href":87026,"rel":355093},[214],[355095],{"type":23,"value":355096},"Here is a list of the APIs examined in this report",{"type":17,"tag":29,"props":355098,"children":355099},{},[355100,355102,355107,355108,355115],{"type":23,"value":355101},"To learn more about SaaS APIs, follow Unified.to on ",{"type":17,"tag":133,"props":355103,"children":355105},{"href":327897,"rel":355104},[214],[355106],{"type":23,"value":11357},{"type":23,"value":34435},{"type":17,"tag":133,"props":355109,"children":355112},{"href":355110,"rel":355111},"https://twitter.com/unified_api",[214],[355113],{"type":23,"value":355114},"Twitter",{"type":23,"value":355116}," or join us in our Discord community.",{"type":17,"tag":68,"props":355118,"children":355120},{"id":355119},"download-the-free-report",[355121],{"type":23,"value":354673},{"type":17,"tag":11616,"props":355123,"children":355129},{"src":355124,"width":355125,"height":355126,"frameBorder":11622,"marginHeight":355127,"marginWidth":355127,"title":355128},"https://tally.so/embed/31lPLb?alignLeft=1&hideTitle=1&transparentBackground=1&dynamicHeight=1","100%",700,0,"State of SaaS APIs Form",[],{"title":7,"searchDepth":1629,"depth":1629,"links":355131},[355132],{"id":355119,"depth":1629,"text":354673},"content:blog:the_state_of_saas_apis_2024.md","blog/the_state_of_saas_apis_2024.md","blog/the_state_of_saas_apis_2024",{"_path":355137,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":355138,"description":355139,"img":355140,"date":355141,"tag":289978,"body":355142,"_type":1677,"_id":355373,"_source":1679,"_file":355374,"_stem":355375,"_extension":1682},"/blog/how_humi_delivers_a_faster_onboarding_experience_with_unified","How Humi delivers a faster onboarding experience with Unified.to","Humi, a leading cloud-based HR software solution, strategically chose Unified.to as their preferred integration partner to streamline the provisioning of...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_humi_delivers_a_faster_onboarding_experience_with_unified-icon.png","2024-03-05T00:00:00.000Z",{"type":14,"children":355143,"toc":355367},[355144,355149,355152,355160,355183,355187,355192,355197,355202,355207,355212,355220,355226,355231,355245,355250,355255,355269,355275,355280,355291,355298,355303,355311,355322,355327,355332,355338,355343,355348,355353],{"type":17,"tag":18,"props":355145,"children":355147},{"id":355146},"how-humi-delivers-a-faster-onboarding-experience-with-unifiedto",[355148],{"type":23,"value":355138},{"type":17,"tag":25,"props":355150,"children":355151},{},[],{"type":17,"tag":29,"props":355153,"children":355154},{},[355155],{"type":17,"tag":33,"props":355156,"children":355157},{},[355158],{"type":23,"value":355159},"March 5, 2024",{"type":17,"tag":29,"props":355161,"children":355162},{},[355163,355168,355169,355177,355178],{"type":17,"tag":33,"props":355164,"children":355165},{},[355166],{"type":23,"value":355167},"Humi, a leading cloud-based HR software solution, strategically chose",{"type":23,"value":18757},{"type":17,"tag":133,"props":355170,"children":355172},{"href":42620,"rel":355171},[214],[355173],{"type":17,"tag":33,"props":355174,"children":355175},{},[355176],{"type":23,"value":217},{"type":23,"value":18757},{"type":17,"tag":33,"props":355179,"children":355180},{},[355181],{"type":23,"value":355182},"as their preferred integration partner to streamline the provisioning of employee data from third-party HRIS systems. As a result, Humi expedited its customer onboarding process and achieved a remarkable engineering feat in just one month.",{"type":17,"tag":68,"props":355184,"children":355185},{"id":44585},[355186],{"type":23,"value":44588},{"type":17,"tag":29,"props":355188,"children":355189},{},[355190],{"type":23,"value":355191},"Company: HR software solution",{"type":17,"tag":29,"props":355193,"children":355194},{},[355195],{"type":23,"value":355196},"Use case: Pull employee data from HRIS systems",{"type":17,"tag":29,"props":355198,"children":355199},{},[355200],{"type":23,"value":355201},"Time savings: Approx. 7 years of engineering time (for building integrations)",{"type":17,"tag":29,"props":355203,"children":355204},{},[355205],{"type":23,"value":355206},"Cost savings: Approx. $700K - $1M in value (for building integrations)",{"type":17,"tag":29,"props":355208,"children":355209},{},[355210],{"type":23,"value":355211},"Results: 25 integrations in one month",{"type":17,"tag":29,"props":355213,"children":355214},{},[355215],{"type":17,"tag":6438,"props":355216,"children":355219},{"alt":355217,"src":355218},"Humi_Quote_Graphic.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_humi_delivers_a_faster_onboarding_experience_with_unified-0.png",[],{"type":17,"tag":68,"props":355221,"children":355223},{"id":355222},"integrations-expedite-customer-onboarding",[355224],{"type":23,"value":355225},"Integrations expedite customer onboarding",{"type":17,"tag":29,"props":355227,"children":355228},{},[355229],{"type":23,"value":355230},"Since launching in 2016, Humi, a cloud-based HR software solution, has been single-minded in their mission to provide Canadian companies with a modern and complete HR Solution.",{"type":17,"tag":29,"props":355232,"children":355233},{},[355234,355236,355243],{"type":23,"value":355235},"They've been growing steadily ever since and have recently been named one of six new Canadian companies on track to reach ",{"type":17,"tag":133,"props":355237,"children":355240},{"href":355238,"rel":355239},"https://betakit.com/communitech-names-six-new-canadian-tech-companies-on-track-to-reach-1-billion-in-revenue-by-2030/",[214],[355241],{"type":23,"value":355242},"$1 billion in revenue",{"type":23,"value":355244}," by 2030.",{"type":17,"tag":29,"props":355246,"children":355247},{},[355248],{"type":23,"value":355249},"Humi's customers gain access to HR, payroll, benefits, hiring, time off, time tracking, and more in one streamlined solution. Most importantly, the all-in-one software ensures Humi's customers can fulfil multiple HR and recruitment tasks through a single platform.",{"type":17,"tag":29,"props":355251,"children":355252},{},[355253],{"type":23,"value":355254},"To enhance user experience and customer satisfaction, Humi aimed to integrate with HRIS providers to simplify onboarding for new companies and minimize the time they would need to spend adding employees to Humi. However, the engineering team anticipated a 3-6 month timeframe to develop just one integration, which significantly delayed efforts to improve their onboarding.",{"type":17,"tag":29,"props":355256,"children":355257},{},[355258,355260,355267],{"type":23,"value":355259},"Onboarding is critical to customer adoption. According to ",{"type":17,"tag":133,"props":355261,"children":355264},{"href":355262,"rel":355263},"https://userpilot.com/blog/customer-onboarding-statistics-saas/#:~:text=74%25%20of%20potential%20customers%20will,them%20don%27t%20have%20either.",[214],[355265],{"type":23,"value":355266},"one report",{"type":23,"value":355268},", 74% of users will switch solutions if the onboarding process is complicated.",{"type":17,"tag":68,"props":355270,"children":355272},{"id":355271},"humi-saved-7-years-of-integration-development-time",[355273],{"type":23,"value":355274},"Humi saved 7+ years of integration development time",{"type":17,"tag":29,"props":355276,"children":355277},{},[355278],{"type":23,"value":355279},"Determined to simplify their onboarding experience with HRIS integrations, Humi selected Unified.to as their integration partner, citing Unified.to's straightforward approach to integrations, visibility into customer connections through the dashboard, and responsiveness to customer integration requests as the deciding factors.",{"type":17,"tag":29,"props":355281,"children":355282},{},[355283],{"type":17,"tag":33,"props":355284,"children":355285},{},[355286],{"type":17,"tag":48,"props":355287,"children":355288},{},[355289],{"type":23,"value":355290},"\"Unified is impressively fast at responding to our integration requests and adding them within days. Humi is on a mission to become the ultimate streamlined HRIS platform for Canadians, and offering direct integrations through Unified.to brings tremendous value to our customers.\"",{"type":17,"tag":29,"props":355292,"children":355293},{},[355294],{"type":17,"tag":33,"props":355295,"children":355296},{},[355297],{"type":23,"value":318748},{"type":17,"tag":29,"props":355299,"children":355300},{},[355301],{"type":23,"value":355302},"In just one month, one engineer, in collaboration with a technical lead and product manager, was able to launch 25 HRIS integrations to provision employee data. In four weeks they were able to achieve what would have equated to more than seven years of engineering time, which doesn't encompass the additional effort required to maintain each individual API.",{"type":17,"tag":29,"props":355304,"children":355305},{},[355306],{"type":17,"tag":6438,"props":355307,"children":355310},{"alt":355308,"src":355309},"Screenshot of Humi's in-app integration page","https://s3.us-east-2.amazonaws.com/unified-article-images/how_humi_delivers_a_faster_onboarding_experience_with_unified-1.png",[],{"type":17,"tag":29,"props":355312,"children":355313},{},[355314,355316,355320],{"type":23,"value":355315},"Before Unified.to, Stoyanovski, described integration development as a 'full-time job,' which involved having to access third-party ",{"type":17,"tag":133,"props":355317,"children":355318},{"href":129820},[355319],{"type":23,"value":129823},{"type":23,"value":355321},", identify limitations from each API, and build to various requirements.",{"type":17,"tag":29,"props":355323,"children":355324},{},[355325],{"type":23,"value":355326},"After assessing alternatives, the team determined Unified.to provided the integration solution Humi needed, which included clear API documentation, a powerful dashboard, and the ability to turn on and off integrations without any code changes.",{"type":17,"tag":29,"props":355328,"children":355329},{},[355330],{"type":23,"value":355331},"Whenever Humi has an integration question or support issue they can conveniently reach Unified.to's integration experts in their dedicated Slack channel.",{"type":17,"tag":68,"props":355333,"children":355335},{"id":355334},"by-choosing-unifiedto-humi-accelerates-their-roadmap",[355336],{"type":23,"value":355337},"By choosing Unified.to, Humi accelerates their roadmap",{"type":17,"tag":29,"props":355339,"children":355340},{},[355341],{"type":23,"value":355342},"Humi was able to add 25 HRIS integrations in just a couple of sprints. Before using Unified.to, their customer onboarding process involved manually uploading CSV files from various software systems to add employee information. By choosing to power their integrations through Unified.to Humi now supports a broad section of HRIS integrations, streamlining their onboarding experience and saving their customers valuable time.",{"type":17,"tag":29,"props":355344,"children":355345},{},[355346],{"type":23,"value":355347},"\"It's great to hear reactions to our integrations during sales demos and demonstrate how quick and easy it is to move to Humi,\" said Stoyanovski.",{"type":17,"tag":29,"props":355349,"children":355350},{},[355351],{"type":23,"value":355352},"Humi underscores the comprehensiveness of their all-in-one HR solution by offering a range of integrations. The HR software leader can continue to support future integration demands without diverting their engineers' focus from core product innovation, which is made possible through the continued partnership with Unified.to.",{"type":17,"tag":29,"props":355354,"children":355355},{},[355356,355358],{"type":23,"value":355357},"Looking for an integration development solution for your SaaS? ",{"type":17,"tag":133,"props":355359,"children":355361},{"href":1612,"rel":355360},[214],[355362],{"type":17,"tag":48,"props":355363,"children":355364},{},[355365],{"type":23,"value":355366},"Try Unified.to today",{"title":7,"searchDepth":1629,"depth":1629,"links":355368},[355369,355370,355371,355372],{"id":44585,"depth":1629,"text":44588},{"id":355222,"depth":1629,"text":355225},{"id":355271,"depth":1629,"text":355274},{"id":355334,"depth":1629,"text":355337},"content:blog:how_humi_delivers_a_faster_onboarding_experience_with_unified.md","blog/how_humi_delivers_a_faster_onboarding_experience_with_unified.md","blog/how_humi_delivers_a_faster_onboarding_experience_with_unified",{"_path":355377,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":355378,"description":355379,"img":355380,"date":355381,"tag":12,"body":355382,"_type":1677,"_id":355864,"_source":1679,"_file":355865,"_stem":355866,"_extension":1682},"/blog/unified_feb_2024_product_updates","Unified.to Feb 2024 product updates","We've concluded February with new API categories, even more integrations, webhook enhancements, and some exciting company updates. Here's what's new,","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_feb_2024_product_updates-icon.png","2024-02-29T00:00:00.000Z",{"type":14,"children":355383,"toc":355853},[355384,355389,355392,355400,355408,355413,355418,355429,355448,355456,355461,355472,355490,355499,355503,355508,355526,355531,355549,355554,355572,355577,355594,355599,355617,355622,355641,355646,355662,355667,355673,355681,355694,355702,355715,355724,355730,355740,355749,355755,355767,355773,355785,355795,355801,355806,355815,355821,355826,355834],{"type":17,"tag":18,"props":355385,"children":355387},{"id":355386},"unifiedto-feb-2024-product-updates",[355388],{"type":23,"value":355378},{"type":17,"tag":25,"props":355390,"children":355391},{},[],{"type":17,"tag":29,"props":355393,"children":355394},{},[355395],{"type":17,"tag":33,"props":355396,"children":355397},{},[355398],{"type":23,"value":355399},"February 29, 2024",{"type":17,"tag":29,"props":355401,"children":355402},{},[355403],{"type":17,"tag":6438,"props":355404,"children":355407},{"alt":355405,"src":355406},"Unified.to_product_roundup_Feb_2024_.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_feb_2024_product_updates-0.png",[],{"type":17,"tag":29,"props":355409,"children":355410},{},[355411],{"type":23,"value":355412},"We've concluded February with new API categories, even more integrations, webhook enhancements, and some exciting company updates. Here's what's new:",{"type":17,"tag":68,"props":355414,"children":355416},{"id":355415},"unified-payment-api",[355417],{"type":23,"value":37038},{"type":17,"tag":29,"props":355419,"children":355420},{},[355421,355423,355427],{"type":23,"value":355422},"We've launched a unified ",{"type":17,"tag":133,"props":355424,"children":355425},{"href":35809},[355426],{"type":23,"value":175399},{"type":23,"value":355428}," to give next-generation fintech and e-commerce companies simplified and secure access to their customers' payment accounts. In just a few clicks, you can integrate your customers' payment accounts to seamlessly access payment data, including refunds, payouts, and payment links.",{"type":17,"tag":29,"props":355430,"children":355431},{},[355432,355434,355439,355441,355447],{"type":23,"value":355433},"Today, we've launched our Payment API with pre-built integrations for Stripe, QuickBooks, Xero, and Zoho Books. Interested in payment integrations? ",{"type":17,"tag":133,"props":355435,"children":355437},{"href":215330,"rel":355436},[214],[355438],{"type":23,"value":346114},{"type":23,"value":355440}," to tell us about your use case or start activating payment integrations on our ",{"type":17,"tag":133,"props":355442,"children":355444},{"href":1612,"rel":355443},[214],[355445],{"type":23,"value":355446},"free tester plan",{"type":23,"value":54},{"type":17,"tag":29,"props":355449,"children":355450},{},[355451],{"type":17,"tag":133,"props":355452,"children":355454},{"href":37034,"rel":355453},[214],[355455],{"type":23,"value":342724},{"type":17,"tag":68,"props":355457,"children":355459},{"id":355458},"unified-commerce-api",[355460],{"type":23,"value":19384},{"type":17,"tag":29,"props":355462,"children":355463},{},[355464,355466,355470],{"type":23,"value":355465},"Save time from building one-off e-commerce integrations with our new unified ",{"type":17,"tag":133,"props":355467,"children":355468},{"href":20451},[355469],{"type":23,"value":20454},{"type":23,"value":355471},". You can now easily support customers selling products through multiple e-commerce platforms and access their merchant data, including items, inventory, collections, and location information.",{"type":17,"tag":29,"props":355473,"children":355474},{},[355475,355477,355482,355484,355489],{"type":23,"value":355476},"We've released pre-built integrations for Shopify, Stripe, QuickBooks, Xero, and Zoho Books. Interested in e-commerce integrations? ",{"type":17,"tag":133,"props":355478,"children":355480},{"href":215330,"rel":355479},[214],[355481],{"type":23,"value":346114},{"type":23,"value":355483}," to tell us about your use case or start activating e-commerce integrations on our ",{"type":17,"tag":133,"props":355485,"children":355487},{"href":1612,"rel":355486},[214],[355488],{"type":23,"value":355446},{"type":23,"value":54},{"type":17,"tag":29,"props":355491,"children":355492},{},[355493],{"type":17,"tag":133,"props":355494,"children":355497},{"href":355495,"rel":355496},"http://b/",[214],[355498],{"type":23,"value":342724},{"type":17,"tag":68,"props":355500,"children":355501},{"id":11629},[355502],{"type":23,"value":11632},{"type":17,"tag":29,"props":355504,"children":355505},{},[355506],{"type":23,"value":355507},"You can now activate the following pre-built integrations:",{"type":17,"tag":29,"props":355509,"children":355510},{},[355511,355520,355521],{"type":17,"tag":133,"props":355512,"children":355515},{"href":355513,"rel":355514},"https://unified.to/integrations/deputy",[214],[355516],{"type":17,"tag":48,"props":355517,"children":355518},{},[355519],{"type":23,"value":58000},{"type":23,"value":18757},{"type":17,"tag":48,"props":355522,"children":355523},{},[355524],{"type":23,"value":355525},"(HR, Authentication)",{"type":17,"tag":29,"props":355527,"children":355528},{},[355529],{"type":23,"value":355530},"Deputy is an employee scheduling, timesheet, and time clock software. Access your customers' workforce data (employees) and enable SSO through Deputy.",{"type":17,"tag":29,"props":355532,"children":355533},{},[355534,355543,355544],{"type":17,"tag":133,"props":355535,"children":355538},{"href":355536,"rel":355537},"https://unified.to/integrations/recruitee",[214],[355539],{"type":17,"tag":48,"props":355540,"children":355541},{},[355542],{"type":23,"value":56584},{"type":23,"value":18757},{"type":17,"tag":48,"props":355545,"children":355546},{},[355547],{"type":23,"value":355548},"(ATS)",{"type":17,"tag":29,"props":355550,"children":355551},{},[355552],{"type":23,"value":355553},"Recruitee is a talent acquisition and applicant tracking system. Access your customers' hiring data (Candidate, Job).",{"type":17,"tag":29,"props":355555,"children":355556},{},[355557,355566,355567],{"type":17,"tag":133,"props":355558,"children":355561},{"href":355559,"rel":355560},"https://unified.to/integrations/outreach",[214],[355562],{"type":17,"tag":48,"props":355563,"children":355564},{},[355565],{"type":23,"value":31581},{"type":23,"value":18757},{"type":17,"tag":48,"props":355568,"children":355569},{},[355570],{"type":23,"value":355571},"(CRM, HR)",{"type":17,"tag":29,"props":355573,"children":355574},{},[355575],{"type":23,"value":355576},"Outreach is a sales engagement platform focused on seller productivity. Access your customers' selling (Contact, Company, Deal, Group, Lead) and workforce data (Employee).",{"type":17,"tag":29,"props":355578,"children":355579},{},[355580,355588,355589],{"type":17,"tag":133,"props":355581,"children":355583},{"href":351126,"rel":355582},[214],[355584],{"type":17,"tag":48,"props":355585,"children":355586},{},[355587],{"type":23,"value":26548},{"type":23,"value":18757},{"type":17,"tag":48,"props":355590,"children":355591},{},[355592],{"type":23,"value":355593},"(Accounting, Commerce, Payment)",{"type":17,"tag":29,"props":355595,"children":355596},{},[355597],{"type":23,"value":355598},"Stripe is a leading platform that provides payment infrastructure. Access accounting, commerce, or payment data from your customers' Stripe accounts.",{"type":17,"tag":29,"props":355600,"children":355601},{},[355602,355611,355612],{"type":17,"tag":133,"props":355603,"children":355606},{"href":355604,"rel":355605},"https://unified.to/integrations/cats",[214],[355607],{"type":17,"tag":48,"props":355608,"children":355609},{},[355610],{"type":23,"value":202788},{"type":23,"value":18757},{"type":17,"tag":48,"props":355613,"children":355614},{},[355615],{"type":23,"value":355616},"(HR, ATS)",{"type":17,"tag":29,"props":355618,"children":355619},{},[355620],{"type":23,"value":355621},"CATS is an applicant tracking system (ATS) and recruitment software. Access your customers' hiring (Candidate, Job) and workforce data (Employee, Job).",{"type":17,"tag":29,"props":355623,"children":355624},{},[355625,355635,355636],{"type":17,"tag":133,"props":355626,"children":355629},{"href":355627,"rel":355628},"https://unified.to/integrations/breathehr",[214],[355630],{"type":17,"tag":48,"props":355631,"children":355632},{},[355633],{"type":23,"value":355634},"BreatheHR",{"type":23,"value":18757},{"type":17,"tag":48,"props":355637,"children":355638},{},[355639],{"type":23,"value":355640},"(HR)",{"type":17,"tag":29,"props":355642,"children":355643},{},[355644],{"type":23,"value":355645},"BreatheHR is HR software tailored towards small to medium-sized businesses. Access your customers' workforce data (Employee).",{"type":17,"tag":29,"props":355647,"children":355648},{},[355649,355657,355658],{"type":17,"tag":133,"props":355650,"children":355652},{"href":297941,"rel":355651},[214],[355653],{"type":17,"tag":48,"props":355654,"children":355655},{},[355656],{"type":23,"value":195889},{"type":23,"value":18757},{"type":17,"tag":48,"props":355659,"children":355660},{},[355661],{"type":23,"value":355616},{"type":17,"tag":29,"props":355663,"children":355664},{},[355665],{"type":23,"value":355666},"Checkr is a leading platform that provides employee background screening. Checkr is also a Unified.to customer! Access your customers' workforce and hiring data.",{"type":17,"tag":68,"props":355668,"children":355670},{"id":355669},"object-support",[355671],{"type":23,"value":355672},"Object support",{"type":17,"tag":29,"props":355674,"children":355675},{},[355676],{"type":17,"tag":48,"props":355677,"children":355678},{},[355679],{"type":23,"value":355680},"Company (ATS)",{"type":17,"tag":29,"props":355682,"children":355683},{},[355684,355686,355692],{"type":23,"value":355685},"Jobs and Candidates can now be associated with a Company. This new feature is helpful for ATS providers that cater to recruitment agencies with multiple clients. We've added support for this feature to our pre-built ",{"type":17,"tag":133,"props":355687,"children":355690},{"href":355688,"rel":355689},"https://unified.to/integrations/jobadder",[214],[355691],{"type":23,"value":310119},{"type":23,"value":355693}," integration.",{"type":17,"tag":29,"props":355695,"children":355696},{},[355697],{"type":17,"tag":48,"props":355698,"children":355699},{},[355700],{"type":23,"value":355701},"Account Payouts & Refunds (Payment)",{"type":17,"tag":29,"props":355703,"children":355704},{},[355705,355707,355713],{"type":23,"value":355706},"You can now access your customers' payout and refund data from our new ",{"type":17,"tag":133,"props":355708,"children":355710},{"href":37034,"rel":355709},[214],[355711],{"type":23,"value":355712},"payment integrations",{"type":23,"value":355714},", which include Stripe, QuickBooks, Xero, and Zoho Books.",{"type":17,"tag":29,"props":355716,"children":355717},{},[355718],{"type":17,"tag":133,"props":355719,"children":355721},{"href":47029,"rel":355720},[214],[355722],{"type":23,"value":355723},"Visit the changelog for more updates",{"type":17,"tag":68,"props":355725,"children":355727},{"id":355726},"maximum-page-size-for-webhooks",[355728],{"type":23,"value":355729},"Maximum page size for webhooks",{"type":17,"tag":29,"props":355731,"children":355732},{},[355733,355734,355738],{"type":23,"value":351371},{"type":17,"tag":133,"props":355735,"children":355736},{"href":4999},[355737],{"type":23,"value":5002},{"type":23,"value":355739},", allowing you to set a maximum page size (page_max_limit) for better management over payload sizes. This feature makes managing large default page sizes easier, ensuring more efficient data transmission to your servers. You can also specify which fields to include for more precise control.",{"type":17,"tag":29,"props":355741,"children":355742},{},[355743],{"type":17,"tag":133,"props":355744,"children":355746},{"href":327207,"rel":355745},[214],[355747],{"type":23,"value":355748},"Learn more about our webhooks",{"type":17,"tag":68,"props":355750,"children":355752},{"id":355751},"support-status",[355753],{"type":23,"value":355754},"Support status",{"type":17,"tag":29,"props":355756,"children":355757},{},[355758,355760,355765],{"type":23,"value":355759},"Unified.to simplifies the monitoring of your integration support issues. Once logged in to your Unified.to account, go to ",{"type":17,"tag":48,"props":355761,"children":355762},{},[355763],{"type":23,"value":355764},"Help > Support Tickets",{"type":23,"value":355766}," to see the status of your open tickets.",{"type":17,"tag":68,"props":355768,"children":355770},{"id":355769},"_5-star-g2-streak",[355771],{"type":23,"value":355772},"5-star G2 Streak",{"type":17,"tag":29,"props":355774,"children":355775},{},[355776,355778,355783],{"type":23,"value":355777},"We're excited to share that we've continued our 5-star review streak on G2. In the latest reviews, our new ",{"type":17,"tag":133,"props":355779,"children":355781},{"href":331188,"rel":355780},[214],[355782],{"type":23,"value":37435},{"type":23,"value":355784}," integration gets a shout-out along with our commitment to quality customer support.",{"type":17,"tag":29,"props":355786,"children":355787},{},[355788],{"type":17,"tag":133,"props":355789,"children":355792},{"href":355790,"rel":355791},"https://www.g2.com/products/unified-to/reviews?utf8=%E2%9C%93&order=most_recent#survey-response-9235101",[214],[355793],{"type":23,"value":355794},"Read the reviews",{"type":17,"tag":68,"props":355796,"children":355798},{"id":355797},"sxsw-pitch-finalist",[355799],{"type":23,"value":355800},"SXSW Pitch Finalist",{"type":17,"tag":29,"props":355802,"children":355803},{},[355804],{"type":23,"value":355805},"Unified.to has been named SXSW Pitch finalist at this year's festival in Austin, Texas. If you're headed to the festival, join us March 9-10 in Austin to hear how Unified.to is building a truly interconnected SaaS industry.",{"type":17,"tag":29,"props":355807,"children":355808},{},[355809],{"type":17,"tag":133,"props":355810,"children":355813},{"href":355811,"rel":355812},"https://www.sxsw.com/news/2024/2024-sxsw-pitch-finalists-and-alternates-announced/",[214],[355814],{"type":23,"value":342724},{"type":17,"tag":68,"props":355816,"children":355818},{"id":355817},"cix-top-20-early-winner",[355819],{"type":23,"value":355820},"CIX Top 20 Early Winner",{"type":17,"tag":29,"props":355822,"children":355823},{},[355824],{"type":23,"value":355825},"Unified.to has been recognized as one of Canada's most innovative new companies with the CIX Top 20 Early Award. Our CEO Roy Pereira joined the other award recipients on BNN this week, and he'll be pitching on stage at the award ceremony March 26-27, 2024, in downtown Toronto.",{"type":17,"tag":29,"props":355827,"children":355828},{},[355829],{"type":17,"tag":133,"props":355830,"children":355832},{"href":354743,"rel":355831},[214],[355833],{"type":23,"value":342724},{"type":17,"tag":29,"props":355835,"children":355836},{},[355837,355839,355844,355846,355852],{"type":23,"value":355838},"Thanks for reading to the end! See more updates on the ",{"type":17,"tag":133,"props":355840,"children":355842},{"href":47029,"rel":355841},[214],[355843],{"type":23,"value":47033},{"type":23,"value":355845}," and create an account to ",{"type":17,"tag":133,"props":355847,"children":355849},{"href":1612,"rel":355848},[214],[355850],{"type":23,"value":355851},"get started with Unified.to for free",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":355854},[355855,355856,355857,355858,355859,355860,355861,355862,355863],{"id":355415,"depth":1629,"text":37038},{"id":355458,"depth":1629,"text":19384},{"id":11629,"depth":1629,"text":11632},{"id":355669,"depth":1629,"text":355672},{"id":355726,"depth":1629,"text":355729},{"id":355751,"depth":1629,"text":355754},{"id":355769,"depth":1629,"text":355772},{"id":355797,"depth":1629,"text":355800},{"id":355817,"depth":1629,"text":355820},"content:blog:unified_feb_2024_product_updates.md","blog/unified_feb_2024_product_updates.md","blog/unified_feb_2024_product_updates",{"_path":355868,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":344988,"description":355869,"img":355870,"date":355871,"tag":6341,"body":355872,"_type":1677,"_id":356610,"_source":1679,"_file":356611,"_stem":356612,"_extension":1682},"/blog/how_to_configure_webhooks_in_hubspot","This guide walks you through how to configure webhooks in HubSpot to work with Unified.to. These webhooks allow you to get notifications about new events and...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-icon.png","2024-02-23T00:00:00.000Z",{"type":14,"children":355873,"toc":356595},[355874,355879,355882,355890,355901,355905,355962,355968,355974,355982,355988,355993,356101,356107,356112,356267,356273,356285,356413,356419,356425,356445,356454,356463,356468,356477,356490,356511,356530,356536,356541,356549,356554,356562,356566],{"type":17,"tag":18,"props":355875,"children":355877},{"id":355876},"how-to-configure-webhooks-in-hubspot",[355878],{"type":23,"value":344988},{"type":17,"tag":25,"props":355880,"children":355881},{},[],{"type":17,"tag":29,"props":355883,"children":355884},{},[355885],{"type":17,"tag":33,"props":355886,"children":355887},{},[355888],{"type":23,"value":355889},"February 23, 2024",{"type":17,"tag":29,"props":355891,"children":355892},{},[355893,355895,355899],{"type":23,"value":355894},"This guide walks you through how to configure ",{"type":17,"tag":133,"props":355896,"children":355897},{"href":4999},[355898],{"type":23,"value":5002},{"type":23,"value":355900}," in HubSpot to work with Unified.to. These webhooks allow you to get notifications about new events and changes from HubSpot e.g. new leads, updated deals, or deleted contacts.",{"type":17,"tag":68,"props":355902,"children":355903},{"id":177146},[355904],{"type":23,"value":177149},{"type":17,"tag":80,"props":355906,"children":355907},{},[355908,355913,355918,355948],{"type":17,"tag":84,"props":355909,"children":355910},{},[355911],{"type":23,"value":355912},"Make sure you have a HubSpot developer account.",{"type":17,"tag":84,"props":355914,"children":355915},{},[355916],{"type":23,"value":355917},"Get your client ID, client secret, and developer API key.",{"type":17,"tag":84,"props":355919,"children":355920},{},[355921,355922,355926,355928,355934],{"type":23,"value":319286},{"type":17,"tag":48,"props":355923,"children":355924},{},[355925],{"type":23,"value":42771},{"type":23,"value":355927}," in your HubSpot app to ",{"type":17,"tag":6121,"props":355929,"children":355931},{"className":355930},[],[355932],{"type":23,"value":355933},"api.unified.to/oauth/code",{"type":17,"tag":80,"props":355935,"children":355936},{},[355937],{"type":17,"tag":84,"props":355938,"children":355939},{},[355940,355942],{"type":23,"value":355941},"If you're using the EU data region, use instead",{"type":17,"tag":6121,"props":355943,"children":355945},{"className":355944},[],[355946],{"type":23,"value":355947},"api-eu.unified.to/oauth/code",{"type":17,"tag":84,"props":355949,"children":355950},{},[355951,355953,355960],{"type":23,"value":355952},"Follow our ",{"type":17,"tag":133,"props":355954,"children":355957},{"href":355955,"rel":355956},"https://docs.unified.to/guides/how_to_register_a_hubspot_developer_app_and_get_your_oauth_2_credentials#how-to-register-a-hubspot-developer-app-and-get-your-oauth-2-credentials",[214],[355958],{"type":23,"value":355959},"HubSpot developer guide",{"type":23,"value":355961}," to see how to do all of the above.",{"type":17,"tag":68,"props":355963,"children":355965},{"id":355964},"setting-up-webhooks-in-hubspot-legacy-apps",[355966],{"type":23,"value":355967},"Setting up Webhooks in Hubspot Legacy Apps",{"type":17,"tag":239,"props":355969,"children":355971},{"id":355970},"select-the-appropriate-legacy-app-to-setup-the-webhook",[355972],{"type":23,"value":355973},"Select the appropriate Legacy App to setup the webhook",{"type":17,"tag":29,"props":355975,"children":355976},{},[355977],{"type":17,"tag":6438,"props":355978,"children":355981},{"alt":355979,"src":355980},"Screenshot_2025-11-25_at_12.21.18_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-0.png",[],{"type":17,"tag":239,"props":355983,"children":355985},{"id":355984},"set-the-target-url-for-the-webhook",[355986],{"type":23,"value":355987},"Set the target URL for the webhook",{"type":17,"tag":29,"props":355989,"children":355990},{},[355991],{"type":23,"value":355992},"HubSpot uses a single webhook URL per app, which means you need to configure your app to send any events to the Unified.to servers.",{"type":17,"tag":6154,"props":355994,"children":355995},{},[355996,356009,356018,356023,356039,356090],{"type":17,"tag":84,"props":355997,"children":355998},{},[355999,356001,356008],{"type":23,"value":356000},"Navigate to your ",{"type":17,"tag":133,"props":356002,"children":356005},{"href":356003,"rel":356004},"https://app.hubspot.com/",[214],[356006],{"type":23,"value":356007},"HubSpot developer account",{"type":23,"value":54},{"type":17,"tag":84,"props":356010,"children":356011},{},[356012,356013],{"type":23,"value":6629},{"type":17,"tag":48,"props":356014,"children":356015},{},[356016],{"type":23,"value":356017},"Apps.",{"type":17,"tag":84,"props":356019,"children":356020},{},[356021],{"type":23,"value":356022},"Select the app you wish to use to access your customers' data.",{"type":17,"tag":84,"props":356024,"children":356025},{},[356026,356027,356032,356035],{"type":23,"value":6629},{"type":17,"tag":48,"props":356028,"children":356029},{},[356030],{"type":23,"value":356031},"Webhooks.",{"type":17,"tag":3891,"props":356033,"children":356034},{},[],{"type":17,"tag":6438,"props":356036,"children":356038},{"alt":318119,"src":356037},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-1.png",[],{"type":17,"tag":84,"props":356040,"children":356041},{},[356042,356043,356047,356048,356073,356076,356078,356083,356085],{"type":23,"value":146715},{"type":17,"tag":48,"props":356044,"children":356045},{},[356046],{"type":23,"value":147145},{"type":23,"value":20456},{"type":17,"tag":6154,"props":356049,"children":356050},{},[356051,356062],{"type":17,"tag":84,"props":356052,"children":356053},{},[356054,356056],{"type":23,"value":356055},"If you are using the US data region, copy and paste in: ",{"type":17,"tag":6121,"props":356057,"children":356059},{"className":356058},[],[356060],{"type":23,"value":356061},"api.unified.to/webhook/workspace/hubspot",{"type":17,"tag":84,"props":356063,"children":356064},{},[356065,356067],{"type":23,"value":356066},"If you using the EU data region, copy and paste in: ",{"type":17,"tag":6121,"props":356068,"children":356070},{"className":356069},[],[356071],{"type":23,"value":356072},"api-eu.unified.to/webhook/workspace/hubspot",{"type":17,"tag":3891,"props":356074,"children":356075},{},[],{"type":23,"value":356077},"If your URL is greyed out and you have subscriptions under ",{"type":17,"tag":48,"props":356079,"children":356080},{},[356081],{"type":23,"value":356082},"Event subscriptions",{"type":23,"value":356084},", then you'll need to unsubscribe from all of them. ",{"type":17,"tag":33,"props":356086,"children":356087},{},[356088],{"type":23,"value":356089},"WARNING: If these subscriptions and the target URL are used by other applications, this action will break them. In that case, you may want to consider creating a new developer app to use with Unified.to.",{"type":17,"tag":84,"props":356091,"children":356092},{},[356093,356095,356099],{"type":23,"value":356094},"You do ",{"type":17,"tag":48,"props":356096,"children":356097},{},[356098],{"type":23,"value":159475},{"type":23,"value":356100}," have to create any subscriptions manually. Unified.to will do that on your behalf.",{"type":17,"tag":239,"props":356102,"children":356104},{"id":356103},"add-scopes-for-your-webhooks",[356105],{"type":23,"value":356106},"Add scopes for your webhooks",{"type":17,"tag":29,"props":356108,"children":356109},{},[356110],{"type":23,"value":356111},"In order for Unified.to to receive webhook data from HubSpot, you need to add scopes for the events you are interested in as well as a few others.",{"type":17,"tag":6154,"props":356113,"children":356114},{},[356115,356132,356248],{"type":17,"tag":84,"props":356116,"children":356117},{},[356118,356120,356125,356127],{"type":23,"value":356119},"With your app page still open, click ",{"type":17,"tag":48,"props":356121,"children":356122},{},[356123],{"type":23,"value":356124},"Basic Info",{"type":23,"value":356126}," and then click ",{"type":17,"tag":48,"props":356128,"children":356129},{},[356130],{"type":23,"value":356131},"Auth.",{"type":17,"tag":84,"props":356133,"children":356134},{},[356135,356137,356141,356142],{"type":23,"value":356136},"Scroll down to ",{"type":17,"tag":48,"props":356138,"children":356139},{},[356140],{"type":23,"value":42815},{"type":23,"value":20456},{"type":17,"tag":6154,"props":356143,"children":356144},{},[356145,356161,356198,356208,356237],{"type":17,"tag":84,"props":356146,"children":356147},{},[356148,356149,356154,356156,356160],{"type":23,"value":278147},{"type":17,"tag":6121,"props":356150,"children":356152},{"className":356151},[],[356153],{"type":23,"value":345034},{"type":23,"value":356155},"as ",{"type":17,"tag":48,"props":356157,"children":356158},{},[356159],{"type":23,"value":47953},{"type":23,"value":54},{"type":17,"tag":84,"props":356162,"children":356163},{},[356164,356166,356171],{"type":23,"value":356165},"For any events where you want to read data, add them as ",{"type":17,"tag":48,"props":356167,"children":356168},{},[356169],{"type":23,"value":356170},"Required.",{"type":17,"tag":6154,"props":356172,"children":356173},{},[356174],{"type":17,"tag":84,"props":356175,"children":356176},{},[356177,356179,356184,356185,356191,356192,356196],{"type":23,"value":356178},"Note: This applies to events that you'll be subscribed to as well as those that you will only call via the API. For example, if you want to create a Contacts webhook and also fetch Companies via the API, you'll need to add both ",{"type":17,"tag":6121,"props":356180,"children":356182},{"className":356181},[],[356183],{"type":23,"value":77941},{"type":23,"value":34435},{"type":17,"tag":6121,"props":356186,"children":356188},{"className":356187},[],[356189],{"type":23,"value":356190},"crm.objects.companies.read",{"type":23,"value":231806},{"type":17,"tag":48,"props":356193,"children":356194},{},[356195],{"type":23,"value":47953},{"type":23,"value":356197}," because Unified.to will pass all of these as required scopes in each auth flow.",{"type":17,"tag":84,"props":356199,"children":356200},{},[356201,356203,356207],{"type":23,"value":356202},"For any events where you want to write data, add them as ",{"type":17,"tag":48,"props":356204,"children":356205},{},[356206],{"type":23,"value":316561},{"type":23,"value":54},{"type":17,"tag":84,"props":356209,"children":356210},{},[356211,356213,356218,356219,356223,356225,356231,356232,356236],{"type":23,"value":356212},"For example, if you want to receive notifications about updates to HubSpot companies, you'll need to add ",{"type":17,"tag":6121,"props":356214,"children":356216},{"className":356215},[],[356217],{"type":23,"value":356190},{"type":23,"value":231806},{"type":17,"tag":48,"props":356220,"children":356221},{},[356222],{"type":23,"value":47953},{"type":23,"value":356224},". If you want to write data to companies, add ",{"type":17,"tag":6121,"props":356226,"children":356228},{"className":356227},[],[356229],{"type":23,"value":356230},"crm.objects.companies.write",{"type":23,"value":231806},{"type":17,"tag":48,"props":356233,"children":356234},{},[356235],{"type":23,"value":316561},{"type":23,"value":54},{"type":17,"tag":84,"props":356238,"children":356239},{},[356240,356242,356247],{"type":23,"value":356241},"To see the full list of HubSpot scopes that Unified.to supports, see: ",{"type":17,"tag":133,"props":356243,"children":356245},{"href":338884,"rel":356244},[214],[356246],{"type":23,"value":338884},{"type":23,"value":54},{"type":17,"tag":84,"props":356249,"children":356250},{},[356251,356252,356257,356259,356262],{"type":23,"value":6712},{"type":17,"tag":6121,"props":356253,"children":356255},{"className":356254},[],[356256],{"type":23,"value":146777},{"type":23,"value":356258}," scope is also required for all HubSpot integrations. This will be added by default if your app was created after April 2024.",{"type":17,"tag":3891,"props":356260,"children":356261},{},[],{"type":17,"tag":6438,"props":356263,"children":356266},{"alt":356264,"src":356265},"Screenshot_2024-08-26_at_2.35.36_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-2.png",[],{"type":17,"tag":239,"props":356268,"children":356270},{"id":356269},"select-permission-scopes-on-unifiedto",[356271],{"type":23,"value":356272},"Select permission scopes on Unified.to",{"type":17,"tag":29,"props":356274,"children":356275},{},[356276,356278,356283],{"type":23,"value":356277},"When prompting your customers to authorize access to their third-party accounts, you will need to select the corresponding scopes in ",{"type":17,"tag":133,"props":356279,"children":356281},{"href":42620,"rel":356280},[214],[356282],{"type":23,"value":217},{"type":23,"value":356284}," as well. The following steps show you how to do that when using our Embedded Authorization component.",{"type":17,"tag":6154,"props":356286,"children":356287},{},[356288,356310,356321],{"type":17,"tag":84,"props":356289,"children":356290},{},[356291,356293,356297,356298,356306],{"type":23,"value":356292},"On app.unified.to, click on ",{"type":17,"tag":48,"props":356294,"children":356295},{},[356296],{"type":23,"value":158746},{"type":23,"value":345627},{"type":17,"tag":133,"props":356299,"children":356301},{"href":338709,"rel":356300},[214],[356302],{"type":17,"tag":48,"props":356303,"children":356304},{},[356305],{"type":23,"value":346996},{"type":17,"tag":48,"props":356307,"children":356308},{},[356309],{"type":23,"value":54},{"type":17,"tag":84,"props":356311,"children":356312},{},[356313,356315,356320],{"type":23,"value":356314},"You will see a preview of the Embedded Authorization component on the left and a list of configuration options on the right. Click on ",{"type":17,"tag":48,"props":356316,"children":356317},{},[356318],{"type":23,"value":356319},"Options",{"type":23,"value":54},{"type":17,"tag":84,"props":356322,"children":356323},{},[356324,356325,356330,356331,356335,356337,356342,356343,356348,356349,356354,356356],{"type":23,"value":356136},{"type":17,"tag":48,"props":356326,"children":356327},{},[356328],{"type":23,"value":356329},"Permission scopes",{"type":23,"value":344673},{"type":17,"tag":48,"props":356332,"children":356333},{},[356334],{"type":23,"value":124562},{"type":23,"value":356336}," as well as any other permission scopes that you need e.g. the same scopes you added in HubSpot. You do not need to select ",{"type":17,"tag":6121,"props":356338,"children":356340},{"className":356339},[],[356341],{"type":23,"value":146777},{"type":23,"value":75890},{"type":17,"tag":6121,"props":356344,"children":356346},{"className":356345},[],[356347],{"type":23,"value":345034},{"type":23,"value":135160},{"type":17,"tag":133,"props":356350,"children":356352},{"href":42620,"rel":356351},[214],[356353],{"type":23,"value":217},{"type":23,"value":356355}," as well will map these automatically on our end.\n",{"type":17,"tag":6154,"props":356357,"children":356358},{},[356359,356384,356395],{"type":17,"tag":84,"props":356360,"children":356361},{},[356362,356364,356369,356370,356376,356379],{"type":23,"value":356363},"For example, using the examples from above for reading Contacts and Companies, the scopes in Unified.to would be  ",{"type":17,"tag":6121,"props":356365,"children":356367},{"className":356366},[],[356368],{"type":23,"value":312495},{"type":23,"value":34435},{"type":17,"tag":6121,"props":356371,"children":356373},{"className":356372},[],[356374],{"type":23,"value":356375},"crm_company_read",{"type":17,"tag":3891,"props":356377,"children":356378},{},[],{"type":17,"tag":6438,"props":356380,"children":356383},{"alt":356381,"src":356382},"c9a0cf8d-eca3-4b74-8d52-d84a2fb6029f.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-3.png",[],{"type":17,"tag":84,"props":356385,"children":356386},{},[356387,356389,356394],{"type":23,"value":356388},"A mapping of Unified scopes to their HubSpot counterparts can be found ",{"type":17,"tag":133,"props":356390,"children":356392},{"href":338884,"rel":356391},[214],[356393],{"type":23,"value":243989},{"type":23,"value":54},{"type":17,"tag":84,"props":356396,"children":356397},{},[356398,356400,356405,356407,356411],{"type":23,"value":356399},"Tip: Under ",{"type":17,"tag":48,"props":356401,"children":356402},{},[356403],{"type":23,"value":356404},"Integration categories,",{"type":23,"value":356406}," select ",{"type":17,"tag":48,"props":356408,"children":356409},{},[356410],{"type":23,"value":25731},{"type":23,"value":356412}," to only see scopes related to CRM data objects.",{"type":17,"tag":68,"props":356414,"children":356416},{"id":356415},"setting-up-webhooks-in-hubspot-development-platform",[356417],{"type":23,"value":356418},"Setting up Webhooks in Hubspot Development Platform",{"type":17,"tag":239,"props":356420,"children":356422},{"id":356421},"create-webhook-configuration-file",[356423],{"type":23,"value":356424},"Create Webhook configuration file",{"type":17,"tag":29,"props":356426,"children":356427},{},[356428,356430,356435,356437,356443],{"type":23,"value":356429},"In your hubspot project folder, create a new folder ",{"type":17,"tag":6121,"props":356431,"children":356433},{"className":356432},[],[356434],{"type":23,"value":124562},{"type":23,"value":356436}," and inside add in the ",{"type":17,"tag":6121,"props":356438,"children":356440},{"className":356439},[],[356441],{"type":23,"value":356442},"webhook-hsmeta.json",{"type":23,"value":356444}," file.",{"type":17,"tag":6893,"props":356446,"children":356449},{"className":356447,"code":356448,"language":6898,"meta":7},[6896],"project-folder/\n└── src/\n    └── app/\n        ├── app-hsmeta.json\n        └── webhooks/\n            └── webhook-hsmeta.json\n",[356450],{"type":17,"tag":6121,"props":356451,"children":356452},{"__ignoreMap":7},[356453],{"type":23,"value":356448},{"type":17,"tag":239,"props":356455,"children":356457},{"id":356456},"setup-webhook-configuration",[356458],{"type":17,"tag":48,"props":356459,"children":356460},{},[356461],{"type":23,"value":356462},"Setup Webhook configuration",{"type":17,"tag":29,"props":356464,"children":356465},{},[356466],{"type":23,"value":356467},"Now that you have the webhook config file ready, let's setup the configuration as follows:",{"type":17,"tag":6893,"props":356469,"children":356472},{"className":356470,"code":356471,"language":6898,"meta":7},[6896],"{\n  \"uid\": \"webhooks\",\n  \"type\": \"webhooks\",\n  \"config\": {\n    \"settings\": {\n      \"targetUrl\": \"https://api.unified.to/webhook/workspace/hubspot\",\n      \"maxConcurrentRequests\": 10\n    },\n    \"subscriptions\": {\n      \"legacyCrmObjects\": [\n        {\n          \"subscriptionType\": \"deals.propertyChange\",\n          \"propertyName\": \"dealstage\",\n          \"active\": true\n        },\n        {\n          \"subscriptionType\": \"deals.associationChange\",\n          \"active\": true\n        }\n      ]\n    }\n  }\n}\n",[356473],{"type":17,"tag":6121,"props":356474,"children":356475},{"__ignoreMap":7},[356476],{"type":23,"value":356471},{"type":17,"tag":29,"props":356478,"children":356479},{},[356480,356482,356488],{"type":23,"value":356481},"For the ",{"type":17,"tag":6121,"props":356483,"children":356485},{"className":356484},[],[356486],{"type":23,"value":356487},"targetUrl",{"type":23,"value":356489}," :",{"type":17,"tag":6154,"props":356491,"children":356492},{},[356493,356502],{"type":17,"tag":84,"props":356494,"children":356495},{},[356496,356497],{"type":23,"value":356055},{"type":17,"tag":6121,"props":356498,"children":356500},{"className":356499},[],[356501],{"type":23,"value":356061},{"type":17,"tag":84,"props":356503,"children":356504},{},[356505,356506],{"type":23,"value":356066},{"type":17,"tag":6121,"props":356507,"children":356509},{"className":356508},[],[356510],{"type":23,"value":356072},{"type":17,"tag":29,"props":356512,"children":356513},{},[356514,356515,356520,356522,356528],{"type":23,"value":356481},{"type":17,"tag":6121,"props":356516,"children":356518},{"className":356517},[],[356519],{"type":23,"value":36138},{"type":23,"value":356521}," we need to use the ",{"type":17,"tag":6121,"props":356523,"children":356525},{"className":356524},[],[356526],{"type":23,"value":356527},"legacyCrmObjects",{"type":23,"value":356529}," to define which object we want to get events for.",{"type":17,"tag":239,"props":356531,"children":356533},{"id":356532},"deploy-hubspot-project",[356534],{"type":23,"value":356535},"Deploy Hubspot Project",{"type":17,"tag":29,"props":356537,"children":356538},{},[356539],{"type":23,"value":356540},"Once you've setup your webhook configuration, you can now upload the project via:",{"type":17,"tag":6893,"props":356542,"children":356544},{"className":356543,"code":247983,"language":6898,"meta":7},[6896],[356545],{"type":17,"tag":6121,"props":356546,"children":356547},{"__ignoreMap":7},[356548],{"type":23,"value":247983},{"type":17,"tag":29,"props":356550,"children":356551},{},[356552],{"type":23,"value":356553},"Once uploaded, your configuration should now show up in your app's webhook list:",{"type":17,"tag":29,"props":356555,"children":356556},{},[356557],{"type":17,"tag":6438,"props":356558,"children":356561},{"alt":356559,"src":356560},"Screenshot_2025-11-25_at_12.34.02_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_configure_webhooks_in_hubspot-4.png",[],{"type":17,"tag":68,"props":356563,"children":356564},{"id":332205},[356565],{"type":23,"value":332208},{"type":17,"tag":80,"props":356567,"children":356568},{},[356569,356579,356587],{"type":17,"tag":84,"props":356570,"children":356571},{},[356572],{"type":17,"tag":133,"props":356573,"children":356576},{"href":356574,"rel":356575},"https://docs.unified.to/concepts/webhooks#introduction-to-webhooks",[214],[356577],{"type":23,"value":356578},"Introduction to webhooks",{"type":17,"tag":84,"props":356580,"children":356581},{},[356582],{"type":17,"tag":133,"props":356583,"children":356585},{"href":330059,"rel":356584},[214],[356586],{"type":23,"value":339916},{"type":17,"tag":84,"props":356588,"children":356589},{},[356590],{"type":17,"tag":133,"props":356591,"children":356593},{"href":337118,"rel":356592},[214],[356594],{"type":23,"value":344801},{"title":7,"searchDepth":1629,"depth":1629,"links":356596},[356597,356598,356604,356609],{"id":177146,"depth":1629,"text":177149},{"id":355964,"depth":1629,"text":355967,"children":356599},[356600,356601,356602,356603],{"id":355970,"depth":1635,"text":355973},{"id":355984,"depth":1635,"text":355987},{"id":356103,"depth":1635,"text":356106},{"id":356269,"depth":1635,"text":356272},{"id":356415,"depth":1629,"text":356418,"children":356605},[356606,356607,356608],{"id":356421,"depth":1635,"text":356424},{"id":356456,"depth":1635,"text":356462},{"id":356532,"depth":1635,"text":356535},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_configure_webhooks_in_hubspot.md","blog/how_to_configure_webhooks_in_hubspot.md","blog/how_to_configure_webhooks_in_hubspot",{"_path":356614,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":356615,"description":356616,"img":356617,"date":356618,"tag":6341,"body":356619,"_type":1677,"_id":356731,"_source":1679,"_file":356732,"_stem":356733,"_extension":1682},"/blog/how_to_request_and_write_raw_integration_data","How To Request & Write Raw Integration Data","While Unified.to abstracts all of the integration's objects into common objects, you can still request that the original object.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_request_and_write_raw_integration_data-icon.png","2024-02-06T00:00:00.000Z",{"type":14,"children":356620,"toc":356727},[356621,356626,356629,356637,356643,356655,356668,356677,356689,356695,356706,356715],{"type":17,"tag":18,"props":356622,"children":356624},{"id":356623},"how-to-request-write-raw-integration-data",[356625],{"type":23,"value":356615},{"type":17,"tag":25,"props":356627,"children":356628},{},[],{"type":17,"tag":29,"props":356630,"children":356631},{},[356632],{"type":17,"tag":33,"props":356633,"children":356634},{},[356635],{"type":23,"value":356636},"February 6, 2024",{"type":17,"tag":239,"props":356638,"children":356640},{"id":356639},"reading-data",[356641],{"type":23,"value":356642},"Reading data",{"type":17,"tag":29,"props":356644,"children":356645},{},[356646,356648,356653],{"type":23,"value":356647},"While ",{"type":17,"tag":133,"props":356649,"children":356651},{"href":212,"rel":356650},[214],[356652],{"type":23,"value":217},{"type":23,"value":356654}," abstracts all of the integration's objects into common objects, you can still request that the original object.",{"type":17,"tag":29,"props":356656,"children":356657},{},[356658,356660,356666],{"type":23,"value":356659},"Simply include a ",{"type":17,"tag":6121,"props":356661,"children":356663},{"className":356662},[],[356664],{"type":23,"value":356665},"fields=raw",{"type":23,"value":356667}," parameter in your request.",{"type":17,"tag":6893,"props":356669,"children":356672},{"className":356670,"code":356671,"language":6898,"meta":7},[6896],"GET /crm/123456789/contacts?fields=raw\n",[356673],{"type":17,"tag":6121,"props":356674,"children":356675},{"__ignoreMap":7},[356676],{"type":23,"value":356671},{"type":17,"tag":29,"props":356678,"children":356679},{},[356680,356682,356687],{"type":23,"value":356681},"The result will also include a field named ",{"type":17,"tag":6121,"props":356683,"children":356685},{"className":356684},[],[356686],{"type":23,"value":62389},{"type":23,"value":356688}," that will contain the original vendor's object.  You can add more field names in there as well (comma-delimited) and only those fields will be returned.",{"type":17,"tag":239,"props":356690,"children":356692},{"id":356691},"writing-data",[356693],{"type":23,"value":356694},"Writing data",{"type":17,"tag":29,"props":356696,"children":356697},{},[356698,356699,356704],{"type":23,"value":356659},{"type":17,"tag":6121,"props":356700,"children":356702},{"className":356701},[],[356703],{"type":23,"value":62389},{"type":23,"value":356705}," field in the payload with the integration's specific fields.",{"type":17,"tag":6893,"props":356707,"children":356710},{"className":356708,"code":356709,"language":6898,"meta":7},[6896],"POST /crm/123456789/contacts\n\n{\n    \"name\": \"Joe Smith\",\n    \"raw\": {\n        \"customfield1\":\"Blue\",\n        \"customfield2\":\"Bananas\"\n    }\n}\n",[356711],{"type":17,"tag":6121,"props":356712,"children":356713},{"__ignoreMap":7},[356714],{"type":23,"value":356709},{"type":17,"tag":29,"props":356716,"children":356717},{},[356718,356720,356725],{"type":23,"value":356719},"Those fields in the ",{"type":17,"tag":6121,"props":356721,"children":356723},{"className":356722},[],[356724],{"type":23,"value":62389},{"type":23,"value":356726},"  object can also overwrite any mapped unified fields.",{"title":7,"searchDepth":1629,"depth":1629,"links":356728},[356729,356730],{"id":356639,"depth":1635,"text":356642},{"id":356691,"depth":1635,"text":356694},"content:blog:how_to_request_and_write_raw_integration_data.md","blog/how_to_request_and_write_raw_integration_data.md","blog/how_to_request_and_write_raw_integration_data",{"_path":356735,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":356736,"description":356737,"img":356738,"date":356739,"tag":12,"body":356740,"_type":1677,"_id":357275,"_source":1679,"_file":357276,"_stem":357277,"_extension":1682},"/blog/unified_jan_2024_product_updates","Unified.to Jan 2024 product updates","That's a wrap on the first month of the year. Here are the top launches of January plus some exciting company updates at the end.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_jan_2024_product_updates-icon.png","2024-01-31T00:00:00.000Z",{"type":14,"children":356741,"toc":357264},[356742,356747,356750,356758,356766,356770,356776,356805,356810,356819,356829,356835,356852,356860,356866,356878,356887,356893,356898,356921,356925,356931,356936,356940,356958,356963,356979,356984,357002,357007,357025,357030,357048,357053,357071,357076,357093,357098,357115,357120,357137,357142,357159,357164,357170,357175,357185,357195,357201,357206,357215,357221,357226,357235,357241,357246,357255],{"type":17,"tag":18,"props":356743,"children":356745},{"id":356744},"unifiedto-jan-2024-product-updates",[356746],{"type":23,"value":356736},{"type":17,"tag":25,"props":356748,"children":356749},{},[],{"type":17,"tag":29,"props":356751,"children":356752},{},[356753],{"type":17,"tag":33,"props":356754,"children":356755},{},[356756],{"type":23,"value":356757},"January 31, 2024",{"type":17,"tag":29,"props":356759,"children":356760},{},[356761],{"type":17,"tag":6438,"props":356762,"children":356765},{"alt":356763,"src":356764},"Unified.to_Jan_2024_product_launches.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_jan_2024_product_updates-0.png",[],{"type":17,"tag":29,"props":356767,"children":356768},{},[356769],{"type":23,"value":356737},{"type":17,"tag":68,"props":356771,"children":356773},{"id":356772},"_1-new-unified-file-storage-api",[356774],{"type":23,"value":356775},"1. New unified file storage API",{"type":17,"tag":29,"props":356777,"children":356778},{},[356779,356781,356785,356787,356791,356793,356797,356799,356803],{"type":23,"value":356780},"We've extended our ",{"type":17,"tag":133,"props":356782,"children":356783},{"href":7691},[356784],{"type":23,"value":7459},{"type":23,"value":356786}," categories to now include file storage. Integrate once to retrieve file data from multiple storage systems. The ",{"type":17,"tag":48,"props":356788,"children":356789},{},[356790],{"type":23,"value":334119},{"type":23,"value":356792}," object represents a file or folder and each ",{"type":17,"tag":48,"props":356794,"children":356795},{},[356796],{"type":23,"value":334119},{"type":23,"value":356798}," has a ",{"type":17,"tag":48,"props":356800,"children":356801},{},[356802],{"type":23,"value":24978},{"type":23,"value":356804}," field you can use to retrieve the contents.",{"type":17,"tag":29,"props":356806,"children":356807},{},[356808],{"type":23,"value":356809},"After initially launching this category with the most popular cloud storage systems (Google Drive, Dropbox, OneDrive, and more), we also added HubSpot and GitHub. Some of your customers store files in 'unconventional' systems, so we're planning to add more of these.",{"type":17,"tag":29,"props":356811,"children":356812},{},[356813],{"type":17,"tag":133,"props":356814,"children":356816},{"href":29953,"rel":356815},[214],[356817],{"type":23,"value":356818},"Browse file storage integrations",{"type":17,"tag":29,"props":356820,"children":356821},{},[356822],{"type":17,"tag":133,"props":356823,"children":356826},{"href":356824,"rel":356825},"https://unified.to/blog/introducing_the_unified_file_storage_api",[214],[356827],{"type":23,"value":356828},"Read the announcement",{"type":17,"tag":68,"props":356830,"children":356832},{"id":356831},"_2-major-webhooks-enhancement",[356833],{"type":23,"value":356834},"2. Major webhooks enhancement",{"type":17,"tag":29,"props":356836,"children":356837},{},[356838,356840,356844,356846,356850],{"type":23,"value":356839},"We launched a major update to our ",{"type":17,"tag":133,"props":356841,"children":356842},{"href":4999},[356843],{"type":23,"value":5002},{"type":23,"value":356845},", which now make it easier for you to retrieve historical data, get more visibility into your webhook activity, monitor webhook health and have more control over the data you access. Unified.to's webhooks handle advanced data pulling mechanisms, including ",{"type":17,"tag":133,"props":356847,"children":356848},{"href":1857},[356849],{"type":23,"value":1860},{"type":23,"value":356851},", rate limits, and error handling with back-off and retry strategies.",{"type":17,"tag":29,"props":356853,"children":356854},{},[356855],{"type":17,"tag":133,"props":356856,"children":356858},{"href":327207,"rel":356857},[214],[356859],{"type":23,"value":356828},{"type":17,"tag":68,"props":356861,"children":356863},{"id":356862},"_3-new-sandbox-environment",[356864],{"type":23,"value":356865},"3. New sandbox environment",{"type":17,"tag":29,"props":356867,"children":356868},{},[356869,356871,356876],{"type":23,"value":356870},"Support for testing integrations has been a much-requested feature and very few third-party platforms offer test accounts. To simplify integration testing, we've introduced a new Sandbox environment that allows you to read and write data to any integration. To ensure data accuracy, we'll always return data in the format that the integration supports. Our Sandbox environment is best to use when you do not have a live customer using your integration, or you do not have a test account with the third-party platform. When you activate an integration in your ",{"type":17,"tag":133,"props":356872,"children":356874},{"href":42620,"rel":356873},[214],[356875],{"type":23,"value":217},{"type":23,"value":356877}," account, we'll automatically provision a Sandbox environment.",{"type":17,"tag":29,"props":356879,"children":356880},{},[356881],{"type":17,"tag":133,"props":356882,"children":356885},{"href":356883,"rel":356884},"https://unified.to/blog/how_to_test_unified_apis_using_sandbox_connections",[214],[356886],{"type":23,"value":326638},{"type":17,"tag":68,"props":356888,"children":356890},{"id":356889},"_4-connection-health-status",[356891],{"type":23,"value":356892},"4. Connection health status",{"type":17,"tag":29,"props":356894,"children":356895},{},[356896],{"type":23,"value":356897},"We added health status to your user connections, so you can monitor the health of your active user connections. Troubleshoot user connection errors by reviewing your API logs. You'll see the following statuses:",{"type":17,"tag":80,"props":356899,"children":356900},{},[356901,356906,356911,356916],{"type":17,"tag":84,"props":356902,"children":356903},{},[356904],{"type":23,"value":356905},"New: A user connection has been recently established",{"type":17,"tag":84,"props":356907,"children":356908},{},[356909],{"type":23,"value":356910},"Healthy: Your user connection is functioning as expected",{"type":17,"tag":84,"props":356912,"children":356913},{},[356914],{"type":23,"value":356915},"Unhealthy: Your user connection has not seen a successful request",{"type":17,"tag":84,"props":356917,"children":356918},{},[356919],{"type":23,"value":356920},"Unhealthy now: Your user connection is currently experiencing an issue",{"type":17,"tag":11616,"props":356922,"children":356924},{"width":11618,"height":11619,"src":356923,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/sd9Efb4i9N0",[],{"type":17,"tag":68,"props":356926,"children":356928},{"id":356927},"_5-we-launched-140-integrations",[356929],{"type":23,"value":356930},"5. We launched 140+ integrations",{"type":17,"tag":29,"props":356932,"children":356933},{},[356934],{"type":23,"value":356935},"We now have 140+ pre-built integrations on our platform! For existing Unified.to users, once you activate a new integration, it will be added to your product automatically.",{"type":17,"tag":29,"props":356937,"children":356938},{},[356939],{"type":23,"value":354195},{"type":17,"tag":29,"props":356941,"children":356942},{},[356943,356952,356953],{"type":17,"tag":133,"props":356944,"children":356947},{"href":356945,"rel":356946},"https://unified.to/integrations/netsuite",[214],[356948],{"type":17,"tag":48,"props":356949,"children":356950},{},[356951],{"type":23,"value":13070},{"type":23,"value":18757},{"type":17,"tag":48,"props":356954,"children":356955},{},[356956],{"type":23,"value":356957},"(HR, CRM)",{"type":17,"tag":29,"props":356959,"children":356960},{},[356961],{"type":23,"value":356962},"NetSuite is a cloud-based business management software suite offering ERP, CRM, and e-commerce solutions. Access your customers' workforce and sales data.",{"type":17,"tag":29,"props":356964,"children":356965},{},[356966,356974,356975],{"type":17,"tag":133,"props":356967,"children":356969},{"href":330887,"rel":356968},[214],[356970],{"type":17,"tag":48,"props":356971,"children":356972},{},[356973],{"type":23,"value":13311},{"type":23,"value":18757},{"type":17,"tag":48,"props":356976,"children":356977},{},[356978],{"type":23,"value":342804},{"type":17,"tag":29,"props":356980,"children":356981},{},[356982],{"type":23,"value":356983},"GitHub is an AI-powered developer platform that allows you to create, store, manage and share code. Access your customers' GitHub repos and files just like any other cloud file storage system.",{"type":17,"tag":29,"props":356985,"children":356986},{},[356987,356997,356998],{"type":17,"tag":133,"props":356988,"children":356991},{"href":356989,"rel":356990},"https://unified.to/integrations/ukg_hr",[214],[356992],{"type":17,"tag":48,"props":356993,"children":356994},{},[356995],{"type":23,"value":356996},"UKG HR Service Delivery",{"type":23,"value":18757},{"type":17,"tag":48,"props":356999,"children":357000},{},[357001],{"type":23,"value":355525},{"type":17,"tag":29,"props":357003,"children":357004},{},[357005],{"type":23,"value":357006},"UKG is a leading provider of human capital management (HCM) software and workforce management solutions. Access your customers' workforce data (Employee, Group).",{"type":17,"tag":29,"props":357008,"children":357009},{},[357010,357019,357020],{"type":17,"tag":133,"props":357011,"children":357014},{"href":357012,"rel":357013},"https://unified.to/integrations/salesloft",[214],[357015],{"type":17,"tag":48,"props":357016,"children":357017},{},[357018],{"type":23,"value":31595},{"type":23,"value":18757},{"type":17,"tag":48,"props":357021,"children":357022},{},[357023],{"type":23,"value":357024},"(CRM, HR, Authentication)",{"type":17,"tag":29,"props":357026,"children":357027},{},[357028],{"type":23,"value":357029},"Salesloft is a leading sales engagement platform that helps companies automate and optimize their sales processes. Access your customers' selling and workforce data.",{"type":17,"tag":29,"props":357031,"children":357032},{},[357033,357042,357043],{"type":17,"tag":133,"props":357034,"children":357037},{"href":357035,"rel":357036},"https://unified.to/integrations/gong",[214],[357038],{"type":17,"tag":48,"props":357039,"children":357040},{},[357041],{"type":23,"value":31559},{"type":23,"value":18757},{"type":17,"tag":48,"props":357044,"children":357045},{},[357046],{"type":23,"value":357047},"(HR, Call Center)",{"type":17,"tag":29,"props":357049,"children":357050},{},[357051],{"type":23,"value":357052},"Gong is a revenue intelligence platform that uses AI to analyze sales calls and meetings to provide insights to sales teams. Access your customers' employee and call center data.",{"type":17,"tag":29,"props":357054,"children":357055},{},[357056,357065,357066],{"type":17,"tag":133,"props":357057,"children":357060},{"href":357058,"rel":357059},"https://unified.to/integrations/googledrive",[214],[357061],{"type":17,"tag":48,"props":357062,"children":357063},{},[357064],{"type":23,"value":28907},{"type":23,"value":18757},{"type":17,"tag":48,"props":357067,"children":357068},{},[357069],{"type":23,"value":357070},"(Storage)",{"type":17,"tag":29,"props":357072,"children":357073},{},[357074],{"type":23,"value":357075},"Google Drive is a cloud-based file storage and synchronization service. Access your customers' files and folders.",{"type":17,"tag":29,"props":357077,"children":357078},{},[357079,357087,357088],{"type":17,"tag":133,"props":357080,"children":357082},{"href":354522,"rel":357081},[214],[357083],{"type":17,"tag":48,"props":357084,"children":357085},{},[357086],{"type":23,"value":28915},{"type":23,"value":18757},{"type":17,"tag":48,"props":357089,"children":357090},{},[357091],{"type":23,"value":357092},"(Storage, Authentication)",{"type":17,"tag":29,"props":357094,"children":357095},{},[357096],{"type":23,"value":357097},"Dropbox is a cloud-based file storage and collaboration platform. Access your customers' files and folders.",{"type":17,"tag":29,"props":357099,"children":357100},{},[357101,357110,357111],{"type":17,"tag":133,"props":357102,"children":357105},{"href":357103,"rel":357104},"https://unified.to/integrations/box",[214],[357106],{"type":17,"tag":48,"props":357107,"children":357108},{},[357109],{"type":23,"value":28931},{"type":23,"value":18757},{"type":17,"tag":48,"props":357112,"children":357113},{},[357114],{"type":23,"value":357092},{"type":17,"tag":29,"props":357116,"children":357117},{},[357118],{"type":23,"value":357119},"Box provides cloud-based content management, collaboration, and file sharing tools. Access your customers' files and folders.",{"type":17,"tag":29,"props":357121,"children":357122},{},[357123,357133],{"type":17,"tag":133,"props":357124,"children":357127},{"href":357125,"rel":357126},"https://unified.to/integrations/microsoftonedrive",[214],[357128,357132],{"type":17,"tag":48,"props":357129,"children":357130},{},[357131],{"type":23,"value":28923},{"type":23,"value":18757},{"type":17,"tag":48,"props":357134,"children":357135},{},[357136],{"type":23,"value":357092},{"type":17,"tag":29,"props":357138,"children":357139},{},[357140],{"type":23,"value":357141},"Microsoft OneDrive is a cloud-based file storage and synchronization service. Access your customers' files and folders.",{"type":17,"tag":29,"props":357143,"children":357144},{},[357145,357154,357155],{"type":17,"tag":133,"props":357146,"children":357149},{"href":357147,"rel":357148},"https://unified.to/integrations/awss3",[214],[357150],{"type":17,"tag":48,"props":357151,"children":357152},{},[357153],{"type":23,"value":28939},{"type":23,"value":18757},{"type":17,"tag":48,"props":357156,"children":357157},{},[357158],{"type":23,"value":357070},{"type":17,"tag":29,"props":357160,"children":357161},{},[357162],{"type":23,"value":357163},"Amazon S3 is a service offered by Amazon Web Services that provides object storage. Access your customers' files and folders.",{"type":17,"tag":68,"props":357165,"children":357167},{"id":357166},"_6-we-partnered-with-workable",[357168],{"type":23,"value":357169},"6. We partnered with Workable",{"type":17,"tag":29,"props":357171,"children":357172},{},[357173],{"type":23,"value":357174},"We partnered with Workable to bring you the easiest way to support Workable and similar integrations (ATS and HR) in your product. You can also now find support for Employee (read) and Group (read) in our pre-built Workable integration.",{"type":17,"tag":29,"props":357176,"children":357177},{},[357178],{"type":17,"tag":133,"props":357179,"children":357182},{"href":357180,"rel":357181},"https://partners.workable.com/unified",[214],[357183],{"type":23,"value":357184},"Go to Workable marketplace ",{"type":17,"tag":29,"props":357186,"children":357187},{},[357188],{"type":17,"tag":133,"props":357189,"children":357192},{"href":357190,"rel":357191},"https://unified.to/blog/getting_started_with_workable",[214],[357193],{"type":23,"value":357194},"Read our Workable set-up guide",{"type":17,"tag":68,"props":357196,"children":357198},{"id":357197},"_7-guide-build-a-candidate-sourcing-or-job-board-app",[357199],{"type":23,"value":357200},"7. Guide: Build a candidate sourcing or job board app",{"type":17,"tag":29,"props":357202,"children":357203},{},[357204],{"type":23,"value":357205},"In this developer guide, we'll walk through how to build a candidate sourcing or job board application that uses our unified ATS API.",{"type":17,"tag":29,"props":357207,"children":357208},{},[357209],{"type":17,"tag":133,"props":357210,"children":357213},{"href":357211,"rel":357212},"https://unified.to/blog/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified",[214],[357214],{"type":23,"value":342724},{"type":17,"tag":68,"props":357216,"children":357218},{"id":357217},"_8-guide-build-an-invoicing-app",[357219],{"type":23,"value":357220},"8. Guide: Build an invoicing app",{"type":17,"tag":29,"props":357222,"children":357223},{},[357224],{"type":23,"value":357225},"In this developer guide, we'll walk through how to build an invoicing application that uses our unified accounting API.",{"type":17,"tag":29,"props":357227,"children":357228},{},[357229],{"type":17,"tag":133,"props":357230,"children":357233},{"href":357231,"rel":357232},"https://unified.to/blog/how_to_build_an_invoicing_system_with_unified",[214],[357234],{"type":23,"value":342724},{"type":17,"tag":68,"props":357236,"children":357238},{"id":357237},"_9-unifiedto-is-a-sxsw-finalist",[357239],{"type":23,"value":357240},"9. Unified.to is a SXSW finalist",{"type":17,"tag":29,"props":357242,"children":357243},{},[357244],{"type":23,"value":357245},"We're excited to share that Unified.to is coming to the 16th annual SXSW festival this year as a pitch competition finalist. We are one of five companies selected to pitch and the only Canadian company. If you'll be in Austin, Texas from March 9-10 and want to geek out about APIs with us, get in touch.",{"type":17,"tag":29,"props":357247,"children":357248},{},[357249],{"type":17,"tag":133,"props":357250,"children":357252},{"href":355811,"rel":357251},[214],[357253],{"type":23,"value":357254},"Read the press release",{"type":17,"tag":29,"props":357256,"children":357257},{},[357258],{"type":17,"tag":133,"props":357259,"children":357261},{"href":327897,"rel":357260},[214],[357262],{"type":23,"value":357263},"Follow us on LinkedIn ",{"title":7,"searchDepth":1629,"depth":1629,"links":357265},[357266,357267,357268,357269,357270,357271,357272,357273,357274],{"id":356772,"depth":1629,"text":356775},{"id":356831,"depth":1629,"text":356834},{"id":356862,"depth":1629,"text":356865},{"id":356889,"depth":1629,"text":356892},{"id":356927,"depth":1629,"text":356930},{"id":357166,"depth":1629,"text":357169},{"id":357197,"depth":1629,"text":357200},{"id":357217,"depth":1629,"text":357220},{"id":357237,"depth":1629,"text":357240},"content:blog:unified_jan_2024_product_updates.md","blog/unified_jan_2024_product_updates.md","blog/unified_jan_2024_product_updates",{"_path":357279,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":357280,"description":357281,"img":357282,"date":357283,"tag":6341,"body":357284,"_type":1677,"_id":357759,"_source":1679,"_file":357760,"_stem":357761,"_extension":1682},"/blog/getting_started_with_workable","Getting started with Workable","Workable is one of 190+ integrations that you no longer have to build from scratch thanks to our unified API developer platform. In this guide, you will learn...","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-icon.png","2024-01-11T00:00:00.000Z",{"type":14,"children":357285,"toc":357751},[357286,357291,357294,357302,357321,357326,357330,357350,357362,357368,357373,357397,357405,357412,357428,357436,357443,357454,357462,357502,357509,357519,357527,357546,357552,357557,357568,357574,357586,357591,357599,357604,357624,357630,357635,357640,357644,357653,357659,357664,357695,357700,357704,357717,357733],{"type":17,"tag":18,"props":357287,"children":357289},{"id":357288},"getting-started-with-workable",[357290],{"type":23,"value":357280},{"type":17,"tag":25,"props":357292,"children":357293},{},[],{"type":17,"tag":29,"props":357295,"children":357296},{},[357297],{"type":17,"tag":33,"props":357298,"children":357299},{},[357300],{"type":23,"value":357301},"January 11, 2024",{"type":17,"tag":29,"props":357303,"children":357304},{},[357305,357307,357311,357313,357319],{"type":23,"value":357306},"Workable is one of 190+ integrations that you no longer have to build from scratch thanks to our ",{"type":17,"tag":133,"props":357308,"children":357309},{"href":7691},[357310],{"type":23,"value":7459},{"type":23,"value":357312}," developer platform. In this guide, you will learn about Unified.to's ",{"type":17,"tag":133,"props":357314,"children":357316},{"href":337828,"rel":357315},[214],[357317],{"type":23,"value":357318},"Workable integration",{"type":23,"value":357320},", including how to activate Workable, implementation steps, example use cases, and how your users can authorize the integration in your app.",{"type":17,"tag":29,"props":357322,"children":357323},{},[357324],{"type":23,"value":357325},"At the end of this guide, you will have everything you need to activate a Workable integration and begin creating user connections in production.",{"type":17,"tag":68,"props":357327,"children":357328},{"id":141798},[357329],{"type":23,"value":141801},{"type":17,"tag":29,"props":357331,"children":357332},{},[357333,357335,357341,357343,357349],{"type":23,"value":357334},"To activate a Workable integration, you will need a Unified.to account. ",{"type":17,"tag":133,"props":357336,"children":357338},{"href":1612,"rel":357337},[214],[357339],{"type":23,"value":357340},"Sign up for a free tester account",{"type":23,"value":357342}," and follow the onboarding steps. Workable and all our pre-built integrations are available on every ",{"type":17,"tag":133,"props":357344,"children":357346},{"href":324400,"rel":357345},[214],[357347],{"type":23,"value":357348},"Unified.to plan",{"type":23,"value":54},{"type":17,"tag":29,"props":357351,"children":357352},{},[357353,357355,357360],{"type":23,"value":357354},"This article assumes you are familiar with ",{"type":17,"tag":133,"props":357356,"children":357358},{"href":56560,"rel":357357},[214],[357359],{"type":23,"value":56564},{"type":23,"value":357361}," and product integration concepts. You do not have to be an expert in integration development or our platform.",{"type":17,"tag":68,"props":357363,"children":357365},{"id":357364},"activating-workable",[357366],{"type":23,"value":357367},"Activating Workable",{"type":17,"tag":29,"props":357369,"children":357370},{},[357371],{"type":23,"value":357372},"Once you've created your Unified.to account and completed onboarding, you can activate Workable and any other integrations you'd like to add to your app. Activation refers to the process of enabling and configuring an integration.",{"type":17,"tag":29,"props":357374,"children":357375},{},[357376,357378,357383,357385,357389,357391,357395],{"type":23,"value":357377},"Sign in to Unified.to, and select ",{"type":17,"tag":48,"props":357379,"children":357380},{},[357381],{"type":23,"value":357382},"Integrations > Active Integrations",{"type":23,"value":357384},". Use the search bar or click the ",{"type":17,"tag":48,"props":357386,"children":357387},{},[357388],{"type":23,"value":11756},{"type":23,"value":357390}," tab to find Workable and other integrations within the same category. You can also locate Workable in the ",{"type":17,"tag":48,"props":357392,"children":357393},{},[357394],{"type":23,"value":101761},{"type":23,"value":357396}," tab if you are interested in HR data.",{"type":17,"tag":29,"props":357398,"children":357399},{},[357400],{"type":17,"tag":6438,"props":357401,"children":357404},{"alt":357402,"src":357403},"Search_Workable_in_Unified.to.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-0.png",[],{"type":17,"tag":29,"props":357406,"children":357407},{},[357408],{"type":17,"tag":48,"props":357409,"children":357410},{},[357411],{"type":23,"value":7306},{"type":17,"tag":29,"props":357413,"children":357414},{},[357415,357416,357420,357422,357426],{"type":23,"value":42950},{"type":17,"tag":48,"props":357417,"children":357418},{},[357419],{"type":23,"value":56564},{"type":23,"value":357421}," to begin the activation process. On the authorization page, you can specify the integration categories (ATS or HR) and the authorization method (API key or ",{"type":17,"tag":133,"props":357423,"children":357424},{"href":779},[357425],{"type":23,"value":782},{"type":23,"value":357427}," 2). If you'd like your Workable integration to support OAuth 2, you will need to enter your OAuth 2 Client ID.",{"type":17,"tag":29,"props":357429,"children":357430},{},[357431],{"type":17,"tag":6438,"props":357432,"children":357435},{"alt":357433,"src":357434},"Workable_authorization.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-1.png",[],{"type":17,"tag":29,"props":357437,"children":357438},{},[357439],{"type":17,"tag":48,"props":357440,"children":357441},{},[357442],{"type":23,"value":341213},{"type":17,"tag":29,"props":357444,"children":357445},{},[357446,357448,357452],{"type":23,"value":357447},"If you want your Workable integration to support OAuth 2, select the ",{"type":17,"tag":48,"props":357449,"children":357450},{},[357451],{"type":23,"value":341213},{"type":23,"value":357453}," tab to view where to set your OAuth2 redirectUri to and the unified scopes to enable in your application. You may need all or some depending on your use case.",{"type":17,"tag":29,"props":357455,"children":357456},{},[357457],{"type":17,"tag":6438,"props":357458,"children":357461},{"alt":357459,"src":357460},"Workable_OAuth_2_Credentials.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-2.png",[],{"type":17,"tag":29,"props":357463,"children":357464},{},[357465,357467,357474,357476,357480,357482,357486,357488,357494,357496,357501],{"type":23,"value":357466},"If you don't yet have your Workable OAUth 2 credentials, fill out ",{"type":17,"tag":133,"props":357468,"children":357471},{"href":357469,"rel":357470},"https://www.workable.com/partnership-program/apply?utm_source=unified.to&utm_medium=unified.to%20blog&utm_campaign=unifedto_partner",[214],[357472],{"type":23,"value":357473},"this form",{"type":23,"value":357475}," to start a Workable partnership and generate your credentials. Return to the ",{"type":17,"tag":48,"props":357477,"children":357478},{},[357479],{"type":23,"value":7306},{"type":23,"value":357481}," tab, paste your credentials, and select ",{"type":17,"tag":48,"props":357483,"children":357484},{},[357485],{"type":23,"value":6634},{"type":23,"value":357487},". If you need support with your Workable partnership, please email ",{"type":17,"tag":133,"props":357489,"children":357491},{"href":357490},"mailto:hello@unified.to",[357492],{"type":23,"value":357493},"hello@unified.to",{"type":23,"value":357495}," or reach out on ",{"type":17,"tag":133,"props":357497,"children":357499},{"href":326013,"rel":357498},[214],[357500],{"type":23,"value":15720},{"type":23,"value":54},{"type":17,"tag":29,"props":357503,"children":357504},{},[357505],{"type":17,"tag":48,"props":357506,"children":357507},{},[357508],{"type":23,"value":339932},{"type":17,"tag":29,"props":357510,"children":357511},{},[357512,357513,357517],{"type":23,"value":6673},{"type":17,"tag":48,"props":357514,"children":357515},{},[357516],{"type":23,"value":211607},{"type":23,"value":357518}," tab to view a detailed breakdown of the objects and fields our Workable integration currently supports. Green represents fields we support, grey represents fields Workable does not support, and the fields in red are the features we don't support yet.",{"type":17,"tag":29,"props":357520,"children":357521},{},[357522],{"type":17,"tag":6438,"props":357523,"children":357526},{"alt":357524,"src":357525},"Workable_feature_support_preview.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-3.png",[],{"type":17,"tag":29,"props":357528,"children":357529},{},[357530,357532,357537,357539,357545],{"type":23,"value":357531},"We're always open to feedback. If you have questions or ideas, reach out on ",{"type":17,"tag":133,"props":357533,"children":357535},{"href":326013,"rel":357534},[214],[357536],{"type":23,"value":15720},{"type":23,"value":357538},". To see full feature support for Workable, ",{"type":17,"tag":133,"props":357540,"children":357542},{"href":1612,"rel":357541},[214],[357543],{"type":23,"value":357544},"sign in or sign up for Unified.to for free",{"type":23,"value":54},{"type":17,"tag":68,"props":357547,"children":357549},{"id":357548},"your-workspace",[357550],{"type":23,"value":357551},"Your workspace",{"type":17,"tag":29,"props":357553,"children":357554},{},[357555],{"type":23,"value":357556},"When you create a Unified.to account, we automatically create a workspace for you. This will be true for any team members in your company that individually sign up for Unified.to. You can create multiple workspaces for different environments (QA, staging, production, etc.) with unique access and configuration rules.",{"type":17,"tag":29,"props":357558,"children":357559},{},[357560,357562,357567],{"type":23,"value":357561},"You will need to know your workspace ID when using our embedded authorization widget. You can find your workspace ID under ",{"type":17,"tag":48,"props":357563,"children":357564},{},[357565],{"type":23,"value":357566},"Settings > API Information",{"type":23,"value":54},{"type":17,"tag":68,"props":357569,"children":357571},{"id":357570},"setting-up-authorization",[357572],{"type":23,"value":357573},"Setting up authorization",{"type":17,"tag":29,"props":357575,"children":357576},{},[357577,357579,357584],{"type":23,"value":357578},"To add Workable and other integrations to your app, navigate to ",{"type":17,"tag":48,"props":357580,"children":357581},{},[357582],{"type":23,"value":357583},"Settings > Embed",{"type":23,"value":357585}," to set up user authorization. Configure your authorization settings and copy the line of code to insert the embedded authorization widget into your app along with your workspace ID.",{"type":17,"tag":29,"props":357587,"children":357588},{},[357589],{"type":23,"value":357590},"If you do not wish to use our authorization widget, you can call our API directly to get a list of integrations to display in your app and build your own front-end.",{"type":17,"tag":29,"props":357592,"children":357593},{},[357594],{"type":17,"tag":6438,"props":357595,"children":357598},{"alt":357596,"src":357597},"Embedded_authorization.png","https://s3.us-east-2.amazonaws.com/unified-article-images/getting_started_with_workable-4.png",[],{"type":17,"tag":29,"props":357600,"children":357601},{},[357602],{"type":23,"value":357603},"You can also interact with the authorization preview to simulate your end user's Workable authorization experience. You'll see the same authorization page that your end user will experience when they enable an integration in your app.",{"type":17,"tag":29,"props":357605,"children":357606},{},[357607,357609,357616,357618,357623],{"type":23,"value":357608},"You can run further authorization tests by adding a ",{"type":17,"tag":133,"props":357610,"children":357613},{"href":357611,"rel":357612},"https://unified.to/blog/start_here_how_to_add_a_test_connection",[214],[357614],{"type":23,"value":357615},"test user connection",{"type":23,"value":357617}," or by using our ",{"type":17,"tag":133,"props":357619,"children":357621},{"href":356883,"rel":357620},[214],[357622],{"type":23,"value":329494},{"type":23,"value":54},{"type":17,"tag":68,"props":357625,"children":357627},{"id":357626},"creating-user-connections",[357628],{"type":23,"value":357629},"Creating user connections",{"type":17,"tag":29,"props":357631,"children":357632},{},[357633],{"type":23,"value":357634},"Once a customer authorizes a Workable integration from your app, they are redirected to the success URL that you defined earlier when setting up authorization.",{"type":17,"tag":29,"props":357636,"children":357637},{},[357638],{"type":23,"value":357639},"That URL will have an id={connection_id} appended to the URL. Store that connection_id in your database and associate it with your customer's account. You can also send in a state query parameter with your customer's ID.",{"type":17,"tag":11616,"props":357641,"children":357643},{"width":11618,"height":11619,"src":357642,"title":11621,"frameBorder":11622,"allow":11623,"allowFullScreen":11625},"https://www.youtube.com/embed/sd9Efb4i9N0?si=f-ztv2g3nFdRiq_S",[],{"type":17,"tag":29,"props":357645,"children":357646},{},[357647,357651],{"type":17,"tag":48,"props":357648,"children":357649},{},[357650],{"type":23,"value":19907},{"type":23,"value":357652}," Make sure you associate your app's user ID/account ID with the newly created Unified.to connection ID. We recommend using the state parameter in our embedded authorization widget or authorization endpoint. That state will be sent back to your success_url along with the connection_id. Store our connection_id in your database and associate it with your user.",{"type":17,"tag":68,"props":357654,"children":357656},{"id":357655},"perform-actions-with-your-user-connections",[357657],{"type":23,"value":357658},"Perform actions with your user connections",{"type":17,"tag":29,"props":357660,"children":357661},{},[357662],{"type":23,"value":357663},"Here's the exciting part! Once your user authorizes your Workable integration, you can start accessing our API with your user connections. User connections represent a specific authentication of an integration, which means you can now:",{"type":17,"tag":80,"props":357665,"children":357666},{},[357667,357672,357677],{"type":17,"tag":84,"props":357668,"children":357669},{},[357670],{"type":23,"value":357671},"Access your customers' third-party data in Workable",{"type":17,"tag":84,"props":357673,"children":357674},{},[357675],{"type":23,"value":357676},"Build new features and support more users",{"type":17,"tag":84,"props":357678,"children":357679},{},[357680,357682,357688,357689],{"type":23,"value":357681},"Leverage Workable data to support use cases like ",{"type":17,"tag":133,"props":357683,"children":357685},{"href":357211,"rel":357684},[214],[357686],{"type":23,"value":357687},"candidate sourcing",{"type":23,"value":34435},{"type":17,"tag":133,"props":357690,"children":357692},{"href":278898,"rel":357691},[214],[357693],{"type":23,"value":357694},"candidate assessments",{"type":17,"tag":29,"props":357696,"children":357697},{},[357698],{"type":23,"value":357699},"If you'd like to simulate performing actions with user connections, you can create user connections in our Sandbox environment.",{"type":17,"tag":11616,"props":357701,"children":357703},{"width":11618,"height":11619,"src":357702,"title":11621,"frameBorder":11622,"allow":11623,"allowFullScreen":11625},"https://www.youtube.com/embed/jA6_Dot5kN0?si=jRPZqnVkIoq6YYKP",[],{"type":17,"tag":29,"props":357705,"children":357706},{},[357707,357709,357716],{"type":23,"value":357708},"Pass 'X-Mock: 1' in a header in your API request to receive mock data from our API. ",{"type":17,"tag":133,"props":357710,"children":357713},{"href":357711,"rel":357712},"https://docs.unified.to/overview/restapi/mock",[214],[357714],{"type":23,"value":357715},"See documentation",{"type":23,"value":54},{"type":17,"tag":29,"props":357718,"children":357719},{},[357720,357724,357726,357732],{"type":17,"tag":48,"props":357721,"children":357722},{},[357723],{"type":23,"value":103346},{"type":23,"value":357725}," We have SDKs available for Node/Typescript, Python, PHP, Java, Go, C#, and Ruby. ",{"type":17,"tag":133,"props":357727,"children":357730},{"href":357728,"rel":357729},"https://docs.unified.to/overview/sdks",[214],[357731],{"type":23,"value":342724},{"type":23,"value":54},{"type":17,"tag":29,"props":357734,"children":357735},{},[357736,357738,357743,357745,357750],{"type":23,"value":357737},"Have a question for us? Complete ",{"type":17,"tag":133,"props":357739,"children":357741},{"href":215330,"rel":357740},[214],[357742],{"type":23,"value":357473},{"type":23,"value":357744}," or chat with us directly on ",{"type":17,"tag":133,"props":357746,"children":357748},{"href":326013,"rel":357747},[214],[357749],{"type":23,"value":15720},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":357752},[357753,357754,357755,357756,357757,357758],{"id":141798,"depth":1629,"text":141801},{"id":357364,"depth":1629,"text":357367},{"id":357548,"depth":1629,"text":357551},{"id":357570,"depth":1629,"text":357573},{"id":357626,"depth":1629,"text":357629},{"id":357655,"depth":1629,"text":357658},"content:blog:getting_started_with_workable.md","blog/getting_started_with_workable.md","blog/getting_started_with_workable",{"_path":357763,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":357764,"description":357765,"img":357766,"date":357767,"tag":12,"body":357768,"_type":1677,"_id":358403,"_source":1679,"_file":358404,"_stem":358405,"_extension":1682},"/blog/replace_polling_with_unified_webhooks_real_time_and_historical_data_in_one_flow","Replace Polling with Unified Webhooks: Real-Time and Historical Data in One Flow","Unified webhooks now support initial backfill and ongoing updates through a single subscription.","https://s3.us-east-2.amazonaws.com/unified-article-images/replace_polling_with_unified_webhooks_real_time_and_historical_data_in_one_flow-icon.png","2024-01-10T00:00:00.000Z",{"type":14,"children":357769,"toc":358389},[357770,357775,357778,357786,357794,357810,357814,357832,357837,357850,357856,357867,357912,357918,357923,357932,357937,357958,357963,357978,357983,358001,358006,358010,358028,358034,358039,358063,358068,358074,358079,358092,358097,358114,358120,358125,358130,358147,358153,358158,358166,358184,358192,358210,358216,358221,358239,358244,358262,358268,358280,358288,358301,358309,358317,358322,358326,358331,358354,358358,358363,358368,358384],{"type":17,"tag":18,"props":357771,"children":357773},{"id":357772},"replace-polling-with-unified-webhooks-real-time-and-historical-data-in-one-flow",[357774],{"type":23,"value":357764},{"type":17,"tag":25,"props":357776,"children":357777},{},[],{"type":17,"tag":29,"props":357779,"children":357780},{},[357781],{"type":17,"tag":33,"props":357782,"children":357783},{},[357784],{"type":23,"value":357785},"January 10, 2024",{"type":17,"tag":29,"props":357787,"children":357788},{},[357789],{"type":17,"tag":6438,"props":357790,"children":357793},{"alt":357791,"src":357792},"Unified.to_webhooks_enhancements.png","https://s3.us-east-2.amazonaws.com/unified-article-images/replace_polling_with_unified_webhooks_real_time_and_historical_data_in_one_flow-0.png",[],{"type":17,"tag":29,"props":357795,"children":357796},{},[357797,357798,357802,357804,357809],{"type":23,"value":86959},{"type":17,"tag":133,"props":357799,"children":357800},{"href":4999},[357801],{"type":23,"value":5002},{"type":23,"value":357803}," now support ",{"type":17,"tag":48,"props":357805,"children":357806},{},[357807],{"type":23,"value":357808},"initial backfill and ongoing updates through a single subscription",{"type":23,"value":54},{"type":17,"tag":29,"props":357811,"children":357812},{},[357813],{"type":23,"value":2919},{"type":17,"tag":80,"props":357815,"children":357816},{},[357817,357822,357827],{"type":17,"tag":84,"props":357818,"children":357819},{},[357820],{"type":23,"value":357821},"build separate sync jobs for historical data",{"type":17,"tag":84,"props":357823,"children":357824},{},[357825],{"type":23,"value":357826},"manage polling infrastructure",{"type":17,"tag":84,"props":357828,"children":357829},{},[357830],{"type":23,"value":357831},"stitch together backfill + incremental pipelines",{"type":17,"tag":29,"props":357833,"children":357834},{},[357835],{"type":23,"value":357836},"You can now subscribe once and receive:",{"type":17,"tag":80,"props":357838,"children":357839},{},[357840,357845],{"type":17,"tag":84,"props":357841,"children":357842},{},[357843],{"type":23,"value":357844},"existing records (initial sync)",{"type":17,"tag":84,"props":357846,"children":357847},{},[357848],{"type":23,"value":357849},"new and updated records (ongoing events)",{"type":17,"tag":68,"props":357851,"children":357853},{"id":357852},"what-changed",[357854],{"type":23,"value":357855},"What changed",{"type":17,"tag":29,"props":357857,"children":357858},{},[357859,357861,357865],{"type":23,"value":357860},"This release expands ",{"type":17,"tag":133,"props":357862,"children":357863},{"href":9007},[357864],{"type":23,"value":46572},{"type":23,"value":357866}," into a complete data delivery layer:",{"type":17,"tag":80,"props":357868,"children":357869},{},[357870,357875,357892,357897,357902,357907],{"type":17,"tag":84,"props":357871,"children":357872},{},[357873],{"type":23,"value":357874},"historical data delivered through webhooks",{"type":17,"tag":84,"props":357876,"children":357877},{},[357878,357880,357885,357886,357891],{"type":23,"value":357879},"configurable event types (",{"type":17,"tag":6121,"props":357881,"children":357883},{"className":357882},[],[357884],{"type":23,"value":109207},{"type":23,"value":11826},{"type":17,"tag":6121,"props":357887,"children":357889},{"className":357888},[],[357890],{"type":23,"value":109214},{"type":23,"value":12034},{"type":17,"tag":84,"props":357893,"children":357894},{},[357895],{"type":23,"value":357896},"field-level payload control",{"type":17,"tag":84,"props":357898,"children":357899},{},[357900],{"type":23,"value":357901},"configurable detection intervals",{"type":17,"tag":84,"props":357903,"children":357904},{},[357905],{"type":23,"value":357906},"manual trigger support for testing",{"type":17,"tag":84,"props":357908,"children":357909},{},[357910],{"type":23,"value":357911},"webhook observability (audit trail + health status)",{"type":17,"tag":68,"props":357913,"children":357915},{"id":357914},"_1-historical-data-via-webhooks-initial-sync",[357916],{"type":23,"value":357917},"1. Historical data via webhooks (initial sync)",{"type":17,"tag":29,"props":357919,"children":357920},{},[357921],{"type":23,"value":357922},"You can now retrieve existing data through webhooks by setting:",{"type":17,"tag":6893,"props":357924,"children":357927},{"className":357925,"code":357926,"language":20901,"meta":23},[20899],"include_all=true\n",[357928],{"type":17,"tag":6121,"props":357929,"children":357930},{"__ignoreMap":7},[357931],{"type":23,"value":357926},{"type":17,"tag":29,"props":357933,"children":357934},{},[357935],{"type":23,"value":357936},"Instead of:",{"type":17,"tag":80,"props":357938,"children":357939},{},[357940,357945,357953],{"type":17,"tag":84,"props":357941,"children":357942},{},[357943],{"type":23,"value":357944},"calling list endpoints",{"type":17,"tag":84,"props":357946,"children":357947},{},[357948,357949],{"type":23,"value":66225},{"type":17,"tag":133,"props":357950,"children":357951},{"href":1857},[357952],{"type":23,"value":1860},{"type":17,"tag":84,"props":357954,"children":357955},{},[357956],{"type":23,"value":357957},"storing checkpoints",{"type":17,"tag":29,"props":357959,"children":357960},{},[357961],{"type":23,"value":357962},"Unified handles:",{"type":17,"tag":80,"props":357964,"children":357965},{},[357966,357970,357974],{"type":17,"tag":84,"props":357967,"children":357968},{},[357969],{"type":23,"value":1860},{"type":17,"tag":84,"props":357971,"children":357972},{},[357973],{"type":23,"value":138},{"type":17,"tag":84,"props":357975,"children":357976},{},[357977],{"type":23,"value":79677},{"type":17,"tag":29,"props":357979,"children":357980},{},[357981],{"type":23,"value":357982},"Your endpoint receives paged data until backfill completes, then transitions automatically to incremental updates.",{"type":17,"tag":68,"props":357984,"children":357986},{"id":357985},"_2-separate-event-types-created-updated",[357987,357989,357994,357995,358000],{"type":23,"value":357988},"2. Separate event types (",{"type":17,"tag":6121,"props":357990,"children":357992},{"className":357991},[],[357993],{"type":23,"value":109207},{"type":23,"value":11826},{"type":17,"tag":6121,"props":357996,"children":357998},{"className":357997},[],[357999],{"type":23,"value":109214},{"type":23,"value":12034},{"type":17,"tag":29,"props":358002,"children":358003},{},[358004],{"type":23,"value":358005},"Webhooks can now be scoped to specific event types.",{"type":17,"tag":29,"props":358007,"children":358008},{},[358009],{"type":23,"value":22801},{"type":17,"tag":80,"props":358011,"children":358012},{},[358013,358018,358023],{"type":17,"tag":84,"props":358014,"children":358015},{},[358016],{"type":23,"value":358017},"isolate insert vs update logic",{"type":17,"tag":84,"props":358019,"children":358020},{},[358021],{"type":23,"value":358022},"simplify downstream processing",{"type":17,"tag":84,"props":358024,"children":358025},{},[358026],{"type":23,"value":358027},"improve observability in logs and audit trails",{"type":17,"tag":68,"props":358029,"children":358031},{"id":358030},"_3-field-level-payload-control",[358032],{"type":23,"value":358033},"3. Field-level payload control",{"type":17,"tag":29,"props":358035,"children":358036},{},[358037],{"type":23,"value":358038},"You can define which fields are included in webhook payloads.",{"type":17,"tag":80,"props":358040,"children":358041},{},[358042,358053],{"type":17,"tag":84,"props":358043,"children":358044},{},[358045,358047,358052],{"type":23,"value":358046},"default: all fields (excluding ",{"type":17,"tag":6121,"props":358048,"children":358050},{"className":358049},[],[358051],{"type":23,"value":62389},{"type":23,"value":12034},{"type":17,"tag":84,"props":358054,"children":358055},{},[358056,358058],{"type":23,"value":358057},"optional: pass a subset via ",{"type":17,"tag":6121,"props":358059,"children":358061},{"className":358060},[],[358062],{"type":23,"value":39759},{"type":17,"tag":29,"props":358064,"children":358065},{},[358066],{"type":23,"value":358067},"This reduces payload size and unnecessary processing.",{"type":17,"tag":68,"props":358069,"children":358071},{"id":358070},"_4-configurable-detection-intervals",[358072],{"type":23,"value":358073},"4. Configurable detection intervals",{"type":17,"tag":29,"props":358075,"children":358076},{},[358077],{"type":23,"value":358078},"Virtual webhook intervals are configurable per connection:",{"type":17,"tag":80,"props":358080,"children":358081},{},[358082,358087],{"type":17,"tag":84,"props":358083,"children":358084},{},[358085],{"type":23,"value":358086},"free tier: ~60 minutes",{"type":17,"tag":84,"props":358088,"children":358089},{},[358090],{"type":23,"value":358091},"paid plans: as frequent as ~1 minute",{"type":17,"tag":29,"props":358093,"children":358094},{},[358095],{"type":23,"value":358096},"This allows you to balance:",{"type":17,"tag":80,"props":358098,"children":358099},{},[358100,358105,358109],{"type":17,"tag":84,"props":358101,"children":358102},{},[358103],{"type":23,"value":358104},"freshness requirements",{"type":17,"tag":84,"props":358106,"children":358107},{},[358108],{"type":23,"value":249336},{"type":17,"tag":84,"props":358110,"children":358111},{},[358112],{"type":23,"value":358113},"product experience",{"type":17,"tag":68,"props":358115,"children":358117},{"id":358116},"_5-manual-trigger-for-testing",[358118],{"type":23,"value":358119},"5. Manual trigger for testing",{"type":17,"tag":29,"props":358121,"children":358122},{},[358123],{"type":23,"value":358124},"Webhooks can be triggered on demand.",{"type":17,"tag":29,"props":358126,"children":358127},{},[358128],{"type":23,"value":358129},"This removes the need to wait for scheduled intervals when:",{"type":17,"tag":80,"props":358131,"children":358132},{},[358133,358137,358142],{"type":17,"tag":84,"props":358134,"children":358135},{},[358136],{"type":23,"value":45606},{"type":17,"tag":84,"props":358138,"children":358139},{},[358140],{"type":23,"value":358141},"validating payloads",{"type":17,"tag":84,"props":358143,"children":358144},{},[358145],{"type":23,"value":358146},"debugging delivery",{"type":17,"tag":68,"props":358148,"children":358150},{"id":358149},"_6-webhook-observability-audit-trail-health",[358151],{"type":23,"value":358152},"6. Webhook observability (audit trail + health)",{"type":17,"tag":29,"props":358154,"children":358155},{},[358156],{"type":23,"value":358157},"You now have visibility into webhook execution:",{"type":17,"tag":29,"props":358159,"children":358160},{},[358161],{"type":17,"tag":48,"props":358162,"children":358163},{},[358164],{"type":23,"value":358165},"Audit trail",{"type":17,"tag":80,"props":358167,"children":358168},{},[358169,358174,358179],{"type":17,"tag":84,"props":358170,"children":358171},{},[358172],{"type":23,"value":358173},"recent runs",{"type":17,"tag":84,"props":358175,"children":358176},{},[358177],{"type":23,"value":358178},"records delivered",{"type":17,"tag":84,"props":358180,"children":358181},{},[358182],{"type":23,"value":358183},"execution history",{"type":17,"tag":29,"props":358185,"children":358186},{},[358187],{"type":17,"tag":48,"props":358188,"children":358189},{},[358190],{"type":23,"value":358191},"Health status",{"type":17,"tag":80,"props":358193,"children":358194},{},[358195,358200,358205],{"type":17,"tag":84,"props":358196,"children":358197},{},[358198],{"type":23,"value":358199},"indicates delivery reliability",{"type":17,"tag":84,"props":358201,"children":358202},{},[358203],{"type":23,"value":358204},"surfaces persistent failures",{"type":17,"tag":84,"props":358206,"children":358207},{},[358208],{"type":23,"value":358209},"backed by retry logic and backoff handling",{"type":17,"tag":68,"props":358211,"children":358213},{"id":358212},"what-this-replaces",[358214],{"type":23,"value":358215},"What this replaces",{"type":17,"tag":29,"props":358217,"children":358218},{},[358219],{"type":23,"value":358220},"Before:",{"type":17,"tag":80,"props":358222,"children":358223},{},[358224,358229,358234],{"type":17,"tag":84,"props":358225,"children":358226},{},[358227],{"type":23,"value":358228},"polling jobs for backfill",{"type":17,"tag":84,"props":358230,"children":358231},{},[358232],{"type":23,"value":358233},"separate pipelines for historical vs incremental data",{"type":17,"tag":84,"props":358235,"children":358236},{},[358237],{"type":23,"value":358238},"custom retry + pagination handling",{"type":17,"tag":29,"props":358240,"children":358241},{},[358242],{"type":23,"value":358243},"After:",{"type":17,"tag":80,"props":358245,"children":358246},{},[358247,358252,358257],{"type":17,"tag":84,"props":358248,"children":358249},{},[358250],{"type":23,"value":358251},"a single webhook subscription",{"type":17,"tag":84,"props":358253,"children":358254},{},[358255],{"type":23,"value":358256},"one event stream",{"type":17,"tag":84,"props":358258,"children":358259},{},[358260],{"type":23,"value":358261},"no polling infrastructure",{"type":17,"tag":68,"props":358263,"children":358265},{"id":358264},"billing-overview",[358266],{"type":23,"value":358267},"Billing overview",{"type":17,"tag":29,"props":358269,"children":358270},{},[358271,358273,358278],{"type":23,"value":358272},"Virtual webhooks are billed based on ",{"type":17,"tag":48,"props":358274,"children":358275},{},[358276],{"type":23,"value":358277},"data retrieved and processed",{"type":23,"value":358279},", not empty intervals.",{"type":17,"tag":29,"props":358281,"children":358282},{},[358283],{"type":17,"tag":48,"props":358284,"children":358285},{},[358286],{"type":23,"value":358287},"Billable",{"type":17,"tag":80,"props":358289,"children":358290},{},[358291,358296],{"type":17,"tag":84,"props":358292,"children":358293},{},[358294],{"type":23,"value":358295},"successful data reads (including pagination)",{"type":17,"tag":84,"props":358297,"children":358298},{},[358299],{"type":23,"value":358300},"dispatch attempts",{"type":17,"tag":29,"props":358302,"children":358303},{},[358304],{"type":17,"tag":48,"props":358305,"children":358306},{},[358307],{"type":23,"value":358308},"Not billable",{"type":17,"tag":80,"props":358310,"children":358311},{},[358312],{"type":17,"tag":84,"props":358313,"children":358314},{},[358315],{"type":23,"value":358316},"retriable read errors (e.g. rate limits)",{"type":17,"tag":29,"props":358318,"children":358319},{},[358320],{"type":23,"value":358321},"This aligns usage with actual data movement, not polling frequency.",{"type":17,"tag":68,"props":358323,"children":358324},{"id":10342},[358325],{"type":23,"value":11140},{"type":17,"tag":29,"props":358327,"children":358328},{},[358329],{"type":23,"value":358330},"Webhooks are available across all Unified plans, with interval limits based on tier.",{"type":17,"tag":80,"props":358332,"children":358333},{},[358334,358344],{"type":17,"tag":84,"props":358335,"children":358336},{},[358337,358339],{"type":23,"value":358338},"Start with a tester account: ",{"type":17,"tag":133,"props":358340,"children":358342},{"href":1612,"rel":358341},[214],[358343],{"type":23,"value":1612},{"type":17,"tag":84,"props":358345,"children":358346},{},[358347,358349],{"type":23,"value":358348},"View pricing: ",{"type":17,"tag":133,"props":358350,"children":358352},{"href":324400,"rel":358351},[214],[358353],{"type":23,"value":324400},{"type":17,"tag":68,"props":358355,"children":358356},{"id":45643},[358357],{"type":23,"value":45646},{"type":17,"tag":29,"props":358359,"children":358360},{},[358361],{"type":23,"value":358362},"Webhooks are no longer just for incremental updates.",{"type":17,"tag":29,"props":358364,"children":358365},{},[358366],{"type":23,"value":358367},"With initial sync + ongoing delivery in one flow, they replace:",{"type":17,"tag":80,"props":358369,"children":358370},{},[358371,358375,358380],{"type":17,"tag":84,"props":358372,"children":358373},{},[358374],{"type":23,"value":31656},{"type":17,"tag":84,"props":358376,"children":358377},{},[358378],{"type":23,"value":358379},"backfill jobs",{"type":17,"tag":84,"props":358381,"children":358382},{},[358383],{"type":23,"value":24070},{"type":17,"tag":29,"props":358385,"children":358386},{},[358387],{"type":23,"value":358388},"Your integration layer becomes event-driven by default, even for APIs that don't support webhooks.",{"title":7,"searchDepth":1629,"depth":1629,"links":358390},[358391,358392,358393,358395,358396,358397,358398,358399,358400,358401,358402],{"id":357852,"depth":1629,"text":357855},{"id":357914,"depth":1629,"text":357917},{"id":357985,"depth":1629,"text":358394},"2. Separate event types (created, updated)",{"id":358030,"depth":1629,"text":358033},{"id":358070,"depth":1629,"text":358073},{"id":358116,"depth":1629,"text":358119},{"id":358149,"depth":1629,"text":358152},{"id":358212,"depth":1629,"text":358215},{"id":358264,"depth":1629,"text":358267},{"id":10342,"depth":1629,"text":11140},{"id":45643,"depth":1629,"text":45646},"content:blog:replace_polling_with_unified_webhooks_real_time_and_historical_data_in_one_flow.md","blog/replace_polling_with_unified_webhooks_real_time_and_historical_data_in_one_flow.md","blog/replace_polling_with_unified_webhooks_real_time_and_historical_data_in_one_flow",{"_path":358407,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":358408,"description":358409,"img":358410,"date":358411,"tag":6341,"body":358412,"_type":1677,"_id":358890,"_source":1679,"_file":358891,"_stem":358892,"_extension":1682},"/blog/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified","How to build a candidate sourcing or job board app with Unified.to","API integrations are necessary for any modern SaaS app, especially for recruitment solutions like candidate sourcing and job boards that require a high volume...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified-icon.png","2024-01-04T00:00:00.000Z",{"type":14,"children":358413,"toc":358879},[358414,358419,358422,358430,358436,358441,358452,358457,358461,358479,358486,358503,358507,358512,358525,358530,358536,358541,358551,358571,358580,358590,358633,358640,358645,358650,358655,358717,358726,358732,358749,358764,358790,358796,358816,358820,358832,358838],{"type":17,"tag":18,"props":358415,"children":358417},{"id":358416},"how-to-build-a-candidate-sourcing-or-job-board-app-with-unifiedto",[358418],{"type":23,"value":358408},{"type":17,"tag":25,"props":358420,"children":358421},{},[],{"type":17,"tag":29,"props":358423,"children":358424},{},[358425],{"type":17,"tag":33,"props":358426,"children":358427},{},[358428],{"type":23,"value":358429},"January 4, 2024",{"type":17,"tag":68,"props":358431,"children":358433},{"id":358432},"why-build-with-a-unified-api",[358434],{"type":23,"value":358435},"Why build with a unified API?",{"type":17,"tag":29,"props":358437,"children":358438},{},[358439],{"type":23,"value":358440},"API integrations are necessary for any modern SaaS app, especially for recruitment solutions like candidate sourcing and job boards that require a high volume of integrations to improve product value and support a broader user base.",{"type":17,"tag":29,"props":358442,"children":358443},{},[358444,358446,358450],{"type":23,"value":358445},"Instead of spending months or years developing ATS integrations individually, developers can leverage a ",{"type":17,"tag":133,"props":358447,"children":358448},{"href":7691},[358449],{"type":23,"value":7459},{"type":23,"value":358451}," to integrate once to launch multiple integrations simultaneously. Unified APIs simplify integration efforts by offering consistent endpoints and data formats that reduce the complexity of managing numerous APIs.",{"type":17,"tag":29,"props":358453,"children":358454},{},[358455],{"type":23,"value":358456},"Unified APIs accelerate development cycles, enabling quicker deployment of new features and product updates for your recruitment software. We built Unified.to to make integration development as easy as possible for SaaS developers.",{"type":17,"tag":68,"props":358458,"children":358459},{"id":141798},[358460],{"type":23,"value":141801},{"type":17,"tag":29,"props":358462,"children":358463},{},[358464,358466,358471,358473,358477],{"type":23,"value":358465},"Before starting, be sure to review our ",{"type":17,"tag":133,"props":358467,"children":358469},{"href":353758,"rel":358468},[214],[358470],{"type":23,"value":158450},{"type":23,"value":358472}," article. It will walk you through registering for a free account and our onboarding. Once you have completed the onboarding steps, go ahead and ",{"type":17,"tag":11616,"props":358474,"children":358476},{"width":11618,"height":11619,"src":358475,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/T5Caf7ASTCA",[],{"type":23,"value":358478}," as you like.",{"type":17,"tag":29,"props":358480,"children":358481},{},[358482],{"type":17,"tag":6438,"props":358483,"children":358485},{"alt":318119,"src":358484},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified-0.png",[],{"type":17,"tag":29,"props":358487,"children":358488},{},[358489,358491,358496,358498,358502],{"type":23,"value":358490},"Next, deploy the ",{"type":17,"tag":133,"props":358492,"children":358494},{"href":42620,"rel":358493},[214],[358495],{"type":23,"value":217},{"type":23,"value":358497}," Embedded Authorization widget in your product's user-interface.  Check out our ",{"type":17,"tag":11616,"props":358499,"children":358501},{"width":11618,"height":11619,"src":358500,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/BqbzTPg6yi0",[],{"type":23,"value":330989},{"type":17,"tag":68,"props":358504,"children":358505},{"id":42649},[358506],{"type":23,"value":42652},{"type":17,"tag":29,"props":358508,"children":358509},{},[358510],{"type":23,"value":358511},"These are main steps that you will need to support to build your candidate sourcing or job board app:",{"type":17,"tag":6154,"props":358513,"children":358514},{},[358515,358520],{"type":17,"tag":84,"props":358516,"children":358517},{},[358518],{"type":23,"value":358519},"read active jobs to search relevant candidates for",{"type":17,"tag":84,"props":358521,"children":358522},{},[358523],{"type":23,"value":358524},"apply a candidate to a job",{"type":17,"tag":29,"props":358526,"children":358527},{},[358528],{"type":23,"value":358529},"Let's go into more detail for each.",{"type":17,"tag":68,"props":358531,"children":358533},{"id":358532},"step-1-read-jobs",[358534],{"type":23,"value":358535},"Step 1: Read Jobs",{"type":17,"tag":29,"props":358537,"children":358538},{},[358539],{"type":23,"value":358540},"Before searching or finding relevant candidates, you'll need to know which jobs your customer wants you to search for.",{"type":17,"tag":29,"props":358542,"children":358543},{},[358544,358549],{"type":17,"tag":133,"props":358545,"children":358547},{"href":42620,"rel":358546},[214],[358548],{"type":23,"value":217},{"type":23,"value":358550}," can help your app seamlessly import jobs from your customer's ATS.",{"type":17,"tag":29,"props":358552,"children":358553},{},[358554,358556,358562,358563,358570],{"type":23,"value":358555},"To get a list of existing jobs from your end user's ATS, simply call the ",{"type":17,"tag":6121,"props":358557,"children":358559},{"className":358558},[],[358560],{"type":23,"value":358561},"listJobs",{"type":23,"value":18757},{"type":17,"tag":133,"props":358564,"children":358567},{"href":358565,"rel":358566},"https://docs.unified.to/ats/job/List_all_jobs",[214],[358568],{"type":23,"value":358569},"API endpoint",{"type":23,"value":54},{"type":17,"tag":6893,"props":358572,"children":358575},{"className":358573,"code":358574,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: \"\u003CYOUR_API_KEY_HERE>\",\n    },\n});\n\nexport async function getJobs(connectionId: string) {\n    return await sdk.ats.listAtsJobs({\n        connectionId,\n    });\n}\n",[358576],{"type":17,"tag":6121,"props":358577,"children":358578},{"__ignoreMap":7},[358579],{"type":23,"value":358574},{"type":17,"tag":29,"props":358581,"children":358582},{},[358583,358585,358588],{"type":23,"value":358584},"The connection_id comes in from your end user's authorization of their ATS and is stored on your end. You can watch our ",{"type":17,"tag":11616,"props":358586,"children":358587},{"width":11618,"height":11619,"src":356923,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"type":23,"value":358589}," for more detail.",{"type":17,"tag":29,"props":358591,"children":358592},{},[358593,358594,358599,358601,358606,358607,358612,358613,358618,358619,358624,358626,358632],{"type":23,"value":9619},{"type":17,"tag":6121,"props":358595,"children":358597},{"className":358596},[],[358598],{"type":23,"value":240137},{"type":23,"value":358600}," will have specific fields such as ",{"type":17,"tag":6121,"props":358602,"children":358604},{"className":358603},[],[358605],{"type":23,"value":18781},{"type":23,"value":276138},{"type":17,"tag":6121,"props":358608,"children":358610},{"className":358609},[],[358611],{"type":23,"value":24679},{"type":23,"value":11826},{"type":17,"tag":6121,"props":358614,"children":358616},{"className":358615},[],[358617],{"type":23,"value":240192},{"type":23,"value":12561},{"type":17,"tag":6121,"props":358620,"children":358622},{"className":358621},[],[358623],{"type":23,"value":74134},{"type":23,"value":358625}," that will be relevant to your software. Reference our ",{"type":17,"tag":133,"props":358627,"children":358629},{"href":343638,"rel":358628},[214],[358630],{"type":23,"value":358631},"API docs",{"type":23,"value":333769},{"type":17,"tag":29,"props":358634,"children":358635},{},[358636],{"type":17,"tag":6438,"props":358637,"children":358639},{"alt":318119,"src":358638},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified-1.png",[],{"type":17,"tag":29,"props":358641,"children":358642},{},[358643],{"type":23,"value":358644},"Once you have the list of jobs, ask your customer to identify which jobs your app should identify candidates for.",{"type":17,"tag":68,"props":358646,"children":358647},{"id":202242},[358648],{"type":23,"value":358649},"Step 2: Create an application",{"type":17,"tag":29,"props":358651,"children":358652},{},[358653],{"type":23,"value":358654},"Once you have a candidate, there are two ways to create a job application.",{"type":17,"tag":6154,"props":358656,"children":358657},{},[358658,358677],{"type":17,"tag":84,"props":358659,"children":358660},{},[358661,358663,358668,358670,358675],{"type":23,"value":358662},"Send the interested candidate to the job's public web page to apply directly. Most ",{"type":17,"tag":6121,"props":358664,"children":358666},{"className":358665},[],[358667],{"type":23,"value":240137},{"type":23,"value":358669}," objects will have a ",{"type":17,"tag":6121,"props":358671,"children":358673},{"className":358672},[],[358674],{"type":23,"value":280688},{"type":23,"value":358676}," field that contains a list of URLs. The downside to this method is that you lose control of the candidate's experience and not all ATS providers supply the public website. The upside of this method is that it is very easy to implement.",{"type":17,"tag":84,"props":358678,"children":358679},{},[358680,358682,358686,358688,358694,358695,358701,358703,358709,358710,358716],{"type":23,"value":358681},"Create an application and candidate in the ATS directly using our Unified ",{"type":17,"tag":133,"props":358683,"children":358684},{"href":55696},[358685],{"type":23,"value":55699},{"type":23,"value":358687},". This is easily accomplished by using the ",{"type":17,"tag":6121,"props":358689,"children":358691},{"className":358690},[],[358692],{"type":23,"value":358693},"createCandidate",{"type":23,"value":18757},{"type":17,"tag":133,"props":358696,"children":358699},{"href":358697,"rel":358698},"https://docs.unified.to/ats/candidate/Create_a_candidate",[214],[358700],{"type":23,"value":358569},{"type":23,"value":358702}," and  ",{"type":17,"tag":6121,"props":358704,"children":358706},{"className":358705},[],[358707],{"type":23,"value":358708},"createApplication",{"type":23,"value":18757},{"type":17,"tag":133,"props":358711,"children":358714},{"href":358712,"rel":358713},"https://docs.unified.to/ats/application/Create_an_application",[214],[358715],{"type":23,"value":358569},{"type":23,"value":54},{"type":17,"tag":6893,"props":358718,"children":358721},{"className":358719,"code":358720,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AtsCandidate } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function createCandidate(connectionId: string, atsCandidate: AtsCandidate) {\n    const result = await sdk.ats.createAtsCandidate({\n        atsCandidate,\n        connectionId,\n    });\n\n    return result.atsCandidate?.id;\n}\n\nexport async function createApplication(connectionId: string, candidateId: string, jobId: string) {\n    const result = await sdk.ats.createAtsApplication({\n        atsApplication: {\n            candidateId,\n            jobId,\n        },\n        connectionId,\n    });\n\n    return result.atsApplication?.id;\n}\n",[358722],{"type":17,"tag":6121,"props":358723,"children":358724},{"__ignoreMap":7},[358725],{"type":23,"value":358720},{"type":17,"tag":68,"props":358727,"children":358729},{"id":358728},"step-3-uploading-a-resumecvcover-letter-optional",[358730],{"type":23,"value":358731},"Step 3: uploading a resume/CV/cover letter (optional)",{"type":17,"tag":29,"props":358733,"children":358734},{},[358735,358737,358742,358743,358748],{"type":23,"value":358736},"You can also upload the candidate's documents. You will need to set the following fields in the ",{"type":17,"tag":6121,"props":358738,"children":358740},{"className":358739},[],[358741],{"type":23,"value":267682},{"type":23,"value":18757},{"type":17,"tag":133,"props":358744,"children":358746},{"href":343588,"rel":358745},[214],[358747],{"type":23,"value":300826},{"type":23,"value":20456},{"type":17,"tag":80,"props":358750,"children":358751},{},[358752,358756,358760],{"type":17,"tag":84,"props":358753,"children":358754},{},[358755],{"type":23,"value":117309},{"type":17,"tag":84,"props":358757,"children":358758},{},[358759],{"type":23,"value":117452},{"type":17,"tag":84,"props":358761,"children":358762},{},[358763],{"type":23,"value":134916},{"type":17,"tag":29,"props":358765,"children":358766},{},[358767,358769,358776,358778,358783,358784,358789],{"type":23,"value":358768},"Some ATS providers may require additional fields to be present. Be sure to check their ",{"type":17,"tag":133,"props":358770,"children":358773},{"href":358771,"rel":358772},"https://app.unified.to/integrations/greenhouse?tab=support",[214],[358774],{"type":23,"value":358775},"feature support page",{"type":23,"value":358777}," for more information. For example, Greenhouse also requires ",{"type":17,"tag":6121,"props":358779,"children":358781},{"className":358780},[],[358782],{"type":23,"value":27310},{"type":23,"value":34435},{"type":17,"tag":6121,"props":358785,"children":358787},{"className":358786},[],[358788],{"type":23,"value":202723},{"type":23,"value":236681},{"type":17,"tag":68,"props":358791,"children":358793},{"id":358792},"step-4-review-the-application-status-optional",[358794],{"type":23,"value":358795},"Step 4: Review the application status (optional)",{"type":17,"tag":29,"props":358797,"children":358798},{},[358799,358801,358807,358808,358814],{"type":23,"value":358800},"If you need to be informed on the status of the candidate's job application, you can use the ",{"type":17,"tag":6121,"props":358802,"children":358804},{"className":358803},[],[358805],{"type":23,"value":358806},"getApplication",{"type":23,"value":18757},{"type":17,"tag":133,"props":358809,"children":358812},{"href":358810,"rel":358811},"https://docs.unified.to/ats/application/Retrieve_an_application",[214],[358813],{"type":23,"value":358569},{"type":23,"value":358815}," or you can set up a webhook for that connection's modified applications.",{"type":17,"tag":68,"props":358817,"children":358818},{"id":256460},[358819],{"type":23,"value":256463},{"type":17,"tag":29,"props":358821,"children":358822},{},[358823,358825,358830],{"type":23,"value":358824},"It is easy to support many ATS integrations in your recruiting application and allow your end user to seamlessly move data between the two. Use Unified.to's ",{"type":17,"tag":133,"props":358826,"children":358828},{"href":56812,"rel":358827},[214],[358829],{"type":23,"value":56819},{"type":23,"value":358831}," to launch integrations in days and harness recruitment data for your candidate sourcing or job board app.",{"type":17,"tag":68,"props":358833,"children":358835},{"id":358834},"additional-resources",[358836],{"type":23,"value":358837},"Additional resources",{"type":17,"tag":80,"props":358839,"children":358840},{},[358841,358849,358858,358867,358873],{"type":17,"tag":84,"props":358842,"children":358843},{},[358844],{"type":17,"tag":133,"props":358845,"children":358847},{"href":56812,"rel":358846},[214],[358848],{"type":23,"value":56819},{"type":17,"tag":84,"props":358850,"children":358851},{},[358852],{"type":17,"tag":133,"props":358853,"children":358855},{"href":163546,"rel":358854},[214],[358856],{"type":23,"value":358857},"API Documentation for the Unified ATS API",{"type":17,"tag":84,"props":358859,"children":358860},{},[358861],{"type":17,"tag":133,"props":358862,"children":358864},{"href":357728,"rel":358863},[214],[358865],{"type":23,"value":358866},"SDKs for Unified.to",{"type":17,"tag":84,"props":358868,"children":358869},{},[358870],{"type":17,"tag":11616,"props":358871,"children":358872},{"width":11618,"height":11619,"src":358500,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"type":17,"tag":84,"props":358874,"children":358875},{},[358876],{"type":17,"tag":11616,"props":358877,"children":358878},{"width":11618,"height":11619,"src":356923,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"title":7,"searchDepth":1629,"depth":1629,"links":358880},[358881,358882,358883,358884,358885,358886,358887,358888,358889],{"id":358432,"depth":1629,"text":358435},{"id":141798,"depth":1629,"text":141801},{"id":42649,"depth":1629,"text":42652},{"id":358532,"depth":1629,"text":358535},{"id":202242,"depth":1629,"text":358649},{"id":358728,"depth":1629,"text":358731},{"id":358792,"depth":1629,"text":358795},{"id":256460,"depth":1629,"text":256463},{"id":358834,"depth":1629,"text":358837},"content:blog:how_to_build_a_candidate_sourcing_or_job_board_app_with_unified.md","blog/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified.md","blog/how_to_build_a_candidate_sourcing_or_job_board_app_with_unified",{"_path":358894,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":358895,"description":358896,"img":358897,"date":358898,"tag":6341,"body":358899,"_type":1677,"_id":359408,"_source":1679,"_file":359409,"_stem":359410,"_extension":1682},"/blog/how_to_build_an_invoicing_system_with_unified","How to build an invoicing system with Unified.to","When building a SaaS app for invoicing, you'll need to exchange data within your customers' accounting app of choice. In this guide, we'll cover the basics of...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_invoicing_system_with_unified-icon.png","2024-01-03T00:00:00.000Z",{"type":14,"children":358900,"toc":359400},[358901,358906,358909,358917,358934,358938,358953,358960,358976,358980,358985,358998,359002,359008,359013,359023,359030,359049,359058,359067,359086,359123,359130,359137,359164,359173,359181,359186,359206,359225,359232,359237,359256,359265,359271,359291,359339,359343,359355,359360],{"type":17,"tag":18,"props":358902,"children":358904},{"id":358903},"how-to-build-an-invoicing-system-with-unifiedto",[358905],{"type":23,"value":358895},{"type":17,"tag":25,"props":358907,"children":358908},{},[],{"type":17,"tag":29,"props":358910,"children":358911},{},[358912],{"type":17,"tag":33,"props":358913,"children":358914},{},[358915],{"type":23,"value":358916},"January 3, 2024",{"type":17,"tag":29,"props":358918,"children":358919},{},[358920,358922,358927,358929,358933],{"type":23,"value":358921},"When building a SaaS app for invoicing, you'll need to exchange data within your customers' accounting app of choice. In this guide, we'll cover the basics of how to access the data you need for your invoicing app with the help of ",{"type":17,"tag":133,"props":358923,"children":358925},{"href":42620,"rel":358924},[214],[358926],{"type":23,"value":217},{"type":23,"value":358928},"'s unified ",{"type":17,"tag":133,"props":358930,"children":358931},{"href":82425},[358932],{"type":23,"value":82428},{"type":23,"value":54},{"type":17,"tag":68,"props":358935,"children":358936},{"id":141798},[358937],{"type":23,"value":141801},{"type":17,"tag":29,"props":358939,"children":358940},{},[358941,358942,358947,358949,358952],{"type":23,"value":358465},{"type":17,"tag":133,"props":358943,"children":358945},{"href":353758,"rel":358944},[214],[358946],{"type":23,"value":158450},{"type":23,"value":358948}," article. It will walk you through registering for a free account and onboarding. Once you have completed the onboarding steps, go ahead and ",{"type":17,"tag":11616,"props":358950,"children":358951},{"width":11618,"height":11619,"src":358475,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"type":23,"value":358478},{"type":17,"tag":29,"props":358954,"children":358955},{},[358956],{"type":17,"tag":6438,"props":358957,"children":358959},{"alt":318119,"src":358958},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_invoicing_system_with_unified-0.png",[],{"type":17,"tag":29,"props":358961,"children":358962},{},[358963,358965,358970,358972,358975],{"type":23,"value":358964},"The next step is to deploy the ",{"type":17,"tag":133,"props":358966,"children":358968},{"href":42620,"rel":358967},[214],[358969],{"type":23,"value":217},{"type":23,"value":358971}," Embedded Authorization widget in your product's user interface (UI). Check out our ",{"type":17,"tag":11616,"props":358973,"children":358974},{"width":11618,"height":11619,"src":358500,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"type":23,"value":330989},{"type":17,"tag":68,"props":358977,"children":358978},{"id":42649},[358979],{"type":23,"value":42652},{"type":17,"tag":29,"props":358981,"children":358982},{},[358983],{"type":23,"value":358984},"Here are the steps that you will need to support to build your invoicing app:",{"type":17,"tag":6154,"props":358986,"children":358987},{},[358988,358993],{"type":17,"tag":84,"props":358989,"children":358990},{},[358991],{"type":23,"value":358992},"create an invoice",{"type":17,"tag":84,"props":358994,"children":358995},{},[358996],{"type":23,"value":358997},"pay an invoice or cancel an invoice",{"type":17,"tag":29,"props":358999,"children":359000},{},[359001],{"type":23,"value":358529},{"type":17,"tag":68,"props":359003,"children":359005},{"id":359004},"step-1-create-an-invoice",[359006],{"type":23,"value":359007},"Step 1: Create an invoice",{"type":17,"tag":29,"props":359009,"children":359010},{},[359011],{"type":23,"value":359012},"To generate an invoice, gather specific details from your end user, including essential information like the amount, line items/products, due date, and customer details.",{"type":17,"tag":29,"props":359014,"children":359015},{},[359016,359021],{"type":17,"tag":133,"props":359017,"children":359019},{"href":42620,"rel":359018},[214],[359020],{"type":23,"value":217},{"type":23,"value":359022}," can help with two of those values: customer and product.",{"type":17,"tag":29,"props":359024,"children":359025},{},[359026],{"type":17,"tag":48,"props":359027,"children":359028},{},[359029],{"type":23,"value":32745},{"type":17,"tag":29,"props":359031,"children":359032},{},[359033,359035,359041,359042,359048],{"type":23,"value":359034},"To get a list of existing customers from your end user's accounting system, simply call the ",{"type":17,"tag":6121,"props":359036,"children":359038},{"className":359037},[],[359039],{"type":23,"value":359040},"listCustomers",{"type":23,"value":18757},{"type":17,"tag":133,"props":359043,"children":359046},{"href":359044,"rel":359045},"https://docs.unified.to/accounting/customer/List_all_customers",[214],[359047],{"type":23,"value":358569},{"type":23,"value":54},{"type":17,"tag":6893,"props":359050,"children":359053},{"className":359051,"code":359052,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function getCustomers(connectionId: string) {\n    return await sdk.accounting.listAccountingContacts({\n        connectionId,\n    });\n}\n",[359054],{"type":17,"tag":6121,"props":359055,"children":359056},{"__ignoreMap":7},[359057],{"type":23,"value":359052},{"type":17,"tag":29,"props":359059,"children":359060},{},[359061,359063,359066],{"type":23,"value":359062},"The connection_id comes in from your end user's authorization of their accounting app and is stored on your end. You can watch our ",{"type":17,"tag":11616,"props":359064,"children":359065},{"width":11618,"height":11619,"src":356923,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"type":23,"value":330989},{"type":17,"tag":29,"props":359068,"children":359069},{},[359070,359072,359078,359079,359085],{"type":23,"value":359071},"If you need to create a new customer, use our ",{"type":17,"tag":6121,"props":359073,"children":359075},{"className":359074},[],[359076],{"type":23,"value":359077},"createCustomer",{"type":23,"value":18757},{"type":17,"tag":133,"props":359080,"children":359083},{"href":359081,"rel":359082},"https://docs.unified.to/accounting/customer/Create_a_customer",[214],[359084],{"type":23,"value":358569},{"type":23,"value":54},{"type":17,"tag":29,"props":359087,"children":359088},{},[359089,359090,359095,359096,359101,359102,359107,359108,359113,359115,359122],{"type":23,"value":9619},{"type":17,"tag":6121,"props":359091,"children":359093},{"className":359092},[],[359094],{"type":23,"value":47609},{"type":23,"value":358600},{"type":17,"tag":6121,"props":359097,"children":359099},{"className":359098},[],[359100],{"type":23,"value":18781},{"type":23,"value":276138},{"type":17,"tag":6121,"props":359103,"children":359105},{"className":359104},[],[359106],{"type":23,"value":50735},{"type":23,"value":11826},{"type":17,"tag":6121,"props":359109,"children":359111},{"className":359110},[],[359112],{"type":23,"value":273089},{"type":23,"value":359114},", and tax information that will be relevant to your software.  See our ",{"type":17,"tag":133,"props":359116,"children":359119},{"href":359117,"rel":359118},"https://docs.unified.to/accounting/customer/model",[214],[359120],{"type":23,"value":359121},"API Documentation page",{"type":23,"value":333769},{"type":17,"tag":29,"props":359124,"children":359125},{},[359126],{"type":17,"tag":6438,"props":359127,"children":359129},{"alt":318119,"src":359128},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_an_invoicing_system_with_unified-1.png",[],{"type":17,"tag":29,"props":359131,"children":359132},{},[359133],{"type":17,"tag":48,"props":359134,"children":359135},{},[359136],{"type":23,"value":125871},{"type":17,"tag":29,"props":359138,"children":359139},{},[359140,359142,359148,359150,359155,359157,359163],{"type":23,"value":359141},"Much like getting a list of existing customers, it is easy to get a list of existing products in your end user's accounting app using the ",{"type":17,"tag":6121,"props":359143,"children":359145},{"className":359144},[],[359146],{"type":23,"value":359147},"listItems",{"type":23,"value":359149}," API endpoint. We call a product, an ",{"type":17,"tag":6121,"props":359151,"children":359153},{"className":359152},[],[359154],{"type":23,"value":354629},{"type":23,"value":359156},", and you can find the full data-model on our ",{"type":17,"tag":133,"props":359158,"children":359161},{"href":359159,"rel":359160},"https://docs.unified.to/accounting/item/model",[214],[359162],{"type":23,"value":359121},{"type":23,"value":54},{"type":17,"tag":6893,"props":359165,"children":359168},{"className":359166,"code":359167,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function getItems(connectionId: string) {\n    return await sdk.commerce.listCommerceItems({\n        connectionId,\n    });\n}\n",[359169],{"type":17,"tag":6121,"props":359170,"children":359171},{"__ignoreMap":7},[359172],{"type":23,"value":359167},{"type":17,"tag":29,"props":359174,"children":359175},{},[359176],{"type":17,"tag":48,"props":359177,"children":359178},{},[359179],{"type":23,"value":359180},"Chart of accounts & tax rates",{"type":17,"tag":29,"props":359182,"children":359183},{},[359184],{"type":23,"value":359185},"Each line item in an invoice will be associated with a customer, item, account and tax rate in your end user's accounting application.",{"type":17,"tag":29,"props":359187,"children":359188},{},[359189,359191,359197,359198,359204],{"type":23,"value":359190},"You can get a list of accounts by calling our ",{"type":17,"tag":6121,"props":359192,"children":359194},{"className":359193},[],[359195],{"type":23,"value":359196},"listAccounts",{"type":23,"value":18757},{"type":17,"tag":133,"props":359199,"children":359202},{"href":359200,"rel":359201},"https://docs.unified.to/accounting/account/List_all_accounts",[214],[359203],{"type":23,"value":358569},{"type":23,"value":359205}," which returns a list from their 'Chart of Accounts'.",{"type":17,"tag":29,"props":359207,"children":359208},{},[359209,359211,359217,359218,359224],{"type":23,"value":359210},"You can also get a list of tax rates by calling our ",{"type":17,"tag":6121,"props":359212,"children":359214},{"className":359213},[],[359215],{"type":23,"value":359216},"listTaxrates",{"type":23,"value":18757},{"type":17,"tag":133,"props":359219,"children":359222},{"href":359220,"rel":359221},"https://docs.unified.to/accounting/taxrate/List_all_taxrates",[214],[359223],{"type":23,"value":358569},{"type":23,"value":54},{"type":17,"tag":29,"props":359226,"children":359227},{},[359228],{"type":17,"tag":48,"props":359229,"children":359230},{},[359231],{"type":23,"value":70733},{"type":17,"tag":29,"props":359233,"children":359234},{},[359235],{"type":23,"value":359236},"Once the end user has created an invoice, you will want to send that invoice into their accounting system as well.",{"type":17,"tag":29,"props":359238,"children":359239},{},[359240,359242,359248,359249,359255],{"type":23,"value":359241},"This is easily accomplished by using the ",{"type":17,"tag":6121,"props":359243,"children":359245},{"className":359244},[],[359246],{"type":23,"value":359247},"createInvoice",{"type":23,"value":18757},{"type":17,"tag":133,"props":359250,"children":359253},{"href":359251,"rel":359252},"https://docs.unified.to/accounting/invoice/Create_a_invoice",[214],[359254],{"type":23,"value":358569},{"type":23,"value":54},{"type":17,"tag":6893,"props":359257,"children":359260},{"className":359258,"code":359259,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AccountingInvoice } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function createInvoice(connectionId: string, invoice: AccountingInvoice) {\n    const result = await sdk.accounting.createAccountingInvoice({\n        accountingInvoice: invoice,\n        connectionId,\n    });\n    return result.accountingInvoice?.id;\n}\n",[359261],{"type":17,"tag":6121,"props":359262,"children":359263},{"__ignoreMap":7},[359264],{"type":23,"value":359259},{"type":17,"tag":68,"props":359266,"children":359268},{"id":359267},"step-2-paying-invoices",[359269],{"type":23,"value":359270},"Step 2: Paying invoices",{"type":17,"tag":29,"props":359272,"children":359273},{},[359274,359276,359282,359283,359289],{"type":23,"value":359275},"Once that invoice is paid, you will need to communicate this to the accounting application. This is accomplished by using the ",{"type":17,"tag":6121,"props":359277,"children":359279},{"className":359278},[],[359280],{"type":23,"value":359281},"createPayment",{"type":23,"value":18757},{"type":17,"tag":133,"props":359284,"children":359287},{"href":359285,"rel":359286},"https://docs.unified.to/accounting/payment/Create_a_payment",[214],[359288],{"type":23,"value":358569},{"type":23,"value":359290}," which associates a payment with an invoice.",{"type":17,"tag":29,"props":359292,"children":359293},{},[359294,359296,359301,359303,359308,359310,359315,359317,359322,359324,359331,359333,359338],{"type":23,"value":359295},"At a minimum, a ",{"type":17,"tag":6121,"props":359297,"children":359299},{"className":359298},[],[359300],{"type":23,"value":25973},{"type":23,"value":359302}," will need an ",{"type":17,"tag":6121,"props":359304,"children":359306},{"className":359305},[],[359307],{"type":23,"value":109123},{"type":23,"value":359309}," , a ",{"type":17,"tag":6121,"props":359311,"children":359313},{"className":359312},[],[359314],{"type":23,"value":108877},{"type":23,"value":359316}," and an ",{"type":17,"tag":6121,"props":359318,"children":359320},{"className":359319},[],[359321],{"type":23,"value":25890},{"type":23,"value":359323},".  Some integrations may require additional values to be present, so check that ",{"type":17,"tag":133,"props":359325,"children":359328},{"href":359326,"rel":359327},"https://app.unified.to/integrations/quickbooks?tab=support",[214],[359329],{"type":23,"value":359330},"integration's feature support page",{"type":23,"value":359332},".  For example, Quickbooks also requires a ",{"type":17,"tag":6121,"props":359334,"children":359336},{"className":359335},[],[359337],{"type":23,"value":22296},{"type":23,"value":72754},{"type":17,"tag":68,"props":359340,"children":359341},{"id":256460},[359342],{"type":23,"value":256463},{"type":17,"tag":29,"props":359344,"children":359345},{},[359346,359348,359353],{"type":23,"value":359347},"It's easy to support multiple accounting applications in your invoicing app and allow your end user to seamlessly move data between the two. By using Unitied.to's ",{"type":17,"tag":133,"props":359349,"children":359351},{"href":83766,"rel":359350},[214],[359352],{"type":23,"value":83770},{"type":23,"value":359354}," you can add accounting integrations to your product and support your invoicing use case within days.",{"type":17,"tag":68,"props":359356,"children":359357},{"id":358834},[359358],{"type":23,"value":359359},"Additional Resources",{"type":17,"tag":80,"props":359361,"children":359362},{},[359363,359371,359380,359388,359394],{"type":17,"tag":84,"props":359364,"children":359365},{},[359366],{"type":17,"tag":133,"props":359367,"children":359369},{"href":83766,"rel":359368},[214],[359370],{"type":23,"value":83770},{"type":17,"tag":84,"props":359372,"children":359373},{},[359374],{"type":17,"tag":133,"props":359375,"children":359377},{"href":108383,"rel":359376},[214],[359378],{"type":23,"value":359379},"API Documentation for the Unified Accounting API",{"type":17,"tag":84,"props":359381,"children":359382},{},[359383],{"type":17,"tag":133,"props":359384,"children":359386},{"href":357728,"rel":359385},[214],[359387],{"type":23,"value":358866},{"type":17,"tag":84,"props":359389,"children":359390},{},[359391],{"type":17,"tag":11616,"props":359392,"children":359393},{"width":11618,"height":11619,"src":358500,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"type":17,"tag":84,"props":359395,"children":359396},{},[359397],{"type":17,"tag":11616,"props":359398,"children":359399},{"width":11618,"height":11619,"src":356923,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"title":7,"searchDepth":1629,"depth":1629,"links":359401},[359402,359403,359404,359405,359406,359407],{"id":141798,"depth":1629,"text":141801},{"id":42649,"depth":1629,"text":42652},{"id":359004,"depth":1629,"text":359007},{"id":359267,"depth":1629,"text":359270},{"id":256460,"depth":1629,"text":256463},{"id":358834,"depth":1629,"text":359359},"content:blog:how_to_build_an_invoicing_system_with_unified.md","blog/how_to_build_an_invoicing_system_with_unified.md","blog/how_to_build_an_invoicing_system_with_unified",{"_path":359412,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":359413,"description":359414,"img":359415,"date":358898,"tag":12,"body":359416,"_type":1677,"_id":359839,"_source":1679,"_file":359840,"_stem":359841,"_extension":1682},"/blog/unified_file_storage_api_integrations_guide","Unified File Storage API Integrations Guide","Launch file storage integrations fast. Use one unified API to connect apps to Google Drive, Dropbox, and OneDrive for secure file access.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_file_storage_api_integrations_guide-icon.png",{"type":14,"children":359417,"toc":359833},[359418,359423,359426,359433,359441,359458,359477,359482,359534,359547,359555,359566,359579,359587,359592,359600,359614,359622,359627,359635,359640,359651,359656,359667,359675,359689,359697,359707,359715,359735,359746,359765,359783,359791],{"type":17,"tag":18,"props":359419,"children":359421},{"id":359420},"unified-file-storage-api-integrations-guide",[359422],{"type":23,"value":359413},{"type":17,"tag":25,"props":359424,"children":359425},{},[],{"type":17,"tag":29,"props":359427,"children":359428},{},[359429],{"type":17,"tag":33,"props":359430,"children":359431},{},[359432],{"type":23,"value":358916},{"type":17,"tag":29,"props":359434,"children":359435},{},[359436],{"type":17,"tag":6438,"props":359437,"children":359440},{"alt":359438,"src":359439},"Unified.to_file_storage_API.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_file_storage_api_integrations_guide-0.png",[],{"type":17,"tag":29,"props":359442,"children":359443},{},[359444],{"type":17,"tag":33,"props":359445,"children":359446},{},[359447],{"type":17,"tag":48,"props":359448,"children":359449},{},[359450,359452,359456],{"type":23,"value":359451},"Launch file storage integrations fast. Use one ",{"type":17,"tag":133,"props":359453,"children":359454},{"href":7691},[359455],{"type":23,"value":7459},{"type":23,"value":359457}," to connect apps to Google Drive, Dropbox, and OneDrive for secure file access.",{"type":17,"tag":29,"props":359459,"children":359460},{},[359461,359463,359467,359469,359476],{"type":23,"value":359462},"Today we are introducing file storage integrations! Connect your app to various file storage systems using our unified ",{"type":17,"tag":133,"props":359464,"children":359465},{"href":28977},[359466],{"type":23,"value":28980},{"type":23,"value":359468}," to access your customers' files and folders. Deploy multiple file storage integrations at once — in hours — instead of building them individually. (Learn more about ",{"type":17,"tag":133,"props":359470,"children":359473},{"href":359471,"rel":359472},"https://en.wikipedia.org/wiki/API",[214],[359474],{"type":23,"value":359475},"API technology",{"type":23,"value":12034},{"type":17,"tag":29,"props":359478,"children":359479},{},[359480],{"type":23,"value":359481},"Our unified storage API includes the following pre-built integrations:",{"type":17,"tag":80,"props":359483,"children":359484},{},[359485,359493,359501,359509,359517,359526],{"type":17,"tag":84,"props":359486,"children":359487},{},[359488],{"type":17,"tag":133,"props":359489,"children":359491},{"href":357058,"rel":359490},[214],[359492],{"type":23,"value":28907},{"type":17,"tag":84,"props":359494,"children":359495},{},[359496],{"type":17,"tag":133,"props":359497,"children":359499},{"href":354522,"rel":359498},[214],[359500],{"type":23,"value":28915},{"type":17,"tag":84,"props":359502,"children":359503},{},[359504],{"type":17,"tag":133,"props":359505,"children":359507},{"href":357103,"rel":359506},[214],[359508],{"type":23,"value":28931},{"type":17,"tag":84,"props":359510,"children":359511},{},[359512],{"type":17,"tag":133,"props":359513,"children":359515},{"href":357125,"rel":359514},[214],[359516],{"type":23,"value":28923},{"type":17,"tag":84,"props":359518,"children":359519},{},[359520],{"type":17,"tag":133,"props":359521,"children":359524},{"href":359522,"rel":359523},"https://unified.to/integrations/microsoftsharepoint",[214],[359525],{"type":23,"value":348310},{"type":17,"tag":84,"props":359527,"children":359528},{},[359529],{"type":17,"tag":133,"props":359530,"children":359532},{"href":357147,"rel":359531},[214],[359533],{"type":23,"value":28939},{"type":17,"tag":29,"props":359535,"children":359536},{},[359537,359539,359546],{"type":23,"value":359538},"You can list files, query folders, and download the file contents. To view the detailed feature support of each file storage integration, ",{"type":17,"tag":133,"props":359540,"children":359543},{"href":359541,"rel":359542},"https://app.unified.to/login?utm_source=storage_release&utm_medium=storage_release_blog&utm_campaign=storage_release",[214],[359544],{"type":23,"value":359545},"create a free Unified.to account or log in",{"type":23,"value":54},{"type":17,"tag":29,"props":359548,"children":359549},{},[359550],{"type":17,"tag":6438,"props":359551,"children":359554},{"alt":359552,"src":359553},"introducing_the_unified_file_storage_api-1.gif","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_file_storage_api_integrations_guide-1.gif",[],{"type":17,"tag":68,"props":359556,"children":359558},{"id":359557},"file-storage-use-cases",[359559],{"type":17,"tag":133,"props":359560,"children":359563},{"href":359561,"rel":359562},"https://www.notion.so/unified-to/bf8154eb04f84537b972c6170fb94a79?v=e7df13bafc244e839a8b60b15ec0f96d&p=1f35a06ad9c44ce993cbc0354b791e60&pm=s#file-storage-use-cases",[214],[359564],{"type":23,"value":359565},"File storage use cases",{"type":17,"tag":29,"props":359567,"children":359568},{},[359569,359571,359578],{"type":23,"value":359570},"Direct access to your customers' preferred files storage systems can benefit your app's functionality and user experience in a variety of ways. (For more on file storage benefits, see our ",{"type":17,"tag":133,"props":359572,"children":359575},{"href":359573,"rel":359574},"https://unified.to/blog/introducing_the_unified_file_storage_api#file-storage-use-cases",[214],[359576],{"type":23,"value":359577},"file storage guide",{"type":23,"value":169101},{"type":17,"tag":29,"props":359580,"children":359581},{},[359582],{"type":17,"tag":48,"props":359583,"children":359584},{},[359585],{"type":23,"value":359586},"HR document management",{"type":17,"tag":29,"props":359588,"children":359589},{},[359590],{"type":23,"value":359591},"Easily store and retrieve employee records, resumes, and onboarding documents from diverse file storage sources, ensuring a centralized and efficient user workflow.",{"type":17,"tag":29,"props":359593,"children":359594},{},[359595],{"type":17,"tag":48,"props":359596,"children":359597},{},[359598],{"type":23,"value":359599},"Candidate file handling",{"type":17,"tag":29,"props":359601,"children":359602},{},[359603,359605,359612],{"type":23,"value":359604},"Simplify the organization and accessibility of candidate resumes, portfolio samples, and interview feedback stored across different platforms during the talent acquisition process. (See how ",{"type":17,"tag":133,"props":359606,"children":359609},{"href":359607,"rel":359608},"https://www.forbes.com/sites/forbestechcouncil/2021/01/25/the-impact-of-digital-transformation-on-business-diversity/",[214],[359610],{"type":23,"value":359611},"digital transformation",{"type":23,"value":359613}," affects this process.)",{"type":17,"tag":29,"props":359615,"children":359616},{},[359617],{"type":17,"tag":48,"props":359618,"children":359619},{},[359620],{"type":23,"value":359621},"Sales collateral management",{"type":17,"tag":29,"props":359623,"children":359624},{},[359625],{"type":23,"value":359626},"Allow sales reps to quickly query multiple file sources, access and share proposal documents effortlessly within a single app.",{"type":17,"tag":29,"props":359628,"children":359629},{},[359630],{"type":17,"tag":48,"props":359631,"children":359632},{},[359633],{"type":23,"value":359634},"Accounting record-keeping",{"type":17,"tag":29,"props":359636,"children":359637},{},[359638],{"type":23,"value":359639},"Manage your customers' receipts and financial documents stored across platforms like Google Drive and Dropbox within your app for streamlined financial record-keeping.",{"type":17,"tag":68,"props":359641,"children":359643},{"id":359642},"what-is-a-unified-storage-api",[359644],{"type":17,"tag":133,"props":359645,"children":359648},{"href":359646,"rel":359647},"https://www.notion.so/unified-to/bf8154eb04f84537b972c6170fb94a79?v=e7df13bafc244e839a8b60b15ec0f96d&p=1f35a06ad9c44ce993cbc0354b791e60&pm=s#what-is-a-unified-storage-api",[214],[359649],{"type":23,"value":359650},"What is a unified storage API?",{"type":17,"tag":29,"props":359652,"children":359653},{},[359654],{"type":23,"value":359655},"A unified storage API is a singular interface that consolidates access to and management of files and folders across different storage software systems. Our unified storage API normalizes customer data from multiple file storage APIs, allowing developers to list and retrieve files and folders without having to build an individual integration for each file storage system.",{"type":17,"tag":68,"props":359657,"children":359659},{"id":359658},"benefits-of-our-unified-storage-api",[359660],{"type":17,"tag":133,"props":359661,"children":359664},{"href":359662,"rel":359663},"https://www.notion.so/unified-to/bf8154eb04f84537b972c6170fb94a79?v=e7df13bafc244e839a8b60b15ec0f96d&p=1f35a06ad9c44ce993cbc0354b791e60&pm=s#benefits-of-our-unified-storage-api",[214],[359665],{"type":23,"value":359666},"Benefits of our unified storage API",{"type":17,"tag":29,"props":359668,"children":359669},{},[359670],{"type":17,"tag":48,"props":359671,"children":359672},{},[359673],{"type":23,"value":359674},"1. Faster time to market",{"type":17,"tag":29,"props":359676,"children":359677},{},[359678,359680,359687],{"type":23,"value":359679},"Using our unified storage API eliminates the need to have to build file storage integrations individually. The unified approach saves months of engineering time and effort, allowing software teams to deploy multiple integrations simultaneously. (Explore ",{"type":17,"tag":133,"props":359681,"children":359684},{"href":359682,"rel":359683},"https://www.ibm.com/cloud/learn/software-development-methodologies",[214],[359685],{"type":23,"value":359686},"software development methodologies",{"type":23,"value":359688}," to see how this can fit into your workflow.)",{"type":17,"tag":29,"props":359690,"children":359691},{},[359692],{"type":17,"tag":48,"props":359693,"children":359694},{},[359695],{"type":23,"value":359696},"2. Secure by default",{"type":17,"tag":29,"props":359698,"children":359699},{},[359700,359705],{"type":17,"tag":133,"props":359701,"children":359703},{"href":42620,"rel":359702},[214],[359704],{"type":23,"value":217},{"type":23,"value":359706}," prioritizes the security of your customers' sensitive third-party data. None of our APIs store or scrape your customers' data, so you can securely access files and folders from your customers' accounts.",{"type":17,"tag":29,"props":359708,"children":359709},{},[359710],{"type":17,"tag":48,"props":359711,"children":359712},{},[359713],{"type":23,"value":359714},"3. Maintain integration health",{"type":17,"tag":29,"props":359716,"children":359717},{},[359718,359720,359725,359727,359733],{"type":23,"value":359719},"Eliminate integration tech debt and simplify ongoing third-party API maintenance. ",{"type":17,"tag":133,"props":359721,"children":359723},{"href":42620,"rel":359722},[214],[359724],{"type":23,"value":217},{"type":23,"value":359726}," regularly tests integrations, monitors for updates and notifies you of the health of your connections. (Learn more about ",{"type":17,"tag":133,"props":359728,"children":359730},{"href":43547,"rel":359729},[214],[359731],{"type":23,"value":359732},"API lifecycle management",{"type":23,"value":359734}," in our documentation.)",{"type":17,"tag":68,"props":359736,"children":359738},{"id":359737},"pricing-and-availability",[359739],{"type":17,"tag":133,"props":359740,"children":359743},{"href":359741,"rel":359742},"https://www.notion.so/unified-to/bf8154eb04f84537b972c6170fb94a79?v=e7df13bafc244e839a8b60b15ec0f96d&p=1f35a06ad9c44ce993cbc0354b791e60&pm=s#pricing-and-availability",[214],[359744],{"type":23,"value":359745},"Pricing and availability",{"type":17,"tag":29,"props":359747,"children":359748},{},[359749,359751,359756,359758,359763],{"type":23,"value":359750},"Our unified storage API is available to all ",{"type":17,"tag":133,"props":359752,"children":359754},{"href":42620,"rel":359753},[214],[359755],{"type":23,"value":217},{"type":23,"value":359757}," Workspaces on every plan. Once you've created your ",{"type":17,"tag":133,"props":359759,"children":359761},{"href":42620,"rel":359760},[214],[359762],{"type":23,"value":217},{"type":23,"value":359764}," account, activate files storage integrations in seconds, preview your user authorization experience, run integration tests, and deploy to production in days.",{"type":17,"tag":29,"props":359766,"children":359767},{},[359768,359773,359775,359781],{"type":17,"tag":133,"props":359769,"children":359771},{"href":42620,"rel":359770},[214],[359772],{"type":23,"value":217},{"type":23,"value":359774}," has a flexible pricing model based on monthly API request usage. ",{"type":17,"tag":133,"props":359776,"children":359778},{"href":359541,"rel":359777},[214],[359779],{"type":23,"value":359780},"Get started with a tester account",{"type":23,"value":359782}," and receive 2,500 complementary API requests.",{"type":17,"tag":29,"props":359784,"children":359785},{},[359786],{"type":17,"tag":48,"props":359787,"children":359788},{},[359789],{"type":23,"value":359790},"Keep learning",{"type":17,"tag":80,"props":359792,"children":359793},{},[359794,359804,359813,359823],{"type":17,"tag":84,"props":359795,"children":359796},{},[359797],{"type":17,"tag":133,"props":359798,"children":359801},{"href":359799,"rel":359800},"https://unified.to/blog/how_to_use_the_unified_file_storage_api",[214],[359802],{"type":23,"value":359803},"Guide: how to use the unified file storage API",{"type":17,"tag":84,"props":359805,"children":359806},{},[359807],{"type":17,"tag":133,"props":359808,"children":359810},{"href":344197,"rel":359809},[214],[359811],{"type":23,"value":359812},"Docs: storage file object model",{"type":17,"tag":84,"props":359814,"children":359815},{},[359816],{"type":17,"tag":133,"props":359817,"children":359820},{"href":359818,"rel":359819},"https://docs.unified.to/storage/file/List_all_files",[214],[359821],{"type":23,"value":359822},"Docs: listFiles API endpoint",{"type":17,"tag":84,"props":359824,"children":359825},{},[359826],{"type":17,"tag":133,"props":359827,"children":359830},{"href":359828,"rel":359829},"https://docs.unified.to/storage/file/Retrieve_a_file",[214],[359831],{"type":23,"value":359832},"Docs: Retrieve File API endpoint",{"title":7,"searchDepth":1629,"depth":1629,"links":359834},[359835,359836,359837,359838],{"id":359557,"depth":1629,"text":359565},{"id":359642,"depth":1629,"text":359650},{"id":359658,"depth":1629,"text":359666},{"id":359737,"depth":1629,"text":359745},"content:blog:unified_file_storage_api_integrations_guide.md","blog/unified_file_storage_api_integrations_guide.md","blog/unified_file_storage_api_integrations_guide",{"_path":359843,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":359844,"description":359845,"img":359846,"date":359847,"tag":12,"body":359848,"_type":1677,"_id":360180,"_source":1679,"_file":360181,"_stem":360182,"_extension":1682},"/blog/unified_dec_2023_product_updates","Unified.to Dec 2023 product updates","It's time for our latest product roundup of the year! We've been focused on expanding our unified Accounting API, improving our onboarding content, and...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_dec_2023_product_updates-icon.png","2023-12-21T00:00:00.000Z",{"type":14,"children":359849,"toc":360167},[359850,359855,359858,359866,359874,359885,359891,359902,359910,359916,359921,359929,359935,359940,359953,359959,359964,359973,359979,359984,359993,359999,360004,360013,360019,360023,360028,360037,360041,360047,360051,360056,360059,360065,360076,360085,360091,360095,360100,360104,360110,360118,360123,360131,360136,360145,360153,360162],{"type":17,"tag":18,"props":359851,"children":359853},{"id":359852},"unifiedto-dec-2023-product-updates",[359854],{"type":23,"value":359844},{"type":17,"tag":25,"props":359856,"children":359857},{},[],{"type":17,"tag":29,"props":359859,"children":359860},{},[359861],{"type":17,"tag":33,"props":359862,"children":359863},{},[359864],{"type":23,"value":359865},"December 21, 2023",{"type":17,"tag":29,"props":359867,"children":359868},{},[359869],{"type":17,"tag":6438,"props":359870,"children":359873},{"alt":359871,"src":359872},"Unified.to_product_update_December_2023.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_dec_2023_product_updates-0.png",[],{"type":17,"tag":29,"props":359875,"children":359876},{},[359877,359879,359883],{"type":23,"value":359878},"It's time for our latest product roundup of the year! We've been focused on expanding our unified ",{"type":17,"tag":133,"props":359880,"children":359881},{"href":82425},[359882],{"type":23,"value":128616},{"type":23,"value":359884},", improving our onboarding content, and expanding feature support for candidate assessment apps. Here's everything we shipped.",{"type":17,"tag":68,"props":359886,"children":359888},{"id":359887},"support-for-application-status",[359889],{"type":23,"value":359890},"Support for Application Status",{"type":17,"tag":29,"props":359892,"children":359893},{},[359894,359896,359900],{"type":23,"value":359895},"Unified.to's unified ",{"type":17,"tag":133,"props":359897,"children":359898},{"href":55696},[359899],{"type":23,"value":55699},{"type":23,"value":359901}," now supports Application Status. Execute application status list retrievals from ATS integrations like Greenhouse, Workable, Workday, and more. Display application statuses and execute the trigger status for sending assessments, tests, and background checks in candidate assessment apps.",{"type":17,"tag":29,"props":359903,"children":359904},{},[359905],{"type":17,"tag":133,"props":359906,"children":359908},{"href":56812,"rel":359907},[214],[359909],{"type":23,"value":342724},{"type":17,"tag":68,"props":359911,"children":359913},{"id":359912},"support-for-bank-accounts-transactions",[359914],{"type":23,"value":359915},"Support for Bank Accounts & Transactions",{"type":17,"tag":29,"props":359917,"children":359918},{},[359919],{"type":23,"value":359920},"We shipped our unified Accounting API in November, starting with Xero, QuickBooks, and Zoho Books. Apps leveraging our Accounting integrations for reporting & analytics, expense tracking and tax compliance can now benefit from broader support for Bank Accounts and Bank Transactions.",{"type":17,"tag":29,"props":359922,"children":359923},{},[359924],{"type":17,"tag":133,"props":359925,"children":359927},{"href":83766,"rel":359926},[214],[359928],{"type":23,"value":342724},{"type":17,"tag":68,"props":359930,"children":359932},{"id":359931},"support-for-tax-rate-and-organization",[359933],{"type":23,"value":359934},"Support for Tax Rate and Organization",{"type":17,"tag":29,"props":359936,"children":359937},{},[359938],{"type":23,"value":359939},"Tax Rate and Organization were highly requested objects for our unified Accounting API, and they're now supported across our Accounting integrations.",{"type":17,"tag":80,"props":359941,"children":359942},{},[359943,359948],{"type":17,"tag":84,"props":359944,"children":359945},{},[359946],{"type":23,"value":359947},"Tax Rate: Read tax rates to ensure accurate financial calculations and compliance in your app.",{"type":17,"tag":84,"props":359949,"children":359950},{},[359951],{"type":23,"value":359952},"Organization: Read your customers' business information, such as legal name, fiscal year end, and currency.",{"type":17,"tag":68,"props":359954,"children":359956},{"id":359955},"new-hr-integration-elmo",[359957],{"type":23,"value":359958},"New HR integration: ELMO",{"type":17,"tag":29,"props":359960,"children":359961},{},[359962],{"type":23,"value":359963},"Unified.to's ELMO integration supports Group and Employee objects. Launch ELMO plus 93 other similar integrations to your app in hours.",{"type":17,"tag":29,"props":359965,"children":359966},{},[359967],{"type":17,"tag":133,"props":359968,"children":359971},{"href":359969,"rel":359970},"https://unified.to/integrations/elmo",[214],[359972],{"type":23,"value":342724},{"type":17,"tag":68,"props":359974,"children":359976},{"id":359975},"new-crm-integration-attio",[359977],{"type":23,"value":359978},"New CRM integration: Attio",{"type":17,"tag":29,"props":359980,"children":359981},{},[359982],{"type":23,"value":359983},"Unified.to's Attio integration supports Contact, Company, and Deal objects. Launch Attio plus 90 other similar integrations to your app in hours.",{"type":17,"tag":29,"props":359985,"children":359986},{},[359987],{"type":17,"tag":133,"props":359988,"children":359991},{"href":359989,"rel":359990},"https://unified.to/integrations/attio",[214],[359992],{"type":23,"value":342724},{"type":17,"tag":68,"props":359994,"children":359996},{"id":359995},"new-hr-integration-paycom",[359997],{"type":23,"value":359998},"New HR integration: Paycom",{"type":17,"tag":29,"props":360000,"children":360001},{},[360002],{"type":23,"value":360003},"Unified.to's Paycom integration supports Group and Employee objects. Launch Paycom plus 93 other similar integrations to your app in hours.",{"type":17,"tag":29,"props":360005,"children":360006},{},[360007],{"type":17,"tag":133,"props":360008,"children":360011},{"href":360009,"rel":360010},"https://unified.to/integrations/paycom",[214],[360012],{"type":23,"value":342724},{"type":17,"tag":68,"props":360014,"children":360016},{"id":360015},"tutorial-test-sandbox-user-connections",[360017],{"type":23,"value":360018},"Tutorial: Test Sandbox user connections",{"type":17,"tag":11616,"props":360020,"children":360022},{"width":11618,"height":11619,"src":360021,"title":11621,"frameBorder":11622,"allow":11623,"allowFullScreen":11625},"https://www.youtube.com/embed/jA6_Dot5kN0?si=yrtC4-BulTla4sZd",[],{"type":17,"tag":29,"props":360024,"children":360025},{},[360026],{"type":23,"value":360027},"Unified.to's Sandbox environment is great for testing the configuration of an integration and creating user connections without having to add an integration to your app.This guide explains how to leverage our Sandbox environment.",{"type":17,"tag":29,"props":360029,"children":360030},{},[360031],{"type":17,"tag":133,"props":360032,"children":360034},{"href":356883,"rel":360033},[214],[360035],{"type":23,"value":360036},"Read the article",{"type":17,"tag":11616,"props":360038,"children":360040},{"width":11618,"height":11619,"src":360039,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/jA6_Dot5kN0",[],{"type":17,"tag":68,"props":360042,"children":360044},{"id":360043},"tutorial-embedding-user-authorization",[360045],{"type":23,"value":360046},"Tutorial: Embedding user authorization",{"type":17,"tag":11616,"props":360048,"children":360050},{"width":11618,"height":11619,"src":360049,"title":11621,"frameBorder":11622,"allow":11623,"allowFullScreen":11625},"https://www.youtube.com/embed/BqbzTPg6yi0?si=vFFTEGMF9Zm1bY3h",[],{"type":17,"tag":29,"props":360052,"children":360053},{},[360054],{"type":23,"value":360055},"Unified.to's Authorization widget provides a user authorization experience with one line of code. Configure CSS styles, permission scopes, integration categories, data regions and more. This guide explains how to set up the Authorization embed for your app.",{"type":17,"tag":11616,"props":360057,"children":360058},{"width":11618,"height":11619,"src":358500,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},[],{"type":17,"tag":68,"props":360060,"children":360062},{"id":360061},"guide-how-to-register-a-google-developer-app-and-get-oauth-2-credentials",[360063],{"type":23,"value":360064},"Guide: How to register a Google developer app and get OAuth 2 credentials",{"type":17,"tag":29,"props":360066,"children":360067},{},[360068,360070,360074],{"type":23,"value":360069},"In this guide, you'll learn how to quickly register a Google developer app, generate your ",{"type":17,"tag":133,"props":360071,"children":360072},{"href":779},[360073],{"type":23,"value":782},{"type":23,"value":360075}," 2 credentials, and activate a Google Directory integration within Unified.to.",{"type":17,"tag":29,"props":360077,"children":360078},{},[360079],{"type":17,"tag":133,"props":360080,"children":360083},{"href":360081,"rel":360082},"https://docs.unified.to/overview/guides/how_to_register_a_google_developer_app_and_get_oauth_2_credentials",[214],[360084],{"type":23,"value":360036},{"type":17,"tag":68,"props":360086,"children":360088},{"id":360087},"interview-startwell-podcast",[360089],{"type":23,"value":360090},"Interview: StartWell podcast",{"type":17,"tag":11616,"props":360092,"children":360094},{"width":11618,"height":11619,"src":360093,"title":11621,"frameBorder":11622,"allow":11623,"allowFullScreen":11625},"https://www.youtube.com/embed/ntU2me7Ee48?si=YTbtjn7bw6HbrhJW",[],{"type":17,"tag":29,"props":360096,"children":360097},{},[360098],{"type":23,"value":360099},"Unified.to's CEO Roy Pereira was featured on the StartWell podcast where he shares on his entrepreneurial journey, the origins of Unified.to, and why today's SaaS developers should be focused on building products, not third-party API integrations.",{"type":17,"tag":11616,"props":360101,"children":360103},{"width":11618,"height":11619,"src":360102,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/bZkfeZpKQs0",[],{"type":17,"tag":68,"props":360105,"children":360107},{"id":360106},"_55-on-g2",[360108],{"type":23,"value":360109},"5/5 on G2",{"type":17,"tag":29,"props":360111,"children":360112},{},[360113],{"type":17,"tag":33,"props":360114,"children":360115},{},[360116],{"type":23,"value":360117},"'No other unified API provider has the authentication flexibility that Unified has, their embedded authentication script works great in no-code tools. Support is also incredibly helpful and quick to respond, any issues I faced are resolved quickly and feature requests were also considered and implemented. Could not ask for a better integration partner!'",{"type":17,"tag":29,"props":360119,"children":360120},{},[360121],{"type":23,"value":360122},"We'd like to thank our customers for helping us maintain a 5/5 rating on G2 this year.",{"type":17,"tag":29,"props":360124,"children":360125},{},[360126],{"type":17,"tag":133,"props":360127,"children":360129},{"href":318903,"rel":360128},[214],[360130],{"type":23,"value":355794},{"type":17,"tag":29,"props":360132,"children":360133},{},[360134],{"type":23,"value":360135},"We hope these updates accelerate your integration development in the New Year. Keep coming back with questions and feature requests.",{"type":17,"tag":29,"props":360137,"children":360138},{},[360139],{"type":17,"tag":133,"props":360140,"children":360142},{"href":1612,"rel":360141},[214],[360143],{"type":23,"value":360144},"Create your free Unified.to account",{"type":17,"tag":29,"props":360146,"children":360147},{},[360148],{"type":17,"tag":133,"props":360149,"children":360151},{"href":215330,"rel":360150},[214],[360152],{"type":23,"value":1627},{"type":17,"tag":29,"props":360154,"children":360155},{},[360156],{"type":17,"tag":133,"props":360157,"children":360159},{"href":326013,"rel":360158},[214],[360160],{"type":23,"value":360161},"Join our Discord server",{"type":17,"tag":29,"props":360163,"children":360164},{},[360165],{"type":23,"value":360166},"Happy holidays and thanks for reading.",{"title":7,"searchDepth":1629,"depth":1629,"links":360168},[360169,360170,360171,360172,360173,360174,360175,360176,360177,360178,360179],{"id":359887,"depth":1629,"text":359890},{"id":359912,"depth":1629,"text":359915},{"id":359931,"depth":1629,"text":359934},{"id":359955,"depth":1629,"text":359958},{"id":359975,"depth":1629,"text":359978},{"id":359995,"depth":1629,"text":359998},{"id":360015,"depth":1629,"text":360018},{"id":360043,"depth":1629,"text":360046},{"id":360061,"depth":1629,"text":360064},{"id":360087,"depth":1629,"text":360090},{"id":360106,"depth":1629,"text":360109},"content:blog:unified_dec_2023_product_updates.md","blog/unified_dec_2023_product_updates.md","blog/unified_dec_2023_product_updates",{"_path":360184,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":360185,"description":360186,"img":360187,"date":360188,"tag":12,"body":360189,"_type":1677,"_id":360829,"_source":1679,"_file":360830,"_stem":360831,"_extension":1682},"/blog/unified_apis_vs_workflow_automation_which_should_developers_choose","Unified APIs vs Workflow Automation: Which should developers choose?","In the ever-evolving landscape of SaaS development, the need for seamless and efficient integrations has become indisputable.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apis_vs_workflow_automation_which_should_developers_choose-icon.png","2023-12-12T00:00:00.000Z",{"type":14,"children":360190,"toc":360821},[360191,360196,360199,360207,360215,360219,360241,360254,360265,360270,360276,360281,360288,360301,360310,360318,360326,360334,360340,360345,360352,360370,360378,360393,360401,360414,360420,360425,360430,360438,360456,360464,360482,360488,360500,360506,360514,360519,360529,360537,360542,360550,360555,360563,360568,360782,360788,360793,360801],{"type":17,"tag":18,"props":360192,"children":360194},{"id":360193},"unified-apis-vs-workflow-automation-which-should-developers-choose",[360195],{"type":23,"value":360185},{"type":17,"tag":25,"props":360197,"children":360198},{},[],{"type":17,"tag":29,"props":360200,"children":360201},{},[360202],{"type":17,"tag":33,"props":360203,"children":360204},{},[360205],{"type":23,"value":360206},"December 12, 2023",{"type":17,"tag":29,"props":360208,"children":360209},{},[360210],{"type":17,"tag":6438,"props":360211,"children":360214},{"alt":360212,"src":360213},"Workflow_automation.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apis_vs_workflow_automation_which_should_developers_choose-0.png",[],{"type":17,"tag":29,"props":360216,"children":360217},{},[360218],{"type":23,"value":360186},{"type":17,"tag":29,"props":360220,"children":360221},{},[360222,360224,360231,360233,360239],{"type":23,"value":360223},"This year, ",{"type":17,"tag":133,"props":360225,"children":360228},{"href":360226,"rel":360227},"https://research.g2.com/hubfs/Buyer-Behavior-Report-2023.pdf",[214],[360229],{"type":23,"value":360230},"G2",{"type":23,"value":360232}," found that 82% of B2B buyers agreed that it is essential that the software they purchase integrates into their existing tech stacks. Another ",{"type":17,"tag":133,"props":360234,"children":360237},{"href":360235,"rel":360236},"https://www.martechalliance.com/hubfs/Martech%20Report%202021-22/The%20Martech%20Report%202021-22%20HighRes.pdf",[214],[360238],{"type":23,"value":190476},{"type":23,"value":360240}," found that inadequate integration is the #1 barrier to investing in technology.",{"type":17,"tag":29,"props":360242,"children":360243},{},[360244,360246,360252],{"type":23,"value":360245},"As the significance of SaaS integrations increases, savvy software teams seek ",{"type":17,"tag":133,"props":360247,"children":360249},{"href":337980,"rel":360248},[214],[360250],{"type":23,"value":360251},"integration development solutions",{"type":23,"value":360253}," that enable rapid implementation to get integrations to market faster and reduce ongoing integration maintenance to safeguard against future tech debt.",{"type":17,"tag":29,"props":360255,"children":360256},{},[360257,360259,360263],{"type":23,"value":360258},"In this article, we'll explore the key differences between ",{"type":17,"tag":133,"props":360260,"children":360261},{"href":7691},[360262],{"type":23,"value":7806},{"type":23,"value":360264}," technologies and workflow automation solutions and which is the preferred choice for scaling your product's customer-facing integrations.",{"type":17,"tag":29,"props":360266,"children":360267},{},[360268],{"type":23,"value":360269},"Before we compare the two integration development approaches, it's critical to understand the different types of integrations, which typically vary between those designed for internal company usage and those designed to add value for customers.",{"type":17,"tag":68,"props":360271,"children":360273},{"id":360272},"_1-internal-integrations",[360274],{"type":23,"value":360275},"1. Internal integrations",{"type":17,"tag":29,"props":360277,"children":360278},{},[360279],{"type":23,"value":360280},"Internal integrations are for streamlining processes within your company, enhancing collaboration, and optimizing workflows for improved efficiency.",{"type":17,"tag":29,"props":360282,"children":360283},{},[360284],{"type":17,"tag":48,"props":360285,"children":360286},{},[360287],{"type":23,"value":71985},{"type":17,"tag":80,"props":360289,"children":360290},{},[360291,360296],{"type":17,"tag":84,"props":360292,"children":360293},{},[360294],{"type":23,"value":360295},"Data synchronization: Connecting internal databases and your company's accounts to ensure consistent and up-to-date information across departments",{"type":17,"tag":84,"props":360297,"children":360298},{},[360299],{"type":23,"value":360300},"Workflow automation: Orchestrating internal processes, such as sales pipeline automation",{"type":17,"tag":29,"props":360302,"children":360303},{},[360304,360309],{"type":17,"tag":48,"props":360305,"children":360306},{},[360307],{"type":23,"value":360308},"Scope",{"type":23,"value":20456},{"type":17,"tag":80,"props":360311,"children":360312},{},[360313],{"type":17,"tag":84,"props":360314,"children":360315},{},[360316],{"type":23,"value":360317},"Primarily focused on improving internal operations and communication",{"type":17,"tag":29,"props":360319,"children":360320},{},[360321],{"type":17,"tag":48,"props":360322,"children":360323},{},[360324],{"type":23,"value":360325},"Development approach:",{"type":17,"tag":80,"props":360327,"children":360328},{},[360329],{"type":17,"tag":84,"props":360330,"children":360331},{},[360332],{"type":23,"value":360333},"Often involves using middleware, custom scripts, or workflow automation tools tailored to internal processes",{"type":17,"tag":68,"props":360335,"children":360337},{"id":360336},"_2-external-integrations-customer-facing",[360338],{"type":23,"value":360339},"2. External integrations (customer-facing)",{"type":17,"tag":29,"props":360341,"children":360342},{},[360343],{"type":23,"value":360344},"External or customer-facing integrations are designed to extend the value of your core product to end-users, providing additional features and functionalities.",{"type":17,"tag":29,"props":360346,"children":360347},{},[360348],{"type":17,"tag":48,"props":360349,"children":360350},{},[360351],{"type":23,"value":71985},{"type":17,"tag":80,"props":360353,"children":360354},{},[360355,360360,360365],{"type":17,"tag":84,"props":360356,"children":360357},{},[360358],{"type":23,"value":360359},"Third-party integrations: Connecting with external services or platforms that complement your core product",{"type":17,"tag":84,"props":360361,"children":360362},{},[360363],{"type":23,"value":360364},"APIs for Developers: Offering APIs to allow external developers to build on top of your product.",{"type":17,"tag":84,"props":360366,"children":360367},{},[360368],{"type":23,"value":360369},"Ecosystem integrations: Partnering with other companies to create a broader product ecosystem for awareness and lead generation opportunities",{"type":17,"tag":29,"props":360371,"children":360372},{},[360373],{"type":17,"tag":48,"props":360374,"children":360375},{},[360376],{"type":23,"value":360377},"Scope:",{"type":17,"tag":80,"props":360379,"children":360380},{},[360381],{"type":17,"tag":84,"props":360382,"children":360383},{},[360384,360386,360391],{"type":23,"value":360385},"Aimed at enhancing the user experience and providing added value to customers by embedding your product into their existing tech stacks, enhancing existing functionality, and minimizing manual tasks. For example, a candidate sourcing product that integrates with an ",{"type":17,"tag":133,"props":360387,"children":360389},{"href":56812,"rel":360388},[214],[360390],{"type":23,"value":11756},{"type":23,"value":360392}," (Applicant Tracking System) eliminates the need for its customers to manually upload job postings.",{"type":17,"tag":29,"props":360394,"children":360395},{},[360396],{"type":17,"tag":48,"props":360397,"children":360398},{},[360399],{"type":23,"value":360400},"Development approaches:",{"type":17,"tag":80,"props":360402,"children":360403},{},[360404,360409],{"type":17,"tag":84,"props":360405,"children":360406},{},[360407],{"type":23,"value":360408},"Requires a user-friendly and standardized approach that works with your business logic",{"type":17,"tag":84,"props":360410,"children":360411},{},[360412],{"type":23,"value":360413},"Requires a scalable integration architecture capable of effortlessly accommodating future integration requests as your company expands and attracts a larger user base",{"type":17,"tag":68,"props":360415,"children":360417},{"id":360416},"understanding-traditional-workflow-automation",[360418],{"type":23,"value":360419},"Understanding traditional Workflow Automation",{"type":17,"tag":29,"props":360421,"children":360422},{},[360423],{"type":23,"value":360424},"Automation has long been a cornerstone in the developer's toolkit. It involves creating scripts or workflows that streamline repetitive tasks, making processes more efficient. In the context of integrations, automation often relies on custom scripts or connectors to bridge the gap between different systems. Integration technology like iPaaS (Integration Platform as a Service) solutions aim to simplify the integration process by offering a centralized platform where developers can design, deploy, and manage integrations between different applications.",{"type":17,"tag":29,"props":360426,"children":360427},{},[360428],{"type":23,"value":360429},"While effective in some scenarios like internal integrations or simple customer use cases, traditional automation can become complex, time-consuming, and challenging to maintain, especially as the number of customer-facing integrations grows.",{"type":17,"tag":29,"props":360431,"children":360432},{},[360433],{"type":17,"tag":48,"props":360434,"children":360435},{},[360436],{"type":23,"value":360437},"When to use Workflow Automation:",{"type":17,"tag":80,"props":360439,"children":360440},{},[360441,360446,360451],{"type":17,"tag":84,"props":360442,"children":360443},{},[360444],{"type":23,"value":360445},"You're seeking a low-code solution that requires little development expertise where event triggers are the primary mechanism for data syncing between integrations",{"type":17,"tag":84,"props":360447,"children":360448},{},[360449],{"type":23,"value":360450},"You're seeking pre-determined workflows with pre-built integrations (or connectors)",{"type":17,"tag":84,"props":360452,"children":360453},{},[360454],{"type":23,"value":360455},"You have a one-off customer-facing integration or only internal integration use cases",{"type":17,"tag":29,"props":360457,"children":360458},{},[360459],{"type":17,"tag":48,"props":360460,"children":360461},{},[360462],{"type":23,"value":360463},"When not to use Workflow Automation:",{"type":17,"tag":80,"props":360465,"children":360466},{},[360467,360472,360477],{"type":17,"tag":84,"props":360468,"children":360469},{},[360470],{"type":23,"value":360471},"You want to create standardized customer-facing integrations that can easily scale as customer demand and your product grow",{"type":17,"tag":84,"props":360473,"children":360474},{},[360475],{"type":23,"value":360476},"You have multiple integration requests from customers and/or aim to leverage ecosystem integrations to build partnerships",{"type":17,"tag":84,"props":360478,"children":360479},{},[360480],{"type":23,"value":360481},"You require a high level of customization, control, and adaptability to extend your core product's functionality with third-party customer data from your integrations",{"type":17,"tag":68,"props":360483,"children":360485},{"id":360484},"enter-unified-api-technology",[360486],{"type":23,"value":360487},"Enter Unified API technology",{"type":17,"tag":29,"props":360489,"children":360490},{},[360491,360493,360498],{"type":23,"value":360492},"Unified API (application programming interface) technology represents a paradigm shift in integration strategies. Unified APIs provide a cohesive interface allowing developers to interact with multiple platforms. Instead of juggling various APIs and custom scripts, developers can leverage a unified API that abstracts the complexities of the underlying systems. Unified APIs make it possible for developers to build once to deploy multiple integrations within the same category (e.g., For the ",{"type":17,"tag":133,"props":360494,"children":360496},{"href":76501,"rel":360495},[214],[360497],{"type":23,"value":25731},{"type":23,"value":360499}," category, a developer can launch Salesforce, HubSpot, Pipedrive, and Copper) simultaneously and leverage their customers' third-party data to enhance their core functionality.",{"type":17,"tag":68,"props":360501,"children":360503},{"id":360502},"key-advantages-of-unified-api-technology",[360504],{"type":23,"value":360505},"Key advantages of Unified API technology",{"type":17,"tag":29,"props":360507,"children":360508},{},[360509],{"type":17,"tag":48,"props":360510,"children":360511},{},[360512],{"type":23,"value":360513},"1. Simplified development:",{"type":17,"tag":29,"props":360515,"children":360516},{},[360517],{"type":23,"value":360518},"Unified APIs significantly simplify the development process. With a single interface, developers can save significant time and effort, reducing the learning curve associated with multiple APIs.",{"type":17,"tag":29,"props":360520,"children":360521},{},[360522],{"type":17,"tag":133,"props":360523,"children":360526},{"href":360524,"rel":360525},"https://unified.to/blog/how_herohunt_saved_ten_months_of_engineering_time_with_unified?utm_source=banner_home&utm_medium=banne&utm_campaign=banner_herohunt&utm_id=case_study",[214],[360527],{"type":23,"value":360528},"Case study: How HeroHunt.ai saved 10 months of engineering time with Unified APIs",{"type":17,"tag":29,"props":360530,"children":360531},{},[360532],{"type":17,"tag":48,"props":360533,"children":360534},{},[360535],{"type":23,"value":360536},"2. Consistency across platforms",{"type":17,"tag":29,"props":360538,"children":360539},{},[360540],{"type":23,"value":360541},"One of the challenges in traditional automation is maintaining consistency across different services. Unified APIs provide a standardized interface, ensuring a consistent experience regardless of the underlying systems being integrated.",{"type":17,"tag":29,"props":360543,"children":360544},{},[360545],{"type":17,"tag":48,"props":360546,"children":360547},{},[360548],{"type":23,"value":360549},"3. Reduced maintenance overhead",{"type":17,"tag":29,"props":360551,"children":360552},{},[360553],{"type":23,"value":360554},"As applications and services evolve, maintaining integrations becomes crucial. Unified API technology minimizes maintenance overhead by allowing developers to update and adapt to changes in a centralized manner, often automating the maintenance process completely.",{"type":17,"tag":29,"props":360556,"children":360557},{},[360558],{"type":17,"tag":48,"props":360559,"children":360560},{},[360561],{"type":23,"value":360562},"4. Scalability",{"type":17,"tag":29,"props":360564,"children":360565},{},[360566],{"type":23,"value":360567},"As your applications grow, so do the demands on integrations. Unified APIs are designed to scale effortlessly, accommodating increased traffic and additional functionalities without the need for extensive reworking of existing integrations.",{"type":17,"tag":7231,"props":360569,"children":360570},{},[360571,360600],{"type":17,"tag":7235,"props":360572,"children":360573},{},[360574],{"type":17,"tag":7239,"props":360575,"children":360576},{},[360577,360585,360592],{"type":17,"tag":7243,"props":360578,"children":360579},{},[360580],{"type":17,"tag":48,"props":360581,"children":360582},{},[360583],{"type":23,"value":360584},"Your integration needs",{"type":17,"tag":7243,"props":360586,"children":360587},{},[360588],{"type":17,"tag":48,"props":360589,"children":360590},{},[360591],{"type":23,"value":289922},{"type":17,"tag":7243,"props":360593,"children":360594},{},[360595],{"type":17,"tag":48,"props":360596,"children":360597},{},[360598],{"type":23,"value":360599},"Use Workflow Automation",{"type":17,"tag":7259,"props":360601,"children":360602},{},[360603,360618,360632,360647,360662,360677,360692,360707,360722,360737,360752,360767],{"type":17,"tag":7239,"props":360604,"children":360605},{},[360606,360610,360615],{"type":17,"tag":7266,"props":360607,"children":360608},{},[360609],{"type":23,"value":17558},{"type":17,"tag":7266,"props":360611,"children":360612},{},[360613],{"type":23,"value":360614},"✅",{"type":17,"tag":7266,"props":360616,"children":360617},{},[],{"type":17,"tag":7239,"props":360619,"children":360620},{},[360621,360625,360628],{"type":17,"tag":7266,"props":360622,"children":360623},{},[360624],{"type":23,"value":94432},{"type":17,"tag":7266,"props":360626,"children":360627},{},[],{"type":17,"tag":7266,"props":360629,"children":360630},{},[360631],{"type":23,"value":360614},{"type":17,"tag":7239,"props":360633,"children":360634},{},[360635,360640,360644],{"type":17,"tag":7266,"props":360636,"children":360637},{},[360638],{"type":23,"value":360639},"Scalable integration architecture",{"type":17,"tag":7266,"props":360641,"children":360642},{},[360643],{"type":23,"value":360614},{"type":17,"tag":7266,"props":360645,"children":360646},{},[],{"type":17,"tag":7239,"props":360648,"children":360649},{},[360650,360655,360659],{"type":17,"tag":7266,"props":360651,"children":360652},{},[360653],{"type":23,"value":360654},"Developer-friendly interface",{"type":17,"tag":7266,"props":360656,"children":360657},{},[360658],{"type":23,"value":360614},{"type":17,"tag":7266,"props":360660,"children":360661},{},[],{"type":17,"tag":7239,"props":360663,"children":360664},{},[360665,360670,360674],{"type":17,"tag":7266,"props":360666,"children":360667},{},[360668],{"type":23,"value":360669},"Rapid integration deployment",{"type":17,"tag":7266,"props":360671,"children":360672},{},[360673],{"type":23,"value":360614},{"type":17,"tag":7266,"props":360675,"children":360676},{},[],{"type":17,"tag":7239,"props":360678,"children":360679},{},[360680,360685,360689],{"type":17,"tag":7266,"props":360681,"children":360682},{},[360683],{"type":23,"value":360684},"Standardized integrations",{"type":17,"tag":7266,"props":360686,"children":360687},{},[360688],{"type":23,"value":360614},{"type":17,"tag":7266,"props":360690,"children":360691},{},[],{"type":17,"tag":7239,"props":360693,"children":360694},{},[360695,360700,360704],{"type":17,"tag":7266,"props":360696,"children":360697},{},[360698],{"type":23,"value":360699},"Standardized user experience (authorization, onboarding)",{"type":17,"tag":7266,"props":360701,"children":360702},{},[360703],{"type":23,"value":360614},{"type":17,"tag":7266,"props":360705,"children":360706},{},[],{"type":17,"tag":7239,"props":360708,"children":360709},{},[360710,360715,360719],{"type":17,"tag":7266,"props":360711,"children":360712},{},[360713],{"type":23,"value":360714},"Normalized third-party data",{"type":17,"tag":7266,"props":360716,"children":360717},{},[360718],{"type":23,"value":360614},{"type":17,"tag":7266,"props":360720,"children":360721},{},[],{"type":17,"tag":7239,"props":360723,"children":360724},{},[360725,360730,360734],{"type":17,"tag":7266,"props":360726,"children":360727},{},[360728],{"type":23,"value":360729},"Customization and control for your back-end",{"type":17,"tag":7266,"props":360731,"children":360732},{},[360733],{"type":23,"value":360614},{"type":17,"tag":7266,"props":360735,"children":360736},{},[],{"type":17,"tag":7239,"props":360738,"children":360739},{},[360740,360745,360748],{"type":17,"tag":7266,"props":360741,"children":360742},{},[360743],{"type":23,"value":360744},"No-code solution",{"type":17,"tag":7266,"props":360746,"children":360747},{},[],{"type":17,"tag":7266,"props":360749,"children":360750},{},[360751],{"type":23,"value":360614},{"type":17,"tag":7239,"props":360753,"children":360754},{},[360755,360760,360764],{"type":17,"tag":7266,"props":360756,"children":360757},{},[360758],{"type":23,"value":360759},"Built-in integrations (native)",{"type":17,"tag":7266,"props":360761,"children":360762},{},[360763],{"type":23,"value":360614},{"type":17,"tag":7266,"props":360765,"children":360766},{},[],{"type":17,"tag":7239,"props":360768,"children":360769},{},[360770,360775,360779],{"type":17,"tag":7266,"props":360771,"children":360772},{},[360773],{"type":23,"value":360774},"Cost-effectiveness",{"type":17,"tag":7266,"props":360776,"children":360777},{},[360778],{"type":23,"value":360614},{"type":17,"tag":7266,"props":360780,"children":360781},{},[],{"type":17,"tag":68,"props":360783,"children":360785},{"id":360784},"the-future-of-integration-development-is-unified",[360786],{"type":23,"value":360787},"The future of integration development is unified",{"type":17,"tag":29,"props":360789,"children":360790},{},[360791],{"type":23,"value":360792},"In the pursuit of creating seamless and user-friendly products, developers are turning to Unified API technology as the future of integration development. While workflow automations have long been employed to streamline processes, they come with inherent limitations—complexity, customization challenges, maintenance overhead, and scalability concerns. The ability for Unified APIs to simplify development, provide consistency across platforms, reduce maintenance overhead, enhance security, and scale effortlessly makes it the ideal choice for customer-facing integration use cases.",{"type":17,"tag":29,"props":360794,"children":360795},{},[360796],{"type":17,"tag":48,"props":360797,"children":360798},{},[360799],{"type":23,"value":360800},"One API to integrate them all: launch 190+ integrations in hours",{"type":17,"tag":29,"props":360802,"children":360803},{},[360804,360806,360812,360814,360820],{"type":23,"value":360805},"Unified.to powers hiring, selling, and workforce customer data in your SaaS. ",{"type":17,"tag":133,"props":360807,"children":360809},{"href":215330,"rel":360808},[214],[360810],{"type":23,"value":360811},"Speak with an expert",{"type":23,"value":360813}," to learn more about our Unified API developer platform or ",{"type":17,"tag":133,"props":360815,"children":360817},{"href":158861,"rel":360816},[214],[360818],{"type":23,"value":360819},"create a free tester account",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":360822},[360823,360824,360825,360826,360827,360828],{"id":360272,"depth":1629,"text":360275},{"id":360336,"depth":1629,"text":360339},{"id":360416,"depth":1629,"text":360419},{"id":360484,"depth":1629,"text":360487},{"id":360502,"depth":1629,"text":360505},{"id":360784,"depth":1629,"text":360787},"content:blog:unified_apis_vs_workflow_automation_which_should_developers_choose.md","blog/unified_apis_vs_workflow_automation_which_should_developers_choose.md","blog/unified_apis_vs_workflow_automation_which_should_developers_choose",{"_path":360833,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":360834,"description":360835,"img":360836,"date":360837,"tag":12,"body":360838,"_type":1677,"_id":362152,"_source":1679,"_file":362153,"_stem":362154,"_extension":1682},"/blog/unified_nov_2023_product_updates","Unified.to Nov 2023 product updates","We've launched 127 integrations this year so far with 5 categories and several new ones in beta. Here's a few creative ways software teams are using Unified.to...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_nov_2023_product_updates-icon.png","2023-11-30T00:00:00.000Z",{"type":14,"children":360839,"toc":362144},[360840,360845,360848,360856,360864,360870,360882,360910,360916,360921,360929,360934,360943,360951,360956,360965,360971,360979,360984,361002,361011,361017,361025,361030,361035,361064,361073,361079,361087,361092,361105,361114,361120,361127,361189,361196,361483,361490,361893,361900,361958,361965,362056,362063,362112,362140],{"type":17,"tag":18,"props":360841,"children":360843},{"id":360842},"unifiedto-nov-2023-product-updates",[360844],{"type":23,"value":360834},{"type":17,"tag":25,"props":360846,"children":360847},{},[],{"type":17,"tag":29,"props":360849,"children":360850},{},[360851],{"type":17,"tag":33,"props":360852,"children":360853},{},[360854],{"type":23,"value":360855},"November 30, 2023",{"type":17,"tag":29,"props":360857,"children":360858},{},[360859],{"type":17,"tag":6438,"props":360860,"children":360863},{"alt":360861,"src":360862},"Product_roundup_nov_2023.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_nov_2023_product_updates-0.png",[],{"type":17,"tag":68,"props":360865,"children":360867},{"id":360866},"how-software-teams-are-building-with-us",[360868],{"type":23,"value":360869},"How software teams are building with us",{"type":17,"tag":29,"props":360871,"children":360872},{},[360873,360875,360880],{"type":23,"value":360874},"We've launched 127 integrations this year so far with 5 categories and several new ones in beta. Here's a few creative ways software teams are using ",{"type":17,"tag":133,"props":360876,"children":360878},{"href":42620,"rel":360877},[214],[360879],{"type":23,"value":217},{"type":23,"value":360881}," right now.",{"type":17,"tag":80,"props":360883,"children":360884},{},[360885,360896],{"type":17,"tag":84,"props":360886,"children":360887},{},[360888,360894],{"type":17,"tag":133,"props":360889,"children":360892},{"href":360890,"rel":360891},"https://www.herohunt.ai/",[214],[360893],{"type":23,"value":354764},{"type":23,"value":360895},", a recruitment platform, is using ATS data to enhance their candidate sourcing solution (they've launched 22 ATS integrations) and to support enterprise-level customers.",{"type":17,"tag":84,"props":360897,"children":360898},{},[360899,360901,360908],{"type":23,"value":360900},"Sylva, a community-development platform,  made it possible for ",{"type":17,"tag":133,"props":360902,"children":360905},{"href":360903,"rel":360904},"https://www.hiretechladies.com/",[214],[360906],{"type":23,"value":360907},"Tech Ladies",{"type":23,"value":360909},", the largest community of women in tech, to create candidate applications within their job board platform using our ATS integrations.",{"type":17,"tag":68,"props":360911,"children":360913},{"id":360912},"ideas-for-adding-integrations-to-your-saas",[360914],{"type":23,"value":360915},"Ideas for adding integrations to your SaaS",{"type":17,"tag":29,"props":360917,"children":360918},{},[360919],{"type":23,"value":360920},"We met with developers at the Web Summit in Lisbon, Portugal this month. Learning about what they're building has been amazing, and we're eager to help. So, we've started putting together developer guides for common SaaS use cases.",{"type":17,"tag":29,"props":360922,"children":360923},{},[360924],{"type":17,"tag":48,"props":360925,"children":360926},{},[360927],{"type":23,"value":360928},"Guide: How to build a candidate assessment product",{"type":17,"tag":29,"props":360930,"children":360931},{},[360932],{"type":23,"value":360933},"Learn how to build a candidate assessment product using pre-built ATS (applicant tracking system) integrations with platforms like Teamtailor, Lever, and Greenhouse. Leverage ATS data to automatically send candidate assessments at the right stage and update applications with the results.",{"type":17,"tag":29,"props":360935,"children":360936},{},[360937],{"type":17,"tag":133,"props":360938,"children":360940},{"href":278898,"rel":360939},[214],[360941],{"type":23,"value":360942},"Read the guide",{"type":17,"tag":29,"props":360944,"children":360945},{},[360946],{"type":17,"tag":48,"props":360947,"children":360948},{},[360949],{"type":23,"value":360950},"Guide: How to build a lead generation product",{"type":17,"tag":29,"props":360952,"children":360953},{},[360954],{"type":23,"value":360955},"Learn how to build a sales lead generation product by using pre-built CRM (customer relationship management) integrations with platforms like Salesforce, Hubspot, and Pipedrive. Leverage CRM data to add leads to your customers' preferred CRM seamlessly.",{"type":17,"tag":29,"props":360957,"children":360958},{},[360959],{"type":17,"tag":133,"props":360960,"children":360963},{"href":360961,"rel":360962},"https://unified.to/blog/how_to_build_a_sales_lead_generation_product_with_unified",[214],[360964],{"type":23,"value":360942},{"type":17,"tag":68,"props":360966,"children":360968},{"id":360967},"commercialize-integrations-with-a-directory-page",[360969],{"type":23,"value":360970},"Commercialize integrations with a directory page",{"type":17,"tag":29,"props":360972,"children":360973},{},[360974],{"type":17,"tag":6438,"props":360975,"children":360978},{"alt":360976,"src":360977},"Unified_Accounting_API_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_nov_2023_product_updates-1.png",[],{"type":17,"tag":29,"props":360980,"children":360981},{},[360982],{"type":23,"value":360983},"Deployed integrations? Simplify promotion for your marketing and sales teams. Create an integrations directory on your website using our latest UI component for public websites. Just copy and paste one line of code to showcase activated integrations on your site.",{"type":17,"tag":80,"props":360985,"children":360986},{},[360987,360992,360997],{"type":17,"tag":84,"props":360988,"children":360989},{},[360990],{"type":23,"value":360991},"Add an integrations directory to any web page with one line of code",{"type":17,"tag":84,"props":360993,"children":360994},{},[360995],{"type":23,"value":360996},"Watch your website update automatically when new integrations are deployed",{"type":17,"tag":84,"props":360998,"children":360999},{},[361000],{"type":23,"value":361001},"Easily customize CSS styles, integration categories, click-through URLs and tabs",{"type":17,"tag":29,"props":361003,"children":361004},{},[361005],{"type":17,"tag":133,"props":361006,"children":361008},{"href":1612,"rel":361007},[214],[361009],{"type":23,"value":361010},"Create your free account",{"type":17,"tag":68,"props":361012,"children":361014},{"id":361013},"add-accounting-data-to-your-saas",[361015],{"type":23,"value":361016},"Add accounting data to your SaaS",{"type":17,"tag":29,"props":361018,"children":361019},{},[361020],{"type":17,"tag":6438,"props":361021,"children":361024},{"alt":361022,"src":361023},"Unified_Accounting_API.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_nov_2023_product_updates-2.png",[],{"type":17,"tag":29,"props":361026,"children":361027},{},[361028],{"type":23,"value":361029},"Need accounting data for your SaaS? Whether your SaaS relies on third-party accounting data for reporting & analytics, expense tracking, or tax compliance — we've made it easy to extend your functionality and support more customers with accounting integrations.",{"type":17,"tag":29,"props":361031,"children":361032},{},[361033],{"type":23,"value":361034},"Now available:",{"type":17,"tag":80,"props":361036,"children":361037},{},[361038,361048,361056],{"type":17,"tag":84,"props":361039,"children":361040},{},[361041],{"type":17,"tag":133,"props":361042,"children":361045},{"href":361043,"rel":361044},"https://www.notion.so/unified-to/Unified-s-Help-Center-9341805d6f6c4b94bea51ef55df9a0e9?p=171395dd68eb4ffdb53d7287f0d98b23&showMoveTo=true#",[214],[361046],{"type":23,"value":361047},"Intuit QuickBooks",{"type":17,"tag":84,"props":361049,"children":361050},{},[361051],{"type":17,"tag":133,"props":361052,"children":361054},{"href":361043,"rel":361053},[214],[361055],{"type":23,"value":6678},{"type":17,"tag":84,"props":361057,"children":361058},{},[361059],{"type":17,"tag":133,"props":361060,"children":361062},{"href":361043,"rel":361061},[214],[361063],{"type":23,"value":38530},{"type":17,"tag":29,"props":361065,"children":361066},{},[361067],{"type":17,"tag":133,"props":361068,"children":361070},{"href":83766,"rel":361069},[214],[361071],{"type":23,"value":361072},"Start adding accounting integrations",{"type":17,"tag":68,"props":361074,"children":361076},{"id":361075},"new-sdks-ruby-and-c",[361077],{"type":23,"value":361078},"New SDKs: Ruby and C#",{"type":17,"tag":29,"props":361080,"children":361081},{},[361082],{"type":17,"tag":6438,"props":361083,"children":361086},{"alt":361084,"src":361085},"SDKs_Ruby_and_C-Sharp.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_nov_2023_product_updates-3.png",[],{"type":17,"tag":29,"props":361088,"children":361089},{},[361090],{"type":23,"value":361091},"We've added support for Ruby and C# (C-Sharp) to our SDKs in addition to Go, PHP, Java, and Python. Our SDKs stay up-to-date automatically with our Unified APIs, ensuring you never miss out on the latest enhancements.",{"type":17,"tag":29,"props":361093,"children":361094},{},[361095,361097,361104],{"type":23,"value":361096},"We've been able to rapidly deploy SDKs thanks to our partnership with ",{"type":17,"tag":133,"props":361098,"children":361101},{"href":361099,"rel":361100},"https://www.speakeasyapi.dev/customers/unified",[214],[361102],{"type":23,"value":361103},"Speakeasy",{"type":23,"value":54},{"type":17,"tag":29,"props":361106,"children":361107},{},[361108],{"type":17,"tag":133,"props":361109,"children":361111},{"href":357728,"rel":361110},[214],[361112],{"type":23,"value":361113},"Learn more about our SDKs",{"type":17,"tag":68,"props":361115,"children":361117},{"id":361116},"integration-updates",[361118],{"type":23,"value":361119},"Integration updates",{"type":17,"tag":29,"props":361121,"children":361122},{},[361123],{"type":17,"tag":48,"props":361124,"children":361125},{},[361126],{"type":23,"value":101761},{"type":17,"tag":80,"props":361128,"children":361129},{},[361130,361142,361179],{"type":17,"tag":84,"props":361131,"children":361132},{},[361133,361135,361141],{"type":23,"value":361134},"1 new integration: ",{"type":17,"tag":133,"props":361136,"children":361139},{"href":361137,"rel":361138},"https://unified.to/integrations/cornerstone",[214],[361140],{"type":23,"value":182663},{"type":23,"value":54},{"type":17,"tag":84,"props":361143,"children":361144},{},[361145,361147,361151,361152,361158,361159,361164,361165,361172,361173,361178],{"type":23,"value":361146},"Added Group ",{"type":17,"tag":133,"props":361148,"children":361149},{"href":4999},[361150],{"type":23,"value":5002},{"type":23,"value":272695},{"type":17,"tag":133,"props":361153,"children":361155},{"href":309985,"rel":361154},[214],[361156],{"type":23,"value":361157},"Monday.com",{"type":23,"value":11826},{"type":17,"tag":133,"props":361160,"children":361162},{"href":346256,"rel":361161},[214],[361163],{"type":23,"value":23053},{"type":23,"value":11826},{"type":17,"tag":133,"props":361166,"children":361169},{"href":361167,"rel":361168},"https://unified.to/integrations/strongdm",[214],[361170],{"type":23,"value":361171},"StrongDM",{"type":23,"value":34435},{"type":17,"tag":133,"props":361174,"children":361176},{"href":322598,"rel":361175},[214],[361177],{"type":23,"value":14472},{"type":23,"value":54},{"type":17,"tag":84,"props":361180,"children":361181},{},[361182,361187],{"type":17,"tag":133,"props":361183,"children":361185},{"href":322514,"rel":361184},[214],[361186],{"type":23,"value":3184},{"type":23,"value":361188}," object Employee added new readable fields: employment_status",{"type":17,"tag":29,"props":361190,"children":361191},{},[361192],{"type":17,"tag":48,"props":361193,"children":361194},{},[361195],{"type":23,"value":11756},{"type":17,"tag":80,"props":361197,"children":361198},{},[361199,361217,361228,361239,361257,361268,361286,361297,361307,361316,361325,361335,361346,361356,361365,361374,361383,361393,361403,361414,361424,361433,361443,361452,361463,361473],{"type":17,"tag":84,"props":361200,"children":361201},{},[361202,361204,361209,361210,361216],{"type":23,"value":361203},"2 new integrations: ",{"type":17,"tag":133,"props":361205,"children":361207},{"href":361137,"rel":361206},[214],[361208],{"type":23,"value":182663},{"type":23,"value":34435},{"type":17,"tag":133,"props":361211,"children":361214},{"href":361212,"rel":361213},"https://unified.to/integrations/jobvite",[214],[361215],{"type":23,"value":75331},{"type":23,"value":54},{"type":17,"tag":84,"props":361218,"children":361219},{},[361220,361222,361227],{"type":23,"value":361221},"Added Interview webhooks to ",{"type":17,"tag":133,"props":361223,"children":361225},{"href":337821,"rel":361224},[214],[361226],{"type":23,"value":56545},{"type":23,"value":54},{"type":17,"tag":84,"props":361229,"children":361230},{},[361231,361233,361238],{"type":23,"value":361232},"Added Job object to ",{"type":17,"tag":133,"props":361234,"children":361236},{"href":353547,"rel":361235},[214],[361237],{"type":23,"value":3194},{"type":23,"value":54},{"type":17,"tag":84,"props":361240,"children":361241},{},[361242,361244,361249,361250,361256],{"type":23,"value":361243},"Added Application object to ",{"type":17,"tag":133,"props":361245,"children":361247},{"href":353547,"rel":361246},[214],[361248],{"type":23,"value":3194},{"type":23,"value":34435},{"type":17,"tag":133,"props":361251,"children":361254},{"href":361252,"rel":361253},"https://unified.to/integrations/sage",[214],[361255],{"type":23,"value":59367},{"type":23,"value":54},{"type":17,"tag":84,"props":361258,"children":361259},{},[361260,361262,361267],{"type":23,"value":361261},"Added Interview object to ",{"type":17,"tag":133,"props":361263,"children":361265},{"href":337821,"rel":361264},[214],[361266],{"type":23,"value":56545},{"type":23,"value":54},{"type":17,"tag":84,"props":361269,"children":361270},{},[361271,361273,361279,361280,361285],{"type":23,"value":361272},"Added Document object to ",{"type":17,"tag":133,"props":361274,"children":361277},{"href":361275,"rel":361276},"https://unified.to/integrations/teamtailor",[214],[361278],{"type":23,"value":56574},{"type":23,"value":34435},{"type":17,"tag":133,"props":361281,"children":361283},{"href":337828,"rel":361282},[214],[361284],{"type":23,"value":56564},{"type":23,"value":54},{"type":17,"tag":84,"props":361287,"children":361288},{},[361289,361295],{"type":17,"tag":133,"props":361290,"children":361293},{"href":361291,"rel":361292},"https://unified.to/integrations/ashby",[214],[361294],{"type":23,"value":75326},{"type":23,"value":361296}," object Candidate added new readable fields: link_urls",{"type":17,"tag":84,"props":361298,"children":361299},{},[361300,361306],{"type":17,"tag":133,"props":361301,"children":361304},{"href":361302,"rel":361303},"https://unified.to/integrations/breezyhr",[214],[361305],{"type":23,"value":56361},{"type":23,"value":361296},{"type":17,"tag":84,"props":361308,"children":361309},{},[361310,361315],{"type":17,"tag":133,"props":361311,"children":361313},{"href":354487,"rel":361312},[214],[361314],{"type":23,"value":354491},{"type":23,"value":361296},{"type":17,"tag":84,"props":361317,"children":361318},{},[361319,361324],{"type":17,"tag":133,"props":361320,"children":361322},{"href":337814,"rel":361321},[214],[361323],{"type":23,"value":3189},{"type":23,"value":361296},{"type":17,"tag":84,"props":361326,"children":361327},{},[361328,361333],{"type":17,"tag":133,"props":361329,"children":361331},{"href":337814,"rel":361330},[214],[361332],{"type":23,"value":3189},{"type":23,"value":361334}," object Job added new readable fields: recruiter_ids and hiring_manager_ids",{"type":17,"tag":84,"props":361336,"children":361337},{},[361338,361345],{"type":17,"tag":133,"props":361339,"children":361342},{"href":361340,"rel":361341},"https://unified.to/integrations/jazzhr",[214],[361343],{"type":23,"value":361344},"JazzHR",{"type":23,"value":361296},{"type":17,"tag":84,"props":361347,"children":361348},{},[361349,361354],{"type":17,"tag":133,"props":361350,"children":361352},{"href":355688,"rel":361351},[214],[361353],{"type":23,"value":310119},{"type":23,"value":361355}," object Job added new readable fields: hiring_manager_ids and status",{"type":17,"tag":84,"props":361357,"children":361358},{},[361359,361364],{"type":17,"tag":133,"props":361360,"children":361362},{"href":355688,"rel":361361},[214],[361363],{"type":23,"value":310119},{"type":23,"value":361296},{"type":17,"tag":84,"props":361366,"children":361367},{},[361368,361373],{"type":17,"tag":133,"props":361369,"children":361371},{"href":341525,"rel":361370},[214],[361372],{"type":23,"value":341529},{"type":23,"value":361296},{"type":17,"tag":84,"props":361375,"children":361376},{},[361377,361382],{"type":17,"tag":133,"props":361378,"children":361380},{"href":337821,"rel":361379},[214],[361381],{"type":23,"value":56545},{"type":23,"value":361296},{"type":17,"tag":84,"props":361384,"children":361385},{},[361386,361391],{"type":17,"tag":133,"props":361387,"children":361389},{"href":337821,"rel":361388},[214],[361390],{"type":23,"value":56545},{"type":23,"value":361392}," object Job added new readable fields: recruiter_ids",{"type":17,"tag":84,"props":361394,"children":361395},{},[361396,361402],{"type":17,"tag":133,"props":361397,"children":361400},{"href":361398,"rel":361399},"https://unified.to/integrations/recruitcrm",[214],[361401],{"type":23,"value":56594},{"type":23,"value":361296},{"type":17,"tag":84,"props":361404,"children":361405},{},[361406,361413],{"type":17,"tag":133,"props":361407,"children":361410},{"href":361408,"rel":361409},"https://unified.to/integrations/recruiterflow",[214],[361411],{"type":23,"value":361412},"Recruiterflow",{"type":23,"value":361296},{"type":17,"tag":84,"props":361415,"children":361416},{},[361417,361423],{"type":17,"tag":133,"props":361418,"children":361421},{"href":361419,"rel":361420},"https://unified.to/integrations/smartrecruiters",[214],[361422],{"type":23,"value":75321},{"type":23,"value":361296},{"type":17,"tag":84,"props":361425,"children":361426},{},[361427,361432],{"type":17,"tag":133,"props":361428,"children":361430},{"href":361275,"rel":361429},[214],[361431],{"type":23,"value":56574},{"type":23,"value":361296},{"type":17,"tag":84,"props":361434,"children":361435},{},[361436,361441],{"type":17,"tag":133,"props":361437,"children":361439},{"href":361275,"rel":361438},[214],[361440],{"type":23,"value":56574},{"type":23,"value":361442}," object Application added new readable fields: source",{"type":17,"tag":84,"props":361444,"children":361445},{},[361446,361451],{"type":17,"tag":133,"props":361447,"children":361449},{"href":337828,"rel":361448},[214],[361450],{"type":23,"value":56564},{"type":23,"value":361296},{"type":17,"tag":84,"props":361453,"children":361454},{},[361455,361462],{"type":17,"tag":133,"props":361456,"children":361459},{"href":361457,"rel":361458},"https://unified.to/integrations/zohorecruit",[214],[361460],{"type":23,"value":361461},"ZohoRecruit",{"type":23,"value":361296},{"type":17,"tag":84,"props":361464,"children":361465},{},[361466,361471],{"type":17,"tag":133,"props":361467,"children":361469},{"href":337821,"rel":361468},[214],[361470],{"type":23,"value":56545},{"type":23,"value":361472}," object Candidate added new writable fields: name, emails, address, tags and telephones",{"type":17,"tag":84,"props":361474,"children":361475},{},[361476,361481],{"type":17,"tag":133,"props":361477,"children":361479},{"href":337821,"rel":361478},[214],[361480],{"type":23,"value":56545},{"type":23,"value":361482}," object Job added new writable fields: addresses, name, employment_type, remote, departments, description and hiring_manager_ids",{"type":17,"tag":29,"props":361484,"children":361485},{},[361486],{"type":17,"tag":48,"props":361487,"children":361488},{},[361489],{"type":23,"value":25731},{"type":17,"tag":80,"props":361491,"children":361492},{},[361493,361547,361632,361642,361652,361661,361671,361681,361691,361701,361711,361721,361738,361749,361761,361772,361783,361794,361805,361816,361827,361838,361849,361860,361871,361882],{"type":17,"tag":84,"props":361494,"children":361495},{},[361496,361498,361503,361504,361511,361512,361518,361519,361525,361526,361531,361532,361538,361539,361546],{"type":23,"value":361497},"Added Lead webhooks to ",{"type":17,"tag":133,"props":361499,"children":361501},{"href":331264,"rel":361500},[214],[361502],{"type":23,"value":192282},{"type":23,"value":11826},{"type":17,"tag":133,"props":361505,"children":361508},{"href":361506,"rel":361507},"https://unified.to/integrations/closeio",[214],[361509],{"type":23,"value":361510},"Close.io",{"type":23,"value":11826},{"type":17,"tag":133,"props":361513,"children":361516},{"href":361514,"rel":361515},"https://unified.to/integrations/copper",[214],[361517],{"type":23,"value":61628},{"type":23,"value":11826},{"type":17,"tag":133,"props":361520,"children":361523},{"href":361521,"rel":361522},"https://unified.to/integrations/highlevel",[214],[361524],{"type":23,"value":42955},{"type":23,"value":11826},{"type":17,"tag":133,"props":361527,"children":361529},{"href":322514,"rel":361528},[214],[361530],{"type":23,"value":3184},{"type":23,"value":11826},{"type":17,"tag":133,"props":361533,"children":361536},{"href":361534,"rel":361535},"https://unified.to/integrations/pipedrive",[214],[361537],{"type":23,"value":26530},{"type":23,"value":34435},{"type":17,"tag":133,"props":361540,"children":361543},{"href":361541,"rel":361542},"https://unified.to/integrations/salesflare",[214],[361544],{"type":23,"value":361545},"Salesflare",{"type":23,"value":54},{"type":17,"tag":84,"props":361548,"children":361549},{},[361550,361552,361557,361558,361565,361566,361571,361572,361577,361578,361585,361586,361591,361592,361597,361598,361603,361604,361609,361610,361615,361616,361623,361624,361631],{"type":23,"value":361551},"Added Lead object to ",{"type":17,"tag":133,"props":361553,"children":361555},{"href":331264,"rel":361554},[214],[361556],{"type":23,"value":192282},{"type":23,"value":11826},{"type":17,"tag":133,"props":361559,"children":361562},{"href":361560,"rel":361561},"https://unified.to/integrations/affinity",[214],[361563],{"type":23,"value":361564},"Affinity",{"type":23,"value":11826},{"type":17,"tag":133,"props":361567,"children":361569},{"href":361506,"rel":361568},[214],[361570],{"type":23,"value":361510},{"type":23,"value":11826},{"type":17,"tag":133,"props":361573,"children":361575},{"href":361514,"rel":361574},[214],[361576],{"type":23,"value":61628},{"type":23,"value":11826},{"type":17,"tag":133,"props":361579,"children":361582},{"href":361580,"rel":361581},"https://unified.to/integrations/freshsales",[214],[361583],{"type":23,"value":361584},"Freshworks CRM",{"type":23,"value":11826},{"type":17,"tag":133,"props":361587,"children":361589},{"href":361521,"rel":361588},[214],[361590],{"type":23,"value":42955},{"type":23,"value":11826},{"type":17,"tag":133,"props":361593,"children":361595},{"href":322514,"rel":361594},[214],[361596],{"type":23,"value":3184},{"type":23,"value":11826},{"type":17,"tag":133,"props":361599,"children":361601},{"href":361534,"rel":361600},[214],[361602],{"type":23,"value":26530},{"type":23,"value":11826},{"type":17,"tag":133,"props":361605,"children":361607},{"href":361398,"rel":361606},[214],[361608],{"type":23,"value":56594},{"type":23,"value":11826},{"type":17,"tag":133,"props":361611,"children":361613},{"href":361541,"rel":361612},[214],[361614],{"type":23,"value":361545},{"type":23,"value":11826},{"type":17,"tag":133,"props":361617,"children":361620},{"href":361618,"rel":361619},"https://unified.to/integrations/zendesksell",[214],[361621],{"type":23,"value":361622},"ZendeskSell",{"type":23,"value":34435},{"type":17,"tag":133,"props":361625,"children":361628},{"href":361626,"rel":361627},"https://unified.to/integrations/zohocrm",[214],[361629],{"type":23,"value":361630},"ZohoCRM",{"type":23,"value":54},{"type":17,"tag":84,"props":361633,"children":361634},{},[361635,361640],{"type":17,"tag":133,"props":361636,"children":361638},{"href":354454,"rel":361637},[214],[361639],{"type":23,"value":280437},{"type":23,"value":361641}," object Lead added new readable fields: source, status, is_active, company_id, company_name and contact_id",{"type":17,"tag":84,"props":361643,"children":361644},{},[361645,361650],{"type":17,"tag":133,"props":361646,"children":361648},{"href":322514,"rel":361647},[214],[361649],{"type":23,"value":3184},{"type":23,"value":361651}," object Event added new readable fields: lead_ids",{"type":17,"tag":84,"props":361653,"children":361654},{},[361655,361660],{"type":17,"tag":133,"props":361656,"children":361658},{"href":322650,"rel":361657},[214],[361659],{"type":23,"value":3179},{"type":23,"value":361651},{"type":17,"tag":84,"props":361662,"children":361663},{},[361664,361669],{"type":17,"tag":133,"props":361665,"children":361667},{"href":322650,"rel":361666},[214],[361668],{"type":23,"value":3179},{"type":23,"value":361670}," object Lead added new readable fields: company_name and status",{"type":17,"tag":84,"props":361672,"children":361673},{},[361674,361679],{"type":17,"tag":133,"props":361675,"children":361677},{"href":354454,"rel":361676},[214],[361678],{"type":23,"value":280437},{"type":23,"value":361680}," object Lead added new writable fields: source, status and company_name",{"type":17,"tag":84,"props":361682,"children":361683},{},[361684,361689],{"type":17,"tag":133,"props":361685,"children":361687},{"href":361506,"rel":361686},[214],[361688],{"type":23,"value":361510},{"type":23,"value":361690}," object Contact added new writable fields: company_ids",{"type":17,"tag":84,"props":361692,"children":361693},{},[361694,361699],{"type":17,"tag":133,"props":361695,"children":361697},{"href":322514,"rel":361696},[214],[361698],{"type":23,"value":3184},{"type":23,"value":361700}," object Event added new writable fields: lead_ids",{"type":17,"tag":84,"props":361702,"children":361703},{},[361704,361710],{"type":17,"tag":133,"props":361705,"children":361708},{"href":361706,"rel":361707},"http://url6257.unified.to/ls/click?upn=PMcYCNkw82cr38w3FUi8bS5NN847EnH-2FojiKAHFg2aKZPcjhkAGhMRJnKvxQ4oz8Q8nWiGrByTwDSVKoB9Y70Q-3D-3D9zO9_QpDDGFZADonEGWBlldzoZuDft5rE-2BX1T3F1CDLQvqkepDGyTEEB7UxhV6sGijFyhaRAQyfs8YSlLFd6zzRib2tEX3dUN9RgXTHpD8ZBX-2FBahNAWcLWjYg0nUja-2BbAO2gT-2BlN4fq0Jloc3-2FKaqhzfPsVaBjUAE0c8kUfHjn62u7ls0BdUtVs-2BEM6GhvOJXK-2BrVU2T3tp7fFnXhzb30lehrp7E-2F1zppFSyy3C-2F8cSTIl3PLT8GX0mL0wFfp0isbOaNna2Gn0YE7PaZw1jmxg3SA4YgRrS-2Fjef6EUU-2F032XEe3wWTUCe-2FiirJNK0NhkjRnEPjqNYGPi9-2BMUbGY4MJghapn-2Fc9K6nlvPxHTaUwojvRWlIKUGg-2BFJ8-2Fuz6vXcnqqYNQNq20riQFNV2A3q8eiqknnpTeMx-2F4YYQVF9-2B9-2BCoKL5Oyj924AbYZwqLnh83pvtWbUuD4AZZdtfGg3JqqHn2MqzX-2Fj7lG7q99ToG3S-2FxCwdazu3-2FbQZl-2BNOXHDxOLHLmcufERWB9RF8zAXzQDCsLZ6oEY7zuRpFRGB7YTIWPPM-3D",[214],[361709],{"type":23,"value":3179},{"type":23,"value":361700},{"type":17,"tag":84,"props":361712,"children":361713},{},[361714,361719],{"type":17,"tag":133,"props":361715,"children":361717},{"href":322650,"rel":361716},[214],[361718],{"type":23,"value":3179},{"type":23,"value":361720}," object Lead added new writable fields: company_name and status",{"type":17,"tag":84,"props":361722,"children":361723},{},[361724,361726,361730,361732,361737],{"type":23,"value":361725},"Added list_updated_gte ",{"type":17,"tag":133,"props":361727,"children":361728},{"href":1857},[361729],{"type":23,"value":1860},{"type":23,"value":361731}," for Company to ",{"type":17,"tag":133,"props":361733,"children":361735},{"href":322514,"rel":361734},[214],[361736],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361739,"children":361740},{},[361741,361743,361748],{"type":23,"value":361742},"Added list_updated_gte pagination for Contact to ",{"type":17,"tag":133,"props":361744,"children":361746},{"href":322514,"rel":361745},[214],[361747],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361750,"children":361751},{},[361752,361754,361760],{"type":23,"value":361753},"Added list_updated_gte pagination for Deal to ",{"type":17,"tag":133,"props":361755,"children":361758},{"href":361756,"rel":361757},"http://url6257.unified.to/ls/click?upn=PMcYCNkw82cr38w3FUi8bS5NN847EnH-2FojiKAHFg2aIhwe0i7gzEmZJWyuCxizahlUcm3ZXD8Ag1pcqEZ2fqyQ-3D-3DjrCd_QpDDGFZADonEGWBlldzoZuDft5rE-2BX1T3F1CDLQvqkepDGyTEEB7UxhV6sGijFyhaRAQyfs8YSlLFd6zzRib2tEX3dUN9RgXTHpD8ZBX-2FBahNAWcLWjYg0nUja-2BbAO2gT-2BlN4fq0Jloc3-2FKaqhzfPsVaBjUAE0c8kUfHjn62u7ls0BdUtVs-2BEM6GhvOJXK-2BrVU2T3tp7fFnXhzb30lehrp7E-2F1zppFSyy3C-2F8cSTIl3PLT8GX0mL0wFfp0isbOaNna2Gn0YE7PaZw1jmxg3SA4YgRrS-2Fjef6EUU-2F032XEe3wWTUCe-2FiirJNK0NhkjRnEPjqNYGPi9-2BMUbGY4MJghapn-2Fc9K6nlvPxHTaUwojvRWlIKUGg-2BFJ8-2Fuz6vXcnqqYNQNq20riQFNV2A3q8eiqkuUihiAumhuumDY-2BY0L3SInHONXy6Q2-2FyhkW-2FbgL4ArvV7uv8Bzhz0Pe9BRUNENA0psp80X8X0q8iWwWWwaUloz1g6b3B5ofJPQrRcdwFogHYtws-2FerIUh2A3u19t70d70Ac792-2FN-2FuclLV4ieGTxog-3D",[214],[361759],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361762,"children":361763},{},[361764,361766,361771],{"type":23,"value":361765},"Added list_sort_by_created_at pagination for Company to ",{"type":17,"tag":133,"props":361767,"children":361769},{"href":322514,"rel":361768},[214],[361770],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361773,"children":361774},{},[361775,361777,361782],{"type":23,"value":361776},"Added list_sort_by_created_at pagination for Contact to ",{"type":17,"tag":133,"props":361778,"children":361780},{"href":322514,"rel":361779},[214],[361781],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361784,"children":361785},{},[361786,361788,361793],{"type":23,"value":361787},"Added list_sort_by_created_at pagination for Deal to ",{"type":17,"tag":133,"props":361789,"children":361791},{"href":322514,"rel":361790},[214],[361792],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361795,"children":361796},{},[361797,361799,361804],{"type":23,"value":361798},"Added list_sort_by_updated_at pagination for Company to ",{"type":17,"tag":133,"props":361800,"children":361802},{"href":322514,"rel":361801},[214],[361803],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361806,"children":361807},{},[361808,361810,361815],{"type":23,"value":361809},"Added list_sort_by_updated_at pagination for Contact to ",{"type":17,"tag":133,"props":361811,"children":361813},{"href":322514,"rel":361812},[214],[361814],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361817,"children":361818},{},[361819,361821,361826],{"type":23,"value":361820},"Added list_sort_by_updated_at pagination for Deal to ",{"type":17,"tag":133,"props":361822,"children":361824},{"href":322514,"rel":361823},[214],[361825],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361828,"children":361829},{},[361830,361832,361837],{"type":23,"value":361831},"Added list_order pagination for Company to ",{"type":17,"tag":133,"props":361833,"children":361835},{"href":322514,"rel":361834},[214],[361836],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361839,"children":361840},{},[361841,361843,361848],{"type":23,"value":361842},"Added list_order pagination for Contact to ",{"type":17,"tag":133,"props":361844,"children":361846},{"href":322514,"rel":361845},[214],[361847],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361850,"children":361851},{},[361852,361854,361859],{"type":23,"value":361853},"Added list_order pagination for Deal to ",{"type":17,"tag":133,"props":361855,"children":361857},{"href":322514,"rel":361856},[214],[361858],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361861,"children":361862},{},[361863,361865,361870],{"type":23,"value":361864},"Added list_query pagination for Company to ",{"type":17,"tag":133,"props":361866,"children":361868},{"href":322514,"rel":361867},[214],[361869],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361872,"children":361873},{},[361874,361876,361881],{"type":23,"value":361875},"Added list_contact_id pagination for Lead to ",{"type":17,"tag":133,"props":361877,"children":361879},{"href":322650,"rel":361878},[214],[361880],{"type":23,"value":3179},{"type":23,"value":54},{"type":17,"tag":84,"props":361883,"children":361884},{},[361885,361887,361892],{"type":23,"value":361886},"Added list_company_id pagination for Lead to ",{"type":17,"tag":133,"props":361888,"children":361890},{"href":322650,"rel":361889},[214],[361891],{"type":23,"value":3179},{"type":23,"value":54},{"type":17,"tag":29,"props":361894,"children":361895},{},[361896],{"type":17,"tag":48,"props":361897,"children":361898},{},[361899],{"type":23,"value":11718},{"type":17,"tag":80,"props":361901,"children":361902},{},[361903,361914,361925,361936,361947],{"type":17,"tag":84,"props":361904,"children":361905},{},[361906,361908,361913],{"type":23,"value":361907},"Added list_updated_gte pagination for Member to ",{"type":17,"tag":133,"props":361909,"children":361911},{"href":322514,"rel":361910},[214],[361912],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361915,"children":361916},{},[361917,361919,361924],{"type":23,"value":361918},"Added list_sort_by_created_at pagination for Member to ",{"type":17,"tag":133,"props":361920,"children":361922},{"href":322514,"rel":361921},[214],[361923],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361926,"children":361927},{},[361928,361930,361935],{"type":23,"value":361929},"Added list_sort_by_updated_at pagination for Member to ",{"type":17,"tag":133,"props":361931,"children":361933},{"href":322514,"rel":361932},[214],[361934],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361937,"children":361938},{},[361939,361941,361946],{"type":23,"value":361940},"Added list_order pagination for Member to ",{"type":17,"tag":133,"props":361942,"children":361944},{"href":322514,"rel":361943},[214],[361945],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361948,"children":361949},{},[361950,361952,361957],{"type":23,"value":361951},"Added list_query pagination for Member to ",{"type":17,"tag":133,"props":361953,"children":361955},{"href":322514,"rel":361954},[214],[361956],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":29,"props":361959,"children":361960},{},[361961],{"type":17,"tag":48,"props":361962,"children":361963},{},[361964],{"type":23,"value":24541},{"type":17,"tag":80,"props":361966,"children":361967},{},[361968,361979,361990,362001,362012,362023,362034,362045],{"type":17,"tag":84,"props":361969,"children":361970},{},[361971,361973,361978],{"type":23,"value":361972},"Added list_updated_gte pagination for Customer to ",{"type":17,"tag":133,"props":361974,"children":361976},{"href":322514,"rel":361975},[214],[361977],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361980,"children":361981},{},[361982,361984,361989],{"type":23,"value":361983},"Added list_updated_gte pagination for Ticket to ",{"type":17,"tag":133,"props":361985,"children":361987},{"href":322514,"rel":361986},[214],[361988],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":361991,"children":361992},{},[361993,361995,362000],{"type":23,"value":361994},"Added list_sort_by_created_at pagination for Customer to ",{"type":17,"tag":133,"props":361996,"children":361998},{"href":322514,"rel":361997},[214],[361999],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":362002,"children":362003},{},[362004,362006,362011],{"type":23,"value":362005},"Added list_sort_by_created_at pagination for Ticket to ",{"type":17,"tag":133,"props":362007,"children":362009},{"href":322514,"rel":362008},[214],[362010],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":362013,"children":362014},{},[362015,362017,362022],{"type":23,"value":362016},"Added list_sort_by_updated_at pagination for Customer to ",{"type":17,"tag":133,"props":362018,"children":362020},{"href":322514,"rel":362019},[214],[362021],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":362024,"children":362025},{},[362026,362028,362033],{"type":23,"value":362027},"Added list_sort_by_updated_at pagination for Ticket to ",{"type":17,"tag":133,"props":362029,"children":362031},{"href":322514,"rel":362030},[214],[362032],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":362035,"children":362036},{},[362037,362039,362044],{"type":23,"value":362038},"Added list_order pagination for Customer to ",{"type":17,"tag":133,"props":362040,"children":362042},{"href":322514,"rel":362041},[214],[362043],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":84,"props":362046,"children":362047},{},[362048,362050,362055],{"type":23,"value":362049},"Added list_order pagination for Ticket to ",{"type":17,"tag":133,"props":362051,"children":362053},{"href":322514,"rel":362052},[214],[362054],{"type":23,"value":3184},{"type":23,"value":54},{"type":17,"tag":29,"props":362057,"children":362058},{},[362059],{"type":17,"tag":48,"props":362060,"children":362061},{},[362062],{"type":23,"value":104365},{"type":17,"tag":80,"props":362064,"children":362065},{},[362066,362077,362088,362100],{"type":17,"tag":84,"props":362067,"children":362068},{},[362069,362071,362076],{"type":23,"value":362070},"Added Account webhooks to ",{"type":17,"tag":133,"props":362072,"children":362074},{"href":353465,"rel":362073},[214],[362075],{"type":23,"value":6678},{"type":23,"value":54},{"type":17,"tag":84,"props":362078,"children":362079},{},[362080,362082,362087],{"type":23,"value":362081},"Added Transaction webhooks to ",{"type":17,"tag":133,"props":362083,"children":362085},{"href":353465,"rel":362084},[214],[362086],{"type":23,"value":6678},{"type":23,"value":54},{"type":17,"tag":84,"props":362089,"children":362090},{},[362091,362093,362099],{"type":23,"value":362092},"Added Account object to ",{"type":17,"tag":133,"props":362094,"children":362097},{"href":362095,"rel":362096},"http://url6257.unified.to/ls/click?upn=PMcYCNkw82cr38w3FUi8bS5NN847EnH-2FojiKAHFg2aIRjQitKJlvLQvQxqHDl3Nw_3aF_QpDDGFZADonEGWBlldzoZuDft5rE-2BX1T3F1CDLQvqkepDGyTEEB7UxhV6sGijFyhaRAQyfs8YSlLFd6zzRib2tEX3dUN9RgXTHpD8ZBX-2FBahNAWcLWjYg0nUja-2BbAO2gT-2BlN4fq0Jloc3-2FKaqhzfPsVaBjUAE0c8kUfHjn62u7ls0BdUtVs-2BEM6GhvOJXK-2BrVU2T3tp7fFnXhzb30lehrp7E-2F1zppFSyy3C-2F8cSTIl3PLT8GX0mL0wFfp0isbOaNna2Gn0YE7PaZw1jmxg3SA4YgRrS-2Fjef6EUU-2F032XEe3wWTUCe-2FiirJNK0NhkjRnEPjqNYGPi9-2BMUbGY4MJghapn-2Fc9K6nlvPxHTaUwojvRWlIKUGg-2BFJ8-2Fuz6vXcnqqYNQNq20riQFNV2A3q8eiqklgyQde48aCC1oIGKkJis56ixd0ygGmhWIUtQe8ShUtP3IaIBqPG3qg3I5QxoMpCMaQEH9VXToeTilIISaFAjfAdgEyaY8kkVoEkZHpFOCMP9aFan26DNDcc-2B-2F9-2BtNpHdn2Ysf-2BrSkLKMUiR6PudGGY-3D",[214],[362098],{"type":23,"value":6678},{"type":23,"value":54},{"type":17,"tag":84,"props":362101,"children":362102},{},[362103,362105,362111],{"type":23,"value":362104},"Added Transaction object ",{"type":17,"tag":133,"props":362106,"children":362109},{"href":362107,"rel":362108},"http://url6257.unified.to/ls/click?upn=PMcYCNkw82cr38w3FUi8bS5NN847EnH-2FojiKAHFg2aIRjQitKJlvLQvQxqHDl3NwhfsS_QpDDGFZADonEGWBlldzoZuDft5rE-2BX1T3F1CDLQvqkepDGyTEEB7UxhV6sGijFyhaRAQyfs8YSlLFd6zzRib2tEX3dUN9RgXTHpD8ZBX-2FBahNAWcLWjYg0nUja-2BbAO2gT-2BlN4fq0Jloc3-2FKaqhzfPsVaBjUAE0c8kUfHjn62u7ls0BdUtVs-2BEM6GhvOJXK-2BrVU2T3tp7fFnXhzb30lehrp7E-2F1zppFSyy3C-2F8cSTIl3PLT8GX0mL0wFfp0isbOaNna2Gn0YE7PaZw1jmxg3SA4YgRrS-2Fjef6EUU-2F032XEe3wWTUCe-2FiirJNK0NhkjRnEPjqNYGPi9-2BMUbGY4MJghapn-2Fc9K6nlvPxHTaUwojvRWlIKUGg-2BFJ8-2Fuz6vXcnqqYNQNq20riQFNV2A3q8eiqkoqn-2BESDJcwlx2Z5s2rzuf-2FK4gKlrzqkGBJyzXhKZoVZDE6HgPGqxJrsADndyUJYEf-2BZthCilBiE3S-2BXbuTW3-2FXx3lK-2FE6p3f-2FpA8E0ApcLYCp8fiITDtYEoXL271k4r9U23VrT2f57I4yuasY3IuO0-3D",[214],[362110],{"type":23,"value":6678},{"type":23,"value":54},{"type":17,"tag":29,"props":362113,"children":362114},{},[362115,362117,362122,362124,362131,362132,362138],{"type":23,"value":362116},"Need help getting started with customer-facing integrations? Ask for help on ",{"type":17,"tag":133,"props":362118,"children":362120},{"href":326013,"rel":362119},[214],[362121],{"type":23,"value":15720},{"type":23,"value":362123},", watch our ",{"type":17,"tag":133,"props":362125,"children":362128},{"href":362126,"rel":362127},"https://www.youtube.com/@unified_api",[214],[362129],{"type":23,"value":362130},"tutorials",{"type":23,"value":27293},{"type":17,"tag":133,"props":362133,"children":362135},{"href":215330,"rel":362134},[214],[362136],{"type":23,"value":362137},"request a meeting",{"type":23,"value":362139}," with our integration experts.",{"type":17,"tag":29,"props":362141,"children":362142},{},[362143],{"type":23,"value":328392},{"title":7,"searchDepth":1629,"depth":1629,"links":362145},[362146,362147,362148,362149,362150,362151],{"id":360866,"depth":1629,"text":360869},{"id":360912,"depth":1629,"text":360915},{"id":360967,"depth":1629,"text":360970},{"id":361013,"depth":1629,"text":361016},{"id":361075,"depth":1629,"text":361078},{"id":361116,"depth":1629,"text":361119},"content:blog:unified_nov_2023_product_updates.md","blog/unified_nov_2023_product_updates.md","blog/unified_nov_2023_product_updates",{"_path":362156,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":362157,"description":362158,"img":362159,"date":362160,"tag":12,"body":362161,"_type":1677,"_id":362884,"_source":1679,"_file":362885,"_stem":362886,"_extension":1682},"/blog/building_your_integration_strategy_a_deep_dive_into_integration_technology","Building your integration strategy: a deep dive into integration technology","The shift from iPaaS to Unified APIs represents more than an improvement to integration technology; it is a fundamental change in how efficiently software...","https://s3.us-east-2.amazonaws.com/unified-article-images/building_your_integration_strategy_a_deep_dive_into_integration_technology-icon.png","2023-11-02T00:00:00.000Z",{"type":14,"children":362162,"toc":362876},[362163,362168,362171,362179,362190,362213,362218,362223,362229,362237,362247,362264,362272,362285,362293,362306,362316,362348,362355,362373,362379,362387,362397,362406,362413,362426,362433,362446,362455,362479,362490,362497,362515,362521,362529,362538,362547,362554,362567,362574,362587,362597,362602,362609,362627,362633,362641,362650,362659,362666,362684,362691,362704,362713,362739,362762,362769,362787,362793,362798,362803,362808,362812,362817,362840,362859],{"type":17,"tag":18,"props":362164,"children":362166},{"id":362165},"building-your-integration-strategy-a-deep-dive-into-integration-technology",[362167],{"type":23,"value":362157},{"type":17,"tag":25,"props":362169,"children":362170},{},[],{"type":17,"tag":29,"props":362172,"children":362173},{},[362174],{"type":17,"tag":33,"props":362175,"children":362176},{},[362177],{"type":23,"value":362178},"November 2, 2023",{"type":17,"tag":29,"props":362180,"children":362181},{},[362182],{"type":17,"tag":33,"props":362183,"children":362184},{},[362185],{"type":17,"tag":48,"props":362186,"children":362187},{},[362188],{"type":23,"value":362189},"The shift from iPaaS to Unified APIs represents more than an improvement to integration technology; it is a fundamental change in how efficiently software companies access and leverage third-party data.",{"type":17,"tag":29,"props":362191,"children":362192},{},[362193,362195,362202,362204,362211],{"type":23,"value":362194},"Today, there are more than ",{"type":17,"tag":133,"props":362196,"children":362199},{"href":362197,"rel":362198},"https://explodingtopics.com/blog/number-of-saas-companies",[214],[362200],{"type":23,"value":362201},"30,000 SaaS companies",{"type":23,"value":362203}," worldwide, creating an interdependent ecosystem where SaaS providers rely on related third-party products to power fundamental functionalities in their products. For example, a payroll software product depends on ",{"type":17,"tag":133,"props":362205,"children":362208},{"href":362206,"rel":362207},"https://unified.to/blog/the_hr_tech_transformation_leveraging_api_integrations_for_growth",[214],[362209],{"type":23,"value":362210},"employee data from integrations with HRIS systems",{"type":23,"value":362212}," to issue automated employee payments. Access to third-party data is no longer a strategic choice but a fundamental necessity of any modern SaaS solution.",{"type":17,"tag":29,"props":362214,"children":362215},{},[362216],{"type":23,"value":362217},"Traditional API integration development that requires months of a development team's time to build a single native integration is no longer sufficient for the escalating integration demand from customers, a rapidly expanding SaaS market, and software companies that aim to scale and serve a broader customer base while reducing the total cost of ownership (TCO).",{"type":17,"tag":29,"props":362219,"children":362220},{},[362221],{"type":23,"value":362222},"From iPaaS to Unified APIs, there have been several technological strides designed to alleviate integration development challenges for developers. In this deep dive, we'll explore the evolution of integration solutions with a focus on the strategic and technological implications.",{"type":17,"tag":68,"props":362224,"children":362226},{"id":362225},"_1-etls-laying-the-foundation",[362227],{"type":23,"value":362228},"1. ETLs: Laying the foundation",{"type":17,"tag":29,"props":362230,"children":362231},{},[362232],{"type":17,"tag":6438,"props":362233,"children":362236},{"alt":362234,"src":362235},"Unified.to_-_ETL_Process.png","https://s3.us-east-2.amazonaws.com/unified-article-images/building_your_integration_strategy_a_deep_dive_into_integration_technology-0.png",[],{"type":17,"tag":29,"props":362238,"children":362239},{},[362240,362245],{"type":17,"tag":48,"props":362241,"children":362242},{},[362243],{"type":23,"value":362244},"Definition:",{"type":23,"value":362246}," ETL (Extract, Transform, Load) is a traditional approach to data integration that involves extracting data from various sources, transforming it into a consistent format, and loading it into a target data warehouse.",{"type":17,"tag":29,"props":362248,"children":362249},{},[362250,362255,362257,362263],{"type":17,"tag":48,"props":362251,"children":362252},{},[362253],{"type":23,"value":362254},"Background:",{"type":23,"value":362256}," The concept of ETL has been around for several decades, and its origins can be traced back to the early days of data processing and integration, first gaining prominence in the 1970s and 1980s with the rise of ",{"type":17,"tag":133,"props":362258,"children":362261},{"href":362259,"rel":362260},"https://www.ibm.com/topics/data-warehouse",[214],[362262],{"type":23,"value":971},{"type":23,"value":54},{"type":17,"tag":29,"props":362265,"children":362266},{},[362267],{"type":17,"tag":48,"props":362268,"children":362269},{},[362270],{"type":23,"value":362271},"Benefits:",{"type":17,"tag":80,"props":362273,"children":362274},{},[362275,362280],{"type":17,"tag":84,"props":362276,"children":362277},{},[362278],{"type":23,"value":362279},"Data Consolidation: Combine data from different sources into one central repository.",{"type":17,"tag":84,"props":362281,"children":362282},{},[362283],{"type":23,"value":362284},"Batch Processing: Handle large volumes of data at scheduled intervals.",{"type":17,"tag":29,"props":362286,"children":362287},{},[362288],{"type":17,"tag":48,"props":362289,"children":362290},{},[362291],{"type":23,"value":362292},"Drawbacks:",{"type":17,"tag":80,"props":362294,"children":362295},{},[362296,362301],{"type":17,"tag":84,"props":362297,"children":362298},{},[362299],{"type":23,"value":362300},"Latency: ETL processes are typically batch-oriented, leading to delays in data availability.",{"type":17,"tag":84,"props":362302,"children":362303},{},[362304],{"type":23,"value":362305},"Complexity: Designing and maintaining ETL workflows can be complex, requiring specialized skills.",{"type":17,"tag":29,"props":362307,"children":362308},{},[362309,362314],{"type":17,"tag":48,"props":362310,"children":362311},{},[362312],{"type":23,"value":362313},"Primary use case:",{"type":23,"value":362315}," ETL works well for internal use cases within a company for data reporting, business intelligence, and internal analytics.",{"type":17,"tag":29,"props":362317,"children":362318},{},[362319,362324,362325,362332,362333,362340,362341],{"type":17,"tag":48,"props":362320,"children":362321},{},[362322],{"type":23,"value":362323},"ETL examples:",{"type":23,"value":18757},{"type":17,"tag":133,"props":362326,"children":362329},{"href":362327,"rel":362328},"https://www.informatica.com/ca/",[214],[362330],{"type":23,"value":362331},"Informatica",{"type":23,"value":11826},{"type":17,"tag":133,"props":362334,"children":362337},{"href":362335,"rel":362336},"https://www.talend.com/",[214],[362338],{"type":23,"value":362339},"Talend",{"type":23,"value":11826},{"type":17,"tag":133,"props":362342,"children":362345},{"href":362343,"rel":362344},"https://learn.microsoft.com/en-us/sql/integration-services/sql-server-integration-services?view=sql-server-ver16",[214],[362346],{"type":23,"value":362347},"Microsoft SSIS",{"type":17,"tag":29,"props":362349,"children":362350},{},[362351],{"type":17,"tag":48,"props":362352,"children":362353},{},[362354],{"type":23,"value":129997},{"type":17,"tag":80,"props":362356,"children":362357},{},[362358,362363,362368],{"type":17,"tag":84,"props":362359,"children":362360},{},[362361],{"type":23,"value":362362},"Data transformation capabilities: Ensure the data can be prepared and shaped according to your company's requirements.",{"type":17,"tag":84,"props":362364,"children":362365},{},[362366],{"type":23,"value":362367},"Ease of use: The overall user experience influences the efficiency of designing, monitoring, and managing ETL workflows.",{"type":17,"tag":84,"props":362369,"children":362370},{},[362371],{"type":23,"value":362372},"Data sources and connectivity: The ETL tool's ability to connect to a wide range of data sources is essential to ensure comprehensive data integration.",{"type":17,"tag":68,"props":362374,"children":362376},{"id":362375},"_2-ipaas-bridging-the-cloud-divide",[362377],{"type":23,"value":362378},"2. iPaaS: Bridging the cloud divide",{"type":17,"tag":29,"props":362380,"children":362381},{},[362382],{"type":17,"tag":6438,"props":362383,"children":362386},{"alt":362384,"src":362385},"iPaaS_process_-Unified.to%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/building_your_integration_strategy_a_deep_dive_into_integration_technology-1.png",[],{"type":17,"tag":29,"props":362388,"children":362389},{},[362390,362395],{"type":17,"tag":48,"props":362391,"children":362392},{},[362393],{"type":23,"value":362394},"Definition",{"type":23,"value":362396},": Integration Platform as a Service (iPaaS) is a cloud-based way to connect apps, data, and processes in one platform.",{"type":17,"tag":29,"props":362398,"children":362399},{},[362400,362404],{"type":17,"tag":48,"props":362401,"children":362402},{},[362403],{"type":23,"value":334943},{"type":23,"value":362405},": iPaaS builds on the foundation laid by traditional ETL processes. It started in response to the more complex IT world and demand for agile, cloud-focused solutions around the late 2000s.",{"type":17,"tag":29,"props":362407,"children":362408},{},[362409],{"type":17,"tag":48,"props":362410,"children":362411},{},[362412],{"type":23,"value":362271},{"type":17,"tag":80,"props":362414,"children":362415},{},[362416,362421],{"type":17,"tag":84,"props":362417,"children":362418},{},[362419],{"type":23,"value":362420},"Cloud-native: iPaaS solutions leverage the scalability and flexibility of cloud infrastructure.",{"type":17,"tag":84,"props":362422,"children":362423},{},[362424],{"type":23,"value":362425},"Real-time integration: Supports real-time data integration and communication between cloud and on-premises systems.",{"type":17,"tag":29,"props":362427,"children":362428},{},[362429],{"type":17,"tag":48,"props":362430,"children":362431},{},[362432],{"type":23,"value":362292},{"type":17,"tag":80,"props":362434,"children":362435},{},[362436,362441],{"type":17,"tag":84,"props":362437,"children":362438},{},[362439],{"type":23,"value":362440},"Customization limitations: Some iPaaS solutions may have limitations when it comes to highly customized integration scenarios.",{"type":17,"tag":84,"props":362442,"children":362443},{},[362444],{"type":23,"value":362445},"Developer effort: Developers will need to integrate each connection individually, adding complexity to the implementation process.",{"type":17,"tag":29,"props":362447,"children":362448},{},[362449,362453],{"type":17,"tag":48,"props":362450,"children":362451},{},[362452],{"type":23,"value":362313},{"type":23,"value":362454}," iPaaS works well for companies moving to the cloud and needing flexible integrations, such as hybrid cloud setups. While it's ideal for internal needs, iPaaS can also help with building external integrations for suppliers, partners, and customers.",{"type":17,"tag":29,"props":362456,"children":362457},{},[362458,362460,362465,362466,362471,362472,362477],{"type":23,"value":362459},"iPaaS examples: ",{"type":17,"tag":133,"props":362461,"children":362463},{"href":406,"rel":362462},[214],[362464],{"type":23,"value":410},{"type":23,"value":11826},{"type":17,"tag":133,"props":362467,"children":362469},{"href":396,"rel":362468},[214],[362470],{"type":23,"value":400},{"type":23,"value":11826},{"type":17,"tag":133,"props":362473,"children":362475},{"href":482,"rel":362474},[214],[362476],{"type":23,"value":486},{"type":23,"value":362478},"*",{"type":17,"tag":80,"props":362480,"children":362481},{},[362482],{"type":17,"tag":84,"props":362483,"children":362484},{},[362485],{"type":17,"tag":33,"props":362486,"children":362487},{},[362488],{"type":23,"value":362489},"Zapier falls under the category of iPaaS as it's a cloud-based approach to integrations but with the distinction of allowing a wide range of users, including non-developers, to build integrations without coding.",{"type":17,"tag":29,"props":362491,"children":362492},{},[362493],{"type":17,"tag":48,"props":362494,"children":362495},{},[362496],{"type":23,"value":129997},{"type":17,"tag":80,"props":362498,"children":362499},{},[362500,362505,362510],{"type":17,"tag":84,"props":362501,"children":362502},{},[362503],{"type":23,"value":362504},"Connectivity and compatibility: Ensure the iPaaS solution can support many different third-party systems.",{"type":17,"tag":84,"props":362506,"children":362507},{},[362508],{"type":23,"value":362509},"Scalability and performance: Ensure the iPaaS solution can handle more data and increased integration needs as your company grows, especially real-time integration needs.",{"type":17,"tag":84,"props":362511,"children":362512},{},[362513],{"type":23,"value":362514},"Developer experience: Assess how easy it is for developers to use, considering visual design options, low-code/no-code features, and clear documentation.",{"type":17,"tag":68,"props":362516,"children":362518},{"id":362517},"_3-embedded-ipaas-integration-at-the-application-level",[362519],{"type":23,"value":362520},"3. Embedded iPaaS: Integration at the application level",{"type":17,"tag":29,"props":362522,"children":362523},{},[362524],{"type":17,"tag":6438,"props":362525,"children":362528},{"alt":362526,"src":362527},"Unified.to_-_Embedded_iPaaS.png","https://s3.us-east-2.amazonaws.com/unified-article-images/building_your_integration_strategy_a_deep_dive_into_integration_technology-2.png",[],{"type":17,"tag":29,"props":362530,"children":362531},{},[362532,362536],{"type":17,"tag":48,"props":362533,"children":362534},{},[362535],{"type":23,"value":362244},{"type":23,"value":362537}," Embedded iPaaS refers to adding ready-made integrations directly into applications (or products), enabling seamless connectivity without needing other platforms or third-party API providers.",{"type":17,"tag":29,"props":362539,"children":362540},{},[362541,362545],{"type":17,"tag":48,"props":362542,"children":362543},{},[362544],{"type":23,"value":362254},{"type":23,"value":362546}," Embedded iPaaS is a more recent development (late 2010s) that brings integration capabilities directly into the applications themselves, catering to the growing demand for seamless and embedded connectivity features within specific software applications.",{"type":17,"tag":29,"props":362548,"children":362549},{},[362550],{"type":17,"tag":48,"props":362551,"children":362552},{},[362553],{"type":23,"value":362271},{"type":17,"tag":80,"props":362555,"children":362556},{},[362557,362562],{"type":17,"tag":84,"props":362558,"children":362559},{},[362560],{"type":23,"value":362561},"Simplified user experience: Integration becomes a native part of the application, reducing the need for end-users to switch between different interfaces.",{"type":17,"tag":84,"props":362563,"children":362564},{},[362565],{"type":23,"value":362566},"Faster time-to-market: Accelerates the development process by eliminating the need to build integrations from scratch.",{"type":17,"tag":29,"props":362568,"children":362569},{},[362570],{"type":17,"tag":48,"props":362571,"children":362572},{},[362573],{"type":23,"value":362292},{"type":17,"tag":80,"props":362575,"children":362576},{},[362577,362582],{"type":17,"tag":84,"props":362578,"children":362579},{},[362580],{"type":23,"value":362581},"Limited flexibility: Might lack the customization options available in standalone iPaaS solutions.",{"type":17,"tag":84,"props":362583,"children":362584},{},[362585],{"type":23,"value":362586},"Developer effort: iPaaS data is not normalized and still involves data mapping and development for individual integrations, adding to implementation complexity.",{"type":17,"tag":29,"props":362588,"children":362589},{},[362590,362595],{"type":17,"tag":48,"props":362591,"children":362592},{},[362593],{"type":23,"value":362594},"Primary Use Case:",{"type":23,"value":362596}," Embedded iPaaS works well for software companies looking to enhance their applications with built-in connectivity features without relying on third-party API providers.",{"type":17,"tag":29,"props":362598,"children":362599},{},[362600],{"type":23,"value":362601},"Embedded iPaaS Examples: Cyclr, Paragon, Pandium",{"type":17,"tag":29,"props":362603,"children":362604},{},[362605],{"type":17,"tag":48,"props":362606,"children":362607},{},[362608],{"type":23,"value":129997},{"type":17,"tag":80,"props":362610,"children":362611},{},[362612,362617,362622],{"type":17,"tag":84,"props":362613,"children":362614},{},[362615],{"type":23,"value":362616},"Seamless integration: evaluate how seamlessly the embedded iPaaS integrates within the existing workflows of your application.",{"type":17,"tag":84,"props":362618,"children":362619},{},[362620],{"type":23,"value":362621},"Flexibility and extensibility: Ensure the embedded iPaaS solution provides the flexibility needed to support a variety of integration scenarios.",{"type":17,"tag":84,"props":362623,"children":362624},{},[362625],{"type":23,"value":362626},"Engineering resources: Consider the level of internal expertise and engineering resources you have available.",{"type":17,"tag":68,"props":362628,"children":362630},{"id":362629},"_4-unified-apis-accelerate-seamless-integrations",[362631],{"type":23,"value":362632},"4. Unified APIs: Accelerate seamless integrations",{"type":17,"tag":29,"props":362634,"children":362635},{},[362636],{"type":17,"tag":6438,"props":362637,"children":362640},{"alt":362638,"src":362639},"Unified_API_process_-Unified.to%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/building_your_integration_strategy_a_deep_dive_into_integration_technology-3.png",[],{"type":17,"tag":29,"props":362642,"children":362643},{},[362644,362648],{"type":17,"tag":48,"props":362645,"children":362646},{},[362647],{"type":23,"value":362244},{"type":23,"value":362649}," Unified APIs provide a standardized interface that aggregates multiple APIs into a single, cohesive endpoint that simplifies the integration process.",{"type":17,"tag":29,"props":362651,"children":362652},{},[362653,362657],{"type":17,"tag":48,"props":362654,"children":362655},{},[362656],{"type":23,"value":362254},{"type":23,"value":362658}," The rise of Unified APIs (late 2010s/early 2020s) is closely tied to the broader trends in API management, microservices architecture, and the increasing adoption of APIs. Not all Unified APIs have emerged from ETL or iPaaS technology; some stem from different frameworks like Unification Architecture.",{"type":17,"tag":29,"props":362660,"children":362661},{},[362662],{"type":17,"tag":48,"props":362663,"children":362664},{},[362665],{"type":23,"value":362271},{"type":17,"tag":80,"props":362667,"children":362668},{},[362669,362674,362679],{"type":17,"tag":84,"props":362670,"children":362671},{},[362672],{"type":23,"value":362673},"Consistent Interface: Presents a unified interface for developers, regardless of the underlying complexity of integrated systems.",{"type":17,"tag":84,"props":362675,"children":362676},{},[362677],{"type":23,"value":362678},"Agility: Allows companies to adapt quickly to changing business needs by easily adding or modifying integrations.",{"type":17,"tag":84,"props":362680,"children":362681},{},[362682],{"type":23,"value":362683},"Faster time-to-market: Accelerates the development process by eliminating the need to build integration from scratch and facilitates the ability to deploy multiple integrations simultaneously.",{"type":17,"tag":29,"props":362685,"children":362686},{},[362687],{"type":17,"tag":48,"props":362688,"children":362689},{},[362690],{"type":23,"value":362292},{"type":17,"tag":80,"props":362692,"children":362693},{},[362694,362699],{"type":17,"tag":84,"props":362695,"children":362696},{},[362697],{"type":23,"value":362698},"Dependency on API availability: Relies on the availability and reliability of the underlying APIs.",{"type":17,"tag":84,"props":362700,"children":362701},{},[362702],{"type":23,"value":362703},"Potential feature gaps: Unified APIs might not cover every feature or functionality needed for a specific integration.",{"type":17,"tag":29,"props":362705,"children":362706},{},[362707,362711],{"type":17,"tag":48,"props":362708,"children":362709},{},[362710],{"type":23,"value":362313},{"type":23,"value":362712}," Unified APIs are ideal for external use cases such as adding a high volume of third-party integrations for your customers or building feature-rich applications.",{"type":17,"tag":29,"props":362714,"children":362715},{},[362716,362720,362721,362726,362727,362732,362733,362738],{"type":17,"tag":48,"props":362717,"children":362718},{},[362719],{"type":23,"value":377},{"type":23,"value":18757},{"type":17,"tag":133,"props":362722,"children":362724},{"href":69130,"rel":362723},[214],[362725],{"type":23,"value":237},{"type":23,"value":11826},{"type":17,"tag":133,"props":362728,"children":362730},{"href":81639,"rel":362729},[214],[362731],{"type":23,"value":227},{"type":23,"value":11826},{"type":17,"tag":133,"props":362734,"children":362736},{"href":212,"rel":362735},[214],[362737],{"type":23,"value":217},{"type":23,"value":362478},{"type":17,"tag":80,"props":362740,"children":362741},{},[362742],{"type":17,"tag":84,"props":362743,"children":362744},{},[362745],{"type":17,"tag":33,"props":362746,"children":362747},{},[362748,362750,362754,362756,362760],{"type":23,"value":362749},"While Unified.to is a ",{"type":17,"tag":133,"props":362751,"children":362752},{"href":7691},[362753],{"type":23,"value":7806},{"type":23,"value":362755}," it did not evolve from ETL or iPaaS technology but is instead built with Unification Architecture that uniquely provides developers with a fully unified solution, including unified API endpoints, ",{"type":17,"tag":133,"props":362757,"children":362758},{"href":4999},[362759],{"type":23,"value":5002},{"type":23,"value":362761},", data models, authorization, and permission scopes, which further simplifies developer effort and increases flexibility to cater to diverse use cases and integration scenarios.",{"type":17,"tag":29,"props":362763,"children":362764},{},[362765],{"type":17,"tag":48,"props":362766,"children":362767},{},[362768],{"type":23,"value":129997},{"type":17,"tag":80,"props":362770,"children":362771},{},[362772,362777,362782],{"type":17,"tag":84,"props":362773,"children":362774},{},[362775],{"type":23,"value":362776},"Level of unification: Consider how well the Unified API provider covers all aspects of integration, including data models, authorization, and webhooks.",{"type":17,"tag":84,"props":362778,"children":362779},{},[362780],{"type":23,"value":362781},"Developer experience: See how easy it is for developers to use, considering the speed of implementation compared to traditional methods.",{"type":17,"tag":84,"props":362783,"children":362784},{},[362785],{"type":23,"value":362786},"Security: Ensure the Unified API provider prioritizes security and safeguards the integrity and confidentiality of data being processed.",{"type":17,"tag":68,"props":362788,"children":362790},{"id":362789},"choosing-the-right-integration-technology",[362791],{"type":23,"value":362792},"Choosing the right integration technology",{"type":17,"tag":29,"props":362794,"children":362795},{},[362796],{"type":23,"value":362797},"As the SaaS industry continues to grow and become increasingly interconnected, the choice of integration technology becomes a critical decision.",{"type":17,"tag":29,"props":362799,"children":362800},{},[362801],{"type":23,"value":362802},"While ETLs excel in batch processing and data consolidation, and embedded iPaaS eliminates the need to rely on separate third-party API providers, Unified APIs present a modern solution, enabling developers to deploy multiple customer-facing integrations all at once and extend product functionality, without compromising their core product roadmap.",{"type":17,"tag":29,"props":362804,"children":362805},{},[362806],{"type":23,"value":362807},"Choosing the right integration technology for your SaaS company will depend on your goals, resources, and use cases.",{"type":17,"tag":68,"props":362809,"children":362810},{"id":322688},[362811],{"type":23,"value":322691},{"type":17,"tag":29,"props":362813,"children":362814},{},[362815],{"type":23,"value":362816},"Unified.to is a next-generation Unified API developer platform built to make it easy to add integrations to your SaaS product, without roadmap delays or integration complexity.",{"type":17,"tag":80,"props":362818,"children":362819},{},[362820,362825,362830,362835],{"type":17,"tag":84,"props":362821,"children":362822},{},[362823],{"type":23,"value":362824},"Launch 190+ integrations simultaneously: Access SaaS integrations across categories like ATS, CRM, HR, Authentication, Enrichment, and Ticketing.",{"type":17,"tag":84,"props":362826,"children":362827},{},[362828],{"type":23,"value":362829},"Unified.to is a truly unified solution with everything in one place: API endpoints, data models, webhooks, authorization, and permission scopes.",{"type":17,"tag":84,"props":362831,"children":362832},{},[362833],{"type":23,"value":362834},"Secure by default: Unified.to's advanced security principles ensure your customer data is never stored on our servers.",{"type":17,"tag":84,"props":362836,"children":362837},{},[362838],{"type":23,"value":362839},"Make your front-end one less thing to think about: Unified.to has low-code authorization and user onboarding UI embeds.",{"type":17,"tag":29,"props":362841,"children":362842},{},[362843,362845,362851,362852,362858],{"type":23,"value":362844},"Ready to reach your integration potential? ",{"type":17,"tag":133,"props":362846,"children":362849},{"href":362847,"rel":362848},"https://app.unified.to/login?utm_source=blog&utm_medium=blog_signup&utm_campaign=blog_signup",[214],[362850],{"type":23,"value":357340},{"type":23,"value":75890},{"type":17,"tag":133,"props":362853,"children":362855},{"href":215330,"rel":362854},[214],[362856],{"type":23,"value":362857},"speak with an integration expert",{"type":23,"value":54},{"type":17,"tag":29,"props":362860,"children":362861},{},[362862,362864,362874],{"type":23,"value":362863},"By: ",{"type":17,"tag":133,"props":362865,"children":362868},{"href":362866,"rel":362867},"https://www.linkedin.com/in/kailah-bharath-77368547/",[214],[362869],{"type":17,"tag":48,"props":362870,"children":362871},{},[362872],{"type":23,"value":362873},"Kailah Bharath",{"type":23,"value":362875},", Head of Marketing at Unified.to",{"title":7,"searchDepth":1629,"depth":1629,"links":362877},[362878,362879,362880,362881,362882,362883],{"id":362225,"depth":1629,"text":362228},{"id":362375,"depth":1629,"text":362378},{"id":362517,"depth":1629,"text":362520},{"id":362629,"depth":1629,"text":362632},{"id":362789,"depth":1629,"text":362792},{"id":322688,"depth":1629,"text":322691},"content:blog:building_your_integration_strategy_a_deep_dive_into_integration_technology.md","blog/building_your_integration_strategy_a_deep_dive_into_integration_technology.md","blog/building_your_integration_strategy_a_deep_dive_into_integration_technology",{"_path":362888,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":362889,"description":362890,"img":362891,"date":362892,"tag":12,"body":362893,"_type":1677,"_id":363453,"_source":1679,"_file":363454,"_stem":363455,"_extension":1682},"/blog/unified_oct_2023_product_updates","Unified.to Oct 2023 product updates","Every SaaS user depends on integrations to improve how they work. At Unified.to, we're making it easier for SaaS companies to add API integrations that enhance...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_oct_2023_product_updates-icon.png","2023-10-26T00:00:00.000Z",{"type":14,"children":362894,"toc":363442},[362895,362900,362903,362911,362919,362924,362928,362936,362941,362946,363043,363055,363061,363069,363074,363082,363088,363096,363101,363108,363136,363143,363156,363163,363171,363176,363185,363191,363199,363211,363216,363251,363261,363267,363275,363285,363294,363300,363308,363313,363322,363328,363333,363343,363349,363360,363368,363373,363378,363383,363392,363398,363437],{"type":17,"tag":18,"props":362896,"children":362898},{"id":362897},"unifiedto-oct-2023-product-updates",[362899],{"type":23,"value":362889},{"type":17,"tag":25,"props":362901,"children":362902},{},[],{"type":17,"tag":29,"props":362904,"children":362905},{},[362906],{"type":17,"tag":33,"props":362907,"children":362908},{},[362909],{"type":23,"value":362910},"October 26, 2023",{"type":17,"tag":29,"props":362912,"children":362913},{},[362914],{"type":17,"tag":6438,"props":362915,"children":362918},{"alt":362916,"src":362917},"Unified.to_Product_Roundup_October_2023.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_oct_2023_product_updates-0.png",[],{"type":17,"tag":29,"props":362920,"children":362921},{},[362922],{"type":23,"value":362923},"Every SaaS user depends on integrations to improve how they work. At Unified.to, we're making it easier for SaaS companies to add API integrations that enhance their products and improve their user experiences. Here's what we've been up to this month.",{"type":17,"tag":68,"props":362925,"children":362926},{"id":11629},[362927],{"type":23,"value":11632},{"type":17,"tag":29,"props":362929,"children":362930},{},[362931],{"type":17,"tag":6438,"props":362932,"children":362935},{"alt":362933,"src":362934},"Unified.to_New_Integrations.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_oct_2023_product_updates-1.png",[],{"type":17,"tag":29,"props":362937,"children":362938},{},[362939],{"type":23,"value":362940},"There are now a total of 125 integrations available on the Unified.to platform — and we're not slowing down any time soon. For existing users, head to the Unified.to dashboard, activate any new integrations you want for your application, and watch your product update automatically.",{"type":17,"tag":29,"props":362942,"children":362943},{},[362944],{"type":23,"value":362945},"Here are the integrations we've added to our platform this month:",{"type":17,"tag":80,"props":362947,"children":362948},{},[362949,362959,362970,362979,362989,363000,363012,363021,363032],{"type":17,"tag":84,"props":362950,"children":362951},{},[362952,362957],{"type":17,"tag":133,"props":362953,"children":362955},{"href":346256,"rel":362954},[214],[362956],{"type":23,"value":23053},{"type":23,"value":362958}," (HR,Passthrough)",{"type":17,"tag":84,"props":362960,"children":362961},{},[362962,362968],{"type":17,"tag":133,"props":362963,"children":362966},{"href":362964,"rel":362965},"https://unified.to/integrations/getprospect",[214],[362967],{"type":23,"value":50421},{"type":23,"value":362969}," (Enrichment, Passthrough)",{"type":17,"tag":84,"props":362971,"children":362972},{},[362973,362978],{"type":17,"tag":133,"props":362974,"children":362976},{"href":322598,"rel":362975},[214],[362977],{"type":23,"value":14472},{"type":23,"value":354345},{"type":17,"tag":84,"props":362980,"children":362981},{},[362982,362987],{"type":17,"tag":133,"props":362983,"children":362985},{"href":331188,"rel":362984},[214],[362986],{"type":23,"value":37435},{"type":23,"value":362988}," (HR, Passthrough)",{"type":17,"tag":84,"props":362990,"children":362991},{},[362992,362999],{"type":17,"tag":133,"props":362993,"children":362996},{"href":362994,"rel":362995},"https://unified.to/integrations/scoro",[214],[362997],{"type":23,"value":362998},"Scoro",{"type":23,"value":362988},{"type":17,"tag":84,"props":363001,"children":363002},{},[363003,363010],{"type":17,"tag":133,"props":363004,"children":363007},{"href":363005,"rel":363006},"https://unified.to/integrations/peakon",[214],[363008],{"type":23,"value":363009},"Peakon ",{"type":23,"value":363011},"(HR, Passthrough)",{"type":17,"tag":84,"props":363013,"children":363014},{},[363015,363020],{"type":17,"tag":133,"props":363016,"children":363018},{"href":309985,"rel":363017},[214],[363019],{"type":23,"value":361157},{"type":23,"value":362988},{"type":17,"tag":84,"props":363022,"children":363023},{},[363024,363031],{"type":17,"tag":133,"props":363025,"children":363028},{"href":363026,"rel":363027},"https://unified.to/integrations/enboarder",[214],[363029],{"type":23,"value":363030},"Enboarder ",{"type":23,"value":363011},{"type":17,"tag":84,"props":363033,"children":363034},{},[363035,363042],{"type":17,"tag":133,"props":363036,"children":363039},{"href":363037,"rel":363038},"https://unified.to/integrations/techwolf",[214],[363040],{"type":23,"value":363041},"Techwolf",{"type":23,"value":362988},{"type":17,"tag":29,"props":363044,"children":363045},{},[363046,363048,363054],{"type":23,"value":363047},"We're constantly expanding our integrations. Have a suggestion for us? Vote on our integration roadmap ",{"type":17,"tag":133,"props":363049,"children":363052},{"href":363050,"rel":363051},"https://unified.to/integrations/roadmap",[214],[363053],{"type":23,"value":243989},{"type":23,"value":54},{"type":17,"tag":68,"props":363056,"children":363058},{"id":363057},"document-support-for-ats-integrations",[363059],{"type":23,"value":363060},"Document support for ATS integrations",{"type":17,"tag":29,"props":363062,"children":363063},{},[363064],{"type":17,"tag":6438,"props":363065,"children":363068},{"alt":363066,"src":363067},"Unified.to_ATS_Document_Object.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_oct_2023_product_updates-2.png",[],{"type":17,"tag":29,"props":363070,"children":363071},{},[363072],{"type":23,"value":363073},"You can now add document management functionality to your SaaS product. We've introduced support for Document across our ATS integrations, which allows you to store candidate resumes, cover letters, background checks, and other assessment documents. Document support is currently available for Greenhouse, Lever, and SmartRecruiters, with additional ATS integrations set to receive the update shortly.",{"type":17,"tag":29,"props":363075,"children":363076},{},[363077],{"type":17,"tag":133,"props":363078,"children":363080},{"href":343588,"rel":363079},[214],[363081],{"type":23,"value":353269},{"type":17,"tag":68,"props":363083,"children":363085},{"id":363084},"enhanced-object-support",[363086],{"type":23,"value":363087},"Enhanced Object support",{"type":17,"tag":29,"props":363089,"children":363090},{},[363091],{"type":17,"tag":6438,"props":363092,"children":363095},{"alt":363093,"src":363094},"Unified.to_New_Integrations_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_oct_2023_product_updates-3.png",[],{"type":17,"tag":29,"props":363097,"children":363098},{},[363099],{"type":23,"value":363100},"In addition to Document, we've expanded Object support for several integrations. Here's what's new:",{"type":17,"tag":29,"props":363102,"children":363103},{},[363104],{"type":17,"tag":48,"props":363105,"children":363106},{},[363107],{"type":23,"value":11756},{"type":17,"tag":80,"props":363109,"children":363110},{},[363111,363116,363121,363126,363131],{"type":17,"tag":84,"props":363112,"children":363113},{},[363114],{"type":23,"value":363115},"Document: Greenhouse, Lever, and SmartRecruiters",{"type":17,"tag":84,"props":363117,"children":363118},{},[363119],{"type":23,"value":363120},"Application: Lever, ZohoRecruit, Greenhouse (Ingest), Greenhouse (Harvest), Teamtailor, SmartRecruiters",{"type":17,"tag":84,"props":363122,"children":363123},{},[363124],{"type":23,"value":363125},"Interview: SmartRecruiters, ZohoRecruit",{"type":17,"tag":84,"props":363127,"children":363128},{},[363129],{"type":23,"value":363130},"Job: SmartRecruiters",{"type":17,"tag":84,"props":363132,"children":363133},{},[363134],{"type":23,"value":363135},"Scorecard: SmartRecruiters",{"type":17,"tag":29,"props":363137,"children":363138},{},[363139],{"type":17,"tag":48,"props":363140,"children":363141},{},[363142],{"type":23,"value":89846},{"type":17,"tag":80,"props":363144,"children":363145},{},[363146,363151],{"type":17,"tag":84,"props":363147,"children":363148},{},[363149],{"type":23,"value":363150},"Employee: Salesforce, Techwolf",{"type":17,"tag":84,"props":363152,"children":363153},{},[363154],{"type":23,"value":363155},"Group: Bullhorn",{"type":17,"tag":29,"props":363157,"children":363158},{},[363159],{"type":17,"tag":48,"props":363160,"children":363161},{},[363162],{"type":23,"value":25731},{"type":17,"tag":80,"props":363164,"children":363165},{},[363166],{"type":17,"tag":84,"props":363167,"children":363168},{},[363169],{"type":23,"value":363170},"Lead: Salesforce",{"type":17,"tag":29,"props":363172,"children":363173},{},[363174],{"type":23,"value":363175},"With our expanded Objects, you can power your SaaS applications with enriched capabilities across various integration categories.",{"type":17,"tag":29,"props":363177,"children":363178},{},[363179],{"type":17,"tag":133,"props":363180,"children":363182},{"href":87026,"rel":363181},[214],[363183],{"type":23,"value":363184},"All integrations",{"type":17,"tag":68,"props":363186,"children":363188},{"id":363187},"activecampaign-partnership",[363189],{"type":23,"value":363190},"ActiveCampaign partnership",{"type":17,"tag":29,"props":363192,"children":363193},{},[363194],{"type":17,"tag":6438,"props":363195,"children":363198},{"alt":363196,"src":363197},"Unified.to_New_Integrations_%282%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_oct_2023_product_updates-4.png",[],{"type":17,"tag":29,"props":363200,"children":363201},{},[363202,363204,363209],{"type":23,"value":363203},"We've partnered with ",{"type":17,"tag":133,"props":363205,"children":363207},{"href":331264,"rel":363206},[214],[363208],{"type":23,"value":192282},{"type":23,"value":363210}," to make it easier for SaaS developers to add support for ActiveCampaign and other CRM integrations. With Unified.to, developers integrate once to simultaneously add multiple integrations to their applications.",{"type":17,"tag":29,"props":363212,"children":363213},{},[363214],{"type":23,"value":363215},"Get started with ActiveCampaign:",{"type":17,"tag":6154,"props":363217,"children":363218},{},[363219,363231,363236,363241,363246],{"type":17,"tag":84,"props":363220,"children":363221},{},[363222,363224,363229],{"type":23,"value":363223},"Sign up ",{"type":17,"tag":133,"props":363225,"children":363227},{"href":1612,"rel":363226},[214],[363228],{"type":23,"value":243989},{"type":23,"value":363230}," (for new users)",{"type":17,"tag":84,"props":363232,"children":363233},{},[363234],{"type":23,"value":363235},"Activate ActiveCampaign and any other available CRM integrations",{"type":17,"tag":84,"props":363237,"children":363238},{},[363239],{"type":23,"value":363240},"Embed our low-code authorization component into your product",{"type":17,"tag":84,"props":363242,"children":363243},{},[363244],{"type":23,"value":363245},"Test your integration (s) in different environments",{"type":17,"tag":84,"props":363247,"children":363248},{},[363249],{"type":23,"value":363250},"Deploy to production",{"type":17,"tag":29,"props":363252,"children":363253},{},[363254],{"type":17,"tag":133,"props":363255,"children":363258},{"href":363256,"rel":363257},"https://www.activecampaign.com/apps/unified-integration",[214],[363259],{"type":23,"value":363260},"ActiveCampaign partnership listing",{"type":17,"tag":68,"props":363262,"children":363264},{"id":363263},"case-study-herohuntai",[363265],{"type":23,"value":363266},"Case study: HeroHunt.ai",{"type":17,"tag":29,"props":363268,"children":363269},{},[363270],{"type":17,"tag":6438,"props":363271,"children":363274},{"alt":363272,"src":363273},"Unified.to_HeroHunt.ai_Case_Study.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_oct_2023_product_updates-5.png",[],{"type":17,"tag":29,"props":363276,"children":363277},{},[363278,363283],{"type":17,"tag":133,"props":363279,"children":363281},{"href":360890,"rel":363280},[214],[363282],{"type":23,"value":354764},{"type":23,"value":363284}," is an AI talent and search engagement platform based in Amsterdam. They first realized the necessity of customer-facing integrations when they began attracting larger companies, which required support for more complex tasks and tech stacks. With Unified.to, they launched 22 ATS integrations with one developer in just one week.",{"type":17,"tag":29,"props":363286,"children":363287},{},[363288],{"type":17,"tag":133,"props":363289,"children":363291},{"href":360524,"rel":363290},[214],[363292],{"type":23,"value":363293},"HeroHunt.ai case study",{"type":17,"tag":68,"props":363295,"children":363297},{"id":363296},"blog-post-the-hr-tech-transformation",[363298],{"type":23,"value":363299},"Blog post: The HR tech transformation",{"type":17,"tag":29,"props":363301,"children":363302},{},[363303],{"type":17,"tag":6438,"props":363304,"children":363307},{"alt":363305,"src":363306},"Unified.to_Blog.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_oct_2023_product_updates-6.png",[],{"type":17,"tag":29,"props":363309,"children":363310},{},[363311],{"type":23,"value":363312},"Today's HR software industry is experiencing a wave of innovation, creating an interdependent ecosystem. HR software companies that harness customer data from systems across the ecosystem improve their product value and increase their capacity to attract, retain, and monetize a broader customer base. On the blog, we share how software companies can utilize API integrations to offer superior products.",{"type":17,"tag":29,"props":363314,"children":363315},{},[363316],{"type":17,"tag":133,"props":363317,"children":363319},{"href":362206,"rel":363318},[214],[363320],{"type":23,"value":363321},"The HR tech transformation",{"type":17,"tag":68,"props":363323,"children":363325},{"id":363324},"event-infobip-connect-toronto-tech-meetup",[363326],{"type":23,"value":363327},"Event: Infobip Connect - Toronto Tech Meetup",{"type":17,"tag":29,"props":363329,"children":363330},{},[363331],{"type":23,"value":363332},"If you're a developer, part of a startup, or a general tech enthusiast in Toronto, you're invited to join us at the first Infobip Connect Meetup in Toronto on Nov 9 from 6-9 pm. The event is hosted by Infobip and will feature a range of speakers, including Yuri Navarro, Managing Partner at Kanata Ventures, Roy Pereira, CEO and Co-founder at Unified.to, Laura Rodriguez, Staff SDK Engineer at Okta, and Mike Elsmore, Senior Developer Advocate at Infobip.",{"type":17,"tag":29,"props":363334,"children":363335},{},[363336],{"type":17,"tag":133,"props":363337,"children":363340},{"href":363338,"rel":363339},"https://www.eventbrite.com/e/infobip-connect-toronto-tech-meetup-tickets-737797661667?aff=oddtdtcreator",[214],[363341],{"type":23,"value":363342},"Event registration page",{"type":17,"tag":68,"props":363344,"children":363346},{"id":363345},"_5-star-rating-average-on-g2",[363347],{"type":23,"value":363348},"5-star rating average on G2",{"type":17,"tag":29,"props":363350,"children":363351},{},[363352,363354,363358],{"type":23,"value":363353},"We're thrilled to announce our recent accomplishment of a 5-star rating on G2 in the ",{"type":17,"tag":133,"props":363355,"children":363356},{"href":7691},[363357],{"type":23,"value":7806},{"type":23,"value":363359}," category. Check out what some of our customers are saying:",{"type":17,"tag":29,"props":363361,"children":363362},{},[363363],{"type":17,"tag":33,"props":363364,"children":363365},{},[363366],{"type":23,"value":363367},"\"No other Unified API provider has the authentication flexibility that Unified has, their embedded authentication script works great in no-code tools.\"",{"type":17,"tag":29,"props":363369,"children":363370},{},[363371],{"type":23,"value":363372},"— Jaron Sander, Growth Engineer at Sylva",{"type":17,"tag":29,"props":363374,"children":363375},{},[363376],{"type":23,"value":363377},"\"We can scale up our ATS and HR integrations and they've made the entire integration process seamless for our developers with their truly Unified API.\"",{"type":17,"tag":29,"props":363379,"children":363380},{},[363381],{"type":23,"value":363382},"— Kevin Kliman, CEO at Humi",{"type":17,"tag":29,"props":363384,"children":363385},{},[363386],{"type":17,"tag":133,"props":363387,"children":363389},{"href":318903,"rel":363388},[214],[363390],{"type":23,"value":363391},"G2 Reviews",{"type":17,"tag":68,"props":363393,"children":363395},{"id":363394},"one-api-to-integrate-them-all",[363396],{"type":23,"value":363397},"One API to integrate them all",{"type":17,"tag":29,"props":363399,"children":363400},{},[363401,363403,363411,363413,363422,363423,363433],{"type":23,"value":363402},"You're reading this article on the ",{"type":17,"tag":133,"props":363404,"children":363406},{"href":42620,"rel":363405},[214],[363407],{"type":17,"tag":48,"props":363408,"children":363409},{},[363410],{"type":23,"value":217},{"type":23,"value":363412}," blog. We're a Unified API developer platform for SaaS customer-facing integrations. We're excited to continue to innovate at Unified.to and solve hard, critical integration-related problems for our customers. If you're curious about our integrations-as-a-service solution, consider ",{"type":17,"tag":133,"props":363414,"children":363416},{"href":1612,"rel":363415},[214],[363417],{"type":17,"tag":48,"props":363418,"children":363419},{},[363420],{"type":23,"value":363421},"signing up for a free account",{"type":23,"value":226472},{"type":17,"tag":133,"props":363424,"children":363427},{"href":363425,"rel":363426},"https://calendly.com/michelle-unified/discovery-via-blog",[214],[363428],{"type":17,"tag":48,"props":363429,"children":363430},{},[363431],{"type":23,"value":363432},"meet with an integrations expert",{"type":17,"tag":48,"props":363434,"children":363435},{},[363436],{"type":23,"value":54},{"type":17,"tag":29,"props":363438,"children":363439},{},[363440],{"type":23,"value":363441},"That's it for now, thanks for reading!",{"title":7,"searchDepth":1629,"depth":1629,"links":363443},[363444,363445,363446,363447,363448,363449,363450,363451,363452],{"id":11629,"depth":1629,"text":11632},{"id":363057,"depth":1629,"text":363060},{"id":363084,"depth":1629,"text":363087},{"id":363187,"depth":1629,"text":363190},{"id":363263,"depth":1629,"text":363266},{"id":363296,"depth":1629,"text":363299},{"id":363324,"depth":1629,"text":363327},{"id":363345,"depth":1629,"text":363348},{"id":363394,"depth":1629,"text":363397},"content:blog:unified_oct_2023_product_updates.md","blog/unified_oct_2023_product_updates.md","blog/unified_oct_2023_product_updates",{"_path":363457,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":363458,"description":363459,"img":363460,"date":363461,"tag":6341,"body":363462,"_type":1677,"_id":364233,"_source":1679,"_file":364234,"_stem":364235,"_extension":1682},"/blog/how_to_build_a_candidate_assessment_product_with_unified","How to build a Candidate Assessment product with Unified.to","There are two different ways that you can build a candidate assessment solution. Some ATS providers will allow for an assessment solution to register with them...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_build_a_candidate_assessment_product_with_unified-icon.png","2023-10-23T00:00:00.000Z",{"type":14,"children":363463,"toc":364223},[363464,363469,363472,363480,363484,363496,363501,363512,363523,363529,363542,363548,363568,363574,363612,363618,363623,363631,364081,364087,364092,364140,364145,364150,364182,364188],{"type":17,"tag":18,"props":363465,"children":363467},{"id":363466},"how-to-build-a-candidate-assessment-product-with-unifiedto",[363468],{"type":23,"value":363458},{"type":17,"tag":25,"props":363470,"children":363471},{},[],{"type":17,"tag":29,"props":363473,"children":363474},{},[363475],{"type":17,"tag":33,"props":363476,"children":363477},{},[363478],{"type":23,"value":363479},"October 23, 2023",{"type":17,"tag":11616,"props":363481,"children":363483},{"width":11618,"height":11619,"src":363482,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/0hfH39vh7Qk",[],{"type":17,"tag":29,"props":363485,"children":363486},{},[363487,363489,363494],{"type":23,"value":363488},"There are two different ways that you can build a candidate assessment solution. Some ATS providers will allow for an assessment solution to register with them and then call your server with an assessment request. Unfortunately, not many ATS providers support this method, so ",{"type":17,"tag":133,"props":363490,"children":363492},{"href":42620,"rel":363491},[214],[363493],{"type":23,"value":217},{"type":23,"value":363495}," only supports this method that is widely supported.",{"type":17,"tag":29,"props":363497,"children":363498},{},[363499],{"type":23,"value":363500},"In the high-paced realm of recruitment, where talent acquisition meets the evolving landscape of HR technology, the need for efficient and robust Candidate Assessment tools has never been more crucial. As companies strive to identify top talent, incorporating candidate assessment software that facilitates critical activities like background checks, skills tests, candidate analytics analysis and more not only expedites the screening process but also ensures a comprehensive and data-driven approach to talent acquisition.",{"type":17,"tag":29,"props":363502,"children":363503},{},[363504,363506,363510],{"type":23,"value":363505},"This guide explore how to develop robust and scalable Candidate Assessment software by leveraging third-party integrations through Unified.to's ",{"type":17,"tag":133,"props":363507,"children":363508},{"href":7691},[363509],{"type":23,"value":7806},{"type":23,"value":363511}," developer platform to enhance the value of your candidate assessment solution.",{"type":17,"tag":29,"props":363513,"children":363514},{},[363515,363517,363521],{"type":23,"value":363516},"For teams building AI-driven screening or semantic resume matching, this same architecture can also power ",{"type":17,"tag":133,"props":363518,"children":363519},{"href":77021},[363520],{"type":23,"value":77024},{"type":23,"value":363522}," (RAG) workflows on top of ATS data.",{"type":17,"tag":68,"props":363524,"children":363526},{"id":363525},"who",[363527],{"type":23,"value":363528},"Who",{"type":17,"tag":29,"props":363530,"children":363531},{},[363532,363534,363540],{"type":23,"value":363533},"You have built a  ",{"type":17,"tag":6121,"props":363535,"children":363537},{"className":363536},[],[363538],{"type":23,"value":363539},"Candidate Assessment",{"type":23,"value":363541}," solution for recruiters and hiring managers, enabling them to evaluate candidates who are applying for positions within their companies.",{"type":17,"tag":68,"props":363543,"children":363545},{"id":363544},"why-your-goal",[363546],{"type":23,"value":363547},"Why (your goal)",{"type":17,"tag":80,"props":363549,"children":363550},{},[363551,363563],{"type":17,"tag":84,"props":363552,"children":363553},{},[363554,363556,363561],{"type":23,"value":363555},"You need to access your customers' ",{"type":17,"tag":6121,"props":363557,"children":363559},{"className":363558},[],[363560],{"type":23,"value":11756},{"type":23,"value":363562}," (application tracking systems) to automate the data flow of new applications so that your solution can test and assess their candidates.",{"type":17,"tag":84,"props":363564,"children":363565},{},[363566],{"type":23,"value":363567},"Retrieve resumes and job descriptions to power RAG-based candidate ranking and semantic matching.",{"type":17,"tag":68,"props":363569,"children":363571},{"id":363570},"what",[363572],{"type":23,"value":363573},"What",{"type":17,"tag":29,"props":363575,"children":363576},{},[363577,363579,363584,363585,363590,363591,363596,363597,363603,363604,363610],{"type":23,"value":363578},"You will need to integrate seamlessly with the leading ATS solutions utilized by your customers, such as  ",{"type":17,"tag":133,"props":363580,"children":363582},{"href":337814,"rel":363581},[214],[363583],{"type":23,"value":3189},{"type":23,"value":11826},{"type":17,"tag":133,"props":363586,"children":363588},{"href":337821,"rel":363587},[214],[363589],{"type":23,"value":56545},{"type":23,"value":11826},{"type":17,"tag":133,"props":363592,"children":363594},{"href":361419,"rel":363593},[214],[363595],{"type":23,"value":75321},{"type":23,"value":11826},{"type":17,"tag":133,"props":363598,"children":363601},{"href":363599,"rel":363600},"https://unified.to/integrations/successfactors",[214],[363602],{"type":23,"value":54981},{"type":23,"value":12561},{"type":17,"tag":133,"props":363605,"children":363607},{"href":56812,"rel":363606},[214],[363608],{"type":23,"value":363609},"more",{"type":23,"value":363611},". This will provide your users with a streamlined user experience, ensuring efficient data flow and synchronization between your Candidate Assessment solution and their preferred Applicant Tracking Systems (ATS).",{"type":17,"tag":68,"props":363613,"children":363615},{"id":363614},"how-to-add-ats-integrations-to-your-product",[363616],{"type":23,"value":363617},"How to add ATS integrations to your product",{"type":17,"tag":29,"props":363619,"children":363620},{},[363621],{"type":23,"value":363622},"Before we start, be sure to first read:",{"type":17,"tag":29,"props":363624,"children":363625},{},[363626],{"type":17,"tag":133,"props":363627,"children":363629},{"href":353758,"rel":363628},[214],[363630],{"type":23,"value":158450},{"type":17,"tag":6154,"props":363632,"children":363633},{},[363634,363666,363717,363866,363964],{"type":17,"tag":84,"props":363635,"children":363636},{},[363637,363642],{"type":17,"tag":48,"props":363638,"children":363639},{},[363640],{"type":23,"value":363641},"Get an initial list of applications",{"type":17,"tag":6154,"props":363643,"children":363644},{},[363645],{"type":17,"tag":84,"props":363646,"children":363647},{},[363648,363650,363657],{"type":23,"value":363649},"When the customer authorizes an ATS connection, ",{"type":17,"tag":133,"props":363651,"children":363654},{"href":363652,"rel":363653},"https://docs.unified.to/ats/application/List_all_applications",[214],[363655],{"type":23,"value":363656},"read the initial set of active applications",{"type":17,"tag":6893,"props":363658,"children":363661},{"className":363659,"code":363660,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AtsApplication, AtsApplicationStatus } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function getApplications(connectionId: string, trigger_status: AtsApplicationStatus, jobId: string, updatedGte?: Date) {\n    const applications: AtsApplication[] = [];\n    const limit = 100;\n    let offset = 0;\n\n    while (true) {\n        const result = await sdk.ats.listAtsApplications({\n            updatedGte,\n            jobId,\n            offset,\n            limit,\n            connectionId,\n        });\n\n        const apps = result.atsApplications || [];\n\n        applications.push(...apps.filter((application) => application.status === trigger_status));\n\n        if (apps.length === limit) {\n            offset += limit;\n        } else {\n            break;\n        }\n    }\n\n    return applications;\n}\n",[363662],{"type":17,"tag":6121,"props":363663,"children":363664},{"__ignoreMap":7},[363665],{"type":23,"value":363660},{"type":17,"tag":84,"props":363667,"children":363668},{},[363669,363674],{"type":17,"tag":48,"props":363670,"children":363671},{},[363672],{"type":23,"value":363673},"Set up to get updated applications",{"type":17,"tag":6154,"props":363675,"children":363676},{},[363677,363704],{"type":17,"tag":84,"props":363678,"children":363679},{},[363680,363682,363688,363690,363695],{"type":23,"value":363681},"If you want to use webhooks to get new/updated applications in the future, ",{"type":17,"tag":133,"props":363683,"children":363685},{"href":330059,"rel":363684},[214],[363686],{"type":23,"value":363687},"create a webhook",{"type":23,"value":363689}," with that ",{"type":17,"tag":6121,"props":363691,"children":363693},{"className":363692},[],[363694],{"type":23,"value":25037},{"type":17,"tag":6893,"props":363696,"children":363699},{"className":363697,"code":363698,"language":18718,"meta":7},[18716],"import { createHmac } from 'crypto';\nimport { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AtsApplication, AtsApplicationStatus, Event, ObjectType, WebhookType } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\ninterface IncomingWebhook {\n    id: string;\n    created_at: Date;\n    updated_at: Date;\n    workspace_id: string;\n    connection_id: string;\n    hook_url: string;\n    object_type: TObjectType;\n    interval: number;\n    checked_at: Date;\n    integration_type: string;\n    environment: string;\n    event: Event;\n    runs: string[];\n    fields: string;\n    webhook_type: WebhookType;\n    is_healthy: boolean;\n    page_max_limit: number;\n}\n\ninterface IWebhookData\u003CT> {\n    data: T[]; // The data array will contact an array of specific objects according to the webhook's connection. (eg. CRM Contacts)\n    webhook: IncomingWebhook; // The webhook object\n    nonce: string; // random string\n    sig: string; // HMAC-SHA1(workspace.secret, data + nonce)\n    type: 'INITIAL-PARTIAL' | 'INITIAL-COMPLETE' | 'VIRTUAL' | 'NATIVE';\n}\n\nexport async function createApplicationsWebhook(connectionId: string, myWebhookUrl: string) {\n    const result = await sdk.unified.createUnifiedWebhook({\n        webhook: {\n            hookUrl: myWebhookUrl,\n            objectType: ObjectType.AtsApplication,\n            event: Event.Updated,\n            connectionId,\n        },\n    });\n\n    return result.webhook;\n}\n\nexport async function handleUnifiedWebhook(incoming: IWebhookData\u003CAtsApplication>, trigger_status: AtsApplicationStatus) {\n    if (incoming.webhook.object_type !== 'ats_application') {\n        return; // not for us\n    }\n\n    const sig =\n                        createHmac('sha1', process.env.WORKSPACE_SECRET)\n                            .update(JSON.stringify(incoming.data))\n                            .update(String(incoming.nonce))\n                            .digest('base64');\n    if (sig !== incoming.sig) {\n        return; // Houston, we have a problem... with security\n    }\n\n    return incoming.data?.filter((application: AtsApplication) => application.status === trigger_status);\n}\n",[363700],{"type":17,"tag":6121,"props":363701,"children":363702},{"__ignoreMap":7},[363703],{"type":23,"value":363698},{"type":17,"tag":84,"props":363705,"children":363706},{},[363707,363709,363715],{"type":23,"value":363708},"Alternatively, create a polling schedule to ",{"type":17,"tag":133,"props":363710,"children":363712},{"href":363652,"rel":363711},[214],[363713],{"type":23,"value":363714},"get new/updated applications",{"type":23,"value":363716},", which would be similar to the code in 1a)",{"type":17,"tag":84,"props":363718,"children":363719},{},[363720,363725],{"type":17,"tag":48,"props":363721,"children":363722},{},[363723],{"type":23,"value":363724},"Filter applications on a specific status",{"type":17,"tag":6154,"props":363726,"children":363727},{},[363728,363747],{"type":17,"tag":84,"props":363729,"children":363730},{},[363731,363732,363738,363740,363745],{"type":23,"value":6712},{"type":17,"tag":133,"props":363733,"children":363736},{"href":363734,"rel":363735},"https://docs.unified.to/ats/application/model",[214],[363737],{"type":23,"value":97116},{"type":23,"value":363739}," has a standardized ",{"type":17,"tag":6121,"props":363741,"children":363743},{"className":363742},[],[363744],{"type":23,"value":19949},{"type":23,"value":363746}," across all ATS integrations, so decide which one makes sense for you to trigger the assessment",{"type":17,"tag":84,"props":363748,"children":363749},{},[363750,363752,363757,363758,363763,363764,363769,363770,363776,363777,363782,363783,363789,363790,363796,363797,363802,363803,363808,363809,363814,363815,363820,363821,363826,363827,363833,363835,363840,363841,363846,363847,363852,363853,363858,363859,363864],{"type":23,"value":363751},"Application.Status options are ",{"type":17,"tag":6121,"props":363753,"children":363755},{"className":363754},[],[363756],{"type":23,"value":133847},{"type":23,"value":18757},{"type":17,"tag":6121,"props":363759,"children":363761},{"className":363760},[],[363762],{"type":23,"value":133860},{"type":23,"value":18757},{"type":17,"tag":6121,"props":363765,"children":363767},{"className":363766},[],[363768],{"type":23,"value":117367},{"type":23,"value":18757},{"type":17,"tag":6121,"props":363771,"children":363773},{"className":363772},[],[363774],{"type":23,"value":363775},"SUBMITTED",{"type":23,"value":18757},{"type":17,"tag":6121,"props":363778,"children":363780},{"className":363779},[],[363781],{"type":23,"value":133873},{"type":23,"value":18757},{"type":17,"tag":6121,"props":363784,"children":363786},{"className":363785},[],[363787],{"type":23,"value":363788},"SECOND_INTERVIEW",{"type":23,"value":18757},{"type":17,"tag":6121,"props":363791,"children":363793},{"className":363792},[],[363794],{"type":23,"value":363795},"THIRD_INTERVIEW",{"type":23,"value":18757},{"type":17,"tag":6121,"props":363798,"children":363800},{"className":363799},[],[363801],{"type":23,"value":149642},{"type":23,"value":18757},{"type":17,"tag":6121,"props":363804,"children":363806},{"className":363805},[],[363807],{"type":23,"value":133886},{"type":23,"value":18757},{"type":17,"tag":6121,"props":363810,"children":363812},{"className":363811},[],[363813],{"type":23,"value":146070},{"type":23,"value":18757},{"type":17,"tag":6121,"props":363816,"children":363818},{"className":363817},[],[363819],{"type":23,"value":133899},{"type":23,"value":18757},{"type":17,"tag":6121,"props":363822,"children":363824},{"className":363823},[],[363825],{"type":23,"value":146075},{"type":23,"value":18757},{"type":17,"tag":6121,"props":363828,"children":363830},{"className":363829},[],[363831],{"type":23,"value":363832},"WITHDRAWN",{"type":23,"value":363834},". Of these, ",{"type":17,"tag":6121,"props":363836,"children":363838},{"className":363837},[],[363839],{"type":23,"value":133860},{"type":23,"value":11826},{"type":17,"tag":6121,"props":363842,"children":363844},{"className":363843},[],[363845],{"type":23,"value":117367},{"type":23,"value":11826},{"type":17,"tag":6121,"props":363848,"children":363850},{"className":363849},[],[363851],{"type":23,"value":133873},{"type":23,"value":11826},{"type":17,"tag":6121,"props":363854,"children":363856},{"className":363855},[],[363857],{"type":23,"value":363788},{"type":23,"value":27293},{"type":17,"tag":6121,"props":363860,"children":363862},{"className":363861},[],[363863],{"type":23,"value":149642},{"type":23,"value":363865}," should be considered.",{"type":17,"tag":84,"props":363867,"children":363868},{},[363869,363874],{"type":17,"tag":48,"props":363870,"children":363871},{},[363872],{"type":23,"value":363873},"Email the candidate with the assessment based on the job",{"type":17,"tag":6154,"props":363875,"children":363876},{},[363877,363904,363933],{"type":17,"tag":84,"props":363878,"children":363879},{},[363880,363887,363888,363894,363895],{"type":17,"tag":133,"props":363881,"children":363884},{"href":363882,"rel":363883},"https://docs.unified.to/ats/candidate/Retrieve_a_candidate",[214],[363885],{"type":23,"value":363886},"Read the candidate",{"type":23,"value":346876},{"type":17,"tag":6121,"props":363889,"children":363891},{"className":363890},[],[363892],{"type":23,"value":363893},"Application.candidate_id",{"type":23,"value":187853},{"type":17,"tag":6893,"props":363896,"children":363899},{"className":363897,"code":363898,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function readCandidate(connectionId: string, candidateId: string) {\n    return await sdk.ats.getAtsCandidate({\n        id: candidateId,\n        connectionId,\n    });\n}\n",[363900],{"type":17,"tag":6121,"props":363901,"children":363902},{"__ignoreMap":7},[363903],{"type":23,"value":363898},{"type":17,"tag":84,"props":363905,"children":363906},{},[363907,363909,363916,363917,363923,363924],{"type":23,"value":363908},"Optional: ",{"type":17,"tag":133,"props":363910,"children":363913},{"href":363911,"rel":363912},"https://docs.unified.to/ats/job/Retrieve_a_job",[214],[363914],{"type":23,"value":363915},"read the job",{"type":23,"value":346876},{"type":17,"tag":6121,"props":363918,"children":363920},{"className":363919},[],[363921],{"type":23,"value":363922},"Application.job_id",{"type":23,"value":187853},{"type":17,"tag":6893,"props":363925,"children":363928},{"className":363926,"code":363927,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function readJob(connectionId: string, jobId: string) {\n    return await sdk.ats.getAtsJob({\n        id: jobId,\n        connectionId,\n    });\n}\n",[363929],{"type":17,"tag":6121,"props":363930,"children":363931},{"__ignoreMap":7},[363932],{"type":23,"value":363927},{"type":17,"tag":84,"props":363934,"children":363935},{},[363936,363938,363949,363950,363956,363957,363963],{"type":23,"value":363937},"Determine which test to send to the candidate based on the ",{"type":17,"tag":133,"props":363939,"children":363942},{"href":363940,"rel":363941},"http://job.id/",[214],[363943],{"type":17,"tag":6121,"props":363944,"children":363946},{"className":363945},[],[363947],{"type":23,"value":363948},"Job.id",{"type":23,"value":11826},{"type":17,"tag":6121,"props":363951,"children":363953},{"className":363952},[],[363954],{"type":23,"value":363955},"Job.descripton",{"type":23,"value":75890},{"type":17,"tag":6121,"props":363958,"children":363960},{"className":363959},[],[363961],{"type":23,"value":363962},"Job.name",{"type":23,"value":200360},{"type":17,"tag":84,"props":363965,"children":363966},{},[363967,363972],{"type":17,"tag":48,"props":363968,"children":363969},{},[363970],{"type":23,"value":363971},"Once the candidate has completed the assessment/test, notify the hiring manager and/or recruiter",{"type":17,"tag":6154,"props":363973,"children":363974},{},[363975,364019,364041,364054],{"type":17,"tag":84,"props":363976,"children":363977},{},[363978,363984,363986,363992,363994,364000,364002,364008,364010],{"type":17,"tag":133,"props":363979,"children":363981},{"href":343435,"rel":363980},[214],[363982],{"type":23,"value":363983},"Read the employee",{"type":23,"value":363985}," information based on the ",{"type":17,"tag":6121,"props":363987,"children":363989},{"className":363988},[],[363990],{"type":23,"value":363991},"Job.hiring_managers_ids",{"type":23,"value":363993}," and/or ",{"type":17,"tag":6121,"props":363995,"children":363997},{"className":363996},[],[363998],{"type":23,"value":363999},"Job.recruiter_ids",{"type":23,"value":364001}," fields and use the ",{"type":17,"tag":6121,"props":364003,"children":364005},{"className":364004},[],[364006],{"type":23,"value":364007},"Employee.emails",{"type":23,"value":364009}," field to email them the notification",{"type":17,"tag":6893,"props":364011,"children":364014},{"className":364012,"code":364013,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function readEmployee(connectionId: string, employeeId: string) {\n    return await sdk.hris.getHrisEmployee({\n        id: employeeId,\n        connectionId,\n    });\n}\n",[364015],{"type":17,"tag":6121,"props":364016,"children":364017},{"__ignoreMap":7},[364018],{"type":23,"value":364013},{"type":17,"tag":84,"props":364020,"children":364021},{},[364022,364023,364030,364032],{"type":23,"value":363908},{"type":17,"tag":133,"props":364024,"children":364027},{"href":364025,"rel":364026},"https://docs.unified.to/ats/document/Create_a_document",[214],[364028],{"type":23,"value":364029},"push back a PDF document",{"type":23,"value":364031}," into the customer's ATS that is associated with that application",{"type":17,"tag":6893,"props":364033,"children":364036},{"className":364034,"code":364035,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\nimport { AtsDocumentType } from '@unified-api/typescript-sdk/dist/sdk/models/shared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function createDocument(connectionId: string, applicationId: string, documentUrl: string, filename: string, type: AtsDocumentType) {\n    return await sdk.ats.createAtsDocument({\n        atsDocument: {\n            applicationId,\n            type,\n            documentUrl,\n            filename,\n        },\n        connectionId,\n    });\n}\n",[364037],{"type":17,"tag":6121,"props":364038,"children":364039},{"__ignoreMap":7},[364040],{"type":23,"value":364035},{"type":17,"tag":84,"props":364042,"children":364043},{},[364044,364045,364052],{"type":23,"value":363908},{"type":17,"tag":133,"props":364046,"children":364049},{"href":364047,"rel":364048},"https://docs.unified.to/ats/activity/Create_an_activity",[214],[364050],{"type":23,"value":364051},"create an activity",{"type":23,"value":364053}," associated with the application or candidate",{"type":17,"tag":84,"props":364055,"children":364056},{},[364057,364058,364065,364067,364072],{"type":23,"value":363908},{"type":17,"tag":133,"props":364059,"children":364062},{"href":364060,"rel":364061},"https://docs.unified.to/ats/candidate/Update_a_candidate",[214],[364063],{"type":23,"value":364064},"update a candidate",{"type":23,"value":364066}," with certain ",{"type":17,"tag":6121,"props":364068,"children":364070},{"className":364069},[],[364071],{"type":23,"value":62478},{"type":17,"tag":6893,"props":364073,"children":364076},{"className":364074,"code":364075,"language":18718,"meta":7},[18716],"import { UnifiedTo } from '@unified-api/typescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nexport async function updateCandidateTags(connectionId: string, candidateId: string, tags: string[]) {\n    return await sdk.ats.updateAtsCandidate({\n        atsCandidate: {\n            tags,\n        },\n        id: candidateId,\n        connectionId,\n    });\n}\n",[364077],{"type":17,"tag":6121,"props":364078,"children":364079},{"__ignoreMap":7},[364080],{"type":23,"value":364075},{"type":17,"tag":239,"props":364082,"children":364084},{"id":364083},"advanced-adding-rag-based-resume-matching",[364085],{"type":23,"value":364086},"Advanced: Adding RAG-Based Resume Matching",{"type":17,"tag":29,"props":364088,"children":364089},{},[364090],{"type":23,"value":364091},"Beyond triggering assessments, you can extend this workflow into a RAG architecture:",{"type":17,"tag":6154,"props":364093,"children":364094},{},[364095,364108,364113,364135],{"type":17,"tag":84,"props":364096,"children":364097},{},[364098,364100,364106],{"type":23,"value":364099},"Retrieve the candidate's resume (",{"type":17,"tag":6121,"props":364101,"children":364103},{"className":364102},[],[364104],{"type":23,"value":364105},"AtsCandidate.resume_url",{"type":23,"value":364107},") and job description.",{"type":17,"tag":84,"props":364109,"children":364110},{},[364111],{"type":23,"value":364112},"Chunk and embed both documents.",{"type":17,"tag":84,"props":364114,"children":364115},{},[364116,364117,364122,364123,364128,364129,364134],{"type":23,"value":233739},{"type":17,"tag":6121,"props":364118,"children":364120},{"className":364119},[],[364121],{"type":23,"value":25037},{"type":23,"value":11826},{"type":17,"tag":6121,"props":364124,"children":364126},{"className":364125},[],[364127],{"type":23,"value":117296},{"type":23,"value":12561},{"type":17,"tag":6121,"props":364130,"children":364132},{"className":364131},[],[364133],{"type":23,"value":117309},{"type":23,"value":54},{"type":17,"tag":84,"props":364136,"children":364137},{},[364138],{"type":23,"value":364139},"Retrieve the most relevant resume segments against the job description before generating screening insights or ranking scores.",{"type":17,"tag":29,"props":364141,"children":364142},{},[364143],{"type":23,"value":364144},"Unified handles ingestion and normalization across ATS providers; embeddings and retrieval remain in your infrastructure.",{"type":17,"tag":68,"props":364146,"children":364148},{"id":364147},"keep-learning",[364149],{"type":23,"value":353722},{"type":17,"tag":80,"props":364151,"children":364152},{},[364153,364162,364172],{"type":17,"tag":84,"props":364154,"children":364155},{},[364156],{"type":17,"tag":133,"props":364157,"children":364159},{"href":357611,"rel":364158},[214],[364160],{"type":23,"value":364161},"How to add a test connection ",{"type":17,"tag":84,"props":364163,"children":364164},{},[364165],{"type":17,"tag":133,"props":364166,"children":364169},{"href":364167,"rel":364168},"https://unified.to/blog/start_here_how_your_customer_can_add_an_integration_in_your_application",[214],[364170],{"type":23,"value":364171},"How your customers add integrations from your application",{"type":17,"tag":84,"props":364173,"children":364174},{},[364175],{"type":17,"tag":133,"props":364176,"children":364179},{"href":364177,"rel":364178},"https://unified.to/blog/start_here_how_to_generate_oauth2_credentials",[214],[364180],{"type":23,"value":364181},"How to generate OAuth 2 credentials ",{"type":17,"tag":68,"props":364183,"children":364185},{"id":364184},"a-unified-api-to-integrate-them-all",[364186],{"type":23,"value":364187},"A unified API to integrate them all",{"type":17,"tag":29,"props":364189,"children":364190},{},[364191,364193,364201,364202,364210,364211,364219],{"type":23,"value":364192},"Unified.to is a complete solution to streamline your integration development process and power your Candidate Assessment product with critical third-party candidate data. You're reading this article on the ",{"type":17,"tag":133,"props":364194,"children":364196},{"href":42620,"rel":364195},[214],[364197],{"type":17,"tag":48,"props":364198,"children":364199},{},[364200],{"type":23,"value":217},{"type":23,"value":363412},{"type":17,"tag":133,"props":364203,"children":364205},{"href":1612,"rel":364204},[214],[364206],{"type":17,"tag":48,"props":364207,"children":364208},{},[364209],{"type":23,"value":363421},{"type":23,"value":226472},{"type":17,"tag":133,"props":364212,"children":364214},{"href":363425,"rel":364213},[214],[364215],{"type":17,"tag":48,"props":364216,"children":364217},{},[364218],{"type":23,"value":363432},{"type":17,"tag":48,"props":364220,"children":364221},{},[364222],{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":364224},[364225,364226,364227,364228,364231,364232],{"id":363525,"depth":1629,"text":363528},{"id":363544,"depth":1629,"text":363547},{"id":363570,"depth":1629,"text":363573},{"id":363614,"depth":1629,"text":363617,"children":364229},[364230],{"id":364083,"depth":1635,"text":364086},{"id":364147,"depth":1629,"text":353722},{"id":364184,"depth":1629,"text":364187},"content:blog:how_to_build_a_candidate_assessment_product_with_unified.md","blog/how_to_build_a_candidate_assessment_product_with_unified.md","blog/how_to_build_a_candidate_assessment_product_with_unified",{"_path":364237,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":364238,"description":364239,"img":364240,"date":364241,"tag":289978,"body":364242,"_type":1677,"_id":364478,"_source":1679,"_file":364479,"_stem":364480,"_extension":1682},"/blog/how_herohunt_saved_ten_months_of_engineering_time_with_unified","How HeroHunt saved ten months of engineering time with Unified.to","HeroHunt chose Unified.to as their preferred Unified API platform to integrate with multiple application tracking systems (ATS). After assessing alternatives...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_herohunt_saved_ten_months_of_engineering_time_with_unified-icon.png","2023-10-19T00:00:00.000Z",{"type":14,"children":364243,"toc":364470},[364244,364249,364252,364260,364284,364288,364316,364324,364330,364335,364340,364345,364351,364356,364364,364372,364380,364385,364409,364415,364420,364425,364430,364436,364448,364454,364459],{"type":17,"tag":18,"props":364245,"children":364247},{"id":364246},"how-herohunt-saved-ten-months-of-engineering-time-with-unifiedto",[364248],{"type":23,"value":364238},{"type":17,"tag":25,"props":364250,"children":364251},{},[],{"type":17,"tag":29,"props":364253,"children":364254},{},[364255],{"type":17,"tag":33,"props":364256,"children":364257},{},[364258],{"type":23,"value":364259},"October 19, 2023",{"type":17,"tag":29,"props":364261,"children":364262},{},[364263,364272,364273],{"type":17,"tag":133,"props":364264,"children":364266},{"href":360890,"rel":364265},[214],[364267],{"type":17,"tag":33,"props":364268,"children":364269},{},[364270],{"type":23,"value":364271},"HeroHunt",{"type":23,"value":18757},{"type":17,"tag":33,"props":364274,"children":364275},{},[364276,364278,364282],{"type":23,"value":364277},"chose Unified.to as their preferred ",{"type":17,"tag":133,"props":364279,"children":364280},{"href":7691},[364281],{"type":23,"value":7806},{"type":23,"value":364283}," platform to integrate with multiple application tracking systems (ATS). After assessing alternatives such as embedded iPaaS solutions, their engineering team realized Unified.to was the fastest and most straightforward solution.",{"type":17,"tag":68,"props":364285,"children":364286},{"id":44585},[364287],{"type":23,"value":44588},{"type":17,"tag":80,"props":364289,"children":364290},{},[364291,364296,364301,364306,364311],{"type":17,"tag":84,"props":364292,"children":364293},{},[364294],{"type":23,"value":364295},"Company: AI talent search and engagement",{"type":17,"tag":84,"props":364297,"children":364298},{},[364299],{"type":23,"value":364300},"Use cases: Pull job data from ATS and push candidate profile data into ATS",{"type":17,"tag":84,"props":364302,"children":364303},{},[364304],{"type":23,"value":364305},"Objective: Support multiple ATS integrations",{"type":17,"tag":84,"props":364307,"children":364308},{},[364309],{"type":23,"value":364310},"Time savings: 10 months of engineering time (for building integrations)",{"type":17,"tag":84,"props":364312,"children":364313},{},[364314],{"type":23,"value":364315},"Results: Launched 22 ATS integrations in one week with Unified.to",{"type":17,"tag":29,"props":364317,"children":364318},{},[364319],{"type":17,"tag":6438,"props":364320,"children":364323},{"alt":364321,"src":364322},"HeroHunt_Testimonial_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_herohunt_saved_ten_months_of_engineering_time_with_unified-0.png",[],{"type":17,"tag":68,"props":364325,"children":364327},{"id":364326},"integrations-became-a-priority-as-they-moved-upmarket",[364328],{"type":23,"value":364329},"Integrations became a priority as they moved upmarket",{"type":17,"tag":29,"props":364331,"children":364332},{},[364333],{"type":23,"value":364334},"In 2021, HeroHunt emerged as a pioneering AI recruitment tech startup based in Amsterdam. Their mission: empower recruiters with enhanced data and workflows, elevating the recruitment process and scaling sourcing strategies.",{"type":17,"tag":29,"props":364336,"children":364337},{},[364338],{"type":23,"value":364339},"While their original target audience was freelance recruiters and small businesses, it wasn't long before HeroHunt began attracting larger companies, which required support for more complex tasks and tech stacks. HeroHunt needed integrations with multiple ATS providers as they moved upmarket to serve recruitment teams at larger companies.",{"type":17,"tag":29,"props":364341,"children":364342},{},[364343],{"type":23,"value":364344},"Initially, HeroHunt opted to handle integrations in-house and anticipated a two-week development timeline per integration. However, they soon encountered communication hurdles with third-party API providers, confusing documentation, several bugs, and ongoing integration maintenance, which distracted their team from their core product, prompting their search for alternative approaches.",{"type":17,"tag":68,"props":364346,"children":364348},{"id":364347},"launched-22-integrations-within-one-week",[364349],{"type":23,"value":364350},"Launched 22 integrations within one week",{"type":17,"tag":29,"props":364352,"children":364353},{},[364354],{"type":23,"value":364355},"Facing the strategic decision to support a broader customer base, HeroHunt required integrations into the most popular ATS providers, such as Greenhouse, Workable, and Workday. They needed a solution to swiftly scale their integration offerings while staying focused on their core product.",{"type":17,"tag":29,"props":364357,"children":364358},{},[364359],{"type":17,"tag":48,"props":364360,"children":364361},{},[364362],{"type":23,"value":364363},"\"Unified.to has a great variety of available API integrations. The dev team is quick to add new features and connections. With Unified.to, we can make a lot more API integrations available to our customers.\"",{"type":17,"tag":29,"props":364365,"children":364366},{},[364367],{"type":17,"tag":33,"props":364368,"children":364369},{},[364370],{"type":23,"value":364371},"— Yuma Heymans, CEO, HeroHunt",{"type":17,"tag":29,"props":364373,"children":364374},{},[364375],{"type":17,"tag":6438,"props":364376,"children":364379},{"alt":364377,"src":364378},"CleanShot_2023-10-19_at_14.13.22.gif","https://s3.us-east-2.amazonaws.com/unified-article-images/how_herohunt_saved_ten_months_of_engineering_time_with_unified-1.gif",[],{"type":17,"tag":29,"props":364381,"children":364382},{},[364383],{"type":23,"value":364384},"One HeroHunt developer deployed 22 ATS integrations with Unified.to within a week.",{"type":17,"tag":29,"props":364386,"children":364387},{},[364388,364390,364394,364396,364400,364402,364407],{"type":23,"value":364389},"This feat was achieved thanks to our robust Unified API, which includes unified endpoints, data models, ",{"type":17,"tag":133,"props":364391,"children":364392},{"href":4999},[364393],{"type":23,"value":5002},{"type":23,"value":364395},", authorization, and permission scopes—all without the hassle of delving into third-party ",{"type":17,"tag":133,"props":364397,"children":364398},{"href":129820},[364399],{"type":23,"value":129823},{"type":23,"value":364401},". Whether HeroHunt's team wanted to add a single integration or 100, with ",{"type":17,"tag":133,"props":364403,"children":364405},{"href":42620,"rel":364404},[214],[364406],{"type":23,"value":217},{"type":23,"value":364408},", it's the same development process, ensuring a streamlined and consistent experience regardless of scale.",{"type":17,"tag":68,"props":364410,"children":364412},{"id":364411},"the-process-was-speedy-straightforward-and-flexible",[364413],{"type":23,"value":364414},"The process was speedy, straightforward, and flexible",{"type":17,"tag":29,"props":364416,"children":364417},{},[364418],{"type":23,"value":364419},"In the search for the right integration development approach, HeroHunt looked into embedded iPaaS solutions, only to encounter complexity in the implementation process. Unified.to's straightforward implementation process was a breath of fresh air. Instead of juggling multiple connections to various APIs, their developer seamlessly integrated with the Unified ATS API to add multiple ATS integrations simultaneously.",{"type":17,"tag":29,"props":364421,"children":364422},{},[364423],{"type":23,"value":364424},"Initially concerned about the potential limitations of Unified API technology, HeroHunt was pleasantly surprised. Unified.to provided the simplicity they sought and exhibited remarkable depth. Unified.to's responsiveness to additional integration and feature requests also demonstrated the adaptability they needed.",{"type":17,"tag":29,"props":364426,"children":364427},{},[364428],{"type":23,"value":364429},"Yuma highlighted this responsiveness: \"When we inquire about adding an extra field, for instance, the usual response is yes, and the implementation happens quickly.\"",{"type":17,"tag":68,"props":364431,"children":364433},{"id":364432},"invaluable-support-and-domain-expertise",[364434],{"type":23,"value":364435},"Invaluable support and domain expertise",{"type":17,"tag":29,"props":364437,"children":364438},{},[364439,364441,364446],{"type":23,"value":364440},"During the integration process, the HeroHunt team received invaluable support and expertise from the Unified.to team. Direct access to integration experts in Unified.to's ",{"type":17,"tag":133,"props":364442,"children":364444},{"href":326013,"rel":364443},[214],[364445],{"type":23,"value":15720},{"type":23,"value":364447}," channel proved to be a surprising and appreciated advantage. Choosing Unified.to as their preferred Unified API platform accelerated the integration development process and allowed for real-time assistance when needed.",{"type":17,"tag":68,"props":364449,"children":364451},{"id":364450},"increased-revenue-opportunities",[364452],{"type":23,"value":364453},"Increased revenue opportunities",{"type":17,"tag":29,"props":364455,"children":364456},{},[364457],{"type":23,"value":364458},"HeroHunt has experienced a transformative efficiency gain by adding integrations with Unified.to, allowing their team to allocate time and resources to expanding their core product. In addition, their integrations with industry-leading ATS providers have opened new avenues for enterprise deals and paved the way for forging integration-based partnerships, which will be instrumental in sustaining and furthering HeroHunt's growth trajectory.",{"type":17,"tag":29,"props":364460,"children":364461},{},[364462,364464,364469],{"type":23,"value":364463},"Looking for an integration development solution that is fast, straightforward, and secure? ",{"type":17,"tag":133,"props":364465,"children":364467},{"href":1612,"rel":364466},[214],[364468],{"type":23,"value":355366},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":364471},[364472,364473,364474,364475,364476,364477],{"id":44585,"depth":1629,"text":44588},{"id":364326,"depth":1629,"text":364329},{"id":364347,"depth":1629,"text":364350},{"id":364411,"depth":1629,"text":364414},{"id":364432,"depth":1629,"text":364435},{"id":364450,"depth":1629,"text":364453},"content:blog:how_herohunt_saved_ten_months_of_engineering_time_with_unified.md","blog/how_herohunt_saved_ten_months_of_engineering_time_with_unified.md","blog/how_herohunt_saved_ten_months_of_engineering_time_with_unified",{"_path":364482,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":364483,"description":364484,"img":364485,"date":364486,"tag":12,"body":364487,"_type":1677,"_id":365044,"_source":1679,"_file":365045,"_stem":365046,"_extension":1682},"/blog/the_hr_tech_transformation_leveraging_api_integrations_for_growth","The HR tech transformation: leveraging API integrations for growth","How HR tech leaders are using API integrations to offer superior products in an increasingly interdependent ecosystem.","https://s3.us-east-2.amazonaws.com/unified-article-images/the_hr_tech_transformation_leveraging_api_integrations_for_growth-icon.png","2023-10-17T00:00:00.000Z",{"type":14,"children":364488,"toc":365037},[364489,364494,364497,364505,364512,364517,364523,364546,364554,364568,364591,364597,364611,364624,364629,364637,364642,364648,364653,364661,364669,364674,364681,364686,364694,364699,364707,364712,364720,364740,364748,364755,364760,364767,364772,364779,364784,364791,364796,364803,364823,364831,364838,364843,364850,364855,364862,364867,364874,364878,364886,364908,364913,364919,364924,364938,364943,364948,364953,364980,364985,364991,365025],{"type":17,"tag":18,"props":364490,"children":364492},{"id":364491},"the-hr-tech-transformation-leveraging-api-integrations-for-growth",[364493],{"type":23,"value":364483},{"type":17,"tag":25,"props":364495,"children":364496},{},[],{"type":17,"tag":29,"props":364498,"children":364499},{},[364500],{"type":17,"tag":33,"props":364501,"children":364502},{},[364503],{"type":23,"value":364504},"October 17, 2023",{"type":17,"tag":29,"props":364506,"children":364507},{},[364508],{"type":17,"tag":33,"props":364509,"children":364510},{},[364511],{"type":23,"value":364484},{"type":17,"tag":29,"props":364513,"children":364514},{},[364515],{"type":23,"value":364516},"Today's human resources (HR) software industry, with more than 16,000 solutions, is experiencing a wave of innovation that has created an interdependent ecosystem. HR tech leaders who harness customer data from systems across the ecosystem improve their product value and increase their capacity to attract, retain, and monetize a broader customer base.",{"type":17,"tag":68,"props":364518,"children":364520},{"id":364519},"the-state-of-hr-technology",[364521],{"type":23,"value":364522},"The state of HR technology",{"type":17,"tag":29,"props":364524,"children":364525},{},[364526,364528,364535,364537,364544],{"type":23,"value":364527},"Predictive analysis, process automation, and artificial intelligence are a few of the ",{"type":17,"tag":133,"props":364529,"children":364532},{"href":364530,"rel":364531},"https://www.zippia.com/advice/human-resources-statistics/",[214],[364533],{"type":23,"value":364534},"emerging areas of HR investment",{"type":23,"value":364536}," as companies strive to increase their digitization, modernize talent search, and elevate hybrid working. Amidst the influx of new HR software solutions, ",{"type":17,"tag":133,"props":364538,"children":364541},{"href":364539,"rel":364540},"https://www.pwc.com/us/en/tech-effect/cloud/hr-tech-survey.html",[214],[364542],{"type":23,"value":364543},"74% of companies",{"type":23,"value":364545}," aim to boost their spending on HR tech this year. The software review platform G2 now lists more than 30 HR software categories, covering everything from HRIS and recruitment to talent management and beyond.",{"type":17,"tag":29,"props":364547,"children":364548},{},[364549],{"type":17,"tag":6438,"props":364550,"children":364553},{"alt":364551,"src":364552},"HR_Software_Categories.png","https://s3.us-east-2.amazonaws.com/unified-article-images/the_hr_tech_transformation_leveraging_api_integrations_for_growth-0.png",[],{"type":17,"tag":29,"props":364555,"children":364556},{},[364557,364559,364566],{"type":23,"value":364558},"All this innovation in HR tech contributes to the proliferation of customer data that is scattered across multiple third-party software systems. As a result of having to switch between multiple systems, users are paying a higher ",{"type":17,"tag":133,"props":364560,"children":364563},{"href":364561,"rel":364562},"https://hbr.org/2022/08/how-much-time-and-energy-do-we-waste-toggling-between-applications#:~:text=The%20Toggling%20Tax&text=Before%20you%27re%20prepared%20to,switching%E2%80%9D%20%E2%80%94%20is%20cognitively%20taxing.",[214],[364564],{"type":23,"value":364565},"toggling tax",{"type":23,"value":364567},", driving demand for HR solutions that are compatible with a variety of related HR products.",{"type":17,"tag":29,"props":364569,"children":364570},{},[364571,364573,364580,364582,364589],{"type":23,"value":364572},"Additionally, ",{"type":17,"tag":133,"props":364574,"children":364577},{"href":364575,"rel":364576},"https://www.ukg.com/resources/analyst-report/state-todays-hr-tech-stack-2022-23?rq=1&gt=1",[214],[364578],{"type":23,"value":364579},"only 29% of HR tech users",{"type":23,"value":364581}," say the components of their HR tech stack integrate well, causing the average mid-sized company to replace ",{"type":17,"tag":133,"props":364583,"children":364586},{"href":364584,"rel":364585},"https://www.blissfully.com/saas-trends/2019-annual/",[214],[364587],{"type":23,"value":364588},"39% of their SaaS applications",{"type":23,"value":364590}," with ones that have better functionality and integration offerings. There is a clear opportunity for HR tech leaders to address these challenges head on by integrating their products directly with the top platforms.",{"type":17,"tag":68,"props":364592,"children":364594},{"id":364593},"the-role-of-integrations",[364595],{"type":23,"value":364596},"The role of integrations",{"type":17,"tag":29,"props":364598,"children":364599},{},[364600,364602,364609],{"type":23,"value":364601},"Globally, integrations are the ",{"type":17,"tag":133,"props":364603,"children":364606},{"href":364604,"rel":364605},"https://emtemp.gcom.cloud/ngw/globalassets/en/digital-markets/documents/2023-global-software-buying-trends-report.pdf",[214],[364607],{"type":23,"value":364608},"third most important factor",{"type":23,"value":364610}," for B2B buyers, followed by trust and sales flexibility. Integrations, built on APIs (application programming interfaces), are seamless connections between different software products, allowing them to communicate and share data in real time. For example, an HRIS platform can integrate with multiple ATS systems to allow for a seamless transfer of candidate data, interview schedules, and application statuses.",{"type":17,"tag":29,"props":364612,"children":364613},{},[364614,364616,364623],{"type":23,"value":364615},"HR software companies that enable integrations with other products not only enhance their products with third-party customer data but also alleviate the need for their customers to manually handle tasks or implement automation themselves through platforms like Zapier, increasing the rate of adoption and reducing user friction. Mid-sized companies found that integrations prevented churn by 70-79% and small companies ",{"type":17,"tag":133,"props":364617,"children":364620},{"href":364618,"rel":364619},"https://4716094.fs1.hubspotusercontent-na1.net/hubfs/4716094/State%20of%20the%20Partner%20Ecosystem%202023%20Report.pdf",[214],[364621],{"type":23,"value":364622},"reported a 50-59% impact",{"type":23,"value":54},{"type":17,"tag":29,"props":364625,"children":364626},{},[364627],{"type":23,"value":364628},"Consider a payroll software company that depends on employee data from HRIS platforms to facilitate timely employee payments. Without integrations, this company imposes the task of accessing HRIS data onto its customers through manual .CSV file uploads. Requiring customers to manually upload files whenever there are changes to employee data amplifies issues such as data silos, user friction, and errors. By incorporating direct integrations into popular HRIS platforms, the payroll software company extends its product's functionality and increases service reliability.",{"type":17,"tag":29,"props":364630,"children":364631},{},[364632],{"type":17,"tag":6438,"props":364633,"children":364636},{"alt":364634,"src":364635},"Payroll_software_integrations.png","https://s3.us-east-2.amazonaws.com/unified-article-images/the_hr_tech_transformation_leveraging_api_integrations_for_growth-1.png",[],{"type":17,"tag":29,"props":364638,"children":364639},{},[364640],{"type":23,"value":364641},"The value of integrations goes beyond enhancing user experiences — integrations are fundamental for HR tech companies as they heavily depend on third-party customer data to drive the core functionality of their products.",{"type":17,"tag":68,"props":364643,"children":364645},{"id":364644},"hr-tech-integration-use-cases",[364646],{"type":23,"value":364647},"HR tech integration use cases",{"type":17,"tag":29,"props":364649,"children":364650},{},[364651],{"type":23,"value":364652},"In the ever-evolving realm of HR tech, there is a wide spectrum of use cases for customer-facing integrations. We'll share a few common examples of how related products in the HR tech ecosystem share data through integrations.",{"type":17,"tag":29,"props":364654,"children":364655},{},[364656],{"type":17,"tag":48,"props":364657,"children":364658},{},[364659],{"type":23,"value":364660},"1. Automated candidate assessment",{"type":17,"tag":29,"props":364662,"children":364663},{},[364664],{"type":17,"tag":33,"props":364665,"children":364666},{},[364667],{"type":23,"value":364668},"Systems:",{"type":17,"tag":29,"props":364670,"children":364671},{},[364672],{"type":23,"value":364673},"An assessment tool integrates with applicant tracking systems (ATS)",{"type":17,"tag":29,"props":364675,"children":364676},{},[364677],{"type":17,"tag":33,"props":364678,"children":364679},{},[364680],{"type":23,"value":299271},{"type":17,"tag":29,"props":364682,"children":364683},{},[364684],{"type":23,"value":364685},"Enhance the hiring process with relevant assessment data (e.g., surveys, background checks, skills tests)",{"type":17,"tag":29,"props":364687,"children":364688},{},[364689],{"type":17,"tag":33,"props":364690,"children":364691},{},[364692],{"type":23,"value":364693},"Use case:",{"type":17,"tag":29,"props":364695,"children":364696},{},[364697],{"type":23,"value":364698},"Integrate with ATS data to streamline the hiring process by leveraging ATS data to perform an automated assessment and store the assessment data in the ATS.",{"type":17,"tag":29,"props":364700,"children":364701},{},[364702],{"type":17,"tag":33,"props":364703,"children":364704},{},[364705],{"type":23,"value":364706},"Data requirements:",{"type":17,"tag":29,"props":364708,"children":364709},{},[364710],{"type":23,"value":364711},"Candidate, Application, Scorecard",{"type":17,"tag":29,"props":364713,"children":364714},{},[364715],{"type":17,"tag":33,"props":364716,"children":364717},{},[364718],{"type":23,"value":364719},"Examples of ATS platforms:",{"type":17,"tag":29,"props":364721,"children":364722},{},[364723,364728,364729,364734,364735],{"type":17,"tag":133,"props":364724,"children":364726},{"href":337814,"rel":364725},[214],[364727],{"type":23,"value":3189},{"type":23,"value":11826},{"type":17,"tag":133,"props":364730,"children":364732},{"href":337821,"rel":364731},[214],[364733],{"type":23,"value":56545},{"type":23,"value":11826},{"type":17,"tag":133,"props":364736,"children":364738},{"href":361340,"rel":364737},[214],[364739],{"type":23,"value":361344},{"type":17,"tag":29,"props":364741,"children":364742},{},[364743],{"type":17,"tag":48,"props":364744,"children":364745},{},[364746],{"type":23,"value":364747},"2. Real-time application tracking",{"type":17,"tag":29,"props":364749,"children":364750},{},[364751],{"type":17,"tag":33,"props":364752,"children":364753},{},[364754],{"type":23,"value":364668},{"type":17,"tag":29,"props":364756,"children":364757},{},[364758],{"type":23,"value":364759},"Job board software integrates with ATS",{"type":17,"tag":29,"props":364761,"children":364762},{},[364763],{"type":17,"tag":33,"props":364764,"children":364765},{},[364766],{"type":23,"value":299271},{"type":17,"tag":29,"props":364768,"children":364769},{},[364770],{"type":23,"value":364771},"Provide real-time tracking of application status",{"type":17,"tag":29,"props":364773,"children":364774},{},[364775],{"type":17,"tag":33,"props":364776,"children":364777},{},[364778],{"type":23,"value":364693},{"type":17,"tag":29,"props":364780,"children":364781},{},[364782],{"type":23,"value":364783},"Implement ATS integrations to allow the job board software to communicate in real-time, enabling candidates to receive updates on the status of their applications, and increasing transparency in the hiring process.",{"type":17,"tag":29,"props":364785,"children":364786},{},[364787],{"type":17,"tag":33,"props":364788,"children":364789},{},[364790],{"type":23,"value":364706},{"type":17,"tag":29,"props":364792,"children":364793},{},[364794],{"type":23,"value":364795},"Candidate, Application, Job",{"type":17,"tag":29,"props":364797,"children":364798},{},[364799],{"type":17,"tag":33,"props":364800,"children":364801},{},[364802],{"type":23,"value":364719},{"type":17,"tag":29,"props":364804,"children":364805},{},[364806,364811,364812,364817,364818],{"type":17,"tag":133,"props":364807,"children":364809},{"href":337828,"rel":364808},[214],[364810],{"type":23,"value":56564},{"type":23,"value":11826},{"type":17,"tag":133,"props":364813,"children":364815},{"href":361291,"rel":364814},[214],[364816],{"type":23,"value":75326},{"type":23,"value":12561},{"type":17,"tag":133,"props":364819,"children":364821},{"href":361252,"rel":364820},[214],[364822],{"type":23,"value":59367},{"type":17,"tag":29,"props":364824,"children":364825},{},[364826],{"type":17,"tag":48,"props":364827,"children":364828},{},[364829],{"type":23,"value":364830},"3. Enhance performance management functionality",{"type":17,"tag":29,"props":364832,"children":364833},{},[364834],{"type":17,"tag":33,"props":364835,"children":364836},{},[364837],{"type":23,"value":364668},{"type":17,"tag":29,"props":364839,"children":364840},{},[364841],{"type":23,"value":364842},"Performance management product integrates with HRIS",{"type":17,"tag":29,"props":364844,"children":364845},{},[364846],{"type":17,"tag":33,"props":364847,"children":364848},{},[364849],{"type":23,"value":299271},{"type":17,"tag":29,"props":364851,"children":364852},{},[364853],{"type":23,"value":364854},"Enhance the performance management process by seamlessly integrating employee data from HRIS products",{"type":17,"tag":29,"props":364856,"children":364857},{},[364858],{"type":17,"tag":33,"props":364859,"children":364860},{},[364861],{"type":23,"value":364693},{"type":17,"tag":29,"props":364863,"children":364864},{},[364865],{"type":23,"value":364866},"HRIS integrations ensure performance assessments, goal-setting, and feedback reflect each employee's complete history, including titles, departments, and previous managers, found in HRIS data.",{"type":17,"tag":29,"props":364868,"children":364869},{},[364870],{"type":17,"tag":33,"props":364871,"children":364872},{},[364873],{"type":23,"value":364706},{"type":17,"tag":29,"props":364875,"children":364876},{},[364877],{"type":23,"value":61210},{"type":17,"tag":29,"props":364879,"children":364880},{},[364881],{"type":17,"tag":33,"props":364882,"children":364883},{},[364884],{"type":23,"value":364885},"Examples of HRIS platforms:",{"type":17,"tag":29,"props":364887,"children":364888},{},[364889,364894,364895,364902,364903],{"type":17,"tag":133,"props":364890,"children":364892},{"href":353474,"rel":364891},[214],[364893],{"type":23,"value":59319},{"type":23,"value":11826},{"type":17,"tag":133,"props":364896,"children":364899},{"href":364897,"rel":364898},"https://unified.to/integrations/deel",[214],[364900],{"type":23,"value":364901},"Deel",{"type":23,"value":12561},{"type":17,"tag":133,"props":364904,"children":364906},{"href":353547,"rel":364905},[214],[364907],{"type":23,"value":3194},{"type":17,"tag":29,"props":364909,"children":364910},{},[364911],{"type":23,"value":364912},"These are just some integration use cases that HR tech companies can support by seamlessly connecting with their customers' third-party HR or ATS data. Integrations contribute significantly to the evolution of robust software solutions, empowering HR tech companies to leverage third-party data to enhance their product value, from refined product onboarding to reduced data entry burden and more.",{"type":17,"tag":68,"props":364914,"children":364916},{"id":364915},"investing-in-integration-based-partnerships",[364917],{"type":23,"value":364918},"Investing in integration-based partnerships",{"type":17,"tag":29,"props":364920,"children":364921},{},[364922],{"type":23,"value":364923},"Integrations between complementary SaaS products are a gateway to growth.",{"type":17,"tag":29,"props":364925,"children":364926},{},[364927,364929,364936],{"type":23,"value":364928},"Not only do direct integrations give software companies a competitive edge and make it possible for companies to service a broader customer base, but they also allow integrated products to participate in ecosystem or integration-based partnerships that directly impact lead generation and sales. Okta, an identity and access management company, reported that deals influenced by integration partners accelerated their ",{"type":17,"tag":133,"props":364930,"children":364933},{"href":364931,"rel":364932},"https://ronpiovesan.medium.com/better-conversion-faster-deal-cycles-with-tech-partners-7fb5b711a6c8",[214],[364934],{"type":23,"value":364935},"sales cycle by 40%",{"type":23,"value":364937},", from early stage to won.",{"type":17,"tag":29,"props":364939,"children":364940},{},[364941],{"type":23,"value":364942},"Building an integration is usually the first step to engaging in a SaaS partnership, which can involve co-marketing activities, such as marketplace listings, social media promotion, webinars and sponsored events, and features in blog posts and newsletters.",{"type":17,"tag":29,"props":364944,"children":364945},{},[364946],{"type":23,"value":364947},"Acquiring customers through integration partnerships has the potential to drive better conversions and user retention with a positive ROI. For example, an ATS platform that integrates with the most popular HRIS platforms gains exposure to a new section of the market, without having to do an extensive amount of marketing and advertising.",{"type":17,"tag":29,"props":364949,"children":364950},{},[364951],{"type":23,"value":364952},"By taking a look at the wider SaaS industry, there are plenty of examples that HR tech leaders can learn from, such as:",{"type":17,"tag":80,"props":364954,"children":364955},{},[364956,364968],{"type":17,"tag":84,"props":364957,"children":364958},{},[364959,364961],{"type":23,"value":364960},"HubSpot customers who use the RollWorks integration ",{"type":17,"tag":133,"props":364962,"children":364965},{"href":364963,"rel":364964},"https://www.hubspot.com/app-partner-case-studies/rollworks",[214],[364966],{"type":23,"value":364967},"retain at 90%",{"type":17,"tag":84,"props":364969,"children":364970},{},[364971,364973],{"type":23,"value":364972},"Typeform customers with 5+ integrations have a ",{"type":17,"tag":133,"props":364974,"children":364977},{"href":364975,"rel":364976},"https://tray.io/blog/service-teams-need-integration-solutions",[214],[364978],{"type":23,"value":364979},"36% higher retention rate",{"type":17,"tag":29,"props":364981,"children":364982},{},[364983],{"type":23,"value":364984},"Today's HR tech users don't want to do manual data entry or use products incompatible with their tech stacks. HR tech companies can utilize integrations with complementary products as a core differentiator in the market, increasing their growth and revenue potential.",{"type":17,"tag":68,"props":364986,"children":364988},{"id":364987},"make-integration-development-easier",[364989],{"type":23,"value":364990},"Make integration development easier",{"type":17,"tag":29,"props":364992,"children":364993},{},[364994,364996,365005,365007,365011,365013,365018,365019,365024],{"type":23,"value":364995},"Traditional integration development is a long and complex process, often requiring months of development time that distract from your core product. To reap the benefits of customer-facing integrations and make your development process easier, ",{"type":17,"tag":133,"props":364997,"children":364999},{"href":212,"rel":364998},[214],[365000],{"type":17,"tag":48,"props":365001,"children":365002},{},[365003],{"type":23,"value":365004},"discover Unified.to — A Unified API developer platform for SaaS integrations",{"type":23,"value":365006},". Developers integrate once through a ",{"type":17,"tag":133,"props":365008,"children":365009},{"href":7691},[365010],{"type":23,"value":7806},{"type":23,"value":365012}," to deploy 190+ integrations in just hours. Interested in getting started with HR integrations? ",{"type":17,"tag":133,"props":365014,"children":365016},{"href":1612,"rel":365015},[214],[365017],{"type":23,"value":331043},{"type":23,"value":75890},{"type":17,"tag":133,"props":365020,"children":365022},{"href":215330,"rel":365021},[214],[365023],{"type":23,"value":277162},{"type":23,"value":54},{"type":17,"tag":29,"props":365026,"children":365027},{},[365028,365030,365035],{"type":23,"value":365029},"By: ",{"type":17,"tag":133,"props":365031,"children":365033},{"href":362866,"rel":365032},[214],[365034],{"type":23,"value":362873},{"type":23,"value":365036},", Head of Marketing at Unified",{"title":7,"searchDepth":1629,"depth":1629,"links":365038},[365039,365040,365041,365042,365043],{"id":364519,"depth":1629,"text":364522},{"id":364593,"depth":1629,"text":364596},{"id":364644,"depth":1629,"text":364647},{"id":364915,"depth":1629,"text":364918},{"id":364987,"depth":1629,"text":364990},"content:blog:the_hr_tech_transformation_leveraging_api_integrations_for_growth.md","blog/the_hr_tech_transformation_leveraging_api_integrations_for_growth.md","blog/the_hr_tech_transformation_leveraging_api_integrations_for_growth",{"_path":365048,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":365049,"description":365050,"img":365051,"date":365052,"tag":6341,"body":365053,"_type":1677,"_id":365368,"_source":1679,"_file":365369,"_stem":365370,"_extension":1682},"/blog/integration_set_up_guide_for_lever","Integration set-up guide for Lever","Easily add a Lever integration to your HR product. Access user data within Lever and other ATS systems through one API.","https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-icon.png","2023-09-27T00:00:00.000Z",{"type":14,"children":365054,"toc":365360},[365055,365060,365063,365071,365078,365083,365087,365092,365100,365106,365117,365122,365130,365136,365147,365152,365160,365165,365171,365176,365192,365199,365207,365213,365225,365233,365238,365243,365265,365271,365276,365281,365286,365304,365324,365328],{"type":17,"tag":18,"props":365056,"children":365058},{"id":365057},"integration-set-up-guide-for-lever",[365059],{"type":23,"value":365049},{"type":17,"tag":25,"props":365061,"children":365062},{},[],{"type":17,"tag":29,"props":365064,"children":365065},{},[365066],{"type":17,"tag":33,"props":365067,"children":365068},{},[365069],{"type":23,"value":365070},"September 27, 2023",{"type":17,"tag":29,"props":365072,"children":365073},{},[365074],{"type":17,"tag":48,"props":365075,"children":365076},{},[365077],{"type":23,"value":365050},{"type":17,"tag":29,"props":365079,"children":365080},{},[365081],{"type":23,"value":365082},"This article will take you through the steps to set up a Lever integration via Unified.to and connect your first Lever account.",{"type":17,"tag":68,"props":365084,"children":365085},{"id":182698},[365086],{"type":23,"value":182701},{"type":17,"tag":29,"props":365088,"children":365089},{},[365090],{"type":23,"value":365091},"If you haven't already signed up for a Unified.to account, do so now (it's free). You can log in through your preferred identity provider such as Google, Microsoft, or GitHub.",{"type":17,"tag":29,"props":365093,"children":365094},{},[365095],{"type":17,"tag":133,"props":365096,"children":365098},{"href":1612,"rel":365097},[214],[365099],{"type":23,"value":223727},{"type":17,"tag":68,"props":365101,"children":365103},{"id":365102},"_1-activate-lever",[365104],{"type":23,"value":365105},"1. Activate Lever",{"type":17,"tag":29,"props":365107,"children":365108},{},[365109,365111,365115],{"type":23,"value":365110},"Once you've registered your Unified.to account, log in and go to ",{"type":17,"tag":48,"props":365112,"children":365113},{},[365114],{"type":23,"value":341393},{"type":23,"value":365116}," to select Lever and any other pre-built integrations you'd like to activate.",{"type":17,"tag":29,"props":365118,"children":365119},{},[365120],{"type":23,"value":365121},"You can use the search bar, filter by app categories like \"HR\" and \"ATS\" or view all of our available integrations at once. The integrations you activate are the ones you intend to enable for user authorization.",{"type":17,"tag":29,"props":365123,"children":365124},{},[365125],{"type":17,"tag":6438,"props":365126,"children":365129},{"alt":365127,"src":365128},"Activate-Lever.png","https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-0.png",[],{"type":17,"tag":68,"props":365131,"children":365133},{"id":365132},"_2-use-your-oauth-2-credentials-optional",[365134],{"type":23,"value":365135},"2. Use your OAuth 2 Credentials (Optional)",{"type":17,"tag":29,"props":365137,"children":365138},{},[365139,365141,365145],{"type":23,"value":365140},"While most of our integrations can be activated in seconds, some integrations require ",{"type":17,"tag":133,"props":365142,"children":365143},{"href":779},[365144],{"type":23,"value":782},{"type":23,"value":365146}," 2 credentials.",{"type":17,"tag":29,"props":365148,"children":365149},{},[365150],{"type":23,"value":365151},"To display your product's name and branding during the third-party authorization process, you will need to insert your OAuth 2 credentials. Follow the setup instructions linked below the integration ('Get your own OAuth 2 credentials →') to create and retrieve your credentials.",{"type":17,"tag":29,"props":365153,"children":365154},{},[365155],{"type":17,"tag":6438,"props":365156,"children":365159},{"alt":365157,"src":365158},"Lever-Integration-Sandbox.png","https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-1.png",[],{"type":17,"tag":29,"props":365161,"children":365162},{},[365163],{"type":23,"value":365164},"Insert your credentials (usually a Client ID and Secret) to activate the integration. If you'd like to test this integration with your Lever Sandbox account, select 'Sandbox' and provide your Lever Sandbox credentials.",{"type":17,"tag":68,"props":365166,"children":365168},{"id":365167},"_3-copy-your-workspace-id",[365169],{"type":23,"value":365170},"3. Copy your Workspace ID",{"type":17,"tag":29,"props":365172,"children":365173},{},[365174],{"type":23,"value":365175},"Your workspace represents your organization. You can have multiple workspaces, for instance, if you require team members to work in different workspaces. You will need your workspace ID to add Lever and any other integrations to your app.",{"type":17,"tag":29,"props":365177,"children":365178},{},[365179,365180,365184,365186,365190],{"type":23,"value":6661},{"type":17,"tag":48,"props":365181,"children":365182},{},[365183],{"type":23,"value":347183},{"type":23,"value":365185}," found under ",{"type":17,"tag":48,"props":365187,"children":365188},{},[365189],{"type":23,"value":158746},{"type":23,"value":365191}," to copy your workspace ID",{"type":17,"tag":29,"props":365193,"children":365194},{},[365195],{"type":17,"tag":6438,"props":365196,"children":365198},{"alt":318119,"src":365197},"https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-2.png",[],{"type":17,"tag":29,"props":365200,"children":365201},{},[365202],{"type":17,"tag":33,"props":365203,"children":365204},{},[365205],{"type":23,"value":365206},"Note: you can create multiple environments in each workspace with distinct access and configuration rules for testing, staging, production, and more.",{"type":17,"tag":68,"props":365208,"children":365210},{"id":365209},"_4-add-your-lever-integration-to-your-app",[365211],{"type":23,"value":365212},"4. Add your Lever integration to your app",{"type":17,"tag":29,"props":365214,"children":365215},{},[365216,365218,365223],{"type":23,"value":365217},"Once you've activated Lever and any other integrations, you'll be able to add them to your app. Go to ",{"type":17,"tag":48,"props":365219,"children":365220},{},[365221],{"type":23,"value":365222},"Settings > Embedded Directory",{"type":23,"value":365224}," to copy one line of code to insert the embedded directory widget into your product. You can try out the user experience by interacting with the directory preview.",{"type":17,"tag":29,"props":365226,"children":365227},{},[365228],{"type":17,"tag":6438,"props":365229,"children":365232},{"alt":365230,"src":365231},"Directory-Preview.png","https://s3.us-east-2.amazonaws.com/unified-article-images/integration_set_up_guide_for_lever-3.png",[],{"type":17,"tag":29,"props":365234,"children":365235},{},[365236],{"type":23,"value":365237},"Alternatively, you can use our VueJS, React, or Angular components. Place the code into your app along with your workspace ID.",{"type":17,"tag":29,"props":365239,"children":365240},{},[365241],{"type":23,"value":365242},"If you want an alternative to using our UI component, you can do either of the following:",{"type":17,"tag":80,"props":365244,"children":365245},{},[365246,365260],{"type":17,"tag":84,"props":365247,"children":365248},{},[365249,365251,365258],{"type":23,"value":365250},"Call our API to get a",{"type":17,"tag":133,"props":365252,"children":365255},{"href":365253,"rel":365254},"https://unified.to/apidocs#get/unified/integration/workspace/%7Bworkspace_id%7D",[214],[365256],{"type":23,"value":365257}," list of active integrations",{"type":23,"value":365259}," to display in your app",{"type":17,"tag":84,"props":365261,"children":365262},{},[365263],{"type":23,"value":365264},"If you have your user's API",{"type":17,"tag":68,"props":365266,"children":365268},{"id":365267},"_5-perform-actions-with-your-user-connections",[365269],{"type":23,"value":365270},"5. Perform Actions with your User Connections",{"type":17,"tag":29,"props":365272,"children":365273},{},[365274],{"type":23,"value":365275},"Now you can start adding code to your app to access your user data and perform actions with their connections. If you're using NodeJS, we also have an SDK library available.",{"type":17,"tag":29,"props":365277,"children":365278},{},[365279],{"type":23,"value":365280},"Alternatively, you can use our Mock API to see our data model in action. In your Sandbox environment, add env=Sandbox query parameter to your API calls to get mock data.",{"type":17,"tag":29,"props":365282,"children":365283},{},[365284],{"type":23,"value":365285},"User connections represent a specific authentication of an integration, which means you can now:",{"type":17,"tag":80,"props":365287,"children":365288},{},[365289,365294,365299],{"type":17,"tag":84,"props":365290,"children":365291},{},[365292],{"type":23,"value":365293},"Access your customers' third-party data in Lever",{"type":17,"tag":84,"props":365295,"children":365296},{},[365297],{"type":23,"value":365298},"Leverage user connections to automate workflows and personalize interactions",{"type":17,"tag":84,"props":365300,"children":365301},{},[365302],{"type":23,"value":365303},"Extend your app's functionality with new features and expanded capabilities",{"type":17,"tag":29,"props":365305,"children":365306},{},[365307,365309,365315,365317,365323],{"type":23,"value":365308},"Need support? Email us at ",{"type":17,"tag":133,"props":365310,"children":365312},{"href":365311},"mailto:hello@unifited.to",[365313],{"type":23,"value":365314},"hello@unifited.to",{"type":23,"value":365316}," or chat with our team on ",{"type":17,"tag":133,"props":365318,"children":365321},{"href":365319,"rel":365320},"https://discord.gg/uAYnMPFk9t",[214],[365322],{"type":23,"value":15720},{"type":23,"value":54},{"type":17,"tag":29,"props":365325,"children":365326},{},[365327],{"type":23,"value":353722},{"type":17,"tag":80,"props":365329,"children":365330},{},[365331,365341,365350],{"type":17,"tag":84,"props":365332,"children":365333},{},[365334],{"type":17,"tag":133,"props":365335,"children":365338},{"href":365336,"rel":365337},"https://unified.to/help/set_environments_for_your_unified_workspace",[214],[365339],{"type":23,"value":365340},"Set up multiple environments",{"type":17,"tag":84,"props":365342,"children":365343},{},[365344],{"type":17,"tag":133,"props":365345,"children":365348},{"href":365346,"rel":365347},"https://unified.to/apidocs#auth",[214],[365349],{"type":23,"value":97048},{"type":17,"tag":84,"props":365351,"children":365352},{},[365353],{"type":17,"tag":133,"props":365354,"children":365357},{"href":365355,"rel":365356},"https://unified.to/apidocs#embed",[214],[365358],{"type":23,"value":365359},"Embedded Directory",{"title":7,"searchDepth":1629,"depth":1629,"links":365361},[365362,365363,365364,365365,365366,365367],{"id":182698,"depth":1629,"text":182701},{"id":365102,"depth":1629,"text":365105},{"id":365132,"depth":1629,"text":365135},{"id":365167,"depth":1629,"text":365170},{"id":365209,"depth":1629,"text":365212},{"id":365267,"depth":1629,"text":365270},"content:blog:integration_set_up_guide_for_lever.md","blog/integration_set_up_guide_for_lever.md","blog/integration_set_up_guide_for_lever",{"_path":365372,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":365373,"description":365374,"img":365375,"date":365052,"tag":12,"body":365376,"_type":1677,"_id":365882,"_source":1679,"_file":365883,"_stem":365884,"_extension":1682},"/blog/unified_sep_2023_product_updates","Unified.to Sep 2023 product updates","Another month, another roundup of the latest Unified.to product features and updates to explore. Here is everything we've been working on this month like...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_sep_2023_product_updates-icon.png",{"type":14,"children":365377,"toc":365869},[365378,365383,365386,365393,365401,365413,365419,365427,365432,365441,365447,365458,365467,365473,365484,365490,365495,365501,365509,365525,365531,365536,365545,365551,365556,365572,365576,365584,365589,365712,365718,365729,365737,365743,365751,365759,365764,365774,365779,365791,365805,365813,365825,365836,365840,365865],{"type":17,"tag":18,"props":365379,"children":365381},{"id":365380},"unifiedto-sep-2023-product-updates",[365382],{"type":23,"value":365373},{"type":17,"tag":25,"props":365384,"children":365385},{},[],{"type":17,"tag":29,"props":365387,"children":365388},{},[365389],{"type":17,"tag":33,"props":365390,"children":365391},{},[365392],{"type":23,"value":365070},{"type":17,"tag":29,"props":365394,"children":365395},{},[365396],{"type":17,"tag":6438,"props":365397,"children":365400},{"alt":365398,"src":365399},"Product_roundup.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_sep_2023_product_updates-0.png",[],{"type":17,"tag":29,"props":365402,"children":365403},{},[365404,365406,365411],{"type":23,"value":365405},"Another month, another roundup of the latest ",{"type":17,"tag":133,"props":365407,"children":365409},{"href":42620,"rel":365408},[214],[365410],{"type":23,"value":217},{"type":23,"value":365412}," product features and updates to explore. Here is everything we've been working on this month like improvements to automated integration testing and new integrations.",{"type":17,"tag":68,"props":365414,"children":365416},{"id":365415},"introducing-new-sdks",[365417],{"type":23,"value":365418},"Introducing new SDKs",{"type":17,"tag":29,"props":365420,"children":365421},{},[365422],{"type":17,"tag":6438,"props":365423,"children":365426},{"alt":365424,"src":365425},"Unified.to_SDKs.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_sep_2023_product_updates-1.png",[],{"type":17,"tag":29,"props":365428,"children":365429},{},[365430],{"type":23,"value":365431},"Unified.to just became even more flexible. We now have five SDKs (software development kits) for seamless access to our API. Choose from Typescript, Go, PHP, Java, and Python. The best part? Our SDKs update automatically whenever we expand our Unified APIs. You'll always benefit from the latest features and enhancements, without the burden of manual updates.",{"type":17,"tag":29,"props":365433,"children":365434},{},[365435],{"type":17,"tag":133,"props":365436,"children":365438},{"href":357728,"rel":365437},[214],[365439],{"type":23,"value":365440},"SDK overview",{"type":17,"tag":68,"props":365442,"children":365444},{"id":365443},"enhancements-to-automated-integration-testing",[365445],{"type":23,"value":365446},"Enhancements to automated integration testing",{"type":17,"tag":29,"props":365448,"children":365449},{},[365450,365452,365456],{"type":23,"value":365451},"We're all about observability and improving how we test integrations is part of that. In addition to real-time monitoring, we're now tracking new undocumented data fields. This means you'll benefit from a more accurate view of integration data than what you'd typically find in third-party ",{"type":17,"tag":133,"props":365453,"children":365454},{"href":129820},[365455],{"type":23,"value":129823},{"type":23,"value":365457},". Plus, we only observe data shapes, so your customers' data remains secure.",{"type":17,"tag":29,"props":365459,"children":365460},{},[365461],{"type":17,"tag":133,"props":365462,"children":365464},{"href":47029,"rel":365463},[214],[365465],{"type":23,"value":365466},"Changelog updates",{"type":17,"tag":68,"props":365468,"children":365470},{"id":365469},"enhancements-to-error-codes",[365471],{"type":23,"value":365472},"Enhancements to error codes",{"type":17,"tag":29,"props":365474,"children":365475},{},[365476,365478,365483],{"type":23,"value":365477},"We've added more detail to our error codes and will include the additional details automatically in your API logs. We're currently rolling this out to every integration on our platform. If you come across an error response with limited detail, please let us know on ",{"type":17,"tag":133,"props":365479,"children":365481},{"href":365319,"rel":365480},[214],[365482],{"type":23,"value":15720},{"type":23,"value":54},{"type":17,"tag":68,"props":365485,"children":365487},{"id":365486},"multi-url-support-for-integrations",[365488],{"type":23,"value":365489},"Multi-URL support for integrations",{"type":17,"tag":29,"props":365491,"children":365492},{},[365493],{"type":23,"value":365494},"We now have multi-URL support for our integrations, which means we can accommodate integrations that have distinct API and Authorization/Authentication URLs. You now have the flexibility to select your preferred URL set, such as 'Production' or 'Sandbox'. In addition to environments, we've also extended this feature to integrations that might offer different URL sets for specific data regions (EU or US).",{"type":17,"tag":68,"props":365496,"children":365498},{"id":365497},"new-ats-field-public_job_url",[365499],{"type":23,"value":365500},"New ATS field: public_job_url",{"type":17,"tag":29,"props":365502,"children":365503},{},[365504],{"type":17,"tag":6438,"props":365505,"children":365508},{"alt":365506,"src":365507},"Unified_API_ATS_field.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_sep_2023_product_updates-2.png",[],{"type":17,"tag":29,"props":365510,"children":365511},{},[365512,365514,365518,365520],{"type":23,"value":365513},"We've added the pubic_job_url field to select integrations in our Unified ",{"type":17,"tag":133,"props":365515,"children":365516},{"href":55696},[365517],{"type":23,"value":55699},{"type":23,"value":365519},", which allows you to obtain a public link to a job posting when retrieving Job objects. This new field is currently supported by Ashby, Lever, TeamTailor, Workable, and Greenhouse.\n",{"type":17,"tag":133,"props":365521,"children":365523},{"href":56812,"rel":365522},[214],[365524],{"type":23,"value":56819},{"type":17,"tag":68,"props":365526,"children":365528},{"id":365527},"greenhouse-integration-multiple-new-fields",[365529],{"type":23,"value":365530},"Greenhouse integration: multiple new fields",{"type":17,"tag":29,"props":365532,"children":365533},{},[365534],{"type":23,"value":365535},"We've expanded our Greenhouse integration with the following fields: job.description, job.location, job.update_at, and job.public_job_urls.",{"type":17,"tag":29,"props":365537,"children":365538},{},[365539],{"type":17,"tag":133,"props":365540,"children":365542},{"href":337814,"rel":365541},[214],[365543],{"type":23,"value":365544},"Greenhouse integration",{"type":17,"tag":68,"props":365546,"children":365548},{"id":365547},"lever-integration-new-employee-object",[365549],{"type":23,"value":365550},"Lever integration: new employee object",{"type":17,"tag":29,"props":365552,"children":365553},{},[365554],{"type":23,"value":365555},"We've expanded our Lever integration to support read/write for the employee object. Speaking of Lever, we've partnered this month to simplify how HR tech developers add Lever integrations to their products.",{"type":17,"tag":29,"props":365557,"children":365558},{},[365559,365566],{"type":17,"tag":133,"props":365560,"children":365563},{"href":365561,"rel":365562},"https://leverpartner.com/listings/unified-to",[214],[365564],{"type":23,"value":365565},"Lever partnership",{"type":17,"tag":133,"props":365567,"children":365569},{"href":337821,"rel":365568},[214],[365570],{"type":23,"value":365571},"Lever integration",{"type":17,"tag":68,"props":365573,"children":365574},{"id":11629},[365575],{"type":23,"value":11632},{"type":17,"tag":29,"props":365577,"children":365578},{},[365579],{"type":17,"tag":6438,"props":365580,"children":365583},{"alt":365581,"src":365582},"New_Integrations_%283%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_sep_2023_product_updates-3.png",[],{"type":17,"tag":29,"props":365585,"children":365586},{},[365587],{"type":23,"value":365588},"Here are the integrations along we've added to our platform this month:",{"type":17,"tag":80,"props":365590,"children":365591},{},[365592,365603,365613,365625,365636,365645,365656,365665,365675,365685,365694,365703],{"type":17,"tag":84,"props":365593,"children":365594},{},[365595,365601],{"type":17,"tag":133,"props":365596,"children":365599},{"href":365597,"rel":365598},"https://unified.to/integrations/tribepad",[214],[365600],{"type":23,"value":56634},{"type":23,"value":365602}," (ATS, Passthrough)",{"type":17,"tag":84,"props":365604,"children":365605},{},[365606,365612],{"type":17,"tag":133,"props":365607,"children":365610},{"href":365608,"rel":365609},"https://unified.to/integrations/contactout",[214],[365611],{"type":23,"value":50371},{"type":23,"value":362969},{"type":17,"tag":84,"props":365614,"children":365615},{},[365616,365623],{"type":17,"tag":133,"props":365617,"children":365620},{"href":365618,"rel":365619},"https://unified.to/integrations/constantcontact",[214],[365621],{"type":23,"value":365622},"ConstantContact",{"type":23,"value":365624}," (Authentication, Passthrough)",{"type":17,"tag":84,"props":365626,"children":365627},{},[365628,365635],{"type":17,"tag":133,"props":365629,"children":365632},{"href":365630,"rel":365631},"https://unified.to/integrations/wepay",[214],[365633],{"type":23,"value":365634},"WePay",{"type":23,"value":365624},{"type":17,"tag":84,"props":365637,"children":365638},{},[365639,365644],{"type":17,"tag":133,"props":365640,"children":365642},{"href":357103,"rel":365641},[214],[365643],{"type":23,"value":28931},{"type":23,"value":365624},{"type":17,"tag":84,"props":365646,"children":365647},{},[365648,365654],{"type":17,"tag":133,"props":365649,"children":365652},{"href":365650,"rel":365651},"https://unified.to/integrations/docusign",[214],[365653],{"type":23,"value":94662},{"type":23,"value":365655}," (Authentication)",{"type":17,"tag":84,"props":365657,"children":365658},{},[365659,365664],{"type":17,"tag":133,"props":365660,"children":365662},{"href":354522,"rel":365661},[214],[365663],{"type":23,"value":28915},{"type":23,"value":365624},{"type":17,"tag":84,"props":365666,"children":365667},{},[365668,365674],{"type":17,"tag":133,"props":365669,"children":365672},{"href":365670,"rel":365671},"https://unified.to/integrations/okta",[214],[365673],{"type":23,"value":754},{"type":23,"value":362988},{"type":17,"tag":84,"props":365676,"children":365677},{},[365678,365684],{"type":17,"tag":133,"props":365679,"children":365682},{"href":365680,"rel":365681},"https://unified.to/integrations/asana",[214],[365683],{"type":23,"value":12551},{"type":23,"value":365624},{"type":17,"tag":84,"props":365686,"children":365687},{},[365688,365693],{"type":17,"tag":133,"props":365689,"children":365691},{"href":325288,"rel":365690},[214],[365692],{"type":23,"value":322009},{"type":23,"value":365624},{"type":17,"tag":84,"props":365695,"children":365696},{},[365697,365702],{"type":17,"tag":133,"props":365698,"children":365700},{"href":353465,"rel":365699},[214],[365701],{"type":23,"value":6678},{"type":23,"value":365624},{"type":17,"tag":84,"props":365704,"children":365705},{},[365706,365711],{"type":17,"tag":133,"props":365707,"children":365709},{"href":342832,"rel":365708},[214],[365710],{"type":23,"value":342836},{"type":23,"value":365624},{"type":17,"tag":68,"props":365713,"children":365715},{"id":365714},"new-documentation-site",[365716],{"type":23,"value":365717},"New documentation site",{"type":17,"tag":29,"props":365719,"children":365720},{},[365721,365723,365728],{"type":23,"value":365722},"To have built an integration is to have encountered confusing, outdated, or downright terrible third-party API documentation. One of our goals is to provide developers with clear and comprehensive documentation. With that said, we recently improved our API documentation design and content. Take a look, and if something is missing, let us know on ",{"type":17,"tag":133,"props":365724,"children":365726},{"href":365319,"rel":365725},[214],[365727],{"type":23,"value":15720},{"type":23,"value":54},{"type":17,"tag":29,"props":365730,"children":365731},{},[365732],{"type":17,"tag":133,"props":365733,"children":365735},{"href":43547,"rel":365734},[214],[365736],{"type":23,"value":129823},{"type":17,"tag":68,"props":365738,"children":365740},{"id":365739},"community-highlights",[365741],{"type":23,"value":365742},"Community highlights",{"type":17,"tag":29,"props":365744,"children":365745},{},[365746],{"type":17,"tag":6438,"props":365747,"children":365750},{"alt":365748,"src":365749},"New_Integrations_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_sep_2023_product_updates-4.png",[],{"type":17,"tag":29,"props":365752,"children":365753},{},[365754],{"type":17,"tag":48,"props":365755,"children":365756},{},[365757],{"type":23,"value":365758},"Elevate: Transformations in HR Tech",{"type":17,"tag":29,"props":365760,"children":365761},{},[365762],{"type":23,"value":365763},"\"HR tech is experiencing an innovation wave that has created an interdependent ecosystem.\"",{"type":17,"tag":29,"props":365765,"children":365766},{},[365767,365769],{"type":23,"value":365768},"— Roy Pereira, CEO at ",{"type":17,"tag":133,"props":365770,"children":365772},{"href":42620,"rel":365771},[214],[365773],{"type":23,"value":217},{"type":17,"tag":29,"props":365775,"children":365776},{},[365777],{"type":23,"value":365778},"We joined the Elevate Festival this week in Toronto to talk about transformations happening in HR tech and how HR software companies can leverage integrations to grow revenue, improve user experiences, and expand product value.",{"type":17,"tag":29,"props":365780,"children":365781},{},[365782,365784,365790],{"type":23,"value":365783},"If you're an HR technology leader and want to learn more about how to leverage integrations, ",{"type":17,"tag":133,"props":365785,"children":365787},{"href":215330,"rel":365786},[214],[365788],{"type":23,"value":365789},"contact us",{"type":23,"value":54},{"type":17,"tag":29,"props":365792,"children":365793},{},[365794,365799,365800],{"type":17,"tag":48,"props":365795,"children":365796},{},[365797],{"type":23,"value":365798},"Customer:",{"type":23,"value":18757},{"type":17,"tag":48,"props":365801,"children":365802},{},[365803],{"type":23,"value":365804},"HeroHunt launches ATS integrations",{"type":17,"tag":29,"props":365806,"children":365807},{},[365808],{"type":17,"tag":6438,"props":365809,"children":365812},{"alt":365810,"src":365811},"CleanShot_2023-09-28_at_14.06.13.gif","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_sep_2023_product_updates-5.gif",[],{"type":17,"tag":29,"props":365814,"children":365815},{},[365816,365818,365823],{"type":23,"value":365817},"We're helping companies like ",{"type":17,"tag":133,"props":365819,"children":365821},{"href":360890,"rel":365820},[214],[365822],{"type":23,"value":364271},{"type":23,"value":365824},", AI talent search platform, expand their integrations to access critical third-party data and support more  customers.",{"type":17,"tag":29,"props":365826,"children":365827},{},[365828,365830,365834],{"type":23,"value":365829},"Thanks to our ",{"type":17,"tag":133,"props":365831,"children":365832},{"href":7691},[365833],{"type":23,"value":7806},{"type":23,"value":365835},", they were able to recently add more than 20+ ATS integrations with platforms like Lever, Greenhouse, and Workday to their product.",{"type":17,"tag":68,"props":365837,"children":365838},{"id":363394},[365839],{"type":23,"value":363397},{"type":17,"tag":29,"props":365841,"children":365842},{},[365843,365845,365850,365852,365857,365858,365864],{"type":23,"value":365844},"You're reading this article on the ",{"type":17,"tag":133,"props":365846,"children":365848},{"href":42620,"rel":365847},[214],[365849],{"type":23,"value":217},{"type":23,"value":365851}," blog. We're a Unified API platform for B2B customer-facing integrations. We're excited to continue to innovate at Unified and solve hard, critical integration-related problems for our customers. If you're curious about our integrations-as-a-service solution, consider ",{"type":17,"tag":133,"props":365853,"children":365855},{"href":1612,"rel":365854},[214],[365856],{"type":23,"value":363421},{"type":23,"value":75890},{"type":17,"tag":133,"props":365859,"children":365862},{"href":365860,"rel":365861},"https://calendly.com/d/4qz-b2b-bcw/unified-discovery-call?month=2023-09",[214],[365863],{"type":23,"value":363432},{"type":23,"value":54},{"type":17,"tag":29,"props":365866,"children":365867},{},[365868],{"type":23,"value":363441},{"title":7,"searchDepth":1629,"depth":1629,"links":365870},[365871,365872,365873,365874,365875,365876,365877,365878,365879,365880,365881],{"id":365415,"depth":1629,"text":365418},{"id":365443,"depth":1629,"text":365446},{"id":365469,"depth":1629,"text":365472},{"id":365486,"depth":1629,"text":365489},{"id":365497,"depth":1629,"text":365500},{"id":365527,"depth":1629,"text":365530},{"id":365547,"depth":1629,"text":365550},{"id":11629,"depth":1629,"text":11632},{"id":365714,"depth":1629,"text":365717},{"id":365739,"depth":1629,"text":365742},{"id":363394,"depth":1629,"text":363397},"content:blog:unified_sep_2023_product_updates.md","blog/unified_sep_2023_product_updates.md","blog/unified_sep_2023_product_updates",{"_path":365886,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":365887,"description":365888,"img":365889,"date":365890,"tag":12,"body":365891,"_type":1677,"_id":366686,"_source":1679,"_file":366687,"_stem":366688,"_extension":1682},"/blog/unified_august_2023_product_updates","Unified.to August 2023 Product Updates","From a new Unified Authentication API to an embeddable sign-in component and pre-built integration additions like Klaviyo, here's everything the Unified.to...","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_august_2023_product_updates-icon.png","2023-08-31T00:00:00.000Z",{"type":14,"children":365892,"toc":366678},[365893,365898,365901,365909,365927,365935,365940,365945,365950,365955,365960,365965,365970,365976,365984,365995,366000,366011,366016,366034,366039,366048,366060,366065,366073,366078,366101,366106,366120,366126,366131,366149,366162,366167,366180,366196,366209,366213,366221,366235,366247,366251,366259,366276,366289,366293,366301,366318,366336,366340,366358,366374,366387,366391,366404,366420,366428,366432,366440,366449,366455,366463,366468,366473,366515,366523,366531,366545,366550,366585,366594,366602,366610,366615,366619,366627,366632,366637,366647,366653],{"type":17,"tag":18,"props":365894,"children":365896},{"id":365895},"unifiedto-august-2023-product-updates",[365897],{"type":23,"value":365887},{"type":17,"tag":25,"props":365899,"children":365900},{},[],{"type":17,"tag":29,"props":365902,"children":365903},{},[365904],{"type":17,"tag":33,"props":365905,"children":365906},{},[365907],{"type":23,"value":365908},"August 31, 2023",{"type":17,"tag":29,"props":365910,"children":365911},{},[365912,365914,365918,365920,365925],{"type":23,"value":365913},"From a new Unified ",{"type":17,"tag":133,"props":365915,"children":365916},{"href":327914},[365917],{"type":23,"value":327917},{"type":23,"value":365919}," to an embeddable sign-in component and pre-built integration additions like Klaviyo, here's everything the ",{"type":17,"tag":133,"props":365921,"children":365923},{"href":212,"rel":365922},[214],[365924],{"type":23,"value":217},{"type":23,"value":365926}," team released this month.",{"type":17,"tag":29,"props":365928,"children":365929},{},[365930],{"type":17,"tag":6438,"props":365931,"children":365934},{"alt":365932,"src":365933},"New: Authentication integrations","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_august_2023_product_updates-0.png",[],{"type":17,"tag":29,"props":365936,"children":365937},{},[365938],{"type":23,"value":365939},"At Unified.to, we've long believed integrations catalyze growth. When software companies connect their products to other ecosystem products, they expand their market opportunities, increase their partnerships, and retain more customers.",{"type":17,"tag":29,"props":365941,"children":365942},{},[365943],{"type":23,"value":365944},"Payroll products are more valuable when they seamlessly sync with your HRIS data.",{"type":17,"tag":29,"props":365946,"children":365947},{},[365948],{"type":23,"value":365949},"CRM systems become dependable sources of truth when enriched with up-to-date contact information.",{"type":17,"tag":29,"props":365951,"children":365952},{},[365953],{"type":23,"value":365954},"Customers stick with products that have integrations more than ones that don't.",{"type":17,"tag":29,"props":365956,"children":365957},{},[365958],{"type":23,"value":365959},"That's why Unified.to is committed to removing the development barriers — from constantly changing APIs to compatibility issues and never-ending maintenance — that prevent software companies from leveraging integrations for growth.",{"type":17,"tag":29,"props":365961,"children":365962},{},[365963],{"type":23,"value":365964},"Over the last few months, we've rapidly expanded our pre-built integration suite to more than 100 systems, so you only have to integrate once to add multiple B2B SaaS integrations to your product. But we know that's only scratching the surface.",{"type":17,"tag":29,"props":365966,"children":365967},{},[365968],{"type":23,"value":365969},"That's why this month, we're excited to share how we've increased the depth of our existing integrations to support more of our customers' use cases, introduced authorization integrations and a user sign-in component, and continued to expand our pre-built integrations.",{"type":17,"tag":68,"props":365971,"children":365973},{"id":365972},"introducing-our-unified-authentication-api",[365974],{"type":23,"value":365975},"Introducing our Unified Authentication API",{"type":17,"tag":29,"props":365977,"children":365978},{},[365979],{"type":17,"tag":6438,"props":365980,"children":365983},{"alt":365981,"src":365982},"Unified.to_Passthrough_Integrations.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_august_2023_product_updates-1.png",[],{"type":17,"tag":29,"props":365985,"children":365986},{},[365987,365989,365993],{"type":23,"value":365988},"With our new Unified Authentication API, you can now leverage our ",{"type":17,"tag":133,"props":365990,"children":365991},{"href":7691},[365992],{"type":23,"value":7806},{"type":23,"value":365994}," to sign-in or sign-up your customers into your products.",{"type":17,"tag":29,"props":365996,"children":365997},{},[365998],{"type":23,"value":365999},"That means Unified.to can now be used to add both customer-facing integrations and authentication into your product, without having to use a separate authentication provider. We've made it effortless for developers to create frictionless authentication experiences.",{"type":17,"tag":29,"props":366001,"children":366002},{},[366003,366005,366009],{"type":23,"value":366004},"For example, if you activate an ",{"type":17,"tag":133,"props":366006,"children":366007},{"href":779},[366008],{"type":23,"value":782},{"type":23,"value":366010}," 2 integration such as Gusto, you can allow your users to sign in or sign up using their Gusto credentials for seamless user onboarding.",{"type":17,"tag":29,"props":366012,"children":366013},{},[366014],{"type":23,"value":366015},"Our Unified Authentication API includes:",{"type":17,"tag":80,"props":366017,"children":366018},{},[366019,366024,366029],{"type":17,"tag":84,"props":366020,"children":366021},{},[366022],{"type":23,"value":366023},"Over 50 identity providers, encompassing the majority of our supported OAuth 2 integrations",{"type":17,"tag":84,"props":366025,"children":366026},{},[366027],{"type":23,"value":366028},"Complete coverage of major identity providers, such as Google, Microsoft, Facebook, and LinkedIn",{"type":17,"tag":84,"props":366030,"children":366031},{},[366032],{"type":23,"value":366033},"A secure user sign-in or sign-up process that prioritizes user data protection",{"type":17,"tag":29,"props":366035,"children":366036},{},[366037],{"type":23,"value":366038},"Authentication integrations are now available on all plans. Each instance of user authentication results in one API call being registered in your plan's monthly usage.",{"type":17,"tag":29,"props":366040,"children":366041},{},[366042],{"type":17,"tag":133,"props":366043,"children":366045},{"href":346487,"rel":366044},[214],[366046],{"type":23,"value":366047},"Explore Authentication integrations",{"type":17,"tag":68,"props":366049,"children":366051},{"id":366050},"introducing-our-embedded-component",[366052,366054],{"type":23,"value":366053},"Introducing our embedded ",{"type":17,"tag":366055,"props":366056,"children":366057},"sign-in",{},[366058],{"type":23,"value":366059}," component",{"type":17,"tag":29,"props":366061,"children":366062},{},[366063],{"type":23,"value":366064},"In addition to our Unified Authentication API, we're taking one less thing off your plate by expanding our one-line-of-code embeddable widgets. You can now use our embedded sign-in component to provide your customers with flexible authentication options.",{"type":17,"tag":29,"props":366066,"children":366067},{},[366068],{"type":17,"tag":6438,"props":366069,"children":366072},{"alt":366070,"src":366071},"Unified.to_Authentication_Widget_Preview.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_august_2023_product_updates-2.png",[],{"type":17,"tag":29,"props":366074,"children":366075},{},[366076],{"type":23,"value":366077},"With our embedded sign-in component, you can:",{"type":17,"tag":80,"props":366079,"children":366080},{},[366081,366086,366091,366096],{"type":17,"tag":84,"props":366082,"children":366083},{},[366084],{"type":23,"value":366085},"Paste one code snippet to add our embedded sign-in (or sign-up) component to your product — choose from JavaScript, VueJS, React, or Angular",{"type":17,"tag":84,"props":366087,"children":366088},{},[366089],{"type":23,"value":366090},"Enable user authentication into your product for any Authentication integration",{"type":17,"tag":84,"props":366092,"children":366093},{},[366094],{"type":23,"value":366095},"Easily customize buttons, logo, and text to create brand consistency without code",{"type":17,"tag":84,"props":366097,"children":366098},{},[366099],{"type":23,"value":366100},"Empower users to authenticate using their preferred third-party login credentials",{"type":17,"tag":29,"props":366102,"children":366103},{},[366104],{"type":23,"value":366105},"Our embedded sign-in component is now available on all plans.",{"type":17,"tag":29,"props":366107,"children":366108},{},[366109,366115,366116],{"type":17,"tag":133,"props":366110,"children":366112},{"href":1612,"rel":366111},[214],[366113],{"type":23,"value":366114},"Access this feature",{"type":23,"value":18757},{"type":17,"tag":133,"props":366117,"children":366119},{"href":1612,"rel":366118},[214],[],{"type":17,"tag":68,"props":366121,"children":366123},{"id":366122},"integrations-weve-expanded",[366124],{"type":23,"value":366125},"Integrations we've expanded",{"type":17,"tag":29,"props":366127,"children":366128},{},[366129],{"type":23,"value":366130},"We've added new objects and fields to several of our pre-built integrations.",{"type":17,"tag":29,"props":366132,"children":366133},{},[366134,366143,366144],{"type":17,"tag":133,"props":366135,"children":366137},{"href":353528,"rel":366136},[214],[366138],{"type":17,"tag":48,"props":366139,"children":366140},{},[366141],{"type":23,"value":366142},"Factorial",{"type":23,"value":18757},{"type":17,"tag":48,"props":366145,"children":366146},{},[366147],{"type":23,"value":366148},"— Unified ATS and HRIS APIs",{"type":17,"tag":80,"props":366150,"children":366151},{},[366152,366157],{"type":17,"tag":84,"props":366153,"children":366154},{},[366155],{"type":23,"value":366156},"Updated group object",{"type":17,"tag":84,"props":366158,"children":366159},{},[366160],{"type":23,"value":366161},"Added Read access for manager_ids and is_active",{"type":17,"tag":29,"props":366163,"children":366164},{},[366165],{"type":23,"value":366166},"Use case example (s):",{"type":17,"tag":80,"props":366168,"children":366169},{},[366170,366175],{"type":17,"tag":84,"props":366171,"children":366172},{},[366173],{"type":23,"value":366174},"Present a dashboard that display a list of direct reports along with relevant details including manager IDs",{"type":17,"tag":84,"props":366176,"children":366177},{},[366178],{"type":23,"value":366179},"Provide managers with an immediate view of whether an employee is currently active within a company",{"type":17,"tag":29,"props":366181,"children":366182},{},[366183,366191,366192],{"type":17,"tag":133,"props":366184,"children":366186},{"href":361275,"rel":366185},[214],[366187],{"type":17,"tag":48,"props":366188,"children":366189},{},[366190],{"type":23,"value":56574},{"type":23,"value":18757},{"type":17,"tag":48,"props":366193,"children":366194},{},[366195],{"type":23,"value":366148},{"type":17,"tag":80,"props":366197,"children":366198},{},[366199,366204],{"type":17,"tag":84,"props":366200,"children":366201},{},[366202],{"type":23,"value":366203},"Added job object",{"type":17,"tag":84,"props":366205,"children":366206},{},[366207],{"type":23,"value":366208},"Added Read access for language_locale",{"type":17,"tag":29,"props":366210,"children":366211},{},[366212],{"type":23,"value":366166},{"type":17,"tag":80,"props":366214,"children":366215},{},[366216],{"type":17,"tag":84,"props":366217,"children":366218},{},[366219],{"type":23,"value":366220},"Display employee and job information in different languages, enhancing the user experience for global teams and multilingual organizations",{"type":17,"tag":29,"props":366222,"children":366223},{},[366224,366230,366231],{"type":17,"tag":133,"props":366225,"children":366228},{"href":366226,"rel":366227},"https://www.google.com/search?q=recruiterflow&oq=recruiterflow&gs_lcrp=EgZjaHJvbWUqBggAEEUYOzIGCAAQRRg7MgcIARAAGIAEMgcIAhAAGIAEMgcIAxAAGIAEMgcIBBAAGIAEMgYIBRBFGDwyBggGEEUYPDIGCAcQRRg80gEIMTkyMmowajeoAgCwAgA&sourceid=chrome&ie=UTF-8",[214],[366229],{"type":23,"value":361412},{"type":23,"value":18757},{"type":17,"tag":48,"props":366232,"children":366233},{},[366234],{"type":23,"value":366148},{"type":17,"tag":80,"props":366236,"children":366237},{},[366238,366242],{"type":17,"tag":84,"props":366239,"children":366240},{},[366241],{"type":23,"value":366203},{"type":17,"tag":84,"props":366243,"children":366244},{},[366245],{"type":23,"value":366246},"Added Read access for remote",{"type":17,"tag":29,"props":366248,"children":366249},{},[366250],{"type":23,"value":366166},{"type":17,"tag":80,"props":366252,"children":366253},{},[366254],{"type":17,"tag":84,"props":366255,"children":366256},{},[366257],{"type":23,"value":366258},"Provide users with immediate insight if a particular job positions allows remote work",{"type":17,"tag":29,"props":366260,"children":366261},{},[366262,366271],{"type":17,"tag":133,"props":366263,"children":366265},{"href":337821,"rel":366264},[214],[366266,366270],{"type":17,"tag":48,"props":366267,"children":366268},{},[366269],{"type":23,"value":56545},{"type":23,"value":18757},{"type":17,"tag":48,"props":366272,"children":366273},{},[366274],{"type":23,"value":366275},"— Unified ATS API",{"type":17,"tag":80,"props":366277,"children":366278},{},[366279,366284],{"type":17,"tag":84,"props":366280,"children":366281},{},[366282],{"type":23,"value":366283},"Added contact object",{"type":17,"tag":84,"props":366285,"children":366286},{},[366287],{"type":23,"value":366288},"Added Read access for address",{"type":17,"tag":29,"props":366290,"children":366291},{},[366292],{"type":23,"value":366166},{"type":17,"tag":80,"props":366294,"children":366295},{},[366296],{"type":17,"tag":84,"props":366297,"children":366298},{},[366299],{"type":23,"value":366300},"Enable users to quickly access candidate contact information for streamlined communication and coordination",{"type":17,"tag":29,"props":366302,"children":366303},{},[366304,366312,366313],{"type":17,"tag":133,"props":366305,"children":366307},{"href":331264,"rel":366306},[214],[366308],{"type":17,"tag":48,"props":366309,"children":366310},{},[366311],{"type":23,"value":192282},{"type":23,"value":18757},{"type":17,"tag":48,"props":366314,"children":366315},{},[366316],{"type":23,"value":366317},"— Unified Marketing and CRM APIs",{"type":17,"tag":80,"props":366319,"children":366320},{},[366321,366326,366331],{"type":17,"tag":84,"props":366322,"children":366323},{},[366324],{"type":23,"value":366325},"Added deal object with Read access for amount, currency, stage, and pipeline and Write access for amount and currency",{"type":17,"tag":84,"props":366327,"children":366328},{},[366329],{"type":23,"value":366330},"Updated contact object with Read access for updated_at, company, and deal_ids",{"type":17,"tag":84,"props":366332,"children":366333},{},[366334],{"type":23,"value":366335},"Updated list object with Read access for updated_at",{"type":17,"tag":29,"props":366337,"children":366338},{},[366339],{"type":23,"value":366166},{"type":17,"tag":80,"props":366341,"children":366342},{},[366343,366348,366353],{"type":17,"tag":84,"props":366344,"children":366345},{},[366346],{"type":23,"value":366347},"Provide sales teams with accurate deal stage and pipeline data to tailor their sales tactics",{"type":17,"tag":84,"props":366349,"children":366350},{},[366351],{"type":23,"value":366352},"Help sales teams engage with the most relevant and receptive contacts",{"type":17,"tag":84,"props":366354,"children":366355},{},[366356],{"type":23,"value":366357},"Ensure deal value is clearly communicated for more effective and personalized sales strategies",{"type":17,"tag":29,"props":366359,"children":366360},{},[366361,366369,366370],{"type":17,"tag":133,"props":366362,"children":366364},{"href":361457,"rel":366363},[214],[366365],{"type":17,"tag":48,"props":366366,"children":366367},{},[366368],{"type":23,"value":361461},{"type":23,"value":18757},{"type":17,"tag":48,"props":366371,"children":366372},{},[366373],{"type":23,"value":366275},{"type":17,"tag":80,"props":366375,"children":366376},{},[366377,366382],{"type":17,"tag":84,"props":366378,"children":366379},{},[366380],{"type":23,"value":366381},"Added job and candidate objects",{"type":17,"tag":84,"props":366383,"children":366384},{},[366385],{"type":23,"value":366386},"Added Read and Write access for address",{"type":17,"tag":29,"props":366388,"children":366389},{},[366390],{"type":23,"value":366166},{"type":17,"tag":80,"props":366392,"children":366393},{},[366394,366399],{"type":17,"tag":84,"props":366395,"children":366396},{},[366397],{"type":23,"value":366398},"Users can analyze address data in conjunction with other candidate attributes to make more informed hiring decisions.",{"type":17,"tag":84,"props":366400,"children":366401},{},[366402],{"type":23,"value":366403},"Ensure users can maintain accurate records of candidate and job location data for compliance purposes",{"type":17,"tag":29,"props":366405,"children":366406},{},[366407,366415,366416],{"type":17,"tag":133,"props":366408,"children":366410},{"href":361340,"rel":366409},[214],[366411],{"type":17,"tag":48,"props":366412,"children":366413},{},[366414],{"type":23,"value":361344},{"type":23,"value":18757},{"type":17,"tag":48,"props":366417,"children":366418},{},[366419],{"type":23,"value":366148},{"type":17,"tag":80,"props":366421,"children":366422},{},[366423],{"type":17,"tag":84,"props":366424,"children":366425},{},[366426],{"type":23,"value":366427},"Added employee, job, application, and candidate objects",{"type":17,"tag":29,"props":366429,"children":366430},{},[366431],{"type":23,"value":366166},{"type":17,"tag":80,"props":366433,"children":366434},{},[366435],{"type":17,"tag":84,"props":366436,"children":366437},{},[366438],{"type":23,"value":366439},"Provide users with a more efficient and effective recruitment process with up-to-date employee and candidate data that optimizes recruitment, onboarding, and strategic workforce planning",{"type":17,"tag":29,"props":366441,"children":366442},{},[366443],{"type":17,"tag":133,"props":366444,"children":366446},{"href":1612,"rel":366445},[214],[366447],{"type":23,"value":366448},"Start adding integrations ",{"type":17,"tag":68,"props":366450,"children":366452},{"id":366451},"integrations-weve-added",[366453],{"type":23,"value":366454},"Integrations we've added",{"type":17,"tag":29,"props":366456,"children":366457},{},[366458],{"type":17,"tag":6438,"props":366459,"children":366462},{"alt":366460,"src":366461},"Unified.to_API_Integrations_%281%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_august_2023_product_updates-3.png",[],{"type":17,"tag":29,"props":366464,"children":366465},{},[366466],{"type":23,"value":366467},"In addition to integration depth, we've also added new systems to our pre-built integration suite. With our Unified APIs, you can launch 100+ integration in your product in a matter of hours.",{"type":17,"tag":29,"props":366469,"children":366470},{},[366471],{"type":23,"value":366472},"Recently added:",{"type":17,"tag":80,"props":366474,"children":366475},{},[366476,366486,366496,366506],{"type":17,"tag":84,"props":366477,"children":366478},{},[366479,366484],{"type":17,"tag":133,"props":366480,"children":366482},{"href":331254,"rel":366481},[214],[366483],{"type":23,"value":192288},{"type":23,"value":366485}," — Unified Marketing API",{"type":17,"tag":84,"props":366487,"children":366488},{},[366489,366494],{"type":17,"tag":133,"props":366490,"children":366492},{"href":354487,"rel":366491},[214],[366493],{"type":23,"value":354491},{"type":23,"value":366495}," — Unified ATS API",{"type":17,"tag":84,"props":366497,"children":366498},{},[366499,366504],{"type":17,"tag":133,"props":366500,"children":366502},{"href":355688,"rel":366501},[214],[366503],{"type":23,"value":310119},{"type":23,"value":366505}," — Unified ATS and HR APIs",{"type":17,"tag":84,"props":366507,"children":366508},{},[366509,366514],{"type":17,"tag":133,"props":366510,"children":366512},{"href":361291,"rel":366511},[214],[366513],{"type":23,"value":75326},{"type":23,"value":366505},{"type":17,"tag":29,"props":366516,"children":366517},{},[366518],{"type":17,"tag":133,"props":366519,"children":366521},{"href":87026,"rel":366520},[214],[366522],{"type":23,"value":337018},{"type":17,"tag":29,"props":366524,"children":366525},{},[366526],{"type":17,"tag":48,"props":366527,"children":366528},{},[366529],{"type":23,"value":366530},"Updates to our Passthrough API",{"type":17,"tag":29,"props":366532,"children":366533},{},[366534,366536,366543],{"type":23,"value":366535},"Thanks to enhancements to our core architecture, we now offer out-of-the-box Passthrough API support for more of our pre-built integrations. With our ",{"type":17,"tag":133,"props":366537,"children":366540},{"href":366538,"rel":366539},"https://unified.to/blog/passthrough_api_a_new_way_to_connect_with_your_vendors",[214],[366541],{"type":23,"value":366542},"Passthrough API",{"type":23,"value":366544},", developers can access additional APIs and data from an integration that Unified.to has limited support for while still benefiting from our Unified authorization and scopes.",{"type":17,"tag":29,"props":366546,"children":366547},{},[366548],{"type":23,"value":366549},"Some of the additions to our Passthrough API:",{"type":17,"tag":80,"props":366551,"children":366552},{},[366553,366557,366561,366565,366569,366573,366577,366581],{"type":17,"tag":84,"props":366554,"children":366555},{},[366556],{"type":23,"value":94638},{"type":17,"tag":84,"props":366558,"children":366559},{},[366560],{"type":23,"value":361564},{"type":17,"tag":84,"props":366562,"children":366563},{},[366564],{"type":23,"value":15720},{"type":17,"tag":84,"props":366566,"children":366567},{},[366568],{"type":23,"value":32717},{"type":17,"tag":84,"props":366570,"children":366571},{},[366572],{"type":23,"value":3189},{"type":17,"tag":84,"props":366574,"children":366575},{},[366576],{"type":23,"value":11357},{"type":17,"tag":84,"props":366578,"children":366579},{},[366580],{"type":23,"value":56564},{"type":17,"tag":84,"props":366582,"children":366583},{},[366584],{"type":23,"value":15738},{"type":17,"tag":29,"props":366586,"children":366587},{},[366588],{"type":17,"tag":133,"props":366589,"children":366591},{"href":87026,"rel":366590},[214],[366592],{"type":23,"value":366593},"See all Passthrough integrations",{"type":17,"tag":29,"props":366595,"children":366596},{},[366597],{"type":17,"tag":48,"props":366598,"children":366599},{},[366600],{"type":23,"value":366601},"Conversations we're having",{"type":17,"tag":29,"props":366603,"children":366604},{},[366605],{"type":17,"tag":48,"props":366606,"children":366607},{},[366608],{"type":23,"value":366609},"Founder Institute: Leveraging integrations for growth",{"type":17,"tag":29,"props":366611,"children":366612},{},[366613],{"type":23,"value":366614},"Did you know software companies can reduce their churn by 4x by simply adding integrations? We recently joined @ the founder institute to share how companies can leverage integrations to build stickier products and increase their revenue.",{"type":17,"tag":11616,"props":366616,"children":366618},{"width":11618,"height":11619,"src":366617,"title":11621,"frameBorder":11622,"allow":11623,"referrerPolicy":11624,"allowFullScreen":11625},"https://www.youtube.com/embed/cQCweNQ7SjI",[],{"type":17,"tag":29,"props":366620,"children":366621},{},[366622],{"type":17,"tag":48,"props":366623,"children":366624},{},[366625],{"type":23,"value":366626},"Ask a CTO: Building your technology investment strategy",{"type":17,"tag":29,"props":366628,"children":366629},{},[366630],{"type":23,"value":366631},"CTOs are responsible for making strategic software decisions that drive their product's functionality and maximize their company's revenue. We spoke to fractional CTO and startup advisor Ahmad Nassri about some of the key considerations and common pitfalls CTOs should look out for when making software investment decisions.",{"type":17,"tag":29,"props":366633,"children":366634},{},[366635],{"type":23,"value":366636},"'A common mistake technical leaders make is sinking too much time and money into their infrastructure. They hire inexperienced developers, which creates a hammer-and-nail situation where every problem needs to be solved with code.'",{"type":17,"tag":29,"props":366638,"children":366639},{},[366640],{"type":17,"tag":133,"props":366641,"children":366644},{"href":366642,"rel":366643},"https://unified.to/blog/ask_a_cto_building_your_technology_investment_strategy",[214],[366645],{"type":23,"value":366646},"View the article",{"type":17,"tag":68,"props":366648,"children":366650},{"id":366649},"unified-is-one-api-to-integrate-them-all",[366651],{"type":23,"value":366652},"Unified is one API to integrate them all",{"type":17,"tag":29,"props":366654,"children":366655},{},[366656,366658,366667,366669,366677],{"type":23,"value":366657},"You're reading this article on the Unified.to blog. We're a Unified API platform for B2B customer-facing integrations. We're excited to continue to innovate at Unified and solve hard, critical integration-related problems for our customers. If you're curious about our integrations-as-a-service solution, consider ",{"type":17,"tag":133,"props":366659,"children":366661},{"href":158861,"rel":366660},[214],[366662,366666],{"type":17,"tag":48,"props":366663,"children":366664},{},[366665],{"type":23,"value":363421},{"type":23,"value":244724},{"type":23,"value":366668},"or ",{"type":17,"tag":133,"props":366670,"children":366672},{"href":215330,"rel":366671},[214],[366673],{"type":17,"tag":48,"props":366674,"children":366675},{},[366676],{"type":23,"value":299181},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":366679},[366680,366681,366683,366684,366685],{"id":365972,"depth":1629,"text":365975},{"id":366050,"depth":1629,"text":366682},"Introducing our embedded  component",{"id":366122,"depth":1629,"text":366125},{"id":366451,"depth":1629,"text":366454},{"id":366649,"depth":1629,"text":366652},"content:blog:unified_august_2023_product_updates.md","blog/unified_august_2023_product_updates.md","blog/unified_august_2023_product_updates",{"_path":366690,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":366691,"description":366692,"img":366693,"date":365890,"tag":6341,"body":366694,"_type":1677,"_id":367017,"_source":1679,"_file":367018,"_stem":367019,"_extension":1682},"/blog/use_unified_to_sign_in_your_users_into_your_application","Use Unified to sign in your users into your application","Before your users can utilize your application and any of Unified.to's integrations, they need to sign in to your application.","https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-icon.png",{"type":14,"children":366695,"toc":367012},[366696,366701,366704,366711,366715,366726,366732,366737,366744,366749,366756,366761,366774,366781,366786,366791,366797,366802,366807,366836,366845,366850,366867,366877,366887,366897,366905,366912,366917,366923,366928,366935,366940,366960,366979,366984,366993,366998,367007],{"type":17,"tag":18,"props":366697,"children":366699},{"id":366698},"use-unified-to-sign-in-your-users-into-your-application",[366700],{"type":23,"value":366691},{"type":17,"tag":25,"props":366702,"children":366703},{},[],{"type":17,"tag":29,"props":366705,"children":366706},{},[366707],{"type":17,"tag":33,"props":366708,"children":366709},{},[366710],{"type":23,"value":365908},{"type":17,"tag":29,"props":366712,"children":366713},{},[366714],{"type":23,"value":366692},{"type":17,"tag":29,"props":366716,"children":366717},{},[366718,366720,366724],{"type":23,"value":366719},"Luckily, we've simplified user authentication through our Unified ",{"type":17,"tag":133,"props":366721,"children":366722},{"href":327914},[366723],{"type":23,"value":327917},{"type":23,"value":366725},". Just follow these steps.",{"type":17,"tag":68,"props":366727,"children":366729},{"id":366728},"_1-activate-authentication-integrations",[366730],{"type":23,"value":366731},"1. Activate Authentication integrations",{"type":17,"tag":29,"props":366733,"children":366734},{},[366735],{"type":23,"value":366736},"1.1 Click on the 'Integrations' menu, and then on the 'Authentication Integrations' option.",{"type":17,"tag":29,"props":366738,"children":366739},{},[366740],{"type":17,"tag":6438,"props":366741,"children":366743},{"alt":318119,"src":366742},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-0.png",[],{"type":17,"tag":29,"props":366745,"children":366746},{},[366747],{"type":23,"value":366748},"1.2 Activate the integrations that you would like to use to sign-in your users into your application by clicking on each desired integration.",{"type":17,"tag":29,"props":366750,"children":366751},{},[366752],{"type":17,"tag":6438,"props":366753,"children":366755},{"alt":318119,"src":366754},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-1.png",[],{"type":17,"tag":29,"props":366757,"children":366758},{},[366759],{"type":23,"value":366760},"1.3 If available, you can chose to use Unified's branding and name on the authentication page that your users see with signing-in to your application.  We don't recommend this for production applications, but this is a great option to test the authentication feature.",{"type":17,"tag":29,"props":366762,"children":366763},{},[366764,366766,366772],{"type":23,"value":366765},"1.4 If you want to add your own branding to the authentication pages,  then you will need to first obtain your own OAuth2 application credentials from the specific integration vendors (eg. Google).  For help on creating your own OAuth2 application, please see ",{"type":17,"tag":133,"props":366767,"children":366769},{"href":364177,"rel":366768},[214],[366770],{"type":23,"value":366771},"Generating OAuth2 Credentials",{"type":23,"value":366773}," or click on the 'Get your own OAuth2 credentials' link.  Once you have that, enter your client ID and client secret that you obtained from the integration vendor.",{"type":17,"tag":29,"props":366775,"children":366776},{},[366777],{"type":17,"tag":6438,"props":366778,"children":366780},{"alt":318119,"src":366779},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-2.png",[],{"type":17,"tag":29,"props":366782,"children":366783},{},[366784],{"type":23,"value":366785},"1.5 Click on the 'Activate' button to enable this integration.",{"type":17,"tag":29,"props":366787,"children":366788},{},[366789],{"type":23,"value":366790},"1.6 Repeat for all of the integrations that you want to use to authenticate your users.",{"type":17,"tag":68,"props":366792,"children":366794},{"id":366793},"_2-display-sign-in-links-to-your-users",[366795],{"type":23,"value":366796},"2. Display sign-in links to your users",{"type":17,"tag":29,"props":366798,"children":366799},{},[366800],{"type":23,"value":366801},"Now that you have a list of Authentication connections, you can incorporate them into your application.",{"type":17,"tag":29,"props":366803,"children":366804},{},[366805],{"type":23,"value":366806},"You have two options:",{"type":17,"tag":6154,"props":366808,"children":366809},{},[366810,366823],{"type":17,"tag":84,"props":366811,"children":366812},{},[366813,366815,366821],{"type":23,"value":366814},"Remember the integration types (ie. google, discord, workday) and create links that point to our authentication API endpoint:\n",{"type":17,"tag":6121,"props":366816,"children":366818},{"className":366817},[],[366819],{"type":23,"value":366820},"https//api.unified.to/unified/integration/login/{workspace_id}/{integration_type}?redirect=true",{"type":23,"value":366822},".  You can style that link however you like.",{"type":17,"tag":84,"props":366824,"children":366825},{},[366826,366828,366834],{"type":23,"value":366827},"Call the our API that returns a list of integrations; ",{"type":17,"tag":6121,"props":366829,"children":366831},{"className":366830},[],[366832],{"type":23,"value":366833},"https//api.unified.to/unified/integration/workspace/{workspace_id}?summary=true&active=true&categories=auth",{"type":23,"value":366835},". This will return all activated Authentication integrations and each will have information that you can use to style your Sign-in links;",{"type":17,"tag":6893,"props":366837,"children":366840},{"className":366838,"code":366839,"language":22503,"meta":7},[22501],"[\n    {\n        logo_url: \"http://localhost:8000/docs/images/google.png\",\n        name: \"Google\",\n        type: \"google\"\n    }\n]\n",[366841],{"type":17,"tag":6121,"props":366842,"children":366843},{"__ignoreMap":7},[366844],{"type":23,"value":366839},{"type":17,"tag":29,"props":366846,"children":366847},{},[366848],{"type":23,"value":366849},"The Sign-in URL can have the following optional parameters:",{"type":17,"tag":29,"props":366851,"children":366852},{},[366853,366859,366860,366865],{"type":17,"tag":6121,"props":366854,"children":366856},{"className":366855},[],[366857],{"type":23,"value":366858},"redirect",{"type":23,"value":257257},{"type":17,"tag":6121,"props":366861,"children":366863},{"className":366862},[],[366864],{"type":23,"value":49324},{"type":23,"value":366866}," to redirect the user or if empty, will return the URL as string in its response",{"type":17,"tag":29,"props":366868,"children":366869},{},[366870,366875],{"type":17,"tag":6121,"props":366871,"children":366873},{"className":366872},[],[366874],{"type":23,"value":147437},{"type":23,"value":366876}," - the URL that the user will be redirected to once they have successfully authenticated with that integration vendor",{"type":17,"tag":29,"props":366878,"children":366879},{},[366880,366885],{"type":17,"tag":6121,"props":366881,"children":366883},{"className":366882},[],[366884],{"type":23,"value":147442},{"type":23,"value":366886}," - the URL that the user will be redirected to if there is an error or other issue preventing the user from being authenticated by the integration vendor",{"type":17,"tag":29,"props":366888,"children":366889},{},[366890,366895],{"type":17,"tag":6121,"props":366891,"children":366893},{"className":366892},[],[366894],{"type":23,"value":77758},{"type":23,"value":366896}," - a string that will be sent back to the success_redirect. You can use this to remember a user ID or other identifier.",{"type":17,"tag":6154,"props":366898,"children":366899},{},[366900],{"type":17,"tag":84,"props":366901,"children":366902},{},[366903],{"type":23,"value":366904},"An alternative to building your own Sign-in page is to use our Embedded Sign-in widget.  Click on the Settings menu and then on the Embedded Sign-in option.",{"type":17,"tag":29,"props":366906,"children":366907},{},[366908],{"type":17,"tag":6438,"props":366909,"children":366911},{"alt":318119,"src":366910},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-3.png",[],{"type":17,"tag":29,"props":366913,"children":366914},{},[366915],{"type":23,"value":366916},"Copy the CSS and code and insert it into your own application.",{"type":17,"tag":68,"props":366918,"children":366920},{"id":366919},"step-3-verify-a-sign-in-attempt",[366921],{"type":23,"value":366922},"Step 3: Verify a sign-in attempt",{"type":17,"tag":29,"props":366924,"children":366925},{},[366926],{"type":23,"value":366927},"Once the user clicks on the authentication button/link, they will be redirect to the integration vendor's authentication page.",{"type":17,"tag":29,"props":366929,"children":366930},{},[366931],{"type":17,"tag":6438,"props":366932,"children":366934},{"alt":318119,"src":366933},"https://s3.us-east-2.amazonaws.com/unified-article-images/use_unified_to_sign_in_your_users_into_your_application-4.png",[],{"type":17,"tag":29,"props":366936,"children":366937},{},[366938],{"type":23,"value":366939},"btw: it is important to note that the authentication pages are not Unified's pages but that of the integration vendor.  Unified never sees the user's login credentials including their password.",{"type":17,"tag":29,"props":366941,"children":366942},{},[366943,366945,366950,366952,366958],{"type":23,"value":366944},"Once the user successfully signs-in, they are redirected back to your application (or to the location of the ",{"type":17,"tag":6121,"props":366946,"children":366948},{"className":366947},[],[366949],{"type":23,"value":147437},{"type":23,"value":366951}," URL parameter from step 2). A ",{"type":17,"tag":6121,"props":366953,"children":366955},{"className":366954},[],[366956],{"type":23,"value":366957},"jwt",{"type":23,"value":366959}," parameter will be appended to that URL.",{"type":17,"tag":29,"props":366961,"children":366962},{},[366963,366964,366969,366971,366977],{"type":23,"value":6712},{"type":17,"tag":6121,"props":366965,"children":366967},{"className":366966},[],[366968],{"type":23,"value":366957},{"type":23,"value":366970}," is a base64 encoded ",{"type":17,"tag":133,"props":366972,"children":366975},{"href":366973,"rel":366974},"https://jwt.io/",[214],[366976],{"type":23,"value":276467},{"type":23,"value":366978},"  and is signed with your Workspace Secret. Verify the JWT with your workspace secret on your server (NOT in your browser as the workspace secret is not public).",{"type":17,"tag":29,"props":366980,"children":366981},{},[366982],{"type":23,"value":366983},"Example code to verify a JWT on a NodeJS server:",{"type":17,"tag":6893,"props":366985,"children":366988},{"className":366986,"code":366987,"language":6898,"meta":7},[6896],"try {\n    let result = JWT.verify( req.payload.jwt, workspace.secret )\n} catch (err) {\n    console.error(err);\n}\n",[366989],{"type":17,"tag":6121,"props":366990,"children":366991},{"__ignoreMap":7},[366992],{"type":23,"value":366987},{"type":17,"tag":29,"props":366994,"children":366995},{},[366996],{"type":23,"value":366997},"The decoded JWT will contain a name and emails field:",{"type":17,"tag":6893,"props":366999,"children":367002},{"className":367000,"code":367001,"language":22503,"meta":7},[22501],"{\n    name: \"Jane Smith\",\n    emails: [\"jane@foo.com\", \"jsmith89@gmail.com\"]\n}\n",[367003],{"type":17,"tag":6121,"props":367004,"children":367005},{"__ignoreMap":7},[367006],{"type":23,"value":367001},{"type":17,"tag":29,"props":367008,"children":367009},{},[367010],{"type":23,"value":367011},"Use the user's email to log them into your application as it is verified by the integration.",{"title":7,"searchDepth":1629,"depth":1629,"links":367013},[367014,367015,367016],{"id":366728,"depth":1629,"text":366731},{"id":366793,"depth":1629,"text":366796},{"id":366919,"depth":1629,"text":366922},"content:blog:use_unified_to_sign_in_your_users_into_your_application.md","blog/use_unified_to_sign_in_your_users_into_your_application.md","blog/use_unified_to_sign_in_your_users_into_your_application",{"_path":367021,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":366626,"description":367022,"img":367023,"date":367024,"tag":12,"body":367025,"_type":1677,"_id":367301,"_source":1679,"_file":367302,"_stem":367303,"_extension":1682},"/blog/ask_a_cto_building_your_technology_investment_strategy","Every software company relies on technology — AI and machine learning, cloud computing, integrations, etc. — to drive product functionality and business...","https://s3.us-east-2.amazonaws.com/unified-article-images/ask_a_cto_building_your_technology_investment_strategy-icon.png","2023-08-10T00:00:00.000Z",{"type":14,"children":367026,"toc":367293},[367027,367032,367035,367043,367057,367065,367070,367076,367081,367086,367091,367096,367102,367107,367112,367125,367130,367136,367141,367162,367167,367172,367178,367183,367188,367193,367198,367202,367207,367230,367234,367264,367272,367283,367288],{"type":17,"tag":18,"props":367028,"children":367030},{"id":367029},"ask-a-cto-building-your-technology-investment-strategy",[367031],{"type":23,"value":366626},{"type":17,"tag":25,"props":367033,"children":367034},{},[],{"type":17,"tag":29,"props":367036,"children":367037},{},[367038],{"type":17,"tag":33,"props":367039,"children":367040},{},[367041],{"type":23,"value":367042},"August 10, 2023",{"type":17,"tag":29,"props":367044,"children":367045},{},[367046,367048,367055],{"type":23,"value":367047},"Author: ",{"type":17,"tag":133,"props":367049,"children":367052},{"href":367050,"rel":367051},"https://www.ahmadnassri.com/",[214],[367053],{"type":23,"value":367054},"Ahmad Nassri",{"type":23,"value":367056},", Fractional CTO and Advisor",{"type":17,"tag":29,"props":367058,"children":367059},{},[367060],{"type":17,"tag":6438,"props":367061,"children":367064},{"alt":367062,"src":367063},"Blog-Unified-Ask-a-CTO_%282%29.png","https://s3.us-east-2.amazonaws.com/unified-article-images/ask_a_cto_building_your_technology_investment_strategy-0.png",[],{"type":17,"tag":29,"props":367066,"children":367067},{},[367068],{"type":23,"value":367069},"Every software company relies on technology — AI and machine learning, cloud computing, integrations, etc. — to drive product functionality and business operations. However, many software companies struggle to build or license technologies that align with their long-term product objectives. Ahmad Nassri, a fractional CTO, startup advisor, and investor, shares key considerations that should form the basis of any technology investment strategy that helps you maximize revenue and avoid costly failures.",{"type":17,"tag":68,"props":367071,"children":367073},{"id":367072},"_1-focus-on-whats-core-to-your-customer",[367074],{"type":23,"value":367075},"1. Focus on what's core to your customer",{"type":17,"tag":29,"props":367077,"children":367078},{},[367079],{"type":23,"value":367080},"For many modern software businesses, technology is at the core of their innovation. However, that doesn't mean customers are buying the technology itself. Rather, they are purchasing the services and outcomes offered by the technology. For example, an employee engagement platform relies on technology, but its customers come to them to enhance employee satisfaction and productivity.",{"type":17,"tag":29,"props":367082,"children":367083},{},[367084],{"type":23,"value":367085},"A common mistake technical leaders make is sinking too much time and money into their infrastructure. They hire inexperienced developers, which creates a hammer-and-nail situation where every problem needs to be solved with code. Suddenly, these companies are building a whole infrastructure deployment or a framework system from the ground up. They waste expensive resources on something that isn't core to their customers.",{"type":17,"tag":29,"props":367087,"children":367088},{},[367089],{"type":23,"value":367090},"Focus your technology investments on your customer — how do you make your customer journey seamless? Don't just write code for the sake of writing code.",{"type":17,"tag":29,"props":367092,"children":367093},{},[367094],{"type":23,"value":367095},"Now if you're a company where technology is core to your customer, such as a developer tool, investing in your infrastructure more extensively makes sense, but even in this scenario, you still need to focus on serving your customer first.",{"type":17,"tag":68,"props":367097,"children":367099},{"id":367098},"_2-dont-build-from-scratch-if-you-dont-have-to",[367100],{"type":23,"value":367101},"2. Don't build from scratch if you don't have to",{"type":17,"tag":29,"props":367103,"children":367104},{},[367105],{"type":23,"value":367106},"Don't build from scratch. Even if technology innovation is at your company's core and you have to consider IP defensibility, there are several alternatives to building internally, from cloud-computing platforms to third-party APIs, that can extend your product's functionality without having to invest significant development resources.",{"type":17,"tag":29,"props":367108,"children":367109},{},[367110],{"type":23,"value":367111},"Amazon Web Services (AWS) is an excellent example of this. We used to launch servers, install operating systems and do a whole bunch of foundational work to get our baseline systems running. Nowadays, we don't do that anymore.",{"type":17,"tag":29,"props":367113,"children":367114},{},[367115,367117,367123],{"type":23,"value":367116},"There are now various levels of abstraction that have been facilitated for us. For instance, should you go straight to Visa or Mastercard's transaction systems if you need a billing system? Probably not. Should you use Stripe? What if a layer above Stripe is more abstracted for SaaS products? This is where the ",{"type":17,"tag":133,"props":367118,"children":367120},{"href":87026,"rel":367119},[214],[367121],{"type":23,"value":367122},"integration",{"type":23,"value":367124}," layer comes in.",{"type":17,"tag":29,"props":367126,"children":367127},{},[367128],{"type":23,"value":367129},"Instead of building your code directly with Stripe or Amazon, use out-of-the-box products that are more abstracted, so you can get the highest quality solutions and go back to focusing on your customer journey.",{"type":17,"tag":68,"props":367131,"children":367133},{"id":367132},"_3-consider-your-time-to-market",[367134],{"type":23,"value":367135},"3. Consider your time to market",{"type":17,"tag":29,"props":367137,"children":367138},{},[367139],{"type":23,"value":367140},"Whether you're choosing to build internally or leverage third-party technology, it's crucial that you have a grasp on your industry and how easy it is for customers to switch to a competitor. You want to ensure your technology investment allows you to execute at a pace that helps bring value to your customers and make your product irreplaceable.",{"type":17,"tag":29,"props":367142,"children":367143},{},[367144,367146,367152,367154,367161],{"type":23,"value":367145},"For instance, integrations, as I mentioned earlier, can help you avoid building from scratch. For example, instead of building email functionality internally, you can use ",{"type":17,"tag":133,"props":367147,"children":367150},{"href":367148,"rel":367149},"https://unified.to/integrations/sendgrid",[214],[367151],{"type":23,"value":192306},{"type":23,"value":367153},". Customer-facing integrations can also create product stickiness, meaning your customers will be more engaged since your product is compatible with the technology they already use. As a result, you'll effectively increase your lifetime value (LTV) and ",{"type":17,"tag":133,"props":367155,"children":367158},{"href":367156,"rel":367157},"https://www.paddle.com/blog/product-integrations",[214],[367159],{"type":23,"value":367160},"reduce churn",{"type":23,"value":54},{"type":17,"tag":29,"props":367163,"children":367164},{},[367165],{"type":23,"value":367166},"However, if you're in a competitive market, like the HR tech industry, you can't afford to spend six months or a quarter every year building one integration at a time. You will never have enough integrations, you won't have the internal expertise to support every integration, and you won't have time to focus on your core value.",{"type":17,"tag":29,"props":367168,"children":367169},{},[367170],{"type":23,"value":367171},"So, consider a technology investment that does all the heavy lifting for you, such as allowing you to deploy several customer-facing integrations in a much shorter time frame.",{"type":17,"tag":68,"props":367173,"children":367175},{"id":367174},"_4-calculate-your-total-cost-of-ownership",[367176],{"type":23,"value":367177},"4. Calculate your total cost of ownership",{"type":17,"tag":29,"props":367179,"children":367180},{},[367181],{"type":23,"value":367182},"One of the biggest problems I see companies make is not thinking about the total cost of ownership (TCO), which means taking a bird's-eye view of the technology investment and its value or costs over time.",{"type":17,"tag":29,"props":367184,"children":367185},{},[367186],{"type":23,"value":367187},"In software, whether you're deciding to build internally or buy, there's always an ongoing cost around security, dependency updates, code rot, and other activities that are part of continuous, never-ending maintenance. It's not just about headcount or subscription costs. Not factoring in maintenance or even shutdown costs will lead to questions down the line like, ‘Why is the engineering team so slow?' or ‘Why can't we build more features?'",{"type":17,"tag":29,"props":367189,"children":367190},{},[367191],{"type":23,"value":367192},"Think beyond the cost of implementation for your technology investments, but calculate the TCO by assessing factors like security, opportunity cost, and scalability.",{"type":17,"tag":29,"props":367194,"children":367195},{},[367196],{"type":23,"value":367197},"You don't want to be the one apologizing to your board of directors at the end of the year because of all the unaccounted maintenance costs and tech debt from your technology investments.",{"type":17,"tag":68,"props":367199,"children":367200},{"id":44585},[367201],{"type":23,"value":44588},{"type":17,"tag":29,"props":367203,"children":367204},{},[367205],{"type":23,"value":367206},"Technology investment is heavily nuanced and depends on your company's industry and long-term goals. However, these four critical considerations can help you plan strategically and make technology-buying decisions that maximize ROI.",{"type":17,"tag":80,"props":367208,"children":367209},{},[367210,367215,367220,367225],{"type":17,"tag":84,"props":367211,"children":367212},{},[367213],{"type":23,"value":367214},"Focus on your core and delivering customer value, don't waste time and money on technology investments that your customers won't care about",{"type":17,"tag":84,"props":367216,"children":367217},{},[367218],{"type":23,"value":367219},"Avoid building from scratch by using out-of-the-box products that have the level of abstraction you need for your use cases",{"type":17,"tag":84,"props":367221,"children":367222},{},[367223],{"type":23,"value":367224},"Leverage software investments that accelerate your time to market and keep your costs down",{"type":17,"tag":84,"props":367226,"children":367227},{},[367228],{"type":23,"value":367229},"Factor in the total cost of ownership (TCO), so you're not caught off guard by expensive maintenance, support, and shutdown costs",{"type":17,"tag":68,"props":367231,"children":367232},{"id":366649},[367233],{"type":23,"value":366652},{"type":17,"tag":29,"props":367235,"children":367236},{},[367237,367238,367243,367245,367249,367251,367257,367258,367263],{"type":23,"value":365844},{"type":17,"tag":133,"props":367239,"children":367241},{"href":212,"rel":367240},[214],[367242],{"type":23,"value":217},{"type":23,"value":367244}," blog. We're a ",{"type":17,"tag":133,"props":367246,"children":367247},{"href":7691},[367248],{"type":23,"value":7806},{"type":23,"value":367250}," development platform for B2B customer-facing integrations. We're excited to continue to innovate at Unified and solve hard, critical integration-related problems for our customers. If you're curious about Unified's integrations-as-a-service solution, consider ",{"type":17,"tag":133,"props":367252,"children":367254},{"href":158861,"rel":367253},[214],[367255],{"type":23,"value":367256},"signing up for a free account ",{"type":23,"value":33669},{"type":17,"tag":133,"props":367259,"children":367261},{"href":215330,"rel":367260},[214],[367262],{"type":23,"value":299181},{"type":23,"value":54},{"type":17,"tag":29,"props":367265,"children":367266},{},[367267],{"type":17,"tag":48,"props":367268,"children":367269},{},[367270],{"type":23,"value":367271},"About the Author",{"type":17,"tag":29,"props":367273,"children":367274},{},[367275,367281],{"type":17,"tag":133,"props":367276,"children":367278},{"href":367050,"rel":367277},[214],[367279],{"type":23,"value":367280},"Ahmad",{"type":23,"value":367282}," is a Fractional CTO, Startup Advisor, and Investor. Leading up to the acquisition by GitHub in 2020, Ahmad served as the CTO for npm, taking over the critical mission of ensuring the Open Source JavaScript registry remains stable, reliable and sustainable for the millions of developers that rely on it daily.",{"type":17,"tag":29,"props":367284,"children":367285},{},[367286],{"type":23,"value":367287},"Prior to joining npm, Ahmad led the platform engineering team as Chief Architect for TELUS Digital. As VP of Engineering at Kong, his focus was on powering API-driven development, and open-source technology for the enterprise.",{"type":17,"tag":29,"props":367289,"children":367290},{},[367291],{"type":23,"value":367292},"Ahmad founded REFACTOR Community — a developer community of over 17,000+ members, operating 4 annual tech conferences in Canada.",{"title":7,"searchDepth":1629,"depth":1629,"links":367294},[367295,367296,367297,367298,367299,367300],{"id":367072,"depth":1629,"text":367075},{"id":367098,"depth":1629,"text":367101},{"id":367132,"depth":1629,"text":367135},{"id":367174,"depth":1629,"text":367177},{"id":44585,"depth":1629,"text":44588},{"id":366649,"depth":1629,"text":366652},"content:blog:ask_a_cto_building_your_technology_investment_strategy.md","blog/ask_a_cto_building_your_technology_investment_strategy.md","blog/ask_a_cto_building_your_technology_investment_strategy",{"_path":367305,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":367306,"description":367307,"img":367308,"date":367309,"tag":12,"body":367310,"_type":1677,"_id":367868,"_source":1679,"_file":367869,"_stem":367870,"_extension":1682},"/blog/unified_july_2023_product_updates","Unified.to July 2023 Product Updates","Welcome to the July instalment of Unified's product releases and highlights.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_july_2023_product_updates-icon.png","2023-07-31T00:00:00.000Z",{"type":14,"children":367311,"toc":367861},[367312,367317,367320,367328,367332,367336,367344,367349,367362,367366,367423,367434,367440,367448,367456,367461,367479,367492,367501,367511,367539,367548,367556,367564,367569,367577,367582,367590,367595,367603,367608,367613,367623,367628,367636,367641,367663,367674,367683,367691,367696,367701,367709,367718,367724,367732,367740,367752,367763,367768,367778,367786,367800,367805,367829,367834,367843,367848],{"type":17,"tag":18,"props":367313,"children":367315},{"id":367314},"unifiedto-july-2023-product-updates",[367316],{"type":23,"value":367306},{"type":17,"tag":25,"props":367318,"children":367319},{},[],{"type":17,"tag":29,"props":367321,"children":367322},{},[367323],{"type":17,"tag":33,"props":367324,"children":367325},{},[367326],{"type":23,"value":367327},"July 31, 2023",{"type":17,"tag":29,"props":367329,"children":367330},{},[367331],{"type":23,"value":367307},{"type":17,"tag":68,"props":367333,"children":367334},{"id":366451},[367335],{"type":23,"value":366454},{"type":17,"tag":29,"props":367337,"children":367338},{},[367339],{"type":17,"tag":6438,"props":367340,"children":367343},{"alt":367341,"src":367342},"CleanShot_2023-07-31_at_16.31.412x.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_july_2023_product_updates-0.png",[],{"type":17,"tag":29,"props":367345,"children":367346},{},[367347],{"type":23,"value":367348},"In just five months, Unified.to has gone from zero to 100 integrations. Most development teams struggle for months on end to pull off just one integration. Unified.to's architecture combined with our specialized expertise allows us to build at an incredibly fast pace.",{"type":17,"tag":29,"props":367350,"children":367351},{},[367352,367354,367360],{"type":23,"value":367353},"Many of our integrations came to life because our customers asked for them. If there are integrations you'd like to add to your integration roadmap, just ",{"type":17,"tag":133,"props":367355,"children":367357},{"href":215330,"rel":367356},[214],[367358],{"type":23,"value":367359},"drop us a line",{"type":23,"value":367361}," and consider it done.",{"type":17,"tag":29,"props":367363,"children":367364},{},[367365],{"type":23,"value":354195},{"type":17,"tag":80,"props":367367,"children":367368},{},[367369,367380,367390,367400,367411],{"type":17,"tag":84,"props":367370,"children":367371},{},[367372,367374],{"type":23,"value":367373},"Ticketing integration: ",{"type":17,"tag":133,"props":367375,"children":367378},{"href":367376,"rel":367377},"https://unified.to/integrations/gorgias",[214],[367379],{"type":23,"value":32717},{"type":17,"tag":84,"props":367381,"children":367382},{},[367383,367385],{"type":23,"value":367384},"ATS/HR integration: ",{"type":17,"tag":133,"props":367386,"children":367388},{"href":361408,"rel":367387},[214],[367389],{"type":23,"value":361412},{"type":17,"tag":84,"props":367391,"children":367392},{},[367393,367394],{"type":23,"value":367384},{"type":17,"tag":133,"props":367395,"children":367398},{"href":367396,"rel":367397},"https://unified.to/integrations/manatal",[214],[367399],{"type":23,"value":56604},{"type":17,"tag":84,"props":367401,"children":367402},{},[367403,367405],{"type":23,"value":367404},"ATS/CRM/HR integration: ",{"type":17,"tag":133,"props":367406,"children":367408},{"href":361398,"rel":367407},[214],[367409],{"type":23,"value":367410},"Recruit CRM",{"type":17,"tag":84,"props":367412,"children":367413},{},[367414,367416],{"type":23,"value":367415},"HR integration: ",{"type":17,"tag":133,"props":367417,"children":367420},{"href":367418,"rel":367419},"https://unified.to/integrations/plusplus",[214],[367421],{"type":23,"value":367422},"PlusPlus",{"type":17,"tag":29,"props":367424,"children":367425},{},[367426,367432],{"type":17,"tag":133,"props":367427,"children":367429},{"href":158861,"rel":367428},[214],[367430],{"type":23,"value":367431},"Create a Unified.to account or log in",{"type":23,"value":367433}," to activate integrations in one click.",{"type":17,"tag":68,"props":367435,"children":367437},{"id":367436},"new-features-and-enhancements",[367438],{"type":23,"value":367439},"New features and enhancements",{"type":17,"tag":29,"props":367441,"children":367442},{},[367443],{"type":17,"tag":48,"props":367444,"children":367445},{},[367446],{"type":23,"value":367447},"European Union data region",{"type":17,"tag":29,"props":367449,"children":367450},{},[367451],{"type":17,"tag":6438,"props":367452,"children":367455},{"alt":367453,"src":367454},"CleanShot_2023-07-31_at_17.22.022x.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_july_2023_product_updates-1.png",[],{"type":17,"tag":29,"props":367457,"children":367458},{},[367459],{"type":23,"value":367460},"Unified.to just rolled out a European Union (EU) data region, adding another layer of flexibility and choice for our customers. Unified.to users can now decide where their data gets processed — whether it's in the US or in the EU. Your data, your call.",{"type":17,"tag":29,"props":367462,"children":367463},{},[367464,367466,367472,367473,367478],{"type":23,"value":367465},"For all European users, you now have your very own dedicated instance of Unified.to, accessible via two streamlined URLs: ",{"type":17,"tag":133,"props":367467,"children":367470},{"href":367468,"rel":367469},"https://app-eu.unified.to",[214],[367471],{"type":23,"value":367468},{"type":23,"value":34435},{"type":17,"tag":133,"props":367474,"children":367476},{"href":246132,"rel":367475},[214],[367477],{"type":23,"value":246132},{"type":23,"value":54},{"type":17,"tag":29,"props":367480,"children":367481},{},[367482,367484,367491],{"type":23,"value":367483},"With multiple data regions, you can seamlessly cater to your local market and ensure your customers' data always stays in your specified region. Plus, for added security, Unified.to never stores or caches your customers' data on our servers. Speaking of data, Unified.to is also ",{"type":17,"tag":133,"props":367485,"children":367488},{"href":367486,"rel":367487},"https://unified.to/gdpr",[214],[367489],{"type":23,"value":367490},"GDPR compliant",{"type":23,"value":54},{"type":17,"tag":29,"props":367493,"children":367494},{},[367495],{"type":17,"tag":133,"props":367496,"children":367498},{"href":47029,"rel":367497},[214],[367499],{"type":23,"value":367500},"See more updates on the changelog",{"type":17,"tag":29,"props":367502,"children":367503},{},[367504,367509],{"type":17,"tag":48,"props":367505,"children":367506},{},[367507],{"type":23,"value":367508},"Unified ATS Application Object",{"type":23,"value":367510},"\nWe have introduced a new Object for our ATS integrations that represent when a candidate applies for a specific job. Our ATS Application Object includes the following fields:",{"type":17,"tag":80,"props":367512,"children":367513},{},[367514,367519,367524,367529,367534],{"type":17,"tag":84,"props":367515,"children":367516},{},[367517],{"type":23,"value":367518},"applied_at: Captures the date of application submission.",{"type":17,"tag":84,"props":367520,"children":367521},{},[367522],{"type":23,"value":367523},"rejected_at: Records the date of application rejection.",{"type":17,"tag":84,"props":367525,"children":367526},{},[367527],{"type":23,"value":367528},"rejected_reason: Provides the reason for application rejection.",{"type":17,"tag":84,"props":367530,"children":367531},{},[367532],{"type":23,"value":367533},"source: Captures the application's source.",{"type":17,"tag":84,"props":367535,"children":367536},{},[367537],{"type":23,"value":367538},"status: Expanded options ('active', 'rejected', 'hired', 'converted') for better application tracking.",{"type":17,"tag":29,"props":367540,"children":367541},{},[367542],{"type":17,"tag":133,"props":367543,"children":367545},{"href":56812,"rel":367544},[214],[367546],{"type":23,"value":367547},"Learn more about our Unified ATS API",{"type":17,"tag":29,"props":367549,"children":367550},{},[367551],{"type":17,"tag":48,"props":367552,"children":367553},{},[367554],{"type":23,"value":367555},"Launch Checklist",{"type":17,"tag":29,"props":367557,"children":367558},{},[367559],{"type":17,"tag":6438,"props":367560,"children":367563},{"alt":367561,"src":367562},"CleanShot_2023-07-31_at_16.27.312x.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_july_2023_product_updates-2.png",[],{"type":17,"tag":29,"props":367565,"children":367566},{},[367567],{"type":23,"value":367568},"With Unified.to, developers integrate once to launch 100+ integrations across categories like HR, ATS, and CRM in just hours. Any developer can get started with Unified.to in three easy steps.",{"type":17,"tag":29,"props":367570,"children":367571},{},[367572],{"type":17,"tag":33,"props":367573,"children":367574},{},[367575],{"type":23,"value":367576},"1. Activate",{"type":17,"tag":29,"props":367578,"children":367579},{},[367580],{"type":23,"value":367581},"Activate the integrations you'd like to add to your application.",{"type":17,"tag":29,"props":367583,"children":367584},{},[367585],{"type":17,"tag":33,"props":367586,"children":367587},{},[367588],{"type":23,"value":367589},"2. Build",{"type":17,"tag":29,"props":367591,"children":367592},{},[367593],{"type":23,"value":367594},"Start building and testing your integrations in different environments, from staging to production.",{"type":17,"tag":29,"props":367596,"children":367597},{},[367598],{"type":17,"tag":33,"props":367599,"children":367600},{},[367601],{"type":23,"value":367602},"3. Launch",{"type":17,"tag":29,"props":367604,"children":367605},{},[367606],{"type":23,"value":367607},"Launch your integrations and give customers access.",{"type":17,"tag":29,"props":367609,"children":367610},{},[367611],{"type":23,"value":367612},"To support developers as they begin to use Unified.to for the first time, we've created an in-product launch checklist that walks you through every stage, from adding environments to transforming our data models into your data models. Once logged in, go to Help > Launch Checklist.",{"type":17,"tag":29,"props":367614,"children":367615},{},[367616],{"type":17,"tag":133,"props":367617,"children":367620},{"href":367618,"rel":367619},"https://app.unified.to/launch",[214],[367621],{"type":23,"value":367622},"Sign up or sign in to access the Unified.to launch checklist",{"type":17,"tag":68,"props":367624,"children":367626},{"id":367625},"conversations-were-having",[367627],{"type":23,"value":366601},{"type":17,"tag":29,"props":367629,"children":367630},{},[367631],{"type":17,"tag":48,"props":367632,"children":367633},{},[367634],{"type":23,"value":367635},"APIs You Won't Hate: An API to abstract everything",{"type":17,"tag":29,"props":367637,"children":367638},{},[367639],{"type":23,"value":367640},"Some of the best new company ideas are born out of the challenges founders face firsthand. That's precisely the case with Unified.to — our founding team has personally experienced the pain of integration development.",{"type":17,"tag":29,"props":367642,"children":367643},{},[367644,367646,367652,367654,367661],{"type":23,"value":367645},"Recently, our CEO, ",{"type":17,"tag":133,"props":367647,"children":367650},{"href":367648,"rel":367649},"https://www.linkedin.com/in/roypereira?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAAKDFwBR4nc4QGWY5rxg-Ot8hPglRY_9fU",[214],[367651],{"type":23,"value":337509},{"type":23,"value":367653},", was a guest on the ",{"type":17,"tag":133,"props":367655,"children":367658},{"href":367656,"rel":367657},"https://apisyouwonthate.com/podcast/an-api-to-abstract-everything/",[214],[367659],{"type":23,"value":367660},"APIs You Won't Hate",{"type":23,"value":367662}," podcast. During this conversation, he shares the company idea he didn't pursue due to the number of integrations he'd need. He emphasizes how integrations are not merely a development concern but a critical aspect of revenue generation.",{"type":17,"tag":29,"props":367664,"children":367665},{},[367666,367668,367672],{"type":23,"value":367667},"'I talked to a CEO that said, ‘",{"type":17,"tag":22203,"props":367669,"children":367670},{},[367671],{"type":23,"value":312964},{"type":23,"value":367673}," are a revenue limitation. I can't get my engineering team to build another integration and our revenue has been impacted greatly.' That's when the light bulb hit me. This is the product that I need to build.'",{"type":17,"tag":29,"props":367675,"children":367676},{},[367677],{"type":17,"tag":133,"props":367678,"children":367680},{"href":367656,"rel":367679},[214],[367681],{"type":23,"value":367682},"Listen to the interview",{"type":17,"tag":29,"props":367684,"children":367685},{},[367686],{"type":17,"tag":48,"props":367687,"children":367688},{},[367689],{"type":23,"value":367690},"How we built it: Reaching 100 integrations",{"type":17,"tag":29,"props":367692,"children":367693},{},[367694],{"type":23,"value":367695},"Unified.to is dedicated to rapidly expanding our pre-built integration suite, providing our customers with 100+ pre-built integrations spanning seven essential categories — HR, ATS, CRM, Ticketing, Marketing, Enrichment, and Call Center. In our latest blog post, we divulge the three pivotal decisions that drive our accelerated development: adopting modern architecture, harnessing internal automation, and unifying everything.",{"type":17,"tag":29,"props":367697,"children":367698},{},[367699],{"type":23,"value":367700},"Sneak peek:",{"type":17,"tag":29,"props":367702,"children":367703},{},[367704],{"type":17,"tag":33,"props":367705,"children":367706},{},[367707],{"type":23,"value":367708},"Our expertise helps us bypass some of the mistakes that inexperienced developers make, like hastily building an architecture that cannot scale as customer requests for more integrations start piling in (and they always do). We've also leveraged internal automation tools that generate code.",{"type":17,"tag":29,"props":367710,"children":367711},{},[367712],{"type":17,"tag":133,"props":367713,"children":367716},{"href":367714,"rel":367715},"https://unified.to/blog/how_we_built_it_100_integrations",[214],[367717],{"type":23,"value":360036},{"type":17,"tag":68,"props":367719,"children":367721},{"id":367720},"whats-exciting-us",[367722],{"type":23,"value":367723},"What's exciting us",{"type":17,"tag":29,"props":367725,"children":367726},{},[367727],{"type":17,"tag":48,"props":367728,"children":367729},{},[367730],{"type":23,"value":367731},"Our partnership with JazzHR",{"type":17,"tag":29,"props":367733,"children":367734},{},[367735],{"type":17,"tag":6438,"props":367736,"children":367739},{"alt":367737,"src":367738},"JazzHrUnified.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_july_2023_product_updates-3.png",[],{"type":17,"tag":29,"props":367741,"children":367742},{},[367743,367745,367750],{"type":23,"value":367744},"Partnerships represent just one of the many advantages of expanding your customer-facing integrations, and we are delighted to announce our new partnership as a ",{"type":17,"tag":133,"props":367746,"children":367748},{"href":361340,"rel":367747},[214],[367749],{"type":23,"value":361344},{"type":23,"value":367751}," system integrator.",{"type":17,"tag":29,"props":367753,"children":367754},{},[367755,367757,367761],{"type":23,"value":367756},"With Unified.to, developers at HR companies can seamlessly empower their products with user data from JazzHR and several other ATS systems, all through one ",{"type":17,"tag":133,"props":367758,"children":367759},{"href":7691},[367760],{"type":23,"value":7806},{"type":23,"value":367762}," and data model. Say goodbye to the headache of juggling different APIs and complex data models.",{"type":17,"tag":29,"props":367764,"children":367765},{},[367766],{"type":23,"value":367767},"By integrating just once through Unified.to, you can effortlessly launch JazzHR and over 20 other systems within a matter of hours.",{"type":17,"tag":29,"props":367769,"children":367770},{},[367771],{"type":17,"tag":133,"props":367772,"children":367775},{"href":367773,"rel":367774},"https://marketplace.jazzhr.com/providers/unified-to/",[214],[367776],{"type":23,"value":367777},"Learn more about Unified.to for JazzHR",{"type":17,"tag":29,"props":367779,"children":367780},{},[367781],{"type":17,"tag":48,"props":367782,"children":367783},{},[367784],{"type":23,"value":367785},"$10,000 credit for Techstars Companies",{"type":17,"tag":29,"props":367787,"children":367788},{},[367789,367791,367798],{"type":23,"value":367790},"We are thrilled to extend an exclusive perk to fellow ",{"type":17,"tag":133,"props":367792,"children":367795},{"href":367793,"rel":367794},"https://www.linkedin.com/company/techstars/",[214],[367796],{"type":23,"value":367797},"Techstars",{"type":23,"value":367799}," companies: $10,000 credit towards any Unified.to subscription plan for six months.",{"type":17,"tag":29,"props":367801,"children":367802},{},[367803],{"type":23,"value":367804},"Our plans are all usage-based per API request, and include:",{"type":17,"tag":80,"props":367806,"children":367807},{},[367808,367813,367818],{"type":17,"tag":84,"props":367809,"children":367810},{},[367811],{"type":23,"value":367812},"Access to 100+ integrations",{"type":17,"tag":84,"props":367814,"children":367815},{},[367816],{"type":23,"value":367817},"200,000 - 4M+ API requests",{"type":17,"tag":84,"props":367819,"children":367820},{},[367821,367823,367827],{"type":23,"value":367822},"Unlimited customer connections, API data transfers, ",{"type":17,"tag":133,"props":367824,"children":367825},{"href":4999},[367826],{"type":23,"value":5002},{"type":23,"value":367828},", and environments",{"type":17,"tag":29,"props":367830,"children":367831},{},[367832],{"type":23,"value":367833},"Unified.to offers flexibility and scalability to support your growth. If you're a Techstars company looking to expedite integration launches and maximize your revenue potential, don't hesitate to reach out to us for more information.",{"type":17,"tag":29,"props":367835,"children":367836},{},[367837],{"type":17,"tag":133,"props":367838,"children":367840},{"href":215330,"rel":367839},[214],[367841],{"type":23,"value":367842},"Email us to redeem your exclusive Techstars credit",{"type":17,"tag":29,"props":367844,"children":367845},{},[367846],{"type":23,"value":367847},"Thanks for reading!",{"type":17,"tag":68,"props":367849,"children":367851},{"id":367850},"experience-unifiedto-for-yourself-create-a-tester-account-in-seconds",[367852],{"type":17,"tag":133,"props":367853,"children":367855},{"href":158861,"rel":367854},[214],[367856],{"type":17,"tag":48,"props":367857,"children":367858},{},[367859],{"type":23,"value":367860},"Experience Unified.to for yourself. Create a tester account in seconds.",{"title":7,"searchDepth":1629,"depth":1629,"links":367862},[367863,367864,367865,367866,367867],{"id":366451,"depth":1629,"text":366454},{"id":367436,"depth":1629,"text":367439},{"id":367625,"depth":1629,"text":366601},{"id":367720,"depth":1629,"text":367723},{"id":367850,"depth":1629,"text":367860},"content:blog:unified_july_2023_product_updates.md","blog/unified_july_2023_product_updates.md","blog/unified_july_2023_product_updates",{"_path":367872,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":367873,"description":367874,"img":367875,"date":367876,"tag":12,"body":367877,"_type":1677,"_id":368115,"_source":1679,"_file":368116,"_stem":368117,"_extension":1682},"/blog/how_we_built_it_100_integrations","How we built it: 100 integrations","As co-founder and CEO at Unified, the Unified API development platform for B2B customer-facing integrations, I've been singularly obsessive, since our company...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_we_built_it_100_integrations-icon.png","2023-07-20T00:00:00.000Z",{"type":14,"children":367878,"toc":368109},[367879,367884,367887,367895,367912,367920,367931,367936,367941,367946,367960,367968,367979,367984,367989,367994,368000,368011,368016,368021,368026,368032,368037,368042,368047,368052,368057,368063,368068,368073,368078,368087,368092],{"type":17,"tag":18,"props":367880,"children":367882},{"id":367881},"how-we-built-it-100-integrations",[367883],{"type":23,"value":367873},{"type":17,"tag":25,"props":367885,"children":367886},{},[],{"type":17,"tag":29,"props":367888,"children":367889},{},[367890],{"type":17,"tag":33,"props":367891,"children":367892},{},[367893],{"type":23,"value":367894},"July 20, 2023",{"type":17,"tag":29,"props":367896,"children":367897},{},[367898,367899,367907],{"type":23,"value":365029},{"type":17,"tag":133,"props":367900,"children":367902},{"href":337505,"rel":367901},[214],[367903],{"type":17,"tag":48,"props":367904,"children":367905},{},[367906],{"type":23,"value":337509},{"type":17,"tag":48,"props":367908,"children":367909},{},[367910],{"type":23,"value":367911},", CEO at Unified",{"type":17,"tag":29,"props":367913,"children":367914},{},[367915],{"type":17,"tag":6438,"props":367916,"children":367919},{"alt":367917,"src":367918},"Blog-Unified-100-Integrations.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_we_built_it_100_integrations-0.png",[],{"type":17,"tag":29,"props":367921,"children":367922},{},[367923,367925,367929],{"type":23,"value":367924},"As co-founder and CEO at Unified, the ",{"type":17,"tag":133,"props":367926,"children":367927},{"href":7691},[367928],{"type":23,"value":7806},{"type":23,"value":367930}," development platform for B2B customer-facing integrations, I've been singularly obsessive, since our company launched earlier this year, about expanding our pre-built integrations suite as fast as possible.",{"type":17,"tag":29,"props":367932,"children":367933},{},[367934],{"type":23,"value":367935},"I'm proud to share that our team has successfully built 100 integrations to our Unified API spanning HR, ATS, CRM, Marketing, Ticketing, Enrichment, and Call Center categories in under six months. To add perspective, it typically takes a development team several months to build a single integration.",{"type":17,"tag":29,"props":367937,"children":367938},{},[367939],{"type":23,"value":367940},"And when I say we've built this many integrations, I mean it. Each of the 100 integrations (Workday, BambooHR, Greenhouse, etc.) is live, in production, and can be added to our customers' applications today.",{"type":17,"tag":29,"props":367942,"children":367943},{},[367944],{"type":23,"value":367945},"Here's what one of our customers had to say:",{"type":17,"tag":29,"props":367947,"children":367948},{},[367949],{"type":17,"tag":33,"props":367950,"children":367951},{},[367952,367954,367958],{"type":23,"value":367953},"'Unified is impressively fast at responding to our integration requests and adding them within days. Humi is on a mission to become the ultimate streamlined HRIS platform for Canadians, and we are confident that offering integrations via Unified's ",{"type":17,"tag":133,"props":367955,"children":367956},{"href":55696},[367957],{"type":23,"value":55699},{"type":23,"value":367959}," will bring tremendous value to our customers.'",{"type":17,"tag":29,"props":367961,"children":367962},{},[367963],{"type":17,"tag":48,"props":367964,"children":367965},{},[367966],{"type":23,"value":367967},"Kevin Kliman, CEO at Humi",{"type":17,"tag":29,"props":367969,"children":367970},{},[367971,367973,367977],{"type":23,"value":367972},"One of the questions that I am asked most often is how ",{"type":17,"tag":33,"props":367974,"children":367975},{},[367976],{"type":23,"value":217772},{"type":23,"value":367978}," Unified has become this nimble at transforming a months-long and highly-intensive integration process into an afternoon project.",{"type":17,"tag":29,"props":367980,"children":367981},{},[367982],{"type":23,"value":367983},"The proficiency of our team stems from two pivotal elements: 20 years of integration-building experience and our rock-solid architecture.",{"type":17,"tag":29,"props":367985,"children":367986},{},[367987],{"type":23,"value":367988},"To truly solve the problem of customer-facing integrations, we rely on an architecture that allows us to build robust and reliable integrations. Our expertise helps us bypass some of the mistakes that inexperienced developers make, like hastily building an architecture that cannot scale as customer requests for more integrations start piling in (and they always do). We've also leveraged internal automation tools that generate code.",{"type":17,"tag":29,"props":367990,"children":367991},{},[367992],{"type":23,"value":367993},"Today, in honor of reaching our 100-integrations milestone, I'll walk you through some strategic approaches and critical decisions Unified made to get here.",{"type":17,"tag":68,"props":367995,"children":367997},{"id":367996},"decision-1-modern-architecture",[367998],{"type":23,"value":367999},"Decision 1: Modern Architecture",{"type":17,"tag":29,"props":368001,"children":368002},{},[368003,368005,368009],{"type":23,"value":368004},"We've built our architecture with high levels of abstraction. Anything that we can abstract, we abstract (e.g., ",{"type":17,"tag":133,"props":368006,"children":368007},{"href":4999},[368008],{"type":23,"value":5002},{"type":23,"value":368010},", authorization scopes, and data models). This approach ensures we can minimize the amount of code required to write for each integration and significantly reduces the surface area of where things can go wrong.",{"type":17,"tag":29,"props":368012,"children":368013},{},[368014],{"type":23,"value":368015},"Built upon decades of experience, our approach centers on the concept of 'schema-first'. Whenever we create a new category or object, our process begins with the data model as the foundation, and we expand from there. This method allows us to establish a solid structure that underpins all aspects of our systems.",{"type":17,"tag":29,"props":368017,"children":368018},{},[368019],{"type":23,"value":368020},"Another key element of our infrastructure is our advanced type system. It plays a crucial role in ensuring that incorrect states are not representable in our code-base. This degree of robustness and integrity extends across various components, including our data models, core integration architecture, and even our Unified API.",{"type":17,"tag":29,"props":368022,"children":368023},{},[368024],{"type":23,"value":368025},"As a result, we are able to develop and deliver new integrations with speed and reliability.",{"type":17,"tag":68,"props":368027,"children":368029},{"id":368028},"decision-2-unifying-merging",[368030],{"type":23,"value":368031},"Decision 2: Unifying > Merging",{"type":17,"tag":29,"props":368033,"children":368034},{},[368035],{"type":23,"value":368036},"We always start with designing schemas that work for the majority of our top integrations in any one category. We go deep, but ensure that we never have to adversely modify those schemas to break backwards-compatibility.",{"type":17,"tag":29,"props":368038,"children":368039},{},[368040],{"type":23,"value":368041},"We also make sure to not include fields that are unique to a small minority of integration vendors or include custom values that link to customer schemas. We do not have to modify our data models as we build new integrations, and developers don't need to do any custom data transformations when they implement new integrations in their applications.",{"type":17,"tag":29,"props":368043,"children":368044},{},[368045],{"type":23,"value":368046},"We normalize the format for each field no matter which integration it comes from, so our customers can rely on email fields being emails, date fields being ISO date strings, and addresses being a specific format. And finally, we enrich missing data into objects such as addresses.",{"type":17,"tag":29,"props":368048,"children":368049},{},[368050],{"type":23,"value":368051},"Our API is truly unified, which means we never touch the API or our data models when we build a new integration, except when expanding categories (e.g., HRIS or ATS) and the fields that we support (e.g., 'title' or 'created_at').",{"type":17,"tag":29,"props":368053,"children":368054},{},[368055],{"type":23,"value":368056},"We've also considered the entire developer integration workflow by unifying authorization, webhooks, and retry logic. With Unified, developers integrate once to add multiple integrations to their products, while Unified does all the heavy lifting.",{"type":17,"tag":68,"props":368058,"children":368060},{"id":368059},"decision-3-automate",[368061],{"type":23,"value":368062},"Decision 3: Automate",{"type":17,"tag":29,"props":368064,"children":368065},{},[368066],{"type":23,"value":368067},"One of the key factors driving the speed and efficiency of our development process is the strategic use of automation alongside our extensive integration expertise. We've developed proprietary tools to rapidly scaffold and generate code for new integrations to facilitate this. Our automation tools allow us to create new integrations within incredibly short timeframes, ranging from days to hours or even minutes.",{"type":17,"tag":29,"props":368069,"children":368070},{},[368071],{"type":23,"value":368072},"During a recent product demo with a prospect, we showcased our capabilities by swiftly building and deploying a critical integration request they had. In a matter of minutes, we fulfilled their deal-breaker requirement.",{"type":17,"tag":29,"props":368074,"children":368075},{},[368076],{"type":23,"value":368077},"The results speak for themselves. In the current quarter alone, we successfully shipped over 20 integrations within 30 days, demonstrating our commitment to prompt and reliable delivery.",{"type":17,"tag":68,"props":368079,"children":368080},{"id":366649},[368081,368082],{"type":23,"value":252596},{"type":17,"tag":33,"props":368083,"children":368084},{},[368085],{"type":23,"value":368086},"one API to integrate them all",{"type":17,"tag":29,"props":368088,"children":368089},{},[368090],{"type":23,"value":368091},"This winning combination of modern architecture, years of integration expertise, adherence to industry standards, and strategic use of internal automation tools allow us to speed up our integration development and provide our customers with the advantage of quickly incorporating our pre-built integrations into the products.",{"type":17,"tag":29,"props":368093,"children":368094},{},[368095,368097,368102,368103,368108],{"type":23,"value":368096},"We're excited to continue to innovate at Unified and solve hard, critical integration-related problems for our customers. If you're curious about Unified's integrations-as-a-service solution, consider ",{"type":17,"tag":133,"props":368098,"children":368100},{"href":158861,"rel":368099},[214],[368101],{"type":23,"value":363421},{"type":23,"value":75890},{"type":17,"tag":133,"props":368104,"children":368106},{"href":215330,"rel":368105},[214],[368107],{"type":23,"value":299181},{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":368110},[368111,368112,368113,368114],{"id":367996,"depth":1629,"text":367999},{"id":368028,"depth":1629,"text":368031},{"id":368059,"depth":1629,"text":368062},{"id":366649,"depth":1629,"text":366652},"content:blog:how_we_built_it_100_integrations.md","blog/how_we_built_it_100_integrations.md","blog/how_we_built_it_100_integrations",{"_path":368119,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":368120,"description":368121,"img":368122,"date":368123,"tag":12,"body":368124,"_type":1677,"_id":368493,"_source":1679,"_file":368494,"_stem":368495,"_extension":1682},"/blog/unified_june_2023_product_updates","Unified.to June 2023 Product Updates","It's been an eventful start to the summer at Unified.to. Here's how we've been helping software teams build and launch integrations lately.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_june_2023_product_updates-icon.png","2023-06-27T00:00:00.000Z",{"type":14,"children":368125,"toc":368488},[368126,368131,368134,368142,368146,368150,368155,368163,368167,368369,368381,368385,368393,368408,368418,368426,368434,368439,368447,368452,368460,368471,368479],{"type":17,"tag":18,"props":368127,"children":368129},{"id":368128},"unifiedto-june-2023-product-updates",[368130],{"type":23,"value":368120},{"type":17,"tag":25,"props":368132,"children":368133},{},[],{"type":17,"tag":29,"props":368135,"children":368136},{},[368137],{"type":17,"tag":33,"props":368138,"children":368139},{},[368140],{"type":23,"value":368141},"June 27, 2023",{"type":17,"tag":29,"props":368143,"children":368144},{},[368145],{"type":23,"value":368121},{"type":17,"tag":68,"props":368147,"children":368148},{"id":366451},[368149],{"type":23,"value":366454},{"type":17,"tag":29,"props":368151,"children":368152},{},[368153],{"type":23,"value":368154},"Over the 30 days, we've added 20 integrations. How? We've built an internal tool that leverages our years of experience, allowing us to ship integrations at record speeds. And we're only accelerating.",{"type":17,"tag":29,"props":368156,"children":368157},{},[368158],{"type":17,"tag":6438,"props":368159,"children":368162},{"alt":368160,"src":368161},"CleanShot_2023-06-27_at_16.21.442x.png","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_june_2023_product_updates-0.png",[],{"type":17,"tag":29,"props":368164,"children":368165},{},[368166],{"type":23,"value":354195},{"type":17,"tag":80,"props":368168,"children":368169},{},[368170,368180,368189,368198,368209,368218,368228,368237,368247,368257,368268,368277,368288,368299,368310,368319,368329,368338,368349,368360],{"type":17,"tag":84,"props":368171,"children":368172},{},[368173,368174],{"type":23,"value":367415},{"type":17,"tag":133,"props":368175,"children":368178},{"href":368176,"rel":368177},"https://www.linkedin.com/company/paycor/",[214],[368179],{"type":23,"value":58983},{"type":17,"tag":84,"props":368181,"children":368182},{},[368183,368184],{"type":23,"value":367384},{"type":17,"tag":133,"props":368185,"children":368187},{"href":361275,"rel":368186},[214],[368188],{"type":23,"value":56574},{"type":17,"tag":84,"props":368190,"children":368191},{},[368192,368193],{"type":23,"value":367415},{"type":17,"tag":133,"props":368194,"children":368196},{"href":353440,"rel":368195},[214],[368197],{"type":23,"value":59591},{"type":17,"tag":84,"props":368199,"children":368200},{},[368201,368202],{"type":23,"value":367415},{"type":17,"tag":133,"props":368203,"children":368206},{"href":368204,"rel":368205},"https://unified.to/integrations/jumpcloud",[214],[368207],{"type":23,"value":368208},"JumpCloud",{"type":17,"tag":84,"props":368210,"children":368211},{},[368212,368213],{"type":23,"value":367415},{"type":17,"tag":133,"props":368214,"children":368216},{"href":361167,"rel":368215},[214],[368217],{"type":23,"value":361171},{"type":17,"tag":84,"props":368219,"children":368220},{},[368221,368223],{"type":23,"value":368222},"Marketing integration: ",{"type":17,"tag":133,"props":368224,"children":368226},{"href":367148,"rel":368225},[214],[368227],{"type":23,"value":192306},{"type":17,"tag":84,"props":368229,"children":368230},{},[368231,368232],{"type":23,"value":367415},{"type":17,"tag":133,"props":368233,"children":368235},{"href":364897,"rel":368234},[214],[368236],{"type":23,"value":364901},{"type":17,"tag":84,"props":368238,"children":368239},{},[368240,368242],{"type":23,"value":368241},"HR/ATS integration: ",{"type":17,"tag":133,"props":368243,"children":368245},{"href":353528,"rel":368244},[214],[368246],{"type":23,"value":366142},{"type":17,"tag":84,"props":368248,"children":368249},{},[368250,368251],{"type":23,"value":367415},{"type":17,"tag":133,"props":368252,"children":368255},{"href":368253,"rel":368254},"https://unified.to/integrations/humaans",[214],[368256],{"type":23,"value":60939},{"type":17,"tag":84,"props":368258,"children":368259},{},[368260,368261],{"type":23,"value":367415},{"type":17,"tag":133,"props":368262,"children":368265},{"href":368263,"rel":368264},"https://unified.to/integrations/alexis",[214],[368266],{"type":23,"value":368267},"Alexis",{"type":17,"tag":84,"props":368269,"children":368270},{},[368271,368272],{"type":23,"value":367415},{"type":17,"tag":133,"props":368273,"children":368275},{"href":353537,"rel":368274},[214],[368276],{"type":23,"value":353541},{"type":17,"tag":84,"props":368278,"children":368279},{},[368280,368281],{"type":23,"value":367415},{"type":17,"tag":133,"props":368282,"children":368285},{"href":368283,"rel":368284},"https://unified.to/integrations/engagedly",[214],[368286],{"type":23,"value":368287},"Engagedly",{"type":17,"tag":84,"props":368289,"children":368290},{},[368291,368293],{"type":23,"value":368292},"ATS integration: ",{"type":17,"tag":133,"props":368294,"children":368297},{"href":368295,"rel":368296},"https://www.linkedin.com/company/zohorecruit/",[214],[368298],{"type":23,"value":75344},{"type":17,"tag":84,"props":368300,"children":368301},{},[368302,368304],{"type":23,"value":368303},"CRM integration: ",{"type":17,"tag":133,"props":368305,"children":368307},{"href":361618,"rel":368306},[214],[368308],{"type":23,"value":368309},"Zendesk Sell",{"type":17,"tag":84,"props":368311,"children":368312},{},[368313,368314],{"type":23,"value":368303},{"type":17,"tag":133,"props":368315,"children":368317},{"href":361560,"rel":368316},[214],[368318],{"type":23,"value":361564},{"type":17,"tag":84,"props":368320,"children":368321},{},[368322,368323],{"type":23,"value":368303},{"type":17,"tag":133,"props":368324,"children":368327},{"href":368325,"rel":368326},"https://www.linkedin.com/company/pipedrive/",[214],[368328],{"type":23,"value":26530},{"type":17,"tag":84,"props":368330,"children":368331},{},[368332,368333],{"type":23,"value":367415},{"type":17,"tag":133,"props":368334,"children":368336},{"href":353565,"rel":368335},[214],[368337],{"type":23,"value":353569},{"type":17,"tag":84,"props":368339,"children":368340},{},[368341,368342],{"type":23,"value":367384},{"type":17,"tag":133,"props":368343,"children":368346},{"href":368344,"rel":368345},"https://unified.to/integrations/fountain",[214],[368347],{"type":23,"value":368348},"Fountain",{"type":17,"tag":84,"props":368350,"children":368351},{},[368352,368353],{"type":23,"value":367384},{"type":17,"tag":133,"props":368354,"children":368357},{"href":368355,"rel":368356},"https://unified.to/integrations/paradox",[214],[368358],{"type":23,"value":368359},"Paradox",{"type":17,"tag":84,"props":368361,"children":368362},{},[368363,368364],{"type":23,"value":368241},{"type":17,"tag":133,"props":368365,"children":368367},{"href":361252,"rel":368366},[214],[368368],{"type":23,"value":59367},{"type":17,"tag":29,"props":368370,"children":368371},{},[368372,368374,368380],{"type":23,"value":368373},"This is just a snapshot of our expanding integrations library. ",{"type":17,"tag":133,"props":368375,"children":368377},{"href":87026,"rel":368376},[214],[368378],{"type":23,"value":368379},"See more",{"type":23,"value":54},{"type":17,"tag":68,"props":368382,"children":368383},{"id":367436},[368384],{"type":23,"value":367439},{"type":17,"tag":29,"props":368386,"children":368387},{},[368388],{"type":17,"tag":48,"props":368389,"children":368390},{},[368391],{"type":23,"value":368392},"1. Sandbox environments",{"type":17,"tag":29,"props":368394,"children":368395},{},[368396,368398,368406],{"type":23,"value":368397},"We've enhanced our Mock API, which can be easily accessed in your Unified.to account under ",{"type":17,"tag":33,"props":368399,"children":368400},{},[368401],{"type":17,"tag":48,"props":368402,"children":368403},{},[368404],{"type":23,"value":368405},"Settings > Workspace > Environments",{"type":23,"value":368407},". Our Mock API returns mock (or fake) data so developers can see the data model in action. So now, in addition to Production, you also have the option to use a Sandbox environment. Add env=Sandbox query parameter to your API calls to get mock data.",{"type":17,"tag":29,"props":368409,"children":368410},{},[368411],{"type":17,"tag":133,"props":368412,"children":368415},{"href":368413,"rel":368414},"https://unified.to/blog/set_environments_for_your_unified_workspace",[214],[368416],{"type":23,"value":368417},"Learn more about environments",{"type":17,"tag":29,"props":368419,"children":368420},{},[368421],{"type":17,"tag":48,"props":368422,"children":368423},{},[368424],{"type":23,"value":368425},"2. Multilingual authorization",{"type":17,"tag":29,"props":368427,"children":368428},{},[368429],{"type":17,"tag":6438,"props":368430,"children":368433},{"alt":368431,"src":368432},"Greenhouse authorization page in French","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_june_2023_product_updates-1.png",[],{"type":17,"tag":29,"props":368435,"children":368436},{},[368437],{"type":23,"value":368438},"Hello! ¡Hola! Bonjour! Our authorization experience now auto-detects browser language, which creates a localized integrations experience for your users. You also have the option to set the language by using the \"lang\" query parameter in the URL. Available languages include English (en), French (fr), Spanish (es), Portuguese (pt), Italian (it), Simplified Chinese (zh), and Hindi (hindi).",{"type":17,"tag":29,"props":368440,"children":368441},{},[368442],{"type":17,"tag":48,"props":368443,"children":368444},{},[368445],{"type":23,"value":368446},"3. Interview scorecard objects",{"type":17,"tag":29,"props":368448,"children":368449},{},[368450],{"type":23,"value":368451},"Integration breadth without depth means very little. That's why we're constantly working to expand the objects and fields we support, so you can build more complete SaaS solutions. We've added the interview scorecard object to our ATS integrations. The interview scorecard provides recruiters and hiring managers with a standardized format for evaluating candidates.",{"type":17,"tag":29,"props":368453,"children":368454},{},[368455],{"type":17,"tag":48,"props":368456,"children":368457},{},[368458],{"type":23,"value":368459},"4. App design refresh",{"type":17,"tag":29,"props":368461,"children":368462},{},[368463,368465],{"type":23,"value":368464},"We've made some design enhancements to our website and app. Our new app also features brand new onboarding that will have you calling your first API in just minutes. Test out Unified.to for yourself: ",{"type":17,"tag":133,"props":368466,"children":368468},{"href":158861,"rel":368467},[214],[368469],{"type":23,"value":368470},"Create a free account in seconds",{"type":17,"tag":29,"props":368472,"children":368473},{},[368474],{"type":17,"tag":6438,"props":368475,"children":368478},{"alt":368476,"src":368477},"Unified.to embedded integrations directory preview","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_june_2023_product_updates-2.png",[],{"type":17,"tag":68,"props":368480,"children":368481},{"id":367850},[368482],{"type":17,"tag":133,"props":368483,"children":368485},{"href":158861,"rel":368484},[214],[368486],{"type":23,"value":368487},"Experience Unified.to for yourself. Create a tester account in seconds. ",{"title":7,"searchDepth":1629,"depth":1629,"links":368489},[368490,368491,368492],{"id":366451,"depth":1629,"text":366454},{"id":367436,"depth":1629,"text":367439},{"id":367850,"depth":1629,"text":368487},"content:blog:unified_june_2023_product_updates.md","blog/unified_june_2023_product_updates.md","blog/unified_june_2023_product_updates",{"_path":368497,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":368498,"description":368499,"img":368500,"date":368501,"tag":6341,"body":368502,"_type":1677,"_id":368958,"_source":1679,"_file":368959,"_stem":368960,"_extension":1682},"/blog/set_environments_for_your_unified_workspace","Set Environments for your Unified.to Workspace","We're eager to share the release of environments, a new feature that makes it easier to test and customize your integrations before releasing them to...","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-icon.png","2023-06-07T00:00:00.000Z",{"type":14,"children":368503,"toc":368949},[368504,368509,368512,368520,368530,368543,368549,368554,368559,368567,368573,368616,368622,368655,368661,368666,368674,368685,368690,368698,368709,368714,368722,368733,368738,368746,368757,368762,368768,368773,368781,368810,368818,368876,368882,368887,368916,368921,368927,368932,368937],{"type":17,"tag":18,"props":368505,"children":368507},{"id":368506},"set-environments-for-your-unifiedto-workspace",[368508],{"type":23,"value":368498},{"type":17,"tag":25,"props":368510,"children":368511},{},[],{"type":17,"tag":29,"props":368513,"children":368514},{},[368515],{"type":17,"tag":33,"props":368516,"children":368517},{},[368518],{"type":23,"value":368519},"June 7, 2023",{"type":17,"tag":29,"props":368521,"children":368522},{},[368523,368525,368529],{"type":23,"value":368524},"We're eager to share the release of environments, a new feature that makes it easier to test and customize your integrations before releasing them to production. For example, you can create environments for staging and production, which gives you more control over testing integrations with our ",{"type":17,"tag":133,"props":368526,"children":368527},{"href":7691},[368528],{"type":23,"value":7806},{"type":23,"value":54},{"type":17,"tag":29,"props":368531,"children":368532},{},[368533],{"type":17,"tag":133,"props":368534,"children":368537},{"href":368535,"rel":368536},"https://app.unified.to/?utm_source=blog&utm_medium=blog&utm_campaign=environments&utm_content=environments_blog",[214],[368538],{"type":17,"tag":48,"props":368539,"children":368540},{},[368541],{"type":23,"value":368542},"Try it now",{"type":17,"tag":68,"props":368544,"children":368546},{"id":368545},"what-is-an-environment",[368547],{"type":23,"value":368548},"What is an environment?",{"type":17,"tag":29,"props":368550,"children":368551},{},[368552],{"type":23,"value":368553},"Environments are configurable spaces that allow you to specify different integration credentials for different circumstances. Determine distinct access and configuration rules for various scenarios, such as production, staging, and testing, which gives you more flexibility and control over managing your release processes.",{"type":17,"tag":29,"props":368555,"children":368556},{},[368557],{"type":23,"value":368558},"Environments can be added under any plan in your Unified.to account's Workspace.",{"type":17,"tag":29,"props":368560,"children":368561},{},[368562],{"type":17,"tag":6438,"props":368563,"children":368566},{"alt":368564,"src":368565},"UnifiedAPI_Environments.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-0.png",[],{"type":17,"tag":68,"props":368568,"children":368570},{"id":368569},"capabilities-of-environments",[368571],{"type":23,"value":368572},"Capabilities of environments",{"type":17,"tag":80,"props":368574,"children":368575},{},[368576,368586,368596,368606],{"type":17,"tag":84,"props":368577,"children":368578},{},[368579,368584],{"type":17,"tag":48,"props":368580,"children":368581},{},[368582],{"type":23,"value":368583},"Integration testing:",{"type":23,"value":368585}," Before releasing integrations to production, you can now test them in a different environment.",{"type":17,"tag":84,"props":368587,"children":368588},{},[368589,368594],{"type":17,"tag":48,"props":368590,"children":368591},{},[368592],{"type":23,"value":368593},"Multiple environments:",{"type":23,"value":368595}," You can set up multiple environments such as production, staging, and others personalized to you and your team's needs.",{"type":17,"tag":84,"props":368597,"children":368598},{},[368599,368604],{"type":17,"tag":48,"props":368600,"children":368601},{},[368602],{"type":23,"value":368603},"Environment-specific integrations:",{"type":23,"value":368605}," You can now decide which integrations are active in each environment.",{"type":17,"tag":84,"props":368607,"children":368608},{},[368609,368614],{"type":17,"tag":48,"props":368610,"children":368611},{},[368612],{"type":23,"value":368613},"Application credential assignment:",{"type":23,"value":368615}," Choose which application credentials to use for each integration in each environment.",{"type":17,"tag":68,"props":368617,"children":368619},{"id":368618},"benefits-of-environments",[368620],{"type":23,"value":368621},"Benefits of environments",{"type":17,"tag":80,"props":368623,"children":368624},{},[368625,368635,368645],{"type":17,"tag":84,"props":368626,"children":368627},{},[368628,368633],{"type":17,"tag":48,"props":368629,"children":368630},{},[368631],{"type":23,"value":368632},"Greater flexibility:",{"type":23,"value":368634}," You can tailor your integrations to meet the unique needs of each environment including client specifications.",{"type":17,"tag":84,"props":368636,"children":368637},{},[368638,368643],{"type":17,"tag":48,"props":368639,"children":368640},{},[368641],{"type":23,"value":368642},"Reduced errors:",{"type":23,"value":368644}," Testing integrations in a staging environment before moving them to production helps minimize mistakes and unexpected errors.",{"type":17,"tag":84,"props":368646,"children":368647},{},[368648,368653],{"type":17,"tag":48,"props":368649,"children":368650},{},[368651],{"type":23,"value":368652},"Increased productivity:",{"type":23,"value":368654}," This feature streamlines the management of your workspace, reducing time spent on setup and adjustments.",{"type":17,"tag":68,"props":368656,"children":368658},{"id":368657},"when-to-use-multiple-environments",[368659],{"type":23,"value":368660},"When to use multiple environments",{"type":17,"tag":29,"props":368662,"children":368663},{},[368664],{"type":23,"value":368665},"Set multiple environments regardless of what plan you're on for different scenarios:",{"type":17,"tag":29,"props":368667,"children":368668},{},[368669],{"type":17,"tag":48,"props":368670,"children":368671},{},[368672],{"type":23,"value":368673},"1. Localhost",{"type":17,"tag":29,"props":368675,"children":368676},{},[368677],{"type":17,"tag":33,"props":368678,"children":368679},{},[368680],{"type":17,"tag":48,"props":368681,"children":368682},{},[368683],{"type":23,"value":368684},"Create a sandbox environment without disrupting your team's workflow or end-user experience",{"type":17,"tag":29,"props":368686,"children":368687},{},[368688],{"type":23,"value":368689},"Example: Suppose Laura, a developer, is working on integrating a new batch of HR services. She creates her own personal authentication environment within Unified.to, complete with application credentials specific to her environment. This allows Laura to experiment freely without affecting her app's live features or her fellow developers' work.",{"type":17,"tag":29,"props":368691,"children":368692},{},[368693],{"type":17,"tag":48,"props":368694,"children":368695},{},[368696],{"type":23,"value":368697},"2. Testing or QA",{"type":17,"tag":29,"props":368699,"children":368700},{},[368701],{"type":17,"tag":33,"props":368702,"children":368703},{},[368704],{"type":17,"tag":48,"props":368705,"children":368706},{},[368707],{"type":23,"value":368708},"Try out new integrations and run tests before releasing them to production",{"type":17,"tag":29,"props":368710,"children":368711},{},[368712],{"type":23,"value":368713},"Example: Once Laura has completed her initial development work, she simply copies the credentials to the testing environment. This environment has its own set of credentials and often uses mocked or dummy data for testing purposes. In this stage, Laura and her team run a battery of tests to ensure the new HR integrations work as expected and don't disrupt other functionalities within the app.",{"type":17,"tag":29,"props":368715,"children":368716},{},[368717],{"type":17,"tag":48,"props":368718,"children":368719},{},[368720],{"type":23,"value":368721},"3. Staging",{"type":17,"tag":29,"props":368723,"children":368724},{},[368725],{"type":17,"tag":33,"props":368726,"children":368727},{},[368728],{"type":17,"tag":48,"props":368729,"children":368730},{},[368731],{"type":23,"value":368732},"Mirror your production environment to finely-tune performance and perform final tests",{"type":17,"tag":29,"props":368734,"children":368735},{},[368736],{"type":23,"value":368737},"Example: After the new HR integrations pass all tests in the testing environment, it's promoted to the staging environment. This environment is a mirror image of the production environment, complete with the same application credentials used in production. The HR integrations are tested under conditions that closely mimic the live application. This final testing phase ensures the new batch of integrations are ready for deployment in the production environment.",{"type":17,"tag":29,"props":368739,"children":368740},{},[368741],{"type":17,"tag":48,"props":368742,"children":368743},{},[368744],{"type":23,"value":368745},"4. Production",{"type":17,"tag":29,"props":368747,"children":368748},{},[368749],{"type":17,"tag":33,"props":368750,"children":368751},{},[368752],{"type":17,"tag":48,"props":368753,"children":368754},{},[368755],{"type":23,"value":368756},"Your live environment where your integrations run and are available to end-users",{"type":17,"tag":29,"props":368758,"children":368759},{},[368760],{"type":23,"value":368761},"Example: This is the live environment where the application operates, interacts with real data, and serves actual users. It uses production application credentials. With the successful deployment of the new HR integrations, all users of the app can now benefit from the new integrations Laura has been working on.",{"type":17,"tag":68,"props":368763,"children":368765},{"id":368764},"how-to-set-new-environments",[368766],{"type":23,"value":368767},"How to set new environments",{"type":17,"tag":29,"props":368769,"children":368770},{},[368771],{"type":23,"value":368772},"Implement this new feature in seconds. Follow these steps:",{"type":17,"tag":29,"props":368774,"children":368775},{},[368776],{"type":17,"tag":48,"props":368777,"children":368778},{},[368779],{"type":23,"value":368780},"Setting up Environments",{"type":17,"tag":6154,"props":368782,"children":368783},{},[368784,368794,368805],{"type":17,"tag":84,"props":368785,"children":368786},{},[368787,368789],{"type":23,"value":368788},"Log in to or create a ",{"type":17,"tag":133,"props":368790,"children":368792},{"href":368535,"rel":368791},[214],[368793],{"type":23,"value":340413},{"type":17,"tag":84,"props":368795,"children":368796},{},[368797,368798,368803],{"type":23,"value":6661},{"type":17,"tag":48,"props":368799,"children":368800},{},[368801],{"type":23,"value":368802},"Workspace Settings",{"type":23,"value":368804}," and insert the name of your new environment, (e.g., 'Staging') and press enter",{"type":17,"tag":84,"props":368806,"children":368807},{},[368808],{"type":23,"value":368809},"Once entered, your environment can be used for configuring individual integrations and generating an Embedded Directory",{"type":17,"tag":29,"props":368811,"children":368812},{},[368813],{"type":17,"tag":48,"props":368814,"children":368815},{},[368816],{"type":23,"value":368817},"Configuring Integrations",{"type":17,"tag":6154,"props":368819,"children":368820},{},[368821,368839,368858,368871],{"type":17,"tag":84,"props":368822,"children":368823},{},[368824,368825,368829,368831,368834],{"type":23,"value":42939},{"type":17,"tag":48,"props":368826,"children":368827},{},[368828],{"type":23,"value":42944},{"type":23,"value":368830}," and click ACTIVATE on any integration, for example, Workday",{"type":17,"tag":3891,"props":368832,"children":368833},{},[],{"type":17,"tag":6438,"props":368835,"children":368838},{"alt":368836,"src":368837},"CleanShot_2023-06-08_at_09.12.242x.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-1.png",[],{"type":17,"tag":84,"props":368840,"children":368841},{},[368842,368844,368848,368850,368853],{"type":23,"value":368843},"From the dropdown menu, select the environment where you to want to add credentials, such ",{"type":17,"tag":133,"props":368845,"children":368846},{"href":779},[368847],{"type":23,"value":782},{"type":23,"value":368849}," Client ID and Secret",{"type":17,"tag":3891,"props":368851,"children":368852},{},[],{"type":17,"tag":6438,"props":368854,"children":368857},{"alt":368855,"src":368856},"Workday_Environment_Selection.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-2.png",[],{"type":17,"tag":84,"props":368859,"children":368860},{},[368861,368863,368866],{"type":23,"value":368862},"Input your credentials for Workday for the selected environment and click ACTIVATE",{"type":17,"tag":3891,"props":368864,"children":368865},{},[],{"type":17,"tag":6438,"props":368867,"children":368870},{"alt":368868,"src":368869},"Note: If you are activating an integration that supports API key and doesn't require OAuth credentials, then you can just click ACTIVATE.","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-3.png",[],{"type":17,"tag":84,"props":368872,"children":368873},{},[368874],{"type":23,"value":368875},"Repeat for any integration and environment",{"type":17,"tag":68,"props":368877,"children":368879},{"id":368878},"embed-directory",[368880],{"type":23,"value":368881},"Embed Directory",{"type":17,"tag":29,"props":368883,"children":368884},{},[368885],{"type":23,"value":368886},"After enabling integrations for a specific environment, you can generate an Embedded Directory for that environment.",{"type":17,"tag":6154,"props":368888,"children":368889},{},[368890,368903],{"type":17,"tag":84,"props":368891,"children":368892},{},[368893,368895,368898],{"type":23,"value":368894},"Select the desired authentication environment from the dropdown menu.",{"type":17,"tag":3891,"props":368896,"children":368897},{},[],{"type":17,"tag":6438,"props":368899,"children":368902},{"alt":368900,"src":368901},"Embedded_Directory_Environment.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-4.png",[],{"type":17,"tag":84,"props":368904,"children":368905},{},[368906,368908,368911],{"type":23,"value":368907},"This will generate a script with a new environment parameter for you.",{"type":17,"tag":3891,"props":368909,"children":368910},{},[],{"type":17,"tag":6438,"props":368912,"children":368915},{"alt":368913,"src":368914},"Directory_Script.png","https://s3.us-east-2.amazonaws.com/unified-article-images/set_environments_for_your_unified_workspace-5.png",[],{"type":17,"tag":29,"props":368917,"children":368918},{},[368919],{"type":23,"value":368920},"If you're using our API to pull a list of active integrations for your directory, you can pass the environment query parameter to retrieve the correct integrations.",{"type":17,"tag":68,"props":368922,"children":368924},{"id":368923},"building-the-ultimate-unified-api-solution-for-integrations",[368925],{"type":23,"value":368926},"Building the ultimate Unified API solution for integrations",{"type":17,"tag":29,"props":368928,"children":368929},{},[368930],{"type":23,"value":368931},"This new authentication environment feature is just one of the many ways we're making Unified.to work better for developers who want to build API-first integrations with industry-leading HR, Sales, Marketing, and Support apps. We're excited for you to try Authentication Environments and see the difference it makes in managing your integrations pre-launch.",{"type":17,"tag":29,"props":368933,"children":368934},{},[368935],{"type":23,"value":368936},"Our team is here to support you every step of the way. Enjoy exploring Unified.to and let us know if you need a hand.",{"type":17,"tag":29,"props":368938,"children":368939},{},[368940,368942,368948],{"type":23,"value":368941},"You can try setting Unified.to's Authentication Environments at ",{"type":17,"tag":133,"props":368943,"children":368945},{"href":368535,"rel":368944},[214],[368946],{"type":23,"value":368947},"unified.to/get-started",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":368950},[368951,368952,368953,368954,368955,368956,368957],{"id":368545,"depth":1629,"text":368548},{"id":368569,"depth":1629,"text":368572},{"id":368618,"depth":1629,"text":368621},{"id":368657,"depth":1629,"text":368660},{"id":368764,"depth":1629,"text":368767},{"id":368878,"depth":1629,"text":368881},{"id":368923,"depth":1629,"text":368926},"content:blog:set_environments_for_your_unified_workspace.md","blog/set_environments_for_your_unified_workspace.md","blog/set_environments_for_your_unified_workspace",{"_path":368962,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":368963,"description":368964,"img":368965,"date":368966,"tag":12,"body":368967,"_type":1677,"_id":369404,"_source":1679,"_file":369405,"_stem":369406,"_extension":1682},"/blog/unified_may_2023_product_updates","Unified.to May 2023 Product Updates","This month's product release roundup brings you new pre-built HRIS and ATS integrations, enhanced job fields, and updates to our Passthrough API!","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_may_2023_product_updates-icon.png","2023-05-31T00:00:00.000Z",{"type":14,"children":368968,"toc":369398},[368969,368974,368977,368985,368989,368996,369002,369007,369069,369080,369089,369096,369102,369114,369125,369130,369174,369179,369190,369197,369203,369223,369233,369276,369281,369291,369298,369303,369334,369339,369349,369355,369360,369365,369383,369388],{"type":17,"tag":18,"props":368970,"children":368972},{"id":368971},"unifiedto-may-2023-product-updates",[368973],{"type":23,"value":368963},{"type":17,"tag":25,"props":368975,"children":368976},{},[],{"type":17,"tag":29,"props":368978,"children":368979},{},[368980],{"type":17,"tag":33,"props":368981,"children":368982},{},[368983],{"type":23,"value":368984},"May 31, 2023",{"type":17,"tag":29,"props":368986,"children":368987},{},[368988],{"type":23,"value":368964},{"type":17,"tag":29,"props":368990,"children":368991},{},[368992],{"type":17,"tag":6438,"props":368993,"children":368995},{"alt":318119,"src":368994},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_may_2023_product_updates-0.png",[],{"type":17,"tag":68,"props":368997,"children":368999},{"id":368998},"enhanced-unified-mode-for-ats-jobs",[369000],{"type":23,"value":369001},"Enhanced Unified Mode for ATS Jobs",{"type":17,"tag":29,"props":369003,"children":369004},{},[369005],{"type":23,"value":369006},"Developers building HR, job boards, and recruitment software can now benefit from the latest enhancement to our unified mode for ATS jobs with six new essential fields!",{"type":17,"tag":6154,"props":369008,"children":369009},{},[369010,369020,369030,369039,369049,369059],{"type":17,"tag":84,"props":369011,"children":369012},{},[369013,369018],{"type":17,"tag":48,"props":369014,"children":369015},{},[369016],{"type":23,"value":369017},"Addresses",{"type":23,"value":369019},": Effortlessly manage a comprehensive list of job locations, so you can build intuitive user interfaces and enhance candidate engagement.",{"type":17,"tag":84,"props":369021,"children":369022},{},[369023,369028],{"type":17,"tag":48,"props":369024,"children":369025},{},[369026],{"type":23,"value":369027},"Compensation",{"type":23,"value":369029},": Help candidates make informed decisions by incorporating salary and compensation details.",{"type":17,"tag":84,"props":369031,"children":369032},{},[369033,369037],{"type":17,"tag":48,"props":369034,"children":369035},{},[369036],{"type":23,"value":59228},{"type":23,"value":369038},": Easily designate if a job is remote to attract a wider talent pool of candidates.",{"type":17,"tag":84,"props":369040,"children":369041},{},[369042,369047],{"type":17,"tag":48,"props":369043,"children":369044},{},[369045],{"type":23,"value":369046},"Employment_type",{"type":23,"value":369048},": Ensure accurate filtering and candidate matching by specifying whether a position is full-time or part-time.",{"type":17,"tag":84,"props":369050,"children":369051},{},[369052,369057],{"type":17,"tag":48,"props":369053,"children":369054},{},[369055],{"type":23,"value":369056},"Departments:",{"type":23,"value":369058}," Categorize job listing based on functional area to ensure efficient job management and targeted searches.",{"type":17,"tag":84,"props":369060,"children":369061},{},[369062,369067],{"type":17,"tag":48,"props":369063,"children":369064},{},[369065],{"type":23,"value":369066},"Language",{"type":23,"value":369068},": Outline the required language proficiency for any position to source candidates with specific language skills.",{"type":17,"tag":29,"props":369070,"children":369071},{},[369072,369074,369078],{"type":23,"value":369073},"Our Unified ",{"type":17,"tag":133,"props":369075,"children":369076},{"href":55696},[369077],{"type":23,"value":55699},{"type":23,"value":369079}," gives you the tools to create a more comprehensive and targeted hiring experience.",{"type":17,"tag":29,"props":369081,"children":369082},{},[369083],{"type":17,"tag":133,"props":369084,"children":369087},{"href":369085,"rel":369086},"https://unified.to/ats?utm_source=linkedin&utm_campaign=may_update&utm_content=Unified_ATS",[214],[369088],{"type":23,"value":332558},{"type":17,"tag":29,"props":369090,"children":369091},{},[369092],{"type":17,"tag":6438,"props":369093,"children":369095},{"alt":318119,"src":369094},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_may_2023_product_updates-1.png",[],{"type":17,"tag":68,"props":369097,"children":369099},{"id":369098},"new-ats-integration-plum",[369100],{"type":23,"value":369101},"New ATS Integration: Plum",{"type":17,"tag":29,"props":369103,"children":369104},{},[369105,369112],{"type":17,"tag":133,"props":369106,"children":369109},{"href":369107,"rel":369108},"https://unified.to/integrations/plum",[214],[369110],{"type":23,"value":369111},"Plum",{"type":23,"value":369113}," is the latest integration to join our Unified ATS API. Plum is a talent assessment platform that provides organizations with objective data to reduce bias in talent decisions.",{"type":17,"tag":29,"props":369115,"children":369116},{},[369117,369119,369123],{"type":23,"value":369118},"Our Unified ATS API enables you to list, get, update, create, and delete candidates, jobs, interviews, and documents using one ",{"type":17,"tag":133,"props":369120,"children":369121},{"href":7691},[369122],{"type":23,"value":7459},{"type":23,"value":369124}," and data model. Enhance your product with the leading ATS apps without dealing with multiple APIs and complex maintenance.",{"type":17,"tag":29,"props":369126,"children":369127},{},[369128],{"type":23,"value":369129},"In addition to Plum, our Unified ATS API has pre-built integrations with several ATS apps, including:",{"type":17,"tag":80,"props":369131,"children":369132},{},[369133,369142,369150,369158,369166],{"type":17,"tag":84,"props":369134,"children":369135},{},[369136],{"type":17,"tag":133,"props":369137,"children":369139},{"href":361302,"rel":369138},[214],[369140],{"type":23,"value":369141},"Breezy HR",{"type":17,"tag":84,"props":369143,"children":369144},{},[369145],{"type":17,"tag":133,"props":369146,"children":369148},{"href":337814,"rel":369147},[214],[369149],{"type":23,"value":3189},{"type":17,"tag":84,"props":369151,"children":369152},{},[369153],{"type":17,"tag":133,"props":369154,"children":369156},{"href":361340,"rel":369155},[214],[369157],{"type":23,"value":361344},{"type":17,"tag":84,"props":369159,"children":369160},{},[369161],{"type":17,"tag":133,"props":369162,"children":369164},{"href":337821,"rel":369163},[214],[369165],{"type":23,"value":56545},{"type":17,"tag":84,"props":369167,"children":369168},{},[369169],{"type":17,"tag":133,"props":369170,"children":369172},{"href":337828,"rel":369171},[214],[369173],{"type":23,"value":56564},{"type":17,"tag":29,"props":369175,"children":369176},{},[369177],{"type":23,"value":369178},"Build once to our Unified ATS API and launch all the ATS integrations you need.",{"type":17,"tag":29,"props":369180,"children":369181},{},[369182],{"type":17,"tag":133,"props":369183,"children":369185},{"href":369085,"rel":369184},[214],[369186],{"type":17,"tag":48,"props":369187,"children":369188},{},[369189],{"type":23,"value":367547},{"type":17,"tag":29,"props":369191,"children":369192},{},[369193],{"type":17,"tag":6438,"props":369194,"children":369196},{"alt":318119,"src":369195},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_may_2023_product_updates-2.png",[],{"type":17,"tag":68,"props":369198,"children":369200},{"id":369199},"new-hris-integrations-lattice-leapsome",[369201],{"type":23,"value":369202},"New HRIS Integrations: Lattice, Leapsome",{"type":17,"tag":29,"props":369204,"children":369205},{},[369206,369208,369214,369215,369221],{"type":23,"value":369207},"We've extended our HRIS integrations with the addition of two performance management solutions ",{"type":17,"tag":133,"props":369209,"children":369212},{"href":369210,"rel":369211},"https://unified.to/integrations/lattice",[214],[369213],{"type":23,"value":60949},{"type":23,"value":34435},{"type":17,"tag":133,"props":369216,"children":369219},{"href":369217,"rel":369218},"https://unified.to/integrations/leapsome",[214],[369220],{"type":23,"value":60959},{"type":23,"value":369222},". Both platforms help organizations manage compensation, employee engagement, and goals.",{"type":17,"tag":29,"props":369224,"children":369225},{},[369226,369227,369231],{"type":23,"value":369073},{"type":17,"tag":133,"props":369228,"children":369229},{"href":60186},[369230],{"type":23,"value":60189},{"type":23,"value":369232}," enables you to list, get, update, create, and delete employees and groups with one unified API and data model. Enhance your product with the leading HRIS apps.\nIn addition to Lattice and Leapsome, our Unified ATS API has pre-built integrations with several HRIS apps, including:",{"type":17,"tag":80,"props":369234,"children":369235},{},[369236,369244,369252,369260,369268],{"type":17,"tag":84,"props":369237,"children":369238},{},[369239],{"type":17,"tag":133,"props":369240,"children":369242},{"href":353547,"rel":369241},[214],[369243],{"type":23,"value":3194},{"type":17,"tag":84,"props":369245,"children":369246},{},[369247],{"type":17,"tag":133,"props":369248,"children":369250},{"href":353492,"rel":369249},[214],[369251],{"type":23,"value":216704},{"type":17,"tag":84,"props":369253,"children":369254},{},[369255],{"type":17,"tag":133,"props":369256,"children":369258},{"href":353483,"rel":369257},[214],[369259],{"type":23,"value":59564},{"type":17,"tag":84,"props":369261,"children":369262},{},[369263],{"type":17,"tag":133,"props":369264,"children":369266},{"href":353556,"rel":369265},[214],[369267],{"type":23,"value":94638},{"type":17,"tag":84,"props":369269,"children":369270},{},[369271],{"type":17,"tag":133,"props":369272,"children":369274},{"href":353474,"rel":369273},[214],[369275],{"type":23,"value":59319},{"type":17,"tag":29,"props":369277,"children":369278},{},[369279],{"type":23,"value":369280},"Build once to our Unified HRIS API and launch all the HRIS integrations you need.\nLearn more about our Unified HRIS API",{"type":17,"tag":29,"props":369282,"children":369283},{},[369284],{"type":17,"tag":133,"props":369285,"children":369288},{"href":369286,"rel":369287},"https://unified.to/hris?utm_source=linkedin&utm_campaign=may_update&utm_content=Unified_HRIS",[214],[369289],{"type":23,"value":369290},"Learn more about our Unified HRIS API",{"type":17,"tag":29,"props":369292,"children":369293},{},[369294],{"type":17,"tag":6438,"props":369295,"children":369297},{"alt":318119,"src":369296},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_may_2023_product_updates-3.png",[],{"type":17,"tag":29,"props":369299,"children":369300},{},[369301],{"type":23,"value":369302},"We're determined to give developers the simplest way to add customer-facing integrations to their products. For added flexibility, we offer a Passthrough endpoint, allowing you to leverage existing connections and authentication to access integration API endpoints we don't yet support.",{"type":17,"tag":29,"props":369304,"children":369305},{},[369306,369308,369314,369315,369320,369322,369327,369328,369333],{"type":23,"value":369307},"Whether you need to fetch data, send notifications, or perform other actions within ",{"type":17,"tag":133,"props":369309,"children":369312},{"href":369310,"rel":369311},"https://unified.to/integrations/linkedin",[214],[369313],{"type":23,"value":11357},{"type":23,"value":75890},{"type":17,"tag":133,"props":369316,"children":369318},{"href":346179,"rel":369317},[214],[369319],{"type":23,"value":15720},{"type":23,"value":369321},", the Passthrough API has you covered. Our Passthrough API also supports ",{"type":17,"tag":133,"props":369323,"children":369325},{"href":353547,"rel":369324},[214],[369326],{"type":23,"value":3194},{"type":23,"value":34435},{"type":17,"tag":133,"props":369329,"children":369331},{"href":361302,"rel":369330},[214],[369332],{"type":23,"value":369141},{"type":23,"value":54},{"type":17,"tag":29,"props":369335,"children":369336},{},[369337],{"type":23,"value":369338},"You can leverage your HTTP headers while benefiting from streamlined authentication handling. We take care of the authentication process, so you can focus on building robust integrations. The resulting headers are seamlessly pushed back to you, ensuring a smooth and uninterrupted data flow.",{"type":17,"tag":29,"props":369340,"children":369341},{},[369342],{"type":17,"tag":133,"props":369343,"children":369346},{"href":369344,"rel":369345},"https://docs.unified.to/?utm_source=linkedin&utm_campaign=may_update&utm_content=Passthrough_API#section_Passthrough%20APIs",[214],[369347],{"type":23,"value":369348},"Learn more about Passthrough APIs",{"type":17,"tag":68,"props":369350,"children":369352},{"id":369351},"unleash-your-full-integrations-potential",[369353],{"type":23,"value":369354},"Unleash your full integrations potential",{"type":17,"tag":29,"props":369356,"children":369357},{},[369358],{"type":23,"value":369359},"In today's modern technology landscape, software teams can't afford to spend months or years building a separate integration for every new system. We're determined to end this chaos with a secure, scalable, and unified solution so developers can build once and instantly launch multiple integrations.",{"type":17,"tag":29,"props":369361,"children":369362},{},[369363],{"type":23,"value":369364},"What you get with our Unified API solution:",{"type":17,"tag":80,"props":369366,"children":369367},{},[369368,369373,369378],{"type":17,"tag":84,"props":369369,"children":369370},{},[369371],{"type":23,"value":369372},"The ability to easily build, launch, and maintain customer-facing integrations",{"type":17,"tag":84,"props":369374,"children":369375},{},[369376],{"type":23,"value":369377},"Both native and virtual webhooks for nearly all integrations, regardless of your plan",{"type":17,"tag":84,"props":369379,"children":369380},{},[369381],{"type":23,"value":369382},"One line of code to create an integrations directory that simplifies user authorization",{"type":17,"tag":29,"props":369384,"children":369385},{},[369386],{"type":23,"value":369387},"Ready to accelerate your company's integrations strategy?",{"type":17,"tag":29,"props":369389,"children":369390},{},[369391],{"type":17,"tag":133,"props":369392,"children":369395},{"href":369393,"rel":369394},"https://app.unified.to/?utm_source=blog&utm_campaign=may_update&utm_content=get_started",[214],[369396],{"type":23,"value":369397},"Create your free Unified.to account ",{"title":7,"searchDepth":1629,"depth":1629,"links":369399},[369400,369401,369402,369403],{"id":368998,"depth":1629,"text":369001},{"id":369098,"depth":1629,"text":369101},{"id":369199,"depth":1629,"text":369202},{"id":369351,"depth":1629,"text":369354},"content:blog:unified_may_2023_product_updates.md","blog/unified_may_2023_product_updates.md","blog/unified_may_2023_product_updates",{"_path":369408,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":369409,"description":369410,"img":369411,"date":369412,"tag":6341,"body":369413,"_type":1677,"_id":369617,"_source":1679,"_file":369618,"_stem":369619,"_extension":1682},"/blog/how_to_register_an_adp_developer_app_and_get_oauth2_credentials","How to Register an ADP Developer App and Get OAUTH2 Credentials","Developers who are looking to build data integrations for their SaaS software will need to register an ADP Developer application and obtain OAUTH2 credentials....","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_an_adp_developer_app_and_get_oauth2_credentials-icon.png","2023-04-30T00:00:00.000Z",{"type":14,"children":369414,"toc":369610},[369415,369420,369423,369431,369436,369445,369456,369465,369470,369503,369512,369517,369557,369563,369568,369573,369578,369584],{"type":17,"tag":18,"props":369416,"children":369418},{"id":369417},"how-to-register-an-adp-developer-app-and-get-oauth2-credentials",[369419],{"type":23,"value":369409},{"type":17,"tag":25,"props":369421,"children":369422},{},[],{"type":17,"tag":29,"props":369424,"children":369425},{},[369426],{"type":17,"tag":33,"props":369427,"children":369428},{},[369429],{"type":23,"value":369430},"April 30, 2023",{"type":17,"tag":29,"props":369432,"children":369433},{},[369434],{"type":23,"value":369435},"Developers who are looking to build data integrations for their SaaS software will need to register an ADP Developer application and obtain OAUTH2 credentials. This will allow you to access ADP data and build integrations with ADP services. In this article, we'll go over the steps to register an ADP Developer application and obtain OAUTH2 credentials.",{"type":17,"tag":68,"props":369437,"children":369439},{"id":369438},"step-1-create-an-adp-developer-account",[369440],{"type":17,"tag":48,"props":369441,"children":369442},{},[369443],{"type":23,"value":369444},"Step 1: Create an ADP Developer Account",{"type":17,"tag":29,"props":369446,"children":369447},{},[369448,369450,369455],{"type":23,"value":369449},"To get started, you will need to create an ADP Developer account. If you don't already have one, you can sign up for free on the ",{"type":17,"tag":133,"props":369451,"children":369453},{"href":57653,"rel":369452},[214],[369454],{"type":23,"value":57657},{"type":23,"value":54},{"type":17,"tag":68,"props":369457,"children":369459},{"id":369458},"step-2-register-a-developer-app",[369460],{"type":17,"tag":48,"props":369461,"children":369462},{},[369463],{"type":23,"value":369464},"Step 2: Register a Developer App",{"type":17,"tag":29,"props":369466,"children":369467},{},[369468],{"type":23,"value":369469},"Once you have an ADP Developer account, you can register a new developer app. Here are the steps to do so:",{"type":17,"tag":6154,"props":369471,"children":369472},{},[369473,369478,369483,369488,369493,369498],{"type":17,"tag":84,"props":369474,"children":369475},{},[369476],{"type":23,"value":369477},"Log in to your ADP Developer account.",{"type":17,"tag":84,"props":369479,"children":369480},{},[369481],{"type":23,"value":369482},"Navigate to the \"Apps\" section of the Developer Portal.",{"type":17,"tag":84,"props":369484,"children":369485},{},[369486],{"type":23,"value":369487},"Click on the \"Register App\" button.",{"type":17,"tag":84,"props":369489,"children":369490},{},[369491],{"type":23,"value":369492},"Fill in the required information for your app, such as its name, description, and callback URL.",{"type":17,"tag":84,"props":369494,"children":369495},{},[369496],{"type":23,"value":369497},"Agree to the ADP Developer Terms of Service and Privacy Policy.",{"type":17,"tag":84,"props":369499,"children":369500},{},[369501],{"type":23,"value":369502},"Click the \"Submit\" button to complete the app registration process.",{"type":17,"tag":68,"props":369504,"children":369506},{"id":369505},"step-3-get-your-app-credentials",[369507],{"type":17,"tag":48,"props":369508,"children":369509},{},[369510],{"type":23,"value":369511},"Step 3: Get Your App Credentials",{"type":17,"tag":29,"props":369513,"children":369514},{},[369515],{"type":23,"value":369516},"Once your app is registered, you can obtain your app credentials, including the Client ID and Client Secret, which are used to authenticate your app and access the ADP APIs.",{"type":17,"tag":6154,"props":369518,"children":369519},{},[369520,369524,369529,369534],{"type":17,"tag":84,"props":369521,"children":369522},{},[369523],{"type":23,"value":369482},{"type":17,"tag":84,"props":369525,"children":369526},{},[369527],{"type":23,"value":369528},"Click on the name of the app you just registered.",{"type":17,"tag":84,"props":369530,"children":369531},{},[369532],{"type":23,"value":369533},"Click on the \"Credentials\" tab to view your app's Client ID and Client Secret.",{"type":17,"tag":84,"props":369535,"children":369536},{},[369537,369539,369548,369550,369555],{"type":23,"value":369538},"Make sure that your redirect_uri is ",{"type":17,"tag":133,"props":369540,"children":369542},{"href":42417,"rel":369541},[214],[369543],{"type":17,"tag":6121,"props":369544,"children":369546},{"className":369545},[],[369547],{"type":23,"value":42417},{"type":23,"value":369549}," if you are going to use ",{"type":17,"tag":133,"props":369551,"children":369553},{"href":212,"rel":369552},[214],[369554],{"type":23,"value":217},{"type":23,"value":369556}," with these credentials",{"type":17,"tag":68,"props":369558,"children":369560},{"id":369559},"step-4-using-unifiedto",[369561],{"type":23,"value":369562},"Step 4: Using Unified.to",{"type":17,"tag":29,"props":369564,"children":369565},{},[369566],{"type":23,"value":369567},"Registering an ADP Developer application and obtaining OAUTH2 credentials is an important step in building data integration for your SaaS software. With these credentials, you'll be able to access ADP data and build integrations with ADP services.",{"type":17,"tag":29,"props":369569,"children":369570},{},[369571],{"type":23,"value":369572},"Using ADP APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",{"type":17,"tag":29,"props":369574,"children":369575},{},[369576],{"type":23,"value":369577},"It's much easier to use Unified.to APIs for building scalable integrations. With these APIs, you can focus on building your SaaS software and let Unified.to handle the heavy lifting of integrating with ADP. Check out the Unified.to website for more information on how they can help you build better integrations.",{"type":17,"tag":68,"props":369579,"children":369581},{"id":369580},"step-5-activate-adp-in-unifiedto",[369582],{"type":23,"value":369583},"Step 5: Activate ADP in Unified.to",{"type":17,"tag":6154,"props":369585,"children":369586},{},[369587,369596,369601,369606],{"type":17,"tag":84,"props":369588,"children":369589},{},[369590,369591],{"type":23,"value":42939},{"type":17,"tag":133,"props":369592,"children":369594},{"href":329567,"rel":369593},[214],[369595],{"type":23,"value":341393},{"type":17,"tag":84,"props":369597,"children":369598},{},[369599],{"type":23,"value":369600},"Search for ADP",{"type":17,"tag":84,"props":369602,"children":369603},{},[369604],{"type":23,"value":369605},"Click on Activate on ADP",{"type":17,"tag":84,"props":369607,"children":369608},{},[369609],{"type":23,"value":341408},{"title":7,"searchDepth":1629,"depth":1629,"links":369611},[369612,369613,369614,369615,369616],{"id":369438,"depth":1629,"text":369444},{"id":369458,"depth":1629,"text":369464},{"id":369505,"depth":1629,"text":369511},{"id":369559,"depth":1629,"text":369562},{"id":369580,"depth":1629,"text":369583},"content:blog:how_to_register_an_adp_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_an_adp_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_an_adp_developer_app_and_get_oauth2_credentials",{"_path":369621,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":369622,"description":369623,"img":369624,"date":369625,"tag":6341,"body":369626,"_type":1677,"_id":370028,"_source":1679,"_file":370029,"_stem":370030,"_extension":1682},"/blog/extended_observability_pushing_api_logs_to_grafana_loki","Extended observability — pushing API logs to Grafana / Loki","We're excited to add another option for external observability, you can send API call logs from Unified.to directly to a Grafana Loki–compatible endpoint....","https://s3.us-east-2.amazonaws.com/unified-article-images/extended_observability_pushing_api_logs_to_grafana_loki-icon.png","2023-04-27T00:00:00.000Z",{"type":14,"children":369627,"toc":370023},[369628,369633,369636,369644,369689,369714,369719,369967,369980,369985,369998,370004,370009,370014],{"type":17,"tag":18,"props":369629,"children":369631},{"id":369630},"extended-observability-pushing-api-logs-to-grafana-loki",[369632],{"type":23,"value":369622},{"type":17,"tag":25,"props":369634,"children":369635},{},[],{"type":17,"tag":29,"props":369637,"children":369638},{},[369639],{"type":17,"tag":33,"props":369640,"children":369641},{},[369642],{"type":23,"value":369643},"April 27, 2023",{"type":17,"tag":29,"props":369645,"children":369646},{},[369647,369649,369653,369654,369659,369661,369666,369668,369672,369674,369680,369682,369688],{"type":23,"value":369648},"We're excited to add another option for external observability: you can send ",{"type":17,"tag":48,"props":369650,"children":369651},{},[369652],{"type":23,"value":92277},{"type":23,"value":70920},{"type":17,"tag":133,"props":369655,"children":369657},{"href":212,"rel":369656},[214],[369658],{"type":23,"value":217},{"type":23,"value":369660}," directly to a ",{"type":17,"tag":48,"props":369662,"children":369663},{},[369664],{"type":23,"value":369665},"Grafana Loki",{"type":23,"value":369667},"–compatible endpoint. directly to a ",{"type":17,"tag":48,"props":369669,"children":369670},{},[369671],{"type":23,"value":369665},{"type":23,"value":369673},"–compatible endpoint. This is the same class of logs we already support for ",{"type":17,"tag":133,"props":369675,"children":369678},{"href":369676,"rel":369677},"https://docs.unified.to/guides/extended_observability_pushing_api_logs_to_your_datadog_instance",[214],[369679],{"type":23,"value":860},{"type":23,"value":369681},"; you choose where they go in your ",{"type":17,"tag":133,"props":369683,"children":369685},{"href":339114,"rel":369684},[214],[369686],{"type":23,"value":369687},"workspace settings",{"type":23,"value":54},{"type":17,"tag":29,"props":369690,"children":369691},{},[369692,369702,369703,369712],{"type":17,"tag":133,"props":369693,"children":369696},{"href":369694,"rel":369695},"https://grafana.com/products/cloud/",[214],[369697],{"type":17,"tag":48,"props":369698,"children":369699},{},[369700],{"type":23,"value":369701},"Grafana Cloud",{"type":23,"value":34435},{"type":17,"tag":133,"props":369704,"children":369707},{"href":369705,"rel":369706},"https://grafana.com/oss/loki/",[214],[369708],{"type":17,"tag":48,"props":369709,"children":369710},{},[369711],{"type":23,"value":369665},{"type":23,"value":369713}," are commonly used for log aggregation and querying. Unified delivers logs using Loki's standard HTTP push API.",{"type":17,"tag":29,"props":369715,"children":369716},{},[369717],{"type":23,"value":369718},"Setting it up is easy! Here's how:",{"type":17,"tag":80,"props":369720,"children":369721},{},[369722,369805,369908],{"type":17,"tag":84,"props":369723,"children":369724},{},[369725,369730],{"type":17,"tag":48,"props":369726,"children":369727},{},[369728],{"type":23,"value":369729},"Prepare your endpoint and credentials",{"type":17,"tag":80,"props":369731,"children":369732},{},[369733,369770],{"type":17,"tag":84,"props":369734,"children":369735},{},[369736,369737,369746,369748,369753,369755,369761,369763,369768],{"type":23,"value":42829},{"type":17,"tag":133,"props":369738,"children":369741},{"href":369739,"rel":369740},"https://grafana.com/docs/grafana-cloud/",[214],[369742],{"type":17,"tag":48,"props":369743,"children":369744},{},[369745],{"type":23,"value":369701},{"type":23,"value":369747},", open your stack and note the ",{"type":17,"tag":48,"props":369749,"children":369750},{},[369751],{"type":23,"value":369752},"logs / Loki",{"type":23,"value":369754}," ingest base URL (no path) — often ",{"type":17,"tag":6121,"props":369756,"children":369758},{"className":369757},[],[369759],{"type":23,"value":369760},"https://logs-prod-XX.grafana.net",{"type":23,"value":369762}," (your region may differ). If you use ",{"type":17,"tag":48,"props":369764,"children":369765},{},[369766],{"type":23,"value":369767},"self-hosted Loki",{"type":23,"value":369769},", use that base URL instead.",{"type":17,"tag":84,"props":369771,"children":369772},{},[369773,369775,369780,369782,369787,369788,369797,369798,369803],{"type":23,"value":369774},"Create or copy a ",{"type":17,"tag":48,"props":369776,"children":369777},{},[369778],{"type":23,"value":369779},"logs token",{"type":23,"value":369781}," (or the username + token pair your provider documents for Basic auth). ",{"type":17,"tag":48,"props":369783,"children":369784},{},[369785],{"type":23,"value":369786},"Set",{"type":23,"value":18757},{"type":17,"tag":48,"props":369789,"children":369790},{},[369791],{"type":17,"tag":6121,"props":369792,"children":369794},{"className":369793},[],[369795],{"type":23,"value":369796},"grafana_site",{"type":23,"value":18757},{"type":17,"tag":48,"props":369799,"children":369800},{},[369801],{"type":23,"value":369802},"explicitly",{"type":23,"value":369804}," for EU/regional Grafana Cloud stacks or self-hosted Loki; if you leave it blank, our API falls back to a default US Grafana Cloud logs host, which may not match your region.",{"type":17,"tag":84,"props":369806,"children":369807},{},[369808,369813],{"type":17,"tag":48,"props":369809,"children":369810},{},[369811],{"type":23,"value":369812},"Enter values in workspace settings",{"type":17,"tag":80,"props":369814,"children":369815},{},[369816],{"type":17,"tag":84,"props":369817,"children":369818},{},[369819,369820,369826,369828,369832,369834],{"type":23,"value":245064},{"type":17,"tag":133,"props":369821,"children":369823},{"href":339114,"rel":369822},[214],[369824],{"type":23,"value":369825},"Workspace settings",{"type":23,"value":369827}," (or use the Workspace API) and choose ",{"type":17,"tag":48,"props":369829,"children":369830},{},[369831],{"type":23,"value":870},{"type":23,"value":369833}," under external logging. Configure:\n",{"type":17,"tag":80,"props":369835,"children":369836},{},[369837,369860,369883],{"type":17,"tag":84,"props":369838,"children":369839},{},[369840,369845,369846,369851,369853,369859],{"type":17,"tag":48,"props":369841,"children":369842},{},[369843],{"type":23,"value":369844},"Loki base URL",{"type":23,"value":44573},{"type":17,"tag":6121,"props":369847,"children":369849},{"className":369848},[],[369850],{"type":23,"value":369796},{"type":23,"value":369852},"): Base URL only (for example ",{"type":17,"tag":133,"props":369854,"children":369857},{"href":369855,"rel":369856},"https://logs-prod-xx.grafana.net/",[214],[369858],{"type":23,"value":369760},{"type":23,"value":12034},{"type":17,"tag":84,"props":369861,"children":369862},{},[369863,369868,369870,369875,369877,369881],{"type":17,"tag":48,"props":369864,"children":369865},{},[369866],{"type":23,"value":369867},"Authentication: Basic",{"type":23,"value":369869}," (Grafana Cloud: user/instance id + token), ",{"type":17,"tag":48,"props":369871,"children":369872},{},[369873],{"type":23,"value":369874},"Bearer",{"type":23,"value":369876}," (if your gateway expects a bearer token), or ",{"type":17,"tag":48,"props":369878,"children":369879},{},[369880],{"type":23,"value":309088},{"type":23,"value":369882}," (single field — see below).",{"type":17,"tag":84,"props":369884,"children":369885},{},[369886,369891,369892,369898,369900,369906],{"type":17,"tag":48,"props":369887,"children":369888},{},[369889],{"type":23,"value":369890},"Token / API key",{"type":23,"value":44573},{"type":17,"tag":6121,"props":369893,"children":369895},{"className":369894},[],[369896],{"type":23,"value":369897},"grafana_apikey",{"type":23,"value":369899},"): Your secret or legacy ",{"type":17,"tag":6121,"props":369901,"children":369903},{"className":369902},[],[369904],{"type":23,"value":369905},"user:token",{"type":23,"value":369907}," string, depending on mode.",{"type":17,"tag":84,"props":369909,"children":369910},{},[369911,369916],{"type":17,"tag":48,"props":369912,"children":369913},{},[369914],{"type":23,"value":369915},"Confirm logs are flowing",{"type":17,"tag":80,"props":369917,"children":369918},{},[369919],{"type":17,"tag":84,"props":369920,"children":369921},{},[369922,369924,369928,369930,369935,369937,369943,369945,369953,369954,369959,369960,369965],{"type":23,"value":369923},"Make a sample call to the ",{"type":17,"tag":133,"props":369925,"children":369926},{"href":7691},[369927],{"type":23,"value":7806},{"type":23,"value":369929}," (for example, list an object on a connection). In ",{"type":17,"tag":48,"props":369931,"children":369932},{},[369933],{"type":23,"value":369934},"Grafana Explore",{"type":23,"value":369936}," (or any Loki client), run LogQL such as ",{"type":17,"tag":6121,"props":369938,"children":369940},{"className":369939},[],[369941],{"type":23,"value":369942},"{job=\"unified-api\"}",{"type":23,"value":369944},". Log lines include JSON with the route ",{"type":17,"tag":48,"props":369946,"children":369947},{},[369948],{"type":17,"tag":6121,"props":369949,"children":369951},{"className":369950},[],[369952],{"type":23,"value":352060},{"type":23,"value":11826},{"type":17,"tag":6121,"props":369955,"children":369957},{"className":369956},[],[369958],{"type":23,"value":149493},{"type":23,"value":11826},{"type":17,"tag":6121,"props":369961,"children":369963},{"className":369962},[],[369964],{"type":23,"value":19949},{"type":23,"value":369966},", and other API-call fields.",{"type":17,"tag":68,"props":369968,"children":369970},{"id":369969},"why-does-grafana-loki-matter-for-unifiedto-users",[369971,369973,369978],{"type":23,"value":369972},"Why does Grafana / Loki matter for ",{"type":17,"tag":133,"props":369974,"children":369976},{"href":212,"rel":369975},[214],[369977],{"type":23,"value":217},{"type":23,"value":369979}," users?",{"type":17,"tag":29,"props":369981,"children":369982},{},[369983],{"type":23,"value":369984},"By sending your logs directly to your own Loki stack or Grafana Cloud, you get immediate visibility into what's happening in your environment. This allows you to quickly debug issues, get notified about errors, and more.\nCurrently, we support both inbound API calls and webhook calls.",{"type":17,"tag":29,"props":369986,"children":369987},{},[369988,369990,369996],{"type":23,"value":369989},"However, we're constantly improving our product, and we're looking forward to supporting more log types in the future. So, please ",{"type":17,"tag":133,"props":369991,"children":369993},{"href":215330,"rel":369992},[214],[369994],{"type":23,"value":369995},"send us feedback",{"type":23,"value":369997}," so we can better understand what you need.",{"type":17,"tag":68,"props":369999,"children":370001},{"id":370000},"about-unifiedto",[370002],{"type":23,"value":370003},"About Unified.to",{"type":17,"tag":29,"props":370005,"children":370006},{},[370007],{"type":23,"value":370008},"If you're not familiar with Unified API, it's a single API that you can use to read and write data to third-party integrations using our unified data model. This makes it easy to integrate with multiple systems and eliminates the need for separate API calls for each integration.",{"type":17,"tag":29,"props":370010,"children":370011},{},[370012],{"type":23,"value":370013},"We hope this new feature makes your life easier and your work more efficient!",{"type":17,"tag":29,"props":370015,"children":370016},{},[370017],{"type":17,"tag":133,"props":370018,"children":370020},{"href":158861,"rel":370019},[214],[370021],{"type":23,"value":370022},"Get started with Unified.to",{"title":7,"searchDepth":1629,"depth":1629,"links":370024},[370025,370027],{"id":369969,"depth":1629,"text":370026},"Why does Grafana / Loki matter for Unified.to users?",{"id":370000,"depth":1629,"text":370003},"content:blog:extended_observability_pushing_api_logs_to_grafana_loki.md","blog/extended_observability_pushing_api_logs_to_grafana_loki.md","blog/extended_observability_pushing_api_logs_to_grafana_loki",{"_path":370032,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":370033,"description":370034,"img":370035,"date":369625,"tag":6341,"body":370036,"_type":1677,"_id":370170,"_source":1679,"_file":370171,"_stem":370172,"_extension":1682},"/blog/extended_observability_pushing_api_logs_to_your_datadog_instance","Extended Observability - Pushing API Logs to your Datadog Instance","We're excited to announce the latest addition to increase observability for our customers — the ability to send API call logs within Unified.to directly to...","https://s3.us-east-2.amazonaws.com/unified-article-images/extended_observability_pushing_api_logs_to_your_datadog_instance-icon.png",{"type":14,"children":370037,"toc":370166},[370038,370043,370046,370053,370065,370075,370079,370118,370125,370131,370136,370146,370150,370154,370158],{"type":17,"tag":18,"props":370039,"children":370041},{"id":370040},"extended-observability-pushing-api-logs-to-your-datadog-instance",[370042],{"type":23,"value":370033},{"type":17,"tag":25,"props":370044,"children":370045},{},[],{"type":17,"tag":29,"props":370047,"children":370048},{},[370049],{"type":17,"tag":33,"props":370050,"children":370051},{},[370052],{"type":23,"value":369643},{"type":17,"tag":29,"props":370054,"children":370055},{},[370056,370058,370063],{"type":23,"value":370057},"We're excited to announce the latest addition to increase observability for our customers — the ability to send API call logs within ",{"type":17,"tag":133,"props":370059,"children":370061},{"href":212,"rel":370060},[214],[370062],{"type":23,"value":217},{"type":23,"value":370064}," directly to your Datadog instance.",{"type":17,"tag":29,"props":370066,"children":370067},{},[370068,370073],{"type":17,"tag":133,"props":370069,"children":370071},{"href":856,"rel":370070},[214],[370072],{"type":23,"value":860},{"type":23,"value":370074}," is a cloud-based monitoring and analytics platform that provides real-time insights into the performance of IT infrastructure, applications, and logs.",{"type":17,"tag":29,"props":370076,"children":370077},{},[370078],{"type":23,"value":369718},{"type":17,"tag":6154,"props":370080,"children":370081},{},[370082,370096,370107],{"type":17,"tag":84,"props":370083,"children":370084},{},[370085,370087,370094],{"type":23,"value":370086},"Get your Datadog API key: To start sending logs to Datadog, you need to obtain your API key. Here's a ",{"type":17,"tag":133,"props":370088,"children":370091},{"href":370089,"rel":370090},"https://docs.datadoghq.com/account_management/api-app-keys/",[214],[370092],{"type":23,"value":370093},"detailed article",{"type":23,"value":370095}," that walks you through the process.",{"type":17,"tag":84,"props":370097,"children":370098},{},[370099,370101,370106],{"type":23,"value":370100},"Once you have your API key, simply paste it into your Unified.to ",{"type":17,"tag":133,"props":370102,"children":370104},{"href":339114,"rel":370103},[214],[370105],{"type":23,"value":369687},{"type":23,"value":54},{"type":17,"tag":84,"props":370108,"children":370109},{},[370110,370112,370116],{"type":23,"value":370111},"Finally, make a sample API call to ",{"type":17,"tag":133,"props":370113,"children":370114},{"href":7691},[370115],{"type":23,"value":7806},{"type":23,"value":370117}," to confirm that logs are being sent to your Datadog instance.",{"type":17,"tag":29,"props":370119,"children":370120},{},[370121],{"type":17,"tag":6438,"props":370122,"children":370124},{"alt":318119,"src":370123},"https://s3.us-east-2.amazonaws.com/unified-article-images/extended_observability_pushing_api_logs_to_your_datadog_instance-0.png",[],{"type":17,"tag":68,"props":370126,"children":370128},{"id":370127},"why-does-datadog-matter-for-unifiedto-users",[370129],{"type":23,"value":370130},"Why does Datadog matter for Unified.to users?",{"type":17,"tag":29,"props":370132,"children":370133},{},[370134],{"type":23,"value":370135},"By sending your logs directly to Datadog, you get immediate visibility into what's happening in your environment. This allows you to quickly debug issues, get notified about errors, and more.\nCurrently, we support both inbound API calls and webhook calls.",{"type":17,"tag":29,"props":370137,"children":370138},{},[370139,370140,370145],{"type":23,"value":369989},{"type":17,"tag":133,"props":370141,"children":370143},{"href":215330,"rel":370142},[214],[370144],{"type":23,"value":369995},{"type":23,"value":369997},{"type":17,"tag":68,"props":370147,"children":370148},{"id":370000},[370149],{"type":23,"value":370003},{"type":17,"tag":29,"props":370151,"children":370152},{},[370153],{"type":23,"value":370008},{"type":17,"tag":29,"props":370155,"children":370156},{},[370157],{"type":23,"value":370013},{"type":17,"tag":29,"props":370159,"children":370160},{},[370161],{"type":17,"tag":133,"props":370162,"children":370164},{"href":158861,"rel":370163},[214],[370165],{"type":23,"value":370022},{"title":7,"searchDepth":1629,"depth":1629,"links":370167},[370168,370169],{"id":370127,"depth":1629,"text":370130},{"id":370000,"depth":1629,"text":370003},"content:blog:extended_observability_pushing_api_logs_to_your_datadog_instance.md","blog/extended_observability_pushing_api_logs_to_your_datadog_instance.md","blog/extended_observability_pushing_api_logs_to_your_datadog_instance",{"_path":370174,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":370175,"description":370176,"img":370177,"date":370178,"tag":12,"body":370179,"_type":1677,"_id":370561,"_source":1679,"_file":370562,"_stem":370563,"_extension":1682},"/blog/rest_vs_grpc_vs_graphql","REST vs gRPC vs GraphQL","> 💡  How to choose the right API framework for your needs.","https://s3.us-east-2.amazonaws.com/unified-article-images/rest_vs_grpc_vs_graphql-icon.png","2023-04-11T00:00:00.000Z",{"type":14,"children":370180,"toc":370554},[370181,370186,370189,370197,370205,370210,370215,370221,370241,370246,370251,370256,370261,370290,370301,370313,370319,370333,370338,370343,370348,370354,370543,370549],{"type":17,"tag":18,"props":370182,"children":370184},{"id":370183},"rest-vs-grpc-vs-graphql",[370185],{"type":23,"value":370175},{"type":17,"tag":25,"props":370187,"children":370188},{},[],{"type":17,"tag":29,"props":370190,"children":370191},{},[370192],{"type":17,"tag":33,"props":370193,"children":370194},{},[370195],{"type":23,"value":370196},"April 11, 2023",{"type":17,"tag":3414,"props":370198,"children":370199},{},[370200],{"type":17,"tag":29,"props":370201,"children":370202},{},[370203],{"type":23,"value":370204},"💡  How to choose the right API framework for your needs.",{"type":17,"tag":29,"props":370206,"children":370207},{},[370208],{"type":23,"value":370209},"Building a new application and confused about all of the API framework options?  You aren't alone.  There are a lot of options for you and your team to build your back-end and front-end APIs, so we will go through the options and compare them.  Don't worry we won't bring up SOAP/XML or any other older API technology.",{"type":17,"tag":29,"props":370211,"children":370212},{},[370213],{"type":23,"value":370214},"TLDR: Take a look at our comparison table at the end of this article.",{"type":17,"tag":68,"props":370216,"children":370218},{"id":370217},"rest-json-openapi",[370219],{"type":23,"value":370220},"REST, JSON & OpenAPI",{"type":17,"tag":29,"props":370222,"children":370223},{},[370224,370230,370232,370239],{"type":17,"tag":133,"props":370225,"children":370228},{"href":370226,"rel":370227},"https://en.wikipedia.org/wiki/Representational_state_transfer",[214],[370229],{"type":23,"value":123473},{"type":23,"value":370231}," is by far the most used API framework today and is used by front-ends to communicate to back-ends as well as micro-services.  It is based on HTTP and usually follows the ",{"type":17,"tag":133,"props":370233,"children":370236},{"href":370234,"rel":370235},"https://en.wikipedia.org/wiki/HATEOAS",[214],[370237],{"type":23,"value":370238},"HATEOAS",{"type":23,"value":370240}," concept.",{"type":17,"tag":29,"props":370242,"children":370243},{},[370244],{"type":23,"value":370245},"REST APIs use HTTP actions as 'verbs'.  HTTP GET is used to retrieve information while HTTP POST is usually used to create an object.",{"type":17,"tag":29,"props":370247,"children":370248},{},[370249],{"type":23,"value":370250},"You will see that we've used the word 'usually' a few times and that is because REST isn't really a framework and its rules are very loose. While most REST-based APIs are similar, they can also be very different and are almost always a dis-organized can-of-noodle-soup in terms of objects, path structures, and HTTP verbs.",{"type":17,"tag":29,"props":370252,"children":370253},{},[370254],{"type":23,"value":370255},"JSON is almost always used as the data format.  OpenAPI (previously known as Swagger) can be used to define the API.",{"type":17,"tag":68,"props":370257,"children":370258},{"id":125894},[370259],{"type":23,"value":370260},"GraphQL",{"type":17,"tag":29,"props":370262,"children":370263},{},[370264,370266,370272,370274,370280,370282,370288],{"type":23,"value":370265},"REST can cause a lot of HTTP calls to pick up all of the data that you need for a front-end application.  You call ",{"type":17,"tag":6121,"props":370267,"children":370269},{"className":370268},[],[370270],{"type":23,"value":370271},"/user",{"type":23,"value":370273}," to get the current user, then call ",{"type":17,"tag":6121,"props":370275,"children":370277},{"className":370276},[],[370278],{"type":23,"value":370279},"/todos",{"type":23,"value":370281}," to pick up their TODOs, then ",{"type":17,"tag":6121,"props":370283,"children":370285},{"className":370284},[],[370286],{"type":23,"value":370287},"/news",{"type":23,"value":370289}," to pick up your app's news, ...",{"type":17,"tag":29,"props":370291,"children":370292},{},[370293,370299],{"type":17,"tag":133,"props":370294,"children":370297},{"href":370295,"rel":370296},"https://graphql.org/",[214],[370298],{"type":23,"value":370260},{"type":23,"value":370300}," comes to the rescue by creating a powerful querying language which can also specify which fields and objects to return.",{"type":17,"tag":29,"props":370302,"children":370303},{},[370304,370306,370312],{"type":23,"value":370305},"While GraphQL has nowhere near the popularity of REST for BE \u003C> FE APIs, some large companies have moved to this framework, most notably ",{"type":17,"tag":133,"props":370307,"children":370310},{"href":370308,"rel":370309},"https://www.shopify.com/",[214],[370311],{"type":23,"value":37435},{"type":23,"value":54},{"type":17,"tag":68,"props":370314,"children":370316},{"id":370315},"grpc-protobuf",[370317],{"type":23,"value":370318},"gRPC & Protobuf",{"type":17,"tag":29,"props":370320,"children":370321},{},[370322,370324,370331],{"type":23,"value":370323},"The newest entrant into API frameworks is Google's ",{"type":17,"tag":133,"props":370325,"children":370328},{"href":370326,"rel":370327},"https://grpc.io/",[214],[370329],{"type":23,"value":370330},"gRPC",{"type":23,"value":370332},". (no brownie points for guessing what the ‘g' stands for)",{"type":17,"tag":29,"props":370334,"children":370335},{},[370336],{"type":23,"value":370337},"The main premise for gRPC is that the actual mechanics of the call are hidden and the API is defined as a series of function/methods calls like any other in your code.",{"type":17,"tag":29,"props":370339,"children":370340},{},[370341],{"type":23,"value":370342},"The actual communication is somewhat hidden as well, but is usually run through HTTP/RPC and almost always uses the Protobuf data format.",{"type":17,"tag":29,"props":370344,"children":370345},{},[370346],{"type":23,"value":370347},"Protobuf is sent in a binary format and so it is very compact and fast.  This is one of the main reasons that gRPC+Protobuf are popular with internal micro-services.  There currently isn't a lot of use of gRPC between FE and BE due to the lack of support on front-end frameworks.",{"type":17,"tag":68,"props":370349,"children":370351},{"id":370350},"comparison",[370352],{"type":23,"value":370353},"Comparison",{"type":17,"tag":7231,"props":370355,"children":370356},{},[370357,370387],{"type":17,"tag":7235,"props":370358,"children":370359},{},[370360],{"type":17,"tag":7239,"props":370361,"children":370362},{},[370363,370366,370373,370380],{"type":17,"tag":7243,"props":370364,"children":370365},{},[],{"type":17,"tag":7243,"props":370367,"children":370368},{},[370369],{"type":17,"tag":48,"props":370370,"children":370371},{},[370372],{"type":23,"value":123473},{"type":17,"tag":7243,"props":370374,"children":370375},{},[370376],{"type":17,"tag":48,"props":370377,"children":370378},{},[370379],{"type":23,"value":370260},{"type":17,"tag":7243,"props":370381,"children":370382},{},[370383],{"type":17,"tag":48,"props":370384,"children":370385},{},[370386],{"type":23,"value":370330},{"type":17,"tag":7259,"props":370388,"children":370389},{},[370390,370416,370441,370467,370492,370518],{"type":17,"tag":7239,"props":370391,"children":370392},{},[370393,370401,370406,370411],{"type":17,"tag":7266,"props":370394,"children":370395},{},[370396],{"type":17,"tag":48,"props":370397,"children":370398},{},[370399],{"type":23,"value":370400},"Used for Front-End calling a Back-End API",{"type":17,"tag":7266,"props":370402,"children":370403},{},[370404],{"type":23,"value":370405},"✅ Almost always",{"type":17,"tag":7266,"props":370407,"children":370408},{},[370409],{"type":23,"value":370410},"✅ Up-and-coming",{"type":17,"tag":7266,"props":370412,"children":370413},{},[370414],{"type":23,"value":370415},"❌ Not really (yet)",{"type":17,"tag":7239,"props":370417,"children":370418},{},[370419,370427,370432,370436],{"type":17,"tag":7266,"props":370420,"children":370421},{},[370422],{"type":17,"tag":48,"props":370423,"children":370424},{},[370425],{"type":23,"value":370426},"Used for micro-services",{"type":17,"tag":7266,"props":370428,"children":370429},{},[370430],{"type":23,"value":370431},"🤷‍♂️ Sure, but...",{"type":17,"tag":7266,"props":370433,"children":370434},{},[370435],{"type":23,"value":370431},{"type":17,"tag":7266,"props":370437,"children":370438},{},[370439],{"type":23,"value":370440},"✅ Oh yea!",{"type":17,"tag":7239,"props":370442,"children":370443},{},[370444,370452,370457,370462],{"type":17,"tag":7266,"props":370445,"children":370446},{},[370447],{"type":17,"tag":48,"props":370448,"children":370449},{},[370450],{"type":23,"value":370451},"Used for customer-facing API",{"type":17,"tag":7266,"props":370453,"children":370454},{},[370455],{"type":23,"value":370456},"✅ REST is well understood and has the most language support",{"type":17,"tag":7266,"props":370458,"children":370459},{},[370460],{"type":23,"value":370461},"🤷‍♂️ Unless your customers have very technical developers, GraphQL could slow them down in implementing your API",{"type":17,"tag":7266,"props":370463,"children":370464},{},[370465],{"type":23,"value":370466},"❌ While this should be the best choice, there simply isn't sufficient language support nor wide-spread understanding of gRPC to make it your first choice for a public API.",{"type":17,"tag":7239,"props":370468,"children":370469},{},[370470,370478,370483,370487],{"type":17,"tag":7266,"props":370471,"children":370472},{},[370473],{"type":17,"tag":48,"props":370474,"children":370475},{},[370476],{"type":23,"value":370477},"Data Format",{"type":17,"tag":7266,"props":370479,"children":370480},{},[370481],{"type":23,"value":370482},"🤷‍♂️ JSON (text)",{"type":17,"tag":7266,"props":370484,"children":370485},{},[370486],{"type":23,"value":370482},{"type":17,"tag":7266,"props":370488,"children":370489},{},[370490],{"type":23,"value":370491},"✅ Protobuf (binary)",{"type":17,"tag":7239,"props":370493,"children":370494},{},[370495,370503,370508,370513],{"type":17,"tag":7266,"props":370496,"children":370497},{},[370498],{"type":17,"tag":48,"props":370499,"children":370500},{},[370501],{"type":23,"value":370502},"API Definition",{"type":17,"tag":7266,"props":370504,"children":370505},{},[370506],{"type":23,"value":370507},"❌ OpenAPI / Swagger (sometimes)",{"type":17,"tag":7266,"props":370509,"children":370510},{},[370511],{"type":23,"value":370512},"✅ GraphQL Schema",{"type":17,"tag":7266,"props":370514,"children":370515},{},[370516],{"type":23,"value":370517},"✅ Protobuf schema",{"type":17,"tag":7239,"props":370519,"children":370520},{},[370521,370528,370533,370538],{"type":17,"tag":7266,"props":370522,"children":370523},{},[370524],{"type":17,"tag":48,"props":370525,"children":370526},{},[370527],{"type":23,"value":81210},{"type":17,"tag":7266,"props":370529,"children":370530},{},[370531],{"type":23,"value":370532},"❌ Lots of independent calls plus text JSON results make REST the slowest option",{"type":17,"tag":7266,"props":370534,"children":370535},{},[370536],{"type":23,"value":370537},"🤷‍♂️ GraphQL can be quick if you return just the needed fields and also return other relevant objects (plus use GZIP with the HTTP response).  But if you run it like REST with single object queries, then it will be just as slow.",{"type":17,"tag":7266,"props":370539,"children":370540},{},[370541],{"type":23,"value":370542},"✅ gRPC is by far the fastest option as the data is in binary and the results can be anything you want (and not just a single type of object as in  REST)",{"type":17,"tag":68,"props":370544,"children":370546},{"id":370545},"good-news",[370547],{"type":23,"value":370548},"Good News",{"type":17,"tag":29,"props":370550,"children":370551},{},[370552],{"type":23,"value":370553},"The good news is that Unified.to's APIs are accessible by all three API frameworks.",{"title":7,"searchDepth":1629,"depth":1629,"links":370555},[370556,370557,370558,370559,370560],{"id":370217,"depth":1629,"text":370220},{"id":125894,"depth":1629,"text":370260},{"id":370315,"depth":1629,"text":370318},{"id":370350,"depth":1629,"text":370353},{"id":370545,"depth":1629,"text":370548},"content:blog:rest_vs_grpc_vs_graphql.md","blog/rest_vs_grpc_vs_graphql.md","blog/rest_vs_grpc_vs_graphql",{"_path":370565,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":370566,"description":370567,"img":370568,"date":370569,"tag":12,"body":370570,"_type":1677,"_id":370714,"_source":1679,"_file":370715,"_stem":370716,"_extension":1682},"/blog/passthrough_api_a_new_way_to_connect_with_your_integrations","Passthrough API: A New Way to Connect with Your Integrations","If you are a developer who uses Unified.to to connect with various integrations, you might need to access additional data from the integration that Unified.to...","https://s3.us-east-2.amazonaws.com/unified-article-images/passthrough_api_a_new_way_to_connect_with_your_integrations-icon.jpg","2023-03-27T00:00:00.000Z",{"type":14,"children":370571,"toc":370710},[370572,370577,370580,370588,370600,370612,370618,370623,370661,370666,370672,370677,370700,370705],{"type":17,"tag":18,"props":370573,"children":370575},{"id":370574},"passthrough-api-a-new-way-to-connect-with-your-integrations",[370576],{"type":23,"value":370566},{"type":17,"tag":25,"props":370578,"children":370579},{},[],{"type":17,"tag":29,"props":370581,"children":370582},{},[370583],{"type":17,"tag":33,"props":370584,"children":370585},{},[370586],{"type":23,"value":370587},"March 27, 2023",{"type":17,"tag":29,"props":370589,"children":370590},{},[370591,370593,370598],{"type":23,"value":370592},"If you are a developer who uses ",{"type":17,"tag":133,"props":370594,"children":370596},{"href":212,"rel":370595},[214],[370597],{"type":23,"value":217},{"type":23,"value":370599}," to connect with various integrations, you might need to access additional data from the integration that Unified.to doesn't yet support. Sometimes, you need to access vendor-specific API endpoints or objects that are not supported by Unified.",{"type":17,"tag":29,"props":370601,"children":370602},{},[370603,370605,370610],{"type":23,"value":370604},"That's why we are excited to announce the launch of our Passthrough API, a new feature that allows you to call the integration's APIs directly but get partial benefit from ",{"type":17,"tag":133,"props":370606,"children":370608},{"href":212,"rel":370607},[214],[370609],{"type":23,"value":217},{"type":23,"value":370611},". With the Passthrough API, you can leverage your existing Unified.to connections and authentication with Unified.to, but access any API endpoint at the integration's API.",{"type":17,"tag":68,"props":370613,"children":370615},{"id":370614},"how-does-it-work",[370616],{"type":23,"value":370617},"How does it work?",{"type":17,"tag":29,"props":370619,"children":370620},{},[370621],{"type":23,"value":370622},"Passthrough API is very simple and straightforward. Here is how it works in a nutshell:",{"type":17,"tag":80,"props":370624,"children":370625},{},[370626,370631,370641,370651],{"type":17,"tag":84,"props":370627,"children":370628},{},[370629],{"type":23,"value":370630},"You send a request to Unified.to's Passthrough endpoint, specifying the connection_id, the integration's API path, and the HTTP method (GET, POST, PUT, PATCH, or DELETE), any data in the POST/PUT payload, and any URL query parameters.",{"type":17,"tag":84,"props":370632,"children":370633},{},[370634,370639],{"type":17,"tag":133,"props":370635,"children":370637},{"href":212,"rel":370636},[214],[370638],{"type":23,"value":217},{"type":23,"value":370640}," handles the authentication with the vendor using your existing connection credentials. You don't need to worry about tokens or keys.",{"type":17,"tag":84,"props":370642,"children":370643},{},[370644,370649],{"type":17,"tag":133,"props":370645,"children":370647},{"href":212,"rel":370646},[214],[370648],{"type":23,"value":217},{"type":23,"value":370650}," forwards your request data to the integration as is, including any headers or parameters.",{"type":17,"tag":84,"props":370652,"children":370653},{},[370654,370659],{"type":17,"tag":133,"props":370655,"children":370657},{"href":212,"rel":370656},[214],[370658],{"type":23,"value":217},{"type":23,"value":370660}," receives the response from the integration and returns it to you as is, including any headers or status codes.",{"type":17,"tag":29,"props":370662,"children":370663},{},[370664],{"type":23,"value":370665},"That's it! You can now access any vendor API that Unified.to doesn't support, as long as you have a valid connection with that vendor.",{"type":17,"tag":68,"props":370667,"children":370669},{"id":370668},"how-do-i-get-started",[370670],{"type":23,"value":370671},"How do I get started?",{"type":17,"tag":29,"props":370673,"children":370674},{},[370675],{"type":23,"value":370676},"If you want to try out Passthrough API, you can follow these steps:",{"type":17,"tag":80,"props":370678,"children":370679},{},[370680,370685,370690,370695],{"type":17,"tag":84,"props":370681,"children":370682},{},[370683],{"type":23,"value":370684},"Make sure you have a customer's connection with the integration you want to access through Passthrough API. You can check your connections in your Unified.to dashboard.",{"type":17,"tag":84,"props":370686,"children":370687},{},[370688],{"type":23,"value":370689},"Read the documentation for Passthrough API and learn how to format your requests and responses.",{"type":17,"tag":84,"props":370691,"children":370692},{},[370693],{"type":23,"value":370694},"Use your preferred tool or language to send a request to Unified.to's Passthrough endpoint with the required parameters.",{"type":17,"tag":84,"props":370696,"children":370697},{},[370698],{"type":23,"value":370699},"Receive the response from the vendor and process it as you wish.",{"type":17,"tag":29,"props":370701,"children":370702},{},[370703],{"type":23,"value":370704},"We hope you enjoy this new feature and find it useful for your projects. We are always looking for feedback and suggestions on how to improve our products and services. Please feel free to contact us if you have any questions or comments.",{"type":17,"tag":29,"props":370706,"children":370707},{},[370708],{"type":23,"value":370709},"We are excited to see what you are going to build with Passthrough API! 🚀",{"title":7,"searchDepth":1629,"depth":1629,"links":370711},[370712,370713],{"id":370614,"depth":1629,"text":370617},{"id":370668,"depth":1629,"text":370671},"content:blog:passthrough_api_a_new_way_to_connect_with_your_integrations.md","blog/passthrough_api_a_new_way_to_connect_with_your_integrations.md","blog/passthrough_api_a_new_way_to_connect_with_your_integrations",{"_path":370718,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":370719,"description":370720,"img":370721,"date":370722,"tag":6341,"body":370723,"_type":1677,"_id":370921,"_source":1679,"_file":370922,"_stem":370923,"_extension":1682},"/blog/how_to_register_a_workday_developer_app_and_get_oauth2_credentials","How to Register a Workday Developer App and Get OAUTH2 Credentials","As a developer of an application in the HR space, you absolutely need to have a Workday integration so that you can access your customers' data in the most...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_credentials-icon.png","2023-03-13T00:00:00.000Z",{"type":14,"children":370724,"toc":370915},[370725,370730,370733,370741,370746,370751,370757,370847,370859,370864,370882,370888],{"type":17,"tag":18,"props":370726,"children":370728},{"id":370727},"how-to-register-a-workday-developer-app-and-get-oauth2-credentials",[370729],{"type":23,"value":370719},{"type":17,"tag":25,"props":370731,"children":370732},{},[],{"type":17,"tag":29,"props":370734,"children":370735},{},[370736],{"type":17,"tag":33,"props":370737,"children":370738},{},[370739],{"type":23,"value":370740},"March 13, 2023",{"type":17,"tag":29,"props":370742,"children":370743},{},[370744],{"type":23,"value":370745},"As a developer of an application in the HR space, you absolutely need to have a Workday integration so that you can access your customers' data in the most popular HRIS vendor, Workday.",{"type":17,"tag":29,"props":370747,"children":370748},{},[370749],{"type":23,"value":370750},"Before you can use Unified.to's HRIS and ATS unified APIs with Workday, you must get your customer to generate Workday API credentials for your application.",{"type":17,"tag":68,"props":370752,"children":370754},{"id":370753},"register-a-new-api-client-in-workday",[370755],{"type":23,"value":370756},"Register a new API Client in Workday",{"type":17,"tag":6154,"props":370758,"children":370759},{},[370760,370765,370770,370808,370820,370825,370830,370842],{"type":17,"tag":84,"props":370761,"children":370762},{},[370763],{"type":23,"value":370764},"Sign-in to the Workday tenant",{"type":17,"tag":84,"props":370766,"children":370767},{},[370768],{"type":23,"value":370769},"Search for 'Register API Client for Integration' using the search bar",{"type":17,"tag":84,"props":370771,"children":370772},{},[370773,370775,370801,370804],{"type":23,"value":370774},"Fill out the requested inputs with the following example details:",{"type":17,"tag":6154,"props":370776,"children":370777},{},[370778,370786,370791,370796],{"type":17,"tag":84,"props":370779,"children":370780},{},[370781,370783],{"type":23,"value":370782},"Client Name; ",{"type":17,"tag":199669,"props":370784,"children":370785},{"application":7,"name":7},[],{"type":17,"tag":84,"props":370787,"children":370788},{},[370789],{"type":23,"value":370790},"Refresh Token Timeout; 0 days (ie. never)",{"type":17,"tag":84,"props":370792,"children":370793},{},[370794],{"type":23,"value":370795},"Non-Expiring Refresh Token: Checked",{"type":17,"tag":84,"props":370797,"children":370798},{},[370799],{"type":23,"value":370800},"Scope: Choose all of the permission scopes for the use-case.  Minimum should be Worker/Employee access",{"type":17,"tag":3891,"props":370802,"children":370803},{},[],{"type":17,"tag":6438,"props":370805,"children":370807},{"alt":6440,"src":370806},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_credentials-0.png",[],{"type":17,"tag":84,"props":370809,"children":370810},{},[370811,370813,370816],{"type":23,"value":370812},"Once the API client has been registered, go to 'Related Actions' icon ⇒ 'API Client' ⇒ 'Manage Refresh Tokens for Integrations'",{"type":17,"tag":3891,"props":370814,"children":370815},{},[],{"type":17,"tag":6438,"props":370817,"children":370819},{"alt":6440,"src":370818},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_credentials-1.png",[],{"type":17,"tag":84,"props":370821,"children":370822},{},[370823],{"type":23,"value":370824},"Remember the Client ID and Client Secret",{"type":17,"tag":84,"props":370826,"children":370827},{},[370828],{"type":23,"value":370829},"Enter the 'Integration System User (ISU)' in the Workday Account field. This ISU needs to have access to all of the resources that you need for the API.",{"type":17,"tag":84,"props":370831,"children":370832},{},[370833,370835,370838],{"type":23,"value":370834},"Check the \"Regenerate New Refresh Token\" box and click OK.",{"type":17,"tag":3891,"props":370836,"children":370837},{},[],{"type":17,"tag":6438,"props":370839,"children":370841},{"alt":6440,"src":370840},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_workday_developer_app_and_get_oauth2_credentials-2.png",[],{"type":17,"tag":84,"props":370843,"children":370844},{},[370845],{"type":23,"value":370846},"A new refresh token will be generated.  Remember that Refresh Token.",{"type":17,"tag":68,"props":370848,"children":370850},{"id":370849},"use-unifiedto-to-simplify-your-integrations-development",[370851,370852,370857],{"type":23,"value":33722},{"type":17,"tag":133,"props":370853,"children":370855},{"href":212,"rel":370854},[214],[370856],{"type":23,"value":217},{"type":23,"value":370858}," to Simplify your Integrations Development",{"type":17,"tag":29,"props":370860,"children":370861},{},[370862],{"type":23,"value":370863},"Using Workday APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",{"type":17,"tag":29,"props":370865,"children":370866},{},[370867,370869,370874,370876,370880],{"type":23,"value":370868},"A simpler and faster alternative is to use ",{"type":17,"tag":133,"props":370870,"children":370872},{"href":42620,"rel":370871},[214],[370873],{"type":23,"value":217},{"type":23,"value":370875}," APIs for HRIS and ATS integrations. It provides a unified set of APIs, data-models, and ",{"type":17,"tag":133,"props":370877,"children":370878},{"href":4999},[370879],{"type":23,"value":5002},{"type":23,"value":370881}," for most of the HRIS and ATS integrations.",{"type":17,"tag":68,"props":370883,"children":370885},{"id":370884},"activate-workday-in-unifiedto",[370886],{"type":23,"value":370887},"Activate Workday in Unified.to",{"type":17,"tag":6154,"props":370889,"children":370890},{},[370891,370900,370905,370910],{"type":17,"tag":84,"props":370892,"children":370893},{},[370894,370895],{"type":23,"value":42939},{"type":17,"tag":133,"props":370896,"children":370898},{"href":329567,"rel":370897},[214],[370899],{"type":23,"value":341393},{"type":17,"tag":84,"props":370901,"children":370902},{},[370903],{"type":23,"value":370904},"Search for Workday",{"type":17,"tag":84,"props":370906,"children":370907},{},[370908],{"type":23,"value":370909},"Click on Activate on Workday",{"type":17,"tag":84,"props":370911,"children":370912},{},[370913],{"type":23,"value":370914},"Enter in the information from the previous step (client ID, secret, endpoints/URLs)",{"title":7,"searchDepth":1629,"depth":1629,"links":370916},[370917,370918,370920],{"id":370753,"depth":1629,"text":370756},{"id":370849,"depth":1629,"text":370919},"Use Unified.to to Simplify your Integrations Development",{"id":370884,"depth":1629,"text":370887},"content:blog:how_to_register_a_workday_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_a_workday_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_a_workday_developer_app_and_get_oauth2_credentials",{"_path":370925,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":370926,"description":370927,"img":370928,"date":370929,"tag":12,"body":370930,"_type":1677,"_id":371377,"_source":1679,"_file":371378,"_stem":371379,"_extension":1682},"/blog/an_overview_of_unified_apis","An Overview of Unified APIs","A unified API is an integration of multiple APIs into one service with one common interface and data-model.","https://s3.us-east-2.amazonaws.com/unified-article-images/an_overview_of_unified_apis-icon.png","2023-02-19T00:00:00.000Z",{"type":14,"children":370931,"toc":371356},[370932,370937,370940,370948,370953,370963,370968,370974,370980,370985,370990,370995,371001,371006,371012,371018,371027,371037,371047,371057,371070,371076,371081,371092,371097,371102,371107,371111,371116,371120,371138,371144,371149,371154,371160,371165,371171,371176,371182,371187,371205,371211,371216,371235,371247,371260,371273,371279,371284,371289,371294,371307,371341,371346],{"type":17,"tag":18,"props":370933,"children":370935},{"id":370934},"an-overview-of-unified-apis",[370936],{"type":23,"value":370926},{"type":17,"tag":25,"props":370938,"children":370939},{},[],{"type":17,"tag":29,"props":370941,"children":370942},{},[370943],{"type":17,"tag":33,"props":370944,"children":370945},{},[370946],{"type":23,"value":370947},"February 19, 2023",{"type":17,"tag":68,"props":370949,"children":370950},{"id":78628},[370951],{"type":23,"value":370952},"What is a Unified API?",{"type":17,"tag":29,"props":370954,"children":370955},{},[370956,370957,370961],{"type":23,"value":9619},{"type":17,"tag":133,"props":370958,"children":370959},{"href":7691},[370960],{"type":23,"value":7459},{"type":23,"value":370962}," is an integration of multiple APIs into one service with one common interface and data-model.",{"type":17,"tag":29,"props":370964,"children":370965},{},[370966],{"type":23,"value":370967},"The benefit of using a unified API is that it allows you to leverage the best features from each individual API without having to build out your own custom integration into each one.\nA popular use case for unified APIs is when you want to access your customers' CRM data in your application, but don't want to spend time building out all the different CRM platforms individually. Instead, you can use one unified API that supports all major CRM vendors like Salesforce, HubSpot, and PipeDrive.",{"type":17,"tag":68,"props":370969,"children":370971},{"id":370970},"what-are-the-benefits-of-using-a-unified-api",[370972],{"type":23,"value":370973},"What Are the Benefits of Using a Unified API?",{"type":17,"tag":239,"props":370975,"children":370977},{"id":370976},"faster-development",[370978],{"type":23,"value":370979},"Faster development:",{"type":17,"tag":29,"props":370981,"children":370982},{},[370983],{"type":23,"value":370984},"Unified APIs enable developers to create new applications and services more quickly, so they can get to market faster.",{"type":17,"tag":239,"props":370986,"children":370988},{"id":370987},"reduced-complexity",[370989],{"type":23,"value":332902},{"type":17,"tag":29,"props":370991,"children":370992},{},[370993],{"type":23,"value":370994},"Unified APIs allow you to use one set of tools for all your data needs, instead of having multiple systems that need to be integrated and maintained separately.",{"type":17,"tag":239,"props":370996,"children":370998},{"id":370997},"increased-total-addressable-market",[370999],{"type":23,"value":371000},"Increased Total Addressable Market:",{"type":17,"tag":29,"props":371002,"children":371003},{},[371004],{"type":23,"value":371005},"By supporting the largest number of 3rd-party vendors, you expand your total addressable market by enlarging your user-base that can use your application.",{"type":17,"tag":68,"props":371007,"children":371009},{"id":371008},"what-to-look-for-in-a-unified-api",[371010],{"type":23,"value":371011},"What to look for in a Unified API?",{"type":17,"tag":239,"props":371013,"children":371015},{"id":371014},"abstraction-unification",[371016],{"type":23,"value":371017},"Abstraction & Unification",{"type":17,"tag":29,"props":371019,"children":371020},{},[371021,371025],{"type":17,"tag":48,"props":371022,"children":371023},{},[371024],{"type":23,"value":261107},{"type":23,"value":371026}," A Unified API needs to have unified/common API endpoints for specific categories of integrations.  That sounds obvious given the 'Unified API' term, but most API solutions actually do not offer this.  An API to get a list of CRM contacts should be the exact same regardless of which integration that it is getting data from (eg. Salesforce vs Hubspot).",{"type":17,"tag":29,"props":371028,"children":371029},{},[371030,371035],{"type":17,"tag":48,"props":371031,"children":371032},{},[371033],{"type":23,"value":371034},"Data-Models:",{"type":23,"value":371036}," Not only must API endpoints be unified, but the data models used by those APIs must be unified as well.  A CRM contact object returned from Hubspot should have the same structure as a CRM contact object returned from Salesforce.  The number of fields in those common/unified objects should be sufficient to satisfy your use case.",{"type":17,"tag":29,"props":371038,"children":371039},{},[371040,371045],{"type":17,"tag":48,"props":371041,"children":371042},{},[371043],{"type":23,"value":371044},"Authentication:",{"type":23,"value":371046}," The method to authorize access to your customer's data in third-party vendors needs to be simple to use and unified for all integrations.  Common information for the integration should be readily available so that your application can display it natively or the vendor should have an authentication widget.",{"type":17,"tag":29,"props":371048,"children":371049},{},[371050,371055],{"type":17,"tag":48,"props":371051,"children":371052},{},[371053],{"type":23,"value":371054},"Permission Scopes:",{"type":23,"value":371056}," Along with common/unified authentication, there should be a mechanism for abstracted permission scopes so that you do not need to research each vendor's OAUTH2 scopes for your use case",{"type":17,"tag":29,"props":371058,"children":371059},{},[371060,371068],{"type":17,"tag":48,"props":371061,"children":371062},{},[371063,371067],{"type":17,"tag":133,"props":371064,"children":371065},{"href":4999},[371066],{"type":23,"value":43896},{"type":23,"value":20456},{"type":23,"value":371069}," Finally, while some vendors support webhooks, most do not.  A Unified API solution should abstract all of the complexities of handling those vendors that do not support webhooks and provide a unified webhook experience.",{"type":17,"tag":239,"props":371071,"children":371073},{"id":371072},"ease-of-implementation-and-maintenance",[371074],{"type":23,"value":371075},"Ease of implementation and Maintenance:",{"type":17,"tag":29,"props":371077,"children":371078},{},[371079],{"type":23,"value":371080},"How fast can you build a prototype using the Unified API?  How fast can you scale that implementation in your production environment?",{"type":17,"tag":29,"props":371082,"children":371083},{},[371084,371086,371090],{"type":23,"value":371085},"Do they provide rich detailed ",{"type":17,"tag":133,"props":371087,"children":371088},{"href":129820},[371089],{"type":23,"value":353269},{"type":23,"value":371091},"? Do they have API Explorers that allow you to test each of the APIs?",{"type":17,"tag":29,"props":371093,"children":371094},{},[371095],{"type":23,"value":371096},"Do they support a modern, easy, and logical API endpoint path format that makes it easy to build and understand?",{"type":17,"tag":29,"props":371098,"children":371099},{},[371100],{"type":23,"value":371101},"Will you need to handle any external connections to vendors that isn't handled by the Unified API vendor?",{"type":17,"tag":29,"props":371103,"children":371104},{},[371105],{"type":23,"value":371106},"Will you need to rebuild or update your integration into the Unified API vendor when they release a new version?",{"type":17,"tag":239,"props":371108,"children":371109},{"id":94791},[371110],{"type":23,"value":260832},{"type":17,"tag":29,"props":371112,"children":371113},{},[371114],{"type":23,"value":371115},"You want to make sure that the unified API vendor that you choose has a good track record of keeping data safe and secure and has processes in place.",{"type":17,"tag":29,"props":371117,"children":371118},{},[371119],{"type":23,"value":104307},{"type":17,"tag":80,"props":371121,"children":371122},{},[371123,371128,371133],{"type":17,"tag":84,"props":371124,"children":371125},{},[371126],{"type":23,"value":371127},"do they encrypt their database, especially for OAUTH2 client credentials (clientId/clientSecret)?",{"type":17,"tag":84,"props":371129,"children":371130},{},[371131],{"type":23,"value":371132},"can they store your customers' access tokens in an external secure external storage (eg. AWS Secure Manager)?",{"type":17,"tag":84,"props":371134,"children":371135},{},[371136],{"type":23,"value":371137},"do they store any of your customers' 3rd-party data at all or do they just have that data transit through their systems?",{"type":17,"tag":239,"props":371139,"children":371141},{"id":371140},"reliability",[371142],{"type":23,"value":371143},"Reliability:",{"type":17,"tag":29,"props":371145,"children":371146},{},[371147],{"type":23,"value":371148},"Your app needs to be able to rely on the Unified API provider being there when it needs it, so look for a company that has an SLA and process to notify its customers when something isn't right. Where is the Unified API vendor hosted and how have they scaled their system?",{"type":17,"tag":29,"props":371150,"children":371151},{},[371152],{"type":23,"value":371153},"Does the Unified API vendor know when a third-party vendor connection isn't working before your customer does?",{"type":17,"tag":239,"props":371155,"children":371157},{"id":371156},"scalability",[371158],{"type":23,"value":371159},"Scalability:",{"type":17,"tag":29,"props":371161,"children":371162},{},[371163],{"type":23,"value":371164},"When your app becomes popular, then you'll need an API that can scale with demand — otherwise, your users will have trouble accessing the service or worse yet get frustrated with slow response times as traffic increases.",{"type":17,"tag":239,"props":371166,"children":371168},{"id":371167},"customization-branding",[371169],{"type":23,"value":371170},"Customization & Branding:",{"type":17,"tag":29,"props":371172,"children":371173},{},[371174],{"type":23,"value":371175},"Because Unified API companies are providing an underlying technology for you to better build your application, their technology needs to be hidden to your users.  Choose a vendor that allows you to use your own branding, including OAUTH2 credentials.",{"type":17,"tag":239,"props":371177,"children":371179},{"id":371178},"transparency",[371180],{"type":23,"value":371181},"Transparency:",{"type":17,"tag":29,"props":371183,"children":371184},{},[371185],{"type":23,"value":371186},"Trust is paramount for you to include a Unified API vendor's technology inside of your own application.  To that end, you need them to be fully transparent with you.  This includes:",{"type":17,"tag":80,"props":371188,"children":371189},{},[371190,371195,371200],{"type":17,"tag":84,"props":371191,"children":371192},{},[371193],{"type":23,"value":371194},"overall system uptime",{"type":17,"tag":84,"props":371196,"children":371197},{},[371198],{"type":23,"value":371199},"current errors in their system (and when they will be resolved)",{"type":17,"tag":84,"props":371201,"children":371202},{},[371203],{"type":23,"value":371204},"which integrations are appropriate for your application's use case (and which one aren't so that you don't offer then to your customers and have them disappointed)",{"type":17,"tag":239,"props":371206,"children":371208},{"id":371207},"use-case-compatibility",[371209],{"type":23,"value":371210},"Use Case Compatibility:",{"type":17,"tag":29,"props":371212,"children":371213},{},[371214],{"type":23,"value":371215},"Not all Unified API vendors are similar as not all of them will support the use case that your application requires.",{"type":17,"tag":29,"props":371217,"children":371218},{},[371219,371221,371226,371228,371234],{"type":23,"value":371220},"Some applications will want to only read in the name and email of a customer's ",{"type":17,"tag":133,"props":371222,"children":371224},{"href":343784,"rel":371223},[214],[371225],{"type":23,"value":31619},{"type":23,"value":371227}," in their CRM.  But may need a large number of supported vendors in any one category (eg. CRMs).  The number of supported vendors in any one unified API category is called ",{"type":17,"tag":6121,"props":371229,"children":371231},{"className":371230},[],[371232],{"type":23,"value":371233},"Breadth",{"type":23,"value":54},{"type":17,"tag":29,"props":371236,"children":371237},{},[371238,371240,371245],{"type":23,"value":371239},"While other applications will require a lot more fields in the common data-model.  For example, an HR application may require the ",{"type":17,"tag":133,"props":371241,"children":371243},{"href":343907,"rel":371242},[214],[371244],{"type":23,"value":58244},{"type":23,"value":371246},"' vacation history, date-of-birth, and years of tenure.",{"type":17,"tag":29,"props":371248,"children":371249},{},[371250,371252,371258],{"type":23,"value":371251},"The number of support fields in the common data-model is called ",{"type":17,"tag":6121,"props":371253,"children":371255},{"className":371254},[],[371256],{"type":23,"value":371257},"Depth",{"type":23,"value":371259},".  More complicated use cases will require more depth.",{"type":17,"tag":29,"props":371261,"children":371262},{},[371263,371265,371271],{"type":23,"value":371264},"Does your application require more than one API category?  For example, if you are building a customer monitoring application, you will want to synchronize with your customer's CRM, Support Ticketing, Call Center and probably even Marketing Tech vendors.  All to get an accurate 'picture' of your customer's customers.  Unified API vendors who support multiple vendor categories focus on ",{"type":17,"tag":6121,"props":371266,"children":371268},{"className":371267},[],[371269],{"type":23,"value":371270},"Clustering",{"type":23,"value":371272}," of a common object (in this case, a customer).",{"type":17,"tag":239,"props":371274,"children":371276},{"id":371275},"pricing-models-and-cost-at-scale",[371277],{"type":23,"value":371278},"Pricing Models and Cost at Scale:",{"type":17,"tag":29,"props":371280,"children":371281},{},[371282],{"type":23,"value":371283},"While most Unified API vendors have a free pricing tier, what is important for the success of your application is how much will this cost when your application grows and scales?",{"type":17,"tag":29,"props":371285,"children":371286},{},[371287],{"type":23,"value":371288},"Consider what % of your selling price will be taken by the cost of the Unified API vendor.",{"type":17,"tag":29,"props":371290,"children":371291},{},[371292],{"type":23,"value":371293},"Consideration should also be taken by the actual pricing model; is it based on API usage, Connections, of Customers?  And how does that compare to your application's pricing model?  If you extrapolate out these two values on a graph or spreadsheet, you will clearly see if their pricing model fits your business model.",{"type":17,"tag":68,"props":371295,"children":371297},{"id":371296},"check-out-unifiedto-for-the-best-unified-api-for-your-use-case",[371298,371300,371305],{"type":23,"value":371299},"Check out ",{"type":17,"tag":133,"props":371301,"children":371303},{"href":212,"rel":371302},[214],[371304],{"type":23,"value":217},{"type":23,"value":371306}," for the Best Unified API for your Use Case",{"type":17,"tag":29,"props":371308,"children":371309},{},[371310,371312,371317,371319,371324,371326,371331,371333,371339],{"type":23,"value":371311},"We've built ",{"type":17,"tag":133,"props":371313,"children":371315},{"href":212,"rel":371314},[214],[371316],{"type":23,"value":217},{"type":23,"value":371318}," with all of these criteria in mind.  We are trying to be both best in ",{"type":17,"tag":6121,"props":371320,"children":371322},{"className":371321},[],[371323],{"type":23,"value":371233},{"type":23,"value":371325}," (number of vendors supported), ",{"type":17,"tag":6121,"props":371327,"children":371329},{"className":371328},[],[371330],{"type":23,"value":371257},{"type":23,"value":371332}," (number of common data fields supported), while also delivering common API vendors that are in a common ",{"type":17,"tag":6121,"props":371334,"children":371336},{"className":371335},[],[371337],{"type":23,"value":371338},"Cluster",{"type":23,"value":371340},".  We've done this to support the most amount of use cases by our customers as possible.",{"type":17,"tag":29,"props":371342,"children":371343},{},[371344],{"type":23,"value":371345},"We are also very security conscious and take your customer's data security concerns very seriously.",{"type":17,"tag":29,"props":371347,"children":371348},{},[371349,371354],{"type":17,"tag":133,"props":371350,"children":371352},{"href":215330,"rel":371351},[214],[371353],{"type":23,"value":281511},{"type":23,"value":371355}," how we can better support you and your application's use case.",{"title":7,"searchDepth":1629,"depth":1629,"links":371357},[371358,371359,371364,371375],{"id":78628,"depth":1629,"text":370952},{"id":370970,"depth":1629,"text":370973,"children":371360},[371361,371362,371363],{"id":370976,"depth":1635,"text":370979},{"id":370987,"depth":1635,"text":332902},{"id":370997,"depth":1635,"text":371000},{"id":371008,"depth":1629,"text":371011,"children":371365},[371366,371367,371368,371369,371370,371371,371372,371373,371374],{"id":371014,"depth":1635,"text":371017},{"id":371072,"depth":1635,"text":371075},{"id":94791,"depth":1635,"text":260832},{"id":371140,"depth":1635,"text":371143},{"id":371156,"depth":1635,"text":371159},{"id":371167,"depth":1635,"text":371170},{"id":371178,"depth":1635,"text":371181},{"id":371207,"depth":1635,"text":371210},{"id":371275,"depth":1635,"text":371278},{"id":371296,"depth":1629,"text":371376},"Check out Unified.to for the Best Unified API for your Use Case","content:blog:an_overview_of_unified_apis.md","blog/an_overview_of_unified_apis.md","blog/an_overview_of_unified_apis",{"_path":371381,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":371382,"description":371383,"img":371384,"date":371385,"tag":6341,"body":371386,"_type":1677,"_id":371845,"_source":1679,"_file":371846,"_stem":371847,"_extension":1682},"/blog/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps","How to get your HubSpot developer key and OAuth 2 credentials (Legacy Apps)","This guide will show you how to retrieve your OAuth 2 credentials and developer API key in HubSpot.","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-icon.png","2023-02-12T00:00:00.000Z",{"type":14,"children":371387,"toc":371835},[371388,371393,371396,371404,371414,371423,371429,371434,371463,371469,371480,371522,371528,371533,371553,371560,371644,371657,371669,371704,371710,371743,371749,371812,371816],{"type":17,"tag":18,"props":371389,"children":371391},{"id":371390},"how-to-get-your-hubspot-developer-key-and-oauth-2-credentials-legacy-apps",[371392],{"type":23,"value":371382},{"type":17,"tag":25,"props":371394,"children":371395},{},[],{"type":17,"tag":29,"props":371397,"children":371398},{},[371399],{"type":17,"tag":33,"props":371400,"children":371401},{},[371402],{"type":23,"value":371403},"February 12, 2023",{"type":17,"tag":29,"props":371405,"children":371406},{},[371407,371408,371412],{"type":23,"value":278072},{"type":17,"tag":133,"props":371409,"children":371410},{"href":779},[371411],{"type":23,"value":782},{"type":23,"value":371413}," 2 credentials and developer API key in HubSpot.",{"type":17,"tag":29,"props":371415,"children":371416},{},[371417,371421],{"type":17,"tag":48,"props":371418,"children":371419},{},[371420],{"type":23,"value":150919},{"type":23,"value":371422},": HubSpot allows you to create different types of apps - public and private. This guide is about public apps.",{"type":17,"tag":68,"props":371424,"children":371426},{"id":371425},"register-a-hubspot-developer-account",[371427],{"type":23,"value":371428},"Register a HubSpot Developer Account",{"type":17,"tag":29,"props":371430,"children":371431},{},[371432],{"type":23,"value":371433},"First, you'll need to register for a free account on HubSpot if you haven't already.",{"type":17,"tag":6154,"props":371435,"children":371436},{},[371437,371449,371458],{"type":17,"tag":84,"props":371438,"children":371439},{},[371440,371441,371448],{"type":23,"value":42715},{"type":17,"tag":133,"props":371442,"children":371445},{"href":371443,"rel":371444},"https://developers.hubspot.com/get-started",[214],[371446],{"type":23,"value":371447},"HubSpot Developers portal",{"type":23,"value":54},{"type":17,"tag":84,"props":371450,"children":371451},{},[371452,371453],{"type":23,"value":6629},{"type":17,"tag":48,"props":371454,"children":371455},{},[371456],{"type":23,"value":371457},"Create App Developer Account.",{"type":17,"tag":84,"props":371459,"children":371460},{},[371461],{"type":23,"value":371462},"Follow the onboarding to complete your account setup.",{"type":17,"tag":68,"props":371464,"children":371466},{"id":371465},"get-your-hubspot-developer-api-key",[371467],{"type":23,"value":371468},"Get your HubSpot Developer API key",{"type":17,"tag":29,"props":371470,"children":371471},{},[371472,371474,371478],{"type":23,"value":371473},"Developer account API keys are separate from standard API keys - they can be used to manage subscriptions for ",{"type":17,"tag":133,"props":371475,"children":371476},{"href":4999},[371477],{"type":23,"value":5002},{"type":23,"value":371479}," and other HubSpot features.",{"type":17,"tag":6154,"props":371481,"children":371482},{},[371483,371496,371506,371511],{"type":17,"tag":84,"props":371484,"children":371485},{},[371486,371488,371495],{"type":23,"value":371487},"Inside the HubSpot developer dashboard, open the sidebar and click ",{"type":17,"tag":133,"props":371489,"children":371492},{"href":371490,"rel":371491},"https://app.hubspot.com/developer/47094559/applications",[214],[371493],{"type":23,"value":371494},"Apps",{"type":23,"value":54},{"type":17,"tag":84,"props":371497,"children":371498},{},[371499,371500,371505],{"type":23,"value":6629},{"type":17,"tag":48,"props":371501,"children":371502},{},[371503],{"type":23,"value":371504},"Get HubSpot API key",{"type":23,"value":54},{"type":17,"tag":84,"props":371507,"children":371508},{},[371509],{"type":23,"value":371510},"Follow the instructions to create a Developer API key.",{"type":17,"tag":84,"props":371512,"children":371513},{},[371514,371515,371520],{"type":23,"value":6629},{"type":17,"tag":48,"props":371516,"children":371517},{},[371518],{"type":23,"value":371519},"Show key",{"type":23,"value":371521}," to reveal your key. You will need this for the final step.",{"type":17,"tag":68,"props":371523,"children":371525},{"id":371524},"create-a-hubspot-app",[371526],{"type":23,"value":371527},"Create a HubSpot app",{"type":17,"tag":29,"props":371529,"children":371530},{},[371531],{"type":23,"value":371532},"A HubSpot app is a container for your integration settings and is where you'll create and find your OAuth 2 credentials.",{"type":17,"tag":6154,"props":371534,"children":371535},{},[371536],{"type":17,"tag":84,"props":371537,"children":371538},{},[371539,371541,371546,371548],{"type":23,"value":371540},"On the Development page → Legacy Apps→ click ",{"type":17,"tag":48,"props":371542,"children":371543},{},[371544],{"type":23,"value":371545},"Create Legacy App →",{"type":23,"value":371547}," Select ",{"type":17,"tag":48,"props":371549,"children":371550},{},[371551],{"type":23,"value":371552},"Public App.",{"type":17,"tag":29,"props":371554,"children":371555},{},[371556],{"type":17,"tag":6438,"props":371557,"children":371559},{"alt":6440,"src":371558},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-0.png",[],{"type":17,"tag":6154,"props":371561,"children":371562},{},[371563,371568,371577,371602,371634],{"type":17,"tag":84,"props":371564,"children":371565},{},[371566],{"type":23,"value":371567},"Give your app a name and description.",{"type":17,"tag":84,"props":371569,"children":371570},{},[371571,371572,371576],{"type":23,"value":329656},{"type":17,"tag":48,"props":371573,"children":371574},{},[371575],{"type":23,"value":146708},{"type":23,"value":6557},{"type":17,"tag":84,"props":371578,"children":371579},{},[371580,371581,371585,371586,371594,371597],{"type":23,"value":146715},{"type":17,"tag":48,"props":371582,"children":371583},{},[371584],{"type":23,"value":329006},{"type":23,"value":329008},{"type":17,"tag":48,"props":371587,"children":371588},{},[371589],{"type":17,"tag":6121,"props":371590,"children":371592},{"className":371591},[],[371593],{"type":23,"value":42417},{"type":17,"tag":3891,"props":371595,"children":371596},{},[],{"type":17,"tag":6438,"props":371598,"children":371601},{"alt":371599,"src":371600},"Screenshot_2024-08-16_at_3.41.50_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-1.png",[],{"type":17,"tag":84,"props":371603,"children":371604},{},[371605,371606,371611,371613,371618,371620,371626,371629],{"type":23,"value":146715},{"type":17,"tag":48,"props":371607,"children":371608},{},[371609],{"type":23,"value":371610},"Scopes,",{"type":23,"value":371612}," click ",{"type":17,"tag":48,"props":371614,"children":371615},{},[371616],{"type":23,"value":371617},"Add new scopes",{"type":23,"value":371619}," and select the permissions that your application will require. For example, if your application reads Deals, then select ",{"type":17,"tag":6121,"props":371621,"children":371623},{"className":371622},[],[371624],{"type":23,"value":371625},"crm.deal.read",{"type":17,"tag":3891,"props":371627,"children":371628},{},[],{"type":17,"tag":6438,"props":371630,"children":371633},{"alt":371631,"src":371632},"ba5f5e7e-5c03-49b4-8662-75d3a50f4f01.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-2.png",[],{"type":17,"tag":84,"props":371635,"children":371636},{},[371637,371638,371642],{"type":23,"value":6629},{"type":17,"tag":48,"props":371639,"children":371640},{},[371641],{"type":23,"value":158559},{"type":23,"value":371643}," to finish setting up your app.",{"type":17,"tag":68,"props":371645,"children":371647},{"id":371646},"optional-add-the-oauth-scope-to-your-app",[371648,371650,371655],{"type":23,"value":371649},"(optional) Add the ",{"type":17,"tag":6121,"props":371651,"children":371653},{"className":371652},[],[371654],{"type":23,"value":146777},{"type":23,"value":371656}," scope to your app",{"type":17,"tag":29,"props":371658,"children":371659},{},[371660,371662,371667],{"type":23,"value":371661},"For apps created before April 2024, the ",{"type":17,"tag":6121,"props":371663,"children":371665},{"className":371664},[],[371666],{"type":23,"value":146777},{"type":23,"value":371668}," scope may be missing from your app's auth settings. Apps created after this date have it on by default. This scope is required for the HubSpot integration to work.",{"type":17,"tag":6154,"props":371670,"children":371671},{},[371672,371686,371695],{"type":17,"tag":84,"props":371673,"children":371674},{},[371675,371676,371680,371681],{"type":23,"value":146715},{"type":17,"tag":48,"props":371677,"children":371678},{},[371679],{"type":23,"value":42815},{"type":23,"value":333099},{"type":17,"tag":48,"props":371682,"children":371683},{},[371684],{"type":23,"value":371685},"Add new scope.",{"type":17,"tag":84,"props":371687,"children":371688},{},[371689,371690,371694],{"type":23,"value":127300},{"type":17,"tag":48,"props":371691,"children":371692},{},[371693],{"type":23,"value":146777},{"type":23,"value":345608},{"type":17,"tag":84,"props":371696,"children":371697},{},[371698,371699,371703],{"type":23,"value":6629},{"type":17,"tag":48,"props":371700,"children":371701},{},[371702],{"type":23,"value":109982},{"type":23,"value":54},{"type":17,"tag":68,"props":371705,"children":371707},{"id":371706},"get-your-oauth-2-credentials",[371708],{"type":23,"value":371709},"Get your OAuth 2 credentials",{"type":17,"tag":6154,"props":371711,"children":371712},{},[371713,371723],{"type":17,"tag":84,"props":371714,"children":371715},{},[371716,371718,371722],{"type":23,"value":371717},"After creating your app, you will be redirected to the App Info tab. Click again on the ",{"type":17,"tag":48,"props":371719,"children":371720},{},[371721],{"type":23,"value":146708},{"type":23,"value":6557},{"type":17,"tag":84,"props":371724,"children":371725},{},[371726,371728,371733,371735,371738],{"type":23,"value":371727},"Your unique ",{"type":17,"tag":48,"props":371729,"children":371730},{},[371731],{"type":23,"value":371732},"Client ID and Client secret",{"type":23,"value":371734}," will be displayed. You will need these for the next step.",{"type":17,"tag":3891,"props":371736,"children":371737},{},[],{"type":17,"tag":6438,"props":371739,"children":371742},{"alt":371740,"src":371741},"Screenshot_2024-08-16_at_3.52.29_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-3.png",[],{"type":17,"tag":68,"props":371744,"children":371746},{"id":371745},"activate-the-hubspot-integration-in-unifiedto-with-your-client-id-and-secret",[371747],{"type":23,"value":371748},"Activate the HubSpot integration in Unified.to with your client ID and secret",{"type":17,"tag":6154,"props":371750,"children":371751},{},[371752,371762,371794],{"type":17,"tag":84,"props":371753,"children":371754},{},[371755,371756],{"type":23,"value":341174},{"type":17,"tag":133,"props":371757,"children":371759},{"href":341177,"rel":371758},[214],[371760],{"type":23,"value":371761},"the HubSpot integration in Unified.to",{"type":17,"tag":84,"props":371763,"children":371764},{},[371765,371767],{"type":23,"value":371766},"You will need the following three pieces of information from the earlier steps:",{"type":17,"tag":6154,"props":371768,"children":371769},{},[371770,371777,371784],{"type":17,"tag":84,"props":371771,"children":371772},{},[371773],{"type":17,"tag":48,"props":371774,"children":371775},{},[371776],{"type":23,"value":6040},{"type":17,"tag":84,"props":371778,"children":371779},{},[371780],{"type":17,"tag":48,"props":371781,"children":371782},{},[371783],{"type":23,"value":125508},{"type":17,"tag":84,"props":371785,"children":371786},{},[371787,371792],{"type":17,"tag":48,"props":371788,"children":371789},{},[371790],{"type":23,"value":371791},"Developer API key",{"type":23,"value":371793}," from the developer dashboard",{"type":17,"tag":84,"props":371795,"children":371796},{},[371797,371798,371802,371804,371807],{"type":23,"value":341208},{"type":17,"tag":48,"props":371799,"children":371800},{},[371801],{"type":23,"value":278235},{"type":23,"value":371803}," is selected above.",{"type":17,"tag":3891,"props":371805,"children":371806},{},[],{"type":17,"tag":6438,"props":371808,"children":371811},{"alt":371809,"src":371810},"Screenshot_2024-08-16_at_4.19.04_PM.png","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-4.png",[],{"type":17,"tag":68,"props":371813,"children":371814},{"id":332205},[371815],{"type":23,"value":332208},{"type":17,"tag":80,"props":371817,"children":371818},{},[371819,371827],{"type":17,"tag":84,"props":371820,"children":371821},{},[371822],{"type":17,"tag":133,"props":371823,"children":371825},{"href":337118,"rel":371824},[214],[371826],{"type":23,"value":344801},{"type":17,"tag":84,"props":371828,"children":371829},{},[371830],{"type":17,"tag":133,"props":371831,"children":371833},{"href":344984,"rel":371832},[214],[371834],{"type":23,"value":344988},{"title":7,"searchDepth":1629,"depth":1629,"links":371836},[371837,371838,371839,371840,371842,371843,371844],{"id":371425,"depth":1629,"text":371428},{"id":371465,"depth":1629,"text":371468},{"id":371524,"depth":1629,"text":371527},{"id":371646,"depth":1629,"text":371841},"(optional) Add the oauth scope to your app",{"id":371706,"depth":1629,"text":371709},{"id":371745,"depth":1629,"text":371748},{"id":332205,"depth":1629,"text":332208},"content:blog:how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps.md","blog/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps.md","blog/how_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps",{"_path":371849,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":371850,"description":371851,"img":371852,"date":371385,"tag":6341,"body":371853,"_type":1677,"_id":372052,"_source":1679,"_file":372053,"_stem":372054,"_extension":1682},"/blog/how_to_register_a_highlevel_developer_app_and_get_oauth2_credentials","How to Register a HighLevel Developer App and Get OAUTH2 Credentials","HighLevel is a powerful platform that helps you create and manage marketing campaigns, sales funnels, websites, and more. If you are a developer who wants to...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_highlevel_developer_app_and_get_oauth2_credentials-icon.png",{"type":14,"children":371854,"toc":372044},[371855,371860,371863,371870,371875,371880,371886,371897,371902,371908,371913,371918,371924,371929,371934,371972,371977,371990,371995,372012,372018],{"type":17,"tag":18,"props":371856,"children":371858},{"id":371857},"how-to-register-a-highlevel-developer-app-and-get-oauth2-credentials",[371859],{"type":23,"value":371850},{"type":17,"tag":25,"props":371861,"children":371862},{},[],{"type":17,"tag":29,"props":371864,"children":371865},{},[371866],{"type":17,"tag":33,"props":371867,"children":371868},{},[371869],{"type":23,"value":371403},{"type":17,"tag":29,"props":371871,"children":371872},{},[371873],{"type":23,"value":371874},"HighLevel is a powerful platform that helps you create and manage marketing campaigns, sales funnels, websites, and more. If you are a developer who wants to build data integrations for your SaaS software, you need to register a HighLevel developer app and get credentials to access the HighLevel API.",{"type":17,"tag":29,"props":371876,"children":371877},{},[371878],{"type":23,"value":371879},"In this article, I will show you how to do that step by step.",{"type":17,"tag":68,"props":371881,"children":371883},{"id":371882},"step-1-create-a-highlevel-account",[371884],{"type":23,"value":371885},"Step 1: Create a HighLevel Account",{"type":17,"tag":29,"props":371887,"children":371888},{},[371889,371891],{"type":23,"value":371890},"If you don't have a HighLevel account yet, you need to create one first. You can sign up for a free 14-day trial here: ",{"type":17,"tag":133,"props":371892,"children":371895},{"href":371893,"rel":371894},"https://www.gohighlevel.com/",[214],[371896],{"type":23,"value":371893},{"type":17,"tag":29,"props":371898,"children":371899},{},[371900],{"type":23,"value":371901},"Once you have an account, you can log in to your HighLevel dashboard and click on the \"Settings\" icon on the top right corner.",{"type":17,"tag":68,"props":371903,"children":371905},{"id":371904},"step-2-go-to-the-developer-portal",[371906],{"type":23,"value":371907},"Step 2: Go to the Developer Portal",{"type":17,"tag":29,"props":371909,"children":371910},{},[371911],{"type":23,"value":371912},"On the settings page, you will see a menu on the left side. Click on the \"Developer\" option to go to the developer portal.",{"type":17,"tag":29,"props":371914,"children":371915},{},[371916],{"type":23,"value":371917},"Here, you will see a list of your existing developer apps, if any, and a button to create a new one.",{"type":17,"tag":68,"props":371919,"children":371921},{"id":371920},"step-3-create-a-new-developer-app",[371922],{"type":23,"value":371923},"Step 3: Create a New Developer App",{"type":17,"tag":29,"props":371925,"children":371926},{},[371927],{"type":23,"value":371928},"Click on the \"Create New App\" button to start the process of registering a new developer app.",{"type":17,"tag":29,"props":371930,"children":371931},{},[371932],{"type":23,"value":371933},"You will need to provide some basic information about your app, such as:",{"type":17,"tag":80,"props":371935,"children":371936},{},[371937,371942,371947,371952,371957,371962],{"type":17,"tag":84,"props":371938,"children":371939},{},[371940],{"type":23,"value":371941},"App name: A unique name for your app that will be displayed to the users.",{"type":17,"tag":84,"props":371943,"children":371944},{},[371945],{"type":23,"value":371946},"App description: A brief description of what your app does and how it integrates with HighLevel.",{"type":17,"tag":84,"props":371948,"children":371949},{},[371950],{"type":23,"value":371951},"App URL: The URL of your app's website or landing page, where users can learn more about your app and sign up for it.",{"type":17,"tag":84,"props":371953,"children":371954},{},[371955],{"type":23,"value":371956},"Scopes: The permissions that your app requests from the users, such as read and write access to their contacts, campaigns, etc.",{"type":17,"tag":84,"props":371958,"children":371959},{},[371960],{"type":23,"value":371961},"Click on the 'Add' button in the Client Keys section and you will get new OAUTH2 credentials",{"type":17,"tag":84,"props":371963,"children":371964},{},[371965,371967],{"type":23,"value":371966},"Redirect URL: The URL where HighLevel will redirect the users after they authorize your app to access their data. If you are going to use Unified.to, then this needs to be ",{"type":17,"tag":6121,"props":371968,"children":371970},{"className":371969},[],[371971],{"type":23,"value":42417},{"type":17,"tag":29,"props":371973,"children":371974},{},[371975],{"type":23,"value":371976},"After filling out the required fields, click on the \"Create App\" button to submit your app for approval.",{"type":17,"tag":68,"props":371978,"children":371980},{"id":371979},"step-4-how-to-use-unifiedto-apis-for-salesflare-integration",[371981,371983,371988],{"type":23,"value":371982},"Step 4: How to Use ",{"type":17,"tag":133,"props":371984,"children":371986},{"href":212,"rel":371985},[214],[371987],{"type":23,"value":217},{"type":23,"value":371989}," APIs for Salesflare Integration?",{"type":17,"tag":29,"props":371991,"children":371992},{},[371993],{"type":23,"value":371994},"Using HighLevel APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",{"type":17,"tag":29,"props":371996,"children":371997},{},[371998,371999,372004,372006,372010],{"type":23,"value":370868},{"type":17,"tag":133,"props":372000,"children":372002},{"href":212,"rel":372001},[214],[372003],{"type":23,"value":217},{"type":23,"value":372005}," APIs for CRM integration. It provides a unified set of APIs, data-models, and ",{"type":17,"tag":133,"props":372007,"children":372008},{"href":4999},[372009],{"type":23,"value":5002},{"type":23,"value":372011}," for 20+ CRM integrations.",{"type":17,"tag":68,"props":372013,"children":372015},{"id":372014},"step-5-activate-workday-in-unifiedto",[372016],{"type":23,"value":372017},"Step 5: Activate Workday in Unified.to",{"type":17,"tag":6154,"props":372019,"children":372020},{},[372021,372030,372035,372040],{"type":17,"tag":84,"props":372022,"children":372023},{},[372024,372025],{"type":23,"value":42939},{"type":17,"tag":133,"props":372026,"children":372028},{"href":329567,"rel":372027},[214],[372029],{"type":23,"value":341393},{"type":17,"tag":84,"props":372031,"children":372032},{},[372033],{"type":23,"value":372034},"Search for HighLevel",{"type":17,"tag":84,"props":372036,"children":372037},{},[372038],{"type":23,"value":372039},"Click on Activate on HighLevel",{"type":17,"tag":84,"props":372041,"children":372042},{},[372043],{"type":23,"value":341408},{"title":7,"searchDepth":1629,"depth":1629,"links":372045},[372046,372047,372048,372049,372051],{"id":371882,"depth":1629,"text":371885},{"id":371904,"depth":1629,"text":371907},{"id":371920,"depth":1629,"text":371923},{"id":371979,"depth":1629,"text":372050},"Step 4: How to Use Unified.to APIs for Salesflare Integration?",{"id":372014,"depth":1629,"text":372017},"content:blog:how_to_register_a_highlevel_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_a_highlevel_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_a_highlevel_developer_app_and_get_oauth2_credentials",{"_path":372056,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":372057,"description":372058,"img":372059,"date":371385,"tag":6341,"body":372060,"_type":1677,"_id":372564,"_source":1679,"_file":372565,"_stem":372566,"_extension":1682},"/blog/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials","How to register a Salesforce developer app and get OAuth 2 credentials","In this guide, we'll walk you through how to register a Salesforce developer app to get the OAuth 2 credentials you'll need to be a Salesforce integration for...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-icon.png",{"type":14,"children":372061,"toc":372557},[372062,372067,372070,372077,372101,372112,372118,372123,372128,372151,372157,372170,372434,372440,372445,372455,372461,372513,372518,372522],{"type":17,"tag":18,"props":372063,"children":372065},{"id":372064},"how-to-register-a-salesforce-developer-app-and-get-oauth-2-credentials",[372066],{"type":23,"value":372057},{"type":17,"tag":25,"props":372068,"children":372069},{},[],{"type":17,"tag":29,"props":372071,"children":372072},{},[372073],{"type":17,"tag":33,"props":372074,"children":372075},{},[372076],{"type":23,"value":371403},{"type":17,"tag":29,"props":372078,"children":372079},{},[372080,372082,372086,372088,372092,372094,372099],{"type":23,"value":372081},"In this guide, we'll walk you through how to register a Salesforce developer app to get the ",{"type":17,"tag":133,"props":372083,"children":372084},{"href":779},[372085],{"type":23,"value":782},{"type":23,"value":372087}," 2 credentials you'll need to be a Salesforce integration for your product. Whether you're planning to build a custom-code integration or using a ",{"type":17,"tag":133,"props":372089,"children":372090},{"href":7691},[372091],{"type":23,"value":7806},{"type":23,"value":372093}," solution like ",{"type":17,"tag":133,"props":372095,"children":372097},{"href":42620,"rel":372096},[214],[372098],{"type":23,"value":217},{"type":23,"value":372100},", retrieving your OAuth 2 credentials is the first step in the process of integrating with Salesforce.",{"type":17,"tag":29,"props":372102,"children":372103},{},[372104,372106,372110],{"type":23,"value":372105},"We'll also added directional for existing Unified.to users that are leveraging our Unified ",{"type":17,"tag":133,"props":372107,"children":372108},{"href":61562},[372109],{"type":23,"value":61565},{"type":23,"value":372111}," for a faster integration development process.",{"type":17,"tag":68,"props":372113,"children":372115},{"id":372114},"what-is-a-salesforce-developer-app",[372116],{"type":23,"value":372117},"What is a Salesforce Developer App?",{"type":17,"tag":29,"props":372119,"children":372120},{},[372121],{"type":23,"value":372122},"A Salesforce developer app is a container for one or more developer apps. A developer app is an application that can access Salesforce data or functionality through the Salesforce REST, SOAP, or Streaming APIs.",{"type":17,"tag":29,"props":372124,"children":372125},{},[372126],{"type":23,"value":372127},"A connected app defines the following information:",{"type":17,"tag":80,"props":372129,"children":372130},{},[372131,372136,372141,372146],{"type":17,"tag":84,"props":372132,"children":372133},{},[372134],{"type":23,"value":372135},"The name and logo of the app",{"type":17,"tag":84,"props":372137,"children":372138},{},[372139],{"type":23,"value":372140},"The OAuth settings for the app, such as the callback URL, the scopes, and the refresh token policy",{"type":17,"tag":84,"props":372142,"children":372143},{},[372144],{"type":23,"value":372145},"The API version and the endpoints for the app",{"type":17,"tag":84,"props":372147,"children":372148},{},[372149],{"type":23,"value":372150},"The user profiles or permission sets that can access the app\nBy registering a developer app, you can generate a client ID and a client secret, which are the credentials you'll need to authenticate your requests to the Salesforce APIs",{"type":17,"tag":68,"props":372152,"children":372154},{"id":372153},"step-1-register-a-salesforce-developer-app",[372155],{"type":23,"value":372156},"Step 1: Register a Salesforce developer app",{"type":17,"tag":29,"props":372158,"children":372159},{},[372160,372162,372168],{"type":23,"value":372161},"To register a Salesforce developer app, you'll need a Salesforce developer account. If you don't have one, sign up for free at ",{"type":17,"tag":133,"props":372163,"children":372166},{"href":372164,"rel":372165},"https://developer.salesforce.com/signup",[214],[372167],{"type":23,"value":372164},{"type":23,"value":372169},".\nOnce you have a developer account, follow these steps to register a developer app:",{"type":17,"tag":6154,"props":372171,"children":372172},{},[372173,372189,372200,372210,372215,372232,372244,372274,372327,372355,372367,372375,372400,372416],{"type":17,"tag":84,"props":372174,"children":372175},{},[372176,372178,372182,372185],{"type":23,"value":372177},"Log in to your Salesforce developer account and go to ",{"type":17,"tag":48,"props":372179,"children":372180},{},[372181],{"type":23,"value":299074},{"type":17,"tag":3891,"props":372183,"children":372184},{},[],{"type":17,"tag":6438,"props":372186,"children":372188},{"alt":6440,"src":372187},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-0.png",[],{"type":17,"tag":84,"props":372190,"children":372191},{},[372192,372194,372198],{"type":23,"value":372193},"In the Quick Find box, search for ",{"type":17,"tag":48,"props":372195,"children":372196},{},[372197],{"type":23,"value":144861},{"type":23,"value":372199}," and click on it",{"type":17,"tag":84,"props":372201,"children":372202},{},[372203,372204,372209],{"type":23,"value":329656},{"type":17,"tag":48,"props":372205,"children":372206},{},[372207],{"type":23,"value":372208},"New External Client App",{"type":23,"value":253210},{"type":17,"tag":84,"props":372211,"children":372212},{},[372213],{"type":23,"value":372214},"Fill in the basic information for your app, such as the name, contact email, and logo URL",{"type":17,"tag":84,"props":372216,"children":372217},{},[372218,372219,372225,372227],{"type":23,"value":42950},{"type":17,"tag":6121,"props":372220,"children":372222},{"className":372221},[],[372223],{"type":23,"value":372224},"Packaged",{"type":23,"value":372226}," in ",{"type":17,"tag":48,"props":372228,"children":372229},{},[372230],{"type":23,"value":372231},"Distribution State",{"type":17,"tag":84,"props":372233,"children":372234},{},[372235,372237,372242],{"type":23,"value":372236},"In the API (Enable OAuth Settings) section, check the ",{"type":17,"tag":48,"props":372238,"children":372239},{},[372240],{"type":23,"value":372241},"Enable OAuth Settings",{"type":23,"value":372243}," checkbox",{"type":17,"tag":84,"props":372245,"children":372246},{},[372247,372249,372254,372256,372261,372262,372267,372268,372273],{"type":23,"value":372248},"Enter the callback URL for your app (this is the URL that Salesforce will redirect the user to after they authorize your app). For ",{"type":17,"tag":133,"props":372250,"children":372252},{"href":42620,"rel":372251},[214],[372253],{"type":23,"value":217},{"type":23,"value":372255}," users, the callback URL needs to be ",{"type":17,"tag":6121,"props":372257,"children":372259},{"className":372258},[],[372260],{"type":23,"value":42417},{"type":23,"value":11826},{"type":17,"tag":6121,"props":372263,"children":372265},{"className":372264},[],[372266],{"type":23,"value":126565},{"type":23,"value":75890},{"type":17,"tag":6121,"props":372269,"children":372271},{"className":372270},[],[372272],{"type":23,"value":126574},{"type":23,"value":54},{"type":17,"tag":84,"props":372275,"children":372276},{},[372277,372279,372284,372286,372292,372293,372299,372301,372306,372307,372312,372313,372318,372320,372323],{"type":23,"value":372278},"Select the OAuth scopes for your app (these are the permissions that your app will request from the user). To set up ",{"type":17,"tag":133,"props":372280,"children":372282},{"href":212,"rel":372281},[214],[372283],{"type":23,"value":217},{"type":23,"value":372285}," successfully you'll need to add these OAuth Scopes: ",{"type":17,"tag":6121,"props":372287,"children":372289},{"className":372288},[],[372290],{"type":23,"value":372291},"Manage user data via APIs (api)",{"type":23,"value":34435},{"type":17,"tag":6121,"props":372294,"children":372296},{"className":372295},[],[372297],{"type":23,"value":372298},"Platform requests at any time (refresh_token, offline_access)",{"type":23,"value":372300},".  If you are also going to use Salesforce to sign-in your users into your application, then also set the ",{"type":17,"tag":6121,"props":372302,"children":372304},{"className":372303},[],[372305],{"type":23,"value":98191},{"type":23,"value":302664},{"type":17,"tag":6121,"props":372308,"children":372310},{"className":372309},[],[372311],{"type":23,"value":98204},{"type":23,"value":302664},{"type":17,"tag":6121,"props":372314,"children":372316},{"className":372315},[],[372317],{"type":23,"value":62666},{"type":23,"value":372319},"scopes.",{"type":17,"tag":3891,"props":372321,"children":372322},{},[],{"type":17,"tag":6438,"props":372324,"children":372326},{"alt":6440,"src":372325},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-1.png",[],{"type":17,"tag":84,"props":372328,"children":372329},{},[372330,372332],{"type":23,"value":372331},"Next, enable the following options for you app:",{"type":17,"tag":6154,"props":372333,"children":372334},{},[372335,372340,372345,372350],{"type":17,"tag":84,"props":372336,"children":372337},{},[372338],{"type":23,"value":372339},"Enable Authorization Code and Credentials Flow",{"type":17,"tag":84,"props":372341,"children":372342},{},[372343],{"type":23,"value":372344},"Require user credentials in the POST body for Authorization Code and Credentials Flow",{"type":17,"tag":84,"props":372346,"children":372347},{},[372348],{"type":23,"value":372349},"Require Secret for Web Server Flow",{"type":17,"tag":84,"props":372351,"children":372352},{},[372353],{"type":23,"value":372354},"Require Secret for Refresh Token Flow",{"type":17,"tag":84,"props":372356,"children":372357},{},[372358,372360,372363],{"type":23,"value":372359},"Do NOT enable CODE CHALLENGE (Require Proof Key for Code Exchange (PKCE) Extension for Supported Authorization Flows)",{"type":17,"tag":3891,"props":372361,"children":372362},{},[],{"type":17,"tag":6438,"props":372364,"children":372366},{"alt":6440,"src":372365},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-2.png",[],{"type":17,"tag":84,"props":372368,"children":372369},{},[372370,372371],{"type":23,"value":6629},{"type":17,"tag":48,"props":372372,"children":372373},{},[372374],{"type":23,"value":42125},{"type":17,"tag":84,"props":372376,"children":372377},{},[372378,372380,372385,372387,372392,372393,372396],{"type":23,"value":372379},"Next click ",{"type":17,"tag":48,"props":372381,"children":372382},{},[372383],{"type":23,"value":372384},"Edit",{"type":23,"value":372386}," under ",{"type":17,"tag":48,"props":372388,"children":372389},{},[372390],{"type":23,"value":372391},"Policies",{"type":23,"value":146710},{"type":17,"tag":3891,"props":372394,"children":372395},{},[],{"type":17,"tag":6438,"props":372397,"children":372399},{"alt":6440,"src":372398},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-3.png",[],{"type":17,"tag":84,"props":372401,"children":372402},{},[372403,372405,372409,372412],{"type":23,"value":372404},"Set 'Refresh token is valid until revoked' and click ",{"type":17,"tag":48,"props":372406,"children":372407},{},[372408],{"type":23,"value":169347},{"type":17,"tag":3891,"props":372410,"children":372411},{},[],{"type":17,"tag":6438,"props":372413,"children":372415},{"alt":6440,"src":372414},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-4.png",[],{"type":17,"tag":84,"props":372417,"children":372418},{},[372419,372421,372426,372427,372430],{"type":23,"value":372420},"Lastly, go to Settings tab and retrieve you 'Consumer Key' (client ID) and 'Consumer Secret' (client secret).You will need these credentials to activate your Salesforce integration in ",{"type":17,"tag":133,"props":372422,"children":372424},{"href":212,"rel":372423},[214],[372425],{"type":23,"value":217},{"type":23,"value":54},{"type":17,"tag":3891,"props":372428,"children":372429},{},[],{"type":17,"tag":6438,"props":372431,"children":372433},{"alt":6440,"src":372432},"https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-5.png",[],{"type":17,"tag":68,"props":372435,"children":372437},{"id":372436},"step-2-use-unifiedto-to-simplify-integration-development",[372438],{"type":23,"value":372439},"Step 2: Use Unified.to to Simplify Integration Development",{"type":17,"tag":29,"props":372441,"children":372442},{},[372443],{"type":23,"value":372444},"Using Salesforce APIs directly can be a complex and time-consuming process, especially if you plan to integrate with other leading CRM platforms like HubSpot, ActiveCampaign, and Copper. Without Unified.to, you'll be tasked with handling authentication, error handling, rate limiting, data mapping, and the synchronization logic for each individual integration.",{"type":17,"tag":29,"props":372446,"children":372447},{},[372448,372453],{"type":17,"tag":133,"props":372449,"children":372451},{"href":42620,"rel":372450},[214],[372452],{"type":23,"value":217},{"type":23,"value":372454}," simplifies this entire process, providing SaaS developers with a unified set of APIs, data models, and webhooks for 20+ CRM integrations. Add all the CRM integrations on your roadmap in a matter of hours.",{"type":17,"tag":68,"props":372456,"children":372458},{"id":372457},"step-3-activate-salesforce-in-unifiedto-for-unifiedto-users",[372459],{"type":23,"value":372460},"Step 3: Activate Salesforce in Unified.to (for Unified.to users)",{"type":17,"tag":6154,"props":372462,"children":372463},{},[372464,372483,372498,372508],{"type":17,"tag":84,"props":372465,"children":372466},{},[372467,372473,372475],{"type":17,"tag":133,"props":372468,"children":372470},{"href":1612,"rel":372469},[214],[372471],{"type":23,"value":372472},"Log in",{"type":23,"value":372474}," and navigate to ",{"type":17,"tag":133,"props":372476,"children":372478},{"href":329567,"rel":372477},[214],[372479],{"type":17,"tag":48,"props":372480,"children":372481},{},[372482],{"type":23,"value":341393},{"type":17,"tag":84,"props":372484,"children":372485},{},[372486,372488,372492,372494],{"type":23,"value":372487},"Use the search bar or click the ",{"type":17,"tag":48,"props":372489,"children":372490},{},[372491],{"type":23,"value":25731},{"type":23,"value":372493}," tab to select ",{"type":17,"tag":48,"props":372495,"children":372496},{},[372497],{"type":23,"value":3179},{"type":17,"tag":84,"props":372499,"children":372500},{},[372501,372502,372506],{"type":23,"value":6629},{"type":17,"tag":48,"props":372503,"children":372504},{},[372505],{"type":23,"value":6634},{"type":23,"value":372507}," on Salesforce",{"type":17,"tag":84,"props":372509,"children":372510},{},[372511],{"type":23,"value":372512},"Enter the information from the previous step (client ID, client secret)",{"type":17,"tag":29,"props":372514,"children":372515},{},[372516],{"type":23,"value":372517},"Once you've activated Salesforce along with other integrations, you'll be able to add integrations to your product using our low-code authorization UI embed.",{"type":17,"tag":68,"props":372519,"children":372520},{"id":363394},[372521],{"type":23,"value":363397},{"type":17,"tag":29,"props":372523,"children":372524},{},[372525,372526,372534,372535,372544,372545,372553],{"type":23,"value":363402},{"type":17,"tag":133,"props":372527,"children":372529},{"href":42620,"rel":372528},[214],[372530],{"type":17,"tag":48,"props":372531,"children":372532},{},[372533],{"type":23,"value":217},{"type":23,"value":363412},{"type":17,"tag":133,"props":372536,"children":372539},{"href":372537,"rel":372538},"https://app.unified.to/login?utm_source=blog&utm_medium=blog_signup_salesforce&utm_campaign=blog_signup&utm_id=blog_signup",[214],[372540],{"type":17,"tag":48,"props":372541,"children":372542},{},[372543],{"type":23,"value":363421},{"type":23,"value":226472},{"type":17,"tag":133,"props":372546,"children":372548},{"href":363425,"rel":372547},[214],[372549],{"type":17,"tag":48,"props":372550,"children":372551},{},[372552],{"type":23,"value":363432},{"type":17,"tag":48,"props":372554,"children":372555},{},[372556],{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":372558},[372559,372560,372561,372562,372563],{"id":372114,"depth":1629,"text":372117},{"id":372153,"depth":1629,"text":372156},{"id":372436,"depth":1629,"text":372439},{"id":372457,"depth":1629,"text":372460},{"id":363394,"depth":1629,"text":363397},"content:blog:how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials.md","blog/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials.md","blog/how_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials",{"_path":372568,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":372569,"description":372570,"img":372571,"date":371385,"tag":6341,"body":372572,"_type":1677,"_id":372786,"_source":1679,"_file":372787,"_stem":372788,"_extension":1682},"/blog/how_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials","How to Register a ZendeskSell Developer App and Get OAUTH2 Credentials","If you are a developer who wants to build data integrations for your SaaS software, you might be interested in using the ZendeskSell API. The ZendeskSell API...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials-icon.svg",{"type":14,"children":372573,"toc":372778},[372574,372579,372582,372589,372594,372599,372605,372617,372622,372627,372639,372649,372654,372672,372677,372682,372688,372693,372698,372711,372716,372728,372733,372748,372752],{"type":17,"tag":18,"props":372575,"children":372577},{"id":372576},"how-to-register-a-zendesksell-developer-app-and-get-oauth2-credentials",[372578],{"type":23,"value":372569},{"type":17,"tag":25,"props":372580,"children":372581},{},[],{"type":17,"tag":29,"props":372583,"children":372584},{},[372585],{"type":17,"tag":33,"props":372586,"children":372587},{},[372588],{"type":23,"value":371403},{"type":17,"tag":29,"props":372590,"children":372591},{},[372592],{"type":23,"value":372593},"If you are a developer who wants to build data integrations for your SaaS software, you might be interested in using the ZendeskSell API. The ZendeskSell API allows you to access and manipulate data from ZendeskSell, a powerful CRM platform that helps you manage your sales pipeline, contacts, deals, and tasks.",{"type":17,"tag":29,"props":372595,"children":372596},{},[372597],{"type":23,"value":372598},"However, before you can use the ZendeskSell API, you need to register a developer app and get credentials. In this article, I will show you how to do that in a few simple steps.",{"type":17,"tag":68,"props":372600,"children":372602},{"id":372601},"step-1-create-a-zendesksell-account",[372603],{"type":23,"value":372604},"Step 1: Create a ZendeskSell account",{"type":17,"tag":29,"props":372606,"children":372607},{},[372608,372610],{"type":23,"value":372609},"If you don't have a ZendeskSell account yet, you need to create one first. You can sign up for a free trial here: ",{"type":17,"tag":133,"props":372611,"children":372614},{"href":372612,"rel":372613},"https://www.zendesk.com/register/",[214],[372615],{"type":23,"value":372616},"https://www.zendesk.com/register/?source=zendesk_sell",{"type":17,"tag":29,"props":372618,"children":372619},{},[372620],{"type":23,"value":372621},"Once you have created your account, you can log in to your ZendeskSell dashboard and access the settings menu.",{"type":17,"tag":68,"props":372623,"children":372624},{"id":369458},[372625],{"type":23,"value":372626},"Step 2: Register a developer app",{"type":17,"tag":29,"props":372628,"children":372629},{},[372630,372632,372637],{"type":23,"value":372631},"To register a developer app, you need to go to the Admin Settings and click on \"APIs > Zendesk APIs\" and then on '",{"type":17,"tag":133,"props":372633,"children":372634},{"href":779},[372635],{"type":23,"value":372636},"Oauth",{"type":23,"value":372638}," Clients'. Then, you need to click on the \"Add OAUTH2 Client\" button and fill in the required information.",{"type":17,"tag":29,"props":372640,"children":372641},{},[372642,372644],{"type":23,"value":372643},"You need to provide a name, a description, a logo URL, and a redirect URI for your app. The redirect URI is the URL where ZendeskSell will send the authorization code after the user grants permission to your app. You can use any URL that you control, but it must match the one you will use in your code later. If you are going to use Unified.to, then this needs to be ",{"type":17,"tag":6121,"props":372645,"children":372647},{"className":372646},[],[372648],{"type":23,"value":42417},{"type":17,"tag":29,"props":372650,"children":372651},{},[372652],{"type":23,"value":372653},"You also need to select the scopes that your app will need to access the ZendeskSell data. The scopes are the permissions that define what your app can do with the ZendeskSell API. You can choose from the following scopes:",{"type":17,"tag":80,"props":372655,"children":372656},{},[372657,372662,372667],{"type":17,"tag":84,"props":372658,"children":372659},{},[372660],{"type":23,"value":372661},"read: Allows your app to read data from ZendeskSell",{"type":17,"tag":84,"props":372663,"children":372664},{},[372665],{"type":23,"value":372666},"write: Allows your app to write data to ZendeskSell",{"type":17,"tag":84,"props":372668,"children":372669},{},[372670],{"type":23,"value":372671},"delete: Allows your app to delete data from ZendeskSell",{"type":17,"tag":29,"props":372673,"children":372674},{},[372675],{"type":23,"value":372676},"You can select one or more scopes depending on your app's functionality. However, you should only request the minimum scopes that your app needs to avoid unnecessary access.",{"type":17,"tag":29,"props":372678,"children":372679},{},[372680],{"type":23,"value":372681},"After you fill in the information, you can click on the \"Register App\" button and your app will be created.",{"type":17,"tag":68,"props":372683,"children":372685},{"id":372684},"step-3-get-credentials",[372686],{"type":23,"value":372687},"Step 3: Get credentials",{"type":17,"tag":29,"props":372689,"children":372690},{},[372691],{"type":23,"value":372692},"Once you have registered your app, you will see a confirmation page with your app's credentials. You will need these credentials to authenticate your app with the ZendeskSell API.",{"type":17,"tag":29,"props":372694,"children":372695},{},[372696],{"type":23,"value":372697},"The credentials are:",{"type":17,"tag":80,"props":372699,"children":372700},{},[372701,372706],{"type":17,"tag":84,"props":372702,"children":372703},{},[372704],{"type":23,"value":372705},"Client ID: A unique identifier for your app",{"type":17,"tag":84,"props":372707,"children":372708},{},[372709],{"type":23,"value":372710},"Client Secret: A secret key that you should keep confidential and never share with anyone",{"type":17,"tag":29,"props":372712,"children":372713},{},[372714],{"type":23,"value":372715},"You should copy and save these credentials somewhere safe, as you will need them later in your code.",{"type":17,"tag":68,"props":372717,"children":372719},{"id":372718},"step-4-use-unifiedto-to-simplify-your-integrations-development",[372720,372722,372727],{"type":23,"value":372721},"Step 4: Use ",{"type":17,"tag":133,"props":372723,"children":372725},{"href":212,"rel":372724},[214],[372726],{"type":23,"value":217},{"type":23,"value":370858},{"type":17,"tag":29,"props":372729,"children":372730},{},[372731],{"type":23,"value":372732},"Using ZendeskSell APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",{"type":17,"tag":29,"props":372734,"children":372735},{},[372736,372737,372742,372743,372747],{"type":23,"value":370868},{"type":17,"tag":133,"props":372738,"children":372740},{"href":212,"rel":372739},[214],[372741],{"type":23,"value":217},{"type":23,"value":372005},{"type":17,"tag":133,"props":372744,"children":372745},{"href":4999},[372746],{"type":23,"value":5002},{"type":23,"value":372011},{"type":17,"tag":68,"props":372749,"children":372750},{"id":372014},[372751],{"type":23,"value":372017},{"type":17,"tag":6154,"props":372753,"children":372754},{},[372755,372764,372769,372774],{"type":17,"tag":84,"props":372756,"children":372757},{},[372758,372759],{"type":23,"value":42939},{"type":17,"tag":133,"props":372760,"children":372762},{"href":329567,"rel":372761},[214],[372763],{"type":23,"value":341393},{"type":17,"tag":84,"props":372765,"children":372766},{},[372767],{"type":23,"value":372768},"Search for ZendeskSell",{"type":17,"tag":84,"props":372770,"children":372771},{},[372772],{"type":23,"value":372773},"Click on Activate on ZendeskSell",{"type":17,"tag":84,"props":372775,"children":372776},{},[372777],{"type":23,"value":341408},{"title":7,"searchDepth":1629,"depth":1629,"links":372779},[372780,372781,372782,372783,372785],{"id":372601,"depth":1629,"text":372604},{"id":369458,"depth":1629,"text":372626},{"id":372684,"depth":1629,"text":372687},{"id":372718,"depth":1629,"text":372784},"Step 4: Use Unified.to to Simplify your Integrations Development",{"id":372014,"depth":1629,"text":372017},"content:blog:how_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials",{"_path":372790,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":372791,"description":372792,"img":372793,"date":371385,"tag":6341,"body":372794,"_type":1677,"_id":372989,"_source":1679,"_file":372990,"_stem":372991,"_extension":1682},"/blog/how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials","How to Register an Atlassian Developer App and Get OAUTH2 Credentials","Developers who are looking to build data integrations for their SaaS software with Atlassian services will need to register an Atlassian Developer application...","https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials-icon.png",{"type":14,"children":372795,"toc":372981},[372796,372801,372804,372811,372816,372827,372832,372874,372885,372890,372929,372935,372940,372945,372949,372955],{"type":17,"tag":18,"props":372797,"children":372799},{"id":372798},"how-to-register-an-atlassian-developer-app-and-get-oauth2-credentials",[372800],{"type":23,"value":372791},{"type":17,"tag":25,"props":372802,"children":372803},{},[],{"type":17,"tag":29,"props":372805,"children":372806},{},[372807],{"type":17,"tag":33,"props":372808,"children":372809},{},[372810],{"type":23,"value":371403},{"type":17,"tag":29,"props":372812,"children":372813},{},[372814],{"type":23,"value":372815},"Developers who are looking to build data integrations for their SaaS software with Atlassian services will need to register an Atlassian Developer application and obtain OAUTH2 credentials. This will allow you to access Atlassian data and build integrations with Atlassian services. In this article, we'll go over the steps to register an Atlassian Developer application and obtain OAUTH2 credentials.",{"type":17,"tag":68,"props":372817,"children":372819},{"id":372818},"step-1-registering-an-atlassian-developer-app",[372820,372822],{"type":23,"value":372821},"Step 1: ",{"type":17,"tag":48,"props":372823,"children":372824},{},[372825],{"type":23,"value":372826},"Registering an Atlassian Developer App",{"type":17,"tag":29,"props":372828,"children":372829},{},[372830],{"type":23,"value":372831},"To register an Atlassian Developer app, you need to follow the steps below:",{"type":17,"tag":6154,"props":372833,"children":372834},{},[372835,372849,372854,372859,372864,372869],{"type":17,"tag":84,"props":372836,"children":372837},{},[372838,372839,372848],{"type":23,"value":146849},{"type":17,"tag":133,"props":372840,"children":372842},{"href":123281,"rel":372841},[214],[372843],{"type":17,"tag":48,"props":372844,"children":372845},{},[372846],{"type":23,"value":372847},"Atlassian Developer site",{"type":23,"value":54},{"type":17,"tag":84,"props":372850,"children":372851},{},[372852],{"type":23,"value":372853},"Click on \"Get started\" and create an Atlassian account if you don't have one already.",{"type":17,"tag":84,"props":372855,"children":372856},{},[372857],{"type":23,"value":372858},"Navigate to the \"My Atlassian\" page and click on \"Create a new app.\"",{"type":17,"tag":84,"props":372860,"children":372861},{},[372862],{"type":23,"value":372863},"Fill out the required information for your app, including the app name, description, and contact information.",{"type":17,"tag":84,"props":372865,"children":372866},{},[372867],{"type":23,"value":372868},"Once you have completed the form, click on \"Create app.\"",{"type":17,"tag":84,"props":372870,"children":372871},{},[372872],{"type":23,"value":372873},"You will be redirected to the app's overview page, where you can see the app key and client ID.",{"type":17,"tag":68,"props":372875,"children":372877},{"id":372876},"step-2-obtaining-credentials",[372878,372880],{"type":23,"value":372879},"Step 2: ",{"type":17,"tag":48,"props":372881,"children":372882},{},[372883],{"type":23,"value":372884},"Obtaining Credentials",{"type":17,"tag":29,"props":372886,"children":372887},{},[372888],{"type":23,"value":372889},"To obtain the necessary credentials for your salesforce integration, you need to do the following:",{"type":17,"tag":6154,"props":372891,"children":372892},{},[372893,372898,372909,372919,372924],{"type":17,"tag":84,"props":372894,"children":372895},{},[372896],{"type":23,"value":372897},"Go to the app's overview page and click on \"Add credentials.\"",{"type":17,"tag":84,"props":372899,"children":372900},{},[372901,372903,372907],{"type":23,"value":372902},"Select \"",{"type":17,"tag":133,"props":372904,"children":372905},{"href":779},[372906],{"type":23,"value":782},{"type":23,"value":372908},"\" as the authentication method.",{"type":17,"tag":84,"props":372910,"children":372911},{},[372912,372914],{"type":23,"value":372913},"Fill out the necessary information, including the callback URL and OAuth scopes.    If you are going to use Unified.to, then this needs to be ",{"type":17,"tag":6121,"props":372915,"children":372917},{"className":372916},[],[372918],{"type":23,"value":42417},{"type":17,"tag":84,"props":372920,"children":372921},{},[372922],{"type":23,"value":372923},"Once you have completed the form, click on \"Create credentials.\"",{"type":17,"tag":84,"props":372925,"children":372926},{},[372927],{"type":23,"value":372928},"You will be redirected to the credentials page, where you can see the client secret.",{"type":17,"tag":68,"props":372930,"children":372932},{"id":372931},"step-3-using-unifiedto",[372933],{"type":23,"value":372934},"Step 3: Using Unified.to",{"type":17,"tag":29,"props":372936,"children":372937},{},[372938],{"type":23,"value":372939},"Registering an Atlassian Developer application and obtaining OAUTH2 credentials is an important step in building data integration for your SaaS software. With these credentials, you'll be able to access ADP data and build integrations with Atlassian services.",{"type":17,"tag":29,"props":372941,"children":372942},{},[372943],{"type":23,"value":372944},"Using Atlassian APIs directly can be complex and time-consuming, especially if you want to integrate with multiple services or platforms. You will need to handle the authentication, the error handling, the rate limiting, the data mapping, and the synchronization logic for each integration.",{"type":17,"tag":29,"props":372946,"children":372947},{},[372948],{"type":23,"value":369577},{"type":17,"tag":68,"props":372950,"children":372952},{"id":372951},"step-4-activate-atlassian-in-unifiedto",[372953],{"type":23,"value":372954},"Step 4: Activate Atlassian in Unified.to",{"type":17,"tag":6154,"props":372956,"children":372957},{},[372958,372967,372972,372977],{"type":17,"tag":84,"props":372959,"children":372960},{},[372961,372962],{"type":23,"value":42939},{"type":17,"tag":133,"props":372963,"children":372965},{"href":329567,"rel":372964},[214],[372966],{"type":23,"value":341393},{"type":17,"tag":84,"props":372968,"children":372969},{},[372970],{"type":23,"value":372971},"Search for Atlassian",{"type":17,"tag":84,"props":372973,"children":372974},{},[372975],{"type":23,"value":372976},"Click on Activate on Atlassian",{"type":17,"tag":84,"props":372978,"children":372979},{},[372980],{"type":23,"value":341408},{"title":7,"searchDepth":1629,"depth":1629,"links":372982},[372983,372985,372987,372988],{"id":372818,"depth":1629,"text":372984},"Step 1: Registering an Atlassian Developer App",{"id":372876,"depth":1629,"text":372986},"Step 2: Obtaining Credentials",{"id":372931,"depth":1629,"text":372934},{"id":372951,"depth":1629,"text":372954},"content:blog:how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials.md","blog/how_to_register_an_atlassian_developer_app_and_get_oauth2_credentials",{"_path":372993,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":372994,"description":372995,"img":372996,"date":372997,"tag":12,"body":372998,"_type":1677,"_id":373145,"_source":1679,"_file":373146,"_stem":373147,"_extension":1682},"/blog/unified_apis_vs_zapier","Unified APIs vs Zapier","We get a lot of questions on why Zapier isn't a direct competitor to our Unified APIs.","https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apis_vs_zapier-icon.webp","2023-02-11T00:00:00.000Z",{"type":14,"children":372999,"toc":373143},[373000,373005,373008,373016,373020,373025,373048,373055,373060,373067,373074,373081,373086,373093,373098,373103,373113],{"type":17,"tag":18,"props":373001,"children":373003},{"id":373002},"unified-apis-vs-zapier",[373004],{"type":23,"value":372994},{"type":17,"tag":25,"props":373006,"children":373007},{},[],{"type":17,"tag":29,"props":373009,"children":373010},{},[373011],{"type":17,"tag":33,"props":373012,"children":373013},{},[373014],{"type":23,"value":373015},"February 11, 2023",{"type":17,"tag":29,"props":373017,"children":373018},{},[373019],{"type":23,"value":372995},{"type":17,"tag":29,"props":373021,"children":373022},{},[373023],{"type":23,"value":373024},"The simple answer is that Unified APIs are useful for developers to build their products. While Zapier, and other no-code solutions, are not for developers nor for building products.  Let's take a look deeper.",{"type":17,"tag":29,"props":373026,"children":373027},{},[373028,373030,373037,373039,373046],{"type":23,"value":373029},"A great homepage should tell you exactly ",{"type":17,"tag":33,"props":373031,"children":373032},{},[373033],{"type":17,"tag":48,"props":373034,"children":373035},{},[373036],{"type":23,"value":363570},{"type":23,"value":373038}," the solution is and ",{"type":17,"tag":33,"props":373040,"children":373041},{},[373042],{"type":17,"tag":48,"props":373043,"children":373044},{},[373045],{"type":23,"value":363525},{"type":23,"value":373047}," it is for.  Zapier is a great example.",{"type":17,"tag":29,"props":373049,"children":373050},{},[373051],{"type":17,"tag":6438,"props":373052,"children":373054},{"alt":318119,"src":373053},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apis_vs_zapier-0.png",[],{"type":17,"tag":29,"props":373056,"children":373057},{},[373058],{"type":23,"value":373059},"Right off, Zapier is telling the read that they 'automate' (the what) for 'salespeople' (the who). There are other messages, but they are all for non-developers.",{"type":17,"tag":29,"props":373061,"children":373062},{},[373063],{"type":17,"tag":6438,"props":373064,"children":373066},{"alt":318119,"src":373065},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apis_vs_zapier-1.png",[],{"type":17,"tag":29,"props":373068,"children":373069},{},[373070],{"type":17,"tag":6438,"props":373071,"children":373073},{"alt":318119,"src":373072},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apis_vs_zapier-2.png",[],{"type":17,"tag":29,"props":373075,"children":373076},{},[373077],{"type":17,"tag":6438,"props":373078,"children":373080},{"alt":318119,"src":373079},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apis_vs_zapier-3.png",[],{"type":17,"tag":29,"props":373082,"children":373083},{},[373084],{"type":23,"value":373085},"The other clue that Zapier is not for developers building their products is this static messaging:",{"type":17,"tag":29,"props":373087,"children":373088},{},[373089],{"type":17,"tag":6438,"props":373090,"children":373092},{"alt":318119,"src":373091},"https://s3.us-east-2.amazonaws.com/unified-article-images/unified_apis_vs_zapier-4.png",[],{"type":17,"tag":29,"props":373094,"children":373095},{},[373096],{"type":23,"value":373097},"'Your work' is targeting the business processes that you need to accomplish to run your business.  That could be automating your sales funnel, marketing campaigns, support systems, or data analysis pipelines.",{"type":17,"tag":29,"props":373099,"children":373100},{},[373101],{"type":23,"value":373102},"As a developer, what you need are tools that help you build your product quicker, cheaper, more scalable and meets the product requirements defined by your product manager, CTO or CEO.",{"type":17,"tag":29,"props":373104,"children":373105},{},[373106,373111],{"type":17,"tag":133,"props":373107,"children":373109},{"href":212,"rel":373108},[214],[373110],{"type":23,"value":217},{"type":23,"value":373112}," (and Unified APIs in general) allow a developer to build integrations into 3rd-party vendors so that their products could gain access to their customer's data in these 3rd-party vendors.  Instead of building (and maintaining) these integrations in-house, Unified APIs allow the developer team to focus on their core-features instead.",{"type":17,"tag":29,"props":373114,"children":373115},{},[373116,373118,373124,373126,373132,373134,373142],{"type":23,"value":373117},"Unified APIs are not ",{"type":17,"tag":6121,"props":373119,"children":373121},{"className":373120},[],[373122],{"type":23,"value":373123},"no-code",{"type":23,"value":373125},".  They could be considered ",{"type":17,"tag":6121,"props":373127,"children":373129},{"className":373128},[],[373130],{"type":23,"value":373131},"low-code",{"type":23,"value":373133}," but that is because they are so easy to build once and forget.  But in reality, they are a strong component of the developer tools that you use to ",{"type":17,"tag":33,"props":373135,"children":373136},{},[373137],{"type":17,"tag":48,"props":373138,"children":373139},{},[373140],{"type":23,"value":373141},"build great products",{"type":23,"value":54},{"title":7,"searchDepth":1629,"depth":1629,"links":373144},[],"content:blog:unified_apis_vs_zapier.md","blog/unified_apis_vs_zapier.md","blog/unified_apis_vs_zapier",{"_path":8935,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8936,"description":8937,"img":8938,"date":7750,"tag":12,"body":373149,"_type":1677,"_id":9573,"_source":1679,"_file":9574,"_stem":9575,"_extension":1682},{"type":14,"children":373150,"toc":373652},[373151,373155,373158,373165,373174,373178,373187,373191,373209,373213,373217,373221,373236,373240,373244,373250,373254,373258,373262,373266,373281,373285,373289,373296,373300,373304,373310,373314,373318,373322,373337,373341,373350,373354,373365,373369,373375,373379,373383,373387,373414,373418,373422,373426,373433,373444,373451,373462,373466,373470,373474,373489,373493,373497,373501,373505,373516,373520,373535,373539,373543,373550,373573,373580,373591,373595,373599,373603,373607,373622,373626,373630,373634,373643],{"type":17,"tag":18,"props":373152,"children":373153},{"id":8943},[373154],{"type":23,"value":8936},{"type":17,"tag":25,"props":373156,"children":373157},{},[],{"type":17,"tag":29,"props":373159,"children":373160},{},[373161],{"type":17,"tag":33,"props":373162,"children":373163},{},[373164],{"type":23,"value":7768},{"type":17,"tag":29,"props":373166,"children":373167},{},[373168,373169,373173],{"type":23,"value":8960},{"type":17,"tag":133,"props":373170,"children":373171},{"href":4999},[373172],{"type":23,"value":5002},{"type":23,"value":8966},{"type":17,"tag":29,"props":373175,"children":373176},{},[373177],{"type":23,"value":8971},{"type":17,"tag":29,"props":373179,"children":373180},{},[373181,373182,373186],{"type":23,"value":8976},{"type":17,"tag":48,"props":373183,"children":373184},{},[373185],{"type":23,"value":8981},{"type":23,"value":8983},{"type":17,"tag":29,"props":373188,"children":373189},{},[373190],{"type":23,"value":8988},{"type":17,"tag":29,"props":373192,"children":373193},{},[373194,373195,373199,373200],{"type":23,"value":8993},{"type":17,"tag":133,"props":373196,"children":373197},{"href":7691},[373198],{"type":23,"value":7459},{"type":23,"value":8999},{"type":17,"tag":48,"props":373201,"children":373202},{},[373203,373204,373208],{"type":23,"value":9004},{"type":17,"tag":133,"props":373205,"children":373206},{"href":9007},[373207],{"type":23,"value":9010},{"type":23,"value":9012},{"type":17,"tag":68,"props":373210,"children":373211},{"id":9015},[373212],{"type":23,"value":9018},{"type":17,"tag":239,"props":373214,"children":373215},{"id":9021},[373216],{"type":23,"value":9024},{"type":17,"tag":29,"props":373218,"children":373219},{},[373220],{"type":23,"value":9029},{"type":17,"tag":80,"props":373222,"children":373223},{},[373224,373228,373232],{"type":17,"tag":84,"props":373225,"children":373226},{},[373227],{"type":23,"value":9037},{"type":17,"tag":84,"props":373229,"children":373230},{},[373231],{"type":23,"value":9042},{"type":17,"tag":84,"props":373233,"children":373234},{},[373235],{"type":23,"value":9047},{"type":17,"tag":29,"props":373237,"children":373238},{},[373239],{"type":23,"value":9052},{"type":17,"tag":29,"props":373241,"children":373242},{},[373243],{"type":23,"value":9057},{"type":17,"tag":29,"props":373245,"children":373246},{},[373247],{"type":17,"tag":6438,"props":373248,"children":373249},{"alt":9063,"src":9064},[],{"type":17,"tag":68,"props":373251,"children":373252},{"id":9068},[373253],{"type":23,"value":9071},{"type":17,"tag":239,"props":373255,"children":373256},{"id":9074},[373257],{"type":23,"value":9077},{"type":17,"tag":29,"props":373259,"children":373260},{},[373261],{"type":23,"value":9082},{"type":17,"tag":29,"props":373263,"children":373264},{},[373265],{"type":23,"value":9087},{"type":17,"tag":80,"props":373267,"children":373268},{},[373269,373273,373277],{"type":17,"tag":84,"props":373270,"children":373271},{},[373272],{"type":23,"value":9095},{"type":17,"tag":84,"props":373274,"children":373275},{},[373276],{"type":23,"value":9100},{"type":17,"tag":84,"props":373278,"children":373279},{},[373280],{"type":23,"value":9105},{"type":17,"tag":29,"props":373282,"children":373283},{},[373284],{"type":23,"value":9110},{"type":17,"tag":29,"props":373286,"children":373287},{},[373288],{"type":23,"value":9115},{"type":17,"tag":3414,"props":373290,"children":373291},{},[373292],{"type":17,"tag":29,"props":373293,"children":373294},{},[373295],{"type":23,"value":9123},{"type":17,"tag":29,"props":373297,"children":373298},{},[373299],{"type":23,"value":9128},{"type":17,"tag":29,"props":373301,"children":373302},{},[373303],{"type":23,"value":9133},{"type":17,"tag":29,"props":373305,"children":373306},{},[373307],{"type":17,"tag":6438,"props":373308,"children":373309},{"alt":9139,"src":9140},[],{"type":17,"tag":68,"props":373311,"children":373312},{"id":9144},[373313],{"type":23,"value":9147},{"type":17,"tag":29,"props":373315,"children":373316},{},[373317],{"type":23,"value":9152},{"type":17,"tag":29,"props":373319,"children":373320},{},[373321],{"type":23,"value":3442},{"type":17,"tag":80,"props":373323,"children":373324},{},[373325,373329,373333],{"type":17,"tag":84,"props":373326,"children":373327},{},[373328],{"type":23,"value":9164},{"type":17,"tag":84,"props":373330,"children":373331},{},[373332],{"type":23,"value":9169},{"type":17,"tag":84,"props":373334,"children":373335},{},[373336],{"type":23,"value":9174},{"type":17,"tag":29,"props":373338,"children":373339},{},[373340],{"type":23,"value":9179},{"type":17,"tag":29,"props":373342,"children":373343},{},[373344,373345,373349],{"type":23,"value":9184},{"type":17,"tag":48,"props":373346,"children":373347},{},[373348],{"type":23,"value":9189},{"type":23,"value":54},{"type":17,"tag":29,"props":373351,"children":373352},{},[373353],{"type":23,"value":9195},{"type":17,"tag":80,"props":373355,"children":373356},{},[373357,373361],{"type":17,"tag":84,"props":373358,"children":373359},{},[373360],{"type":23,"value":9203},{"type":17,"tag":84,"props":373362,"children":373363},{},[373364],{"type":23,"value":9208},{"type":17,"tag":29,"props":373366,"children":373367},{},[373368],{"type":23,"value":9213},{"type":17,"tag":29,"props":373370,"children":373371},{},[373372],{"type":17,"tag":6438,"props":373373,"children":373374},{"alt":9219,"src":9220},[],{"type":17,"tag":68,"props":373376,"children":373377},{"id":7034},[373378],{"type":23,"value":7037},{"type":17,"tag":29,"props":373380,"children":373381},{},[373382],{"type":23,"value":9230},{"type":17,"tag":239,"props":373384,"children":373385},{"id":9233},[373386],{"type":23,"value":9236},{"type":17,"tag":80,"props":373388,"children":373389},{},[373390,373398,373406],{"type":17,"tag":84,"props":373391,"children":373392},{},[373393,373397],{"type":17,"tag":48,"props":373394,"children":373395},{},[373396],{"type":23,"value":9024},{"type":23,"value":9248},{"type":17,"tag":84,"props":373399,"children":373400},{},[373401,373405],{"type":17,"tag":48,"props":373402,"children":373403},{},[373404],{"type":23,"value":9256},{"type":23,"value":9258},{"type":17,"tag":84,"props":373407,"children":373408},{},[373409,373413],{"type":17,"tag":48,"props":373410,"children":373411},{},[373412],{"type":23,"value":9266},{"type":23,"value":9268},{"type":17,"tag":29,"props":373415,"children":373416},{},[373417],{"type":23,"value":9273},{"type":17,"tag":239,"props":373419,"children":373420},{"id":9276},[373421],{"type":23,"value":9279},{"type":17,"tag":29,"props":373423,"children":373424},{},[373425],{"type":23,"value":9284},{"type":17,"tag":29,"props":373427,"children":373428},{},[373429],{"type":17,"tag":48,"props":373430,"children":373431},{},[373432],{"type":23,"value":9292},{"type":17,"tag":80,"props":373434,"children":373435},{},[373436,373440],{"type":17,"tag":84,"props":373437,"children":373438},{},[373439],{"type":23,"value":9300},{"type":17,"tag":84,"props":373441,"children":373442},{},[373443],{"type":23,"value":9305},{"type":17,"tag":29,"props":373445,"children":373446},{},[373447],{"type":17,"tag":48,"props":373448,"children":373449},{},[373450],{"type":23,"value":9313},{"type":17,"tag":80,"props":373452,"children":373453},{},[373454,373458],{"type":17,"tag":84,"props":373455,"children":373456},{},[373457],{"type":23,"value":9321},{"type":17,"tag":84,"props":373459,"children":373460},{},[373461],{"type":23,"value":9208},{"type":17,"tag":29,"props":373463,"children":373464},{},[373465],{"type":23,"value":9330},{"type":17,"tag":239,"props":373467,"children":373468},{"id":9333},[373469],{"type":23,"value":9336},{"type":17,"tag":29,"props":373471,"children":373472},{},[373473],{"type":23,"value":9341},{"type":17,"tag":80,"props":373475,"children":373476},{},[373477,373481,373485],{"type":17,"tag":84,"props":373478,"children":373479},{},[373480],{"type":23,"value":9349},{"type":17,"tag":84,"props":373482,"children":373483},{},[373484],{"type":23,"value":9354},{"type":17,"tag":84,"props":373486,"children":373487},{},[373488],{"type":23,"value":9359},{"type":17,"tag":29,"props":373490,"children":373491},{},[373492],{"type":23,"value":9364},{"type":17,"tag":29,"props":373494,"children":373495},{},[373496],{"type":23,"value":9369},{"type":17,"tag":239,"props":373498,"children":373499},{"id":9372},[373500],{"type":23,"value":9375},{"type":17,"tag":29,"props":373502,"children":373503},{},[373504],{"type":23,"value":9380},{"type":17,"tag":80,"props":373506,"children":373507},{},[373508,373512],{"type":17,"tag":84,"props":373509,"children":373510},{},[373511],{"type":23,"value":9388},{"type":17,"tag":84,"props":373513,"children":373514},{},[373515],{"type":23,"value":9393},{"type":17,"tag":29,"props":373517,"children":373518},{},[373519],{"type":23,"value":9398},{"type":17,"tag":80,"props":373521,"children":373522},{},[373523,373527,373531],{"type":17,"tag":84,"props":373524,"children":373525},{},[373526],{"type":23,"value":9406},{"type":17,"tag":84,"props":373528,"children":373529},{},[373530],{"type":23,"value":838},{"type":17,"tag":84,"props":373532,"children":373533},{},[373534],{"type":23,"value":9415},{"type":17,"tag":68,"props":373536,"children":373537},{"id":9418},[373538],{"type":23,"value":9421},{"type":17,"tag":29,"props":373540,"children":373541},{},[373542],{"type":23,"value":9426},{"type":17,"tag":29,"props":373544,"children":373545},{},[373546],{"type":17,"tag":48,"props":373547,"children":373548},{},[373549],{"type":23,"value":9434},{"type":17,"tag":80,"props":373551,"children":373552},{},[373553,373557,373561,373565,373569],{"type":17,"tag":84,"props":373554,"children":373555},{},[373556],{"type":23,"value":9442},{"type":17,"tag":84,"props":373558,"children":373559},{},[373560],{"type":23,"value":9447},{"type":17,"tag":84,"props":373562,"children":373563},{},[373564],{"type":23,"value":9452},{"type":17,"tag":84,"props":373566,"children":373567},{},[373568],{"type":23,"value":9457},{"type":17,"tag":84,"props":373570,"children":373571},{},[373572],{"type":23,"value":9462},{"type":17,"tag":29,"props":373574,"children":373575},{},[373576],{"type":17,"tag":48,"props":373577,"children":373578},{},[373579],{"type":23,"value":9470},{"type":17,"tag":80,"props":373581,"children":373582},{},[373583,373587],{"type":17,"tag":84,"props":373584,"children":373585},{},[373586],{"type":23,"value":9478},{"type":17,"tag":84,"props":373588,"children":373589},{},[373590],{"type":23,"value":9483},{"type":17,"tag":29,"props":373592,"children":373593},{},[373594],{"type":23,"value":9488},{"type":17,"tag":68,"props":373596,"children":373597},{"id":9491},[373598],{"type":23,"value":9494},{"type":17,"tag":29,"props":373600,"children":373601},{},[373602],{"type":23,"value":9499},{"type":17,"tag":29,"props":373604,"children":373605},{},[373606],{"type":23,"value":9504},{"type":17,"tag":80,"props":373608,"children":373609},{},[373610,373614,373618],{"type":17,"tag":84,"props":373611,"children":373612},{},[373613],{"type":23,"value":9512},{"type":17,"tag":84,"props":373615,"children":373616},{},[373617],{"type":23,"value":9517},{"type":17,"tag":84,"props":373619,"children":373620},{},[373621],{"type":23,"value":9522},{"type":17,"tag":29,"props":373623,"children":373624},{},[373625],{"type":23,"value":9527},{"type":17,"tag":29,"props":373627,"children":373628},{},[373629],{"type":23,"value":9532},{"type":17,"tag":29,"props":373631,"children":373632},{},[373633],{"type":23,"value":9537},{"type":17,"tag":29,"props":373635,"children":373636},{},[373637,373638],{"type":23,"value":1609},{"type":17,"tag":133,"props":373639,"children":373641},{"href":1612,"rel":373640},[214],[373642],{"type":23,"value":1616},{"type":17,"tag":29,"props":373644,"children":373645},{},[373646,373647],{"type":23,"value":1609},{"type":17,"tag":133,"props":373648,"children":373650},{"href":1623,"rel":373649},[214],[373651],{"type":23,"value":1627},{"title":7,"searchDepth":1629,"depth":1629,"links":373653},[373654,373657,373660,373661,373667,373668],{"id":9015,"depth":1629,"text":9018,"children":373655},[373656],{"id":9021,"depth":1635,"text":9024},{"id":9068,"depth":1629,"text":9071,"children":373658},[373659],{"id":9074,"depth":1635,"text":9077},{"id":9144,"depth":1629,"text":9147},{"id":7034,"depth":1629,"text":7037,"children":373662},[373663,373664,373665,373666],{"id":9233,"depth":1635,"text":9236},{"id":9276,"depth":1635,"text":9279},{"id":9333,"depth":1635,"text":9336},{"id":9372,"depth":1635,"text":9375},{"id":9418,"depth":1629,"text":9421},{"id":9491,"depth":1629,"text":9494},1775527854684]